@farm.js/core 0.1.16 → 0.1.18

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 (390) hide show
  1. package/dist/after.cjs +12 -225
  2. package/dist/agent-runtime.cjs +83 -2800
  3. package/dist/agent-runtime.d.mts +3 -3
  4. package/dist/agent-runtime.d.ts +3 -3
  5. package/dist/api/client.cjs +17 -4026
  6. package/dist/api/client.d.mts +3 -3
  7. package/dist/api/client.d.ts +3 -3
  8. package/dist/api/client.mjs +3 -3
  9. package/dist/api/route-manager.cjs +34 -4317
  10. package/dist/api/route-manager.d.mts +3 -3
  11. package/dist/api/route-manager.d.ts +3 -3
  12. package/dist/api/route-manager.mjs +5 -5
  13. package/dist/api/runtime.cjs +29 -2660
  14. package/dist/api/runtime.d.mts +3 -3
  15. package/dist/api/runtime.d.ts +3 -3
  16. package/dist/api/runtime.mjs +6 -3
  17. package/dist/{api-client-B-n3pm_Q.d.mts → api-client-Cx54IR5g.d.mts} +2 -2
  18. package/dist/{api-client-C0_NZEBl.d.ts → api-client-DykpaKcY.d.ts} +2 -2
  19. package/dist/api.cjs +88 -8361
  20. package/dist/api.d.mts +5 -5
  21. package/dist/api.d.ts +5 -5
  22. package/dist/api.mjs +8 -8
  23. package/dist/{app-AyjEsCBq.d.ts → app-BHY_10Lm.d.ts} +3 -3
  24. package/dist/{app-CYPHeOo_.d.mts → app-BMk0do23.d.mts} +3 -3
  25. package/dist/app-markdown.cjs +39 -280
  26. package/dist/app-markdown.d.mts +4 -4
  27. package/dist/app-markdown.d.ts +4 -4
  28. package/dist/app-markdown.mjs +3 -3
  29. package/dist/cache.cjs +38 -1526
  30. package/dist/cache.d.mts +11 -1
  31. package/dist/cache.d.ts +11 -1
  32. package/dist/cache.mjs +1 -1
  33. package/dist/chunk-22GUSVNJ.cjs +351 -0
  34. package/dist/chunk-2CQ74SP6.cjs +13 -0
  35. package/dist/chunk-2SJ4RQ6P.cjs +57 -0
  36. package/dist/chunk-3376ZTRC.cjs +1 -0
  37. package/dist/{chunk-IL5RWYK7.mjs → chunk-3XG26Z3J.mjs} +1 -1
  38. package/dist/{chunk-7HDZYYS4.mjs → chunk-4OOBRCJX.mjs} +27 -5
  39. package/dist/chunk-4PNUXIVU.cjs +472 -0
  40. package/dist/chunk-4PPEPOZZ.cjs +21 -0
  41. package/dist/chunk-4ZFL5GFN.cjs +520 -0
  42. package/dist/{chunk-B76DT5Y6.mjs → chunk-57J3Y7Y3.mjs} +1 -1
  43. package/dist/chunk-5OVTOKGH.cjs +65 -0
  44. package/dist/chunk-5QIKR7RR.cjs +224 -0
  45. package/dist/{chunk-MOQNHLTS.mjs → chunk-5QOEPUYE.mjs} +5 -2
  46. package/dist/{chunk-HKLRP3BN.mjs → chunk-5SPPCN5J.mjs} +1 -1
  47. package/dist/chunk-5ZSWG4UX.cjs +127 -0
  48. package/dist/chunk-62YJ2IEB.cjs +238 -0
  49. package/dist/chunk-6EODJYCX.cjs +183 -0
  50. package/dist/chunk-6EXBPJ24.cjs +434 -0
  51. package/dist/chunk-6QQDAAAZ.cjs +38 -0
  52. package/dist/chunk-6V4TDWEC.cjs +455 -0
  53. package/dist/{chunk-LUC2FAGW.mjs → chunk-6VQIKZZO.mjs} +1 -1
  54. package/dist/chunk-72ADZ6GQ.cjs +19 -0
  55. package/dist/chunk-75BRBIFP.cjs +172 -0
  56. package/dist/{chunk-7ZWL7XOU.mjs → chunk-76DG3LF3.mjs} +1 -1
  57. package/dist/chunk-7W3CPVXS.cjs +24 -0
  58. package/dist/chunk-A6WIQH5Z.cjs +31 -0
  59. package/dist/{chunk-EWDK36MM.mjs → chunk-A72YEUZ3.mjs} +1 -1
  60. package/dist/chunk-AFOD3LYZ.cjs +377 -0
  61. package/dist/chunk-AMDMVWMI.cjs +39 -0
  62. package/dist/chunk-AORPIPNB.cjs +552 -0
  63. package/dist/chunk-ARJWXNQL.cjs +256 -0
  64. package/dist/{chunk-ZHOIQC6U.mjs → chunk-ATERBVHQ.mjs} +2 -2
  65. package/dist/chunk-AWRISO2H.cjs +2199 -0
  66. package/dist/chunk-AYJR42WX.cjs +711 -0
  67. package/dist/chunk-B4CH33IG.cjs +644 -0
  68. package/dist/chunk-BIDYX3SL.cjs +91 -0
  69. package/dist/chunk-BSTRERPP.cjs +40 -0
  70. package/dist/chunk-BYODCJD6.cjs +663 -0
  71. package/dist/chunk-C3VRMB6H.cjs +85 -0
  72. package/dist/chunk-C5GUTBZK.cjs +173 -0
  73. package/dist/chunk-CIAGU2X4.cjs +337 -0
  74. package/dist/chunk-CMGMGHUZ.cjs +27 -0
  75. package/dist/chunk-CXP5U3RW.cjs +54 -0
  76. package/dist/chunk-D2ULAULS.cjs +166 -0
  77. package/dist/chunk-D7JTOLFK.cjs +285 -0
  78. package/dist/chunk-DVM4FKZL.cjs +169 -0
  79. package/dist/chunk-DYEJQTDN.cjs +49 -0
  80. package/dist/chunk-E2BMSZ2W.cjs +151 -0
  81. package/dist/chunk-E3UK5IIB.cjs +593 -0
  82. package/dist/chunk-EM6SBQKM.cjs +470 -0
  83. package/dist/{chunk-27JNCYEK.mjs → chunk-EN7WTEAY.mjs} +2 -2
  84. package/dist/{chunk-IGO2HEV7.mjs → chunk-F6SJAKFJ.mjs} +62 -28
  85. package/dist/{chunk-GSDIZACQ.mjs → chunk-FG5H2VCJ.mjs} +2 -2
  86. package/dist/chunk-FJSWYIR7.cjs +482 -0
  87. package/dist/chunk-FK6GO24V.cjs +54 -0
  88. package/dist/chunk-FXUUWYAX.cjs +654 -0
  89. package/dist/chunk-G3HRIVEY.cjs +395 -0
  90. package/dist/chunk-G643DQCH.cjs +13 -0
  91. package/dist/chunk-G7HXGLEC.cjs +175 -0
  92. package/dist/chunk-GDSHDTJ4.cjs +152 -0
  93. package/dist/chunk-GNEO2XOF.cjs +2040 -0
  94. package/dist/{chunk-NHHKW2T6.mjs → chunk-GYKJCFTS.mjs} +170 -52
  95. package/dist/chunk-H6G5INWM.cjs +1094 -0
  96. package/dist/chunk-HBTUGXHS.cjs +180 -0
  97. package/dist/chunk-HREOKQWT.cjs +45 -0
  98. package/dist/chunk-I4J452B7.cjs +435 -0
  99. package/dist/chunk-I57LW5VZ.cjs +94 -0
  100. package/dist/chunk-I7PUUDGY.cjs +389 -0
  101. package/dist/chunk-IAMRBF3Z.cjs +86 -0
  102. package/dist/chunk-IKNRN4VS.cjs +14214 -0
  103. package/dist/chunk-IQXFRNY2.cjs +169 -0
  104. package/dist/chunk-IXTFU4PL.cjs +2355 -0
  105. package/dist/chunk-J2OP5GG3.cjs +725 -0
  106. package/dist/chunk-J3LOGE4T.cjs +42 -0
  107. package/dist/chunk-J7FSKED3.cjs +93 -0
  108. package/dist/chunk-JDNHKPTD.cjs +22 -0
  109. package/dist/chunk-JSROZYYO.cjs +164 -0
  110. package/dist/chunk-K6FNHVDR.cjs +696 -0
  111. package/dist/chunk-KGZIORNL.cjs +43 -0
  112. package/dist/{chunk-LZK5CXDW.mjs → chunk-KLSSO6YD.mjs} +2 -2
  113. package/dist/{chunk-TYVVIQ5M.mjs → chunk-KPNVGRBL.mjs} +32 -25
  114. package/dist/chunk-KR6CKSXT.cjs +15 -0
  115. package/dist/chunk-KROWKCUH.cjs +185 -0
  116. package/dist/chunk-KVFPGF2M.cjs +46 -0
  117. package/dist/{chunk-KUO3GBPK.mjs → chunk-L6V3P73N.mjs} +1 -1
  118. package/dist/chunk-LCCBO7PJ.cjs +46 -0
  119. package/dist/chunk-LIUGYUX3.cjs +22 -0
  120. package/dist/chunk-LTNGXMQ6.cjs +55 -0
  121. package/dist/chunk-M2L4MYDQ.cjs +14 -0
  122. package/dist/chunk-MCJLA63J.cjs +1 -0
  123. package/dist/chunk-MKB2EGIR.cjs +148 -0
  124. package/dist/chunk-MQ3H6LT5.cjs +202 -0
  125. package/dist/chunk-MT763TDW.cjs +43 -0
  126. package/dist/chunk-MWSK6C4J.cjs +18 -0
  127. package/dist/chunk-MWWVKDW3.cjs +169 -0
  128. package/dist/{chunk-KTGFMHET.mjs → chunk-N6UROPT7.mjs} +1 -1
  129. package/dist/chunk-NO3WWW3N.cjs +192 -0
  130. package/dist/{chunk-NDD2YVGU.mjs → chunk-NRVGEI5I.mjs} +10 -3
  131. package/dist/chunk-NV3A5DXM.cjs +862 -0
  132. package/dist/chunk-NWOD6NIT.cjs +9 -0
  133. package/dist/chunk-NZKJGRB3.cjs +230 -0
  134. package/dist/chunk-OAVTUMJP.cjs +1496 -0
  135. package/dist/chunk-OHY2ZWUG.cjs +25 -0
  136. package/dist/chunk-OI6CMLWX.cjs +47 -0
  137. package/dist/chunk-OIEOCXKG.cjs +453 -0
  138. package/dist/chunk-OWOUTKIJ.cjs +558 -0
  139. package/dist/chunk-OX6O6WVA.cjs +74 -0
  140. package/dist/chunk-OXSIH4D6.cjs +476 -0
  141. package/dist/chunk-OYEUREB6.cjs +35 -0
  142. package/dist/chunk-PCOTGFSM.cjs +139 -0
  143. package/dist/chunk-PZYCPSCC.cjs +35 -0
  144. package/dist/chunk-QBK2AA4U.cjs +445 -0
  145. package/dist/chunk-QBPXNZGV.cjs +487 -0
  146. package/dist/{chunk-IXTEENRS.mjs → chunk-QGVJVSNX.mjs} +5 -5
  147. package/dist/chunk-QNPEUFHQ.cjs +27 -0
  148. package/dist/chunk-QZRVZSPN.cjs +236 -0
  149. package/dist/chunk-R5A5KNVX.cjs +20 -0
  150. package/dist/chunk-R5JIFR6B.cjs +42 -0
  151. package/dist/chunk-R6AIILII.cjs +193 -0
  152. package/dist/chunk-RG3ZOTG5.cjs +34 -0
  153. package/dist/chunk-ROUTX2E5.cjs +390 -0
  154. package/dist/chunk-RTHIVJ2G.cjs +54 -0
  155. package/dist/chunk-S3A45T7F.cjs +166 -0
  156. package/dist/chunk-S3JO3N4H.cjs +17 -0
  157. package/dist/chunk-SK35NQKK.cjs +27 -0
  158. package/dist/chunk-SU7MH53P.cjs +180 -0
  159. package/dist/chunk-SVRTJOUF.cjs +113 -0
  160. package/dist/chunk-SWN467MP.cjs +18 -0
  161. package/dist/{chunk-6SCB2MXB.mjs → chunk-SXHV42UQ.mjs} +16 -1
  162. package/dist/{chunk-OWTIOHON.mjs → chunk-SYGGPS4A.mjs} +2 -2
  163. package/dist/chunk-SYQ3MOWW.cjs +73 -0
  164. package/dist/chunk-T5CERMEH.cjs +417 -0
  165. package/dist/chunk-TFAXUHWX.cjs +206 -0
  166. package/dist/chunk-TIWHTW3Q.cjs +24 -0
  167. package/dist/chunk-TKJZFIML.cjs +20 -0
  168. package/dist/chunk-TKNSDBBN.cjs +193 -0
  169. package/dist/{chunk-NC333MFA.mjs → chunk-TSWW5BVH.mjs} +7 -4
  170. package/dist/chunk-TWGMSEHX.cjs +525 -0
  171. package/dist/chunk-TYQUSXUG.cjs +1357 -0
  172. package/dist/chunk-U4KT7QP3.cjs +23 -0
  173. package/dist/{chunk-LK6FGAQR.mjs → chunk-UDBJCUPA.mjs} +7 -4
  174. package/dist/chunk-UJ2C4ICS.cjs +277 -0
  175. package/dist/chunk-UN5GHC5V.cjs +10244 -0
  176. package/dist/chunk-UQZ4AYTH.cjs +168 -0
  177. package/dist/chunk-US2QVW3E.cjs +36 -0
  178. package/dist/{chunk-NUD6XBMO.mjs → chunk-UTBVHYS3.mjs} +2 -2
  179. package/dist/{chunk-76MNRHTS.mjs → chunk-UUYF3CHN.mjs} +2 -2
  180. package/dist/chunk-VB6UCX3V.cjs +421 -0
  181. package/dist/chunk-VEKFLAQM.cjs +300 -0
  182. package/dist/chunk-VQDBNVOO.cjs +14 -0
  183. package/dist/chunk-W4E7WMXE.cjs +71 -0
  184. package/dist/{chunk-VVTREAG5.mjs → chunk-WD4YXVLV.mjs} +11 -3
  185. package/dist/{chunk-UQZPTIML.mjs → chunk-WD5PNSOB.mjs} +2 -2
  186. package/dist/chunk-WJ3HK3LJ.cjs +1102 -0
  187. package/dist/chunk-WMAPPDMM.cjs +28 -0
  188. package/dist/chunk-WMOGFOUJ.cjs +223 -0
  189. package/dist/chunk-WPYFSQKK.cjs +37 -0
  190. package/dist/chunk-WZMNW2IW.cjs +1415 -0
  191. package/dist/chunk-XGC343EY.cjs +443 -0
  192. package/dist/{chunk-DPZUDPVJ.mjs → chunk-XP777LRD.mjs} +1 -1
  193. package/dist/chunk-XSKZORAS.cjs +727 -0
  194. package/dist/chunk-XWAWFQFS.cjs +82 -0
  195. package/dist/{chunk-KATQ6I56.mjs → chunk-XWAYMDLB.mjs} +1 -1
  196. package/dist/chunk-Y4YMF2NQ.cjs +460 -0
  197. package/dist/chunk-Y4YWHNKU.cjs +250 -0
  198. package/dist/chunk-Y53ZSFN6.cjs +504 -0
  199. package/dist/chunk-YA6LLTIJ.cjs +411 -0
  200. package/dist/chunk-YFPGHF5F.cjs +202 -0
  201. package/dist/chunk-YJRZR7VU.cjs +28 -0
  202. package/dist/chunk-YTAABQEV.cjs +1 -0
  203. package/dist/chunk-YX3DBN4M.cjs +18 -0
  204. package/dist/chunk-YZTASLPQ.cjs +64 -0
  205. package/dist/chunk-Z5HIWVDP.cjs +2173 -0
  206. package/dist/{chunk-Q3MDL7TM.mjs → chunk-ZCNJKLA2.mjs} +30 -11
  207. package/dist/chunk-ZEG3OPIB.cjs +93 -0
  208. package/dist/chunk-ZMN3H73H.cjs +155 -0
  209. package/dist/client/lifecycle.cjs +6 -35
  210. package/dist/{client-plugins-CqVtZi5X.d.ts → client-plugins-C089bQhN.d.ts} +2 -2
  211. package/dist/{client-plugins-CIPRtSsW.d.mts → client-plugins-JXXmZliS.d.mts} +2 -2
  212. package/dist/client-plugins.cjs +7 -448
  213. package/dist/client-plugins.d.mts +3 -3
  214. package/dist/client-plugins.d.ts +3 -3
  215. package/dist/client.cjs +171 -9774
  216. package/dist/client.d.mts +8 -8
  217. package/dist/client.d.ts +8 -8
  218. package/dist/client.mjs +6 -6
  219. package/dist/config.cjs +8 -36
  220. package/dist/config.d.mts +3 -3
  221. package/dist/config.d.ts +3 -3
  222. package/dist/cron.cjs +24 -491
  223. package/dist/cron.mjs +2 -2
  224. package/dist/deferred.cjs +26 -475
  225. package/dist/deployment.cjs +39 -210
  226. package/dist/devtools-OUIPHVV6.cjs +388 -0
  227. package/dist/{devtools-IU7LKZOH.mjs → devtools-UFVTMQX5.mjs} +7 -7
  228. package/dist/devtools-client-4WAPJY5L.cjs +254 -0
  229. package/dist/devtools-ui-5GBDIGMK.cjs +1296 -0
  230. package/dist/docs.cjs +46 -5649
  231. package/dist/docs.mjs +9 -9
  232. package/dist/{endpoint-kSAxE52R.d.ts → endpoint-1zA994xL.d.ts} +1 -1
  233. package/dist/{endpoint-Bu3XgeMK.d.mts → endpoint-DAc96i93.d.mts} +1 -1
  234. package/dist/env-types.cjs +5 -226
  235. package/dist/env.cjs +23 -306
  236. package/dist/env.d.mts +5 -3
  237. package/dist/env.d.ts +5 -3
  238. package/dist/env.mjs +2 -1
  239. package/dist/environment/vite.cjs +8 -372
  240. package/dist/environment.cjs +12 -94
  241. package/dist/font.cjs +13 -63
  242. package/dist/headers.cjs +7 -123
  243. package/dist/i18n/client.cjs +55 -294
  244. package/dist/i18n/index.cjs +22 -209
  245. package/dist/i18n/server.cjs +22 -745
  246. package/dist/image/server.cjs +13 -729
  247. package/dist/image/sharp.cjs +33 -171
  248. package/dist/image.cjs +41 -85
  249. package/dist/index.cjs +1151 -67862
  250. package/dist/index.d.mts +14 -14
  251. package/dist/index.d.ts +14 -14
  252. package/dist/index.mjs +34 -34
  253. package/dist/instrumentation.cjs +12 -138
  254. package/dist/integration-orm-55F7CII5.cjs +13 -0
  255. package/dist/integrations.cjs +55 -4090
  256. package/dist/integrations.d.mts +3 -3
  257. package/dist/integrations.d.ts +3 -3
  258. package/dist/internal/app-markdown-runtime.cjs +27 -224
  259. package/dist/internal/app-markdown-runtime.d.mts +3 -3
  260. package/dist/internal/app-markdown-runtime.d.ts +3 -3
  261. package/dist/internal/app-markdown-runtime.mjs +2 -2
  262. package/dist/internal/build-runtime.cjs +120 -52038
  263. package/dist/internal/build-runtime.d.mts +5 -5
  264. package/dist/internal/build-runtime.d.ts +5 -5
  265. package/dist/internal/build-runtime.mjs +23 -23
  266. package/dist/internal/cli-runtime.cjs +67 -13765
  267. package/dist/internal/cli-runtime.mjs +13 -13
  268. package/dist/internal/client-error-overlay.cjs +80 -733
  269. package/dist/internal/client-error-overlay.mjs +1 -1
  270. package/dist/internal/client-runtime.cjs +81 -913
  271. package/dist/internal/compression-runtime.cjs +8 -214
  272. package/dist/internal/compression-runtime.d.mts +3 -3
  273. package/dist/internal/compression-runtime.d.ts +3 -3
  274. package/dist/internal/config-runtime.cjs +42 -6535
  275. package/dist/internal/config-runtime.d.mts +4 -4
  276. package/dist/internal/config-runtime.d.ts +4 -4
  277. package/dist/internal/config-runtime.mjs +7 -7
  278. package/dist/internal/docs-precompiled-runtime.cjs +26 -46
  279. package/dist/internal/infra-analytics-runtime.cjs +10 -536
  280. package/dist/internal/isolated-boundary.cjs +14 -414
  281. package/dist/internal/metadata-image-runtime.cjs +7 -285
  282. package/dist/internal/product-telemetry-runtime.cjs +42 -97
  283. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  284. package/dist/internal/production-node-env.cjs +6 -63
  285. package/dist/internal/production-runtime.cjs +418 -7073
  286. package/dist/internal/production-runtime.d.mts +9 -9
  287. package/dist/internal/production-runtime.d.ts +9 -9
  288. package/dist/internal/production-runtime.mjs +6 -6
  289. package/dist/internal/request-cookies.cjs +6 -54
  290. package/dist/json-ld.cjs +24 -50
  291. package/dist/layers-E4WPJNY5.cjs +17 -0
  292. package/dist/manager-G4B2IPYE.cjs +14 -0
  293. package/dist/markdown.cjs +21 -532
  294. package/dist/markdown.mjs +1 -1
  295. package/dist/{metadata-8g__AMPM.d.ts → metadata-BcNJP4fq.d.ts} +1 -1
  296. package/dist/{metadata-OMX6wFNf.d.mts → metadata-C1Z9vLbb.d.mts} +1 -1
  297. package/dist/middleware.cjs +36 -2988
  298. package/dist/middleware.d.mts +5 -5
  299. package/dist/middleware.d.ts +5 -5
  300. package/dist/middleware.mjs +4 -4
  301. package/dist/navigation.cjs +22 -2588
  302. package/dist/nitro-4I2MYLY2.cjs +652 -0
  303. package/dist/{nitro-3N4ZXRYM.mjs → nitro-CVZ36JM5.mjs} +4 -4
  304. package/dist/observability.cjs +22 -614
  305. package/dist/og.cjs +5 -28
  306. package/dist/plugin.cjs +106 -37291
  307. package/dist/plugin.d.mts +3 -3
  308. package/dist/plugin.d.ts +3 -3
  309. package/dist/plugin.mjs +19 -19
  310. package/dist/{production-runtime-W3M0eNDV.d.mts → production-runtime-jcrTlRTb.d.mts} +1 -1
  311. package/dist/{production-runtime-BJh7o6Cr.d.ts → production-runtime-oKmC0WU-.d.ts} +1 -1
  312. package/dist/query/client.cjs +113 -449
  313. package/dist/query/index.cjs +26 -288
  314. package/dist/query/parsers.cjs +23 -247
  315. package/dist/query/server.cjs +36 -298
  316. package/dist/{render-plan-io7pvDNc.d.mts → render-plan-BLIfc4jt.d.mts} +1 -1
  317. package/dist/{render-plan-Be4ZGTJP.d.ts → render-plan-DOB9cV-h.d.ts} +1 -1
  318. package/dist/renderer/react/client.cjs +9 -43
  319. package/dist/renderer/react/server.cjs +40 -103
  320. package/dist/renderer/react/vite.cjs +7 -29
  321. package/dist/renderer-client.cjs +126 -4261
  322. package/dist/renderer-client.d.mts +5 -5
  323. package/dist/renderer-client.d.ts +5 -5
  324. package/dist/renderer-client.mjs +3 -3
  325. package/dist/renderer.cjs +31 -249
  326. package/dist/{request-DZkHYQ89.d.mts → request-Cr53NRHr.d.mts} +1 -1
  327. package/dist/{request-G8JhKr4F.d.ts → request-Dt2gNuQD.d.ts} +1 -1
  328. package/dist/request.cjs +5 -68
  329. package/dist/request.d.mts +4 -4
  330. package/dist/request.d.ts +4 -4
  331. package/dist/{route-C_eLaFTZ.d.mts → route-B0XrsrFk.d.mts} +1 -1
  332. package/dist/{route-BxNJT447.d.ts → route-DOEpbyWZ.d.ts} +1 -1
  333. package/dist/{route-rendering-BcLLPJgN.d.ts → route-rendering-CWYd8Mv1.d.ts} +1 -1
  334. package/dist/{route-rendering-CbAKr1TY.d.mts → route-rendering-CeFBEAoZ.d.mts} +1 -1
  335. package/dist/router.cjs +11 -474
  336. package/dist/routes.cjs +42 -2424
  337. package/dist/routes.d.mts +4 -4
  338. package/dist/routes.d.ts +4 -4
  339. package/dist/routes.mjs +2 -2
  340. package/dist/schema-dev-notice-MXSZMVDG.cjs +56 -0
  341. package/dist/schema.cjs +6 -33
  342. package/dist/search-client-G3RICOFU.cjs +13 -0
  343. package/dist/server-action-security.cjs +25 -541
  344. package/dist/server-fn-client.cjs +6 -337
  345. package/dist/server-fn-client.d.mts +3 -3
  346. package/dist/server-fn-client.d.ts +3 -3
  347. package/dist/server-fn.cjs +32 -1799
  348. package/dist/server-fn.d.mts +1 -1
  349. package/dist/server-fn.d.ts +1 -1
  350. package/dist/server-fn.mjs +2 -2
  351. package/dist/server-plugins.cjs +15 -884
  352. package/dist/server-plugins.d.mts +4 -4
  353. package/dist/server-plugins.d.ts +4 -4
  354. package/dist/server-query-client.cjs +15 -1849
  355. package/dist/server-query-client.d.mts +1 -1
  356. package/dist/server-query-client.d.ts +1 -1
  357. package/dist/server-query-client.mjs +4 -4
  358. package/dist/server-query.cjs +16 -1796
  359. package/dist/server-query.d.mts +1 -1
  360. package/dist/server-query.d.ts +1 -1
  361. package/dist/server-query.mjs +3 -3
  362. package/dist/server.cjs +296 -44522
  363. package/dist/server.d.mts +9 -9
  364. package/dist/server.d.ts +9 -9
  365. package/dist/server.mjs +22 -22
  366. package/dist/{spa-router-BcS_4nqm.d.mts → spa-router-CQWiYGxS.d.mts} +2 -2
  367. package/dist/{spa-router-BzFBUJkn.d.ts → spa-router-Wjiw-8hB.d.ts} +2 -2
  368. package/dist/storage.cjs +57 -576
  369. package/dist/testing.cjs +92 -3148
  370. package/dist/testing.d.mts +3 -3
  371. package/dist/testing.d.ts +3 -3
  372. package/dist/testing.mjs +11 -7
  373. package/dist/theme/client.cjs +13 -108
  374. package/dist/theme/index.cjs +6 -68
  375. package/dist/theme/runtime.cjs +13 -78
  376. package/dist/theme/server.cjs +10 -179
  377. package/dist/{utils-C4yrAhNc.d.ts → utils-B0XJmG_b.d.ts} +1 -1
  378. package/dist/{utils-5kQP1mFR.d.mts → utils-uUxF0K0P.d.mts} +1 -1
  379. package/dist/version.cjs +4 -32
  380. package/dist/version.mjs +1 -1
  381. package/dist/vite.cjs +119 -37622
  382. package/dist/vite.d.mts +3 -3
  383. package/dist/vite.d.ts +3 -3
  384. package/dist/vite.mjs +19 -19
  385. package/dist/workflows.cjs +19 -1040
  386. package/dist/workflows.mjs +2 -2
  387. package/package.json +2 -2
  388. package/dist/{chunk-VO5SCWF5.mjs → chunk-BNGS6KJ6.mjs} +0 -0
  389. package/dist/{chunk-MUUZJLCI.mjs → chunk-EGJDUF4Q.mjs} +3 -3
  390. package/dist/{chunk-4L7SZOHZ.mjs → chunk-YHOCRI4H.mjs} +3 -3
