@coreplane/switchboard 1.267.1 → 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 (136) hide show
  1. package/dist/assets/package-lock.json +51 -4
  2. package/dist/assets/package.json +1 -1
  3. package/dist/assets/source.json +3 -3
  4. package/dist/assets/src/core/publicationPush.ts +31 -9
  5. package/dist/assets/src/core/ship/coordinator.ts +11 -1
  6. package/dist/assets/web/dist/.vite/manifest.json +488 -488
  7. package/dist/assets/web/dist/assets/AppShell-CCPwPqvc.js +1 -0
  8. package/dist/assets/web/dist/assets/{CostChart-4TeDdbvJ.js → CostChart-Y5BqJKLA.js} +2 -2
  9. package/dist/assets/web/dist/assets/CostsPage-RRggVvIx.js +1 -0
  10. package/dist/assets/web/dist/assets/DeliveryPage-CuIBLfup.js +1 -0
  11. package/dist/assets/web/dist/assets/HomePage-BQmun9kS.js +1 -0
  12. package/dist/assets/web/dist/assets/InputMenu-ymuqElZB.js +1 -0
  13. package/dist/assets/web/dist/assets/{MetricsPage-BQBuIuYU.js → MetricsPage-D2YGsI8C.js} +1 -1
  14. package/dist/assets/web/dist/assets/NotFoundPage-DZ6ysTXd.js +1 -0
  15. package/dist/assets/web/dist/assets/PendingTurnRow-BPyJ2f-i.js +1 -0
  16. package/dist/assets/web/dist/assets/PlanePage-C_gVx0Dg.js +1 -0
  17. package/dist/assets/web/dist/assets/ResidentDetailPage-CT6v9INM.js +1 -0
  18. package/dist/assets/web/dist/assets/ResidentsIndexPage-CWqPFf40.js +1 -0
  19. package/dist/assets/web/dist/assets/{RunFoldRow-BOWvSoIv.js → RunFoldRow-C1w-mwch.js} +1 -1
  20. package/dist/assets/web/dist/assets/RunRoutePage-zWMHTzla.js +9 -0
  21. package/dist/assets/web/dist/assets/RunsIndexPage-DF16D2Gg.js +1 -0
  22. package/dist/assets/web/dist/assets/RunsTabs-D7rsC4GR.js +1 -0
  23. package/dist/assets/web/dist/assets/ScheduledPage-CyRs0fXN.js +1 -0
  24. package/dist/assets/web/dist/assets/SettingSelect-CEkCLVWd.js +1 -0
  25. package/dist/assets/web/dist/assets/SettingsPage-BRuMCHSj.js +1 -0
  26. package/dist/assets/web/dist/assets/SilentTurn-D4MMDjWO.js +2 -0
  27. package/dist/assets/web/dist/assets/SlackMark-DjJTK2tD.js +1 -0
  28. package/dist/assets/web/dist/assets/StatusDot-BIAQN7iD.js +1 -0
  29. package/dist/assets/web/dist/assets/Tooltip-CxiQ7luL.js +1 -0
  30. package/dist/assets/web/dist/assets/UnitRoutePage-BQB5mAAl.js +1 -0
  31. package/dist/assets/web/dist/assets/{angular-html-BRRhsdQE.js → angular-html-DR_aiq_z.js} +1 -1
  32. package/dist/assets/web/dist/assets/{angular-ts-BFj-mqCm.js → angular-ts-DdAdPC99.js} +1 -1
  33. package/dist/assets/web/dist/assets/{apl-CsBuy1IL.js → apl-CFsVwJXV.js} +1 -1
  34. package/dist/assets/web/dist/assets/{astro-cVaqxBZq.js → astro-CV6XNX3T.js} +1 -1
  35. package/dist/assets/web/dist/assets/{blade-MEP5mWha.js → blade-BGvEqTv7.js} +1 -1
  36. package/dist/assets/web/dist/assets/browser-BWnzWwaT.js +6 -0
  37. package/dist/assets/web/dist/assets/{c-D4NGQ_Pd.js → c-ViUYuFAx.js} +1 -1
  38. package/dist/assets/web/dist/assets/{chapel-BkWImsIy.js → chapel-CZ7_YbfP.js} +1 -1
  39. package/dist/assets/web/dist/assets/{cobol-RPDSPSET.js → cobol-Dc8kYvS6.js} +1 -1
  40. package/dist/assets/web/dist/assets/{coffee-DZ5z7oVX.js → coffee-C0musOvn.js} +1 -1
  41. package/dist/assets/web/dist/assets/{cpp-CrBtIaRZ.js → cpp-ToPQGcGd.js} +1 -1
  42. package/dist/assets/web/dist/assets/{crystal-DJesYi6f.js → crystal-DUJIaO8W.js} +1 -1
  43. package/dist/assets/web/dist/assets/{css-DO9mjau-.js → css-BTcEgWyQ.js} +1 -1
  44. package/dist/assets/web/dist/assets/{dist-XRrc0hhm.js → dist-I2OEmPqz.js} +2 -2
  45. package/dist/assets/web/dist/assets/{edge-C3VzbSW0.js → edge-D8sh1uAj.js} +1 -1
  46. package/dist/assets/web/dist/assets/{elixir-BkD_Vhfe.js → elixir-D5vOtHrB.js} +1 -1
  47. package/dist/assets/web/dist/assets/{elm-KIM0mFPk.js → elm-B_5xqTuz.js} +1 -1
  48. package/dist/assets/web/dist/assets/{erb-D2ruCqb2.js → erb-DBEct7_l.js} +1 -1
  49. package/dist/assets/web/dist/assets/{eventSource-Cv0AFlMi.js → eventSource-Ds6_gjPD.js} +1 -1
  50. package/dist/assets/web/dist/assets/{git-rebase-CnfbQTxA.js → git-rebase-lWoTL0Qh.js} +1 -1
  51. package/dist/assets/web/dist/assets/{glimmer-js-CbiwFXWH.js → glimmer-js-DNfSP4GT.js} +1 -1
  52. package/dist/assets/web/dist/assets/{glimmer-ts-DV8ii0Pv.js → glimmer-ts-DpPeWMLs.js} +1 -1
  53. package/dist/assets/web/dist/assets/{glsl-CgmznWkA.js → glsl-m6Ziz8q0.js} +1 -1
  54. package/dist/assets/web/dist/assets/{graphql-BK-bBYfH.js → graphql-shD9521e.js} +1 -1
  55. package/dist/assets/web/dist/assets/{hack-DnwTTP5n.js → hack-D_Mf_2gv.js} +1 -1
  56. package/dist/assets/web/dist/assets/{haml-DAVJsWwT.js → haml-BuEAF47S.js} +1 -1
  57. package/dist/assets/web/dist/assets/{handlebars-voOVfxFL.js → handlebars-D2aiSYtv.js} +1 -1
  58. package/dist/assets/web/dist/assets/{html-3FTqwaPk.js → html-CRjXJZot.js} +1 -1
  59. package/dist/assets/web/dist/assets/{html-derivative-CSlhLDQn.js → html-derivative-CYpQX_KK.js} +1 -1
  60. package/dist/assets/web/dist/assets/{http-Vx4ilPfS.js → http-D6vXMpc_.js} +1 -1
  61. package/dist/assets/web/dist/assets/{hurl-DxyZDE3R.js → hurl-B634cMJT.js} +1 -1
  62. package/dist/assets/web/dist/assets/{java-nWqdjNJG.js → java-BlINdAve.js} +1 -1
  63. package/dist/assets/web/dist/assets/{javascript-Dr82HOwp.js → javascript-BBEMmUOu.js} +1 -1
  64. package/dist/assets/web/dist/assets/{jinja-BhjLrPOt.js → jinja-BIA8TYHJ.js} +1 -1
  65. package/dist/assets/web/dist/assets/{jison-DilGIUa8.js → jison-aepfTbzH.js} +1 -1
  66. package/dist/assets/web/dist/assets/{json-CrOcvmhJ.js → json-DmYZ1boG.js} +1 -1
  67. package/dist/assets/web/dist/assets/{jsx-BW_RX-fo.js → jsx-GkaaF4_W.js} +1 -1
  68. package/dist/assets/web/dist/assets/{julia-CWH071DB.js → julia-DRtMztOz.js} +1 -1
  69. package/dist/assets/web/dist/assets/{just-DkhhoWBy.js → just-PvoeEWoy.js} +1 -1
  70. package/dist/assets/web/dist/assets/{latex-cuHJ4TUT.js → latex-Bujuo3AZ.js} +1 -1
  71. package/dist/assets/web/dist/assets/{liquid-DG6afYQN.js → liquid-B0h0HkS3.js} +1 -1
  72. package/dist/assets/web/dist/assets/{lua-C5CMnCPS.js → lua-6O-O1CSO.js} +1 -1
  73. package/dist/assets/web/dist/assets/main-DYwKyLY5.js +28 -0
  74. package/dist/assets/web/dist/assets/{marko-Dy2_DuC4.js → marko-XS_tpV0N.js} +1 -1
  75. package/dist/assets/web/dist/assets/{mdc-BMKb_EeA.js → mdc-DxULuTS1.js} +1 -1
  76. package/dist/assets/web/dist/assets/{nginx-og0RgMKf.js → nginx-n2RAfCKE.js} +1 -1
  77. package/dist/assets/web/dist/assets/{nim-CQxTQQP0.js → nim-DJxdqD8U.js} +1 -1
  78. package/dist/assets/web/dist/assets/{org-b5lkq_Pl.js → org-R9yxwZ2v.js} +1 -1
  79. package/dist/assets/web/dist/assets/{perl-D9X5_i_J.js → perl-zKAUtl73.js} +1 -1
  80. package/dist/assets/web/dist/assets/{php-CwUxvLX0.js → php-Dk50x1WE.js} +1 -1
  81. package/dist/assets/web/dist/assets/{pug-uOIOExr0.js → pug-C3TSg8JJ.js} +1 -1
  82. package/dist/assets/web/dist/assets/{qml-g5RoADf-.js → qml-CL1nqvCt.js} +1 -1
  83. package/dist/assets/web/dist/assets/{r-5LdAopD3.js → r-Bo44Yl7y.js} +1 -1
  84. package/dist/assets/web/dist/assets/{razor-DwrvFLYQ.js → razor-k2Dt2qXz.js} +1 -1
  85. package/dist/assets/web/dist/assets/{regexp-dGtAaxC-.js → regexp-Uy_HNe6G.js} +1 -1
  86. package/dist/assets/web/dist/assets/{rst-wFdW0brr.js → rst-U0zcRJ60.js} +1 -1
  87. package/dist/assets/web/dist/assets/{ruby-DPglN6I9.js → ruby-DUyqwP37.js} +1 -1
  88. package/dist/assets/web/dist/assets/{sas-CUbCs40d.js → sas-CxC8bRy1.js} +1 -1
  89. package/dist/assets/web/dist/assets/{scss-B-DUiI1c.js → scss-DaqXj6RQ.js} +1 -1
  90. package/dist/assets/web/dist/assets/{shellscript-lGOV7Ram.js → shellscript-CI49IoFh.js} +1 -1
  91. package/dist/assets/web/dist/assets/{shellsession-BDWtAAjr.js → shellsession-DJxotIOK.js} +1 -1
  92. package/dist/assets/web/dist/assets/{soy-zod_dcOy.js → soy-BjVAVuCU.js} +1 -1
  93. package/dist/assets/web/dist/assets/{sql-BG0HSSoM.js → sql-CzxBKQd1.js} +1 -1
  94. package/dist/assets/web/dist/assets/{sseReplay-BsNQPLmJ.js → sseReplay-BDVyc8HX.js} +3 -3
  95. package/dist/assets/web/dist/assets/{stata-BVUMLp1W.js → stata-DLMv_9_X.js} +1 -1
  96. package/dist/assets/web/dist/assets/{surrealql-DiSUbHKF.js → surrealql-BzbVEZbO.js} +1 -1
  97. package/dist/assets/web/dist/assets/{svelte-DZenT45Y.js → svelte-DTSfopUt.js} +1 -1
  98. package/dist/assets/web/dist/assets/{templ-BWKRNM0-.js → templ-BPxFlKQj.js} +1 -1
  99. package/dist/assets/web/dist/assets/{tex-CbMzBlkK.js → tex-B_KndQwK.js} +1 -1
  100. package/dist/assets/web/dist/assets/{ts-tags-CZsVorDN.js → ts-tags-CG7tgvBl.js} +1 -1
  101. package/dist/assets/web/dist/assets/{tsx-R1r3mH4W.js → tsx-CN9eqIdJ.js} +1 -1
  102. package/dist/assets/web/dist/assets/{twig-BjPMyjKH.js → twig-CKPbB5ca.js} +1 -1
  103. package/dist/assets/web/dist/assets/{typescript-Bx-66VN_.js → typescript-BQAXVjHJ.js} +1 -1
  104. package/dist/assets/web/dist/assets/{typst-fW037Eo6.js → typst-D3EaP9Ui.js} +1 -1
  105. package/dist/assets/web/dist/assets/{vue-D1V_GNxW.js → vue-DuQwQ__D.js} +1 -1
  106. package/dist/assets/web/dist/assets/{vue-html-C-4pTZ-s.js → vue-html-UEJn5cLD.js} +1 -1
  107. package/dist/assets/web/dist/assets/{vue-vine-C-QsX3hR.js → vue-vine-DDdijZY2.js} +1 -1
  108. package/dist/assets/web/dist/assets/{wallClock-x0hjr0J_.js → wallClock-DaewxNMY.js} +1 -1
  109. package/dist/assets/web/dist/assets/{xml-BJTJXPgC.js → xml-BezNDynk.js} +1 -1
  110. package/dist/assets/web/dist/assets/{xsl-Xc9lukqe.js → xsl-Bzb2zIr8.js} +1 -1
  111. package/dist/assets/web/dist/assets/{yaml-Dw-FMsQa.js → yaml-DOccVRRG.js} +1 -1
  112. package/dist/cli.js +74 -20
  113. package/package.json +1 -1
  114. package/dist/assets/web/dist/assets/AppShell-DPJVhUGP.js +0 -1
  115. package/dist/assets/web/dist/assets/CostsPage-8HDgvuWB.js +0 -1
  116. package/dist/assets/web/dist/assets/DeliveryPage-QyS6_Q0m.js +0 -1
  117. package/dist/assets/web/dist/assets/HomePage-Bm40r0wF.js +0 -1
  118. package/dist/assets/web/dist/assets/InputMenu-BRV35UWP.js +0 -1
  119. package/dist/assets/web/dist/assets/NotFoundPage-CDjMfCcj.js +0 -1
  120. package/dist/assets/web/dist/assets/PendingTurnRow-BqY-EaZR.js +0 -1
  121. package/dist/assets/web/dist/assets/PlanePage-VmzjNLAz.js +0 -1
  122. package/dist/assets/web/dist/assets/ResidentDetailPage-hjX3tRCh.js +0 -1
  123. package/dist/assets/web/dist/assets/ResidentsIndexPage-BKGnlCEh.js +0 -1
  124. package/dist/assets/web/dist/assets/RunRoutePage-D9ztf-uE.js +0 -9
  125. package/dist/assets/web/dist/assets/RunsIndexPage-DTYQbhtr.js +0 -1
  126. package/dist/assets/web/dist/assets/RunsTabs-C7Ua3XX5.js +0 -1
  127. package/dist/assets/web/dist/assets/ScheduledPage-BAYR0tuv.js +0 -1
  128. package/dist/assets/web/dist/assets/SettingSelect-CEeA4iuC.js +0 -1
  129. package/dist/assets/web/dist/assets/SettingsPage-BlYBmCG9.js +0 -1
  130. package/dist/assets/web/dist/assets/SilentTurn-CHfzRQW8.js +0 -2
  131. package/dist/assets/web/dist/assets/SlackMark-DB0MGiF5.js +0 -1
  132. package/dist/assets/web/dist/assets/StatusDot-BMkUFVE8.js +0 -1
  133. package/dist/assets/web/dist/assets/Tooltip-Dfot16IA.js +0 -1
  134. package/dist/assets/web/dist/assets/UnitRoutePage-BdZoT-4d.js +0 -1
  135. package/dist/assets/web/dist/assets/browser-CCImen5O.js +0 -6
  136. package/dist/assets/web/dist/assets/main-B32N1vUh.js +0 -28
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "switchboard",
3
- "version": "1.267.1",
3
+ "version": "1.267.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "switchboard",
9
- "version": "1.267.1",
9
+ "version": "1.267.2",
10
10
  "license": "Apache-2.0",
