@farm.js/core 0.1.17 → 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 (249) hide show
  1. package/dist/after.cjs +12 -225
  2. package/dist/agent-runtime.cjs +83 -2800
  3. package/dist/api/client.cjs +17 -4060
  4. package/dist/api/route-manager.cjs +34 -4354
  5. package/dist/api/runtime.cjs +29 -2696
  6. package/dist/api.cjs +88 -8434
  7. package/dist/app-markdown.cjs +39 -280
  8. package/dist/cache.cjs +38 -1560
  9. package/dist/chunk-22GUSVNJ.cjs +351 -0
  10. package/dist/chunk-2CQ74SP6.cjs +13 -0
  11. package/dist/chunk-2SJ4RQ6P.cjs +57 -0
  12. package/dist/chunk-3376ZTRC.cjs +1 -0
  13. package/dist/{chunk-YD4J4XCI.mjs → chunk-3XG26Z3J.mjs} +1 -1
  14. package/dist/chunk-4PNUXIVU.cjs +472 -0
  15. package/dist/chunk-4PPEPOZZ.cjs +21 -0
  16. package/dist/chunk-4ZFL5GFN.cjs +520 -0
  17. package/dist/chunk-5OVTOKGH.cjs +65 -0
  18. package/dist/chunk-5QIKR7RR.cjs +224 -0
  19. package/dist/chunk-5ZSWG4UX.cjs +127 -0
  20. package/dist/chunk-62YJ2IEB.cjs +238 -0
  21. package/dist/chunk-6EODJYCX.cjs +183 -0
  22. package/dist/chunk-6EXBPJ24.cjs +434 -0
  23. package/dist/chunk-6QQDAAAZ.cjs +38 -0
  24. package/dist/chunk-6V4TDWEC.cjs +455 -0
  25. package/dist/chunk-72ADZ6GQ.cjs +19 -0
  26. package/dist/chunk-75BRBIFP.cjs +172 -0
  27. package/dist/chunk-7W3CPVXS.cjs +24 -0
  28. package/dist/chunk-A6WIQH5Z.cjs +31 -0
  29. package/dist/chunk-AFOD3LYZ.cjs +377 -0
  30. package/dist/chunk-AMDMVWMI.cjs +39 -0
  31. package/dist/chunk-AORPIPNB.cjs +552 -0
  32. package/dist/chunk-ARJWXNQL.cjs +256 -0
  33. package/dist/chunk-AWRISO2H.cjs +2199 -0
  34. package/dist/chunk-AYJR42WX.cjs +711 -0
  35. package/dist/chunk-B4CH33IG.cjs +644 -0
  36. package/dist/chunk-BIDYX3SL.cjs +91 -0
  37. package/dist/chunk-BSTRERPP.cjs +40 -0
  38. package/dist/chunk-BYODCJD6.cjs +663 -0
  39. package/dist/chunk-C3VRMB6H.cjs +85 -0
  40. package/dist/chunk-C5GUTBZK.cjs +173 -0
  41. package/dist/chunk-CIAGU2X4.cjs +337 -0
  42. package/dist/chunk-CMGMGHUZ.cjs +27 -0
  43. package/dist/chunk-CXP5U3RW.cjs +54 -0
  44. package/dist/chunk-D2ULAULS.cjs +166 -0
  45. package/dist/chunk-D7JTOLFK.cjs +285 -0
  46. package/dist/chunk-DVM4FKZL.cjs +169 -0
  47. package/dist/chunk-DYEJQTDN.cjs +49 -0
  48. package/dist/chunk-E2BMSZ2W.cjs +151 -0
  49. package/dist/chunk-E3UK5IIB.cjs +593 -0
  50. package/dist/chunk-EM6SBQKM.cjs +470 -0
  51. package/dist/chunk-FJSWYIR7.cjs +482 -0
  52. package/dist/chunk-FK6GO24V.cjs +54 -0
  53. package/dist/chunk-FXUUWYAX.cjs +654 -0
  54. package/dist/chunk-G3HRIVEY.cjs +395 -0
  55. package/dist/chunk-G643DQCH.cjs +13 -0
  56. package/dist/chunk-G7HXGLEC.cjs +175 -0
  57. package/dist/chunk-GDSHDTJ4.cjs +152 -0
  58. package/dist/chunk-GNEO2XOF.cjs +2040 -0
  59. package/dist/{chunk-56DAX2BE.mjs → chunk-GYKJCFTS.mjs} +1 -1
  60. package/dist/chunk-H6G5INWM.cjs +1094 -0
  61. package/dist/chunk-HBTUGXHS.cjs +180 -0
  62. package/dist/chunk-HREOKQWT.cjs +45 -0
  63. package/dist/chunk-I4J452B7.cjs +435 -0
  64. package/dist/chunk-I57LW5VZ.cjs +94 -0
  65. package/dist/chunk-I7PUUDGY.cjs +389 -0
  66. package/dist/chunk-IAMRBF3Z.cjs +86 -0
  67. package/dist/chunk-IKNRN4VS.cjs +14214 -0
  68. package/dist/chunk-IQXFRNY2.cjs +169 -0
  69. package/dist/chunk-IXTFU4PL.cjs +2355 -0
  70. package/dist/chunk-J2OP5GG3.cjs +725 -0
  71. package/dist/chunk-J3LOGE4T.cjs +42 -0
  72. package/dist/chunk-J7FSKED3.cjs +93 -0
  73. package/dist/chunk-JDNHKPTD.cjs +22 -0
  74. package/dist/chunk-JSROZYYO.cjs +164 -0
  75. package/dist/chunk-K6FNHVDR.cjs +696 -0
  76. package/dist/chunk-KGZIORNL.cjs +43 -0
  77. package/dist/{chunk-MVIWBEJF.mjs → chunk-KPNVGRBL.mjs} +1 -1
  78. package/dist/chunk-KR6CKSXT.cjs +15 -0
  79. package/dist/chunk-KROWKCUH.cjs +185 -0
  80. package/dist/chunk-KVFPGF2M.cjs +46 -0
  81. package/dist/chunk-LCCBO7PJ.cjs +46 -0
  82. package/dist/chunk-LIUGYUX3.cjs +22 -0
  83. package/dist/chunk-LTNGXMQ6.cjs +55 -0
  84. package/dist/chunk-M2L4MYDQ.cjs +14 -0
  85. package/dist/chunk-MCJLA63J.cjs +1 -0
  86. package/dist/chunk-MKB2EGIR.cjs +148 -0
  87. package/dist/chunk-MQ3H6LT5.cjs +202 -0
  88. package/dist/chunk-MT763TDW.cjs +43 -0
  89. package/dist/chunk-MWSK6C4J.cjs +18 -0
  90. package/dist/chunk-MWWVKDW3.cjs +169 -0
  91. package/dist/chunk-NO3WWW3N.cjs +192 -0
  92. package/dist/chunk-NV3A5DXM.cjs +862 -0
  93. package/dist/chunk-NWOD6NIT.cjs +9 -0
  94. package/dist/chunk-NZKJGRB3.cjs +230 -0
  95. package/dist/chunk-OAVTUMJP.cjs +1496 -0
  96. package/dist/chunk-OHY2ZWUG.cjs +25 -0
  97. package/dist/chunk-OI6CMLWX.cjs +47 -0
  98. package/dist/chunk-OIEOCXKG.cjs +453 -0
  99. package/dist/chunk-OWOUTKIJ.cjs +558 -0
  100. package/dist/chunk-OX6O6WVA.cjs +74 -0
  101. package/dist/chunk-OXSIH4D6.cjs +476 -0
  102. package/dist/chunk-OYEUREB6.cjs +35 -0
  103. package/dist/chunk-PCOTGFSM.cjs +139 -0
  104. package/dist/chunk-PZYCPSCC.cjs +35 -0
  105. package/dist/chunk-QBK2AA4U.cjs +445 -0
  106. package/dist/chunk-QBPXNZGV.cjs +487 -0
  107. package/dist/chunk-QNPEUFHQ.cjs +27 -0
  108. package/dist/chunk-QZRVZSPN.cjs +236 -0
  109. package/dist/chunk-R5A5KNVX.cjs +20 -0
  110. package/dist/chunk-R5JIFR6B.cjs +42 -0
  111. package/dist/chunk-R6AIILII.cjs +193 -0
  112. package/dist/chunk-RG3ZOTG5.cjs +34 -0
  113. package/dist/chunk-ROUTX2E5.cjs +390 -0
  114. package/dist/chunk-RTHIVJ2G.cjs +54 -0
  115. package/dist/chunk-S3A45T7F.cjs +166 -0
  116. package/dist/chunk-S3JO3N4H.cjs +17 -0
  117. package/dist/chunk-SK35NQKK.cjs +27 -0
  118. package/dist/chunk-SU7MH53P.cjs +180 -0
  119. package/dist/chunk-SVRTJOUF.cjs +113 -0
  120. package/dist/chunk-SWN467MP.cjs +18 -0
  121. package/dist/chunk-SYQ3MOWW.cjs +73 -0
  122. package/dist/chunk-T5CERMEH.cjs +417 -0
  123. package/dist/chunk-TFAXUHWX.cjs +206 -0
  124. package/dist/chunk-TIWHTW3Q.cjs +24 -0
  125. package/dist/chunk-TKJZFIML.cjs +20 -0
  126. package/dist/chunk-TKNSDBBN.cjs +193 -0
  127. package/dist/chunk-TWGMSEHX.cjs +525 -0
  128. package/dist/chunk-TYQUSXUG.cjs +1357 -0
  129. package/dist/chunk-U4KT7QP3.cjs +23 -0
  130. package/dist/chunk-UJ2C4ICS.cjs +277 -0
  131. package/dist/chunk-UN5GHC5V.cjs +10244 -0
  132. package/dist/chunk-UQZ4AYTH.cjs +168 -0
  133. package/dist/chunk-US2QVW3E.cjs +36 -0
  134. package/dist/chunk-VB6UCX3V.cjs +421 -0
  135. package/dist/chunk-VEKFLAQM.cjs +300 -0
  136. package/dist/chunk-VQDBNVOO.cjs +14 -0
  137. package/dist/chunk-W4E7WMXE.cjs +71 -0
  138. package/dist/chunk-WJ3HK3LJ.cjs +1102 -0
  139. package/dist/chunk-WMAPPDMM.cjs +28 -0
  140. package/dist/chunk-WMOGFOUJ.cjs +223 -0
  141. package/dist/chunk-WPYFSQKK.cjs +37 -0
  142. package/dist/chunk-WZMNW2IW.cjs +1415 -0
  143. package/dist/chunk-XGC343EY.cjs +443 -0
  144. package/dist/chunk-XSKZORAS.cjs +727 -0
  145. package/dist/chunk-XWAWFQFS.cjs +82 -0
  146. package/dist/chunk-Y4YMF2NQ.cjs +460 -0
  147. package/dist/chunk-Y4YWHNKU.cjs +250 -0
  148. package/dist/chunk-Y53ZSFN6.cjs +504 -0
  149. package/dist/chunk-YA6LLTIJ.cjs +411 -0
  150. package/dist/chunk-YFPGHF5F.cjs +202 -0
  151. package/dist/chunk-YJRZR7VU.cjs +28 -0
  152. package/dist/chunk-YTAABQEV.cjs +1 -0
  153. package/dist/chunk-YX3DBN4M.cjs +18 -0
  154. package/dist/chunk-YZTASLPQ.cjs +64 -0
  155. package/dist/chunk-Z5HIWVDP.cjs +2173 -0
  156. package/dist/chunk-ZEG3OPIB.cjs +93 -0
  157. package/dist/chunk-ZMN3H73H.cjs +155 -0
  158. package/dist/client/lifecycle.cjs +6 -35
  159. package/dist/client-plugins.cjs +7 -448
  160. package/dist/client.cjs +171 -9808
  161. package/dist/config.cjs +8 -36
  162. package/dist/cron.cjs +24 -491
  163. package/dist/deferred.cjs +26 -475
  164. package/dist/deployment.cjs +39 -210
  165. package/dist/devtools-OUIPHVV6.cjs +388 -0
  166. package/dist/devtools-client-4WAPJY5L.cjs +254 -0
  167. package/dist/devtools-ui-5GBDIGMK.cjs +1296 -0
  168. package/dist/docs.cjs +46 -5657
  169. package/dist/env-types.cjs +5 -226
  170. package/dist/env.cjs +21 -338
  171. package/dist/environment/vite.cjs +8 -372
  172. package/dist/environment.cjs +12 -94
  173. package/dist/font.cjs +13 -63
  174. package/dist/headers.cjs +7 -123
  175. package/dist/i18n/client.cjs +55 -294
  176. package/dist/i18n/index.cjs +22 -209
  177. package/dist/i18n/server.cjs +22 -745
  178. package/dist/image/server.cjs +13 -729
  179. package/dist/image/sharp.cjs +33 -171
  180. package/dist/image.cjs +41 -85
  181. package/dist/index.cjs +1151 -68080
  182. package/dist/index.mjs +3 -3
  183. package/dist/instrumentation.cjs +12 -138
  184. package/dist/integration-orm-55F7CII5.cjs +13 -0
  185. package/dist/integrations.cjs +55 -4090
  186. package/dist/internal/app-markdown-runtime.cjs +27 -224
  187. package/dist/internal/build-runtime.cjs +120 -52259
  188. package/dist/internal/build-runtime.mjs +3 -3
  189. package/dist/internal/cli-runtime.cjs +67 -13811
  190. package/dist/internal/client-error-overlay.cjs +80 -733
  191. package/dist/internal/client-error-overlay.mjs +1 -1
  192. package/dist/internal/client-runtime.cjs +81 -913
  193. package/dist/internal/compression-runtime.cjs +8 -214
  194. package/dist/internal/config-runtime.cjs +42 -6547
  195. package/dist/internal/docs-precompiled-runtime.cjs +26 -46
  196. package/dist/internal/infra-analytics-runtime.cjs +10 -536
  197. package/dist/internal/isolated-boundary.cjs +14 -414
  198. package/dist/internal/metadata-image-runtime.cjs +7 -285
  199. package/dist/internal/product-telemetry-runtime.cjs +42 -97
  200. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  201. package/dist/internal/production-node-env.cjs +6 -63
  202. package/dist/internal/production-runtime.cjs +418 -7133
  203. package/dist/internal/request-cookies.cjs +6 -54
  204. package/dist/json-ld.cjs +24 -50
  205. package/dist/layers-E4WPJNY5.cjs +17 -0
  206. package/dist/manager-G4B2IPYE.cjs +14 -0
  207. package/dist/markdown.cjs +21 -547
  208. package/dist/middleware.cjs +36 -2995
  209. package/dist/navigation.cjs +22 -2588
  210. package/dist/nitro-4I2MYLY2.cjs +652 -0
  211. package/dist/observability.cjs +22 -614
  212. package/dist/og.cjs +5 -28
  213. package/dist/plugin.cjs +106 -37442
  214. package/dist/plugin.mjs +2 -2
  215. package/dist/query/client.cjs +113 -449
  216. package/dist/query/index.cjs +26 -288
  217. package/dist/query/parsers.cjs +23 -247
  218. package/dist/query/server.cjs +36 -298
  219. package/dist/renderer/react/client.cjs +9 -43
  220. package/dist/renderer/react/server.cjs +40 -103
  221. package/dist/renderer/react/vite.cjs +7 -29
  222. package/dist/renderer-client.cjs +126 -4295
  223. package/dist/renderer.cjs +31 -249
  224. package/dist/request.cjs +5 -68
  225. package/dist/router.cjs +11 -474
  226. package/dist/routes.cjs +42 -2461
  227. package/dist/schema-dev-notice-MXSZMVDG.cjs +56 -0
  228. package/dist/schema.cjs +6 -33
  229. package/dist/search-client-G3RICOFU.cjs +13 -0
  230. package/dist/server-action-security.cjs +25 -541
  231. package/dist/server-fn-client.cjs +6 -337
  232. package/dist/server-fn.cjs +32 -1841
  233. package/dist/server-plugins.cjs +15 -884
  234. package/dist/server-query-client.cjs +15 -1883
  235. package/dist/server-query.cjs +16 -1838
  236. package/dist/server.cjs +296 -44681
  237. package/dist/server.mjs +2 -2
  238. package/dist/storage.cjs +57 -576
  239. package/dist/testing.cjs +89 -3186
  240. package/dist/theme/client.cjs +13 -108
  241. package/dist/theme/index.cjs +6 -68
  242. package/dist/theme/runtime.cjs +13 -78
  243. package/dist/theme/server.cjs +10 -179
  244. package/dist/version.cjs +4 -32
  245. package/dist/version.mjs +1 -1
  246. package/dist/vite.cjs +119 -37773
  247. package/dist/vite.mjs +2 -2
  248. package/dist/workflows.cjs +19 -1040
  249. package/package.json +1 -1
@@ -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;