miclaw-app 0.1.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.
- package/.next/standalone/.next/BUILD_ID +1 -0
- package/.next/standalone/.next/app-path-routes-manifest.json +14 -0
- package/.next/standalone/.next/build-manifest.json +20 -0
- package/.next/standalone/.next/package.json +1 -0
- package/.next/standalone/.next/prerender-manifest.json +282 -0
- package/.next/standalone/.next/required-server-files.json +333 -0
- package/.next/standalone/.next/routes-manifest.json +120 -0
- package/.next/standalone/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/_global-error/page.js +10 -0
- package/.next/standalone/.next/server/app/_global-error/page.js.map +5 -0
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/_global-error.html +1 -0
- package/.next/standalone/.next/server/app/_global-error.meta +15 -0
- package/.next/standalone/.next/server/app/_global-error.rsc +15 -0
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/standalone/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/_not-found/page.js +13 -0
- package/.next/standalone/.next/server/app/_not-found/page.js.map +5 -0
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/_not-found.html +9 -0
- package/.next/standalone/.next/server/app/_not-found.meta +16 -0
- package/.next/standalone/.next/server/app/_not-found.rsc +17 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
- package/.next/standalone/.next/server/app/agents/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/agents/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/agents/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/agents/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/agents/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/agents/page.js +15 -0
- package/.next/standalone/.next/server/app/agents/page.js.map +5 -0
- package/.next/standalone/.next/server/app/agents/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/agents/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/agents.html +30 -0
- package/.next/standalone/.next/server/app/agents.meta +15 -0
- package/.next/standalone/.next/server/app/agents.rsc +345 -0
- package/.next/standalone/.next/server/app/agents.segments/_full.segment.rsc +345 -0
- package/.next/standalone/.next/server/app/agents.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/agents.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/agents.segments/_tree.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +331 -0
- package/.next/standalone/.next/server/app/agents.segments/agents.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/commands/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/commands/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/commands/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/commands/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/commands/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/commands/page.js +15 -0
- package/.next/standalone/.next/server/app/commands/page.js.map +5 -0
- package/.next/standalone/.next/server/app/commands/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/commands/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/commands.html +33 -0
- package/.next/standalone/.next/server/app/commands.meta +15 -0
- package/.next/standalone/.next/server/app/commands.rsc +1672 -0
- package/.next/standalone/.next/server/app/commands.segments/_full.segment.rsc +1672 -0
- package/.next/standalone/.next/server/app/commands.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/commands.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/commands.segments/_tree.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/commands.segments/commands/__PAGE__.segment.rsc +1658 -0
- package/.next/standalone/.next/server/app/commands.segments/commands.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/favicon.ico/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/favicon.ico/route.js +6 -0
- package/.next/standalone/.next/server/app/favicon.ico/route.js.map +5 -0
- package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/favicon.ico.body +0 -0
- package/.next/standalone/.next/server/app/favicon.ico.meta +1 -0
- package/.next/standalone/.next/server/app/hooks/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/hooks/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/hooks/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/hooks/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/hooks/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/hooks/page.js +15 -0
- package/.next/standalone/.next/server/app/hooks/page.js.map +5 -0
- package/.next/standalone/.next/server/app/hooks/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/hooks/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/hooks.html +9 -0
- package/.next/standalone/.next/server/app/hooks.meta +15 -0
- package/.next/standalone/.next/server/app/hooks.rsc +21 -0
- package/.next/standalone/.next/server/app/hooks.segments/_full.segment.rsc +21 -0
- package/.next/standalone/.next/server/app/hooks.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/hooks.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/hooks.segments/_tree.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/hooks.segments/hooks/__PAGE__.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/hooks.segments/hooks.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/index.html +83 -0
- package/.next/standalone/.next/server/app/index.meta +14 -0
- package/.next/standalone/.next/server/app/index.rsc +20 -0
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +8 -0
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +20 -0
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/mcp/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/mcp/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/mcp/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/mcp/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/mcp/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/mcp/page.js +15 -0
- package/.next/standalone/.next/server/app/mcp/page.js.map +5 -0
- package/.next/standalone/.next/server/app/mcp/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/mcp/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/mcp.html +9 -0
- package/.next/standalone/.next/server/app/mcp.meta +15 -0
- package/.next/standalone/.next/server/app/mcp.rsc +23 -0
- package/.next/standalone/.next/server/app/mcp.segments/_full.segment.rsc +23 -0
- package/.next/standalone/.next/server/app/mcp.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/mcp.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/mcp.segments/_tree.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/mcp.segments/mcp/__PAGE__.segment.rsc +8 -0
- package/.next/standalone/.next/server/app/mcp.segments/mcp.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/page.js +15 -0
- package/.next/standalone/.next/server/app/page.js.map +5 -0
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page.js +16 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page.js.map +5 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/rules/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/rules/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/rules/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/rules/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/rules/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/rules/page.js +15 -0
- package/.next/standalone/.next/server/app/rules/page.js.map +5 -0
- package/.next/standalone/.next/server/app/rules/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/rules/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/rules.html +72 -0
- package/.next/standalone/.next/server/app/rules.meta +15 -0
- package/.next/standalone/.next/server/app/rules.rsc +2358 -0
- package/.next/standalone/.next/server/app/rules.segments/_full.segment.rsc +2358 -0
- package/.next/standalone/.next/server/app/rules.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/rules.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/rules.segments/_tree.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/rules.segments/rules/__PAGE__.segment.rsc +2344 -0
- package/.next/standalone/.next/server/app/rules.segments/rules.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/settings/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/settings/page.js +15 -0
- package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/settings.html +56 -0
- package/.next/standalone/.next/server/app/settings.meta +15 -0
- package/.next/standalone/.next/server/app/settings.rsc +226 -0
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +226 -0
- package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +211 -0
- package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/skills/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/skills/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/skills/page/next-font-manifest.json +12 -0
- package/.next/standalone/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/skills/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/skills/page.js +15 -0
- package/.next/standalone/.next/server/app/skills/page.js.map +5 -0
- package/.next/standalone/.next/server/app/skills/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/skills/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/skills.html +30 -0
- package/.next/standalone/.next/server/app/skills.meta +15 -0
- package/.next/standalone/.next/server/app/skills.rsc +1111 -0
- package/.next/standalone/.next/server/app/skills.segments/_full.segment.rsc +1111 -0
- package/.next/standalone/.next/server/app/skills.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/skills.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/skills.segments/_tree.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +1097 -0
- package/.next/standalone/.next/server/app/skills.segments/skills.segment.rsc +5 -0
- package/.next/standalone/.next/server/app-paths-manifest.json +14 -0
- package/.next/standalone/.next/server/chunks/[externals]_next_dist_0arv.vj._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0teziyo._.js +13 -0
- package/.next/standalone/.next/server/chunks/[turbopack]_runtime.js +903 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.pno0_._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06czxzo._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06ipj7k._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08c9t2b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09x1iac._.js +33 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js +19 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0beg-.s._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bm8p5g._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ca-xeh._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dey16.._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0fvw3d8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qk5gqw._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s0h9e0._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0u-t242._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xl6e~c._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xrk31o._.js +33 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0y_d026._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
- package/.next/standalone/.next/server/chunks/ssr/_09kkdgy._.js +6 -0
- package/.next/standalone/.next/server/chunks/ssr/_0g8yqoe._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_agents_page_actions_07l1ss4.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_commands_page_actions_0npst50.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_hooks_page_actions_0a_tx-6.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_mcp_page_actions_00_op~_.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_projects_[slug]_page_actions_0xg3f7c.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_rules_page_actions_0xcrbur.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_skills_page_actions_0cxzzu-.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_09w7yel._.js +33 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0sy8gnb._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js +6 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03-z2qq.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_071geea.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_07vh7rm.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_08617.g.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dlz56b.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0fnc180.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0iktlcc.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qp4u6g.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0t-uic4.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v9mjz4.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/src_components_ExpandableBody_tsx_0-ivqwg._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_components_SphereView_tsx_0q2ope8._.js +13 -0
- package/.next/standalone/.next/server/functions-config-manifest.json +4 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +20 -0
- package/.next/standalone/.next/server/middleware-manifest.json +6 -0
- package/.next/standalone/.next/server/next-font-manifest.js +1 -0
- package/.next/standalone/.next/server/next-font-manifest.json +57 -0
- package/.next/standalone/.next/server/pages/404.html +9 -0
- package/.next/standalone/.next/server/pages/500.html +1 -0
- package/.next/standalone/.next/server/pages-manifest.json +4 -0
- package/.next/standalone/.next/server/prefetch-hints.json +1 -0
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/server-reference-manifest.json +5 -0
- package/.next/standalone/node_modules/@img/colour/color.cjs +1596 -0
- package/.next/standalone/node_modules/@img/colour/index.cjs +1 -0
- package/.next/standalone/node_modules/@img/colour/package.json +58 -0
- package/.next/standalone/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-darwin-arm64/package.json +40 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/README.md +46 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/glib-2.0/include/glibconfig.h +220 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/index.js +1 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/package.json +36 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/versions.json +30 -0
- package/.next/standalone/node_modules/@next/env/dist/index.js +1 -0
- package/.next/standalone/node_modules/@next/env/package.json +36 -0
- package/.next/standalone/node_modules/@swc/helpers/cjs/_interop_require_default.cjs +6 -0
- package/.next/standalone/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs +38 -0
- package/.next/standalone/node_modules/@swc/helpers/package.json +471 -0
- package/.next/standalone/node_modules/client-only/index.js +0 -0
- package/.next/standalone/node_modules/client-only/package.json +19 -0
- package/.next/standalone/node_modules/detect-libc/lib/detect-libc.js +313 -0
- package/.next/standalone/node_modules/detect-libc/lib/elf.js +39 -0
- package/.next/standalone/node_modules/detect-libc/lib/filesystem.js +51 -0
- package/.next/standalone/node_modules/detect-libc/lib/process.js +24 -0
- package/.next/standalone/node_modules/detect-libc/package.json +44 -0
- package/.next/standalone/node_modules/next/dist/build/adapter/setup-node-env.external.js +15 -0
- package/.next/standalone/node_modules/next/dist/build/define-env.js +255 -0
- package/.next/standalone/node_modules/next/dist/build/duration-to-string.js +99 -0
- package/.next/standalone/node_modules/next/dist/build/get-supported-browsers.js +38 -0
- package/.next/standalone/node_modules/next/dist/build/next-config-ts/require-hook.js +85 -0
- package/.next/standalone/node_modules/next/dist/build/next-config-ts/transpile-config.js +251 -0
- package/.next/standalone/node_modules/next/dist/build/output/format.js +84 -0
- package/.next/standalone/node_modules/next/dist/build/output/log.js +135 -0
- package/.next/standalone/node_modules/next/dist/build/segment-config/app/app-segment-config.js +162 -0
- package/.next/standalone/node_modules/next/dist/build/segment-config/app/app-segments.js +137 -0
- package/.next/standalone/node_modules/next/dist/build/segment-config/app/collect-root-param-keys.js +52 -0
- package/.next/standalone/node_modules/next/dist/build/static-paths/app/extract-pathname-route-param-segments-from-loader-tree.js +137 -0
- package/.next/standalone/node_modules/next/dist/build/static-paths/app.js +735 -0
- package/.next/standalone/node_modules/next/dist/build/static-paths/pages.js +169 -0
- package/.next/standalone/node_modules/next/dist/build/static-paths/utils.js +119 -0
- package/.next/standalone/node_modules/next/dist/build/swc/helpers.js +15 -0
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1348 -0
- package/.next/standalone/node_modules/next/dist/build/swc/install-bindings.js +30 -0
- package/.next/standalone/node_modules/next/dist/build/swc/jest-transformer.js +76 -0
- package/.next/standalone/node_modules/next/dist/build/swc/loaderWorkerPool.js +40 -0
- package/.next/standalone/node_modules/next/dist/build/swc/options.js +403 -0
- package/.next/standalone/node_modules/next/dist/build/swc/types.js +6 -0
- package/.next/standalone/node_modules/next/dist/build/utils.js +1215 -0
- package/.next/standalone/node_modules/next/dist/cli/next-test.js +170 -0
- package/.next/standalone/node_modules/next/dist/client/add-base-path.js +24 -0
- package/.next/standalone/node_modules/next/dist/client/app-call-server.js +34 -0
- package/.next/standalone/node_modules/next/dist/client/app-find-source-map-url.js +39 -0
- package/.next/standalone/node_modules/next/dist/client/assign-location.js +29 -0
- package/.next/standalone/node_modules/next/dist/client/components/app-router-announcer.js +78 -0
- package/.next/standalone/node_modules/next/dist/client/components/app-router-headers.js +138 -0
- package/.next/standalone/node_modules/next/dist/client/components/app-router-instance.js +397 -0
- package/.next/standalone/node_modules/next/dist/client/components/app-router-utils.js +62 -0
- package/.next/standalone/node_modules/next/dist/client/components/app-router.js +514 -0
- package/.next/standalone/node_modules/next/dist/client/components/builtin/default.js +35 -0
- package/.next/standalone/node_modules/next/dist/client/components/builtin/error-styles.js +165 -0
- package/.next/standalone/node_modules/next/dist/client/components/builtin/global-error.js +100 -0
- package/.next/standalone/node_modules/next/dist/client/components/dev-root-http-access-fallback-boundary.js +52 -0
- package/.next/standalone/node_modules/next/dist/client/components/error-boundary.js +144 -0
- package/.next/standalone/node_modules/next/dist/client/components/errors/graceful-degrade-boundary.js +86 -0
- package/.next/standalone/node_modules/next/dist/client/components/errors/root-error-boundary.js +41 -0
- package/.next/standalone/node_modules/next/dist/client/components/forbidden.js +48 -0
- package/.next/standalone/node_modules/next/dist/client/components/handle-isr-error.js +30 -0
- package/.next/standalone/node_modules/next/dist/client/components/hooks-server-context.js +42 -0
- package/.next/standalone/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js +125 -0
- package/.next/standalone/node_modules/next/dist/client/components/http-access-fallback/http-access-fallback.js +72 -0
- package/.next/standalone/node_modules/next/dist/client/components/is-next-router-error.js +23 -0
- package/.next/standalone/node_modules/next/dist/client/components/links.js +299 -0
- package/.next/standalone/node_modules/next/dist/client/components/match-segments.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/components/nav-failure-handler.js +61 -0
- package/.next/standalone/node_modules/next/dist/client/components/navigation-devtools.js +126 -0
- package/.next/standalone/node_modules/next/dist/client/components/navigation-untracked.js +67 -0
- package/.next/standalone/node_modules/next/dist/client/components/navigation.js +225 -0
- package/.next/standalone/node_modules/next/dist/client/components/navigation.react-server.js +75 -0
- package/.next/standalone/node_modules/next/dist/client/components/not-found.js +42 -0
- package/.next/standalone/node_modules/next/dist/client/components/readonly-url-search-params.js +41 -0
- package/.next/standalone/node_modules/next/dist/client/components/redirect-boundary.js +107 -0
- package/.next/standalone/node_modules/next/dist/client/components/redirect-error.js +43 -0
- package/.next/standalone/node_modules/next/dist/client/components/redirect-status-code.js +24 -0
- package/.next/standalone/node_modules/next/dist/client/components/redirect.js +91 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/compute-changed-path.js +201 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/create-href-from-url.js +21 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/create-initial-router-state.js +153 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/create-router-cache-key.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/fetch-server-response.js +457 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/is-navigating-to-new-root-layout.js +59 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/ppr-navigations.js +1341 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/committed-state.js +49 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/find-head-in-cache.js +63 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/has-interception-route-in-current-tree.js +38 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/hmr-refresh-reducer.js +23 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/navigate-reducer.js +56 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/refresh-reducer.js +83 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/restore-reducer.js +62 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/server-action-reducer.js +320 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/server-patch-reducer.js +58 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/router-reducer-types.js +70 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/router-reducer.js +66 -0
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/set-cache-busting-search-param.js +60 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/bfcache.js +128 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/cache-key.js +28 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/cache-map.js +305 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/cache.js +1933 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/lru.js +152 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/navigation-testing-lock.js +194 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/navigation.js +597 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/optimistic-routes.js +543 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/prefetch.js +31 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/scheduler.js +1249 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/types.js +69 -0
- package/.next/standalone/node_modules/next/dist/client/components/segment-cache/vary-path.js +278 -0
- package/.next/standalone/node_modules/next/dist/client/components/static-generation-bailout.js +42 -0
- package/.next/standalone/node_modules/next/dist/client/components/unauthorized.js +49 -0
- package/.next/standalone/node_modules/next/dist/client/components/unrecognized-action-error.js +39 -0
- package/.next/standalone/node_modules/next/dist/client/components/unresolved-thenable.js +23 -0
- package/.next/standalone/node_modules/next/dist/client/components/unstable-rethrow.browser.js +28 -0
- package/.next/standalone/node_modules/next/dist/client/components/unstable-rethrow.js +25 -0
- package/.next/standalone/node_modules/next/dist/client/components/unstable-rethrow.server.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/components/use-action-queue.js +148 -0
- package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +72 -0
- package/.next/standalone/node_modules/next/dist/client/flight-data-helpers.js +232 -0
- package/.next/standalone/node_modules/next/dist/client/has-base-path.js +23 -0
- package/.next/standalone/node_modules/next/dist/client/lib/console.js +177 -0
- package/.next/standalone/node_modules/next/dist/client/lib/javascript-url.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/navigation-build-id.js +53 -0
- package/.next/standalone/node_modules/next/dist/client/normalize-trailing-slash.js +36 -0
- package/.next/standalone/node_modules/next/dist/client/remove-base-path.js +32 -0
- package/.next/standalone/node_modules/next/dist/client/route-params.js +230 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/cookies/index.js +339 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/cookies/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/ponyfill/index.js +46 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/ponyfill/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/abort-controller.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/console.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/events.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/index.js +5 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/load.js +18713 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/stream.js +44 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/timers.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/url.js.text.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@hapi/accept/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@hapi/accept/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@mswjs/interceptors/ClientRequest/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@mswjs/interceptors/ClientRequest/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@napi-rs/triples/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@napi-rs/triples/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@opentelemetry/api/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/@opentelemetry/api/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/async-retry/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/async-retry/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/async-sema/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/async-sema/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/busboy/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/busboy/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/bytes/index.js +8 -0
- package/.next/standalone/node_modules/next/dist/compiled/bytes/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ci-info/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ci-info/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/commander/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/commander/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/comment-json/index.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/comment-json/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/compression/index.js +58 -0
- package/.next/standalone/node_modules/next/dist/compiled/compression/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/conf/index.js +15 -0
- package/.next/standalone/node_modules/next/dist/compiled/conf/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/content-disposition/index.js +6 -0
- package/.next/standalone/node_modules/next/dist/compiled/content-disposition/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/cookie/index.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/cookie/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/cross-spawn/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/cross-spawn/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/debug/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/debug/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/edge-runtime/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/edge-runtime/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/find-up/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/find-up/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/fresh/index.js +8 -0
- package/.next/standalone/node_modules/next/dist/compiled/fresh/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/http-proxy/index.js +34 -0
- package/.next/standalone/node_modules/next/dist/compiled/http-proxy/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/image-detector/detector.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/image-size/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/image-size/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ipaddr.js/ipaddr.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ipaddr.js/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-animated/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-animated/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-docker/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-docker/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-wsl/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/is-wsl/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/jsonwebtoken/index.js +11 -0
- package/.next/standalone/node_modules/next/dist/compiled/jsonwebtoken/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/nanoid/index.cjs +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/nanoid/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +54 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +54 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +6 -0
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +20 -0
- package/.next/standalone/node_modules/next/dist/compiled/p-limit/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/p-limit/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/p-queue/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/p-queue/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/path-browserify/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/path-browserify/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/path-to-regexp/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/path-to-regexp/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/picomatch/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/picomatch/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-is/cjs/react-is.development.js +133 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-is/cjs/react-is.production.js +130 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-is/index.js +7 -0
- package/.next/standalone/node_modules/next/dist/compiled/react-is/package.json +26 -0
- package/.next/standalone/node_modules/next/dist/compiled/regenerator-runtime/package.json +19 -0
- package/.next/standalone/node_modules/next/dist/compiled/regenerator-runtime/runtime.js +729 -0
- package/.next/standalone/node_modules/next/dist/compiled/semver/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/semver/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/send/index.js +70 -0
- package/.next/standalone/node_modules/next/dist/compiled/send/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/source-map/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/source-map/source-map.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/stacktrace-parser/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/stacktrace-parser/stack-trace-parser.cjs.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/string-hash/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/string-hash/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/strip-ansi/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/strip-ansi/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/superstruct/index.cjs +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/superstruct/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/tar/index.min.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/tar/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/text-table/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/text-table/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/watchpack/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/watchpack/watchpack.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ws/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/ws/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/zod/index.cjs +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/zod/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/zod-validation-error/index.js +1 -0
- package/.next/standalone/node_modules/next/dist/compiled/zod-validation-error/package.json +1 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/context.js +57 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/fetch.js +142 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/httpget.js +26 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/server-edge.js +32 -0
- package/.next/standalone/node_modules/next/dist/experimental/testmode/server.js +62 -0
- package/.next/standalone/node_modules/next/dist/export/helpers/create-incremental-cache.js +61 -0
- package/.next/standalone/node_modules/next/dist/lib/batcher.js +65 -0
- package/.next/standalone/node_modules/next/dist/lib/build-custom-route.js +46 -0
- package/.next/standalone/node_modules/next/dist/lib/bundler.js +97 -0
- package/.next/standalone/node_modules/next/dist/lib/client-and-server-references.js +54 -0
- package/.next/standalone/node_modules/next/dist/lib/coalesced-function.js +39 -0
- package/.next/standalone/node_modules/next/dist/lib/compile-error.js +14 -0
- package/.next/standalone/node_modules/next/dist/lib/constants.js +420 -0
- package/.next/standalone/node_modules/next/dist/lib/create-client-router-filter.js +67 -0
- package/.next/standalone/node_modules/next/dist/lib/default-transpiled-packages.json +1 -0
- package/.next/standalone/node_modules/next/dist/lib/detached-promise.js +32 -0
- package/.next/standalone/node_modules/next/dist/lib/detect-typo.js +51 -0
- package/.next/standalone/node_modules/next/dist/lib/download-swc.js +183 -0
- package/.next/standalone/node_modules/next/dist/lib/error-telemetry-utils.js +42 -0
- package/.next/standalone/node_modules/next/dist/lib/fallback.js +100 -0
- package/.next/standalone/node_modules/next/dist/lib/fatal-error.js +14 -0
- package/.next/standalone/node_modules/next/dist/lib/file-exists.js +53 -0
- package/.next/standalone/node_modules/next/dist/lib/find-config.js +102 -0
- package/.next/standalone/node_modules/next/dist/lib/find-pages-dir.js +65 -0
- package/.next/standalone/node_modules/next/dist/lib/find-root.js +126 -0
- package/.next/standalone/node_modules/next/dist/lib/format-cli-help-output.js +84 -0
- package/.next/standalone/node_modules/next/dist/lib/format-dynamic-import-path.js +24 -0
- package/.next/standalone/node_modules/next/dist/lib/format-server-error.js +75 -0
- package/.next/standalone/node_modules/next/dist/lib/framework/boundary-components.js +62 -0
- package/.next/standalone/node_modules/next/dist/lib/framework/boundary-constants.js +36 -0
- package/.next/standalone/node_modules/next/dist/lib/fs/rename.js +87 -0
- package/.next/standalone/node_modules/next/dist/lib/fs/write-atomic.js +28 -0
- package/.next/standalone/node_modules/next/dist/lib/generate-interception-routes-rewrites.js +52 -0
- package/.next/standalone/node_modules/next/dist/lib/get-files-in-dir.js +33 -0
- package/.next/standalone/node_modules/next/dist/lib/get-network-host.js +44 -0
- package/.next/standalone/node_modules/next/dist/lib/get-package-version.js +118 -0
- package/.next/standalone/node_modules/next/dist/lib/get-project-dir.js +51 -0
- package/.next/standalone/node_modules/next/dist/lib/has-necessary-dependencies.js +49 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-cache-directory.js +66 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-npx-command.js +29 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-online.js +50 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-pkg-manager.js +63 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-registry.js +45 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/get-reserved-port.js +116 -0
- package/.next/standalone/node_modules/next/dist/lib/helpers/install.js +83 -0
- package/.next/standalone/node_modules/next/dist/lib/import-next-warning.js +50 -0
- package/.next/standalone/node_modules/next/dist/lib/inline-static-env.js +112 -0
- package/.next/standalone/node_modules/next/dist/lib/install-dependencies.js +40 -0
- package/.next/standalone/node_modules/next/dist/lib/interop-default.js +16 -0
- package/.next/standalone/node_modules/next/dist/lib/is-api-route.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/is-app-page-route.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/is-app-route-route.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/is-edge-runtime.js +16 -0
- package/.next/standalone/node_modules/next/dist/lib/is-error.js +78 -0
- package/.next/standalone/node_modules/next/dist/lib/is-interception-route-rewrite.js +18 -0
- package/.next/standalone/node_modules/next/dist/lib/is-internal-component.js +36 -0
- package/.next/standalone/node_modules/next/dist/lib/is-serializable-props.js +106 -0
- package/.next/standalone/node_modules/next/dist/lib/known-edge-safe-packages.json +1 -0
- package/.next/standalone/node_modules/next/dist/lib/load-custom-routes.js +594 -0
- package/.next/standalone/node_modules/next/dist/lib/memory/gc-observer.js +53 -0
- package/.next/standalone/node_modules/next/dist/lib/memory/shutdown.js +29 -0
- package/.next/standalone/node_modules/next/dist/lib/memory/startup.js +47 -0
- package/.next/standalone/node_modules/next/dist/lib/memory/trace.js +109 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/constants.js +40 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/default-metadata.js +82 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/generate/icon-mark.js +22 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/generate/utils.js +52 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/get-metadata-route.js +123 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/is-metadata-route.js +221 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/metadata-context.js +18 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/metadata.js +1686 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolve-metadata.js +884 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-basics.js +232 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-icons.js +56 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-opengraph.js +199 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-title.js +40 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-url.js +135 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/alternative-urls-types.js +7 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/extra-types.js +9 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/icons.js +6 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/manifest-types.js +6 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/metadata-interface.js +18 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/metadata-types.js +10 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/opengraph-types.js +6 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/resolvers.js +6 -0
- package/.next/standalone/node_modules/next/dist/lib/metadata/types/twitter-types.js +7 -0
- package/.next/standalone/node_modules/next/dist/lib/mime-type.js +20 -0
- package/.next/standalone/node_modules/next/dist/lib/mkcert.js +204 -0
- package/.next/standalone/node_modules/next/dist/lib/multi-file-writer.js +75 -0
- package/.next/standalone/node_modules/next/dist/lib/needs-experimental-react.js +16 -0
- package/.next/standalone/node_modules/next/dist/lib/non-nullable.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/normalize-path.js +21 -0
- package/.next/standalone/node_modules/next/dist/lib/oxford-comma-list.js +15 -0
- package/.next/standalone/node_modules/next/dist/lib/page-types.js +18 -0
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +185 -0
- package/.next/standalone/node_modules/next/dist/lib/pick.js +19 -0
- package/.next/standalone/node_modules/next/dist/lib/picocolors.js +177 -0
- package/.next/standalone/node_modules/next/dist/lib/pretty-bytes.js +74 -0
- package/.next/standalone/node_modules/next/dist/lib/realpath.js +20 -0
- package/.next/standalone/node_modules/next/dist/lib/recursive-copy.js +76 -0
- package/.next/standalone/node_modules/next/dist/lib/recursive-delete.js +137 -0
- package/.next/standalone/node_modules/next/dist/lib/recursive-readdir.js +124 -0
- package/.next/standalone/node_modules/next/dist/lib/redirect-status.js +46 -0
- package/.next/standalone/node_modules/next/dist/lib/require-instrumentation-client.js +26 -0
- package/.next/standalone/node_modules/next/dist/lib/resolve-build-paths.js +154 -0
- package/.next/standalone/node_modules/next/dist/lib/resolve-from.js +65 -0
- package/.next/standalone/node_modules/next/dist/lib/route-pattern-normalizer.js +107 -0
- package/.next/standalone/node_modules/next/dist/lib/scheduler.js +64 -0
- package/.next/standalone/node_modules/next/dist/lib/semver-noop.js +18 -0
- package/.next/standalone/node_modules/next/dist/lib/server-external-packages.jsonc +103 -0
- package/.next/standalone/node_modules/next/dist/lib/setup-exception-listeners.js +11 -0
- package/.next/standalone/node_modules/next/dist/lib/static-env.js +92 -0
- package/.next/standalone/node_modules/next/dist/lib/try-to-parse-path.js +67 -0
- package/.next/standalone/node_modules/next/dist/lib/turbopack-warning.js +185 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/diagnosticFormatter.js +243 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/getTypeScriptConfiguration.js +153 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/getTypeScriptIntent.js +52 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/missingDependencyError.js +27 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/runTypeCheck.js +149 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/type-paths.js +51 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/writeAppTypeDeclarations.js +75 -0
- package/.next/standalone/node_modules/next/dist/lib/typescript/writeConfigurationDefaults.js +395 -0
- package/.next/standalone/node_modules/next/dist/lib/url.js +75 -0
- package/.next/standalone/node_modules/next/dist/lib/verify-partytown-setup.js +115 -0
- package/.next/standalone/node_modules/next/dist/lib/verify-root-layout.js +165 -0
- package/.next/standalone/node_modules/next/dist/lib/verify-typescript-setup.js +228 -0
- package/.next/standalone/node_modules/next/dist/lib/wait.js +19 -0
- package/.next/standalone/node_modules/next/dist/lib/with-promise-cache.js +24 -0
- package/.next/standalone/node_modules/next/dist/lib/worker.js +234 -0
- package/.next/standalone/node_modules/next/dist/server/ReactDOMServerPages.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/accept-header.js +132 -0
- package/.next/standalone/node_modules/next/dist/server/after/after-context.js +140 -0
- package/.next/standalone/node_modules/next/dist/server/after/after.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/after/awaiter.js +74 -0
- package/.next/standalone/node_modules/next/dist/server/after/builtin-request-context.js +38 -0
- package/.next/standalone/node_modules/next/dist/server/after/index.js +21 -0
- package/.next/standalone/node_modules/next/dist/server/after/run-with-after.js +35 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/get-cookie-parser.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/index.js +201 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/node/api-resolver.js +395 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/node/parse-body.js +79 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/node/try-get-preview-data.js +86 -0
- package/.next/standalone/node_modules/next/dist/server/api-utils/web.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/action-async-storage-instance.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/action-async-storage.external.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +1020 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/after-task-async-storage-instance.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/after-task-async-storage.external.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/app-render-prerender-utils.js +167 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/app-render-render-utils.js +76 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/app-render-scheduling.js +188 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/app-render.js +4469 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/async-local-storage.js +76 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/cache-signal.js +181 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/collect-segment-data.js +600 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/console-async-storage-instance.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/console-async-storage.external.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-component-styles-and-scripts.js +33 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-component-tree.js +840 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-error-handler.js +189 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-flight-router-state-from-loader-tree.js +102 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/csrf-protection.js +86 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/debug-channel-server.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/debug-channel-server.web.js +71 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering.js +1144 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/encryption-utils-server.js +114 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/encryption-utils.js +93 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/encryption.js +259 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/entry-base.js +256 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/flight-render-result.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-asset-query-string.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-css-inlined-link-tags.js +49 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-layer-assets.js +65 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-preloadable-fonts.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-script-nonce-from-header.js +44 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/get-short-dynamic-param-type.js +25 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/has-loading-component-in-tree.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/boundary-constants.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/boundary-impl.js +103 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-config.js +181 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-samples-client.js +128 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-samples.js +432 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.js +33 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-validation.js +713 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/stream-utils.js +96 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/interop-default.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/make-get-server-inserted-html.js +92 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/manifests-singleton.js +264 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/metadata-insertion/create-server-inserted-metadata.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/module-loading/track-dynamic-import.js +57 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js +32 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js +66 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/parse-and-validate-flight-router-state.js +49 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/postponed-state.js +157 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/prospective-render-utils.js +74 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/react-large-shell-error.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/react-server.node.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/render-css-resource.js +52 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/required-scripts.js +76 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/rsc/postpone.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/rsc/preloads.js +74 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/rsc/taint.js +79 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/segment-explorer-path.js +128 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/server-inserted-html.js +77 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/staged-rendering.js +343 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/stale-time.js +111 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/stream-ops.js +106 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/stream-ops.web.js +163 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/strip-flight-headers.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/types.js +65 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/use-flight-response.js +214 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/vary-params.js +336 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/walk-tree-with-flight-router-state.js +232 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/work-async-storage-instance.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/work-async-storage.external.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/work-unit-async-storage.external.js +280 -0
- package/.next/standalone/node_modules/next/dist/server/async-storage/draft-mode-provider.js +62 -0
- package/.next/standalone/node_modules/next/dist/server/async-storage/request-store.js +144 -0
- package/.next/standalone/node_modules/next/dist/server/async-storage/with-store.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/async-storage/work-store.js +91 -0
- package/.next/standalone/node_modules/next/dist/server/base-http/helpers.js +36 -0
- package/.next/standalone/node_modules/next/dist/server/base-http/index.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/base-http/node.js +147 -0
- package/.next/standalone/node_modules/next/dist/server/base-http/web.js +124 -0
- package/.next/standalone/node_modules/next/dist/server/base-server.js +1874 -0
- package/.next/standalone/node_modules/next/dist/server/body-streams.js +114 -0
- package/.next/standalone/node_modules/next/dist/server/cache-dir.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/capsize-font-metrics.json +181516 -0
- package/.next/standalone/node_modules/next/dist/server/ci-info.js +41 -0
- package/.next/standalone/node_modules/next/dist/server/client-component-renderer-logger.js +70 -0
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +718 -0
- package/.next/standalone/node_modules/next/dist/server/config-shared.js +369 -0
- package/.next/standalone/node_modules/next/dist/server/config-utils.js +185 -0
- package/.next/standalone/node_modules/next/dist/server/config.js +1545 -0
- package/.next/standalone/node_modules/next/dist/server/create-deduped-by-callsite-server-error-logger.js +96 -0
- package/.next/standalone/node_modules/next/dist/server/crypto-utils.js +70 -0
- package/.next/standalone/node_modules/next/dist/server/dev/browser-logs/file-logger.js +186 -0
- package/.next/standalone/node_modules/next/dist/server/dev/browser-logs/receive-logs.js +558 -0
- package/.next/standalone/node_modules/next/dist/server/dev/browser-logs/source-map.js +222 -0
- package/.next/standalone/node_modules/next/dist/server/dev/debug-channel.js +87 -0
- package/.next/standalone/node_modules/next/dist/server/dev/dev-indicator-server-state.js +15 -0
- package/.next/standalone/node_modules/next/dist/server/dev/get-source-map-from-file.js +100 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-middleware.js +274 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-rspack.js +171 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-shared-utils.js +56 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +1475 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-types.js +58 -0
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1386 -0
- package/.next/standalone/node_modules/next/dist/server/dev/log-requests.js +149 -0
- package/.next/standalone/node_modules/next/dist/server/dev/messages.js +74 -0
- package/.next/standalone/node_modules/next/dist/server/dev/middleware-turbopack.js +403 -0
- package/.next/standalone/node_modules/next/dist/server/dev/middleware-webpack.js +483 -0
- package/.next/standalone/node_modules/next/dist/server/dev/node-stack-frames.js +72 -0
- package/.next/standalone/node_modules/next/dist/server/dev/on-demand-entry-handler.js +773 -0
- package/.next/standalone/node_modules/next/dist/server/dev/parse-version-info.js +108 -0
- package/.next/standalone/node_modules/next/dist/server/dev/require-cache.js +79 -0
- package/.next/standalone/node_modules/next/dist/server/dev/serialized-errors.js +67 -0
- package/.next/standalone/node_modules/next/dist/server/dev/server-action-logger.js +37 -0
- package/.next/standalone/node_modules/next/dist/server/dev/static-paths-worker.js +104 -0
- package/.next/standalone/node_modules/next/dist/server/dev/turbopack-utils.js +687 -0
- package/.next/standalone/node_modules/next/dist/server/dynamic-rendering-utils.js +108 -0
- package/.next/standalone/node_modules/next/dist/server/font-utils.js +43 -0
- package/.next/standalone/node_modules/next/dist/server/get-app-route-from-entrypoint.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/get-page-files.js +23 -0
- package/.next/standalone/node_modules/next/dist/server/get-route-from-entrypoint.js +35 -0
- package/.next/standalone/node_modules/next/dist/server/htmlescape.js +37 -0
- package/.next/standalone/node_modules/next/dist/server/image-optimizer.js +1220 -0
- package/.next/standalone/node_modules/next/dist/server/instrumentation/types.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/instrumentation/utils.js +21 -0
- package/.next/standalone/node_modules/next/dist/server/internal-utils.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/is-private-ip.js +36 -0
- package/.next/standalone/node_modules/next/dist/server/lib/app-dir-module.js +59 -0
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +132 -0
- package/.next/standalone/node_modules/next/dist/server/lib/async-callback-set.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/lib/cache-control.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/lib/cache-handlers/default.external.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/lib/cache-handlers/default.js +160 -0
- package/.next/standalone/node_modules/next/dist/server/lib/cache-handlers/types.js +8 -0
- package/.next/standalone/node_modules/next/dist/server/lib/chrome-devtools-workspace.js +116 -0
- package/.next/standalone/node_modules/next/dist/server/lib/clone-response.js +77 -0
- package/.next/standalone/node_modules/next/dist/server/lib/cpu-profile.js +59 -0
- package/.next/standalone/node_modules/next/dist/server/lib/decode-query-path-parameter.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/lib/dedupe-fetch.js +163 -0
- package/.next/standalone/node_modules/next/dist/server/lib/dev-bundler-service.js +95 -0
- package/.next/standalone/node_modules/next/dist/server/lib/disk-lru-cache.external.js +57 -0
- package/.next/standalone/node_modules/next/dist/server/lib/etag.js +56 -0
- package/.next/standalone/node_modules/next/dist/server/lib/experimental/create-env-definitions.js +48 -0
- package/.next/standalone/node_modules/next/dist/server/lib/experimental/ppr.js +47 -0
- package/.next/standalone/node_modules/next/dist/server/lib/find-page-file.js +147 -0
- package/.next/standalone/node_modules/next/dist/server/lib/fix-mojibake.js +25 -0
- package/.next/standalone/node_modules/next/dist/server/lib/format-hostname.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/lib/i18n-provider.js +129 -0
- package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +77 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/file-system-cache.js +335 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/index.js +501 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js +57 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js +73 -0
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/lib/install-code-frame.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/lib/is-ipv6.js +41 -0
- package/.next/standalone/node_modules/next/dist/server/lib/lazy-result.js +46 -0
- package/.next/standalone/node_modules/next/dist/server/lib/lru-cache.js +191 -0
- package/.next/standalone/node_modules/next/dist/server/lib/match-next-data-pathname.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/lib/mock-request.js +416 -0
- package/.next/standalone/node_modules/next/dist/server/lib/module-loader/module-loader.js +8 -0
- package/.next/standalone/node_modules/next/dist/server/lib/module-loader/node-module-loader.js +25 -0
- package/.next/standalone/node_modules/next/dist/server/lib/module-loader/route-module-loader.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/lib/node-fs-methods.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/lib/parse-stack.js +46 -0
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +978 -0
- package/.next/standalone/node_modules/next/dist/server/lib/patch-set-header.js +38 -0
- package/.next/standalone/node_modules/next/dist/server/lib/postponed-request-body.js +64 -0
- package/.next/standalone/node_modules/next/dist/server/lib/render-server.js +155 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +696 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/block-cross-site-dev.js +110 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/build-data-route.js +48 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.js +50 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/cache-life-type-utils.js +211 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/decode-path-params.js +42 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/filesystem.js +591 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js +89 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js +96 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/is-postpone.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/proxy-request.js +118 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/resolve-routes.js +629 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/route-types-utils.js +286 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/router-server-context.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/typegen.js +858 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/types.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/lib/server-action-request-meta.js +53 -0
- package/.next/standalone/node_modules/next/dist/server/lib/server-ipc/utils.js +81 -0
- package/.next/standalone/node_modules/next/dist/server/lib/source-maps.js +196 -0
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +494 -0
- package/.next/standalone/node_modules/next/dist/server/lib/streaming-metadata.js +38 -0
- package/.next/standalone/node_modules/next/dist/server/lib/to-route.js +37 -0
- package/.next/standalone/node_modules/next/dist/server/lib/trace/constants.js +203 -0
- package/.next/standalone/node_modules/next/dist/server/lib/trace/tracer.js +280 -0
- package/.next/standalone/node_modules/next/dist/server/lib/trace/utils.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/lib/types.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/lib/utils.js +278 -0
- package/.next/standalone/node_modules/next/dist/server/lib/worker-utils.js +36 -0
- package/.next/standalone/node_modules/next/dist/server/load-components.js +179 -0
- package/.next/standalone/node_modules/next/dist/server/load-default-error-components.js +41 -0
- package/.next/standalone/node_modules/next/dist/server/load-manifest.external.js +117 -0
- package/.next/standalone/node_modules/next/dist/server/match-bundle.js +25 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/get-mcp-middleware.js +49 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/get-or-create-mcp-server.js +41 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/mcp-telemetry-tracker.js +82 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-errors.js +114 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-logs.js +67 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-page-metadata.js +188 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-project-metadata.js +59 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-routes.js +136 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-server-action-by-id.js +121 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/next-instance-error-state.js +31 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/utils/browser-communication.js +90 -0
- package/.next/standalone/node_modules/next/dist/server/mcp/tools/utils/format-errors.js +137 -0
- package/.next/standalone/node_modules/next/dist/server/next-server.js +1429 -0
- package/.next/standalone/node_modules/next/dist/server/next-typescript.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/next.js +455 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-baseline.js +25 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/console-dim.external.js +301 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/console-exit.js +49 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/console-file.js +56 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/date.js +52 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/error-inspect.js +8 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.js +577 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/global-behaviors.js +33 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/io-utils.js +195 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/node-crypto.js +103 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/process-error-handlers.js +91 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/random.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.js +508 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/web-crypto.js +45 -0
- package/.next/standalone/node_modules/next/dist/server/node-environment.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/node-polyfill-crypto.js +21 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/absolute-filename-normalizer.js +33 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/app-bundle-path-normalizer.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/app-filename-normalizer.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/app-page-normalizer.js +40 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/app-pathname-normalizer.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/index.js +42 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/index.js +44 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/pages-bundle-path-normalizer.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/pages-filename-normalizer.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/pages-page-normalizer.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/pages-pathname-normalizer.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/locale-route-normalizer.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/normalizer.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/normalizers.js +23 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/prefixing-normalizer.js +26 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/request/base-path.js +25 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/request/next-data.js +38 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/request/pathname-normalizer.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/request/prefix.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/request/rsc.js +19 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.js +33 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/request/suffix.js +27 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/underscore-normalizer.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/normalizers/wrap-normalizer-fn.js +17 -0
- package/.next/standalone/node_modules/next/dist/server/og/image-response.js +53 -0
- package/.next/standalone/node_modules/next/dist/server/patch-error-inspect.js +453 -0
- package/.next/standalone/node_modules/next/dist/server/pipe-readable.js +140 -0
- package/.next/standalone/node_modules/next/dist/server/post-process.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/render-result.js +204 -0
- package/.next/standalone/node_modules/next/dist/server/render.js +1140 -0
- package/.next/standalone/node_modules/next/dist/server/request/connection.js +133 -0
- package/.next/standalone/node_modules/next/dist/server/request/cookies.js +235 -0
- package/.next/standalone/node_modules/next/dist/server/request/draft-mode.js +230 -0
- package/.next/standalone/node_modules/next/dist/server/request/fallback-params.js +69 -0
- package/.next/standalone/node_modules/next/dist/server/request/headers.js +229 -0
- package/.next/standalone/node_modules/next/dist/server/request/params.js +527 -0
- package/.next/standalone/node_modules/next/dist/server/request/pathname.js +119 -0
- package/.next/standalone/node_modules/next/dist/server/request/root-params.js +194 -0
- package/.next/standalone/node_modules/next/dist/server/request/search-params.js +526 -0
- package/.next/standalone/node_modules/next/dist/server/request/utils.js +51 -0
- package/.next/standalone/node_modules/next/dist/server/request-meta.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/require-hook.js +82 -0
- package/.next/standalone/node_modules/next/dist/server/require.js +109 -0
- package/.next/standalone/node_modules/next/dist/server/response-cache/index.js +311 -0
- package/.next/standalone/node_modules/next/dist/server/response-cache/types.js +41 -0
- package/.next/standalone/node_modules/next/dist/server/response-cache/utils.js +104 -0
- package/.next/standalone/node_modules/next/dist/server/response-cache/web.js +101 -0
- package/.next/standalone/node_modules/next/dist/server/resume-data-cache/cache-store.js +96 -0
- package/.next/standalone/node_modules/next/dist/server/resume-data-cache/resume-data-cache.js +124 -0
- package/.next/standalone/node_modules/next/dist/server/revalidation-utils.js +157 -0
- package/.next/standalone/node_modules/next/dist/server/route-definitions/app-page-route-definition.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/route-definitions/app-route-route-definition.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-definitions/locale-route-definition.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-definitions/pages-api-route-definition.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-definitions/pages-route-definition.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-definitions/route-definition.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-kind.js +32 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-managers/default-route-matcher-manager.js +239 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-managers/dev-route-matcher-manager.js +120 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/app-page-route-matcher-provider.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/app-route-route-matcher-provider.js +43 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-app-page-route-matcher-provider.js +91 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-app-route-route-matcher-provider.js +112 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-pages-api-route-matcher-provider.js +77 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-pages-route-matcher-provider.js +77 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/file-cache-route-matcher-provider.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/batched-file-reader.js +106 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/default-file-reader.js +42 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/file-reader.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/helpers/cached-route-matcher-provider.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/manifest-loader.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/node-manifest-loader.js +34 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/server-manifest-loader.js +20 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/manifest-route-matcher-provider.js +21 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/pages-api-route-matcher-provider.js +55 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/pages-route-matcher-provider.js +64 -0
- package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-matchers/app-page-route-matcher.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/route-matchers/app-route-route-matcher.js +15 -0
- package/.next/standalone/node_modules/next/dist/server/route-matchers/locale-route-matcher.js +68 -0
- package/.next/standalone/node_modules/next/dist/server/route-matchers/pages-api-route-matcher.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/route-matchers/pages-route-matcher.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/route-matchers/route-matcher.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/route-matches/app-page-route-match.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-matches/app-route-route-match.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-matches/locale-route-match.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-matches/pages-api-route-match.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/route-matches/pages-route-match.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-matches/route-match.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/helpers/prerender-manifest-matcher.js +51 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/module.compiled.js +36 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/module.js +162 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/module.render.js +24 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/normalize-request-url.js +25 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/app-router-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.js +87 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/head-manager-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/hooks-client-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/image-config-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/router-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/server-inserted-html.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.js +140 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-compiler-runtime.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-dom.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-runtime.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-static.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-static.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.js +125 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-compiler-runtime.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-dom-server.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-dom.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/auto-implement-methods.js +85 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/clean-url.js +24 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/get-pathname-from-absolute-path.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/is-static-gen-enabled.js +15 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/parsed-url-query-to-params.js +20 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/module.compiled.js +36 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/module.js +914 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/shared-modules.js +56 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/checks.js +45 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/builtin/_error.js +100 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/module.compiled.js +20 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/module.js +92 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/module.render.js +24 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/pages-handler.js +545 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/app-router-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.js +102 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/head-manager-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/hooks-client-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/html-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/image-config-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/loadable-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/loadable.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/router-context.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/server-inserted-html.js +4 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages-api/module.compiled.js +20 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages-api/module.js +58 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/route-module.js +650 -0
- package/.next/standalone/node_modules/next/dist/server/runtime-reacts.external.js +46 -0
- package/.next/standalone/node_modules/next/dist/server/send-payload.js +88 -0
- package/.next/standalone/node_modules/next/dist/server/send-response.js +70 -0
- package/.next/standalone/node_modules/next/dist/server/serve-static.js +66 -0
- package/.next/standalone/node_modules/next/dist/server/server-route-utils.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/server-utils.js +323 -0
- package/.next/standalone/node_modules/next/dist/server/setup-http-agent-env.js +31 -0
- package/.next/standalone/node_modules/next/dist/server/stream-utils/encoded-tags.js +122 -0
- package/.next/standalone/node_modules/next/dist/server/stream-utils/node-web-streams-helper.js +918 -0
- package/.next/standalone/node_modules/next/dist/server/stream-utils/uint8array-helpers.js +74 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/constant.js +98 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/index.js +199 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/client-boundary.js +97 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/config.js +512 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/entry.js +149 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/error.js +38 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/metadata.js +234 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/server-boundary.js +115 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/rules/server.js +79 -0
- package/.next/standalone/node_modules/next/dist/server/typescript/utils.js +212 -0
- package/.next/standalone/node_modules/next/dist/server/use-cache/cache-life.js +163 -0
- package/.next/standalone/node_modules/next/dist/server/use-cache/cache-tag.js +52 -0
- package/.next/standalone/node_modules/next/dist/server/use-cache/constants.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/use-cache/handlers.js +121 -0
- package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-errors.js +36 -0
- package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1588 -0
- package/.next/standalone/node_modules/next/dist/server/utils.js +73 -0
- package/.next/standalone/node_modules/next/dist/server/web/adapter.js +392 -0
- package/.next/standalone/node_modules/next/dist/server/web/edge-route-module-wrapper.js +123 -0
- package/.next/standalone/node_modules/next/dist/server/web/error.js +54 -0
- package/.next/standalone/node_modules/next/dist/server/web/exports/index.js +56 -0
- package/.next/standalone/node_modules/next/dist/server/web/get-edge-preview-props.js +23 -0
- package/.next/standalone/node_modules/next/dist/server/web/globals.js +128 -0
- package/.next/standalone/node_modules/next/dist/server/web/http.js +39 -0
- package/.next/standalone/node_modules/next/dist/server/web/internal-edge-wait-until.js +64 -0
- package/.next/standalone/node_modules/next/dist/server/web/next-url.js +199 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/context.js +462 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/fetch-inline-assets.js +35 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/index.js +28 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/resource-managers.js +88 -0
- package/.next/standalone/node_modules/next/dist/server/web/sandbox/sandbox.js +137 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/headers.js +192 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/next-request.js +142 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/reflect.js +30 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.js +211 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/cookies.js +29 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/fetch-event.js +98 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/image-response.js +22 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/request.js +99 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/response.js +136 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +214 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +289 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-no-store.js +51 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/url-pattern.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/user-agent.js +46 -0
- package/.next/standalone/node_modules/next/dist/server/web/types.js +6 -0
- package/.next/standalone/node_modules/next/dist/server/web/utils.js +151 -0
- package/.next/standalone/node_modules/next/dist/server/web/web-on-close.js +87 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/action-revalidation-kind.js +31 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.js +50 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/app-router-types.js +46 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/constants.js +448 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/deep-freeze.js +30 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/deployment-id.js +63 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/dset.js +34 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/encode-uri-path.js +15 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/entry-constants.js +36 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/error-source.js +36 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +39 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/code-frame.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/constants.js +19 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/empty-generate-static-params-error.js +24 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/hard-deprecated-config-error.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/escape-regexp.js +22 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/get-hostname.js +23 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/hash.js +42 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/head.js +163 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.js +60 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/html-context.shared-runtime.js +40 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/i18n/detect-domain-locale.js +25 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/i18n/get-locale-redirect.js +59 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/i18n/normalize-locale-path.js +54 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/image-blur-svg.js +22 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.js +19 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/image-config.js +77 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/invariant-error.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/is-plain-object.js +42 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/is-thenable.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/isomorphic/path.js +14 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/lazy-dynamic/bailout-to-csr.js +37 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.js +19 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/loadable.shared-runtime.js +246 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/match-local-pattern.js +46 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/match-remote-pattern.js +63 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/modern-browserslist-target.js +15 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/no-fallback-error.external.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/normalized-asset-prefix.js +28 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/absolute-path-to-page.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/denormalize-page-path.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/get-page-paths.js +40 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/normalize-data-path.js +23 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/normalize-page-path.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/normalize-path-sep.js +19 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/page-path/remove-page-path-tail.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/promise-with-resolvers.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/adapters.js +136 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/routes/app.js +122 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-locale.js +28 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-path-prefix.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-path-suffix.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/app-paths.js +62 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/as-path-to-search-params.js +17 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/cache-busting-search-param.js +24 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/escape-path-delimiters.js +16 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/format-next-pathname-info.js +27 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/format-url.js +111 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-dynamic-param.js +174 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-next-pathname-info.js +52 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-route-from-asset-path.js +25 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-segment-param.js +90 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/html-bots.js +17 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/index.js +30 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/interception-prefix-from-param-type.js +33 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/interception-routes.js +108 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/is-bot.js +57 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/is-dynamic.js +26 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.js +31 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-loader-tree.js +30 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-path.js +33 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.js +43 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-url.js +38 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/path-has-prefix.js +20 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/path-match.js +49 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/prepare-destination.js +292 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/querystring.js +79 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/relativize-url.js +40 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/remove-path-prefix.js +39 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/remove-trailing-slash.js +21 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/resolve-param-value.js +116 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/route-match-utils.js +113 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/route-matcher.js +45 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/route-regex.js +256 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/sorted-routes.js +244 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router-context.shared-runtime.js +18 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.js +99 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.js +32 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/segment.js +102 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.js +35 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/server-reference-info.js +56 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/side-effect.js +63 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/size-limit.js +40 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/turbopack/internal-error.js +53 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/utils/reflect-utils.js +69 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/utils/warn-once.js +22 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/utils.js +207 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/zod.js +101 -0
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +89 -0
- package/.next/standalone/node_modules/next/dist/telemetry/detached-flush.js +56 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/build.js +174 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/index.js +41 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/plugins.js +51 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +55 -0
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +66 -0
- package/.next/standalone/node_modules/next/dist/telemetry/flush-telemetry.js +19 -0
- package/.next/standalone/node_modules/next/dist/telemetry/post-telemetry-payload.js +48 -0
- package/.next/standalone/node_modules/next/dist/telemetry/project-id.js +48 -0
- package/.next/standalone/node_modules/next/dist/telemetry/storage.js +301 -0
- package/.next/standalone/node_modules/next/dist/trace/index.js +58 -0
- package/.next/standalone/node_modules/next/dist/trace/report/index.js +37 -0
- package/.next/standalone/node_modules/next/dist/trace/report/to-json-build.js +40 -0
- package/.next/standalone/node_modules/next/dist/trace/report/to-json.js +165 -0
- package/.next/standalone/node_modules/next/dist/trace/report/to-telemetry.js +36 -0
- package/.next/standalone/node_modules/next/dist/trace/shared.js +39 -0
- package/.next/standalone/node_modules/next/dist/trace/trace.js +211 -0
- package/.next/standalone/node_modules/next/package.json +378 -0
- package/.next/standalone/node_modules/react/cjs/react-compiler-runtime.production.js +16 -0
- package/.next/standalone/node_modules/react/cjs/react-jsx-dev-runtime.production.js +14 -0
- package/.next/standalone/node_modules/react/cjs/react-jsx-runtime.production.js +34 -0
- package/.next/standalone/node_modules/react/cjs/react.development.js +1284 -0
- package/.next/standalone/node_modules/react/cjs/react.production.js +542 -0
- package/.next/standalone/node_modules/react/compiler-runtime.js +14 -0
- package/.next/standalone/node_modules/react/index.js +7 -0
- package/.next/standalone/node_modules/react/jsx-dev-runtime.js +7 -0
- package/.next/standalone/node_modules/react/jsx-runtime.js +7 -0
- package/.next/standalone/node_modules/react/package.json +51 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +6603 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +6692 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +7410 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +7512 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +7707 -0
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +210 -0
- package/.next/standalone/node_modules/react-dom/index.js +38 -0
- package/.next/standalone/node_modules/react-dom/package.json +117 -0
- package/.next/standalone/node_modules/react-dom/server.browser.js +16 -0
- package/.next/standalone/node_modules/react-dom/server.edge.js +17 -0
- package/.next/standalone/node_modules/react-dom/server.node.js +18 -0
- package/.next/standalone/node_modules/react-dom/static.node.js +14 -0
- package/.next/standalone/node_modules/sharp/lib/channel.js +177 -0
- package/.next/standalone/node_modules/sharp/lib/colour.js +195 -0
- package/.next/standalone/node_modules/sharp/lib/composite.js +212 -0
- package/.next/standalone/node_modules/sharp/lib/constructor.js +499 -0
- package/.next/standalone/node_modules/sharp/lib/index.js +16 -0
- package/.next/standalone/node_modules/sharp/lib/input.js +809 -0
- package/.next/standalone/node_modules/sharp/lib/is.js +143 -0
- package/.next/standalone/node_modules/sharp/lib/libvips.js +207 -0
- package/.next/standalone/node_modules/sharp/lib/operation.js +1016 -0
- package/.next/standalone/node_modules/sharp/lib/output.js +1666 -0
- package/.next/standalone/node_modules/sharp/lib/resize.js +595 -0
- package/.next/standalone/node_modules/sharp/lib/sharp.js +121 -0
- package/.next/standalone/node_modules/sharp/lib/utility.js +291 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +143 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +557 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +333 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +54 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +62 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +7 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +5 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +5 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +5 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +5 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +5 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +5 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +18 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +12 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +37 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +11 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +29 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +42 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +17 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +223 -0
- package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +78 -0
- package/.next/standalone/node_modules/sharp/package.json +202 -0
- package/.next/standalone/node_modules/styled-jsx/dist/index/index.js +499 -0
- package/.next/standalone/node_modules/styled-jsx/index.js +1 -0
- package/.next/standalone/node_modules/styled-jsx/package.json +132 -0
- package/.next/standalone/node_modules/styled-jsx/style.js +1 -0
- package/.next/standalone/package.json +55 -0
- package/.next/standalone/server.js +38 -0
- package/.next/static/BgLP6ChyOyE0k8Ahr8F2H/_buildManifest.js +11 -0
- package/.next/static/BgLP6ChyOyE0k8Ahr8F2H/_clientMiddlewareManifest.js +1 -0
- package/.next/static/BgLP6ChyOyE0k8Ahr8F2H/_ssgManifest.js +1 -0
- package/.next/static/chunks/01xlw8hd842-c.js +1 -0
- package/.next/static/chunks/03~yq9q893hmn.js +1 -0
- package/.next/static/chunks/0bogtdbh.dcu1.js +1 -0
- package/.next/static/chunks/0bzupvr5gt3k9.js +31 -0
- package/.next/static/chunks/0d3shmwh5_nmn.js +1 -0
- package/.next/static/chunks/0iym2_f33sxs7.css +4 -0
- package/.next/static/chunks/0mmpyn9fv2fjf.js +2 -0
- package/.next/static/chunks/0qmupjhwdppg9.js +11 -0
- package/.next/static/chunks/0y3~cortx~or~.js +5 -0
- package/.next/static/chunks/12p3iqtw2ohfq.js +1 -0
- package/.next/static/chunks/turbopack-06dy8k5p5cegf.js +1 -0
- package/.next/static/media/166ab60e98aadb0a-s.p.0mka4ru4_bj1d.woff2 +0 -0
- package/.next/static/media/1bffadaabf893a1e-s.16ipb6fqu393i.woff2 +0 -0
- package/.next/static/media/2bbe8d2671613f1f-s.067x_6k0k23tk.woff2 +0 -0
- package/.next/static/media/2c55a0e60120577a-s.0bjc5tiuqdqro.woff2 +0 -0
- package/.next/static/media/47fe59148dddec23-s.0miki_k4yhs4d.woff2 +0 -0
- package/.next/static/media/4e86c6b06ecb547e-s.0w2c6_8~q7i1~.woff2 +0 -0
- package/.next/static/media/4fa387ec64143e14-s.0q3udbd2bu5yp.woff2 +0 -0
- package/.next/static/media/5476f68d60460930-s.0wxq9webf.ew4.woff2 +0 -0
- package/.next/static/media/63599ae31785f475-s.01zyq0dc2~0hp.woff2 +0 -0
- package/.next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2 +0 -0
- package/.next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2 +0 -0
- package/.next/static/media/8b19d8d892dc610b-s.0.m6yiwn-kka2.woff2 +0 -0
- package/.next/static/media/9c72aa0f40e4eef8-s.0m6w47a4e5dy9.woff2 +0 -0
- package/.next/static/media/ad66f9afd8947f86-s.11u06r12fd6v_.woff2 +0 -0
- package/.next/static/media/bbc41e54d2fcbd21-s.0gw~uztddq1df.woff2 +0 -0
- package/.next/static/media/c5ff0a46612d668f-s.0hhk-7qht1v87.woff2 +0 -0
- package/.next/static/media/f10b37ddd5a9e949-s.15ktajnz8ofs..woff2 +0 -0
- package/.next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
- package/README.md +75 -0
- package/bin/miclaw.mjs +99 -0
- package/package.json +55 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/logo.png +0 -0
- package/public/next.svg +1 -0
- package/public/screenshot.png +0 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="inter_fe8b9d92-module__LINzvG__variable geist_mono_8d43a2aa-module__8Li5zG__variable fira_code_d18ac710-module__OladcG__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/166ab60e98aadb0a-s.p.0mka4ru4_bj1d.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/chunks/0iym2_f33sxs7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0bzupvr5gt3k9.js"/><script src="/_next/static/chunks/0y3~cortx~or~.js" async=""></script><script src="/_next/static/chunks/0bogtdbh.dcu1.js" async=""></script><script src="/_next/static/chunks/turbopack-06dy8k5p5cegf.js" async=""></script><script src="/_next/static/chunks/0mmpyn9fv2fjf.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><script src="/_next/static/chunks/12p3iqtw2ohfq.js" async=""></script><meta name="next-size-adjust" content=""/><title>MiClaw</title><meta name="description" content="Claude Code configuration visualizer"/><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body class="bg-surface text-text font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden"><nav class="w-16 shrink-0 border-r border-border py-4 flex flex-col items-center gap-2 overflow-visible"><a class="mb-3" style="writing-mode:vertical-lr" href="/"><span class="text-sm font-bold tracking-wider" style="font-family:var(--font-fira-code), monospace"><span class="text-text-muted">Mi</span><span class="text-accent">Claw</span></span></a><a class="relative group w-10 h-10 flex items-center justify-center rounded-md transition-colors
|
|
2
|
+
text-text-dim hover:text-text hover:bg-surface-hover" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-layout-dashboard" aria-hidden="true"><rect width="7" height="9" x="3" y="3" rx="1"></rect><rect width="7" height="5" x="14" y="3" rx="1"></rect><rect width="7" height="9" x="14" y="12" rx="1"></rect><rect width="7" height="5" x="3" y="16" rx="1"></rect></svg><span class="absolute left-full ml-3 px-2.5 py-1 rounded-md bg-surface-raised border border-border text-text text-xs font-medium whitespace-nowrap opacity-0 pointer-events-none group-hover:opacity-100 transition-opacity z-50 shadow-lg">Overview</span></a><a class="relative group w-10 h-10 flex items-center justify-center rounded-md transition-colors
|
|
3
|
+
text-text-dim hover:text-text hover:bg-surface-hover" href="/agents"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bot" aria-hidden="true"><path d="M12 8V4H8"></path><rect width="16" height="12" x="4" y="8" rx="2"></rect><path d="M2 14h2"></path><path d="M20 14h2"></path><path d="M15 13v2"></path><path d="M9 13v2"></path></svg><span class="absolute left-full ml-3 px-2.5 py-1 rounded-md bg-surface-raised border border-border text-text text-xs font-medium whitespace-nowrap opacity-0 pointer-events-none group-hover:opacity-100 transition-opacity z-50 shadow-lg">Agents</span></a><a class="relative group w-10 h-10 flex items-center justify-center rounded-md transition-colors
|
|
4
|
+
text-text-dim hover:text-text hover:bg-surface-hover" href="/skills"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap" aria-hidden="true"><path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"></path></svg><span class="absolute left-full ml-3 px-2.5 py-1 rounded-md bg-surface-raised border border-border text-text text-xs font-medium whitespace-nowrap opacity-0 pointer-events-none group-hover:opacity-100 transition-opacity z-50 shadow-lg">Skills</span></a><a class="relative group w-10 h-10 flex items-center justify-center rounded-md transition-colors
|
|
5
|
+
text-text-dim hover:text-text hover:bg-surface-hover" href="/commands"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-terminal" aria-hidden="true"><path d="M12 19h8"></path><path d="m4 17 6-6-6-6"></path></svg><span class="absolute left-full ml-3 px-2.5 py-1 rounded-md bg-surface-raised border border-border text-text text-xs font-medium whitespace-nowrap opacity-0 pointer-events-none group-hover:opacity-100 transition-opacity z-50 shadow-lg">Commands</span></a><a class="relative group w-10 h-10 flex items-center justify-center rounded-md transition-colors
|
|
6
|
+
text-text-dim hover:text-text hover:bg-surface-hover" href="/mcp"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plug" aria-hidden="true"><path d="M12 22v-5"></path><path d="M15 8V2"></path><path d="M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z"></path><path d="M9 8V2"></path></svg><span class="absolute left-full ml-3 px-2.5 py-1 rounded-md bg-surface-raised border border-border text-text text-xs font-medium whitespace-nowrap opacity-0 pointer-events-none group-hover:opacity-100 transition-opacity z-50 shadow-lg">MCP Servers</span></a><a class="relative group w-10 h-10 flex items-center justify-center rounded-md transition-colors
|
|
7
|
+
text-text-dim hover:text-text hover:bg-surface-hover" href="/hooks"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-webhook" aria-hidden="true"><path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2"></path><path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06"></path><path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8"></path></svg><span class="absolute left-full ml-3 px-2.5 py-1 rounded-md bg-surface-raised border border-border text-text text-xs font-medium whitespace-nowrap opacity-0 pointer-events-none group-hover:opacity-100 transition-opacity z-50 shadow-lg">Hooks</span></a><a class="relative group w-10 h-10 flex items-center justify-center rounded-md transition-colors
|
|
8
|
+
text-text-dim hover:text-text hover:bg-surface-hover" href="/settings"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield" aria-hidden="true"><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"></path></svg><span class="absolute left-full ml-3 px-2.5 py-1 rounded-md bg-surface-raised border border-border text-text text-xs font-medium whitespace-nowrap opacity-0 pointer-events-none group-hover:opacity-100 transition-opacity z-50 shadow-lg">Settings</span></a><a class="relative group w-10 h-10 flex items-center justify-center rounded-md transition-colors
|
|
9
|
+
text-accent bg-surface-raised" href="/rules"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text" aria-hidden="true"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"></path><path d="M14 2v5a1 1 0 0 0 1 1h5"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg><span class="absolute left-full ml-3 px-2.5 py-1 rounded-md bg-surface-raised border border-border text-text text-xs font-medium whitespace-nowrap opacity-0 pointer-events-none group-hover:opacity-100 transition-opacity z-50 shadow-lg">Rules</span></a></nav><main class="flex-1 overflow-y-auto bg-grid"><div class="mx-auto max-w-5xl px-8 py-10"><div class="mb-8"><div class="flex items-baseline gap-3"><h1 class="text-2xl font-medium tracking-tight">Rules and Instructions</h1><span class="text-sm text-text-muted">12</span></div><p class="mt-1 text-sm text-text-muted">Repo instruction files that guide agent behavior</p></div><div class="mb-8"><h2 class="text-xs font-medium text-text-dim uppercase tracking-wide mb-3">Desktop</h2><div class="space-y-3"><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">CLAUDE.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/CLAUDE.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># RULES
|
|
10
|
+
|
|
11
|
+
- Always use concise explanation
|
|
12
|
+
- Main languages are Python and TypeScript
|
|
13
|
+
- Never use emojis when writing code or markdown
|
|
14
|
+
- NEVER use non-standard symbols like "✓|✗|☐|○" when writing code or markdown
|
|
15
|
+
- Use parametrized tests whenever possible
|
|
16
|
+
- Listed below are a handful of different 'Workflow' guides. Adhere to them as best as possible<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div></div></div><div class="mb-8"><h2 class="text-xs font-medium text-text-dim uppercase tracking-wide mb-3">ROADMAP_2026</h2><div class="space-y-3"><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">CLAUDE.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/ROADMAP_2026/CLAUDE.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># Bioscope Bioinformatics 2026 Roadmap
|
|
17
|
+
|
|
18
|
+
## Project Overview
|
|
19
|
+
Interactive roadmap visualization tool for Bioscope Bioinformatics' 2026 strategic planning. Single-page web app with a Node.js backend for data persistence.
|
|
20
|
+
|
|
21
|
+
## Files
|
|
22
|
+
|
|
23
|
+
| File | Purpose |<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div></div></div><div class="mb-8"><h2 class="text-xs font-medium text-text-dim uppercase tracking-wide mb-3">infrastructure</h2><div class="space-y-3"><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">AGENTS.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/infrastructure/AGENTS.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># Repository Standards
|
|
24
|
+
|
|
25
|
+
## CRITICAL SAFETY RULES
|
|
26
|
+
|
|
27
|
+
**NEVER RUN APPLIES**
|
|
28
|
+
Claude can ONLY run the following commands. All apply operations must be performed by humans.
|
|
29
|
+
|
|
30
|
+
```bash<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">CLAUDE.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/infrastructure/CLAUDE.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed">@AGENTS.md</pre></div></div></div></div><div class="mb-8"><h2 class="text-xs font-medium text-text-dim uppercase tracking-wide mb-3">platform-services</h2><div class="space-y-3"><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">AGENTS.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/platform-services/AGENTS.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># Platform Services Development Guide
|
|
31
|
+
|
|
32
|
+
This is a Python monorepo using Nx and uv for managing dependencies and builds. Testing is done with pytest. Most packages are either deployed as AWS Lambda functions or shared libraries.
|
|
33
|
+
|
|
34
|
+
## Project Structure
|
|
35
|
+
|
|
36
|
+
This is a monorepo containing multiple Python packages that follow consistent patterns and conventions.
|
|
37
|
+
<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">CLAUDE.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/platform-services/CLAUDE.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed">@AGENTS.md</pre></div></div><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">AGENTS.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/ps-copy/platform-services/AGENTS.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># Platform Services Development Guide
|
|
38
|
+
|
|
39
|
+
This is a Python monorepo using Nx and uv for managing dependencies and builds. Testing is done with pytest. Most packages are either deployed as AWS Lambda functions or shared libraries.
|
|
40
|
+
|
|
41
|
+
## Project Structure
|
|
42
|
+
|
|
43
|
+
This is a monorepo containing multiple Python packages that follow consistent patterns and conventions.
|
|
44
|
+
<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">CLAUDE.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/ps-copy/platform-services/CLAUDE.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed">@AGENTS.md</pre></div></div></div></div><div class="mb-8"><h2 class="text-xs font-medium text-text-dim uppercase tracking-wide mb-3">web-app</h2><div class="space-y-3"><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">CLAUDE.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/web-app/CLAUDE.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># Web App - Claude Instructions
|
|
45
|
+
|
|
46
|
+
## E2E Test Users
|
|
47
|
+
|
|
48
|
+
### How test users are managed
|
|
49
|
+
|
|
50
|
+
E2E tests use Auth0 users with the email pattern `success+test_user_N@simulator.amazonses.com` and password `test123!`. The user list is in `e2e/data/users.json`. Each developer (or worktree) reserves a slot of 25 users via the `E2E_USER_START_INDEX` env var in `.env.local` (see README for slot table).
|
|
51
|
+
<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">.clauderules</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/web-app/.clauderules</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># Claude Code Rules for Bioscope Web App
|
|
52
|
+
|
|
53
|
+
## Design System and Styling
|
|
54
|
+
|
|
55
|
+
### Color Usage
|
|
56
|
+
**NEVER hardcode color values in components.** All colors must be defined in the design system.
|
|
57
|
+
|
|
58
|
+
- ❌ **WRONG**: `bg-[#181f2e]`, `border-[#303a48]`, `text-[#8fbecc]`<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">rules.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/web-app/.claude/rules.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># Claude Development Rules
|
|
59
|
+
|
|
60
|
+
## Component Organization
|
|
61
|
+
|
|
62
|
+
### Multiple Components Per File
|
|
63
|
+
|
|
64
|
+
**Rule**: Do not place multiple components in the same file. Each component should be organized into its own directory structure.
|
|
65
|
+
<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div></div></div><div class="mb-8"><h2 class="text-xs font-medium text-text-dim uppercase tracking-wide mb-3">wgs-ingestion-bot</h2><div class="space-y-3"><div class="border border-border rounded-sm p-5 "><div class="flex items-center gap-2 mb-2"><span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted">CLAUDE.md</span><span class="text-xs text-text-dim font-mono">/Users/gabry/Desktop/wgs-ingestion-bot/CLAUDE.md</span></div><div class="mt-3"><pre class="text-xs text-text-muted font-mono whitespace-pre-wrap leading-relaxed"># WGS Ingestion Bot
|
|
66
|
+
|
|
67
|
+
Slack bot that automatically investigates WGS ingestion failures using Claude Code.
|
|
68
|
+
|
|
69
|
+
## Persona
|
|
70
|
+
|
|
71
|
+
You are a bioinformatics engineer embedded in the Bioscope platform team. You have deep expertise in clinical WGS pipelines and are the on-call expert for ingestion failures. Assume your audience (the engineering team in Slack) has strong genomics and software knowledge -- do not over-explain standard concepts.
|
|
72
|
+
<span class="text-text-dim">...</span></pre><button class="mt-2 text-xs text-accent hover:text-accent-dim transition-colors">Show more</button></div></div></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/0bzupvr5gt3k9.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[22140,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"Sidebar\"]\n3:I[39756,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n6:I[97367,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\na:I[97367,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\nc:I[97367,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\ne:I[68027,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0iym2_f33sxs7.css\",\"style\"]\n:HL[\"/_next/static/media/166ab60e98aadb0a-s.p.0mka4ru4_bj1d.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"rules\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"rules\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0iym2_f33sxs7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"inter_fe8b9d92-module__LINzvG__variable geist_mono_8d43a2aa-module__8Li5zG__variable fira_code_d18ac710-module__OladcG__variable\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-surface text-text font-sans antialiased\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden\",\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto bg-grid\",\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L5\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/12p3iqtw2ohfq.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,null]},null,false,\"$@9\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Ld\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0iym2_f33sxs7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"BgLP6ChyOyE0k8Ahr8F2H\"}\n"])</script><script>self.__next_f.push([1,"f:[]\n9:\"$Wf\"\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"10:I[27201,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"IconMark\"]\n8:null\nd:[[\"$\",\"title\",\"0\",{\"children\":\"MiClaw\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Claude Code configuration visualizer\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L10\",\"3\",{}]]\n"])</script><script>self.__next_f.push([1,"11:I[22450,[\"/_next/static/chunks/0mmpyn9fv2fjf.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/12p3iqtw2ohfq.js\"],\"ExpandableBody\"]\n12:T133b,"])</script><script>self.__next_f.push([1,"# RULES\n\n- Always use concise explanation\n- Main languages are Python and TypeScript\n- Never use emojis when writing code or markdown\n- NEVER use non-standard symbols like \"✓|✗|☐|○\" when writing code or markdown\n- Use parametrized tests whenever possible\n- Listed below are a handful of different 'Workflow' guides. Adhere to them as best as possible\n- Whenver novel work (not in a repo) is being done in python, ALWAYS use a .venv prior to installing any packages via pip or otherwise.\n\n## REPOS\n\nBefore working in any repo, read its instruction file:\n\n| Repo | Path | Instructions |\n|------|------|--------------|\n| platform-services | ~/Desktop/platform-services | AGENTS.md |\n| infrastructure | ~/Desktop/infrastructure | CLAUDE.md |\n| web-app | ~/Desktop/web-app | .clauderules |\n\nWhen spawning subagents for a specific repo, include the instruction file path in the prompt.\n\n## Code Quality Standards\n\nCode must be clean, readable, and maintainable. Hold yourself to extremely high standards:\n\n- **Small, focused functions**: Break complex logic into small, single-purpose functions. If a function has more than 2-3 levels of nesting or more than 6 return statements, decompose it.\n- **Typed end-to-end**: Use Pydantic models and dataclasses instead of raw `dict[str, Any]`. When parsing external data (JSON, API responses), validate into typed models at the boundary and work with typed objects throughout.\n- **Minimal suppression comments**: `# noqa`, `# pyright: ignore`, `# pragma: no cover`, and `# type: ignore` should be rare exceptions, not workarounds for poor typing. If you find yourself adding a suppression, first try to fix the underlying type issue. Acceptable uses: subprocess security warnings on known binaries, `__main__` guards, shared type-only files.\n- **No `dict[str, Any]` in business logic**: Parse into typed models at the boundary. If a function accepts `dict[str, Any]`, it should be a private parsing helper, not business logic.\n- **Parametrized tests**: Combine similar test cases with different inputs into `@pytest.mark.parametrize` instead of copy-pasting test methods.\n- **Extract repeated patterns**: If the same mock setup or helper logic appears 3+ times, extract it to a fixture or helper function.\n\n## Git Restrictions\n\nAgents must NEVER run `git add` or `git commit` commands. The user will handle all git staging and commits manually.\n\n## PR Review Workflow (ps-copy)\n\nThere is a second copy of platform-services at `~/Desktop/ps-copy/platform-services` used for reviewing PRs.\n\nWhen asked to \"Review PR \u003cnumber\u003e in ps-copy\":\n1. Navigate to `~/Desktop/ps-copy/platform-services`\n2. Checkout main branch: `git checkout main`\n3. Run `git fetch \u0026\u0026 git pull`\n4. Read in the repositories developmnet guide AGENTS.md file (FAIL IF YOU CANNOT FIND IT)\n5. Run the `/review` task for the specified PR\n6. DO NOT post an actual comment on the review. Just review locally.\n\n## Linear Ticket Workflow\n\n- Ticket titles must be under 50 characters. Linear auto-generates branch names from titles, so short titles produce clean branch names.\n- Tickets are NOT done until the code has been reviewed and merged in GitHub. Do not mark Linear tickets as \"Done\" just because the code is written - they must go through the full PR review process first.\n\n## Cross-Repo Workflow\n\nWhen working across multiple repos in a single task:\n1. Read all relevant instruction files first\n2. Follow each repo's conventions when modifying its code\n3. Coordinate changes that span repos (e.g., API changes in platform-services affecting web-app)\n\n## Querying Logs in Axiom Workflow\n\nQuerying Logs in Axiom\n\nLogs are in the `bioscope-dev` dataset for the dev AWS environment and the `bioscope-prod` dataset for the prod AWS environment. Axiom uses APL (similar to Kusto/KQL). All field names are **camelCase**.\n\n### Key Fields\n\n| Field | Description |\n| ------- | ------------- |\n| `_time` | Timestamp |\n| `logGroup` | CloudWatch log group (e.g., `/aws/lambda/account-service`) |\n| `message` | Log message |\n| `levelname` | Log level (`INFO`, `ERROR`, etc.) |\n| `service` | Service name |\n| `correlationId` | UUID for tracing requests across services |\n| `accountId`, `userId`, `patientId` | Entity identifiers |\n| `path`, `method`, `statusCode`, `took` | HTTP request details |\n| `errorMessage`, `errorType` | Error details |\n| `data` | Object containing extra fields not in the standard set |\n\n### Example Queries\n\n```apl\n// Errors in a service\n['bioscope-dev']\n| where levelname == \"ERROR\" and logGroup == \"/aws/lambda/account-service\"\n\n// Trace a request across services\n['bioscope-dev']\n| where correlationId == \"550e8400-e29b-41d4-a716-446655440000\"\n| order by _time asc\n\n// Slow requests\n['bioscope-dev']\n| where took \u003e 1000\n| project _time, service, path, took\n\n// Error counts by service (last hour)\n['bioscope-dev']\n| where _time \u003e ago(1h) and levelname == \"ERROR\"\n| summarize count() by logGroup"])</script><script>self.__next_f.push([1,"5:[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-5xl px-8 py-10\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-baseline gap-3\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-2xl font-medium tracking-tight\",\"children\":\"Rules and Instructions\"}],[\"$\",\"span\",null,{\"className\":\"text-sm text-text-muted\",\"children\":12}]]}],[\"$\",\"p\",null,{\"className\":\"mt-1 text-sm text-text-muted\",\"children\":\"Repo instruction files that guide agent behavior\"}]]}],[[\"$\",\"div\",\"Desktop\",{\"className\":\"mb-8\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-xs font-medium text-text-dim uppercase tracking-wide mb-3\",\"children\":\"Desktop\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"div\",\"/Users/gabry/Desktop/CLAUDE.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"CLAUDE.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/CLAUDE.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$12\",\"previewLines\":8}]]}]]}]]}],\"$L13\",\"$L14\",\"$L15\",\"$L16\",\"$L17\"],false]}]\n"])</script><script>self.__next_f.push([1,"18:Tcb1,"])</script><script>self.__next_f.push([1,"# Bioscope Bioinformatics 2026 Roadmap\n\n## Project Overview\nInteractive roadmap visualization tool for Bioscope Bioinformatics' 2026 strategic planning. Single-page web app with a Node.js backend for data persistence.\n\n## Files\n\n| File | Purpose |\n|------|---------|\n| `roadmap.html` | Main application - all HTML, CSS, and JavaScript in one file |\n| `roadmap-data.json` | Data storage - umbrellas, projects, subtasks, timelines |\n| `server.js` | Node.js server (port 3000) - serves HTML and handles JSON read/write |\n\n## How to Run\n```bash\ncd /Users/gabry/Desktop/ROADMAP_2026\nnode server.js\n# Open http://localhost:3000\n```\n\n## Data Model\n\n```json\n{\n \"umbrellas\": [\n {\n \"id\": \"wgs\",\n \"title\": \"WGS (Whole Genome Sequencing)\",\n \"icon\": \"🧬\",\n \"projects\": [\n {\n \"id\": 1,\n \"title\": \"Project Name\",\n \"monthStart\": 0, // 0-11 (Jan-Dec), null = TBD\n \"monthEnd\": 2, // 0-11 (Jan-Dec), null = TBD\n \"subtasks\": [\n { \"id\": 101, \"text\": \"Task description\", \"note\": \"Optional note\" }\n ]\n }\n ]\n }\n ]\n}\n```\n\n### Umbrella Categories\n- `wgs` - WGS (Whole Genome Sequencing) 🧬\n- `microbiome` - Microbiome 🦠\n- `omics` - Other Omics \u0026 Tooling 🔬\n\n## Key Features Implemented\n\n### Two Views\n1. **Projects View** - Expandable umbrella tiles with two-column layout (projects list | tasks panel)\n2. **Timeline View** - Gantt-style visualization across 12 months with Q1-Q4 labels\n\n### Timeline Interactions\n- **Drag rows** to reorder projects within an umbrella\n- **Drag rows between umbrellas** to move projects to different categories\n- **Drag timeline bars** left/right to move project timing\n- **Drag bar edges** (resize handles) to expand/shrink duration\n- **Tooltip** shows month range while dragging (e.g., \"April - September\")\n- **TBD projects** shown as dashed badge - click to set timeline\n\n### Edit Functionality\n- Edit button on each project (both views)\n- Modal with title and month range (January-December dropdowns)\n- Delete project option\n\n### Data Persistence\n- **Save button** - POST to `/api/data` writes to `roadmap-data.json`\n- **Export button** - Downloads JSON file\n- LocalStorage used for UI state (expanded umbrellas, selected projects)\n\n## Technical Notes\n\n### Month-Based Timeline\nChanged from quarter-based (Q1-Q4) to month-based (0-11) for finer control:\n- `monthStart: 0` = January\n- `monthEnd: 11` = December\n- `null` values = TBD (unscheduled)\n\n### CSS Variables (theming)\n```css\n--wgs-color: #3b82f6 /* Blue */\n--microbiome-color: #10b981 /* Green */\n--omics-color: #8b5cf6 /* Purple */\n```\n\n### Key JavaScript Functions\n- `renderProjectsView()` - Renders umbrella tiles\n- `renderTimeline()` - Renders Gantt chart\n- `initTimelineDragDrop()` - Row drag/drop between umbrellas\n- `initBarDragResize()` - Timeline bar drag/resize\n- `saveToServer()` - POST data to server\n- `loadFromServer()` - GET data from server\n\n## Potential Future Enhancements\n- Progress tracking (checkboxes were removed but could be re-added)\n- Dependencies between projects (arrows/lines)\n- Multiple years view\n- Team/owner assignment\n- Color customization per project\n- Export to PDF/image\n- Milestones/markers on timeline"])</script><script>self.__next_f.push([1,"13:[\"$\",\"div\",\"ROADMAP_2026\",{\"className\":\"mb-8\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-xs font-medium text-text-dim uppercase tracking-wide mb-3\",\"children\":\"ROADMAP_2026\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"div\",\"/Users/gabry/Desktop/ROADMAP_2026/CLAUDE.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"CLAUDE.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/ROADMAP_2026/CLAUDE.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$18\",\"previewLines\":8}]]}]]}]]}]\n19:Tfec,"])</script><script>self.__next_f.push([1,"# Repository Standards\n\n## CRITICAL SAFETY RULES\n\n**NEVER RUN APPLIES**\nClaude can ONLY run the following commands. All apply operations must be performed by humans.\n\n```bash\n# Allowed\ntofu validate\ntofu fmt\ntofu fmt -check -diff -recursive\ntofu init\n\n# NEVER run\ntofu apply\ntofu destroy\n```\n\nFor the commands that are allowed, you can and should `cd` into the appropriate stack or module directory and run the command.\n\n## Repository Structure\n\n- `stacks/` - Environment-specific configurations with separate state management\n- `modules/` - Reusable OpenTofu modules (some modules may also call other modules)\n\n## Code Standards\n\n### Main Files\n\nAll resources must be in modules, never in a main.tf under the `stacks/` directory. The main.tf should only call other modules.\n\n### Module Standards\n\n- Each resource type goes in an appropriately named *.tf file (IAM resources in iam.tf, etc.)\n- Include variables.tf and outputs.tf with descriptive descriptions. These files are only necessary when the module actually accepts variables or exposes outputs -- do not create empty or placeholder files. Only define outputs that have a downstream consumer; do not add outputs preemptively.\n- Every module must include a README.md that provides an overview of what the module provisions and any gotchas\n- Do NOT include usage examples in README--module usage should be self-documenting; instead include an overview of the module's purpose and any gotchas with it\n\n### General Conventions\n\n- Use consistent naming: `{service_name}_{resource_type}`\n- Never hardcode secrets or credentials\n\n## Web Search\n\nSince much of this repo has to do with AWS and GCP resources, you can and should use web search to find documentation on the resources you are working with. When something is unclear, always prefer using web search to using your internal knowledge.\n\n## GitHub Actions\n\nAll external GitHub Actions in workflow files must be pinned to commit SHAs, not version tags. Version tags are mutable and can be hijacked in a supply chain attack. Add the version as a comment for readability.\n\n```yaml\n# Good\n- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n\n# Bad\n- uses: actions/checkout@v4\n```\n\nInternal `bioscope-ai/ci` actions must also be pinned to commit SHAs with `# main` as a comment.\n\n## Pull Request Guidelines\n\n### Cross-Repo Dependency Ordering\n\n`infrastructure` (this repo) is the IaC repo, while `platform-services` contains the Python application code. `infrastructure` changes can break `platform-services` if applied out of order. Review PRs with these checks:\n\n- If a code change in this repo provisions a **new Lambda**, that lambda's code must be set up in `platform-services` and promoted to prod *before* the infrastructure PR is merged. This is because `platform-services` deploys the lambda's code as a zip file and uploads it to S3. If that S3 file does not exist when `infrastructure` tries to deploy the lambda, the deployment will fail. Even a simple skeleton lambda handler is sufficient. If you see a new lambda being provisioned in this repo, leave a comment asking the author to confirm that the corresponding `platform-services` PR that sets up the lambda is already merged and promoted to prod.\n- We use a direct invocation pattern for lambdas called \"operations\"; lambdas implement operations as a routing mechanism for which internal logic to execute. If you see a new operation name in an infrastructure code change, such as in an EventBridge schedule or step function step, that operation must be set up in `platform-services` and promoted to prod *before* the infrastructure PR is merged. If you see a new operation being provisioned in this repo, leave a comment asking the author to confirm that the corresponding `platform-services` PR that sets up the operation is already merged and promoted to prod.\n\n### Code Standards in Reviews\n\nWhen reviewing code, ensure it adheres to the code standards guidelines outlined in the [README](./README.md). It is ok to leave small, low-priority comments about code standards violations."])</script><script>self.__next_f.push([1,"14:[\"$\",\"div\",\"infrastructure\",{\"className\":\"mb-8\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-xs font-medium text-text-dim uppercase tracking-wide mb-3\",\"children\":\"infrastructure\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"div\",\"/Users/gabry/Desktop/infrastructure/AGENTS.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"AGENTS.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/infrastructure/AGENTS.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$19\",\"previewLines\":8}]]}],\"$L1a\"]}]]}]\n1b:T838e,"])</script><script>self.__next_f.push([1,"# Platform Services Development Guide\n\nThis is a Python monorepo using Nx and uv for managing dependencies and builds. Testing is done with pytest. Most packages are either deployed as AWS Lambda functions or shared libraries.\n\n## Project Structure\n\nThis is a monorepo containing multiple Python packages that follow consistent patterns and conventions.\n\n## Account Types\n\nThere are two account types, stored as `account_type` in the `accounts` DynamoDB table:\n\n- **`self-evaluation`** (aka \"Try it on Yourself\") — An individual signs up to evaluate Bioscope on themselves. They act as both the physician and the patient. One user, one patient, one-time payment. Paid if there's an active `selfEvaluationAccess` entitlement in the `account-entitlements` DynamoDB table.\n- **`practice`** — A practice with one or more physicians and potentially many patients. Has two billing models:\n - **Enterprise** — created by a Bioscope employee, all billing is manual/out-of-band, all patients always considered paid. Identified by an `enterpriseProvisionedAccount` entitlement in the `account-entitlements` DynamoDB table.\n - **Standard** — physician self-signs up, billing is per-patient via yearly subscriptions tracked in the `patient-entitlements` table.\n\nFor full details, see the [Account Types and Billing Statuses](https://www.notion.so/Account-Types-and-Billing-Statuses-32713dc5995980a89921f096af7b57a5) Notion page (if you have access to Notion MCP).\n\n## GitHub Actions\n\nAll external GitHub Actions in workflow files must be pinned to commit SHAs, not version tags. Version tags are mutable and can be hijacked in a supply chain attack. Add the version as a comment for readability.\n\n```yaml\n# Good\n- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n\n# Bad\n- uses: actions/checkout@v4\n```\n\nInternal `bioscope-ai/ci` actions must also be pinned to commit SHAs with `# main` as a comment.\n\n## Dockerfile Dependency Installation\n\nAll Dockerfiles must use lockfile-deterministic dependency installs. Never use `uv pip install -e` or `pip install -e` directly, as these resolve against PyPI at build time and ignore the lockfile.\n\n### Standard pattern (uv-based images)\n\nFor Dockerfiles that use uv and target the project's Python version:\n\n```dockerfile\n# Export lockfile-pinned dependencies and install without resolution\nRUN uv export --frozen --no-dev --no-editable --package \u003cpackage-name\u003e -o /tmp/requirements.txt \u0026\u0026 \\\n uv pip install --system --no-deps -r /tmp/requirements.txt\n```\n\nThis mirrors the Lambda bundler pattern (`bundle_lambda.py` / `bundle_layer.py`). The `--frozen` flag ensures exact versions from `uv.lock` are used, and `--no-deps` prevents any resolution against PyPI.\n\n### Non-uv base images (e.g., mriqc, fastsurfer)\n\nFor Dockerfiles that extend specialized base images with a different Python version, install uv into the base image and use `uv sync` to create a venv with the project's Python version. The app runs on that version while the base image's tools stay on their own Python:\n\n```dockerfile\nFROM \u003cbase-image\u003e\nUSER root\nWORKDIR /app\n\nRUN pip install --no-cache-dir \"uv\u003e=0.10.0,\u003c0.11.0\"\n\nCOPY pyproject.toml uv.lock ./\nCOPY packages/\u003cworkspace-deps\u003e/ ./packages/\u003cworkspace-deps\u003e/\n\n# Install Python under /app so non-root users can access it\nARG PYTHON_VERSION\nENV UV_PYTHON_INSTALL_DIR=/app/.python\nRUN uv sync --frozen --no-dev --python ${PYTHON_VERSION} --package \u003cpackage-name\u003e\n\nENTRYPOINT [\"/app/.venv/bin/python\", \"-m\", \"\u003cpackage_module\u003e.main\"]\n```\n\n### Non-workspace dependencies\n\nAny `pip install` of packages not managed by the workspace lockfile (e.g., `awscli` in utility images) must use an exact version pin (`==`). Unconstrained `pip install \u003cpackage\u003e` is not allowed.\n\n## Pull Request Guidelines\n\n### Cross-Repo Dependency Ordering\n\n`platform-services` (this repo) contains Python application code, while `infrastructure` provisions the AWS resources that the application code runs on. `platform-services` often depends on `infrastructure` changes. To avoid mistimed prod promotions breaking due to ordering, review PRs based on the following:\n\nIf a code change in this repo introduces the **first usage** of an infrastructure-managed resource (DynamoDB table/index, S3 bucket, SQS queue, SNS topic, Secrets Manager secret, etc.), leave a comment asking the author to confirm that the corresponding `infrastructure` PR that provisions the resource is already merged and promoted to prod or to confirm that this is purely greenfield development that is not yet exposed to customers in the product.\n\n### Dependency Pinning\n\nAll external package dependencies must use the compatible release operator (`~=`). Do not use `\u003e=` as it leaves the version unbounded. Exact pins (`==`) are acceptable when a package requires a specific version.\n\n### Code Standards\n\nWhen reviewing code, ensure it adheres to the code standards guidelines outlined in the [README](./README.md), specifically with regard to mocking, Pydantic models, AWS service interaction, middleware usage, etc. It is ok to leave small, low-priority comments about code standards violations.\n\nIt is also ABSOLUTELY CRITICAL to ensure that log statements do not contain PII/PHI data. Instead, use internal UUIDs to identify users, accounts, patients, resources, etc. See the [PII/PHI Logging Rules](#piiphi-logging-rules) section for the complete list of prohibited and safe fields.\n\nFor logging, error handling, traceability, etc. it's also critical that any new lambda handler uses the standard `lambda-handler` package and the `BioscopeLogger` and that any new rest API lambda uses the standard `shared-middleware` package.\n\n### IDOR Prevention\n\nWhen reviewing route handlers, watch for authorization gaps that could allow users to access or modify resources belonging to other accounts/patients:\n\n- **Patient routes**: Any route with `{patient_id}` in the path must use `Depends(validate_patient_account_from_path_as_patient)` (from `shared_middleware`). This middleware calls account-service to verify the patient belongs to the requesting account. If a route takes a patient ID without this dependency and does not do patient validation internally, it's an IDOR vulnerability.\n- **Always use the validated patient result**: When a route uses `validate_patient_account_from_path_as_patient`, always name the dependency `patient` (never `_`). If the route also takes a sub-resource ID (e.g., `{chat_id}`, `{file_id}`), the service layer must verify that the fetched resource's `patient_id` matches `patient.patient_id`. Discarding the patient dependency with `_` is a red flag — it means the patient-to-resource ownership check is likely missing.\n- **Other resource routes**: Routes that fetch a resource by ID (e.g., orders, EHR connections) must verify `resource.account_id == account_id` before returning or mutating it. If the resource is patient-specific (contains a `patient_id` field), the route must also validate that `resource.patient_id == patient_id`.\n- **List/query endpoints**: Queries that return collections must scope by `account_id` (or `patient_id` where applicable) to prevent cross-account data leakage.\n- **Trusted headers**: The `Bioscope-Account-Id` and `Bioscope-User-Id` headers are validated by the API Gateway account authorizer and can be trusted for authorization checks. Use these (via `BioscopeAccountIdHeaderDeps`, `BioscopeUserIdHeaderDeps`), and NEVER trust account id or user id from path params, query params, or request bodies.\n\n### Billing Enforcement\n\nAny route that creates or modifies patient data or consumes metered resources (e.g., LLM tokens, test orders) must enforce billing via the billing validation middleware from `shared_middleware.billing_validation`:\n\n- **`ensure_patient_billing_access_from_path`**: Use when `patient_id` is a path parameter. Add as a `Depends()` dependency on the route.\n- **`ensure_patient_billing_access_from_body`**: Use when `patient_id` is in the request body (as `patientId` at the root level). Add as a `Depends()` dependency on the route.\n\nBoth middlewares invoke account-service to check the account's billing entitlements and return a 403 with a specific denial reason if access is not granted. Read-only routes (listing, viewing) do not require billing enforcement.\n\n## Commands\n\nNx commands are run with:\n\n```bash\npnpm exec nx run \u003cpackage-name\u003e:\u003ccommand\u003e\n```\n\nFor example, to run tests for the `dynamodb-helper` package:\n\n```bash\npnpm exec nx run dynamodb-helper:test\n```\n\nAvailable commands are defined in `nx.json` at the root and in each package's `project.json` file.\n\n### Formatting, Linting, and Type Checking\n\nFor code quality, ALWAYS run formatting, linting, and type checking after making changes. These are three separate commands — `format` and `lint` are NOT the same thing, even though both use `ruff` under the hood. `format` fixes code style (whitespace, line length, etc.) while `lint` catches code quality issues (unused imports, bad practices, etc.). ALWAYS run all three of the following commands after making changes:\n\n```bash\npnpm exec nx run \u003cpackage-name\u003e:format\npnpm exec nx run \u003cpackage-name\u003e:lint\npnpm exec nx run \u003cpackage-name\u003e:type-check\n```\n\n**IMPORTANT**: You MUST run `format`, `lint`, and `type-check` commands (in addition to tests) after making changes to ensure your code is correct. Fix all formatting, linting, and type checking issues before considering the task complete.\n\n## Types\n\nThis repo makes heavy use of Pydantic V2 models. Shared models are typically defined in the `bioscope-types` package.\n\nWe have a `BioscopeBaseModel` class that is a subclass of `BaseModel` that adds some additional functionality, mostly adding camelCase aliases to the fields.\nIn our code, we use snake_case for everything, but anything leaving or entering Python should be camelCase, for example:\n\n- Network requests and responses\n- Database rows\n- Logging statements\n\nThe shared `BioscopeBaseModel` automatically takes care of this for us.\n\n## FastAPI Routes (`packages/**/src/**/routes/**.py`)\n\n### Basic Conventions\n\n- Route functions should be async\n- Router should have a common prefix per file\n- Follow standard REST conventions\n\n### Headers and Authentication\n\nThese routes are configured with an AWS API Gateway. Most routes are secured with a custom lambda authorizer.\n\nThis authorizer validates the Bearer JWT token and extracts the user ID from the token.\nRequests come in with a `Bioscope-Account-Id` header that contains the account ID.\nThe authorizer ensures that the user in the JWT belongs to the account.\nThis means that these headers are \"safe\" and guaranteed to be valid for the calling user.\n\nTherefore, authorization (i.e. to prevent IDOR, etc.) should be done via these headers.\n\nThese headers can be injected into the route function as dependencies using the `BioscopeUserIdHeaderDeps` and `BioscopeAccountIdHeaderDeps` classes.\n\n### Models\n\nRequest and response models should both be Pydantic models that inherit `BioscopeBaseModel`.\n`BioscopeBaseModel` automatically handles camelCase to snake_case conversion for all fields.\n\n### Logging\n\nRoutes should use the `BioscopeLoggerDeps` class to inject the logger into the route function.\nThis logger is automatically configured to include the user ID and account ID in the log messages.\n\n#### PII/PHI Logging Rules\n\n**Fields that must NEVER be logged:**\n\n- Patient names, emails, phone numbers, addresses, dates of birth\n- Medical data (diagnoses, medications, lab results, clinical notes)\n- Full request/response bodies from external APIs (FHIR, EHR, lab vendors, etc.)\n- Webhook payloads (these often contain patient data or credentials)\n- Secrets, tokens, API keys, credentials — omit these entirely (no length hints either)\n- Template parameters that contain patient-facing content (e.g., SMS/email body text)\n\n**Safe fields that CAN be logged:**\n\n- Internal UUIDs: `patient_id`, `account_id`, `user_id`, `order_id`, `connection_id`, `correlation_id`\n- Status codes, HTTP methods, URL paths\n- Counts and lengths (e.g., number of records processed, response body length)\n- Template/event names, enum values, operation names\n- Durations, timestamps, retry counts\n\n**Redaction pattern** — when context about a sensitive value is needed for debugging, log a length hint instead of the value:\n\n```python\n# Good — log a length hint for debugging without exposing the value\nlogger.info(\"received webhook\", extra={\"bodyLength\": len(body)})\n\n# Good — log only safe identifiers\nlogger.info(\"processing patient\", extra={\"patientId\": patient_id, \"accountId\": account_id})\n\n# Bad — logs the entire webhook/response body (may contain PII/PHI)\nlogger.info(\"received webhook\", extra={\"body\": body})\nlogger.info(\"API response\", extra={\"response\": response.json()})\n```\n\n**Never log full request/response bodies** — log the status code and body length instead:\n\n```python\n# Good\nlogger.info(\"FHIR response\", extra={\"statusCode\": response.status_code, \"bodyLength\": len(response.content)})\n\n# Bad\nlogger.info(\"FHIR response\", extra={\"body\": response.json()})\n```\n\n**Exception messages** — do not embed API response text in exception messages, as these end up in logs via `logger.exception`:\n\n```python\n# Good\nraise ValueError(f\"EHR API returned {response.status_code}\")\n\n# Bad — response body may contain PHI\nraise ValueError(f\"EHR API error: {response.text}\")\n```\n\n#### Formatting\n\nDo not wrap values in `str()` when passing them as log `extra` fields. `BioscopeLogger` handles serialization automatically. For example, use `extra={\"patientId\": patient_id}`, not `extra={\"patientId\": str(patient_id)}`. With this in mind, you also do not need to JSON-stringify any logged models; you can pass in a Python dict to `extra` (though be careful that any logged models do not contain PII or PHI, per the rules above).\n\n```python\n# Good\nextra={\"metric\": usage_metric.model_dump()}\n\n# Bad\nextra={\"metric\": usage_metric.model_dump_json()}\nextra={\"metric\": json.dumps(usage_metric.model_dump())}\n```\n\n### HTTP Client\n\n`httpx` is our preferred HTTP client. Do not use `requests` or `aiohttp` for new code. If another external library requires `aiohttp` or `requests`, that is fine. An example of this is `slack-sdk` which requires `aiohttp`.\n\nWhen testing code that uses `httpx`, use `respx` for mocking. Use the **pytest fixture pattern for this**.\n\n### Relative Versus Absolute Imports\n\nProduction code should always use absolute imports. For example:\n\n```python\nfrom account_service.models import Account # GOOD\nfrom .models import Account # BAD\n```\n\nHowever, test directories are not modules. They cannot and should not contain `__init__.py` files. Therefore, relative imports must be used in test directories. For example:\n\n```python\nfrom .conftest import build_data # GOOD\nfrom tests.conftest import build_data # BAD\n```\n\n### Error Handling\n\nRaise `HTTPException` with appropriate status code and detail message\n\n## Lambda Handlers (`packages/**/handler.py`)\n\n### Handler Types\n\n1. **LambdaHandler** - base handler for non-API Gateway functions\n2. **HttpHandler** - extends LambdaHandler with API Gateway support (requires `lambda-handler[api]`)\n\n### Lazy Loading Pattern\n\nMany lambdas serve both as direct invocation functions and API Gateway integrations. Loading Python modules can be slow (100s of milliseconds), especially with many Pydantic models. This impacts cold start time.\n\n**Solution**: Use lazy loading in `handler.py` files only. Load direct invocation handling code only when needed, and vice versa for API Gateway routes.\n\n**Example**:\n\n```python\nfrom lambda_handler.http_handler import HttpHandler\n\ndef get_app():\n from my_service.app import app # noqa: PLC0415\n return app\n\nhandler = HttpHandler(get_app)\n\n@handler.direct_invocation()\ndef handle_direct_invocation(event: DirectInvocationEvent, logger: BioscopeLogger):\n from my_service.handlers.handler_one import handle_handler_one # noqa: PLC0415\n return handle_handler_one(event, logger)\n```\n\n**Important**:\n\n- Restrict lazy imports to `handler.py` only\n- Keep common imports (logger, types, handler framework) at module level\n- Use `# noqa: PLC0415` to suppress linting warnings\n- Never lazy load in business logic or service modules\n\n### Decorators\n\n| Event Source | Decorator | Required kwarg | Notes |\n| ----------------- | ---------------------------- | ---------------------- | ---------------------------------------- |\n| SQS | `@handler.sqs` | `queue_name=\"\u003cqueue\u003e\"` | |\n| SNS | `@handler.sns` | `topic_name=\"\u003ctopic\u003e\"` | |\n| Direct Invocation | `@handler.direct_invocation` | N/A | Operation extracted from request model |\n| Event Bridge | `@handler.event_bridge` | N/A | Handles all EventBridge events |\n| API Gateway Auth | `@handler.authorizer` | N/A | For custom API Gateway authorizers |\n| Health Check | `@handler.health_check` | N/A | Custom health check (built-in available) |\n\n**Notes**:\n\n- EventBridge and authorizer handlers do not use operation discriminators - they handle all events of their type sent to the function.\n- Direct invocation handlers automatically extract the `operation` from the request model's `operation` class attribute.\n- A built-in health check handler is automatically registered for all Lambda functions and responds to `{\"operation\": \"healthCheck\"}` requests.\n\n### Message Payloads\n\n• Define a Pydantic model that **inherits `BioscopeBaseModel`** for every distinct message body.\n• Models should be defined in the `bioscope_types` package under the `services` module.\n\nAlways annotate the first parameter with the corresponding event model from `lambda_handler.models`, e.g. `SqsEvent[MyMessage]`.\n`MyMessage` should be a new Pydantic model that inherits `BioscopeBaseModel`.\n`BioscopeBaseModel` automatically handles camelCase to snake_case conversion for all fields.\n\n### Dependency Injection\n\nHandler functions may declare these optional parameters which will be injected automatically:\n\n- `logger: BioscopeLogger` - the project-wide structured logger.\n- `context: LambdaContext` - the AWS Lambda context object.\n\n### Example (SQS)\n\n```python\nfrom lambda_handler.handler import LambdaHandler\nfrom lambda_handler.models.sqs import SqsEvent\nfrom bioscope_types.common import BioscopeBaseModel\n\nhandler = LambdaHandler()\n\nclass MySqsMessage(BioscopeBaseModel):\n my_custom_field: str\n\n@handler.sqs(queue_name=\"my-queue\")\ndef handle_sqs_event(event: SqsEvent[MySqsMessage], logger, context):\n logger.info(\"processing message\", extra={\"myCustomField\": event.body.my_custom_field})\n```\n\n### Style Rules\n\n- Use **explicit type annotations** everywhere.\n- Keep handler bodies minimal; delegate business logic to service modules.\n- Use the provided `logger`, not `print`, for output.\n- Do not log PII/PHI data. Follow the [PII/PHI Logging Rules](#piiphi-logging-rules) in the FastAPI Routes section — the same rules apply to Lambda handlers. Never log full event bodies, external API responses, webhook payloads, tokens, API keys, credentials, or other secrets.\n\n### Handler Organization (`packages/**/src/**/handlers/**/*.py`)\n\nFor services with many direct invocation handlers, organize them in a dedicated `handlers` directory rather than implementing the business logic directly in `handler.py`.\n\n### Structure\n\n```text\nsrc/\n service_name/\n handler.py # Contains @handler.direct_invocation decorators\n handlers/\n __init__.py # Exports all handler functions\n handler_one.py # Individual handler implementation\n handler_two.py # Individual handler implementation\n```\n\n### Handler Function Signature\n\nHandler functions should follow this standardized signature:\n\n```python\nasync def handle_operation_name(\n args: OperationArgs,\n logger: BioscopeLogger,\n) -\u003e OperationResponse:\n # Implementation here\n```\n\nWhere:\n\n- `args` is the operation's arguments model from `bioscope_types.services`\n- `logger` is the structured logger instance\n- Return type matches the operation's response model\n\n### Main Handler File\n\nThe main `handler.py` file should delegate to the individual handlers:\n\n```python\nfrom service_name.handlers import handle_operation_name\n\n@handler.direct_invocation()\nasync def operation_name_handler(\n event: OperationRequest, parent_logger: BioscopeLogger\n) -\u003e OperationResponse:\n return await handle_operation_name(\n args=event.args,\n logger=parent_logger.child(\n {\n # Add relevant fields from event.args (in camelCase and avoiding PHI/PII)\n }\n ),\n )\n```\n\n## AWS Services (`packages/**/src/**/aws.py`)\n\n**All** AWS service clients should be abstracted using context managers in a dedicated `aws.py` file. This pattern should be used for all AWS services **except** those with specialized helper packages (i.e. S3 via `s3_helper`, SQS via `queue_helper`, and DynamoDB via `dynamodb_helper`).\n\n### AWS Abstraction Pattern\n\nCreate `src/package_name/aws.py`:\n\n```python\nfrom contextlib import asynccontextmanager\nfrom aioboto3 import Session\n\nsession = Session()\n\n@asynccontextmanager\nasync def get_service_name():\n async with session.client(\"service-name\") as client:\n yield client\n```\n\n### Usage in Production Code\n\n```python\nfrom package_name.aws import get_service_name\n\nasync def some_operation() -\u003e None:\n async with get_service_name() as client:\n await client.some_api_call()\n```\n\n## Testing (`packages/**/tests/**/*.py`)\n\n### Basic Rules\n\n- Prefer **pytest** for all unit tests.\n- Use **botocore.stub.Stubber** for mocking AWS services (don't use `mock.patch` directly on the service) except in the `dynamodb_helper` package which uses `moto` for mocking.\n- Tests are all run with `asyncio_mode = \"auto\"` in `pyproject.toml`, so tests don't need to be marked as async individually.\n- **AVOID** asserting on logger calls except in very limited cases. Use a real BioscopeLogger instance (see Logger Fixture section) rather than mocking it. If you absolutely need to test logging behavior, use `caplog: pytest.LogCaptureFixture`. (see @bioscope_logger/README.md)\n- Use pytest fixtures for both mocking and for defining common test data.\n- Test all cases for 100% test coverage, but don't overdo it with tests. And don't waste time testing code that is not written by us; i.e. don't write a test that effectively tests a library.\n- Under **no circumstances** should you write large amounts of code in a test file and then write tests that effectively test that code instead of the code in the actual production file.\n\n### Test Structure\n\n- Mirror source code structure in test organization\n- Individual classes for each function being tested\n- Individual methods for each test case\n\nExample:\n\n```python\nclass TestCopyS3ToTemp:\n def test_happy_path(self):\n pass\n\n def test_invalid_url_format(self):\n pass\n\n def test_s3_error(self):\n pass\n```\n\n### Assertions\n\nWhen performing assertions on data, compare the entire object as much as possible rather than individual assertions for each field.\n\nFor example, instead of:\n\n```python\nassert result is not None\nassert len(result) == 1\nassert result[0].id == \"123\"\nassert result[0].name == \"John Doe\"\nassert result[0].email == \"john.doe@example.com\"\n```\n\nyou should do:\n\n```python\nassert result == [User(\n id=\"123\",\n name=\"John Doe\",\n email=\"john.doe@example.com\"\n)]\n```\n\nWhen performing assertions on what functions were called with, use the built in assert calls like `assert_called_once_with` rather than checking the arguments directly.\nFor example, instead of:\n\n```python\nassert mock_foo.call_args.args == (\"123\", \"John Doe\", \"john.doe@example.com\")\n```\n\nyou should do:\n\n```python\nmock_foo.assert_called_once_with(\"123\", \"John Doe\", \"john.doe@example.com\")\n```\n\n### Async vs Sync Assertions\n\n**IMPORTANT**: For async functions (using `AsyncMock`), use `assert_awaited...` methods:\n\n- `assert_awaited_once()` instead of `assert_called_once()`\n- `assert_awaited_once_with(args)` instead of `assert_called_once_with(args)`\n- `assert_not_awaited()` instead of `assert_not_called()`\n\nFor sync functions (using `MagicMock`), use `assert_called...` methods:\n\n- `assert_called_once()`\n- `assert_called_once_with(args)`\n- `assert_not_called()`\n\n### Positive and Negative Assertions\n\nAlways include both positive assertions (what should happen) and negative assertions (what should NOT happen) to ensure functions aren't being called unexpectedly.\n\n### Mocking\n\nAs stated, `pytest_mock` should be used for mocking and all mocks should be defined as fixtures. Use `httpx` for HTTP clients and `respx` for mocking `httpx` calls in tests, with `respx` configured via pytest fixtures.\n\nMocks should always be at most one level deep. i.e. if function a calls function b, and function b calls function c and you are testing function a, you should mock function b, not function c.\n\n#### Mock Fixture Naming\n\nMock fixtures should be named `mock_\u003cfunction_name\u003e`, matching the function being patched. For example:\n\n```python\n# Patching ensure_account_has_stripe_customer_id\n@pytest.fixture\ndef mock_ensure_account_has_stripe_customer_id(mocker: MockerFixture) -\u003e AsyncMock:\n return mocker.patch(\"some_service.module.ensure_account_has_stripe_customer_id\")\n\n# Patching invoke_lambda\n@pytest.fixture\ndef mock_invoke_lambda(mocker: MockerFixture) -\u003e AsyncMock:\n return mocker.patch(\"lambda_client.client.invoke_lambda\")\n```\n\n**Exception: DynamoDB model functions.** Because `dynamodb_helper` model modules share common function names (`get_by_id`, `create`, `upsert`, etc.), mock fixtures for DynamoDB model functions must be prefixed with the table module name to avoid collisions: `mock_\u003cmodule_name\u003e_\u003cfunction_name\u003e`.\n\n```python\n# Two different get_by_id functions — module prefix disambiguates\n@pytest.fixture\ndef mock_accounts_get_by_id(mocker: MockerFixture) -\u003e AsyncMock:\n return mocker.patch(\"dynamodb_helper.models.accounts.get_by_id\")\n\n@pytest.fixture\ndef mock_patients_get_by_id(mocker: MockerFixture) -\u003e AsyncMock:\n return mocker.patch(\"dynamodb_helper.models.patients.get_by_id\")\n```\n\n#### Mock Fixture Placement\n\nMock fixtures must be defined at module top-level (between imports and the first test class), never inside test classes. They should not be placed in `conftest.py` since they are path-specific. Only shared data fixtures belong in `conftest.py`.\n\n#### AWS Service Mocking\n\nWhen testing code that uses AWS services, follow this pattern (see [AWS Services](#aws-services-packagessrcawspy) section for the production abstraction):\n\n**Create AWS abstraction** (`src/package_name/aws.py`):\n\n```python\nfrom contextlib import asynccontextmanager\nfrom aioboto3 import Session\n\nsession = Session()\n\n@asynccontextmanager\nasync def get_s3():\n async with session.client(\"s3\") as s3_client:\n yield s3_client\n```\n\n**Use abstraction in production code**:\n\n```python\nfrom package_name.aws import get_s3\n\nasync def upload_file(bucket: str, key: str, content: bytes) -\u003e None:\n async with get_s3() as s3:\n await s3.put_object(Bucket=bucket, Key=key, Body=content)\n```\n\n**Test with botocore stubber**:\n\n```python\nfrom collections.abc import AsyncGenerator\nfrom contextlib import asynccontextmanager\nimport pytest\nfrom aioboto3 import Session\nfrom botocore.stub import Stubber\nfrom pytest_mock import MockerFixture, MockType\n\n@pytest.fixture(autouse=True)\ndef fake_aws_env(monkeypatch: pytest.MonkeyPatch) -\u003e None:\n monkeypatch.setenv(\"AWS_ACCESS_KEY_ID\", \"testing\")\n monkeypatch.setenv(\"AWS_SECRET_ACCESS_KEY\", \"testing\")\n monkeypatch.setenv(\"AWS_SESSION_TOKEN\", \"testing\")\n monkeypatch.setenv(\"AWS_DEFAULT_REGION\", \"us-east-2\")\n\n@pytest.fixture\ndef mock_get_s3(mocker: MockerFixture) -\u003e MockType:\n return mocker.patch(\"package_name.client.get_s3\")\n\n@pytest.fixture\nasync def s3_stub(mock_get_s3: MockType) -\u003e AsyncGenerator[Stubber]:\n session = Session()\n async with session.client(\"s3\", region_name=\"us-east-2\") as s3_client:\n stubber = Stubber(s3_client)\n stubber.activate()\n\n @asynccontextmanager\n async def _fake_get_s3():\n yield s3_client\n\n mock_get_s3.side_effect = _fake_get_s3\n yield stubber\n stubber.assert_no_pending_responses()\n stubber.deactivate()\n\nclass TestUploadFile:\n async def test_upload_success(self, s3_stub: Stubber):\n s3_stub.add_response(\n \"put_object\",\n {},\n {\n \"Bucket\": \"test-bucket\",\n \"Key\": \"test-key\",\n \"Body\": b\"test-content\",\n },\n )\n\n await upload_file(\"test-bucket\", \"test-key\", b\"test-content\")\n```\n\nThis `aws.py` file itself should be added to the `omit` list in the `pyproject.toml` file of the package. For example:\n\n```toml\nomit = [\n \"src/\u003cpackage_name\u003e/aws.py\",\n]\n```\n\n### Running Tests\n\n```bash\npnpm exec nx run \u003cpackage-name\u003e:test\n```\n\n### Fixtures\n\n#### Logger Fixture\n\n**IMPORTANT**: Always use a real `BioscopeLogger` instance in tests, not a mock. Create a `conftest.py` file in your package's test directory:\n\n```python\nimport pytest\nfrom bioscope_logger import BioscopeLogger, get_logger\nfrom uuid import uuid4\n\n@pytest.fixture\ndef logger() -\u003e BioscopeLogger:\n return get_logger(\"package-name\", uuid4())\n```\n\nThis fixture will be automatically available to all tests in the package. **Never** create individual logger fixtures using `AsyncMock` or `MagicMock` in test files - always use the real logger from conftest.py.\n\n#### Other Fixtures\n\nExample:\n\n```python\nfrom unittest.mock import AsyncMock, MagicMock\nfrom pytest_mock import MockerFixture\nfrom models import Patient\n\n@pytest.fixture\ndef patient() -\u003e Patient:\n return Patient(\n id=\"123\",\n name=\"John Doe\",\n )\n\n@pytest.fixture\ndef mock_get_patient(mocker: MockerFixture) -\u003e AsyncMock:\n return mocker.patch(\"some_service.utils.get_patient\")\n\n@pytest.fixture\ndef mock_sync_function(mocker: MockerFixture) -\u003e MagicMock:\n return mocker.patch(\"some_service.utils.sync_function\")\n\nclass TestMyFunction:\n async def test_happy_path(self, patient: Patient, mock_get_patient: AsyncMock):\n mock_get_patient.return_value = patient\n # Use assert_awaited_once_with for async mocks\n mock_get_patient.assert_awaited_once_with(\"patient_id\")\n\n def test_sync_function(self, mock_sync_function: MagicMock):\n mock_sync_function.return_value = \"result\"\n # Use assert_called_once_with for sync mocks\n mock_sync_function.assert_called_once_with(\"arg\")\n```\n\n**Fixture Type Guidelines**:\n\n- Use `MagicMock` for synchronous functions\n- Use `AsyncMock` for asynchronous functions\n- pytest-mock automatically creates the correct mock type, but explicit typing helps with IDE support\n\n### Test Coverage\n\nAlways aim for 100% coverage. `#pragma: no cover` can be used to exclude specific lines from coverage.\n\n### Do NOT create `__init__.py` files in test directories\n\nYou should NEVER create an `__init__.py` file in a test directory. Doing so will break the VSCode/Cursor test explorer.\n\n## Querying Logs in Axiom\n\nUse the Axiom MCP tools to query logs. If the Axiom MCP tools are not available, stop and ask the user to set up the Axiom MCP server in their Claude Code configuration before proceeding.\n\nLogs are in the `bioscope-dev` dataset for the dev AWS environment and the `bioscope-prod` dataset for the prod AWS environment. Axiom was enabled in prod on **2026-02-19**, so there are no prod logs before that date. Axiom uses APL (similar to Kusto/KQL). All field names are **camelCase**.\n\n### Key Fields\n\n| Field | Description |\n| -------------------------------------- | ---------------------------------------------------------- |\n| `_time` | Timestamp |\n| `logGroup` | CloudWatch log group (e.g., `/aws/lambda/account-service`) |\n| `message` | Log message |\n| `levelname` | Log level (`INFO`, `ERROR`, etc.) |\n| `service` | Service name |\n| `correlationId` | UUID for tracing requests across services |\n| `accountId`, `userId`, `patientId` | Entity identifiers |\n| `path`, `method`, `statusCode`, `took` | HTTP request details |\n| `errorMessage`, `errorType` | Error details |\n| `data` | Object containing extra fields not in the standard set |\n\n### Example Queries\n\n```apl\n// Errors in a service\n['bioscope-dev']\n| where levelname == \"ERROR\" and logGroup == \"/aws/lambda/account-service\"\n\n// Trace a request across services\n['bioscope-dev']\n| where correlationId == \"550e8400-e29b-41d4-a716-446655440000\"\n| order by _time asc\n\n// Slow requests\n['bioscope-dev']\n| where took \u003e 1000\n| project _time, service, path, took\n\n// Error counts by service (last hour)\n['bioscope-dev']\n| where _time \u003e ago(1h) and levelname == \"ERROR\"\n| summarize count() by logGroup\n```"])</script><script>self.__next_f.push([1,"15:[\"$\",\"div\",\"platform-services\",{\"className\":\"mb-8\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-xs font-medium text-text-dim uppercase tracking-wide mb-3\",\"children\":\"platform-services\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"div\",\"/Users/gabry/Desktop/platform-services/AGENTS.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"AGENTS.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/platform-services/AGENTS.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$1b\",\"previewLines\":8}]]}],\"$L1c\",\"$L1d\",\"$L1e\"]}]]}]\n1f:Tc8a,"])</script><script>self.__next_f.push([1,"# Web App - Claude Instructions\n\n## E2E Test Users\n\n### How test users are managed\n\nE2E tests use Auth0 users with the email pattern `success+test_user_N@simulator.amazonses.com` and password `test123!`. The user list is in `e2e/data/users.json`. Each developer (or worktree) reserves a slot of 25 users via the `E2E_USER_START_INDEX` env var in `.env.local` (see README for slot table).\n\n### How to add more test users\n\nTest users must be created in the Auth0 dashboard for the `bioscope-dev` tenant. There is no Management API key available — users must be created through the UI.\n\n**Steps per user:**\n\n1. Go to https://manage.auth0.com/dashboard/us/bioscope-dev/users\n2. Click \"Create User\" (dropdown) -\u003e \"Create via UI\"\n3. Enter email: `success+test_user_N@simulator.amazonses.com`\n4. Enter password: `test123!`\n5. Click \"Create\" — this navigates to the User Details page\n6. Find the Email field (shows \"UNVERIFIED\") -\u003e click \"Edit\"\n7. In the modal, click the \"Set email as verified\" link/button -\u003e click \"Save\"\n8. Click \"Back to Users\" to return to the list\n9. Add the user to `e2e/data/users.json`\n\n**Important notes:**\n- The Auth0 dashboard is very slow. Allow 10-20 seconds between interactions.\n- \"Set email as verified\" is a clickable button/link in the Edit Email modal, not a checkbox.\n- Auth0 search indexing has a delay — newly created users may not appear in search immediately.\n- Do NOT use the app signup flow to create test users. It uses email verification codes and does not set a password.\n\n### How to test flows manually with a browser MCP server\n\nWhen using a browser MCP server (Playwright MCP, Chrome DevTools MCP, etc.) to manually test application flows against the dev environment:\n\n1. **Pick a test user from your slot.** Check your `E2E_USER_START_INDEX` in `.env.local` and pick a user within your 25-user range (e.g., if your start index is 50, use `success+test_user_51@simulator.amazonses.com` through `test_user_75`).\n\n2. **Clear the test user data before testing.** This resets the user to a clean state in the backend:\n ```bash\n curl -X POST https://api.dev.bioscope.ai/internal/test/clear-test-users \\\n -H \"Content-Type: application/json\" \\\n -H \"Bioscope-Internal-Api-Key: Ug3jsqC73u72dw41Gnzn\" \\\n -d '{\"test_user_emails\": [\"success+test_user_N@simulator.amazonses.com\"]}'\n ```\n\n3. **Run your manual browser test.** Navigate to `https://app.dev.bioscope.ai` (or `http://localhost:5173` if testing local changes), log in with the test user email and `test123!`, and walk through the flow.\n\n4. **Clear the test user data after testing.** Run the same curl command from step 2 to clean up.\n\n## GitHub Actions\n\nAll external GitHub Actions in workflow files must be pinned to commit SHAs, not version tags. Version tags are mutable and can be hijacked in a supply chain attack. Add the version as a comment for readability.\n\n```yaml\n# Good\n- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n\n# Bad\n- uses: actions/checkout@v4\n```\n\nInternal `bioscope-ai/ci` actions must also be pinned to commit SHAs with `# main` as a comment.\n\n## Code Conventions\n\n- See `.claude/rules.md` for coding rules.\n- Never include PII/PHI in log metadata."])</script><script>self.__next_f.push([1,"16:[\"$\",\"div\",\"web-app\",{\"className\":\"mb-8\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-xs font-medium text-text-dim uppercase tracking-wide mb-3\",\"children\":\"web-app\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"div\",\"/Users/gabry/Desktop/web-app/CLAUDE.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"CLAUDE.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/web-app/CLAUDE.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$1f\",\"previewLines\":8}]]}],\"$L20\",\"$L21\"]}]]}]\n22:T20f4,"])</script><script>self.__next_f.push([1,"# WGS Ingestion Bot\n\nSlack bot that automatically investigates WGS ingestion failures using Claude Code.\n\n## Persona\n\nYou are a bioinformatics engineer embedded in the Bioscope platform team. You have deep expertise in clinical WGS pipelines and are the on-call expert for ingestion failures. Assume your audience (the engineering team in Slack) has strong genomics and software knowledge -- do not over-explain standard concepts.\n\n### Domain Knowledge\n\n**Pipeline scope:** Bioscope runs 30x whole genome sequencing. The analysis is limited to single nucleotide variants (SNVs) and small insertions/deletions (INDELs, \u003c1000bp). It does NOT detect or report: copy number variants (CNVs), structural variants (SVs), repeat expansions, HLA typing, or other complex variant types.\n\n**Ingestion pipeline stages (in order):**\n\n1. **Kit intake** -- GxG vendor integration, kit registration via `wgs_ingestion_service`\n2. **Raw data receipt** -- RAW_VCF, RAW_FASTQ, RAW_BAM artifacts land in S3\n3. **VCF processing** -- validation, quality filtering, invalid VCF detection (`vcf_processor`)\n4. **Iceberg partitioning** -- variant data written to Iceberg tables via Glue/Athena\n5. **WGS query** -- ClinVar + dbSNP annotation, high/low significance variant splitting (`genomics_wgs_query_service`)\n6. **Variant assessment** -- pathogenicity scoring, clinical significance classification, risk stratification, genomic tile generation (`genomics_variant_assessment_service`)\n7. **PRS processing** -- intermediate VCF generation, ancestry inference (6 populations: EUR, AFR, AMR, CSA, EAS, MID), polygenic risk score calculation across 36+ traits (`genomics_prs_processor`)\n8. **Blood typing** -- BAM subsetting, bloodAGENT phenotype prediction for ABO, RHD, and other blood group systems (`genomics_blood_type_service`)\n9. **Results delivery** -- event publishing, patient notification\n\n**Key services and their log groups:**\n\n| Service | Purpose |\n|---------|---------|\n| `wgs_ingestion_service` | Orchestrates the full pipeline via Step Functions |\n| `vcf_processor` | VCF validation and filtering |\n| `genomics_wgs_query_service` | Variant annotation with ClinVar/dbSNP, significance filtering |\n| `genomics_variant_assessment_service` | Clinical interpretation, tile generation |\n| `genomics_prs_processor` | Polygenic risk score calculation |\n| `genomics_prs_results_service` | PRS result retrieval and enrichment |\n| `genomics_blood_type_service` | Blood group phenotyping |\n| `genomics_bam_subset_processor` | BAM subsetting for blood typing |\n| `genomics_event_consumer` | WGS event processing |\n| `wgs_data_lineage_service` | Artifact traceability |\n\n\n**External databases:** ClinVar, dbSNP, ClinGen, MONDO (disease ontology), PGS Catalog\n\n**Infrastructure:** AWS -- S3 (artifacts), DynamoDB (metadata/tracking), Step Functions (orchestration), Glue (ETL), Athena (SQL over variants), Bedrock/Claude (LLM services via llm_proxy_service)\n\n### Communication Style\n\n- Be direct and technical. Lead with the finding, not the process.\n- When reporting failures, always identify: which pipeline stage failed, which service, and the relevant correlation/ingestion IDs.\n- Use standard genomics terminology without hedging (allele, zygosity, pathogenicity, etc.).\n- When a failure is ambiguous, state what you know, what you suspect, and what you would need to confirm -- do not speculate beyond the evidence in the logs.\n- Keep Slack replies concise. Save detail for the uploaded markdown report.\n\n## Tool Restrictions\n\n- NEVER use `ide - executeCode` or any IDE tools. Use the standard `Write` tool to create report files.\n- Write all reports to `./reports/` using the `Write` tool.\n- **CRITICAL**: If a tool call fails or is blocked due to permission restrictions, you MUST NOT hang waiting for terminal approval. Instead, IMMEDIATELY post a message to the Slack thread via `slack_reply` explaining what you tried to do and what permission is missing, then continue with the rest of the investigation. A silently blocked bot is useless -- always communicate status to Slack and keep moving.\n- **CRITICAL**: Before creating a Linear issue (`save_issue`), you MUST first ask for approval in the Slack thread. Post a message describing the issue you want to create (title, team, description) and explicitly ask \"Should I create this ticket?\" Then WAIT for the user to reply with confirmation before calling `save_issue`. Never create Linear issues without explicit user approval in Slack.\n\n## Setup\n\nRequired environment variables (set in `.env`, which is gitignored):\n\n| Variable | Description |\n|----------|-------------|\n| `SLACK_APP_TOKEN` | Socket Mode app token (`xapp-...`) |\n| `SLACK_BOT_TOKEN` | Bot OAuth token (`xoxb-...`) |\n| `ALERT_CHANNEL_ID` | Slack channel ID for ingestion alerts |\n| `DM_CHANNEL_ID` | Slack channel ID for direct messaging with allowed users (optional) |\n| `PLATFORM_SERVICES_PATH` | Path to local platform-services checkout (optional, enables code cross-referencing) |\n| `INFRASTRUCTURE_PATH` | Path to local infrastructure checkout (optional, enables Terraform cross-referencing) |\n\n## Git Restrictions\n\nAgents must NEVER run `git add` or `git commit` commands. The user will handle all git staging and commits manually.\n\n## Code Quality\n\n- TypeScript (Bun runtime) for the channel plugin\n- No emojis or non-standard symbols in code or markdown\n\n## Channel Architecture\n\nAlerts flow through a Claude Code Channel plugin (`channel/server.ts`):\n\n1. Slack alert arrives via Socket Mode\n2. Channel plugin pushes it as a `notifications/claude/channel` event\n3. Claude dispatches a background Agent to run the investigation (see below)\n4. On completion, Claude uses `slack_reply` and `slack_upload_report` to post results back\n\n## Concurrent Investigations\n\nAll alerts and human messages arrive in a single conversation. To stay responsive and handle multiple events in parallel, follow these rules:\n\n### Alert handling\n\nWhen an alert arrives, ALWAYS dispatch the investigation to a **background Agent** (`run_in_background: true`). Never run investigations inline in the main conversation.\n\nThe background agent prompt MUST include:\n- The full alert text\n- The `channel_id` and `thread_ts` for Slack replies\n- Instructions to follow the `/investigate-wgs-ingestion` steps (paste or reference the full procedure)\n- A reminder that the agent cannot call `slack_reply` or `slack_upload_report` directly -- it should return the report file path and a summary so the main conversation can post them\n\nWhen the background agent completes:\n1. Read the report it wrote to `./reports/`\n2. Upload it to the Slack thread via `slack_upload_report`\n3. Post a summary via `slack_reply`\n\n### Human message handling\n\nAlways respond to human messages directly in the main conversation -- do NOT delegate these to background agents. This keeps you immediately responsive to the user while investigations run in parallel.\n\n### Multiple concurrent alerts\n\nIf 2+ alerts arrive before prior investigations finish, spawn a separate background agent for each. Each agent operates independently on its own alert.\n\n## Querying Logs in Axiom\n\nLogs are in the `bioscope-dev` dataset for the dev AWS environment and the `bioscope-prod` dataset for the prod AWS environment. Axiom uses APL (similar to Kusto/KQL). All field names are **camelCase**.\n\n### Key Fields\n\n| Field | Description |\n| ------- | ------------- |\n| `_time` | Timestamp |\n| `logGroup` | CloudWatch log group (e.g., `/aws/lambda/account-service`) |\n| `message` | Log message |\n| `levelname` | Log level (`INFO`, `ERROR`, etc.) |\n| `service` | Service name |\n| `correlationId` | UUID for tracing requests across services |\n| `accountId`, `userId`, `patientId` | Entity identifiers |\n| `path`, `method`, `statusCode`, `took` | HTTP request details |\n| `errorMessage`, `errorType` | Error details |\n| `data` | Object containing extra fields not in the standard set |\n\n### Example Queries\n\n```apl\n// Errors in a service\n['bioscope-dev']\n| where levelname == \"ERROR\" and logGroup == \"/aws/lambda/account-service\"\n\n// Trace a request across services\n['bioscope-dev']\n| where correlationId == \"550e8400-e29b-41d4-a716-446655440000\"\n| order by _time asc\n\n// Slow requests\n['bioscope-dev']\n| where took \u003e 1000\n| project _time, service, path, took\n\n// Error counts by service (last hour)\n['bioscope-dev']\n| where _time \u003e ago(1h) and levelname == \"ERROR\"\n| summarize count() by logGroup\n```"])</script><script>self.__next_f.push([1,"17:[\"$\",\"div\",\"wgs-ingestion-bot\",{\"className\":\"mb-8\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-xs font-medium text-text-dim uppercase tracking-wide mb-3\",\"children\":\"wgs-ingestion-bot\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"div\",\"/Users/gabry/Desktop/wgs-ingestion-bot/CLAUDE.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"CLAUDE.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/wgs-ingestion-bot/CLAUDE.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$22\",\"previewLines\":8}]]}]]}]]}]\n"])</script><script>self.__next_f.push([1,"1a:[\"$\",\"div\",\"/Users/gabry/Desktop/infrastructure/CLAUDE.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"CLAUDE.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/infrastructure/CLAUDE.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"@AGENTS.md\",\"previewLines\":8}]]}]\n1c:[\"$\",\"div\",\"/Users/gabry/Desktop/platform-services/CLAUDE.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"CLAUDE.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/platform-services/CLAUDE.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"@AGENTS.md\",\"previewLines\":8}]]}]\n23:T7d63,"])</script><script>self.__next_f.push([1,"# Platform Services Development Guide\n\nThis is a Python monorepo using Nx and uv for managing dependencies and builds. Testing is done with pytest. Most packages are either deployed as AWS Lambda functions or shared libraries.\n\n## Project Structure\n\nThis is a monorepo containing multiple Python packages that follow consistent patterns and conventions.\n\n## Account Types\n\nThere are two account types, stored as `account_type` in the `accounts` DynamoDB table:\n\n- **`self-evaluation`** (aka \"Try it on Yourself\") — An individual signs up to evaluate Bioscope on themselves. They act as both the physician and the patient. One user, one patient, one-time payment. Paid if there's an active `selfEvaluationAccess` entitlement in the `account-entitlements` DynamoDB table.\n- **`practice`** — A practice with one or more physicians and potentially many patients. Has two billing models:\n - **Enterprise** — created by a Bioscope employee, all billing is manual/out-of-band, all patients always considered paid. Identified by an `enterpriseProvisionedAccount` entitlement in the `account-entitlements` DynamoDB table.\n - **Standard** — physician self-signs up, billing is per-patient via yearly subscriptions tracked in the `patient-entitlements` table.\n\nFor full details, see the [Account Types and Billing Statuses](https://www.notion.so/Account-Types-and-Billing-Statuses-32713dc5995980a89921f096af7b57a5) Notion page (if you have access to Notion MCP).\n\n## GitHub Actions\n\nAll external GitHub Actions in workflow files must be pinned to commit SHAs, not version tags. Version tags are mutable and can be hijacked in a supply chain attack. Add the version as a comment for readability.\n\n```yaml\n# Good\n- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n\n# Bad\n- uses: actions/checkout@v4\n```\n\nInternal `bioscope-ai/ci` actions must also be pinned to commit SHAs with `# main` as a comment.\n\n## Dockerfile Dependency Installation\n\nAll Dockerfiles must use lockfile-deterministic dependency installs. Never use `uv pip install -e` or `pip install -e` directly, as these resolve against PyPI at build time and ignore the lockfile.\n\n### Standard pattern (uv-based images)\n\nFor Dockerfiles that use uv and target Python 3.13:\n\n```dockerfile\n# Export lockfile-pinned dependencies and install without resolution\nRUN uv export --frozen --no-dev --no-editable --package \u003cpackage-name\u003e -o /tmp/requirements.txt \u0026\u0026 \\\n uv pip install --system --no-deps -r /tmp/requirements.txt\n```\n\nThis mirrors the Lambda bundler pattern (`bundle_lambda.py` / `bundle_layer.py`). The `--frozen` flag ensures exact versions from `uv.lock` are used, and `--no-deps` prevents any resolution against PyPI.\n\n### Non-uv base images (e.g., mriqc, fastsurfer)\n\nFor Dockerfiles that extend specialized base images with a different Python version, install uv into the base image and use `uv sync` to create a Python 3.13 venv. The app runs on 3.13 while the base image's tools stay on their own Python:\n\n```dockerfile\nFROM \u003cbase-image\u003e\nUSER root\nWORKDIR /app\n\nRUN pip install --no-cache-dir \"uv\u003e=0.10.0,\u003c0.11.0\"\n\nCOPY pyproject.toml uv.lock ./\nCOPY packages/\u003cworkspace-deps\u003e/ ./packages/\u003cworkspace-deps\u003e/\n\n# Install Python under /app so non-root users can access it\nENV UV_PYTHON_INSTALL_DIR=/app/.python\nRUN uv sync --frozen --no-dev --python 3.13 --package \u003cpackage-name\u003e\n\nENTRYPOINT [\"/app/.venv/bin/python\", \"-m\", \"\u003cpackage_module\u003e.main\"]\n```\n\n### Non-workspace dependencies\n\nAny `pip install` of packages not managed by the workspace lockfile (e.g., `awscli` in utility images) must use an exact version pin (`==`). Unconstrained `pip install \u003cpackage\u003e` is not allowed.\n\n## Pull Request Guidelines\n\n### Cross-Repo Dependency Ordering\n\n`platform-services` (this repo) contains Python application code, while `infrastructure` provisions the AWS resources that the application code runs on. `platform-services` often depends on `infrastructure` changes. To avoid mistimed prod promotions breaking due to ordering, review PRs based on the following:\n\nIf a code change in this repo introduces the **first usage** of an infrastructure-managed resource (DynamoDB table/index, S3 bucket, SQS queue, SNS topic, Secrets Manager secret, etc.), leave a comment asking the author to confirm that the corresponding `infrastructure` PR that provisions the resource is already merged and promoted to prod or to confirm that this is purely greenfield development that is not yet exposed to customers in the product.\n\n### Dependency Pinning\n\nAll external package dependencies must use the compatible release operator (`~=`). Do not use `\u003e=` as it leaves the version unbounded. Exact pins (`==`) are acceptable when a package requires a specific version.\n\n### Code Standards\n\nWhen reviewing code, ensure it adheres to the code standards guidelines outlined in the [README](./README.md), specifically with regard to mocking, Pydantic models, AWS service interaction, middleware usage, etc. It is ok to leave small, low-priority comments about code standards violations.\n\nIt is also ABSOLUTELY CRITICAL to ensure that log statements do not contain PII/PHI data. Instead, use internal UUIDs to identify users, accounts, patients, resources, etc. See the [PII/PHI Logging Rules](#piiphi-logging-rules) section for the complete list of prohibited and safe fields.\n\nFor logging, error handling, traceability, etc. it's also critical that any new lambda handler uses the standard `lambda-handler` package and the `BioscopeLogger` and that any new rest API lambda uses the standard `shared-middleware` package.\n\n### IDOR Prevention\n\nWhen reviewing route handlers, watch for authorization gaps that could allow users to access or modify resources belonging to other accounts/patients:\n\n- **Patient routes**: Any route with `{patient_id}` in the path must use `Depends(validate_patient_account_from_path_as_patient)` (from `shared_middleware`). This middleware calls account-service to verify the patient belongs to the requesting account. If a route takes a patient ID without this dependency and does not do patient validation internally, it's an IDOR vulnerability.\n- **Always use the validated patient result**: When a route uses `validate_patient_account_from_path_as_patient`, always name the dependency `patient` (never `_`). If the route also takes a sub-resource ID (e.g., `{chat_id}`, `{file_id}`), the service layer must verify that the fetched resource's `patient_id` matches `patient.patient_id`. Discarding the patient dependency with `_` is a red flag — it means the patient-to-resource ownership check is likely missing.\n- **Other resource routes**: Routes that fetch a resource by ID (e.g., orders, EHR connections) must verify `resource.account_id == account_id` before returning or mutating it. If the resource is patient-specific (contains a `patient_id` field), the route must also validate that `resource.patient_id == patient_id`.\n- **List/query endpoints**: Queries that return collections must scope by `account_id` (or `patient_id` where applicable) to prevent cross-account data leakage.\n- **Trusted headers**: The `Bioscope-Account-Id` and `Bioscope-User-Id` headers are validated by the API Gateway account authorizer and can be trusted for authorization checks. Use these (via `BioscopeAccountIdHeaderDeps`, `BioscopeUserIdHeaderDeps`), and NEVER trust account id or user id from path params, query params, or request bodies.\n\n### Billing Enforcement\n\nAny route that creates or modifies patient data or consumes metered resources (e.g., LLM tokens, test orders) must enforce billing via the billing validation middleware from `shared_middleware.billing_validation`:\n\n- **`ensure_patient_billing_access_from_path`**: Use when `patient_id` is a path parameter. Add as a `Depends()` dependency on the route.\n- **`ensure_patient_billing_access_from_body`**: Use when `patient_id` is in the request body (as `patientId` at the root level). Add as a `Depends()` dependency on the route.\n\nBoth middlewares invoke account-service to check the account's billing entitlements and return a 403 with a specific denial reason if access is not granted. Read-only routes (listing, viewing) do not require billing enforcement.\n\n## Commands\n\nNx commands are run with:\n\n```bash\npnpm exec nx run \u003cpackage-name\u003e:\u003ccommand\u003e\n```\n\nFor example, to run tests for the `dynamodb-helper` package:\n\n```bash\npnpm exec nx run dynamodb-helper:test\n```\n\nAvailable commands are defined in `nx.json` at the root and in each package's `project.json` file.\n\n### Formatting, Linting, and Type Checking\n\nFor code quality, ALWAYS run formatting, linting, and type checking after making changes. These are three separate commands — `format` and `lint` are NOT the same thing, even though both use `ruff` under the hood. `format` fixes code style (whitespace, line length, etc.) while `lint` catches code quality issues (unused imports, bad practices, etc.). ALWAYS run all three of the following commands after making changes:\n\n```bash\npnpm exec nx run \u003cpackage-name\u003e:format\npnpm exec nx run \u003cpackage-name\u003e:lint\npnpm exec nx run \u003cpackage-name\u003e:type-check\n```\n\n**IMPORTANT**: You MUST run `format`, `lint`, and `type-check` commands (in addition to tests) after making changes to ensure your code is correct. Fix all formatting, linting, and type checking issues before considering the task complete.\n\n## Types\n\nThis repo makes heavy use of Pydantic V2 models. Shared models are typically defined in the `bioscope-types` package.\n\nWe have a `BioscopeBaseModel` class that is a subclass of `BaseModel` that adds some additional functionality, mostly adding camelCase aliases to the fields.\nIn our code, we use snake_case for everything, but anything leaving or entering Python should be camelCase, for example:\n\n- Network requests and responses\n- Database rows\n- Logging statements\n\nThe shared `BioscopeBaseModel` automatically takes care of this for us.\n\n## FastAPI Routes (`packages/**/src/**/routes/**.py`)\n\n### Basic Conventions\n\n- Route functions should be async\n- Router should have a common prefix per file\n- Follow standard REST conventions\n\n### Headers and Authentication\n\nThese routes are configured with an AWS API Gateway. Most routes are secured with a custom lambda authorizer.\n\nThis authorizer validates the Bearer JWT token and extracts the user ID from the token.\nRequests come in with a `Bioscope-Account-Id` header that contains the account ID.\nThe authorizer ensures that the user in the JWT belongs to the account.\nThis means that these headers are \"safe\" and guaranteed to be valid for the calling user.\n\nTherefore, authorization (i.e. to prevent IDOR, etc.) should be done via these headers.\n\nThese headers can be injected into the route function as dependencies using the `BioscopeUserIdHeaderDeps` and `BioscopeAccountIdHeaderDeps` classes.\n\n### Models\n\nRequest and response models should both be Pydantic models that inherit `BioscopeBaseModel`.\n`BioscopeBaseModel` automatically handles camelCase to snake_case conversion for all fields.\n\n### Logging\n\nRoutes should use the `BioscopeLoggerDeps` class to inject the logger into the route function.\nThis logger is automatically configured to include the user ID and account ID in the log messages.\n\n#### PII/PHI Logging Rules\n\n**Fields that must NEVER be logged:**\n\n- Patient names, emails, phone numbers, addresses, dates of birth\n- Medical data (diagnoses, medications, lab results, clinical notes)\n- Full request/response bodies from external APIs (FHIR, EHR, lab vendors, etc.)\n- Webhook payloads (these often contain patient data or credentials)\n- Secrets, tokens, API keys, credentials — omit these entirely (no length hints either)\n- Template parameters that contain patient-facing content (e.g., SMS/email body text)\n\n**Safe fields that CAN be logged:**\n\n- Internal UUIDs: `patient_id`, `account_id`, `user_id`, `order_id`, `connection_id`, `correlation_id`\n- Status codes, HTTP methods, URL paths\n- Counts and lengths (e.g., number of records processed, response body length)\n- Template/event names, enum values, operation names\n- Durations, timestamps, retry counts\n\n**Redaction pattern** — when context about a sensitive value is needed for debugging, log a length hint instead of the value:\n\n```python\n# Good — log a length hint for debugging without exposing the value\nlogger.info(\"received webhook\", extra={\"bodyLength\": len(body)})\n\n# Good — log only safe identifiers\nlogger.info(\"processing patient\", extra={\"patientId\": patient_id, \"accountId\": account_id})\n\n# Bad — logs the entire webhook/response body (may contain PII/PHI)\nlogger.info(\"received webhook\", extra={\"body\": body})\nlogger.info(\"API response\", extra={\"response\": response.json()})\n```\n\n**Never log full request/response bodies** — log the status code and body length instead:\n\n```python\n# Good\nlogger.info(\"FHIR response\", extra={\"statusCode\": response.status_code, \"bodyLength\": len(response.content)})\n\n# Bad\nlogger.info(\"FHIR response\", extra={\"body\": response.json()})\n```\n\n**Exception messages** — do not embed API response text in exception messages, as these end up in logs via `logger.exception`:\n\n```python\n# Good\nraise ValueError(f\"EHR API returned {response.status_code}\")\n\n# Bad — response body may contain PHI\nraise ValueError(f\"EHR API error: {response.text}\")\n```\n\n#### Formatting\n\nDo not wrap values in `str()` when passing them as log `extra` fields. `BioscopeLogger` handles serialization automatically. For example, use `extra={\"patientId\": patient_id}`, not `extra={\"patientId\": str(patient_id)}`. With this in mind, you also do not need to JSON-stringify any logged models; you can pass in a Python dict to `extra` (though be careful that any logged models do not contain PII or PHI, per the rules above).\n\n```python\n# Good\nextra={\"metric\": usage_metric.model_dump()}\n\n# Bad\nextra={\"metric\": usage_metric.model_dump_json()}\nextra={\"metric\": json.dumps(usage_metric.model_dump())}\n```\n\n### HTTP Client\n\n`httpx` is our preferred HTTP client. Do not use `requests` or `aiohttp` for new code. If another external library requires `aiohttp` or `requests`, that is fine. An example of this is `slack-sdk` which requires `aiohttp`.\n\nWhen testing code that uses `httpx`, use `respx` for mocking. Use the **pytest fixture pattern for this**.\n\n### Relative Versus Absolute Imports\n\nProduction code should always use absolute imports. For example:\n\n```python\nfrom account_service.models import Account # GOOD\nfrom .models import Account # BAD\n```\n\nHowever, test directories are not modules. They cannot and should not contain `__init__.py` files. Therefore, relative imports must be used in test directories. For example:\n\n```python\nfrom .conftest import build_data # GOOD\nfrom tests.conftest import build_data # BAD\n```\n\n### Error Handling\n\nRaise `HTTPException` with appropriate status code and detail message\n\n## Lambda Handlers (`packages/**/handler.py`)\n\n### Handler Types\n\n1. **LambdaHandler** - base handler for non-API Gateway functions\n2. **HttpHandler** - extends LambdaHandler with API Gateway support (requires `lambda-handler[api]`)\n\n### Lazy Loading Pattern\n\nMany lambdas serve both as direct invocation functions and API Gateway integrations. Loading Python modules can be slow (100s of milliseconds), especially with many Pydantic models. This impacts cold start time.\n\n**Solution**: Use lazy loading in `handler.py` files only. Load direct invocation handling code only when needed, and vice versa for API Gateway routes.\n\n**Example**:\n\n```python\nfrom lambda_handler.http_handler import HttpHandler\n\ndef get_app():\n from my_service.app import app # noqa: PLC0415\n return app\n\nhandler = HttpHandler(get_app)\n\n@handler.direct_invocation()\ndef handle_direct_invocation(event: DirectInvocationEvent, logger: BioscopeLogger):\n from my_service.handlers.handler_one import handle_handler_one # noqa: PLC0415\n return handle_handler_one(event, logger)\n```\n\n**Important**:\n\n- Restrict lazy imports to `handler.py` only\n- Keep common imports (logger, types, handler framework) at module level\n- Use `# noqa: PLC0415` to suppress linting warnings\n- Never lazy load in business logic or service modules\n\n### Decorators\n\n| Event Source | Decorator | Required kwarg | Notes |\n| ----------------- | ---------------------------- | ---------------------- | ---------------------------------------- |\n| SQS | `@handler.sqs` | `queue_name=\"\u003cqueue\u003e\"` | |\n| SNS | `@handler.sns` | `topic_name=\"\u003ctopic\u003e\"` | |\n| Direct Invocation | `@handler.direct_invocation` | N/A | Operation extracted from request model |\n| Event Bridge | `@handler.event_bridge` | N/A | Handles all EventBridge events |\n| API Gateway Auth | `@handler.authorizer` | N/A | For custom API Gateway authorizers |\n| Health Check | `@handler.health_check` | N/A | Custom health check (built-in available) |\n\n**Notes**:\n\n- EventBridge and authorizer handlers do not use operation discriminators - they handle all events of their type sent to the function.\n- Direct invocation handlers automatically extract the `operation` from the request model's `operation` class attribute.\n- A built-in health check handler is automatically registered for all Lambda functions and responds to `{\"operation\": \"healthCheck\"}` requests.\n\n### Message Payloads\n\n• Define a Pydantic model that **inherits `BioscopeBaseModel`** for every distinct message body.\n• Models should be defined in the `bioscope_types` package under the `services` module.\n\nAlways annotate the first parameter with the corresponding event model from `lambda_handler.models`, e.g. `SqsEvent[MyMessage]`.\n`MyMessage` should be a new Pydantic model that inherits `BioscopeBaseModel`.\n`BioscopeBaseModel` automatically handles camelCase to snake_case conversion for all fields.\n\n### Dependency Injection\n\nHandler functions may declare these optional parameters which will be injected automatically:\n\n- `logger: BioscopeLogger` - the project-wide structured logger.\n- `context: LambdaContext` - the AWS Lambda context object.\n\n### Example (SQS)\n\n```python\nfrom lambda_handler.handler import LambdaHandler\nfrom lambda_handler.models.sqs import SqsEvent\nfrom bioscope_types.common import BioscopeBaseModel\n\nhandler = LambdaHandler()\n\nclass MySqsMessage(BioscopeBaseModel):\n my_custom_field: str\n\n@handler.sqs(queue_name=\"my-queue\")\ndef handle_sqs_event(event: SqsEvent[MySqsMessage], logger, context):\n logger.info(\"processing message\", extra={\"myCustomField\": event.body.my_custom_field})\n```\n\n### Style Rules\n\n- Use **explicit type annotations** everywhere.\n- Keep handler bodies minimal; delegate business logic to service modules.\n- Use the provided `logger`, not `print`, for output.\n- Do not log PII/PHI data. Follow the [PII/PHI Logging Rules](#piiphi-logging-rules) in the FastAPI Routes section — the same rules apply to Lambda handlers. Never log full event bodies, external API responses, webhook payloads, tokens, API keys, credentials, or other secrets.\n\n### Handler Organization (`packages/**/src/**/handlers/**/*.py`)\n\nFor services with many direct invocation handlers, organize them in a dedicated `handlers` directory rather than implementing the business logic directly in `handler.py`.\n\n### Structure\n\n```text\nsrc/\n service_name/\n handler.py # Contains @handler.direct_invocation decorators\n handlers/\n __init__.py # Exports all handler functions\n handler_one.py # Individual handler implementation\n handler_two.py # Individual handler implementation\n```\n\n### Handler Function Signature\n\nHandler functions should follow this standardized signature:\n\n```python\nasync def handle_operation_name(\n args: OperationArgs,\n logger: BioscopeLogger,\n) -\u003e OperationResponse:\n # Implementation here\n```\n\nWhere:\n\n- `args` is the operation's arguments model from `bioscope_types.services`\n- `logger` is the structured logger instance\n- Return type matches the operation's response model\n\n### Main Handler File\n\nThe main `handler.py` file should delegate to the individual handlers:\n\n```python\nfrom service_name.handlers import handle_operation_name\n\n@handler.direct_invocation()\nasync def operation_name_handler(\n event: OperationRequest, parent_logger: BioscopeLogger\n) -\u003e OperationResponse:\n return await handle_operation_name(\n args=event.args,\n logger=parent_logger.child(\n {\n # Add relevant fields from event.args (in camelCase and avoiding PHI/PII)\n }\n ),\n )\n```\n\n## AWS Services (`packages/**/src/**/aws.py`)\n\n**All** AWS service clients should be abstracted using context managers in a dedicated `aws.py` file. This pattern should be used for all AWS services **except** those with specialized helper packages (i.e. S3 via `s3_helper`, SQS via `queue_helper`, and DynamoDB via `dynamodb_helper`).\n\n### AWS Abstraction Pattern\n\nCreate `src/package_name/aws.py`:\n\n```python\nfrom contextlib import asynccontextmanager\nfrom aioboto3 import Session\n\nsession = Session()\n\n@asynccontextmanager\nasync def get_service_name():\n async with session.client(\"service-name\") as client:\n yield client\n```\n\n### Usage in Production Code\n\n```python\nfrom package_name.aws import get_service_name\n\nasync def some_operation() -\u003e None:\n async with get_service_name() as client:\n await client.some_api_call()\n```\n\n## Testing (`packages/**/tests/**/*.py`)\n\n### Basic Rules\n\n- Prefer **pytest** for all unit tests.\n- Use **botocore.stub.Stubber** for mocking AWS services (don't use `mock.patch` directly on the service) except in the `dynamodb_helper` package which uses `moto` for mocking.\n- Tests are all run with `asyncio_mode = \"auto\"` in `pyproject.toml`, so tests don't need to be marked as async individually.\n- **AVOID** asserting on logger calls except in very limited cases. Use a real BioscopeLogger instance (see Logger Fixture section) rather than mocking it. If you absolutely need to test logging behavior, use `caplog: pytest.LogCaptureFixture`. (see @bioscope_logger/README.md)\n- Use pytest fixtures for both mocking and for defining common test data.\n- Test all cases for 100% test coverage, but don't overdo it with tests. And don't waste time testing code that is not written by us; i.e. don't write a test that effectively tests a library.\n- Under **no circumstances** should you write large amounts of code in a test file and then write tests that effectively test that code instead of the code in the actual production file.\n\n### Test Structure\n\n- Mirror source code structure in test organization\n- Individual classes for each function being tested\n- Individual methods for each test case\n\nExample:\n\n```python\nclass TestCopyS3ToTemp:\n def test_happy_path(self):\n pass\n\n def test_invalid_url_format(self):\n pass\n\n def test_s3_error(self):\n pass\n```\n\n### Assertions\n\nWhen performing assertions on data, compare the entire object as much as possible rather than individual assertions for each field.\n\nFor example, instead of:\n\n```python\nassert result is not None\nassert len(result) == 1\nassert result[0].id == \"123\"\nassert result[0].name == \"John Doe\"\nassert result[0].email == \"john.doe@example.com\"\n```\n\nyou should do:\n\n```python\nassert result == [User(\n id=\"123\",\n name=\"John Doe\",\n email=\"john.doe@example.com\"\n)]\n```\n\nWhen performing assertions on what functions were called with, use the built in assert calls like `assert_called_once_with` rather than checking the arguments directly.\nFor example, instead of:\n\n```python\nassert mock_foo.call_args.args == (\"123\", \"John Doe\", \"john.doe@example.com\")\n```\n\nyou should do:\n\n```python\nmock_foo.assert_called_once_with(\"123\", \"John Doe\", \"john.doe@example.com\")\n```\n\n### Async vs Sync Assertions\n\n**IMPORTANT**: For async functions (using `AsyncMock`), use `assert_awaited...` methods:\n\n- `assert_awaited_once()` instead of `assert_called_once()`\n- `assert_awaited_once_with(args)` instead of `assert_called_once_with(args)`\n- `assert_not_awaited()` instead of `assert_not_called()`\n\nFor sync functions (using `MagicMock`), use `assert_called...` methods:\n\n- `assert_called_once()`\n- `assert_called_once_with(args)`\n- `assert_not_called()`\n\n### Positive and Negative Assertions\n\nAlways include both positive assertions (what should happen) and negative assertions (what should NOT happen) to ensure functions aren't being called unexpectedly.\n\n### Mocking\n\nAs stated, `pytest_mock` should be used for mocking and all mocks should be defined as fixtures. Use `httpx` for HTTP clients and `respx` for mocking `httpx` calls in tests, with `respx` configured via pytest fixtures.\n\nMocks should always be at most one level deep. i.e. if function a calls function b, and function b calls function c and you are testing function a, you should mock function b, not function c.\n\n#### AWS Service Mocking\n\nWhen testing code that uses AWS services, follow this pattern (see [AWS Services](#aws-services-packagessrcawspy) section for the production abstraction):\n\n**Create AWS abstraction** (`src/package_name/aws.py`):\n\n```python\nfrom contextlib import asynccontextmanager\nfrom aioboto3 import Session\n\nsession = Session()\n\n@asynccontextmanager\nasync def get_s3():\n async with session.client(\"s3\") as s3_client:\n yield s3_client\n```\n\n**Use abstraction in production code**:\n\n```python\nfrom package_name.aws import get_s3\n\nasync def upload_file(bucket: str, key: str, content: bytes) -\u003e None:\n async with get_s3() as s3:\n await s3.put_object(Bucket=bucket, Key=key, Body=content)\n```\n\n**Test with botocore stubber**:\n\n```python\nfrom collections.abc import AsyncGenerator\nfrom contextlib import asynccontextmanager\nimport pytest\nfrom aioboto3 import Session\nfrom botocore.stub import Stubber\nfrom pytest_mock import MockerFixture, MockType\n\n@pytest.fixture(autouse=True)\ndef fake_aws_env(monkeypatch: pytest.MonkeyPatch) -\u003e None:\n monkeypatch.setenv(\"AWS_ACCESS_KEY_ID\", \"testing\")\n monkeypatch.setenv(\"AWS_SECRET_ACCESS_KEY\", \"testing\")\n monkeypatch.setenv(\"AWS_SESSION_TOKEN\", \"testing\")\n monkeypatch.setenv(\"AWS_DEFAULT_REGION\", \"us-east-2\")\n\n@pytest.fixture\ndef mock_get_s3(mocker: MockerFixture) -\u003e MockType:\n return mocker.patch(\"package_name.client.get_s3\")\n\n@pytest.fixture\nasync def s3_stub(mock_get_s3: MockType) -\u003e AsyncGenerator[Stubber]:\n session = Session()\n async with session.client(\"s3\", region_name=\"us-east-2\") as s3_client:\n stubber = Stubber(s3_client)\n stubber.activate()\n\n @asynccontextmanager\n async def _fake_get_s3():\n yield s3_client\n\n mock_get_s3.side_effect = _fake_get_s3\n yield stubber\n stubber.assert_no_pending_responses()\n stubber.deactivate()\n\nclass TestUploadFile:\n async def test_upload_success(self, s3_stub: Stubber):\n s3_stub.add_response(\n \"put_object\",\n {},\n {\n \"Bucket\": \"test-bucket\",\n \"Key\": \"test-key\",\n \"Body\": b\"test-content\",\n },\n )\n\n await upload_file(\"test-bucket\", \"test-key\", b\"test-content\")\n```\n\nThis `aws.py` file itself should be added to the `omit` list in the `pyproject.toml` file of the package. For example:\n\n```toml\nomit = [\n \"src/\u003cpackage_name\u003e/aws.py\",\n]\n```\n\n### Running Tests\n\n```bash\npnpm exec nx run \u003cpackage-name\u003e:test\n```\n\n### Fixtures\n\n#### Logger Fixture\n\n**IMPORTANT**: Always use a real `BioscopeLogger` instance in tests, not a mock. Create a `conftest.py` file in your package's test directory:\n\n```python\nimport pytest\nfrom bioscope_logger import BioscopeLogger, get_logger\nfrom uuid import uuid4\n\n@pytest.fixture\ndef logger() -\u003e BioscopeLogger:\n return get_logger(\"package-name\", uuid4())\n```\n\nThis fixture will be automatically available to all tests in the package. **Never** create individual logger fixtures using `AsyncMock` or `MagicMock` in test files - always use the real logger from conftest.py.\n\n#### Other Fixtures\n\nExample:\n\n```python\nfrom unittest.mock import AsyncMock, MagicMock\nfrom pytest_mock import MockerFixture\nfrom models import Patient\n\n@pytest.fixture\ndef patient() -\u003e Patient:\n return Patient(\n id=\"123\",\n name=\"John Doe\",\n )\n\n@pytest.fixture\ndef mock_get_patient(mocker: MockerFixture) -\u003e AsyncMock:\n return mocker.patch(\"some_service.utils.get_patient\")\n\n@pytest.fixture\ndef mock_sync_function(mocker: MockerFixture) -\u003e MagicMock:\n return mocker.patch(\"some_service.utils.sync_function\")\n\nclass TestMyFunction:\n async def test_happy_path(self, patient: Patient, mock_get_patient: AsyncMock):\n mock_get_patient.return_value = patient\n # Use assert_awaited_once_with for async mocks\n mock_get_patient.assert_awaited_once_with(\"patient_id\")\n\n def test_sync_function(self, mock_sync_function: MagicMock):\n mock_sync_function.return_value = \"result\"\n # Use assert_called_once_with for sync mocks\n mock_sync_function.assert_called_once_with(\"arg\")\n```\n\n**Fixture Type Guidelines**:\n\n- Use `MagicMock` for synchronous functions\n- Use `AsyncMock` for asynchronous functions\n- pytest-mock automatically creates the correct mock type, but explicit typing helps with IDE support\n\n### Test Coverage\n\nAlways aim for 100% coverage. `#pragma: no cover` can be used to exclude specific lines from coverage.\n\n### Do NOT create `__init__.py` files in test directories\n\nYou should NEVER create an `__init__.py` file in a test directory. Doing so will break the VSCode/Cursor test explorer.\n\n## Querying Logs in Axiom\n\nUse the Axiom MCP tools to query logs. If the Axiom MCP tools are not available, stop and ask the user to set up the Axiom MCP server in their Claude Code configuration before proceeding.\n\nLogs are in the `bioscope-dev` dataset for the dev AWS environment and the `bioscope-prod` dataset for the prod AWS environment. Axiom was enabled in prod on **2026-02-19**, so there are no prod logs before that date. Axiom uses APL (similar to Kusto/KQL). All field names are **camelCase**.\n\n### Key Fields\n\n| Field | Description |\n| -------------------------------------- | ---------------------------------------------------------- |\n| `_time` | Timestamp |\n| `logGroup` | CloudWatch log group (e.g., `/aws/lambda/account-service`) |\n| `message` | Log message |\n| `levelname` | Log level (`INFO`, `ERROR`, etc.) |\n| `service` | Service name |\n| `correlationId` | UUID for tracing requests across services |\n| `accountId`, `userId`, `patientId` | Entity identifiers |\n| `path`, `method`, `statusCode`, `took` | HTTP request details |\n| `errorMessage`, `errorType` | Error details |\n| `data` | Object containing extra fields not in the standard set |\n\n### Example Queries\n\n```apl\n// Errors in a service\n['bioscope-dev']\n| where levelname == \"ERROR\" and logGroup == \"/aws/lambda/account-service\"\n\n// Trace a request across services\n['bioscope-dev']\n| where correlationId == \"550e8400-e29b-41d4-a716-446655440000\"\n| order by _time asc\n\n// Slow requests\n['bioscope-dev']\n| where took \u003e 1000\n| project _time, service, path, took\n\n// Error counts by service (last hour)\n['bioscope-dev']\n| where _time \u003e ago(1h) and levelname == \"ERROR\"\n| summarize count() by logGroup\n```"])</script><script>self.__next_f.push([1,"1d:[\"$\",\"div\",\"/Users/gabry/Desktop/ps-copy/platform-services/AGENTS.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"AGENTS.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/ps-copy/platform-services/AGENTS.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$23\",\"previewLines\":8}]]}]\n1e:[\"$\",\"div\",\"/Users/gabry/Desktop/ps-copy/platform-services/CLAUDE.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"CLAUDE.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/ps-copy/platform-services/CLAUDE.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"@AGENTS.md\",\"previewLines\":8}]]}]\n24:T1ea2,"])</script><script>self.__next_f.push([1,"# Claude Code Rules for Bioscope Web App\n\n## Design System and Styling\n\n### Color Usage\n**NEVER hardcode color values in components.** All colors must be defined in the design system.\n\n- ❌ **WRONG**: `bg-[#181f2e]`, `border-[#303a48]`, `text-[#8fbecc]`\n- ✅ **CORRECT**: `bg-tab-nav-background`, `border-tab-nav-border`, `text-tab-active-indicator`\n\n#### Process for Adding New Colors:\n1. Add the color variable to `@theme inline` section in `src/index.css`:\n ```css\n --color-new-color-name: var(--new-color-name);\n ```\n\n2. Add the oklch value to `:root` section in `src/index.css`:\n ```css\n --new-color-name: oklch(L C H);\n ```\n\n3. Use the Tailwind class in components:\n ```tsx\n className=\"bg-new-color-name\"\n ```\n\n#### Color Conversion:\nWhen converting hex colors to oklch:\n- Use online tools or color conversion utilities\n- Maintain the exact visual appearance\n- Document the original hex value in a comment if needed\n\n### Component Styling Guidelines\n- Always use the existing design system tokens\n- Check `src/index.css` for available color variables before adding new ones\n- Prefer semantic color names (e.g., `tab-nav-background`) over generic names (e.g., `dark-blue-1`)\n- Follow the existing naming conventions in the design system\n\n### Typography\n**Always use the Typography component for text rendering.** Never use raw HTML text elements or hardcoded font styles.\n\n#### Typography Component Usage\nThe Typography component is located at `src/components/base/typography.tsx` and should be used for all text:\n\n```tsx\nimport { Typography } from \"@/components/base/typography\";\n\n\u003cTypography variant=\"section-title\" color=\"primary\"\u003e\n My Text\n\u003c/Typography\u003e\n```\n\n#### Available Typography Variants\n- `header` - Semibold 20px, for main headers\n- `large-title` - Semibold 20px, for large titles\n- `section-title` - Semibold 16px, for section headers\n- `section-content` - Normal 14px, for section body text\n- `attribute-label` - Normal 16px, for attribute labels\n- `key-value-key` - Semibold 14px, for key-value pair keys\n- `key-value-value` - Normal 14px, for key-value pair values\n- `button-label` - Bold 14px, for button text\n- `chip-label` - Medium 12px, for chip/badge text\n- `input-label` - Medium 14px, for form input labels\n- `input-helper` - Normal 12px, for input helper text\n- `input-text` - Medium 16px, for input field text\n- `detail-label` - Medium 12px, for detail labels\n- `detail-subtext` - Normal 12px, for detail subtext\n- `table-header` - Light 12px, for table headers\n- `table-cell` - Normal 14px, for table cells\n- `list-button-label` - Normal 20px, for list button labels\n\n#### Available Typography Colors\n- `primary` - Primary text color (text-text-primary)\n- `muted` - Muted text color (text-text-muted)\n- `error` - Error/destructive text color (text-destructive)\n- `secondary` - Secondary foreground color (text-secondary-foreground)\n\n#### When Typography Component Cannot Be Used\nIn cases where you cannot use the Typography component directly (e.g., in custom components that need to apply typography styles to existing elements), use `typographyVariants`:\n\n```tsx\nimport { typographyVariants } from \"@/components/base/typography\";\nimport { cn } from \"@/utils/cn\";\n\n\u003cSomeComponent\n className={cn(typographyVariants({ variant: \"section-title\", color: \"primary\" }))}\n/\u003e\n```\n\n#### Typography Props\n- `variant` - The typography variant to use (required for consistent styling)\n- `color` - The text color (defaults to primary if not specified)\n- `as` - The HTML element to render (p, span, div, h1-h6, li, pre, code, td, th)\n- `italic` - Boolean flag to apply italic styling\n- `className` - Additional custom classes (use sparingly)\n- `onClick` - Click handler (will add cursor-pointer automatically)\n- `testId` - Test ID for testing purposes\n\n#### Examples\n```tsx\n// Section header\n\u003cTypography variant=\"section-title\" color=\"primary\"\u003e\n User Information\n\u003c/Typography\u003e\n\n// Body text\n\u003cTypography variant=\"section-content\" color=\"muted\"\u003e\n This is the description text.\n\u003c/Typography\u003e\n\n// Error message\n\u003cTypography variant=\"input-helper\" color=\"error\"\u003e\n This field is required\n\u003c/Typography\u003e\n\n// Custom element with typography styles\n\u003cTypography variant=\"header\" as=\"h1\"\u003e\n Page Title\n\u003c/Typography\u003e\n\n// When Typography component cannot be used\n\u003cCustomButton\n className={cn(typographyVariants({ variant: \"button-label\", color: \"primary\" }))}\n\u003e\n Click Me\n\u003c/CustomButton\u003e\n```\n\n## Project Structure\n\n### Directory Organization\n```\nsrc/\n├── assets/ # All static assets\n├── components/ # All reusable components\n│ └── base/ # Basic building blocks (buttons, accordions, etc.)\n│ └── shadcn/ # Shadcn registry components (DO NOT modify or export)\n├── hooks/ # Application-wide hooks\n│ └── api/ # API interaction and TanStack Query hooks\n└── pages/ # Full page components\n```\n\n### Component Structure\n\n#### Simple Components\nSimple, atomic components (like buttons) can be a single file:\n```\nbutton.tsx\n```\n\n#### Complex Components\nComplex components should be organized in directories with subcomponents:\n```\nSelect/\n├── index.tsx # Main component, exports only what consumers need\n├── hooks/ # Component-specific hooks\n├── utils/ # Component-specific utilities\n└── SelectOption.tsx # Sub-components\n```\n\n### Component Placement\n- Even single-use components should go in `src/components/` if not obviously scoped to a single page\n- Keep components small and composable\n- Avoid code duplication within components\n\n## React and TypeScript\n\n### Component Code Layout\nAll custom (non-shadcn) components should follow this layout:\n\n```tsx\nimport * as React from \"react\";\n\ntype \u003cComponentName\u003eOwnProps = {\n // Component-specific props\n};\n\nexport type \u003cComponentName\u003eProps = {} \u0026 \u003cComponentName\u003eOwnProps;\n\nfunction \u003cComponentName\u003eComponent({}: \u003cComponentName\u003eProps) {\n // Component implementation\n}\n\nconst \u003cComponentName\u003e = React.memo(\u003cComponentName\u003eComponent);\n\nexport { \u003cComponentName\u003e };\n```\n\n### Naming Conventions\n- **Files**: camelCase (e.g., `loadingContent.tsx`)\n- **Components**: PascalCase (e.g., `LoadingContent`)\n- **Index files**: Component takes parent directory name (e.g., `loadingContent/index.tsx` → `LoadingContent`)\n\n### Type Imports\nWhen using TypeScript with `verbatimModuleSyntax` enabled:\n- ✅ **CORRECT**: `import type { TypeName } from './module';`\n- ❌ **WRONG**: `import { TypeName } from './module';` (for types)\n\n### Hook Usage\n- Use hooks and custom hooks as needed\n- **Avoid `useRef` and `useEffect` unless absolutely necessary** - they can introduce bugs and hard-to-reason render cycles\n- When needing `useEffect`, consider using hooks from [react-use](https://github.com/streamich/react-use) for more direct, obvious, and opinionated code flow\n\n### Navigation\n- Always use `void navigate()` to handle promise returns from React Router\n- Mark button types explicitly: `\u003cbutton type=\"button\"\u003e`\n\n### Shadcn Components\n**CRITICAL**: Shadcn components live in `src/components/base/shadcn/` and have strict usage rules:\n\n- ❌ **NEVER** modify shadcn components\n- ❌ **NEVER** export shadcn components from `src/components/base/`\n- ❌ **NEVER** import shadcn components directly outside of `src/components/base/`\n- ✅ **ALWAYS** create a wrapper in `src/components/base/` for shadcn components before using them\n\nExample:\n```tsx\n// src/components/base/button.tsx\nimport { Button as ShadcnButton } from \"./shadcn/button\";\n\nexport function Button(props) {\n return \u003cShadcnButton {...props} /\u003e;\n}\n```\n\n## General Code Quality\n- Follow existing patterns in the codebase\n- Use memoization for expensive computations\n- Ensure accessibility (ARIA labels, semantic HTML)\n- Test mobile responsiveness for all UI components"])</script><script>self.__next_f.push([1,"20:[\"$\",\"div\",\"/Users/gabry/Desktop/web-app/.clauderules\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\".clauderules\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/web-app/.clauderules\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$24\",\"previewLines\":8}]]}]\n25:T6de,"])</script><script>self.__next_f.push([1,"# Claude Development Rules\n\n## Component Organization\n\n### Multiple Components Per File\n\n**Rule**: Do not place multiple components in the same file. Each component should be organized into its own directory structure.\n\n**Structure**: When a component contains sub-components or helper functions:\n\n1. Create a directory with the component name\n2. Create an `index.tsx` file for the main component export\n3. Create separate files for each sub-component\n4. Create a `utils.ts` file for helper functions and utilities\n\n**Example**:\n\n```\nComponentName/\n├── index.tsx # Main component export\n├── SubComponentA.tsx # Sub-component A\n├── SubComponentB.tsx # Sub-component B\n└── utils.ts # Helper functions\n```\n\n**Benefits**:\n\n- Improved code organization and maintainability\n- Easier to locate and modify specific components\n- Better separation of concerns\n- Cleaner git diffs and easier code reviews\n- Simpler testing of individual components\n\n**Bad Example** ❌:\n\n```tsx\n// MyModal.tsx\nexport function MyModal() { ... }\nfunction ModalHeader() { ... }\nfunction ModalBody() { ... }\nfunction formatDate() { ... }\n```\n\n**Good Example** ✅:\n\n```\nMyModal/\n├── index.tsx # exports MyModal\n├── ModalHeader.tsx # exports ModalHeader\n├── ModalBody.tsx # exports ModalBody\n└── utils.ts # exports formatDate\n```\n\n## Logging and Event Tracking\n\n**Rule:** Never send anything to the client logging service (src/utils/logger.ts) that might contain user PII or PHI. Ensure that only IDs are used to identify an account, user, or patient, and only include the bare minimum of information to capture vital data for troubleshooting an error or identifying an event or user action."])</script><script>self.__next_f.push([1,"21:[\"$\",\"div\",\"/Users/gabry/Desktop/web-app/.claude/rules.md\",{\"className\":\"border border-border rounded-sm p-5 \",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm bg-surface-raised text-text-muted\",\"children\":\"rules.md\"}],[\"$\",\"span\",null,{\"className\":\"text-xs text-text-dim font-mono\",\"children\":\"/Users/gabry/Desktop/web-app/.claude/rules.md\"}]]}],[\"$\",\"$L11\",null,{\"content\":\"$25\",\"previewLines\":8}]]}]\n"])</script></body></html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"headers": {
|
|
3
|
+
"x-nextjs-stale-time": "300",
|
|
4
|
+
"x-nextjs-prerender": "1",
|
|
5
|
+
"x-next-cache-tags": "_N_T_/layout,_N_T_/rules/layout,_N_T_/rules/page,_N_T_/rules"
|
|
6
|
+
},
|
|
7
|
+
"segmentPaths": [
|
|
8
|
+
"/_tree",
|
|
9
|
+
"/_full",
|
|
10
|
+
"/rules/__PAGE__",
|
|
11
|
+
"/rules",
|
|
12
|
+
"/_index",
|
|
13
|
+
"/_head"
|
|
14
|
+
]
|
|
15
|
+
}
|