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.
Files changed (1324) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -0
  2. package/.next/standalone/.next/app-path-routes-manifest.json +14 -0
  3. package/.next/standalone/.next/build-manifest.json +20 -0
  4. package/.next/standalone/.next/package.json +1 -0
  5. package/.next/standalone/.next/prerender-manifest.json +282 -0
  6. package/.next/standalone/.next/required-server-files.json +333 -0
  7. package/.next/standalone/.next/routes-manifest.json +120 -0
  8. package/.next/standalone/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  9. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +16 -0
  10. package/.next/standalone/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  11. package/.next/standalone/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  12. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  13. package/.next/standalone/.next/server/app/_global-error/page.js +10 -0
  14. package/.next/standalone/.next/server/app/_global-error/page.js.map +5 -0
  15. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -0
  16. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  17. package/.next/standalone/.next/server/app/_global-error.html +1 -0
  18. package/.next/standalone/.next/server/app/_global-error.meta +15 -0
  19. package/.next/standalone/.next/server/app/_global-error.rsc +15 -0
  20. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  21. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  22. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +6 -0
  23. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  24. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  25. package/.next/standalone/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  26. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +16 -0
  27. package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +12 -0
  28. package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  29. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  30. package/.next/standalone/.next/server/app/_not-found/page.js +13 -0
  31. package/.next/standalone/.next/server/app/_not-found/page.js.map +5 -0
  32. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
  33. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  34. package/.next/standalone/.next/server/app/_not-found.html +9 -0
  35. package/.next/standalone/.next/server/app/_not-found.meta +16 -0
  36. package/.next/standalone/.next/server/app/_not-found.rsc +17 -0
  37. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -0
  38. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  39. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +6 -0
  40. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  41. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  42. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  43. package/.next/standalone/.next/server/app/agents/page/app-paths-manifest.json +3 -0
  44. package/.next/standalone/.next/server/app/agents/page/build-manifest.json +16 -0
  45. package/.next/standalone/.next/server/app/agents/page/next-font-manifest.json +12 -0
  46. package/.next/standalone/.next/server/app/agents/page/react-loadable-manifest.json +1 -0
  47. package/.next/standalone/.next/server/app/agents/page/server-reference-manifest.json +4 -0
  48. package/.next/standalone/.next/server/app/agents/page.js +15 -0
  49. package/.next/standalone/.next/server/app/agents/page.js.map +5 -0
  50. package/.next/standalone/.next/server/app/agents/page.js.nft.json +1 -0
  51. package/.next/standalone/.next/server/app/agents/page_client-reference-manifest.js +3 -0
  52. package/.next/standalone/.next/server/app/agents.html +30 -0
  53. package/.next/standalone/.next/server/app/agents.meta +15 -0
  54. package/.next/standalone/.next/server/app/agents.rsc +345 -0
  55. package/.next/standalone/.next/server/app/agents.segments/_full.segment.rsc +345 -0
  56. package/.next/standalone/.next/server/app/agents.segments/_head.segment.rsc +6 -0
  57. package/.next/standalone/.next/server/app/agents.segments/_index.segment.rsc +6 -0
  58. package/.next/standalone/.next/server/app/agents.segments/_tree.segment.rsc +5 -0
  59. package/.next/standalone/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +331 -0
  60. package/.next/standalone/.next/server/app/agents.segments/agents.segment.rsc +5 -0
  61. package/.next/standalone/.next/server/app/commands/page/app-paths-manifest.json +3 -0
  62. package/.next/standalone/.next/server/app/commands/page/build-manifest.json +16 -0
  63. package/.next/standalone/.next/server/app/commands/page/next-font-manifest.json +12 -0
  64. package/.next/standalone/.next/server/app/commands/page/react-loadable-manifest.json +1 -0
  65. package/.next/standalone/.next/server/app/commands/page/server-reference-manifest.json +4 -0
  66. package/.next/standalone/.next/server/app/commands/page.js +15 -0
  67. package/.next/standalone/.next/server/app/commands/page.js.map +5 -0
  68. package/.next/standalone/.next/server/app/commands/page.js.nft.json +1 -0
  69. package/.next/standalone/.next/server/app/commands/page_client-reference-manifest.js +3 -0
  70. package/.next/standalone/.next/server/app/commands.html +33 -0
  71. package/.next/standalone/.next/server/app/commands.meta +15 -0
  72. package/.next/standalone/.next/server/app/commands.rsc +1672 -0
  73. package/.next/standalone/.next/server/app/commands.segments/_full.segment.rsc +1672 -0
  74. package/.next/standalone/.next/server/app/commands.segments/_head.segment.rsc +6 -0
  75. package/.next/standalone/.next/server/app/commands.segments/_index.segment.rsc +6 -0
  76. package/.next/standalone/.next/server/app/commands.segments/_tree.segment.rsc +5 -0
  77. package/.next/standalone/.next/server/app/commands.segments/commands/__PAGE__.segment.rsc +1658 -0
  78. package/.next/standalone/.next/server/app/commands.segments/commands.segment.rsc +5 -0
  79. package/.next/standalone/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
  80. package/.next/standalone/.next/server/app/favicon.ico/route/build-manifest.json +9 -0
  81. package/.next/standalone/.next/server/app/favicon.ico/route.js +6 -0
  82. package/.next/standalone/.next/server/app/favicon.ico/route.js.map +5 -0
  83. package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  84. package/.next/standalone/.next/server/app/favicon.ico.body +0 -0
  85. package/.next/standalone/.next/server/app/favicon.ico.meta +1 -0
  86. package/.next/standalone/.next/server/app/hooks/page/app-paths-manifest.json +3 -0
  87. package/.next/standalone/.next/server/app/hooks/page/build-manifest.json +16 -0
  88. package/.next/standalone/.next/server/app/hooks/page/next-font-manifest.json +12 -0
  89. package/.next/standalone/.next/server/app/hooks/page/react-loadable-manifest.json +1 -0
  90. package/.next/standalone/.next/server/app/hooks/page/server-reference-manifest.json +4 -0
  91. package/.next/standalone/.next/server/app/hooks/page.js +15 -0
  92. package/.next/standalone/.next/server/app/hooks/page.js.map +5 -0
  93. package/.next/standalone/.next/server/app/hooks/page.js.nft.json +1 -0
  94. package/.next/standalone/.next/server/app/hooks/page_client-reference-manifest.js +3 -0
  95. package/.next/standalone/.next/server/app/hooks.html +9 -0
  96. package/.next/standalone/.next/server/app/hooks.meta +15 -0
  97. package/.next/standalone/.next/server/app/hooks.rsc +21 -0
  98. package/.next/standalone/.next/server/app/hooks.segments/_full.segment.rsc +21 -0
  99. package/.next/standalone/.next/server/app/hooks.segments/_head.segment.rsc +6 -0
  100. package/.next/standalone/.next/server/app/hooks.segments/_index.segment.rsc +6 -0
  101. package/.next/standalone/.next/server/app/hooks.segments/_tree.segment.rsc +5 -0
  102. package/.next/standalone/.next/server/app/hooks.segments/hooks/__PAGE__.segment.rsc +5 -0
  103. package/.next/standalone/.next/server/app/hooks.segments/hooks.segment.rsc +5 -0
  104. package/.next/standalone/.next/server/app/index.html +83 -0
  105. package/.next/standalone/.next/server/app/index.meta +14 -0
  106. package/.next/standalone/.next/server/app/index.rsc +20 -0
  107. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +8 -0
  108. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +20 -0
  109. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +6 -0
  110. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +6 -0
  111. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +5 -0
  112. package/.next/standalone/.next/server/app/mcp/page/app-paths-manifest.json +3 -0
  113. package/.next/standalone/.next/server/app/mcp/page/build-manifest.json +16 -0
  114. package/.next/standalone/.next/server/app/mcp/page/next-font-manifest.json +12 -0
  115. package/.next/standalone/.next/server/app/mcp/page/react-loadable-manifest.json +1 -0
  116. package/.next/standalone/.next/server/app/mcp/page/server-reference-manifest.json +4 -0
  117. package/.next/standalone/.next/server/app/mcp/page.js +15 -0
  118. package/.next/standalone/.next/server/app/mcp/page.js.map +5 -0
  119. package/.next/standalone/.next/server/app/mcp/page.js.nft.json +1 -0
  120. package/.next/standalone/.next/server/app/mcp/page_client-reference-manifest.js +3 -0
  121. package/.next/standalone/.next/server/app/mcp.html +9 -0
  122. package/.next/standalone/.next/server/app/mcp.meta +15 -0
  123. package/.next/standalone/.next/server/app/mcp.rsc +23 -0
  124. package/.next/standalone/.next/server/app/mcp.segments/_full.segment.rsc +23 -0
  125. package/.next/standalone/.next/server/app/mcp.segments/_head.segment.rsc +6 -0
  126. package/.next/standalone/.next/server/app/mcp.segments/_index.segment.rsc +6 -0
  127. package/.next/standalone/.next/server/app/mcp.segments/_tree.segment.rsc +5 -0
  128. package/.next/standalone/.next/server/app/mcp.segments/mcp/__PAGE__.segment.rsc +8 -0
  129. package/.next/standalone/.next/server/app/mcp.segments/mcp.segment.rsc +5 -0
  130. package/.next/standalone/.next/server/app/page/app-paths-manifest.json +3 -0
  131. package/.next/standalone/.next/server/app/page/build-manifest.json +16 -0
  132. package/.next/standalone/.next/server/app/page/next-font-manifest.json +12 -0
  133. package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +1 -0
  134. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +4 -0
  135. package/.next/standalone/.next/server/app/page.js +15 -0
  136. package/.next/standalone/.next/server/app/page.js.map +5 -0
  137. package/.next/standalone/.next/server/app/page.js.nft.json +1 -0
  138. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +3 -0
  139. package/.next/standalone/.next/server/app/projects/[slug]/page/app-paths-manifest.json +3 -0
  140. package/.next/standalone/.next/server/app/projects/[slug]/page/build-manifest.json +16 -0
  141. package/.next/standalone/.next/server/app/projects/[slug]/page/next-font-manifest.json +12 -0
  142. package/.next/standalone/.next/server/app/projects/[slug]/page/react-loadable-manifest.json +1 -0
  143. package/.next/standalone/.next/server/app/projects/[slug]/page/server-reference-manifest.json +4 -0
  144. package/.next/standalone/.next/server/app/projects/[slug]/page.js +16 -0
  145. package/.next/standalone/.next/server/app/projects/[slug]/page.js.map +5 -0
  146. package/.next/standalone/.next/server/app/projects/[slug]/page.js.nft.json +1 -0
  147. package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +3 -0
  148. package/.next/standalone/.next/server/app/rules/page/app-paths-manifest.json +3 -0
  149. package/.next/standalone/.next/server/app/rules/page/build-manifest.json +16 -0
  150. package/.next/standalone/.next/server/app/rules/page/next-font-manifest.json +12 -0
  151. package/.next/standalone/.next/server/app/rules/page/react-loadable-manifest.json +1 -0
  152. package/.next/standalone/.next/server/app/rules/page/server-reference-manifest.json +4 -0
  153. package/.next/standalone/.next/server/app/rules/page.js +15 -0
  154. package/.next/standalone/.next/server/app/rules/page.js.map +5 -0
  155. package/.next/standalone/.next/server/app/rules/page.js.nft.json +1 -0
  156. package/.next/standalone/.next/server/app/rules/page_client-reference-manifest.js +3 -0
  157. package/.next/standalone/.next/server/app/rules.html +72 -0
  158. package/.next/standalone/.next/server/app/rules.meta +15 -0
  159. package/.next/standalone/.next/server/app/rules.rsc +2358 -0
  160. package/.next/standalone/.next/server/app/rules.segments/_full.segment.rsc +2358 -0
  161. package/.next/standalone/.next/server/app/rules.segments/_head.segment.rsc +6 -0
  162. package/.next/standalone/.next/server/app/rules.segments/_index.segment.rsc +6 -0
  163. package/.next/standalone/.next/server/app/rules.segments/_tree.segment.rsc +5 -0
  164. package/.next/standalone/.next/server/app/rules.segments/rules/__PAGE__.segment.rsc +2344 -0
  165. package/.next/standalone/.next/server/app/rules.segments/rules.segment.rsc +5 -0
  166. package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  167. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +16 -0
  168. package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +12 -0
  169. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  170. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  171. package/.next/standalone/.next/server/app/settings/page.js +15 -0
  172. package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
  173. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
  174. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  175. package/.next/standalone/.next/server/app/settings.html +56 -0
  176. package/.next/standalone/.next/server/app/settings.meta +15 -0
  177. package/.next/standalone/.next/server/app/settings.rsc +226 -0
  178. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +226 -0
  179. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +6 -0
  180. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +6 -0
  181. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +5 -0
  182. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +211 -0
  183. package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +5 -0
  184. package/.next/standalone/.next/server/app/skills/page/app-paths-manifest.json +3 -0
  185. package/.next/standalone/.next/server/app/skills/page/build-manifest.json +16 -0
  186. package/.next/standalone/.next/server/app/skills/page/next-font-manifest.json +12 -0
  187. package/.next/standalone/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
  188. package/.next/standalone/.next/server/app/skills/page/server-reference-manifest.json +4 -0
  189. package/.next/standalone/.next/server/app/skills/page.js +15 -0
  190. package/.next/standalone/.next/server/app/skills/page.js.map +5 -0
  191. package/.next/standalone/.next/server/app/skills/page.js.nft.json +1 -0
  192. package/.next/standalone/.next/server/app/skills/page_client-reference-manifest.js +3 -0
  193. package/.next/standalone/.next/server/app/skills.html +30 -0
  194. package/.next/standalone/.next/server/app/skills.meta +15 -0
  195. package/.next/standalone/.next/server/app/skills.rsc +1111 -0
  196. package/.next/standalone/.next/server/app/skills.segments/_full.segment.rsc +1111 -0
  197. package/.next/standalone/.next/server/app/skills.segments/_head.segment.rsc +6 -0
  198. package/.next/standalone/.next/server/app/skills.segments/_index.segment.rsc +6 -0
  199. package/.next/standalone/.next/server/app/skills.segments/_tree.segment.rsc +5 -0
  200. package/.next/standalone/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +1097 -0
  201. package/.next/standalone/.next/server/app/skills.segments/skills.segment.rsc +5 -0
  202. package/.next/standalone/.next/server/app-paths-manifest.json +14 -0
  203. package/.next/standalone/.next/server/chunks/[externals]_next_dist_0arv.vj._.js +3 -0
  204. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0teziyo._.js +13 -0
  205. package/.next/standalone/.next/server/chunks/[turbopack]_runtime.js +903 -0
  206. package/.next/standalone/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js +3 -0
  207. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.pno0_._.js +3 -0
  208. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06czxzo._.js +3 -0
  209. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06ipj7k._.js +3 -0
  210. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08c9t2b._.js +3 -0
  211. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09x1iac._.js +33 -0
  212. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js +19 -0
  213. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0beg-.s._.js +3 -0
  214. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bm8p5g._.js +3 -0
  215. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ca-xeh._.js +3 -0
  216. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dey16.._.js +3 -0
  217. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0fvw3d8._.js +3 -0
  218. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qk5gqw._.js +3 -0
  219. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s0h9e0._.js +3 -0
  220. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0u-t242._.js +3 -0
  221. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xl6e~c._.js +3 -0
  222. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xrk31o._.js +33 -0
  223. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0y_d026._.js +3 -0
  224. package/.next/standalone/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
  225. package/.next/standalone/.next/server/chunks/ssr/_09kkdgy._.js +6 -0
  226. package/.next/standalone/.next/server/chunks/ssr/_0g8yqoe._.js +7 -0
  227. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +3 -0
  228. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js +3 -0
  229. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_agents_page_actions_07l1ss4.js +3 -0
  230. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_commands_page_actions_0npst50.js +3 -0
  231. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_hooks_page_actions_0a_tx-6.js +3 -0
  232. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_mcp_page_actions_00_op~_.js +3 -0
  233. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +3 -0
  234. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_projects_[slug]_page_actions_0xg3f7c.js +3 -0
  235. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_rules_page_actions_0xcrbur.js +3 -0
  236. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +3 -0
  237. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_skills_page_actions_0cxzzu-.js +3 -0
  238. package/.next/standalone/.next/server/chunks/ssr/node_modules_09w7yel._.js +33 -0
  239. package/.next/standalone/.next/server/chunks/ssr/node_modules_0sy8gnb._.js +3 -0
  240. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js +6 -0
  241. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js +3 -0
  242. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js +3 -0
  243. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +3 -0
  244. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +3 -0
  245. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03-z2qq.js +4 -0
  246. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js +4 -0
  247. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_071geea.js +4 -0
  248. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_07vh7rm.js +4 -0
  249. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_08617.g.js +4 -0
  250. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dlz56b.js +4 -0
  251. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0fnc180.js +4 -0
  252. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0iktlcc.js +4 -0
  253. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qp4u6g.js +4 -0
  254. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0t-uic4.js +4 -0
  255. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v9mjz4.js +4 -0
  256. package/.next/standalone/.next/server/chunks/ssr/src_components_ExpandableBody_tsx_0-ivqwg._.js +3 -0
  257. package/.next/standalone/.next/server/chunks/ssr/src_components_SphereView_tsx_0q2ope8._.js +13 -0
  258. package/.next/standalone/.next/server/functions-config-manifest.json +4 -0
  259. package/.next/standalone/.next/server/middleware-build-manifest.js +20 -0
  260. package/.next/standalone/.next/server/middleware-manifest.json +6 -0
  261. package/.next/standalone/.next/server/next-font-manifest.js +1 -0
  262. package/.next/standalone/.next/server/next-font-manifest.json +57 -0
  263. package/.next/standalone/.next/server/pages/404.html +9 -0
  264. package/.next/standalone/.next/server/pages/500.html +1 -0
  265. package/.next/standalone/.next/server/pages-manifest.json +4 -0
  266. package/.next/standalone/.next/server/prefetch-hints.json +1 -0
  267. package/.next/standalone/.next/server/server-reference-manifest.js +1 -0
  268. package/.next/standalone/.next/server/server-reference-manifest.json +5 -0
  269. package/.next/standalone/node_modules/@img/colour/color.cjs +1596 -0
  270. package/.next/standalone/node_modules/@img/colour/index.cjs +1 -0
  271. package/.next/standalone/node_modules/@img/colour/package.json +58 -0
  272. package/.next/standalone/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
  273. package/.next/standalone/node_modules/@img/sharp-darwin-arm64/package.json +40 -0
  274. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/README.md +46 -0
  275. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/glib-2.0/include/glibconfig.h +220 -0
  276. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/index.js +1 -0
  277. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib +0 -0
  278. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/package.json +36 -0
  279. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/versions.json +30 -0
  280. package/.next/standalone/node_modules/@next/env/dist/index.js +1 -0
  281. package/.next/standalone/node_modules/@next/env/package.json +36 -0
  282. package/.next/standalone/node_modules/@swc/helpers/cjs/_interop_require_default.cjs +6 -0
  283. package/.next/standalone/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs +38 -0
  284. package/.next/standalone/node_modules/@swc/helpers/package.json +471 -0
  285. package/.next/standalone/node_modules/client-only/index.js +0 -0
  286. package/.next/standalone/node_modules/client-only/package.json +19 -0
  287. package/.next/standalone/node_modules/detect-libc/lib/detect-libc.js +313 -0
  288. package/.next/standalone/node_modules/detect-libc/lib/elf.js +39 -0
  289. package/.next/standalone/node_modules/detect-libc/lib/filesystem.js +51 -0
  290. package/.next/standalone/node_modules/detect-libc/lib/process.js +24 -0
  291. package/.next/standalone/node_modules/detect-libc/package.json +44 -0
  292. package/.next/standalone/node_modules/next/dist/build/adapter/setup-node-env.external.js +15 -0
  293. package/.next/standalone/node_modules/next/dist/build/define-env.js +255 -0
  294. package/.next/standalone/node_modules/next/dist/build/duration-to-string.js +99 -0
  295. package/.next/standalone/node_modules/next/dist/build/get-supported-browsers.js +38 -0
  296. package/.next/standalone/node_modules/next/dist/build/next-config-ts/require-hook.js +85 -0
  297. package/.next/standalone/node_modules/next/dist/build/next-config-ts/transpile-config.js +251 -0
  298. package/.next/standalone/node_modules/next/dist/build/output/format.js +84 -0
  299. package/.next/standalone/node_modules/next/dist/build/output/log.js +135 -0
  300. package/.next/standalone/node_modules/next/dist/build/segment-config/app/app-segment-config.js +162 -0
  301. package/.next/standalone/node_modules/next/dist/build/segment-config/app/app-segments.js +137 -0
  302. package/.next/standalone/node_modules/next/dist/build/segment-config/app/collect-root-param-keys.js +52 -0
  303. package/.next/standalone/node_modules/next/dist/build/static-paths/app/extract-pathname-route-param-segments-from-loader-tree.js +137 -0
  304. package/.next/standalone/node_modules/next/dist/build/static-paths/app.js +735 -0
  305. package/.next/standalone/node_modules/next/dist/build/static-paths/pages.js +169 -0
  306. package/.next/standalone/node_modules/next/dist/build/static-paths/utils.js +119 -0
  307. package/.next/standalone/node_modules/next/dist/build/swc/helpers.js +15 -0
  308. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1348 -0
  309. package/.next/standalone/node_modules/next/dist/build/swc/install-bindings.js +30 -0
  310. package/.next/standalone/node_modules/next/dist/build/swc/jest-transformer.js +76 -0
  311. package/.next/standalone/node_modules/next/dist/build/swc/loaderWorkerPool.js +40 -0
  312. package/.next/standalone/node_modules/next/dist/build/swc/options.js +403 -0
  313. package/.next/standalone/node_modules/next/dist/build/swc/types.js +6 -0
  314. package/.next/standalone/node_modules/next/dist/build/utils.js +1215 -0
  315. package/.next/standalone/node_modules/next/dist/cli/next-test.js +170 -0
  316. package/.next/standalone/node_modules/next/dist/client/add-base-path.js +24 -0
  317. package/.next/standalone/node_modules/next/dist/client/app-call-server.js +34 -0
  318. package/.next/standalone/node_modules/next/dist/client/app-find-source-map-url.js +39 -0
  319. package/.next/standalone/node_modules/next/dist/client/assign-location.js +29 -0
  320. package/.next/standalone/node_modules/next/dist/client/components/app-router-announcer.js +78 -0
  321. package/.next/standalone/node_modules/next/dist/client/components/app-router-headers.js +138 -0
  322. package/.next/standalone/node_modules/next/dist/client/components/app-router-instance.js +397 -0
  323. package/.next/standalone/node_modules/next/dist/client/components/app-router-utils.js +62 -0
  324. package/.next/standalone/node_modules/next/dist/client/components/app-router.js +514 -0
  325. package/.next/standalone/node_modules/next/dist/client/components/builtin/default.js +35 -0
  326. package/.next/standalone/node_modules/next/dist/client/components/builtin/error-styles.js +165 -0
  327. package/.next/standalone/node_modules/next/dist/client/components/builtin/global-error.js +100 -0
  328. package/.next/standalone/node_modules/next/dist/client/components/dev-root-http-access-fallback-boundary.js +52 -0
  329. package/.next/standalone/node_modules/next/dist/client/components/error-boundary.js +144 -0
  330. package/.next/standalone/node_modules/next/dist/client/components/errors/graceful-degrade-boundary.js +86 -0
  331. package/.next/standalone/node_modules/next/dist/client/components/errors/root-error-boundary.js +41 -0
  332. package/.next/standalone/node_modules/next/dist/client/components/forbidden.js +48 -0
  333. package/.next/standalone/node_modules/next/dist/client/components/handle-isr-error.js +30 -0
  334. package/.next/standalone/node_modules/next/dist/client/components/hooks-server-context.js +42 -0
  335. package/.next/standalone/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js +125 -0
  336. package/.next/standalone/node_modules/next/dist/client/components/http-access-fallback/http-access-fallback.js +72 -0
  337. package/.next/standalone/node_modules/next/dist/client/components/is-next-router-error.js +23 -0
  338. package/.next/standalone/node_modules/next/dist/client/components/links.js +299 -0
  339. package/.next/standalone/node_modules/next/dist/client/components/match-segments.js +32 -0
  340. package/.next/standalone/node_modules/next/dist/client/components/nav-failure-handler.js +61 -0
  341. package/.next/standalone/node_modules/next/dist/client/components/navigation-devtools.js +126 -0
  342. package/.next/standalone/node_modules/next/dist/client/components/navigation-untracked.js +67 -0
  343. package/.next/standalone/node_modules/next/dist/client/components/navigation.js +225 -0
  344. package/.next/standalone/node_modules/next/dist/client/components/navigation.react-server.js +75 -0
  345. package/.next/standalone/node_modules/next/dist/client/components/not-found.js +42 -0
  346. package/.next/standalone/node_modules/next/dist/client/components/readonly-url-search-params.js +41 -0
  347. package/.next/standalone/node_modules/next/dist/client/components/redirect-boundary.js +107 -0
  348. package/.next/standalone/node_modules/next/dist/client/components/redirect-error.js +43 -0
  349. package/.next/standalone/node_modules/next/dist/client/components/redirect-status-code.js +24 -0
  350. package/.next/standalone/node_modules/next/dist/client/components/redirect.js +91 -0
  351. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/compute-changed-path.js +201 -0
  352. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/create-href-from-url.js +21 -0
  353. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/create-initial-router-state.js +153 -0
  354. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/create-router-cache-key.js +32 -0
  355. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/fetch-server-response.js +457 -0
  356. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/is-navigating-to-new-root-layout.js +59 -0
  357. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/ppr-navigations.js +1341 -0
  358. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/committed-state.js +49 -0
  359. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/find-head-in-cache.js +63 -0
  360. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/has-interception-route-in-current-tree.js +38 -0
  361. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/hmr-refresh-reducer.js +23 -0
  362. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/navigate-reducer.js +56 -0
  363. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/refresh-reducer.js +83 -0
  364. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/restore-reducer.js +62 -0
  365. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/server-action-reducer.js +320 -0
  366. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/reducers/server-patch-reducer.js +58 -0
  367. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/router-reducer-types.js +70 -0
  368. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/router-reducer.js +66 -0
  369. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/set-cache-busting-search-param.js +60 -0
  370. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/bfcache.js +128 -0
  371. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/cache-key.js +28 -0
  372. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/cache-map.js +305 -0
  373. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/cache.js +1933 -0
  374. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/lru.js +152 -0
  375. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/navigation-testing-lock.js +194 -0
  376. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/navigation.js +597 -0
  377. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/optimistic-routes.js +543 -0
  378. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/prefetch.js +31 -0
  379. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/scheduler.js +1249 -0
  380. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/types.js +69 -0
  381. package/.next/standalone/node_modules/next/dist/client/components/segment-cache/vary-path.js +278 -0
  382. package/.next/standalone/node_modules/next/dist/client/components/static-generation-bailout.js +42 -0
  383. package/.next/standalone/node_modules/next/dist/client/components/unauthorized.js +49 -0
  384. package/.next/standalone/node_modules/next/dist/client/components/unrecognized-action-error.js +39 -0
  385. package/.next/standalone/node_modules/next/dist/client/components/unresolved-thenable.js +23 -0
  386. package/.next/standalone/node_modules/next/dist/client/components/unstable-rethrow.browser.js +28 -0
  387. package/.next/standalone/node_modules/next/dist/client/components/unstable-rethrow.js +25 -0
  388. package/.next/standalone/node_modules/next/dist/client/components/unstable-rethrow.server.js +32 -0
  389. package/.next/standalone/node_modules/next/dist/client/components/use-action-queue.js +148 -0
  390. package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +72 -0
  391. package/.next/standalone/node_modules/next/dist/client/flight-data-helpers.js +232 -0
  392. package/.next/standalone/node_modules/next/dist/client/has-base-path.js +23 -0
  393. package/.next/standalone/node_modules/next/dist/client/lib/console.js +177 -0
  394. package/.next/standalone/node_modules/next/dist/client/lib/javascript-url.js +32 -0
  395. package/.next/standalone/node_modules/next/dist/client/navigation-build-id.js +53 -0
  396. package/.next/standalone/node_modules/next/dist/client/normalize-trailing-slash.js +36 -0
  397. package/.next/standalone/node_modules/next/dist/client/remove-base-path.js +32 -0
  398. package/.next/standalone/node_modules/next/dist/client/route-params.js +230 -0
  399. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/cookies/index.js +339 -0
  400. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/cookies/package.json +1 -0
  401. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/ponyfill/index.js +46 -0
  402. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/ponyfill/package.json +1 -0
  403. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/abort-controller.js.text.js +1 -0
  404. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/console.js.text.js +1 -0
  405. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/events.js.text.js +1 -0
  406. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/index.js +5 -0
  407. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/load.js +18713 -0
  408. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/package.json +1 -0
  409. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/stream.js +44 -0
  410. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/timers.js.text.js +1 -0
  411. package/.next/standalone/node_modules/next/dist/compiled/@edge-runtime/primitives/url.js.text.js +1 -0
  412. package/.next/standalone/node_modules/next/dist/compiled/@hapi/accept/index.js +1 -0
  413. package/.next/standalone/node_modules/next/dist/compiled/@hapi/accept/package.json +1 -0
  414. package/.next/standalone/node_modules/next/dist/compiled/@mswjs/interceptors/ClientRequest/index.js +1 -0
  415. package/.next/standalone/node_modules/next/dist/compiled/@mswjs/interceptors/ClientRequest/package.json +1 -0
  416. package/.next/standalone/node_modules/next/dist/compiled/@napi-rs/triples/index.js +1 -0
  417. package/.next/standalone/node_modules/next/dist/compiled/@napi-rs/triples/package.json +1 -0
  418. package/.next/standalone/node_modules/next/dist/compiled/@opentelemetry/api/index.js +1 -0
  419. package/.next/standalone/node_modules/next/dist/compiled/@opentelemetry/api/package.json +1 -0
  420. package/.next/standalone/node_modules/next/dist/compiled/async-retry/index.js +1 -0
  421. package/.next/standalone/node_modules/next/dist/compiled/async-retry/package.json +1 -0
  422. package/.next/standalone/node_modules/next/dist/compiled/async-sema/index.js +1 -0
  423. package/.next/standalone/node_modules/next/dist/compiled/async-sema/package.json +1 -0
  424. package/.next/standalone/node_modules/next/dist/compiled/busboy/index.js +1 -0
  425. package/.next/standalone/node_modules/next/dist/compiled/busboy/package.json +1 -0
  426. package/.next/standalone/node_modules/next/dist/compiled/bytes/index.js +8 -0
  427. package/.next/standalone/node_modules/next/dist/compiled/bytes/package.json +1 -0
  428. package/.next/standalone/node_modules/next/dist/compiled/ci-info/index.js +1 -0
  429. package/.next/standalone/node_modules/next/dist/compiled/ci-info/package.json +1 -0
  430. package/.next/standalone/node_modules/next/dist/compiled/commander/index.js +1 -0
  431. package/.next/standalone/node_modules/next/dist/compiled/commander/package.json +1 -0
  432. package/.next/standalone/node_modules/next/dist/compiled/comment-json/index.js +7 -0
  433. package/.next/standalone/node_modules/next/dist/compiled/comment-json/package.json +1 -0
  434. package/.next/standalone/node_modules/next/dist/compiled/compression/index.js +58 -0
  435. package/.next/standalone/node_modules/next/dist/compiled/compression/package.json +1 -0
  436. package/.next/standalone/node_modules/next/dist/compiled/conf/index.js +15 -0
  437. package/.next/standalone/node_modules/next/dist/compiled/conf/package.json +1 -0
  438. package/.next/standalone/node_modules/next/dist/compiled/content-disposition/index.js +6 -0
  439. package/.next/standalone/node_modules/next/dist/compiled/content-disposition/package.json +1 -0
  440. package/.next/standalone/node_modules/next/dist/compiled/cookie/index.js +7 -0
  441. package/.next/standalone/node_modules/next/dist/compiled/cookie/package.json +1 -0
  442. package/.next/standalone/node_modules/next/dist/compiled/cross-spawn/index.js +1 -0
  443. package/.next/standalone/node_modules/next/dist/compiled/cross-spawn/package.json +1 -0
  444. package/.next/standalone/node_modules/next/dist/compiled/debug/index.js +1 -0
  445. package/.next/standalone/node_modules/next/dist/compiled/debug/package.json +1 -0
  446. package/.next/standalone/node_modules/next/dist/compiled/edge-runtime/index.js +1 -0
  447. package/.next/standalone/node_modules/next/dist/compiled/edge-runtime/package.json +1 -0
  448. package/.next/standalone/node_modules/next/dist/compiled/find-up/index.js +1 -0
  449. package/.next/standalone/node_modules/next/dist/compiled/find-up/package.json +1 -0
  450. package/.next/standalone/node_modules/next/dist/compiled/fresh/index.js +8 -0
  451. package/.next/standalone/node_modules/next/dist/compiled/fresh/package.json +1 -0
  452. package/.next/standalone/node_modules/next/dist/compiled/http-proxy/index.js +34 -0
  453. package/.next/standalone/node_modules/next/dist/compiled/http-proxy/package.json +1 -0
  454. package/.next/standalone/node_modules/next/dist/compiled/image-detector/detector.js +1 -0
  455. package/.next/standalone/node_modules/next/dist/compiled/image-size/index.js +1 -0
  456. package/.next/standalone/node_modules/next/dist/compiled/image-size/package.json +1 -0
  457. package/.next/standalone/node_modules/next/dist/compiled/ipaddr.js/ipaddr.js +1 -0
  458. package/.next/standalone/node_modules/next/dist/compiled/ipaddr.js/package.json +1 -0
  459. package/.next/standalone/node_modules/next/dist/compiled/is-animated/index.js +1 -0
  460. package/.next/standalone/node_modules/next/dist/compiled/is-animated/package.json +1 -0
  461. package/.next/standalone/node_modules/next/dist/compiled/is-docker/index.js +1 -0
  462. package/.next/standalone/node_modules/next/dist/compiled/is-docker/package.json +1 -0
  463. package/.next/standalone/node_modules/next/dist/compiled/is-wsl/index.js +1 -0
  464. package/.next/standalone/node_modules/next/dist/compiled/is-wsl/package.json +1 -0
  465. package/.next/standalone/node_modules/next/dist/compiled/jsonwebtoken/index.js +11 -0
  466. package/.next/standalone/node_modules/next/dist/compiled/jsonwebtoken/package.json +1 -0
  467. package/.next/standalone/node_modules/next/dist/compiled/nanoid/index.cjs +1 -0
  468. package/.next/standalone/node_modules/next/dist/compiled/nanoid/package.json +1 -0
  469. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +54 -0
  470. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +54 -0
  471. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +6 -0
  472. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +20 -0
  473. package/.next/standalone/node_modules/next/dist/compiled/p-limit/index.js +1 -0
  474. package/.next/standalone/node_modules/next/dist/compiled/p-limit/package.json +1 -0
  475. package/.next/standalone/node_modules/next/dist/compiled/p-queue/index.js +1 -0
  476. package/.next/standalone/node_modules/next/dist/compiled/p-queue/package.json +1 -0
  477. package/.next/standalone/node_modules/next/dist/compiled/path-browserify/index.js +1 -0
  478. package/.next/standalone/node_modules/next/dist/compiled/path-browserify/package.json +1 -0
  479. package/.next/standalone/node_modules/next/dist/compiled/path-to-regexp/index.js +1 -0
  480. package/.next/standalone/node_modules/next/dist/compiled/path-to-regexp/package.json +1 -0
  481. package/.next/standalone/node_modules/next/dist/compiled/picomatch/index.js +1 -0
  482. package/.next/standalone/node_modules/next/dist/compiled/picomatch/package.json +1 -0
  483. package/.next/standalone/node_modules/next/dist/compiled/react-is/cjs/react-is.development.js +133 -0
  484. package/.next/standalone/node_modules/next/dist/compiled/react-is/cjs/react-is.production.js +130 -0
  485. package/.next/standalone/node_modules/next/dist/compiled/react-is/index.js +7 -0
  486. package/.next/standalone/node_modules/next/dist/compiled/react-is/package.json +26 -0
  487. package/.next/standalone/node_modules/next/dist/compiled/regenerator-runtime/package.json +19 -0
  488. package/.next/standalone/node_modules/next/dist/compiled/regenerator-runtime/runtime.js +729 -0
  489. package/.next/standalone/node_modules/next/dist/compiled/semver/index.js +1 -0
  490. package/.next/standalone/node_modules/next/dist/compiled/semver/package.json +1 -0
  491. package/.next/standalone/node_modules/next/dist/compiled/send/index.js +70 -0
  492. package/.next/standalone/node_modules/next/dist/compiled/send/package.json +1 -0
  493. package/.next/standalone/node_modules/next/dist/compiled/source-map/package.json +1 -0
  494. package/.next/standalone/node_modules/next/dist/compiled/source-map/source-map.js +1 -0
  495. package/.next/standalone/node_modules/next/dist/compiled/stacktrace-parser/package.json +1 -0
  496. package/.next/standalone/node_modules/next/dist/compiled/stacktrace-parser/stack-trace-parser.cjs.js +1 -0
  497. package/.next/standalone/node_modules/next/dist/compiled/string-hash/index.js +1 -0
  498. package/.next/standalone/node_modules/next/dist/compiled/string-hash/package.json +1 -0
  499. package/.next/standalone/node_modules/next/dist/compiled/strip-ansi/index.js +1 -0
  500. package/.next/standalone/node_modules/next/dist/compiled/strip-ansi/package.json +1 -0
  501. package/.next/standalone/node_modules/next/dist/compiled/superstruct/index.cjs +1 -0
  502. package/.next/standalone/node_modules/next/dist/compiled/superstruct/package.json +1 -0
  503. package/.next/standalone/node_modules/next/dist/compiled/tar/index.min.js +1 -0
  504. package/.next/standalone/node_modules/next/dist/compiled/tar/package.json +1 -0
  505. package/.next/standalone/node_modules/next/dist/compiled/text-table/index.js +1 -0
  506. package/.next/standalone/node_modules/next/dist/compiled/text-table/package.json +1 -0
  507. package/.next/standalone/node_modules/next/dist/compiled/watchpack/package.json +1 -0
  508. package/.next/standalone/node_modules/next/dist/compiled/watchpack/watchpack.js +1 -0
  509. package/.next/standalone/node_modules/next/dist/compiled/ws/index.js +1 -0
  510. package/.next/standalone/node_modules/next/dist/compiled/ws/package.json +1 -0
  511. package/.next/standalone/node_modules/next/dist/compiled/zod/index.cjs +1 -0
  512. package/.next/standalone/node_modules/next/dist/compiled/zod/package.json +1 -0
  513. package/.next/standalone/node_modules/next/dist/compiled/zod-validation-error/index.js +1 -0
  514. package/.next/standalone/node_modules/next/dist/compiled/zod-validation-error/package.json +1 -0
  515. package/.next/standalone/node_modules/next/dist/experimental/testmode/context.js +57 -0
  516. package/.next/standalone/node_modules/next/dist/experimental/testmode/fetch.js +142 -0
  517. package/.next/standalone/node_modules/next/dist/experimental/testmode/httpget.js +26 -0
  518. package/.next/standalone/node_modules/next/dist/experimental/testmode/server-edge.js +32 -0
  519. package/.next/standalone/node_modules/next/dist/experimental/testmode/server.js +62 -0
  520. package/.next/standalone/node_modules/next/dist/export/helpers/create-incremental-cache.js +61 -0
  521. package/.next/standalone/node_modules/next/dist/lib/batcher.js +65 -0
  522. package/.next/standalone/node_modules/next/dist/lib/build-custom-route.js +46 -0
  523. package/.next/standalone/node_modules/next/dist/lib/bundler.js +97 -0
  524. package/.next/standalone/node_modules/next/dist/lib/client-and-server-references.js +54 -0
  525. package/.next/standalone/node_modules/next/dist/lib/coalesced-function.js +39 -0
  526. package/.next/standalone/node_modules/next/dist/lib/compile-error.js +14 -0
  527. package/.next/standalone/node_modules/next/dist/lib/constants.js +420 -0
  528. package/.next/standalone/node_modules/next/dist/lib/create-client-router-filter.js +67 -0
  529. package/.next/standalone/node_modules/next/dist/lib/default-transpiled-packages.json +1 -0
  530. package/.next/standalone/node_modules/next/dist/lib/detached-promise.js +32 -0
  531. package/.next/standalone/node_modules/next/dist/lib/detect-typo.js +51 -0
  532. package/.next/standalone/node_modules/next/dist/lib/download-swc.js +183 -0
  533. package/.next/standalone/node_modules/next/dist/lib/error-telemetry-utils.js +42 -0
  534. package/.next/standalone/node_modules/next/dist/lib/fallback.js +100 -0
  535. package/.next/standalone/node_modules/next/dist/lib/fatal-error.js +14 -0
  536. package/.next/standalone/node_modules/next/dist/lib/file-exists.js +53 -0
  537. package/.next/standalone/node_modules/next/dist/lib/find-config.js +102 -0
  538. package/.next/standalone/node_modules/next/dist/lib/find-pages-dir.js +65 -0
  539. package/.next/standalone/node_modules/next/dist/lib/find-root.js +126 -0
  540. package/.next/standalone/node_modules/next/dist/lib/format-cli-help-output.js +84 -0
  541. package/.next/standalone/node_modules/next/dist/lib/format-dynamic-import-path.js +24 -0
  542. package/.next/standalone/node_modules/next/dist/lib/format-server-error.js +75 -0
  543. package/.next/standalone/node_modules/next/dist/lib/framework/boundary-components.js +62 -0
  544. package/.next/standalone/node_modules/next/dist/lib/framework/boundary-constants.js +36 -0
  545. package/.next/standalone/node_modules/next/dist/lib/fs/rename.js +87 -0
  546. package/.next/standalone/node_modules/next/dist/lib/fs/write-atomic.js +28 -0
  547. package/.next/standalone/node_modules/next/dist/lib/generate-interception-routes-rewrites.js +52 -0
  548. package/.next/standalone/node_modules/next/dist/lib/get-files-in-dir.js +33 -0
  549. package/.next/standalone/node_modules/next/dist/lib/get-network-host.js +44 -0
  550. package/.next/standalone/node_modules/next/dist/lib/get-package-version.js +118 -0
  551. package/.next/standalone/node_modules/next/dist/lib/get-project-dir.js +51 -0
  552. package/.next/standalone/node_modules/next/dist/lib/has-necessary-dependencies.js +49 -0
  553. package/.next/standalone/node_modules/next/dist/lib/helpers/get-cache-directory.js +66 -0
  554. package/.next/standalone/node_modules/next/dist/lib/helpers/get-npx-command.js +29 -0
  555. package/.next/standalone/node_modules/next/dist/lib/helpers/get-online.js +50 -0
  556. package/.next/standalone/node_modules/next/dist/lib/helpers/get-pkg-manager.js +63 -0
  557. package/.next/standalone/node_modules/next/dist/lib/helpers/get-registry.js +45 -0
  558. package/.next/standalone/node_modules/next/dist/lib/helpers/get-reserved-port.js +116 -0
  559. package/.next/standalone/node_modules/next/dist/lib/helpers/install.js +83 -0
  560. package/.next/standalone/node_modules/next/dist/lib/import-next-warning.js +50 -0
  561. package/.next/standalone/node_modules/next/dist/lib/inline-static-env.js +112 -0
  562. package/.next/standalone/node_modules/next/dist/lib/install-dependencies.js +40 -0
  563. package/.next/standalone/node_modules/next/dist/lib/interop-default.js +16 -0
  564. package/.next/standalone/node_modules/next/dist/lib/is-api-route.js +15 -0
  565. package/.next/standalone/node_modules/next/dist/lib/is-app-page-route.js +15 -0
  566. package/.next/standalone/node_modules/next/dist/lib/is-app-route-route.js +15 -0
  567. package/.next/standalone/node_modules/next/dist/lib/is-edge-runtime.js +16 -0
  568. package/.next/standalone/node_modules/next/dist/lib/is-error.js +78 -0
  569. package/.next/standalone/node_modules/next/dist/lib/is-interception-route-rewrite.js +18 -0
  570. package/.next/standalone/node_modules/next/dist/lib/is-internal-component.js +36 -0
  571. package/.next/standalone/node_modules/next/dist/lib/is-serializable-props.js +106 -0
  572. package/.next/standalone/node_modules/next/dist/lib/known-edge-safe-packages.json +1 -0
  573. package/.next/standalone/node_modules/next/dist/lib/load-custom-routes.js +594 -0
  574. package/.next/standalone/node_modules/next/dist/lib/memory/gc-observer.js +53 -0
  575. package/.next/standalone/node_modules/next/dist/lib/memory/shutdown.js +29 -0
  576. package/.next/standalone/node_modules/next/dist/lib/memory/startup.js +47 -0
  577. package/.next/standalone/node_modules/next/dist/lib/memory/trace.js +109 -0
  578. package/.next/standalone/node_modules/next/dist/lib/metadata/constants.js +40 -0
  579. package/.next/standalone/node_modules/next/dist/lib/metadata/default-metadata.js +82 -0
  580. package/.next/standalone/node_modules/next/dist/lib/metadata/generate/icon-mark.js +22 -0
  581. package/.next/standalone/node_modules/next/dist/lib/metadata/generate/utils.js +52 -0
  582. package/.next/standalone/node_modules/next/dist/lib/metadata/get-metadata-route.js +123 -0
  583. package/.next/standalone/node_modules/next/dist/lib/metadata/is-metadata-route.js +221 -0
  584. package/.next/standalone/node_modules/next/dist/lib/metadata/metadata-context.js +18 -0
  585. package/.next/standalone/node_modules/next/dist/lib/metadata/metadata.js +1686 -0
  586. package/.next/standalone/node_modules/next/dist/lib/metadata/resolve-metadata.js +884 -0
  587. package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-basics.js +232 -0
  588. package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-icons.js +56 -0
  589. package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-opengraph.js +199 -0
  590. package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-title.js +40 -0
  591. package/.next/standalone/node_modules/next/dist/lib/metadata/resolvers/resolve-url.js +135 -0
  592. package/.next/standalone/node_modules/next/dist/lib/metadata/types/alternative-urls-types.js +7 -0
  593. package/.next/standalone/node_modules/next/dist/lib/metadata/types/extra-types.js +9 -0
  594. package/.next/standalone/node_modules/next/dist/lib/metadata/types/icons.js +6 -0
  595. package/.next/standalone/node_modules/next/dist/lib/metadata/types/manifest-types.js +6 -0
  596. package/.next/standalone/node_modules/next/dist/lib/metadata/types/metadata-interface.js +18 -0
  597. package/.next/standalone/node_modules/next/dist/lib/metadata/types/metadata-types.js +10 -0
  598. package/.next/standalone/node_modules/next/dist/lib/metadata/types/opengraph-types.js +6 -0
  599. package/.next/standalone/node_modules/next/dist/lib/metadata/types/resolvers.js +6 -0
  600. package/.next/standalone/node_modules/next/dist/lib/metadata/types/twitter-types.js +7 -0
  601. package/.next/standalone/node_modules/next/dist/lib/mime-type.js +20 -0
  602. package/.next/standalone/node_modules/next/dist/lib/mkcert.js +204 -0
  603. package/.next/standalone/node_modules/next/dist/lib/multi-file-writer.js +75 -0
  604. package/.next/standalone/node_modules/next/dist/lib/needs-experimental-react.js +16 -0
  605. package/.next/standalone/node_modules/next/dist/lib/non-nullable.js +15 -0
  606. package/.next/standalone/node_modules/next/dist/lib/normalize-path.js +21 -0
  607. package/.next/standalone/node_modules/next/dist/lib/oxford-comma-list.js +15 -0
  608. package/.next/standalone/node_modules/next/dist/lib/page-types.js +18 -0
  609. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +185 -0
  610. package/.next/standalone/node_modules/next/dist/lib/pick.js +19 -0
  611. package/.next/standalone/node_modules/next/dist/lib/picocolors.js +177 -0
  612. package/.next/standalone/node_modules/next/dist/lib/pretty-bytes.js +74 -0
  613. package/.next/standalone/node_modules/next/dist/lib/realpath.js +20 -0
  614. package/.next/standalone/node_modules/next/dist/lib/recursive-copy.js +76 -0
  615. package/.next/standalone/node_modules/next/dist/lib/recursive-delete.js +137 -0
  616. package/.next/standalone/node_modules/next/dist/lib/recursive-readdir.js +124 -0
  617. package/.next/standalone/node_modules/next/dist/lib/redirect-status.js +46 -0
  618. package/.next/standalone/node_modules/next/dist/lib/require-instrumentation-client.js +26 -0
  619. package/.next/standalone/node_modules/next/dist/lib/resolve-build-paths.js +154 -0
  620. package/.next/standalone/node_modules/next/dist/lib/resolve-from.js +65 -0
  621. package/.next/standalone/node_modules/next/dist/lib/route-pattern-normalizer.js +107 -0
  622. package/.next/standalone/node_modules/next/dist/lib/scheduler.js +64 -0
  623. package/.next/standalone/node_modules/next/dist/lib/semver-noop.js +18 -0
  624. package/.next/standalone/node_modules/next/dist/lib/server-external-packages.jsonc +103 -0
  625. package/.next/standalone/node_modules/next/dist/lib/setup-exception-listeners.js +11 -0
  626. package/.next/standalone/node_modules/next/dist/lib/static-env.js +92 -0
  627. package/.next/standalone/node_modules/next/dist/lib/try-to-parse-path.js +67 -0
  628. package/.next/standalone/node_modules/next/dist/lib/turbopack-warning.js +185 -0
  629. package/.next/standalone/node_modules/next/dist/lib/typescript/diagnosticFormatter.js +243 -0
  630. package/.next/standalone/node_modules/next/dist/lib/typescript/getTypeScriptConfiguration.js +153 -0
  631. package/.next/standalone/node_modules/next/dist/lib/typescript/getTypeScriptIntent.js +52 -0
  632. package/.next/standalone/node_modules/next/dist/lib/typescript/missingDependencyError.js +27 -0
  633. package/.next/standalone/node_modules/next/dist/lib/typescript/runTypeCheck.js +149 -0
  634. package/.next/standalone/node_modules/next/dist/lib/typescript/type-paths.js +51 -0
  635. package/.next/standalone/node_modules/next/dist/lib/typescript/writeAppTypeDeclarations.js +75 -0
  636. package/.next/standalone/node_modules/next/dist/lib/typescript/writeConfigurationDefaults.js +395 -0
  637. package/.next/standalone/node_modules/next/dist/lib/url.js +75 -0
  638. package/.next/standalone/node_modules/next/dist/lib/verify-partytown-setup.js +115 -0
  639. package/.next/standalone/node_modules/next/dist/lib/verify-root-layout.js +165 -0
  640. package/.next/standalone/node_modules/next/dist/lib/verify-typescript-setup.js +228 -0
  641. package/.next/standalone/node_modules/next/dist/lib/wait.js +19 -0
  642. package/.next/standalone/node_modules/next/dist/lib/with-promise-cache.js +24 -0
  643. package/.next/standalone/node_modules/next/dist/lib/worker.js +234 -0
  644. package/.next/standalone/node_modules/next/dist/server/ReactDOMServerPages.js +16 -0
  645. package/.next/standalone/node_modules/next/dist/server/accept-header.js +132 -0
  646. package/.next/standalone/node_modules/next/dist/server/after/after-context.js +140 -0
  647. package/.next/standalone/node_modules/next/dist/server/after/after.js +26 -0
  648. package/.next/standalone/node_modules/next/dist/server/after/awaiter.js +74 -0
  649. package/.next/standalone/node_modules/next/dist/server/after/builtin-request-context.js +38 -0
  650. package/.next/standalone/node_modules/next/dist/server/after/index.js +21 -0
  651. package/.next/standalone/node_modules/next/dist/server/after/run-with-after.js +35 -0
  652. package/.next/standalone/node_modules/next/dist/server/api-utils/get-cookie-parser.js +22 -0
  653. package/.next/standalone/node_modules/next/dist/server/api-utils/index.js +201 -0
  654. package/.next/standalone/node_modules/next/dist/server/api-utils/node/api-resolver.js +395 -0
  655. package/.next/standalone/node_modules/next/dist/server/api-utils/node/parse-body.js +79 -0
  656. package/.next/standalone/node_modules/next/dist/server/api-utils/node/try-get-preview-data.js +86 -0
  657. package/.next/standalone/node_modules/next/dist/server/api-utils/web.js +17 -0
  658. package/.next/standalone/node_modules/next/dist/server/app-render/action-async-storage-instance.js +14 -0
  659. package/.next/standalone/node_modules/next/dist/server/app-render/action-async-storage.external.js +13 -0
  660. package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +1020 -0
  661. package/.next/standalone/node_modules/next/dist/server/app-render/after-task-async-storage-instance.js +14 -0
  662. package/.next/standalone/node_modules/next/dist/server/app-render/after-task-async-storage.external.js +13 -0
  663. package/.next/standalone/node_modules/next/dist/server/app-render/app-render-prerender-utils.js +167 -0
  664. package/.next/standalone/node_modules/next/dist/server/app-render/app-render-render-utils.js +76 -0
  665. package/.next/standalone/node_modules/next/dist/server/app-render/app-render-scheduling.js +188 -0
  666. package/.next/standalone/node_modules/next/dist/server/app-render/app-render.js +4469 -0
  667. package/.next/standalone/node_modules/next/dist/server/app-render/async-local-storage.js +76 -0
  668. package/.next/standalone/node_modules/next/dist/server/app-render/cache-signal.js +181 -0
  669. package/.next/standalone/node_modules/next/dist/server/app-render/collect-segment-data.js +600 -0
  670. package/.next/standalone/node_modules/next/dist/server/app-render/console-async-storage-instance.js +14 -0
  671. package/.next/standalone/node_modules/next/dist/server/app-render/console-async-storage.external.js +13 -0
  672. package/.next/standalone/node_modules/next/dist/server/app-render/create-component-styles-and-scripts.js +33 -0
  673. package/.next/standalone/node_modules/next/dist/server/app-render/create-component-tree.js +840 -0
  674. package/.next/standalone/node_modules/next/dist/server/app-render/create-error-handler.js +189 -0
  675. package/.next/standalone/node_modules/next/dist/server/app-render/create-flight-router-state-from-loader-tree.js +102 -0
  676. package/.next/standalone/node_modules/next/dist/server/app-render/csrf-protection.js +86 -0
  677. package/.next/standalone/node_modules/next/dist/server/app-render/debug-channel-server.js +30 -0
  678. package/.next/standalone/node_modules/next/dist/server/app-render/debug-channel-server.web.js +71 -0
  679. package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js +14 -0
  680. package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js +13 -0
  681. package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering.js +1144 -0
  682. package/.next/standalone/node_modules/next/dist/server/app-render/encryption-utils-server.js +114 -0
  683. package/.next/standalone/node_modules/next/dist/server/app-render/encryption-utils.js +93 -0
  684. package/.next/standalone/node_modules/next/dist/server/app-render/encryption.js +259 -0
  685. package/.next/standalone/node_modules/next/dist/server/app-render/entry-base.js +256 -0
  686. package/.next/standalone/node_modules/next/dist/server/app-render/flight-render-result.js +28 -0
  687. package/.next/standalone/node_modules/next/dist/server/app-render/get-asset-query-string.js +29 -0
  688. package/.next/standalone/node_modules/next/dist/server/app-render/get-css-inlined-link-tags.js +49 -0
  689. package/.next/standalone/node_modules/next/dist/server/app-render/get-layer-assets.js +65 -0
  690. package/.next/standalone/node_modules/next/dist/server/app-render/get-preloadable-fonts.js +39 -0
  691. package/.next/standalone/node_modules/next/dist/server/app-render/get-script-nonce-from-header.js +44 -0
  692. package/.next/standalone/node_modules/next/dist/server/app-render/get-short-dynamic-param-type.js +25 -0
  693. package/.next/standalone/node_modules/next/dist/server/app-render/has-loading-component-in-tree.js +19 -0
  694. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/boundary-constants.js +13 -0
  695. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/boundary-impl.js +103 -0
  696. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.js +18 -0
  697. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-config.js +181 -0
  698. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-samples-client.js +128 -0
  699. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-samples.js +432 -0
  700. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.js +33 -0
  701. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-validation.js +713 -0
  702. package/.next/standalone/node_modules/next/dist/server/app-render/instant-validation/stream-utils.js +96 -0
  703. package/.next/standalone/node_modules/next/dist/server/app-render/interop-default.js +17 -0
  704. package/.next/standalone/node_modules/next/dist/server/app-render/make-get-server-inserted-html.js +92 -0
  705. package/.next/standalone/node_modules/next/dist/server/app-render/manifests-singleton.js +264 -0
  706. package/.next/standalone/node_modules/next/dist/server/app-render/metadata-insertion/create-server-inserted-metadata.js +28 -0
  707. package/.next/standalone/node_modules/next/dist/server/app-render/module-loading/track-dynamic-import.js +57 -0
  708. package/.next/standalone/node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js +32 -0
  709. package/.next/standalone/node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js +66 -0
  710. package/.next/standalone/node_modules/next/dist/server/app-render/parse-and-validate-flight-router-state.js +49 -0
  711. package/.next/standalone/node_modules/next/dist/server/app-render/postponed-state.js +157 -0
  712. package/.next/standalone/node_modules/next/dist/server/app-render/prospective-render-utils.js +74 -0
  713. package/.next/standalone/node_modules/next/dist/server/app-render/react-large-shell-error.js +17 -0
  714. package/.next/standalone/node_modules/next/dist/server/app-render/react-server.node.js +39 -0
  715. package/.next/standalone/node_modules/next/dist/server/app-render/render-css-resource.js +52 -0
  716. package/.next/standalone/node_modules/next/dist/server/app-render/required-scripts.js +76 -0
  717. package/.next/standalone/node_modules/next/dist/server/app-render/rsc/postpone.js +18 -0
  718. package/.next/standalone/node_modules/next/dist/server/app-render/rsc/preloads.js +74 -0
  719. package/.next/standalone/node_modules/next/dist/server/app-render/rsc/taint.js +79 -0
  720. package/.next/standalone/node_modules/next/dist/server/app-render/segment-explorer-path.js +128 -0
  721. package/.next/standalone/node_modules/next/dist/server/app-render/server-inserted-html.js +77 -0
  722. package/.next/standalone/node_modules/next/dist/server/app-render/staged-rendering.js +343 -0
  723. package/.next/standalone/node_modules/next/dist/server/app-render/stale-time.js +111 -0
  724. package/.next/standalone/node_modules/next/dist/server/app-render/stream-ops.js +106 -0
  725. package/.next/standalone/node_modules/next/dist/server/app-render/stream-ops.web.js +163 -0
  726. package/.next/standalone/node_modules/next/dist/server/app-render/strip-flight-headers.js +18 -0
  727. package/.next/standalone/node_modules/next/dist/server/app-render/types.js +65 -0
  728. package/.next/standalone/node_modules/next/dist/server/app-render/use-flight-response.js +214 -0
  729. package/.next/standalone/node_modules/next/dist/server/app-render/vary-params.js +336 -0
  730. package/.next/standalone/node_modules/next/dist/server/app-render/walk-tree-with-flight-router-state.js +232 -0
  731. package/.next/standalone/node_modules/next/dist/server/app-render/work-async-storage-instance.js +14 -0
  732. package/.next/standalone/node_modules/next/dist/server/app-render/work-async-storage.external.js +13 -0
  733. package/.next/standalone/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js +14 -0
  734. package/.next/standalone/node_modules/next/dist/server/app-render/work-unit-async-storage.external.js +280 -0
  735. package/.next/standalone/node_modules/next/dist/server/async-storage/draft-mode-provider.js +62 -0
  736. package/.next/standalone/node_modules/next/dist/server/async-storage/request-store.js +144 -0
  737. package/.next/standalone/node_modules/next/dist/server/async-storage/with-store.js +6 -0
  738. package/.next/standalone/node_modules/next/dist/server/async-storage/work-store.js +91 -0
  739. package/.next/standalone/node_modules/next/dist/server/base-http/helpers.js +36 -0
  740. package/.next/standalone/node_modules/next/dist/server/base-http/index.js +54 -0
  741. package/.next/standalone/node_modules/next/dist/server/base-http/node.js +147 -0
  742. package/.next/standalone/node_modules/next/dist/server/base-http/web.js +124 -0
  743. package/.next/standalone/node_modules/next/dist/server/base-server.js +1874 -0
  744. package/.next/standalone/node_modules/next/dist/server/body-streams.js +114 -0
  745. package/.next/standalone/node_modules/next/dist/server/cache-dir.js +26 -0
  746. package/.next/standalone/node_modules/next/dist/server/capsize-font-metrics.json +181516 -0
  747. package/.next/standalone/node_modules/next/dist/server/ci-info.js +41 -0
  748. package/.next/standalone/node_modules/next/dist/server/client-component-renderer-logger.js +70 -0
  749. package/.next/standalone/node_modules/next/dist/server/config-schema.js +718 -0
  750. package/.next/standalone/node_modules/next/dist/server/config-shared.js +369 -0
  751. package/.next/standalone/node_modules/next/dist/server/config-utils.js +185 -0
  752. package/.next/standalone/node_modules/next/dist/server/config.js +1545 -0
  753. package/.next/standalone/node_modules/next/dist/server/create-deduped-by-callsite-server-error-logger.js +96 -0
  754. package/.next/standalone/node_modules/next/dist/server/crypto-utils.js +70 -0
  755. package/.next/standalone/node_modules/next/dist/server/dev/browser-logs/file-logger.js +186 -0
  756. package/.next/standalone/node_modules/next/dist/server/dev/browser-logs/receive-logs.js +558 -0
  757. package/.next/standalone/node_modules/next/dist/server/dev/browser-logs/source-map.js +222 -0
  758. package/.next/standalone/node_modules/next/dist/server/dev/debug-channel.js +87 -0
  759. package/.next/standalone/node_modules/next/dist/server/dev/dev-indicator-server-state.js +15 -0
  760. package/.next/standalone/node_modules/next/dist/server/dev/get-source-map-from-file.js +100 -0
  761. package/.next/standalone/node_modules/next/dist/server/dev/hot-middleware.js +274 -0
  762. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-rspack.js +171 -0
  763. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-shared-utils.js +56 -0
  764. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +1475 -0
  765. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-types.js +58 -0
  766. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1386 -0
  767. package/.next/standalone/node_modules/next/dist/server/dev/log-requests.js +149 -0
  768. package/.next/standalone/node_modules/next/dist/server/dev/messages.js +74 -0
  769. package/.next/standalone/node_modules/next/dist/server/dev/middleware-turbopack.js +403 -0
  770. package/.next/standalone/node_modules/next/dist/server/dev/middleware-webpack.js +483 -0
  771. package/.next/standalone/node_modules/next/dist/server/dev/node-stack-frames.js +72 -0
  772. package/.next/standalone/node_modules/next/dist/server/dev/on-demand-entry-handler.js +773 -0
  773. package/.next/standalone/node_modules/next/dist/server/dev/parse-version-info.js +108 -0
  774. package/.next/standalone/node_modules/next/dist/server/dev/require-cache.js +79 -0
  775. package/.next/standalone/node_modules/next/dist/server/dev/serialized-errors.js +67 -0
  776. package/.next/standalone/node_modules/next/dist/server/dev/server-action-logger.js +37 -0
  777. package/.next/standalone/node_modules/next/dist/server/dev/static-paths-worker.js +104 -0
  778. package/.next/standalone/node_modules/next/dist/server/dev/turbopack-utils.js +687 -0
  779. package/.next/standalone/node_modules/next/dist/server/dynamic-rendering-utils.js +108 -0
  780. package/.next/standalone/node_modules/next/dist/server/font-utils.js +43 -0
  781. package/.next/standalone/node_modules/next/dist/server/get-app-route-from-entrypoint.js +30 -0
  782. package/.next/standalone/node_modules/next/dist/server/get-page-files.js +23 -0
  783. package/.next/standalone/node_modules/next/dist/server/get-route-from-entrypoint.js +35 -0
  784. package/.next/standalone/node_modules/next/dist/server/htmlescape.js +37 -0
  785. package/.next/standalone/node_modules/next/dist/server/image-optimizer.js +1220 -0
  786. package/.next/standalone/node_modules/next/dist/server/instrumentation/types.js +6 -0
  787. package/.next/standalone/node_modules/next/dist/server/instrumentation/utils.js +21 -0
  788. package/.next/standalone/node_modules/next/dist/server/internal-utils.js +39 -0
  789. package/.next/standalone/node_modules/next/dist/server/is-private-ip.js +36 -0
  790. package/.next/standalone/node_modules/next/dist/server/lib/app-dir-module.js +59 -0
  791. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +132 -0
  792. package/.next/standalone/node_modules/next/dist/server/lib/async-callback-set.js +29 -0
  793. package/.next/standalone/node_modules/next/dist/server/lib/cache-control.js +22 -0
  794. package/.next/standalone/node_modules/next/dist/server/lib/cache-handlers/default.external.js +18 -0
  795. package/.next/standalone/node_modules/next/dist/server/lib/cache-handlers/default.js +160 -0
  796. package/.next/standalone/node_modules/next/dist/server/lib/cache-handlers/types.js +8 -0
  797. package/.next/standalone/node_modules/next/dist/server/lib/chrome-devtools-workspace.js +116 -0
  798. package/.next/standalone/node_modules/next/dist/server/lib/clone-response.js +77 -0
  799. package/.next/standalone/node_modules/next/dist/server/lib/cpu-profile.js +59 -0
  800. package/.next/standalone/node_modules/next/dist/server/lib/decode-query-path-parameter.js +26 -0
  801. package/.next/standalone/node_modules/next/dist/server/lib/dedupe-fetch.js +163 -0
  802. package/.next/standalone/node_modules/next/dist/server/lib/dev-bundler-service.js +95 -0
  803. package/.next/standalone/node_modules/next/dist/server/lib/disk-lru-cache.external.js +57 -0
  804. package/.next/standalone/node_modules/next/dist/server/lib/etag.js +56 -0
  805. package/.next/standalone/node_modules/next/dist/server/lib/experimental/create-env-definitions.js +48 -0
  806. package/.next/standalone/node_modules/next/dist/server/lib/experimental/ppr.js +47 -0
  807. package/.next/standalone/node_modules/next/dist/server/lib/find-page-file.js +147 -0
  808. package/.next/standalone/node_modules/next/dist/server/lib/fix-mojibake.js +25 -0
  809. package/.next/standalone/node_modules/next/dist/server/lib/format-hostname.js +16 -0
  810. package/.next/standalone/node_modules/next/dist/server/lib/i18n-provider.js +129 -0
  811. package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +77 -0
  812. package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/file-system-cache.js +335 -0
  813. package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/index.js +501 -0
  814. package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js +57 -0
  815. package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js +73 -0
  816. package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js +55 -0
  817. package/.next/standalone/node_modules/next/dist/server/lib/install-code-frame.js +22 -0
  818. package/.next/standalone/node_modules/next/dist/server/lib/is-ipv6.js +41 -0
  819. package/.next/standalone/node_modules/next/dist/server/lib/lazy-result.js +46 -0
  820. package/.next/standalone/node_modules/next/dist/server/lib/lru-cache.js +191 -0
  821. package/.next/standalone/node_modules/next/dist/server/lib/match-next-data-pathname.js +18 -0
  822. package/.next/standalone/node_modules/next/dist/server/lib/mock-request.js +416 -0
  823. package/.next/standalone/node_modules/next/dist/server/lib/module-loader/module-loader.js +8 -0
  824. package/.next/standalone/node_modules/next/dist/server/lib/module-loader/node-module-loader.js +25 -0
  825. package/.next/standalone/node_modules/next/dist/server/lib/module-loader/route-module-loader.js +26 -0
  826. package/.next/standalone/node_modules/next/dist/server/lib/node-fs-methods.js +28 -0
  827. package/.next/standalone/node_modules/next/dist/server/lib/parse-stack.js +46 -0
  828. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +978 -0
  829. package/.next/standalone/node_modules/next/dist/server/lib/patch-set-header.js +38 -0
  830. package/.next/standalone/node_modules/next/dist/server/lib/postponed-request-body.js +64 -0
  831. package/.next/standalone/node_modules/next/dist/server/lib/render-server.js +155 -0
  832. package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +696 -0
  833. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/block-cross-site-dev.js +110 -0
  834. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/build-data-route.js +48 -0
  835. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.js +50 -0
  836. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/cache-life-type-utils.js +211 -0
  837. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/decode-path-params.js +42 -0
  838. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/filesystem.js +591 -0
  839. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js +89 -0
  840. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js +96 -0
  841. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/is-postpone.js +16 -0
  842. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/proxy-request.js +118 -0
  843. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/resolve-routes.js +629 -0
  844. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/route-types-utils.js +286 -0
  845. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/router-server-context.js +26 -0
  846. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/typegen.js +858 -0
  847. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/types.js +6 -0
  848. package/.next/standalone/node_modules/next/dist/server/lib/server-action-request-meta.js +53 -0
  849. package/.next/standalone/node_modules/next/dist/server/lib/server-ipc/utils.js +81 -0
  850. package/.next/standalone/node_modules/next/dist/server/lib/source-maps.js +196 -0
  851. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +494 -0
  852. package/.next/standalone/node_modules/next/dist/server/lib/streaming-metadata.js +38 -0
  853. package/.next/standalone/node_modules/next/dist/server/lib/to-route.js +37 -0
  854. package/.next/standalone/node_modules/next/dist/server/lib/trace/constants.js +203 -0
  855. package/.next/standalone/node_modules/next/dist/server/lib/trace/tracer.js +280 -0
  856. package/.next/standalone/node_modules/next/dist/server/lib/trace/utils.js +16 -0
  857. package/.next/standalone/node_modules/next/dist/server/lib/types.js +6 -0
  858. package/.next/standalone/node_modules/next/dist/server/lib/utils.js +278 -0
  859. package/.next/standalone/node_modules/next/dist/server/lib/worker-utils.js +36 -0
  860. package/.next/standalone/node_modules/next/dist/server/load-components.js +179 -0
  861. package/.next/standalone/node_modules/next/dist/server/load-default-error-components.js +41 -0
  862. package/.next/standalone/node_modules/next/dist/server/load-manifest.external.js +117 -0
  863. package/.next/standalone/node_modules/next/dist/server/match-bundle.js +25 -0
  864. package/.next/standalone/node_modules/next/dist/server/mcp/get-mcp-middleware.js +49 -0
  865. package/.next/standalone/node_modules/next/dist/server/mcp/get-or-create-mcp-server.js +41 -0
  866. package/.next/standalone/node_modules/next/dist/server/mcp/mcp-telemetry-tracker.js +82 -0
  867. package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-errors.js +114 -0
  868. package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-logs.js +67 -0
  869. package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-page-metadata.js +188 -0
  870. package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-project-metadata.js +59 -0
  871. package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-routes.js +136 -0
  872. package/.next/standalone/node_modules/next/dist/server/mcp/tools/get-server-action-by-id.js +121 -0
  873. package/.next/standalone/node_modules/next/dist/server/mcp/tools/next-instance-error-state.js +31 -0
  874. package/.next/standalone/node_modules/next/dist/server/mcp/tools/utils/browser-communication.js +90 -0
  875. package/.next/standalone/node_modules/next/dist/server/mcp/tools/utils/format-errors.js +137 -0
  876. package/.next/standalone/node_modules/next/dist/server/next-server.js +1429 -0
  877. package/.next/standalone/node_modules/next/dist/server/next-typescript.js +13 -0
  878. package/.next/standalone/node_modules/next/dist/server/next.js +455 -0
  879. package/.next/standalone/node_modules/next/dist/server/node-environment-baseline.js +25 -0
  880. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/console-dim.external.js +301 -0
  881. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/console-exit.js +49 -0
  882. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/console-file.js +56 -0
  883. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/date.js +52 -0
  884. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/error-inspect.js +8 -0
  885. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.js +577 -0
  886. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/global-behaviors.js +33 -0
  887. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/io-utils.js +195 -0
  888. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/node-crypto.js +103 -0
  889. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/process-error-handlers.js +91 -0
  890. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/random.js +28 -0
  891. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.js +508 -0
  892. package/.next/standalone/node_modules/next/dist/server/node-environment-extensions/web-crypto.js +45 -0
  893. package/.next/standalone/node_modules/next/dist/server/node-environment.js +19 -0
  894. package/.next/standalone/node_modules/next/dist/server/node-polyfill-crypto.js +21 -0
  895. package/.next/standalone/node_modules/next/dist/server/normalizers/absolute-filename-normalizer.js +33 -0
  896. package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/app-bundle-path-normalizer.js +54 -0
  897. package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/app-filename-normalizer.js +22 -0
  898. package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/app-page-normalizer.js +40 -0
  899. package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/app-pathname-normalizer.js +55 -0
  900. package/.next/standalone/node_modules/next/dist/server/normalizers/built/app/index.js +42 -0
  901. package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/index.js +44 -0
  902. package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/pages-bundle-path-normalizer.js +55 -0
  903. package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/pages-filename-normalizer.js +22 -0
  904. package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/pages-page-normalizer.js +19 -0
  905. package/.next/standalone/node_modules/next/dist/server/normalizers/built/pages/pages-pathname-normalizer.js +19 -0
  906. package/.next/standalone/node_modules/next/dist/server/normalizers/locale-route-normalizer.js +26 -0
  907. package/.next/standalone/node_modules/next/dist/server/normalizers/normalizer.js +6 -0
  908. package/.next/standalone/node_modules/next/dist/server/normalizers/normalizers.js +23 -0
  909. package/.next/standalone/node_modules/next/dist/server/normalizers/prefixing-normalizer.js +26 -0
  910. package/.next/standalone/node_modules/next/dist/server/normalizers/request/base-path.js +25 -0
  911. package/.next/standalone/node_modules/next/dist/server/normalizers/request/next-data.js +38 -0
  912. package/.next/standalone/node_modules/next/dist/server/normalizers/request/pathname-normalizer.js +6 -0
  913. package/.next/standalone/node_modules/next/dist/server/normalizers/request/prefix.js +39 -0
  914. package/.next/standalone/node_modules/next/dist/server/normalizers/request/rsc.js +19 -0
  915. package/.next/standalone/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.js +33 -0
  916. package/.next/standalone/node_modules/next/dist/server/normalizers/request/suffix.js +27 -0
  917. package/.next/standalone/node_modules/next/dist/server/normalizers/underscore-normalizer.js +17 -0
  918. package/.next/standalone/node_modules/next/dist/server/normalizers/wrap-normalizer-fn.js +17 -0
  919. package/.next/standalone/node_modules/next/dist/server/og/image-response.js +53 -0
  920. package/.next/standalone/node_modules/next/dist/server/patch-error-inspect.js +453 -0
  921. package/.next/standalone/node_modules/next/dist/server/pipe-readable.js +140 -0
  922. package/.next/standalone/node_modules/next/dist/server/post-process.js +39 -0
  923. package/.next/standalone/node_modules/next/dist/server/render-result.js +204 -0
  924. package/.next/standalone/node_modules/next/dist/server/render.js +1140 -0
  925. package/.next/standalone/node_modules/next/dist/server/request/connection.js +133 -0
  926. package/.next/standalone/node_modules/next/dist/server/request/cookies.js +235 -0
  927. package/.next/standalone/node_modules/next/dist/server/request/draft-mode.js +230 -0
  928. package/.next/standalone/node_modules/next/dist/server/request/fallback-params.js +69 -0
  929. package/.next/standalone/node_modules/next/dist/server/request/headers.js +229 -0
  930. package/.next/standalone/node_modules/next/dist/server/request/params.js +527 -0
  931. package/.next/standalone/node_modules/next/dist/server/request/pathname.js +119 -0
  932. package/.next/standalone/node_modules/next/dist/server/request/root-params.js +194 -0
  933. package/.next/standalone/node_modules/next/dist/server/request/search-params.js +526 -0
  934. package/.next/standalone/node_modules/next/dist/server/request/utils.js +51 -0
  935. package/.next/standalone/node_modules/next/dist/server/request-meta.js +55 -0
  936. package/.next/standalone/node_modules/next/dist/server/require-hook.js +82 -0
  937. package/.next/standalone/node_modules/next/dist/server/require.js +109 -0
  938. package/.next/standalone/node_modules/next/dist/server/response-cache/index.js +311 -0
  939. package/.next/standalone/node_modules/next/dist/server/response-cache/types.js +41 -0
  940. package/.next/standalone/node_modules/next/dist/server/response-cache/utils.js +104 -0
  941. package/.next/standalone/node_modules/next/dist/server/response-cache/web.js +101 -0
  942. package/.next/standalone/node_modules/next/dist/server/resume-data-cache/cache-store.js +96 -0
  943. package/.next/standalone/node_modules/next/dist/server/resume-data-cache/resume-data-cache.js +124 -0
  944. package/.next/standalone/node_modules/next/dist/server/revalidation-utils.js +157 -0
  945. package/.next/standalone/node_modules/next/dist/server/route-definitions/app-page-route-definition.js +16 -0
  946. package/.next/standalone/node_modules/next/dist/server/route-definitions/app-route-route-definition.js +6 -0
  947. package/.next/standalone/node_modules/next/dist/server/route-definitions/locale-route-definition.js +6 -0
  948. package/.next/standalone/node_modules/next/dist/server/route-definitions/pages-api-route-definition.js +6 -0
  949. package/.next/standalone/node_modules/next/dist/server/route-definitions/pages-route-definition.js +6 -0
  950. package/.next/standalone/node_modules/next/dist/server/route-definitions/route-definition.js +6 -0
  951. package/.next/standalone/node_modules/next/dist/server/route-kind.js +32 -0
  952. package/.next/standalone/node_modules/next/dist/server/route-matcher-managers/default-route-matcher-manager.js +239 -0
  953. package/.next/standalone/node_modules/next/dist/server/route-matcher-managers/dev-route-matcher-manager.js +120 -0
  954. package/.next/standalone/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.js +6 -0
  955. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/app-page-route-matcher-provider.js +55 -0
  956. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/app-route-route-matcher-provider.js +43 -0
  957. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-app-page-route-matcher-provider.js +91 -0
  958. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-app-route-route-matcher-provider.js +112 -0
  959. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-pages-api-route-matcher-provider.js +77 -0
  960. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-pages-route-matcher-provider.js +77 -0
  961. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/file-cache-route-matcher-provider.js +28 -0
  962. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/batched-file-reader.js +106 -0
  963. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/default-file-reader.js +42 -0
  964. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/file-reader.js +6 -0
  965. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/helpers/cached-route-matcher-provider.js +30 -0
  966. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/manifest-loader.js +6 -0
  967. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/node-manifest-loader.js +34 -0
  968. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/server-manifest-loader.js +20 -0
  969. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/manifest-route-matcher-provider.js +21 -0
  970. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/pages-api-route-matcher-provider.js +55 -0
  971. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/pages-route-matcher-provider.js +64 -0
  972. package/.next/standalone/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.js +6 -0
  973. package/.next/standalone/node_modules/next/dist/server/route-matchers/app-page-route-matcher.js +18 -0
  974. package/.next/standalone/node_modules/next/dist/server/route-matchers/app-route-route-matcher.js +15 -0
  975. package/.next/standalone/node_modules/next/dist/server/route-matchers/locale-route-matcher.js +68 -0
  976. package/.next/standalone/node_modules/next/dist/server/route-matchers/pages-api-route-matcher.js +30 -0
  977. package/.next/standalone/node_modules/next/dist/server/route-matchers/pages-route-matcher.js +30 -0
  978. package/.next/standalone/node_modules/next/dist/server/route-matchers/route-matcher.js +54 -0
  979. package/.next/standalone/node_modules/next/dist/server/route-matches/app-page-route-match.js +6 -0
  980. package/.next/standalone/node_modules/next/dist/server/route-matches/app-route-route-match.js +6 -0
  981. package/.next/standalone/node_modules/next/dist/server/route-matches/locale-route-match.js +6 -0
  982. package/.next/standalone/node_modules/next/dist/server/route-matches/pages-api-route-match.js +16 -0
  983. package/.next/standalone/node_modules/next/dist/server/route-matches/pages-route-match.js +6 -0
  984. package/.next/standalone/node_modules/next/dist/server/route-matches/route-match.js +6 -0
  985. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/helpers/prerender-manifest-matcher.js +51 -0
  986. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/module.compiled.js +36 -0
  987. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/module.js +162 -0
  988. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/module.render.js +24 -0
  989. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/normalize-request-url.js +25 -0
  990. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/app-router-context.js +4 -0
  991. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.js +87 -0
  992. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/head-manager-context.js +4 -0
  993. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/hooks-client-context.js +4 -0
  994. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/image-config-context.js +4 -0
  995. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/router-context.js +4 -0
  996. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/server-inserted-html.js +4 -0
  997. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.js +140 -0
  998. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-compiler-runtime.js +4 -0
  999. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-dom.js +4 -0
  1000. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime.js +4 -0
  1001. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-runtime.js +4 -0
  1002. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server.js +4 -0
  1003. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-static.js +4 -0
  1004. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server.js +4 -0
  1005. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-static.js +4 -0
  1006. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react.js +4 -0
  1007. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.js +125 -0
  1008. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-compiler-runtime.js +4 -0
  1009. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-dom-server.js +4 -0
  1010. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-dom.js +4 -0
  1011. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js +4 -0
  1012. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js +4 -0
  1013. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client.js +4 -0
  1014. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client.js +4 -0
  1015. package/.next/standalone/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js +4 -0
  1016. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/auto-implement-methods.js +85 -0
  1017. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/clean-url.js +24 -0
  1018. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/get-pathname-from-absolute-path.js +29 -0
  1019. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/is-static-gen-enabled.js +15 -0
  1020. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/helpers/parsed-url-query-to-params.js +20 -0
  1021. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/module.compiled.js +36 -0
  1022. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/module.js +914 -0
  1023. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/shared-modules.js +56 -0
  1024. package/.next/standalone/node_modules/next/dist/server/route-modules/checks.js +45 -0
  1025. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/builtin/_error.js +100 -0
  1026. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/module.compiled.js +20 -0
  1027. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/module.js +92 -0
  1028. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/module.render.js +24 -0
  1029. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/pages-handler.js +545 -0
  1030. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/app-router-context.js +4 -0
  1031. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.js +102 -0
  1032. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/head-manager-context.js +4 -0
  1033. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/hooks-client-context.js +4 -0
  1034. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/html-context.js +4 -0
  1035. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/image-config-context.js +4 -0
  1036. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/loadable-context.js +4 -0
  1037. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/loadable.js +4 -0
  1038. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/router-context.js +4 -0
  1039. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/vendored/contexts/server-inserted-html.js +4 -0
  1040. package/.next/standalone/node_modules/next/dist/server/route-modules/pages-api/module.compiled.js +20 -0
  1041. package/.next/standalone/node_modules/next/dist/server/route-modules/pages-api/module.js +58 -0
  1042. package/.next/standalone/node_modules/next/dist/server/route-modules/route-module.js +650 -0
  1043. package/.next/standalone/node_modules/next/dist/server/runtime-reacts.external.js +46 -0
  1044. package/.next/standalone/node_modules/next/dist/server/send-payload.js +88 -0
  1045. package/.next/standalone/node_modules/next/dist/server/send-response.js +70 -0
  1046. package/.next/standalone/node_modules/next/dist/server/serve-static.js +66 -0
  1047. package/.next/standalone/node_modules/next/dist/server/server-route-utils.js +30 -0
  1048. package/.next/standalone/node_modules/next/dist/server/server-utils.js +323 -0
  1049. package/.next/standalone/node_modules/next/dist/server/setup-http-agent-env.js +31 -0
  1050. package/.next/standalone/node_modules/next/dist/server/stream-utils/encoded-tags.js +122 -0
  1051. package/.next/standalone/node_modules/next/dist/server/stream-utils/node-web-streams-helper.js +918 -0
  1052. package/.next/standalone/node_modules/next/dist/server/stream-utils/uint8array-helpers.js +74 -0
  1053. package/.next/standalone/node_modules/next/dist/server/typescript/constant.js +98 -0
  1054. package/.next/standalone/node_modules/next/dist/server/typescript/index.js +199 -0
  1055. package/.next/standalone/node_modules/next/dist/server/typescript/rules/client-boundary.js +97 -0
  1056. package/.next/standalone/node_modules/next/dist/server/typescript/rules/config.js +512 -0
  1057. package/.next/standalone/node_modules/next/dist/server/typescript/rules/entry.js +149 -0
  1058. package/.next/standalone/node_modules/next/dist/server/typescript/rules/error.js +38 -0
  1059. package/.next/standalone/node_modules/next/dist/server/typescript/rules/metadata.js +234 -0
  1060. package/.next/standalone/node_modules/next/dist/server/typescript/rules/server-boundary.js +115 -0
  1061. package/.next/standalone/node_modules/next/dist/server/typescript/rules/server.js +79 -0
  1062. package/.next/standalone/node_modules/next/dist/server/typescript/utils.js +212 -0
  1063. package/.next/standalone/node_modules/next/dist/server/use-cache/cache-life.js +163 -0
  1064. package/.next/standalone/node_modules/next/dist/server/use-cache/cache-tag.js +52 -0
  1065. package/.next/standalone/node_modules/next/dist/server/use-cache/constants.js +28 -0
  1066. package/.next/standalone/node_modules/next/dist/server/use-cache/handlers.js +121 -0
  1067. package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-errors.js +36 -0
  1068. package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1588 -0
  1069. package/.next/standalone/node_modules/next/dist/server/utils.js +73 -0
  1070. package/.next/standalone/node_modules/next/dist/server/web/adapter.js +392 -0
  1071. package/.next/standalone/node_modules/next/dist/server/web/edge-route-module-wrapper.js +123 -0
  1072. package/.next/standalone/node_modules/next/dist/server/web/error.js +54 -0
  1073. package/.next/standalone/node_modules/next/dist/server/web/exports/index.js +56 -0
  1074. package/.next/standalone/node_modules/next/dist/server/web/get-edge-preview-props.js +23 -0
  1075. package/.next/standalone/node_modules/next/dist/server/web/globals.js +128 -0
  1076. package/.next/standalone/node_modules/next/dist/server/web/http.js +39 -0
  1077. package/.next/standalone/node_modules/next/dist/server/web/internal-edge-wait-until.js +64 -0
  1078. package/.next/standalone/node_modules/next/dist/server/web/next-url.js +199 -0
  1079. package/.next/standalone/node_modules/next/dist/server/web/sandbox/context.js +462 -0
  1080. package/.next/standalone/node_modules/next/dist/server/web/sandbox/fetch-inline-assets.js +35 -0
  1081. package/.next/standalone/node_modules/next/dist/server/web/sandbox/index.js +28 -0
  1082. package/.next/standalone/node_modules/next/dist/server/web/sandbox/resource-managers.js +88 -0
  1083. package/.next/standalone/node_modules/next/dist/server/web/sandbox/sandbox.js +137 -0
  1084. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/headers.js +192 -0
  1085. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/next-request.js +142 -0
  1086. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/reflect.js +30 -0
  1087. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.js +211 -0
  1088. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/cookies.js +29 -0
  1089. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/fetch-event.js +98 -0
  1090. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/image-response.js +22 -0
  1091. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/request.js +99 -0
  1092. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/response.js +136 -0
  1093. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +214 -0
  1094. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +289 -0
  1095. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-no-store.js +51 -0
  1096. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/url-pattern.js +14 -0
  1097. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/user-agent.js +46 -0
  1098. package/.next/standalone/node_modules/next/dist/server/web/types.js +6 -0
  1099. package/.next/standalone/node_modules/next/dist/server/web/utils.js +151 -0
  1100. package/.next/standalone/node_modules/next/dist/server/web/web-on-close.js +87 -0
  1101. package/.next/standalone/node_modules/next/dist/shared/lib/action-revalidation-kind.js +31 -0
  1102. package/.next/standalone/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.js +50 -0
  1103. package/.next/standalone/node_modules/next/dist/shared/lib/app-router-types.js +46 -0
  1104. package/.next/standalone/node_modules/next/dist/shared/lib/constants.js +448 -0
  1105. package/.next/standalone/node_modules/next/dist/shared/lib/deep-freeze.js +30 -0
  1106. package/.next/standalone/node_modules/next/dist/shared/lib/deployment-id.js +63 -0
  1107. package/.next/standalone/node_modules/next/dist/shared/lib/dset.js +34 -0
  1108. package/.next/standalone/node_modules/next/dist/shared/lib/encode-uri-path.js +15 -0
  1109. package/.next/standalone/node_modules/next/dist/shared/lib/entry-constants.js +36 -0
  1110. package/.next/standalone/node_modules/next/dist/shared/lib/error-source.js +36 -0
  1111. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +39 -0
  1112. package/.next/standalone/node_modules/next/dist/shared/lib/errors/code-frame.js +20 -0
  1113. package/.next/standalone/node_modules/next/dist/shared/lib/errors/constants.js +19 -0
  1114. package/.next/standalone/node_modules/next/dist/shared/lib/errors/empty-generate-static-params-error.js +24 -0
  1115. package/.next/standalone/node_modules/next/dist/shared/lib/errors/hard-deprecated-config-error.js +20 -0
  1116. package/.next/standalone/node_modules/next/dist/shared/lib/escape-regexp.js +22 -0
  1117. package/.next/standalone/node_modules/next/dist/shared/lib/get-hostname.js +23 -0
  1118. package/.next/standalone/node_modules/next/dist/shared/lib/hash.js +42 -0
  1119. package/.next/standalone/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.js +18 -0
  1120. package/.next/standalone/node_modules/next/dist/shared/lib/head.js +163 -0
  1121. package/.next/standalone/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.js +60 -0
  1122. package/.next/standalone/node_modules/next/dist/shared/lib/html-context.shared-runtime.js +40 -0
  1123. package/.next/standalone/node_modules/next/dist/shared/lib/i18n/detect-domain-locale.js +25 -0
  1124. package/.next/standalone/node_modules/next/dist/shared/lib/i18n/get-locale-redirect.js +59 -0
  1125. package/.next/standalone/node_modules/next/dist/shared/lib/i18n/normalize-locale-path.js +54 -0
  1126. package/.next/standalone/node_modules/next/dist/shared/lib/image-blur-svg.js +22 -0
  1127. package/.next/standalone/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.js +19 -0
  1128. package/.next/standalone/node_modules/next/dist/shared/lib/image-config.js +77 -0
  1129. package/.next/standalone/node_modules/next/dist/shared/lib/invariant-error.js +18 -0
  1130. package/.next/standalone/node_modules/next/dist/shared/lib/is-plain-object.js +42 -0
  1131. package/.next/standalone/node_modules/next/dist/shared/lib/is-thenable.js +20 -0
  1132. package/.next/standalone/node_modules/next/dist/shared/lib/isomorphic/path.js +14 -0
  1133. package/.next/standalone/node_modules/next/dist/shared/lib/lazy-dynamic/bailout-to-csr.js +37 -0
  1134. package/.next/standalone/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.js +19 -0
  1135. package/.next/standalone/node_modules/next/dist/shared/lib/loadable.shared-runtime.js +246 -0
  1136. package/.next/standalone/node_modules/next/dist/shared/lib/match-local-pattern.js +46 -0
  1137. package/.next/standalone/node_modules/next/dist/shared/lib/match-remote-pattern.js +63 -0
  1138. package/.next/standalone/node_modules/next/dist/shared/lib/modern-browserslist-target.js +15 -0
  1139. package/.next/standalone/node_modules/next/dist/shared/lib/no-fallback-error.external.js +18 -0
  1140. package/.next/standalone/node_modules/next/dist/shared/lib/normalized-asset-prefix.js +28 -0
  1141. package/.next/standalone/node_modules/next/dist/shared/lib/page-path/absolute-path-to-page.js +26 -0
  1142. package/.next/standalone/node_modules/next/dist/shared/lib/page-path/denormalize-page-path.js +18 -0
  1143. package/.next/standalone/node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js +18 -0
  1144. package/.next/standalone/node_modules/next/dist/shared/lib/page-path/get-page-paths.js +40 -0
  1145. package/.next/standalone/node_modules/next/dist/shared/lib/page-path/normalize-data-path.js +23 -0
  1146. package/.next/standalone/node_modules/next/dist/shared/lib/page-path/normalize-page-path.js +26 -0
  1147. package/.next/standalone/node_modules/next/dist/shared/lib/page-path/normalize-path-sep.js +19 -0
  1148. package/.next/standalone/node_modules/next/dist/shared/lib/page-path/remove-page-path-tail.js +20 -0
  1149. package/.next/standalone/node_modules/next/dist/shared/lib/promise-with-resolvers.js +26 -0
  1150. package/.next/standalone/node_modules/next/dist/shared/lib/router/adapters.js +136 -0
  1151. package/.next/standalone/node_modules/next/dist/shared/lib/router/routes/app.js +122 -0
  1152. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-locale.js +28 -0
  1153. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-path-prefix.js +20 -0
  1154. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/add-path-suffix.js +20 -0
  1155. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/app-paths.js +62 -0
  1156. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/as-path-to-search-params.js +17 -0
  1157. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/cache-busting-search-param.js +24 -0
  1158. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/escape-path-delimiters.js +16 -0
  1159. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/format-next-pathname-info.js +27 -0
  1160. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/format-url.js +111 -0
  1161. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-dynamic-param.js +174 -0
  1162. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-next-pathname-info.js +52 -0
  1163. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-route-from-asset-path.js +25 -0
  1164. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/get-segment-param.js +90 -0
  1165. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/html-bots.js +17 -0
  1166. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/index.js +30 -0
  1167. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/interception-prefix-from-param-type.js +33 -0
  1168. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/interception-routes.js +108 -0
  1169. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/is-bot.js +57 -0
  1170. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/is-dynamic.js +26 -0
  1171. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.js +31 -0
  1172. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-loader-tree.js +30 -0
  1173. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-path.js +33 -0
  1174. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.js +43 -0
  1175. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/parse-url.js +38 -0
  1176. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/path-has-prefix.js +20 -0
  1177. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/path-match.js +49 -0
  1178. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/prepare-destination.js +292 -0
  1179. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/querystring.js +79 -0
  1180. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/relativize-url.js +40 -0
  1181. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/remove-path-prefix.js +39 -0
  1182. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/remove-trailing-slash.js +21 -0
  1183. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/resolve-param-value.js +116 -0
  1184. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/route-match-utils.js +113 -0
  1185. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/route-matcher.js +45 -0
  1186. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/route-regex.js +256 -0
  1187. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/sorted-routes.js +244 -0
  1188. package/.next/standalone/node_modules/next/dist/shared/lib/router-context.shared-runtime.js +18 -0
  1189. package/.next/standalone/node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.js +99 -0
  1190. package/.next/standalone/node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.js +32 -0
  1191. package/.next/standalone/node_modules/next/dist/shared/lib/segment.js +102 -0
  1192. package/.next/standalone/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.js +35 -0
  1193. package/.next/standalone/node_modules/next/dist/shared/lib/server-reference-info.js +56 -0
  1194. package/.next/standalone/node_modules/next/dist/shared/lib/side-effect.js +63 -0
  1195. package/.next/standalone/node_modules/next/dist/shared/lib/size-limit.js +40 -0
  1196. package/.next/standalone/node_modules/next/dist/shared/lib/turbopack/internal-error.js +53 -0
  1197. package/.next/standalone/node_modules/next/dist/shared/lib/utils/reflect-utils.js +69 -0
  1198. package/.next/standalone/node_modules/next/dist/shared/lib/utils/warn-once.js +22 -0
  1199. package/.next/standalone/node_modules/next/dist/shared/lib/utils.js +207 -0
  1200. package/.next/standalone/node_modules/next/dist/shared/lib/zod.js +101 -0
  1201. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +89 -0
  1202. package/.next/standalone/node_modules/next/dist/telemetry/detached-flush.js +56 -0
  1203. package/.next/standalone/node_modules/next/dist/telemetry/events/build.js +174 -0
  1204. package/.next/standalone/node_modules/next/dist/telemetry/events/index.js +41 -0
  1205. package/.next/standalone/node_modules/next/dist/telemetry/events/plugins.js +51 -0
  1206. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +55 -0
  1207. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +66 -0
  1208. package/.next/standalone/node_modules/next/dist/telemetry/flush-telemetry.js +19 -0
  1209. package/.next/standalone/node_modules/next/dist/telemetry/post-telemetry-payload.js +48 -0
  1210. package/.next/standalone/node_modules/next/dist/telemetry/project-id.js +48 -0
  1211. package/.next/standalone/node_modules/next/dist/telemetry/storage.js +301 -0
  1212. package/.next/standalone/node_modules/next/dist/trace/index.js +58 -0
  1213. package/.next/standalone/node_modules/next/dist/trace/report/index.js +37 -0
  1214. package/.next/standalone/node_modules/next/dist/trace/report/to-json-build.js +40 -0
  1215. package/.next/standalone/node_modules/next/dist/trace/report/to-json.js +165 -0
  1216. package/.next/standalone/node_modules/next/dist/trace/report/to-telemetry.js +36 -0
  1217. package/.next/standalone/node_modules/next/dist/trace/shared.js +39 -0
  1218. package/.next/standalone/node_modules/next/dist/trace/trace.js +211 -0
  1219. package/.next/standalone/node_modules/next/package.json +378 -0
  1220. package/.next/standalone/node_modules/react/cjs/react-compiler-runtime.production.js +16 -0
  1221. package/.next/standalone/node_modules/react/cjs/react-jsx-dev-runtime.production.js +14 -0
  1222. package/.next/standalone/node_modules/react/cjs/react-jsx-runtime.production.js +34 -0
  1223. package/.next/standalone/node_modules/react/cjs/react.development.js +1284 -0
  1224. package/.next/standalone/node_modules/react/cjs/react.production.js +542 -0
  1225. package/.next/standalone/node_modules/react/compiler-runtime.js +14 -0
  1226. package/.next/standalone/node_modules/react/index.js +7 -0
  1227. package/.next/standalone/node_modules/react/jsx-dev-runtime.js +7 -0
  1228. package/.next/standalone/node_modules/react/jsx-runtime.js +7 -0
  1229. package/.next/standalone/node_modules/react/package.json +51 -0
  1230. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +6603 -0
  1231. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +6692 -0
  1232. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +7410 -0
  1233. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +7512 -0
  1234. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +7707 -0
  1235. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +210 -0
  1236. package/.next/standalone/node_modules/react-dom/index.js +38 -0
  1237. package/.next/standalone/node_modules/react-dom/package.json +117 -0
  1238. package/.next/standalone/node_modules/react-dom/server.browser.js +16 -0
  1239. package/.next/standalone/node_modules/react-dom/server.edge.js +17 -0
  1240. package/.next/standalone/node_modules/react-dom/server.node.js +18 -0
  1241. package/.next/standalone/node_modules/react-dom/static.node.js +14 -0
  1242. package/.next/standalone/node_modules/sharp/lib/channel.js +177 -0
  1243. package/.next/standalone/node_modules/sharp/lib/colour.js +195 -0
  1244. package/.next/standalone/node_modules/sharp/lib/composite.js +212 -0
  1245. package/.next/standalone/node_modules/sharp/lib/constructor.js +499 -0
  1246. package/.next/standalone/node_modules/sharp/lib/index.js +16 -0
  1247. package/.next/standalone/node_modules/sharp/lib/input.js +809 -0
  1248. package/.next/standalone/node_modules/sharp/lib/is.js +143 -0
  1249. package/.next/standalone/node_modules/sharp/lib/libvips.js +207 -0
  1250. package/.next/standalone/node_modules/sharp/lib/operation.js +1016 -0
  1251. package/.next/standalone/node_modules/sharp/lib/output.js +1666 -0
  1252. package/.next/standalone/node_modules/sharp/lib/resize.js +595 -0
  1253. package/.next/standalone/node_modules/sharp/lib/sharp.js +121 -0
  1254. package/.next/standalone/node_modules/sharp/lib/utility.js +291 -0
  1255. package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +143 -0
  1256. package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +557 -0
  1257. package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +333 -0
  1258. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +54 -0
  1259. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +62 -0
  1260. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +7 -0
  1261. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +5 -0
  1262. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +5 -0
  1263. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +5 -0
  1264. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +5 -0
  1265. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +5 -0
  1266. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +5 -0
  1267. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +18 -0
  1268. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +12 -0
  1269. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +37 -0
  1270. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +11 -0
  1271. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +29 -0
  1272. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +42 -0
  1273. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +17 -0
  1274. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +223 -0
  1275. package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +78 -0
  1276. package/.next/standalone/node_modules/sharp/package.json +202 -0
  1277. package/.next/standalone/node_modules/styled-jsx/dist/index/index.js +499 -0
  1278. package/.next/standalone/node_modules/styled-jsx/index.js +1 -0
  1279. package/.next/standalone/node_modules/styled-jsx/package.json +132 -0
  1280. package/.next/standalone/node_modules/styled-jsx/style.js +1 -0
  1281. package/.next/standalone/package.json +55 -0
  1282. package/.next/standalone/server.js +38 -0
  1283. package/.next/static/BgLP6ChyOyE0k8Ahr8F2H/_buildManifest.js +11 -0
  1284. package/.next/static/BgLP6ChyOyE0k8Ahr8F2H/_clientMiddlewareManifest.js +1 -0
  1285. package/.next/static/BgLP6ChyOyE0k8Ahr8F2H/_ssgManifest.js +1 -0
  1286. package/.next/static/chunks/01xlw8hd842-c.js +1 -0
  1287. package/.next/static/chunks/03~yq9q893hmn.js +1 -0
  1288. package/.next/static/chunks/0bogtdbh.dcu1.js +1 -0
  1289. package/.next/static/chunks/0bzupvr5gt3k9.js +31 -0
  1290. package/.next/static/chunks/0d3shmwh5_nmn.js +1 -0
  1291. package/.next/static/chunks/0iym2_f33sxs7.css +4 -0
  1292. package/.next/static/chunks/0mmpyn9fv2fjf.js +2 -0
  1293. package/.next/static/chunks/0qmupjhwdppg9.js +11 -0
  1294. package/.next/static/chunks/0y3~cortx~or~.js +5 -0
  1295. package/.next/static/chunks/12p3iqtw2ohfq.js +1 -0
  1296. package/.next/static/chunks/turbopack-06dy8k5p5cegf.js +1 -0
  1297. package/.next/static/media/166ab60e98aadb0a-s.p.0mka4ru4_bj1d.woff2 +0 -0
  1298. package/.next/static/media/1bffadaabf893a1e-s.16ipb6fqu393i.woff2 +0 -0
  1299. package/.next/static/media/2bbe8d2671613f1f-s.067x_6k0k23tk.woff2 +0 -0
  1300. package/.next/static/media/2c55a0e60120577a-s.0bjc5tiuqdqro.woff2 +0 -0
  1301. package/.next/static/media/47fe59148dddec23-s.0miki_k4yhs4d.woff2 +0 -0
  1302. package/.next/static/media/4e86c6b06ecb547e-s.0w2c6_8~q7i1~.woff2 +0 -0
  1303. package/.next/static/media/4fa387ec64143e14-s.0q3udbd2bu5yp.woff2 +0 -0
  1304. package/.next/static/media/5476f68d60460930-s.0wxq9webf.ew4.woff2 +0 -0
  1305. package/.next/static/media/63599ae31785f475-s.01zyq0dc2~0hp.woff2 +0 -0
  1306. package/.next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2 +0 -0
  1307. package/.next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2 +0 -0
  1308. package/.next/static/media/8b19d8d892dc610b-s.0.m6yiwn-kka2.woff2 +0 -0
  1309. package/.next/static/media/9c72aa0f40e4eef8-s.0m6w47a4e5dy9.woff2 +0 -0
  1310. package/.next/static/media/ad66f9afd8947f86-s.11u06r12fd6v_.woff2 +0 -0
  1311. package/.next/static/media/bbc41e54d2fcbd21-s.0gw~uztddq1df.woff2 +0 -0
  1312. package/.next/static/media/c5ff0a46612d668f-s.0hhk-7qht1v87.woff2 +0 -0
  1313. package/.next/static/media/f10b37ddd5a9e949-s.15ktajnz8ofs..woff2 +0 -0
  1314. package/.next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
  1315. package/README.md +75 -0
  1316. package/bin/miclaw.mjs +99 -0
  1317. package/package.json +55 -0
  1318. package/public/file.svg +1 -0
  1319. package/public/globe.svg +1 -0
  1320. package/public/logo.png +0 -0
  1321. package/public/next.svg +1 -0
  1322. package/public/screenshot.png +0 -0
  1323. package/public/vercel.svg +1 -0
  1324. package/public/window.svg +1 -0
