@coreplane/switchboard 1.267.0 → 1.267.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/assets/deploy/cloudflare-resident/gc.ts +1 -0
  2. package/dist/assets/deploy/cloudflare-resident/keyedAsyncLock.ts +20 -0
  3. package/dist/assets/deploy/cloudflare-resident/legacyCredentials.ts +57 -0
  4. package/dist/assets/deploy/cloudflare-resident/orphanThreadUsers.ts +14 -0
  5. package/dist/assets/deploy/cloudflare-resident/worker.ts +646 -204
  6. package/dist/assets/package-lock.json +51 -4
  7. package/dist/assets/package.json +1 -1
  8. package/dist/assets/source.json +3 -3
  9. package/dist/assets/src/core/budgets.ts +10 -0
  10. package/dist/assets/src/core/coordinator/contract.ts +29 -0
  11. package/dist/assets/src/core/coordinator/driver.ts +15 -2
  12. package/dist/assets/src/core/publicationPush.ts +31 -9
  13. package/dist/assets/src/core/runRecord.ts +32 -0
  14. package/dist/assets/src/core/ship/coordinator.ts +53 -5
  15. package/dist/assets/src/execution/githubMintScope.ts +49 -0
  16. package/dist/assets/src/execution/residentCredentials.ts +9 -37
  17. package/dist/assets/src/execution/residentDestroyGate.ts +12 -0
  18. package/dist/assets/src/execution/residentPoolSpends.ts +96 -0
  19. package/dist/assets/src/execution/residentRecreateAdmission.ts +41 -0
  20. package/dist/assets/src/execution/residentSteps.ts +1 -0
  21. package/dist/assets/web/dist/.vite/manifest.json +505 -505
  22. package/dist/assets/web/dist/assets/AppShell-CCPwPqvc.js +1 -0
  23. package/dist/assets/web/dist/assets/{CostChart-4TeDdbvJ.js → CostChart-Y5BqJKLA.js} +2 -2
  24. package/dist/assets/web/dist/assets/CostsPage-RRggVvIx.js +1 -0
  25. package/dist/assets/web/dist/assets/DeliveryPage-CuIBLfup.js +1 -0
  26. package/dist/assets/web/dist/assets/HomePage-BQmun9kS.js +1 -0
  27. package/dist/assets/web/dist/assets/InputMenu-ymuqElZB.js +1 -0
  28. package/dist/assets/web/dist/assets/{MetricsPage-BQBuIuYU.js → MetricsPage-D2YGsI8C.js} +1 -1
  29. package/dist/assets/web/dist/assets/NotFoundPage-DZ6ysTXd.js +1 -0
  30. package/dist/assets/web/dist/assets/PendingTurnRow-BPyJ2f-i.js +1 -0
  31. package/dist/assets/web/dist/assets/PlanePage-C_gVx0Dg.js +1 -0
  32. package/dist/assets/web/dist/assets/ResidentDetailPage-CT6v9INM.js +1 -0
  33. package/dist/assets/web/dist/assets/ResidentsIndexPage-CWqPFf40.js +1 -0
  34. package/dist/assets/web/dist/assets/{RunFoldRow-DrfFauYJ.js → RunFoldRow-C1w-mwch.js} +1 -1
  35. package/dist/assets/web/dist/assets/RunRoutePage-zWMHTzla.js +9 -0
  36. package/dist/assets/web/dist/assets/RunsIndexPage-DF16D2Gg.js +1 -0
  37. package/dist/assets/web/dist/assets/RunsTabs-D7rsC4GR.js +1 -0
  38. package/dist/assets/web/dist/assets/ScheduledPage-CyRs0fXN.js +1 -0
  39. package/dist/assets/web/dist/assets/SettingSelect-CEkCLVWd.js +1 -0
  40. package/dist/assets/web/dist/assets/SettingsPage-BRuMCHSj.js +1 -0
  41. package/dist/assets/web/dist/assets/SilentTurn-D4MMDjWO.js +2 -0
  42. package/dist/assets/web/dist/assets/SlackMark-DjJTK2tD.js +1 -0
  43. package/dist/assets/web/dist/assets/StatusDot-BIAQN7iD.js +1 -0
  44. package/dist/assets/web/dist/assets/Tooltip-CxiQ7luL.js +1 -0
  45. package/dist/assets/web/dist/assets/UnitRoutePage-BQB5mAAl.js +1 -0
  46. package/dist/assets/web/dist/assets/{angular-html-BRRhsdQE.js → angular-html-DR_aiq_z.js} +1 -1
  47. package/dist/assets/web/dist/assets/{angular-ts-BFj-mqCm.js → angular-ts-DdAdPC99.js} +1 -1
  48. package/dist/assets/web/dist/assets/{apl-CsBuy1IL.js → apl-CFsVwJXV.js} +1 -1
  49. package/dist/assets/web/dist/assets/{astro-cVaqxBZq.js → astro-CV6XNX3T.js} +1 -1
  50. package/dist/assets/web/dist/assets/{blade-MEP5mWha.js → blade-BGvEqTv7.js} +1 -1
  51. package/dist/assets/web/dist/assets/browser-BWnzWwaT.js +6 -0
  52. package/dist/assets/web/dist/assets/budgets-CJHiTZmM.js +1 -0
  53. package/dist/assets/web/dist/assets/{c-D4NGQ_Pd.js → c-ViUYuFAx.js} +1 -1
  54. package/dist/assets/web/dist/assets/{chapel-BkWImsIy.js → chapel-CZ7_YbfP.js} +1 -1
  55. package/dist/assets/web/dist/assets/{cobol-RPDSPSET.js → cobol-Dc8kYvS6.js} +1 -1
  56. package/dist/assets/web/dist/assets/{coffee-DZ5z7oVX.js → coffee-C0musOvn.js} +1 -1
  57. package/dist/assets/web/dist/assets/{cpp-CrBtIaRZ.js → cpp-ToPQGcGd.js} +1 -1
  58. package/dist/assets/web/dist/assets/{crystal-DJesYi6f.js → crystal-DUJIaO8W.js} +1 -1
  59. package/dist/assets/web/dist/assets/{css-DO9mjau-.js → css-BTcEgWyQ.js} +1 -1
  60. package/dist/assets/web/dist/assets/{dist-v3Py3_QR.js → dist-I2OEmPqz.js} +2 -2
  61. package/dist/assets/web/dist/assets/{edge-C3VzbSW0.js → edge-D8sh1uAj.js} +1 -1
  62. package/dist/assets/web/dist/assets/{elixir-BkD_Vhfe.js → elixir-D5vOtHrB.js} +1 -1
  63. package/dist/assets/web/dist/assets/{elm-KIM0mFPk.js → elm-B_5xqTuz.js} +1 -1
  64. package/dist/assets/web/dist/assets/{erb-D2ruCqb2.js → erb-DBEct7_l.js} +1 -1
  65. package/dist/assets/web/dist/assets/{eventSource-Cv0AFlMi.js → eventSource-Ds6_gjPD.js} +1 -1
  66. package/dist/assets/web/dist/assets/{git-rebase-CnfbQTxA.js → git-rebase-lWoTL0Qh.js} +1 -1
  67. package/dist/assets/web/dist/assets/{glimmer-js-CbiwFXWH.js → glimmer-js-DNfSP4GT.js} +1 -1
  68. package/dist/assets/web/dist/assets/{glimmer-ts-DV8ii0Pv.js → glimmer-ts-DpPeWMLs.js} +1 -1
  69. package/dist/assets/web/dist/assets/{glsl-CgmznWkA.js → glsl-m6Ziz8q0.js} +1 -1
  70. package/dist/assets/web/dist/assets/{graphql-BK-bBYfH.js → graphql-shD9521e.js} +1 -1
  71. package/dist/assets/web/dist/assets/{hack-DnwTTP5n.js → hack-D_Mf_2gv.js} +1 -1
  72. package/dist/assets/web/dist/assets/{haml-DAVJsWwT.js → haml-BuEAF47S.js} +1 -1
  73. package/dist/assets/web/dist/assets/{handlebars-voOVfxFL.js → handlebars-D2aiSYtv.js} +1 -1
  74. package/dist/assets/web/dist/assets/{html-3FTqwaPk.js → html-CRjXJZot.js} +1 -1
  75. package/dist/assets/web/dist/assets/{html-derivative-CSlhLDQn.js → html-derivative-CYpQX_KK.js} +1 -1
  76. package/dist/assets/web/dist/assets/{http-Vx4ilPfS.js → http-D6vXMpc_.js} +1 -1
  77. package/dist/assets/web/dist/assets/{hurl-DxyZDE3R.js → hurl-B634cMJT.js} +1 -1
  78. package/dist/assets/web/dist/assets/{indexRow-BsWcHHVh.js → indexRow-BGjjLnN5.js} +1 -1
  79. package/dist/assets/web/dist/assets/{java-nWqdjNJG.js → java-BlINdAve.js} +1 -1
  80. package/dist/assets/web/dist/assets/{javascript-Dr82HOwp.js → javascript-BBEMmUOu.js} +1 -1
  81. package/dist/assets/web/dist/assets/{jinja-BhjLrPOt.js → jinja-BIA8TYHJ.js} +1 -1
  82. package/dist/assets/web/dist/assets/{jison-DilGIUa8.js → jison-aepfTbzH.js} +1 -1
  83. package/dist/assets/web/dist/assets/{json-CrOcvmhJ.js → json-DmYZ1boG.js} +1 -1
  84. package/dist/assets/web/dist/assets/{jsx-BW_RX-fo.js → jsx-GkaaF4_W.js} +1 -1
  85. package/dist/assets/web/dist/assets/{julia-CWH071DB.js → julia-DRtMztOz.js} +1 -1
  86. package/dist/assets/web/dist/assets/{just-DkhhoWBy.js → just-PvoeEWoy.js} +1 -1
  87. package/dist/assets/web/dist/assets/{latex-cuHJ4TUT.js → latex-Bujuo3AZ.js} +1 -1
  88. package/dist/assets/web/dist/assets/{liquid-DG6afYQN.js → liquid-B0h0HkS3.js} +1 -1
  89. package/dist/assets/web/dist/assets/{lua-C5CMnCPS.js → lua-6O-O1CSO.js} +1 -1
  90. package/dist/assets/web/dist/assets/main-DYwKyLY5.js +28 -0
  91. package/dist/assets/web/dist/assets/{marko-Dy2_DuC4.js → marko-XS_tpV0N.js} +1 -1
  92. package/dist/assets/web/dist/assets/{mdc-BMKb_EeA.js → mdc-DxULuTS1.js} +1 -1
  93. package/dist/assets/web/dist/assets/{nginx-og0RgMKf.js → nginx-n2RAfCKE.js} +1 -1
  94. package/dist/assets/web/dist/assets/{nim-CQxTQQP0.js → nim-DJxdqD8U.js} +1 -1
  95. package/dist/assets/web/dist/assets/{org-b5lkq_Pl.js → org-R9yxwZ2v.js} +1 -1
  96. package/dist/assets/web/dist/assets/{perl-D9X5_i_J.js → perl-zKAUtl73.js} +1 -1
  97. package/dist/assets/web/dist/assets/{php-CwUxvLX0.js → php-Dk50x1WE.js} +1 -1
  98. package/dist/assets/web/dist/assets/{pug-uOIOExr0.js → pug-C3TSg8JJ.js} +1 -1
  99. package/dist/assets/web/dist/assets/{qml-g5RoADf-.js → qml-CL1nqvCt.js} +1 -1
  100. package/dist/assets/web/dist/assets/{r-5LdAopD3.js → r-Bo44Yl7y.js} +1 -1
  101. package/dist/assets/web/dist/assets/{razor-DwrvFLYQ.js → razor-k2Dt2qXz.js} +1 -1
  102. package/dist/assets/web/dist/assets/{regexp-dGtAaxC-.js → regexp-Uy_HNe6G.js} +1 -1
  103. package/dist/assets/web/dist/assets/{rst-wFdW0brr.js → rst-U0zcRJ60.js} +1 -1
  104. package/dist/assets/web/dist/assets/{ruby-DPglN6I9.js → ruby-DUyqwP37.js} +1 -1
  105. package/dist/assets/web/dist/assets/{sas-CUbCs40d.js → sas-CxC8bRy1.js} +1 -1
  106. package/dist/assets/web/dist/assets/{scss-B-DUiI1c.js → scss-DaqXj6RQ.js} +1 -1
  107. package/dist/assets/web/dist/assets/{shellscript-lGOV7Ram.js → shellscript-CI49IoFh.js} +1 -1
  108. package/dist/assets/web/dist/assets/{shellsession-BDWtAAjr.js → shellsession-DJxotIOK.js} +1 -1
  109. package/dist/assets/web/dist/assets/{soy-zod_dcOy.js → soy-BjVAVuCU.js} +1 -1
  110. package/dist/assets/web/dist/assets/{sql-BG0HSSoM.js → sql-CzxBKQd1.js} +1 -1
  111. package/dist/assets/web/dist/assets/{sseReplay-DuALaBPq.js → sseReplay-BDVyc8HX.js} +4 -4
  112. package/dist/assets/web/dist/assets/{stata-BVUMLp1W.js → stata-DLMv_9_X.js} +1 -1
  113. package/dist/assets/web/dist/assets/{surrealql-DiSUbHKF.js → surrealql-BzbVEZbO.js} +1 -1
  114. package/dist/assets/web/dist/assets/{svelte-DZenT45Y.js → svelte-DTSfopUt.js} +1 -1
  115. package/dist/assets/web/dist/assets/{templ-BWKRNM0-.js → templ-BPxFlKQj.js} +1 -1
  116. package/dist/assets/web/dist/assets/{tex-CbMzBlkK.js → tex-B_KndQwK.js} +1 -1
  117. package/dist/assets/web/dist/assets/{ts-tags-CZsVorDN.js → ts-tags-CG7tgvBl.js} +1 -1
  118. package/dist/assets/web/dist/assets/{tsx-R1r3mH4W.js → tsx-CN9eqIdJ.js} +1 -1
  119. package/dist/assets/web/dist/assets/{twig-BjPMyjKH.js → twig-CKPbB5ca.js} +1 -1
  120. package/dist/assets/web/dist/assets/{typescript-Bx-66VN_.js → typescript-BQAXVjHJ.js} +1 -1
  121. package/dist/assets/web/dist/assets/{typst-fW037Eo6.js → typst-D3EaP9Ui.js} +1 -1
  122. package/dist/assets/web/dist/assets/{vue-D1V_GNxW.js → vue-DuQwQ__D.js} +1 -1
  123. package/dist/assets/web/dist/assets/{vue-html-C-4pTZ-s.js → vue-html-UEJn5cLD.js} +1 -1
  124. package/dist/assets/web/dist/assets/{vue-vine-C-QsX3hR.js → vue-vine-DDdijZY2.js} +1 -1
  125. package/dist/assets/web/dist/assets/{wallClock-x0hjr0J_.js → wallClock-DaewxNMY.js} +1 -1
  126. package/dist/assets/web/dist/assets/{xml-BJTJXPgC.js → xml-BezNDynk.js} +1 -1
  127. package/dist/assets/web/dist/assets/{xsl-Xc9lukqe.js → xsl-Bzb2zIr8.js} +1 -1
  128. package/dist/assets/web/dist/assets/{yaml-Dw-FMsQa.js → yaml-DOccVRRG.js} +1 -1
  129. package/dist/cli.js +1002 -366
  130. package/package.json +1 -1
  131. package/dist/assets/web/dist/assets/AppShell-DPJVhUGP.js +0 -1
  132. package/dist/assets/web/dist/assets/CostsPage-8HDgvuWB.js +0 -1
  133. package/dist/assets/web/dist/assets/DeliveryPage-BUJckSuW.js +0 -1
  134. package/dist/assets/web/dist/assets/HomePage-BfpIrKDX.js +0 -1
  135. package/dist/assets/web/dist/assets/InputMenu-BRV35UWP.js +0 -1
  136. package/dist/assets/web/dist/assets/NotFoundPage-CDjMfCcj.js +0 -1
  137. package/dist/assets/web/dist/assets/PendingTurnRow-C6hroa00.js +0 -1
  138. package/dist/assets/web/dist/assets/PlanePage-C2Cb1mkT.js +0 -1
  139. package/dist/assets/web/dist/assets/ResidentDetailPage-Bd9_Q87l.js +0 -1
  140. package/dist/assets/web/dist/assets/ResidentsIndexPage-C8eS7hxp.js +0 -1
  141. package/dist/assets/web/dist/assets/RunRoutePage-B_eXfNAF.js +0 -9
  142. package/dist/assets/web/dist/assets/RunsIndexPage-BpQu36Dm.js +0 -1
  143. package/dist/assets/web/dist/assets/RunsTabs-C7Ua3XX5.js +0 -1
  144. package/dist/assets/web/dist/assets/ScheduledPage-DGHcjcSt.js +0 -1
  145. package/dist/assets/web/dist/assets/SettingSelect-CEeA4iuC.js +0 -1
  146. package/dist/assets/web/dist/assets/SettingsPage-IfQ71QjN.js +0 -1
  147. package/dist/assets/web/dist/assets/SilentTurn-D9ON15a8.js +0 -2
  148. package/dist/assets/web/dist/assets/SlackMark-DB0MGiF5.js +0 -1
  149. package/dist/assets/web/dist/assets/StatusDot-DyFjGg4V.js +0 -1
  150. package/dist/assets/web/dist/assets/Tooltip-BvPkV4kZ.js +0 -1
  151. package/dist/assets/web/dist/assets/UnitRoutePage-BNe3nBIG.js +0 -1
  152. package/dist/assets/web/dist/assets/browser-CCImen5O.js +0 -6
  153. package/dist/assets/web/dist/assets/budgets-BQgcCyvb.js +0 -1
  154. package/dist/assets/web/dist/assets/main-ks3kBojV.js +0 -28
