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