@@ -0,0 +1,2344 @@
1
+ 1:"$Sreact.fragment"
2
+ 2:I[22450,["/_next/static/chunks/0mmpyn9fv2fjf.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/12p3iqtw2ohfq.js"],"ExpandableBody"]
3
+ 16:I[97367,["/_next/static/chunks/0mmpyn9fv2fjf.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
4
+ 17:"$Sreact.suspense"
5
+ 3:T133b,# RULES
6
+
7
+ - Always use concise explanation
8
+ - Main languages are Python and TypeScript
9
+ - Never use emojis when writing code or markdown
10
+ - NEVER use non-standard symbols like "✓|✗|☐|○" when writing code or markdown
11
+ - Use parametrized tests whenever possible
12
+ - Listed below are a handful of different 'Workflow' guides. Adhere to them as best as possible
13
+ - 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.
14
+
15
+ ## REPOS
16
+
17
+ Before working in any repo, read its instruction file:
18
+
19
+ | Repo | Path | Instructions |
20
+ |------|------|--------------|
21
+ | platform-services | ~/Desktop/platform-services | AGENTS.md |
22
+ | infrastructure | ~/Desktop/infrastructure | CLAUDE.md |
23
+ | web-app | ~/Desktop/web-app | .clauderules |
24
+
25
+ When spawning subagents for a specific repo, include the instruction file path in the prompt.
26
+
27
+ ## Code Quality Standards
28
+
29
+ Code must be clean, readable, and maintainable. Hold yourself to extremely high standards:
30
+
31
+ - **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.
32
+ - **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.
33
+ - **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.
34
+ - **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.
35
+ - **Parametrized tests**: Combine similar test cases with different inputs into `@pytest.mark.parametrize` instead of copy-pasting test methods.
36
+ - **Extract repeated patterns**: If the same mock setup or helper logic appears 3+ times, extract it to a fixture or helper function.
37
+
38
+ ## Git Restrictions
39
+
40
+ Agents must NEVER run `git add` or `git commit` commands. The user will handle all git staging and commits manually.
41
+
42
+ ## PR Review Workflow (ps-copy)
43
+
44
+ There is a second copy of platform-services at `~/Desktop/ps-copy/platform-services` used for reviewing PRs.
45
+
46
+ When asked to "Review PR <number> in ps-copy":
47
+ 1. Navigate to `~/Desktop/ps-copy/platform-services`
48
+ 2. Checkout main branch: `git checkout main`
49
+ 3. Run `git fetch && git pull`
50
+ 4. Read in the repositories developmnet guide AGENTS.md file (FAIL IF YOU CANNOT FIND IT)
51
+ 5. Run the `/review` task for the specified PR
52
+ 6. DO NOT post an actual comment on the review. Just review locally.
53
+
54
+ ## Linear Ticket Workflow
55
+
56
+ - Ticket titles must be under 50 characters. Linear auto-generates branch names from titles, so short titles produce clean branch names.
57
+ - 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.
58
+
59
+ ## Cross-Repo Workflow
60
+
61
+ When working across multiple repos in a single task:
62
+ 1. Read all relevant instruction files first
63
+ 2. Follow each repo's conventions when modifying its code
64
+ 3. Coordinate changes that span repos (e.g., API changes in platform-services affecting web-app)
65
+
66
+ ## Querying Logs in Axiom Workflow
67
+
68
+ Querying Logs in Axiom
69
+
70
+ Logs 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**.
71
+
72
+ ### Key Fields
73
+
74
+ | Field | Description |
75
+ | ------- | ------------- |
76
+ | `_time` | Timestamp |
77
+ | `logGroup` | CloudWatch log group (e.g., `/aws/lambda/account-service`) |
78
+ | `message` | Log message |
79
+ | `levelname` | Log level (`INFO`, `ERROR`, etc.) |
80
+ | `service` | Service name |
81
+ | `correlationId` | UUID for tracing requests across services |
82
+ | `accountId`, `userId`, `patientId` | Entity identifiers |
83
+ | `path`, `method`, `statusCode`, `took` | HTTP request details |
84
+ | `errorMessage`, `errorType` | Error details |
85
+ | `data` | Object containing extra fields not in the standard set |
86
+
87
+ ### Example Queries
88
+
89
+ ```apl
90
+ // Errors in a service
91
+ ['bioscope-dev']
92
+ | where levelname == "ERROR" and logGroup == "/aws/lambda/account-service"
93
+
94
+ // Trace a request across services
95
+ ['bioscope-dev']
96
+ | where correlationId == "550e8400-e29b-41d4-a716-446655440000"
97
+ | order by _time asc
98
+
99
+ // Slow requests
100
+ ['bioscope-dev']
101
+ | where took > 1000
102
+ | project _time, service, path, took
103
+
104
+ // Error counts by service (last hour)
105
+ ['bioscope-dev']
106
+ | where _time > ago(1h) and levelname == "ERROR"
107
+ | summarize count() by logGroup0:{"rsc":["$","$1","c",{"children":[["$","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"}]]}],["$","$L2",null,{"content":"$3","previewLines":8}]]}]]}]]}],"$L4","$L5","$L6","$L7","$L8"],false]}],["$L9"],"$La"]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"BgLP6ChyOyE0k8Ahr8F2H"}
108
+ b:Tcb1,# Bioscope Bioinformatics 2026 Roadmap
109
+
110
+ ## Project Overview
111
+ Interactive roadmap visualization tool for Bioscope Bioinformatics' 2026 strategic planning. Single-page web app with a Node.js backend for data persistence.
112
+
113
+ ## Files
114
+
115
+ | File | Purpose |
116
+ |------|---------|
117
+ | `roadmap.html` | Main application - all HTML, CSS, and JavaScript in one file |
118
+ | `roadmap-data.json` | Data storage - umbrellas, projects, subtasks, timelines |
119
+ | `server.js` | Node.js server (port 3000) - serves HTML and handles JSON read/write |
120
+
121
+ ## How to Run
122
+ ```bash
123
+ cd /Users/gabry/Desktop/ROADMAP_2026
124
+ node server.js
125
+ # Open http://localhost:3000
126
+ ```
127
+
128
+ ## Data Model
129
+
130
+ ```json
131
+ {
132
+ "umbrellas": [
133
+ {
134
+ "id": "wgs",
135
+ "title": "WGS (Whole Genome Sequencing)",
136
+ "icon": "🧬",
137
+ "projects": [
138
+ {
139
+ "id": 1,
140
+ "title": "Project Name",
141
+ "monthStart": 0, // 0-11 (Jan-Dec), null = TBD
142
+ "monthEnd": 2, // 0-11 (Jan-Dec), null = TBD
143
+ "subtasks": [
144
+ { "id": 101, "text": "Task description", "note": "Optional note" }
145
+ ]
146
+ }
147
+ ]
148
+ }
149
+ ]
150
+ }
151
+ ```
152
+
153
+ ### Umbrella Categories
154
+ - `wgs` - WGS (Whole Genome Sequencing) 🧬
155
+ - `microbiome` - Microbiome 🦠
156
+ - `omics` - Other Omics & Tooling 🔬
157
+
158
+ ## Key Features Implemented
159
+
160
+ ### Two Views
161
+ 1. **Projects View** - Expandable umbrella tiles with two-column layout (projects list | tasks panel)
162
+ 2. **Timeline View** - Gantt-style visualization across 12 months with Q1-Q4 labels
163
+
164
+ ### Timeline Interactions
165
+ - **Drag rows** to reorder projects within an umbrella
166
+ - **Drag rows between umbrellas** to move projects to different categories
167
+ - **Drag timeline bars** left/right to move project timing
168
+ - **Drag bar edges** (resize handles) to expand/shrink duration
169
+ - **Tooltip** shows month range while dragging (e.g., "April - September")
170
+ - **TBD projects** shown as dashed badge - click to set timeline
171
+
172
+ ### Edit Functionality
173
+ - Edit button on each project (both views)
174
+ - Modal with title and month range (January-December dropdowns)
175
+ - Delete project option
176
+
177
+ ### Data Persistence
178
+ - **Save button** - POST to `/api/data` writes to `roadmap-data.json`
179
+ - **Export button** - Downloads JSON file
180
+ - LocalStorage used for UI state (expanded umbrellas, selected projects)
181
+
182
+ ## Technical Notes
183
+
184
+ ### Month-Based Timeline
185
+ Changed from quarter-based (Q1-Q4) to month-based (0-11) for finer control:
186
+ - `monthStart: 0` = January
187
+ - `monthEnd: 11` = December
188
+ - `null` values = TBD (unscheduled)
189
+
190
+ ### CSS Variables (theming)
191
+ ```css
192
+ --wgs-color: #3b82f6 /* Blue */
193
+ --microbiome-color: #10b981 /* Green */
194
+ --omics-color: #8b5cf6 /* Purple */
195
+ ```
196
+
197
+ ### Key JavaScript Functions
198
+ - `renderProjectsView()` - Renders umbrella tiles
199
+ - `renderTimeline()` - Renders Gantt chart
200
+ - `initTimelineDragDrop()` - Row drag/drop between umbrellas
201
+ - `initBarDragResize()` - Timeline bar drag/resize
202
+ - `saveToServer()` - POST data to server
203
+ - `loadFromServer()` - GET data from server
204
+
205
+ ## Potential Future Enhancements
206
+ - Progress tracking (checkboxes were removed but could be re-added)
207
+ - Dependencies between projects (arrows/lines)
208
+ - Multiple years view
209
+ - Team/owner assignment
210
+ - Color customization per project
211
+ - Export to PDF/image
212
+ - Milestones/markers on timeline4:["$","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"}]]}],["$","$L2",null,{"content":"$b","previewLines":8}]]}]]}]]}]
213
+ c:Tfec,# Repository Standards
214
+
215
+ ## CRITICAL SAFETY RULES
216
+
217
+ **NEVER RUN APPLIES**
218
+ Claude can ONLY run the following commands. All apply operations must be performed by humans.
219
+
220
+ ```bash
221
+ # Allowed
222
+ tofu validate
223
+ tofu fmt
224
+ tofu fmt -check -diff -recursive
225
+ tofu init
226
+
227
+ # NEVER run
228
+ tofu apply
229
+ tofu destroy
230
+ ```
231
+
232
+ For the commands that are allowed, you can and should `cd` into the appropriate stack or module directory and run the command.
233
+
234
+ ## Repository Structure
235
+
236
+ - `stacks/` - Environment-specific configurations with separate state management
237
+ - `modules/` - Reusable OpenTofu modules (some modules may also call other modules)
238
+
239
+ ## Code Standards
240
+
241
+ ### Main Files
242
+
243
+ All resources must be in modules, never in a main.tf under the `stacks/` directory. The main.tf should only call other modules.
244
+
245
+ ### Module Standards
246
+
247
+ - Each resource type goes in an appropriately named *.tf file (IAM resources in iam.tf, etc.)
248
+ - 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.
249
+ - Every module must include a README.md that provides an overview of what the module provisions and any gotchas
250
+ - 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
251
+
252
+ ### General Conventions
253
+
254
+ - Use consistent naming: `{service_name}_{resource_type}`
255
+ - Never hardcode secrets or credentials
256
+
257
+ ## Web Search
258
+
259
+ Since 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.
260
+
261
+ ## GitHub Actions
262
+
263
+ All 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.
264
+
265
+ ```yaml
266
+ # Good
267
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
268
+
269
+ # Bad
270
+ - uses: actions/checkout@v4
271
+ ```
272
+
273
+ Internal `bioscope-ai/ci` actions must also be pinned to commit SHAs with `# main` as a comment.
274
+
275
+ ## Pull Request Guidelines
276
+
277
+ ### Cross-Repo Dependency Ordering
278
+
279
+ `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:
280
+
281
+ - 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.
282
+ - 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.
283
+
284
+ ### Code Standards in Reviews
285
+
286
+ When 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.5:["$","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"}]]}],["$","$L2",null,{"content":"$c","previewLines":8}]]}],"$Ld"]}]]}]
287
+ e:T838e,# Platform Services Development Guide
288
+
289
+ 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.
290
+
291
+ ## Project Structure
292
+
293
+ This is a monorepo containing multiple Python packages that follow consistent patterns and conventions.
294
+
295
+ ## Account Types
296
+
297
+ There are two account types, stored as `account_type` in the `accounts` DynamoDB table:
298
+
299
+ - **`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.
300
+ - **`practice`** — A practice with one or more physicians and potentially many patients. Has two billing models:
301
+ - **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.
302
+ - **Standard** — physician self-signs up, billing is per-patient via yearly subscriptions tracked in the `patient-entitlements` table.
303
+
304
+ For 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).
305
+
306
+ ## GitHub Actions
307
+
308
+ All 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.
309
+
310
+ ```yaml
311
+ # Good
312
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
313
+
314
+ # Bad
315
+ - uses: actions/checkout@v4
316
+ ```
317
+
318
+ Internal `bioscope-ai/ci` actions must also be pinned to commit SHAs with `# main` as a comment.
319
+
320
+ ## Dockerfile Dependency Installation
321
+
322
+ All 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.
323
+
324
+ ### Standard pattern (uv-based images)
325
+
326
+ For Dockerfiles that use uv and target the project's Python version:
327
+
328
+ ```dockerfile
329
+ # Export lockfile-pinned dependencies and install without resolution
330
+ RUN uv export --frozen --no-dev --no-editable --package <package-name> -o /tmp/requirements.txt && \
331
+ uv pip install --system --no-deps -r /tmp/requirements.txt
332
+ ```
333
+
334
+ This 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.
335
+
336
+ ### Non-uv base images (e.g., mriqc, fastsurfer)
337
+
338
+ For 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:
339
+
340
+ ```dockerfile
341
+ FROM <base-image>
342
+ USER root
343
+ WORKDIR /app
344
+
345
+ RUN pip install --no-cache-dir "uv>=0.10.0,<0.11.0"
346
+
347
+ COPY pyproject.toml uv.lock ./
348
+ COPY packages/<workspace-deps>/ ./packages/<workspace-deps>/
349
+
350
+ # Install Python under /app so non-root users can access it
351
+ ARG PYTHON_VERSION
352
+ ENV UV_PYTHON_INSTALL_DIR=/app/.python
353
+ RUN uv sync --frozen --no-dev --python ${PYTHON_VERSION} --package <package-name>
354
+
355
+ ENTRYPOINT ["/app/.venv/bin/python", "-m", "<package_module>.main"]
356
+ ```
357
+
358
+ ### Non-workspace dependencies
359
+
360
+ Any `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 <package>` is not allowed.
361
+
362
+ ## Pull Request Guidelines
363
+
364
+ ### Cross-Repo Dependency Ordering
365
+
366
+ `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:
367
+
368
+ If 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.
369
+
370
+ ### Dependency Pinning
371
+
372
+ All external package dependencies must use the compatible release operator (`~=`). Do not use `>=` as it leaves the version unbounded. Exact pins (`==`) are acceptable when a package requires a specific version.
373
+
374
+ ### Code Standards
375
+
376
+ When 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.
377
+
378
+ It 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.
379
+
380
+ For 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.
381
+
382
+ ### IDOR Prevention
383
+
384
+ When reviewing route handlers, watch for authorization gaps that could allow users to access or modify resources belonging to other accounts/patients:
385
+
386
+ - **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.
387
+ - **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.
388
+ - **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`.
389
+ - **List/query endpoints**: Queries that return collections must scope by `account_id` (or `patient_id` where applicable) to prevent cross-account data leakage.
390
+ - **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.
391
+
392
+ ### Billing Enforcement
393
+
394
+ Any 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`:
395
+
396
+ - **`ensure_patient_billing_access_from_path`**: Use when `patient_id` is a path parameter. Add as a `Depends()` dependency on the route.
397
+ - **`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.
398
+
399
+ Both 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.
400
+
401
+ ## Commands
402
+
403
+ Nx commands are run with:
404
+
405
+ ```bash
406
+ pnpm exec nx run <package-name>:<command>
407
+ ```
408
+
409
+ For example, to run tests for the `dynamodb-helper` package:
410
+
411
+ ```bash
412
+ pnpm exec nx run dynamodb-helper:test
413
+ ```
414
+
415
+ Available commands are defined in `nx.json` at the root and in each package's `project.json` file.
416
+
417
+ ### Formatting, Linting, and Type Checking
418
+
419
+ For 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:
420
+
421
+ ```bash
422
+ pnpm exec nx run <package-name>:format
423
+ pnpm exec nx run <package-name>:lint
424
+ pnpm exec nx run <package-name>:type-check
425
+ ```
426
+
427
+ **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.
428
+
429
+ ## Types
430
+
431
+ This repo makes heavy use of Pydantic V2 models. Shared models are typically defined in the `bioscope-types` package.
432
+
433
+ We have a `BioscopeBaseModel` class that is a subclass of `BaseModel` that adds some additional functionality, mostly adding camelCase aliases to the fields.
434
+ In our code, we use snake_case for everything, but anything leaving or entering Python should be camelCase, for example:
435
+
436
+ - Network requests and responses
437
+ - Database rows
438
+ - Logging statements
439
+
440
+ The shared `BioscopeBaseModel` automatically takes care of this for us.
441
+
442
+ ## FastAPI Routes (`packages/**/src/**/routes/**.py`)
443
+
444
+ ### Basic Conventions
445
+
446
+ - Route functions should be async
447
+ - Router should have a common prefix per file
448
+ - Follow standard REST conventions
449
+
450
+ ### Headers and Authentication
451
+
452
+ These routes are configured with an AWS API Gateway. Most routes are secured with a custom lambda authorizer.
453
+
454
+ This authorizer validates the Bearer JWT token and extracts the user ID from the token.
455
+ Requests come in with a `Bioscope-Account-Id` header that contains the account ID.
456
+ The authorizer ensures that the user in the JWT belongs to the account.
457
+ This means that these headers are "safe" and guaranteed to be valid for the calling user.
458
+
459
+ Therefore, authorization (i.e. to prevent IDOR, etc.) should be done via these headers.
460
+
461
+ These headers can be injected into the route function as dependencies using the `BioscopeUserIdHeaderDeps` and `BioscopeAccountIdHeaderDeps` classes.
462
+
463
+ ### Models
464
+
465
+ Request and response models should both be Pydantic models that inherit `BioscopeBaseModel`.
466
+ `BioscopeBaseModel` automatically handles camelCase to snake_case conversion for all fields.
467
+
468
+ ### Logging
469
+
470
+ Routes should use the `BioscopeLoggerDeps` class to inject the logger into the route function.
471
+ This logger is automatically configured to include the user ID and account ID in the log messages.
472
+
473
+ #### PII/PHI Logging Rules
474
+
475
+ **Fields that must NEVER be logged:**
476
+
477
+ - Patient names, emails, phone numbers, addresses, dates of birth
478
+ - Medical data (diagnoses, medications, lab results, clinical notes)
479
+ - Full request/response bodies from external APIs (FHIR, EHR, lab vendors, etc.)
480
+ - Webhook payloads (these often contain patient data or credentials)
481
+ - Secrets, tokens, API keys, credentials — omit these entirely (no length hints either)
482
+ - Template parameters that contain patient-facing content (e.g., SMS/email body text)
483
+
484
+ **Safe fields that CAN be logged:**
485
+
486
+ - Internal UUIDs: `patient_id`, `account_id`, `user_id`, `order_id`, `connection_id`, `correlation_id`
487
+ - Status codes, HTTP methods, URL paths
488
+ - Counts and lengths (e.g., number of records processed, response body length)
489
+ - Template/event names, enum values, operation names
490
+ - Durations, timestamps, retry counts
491
+
492
+ **Redaction pattern** — when context about a sensitive value is needed for debugging, log a length hint instead of the value:
493
+
494
+ ```python
495
+ # Good — log a length hint for debugging without exposing the value
496
+ logger.info("received webhook", extra={"bodyLength": len(body)})
497
+
498
+ # Good — log only safe identifiers
499
+ logger.info("processing patient", extra={"patientId": patient_id, "accountId": account_id})
500
+
501
+ # Bad — logs the entire webhook/response body (may contain PII/PHI)
502
+ logger.info("received webhook", extra={"body": body})
503
+ logger.info("API response", extra={"response": response.json()})
504
+ ```
505
+
506
+ **Never log full request/response bodies** — log the status code and body length instead:
507
+
508
+ ```python
509
+ # Good
510
+ logger.info("FHIR response", extra={"statusCode": response.status_code, "bodyLength": len(response.content)})
511
+
512
+ # Bad
513
+ logger.info("FHIR response", extra={"body": response.json()})
514
+ ```
515
+
516
+ **Exception messages** — do not embed API response text in exception messages, as these end up in logs via `logger.exception`:
517
+
518
+ ```python
519
+ # Good
520
+ raise ValueError(f"EHR API returned {response.status_code}")
521
+
522
+ # Bad — response body may contain PHI
523
+ raise ValueError(f"EHR API error: {response.text}")
524
+ ```
525
+
526
+ #### Formatting
527
+
528
+ Do 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).
529
+
530
+ ```python
531
+ # Good
532
+ extra={"metric": usage_metric.model_dump()}
533
+
534
+ # Bad
535
+ extra={"metric": usage_metric.model_dump_json()}
536
+ extra={"metric": json.dumps(usage_metric.model_dump())}
537
+ ```
538
+
539
+ ### HTTP Client
540
+
541
+ `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`.
542
+
543
+ When testing code that uses `httpx`, use `respx` for mocking. Use the **pytest fixture pattern for this**.
544
+
545
+ ### Relative Versus Absolute Imports
546
+
547
+ Production code should always use absolute imports. For example:
548
+
549
+ ```python
550
+ from account_service.models import Account # GOOD
551
+ from .models import Account # BAD
552
+ ```
553
+
554
+ However, 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:
555
+
556
+ ```python
557
+ from .conftest import build_data # GOOD
558
+ from tests.conftest import build_data # BAD
559
+ ```
560
+
561
+ ### Error Handling
562
+
563
+ Raise `HTTPException` with appropriate status code and detail message
564
+
565
+ ## Lambda Handlers (`packages/**/handler.py`)
566
+
567
+ ### Handler Types
568
+
569
+ 1. **LambdaHandler** - base handler for non-API Gateway functions
570
+ 2. **HttpHandler** - extends LambdaHandler with API Gateway support (requires `lambda-handler[api]`)
571
+
572
+ ### Lazy Loading Pattern
573
+
574
+ Many 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.
575
+
576
+ **Solution**: Use lazy loading in `handler.py` files only. Load direct invocation handling code only when needed, and vice versa for API Gateway routes.
577
+
578
+ **Example**:
579
+
580
+ ```python
581
+ from lambda_handler.http_handler import HttpHandler
582
+
583
+ def get_app():
584
+ from my_service.app import app # noqa: PLC0415
585
+ return app
586
+
587
+ handler = HttpHandler(get_app)
588
+
589
+ @handler.direct_invocation()
590
+ def handle_direct_invocation(event: DirectInvocationEvent, logger: BioscopeLogger):
591
+ from my_service.handlers.handler_one import handle_handler_one # noqa: PLC0415
592
+ return handle_handler_one(event, logger)
593
+ ```
594
+
595
+ **Important**:
596
+
597
+ - Restrict lazy imports to `handler.py` only
598
+ - Keep common imports (logger, types, handler framework) at module level
599
+ - Use `# noqa: PLC0415` to suppress linting warnings
600
+ - Never lazy load in business logic or service modules
601
+
602
+ ### Decorators
603
+
604
+ | Event Source | Decorator | Required kwarg | Notes |
605
+ | ----------------- | ---------------------------- | ---------------------- | ---------------------------------------- |
606
+ | SQS | `@handler.sqs` | `queue_name="<queue>"` | |
607
+ | SNS | `@handler.sns` | `topic_name="<topic>"` | |
608
+ | Direct Invocation | `@handler.direct_invocation` | N/A | Operation extracted from request model |
609
+ | Event Bridge | `@handler.event_bridge` | N/A | Handles all EventBridge events |
610
+ | API Gateway Auth | `@handler.authorizer` | N/A | For custom API Gateway authorizers |
611
+ | Health Check | `@handler.health_check` | N/A | Custom health check (built-in available) |
612
+
613
+ **Notes**:
614
+
615
+ - EventBridge and authorizer handlers do not use operation discriminators - they handle all events of their type sent to the function.
616
+ - Direct invocation handlers automatically extract the `operation` from the request model's `operation` class attribute.
617
+ - A built-in health check handler is automatically registered for all Lambda functions and responds to `{"operation": "healthCheck"}` requests.
618
+
619
+ ### Message Payloads
620
+
621
+ • Define a Pydantic model that **inherits `BioscopeBaseModel`** for every distinct message body.
622
+ • Models should be defined in the `bioscope_types` package under the `services` module.
623
+
624
+ Always annotate the first parameter with the corresponding event model from `lambda_handler.models`, e.g. `SqsEvent[MyMessage]`.
625
+ `MyMessage` should be a new Pydantic model that inherits `BioscopeBaseModel`.
626
+ `BioscopeBaseModel` automatically handles camelCase to snake_case conversion for all fields.
627
+
628
+ ### Dependency Injection
629
+
630
+ Handler functions may declare these optional parameters which will be injected automatically:
631
+
632
+ - `logger: BioscopeLogger` - the project-wide structured logger.
633
+ - `context: LambdaContext` - the AWS Lambda context object.
634
+
635
+ ### Example (SQS)
636
+
637
+ ```python
638
+ from lambda_handler.handler import LambdaHandler
639
+ from lambda_handler.models.sqs import SqsEvent
640
+ from bioscope_types.common import BioscopeBaseModel
641
+
642
+ handler = LambdaHandler()
643
+
644
+ class MySqsMessage(BioscopeBaseModel):
645
+ my_custom_field: str
646
+
647
+ @handler.sqs(queue_name="my-queue")
648
+ def handle_sqs_event(event: SqsEvent[MySqsMessage], logger, context):
649
+ logger.info("processing message", extra={"myCustomField": event.body.my_custom_field})
650
+ ```
651
+
652
+ ### Style Rules
653
+
654
+ - Use **explicit type annotations** everywhere.
655
+ - Keep handler bodies minimal; delegate business logic to service modules.
656
+ - Use the provided `logger`, not `print`, for output.
657
+ - 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.
658
+
659
+ ### Handler Organization (`packages/**/src/**/handlers/**/*.py`)
660
+
661
+ For services with many direct invocation handlers, organize them in a dedicated `handlers` directory rather than implementing the business logic directly in `handler.py`.
662
+
663
+ ### Structure
664
+
665
+ ```text
666
+ src/
667
+ service_name/
668
+ handler.py # Contains @handler.direct_invocation decorators
669
+ handlers/
670
+ __init__.py # Exports all handler functions
671
+ handler_one.py # Individual handler implementation
672
+ handler_two.py # Individual handler implementation
673
+ ```
674
+
675
+ ### Handler Function Signature
676
+
677
+ Handler functions should follow this standardized signature:
678
+
679
+ ```python
680
+ async def handle_operation_name(
681
+ args: OperationArgs,
682
+ logger: BioscopeLogger,
683
+ ) -> OperationResponse:
684
+ # Implementation here
685
+ ```
686
+
687
+ Where:
688
+
689
+ - `args` is the operation's arguments model from `bioscope_types.services`
690
+ - `logger` is the structured logger instance
691
+ - Return type matches the operation's response model
692
+
693
+ ### Main Handler File
694
+
695
+ The main `handler.py` file should delegate to the individual handlers:
696
+
697
+ ```python
698
+ from service_name.handlers import handle_operation_name
699
+
700
+ @handler.direct_invocation()
701
+ async def operation_name_handler(
702
+ event: OperationRequest, parent_logger: BioscopeLogger
703
+ ) -> OperationResponse:
704
+ return await handle_operation_name(
705
+ args=event.args,
706
+ logger=parent_logger.child(
707
+ {
708
+ # Add relevant fields from event.args (in camelCase and avoiding PHI/PII)
709
+ }
710
+ ),
711
+ )
712
+ ```
713
+
714
+ ## AWS Services (`packages/**/src/**/aws.py`)
715
+
716
+ **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`).
717
+
718
+ ### AWS Abstraction Pattern
719
+
720
+ Create `src/package_name/aws.py`:
721
+
722
+ ```python
723
+ from contextlib import asynccontextmanager
724
+ from aioboto3 import Session
725
+
726
+ session = Session()
727
+
728
+ @asynccontextmanager
729
+ async def get_service_name():
730
+ async with session.client("service-name") as client:
731
+ yield client
732
+ ```
733
+
734
+ ### Usage in Production Code
735
+
736
+ ```python
737
+ from package_name.aws import get_service_name
738
+
739
+ async def some_operation() -> None:
740
+ async with get_service_name() as client:
741
+ await client.some_api_call()
742
+ ```
743
+
744
+ ## Testing (`packages/**/tests/**/*.py`)
745
+
746
+ ### Basic Rules
747
+
748
+ - Prefer **pytest** for all unit tests.
749
+ - 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.
750
+ - Tests are all run with `asyncio_mode = "auto"` in `pyproject.toml`, so tests don't need to be marked as async individually.
751
+ - **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)
752
+ - Use pytest fixtures for both mocking and for defining common test data.
753
+ - 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.
754
+ - 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.
755
+
756
+ ### Test Structure
757
+
758
+ - Mirror source code structure in test organization
759
+ - Individual classes for each function being tested
760
+ - Individual methods for each test case
761
+
762
+ Example:
763
+
764
+ ```python
765
+ class TestCopyS3ToTemp:
766
+ def test_happy_path(self):
767
+ pass
768
+
769
+ def test_invalid_url_format(self):
770
+ pass
771
+
772
+ def test_s3_error(self):
773
+ pass
774
+ ```
775
+
776
+ ### Assertions
777
+
778
+ When performing assertions on data, compare the entire object as much as possible rather than individual assertions for each field.
779
+
780
+ For example, instead of:
781
+
782
+ ```python
783
+ assert result is not None
784
+ assert len(result) == 1
785
+ assert result[0].id == "123"
786
+ assert result[0].name == "John Doe"
787
+ assert result[0].email == "john.doe@example.com"
788
+ ```
789
+
790
+ you should do:
791
+
792
+ ```python
793
+ assert result == [User(
794
+ id="123",
795
+ name="John Doe",
796
+ email="john.doe@example.com"
797
+ )]
798
+ ```
799
+
800
+ When 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.
801
+ For example, instead of:
802
+
803
+ ```python
804
+ assert mock_foo.call_args.args == ("123", "John Doe", "john.doe@example.com")
805
+ ```
806
+
807
+ you should do:
808
+
809
+ ```python
810
+ mock_foo.assert_called_once_with("123", "John Doe", "john.doe@example.com")
811
+ ```
812
+
813
+ ### Async vs Sync Assertions
814
+
815
+ **IMPORTANT**: For async functions (using `AsyncMock`), use `assert_awaited...` methods:
816
+
817
+ - `assert_awaited_once()` instead of `assert_called_once()`
818
+ - `assert_awaited_once_with(args)` instead of `assert_called_once_with(args)`
819
+ - `assert_not_awaited()` instead of `assert_not_called()`
820
+
821
+ For sync functions (using `MagicMock`), use `assert_called...` methods:
822
+
823
+ - `assert_called_once()`
824
+ - `assert_called_once_with(args)`
825
+ - `assert_not_called()`
826
+
827
+ ### Positive and Negative Assertions
828
+
829
+ Always include both positive assertions (what should happen) and negative assertions (what should NOT happen) to ensure functions aren't being called unexpectedly.
830
+
831
+ ### Mocking
832
+
833
+ As 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.
834
+
835
+ Mocks 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.
836
+
837
+ #### Mock Fixture Naming
838
+
839
+ Mock fixtures should be named `mock_<function_name>`, matching the function being patched. For example:
840
+
841
+ ```python
842
+ # Patching ensure_account_has_stripe_customer_id
843
+ @pytest.fixture
844
+ def mock_ensure_account_has_stripe_customer_id(mocker: MockerFixture) -> AsyncMock:
845
+ return mocker.patch("some_service.module.ensure_account_has_stripe_customer_id")
846
+
847
+ # Patching invoke_lambda
848
+ @pytest.fixture
849
+ def mock_invoke_lambda(mocker: MockerFixture) -> AsyncMock:
850
+ return mocker.patch("lambda_client.client.invoke_lambda")
851
+ ```
852
+
853
+ **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_<module_name>_<function_name>`.
854
+
855
+ ```python
856
+ # Two different get_by_id functions — module prefix disambiguates
857
+ @pytest.fixture
858
+ def mock_accounts_get_by_id(mocker: MockerFixture) -> AsyncMock:
859
+ return mocker.patch("dynamodb_helper.models.accounts.get_by_id")
860
+
861
+ @pytest.fixture
862
+ def mock_patients_get_by_id(mocker: MockerFixture) -> AsyncMock:
863
+ return mocker.patch("dynamodb_helper.models.patients.get_by_id")
864
+ ```
865
+
866
+ #### Mock Fixture Placement
867
+
868
+ Mock 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`.
869
+
870
+ #### AWS Service Mocking
871
+
872
+ When testing code that uses AWS services, follow this pattern (see [AWS Services](#aws-services-packagessrcawspy) section for the production abstraction):
873
+
874
+ **Create AWS abstraction** (`src/package_name/aws.py`):
875
+
876
+ ```python
877
+ from contextlib import asynccontextmanager
878
+ from aioboto3 import Session
879
+
880
+ session = Session()
881
+
882
+ @asynccontextmanager
883
+ async def get_s3():
884
+ async with session.client("s3") as s3_client:
885
+ yield s3_client
886
+ ```
887
+
888
+ **Use abstraction in production code**:
889
+
890
+ ```python
891
+ from package_name.aws import get_s3
892
+
893
+ async def upload_file(bucket: str, key: str, content: bytes) -> None:
894
+ async with get_s3() as s3:
895
+ await s3.put_object(Bucket=bucket, Key=key, Body=content)
896
+ ```
897
+
898
+ **Test with botocore stubber**:
899
+
900
+ ```python
901
+ from collections.abc import AsyncGenerator
902
+ from contextlib import asynccontextmanager
903
+ import pytest
904
+ from aioboto3 import Session
905
+ from botocore.stub import Stubber
906
+ from pytest_mock import MockerFixture, MockType
907
+
908
+ @pytest.fixture(autouse=True)
909
+ def fake_aws_env(monkeypatch: pytest.MonkeyPatch) -> None:
910
+ monkeypatch.setenv("AWS_ACCESS_KEY_ID", "testing")
911
+ monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "testing")
912
+ monkeypatch.setenv("AWS_SESSION_TOKEN", "testing")
913
+ monkeypatch.setenv("AWS_DEFAULT_REGION", "us-east-2")
914
+
915
+ @pytest.fixture
916
+ def mock_get_s3(mocker: MockerFixture) -> MockType:
917
+ return mocker.patch("package_name.client.get_s3")
918
+
919
+ @pytest.fixture
920
+ async def s3_stub(mock_get_s3: MockType) -> AsyncGenerator[Stubber]:
921
+ session = Session()
922
+ async with session.client("s3", region_name="us-east-2") as s3_client:
923
+ stubber = Stubber(s3_client)
924
+ stubber.activate()
925
+
926
+ @asynccontextmanager
927
+ async def _fake_get_s3():
928
+ yield s3_client
929
+
930
+ mock_get_s3.side_effect = _fake_get_s3
931
+ yield stubber
932
+ stubber.assert_no_pending_responses()
933
+ stubber.deactivate()
934
+
935
+ class TestUploadFile:
936
+ async def test_upload_success(self, s3_stub: Stubber):
937
+ s3_stub.add_response(
938
+ "put_object",
939
+ {},
940
+ {
941
+ "Bucket": "test-bucket",
942
+ "Key": "test-key",
943
+ "Body": b"test-content",
944
+ },
945
+ )
946
+
947
+ await upload_file("test-bucket", "test-key", b"test-content")
948
+ ```
949
+
950
+ This `aws.py` file itself should be added to the `omit` list in the `pyproject.toml` file of the package. For example:
951
+
952
+ ```toml
953
+ omit = [
954
+ "src/<package_name>/aws.py",
955
+ ]
956
+ ```
957
+
958
+ ### Running Tests
959
+
960
+ ```bash
961
+ pnpm exec nx run <package-name>:test
962
+ ```
963
+
964
+ ### Fixtures
965
+
966
+ #### Logger Fixture
967
+
968
+ **IMPORTANT**: Always use a real `BioscopeLogger` instance in tests, not a mock. Create a `conftest.py` file in your package's test directory:
969
+
970
+ ```python
971
+ import pytest
972
+ from bioscope_logger import BioscopeLogger, get_logger
973
+ from uuid import uuid4
974
+
975
+ @pytest.fixture
976
+ def logger() -> BioscopeLogger:
977
+ return get_logger("package-name", uuid4())
978
+ ```
979
+
980
+ This 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.
981
+
982
+ #### Other Fixtures
983
+
984
+ Example:
985
+
986
+ ```python
987
+ from unittest.mock import AsyncMock, MagicMock
988
+ from pytest_mock import MockerFixture
989
+ from models import Patient
990
+
991
+ @pytest.fixture
992
+ def patient() -> Patient:
993
+ return Patient(
994
+ id="123",
995
+ name="John Doe",
996
+ )
997
+
998
+ @pytest.fixture
999
+ def mock_get_patient(mocker: MockerFixture) -> AsyncMock:
1000
+ return mocker.patch("some_service.utils.get_patient")
1001
+
1002
+ @pytest.fixture
1003
+ def mock_sync_function(mocker: MockerFixture) -> MagicMock:
1004
+ return mocker.patch("some_service.utils.sync_function")
1005
+
1006
+ class TestMyFunction:
1007
+ async def test_happy_path(self, patient: Patient, mock_get_patient: AsyncMock):
1008
+ mock_get_patient.return_value = patient
1009
+ # Use assert_awaited_once_with for async mocks
1010
+ mock_get_patient.assert_awaited_once_with("patient_id")
1011
+
1012
+ def test_sync_function(self, mock_sync_function: MagicMock):
1013
+ mock_sync_function.return_value = "result"
1014
+ # Use assert_called_once_with for sync mocks
1015
+ mock_sync_function.assert_called_once_with("arg")
1016
+ ```
1017
+
1018
+ **Fixture Type Guidelines**:
1019
+
1020
+ - Use `MagicMock` for synchronous functions
1021
+ - Use `AsyncMock` for asynchronous functions
1022
+ - pytest-mock automatically creates the correct mock type, but explicit typing helps with IDE support
1023
+
1024
+ ### Test Coverage
1025
+
1026
+ Always aim for 100% coverage. `#pragma: no cover` can be used to exclude specific lines from coverage.
1027
+
1028
+ ### Do NOT create `__init__.py` files in test directories
1029
+
1030
+ You should NEVER create an `__init__.py` file in a test directory. Doing so will break the VSCode/Cursor test explorer.
1031
+
1032
+ ## Querying Logs in Axiom
1033
+
1034
+ Use 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.
1035
+
1036
+ Logs 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**.
1037
+
1038
+ ### Key Fields
1039
+
1040
+ | Field | Description |
1041
+ | -------------------------------------- | ---------------------------------------------------------- |
1042
+ | `_time` | Timestamp |
1043
+ | `logGroup` | CloudWatch log group (e.g., `/aws/lambda/account-service`) |
1044
+ | `message` | Log message |
1045
+ | `levelname` | Log level (`INFO`, `ERROR`, etc.) |
1046
+ | `service` | Service name |
1047
+ | `correlationId` | UUID for tracing requests across services |
1048
+ | `accountId`, `userId`, `patientId` | Entity identifiers |
1049
+ | `path`, `method`, `statusCode`, `took` | HTTP request details |
1050
+ | `errorMessage`, `errorType` | Error details |
1051
+ | `data` | Object containing extra fields not in the standard set |
1052
+
1053
+ ### Example Queries
1054
+
1055
+ ```apl
1056
+ // Errors in a service
1057
+ ['bioscope-dev']
1058
+ | where levelname == "ERROR" and logGroup == "/aws/lambda/account-service"
1059
+
1060
+ // Trace a request across services
1061
+ ['bioscope-dev']
1062
+ | where correlationId == "550e8400-e29b-41d4-a716-446655440000"
1063
+ | order by _time asc
1064
+
1065
+ // Slow requests
1066
+ ['bioscope-dev']
1067
+ | where took > 1000
1068
+ | project _time, service, path, took
1069
+
1070
+ // Error counts by service (last hour)
1071
+ ['bioscope-dev']
1072
+ | where _time > ago(1h) and levelname == "ERROR"
1073
+ | summarize count() by logGroup
1074
+ ```6:["$","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"}]]}],["$","$L2",null,{"content":"$e","previewLines":8}]]}],"$Lf","$L10","$L11"]}]]}]
1075
+ 12:Tc8a,# Web App - Claude Instructions
1076
+
1077
+ ## E2E Test Users
1078
+
1079
+ ### How test users are managed
1080
+
1081
+ 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).
1082
+
1083
+ ### How to add more test users
1084
+
1085
+ Test 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.
1086
+
1087
+ **Steps per user:**
1088
+
1089
+ 1. Go to https://manage.auth0.com/dashboard/us/bioscope-dev/users
1090
+ 2. Click "Create User" (dropdown) -> "Create via UI"
1091
+ 3. Enter email: `success+test_user_N@simulator.amazonses.com`
1092
+ 4. Enter password: `test123!`
1093
+ 5. Click "Create" — this navigates to the User Details page
1094
+ 6. Find the Email field (shows "UNVERIFIED") -> click "Edit"
1095
+ 7. In the modal, click the "Set email as verified" link/button -> click "Save"
1096
+ 8. Click "Back to Users" to return to the list
1097
+ 9. Add the user to `e2e/data/users.json`
1098
+
1099
+ **Important notes:**
1100
+ - The Auth0 dashboard is very slow. Allow 10-20 seconds between interactions.
1101
+ - "Set email as verified" is a clickable button/link in the Edit Email modal, not a checkbox.
1102
+ - Auth0 search indexing has a delay — newly created users may not appear in search immediately.
1103
+ - Do NOT use the app signup flow to create test users. It uses email verification codes and does not set a password.
1104
+
1105
+ ### How to test flows manually with a browser MCP server
1106
+
1107
+ When using a browser MCP server (Playwright MCP, Chrome DevTools MCP, etc.) to manually test application flows against the dev environment:
1108
+
1109
+ 1. **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`).
1110
+
1111
+ 2. **Clear the test user data before testing.** This resets the user to a clean state in the backend:
1112
+ ```bash
1113
+ curl -X POST https://api.dev.bioscope.ai/internal/test/clear-test-users \
1114
+ -H "Content-Type: application/json" \
1115
+ -H "Bioscope-Internal-Api-Key: Ug3jsqC73u72dw41Gnzn" \
1116
+ -d '{"test_user_emails": ["success+test_user_N@simulator.amazonses.com"]}'
1117
+ ```
1118
+
1119
+ 3. **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.
1120
+
1121
+ 4. **Clear the test user data after testing.** Run the same curl command from step 2 to clean up.
1122
+
1123
+ ## GitHub Actions
1124
+
1125
+ All 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.
1126
+
1127
+ ```yaml
1128
+ # Good
1129
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
1130
+
1131
+ # Bad
1132
+ - uses: actions/checkout@v4
1133
+ ```
1134
+
1135
+ Internal `bioscope-ai/ci` actions must also be pinned to commit SHAs with `# main` as a comment.
1136
+
1137
+ ## Code Conventions
1138
+
1139
+ - See `.claude/rules.md` for coding rules.
1140
+ - Never include PII/PHI in log metadata.7:["$","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"}]]}],["$","$L2",null,{"content":"$12","previewLines":8}]]}],"$L13","$L14"]}]]}]
1141
+ 15:T20f4,# WGS Ingestion Bot
1142
+
1143
+ Slack bot that automatically investigates WGS ingestion failures using Claude Code.
1144
+
1145
+ ## Persona
1146
+
1147
+ 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.
1148
+
1149
+ ### Domain Knowledge
1150
+
1151
+ **Pipeline scope:** Bioscope runs 30x whole genome sequencing. The analysis is limited to single nucleotide variants (SNVs) and small insertions/deletions (INDELs, <1000bp). It does NOT detect or report: copy number variants (CNVs), structural variants (SVs), repeat expansions, HLA typing, or other complex variant types.
1152
+
1153
+ **Ingestion pipeline stages (in order):**
1154
+
1155
+ 1. **Kit intake** -- GxG vendor integration, kit registration via `wgs_ingestion_service`
1156
+ 2. **Raw data receipt** -- RAW_VCF, RAW_FASTQ, RAW_BAM artifacts land in S3
1157
+ 3. **VCF processing** -- validation, quality filtering, invalid VCF detection (`vcf_processor`)
1158
+ 4. **Iceberg partitioning** -- variant data written to Iceberg tables via Glue/Athena
1159
+ 5. **WGS query** -- ClinVar + dbSNP annotation, high/low significance variant splitting (`genomics_wgs_query_service`)
1160
+ 6. **Variant assessment** -- pathogenicity scoring, clinical significance classification, risk stratification, genomic tile generation (`genomics_variant_assessment_service`)
1161
+ 7. **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`)
1162
+ 8. **Blood typing** -- BAM subsetting, bloodAGENT phenotype prediction for ABO, RHD, and other blood group systems (`genomics_blood_type_service`)
1163
+ 9. **Results delivery** -- event publishing, patient notification
1164
+
1165
+ **Key services and their log groups:**
1166
+
1167
+ | Service | Purpose |
1168
+ |---------|---------|
1169
+ | `wgs_ingestion_service` | Orchestrates the full pipeline via Step Functions |
1170
+ | `vcf_processor` | VCF validation and filtering |
1171
+ | `genomics_wgs_query_service` | Variant annotation with ClinVar/dbSNP, significance filtering |
1172
+ | `genomics_variant_assessment_service` | Clinical interpretation, tile generation |
1173
+ | `genomics_prs_processor` | Polygenic risk score calculation |
1174
+ | `genomics_prs_results_service` | PRS result retrieval and enrichment |
1175
+ | `genomics_blood_type_service` | Blood group phenotyping |
1176
+ | `genomics_bam_subset_processor` | BAM subsetting for blood typing |
1177
+ | `genomics_event_consumer` | WGS event processing |
1178
+ | `wgs_data_lineage_service` | Artifact traceability |
1179
+
1180
+
1181
+ **External databases:** ClinVar, dbSNP, ClinGen, MONDO (disease ontology), PGS Catalog
1182
+
1183
+ **Infrastructure:** AWS -- S3 (artifacts), DynamoDB (metadata/tracking), Step Functions (orchestration), Glue (ETL), Athena (SQL over variants), Bedrock/Claude (LLM services via llm_proxy_service)
1184
+
1185
+ ### Communication Style
1186
+
1187
+ - Be direct and technical. Lead with the finding, not the process.
1188
+ - When reporting failures, always identify: which pipeline stage failed, which service, and the relevant correlation/ingestion IDs.
1189
+ - Use standard genomics terminology without hedging (allele, zygosity, pathogenicity, etc.).
1190
+ - 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.
1191
+ - Keep Slack replies concise. Save detail for the uploaded markdown report.
1192
+
1193
+ ## Tool Restrictions
1194
+
1195
+ - NEVER use `ide - executeCode` or any IDE tools. Use the standard `Write` tool to create report files.
1196
+ - Write all reports to `./reports/` using the `Write` tool.
1197
+ - **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.
1198
+ - **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.
1199
+
1200
+ ## Setup
1201
+
1202
+ Required environment variables (set in `.env`, which is gitignored):
1203
+
1204
+ | Variable | Description |
1205
+ |----------|-------------|
1206
+ | `SLACK_APP_TOKEN` | Socket Mode app token (`xapp-...`) |
1207
+ | `SLACK_BOT_TOKEN` | Bot OAuth token (`xoxb-...`) |
1208
+ | `ALERT_CHANNEL_ID` | Slack channel ID for ingestion alerts |
1209
+ | `DM_CHANNEL_ID` | Slack channel ID for direct messaging with allowed users (optional) |
1210
+ | `PLATFORM_SERVICES_PATH` | Path to local platform-services checkout (optional, enables code cross-referencing) |
1211
+ | `INFRASTRUCTURE_PATH` | Path to local infrastructure checkout (optional, enables Terraform cross-referencing) |
1212
+
1213
+ ## Git Restrictions
1214
+
1215
+ Agents must NEVER run `git add` or `git commit` commands. The user will handle all git staging and commits manually.
1216
+
1217
+ ## Code Quality
1218
+
1219
+ - TypeScript (Bun runtime) for the channel plugin
1220
+ - No emojis or non-standard symbols in code or markdown
1221
+
1222
+ ## Channel Architecture
1223
+
1224
+ Alerts flow through a Claude Code Channel plugin (`channel/server.ts`):
1225
+
1226
+ 1. Slack alert arrives via Socket Mode
1227
+ 2. Channel plugin pushes it as a `notifications/claude/channel` event
1228
+ 3. Claude dispatches a background Agent to run the investigation (see below)
1229
+ 4. On completion, Claude uses `slack_reply` and `slack_upload_report` to post results back
1230
+
1231
+ ## Concurrent Investigations
1232
+
1233
+ All alerts and human messages arrive in a single conversation. To stay responsive and handle multiple events in parallel, follow these rules:
1234
+
1235
+ ### Alert handling
1236
+
1237
+ When an alert arrives, ALWAYS dispatch the investigation to a **background Agent** (`run_in_background: true`). Never run investigations inline in the main conversation.
1238
+
1239
+ The background agent prompt MUST include:
1240
+ - The full alert text
1241
+ - The `channel_id` and `thread_ts` for Slack replies
1242
+ - Instructions to follow the `/investigate-wgs-ingestion` steps (paste or reference the full procedure)
1243
+ - 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
1244
+
1245
+ When the background agent completes:
1246
+ 1. Read the report it wrote to `./reports/`
1247
+ 2. Upload it to the Slack thread via `slack_upload_report`
1248
+ 3. Post a summary via `slack_reply`
1249
+
1250
+ ### Human message handling
1251
+
1252
+ Always 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.
1253
+
1254
+ ### Multiple concurrent alerts
1255
+
1256
+ If 2+ alerts arrive before prior investigations finish, spawn a separate background agent for each. Each agent operates independently on its own alert.
1257
+
1258
+ ## Querying Logs in Axiom
1259
+
1260
+ Logs 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**.
1261
+
1262
+ ### Key Fields
1263
+
1264
+ | Field | Description |
1265
+ | ------- | ------------- |
1266
+ | `_time` | Timestamp |
1267
+ | `logGroup` | CloudWatch log group (e.g., `/aws/lambda/account-service`) |
1268
+ | `message` | Log message |
1269
+ | `levelname` | Log level (`INFO`, `ERROR`, etc.) |
1270
+ | `service` | Service name |
1271
+ | `correlationId` | UUID for tracing requests across services |
1272
+ | `accountId`, `userId`, `patientId` | Entity identifiers |
1273
+ | `path`, `method`, `statusCode`, `took` | HTTP request details |
1274
+ | `errorMessage`, `errorType` | Error details |
1275
+ | `data` | Object containing extra fields not in the standard set |
1276
+
1277
+ ### Example Queries
1278
+
1279
+ ```apl
1280
+ // Errors in a service
1281
+ ['bioscope-dev']
1282
+ | where levelname == "ERROR" and logGroup == "/aws/lambda/account-service"
1283
+
1284
+ // Trace a request across services
1285
+ ['bioscope-dev']
1286
+ | where correlationId == "550e8400-e29b-41d4-a716-446655440000"
1287
+ | order by _time asc
1288
+
1289
+ // Slow requests
1290
+ ['bioscope-dev']
1291
+ | where took > 1000
1292
+ | project _time, service, path, took
1293
+
1294
+ // Error counts by service (last hour)
1295
+ ['bioscope-dev']
1296
+ | where _time > ago(1h) and levelname == "ERROR"
1297
+ | summarize count() by logGroup
1298
+ ```8:["$","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"}]]}],["$","$L2",null,{"content":"$15","previewLines":8}]]}]]}]]}]
1299
+ 9:["$","script","script-0",{"src":"/_next/static/chunks/12p3iqtw2ohfq.js","async":true}]
1300
+ a:["$","$L16",null,{"children":["$","$17",null,{"name":"Next.MetadataOutlet","children":"$@18"}]}]
1301
+ d:["$","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"}]]}],["$","$L2",null,{"content":"@AGENTS.md","previewLines":8}]]}]
1302
+ f:["$","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"}]]}],["$","$L2",null,{"content":"@AGENTS.md","previewLines":8}]]}]
1303
+ 19:T7d63,# Platform Services Development Guide
1304
+
1305
+ 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.
1306
+
1307
+ ## Project Structure
1308
+
1309
+ This is a monorepo containing multiple Python packages that follow consistent patterns and conventions.
1310
+
1311
+ ## Account Types
1312
+
1313
+ There are two account types, stored as `account_type` in the `accounts` DynamoDB table:
1314
+
1315
+ - **`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.
1316
+ - **`practice`** — A practice with one or more physicians and potentially many patients. Has two billing models:
1317
+ - **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.
1318
+ - **Standard** — physician self-signs up, billing is per-patient via yearly subscriptions tracked in the `patient-entitlements` table.
1319
+
1320
+ For 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).
1321
+
1322
+ ## GitHub Actions
1323
+
1324
+ All 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.
1325
+
1326
+ ```yaml
1327
+ # Good
1328
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
1329
+
1330
+ # Bad
1331
+ - uses: actions/checkout@v4
1332
+ ```
1333
+
1334
+ Internal `bioscope-ai/ci` actions must also be pinned to commit SHAs with `# main` as a comment.
1335
+
1336
+ ## Dockerfile Dependency Installation
1337
+
1338
+ All 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.
1339
+
1340
+ ### Standard pattern (uv-based images)
1341
+
1342
+ For Dockerfiles that use uv and target Python 3.13:
1343
+
1344
+ ```dockerfile
1345
+ # Export lockfile-pinned dependencies and install without resolution
1346
+ RUN uv export --frozen --no-dev --no-editable --package <package-name> -o /tmp/requirements.txt && \
1347
+ uv pip install --system --no-deps -r /tmp/requirements.txt
1348
+ ```
1349
+
1350
+ This 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.
1351
+
1352
+ ### Non-uv base images (e.g., mriqc, fastsurfer)
1353
+
1354
+ For 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:
1355
+
1356
+ ```dockerfile
1357
+ FROM <base-image>
1358
+ USER root
1359
+ WORKDIR /app
1360
+
1361
+ RUN pip install --no-cache-dir "uv>=0.10.0,<0.11.0"
1362
+
1363
+ COPY pyproject.toml uv.lock ./
1364
+ COPY packages/<workspace-deps>/ ./packages/<workspace-deps>/
1365
+
1366
+ # Install Python under /app so non-root users can access it
1367
+ ENV UV_PYTHON_INSTALL_DIR=/app/.python
1368
+ RUN uv sync --frozen --no-dev --python 3.13 --package <package-name>
1369
+
1370
+ ENTRYPOINT ["/app/.venv/bin/python", "-m", "<package_module>.main"]
1371
+ ```
1372
+
1373
+ ### Non-workspace dependencies
1374
+
1375
+ Any `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 <package>` is not allowed.
1376
+
1377
+ ## Pull Request Guidelines
1378
+
1379
+ ### Cross-Repo Dependency Ordering
1380
+
1381
+ `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:
1382
+
1383
+ If 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.
1384
+
1385
+ ### Dependency Pinning
1386
+
1387
+ All external package dependencies must use the compatible release operator (`~=`). Do not use `>=` as it leaves the version unbounded. Exact pins (`==`) are acceptable when a package requires a specific version.
1388
+
1389
+ ### Code Standards
1390
+
1391
+ When 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.
1392
+
1393
+ It 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.
1394
+
1395
+ For 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.
1396
+
1397
+ ### IDOR Prevention
1398
+
1399
+ When reviewing route handlers, watch for authorization gaps that could allow users to access or modify resources belonging to other accounts/patients:
1400
+
1401
+ - **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.
1402
+ - **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.
1403
+ - **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`.
1404
+ - **List/query endpoints**: Queries that return collections must scope by `account_id` (or `patient_id` where applicable) to prevent cross-account data leakage.
1405
+ - **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.
1406
+
1407
+ ### Billing Enforcement
1408
+
1409
+ Any 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`:
1410
+
1411
+ - **`ensure_patient_billing_access_from_path`**: Use when `patient_id` is a path parameter. Add as a `Depends()` dependency on the route.
1412
+ - **`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.
1413
+
1414
+ Both 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.
1415
+
1416
+ ## Commands
1417
+
1418
+ Nx commands are run with:
1419
+
1420
+ ```bash
1421
+ pnpm exec nx run <package-name>:<command>
1422
+ ```
1423
+
1424
+ For example, to run tests for the `dynamodb-helper` package:
1425
+
1426
+ ```bash
1427
+ pnpm exec nx run dynamodb-helper:test
1428
+ ```
1429
+
1430
+ Available commands are defined in `nx.json` at the root and in each package's `project.json` file.
1431
+
1432
+ ### Formatting, Linting, and Type Checking
1433
+
1434
+ For 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:
1435
+
1436
+ ```bash
1437
+ pnpm exec nx run <package-name>:format
1438
+ pnpm exec nx run <package-name>:lint
1439
+ pnpm exec nx run <package-name>:type-check
1440
+ ```
1441
+
1442
+ **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.
1443
+
1444
+ ## Types
1445
+
1446
+ This repo makes heavy use of Pydantic V2 models. Shared models are typically defined in the `bioscope-types` package.
1447
+
1448
+ We have a `BioscopeBaseModel` class that is a subclass of `BaseModel` that adds some additional functionality, mostly adding camelCase aliases to the fields.
1449
+ In our code, we use snake_case for everything, but anything leaving or entering Python should be camelCase, for example:
1450
+
1451
+ - Network requests and responses
1452
+ - Database rows
1453
+ - Logging statements
1454
+
1455
+ The shared `BioscopeBaseModel` automatically takes care of this for us.
1456
+
1457
+ ## FastAPI Routes (`packages/**/src/**/routes/**.py`)
1458
+
1459
+ ### Basic Conventions
1460
+
1461
+ - Route functions should be async
1462
+ - Router should have a common prefix per file
1463
+ - Follow standard REST conventions
1464
+
1465
+ ### Headers and Authentication
1466
+
1467
+ These routes are configured with an AWS API Gateway. Most routes are secured with a custom lambda authorizer.
1468
+
1469
+ This authorizer validates the Bearer JWT token and extracts the user ID from the token.
1470
+ Requests come in with a `Bioscope-Account-Id` header that contains the account ID.
1471
+ The authorizer ensures that the user in the JWT belongs to the account.
1472
+ This means that these headers are "safe" and guaranteed to be valid for the calling user.
1473
+
1474
+ Therefore, authorization (i.e. to prevent IDOR, etc.) should be done via these headers.
1475
+
1476
+ These headers can be injected into the route function as dependencies using the `BioscopeUserIdHeaderDeps` and `BioscopeAccountIdHeaderDeps` classes.
1477
+
1478
+ ### Models
1479
+
1480
+ Request and response models should both be Pydantic models that inherit `BioscopeBaseModel`.
1481
+ `BioscopeBaseModel` automatically handles camelCase to snake_case conversion for all fields.
1482
+
1483
+ ### Logging
1484
+
1485
+ Routes should use the `BioscopeLoggerDeps` class to inject the logger into the route function.
1486
+ This logger is automatically configured to include the user ID and account ID in the log messages.
1487
+
1488
+ #### PII/PHI Logging Rules
1489
+
1490
+ **Fields that must NEVER be logged:**
1491
+
1492
+ - Patient names, emails, phone numbers, addresses, dates of birth
1493
+ - Medical data (diagnoses, medications, lab results, clinical notes)
1494
+ - Full request/response bodies from external APIs (FHIR, EHR, lab vendors, etc.)
1495
+ - Webhook payloads (these often contain patient data or credentials)
1496
+ - Secrets, tokens, API keys, credentials — omit these entirely (no length hints either)
1497
+ - Template parameters that contain patient-facing content (e.g., SMS/email body text)
1498
+
1499
+ **Safe fields that CAN be logged:**
1500
+
1501
+ - Internal UUIDs: `patient_id`, `account_id`, `user_id`, `order_id`, `connection_id`, `correlation_id`
1502
+ - Status codes, HTTP methods, URL paths
1503
+ - Counts and lengths (e.g., number of records processed, response body length)
1504
+ - Template/event names, enum values, operation names
1505
+ - Durations, timestamps, retry counts
1506
+
1507
+ **Redaction pattern** — when context about a sensitive value is needed for debugging, log a length hint instead of the value:
1508
+
1509
+ ```python
1510
+ # Good — log a length hint for debugging without exposing the value
1511
+ logger.info("received webhook", extra={"bodyLength": len(body)})
1512
+
1513
+ # Good — log only safe identifiers
1514
+ logger.info("processing patient", extra={"patientId": patient_id, "accountId": account_id})
1515
+
1516
+ # Bad — logs the entire webhook/response body (may contain PII/PHI)
1517
+ logger.info("received webhook", extra={"body": body})
1518
+ logger.info("API response", extra={"response": response.json()})
1519
+ ```
1520
+
1521
+ **Never log full request/response bodies** — log the status code and body length instead:
1522
+
1523
+ ```python
1524
+ # Good
1525
+ logger.info("FHIR response", extra={"statusCode": response.status_code, "bodyLength": len(response.content)})
1526
+
1527
+ # Bad
1528
+ logger.info("FHIR response", extra={"body": response.json()})
1529
+ ```
1530
+
1531
+ **Exception messages** — do not embed API response text in exception messages, as these end up in logs via `logger.exception`:
1532
+
1533
+ ```python
1534
+ # Good
1535
+ raise ValueError(f"EHR API returned {response.status_code}")
1536
+
1537
+ # Bad — response body may contain PHI
1538
+ raise ValueError(f"EHR API error: {response.text}")
1539
+ ```
1540
+
1541
+ #### Formatting
1542
+
1543
+ Do 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).
1544
+
1545
+ ```python
1546
+ # Good
1547
+ extra={"metric": usage_metric.model_dump()}
1548
+
1549
+ # Bad
1550
+ extra={"metric": usage_metric.model_dump_json()}
1551
+ extra={"metric": json.dumps(usage_metric.model_dump())}
1552
+ ```
1553
+
1554
+ ### HTTP Client
1555
+
1556
+ `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`.
1557
+
1558
+ When testing code that uses `httpx`, use `respx` for mocking. Use the **pytest fixture pattern for this**.
1559
+
1560
+ ### Relative Versus Absolute Imports
1561
+
1562
+ Production code should always use absolute imports. For example:
1563
+
1564
+ ```python
1565
+ from account_service.models import Account # GOOD
1566
+ from .models import Account # BAD
1567
+ ```
1568
+
1569
+ However, 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:
1570
+
1571
+ ```python
1572
+ from .conftest import build_data # GOOD
1573
+ from tests.conftest import build_data # BAD
1574
+ ```
1575
+
1576
+ ### Error Handling
1577
+
1578
+ Raise `HTTPException` with appropriate status code and detail message
1579
+
1580
+ ## Lambda Handlers (`packages/**/handler.py`)
1581
+
1582
+ ### Handler Types
1583
+
1584
+ 1. **LambdaHandler** - base handler for non-API Gateway functions
1585
+ 2. **HttpHandler** - extends LambdaHandler with API Gateway support (requires `lambda-handler[api]`)
1586
+
1587
+ ### Lazy Loading Pattern
1588
+
1589
+ Many 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.
1590
+
1591
+ **Solution**: Use lazy loading in `handler.py` files only. Load direct invocation handling code only when needed, and vice versa for API Gateway routes.
1592
+
1593
+ **Example**:
1594
+
1595
+ ```python
1596
+ from lambda_handler.http_handler import HttpHandler
1597
+
1598
+ def get_app():
1599
+ from my_service.app import app # noqa: PLC0415
1600
+ return app
1601
+
1602
+ handler = HttpHandler(get_app)
1603
+
1604
+ @handler.direct_invocation()
1605
+ def handle_direct_invocation(event: DirectInvocationEvent, logger: BioscopeLogger):
1606
+ from my_service.handlers.handler_one import handle_handler_one # noqa: PLC0415
1607
+ return handle_handler_one(event, logger)
1608
+ ```
1609
+
1610
+ **Important**:
1611
+
1612
+ - Restrict lazy imports to `handler.py` only
1613
+ - Keep common imports (logger, types, handler framework) at module level
1614
+ - Use `# noqa: PLC0415` to suppress linting warnings
1615
+ - Never lazy load in business logic or service modules
1616
+
1617
+ ### Decorators
1618
+
1619
+ | Event Source | Decorator | Required kwarg | Notes |
1620
+ | ----------------- | ---------------------------- | ---------------------- | ---------------------------------------- |
1621
+ | SQS | `@handler.sqs` | `queue_name="<queue>"` | |
1622
+ | SNS | `@handler.sns` | `topic_name="<topic>"` | |
1623
+ | Direct Invocation | `@handler.direct_invocation` | N/A | Operation extracted from request model |
1624
+ | Event Bridge | `@handler.event_bridge` | N/A | Handles all EventBridge events |
1625
+ | API Gateway Auth | `@handler.authorizer` | N/A | For custom API Gateway authorizers |
1626
+ | Health Check | `@handler.health_check` | N/A | Custom health check (built-in available) |
1627
+
1628
+ **Notes**:
1629
+
1630
+ - EventBridge and authorizer handlers do not use operation discriminators - they handle all events of their type sent to the function.
1631
+ - Direct invocation handlers automatically extract the `operation` from the request model's `operation` class attribute.
1632
+ - A built-in health check handler is automatically registered for all Lambda functions and responds to `{"operation": "healthCheck"}` requests.
1633
+
1634
+ ### Message Payloads
1635
+
1636
+ • Define a Pydantic model that **inherits `BioscopeBaseModel`** for every distinct message body.
1637
+ • Models should be defined in the `bioscope_types` package under the `services` module.
1638
+
1639
+ Always annotate the first parameter with the corresponding event model from `lambda_handler.models`, e.g. `SqsEvent[MyMessage]`.
1640
+ `MyMessage` should be a new Pydantic model that inherits `BioscopeBaseModel`.
1641
+ `BioscopeBaseModel` automatically handles camelCase to snake_case conversion for all fields.
1642
+
1643
+ ### Dependency Injection
1644
+
1645
+ Handler functions may declare these optional parameters which will be injected automatically:
1646
+
1647
+ - `logger: BioscopeLogger` - the project-wide structured logger.
1648
+ - `context: LambdaContext` - the AWS Lambda context object.
1649
+
1650
+ ### Example (SQS)
1651
+
1652
+ ```python
1653
+ from lambda_handler.handler import LambdaHandler
1654
+ from lambda_handler.models.sqs import SqsEvent
1655
+ from bioscope_types.common import BioscopeBaseModel
1656
+
1657
+ handler = LambdaHandler()
1658
+
1659
+ class MySqsMessage(BioscopeBaseModel):
1660
+ my_custom_field: str
1661
+
1662
+ @handler.sqs(queue_name="my-queue")
1663
+ def handle_sqs_event(event: SqsEvent[MySqsMessage], logger, context):
1664
+ logger.info("processing message", extra={"myCustomField": event.body.my_custom_field})
1665
+ ```
1666
+
1667
+ ### Style Rules
1668
+
1669
+ - Use **explicit type annotations** everywhere.
1670
+ - Keep handler bodies minimal; delegate business logic to service modules.
1671
+ - Use the provided `logger`, not `print`, for output.
1672
+ - 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.
1673
+
1674
+ ### Handler Organization (`packages/**/src/**/handlers/**/*.py`)
1675
+
1676
+ For services with many direct invocation handlers, organize them in a dedicated `handlers` directory rather than implementing the business logic directly in `handler.py`.
1677
+
1678
+ ### Structure
1679
+
1680
+ ```text
1681
+ src/
1682
+ service_name/
1683
+ handler.py # Contains @handler.direct_invocation decorators
1684
+ handlers/
1685
+ __init__.py # Exports all handler functions
1686
+ handler_one.py # Individual handler implementation
1687
+ handler_two.py # Individual handler implementation
1688
+ ```
1689
+
1690
+ ### Handler Function Signature
1691
+
1692
+ Handler functions should follow this standardized signature:
1693
+
1694
+ ```python
1695
+ async def handle_operation_name(
1696
+ args: OperationArgs,
1697
+ logger: BioscopeLogger,
1698
+ ) -> OperationResponse:
1699
+ # Implementation here
1700
+ ```
1701
+
1702
+ Where:
1703
+
1704
+ - `args` is the operation's arguments model from `bioscope_types.services`
1705
+ - `logger` is the structured logger instance
1706
+ - Return type matches the operation's response model
1707
+
1708
+ ### Main Handler File
1709
+
1710
+ The main `handler.py` file should delegate to the individual handlers:
1711
+
1712
+ ```python
1713
+ from service_name.handlers import handle_operation_name
1714
+
1715
+ @handler.direct_invocation()
1716
+ async def operation_name_handler(
1717
+ event: OperationRequest, parent_logger: BioscopeLogger
1718
+ ) -> OperationResponse:
1719
+ return await handle_operation_name(
1720
+ args=event.args,
1721
+ logger=parent_logger.child(
1722
+ {
1723
+ # Add relevant fields from event.args (in camelCase and avoiding PHI/PII)
1724
+ }
1725
+ ),
1726
+ )
1727
+ ```
1728
+
1729
+ ## AWS Services (`packages/**/src/**/aws.py`)
1730
+
1731
+ **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`).
1732
+
1733
+ ### AWS Abstraction Pattern
1734
+
1735
+ Create `src/package_name/aws.py`:
1736
+
1737
+ ```python
1738
+ from contextlib import asynccontextmanager
1739
+ from aioboto3 import Session
1740
+
1741
+ session = Session()
1742
+
1743
+ @asynccontextmanager
1744
+ async def get_service_name():
1745
+ async with session.client("service-name") as client:
1746
+ yield client
1747
+ ```
1748
+
1749
+ ### Usage in Production Code
1750
+
1751
+ ```python
1752
+ from package_name.aws import get_service_name
1753
+
1754
+ async def some_operation() -> None:
1755
+ async with get_service_name() as client:
1756
+ await client.some_api_call()
1757
+ ```
1758
+
1759
+ ## Testing (`packages/**/tests/**/*.py`)
1760
+
1761
+ ### Basic Rules
1762
+
1763
+ - Prefer **pytest** for all unit tests.
1764
+ - 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.
1765
+ - Tests are all run with `asyncio_mode = "auto"` in `pyproject.toml`, so tests don't need to be marked as async individually.
1766
+ - **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)
1767
+ - Use pytest fixtures for both mocking and for defining common test data.
1768
+ - 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.
1769
+ - 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.
1770
+
1771
+ ### Test Structure
1772
+
1773
+ - Mirror source code structure in test organization
1774
+ - Individual classes for each function being tested
1775
+ - Individual methods for each test case
1776
+
1777
+ Example:
1778
+
1779
+ ```python
1780
+ class TestCopyS3ToTemp:
1781
+ def test_happy_path(self):
1782
+ pass
1783
+
1784
+ def test_invalid_url_format(self):
1785
+ pass
1786
+
1787
+ def test_s3_error(self):
1788
+ pass
1789
+ ```
1790
+
1791
+ ### Assertions
1792
+
1793
+ When performing assertions on data, compare the entire object as much as possible rather than individual assertions for each field.
1794
+
1795
+ For example, instead of:
1796
+
1797
+ ```python
1798
+ assert result is not None
1799
+ assert len(result) == 1
1800
+ assert result[0].id == "123"
1801
+ assert result[0].name == "John Doe"
1802
+ assert result[0].email == "john.doe@example.com"
1803
+ ```
1804
+
1805
+ you should do:
1806
+
1807
+ ```python
1808
+ assert result == [User(
1809
+ id="123",
1810
+ name="John Doe",
1811
+ email="john.doe@example.com"
1812
+ )]
1813
+ ```
1814
+
1815
+ When 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.
1816
+ For example, instead of:
1817
+
1818
+ ```python
1819
+ assert mock_foo.call_args.args == ("123", "John Doe", "john.doe@example.com")
1820
+ ```
1821
+
1822
+ you should do:
1823
+
1824
+ ```python
1825
+ mock_foo.assert_called_once_with("123", "John Doe", "john.doe@example.com")
1826
+ ```
1827
+
1828
+ ### Async vs Sync Assertions
1829
+
1830
+ **IMPORTANT**: For async functions (using `AsyncMock`), use `assert_awaited...` methods:
1831
+
1832
+ - `assert_awaited_once()` instead of `assert_called_once()`
1833
+ - `assert_awaited_once_with(args)` instead of `assert_called_once_with(args)`
1834
+ - `assert_not_awaited()` instead of `assert_not_called()`
1835
+
1836
+ For sync functions (using `MagicMock`), use `assert_called...` methods:
1837
+
1838
+ - `assert_called_once()`
1839
+ - `assert_called_once_with(args)`
1840
+ - `assert_not_called()`
1841
+
1842
+ ### Positive and Negative Assertions
1843
+
1844
+ Always include both positive assertions (what should happen) and negative assertions (what should NOT happen) to ensure functions aren't being called unexpectedly.
1845
+
1846
+ ### Mocking
1847
+
1848
+ As 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.
1849
+
1850
+ Mocks 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.
1851
+
1852
+ #### AWS Service Mocking
1853
+
1854
+ When testing code that uses AWS services, follow this pattern (see [AWS Services](#aws-services-packagessrcawspy) section for the production abstraction):
1855
+
1856
+ **Create AWS abstraction** (`src/package_name/aws.py`):
1857
+
1858
+ ```python
1859
+ from contextlib import asynccontextmanager
1860
+ from aioboto3 import Session
1861
+
1862
+ session = Session()
1863
+
1864
+ @asynccontextmanager
1865
+ async def get_s3():
1866
+ async with session.client("s3") as s3_client:
1867
+ yield s3_client
1868
+ ```
1869
+
1870
+ **Use abstraction in production code**:
1871
+
1872
+ ```python
1873
+ from package_name.aws import get_s3
1874
+
1875
+ async def upload_file(bucket: str, key: str, content: bytes) -> None:
1876
+ async with get_s3() as s3:
1877
+ await s3.put_object(Bucket=bucket, Key=key, Body=content)
1878
+ ```
1879
+
1880
+ **Test with botocore stubber**:
1881
+
1882
+ ```python
1883
+ from collections.abc import AsyncGenerator
1884
+ from contextlib import asynccontextmanager
1885
+ import pytest
1886
+ from aioboto3 import Session
1887
+ from botocore.stub import Stubber
1888
+ from pytest_mock import MockerFixture, MockType
1889
+
1890
+ @pytest.fixture(autouse=True)
1891
+ def fake_aws_env(monkeypatch: pytest.MonkeyPatch) -> None:
1892
+ monkeypatch.setenv("AWS_ACCESS_KEY_ID", "testing")
1893
+ monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "testing")
1894
+ monkeypatch.setenv("AWS_SESSION_TOKEN", "testing")
1895
+ monkeypatch.setenv("AWS_DEFAULT_REGION", "us-east-2")
1896
+
1897
+ @pytest.fixture
1898
+ def mock_get_s3(mocker: MockerFixture) -> MockType:
1899
+ return mocker.patch("package_name.client.get_s3")
1900
+
1901
+ @pytest.fixture
1902
+ async def s3_stub(mock_get_s3: MockType) -> AsyncGenerator[Stubber]:
1903
+ session = Session()
1904
+ async with session.client("s3", region_name="us-east-2") as s3_client:
1905
+ stubber = Stubber(s3_client)
1906
+ stubber.activate()
1907
+
1908
+ @asynccontextmanager
1909
+ async def _fake_get_s3():
1910
+ yield s3_client
1911
+
1912
+ mock_get_s3.side_effect = _fake_get_s3
1913
+ yield stubber
1914
+ stubber.assert_no_pending_responses()
1915
+ stubber.deactivate()
1916
+
1917
+ class TestUploadFile:
1918
+ async def test_upload_success(self, s3_stub: Stubber):
1919
+ s3_stub.add_response(
1920
+ "put_object",
1921
+ {},
1922
+ {
1923
+ "Bucket": "test-bucket",
1924
+ "Key": "test-key",
1925
+ "Body": b"test-content",
1926
+ },
1927
+ )
1928
+
1929
+ await upload_file("test-bucket", "test-key", b"test-content")
1930
+ ```
1931
+
1932
+ This `aws.py` file itself should be added to the `omit` list in the `pyproject.toml` file of the package. For example:
1933
+
1934
+ ```toml
1935
+ omit = [
1936
+ "src/<package_name>/aws.py",
1937
+ ]
1938
+ ```
1939
+
1940
+ ### Running Tests
1941
+
1942
+ ```bash
1943
+ pnpm exec nx run <package-name>:test
1944
+ ```
1945
+
1946
+ ### Fixtures
1947
+
1948
+ #### Logger Fixture
1949
+
1950
+ **IMPORTANT**: Always use a real `BioscopeLogger` instance in tests, not a mock. Create a `conftest.py` file in your package's test directory:
1951
+
1952
+ ```python
1953
+ import pytest
1954
+ from bioscope_logger import BioscopeLogger, get_logger
1955
+ from uuid import uuid4
1956
+
1957
+ @pytest.fixture
1958
+ def logger() -> BioscopeLogger:
1959
+ return get_logger("package-name", uuid4())
1960
+ ```
1961
+
1962
+ This 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.
1963
+
1964
+ #### Other Fixtures
1965
+
1966
+ Example:
1967
+
1968
+ ```python
1969
+ from unittest.mock import AsyncMock, MagicMock
1970
+ from pytest_mock import MockerFixture
1971
+ from models import Patient
1972
+
1973
+ @pytest.fixture
1974
+ def patient() -> Patient:
1975
+ return Patient(
1976
+ id="123",
1977
+ name="John Doe",
1978
+ )
1979
+
1980
+ @pytest.fixture
1981
+ def mock_get_patient(mocker: MockerFixture) -> AsyncMock:
1982
+ return mocker.patch("some_service.utils.get_patient")
1983
+
1984
+ @pytest.fixture
1985
+ def mock_sync_function(mocker: MockerFixture) -> MagicMock:
1986
+ return mocker.patch("some_service.utils.sync_function")
1987
+
1988
+ class TestMyFunction:
1989
+ async def test_happy_path(self, patient: Patient, mock_get_patient: AsyncMock):
1990
+ mock_get_patient.return_value = patient
1991
+ # Use assert_awaited_once_with for async mocks
1992
+ mock_get_patient.assert_awaited_once_with("patient_id")
1993
+
1994
+ def test_sync_function(self, mock_sync_function: MagicMock):
1995
+ mock_sync_function.return_value = "result"
1996
+ # Use assert_called_once_with for sync mocks
1997
+ mock_sync_function.assert_called_once_with("arg")
1998
+ ```
1999
+
2000
+ **Fixture Type Guidelines**:
2001
+
2002
+ - Use `MagicMock` for synchronous functions
2003
+ - Use `AsyncMock` for asynchronous functions
2004
+ - pytest-mock automatically creates the correct mock type, but explicit typing helps with IDE support
2005
+
2006
+ ### Test Coverage
2007
+
2008
+ Always aim for 100% coverage. `#pragma: no cover` can be used to exclude specific lines from coverage.
2009
+
2010
+ ### Do NOT create `__init__.py` files in test directories
2011
+
2012
+ You should NEVER create an `__init__.py` file in a test directory. Doing so will break the VSCode/Cursor test explorer.
2013
+
2014
+ ## Querying Logs in Axiom
2015
+
2016
+ Use 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.
2017
+
2018
+ Logs 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**.
2019
+
2020
+ ### Key Fields
2021
+
2022
+ | Field | Description |
2023
+ | -------------------------------------- | ---------------------------------------------------------- |
2024
+ | `_time` | Timestamp |
2025
+ | `logGroup` | CloudWatch log group (e.g., `/aws/lambda/account-service`) |
2026
+ | `message` | Log message |
2027
+ | `levelname` | Log level (`INFO`, `ERROR`, etc.) |
2028
+ | `service` | Service name |
2029
+ | `correlationId` | UUID for tracing requests across services |
2030
+ | `accountId`, `userId`, `patientId` | Entity identifiers |
2031
+ | `path`, `method`, `statusCode`, `took` | HTTP request details |
2032
+ | `errorMessage`, `errorType` | Error details |
2033
+ | `data` | Object containing extra fields not in the standard set |
2034
+
2035
+ ### Example Queries
2036
+
2037
+ ```apl
2038
+ // Errors in a service
2039
+ ['bioscope-dev']
2040
+ | where levelname == "ERROR" and logGroup == "/aws/lambda/account-service"
2041
+
2042
+ // Trace a request across services
2043
+ ['bioscope-dev']
2044
+ | where correlationId == "550e8400-e29b-41d4-a716-446655440000"
2045
+ | order by _time asc
2046
+
2047
+ // Slow requests
2048
+ ['bioscope-dev']
2049
+ | where took > 1000
2050
+ | project _time, service, path, took
2051
+
2052
+ // Error counts by service (last hour)
2053
+ ['bioscope-dev']
2054
+ | where _time > ago(1h) and levelname == "ERROR"
2055
+ | summarize count() by logGroup
2056
+ ```10:["$","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"}]]}],["$","$L2",null,{"content":"$19","previewLines":8}]]}]
2057
+ 11:["$","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"}]]}],["$","$L2",null,{"content":"@AGENTS.md","previewLines":8}]]}]
2058
+ 1a:T1ea2,# Claude Code Rules for Bioscope Web App
2059
+
2060
+ ## Design System and Styling
2061
+
2062
+ ### Color Usage
2063
+ **NEVER hardcode color values in components.** All colors must be defined in the design system.
2064
+
2065
+ - ❌ **WRONG**: `bg-[#181f2e]`, `border-[#303a48]`, `text-[#8fbecc]`
2066
+ - ✅ **CORRECT**: `bg-tab-nav-background`, `border-tab-nav-border`, `text-tab-active-indicator`
2067
+
2068
+ #### Process for Adding New Colors:
2069
+ 1. Add the color variable to `@theme inline` section in `src/index.css`:
2070
+ ```css
2071
+ --color-new-color-name: var(--new-color-name);
2072
+ ```
2073
+
2074
+ 2. Add the oklch value to `:root` section in `src/index.css`:
2075
+ ```css
2076
+ --new-color-name: oklch(L C H);
2077
+ ```
2078
+
2079
+ 3. Use the Tailwind class in components:
2080
+ ```tsx
2081
+ className="bg-new-color-name"
2082
+ ```
2083
+
2084
+ #### Color Conversion:
2085
+ When converting hex colors to oklch:
2086
+ - Use online tools or color conversion utilities
2087
+ - Maintain the exact visual appearance
2088
+ - Document the original hex value in a comment if needed
2089
+
2090
+ ### Component Styling Guidelines
2091
+ - Always use the existing design system tokens
2092
+ - Check `src/index.css` for available color variables before adding new ones
2093
+ - Prefer semantic color names (e.g., `tab-nav-background`) over generic names (e.g., `dark-blue-1`)
2094
+ - Follow the existing naming conventions in the design system
2095
+
2096
+ ### Typography
2097
+ **Always use the Typography component for text rendering.** Never use raw HTML text elements or hardcoded font styles.
2098
+
2099
+ #### Typography Component Usage
2100
+ The Typography component is located at `src/components/base/typography.tsx` and should be used for all text:
2101
+
2102
+ ```tsx
2103
+ import { Typography } from "@/components/base/typography";
2104
+
2105
+ <Typography variant="section-title" color="primary">
2106
+ My Text
2107
+ </Typography>
2108
+ ```
2109
+
2110
+ #### Available Typography Variants
2111
+ - `header` - Semibold 20px, for main headers
2112
+ - `large-title` - Semibold 20px, for large titles
2113
+ - `section-title` - Semibold 16px, for section headers
2114
+ - `section-content` - Normal 14px, for section body text
2115
+ - `attribute-label` - Normal 16px, for attribute labels
2116
+ - `key-value-key` - Semibold 14px, for key-value pair keys
2117
+ - `key-value-value` - Normal 14px, for key-value pair values
2118
+ - `button-label` - Bold 14px, for button text
2119
+ - `chip-label` - Medium 12px, for chip/badge text
2120
+ - `input-label` - Medium 14px, for form input labels
2121
+ - `input-helper` - Normal 12px, for input helper text
2122
+ - `input-text` - Medium 16px, for input field text
2123
+ - `detail-label` - Medium 12px, for detail labels
2124
+ - `detail-subtext` - Normal 12px, for detail subtext
2125
+ - `table-header` - Light 12px, for table headers
2126
+ - `table-cell` - Normal 14px, for table cells
2127
+ - `list-button-label` - Normal 20px, for list button labels
2128
+
2129
+ #### Available Typography Colors
2130
+ - `primary` - Primary text color (text-text-primary)
2131
+ - `muted` - Muted text color (text-text-muted)
2132
+ - `error` - Error/destructive text color (text-destructive)
2133
+ - `secondary` - Secondary foreground color (text-secondary-foreground)
2134
+
2135
+ #### When Typography Component Cannot Be Used
2136
+ In 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`:
2137
+
2138
+ ```tsx
2139
+ import { typographyVariants } from "@/components/base/typography";
2140
+ import { cn } from "@/utils/cn";
2141
+
2142
+ <SomeComponent
2143
+ className={cn(typographyVariants({ variant: "section-title", color: "primary" }))}
2144
+ />
2145
+ ```
2146
+
2147
+ #### Typography Props
2148
+ - `variant` - The typography variant to use (required for consistent styling)
2149
+ - `color` - The text color (defaults to primary if not specified)
2150
+ - `as` - The HTML element to render (p, span, div, h1-h6, li, pre, code, td, th)
2151
+ - `italic` - Boolean flag to apply italic styling
2152
+ - `className` - Additional custom classes (use sparingly)
2153
+ - `onClick` - Click handler (will add cursor-pointer automatically)
2154
+ - `testId` - Test ID for testing purposes
2155
+
2156
+ #### Examples
2157
+ ```tsx
2158
+ // Section header
2159
+ <Typography variant="section-title" color="primary">
2160
+ User Information
2161
+ </Typography>
2162
+
2163
+ // Body text
2164
+ <Typography variant="section-content" color="muted">
2165
+ This is the description text.
2166
+ </Typography>
2167
+
2168
+ // Error message
2169
+ <Typography variant="input-helper" color="error">
2170
+ This field is required
2171
+ </Typography>
2172
+
2173
+ // Custom element with typography styles
2174
+ <Typography variant="header" as="h1">
2175
+ Page Title
2176
+ </Typography>
2177
+
2178
+ // When Typography component cannot be used
2179
+ <CustomButton
2180
+ className={cn(typographyVariants({ variant: "button-label", color: "primary" }))}
2181
+ >
2182
+ Click Me
2183
+ </CustomButton>
2184
+ ```
2185
+
2186
+ ## Project Structure
2187
+
2188
+ ### Directory Organization
2189
+ ```
2190
+ src/
2191
+ ├── assets/ # All static assets
2192
+ ├── components/ # All reusable components
2193
+ │ └── base/ # Basic building blocks (buttons, accordions, etc.)
2194
+ │ └── shadcn/ # Shadcn registry components (DO NOT modify or export)
2195
+ ├── hooks/ # Application-wide hooks
2196
+ │ └── api/ # API interaction and TanStack Query hooks
2197
+ └── pages/ # Full page components
2198
+ ```
2199
+
2200
+ ### Component Structure
2201
+
2202
+ #### Simple Components
2203
+ Simple, atomic components (like buttons) can be a single file:
2204
+ ```
2205
+ button.tsx
2206
+ ```
2207
+
2208
+ #### Complex Components
2209
+ Complex components should be organized in directories with subcomponents:
2210
+ ```
2211
+ Select/
2212
+ ├── index.tsx # Main component, exports only what consumers need
2213
+ ├── hooks/ # Component-specific hooks
2214
+ ├── utils/ # Component-specific utilities
2215
+ └── SelectOption.tsx # Sub-components
2216
+ ```
2217
+
2218
+ ### Component Placement
2219
+ - Even single-use components should go in `src/components/` if not obviously scoped to a single page
2220
+ - Keep components small and composable
2221
+ - Avoid code duplication within components
2222
+
2223
+ ## React and TypeScript
2224
+
2225
+ ### Component Code Layout
2226
+ All custom (non-shadcn) components should follow this layout:
2227
+
2228
+ ```tsx
2229
+ import * as React from "react";
2230
+
2231
+ type <ComponentName>OwnProps = {
2232
+ // Component-specific props
2233
+ };
2234
+
2235
+ export type <ComponentName>Props = {} & <ComponentName>OwnProps;
2236
+
2237
+ function <ComponentName>Component({}: <ComponentName>Props) {
2238
+ // Component implementation
2239
+ }
2240
+
2241
+ const <ComponentName> = React.memo(<ComponentName>Component);
2242
+
2243
+ export { <ComponentName> };
2244
+ ```
2245
+
2246
+ ### Naming Conventions
2247
+ - **Files**: camelCase (e.g., `loadingContent.tsx`)
2248
+ - **Components**: PascalCase (e.g., `LoadingContent`)
2249
+ - **Index files**: Component takes parent directory name (e.g., `loadingContent/index.tsx` → `LoadingContent`)
2250
+
2251
+ ### Type Imports
2252
+ When using TypeScript with `verbatimModuleSyntax` enabled:
2253
+ - ✅ **CORRECT**: `import type { TypeName } from './module';`
2254
+ - ❌ **WRONG**: `import { TypeName } from './module';` (for types)
2255
+
2256
+ ### Hook Usage
2257
+ - Use hooks and custom hooks as needed
2258
+ - **Avoid `useRef` and `useEffect` unless absolutely necessary** - they can introduce bugs and hard-to-reason render cycles
2259
+ - When needing `useEffect`, consider using hooks from [react-use](https://github.com/streamich/react-use) for more direct, obvious, and opinionated code flow
2260
+
2261
+ ### Navigation
2262
+ - Always use `void navigate()` to handle promise returns from React Router
2263
+ - Mark button types explicitly: `<button type="button">`
2264
+
2265
+ ### Shadcn Components
2266
+ **CRITICAL**: Shadcn components live in `src/components/base/shadcn/` and have strict usage rules:
2267
+
2268
+ - ❌ **NEVER** modify shadcn components
2269
+ - ❌ **NEVER** export shadcn components from `src/components/base/`
2270
+ - ❌ **NEVER** import shadcn components directly outside of `src/components/base/`
2271
+ - ✅ **ALWAYS** create a wrapper in `src/components/base/` for shadcn components before using them
2272
+
2273
+ Example:
2274
+ ```tsx
2275
+ // src/components/base/button.tsx
2276
+ import { Button as ShadcnButton } from "./shadcn/button";
2277
+
2278
+ export function Button(props) {
2279
+ return <ShadcnButton {...props} />;
2280
+ }
2281
+ ```
2282
+
2283
+ ## General Code Quality
2284
+ - Follow existing patterns in the codebase
2285
+ - Use memoization for expensive computations
2286
+ - Ensure accessibility (ARIA labels, semantic HTML)
2287
+ - Test mobile responsiveness for all UI components13:["$","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"}]]}],["$","$L2",null,{"content":"$1a","previewLines":8}]]}]
2288
+ 1b:T6de,# Claude Development Rules
2289
+
2290
+ ## Component Organization
2291
+
2292
+ ### Multiple Components Per File
2293
+
2294
+ **Rule**: Do not place multiple components in the same file. Each component should be organized into its own directory structure.
2295
+
2296
+ **Structure**: When a component contains sub-components or helper functions:
2297
+
2298
+ 1. Create a directory with the component name
2299
+ 2. Create an `index.tsx` file for the main component export
2300
+ 3. Create separate files for each sub-component
2301
+ 4. Create a `utils.ts` file for helper functions and utilities
2302
+
2303
+ **Example**:
2304
+
2305
+ ```
2306
+ ComponentName/
2307
+ ├── index.tsx # Main component export
2308
+ ├── SubComponentA.tsx # Sub-component A
2309
+ ├── SubComponentB.tsx # Sub-component B
2310
+ └── utils.ts # Helper functions
2311
+ ```
2312
+
2313
+ **Benefits**:
2314
+
2315
+ - Improved code organization and maintainability
2316
+ - Easier to locate and modify specific components
2317
+ - Better separation of concerns
2318
+ - Cleaner git diffs and easier code reviews
2319
+ - Simpler testing of individual components
2320
+
2321
+ **Bad Example** ❌:
2322
+
2323
+ ```tsx
2324
+ // MyModal.tsx
2325
+ export function MyModal() { ... }
2326
+ function ModalHeader() { ... }
2327
+ function ModalBody() { ... }
2328
+ function formatDate() { ... }
2329
+ ```
2330
+
2331
+ **Good Example** ✅:
2332
+
2333
+ ```
2334
+ MyModal/
2335
+ ├── index.tsx # exports MyModal
2336
+ ├── ModalHeader.tsx # exports ModalHeader
2337
+ ├── ModalBody.tsx # exports ModalBody
2338
+ └── utils.ts # exports formatDate
2339
+ ```
2340
+
2341
+ ## Logging and Event Tracking
2342
+
2343
+ **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.14:["$","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"}]]}],["$","$L2",null,{"content":"$1b","previewLines":8}]]}]
2344
+ 18:null