@@ -0,0 +1,96 @@
1
+ /** Durable UID ownership within one VM generation. Missing or malformed
2
+ * records are unknown generations, never an empty pool. */
3
+ export interface SpentPoolUser {
4
+ user: string;
5
+ owner: string;
6
+ }
7
+
8
+ export function parseSpentPoolUsers(value: unknown, pool: readonly string[]): ReadonlyMap<string, string> | null {
9
+ if (
10
+ !Array.isArray(value) ||
11
+ !value.every(
12
+ (row): row is SpentPoolUser =>
13
+ row !== null &&
14
+ typeof row === "object" &&
15
+ "user" in row &&
16
+ "owner" in row &&
17
+ typeof row.user === "string" &&
18
+ typeof row.owner === "string" &&
19
+ /^(thread|op):\S+$/.test(row.owner),
20
+ )
21
+ )
22
+ return null;
23
+ const spent = new Map(value.map(({ user, owner }) => [user, owner]));
24
+ if (spent.size !== value.length || [...spent.keys()].some((user) => !pool.includes(user))) return null;
25
+ return spent;
26
+ }
27
+
28
+ /** A new owner must get an unused UID; only the exact recorded owner may
29
+ * reclaim its UID. Both paths record ownership before untrusted work. */
30
+ export function spendPoolUser(
31
+ value: unknown,
32
+ pool: readonly string[],
33
+ user: string,
34
+ owner: string,
35
+ ): SpentPoolUser[] | null {
36
+ const spent = parseSpentPoolUsers(value, pool);
37
+ if (!spent || !pool.includes(user) || !/^(thread|op):\S+$/.test(owner)) return null;
38
+ const prior = spent.get(user);
39
+ if (prior && prior !== owner) return null;
40
+ const rows = [...spent].map(([user, owner]) => ({ user, owner }));
41
+ return prior ? rows : [...rows, { user, owner }];
42
+ }
43
+
44
+ /** A UID-scoped command must have exactly one live owner. An old duplicate
45
+ * binding never gains authority merely because its UID is spent. */
46
+ export function mayRunAsPoolUser(
47
+ value: unknown,
48
+ pool: readonly string[],
49
+ user: string,
50
+ liveThreadKeys: readonly string[],
51
+ activeOpOwner: string | undefined,
52
+ expectedOwner?: string,
53
+ ): boolean {
54
+ const recorded = parseSpentPoolUsers(value, pool)?.get(user);
55
+ if (!recorded || (expectedOwner !== undefined && recorded !== expectedOwner)) return false;
56
+ if (activeOpOwner !== undefined) return liveThreadKeys.length === 0 && recorded === activeOpOwner;
57
+ return liveThreadKeys.length === 1 && recorded === `thread:${liveThreadKeys[0]}`;
58
+ }
59
+
60
+ /** One row per UID is rebuilt from primary bindings when a DO starts. A
61
+ * malformed or missing row cannot authorize a shell, even if the spend ledger
62
+ * names the caller. Keep every live claimant so duplicates remain visible. */
63
+ export function parsePoolBindings(value: unknown): string[] | null {
64
+ if (!Array.isArray(value) || !value.every((key): key is string => typeof key === "string" && key.length > 0))
65
+ return null;
66
+ if (new Set(value).size !== value.length) return null;
67
+ return value;
68
+ }
69
+
70
+ export function claimPoolBinding(value: unknown, threadKey: string): string[] | null {
71
+ const current = parsePoolBindings(value);
72
+ if (!current || !threadKey || current.includes(threadKey)) return null;
73
+ return [...current, threadKey];
74
+ }
75
+
76
+ export function releasePoolBinding(value: unknown, threadKey: string): string[] | null {
77
+ const current = parsePoolBindings(value);
78
+ if (!current || !threadKey || !current.includes(threadKey)) return null;
79
+ return current.filter((key) => key !== threadKey);
80
+ }
81
+
82
+ export function rebuildPoolBindingIndex(
83
+ bindings: Iterable<{ threadKey: string; user: string; evicted?: boolean }>,
84
+ pool: readonly string[],
85
+ ): Map<string, string[]> | null {
86
+ const byUser = new Map(pool.map((user) => [user, [] as string[]]));
87
+ for (const binding of bindings) {
88
+ if (binding?.evicted === true) continue;
89
+ if (!binding || typeof binding.threadKey !== "string" || !binding.threadKey) return null;
90
+ if (!binding.user) continue;
91
+ const keys = byUser.get(binding.user);
92
+ if (!keys || keys.includes(binding.threadKey)) return null;
93
+ keys.push(binding.threadKey);
94
+ }
95
+ return byUser;
96
+ }
@@ -0,0 +1,41 @@
1
+ /** An operator recreate closes new admission before its idle read and keeps a
2
+ * durable refusal across the container destroy. A new DO isolate may reclaim
3
+ * the mark only by re-running the operator's checked recreate. */
4
+ export class ResidentRecreateAdmission {
5
+ private claiming = false;
6
+
7
+ constructor(
8
+ private readonly store: {
9
+ mark(): Promise<void>;
10
+ clear(): Promise<void>;
11
+ held(): Promise<boolean>;
12
+ },
13
+ ) {}
14
+
15
+ get pending(): boolean {
16
+ return this.claiming;
17
+ }
18
+
19
+ async blocked(): Promise<boolean> {
20
+ return this.claiming || (await this.store.held());
21
+ }
22
+
23
+ async run<T>(action: () => Promise<T>): Promise<{ busy: true } | { busy: false; value: T }> {
24
+ if (this.claiming) return { busy: true };
25
+ this.claiming = true; // no await before a concurrent admission sees this
26
+ let marked = false;
27
+ try {
28
+ await this.store.mark();
29
+ marked = true;
30
+ return { busy: false, value: await action() };
31
+ } finally {
32
+ try {
33
+ // A failed mark may already have persisted. Leave it fail-closed for
34
+ // an explicit checked retry rather than guessing that it did not.
35
+ if (marked) await this.store.clear();
36
+ } finally {
37
+ this.claiming = false;
38
+ }
39
+ }
40
+ }
41
+ }
@@ -29,6 +29,7 @@ export const RESIDENT_STEP_LABELS = {
29
29
  git: "a git command",
30
30
  "git-setup": "configuring git",
31
31
  "stage-perms": "securing the credential stage",
32
+ "stage-write-cleanup": "removing a failed staged write",
32
33
  install: "installing dependencies",
33
34
  build: "building",
34
35
  test: "running the tests",