@farm.js/core 0.1.0-beta.6 → 0.1.0-beta.8

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 (447) hide show
  1. package/dist/after.cjs +227 -0
  2. package/dist/after.cjs.map +1 -0
  3. package/dist/after.d.mts +25 -0
  4. package/dist/after.d.ts +25 -0
  5. package/dist/after.mjs +14 -0
  6. package/dist/after.mjs.map +1 -0
  7. package/dist/agent-runtime.cjs +2379 -0
  8. package/dist/agent-runtime.cjs.map +1 -0
  9. package/dist/agent-runtime.d.mts +94 -0
  10. package/dist/agent-runtime.d.ts +94 -0
  11. package/dist/agent-runtime.mjs +479 -0
  12. package/dist/agent-runtime.mjs.map +1 -0
  13. package/dist/api/route-manager.d.mts +66 -0
  14. package/dist/api/route-manager.d.ts +66 -0
  15. package/dist/api/runtime.d.mts +3 -0
  16. package/dist/api/runtime.d.ts +3 -0
  17. package/dist/api.cjs +4100 -0
  18. package/dist/api.cjs.map +1 -0
  19. package/dist/api.d.mts +48 -0
  20. package/dist/api.d.ts +48 -0
  21. package/dist/api.mjs +93 -0
  22. package/dist/api.mjs.map +1 -0
  23. package/dist/app-BWtqQu3R.d.mts +302 -0
  24. package/dist/app-markdown.cjs +244 -0
  25. package/dist/app-markdown.cjs.map +1 -0
  26. package/dist/app-markdown.d.mts +22 -0
  27. package/dist/app-markdown.d.ts +22 -0
  28. package/dist/app-markdown.mjs +27 -0
  29. package/dist/app-markdown.mjs.map +1 -0
  30. package/dist/app-xltejvLY.d.ts +302 -0
  31. package/dist/cache.cjs +945 -0
  32. package/dist/cache.cjs.map +1 -0
  33. package/dist/cache.d.mts +192 -0
  34. package/dist/cache.d.ts +192 -0
  35. package/dist/cache.mjs +46 -0
  36. package/dist/cache.mjs.map +1 -0
  37. package/dist/chunk-2ED5Q2GH.mjs +422 -0
  38. package/dist/chunk-2ED5Q2GH.mjs.map +1 -0
  39. package/dist/chunk-32W4QEJP.mjs +158 -0
  40. package/dist/chunk-32W4QEJP.mjs.map +1 -0
  41. package/dist/chunk-3XNTL3FQ.mjs +452 -0
  42. package/dist/chunk-3XNTL3FQ.mjs.map +1 -0
  43. package/dist/chunk-44ZCFSKE.mjs +84 -0
  44. package/dist/chunk-44ZCFSKE.mjs.map +1 -0
  45. package/dist/chunk-4MGVSBRP.mjs +7787 -0
  46. package/dist/chunk-4MGVSBRP.mjs.map +1 -0
  47. package/dist/chunk-4S3ORGFA.mjs +44 -0
  48. package/dist/chunk-4S3ORGFA.mjs.map +1 -0
  49. package/dist/chunk-5BY76U2M.mjs +1 -0
  50. package/dist/chunk-5BY76U2M.mjs.map +1 -0
  51. package/dist/chunk-5ZGPRGWV.mjs +136 -0
  52. package/dist/chunk-5ZGPRGWV.mjs.map +1 -0
  53. package/dist/chunk-65A7QIKI.mjs +142 -0
  54. package/dist/chunk-65A7QIKI.mjs.map +1 -0
  55. package/dist/chunk-74YTBPTY.mjs +450 -0
  56. package/dist/chunk-74YTBPTY.mjs.map +1 -0
  57. package/dist/chunk-7FBJLMQH.mjs +338 -0
  58. package/dist/chunk-7FBJLMQH.mjs.map +1 -0
  59. package/dist/chunk-7HO6AEOP.mjs +74 -0
  60. package/dist/chunk-7HO6AEOP.mjs.map +1 -0
  61. package/dist/chunk-7MABZJIM.mjs +29 -0
  62. package/dist/chunk-7MABZJIM.mjs.map +1 -0
  63. package/dist/chunk-7N62DNSO.mjs +41 -0
  64. package/dist/chunk-7N62DNSO.mjs.map +1 -0
  65. package/dist/chunk-7ZY5AIJO.mjs +161 -0
  66. package/dist/chunk-7ZY5AIJO.mjs.map +1 -0
  67. package/dist/chunk-ALCLXXTY.mjs +187 -0
  68. package/dist/chunk-ALCLXXTY.mjs.map +1 -0
  69. package/dist/chunk-AZ7YUVNR.mjs +65 -0
  70. package/dist/chunk-AZ7YUVNR.mjs.map +1 -0
  71. package/dist/chunk-B232I2GP.mjs +163 -0
  72. package/dist/chunk-B232I2GP.mjs.map +1 -0
  73. package/dist/chunk-B4W3BNTL.mjs +483 -0
  74. package/dist/chunk-B4W3BNTL.mjs.map +1 -0
  75. package/dist/chunk-C2ROET2V.mjs +718 -0
  76. package/dist/chunk-C2ROET2V.mjs.map +1 -0
  77. package/dist/chunk-CGILA3WO.mjs +14 -0
  78. package/dist/chunk-CGILA3WO.mjs.map +1 -0
  79. package/dist/chunk-CGIXMLSY.mjs +184 -0
  80. package/dist/chunk-CGIXMLSY.mjs.map +1 -0
  81. package/dist/chunk-DJSGLHCN.mjs +597 -0
  82. package/dist/chunk-DJSGLHCN.mjs.map +1 -0
  83. package/dist/chunk-E2MPIBRE.mjs +149 -0
  84. package/dist/chunk-E2MPIBRE.mjs.map +1 -0
  85. package/dist/chunk-E6EPN5BT.mjs +203 -0
  86. package/dist/chunk-E6EPN5BT.mjs.map +1 -0
  87. package/dist/chunk-EI43C4RA.mjs +6277 -0
  88. package/dist/chunk-EI43C4RA.mjs.map +1 -0
  89. package/dist/chunk-EJ7T4TPB.mjs +622 -0
  90. package/dist/chunk-EJ7T4TPB.mjs.map +1 -0
  91. package/dist/chunk-FQYDHKKU.mjs +128 -0
  92. package/dist/chunk-FQYDHKKU.mjs.map +1 -0
  93. package/dist/chunk-FRPWCMMG.mjs +299 -0
  94. package/dist/chunk-FRPWCMMG.mjs.map +1 -0
  95. package/dist/chunk-GN72QAIH.mjs +146 -0
  96. package/dist/chunk-GN72QAIH.mjs.map +1 -0
  97. package/dist/chunk-GQVGIUSN.mjs +149 -0
  98. package/dist/chunk-GQVGIUSN.mjs.map +1 -0
  99. package/dist/chunk-GS6K5OCM.mjs +407 -0
  100. package/dist/chunk-GS6K5OCM.mjs.map +1 -0
  101. package/dist/chunk-GXASWWJU.mjs +364 -0
  102. package/dist/chunk-GXASWWJU.mjs.map +1 -0
  103. package/dist/chunk-GY2STC2S.mjs +180 -0
  104. package/dist/chunk-GY2STC2S.mjs.map +1 -0
  105. package/dist/chunk-H2FA2SBS.mjs +51 -0
  106. package/dist/chunk-H2FA2SBS.mjs.map +1 -0
  107. package/dist/chunk-I4CUBGVF.mjs +93 -0
  108. package/dist/chunk-I4CUBGVF.mjs.map +1 -0
  109. package/dist/chunk-ITN462YM.mjs +98 -0
  110. package/dist/chunk-ITN462YM.mjs.map +1 -0
  111. package/dist/chunk-J23HNLFY.mjs +72 -0
  112. package/dist/chunk-J23HNLFY.mjs.map +1 -0
  113. package/dist/chunk-J4FNJ5IU.mjs +179 -0
  114. package/dist/chunk-J4FNJ5IU.mjs.map +1 -0
  115. package/dist/chunk-J5YWQVI5.mjs +211 -0
  116. package/dist/chunk-J5YWQVI5.mjs.map +1 -0
  117. package/dist/chunk-JDEOUK5V.mjs +427 -0
  118. package/dist/chunk-JDEOUK5V.mjs.map +1 -0
  119. package/dist/chunk-JK25YEN6.mjs +219 -0
  120. package/dist/chunk-JK25YEN6.mjs.map +1 -0
  121. package/dist/chunk-K4667E2Q.mjs +1916 -0
  122. package/dist/chunk-K4667E2Q.mjs.map +1 -0
  123. package/dist/chunk-LGHEOHBU.mjs +218 -0
  124. package/dist/chunk-LGHEOHBU.mjs.map +1 -0
  125. package/dist/chunk-LM2YNO4U.mjs +24 -0
  126. package/dist/chunk-LM2YNO4U.mjs.map +1 -0
  127. package/dist/chunk-ME4MO2RJ.mjs +3540 -0
  128. package/dist/chunk-ME4MO2RJ.mjs.map +1 -0
  129. package/dist/chunk-MIUW47JX.mjs +639 -0
  130. package/dist/chunk-MIUW47JX.mjs.map +1 -0
  131. package/dist/chunk-NNLCAVB6.mjs +391 -0
  132. package/dist/chunk-NNLCAVB6.mjs.map +1 -0
  133. package/dist/chunk-P7QDS5AT.mjs +191 -0
  134. package/dist/chunk-P7QDS5AT.mjs.map +1 -0
  135. package/dist/chunk-PFE6GMNE.mjs +603 -0
  136. package/dist/chunk-PFE6GMNE.mjs.map +1 -0
  137. package/dist/chunk-QGOHVJ6J.mjs +63 -0
  138. package/dist/chunk-QGOHVJ6J.mjs.map +1 -0
  139. package/dist/chunk-QKVUNGAH.mjs +39 -0
  140. package/dist/chunk-QKVUNGAH.mjs.map +1 -0
  141. package/dist/chunk-QM746KUO.mjs +56 -0
  142. package/dist/chunk-QM746KUO.mjs.map +1 -0
  143. package/dist/chunk-QTZZ2ISQ.mjs +753 -0
  144. package/dist/chunk-QTZZ2ISQ.mjs.map +1 -0
  145. package/dist/chunk-RBRLLZL5.mjs +81 -0
  146. package/dist/chunk-RBRLLZL5.mjs.map +1 -0
  147. package/dist/chunk-RHIFZZUI.mjs +69 -0
  148. package/dist/chunk-RHIFZZUI.mjs.map +1 -0
  149. package/dist/chunk-RQ633A5I.mjs +187 -0
  150. package/dist/chunk-RQ633A5I.mjs.map +1 -0
  151. package/dist/chunk-SCFX4UTD.mjs +28 -0
  152. package/dist/chunk-SCFX4UTD.mjs.map +1 -0
  153. package/dist/chunk-SL6HTIOK.mjs +66 -0
  154. package/dist/chunk-SL6HTIOK.mjs.map +1 -0
  155. package/dist/chunk-SPBBQLXI.mjs +207 -0
  156. package/dist/chunk-SPBBQLXI.mjs.map +1 -0
  157. package/dist/chunk-SSA7THPX.mjs +10 -0
  158. package/dist/chunk-SSA7THPX.mjs.map +1 -0
  159. package/dist/chunk-T4QJQK76.mjs +459 -0
  160. package/dist/chunk-T4QJQK76.mjs.map +1 -0
  161. package/dist/chunk-TQAEEJB4.mjs +157 -0
  162. package/dist/chunk-TQAEEJB4.mjs.map +1 -0
  163. package/dist/chunk-UB5UOSHB.mjs +458 -0
  164. package/dist/chunk-UB5UOSHB.mjs.map +1 -0
  165. package/dist/chunk-USWZZUEH.mjs +25 -0
  166. package/dist/chunk-USWZZUEH.mjs.map +1 -0
  167. package/dist/chunk-UVCIEUJC.mjs +16 -0
  168. package/dist/chunk-UVCIEUJC.mjs.map +1 -0
  169. package/dist/chunk-UXUAWNO5.mjs +396 -0
  170. package/dist/chunk-UXUAWNO5.mjs.map +1 -0
  171. package/dist/chunk-V3XURYJO.mjs +756 -0
  172. package/dist/chunk-V3XURYJO.mjs.map +1 -0
  173. package/dist/chunk-V6WE6JSZ.mjs +352 -0
  174. package/dist/chunk-V6WE6JSZ.mjs.map +1 -0
  175. package/dist/chunk-V7RBCSDJ.mjs +170 -0
  176. package/dist/chunk-V7RBCSDJ.mjs.map +1 -0
  177. package/dist/chunk-VCANOYFI.mjs +588 -0
  178. package/dist/chunk-VCANOYFI.mjs.map +1 -0
  179. package/dist/chunk-VY2UYN5R.mjs +224 -0
  180. package/dist/chunk-VY2UYN5R.mjs.map +1 -0
  181. package/dist/chunk-W2CRQFF6.mjs +1352 -0
  182. package/dist/chunk-W2CRQFF6.mjs.map +1 -0
  183. package/dist/chunk-WDU6QXNK.mjs +872 -0
  184. package/dist/chunk-WDU6QXNK.mjs.map +1 -0
  185. package/dist/chunk-WZ5QFROO.mjs +23 -0
  186. package/dist/chunk-WZ5QFROO.mjs.map +1 -0
  187. package/dist/chunk-XIVV5IWN.mjs +541 -0
  188. package/dist/chunk-XIVV5IWN.mjs.map +1 -0
  189. package/dist/chunk-YW7OBE6Q.mjs +119 -0
  190. package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
  191. package/dist/chunk-Z5CQMP54.mjs +365 -0
  192. package/dist/chunk-Z5CQMP54.mjs.map +1 -0
  193. package/dist/chunk-ZBE6MLHL.mjs +230 -0
  194. package/dist/chunk-ZBE6MLHL.mjs.map +1 -0
  195. package/dist/chunk-ZVWA4ZQ3.mjs +189 -0
  196. package/dist/chunk-ZVWA4ZQ3.mjs.map +1 -0
  197. package/dist/chunk-ZZ57EH5Z.mjs +173 -0
  198. package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
  199. package/dist/client-BT1mFQas.d.mts +447 -0
  200. package/dist/client-Nn0q4eO4.d.ts +447 -0
  201. package/dist/client-cache-CIlyBlmx.d.ts +6 -0
  202. package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
  203. package/dist/client-plugins-BI2R6Eae.d.mts +1926 -0
  204. package/dist/client-plugins-DU9oMspX.d.ts +1926 -0
  205. package/dist/client-plugins.cjs +415 -0
  206. package/dist/client-plugins.cjs.map +1 -0
  207. package/dist/client-plugins.d.mts +22 -0
  208. package/dist/client-plugins.d.ts +22 -0
  209. package/dist/client-plugins.mjs +10 -0
  210. package/dist/client-plugins.mjs.map +1 -0
  211. package/dist/client.cjs +5402 -0
  212. package/dist/client.cjs.map +1 -0
  213. package/dist/client.d.mts +447 -0
  214. package/dist/client.d.ts +447 -0
  215. package/dist/client.mjs +110 -0
  216. package/dist/client.mjs.map +1 -0
  217. package/dist/config.cjs +38 -0
  218. package/dist/config.cjs.map +1 -0
  219. package/dist/config.d.mts +29 -0
  220. package/dist/config.d.ts +29 -0
  221. package/dist/config.mjs +10 -0
  222. package/dist/config.mjs.map +1 -0
  223. package/dist/cron.cjs +406 -0
  224. package/dist/cron.cjs.map +1 -0
  225. package/dist/cron.d.mts +78 -0
  226. package/dist/cron.d.ts +78 -0
  227. package/dist/cron.mjs +30 -0
  228. package/dist/cron.mjs.map +1 -0
  229. package/dist/deferred.cjs +438 -0
  230. package/dist/deferred.cjs.map +1 -0
  231. package/dist/deferred.d.mts +42 -0
  232. package/dist/deferred.d.ts +42 -0
  233. package/dist/deferred.mjs +28 -0
  234. package/dist/deferred.mjs.map +1 -0
  235. package/dist/deployment.cjs +199 -0
  236. package/dist/deployment.cjs.map +1 -0
  237. package/dist/deployment.d.mts +34 -0
  238. package/dist/deployment.d.ts +34 -0
  239. package/dist/deployment.mjs +38 -0
  240. package/dist/deployment.mjs.map +1 -0
  241. package/dist/devtools-REQTS3I7.mjs +371 -0
  242. package/dist/devtools-REQTS3I7.mjs.map +1 -0
  243. package/dist/devtools-client-3XRTBND5.mjs +216 -0
  244. package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
  245. package/dist/devtools-ui-NJKFORTG.mjs +1349 -0
  246. package/dist/devtools-ui-NJKFORTG.mjs.map +1 -0
  247. package/dist/docs.cjs +5548 -0
  248. package/dist/docs.cjs.map +1 -0
  249. package/dist/docs.d.mts +69 -0
  250. package/dist/docs.d.ts +69 -0
  251. package/dist/docs.mjs +47 -0
  252. package/dist/docs.mjs.map +1 -0
  253. package/dist/env-types.cjs +232 -0
  254. package/dist/env-types.cjs.map +1 -0
  255. package/dist/env-types.d.mts +12 -0
  256. package/dist/env-types.d.ts +12 -0
  257. package/dist/env-types.mjs +11 -0
  258. package/dist/env-types.mjs.map +1 -0
  259. package/dist/env.cjs +215 -0
  260. package/dist/env.cjs.map +1 -0
  261. package/dist/env.d.mts +45 -0
  262. package/dist/env.d.ts +45 -0
  263. package/dist/env.mjs +22 -0
  264. package/dist/env.mjs.map +1 -0
  265. package/dist/environment/vite.d.mts +22 -0
  266. package/dist/environment/vite.d.ts +22 -0
  267. package/dist/environment.cjs +96 -0
  268. package/dist/environment.cjs.map +1 -0
  269. package/dist/environment.d.mts +18 -0
  270. package/dist/environment.d.ts +18 -0
  271. package/dist/environment.mjs +14 -0
  272. package/dist/environment.mjs.map +1 -0
  273. package/dist/headers.cjs +126 -0
  274. package/dist/headers.cjs.map +1 -0
  275. package/dist/headers.d.mts +22 -0
  276. package/dist/headers.d.ts +22 -0
  277. package/dist/headers.mjs +12 -0
  278. package/dist/headers.mjs.map +1 -0
  279. package/dist/i18n/client.d.mts +32 -0
  280. package/dist/i18n/client.d.ts +32 -0
  281. package/dist/i18n/index.d.mts +20 -0
  282. package/dist/i18n/index.d.ts +20 -0
  283. package/dist/i18n/server.d.mts +30 -0
  284. package/dist/i18n/server.d.ts +30 -0
  285. package/dist/image/server.d.mts +37 -0
  286. package/dist/image/server.d.ts +37 -0
  287. package/dist/image/sharp.d.mts +7 -0
  288. package/dist/image/sharp.d.ts +7 -0
  289. package/dist/image-config-Duob7wER.d.mts +50 -0
  290. package/dist/image-config-Duob7wER.d.ts +50 -0
  291. package/dist/image.cjs +209 -0
  292. package/dist/image.cjs.map +1 -0
  293. package/dist/image.d.mts +39 -0
  294. package/dist/image.d.ts +39 -0
  295. package/dist/image.mjs +165 -0
  296. package/dist/image.mjs.map +1 -0
  297. package/dist/index.cjs +42186 -0
  298. package/dist/index.cjs.map +1 -0
  299. package/dist/index.d.mts +454 -0
  300. package/dist/index.d.ts +454 -0
  301. package/dist/index.mjs +980 -0
  302. package/dist/index.mjs.map +1 -0
  303. package/dist/integration-api-CHT2OKAf.d.mts +93 -0
  304. package/dist/integration-api-CHT2OKAf.d.ts +93 -0
  305. package/dist/integration-orm-GQLGU66X.mjs +13 -0
  306. package/dist/integration-orm-GQLGU66X.mjs.map +1 -0
  307. package/dist/integrations.cjs +2820 -0
  308. package/dist/integrations.cjs.map +1 -0
  309. package/dist/integrations.d.mts +22 -0
  310. package/dist/integrations.d.ts +22 -0
  311. package/dist/integrations.mjs +51 -0
  312. package/dist/integrations.mjs.map +1 -0
  313. package/dist/internal/build-runtime.cjs +643 -322
  314. package/dist/internal/build-runtime.cjs.map +1 -1
  315. package/dist/internal/build-runtime.d.mts +39 -0
  316. package/dist/internal/build-runtime.d.ts +39 -0
  317. package/dist/internal/build-runtime.mjs +11 -10
  318. package/dist/internal/client-runtime.d.mts +2 -0
  319. package/dist/internal/client-runtime.d.ts +2 -0
  320. package/dist/internal/config-runtime.cjs +135 -39
  321. package/dist/internal/config-runtime.cjs.map +1 -1
  322. package/dist/internal/config-runtime.d.mts +39 -0
  323. package/dist/internal/config-runtime.d.ts +39 -0
  324. package/dist/internal/config-runtime.mjs +5 -4
  325. package/dist/internal/production-node-env.d.mts +12 -0
  326. package/dist/internal/production-node-env.d.ts +12 -0
  327. package/dist/internal/production-runtime.d.mts +39 -0
  328. package/dist/internal/production-runtime.d.ts +39 -0
  329. package/dist/layers-VWVDTPUZ.mjs +16 -0
  330. package/dist/layers-VWVDTPUZ.mjs.map +1 -0
  331. package/dist/manager-THKFTOFE.mjs +10 -0
  332. package/dist/manager-THKFTOFE.mjs.map +1 -0
  333. package/dist/markdown.cjs +364 -0
  334. package/dist/markdown.cjs.map +1 -0
  335. package/dist/markdown.d.mts +60 -0
  336. package/dist/markdown.d.ts +60 -0
  337. package/dist/markdown.mjs +18 -0
  338. package/dist/markdown.mjs.map +1 -0
  339. package/dist/metadata-Cm9ujH4I.d.ts +22 -0
  340. package/dist/metadata-DacXbnLA.d.mts +22 -0
  341. package/dist/middleware.cjs +2148 -0
  342. package/dist/middleware.cjs.map +1 -0
  343. package/dist/middleware.d.mts +164 -0
  344. package/dist/middleware.d.ts +164 -0
  345. package/dist/middleware.mjs +49 -0
  346. package/dist/middleware.mjs.map +1 -0
  347. package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
  348. package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
  349. package/dist/navigation.cjs +1329 -0
  350. package/dist/navigation.cjs.map +1 -0
  351. package/dist/navigation.d.mts +14 -0
  352. package/dist/navigation.d.ts +14 -0
  353. package/dist/navigation.mjs +33 -0
  354. package/dist/navigation.mjs.map +1 -0
  355. package/dist/nitro-QO5LV6QK.mjs +689 -0
  356. package/dist/nitro-QO5LV6QK.mjs.map +1 -0
  357. package/dist/observability.cjs +186 -0
  358. package/dist/observability.cjs.map +1 -0
  359. package/dist/observability.d.mts +335 -0
  360. package/dist/observability.d.ts +335 -0
  361. package/dist/observability.mjs +16 -0
  362. package/dist/observability.mjs.map +1 -0
  363. package/dist/params-BALtrRim.d.ts +15 -0
  364. package/dist/params-ry-lxqmy.d.mts +15 -0
  365. package/dist/plugin-BJDf43dc.d.mts +165 -0
  366. package/dist/plugin-BJDf43dc.d.ts +165 -0
  367. package/dist/plugin.cjs +23470 -0
  368. package/dist/plugin.cjs.map +1 -1
  369. package/dist/plugin.d.mts +22 -0
  370. package/dist/plugin.d.ts +22 -0
  371. package/dist/plugin.mjs +8 -7
  372. package/dist/production-runtime-4KKq1AVC.d.mts +79 -0
  373. package/dist/production-runtime-C_B79w2P.d.mts +28 -0
  374. package/dist/production-runtime-DDEM1D2q.d.ts +28 -0
  375. package/dist/production-runtime-DRsWDN2x.d.ts +79 -0
  376. package/dist/query/client.d.mts +61 -0
  377. package/dist/query/client.d.ts +61 -0
  378. package/dist/query/index.d.mts +90 -0
  379. package/dist/query/index.d.ts +90 -0
  380. package/dist/query/parsers.d.mts +25 -0
  381. package/dist/query/parsers.d.ts +25 -0
  382. package/dist/query/server.d.mts +55 -0
  383. package/dist/query/server.d.ts +55 -0
  384. package/dist/request-Dsq4kGW0.d.mts +6 -0
  385. package/dist/request-udtobOLv.d.ts +6 -0
  386. package/dist/request.d.mts +2 -0
  387. package/dist/request.d.ts +2 -0
  388. package/dist/resolver-DJqjLMg_.d.mts +14 -0
  389. package/dist/resolver-IH4RmPEl.d.ts +14 -0
  390. package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
  391. package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
  392. package/dist/router.d.mts +36 -0
  393. package/dist/router.d.ts +36 -0
  394. package/dist/routes.d.mts +224 -0
  395. package/dist/routes.d.ts +224 -0
  396. package/dist/runtime-9nQjVM7X.d.mts +206 -0
  397. package/dist/runtime-Cxpq6xZN.d.mts +27 -0
  398. package/dist/runtime-DgeS2skB.d.ts +206 -0
  399. package/dist/runtime-bv63eUiO.d.ts +27 -0
  400. package/dist/server-action-security.d.mts +43 -0
  401. package/dist/server-action-security.d.ts +43 -0
  402. package/dist/server-fn-client.d.mts +32 -0
  403. package/dist/server-fn-client.d.ts +32 -0
  404. package/dist/server-fn.d.mts +93 -0
  405. package/dist/server-fn.d.ts +93 -0
  406. package/dist/server-plugins.d.mts +55 -0
  407. package/dist/server-plugins.d.ts +55 -0
  408. package/dist/server-query-client.d.mts +50 -0
  409. package/dist/server-query-client.d.ts +50 -0
  410. package/dist/server-query.d.mts +36 -0
  411. package/dist/server-query.d.ts +36 -0
  412. package/dist/server.cjs +731 -447
  413. package/dist/server.cjs.map +1 -1
  414. package/dist/server.d.mts +48 -0
  415. package/dist/server.d.ts +48 -0
  416. package/dist/server.mjs +9 -8
  417. package/dist/server.mjs.map +1 -1
  418. package/dist/storage.d.mts +52 -0
  419. package/dist/storage.d.ts +52 -0
  420. package/dist/testing.d.mts +101 -0
  421. package/dist/testing.d.ts +101 -0
  422. package/dist/transport-BmbGTXA5.d.mts +49 -0
  423. package/dist/transport-BmbGTXA5.d.ts +49 -0
  424. package/dist/types-BMxWr97v.d.mts +81 -0
  425. package/dist/types-BMxWr97v.d.ts +81 -0
  426. package/dist/types-C9N-nk5R.d.mts +53 -0
  427. package/dist/types-C9N-nk5R.d.ts +53 -0
  428. package/dist/types-D1A6-XvH.d.mts +73 -0
  429. package/dist/types-D1A6-XvH.d.ts +73 -0
  430. package/dist/utils-B-cUHwoK.d.ts +23 -0
  431. package/dist/utils-Cm41AefV.d.mts +23 -0
  432. package/dist/version.cjs +1 -1
  433. package/dist/version.cjs.map +1 -1
  434. package/dist/version.d.mts +3 -0
  435. package/dist/version.d.ts +3 -0
  436. package/dist/version.mjs +1 -1
  437. package/dist/vite.cjs +682 -437
  438. package/dist/vite.cjs.map +1 -1
  439. package/dist/vite.d.mts +22 -0
  440. package/dist/vite.d.ts +22 -0
  441. package/dist/vite.mjs +6 -5
  442. package/dist/workflows.d.mts +110 -0
  443. package/dist/workflows.d.ts +110 -0
  444. package/package.json +3 -2
  445. package/types/client.d.ts +1 -1
  446. package/types/image.d.ts +4 -0
  447. package/types/images.d.ts +59 -0