11
11
  "workspaces": [
12
12
  "web",
@@ -21023,7 +21023,7 @@
21023
21023
  },
21024
21024
  "packages/switchboard": {
21025
21025
  "name": "@coreplane/switchboard",
21026
- "version": "1.267.1",
21026
+ "version": "1.267.2",
21027
21027
  "license": "Apache-2.0",
21028
21028
  "dependencies": {
21029
21029
  "@earendil-works/pi-ai": "0.85.1",
@@ -21053,7 +21053,7 @@
21053
21053
  "dependencies": {
21054
21054
  "@nuxt/ui": "^4.11.0",
21055
21055
  "@pierre/diffs": "1.4.2",
21056
- "@vueuse/core": "^14.4.0",
21056
+ "@vueuse/core": "^15.0.0",
21057
21057
  "vue": "^3.5.42",
21058
21058
  "vue-router": "^5.3.1"
21059
21059
  },
@@ -21076,6 +21076,53 @@
21076
21076
  "engines": {
21077
21077
  "node": ">=22"
21078
21078
  }
21079
+ },
21080
+ "web/node_modules/@vueuse/core": {
21081
+ "version": "15.0.0",
21082
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-15.0.0.tgz",
21083
+ "integrity": "sha512-Zv67h5mrk7YHDJsRObx+DXaCBz6RKBUpxqLesJ+3xZNPG6yuQs7ja7kg3veFrrouYLWAqydQ7CwGEbLVxB43Ng==",
21084
+ "license": "MIT",
21085
+ "dependencies": {
21086
+ "@types/web-bluetooth": "^0.0.21",
21087
+ "@vueuse/metadata": "15.0.0",
21088
+ "@vueuse/shared": "15.0.0"
21089
+ },
21090
+ "engines": {
21091
+ "node": ">=22"
21092
+ },
21093
+ "funding": {
21094
+ "url": "https://github.com/sponsors/antfu"
21095
+ },
21096
+ "peerDependencies": {
21097
+ "vue": "^3.5.0"
21098
+ }
21099
+ },
21100
+ "web/node_modules/@vueuse/core/node_modules/@vueuse/shared": {
21101
+ "version": "15.0.0",
21102
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-15.0.0.tgz",
21103
+ "integrity": "sha512-vbNXhGrbV53xPOMSyOzMHQRvhMgZf7oNDw2RChUetVxwTIEkInQ1joZ9JbT0G3z2n2AJNjvmCWeM9ySYrnvogA==",
21104
+ "license": "MIT",
21105
+ "engines": {
21106
+ "node": ">=22"
21107
+ },
21108
+ "funding": {
21109
+ "url": "https://github.com/sponsors/antfu"
21110
+ },
21111
+ "peerDependencies": {
21112
+ "vue": "^3.5.0"
21113
+ }
21114
+ },
21115
+ "web/node_modules/@vueuse/metadata": {
21116
+ "version": "15.0.0",
21117
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-15.0.0.tgz",
21118
+ "integrity": "sha512-sfWE5LADAKJ0KnjtGliMdSN8Ij/L7uP6rXIZlgPloAI4zvvefbw6H5Lt7KJA6RqQOYgVqWF5Guj50HHMIzygBg==",
21119
+ "license": "MIT",
21120
+ "engines": {
21121
+ "node": ">=22"
21122
+ },
21123
+ "funding": {
21124
+ "url": "https://github.com/sponsors/antfu"
21125
+ }
21079
21126
  }
21080
21127
  }
