failproofai 1.0.2-beta.3 → 1.0.2-beta.5

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 (210) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +6 -6
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +3 -3
  6. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +3 -3
  15. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.rsc +14 -14
  20. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +13 -13
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/standalone/.next/server/app/api/audit/invite/route.js +2 -3
  24. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/audit/run/route.js +5 -6
  26. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +2 -2
  29. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +3 -4
  31. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/auth/logout/route.js +4 -4
  33. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/auth/status/route.js +4 -4
  35. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +1 -1
  37. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/audit/page/build-manifest.json +3 -3
  39. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  40. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/index.html +1 -1
  43. package/.next/standalone/.next/server/app/index.rsc +14 -14
  44. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +13 -13
  45. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +14 -14
  46. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  47. package/.next/standalone/.next/server/app/page/build-manifest.json +3 -3
  48. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  49. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +3 -3
  52. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
  53. package/.next/standalone/.next/server/app/policies/page.js +2 -2
  54. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +3 -3
  57. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  58. package/.next/standalone/.next/server/app/project/[name]/page.js +2 -2
  59. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +3 -3
  62. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  63. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  64. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +2 -2
  65. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +3 -3
  68. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  69. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +3 -3
  72. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
  73. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/chunks/{[externals]__0e32-7c._.js → [externals]__1qzqcio._.js} +1 -1
  76. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03r-lqq._.js +3 -0
  77. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_usx0j._.js +3 -0
  78. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_zk340._.js +3 -0
  79. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
  80. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oy4kxb._.js +3 -0
  81. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zf034w._.js +3 -0
  82. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12021ot._.js +3 -0
  83. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1le9jqc._.js +3 -0
  84. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0igxt32._.js → [root-of-the-server]__1p8poxd._.js} +2 -2
  85. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1zkek3z._.js +3 -0
  86. package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +3 -0
  87. package/.next/standalone/.next/server/chunks/_12moi5-._.js +3 -0
  88. package/.next/standalone/.next/server/chunks/_1ek68ln._.js +6 -5
  89. package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +3 -0
  90. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +2 -2
  91. package/.next/standalone/.next/server/chunks/{node_modules_posthog-node_dist_entrypoints_index_node_mjs_04op_ou._.js → node_modules_posthog-node_dist_entrypoints_index_node_mjs_09d5c79._.js} +1 -1
  92. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +2 -2
  93. package/.next/standalone/.next/server/chunks/{node_modules_posthog-node_dist_entrypoints_index_node_mjs_0dr20uz._.js → node_modules_posthog-node_dist_entrypoints_index_node_mjs_1d2g73o._.js} +1 -1
  94. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  95. package/.next/standalone/.next/server/chunks/src_hooks_fp-home_ts_09kv0bn._.js +1 -1
  96. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1m84s36._.js → [root-of-the-server]__00-s7h8._.js} +1 -1
  97. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +2 -2
  98. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +2 -2
  99. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +2 -2
  100. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07gm3zl._.js +4 -4
  101. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +2 -2
  102. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +2 -2
  103. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +1 -1
  104. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +2 -2
  105. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s740oi._.js +2 -2
  106. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__08zpry-._.js → [root-of-the-server]__0stn0gx._.js} +2 -2
  107. package/.next/standalone/.next/server/chunks/ssr/{src_hooks_08o7bqo._.js → [root-of-the-server]__15r6r7w._.js} +2 -2
  108. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0jzbk4_._.js → [root-of-the-server]__190won8._.js} +1 -1
  109. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ctpynv._.js +1 -1
  110. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +2 -2
  111. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0rsd3ll._.js → [root-of-the-server]__1sc84bb._.js} +2 -2
  112. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1tag8_-._.js +5 -0
  113. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  114. package/.next/standalone/.next/server/chunks/ssr/_1ddpc5g._.js +1 -1
  115. package/.next/standalone/.next/server/chunks/ssr/{_1db3-8n._.js → _1if9ixi._.js} +2 -2
  116. package/.next/standalone/.next/server/chunks/ssr/{_11opd9e._.js → _1kesqs-._.js} +2 -2
  117. package/.next/standalone/.next/server/chunks/ssr/{_15xtekm._.js → _1km9-gn._.js} +1 -1
  118. package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +1 -1
  119. package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
  120. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
  121. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  122. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
  123. package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +1 -1
  124. package/.next/standalone/.next/server/chunks/ssr/lib_1cf5ya2._.js +3 -0
  125. package/.next/standalone/.next/server/chunks/ssr/lib_opencode-projects_ts_15bjxkm._.js +1 -1
  126. package/.next/standalone/.next/server/chunks/ssr/node_modules_13n822a._.js +1 -1
  127. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +2 -2
  128. package/.next/standalone/.next/server/middleware-build-manifest.js +6 -6
  129. package/.next/standalone/.next/server/middleware.js +1 -1
  130. package/.next/standalone/.next/server/pages/404.html +1 -1
  131. package/.next/standalone/.next/server/pages/500.html +1 -1
  132. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/server-reference-manifest.json +19 -19
  134. package/.next/standalone/.next/static/chunks/0tyt-3a5rtzy8.js +1 -0
  135. package/.next/standalone/.next/static/chunks/{1mk3vmmc673hu.js → 21r7iw3rmixf5.js} +1 -1
  136. package/.next/standalone/.next/static/chunks/{10pok-mrqv426.js → 26lfjhb2kzzgb.js} +1 -1
  137. package/.next/standalone/.next/static/chunks/2_27jraat038x.js +1 -0
  138. package/.next/standalone/.next/static/chunks/2hwc8e923g5df.js +1 -0
  139. package/.next/standalone/.next/static/chunks/{3cs_rf5p765v0.js → 33np9nrh1mvj9.js} +1 -1
  140. package/.next/standalone/.next/static/chunks/{1oml7c7env4-g.js → 354-n7p7labpn.js} +1 -1
  141. package/.next/standalone/.next/static/chunks/36-8i_vbkh85w.js +1 -0
  142. package/.next/standalone/.next/static/chunks/{2jsomd79g7kn0.js → 391tpdqcas7rq.js} +1 -1
  143. package/.next/standalone/.next/static/chunks/{1yywl_a87108w.js → 3_b73tc78jwsq.js} +2 -2
  144. package/.next/standalone/.next/static/chunks/{1za08zjcctyil.js → 3i8rg2fv9nd6e.js} +2 -2
  145. package/.next/standalone/.next/static/chunks/{2ey_ih6j6cm15.js → 3jqm8ubpv3i-4.js} +1 -1
  146. package/.next/standalone/.next/static/chunks/turbopack-2x-o099q64i8h.js +1 -0
  147. package/.next/standalone/SECURITY.md +18 -3
  148. package/.next/standalone/fp-cloud-cli/CHANGELOG.md +7 -0
  149. package/.next/standalone/fp-cloud-cli/uv.lock +6 -6
  150. package/.next/standalone/lib/opencode-db.ts +77 -0
  151. package/.next/standalone/lib/opencode-projects.ts +37 -41
  152. package/.next/standalone/lib/opencode-sessions.ts +59 -36
  153. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  154. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  155. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/cache.js +23 -34
  156. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +1 -1
  157. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +1 -1
  158. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
  159. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  160. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  161. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  162. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  163. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  164. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  165. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  166. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  167. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  168. package/.next/standalone/node_modules/next/package.json +10 -10
  169. package/.next/standalone/package.json +19 -19
  170. package/.next/standalone/sdk/python/CHANGELOG.md +7 -0
  171. package/.next/standalone/sdk/python/uv.lock +23 -23
  172. package/.next/standalone/server.js +1 -1
  173. package/bin/failproofai.mjs +151 -60
  174. package/dist/cli.mjs +3670 -3005
  175. package/dist/worker.mjs +189 -164
  176. package/lib/opencode-db.ts +77 -0
  177. package/lib/opencode-projects.ts +37 -41
  178. package/lib/opencode-sessions.ts +59 -36
  179. package/package.json +19 -19
  180. package/src/audit/cache.ts +201 -40
  181. package/src/audit/cli-adapters/claude.ts +111 -1
  182. package/src/audit/cli-adapters/index.ts +31 -1
  183. package/src/audit/index.ts +131 -11
  184. package/src/audit/replay.ts +15 -91
  185. package/src/hooks/configure-wizard.ts +16 -48
  186. package/src/hooks/handler.ts +8 -1
  187. package/src/hooks/manager.ts +72 -3
  188. package/src/hooks/pack-cli.ts +793 -45
  189. package/src/hooks/pack-manifest.ts +28 -0
  190. package/src/hooks/pack-store.ts +8 -25
  191. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01eqny5._.js +0 -3
  192. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0neqlu-._.js +0 -3
  193. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t9oqnn._.js +0 -3
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1l-khtb._.js +0 -3
  195. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1mhmdzs._.js +0 -3
  196. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +0 -3
  197. package/.next/standalone/.next/server/chunks/_0bs-v8p._.js +0 -3
  198. package/.next/standalone/.next/server/chunks/_0tovk6q._.js +0 -3
  199. package/.next/standalone/.next/server/chunks/_0trp3yc._.js +0 -3
  200. package/.next/standalone/.next/server/chunks/_185gyk9._.js +0 -3
  201. package/.next/standalone/.next/server/chunks/src_hooks_0xbw3bu._.js +0 -12
  202. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__192nhvh._.js +0 -5
  203. package/.next/standalone/.next/static/chunks/01nuy-aqshahr.js +0 -1
  204. package/.next/standalone/.next/static/chunks/1pl7h8vllvoi2.js +0 -1
  205. package/.next/standalone/.next/static/chunks/2efnffq2ipgr_.js +0 -1
  206. package/.next/standalone/.next/static/chunks/2gd07pinz0i7f.js +0 -1
  207. package/.next/standalone/.next/static/chunks/turbopack-3kjgdgwci4tqf.js +0 -1
  208. /package/.next/standalone/.next/static/{G-faMkpZioETgewZ4X4wX → 59jsH11LoyXu9UBoHvgGM}/_buildManifest.js +0 -0
  209. /package/.next/standalone/.next/static/{G-faMkpZioETgewZ4X4wX → 59jsH11LoyXu9UBoHvgGM}/_clientMiddlewareManifest.js +0 -0
  210. /package/.next/standalone/.next/static/{G-faMkpZioETgewZ4X4wX → 59jsH11LoyXu9UBoHvgGM}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,16983,e=>{"use strict";var t=e.i(95187);let a=(0,t.createServerReference)("601128be367952aebe7ec7aa21aad14ae5d688a5d9",t.callServer,void 0,t.findSourceMapURL,"searchHookActivityAction");e.s(["searchHookActivityAction",0,a])},73520,e=>{"use strict";var t=e.i(43476),a=e.i(24071),r=e.i(67927);e.s(["default",0,function({currentPage:e,totalPages:s,onPageChange:i}){if(s<=1)return null;let l=e=>`px-3 py-2 text-sm rounded-md transition-colors flex items-center gap-1 bg-muted text-muted-foreground ${e?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`;return(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-4",children:[(0,t.jsxs)("button",{onClick:()=>i(e-1),disabled:1===e,className:l(1===e),"aria-label":"Previous page",children:[(0,t.jsx)(a.ChevronLeft,{className:"w-4 h-4"}),(0,t.jsx)("span",{className:"hidden sm:inline",children:"Previous"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1",children:(()=>{if(s<=7)return Array.from({length:s},(e,t)=>t+1);let t=[1],a=Math.max(2,e-1),r=Math.min(s-1,e+1);e<=3&&(r=Math.min(5,s-1)),e>=s-2&&(a=Math.max(2,s-4)),a>2&&t.push("ellipsis-start");for(let e=a;e<=r;e++)t.push(e);return r<s-1&&t.push("ellipsis-end"),t.push(s),t})().map(a=>"string"==typeof a?(0,t.jsx)("span",{className:"px-2 text-muted-foreground",children:"..."},a):(0,t.jsx)("button",{onClick:()=>i(a),className:`min-w-[2.5rem] px-3 py-2 text-sm rounded-md transition-colors ${e===a?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,"aria-label":`Page ${a}`,"aria-current":e===a?"page":void 0,children:a},a))}),(0,t.jsxs)("button",{onClick:()=>i(e+1),disabled:e===s,className:l(e===s),"aria-label":"Next page",children:[(0,t.jsx)("span",{className:"hidden sm:inline",children:"Next"}),(0,t.jsx)(r.ChevronRight,{className:"w-4 h-4"})]})]})}])},34713,e=>{"use strict";e.s(["formatDuration",0,function(e){if(e<1e3)return`${e}ms`;let t=Math.round(e/100);if(t<600)return`${(t/10).toFixed(1)}s`;let a=Math.round(e/1e3);if(a<3600){let e=Math.floor(a/60);return`${e}m ${a%60}s`}let r=Math.round(e/6e4),s=Math.floor(r/60);return`${s}h ${r%60}m`},"formatRelativeTime",0,function(e){let t=Date.now()-e;return t<6e4?`${Math.max(1,Math.floor(t/1e3))}s ago`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}])},24071,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],24071)},67927,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],67927)},16306,e=>{"use strict";let t=(0,e.i(56420).default)("shield-alert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);e.s(["ShieldAlert",0,t],16306)},84026,29407,e=>{"use strict";var t=e.i(56420);let a=(0,t.default)("shield-check",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);e.s(["ShieldCheck",0,a],84026);let r=(0,t.default)("shield-x",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]]);e.s(["ShieldX",0,r],29407)},82954,e=>{"use strict";let t=(0,e.i(56420).default)("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);e.s(["Shield",0,t],82954)}]);
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,89523,e=>{"use strict";var t=e.i(95187);let a=(0,t.createServerReference)("60edf232c907aa5a89901b45da38cd4fccb6ea5326",t.callServer,void 0,t.findSourceMapURL,"searchHookActivityAction");e.s(["searchHookActivityAction",0,a])},73520,e=>{"use strict";var t=e.i(43476),a=e.i(24071),r=e.i(67927);e.s(["default",0,function({currentPage:e,totalPages:s,onPageChange:i}){if(s<=1)return null;let l=e=>`px-3 py-2 text-sm rounded-md transition-colors flex items-center gap-1 bg-muted text-muted-foreground ${e?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`;return(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-4",children:[(0,t.jsxs)("button",{onClick:()=>i(e-1),disabled:1===e,className:l(1===e),"aria-label":"Previous page",children:[(0,t.jsx)(a.ChevronLeft,{className:"w-4 h-4"}),(0,t.jsx)("span",{className:"hidden sm:inline",children:"Previous"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1",children:(()=>{if(s<=7)return Array.from({length:s},(e,t)=>t+1);let t=[1],a=Math.max(2,e-1),r=Math.min(s-1,e+1);e<=3&&(r=Math.min(5,s-1)),e>=s-2&&(a=Math.max(2,s-4)),a>2&&t.push("ellipsis-start");for(let e=a;e<=r;e++)t.push(e);return r<s-1&&t.push("ellipsis-end"),t.push(s),t})().map(a=>"string"==typeof a?(0,t.jsx)("span",{className:"px-2 text-muted-foreground",children:"..."},a):(0,t.jsx)("button",{onClick:()=>i(a),className:`min-w-[2.5rem] px-3 py-2 text-sm rounded-md transition-colors ${e===a?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,"aria-label":`Page ${a}`,"aria-current":e===a?"page":void 0,children:a},a))}),(0,t.jsxs)("button",{onClick:()=>i(e+1),disabled:e===s,className:l(e===s),"aria-label":"Next page",children:[(0,t.jsx)("span",{className:"hidden sm:inline",children:"Next"}),(0,t.jsx)(r.ChevronRight,{className:"w-4 h-4"})]})]})}])},34713,e=>{"use strict";e.s(["formatDuration",0,function(e){if(e<1e3)return`${e}ms`;let t=Math.round(e/100);if(t<600)return`${(t/10).toFixed(1)}s`;let a=Math.round(e/1e3);if(a<3600){let e=Math.floor(a/60);return`${e}m ${a%60}s`}let r=Math.round(e/6e4),s=Math.floor(r/60);return`${s}h ${r%60}m`},"formatRelativeTime",0,function(e){let t=Date.now()-e;return t<6e4?`${Math.max(1,Math.floor(t/1e3))}s ago`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}])},24071,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],24071)},67927,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],67927)},16306,e=>{"use strict";let t=(0,e.i(56420).default)("shield-alert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);e.s(["ShieldAlert",0,t],16306)},84026,29407,e=>{"use strict";var t=e.i(56420);let a=(0,t.default)("shield-check",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);e.s(["ShieldCheck",0,a],84026);let r=(0,t.default)("shield-x",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]]);e.s(["ShieldX",0,r],29407)},82954,e=>{"use strict";let t=(0,e.i(56420).default)("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);e.s(["Shield",0,t],82954)}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/1c6aptmytnu6q.js","static/chunks/2yuzx8716maf0.js","static/chunks/3i8rg2fv9nd6e.js","static/chunks/354-n7p7labpn.js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;var t,r=function(){if(null!=self.TURBOPACK_ASSET_SUFFIX)return self.TURBOPACK_ASSET_SUFFIX;let e=document?.currentScript?.getAttribute?.("src")??"",t=e.indexOf("?");return t>=0?e.slice(t):""}(),n=((t=n||{})[t.Runtime=0]="Runtime",t[t.Parent=1]="Parent",t[t.Update=2]="Update",t);let o=new WeakMap;function l(e,t){this.m=e,this.e=t}let i=l.prototype,u=Object.prototype.hasOwnProperty,s="u">typeof Symbol&&Symbol.toStringTag;function c(e,t,r){u.call(e,t)||Object.defineProperty(e,t,r)}function a(e,t){let r=e[t];return r||(r=f(t),e[t]=r),r}function f(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function p(e,t,r){c(e,"__esModule",{value:!0}),s&&c(e,s,{value:"Module"});let n=0;for(;n<t.length;){let r=t[n++],o=t[n++];if("number"==typeof o)if(0===o)c(e,r,{value:t[n++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[n]?c(e,r,{get:o,set:t[n++],enumerable:!0}):c(e,r,{get:o,enumerable:!0})}r||Object.seal(e)}function h(e,t){(null!=t?a(this.c,t):this.m).exports=e}i.s=function(e,t,r){let n,o;null!=t?o=(n=a(this.c,t)).exports:(n=this.m,o=this.e),n.namespaceObject=o,p(o,e,r)},i.j=function(e,t){let r,n;null!=t?n=(r=a(this.c,t)).exports:(r=this.m,n=this.e);let l=function(e,t){let r=o.get(e);if(!r){o.set(e,r=[]);let n=e=>{if("default"!==e){for(let t of r)if(u.call(t,e))return t}};e.exports=e.namespaceObject=new Proxy(t,{get(e,t){if(u.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);let r=n(t);return r&&Reflect.get(r,t)},set:()=>!1,defineProperty:()=>!1,deleteProperty:()=>!1,has:(e,t)=>!!Reflect.has(e,t)||"default"!==t&&"__esModule"!==t&&void 0!==n(t),ownKeys(e){let t=Reflect.ownKeys(e);for(let e of r)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t},getOwnPropertyDescriptor(e,t){let r=Reflect.getOwnPropertyDescriptor(e,t);if(r||"default"===t||"__esModule"===t)return r;let o=n(t);if(o)return{enumerable:!0,configurable:!0,get:()=>Reflect.get(o,t)}}})}return r}(r,n);"object"==typeof e&&null!==e&&l.push(e)},i.v=h,i.n=function(e,t){let r;(r=null!=t?a(this.c,t):this.m).exports=r.namespaceObject=e};let d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,m=[null,d({}),d([]),d(d)];function y(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!m.includes(t);t=d(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),p(t,n),t}function g(e){let t=K(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=y(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function b(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e.indexOf("?");return -1!==r&&(e=e.substring(0,r)),e}i.i=g,i.A=function(e){return this.r(e)(g.bind(this))},i.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},i.r=function(e){return K(e,this.m).exports},i.f=function(e){function t(t){if(t=b(t),u.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=b(t),u.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let O=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function w(e,t){throw Error(`Invariant: ${t(e)}`)}O.prototype=URL.prototype,i.U=O,i.z=function(e){throw Error("dynamic usage of require is not supported")},i.g=globalThis;let R=l.prototype,k="string"==typeof TURBOPACK_CHUNK_BASE_PATH?TURBOPACK_CHUNK_BASE_PATH:"/_next/",U=new Map;i.M=U;let v=new Map,_=new Map,P=new Map;async function C(e,t,r){let n;if("string"==typeof r)return function(e,t,r){return A(e,t,r)}(e,t,E(r));let o=r.included||[],l=o.map(e=>!!U.has(e)||v.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);for(let l of(n=A(e,t,E(r.path)),o))v.has(l)||v.set(l,n);await n}R.l=function(e){return C(n.Parent,this.m.id,e)};let j=Promise.resolve(void 0),$=new WeakMap;function A(t,r,o){let l=e.loadChunkCached(t,o),i=$.get(l);if(void 0===i){let e=$.set.bind($,l,j);i=l.then(e).catch(e=>{let l;switch(t){case n.Runtime:l=`as a runtime dependency of chunk ${r}`;break;case n.Parent:l=`from module ${r}`;break;case n.Update:l="from an HMR update";break;default:w(t,e=>`Unknown source type: ${e}`)}let i=Error(`Failed to load chunk ${o} ${l}${e?`: ${e}`:""}`,e?{cause:e}:void 0);throw i.name="ChunkLoadError",i}),$.set(l,i)}return i}R.L=function(e){var t,r;return t=n.Parent,r=this.m.id,A(t,r,e)};R.R=function(e){let t=this.r(e);return t?.default??t},R.P=function(e){return`/ROOT/${e??""}`},R.F=function(e){return e?`file:///ROOT/${e.split("/").map(encodeURIComponent).join("/")}`:"file:///ROOT/"},R.q=function(e,t){h.call(this,`${e}${r}`,t)};let T=/[^A-Za-z0-9\-_.!~*'()/]/;function E(e,t=k){let n=T.test(e)?e.split("/").map(encodeURIComponent).join("/"):e;return`${t}${n}${r}`}function S(e,t){let r,n=e.indexOf("?");if(-1!==n)r=n;else{let t=e.indexOf("#");r=-1!==t?t:e.length}return r>=t.length&&e.startsWith(t,r-t.length)}R.b=k,R.X=r,R.h=E;function M(e){return S(e,".css")}let x={};i.c=x;let K=(e,t)=>{let r=x[e];if(r){if(r.error)throw r.error;return r}return N(e,n.Parent,t.id)};function N(e,t,r){let n=U.get(e);if("function"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:w(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let o=f(e),i=o.exports;x[e]=o;let u=new l(o,i);try{n(u,o,i)}catch(e){throw o.error=e,e}return o.namespaceObject&&o.exports!==o.namespaceObject&&y(o.exports,o.namespaceObject),o}function B(t){let r;if(!Array.isArray(t))return e.registerChunk(void 0,t);let n=function(e){if("string"==typeof e)return e;if(e)return{src:e.getAttribute("src")};if("u">typeof TURBOPACK_NEXT_CHUNK_URLS)return{src:TURBOPACK_NEXT_CHUNK_URLS.pop()};throw Error("chunk path empty but not in a worker")}(t[0]);return 2===t.length?r=t[1]:(r=void 0,!function(e,t){let r=1;for(;r<e.length;){let n,o=r+1;for(;o<e.length&&"function"!=typeof e[o];)o++;if(o===e.length)throw Error("malformed chunk format, expected a factory function");let l=e[o];for(let l=r;l<o;l++){let r=e[l],o=t.get(r);if(o){n=o;break}}let i=n??l,u=!1;for(let n=r;n<o;n++){let r=e[n];t.has(r)||(u||(i===l&&Object.defineProperty(l,"name",{value:"module evaluation"}),u=!0),t.set(r,i))}r=o+1}}(t,U)),e.registerChunk(n,r)}let L=new Map;function I(e){let t=L.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,retryAttempts:0,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},L.set(e,t)}return t}function q(e,t,r,n,o){!(null==n||n instanceof DOMException&&"NetworkError"===n.name)||r.retryAttempts>=1||L.get(t)!==r?(L.get(t)===r&&L.delete(t),r.reject(n)):(r.retryAttempts++,setTimeout(()=>{r.resolved||L.get(t)!==r||(o?o():(r.loadingStarted=!1,H(e,t)))},200+Math.floor(401*Math.random())))}function H(e,t){let r=I(t);if(r.loadingStarted)return r.promise;if(e===n.Runtime)return r.loadingStarted=!0,M(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(M(t));else if(S(t,".js")){self.TURBOPACK_NEXT_CHUNK_URLS.push(t);try{importScripts(t)}catch(n){q(e,t,r,n)}}else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let n=decodeURI(t);if(M(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${n}"],link[rel=stylesheet][href^="${n}?"]`).length>0)r.resolve();else{let n=()=>{let o=document.createElement("link");return o.rel="stylesheet",o.crossOrigin=null,o.href=t,o.onerror=()=>{let l=document.createComment("");o.replaceWith(l),q(e,t,r,void 0,()=>l.replaceWith(n()))},o.onload=()=>{r.resolve()},o};document.head.appendChild(n())}else if(S(t,".js")){let o=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${n}"],script[src^="${n}?"]`);if(o.length>0)for(let n of Array.from(o))n.addEventListener("error",()=>{n.remove(),q(e,t,r)},{once:!0});else{let n=document.createElement("script");n.crossOrigin=null,n.src=t,n.onerror=()=>{n.remove(),q(e,t,r)},document.head.appendChild(n)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise}e={async registerChunk(e,t){let r;if(null!=e&&(r=function(e){if("string"==typeof e)return e;let t=decodeURIComponent(e.src.replace(/[?#].*$/,""));return t.startsWith(k)?t.slice(k.length):t}(e),I("string"==typeof e?E(e):e.src).resolve()),null!=t){for(let e of t.otherChunks)I(E("string"==typeof e?e:e.path));if(await Promise.all(t.otherChunks.map(e=>{var t;return t=r,C(n.Runtime,t,e)})),t.runtimeModuleIds.length>0)for(let e of t.runtimeModuleIds)!function(e,t){let r=x[t];if(r){if(r.error)throw r.error;return}N(t,n.Runtime,e)}(r,e)}},loadChunkCached:(e,t)=>H(e,t)};var F=globalThis.TURBOPACK;globalThis.TURBOPACK={push:B},F.forEach(B)})();
@@ -58,9 +58,24 @@ When the OSV-Scanner gate fails on a PR:
58
58
  transitive dependency that a parent pins to a vulnerable version, add a minimal
59
59
  [`overrides`](package.json) entry (as we do for `postcss`) and let CI validate
60
60
  the build.
61
- 2. **Only if there is no fix**, add a justified, time-boxed entry to
62
- [`osv-scanner.toml`](osv-scanner.toml) (`id`, `reason`, `ignoreUntil`). Never
63
- blanket-ignore. Re-review entries when their `ignoreUntil` date passes.
61
+ 2. **Only if there is no fix**, add a justified, time-boxed `[[IgnoredVulns]]`
62
+ entry to [`osv-scanner.toml`](osv-scanner.toml) (`id`, `reason`,
63
+ `ignoreUntil`). One advisory per entry, which is the point: any *other*
64
+ advisory against the same package still blocks. The scanner resolves
65
+ **aliases**, so one id covers every spelling of the *same* advisory — naming
66
+ both a `PYSEC-` id and its `GHSA-` alias adds nothing and gets reported as an
67
+ unused ignore. It does **not** cover a distinct advisory against that package,
68
+ which still fails the gate until it gets its own entry. Re-review entries when
69
+ their `ignoreUntil` date passes.
70
+ 3. **Only for a package that keeps accruing unfixable advisories**, where an id
71
+ list has become whack-a-mole — each new disclosure reddening the gate on an
72
+ unrelated PR until someone appends another id — use `[[PackageOverrides]]`
73
+ instead (`name`, `version`, `ecosystem`, `vulnerability.ignore`,
74
+ `effectiveUntil`; note the different date key). This silences *every*
75
+ advisory against that package, **including fixable ones**, so the `reason`
76
+ must say why losing that signal is acceptable for this package specifically.
77
+ Pin `version` to the locked version so a lockfile bump re-opens the gate, and
78
+ never omit `effectiveUntil`.
64
79
 
65
80
  ## Maintainer setup (one-time)
66
81
 
@@ -1,5 +1,12 @@
1
1
  # Changelog — `fp` CLI
2
2
 
3
+ ## 0.0.1b2 — 2026-08-25
4
+
5
+ Open for the next release. `0.0.1b1` published on 2026-08-24 and the `bump` job
6
+ moved the version here automatically; nothing has landed against `0.0.1b2` yet.
7
+ Add entries as changes merge — this section becomes the GitHub Release body when
8
+ it ships.
9
+
3
10
  ## 0.0.1b1 — 2026-08-24
4
11
 
5
12
  ### The package is `fp-cloud-cli`; the command is still `fp`
@@ -375,7 +375,7 @@ wheels = [
375
375
 
376
376
  [[package]]
377
377
  name = "posthog"
378
- version = "7.39.1"
378
+ version = "7.42.0"
379
379
  source = { registry = "https://pypi.org/simple" }
380
380
  dependencies = [
381
381
  { name = "backoff" },
@@ -383,18 +383,18 @@ dependencies = [
383
383
  { name = "requests" },
384
384
  { name = "typing-extensions" },
385
385
  ]
386
- sdist = { url = "https://files.pythonhosted.org/packages/4f/77/3737f60571995ba07677b058bb1523b7c26f28570806b8ffaf83a66df18c/posthog-7.39.1.tar.gz", hash = "sha256:0d184596e35057457fc1094883646fd23de2d6338db8b9c3ea770643fb55d8a2", size = 428586, upload-time = "2026-08-14T13:50:24.688Z" }
386
+ sdist = { url = "https://files.pythonhosted.org/packages/79/97/32cc0a72d7896cc2d27d442c75c9d24cc77d0140be9f5e98df7f4ce98f6a/posthog-7.42.0.tar.gz", hash = "sha256:c7e9297446208d413c3071348f101f4c05e32fba4228ac0a85e9d0014c2a274e", size = 469662, upload-time = "2026-08-21T12:57:15.05Z" }
387
387
  wheels = [
388
- { url = "https://files.pythonhosted.org/packages/88/79/ee5c01937bfb0c80415929e25aa1e8296c48e26fc9a10fe1d9f665f0f478/posthog-7.39.1-py3-none-any.whl", hash = "sha256:e76e82fe571314a0a9bc11d039fd1a1a8d210cd0f737899d41b31f61b73bf08c", size = 504259, upload-time = "2026-08-14T13:50:22.896Z" },
388
+ { url = "https://files.pythonhosted.org/packages/31/f0/46e28b947a19c992ad7289931d3197358cfdf4980b33317b5e7cf9c24abe/posthog-7.42.0-py3-none-any.whl", hash = "sha256:6429c9a4145572a8f54ab00330bbfe987340025d3a464212505be814b2b0950d", size = 559119, upload-time = "2026-08-21T12:57:13.299Z" },
389
389
  ]
390
390
 
391
391
  [[package]]
392
392
  name = "pygments"
393
- version = "2.20.0"
393
+ version = "2.21.0"
394
394
  source = { registry = "https://pypi.org/simple" }
395
- sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
395
+ sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" }
396
396
  wheels = [
397
- { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
397
+ { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" },
398
398
  ]
399
399
 
400
400
  [[package]]
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Read-only access to OpenCode's SQLite database.
3
+ *
4
+ * This used to shell out: `opencode db --format json "<sql>"`, on the reasoning
5
+ * that going through the CLI avoided coupling us to opencode's internal schema.
6
+ * It did not — the SQL was ours either way, naming opencode's own tables and
7
+ * columns, so the schema coupling was identical and the subprocess bought
8
+ * nothing but its own cost.
9
+ *
10
+ * And that cost was the single largest component of `failproofai audit` on any
11
+ * machine with opencode installed. Each spawn is a full CLI start: ~1.5s
12
+ * measured. `getOpenCodeSessionExport` issues three queries, so a 30-session
13
+ * history spent ~135 seconds launching 90 processes — against a total audit
14
+ * time of ~140s. The audit sat at ~0% CPU throughout, which is why it read as
15
+ * "slow scanning" rather than as what it was: waiting on `execFileSync`.
16
+ *
17
+ * Reading the file directly is the same thing every other SQLite-backed
18
+ * integration already does through `openSqliteReadonly` — goose, devin, hermes,
19
+ * openclaw and antigravity. Opening the database costs microseconds, and one
20
+ * open now serves every query a caller needs instead of one process per query.
21
+ *
22
+ * Fail-open contract is unchanged: a missing file, an unreadable database or a
23
+ * query error yields `null`, and callers degrade to an empty result exactly as
24
+ * they did when the binary was absent from PATH.
25
+ */
26
+ import { homedir } from "node:os";
27
+ import { join } from "node:path";
28
+ import { openSqliteReadonly, type SqliteReader } from "./sqlite-reader";
29
+
30
+ /**
31
+ * Where the database lives.
32
+ *
33
+ * `OPENCODE_DB_PATH` names the file outright and `OPENCODE_HOME` the directory
34
+ * holding it — the same override shape `GOOSE_DB_PATH`/`GOOSE_HOME` and
35
+ * `DEVIN_DB_PATH`/`DEVIN_HOME` use, so tests point at a fixture the same way
36
+ * for every one of them.
37
+ */
38
+ export function opencodeDbPath(): string {
39
+ if (process.env.OPENCODE_DB_PATH) return process.env.OPENCODE_DB_PATH;
40
+ const home = process.env.OPENCODE_HOME ?? join(homedir(), ".local", "share", "opencode");
41
+ return join(home, "opencode.db");
42
+ }
43
+
44
+ /**
45
+ * Open the database, hand it to `fn`, and always close it.
46
+ *
47
+ * Callers that need several queries take ONE of these and run them all inside
48
+ * it. That is the whole point: the shape being replaced ran a separate process
49
+ * per query, so three related reads cost three CLI starts.
50
+ */
51
+ export async function withOpenCodeDb<T>(
52
+ fn: (db: SqliteReader) => T,
53
+ ): Promise<T | null> {
54
+ const db = await openSqliteReadonly(opencodeDbPath());
55
+ if (!db) return null;
56
+ try {
57
+ return fn(db);
58
+ } catch {
59
+ // A query error is indistinguishable from a missing database to every
60
+ // caller, and both mean "no opencode data" rather than "audit failed".
61
+ return null;
62
+ } finally {
63
+ try {
64
+ db.close();
65
+ } catch {
66
+ /* closing a read-only handle cannot fail in a way that matters here */
67
+ }
68
+ }
69
+ }
70
+
71
+ /** One query, for callers that genuinely need only one. */
72
+ export async function queryOpenCodeDb<T = Record<string, unknown>>(
73
+ sql: string,
74
+ params: unknown[] = [],
75
+ ): Promise<T[] | null> {
76
+ return withOpenCodeDb((db) => db.query<T>(sql, params));
77
+ }
@@ -3,10 +3,15 @@
3
3
  *
4
4
  * Unlike the other agent CLIs that store sessions as filesystem JSONL trees,
5
5
  * OpenCode stores everything in a single SQLite database (managed by
6
- * Drizzle ORM) at `~/.local/share/opencode/opencode.db`. Rather than read
7
- * the DB directly with `bun:sqlite` (which would couple us to opencode's
8
- * internal schema), we shell out to `opencode db --format json "<sql>"` —
9
- * the same surface opencode itself documents as read-only safe.
6
+ * Drizzle ORM) at `~/.local/share/opencode/opencode.db`, read directly
7
+ * through `lib/opencode-db.ts`.
8
+ *
9
+ * This used to shell out to `opencode db --format json "<sql>"`, to avoid
10
+ * coupling to opencode's internal schema. That reasoning did not survive
11
+ * contact with the SQL: the queries name opencode's own tables and columns
12
+ * either way, so the coupling was identical and the subprocess bought only
13
+ * its own cost — see `lib/opencode-db.ts` for what that cost turned out to
14
+ * be.
10
15
  *
11
16
  * Verified live against opencode v1.14.31:
12
17
  * • `session` columns: id, project_id, parent_id, slug, directory, title,
@@ -21,7 +26,7 @@
21
26
  * Refs: https://opencode.ai/docs/ (CLI reference)
22
27
  * https://opencode.ai/docs/plugins/ (plugin model context)
23
28
  */
24
- import { execFileSync } from "node:child_process";
29
+ import { queryOpenCodeDb, withOpenCodeDb } from "./opencode-db";
25
30
  import { encodeFolderName } from "./paths";
26
31
  import type { ProjectFolder, SessionFile } from "./projects";
27
32
  import { runtimeCache } from "./runtime-cache";
@@ -51,41 +56,34 @@ interface OpenCodeProjectRow {
51
56
  }
52
57
 
53
58
  /**
54
- * Run `opencode db --format json "<sql>"` and parse the result. Returns
55
- * `null` (not an empty array) when the binary is missing or the query fails
56
- * — callers can decide whether absent vs. empty is meaningful.
57
- */
58
- function runOpenCodeDb<T>(sql: string): T[] | null {
59
- try {
60
- const stdout = execFileSync("opencode", ["db", "--format", "json", sql], {
61
- encoding: "utf8",
62
- timeout: 5_000,
63
- stdio: ["ignore", "pipe", "pipe"],
64
- });
65
- if (!stdout.trim()) return [];
66
- const parsed = JSON.parse(stdout) as unknown;
67
- if (!Array.isArray(parsed)) return null;
68
- return parsed as T[];
69
- } catch {
70
- // Binary missing, db locked, malformed JSON, or SQL error — fail open.
71
- return null;
72
- }
73
- }
74
-
75
- /**
76
- * Pull session rows directly from opencode's SQLite. Selects the columns the
77
- * dashboard needs and orders newest-first.
59
+ * Session rows the dashboard needs, newest first.
60
+ *
61
+ * One caller needs sessions alone; the other two need sessions and projects
62
+ * together and take `readBothRows`, which serves both from a single open
63
+ * rather than two.
78
64
  */
79
- function readSessionRows(): OpenCodeSessionRow[] | null {
80
- return runOpenCodeDb<OpenCodeSessionRow>(
81
- `SELECT id, project_id, slug, directory, title, time_created, time_updated FROM session ORDER BY time_updated DESC LIMIT ${SESSION_LIMIT}`,
65
+ async function readSessionRows(): Promise<OpenCodeSessionRow[] | null> {
66
+ return queryOpenCodeDb<OpenCodeSessionRow>(
67
+ "SELECT id, project_id, slug, directory, title, time_created, time_updated FROM session ORDER BY time_updated DESC LIMIT ?",
68
+ [SESSION_LIMIT],
82
69
  );
83
70
  }
84
71
 
85
- function readProjectRows(): OpenCodeProjectRow[] | null {
86
- return runOpenCodeDb<OpenCodeProjectRow>(
87
- `SELECT id, worktree, vcs, name, time_created, time_updated FROM project`,
88
- );
72
+ /** Both tables from one open, for the callers that use them together. */
73
+ async function readBothRows(): Promise<{
74
+ sessions: OpenCodeSessionRow[] | null;
75
+ projects: OpenCodeProjectRow[] | null;
76
+ }> {
77
+ const rows = await withOpenCodeDb((db) => ({
78
+ sessions: db.query<OpenCodeSessionRow>(
79
+ "SELECT id, project_id, slug, directory, title, time_created, time_updated FROM session ORDER BY time_updated DESC LIMIT ?",
80
+ [SESSION_LIMIT],
81
+ ),
82
+ projects: db.query<OpenCodeProjectRow>(
83
+ "SELECT id, worktree, vcs, name, time_created, time_updated FROM project",
84
+ ),
85
+ }));
86
+ return { sessions: rows?.sessions ?? null, projects: rows?.projects ?? null };
89
87
  }
90
88
 
91
89
  /**
@@ -97,8 +95,7 @@ function readProjectRows(): OpenCodeProjectRow[] | null {
97
95
  * if no sessions exist yet).
98
96
  */
99
97
  export async function getOpenCodeProjects(): Promise<ProjectFolder[]> {
100
- const sessions = readSessionRows();
101
- const projects = readProjectRows();
98
+ const { sessions, projects } = await readBothRows();
102
99
  if (sessions === null && projects === null) {
103
100
  // Binary missing or query failed — silent degrade (no log spam).
104
101
  return [];
@@ -163,7 +160,7 @@ export async function getOpenCodeProjects(): Promise<ProjectFolder[]> {
163
160
 
164
161
  /** Sessions under a given absolute cwd. Used by the project detail page. */
165
162
  export async function getOpenCodeSessionsForCwd(cwd: string): Promise<SessionFile[]> {
166
- const sessions = readSessionRows();
163
+ const sessions = await readSessionRows();
167
164
  if (!sessions) return [];
168
165
  const matches = sessions.filter((s) => s.directory === cwd);
169
166
  return matches.map((s) => {
@@ -193,8 +190,7 @@ export async function getOpenCodeSessionsByEncodedName(name: string): Promise<Op
193
190
  let projects: OpenCodeProjectRow[] | null;
194
191
  let sessions: OpenCodeSessionRow[] | null;
195
192
  try {
196
- projects = readProjectRows();
197
- sessions = readSessionRows();
193
+ ({ projects, sessions } = await readBothRows());
198
194
  } catch (error) {
199
195
  logWarn("Failed to read OpenCode DB:", error);
200
196
  return { cwd: null, sessions: [] };
@@ -2,9 +2,10 @@
2
2
  * OpenCode (sst/opencode) session transcript loader.
3
3
  *
4
4
  * Sessions live in opencode's SQLite DB (`~/.local/share/opencode/opencode.db`),
5
- * not on disk as JSONL like the other CLIs. We read them by shelling out to
6
- * `opencode db --format json "<sql>"` — same surface as `lib/opencode-projects.ts`
7
- * and the same fail-open contract (binary missing → return null).
5
+ * not on disk as JSONL like the other CLIs. Read directly through
6
+ * `lib/opencode-db.ts` — see there for why this stopped shelling out to
7
+ * `opencode db` — with the same fail-open contract as every other provider
8
+ * (database unreadable → return null).
8
9
  *
9
10
  * Schema verified live on opencode v1.14.31:
10
11
  * • `session(id, project_id, parent_id, slug, directory, title, time_*, …)`
@@ -17,7 +18,7 @@
17
18
  *
18
19
  * Refs: https://opencode.ai/docs/ (CLI reference)
19
20
  */
20
- import { execFileSync } from "node:child_process";
21
+ import { withOpenCodeDb } from "./opencode-db";
21
22
  import { runtimeCache } from "./runtime-cache";
22
23
  import {
23
24
  baseEntry,
@@ -59,19 +60,19 @@ interface OpenCodePartRow {
59
60
  data: string; // JSON-encoded
60
61
  }
61
62
 
62
- /** Run a parameter-free SELECT against opencode's DB. Returns `null` on any
63
- * failure (binary missing, query error, malformed output). */
64
- function runOpenCodeDb<T>(sql: string): T[] | null {
63
+ /**
64
+ * One query, with its failure isolated to itself.
65
+ *
66
+ * The three reads below used to be three separate processes, so one of them
67
+ * failing left the others' results intact — and the callers depend on that: a
68
+ * session row that loads while its messages do not yields an EMPTY log rather
69
+ * than a missing one. Running all three inside a single open would otherwise
70
+ * turn any one failure into a null for the whole session, which reads to the
71
+ * dashboard as "no such session" rather than "no messages".
72
+ */
73
+ function safeQuery<T>(run: () => T[]): T[] | null {
65
74
  try {
66
- const stdout = execFileSync("opencode", ["db", "--format", "json", sql], {
67
- encoding: "utf8",
68
- timeout: 5_000,
69
- stdio: ["ignore", "pipe", "pipe"],
70
- });
71
- if (!stdout.trim()) return [];
72
- const parsed = JSON.parse(stdout) as unknown;
73
- if (!Array.isArray(parsed)) return null;
74
- return parsed as T[];
75
+ return run();
75
76
  } catch {
76
77
  return null;
77
78
  }
@@ -215,19 +216,33 @@ export interface OpenCodeSessionLogData {
215
216
  * or the binary is unavailable.
216
217
  */
217
218
  export async function getOpenCodeSessionLog(sessionId: string): Promise<OpenCodeSessionLogData | null> {
218
- if (!sessionId || !/^[A-Za-z0-9_-]+$/.test(sessionId)) return null; // SQL-injection guard
219
- const sessions = runOpenCodeDb<OpenCodeSessionRow>(
220
- `SELECT id, project_id, slug, directory, title, time_created, time_updated FROM session WHERE id = '${sessionId}'`,
221
- );
219
+ // Parameter binding already makes injection impossible, so this guard is no
220
+ // longer load-bearing for that — but an id that cannot match anything is
221
+ // still not worth a database open, and weakening an existing check while
222
+ // changing transport is how a regression gets in unnoticed.
223
+ if (!sessionId || !/^[A-Za-z0-9_-]+$/.test(sessionId)) return null;
224
+ // One open, three queries. Each of these was a separate `opencode db`
225
+ // process — and this function is called once per session by the audit, so
226
+ // the spawns were the audit.
227
+ const rows = await withOpenCodeDb((db) => ({
228
+ sessions: safeQuery(() => db.query<OpenCodeSessionRow>(
229
+ "SELECT id, project_id, slug, directory, title, time_created, time_updated FROM session WHERE id = ?",
230
+ [sessionId],
231
+ )),
232
+ messages: safeQuery(() => db.query<OpenCodeMessageRow>(
233
+ "SELECT id, session_id, time_created, time_updated, data FROM message WHERE session_id = ? ORDER BY time_created ASC",
234
+ [sessionId],
235
+ )),
236
+ parts: safeQuery(() => db.query<OpenCodePartRow>(
237
+ "SELECT id, message_id, session_id, time_created, time_updated, data FROM part WHERE session_id = ? ORDER BY time_created ASC",
238
+ [sessionId],
239
+ )),
240
+ }));
241
+ const sessions = rows?.sessions ?? null;
222
242
  if (!sessions || sessions.length === 0) return null;
223
243
  const session = sessions[0];
224
-
225
- const messages = runOpenCodeDb<OpenCodeMessageRow>(
226
- `SELECT id, session_id, time_created, time_updated, data FROM message WHERE session_id = '${sessionId}' ORDER BY time_created ASC`,
227
- );
228
- const parts = runOpenCodeDb<OpenCodePartRow>(
229
- `SELECT id, message_id, session_id, time_created, time_updated, data FROM part WHERE session_id = '${sessionId}' ORDER BY time_created ASC`,
230
- );
244
+ const messages = rows?.messages ?? null;
245
+ const parts = rows?.parts ?? null;
231
246
  if (!messages) return { entries: [], rawLines: [], cwd: session.directory ?? undefined, filePath: `opencode://${sessionId}` };
232
247
 
233
248
  // Group parts by message_id for O(1) lookup.
@@ -289,20 +304,28 @@ export interface OpenCodeSessionExportData {
289
304
 
290
305
  export async function getOpenCodeSessionExport(sessionId: string): Promise<OpenCodeSessionExportData | null> {
291
306
  if (!sessionId || !/^[A-Za-z0-9_-]+$/.test(sessionId)) return null;
292
- const sessions = runOpenCodeDb<OpenCodeSessionRow>(
293
- `SELECT id, project_id, slug, directory, title, time_created, time_updated FROM session WHERE id = '${sessionId}'`,
294
- );
307
+ const rows = await withOpenCodeDb((db) => ({
308
+ sessions: safeQuery(() => db.query<OpenCodeSessionRow>(
309
+ "SELECT id, project_id, slug, directory, title, time_created, time_updated FROM session WHERE id = ?",
310
+ [sessionId],
311
+ )),
312
+ messages: safeQuery(() => db.query<OpenCodeMessageRow>(
313
+ "SELECT id, session_id, time_created, time_updated, data FROM message WHERE session_id = ? ORDER BY time_created ASC",
314
+ [sessionId],
315
+ )),
316
+ parts: safeQuery(() => db.query<OpenCodePartRow>(
317
+ "SELECT id, message_id, session_id, time_created, time_updated, data FROM part WHERE session_id = ? ORDER BY time_created ASC",
318
+ [sessionId],
319
+ )),
320
+ }));
321
+ const sessions = rows?.sessions ?? null;
295
322
  if (!sessions || sessions.length === 0) return null;
296
323
  // Don't coalesce a `null` return (query failure) into `[]` — that would
297
324
  // silently serve an "empty session" export. A genuinely empty session has
298
325
  // an `[]` from the DB; a query failure has `null`. Treat the latter as
299
326
  // not-found so the route returns 404 rather than a misleading 200.
300
- const messages = runOpenCodeDb<OpenCodeMessageRow>(
301
- `SELECT id, session_id, time_created, time_updated, data FROM message WHERE session_id = '${sessionId}' ORDER BY time_created ASC`,
302
- );
303
- const parts = runOpenCodeDb<OpenCodePartRow>(
304
- `SELECT id, message_id, session_id, time_created, time_updated, data FROM part WHERE session_id = '${sessionId}' ORDER BY time_created ASC`,
305
- );
327
+ const messages = rows?.messages ?? null;
328
+ const parts = rows?.parts ?? null;
306
329
  if (messages === null || parts === null) return null;
307
330
  return {
308
331
  session: sessions[0],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next/env",
3
- "version": "16.3.1",
3
+ "version": "16.3.2",
4
4
  "keywords": [
5
5
  "react",
6
6
  "next",
@@ -139,7 +139,7 @@ var HmrTarget = /*#__PURE__*/ function(HmrTarget) {
139
139
  HmrTarget["Server"] = "server";
140
140
  return HmrTarget;
141
141
  }({});
142
- const nextVersion = "16.3.1";
142
+ const nextVersion = "16.3.2";
143
143
  const ArchName = (0, _os.arch)();
144
144
  const PlatformName = (0, _os.platform)();
145
145
  function infoLog(...args) {
@@ -1620,11 +1620,8 @@ fetchStrategy) {
1620
1620
  rejectRemainingSegmentsInBundle(segments, now + 10 * 1000);
1621
1621
  } else {
1622
1622
  writeSegmentBundleResponse(map, shellResponse, responseSize, segments, segmentCount, now, _types.FetchStrategy.StaticShell, // When the shell IS the full response (no shell/full split), the
1623
- // entries this write fulfills carry full-tier content, so PPR is
1624
- // the strategy that describes it. They're still keyed at the shell
1625
- // vary path: that's the reusable slot, and it serves concrete
1626
- // fallback reads correctly precisely because the shell and concrete
1627
- // variants coincide.
1623
+ // entries this write fulfills carry full-tier content, so PPR is the
1624
+ // strategy that describes it.
1628
1625
  shellResponse === serverResponse ? _types.FetchStrategy.PPR : _types.FetchStrategy.StaticShell);
1629
1626
  }
1630
1627
  } else {
@@ -1739,39 +1736,31 @@ payloadFetchStrategy) {
1739
1736
  // Otherwise the content is only as complete as the static tier it was
1740
1737
  // requested at, so a follow-up runtime request can still supersede it.
1741
1738
  const recordedFetchStrategy = !needsRuntimeRequest ? payloadFetchStrategy === _types.FetchStrategy.StaticShell ? _types.FetchStrategy.RuntimeShell : _types.FetchStrategy.PPRRuntime : fetchStrategy;
1742
- // Determine the vary path to key the segment at. For the full payload,
1743
- // re-key to a more generic path if the server tells us which params the
1744
- // segment varies by.
1745
- const payloadVaryPath = fetchStrategy === _types.FetchStrategy.StaticShell ? node.tree.shellVaryPath : process.env.__NEXT_VARY_PARAMS && varyParams !== null ? (0, _varypath.getFulfilledSegmentVaryPath)(node.tree.varyPath, varyParams) : (0, _varypath.getSegmentVaryPathForRequest)(_types.FetchStrategy.PPR, node.tree);
1739
+ // Key the entry by which params the server said this segment depends on.
1740
+ // Reusing one copy across param values is the point of the shell, but it
1741
+ // requires knowing the content doesn't depend on those params, and the
1742
+ // server's report is the direct evidence of that.
1743
+ //
1744
+ // Without that report, assume every param varies. The exception is a
1745
+ // shell variant, which reduces param-dependent content to param
1746
+ // fallbacks, so it really is good for any value of them.
1747
+ const payloadVaryPath = process.env.__NEXT_VARY_PARAMS && varyParams !== null ? (0, _varypath.getFulfilledSegmentVaryPath)(node.tree.varyPath, varyParams) : (0, _varypath.getSegmentVaryPathForRequest)(payloadFetchStrategy, node.tree);
1746
1748
  const nodeEntry = node.entry;
1747
1749
  if (nodeEntry !== null && nodeEntry.status === _cachemap.EntryStatus.Pending) {
1748
1750
  // We own this entry — fulfill it directly.
1749
1751
  const fulfilledEntry = fulfillSegmentCacheEntry(nodeEntry, data.rsc, entryStaleAt, isPartial, responseIsUpgradeableISRFallback, recordedFetchStrategy);
1750
- if (fetchStrategy === _types.FetchStrategy.StaticShell) {
1751
- // Re-key at the shell vary path, mirroring the RuntimeShell re-key
1752
- // in fulfillEntrySpawnedByRuntimePrefetch. Usually the entry already
1753
- // lives there, but the scheduler can also upgrade a pre-existing
1754
- // Empty entry at a more concrete path in place, so the re-key is
1755
- // load-bearing. The shadow eviction keeps a stale settled entry at
1756
- // a more specific path from hiding the shell entry (the just-written
1757
- // full payload's entry is preferred and survives it). Routed through
1758
- // the upsert rather than a bare set so the usual precedence rules
1759
- // apply: a concurrent task's response (e.g. a RuntimeShell entry)
1760
- // can land in the shell slot first, and this write must not
1761
- // downgrade it. (In the common case the slot already holds this
1762
- // very entry, which the upsert replaces in place.)
1763
- if (process.env.__NEXT_VARY_PARAMS) {
1764
- upsertSegmentEntry(now, map, node.tree.shellVaryPath, fulfilledEntry, node.tree.varyPath);
1765
- }
1766
- } else {
1767
- // Set the fulfilled entry into the canonical cache slot. Pass the
1768
- // concrete lookup path — the most specific path a read for this
1769
- // segment position would use — so that if the canonical path is more
1770
- // generic (i.e. the server re-keyed the segment), any stale settled
1771
- // entry at a more specific path (e.g. a partial shell entry) that
1772
- // would shadow this one is evicted. See evictShadowingSegmentEntries.
1773
- upsertSegmentEntry(now, map, payloadVaryPath, fulfilledEntry, node.tree.varyPath);
1774
- }
1752
+ // Move the entry to that key. This is load-bearing rather than a no-op:
1753
+ // a task spawns its entries before it knows what the response will
1754
+ // contain, so the key it guessed can be more reusable than the response
1755
+ // turned out to deserve.
1756
+ //
1757
+ // Pass the concrete lookup path — the most specific path a read for
1758
+ // this segment position would use — so that if the entry lands at a
1759
+ // more generic key, a stale entry at a more specific one can't shadow
1760
+ // it. See evictShadowingSegmentEntries. The upsert (rather than a bare
1761
+ // set) applies the usual precedence rules, so a concurrent task's more
1762
+ // complete response already in this slot isn't downgraded.
1763
+ upsertSegmentEntry(now, map, payloadVaryPath, fulfilledEntry, node.tree.varyPath);
1775
1764
  } else {
1776
1765
  // We don't own this entry. Create a detached entry and attempt to
1777
1766
  // upsert it into this payload's slot.