@overdeck/desktop 0.45.23 → 0.46.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.
Files changed (549) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +34 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-DOA0KgXx.js → acceptance-criteria-CCwFGICj.js} +2 -2
  4. package/server/activity-logger-CMthG6Vd.js +3 -0
  5. package/server/{activity-logger-DDlOIAML.js → activity-logger-CyteR4JO.js} +24 -13
  6. package/server/{advancing-selfheal-BBu6DSNm.js → advancing-selfheal-De1L-Sb4.js} +6 -6
  7. package/server/{agent-gc-BV1q_2EV.js → agent-gc-CBULruzm.js} +5 -5
  8. package/server/agent-state-VQk8fY9F.js +3 -0
  9. package/server/{agent-state-service-HoK8U4jW.js → agent-state-service-BlnSkRFA.js} +5 -5
  10. package/server/{agent-state-service-CnzFKSAQ.js → agent-state-service-hZpxIw1E.js} +1 -1
  11. package/server/agents-BKKkxKgK.js +3 -0
  12. package/server/{agents-B4Bjbkfv.js → agents-C5rWYhb6.js} +4 -4
  13. package/server/archive-planning-0FJ6Xd3b.js +2 -0
  14. package/server/{archive-planning-DYrYojxl.js → archive-planning-C0lAbNB_.js} +16 -24
  15. package/server/{artifact-index-jobs-C-xy7Z5v.js → artifact-index-jobs-ug6ZxIP5.js} +2 -2
  16. package/server/assemble-DnffNpOo.js +339 -0
  17. package/server/{backlog-auto-trigger-GtG71X8H.js → backlog-auto-trigger-Dh-i9PQf.js} +3 -3
  18. package/server/{behavior-B_-4EKF3.js → behavior-CfIg6pKp.js} +2 -2
  19. package/server/bridge-pool-patrol-CUFmjVDN.js +136 -0
  20. package/server/{briefing-freshness-DWdW7vUm.js → briefing-freshness-DHmCSLar.js} +2 -2
  21. package/server/{build-info-DgTqZkL5.js → build-info-BP160gU7.js} +1 -1
  22. package/server/{build-info-BT096lEl.js → build-info-CuFfxZxp.js} +5 -3
  23. package/server/{checkpoint-manager-DDqcGyu8.js → checkpoint-manager-DEWD82qK.js} +2 -2
  24. package/server/{checkpoint-manager-B7Bt29J0.js → checkpoint-manager-Dxh0FYsv.js} +1 -1
  25. package/server/checkpoint-worker.js +1 -1
  26. package/server/{checkpoints-C-AXLfYT.js → checkpoints-CZvbtLnr.js} +2 -2
  27. package/server/{checkpoints-CpgCjAlN.js → checkpoints-DMTgXuLG.js} +1 -1
  28. package/server/{claude-hooks-provision-C8wdRnN1.js → claude-hooks-provision-CN-xo-do.js} +1 -1
  29. package/server/{claude-hooks-provision-but-_qGY.js → claude-hooks-provision-fvy4RD2b.js} +13 -2
  30. package/server/{claude-permissions-H_5wHQZQ.js → claude-permissions-CN0cSCPp.js} +2 -2
  31. package/server/{claude-settings-overlay-CbSz0Dvb.js → claude-settings-overlay-CJn35FHQ.js} +2 -2
  32. package/server/{claude-settings-overlay-BTENVmYf.js → claude-settings-overlay-Dabi9slj.js} +1 -1
  33. package/server/cli-DmXETsw-.js +3 -0
  34. package/server/{cli-vBeXbPrq.js → cli-oCWYA1pE.js} +9 -9
  35. package/server/{cliproxy-Bgb2XCqi.js → cliproxy-C8mB3KuB.js} +2 -2
  36. package/server/{cliproxy-DW0V86F8.js → cliproxy-PGwTX_o8.js} +1 -1
  37. package/server/{close-issue-Dn_4c4G8.js → close-issue-D5MF5GqF.js} +5 -5
  38. package/server/{closed-issue-reaper-CWpY2uBw.js → closed-issue-reaper-CJ24u0Zt.js} +1 -1
  39. package/server/{closed-issue-reaper-hANY_ehE.js → closed-issue-reaper-Cltx86x5.js} +37 -16
  40. package/server/{codex-Dg7Is5yb.js → codex-BdEsUFWh.js} +1 -1
  41. package/server/{codex-TmSi-yTv.js → codex-Drlf5Xhf.js} +37 -8
  42. package/server/{codex-parser-C4gSH-IR.js → codex-parser-DpB89Vqa.js} +2 -2
  43. package/server/compaction-continuation-K2AxQX4H.js +200 -0
  44. package/server/{config-DjLOdbgT.js → config-B2IMcBxx.js} +4 -3
  45. package/server/{config-DUIhMN_T.js → config-DV-grfQc.js} +1 -1
  46. package/server/{config-CCvjQf27.js → config-Dr3pW6w6.js} +2 -2
  47. package/server/{config-yaml-DvyMuOle.js → config-yaml-CmOPzmBb.js} +290 -22
  48. package/server/{conflict-gate-CmrYpa47.js → conflict-gate-B9cN3SBi.js} +4 -4
  49. package/server/{conflict-gate-BSJkNTdp.js → conflict-gate-Dh754uyA.js} +1 -1
  50. package/server/context-layers-D6LZo3l1.js +4 -0
  51. package/server/context-layers-dR5YxHYB.js +37 -0
  52. package/server/{control-settings-aP1ANIlI.js → control-settings-C7DUehE1.js} +49 -19
  53. package/server/{conversation-compaction-CNbTLB86.js → conversation-compaction-BoqdDXWF.js} +8 -8
  54. package/server/{conversation-compaction-DiG5zWQq.js → conversation-compaction-Dj4FAKoZ.js} +1 -1
  55. package/server/{conversation-service-Du-MTNpJ.js → conversation-service-5aCnq1zR.js} +331 -20
  56. package/server/conversation-service-BCxl4f8Z.js +3 -0
  57. package/server/{conversations-DbOs1e9Q.js → conversations-BUpYsOZg.js} +5 -5
  58. package/server/{conversations-6mPANqvL.js → conversations-C34dyIb9.js} +1 -1
  59. package/server/{cost-Ca0YTWDw.js → cost-Bgcub5kW.js} +12 -2
  60. package/server/{cost-CW4WSe72.js → cost-CvxRrucd.js} +3 -3
  61. package/server/{cost-sync-C0VdGme1.js → cost-sync-Dv3LUaNW.js} +3 -3
  62. package/server/{dag-CdOjJVDT.js → dag-ombYYt4s.js} +2 -2
  63. package/server/{dangerous-git-ops-CT-IypG3.js → dangerous-git-ops-BcJPC5Rr.js} +1 -1
  64. package/server/dashboard-db-worker.js +7 -7
  65. package/server/deacon-DrXqT9LQ.js +4 -0
  66. package/server/{deacon-pRnyD5w9.js → deacon-hi9KLPLT.js} +2998 -2659
  67. package/server/{deacon-nudge-log-Bjg8U4Y9.js → deacon-nudge-log-BNBebzeL.js} +3 -3
  68. package/server/deacon-pending-lifecycle-Cpk0k7Hi.js +33 -0
  69. package/server/{deacon-swarm-DftYRDo8.js → deacon-swarm-DBxUaO-A.js} +13 -13
  70. package/server/deacon-swarm-I2JfX5Tg.js +2 -0
  71. package/server/deacon.js +14 -19
  72. package/server/dead-end-trip-CQcP70ND.js +13 -0
  73. package/server/delivery-Da0zEMY4.js +3 -0
  74. package/server/{deploy-patrol-Bjsho_ha.js → deploy-patrol-Df-Tmaq0.js} +69 -18
  75. package/server/deploy-queue-9SrhZR63.js +3 -0
  76. package/server/deploy-queue-UjKGYsDe.js +169 -0
  77. package/server/deploy-window-jOiPRHL0.js +3 -0
  78. package/server/{deploy-window-DeP_OIRk.js → deploy-window-rpqpWqHA.js} +40 -16
  79. package/server/{dev-supervisor-BpMoHlkR.js → dev-supervisor-CC46Ig8q.js} +2 -2
  80. package/server/{devcontainer-renderer-CtUgrVKW.js → devcontainer-renderer-68CSCRnu.js} +3 -3
  81. package/server/{dist-DyRx4cI7.js → dist-CJy72uEg.js} +1 -1
  82. package/server/dist-DSlxIU1H.js +3 -0
  83. package/server/{dist-src-BSoS7mkd.js → dist-src-Bik83hFi.js} +1 -1
  84. package/server/docker-BMVTSFL5.js +3 -0
  85. package/server/{docker-BK7HIcBj.js → docker-Dam7mbIB.js} +2 -2
  86. package/server/{dod-BrSfUHm0.js → dod-Dar-yheg.js} +8 -4
  87. package/server/durable-review-pipeline-CGZ5QBxh.js +17 -0
  88. package/server/durable-review-pipeline-jpgCJZFp.js +3 -0
  89. package/server/{ensure-devcontainer-DseivYEy.js → ensure-devcontainer-B057YA81.js} +4 -4
  90. package/server/{ensure-devcontainer-DRqaAkBR.js → ensure-devcontainer-C98V8yW-.js} +1 -1
  91. package/server/{esm-shims-CbI3BVkl.js → esm-shims-Br9BPdkR.js} +1 -1
  92. package/server/{event-store-Cr5PQwFC.js → event-store-ELqkVOn0.js} +1 -1
  93. package/server/{event-store-tdiY5eDZ.js → event-store-zY5MJHgF.js} +23 -4
  94. package/server/{events-CvvGK6LT.js → events-D6pyqhzM.js} +1 -1
  95. package/server/{events-CC1dgUpx.js → events-D9PR1IC0.js} +3 -3
  96. package/server/{factory-CynerjXO.js → factory-CRoOpGsF.js} +5 -5
  97. package/server/{feature-registry-population-B0pmAz0a.js → feature-registry-population--YUXU999.js} +4 -4
  98. package/server/{feature-registry-storage-_wUBRD3J.js → feature-registry-storage-BORBTo0y.js} +2 -2
  99. package/server/{features-Dhxz-wLc.js → features--nFkJY8v.js} +2 -2
  100. package/server/{feedback-target-iygZwmMc.js → feedback-target-C0ZzyHvU.js} +1 -1
  101. package/server/{feedback-target-CPS15Vte.js → feedback-target-Dt9BsapX.js} +8 -8
  102. package/server/{feedback-writer-C9b6ccN1.js → feedback-writer-BG0RUZiu.js} +5 -5
  103. package/server/{feedback-writer-qmiMbqTZ.js → feedback-writer-D1fm-5Z8.js} +1 -1
  104. package/server/flywheel-BekukH4i.js +2 -0
  105. package/server/flywheel-BiT3odRb.js +1092 -0
  106. package/server/flywheel-CLVB55Be.js +478 -0
  107. package/server/flywheel-merge-order-BJv1DZz1.js +462 -0
  108. package/server/flywheel-merge-order-BKw9o6ku.js +2 -0
  109. package/server/forge-CZbSg6Ds.js +383 -0
  110. package/server/forge-DK3blQb_.js +3 -0
  111. package/server/{from-CJ_aH5jD.js → from-D_4_dk7i.js} +1 -1
  112. package/server/{fts-db-CKgg0VKg.js → fts-db-BeOomFa-.js} +2 -2
  113. package/server/{fts-operations-BrL_VTRr.js → fts-operations-BdewJ_g9.js} +2 -2
  114. package/server/git-utils-CI6cwyyC.js +3 -0
  115. package/server/{git-utils-BVa07a4a.js → git-utils-ameCgDdy.js} +93 -3
  116. package/server/{github-app-CMBdIFBQ.js → github-app-CQ1Lo6LA.js} +19 -8
  117. package/server/{github-app-CPfoFAdV.js → github-app-DtAsvwzK.js} +1 -1
  118. package/server/{github-client--XVlDpwM.js → github-client-BfyDxuRN.js} +2 -2
  119. package/server/{github-client-B4QsdE-X.js → github-client-Cj0yl_07.js} +1 -1
  120. package/server/github-pr-lookup-BDq6Wznz.js +58 -0
  121. package/server/{harness-binary-CVio2m-u.js → harness-binary-DqkftwTb.js} +32 -6
  122. package/server/{harness-resolve-qHJBhy3Z.js → harness-resolve-CqMqM1Mb.js} +18 -9
  123. package/server/{health-events-C9B8y1Hm.js → health-events-CazRxJUS.js} +2 -2
  124. package/server/{health-events-CpfvuVmm.js → health-events-_xfTaOUs.js} +1 -1
  125. package/server/{hooks-DUXw8A0-.js → hooks-BO3QT1sn.js} +2 -2
  126. package/server/{hooks-ltecuFqZ.js → hooks-BnJsxlSq.js} +1 -1
  127. package/server/{hume-BEq0bUDg.js → hume-CDYJxqx-.js} +2 -2
  128. package/server/hume-Dq--7rOQ.js +3 -0
  129. package/server/{idle-stack-reaper-D7w9t3fE.js → idle-stack-reaper-BYqERdkE.js} +1 -1
  130. package/server/{idle-stack-reaper-w1ISSlhs.js → idle-stack-reaper-CnGx_PO_.js} +99 -6
  131. package/server/in-flight-guard-Bq3epG58.js +45 -0
  132. package/server/{infra-CzaSOgul.js → infra-BjuxvjdS.js} +80 -5
  133. package/server/{injection-oNZeoDhL.js → injection-DZxlV2al.js} +1 -1
  134. package/server/{injection-DZ0PfYa4.js → injection-UCf8EsjX.js} +191 -183
  135. package/server/{inspect-agent-DJKLWcVT.js → inspect-agent-6kylZnrm.js} +139 -82
  136. package/server/inspect-agent-BVwDrVrz.js +2 -0
  137. package/server/{internal-token-Bb4XeV2x.js → internal-token-DvMTQSOS.js} +2 -2
  138. package/server/{internal-token-DXdfprGr.js → internal-token-M9omeXM1.js} +1 -1
  139. package/server/{io-B3_AHDfr.js → io-VHvc0Ssp.js} +43 -26
  140. package/server/{issue-closed-zhdvQicO.js → issue-closed-B6KJkmHZ.js} +7 -7
  141. package/server/{issue-lifecycle-Dy4vd0Oa.js → issue-lifecycle-9gk3fnXN.js} +1 -1
  142. package/server/{issue-lifecycle-CreaCkjW.js → issue-lifecycle-C4Zj0WmE.js} +34 -28
  143. package/server/{issue-service-singleton-B5ushCvE.js → issue-service-singleton-DmCh7EHj.js} +10 -10
  144. package/server/{issue-service-singleton-DabvBWUp.js → issue-service-singleton-PMx8F1jr.js} +1 -1
  145. package/server/{issues-B6ToV6x1.js → issues-CgnQ1OGQ.js} +2 -2
  146. package/server/{jsonl-parser-Dhflo1SH.js → jsonl-parser-DJOH_O-w.js} +5 -4
  147. package/server/{label-cleanup-BKPJm4Hv.js → label-cleanup-Dv7AV_R1.js} +3 -3
  148. package/server/{label-reconciler-DdWbHEBu.js → label-reconciler--F85rufp.js} +4 -4
  149. package/server/{lifecycle-DfeyBDwA.js → lifecycle-CTdOWYMi.js} +2 -2
  150. package/server/{lifecycle-sycO16hj.js → lifecycle-DDN8ApVY.js} +6 -7
  151. package/server/{lifecycle-io-D8iNBcux.js → lifecycle-io-D-lGdzK3.js} +5 -5
  152. package/server/{lifecycle-io-Bsnr2K4F.js → lifecycle-io-D_zTLvP1.js} +1 -1
  153. package/server/{linear-client-D4zqMnX7.js → linear-client-BQU36QqE.js} +2 -2
  154. package/server/{linear-client-DqhDQO9k.js → linear-client-CY4O_Tu3.js} +1 -1
  155. package/server/linear-mcp-auth-BnU4TYfY.js +280 -0
  156. package/server/linear-mcp-auth-NYBq_oHZ.js +2 -0
  157. package/server/memory-fts-worker.js +1 -1
  158. package/server/{merge-C_ZEhbqI.js → merge-Bpx4jjht.js} +13 -11
  159. package/server/{merge-agent-XrB80vfT.js → merge-agent-DdMVSV2Y.js} +233 -83
  160. package/server/{merge-agent-BQM3a8z5.js → merge-agent-DrXa1CpW.js} +1 -1
  161. package/server/{merge-batch-Bwoyr8Je.js → merge-batch-C5q1c1GX.js} +1 -1
  162. package/server/merge-completeness-BMm8tMyZ.js +277 -0
  163. package/server/merge-completeness-D0ljXbk3.js +3 -0
  164. package/server/{merge-DK23JEdS.js → merge-idOG--29.js} +1 -1
  165. package/server/merge-ops-DdpTiEMt.js +2 -0
  166. package/server/merge-rebase-DGQpYJU3.js +2 -0
  167. package/server/{merge-rebase-C1KIVr0s.js → merge-rebase-xLnMlw5h.js} +3 -3
  168. package/server/merge-set-DH7ot3yz.js +89 -0
  169. package/server/merge-set-DzsOTBg5.js +3 -0
  170. package/server/{merge-sync-DZ9dojJn.js → merge-sync-CQ-LgZ1_.js} +406 -153
  171. package/server/merge-sync-Ca7F5JnQ.js +3 -0
  172. package/server/{merge-train-DxDfBTjr.js → merge-train-DTEMyIu4.js} +18 -8
  173. package/server/{merge-train-deps-CyYQUksx.js → merge-train-deps-CNPJzepw.js} +4 -4
  174. package/server/merge-verification-x3JO8Dtz.js +220 -0
  175. package/server/merged-docker-cleanup-worker-CTpC27Bs.js +107 -0
  176. package/server/merged-docker-cleanup-worker-Cdi9apm-.js +3 -0
  177. package/server/{multipart-parser-Dt8YPN5S.js → multipart-parser-IMSBfePV.js} +2 -2
  178. package/server/{no-resume-mode-Cx3K0hHi.js → no-resume-mode-C5ULAXwO.js} +1 -1
  179. package/server/node_modules/.package-lock.json +27 -27
  180. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  181. package/server/node_modules/@google-cloud/common/package.json +2 -2
  182. package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  183. package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
  184. package/server/node_modules/gaxios/package.json +1 -1
  185. package/server/node_modules/google-auth-library/build/src/auth/googleauth.js +24 -19
  186. package/server/node_modules/google-auth-library/package.json +1 -1
  187. package/server/node_modules/google-gax/build/protos/google/api/auth.proto +2 -1
  188. package/server/node_modules/google-gax/build/protos/google/api/backend.proto +12 -1
  189. package/server/node_modules/google-gax/build/protos/google/api/billing.proto +1 -1
  190. package/server/node_modules/google-gax/build/protos/google/api/client.proto +165 -53
  191. package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1/resources.proto +1 -1
  192. package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1beta/quota_adjuster_settings.proto +7 -3
  193. package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1beta/resources.proto +1 -1
  194. package/server/node_modules/google-gax/build/protos/google/api/config_change.proto +1 -1
  195. package/server/node_modules/google-gax/build/protos/google/api/context.proto +1 -1
  196. package/server/node_modules/google-gax/build/protos/google/api/control.proto +3 -3
  197. package/server/node_modules/google-gax/build/protos/google/api/distribution.proto +1 -1
  198. package/server/node_modules/google-gax/build/protos/google/api/documentation.proto +1 -1
  199. package/server/node_modules/google-gax/build/protos/google/api/endpoint.proto +1 -1
  200. package/server/node_modules/google-gax/build/protos/google/api/error_reason.proto +186 -1
  201. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/checked.proto +31 -3
  202. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/eval.proto +8 -9
  203. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/explain.proto +1 -2
  204. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/syntax.proto +20 -22
  205. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/value.proto +2 -3
  206. package/server/node_modules/google-gax/build/protos/google/api/field_behavior.proto +1 -1
  207. package/server/node_modules/google-gax/build/protos/google/api/field_info.proto +1 -1
  208. package/server/node_modules/google-gax/build/protos/google/api/http.proto +1 -1
  209. package/server/node_modules/google-gax/build/protos/google/api/httpbody.proto +1 -1
  210. package/server/node_modules/google-gax/build/protos/google/api/label.proto +1 -1
  211. package/server/node_modules/google-gax/build/protos/google/api/launch_stage.proto +1 -1
  212. package/server/node_modules/google-gax/build/protos/google/api/log.proto +1 -1
  213. package/server/node_modules/google-gax/build/protos/google/api/logging.proto +1 -1
  214. package/server/node_modules/google-gax/build/protos/google/api/metric.proto +1 -1
  215. package/server/node_modules/google-gax/build/protos/google/api/monitored_resource.proto +1 -1
  216. package/server/node_modules/google-gax/build/protos/google/api/monitoring.proto +1 -1
  217. package/server/node_modules/google-gax/build/protos/google/api/policy.proto +1 -1
  218. package/server/node_modules/google-gax/build/protos/google/api/quota.proto +1 -1
  219. package/server/node_modules/google-gax/build/protos/google/api/resource.proto +1 -1
  220. package/server/node_modules/google-gax/build/protos/google/api/routing.proto +8 -4
  221. package/server/node_modules/google-gax/build/protos/google/api/service.proto +2 -3
  222. package/server/node_modules/google-gax/build/protos/google/api/source_info.proto +1 -1
  223. package/server/node_modules/google-gax/build/protos/google/api/system_parameter.proto +1 -1
  224. package/server/node_modules/google-gax/build/protos/google/api/usage.proto +7 -27
  225. package/server/node_modules/google-gax/build/protos/google/api/visibility.proto +1 -1
  226. package/server/node_modules/google-gax/build/protos/google/longrunning/operations.proto +20 -1
  227. package/server/node_modules/google-gax/build/protos/google/protobuf/any.proto +52 -108
  228. package/server/node_modules/google-gax/build/protos/google/protobuf/compiler/ruby/ruby_generated_code.proto +2 -0
  229. package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_features.proto +21 -1
  230. package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_file_options.proto +24 -0
  231. package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_options.proto +15 -0
  232. package/server/node_modules/google-gax/build/protos/google/protobuf/descriptor.proto +118 -30
  233. package/server/node_modules/google-gax/build/protos/google/protobuf/field_mask.proto +16 -18
  234. package/server/node_modules/google-gax/build/protos/google/protobuf/internal_options.proto +8 -1
  235. package/server/node_modules/google-gax/build/protos/google/protobuf/json/json_enumval_custom_string.proto +26 -0
  236. package/server/node_modules/google-gax/build/protos/google/protobuf/json_enumvalue_options.proto +29 -0
  237. package/server/node_modules/google-gax/build/protos/google/protobuf/json_options.proto +14 -0
  238. package/server/node_modules/google-gax/build/protos/google/protobuf/struct.proto +38 -22
  239. package/server/node_modules/google-gax/build/protos/google/protobuf/test_protos/forced_micro_string.proto +3 -0
  240. package/server/node_modules/google-gax/build/protos/google/protobuf/test_protos/repeated_field_proxy_import_message.proto +14 -0
  241. package/server/node_modules/google-gax/build/protos/google/protobuf/timestamp.proto +9 -8
  242. package/server/node_modules/google-gax/build/protos/google/protobuf/util/json_format_proto3.proto +18 -0
  243. package/server/node_modules/google-gax/build/protos/google/rpc/code.proto +1 -1
  244. package/server/node_modules/google-gax/build/protos/google/rpc/context/attribute_context.proto +7 -2
  245. package/server/node_modules/google-gax/build/protos/google/rpc/context/audit_context.proto +1 -1
  246. package/server/node_modules/google-gax/build/protos/google/rpc/error_details.proto +5 -5
  247. package/server/node_modules/google-gax/build/protos/google/rpc/http.proto +1 -1
  248. package/server/node_modules/google-gax/build/protos/google/rpc/status.proto +1 -2
  249. package/server/node_modules/google-gax/build/protos/google/type/calendar_period.proto +1 -1
  250. package/server/node_modules/google-gax/build/protos/google/type/color.proto +9 -10
  251. package/server/node_modules/google-gax/build/protos/google/type/date.proto +11 -9
  252. package/server/node_modules/google-gax/build/protos/google/type/datetime.proto +17 -17
  253. package/server/node_modules/google-gax/build/protos/google/type/dayofweek.proto +1 -1
  254. package/server/node_modules/google-gax/build/protos/google/type/decimal.proto +11 -13
  255. package/server/node_modules/google-gax/build/protos/google/type/expr.proto +1 -1
  256. package/server/node_modules/google-gax/build/protos/google/type/fraction.proto +1 -1
  257. package/server/node_modules/google-gax/build/protos/google/type/interval.proto +1 -2
  258. package/server/node_modules/google-gax/build/protos/google/type/latlng.proto +4 -5
  259. package/server/node_modules/google-gax/build/protos/google/type/localized_text.proto +3 -3
  260. package/server/node_modules/google-gax/build/protos/google/type/money.proto +1 -2
  261. package/server/node_modules/google-gax/build/protos/google/type/month.proto +1 -1
  262. package/server/node_modules/google-gax/build/protos/google/type/phone_number.proto +20 -15
  263. package/server/node_modules/google-gax/build/protos/google/type/postal_address.proto +39 -39
  264. package/server/node_modules/google-gax/build/protos/google/type/quaternion.proto +4 -4
  265. package/server/node_modules/google-gax/build/protos/google/type/timeofday.proto +11 -8
  266. package/server/node_modules/google-gax/package.json +5 -5
  267. package/server/node_modules/retry-request/package.json +4 -4
  268. package/server/node_modules/teeny-request/package.json +5 -5
  269. package/server/node_modules/undici/README.md +5 -0
  270. package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
  271. package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
  272. package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
  273. package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
  274. package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
  275. package/server/node_modules/undici/docs/docs/index.md +5 -0
  276. package/server/node_modules/undici/lib/cache/memory-cache-store.js +54 -9
  277. package/server/node_modules/undici/lib/cache/sqlite-cache-store.js +7 -1
  278. package/server/node_modules/undici/lib/core/request.js +13 -2
  279. package/server/node_modules/undici/lib/core/util.js +6 -1
  280. package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
  281. package/server/node_modules/undici/lib/dispatcher/client-h1.js +42 -8
  282. package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
  283. package/server/node_modules/undici/lib/global.js +36 -16
  284. package/server/node_modules/undici/lib/handler/cache-handler.js +269 -61
  285. package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +13 -3
  286. package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
  287. package/server/node_modules/undici/lib/handler/retry-handler.js +30 -4
  288. package/server/node_modules/undici/lib/interceptor/cache.js +159 -52
  289. package/server/node_modules/undici/lib/interceptor/decompress.js +9 -2
  290. package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
  291. package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
  292. package/server/node_modules/undici/lib/util/cache.js +372 -68
  293. package/server/node_modules/undici/lib/util/date.js +23 -6
  294. package/server/node_modules/undici/lib/web/cookies/util.js +78 -8
  295. package/server/node_modules/undici/lib/web/fetch/body.js +2 -1
  296. package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
  297. package/server/node_modules/undici/package.json +2 -2
  298. package/server/node_modules/undici/types/client.d.ts +2 -2
  299. package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
  300. package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
  301. package/server/{orphan-proposed-reconciler-BTkDrl4R.js → orphan-proposed-reconciler-CWmOdM9-.js} +1 -1
  302. package/server/{orphan-proposed-reconciler-neK8dHQk.js → orphan-proposed-reconciler-Dg6U4ADZ.js} +24 -15
  303. package/server/package-lock.json +28 -28
  304. package/server/package.json +1 -1
  305. package/server/{pan-dir-DeVUgwA7.js → pan-dir-ubraCiUg.js} +24 -10
  306. package/server/{paths-_zEts6wc.js → paths-cXmOwSbh.js} +2 -2
  307. package/server/pending-lifecycle-claim-DEteYdS9.js +110 -0
  308. package/server/{pickup-Dd0Znxxy.js → pickup-D8xtG1J2.js} +17 -16
  309. package/server/pipeline-membership-BGSvkT2M.js +3 -0
  310. package/server/pipeline-membership-CrAPLYtf.js +57 -0
  311. package/server/{pipeline-membership-0HaEGDlH.js → pipeline-membership-gather-CET40frr.js} +177 -109
  312. package/server/pipeline-membership-gather-DTfcgxLl.js +3 -0
  313. package/server/{pipeline-notifier-D0ykk59O.js → pipeline-notifier-BuQ0e4hF.js} +2 -2
  314. package/server/{pipeline-notifier-6iCJplFZ.js → pipeline-notifier-ImNXknf0.js} +1 -1
  315. package/server/post-merge-lifecycle-worker-DbO10pum.js +50 -0
  316. package/server/{project-pipelines-2sK1apsO.js → project-pipelines-Bim6bThI.js} +2 -2
  317. package/server/project-repos-C0nuoBGv.js +98 -0
  318. package/server/project-repos-CRE6Ykow.js +3 -0
  319. package/server/projects-B03Wr-xc.js +3 -0
  320. package/server/{prompts-Dp4Tpk39.js → prompts-BEx08AIu.js} +2 -2
  321. package/server/{providers-DKkBXhxU.js → providers-D7IluJe0.js} +1 -1
  322. package/server/{providers-DV7ec8l7.js → providers-evXhiQeg.js} +7 -7
  323. package/server/public/assets/{chunk-BO2N2NFS-CltymLRg.js → chunk-BO2N2NFS-D1s4-Sqp.js} +4 -4
  324. package/server/public/assets/{diagram-OG6HWLK6-D2f6pjgA.js → diagram-OG6HWLK6-1gdMoSF7.js} +1 -1
  325. package/server/public/assets/{dist-BWR4qFiV.js → dist-CxAOHbil.js} +1 -1
  326. package/server/public/assets/{dist-DEmlBBNQ.js → dist-DqDRYW6P.js} +3 -3
  327. package/server/public/assets/{ganttDiagram-6RSMTGT7-DnfiViPK.js → ganttDiagram-6RSMTGT7-BYex-Ec7.js} +1 -1
  328. package/server/public/assets/{highlighted-body-OFNGDK62-B8Wrmj9H.js → highlighted-body-OFNGDK62-DlVkiG0S.js} +1 -1
  329. package/server/public/assets/index-Cc7cnFC4.css +1 -0
  330. package/server/public/assets/index-K0hAYCgV.js +807 -0
  331. package/server/public/assets/{linear-C9zFQpkX.js → linear-B4cuEFmO.js} +1 -1
  332. package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +1 -0
  333. package/server/public/assets/{pieDiagram-4H26LBE5-lR8H7Yjd.js → pieDiagram-4H26LBE5-CBHNBIJQ.js} +1 -1
  334. package/server/public/assets/{prod-B1jCQihw.js → prod-CN2nHBvX.js} +4 -4
  335. package/server/public/assets/{quadrantDiagram-W4KKPZXB-CVQ2guem.js → quadrantDiagram-W4KKPZXB-Bom87VOQ.js} +1 -1
  336. package/server/public/assets/{sankeyDiagram-5OEKKPKP-eD1RB4gm.js → sankeyDiagram-5OEKKPKP-UrBeyLxk.js} +1 -1
  337. package/server/public/assets/{xychartDiagram-2RQKCTM6-ChEC6dQn.js → xychartDiagram-2RQKCTM6-DhkbrIxR.js} +1 -1
  338. package/server/public/index.html +2 -2
  339. package/server/{pull-requests--Ib2jTgy.js → pull-requests-Cv7LxzUN.js} +1 -1
  340. package/server/{pull-requests-CXIhdCYD.js → pull-requests-DHWiKxo7.js} +19 -10
  341. package/server/{queries-6d7Cdtm7.js → queries-DHJm7bTd.js} +1134 -203
  342. package/server/{rally-B708-nZn.js → rally-B71M9f4o.js} +3 -3
  343. package/server/rally-YDjU513q.js +3 -0
  344. package/server/{rally-api-yjQ0TfHd.js → rally-api-D5uXN08-.js} +1 -1
  345. package/server/{rally-api-nY0ZANw3.js → rally-api-Dkqmok65.js} +2 -2
  346. package/server/{rally-client-B1EJhfV0.js → rally-client-Bfqm6XI4.js} +4 -4
  347. package/server/{rally-client-CULK2XAY.js → rally-client-CxsA6ExK.js} +1 -1
  348. package/server/{reap-terminal-sessions-MWnqdLCJ.js → reap-terminal-sessions-BQ23nriz.js} +2 -2
  349. package/server/{reap-terminal-sessions-N3BTkmX_.js → reap-terminal-sessions-CvmwaqKv.js} +2 -2
  350. package/server/{rebuild-stack-Dp4eLkt4.js → rebuild-stack-0EEYReVZ.js} +36 -36
  351. package/server/rebuild-stack-qeRqHZxH.js +4 -0
  352. package/server/{reconstruct-cache-uWbZfjms.js → reconstruct-cache-BbYFsqLa.js} +7 -6
  353. package/server/record-CtroO946.js +3 -0
  354. package/server/record-update-DH6dLJID.js +3 -0
  355. package/server/{record-update-Dq0t2uBG.js → record-update-Z0QCxmMp.js} +124 -34
  356. package/server/{recovery-trip-BJtIQuag.js → recovery-trip-eJe26h-f.js} +2 -2
  357. package/server/{release-engine-DZpmGGzb.js → release-engine-lPUp-MTd.js} +5 -5
  358. package/server/{release-set-hnXd_kga.js → release-set-BwGeyZKX.js} +3 -3
  359. package/server/{remote-Br-ZWVIP.js → remote-BCd02Es1.js} +3 -3
  360. package/server/{remote-4tiENDaI.js → remote-CVGUhXMV.js} +3 -3
  361. package/server/{remote-agents-CRCg1L4H.js → remote-agents-C1bssi41.js} +2 -2
  362. package/server/{remote-agents-nmty1mLu.js → remote-agents-C_VxssLU.js} +300 -46
  363. package/server/{remote-completion-BbWNd10K.js → remote-completion-DAB0P706.js} +12 -12
  364. package/server/resume-u9byntrq.js +3 -0
  365. package/server/{review-agent-DJRO8EG8.js → review-agent-CD4RCI0Y.js} +1 -1
  366. package/server/{review-agent-sKkE1FEL.js → review-agent-CHhI66UP.js} +61 -44
  367. package/server/{review-artifacts-BLbSC4ke.js → review-artifacts-DSMRIfuJ.js} +7 -6
  368. package/server/{review-context-BgX3lcCx.js → review-context-oFuBbiEE.js} +69 -25
  369. package/server/{in-flight-guard-aQ1IxeI3.js → review-convoy-liveness-CpzrcJ5F.js} +3 -44
  370. package/server/review-status-BZH8h-6W.js +3 -0
  371. package/server/review-status-emit-CUExtHd5.js +50 -0
  372. package/server/{review-status-enrichment-tbOn_A_u.js → review-status-enrichment-QV_hQkgS.js} +4 -4
  373. package/server/{review-status-source-CxuEjLGg.js → review-status-source-CpvJnvnQ.js} +24 -3
  374. package/server/review-status-source-ylw5QZUR.js +3 -0
  375. package/server/{review-status-sync-BhSQ0d0l.js → review-status-sync-483sujRo.js} +10 -5
  376. package/server/{review-status-sync-To3-iS-N.js → review-status-sync-NaWvI9Xf.js} +1 -1
  377. package/server/review-status-yljtTd-q.js +7521 -0
  378. package/server/{review-verdict-feedback-C1Kg8n7t.js → review-verdict-feedback-BPDn4li_.js} +1 -1
  379. package/server/{review-verdict-feedback-CTRNtzXO.js → review-verdict-feedback-CELeUinh.js} +48 -8
  380. package/server/{rollup-WA0VD-Rr.js → rollup-DTNvelz9.js} +8 -8
  381. package/server/{rollup-B53Y81xK.js → rollup-DYZfq1c4.js} +1 -1
  382. package/server/{scanner-D2743cp8.js → scanner-CV35oSn4.js} +42 -14
  383. package/server/{sequence-io-Cg0zYj_E.js → sequence-io-DF_8iuhV.js} +4 -4
  384. package/server/{sequencer-agent-BGY8gjg-.js → sequencer-agent-B2WeCtGi.js} +5 -5
  385. package/server/server.js +3899 -672
  386. package/server/{service-DCpB_SGd.js → service-Br9rpBNA.js} +83 -65
  387. package/server/{session-fork-BQ8_6H32.js → session-fork-D0LY152N.js} +2 -2
  388. package/server/{session-history-CVZDpS3c.js → session-history-BUyK29eq.js} +4 -4
  389. package/server/{settings-BZ5m1UCl.js → settings-Bse1Pdcj.js} +3 -3
  390. package/server/settings-CdvIF84R.js +2 -0
  391. package/server/{settings-ylxwqwQG.js → settings-CvVGqNEs.js} +3 -2
  392. package/server/{shadow-engineering-BlxG6Xye.js → shadow-engineering-BWLa8ODz.js} +2 -2
  393. package/server/{shadow-state-Dh-HzF2J.js → shadow-state-B4fpKxOO.js} +2 -2
  394. package/server/{shadow-state-C2_epgx2.js → shadow-state-FV6PHfEW.js} +1 -1
  395. package/server/{shadow-utils-4bvjn9b3.js → shadow-utils-D7asqxOZ.js} +2 -2
  396. package/server/{ship-log-ClSMIzZX.js → ship-log-xplJ8t75.js} +1 -1
  397. package/server/{smart-compaction-CHIxLr_d.js → smart-compaction-CPp2Ykf6.js} +1 -1
  398. package/server/{smart-compaction-r4pHQBIr.js → smart-compaction-D3U_79f-.js} +8 -7
  399. package/server/{spawn-planning-session-KC_UduxD.js → spawn-planning-session-1nFi3gfk.js} +1 -1
  400. package/server/{spawn-planning-session-DWAorh2B.js → spawn-planning-session-DGfZ5B8D.js} +30 -23
  401. package/server/{specialist-completion-BXhav38U.js → specialist-completion-Br48eiDP.js} +1 -1
  402. package/server/{specialist-context-DtrYvGJ-.js → specialist-context-cVbGnTa3.js} +5 -5
  403. package/server/{specialist-handoff-logger-C45ouoZ6.js → specialist-handoff-logger-DK-GTz4s.js} +2 -2
  404. package/server/{specialist-logs-DJ3RzKxW.js → specialist-logs-Cl5-hqT8.js} +3 -3
  405. package/server/{specialists-JVO00bs7.js → specialists-CNfYO3G2.js} +1634 -457
  406. package/server/{specialists-DyFeedjn.js → specialists-Cicieuzu.js} +21 -19
  407. package/server/{specialists-D5fRZXmN.js → specialists-JHsdU3pA.js} +1 -1
  408. package/server/{specialists-DVj0hvaL.js → specialists-Tdezg_6N.js} +1 -1
  409. package/server/specs-Bt7WJDoC.js +3 -0
  410. package/server/src-CRmCHlma.js +11408 -0
  411. package/server/{src-CG9mCkP6.js → src-Ck028hjO.js} +6 -6
  412. package/server/{src-CMTQGyCK.js → src-UWcGe0Ix.js} +5 -5
  413. package/server/stack-health-CJLMrLBl.js +3 -0
  414. package/server/{stack-health-puygdaMd.js → stack-health-DqSqx0zv.js} +68 -12
  415. package/server/{stale-task-claims-BbFwCTb0.js → stale-task-claims-CYFOUNlT.js} +4 -4
  416. package/server/{staleness-Cbl_w4Bw.js → staleness-BQ-0gMYK.js} +1 -1
  417. package/server/{staleness-Bpy41ngS.js → staleness-D47CUJok.js} +1 -1
  418. package/server/{state-home-CIGjwNfJ.js → state-home-BYV7qZTW.js} +2 -2
  419. package/server/{state-mapping-BL_-3Yt8.js → state-mapping-BVldLhBf.js} +1 -1
  420. package/server/{state-migrate-Dkzaxvny.js → state-migrate-CvvBtS0Y.js} +4 -4
  421. package/server/{stuck-remediation-sY_MHHgQ.js → stuck-remediation-Wt0UVvu1.js} +1 -1
  422. package/server/{stuck-remediation-CzEov_fq.js → stuck-remediation-mkLC6G_t.js} +360 -26
  423. package/server/{substrate-bug-weights-service-BH66lhm7.js → substrate-bug-weights-service-XfLAKnmK.js} +3 -3
  424. package/server/{summary-fork-D8bXjCr7.js → summary-fork-CD7GOts0.js} +2 -2
  425. package/server/{summary-fork-DHhJIsAL.js → summary-fork-xiXBnWG9.js} +78 -12
  426. package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-B5SbvDx2.js} +2 -41
  427. package/server/supervisor/{paths-DehGY2Fj.js → paths-K3noE4N_.js} +1 -1
  428. package/server/supervisor/pty-supervisor.js +49 -2
  429. package/server/supervisor/pty-token-B7lp0ElT.js +43 -0
  430. package/server/{supervisor-BO-Zk_h-.js → supervisor-DL788vos.js} +3 -3
  431. package/server/supervisor-UWiQNK-y.js +2 -0
  432. package/server/{swarm-readiness-CQ_fwUWF.js → swarm-readiness-BV14DF5N.js} +3 -3
  433. package/server/{system-prerequisites-Bza0ffAh.js → system-prerequisites-pdWG6ZQs.js} +56 -29
  434. package/server/{teardown-workspace-CEgauF4U.js → teardown-workspace-l2F4_zim.js} +15 -16
  435. package/server/{test-agent-queue-DXDt0Xa-.js → test-agent-queue-qakFIIGz.js} +6 -6
  436. package/server/{test-verdict-CmUBK5cT.js → test-verdict-BJYDggMm.js} +1 -1
  437. package/server/{test-verdict-DFjjIHR5.js → test-verdict-Gw-btEfb.js} +1 -1
  438. package/server/{tldr-daemon-DL566HbH.js → tldr-daemon-BKOYB616.js} +1 -1
  439. package/server/{tldr-daemon-BDtLOIlO.js → tldr-daemon-CBaWkV9k.js} +2 -2
  440. package/server/{tmux-ftABRAmc.js → tmux-B1Wbxz5o.js} +3 -3
  441. package/server/{tmux-DoThH6aj.js → tmux-DQ6jB76i.js} +1 -1
  442. package/server/tmux-dedup-DbN6MGzM.js +892 -0
  443. package/server/{token-CsOhvw42.js → token-Cxbk023d.js} +2 -2
  444. package/server/{token-util-CTmczIfW.js → token-util-CLq2MmQt.js} +1 -1
  445. package/server/token-util-zlz9U0ki.js +3 -0
  446. package/server/{tracker-config-B4itFzDo.js → tracker-config-DZ8Zn2nQ.js} +2 -2
  447. package/server/{tracker-utils-tnxxqROg.js → tracker-utils-L0FKtjq2.js} +3 -3
  448. package/server/{traefik-connect-m73vGebA.js → traefik-connect-bNX6jKkb.js} +1 -1
  449. package/server/{tunnel-B2vxjx_b.js → tunnel-BAm1XgjG.js} +3 -3
  450. package/server/{tunnel-Cgj-IGIl.js → tunnel-CjSnHdTc.js} +1 -1
  451. package/server/{types-BBNjPcqU.js → types-q67TYYg5.js} +1 -1
  452. package/server/uat-promote-verification-CKB9ZrKC.js +92 -0
  453. package/server/uat-train-Cu-4nvbf.js +2 -0
  454. package/server/uat-train-D5UjcyAa.js +0 -0
  455. package/server/validate-Cxsx5Uz1.js +179 -0
  456. package/server/{validation-CIi6pnI2.js → validation-DEaTZafj.js} +1 -1
  457. package/server/{validation-B5JxoPUS.js → validation-VZgJxmqc.js} +4 -4
  458. package/server/{verification-artifact-C-lIHfUa.js → verification-artifact-C85cRTc_.js} +1 -1
  459. package/server/{verification-artifact-BcnIbigL.js → verification-artifact-g3yuxQDL.js} +1 -1
  460. package/server/{verification-runner-CDj4lD4t.js → verification-runner-DlZI8yhw.js} +1 -1
  461. package/server/{verification-runner-Br0S_Ous.js → verification-runner-KDZIsBj4.js} +114 -107
  462. package/server/{vtt-parser-DKpNNW5i.js → vtt-parser-Jr94BF3Y.js} +1 -1
  463. package/server/{work-agent-prompt-Yb2bd3Fq.js → work-agent-prompt-C-vuP3_J.js} +20 -9
  464. package/server/workflows-CHrx_hcW.js +2 -0
  465. package/server/{workflows-C9WmILql.js → workflows-D0oip4eV.js} +161 -78
  466. package/server/{workspace-DuUdndHe.js → workspace-BqFg__wH.js} +1 -1
  467. package/server/{workspace-BVl4rihN.js → workspace-C0fH3aek.js} +3 -3
  468. package/server/workspace-anchor-drift-B4gMRHl4.js +3 -0
  469. package/server/workspace-anchor-drift-CZKofakh.js +224 -0
  470. package/server/{workspace-config-cEGcO6UT.js → workspace-config-B123aZl-.js} +1 -1
  471. package/server/workspace-manager-CDTKjjdU.js +3 -0
  472. package/server/{workspace-manager-hLUv3ADC.js → workspace-manager-CwO-Hek7.js} +206 -116
  473. package/server/{workspace-metadata-CskwzzhL.js → workspace-metadata-CQv00QwK.js} +2 -2
  474. package/server/{workspace-metadata-DNpMixRq.js → workspace-metadata-D4M8BM4W.js} +1 -1
  475. package/server/{workspaces-hWvy9eKs.js → workspaces-j1e_6aAT.js} +736 -290
  476. package/sync-sources/dev-skills/pan-dashboard-restart/SKILL.md +34 -10
  477. package/sync-sources/hooks/linear-mcp-auth-hook +97 -0
  478. package/sync-sources/hooks/record-cost-event.js +6 -4
  479. package/sync-sources/rules/ask-user-question-self-contained.md +9 -0
  480. package/sync-sources/skills/okf/README.md +11 -3
  481. package/sync-sources/skills/okf/SKILL.md +12 -1
  482. package/sync-sources/skills/okf/docs/USAGE.md +15 -0
  483. package/sync-sources/skills/okf/references/overdeck.md +28 -0
  484. package/sync-sources/skills/pan-close/SKILL.md +5 -3
  485. package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
  486. package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
  487. package/sync-sources/skills/pan-orders/SKILL.md +33 -0
  488. package/sync-sources/skills/pan-peer-review/SKILL.md +195 -0
  489. package/sync-sources/skills/pan-reload/SKILL.md +3 -3
  490. package/sync-sources/skills/pan-restart/SKILL.md +5 -4
  491. package/sync-sources/skills/pan-review/SKILL.md +7 -1
  492. package/sync-sources/skills/pan-start/SKILL.md +4 -0
  493. package/sync-sources/skills/pan-sync-main/SKILL.md +9 -8
  494. package/sync-sources/skills/pipeline-status/SKILL.md +10 -1
  495. package/sync-sources/skills/workspace-add-repo/SKILL.md +16 -1
  496. package/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
  497. package/server/activity-logger-OEUBdfZ8.js +0 -3
  498. package/server/agent-state-Bg0lhqwj.js +0 -3
  499. package/server/agents-FlIgQ3ql.js +0 -3
  500. package/server/archive-planning-zkJb3BeM.js +0 -3
  501. package/server/cli-BsVIHwzC.js +0 -3
  502. package/server/context-layers-B3Nt58jl.js +0 -4
  503. package/server/context-layers-ZYFcWiyc.js +0 -165
  504. package/server/conversation-service-Up7FEzIC.js +0 -3
  505. package/server/deacon-DYSEJb48.js +0 -4
  506. package/server/deacon-swarm-9jRLS5Ke.js +0 -2
  507. package/server/deploy-window-CM6W1-c6.js +0 -3
  508. package/server/dist-Bd3vn0Hw.js +0 -3
  509. package/server/flywheel-DMCUzDWg.js +0 -2
  510. package/server/flywheel-DSSpWmqF.js +0 -522
  511. package/server/flywheel-DcBkQvgE.js +0 -207
  512. package/server/flywheel-merge-order-C-6zRLvM.js +0 -2
  513. package/server/flywheel-merge-order-DxbQKE1d.js +0 -244
  514. package/server/forge-B-ZWyTRm.js +0 -2
  515. package/server/forge-Ch9gCFod.js +0 -270
  516. package/server/git-utils-Dry_Ka_D.js +0 -3
  517. package/server/github-pr-lookup-BRbDW-qk.js +0 -44
  518. package/server/hume-B_DbflNM.js +0 -3
  519. package/server/inspect-agent-ch-F-5Ci.js +0 -2
  520. package/server/launcher-generator-CHVm7bGT.js +0 -379
  521. package/server/layers-DzxSTGNA.js +0 -93
  522. package/server/merge-blockers-BsFjGrQ8.js +0 -41
  523. package/server/merge-ops-DlB1IM0Y.js +0 -2
  524. package/server/merge-set-DLz0MkGT.js +0 -139
  525. package/server/merge-set-DnSYdBEp.js +0 -3
  526. package/server/merge-sync-SSv3E-pl.js +0 -3
  527. package/server/merge-verification-CSizH3HY.js +0 -124
  528. package/server/projects-9SkRpES9.js +0 -3
  529. package/server/public/assets/index-CUr1xv8w.css +0 -1
  530. package/server/public/assets/index-CsSuZQBI.js +0 -802
  531. package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +0 -1
  532. package/server/rally-njs_mJrt.js +0 -3
  533. package/server/rebuild-stack-kA7XngID.js +0 -3
  534. package/server/record-t6V-3Dcj.js +0 -3
  535. package/server/record-update-DACtKh6_.js +0 -3
  536. package/server/resume-CcKqnTvE.js +0 -3
  537. package/server/review-status-A7quS5KJ.js +0 -1454
  538. package/server/review-status-C6n6-9f_.js +0 -3
  539. package/server/settings-D0OSwos5.js +0 -2
  540. package/server/specs-nN45DG2X.js +0 -3
  541. package/server/src-U7_kTPEE.js +0 -4733
  542. package/server/stack-health-Df0YEZKa.js +0 -3
  543. package/server/supervisor-BPy-o1A8.js +0 -2
  544. package/server/token-util-DrHg8abn.js +0 -3
  545. package/server/tracker-utils-BePq_oj-.js +0 -3
  546. package/server/uat-train-CuEn0t9M.js +0 -2152
  547. package/server/uat-train-cKfM-_WW.js +0 -2
  548. package/server/workflows-D90rMOya.js +0 -2
  549. package/server/workspace-manager-ZTdJAy9M.js +0 -3