@@ -0,0 +1,1349 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-CGILA3WO.mjs";
4
+
5
+ // src/devtools-ui.ts
6
+ var ICON_PATHS = {
7
+ activity: '<path d="M22 12h-4l-3 9L9 3l-3 9H2"/>',
8
+ api: '<path d="M8 3H7a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2 2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1"/><path d="M16 3h1a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2 2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-1"/>',
9
+ app: '<path d="M15 3h6v6"/><path d="M10 14 21 3"/><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>',
10
+ blocks: '<rect width="7" height="7" x="3" y="3"/><rect width="7" height="7" x="14" y="3"/><rect width="7" height="7" x="14" y="14"/><rect width="7" height="7" x="3" y="14"/>',
11
+ book: '<path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/>',
12
+ clock: '<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/>',
13
+ chevron: '<path d="m9 18 6-6-6-6"/>',
14
+ close: '<path d="M18 6 6 18M6 6l12 12"/>',
15
+ copy: '<rect width="14" height="14" x="8" y="8"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>',
16
+ database: '<ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5v14c0 1.7 4 3 9 3s9-1.3 9-3V5"/><path d="M3 12c0 1.7 4 3 9 3s9-1.3 9-3"/>',
17
+ external: '<path d="M15 3h6v6"/><path d="M10 14 21 3"/><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>',
18
+ layers: '<path d="m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z"/><path d="m22 12.5-9.17 4.17a2 2 0 0 1-1.66 0L2 12.5"/><path d="m22 17.5-9.17 4.17a2 2 0 0 1-1.66 0L2 17.5"/>',
19
+ overview: '<rect width="7" height="9" x="3" y="3"/><rect width="7" height="5" x="14" y="3"/><rect width="7" height="9" x="14" y="12"/><rect width="7" height="5" x="3" y="16"/>',
20
+ refresh: '<path d="M20 11a8.1 8.1 0 0 0-15.5-2M4 4v5h5"/><path d="M4 13a8.1 8.1 0 0 0 15.5 2M20 20v-5h-5"/>',
21
+ route: '<circle cx="6" cy="19" r="3"/><path d="M9 19h5.5a3.5 3.5 0 0 0 0-7h-5a3.5 3.5 0 0 1 0-7H18"/><circle cx="18" cy="5" r="3"/>',
22
+ runtime: '<rect width="20" height="14" x="2" y="3"/><line x1="8" x2="16" y1="21" y2="21"/><line x1="12" x2="12" y1="17" y2="21"/>',
23
+ search: '<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>',
24
+ shield: '<path d="M20 13c0 5-3.5 7.5-8 9-4.5-1.5-8-4-8-9V5l8-3 8 3z"/><path d="m9 12 2 2 4-4"/>',
25
+ terminal: '<polyline points="4 17 10 11 4 5"/><line x1="12" x2="20" y1="19" y2="19"/>'
26
+ };
27
+ function icon(name, className = "") {
28
+ return `<svg class="icon ${className}" data-lucide="${name}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${ICON_PATHS[name]}</svg>`;
29
+ }
30
+ __name(icon, "icon");
31
+ function escapeHtml(value) {
32
+ return String(value ?? "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
33
+ }
34
+ __name(escapeHtml, "escapeHtml");
35
+ function escapeAttribute(value) {
36
+ return escapeHtml(value).replace(/`/g, "&#96;");
37
+ }
38
+ __name(escapeAttribute, "escapeAttribute");
39
+ function renderBadge(value, tone = "neutral") {
40
+ return `<span class="badge badge-${tone}">${escapeHtml(value)}</span>`;
41
+ }
42
+ __name(renderBadge, "renderBadge");
43
+ function renderRuntime(runtime) {
44
+ if (!runtime) return '<span class="muted">Inherited</span>';
45
+ const details = [
46
+ runtime.regions?.length ? runtime.regions.join(", ") : null,
47
+ runtime.maxDuration ? `${runtime.maxDuration}s` : null
48
+ ].filter(Boolean);
49
+ return `<span class="runtime-value">${renderBadge(runtime.runtime, runtime.runtime)}${details.length ? `<small>${escapeHtml(details.join(" / "))}</small>` : ""}</span>`;
50
+ }
51
+ __name(renderRuntime, "renderRuntime");
52
+ function renderEmpty(title, detail) {
53
+ return `<div class="empty-state">
54
+ ${icon("activity")}
55
+ <strong>${escapeHtml(title)}</strong>
56
+ <span>${escapeHtml(detail)}</span>
57
+ </div>`;
58
+ }
59
+ __name(renderEmpty, "renderEmpty");
60
+ function renderFilter(id, placeholder) {
61
+ return `<label class="filter-control">
62
+ ${icon("search")}
63
+ <span class="sr-only">${escapeHtml(placeholder)}</span>
64
+ <input type="search" placeholder="${escapeAttribute(placeholder)}" data-filter="${escapeAttribute(id)}" autocomplete="off">
65
+ <kbd>/</kbd>
66
+ </label>`;
67
+ }
68
+ __name(renderFilter, "renderFilter");
69
+ function renderDiagnostics(diagnostics) {
70
+ if (diagnostics.length === 0) {
71
+ return `<div class="diagnostic diagnostic-ready">
72
+ <span class="diagnostic-mark">${icon("shield")}</span>
73
+ <div><strong>Framework checks passed</strong><p>Routes and configured systems are internally consistent.</p></div>
74
+ ${renderBadge("ready", "ready")}
75
+ </div>`;
76
+ }
77
+ return diagnostics.map(
78
+ (diagnostic) => `<article class="diagnostic diagnostic-${diagnostic.severity}">
79
+ <span class="diagnostic-mark">${icon(
80
+ diagnostic.severity === "error" ? "activity" : "shield"
81
+ )}</span>
82
+ <div>
83
+ <span class="diagnostic-code">${escapeHtml(diagnostic.code)}</span>
84
+ <strong>${escapeHtml(diagnostic.title)}</strong>
85
+ <p>${escapeHtml(diagnostic.message)}</p>
86
+ ${diagnostic.action ? `<small>${escapeHtml(diagnostic.action)}</small>` : ""}
87
+ </div>
88
+ ${renderBadge(diagnostic.severity, diagnostic.severity)}
89
+ </article>`
90
+ ).join("");
91
+ }
92
+ __name(renderDiagnostics, "renderDiagnostics");
93
+ function renderSystemRows(snapshot) {
94
+ const rows = [
95
+ ["Integrations", snapshot.counts.integrations, "Configured product adapters", "blocks"],
96
+ ["Storage", snapshot.counts.storageMounts, "Root driver and named mounts", "database"],
97
+ ["Cron", snapshot.counts.cronJobs, "Portable scheduled API routes", "clock"],
98
+ ["Workflows", snapshot.counts.workflows, "Discovered workflow modules", "activity"],
99
+ ["Docs", snapshot.docs.enabled ? "On" : "Off", snapshot.docs.entry || "No docs route", "book"]
100
+ ];
101
+ return rows.map(
102
+ ([label, value, detail, rowIcon]) => `<div class="system-row">
103
+ <span class="system-icon">${icon(rowIcon)}</span>
104
+ <div><strong>${escapeHtml(label)}</strong><small>${escapeHtml(detail)}</small></div>
105
+ <span class="system-value">${escapeHtml(value)}</span>
106
+ </div>`
107
+ ).join("");
108
+ }
109
+ __name(renderSystemRows, "renderSystemRows");
110
+ function renderIntegrations(snapshot) {
111
+ if (snapshot.integrations.length === 0) {
112
+ return renderEmpty(
113
+ "No integrations configured",
114
+ "Register product systems through farm.config.ts when the app needs them."
115
+ );
116
+ }
117
+ return `<div class="table-scroll"><table>
118
+ <thead><tr><th>Registry key</th><th>Adapter</th><th>Routes</th><th>Runtime surface</th></tr></thead>
119
+ <tbody>${snapshot.integrations.map(
120
+ (integration) => `<tr>
121
+ <td><code>${escapeHtml(integration.key)}</code><small class="cell-detail">${escapeHtml(
122
+ integration.category
123
+ )}</small></td>
124
+ <td>${escapeHtml(integration.type)}</td>
125
+ <td>${integration.routes.length ? integration.routes.map(
126
+ (route) => `<span class="route-operation"><code>${escapeHtml(
127
+ route.path
128
+ )}</code><small>${escapeHtml(route.methods.join(", "))}</small></span>`
129
+ ).join("") : '<span class="muted">No HTTP routes</span>'}</td>
130
+ <td><span class="runtime-facts">${renderBadge(
131
+ integration.serverRuntime ? "server" : "platform"
132
+ )}<span>${integration.middlewareCount} middleware</span><span>${integration.providerCount} providers</span><span>${integration.schemaModelCount} models</span></span></td>
133
+ </tr>`
134
+ ).join("")}</tbody>
135
+ </table></div>`;
136
+ }
137
+ __name(renderIntegrations, "renderIntegrations");
138
+ function renderMiddleware(snapshot) {
139
+ if (snapshot.middleware.length === 0) {
140
+ return renderEmpty("No middleware configured", "Requests currently enter routes directly.");
141
+ }
142
+ return `<div class="table-scroll"><table>
143
+ <thead><tr><th>Path</th><th>Source</th><th>Handlers</th><th>File</th></tr></thead>
144
+ <tbody>${snapshot.middleware.map(
145
+ (entry) => `<tr><td><code>${escapeHtml(entry.path)}</code></td><td>${renderBadge(
146
+ entry.source
147
+ )}</td><td>${entry.handlerCount}</td><td class="file-cell">${escapeHtml(
148
+ entry.filePath
149
+ )}</td></tr>`
150
+ ).join("")}</tbody>
151
+ </table></div>`;
152
+ }
153
+ __name(renderMiddleware, "renderMiddleware");
154
+ function renderStorage(snapshot) {
155
+ return `<div class="table-scroll"><table>
156
+ <thead><tr><th>Mount</th><th>Driver</th><th>State</th></tr></thead>
157
+ <tbody>${snapshot.storage.map(
158
+ (entry) => `<tr><td><code>${escapeHtml(entry.mount)}</code></td><td>${escapeHtml(
159
+ entry.driver
160
+ )}</td><td>${renderBadge(entry.default ? "default" : "configured")}</td></tr>`
161
+ ).join("")}</tbody>
162
+ </table></div>`;
163
+ }
164
+ __name(renderStorage, "renderStorage");
165
+ function renderCron(snapshot) {
166
+ if (snapshot.cron.length === 0) {
167
+ return renderEmpty(
168
+ "No cron routes configured",
169
+ "Add named schedules under cron in farm.config.ts."
170
+ );
171
+ }
172
+ return `<div class="table-scroll"><table>
173
+ <thead><tr><th>Name</th><th>Schedule (UTC)</th><th>Target</th></tr></thead>
174
+ <tbody>${snapshot.cron.map(
175
+ (job) => `<tr><td><code>${escapeHtml(job.name)}</code></td><td>${job.schedule.map((schedule) => `<code class="schedule">${escapeHtml(schedule)}</code>`).join("")}</td><td><code>${escapeHtml(job.path)}</code></td></tr>`
176
+ ).join("")}</tbody>
177
+ </table></div>`;
178
+ }
179
+ __name(renderCron, "renderCron");
180
+ function renderWorkflows(snapshot) {
181
+ if (snapshot.workflows.length === 0) {
182
+ return renderEmpty(
183
+ "No workflows discovered",
184
+ "Workflow directories are enabled but currently empty."
185
+ );
186
+ }
187
+ return `<div class="table-scroll"><table>
188
+ <thead><tr><th>Workflow</th><th>Schedule</th><th>Endpoint</th><th>Source</th></tr></thead>
189
+ <tbody>${snapshot.workflows.map(
190
+ (workflow) => `<tr><td><code>${escapeHtml(workflow.id)}</code></td><td>${workflow.schedule.length ? workflow.schedule.map((schedule) => `<code>${escapeHtml(schedule)}</code>`).join("") : '<span class="muted">Manual</span>'}</td><td><code>${escapeHtml(workflow.routePath)}</code></td><td class="file-cell">${escapeHtml(
191
+ workflow.filePath
192
+ )}</td></tr>`
193
+ ).join("")}</tbody>
194
+ </table></div>`;
195
+ }
196
+ __name(renderWorkflows, "renderWorkflows");
197
+ function renderFeatureMatrix(snapshot) {
198
+ const features = [
199
+ ["OpenAPI", snapshot.features.openapi],
200
+ ["Markdown", snapshot.features.markdown],
201
+ ["Server components", snapshot.features.serverComponents],
202
+ ["Server actions", snapshot.features.serverActions],
203
+ ["Optimized boundary", snapshot.features.optimizedBoundary],
204
+ ["Observability", snapshot.features.observability]
205
+ ];
206
+ return `<div class="feature-matrix">${features.map(
207
+ ([label, enabled]) => `<div><span>${escapeHtml(label)}</span>${renderBadge(
208
+ enabled ? "enabled" : "disabled",
209
+ enabled ? "ready" : "neutral"
210
+ )}</div>`
211
+ ).join("")}</div>`;
212
+ }
213
+ __name(renderFeatureMatrix, "renderFeatureMatrix");
214
+ function renderEnvironment(snapshot) {
215
+ const renderKeys = /* @__PURE__ */ __name((keys) => keys.length ? `<div class="key-list">${keys.map((key) => `<code>${escapeHtml(key)}</code>`).join("")}</div>` : '<span class="muted">No validated keys</span>', "renderKeys");
216
+ return `<div class="environment-grid">
217
+ <div><span class="mini-label">Server keys</span>${renderKeys(snapshot.environment.server)}</div>
218
+ <div><span class="mini-label">Public keys</span>${renderKeys(snapshot.environment.public)}</div>
219
+ </div>`;
220
+ }
221
+ __name(renderEnvironment, "renderEnvironment");
222
+ function renderLayers(snapshot) {
223
+ if (snapshot.layers.length === 0) {
224
+ return renderEmpty(
225
+ "No layers extended",
226
+ "This project owns its complete route and config surface."
227
+ );
228
+ }
229
+ return `<div class="layer-list">${snapshot.layers.map(
230
+ (layer) => `<div><span>${icon("layers")}<strong>${escapeHtml(
231
+ layer.name
232
+ )}</strong></span><code>${escapeHtml(layer.source)}</code><small>${escapeHtml(
233
+ layer.srcDir
234
+ )}</small></div>`
235
+ ).join("")}</div>`;
236
+ }
237
+ __name(renderLayers, "renderLayers");
238
+ function renderPropertyList(entries) {
239
+ return `<dl class="property-list">${entries.map(([label, value]) => `<div><dt>${escapeHtml(label)}</dt><dd>${value}</dd></div>`).join("")}</dl>`;
240
+ }
241
+ __name(renderPropertyList, "renderPropertyList");
242
+ function renderDetailIntro(label, title, description, detailIcon) {
243
+ return `<div class="detail-intro">
244
+ <span class="detail-icon">${icon(detailIcon)}</span>
245
+ <div><span class="mini-label">${escapeHtml(label)}</span><h2>${escapeHtml(
246
+ title
247
+ )}</h2><p>${escapeHtml(description)}</p></div>
248
+ </div>`;
249
+ }
250
+ __name(renderDetailIntro, "renderDetailIntro");
251
+ function renderInspector(scope, title, entries, filterPlaceholder) {
252
+ if (entries.length === 0) {
253
+ return `<div class="single-pane">
254
+ <header class="pane-header"><strong>${escapeHtml(title)}</strong><span>0 items</span></header>
255
+ ${renderEmpty(`No ${title.toLowerCase()} found`, "Farm has no runtime data for this surface yet.")}
256
+ </div>`;
257
+ }
258
+ return `<div class="split-view" data-inspector="${escapeAttribute(scope)}">
259
+ <section class="pane pane-list">
260
+ <header class="pane-header"><strong>${escapeHtml(title)}</strong><span>${entries.length} ${entries.length === 1 ? "item" : "items"}</span></header>
261
+ ${filterPlaceholder ? `<div class="pane-tools">${renderFilter(scope, filterPlaceholder)}</div>` : ""}
262
+ <div class="pane-scroll inspector-list" data-filter-rows="${escapeAttribute(scope)}">
263
+ ${entries.map(
264
+ (entry, index) => `<button type="button" class="inspector-row" data-detail-trigger="${escapeAttribute(
265
+ scope
266
+ )}" data-detail-id="${escapeAttribute(entry.id)}" data-search-value="${escapeAttribute(
267
+ entry.searchValue || `${entry.label} ${entry.description}`
268
+ )}" aria-selected="${index === 0 ? "true" : "false"}">
269
+ <span class="inspector-row-copy"><strong>${escapeHtml(
270
+ entry.label
271
+ )}</strong><small>${escapeHtml(entry.description)}</small></span>
272
+ ${entry.value === void 0 ? "" : `<span class="inspector-row-value">${escapeHtml(entry.value)}</span>`}
273
+ </button>`
274
+ ).join("")}
275
+ <div class="filtered-empty" data-filter-empty="${escapeAttribute(
276
+ scope
277
+ )}" hidden>No items match this filter.</div>
278
+ </div>
279
+ </section>
280
+ <section class="pane pane-detail">
281
+ ${entries.map(
282
+ (entry, index) => `<article class="detail-panel" data-detail-panel="${escapeAttribute(
283
+ scope
284
+ )}" data-detail-id="${escapeAttribute(entry.id)}"${index === 0 ? "" : " hidden"}>
285
+ <header class="pane-header"><strong>${escapeHtml(entry.label)}</strong><span>${escapeHtml(
286
+ entry.detailMeta || entry.description
287
+ )}</span></header>
288
+ <div class="detail-scroll">${entry.content}</div>
289
+ </article>`
290
+ ).join("")}
291
+ </section>
292
+ </div>`;
293
+ }
294
+ __name(renderInspector, "renderInspector");
295
+ function renderJson(value) {
296
+ return `<pre class="json-viewer"><code>${escapeHtml(JSON.stringify(value, null, 2))}</code></pre>`;
297
+ }
298
+ __name(renderJson, "renderJson");
299
+ function renderOverviewInspector(snapshot, healthLabel, generatedTime) {
300
+ const scheduledCount = snapshot.counts.cronJobs + snapshot.counts.workflows;
301
+ return renderInspector("overview", "Project", [
302
+ {
303
+ id: "diagnostics",
304
+ label: "Diagnostics",
305
+ description: "Actionable framework checks",
306
+ icon: "shield",
307
+ value: snapshot.counts.diagnostics,
308
+ detailMeta: healthLabel,
309
+ content: `${renderDetailIntro(
310
+ "Project health",
311
+ healthLabel,
312
+ snapshot.diagnostics.length ? "Farm found configuration details that deserve attention before production." : "Routes and configured systems are internally consistent.",
313
+ "shield"
314
+ )}<div class="detail-section">${renderDiagnostics(snapshot.diagnostics)}</div>`
315
+ },
316
+ {
317
+ id: "project",
318
+ label: snapshot.project.name,
319
+ description: snapshot.project.root,
320
+ icon: "app",
321
+ value: snapshot.project.srcDir,
322
+ detailMeta: "Active project",
323
+ content: `${renderDetailIntro(
324
+ "Active project",
325
+ snapshot.project.name,
326
+ "The application currently resolved by the Farm development server.",
327
+ "app"
328
+ )}${renderPropertyList([
329
+ ["Root", `<code>${escapeHtml(snapshot.project.root)}</code>`],
330
+ ["Source directory", `<code>${escapeHtml(snapshot.project.srcDir)}</code>`],
331
+ ["Base path", `<code>${escapeHtml(snapshot.project.basePath)}</code>`],
332
+ ["Deployment ID", `<code>${escapeHtml(snapshot.project.deploymentId)}</code>`],
333
+ ["Snapshot", `<span class="mono">${escapeHtml(generatedTime)}</span>`]
334
+ ])}`
335
+ },
336
+ {
337
+ id: "routes",
338
+ label: "Route surface",
339
+ description: "Pages, boundaries, and typed endpoints",
340
+ icon: "route",
341
+ value: snapshot.counts.pages + snapshot.counts.apiRoutes,
342
+ detailMeta: `${snapshot.counts.pages} pages / ${snapshot.counts.apiRoutes} API`,
343
+ content: `${renderDetailIntro(
344
+ "Application routing",
345
+ `${snapshot.counts.pages + snapshot.counts.apiRoutes} registered routes`,
346
+ "Farm resolves page boundaries and server endpoints from the same application tree.",
347
+ "route"
348
+ )}${renderPropertyList([
349
+ ["Pages", `<strong>${snapshot.counts.pages}</strong>`],
350
+ ["Layouts", `<strong>${snapshot.counts.layouts}</strong>`],
351
+ ["Loading boundaries", `<strong>${snapshot.counts.loadingBoundaries}</strong>`],
352
+ ["Error boundaries", `<strong>${snapshot.counts.errorBoundaries}</strong>`],
353
+ ["API routes", `<strong>${snapshot.counts.apiRoutes}</strong>`]
354
+ ])}`
355
+ },
356
+ {
357
+ id: "systems",
358
+ label: "Connected systems",
359
+ description: "Integrations, storage, and request layers",
360
+ icon: "blocks",
361
+ value: snapshot.counts.integrations,
362
+ detailMeta: "Configured surfaces",
363
+ content: `${renderDetailIntro(
364
+ "System map",
365
+ "Application services",
366
+ "Product integrations and framework services visible to the running application.",
367
+ "blocks"
368
+ )}<div class="detail-section">${renderSystemRows(snapshot)}</div>`
369
+ },
370
+ {
371
+ id: "deployment",
372
+ label: "Runtime",
373
+ description: `${snapshot.deployment.target} / ${snapshot.deployment.preset}`,
374
+ icon: "runtime",
375
+ value: scheduledCount,
376
+ detailMeta: "Deployment controls",
377
+ content: `${renderDetailIntro(
378
+ "Deployment runtime",
379
+ snapshot.deployment.target,
380
+ "The resolved deployment adapter, output contract, and enabled framework surfaces.",
381
+ "runtime"
382
+ )}${renderPropertyList([
383
+ ["Target", `<code>${escapeHtml(snapshot.deployment.target)}</code>`],
384
+ ["Nitro preset", `<code>${escapeHtml(snapshot.deployment.preset)}</code>`],
385
+ [
386
+ "Output",
387
+ `<code>${escapeHtml(snapshot.deployment.outputDir || "Framework default")}</code>`
388
+ ],
389
+ ["Scheduled work", `<strong>${scheduledCount}</strong>`]
390
+ ])}<div class="detail-section">${renderFeatureMatrix(snapshot)}</div>`
391
+ }
392
+ ]);
393
+ }
394
+ __name(renderOverviewInspector, "renderOverviewInspector");
395
+ function renderRoutesInspector(snapshot) {
396
+ return renderInspector(
397
+ "routes",
398
+ "Routes",
399
+ snapshot.routes.map((route, index) => ({
400
+ id: `route-${index}`,
401
+ label: route.pattern,
402
+ description: route.filePath,
403
+ icon: "route",
404
+ value: route.kind,
405
+ searchValue: `${route.kind} ${route.pattern} ${route.filePath} ${route.runtime?.runtime || "inherited"}`,
406
+ detailMeta: route.kind,
407
+ content: `${renderDetailIntro(
408
+ `${route.kind} route`,
409
+ route.pattern,
410
+ route.filePath,
411
+ "route"
412
+ )}${renderPropertyList([
413
+ ["Kind", renderBadge(route.kind, route.kind)],
414
+ ["Pattern", `<code>${escapeHtml(route.pattern)}</code>`],
415
+ ["Runtime", renderRuntime(route.runtime)],
416
+ ["Source", `<code>${escapeHtml(route.filePath)}</code>`]
417
+ ])}`
418
+ })),
419
+ "Filter routes or files"
420
+ );
421
+ }
422
+ __name(renderRoutesInspector, "renderRoutesInspector");
423
+ function renderApiInspector(snapshot) {
424
+ return renderInspector(
425
+ "api",
426
+ "API routes",
427
+ snapshot.apiRoutes.map((route, index) => ({
428
+ id: `api-${index}`,
429
+ label: route.path,
430
+ description: route.filePath,
431
+ icon: "api",
432
+ value: route.methods.length,
433
+ searchValue: `${route.path} ${route.methods.join(" ")} ${route.filePath} ${route.runtime.runtime}`,
434
+ detailMeta: route.methods.join(" / "),
435
+ content: `${renderDetailIntro(
436
+ "Server endpoint",
437
+ route.path,
438
+ route.filePath,
439
+ "api"
440
+ )}${renderPropertyList([
441
+ [
442
+ "Methods",
443
+ `<span class="method-list">${route.methods.map((method) => renderBadge(method, "method")).join("")}</span>`
444
+ ],
445
+ ["Runtime", renderRuntime(route.runtime)],
446
+ ["Source", `<code>${escapeHtml(route.filePath)}</code>`]
447
+ ])}`
448
+ })),
449
+ "Filter endpoints or methods"
450
+ );
451
+ }
452
+ __name(renderApiInspector, "renderApiInspector");
453
+ function renderSystemsInspector(snapshot) {
454
+ return renderInspector("systems", "Systems", [
455
+ {
456
+ id: "integrations",
457
+ label: "Integrations",
458
+ description: "Configured product adapters",
459
+ icon: "blocks",
460
+ value: snapshot.integrations.length,
461
+ content: renderIntegrations(snapshot)
462
+ },
463
+ {
464
+ id: "middleware",
465
+ label: "Middleware",
466
+ description: "Request layers and source modules",
467
+ icon: "shield",
468
+ value: snapshot.middleware.length,
469
+ content: renderMiddleware(snapshot)
470
+ },
471
+ {
472
+ id: "storage",
473
+ label: "Storage mounts",
474
+ description: "Root driver and named namespaces",
475
+ icon: "database",
476
+ value: snapshot.storage.length,
477
+ content: renderStorage(snapshot)
478
+ },
479
+ {
480
+ id: "docs",
481
+ label: "Documentation",
482
+ description: snapshot.docs.entry || "No docs route",
483
+ icon: "book",
484
+ value: snapshot.docs.enabled ? "on" : "off",
485
+ content: `${renderDetailIntro(
486
+ "Documentation",
487
+ snapshot.docs.enabled ? "Docs enabled" : "Docs disabled",
488
+ "Farm can serve application documentation from the same development runtime.",
489
+ "book"
490
+ )}${renderPropertyList([
491
+ ["State", renderBadge(snapshot.docs.enabled ? "enabled" : "disabled")],
492
+ ["Entry", `<code>${escapeHtml(snapshot.docs.entry || "Not configured")}</code>`]
493
+ ])}`
494
+ }
495
+ ]);
496
+ }
497
+ __name(renderSystemsInspector, "renderSystemsInspector");
498
+ function renderRuntimeInspector(snapshot) {
499
+ return renderInspector("runtime", "Runtime", [
500
+ {
501
+ id: "deployment",
502
+ label: "Deployment",
503
+ description: `${snapshot.deployment.target} / ${snapshot.deployment.preset}`,
504
+ icon: "runtime",
505
+ content: `${renderDetailIntro(
506
+ "Deployment target",
507
+ snapshot.deployment.target,
508
+ "Resolved platform adapter and build output for this application.",
509
+ "runtime"
510
+ )}${renderPropertyList([
511
+ ["Target", `<code>${escapeHtml(snapshot.deployment.target)}</code>`],
512
+ ["Nitro preset", `<code>${escapeHtml(snapshot.deployment.preset)}</code>`],
513
+ [
514
+ "Output directory",
515
+ `<code>${escapeHtml(snapshot.deployment.outputDir || "Framework default")}</code>`
516
+ ]
517
+ ])}`
518
+ },
519
+ {
520
+ id: "cron",
521
+ label: "Cron routes",
522
+ description: "Portable scheduled API routes",
523
+ icon: "clock",
524
+ value: snapshot.cron.length,
525
+ content: renderCron(snapshot)
526
+ },
527
+ {
528
+ id: "workflows",
529
+ label: "Workflows",
530
+ description: "Discovered workflow modules",
531
+ icon: "activity",
532
+ value: snapshot.workflows.length,
533
+ content: renderWorkflows(snapshot)
534
+ },
535
+ {
536
+ id: "features",
537
+ label: "Framework features",
538
+ description: "Resolved configuration switches",
539
+ icon: "blocks",
540
+ content: renderFeatureMatrix(snapshot)
541
+ },
542
+ {
543
+ id: "environment",
544
+ label: "Environment",
545
+ description: "Validated key names only",
546
+ icon: "shield",
547
+ value: snapshot.environment.server.length + snapshot.environment.public.length,
548
+ content: renderEnvironment(snapshot)
549
+ },
550
+ {
551
+ id: "layers",
552
+ label: "Layers",
553
+ description: "Extended source roots",
554
+ icon: "layers",
555
+ value: snapshot.layers.length,
556
+ content: renderLayers(snapshot)
557
+ }
558
+ ]);
559
+ }
560
+ __name(renderRuntimeInspector, "renderRuntimeInspector");
561
+ function renderRawInspector(snapshot) {
562
+ return renderInspector("raw", "Raw snapshot", [
563
+ {
564
+ id: "snapshot",
565
+ label: "Snapshot",
566
+ description: "Complete serialized runtime state",
567
+ icon: "terminal",
568
+ content: renderJson(snapshot)
569
+ },
570
+ {
571
+ id: "routes",
572
+ label: "Routes",
573
+ description: "Pages and route boundaries",
574
+ icon: "route",
575
+ value: snapshot.routes.length,
576
+ content: renderJson(snapshot.routes)
577
+ },
578
+ {
579
+ id: "api",
580
+ label: "API",
581
+ description: "Typed server endpoints",
582
+ icon: "api",
583
+ value: snapshot.apiRoutes.length,
584
+ content: renderJson(snapshot.apiRoutes)
585
+ },
586
+ {
587
+ id: "systems",
588
+ label: "Systems",
589
+ description: "Integrations, middleware, and storage",
590
+ icon: "blocks",
591
+ content: renderJson({
592
+ integrations: snapshot.integrations,
593
+ middleware: snapshot.middleware,
594
+ storage: snapshot.storage
595
+ })
596
+ },
597
+ {
598
+ id: "diagnostics",
599
+ label: "Diagnostics",
600
+ description: "Framework health findings",
601
+ icon: "shield",
602
+ value: snapshot.diagnostics.length,
603
+ content: renderJson(snapshot.diagnostics)
604
+ }
605
+ ]);
606
+ }
607
+ __name(renderRawInspector, "renderRawInspector");
608
+ function renderNavigationItem(view, label) {
609
+ return `<button type="button" class="nav-item" data-view-trigger="${view}" aria-selected="false">
610
+ <span>${escapeHtml(label)}</span>
611
+ </button>`;
612
+ }
613
+ __name(renderNavigationItem, "renderNavigationItem");
614
+ function renderFarmDevtoolsHtml(snapshot) {
615
+ const healthLabel = snapshot.health === "ready" ? "Ready" : snapshot.health === "error" ? "Error" : "Attention";
616
+ const generatedTime = new Date(snapshot.generatedAt).toLocaleTimeString("en-US", {
617
+ hour: "2-digit",
618
+ minute: "2-digit",
619
+ second: "2-digit",
620
+ hour12: false
621
+ });
622
+ return `<!doctype html>
623
+ <html lang="en" class="devtools-frame">
624
+ <head>
625
+ <meta charset="utf-8">
626
+ <meta name="viewport" content="width=device-width, initial-scale=1">
627
+ <meta name="color-scheme" content="dark">
628
+ <title>Farm Devtools - ${escapeHtml(snapshot.project.name)}</title>
629
+ <style>
630
+ :root {
631
+ color-scheme: dark;
632
+ --background: #000;
633
+ --surface: #050505;
634
+ --surface-raised: #090909;
635
+ --foreground: #f5f5f5;
636
+ --muted: #858585;
637
+ --muted-strong: #a8a8a8;
638
+ --line: rgb(255 255 255 / 0.12);
639
+ --line-soft: rgb(255 255 255 / 0.065);
640
+ --line-strong: rgb(255 255 255 / 0.22);
641
+ --font-sans: "Geist Sans", Geist, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
642
+ --font-mono: "Geist Mono", "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
643
+ }
644
+ * { box-sizing: border-box; }
645
+ html { min-width: 320px; min-height: 100%; background: var(--background); }
646
+ body { min-height: 100vh; min-height: 100dvh; margin: 0; overflow: hidden; background: #030303; color: var(--foreground); font-family: var(--font-sans); font-size: 14px; letter-spacing: 0; text-rendering: optimizeLegibility; }
647
+ button, input { color: inherit; font: inherit; letter-spacing: 0; }
648
+ button, a { -webkit-tap-highlight-color: transparent; }
649
+ button { cursor: pointer; }
650
+ a { color: inherit; }
651
+ [hidden] { display: none !important; }
652
+ code, kbd, .badge, .mono, .mini-label, .metric-label, .metric-detail, .section-index, .diagnostic-code, th, .statusbar, .eyebrow { font-family: var(--font-mono); letter-spacing: 0; }
653
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
654
+ .icon { width: 16px; height: 16px; flex: 0 0 auto; }
655
+ .stage { display: grid; min-height: 100vh; min-height: 100dvh; place-items: center; padding: 20px; }
656
+ .shell { display: flex; width: min(1280px, 100%); height: min(780px, calc(100dvh - 40px)); min-height: 560px; min-width: 0; flex-direction: column; overflow: hidden; border: 1px solid var(--line-strong); background: var(--background); box-shadow: 0 24px 80px rgb(0 0 0 / 0.72); }
657
+ .topbar { z-index: 30; display: flex; min-height: 42px; flex: 0 0 auto; align-items: stretch; border-bottom: 1px solid var(--line); background: var(--background); }
658
+ .brand { display: flex; min-width: 170px; align-items: center; gap: 8px; padding: 0 12px; border-right: 1px solid var(--line); text-decoration: none; font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; white-space: nowrap; }
659
+ .brand-mark { display: grid; width: 18px; height: 18px; place-items: center; border: 1px solid var(--line-strong); color: #fff; font-family: var(--font-sans); font-size: 9px; font-weight: 650; }
660
+ .brand-slash { color: #555; }
661
+ .brand-product { color: var(--muted-strong); }
662
+ .tabbar { display: flex; min-width: 0; flex: 1 1 auto; align-items: stretch; overflow-x: auto; scrollbar-width: none; }
663
+ .tabbar::-webkit-scrollbar { display: none; }
664
+ .nav-item { position: relative; display: flex; min-width: max-content; min-height: 41px; align-items: center; gap: 7px; padding: 0 11px; border: 0; background: transparent; color: var(--muted); font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; transition: background-color 140ms ease-out, color 140ms ease-out; }
665
+ .nav-item::after { position: absolute; right: 10px; bottom: -1px; left: 10px; height: 1px; background: transparent; content: ""; }
666
+ .nav-item:hover, .nav-item:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); outline: none; }
667
+ .nav-item[aria-selected="true"] { color: #fff; }
668
+ .nav-item[aria-selected="true"]::after { background: #fff; }
669
+ .nav-item .icon { width: 13px; height: 13px; }
670
+ .nav-item small { color: #666; font-size: 9px; font-weight: 400; }
671
+ .topbar-meta { display: flex; flex: 0 0 auto; margin-left: auto; border-left: 1px solid var(--line); }
672
+ .topbar-status { display: flex; min-width: max-content; align-items: center; gap: 7px; padding: 0 11px; color: var(--muted-strong); font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; }
673
+ .status-dot { width: 5px; height: 5px; background: #fff; box-shadow: 0 0 0 3px rgb(255 255 255 / 0.06); }
674
+ .status-dot-attention { background: #909090; animation: status-pulse 1.8s ease-in-out infinite; }
675
+ .status-dot-error { background: transparent; border: 1px solid #fff; }
676
+ .topbar-actions { display: flex; }
677
+ .action { display: inline-flex; width: 40px; min-height: 41px; align-items: center; justify-content: center; padding: 0; border: 0; border-left: 1px solid var(--line); background: transparent; color: var(--muted-strong); text-decoration: none; transition: background-color 140ms ease-out, color 140ms ease-out; }
678
+ .action:hover, .action:focus-visible { background: #fff; color: #000; outline: none; }
679
+ .action[data-copied="true"] { background: #fff; color: #000; }
680
+ .workspace { min-height: 0; flex: 1 1 auto; }
681
+ .eyebrow { display: block; color: var(--muted); font-size: 9px; font-weight: 400; text-transform: uppercase; }
682
+ .content { height: 100%; min-width: 0; }
683
+ .view { height: 100%; min-width: 0; overflow: hidden; }
684
+ .split-view { display: grid; height: 100%; min-height: 0; grid-template-columns: clamp(230px, 28%, 300px) minmax(0, 1fr); }
685
+ .pane { min-width: 0; min-height: 0; overflow: hidden; background: var(--background); }
686
+ .pane-list { display: flex; flex-direction: column; border-right: 1px solid var(--line); }
687
+ .pane-detail { position: relative; }
688
+ .pane-header { display: flex; min-height: 38px; align-items: center; justify-content: space-between; gap: 12px; padding: 0 12px; border-bottom: 1px solid var(--line); background: var(--surface); }
689
+ .pane-header strong { overflow: hidden; font-size: 11px; font-weight: 520; text-overflow: ellipsis; white-space: nowrap; }
690
+ .pane-header span { overflow: hidden; color: var(--muted); font-family: var(--font-mono); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; }
691
+ .pane-tools { border-bottom: 1px solid var(--line); }
692
+ .pane-tools .filter-control { width: 100%; min-height: 36px; border: 0; }
693
+ .pane-scroll, .detail-scroll { min-height: 0; overflow: auto; overscroll-behavior: contain; }
694
+ .pane-scroll { flex: 1 1 auto; }
695
+ .inspector-list { scrollbar-width: thin; scrollbar-color: var(--line-strong) transparent; }
696
+ .inspector-row { position: relative; display: grid; width: 100%; min-height: 54px; grid-template-columns: 24px minmax(0, 1fr) auto; align-items: center; gap: 9px; padding: 8px 11px; border: 0; border-bottom: 1px solid var(--line-soft); background: transparent; color: var(--muted); text-align: left; transition: background-color 120ms ease-out, color 120ms ease-out; }
697
+ .inspector-row::before { position: absolute; inset: 0 auto 0 0; width: 1px; background: transparent; content: ""; }
698
+ .inspector-row:hover, .inspector-row:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); outline: none; }
699
+ .inspector-row[aria-selected="true"] { background: rgb(255 255 255 / 0.075); color: #fff; }
700
+ .inspector-row[aria-selected="true"]::before { background: #fff; }
701
+ .inspector-row-icon { display: grid; color: var(--muted-strong); place-items: center; }
702
+ .inspector-row-icon .icon { width: 14px; height: 14px; }
703
+ .inspector-row-copy { min-width: 0; }
704
+ .inspector-row-copy strong, .inspector-row-copy small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
705
+ .inspector-row-copy strong { color: inherit; font-size: 11px; font-weight: 520; }
706
+ .inspector-row-copy small { margin-top: 3px; color: var(--muted); font-family: var(--font-mono); font-size: 9px; }
707
+ .inspector-row-value { color: var(--muted-strong); font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; }
708
+ .detail-panel { display: flex; height: 100%; min-height: 0; flex-direction: column; }
709
+ .detail-scroll { flex: 1 1 auto; }
710
+ .detail-intro { display: grid; min-height: 132px; grid-template-columns: 34px minmax(0, 1fr); align-items: start; gap: 14px; padding: 22px; border-bottom: 1px solid var(--line); }
711
+ .detail-icon { display: grid; width: 32px; height: 32px; border: 1px solid var(--line); color: var(--muted-strong); place-items: center; }
712
+ .detail-icon .icon { width: 15px; height: 15px; }
713
+ .detail-intro .mini-label { margin: 1px 0 8px; }
714
+ .detail-intro h2 { margin: 0; overflow-wrap: anywhere; font-size: 20px; font-weight: 530; line-height: 1.2; }
715
+ .detail-intro p { max-width: 680px; margin: 8px 0 0; color: var(--muted); font-size: 11px; line-height: 1.55; }
716
+ .detail-section { border-top: 1px solid var(--line); }
717
+ .detail-intro + .detail-section { border-top: 0; }
718
+ .property-list { margin: 0; }
719
+ .property-list > div { display: grid; min-height: 48px; grid-template-columns: minmax(120px, 0.32fr) minmax(0, 1fr); align-items: center; gap: 18px; padding: 9px 16px; border-bottom: 1px solid var(--line-soft); }
720
+ .property-list dt { color: var(--muted); font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; }
721
+ .property-list dd { min-width: 0; margin: 0; overflow-wrap: anywhere; color: var(--muted-strong); font-size: 11px; }
722
+ .property-list dd > code { color: var(--foreground); font-size: 10px; }
723
+ .single-pane { height: 100%; min-height: 0; }
724
+ .json-viewer { min-height: 100%; margin: 0; padding: 16px; overflow: auto; background: #000; color: var(--muted-strong); font-family: var(--font-mono); font-size: 10px; line-height: 1.65; tab-size: 2; white-space: pre-wrap; word-break: break-word; }
725
+ .diagnostic { display: grid; grid-template-columns: 32px minmax(0, 1fr) auto; align-items: start; gap: 12px; min-height: 88px; padding: 16px 18px; border-bottom: 1px solid var(--line-soft); }
726
+ .diagnostic:last-child { border-bottom: 0; }
727
+ .diagnostic-mark { display: grid; width: 28px; height: 28px; place-items: center; border: 1px solid var(--line); color: var(--muted-strong); }
728
+ .diagnostic-code { display: block; margin-bottom: 5px; color: var(--muted); font-size: 9px; }
729
+ .diagnostic strong { display: block; font-size: 12px; font-weight: 540; }
730
+ .diagnostic p { margin: 5px 0 0; color: var(--muted-strong); font-size: 11px; line-height: 1.5; }
731
+ .diagnostic small { display: block; margin-top: 6px; color: var(--muted); font-size: 10px; line-height: 1.5; }
732
+ .diagnostic-warning { box-shadow: inset 1px 0 var(--line-strong); }
733
+ .system-row { display: grid; grid-template-columns: 32px minmax(0, 1fr) auto; min-height: 64px; align-items: center; gap: 10px; padding: 11px 16px; border-bottom: 1px solid var(--line-soft); }
734
+ .system-row:last-child { border-bottom: 0; }
735
+ .system-icon { display: grid; width: 28px; height: 28px; place-items: center; color: var(--muted-strong); }
736
+ .system-row strong, .system-row small { display: block; }
737
+ .system-row strong { font-size: 12px; font-weight: 520; }
738
+ .system-row small { margin-top: 3px; overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
739
+ .system-value { font-family: var(--font-mono); font-size: 11px; }
740
+ .filter-control { display: flex; width: min(280px, 34vw); min-height: 34px; align-items: center; gap: 8px; padding: 0 9px; border: 1px solid var(--line); background: #000; color: var(--muted); }
741
+ .filter-control:focus-within { border-color: var(--line-strong); color: #fff; }
742
+ .filter-control input { min-width: 0; flex: 1; border: 0; outline: 0; background: transparent; color: var(--foreground); font-family: var(--font-mono); font-size: 10px; }
743
+ .filter-control input::placeholder { color: #666; }
744
+ .filter-control kbd { padding: 1px 5px; border: 1px solid var(--line); color: var(--muted); font-size: 9px; }
745
+ .table-scroll { width: 100%; overflow-x: auto; }
746
+ table { width: 100%; border-collapse: collapse; table-layout: auto; }
747
+ th { height: 36px; padding: 0 16px; border-bottom: 1px solid var(--line); background: #030303; color: var(--muted); font-size: 9px; font-weight: 400; text-align: left; text-transform: uppercase; white-space: nowrap; }
748
+ td { min-height: 48px; padding: 12px 16px; border-bottom: 1px solid var(--line-soft); color: var(--muted-strong); font-size: 11px; line-height: 1.55; vertical-align: top; }
749
+ tr:last-child td { border-bottom: 0; }
750
+ tbody tr { transition: background-color 120ms ease-out; }
751
+ tbody tr:hover { background: rgb(255 255 255 / 0.035); }
752
+ td code { color: var(--foreground); font-size: 10px; white-space: nowrap; }
753
+ .file-cell { max-width: 420px; overflow: hidden; font-family: var(--font-mono); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
754
+ .badge { display: inline-flex; min-height: 20px; align-items: center; padding: 1px 6px; border: 1px solid var(--line); color: var(--muted-strong); font-size: 9px; font-weight: 400; text-transform: uppercase; white-space: nowrap; }
755
+ .badge-ready, .badge-page, .badge-node { border-color: var(--line-strong); color: #fff; }
756
+ .badge-warning, .badge-attention, .badge-edge { border-style: dashed; color: #fff; }
757
+ .badge-error { background: #fff; color: #000; }
758
+ .badge-method { min-width: 36px; justify-content: center; border-color: var(--line-soft); color: #d0d0d0; }
759
+ .method-list, .runtime-value, .runtime-facts { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; }
760
+ .runtime-value small, .runtime-facts span { color: var(--muted); font-family: var(--font-mono); font-size: 9px; }
761
+ .cell-detail { display: block; margin-top: 4px; color: var(--muted); font-family: var(--font-mono); font-size: 9px; }
762
+ .route-operation { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
763
+ .route-operation + .route-operation { margin-top: 5px; }
764
+ .route-operation small { color: var(--muted); font-family: var(--font-mono); font-size: 9px; white-space: nowrap; }
765
+ .schedule { display: block; }
766
+ .schedule + .schedule { margin-top: 4px; }
767
+ .muted { color: var(--muted); }
768
+ .empty-state { display: grid; min-height: 156px; place-items: center; align-content: center; gap: 7px; padding: 24px; color: var(--muted); text-align: center; }
769
+ .empty-state strong { color: var(--muted-strong); font-size: 12px; font-weight: 520; }
770
+ .empty-state span { max-width: 420px; font-size: 10px; line-height: 1.5; }
771
+ .filtered-empty { padding: 24px; color: var(--muted); font-family: var(--font-mono); font-size: 10px; text-align: center; }
772
+ .feature-matrix > div { display: flex; min-height: 45px; align-items: center; justify-content: space-between; gap: 16px; padding: 9px 16px; border-bottom: 1px solid var(--line-soft); }
773
+ .feature-matrix > div:last-child { border-bottom: 0; }
774
+ .feature-matrix span:first-child { font-size: 11px; }
775
+ .environment-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
776
+ .environment-grid > div { min-height: 128px; padding: 16px; }
777
+ .environment-grid > div + div { border-left: 1px solid var(--line); }
778
+ .mini-label { display: block; margin-bottom: 12px; color: var(--muted); font-size: 9px; text-transform: uppercase; }
779
+ .key-list { display: flex; flex-wrap: wrap; gap: 6px; }
780
+ .key-list code { padding: 4px 6px; border: 1px solid var(--line-soft); color: var(--muted-strong); font-size: 9px; }
781
+ .layer-list > div { display: grid; grid-template-columns: minmax(120px, 0.7fr) minmax(0, 1fr) auto; min-height: 52px; align-items: center; gap: 14px; padding: 10px 16px; border-bottom: 1px solid var(--line-soft); }
782
+ .layer-list > div:last-child { border-bottom: 0; }
783
+ .layer-list span { display: flex; align-items: center; gap: 8px; }
784
+ .layer-list strong { font-size: 11px; font-weight: 520; }
785
+ .layer-list code, .layer-list small { color: var(--muted); font-size: 9px; }
786
+ .statusbar { display: flex; min-height: 29px; flex: 0 0 auto; align-items: center; justify-content: space-between; gap: 16px; padding: 0 10px; border-top: 1px solid var(--line); background: var(--surface); color: var(--muted); font-size: 9px; text-transform: uppercase; }
787
+ .statusbar span { display: flex; align-items: center; gap: 7px; }
788
+ @keyframes status-pulse { 0%, 100% { opacity: 0.4; } 50% { opacity: 1; } }
789
+ @media (max-width: 1100px) {
790
+ .topbar-status { display: none; }
791
+ }
792
+ @media (max-width: 840px) {
793
+ .stage { display: block; padding: 0; }
794
+ .shell { width: 100%; height: 100dvh; min-height: 0; border: 0; }
795
+ .topbar { flex-wrap: wrap; }
796
+ .brand { min-width: auto; height: 40px; border-right: 0; }
797
+ .brand-product, .brand-slash { display: none; }
798
+ .tabbar { order: 3; width: 100%; flex-basis: 100%; border-top: 1px solid var(--line); }
799
+ .topbar-meta { height: 40px; }
800
+ .nav-item { min-height: 39px; }
801
+ .split-view { grid-template-columns: 1fr; grid-template-rows: minmax(150px, 34%) minmax(0, 1fr); }
802
+ .pane-list { border-right: 0; border-bottom: 1px solid var(--line); }
803
+ .filter-control { width: 100%; }
804
+ }
805
+ @media (max-width: 560px) {
806
+ .detail-intro { min-height: 112px; padding: 16px; }
807
+ .detail-intro h2 { font-size: 17px; }
808
+ .property-list > div { grid-template-columns: minmax(98px, 0.38fr) minmax(0, 1fr); gap: 12px; padding-inline: 12px; }
809
+ .environment-grid { grid-template-columns: 1fr; }
810
+ .environment-grid > div + div { border-top: 1px solid var(--line); border-left: 0; }
811
+ .statusbar span:last-child { display: none; }
812
+ }
813
+ @media (prefers-reduced-motion: reduce) {
814
+ html { scroll-behavior: auto; }
815
+ *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }
816
+ }
817
+ </style>
818
+ <style data-assistant-ui-layout>
819
+ :root {
820
+ --background: #0a0a0a;
821
+ --surface: #0a0a0a;
822
+ --surface-raised: #111111;
823
+ --foreground: #ededed;
824
+ --muted: #929299;
825
+ --muted-strong: #b4b4ba;
826
+ --line: rgb(255 255 255 / 0.11);
827
+ --line-soft: rgb(255 255 255 / 0.075);
828
+ --line-strong: rgb(255 255 255 / 0.16);
829
+ --accent: #1c1c1e;
830
+ }
831
+ html, body { width: 100%; height: 100%; background: #080808; }
832
+ body { position: relative; min-height: 100dvh; overflow: hidden; font-size: 13px; }
833
+ .stage {
834
+ position: fixed;
835
+ inset: 0;
836
+ z-index: 2;
837
+ display: grid;
838
+ min-height: 0;
839
+ padding: 20px;
840
+ place-items: center;
841
+ pointer-events: none;
842
+ }
843
+ .shell {
844
+ width: min(960px, 92vw);
845
+ height: min(560px, 80dvh);
846
+ min-width: 0;
847
+ min-height: 0;
848
+ border: 1px solid var(--line-strong);
849
+ border-radius: 12px;
850
+ background: var(--background);
851
+ box-shadow: 0 24px 80px rgb(0 0 0 / 0.72), 0 4px 18px rgb(0 0 0 / 0.45);
852
+ pointer-events: auto;
853
+ animation: devtools-window-in 180ms cubic-bezier(0.175, 0.885, 0.32, 1.08);
854
+ }
855
+ .topbar {
856
+ min-height: 40px;
857
+ height: 40px;
858
+ align-items: center;
859
+ justify-content: space-between;
860
+ flex-wrap: nowrap;
861
+ border-bottom-color: var(--line);
862
+ background: var(--background);
863
+ }
864
+ .brand { display: none; }
865
+ .tabbar {
866
+ height: 100%;
867
+ flex: 1 1 auto;
868
+ align-items: stretch;
869
+ order: initial;
870
+ width: auto;
871
+ flex-basis: auto;
872
+ padding-inline-start: 8px;
873
+ border-top: 0;
874
+ }
875
+ .nav-item {
876
+ min-height: 39px;
877
+ height: 39px;
878
+ gap: 0;
879
+ padding: 0 12px;
880
+ border-radius: 0;
881
+ color: var(--muted);
882
+ font-family: var(--font-sans);
883
+ font-size: 13px;
884
+ font-weight: 500;
885
+ text-transform: none;
886
+ }
887
+ .nav-item::after {
888
+ right: 8px;
889
+ bottom: -1px;
890
+ left: 8px;
891
+ height: 2px;
892
+ border-radius: 999px;
893
+ }
894
+ .nav-item:hover, .nav-item:focus-visible { background: transparent; color: var(--foreground); }
895
+ .nav-item[aria-selected="true"] { color: var(--foreground); }
896
+ .topbar-meta {
897
+ height: 100%;
898
+ align-items: center;
899
+ gap: 8px;
900
+ margin-left: 0;
901
+ padding: 0 8px 0 4px;
902
+ border-left: 0;
903
+ }
904
+ .project-select {
905
+ display: inline-flex;
906
+ height: 28px;
907
+ min-width: 0;
908
+ align-items: center;
909
+ gap: 5px;
910
+ padding: 0 9px;
911
+ border: 1px solid var(--line);
912
+ border-radius: 8px;
913
+ color: var(--muted-strong);
914
+ font-size: 12px;
915
+ white-space: nowrap;
916
+ }
917
+ .project-select .icon { width: 12px; height: 12px; transform: rotate(90deg); }
918
+ .topbar-status {
919
+ min-width: max-content;
920
+ gap: 6px;
921
+ padding: 0;
922
+ color: var(--muted);
923
+ font-family: var(--font-sans);
924
+ font-size: 11px;
925
+ text-transform: none;
926
+ }
927
+ .status-dot {
928
+ width: 6px;
929
+ height: 6px;
930
+ border: 0;
931
+ border-radius: 999px;
932
+ background: #2dd4bf;
933
+ box-shadow: none;
934
+ }
935
+ .status-dot-attention { background: #f59e0b; animation: none; }
936
+ .status-dot-error { background: #ef4444; }
937
+ .close-action {
938
+ display: inline-flex;
939
+ width: 28px;
940
+ height: 28px;
941
+ flex: 0 0 auto;
942
+ align-items: center;
943
+ justify-content: center;
944
+ padding: 0;
945
+ border: 0;
946
+ border-radius: 6px;
947
+ background: transparent;
948
+ color: var(--muted);
949
+ text-decoration: none;
950
+ transition: background-color 120ms ease-out, color 120ms ease-out;
951
+ }
952
+ .close-action:hover, .close-action:focus-visible { background: var(--accent); color: var(--foreground); outline: none; }
953
+ .close-action .icon { width: 14px; height: 14px; }
954
+ .workspace, .content, .view { min-height: 0; }
955
+ .split-view {
956
+ grid-template-columns: clamp(14rem, 28%, 18rem) minmax(0, 1fr);
957
+ grid-template-rows: minmax(0, 1fr);
958
+ }
959
+ .pane { background: var(--background); }
960
+ .pane-list { border-right: 1px solid var(--line); border-bottom: 0; }
961
+ .pane-header {
962
+ min-height: 32px;
963
+ height: 32px;
964
+ max-height: 32px;
965
+ flex: 0 0 32px;
966
+ padding: 0 12px;
967
+ border-bottom-color: var(--line);
968
+ background: var(--background);
969
+ }
970
+ .pane-header strong {
971
+ color: var(--muted);
972
+ font-size: 11px;
973
+ font-weight: 400;
974
+ line-height: 1;
975
+ }
976
+ .pane-header span {
977
+ color: var(--muted);
978
+ font-family: var(--font-sans);
979
+ font-size: 10px;
980
+ line-height: 1;
981
+ }
982
+ .pane-tools { border-bottom-color: var(--line); }
983
+ .pane-tools .filter-control { min-height: 32px; height: 32px; }
984
+ .filter-control {
985
+ min-height: 32px;
986
+ gap: 7px;
987
+ padding: 0 10px;
988
+ border-color: var(--line);
989
+ border-radius: 0;
990
+ background: var(--background);
991
+ }
992
+ .filter-control .icon { width: 13px; height: 13px; }
993
+ .filter-control input { font-family: var(--font-sans); font-size: 11px; }
994
+ .filter-control input::placeholder { color: var(--muted); }
995
+ .filter-control kbd {
996
+ padding: 1px 5px;
997
+ border-color: var(--line);
998
+ border-radius: 4px;
999
+ color: var(--muted);
1000
+ font-size: 9px;
1001
+ }
1002
+ .inspector-row {
1003
+ min-height: 44px;
1004
+ grid-template-columns: minmax(0, 1fr) auto;
1005
+ gap: 8px;
1006
+ padding: 6px 11px 6px 12px;
1007
+ border: 0;
1008
+ border-left: 2px solid transparent;
1009
+ border-radius: 0;
1010
+ color: var(--muted-strong);
1011
+ }
1012
+ .inspector-row::before { display: none; }
1013
+ .inspector-row:hover, .inspector-row:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); }
1014
+ .inspector-row[aria-selected="true"] {
1015
+ border-left-color: var(--foreground);
1016
+ background: var(--accent);
1017
+ color: var(--foreground);
1018
+ }
1019
+ .inspector-row-copy strong { font-size: 12px; font-weight: 500; }
1020
+ .inspector-row-copy small {
1021
+ margin-top: 2px;
1022
+ color: var(--muted);
1023
+ font-family: var(--font-sans);
1024
+ font-size: 10px;
1025
+ }
1026
+ .inspector-row-value {
1027
+ padding: 2px 6px;
1028
+ border: 1px solid var(--line);
1029
+ border-radius: 999px;
1030
+ background: rgb(255 255 255 / 0.035);
1031
+ color: var(--muted);
1032
+ font-family: var(--font-sans);
1033
+ font-size: 9px;
1034
+ line-height: 1.2;
1035
+ text-transform: none;
1036
+ }
1037
+ .detail-intro {
1038
+ display: block;
1039
+ min-height: 0;
1040
+ padding: 12px;
1041
+ border-bottom-color: var(--line-soft);
1042
+ }
1043
+ .detail-icon { display: none; }
1044
+ .detail-intro .mini-label { margin: 0 0 8px; }
1045
+ .detail-intro h2 { font-size: 13px; font-weight: 500; line-height: 1.3; }
1046
+ .detail-intro p { margin-top: 6px; font-size: 11px; line-height: 1.5; }
1047
+ .detail-section, .detail-intro + .detail-section { border-top-color: var(--line); }
1048
+ .property-list > div {
1049
+ min-height: 36px;
1050
+ grid-template-columns: minmax(96px, 0.28fr) minmax(0, 1fr);
1051
+ gap: 14px;
1052
+ padding: 7px 12px;
1053
+ border-bottom-color: var(--line-soft);
1054
+ }
1055
+ .property-list dt { font-family: var(--font-sans); font-size: 10px; text-transform: none; }
1056
+ .property-list dd { color: var(--foreground); font-size: 11px; }
1057
+ .property-list dd > code { font-size: 10px; }
1058
+ .json-viewer {
1059
+ padding: 12px;
1060
+ background: var(--background);
1061
+ color: var(--muted-strong);
1062
+ font-size: 10px;
1063
+ line-height: 1.55;
1064
+ }
1065
+ .diagnostic {
1066
+ min-height: 68px;
1067
+ grid-template-columns: 24px minmax(0, 1fr) auto;
1068
+ gap: 10px;
1069
+ padding: 11px 12px;
1070
+ border-bottom-color: var(--line-soft);
1071
+ }
1072
+ .diagnostic-mark { width: 22px; height: 22px; border: 0; }
1073
+ .diagnostic-mark .icon { width: 13px; height: 13px; }
1074
+ .diagnostic-code { margin-bottom: 3px; font-size: 9px; }
1075
+ .diagnostic strong { font-size: 11px; font-weight: 500; }
1076
+ .diagnostic p { margin-top: 3px; font-size: 10px; line-height: 1.45; }
1077
+ .diagnostic small { margin-top: 4px; font-size: 9px; }
1078
+ .diagnostic-warning { box-shadow: none; }
1079
+ .system-row {
1080
+ min-height: 48px;
1081
+ grid-template-columns: 24px minmax(0, 1fr) auto;
1082
+ gap: 8px;
1083
+ padding: 8px 12px;
1084
+ border-bottom-color: var(--line-soft);
1085
+ }
1086
+ .system-icon { width: 20px; height: 20px; }
1087
+ .system-icon .icon { width: 13px; height: 13px; }
1088
+ .system-row strong { font-size: 11px; font-weight: 500; }
1089
+ .system-row small { margin-top: 2px; font-size: 10px; }
1090
+ .system-value { color: var(--muted); font-size: 10px; }
1091
+ table { font-size: 11px; }
1092
+ th {
1093
+ height: 32px;
1094
+ padding: 0 12px;
1095
+ background: var(--background);
1096
+ font-family: var(--font-sans);
1097
+ font-size: 10px;
1098
+ font-weight: 400;
1099
+ text-transform: none;
1100
+ }
1101
+ td { min-height: 40px; padding: 9px 12px; font-size: 10px; }
1102
+ td code, .file-cell { font-size: 9px; }
1103
+ .badge {
1104
+ min-height: 18px;
1105
+ padding: 1px 6px;
1106
+ border-radius: 999px;
1107
+ background: rgb(255 255 255 / 0.04);
1108
+ font-family: var(--font-sans);
1109
+ font-size: 9px;
1110
+ text-transform: none;
1111
+ }
1112
+ .badge-error { background: var(--foreground); color: var(--background); }
1113
+ .badge-warning, .badge-attention, .badge-edge { border-style: solid; }
1114
+ .empty-state { min-height: 100%; padding: 24px; gap: 6px; }
1115
+ .empty-state .icon { display: none; }
1116
+ .empty-state strong { font-size: 12px; font-weight: 400; }
1117
+ .empty-state span { font-size: 11px; }
1118
+ .feature-matrix > div { min-height: 36px; padding: 7px 12px; border-bottom-color: var(--line-soft); }
1119
+ .feature-matrix span:first-child { font-size: 11px; }
1120
+ .environment-grid > div { min-height: 104px; padding: 12px; }
1121
+ .mini-label { margin-bottom: 8px; font-family: var(--font-sans); font-size: 10px; text-transform: none; }
1122
+ .key-list code { border-radius: 4px; font-size: 9px; }
1123
+ .layer-list > div { min-height: 44px; padding: 8px 12px; border-bottom-color: var(--line-soft); }
1124
+ .layer-list strong { font-size: 11px; font-weight: 500; }
1125
+ .statusbar { display: none; }
1126
+ html.devtools-frame .stage { position: static; width: 100%; height: 100%; min-height: 100%; padding: 0; }
1127
+ html.devtools-frame .shell { width: 100%; height: 100%; border-radius: 12px; box-shadow: none; animation: none; }
1128
+ @keyframes devtools-window-in {
1129
+ from { opacity: 0; transform: scale(0.985) translateY(4px); }
1130
+ to { opacity: 1; transform: scale(1) translateY(0); }
1131
+ }
1132
+ @media (max-width: 700px) {
1133
+ .stage { display: grid; padding: 0; }
1134
+ .shell {
1135
+ width: 100%;
1136
+ height: 100%;
1137
+ min-height: 0;
1138
+ border: 1px solid var(--line-strong);
1139
+ border-radius: 10px;
1140
+ }
1141
+ .topbar { flex-wrap: nowrap; }
1142
+ .tabbar {
1143
+ order: initial;
1144
+ width: auto;
1145
+ flex-basis: auto;
1146
+ border-top: 0;
1147
+ padding-inline-start: 4px;
1148
+ }
1149
+ .topbar-meta { height: 40px; }
1150
+ .nav-item { min-height: 39px; height: 39px; padding-inline: 9px; }
1151
+ .split-view { grid-template-columns: 1fr; grid-template-rows: minmax(148px, 36%) minmax(0, 1fr); }
1152
+ .pane-list { border-right: 0; border-bottom: 1px solid var(--line); }
1153
+ }
1154
+ @media (max-width: 560px) {
1155
+ .project-select { display: none; }
1156
+ .topbar-status { display: none; }
1157
+ .topbar-meta { gap: 4px; padding-left: 0; }
1158
+ .status-label { display: none; }
1159
+ .detail-intro { min-height: 0; padding: 12px; }
1160
+ .detail-intro h2 { font-size: 13px; }
1161
+ .property-list > div { grid-template-columns: minmax(82px, 0.34fr) minmax(0, 1fr); gap: 10px; padding-inline: 10px; }
1162
+ }
1163
+ @media (prefers-reduced-motion: reduce) {
1164
+ .shell { animation: none; }
1165
+ }
1166
+ </style>
1167
+ </head>
1168
+ <body>
1169
+ <div class="stage">
1170
+ <div class="shell" role="dialog" aria-modal="true" aria-label="Farm.js DevTools">
1171
+ <header class="topbar">
1172
+ <nav class="tabbar" aria-label="Devtools views">
1173
+ ${renderNavigationItem("overview", "Overview")}
1174
+ ${renderNavigationItem("routes", "Routes")}
1175
+ ${renderNavigationItem("api", "API")}
1176
+ ${renderNavigationItem("systems", "Systems")}
1177
+ ${renderNavigationItem("runtime", "Runtime")}
1178
+ ${renderNavigationItem("raw", "Raw")}
1179
+ </nav>
1180
+ <div class="topbar-meta">
1181
+ <span class="project-select">${escapeHtml(snapshot.project.name)} ${icon(
1182
+ "chevron"
1183
+ )}</span>
1184
+ <span class="topbar-status"><span class="status-dot"></span><span class="status-label">1 instance</span></span>
1185
+ <button class="close-action" type="button" data-close-devtools aria-label="Close DevTools" title="Close DevTools">${icon(
1186
+ "close"
1187
+ )}</button>
1188
+ </div>
1189
+ </header>
1190
+ <div class="workspace">
1191
+ <main class="content">
1192
+ <section class="view" data-view-panel="overview">${renderOverviewInspector(
1193
+ snapshot,
1194
+ healthLabel,
1195
+ generatedTime
1196
+ )}</section>
1197
+ <section class="view" data-view-panel="routes" hidden>${renderRoutesInspector(
1198
+ snapshot
1199
+ )}</section>
1200
+ <section class="view" data-view-panel="api" hidden>${renderApiInspector(
1201
+ snapshot
1202
+ )}</section>
1203
+ <section class="view" data-view-panel="systems" hidden>${renderSystemsInspector(
1204
+ snapshot
1205
+ )}</section>
1206
+ <section class="view" data-view-panel="runtime" hidden>${renderRuntimeInspector(
1207
+ snapshot
1208
+ )}</section>
1209
+ <section class="view" data-view-panel="raw" hidden>${renderRawInspector(snapshot)}</section>
1210
+ </main>
1211
+ </div>
1212
+ </div>
1213
+ </div>
1214
+ <script>
1215
+ (() => {
1216
+ const embedded = window.parent !== window;
1217
+ const closeDevtools = () => {
1218
+ if (embedded && window.parent !== window) {
1219
+ window.parent.postMessage({ type: "farm:devtools:close" }, location.origin);
1220
+ return;
1221
+ }
1222
+ location.assign("/");
1223
+ };
1224
+ document.querySelector("[data-close-devtools]")?.addEventListener("click", closeDevtools);
1225
+ document.addEventListener("keydown", (event) => {
1226
+ if (event.key === "Escape") {
1227
+ event.preventDefault();
1228
+ closeDevtools();
1229
+ return;
1230
+ }
1231
+ if (embedded && window.parent !== window) {
1232
+ window.parent.postMessage(
1233
+ {
1234
+ type: "farm:devtools:keydown",
1235
+ event: {
1236
+ key: event.key,
1237
+ code: event.code,
1238
+ altKey: event.altKey,
1239
+ ctrlKey: event.ctrlKey,
1240
+ metaKey: event.metaKey,
1241
+ shiftKey: event.shiftKey,
1242
+ repeat: event.repeat,
1243
+ },
1244
+ },
1245
+ location.origin,
1246
+ );
1247
+ }
1248
+ });
1249
+
1250
+ const validViews = new Set(["overview", "routes", "api", "systems", "runtime", "raw"]);
1251
+ const triggers = Array.from(document.querySelectorAll("[data-view-trigger]"));
1252
+ const panels = Array.from(document.querySelectorAll("[data-view-panel]"));
1253
+ const selectView = (view, updateHash = true) => {
1254
+ const nextView = validViews.has(view) ? view : "overview";
1255
+ triggers.forEach((trigger) => {
1256
+ trigger.setAttribute("aria-selected", String(trigger.dataset.viewTrigger === nextView));
1257
+ });
1258
+ panels.forEach((panel) => {
1259
+ panel.hidden = panel.dataset.viewPanel !== nextView;
1260
+ });
1261
+ if (updateHash) {
1262
+ history.replaceState(null, "", nextView === "overview" ? location.pathname : "#" + nextView);
1263
+ const activePanel = panels.find((panel) => panel.dataset.viewPanel === nextView);
1264
+ if (activePanel) activePanel.scrollTop = 0;
1265
+ }
1266
+ };
1267
+ triggers.forEach((trigger) => trigger.addEventListener("click", () => selectView(trigger.dataset.viewTrigger)));
1268
+ window.addEventListener("hashchange", () => selectView(location.hash.slice(1), false));
1269
+ selectView(location.hash.slice(1), false);
1270
+
1271
+ document.querySelectorAll("[data-detail-trigger]").forEach((trigger) => {
1272
+ trigger.addEventListener("click", () => {
1273
+ const scope = trigger.dataset.detailTrigger;
1274
+ const id = trigger.dataset.detailId;
1275
+ document.querySelectorAll('[data-detail-trigger="' + scope + '"]').forEach((row) => {
1276
+ row.setAttribute("aria-selected", String(row.dataset.detailId === id));
1277
+ });
1278
+ document.querySelectorAll('[data-detail-panel="' + scope + '"]').forEach((panel) => {
1279
+ panel.hidden = panel.dataset.detailId !== id;
1280
+ });
1281
+ });
1282
+ });
1283
+
1284
+ document.querySelectorAll("[data-filter]").forEach((input) => {
1285
+ input.addEventListener("input", () => {
1286
+ const id = input.dataset.filter;
1287
+ const query = input.value.trim().toLowerCase();
1288
+ const rows = Array.from(document.querySelectorAll('[data-filter-rows="' + id + '"] [data-search-value]'));
1289
+ let visible = 0;
1290
+ rows.forEach((row) => {
1291
+ const matches = !query || (row.dataset.searchValue || "").toLowerCase().includes(query);
1292
+ row.hidden = !matches;
1293
+ if (matches) visible += 1;
1294
+ });
1295
+ const selected = rows.find((row) => row.getAttribute("aria-selected") === "true");
1296
+ if (selected?.hidden) rows.find((row) => !row.hidden)?.click();
1297
+ const empty = document.querySelector('[data-filter-empty="' + id + '"]');
1298
+ if (empty) empty.hidden = visible !== 0;
1299
+ });
1300
+ });
1301
+
1302
+ document.addEventListener("keydown", (event) => {
1303
+ if (event.key !== "/" || event.metaKey || event.ctrlKey || event.altKey) return;
1304
+ const active = document.activeElement;
1305
+ if (active && (active.tagName === "INPUT" || active.tagName === "TEXTAREA")) return;
1306
+ const panel = document.querySelector("[data-view-panel]:not([hidden])");
1307
+ const input = panel?.querySelector("[data-filter]");
1308
+ if (input) {
1309
+ event.preventDefault();
1310
+ input.focus();
1311
+ }
1312
+ });
1313
+
1314
+ document.querySelector("[data-refresh]")?.addEventListener("click", () => location.reload());
1315
+ document.querySelector("[data-copy-snapshot]")?.addEventListener("click", async (event) => {
1316
+ const button = event.currentTarget;
1317
+ const label = button.querySelector("[data-copy-label]");
1318
+ try {
1319
+ const response = await fetch("/__farm/devtools.json", { cache: "no-store" });
1320
+ const value = JSON.stringify(await response.json(), null, 2);
1321
+ if (navigator.clipboard?.writeText) await navigator.clipboard.writeText(value);
1322
+ else {
1323
+ const textarea = document.createElement("textarea");
1324
+ textarea.value = value;
1325
+ document.body.appendChild(textarea);
1326
+ textarea.select();
1327
+ document.execCommand("copy");
1328
+ textarea.remove();
1329
+ }
1330
+ button.dataset.copied = "true";
1331
+ if (label) label.textContent = "Copied";
1332
+ setTimeout(() => {
1333
+ button.dataset.copied = "false";
1334
+ if (label) label.textContent = "Copy JSON";
1335
+ }, 1600);
1336
+ } catch {
1337
+ if (label) label.textContent = "Copy failed";
1338
+ }
1339
+ });
1340
+ })();
1341
+ </script>
1342
+ </body>
1343
+ </html>`;
1344
+ }
1345
+ __name(renderFarmDevtoolsHtml, "renderFarmDevtoolsHtml");
1346
+ export {
1347
+ renderFarmDevtoolsHtml
1348
+ };
1349
+ //# sourceMappingURL=devtools-ui-NJKFORTG.mjs.map