@overdeck/desktop 0.45.24 → 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 (511) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +32 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-DDCnXF58.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-BVwW4qRn.js → advancing-selfheal-De1L-Sb4.js} +6 -6
  7. package/server/{agent-gc-CHcnvonI.js → agent-gc-CBULruzm.js} +5 -5
  8. package/server/agent-state-VQk8fY9F.js +3 -0
  9. package/server/{agent-state-service-BsgWxZuB.js → agent-state-service-BlnSkRFA.js} +5 -5
  10. package/server/{agent-state-service-D5UGKIJL.js → agent-state-service-hZpxIw1E.js} +1 -1
  11. package/server/agents-BKKkxKgK.js +3 -0
  12. package/server/{agents-EbI0zCJl.js → agents-C5rWYhb6.js} +4 -4
  13. package/server/archive-planning-0FJ6Xd3b.js +2 -0
  14. package/server/{archive-planning-Du25Jtst.js → archive-planning-C0lAbNB_.js} +16 -24
  15. package/server/{artifact-index-jobs-CbEDfCDu.js → artifact-index-jobs-ug6ZxIP5.js} +2 -2
  16. package/server/{assemble-J2ZZ2C15.js → assemble-DnffNpOo.js} +2 -2
  17. package/server/{backlog-auto-trigger-2R2jog7n.js → backlog-auto-trigger-Dh-i9PQf.js} +3 -3
  18. package/server/{behavior-B3exJ42O.js → behavior-CfIg6pKp.js} +2 -2
  19. package/server/bridge-pool-patrol-CUFmjVDN.js +136 -0
  20. package/server/{briefing-freshness-D1wzUIWv.js → briefing-freshness-DHmCSLar.js} +2 -2
  21. package/server/{build-info-CZk_TITh.js → build-info-BP160gU7.js} +1 -1
  22. package/server/{build-info-Ie_D0_BT.js → build-info-CuFfxZxp.js} +5 -3
  23. package/server/{checkpoint-manager-BI1Wxoku.js → checkpoint-manager-DEWD82qK.js} +2 -2
  24. package/server/{checkpoint-manager-DwbQoqrC.js → checkpoint-manager-Dxh0FYsv.js} +1 -1
  25. package/server/checkpoint-worker.js +1 -1
  26. package/server/{checkpoints-CQB1h765.js → checkpoints-CZvbtLnr.js} +2 -2
  27. package/server/{checkpoints-BJIs5QIA.js → checkpoints-DMTgXuLG.js} +1 -1
  28. package/server/{claude-hooks-provision-8Ngo8TpT.js → claude-hooks-provision-CN-xo-do.js} +1 -1
  29. package/server/{claude-hooks-provision-D8GXF3_s.js → claude-hooks-provision-fvy4RD2b.js} +13 -2
  30. package/server/{claude-permissions-DNWEVV6z.js → claude-permissions-CN0cSCPp.js} +2 -2
  31. package/server/{claude-settings-overlay-CEdaqpWI.js → claude-settings-overlay-CJn35FHQ.js} +2 -2
  32. package/server/{claude-settings-overlay-DWy-Bb4Y.js → claude-settings-overlay-Dabi9slj.js} +1 -1
  33. package/server/cli-DmXETsw-.js +3 -0
  34. package/server/{cli-RoOx5DUf.js → cli-oCWYA1pE.js} +9 -9
  35. package/server/{cliproxy-C8a1vtTU.js → cliproxy-C8mB3KuB.js} +2 -2
  36. package/server/{cliproxy-fHfIeiGd.js → cliproxy-PGwTX_o8.js} +1 -1
  37. package/server/{close-issue-DoOifFIK.js → close-issue-D5MF5GqF.js} +5 -5
  38. package/server/{closed-issue-reaper-CktPXo8m.js → closed-issue-reaper-CJ24u0Zt.js} +1 -1
  39. package/server/{closed-issue-reaper-Bk3SU4RC.js → closed-issue-reaper-Cltx86x5.js} +37 -16
  40. package/server/{codex-GcHuUF-k.js → codex-BdEsUFWh.js} +1 -1
  41. package/server/{codex-BZXGhUVB.js → codex-Drlf5Xhf.js} +36 -7
  42. package/server/{codex-parser-CFZ1_1Jl.js → codex-parser-DpB89Vqa.js} +2 -2
  43. package/server/compaction-continuation-K2AxQX4H.js +200 -0
  44. package/server/{config-CKxYiCmX.js → config-B2IMcBxx.js} +4 -3
  45. package/server/{config-DzV30TOm.js → config-DV-grfQc.js} +1 -1
  46. package/server/{config-BZ0sHTju.js → config-Dr3pW6w6.js} +2 -2
  47. package/server/{config-yaml-DySPNmKN.js → config-yaml-CmOPzmBb.js} +268 -14
  48. package/server/{conflict-gate-BaCVrH-N.js → conflict-gate-B9cN3SBi.js} +4 -4
  49. package/server/{conflict-gate-BhAY7TUd.js → conflict-gate-Dh754uyA.js} +1 -1
  50. package/server/{context-layers-BrPmE__h.js → context-layers-D6LZo3l1.js} +2 -2
  51. package/server/{context-layers-igZ4FI4_.js → context-layers-dR5YxHYB.js} +3 -3
  52. package/server/{control-settings-BQp7_4uD.js → control-settings-C7DUehE1.js} +49 -19
  53. package/server/{conversation-compaction-CgrR8YYp.js → conversation-compaction-BoqdDXWF.js} +8 -8
  54. package/server/{conversation-compaction-eQB5CkOe.js → conversation-compaction-Dj4FAKoZ.js} +1 -1
  55. package/server/{conversation-service-DPJ71F33.js → conversation-service-5aCnq1zR.js} +8 -7
  56. package/server/conversation-service-BCxl4f8Z.js +3 -0
  57. package/server/{conversations-6AfUfbwc.js → conversations-BUpYsOZg.js} +4 -4
  58. package/server/{conversations-CAsJF9kh.js → conversations-C34dyIb9.js} +1 -1
  59. package/server/{cost-B2ddP6wq.js → cost-Bgcub5kW.js} +12 -2
  60. package/server/{cost-R-m6Yi-W.js → cost-CvxRrucd.js} +3 -3
  61. package/server/{cost-sync-BsN6ER0n.js → cost-sync-Dv3LUaNW.js} +3 -3
  62. package/server/{dag-B1ucnjDU.js → dag-ombYYt4s.js} +2 -2
  63. package/server/{dangerous-git-ops-BXqeWVSf.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-CU_cAYSR.js → deacon-hi9KLPLT.js} +2933 -2704
  67. package/server/{deacon-nudge-log-6wVqAaqz.js → deacon-nudge-log-BNBebzeL.js} +3 -3
  68. package/server/deacon-pending-lifecycle-Cpk0k7Hi.js +33 -0
  69. package/server/{deacon-swarm-BXZZ1Z2-.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-AiFoP8dw.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-C3F-tihF.js → deploy-window-rpqpWqHA.js} +40 -16
  79. package/server/{dev-supervisor-bcOWqdQE.js → dev-supervisor-CC46Ig8q.js} +2 -2
  80. package/server/{devcontainer-renderer-_d6XhyND.js → devcontainer-renderer-68CSCRnu.js} +3 -3
  81. package/server/{dist-Cb_0uvpS.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-DcMTFTUC.js → docker-Dam7mbIB.js} +2 -2
  86. package/server/{dod-C6n9RV3G.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-DNi-ono3.js → ensure-devcontainer-B057YA81.js} +4 -4
  90. package/server/{ensure-devcontainer-BZgOhRo7.js → ensure-devcontainer-C98V8yW-.js} +1 -1
  91. package/server/{esm-shims-OSHAYaS1.js → esm-shims-Br9BPdkR.js} +1 -1
  92. package/server/{event-store-EV2cMiXj.js → event-store-ELqkVOn0.js} +1 -1
  93. package/server/{event-store-CQL6NeqB.js → event-store-zY5MJHgF.js} +23 -4
  94. package/server/{events-BTdrdEq8.js → events-D6pyqhzM.js} +1 -1
  95. package/server/{events-DTfAe4My.js → events-D9PR1IC0.js} +3 -3
  96. package/server/{factory-CFibJuaw.js → factory-CRoOpGsF.js} +5 -5
  97. package/server/{feature-registry-population-DKZFMbFt.js → feature-registry-population--YUXU999.js} +4 -4
  98. package/server/{feature-registry-storage-BdPuLcBX.js → feature-registry-storage-BORBTo0y.js} +2 -2
  99. package/server/{features-ez2271oH.js → features--nFkJY8v.js} +2 -2
  100. package/server/{feedback-target-CoFDHiM8.js → feedback-target-C0ZzyHvU.js} +1 -1
  101. package/server/{feedback-target-7mqqwrX6.js → feedback-target-Dt9BsapX.js} +8 -8
  102. package/server/{feedback-writer-CY5L1lB7.js → feedback-writer-BG0RUZiu.js} +5 -5
  103. package/server/{feedback-writer-D3a22RCd.js → feedback-writer-D1fm-5Z8.js} +1 -1
  104. package/server/{flywheel-SVF02Jpq.js → flywheel-BekukH4i.js} +1 -1
  105. package/server/{flywheel-DHrgCphM.js → flywheel-BiT3odRb.js} +23 -15
  106. package/server/{flywheel-DzGtWnJ1.js → flywheel-CLVB55Be.js} +16 -15
  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-kNxT0bZC.js → from-D_4_dk7i.js} +1 -1
  112. package/server/{fts-db-CE46vDkZ.js → fts-db-BeOomFa-.js} +2 -2
  113. package/server/{fts-operations-CqY6zl-i.js → fts-operations-BdewJ_g9.js} +2 -2
  114. package/server/git-utils-CI6cwyyC.js +3 -0
  115. package/server/{git-utils-CRw2zLPC.js → git-utils-ameCgDdy.js} +30 -5
  116. package/server/{github-app-C3QrAUd0.js → github-app-CQ1Lo6LA.js} +3 -3
  117. package/server/{github-app-ClZ2lk8D.js → github-app-DtAsvwzK.js} +1 -1
  118. package/server/{github-client-BnIsSrEN.js → github-client-BfyDxuRN.js} +2 -2
  119. package/server/{github-client-DfQYVUaw.js → github-client-Cj0yl_07.js} +1 -1
  120. package/server/github-pr-lookup-BDq6Wznz.js +58 -0
  121. package/server/{harness-binary-DPUi-Pv8.js → harness-binary-DqkftwTb.js} +2 -2
  122. package/server/{harness-resolve-3lNZkyT4.js → harness-resolve-CqMqM1Mb.js} +4 -4
  123. package/server/{health-events-BBcTYQKU.js → health-events-CazRxJUS.js} +2 -2
  124. package/server/{health-events-BDOHby5Q.js → health-events-_xfTaOUs.js} +1 -1
  125. package/server/{hooks-CKZgXlJb.js → hooks-BO3QT1sn.js} +2 -2
  126. package/server/{hooks-DPVX1rwQ.js → hooks-BnJsxlSq.js} +1 -1
  127. package/server/{hume-Cz8igP9E.js → hume-CDYJxqx-.js} +2 -2
  128. package/server/hume-Dq--7rOQ.js +3 -0
  129. package/server/{idle-stack-reaper-CuLF0j2H.js → idle-stack-reaper-BYqERdkE.js} +1 -1
  130. package/server/{idle-stack-reaper-DDIRwxUY.js → idle-stack-reaper-CnGx_PO_.js} +99 -6
  131. package/server/in-flight-guard-Bq3epG58.js +45 -0
  132. package/server/{infra-BEqFxlJc.js → infra-BjuxvjdS.js} +70 -5
  133. package/server/{injection-CPUIqNhI.js → injection-DZxlV2al.js} +1 -1
  134. package/server/{injection-C8aiVJrF.js → injection-UCf8EsjX.js} +7 -7
  135. package/server/{inspect-agent-BLuJ1AkT.js → inspect-agent-6kylZnrm.js} +26 -25
  136. package/server/inspect-agent-BVwDrVrz.js +2 -0
  137. package/server/{internal-token-s0-oKybJ.js → internal-token-DvMTQSOS.js} +2 -2
  138. package/server/{internal-token-BrcU6qfe.js → internal-token-M9omeXM1.js} +1 -1
  139. package/server/{io-C9kF1wtJ.js → io-VHvc0Ssp.js} +43 -26
  140. package/server/{issue-closed-CDJk4pIp.js → issue-closed-B6KJkmHZ.js} +7 -7
  141. package/server/{issue-lifecycle-B8sZHVHh.js → issue-lifecycle-9gk3fnXN.js} +1 -1
  142. package/server/{issue-lifecycle-ojZAzDBP.js → issue-lifecycle-C4Zj0WmE.js} +34 -28
  143. package/server/{issue-service-singleton-Yx5DdmVJ.js → issue-service-singleton-DmCh7EHj.js} +10 -10
  144. package/server/{issue-service-singleton-BvJ09SaR.js → issue-service-singleton-PMx8F1jr.js} +1 -1
  145. package/server/{issues-BMmP_77e.js → issues-CgnQ1OGQ.js} +2 -2
  146. package/server/{jsonl-parser-BXSlHwEh.js → jsonl-parser-DJOH_O-w.js} +5 -4
  147. package/server/{label-cleanup-B0UJwnv5.js → label-cleanup-Dv7AV_R1.js} +3 -3
  148. package/server/{label-reconciler-B4iOAjlC.js → label-reconciler--F85rufp.js} +4 -4
  149. package/server/{lifecycle-yPd___5E.js → lifecycle-CTdOWYMi.js} +2 -2
  150. package/server/{lifecycle-xmBfK2GJ.js → lifecycle-DDN8ApVY.js} +6 -7
  151. package/server/{lifecycle-io-BREGpnLk.js → lifecycle-io-D-lGdzK3.js} +5 -5
  152. package/server/{lifecycle-io-DPo7x11I.js → lifecycle-io-D_zTLvP1.js} +1 -1
  153. package/server/{linear-client-BsuUvkdA.js → linear-client-BQU36QqE.js} +2 -2
  154. package/server/{linear-client-CTskEeT_.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-CefQNAnq.js → merge-Bpx4jjht.js} +13 -11
  159. package/server/{merge-agent-4WOWlSYA.js → merge-agent-DdMVSV2Y.js} +233 -83
  160. package/server/{merge-agent-CKkgIBPB.js → merge-agent-DrXa1CpW.js} +1 -1
  161. package/server/{merge-batch-ClFn2T-y.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-B1DiziGU.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-BfaTyXsw.js → merge-rebase-xLnMlw5h.js} +3 -3
  168. package/server/{merge-set-DJ8-UErs.js → merge-set-DH7ot3yz.js} +11 -5
  169. package/server/merge-set-DzsOTBg5.js +3 -0
  170. package/server/{merge-sync-VPV28g0g.js → merge-sync-CQ-LgZ1_.js} +406 -153
  171. package/server/merge-sync-Ca7F5JnQ.js +3 -0
  172. package/server/{merge-train-CHopycP0.js → merge-train-DTEMyIu4.js} +18 -8
  173. package/server/{merge-train-deps-D1cOZzy2.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-duPAfSBw.js → multipart-parser-IMSBfePV.js} +2 -2
  178. package/server/{no-resume-mode-Nw29vaFb.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/lib/cache/memory-cache-store.js +54 -9
  270. package/server/node_modules/undici/lib/cache/sqlite-cache-store.js +7 -1
  271. package/server/node_modules/undici/lib/core/request.js +12 -1
  272. package/server/node_modules/undici/lib/dispatcher/client-h1.js +11 -2
  273. package/server/node_modules/undici/lib/global.js +36 -16
  274. package/server/node_modules/undici/lib/handler/cache-handler.js +236 -116
  275. package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +3 -3
  276. package/server/node_modules/undici/lib/handler/retry-handler.js +24 -0
  277. package/server/node_modules/undici/lib/interceptor/cache.js +152 -62
  278. package/server/node_modules/undici/lib/interceptor/decompress.js +5 -2
  279. package/server/node_modules/undici/lib/util/cache.js +328 -66
  280. package/server/node_modules/undici/lib/util/date.js +23 -6
  281. package/server/node_modules/undici/lib/web/cookies/util.js +78 -8
  282. package/server/node_modules/undici/package.json +1 -1
  283. package/server/{orphan-proposed-reconciler-CTSGcK8p.js → orphan-proposed-reconciler-CWmOdM9-.js} +1 -1
  284. package/server/{orphan-proposed-reconciler-BvKkWMJQ.js → orphan-proposed-reconciler-Dg6U4ADZ.js} +24 -15
  285. package/server/package-lock.json +28 -28
  286. package/server/package.json +1 -1
  287. package/server/{pan-dir-B0c3w0Ya.js → pan-dir-ubraCiUg.js} +24 -10
  288. package/server/{paths-D-xWGHdh.js → paths-cXmOwSbh.js} +2 -2
  289. package/server/pending-lifecycle-claim-DEteYdS9.js +110 -0
  290. package/server/{pickup-DUCLWrJY.js → pickup-D8xtG1J2.js} +1 -1
  291. package/server/pipeline-membership-BGSvkT2M.js +3 -0
  292. package/server/pipeline-membership-CrAPLYtf.js +57 -0
  293. package/server/{pipeline-membership-mY3GprlK.js → pipeline-membership-gather-CET40frr.js} +177 -109
  294. package/server/pipeline-membership-gather-DTfcgxLl.js +3 -0
  295. package/server/{pipeline-notifier-BXkJzDC4.js → pipeline-notifier-BuQ0e4hF.js} +2 -2
  296. package/server/{pipeline-notifier-BJr8gQX6.js → pipeline-notifier-ImNXknf0.js} +1 -1
  297. package/server/post-merge-lifecycle-worker-DbO10pum.js +50 -0
  298. package/server/{project-pipelines-C0MWUeCU.js → project-pipelines-Bim6bThI.js} +2 -2
  299. package/server/{project-repos-B6GycDh9.js → project-repos-C0nuoBGv.js} +7 -3
  300. package/server/project-repos-CRE6Ykow.js +3 -0
  301. package/server/projects-B03Wr-xc.js +3 -0
  302. package/server/{prompts-DxzFXuLl.js → prompts-BEx08AIu.js} +2 -2
  303. package/server/{providers-u4Ga0jOr.js → providers-D7IluJe0.js} +1 -1
  304. package/server/{providers-qQAwGQDW.js → providers-evXhiQeg.js} +7 -7
  305. package/server/public/assets/{chunk-BO2N2NFS-BamJdinX.js → chunk-BO2N2NFS-D1s4-Sqp.js} +4 -4
  306. package/server/public/assets/{diagram-OG6HWLK6-DfOB8-w4.js → diagram-OG6HWLK6-1gdMoSF7.js} +1 -1
  307. package/server/public/assets/{dist-D7zYSEA6.js → dist-CxAOHbil.js} +1 -1
  308. package/server/public/assets/{dist-ByIuzMQW.js → dist-DqDRYW6P.js} +3 -3
  309. package/server/public/assets/{ganttDiagram-6RSMTGT7-EdmRyXL3.js → ganttDiagram-6RSMTGT7-BYex-Ec7.js} +1 -1
  310. package/server/public/assets/{highlighted-body-OFNGDK62-MerOfTX8.js → highlighted-body-OFNGDK62-DlVkiG0S.js} +1 -1
  311. package/server/public/assets/index-Cc7cnFC4.css +1 -0
  312. package/server/public/assets/index-K0hAYCgV.js +807 -0
  313. package/server/public/assets/{linear-BBbArIcK.js → linear-B4cuEFmO.js} +1 -1
  314. package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +1 -0
  315. package/server/public/assets/{pieDiagram-4H26LBE5-BKIddiJN.js → pieDiagram-4H26LBE5-CBHNBIJQ.js} +1 -1
  316. package/server/public/assets/{prod-B8vYiu52.js → prod-CN2nHBvX.js} +4 -4
  317. package/server/public/assets/{quadrantDiagram-W4KKPZXB-D6RtoULk.js → quadrantDiagram-W4KKPZXB-Bom87VOQ.js} +1 -1
  318. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CLrCedZX.js → sankeyDiagram-5OEKKPKP-UrBeyLxk.js} +1 -1
  319. package/server/public/assets/{xychartDiagram-2RQKCTM6-hznR8DYl.js → xychartDiagram-2RQKCTM6-DhkbrIxR.js} +1 -1
  320. package/server/public/index.html +2 -2
  321. package/server/{pull-requests-7N8WKseP.js → pull-requests-Cv7LxzUN.js} +1 -1
  322. package/server/{pull-requests-_lHueOHW.js → pull-requests-DHWiKxo7.js} +19 -10
  323. package/server/{queries-CjNIf-Ub.js → queries-DHJm7bTd.js} +631 -110
  324. package/server/{rally-CyWT_lNO.js → rally-B71M9f4o.js} +3 -3
  325. package/server/rally-YDjU513q.js +3 -0
  326. package/server/{rally-api-ClOSd-Tt.js → rally-api-D5uXN08-.js} +1 -1
  327. package/server/{rally-api-C8e_1JRi.js → rally-api-Dkqmok65.js} +2 -2
  328. package/server/{rally-client-lc-nokqr.js → rally-client-Bfqm6XI4.js} +4 -4
  329. package/server/{rally-client-sgtVqzNU.js → rally-client-CxsA6ExK.js} +1 -1
  330. package/server/{reap-terminal-sessions-7KeHv1R1.js → reap-terminal-sessions-BQ23nriz.js} +2 -2
  331. package/server/{reap-terminal-sessions-BtHPo6Xc.js → reap-terminal-sessions-CvmwaqKv.js} +2 -2
  332. package/server/{rebuild-stack-lwtsW0GO.js → rebuild-stack-0EEYReVZ.js} +16 -7
  333. package/server/{rebuild-stack-CFvcBHsS.js → rebuild-stack-qeRqHZxH.js} +2 -2
  334. package/server/{reconstruct-cache-C3Ui7ojV.js → reconstruct-cache-BbYFsqLa.js} +7 -6
  335. package/server/record-CtroO946.js +3 -0
  336. package/server/record-update-DH6dLJID.js +3 -0
  337. package/server/{record-update-dE1Aw83j.js → record-update-Z0QCxmMp.js} +124 -34
  338. package/server/{recovery-trip-BvRWfUXM.js → recovery-trip-eJe26h-f.js} +2 -2
  339. package/server/{release-engine-Cx48W7z8.js → release-engine-lPUp-MTd.js} +5 -5
  340. package/server/{release-set-CQfuN9-v.js → release-set-BwGeyZKX.js} +3 -3
  341. package/server/{remote-C_2hasl7.js → remote-BCd02Es1.js} +3 -3
  342. package/server/{remote-ChgimyYa.js → remote-CVGUhXMV.js} +3 -3
  343. package/server/{remote-agents-CA3Ihlxj.js → remote-agents-C1bssi41.js} +2 -2
  344. package/server/{remote-agents-By1ige5O.js → remote-agents-C_VxssLU.js} +300 -46
  345. package/server/{remote-completion-fVe9e_3u.js → remote-completion-DAB0P706.js} +12 -12
  346. package/server/resume-u9byntrq.js +3 -0
  347. package/server/{review-agent-DNboMyW4.js → review-agent-CD4RCI0Y.js} +1 -1
  348. package/server/{review-agent-CIGOQYBD.js → review-agent-CHhI66UP.js} +60 -47
  349. package/server/{review-artifacts-nRDPuMxd.js → review-artifacts-DSMRIfuJ.js} +7 -6
  350. package/server/{review-context-2uj-YQ8J.js → review-context-oFuBbiEE.js} +8 -8
  351. package/server/{in-flight-guard-CAAkqPLu.js → review-convoy-liveness-CpzrcJ5F.js} +3 -44
  352. package/server/review-status-BZH8h-6W.js +3 -0
  353. package/server/review-status-emit-CUExtHd5.js +50 -0
  354. package/server/{review-status-enrichment-Dci-ZwEt.js → review-status-enrichment-QV_hQkgS.js} +4 -4
  355. package/server/{review-status-source-CxuEjLGg.js → review-status-source-CpvJnvnQ.js} +24 -3
  356. package/server/review-status-source-ylw5QZUR.js +3 -0
  357. package/server/{review-status-sync-BTOpxtTC.js → review-status-sync-483sujRo.js} +2 -2
  358. package/server/{review-status-sync-DSDK3OMy.js → review-status-sync-NaWvI9Xf.js} +1 -1
  359. package/server/review-status-yljtTd-q.js +7521 -0
  360. package/server/{review-verdict-feedback-CTd4QMBu.js → review-verdict-feedback-BPDn4li_.js} +1 -1
  361. package/server/{review-verdict-feedback-CCjVA7Uk.js → review-verdict-feedback-CELeUinh.js} +48 -8
  362. package/server/{rollup-FGsKki9R.js → rollup-DTNvelz9.js} +8 -8
  363. package/server/{rollup-BKQC7jp4.js → rollup-DYZfq1c4.js} +1 -1
  364. package/server/{scanner-CnqEZeDy.js → scanner-CV35oSn4.js} +8 -7
  365. package/server/{sequence-io-D909zgeH.js → sequence-io-DF_8iuhV.js} +4 -4
  366. package/server/{sequencer-agent-CzkcK6P5.js → sequencer-agent-B2WeCtGi.js} +5 -5
  367. package/server/server.js +1952 -578
  368. package/server/{service-CLeAoU6G.js → service-Br9rpBNA.js} +81 -64
  369. package/server/{session-fork-CHI1XvL9.js → session-fork-D0LY152N.js} +2 -2
  370. package/server/{session-history-BT3IvqhC.js → session-history-BUyK29eq.js} +4 -4
  371. package/server/{settings-BTMvpNFU.js → settings-Bse1Pdcj.js} +3 -3
  372. package/server/settings-CdvIF84R.js +2 -0
  373. package/server/{settings-C0zgxOGf.js → settings-CvVGqNEs.js} +3 -2
  374. package/server/{shadow-engineering-BJfgm-hX.js → shadow-engineering-BWLa8ODz.js} +2 -2
  375. package/server/{shadow-state-7a-524T8.js → shadow-state-B4fpKxOO.js} +2 -2
  376. package/server/{shadow-state-DnDyjujH.js → shadow-state-FV6PHfEW.js} +1 -1
  377. package/server/{shadow-utils-Db3oroFG.js → shadow-utils-D7asqxOZ.js} +2 -2
  378. package/server/{ship-log-D9MlVzYU.js → ship-log-xplJ8t75.js} +1 -1
  379. package/server/{smart-compaction-CV2ukKND.js → smart-compaction-CPp2Ykf6.js} +1 -1
  380. package/server/{smart-compaction-KCYScAU1.js → smart-compaction-D3U_79f-.js} +8 -7
  381. package/server/{spawn-planning-session-qUC2VWu3.js → spawn-planning-session-1nFi3gfk.js} +1 -1
  382. package/server/{spawn-planning-session-DKpdFyOC.js → spawn-planning-session-DGfZ5B8D.js} +17 -17
  383. package/server/{specialist-completion-Ky9wCDpb.js → specialist-completion-Br48eiDP.js} +1 -1
  384. package/server/{specialist-context-Bn3dCGS2.js → specialist-context-cVbGnTa3.js} +5 -5
  385. package/server/{specialist-handoff-logger-CMEwYxa2.js → specialist-handoff-logger-DK-GTz4s.js} +2 -2
  386. package/server/{specialist-logs-C5p8G7tx.js → specialist-logs-Cl5-hqT8.js} +3 -3
  387. package/server/{specialists-CC4r-c2s.js → specialists-CNfYO3G2.js} +975 -227
  388. package/server/{specialists-jiuuyVkp.js → specialists-Cicieuzu.js} +18 -18
  389. package/server/{specialists-CShuVGWT.js → specialists-JHsdU3pA.js} +1 -1
  390. package/server/{specialists-DM6bWjsi.js → specialists-Tdezg_6N.js} +1 -1
  391. package/server/specs-Bt7WJDoC.js +3 -0
  392. package/server/src-CRmCHlma.js +11408 -0
  393. package/server/{src-CXmtj0im.js → src-Ck028hjO.js} +6 -6
  394. package/server/{src-CdmnTM2m.js → src-UWcGe0Ix.js} +3 -3
  395. package/server/{stack-health-Bn3o8FBX.js → stack-health-CJLMrLBl.js} +1 -1
  396. package/server/{stack-health-DxSdG9cW.js → stack-health-DqSqx0zv.js} +7 -5
  397. package/server/{stale-task-claims-KJKxxiiQ.js → stale-task-claims-CYFOUNlT.js} +4 -4
  398. package/server/{staleness-CT34nwr9.js → staleness-BQ-0gMYK.js} +1 -1
  399. package/server/{staleness-DPm7ClwA.js → staleness-D47CUJok.js} +1 -1
  400. package/server/{state-home-Cn_Qu8IX.js → state-home-BYV7qZTW.js} +2 -2
  401. package/server/{state-mapping-BL_-3Yt8.js → state-mapping-BVldLhBf.js} +1 -1
  402. package/server/{state-migrate-BGg2ZaOt.js → state-migrate-CvvBtS0Y.js} +4 -4
  403. package/server/{stuck-remediation-s9_2qfi6.js → stuck-remediation-Wt0UVvu1.js} +1 -1
  404. package/server/{stuck-remediation-DYuPRYYw.js → stuck-remediation-mkLC6G_t.js} +79 -22
  405. package/server/{substrate-bug-weights-service-B-FwCs5V.js → substrate-bug-weights-service-XfLAKnmK.js} +3 -3
  406. package/server/{summary-fork-DpcxN9tf.js → summary-fork-CD7GOts0.js} +2 -2
  407. package/server/{summary-fork-D1RAk9rJ.js → summary-fork-xiXBnWG9.js} +8 -8
  408. package/server/supervisor/{injection-budget-Csw5tqfJ.js → injection-budget-B5SbvDx2.js} +1 -1
  409. package/server/supervisor/{paths-DehGY2Fj.js → paths-K3noE4N_.js} +1 -1
  410. package/server/supervisor/pty-supervisor.js +49 -3
  411. package/server/supervisor/{pty-token-x-ea28Us.js → pty-token-B7lp0ElT.js} +2 -2
  412. package/server/{supervisor-wM4ooB5O.js → supervisor-DL788vos.js} +3 -3
  413. package/server/supervisor-UWiQNK-y.js +2 -0
  414. package/server/{swarm-readiness-DlP_UjHq.js → swarm-readiness-BV14DF5N.js} +3 -3
  415. package/server/{system-prerequisites-DUDj1YHf.js → system-prerequisites-pdWG6ZQs.js} +2 -2
  416. package/server/{teardown-workspace-DeTTImn-.js → teardown-workspace-l2F4_zim.js} +15 -16
  417. package/server/{test-agent-queue-MbxX5vqq.js → test-agent-queue-qakFIIGz.js} +6 -6
  418. package/server/{test-verdict-bWYBtqBg.js → test-verdict-BJYDggMm.js} +1 -1
  419. package/server/{test-verdict-gscuksPv.js → test-verdict-Gw-btEfb.js} +1 -1
  420. package/server/{tldr-daemon-BYFkts95.js → tldr-daemon-BKOYB616.js} +1 -1
  421. package/server/{tldr-daemon-C-69c3OI.js → tldr-daemon-CBaWkV9k.js} +2 -2
  422. package/server/{tmux-R7N7y-Mh.js → tmux-B1Wbxz5o.js} +3 -3
  423. package/server/{tmux-B6z7h_vZ.js → tmux-DQ6jB76i.js} +1 -1
  424. package/server/{launcher-generator-BBWG_SiS.js → tmux-dedup-DbN6MGzM.js} +428 -9
  425. package/server/{token-BK6t8BIT.js → token-Cxbk023d.js} +2 -2
  426. package/server/{token-util-DxXu-vd1.js → token-util-CLq2MmQt.js} +1 -1
  427. package/server/token-util-zlz9U0ki.js +3 -0
  428. package/server/{tracker-config-G6latr8C.js → tracker-config-DZ8Zn2nQ.js} +2 -2
  429. package/server/{tracker-utils-DHv5pSDT.js → tracker-utils-L0FKtjq2.js} +3 -3
  430. package/server/{traefik-connect-Df2uXPsQ.js → traefik-connect-bNX6jKkb.js} +1 -1
  431. package/server/{tunnel-CDVKJpRv.js → tunnel-BAm1XgjG.js} +3 -3
  432. package/server/{tunnel-DGdUkGoZ.js → tunnel-CjSnHdTc.js} +1 -1
  433. package/server/{types-5M0lupud.js → types-q67TYYg5.js} +1 -1
  434. package/server/uat-promote-verification-CKB9ZrKC.js +92 -0
  435. package/server/uat-train-Cu-4nvbf.js +2 -0
  436. package/server/uat-train-D5UjcyAa.js +0 -0
  437. package/server/{validate-IfDGkaVR.js → validate-Cxsx5Uz1.js} +8 -6
  438. package/server/{validation-CC9OPqJZ.js → validation-DEaTZafj.js} +1 -1
  439. package/server/{validation-Dw1pzDzr.js → validation-VZgJxmqc.js} +4 -4
  440. package/server/{verification-artifact-B3itKTxu.js → verification-artifact-C85cRTc_.js} +1 -1
  441. package/server/{verification-artifact-TVFSz_q1.js → verification-artifact-g3yuxQDL.js} +1 -1
  442. package/server/{verification-runner-BW4HOKAz.js → verification-runner-DlZI8yhw.js} +1 -1
  443. package/server/{verification-runner-CkgX6EtI.js → verification-runner-KDZIsBj4.js} +40 -18
  444. package/server/{vtt-parser-DYPbKcIJ.js → vtt-parser-Jr94BF3Y.js} +1 -1
  445. package/server/{work-agent-prompt-Du8Vh2aJ.js → work-agent-prompt-C-vuP3_J.js} +20 -9
  446. package/server/workflows-CHrx_hcW.js +2 -0
  447. package/server/{workflows-mbQzh6mQ.js → workflows-D0oip4eV.js} +161 -78
  448. package/server/{workspace--8tnhDI0.js → workspace-BqFg__wH.js} +1 -1
  449. package/server/{workspace-BPUws1-_.js → workspace-C0fH3aek.js} +3 -3
  450. package/server/workspace-anchor-drift-B4gMRHl4.js +3 -0
  451. package/server/workspace-anchor-drift-CZKofakh.js +224 -0
  452. package/server/{workspace-config-CIVWZOQr.js → workspace-config-B123aZl-.js} +1 -1
  453. package/server/workspace-manager-CDTKjjdU.js +3 -0
  454. package/server/{workspace-manager-CBhNdzE4.js → workspace-manager-CwO-Hek7.js} +156 -117
  455. package/server/{workspace-metadata-_WygnyoX.js → workspace-metadata-CQv00QwK.js} +2 -2
  456. package/server/{workspace-metadata-BzHnwwX4.js → workspace-metadata-D4M8BM4W.js} +1 -1
  457. package/server/{workspaces-Do_9J0LQ.js → workspaces-j1e_6aAT.js} +719 -292
  458. package/sync-sources/dev-skills/pan-dashboard-restart/SKILL.md +34 -10
  459. package/sync-sources/hooks/linear-mcp-auth-hook +97 -0
  460. package/sync-sources/rules/ask-user-question-self-contained.md +9 -0
  461. package/sync-sources/skills/pan-close/SKILL.md +5 -3
  462. package/sync-sources/skills/pan-peer-review/SKILL.md +195 -0
  463. package/sync-sources/skills/pan-reload/SKILL.md +3 -3
  464. package/sync-sources/skills/pan-restart/SKILL.md +5 -4
  465. package/sync-sources/skills/pan-review/SKILL.md +7 -1
  466. package/sync-sources/skills/pan-sync-main/SKILL.md +9 -8
  467. package/sync-sources/skills/pipeline-status/SKILL.md +10 -1
  468. package/sync-sources/skills/workspace-add-repo/SKILL.md +16 -1
  469. package/server/activity-logger-OEUBdfZ8.js +0 -3
  470. package/server/agent-state-Bc3tzUC8.js +0 -3
  471. package/server/agents-wi9NWzs2.js +0 -3
  472. package/server/archive-planning-BZDgzoEj.js +0 -3
  473. package/server/cli-B86rejVV.js +0 -3
  474. package/server/conversation-service-BLd3MYsG.js +0 -3
  475. package/server/deacon-kiQrb4ZT.js +0 -4
  476. package/server/deacon-swarm-C-GwfjJy.js +0 -2
  477. package/server/deploy-window-DkZraDyj.js +0 -3
  478. package/server/dist-Bzy0y69j.js +0 -3
  479. package/server/flywheel-merge-order-UU0tiUld.js +0 -245
  480. package/server/flywheel-merge-order-UUcsCDb6.js +0 -2
  481. package/server/forge-CNFnyqps.js +0 -270
  482. package/server/forge-DXnS_YFH.js +0 -2
  483. package/server/git-utils-D0_yhCgF.js +0 -3
  484. package/server/github-pr-lookup-D16NGsSO.js +0 -44
  485. package/server/hume-ccTf4wTX.js +0 -3
  486. package/server/inspect-agent-Brtz0URj.js +0 -2
  487. package/server/merge-ops-CR44oU9-.js +0 -2
  488. package/server/merge-set-bUqbm3yc.js +0 -3
  489. package/server/merge-sync-BJYeOODr.js +0 -3
  490. package/server/merge-verification-BkaOqPsw.js +0 -124
  491. package/server/project-repos-DXKQsc_m.js +0 -3
  492. package/server/projects-vjjcmiN8.js +0 -3
  493. package/server/public/assets/index-CWeMerGO.js +0 -804
  494. package/server/public/assets/index-CenuJ3Cw.css +0 -1
  495. package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +0 -1
  496. package/server/rally-zhhtXuDP.js +0 -3
  497. package/server/record-CN0pj4_5.js +0 -3
  498. package/server/record-update-bLJxAXH4.js +0 -3
  499. package/server/resume-BFv1PGpA.js +0 -3
  500. package/server/review-status-btEYlaxA.js +0 -3
  501. package/server/review-status-kZj_KyCk.js +0 -1470
  502. package/server/settings-66A6uvIA.js +0 -2
  503. package/server/specs-C8Wsn2XO.js +0 -3
  504. package/server/src-DtcUOZCq.js +0 -4826
  505. package/server/supervisor-FTJAIsAK.js +0 -2
  506. package/server/token-util-DuPuNriz.js +0 -3
  507. package/server/tracker-utils-B4ylXZQK.js +0 -3
  508. package/server/uat-train-B05BWkp-.js +0 -2
  509. package/server/uat-train-DDSrSoV1.js +0 -2152
  510. package/server/workflows-BQu4RFQ-.js +0 -2
  511. package/server/workspace-manager-CWT55qeI.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')
