@n-dx/web 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +5 -0
  3. package/build.js +243 -0
  4. package/dist/cli/index.d.ts +8 -0
  5. package/dist/cli/index.js +50 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/landing/index.html +325 -0
  8. package/dist/landing/landing.d.ts +38 -0
  9. package/dist/landing/landing.js +299 -0
  10. package/dist/landing/landing.js.map +1 -0
  11. package/dist/public.d.ts +55 -0
  12. package/dist/public.js +51 -0
  13. package/dist/public.js.map +1 -0
  14. package/dist/schema/features.d.ts +28 -0
  15. package/dist/schema/features.js +9 -0
  16. package/dist/schema/features.js.map +1 -0
  17. package/dist/schema/v1.d.ts +317 -0
  18. package/dist/schema/v1.js +3 -0
  19. package/dist/schema/v1.js.map +1 -0
  20. package/dist/server/aggregation-cache.d.ts +105 -0
  21. package/dist/server/aggregation-cache.js +163 -0
  22. package/dist/server/aggregation-cache.js.map +1 -0
  23. package/dist/server/concurrent-execution-metrics.d.ts +103 -0
  24. package/dist/server/concurrent-execution-metrics.js +253 -0
  25. package/dist/server/concurrent-execution-metrics.js.map +1 -0
  26. package/dist/server/domain-gateway.d.ts +18 -0
  27. package/dist/server/domain-gateway.js +19 -0
  28. package/dist/server/domain-gateway.js.map +1 -0
  29. package/dist/server/incremental-task-usage.d.ts +92 -0
  30. package/dist/server/incremental-task-usage.js +251 -0
  31. package/dist/server/incremental-task-usage.js.map +1 -0
  32. package/dist/server/index.d.ts +39 -0
  33. package/dist/server/index.js +36 -0
  34. package/dist/server/index.js.map +1 -0
  35. package/dist/server/port.d.ts +96 -0
  36. package/dist/server/port.js +134 -0
  37. package/dist/server/port.js.map +1 -0
  38. package/dist/server/pr-markdown-refresh-diagnostics.d.ts +59 -0
  39. package/dist/server/pr-markdown-refresh-diagnostics.js +429 -0
  40. package/dist/server/pr-markdown-refresh-diagnostics.js.map +1 -0
  41. package/dist/server/prd-io.d.ts +40 -0
  42. package/dist/server/prd-io.js +66 -0
  43. package/dist/server/prd-io.js.map +1 -0
  44. package/dist/server/process-memory-tracker.d.ts +79 -0
  45. package/dist/server/process-memory-tracker.js +194 -0
  46. package/dist/server/process-memory-tracker.js.map +1 -0
  47. package/dist/server/register-scheduler.d.ts +53 -0
  48. package/dist/server/register-scheduler.js +36 -0
  49. package/dist/server/register-scheduler.js.map +1 -0
  50. package/dist/server/rex-gateway.d.ts +39 -0
  51. package/dist/server/rex-gateway.js +47 -0
  52. package/dist/server/rex-gateway.js.map +1 -0
  53. package/dist/server/routes-adaptive.d.ts +21 -0
  54. package/dist/server/routes-adaptive.js +659 -0
  55. package/dist/server/routes-adaptive.js.map +1 -0
  56. package/dist/server/routes-config.d.ts +47 -0
  57. package/dist/server/routes-config.js +222 -0
  58. package/dist/server/routes-config.js.map +1 -0
  59. package/dist/server/routes-data.d.ts +14 -0
  60. package/dist/server/routes-data.js +129 -0
  61. package/dist/server/routes-data.js.map +1 -0
  62. package/dist/server/routes-features.d.ts +14 -0
  63. package/dist/server/routes-features.js +245 -0
  64. package/dist/server/routes-features.js.map +1 -0
  65. package/dist/server/routes-hench.d.ts +116 -0
  66. package/dist/server/routes-hench.js +2016 -0
  67. package/dist/server/routes-hench.js.map +1 -0
  68. package/dist/server/routes-integrations.d.ts +23 -0
  69. package/dist/server/routes-integrations.js +277 -0
  70. package/dist/server/routes-integrations.js.map +1 -0
  71. package/dist/server/routes-mcp.d.ts +31 -0
  72. package/dist/server/routes-mcp.js +175 -0
  73. package/dist/server/routes-mcp.js.map +1 -0
  74. package/dist/server/routes-notion.d.ts +23 -0
  75. package/dist/server/routes-notion.js +723 -0
  76. package/dist/server/routes-notion.js.map +1 -0
  77. package/dist/server/routes-project.d.ts +47 -0
  78. package/dist/server/routes-project.js +128 -0
  79. package/dist/server/routes-project.js.map +1 -0
  80. package/dist/server/routes-rex/analysis.d.ts +11 -0
  81. package/dist/server/routes-rex/analysis.js +583 -0
  82. package/dist/server/routes-rex/analysis.js.map +1 -0
  83. package/dist/server/routes-rex/execution.d.ts +37 -0
  84. package/dist/server/routes-rex/execution.js +355 -0
  85. package/dist/server/routes-rex/execution.js.map +1 -0
  86. package/dist/server/routes-rex/health.d.ts +8 -0
  87. package/dist/server/routes-rex/health.js +136 -0
  88. package/dist/server/routes-rex/health.js.map +1 -0
  89. package/dist/server/routes-rex/index.d.ts +35 -0
  90. package/dist/server/routes-rex/index.js +72 -0
  91. package/dist/server/routes-rex/index.js.map +1 -0
  92. package/dist/server/routes-rex/items.d.ts +8 -0
  93. package/dist/server/routes-rex/items.js +359 -0
  94. package/dist/server/routes-rex/items.js.map +1 -0
  95. package/dist/server/routes-rex/prune.d.ts +11 -0
  96. package/dist/server/routes-rex/prune.js +379 -0
  97. package/dist/server/routes-rex/prune.js.map +1 -0
  98. package/dist/server/routes-rex/reads.d.ts +9 -0
  99. package/dist/server/routes-rex/reads.js +119 -0
  100. package/dist/server/routes-rex/reads.js.map +1 -0
  101. package/dist/server/routes-rex/requirements.d.ts +10 -0
  102. package/dist/server/routes-rex/requirements.js +408 -0
  103. package/dist/server/routes-rex/requirements.js.map +1 -0
  104. package/dist/server/routes-rex/shared.d.ts +37 -0
  105. package/dist/server/routes-rex/shared.js +73 -0
  106. package/dist/server/routes-rex/shared.js.map +1 -0
  107. package/dist/server/routes-search.d.ts +26 -0
  108. package/dist/server/routes-search.js +82 -0
  109. package/dist/server/routes-search.js.map +1 -0
  110. package/dist/server/routes-sourcevision.d.ts +18 -0
  111. package/dist/server/routes-sourcevision.js +444 -0
  112. package/dist/server/routes-sourcevision.js.map +1 -0
  113. package/dist/server/routes-static.d.ts +20 -0
  114. package/dist/server/routes-static.js +168 -0
  115. package/dist/server/routes-static.js.map +1 -0
  116. package/dist/server/routes-status.d.ts +58 -0
  117. package/dist/server/routes-status.js +191 -0
  118. package/dist/server/routes-status.js.map +1 -0
  119. package/dist/server/routes-token-usage.d.ts +63 -0
  120. package/dist/server/routes-token-usage.js +720 -0
  121. package/dist/server/routes-token-usage.js.map +1 -0
  122. package/dist/server/routes-validation.d.ts +10 -0
  123. package/dist/server/routes-validation.js +365 -0
  124. package/dist/server/routes-validation.js.map +1 -0
  125. package/dist/server/routes-workflow.d.ts +15 -0
  126. package/dist/server/routes-workflow.js +498 -0
  127. package/dist/server/routes-workflow.js.map +1 -0
  128. package/dist/server/search-index.d.ts +111 -0
  129. package/dist/server/search-index.js +348 -0
  130. package/dist/server/search-index.js.map +1 -0
  131. package/dist/server/shared-types.d.ts +65 -0
  132. package/dist/server/shared-types.js +31 -0
  133. package/dist/server/shared-types.js.map +1 -0
  134. package/dist/server/start.d.ts +68 -0
  135. package/dist/server/start.js +568 -0
  136. package/dist/server/start.js.map +1 -0
  137. package/dist/server/task-usage.d.ts +17 -0
  138. package/dist/server/task-usage.js +20 -0
  139. package/dist/server/task-usage.js.map +1 -0
  140. package/dist/server/types.d.ts +27 -0
  141. package/dist/server/types.js +26 -0
  142. package/dist/server/types.js.map +1 -0
  143. package/dist/server/usage-cleanup-scheduler.d.ts +107 -0
  144. package/dist/server/usage-cleanup-scheduler.js +232 -0
  145. package/dist/server/usage-cleanup-scheduler.js.map +1 -0
  146. package/dist/server/websocket.d.ts +131 -0
  147. package/dist/server/websocket.js +512 -0
  148. package/dist/server/websocket.js.map +1 -0
  149. package/dist/shared/data-files.d.ts +17 -0
  150. package/dist/shared/data-files.js +18 -0
  151. package/dist/shared/data-files.js.map +1 -0
  152. package/dist/shared/index.d.ts +9 -0
  153. package/dist/shared/index.js +9 -0
  154. package/dist/shared/index.js.map +1 -0
  155. package/dist/shared/view-id.d.ts +8 -0
  156. package/dist/shared/view-id.js +9 -0
  157. package/dist/shared/view-id.js.map +1 -0
  158. package/dist/viewer/Hench-F.png +0 -0
  159. package/dist/viewer/Rex-F.png +0 -0
  160. package/dist/viewer/SourceVision-F.png +0 -0
  161. package/dist/viewer/SourceVision.png +0 -0
  162. package/dist/viewer/api.d.ts +19 -0
  163. package/dist/viewer/api.js +17 -0
  164. package/dist/viewer/api.js.map +1 -0
  165. package/dist/viewer/bootstrap.d.ts +13 -0
  166. package/dist/viewer/bootstrap.js +40 -0
  167. package/dist/viewer/bootstrap.js.map +1 -0
  168. package/dist/viewer/components/active-tasks-panel.d.ts +36 -0
  169. package/dist/viewer/components/active-tasks-panel.js +183 -0
  170. package/dist/viewer/components/active-tasks-panel.js.map +1 -0
  171. package/dist/viewer/components/breadcrumb.d.ts +21 -0
  172. package/dist/viewer/components/breadcrumb.js +117 -0
  173. package/dist/viewer/components/breadcrumb.js.map +1 -0
  174. package/dist/viewer/components/concurrency-panel.d.ts +18 -0
  175. package/dist/viewer/components/concurrency-panel.js +175 -0
  176. package/dist/viewer/components/concurrency-panel.js.map +1 -0
  177. package/dist/viewer/components/config-footer.d.ts +11 -0
  178. package/dist/viewer/components/config-footer.js +132 -0
  179. package/dist/viewer/components/config-footer.js.map +1 -0
  180. package/dist/viewer/components/constants.d.ts +10 -0
  181. package/dist/viewer/components/constants.js +11 -0
  182. package/dist/viewer/components/constants.js.map +1 -0
  183. package/dist/viewer/components/copy-link-button.d.ts +30 -0
  184. package/dist/viewer/components/copy-link-button.js +74 -0
  185. package/dist/viewer/components/copy-link-button.js.map +1 -0
  186. package/dist/viewer/components/crash-recovery-banner.d.ts +28 -0
  187. package/dist/viewer/components/crash-recovery-banner.js +47 -0
  188. package/dist/viewer/components/crash-recovery-banner.js.map +1 -0
  189. package/dist/viewer/components/data-display/collapsible-section.d.ts +14 -0
  190. package/dist/viewer/components/data-display/collapsible-section.js +66 -0
  191. package/dist/viewer/components/data-display/collapsible-section.js.map +1 -0
  192. package/dist/viewer/components/data-display/findings-list.d.ts +13 -0
  193. package/dist/viewer/components/data-display/findings-list.js +136 -0
  194. package/dist/viewer/components/data-display/findings-list.js.map +1 -0
  195. package/dist/viewer/components/data-display/health-gauge.d.ts +37 -0
  196. package/dist/viewer/components/data-display/health-gauge.js +62 -0
  197. package/dist/viewer/components/data-display/health-gauge.js.map +1 -0
  198. package/dist/viewer/components/data-display/mini-charts.d.ts +36 -0
  199. package/dist/viewer/components/data-display/mini-charts.js +124 -0
  200. package/dist/viewer/components/data-display/mini-charts.js.map +1 -0
  201. package/dist/viewer/components/data-display/tree-view.d.ts +18 -0
  202. package/dist/viewer/components/data-display/tree-view.js +107 -0
  203. package/dist/viewer/components/data-display/tree-view.js.map +1 -0
  204. package/dist/viewer/components/data-display/zone-map.d.ts +28 -0
  205. package/dist/viewer/components/data-display/zone-map.js +197 -0
  206. package/dist/viewer/components/data-display/zone-map.js.map +1 -0
  207. package/dist/viewer/components/degradation-banner.d.ts +28 -0
  208. package/dist/viewer/components/degradation-banner.js +47 -0
  209. package/dist/viewer/components/degradation-banner.js.map +1 -0
  210. package/dist/viewer/components/detail-panel.d.ts +12 -0
  211. package/dist/viewer/components/detail-panel.js +166 -0
  212. package/dist/viewer/components/detail-panel.js.map +1 -0
  213. package/dist/viewer/components/elapsed-time.d.ts +38 -0
  214. package/dist/viewer/components/elapsed-time.js +35 -0
  215. package/dist/viewer/components/elapsed-time.js.map +1 -0
  216. package/dist/viewer/components/faq.d.ts +12 -0
  217. package/dist/viewer/components/faq.js +237 -0
  218. package/dist/viewer/components/faq.js.map +1 -0
  219. package/dist/viewer/components/favicon.d.ts +30 -0
  220. package/dist/viewer/components/favicon.js +90 -0
  221. package/dist/viewer/components/favicon.js.map +1 -0
  222. package/dist/viewer/components/guide.d.ts +5 -0
  223. package/dist/viewer/components/guide.js +116 -0
  224. package/dist/viewer/components/guide.js.map +1 -0
  225. package/dist/viewer/components/index.d.ts +37 -0
  226. package/dist/viewer/components/index.js +46 -0
  227. package/dist/viewer/components/index.js.map +1 -0
  228. package/dist/viewer/components/logos.d.ts +42 -0
  229. package/dist/viewer/components/logos.js +46 -0
  230. package/dist/viewer/components/logos.js.map +1 -0
  231. package/dist/viewer/components/memory-panel.d.ts +19 -0
  232. package/dist/viewer/components/memory-panel.js +181 -0
  233. package/dist/viewer/components/memory-panel.js.map +1 -0
  234. package/dist/viewer/components/memory-warning.d.ts +23 -0
  235. package/dist/viewer/components/memory-warning.js +42 -0
  236. package/dist/viewer/components/memory-warning.js.map +1 -0
  237. package/dist/viewer/components/notion-schema-wizard.d.ts +16 -0
  238. package/dist/viewer/components/notion-schema-wizard.js +263 -0
  239. package/dist/viewer/components/notion-schema-wizard.js.map +1 -0
  240. package/dist/viewer/components/polling-suspension-indicator.d.ts +24 -0
  241. package/dist/viewer/components/polling-suspension-indicator.js +31 -0
  242. package/dist/viewer/components/polling-suspension-indicator.js.map +1 -0
  243. package/dist/viewer/components/prd-tree/add-item-form.d.ts +31 -0
  244. package/dist/viewer/components/prd-tree/add-item-form.js +231 -0
  245. package/dist/viewer/components/prd-tree/add-item-form.js.map +1 -0
  246. package/dist/viewer/components/prd-tree/analyze-panel.d.ts +13 -0
  247. package/dist/viewer/components/prd-tree/analyze-panel.js +245 -0
  248. package/dist/viewer/components/prd-tree/analyze-panel.js.map +1 -0
  249. package/dist/viewer/components/prd-tree/batch-import-panel.d.ts +34 -0
  250. package/dist/viewer/components/prd-tree/batch-import-panel.js +415 -0
  251. package/dist/viewer/components/prd-tree/batch-import-panel.js.map +1 -0
  252. package/dist/viewer/components/prd-tree/bulk-actions.d.ts +19 -0
  253. package/dist/viewer/components/prd-tree/bulk-actions.js +90 -0
  254. package/dist/viewer/components/prd-tree/bulk-actions.js.map +1 -0
  255. package/dist/viewer/components/prd-tree/compute.d.ts +32 -0
  256. package/dist/viewer/components/prd-tree/compute.js +129 -0
  257. package/dist/viewer/components/prd-tree/compute.js.map +1 -0
  258. package/dist/viewer/components/prd-tree/delete-confirmation.d.ts +23 -0
  259. package/dist/viewer/components/prd-tree/delete-confirmation.js +83 -0
  260. package/dist/viewer/components/prd-tree/delete-confirmation.js.map +1 -0
  261. package/dist/viewer/components/prd-tree/execution-panel.d.ts +14 -0
  262. package/dist/viewer/components/prd-tree/execution-panel.js +291 -0
  263. package/dist/viewer/components/prd-tree/execution-panel.js.map +1 -0
  264. package/dist/viewer/components/prd-tree/facet-filter.d.ts +40 -0
  265. package/dist/viewer/components/prd-tree/facet-filter.js +188 -0
  266. package/dist/viewer/components/prd-tree/facet-filter.js.map +1 -0
  267. package/dist/viewer/components/prd-tree/index.d.ts +24 -0
  268. package/dist/viewer/components/prd-tree/index.js +16 -0
  269. package/dist/viewer/components/prd-tree/index.js.map +1 -0
  270. package/dist/viewer/components/prd-tree/inline-add-form.d.ts +32 -0
  271. package/dist/viewer/components/prd-tree/inline-add-form.js +175 -0
  272. package/dist/viewer/components/prd-tree/inline-add-form.js.map +1 -0
  273. package/dist/viewer/components/prd-tree/inline-status-picker.d.ts +31 -0
  274. package/dist/viewer/components/prd-tree/inline-status-picker.js +110 -0
  275. package/dist/viewer/components/prd-tree/inline-status-picker.js.map +1 -0
  276. package/dist/viewer/components/prd-tree/lazy-children.d.ts +40 -0
  277. package/dist/viewer/components/prd-tree/lazy-children.js +73 -0
  278. package/dist/viewer/components/prd-tree/lazy-children.js.map +1 -0
  279. package/dist/viewer/components/prd-tree/levels.d.ts +31 -0
  280. package/dist/viewer/components/prd-tree/levels.js +72 -0
  281. package/dist/viewer/components/prd-tree/levels.js.map +1 -0
  282. package/dist/viewer/components/prd-tree/listener-lifecycle.d.ts +105 -0
  283. package/dist/viewer/components/prd-tree/listener-lifecycle.js +173 -0
  284. package/dist/viewer/components/prd-tree/listener-lifecycle.js.map +1 -0
  285. package/dist/viewer/components/prd-tree/merge-preview.d.ts +25 -0
  286. package/dist/viewer/components/prd-tree/merge-preview.js +181 -0
  287. package/dist/viewer/components/prd-tree/merge-preview.js.map +1 -0
  288. package/dist/viewer/components/prd-tree/prd-tree.d.ts +91 -0
  289. package/dist/viewer/components/prd-tree/prd-tree.js +565 -0
  290. package/dist/viewer/components/prd-tree/prd-tree.js.map +1 -0
  291. package/dist/viewer/components/prd-tree/proposal-editor.d.ts +44 -0
  292. package/dist/viewer/components/prd-tree/proposal-editor.js +438 -0
  293. package/dist/viewer/components/prd-tree/proposal-editor.js.map +1 -0
  294. package/dist/viewer/components/prd-tree/prune-confirmation.d.ts +25 -0
  295. package/dist/viewer/components/prd-tree/prune-confirmation.js +336 -0
  296. package/dist/viewer/components/prd-tree/prune-confirmation.js.map +1 -0
  297. package/dist/viewer/components/prd-tree/prune-diff-tree.d.ts +39 -0
  298. package/dist/viewer/components/prd-tree/prune-diff-tree.js +319 -0
  299. package/dist/viewer/components/prd-tree/prune-diff-tree.js.map +1 -0
  300. package/dist/viewer/components/prd-tree/reorganize-panel.d.ts +16 -0
  301. package/dist/viewer/components/prd-tree/reorganize-panel.js +213 -0
  302. package/dist/viewer/components/prd-tree/reorganize-panel.js.map +1 -0
  303. package/dist/viewer/components/prd-tree/smart-add-input.d.ts +19 -0
  304. package/dist/viewer/components/prd-tree/smart-add-input.js +383 -0
  305. package/dist/viewer/components/prd-tree/smart-add-input.js.map +1 -0
  306. package/dist/viewer/components/prd-tree/status-filter.d.ts +40 -0
  307. package/dist/viewer/components/prd-tree/status-filter.js +131 -0
  308. package/dist/viewer/components/prd-tree/status-filter.js.map +1 -0
  309. package/dist/viewer/components/prd-tree/task-detail.d.ts +41 -0
  310. package/dist/viewer/components/prd-tree/task-detail.js +1205 -0
  311. package/dist/viewer/components/prd-tree/task-detail.js.map +1 -0
  312. package/dist/viewer/components/prd-tree/task-utilization.d.ts +7 -0
  313. package/dist/viewer/components/prd-tree/task-utilization.js +25 -0
  314. package/dist/viewer/components/prd-tree/task-utilization.js.map +1 -0
  315. package/dist/viewer/components/prd-tree/tree-differ.d.ts +59 -0
  316. package/dist/viewer/components/prd-tree/tree-differ.js +200 -0
  317. package/dist/viewer/components/prd-tree/tree-differ.js.map +1 -0
  318. package/dist/viewer/components/prd-tree/tree-event-delegate.d.ts +70 -0
  319. package/dist/viewer/components/prd-tree/tree-event-delegate.js +176 -0
  320. package/dist/viewer/components/prd-tree/tree-event-delegate.js.map +1 -0
  321. package/dist/viewer/components/prd-tree/tree-search.d.ts +65 -0
  322. package/dist/viewer/components/prd-tree/tree-search.js +178 -0
  323. package/dist/viewer/components/prd-tree/tree-search.js.map +1 -0
  324. package/dist/viewer/components/prd-tree/tree-utils.d.ts +38 -0
  325. package/dist/viewer/components/prd-tree/tree-utils.js +107 -0
  326. package/dist/viewer/components/prd-tree/tree-utils.js.map +1 -0
  327. package/dist/viewer/components/prd-tree/types.d.ts +93 -0
  328. package/dist/viewer/components/prd-tree/types.js +16 -0
  329. package/dist/viewer/components/prd-tree/types.js.map +1 -0
  330. package/dist/viewer/components/prd-tree/virtual-scroll.d.ts +119 -0
  331. package/dist/viewer/components/prd-tree/virtual-scroll.js +169 -0
  332. package/dist/viewer/components/prd-tree/virtual-scroll.js.map +1 -0
  333. package/dist/viewer/components/progressive-loader.d.ts +114 -0
  334. package/dist/viewer/components/progressive-loader.js +225 -0
  335. package/dist/viewer/components/progressive-loader.js.map +1 -0
  336. package/dist/viewer/components/refresh-queue-status.d.ts +20 -0
  337. package/dist/viewer/components/refresh-queue-status.js +65 -0
  338. package/dist/viewer/components/refresh-queue-status.js.map +1 -0
  339. package/dist/viewer/components/rex-task-link.d.ts +50 -0
  340. package/dist/viewer/components/rex-task-link.js +218 -0
  341. package/dist/viewer/components/rex-task-link.js.map +1 -0
  342. package/dist/viewer/components/search-filter.d.ts +20 -0
  343. package/dist/viewer/components/search-filter.js +28 -0
  344. package/dist/viewer/components/search-filter.js.map +1 -0
  345. package/dist/viewer/components/search-overlay.d.ts +31 -0
  346. package/dist/viewer/components/search-overlay.js +472 -0
  347. package/dist/viewer/components/search-overlay.js.map +1 -0
  348. package/dist/viewer/components/sidebar.d.ts +18 -0
  349. package/dist/viewer/components/sidebar.js +357 -0
  350. package/dist/viewer/components/sidebar.js.map +1 -0
  351. package/dist/viewer/components/status-indicators.d.ts +63 -0
  352. package/dist/viewer/components/status-indicators.js +136 -0
  353. package/dist/viewer/components/status-indicators.js.map +1 -0
  354. package/dist/viewer/components/theme-toggle.d.ts +8 -0
  355. package/dist/viewer/components/theme-toggle.js +28 -0
  356. package/dist/viewer/components/theme-toggle.js.map +1 -0
  357. package/dist/viewer/components/throttle-controls.d.ts +18 -0
  358. package/dist/viewer/components/throttle-controls.js +304 -0
  359. package/dist/viewer/components/throttle-controls.js.map +1 -0
  360. package/dist/viewer/components/ws-health-panel.d.ts +18 -0
  361. package/dist/viewer/components/ws-health-panel.js +250 -0
  362. package/dist/viewer/components/ws-health-panel.js.map +1 -0
  363. package/dist/viewer/components/zone-slideout.d.ts +17 -0
  364. package/dist/viewer/components/zone-slideout.js +162 -0
  365. package/dist/viewer/components/zone-slideout.js.map +1 -0
  366. package/dist/viewer/crash/crash-detector.d.ts +69 -0
  367. package/dist/viewer/crash/crash-detector.js +239 -0
  368. package/dist/viewer/crash/crash-detector.js.map +1 -0
  369. package/dist/viewer/crash/index.d.ts +7 -0
  370. package/dist/viewer/crash/index.js +8 -0
  371. package/dist/viewer/crash/index.js.map +1 -0
  372. package/dist/viewer/deployed-mode.d.ts +37 -0
  373. package/dist/viewer/deployed-mode.js +94 -0
  374. package/dist/viewer/deployed-mode.js.map +1 -0
  375. package/dist/viewer/external.d.ts +17 -0
  376. package/dist/viewer/external.js +17 -0
  377. package/dist/viewer/external.js.map +1 -0
  378. package/dist/viewer/graph/index.d.ts +9 -0
  379. package/dist/viewer/graph/index.js +12 -0
  380. package/dist/viewer/graph/index.js.map +1 -0
  381. package/dist/viewer/graph/physics.d.ts +96 -0
  382. package/dist/viewer/graph/physics.js +366 -0
  383. package/dist/viewer/graph/physics.js.map +1 -0
  384. package/dist/viewer/graph/renderer.d.ts +184 -0
  385. package/dist/viewer/graph/renderer.js +1438 -0
  386. package/dist/viewer/graph/renderer.js.map +1 -0
  387. package/dist/viewer/hooks/index.d.ts +27 -0
  388. package/dist/viewer/hooks/index.js +28 -0
  389. package/dist/viewer/hooks/index.js.map +1 -0
  390. package/dist/viewer/hooks/use-app-data.d.ts +31 -0
  391. package/dist/viewer/hooks/use-app-data.js +152 -0
  392. package/dist/viewer/hooks/use-app-data.js.map +1 -0
  393. package/dist/viewer/hooks/use-crash-recovery.d.ts +50 -0
  394. package/dist/viewer/hooks/use-crash-recovery.js +76 -0
  395. package/dist/viewer/hooks/use-crash-recovery.js.map +1 -0
  396. package/dist/viewer/hooks/use-delete-actions.d.ts +48 -0
  397. package/dist/viewer/hooks/use-delete-actions.js +103 -0
  398. package/dist/viewer/hooks/use-delete-actions.js.map +1 -0
  399. package/dist/viewer/hooks/use-dom-performance-monitor.d.ts +68 -0
  400. package/dist/viewer/hooks/use-dom-performance-monitor.js +71 -0
  401. package/dist/viewer/hooks/use-dom-performance-monitor.js.map +1 -0
  402. package/dist/viewer/hooks/use-facet-state.d.ts +32 -0
  403. package/dist/viewer/hooks/use-facet-state.js +119 -0
  404. package/dist/viewer/hooks/use-facet-state.js.map +1 -0
  405. package/dist/viewer/hooks/use-feature-toggle.d.ts +18 -0
  406. package/dist/viewer/hooks/use-feature-toggle.js +57 -0
  407. package/dist/viewer/hooks/use-feature-toggle.js.map +1 -0
  408. package/dist/viewer/hooks/use-file-edges.d.ts +23 -0
  409. package/dist/viewer/hooks/use-file-edges.js +221 -0
  410. package/dist/viewer/hooks/use-file-edges.js.map +1 -0
  411. package/dist/viewer/hooks/use-graceful-degradation.d.ts +30 -0
  412. package/dist/viewer/hooks/use-graceful-degradation.js +45 -0
  413. package/dist/viewer/hooks/use-graceful-degradation.js.map +1 -0
  414. package/dist/viewer/hooks/use-item-selection.d.ts +49 -0
  415. package/dist/viewer/hooks/use-item-selection.js +117 -0
  416. package/dist/viewer/hooks/use-item-selection.js.map +1 -0
  417. package/dist/viewer/hooks/use-memory-monitor.d.ts +39 -0
  418. package/dist/viewer/hooks/use-memory-monitor.js +73 -0
  419. package/dist/viewer/hooks/use-memory-monitor.js.map +1 -0
  420. package/dist/viewer/hooks/use-pan-zoom.d.ts +33 -0
  421. package/dist/viewer/hooks/use-pan-zoom.js +110 -0
  422. package/dist/viewer/hooks/use-pan-zoom.js.map +1 -0
  423. package/dist/viewer/hooks/use-persistent-filter.d.ts +24 -0
  424. package/dist/viewer/hooks/use-persistent-filter.js +37 -0
  425. package/dist/viewer/hooks/use-persistent-filter.js.map +1 -0
  426. package/dist/viewer/hooks/use-polling-suspension.d.ts +32 -0
  427. package/dist/viewer/hooks/use-polling-suspension.js +41 -0
  428. package/dist/viewer/hooks/use-polling-suspension.js.map +1 -0
  429. package/dist/viewer/hooks/use-polling.d.ts +39 -0
  430. package/dist/viewer/hooks/use-polling.js +55 -0
  431. package/dist/viewer/hooks/use-polling.js.map +1 -0
  432. package/dist/viewer/hooks/use-prd-actions.d.ts +126 -0
  433. package/dist/viewer/hooks/use-prd-actions.js +250 -0
  434. package/dist/viewer/hooks/use-prd-actions.js.map +1 -0
  435. package/dist/viewer/hooks/use-prd-data.d.ts +45 -0
  436. package/dist/viewer/hooks/use-prd-data.js +159 -0
  437. package/dist/viewer/hooks/use-prd-data.js.map +1 -0
  438. package/dist/viewer/hooks/use-prd-deep-link.d.ts +45 -0
  439. package/dist/viewer/hooks/use-prd-deep-link.js +60 -0
  440. package/dist/viewer/hooks/use-prd-deep-link.js.map +1 -0
  441. package/dist/viewer/hooks/use-prd-websocket.d.ts +47 -0
  442. package/dist/viewer/hooks/use-prd-websocket.js +139 -0
  443. package/dist/viewer/hooks/use-prd-websocket.js.map +1 -0
  444. package/dist/viewer/hooks/use-project-metadata.d.ts +25 -0
  445. package/dist/viewer/hooks/use-project-metadata.js +55 -0
  446. package/dist/viewer/hooks/use-project-metadata.js.map +1 -0
  447. package/dist/viewer/hooks/use-project-status.d.ts +60 -0
  448. package/dist/viewer/hooks/use-project-status.js +133 -0
  449. package/dist/viewer/hooks/use-project-status.js.map +1 -0
  450. package/dist/viewer/hooks/use-refresh-throttle.d.ts +45 -0
  451. package/dist/viewer/hooks/use-refresh-throttle.js +52 -0
  452. package/dist/viewer/hooks/use-refresh-throttle.js.map +1 -0
  453. package/dist/viewer/hooks/use-route-state.d.ts +18 -0
  454. package/dist/viewer/hooks/use-route-state.js +115 -0
  455. package/dist/viewer/hooks/use-route-state.js.map +1 -0
  456. package/dist/viewer/hooks/use-subzone-edges.d.ts +21 -0
  457. package/dist/viewer/hooks/use-subzone-edges.js +147 -0
  458. package/dist/viewer/hooks/use-subzone-edges.js.map +1 -0
  459. package/dist/viewer/hooks/use-tab-visibility.d.ts +31 -0
  460. package/dist/viewer/hooks/use-tab-visibility.js +43 -0
  461. package/dist/viewer/hooks/use-tab-visibility.js.map +1 -0
  462. package/dist/viewer/hooks/use-tick.d.ts +43 -0
  463. package/dist/viewer/hooks/use-tick.js +76 -0
  464. package/dist/viewer/hooks/use-tick.js.map +1 -0
  465. package/dist/viewer/hooks/use-toast.d.ts +24 -0
  466. package/dist/viewer/hooks/use-toast.js +26 -0
  467. package/dist/viewer/hooks/use-toast.js.map +1 -0
  468. package/dist/viewer/hooks/use-zone-drag.d.ts +30 -0
  469. package/dist/viewer/hooks/use-zone-drag.js +60 -0
  470. package/dist/viewer/hooks/use-zone-drag.js.map +1 -0
  471. package/dist/viewer/index.html +36 -0
  472. package/dist/viewer/loader.d.ts +33 -0
  473. package/dist/viewer/loader.js +195 -0
  474. package/dist/viewer/loader.js.map +1 -0
  475. package/dist/viewer/main.d.ts +1 -0
  476. package/dist/viewer/main.js +121 -0
  477. package/dist/viewer/main.js.map +1 -0
  478. package/dist/viewer/messaging/call-rate-limiter.d.ts +50 -0
  479. package/dist/viewer/messaging/call-rate-limiter.js +103 -0
  480. package/dist/viewer/messaging/call-rate-limiter.js.map +1 -0
  481. package/dist/viewer/messaging/fetch-pipeline.d.ts +58 -0
  482. package/dist/viewer/messaging/fetch-pipeline.js +58 -0
  483. package/dist/viewer/messaging/fetch-pipeline.js.map +1 -0
  484. package/dist/viewer/messaging/index.d.ts +43 -0
  485. package/dist/viewer/messaging/index.js +46 -0
  486. package/dist/viewer/messaging/index.js.map +1 -0
  487. package/dist/viewer/messaging/message-coalescer.d.ts +96 -0
  488. package/dist/viewer/messaging/message-coalescer.js +121 -0
  489. package/dist/viewer/messaging/message-coalescer.js.map +1 -0
  490. package/dist/viewer/messaging/message-throttle.d.ts +95 -0
  491. package/dist/viewer/messaging/message-throttle.js +147 -0
  492. package/dist/viewer/messaging/message-throttle.js.map +1 -0
  493. package/dist/viewer/messaging/request-dedup.d.ts +43 -0
  494. package/dist/viewer/messaging/request-dedup.js +55 -0
  495. package/dist/viewer/messaging/request-dedup.js.map +1 -0
  496. package/dist/viewer/messaging/ws-pipeline.d.ts +85 -0
  497. package/dist/viewer/messaging/ws-pipeline.js +68 -0
  498. package/dist/viewer/messaging/ws-pipeline.js.map +1 -0
  499. package/dist/viewer/n-dx.png +0 -0
  500. package/dist/viewer/performance/dom-performance-monitor.d.ts +157 -0
  501. package/dist/viewer/performance/dom-performance-monitor.js +341 -0
  502. package/dist/viewer/performance/dom-performance-monitor.js.map +1 -0
  503. package/dist/viewer/performance/dom-update-gate.d.ts +122 -0
  504. package/dist/viewer/performance/dom-update-gate.js +229 -0
  505. package/dist/viewer/performance/dom-update-gate.js.map +1 -0
  506. package/dist/viewer/performance/graceful-degradation.d.ts +73 -0
  507. package/dist/viewer/performance/graceful-degradation.js +152 -0
  508. package/dist/viewer/performance/graceful-degradation.js.map +1 -0
  509. package/dist/viewer/performance/index.d.ts +14 -0
  510. package/dist/viewer/performance/index.js +20 -0
  511. package/dist/viewer/performance/index.js.map +1 -0
  512. package/dist/viewer/performance/memory-monitor.d.ts +78 -0
  513. package/dist/viewer/performance/memory-monitor.js +218 -0
  514. package/dist/viewer/performance/memory-monitor.js.map +1 -0
  515. package/dist/viewer/performance/refresh-throttle.d.ts +90 -0
  516. package/dist/viewer/performance/refresh-throttle.js +266 -0
  517. package/dist/viewer/performance/refresh-throttle.js.map +1 -0
  518. package/dist/viewer/performance/response-buffer-gate.d.ts +108 -0
  519. package/dist/viewer/performance/response-buffer-gate.js +170 -0
  520. package/dist/viewer/performance/response-buffer-gate.js.map +1 -0
  521. package/dist/viewer/performance/update-batcher.d.ts +79 -0
  522. package/dist/viewer/performance/update-batcher.js +119 -0
  523. package/dist/viewer/performance/update-batcher.js.map +1 -0
  524. package/dist/viewer/polling/batched-tick-dispatcher.d.ts +83 -0
  525. package/dist/viewer/polling/batched-tick-dispatcher.js +183 -0
  526. package/dist/viewer/polling/batched-tick-dispatcher.js.map +1 -0
  527. package/dist/viewer/polling/index.d.ts +13 -0
  528. package/dist/viewer/polling/index.js +16 -0
  529. package/dist/viewer/polling/index.js.map +1 -0
  530. package/dist/viewer/polling/polling-manager.d.ts +82 -0
  531. package/dist/viewer/polling/polling-manager.js +254 -0
  532. package/dist/viewer/polling/polling-manager.js.map +1 -0
  533. package/dist/viewer/polling/polling-restart.d.ts +45 -0
  534. package/dist/viewer/polling/polling-restart.js +98 -0
  535. package/dist/viewer/polling/polling-restart.js.map +1 -0
  536. package/dist/viewer/polling/polling-state.d.ts +182 -0
  537. package/dist/viewer/polling/polling-state.js +306 -0
  538. package/dist/viewer/polling/polling-state.js.map +1 -0
  539. package/dist/viewer/polling/tab-visibility.d.ts +112 -0
  540. package/dist/viewer/polling/tab-visibility.js +276 -0
  541. package/dist/viewer/polling/tab-visibility.js.map +1 -0
  542. package/dist/viewer/polling/tick-timer.d.ts +70 -0
  543. package/dist/viewer/polling/tick-timer.js +168 -0
  544. package/dist/viewer/polling/tick-timer.js.map +1 -0
  545. package/dist/viewer/polling/tick-visibility-gate.d.ts +92 -0
  546. package/dist/viewer/polling/tick-visibility-gate.js +146 -0
  547. package/dist/viewer/polling/tick-visibility-gate.js.map +1 -0
  548. package/dist/viewer/route-state.d.ts +8 -0
  549. package/dist/viewer/route-state.js +77 -0
  550. package/dist/viewer/route-state.js.map +1 -0
  551. package/dist/viewer/schema-compat.d.ts +17 -0
  552. package/dist/viewer/schema-compat.js +49 -0
  553. package/dist/viewer/schema-compat.js.map +1 -0
  554. package/dist/viewer/types.d.ts +66 -0
  555. package/dist/viewer/types.js +2 -0
  556. package/dist/viewer/types.js.map +1 -0
  557. package/dist/viewer/usage/constants.d.ts +14 -0
  558. package/dist/viewer/usage/constants.js +14 -0
  559. package/dist/viewer/usage/constants.js.map +1 -0
  560. package/dist/viewer/usage/index.d.ts +7 -0
  561. package/dist/viewer/usage/index.js +8 -0
  562. package/dist/viewer/usage/index.js.map +1 -0
  563. package/dist/viewer/utils.d.ts +25 -0
  564. package/dist/viewer/utils.js +48 -0
  565. package/dist/viewer/utils.js.map +1 -0
  566. package/dist/viewer/validate.d.ts +23 -0
  567. package/dist/viewer/validate.js +275 -0
  568. package/dist/viewer/validate.js.map +1 -0
  569. package/dist/viewer/views/analysis.d.ts +10 -0
  570. package/dist/viewer/views/analysis.js +109 -0
  571. package/dist/viewer/views/analysis.js.map +1 -0
  572. package/dist/viewer/views/architecture.d.ts +10 -0
  573. package/dist/viewer/views/architecture.js +44 -0
  574. package/dist/viewer/views/architecture.js.map +1 -0
  575. package/dist/viewer/views/domain-hench.d.ts +13 -0
  576. package/dist/viewer/views/domain-hench.js +14 -0
  577. package/dist/viewer/views/domain-hench.js.map +1 -0
  578. package/dist/viewer/views/domain-rex.d.ts +17 -0
  579. package/dist/viewer/views/domain-rex.js +18 -0
  580. package/dist/viewer/views/domain-rex.js.map +1 -0
  581. package/dist/viewer/views/domain-settings.d.ts +12 -0
  582. package/dist/viewer/views/domain-settings.js +13 -0
  583. package/dist/viewer/views/domain-settings.js.map +1 -0
  584. package/dist/viewer/views/domain-sourcevision.d.ts +20 -0
  585. package/dist/viewer/views/domain-sourcevision.js +21 -0
  586. package/dist/viewer/views/domain-sourcevision.js.map +1 -0
  587. package/dist/viewer/views/enrichment-thresholds.d.ts +11 -0
  588. package/dist/viewer/views/enrichment-thresholds.js +12 -0
  589. package/dist/viewer/views/enrichment-thresholds.js.map +1 -0
  590. package/dist/viewer/views/feature-toggles.d.ts +13 -0
  591. package/dist/viewer/views/feature-toggles.js +185 -0
  592. package/dist/viewer/views/feature-toggles.js.map +1 -0
  593. package/dist/viewer/views/files.d.ts +13 -0
  594. package/dist/viewer/views/files.js +174 -0
  595. package/dist/viewer/views/files.js.map +1 -0
  596. package/dist/viewer/views/graph.d.ts +12 -0
  597. package/dist/viewer/views/graph.js +316 -0
  598. package/dist/viewer/views/graph.js.map +1 -0
  599. package/dist/viewer/views/hench-config.d.ts +39 -0
  600. package/dist/viewer/views/hench-config.js +473 -0
  601. package/dist/viewer/views/hench-config.js.map +1 -0
  602. package/dist/viewer/views/hench-runs.d.ts +19 -0
  603. package/dist/viewer/views/hench-runs.js +460 -0
  604. package/dist/viewer/views/hench-runs.js.map +1 -0
  605. package/dist/viewer/views/hench-templates.d.ts +17 -0
  606. package/dist/viewer/views/hench-templates.js +262 -0
  607. package/dist/viewer/views/hench-templates.js.map +1 -0
  608. package/dist/viewer/views/integration-config.d.ts +73 -0
  609. package/dist/viewer/views/integration-config.js +524 -0
  610. package/dist/viewer/views/integration-config.js.map +1 -0
  611. package/dist/viewer/views/notion-config.d.ts +16 -0
  612. package/dist/viewer/views/notion-config.js +357 -0
  613. package/dist/viewer/views/notion-config.js.map +1 -0
  614. package/dist/viewer/views/overview.d.ts +10 -0
  615. package/dist/viewer/views/overview.js +187 -0
  616. package/dist/viewer/views/overview.js.map +1 -0
  617. package/dist/viewer/views/pr-markdown.d.ts +3 -0
  618. package/dist/viewer/views/pr-markdown.js +350 -0
  619. package/dist/viewer/views/pr-markdown.js.map +1 -0
  620. package/dist/viewer/views/prd.d.ts +34 -0
  621. package/dist/viewer/views/prd.js +257 -0
  622. package/dist/viewer/views/prd.js.map +1 -0
  623. package/dist/viewer/views/problems.d.ts +8 -0
  624. package/dist/viewer/views/problems.js +50 -0
  625. package/dist/viewer/views/problems.js.map +1 -0
  626. package/dist/viewer/views/rex-dashboard.d.ts +14 -0
  627. package/dist/viewer/views/rex-dashboard.js +334 -0
  628. package/dist/viewer/views/rex-dashboard.js.map +1 -0
  629. package/dist/viewer/views/routes.d.ts +8 -0
  630. package/dist/viewer/views/routes.js +216 -0
  631. package/dist/viewer/views/routes.js.map +1 -0
  632. package/dist/viewer/views/sourcevision-tabs.d.ts +18 -0
  633. package/dist/viewer/views/sourcevision-tabs.js +14 -0
  634. package/dist/viewer/views/sourcevision-tabs.js.map +1 -0
  635. package/dist/viewer/views/suggestions.d.ts +8 -0
  636. package/dist/viewer/views/suggestions.js +36 -0
  637. package/dist/viewer/views/suggestions.js.map +1 -0
  638. package/dist/viewer/views/task-audit.d.ts +18 -0
  639. package/dist/viewer/views/task-audit.js +413 -0
  640. package/dist/viewer/views/task-audit.js.map +1 -0
  641. package/dist/viewer/views/token-usage.d.ts +10 -0
  642. package/dist/viewer/views/token-usage.js +410 -0
  643. package/dist/viewer/views/token-usage.js.map +1 -0
  644. package/dist/viewer/views/validation.d.ts +11 -0
  645. package/dist/viewer/views/validation.js +475 -0
  646. package/dist/viewer/views/validation.js.map +1 -0
  647. package/dist/viewer/views/view-registry.d.ts +27 -0
  648. package/dist/viewer/views/view-registry.js +70 -0
  649. package/dist/viewer/views/view-registry.js.map +1 -0
  650. package/dist/viewer/views/workflow-optimization.d.ts +12 -0
  651. package/dist/viewer/views/workflow-optimization.js +311 -0
  652. package/dist/viewer/views/workflow-optimization.js.map +1 -0
  653. package/dist/viewer/views/zone-types.d.ts +69 -0
  654. package/dist/viewer/views/zone-types.js +5 -0
  655. package/dist/viewer/views/zone-types.js.map +1 -0
  656. package/dist/viewer/views/zones.d.ts +50 -0
  657. package/dist/viewer/views/zones.js +1438 -0
  658. package/dist/viewer/views/zones.js.map +1 -0
  659. package/dist/viewer/visualization/colors.d.ts +16 -0
  660. package/dist/viewer/visualization/colors.js +31 -0
  661. package/dist/viewer/visualization/colors.js.map +1 -0
  662. package/dist/viewer/visualization/flow.d.ts +54 -0
  663. package/dist/viewer/visualization/flow.js +123 -0
  664. package/dist/viewer/visualization/flow.js.map +1 -0
  665. package/dist/viewer/visualization/index.d.ts +34 -0
  666. package/dist/viewer/visualization/index.js +40 -0
  667. package/dist/viewer/visualization/index.js.map +1 -0
  668. package/dist/viewer/visualization/metrics.d.ts +8 -0
  669. package/dist/viewer/visualization/metrics.js +16 -0
  670. package/dist/viewer/visualization/metrics.js.map +1 -0
  671. package/package.json +54 -0