@@ -3,7 +3,10 @@
3
3
  const util = require('../core/util')
4
4
  const {
5
5
  parseCacheControlHeader,
6
+ hasInvalidCacheControlDirective,
6
7
  parseVaryHeader,
8
+ hasVaryStar,
9
+ isInvalidOrWildcardVaryHeader,
7
10
  isEtagUsable
8
11
  } = require('../util/cache')
9
12
  const { parseHttpDate } = require('../util/date.js')
@@ -26,6 +29,95 @@ const NOT_UNDERSTOOD_STATUS_CODES = [
26
29
 
27
30
  const MAX_RESPONSE_AGE = 2147483647000
28
31
 
32
+ // Retention for revalidation-only entries (zero freshness lifetime but a
33
+ // validator present); each successful revalidation re-stores the entry.
34
+ const REVALIDATION_ONLY_RETENTION = 86400000 // 24 hours
35
+
36
+ function trimOWS (value) {
37
+ return value.replace(/^[\t ]+|[\t ]+$/g, '')
38
+ }
39
+
40
+ function arrayIncludes (array, value) {
41
+ for (let i = 0; i < array.length; i++) {
42
+ if (array[i] === value) {
43
+ return true
44
+ }
45
+ }
46
+
47
+ return false
48
+ }
49
+
50
+ function appendConnectionHeaderTokens (headersToRemove, connectionHeader) {
51
+ const values = Array.isArray(connectionHeader) ? connectionHeader : [connectionHeader]
52
+
53
+ for (let i = 0; i < values.length; i++) {
54
+ const tokens = values[i].split(',')
55
+ for (let j = 0; j < tokens.length; j++) {
56
+ headersToRemove.push(trimOWS(tokens[j]).toLowerCase())
57
+ }
58
+ }
59
+ }
60
+
61
+ function getSameOriginPath (cacheKey, location) {
62
+ if (typeof location !== 'string') {
63
+ return undefined
64
+ }
65
+
66
+ let originUrl
67
+ let requestUrl
68
+ let locationUrl
69
+ try {
70
+ originUrl = new URL(cacheKey.origin)
71
+ requestUrl = new URL(cacheKey.path, originUrl)
72
+ locationUrl = new URL(location, requestUrl)
73
+ } catch {
74
+ return undefined
75
+ }
76
+
77
+ if (locationUrl.origin !== originUrl.origin) {
78
+ return undefined
79
+ }
80
+
81
+ return locationUrl.pathname + locationUrl.search
82
+ }
83
+
84
+ function deleteCachedUri (store, cacheKey, path) {
85
+ deleteCachedValue(store, {
86
+ ...cacheKey,
87
+ path
88
+ })
89
+
90
+ for (let i = 0; i < util.safeHTTPMethods.length; i++) {
91
+ const method = util.safeHTTPMethods[i]
92
+ if (method !== cacheKey.method) {
93
+ deleteCachedValue(store, {
94
+ ...cacheKey,
95
+ method,
96
+ path
97
+ })
98
+ }
99
+ }
100
+ }
101
+
102
+ function deleteLocationTargets (store, cacheKey, headerValue) {
103
+ if (headerValue === undefined) {
104
+ return
105
+ }
106
+
107
+ const values = Array.isArray(headerValue) ? headerValue : [headerValue]
108
+ for (let i = 0; i < values.length; i++) {
109
+ const path = getSameOriginPath(cacheKey, values[i])
110
+ if (path !== undefined) {
111
+ deleteCachedUri(store, cacheKey, path)
112
+ }
113
+ }
114
+ }
115
+
116
+ function invalidateUnsafeRequest (store, cacheKey, resHeaders) {
117
+ deleteCachedUri(store, cacheKey, cacheKey.path)
118
+ deleteLocationTargets(store, cacheKey, resHeaders.location)
119
+ deleteLocationTargets(store, cacheKey, resHeaders['content-location'])
120
+ }
29
121
  /**
30
122
  * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler
31
123
  *
@@ -107,28 +199,28 @@ class CacheHandler {
107
199
  const handler = this
108
200
 
109
201
  if (
110
- !util.safeHTTPMethods.includes(this.#cacheKey.method) &&
202
+ !arrayIncludes(util.safeHTTPMethods, this.#cacheKey.method) &&
111
203
  statusCode >= 200 &&
112
204
  statusCode <= 399
113
205
  ) {
114
206
  // Successful response to an unsafe method, delete it from cache
115
207
  // https://www.rfc-editor.org/rfc/rfc9111.html#name-invalidating-stored-response
116
- try {
117
- this.#store.delete(this.#cacheKey)?.catch?.(noop)
118
- } catch {
119
- // Fail silently
120
- }
208
+ invalidateUnsafeRequest(this.#store, this.#cacheKey, resHeaders)
121
209
  return downstreamOnHeaders()
122
210
  }
123
211
 
124
212
  const cacheControlHeader = resHeaders['cache-control']
125
- const heuristicallyCacheable = resHeaders['last-modified'] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode)
213
+ const heuristicallyCacheable = resHeaders['last-modified'] && arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode)
126
214
  if (
127
215
  !cacheControlHeader &&
128
216
  !resHeaders['expires'] &&
129
217
  !heuristicallyCacheable &&
130
218
  !this.#cacheByDefault
131
219
  ) {
220
+ if (statusCode === 304 && resHeaders.vary && isInvalidOrWildcardVaryHeader(resHeaders.vary)) {
221
+ deleteCachedValue(this.#store, this.#cacheKey)
222
+ }
223
+
132
224
  // Don't have anything to tell us this response is cachable and we're not
133
225
  // caching by default
134
226
  return downstreamOnHeaders()
@@ -136,31 +228,54 @@ class CacheHandler {
136
228
 
137
229
  const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}
138
230
  if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {
231
+ if (statusCode === 304 && (cacheControlHeader || revalidationResponseDisallowsCachedReuse(this.#cacheType, resHeaders, cacheControlDirectives))) {
232
+ deleteCachedValue(this.#store, this.#cacheKey)
233
+ }
234
+
139
235
  return downstreamOnHeaders()
140
236
  }
141
237
 
142
238
  const now = Date.now()
143
- const resAge = resHeaders.age ? getAge(resHeaders.age) : undefined
144
- if (resAge && resAge >= MAX_RESPONSE_AGE) {
239
+ const resAge = Object.hasOwn(resHeaders, 'age') ? getAge(resHeaders.age) : undefined
240
+ if (resAge !== undefined && resAge >= MAX_RESPONSE_AGE) {
145
241
  // Response considered stale
242
+ deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey)
243
+ return downstreamOnHeaders()
244
+ }
245
+
246
+ const resDate = Object.hasOwn(resHeaders, 'date') ? getDate(resHeaders.date) : undefined
247
+ if (resDate === null) {
248
+ deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey)
146
249
  return downstreamOnHeaders()
147
250
  }
148
251
 
149
- const resDate = typeof resHeaders.date === 'string'
150
- ? parseHttpDate(resHeaders.date)
151
- : undefined
252
+ const apparentAge = resDate ? Math.max(0, now - resDate.getTime()) : 0
253
+ const currentAge = Math.max(apparentAge, resAge ?? 0)
254
+
255
+ const hasValidator =
256
+ (typeof resHeaders.etag === 'string' && isEtagUsable(resHeaders.etag)) ||
257
+ typeof resHeaders['last-modified'] === 'string'
152
258
 
153
259
  const staleAt =
154
- determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ??
260
+ determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives, hasValidator) ??
155
261
  this.#cacheByDefault
156
- if (staleAt === undefined || (resAge && resAge > staleAt)) {
262
+ // Zero freshness lifetime but a validator: stale from the start, yet still
263
+ // storable since each reuse is preceded by a revalidation request.
264
+ // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.4
265
+ const revalidationOnly = staleAt === 0 && hasValidator
266
+ if (staleAt === undefined || (currentAge >= staleAt && !revalidationOnly)) {
267
+ if (cacheControlHeader || staleAt !== undefined) {
268
+ deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey)
269
+ }
270
+
157
271
  return downstreamOnHeaders()
158
272
  }
159
273
 
160
- const baseTime = resDate ? resDate.getTime() : now
274
+ const baseTime = now - currentAge
161
275
  const absoluteStaleAt = staleAt + baseTime
162
- if (now >= absoluteStaleAt) {
276
+ if (now >= absoluteStaleAt && !revalidationOnly) {
163
277
  // Response is already stale
278
+ deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey)
164
279
  return downstreamOnHeaders()
165
280
  }
166
281
 
@@ -173,8 +288,8 @@ class CacheHandler {
173
288
  }
174
289
  }
175
290
 
176
- const cachedAt = resAge ? now - resAge : now
177
- const deleteAt = determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, absoluteStaleAt)
291
+ const cachedAt = baseTime
292
+ const deleteAt = determineDeleteAt(baseTime, now, cacheControlDirectives, absoluteStaleAt)
178
293
  const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives)
179
294
 
180
295
  /**
@@ -204,6 +319,7 @@ class CacheHandler {
204
319
  value.statusCode = cachedValue.statusCode
205
320
  value.statusMessage = cachedValue.statusMessage
206
321
  value.etag = cachedValue.etag
322
+ value.vary = varyDirectives ?? cachedValue.vary
207
323
  value.headers = { ...cachedValue.headers, ...strippedHeaders }
208
324
 
209
325
  downstreamOnHeaders()
@@ -334,6 +450,36 @@ class CacheHandler {
334
450
  }
335
451
  }
336
452
 
453
+ /**
454
+ * @param {import('../../types/cache-interceptor.d.ts').default.CacheStore} store
455
+ * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey
456
+ */
457
+ function deleteCachedValue (store, cacheKey) {
458
+ try {
459
+ store.delete(cacheKey)?.catch?.(noop)
460
+ } catch {
461
+ // Fail silently
462
+ }
463
+ }
464
+
465
+ function deleteCachedValueIfNotModified (statusCode, store, cacheKey) {
466
+ if (statusCode === 304) {
467
+ deleteCachedValue(store, cacheKey)
468
+ }
469
+ }
470
+
471
+ /**
472
+ * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType
473
+ * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders
474
+ * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives
475
+ * @returns {boolean}
476
+ */
477
+ function revalidationResponseDisallowsCachedReuse (cacheType, resHeaders, cacheControlDirectives) {
478
+ return cacheControlDirectives['no-store'] === true ||
479
+ (cacheType === 'shared' && cacheControlDirectives.private === true) ||
480
+ (resHeaders.vary ? isInvalidOrWildcardVaryHeader(resHeaders.vary) : false)
481
+ }
482
+
337
483
  /**
338
484
  * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen
339
485
  *
@@ -345,12 +491,12 @@ class CacheHandler {
345
491
  */
346
492
  function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
347
493
  // Status code must be final and understood.
348
- if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {
494
+ if (statusCode < 200 || arrayIncludes(NOT_UNDERSTOOD_STATUS_CODES, statusCode)) {
349
495
  return false
350
496
  }
351
497
  // Responses with neither status codes that are heuristically cacheable, nor "explicit enough" caching
352
498
  // directives, are not cacheable. "Explicit enough": see https://www.rfc-editor.org/rfc/rfc9111.html#section-3
353
- if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders['expires'] &&
499
+ if (!arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode) && !resHeaders['expires'] &&
354
500
  !cacheControlDirectives.public &&
355
501
  cacheControlDirectives['max-age'] === undefined &&
356
502
  // RFC 9111: a private response directive, if the cache is not shared
@@ -369,12 +515,12 @@ function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirect
369
515
  }
370
516
 
371
517
  // https://www.rfc-editor.org/rfc/rfc9111.html#section-4.1-5
372
- if (resHeaders.vary?.includes('*')) {
518
+ if (resHeaders.vary && hasVaryStar(resHeaders.vary)) {
373
519
  return false
374
520
  }
375
521
 
376
522
  // https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen
377
- if (reqHeaders?.authorization) {
523
+ if (reqHeaders != null && Object.hasOwn(reqHeaders, 'authorization')) {
378
524
  if (
379
525
  !cacheControlDirectives.public &&
380
526
  !cacheControlDirectives['s-maxage'] &&
@@ -389,14 +535,14 @@ function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirect
389
535
 
390
536
  if (
391
537
  Array.isArray(cacheControlDirectives['no-cache']) &&
392
- cacheControlDirectives['no-cache'].includes('authorization')
538
+ arrayIncludes(cacheControlDirectives['no-cache'], 'authorization')
393
539
  ) {
394
540
  return false
395
541
  }
396
542
 
397
543
  if (
398
544
  Array.isArray(cacheControlDirectives['private']) &&
399
- cacheControlDirectives['private'].includes('authorization')
545
+ arrayIncludes(cacheControlDirectives['private'], 'authorization')
400
546
  ) {
401
547
  return false
402
548
  }
@@ -405,14 +551,51 @@ function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirect
405
551
  return true
406
552
  }
407
553
 
554
+ /**
555
+ * @param {string | string[]} dateHeader
556
+ * @returns {Date | null | undefined}
557
+ */
558
+ function getDate (dateHeader) {
559
+ let dateValue = dateHeader
560
+ if (Array.isArray(dateValue)) {
561
+ if (dateValue.length !== 1) {
562
+ return null
563
+ }
564
+
565
+ dateValue = dateValue[0]
566
+ }
567
+
568
+ if (typeof dateValue !== 'string') {
569
+ return null
570
+ }
571
+
572
+ return parseHttpDate(dateValue)
573
+ }
574
+
408
575
  /**
409
576
  * @param {string | string[]} ageHeader
410
577
  * @returns {number | undefined}
411
578
  */
412
579
  function getAge (ageHeader) {
413
- const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader)
580
+ let ageValue = ageHeader
581
+ if (Array.isArray(ageValue)) {
582
+ if (ageValue.length !== 1) {
583
+ return MAX_RESPONSE_AGE
584
+ }
414
585
 
415
- return isNaN(age) ? undefined : age * 1000
586
+ ageValue = ageValue[0]
587
+ }
588
+
589
+ if (typeof ageValue !== 'string' || !/^[\t ]*[0-9]+[\t ]*$/.test(ageValue)) {
590
+ return MAX_RESPONSE_AGE
591
+ }
592
+
593
+ const age = BigInt(ageValue.replace(/^[\t ]+|[\t ]+$/g, ''))
594
+ if (age >= BigInt(MAX_RESPONSE_AGE / 1000)) {
595
+ return MAX_RESPONSE_AGE
596
+ }
597
+
598
+ return Number(age) * 1000
416
599
  }
417
600
 
418
601
  /**
@@ -422,51 +605,80 @@ function getAge (ageHeader) {
422
605
  * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders
423
606
  * @param {Date | undefined} responseDate
424
607
  * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives
608
+ * @param {boolean} hasValidator whether the response has a validator (etag or
609
+ * last-modified) that revalidation requests can be made with
425
610
  *
426
611
  * @returns {number | undefined} time that the value is stale at in seconds or undefined if it shouldn't be cached
427
612
  */
428
- function determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) {
613
+ function determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheControlDirectives, hasValidator) {
429
614
  if (cacheType === 'shared') {
430
615
  // Prioritize s-maxage since we're a shared cache
431
616
  // s-maxage > max-age > Expire
432
617
  // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.10-3
618
+ if (hasInvalidCacheControlDirective(cacheControlDirectives, 's-maxage')) {
619
+ return 0
620
+ }
621
+
433
622
  const sMaxAge = cacheControlDirectives['s-maxage']
434
623
  if (sMaxAge !== undefined) {
435
- return sMaxAge > 0 ? sMaxAge * 1000 : undefined
624
+ if (sMaxAge > 0) {
625
+ return sMaxAge * 1000
626
+ }
627
+
628
+ // Immediately stale, but storable if we can revalidate it before reuse.
629
+ return 0
436
630
  }
437
631
  }
438
632
 
633
+ if (hasInvalidCacheControlDirective(cacheControlDirectives, 'max-age')) {
634
+ return 0
635
+ }
636
+
439
637
  const maxAge = cacheControlDirectives['max-age']
440
638
  if (maxAge !== undefined) {
441
- return maxAge > 0 ? maxAge * 1000 : undefined
639
+ if (maxAge > 0) {
640
+ return maxAge * 1000
641
+ }
642
+
643
+ // Immediately stale, but storable if we can revalidate it before reuse.
644
+ return 0
442
645
  }
443
646
 
444
- if (typeof resHeaders.expires === 'string') {
647
+ if (Object.hasOwn(resHeaders, 'expires')) {
445
648
  // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.3
649
+ if (typeof resHeaders.expires !== 'string') {
650
+ return 0
651
+ }
652
+
446
653
  const expiresDate = parseHttpDate(resHeaders.expires)
447
- if (expiresDate) {
448
- if (now >= expiresDate.getTime()) {
449
- return undefined
450
- }
654
+ if (!expiresDate) {
655
+ return 0
656
+ }
451
657
 
452
- if (responseDate) {
453
- if (responseDate >= expiresDate) {
454
- return undefined
455
- }
658
+ if (now >= expiresDate.getTime()) {
659
+ return 0
660
+ }
456
661
 
457
- if (age !== undefined && age > (expiresDate - responseDate)) {
458
- return undefined
459
- }
662
+ if (responseDate) {
663
+ if (responseDate >= expiresDate) {
664
+ return 0
460
665
  }
461
666
 
462
- return expiresDate.getTime() - now
667
+ const freshnessLifetime = expiresDate.getTime() - responseDate.getTime()
668
+ if (age !== undefined && age >= freshnessLifetime) {
669
+ return 0
670
+ }
671
+
672
+ return freshnessLifetime
463
673
  }
674
+
675
+ return expiresDate.getTime() - now
464
676
  }
465
677
 
466
678
  if (typeof resHeaders['last-modified'] === 'string') {
467
679
  // https://www.rfc-editor.org/rfc/rfc9111.html#name-calculating-heuristic-fresh
468
- const lastModified = new Date(resHeaders['last-modified'])
469
- if (isValidDate(lastModified)) {
680
+ const lastModified = parseHttpDate(resHeaders['last-modified'])
681
+ if (lastModified) {
470
682
  if (lastModified.getTime() >= now) {
471
683
  return undefined
472
684
  }
@@ -482,6 +694,12 @@ function determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheC
482
694
  return 31536000000
483
695
  }
484
696
 
697
+ if (cacheControlDirectives['no-cache'] === true && hasValidator) {
698
+ // No freshness source, but a validator lets us revalidate before reuse.
699
+ // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.4
700
+ return 0
701
+ }
702
+
485
703
  return undefined
486
704
  }
487
705
 
@@ -518,6 +736,11 @@ function determineDeleteAt (baseTime, cachedAt, cacheControlDirectives, staleAt)
518
736
  // revalidated.
519
737
  if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {
520
738
  const freshnessLifetime = staleAt - baseTime
739
+ if (freshnessLifetime <= 0) {
740
+ // Revalidation-only entry: no freshness lifetime to size the buffer on,
741
+ // so retain it for a bounded window instead.
742
+ return cachedAt + REVALIDATION_ONLY_RETENTION
743
+ }
521
744
  const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1000)
522
745
  return staleAt + freshnessLifetime + datePrecisionPadding
523
746
  }
@@ -546,14 +769,7 @@ function stripNecessaryHeaders (resHeaders, cacheControlDirectives) {
546
769
  ]
547
770
 
548
771
  if (resHeaders['connection']) {
549
- if (Array.isArray(resHeaders['connection'])) {
550
- // connection: a
551
- // connection: b
552
- headersToRemove.push(...resHeaders['connection'].map(header => header.trim()))
553
- } else {
554
- // connection: a, b
555
- headersToRemove.push(...resHeaders['connection'].split(',').map(header => header.trim()))
556
- }
772
+ appendConnectionHeaderTokens(headersToRemove, resHeaders['connection'])
557
773
  }
558
774
 
559
775
  if (Array.isArray(cacheControlDirectives['no-cache'])) {
@@ -566,7 +782,7 @@ function stripNecessaryHeaders (resHeaders, cacheControlDirectives) {
566
782
 
567
783
  let strippedHeaders
568
784
  for (const headerName of headersToRemove) {
569
- if (resHeaders[headerName]) {
785
+ if (Object.hasOwn(resHeaders, headerName)) {
570
786
  strippedHeaders ??= { ...resHeaders }
571
787
  delete strippedHeaders[headerName]
572
788
  }
@@ -575,12 +791,4 @@ function stripNecessaryHeaders (resHeaders, cacheControlDirectives) {
575
791
  return strippedHeaders ?? resHeaders
576
792
  }
577
793
 
578
- /**
579
- * @param {Date} date
580
- * @returns {boolean}
581
- */
582
- function isValidDate (date) {
583
- return date instanceof Date && Number.isFinite(date.valueOf())
584
- }
585
-
586
794
  module.exports = CacheHandler
@@ -19,7 +19,7 @@ class CacheRevalidationHandler {
19
19
  #successful = false
20
20
 
21
21
  /**
22
- * @type {((boolean, any) => void) | null}
22
+ * @type {((success: boolean, context?: any, statusCode?: number, headers?: import('../../types/header.d.ts').IncomingHttpHeaders) => void) | null}
23
23
  */
24
24
  #callback
25
25
 
@@ -36,7 +36,7 @@ class CacheRevalidationHandler {
36
36
  #allowErrorStatusCodes
37
37
 
38
38
  /**
39
- * @param {(boolean) => void} callback Function to call if the cached value is valid
39
+ * @param {(success: boolean, context?: any, statusCode?: number, headers?: import('../../types/header.d.ts').IncomingHttpHeaders) => void} callback Function to call if the cached value is valid
40
40
  * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler
41
41
  * @param {boolean} allowErrorStatusCodes
42
42
  */
@@ -71,7 +71,7 @@ class CacheRevalidationHandler {
71
71
  // https://datatracker.ietf.org/doc/html/rfc5861#section-4
72
72
  this.#successful = statusCode === 304 ||
73
73
  (this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504)
74
- this.#callback(this.#successful, this.#context)
74
+ this.#callback(this.#successful, this.#context, statusCode, headers)
75
75
  this.#callback = null
76
76
 
77
77
  if (this.#successful) {
@@ -109,6 +109,16 @@ class CacheRevalidationHandler {
109
109
  }
110
110
 
111
111
  if (this.#callback) {
112
+ // Serve the stale cached response on a connection error, per stale-if-error:
113
+ // RFC 5861 counts an unreachable origin (a would-be 5xx) as an error.
114
+ // https://datatracker.ietf.org/doc/html/rfc5861#section-4
115
+ if (this.#allowErrorStatusCodes) {
116
+ this.#successful = true
117
+ this.#callback(true, this.#context)
118
+ this.#callback = null
119
+ return
120
+ }
121
+
112
122
  this.#callback(false)
113
123
  this.#callback = null
114
124
  }
@@ -52,6 +52,8 @@ class RedirectHandler {
52
52
  throw new Error('max redirects')
53
53
  }
54
54
 
55
+ let removeContentHeaders = statusCode === 303
56
+
55
57
  // https://tools.ietf.org/html/rfc7231#section-6.4.2
56
58
  // https://fetch.spec.whatwg.org/#http-redirect-fetch
57
59
  // In case of HTTP 301 or 302 with POST, change the method to GET
@@ -62,6 +64,7 @@ class RedirectHandler {
62
64
  util.destroy(this.opts.body.on('error', noop))
63
65
  }
64
66
  this.opts.body = null
67
+ removeContentHeaders = true
65
68
  }
66
69
 
67
70
  // https://tools.ietf.org/html/rfc7231#section-6.4.4
@@ -101,9 +104,9 @@ class RedirectHandler {
101
104
  }
102
105
 
103
106
  // Remove headers referring to the original URL.
104
- // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.
107
+ // By default it is Host only. A 303 or a 301/302 POST-to-GET redirect also removes all Content-* headers.
105
108
  // https://tools.ietf.org/html/rfc7231#section-6.4
106
- this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin, this.stripHeadersOnRedirect, this.stripHeadersOnCrossOriginRedirect)
109
+ this.opts.headers = cleanRequestHeaders(this.opts.headers, removeContentHeaders, this.opts.origin !== origin, this.stripHeadersOnRedirect, this.stripHeadersOnCrossOriginRedirect)
107
110
  this.opts.path = path
108
111
  this.opts.origin = origin
109
112
  this.opts.query = null
@@ -11,7 +11,27 @@ const {
11
11
 
12
12
  function calculateRetryAfterHeader (retryAfter) {
13
13
  const retryTime = new Date(retryAfter).getTime()
14
- return isNaN(retryTime) ? 0 : retryTime - Date.now()
14
+ return isNaN(retryTime) ? null : retryTime - Date.now()
15
+ }
16
+
17
+ function validatePartialResponseContentLength (headers, range, statusCode, retryCount) {
18
+ const contentLength = headers['content-length']
19
+ if (contentLength == null) {
20
+ return
21
+ }
22
+
23
+ if (!Number.isFinite(range.start) || !Number.isFinite(range.end)) {
24
+ return
25
+ }
26
+
27
+ const length = Number(contentLength)
28
+ const expectedLength = range.end - range.start + 1
29
+ if (!Number.isFinite(length) || length !== expectedLength) {
30
+ throw new RequestRetryError('Content-Length mismatch', statusCode, {
31
+ headers,
32
+ data: { count: retryCount }
33
+ })
34
+ }
15
35
  }
16
36
 
17
37
  // A stable controller handed to the downstream handler for the lifetime of the
@@ -211,9 +231,11 @@ class RetryHandler {
211
231
  }
212
232
 
213
233
  const retryTimeout =
214
- retryAfterHeader > 0
215
- ? Math.min(retryAfterHeader, maxTimeout)
216
- : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)
234
+ retryAfterHeader === 0
235
+ ? 0
236
+ : retryAfterHeader > 0
237
+ ? Math.min(retryAfterHeader, maxTimeout)
238
+ : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)
217
239
 
218
240
  setTimeout(() => cb(null), retryTimeout)
219
241
  }
@@ -268,6 +290,8 @@ class RetryHandler {
268
290
  })
269
291
  }
270
292
 
293
+ validatePartialResponseContentLength(headers, contentRange, statusCode, this.retryCount)
294
+
271
295
  const { start, size, end = size ? size - 1 : null } = contentRange
272
296
 
273
297
  assert(this.start === start, 'content-range mismatch')
@@ -292,6 +316,8 @@ class RetryHandler {
292
316
  return
293
317
  }
294
318
 
319
+ validatePartialResponseContentLength(headers, range, statusCode, this.retryCount)
320
+
295
321
  const { start, size, end = size ? size - 1 : null } = range
296
322
  assert(
297
323
  start != null && Number.isFinite(start),