@@ -27,9 +30,94 @@ const NOT_UNDERSTOOD_STATUS_CODES = [
27
30
  const MAX_RESPONSE_AGE = 2147483647000
28
31
 
29
32
  // Retention for revalidation-only entries (zero freshness lifetime but a
30
- // validator present); each successful revalidation re-stores the entry.
33
+ // validator present); each successful revalidation re-stores the entry.
31
34
  const REVALIDATION_ONLY_RETENTION = 86400000 // 24 hours
32
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
+ }
33
121
  /**
34
122
  * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler
35
123
  *
@@ -111,29 +199,28 @@ class CacheHandler {
111
199
  const handler = this
112
200
 
113
201
  if (
114
- !util.safeHTTPMethods.includes(this.#cacheKey.method) &&
202
+ !arrayIncludes(util.safeHTTPMethods, this.#cacheKey.method) &&
115
203
  statusCode >= 200 &&
116
204
  statusCode <= 399
117
205
  ) {
118
206
  // Successful response to an unsafe method, delete it from cache
119
207
  // https://www.rfc-editor.org/rfc/rfc9111.html#name-invalidating-stored-response
120
- try {
121
- this.#store.delete(this.#cacheKey)?.catch?.(noop)
122
- } catch {
123
- // Fail silently
124
- }
125
- this.#deleteLocationHeaderEntries(resHeaders)
208
+ invalidateUnsafeRequest(this.#store, this.#cacheKey, resHeaders)
126
209
  return downstreamOnHeaders()
127
210
  }
128
211
 
129
212
  const cacheControlHeader = resHeaders['cache-control']
130
- const heuristicallyCacheable = resHeaders['last-modified'] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode)
213
+ const heuristicallyCacheable = resHeaders['last-modified'] && arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode)
131
214
  if (
132
215
  !cacheControlHeader &&
133
216
  !resHeaders['expires'] &&
134
217
  !heuristicallyCacheable &&
135
218
  !this.#cacheByDefault
136
219
  ) {
220
+ if (statusCode === 304 && resHeaders.vary && isInvalidOrWildcardVaryHeader(resHeaders.vary)) {
221
+ deleteCachedValue(this.#store, this.#cacheKey)
222
+ }
223
+
137
224
  // Don't have anything to tell us this response is cachable and we're not
138
225
  // caching by default
139
226
  return downstreamOnHeaders()
@@ -141,19 +228,29 @@ class CacheHandler {
141
228
 
142
229
  const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}
143
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
+
144
235
  return downstreamOnHeaders()
145
236
  }
146
237
 
147
238
  const now = Date.now()
148
- const resAge = resHeaders.age ? getAge(resHeaders.age) : undefined
149
- 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) {
150
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)
151
249
  return downstreamOnHeaders()
152
250
  }
153
251
 
154
- const resDate = typeof resHeaders.date === 'string'
155
- ? parseHttpDate(resHeaders.date)
156
- : undefined
252
+ const apparentAge = resDate ? Math.max(0, now - resDate.getTime()) : 0
253
+ const currentAge = Math.max(apparentAge, resAge ?? 0)
157
254
 
158
255
  const hasValidator =
159
256
  (typeof resHeaders.etag === 'string' && isEtagUsable(resHeaders.etag)) ||
@@ -162,18 +259,23 @@ class CacheHandler {
162
259
  const staleAt =
163
260
  determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives, hasValidator) ??
164
261
  this.#cacheByDefault
165
- 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
+
166
271
  return downstreamOnHeaders()
167
272
  }
168
273
 
169
- const baseTime = resDate ? resDate.getTime() : now
274
+ const baseTime = now - currentAge
170
275
  const absoluteStaleAt = staleAt + baseTime
171
- // Zero freshness lifetime but a validator: stale from the start, yet still
172
- // storable since each reuse is preceded by a revalidation request.
173
- // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.4
174
- const revalidationOnly = staleAt === 0 && hasValidator
175
276
  if (now >= absoluteStaleAt && !revalidationOnly) {
176
277
  // Response is already stale
278
+ deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey)
177
279
  return downstreamOnHeaders()
178
280
  }
179
281
 
@@ -186,8 +288,8 @@ class CacheHandler {
186
288
  }
187
289
  }
188
290
 
189
- const cachedAt = resAge ? now - resAge : now
190
- const deleteAt = determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, absoluteStaleAt)
291
+ const cachedAt = baseTime
292
+ const deleteAt = determineDeleteAt(baseTime, now, cacheControlDirectives, absoluteStaleAt)
191
293
  const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives)
192
294
 
193
295
  /**
@@ -217,6 +319,7 @@ class CacheHandler {
217
319
  value.statusCode = cachedValue.statusCode
218
320
  value.statusMessage = cachedValue.statusMessage
219
321
  value.etag = cachedValue.etag
322
+ value.vary = varyDirectives ?? cachedValue.vary
220
323
  value.headers = { ...cachedValue.headers, ...strippedHeaders }
221
324
 
222
325
  downstreamOnHeaders()
@@ -327,58 +430,6 @@ class CacheHandler {
327
430
  }
328
431
  }
329
432
 
330
- /**
331
- * Deletes the cache entries for the URIs in the response's Location and
332
- * Content-Location headers when they share the request URI's origin
333
- * https://www.rfc-editor.org/rfc/rfc9111.html#section-4.4
334
- *
335
- * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders
336
- */
337
- #deleteLocationHeaderEntries (resHeaders) {
338
- let requestUrl
339
- try {
340
- requestUrl = new URL(this.#cacheKey.path, this.#cacheKey.origin)
341
- } catch {
342
- // Can't resolve the request URI, don't invalidate anything else
343
- return
344
- }
345
-
346
- const invalidatedPaths = new Set([this.#cacheKey.path])
347
-
348
- for (const headerName of ['location', 'content-location']) {
349
- const header = resHeaders[headerName]
350
- const value = Array.isArray(header) ? header[0] : header
351
- if (typeof value !== 'string' || value === '') {
352
- continue
353
- }
354
-
355
- let url
356
- try {
357
- url = new URL(value, requestUrl)
358
- } catch {
359
- continue
360
- }
361
-
362
- if (url.origin !== requestUrl.origin) {
363
- // Only invalidate URIs sharing the request URI's origin, invalidating
364
- // cross-origin URIs could be used for cache poisoning
365
- continue
366
- }
367
-
368
- const path = `${url.pathname}${url.search}`
369
- if (invalidatedPaths.has(path)) {
370
- continue
371
- }
372
- invalidatedPaths.add(path)
373
-
374
- try {
375
- this.#store.delete({ ...this.#cacheKey, path })?.catch?.(noop)
376
- } catch {
377
- // Fail silently
378
- }
379
- }
380
- }
381
-
382
433
  onResponseData (controller, chunk) {
383
434
  if (this.#writeStream?.write(chunk) === false) {
384
435
  controller.pause()
@@ -399,6 +450,36 @@ class CacheHandler {
399
450
  }
400
451
  }
401
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
+
402
483
  /**
403
484
  * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen
404
485
  *
@@ -410,12 +491,12 @@ class CacheHandler {
410
491
  */
411
492
  function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
412
493
  // Status code must be final and understood.
413
- if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {
494
+ if (statusCode < 200 || arrayIncludes(NOT_UNDERSTOOD_STATUS_CODES, statusCode)) {
414
495
  return false
415
496
  }
416
497
  // Responses with neither status codes that are heuristically cacheable, nor "explicit enough" caching
417
498
  // directives, are not cacheable. "Explicit enough": see https://www.rfc-editor.org/rfc/rfc9111.html#section-3
418
- if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders['expires'] &&
499
+ if (!arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode) && !resHeaders['expires'] &&
419
500
  !cacheControlDirectives.public &&
420
501
  cacheControlDirectives['max-age'] === undefined &&
421
502
  // RFC 9111: a private response directive, if the cache is not shared
@@ -434,12 +515,12 @@ function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirect
434
515
  }
435
516
 
436
517
  // https://www.rfc-editor.org/rfc/rfc9111.html#section-4.1-5
437
- if (resHeaders.vary?.includes('*')) {
518
+ if (resHeaders.vary && hasVaryStar(resHeaders.vary)) {
438
519
  return false
439
520
  }
440
521
 
441
522
  // https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen
442
- if (reqHeaders?.authorization) {
523
+ if (reqHeaders != null && Object.hasOwn(reqHeaders, 'authorization')) {
443
524
  if (
444
525
  !cacheControlDirectives.public &&
445
526
  !cacheControlDirectives['s-maxage'] &&
@@ -454,14 +535,14 @@ function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirect
454
535
 
455
536
  if (
456
537
  Array.isArray(cacheControlDirectives['no-cache']) &&
457
- cacheControlDirectives['no-cache'].includes('authorization')
538
+ arrayIncludes(cacheControlDirectives['no-cache'], 'authorization')
458
539
  ) {
459
540
  return false
460
541
  }
461
542
 
462
543
  if (
463
544
  Array.isArray(cacheControlDirectives['private']) &&
464
- cacheControlDirectives['private'].includes('authorization')
545
+ arrayIncludes(cacheControlDirectives['private'], 'authorization')
465
546
  ) {
466
547
  return false
467
548
  }
@@ -470,14 +551,51 @@ function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirect
470
551
  return true
471
552
  }
472
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
+
473
575
  /**
474
576
  * @param {string | string[]} ageHeader
475
577
  * @returns {number | undefined}
476
578
  */
477
579
  function getAge (ageHeader) {
478
- 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
+ }
479
585
 
480
- 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
481
599
  }
482
600
 
483
601
  /**
@@ -497,6 +615,10 @@ function determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheC
497
615
  // Prioritize s-maxage since we're a shared cache
498
616
  // s-maxage > max-age > Expire
499
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
+
500
622
  const sMaxAge = cacheControlDirectives['s-maxage']
501
623
  if (sMaxAge !== undefined) {
502
624
  if (sMaxAge > 0) {
@@ -504,10 +626,14 @@ function determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheC
504
626
  }
505
627
 
506
628
  // Immediately stale, but storable if we can revalidate it before reuse.
507
- return sMaxAge === 0 && hasValidator ? 0 : undefined
629
+ return 0
508
630
  }
509
631
  }
510
632
 
633
+ if (hasInvalidCacheControlDirective(cacheControlDirectives, 'max-age')) {
634
+ return 0
635
+ }
636
+
511
637
  const maxAge = cacheControlDirectives['max-age']
512
638
  if (maxAge !== undefined) {
513
639
  if (maxAge > 0) {
@@ -515,35 +641,44 @@ function determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheC
515
641
  }
516
642
 
517
643
  // Immediately stale, but storable if we can revalidate it before reuse.
518
- return maxAge === 0 && hasValidator ? 0 : undefined
644
+ return 0
519
645
  }
520
646
 
521
- if (typeof resHeaders.expires === 'string') {
647
+ if (Object.hasOwn(resHeaders, 'expires')) {
522
648
  // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.3
649
+ if (typeof resHeaders.expires !== 'string') {
650
+ return 0
651
+ }
652
+
523
653
  const expiresDate = parseHttpDate(resHeaders.expires)
524
- if (expiresDate) {
525
- if (now >= expiresDate.getTime()) {
526
- return undefined
527
- }
654
+ if (!expiresDate) {
655
+ return 0
656
+ }
528
657
 
529
- if (responseDate) {
530
- if (responseDate >= expiresDate) {
531
- return undefined
532
- }
658
+ if (now >= expiresDate.getTime()) {
659
+ return 0
660
+ }
533
661
 
534
- if (age !== undefined && age > (expiresDate - responseDate)) {
535
- return undefined
536
- }
662
+ if (responseDate) {
663
+ if (responseDate >= expiresDate) {
664
+ return 0
665
+ }
666
+
667
+ const freshnessLifetime = expiresDate.getTime() - responseDate.getTime()
668
+ if (age !== undefined && age >= freshnessLifetime) {
669
+ return 0
537
670
  }
538
671
 
539
- return expiresDate.getTime() - now
672
+ return freshnessLifetime
540
673
  }
674
+
675
+ return expiresDate.getTime() - now
541
676
  }
542
677
 
543
678
  if (typeof resHeaders['last-modified'] === 'string') {
544
679
  // https://www.rfc-editor.org/rfc/rfc9111.html#name-calculating-heuristic-fresh
545
- const lastModified = new Date(resHeaders['last-modified'])
546
- if (isValidDate(lastModified)) {
680
+ const lastModified = parseHttpDate(resHeaders['last-modified'])
681
+ if (lastModified) {
547
682
  if (lastModified.getTime() >= now) {
548
683
  return undefined
549
684
  }
@@ -634,14 +769,7 @@ function stripNecessaryHeaders (resHeaders, cacheControlDirectives) {
634
769
  ]
635
770
 
636
771
  if (resHeaders['connection']) {
637
- if (Array.isArray(resHeaders['connection'])) {
638
- // connection: a
639
- // connection: b
640
- headersToRemove.push(...resHeaders['connection'].map(header => header.trim()))
641
- } else {
642
- // connection: a, b
643
- headersToRemove.push(...resHeaders['connection'].split(',').map(header => header.trim()))
644
- }
772
+ appendConnectionHeaderTokens(headersToRemove, resHeaders['connection'])
645
773
  }
646
774
 
647
775
  if (Array.isArray(cacheControlDirectives['no-cache'])) {
@@ -654,7 +782,7 @@ function stripNecessaryHeaders (resHeaders, cacheControlDirectives) {
654
782
 
655
783
  let strippedHeaders
656
784
  for (const headerName of headersToRemove) {
657
- if (resHeaders[headerName]) {
785
+ if (Object.hasOwn(resHeaders, headerName)) {
658
786
  strippedHeaders ??= { ...resHeaders }
659
787
  delete strippedHeaders[headerName]
660
788
  }
@@ -663,12 +791,4 @@ function stripNecessaryHeaders (resHeaders, cacheControlDirectives) {
663
791
  return strippedHeaders ?? resHeaders
664
792
  }
665
793
 
666
- /**
667
- * @param {Date} date
668
- * @returns {boolean}
669
- */
670
- function isValidDate (date) {
671
- return date instanceof Date && Number.isFinite(date.valueOf())
672
- }
673
-
674
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) {
@@ -14,6 +14,26 @@ function calculateRetryAfterHeader (retryAfter) {
14
14
  return isNaN(retryTime) ? null : retryTime - Date.now()
15
15
  }
16
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
+ }
35
+ }
36
+
17
37
  // A stable controller handed to the downstream handler for the lifetime of the
18
38
  // request. Each transparent retry/resume is a *separate* dispatch with its
19
39
  // *own* connection controller. Without a stable proxy the downstream body keeps
@@ -270,6 +290,8 @@ class RetryHandler {
270
290
  })
271
291
  }
272
292
 
293
+ validatePartialResponseContentLength(headers, contentRange, statusCode, this.retryCount)
294
+
273
295
  const { start, size, end = size ? size - 1 : null } = contentRange
274
296
 
275
297
  assert(this.start === start, 'content-range mismatch')
@@ -294,6 +316,8 @@ class RetryHandler {
294
316
  return
295
317
  }
296
318
 
319
+ validatePartialResponseContentLength(headers, range, statusCode, this.retryCount)
320
+
297
321
  const { start, size, end = size ? size - 1 : null } = range
298
322
  assert(
299
323
  start != null && Number.isFinite(start),