@@ -0,0 +1,17 @@
1
+ import type { Zone, ZoneCrossing } from "../external.js";
2
+ import type { NavigateTo } from "../types.js";
3
+ export interface ZoneSlideoutProps {
4
+ /** Zone to display, or null to hide the panel. */
5
+ zone: Zone | null;
6
+ /** All crossings for computing dependencies. */
7
+ crossings: ZoneCrossing[];
8
+ /** Full zone list for color lookup and dependency name resolution. */
9
+ allZones: Zone[];
10
+ /** Close the slideout. */
11
+ onClose: () => void;
12
+ /** Navigate to a file when clicked. */
13
+ onFileClick?: (path: string) => void;
14
+ /** Navigate to a different view. */
15
+ navigateTo?: NavigateTo;
16
+ }
17
+ export declare function ZoneSlideout({ zone, crossings, allZones, onClose, onFileClick, navigateTo, }: ZoneSlideoutProps): import("preact").VNode<import("preact").Attributes> | null;
@@ -0,0 +1,162 @@
1
+ import { h, Fragment } from "preact";
2
+ import { useState, useEffect, useCallback } from "preact/hooks";
3
+ import { getZoneColorByIndex } from "../visualization/colors.js";
4
+ import { meterClass } from "../visualization/metrics.js";
5
+ import { basename } from "../utils.js";
6
+ // ── Component ──────────────────────────────────────────────────────────
7
+ export function ZoneSlideout({ zone, crossings, allZones, onClose, onFileClick, navigateTo, }) {
8
+ const [showFiles, setShowFiles] = useState(false);
9
+ // Reset file list when zone changes
10
+ useEffect(() => { setShowFiles(false); }, [zone?.id]);
11
+ // Close on Escape
12
+ useEffect(() => {
13
+ if (!zone)
14
+ return;
15
+ const handleKey = (e) => {
16
+ if (e.key === "Escape")
17
+ onClose();
18
+ };
19
+ document.addEventListener("keydown", handleKey);
20
+ return () => document.removeEventListener("keydown", handleKey);
21
+ }, [zone, onClose]);
22
+ // Trap focus inside the panel when open
23
+ const panelRef = useCallback((el) => {
24
+ if (el)
25
+ el.focus();
26
+ }, []);
27
+ if (!zone)
28
+ return null;
29
+ const zoneIdx = allZones.indexOf(zone);
30
+ const color = getZoneColorByIndex(zoneIdx >= 0 ? zoneIdx : 0);
31
+ // Dependencies
32
+ const incoming = crossings.filter((c) => c.toZone === zone.id);
33
+ const outgoing = crossings.filter((c) => c.fromZone === zone.id);
34
+ const incomingByZone = groupBy(incoming, (c) => c.fromZone);
35
+ const outgoingByZone = groupBy(outgoing, (c) => c.toZone);
36
+ return h(Fragment, null,
37
+ // Backdrop — click to dismiss
38
+ h("div", {
39
+ class: "zone-slideout-backdrop open",
40
+ onClick: onClose,
41
+ "aria-hidden": "true",
42
+ }),
43
+ // Panel
44
+ h("aside", {
45
+ ref: panelRef,
46
+ class: "zone-slideout open",
47
+ role: "complementary",
48
+ "aria-label": `Zone details: ${zone.name}`,
49
+ tabIndex: -1,
50
+ style: `--zone-accent: ${color}`,
51
+ },
52
+ // Header
53
+ h("div", { class: "zone-slideout-header" }, h("div", { class: "zone-slideout-title" }, h("span", { class: "zone-slideout-dot", style: `background: ${color}` }), h("h3", null, zone.name)), h("button", {
54
+ class: "zone-slideout-close",
55
+ onClick: onClose,
56
+ "aria-label": "Close zone details",
57
+ title: "Close (Esc)",
58
+ }, "\u2715")),
59
+ // Description
60
+ zone.description
61
+ ? h("p", { class: "zone-slideout-desc" }, zone.description)
62
+ : null,
63
+ // Metrics row
64
+ h("div", { class: "zone-slideout-metrics" }, h("div", { class: "zone-slideout-metric" }, h("span", { class: "zone-slideout-metric-val" }, zone.files.length), h("span", { class: "zone-slideout-metric-lbl" }, "files")), h("div", { class: "zone-slideout-metric" }, h("span", {
65
+ class: "zone-slideout-metric-val",
66
+ style: `color: ${cohesionColor(zone.cohesion)}`,
67
+ }, zone.cohesion.toFixed(2)), h("span", { class: "zone-slideout-metric-lbl" }, "cohesion")), h("div", { class: "zone-slideout-metric" }, h("span", {
68
+ class: "zone-slideout-metric-val",
69
+ style: `color: ${couplingColor(zone.coupling)}`,
70
+ }, zone.coupling.toFixed(2)), h("span", { class: "zone-slideout-metric-lbl" }, "coupling"))),
71
+ // Cohesion meter
72
+ h("div", { class: "zone-slideout-meter-row" }, h("span", { class: "zone-slideout-meter-label" }, "Cohesion"), h("div", { class: "meter" }, h("div", {
73
+ class: `meter-fill ${meterClass(zone.cohesion)}`,
74
+ style: `width: ${zone.cohesion * 100}%`,
75
+ }))),
76
+ // Coupling meter
77
+ h("div", { class: "zone-slideout-meter-row" }, h("span", { class: "zone-slideout-meter-label" }, "Coupling"), h("div", { class: "meter" }, h("div", {
78
+ class: `meter-fill ${meterClass(zone.coupling, true)}`,
79
+ style: `width: ${zone.coupling * 100}%`,
80
+ }))),
81
+ // Entry points
82
+ zone.entryPoints.length > 0
83
+ ? h("div", { class: "zone-slideout-section" }, h("h4", null, "Entry Points"), h("ul", { class: "zone-slideout-list" }, zone.entryPoints.slice(0, 8).map((ep) => h("li", {
84
+ key: ep,
85
+ class: `zone-slideout-list-item mono-sm ${onFileClick ? "clickable" : ""}`,
86
+ title: ep,
87
+ onClick: onFileClick ? () => onFileClick(ep) : undefined,
88
+ }, basename(ep))), zone.entryPoints.length > 8
89
+ ? h("li", { class: "zone-slideout-list-more" }, `+${zone.entryPoints.length - 8} more`)
90
+ : null))
91
+ : null,
92
+ // Insights
93
+ zone.insights && zone.insights.length > 0
94
+ ? h("div", { class: "zone-slideout-section" }, h("h4", null, "Insights"), h("ul", { class: "zone-slideout-list" }, zone.insights.slice(0, 6).map((ins, i) => h("li", { key: i, class: "zone-slideout-list-item" }, ins)), zone.insights.length > 6
95
+ ? h("li", { class: "zone-slideout-list-more" }, `+${zone.insights.length - 6} more`)
96
+ : null))
97
+ : null,
98
+ // Sub-zones
99
+ zone.subZones && zone.subZones.length > 0
100
+ ? h("div", { class: "zone-slideout-section" }, h("h4", null, "Sub-zones"), h("ul", { class: "zone-slideout-list" }, zone.subZones.slice(0, 6).map((sz) => h("li", { key: sz.id, class: "zone-slideout-dep-item" }, h("span", null, sz.name), h("span", { class: "zone-slideout-dep-count" }, `${sz.files.length} files`))), zone.subZones.length > 6
101
+ ? h("li", { class: "zone-slideout-list-more" }, `+${zone.subZones.length - 6} more`)
102
+ : null))
103
+ : null,
104
+ // Dependencies
105
+ (Object.keys(incomingByZone).length > 0 || Object.keys(outgoingByZone).length > 0)
106
+ ? h("div", { class: "zone-slideout-section" }, h("h4", null, "Dependencies"), h("div", { class: "zone-slideout-deps" }, Object.keys(outgoingByZone).length > 0
107
+ ? h("div", { class: "zone-slideout-dep-col" }, h("span", { class: "zone-slideout-dep-label" }, "Depends on"), ...Object.entries(outgoingByZone).slice(0, 6).map(([zoneId, items]) => {
108
+ const target = allZones.find((z) => z.id === zoneId);
109
+ return h("div", { key: zoneId, class: "zone-slideout-dep-item" }, h("span", null, target?.name || zoneId), h("span", { class: "zone-slideout-dep-count" }, items.length));
110
+ }))
111
+ : null, Object.keys(incomingByZone).length > 0
112
+ ? h("div", { class: "zone-slideout-dep-col" }, h("span", { class: "zone-slideout-dep-label" }, "Used by"), ...Object.entries(incomingByZone).slice(0, 6).map(([zoneId, items]) => {
113
+ const source = allZones.find((z) => z.id === zoneId);
114
+ return h("div", { key: zoneId, class: "zone-slideout-dep-item" }, h("span", null, source?.name || zoneId), h("span", { class: "zone-slideout-dep-count" }, items.length));
115
+ }))
116
+ : null))
117
+ : null,
118
+ // Files toggle
119
+ h("div", { class: "zone-slideout-section" }, h("button", {
120
+ class: "zone-slideout-files-toggle",
121
+ onClick: () => setShowFiles(!showFiles),
122
+ }, showFiles ? "Hide files" : `Show ${zone.files.length} files`), showFiles
123
+ ? h("ul", { class: "zone-slideout-file-list" }, zone.files.map((f) => h("li", {
124
+ key: f,
125
+ class: `zone-slideout-file-item mono-sm ${onFileClick ? "clickable" : ""}`,
126
+ onClick: onFileClick ? () => onFileClick(f) : undefined,
127
+ }, h("span", { class: "zone-slideout-file-path" }, f), zone.entryPoints.includes(f)
128
+ ? h("span", { class: "zone-slideout-entry-badge" }, "entry")
129
+ : null)))
130
+ : null),
131
+ // Navigation buttons
132
+ navigateTo
133
+ ? h("div", { class: "zone-slideout-nav" }, h("button", {
134
+ class: "zone-slideout-nav-btn",
135
+ onClick: () => navigateTo("files", { zone: zone.id }),
136
+ }, "\u2630 View in Files"), h("button", {
137
+ class: "zone-slideout-nav-btn",
138
+ onClick: () => navigateTo("problems"),
139
+ }, "\u26A0 View Problems"), h("button", {
140
+ class: "zone-slideout-nav-btn",
141
+ onClick: () => navigateTo("suggestions"),
142
+ }, "\u2728 View Suggestions"))
143
+ : null));
144
+ }
145
+ // ── Helpers ────────────────────────────────────────────────────────────
146
+ function cohesionColor(v) {
147
+ return v >= 0.7 ? "var(--green)" : v >= 0.4 ? "var(--orange)" : "var(--red)";
148
+ }
149
+ function couplingColor(v) {
150
+ return v <= 0.3 ? "var(--green)" : v <= 0.5 ? "var(--orange)" : "var(--red)";
151
+ }
152
+ function groupBy(items, key) {
153
+ const result = {};
154
+ for (const item of items) {
155
+ const k = key(item);
156
+ if (!result[k])
157
+ result[k] = [];
158
+ result[k].push(item);
159
+ }
160
+ return result;
161
+ }
162
+ //# sourceMappingURL=zone-slideout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zone-slideout.js","sourceRoot":"","sources":["../../../src/viewer/components/zone-slideout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Client-side crash detection and automatic recovery.
3
+ *
4
+ * Detects memory-related browser crashes using a sessionStorage heartbeat:
5
+ * a "running" flag is set on page load and cleared on clean unload. If the
6
+ * flag is still present at next load, the previous session ended abnormally
7
+ * — most likely an OOM crash or browser-killed tab (error code 5).
8
+ *
9
+ * Tracks crash history to detect crash loops and preserves the user's
10
+ * navigation state so it can be restored after recovery.
11
+ *
12
+ * Designed as a standalone module with zero framework dependencies —
13
+ * the Preact hook (`useCrashRecovery`) is provided separately.
14
+ */
15
+ import type { ViewId } from "../../shared/view-id.js";
16
+ /** Saved navigation state that survives a crash. */
17
+ export interface SavedNavigationState {
18
+ view: ViewId;
19
+ selectedFile: string | null;
20
+ selectedZone: string | null;
21
+ selectedRunId: string | null;
22
+ selectedTaskId: string | null;
23
+ timestamp: string;
24
+ }
25
+ /** Result of crash detection performed at page load. */
26
+ export interface CrashDetectionResult {
27
+ /** Whether a crash was detected (previous session didn't unload cleanly). */
28
+ crashed: boolean;
29
+ /** Whether multiple crashes happened recently (crash loop). */
30
+ crashLoop: boolean;
31
+ /** Number of recent crashes within the loop window. */
32
+ recentCrashCount: number;
33
+ /** Recovered navigation state from before the crash, if available. */
34
+ recoveredState: SavedNavigationState | null;
35
+ }
36
+ /**
37
+ * Detect whether the previous session ended in a crash.
38
+ *
39
+ * Must be called **once** early in page startup (before any clean unload
40
+ * has a chance to clear the heartbeat). Returns the detection result and
41
+ * installs the heartbeat + unload handler for this session.
42
+ *
43
+ * Safe to call multiple times — returns the cached result after first call.
44
+ */
45
+ export declare function detectCrash(): CrashDetectionResult;
46
+ /**
47
+ * Save the current navigation state so it can be restored after a crash.
48
+ *
49
+ * Call this on every view change to keep the saved state fresh.
50
+ */
51
+ export declare function saveNavigationState(state: Omit<SavedNavigationState, "timestamp">): void;
52
+ /**
53
+ * Clear the saved navigation state (e.g. after successful recovery).
54
+ */
55
+ export declare function clearSavedNavigationState(): void;
56
+ /**
57
+ * Mark that the recovery banner has been shown/dismissed in this session.
58
+ */
59
+ export declare function markRecoveryShown(): void;
60
+ /**
61
+ * Check if recovery was already shown in this session.
62
+ */
63
+ export declare function wasRecoveryShown(): boolean;
64
+ /** Get the cached crash detection result (null if detectCrash hasn't been called). */
65
+ export declare function getDetectionResult(): CrashDetectionResult | null;
66
+ /** Clear the crash history. */
67
+ export declare function clearCrashHistory(): void;
68
+ /** Reset all module state (for testing). */
69
+ export declare function resetCrashDetector(): void;
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Client-side crash detection and automatic recovery.
3
+ *
4
+ * Detects memory-related browser crashes using a sessionStorage heartbeat:
5
+ * a "running" flag is set on page load and cleared on clean unload. If the
6
+ * flag is still present at next load, the previous session ended abnormally
7
+ * — most likely an OOM crash or browser-killed tab (error code 5).
8
+ *
9
+ * Tracks crash history to detect crash loops and preserves the user's
10
+ * navigation state so it can be restored after recovery.
11
+ *
12
+ * Designed as a standalone module with zero framework dependencies —
13
+ * the Preact hook (`useCrashRecovery`) is provided separately.
14
+ */
15
+ // ─── Constants ───────────────────────────────────────────────────────────────
16
+ /** sessionStorage key: set while the page is alive, cleared on clean unload. */
17
+ const HEARTBEAT_KEY = "ndx-crash-heartbeat";
18
+ /** sessionStorage key: saved navigation state for recovery. */
19
+ const NAV_STATE_KEY = "ndx-crash-nav-state";
20
+ /** sessionStorage key: JSON array of recent crash timestamps. */
21
+ const CRASH_HISTORY_KEY = "ndx-crash-history";
22
+ /** sessionStorage key: tracks whether we've already shown recovery for this session. */
23
+ const RECOVERY_SHOWN_KEY = "ndx-crash-recovery-shown";
24
+ /** Time window for crash loop detection (5 minutes). */
25
+ const CRASH_LOOP_WINDOW_MS = 5 * 60 * 1000;
26
+ /** Number of crashes within the window that constitutes a loop. */
27
+ const CRASH_LOOP_THRESHOLD = 2;
28
+ /** Maximum crash history entries to retain. */
29
+ const MAX_CRASH_HISTORY = 10;
30
+ // ─── Storage helpers ─────────────────────────────────────────────────────────
31
+ function storageAvailable() {
32
+ try {
33
+ const key = "__ndx_storage_test__";
34
+ sessionStorage.setItem(key, "1");
35
+ sessionStorage.removeItem(key);
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ function getJSON(key) {
43
+ try {
44
+ const raw = sessionStorage.getItem(key);
45
+ if (!raw)
46
+ return null;
47
+ return JSON.parse(raw);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ function setJSON(key, value) {
54
+ try {
55
+ sessionStorage.setItem(key, JSON.stringify(value));
56
+ }
57
+ catch {
58
+ // Storage full or unavailable — silently ignore.
59
+ }
60
+ }
61
+ // ─── Crash history management ────────────────────────────────────────────────
62
+ function getCrashHistory() {
63
+ return getJSON(CRASH_HISTORY_KEY) ?? [];
64
+ }
65
+ function addCrashRecord() {
66
+ const history = getCrashHistory();
67
+ history.push({ timestamp: new Date().toISOString() });
68
+ // Trim to bounded size.
69
+ const trimmed = history.slice(-MAX_CRASH_HISTORY);
70
+ setJSON(CRASH_HISTORY_KEY, trimmed);
71
+ return trimmed;
72
+ }
73
+ function getRecentCrashCount(history) {
74
+ const cutoff = Date.now() - CRASH_LOOP_WINDOW_MS;
75
+ return history.filter((r) => new Date(r.timestamp).getTime() > cutoff).length;
76
+ }
77
+ // ─── Heartbeat lifecycle ─────────────────────────────────────────────────────
78
+ /** Set the heartbeat flag — call once at page startup. */
79
+ function setHeartbeat() {
80
+ try {
81
+ sessionStorage.setItem(HEARTBEAT_KEY, new Date().toISOString());
82
+ }
83
+ catch {
84
+ // noop
85
+ }
86
+ }
87
+ /** Clear the heartbeat flag — called on clean page unload. */
88
+ function clearHeartbeat() {
89
+ try {
90
+ sessionStorage.removeItem(HEARTBEAT_KEY);
91
+ }
92
+ catch {
93
+ // noop
94
+ }
95
+ }
96
+ /** Check whether the heartbeat was left set from a previous load. */
97
+ function heartbeatPresent() {
98
+ try {
99
+ return sessionStorage.getItem(HEARTBEAT_KEY) !== null;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ // ─── Module state ────────────────────────────────────────────────────────────
106
+ let initialized = false;
107
+ let detectionResult = null;
108
+ let unloadHandler = null;
109
+ // ─── Public API ──────────────────────────────────────────────────────────────
110
+ /**
111
+ * Detect whether the previous session ended in a crash.
112
+ *
113
+ * Must be called **once** early in page startup (before any clean unload
114
+ * has a chance to clear the heartbeat). Returns the detection result and
115
+ * installs the heartbeat + unload handler for this session.
116
+ *
117
+ * Safe to call multiple times — returns the cached result after first call.
118
+ */
119
+ export function detectCrash() {
120
+ if (detectionResult)
121
+ return detectionResult;
122
+ if (!storageAvailable()) {
123
+ detectionResult = {
124
+ crashed: false,
125
+ crashLoop: false,
126
+ recentCrashCount: 0,
127
+ recoveredState: null,
128
+ };
129
+ return detectionResult;
130
+ }
131
+ const crashed = heartbeatPresent();
132
+ let recoveredState = null;
133
+ let recentCrashCount = 0;
134
+ let crashLoop = false;
135
+ if (crashed) {
136
+ // Record this crash in history.
137
+ const history = addCrashRecord();
138
+ recentCrashCount = getRecentCrashCount(history);
139
+ crashLoop = recentCrashCount >= CRASH_LOOP_THRESHOLD;
140
+ // Recover saved navigation state.
141
+ recoveredState = getJSON(NAV_STATE_KEY);
142
+ }
143
+ detectionResult = { crashed, crashLoop, recentCrashCount, recoveredState };
144
+ // Install heartbeat for this session.
145
+ setHeartbeat();
146
+ // Clear heartbeat on clean unload so next load won't see a false crash.
147
+ unloadHandler = () => clearHeartbeat();
148
+ window.addEventListener("beforeunload", unloadHandler);
149
+ // Mark recovery as not yet shown for this session.
150
+ try {
151
+ sessionStorage.removeItem(RECOVERY_SHOWN_KEY);
152
+ }
153
+ catch {
154
+ // noop
155
+ }
156
+ initialized = true;
157
+ return detectionResult;
158
+ }
159
+ /**
160
+ * Save the current navigation state so it can be restored after a crash.
161
+ *
162
+ * Call this on every view change to keep the saved state fresh.
163
+ */
164
+ export function saveNavigationState(state) {
165
+ if (!storageAvailable())
166
+ return;
167
+ const full = {
168
+ ...state,
169
+ timestamp: new Date().toISOString(),
170
+ };
171
+ setJSON(NAV_STATE_KEY, full);
172
+ }
173
+ /**
174
+ * Clear the saved navigation state (e.g. after successful recovery).
175
+ */
176
+ export function clearSavedNavigationState() {
177
+ try {
178
+ sessionStorage.removeItem(NAV_STATE_KEY);
179
+ }
180
+ catch {
181
+ // noop
182
+ }
183
+ }
184
+ /**
185
+ * Mark that the recovery banner has been shown/dismissed in this session.
186
+ */
187
+ export function markRecoveryShown() {
188
+ try {
189
+ sessionStorage.setItem(RECOVERY_SHOWN_KEY, "true");
190
+ }
191
+ catch {
192
+ // noop
193
+ }
194
+ }
195
+ /**
196
+ * Check if recovery was already shown in this session.
197
+ */
198
+ export function wasRecoveryShown() {
199
+ try {
200
+ return sessionStorage.getItem(RECOVERY_SHOWN_KEY) === "true";
201
+ }
202
+ catch {
203
+ return false;
204
+ }
205
+ }
206
+ /** Get the cached crash detection result (null if detectCrash hasn't been called). */
207
+ export function getDetectionResult() {
208
+ return detectionResult;
209
+ }
210
+ /** Clear the crash history. */
211
+ export function clearCrashHistory() {
212
+ try {
213
+ sessionStorage.removeItem(CRASH_HISTORY_KEY);
214
+ }
215
+ catch {
216
+ // noop
217
+ }
218
+ }
219
+ /** Reset all module state (for testing). */
220
+ export function resetCrashDetector() {
221
+ if (unloadHandler) {
222
+ window.removeEventListener("beforeunload", unloadHandler);
223
+ unloadHandler = null;
224
+ }
225
+ initialized = false;
226
+ detectionResult = null;
227
+ try {
228
+ sessionStorage.removeItem(HEARTBEAT_KEY);
229
+ sessionStorage.removeItem(NAV_STATE_KEY);
230
+ sessionStorage.removeItem(CRASH_HISTORY_KEY);
231
+ sessionStorage.removeItem(RECOVERY_SHOWN_KEY);
232
+ }
233
+ catch {
234
+ // noop
235
+ }
236
+ }
237
+ // Test-only constants and helpers are in tests/helpers/crash-detector-test-support.ts
238
+ // to keep the production API surface clean.
239
+ //# sourceMappingURL=crash-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crash-detector.js","sourceRoot":"","sources":["../../../src/viewer/crash/crash-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Crash recovery zone public interface.
3
+ *
4
+ * All cross-zone consumers should import from this barrel rather than
5
+ * the crash-detector implementation file directly.
6
+ */
7
+ export { detectCrash, saveNavigationState, clearSavedNavigationState, markRecoveryShown, wasRecoveryShown, getDetectionResult, clearCrashHistory, resetCrashDetector, type CrashDetectionResult, type SavedNavigationState, } from "./crash-detector.js";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Crash recovery zone public interface.
3
+ *
4
+ * All cross-zone consumers should import from this barrel rather than
5
+ * the crash-detector implementation file directly.
6
+ */
7
+ export { detectCrash, saveNavigationState, clearSavedNavigationState, markRecoveryShown, wasRecoveryShown, getDetectionResult, clearCrashHistory, resetCrashDetector, } from "./crash-detector.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/viewer/crash/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GAGnB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Deployed mode support — static export fetch adapter.
3
+ *
4
+ * When the viewer is exported as a static site via `ndx export`, a global
5
+ * flag (`window.__NDX_DEPLOYED__`) is injected into the HTML. This module
6
+ * detects that flag and installs a fetch adapter that transparently rewrites
7
+ * API requests to pre-rendered static JSON files.
8
+ *
9
+ * The adapter means no per-component changes are needed — existing `fetch()`
10
+ * calls to `/api/*` and `/data/*` just work against the static file tree.
11
+ */
12
+ interface DeployedConfig {
13
+ basePath: string;
14
+ exportedAt: string;
15
+ }
16
+ declare global {
17
+ interface Window {
18
+ __NDX_DEPLOYED__?: DeployedConfig;
19
+ }
20
+ }
21
+ /** Check whether the viewer is running in deployed (static export) mode. */
22
+ export declare function isDeployedMode(): boolean;
23
+ /** Return the deployed config, or null if not in deployed mode. */
24
+ export declare function getDeployedConfig(): DeployedConfig | null;
25
+ /**
26
+ * Install a global fetch adapter that rewrites requests for deployed mode.
27
+ *
28
+ * Rewrites:
29
+ * GET /api/* → {basePath}api/*.json
30
+ * GET /data → {basePath}data/index.json
31
+ * GET /data/status → synthetic { mtimes: {} }
32
+ * GET /data/* → {basePath}data/*
33
+ * Non-GET methods → synthetic 405 response
34
+ * Everything else → pass through
35
+ */
36
+ export declare function installFetchAdapter(): void;
37
+ export {};