21081
21128
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "switchboard",
3
- "version": "1.267.1",
3
+ "version": "1.267.2",
4
4
  "private": true,
5
5
  "description": "Mention it in Slack and an agent reviews the PR, ships the fix, or answers the question — on the model you choose, with its tools running where you decide.",
6
6
  "license": "Apache-2.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.267.1",
3
- "commit": "6382de7f03c465e18b040fd93103afb1dc44d543",
4
- "builtAt": "2026-09-28T23:55:40.901Z"
2
+ "version": "1.267.2",
3
+ "commit": "08956af1ac05f7f428a07f4e2190b68695623a62",
4
+ "builtAt": "2026-09-29T01:42:48.486Z"
5
5
  }
@@ -15,14 +15,19 @@ const refName = (s: string): boolean =>
15
15
  /^[a-zA-Z0-9_/-]+(?:\.[a-zA-Z0-9_/-]+)*$/.test(s) && !s.includes("..") && !s.startsWith("-");
16
16
  const shortRef = (s: string): string => s.replace(/^refs\/heads\//, "");
17
17
 
18
+ /** Broad enough to count competing Git config pushes; leasedPushCommand
19
+ * separately proves whether one selected call is authorized evidence. */
20
+ export const mentionsGitPush = (command: string): boolean => /\bgit(?:\s+-c\s+\S+)*\s+push\b/.test(command);
21
+
18
22
  /** Deliberately not a shell interpreter. Only a standalone literal push can
19
23
  * attest its result: pipelines, scripts, substitutions and compound commands
20
24
  * cannot prove which operation produced stdout or the successful exit. */
21
25
  export function leasedPushCommand(command: string): { ref: string; expectedHeadSha: string } | undefined {
22
26
  if (command.length >= COMMAND_CAP) return;
23
27
  const literal = command.replace(/[ \t]+2>&1[ \t]*$/, "");
24
- if (!/^git push\s/.test(literal) || /[\n\r'"`$;|<>\\&]/.test(literal)) return;
25
- const words = literal.trim().split(/\s+/).slice(2);
28
+ const prefix = /^git(?: -c http\.postBuffer=[0-9]+)? push\s/.exec(literal);
29
+ if (!prefix || /[\n\r'"`$;|<>\\&]/.test(literal)) return;
30
+ const words = literal.slice(prefix[0].length).trim().split(/\s+/);
26
31
  const leases = words.filter((w) => w.startsWith("--force-with-lease="));
27
32
  if (leases.length !== 1) return;
28
33
  const lease = /^--force-with-lease=refs\/heads\/([^:]+):([a-f0-9]{40})$/.exec(leases[0]!);
@@ -42,13 +47,14 @@ export function pairedPublicationPush(
42
47
  binding: ExistingPrPublicationBinding,
43
48
  head: string,
44
49
  callId?: string,
50
+ gitDoorBaseUrl?: string,
45
51
  ): PushEvent | undefined {
46
52
  if (!fullSha(head) || !fullSha(binding.expectedHeadSha) || head === binding.expectedHeadSha) return;
47
53
  const calls = events.filter(
48
54
  (e): e is Extract<RunEvent, { type: "tool_call" }> =>
49
55
  e.type === "tool_call" &&
50
56
  e.tool === "bash" &&
51
- (callId === undefined ? /\bgit\s+push\b/.test(e.command ?? e.summary) : e.callId === callId),
57
+ (callId === undefined ? mentionsGitPush(e.command ?? e.summary) : e.callId === callId),
52
58
  );
53
59
  if (calls.length !== 1) return;
54
60
  const call = calls[0]!;
@@ -76,20 +82,36 @@ export function pairedPublicationPush(
76
82
  )
77
83
  return;
78
84
  let lines = result.output.trim().split(/\r?\n/);
79
- const tracking = `branch '${binding.publicationRef}' set up to track 'origin/${binding.publicationRef}'.`;
85
+ const tracking = [
86
+ `branch '${binding.publicationRef}' set up to track 'origin/${binding.publicationRef}'.`,
87
+ `Branch '${binding.publicationRef}' set up to track remote branch '${binding.publicationRef}' from 'origin'.`,
88
+ ];
80
89
  if (
81
90
  /(?:^|\s)(?:-u|--set-upstream)(?:\s|$)/.test(call.command) &&
82
- lines.filter((line) => line === tracking).length === 1
91
+ lines.filter((line) => tracking.includes(line)).length === 1
83
92
  )
84
- lines = lines.filter((line) => line !== tracking);
93
+ lines = lines.filter((line) => !tracking.includes(line));
85
94
  if (lines.length !== 2) return;
86
- const remote = /^To (?:https:\/\/github\.com\/|git@github\.com:|github\.com:)([^\s]+?)(?:\.git)?$/.exec(lines[0]!);
95
+ const githubRemote = /^To (?:https:\/\/github\.com\/|git@github\.com:|github\.com:)([^\s]+?)(?:\.git)?$/.exec(
96
+ lines[0]!,
97
+ );
98
+ let doorRemote: string | undefined;
99
+ if (gitDoorBaseUrl !== undefined) {
100
+ try {
101
+ doorRemote = `${new URL(gitDoorBaseUrl).origin}/git/${binding.repo}`;
102
+ } catch {
103
+ return;
104
+ }
105
+ }
106
+ const remoteMatches =
107
+ doorRemote === undefined
108
+ ? githubRemote?.[1]?.toLowerCase() === binding.repo.toLowerCase()
109
+ : lines[0] === `To ${doorRemote}` || lines[0] === `To ${doorRemote}.git`;
87
110
  const update = /^\s*\+?\s*([a-f0-9]{7,40})(\.{2,3})([a-f0-9]{7,40})\s+(\S+) -> (\S+)( \(forced update\))?$/.exec(
88
111
  lines[1]!,
89
112
  );
90
113
  if (
91
- !remote ||
92
- remote[1]!.toLowerCase() !== binding.repo.toLowerCase() ||
114
+ !remoteMatches ||
93
115
  !update ||
94
116
  !binding.expectedHeadSha.startsWith(update[1]!) ||
95
117
  !head.startsWith(update[3]!) ||
@@ -3883,9 +3883,16 @@ function renderUnitReportWithWake(
3883
3883
  const rounds = `${e.reviewRounds} review round${e.reviewRounds === 1 ? "" : "s"}`;
3884
3884
  const prUrl = s.pr?.url;
3885
3885
  const prLine = prUrl ? ` PR: ${prUrl}` : "";
3886
+ const spentCapAction = (): string | undefined => {
3887
+ const cap = s.input.grant?.costCapUsd;
3888
+ if (cap === undefined || s.spendUsd === null || s.spendUsd < cap) return undefined;
3889
+ return `Next action: $${s.spendUsd.toFixed(2)} spent against the original $${cap.toFixed(2)} cost cap; this unit cannot start another child. Continue ${prUrl ? `the existing pull request (${prUrl})` : "the saved branch"} only under separate authorization, then request review of its exact head.`;
3890
+ };
3886
3891
  const nextAction = (checkpoint?: { branch: string; sha: string }): string => {
3887
3892
  if (durableWake)
3888
3893
  return `The unit remains live; a reply in this thread is recorded as its continuation action${prUrl ? ` from the open pull request (${prUrl})` : " from the saved branch state"}.`;
3894
+ const cappedAction = spentCapAction();
3895
+ if (cappedAction !== undefined) return cappedAction;
3889
3896
  const reconcile = checkpoint
3890
3897
  ? `verify \`${checkpoint.sha.slice(0, 7)}\` is on \`${checkpoint.branch}\`, then reconcile the remote branch and pull request if needed`
3891
3898
  : prUrl
@@ -4167,7 +4174,10 @@ function renderUnitReportWithWake(
4167
4174
  ]);
4168
4175
  case "no_verdict":
4169
4176
  if (!shows(verbosity, "verbose"))
4170
- return `⚠️ No verdict from review round ${e.round.index} — aborted after ${rounds}.${prLine}`;
4177
+ return join([
4178
+ `⚠️ No verdict from review round ${e.round.index} — aborted after ${rounds}.${prLine}`,
4179
+ spentCapAction(),
4180
+ ]);
4171
4181
  return join([
4172
4182
  `⚠️ Review round ${e.round.index} ended without a submitted verdict (budget, refusal, or stop) — ship never converts that into a request for changes, so no findings step ran.`,
4173
4183
  writeUpPointer(s, e.round.kind, s.reviewRunByRound[e.round.index]),