@@ -0,0 +1,1296 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, icon, "icon");
31
+ function escapeHtml(value) {
32
+ return String(_nullishCoalesce(value, () => ( ""))).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
33
+ }
34
+ _chunkS3JO3N4Hcjs.__name.call(void 0, escapeHtml, "escapeHtml");
35
+ function escapeAttribute(value) {
36
+ return escapeHtml(value).replace(/`/g, "&#96;");
37
+ }
38
+ _chunkS3JO3N4Hcjs.__name.call(void 0, escapeAttribute, "escapeAttribute");
39
+ function renderBadge(value, tone = "neutral") {
40
+ return `<span class="badge badge-${tone}">${escapeHtml(value)}</span>`;
41
+ }
42
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderBadge, "renderBadge");
43
+ function renderRuntime(runtime) {
44
+ if (!runtime) return '<span class="muted">Inherited</span>';
45
+ const details = [
46
+ _optionalChain([runtime, 'access', _ => _.regions, 'optionalAccess', _2 => _2.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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderFeatureMatrix, "renderFeatureMatrix");
214
+ function renderEnvironment(snapshot) {
215
+ const renderKeys = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, (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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderInspector, "renderInspector");
295
+ function renderJson(value) {
296
+ return `<pre class="json-viewer"><code>${escapeHtml(JSON.stringify(value, null, 2))}</code></pre>`;
297
+ }
298
+ _chunkS3JO3N4Hcjs.__name.call(void 0, 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
+ value: snapshot.counts.diagnostics,
307
+ detailMeta: healthLabel,
308
+ content: `${renderDetailIntro(
309
+ "Project health",
310
+ healthLabel,
311
+ snapshot.diagnostics.length ? "Farm found configuration details that deserve attention before production." : "Routes and configured systems are internally consistent.",
312
+ "shield"
313
+ )}<div class="detail-section">${renderDiagnostics(snapshot.diagnostics)}</div>`
314
+ },
315
+ {
316
+ id: "project",
317
+ label: snapshot.project.name,
318
+ description: snapshot.project.root,
319
+ value: snapshot.project.srcDir,
320
+ detailMeta: "Active project",
321
+ content: `${renderDetailIntro(
322
+ "Active project",
323
+ snapshot.project.name,
324
+ "The application currently resolved by the Farm development server.",
325
+ "app"
326
+ )}${renderPropertyList([
327
+ ["Root", `<code>${escapeHtml(snapshot.project.root)}</code>`],
328
+ ["Source directory", `<code>${escapeHtml(snapshot.project.srcDir)}</code>`],
329
+ ["Base path", `<code>${escapeHtml(snapshot.project.basePath)}</code>`],
330
+ ["Deployment ID", `<code>${escapeHtml(snapshot.project.deploymentId)}</code>`],
331
+ ["Snapshot", `<span class="mono">${escapeHtml(generatedTime)}</span>`]
332
+ ])}`
333
+ },
334
+ {
335
+ id: "routes",
336
+ label: "Route surface",
337
+ description: "Pages, boundaries, and typed endpoints",
338
+ value: snapshot.counts.pages + snapshot.counts.apiRoutes,
339
+ detailMeta: `${snapshot.counts.pages} pages / ${snapshot.counts.apiRoutes} API`,
340
+ content: `${renderDetailIntro(
341
+ "Application routing",
342
+ `${snapshot.counts.pages + snapshot.counts.apiRoutes} registered routes`,
343
+ "Farm resolves page boundaries and server endpoints from the same application tree.",
344
+ "route"
345
+ )}${renderPropertyList([
346
+ ["Pages", `<strong>${snapshot.counts.pages}</strong>`],
347
+ ["Layouts", `<strong>${snapshot.counts.layouts}</strong>`],
348
+ ["Loading boundaries", `<strong>${snapshot.counts.loadingBoundaries}</strong>`],
349
+ ["Error boundaries", `<strong>${snapshot.counts.errorBoundaries}</strong>`],
350
+ ["API routes", `<strong>${snapshot.counts.apiRoutes}</strong>`]
351
+ ])}`
352
+ },
353
+ {
354
+ id: "systems",
355
+ label: "Connected systems",
356
+ description: "Integrations, storage, and request layers",
357
+ value: snapshot.counts.integrations,
358
+ detailMeta: "Configured surfaces",
359
+ content: `${renderDetailIntro(
360
+ "System map",
361
+ "Application services",
362
+ "Product integrations and framework services visible to the running application.",
363
+ "blocks"
364
+ )}<div class="detail-section">${renderSystemRows(snapshot)}</div>`
365
+ },
366
+ {
367
+ id: "deployment",
368
+ label: "Runtime",
369
+ description: `${snapshot.deployment.target} / ${snapshot.deployment.preset}`,
370
+ value: scheduledCount,
371
+ detailMeta: "Deployment controls",
372
+ content: `${renderDetailIntro(
373
+ "Deployment runtime",
374
+ snapshot.deployment.target,
375
+ "The resolved deployment adapter, output contract, and enabled framework surfaces.",
376
+ "runtime"
377
+ )}${renderPropertyList([
378
+ ["Target", `<code>${escapeHtml(snapshot.deployment.target)}</code>`],
379
+ ["Nitro preset", `<code>${escapeHtml(snapshot.deployment.preset)}</code>`],
380
+ [
381
+ "Output",
382
+ `<code>${escapeHtml(snapshot.deployment.outputDir || "Framework default")}</code>`
383
+ ],
384
+ ["Scheduled work", `<strong>${scheduledCount}</strong>`]
385
+ ])}<div class="detail-section">${renderFeatureMatrix(snapshot)}</div>`
386
+ }
387
+ ]);
388
+ }
389
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderOverviewInspector, "renderOverviewInspector");
390
+ function renderRoutesInspector(snapshot) {
391
+ return renderInspector(
392
+ "routes",
393
+ "Routes",
394
+ snapshot.routes.map((route, index) => ({
395
+ id: `route-${index}`,
396
+ label: route.pattern,
397
+ description: route.filePath,
398
+ value: route.kind,
399
+ searchValue: `${route.kind} ${route.pattern} ${route.filePath} ${_optionalChain([route, 'access', _3 => _3.runtime, 'optionalAccess', _4 => _4.runtime]) || "inherited"}`,
400
+ detailMeta: route.kind,
401
+ content: `${renderDetailIntro(
402
+ `${route.kind} route`,
403
+ route.pattern,
404
+ route.filePath,
405
+ "route"
406
+ )}${renderPropertyList([
407
+ ["Kind", renderBadge(route.kind, route.kind)],
408
+ ["Pattern", `<code>${escapeHtml(route.pattern)}</code>`],
409
+ ["Runtime", renderRuntime(route.runtime)],
410
+ ["Source", `<code>${escapeHtml(route.filePath)}</code>`]
411
+ ])}`
412
+ })),
413
+ "Filter routes or files"
414
+ );
415
+ }
416
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderRoutesInspector, "renderRoutesInspector");
417
+ function renderApiInspector(snapshot) {
418
+ return renderInspector(
419
+ "api",
420
+ "API routes",
421
+ snapshot.apiRoutes.map((route, index) => ({
422
+ id: `api-${index}`,
423
+ label: route.path,
424
+ description: route.filePath,
425
+ value: route.methods.length,
426
+ searchValue: `${route.path} ${route.methods.join(" ")} ${route.filePath} ${route.runtime.runtime}`,
427
+ detailMeta: route.methods.join(" / "),
428
+ content: `${renderDetailIntro(
429
+ "Server endpoint",
430
+ route.path,
431
+ route.filePath,
432
+ "api"
433
+ )}${renderPropertyList([
434
+ [
435
+ "Methods",
436
+ `<span class="method-list">${route.methods.map((method) => renderBadge(method, "method")).join("")}</span>`
437
+ ],
438
+ ["Runtime", renderRuntime(route.runtime)],
439
+ ["Source", `<code>${escapeHtml(route.filePath)}</code>`]
440
+ ])}`
441
+ })),
442
+ "Filter endpoints or methods"
443
+ );
444
+ }
445
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderApiInspector, "renderApiInspector");
446
+ function renderSystemsInspector(snapshot) {
447
+ return renderInspector("systems", "Systems", [
448
+ {
449
+ id: "integrations",
450
+ label: "Integrations",
451
+ description: "Configured product adapters",
452
+ value: snapshot.integrations.length,
453
+ content: renderIntegrations(snapshot)
454
+ },
455
+ {
456
+ id: "middleware",
457
+ label: "Middleware",
458
+ description: "Request layers and source modules",
459
+ value: snapshot.middleware.length,
460
+ content: renderMiddleware(snapshot)
461
+ },
462
+ {
463
+ id: "storage",
464
+ label: "Storage mounts",
465
+ description: "Root driver and named namespaces",
466
+ value: snapshot.storage.length,
467
+ content: renderStorage(snapshot)
468
+ },
469
+ {
470
+ id: "docs",
471
+ label: "Documentation",
472
+ description: snapshot.docs.entry || "No docs route",
473
+ value: snapshot.docs.enabled ? "on" : "off",
474
+ content: `${renderDetailIntro(
475
+ "Documentation",
476
+ snapshot.docs.enabled ? "Docs enabled" : "Docs disabled",
477
+ "Farm can serve application documentation from the same development runtime.",
478
+ "book"
479
+ )}${renderPropertyList([
480
+ ["State", renderBadge(snapshot.docs.enabled ? "enabled" : "disabled")],
481
+ ["Entry", `<code>${escapeHtml(snapshot.docs.entry || "Not configured")}</code>`]
482
+ ])}`
483
+ }
484
+ ]);
485
+ }
486
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderSystemsInspector, "renderSystemsInspector");
487
+ function renderRuntimeInspector(snapshot) {
488
+ return renderInspector("runtime", "Runtime", [
489
+ {
490
+ id: "deployment",
491
+ label: "Deployment",
492
+ description: `${snapshot.deployment.target} / ${snapshot.deployment.preset}`,
493
+ content: `${renderDetailIntro(
494
+ "Deployment target",
495
+ snapshot.deployment.target,
496
+ "Resolved platform adapter and build output for this application.",
497
+ "runtime"
498
+ )}${renderPropertyList([
499
+ ["Target", `<code>${escapeHtml(snapshot.deployment.target)}</code>`],
500
+ ["Nitro preset", `<code>${escapeHtml(snapshot.deployment.preset)}</code>`],
501
+ [
502
+ "Output directory",
503
+ `<code>${escapeHtml(snapshot.deployment.outputDir || "Framework default")}</code>`
504
+ ]
505
+ ])}`
506
+ },
507
+ {
508
+ id: "cron",
509
+ label: "Cron routes",
510
+ description: "Portable scheduled API routes",
511
+ value: snapshot.cron.length,
512
+ content: renderCron(snapshot)
513
+ },
514
+ {
515
+ id: "workflows",
516
+ label: "Workflows",
517
+ description: "Discovered workflow modules",
518
+ value: snapshot.workflows.length,
519
+ content: renderWorkflows(snapshot)
520
+ },
521
+ {
522
+ id: "features",
523
+ label: "Framework features",
524
+ description: "Resolved configuration switches",
525
+ content: renderFeatureMatrix(snapshot)
526
+ },
527
+ {
528
+ id: "environment",
529
+ label: "Environment",
530
+ description: "Validated key names only",
531
+ value: snapshot.environment.server.length + snapshot.environment.public.length,
532
+ content: renderEnvironment(snapshot)
533
+ },
534
+ {
535
+ id: "layers",
536
+ label: "Layers",
537
+ description: "Extended source roots",
538
+ value: snapshot.layers.length,
539
+ content: renderLayers(snapshot)
540
+ }
541
+ ]);
542
+ }
543
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderRuntimeInspector, "renderRuntimeInspector");
544
+ function renderRawInspector(snapshot) {
545
+ return renderInspector("raw", "Raw snapshot", [
546
+ {
547
+ id: "snapshot",
548
+ label: "Snapshot",
549
+ description: "Complete serialized runtime state",
550
+ content: renderJson(snapshot)
551
+ },
552
+ {
553
+ id: "routes",
554
+ label: "Routes",
555
+ description: "Pages and route boundaries",
556
+ value: snapshot.routes.length,
557
+ content: renderJson(snapshot.routes)
558
+ },
559
+ {
560
+ id: "api",
561
+ label: "API",
562
+ description: "Typed server endpoints",
563
+ value: snapshot.apiRoutes.length,
564
+ content: renderJson(snapshot.apiRoutes)
565
+ },
566
+ {
567
+ id: "systems",
568
+ label: "Systems",
569
+ description: "Integrations, middleware, and storage",
570
+ content: renderJson({
571
+ integrations: snapshot.integrations,
572
+ middleware: snapshot.middleware,
573
+ storage: snapshot.storage
574
+ })
575
+ },
576
+ {
577
+ id: "diagnostics",
578
+ label: "Diagnostics",
579
+ description: "Framework health findings",
580
+ value: snapshot.diagnostics.length,
581
+ content: renderJson(snapshot.diagnostics)
582
+ }
583
+ ]);
584
+ }
585
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderRawInspector, "renderRawInspector");
586
+ function renderNavigationItem(view, label) {
587
+ return `<button type="button" class="nav-item" data-view-trigger="${view}" aria-selected="false">
588
+ <span>${escapeHtml(label)}</span>
589
+ </button>`;
590
+ }
591
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderNavigationItem, "renderNavigationItem");
592
+ function renderFarmDevtoolsHtml(snapshot) {
593
+ const healthLabel = snapshot.health === "ready" ? "Ready" : snapshot.health === "error" ? "Error" : "Attention";
594
+ const generatedTime = new Date(snapshot.generatedAt).toLocaleTimeString("en-US", {
595
+ hour: "2-digit",
596
+ minute: "2-digit",
597
+ second: "2-digit",
598
+ hour12: false
599
+ });
600
+ return `<!doctype html>
601
+ <html lang="en" class="devtools-frame">
602
+ <head>
603
+ <meta charset="utf-8">
604
+ <meta name="viewport" content="width=device-width, initial-scale=1">
605
+ <meta name="color-scheme" content="dark">
606
+ <title>Farm Devtools - ${escapeHtml(snapshot.project.name)}</title>
607
+ <style>
608
+ :root {
609
+ color-scheme: dark;
610
+ --background: #000;
611
+ --surface: #050505;
612
+ --surface-raised: #090909;
613
+ --foreground: #f5f5f5;
614
+ --muted: #858585;
615
+ --muted-strong: #a8a8a8;
616
+ --line: rgb(255 255 255 / 0.12);
617
+ --line-soft: rgb(255 255 255 / 0.065);
618
+ --line-strong: rgb(255 255 255 / 0.22);
619
+ --font-sans: "Geist Sans", Geist, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
620
+ --font-mono: "Geist Mono", "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
621
+ }
622
+ * { box-sizing: border-box; }
623
+ html { min-width: 320px; min-height: 100%; background: var(--background); }
624
+ 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; }
625
+ button, input { color: inherit; font: inherit; letter-spacing: 0; }
626
+ button, a { -webkit-tap-highlight-color: transparent; }
627
+ button { cursor: pointer; }
628
+ a { color: inherit; }
629
+ [hidden] { display: none !important; }
630
+ 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; }
631
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
632
+ .icon { width: 16px; height: 16px; flex: 0 0 auto; }
633
+ .stage { display: grid; min-height: 100vh; min-height: 100dvh; place-items: center; padding: 20px; }
634
+ .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); }
635
+ .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); }
636
+ .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; }
637
+ .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; }
638
+ .brand-slash { color: #555; }
639
+ .brand-product { color: var(--muted-strong); }
640
+ .tabbar { display: flex; min-width: 0; flex: 1 1 auto; align-items: stretch; overflow-x: auto; scrollbar-width: none; }
641
+ .tabbar::-webkit-scrollbar { display: none; }
642
+ .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; }
643
+ .nav-item::after { position: absolute; right: 10px; bottom: -1px; left: 10px; height: 1px; background: transparent; content: ""; }
644
+ .nav-item:hover, .nav-item:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); outline: none; }
645
+ .nav-item[aria-selected="true"] { color: #fff; }
646
+ .nav-item[aria-selected="true"]::after { background: #fff; }
647
+ .nav-item .icon { width: 13px; height: 13px; }
648
+ .nav-item small { color: #666; font-size: 9px; font-weight: 400; }
649
+ .topbar-meta { display: flex; flex: 0 0 auto; margin-left: auto; border-left: 1px solid var(--line); }
650
+ .deprecation-tag { display: inline-flex; align-items: center; padding: 0 10px; border-right: 1px solid var(--line); color: #d9a626; font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; white-space: nowrap; }
651
+ .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; }
652
+ .status-dot { width: 5px; height: 5px; background: #fff; box-shadow: 0 0 0 3px rgb(255 255 255 / 0.06); }
653
+ .status-dot-attention { background: #909090; animation: status-pulse 1.8s ease-in-out infinite; }
654
+ .status-dot-error { background: transparent; border: 1px solid #fff; }
655
+ .workspace { min-height: 0; flex: 1 1 auto; }
656
+ .eyebrow { display: block; color: var(--muted); font-size: 9px; font-weight: 400; text-transform: uppercase; }
657
+ .content { height: 100%; min-width: 0; }
658
+ .view { height: 100%; min-width: 0; overflow: hidden; }
659
+ .split-view { display: grid; height: 100%; min-height: 0; grid-template-columns: clamp(230px, 28%, 300px) minmax(0, 1fr); }
660
+ .pane { min-width: 0; min-height: 0; overflow: hidden; background: var(--background); }
661
+ .pane-list { display: flex; flex-direction: column; border-right: 1px solid var(--line); }
662
+ .pane-detail { position: relative; }
663
+ .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); }
664
+ .pane-header strong { overflow: hidden; font-size: 11px; font-weight: 520; text-overflow: ellipsis; white-space: nowrap; }
665
+ .pane-header span { overflow: hidden; color: var(--muted); font-family: var(--font-mono); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; }
666
+ .pane-tools { border-bottom: 1px solid var(--line); }
667
+ .pane-tools .filter-control { width: 100%; min-height: 36px; border: 0; }
668
+ .pane-scroll, .detail-scroll { min-height: 0; overflow: auto; overscroll-behavior: contain; }
669
+ .pane-scroll { flex: 1 1 auto; }
670
+ .inspector-list { scrollbar-width: thin; scrollbar-color: var(--line-strong) transparent; }
671
+ .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; }
672
+ .inspector-row::before { position: absolute; inset: 0 auto 0 0; width: 1px; background: transparent; content: ""; }
673
+ .inspector-row:hover, .inspector-row:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); outline: none; }
674
+ .inspector-row[aria-selected="true"] { background: rgb(255 255 255 / 0.075); color: #fff; }
675
+ .inspector-row[aria-selected="true"]::before { background: #fff; }
676
+ .inspector-row-copy { min-width: 0; }
677
+ .inspector-row-copy strong, .inspector-row-copy small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
678
+ .inspector-row-copy strong { color: inherit; font-size: 11px; font-weight: 520; }
679
+ .inspector-row-copy small { margin-top: 3px; color: var(--muted); font-family: var(--font-mono); font-size: 9px; }
680
+ .inspector-row-value { color: var(--muted-strong); font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; }
681
+ .detail-panel { display: flex; height: 100%; min-height: 0; flex-direction: column; }
682
+ .detail-scroll { flex: 1 1 auto; }
683
+ .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); }
684
+ .detail-icon { display: grid; width: 32px; height: 32px; border: 1px solid var(--line); color: var(--muted-strong); place-items: center; }
685
+ .detail-icon .icon { width: 15px; height: 15px; }
686
+ .detail-intro .mini-label { margin: 1px 0 8px; }
687
+ .detail-intro h2 { margin: 0; overflow-wrap: anywhere; font-size: 20px; font-weight: 530; line-height: 1.2; }
688
+ .detail-intro p { max-width: 680px; margin: 8px 0 0; color: var(--muted); font-size: 11px; line-height: 1.55; }
689
+ .detail-section { border-top: 1px solid var(--line); }
690
+ .detail-intro + .detail-section { border-top: 0; }
691
+ .property-list { margin: 0; }
692
+ .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); }
693
+ .property-list dt { color: var(--muted); font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; }
694
+ .property-list dd { min-width: 0; margin: 0; overflow-wrap: anywhere; color: var(--muted-strong); font-size: 11px; }
695
+ .property-list dd > code { color: var(--foreground); font-size: 10px; }
696
+ .single-pane { height: 100%; min-height: 0; }
697
+ .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; }
698
+ .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); }
699
+ .diagnostic:last-child { border-bottom: 0; }
700
+ .diagnostic-mark { display: grid; width: 28px; height: 28px; place-items: center; border: 1px solid var(--line); color: var(--muted-strong); }
701
+ .diagnostic-code { display: block; margin-bottom: 5px; color: var(--muted); font-size: 9px; }
702
+ .diagnostic strong { display: block; font-size: 12px; font-weight: 540; }
703
+ .diagnostic p { margin: 5px 0 0; color: var(--muted-strong); font-size: 11px; line-height: 1.5; }
704
+ .diagnostic small { display: block; margin-top: 6px; color: var(--muted); font-size: 10px; line-height: 1.5; }
705
+ .diagnostic-warning { box-shadow: inset 1px 0 var(--line-strong); }
706
+ .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); }
707
+ .system-row:last-child { border-bottom: 0; }
708
+ .system-icon { display: grid; width: 28px; height: 28px; place-items: center; color: var(--muted-strong); }
709
+ .system-row strong, .system-row small { display: block; }
710
+ .system-row strong { font-size: 12px; font-weight: 520; }
711
+ .system-row small { margin-top: 3px; overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
712
+ .system-value { font-family: var(--font-mono); font-size: 11px; }
713
+ .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); }
714
+ .filter-control:focus-within { border-color: var(--line-strong); color: #fff; }
715
+ .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; }
716
+ .filter-control input::placeholder { color: #666; }
717
+ .filter-control kbd { padding: 1px 5px; border: 1px solid var(--line); color: var(--muted); font-size: 9px; }
718
+ .table-scroll { width: 100%; overflow-x: auto; }
719
+ table { width: 100%; border-collapse: collapse; table-layout: auto; }
720
+ 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; }
721
+ 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; }
722
+ tr:last-child td { border-bottom: 0; }
723
+ tbody tr { transition: background-color 120ms ease-out; }
724
+ tbody tr:hover { background: rgb(255 255 255 / 0.035); }
725
+ td code { color: var(--foreground); font-size: 10px; white-space: nowrap; }
726
+ .file-cell { max-width: 420px; overflow: hidden; font-family: var(--font-mono); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
727
+ .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; }
728
+ .badge-ready, .badge-page, .badge-node { border-color: var(--line-strong); color: #fff; }
729
+ .badge-warning, .badge-attention, .badge-edge { border-style: dashed; color: #fff; }
730
+ .badge-error { background: #fff; color: #000; }
731
+ .badge-method { min-width: 36px; justify-content: center; border-color: var(--line-soft); color: #d0d0d0; }
732
+ .method-list, .runtime-value, .runtime-facts { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; }
733
+ .runtime-value small, .runtime-facts span { color: var(--muted); font-family: var(--font-mono); font-size: 9px; }
734
+ .cell-detail { display: block; margin-top: 4px; color: var(--muted); font-family: var(--font-mono); font-size: 9px; }
735
+ .route-operation { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
736
+ .route-operation + .route-operation { margin-top: 5px; }
737
+ .route-operation small { color: var(--muted); font-family: var(--font-mono); font-size: 9px; white-space: nowrap; }
738
+ .schedule { display: block; }
739
+ .schedule + .schedule { margin-top: 4px; }
740
+ .muted { color: var(--muted); }
741
+ .empty-state { display: grid; min-height: 156px; place-items: center; align-content: center; gap: 7px; padding: 24px; color: var(--muted); text-align: center; }
742
+ .empty-state strong { color: var(--muted-strong); font-size: 12px; font-weight: 520; }
743
+ .empty-state span { max-width: 420px; font-size: 10px; line-height: 1.5; }
744
+ .filtered-empty { padding: 24px; color: var(--muted); font-family: var(--font-mono); font-size: 10px; text-align: center; }
745
+ .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); }
746
+ .feature-matrix > div:last-child { border-bottom: 0; }
747
+ .feature-matrix span:first-child { font-size: 11px; }
748
+ .environment-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
749
+ .environment-grid > div { min-height: 128px; padding: 16px; }
750
+ .environment-grid > div + div { border-left: 1px solid var(--line); }
751
+ .mini-label { display: block; margin-bottom: 12px; color: var(--muted); font-size: 9px; text-transform: uppercase; }
752
+ .key-list { display: flex; flex-wrap: wrap; gap: 6px; }
753
+ .key-list code { padding: 4px 6px; border: 1px solid var(--line-soft); color: var(--muted-strong); font-size: 9px; }
754
+ .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); }
755
+ .layer-list > div:last-child { border-bottom: 0; }
756
+ .layer-list span { display: flex; align-items: center; gap: 8px; }
757
+ .layer-list strong { font-size: 11px; font-weight: 520; }
758
+ .layer-list code, .layer-list small { color: var(--muted); font-size: 9px; }
759
+ .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; }
760
+ .statusbar span { display: flex; align-items: center; gap: 7px; }
761
+ @keyframes status-pulse { 0%, 100% { opacity: 0.4; } 50% { opacity: 1; } }
762
+ @media (max-width: 1100px) {
763
+ .topbar-status { display: none; }
764
+ }
765
+ @media (max-width: 840px) {
766
+ .stage { display: block; padding: 0; }
767
+ .shell { width: 100%; height: 100dvh; min-height: 0; border: 0; }
768
+ .topbar { flex-wrap: wrap; }
769
+ .brand { min-width: auto; height: 40px; border-right: 0; }
770
+ .brand-product, .brand-slash { display: none; }
771
+ .tabbar { order: 3; width: 100%; flex-basis: 100%; border-top: 1px solid var(--line); }
772
+ .topbar-meta { height: 40px; }
773
+ .nav-item { min-height: 39px; }
774
+ .split-view { grid-template-columns: 1fr; grid-template-rows: minmax(150px, 34%) minmax(0, 1fr); }
775
+ .pane-list { border-right: 0; border-bottom: 1px solid var(--line); }
776
+ .filter-control { width: 100%; }
777
+ }
778
+ @media (max-width: 560px) {
779
+ .detail-intro { min-height: 112px; padding: 16px; }
780
+ .detail-intro h2 { font-size: 17px; }
781
+ .property-list > div { grid-template-columns: minmax(98px, 0.38fr) minmax(0, 1fr); gap: 12px; padding-inline: 12px; }
782
+ .environment-grid { grid-template-columns: 1fr; }
783
+ .environment-grid > div + div { border-top: 1px solid var(--line); border-left: 0; }
784
+ .statusbar span:last-child { display: none; }
785
+ }
786
+ @media (prefers-reduced-motion: reduce) {
787
+ html { scroll-behavior: auto; }
788
+ *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }
789
+ }
790
+ </style>
791
+ <style data-assistant-ui-layout>
792
+ :root {
793
+ --background: #0a0a0a;
794
+ --surface: #0a0a0a;
795
+ --surface-raised: #111111;
796
+ --foreground: #ededed;
797
+ --muted: #929299;
798
+ --muted-strong: #b4b4ba;
799
+ --line: rgb(255 255 255 / 0.11);
800
+ --line-soft: rgb(255 255 255 / 0.075);
801
+ --line-strong: rgb(255 255 255 / 0.16);
802
+ --accent: #1c1c1e;
803
+ }
804
+ html, body { width: 100%; height: 100%; background: #080808; }
805
+ body { position: relative; min-height: 100dvh; overflow: hidden; font-size: 13px; }
806
+ .stage {
807
+ position: fixed;
808
+ inset: 0;
809
+ z-index: 2;
810
+ display: grid;
811
+ min-height: 0;
812
+ padding: 20px;
813
+ place-items: center;
814
+ pointer-events: none;
815
+ }
816
+ .shell {
817
+ width: min(960px, 92vw);
818
+ height: min(560px, 80dvh);
819
+ min-width: 0;
820
+ min-height: 0;
821
+ border: 1px solid var(--line-strong);
822
+ border-radius: 12px;
823
+ background: var(--background);
824
+ box-shadow: 0 24px 80px rgb(0 0 0 / 0.72), 0 4px 18px rgb(0 0 0 / 0.45);
825
+ pointer-events: auto;
826
+ animation: devtools-window-in 180ms cubic-bezier(0.175, 0.885, 0.32, 1.08);
827
+ }
828
+ .topbar {
829
+ min-height: 40px;
830
+ height: 40px;
831
+ align-items: center;
832
+ justify-content: space-between;
833
+ flex-wrap: nowrap;
834
+ border-bottom-color: var(--line);
835
+ background: var(--background);
836
+ }
837
+ .brand { display: none; }
838
+ .tabbar {
839
+ height: 100%;
840
+ flex: 1 1 auto;
841
+ align-items: stretch;
842
+ order: initial;
843
+ width: auto;
844
+ flex-basis: auto;
845
+ padding-inline-start: 8px;
846
+ border-top: 0;
847
+ }
848
+ .nav-item {
849
+ min-height: 39px;
850
+ height: 39px;
851
+ gap: 0;
852
+ padding: 0 12px;
853
+ border-radius: 0;
854
+ color: var(--muted);
855
+ font-family: var(--font-sans);
856
+ font-size: 13px;
857
+ font-weight: 500;
858
+ text-transform: none;
859
+ }
860
+ .nav-item::after {
861
+ right: 8px;
862
+ bottom: -1px;
863
+ left: 8px;
864
+ height: 2px;
865
+ border-radius: 999px;
866
+ }
867
+ .nav-item:hover, .nav-item:focus-visible { background: transparent; color: var(--foreground); }
868
+ .nav-item[aria-selected="true"] { color: var(--foreground); }
869
+ .topbar-meta {
870
+ height: 100%;
871
+ align-items: center;
872
+ gap: 8px;
873
+ margin-left: 0;
874
+ padding: 0 8px 0 4px;
875
+ border-left: 0;
876
+ }
877
+ .project-select {
878
+ display: inline-flex;
879
+ height: 28px;
880
+ min-width: 0;
881
+ align-items: center;
882
+ gap: 5px;
883
+ padding: 0 9px;
884
+ border: 1px solid var(--line);
885
+ border-radius: 8px;
886
+ color: var(--muted-strong);
887
+ font-size: 12px;
888
+ white-space: nowrap;
889
+ }
890
+ .project-select .icon { width: 12px; height: 12px; transform: rotate(90deg); }
891
+ .topbar-status {
892
+ min-width: max-content;
893
+ gap: 6px;
894
+ padding: 0;
895
+ color: var(--muted);
896
+ font-family: var(--font-sans);
897
+ font-size: 11px;
898
+ text-transform: none;
899
+ }
900
+ .status-dot {
901
+ width: 6px;
902
+ height: 6px;
903
+ border: 0;
904
+ border-radius: 999px;
905
+ background: #2dd4bf;
906
+ box-shadow: none;
907
+ }
908
+ .status-dot-attention { background: #f59e0b; animation: none; }
909
+ .status-dot-error { background: #ef4444; }
910
+ .close-action {
911
+ display: inline-flex;
912
+ width: 28px;
913
+ height: 28px;
914
+ flex: 0 0 auto;
915
+ align-items: center;
916
+ justify-content: center;
917
+ padding: 0;
918
+ border: 0;
919
+ border-radius: 6px;
920
+ background: transparent;
921
+ color: var(--muted);
922
+ text-decoration: none;
923
+ transition: background-color 120ms ease-out, color 120ms ease-out;
924
+ }
925
+ .close-action:hover, .close-action:focus-visible { background: var(--accent); color: var(--foreground); outline: none; }
926
+ .close-action .icon { width: 14px; height: 14px; }
927
+ .workspace, .content, .view { min-height: 0; }
928
+ .split-view {
929
+ grid-template-columns: clamp(14rem, 28%, 18rem) minmax(0, 1fr);
930
+ grid-template-rows: minmax(0, 1fr);
931
+ }
932
+ .pane { background: var(--background); }
933
+ .pane-list { border-right: 1px solid var(--line); border-bottom: 0; }
934
+ .pane-header {
935
+ min-height: 32px;
936
+ height: 32px;
937
+ max-height: 32px;
938
+ flex: 0 0 32px;
939
+ padding: 0 12px;
940
+ border-bottom-color: var(--line);
941
+ background: var(--background);
942
+ }
943
+ .pane-header strong {
944
+ color: var(--muted);
945
+ font-size: 11px;
946
+ font-weight: 400;
947
+ line-height: 1;
948
+ }
949
+ .pane-header span {
950
+ color: var(--muted);
951
+ font-family: var(--font-sans);
952
+ font-size: 10px;
953
+ line-height: 1;
954
+ }
955
+ .pane-tools { border-bottom-color: var(--line); }
956
+ .pane-tools .filter-control { min-height: 32px; height: 32px; }
957
+ .filter-control {
958
+ min-height: 32px;
959
+ gap: 7px;
960
+ padding: 0 10px;
961
+ border-color: var(--line);
962
+ border-radius: 0;
963
+ background: var(--background);
964
+ }
965
+ .filter-control .icon { width: 13px; height: 13px; }
966
+ .filter-control input { font-family: var(--font-sans); font-size: 11px; }
967
+ .filter-control input::placeholder { color: var(--muted); }
968
+ .filter-control kbd {
969
+ padding: 1px 5px;
970
+ border-color: var(--line);
971
+ border-radius: 4px;
972
+ color: var(--muted);
973
+ font-size: 9px;
974
+ }
975
+ .inspector-row {
976
+ min-height: 44px;
977
+ grid-template-columns: minmax(0, 1fr) auto;
978
+ gap: 8px;
979
+ padding: 6px 11px 6px 12px;
980
+ border: 0;
981
+ border-left: 2px solid transparent;
982
+ border-radius: 0;
983
+ color: var(--muted-strong);
984
+ }
985
+ .inspector-row::before { display: none; }
986
+ .inspector-row:hover, .inspector-row:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); }
987
+ .inspector-row[aria-selected="true"] {
988
+ border-left-color: var(--foreground);
989
+ background: var(--accent);
990
+ color: var(--foreground);
991
+ }
992
+ .inspector-row-copy strong { font-size: 12px; font-weight: 500; }
993
+ .inspector-row-copy small {
994
+ margin-top: 2px;
995
+ color: var(--muted);
996
+ font-family: var(--font-sans);
997
+ font-size: 10px;
998
+ }
999
+ .inspector-row-value {
1000
+ padding: 2px 6px;
1001
+ border: 1px solid var(--line);
1002
+ border-radius: 999px;
1003
+ background: rgb(255 255 255 / 0.035);
1004
+ color: var(--muted);
1005
+ font-family: var(--font-sans);
1006
+ font-size: 9px;
1007
+ line-height: 1.2;
1008
+ text-transform: none;
1009
+ }
1010
+ .detail-intro {
1011
+ display: block;
1012
+ min-height: 0;
1013
+ padding: 12px;
1014
+ border-bottom-color: var(--line-soft);
1015
+ }
1016
+ .detail-icon { display: none; }
1017
+ .detail-intro .mini-label { margin: 0 0 8px; }
1018
+ .detail-intro h2 { font-size: 13px; font-weight: 500; line-height: 1.3; }
1019
+ .detail-intro p { margin-top: 6px; font-size: 11px; line-height: 1.5; }
1020
+ .detail-section, .detail-intro + .detail-section { border-top-color: var(--line); }
1021
+ .property-list > div {
1022
+ min-height: 36px;
1023
+ grid-template-columns: minmax(96px, 0.28fr) minmax(0, 1fr);
1024
+ gap: 14px;
1025
+ padding: 7px 12px;
1026
+ border-bottom-color: var(--line-soft);
1027
+ }
1028
+ .property-list dt { font-family: var(--font-sans); font-size: 10px; text-transform: none; }
1029
+ .property-list dd { color: var(--foreground); font-size: 11px; }
1030
+ .property-list dd > code { font-size: 10px; }
1031
+ .json-viewer {
1032
+ padding: 12px;
1033
+ background: var(--background);
1034
+ color: var(--muted-strong);
1035
+ font-size: 10px;
1036
+ line-height: 1.55;
1037
+ }
1038
+ .diagnostic {
1039
+ min-height: 68px;
1040
+ grid-template-columns: 24px minmax(0, 1fr) auto;
1041
+ gap: 10px;
1042
+ padding: 11px 12px;
1043
+ border-bottom-color: var(--line-soft);
1044
+ }
1045
+ .diagnostic-mark { width: 22px; height: 22px; border: 0; }
1046
+ .diagnostic-mark .icon { width: 13px; height: 13px; }
1047
+ .diagnostic-code { margin-bottom: 3px; font-size: 9px; }
1048
+ .diagnostic strong { font-size: 11px; font-weight: 500; }
1049
+ .diagnostic p { margin-top: 3px; font-size: 10px; line-height: 1.45; }
1050
+ .diagnostic small { margin-top: 4px; font-size: 9px; }
1051
+ .diagnostic-warning { box-shadow: none; }
1052
+ .system-row {
1053
+ min-height: 48px;
1054
+ grid-template-columns: 24px minmax(0, 1fr) auto;
1055
+ gap: 8px;
1056
+ padding: 8px 12px;
1057
+ border-bottom-color: var(--line-soft);
1058
+ }
1059
+ .system-icon { width: 20px; height: 20px; }
1060
+ .system-icon .icon { width: 13px; height: 13px; }
1061
+ .system-row strong { font-size: 11px; font-weight: 500; }
1062
+ .system-row small { margin-top: 2px; font-size: 10px; }
1063
+ .system-value { color: var(--muted); font-size: 10px; }
1064
+ table { font-size: 11px; }
1065
+ th {
1066
+ height: 32px;
1067
+ padding: 0 12px;
1068
+ background: var(--background);
1069
+ font-family: var(--font-sans);
1070
+ font-size: 10px;
1071
+ font-weight: 400;
1072
+ text-transform: none;
1073
+ }
1074
+ td { min-height: 40px; padding: 9px 12px; font-size: 10px; }
1075
+ td code, .file-cell { font-size: 9px; }
1076
+ .badge {
1077
+ min-height: 18px;
1078
+ padding: 1px 6px;
1079
+ border-radius: 999px;
1080
+ background: rgb(255 255 255 / 0.04);
1081
+ font-family: var(--font-sans);
1082
+ font-size: 9px;
1083
+ text-transform: none;
1084
+ }
1085
+ .badge-error { background: var(--foreground); color: var(--background); }
1086
+ .badge-warning, .badge-attention, .badge-edge { border-style: solid; }
1087
+ .empty-state { min-height: 100%; padding: 24px; gap: 6px; }
1088
+ .empty-state .icon { display: none; }
1089
+ .empty-state strong { font-size: 12px; font-weight: 400; }
1090
+ .empty-state span { font-size: 11px; }
1091
+ .feature-matrix > div { min-height: 36px; padding: 7px 12px; border-bottom-color: var(--line-soft); }
1092
+ .feature-matrix span:first-child { font-size: 11px; }
1093
+ .environment-grid > div { min-height: 104px; padding: 12px; }
1094
+ .mini-label { margin-bottom: 8px; font-family: var(--font-sans); font-size: 10px; text-transform: none; }
1095
+ .key-list code { border-radius: 4px; font-size: 9px; }
1096
+ .layer-list > div { min-height: 44px; padding: 8px 12px; border-bottom-color: var(--line-soft); }
1097
+ .layer-list strong { font-size: 11px; font-weight: 500; }
1098
+ .statusbar { display: none; }
1099
+ html.devtools-frame .stage { position: static; width: 100%; height: 100%; min-height: 100%; padding: 0; }
1100
+ html.devtools-frame .shell { width: 100%; height: 100%; border-radius: 12px; box-shadow: none; animation: none; }
1101
+ @keyframes devtools-window-in {
1102
+ from { opacity: 0; transform: scale(0.985) translateY(4px); }
1103
+ to { opacity: 1; transform: scale(1) translateY(0); }
1104
+ }
1105
+ @media (max-width: 700px) {
1106
+ .stage { display: grid; padding: 0; }
1107
+ .shell {
1108
+ width: 100%;
1109
+ height: 100%;
1110
+ min-height: 0;
1111
+ border: 1px solid var(--line-strong);
1112
+ border-radius: 10px;
1113
+ }
1114
+ .topbar { flex-wrap: nowrap; }
1115
+ .tabbar {
1116
+ order: initial;
1117
+ width: auto;
1118
+ flex-basis: auto;
1119
+ border-top: 0;
1120
+ padding-inline-start: 4px;
1121
+ }
1122
+ .topbar-meta { height: 40px; }
1123
+ .nav-item { min-height: 39px; height: 39px; padding-inline: 9px; }
1124
+ .split-view { grid-template-columns: 1fr; grid-template-rows: minmax(148px, 36%) minmax(0, 1fr); }
1125
+ .pane-list { border-right: 0; border-bottom: 1px solid var(--line); }
1126
+ }
1127
+ @media (max-width: 560px) {
1128
+ .project-select { display: none; }
1129
+ .topbar-status { display: none; }
1130
+ .topbar-meta { gap: 4px; padding-left: 0; }
1131
+ .status-label { display: none; }
1132
+ .detail-intro { min-height: 0; padding: 12px; }
1133
+ .detail-intro h2 { font-size: 13px; }
1134
+ .property-list > div { grid-template-columns: minmax(82px, 0.34fr) minmax(0, 1fr); gap: 10px; padding-inline: 10px; }
1135
+ }
1136
+ @media (prefers-reduced-motion: reduce) {
1137
+ .shell { animation: none; }
1138
+ }
1139
+ </style>
1140
+ </head>
1141
+ <body>
1142
+ <div class="stage">
1143
+ <div class="shell" role="dialog" aria-modal="true" aria-label="Farm.js DevTools">
1144
+ <header class="topbar">
1145
+ <nav class="tabbar" aria-label="Devtools views">
1146
+ ${renderNavigationItem("overview", "Overview")}
1147
+ ${renderNavigationItem("routes", "Routes")}
1148
+ ${renderNavigationItem("api", "API")}
1149
+ ${renderNavigationItem("systems", "Systems")}
1150
+ ${renderNavigationItem("runtime", "Runtime")}
1151
+ ${renderNavigationItem("raw", "Raw")}
1152
+ </nav>
1153
+ <div class="topbar-meta">
1154
+ <span class="deprecation-tag" title="The built-in dashboard is deprecated. Install @farm.js/devtools for the maintained workspace.">Deprecated &middot; use @farm.js/devtools</span>
1155
+ <span class="project-select">${escapeHtml(snapshot.project.name)} ${icon(
1156
+ "chevron"
1157
+ )}</span>
1158
+ <span class="topbar-status"><span class="status-dot"></span><span class="status-label">1 instance</span></span>
1159
+ <button class="close-action" type="button" data-close-devtools aria-label="Close DevTools" title="Close DevTools">${icon(
1160
+ "close"
1161
+ )}</button>
1162
+ </div>
1163
+ </header>
1164
+ <div class="workspace">
1165
+ <main class="content">
1166
+ <section class="view" data-view-panel="overview">${renderOverviewInspector(
1167
+ snapshot,
1168
+ healthLabel,
1169
+ generatedTime
1170
+ )}</section>
1171
+ <section class="view" data-view-panel="routes" hidden>${renderRoutesInspector(
1172
+ snapshot
1173
+ )}</section>
1174
+ <section class="view" data-view-panel="api" hidden>${renderApiInspector(
1175
+ snapshot
1176
+ )}</section>
1177
+ <section class="view" data-view-panel="systems" hidden>${renderSystemsInspector(
1178
+ snapshot
1179
+ )}</section>
1180
+ <section class="view" data-view-panel="runtime" hidden>${renderRuntimeInspector(
1181
+ snapshot
1182
+ )}</section>
1183
+ <section class="view" data-view-panel="raw" hidden>${renderRawInspector(snapshot)}</section>
1184
+ </main>
1185
+ </div>
1186
+ </div>
1187
+ </div>
1188
+ <script>
1189
+ (() => {
1190
+ const embedded = window.parent !== window;
1191
+ const closeDevtools = () => {
1192
+ if (embedded && window.parent !== window) {
1193
+ window.parent.postMessage({ type: "farm:devtools:close" }, location.origin);
1194
+ return;
1195
+ }
1196
+ location.assign("/");
1197
+ };
1198
+ document.querySelector("[data-close-devtools]")?.addEventListener("click", closeDevtools);
1199
+ document.addEventListener("keydown", (event) => {
1200
+ if (event.key === "Escape") {
1201
+ event.preventDefault();
1202
+ closeDevtools();
1203
+ return;
1204
+ }
1205
+ if (embedded && window.parent !== window) {
1206
+ window.parent.postMessage(
1207
+ {
1208
+ type: "farm:devtools:keydown",
1209
+ event: {
1210
+ key: event.key,
1211
+ code: event.code,
1212
+ altKey: event.altKey,
1213
+ ctrlKey: event.ctrlKey,
1214
+ metaKey: event.metaKey,
1215
+ shiftKey: event.shiftKey,
1216
+ repeat: event.repeat,
1217
+ },
1218
+ },
1219
+ location.origin,
1220
+ );
1221
+ }
1222
+ });
1223
+
1224
+ const validViews = new Set(["overview", "routes", "api", "systems", "runtime", "raw"]);
1225
+ const triggers = Array.from(document.querySelectorAll("[data-view-trigger]"));
1226
+ const panels = Array.from(document.querySelectorAll("[data-view-panel]"));
1227
+ const selectView = (view, updateHash = true) => {
1228
+ const nextView = validViews.has(view) ? view : "overview";
1229
+ triggers.forEach((trigger) => {
1230
+ trigger.setAttribute("aria-selected", String(trigger.dataset.viewTrigger === nextView));
1231
+ });
1232
+ panels.forEach((panel) => {
1233
+ panel.hidden = panel.dataset.viewPanel !== nextView;
1234
+ });
1235
+ if (updateHash) {
1236
+ history.replaceState(null, "", nextView === "overview" ? location.pathname : "#" + nextView);
1237
+ const activePanel = panels.find((panel) => panel.dataset.viewPanel === nextView);
1238
+ if (activePanel) activePanel.scrollTop = 0;
1239
+ }
1240
+ };
1241
+ triggers.forEach((trigger) => trigger.addEventListener("click", () => selectView(trigger.dataset.viewTrigger)));
1242
+ window.addEventListener("hashchange", () => selectView(location.hash.slice(1), false));
1243
+ selectView(location.hash.slice(1), false);
1244
+
1245
+ document.querySelectorAll("[data-detail-trigger]").forEach((trigger) => {
1246
+ trigger.addEventListener("click", () => {
1247
+ const scope = trigger.dataset.detailTrigger;
1248
+ const id = trigger.dataset.detailId;
1249
+ document.querySelectorAll('[data-detail-trigger="' + scope + '"]').forEach((row) => {
1250
+ row.setAttribute("aria-selected", String(row.dataset.detailId === id));
1251
+ });
1252
+ document.querySelectorAll('[data-detail-panel="' + scope + '"]').forEach((panel) => {
1253
+ panel.hidden = panel.dataset.detailId !== id;
1254
+ });
1255
+ });
1256
+ });
1257
+
1258
+ document.querySelectorAll("[data-filter]").forEach((input) => {
1259
+ input.addEventListener("input", () => {
1260
+ const id = input.dataset.filter;
1261
+ const query = input.value.trim().toLowerCase();
1262
+ const rows = Array.from(document.querySelectorAll('[data-filter-rows="' + id + '"] [data-search-value]'));
1263
+ let visible = 0;
1264
+ rows.forEach((row) => {
1265
+ const matches = !query || (row.dataset.searchValue || "").toLowerCase().includes(query);
1266
+ row.hidden = !matches;
1267
+ if (matches) visible += 1;
1268
+ });
1269
+ const selected = rows.find((row) => row.getAttribute("aria-selected") === "true");
1270
+ if (selected?.hidden) rows.find((row) => !row.hidden)?.click();
1271
+ const empty = document.querySelector('[data-filter-empty="' + id + '"]');
1272
+ if (empty) empty.hidden = visible !== 0;
1273
+ });
1274
+ });
1275
+
1276
+ document.addEventListener("keydown", (event) => {
1277
+ if (event.key !== "/" || event.metaKey || event.ctrlKey || event.altKey) return;
1278
+ const active = document.activeElement;
1279
+ if (active && (active.tagName === "INPUT" || active.tagName === "TEXTAREA")) return;
1280
+ const panel = document.querySelector("[data-view-panel]:not([hidden])");
1281
+ const input = panel?.querySelector("[data-filter]");
1282
+ if (input) {
1283
+ event.preventDefault();
1284
+ input.focus();
1285
+ }
1286
+ });
1287
+
1288
+ })();
1289
+ </script>
1290
+ </body>
1291
+ </html>`;
1292
+ }
1293
+ _chunkS3JO3N4Hcjs.__name.call(void 0, renderFarmDevtoolsHtml, "renderFarmDevtoolsHtml");
1294
+
1295
+
1296
+ exports.renderFarmDevtoolsHtml = renderFarmDevtoolsHtml;