@bendyline/gezel-service 1.0.7 → 1.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 (237) hide show
  1. package/dist/bin/gezeld.js +6253 -3616
  2. package/dist/handboek-content/whats-new/1.26224.md +1 -0
  3. package/dist/handboek-content/whats-new/1.26226.md +1 -0
  4. package/dist/handboek-content/whats-new/1.26231.md +1 -0
  5. package/dist/handboek-content/whats-new/1.26234.md +1 -0
  6. package/dist/handboek-content/whats-new/1.26237.md +1 -0
  7. package/dist/handboek-content/whats-new/1.26244.md +2 -1
  8. package/dist/handboek-content/whats-new/1.26247.md +88 -0
  9. package/dist/handboek-content/whats-new/whats-new-index.md +1 -0
  10. package/dist/index-store/static-index-worker.js +17 -1
  11. package/dist/index.d.ts +473 -209
  12. package/dist/index.js +6251 -3614
  13. package/dist/memory/embed-worker.js +58 -2
  14. package/dist/memory/image-embed-worker.js +8 -0
  15. package/dist/providers/llama-cpp/gguf-metadata-worker.js +2 -0
  16. package/dist/providers/mlx/python/gezel_mlx_server.py +18 -18
  17. package/dist/ui/assets/AmbientDashboardCard-Cf5fi_fY.js +1 -0
  18. package/dist/ui/assets/{AudioEngineSettings-BDrNIGGm.js → AudioEngineSettings-D3L7HOHe.js} +1 -1
  19. package/dist/ui/assets/{BenchmarksView-CHyujjs8.js → BenchmarksView-B68hrLCl.js} +1 -1
  20. package/dist/ui/assets/CatalogBrowser-DEM9t7Es.js +1 -0
  21. package/dist/ui/assets/{ChannelsSettings-Be_W1mr8.js → ChannelsSettings-DtK_k0Ul.js} +1 -1
  22. package/dist/ui/assets/ChatTimelineView-CQ4Sf4Ip.js +7 -0
  23. package/dist/ui/assets/ConfirmDialog-Dt1ed4Fh.js +1 -0
  24. package/dist/ui/assets/ConnectedAppsPanel-Cl8LEkrt.js +1 -0
  25. package/dist/ui/assets/CraftbookEditor-DEQRlQ2p.js +1 -0
  26. package/dist/ui/assets/{CraftbookScriptEditorView-DXIZYZT3.js → CraftbookScriptEditorView-DhXkkIdK.js} +1 -1
  27. package/dist/ui/assets/{CraftbookTabContent-Bm7t_b37.js → CraftbookTabContent-_oIdpQTG.js} +1 -1
  28. package/dist/ui/assets/{CraftbookToolsetSetup-DTEA-3K3.js → CraftbookToolsetSetup-BKg136L1.js} +1 -1
  29. package/dist/ui/assets/{CraftbooksView-C4X99TTe.js → CraftbooksView-Dm2zH-nW.js} +2 -2
  30. package/dist/ui/assets/{DiffpackReviewView-ClcNxtmF.js → DiffpackReviewView-EFLGJnwr.js} +1 -1
  31. package/dist/ui/assets/DocumentDetail-ClDRj2N-.js +1 -0
  32. package/dist/ui/assets/DocumentsView-ny9oieg2.js +1 -0
  33. package/dist/ui/assets/DropdownMenu-S4d9-3j3.js +1 -0
  34. package/dist/ui/assets/Ds4Settings-CeWlm5Vf.js +1 -0
  35. package/dist/ui/assets/EmbeddedChat-Hjrrgpao.js +1 -0
  36. package/dist/ui/assets/{FaceRecognitionCard-D3hdc7uU.js → FaceRecognitionCard-D7ufKqjI.js} +1 -1
  37. package/dist/ui/assets/FileMapView-DRjf59RH.js +1 -0
  38. package/dist/ui/assets/{FoldersSettings-BcNzl4vT.js → FoldersSettings-DDUhaFio.js} +1 -1
  39. package/dist/ui/assets/GezelDetail-Cph6pVGb.js +1 -0
  40. package/dist/ui/assets/{GezelJsonEditor-fOvYclu9.js → GezelJsonEditor-7vDGyBib.js} +1 -1
  41. package/dist/ui/assets/{GezellenView-BTzhHrxi.js → GezellenView-DQhcO1CP.js} +1 -1
  42. package/dist/ui/assets/{GildeUpdatesCard-Bq6XEpLP.js → GildeUpdatesCard-UKKNm_U8.js} +1 -1
  43. package/dist/ui/assets/{GithubSignInChip-CnlTCG8G.js → GithubSignInChip-DjM3qZsL.js} +1 -1
  44. package/dist/ui/assets/{HandboekMediaProvider-BfQW8_Nr.js → HandboekMediaProvider-DixaXTAH.js} +1 -1
  45. package/dist/ui/assets/HandboekView-BeNQqho9.js +1 -0
  46. package/dist/ui/assets/HistoryView-E2szGNGS.js +1 -0
  47. package/dist/ui/assets/{HomeView-CB_5TJIp.css → HomeView-CNeqCFPc.css} +1 -1
  48. package/dist/ui/assets/HomeView-CkiS3DXy.js +1 -0
  49. package/dist/ui/assets/{ImageEngineSettings-BpMfQy4f.js → ImageEngineSettings-BCKT7Gvi.js} +1 -1
  50. package/dist/ui/assets/{ImageRecognitionSettings-Ct-7-Oas.js → ImageRecognitionSettings-DD6syFez.js} +1 -1
  51. package/dist/ui/assets/IncompleteDownloads-BiPaaahS.js +1 -0
  52. package/dist/ui/assets/InstallProgressRow-DyKOI4MU.js +1 -0
  53. package/dist/ui/assets/KnowledgeCatalogsCard-B132vzRa.js +1 -0
  54. package/dist/ui/assets/KnowledgeView-CtPuIlN4.js +1 -0
  55. package/dist/ui/assets/LlamaCppSettings-D6zHcu4W.js +1 -0
  56. package/dist/ui/assets/{MarkdownField-D-0Zw7gM.js → MarkdownField-CK8K3fzj.js} +1 -1
  57. package/dist/ui/assets/MemoriesTree-DzjXzIrM.js +1 -0
  58. package/dist/ui/assets/{MicrophoneSettings-BIaFxyY_.js → MicrophoneSettings-1FH83SCq.js} +1 -1
  59. package/dist/ui/assets/MlxSettings-BYxUqFnJ.js +1 -0
  60. package/dist/ui/assets/ModelPicker-DoXPfQkQ.js +1 -0
  61. package/dist/ui/assets/{NewScriptDialog-D-gkY8TS.js → NewScriptDialog-C5X-7PMt.js} +1 -1
  62. package/dist/ui/assets/NewTaskDialog-Cyqtmigv.js +2 -0
  63. package/dist/ui/assets/{OllamaSettings-oIE2Mech.js → OllamaSettings-DkjmA-sB.js} +1 -1
  64. package/dist/ui/assets/ProjectChat-YEqUME6k.js +5 -0
  65. package/dist/ui/assets/{ProjectConnectionsTab-BZqp-oKI.js → ProjectConnectionsTab-dFCJpW93.js} +1 -1
  66. package/dist/ui/assets/ProjectGitStatusBar-CjZxG54t.js +1 -0
  67. package/dist/ui/assets/{ProjectGithubView-w8suLCsA.js → ProjectGithubView-CQ4-tmPx.js} +1 -1
  68. package/dist/ui/assets/{ProjectMailTab-DGo7eyB8.js → ProjectMailTab-NaScsZJf.js} +1 -1
  69. package/dist/ui/assets/ProjectOverviewView-ChjxbQas.js +1 -0
  70. package/dist/ui/assets/{ProjectTimeline-DRe3D9qY.js → ProjectTimeline-BZpdCisR.js} +1 -1
  71. package/dist/ui/assets/ProjectsView-J77ECk6V.js +7 -0
  72. package/dist/ui/assets/{RecommendedBadge-BKiDixnB.js → RecommendedBadge-D0m68PAu.js} +1 -1
  73. package/dist/ui/assets/{RemoteServersPanel-DGyl6-Rg.js → RemoteServersPanel-BdLOoORu.js} +1 -1
  74. package/dist/ui/assets/ScriptEditorTabs-BFvIiDFZ.js +2 -0
  75. package/dist/ui/assets/ScriptEditorView-B09rm1vz.js +5 -0
  76. package/dist/ui/assets/{ScriptsView-WQc28TmQ.js → ScriptsView-BvNAJXpo.js} +1 -1
  77. package/dist/ui/assets/{SecurityComplianceSettings-DsMEA4J3.js → SecurityComplianceSettings-DzGOnptO.js} +1 -1
  78. package/dist/ui/assets/SessionSwitcher-6okzcxT7.js +1 -0
  79. package/dist/ui/assets/SettingsView-Dur4dLhW.js +3 -0
  80. package/dist/ui/assets/SquisqIntegration-6v3yNOIP.js +2 -0
  81. package/dist/ui/assets/{StorageCleanupDialog-DHqwyMZZ.js → StorageCleanupDialog-OQlomMJD.js} +1 -1
  82. package/dist/ui/assets/{StorageUsageCard-CdT6SU51.js → StorageUsageCard-f6c6qTbM.js} +1 -1
  83. package/dist/ui/assets/Tabs-jE0Z5Tzd.js +1 -0
  84. package/dist/ui/assets/TaskTabContent-0w3kAUWR.js +1 -0
  85. package/dist/ui/assets/TasksView-BVMT4BAY.js +1 -0
  86. package/dist/ui/assets/{TerminalCodeEditor-77pBm6f3.js → TerminalCodeEditor-DO7zLKy-.js} +2 -2
  87. package/dist/ui/assets/ToolsetsEditor-Bb1wD5mV.js +8 -0
  88. package/dist/ui/assets/TransformToolbarButton-BWYkEB0d.js +5 -0
  89. package/dist/ui/assets/UnrecognizedModels-HtdMZUqK.js +1 -0
  90. package/dist/ui/assets/{VideoEngineSettings-DzMeINuv.js → VideoEngineSettings-Dq8Nw_tK.js} +1 -1
  91. package/dist/ui/assets/{WorkspaceIndexPane-DU4yd4Ai.js → WorkspaceIndexPane-fpDz4MwZ.js} +1 -1
  92. package/dist/ui/assets/{api-BX5xXiFs.js → api-BPraLwsh.js} +1 -1
  93. package/dist/ui/assets/chat-thread-memory-Be48zsyG.js +1 -0
  94. package/dist/ui/assets/chunk-6ECMNUIP-DDVjPyfK.js +15 -0
  95. package/dist/ui/assets/{chunk-6N2J7C2B-B5QIrD9m.js → chunk-6N2J7C2B-CsppiLVr.js} +1 -1
  96. package/dist/ui/assets/{chunk-A6N6IN3I-DXok09eC.js → chunk-A6N6IN3I-ofeM4l8g.js} +1 -1
  97. package/dist/ui/assets/chunk-B7GEAZBI-Divd2h1k.js +1 -0
  98. package/dist/ui/assets/chunk-DXYWKZ52-BXcAlClu.js +1 -0
  99. package/dist/ui/assets/chunk-FLR2ARKC-D7wrvQgT.js +2 -0
  100. package/dist/ui/assets/chunk-IIQYS2YH-DKZhWMpn.js +1 -0
  101. package/dist/ui/assets/{chunk-ILCJ3WFD-WRukZ7R1.js → chunk-ILCJ3WFD-CLZxw4Ge.js} +3 -3
  102. package/dist/ui/assets/chunk-OBADJV7C-CDVOcmYt.js +1 -0
  103. package/dist/ui/assets/chunk-Q77KNJIN-BIDRf0aP.js +6 -0
  104. package/dist/ui/assets/chunk-S5PCVMKU-Df5XzhSE.js +6 -0
  105. package/dist/ui/assets/chunk-UBFT2CDQ-FexGDigd.js +31 -0
  106. package/dist/ui/assets/{chunk-USU6HTKB-D5FmDzJU.js → chunk-USU6HTKB-B_p-YcDp.js} +1 -1
  107. package/dist/ui/assets/chunk-VKXOZTYP-BoVvWSBR.js +5 -0
  108. package/dist/ui/assets/{chunk-6RQOV3B3-CwvKotJw.js → chunk-VPWPEMZJ-DRKoa_j0.js} +1 -1
  109. package/dist/ui/assets/{chunk-WATAOG4Y-DXg2lov5.js → chunk-WATAOG4Y-C1EXVPmG.js} +1 -1
  110. package/dist/ui/assets/{container-B7jJtK5V.js → container-Ce94efbg.js} +1 -1
  111. package/dist/ui/assets/csv-62UGQMzZ.js +1 -0
  112. package/dist/ui/assets/data-B2kHjlc5.js +1 -0
  113. package/dist/ui/assets/dist-B9-VrAP8.js +2 -0
  114. package/dist/ui/assets/dist-BaHut5iX.js +2 -0
  115. package/dist/ui/assets/dist-BqGwkOe5.js +225 -0
  116. package/dist/ui/assets/dist-ZnIgkoEi.js +4 -0
  117. package/dist/ui/assets/{dist-BHl1ZAVG.js → dist-l6uUFZMV.js} +2 -2
  118. package/dist/ui/assets/dist-pLLFUPO-.js +1 -0
  119. package/dist/ui/assets/{doc-s6H7T0IO.js → doc-Dr5K49bx.js} +28 -28
  120. package/dist/ui/assets/document-companion-BQk2kS0F.js +1 -0
  121. package/dist/ui/assets/document-import-QoM9UxJr.js +1 -0
  122. package/dist/ui/assets/docx-sXa1Rf41.js +2 -0
  123. package/dist/ui/assets/{epub-B98SgHBz.js → epub-RopMP0ec.js} +4 -4
  124. package/dist/ui/assets/{export-options-Bu-tI6og.js → export-options-f7PKjEBb.js} +1 -1
  125. package/dist/ui/assets/extract-UTAOG7LV-4WDRw1o4.js +1 -0
  126. package/dist/ui/assets/file-browser-c2tf4MIb.js +5 -0
  127. package/dist/ui/assets/html-BGVOMhkv.js +253 -0
  128. package/dist/ui/assets/icons-DWaUNQbT.js +1 -0
  129. package/dist/ui/assets/images-JLBFCDD4-6JitW0hD.js +1 -0
  130. package/dist/ui/assets/index-B8NcxqcR.css +1 -0
  131. package/dist/ui/assets/index-C0DYtvfg.js +34 -0
  132. package/dist/ui/assets/index-J8TOMdvV.js +2 -0
  133. package/dist/ui/assets/{infer-kCLH1C8z.js → infer-LEGOsu64.js} +2 -2
  134. package/dist/ui/assets/ironcalc-BAi5gOlE.js +3 -0
  135. package/dist/ui/assets/layouts-2A7QNF6Y-CVwP7noP.js +1 -0
  136. package/dist/ui/assets/{mail-link-CI6YD6k2.js → mail-link-DXkmCd5b.js} +1 -1
  137. package/dist/ui/assets/markdown-baseline-9B52XlX2.js +1 -0
  138. package/dist/ui/assets/{markdown-Bi9b5f5Y.js → markdown-ryKA_OmY.js} +1 -1
  139. package/dist/ui/assets/materialize-A34OZGEU-xNNKzytx.js +1 -0
  140. package/dist/ui/assets/model-inventory-ykSm_IT5.js +1 -0
  141. package/dist/ui/assets/{model-quantization-BDzrELN_.js → model-quantization-CLO7XLoF.js} +1 -1
  142. package/dist/ui/assets/{monaco-base-BiVSa1J-.js → monaco-base-B1H1U1Sw.js} +1 -1
  143. package/dist/ui/assets/{monaco-setup-UeltVkg_.js → monaco-setup-DjhrGQui.js} +1 -1
  144. package/dist/ui/assets/{new-project-meta-0xhggGA_.js → new-project-meta-_f9sfcRX.js} +1 -1
  145. package/dist/ui/assets/outside-in-D73N1g_b.js +3 -0
  146. package/dist/ui/assets/{pdf-DgTjy3rN.js → pdf-BOjVDlCK.js} +3 -3
  147. package/dist/ui/assets/{pending-drafts-YVW6X55O.js → pending-drafts-B11MKQ9R.js} +1 -1
  148. package/dist/ui/assets/{poppetje-Ce-02Aqi.js → poppetje-DLB8uevw.js} +2 -2
  149. package/dist/ui/assets/pptx-BuxyNxQh.js +6 -0
  150. package/dist/ui/assets/primitives-CWrGZpPI.js +41 -0
  151. package/dist/ui/assets/run-export-ChaMXrKS.js +23 -0
  152. package/dist/ui/assets/squisq-formats-aAdypXoy.js +1 -0
  153. package/dist/ui/assets/standalone-source-q_Zzd1bd.js +11 -0
  154. package/dist/ui/assets/storage-D8pE2zg0.js +1 -0
  155. package/dist/ui/assets/styles-BhnF3s2q.css +1 -0
  156. package/dist/ui/assets/styles-CKVKwqoQ.js +550 -0
  157. package/dist/ui/assets/table-fcouR4db.js +1 -0
  158. package/dist/ui/assets/{terminal-monaco-setup-DNoK2tN4.js → terminal-monaco-setup-BAzrVzeR.js} +1 -1
  159. package/dist/ui/assets/{useCompactLayout-BarJPYcv.js → useCompactLayout-Dtolvzye.js} +0 -0
  160. package/dist/ui/assets/{useCopilotAvailability-BH1nLXQI.js → useCopilotAvailability-3xZvKgTF.js} +1 -1
  161. package/dist/ui/assets/{useDiffpacks-CK8W_OD_.js → useDiffpacks-Dsnr0wtX.js} +1 -1
  162. package/dist/ui/assets/{useGitSync-DWxX5-7K.js → useGitSync-BCTptQsp.js} +1 -1
  163. package/dist/ui/assets/{useShowWorkInProgressFeatures-DwwviLRO.js → useShowWorkInProgressFeatures-BhDNuQiU.js} +1 -1
  164. package/dist/ui/assets/{useTotalRamBytes-WoN_mi-V.js → useTotalRamBytes-DIx-_pf8.js} +1 -1
  165. package/dist/ui/assets/wasm-DdxEDD2H.js +1 -0
  166. package/dist/ui/assets/wasm_bg-DW9Xt_vt.wasm +0 -0
  167. package/dist/ui/assets/xlsx-DyBGuAO1.js +4 -0
  168. package/dist/ui/index.html +19 -18
  169. package/package.json +11 -11
  170. package/dist/ui/assets/AmbientDashboardCard-C1Ee-FKZ.js +0 -1
  171. package/dist/ui/assets/CatalogBrowser-Bz8ZtxPn.js +0 -1
  172. package/dist/ui/assets/ChatTimelineView-Do9EryEH.js +0 -7
  173. package/dist/ui/assets/ConfirmDialog-BHFs6vmJ.js +0 -1
  174. package/dist/ui/assets/ConnectedAppsPanel-BtMayq0R.js +0 -1
  175. package/dist/ui/assets/CraftbookEditor-D5jTzWwF.js +0 -1
  176. package/dist/ui/assets/DocumentDetail-CPU51d04.js +0 -1
  177. package/dist/ui/assets/DocumentsView-B6OyjvJ0.js +0 -1
  178. package/dist/ui/assets/DropdownMenu-D5fCzIrh.js +0 -1
  179. package/dist/ui/assets/Ds4Settings-CrUM_KGP.js +0 -1
  180. package/dist/ui/assets/EmbeddedChat-ue9ia-WY.js +0 -1
  181. package/dist/ui/assets/FileMapView-CxvfDLGA.js +0 -1
  182. package/dist/ui/assets/GezelDetail-DHuqBK55.js +0 -1
  183. package/dist/ui/assets/HandboekView-CPnnyj29.js +0 -1
  184. package/dist/ui/assets/HistoryView-B4VAfEMe.js +0 -1
  185. package/dist/ui/assets/HomeView-ccH60J6f.js +0 -1
  186. package/dist/ui/assets/KnowledgeCatalogsCard-Bi5Rx9Iz.js +0 -1
  187. package/dist/ui/assets/KnowledgeView-DAwjwLZo.js +0 -1
  188. package/dist/ui/assets/LlamaCppSettings-Ceyk9pDP.js +0 -1
  189. package/dist/ui/assets/MemoriesTree-BKZEPJpm.js +0 -1
  190. package/dist/ui/assets/MlxSettings-CG3wfuc3.js +0 -1
  191. package/dist/ui/assets/ModelPicker-CCBVjLMS.js +0 -1
  192. package/dist/ui/assets/NewPathDialog-D4jnNBfP.js +0 -1
  193. package/dist/ui/assets/NewTaskDialog-Ox9D612Z.js +0 -2
  194. package/dist/ui/assets/ProjectChat-DMwKnkW-.js +0 -5
  195. package/dist/ui/assets/ProjectGitStatusBar-C6bkCSby.js +0 -1
  196. package/dist/ui/assets/ProjectOverviewView-NNwXd_QQ.js +0 -1
  197. package/dist/ui/assets/ProjectsView-SBPgYOq8.js +0 -7
  198. package/dist/ui/assets/ScriptEditorTabs-paocQ6dj.js +0 -2
  199. package/dist/ui/assets/ScriptEditorView-N9zSLqqi.js +0 -5
  200. package/dist/ui/assets/SessionSwitcher-C8te7YSe.js +0 -1
  201. package/dist/ui/assets/SettingsView-Brl4JQkW.js +0 -3
  202. package/dist/ui/assets/Tabs-BAY1Q79B.js +0 -1
  203. package/dist/ui/assets/TaskTabContent-CNPJ4DQj.js +0 -1
  204. package/dist/ui/assets/TasksView-DuMjFS8S.js +0 -1
  205. package/dist/ui/assets/ToolsetsEditor-BdxHnIBj.js +0 -8
  206. package/dist/ui/assets/TransformToolbarButton-CVg5nz36.js +0 -5
  207. package/dist/ui/assets/UnrecognizedModels-Cw9Ku_bW.js +0 -1
  208. package/dist/ui/assets/chat-thread-memory-CZGcwgGo.js +0 -1
  209. package/dist/ui/assets/chunk-6ECMNUIP-C1kohb1U.js +0 -15
  210. package/dist/ui/assets/chunk-AONELFLA-Cv2nS9ga.js +0 -1
  211. package/dist/ui/assets/chunk-IIQYS2YH-Dxg6MAfT.js +0 -1
  212. package/dist/ui/assets/chunk-MIKKUKOD-XIkmalSN.js +0 -31
  213. package/dist/ui/assets/chunk-NNJLSQPW-DJA6camf.js +0 -5
  214. package/dist/ui/assets/chunk-S5PCVMKU-DbCZ5AUH.js +0 -6
  215. package/dist/ui/assets/csv-xmd1_Aqd.js +0 -4
  216. package/dist/ui/assets/dist-BPx-FyRH.js +0 -222
  217. package/dist/ui/assets/dist-Bvo52IGx.js +0 -1
  218. package/dist/ui/assets/dist-D5aoNQwk.js +0 -2
  219. package/dist/ui/assets/docx-Cj4A9MhC.js +0 -2
  220. package/dist/ui/assets/extract-UTAOG7LV-C4b7ycaL.js +0 -1
  221. package/dist/ui/assets/file-browser-80qWoVju.js +0 -5
  222. package/dist/ui/assets/html-C9TlzI57.js +0 -253
  223. package/dist/ui/assets/icons-C9dD-bDi.js +0 -1
  224. package/dist/ui/assets/images-ESPQKVTW-D7SgdVJ_.js +0 -1
  225. package/dist/ui/assets/index-D1m4Wx8V.css +0 -1
  226. package/dist/ui/assets/index-DXWR4qW1.js +0 -34
  227. package/dist/ui/assets/layouts-2A7QNF6Y-De2t-YXl.js +0 -1
  228. package/dist/ui/assets/markdown-baseline-HMqF2ChK.js +0 -1
  229. package/dist/ui/assets/outside-in-BFVUUcLa.js +0 -3
  230. package/dist/ui/assets/pptx-6ChgUEf4.js +0 -6
  231. package/dist/ui/assets/primitives-DEsn1shf.js +0 -41
  232. package/dist/ui/assets/run-export-BrYhHj1O.js +0 -23
  233. package/dist/ui/assets/standalone-source-D6mbpa3h.js +0 -11
  234. package/dist/ui/assets/storage-fn4FCEVK.js +0 -1
  235. package/dist/ui/assets/styles-C0EoNJbk.css +0 -1
  236. package/dist/ui/assets/styles-CKr_yrbn.js +0 -541
  237. package/dist/ui/assets/xlsx-DH7sTb3W.js +0 -4
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,t as n}from"./jsx-runtime-CEpd2cAX.js";import{y as r}from"./primitives-DEsn1shf.js";import{A as i,Ot as a,P as o,X as s}from"./dist-BPx-FyRH.js";import{t as c}from"./api-BX5xXiFs.js";import{i as l,n as u}from"./styles-CKr_yrbn.js";import{H as d,ft as f}from"./index-DXWR4qW1.js";import{t as p}from"./MarkdownField-D-0Zw7gM.js";var m=e(t(),1),h=.05;function g(e){return Math.max(h,Math.min(12,e))}function _(e){return e<.45?`city`:e<1.3?`district`:`street`}function v(e,t){return(t-e.offsetX)*e.scale}function y(e,t){return(t-e.offsetY)*e.scale}function ee(e,t){return t/e.scale+e.offsetX}function b(e,t){return t/e.scale+e.offsetY}function te(e,t,n,r=32){if(e.w<=0||e.h<=0||t<=0||n<=0)return{scale:1,offsetX:0,offsetY:0};let i=g(Math.min((t-r*2)/e.w,(n-r*2)/e.h)),a=e.x+e.w/2,o=e.y+e.h/2;return{scale:i,offsetX:a-t/2/i,offsetY:o-n/2/i}}function ne(e,t,n,r){let i=g(e.scale*t);if(i===e.scale)return e;let a=ee(e,n),o=b(e,r);return{scale:i,offsetX:a-n/i,offsetY:o-r/i}}function x(e,t,n,r){let i=v(e,t.x),a=y(e,t.y),o=t.w*e.scale,s=t.h*e.scale;return i+o>=0&&a+s>=0&&i<=n&&a<=r}function S(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return t>>>0}function C(e){let t=e>>>0;return()=>{t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}function w(e){let t=0;for(let n=0;n<e.length;n++)t=(t*31+e.charCodeAt(n))%360;return t}var re={brick:{satMul:.9,litDelta:-4,hue:14,hueMix:.82},stucco:{satMul:.62,litDelta:6,hue:42,hueMix:.45},timber:{satMul:.7,litDelta:-2,hue:28,hueMix:.82},stone:{satMul:.34,litDelta:2,hue:40,hueMix:.78},slate:{satMul:.34,litDelta:-8,hue:220,hueMix:.4},tile:{satMul:.72,litDelta:-1,hue:18,hueMix:.5},thatch:{satMul:.5,litDelta:4,hue:44,hueMix:.7},glass:{satMul:.55,litDelta:10,hue:196,hueMix:.5},iron:{satMul:.35,litDelta:-10,hue:210,hueMix:.55}},T={village:[`timber`,`stucco`,`brick`,`stone`],town:[`brick`,`stucco`,`stone`],city:[`brick`,`stone`]},E={village:[`tile`,`slate`,`thatch`],town:[`tile`,`slate`],city:[`slate`,`tile`]};function D(e,t,n){let r=C(e),i=T[t],a=E[t],o=r();return{wall:t===`village`?o<.34?`timber`:o<.62?`stucco`:o<.88?`brick`:`stone`:i[Math.min(i.length-1,Math.floor(o*i.length))],roof:n?r()<.5?`iron`:`glass`:t===`village`?(e=>e<.5?`tile`:e<.9?`slate`:`thatch`)(r()):a[Math.min(a.length-1,Math.floor(r()*a.length))]}}function ie(e,t,n){let r=(t-e+540)%360-180;return r*=n,((e+r)%360+360)%360}var O=4;function ae(e,t){let n=re[t].litDelta,r=re[e].litDelta-n;return n+Math.max(-4,Math.min(O,r))}function k(e,t,n,r=re[t].litDelta){let i=re[t],a=i.hueMix*(1-Math.max(0,Math.min(1,n)));return{h:ie(e.h,i.hue,a),s:Math.max(0,Math.min(100,e.s*i.satMul)),l:Math.max(0,Math.min(100,e.l+r))}}function A({h:e,s:t,l:n}){return`hsl(${Math.round(e)} ${Math.round(t)}% ${Math.round(n)}%)`}function oe(e){return .38+-.2*Math.max(0,Math.min(1,e))}function se(e){return e?{dark:!0,ground:`hsl(150 10% 12%)`,districtFill:`hsl(228 8% 15%)`,districtStroke:`#34373f`,curb:`hsl(228 10% 28%)`,sidewalk:`hsl(228 7% 18%)`,districtLabel:`#8b8f99`,label:`#c9ccd4`,road:`#4a4d56`,roadMutual:`#6b7280`,blockStroke:`#15161a`,shadow:`rgba(0, 0, 0, 0.38)`,building:`#11141a`,buildingFacade:`#04060a`,earth:`hsl(35 20% 22%)`,rubble:`hsl(30 6% 30%)`,crane:`hsl(38 80% 55%)`,newBlock:`#3f7d4f`,tombstone:`#55504a`,selected:`#e0a062`,hover:`#9aa0ad`,domeAccent:`hsl(42 60% 55%)`,window:`hsl(214 24% 16%)`,windowLit:`hsl(41 72% 61%)`,masonry:`hsl(18 24% 28%)`,awning:`hsl(8 48% 48%)`,pavementAvenue:`hsl(228 8% 24%)`,pavementStreet:`hsl(228 8% 21%)`,pavementLane:`hsl(228 8% 18%)`,avenueDash:`hsl(45 45% 48%)`,labelPlate:`hsl(228 10% 10% / 0.85)`,labelPlateStroke:`hsl(228 10% 34%)`,hedge:`hsl(128 22% 22%)`,fence:`hsl(36 16% 38%)`,orchard:`hsl(120 18% 20%)`,dirtLane:`hsl(32 16% 20%)`,cobble:`hsl(226 7% 22%)`,stall:`hsl(12 42% 42%)`}:{dark:!1,ground:`hsl(80 24% 86%)`,districtFill:`hsl(46 28% 89%)`,districtStroke:`hsl(44 16% 76%)`,curb:`hsl(44 14% 70%)`,sidewalk:`hsl(46 24% 92%)`,districtLabel:`#7a715c`,label:`#473f30`,road:`#b3a98f`,roadMutual:`#8a7f64`,blockStroke:`#d8d0bd`,shadow:`rgba(70, 60, 35, 0.2)`,building:`#ffffff`,buildingFacade:`#d6cfbd`,earth:`hsl(36 35% 78%)`,rubble:`hsl(40 12% 72%)`,crane:`hsl(38 85% 55%)`,newBlock:`#7bb98a`,tombstone:`#c3bba9`,selected:`#c9722e`,hover:`#6f6651`,domeAccent:`hsl(42 65% 52%)`,window:`hsl(205 24% 39%)`,windowLit:`hsl(42 88% 70%)`,masonry:`hsl(18 26% 48%)`,awning:`hsl(8 52% 52%)`,pavementAvenue:`hsl(46 10% 72%)`,pavementStreet:`hsl(46 12% 78%)`,pavementLane:`hsl(46 14% 82%)`,avenueDash:`hsl(46 40% 94%)`,labelPlate:`hsl(46 30% 96% / 0.88)`,labelPlateStroke:`hsl(44 16% 72%)`,hedge:`hsl(122 26% 42%)`,fence:`hsl(38 20% 62%)`,orchard:`hsl(104 28% 68%)`,dirtLane:`hsl(34 24% 70%)`,cobble:`hsl(44 8% 74%)`,stall:`hsl(10 48% 58%)`}}function j(e,t){if(!e)return null;let n=Date.parse(e);if(Number.isNaN(n))return null;let r=Math.max(0,(t-n)/864e5);return r<=7?0:r<=30?1:r<=90?2:3}var M=[`hsl(28 92% 58%)`,`hsl(28 70% 46%)`,`hsl(28 42% 35%)`,`hsl(28 16% 27%)`],ce=[`hsl(28 92% 44%)`,`hsl(28 70% 34%)`,`hsl(28 42% 26%)`,`hsl(28 16% 20%)`],le=[`hsl(28 92% 68%)`,`hsl(28 70% 56%)`,`hsl(28 42% 44%)`,`hsl(28 16% 35%)`],N=[`hsl(28 95% 55%)`,`hsl(28 82% 66%)`,`hsl(28 55% 77%)`,`hsl(28 25% 86%)`],ue=[`hsl(28 95% 42%)`,`hsl(28 82% 52%)`,`hsl(28 55% 63%)`,`hsl(28 25% 72%)`],de=[`hsl(28 95% 66%)`,`hsl(28 82% 76%)`,`hsl(28 55% 85%)`,`hsl(28 25% 92%)`],fe={typescript:210,tsx:210,javascript:48,jsx:48,python:160,rust:20,go:190,css:280,html:15,markdown:90};function pe(e){let t=fe[e.toLowerCase()];return t===void 0?Math.round(w(e)/30)*30%360:t}function me(e,t,n){if(n!=null)return t.dark?{roof:M[n],facade:ce[n],edge:le[n]}:{roof:N[n],facade:ue[n],edge:de[n]};if(!e)return t.dark?{roof:`hsl(220 6% 40%)`,facade:`hsl(220 7% 27%)`,edge:`hsl(220 8% 50%)`}:{roof:`hsl(46 12% 72%)`,facade:`hsl(46 12% 56%)`,edge:`hsl(46 16% 82%)`};let r=pe(e);return t.dark?{roof:`hsl(${r} 34% 42%)`,facade:`hsl(${r} 36% 28%)`,edge:`hsl(${r} 40% 52%)`}:{roof:`hsl(${r} 48% 70%)`,facade:`hsl(${r} 42% 54%)`,edge:`hsl(${r} 55% 80%)`}}var he=5,ge=[`hsl(28 92% 37%)`,`hsl(28 70% 28%)`,`hsl(28 42% 21%)`,`hsl(28 16% 16%)`],_e=[`hsl(28 95% 35%)`,`hsl(28 82% 45%)`,`hsl(28 55% 56%)`,`hsl(28 25% 65%)`];function P(e,t,n,r){let i=me(e,t,n);if(n!=null){let e=t.dark?ge[n]:_e[n];return{top:i.roof,wallL:i.facade,wallR:e,edge:i.edge}}if(!e)return{top:i.roof,wallL:i.facade,wallR:t.dark?`hsl(220 7% 20%)`:`hsl(46 12% 46%)`,edge:i.edge};let a=pe(e);if(!r)return{top:i.roof,wallL:i.facade,wallR:t.dark?`hsl(${a} 36% 21%)`:`hsl(${a} 42% 44%)`,edge:i.edge};let o=t.dark?{top:34,wall:36,edge:40}:{top:48,wall:42,edge:55},s=t.dark?{top:42,wallL:28,wallR:21,edge:52}:{top:70,wallL:54,wallR:44,edge:80},c=oe(r.urbanity),l=ae(r.wall,r.roof),u=Math.max(-1,Math.min(1,r.variance??0))*he;return{top:A(k({h:a,s:o.top,l:s.top+u},r.roof,1)),wallL:A(k({h:a,s:o.wall,l:s.wallL+u},r.wall,c,l)),wallR:A(k({h:a,s:o.wall,l:s.wallR+u},r.wall,c,l)),edge:A(k({h:a,s:o.edge,l:s.edge+u},r.roof,1))}}function F(e){return e.urbanity??.5}function I(e){switch(e.settlement){case`hamlet`:case`village`:return`village`;case`city`:return`city`;default:return`town`}}var ve=new WeakMap;function L(e){let t=ve.get(e);if(t)return t;let n=new Map;for(let t of e.blocks){if(t.state===`tombstoned`||t.phantom)continue;let e=n.get(t.districtId)??{total:0,count:0};e.total+=F(t),e.count+=1,n.set(t.districtId,e)}let r=new Map;for(let[e,{total:t,count:i}]of n){let n=t/Math.max(1,i);r.set(e,n>=.74?`city`:n>=.52?`town`:`village`)}return ve.set(e,r),r}var R={kind:`none`,u0:0,v0:0,u1:0,v1:0,height:0,behind:!1},z={FACADE:2710517197,ROOF_FURNITURE:1640531527,MASSING:2654435769,MATERIAL:2246822507,TRIM:3266489909,GROUND:668265263},ye={village:{residential:[`cottage`,`cottage-row`,`farmhouse`],commercial:[`village-shop`,`smithy`,`market-cross`],civic:[`chapel`,`schoolhouse`,`parish-hall`],industrial:[`barn`,`mill`,`kiln`]},town:{residential:[`cottage`,`townhouse`,`boarding-house`],commercial:[`corner-shop`,`inn`,`market-hall`],civic:[`library`,`schoolhouse`,`guildhall`],industrial:[`workshop`,`rail-depot`,`foundry`]},city:{residential:[`terrace-house`,`tenement`,`mansion-flat`],commercial:[`shopfront-block`,`hotel`,`arcade`],civic:[`bank`,`institute`,`town-hall`],industrial:[`warehouse`,`works`,`terminus`]}},be={cornice:!1,parapet:!1,stringCourse:!1,quoins:!1};function xe(e,t,n,r=1){let i=e===`conical`?2.1:e===`pyramid`?1.35:1,a=Math.max(r,i);return n>0&&(a=Math.max(a,i+.68)),a=Math.max(a,i+({cupola:.78,bellcote:.62,"clock-tower":.78,finial:.4,lantern:.56}[t]??0)),a}function Se(e,t,n,r){let i=D(e^z.MATERIAL,t,n);return r===`thatch`?i.roof=`thatch`:r===`conical`?i.roof=`brick`:r===`barrel`&&(i.roof=`glass`),i}var Ce={cottage:{roofs:[`gable`],eaves:`gable`,ground:`plain`,cap:`none`,trim:{}},"cottage-row":{roofs:[`thatch`,`gable`],eaves:`eave`,ground:`plain`,cap:`none`,trim:{}},farmhouse:{roofs:[`catslide`,`half-hip`],eaves:`gable`,ground:`plain`,cap:`finial`,trim:{}},"village-shop":{roofs:[`gable`,`catslide`],eaves:`gable`,ground:`shopfront`,cap:`none`,trim:{}},smithy:{roofs:[`shed`,`catslide`],eaves:`eave`,ground:`cart-door`,cap:`none`,trim:{}},"market-cross":{roofs:[`pyramid`],eaves:`gable`,ground:`arcade`,cap:`finial`,trim:{}},chapel:{roofs:[`gable`],eaves:`gable`,ground:`plain`,cap:`bellcote`,trim:{}},"parish-hall":{roofs:[`half-hip`,`gable`],eaves:`eave`,ground:`plain`,cap:`none`,trim:{}},barn:{roofs:[`gable`,`catslide`],eaves:`gable`,ground:`cart-door`,cap:`none`,trim:{}},mill:{roofs:[`monitor`,`gable`],eaves:`eave`,ground:`cart-door`,cap:`none`,trim:{}},kiln:{roofs:[`conical`],eaves:`gable`,ground:`cart-door`,cap:`none`,trim:{},roofFactor:1.6},"boarding-house":{roofs:[`hip`,`mansard`],eaves:`eave`,ground:`plain`,cap:`none`,trim:{cornice:!0}},townhouse:{roofs:[`mansard`,`gable`],eaves:`eave`,ground:`plain`,cap:`none`,trim:{cornice:!0,stringCourse:!0}},"corner-shop":{roofs:[`mansard`,`gable`],eaves:`eave`,ground:`shopfront`,cap:`none`,trim:{cornice:!0}},"market-hall":{roofs:[`gable`,`hip`],eaves:`eave`,ground:`arcade`,cap:`none`,trim:{cornice:!0}},inn:{roofs:[`hip`,`mansard`],eaves:`eave`,ground:`shopfront`,cap:`none`,trim:{cornice:!0}},guildhall:{roofs:[`hip`,`mansard`],eaves:`eave`,ground:`portico`,cap:`cupola`,trim:{cornice:!0,quoins:!0}},library:{roofs:[`hip`,`mansard`],eaves:`eave`,ground:`portico`,cap:`cupola`,trim:{cornice:!0,quoins:!0}},schoolhouse:{roofs:[`gable`],eaves:`gable`,ground:`plain`,cap:`bellcote`,trim:{}},foundry:{roofs:[`sawtooth`],eaves:`eave`,ground:`cart-door`,cap:`none`,trim:{}},"rail-depot":{roofs:[`gable`],eaves:`eave`,ground:`arcade`,cap:`none`,trim:{}},workshop:{roofs:[`sawtooth`],eaves:`eave`,ground:`cart-door`,cap:`none`,trim:{}},"terrace-house":{roofs:[`parapet`,`mansard`],eaves:`eave`,ground:`plain`,cap:`none`,trim:{cornice:!0,parapet:!0,stringCourse:!0}},tenement:{roofs:[`mansard`,`parapet`],eaves:`eave`,ground:`plain`,cap:`none`,trim:{cornice:!0,stringCourse:!0}},"mansion-flat":{roofs:[`mansard`,`hip`],eaves:`eave`,ground:`plain`,cap:`none`,trim:{cornice:!0,stringCourse:!0,quoins:!0}},"shopfront-block":{roofs:[`parapet`,`mansard`],eaves:`eave`,ground:`shopfront`,cap:`none`,trim:{cornice:!0,parapet:!0,stringCourse:!0}},hotel:{roofs:[`mansard`,`hip`],eaves:`eave`,ground:`shopfront`,cap:`lantern`,trim:{cornice:!0,stringCourse:!0,quoins:!0},roofFactor:1.3},arcade:{roofs:[`barrel`,`monitor`],eaves:`eave`,ground:`arcade`,cap:`none`,trim:{cornice:!0,parapet:!0}},bank:{roofs:[`parapet`,`hip`],eaves:`eave`,ground:`portico`,cap:`none`,trim:{cornice:!0,parapet:!0,quoins:!0}},institute:{roofs:[`hip`,`parapet`],eaves:`eave`,ground:`portico`,cap:`cupola`,trim:{cornice:!0,quoins:!0}},"town-hall":{roofs:[`hip`,`mansard`],eaves:`eave`,ground:`portico`,cap:`clock-tower`,trim:{cornice:!0,quoins:!0,stringCourse:!0},roofFactor:1.6},warehouse:{roofs:[`monitor`,`gable`],eaves:`eave`,ground:`cart-door`,cap:`none`,trim:{cornice:!0,parapet:!0}},works:{roofs:[`sawtooth`],eaves:`eave`,ground:`cart-door`,cap:`none`,trim:{parapet:!0}},terminus:{roofs:[`barrel`,`monitor`],eaves:`eave`,ground:`arcade`,cap:`none`,trim:{cornice:!0,parapet:!0}}},we={farmhouse:`ell`,"parish-hall":`ell`,barn:`ell`,mill:`ell`,smithy:`ell`,guildhall:`ell`,library:`ell`,inn:`ell`,"rail-depot":`ell`,"mansion-flat":`setback`,tenement:`setback`,hotel:`setback`,bank:`setback`,institute:`setback`,"town-hall":`setback`,warehouse:`setback`};function Te(e,t,n){let r=we[e];if(!r)return R;let i=C(t^z.MASSING);if(r===`setback`)return n<3?R:{kind:r,u0:.12,v0:.12,u1:.88,v1:.88,height:1.22,behind:!1};let a=Math.floor(i()*4),o=.46+i()*.12,s=a===0||a===3;return{kind:r,...a===0?{u0:.04,v0:.04,u1:.04+o,v1:.52}:a===1?{u0:.96-o,v0:.04,u1:.96,v1:.52}:a===2?{u0:.96-o,v0:.48,u1:.96,v1:.96}:{u0:.04,v0:.48,u1:.04+o,v1:.96},height:n<=1?.72:(n-1)/n,behind:s}}function Ee(e,t){return e[Math.min(e.length-1,Math.floor(t()*e.length))]}function De(e,t){let{w:n,h:r}=e.rect;return n>r*1.18?`x`:r>n*1.18?`y`:t()<.5?`x`:`y`}function Oe(e,t){let n=Ce[e].roofs;return n.length===1||t()<ke[e]?n[0]:n[1]}var ke={townhouse:.55,"corner-shop":.55,"boarding-house":.7,inn:.7,library:.7,guildhall:.7,"market-hall":.65,"cottage-row":.6,farmhouse:.55,"village-shop":.65,smithy:.6,"parish-hall":.6,barn:.7,mill:.6,"terrace-house":.6,tenement:.55,"mansion-flat":.6,"shopfront-block":.65,hotel:.6,arcade:.7,bank:.6,institute:.6,"town-hall":.6,warehouse:.6,terminus:.65};function Ae(e){return/(?:^|[/_.-])(?:test|tests|spec|specs)(?:[/_.-]|$)/i.test(e)}var je={village:`parish-hall`,town:`guildhall`,city:`town-hall`};function Me(e){let t=S(`town-1910:v1:${e.id}`),n=C(t),r=e.health?.zone??`residential`,i=I(e),a=ye[i],o;o=e.landmark?je[i]:Ae(e.id)&&r!==`industrial`?`schoolhouse`:Ee(a[r],n);let s=Math.max(1,Math.min(5,e.levels??1)),c=Math.ceil(Math.sqrt(Math.max(1,e.buildingCount))),l=Math.max(1,Math.min(5,c+ +(n()<.45))),u=r===`industrial`,d=r===`commercial`,f=r===`civic`||e.landmark===!0,p=e.health?.churn??0,m=Oe(o,n),h=De(e,n),g=Ce[o],_=i===`city`?Math.max(1,Math.min(6,Math.round(l*1.4))):i===`village`?Math.min(3,l):l,v=u?1+Math.min(2,Math.floor(p/8)+ +(n()<.5)):o===`cottage`||o===`inn`||o===`boarding-house`||i===`village`&&!f?1+ +(n()<.25):0,y=f&&(e.landmark===!0||n()<.5),ee=g.cap===`cupola`&&!y?`none`:g.cap,b=v===0&&i===`city`&&!u&&s>=3?Math.max(1,Math.min(3,Math.floor(_/2))):v,te=xe(m,ee,b,g.roofFactor);return{archetype:o,roof:m,ridge:h,storeys:s,bays:_,chimneys:b,dormers:m===`mansard`||m===`gable`&&s>=3?Math.min(3,Math.max(1,Math.floor(_/2))):0,awning:d&&o!==`market-hall`,cupola:y,clock:e.landmark===!0,sawteeth:m===`sawtooth`?Math.max(2,Math.min(5,_)):0,seed:t,band:i,eaves:g.eaves,ground:g.ground,cap:ee,trim:{...be,...g.trim},material:Se(t,i,u,m),massing:Te(o,t,s),...te===1?{}:{roofFactor:te}}}function Ne(e,t){let n=S(`town-1910:symbol:v1:${e.id}`),r=C(n),i=e.kind.toLowerCase(),a=/class|interface|struct|enum|trait|type/.test(i),o=/module|namespace|package/.test(i),s=t.health?.zone===`industrial`,c=I(t),l=s?`industrial`:o?`civic`:a?`residential`:`commercial`,u=ye[c][l],d=e.height<.4?0:e.height<.72?1:2,f=u[Math.min(u.length-1,d)],p=Oe(f,r),m=Math.max(1,Math.min(3,1+Math.round(e.height*2))),h=Math.max(1,Math.min(3,Math.ceil(Math.sqrt(Math.max(1,e.lines??1))/3))),g=Ce[f],_=g.cap===`clock-tower`?`cupola`:g.cap,v=De(e,r),y=s||f===`cottage`||f===`farmhouse`||f===`inn`?1+ +(r()<.3):0,ee=p===`sawtooth`?2+ +(r()<.4):0,b=xe(p,_,y,g.roofFactor);return{archetype:f,roof:p,ridge:v,storeys:m,bays:h,chimneys:y,dormers:+(p===`mansard`&&e.height>.55),awning:t.health?.zone===`commercial`&&!a,cupola:_===`cupola`,clock:!1,sawteeth:ee,seed:n,band:c,eaves:g.eaves,ground:g.ground,cap:_,trim:{...be,...g.trim},material:Se(n,c,s,p),massing:R,...b===1?{}:{roofFactor:b}}}function Pe(e){return e.archetype.replace(/-/g,` `)}function Fe(e){return`${e.band} ${Pe(e)}`}var Ie=new WeakMap;function Le(e){let t=Ie.get(e);if(t)return t;let n=new Map;for(let t of e.blocks)t.state!==`tombstoned`&&n.set(t.id,Me(t));return Ie.set(e,n),n}function Re(e,t){let n=Le(e).get(t.id);if(n)return n;let r=Me(t);return Le(e).set(t.id,r),r}function B(e,t){return{x:v(e,t.x),y:y(e,t.y),w:t.w*e.scale,h:t.h*e.scale}}function V(e,t,n,r,i,a){let o=Math.max(0,Math.min(a,r/2,i/2));e.beginPath(),e.moveTo(t+o,n),e.arcTo(t+r,n,t+r,n+i,o),e.arcTo(t+r,n+i,t,n+i,o),e.arcTo(t,n+i,t,n,o),e.arcTo(t,n,t+r,n,o),e.closePath()}var ze=new Map;function Be(e,t){let n=ze.get(t);if(n!==void 0)return n;let r=null;try{let n=document.createElement(`canvas`);n.width=8,n.height=8;let i=n.getContext(`2d`);i&&(i.strokeStyle=t,i.lineWidth=1.2,i.beginPath(),i.moveTo(-2,10),i.lineTo(10,-2),i.stroke(),r=e.createPattern(n,`repeat`)??null)}catch{r=null}return ze.set(t,r),r}var Ve=1.5,He=2.5,Ue=6;function We(e,t){return e.tier===`street`&&t.buildingCount>0}function Ge(e,t){let n=t.palette,r=t.now??Date.now(),i=[];for(let e of t.model.blocks)x(t.cam,e.rect,t.viewW,t.viewH)&&i.push({b:e,r:B(t.cam,e.rect),age:t.ageLens?j(e.lastTouchedAt??e.placedAt,r):void 0});if(t.tier!==`city`&&!t.ageLens)for(let n of i)Ke(e,t,n);if(t.tier!==`city`){e.fillStyle=n.shadow;for(let{b:n,r}of i)n.state!==`live`&&!t.ageLens||n.phantom||r.w<Ue||We(t,n)||(V(e,r.x+Ve,r.y+He,r.w,r.h,Math.min(3,r.w/6)),e.fill())}for(let n of i)Je(e,t,n)}function Ke(e,t,n){let{b:r}=n,i=t.palette;if(r.state!==`live`||r.phantom||!r.lot||!r.health)return;let a=B(t.cam,r.lot);if(a.w<10)return;qe(e,t,r,a);let{vibe:o,zone:s,maxSeverity:c}=r.health;s===`civic`?(e.fillStyle=i.sidewalk,V(e,a.x,a.y,a.w,a.h,3),e.fill(),e.strokeStyle=i.domeAccent,e.globalAlpha=.55,e.lineWidth=1,V(e,a.x+1.5,a.y+1.5,a.w-3,a.h-3,2),e.stroke(),e.globalAlpha=1):(o===`scruffy`||o===`blighted`)&&(e.fillStyle=i.earth,e.globalAlpha=o===`blighted`?.45:.3,V(e,a.x,a.y,a.w,a.h,3),e.fill(),e.globalAlpha=1,o===`blighted`&&c===`critical`&&(e.strokeStyle=i.crane,e.globalAlpha=.8,e.lineWidth=1,V(e,a.x,a.y,a.w,a.h,3),e.stroke(),e.globalAlpha=1))}function qe(e,t,n,r){let i=t.palette,a=F(n);e.globalAlpha=.4,e.fillStyle=a<.25?i.orchard:a<.5?i.ground:i.sidewalk,V(e,r.x,r.y,r.w,r.h,3),e.fill(),e.globalAlpha=1;let o=I(n);if(!(o===`city`&&a>.78)){if(o===`village`){e.strokeStyle=i.hedge,e.lineWidth=1.6,e.lineCap=`round`,e.beginPath();for(let[t,n,i,a]of[[r.x,r.y,r.x+r.w,r.y],[r.x+r.w,r.y,r.x+r.w,r.y+r.h],[r.x+r.w,r.y+r.h,r.x,r.y+r.h],[r.x,r.y+r.h,r.x,r.y]]){let r=Math.max(1,Math.floor(Math.hypot(i-t,a-n)/5));for(let o=0;o<r;o++){let s=(o+.15)/r,c=(o+.85)/r;e.moveTo(t+(i-t)*s,n+(a-n)*s),e.lineTo(t+(i-t)*c,n+(a-n)*c)}}e.stroke(),e.lineCap=`butt`;return}e.strokeStyle=o===`town`?i.fence:i.curb,e.lineWidth=1,o===`town`&&e.setLineDash([2,2]),V(e,r.x,r.y,r.w,r.h,3),e.stroke(),e.setLineDash([])}}function Je(e,t,n){let{b:r,r:i,age:a}=n,o=t.palette;if(r.state===`tombstoned`){Ze(e,t,n);return}if(r.phantom){$e(e,t,n);return}if(r.state===`new`&&!t.ageLens){Qe(e,t,n);return}let s=me(r.lang,o,a),c=Math.min(3,i.w/6);if(t.tier===`city`||i.w<Ue){e.fillStyle=s.roof,V(e,i.x,i.y,i.w,i.h,c),e.fill(),i.w>3&&(e.strokeStyle=o.blockStroke,e.lineWidth=.5,V(e,i.x,i.y,i.w,i.h,c),e.stroke());return}if(We(t,r)){e.fillStyle=o.sidewalk,V(e,i.x,i.y,i.w,i.h,c),e.fill(),e.fillStyle=s.roof,e.globalAlpha=.28,V(e,i.x,i.y,i.w,i.h,c),e.fill(),e.globalAlpha=1,e.strokeStyle=o.blockStroke,e.lineWidth=.5,V(e,i.x,i.y,i.w,i.h,c),e.stroke();return}let l=Math.min(Math.max(2,Math.sqrt(Math.max(1,r.weight))*.15*t.cam.scale),8,i.h*.35);e.fillStyle=s.facade,V(e,i.x,i.y,i.w,i.h,c),e.fill(),e.fillStyle=s.roof,V(e,i.x,i.y,i.w,i.h-l,c),e.fill(),e.strokeStyle=s.edge,e.lineWidth=1,e.beginPath(),e.moveTo(i.x+c,i.y+.5),e.lineTo(i.x+i.w-c,i.y+.5),e.stroke(),t.ageLens||Ye(e,t,n,i.h-l,s,Re(t.model,r))}function Ye(e,t,n,r,i,a){let{r:o}=n;if(a.roof===`sawtooth`&&r>=12){Xe(e,t,n,r,i.facade,i.edge);return}if(o.w<14||r<10)return;let s=a.ridge===`x`?o.w>=r:o.w<r,c=o.x+o.w/2,l=o.y+r/2,u=(t,n,r,a,o=1)=>{e.strokeStyle=i.edge,e.lineWidth=o,e.beginPath(),e.moveTo(t,n),e.lineTo(r,a),e.stroke()},d=t=>{e.globalAlpha=.22,s?(e.fillStyle=i.edge,e.fillRect(o.x+1,o.y+1,o.w-2,r*t-1),e.fillStyle=i.facade,e.fillRect(o.x+1,o.y+r*t,o.w-2,r*(1-t)-1)):(e.fillStyle=i.edge,e.fillRect(o.x+1,o.y+1,o.w*t-1,r-2),e.fillStyle=i.facade,e.fillRect(o.x+o.w*t,o.y+1,o.w*(1-t)-1,r-2)),e.globalAlpha=1},f=(e=1)=>{let t=(1-e)/2;s?u(o.x+1+(o.w-2)*t,l,o.x+o.w-1-(o.w-2)*t,l):u(c,o.y+1+(r-2)*t,c,o.y+r-1-(r-2)*t)},p=e=>{let t=(1-e)/2,[n,i]=s?[{x:o.x+1+(o.w-2)*t,y:l},{x:o.x+o.w-1-(o.w-2)*t,y:l}]:[{x:c,y:o.y+1+(r-2)*t},{x:c,y:o.y+r-1-(r-2)*t}];u(n.x,n.y,o.x+1,o.y+1,.7),u(n.x,n.y,s?o.x+1:o.x+o.w-1,s?o.y+r-1:o.y+1,.7),u(i.x,i.y,o.x+o.w-1,o.y+r-1,.7),u(i.x,i.y,s?o.x+o.w-1:o.x+1,s?o.y+1:o.y+r-1,.7)},m=t=>{e.globalAlpha=.3,e.fillStyle=i.edge,e.fillRect(o.x+o.w*t,o.y+r*t,o.w*(1-t*2),r*(1-t*2)),e.globalAlpha=1};switch(a.roof){case`gable`:d(.5),f();break;case`catslide`:d(.34),s?u(o.x+1,o.y+r*.34,o.x+o.w-1,o.y+r*.34):u(o.x+o.w*.34,o.y+1,o.x+o.w*.34,o.y+r-1);break;case`thatch`:d(.5),f(.8),e.strokeStyle=i.facade,e.globalAlpha=.5,e.lineWidth=Math.max(2,Math.min(4,r*.16)),V(e,o.x+1.5,o.y+1.5,o.w-3,r-3,Math.min(r,o.w)/2),e.stroke(),e.globalAlpha=1;break;case`hip`:d(.5),f(.5),p(.5);break;case`half-hip`:d(.5),f(.76),p(.76);break;case`shed`:d(.82);break;case`mansard`:m(.24),p(.5);break;case`parapet`:e.strokeStyle=i.edge,e.lineWidth=1,e.strokeRect(o.x+1.5,o.y+1.5,o.w-3,r-3),m(.18);break;case`monitor`:{d(.5);let t=Math.max(2,r*.22);e.globalAlpha=.4,e.fillStyle=i.edge,s?e.fillRect(o.x+2,l-t/2,o.w-4,t):e.fillRect(c-t/2,o.y+2,t,r-4),e.globalAlpha=1,f();break}case`pyramid`:u(o.x+1,o.y+1,o.x+o.w-1,o.y+r-1,.8),u(o.x+o.w-1,o.y+1,o.x+1,o.y+r-1,.8);break;case`conical`:{let t=Math.min(o.w,r)*.42;e.strokeStyle=i.edge,e.lineWidth=.9;for(let n of[1,.45])e.beginPath(),e.arc(c,l,t*n,0,Math.PI*2),e.stroke();break}case`barrel`:e.strokeStyle=i.edge,e.lineWidth=.9,e.beginPath();for(let t of[.3,.5,.7])s?(e.moveTo(o.x+2,o.y+r*t),e.lineTo(o.x+o.w-2,o.y+r*t)):(e.moveTo(o.x+o.w*t,o.y+2),e.lineTo(o.x+o.w*t,o.y+r-2));e.stroke();break;default:d(.5),f();break}if(a.band===`city`&&a.bays>1&&o.w>=20){e.strokeStyle=i.facade,e.globalAlpha=.55,e.lineWidth=.7,e.beginPath();for(let t=1;t<Math.min(5,a.bays);t++){let n=t/a.bays;s?(e.moveTo(o.x+o.w*n,o.y+1),e.lineTo(o.x+o.w*n,o.y+r-1)):(e.moveTo(o.x+1,o.y+r*n),e.lineTo(o.x+o.w-1,o.y+r*n))}e.stroke(),e.globalAlpha=1}if(a.chimneys>0&&r>=12){e.fillStyle=t.palette.masonry;for(let t=0;t<Math.min(3,a.chimneys);t++){let n=a.chimneys===1?.5:.3+t/(a.chimneys-1)*.4,i=s?o.x+o.w*n:c,u=s?l:o.y+r*n;e.fillRect(i-1,u-1,2.2,2.2)}}if(a.cupola&&r>=12){let n=Math.min(o.w,r)*.16;e.fillStyle=t.palette.domeAccent,e.beginPath(),e.arc(c,l,n,0,Math.PI*2),e.fill(),e.strokeStyle=i.facade,e.lineWidth=1,e.stroke()}}function Xe(e,t,n,r,i,a){let{b:o,r:s}=n;e.fillStyle=i,e.globalAlpha=.3;for(let t=1;t<=3;t++){let n=s.y+r*t/4;e.fillRect(s.x+1,n,s.w-2,Math.max(1.5,r*.1))}e.globalAlpha=1;let c=C(S(o.id));e.fillStyle=a;for(let t=0;t<2;t++){let t=2+c()*2,n=s.x+2+c()*Math.max(1,s.w-t-4),i=s.y+2+c()*Math.max(1,r-t-4);e.fillRect(n,i,t,t)}}function Ze(e,t,n){let{b:r,r:i}=n,a=t.palette,o=Math.min(3,i.w/6);if(e.fillStyle=t.ageLens?a.tombstone:a.earth,e.globalAlpha=t.ageLens?.4:.7,V(e,i.x,i.y,i.w,i.h,o),e.fill(),e.globalAlpha=1,t.tier!==`city`&&i.w>=10&&!t.ageLens){let t=C(S(r.id)),n=4+Math.floor(t()*4);e.fillStyle=a.rubble;for(let r=0;r<n;r++){let n=Math.min(5,Math.max(1,(.06+.08*t())*Math.min(i.w,i.h))),r=i.x+i.w*(.12+.76*t()),a=i.y+i.h*(.12+.76*t());e.fillRect(r,a,n,n)}e.strokeStyle=a.blockStroke,e.globalAlpha=.6,e.setLineDash([3,3]),V(e,i.x,i.y,i.w,i.h,o),e.stroke(),e.setLineDash([]),e.globalAlpha=1}}function Qe(e,t,n){let{b:r,r:i}=n,a=t.palette,o=Math.min(3,i.w/6);if(t.tier===`city`||i.w<Ue){e.fillStyle=a.newBlock,V(e,i.x,i.y,i.w,i.h,o),e.fill();return}if(e.fillStyle=a.earth,V(e,i.x,i.y,i.w,i.h,o),e.fill(),e.strokeStyle=a.newBlock,e.lineWidth=1.5,e.setLineDash([4,3]),V(e,i.x,i.y,i.w,i.h,o),e.stroke(),e.setLineDash([]),t.tier===`street`&&i.w>=14){let t=C(S(r.id)),n=i.x+i.w*(.25+.5*t()),o=i.y+i.h*.85,s=i.y+i.h*.2,c=i.w*.4*(t()<.5?-1:1);e.strokeStyle=a.crane,e.lineWidth=1.5,e.beginPath(),e.moveTo(n,o),e.lineTo(n,s),e.lineTo(n+c,s),e.moveTo(n+c*.8,s),e.lineTo(n+c*.8,s+i.h*.15),e.stroke()}}function $e(e,t,n){let{b:r,r:i}=n,a=t.palette,o=Math.min(3,i.w/6);e.fillStyle=me(r.lang,a).roof,e.globalAlpha=.25,V(e,i.x,i.y,i.w,i.h,o),e.fill(),e.globalAlpha=1;let s=Be(e,a.dark?`#8b8f99`:`#8a7f64`);s&&(e.fillStyle=s,V(e,i.x,i.y,i.w,i.h,o),e.fill()),e.strokeStyle=a.blockStroke,e.setLineDash([4,3]),V(e,i.x,i.y,i.w,i.h,o),e.stroke(),e.setLineDash([])}function et(e,t){let n=t.palette,r=(n,r,i)=>{let a=t.model.blocks.find(e=>e.id===n);if(!a||!x(t.cam,a.rect,t.viewW,t.viewH))return;let o=B(t.cam,a.rect);e.strokeStyle=r,e.lineWidth=i,V(e,o.x,o.y,o.w,o.h,Math.min(3,o.w/6)),e.stroke()};t.hoverId&&t.hoverId!==t.selectedId&&r(t.hoverId,n.hover,1.5),t.selectedId&&r(t.selectedId,n.selected,2)}function tt(e,t){if(t.tier!==`street`)return;let n=t.palette;for(let r of t.model.buildings){if(!x(t.cam,r.rect,t.viewW,t.viewH))continue;let i=B(t.cam,r.rect);if(i.w<1.5||i.h<1.5)continue;if(i.w<4||i.h<6){e.fillStyle=n.building,e.globalAlpha=.35+.55*r.height,e.fillRect(i.x,i.y,i.w,i.h);continue}let a=Math.min(Math.max(1.5,r.height*.35*i.h),6);e.globalAlpha=.5+.45*r.height,e.fillStyle=n.buildingFacade,e.fillRect(i.x,i.y,i.w,i.h),e.fillStyle=n.building,e.fillRect(i.x,i.y,i.w,i.h-a);let o=i.h-a;if(i.w>10&&o>8){let t=C(S(r.id));if(r.kind===`class`||r.kind===`interface`||r.kind===`struct`){e.strokeStyle=n.buildingFacade,e.lineWidth=1;let r=i.y+o*(.35+.3*t());e.beginPath(),e.moveTo(i.x+1,r),e.lineTo(i.x+i.w-1,r),e.stroke()}else if(r.kind===`function`||r.kind===`method`){let r=1+ +(t()<.4);e.fillStyle=n.buildingFacade;for(let n=0;n<r;n++){let n=2+t()*2,r=i.x+2+t()*Math.max(1,i.w-n-4),a=i.y+2+t()*Math.max(1,o-n-4);e.fillRect(r,a,n,n)}}}}e.globalAlpha=1}var nt=[`tree1`,`tree2`,`tree3`];function rt(e){let t=e.lot;if(!t||e.phantom||e.state===`tombstoned`)return[];let n=e.health?.vibe??`plain`;if(n===`plain`)return[];let r=C(S(e.id)),i=e.rect,a=[],o=()=>{let e=r(),n=t.x+1+r()*Math.max(.5,t.w-2),a=t.y+1+r()*Math.max(.5,t.h-2);return e<.45?{x:n,y:(i.y+i.h+t.y+t.h)/2}:e<.6?{x:n,y:(t.y+i.y)/2}:e<.8?{x:(t.x+i.x)/2,y:a}:{x:(i.x+i.w+t.x+t.w)/2,y:a}},s=(e,t,n)=>{let{x:i,y:s}=o();a.push({sprite:e,x:i,y:s,size:t+r()*(n-t)})},c=()=>s(nt[Math.floor(r()*nt.length)],2.2,3.4);switch(n){case`lush`:{let e=3+Math.floor(r()*3);for(let t=0;t<e;t++)c();let t=1+ +(r()<.5);for(let e=0;e<t;e++)s(`shrub`,1.5,2.2);break}case`tidy`:{let e=1+ +(r()<.5);for(let t=0;t<e;t++)c();break}case`scruffy`:{s(`dryPatch`,2.5,4);let e=1+ +(r()<.5);for(let t=0;t<e;t++)s(`weed`,1.6,2.4);break}case`blighted`:{s(`dryPatch`,2.5,4),s(`deadTree`,2.6,3.6);let e=1+ +(r()<.5);for(let t=0;t<e;t++)s(`weed`,1.6,2.4);break}}return a}var it=new WeakMap;function at(e){let t=it.get(e);if(t)return t;let n=new Map;for(let t of e.blocks){let e=rt(t);e.length&&n.set(t.id,e)}return it.set(e,n),n}var ot=3e3,st=6e3,ct=14;function lt(e,t,n){if(!n||t.tier===`city`||t.ageLens||t.tier===`district`&&t.model.blocks.length>st)return;let r=at(t.model);if(r.size===0)return;let i=ot;for(let a of t.model.blocks){let o=r.get(a.id);if(!o||o.length===0)continue;let s=a.lot??a.rect;if(x(t.cam,s,t.viewW,t.viewH)&&!(t.tier===`district`&&s.w*t.cam.scale<=ct))for(let r of o){let a=r.size*t.cam.scale;if(a<2.5)continue;if(i--<=0)return;let o=n.index[r.sprite]*n.cell;e.drawImage(n.canvas,o,0,n.cell,n.cell,v(t.cam,r.x)-a/2,y(t.cam,r.y)-a/2,a,a)}}}function ut(e,t){let{model:n,palette:r,viewW:i,viewH:a}=t;e.fillStyle=r.ground,e.fillRect(0,0,i,a);let o=new Set;for(let e of n.districts)e.parentId&&o.add(e.parentId);dt(e,t,o),ft(e,t),pt(e,t,o)}function dt(e,t,n){let{cam:r,model:i,palette:a,viewW:o,viewH:s}=t;e.fillStyle=a.districtFill;for(let t of i.districts){if(n.has(t.id)||!x(r,t.rect,o,s))continue;let{x:i,y:a,w:c,h:l}=B(r,t.rect);c<6||l<6||(e.globalAlpha=.9,V(e,i,a,c,l,6),e.fill())}e.globalAlpha=1}function ft(e,t){let{cam:n,model:r,palette:i,viewW:a,viewH:o}=t,s=r.streets;if(!s||s.length===0)return;let c=[i.pavementAvenue,i.pavementStreet,i.pavementLane,i.pavementLane];for(let r=0;r<4&&!(t.tier===`city`&&r>1);r++){e.fillStyle=c[r];for(let t of s){if(t.tier!==r||!x(n,t.rect,a,o))continue;let i=B(n,t.rect);e.fillRect(i.x,i.y,i.w,i.h)}}if(t.tier!==`city`){e.strokeStyle=i.avenueDash,e.lineWidth=Math.max(1,Math.min(2,.8*n.scale)),e.setLineDash([6*n.scale,6*n.scale]),e.beginPath();for(let t of s){if(t.tier!==0||!x(n,t.rect,a,o))continue;let r=B(n,t.rect);if(r.w>=r.h){let t=r.y+r.h/2;e.moveTo(r.x+2,t),e.lineTo(r.x+r.w-2,t)}else{let t=r.x+r.w/2;e.moveTo(t,r.y+2),e.lineTo(t,r.y+r.h-2)}}e.stroke(),e.setLineDash([])}}function pt(e,t,n){let{cam:r,model:i,palette:a,tier:o,viewW:s,viewH:c}=t;for(let t of i.districts){if(!x(r,t.rect,s,c))continue;let{x:i,y:l,w:u,h:d}=B(r,t.rect);u<6||d<6||(n.has(t.id)?(e.strokeStyle=a.districtStroke,e.lineWidth=Math.max(.5,Math.min(2,3-t.depth*.4)),V(e,i,l,u,d,6),e.stroke()):(o!==`city`&&u>18&&d>18&&(e.strokeStyle=a.sidewalk,e.lineWidth=3,V(e,i+2,l+2,u-4,d-4,5),e.stroke()),e.strokeStyle=a.curb,e.lineWidth=1,V(e,i,l,u,d,6),e.stroke()))}}var mt={info:.78,low:.86,medium:.96,high:1.08,critical:1.18};function ht(e){let t=Math.max(0,Math.log2(Math.max(1,e)))*.52;return .82+Math.min(1.25,t)}function gt(e){let t=e.health?.findings??0;if(e.state!==`live`||e.phantom||t<=0)return null;let n=e.health?.maxSeverity??`info`;return{findings:t,severity:n,flameCount:Math.min(3,1+Math.floor(Math.log2(t))),smokeCount:Math.min(7,3+Math.floor(Math.log2(t+1))),scale:mt[n]+Math.min(.22,Math.log2(t)*.07),severe:n===`critical`||n===`high`}}function _t(e){let t=null,n=-1;for(let r of e){let e=r.lines??r.height*1e3;e>n&&(t=r,n=e)}return t}function vt(e,t,n,r,i,a,o=1,s=0){let c=n.scale*o,l=C(S(`${a}:issue-marker`)),u=10*c,d=i+.5;e.save(),e.lineJoin=`round`,e.fillStyle=t.districtLabel;for(let t=n.smokeCount-1;t>=0;t--){let t=l(),i=bt(s*(16e-5+l()*55e-6)+t),a=(2.1+i*2.7+l()*.45)*c,o=(l()-.5)*4.5*c,f=Math.sin(s*.00125+t*Math.PI*2)*(1.4+i*3.2)*c,p=r+o+f,m=d-u-(3.5+i*22)*c,h=Math.sin(i*Math.PI),g=(n.severe?.38:.3)*h,_=l()*Math.PI*2;for(let t=0;t<3;t++){let n=_+t*Math.PI*2/3,r=a*(.62+l()*.15);e.globalAlpha=g*(.78+t*.08),e.beginPath(),e.arc(p+Math.cos(n)*a*.42,m+Math.sin(n)*a*.3,r,0,Math.PI*2),e.fill()}}let f=4.2*c;for(let i=0;i<n.flameCount;i++){let a=r+(i-(n.flameCount-1)/2)*f+(l()-.5)*1.3*c,o=l()*Math.PI*2,p=.008+l()*.005,m=Math.sin(s*p+o),h=Math.sin(s*p*1.9+o*.7),g=u*(.82+l()*.18+m*.1),_=(3.3+l()*1.1)*c,v=(m*.34+h*.14)*_;e.globalAlpha=n.severe?.96:.86,e.fillStyle=t.awning,yt(e,a,d,_,g,v),e.fill(),e.globalAlpha=.96,e.fillStyle=t.crane,yt(e,a,d-.25*c,_*.66,g*.72,v*.68),e.fill(),e.globalAlpha=.98,e.fillStyle=t.windowLit,yt(e,a,d-.45*c,_*.34,g*.44,v*.42),e.fill()}e.restore()}function yt(e,t,n,r,i,a){e.beginPath(),e.moveTo(t-r/2,n),e.bezierCurveTo(t-r*.62,n-i*.35,t-r*.16+a*.3,n-i*.7,t+a,n-i),e.bezierCurveTo(t+r*.15+a*.35,n-i*.62,t+r*.62,n-i*.3,t+r/2,n),e.closePath()}function bt(e){return e-Math.floor(e)}function xt(e,t){if(t.tier===`city`||t.ageLens)return;let n=new Map;if(t.tier===`street`)for(let e of t.model.buildings){let t=n.get(e.blockId);t?t.push(e):n.set(e.blockId,[e])}for(let r of t.model.blocks){if(!x(t.cam,r.rect,t.viewW,t.viewH))continue;let i=gt(r);if(!i)continue;let a=_t(n.get(r.id)??[]),o=B(t.cam,a?.rect??r.rect);vt(e,t.palette,i,o.x+o.w/2,o.y,r.id,ht(t.cam.scale),t.animationTime??0)}}function St(e,t){let{cam:n,model:r,palette:i,viewW:a,viewH:o}=t,s=r.districts.some(e=>e.displayLabel!==void 0);for(let t of r.districts){if(s&&t.displayLabel===void 0||!x(n,t.rect,a,o))continue;let{x:r,y:c,w:l,h:u}=B(n,t.rect);if(l<=60||u<=24)continue;let d=t.displayLabel??t.label;if(e.fillStyle=i.districtLabel,e.font=`${t.depth<=1?13:11}px ui-sans-serif, system-ui, sans-serif`,e.textBaseline=`top`,t.labelPlate){let r=B(n,t.labelPlate);e.fillText(d,r.x+2,r.y+1,Math.max(20,r.w))}else e.fillText(d,r+6,c+5,l-12)}if(t.tier===`street`){e.fillStyle=i.label,e.font=`11px ui-sans-serif, system-ui, sans-serif`,e.textBaseline=`bottom`;for(let t of r.blocks){if(t.state===`tombstoned`)continue;let r=t.rect.w*n.scale;if(r<44||!x(n,t.rect,a,o))continue;let{x:i,y:s}=B(n,t.rect);e.fillText(t.label,i+2,s-2,r)}}}var Ct={added:`#3fb950`,modified:`#d29922`,deleted:`#f85149`,renamed:`#a371f7`},wt=`#58a6ff`;function Tt(e,t){let{cam:n,model:r,palette:i,viewW:a,viewH:o}=t;if(!r.overlay||r.overlay.changedBlocks.length===0)return;let s=new Map(r.overlay.changedBlocks.map(e=>[e.blockId,e])),c=t.affectedIds,l=new Map(r.blocks.map(e=>[e.id,e]));if(e.fillStyle=i.ground,e.globalAlpha=.62,e.fillRect(0,0,a,o),e.globalAlpha=1,c&&c.size>0)for(let t of c){if(s.has(t))continue;let r=l.get(t);if(!r||!x(n,r.rect,a,o))continue;let i=B(n,r.rect),c=i.x,u=i.y,d=Math.max(3,i.w),f=Math.max(3,i.h),p=Math.min(3,d/6);e.fillStyle=wt,e.globalAlpha=.18,V(e,c,u,d,f,p),e.fill(),e.globalAlpha=.7,e.strokeStyle=wt,e.lineWidth=1,V(e,c,u,d,f,p),e.stroke(),e.globalAlpha=1}for(let t of r.blocks){let r=s.get(t.id);if(!r||!x(n,t.rect,a,o))continue;let i=Ct[r.change]??`#888888`,c=B(n,t.rect),l=c.x,u=c.y,d=Math.max(3,c.w),f=Math.max(3,c.h),p=Math.min(3,d/6);e.fillStyle=i,e.globalAlpha=t.phantom?.45:.85,V(e,l,u,d,f,p),e.fill(),e.globalAlpha=1,e.save(),e.shadowColor=i,e.shadowBlur=8,e.strokeStyle=i,e.lineWidth=2,t.phantom&&e.setLineDash([4,3]),V(e,l-1,u-1,d+2,f+2,p+1),e.stroke(),e.restore()}}var Et=[1,1.15,1.35,1.6],Dt=.5,Ot=6e3,kt=80,At=(e,t,n)=>e<t?t:e>n?n:e,jt=(e,t)=>`${Math.round(e*10)/10},${Math.round(t*10)/10}`,Mt=e=>({x:e.x+e.w/2,y:e.y+e.h/2}),Nt=e=>Et[e]??1,Pt=(e,t)=>e.axis===`h`?{x:t,y:e.line}:{x:e.line,y:t},Ft=20;function It(e){let t=e.streets;if(!t||t.length===0||t.length>Ot)return null;let n=[];for(let e of t){let{x:t,y:r,w:i,h:a}=e.rect;i>=a?n.push({axis:`h`,line:r+a/2,min:t,max:t+i,tier:e.tier}):n.push({axis:`v`,line:t+i/2,min:r,max:r+a,tier:e.tier})}let r=n.map(e=>new Set([e.min,e.max])),i=[],a=[];n.forEach((e,t)=>(e.axis===`h`?i:a).push(t));for(let e of i){let t=n[e];for(let i of a){let a=n[i];a.line>=t.min-Dt&&a.line<=t.max+Dt&&t.line>=a.min-Dt&&t.line<=a.max+Dt&&(r[e].add(At(a.line,t.min,t.max)),r[i].add(At(t.line,a.min,a.max)))}}let o=[],s=(e,t)=>{let s=n[e],c=Pt(s,t),l=s.axis===`h`?a:i,u=null;for(let e of l){let r=n[e],i=s.axis===`h`?c.y:c.x;if(i<r.min-Dt||i>r.max+Dt)continue;let a=Math.abs(r.line-t);a<=Dt||a>Ft||(!u||a<u.w)&&(u={proj:s.axis===`h`?{x:r.line,y:c.y}:{x:c.x,y:r.line},w:a,ti:e})}if(u){let e=n[u.ti],t=e.axis===`h`?u.proj.x:u.proj.y;r[u.ti].add(At(t,e.min,e.max)),o.push({a:c,b:u.proj,w:u.w*Nt(Math.max(s.tier,e.tier))})}};n.forEach((e,t)=>{e.max-e.min<.1||(s(t,e.min),s(t,e.max))});let c=new Map,l=new Map,u=[],d=(e,t,n)=>{(c.get(e)??c.set(e,[]).get(e)).push({to:t,w:n}),(c.get(t)??c.set(t,[]).get(t)).push({to:e,w:n})};n.forEach((e,t)=>{let n=[...r[t]].sort((e,t)=>e-t);if(e.max-e.min<.1){u.push({seg:e,pts:n});return}for(let t of n){let n=Pt(e,t);l.set(jt(n.x,n.y),n)}let i=Nt(e.tier);for(let t=0;t<n.length-1;t++){let r=Pt(e,n[t]),a=Pt(e,n[t+1]),o=(n[t+1]-n[t])*i;o>0&&d(jt(r.x,r.y),jt(a.x,a.y),o)}u.push({seg:e,pts:n})});for(let e of o)d(jt(e.a.x,e.a.y),jt(e.b.x,e.b.y),e.w);return{adj:c,coord:l,segs:u}}function Lt(e,t){let n=null,r=1/0;return e.segs.forEach((e,i)=>{let a=e.seg;if(a.max-a.min<.1)return;let o=At(a.axis===`h`?t.x:t.y,a.min,a.max),s=a.axis===`h`?{x:o,y:a.line}:{x:a.line,y:o},c=Math.hypot(t.x-s.x,t.y-s.y);c<r&&(r=c,n={segIndex:i,seg:a,along:o,point:s})}),n}function Rt(e,t){let{seg:n,pts:r}=e,i=Nt(n.tier),a=0;for(;a<r.length-2&&r[a+1]<t;)a++;let o=r[a],s=r[a+1]??o,c=e=>n.axis===`h`?jt(e,n.line):jt(n.line,e),l=[{key:c(o),w:Math.abs(t-o)*i}];return s!==o&&l.push({key:c(s),w:Math.abs(s-t)*i}),l}var zt=class{a=[];get size(){return this.a.length}push(e,t){let n=this.a;n.push([e,t]);let r=n.length-1;for(;r>0;){let e=r-1>>1;if(n[e][0]<=n[r][0])break;[n[e],n[r]]=[n[r],n[e]],r=e}}pop(){let e=this.a,t=e[0],n=e.pop();if(e.length>0){e[0]=n;let t=0;for(;;){let n=2*t+1,r=n+1,i=t;if(n<e.length&&e[n][0]<e[i][0]&&(i=n),r<e.length&&e[r][0]<e[i][0]&&(i=r),i===t)break;[e[i],e[t]]=[e[t],e[i]],t=i}}return t}};function Bt(e,t,n){let r=new Map([[t,0]]),i=new Map,a=new Set,o=new zt;for(o.push(0,t);o.size>0;){let[t,s]=o.pop();if(!a.has(s)){if(a.add(s),s===n)break;for(let{to:n,w:a}of e(s)){let e=t+a;e<(r.get(n)??1/0)&&(r.set(n,e),i.set(n,s),o.push(e,n))}}}if(!r.has(n))return null;let s=[],c=n;for(;c!==void 0&&(s.push(c),c!==t);)c=i.get(c);return s[s.length-1]===t?s.reverse():null}function Vt(e,t){return{x:At(t.x,e.x,e.x+e.w),y:At(t.y,e.y,e.y+e.h)}}function Ht(e){if(e.length<=2)return e;let t=[e[0]];for(let n=1;n<e.length-1;n++){let r=t[t.length-1],i=e[n],a=e[n+1];!(Math.abs(r.x-i.x)<.1&&Math.abs(i.x-a.x)<.1||Math.abs(r.y-i.y)<.1&&Math.abs(i.y-a.y)<.1)&&(Math.abs(r.x-i.x)>.1||Math.abs(r.y-i.y)>.1)&&t.push(i)}return t.push(e[e.length-1]),t}function Ut(e,t,n){let r=Lt(e,Mt(t)),i=Lt(e,Mt(n));if(!r||!i)return null;let a=new Map,o=(e,t)=>{(a.get(e)??a.set(e,[]).get(e)).push(t)};for(let t of Rt(e.segs[r.segIndex],r.along))o(`\0A`,{to:t.key,w:t.w});for(let t of Rt(e.segs[i.segIndex],i.along))o(t.key,{to:`\0B`,w:t.w});r.segIndex===i.segIndex&&o(`\0A`,{to:`\0B`,w:Math.abs(r.along-i.along)*Nt(r.seg.tier)});let s=Bt(t=>[...e.adj.get(t)??[],...a.get(t)??[]],`\0A`,`\0B`);if(!s)return null;let c=s.map(t=>t===`\0A`?r.point:t===`\0B`?i.point:e.coord.get(t)),l=Vt(t,c[0]),u=Vt(n,c[c.length-1]);return Ht([l,...c,u])}function Wt(e,t){let n=Mt(e),r=Mt(t);return Math.abs(r.x-n.x)>=Math.abs(r.y-n.y)?[{x:r.x>n.x?e.x+e.w:e.x,y:n.y},{x:r.x,y:n.y},{x:r.x,y:r.y>n.y?t.y:t.y+t.h}]:[{x:n.x,y:r.y>n.y?e.y+e.h:e.y},{x:n.x,y:r.y},{x:r.x>n.x?t.x:t.x+t.w,y:r.y}]}var Gt=new WeakMap,Kt=new WeakMap;function qt(e){if(Gt.has(e))return Gt.get(e)??null;let t=It(e);return Gt.set(e,t),t}function Jt(e,t,n){let r=qt(e);if(!r)return null;let i=Kt.get(e);if(i||(i=new Map,Kt.set(e,i)),i.has(t))return i.get(t)??null;let a=[],o=0;for(let i of e.roads){if(i.a!==t&&i.b!==t)continue;let e=n.get(i.a),s=n.get(i.b);if(!e||!s)continue;let c=null;o<kt&&(c=Ut(r,e,s),o++),c||=Wt(e,s),a.push({points:c,bidirectional:i.bidirectional,affinity:i.affinity})}return i.set(t,a),a}function Yt(e,t){let n=e.x+e.w/2,r=e.y+e.h/2,i=t.x+t.w/2,a=t.y+t.h/2,o=i-n,s=a-r;if(Math.abs(o)<1||Math.abs(s)<1)return[{x:n,y:r},{x:i,y:a}];if(Math.abs(o)>Math.abs(s)){let n=o>0?e.x+e.w:e.x,a=s>0?t.y:t.y+t.h;return[{x:n,y:r},{x:i,y:r},{x:i,y:a}]}let c=s>0?e.y+e.h:e.y,l=o>0?t.x:t.x+t.w;return[{x:n,y:c},{x:n,y:a},{x:l,y:a}]}function Xt(e,t,n){let{cam:r,model:i,palette:a,tier:o,viewW:s,viewH:c}=t;if(o===`city`||i.roads.length===0||n===`selected`&&!t.selectedId)return;let l=new Map;for(let e of i.blocks)l.set(e.id,e.rect);if(n===`selected`&&t.selectedId){let n=Jt(i,t.selectedId,l);if(n){Zt(e,t,n);return}}let u=Math.max(2,Math.min(8,4*r.scale));for(let o of i.roads){if(n===`selected`&&o.a!==t.selectedId&&o.b!==t.selectedId)continue;let i=l.get(o.a),d=l.get(o.b);if(!i||!d)continue;let f=Yt(i,d).map(e=>({x:v(r,e.x),y:y(r,e.y)})),p=1/0,m=1/0,h=-1/0,g=-1/0;for(let e of f)e.x<p&&(p=e.x),e.y<m&&(m=e.y),e.x>h&&(h=e.x),e.y>g&&(g=e.y);h<0||g<0||p>s||m>c||(n===`selected`?(e.strokeStyle=a.selected,e.globalAlpha=.9,e.lineWidth=2):(e.strokeStyle=o.bidirectional?a.roadMutual:a.road,e.globalAlpha=.25+.2*Math.min(1,o.affinity),e.lineWidth=o.bidirectional?1.5:1),e.beginPath(),e.moveTo(f[0].x,f[0].y),f.length===2?e.lineTo(f[1].x,f[1].y):(e.arcTo(f[1].x,f[1].y,f[2].x,f[2].y,u),e.lineTo(f[2].x,f[2].y)),e.stroke())}e.globalAlpha=1}function Zt(e,t,n){let{cam:r,palette:i,viewW:a,viewH:o}=t,s=Math.max(2,Math.min(6,3*r.scale));e.strokeStyle=i.selected,e.globalAlpha=.9,e.lineJoin=`round`;for(let t of n){if(t.points.length<2)continue;let n=t.points.map(e=>({x:v(r,e.x),y:y(r,e.y)})),i=1/0,c=1/0,l=-1/0,u=-1/0;for(let e of n)e.x<i&&(i=e.x),e.y<c&&(c=e.y),e.x>l&&(l=e.x),e.y>u&&(u=e.y);if(!(l<0||u<0||i>a||c>o)){e.lineWidth=t.bidirectional?2.4:2,e.beginPath(),e.moveTo(n[0].x,n[0].y);for(let t=1;t<n.length-1;t++)e.arcTo(n[t].x,n[t].y,n[t+1].x,n[t+1].y,s);e.lineTo(n[n.length-1].x,n[n.length-1].y),e.stroke()}}e.globalAlpha=1}function Qt(e,t){e.save(),ut(e,t),Xt(e,t,`under`),Ge(e,t),tt(e,t),lt(e,t,t.atlas),xt(e,t),et(e,t),Xt(e,t,`selected`),St(e,t),Tt(e,t),e.restore()}var $t=.01;function en(e,t){return e.x+e.w<=t.x+$t||e.y+e.h<=t.y+$t}function tn(e){let t=e.length;if(t<=1)return e.map((e,t)=>t);let n=t=>{let n=e[t].rect;return n.x+n.w+n.y+n.h},r=(t,r)=>{let i=e[t].rect,a=e[r].rect;return(n(t)-n(r)||i.x-a.x||i.y-a.y||i.w-a.w||i.h-a.h||t-r)<0},i=e.map((e,t)=>t).sort((t,n)=>e[t].u0-e[n].u0),a=Array.from({length:t},()=>[]),o=Array(t).fill(0),s=[];for(let t of i){let n=e[t];for(let i=s.length-1;i>=0;i--){let c=s[i];if(e[c].u1<n.u0){s.splice(i,1);continue}let l=e[t].rect,u=e[c].rect,d=en(l,u),f=en(u,l);d&&!f?(a[t].push(c),o[c]+=1):f&&!d?(a[c].push(t),o[t]+=1):d&&f&&(r(t,c)?(a[t].push(c),o[c]+=1):(a[c].push(t),o[t]+=1))}s.push(t)}let c=e=>{let t=0;for(let n=1;n<e.length;n++)r(e[n],e[t])&&(t=n);return t},l=[],u=[],d=o.slice();for(let e=0;e<t;e++)d[e]===0&&u.push(e);let f=Array(t).fill(!1);for(;l.length<t;){if(u.length===0){let e=-1;for(let r=0;r<t;r++)f[r]||(e<0||n(r)<n(e))&&(e=r);u.push(e),d[e]=0}let e=c(u),r=u.splice(e,1)[0];if(!f[r]){f[r]=!0,l.push(r);for(let e of a[r])--d[e],d[e]===0&&!f[e]&&u.push(e)}}return l}var nn=.6;function H(e,t){return{u:e-t,v:(e+t)/2}}function rn(e){return e*3}var an=3*nn*.6;function on(e){return(.5+e*4.5)*3*nn*.4}function sn(e,t,n=!1){let r=Math.max(.001,t),i=(e.w+e.h)*r;return Math.max(n?2:3,Math.min(n?16:20,i*.17))/r}function cn(e){return{n:H(e.x,e.y),e:H(e.x+e.w,e.y),s:H(e.x+e.w,e.y+e.h),w:H(e.x,e.y+e.h)}}function ln(e,t){return{u0:e.x-(e.y+e.h),u1:e.x+e.w-e.y,v0:(e.x+e.y)/2-t,v1:(e.x+e.w+e.y+e.h)/2}}function un(e,t,n,r){return Math.max(0,n.x-e/2-t,n.y+e/2-t)<=Math.min(r,n.x+n.w-e/2-t,n.y+n.h+e/2-t)}function dn(e,t,n,r,i=32){if(e.w<=0||e.h<=0||n<=0||r<=0)return{scale:1,offsetX:0,offsetY:0};let a=ln(e,t),o=a.u1-a.u0,s=a.v1-a.v0,c=g(Math.min((n-i*2)/o,(r-i*2)/s)),l=a.u0+o/2,u=a.v0+s/2;return{scale:c,offsetX:l-n/2/c,offsetY:u-r/2/c}}function fn(e){return e.levels===void 0?Math.max(1,Math.min(5,1+Math.round(Math.sqrt(Math.max(1,e.weight))/15))):e.levels}function pn(e){let t=Le(e),n=e.blocks.map(e=>{let n=e.state===`tombstoned`?0:rn(fn(e)),r=n*nn,i=t.get(e.id);return{block:e,hWorld:n,hIso:r,aabb:ln(e.rect,r),...i?{style:i}:{},roofFactor:i?.roofFactor??1}}),r=tn(n.map(e=>({rect:e.block.rect,u0:e.aabb.u0,u1:e.aabb.u1}))),i=0;for(let e of n)e.hIso>i&&(i=e.hIso);return{geoms:n,order:r,maxHIso:i}}var mn=new WeakMap;function hn(e){let t=mn.get(e);if(t)return t;let n=pn(e);return mn.set(e,n),n}function gn(e,t){return e.block.state!==`live`||e.block.phantom?0:sn(e.block.rect,t)*e.roofFactor}function U(e,t,n,r){let i=gn(t,e.scale),a=(t.aabb.u0-e.offsetX)*e.scale,o=(t.aabb.u1-e.offsetX)*e.scale,s=(t.aabb.v0-i-e.offsetY)*e.scale,c=(t.aabb.v1-e.offsetY)*e.scale;return o>=0&&c>=0&&a<=n&&s<=r}function _n(e,t){let n=t.rect.x+t.rect.w/2,r=t.rect.y+t.rect.h/2,i=n-r,a=(n+r)/2-an-on(t.height)-sn(t.rect,e.scale,!0);return{x:(i-e.offsetX)*e.scale,y:(a-e.offsetY)*e.scale}}var vn=new WeakMap;function yn(e,t){let n=vn.get(e);if(!n){n=new Map;for(let t of e.buildings){let e=n.get(t.blockId);e?e.push(t):n.set(t.blockId,[t])}vn.set(e,n)}return n.get(t)??bn}var bn=[];function xn(e,t,n,r,i){let a=r/n.scale+n.offsetX,o=i/n.scale+n.offsetY+an,s=yn(e,t);for(let e=s.length-1;e>=0;e--){let t=s[e];if(un(a,o,t.rect,on(t.height)+sn(t.rect,n.scale,!0)))return t}return null}function Sn(e,t,n,r){let i=n/t.scale+t.offsetX,a=r/t.scale+t.offsetY;for(let n=e.order.length-1;n>=0;n--){let r=e.geoms[e.order[n]];if(un(i,a,r.block.rect,r.hIso+gn(r,t.scale)))return r.block}return null}function W(e,t,n){return{x:(t-e.offsetX)*e.scale,y:(n-e.offsetY)*e.scale}}var Cn=12,wn=5,Tn=.78;function En(e,t,n){if(t.tier===`city`||t.ageLens)return;let r=n.lot;if(!r||n.state===`tombstoned`||n.phantom||(r.w+r.h)*t.cam.scale<Cn)return;let i=cn(r),a=[W(t.cam,i.n.u,i.n.v),W(t.cam,i.e.u,i.e.v),W(t.cam,i.s.u,i.s.v),W(t.cam,i.w.u,i.w.v)],o=F(n),s=t.palette;e.globalAlpha=.55,e.fillStyle=o<.25?s.orchard:o<.5?s.ground:s.sidewalk,On(e,a),e.fill(),e.globalAlpha=1;let c=I(n);if(!(c===`city`&&o>Tn)){if(c===`village`){Dn(e,t,a);return}e.strokeStyle=c===`town`?s.fence:s.curb,e.lineWidth=1,c===`town`&&e.setLineDash([2,2]),On(e,a),e.stroke(),e.setLineDash([])}}function Dn(e,t,n){e.strokeStyle=t.palette.hedge,e.lineWidth=1.6,e.lineCap=`round`,e.beginPath();for(let t=0;t<4;t++){let r=n[t],i=n[(t+1)%4],a=Math.max(1,Math.floor(Math.hypot(i.x-r.x,i.y-r.y)/wn));for(let t=0;t<a;t++){let n=(t+.15)/a,o=(t+.85)/a;e.moveTo(r.x+(i.x-r.x)*n,r.y+(i.y-r.y)*n-1),e.lineTo(r.x+(i.x-r.x)*o,r.y+(i.y-r.y)*o-1)}}e.stroke(),e.lineCap=`butt`}function On(e,[t,n,r,i]){e.beginPath(),e.moveTo(t.x,t.y),e.lineTo(n.x,n.y),e.lineTo(r.x,r.y),e.lineTo(i.x,i.y),e.closePath()}function kn(e,t,n){let r=cn(t),i=W(e,r.n.u,r.n.v),a=W(e,r.e.u,r.e.v),o=W(e,r.s.u,r.s.v),s=W(e,r.w.u,r.w.v),c=n*e.scale;return{gn:i,ge:a,gs:o,gw:s,tn:{x:i.x,y:i.y-c},te:{x:a.x,y:a.y-c},ts:{x:o.x,y:o.y-c},tw:{x:s.x,y:s.y-c},liftPx:c}}function An(e,t,n,r,i){e.beginPath(),e.moveTo(t.x,t.y),e.lineTo(n.x,n.y),e.lineTo(r.x,r.y),e.lineTo(i.x,i.y),e.closePath()}function G(e,t,n,r,i,a){e.fillStyle=t,An(e,n,r,i,a),e.fill()}function jn(e,t){e.beginPath(),e.moveTo(t.tn.x,t.tn.y),e.lineTo(t.te.x,t.te.y),e.lineTo(t.ge.x,t.ge.y),e.lineTo(t.gs.x,t.gs.y),e.lineTo(t.gw.x,t.gw.y),e.lineTo(t.tw.x,t.tw.y),e.closePath()}function Mn(e,t,n){t.liftPx>=.5&&(G(e,n.wallL,t.tw,t.ts,t.gs,t.gw),G(e,n.wallR,t.ts,t.te,t.ge,t.gs)),G(e,n.top,t.tn,t.te,t.ts,t.tw)}var Nn=class{buckets=new Map;add(e,t,n,r,i){let a=this.buckets.get(e);a||(a=[],this.buckets.set(e,a)),a.push(t.x,t.y,n.x,n.y,r.x,r.y,i.x,i.y)}flush(e){for(let[t,n]of this.buckets){e.fillStyle=t,e.beginPath();for(let t=0;t<n.length;t+=8)e.moveTo(n[t],n[t+1]),e.lineTo(n[t+2],n[t+3]),e.lineTo(n[t+4],n[t+5]),e.lineTo(n[t+6],n[t+7]),e.closePath();e.fill()}this.buckets.clear()}},Pn=20,Fn={"clock-tower":2.4,cupola:1.85,lantern:1.35,bellcote:1.5,finial:1.05};function In(e,t,n,r,i,a={}){Mn(e,n,i);let o=a.compact===!0,s=sn({x:0,y:0,w:Math.max(0,(n.te.x-n.tn.x)/t.cam.scale),h:Math.max(0,(n.tn.x-n.tw.x)/t.cam.scale)},t.cam.scale,o)*t.cam.scale;!a.suppressDetails&&t.tier===`street`&&n.liftPx>=5&&rr(e,t,n,r,o),!a.suppressDetails&&n.te.x-n.tw.x>=Pn&&ar(e,t,n,r,i);let c=Ln(e,t,n,r,s,i);if(!a.suppressDetails&&t.tier===`street`){zn(e,n,r,c,i,o),Bn(e,n,r,c,i,o);let a=s*(r.roofFactor??1),l=Math.min(c.a.y,c.b.y,c.apex.y);ur(e,t,n,r,c,s,Math.max(0,a-(n.tn.y-l)),o)}}function Ln(e,t,n,r,i,a){let o=r.ridge;switch(r.roof){case`gable`:return Hn(e,n,o,i,a);case`hip`:return Kn(e,n,o,i,a);case`mansard`:return qn(e,n,o,i,a);case`sawtooth`:return Jn(e,n,o,i,r.sawteeth,a);case`shed`:return Yn(e,n,o,i,a);case`thatch`:return Un(e,n,o,i,a);case`half-hip`:return Wn(e,n,o,i,a);case`catslide`:return Gn(e,n,o,i,a);case`parapet`:return Xn(e,n,i,a);case`monitor`:return Zn(e,n,o,i,a);case`pyramid`:return Qn(e,n,i,a);case`barrel`:return $n(e,t,n,o,i,a);case`conical`:return er(e,n,i,a)}}function Rn(e,t,n){return n===`x`?[{ridgeA:t.a,ridgeB:t.b,eaveA:e.tn,eaveB:e.te},{ridgeA:t.a,ridgeB:t.b,eaveA:e.tw,eaveB:e.ts}]:[{ridgeA:t.a,ridgeB:t.b,eaveA:e.tn,eaveB:e.tw},{ridgeA:t.a,ridgeB:t.b,eaveA:e.te,eaveB:e.ts}]}function zn(e,t,n,r,i,a){let o=t.te.x-t.tw.x;if(o<(a?24:30)||n.roof===`sawtooth`||n.roof===`monitor`||n.roof===`pyramid`||n.roof===`barrel`||n.roof===`conical`||n.roof===`parapet`)return;let s=Rn(t,r,n.ridge),c=n.roof===`thatch`?`thatch`:n.material.roof,l=(t,n)=>{e.moveTo(t.x,t.y),e.lineTo(n.x,n.y)};e.strokeStyle=i.wallR,e.lineWidth=c===`iron`?.75:.6,e.globalAlpha=c===`thatch`?.34:.26,e.beginPath();for(let e of s)if(c===`slate`||c===`tile`){let t=c===`slate`?[.28,.48,.66,.82]:[.34,.6,.82],n=.08;for(let r=0;r<t.length;r++){let i=t[r];if(l(X(e.ridgeA,e.eaveA,i),X(e.ridgeB,e.eaveB,i)),o>=38){let t=a?3:5;for(let a=1;a<t;a++){let o=(a+(r%2==0?.28:-.18))/t;if(o<=0||o>=1)continue;let s=X(e.ridgeA,e.ridgeB,o),c=X(e.eaveA,e.eaveB,o);l(X(s,c,n),X(s,c,i))}}n=i}}else if(c===`thatch`){let t=a?4:7;for(let n=1;n<t;n++){let r=n/t,i=X(e.ridgeA,e.ridgeB,r),a=X(e.eaveA,e.eaveB,r);l(X(i,a,.12),X(i,a,.94))}}else if(c===`iron`||c===`glass`){let t=a?4:7;for(let n=1;n<t;n++){let r=n/t;l(X(e.ridgeA,e.ridgeB,r),X(e.eaveA,e.eaveB,r))}c===`glass`&&l(X(e.ridgeA,e.eaveA,.55),X(e.ridgeB,e.eaveB,.55))}e.stroke(),e.globalAlpha=1}function Bn(e,t,n,r,i,a){if(n.roof===`parapet`||n.roof===`conical`||n.roof===`pyramid`)return;let o=t.te.x-t.tw.x,s=Math.max(1,Math.min(a?1.7:2.2,o*.024));e.strokeStyle=i.wallR,e.globalAlpha=.55,e.lineWidth=s+.8,e.lineJoin=`round`,e.beginPath(),e.moveTo(t.tw.x,t.tw.y+1),e.lineTo(t.ts.x,t.ts.y+1),e.lineTo(t.te.x,t.te.y+1),e.stroke(),e.strokeStyle=i.edge,e.globalAlpha=.72,e.lineWidth=s,e.beginPath(),e.moveTo(t.tw.x,t.tw.y),e.lineTo(t.ts.x,t.ts.y),e.lineTo(t.te.x,t.te.y),(n.roof===`gable`||n.roof===`thatch`||n.roof===`catslide`||n.roof===`half-hip`)&&(n.ridge===`x`?(e.moveTo(t.te.x,t.te.y),e.lineTo(r.b.x,r.b.y),e.lineTo(t.ts.x,t.ts.y)):(e.moveTo(t.tw.x,t.tw.y),e.lineTo(r.b.x,r.b.y),e.lineTo(t.ts.x,t.ts.y))),e.stroke(),e.lineJoin=`miter`,e.globalAlpha=1}function Vn(e,t){return t===`x`?[Y(e.tn,e.tw),Y(e.te,e.ts)]:[Y(e.tn,e.te),Y(e.tw,e.ts)]}function K(e,t){return{a:e,b:t,apex:Y(e,t)}}function Hn(e,t,n,r,i){if(n===`x`){let n=Z(Y(t.tn,t.tw),r),a=Z(Y(t.te,t.ts),r);return q(e,i.wallL,t.tn,t.tw,n),q(e,i.wallR,t.te,a,t.ts),G(e,i.top,t.tn,t.te,a,n),G(e,i.wallL,n,a,t.ts,t.tw),J(e,i.edge,n,a),K(n,a)}let a=Z(Y(t.tn,t.te),r),o=Z(Y(t.tw,t.ts),r);return q(e,i.wallR,t.tn,a,t.te),q(e,i.wallL,t.tw,t.ts,o),G(e,i.top,t.tn,a,o,t.tw),G(e,i.wallL,a,t.te,t.ts,o),J(e,i.edge,a,o),K(a,o)}function Un(e,t,n,r,i){let a=Hn(e,t,n,r*1.12,i),o=Math.max(1.2,r*.16);e.fillStyle=i.wallR,e.globalAlpha=.55;for(let[r,i]of n===`x`?[[t.tn,t.te],[t.tw,t.ts]]:[[t.tn,t.tw],[t.te,t.ts]])yr(e,[r,i,{x:i.x,y:i.y+o},{x:r.x,y:r.y+o}],!0),e.fill();return e.globalAlpha=1,e.strokeStyle=i.top,e.lineWidth=Math.max(1.5,r*.22),e.lineCap=`round`,e.beginPath(),e.moveTo(a.a.x,a.a.y),e.lineTo(a.b.x,a.b.y),e.stroke(),e.lineCap=`butt`,a}function Wn(e,t,n,r,i){let[a,o]=Vn(t,n),s=Z(X(a,o,.12),r),c=Z(X(a,o,.88),r),l=.66;if(n===`x`){let n=Z(Y(t.tn,t.tw),r*l),a=Z(Y(t.te,t.ts),r*l);G(e,i.wallL,t.tn,t.tw,n,s),G(e,i.wallR,t.te,c,a,t.ts),G(e,i.top,t.tn,t.te,c,s),G(e,i.wallL,s,c,t.ts,t.tw)}else{let n=Z(Y(t.tn,t.te),r*l),a=Z(Y(t.tw,t.ts),r*l);G(e,i.wallR,t.tn,s,n,t.te),G(e,i.wallL,t.tw,t.ts,a,c),G(e,i.top,t.tn,s,c,t.tw),G(e,i.wallL,s,t.te,t.ts,c)}return J(e,i.edge,s,c),K(s,c)}function Gn(e,t,n,r,i){let a=.34;if(n===`x`){let n=Z(X(t.tw,t.tn,a),r),o=Z(X(t.ts,t.te,a),r);return q(e,i.wallL,t.tn,t.tw,n),q(e,i.wallR,t.te,o,t.ts),G(e,i.top,t.tn,t.te,o,n),G(e,i.wallL,n,o,t.ts,t.tw),J(e,i.edge,n,o),K(n,o)}let o=Z(X(t.te,t.tn,a),r),s=Z(X(t.ts,t.tw,a),r);return q(e,i.wallR,t.tn,o,t.te),q(e,i.wallL,t.tw,t.ts,s),G(e,i.top,t.tn,o,s,t.tw),G(e,i.wallL,o,t.te,t.ts,s),J(e,i.edge,o,s),K(o,s)}function Kn(e,t,n,r,i){let[a,o]=Vn(t,n),s=Z(X(a,o,.24),r),c=Z(X(a,o,.76),r);return n===`x`?(G(e,i.top,t.tn,t.te,c,s),q(e,i.wallR,t.te,t.ts,c),G(e,i.wallL,s,c,t.ts,t.tw),q(e,i.top,t.tn,s,t.tw)):(G(e,i.top,t.tn,s,c,t.tw),q(e,i.top,t.tn,t.te,s),G(e,i.wallR,s,t.te,t.ts,c),q(e,i.wallL,t.tw,c,t.ts)),J(e,i.edge,s,c),K(s,c)}function qn(e,t,n,r,i){let a=xr(t.tn,t.te,t.ts,t.tw),o=Z(br(t.tn,a,.32),r),s=Z(br(t.te,a,.32),r),c=Z(br(t.ts,a,.32),r),l=Z(br(t.tw,a,.32),r);return G(e,i.top,t.tn,t.te,s,o),G(e,i.wallR,t.te,t.ts,c,s),G(e,i.wallL,l,c,t.ts,t.tw),G(e,i.top,t.tn,o,l,t.tw),G(e,i.top,o,s,c,l),e.strokeStyle=i.edge,e.lineWidth=.8,yr(e,[o,s,c,l],!0),e.stroke(),n===`x`?K(Y(o,l),Y(s,c)):K(Y(o,s),Y(l,c))}function Jn(e,t,n,r,i,a){let o=Math.max(2,Math.min(5,i||3)),s=n===`x`?t.tn:t.tw,c=n===`x`?t.tw:t.ts,l=n===`x`?t.te:t.tn,u=n===`x`?t.ts:t.te;for(let t=0;t<o;t++){let n=t/o,i=(t+.68)/o,d=(t+1)/o,f=X(s,c,n),p=X(l,u,n),m=Z(X(s,c,i),r*.72),h=Z(X(l,u,i),r*.72),g=X(s,c,d),_=X(l,u,d);G(e,a.top,f,p,h,m),G(e,a.wallL,m,h,_,g),J(e,a.edge,m,h,.65)}return K(Z(X(s,c,.68/o),r*.72),Z(X(l,u,.68/o),r*.72))}function Yn(e,t,n,r,i){if(n===`x`){let n=Z(t.tn,r),a=Z(t.te,r);return q(e,i.wallL,t.tn,t.tw,n),q(e,i.wallR,t.te,a,t.ts),G(e,i.top,n,a,t.ts,t.tw),J(e,i.edge,n,a),K(n,a)}let a=Z(t.tn,r),o=Z(t.tw,r);return q(e,i.wallR,t.tn,a,t.te),q(e,i.wallL,t.tw,t.ts,o),G(e,i.top,a,t.te,t.ts,o),J(e,i.edge,a,o),K(a,o)}function Xn(e,t,n,r){let i=Math.max(1.5,n*.42),a=Z(t.tn,i),o=Z(t.te,i),s=Z(t.ts,i),c=Z(t.tw,i);G(e,r.wallL,c,s,t.ts,t.tw),G(e,r.wallR,s,o,t.te,t.ts),G(e,r.top,a,o,s,c);let l=xr(a,o,s,c),u=[X(a,l,.2),X(o,l,.2),X(s,l,.2),X(c,l,.2)];return G(e,r.wallL,...u),e.strokeStyle=r.edge,e.lineWidth=.8,yr(e,[a,o,s,c],!0),e.stroke(),K(u[0],u[2])}function Zn(e,t,n,r,i){let a=Hn(e,t,n,r*.6,i),o=r*.42,s=Math.abs(t.te.x-t.tw.x)*.1,c={x:a.a.x+s*.35,y:a.a.y},l={x:a.b.x-s*.35,y:a.b.y},u=Z(c,o),d=Z(l,o);return G(e,i.wallR,c,l,d,u),G(e,i.top,u,d,Z(d,1.5),Z(u,1.5)),J(e,i.edge,Z(u,1.5),Z(d,1.5)),K(Z(u,1.5),Z(d,1.5))}function Qn(e,t,n,r){let i=Z(xr(t.tn,t.te,t.ts,t.tw),n*1.35);return q(e,r.top,t.tw,t.tn,i),q(e,r.top,t.tn,t.te,i),q(e,r.wallL,t.tw,i,t.ts),q(e,r.wallR,t.ts,i,t.te),J(e,r.edge,t.tn,i,.7),{a:i,b:i,apex:i}}function $n(e,t,n,r,i,a){let[o,s]=Vn(n,r),[c,l,u,d]=r===`x`?[n.tn,n.te,n.ts,n.tw]:[n.te,n.ts,n.tw,n.tn],f=Z(o,i),p=Z(s,i),m=Z(X(d,o,.5),i*.86),h=Z(X(u,s,.5),i*.86),g=Z(X(c,o,.5),i*.86),_=Z(X(l,s,.5),i*.86);return G(e,a.wallL,d,u,h,m),G(e,a.top,m,h,p,f),G(e,t.palette.windowLit,f,p,_,g),G(e,a.wallR,g,_,l,c),J(e,a.edge,f,p,.7),K(f,p)}function er(e,t,n,r){let i=xr(t.tn,t.te,t.ts,t.tw),a=Z(i,n*2.1),o=.42,s=Z(X(t.tn,i,o),n*1.05),c=Z(X(t.te,i,o),n*1.05),l=Z(X(t.ts,i,o),n*1.05),u=Z(X(t.tw,i,o),n*1.05);return G(e,r.top,t.tn,t.te,c,s),G(e,r.wallR,t.te,t.ts,l,c),G(e,r.wallL,u,l,t.ts,t.tw),G(e,r.top,t.tn,s,u,t.tw),q(e,r.top,s,c,a),q(e,r.wallR,c,l,a),q(e,r.wallL,l,u,a),q(e,r.top,u,s,a),{a,b:a,apex:a}}var tr=34;function nr(e,t,n,r,i,a){if(!i)return;let o=(e,t,r,i)=>vr(n.ta,n.tb,n.ga,n.gb,e,t,r,i),s=(t,n,r,i)=>{let a=o(t,t,n,n)[0],s=o(r,r,i,i)[0];e.moveTo(a.x,a.y),e.lineTo(s.x,s.y)},c=C(r.seed^1327217884^a*2654435769);switch(e.strokeStyle=t.palette.masonry,e.lineWidth=.55,e.globalAlpha=t.palette.dark?.3:.22,e.beginPath(),r.material.wall){case`brick`:for(let e=1;e<=6;e++){let t=.08+e*.86/7;s(.02,t,.98,t);let n=e%2==0?.2:.36;for(let e=n;e<.96;e+=.42){let n=.86/7/2;s(e,t-n,e,t+n)}}break;case`stone`:for(let e=1;e<=4;e++){let t=.1+e*.82/5;s(.02,t,.98,t);let n=.18+c()*.22,r=.58+c()*.24,i=.82/5/2;s(n,t-i,n,t+i),s(r,t-i,r,t+i)}break;case`timber`:for(let e=1;e<=7;e++){let t=.06+e*.88/8;s(.02,t,.98,t)}break;case`stucco`:for(let e=0;e<6;e++){let e=.1+c()*.76,t=.12+c()*.72;s(e,t,Math.min(.94,e+.06+c()*.08),t+(c()-.5)*.03)}break;case`iron`:case`glass`:for(let e=1;e<=6;e++){let t=e/7;s(t,.05,t,.95)}break;default:break}e.stroke(),e.globalAlpha=1}function rr(e,t,n,r,i){let a=C(r.seed^z.FACADE),o=Math.max(1,Math.min(3,r.storeys)),s=Math.max(1,Math.min(i?3:4,r.bays)),c=n.te.x-n.tw.x>=tr,l=[{q:{ta:n.tw,tb:n.ts,ga:n.gw,gb:n.gs},bays:s},{q:{ta:n.ts,tb:n.te,ga:n.gs,gb:n.ge},bays:Math.max(1,s-1)}];for(let n=0;n<l.length;n++){let{q:i,bays:s}=l[n];nr(e,t,i,r,c,n),or(e,t,i,r,c,s),sr(e,i,o,s,c,()=>a()<.24?t.palette.windowLit:t.palette.window)}if(ir(e,t,n,r),r.awning){let r=vr(n.ts,n.te,n.gs,n.ge,.08,.92,.57,.7);G(e,t.palette.awning,...r),e.strokeStyle=t.palette.windowLit,e.globalAlpha=.5,e.lineWidth=.7;for(let t=1;t<4;t++){let n=t/4,i=X(r[0],r[1],n),a=X(r[3],r[2],n);e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke()}e.globalAlpha=1}}function ir(e,t,n,r){let i=(e,t,r,i)=>vr(n.ts,n.te,n.gs,n.ge,e,t,r,i),a=(e,t)=>i(e,e,t,t)[0];switch(r.ground){case`shopfront`:G(e,t.palette.sidewalk,...i(.05,.95,.5,.59)),G(e,t.palette.windowLit,...i(.06,.43,.61,.88)),G(e,t.palette.windowLit,...i(.63,.94,.61,.88)),G(e,t.palette.window,...i(.46,.6,.64,.98)),G(e,t.palette.windowLit,...i(.46,.6,.59,.68)),G(e,t.palette.masonry,...i(.06,.94,.88,.98)),e.strokeStyle=t.palette.masonry,e.lineWidth=.8,e.beginPath();for(let t of[.24,.43,.63,.79]){let n=a(t,.61),r=a(t,.88);e.moveTo(n.x,n.y),e.lineTo(r.x,r.y)}e.stroke();break;case`arcade`:{let n=Math.max(2,Math.min(4,r.bays));for(let r=0;r<n;r++){let a=.88/n,o=.06+r*a+a*.16,s=.06+(r+1)*a-a*.16;G(e,t.palette.window,...i(o,s,.58,.98))}break}case`cart-door`:{G(e,t.palette.window,...i(.24,.74,.5,.98)),e.strokeStyle=t.palette.masonry,e.lineWidth=.8,e.beginPath();let n=a(.24,.5),r=a(.74,.5),o=a(.24,.98),s=a(.74,.98);e.moveTo(n.x,n.y),e.lineTo(r.x,r.y),e.moveTo(n.x,n.y),e.lineTo(s.x,s.y),e.moveTo(r.x,r.y),e.lineTo(o.x,o.y),e.stroke();break}case`portico`:{for(let n of[.2,.42,.64])G(e,t.palette.sidewalk,...i(n,n+.08,.55,.98));let n=i(.14,.78,.44,.55);G(e,t.palette.sidewalk,...n);let r=a(.14,.44),o=a(.78,.44),s=Y(r,o);q(e,t.palette.sidewalk,r,{x:s.x,y:s.y-Math.max(2,(o.x-r.x)*.08)},o),e.strokeStyle=t.palette.masonry,e.lineWidth=.7,e.beginPath(),e.moveTo(n[0].x,n[0].y),e.lineTo(n[1].x,n[1].y),e.stroke();break}default:{G(e,t.palette.sidewalk,...i(.09,.32,.54,.99)),G(e,t.palette.window,...i(.125,.285,.64,.99)),G(e,t.palette.windowLit,...i(.125,.285,.55,.65)),e.strokeStyle=t.palette.masonry,e.globalAlpha=.72,e.lineWidth=.65,e.beginPath();let o=a(.135,.82),s=a(.275,.82);e.moveTo(o.x,o.y),e.lineTo(s.x,s.y),e.stroke(),e.globalAlpha=1;let c=a(.075,.98),l=a(.335,.98);if(G(e,t.palette.sidewalk,c,l,{x:l.x+1.2,y:l.y+2.5},{x:c.x+1.2,y:c.y+2.5}),n.te.x-n.tw.x>=38&&(r.archetype===`cottage`||r.archetype===`farmhouse`||r.archetype===`cottage-row`||r.archetype===`boarding-house`)){let n=i(.055,.355,.47,.54);G(e,t.palette.masonry,...n),e.strokeStyle=t.palette.sidewalk,e.lineWidth=.75,e.beginPath();for(let t of[.08,.33]){let n=a(t,.53),r=a(t,.96);e.moveTo(n.x,n.y),e.lineTo(r.x,r.y)}e.stroke()}break}}}function ar(e,t,n,r,i){let a=r.trim;if(!a.cornice&&!a.stringCourse&&!a.parapet&&!a.quoins)return;let o=(t,r,i)=>{e.strokeStyle=r,e.lineWidth=i,e.beginPath();for(let[r,i,a,o]of[[n.tw,n.ts,n.gw,n.gs],[n.ts,n.te,n.gs,n.ge]]){let n=vr(r,i,a,o,0,1,t,t);e.moveTo(n[0].x,n[0].y),e.lineTo(n[1].x,n[1].y)}e.stroke()};if(a.cornice&&o(.06,i.edge,1.1),a.parapet&&o(.14,i.edge,.7),a.stringCourse&&r.storeys>=3){let e=Math.min(3,r.storeys-1);for(let t=1;t<=e;t++)o(.12+t*.74/(e+1),i.wallR,.7)}if(a.quoins){e.fillStyle=i.edge,e.globalAlpha=.7;for(let t=0;t<4;t++){let r=.12+t*.2;G(e,i.edge,...vr(n.ts,n.te,n.gs,n.ge,0,.07,r,r+.1))}e.globalAlpha=1}}function or(e,t,n,r,i,a){let o=(e,t,r,i)=>vr(n.ta,n.tb,n.ga,n.gb,e,t,r,i);if(e.globalAlpha=.5,G(e,t.palette.masonry,...o(0,1,.93,1)),e.globalAlpha=1,e.globalAlpha=.45,G(e,t.palette.sidewalk,...o(0,1,.02,.07)),e.globalAlpha=1,!i)return;let s=r.band!==`village`;if(e.globalAlpha=.3,s&&a>1)for(let n=1;n<a;n++){let r=.09+.82*n/a;G(e,t.palette.sidewalk,...o(r-.012,r+.012,.07,.93))}if(G(e,t.palette.sidewalk,...o(0,.035,.07,.93)),G(e,t.palette.sidewalk,...o(.965,1,.07,.93)),e.globalAlpha=1,r.material.wall===`timber`&&(r.archetype===`farmhouse`||r.archetype===`barn`||r.archetype===`smithy`||r.archetype===`mill`)){e.strokeStyle=t.palette.masonry,e.globalAlpha=.55,e.lineWidth=1,e.beginPath();let n=.5,r=o(.03,.03,n,n)[0],i=o(.97,.97,n,n)[0];e.moveTo(r.x,r.y),e.lineTo(i.x,i.y);for(let t=0;t<=a;t++){let n=.06+.88*t/Math.max(1,a),r=o(n,n,.08,.08)[0],i=o(n,n,.92,.92)[0];e.moveTo(r.x,r.y),e.lineTo(i.x,i.y)}for(let t=0;t<a;t++){let n=.06+.88*t/Math.max(1,a),r=.06+.88*(t+1)/Math.max(1,a),i=o(n,n,.5,.5)[0],s=o(r,r,.88,.88)[0];e.moveTo(i.x,i.y),e.lineTo(s.x,s.y)}e.stroke(),e.globalAlpha=1}}function sr(e,t,n,r,i,a){let o=(e,n,r,i)=>vr(t.ta,t.tb,t.ga,t.gb,e,n,r,i);for(let t=0;t<n;t++){let s=.72/n,c=.12+t*s,l=Math.min(.86,c+s*.58);for(let t=0;t<r;t++){let n=.82/r,s=.09+t*n+n*.27,u=.09+(t+1)*n-n*.27,d=a();if(i&&(e.globalAlpha=.55,G(e,lr,...o(s-.008,u+.008,c-.022,c)),e.globalAlpha=.8,G(e,cr,...o(s-.016,u+.016,l,l+.022)),e.globalAlpha=1),G(e,d,...o(s,u,c,l)),i){e.strokeStyle=lr,e.globalAlpha=.5,e.lineWidth=.7,e.beginPath();let t=(s+u)/2,n=o(t,t,c,c)[0],r=o(t,t,l,l)[0];e.moveTo(n.x,n.y),e.lineTo(r.x,r.y);let i=c+(l-c)*.42,a=o(s,s,i,i)[0],d=o(u,u,i,i)[0];e.moveTo(a.x,a.y),e.lineTo(d.x,d.y),e.stroke(),e.globalAlpha=1}}}}var cr=`#cfc6b4`,lr=`#3a342c`;function ur(e,t,n,r,i,a,o,s){let c=C(r.seed^z.ROOF_FURNITURE),l=n.te.x-n.tw.x,u=Math.max(2,l*(s?.055:.07)),d=(e,t)=>Math.max(0,Math.min(e,o/t));for(let n=0;n<r.chimneys;n++){let a=r.chimneys===1?.5:.27+n/(r.chimneys-1)*.46,o=X(i.a,i.b,a),s=d(u,1.9);s<1.5||hr(e,o.x+(c()-.5)*s*.6,o.y,s,s*1.9,t.palette.masonry)}if(r.cupola&&r.cap!==`clock-tower`){let n=d(l*.15,Fn.cupola);n>=3&&gr(e,i.apex.x,i.apex.y,n,r.clock,t)}switch(r.cap){case`bellcote`:{let n=d(u*2,Fn.bellcote);n>=2.5&&dr(e,i.a,n,t);break}case`finial`:{let n=d(u*1.8,Fn.finial);n>=2&&fr(e,i.a,n,t.palette.masonry);break}case`clock-tower`:{let r=d((n.te.x-n.tw.x)*.16,Fn[`clock-tower`]);r>=3&&pr(e,i.apex,r,t);break}case`lantern`:{let n=d(u*2.2,Fn.lantern);n>=3&&mr(e,i.apex,n,t);break}default:break}if(r.dormers>0&&l>=28){let n=Math.min(3,r.dormers);for(let r=0;r<n;r++){let o=X(i.a,i.b,n===1?.5:.25+r/(n-1)*.5),s=o.y+a*.45,c=Math.min(u*.9,a*.28);c>=2.4&&_r(e,o.x,s,c,t.palette.window,t.palette.masonry)}}}function dr(e,t,n,r){let i=n*.32;e.fillStyle=r.palette.masonry,e.fillRect(t.x-i,t.y-n,i*2,n),q(e,r.palette.domeAccent,{x:t.x-i*1.3,y:t.y-n},{x:t.x,y:t.y-n*1.5},{x:t.x+i*1.3,y:t.y-n}),e.fillStyle=r.palette.window,e.fillRect(t.x-i*.45,t.y-n*.8,i*.9,n*.5)}function fr(e,t,n,r){e.strokeStyle=r,e.lineWidth=1;let i=t.y-n*.68;e.beginPath(),e.moveTo(t.x,t.y),e.lineTo(t.x,t.y-n),e.moveTo(t.x-n*.2,i),e.lineTo(t.x+n*.38,i),e.stroke(),q(e,r,{x:t.x+n*.38,y:i},{x:t.x+n*.18,y:i-n*.12},{x:t.x+n*.18,y:i+n*.12})}function pr(e,t,n,r){let i=n/2,a=n*1.5,o=t.y-a;e.fillStyle=r.palette.sidewalk,e.fillRect(t.x-i,o,n,a),e.fillStyle=r.palette.masonry,e.globalAlpha=.6,e.fillRect(t.x,o,i,a),e.globalAlpha=1,q(e,r.palette.domeAccent,{x:t.x-i*1.2,y:o},{x:t.x,y:o-n*.9},{x:t.x+i*1.2,y:o}),e.fillStyle=r.palette.windowLit,e.beginPath(),e.arc(t.x,o+a*.34,Math.max(1.6,n*.22),0,Math.PI*2),e.fill(),e.strokeStyle=r.palette.window,e.lineWidth=.7,e.stroke()}function mr(e,t,n,r){let i=n/2,a=n*.7;e.fillStyle=r.palette.windowLit,e.globalAlpha=.85,e.fillRect(t.x-i,t.y-a,n,a),e.globalAlpha=1,e.fillStyle=r.palette.masonry,e.fillRect(t.x-i,t.y-a-1.4,n,1.4),q(e,r.palette.domeAccent,{x:t.x-i,y:t.y-a-1.4},{x:t.x,y:t.y-a-n*.55},{x:t.x+i,y:t.y-a-1.4})}function hr(e,t,n,r,i,a){let o=r/2,s=n-i+.45,c=Math.max(.8,r*.34),l=s+c;e.fillStyle=a,yr(e,[{x:t-o,y:l},{x:t,y:l+o*.45},{x:t,y:n+o*.45},{x:t-o,y:n}],!0),e.fill(),e.globalAlpha=.72,yr(e,[{x:t,y:l+o*.45},{x:t+o,y:l},{x:t+o,y:n},{x:t,y:n+o*.45}],!0),e.fill(),e.globalAlpha=1,e.fillStyle=lr,e.fillRect(t-o-.5,l-1,r+1,Math.max(1,r*.16));let u=r>=4.5?2:1,d=Math.max(.8,r*(u===2?.27:.34));for(let n=0;n<u;n++){let i=u===1?t:t+(n===0?-r*.23:r*.23);e.fillRect(i-d/2,s,d,c+.4),e.fillRect(i-d*.62,s-.45,d*1.24,.7)}}function gr(e,t,n,r,i,a){let o=r/2,s=r*.85;e.fillStyle=a.palette.sidewalk,e.fillRect(t-o*.72,n-s,r*.72,s),e.fillStyle=a.palette.masonry,e.globalAlpha=.65,e.fillRect(t,n-s+1,o*.72,s-1),e.globalAlpha=1,q(e,a.palette.domeAccent,{x:t-o,y:n-s},{x:t,y:n-s-r*.65},{x:t+o,y:n-s}),i&&(e.fillStyle=a.palette.windowLit,e.beginPath(),e.arc(t,n-s*.55,Math.max(1.4,r*.12),0,Math.PI*2),e.fill(),e.strokeStyle=a.palette.window,e.lineWidth=.7,e.stroke()),e.strokeStyle=a.palette.masonry,e.lineWidth=.8,e.beginPath(),e.moveTo(t,n-s-r*.62),e.lineTo(t,n-s-r*.95),e.stroke()}function _r(e,t,n,r,i,a){let o=Math.max(2.4,r),s=o*.94;e.fillStyle=i,e.fillRect(t-o/2,n-s,o,s),q(e,a,{x:t-o*.72,y:n-s},{x:t,y:n-s-o*.66},{x:t+o*.72,y:n-s})}function vr(e,t,n,r,i,a,o,s){let c=(i,a)=>X(X(e,t,i),X(n,r,i),a);return[c(i,o),c(a,o),c(a,s),c(i,s)]}function q(e,t,n,r,i){e.fillStyle=t,yr(e,[n,r,i],!0),e.fill()}function J(e,t,n,r,i=.85){e.strokeStyle=t,e.lineWidth=i,e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(r.x,r.y),e.stroke()}function yr(e,t,n){let r=t[0];if(r){e.beginPath(),e.moveTo(r.x,r.y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);n&&e.closePath()}}function Y(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}function X(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function br(e,t,n){return X(e,t,n)}function Z(e,t){return{x:e.x,y:e.y-t}}function xr(e,t,n,r){return{x:(e.x+t.x+n.x+r.x)/4,y:(e.y+t.y+n.y+r.y)/4}}var Sr=14;function Cr(e,t,n){return e!==`city`&&t!==!0&&n>0}function wr(e,t){let n=t.now??Date.now(),r=t.tier===`street`&&!t.ageLens&&t.atlas?at(t.model):null;if(t.tier===`city`){let r=new Nn,i=[];for(let e of t.geom.order){let a=t.geom.geoms[e];if(!U(t.cam,a,t.viewW,t.viewH))continue;let o=a.block,s=t.ageLens?j(o.lastTouchedAt??o.placedAt,n):void 0;if(o.state===`tombstoned`){r.add(t.ageLens?t.palette.tombstone:t.palette.earth,...Dr(t,o));continue}if(o.state===`new`&&!t.ageLens&&!o.phantom){r.add(t.palette.newBlock,...Dr(t,o));continue}let c=P(o.lang,t.palette,s);r.add(c.top,...Dr(t,o)),o.landmark&&i.push(a)}r.flush(e),e.fillStyle=t.palette.domeAccent;for(let n of i){let r=Or(t,n);e.beginPath(),e.arc(r.x,r.y-3,2,0,Math.PI*2),e.fill()}return}for(let i of t.geom.order){let a=t.geom.geoms[i];if(U(t.cam,a,t.viewW,t.viewH)){if(En(e,t,a.block),kr(e,t,a,n),r){let n=r.get(a.block.id);if(n&&t.atlas)for(let r of n){let n=H(r.x,r.y),i=W(t.cam,n.u,n.v),a=r.size*t.cam.scale*2,o=t.atlas.index[r.sprite]*t.atlas.cell;e.drawImage(t.atlas.canvas,o,0,t.atlas.cell,t.atlas.cell,i.x-a/2,i.y-a,a,a)}}Tr(e,t,a)}}}function Tr(e,t,n){if(t.ageLens)return;let r=gt(n.block);if(!r)return;let i=yn(t.model,n.block.id),a=Cr(t.tier,t.ageLens,i.length)?_t(i):null,o=a?_n(t.cam,a):Er(t,n);vt(e,t.palette,r,o.x,o.y,n.block.id,ht(t.cam.scale),t.animationTime??0)}function Er(e,t){let n=Or(e,t);return{x:n.x,y:n.y-gn(t,e.cam.scale)*e.cam.scale}}function Dr(e,t){let n=cn(t.rect);return[W(e.cam,n.n.u,n.n.v),W(e.cam,n.e.u,n.e.v),W(e.cam,n.s.u,n.s.v),W(e.cam,n.w.u,n.w.v)]}function Or(e,t){let n=t.block.rect,r=H(n.x+n.w/2,n.y+n.h/2),i=W(e.cam,r.u,r.v);return{x:i.x,y:i.y-t.hIso*e.cam.scale}}function kr(e,t,n,r){let i=n.block,a=t.palette,[o,s,c,l]=Dr(t,i),u=s.x-l.x;if(i.state===`tombstoned`){if(e.fillStyle=t.ageLens?a.tombstone:a.earth,e.globalAlpha=t.ageLens?.4:.7,An(e,o,s,c,l),e.fill(),e.globalAlpha=1,u>=10&&!t.ageLens){let n=C(S(i.id));e.fillStyle=a.rubble;let r=4+Math.floor(n()*4);for(let a=0;a<r;a++){let r=H(i.rect.x+i.rect.w*(.12+.76*n()),i.rect.y+i.rect.h*(.12+.76*n())),a=W(t.cam,r.u,r.v),o=Math.min(4,Math.max(1,.1*u*n()));e.fillRect(a.x,a.y-o/2,o,o/2+1)}e.strokeStyle=a.blockStroke,e.globalAlpha=.6,e.setLineDash([3,3]),An(e,o,s,c,l),e.stroke(),e.setLineDash([]),e.globalAlpha=1}return}let d=kn(t.cam,i.rect,n.hIso);if(i.phantom){let n=t.ageLens?j(i.lastTouchedAt??i.placedAt,r):void 0,u=P(i.lang,a,n);e.globalAlpha=.3,Mn(e,kn(t.cam,i.rect,3*nn),u),e.globalAlpha=1;let d=Be(e,a.dark?`#8b8f99`:`#8a7f64`);d&&(e.fillStyle=d,An(e,o,s,c,l),e.fill()),e.strokeStyle=a.blockStroke,e.setLineDash([4,3]),An(e,o,s,c,l),e.stroke(),e.setLineDash([]);return}if(i.state===`new`&&!t.ageLens){if(e.fillStyle=a.earth,An(e,o,s,c,l),e.fill(),e.strokeStyle=a.newBlock,e.lineWidth=1.5,e.setLineDash([4,3]),An(e,o,s,c,l),e.stroke(),e.setLineDash([]),t.tier===`street`&&u>=Sr){let t=C(S(i.id)),n=(l.x+s.x)/2+(t()-.5)*u*.3,r=(o.y+c.y)/2+(c.y-o.y)*.2,d=r-Math.max(12,u*.5),f=u*.35*(t()<.5?-1:1);e.strokeStyle=a.crane,e.lineWidth=1.5,e.beginPath(),e.moveTo(n,r),e.lineTo(n,d),e.lineTo(n+f,d),e.moveTo(n+f*.8,d),e.lineTo(n+f*.8,d+Math.max(6,u*.15)),e.stroke()}return}let f=t.ageLens?j(i.lastTouchedAt??i.placedAt,r):void 0,p=n.style&&!t.ageLens&&t.tier!==`city`?{...n.style.material,urbanity:F(i),variance:(n.style.seed>>>8)%200/100-1}:void 0,m=P(i.lang,a,f,p),h=i.buildingCount>0?yn(t.model,i.id):Ar,g=Cr(t.tier,t.ageLens,h.length)?h:Ar;if(g.length>0){let n=kn(t.cam,i.rect,an);Mn(e,n,{top:a.sidewalk,wallL:m.wallL,wallR:m.wallR}),e.globalAlpha=.25,G(e,m.top,n.tn,n.te,n.ts,n.tw),e.globalAlpha=1,Pr(e,t,g,n.liftPx,i,m);return}let _=n.style??Me(i),v=t.ageLens?null:Mr(t,i,n,_);v?.behind&&Nr(e,t,v.prism,_,m),In(e,t,d,_,m,{suppressDetails:t.ageLens===!0}),v&&!v.behind&&Nr(e,t,v.prism,_,m),e.strokeStyle=m.edge,e.lineWidth=1,e.beginPath(),e.moveTo(d.tw.x,d.tw.y),e.lineTo(d.tn.x,d.tn.y),e.lineTo(d.te.x,d.te.y),e.stroke()}var Ar=[],jr=26;function Mr(e,t,n,r){let i=r.massing;if(i.kind===`none`||e.tier===`city`||(t.rect.w+t.rect.h)*e.cam.scale<jr)return null;let a={x:t.rect.x+t.rect.w*i.u0,y:t.rect.y+t.rect.h*i.v0,w:t.rect.w*(i.u1-i.u0),h:t.rect.h*(i.v1-i.v0)};return{prism:kn(e.cam,a,n.hIso*i.height),behind:i.behind}}function Nr(e,t,n,r,i){In(e,t,n,{...r,chimneys:0,dormers:0,awning:!1,cupola:!1,clock:!1,cap:`none`},i,{compact:!0,suppressDetails:t.ageLens===!0}),e.strokeStyle=i.edge,e.lineWidth=.8,e.beginPath(),e.moveTo(n.tw.x,n.tw.y),e.lineTo(n.tn.x,n.tn.y),e.lineTo(n.te.x,n.te.y),e.stroke()}function Pr(e,t,n,r,i,a){for(let o=0;o<n.length;o++){let s=n[o],c=kn(t.cam,s.rect,on(s.height)),l=-r,u={gn:Q(c.gn,l),ge:Q(c.ge,l),gs:Q(c.gs,l),gw:Q(c.gw,l),tn:Q(c.tn,l),te:Q(c.te,l),ts:Q(c.ts,l),tw:Q(c.tw,l),liftPx:c.liftPx},d=Ne(s,i);i.landmark&&o===n.length-1&&(d.roof=`hip`,d.cupola=!0,d.clock=!0);let f=t.ageLens||t.tier===`city`?a:P(i.lang,t.palette,void 0,{...d.material,urbanity:F(i),variance:(d.seed>>>8)%200/100-1});e.globalAlpha=.5+.45*s.height,In(e,t,u,d,f,{compact:!0,suppressDetails:t.ageLens===!0}),e.globalAlpha=1}}function Fr(e,t){let n=(n,r,i)=>{let a=t.geom.geoms.find(e=>e.block.id===n);if(!a||!U(t.cam,a,t.viewW,t.viewH))return;let o=kn(t.cam,a.block.rect,a.hIso);e.strokeStyle=r,e.lineWidth=i,jn(e,o),e.stroke()};t.hoverId&&t.hoverId!==t.selectedId&&n(t.hoverId,t.palette.hover,1.5),t.selectedId&&n(t.selectedId,t.palette.selected,2)}function Q(e,t){return{x:e.x,y:e.y+t}}function Ir(e,t,n){let r=cn(n),i=W(t,r.n.u,r.n.v),a=W(t,r.e.u,r.e.v),o=W(t,r.s.u,r.s.v),s=W(t,r.w.u,r.w.v);e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.lineTo(o.x,o.y),e.lineTo(s.x,s.y),e.closePath()}function Lr(e,t,n,r){let i=(t.x-(t.y+t.h)-e.offsetX)*e.scale,a=(t.x+t.w-t.y-e.offsetX)*e.scale,o=((t.x+t.y)/2-e.offsetY)*e.scale,s=((t.x+t.w+t.y+t.h)/2-e.offsetY)*e.scale;return a>=0&&s>=0&&i<=n&&o<=r}function Rr(e,t){let{cam:n,model:r,palette:i,viewW:a,viewH:o}=t;e.fillStyle=i.ground,e.fillRect(0,0,a,o);let s=new Set;for(let e of r.districts)e.parentId&&s.add(e.parentId);for(let c of r.districts)if(Lr(n,c.rect,a,o)){if(s.has(c.id)){e.strokeStyle=i.districtStroke,e.lineWidth=Math.max(.5,Math.min(2,3-c.depth*.4)),Ir(e,n,c.rect),e.stroke();continue}e.globalAlpha=.9,e.fillStyle=i.districtFill,Ir(e,n,c.rect),e.fill(),e.globalAlpha=1,t.tier!==`city`&&(e.strokeStyle=i.curb,e.lineWidth=1,Ir(e,n,c.rect),e.stroke())}for(let s of r.plazas??[])Lr(n,s.rect,a,o)&&(s.kind===`plaza`?(e.fillStyle=i.sidewalk,Ir(e,n,s.rect),e.fill(),t.tier===`street`&&(e.strokeStyle=i.domeAccent,e.globalAlpha=.55,e.lineWidth=1,Ir(e,n,s.rect),e.stroke(),e.globalAlpha=1)):(e.fillStyle=i.dark?`hsl(150 12% 15%)`:`hsl(90 26% 80%)`,Ir(e,n,s.rect),e.fill()));let c=r.streets??[];if(c.length>0){let s=t.tier===`city`?null:L(r),l=[i.pavementAvenue,i.pavementStreet,i.pavementLane,i.pavementLane],u=e=>{if(!s)return l[e.tier];let t=e.districtId?s.get(e.districtId):void 0;return t===`village`?i.dirtLane:t===`town`?i.cobble:l[e.tier]};for(let r=0;r<4&&!(t.tier===`city`&&r>1);r++){let t=new Map;for(let e of c){if(e.tier!==r||!Lr(n,e.rect,a,o))continue;let i=u(e),s=t.get(i);s?s.push(e):t.set(i,[e])}for(let[r,i]of t){e.fillStyle=r;for(let t of i)Ir(e,n,t.rect),e.fill()}}if(t.tier!==`city`){e.strokeStyle=i.avenueDash,e.lineWidth=Math.max(1,Math.min(2,.8*n.scale)),e.setLineDash([6*n.scale,6*n.scale]),e.beginPath();for(let t of c){if(t.tier!==0||!Lr(n,t.rect,a,o))continue;let r=t.rect,i=r.w>=r.h,s=i?{x:r.x+2,y:r.y+r.h/2}:{x:r.x+r.w/2,y:r.y+2},c=i?{x:r.x+r.w-2,y:r.y+r.h/2}:{x:r.x+r.w/2,y:r.y+r.h-2},l=W(n,s.x-s.y,(s.x+s.y)/2),u=W(n,c.x-c.y,(c.x+c.y)/2);e.moveTo(l.x,l.y),e.lineTo(u.x,u.y)}e.stroke(),e.setLineDash([])}}}function zr(){return{accepted:new Set,measure:new Map}}var Br=`12px ui-sans-serif, system-ui, sans-serif`,Vr=`13px ui-sans-serif, system-ui, sans-serif`,Hr=`11px ui-sans-serif, system-ui, sans-serif`,Ur=`10px ui-sans-serif, system-ui, sans-serif`,Wr=16,Gr=2.35,Kr=2.75,qr=18,Jr=28;function Yr(e,t,n,r){let i=`${n}|${r}`,a=t?.measure.get(i);if(a!==void 0)return a;e.font=n;let o=0;try{o=e.measureText(r).width}catch{o=r.length*6}return t&&(t.measure.size>8192&&t.measure.clear(),t.measure.set(i,o)),o}function Xr(e,t,n){return e<=t?0:e>=n?1:(e-t)/(n-t)}function Zr(e,t){let{cam:n,model:r,palette:i}=t,a=t.labels,o=[];for(let t of r.districts){if(t.displayLabel===void 0||(t.rect.w+t.rect.h)*n.scale<40)continue;let r=t.depth<=1?1-.85*Xr(n.scale,1.6,2.6):1-.85*Xr(n.scale,2,3.2);if(r<=.05)continue;let i=t.depth<=1?Vr:Br,s=Yr(e,a,i,t.displayLabel),c=t.labelPlate?{x:t.labelPlate.x,y:t.labelPlate.y}:{x:t.rect.x,y:t.rect.y},l=W(n,H(c.x,c.y).u,H(c.x,c.y).v);o.push({id:`d:${t.id}`,text:t.displayLabel,priority:3+t.depth,x:l.x,y:l.y-8,w:s+12,h:17,alpha:r,kind:`district`,font:i})}for(let r of t.geom.order){let i=t.geom.geoms[r],s=i.block;if(s.state===`tombstoned`||!U(n,i,t.viewW,t.viewH))continue;let c=s.id===t.selectedId,l=s.id===t.hoverId,u=s.landmark===!0;if(!c&&!l&&!u){if(t.tier!==`street`||s.rect.w*n.scale*2<44)continue;let r=.9*Xr(n.scale,1.2,1.6);if(r<=.05)continue;let i=Yr(e,a,Hr,s.label),c=W(n,H(s.rect.x+s.rect.w,s.rect.y+s.rect.h).u,H(s.rect.x+s.rect.w,s.rect.y+s.rect.h).v);o.push({id:`b:${s.id}`,text:s.label,priority:10,x:c.x-i/2,y:c.y+2,w:i,h:12,alpha:r,kind:`block`,font:Hr});continue}let d=Hr,f=Yr(e,a,d,s.label),p=H(s.rect.x+s.rect.w/2,s.rect.y+s.rect.h/2),m=W(n,p.u,p.v);o.push({id:`b:${s.id}`,text:s.label,priority:c?0:l?1:2,x:m.x-f/2,y:m.y-i.hIso*n.scale-18,w:f,h:13,alpha:1,kind:`landmark`,font:d})}let s=t.ageLens?0:Xr(n.scale,Gr,Kr);if(s>.05){let i=new Set(r.blocks.filter(e=>e.state===`live`&&!e.phantom&&e.buildingCount>0).map(e=>e.id));for(let c of r.buildings){if(!i.has(c.blockId)||(c.rect.w+c.rect.h)*n.scale<qr)continue;let r=_n(n,c);if(r.x<-80||r.x>t.viewW+80||r.y<-40||r.y>t.viewH+40)continue;let l=Qr(c.label),u=Yr(e,a,Ur,l),d=Math.min(180,Math.max(20,u+10)),f=Math.max(2,Math.min(t.viewW-d-2,r.x-d/2));o.push({id:`s:${c.id}`,text:l,priority:$r(c.kind,c.lines),x:f,y:r.y-Wr-5,w:d,h:Wr,alpha:s,kind:`symbol`,font:Ur,anchorX:r.x,anchorY:r.y})}}let c=e=>a?.accepted.has(e.id)?e.priority-.5:e.priority;o.sort((e,t)=>c(e)-c(t)||(e.id<t.id?-1:1));let l=[],u=new Set;for(let e of o){let t=a?.accepted.has(e.id)?2:0,n=!1;for(let r of l)if(e.x+t<r.x+r.w&&e.x+e.w-t>r.x&&e.y+t<r.y+r.h&&e.y+e.h-t>r.y){n=!0;break}n||(l.push(e),u.add(e.id))}a&&(a.accepted=u),e.textBaseline=`top`;for(let t of l)e.globalAlpha=t.alpha,e.font=t.font,t.kind===`district`?(e.fillStyle=i.labelPlate,V(e,t.x,t.y,t.w,t.h,3),e.fill(),e.strokeStyle=i.labelPlateStroke,e.lineWidth=1,V(e,t.x,t.y,t.w,t.h,3),e.stroke(),e.fillStyle=i.districtLabel,e.fillText(t.text,t.x+6,t.y+3,t.w-12)):t.kind===`symbol`?(e.strokeStyle=i.labelPlateStroke,e.lineWidth=.8,e.beginPath(),e.moveTo(Math.max(t.x+4,Math.min(t.x+t.w-4,t.anchorX??t.x+t.w/2)),t.y+t.h),e.lineTo(t.anchorX??t.x+t.w/2,t.anchorY??t.y+t.h+5),e.stroke(),e.fillStyle=i.labelPlate,V(e,t.x,t.y,t.w,t.h,3),e.fill(),e.strokeStyle=i.labelPlateStroke,V(e,t.x,t.y,t.w,t.h,3),e.stroke(),e.fillStyle=i.label,e.fillText(t.text,t.x+5,t.y+2,t.w-10)):t.kind===`landmark`?(e.strokeStyle=i.ground,e.lineWidth=3,e.strokeText(t.text,t.x,t.y,t.w+4),e.fillStyle=i.label,e.fillText(t.text,t.x,t.y,t.w+4),e.strokeStyle=i.districtLabel,e.lineWidth=1,e.beginPath(),e.moveTo(t.x+t.w/2,t.y+t.h+1),e.lineTo(t.x+t.w/2,t.y+t.h+5),e.stroke()):(e.strokeStyle=i.ground,e.lineWidth=3,e.strokeText(t.text,t.x,t.y,t.w+4),e.fillStyle=i.label,e.fillText(t.text,t.x,t.y,t.w+4));e.globalAlpha=1}function Qr(e){return e.length<=Jr?e:`${e.slice(0,Jr-1)}…`}function $r(e,t){let n=e.toLowerCase(),r=/function|method|constructor|procedure/.test(n)?0:/class|interface|struct|enum|trait|type/.test(n)?1:2,i=Math.min(.2,Math.max(0,t??0)/2e3);return 20+r-i}var ei={added:`#3fb950`,modified:`#d29922`,deleted:`#f85149`,renamed:`#a371f7`},ti=`#58a6ff`;function ni(e,t){let{cam:n,model:r,palette:i,viewW:a,viewH:o}=t;if(!r.overlay||r.overlay.changedBlocks.length===0)return;let s=new Map(r.overlay.changedBlocks.map(e=>[e.blockId,e])),c=new Map(t.geom.geoms.map(e=>[e.block.id,e]));if(e.fillStyle=i.ground,e.globalAlpha=.62,e.fillRect(0,0,a,o),e.globalAlpha=1,t.affectedIds&&t.affectedIds.size>0)for(let r of t.affectedIds){if(s.has(r))continue;let t=c.get(r);if(!t||!U(n,t,a,o))continue;let i=cn(t.block.rect),l=t.hIso*n.scale,u=[i.n,i.e,i.s,i.w].map(e=>{let t=W(n,e.u,e.v);return{x:t.x,y:t.y-l}});e.fillStyle=ti,e.globalAlpha=.18,ri(e,u),e.fill(),e.globalAlpha=.7,e.strokeStyle=ti,e.lineWidth=1,ri(e,u),e.stroke(),e.globalAlpha=1}for(let r of t.geom.geoms){let t=s.get(r.block.id);if(!t||!U(n,r,a,o))continue;let i=ei[t.change]??`#888888`,c=kn(n,r.block.rect,r.hIso);e.fillStyle=i,e.globalAlpha=r.block.phantom?.45:.85,jn(e,c),e.fill(),e.globalAlpha=1,e.save(),e.shadowColor=i,e.shadowBlur=8,e.strokeStyle=i,e.lineWidth=2,r.block.phantom&&e.setLineDash([4,3]),jn(e,c),e.stroke(),e.restore()}}function ri(e,t){e.beginPath(),e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);e.closePath()}var ii=40;function ai(e,t){let{cam:n,model:r,palette:i}=t;if(t.tier===`city`||r.roads.length===0)return;let a=new Map;for(let e of r.blocks)a.set(e.id,e.rect);if(t.selectedId){let o=Jt(r,t.selectedId,a);if(e.strokeStyle=i.selected,e.globalAlpha=.9,e.lineJoin=`round`,o){for(let t of o)if(!(t.points.length<2)){e.lineWidth=t.bidirectional?2.4:2,e.beginPath();for(let r=0;r<t.points.length;r++){let i=t.points[r],a=H(i.x,i.y),o=W(n,a.u,a.v);r===0?e.moveTo(o.x,o.y):e.lineTo(o.x,o.y)}e.stroke()}}else oi(e,t,t.selectedId,a,2,.9);e.globalAlpha=1}t.hoverId&&t.hoverId!==t.selectedId&&oi(e,t,t.hoverId,a,1.5,.35)}function oi(e,t,n,r,i,a){let{cam:o,model:s,palette:c}=t;e.strokeStyle=c.selected,e.globalAlpha=a,e.lineWidth=i;let l=0;e.beginPath();for(let t of s.roads){if(t.a!==n&&t.b!==n)continue;if(l>=ii)break;let i=r.get(t.a),a=r.get(t.b);if(!i||!a)continue;let s=H(i.x+i.w/2,i.y+i.h/2),c=H(a.x+a.w/2,a.y+a.h/2),u=W(o,s.u,s.v),d=W(o,c.u,c.v);e.moveTo(u.x,u.y),e.lineTo(d.x,d.y),l+=1}e.stroke(),e.globalAlpha=1}function si(e,t){e.save(),Rr(e,t),wr(e,t),Fr(e,t),ai(e,t),Zr(e,t),ni(e,t),e.restore()}var ci=[`tree1`,`tree2`,`tree3`,`shrub`,`weed`,`dryPatch`,`deadTree`,`rubble1`,`rubble2`],li=24,ui=new Map;function di(e,t){let n=t>1.5?2:1,r=`${e.dark?`dark`:`light`}|${n}`,i=ui.get(r);if(i!==void 0)return i;let a=fi(e,n*2);return ui.set(r,a),a}function fi(e,t){let n=li*t,r,i;try{r=document.createElement(`canvas`),r.width=n*ci.length,r.height=n,i=r.getContext(`2d`)}catch{return null}if(!i)return null;let a=e.dark?`hsl(135 28% 30%)`:`hsl(120 35% 52%)`,o=e.dark?`hsl(150 30% 24%)`:`hsl(95 38% 45%)`,s=e.dark?`hsl(140 24% 27%)`:`hsl(110 30% 60%)`,c=e.dark?`hsl(30 25% 25%)`:`hsl(30 35% 40%)`,l=e.dark?`hsl(60 20% 28%)`:`hsl(65 35% 55%)`,u=e.dark?`hsl(38 25% 30%)`:`hsl(42 45% 70%)`,d=e.dark?`hsl(30 12% 32%)`:`hsl(30 15% 45%)`,f={};ci.forEach((e,t)=>{f[e]=t});let p=(e,r)=>{i.save(),i.translate(e*n+n/2,n/2),i.scale(t,t),r(i),i.restore()},m=(e,t,n,r)=>{e.beginPath(),e.arc(t,n,r,0,Math.PI*2),e.fill()},h=(e,t,n)=>{e.fillStyle=c,e.fillRect(-1,2,2,6),e.fillStyle=t,m(e,0,-1,n),e.fillStyle=`rgba(255, 255, 255, 0.14)`,m(e,-n*.3,-1-n*.3,n*.45)};p(f.tree1,e=>h(e,a,7)),p(f.tree2,e=>h(e,o,6)),p(f.tree3,e=>{e.fillStyle=c,e.fillRect(-1,5,2,4),e.fillStyle=o;for(let[t,n]of[[7,5],[5.5,1],[4,-3]])e.beginPath(),e.moveTo(0,n-6),e.lineTo(-t,n),e.lineTo(t,n),e.closePath(),e.fill()}),p(f.shrub,e=>{e.fillStyle=s,m(e,-2.5,2,3.5),m(e,2.5,2,3),m(e,0,-1,3.5)}),p(f.weed,e=>{e.strokeStyle=l,e.lineWidth=1.2,e.beginPath();for(let[t,n]of[[-3,-1.5],[0,.5],[3,2]])e.moveTo(t,6),e.quadraticCurveTo(t+n,0,t+n*1.6,-4);e.stroke()}),p(f.dryPatch,e=>{e.fillStyle=u,e.beginPath(),e.ellipse(0,0,9,6,.4,0,Math.PI*2),e.fill(),e.fillStyle=`rgba(0, 0, 0, 0.08)`,e.beginPath(),e.ellipse(2,1,4,2.5,.2,0,Math.PI*2),e.fill()}),p(f.deadTree,e=>{e.strokeStyle=d,e.lineWidth=1.6,e.beginPath(),e.moveTo(0,8),e.lineTo(0,-2),e.moveTo(0,0),e.lineTo(-4,-5),e.moveTo(0,-2),e.lineTo(3,-7),e.moveTo(0,3),e.lineTo(4,-1),e.stroke()});let g=(t,n)=>{t.fillStyle=e.rubble;for(let[e,r,i]of n)t.fillRect(e,r,i,i)};return p(f.rubble1,e=>g(e,[[-6,-2,4],[-1,2,3],[3,-4,3.5],[4,3,2.5]])),p(f.rubble2,e=>g(e,[[-5,3,3],[-4,-5,2.5],[1,-1,4],[6,-4,2]])),{canvas:r,cell:n,index:f}}var $=n();function pi(){try{return window.localStorage.getItem(`gezel.mapRenderer`)===`flat`?`flat`:`iso`}catch{return`iso`}}function mi(e){return e.closest(`[data-theme="dark"]`)!=null||!e.closest(`[data-theme="light"]`)&&window.matchMedia?.(`(prefers-color-scheme: dark)`).matches}function hi({model:e,selectedId:t,onSelect:n,affectedIds:r,ageLens:i,renderer:a}){let o=(0,m.useRef)(null),s=(0,m.useRef)(null),c=(0,m.useRef)({scale:1,offsetX:0,offsetY:0}),l=(0,m.useRef)({w:0,h:0}),u=(0,m.useRef)(0),d=(0,m.useRef)(0),f=(0,m.useRef)(-1/0),p=(0,m.useRef)(!1),h=(0,m.useRef)(()=>!1),g=(0,m.useRef)(()=>{}),v=(0,m.useRef)(null),[y,S]=(0,m.useState)(null),[C,w]=(0,m.useState)(null),re=(0,m.useRef)(()=>{}),T=(0,m.useRef)(zr()),E=a??pi(),D=(0,m.useMemo)(()=>e.blocks.filter(e=>gt(e)!==null),[e]),ie=(0,m.useMemo)(()=>new Set(D.map(e=>e.id)),[D]);re.current=()=>{let n=s.current,a=n?.getContext(`2d`);if(!n||!a)return;let{w:o,h:u}=l.current,f=window.devicePixelRatio||1;a.setTransform(f,0,0,f,0,0);let p=se(mi(n)),m={cam:c.current,model:e,palette:p,tier:_(c.current.scale),viewW:o,viewH:u,selectedId:t,hoverId:y,atlas:di(p,f),animationTime:d.current,...r?{affectedIds:r}:{},...i?{ageLens:i}:{}};E===`iso`?si(a,{...m,geom:hn(e),labels:T.current}):Qt(a,m)},h.current=()=>{if(p.current||document.visibilityState!==`visible`||i||D.length===0||_(c.current.scale)===`city`)return!1;let{w:t,h:n}=l.current;return E===`iso`?hn(e).geoms.some(e=>ie.has(e.block.id)&&U(c.current,e,t,n)):D.some(e=>x(c.current,e.rect,t,n))},g.current=e=>{if(u.current=0,h.current()&&e-f.current<1e3/30){u.current=requestAnimationFrame(e=>g.current(e));return}f.current=e,d.current=p.current?0:e,re.current(),h.current()&&(u.current=requestAnimationFrame(e=>g.current(e)))};let O=(0,m.useCallback)(()=>{u.current||=requestAnimationFrame(e=>g.current(e))},[]);(0,m.useEffect)(()=>{let e=window.matchMedia?.(`(prefers-reduced-motion: reduce)`),t=()=>{p.current=e?.matches??!1,O()},n=()=>O();return t(),e?.addEventListener(`change`,t),document.addEventListener(`visibilitychange`,n),()=>{e?.removeEventListener(`change`,t),document.removeEventListener(`visibilitychange`,n)}},[O]),(0,m.useEffect)(()=>()=>{u.current&&cancelAnimationFrame(u.current),u.current=0},[]),(0,m.useEffect)(()=>{let e=o.current,t=s.current;if(!e||!t)return;let n=()=>{let n=e.getBoundingClientRect(),r=window.devicePixelRatio||1;l.current={w:n.width,h:n.height},t.width=Math.max(1,Math.round(n.width*r)),t.height=Math.max(1,Math.round(n.height*r)),t.style.width=`${n.width}px`,t.style.height=`${n.height}px`,O()};n();let r=new ResizeObserver(n);return r.observe(e),()=>r.disconnect()},[O]),(0,m.useEffect)(()=>{let{w:t,h:n}=l.current;c.current=E===`iso`?dn(e.bounds,hn(e).maxHIso,t||800,n||600):te(e.bounds,t||800,n||600),w(null),O()},[e,E,O]),(0,m.useEffect)(()=>{O()},[t,y,i,O]);let ae=(0,m.useCallback)((t,n)=>{let r=c.current;if(E===`iso`)return Sn(hn(e),r,t,n);let i=ee(r,t),a=b(r,n);for(let t=e.blocks.length-1;t>=0;t--){let n=e.blocks[t];if(i>=n.rect.x&&i<=n.rect.x+n.rect.w&&a>=n.rect.y&&a<=n.rect.y+n.rect.h)return n}return null},[e,E]),k=(0,m.useCallback)((t,n,r)=>!t||E!==`iso`||t.state===`tombstoned`||_(c.current.scale)!==`street`?null:xn(e,t.id,c.current,n,r),[e,E]);return(0,m.useEffect)(()=>{let e=s.current;if(!e)return;let t=t=>{t.preventDefault();let n=e.getBoundingClientRect(),r=Math.exp(-t.deltaY*.0015);c.current=ne(c.current,r,t.clientX-n.left,t.clientY-n.top),w(null),O()};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[O]),(0,$.jsxs)(`div`,{ref:o,className:`filemap-canvas-wrap`,children:[(0,$.jsx)(`canvas`,{ref:s,className:`filemap-canvas`,onPointerDown:e=>{e.target.setPointerCapture(e.pointerId),v.current={x:e.clientX,y:e.clientY},w(null)},onPointerMove:e=>{let t=e.currentTarget.getBoundingClientRect();if(v.current){let t=e.clientX-v.current.x,n=e.clientY-v.current.y;v.current={x:e.clientX,y:e.clientY};let r=c.current;c.current={...r,offsetX:r.offsetX-t/r.scale,offsetY:r.offsetY-n/r.scale},O();return}let n=e.clientX-t.left,r=e.clientY-t.top,i=ae(n,r);S(i?.id??null);let a=k(i,n,r);w(e=>{if(!a)return e===null?e:null;if(e?.building===a)return e;let t=_n(c.current,a);return{building:a,x:t.x,y:t.y}})},onPointerUp:e=>{let t=v.current;v.current=null;let r=e.currentTarget.getBoundingClientRect();if(t){let t=e.clientX-r.left,i=e.clientY-r.top,a=ae(t,i);n(a,k(a,t,i))}},onPointerLeave:()=>{S(null),w(null)},style:{cursor:v.current?`grabbing`:y?`pointer`:`grab`,touchAction:`none`}}),C&&(0,$.jsxs)(`div`,{className:`filemap-symtip`,style:{left:C.x,top:C.y},children:[(0,$.jsx)(`strong`,{children:C.building.label}),(0,$.jsxs)(`span`,{children:[C.building.kind,C.building.lines===void 0?``:` · ${C.building.lines} ${C.building.lines===1?`line`:`lines`}`]})]})]})}var gi={tsx:`typescript`,jsx:`javascript`,c:`cpp`,c_sharp:`csharp`,bash:`shell`,text:`plaintext`,toml:`ini`,properties:`ini`,yml:`yaml`};function _i(e){let t=e?.trim().toLowerCase();if(t)return gi[t]??t}var vi=o(`filemap`),yi=()=>void 0;function bi(e){let t=e.line==null?``:` (Line ${e.line})`;return`[${e.severity}] ${e.category} — ${e.message}${t}`}function xi(e){let t=e.slice(0,4096);if(!t)return!1;let n=0;for(let e=0;e<t.length;e++){let r=t.charCodeAt(e);(r===65533||r<9||r>13&&r<32)&&n++}return n/t.length>.1}var Si={added:`added`,modified:`modified`,deleted:`deleted`,renamed:`renamed`},Ci={residential:`residential`,commercial:`commercial`,civic:`civic landmark`,industrial:`industrial`},wi={lush:`lush`,tidy:`tidy`,plain:`plain`,scruffy:`scruffy`,blighted:`blighted`},Ti=[{value:`core`,label:`Code`},{value:`tests`,label:`Tests`},{value:`all`,label:`All`}];function Ei({projectId:e}){let[t,n]=(0,m.useState)(null),[o,l]=(0,m.useState)(!1),[u,f]=(0,m.useState)(null),[h,g]=(0,m.useState)(null),[_,v]=(0,m.useState)(null),[y,ee]=(0,m.useState)(`core`),[b,te]=(0,m.useState)([]),[ne,x]=(0,m.useState)(null),[S,C]=(0,m.useState)(!1),[w,re]=(0,m.useState)(()=>pi()),[T,E]=(0,m.useState)(null),[D,ie]=(0,m.useState)([]),[O,ae]=(0,m.useState)(!1),[k,A]=(0,m.useState)(null),[oe,se]=(0,m.useState)(null),[j,M]=(0,m.useState)(null),[ce,le]=(0,m.useState)(0),[N,ue]=(0,m.useState)(null),[de,fe]=(0,m.useState)(!1),[pe,me]=(0,m.useState)(!1),[he,ge]=(0,m.useState)(!1),[_e,P]=(0,m.useState)(null),F=(0,m.useRef)(new Map),I=(0,m.useCallback)((e,t=1)=>{if(e&&window.__GEZEL__?.openWorkspaceFile){window.__GEZEL__.openWorkspaceFile(e.id,Math.max(1,t));return}g(e),v(e?{path:e.id,line:Math.max(1,t)}:null)},[]),ve=(0,m.useCallback)((e,t)=>{I(e,t?.lineStart??1)},[I]),L=h?.id??null;(0,m.useEffect)(()=>{if(ge(!1),!L){E(null);return}let t=!1;return E({path:L,kind:`loading`}),c.readProjectWorkspaceFile(e,L).then(e=>{t||E(xi(e.content)?{path:L,kind:`binary`}:{path:L,kind:`ready`,content:e.content})}).catch(e=>{t||E({path:L,kind:`error`,error:e instanceof Error?e.message:String(e)})}),()=>{t=!0}},[L,e]),(0,m.useEffect)(()=>{if(!L){ie([]),A(null),M(null);return}let t=!1;return ae(!0),M(null),c.toolScanFindings(e,{path:L,maxResults:100}).then(e=>{if(t)return;let n=e.findings.filter(e=>e.path===L);ie(n),A(e=>e&&n.some(t=>t.fingerprint===e)?e:n[0]?.fingerprint??null);let r=n.find(e=>e.line!=null)?.line;r&&v({path:L,line:r})}).catch(e=>{t||(ie([]),M(e instanceof Error?e.message:String(e)))}).finally(()=>{t||ae(!1)}),()=>{t=!0}},[L,e,ce]),(0,m.useEffect)(()=>{if(!L){ue(null),fe(!1),me(!1);return}let t=!1;return ue(null),fe(!1),me(!1),c.toolFileReview(e,{path:L}).then(e=>{t||(ue(e.review??null),fe(e.pending===!0),me(e.eligible===!1))}).catch(e=>{t||vi.debug(`file-review unavailable`,e)}),()=>{t=!0}},[L,e]),(0,m.useEffect)(()=>{if(!L){P(null);return}let t=F.current.get(L);if(t){P({path:L,value:t});return}let n=!1;return P(null),c.toolFileContext(e,{path:L}).then(e=>{if(n)return;let t=i(e);if(F.current.size>=20){let e=F.current.keys().next().value;e!==void 0&&F.current.delete(e)}F.current.set(L,t),P({path:L,value:t})}).catch(e=>{n||vi.debug(`file-context unavailable`,e)}),()=>{n=!0}},[L,e,ce]);let R=(0,m.useCallback)(()=>{l(!0),f(null),F.current.clear(),c.toolFileMap(e,{scope:y,...ne?{pr:ne}:{}}).then(e=>{n(e),g(t=>t?e.blocks.find(e=>e.id===t.id)??null:null)}).catch(e=>f(e instanceof Error?e.message:String(e))).finally(()=>l(!1))},[e,y,ne]);(0,m.useEffect)(()=>{I(null),R()},[R,I]),(0,m.useEffect)(()=>{let t=!1;return c.listProjectGitHubPulls(e).then(e=>{t||te(e.pulls)}).catch(()=>{t||te([])}),()=>{t=!0}},[e]);let z=(0,m.useMemo)(()=>new Map((t?.overlay?.changedBlocks??[]).map(e=>[e.blockId,e])),[t]),ye=(0,m.useMemo)(()=>{let e=t?.overlay;if(!t||!e||e.changedBlocks.length===0)return;let n=new Map,r=(e,t)=>{let r=n.get(e);r?r.push(t):n.set(e,[t])};for(let e of t.roads)r(e.b,e.a),e.bidirectional&&r(e.a,e.b);let i=new Set(e.changedBlocks.map(e=>e.blockId)),a=new Set,o=[...i];for(let e=0;e<3&&o.length>0;e++){let e=[];for(let t of o)for(let r of n.get(t)??[])i.has(r)||a.has(r)||(a.add(r),e.push(r));o=e}return a.size>0?a:void 0},[t]),be=(0,m.useMemo)(()=>{if(!t)return null;let e=t.blocks.filter(e=>e.state!==`tombstoned`&&!e.phantom);return{files:e.length,folders:t.districts.length,roads:t.roads.length,symbols:e.reduce((e,t)=>e+t.buildingCount,0)}},[t]),xe=(0,m.useMemo)(()=>{if(!h||!t)return[];let e=new Set;for(let n of t.roads)n.a===h.id?e.add(n.b):n.b===h.id&&e.add(n.a);let n=new Map(t.blocks.map(e=>[e.id,e]));return[...e].sort().map(e=>n.get(e)).filter(e=>!!e)},[h,t]),Se=(0,m.useCallback)(e=>{let n=a(e);if(n?.kind!==`file`||!t)return!1;let r=t.blocks.find(e=>e.id===n.path);return r&&I(r,n.line),!0},[t,I]),Ce=(0,m.useCallback)(e=>{A(e.fingerprint),e.line!=null&&v({path:e.path,line:e.line})},[]),we=(0,m.useCallback)(async t=>{se({fingerprint:t.fingerprint,kind:`resolve`}),M(null);try{await c.resolveSecurityFinding(e,{fingerprint:t.fingerprint}),ie(e=>e.filter(e=>e.fingerprint!==t.fingerprint)),A(null),F.current.delete(t.path),le(e=>e+1),R()}catch(e){M(e instanceof Error?e.message:String(e))}finally{se(null)}},[R,e]),Te=(0,m.useCallback)(async t=>{se({fingerprint:t.fingerprint,kind:`delegate`}),M(null);try{let n=await c.delegateSecurityFinding(e,{fingerprint:t.fingerprint});ie(e=>e.map(e=>e.fingerprint===t.fingerprint?n.finding:e)),A(t.fingerprint)}catch(e){M(e instanceof Error?e.message:String(e))}finally{se(null)}},[e]);(0,m.useEffect)(()=>{let e=[...new Set(D.flatMap(e=>e.taskRef?[e.taskRef]:[]))];if(e.length===0)return;let t=!1,n=async()=>{let n=await Promise.all(e.map(e=>c.getTaskByRef(e).catch(()=>null)));t||n.some(e=>e?.status===`complete`||e?.status===`canceled`)&&(F.current.clear(),le(e=>e+1),R())},r=window.setInterval(()=>void n(),5e3);return n(),()=>{t=!0,window.clearInterval(r)}},[D,R]);let Ee=N?s(N):null;return(0,$.jsxs)(`section`,{className:`filemap-view`,children:[(0,$.jsxs)(`header`,{className:`filemap-header`,children:[(0,$.jsxs)(`div`,{className:`filemap-title`,children:[(0,$.jsx)(`strong`,{children:`Village`}),be&&(0,$.jsxs)(`span`,{className:`filemap-stats`,children:[be.files,` files · `,be.folders,` neighborhoods · `,be.roads,` roads ·`,` `,be.symbols,` symbols`]}),t?.overlay&&(0,$.jsxs)(`span`,{className:`filemap-overlay-stat`,children:[`PR #`,t.overlay.prNumber,` · `,t.overlay.changedBlocks.length,` changed`,ye?` · ${ye.size} affected`:``]})]}),(0,$.jsxs)(`div`,{className:`filemap-actions`,children:[b.length>0&&(0,$.jsxs)(`select`,{className:`filemap-pr`,"aria-label":`Overlay a pull request`,value:ne??``,onChange:e=>x(e.target.value?Number(e.target.value):null),children:[(0,$.jsx)(`option`,{value:``,children:`No PR overlay`}),b.map(e=>(0,$.jsxs)(`option`,{value:e.number,children:[`#`,e.number,` `,e.title]},e.number))]}),(0,$.jsx)(`fieldset`,{className:`filemap-scope`,"aria-label":`Village scope`,children:Ti.map(e=>(0,$.jsx)(`button`,{type:`button`,className:y===e.value?`active`:``,"aria-pressed":y===e.value,onClick:()=>ee(e.value),children:e.label},e.value))}),(0,$.jsx)(`fieldset`,{className:`filemap-scope`,"aria-label":`Color lens`,children:(0,$.jsx)(`button`,{type:`button`,className:S?`active`:``,"aria-pressed":S,title:`Color blocks by how recently they were added — the evolution lens`,onClick:()=>C(e=>!e),children:`Age`})}),(0,$.jsx)(`fieldset`,{className:`filemap-scope`,"aria-label":`Renderer`,children:(0,$.jsx)(`button`,{type:`button`,className:w===`iso`?`active`:``,"aria-pressed":w===`iso`,title:`Isometric village view; toggle off for the flat top-down plan`,onClick:()=>re(e=>{let t=e===`iso`?`flat`:`iso`;try{window.localStorage.setItem(`gezel.mapRenderer`,t)}catch{}return t}),children:`3D`})}),(0,$.jsx)(`button`,{type:`button`,className:`filemap-refresh`,onClick:R,disabled:o,children:o?`Building…`:`Rebuild`})]})]}),(0,$.jsx)(`div`,{className:`filemap-body`,children:u?(0,$.jsxs)(`div`,{className:`filemap-empty`,children:[`Couldn’t build the village: `,u]}):t&&!t.indexed?(0,$.jsx)(`div`,{className:`filemap-empty`,children:`This project hasn’t been indexed yet. The village appears once the workspace has been scanned.`}):t&&t.blocks.length===0&&!o?(0,$.jsx)(`div`,{className:`filemap-empty`,children:y===`tests`?`No test files found.`:`No files to build a village from yet.`}):t?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(hi,{model:t,selectedId:h?.id??null,onSelect:ve,...ye?{affectedIds:ye}:{},renderer:w,ageLens:S}),h?(0,$.jsxs)(`aside`,{className:`filemap-inspector filemap-fileview open`,children:[(0,$.jsxs)(`header`,{className:`filemap-fileview-head`,children:[(0,$.jsxs)(`div`,{className:`filemap-fileview-titlerow`,children:[(0,$.jsx)(`span`,{className:`filemap-fileview-name`,title:h.id,children:h.label}),(0,$.jsxs)(`div`,{className:`filemap-fileview-actions`,children:[xe.length>0&&(0,$.jsxs)(`button`,{type:`button`,className:`filemap-fileview-connected-btn`,"aria-expanded":he,onClick:()=>ge(e=>!e),children:[(0,$.jsxs)(`span`,{children:[`Connected (`,xe.length,`)`]}),(0,$.jsx)(r,{})]}),(0,$.jsx)(`button`,{type:`button`,className:`filemap-fileview-close`,onClick:()=>I(null),"aria-label":`Close`,children:`×`})]}),he&&xe.length>0&&(0,$.jsx)(`div`,{className:`filemap-fileview-menu`,children:(0,$.jsx)(`ul`,{children:xe.slice(0,60).map(e=>(0,$.jsx)(`li`,{children:(0,$.jsx)(`button`,{type:`button`,title:e.id,onClick:()=>{I(e),ge(!1)},children:e.label})},e.id))})})]}),(0,$.jsxs)(`div`,{className:`filemap-fileview-stats`,children:[(0,$.jsx)(`span`,{className:`filemap-fileview-path`,children:h.id}),(0,$.jsxs)(`span`,{className:`filemap-chip`,children:[Math.round(h.weight),` lines`]}),(0,$.jsxs)(`span`,{className:`filemap-chip`,children:[h.buildingCount,` symbols`]}),h.lang&&(0,$.jsx)(`span`,{className:`filemap-chip`,children:h.lang}),w===`iso`&&(0,$.jsx)(`span`,{className:`filemap-chip`,children:Fe(Me(h))}),h.health&&(0,$.jsxs)(`span`,{className:`filemap-chip`,children:[Ci[h.health.zone],` · `,wi[h.health.vibe]]}),h.health&&(0,$.jsxs)(`span`,{className:`filemap-chip`,children:[`↓`,h.health.fanIn,` imported`]}),h.health&&(0,$.jsxs)(`span`,{className:`filemap-chip`,children:[`↑`,h.health.fanOut,` imports`]}),h.health&&h.health.findings>0&&(0,$.jsxs)(`span`,{className:`filemap-chip filemap-chip-warn`,children:[h.health.findings,` finding`,h.health.findings>1?`s`:``,h.health.maxSeverity?` (max ${h.health.maxSeverity})`:``]}),h.placedAt&&(0,$.jsxs)(`span`,{className:`filemap-chip`,children:[`since `,h.placedAt.slice(0,10)]}),z.get(h.id)&&(0,$.jsxs)(`span`,{className:`filemap-chip`,children:[`PR: `,Si[z.get(h.id).change],` `,(0,$.jsxs)(`span`,{className:`filemap-add`,children:[`+`,z.get(h.id).additions]}),` `,(0,$.jsxs)(`span`,{className:`filemap-del`,children:[`−`,z.get(h.id).deletions]})]})]})]}),(O||D.length>0||j)&&(0,$.jsxs)(`section`,{className:`filemap-findings`,"aria-label":`Findings in this file`,children:[(0,$.jsxs)(`div`,{className:`filemap-findings-heading`,children:[(0,$.jsxs)(`strong`,{children:[D.length,` open finding`,D.length===1?``:`s`]}),O&&(0,$.jsx)(`span`,{children:`Checking…`})]}),D.map(e=>{let t=e.fingerprint===k,n=oe?.fingerprint===e.fingerprint&&oe.kind===`resolve`,r=oe?.fingerprint===e.fingerprint&&oe.kind===`delegate`;return(0,$.jsxs)(`article`,{className:`filemap-finding-card${t?` active`:``}`,"data-severity":e.severity,children:[(0,$.jsxs)(`button`,{type:`button`,className:`filemap-finding-summary`,"aria-pressed":t,onClick:()=>Ce(e),children:[(0,$.jsx)(`span`,{className:`filemap-finding-severity`,children:e.severity}),(0,$.jsx)(`strong`,{children:e.title}),(0,$.jsx)(`span`,{className:`filemap-finding-location`,children:e.line==null?`Whole file`:`Line ${e.line}`})]}),t&&(0,$.jsxs)(`div`,{className:`filemap-finding-detail`,children:[e.evidence&&(0,$.jsx)(`code`,{children:e.evidence}),(0,$.jsxs)(`span`,{children:[e.source,` · `,e.ruleId,` · `,e.category]}),e.taskRef&&(0,$.jsxs)(`span`,{className:`filemap-finding-task`,children:[`Developer gezel working ·`,` `,(0,$.jsx)(`button`,{type:`button`,className:`link-button filemap-finding-task-link`,"aria-label":`Open task ${e.taskRef}`,onClick:()=>d({kind:`task`,ref:e.taskRef}),children:e.taskRef})]}),(0,$.jsxs)(`div`,{className:`filemap-finding-actions`,children:[(0,$.jsx)(`button`,{type:`button`,onClick:()=>void we(e),disabled:oe!=null,children:n?`Resolving…`:`Mark resolved`}),(0,$.jsx)(`button`,{type:`button`,onClick:()=>void Te(e),disabled:oe!=null||e.status===`in_progress`,children:r?`Finding a developer…`:e.status===`in_progress`?`Developer working`:`Ask a developer gezel`})]})]})]},e.fingerprint)}),j&&(0,$.jsx)(`p`,{className:`filemap-finding-error error`,children:j})]}),(N||de||pe)&&(0,$.jsx)(`section`,{className:`filemap-review`,"aria-label":`Boekwachter review`,children:N?(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{className:`filemap-review-heading`,children:[(0,$.jsxs)(`strong`,{children:[`Boekwachter review · `,N.health,`/10`]}),(0,$.jsx)(`span`,{className:`filemap-review-reason`,children:N.healthReason})]}),N.notesMd&&(0,$.jsx)(`div`,{className:`filemap-review-notes`,children:(0,$.jsx)(p,{value:N.notesMd,readOnly:!0,minHeight:`0`,onCommit:yi},`${h.id}:review-notes`)}),N.issues.length>0&&(0,$.jsx)(`ul`,{className:`filemap-review-issues`,children:N.issues.map((e,t)=>{let n=e.line;return(0,$.jsx)(`li`,{children:n==null?(0,$.jsx)(`span`,{className:`filemap-review-issue`,children:bi(e)}):(0,$.jsx)(`button`,{type:`button`,className:`filemap-review-issue`,onClick:()=>v({path:h.id,line:n}),children:bi(e)})},`${e.category}:${e.message}:${t}`)})}),(0,$.jsx)(`p`,{className:`filemap-review-advice`,children:`Leads from a background model pass — its opinion, not a verdict.`}),Ee&&(0,$.jsx)(`p`,{className:`filemap-review-provenance`,children:Ee})]}):pe?(0,$.jsx)(`p`,{className:`filemap-review-pending`,children:`This file type isn’t reviewed.`}):(0,$.jsx)(`p`,{className:`filemap-review-pending`,children:`Not reviewed yet — the boekwachter studies files when idle or during Night Shift.`})}),(0,$.jsx)(`div`,{className:`filemap-fileview-body`,children:!T||T.kind===`loading`?(0,$.jsxs)(`div`,{className:`filemap-empty`,children:[`Loading `,h.label,`…`]}):T.kind===`error`?(0,$.jsxs)(`div`,{className:`filemap-empty`,children:[`Couldn’t read this file: `,T.error]}):T.kind===`binary`?(0,$.jsx)(`div`,{className:`filemap-empty`,children:`Binary file — no preview.`}):(0,$.jsx)(Di,{path:T.path,content:T.content,language:_i(h.lang),sourceReveal:_?.path===T.path?_:void 0,findings:D,activeFinding:k,codeContext:_e?.path===T.path?_e.value:null,onContextLink:Se})})]}):(0,$.jsx)(`p`,{className:`filemap-hint filemap-hint-float`,children:`Scroll to zoom, drag to pan. Each building is a file; click one to open it.`})]}):(0,$.jsx)(`div`,{className:`filemap-empty`,children:o?`Building the village…`:``})})]})}function Di({path:e,content:t,language:n,sourceReveal:r,findings:i,activeFinding:a,codeContext:o,onContextLink:s}){let c=f(),l=(0,m.useMemo)(()=>{if(!(!o||o.sections.length===0&&!o.fileTop))return{...o.fileTop?{fileTop:o.fileTop}:{},sections:o.sections,linkSchemes:[`gezel-nav`],onLinkClick:e=>s(e)}},[o,s]);return(0,$.jsx)(u,{initialMarkdown:t,fileName:e,language:n,height:`100%`,colorScheme:c,showPlayTab:!1,showStatusBar:!1,toolbarSlotLeft:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(Oi,{request:r}),(0,$.jsx)(ki,{findings:i,activeFinding:a})]}),fullWidth:!0,readOnly:!0,...l?{codeContext:l}:{}},e)}function Oi({request:e}){let{monacoEditor:t}=l();return(0,m.useEffect)(()=>{if(!t||!e)return;let n=t.getModel();if(!n)return;let r=Math.min(e.line,n.getLineCount());t.setPosition({lineNumber:r,column:1}),t.revealLineInCenter(r)},[t,e]),null}function ki({findings:e,activeFinding:t}){let{monacoEditor:n}=l(),r=(0,m.useRef)([]);return(0,m.useEffect)(()=>{if(!n)return;let i=n.getModel();if(!i)return;let a=new Map;for(let n of e){if(n.line==null)continue;let e=Math.min(n.line,i.getLineCount());a.set(e,a.get(e)===!0||n.fingerprint===t)}return r.current=n.deltaDecorations(r.current,[...a].map(([e,t])=>({range:{startLineNumber:e,startColumn:1,endLineNumber:e,endColumn:i.getLineMaxColumn(e)},options:{isWholeLine:!0,className:t?`filemap-finding-line-active`:`filemap-finding-line`,linesDecorationsClassName:t?`filemap-finding-gutter-active`:`filemap-finding-gutter`}}))),()=>{r.current=n.deltaDecorations(r.current,[])}},[t,e,n]),null}export{Ei as FileMapView,bi as reviewIssueLabel};
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,t as n}from"./jsx-runtime-CEpd2cAX.js";import{i as r,n as i,r as a}from"./Tabs-BAY1Q79B.js";import{F as o,I as s,M as c,N as l,P as u,d,j as f,k as p,l as m,m as h,p as g,s as _}from"./primitives-DEsn1shf.js";import{Ct as v,Ht as y,Q as b,R as x,f as S,g as C,gn as w,l as ee,m as T,r as E,st as D,t as O}from"./dist-BPx-FyRH.js";import{t as k}from"./dist-D5aoNQwk.js";import{t as A}from"./api-BX5xXiFs.js";import{n as j,t as M}from"./poppetje-Ce-02Aqi.js";import{t as N}from"./ConfirmDialog-BHFs6vmJ.js";import{n as te}from"./styles-CKr_yrbn.js";import{Dt as P,Et as ne,G as F,Lt as I,Mt as L,b as R,ft as re,pt as ie,u as ae,v as oe,wt as z}from"./index-DXWR4qW1.js";import{i as B,t as V}from"./ChatTimelineView-Do9EryEH.js";import{t as H}from"./SessionSwitcher-C8te7YSe.js";import{t as se}from"./ProjectTimeline-DRe3D9qY.js";import{c as U,l as ce,n as le,o as ue,r as de,s as fe}from"./chat-thread-memory-CZGcwgGo.js";import{t as pe}from"./ToolsetsEditor-BdxHnIBj.js";import{t as me}from"./TransformToolbarButton-CVg5nz36.js";import{t as he}from"./MemoriesTree-BKZEPJpm.js";import{t as ge}from"./markdown-baseline-HMqF2ChK.js";import{t as _e}from"./ds4-availability-TaGRbP_O.js";import{i as ve,t as ye}from"./ModelPicker-CCBVjLMS.js";var W=e(t(),1),G=n();function be({gezel:e,onUpdated:t}){let n=e.fixedFunction,r=n?.defaults?JSON.stringify(n.defaults,null,2):``,[i,a]=(0,W.useState)(r),[o,s]=(0,W.useState)(null),[c,l]=(0,W.useState)(null),[u,d]=(0,W.useState)(!1),[f,p]=(0,W.useState)(!1);(0,W.useEffect)(()=>{a(r),p(!1),s(null),l(null)},[e.id]);let m=(0,W.useCallback)(async()=>{s(null),l(null);let n=null;if(i.trim())try{let e=JSON.parse(i);if(e===null||Array.isArray(e)||typeof e!=`object`)throw Error(`defaults must be a JSON object`);n=e}catch(e){s(`Invalid JSON: ${e.message}`);return}d(!0);try{t(await A.updateGezelFixedFunctionDefaults(e.id,{defaults:n&&Object.keys(n).length>0?n:null})),p(!1),l(`Saved`)}catch(e){s(`Save failed: ${e.message}`)}finally{d(!1)}},[i,e.id,t]);return n?(0,G.jsxs)(`div`,{className:`ff-about-panel`,children:[(0,G.jsxs)(`div`,{className:`ff-about-summary`,children:[(0,G.jsxs)(`div`,{className:`ff-about-row`,children:[(0,G.jsx)(`span`,{className:`ff-label`,children:`Forwards to`}),(0,G.jsx)(`code`,{className:`ff-tool-name`,children:n.tool}),(0,G.jsx)(`span`,{className:`muted small`,children:`— no LLM is invoked`})]}),(0,G.jsxs)(`div`,{className:`ff-about-row`,children:[(0,G.jsx)(`span`,{className:`ff-label`,children:`Argument`}),(0,G.jsxs)(`span`,{children:[`Your message text is passed as `,(0,G.jsx)(`code`,{children:n.promptKey}),`.`]})]}),e.description&&(0,G.jsx)(`p`,{className:`muted`,children:e.description})]}),(0,G.jsxs)(`div`,{className:`ff-defaults`,children:[(0,G.jsx)(`label`,{className:`ff-defaults-label`,htmlFor:`ff-defaults-${e.id}`,children:`Default arguments`}),(0,G.jsxs)(`p`,{className:`muted small ff-defaults-help`,children:[`Merged into every call as JSON. Your message text on `,(0,G.jsx)(`code`,{children:n.promptKey}),` always wins over a collision here. Common keys for `,(0,G.jsx)(`code`,{children:n.tool}),`: `,(0,G.jsx)(`code`,{children:`width`}),`,`,` `,(0,G.jsx)(`code`,{children:`height`}),`, `,(0,G.jsx)(`code`,{children:`steps`}),`, `,(0,G.jsx)(`code`,{children:`model`}),`, `,(0,G.jsx)(`code`,{children:`negativePrompt`}),`. Leave empty to forward only the prompt.`]}),(0,G.jsx)(`textarea`,{id:`ff-defaults-${e.id}`,className:`ff-defaults-textarea`,value:i,spellCheck:!1,rows:10,placeholder:`{\\n "width": 1024,\\n "height": 1024\\n}`,onChange:e=>{a(e.target.value),p(!0),l(null)},disabled:u}),(0,G.jsxs)(`div`,{className:`ff-defaults-actions`,children:[(0,G.jsx)(`button`,{type:`button`,className:`primary`,onClick:()=>void m(),disabled:u||!f,children:u?`Saving…`:`Save defaults`}),c&&(0,G.jsx)(`span`,{className:`muted small`,children:c}),o&&(0,G.jsx)(`span`,{className:`error small`,children:o})]})]})]}):null}function xe({gezelId:e,activeSessionId:t,onFocusSession:n,onToolActivity:r,onArtifactReference:i,onArtifactSeen:a,onWorkspaceReference:o,onWorkspaceSeen:s,onOpenReference:c,onTaskReference:l,emptyPlaceholder:u}){let d=(0,W.useCallback)(t=>A.listGezelTimeline(e,t),[e]),f=(0,W.useCallback)(()=>A.gezelEventsUrl(e),[e]),p=(0,W.useMemo)(()=>({gezelId:e}),[e]);return(0,G.jsx)(V,{scopeKey:`gezel:${e}`,activeSessionId:t,onFocusSession:n,onToolActivity:r,onArtifactReference:i,onArtifactSeen:a,onWorkspaceReference:o,onWorkspaceSeen:s,onOpenReference:c,...l?{onTaskReference:l}:{},emptyPlaceholder:u,loadTimeline:d,streamUrl:f,inflightScope:p})}var K=`__ALL__`,Se=`gezel:chat:last-project:`;function Ce(e){try{return window.localStorage.getItem(`${Se}${e}`)??void 0}catch{return}}function we({projects:e,intentProjectId:t,lastProjectId:n,workingProjectIds:r}){if(t)return e.find(e=>e.projectId===t)?.projectId??t;if(n&&r?.has(n))return n;let i=e.find(e=>r?.has(e.projectId));return i?i.projectId:n===K||e.some(e=>e.projectId===n)?n:e[0]?.projectId}function Te(e,t){return e.find(e=>t?.has(e.projectId))?.projectId}function Ee({gezel:e,engineLabel:t,workingProjectIds:n,activeTurnsReady:r=!0}){let[i,a]=(0,W.useState)(null),[o,s]=(0,W.useState)(``),[c,l]=(0,W.useState)(``),[u,f]=(0,W.useState)(null),p=(0,W.useRef)(0),v=(0,W.useCallback)((e,t)=>{p.current+=1,f({sessionId:e,requestKey:p.current,...t===void 0?{}:{messageIndex:t}})},[]),y=(0,W.useRef)(n),b=(0,W.useRef)(r),x=(0,W.useRef)(!1),S=(0,W.useRef)(!1);return y.current=n,b.current=r,(0,W.useEffect)(()=>{let t=!1;a(null),s(``),x.current=!1,S.current=!1;let n=F(e.id);return n&&(x.current=!0,S.current=!0,l(n.sessionId),v(n.sessionId,n.messageIndex)),A.listProjectsForGezel(e.id).then(r=>{if(t)return;a(r.projects);let i=we({projects:r.projects,intentProjectId:n?.projectId,lastProjectId:Ce(e.id),workingProjectIds:b.current?y.current:void 0});i&&s(i)}).catch(()=>{t||a([])}),()=>{t=!0}},[e.id,v]),(0,W.useEffect)(()=>{if(!r||i===null||!o||x.current||S.current||(x.current=!0,n?.has(o)))return;let e=Te(i,n);e&&s(e)},[r,i,o,n]),(0,W.useEffect)(()=>{if(o)try{window.localStorage.setItem(`${Se}${e.id}`,o)}catch{}},[e.id,o]),(0,W.useEffect)(()=>{let t=t=>{let n=t.detail;!n||n.gezelId!==e.id||(x.current=!0,S.current=!0,n.projectId&&s(n.projectId),l(n.sessionId),v(n.sessionId,n.messageIndex))};return window.addEventListener(`gezel:open-session`,t),()=>window.removeEventListener(`gezel:open-session`,t)},[e.id,v]),(0,W.useEffect)(()=>{let t=t=>{if(t.detail?.gezelId!==e.id||i===null)return;let r=Te(i,n);r&&(x.current=!0,S.current=!1,s(r))};return window.addEventListener(`gezel:prefer-working-project`,t),()=>window.removeEventListener(`gezel:prefer-working-project`,t)},[e.id,i,n]),(0,W.useEffect)(()=>{o&&o!=="default"&&o!==K&&window.dispatchEvent(new CustomEvent(`gezel:open-tab`,{detail:{kind:`project`,id:o,activate:!1}}))},[o]),i===null?(0,G.jsx)(`p`,{className:`muted small`,children:`Loading projects…`}):i.length===0?(0,G.jsx)(`p`,{className:`muted small`,children:`No projects available yet — create one from the Projects tab.`}):(0,G.jsxs)(`div`,{className:`gezel-chat-tab`,children:[(0,G.jsxs)(`div`,{className:`gezel-chat-project-row`,children:[(0,G.jsx)(`span`,{className:`muted small`,children:`Project:`}),(0,G.jsxs)(d,{value:o,onValueChange:e=>{S.current=!0,x.current=!0,s(e)},children:[(0,G.jsx)(g,{className:`gezel-chat-project-select`,children:(0,G.jsx)(h,{})}),(0,G.jsxs)(_,{children:[(0,G.jsx)(m,{value:K,children:`All projects`}),i.map(e=>(0,G.jsx)(m,{value:e.projectId,children:De(e)},e.projectId))]})]})]}),o===K?(0,G.jsx)(ke,{gezel:e},`${e.id}:__ALL__`):o&&(0,G.jsx)(Oe,{gezel:e,engineLabel:t,project:i.find(e=>e.projectId===o)??{projectId:o,projectName:o,precedence:`session`},focusSessionId:c||void 0,sessionFocusRequest:u??void 0},`${e.id}:${o}`)]})}function De(e){switch(e.precedence){case`voorman`:return`${e.projectName} — voorman`;case`assignment`:return`${e.projectName} — assigned`;case`session`:return`${e.projectName}`;case`fallback`:return`${e.projectName} (default)`}}function Oe({gezel:e,engineLabel:t,project:n,focusSessionId:r,sessionFocusRequest:i}){let a=x(e,R()),o=de(e.id,n.projectId),[s,c]=(0,W.useState)(()=>r??ue(o)?.sessionId??``),[l,u]=(0,W.useState)(0),[d,f]=(0,W.useState)(0),[p,m]=(0,W.useState)(null);(0,W.useEffect)(()=>{r&&c(r)},[r]),(0,W.useEffect)(()=>{fe(o,{sessionId:s})},[o,s]);let h=(0,W.useMemo)(()=>{let t=y(e.gender);return`Talk to ${a} about what ${t.subject} ${t.presentBe} working on in this project.`},[a,e.gender]),g=(0,W.useMemo)(()=>U({role:n.precedence===`voorman`?`voorman`:`other`,gezelName:a,gezelGender:e.gender,projectName:n.projectName,fixedFunctionTool:e.fixedFunction?.tool}),[n.precedence,n.projectName,a,e.gender,e.fixedFunction?.tool]);return(0,G.jsx)(ce,{projectId:n.projectId,skillsProjectId:n.projectId==="default"?void 0:n.projectId,chatKey:`${n.projectId}:${e.id}`,children:({onToolActivity:r,onArtifactReference:a,onArtifactSeen:o,onWorkspaceReference:_,onWorkspaceSeen:v,recentReferences:y,onOpenReference:b,onTaskReference:x})=>(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(se,{projectId:n.projectId,gezelId:e.id,activeSessionId:s||void 0,onFocusSession:(t,n)=>{n===e.id&&c(t)},onToolActivity:r,onArtifactReference:a,onArtifactSeen:o,onWorkspaceReference:_,onWorkspaceSeen:v,onOpenReference:b,onTaskReference:x,emptyPlaceholder:h,sessionFocusRequest:i}),p?(0,G.jsx)(Ae,{source:p,children:(0,G.jsx)(H,{gezelId:e.id,projectId:n.projectId,sessionId:s||void 0,onSessionIdChange:e=>c(e??``),onActiveSessionChange:e=>m(e?.source??null),onNewSessionCreated:()=>f(e=>e+1),refreshKey:l,engineLabel:t})}):(0,G.jsx)(B,{gezelId:e.id,gezelName:e.name,gezelRoleBasedName:e.roleBasedName,gezelRole:e.role,gezelIcon:e.icon??null,gezelPoppetje:e.poppetje,gezelIconOverride:e.iconOverride,projectId:n.projectId,sessionId:s||void 0,focusRequestKey:d,onSessionCreated:e=>{c(e),u(e=>e+1)},onToolActivity:r,recentReferences:y,onOpenReference:b,placeholder:g,draftScope:`gezel`,belowAddressLine:(0,G.jsx)(H,{gezelId:e.id,projectId:n.projectId,sessionId:s||void 0,onSessionIdChange:e=>c(e??``),onActiveSessionChange:e=>m(e?.source??null),onNewSessionCreated:()=>f(e=>e+1),refreshKey:l,engineLabel:t})})]})})}function ke({gezel:e}){let t=x(e,R()),n=le(e.id),[r,i]=(0,W.useState)(()=>{let e=ue(n);return!e?.sessionId||!e.projectId?null:{sessionId:e.sessionId,projectId:e.projectId}});(0,W.useEffect)(()=>{fe(n,{sessionId:r?.sessionId??``,projectId:r?.projectId??``})},[n,r?.sessionId,r?.projectId]);let a=(0,W.useMemo)(()=>`No chats with ${t} yet — start one below.`,[t]),o=(0,W.useMemo)(()=>U({role:`other`,gezelName:t,gezelGender:e.gender,projectName:r?void 0:`default`,fixedFunctionTool:e.fixedFunction?.tool}),[t,e.gender,r,e.fixedFunction?.tool]),s=r?.projectId??`default`;return(0,G.jsx)(ce,{projectId:s,skillsProjectId:s==="default"?void 0:s,chatKey:`all:${e.id}`,children:({onToolActivity:t,onArtifactReference:n,onArtifactSeen:c,onWorkspaceReference:l,onWorkspaceSeen:u,recentReferences:d,onOpenReference:f,onTaskReference:p})=>(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(xe,{gezelId:e.id,activeSessionId:r?.sessionId,onFocusSession:(e,t,n)=>{i({sessionId:e,projectId:n}),A.getChatSession(e).then(t=>{i(r=>r?.sessionId===e?{sessionId:e,projectId:n,...t.source?{source:t.source}:{}}:r)}).catch(()=>{})},onToolActivity:t,onArtifactReference:n,onArtifactSeen:c,onWorkspaceReference:l,onWorkspaceSeen:u,onOpenReference:f,onTaskReference:p,emptyPlaceholder:a}),r?.source?(0,G.jsx)(Ae,{source:r.source}):(0,G.jsx)(B,{gezelId:e.id,gezelName:e.name,gezelRoleBasedName:e.roleBasedName,gezelRole:e.role,gezelIcon:e.icon??null,gezelPoppetje:e.poppetje,gezelIconOverride:e.iconOverride,projectId:s,sessionId:r?.sessionId,onSessionCreated:e=>i({sessionId:e,projectId:s}),onToolActivity:t,recentReferences:d,onOpenReference:f,placeholder:o,draftScope:`gezel-all`})]})})}function Ae({source:e,children:t}){return(0,G.jsxs)(`div`,{className:`external-conversation-panel`,"aria-live":`polite`,children:[t,(0,G.jsxs)(`div`,{className:`external-conversation-notice`,children:[(0,G.jsxs)(`span`,{className:`external-conversation-label`,children:[`From `,e.appName,` · read-only`]}),(0,G.jsxs)(`span`,{children:[`This conversation updates live here. Replies and tool controls stay in `,e.appName,`.`]})]})]})}function je({gezelRole:e,gezelTemplateId:t,onApply:n}){let[r,i]=(0,W.useState)(!1),[a,d]=(0,W.useState)([]),[m,h]=(0,W.useState)(!1),[g,_]=(0,W.useState)(null),[v,y]=(0,W.useState)(null);(0,W.useEffect)(()=>{r&&(h(!0),y(null),A.listCatalogItems(`gezel-template`).then(e=>d(e.items)).catch(e=>y(e.message)).finally(()=>h(!1)))},[r]);let b=(0,W.useMemo)(()=>{let n=a.filter(e=>e.manifest.kind===`gezel-template`),r=e?.toLowerCase().trim(),i=t?n.find(e=>e.manifest.id===t)?.manifest.id:void 0,o=i??(r?n.find(e=>e.manifest.role.toLowerCase().trim()===r)?.manifest.id:void 0);return n.map(e=>({item:e,isSuggested:e.manifest.id===o,isOriginal:e.manifest.id===i})).sort((e,t)=>e.isSuggested===t.isSuggested?e.item.manifest.name.localeCompare(t.item.manifest.name):e.isSuggested?-1:1)},[a,e,t]),x=(0,W.useCallback)(async e=>{_(e),y(null);try{let t=(await A.getCatalogItem(`gezel-template`,e)).about??``;if(!t.trim()){y(`This template has no about.md content.`);return}await n(e,t),i(!1)}catch(e){y(e.message)}finally{_(null)}},[n]);return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`button`,{type:`button`,className:`ai-btn`,onClick:()=>i(!0),title:`Replace this gezel's about.md with a gilde template`,"aria-label":`Use a template`,children:`📇`}),(0,G.jsx)(o,{open:r,onOpenChange:e=>{e||(i(!1),y(null))},children:(0,G.jsxs)(u,{children:[(0,G.jsx)(l,{}),(0,G.jsxs)(f,{className:`gz-dialog-wide`,children:[(0,G.jsx)(s,{asChild:!0,children:(0,G.jsx)(`h3`,{children:`Apply a template`})}),(0,G.jsxs)(c,{className:`muted small`,children:[`Replace this gezel's `,(0,G.jsx)(`code`,{children:`about.md`}),` with a template from the gilde. Current content is overwritten — you can edit back to undo.`]}),m&&(0,G.jsx)(`p`,{className:`muted`,children:`Loading templates…`}),!m&&b.length===0&&(0,G.jsx)(`p`,{className:`muted`,children:`No gilde templates available.`}),!m&&b.length>0&&(0,G.jsx)(`ul`,{className:`gezel-template-list`,children:b.map(({item:e,isSuggested:t,isOriginal:n})=>{let r=e.manifest,i=g===r.id;return(0,G.jsxs)(`li`,{className:t?`suggested`:void 0,children:[(0,G.jsxs)(`div`,{className:`gezel-template-head`,children:[(0,G.jsx)(`strong`,{children:r.name}),(0,G.jsx)(`span`,{className:`muted small`,children:r.role}),t&&(0,G.jsx)(`span`,{className:`gezel-template-badge`,children:n?`Original`:`Matches role`})]}),r.description&&(0,G.jsx)(`p`,{className:`muted small`,children:r.description}),(0,G.jsx)(`button`,{type:`button`,onClick:()=>void x(r.id),disabled:g!==null,children:i?`Applying…`:t?`Reset to this`:`Use this`})]},r.id)})}),v&&(0,G.jsx)(`p`,{className:`gz-dialog-error`,children:v}),(0,G.jsx)(p,{children:(0,G.jsx)(`button`,{type:`button`,onClick:()=>i(!1),disabled:g!==null,children:`Cancel`})})]})]})})]})}function Me({gezel:e,inherited:t,effectiveProvider:n,onUpdated:r}){let i=(0,W.useCallback)(async t=>{r(await A.updateGezelSettings(e.id,{tuning:t}))},[e.id,r]);return(0,G.jsxs)(`div`,{className:`gezel-tuning-editor`,children:[(0,G.jsx)(Ne,{gezel:e,availableProfiles:Object.keys(t?.profiles??{}),onUpdated:r}),(0,G.jsx)(ve,{provider:n,override:e.parsed?.frontmatter?.tuning,...t?{inherited:t}:{},...e.parsed?.frontmatter?.tuningProfile?{tuningProfileId:e.parsed.frontmatter.tuningProfile}:{},onSave:i,scopeLabel:e.name??`this gezel`})]})}function Ne({gezel:e,availableProfiles:t,onUpdated:n}){let r=e.parsed?.frontmatter?.tuningProfile??``,[i,a]=(0,W.useState)(!1),[o,s]=(0,W.useState)(null),c=(0,W.useMemo)(()=>t.map(e=>{let t=D(e)?E[e]:null;return{id:e,label:t?.label??e,description:t?.description}}),[t]),l=(0,W.useCallback)(async t=>{a(!0),s(null);try{let r=t===``?null:t;n(await A.updateGezelSettings(e.id,{tuningProfile:r}))}catch(e){s(e instanceof Error?e.message:String(e))}finally{a(!1)}},[e.id,n]);return c.length===0&&!r?null:(0,G.jsxs)(`div`,{className:`voice-picker`,style:{marginBottom:`0.75rem`},children:[(0,G.jsxs)(`label`,{htmlFor:`voice-${e.id}`,className:`small`,style:{display:`block`,marginBottom:`0.25rem`},children:[(0,G.jsx)(`strong`,{children:`Voice`}),` `,(0,G.jsx)(`span`,{className:`muted`,children:`— preset the model applies for this gezel. Your manual tuning below overrides individual fields.`})]}),(0,G.jsxs)(`select`,{id:`voice-${e.id}`,value:r,onChange:e=>void l(e.target.value),disabled:i,children:[(0,G.jsx)(`option`,{value:``,children:`(automatic — use template / model default)`}),c.map(e=>(0,G.jsx)(`option`,{value:e.id,title:e.description,children:e.label},e.id))]}),o&&(0,G.jsx)(`div`,{className:`small error`,style:{marginTop:`0.25rem`},children:o})]})}function q({level:e,pending:t=!1,overlay:n=!1}){if(e<2&&!t)return null;let r=t?`Level ${e} — a level-up is waiting in the Growth tab`:`Level ${e}`;return(0,G.jsxs)(`span`,{className:`level-badge${n?` level-badge--overlay`:``}`,title:r,"aria-label":r,children:[`Lv `,e,t&&(0,G.jsx)(`span`,{className:`level-badge-dot`,"aria-hidden":`true`})]})}function Pe(e,t,n){if(n<=t)return 100;let r=(e-t)/(n-t)*100;return Math.max(0,Math.min(100,Math.round(r)))}function J(e){let[t,n,r]=e.split(`-`).map(e=>Number.parseInt(e,10));return!t||!n||!r?e:new Date(Date.UTC(t,n-1,r)).toLocaleDateString(void 0,{month:`short`,day:`numeric`,timeZone:`UTC`})}var Fe={fact:`Fact`,decision:`Decision`,pref:`Preference`,status:`Status`};function Ie(e){return[{label:`Memories`,value:e.memoryXp,hint:`Distinct deduplicated memories — preferences and decisions weigh most.`},{label:`Lessons`,value:e.lessonsXp,hint:`Times the distilled lessons file was refined.`},{label:`Task work`,value:e.taskXp,hint:`Completed task steps and finished tasks.`},{label:`Consults`,value:e.consultXp,hint:`Delivered gezel-to-gezel consultations (daily-capped).`}]}function Le(e,t){return`gezel-growth-celebrated:${e}:${t}`}function Re(e){switch(e.kind){case`trait`:return`Adopt this trait`;case`tuning`:if(e.action.type===`profile`){let t=e.action.profile;return`Switch to ${D(t)?E[t].label:t}`}return e.action.delta>0?`Run a little warmer`:`Run a little cooler`;case`cosmetic`:{let t=b(e.cosmeticId);return t?`Unlock ${t.label.toLowerCase()}`:`Mark the milestone`}}}function Y(e){if(e instanceof k){let t=e.details;if(typeof t==`object`&&t?.error)return t.error;if(typeof t==`string`&&t)return t}return e instanceof Error?e.message:String(e)}function ze(e){return e instanceof k&&e.status===409&&Y(e).includes(`no pending level-up`)}function Be(e,t){let[n,r]=(0,W.useState)(null),[i,a]=(0,W.useState)(null),[o,s]=(0,W.useState)(null),[c,l]=(0,W.useState)(null),[u,d]=(0,W.useState)(!1),f=(0,W.useCallback)(async()=>{try{r(await A.getGezelGrowth(e)),a(null)}catch(e){a(Y(e))}},[e]);(0,W.useEffect)(()=>{f()},[f]),(0,W.useEffect)(()=>{let t=t=>{let n=t.detail;(!n?.gezelId||n.gezelId===e)&&f()};return window.addEventListener(`gezel:growth-updated`,t),()=>window.removeEventListener(`gezel:growth-updated`,t)},[e,f]);let p=(0,W.useCallback)(async()=>{try{let t=await A.getGezel(e);window.dispatchEvent(new CustomEvent(`gezel:gezel-updated`,{detail:t}))}catch{}t?.()},[e,t]),m=(0,W.useCallback)(async(e,t,n)=>{l(e??`*`),s(null);try{r(await t()),n&&await p()}catch(e){ze(e)?s(`This level-up was already resolved in another window.`):s(Y(e)),await f()}finally{l(null)}},[p,f]),h=(0,W.useCallback)(t=>m(t,()=>A.acceptGrowthProposal(e,t),!0),[e,m]),g=(0,W.useCallback)(t=>m(t,()=>A.declineGrowthLevelUp(e,t),!1),[e,m]),_=(0,W.useCallback)(()=>m(null,()=>A.declineGrowthLevelUp(e),!1),[e,m]),v=(0,W.useCallback)(t=>m(null,()=>A.retireGrowthTrait(e,t),!0),[e,m]),y=(0,W.useCallback)(async()=>{d(!0),s(null);try{r(await A.refreshGezelGrowth(e)),a(null)}catch(e){s(Y(e))}finally{d(!1)}},[e]);return{growth:n,error:i,notice:o,clearNotice:(0,W.useCallback)(()=>s(null),[]),busyId:c,refreshing:u,refresh:y,accept:h,decline:g,skipLevel:_,retireTrait:v}}function Ve({gezel:e,onUpdated:t}){let n=Be(e.id,t),[r,i]=(0,W.useState)(!1),[a,o]=(0,W.useState)(!1),[s,c]=(0,W.useState)(null),[l,u]=(0,W.useState)(!1),d=n.growth?.state.pendingLevelUp?.toLevel;if((0,W.useEffect)(()=>{if(d===void 0)return;let t=Le(e.id,d);try{if(window.localStorage.getItem(t))return;window.localStorage.setItem(t,`1`)}catch{}u(!0);let n=setTimeout(()=>u(!1),1600);return()=>clearTimeout(n)},[e.id,d]),n.error)return(0,G.jsx)(`section`,{className:`growth-panel`,"data-testid":`growth-panel`,children:(0,G.jsxs)(`p`,{className:`error`,children:[`Couldn't load growth: `,n.error]})});if(!n.growth)return(0,G.jsx)(`section`,{className:`growth-panel`,"data-testid":`growth-panel`,children:(0,G.jsx)(`p`,{className:`placeholder`,children:`Loading growth…`})});let{state:f,nextLevelXp:p,activeTraits:m,driftedTraitIds:h}=n.growth,g=f.pendingLevelUp,_=w(f.level),v=Pe(f.xp,_,p),y=f.level===1&&!g&&m.length===0&&f.xp===0;return(0,G.jsxs)(`section`,{className:`growth-panel`,"data-testid":`growth-panel`,children:[n.notice&&(0,G.jsxs)(`output`,{className:`growth-notice`,children:[(0,G.jsx)(`span`,{children:n.notice}),(0,G.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:n.clearNotice,children:`Dismiss`})]}),g&&r&&(0,G.jsxs)(`div`,{className:`growth-deferred-reminder`,children:[(0,G.jsxs)(`span`,{children:[e.name,` reached level `,g.toLevel,` — growth choices are waiting.`]}),(0,G.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:()=>i(!1),children:`Show choices`})]}),g&&!r&&(0,G.jsx)(He,{gezel:e,growth:n,onDefer:()=>i(!0),onSkip:()=>o(!0)}),(0,G.jsxs)(`header`,{className:`growth-header`,children:[(0,G.jsxs)(`span`,{className:`level-badge-anchor${l?` growth-celebrate`:``}`,children:[(0,G.jsx)(I,{svg:e.icon??null,poppetje:l&&e.poppetje?{...e.poppetje,expression:`wider`}:e.poppetje,iconOverride:e.iconOverride,name:e.name,size:96}),(0,G.jsx)(q,{level:f.level,pending:!!g,overlay:!0})]}),(0,G.jsxs)(`div`,{className:`growth-header-text`,children:[(0,G.jsxs)(`h4`,{children:[e.name,` · Level `,f.level]}),(0,G.jsx)(`div`,{className:`growth-xp-bar`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":v,"aria-label":`${f.xp} XP — ${p} needed for level ${f.level+1}`,tabIndex:-1,children:(0,G.jsx)(`div`,{className:`growth-xp-fill`,style:{width:`${v}%`}})}),(0,G.jsxs)(`span`,{className:`muted small`,children:[f.xp,` XP · `,Math.max(0,p-f.xp),` to level `,f.level+1]})]}),(0,G.jsx)(`button`,{type:`button`,className:`link-btn growth-refresh`,disabled:n.refreshing,title:`Recompute XP from memories, lessons, and task work now`,onClick:()=>void n.refresh(),children:n.refreshing?`Checking…`:`Check growth now`})]}),y?(0,G.jsxs)(`div`,{className:`growth-empty`,children:[(0,G.jsxs)(`p`,{children:[`Growth here is earned, not simulated — every point comes from real work. As `,e.name,` `,`accumulates distinct memories, distills lessons, and completes tasks, XP adds up; at each level you'll choose how they grow.`]}),(0,G.jsx)(`div`,{className:`growth-trait-ghost`,"aria-hidden":`true`,children:`Trait slot · unlocks at Level 2`})]}):(0,G.jsx)(`div`,{className:`growth-counters`,children:Ie(f.signals).map(e=>(0,G.jsxs)(`div`,{className:`growth-counter`,title:e.hint,children:[(0,G.jsx)(`span`,{className:`growth-counter-value`,children:e.value}),(0,G.jsx)(`span`,{className:`growth-counter-label`,children:e.label})]},e.label))}),h.length>0&&(0,G.jsxs)(`p`,{className:`growth-drift-warning`,children:[h.length===1?`One adopted trait is`:`Some adopted traits are`,` no longer in `,e.name,`'s frontmatter — likely lost to a manual gezel.md edit. Re-adopt from a future level-up, or edit the frontmatter directly.`]}),m.length>0&&(0,G.jsxs)(`div`,{className:`growth-traits`,children:[(0,G.jsx)(`h5`,{children:`Traits`}),m.map(e=>{let t=f.adoptedTraits.find(t=>t.traitId===e.id&&!t.removedAt);return(0,G.jsxs)(`details`,{className:`growth-trait`,children:[(0,G.jsxs)(`summary`,{children:[(0,G.jsx)(`span`,{className:`growth-trait-text`,children:e.text}),(0,G.jsxs)(`span`,{className:`muted small`,children:[` `,`· adopted `,J(e.adoptedAt.slice(0,10))]})]}),t&&t.evidence.length>0&&(0,G.jsx)(`div`,{className:`growth-trait-evidence`,children:t.evidence.map(e=>(0,G.jsxs)(`blockquote`,{children:[`“`,e.excerpt,`”`,(0,G.jsxs)(`footer`,{children:[(0,G.jsx)(`span`,{className:`growth-day-chip`,children:J(e.day)}),(0,G.jsx)(`span`,{className:`growth-kind-chip`,children:Fe[e.kind]??e.kind})]})]},`${e.day}-${e.excerpt.slice(0,24)}`))}),(0,G.jsx)(`button`,{type:`button`,className:`link-btn growth-retire`,disabled:n.busyId!==null,onClick:()=>c(e),children:`Retire this trait`})]},e.id)})]}),e.tuningProfile&&D(e.tuningProfile)&&(0,G.jsxs)(`div`,{className:`growth-tuning`,children:[(0,G.jsx)(`h5`,{children:`Tuning`}),(0,G.jsx)(`span`,{className:`growth-tuning-chip`,children:E[e.tuningProfile].label})]}),f.unlockedCosmetics.length>0&&(0,G.jsxs)(`div`,{className:`growth-cosmetics`,children:[(0,G.jsx)(`h5`,{children:`Unlocked`}),(0,G.jsx)(`div`,{className:`growth-cosmetics-row`,children:f.unlockedCosmetics.map(e=>{let t=b(e.id);return(0,G.jsx)(`span`,{className:`growth-cosmetic-chip`,children:t?t.label:e.id.replace(/^level-(\d+)$/,`Level $1 milestone`)},e.id)})})]}),(0,G.jsx)(N,{open:a,title:`Skip level ${g?.toLevel??f.level+1}?`,message:`The level still advances — it was earned — but these trait offers won't come back. The evidence stays in memory for future level-ups.`,confirmLabel:`Skip this level`,onConfirm:async()=>{await n.skipLevel(),o(!1)},onCancel:()=>o(!1)}),(0,G.jsx)(N,{open:s!==null,title:`Retire this trait?`,message:s?(0,G.jsxs)(G.Fragment,{children:[`“`,s.text,`” will stop shaping `,e.name,`'s behavior. The adoption record and its evidence stay on the character sheet.`]}):void 0,confirmLabel:`Retire`,danger:!0,onConfirm:async()=>{s&&await n.retireTrait(s.id),c(null)},onCancel:()=>c(null)})]})}function He({gezel:e,growth:t,onDefer:n,onSkip:r}){let i=t.growth.state.pendingLevelUp;return i?(0,G.jsxs)(`div`,{className:`growth-levelup`,children:[(0,G.jsxs)(`h4`,{children:[e.name,` reached level `,i.toLevel,`.`]}),(0,G.jsx)(`p`,{className:`muted`,children:`Pick one way to grow — or skip; the evidence isn't going anywhere.`}),(0,G.jsx)(`div`,{className:`growth-proposals`,children:i.proposals.map(n=>(0,G.jsx)(Ue,{proposal:n,gezel:e,busy:t.busyId!==null,declinable:i.proposals.length>1,onAccept:()=>void t.accept(n.id),onDecline:()=>void t.decline(n.id)},n.id))}),(0,G.jsxs)(`div`,{className:`growth-levelup-actions`,children:[(0,G.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:n,children:`Decide later`}),(0,G.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:r,children:`Skip this level`})]})]}):null}function Ue({proposal:e,gezel:t,busy:n,declinable:r,onAccept:i,onDecline:a}){return(0,G.jsxs)(`div`,{className:`growth-proposal-card`,"data-kind":e.kind,children:[(0,G.jsx)(`span`,{className:`growth-proposal-kind`,children:We[e.kind]}),(0,G.jsx)(`h5`,{children:e.title}),e.kind===`trait`&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`p`,{className:`growth-proposal-trait-text`,children:[`“`,e.traitText,`”`]}),(0,G.jsx)(`div`,{className:`growth-trait-evidence`,children:e.evidence.map(e=>(0,G.jsxs)(`blockquote`,{children:[`“`,e.excerpt,`”`,(0,G.jsxs)(`footer`,{children:[(0,G.jsx)(`span`,{className:`growth-day-chip`,children:J(e.day)}),(0,G.jsx)(`span`,{className:`growth-kind-chip`,children:Fe[e.kind]??e.kind})]})]},`${e.day}-${e.excerpt.slice(0,24)}`))})]}),e.kind===`tuning`&&(0,G.jsx)(`p`,{className:`muted small`,children:e.description}),e.kind===`cosmetic`&&(0,G.jsx)(Ge,{poppetje:t.poppetje??null,cosmeticId:e.cosmeticId}),(0,G.jsxs)(`div`,{className:`growth-proposal-actions`,children:[(0,G.jsx)(`button`,{type:`button`,className:`primary`,disabled:n,onClick:i,children:Re(e)}),r&&(0,G.jsx)(`button`,{type:`button`,disabled:n,onClick:a,children:`Not this one`})]})]})}var We={trait:`Trait`,tuning:`Tuning`,cosmetic:`Cosmetic`};function Ge({poppetje:e,cosmeticId:t}){let n=b(t);return!n||!e?n?(0,G.jsx)(`p`,{className:`muted small`,children:n.label}):null:(0,G.jsxs)(`div`,{className:`growth-cosmetic-tryon`,children:[(0,G.jsx)(`div`,{className:`growth-cosmetic-figure`,children:(0,G.jsx)(M,{poppetje:{...e,[n.slot]:n.option},variant:`headshot`,size:56})}),(0,G.jsx)(`span`,{className:`muted small`,children:n.label})]})}var X=`__INHERIT__`;function Ke(e,t){return e?`${e}:${t??``}`:X}function qe(e){if(e===X)return{kind:`inherit`};let t=e.indexOf(`:`);return t<0?{kind:`inherit`}:{kind:`override`,provider:e.slice(0,t),model:e.slice(t+1)||void 0}}function Je(){let e=window.__GEZEL__?.platform;if(e)return L(e);let t=typeof navigator>`u`?``:navigator.userAgent??``;return/Mac/i.test(t)?L(`darwin`):/Win/i.test(t)?L(`win32`):/Linux/i.test(t)?L(`linux`):L()}function Ye(e){switch(e){case`copilot`:return`GitHub Copilot`;case`openai`:return`OpenAI`;case`anthropic`:return`Anthropic`;case`anthropic-cli`:return`Claude CLI`;case`codex-cli`:return`Codex CLI`;case`ollama`:return`Ollama`;case`mlx`:case`llama-cpp`:return Je();case`ds4`:return`DwarfStar (ds4)`;default:return e}}function Xe({provider:e,model:t,onChange:n,globalProvider:r,disabled:i}){let[a,o]=(0,W.useState)(null),[s,c]=(0,W.useState)(!0),[l,u]=(0,W.useState)(0),f=(0,W.useRef)(null),p=(0,W.useRef)(!1);p.current=r===`copilot`||e===`copilot`,(0,W.useEffect)(()=>{let e=e=>{let t=ne(e);t&&(f.current=t,u(e=>e+1))};return window.addEventListener(z,e),()=>window.removeEventListener(z,e)},[]),(0,W.useEffect)(()=>{let e=!1;return c(!0),(async()=>{let t=null,n=null,r=null;try{[t,n,r]=await Promise.all([A.getConfig(),A.getCopilotStatus().catch(()=>null),A.getMemoryProfile().catch(()=>null)])}catch{e||(o([]),c(!1));return}let i=[];(n?.available!==!1||p.current)&&i.push(`copilot`),t.hasOpenaiApiKey&&i.push(`openai`),t.hasAnthropicApiKey&&i.push(`anthropic`),t.anthropicCliStatus?.installed&&i.push(`anthropic-cli`),t.codexCliStatus?.installed&&i.push(`codex-cli`),i.push(`ollama`);let a=typeof navigator>`u`?``:navigator.userAgent;/Mac/i.test(a)&&i.push(`mlx`),i.push(`llama-cpp`),_e({externalBaseUrl:t.ds4BaseUrl,totalRamBytes:r?.totalRamBytes}).status!==`unavailable`&&i.push(`ds4`);let s=await Promise.all(i.map(async e=>{try{let t=(e===`llama-cpp`||e===`mlx`||e===`ds4`)&&(f.current===e&&l>0||P(e)>0),n=await A.listProviderModels(e,t?{refresh:!0}:void 0);return n.models.length===0?null:{provider:e,label:Ye(e),models:n.models}}catch{return null}}));if(e)return;let u=s.filter(e=>e!==null),d=[`mlx`,`llama-cpp`,`ds4`,`ollama`,`copilot`,`openai`,`anthropic`,`anthropic-cli`,`codex-cli`];u.sort((e,t)=>d.indexOf(e.provider)-d.indexOf(t.provider)),o(u),c(!1)})(),()=>{e=!0}},[l]);let v=(0,W.useMemo)(()=>Ke(e,t),[e,t]),y=(0,W.useMemo)(()=>`Inherit default (${Ye(r)})`,[r]);return s?(0,G.jsx)(`span`,{className:`muted small`,children:`loading providers…`}):!a||a.length===0?(0,G.jsxs)(`span`,{className:`muted small`,children:[`No providers configured —`,` `,(0,G.jsx)(`button`,{type:`button`,className:`provider-model-select-link`,onClick:()=>{ie(`defaults`),window.dispatchEvent(new CustomEvent(`gezel:navigate`,{detail:{view:`settings`,section:`defaults`}}))},children:`set one up`})]}):(0,G.jsxs)(d,{value:v,onValueChange:e=>{let t=qe(e);t.kind===`inherit`?n(null,void 0):n(t.provider,t.model)},disabled:i,children:[(0,G.jsx)(g,{children:(0,G.jsx)(h,{})}),(0,G.jsxs)(_,{children:[(0,G.jsx)(m,{value:X,children:y}),a.map(e=>e.models.map(t=>(0,G.jsxs)(m,{value:`${e.provider}:${t.id}`,children:[e.label,` — `,t.name,t.supportsReasoning?` · reasoning`:``]},`${e.provider}:${t.id}`)))]})]})}function Ze(e){switch(e){case`generate_video`:return{kind:`Video`,list:()=>A.listInstalledVideoModels()};case`generate_image`:return{kind:`Image`,list:()=>A.listInstalledImageModels()};default:return null}}function Qe(e){let t=e?.tool,n=typeof e?.defaults?.model==`string`?e.defaults.model:void 0,[r,i]=(0,W.useState)(null);return(0,W.useEffect)(()=>{if(!t){i(null);return}let e=Ze(t);if(!e){i(null);return}if(i(n?`${e.kind} · ${n}`:`${e.kind} generator`),n)return;let r=!1;return e.list().then(t=>{if(r)return;let n=t.defaultModel??t.models[0]?.id,a=t.models.find(e=>e.id===n)?.name??n;i(a?`${e.kind} · ${a}`:`${e.kind} generator`)}).catch(()=>{}),()=>{r=!0}},[t,n]),r}function Z(e){window.dispatchEvent(new CustomEvent(`gezel:gezel-updated`,{detail:e}))}function $e({gezelId:e,onDeleted:t,workingProjectIds:n,activeTurnsReady:o}){let s=re(),c=R(),[l,u]=(0,W.useState)(null),[d,f]=(0,W.useState)(null),[p,m]=(0,W.useState)(``),[h,g]=(0,W.useState)(!1),[_,v]=(0,W.useState)(!1),[y,b]=(0,W.useState)(!1),[x,S]=(0,W.useState)(0),[C,w]=(0,W.useState)(`chat`),[ee,T]=(0,W.useState)(!1),[E,D]=(0,W.useState)(``),[O,k]=(0,W.useState)(!1),j=l?.fixedFunction!==void 0,M=j&&(C===`toolsets`||C===`memories`)?`chat`:C,N=Qe(l?.fixedFunction),P=(0,W.useRef)(null),ne=(0,W.useCallback)(t=>A.updateGezelAbout(e,{source:t}),[e]),F=oe({resourceKey:`gezel:${e}:about`,initialValue:``,save:ne,onLatestSaved:t=>{let n=P.current;if(!n||n.id!==e)return;let r={...n,about:t.about};P.current=r,u(r),Z(r)}});(0,W.useEffect)(()=>{let t=!1;return u(null),f(null),m(``),(async()=>{try{let n=await A.getGezel(e);if(t)return;let r={...n,about:F.hydrate(ge(n.about))};P.current=r,u(r)}catch(e){t||f(e.message)}})(),()=>{t=!0}},[e,F.hydrate]),(0,W.useEffect)(()=>{j&&C!==M&&w(M)},[M,C,j]);let L=(0,W.useCallback)(e=>{P.current=e,u(e),Z(e)},[]),ie=(0,W.useCallback)(e=>{m(``),F.update(e)},[F.update]),z=(0,W.useCallback)(()=>{l&&(D(l.name),k(!0))},[l]),B=(0,W.useCallback)(async()=>{if(!l||!E.trim()||E.trim()===l.name){k(!1);return}try{await F.flush();let e=await A.renameGezel(l.id,{name:E.trim()});P.current=e,F.adopt(e.about),u(e),Z(e)}catch(e){m(`rename failed: ${e.message}`)}k(!1)},[l,E,F.flush,F.adopt]),V=(0,W.useCallback)(e=>{e.key===`Enter`&&B(),e.key===`Escape`&&k(!1)},[B]);return d?(0,G.jsx)(`div`,{className:`placeholder`,children:(0,G.jsxs)(`p`,{children:[`Couldn't open this gezel: `,d]})}):l?(0,G.jsxs)(`section`,{className:`gezel-detail${M===`chat`?` gezel-detail-chat`:``}`,"data-testid":`gezel-detail`,children:[(0,G.jsxs)(`header`,{className:`detail-header`,children:[(0,G.jsxs)(`span`,{className:`level-badge-anchor`,children:[(0,G.jsx)(I,{svg:l.icon??null,poppetje:l.poppetje,iconOverride:l.iconOverride,name:l.name,size:80,pulsing:h&&!l.icon&&!l.poppetje,onClick:()=>T(!0),title:l.iconOverride&&l.icon?`Click to iterate on this icon`:`Click to manage appearance`}),l.growth&&(0,G.jsx)(q,{level:l.growth.level,pending:!!l.growth.pending,overlay:!0})]}),(0,G.jsxs)(`div`,{className:`detail-header-text`,children:[O?(0,G.jsx)(`input`,{className:`rename-input`,value:E,onChange:e=>D(e.target.value),onBlur:()=>void B(),onKeyDown:V}):(0,G.jsx)(`h3`,{className:`gezel-name-editable`,onClick:z,onKeyDown:e=>{e.key===`Enter`&&z()},title:`Click to rename`,children:l.name}),l.role&&(0,G.jsx)(`span`,{className:`gezel-role`,children:l.role}),l.fixedFunction?(0,G.jsxs)(`div`,{className:`provider-override`,children:[(0,G.jsxs)(`span`,{className:`gezel-role muted small ff-header-tag`,title:`Fixed-function gezel`,children:[`Fixed-function · forwards to `,(0,G.jsx)(`code`,{children:l.fixedFunction.tool})]}),N&&(0,G.jsx)(`span`,{className:`gezel-role muted small ff-header-tag`,title:`Generation model used by this gezel`,children:N})]}):(0,G.jsx)(st,{gezel:l,onUpdated:L})]}),(0,G.jsx)(`output`,{className:`status`,"aria-live":`polite`,children:F.phase===`error`?(0,G.jsxs)(G.Fragment,{children:[`save failed: `,F.error?.message??`unknown error`,` `,(0,G.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:()=>void F.retry().catch(()=>{}),children:`Retry`})]}):p||(F.phase===`dirty`?`unsaved changes`:F.phase===`saving`?`saving…`:F.phase===`saved`?`saved`:null)}),(0,G.jsx)(ae,{gezel:l,onDeleted:t,boringMode:c})]}),(0,G.jsx)(ot,{open:ee,gezel:l,isGenerating:h,onClose:()=>T(!1),onUpdated:L,setGenerating:g}),(0,G.jsx)(`div`,{className:`entity-tabs-row`,children:(0,G.jsx)(a,{value:M,onValueChange:e=>w(e),children:(0,G.jsxs)(i,{children:[(0,G.jsx)(r,{value:`chat`,children:`Chat`}),(0,G.jsx)(r,{value:`about`,children:`About`}),(0,G.jsx)(r,{value:`appearance`,children:`Appearance`}),(0,G.jsxs)(r,{value:`growth`,children:[`Growth`,l.growth?.pending&&(0,G.jsx)(`span`,{className:`growth-tab-dot`,title:`A level-up is waiting for your choice`,"aria-label":`Level-up pending`})]}),!j&&(0,G.jsx)(r,{value:`toolsets`,children:`Toolsets`}),!j&&(0,G.jsx)(r,{value:`memories`,children:`Memories`})]})})}),M===`appearance`&&(0,G.jsx)(et,{gezel:l,onUpdated:L}),M===`growth`&&(0,G.jsx)(Ve,{gezel:l,onUpdated:()=>{(async()=>{try{let e=await A.getGezel(l.id);P.current=e,u(e)}catch{}})()}}),!j&&M===`toolsets`&&(0,G.jsx)(pe,{scope:{kind:`gezel`,gezelId:l.id},subject:l.name}),M===`about`&&l.fixedFunction&&(0,G.jsx)(be,{gezel:l,onUpdated:L}),M===`about`&&!l.fixedFunction&&(0,G.jsxs)(`div`,{className:`editor-wrap`,children:[_&&(0,G.jsxs)(`div`,{className:`about-generating-banner`,children:[`Drafting `,(0,G.jsx)(`code`,{children:`about.md`}),` from the role…`]}),(0,G.jsx)(te,{initialMarkdown:l.about,onChange:ie,height:`calc(100vh - 220px)`,colorScheme:s,showPlayTab:!1,fullWidth:!0,readOnly:_||y,toolbarSlotAfterActions:(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(me,{context:`about`}),(0,G.jsx)(je,{...l.role?{gezelRole:l.role}:{},...l.templateId?{gezelTemplateId:l.templateId}:{},onApply:async(e,t)=>{b(!0);try{if(!await F.saveNow(t))return;S(e=>e+1),m(`applied template`)}catch(e){m(`template apply failed: ${e.message}`)}finally{b(!1)}}}),(0,G.jsx)(`button`,{type:`button`,className:`link-btn`,disabled:_||!l.role,title:l.role?`Re-draft about.md from the role`:`Set a role first to enable about generation`,onClick:async()=>{if(l.role){v(!0);try{await F.flush();let e=await A.generateGezelAbout(l.id,{role:l.role});F.adopt(e.about),P.current=e,S(e=>e+1),L(e)}catch(e){m(`about generation failed: ${e.message}`)}finally{v(!1)}}},children:_?`Drafting…`:`Draft from role`})]})},`${l.id}:${x}`)]}),M===`chat`&&(0,G.jsx)(Ee,{gezel:l,engineLabel:N,workingProjectIds:n,activeTurnsReady:o}),!j&&M===`memories`&&(0,G.jsx)(he,{gezelId:l.id,gezelName:l.name})]}):(0,G.jsx)(`p`,{className:`placeholder`,children:`Loading gezel…`})}function et({gezel:e,onUpdated:t}){let[n,r]=(0,W.useState)(!1),[i,a]=(0,W.useState)(!1),[o,s]=(0,W.useState)(!1),[c,l]=(0,W.useState)(!1),[u,d]=(0,W.useState)(null),f=e.poppetje,p=async()=>{d(null),r(!0);try{let n=await A.rerollGezelPoppetje(e.id,{});t({...await A.getGezel(e.id),poppetje:n.poppetje})}catch(e){d(e.message)}finally{r(!1)}},m=async n=>{d(null),a(!0);try{t(await A.updateGezelSettings(e.id,{iconOverride:n?!0:null}))}catch(e){d(e.message)}finally{a(!1)}},h=async n=>{d(null),s(!0);try{t(await A.updateGezelSettings(e.id,{font:n||null}))}catch(e){d(e.message)}finally{s(!1)}};return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`section`,{className:`gezel-appearance`,"aria-label":`Appearance`,children:[(0,G.jsx)(`div`,{className:`gezel-appearance-hero`,"aria-label":`${e.name} portrait`,children:f?(0,G.jsx)(M,{poppetje:f,variant:`full`,size:160,grainStyle:`wavy`}):(0,G.jsx)(`span`,{className:`muted small`,children:`Generating…`})}),(0,G.jsxs)(`div`,{className:`gezel-appearance-actions`,children:[(0,G.jsxs)(`strong`,{children:[e.name,`'s appearance`]}),(0,G.jsxs)(`div`,{className:`gezel-appearance-buttons`,children:[(0,G.jsx)(`button`,{type:`button`,onClick:p,disabled:n||!f,children:n?`Rerolling…`:`Reroll appearance`}),(0,G.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:()=>l(!0),disabled:!f,title:`Add or remove worn items (hat, garment, accessory)`,children:`Accessories…`})]}),(0,G.jsx)(`span`,{className:`muted small`,children:`Reroll redraws everything (body, face, hair). Accessories let you toggle just the worn items.`}),e.icon&&(0,G.jsxs)(`label`,{className:`gezel-appearance-toggle`,children:[(0,G.jsx)(`input`,{type:`checkbox`,checked:!!e.iconOverride,disabled:i,onChange:e=>void m(e.target.checked)}),`Show abstract icon instead of the poppetje`]}),u&&(0,G.jsx)(`p`,{className:`error small`,children:u})]}),(0,G.jsx)(at,{open:c,gezel:e,onClose:()=>l(!1),onUpdated:t})]}),(0,G.jsxs)(`section`,{className:`gezel-font-section`,"aria-label":`Chat font`,children:[(0,G.jsx)(`strong`,{children:`Chat font`}),(0,G.jsx)(dt,{value:e.font,onChange:e=>void h(e),disabled:o}),(0,G.jsxs)(`span`,{className:`muted small`,children:[`The typeface used for `,e.name,`'s chat bubbles. Inherits the app default unless overridden.`]})]})]})}var tt={cap:`Cap`,beanie:`Beanie`,kerchief:`Kerchief`,straw:`Straw hat`,newsboy:`Newsboy cap`,hood:`Hoodie`},nt={scarf:`Scarf`,apron:`Apron`,collar:`Collar`,turtleneck:`Turtleneck`},rt={glasses:`Glasses`,sunglasses:`Sunglasses`,cateye:`Cat-eye glasses`,readers:`Reading glasses`,monocle:`Monocle`,eyepatch:`Eye patch`,earrings:`Earrings`,"earring-left":`Left earring`,"earring-right":`Right earring`,flower:`Flower`,hairclip:`Hair clip`,headband:`Headband`,bowtie:`Bow tie`,necklace:`Necklace`,brooch:`Brooch`,facemask:`Face mask`,goggles:`Goggles`,"safety-glasses":`Safety glasses`,"pince-nez":`Pince-nez`,headphones:`Headphones`,"hearing-aid":`Hearing aid`,"nose-ring":`Nose ring`,"hoop-earrings":`Hoop earrings`,"drop-earrings":`Drop earrings`,"pearl-earrings":`Pearl earrings`,bandage:`Bandage`,feather:`Feather`,pencil:`Pencil`,ribbon:`Ribbon`,necktie:`Necktie`,cravat:`Cravat`,"bolo-tie":`Bolo tie`,lanyard:`Lanyard`,medal:`Medal`,"pocket-square":`Pocket square`,"tool-pendant":`Tool pendant`};function it({slot:e,option:t,label:n,selected:r,disabled:i,lockText:a,onSelect:o}){let s=a?.match(/\d+/)?.[0];return(0,G.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":r,className:`accessory-tile${r?` selected`:``}${a?` locked`:``}`,disabled:i,onClick:o,title:a?`${n} — ${a}`:n,children:[(0,G.jsx)(`span`,{className:`accessory-tile-art`,children:e&&t?(0,G.jsx)(j,{slot:e,option:t,size:52}):(0,G.jsxs)(`svg`,{width:28,height:28,viewBox:`0 0 24 24`,"aria-hidden":`true`,children:[(0,G.jsx)(`circle`,{cx:12,cy:12,r:9,fill:`none`,stroke:`currentColor`,strokeWidth:1.6}),(0,G.jsx)(`line`,{x1:6,y1:18,x2:18,y2:6,stroke:`currentColor`,strokeWidth:1.6})]})}),(0,G.jsx)(`span`,{className:`accessory-tile-label`,children:n}),s&&(0,G.jsxs)(`span`,{className:`accessory-tile-lock`,"aria-hidden":`true`,children:[`Lv `,s]})]})}function Q({slot:e,label:t,value:n,options:r,labels:i,locked:a,onChange:o,disabled:s}){return(0,G.jsxs)(`div`,{className:`accessory-section`,children:[(0,G.jsx)(`h4`,{className:`accessory-section-title`,children:t}),(0,G.jsxs)(`div`,{className:`accessory-tiles`,role:`radiogroup`,"aria-label":t,children:[(0,G.jsx)(it,{label:`None`,selected:n===null,disabled:s,onSelect:()=>o(null)}),r.map(t=>{let r=a?.[t];return(0,G.jsx)(it,{slot:e,option:t,label:i[t],selected:n===t,disabled:s||!!r,lockText:r,onSelect:()=>o(t)},t)})]})]})}function $(e,t,n){let r={};for(let i of T)i.slot===e&&(i.level<=t||n!==i.option&&(r[i.option]=`unlocks at level ${i.level}`));return r}function at({open:e,gezel:t,onClose:n,onUpdated:r}){let[i,a]=(0,W.useState)(!1),[d,m]=(0,W.useState)(null),h=t.poppetje,g=t.growth?.level??1,_=async e=>{if(h){m(null),a(!0);try{let n={...h,...e},i=await A.setGezelPoppetje(t.id,{poppetje:n});r({...t,poppetje:i.poppetje})}catch(e){m(e.message)}finally{a(!1)}}};return(0,G.jsx)(o,{open:e,onOpenChange:e=>{e||n()},children:(0,G.jsxs)(u,{children:[(0,G.jsx)(l,{}),(0,G.jsxs)(f,{className:`accessories-dialog`,children:[(0,G.jsx)(s,{asChild:!0,children:(0,G.jsxs)(`h3`,{children:[t.name,`'s accessories`]})}),(0,G.jsx)(c,{className:`muted small`,children:`Add or remove worn items. Physical features — face, hair, skin, body — only change when you reroll.`}),(0,G.jsxs)(`div`,{className:`accessories-body`,children:[(0,G.jsx)(`div`,{className:`accessories-preview`,"aria-label":`${t.name} preview`,children:h?(0,G.jsx)(M,{poppetje:h,variant:`full`,size:150,grainStyle:`wavy`}):(0,G.jsx)(`span`,{className:`muted small`,children:`Generating…`})}),(0,G.jsxs)(`div`,{className:`accessories-controls`,children:[(0,G.jsx)(Q,{slot:`hat`,label:`Hat`,value:h?.hat??null,options:C,labels:tt,locked:$(`hat`,g,h?.hat??null),onChange:e=>void _({hat:e}),disabled:i||!h}),(0,G.jsx)(Q,{slot:`dress`,label:`Garment`,value:h?.dress??null,options:ee,labels:nt,locked:$(`dress`,g,h?.dress??null),onChange:e=>void _({dress:e}),disabled:i||!h}),(0,G.jsx)(Q,{slot:`accessory`,label:`Accessory`,value:h?.accessory??null,options:O,labels:rt,locked:$(`accessory`,g,h?.accessory??null),onChange:e=>void _({accessory:e}),disabled:i||!h})]})]}),d&&(0,G.jsx)(`p`,{className:`gz-dialog-error`,children:d}),(0,G.jsx)(p,{children:(0,G.jsx)(`button`,{type:`button`,className:`primary`,onClick:n,children:`Done`})})]})]})})}function ot({open:e,gezel:t,isGenerating:n,onClose:r,onUpdated:i,setGenerating:a}){let[c,d]=(0,W.useState)(``),[m,h]=(0,W.useState)([]),[g,_]=(0,W.useState)(!1),[v,y]=(0,W.useState)(null),b=(0,W.useCallback)(async()=>{try{let e=await A.listGezelIconHistory(t.id);h(e.history)}catch(e){y(e.message)}},[t.id]);(0,W.useEffect)(()=>{g&&b()},[g,b]);let x=async()=>{y(null),a(!0);try{i(await A.generateGezelIcon(t.id,c.trim()?{instruction:c.trim()}:{})),d(``),g&&await b()}catch(e){y(e.message)}finally{a(!1)}},S=async e=>{y(null);try{i(await A.revertGezelIcon(t.id,{timestamp:e})),await b()}catch(e){y(e.message)}};return(0,G.jsx)(o,{open:e,onOpenChange:e=>{e||r()},children:(0,G.jsxs)(u,{children:[(0,G.jsx)(l,{}),(0,G.jsxs)(f,{className:`iterate-dialog`,children:[(0,G.jsx)(s,{asChild:!0,children:(0,G.jsxs)(`h3`,{children:[`Iterate on `,t.name,`'s icon`]})}),(0,G.jsx)(`div`,{className:`iterate-preview`,children:(0,G.jsx)(I,{svg:t.icon??null,poppetje:t.poppetje,iconOverride:t.iconOverride,name:t.name,size:120,pulsing:n})}),(0,G.jsxs)(`label`,{children:[`What should change?`,(0,G.jsx)(`textarea`,{value:c,onChange:e=>d(e.target.value),placeholder:`e.g. make the colors warmer, try a cat shape, more geometric`,rows:3})]}),v&&(0,G.jsx)(`p`,{className:`error`,children:v}),(0,G.jsxs)(p,{children:[(0,G.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:()=>_(e=>!e),children:g?`Hide history`:`Show history`}),(0,G.jsx)(`span`,{style:{flex:1}}),(0,G.jsx)(`button`,{type:`button`,onClick:r,children:`Close`}),(0,G.jsx)(`button`,{type:`button`,className:`primary`,onClick:x,disabled:n,children:n?`Generating…`:`Regenerate`})]}),g&&(0,G.jsxs)(`div`,{className:`icon-history-row`,children:[m.length===0&&(0,G.jsx)(`p`,{className:`muted`,children:`No previous variants yet.`}),m.map(e=>(0,G.jsx)(`button`,{type:`button`,className:`icon-history-item`,onClick:()=>void S(e.timestamp),title:`Revert to ${e.timestamp}`,children:(0,G.jsx)(I,{svg:e.svg,iconOverride:!0,name:t.name,size:56})},e.timestamp))]})]})]})})}function st({gezel:e,onUpdated:t}){let[n,r]=(0,W.useState)(!1),[i,a]=(0,W.useState)(`copilot`);(0,W.useEffect)(()=>{A.getConfig().then(e=>a(e.provider)).catch(()=>{})},[]);let o=(0,W.useCallback)(async(n,i)=>{let a=(e.provider??null)!==(n??null);r(!0);try{t(await A.updateGezelSettings(e.id,{provider:n??null,model:i??null,...a||!i?{reasoningEffort:null}:{}}))}finally{r(!1)}},[e.id,e.provider,t]),s=(0,W.useCallback)(async n=>{r(!0);try{t(await A.updateGezelSettings(e.id,{reasoningEffort:n??null}))}finally{r(!1)}},[e.id,t]),c=(0,W.useCallback)(async n=>{r(!0);try{t(await A.updateGezelSettings(e.id,{sandboxCopilot:n==="default"?null:n===`on`}))}finally{r(!1)}},[e.id,t]),l=(0,W.useCallback)(async n=>{r(!0);try{t(await A.updateGezelSettings(e.id,{codexPermissionMode:n===`inherit`?null:n}))}finally{r(!1)}},[e.id,t]),u=(0,W.useCallback)(async n=>{r(!0);try{t(await A.updateGezelSettings(e.id,{retrieval:n===`inherit`?null:{...e.retrieval,mode:n}}))}finally{r(!1)}},[e.id,e.retrieval,t]),d=e.provider??i,f=e.sandboxCopilot===void 0?`default`:e.sandboxCopilot?`on`:`off`,p=e.codexPermissionMode?v(e.codexPermissionMode):`inherit`,m=e.retrieval?.mode??`inherit`;return(0,G.jsxs)(`div`,{className:`provider-override`,children:[(0,G.jsx)(`span`,{className:`muted small`,children:`Model:`}),(0,G.jsx)(Xe,{provider:e.provider??null,model:e.model,onChange:(e,t)=>void o(e,t),globalProvider:i,disabled:n}),(0,G.jsx)(ye,{provider:d,model:e.model,value:e.reasoningEffort,onChange:e=>void s(e)}),(0,G.jsx)(`span`,{className:`muted small`,style:{marginLeft:`0.75rem`},title:`How much relevant indexed project knowledge is added to each substantive turn. Search remains available in Off mode.`,children:`Context:`}),[`inherit`,`off`,`lean`,`balanced`,`deep`].map(e=>(0,G.jsx)(`button`,{type:`button`,className:`provider-chip${m===e?` provider-chip-active`:``}`,onClick:()=>void u(e),disabled:n,children:e===`inherit`?`Inherit`:e===`off`?`Off`:e[0].toUpperCase()+e.slice(1)},e)),d===`copilot`&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`span`,{className:`muted small`,style:{marginLeft:`0.75rem`},title:`Deny the Copilot CLI's built-in tools (bash, web_fetch, file edit, grep) and force this gezel through our MCP tools.`,children:`Sandbox:`}),[`default`,`on`,`off`].map(e=>(0,G.jsx)(`button`,{type:`button`,className:`provider-chip${f===e?` provider-chip-active`:``}`,onClick:()=>void c(e),disabled:n,children:e==="default"?`Inherit`:e===`on`?`On`:`Off`},e))]}),d===`codex-cli`&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`span`,{className:`muted small`,style:{marginLeft:`0.75rem`},title:`Override this gezel's Codex execution posture. A project-level choice still takes precedence.`,children:`Access:`}),[`inherit`,`plan`,`edit`,`reviewed`,`full`].map(e=>(0,G.jsx)(`button`,{type:`button`,className:`provider-chip${p===e?` provider-chip-active`:``}`,onClick:()=>void l(e),disabled:n,children:e===`inherit`?`Inherit`:e===`plan`?`Plan`:e===`edit`?`Edit`:e===`reviewed`?`Reviewed`:`Full`},e))]}),e.model&&(0,G.jsx)(ct,{gezel:e,effectiveProvider:d,onUpdated:t})]})}function ct({gezel:e,effectiveProvider:t,onUpdated:n}){let[r,i]=(0,W.useState)(void 0),a=(0,W.useCallback)(async()=>{if(!(r!==void 0||!e.model))try{let[t,n]=await Promise.all([A.getCatalogItem(`chat-model`,e.model).catch(()=>null),A.getConfig().catch(()=>null)]),r=t&&t.manifest.kind===`chat-model`?t.manifest.tuning:void 0,a=n?.modelTuning?.[e.model],o=lt(r,a);o&&i(o)}catch{}},[r,e.model]);return(0,G.jsxs)(`details`,{className:`gezel-tuning-disclosure`,style:{flexBasis:`100%`,marginTop:`0.5rem`},onToggle:e=>{e.target.open&&a()},children:[(0,G.jsx)(`summary`,{className:`muted small`,style:{cursor:`pointer`},children:`Advanced tuning`}),(0,G.jsx)(`div`,{style:{marginTop:`0.5rem`},children:(0,G.jsx)(Me,{gezel:e,...r?{inherited:r}:{},effectiveProvider:t,onUpdated:n})})]})}function lt(e,t){if(!(!e&&!t))return e?t?ut(e,t):e:t}function ut(e,t){let n={...e};for(let[e,r]of Object.entries(t)){if(r===void 0)continue;let t=n[e];t&&typeof t==`object`&&!Array.isArray(t)&&r&&typeof r==`object`&&!Array.isArray(r)?n[e]=ut(t,r):n[e]=r}return n}function dt({value:e,onChange:t,disabled:n}){let r=`__default`,i=e&&e.length>0?e:r,a=i===r?`Inherit default`:S.find(e=>e.id===i)?.label??`Inherit default`,o=S.find(e=>e.id===i)?.family;return(0,G.jsxs)(d,{value:i,onValueChange:e=>t(e===r?``:e),disabled:n,children:[(0,G.jsx)(g,{className:`gezel-font-picker`,title:`Font used for this gezel's chat bubbles`,style:o?{fontFamily:o}:void 0,"aria-label":`Chat bubble font`,children:(0,G.jsx)(h,{children:a})}),(0,G.jsxs)(_,{children:[(0,G.jsx)(m,{value:r,children:`Inherit default`}),S.map(e=>(0,G.jsx)(m,{value:e.id,style:{fontFamily:e.family},children:e.label},e.id))]})]})}export{$e as GezelDetail,q as t};
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,t as n}from"./jsx-runtime-CEpd2cAX.js";import{t as r}from"./api-BX5xXiFs.js";import{lt as i}from"./doc-s6H7T0IO.js";import{n as a}from"./chunk-GAZKTT4R-BkP6-w3z.js";import{n as o}from"./chunk-MIKKUKOD-XIkmalSN.js";import"./markdown-Bi9b5f5Y.js";import"./schemas-JY4jmLbC.js";import{P as s,W as c}from"./chunk-6ECMNUIP-C1kohb1U.js";import{n as l}from"./chunk-NNJLSQPW-DJA6camf.js";import{M as u,d,ft as f,j as p,q as m}from"./index-DXWR4qW1.js";import{n as h,t as g}from"./HandboekMediaProvider-BfQW8_Nr.js";var _=e(t(),1),v=n(),y=`gezel:handboek:article`;function b(){let[e,t]=(0,_.useState)(null),[n,b]=(0,_.useState)(()=>{try{return window.localStorage.getItem(y)}catch{return null}}),[C,ee]=(0,_.useState)(null),[w,T]=(0,_.useState)(null),[E,D]=(0,_.useState)(!1),[O,k]=(0,_.useState)(`doc`),[A,j]=(0,_.useState)(!1),[M,N]=(0,_.useState)(!1),[P,F]=(0,_.useState)(null),[I,L]=(0,_.useState)(!1),[R,z]=(0,_.useState)(()=>new Set),[B,V]=(0,_.useState)(()=>new Set),[H,U]=(0,_.useState)(``),W=(0,_.useMemo)(()=>{let t=H.trim().toLowerCase();return!t||!e?[]:e.areas.flatMap(e=>e.entries).filter(e=>e.title.toLowerCase().includes(t)||(e.summary??``).toLowerCase().includes(t))},[e,H]),G=f()===`light`?p:void 0;(0,_.useEffect)(()=>{let e=!0;return r.getAudioEngineStatus().then(t=>e&&j(t.tts.status===`ok`)).catch(()=>e&&j(!1)),()=>{e=!1}},[]),(0,_.useEffect)(()=>{let e=!0,n=m();return n&&b(n.articleId),r.getHandboekToc().then(n=>{e&&(t(n),b(e=>{let t=new Set(n.areas.flatMap(e=>e.entries.map(e=>e.id)));return e&&t.has(e)?e:n.areas[0]?.entries[0]?.id??null}))}).catch(t=>e&&T(String(t))),()=>{e=!1}},[]),(0,_.useEffect)(()=>{let e=e=>{let t=e.detail;t?.articleId&&b(t.articleId)};return window.addEventListener(`gezel:open-handboek-article`,e),()=>window.removeEventListener(`gezel:open-handboek-article`,e)},[]),(0,_.useEffect)(()=>{if(!n)return;try{window.localStorage.setItem(y,n)}catch{}let e=!0;return D(!0),T(null),r.getHandboekArticle(n).then(t=>{e&&(ee(t),k(`doc`),N(!1),F(e=>{for(let t of e?.urls??[])URL.revokeObjectURL(t);return null}))}).catch(t=>e&&T(String(t))).finally(()=>e&&D(!1)),()=>{e=!1}},[n]),(0,_.useEffect)(()=>{if(!e||!n)return;let t=e.areas.find(e=>e.entries.some(e=>e.id===n)),r=t?.entries.find(e=>e.id===n);if(!(!t||!r)&&(z(e=>{if(!e.has(t.area))return e;let n=new Set(e);return n.delete(t.area),n}),r.subcategory)){let e=S(t.area,r.subcategory.id);V(t=>t.has(e)?t:new Set(t).add(e))}},[e,n]);let K=(0,_.useMemo)(()=>C?g(C.figures):null,[C]),q=(0,_.useRef)(K);(0,_.useEffect)(()=>(q.current=K,()=>q.current?.dispose?.()),[K]);let J=(0,_.useMemo)(()=>{if(!C)return null;try{return i(o(h(C.markdown)),{articleId:C.id,defaultDuration:C.defaultDuration??6})}catch{return null}},[C]),Y=(0,_.useMemo)(()=>{if(!J||J.audio.segments.length>0)return J;let e=a(J);return e<=0?J:{...J,audio:{segments:[{src:``,name:`synthetic`,duration:e,startTime:0}]}}},[J]),X=(0,_.useCallback)(()=>{if(M){N(!1);return}if(P&&P.articleId===C?.id){N(!0);return}!C||I||(L(!0),(async()=>{let e=await r.getHandboekNarration(C.id),t=await Promise.all(e.segments.map(e=>r.fetchHandboekNarrationAudio(e.hash)));return{articleId:C.id,urls:t.map(e=>URL.createObjectURL(e)),durationsMs:e.segments.map(e=>e.durationMs)}})().then(e=>{F(e),N(!0)}).catch(e=>T(`Narration unavailable: ${String(e)}`)).finally(()=>L(!1)))},[M,P,C,I]),Z=(0,_.useMemo)(()=>{if(!J||!M||!P||P.articleId!==C?.id||P.urls.length!==J.blocks.length)return null;let e=0,t=P.urls.map((t,n)=>{let r=P.durationsMs[n]/1e3,i={src:t,name:J.blocks[n].id,duration:r,startTime:e};return e+=r,i});return{...J,audio:{segments:t},blocks:J.blocks.map((e,t)=>({...e,audioSegment:t}))}},[J,M,P,C]),Q=(0,_.useMemo)(()=>{let t=new Set,n=new Map;for(let r of e?.areas??[])for(let e of r.entries){t.add(e.id);let r=e.id.split(`/`).pop();r&&!n.has(r)&&n.set(r,e.id)}return{ids:t,byStem:n}},[e]),te=e=>{let t=e.target.closest(`a`);if(!t)return;let n=t.getAttribute(`href`);if(!n||/^[a-z][a-z0-9+.-]*:/i.test(n)||n.startsWith(`//`)||n.startsWith(`#`))return;e.preventDefault(),e.stopPropagation();let r=n.split(/[?#]/)[0].replace(/\.md$/,``).replace(/^(\.\.?\/)+/,``),i=(Q.ids.has(r)?r:void 0)??Q.byStem.get(r.split(`/`).pop()??``);i&&b(i)},ne=e=>{z(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},re=e=>{V(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},$=(e,t=!1)=>(0,v.jsx)(`ul`,{className:t?`handboek-toc-subcategory-entries`:void 0,children:e.map(e=>(0,v.jsx)(`li`,{children:(0,v.jsx)(`button`,{type:`button`,className:e.id===n?`handboek-toc-entry handboek-toc-entry-active`:`handboek-toc-entry`,"aria-current":e.id===n?`page`:void 0,title:e.summary,onClick:()=>b(e.id),children:e.title})},e.id))});return(0,v.jsxs)(`div`,{className:`handboek-view`,"data-testid":`handboek-view`,children:[(0,v.jsxs)(`nav`,{className:`handboek-toc`,"aria-label":`Handboek contents`,children:[(0,v.jsxs)(`div`,{className:`handboek-toc-brand`,children:[(0,v.jsx)(d,{area:`handboek`,size:16}),(0,v.jsx)(`span`,{children:`Handboek`})]}),(0,v.jsx)(`input`,{type:`search`,className:`handboek-toc-filter`,placeholder:`Find an article…`,"aria-label":`Filter Handboek articles`,value:H,onChange:e=>U(e.target.value)}),!e&&!w&&(0,v.jsx)(`div`,{className:`handboek-toc-loading`,children:`Loading contents…`}),H.trim()?(0,v.jsx)(`section`,{className:`handboek-toc-area`,children:W.length>0?$(W):(0,v.jsx)(`div`,{className:`handboek-toc-loading`,children:`No articles match.`})}):null,!H.trim()&&e?.areas.map(e=>{let t=R.has(e.area),n=`handboek-area-${e.area}`,{ungrouped:r,subcategories:i}=x(e);return(0,v.jsxs)(`section`,{className:`handboek-toc-area`,children:[(0,v.jsx)(`h3`,{className:`handboek-toc-area-title`,children:(0,v.jsxs)(`button`,{type:`button`,className:`handboek-toc-disclosure handboek-toc-area-toggle`,"aria-expanded":!t,"aria-controls":n,onClick:()=>ne(e.area),children:[(0,v.jsx)(`span`,{className:`handboek-toc-caret`,"aria-hidden":`true`,children:`›`}),(0,v.jsx)(`span`,{children:e.title})]})}),!t&&(0,v.jsxs)(`div`,{id:n,className:`handboek-toc-area-contents`,children:[r.length>0&&$(r),i.map(t=>{let n=S(e.area,t.id),r=B.has(n),i=`handboek-subcategory-${e.area}-${t.id}`;return(0,v.jsxs)(`section`,{className:`handboek-toc-subcategory`,children:[(0,v.jsx)(`h4`,{className:`handboek-toc-subcategory-title`,children:(0,v.jsxs)(`button`,{type:`button`,className:`handboek-toc-disclosure handboek-toc-subcategory-toggle`,"aria-expanded":r,"aria-controls":i,onClick:()=>re(n),children:[(0,v.jsx)(`span`,{className:`handboek-toc-caret`,"aria-hidden":`true`,children:`›`}),(0,v.jsx)(`span`,{children:t.title})]})}),r&&(0,v.jsx)(`div`,{id:i,children:$(t.entries,!0)})]},t.id)})]})]},e.area)})]}),(0,v.jsxs)(`div`,{className:`handboek-pane`,children:[(0,v.jsxs)(`header`,{className:`handboek-pane-header`,children:[(0,v.jsxs)(`div`,{className:`handboek-pane-titles`,children:[(0,v.jsx)(`h2`,{children:C?.title??`Handboek`}),C?.summary&&(0,v.jsx)(`p`,{className:`handboek-pane-summary`,children:C.summary})]}),(0,v.jsxs)(`div`,{className:`handboek-header-controls`,children:[O===`video`&&A&&(0,v.jsx)(`button`,{type:`button`,className:M?`gz-key gz-key-active handboek-listen-key`:`gz-key handboek-listen-key`,"aria-pressed":M,disabled:I,onClick:X,title:`Narrate this article with the on-device voice`,children:I?`Preparing voice…`:`Listen`}),(0,v.jsxs)(`div`,{className:`gz-tray handboek-mode-tray`,role:`radiogroup`,"aria-label":`View as`,children:[(0,v.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":O===`doc`,className:O===`doc`?`gz-key gz-key-active`:`gz-key`,onClick:()=>k(`doc`),children:`Document`}),(0,v.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":O===`video`,className:O===`video`?`gz-key gz-key-active`:`gz-key`,onClick:()=>k(`video`),children:`Video`})]})]})]}),w&&(0,v.jsx)(`div`,{className:`handboek-error`,children:w}),E&&!C&&(0,v.jsx)(`div`,{className:`handboek-loading`,children:`Loading article…`}),J&&K&&(0,v.jsx)(c.Provider,{value:K,children:O===`doc`?(0,v.jsx)(`div`,{className:`handboek-doc`,"data-testid":`handboek-doc`,onClickCapture:te,children:(0,v.jsx)(s,{doc:J,className:`gezel-article-view`,theme:u,surface:G,imageDisplayMode:`inline`,showCover:!1})}):(0,v.jsx)(`div`,{className:`handboek-player`,"data-testid":`handboek-player`,children:(0,v.jsx)(l,{doc:Z??Y??J,theme:u,surface:G,displayMode:`video`,audioMode:Z?`media`:`synthetic`,captionsEnabled:!0,captionStyle:`social`,autoPlay:!0,showControls:!0,showScrubber:!0},Z?`narrated`:`synthetic`)})})]})]})}function x(e){let t=[],n=new Map;for(let r of e.entries){if(!r.subcategory){t.push(r);continue}let e=n.get(r.subcategory.id);e?e.entries.push(r):n.set(r.subcategory.id,{...r.subcategory,entries:[r]})}return{ungrouped:t,subcategories:[...n.values()].sort((e,t)=>e.order-t.order||e.title.localeCompare(t.title))}}function S(e,t){return`${e}:${t}`}export{b as HandboekView};
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,t as n}from"./jsx-runtime-CEpd2cAX.js";import{d as r,l as i,m as a,p as o,s}from"./primitives-DEsn1shf.js";import{t as c}from"./api-BX5xXiFs.js";import{n as l,t as u}from"./relative-time-B2kBaekd.js";import{U as d,V as f,W as p}from"./index-DXWR4qW1.js";var m=e(t(),1),h=n(),g=[{value:``,label:`All kinds`},{value:`session`,label:`Chat threads`},{value:`gezel.created`,label:`Gezel created`},{value:`gezel.deleted`,label:`Gezel removed`},{value:`gezel.renamed`,label:`Gezel renamed`},{value:`gezel.settings.updated`,label:`Gezel settings updated`},{value:`icon.generated`,label:`Icon generated`},{value:`icon.reverted`,label:`Icon reverted`},{value:`project.created`,label:`Project created`},{value:`project.updated`,label:`Project updated`},{value:`project.about.updated`,label:`Project about updated`},{value:`project.mission.updated`,label:`Project mission updated`},{value:`project.voorman.changed`,label:`Project voorman changed`},{value:`document.created`,label:`Document created`},{value:`document.updated`,label:`Document edited`},{value:`document.renamed`,label:`Document renamed`},{value:`document.deleted`,label:`Document deleted`},{value:`tool.called`,label:`Tool called`},{value:`meester.changed`,label:`Meester changed`},{value:`klerk.changed`,label:`Klerk changed`},{value:`boekwachter.changed`,label:`Boekwachter changed`},{value:`keurmeester.changed`,label:`Keurmeester changed`},{value:`gilde.updated`,label:`Catalog content updated`},{value:`task.created`,label:`Task created`},{value:`task.updated`,label:`Task updated`},{value:`task.about.updated`,label:`Task description updated`},{value:`task.status.changed`,label:`Task status changed`},{value:`task.assignee.changed`,label:`Task reassigned`},{value:`task.step.added`,label:`Task step added`},{value:`task.step.activated`,label:`Task step activated`},{value:`task.step.completed`,label:`Task step completed`},{value:`task.tick`,label:`Task cron tick`},{value:`task.canceled`,label:`Task canceled`},{value:`v1.chat.completion`,label:`App chat (connected apps)`},{value:`debug.bridge.failed`,label:`Debug: MCP bridge failed to start`}],_=`gezel:history-list-fraction:v1`,v=.2,y=.7,b=.36;function x(e){return Number.isFinite(e)?Math.max(v,Math.min(y,e)):b}function S(){if(typeof window>`u`)return b;try{let e=window.localStorage.getItem(_);return e?x(Number.parseFloat(e)):b}catch{return b}}function C({projectId:e}={}){let[t,n]=(0,m.useState)([]),[f,b]=(0,m.useState)(null),[C,w]=(0,m.useState)(!1),[T,E]=(0,m.useState)([]),[D,O]=(0,m.useState)([]),[A,j]=(0,m.useState)(``),[M,N]=(0,m.useState)(e??``);(0,m.useEffect)(()=>{e!==void 0&&N(e)},[e]);let[P,F]=(0,m.useState)(``),[I,L]=(0,m.useState)(``),[R,z]=(0,m.useState)(null),[B,V]=(0,m.useState)([]),H=(0,m.useMemo)(()=>{let e=new Map;for(let t of T)e.set(t.id,t.name);return t=>t?e.get(t)??t:``},[T]),U=(0,m.useMemo)(()=>{let e=new Map;for(let t of D)e.set(t.id,t.name);return t=>t?e.get(t)??t:``},[D]),W=(0,m.useCallback)(async()=>{w(!0),b(null);try{let e={limit:200};M&&(e.projectId=M),A&&(e.gezelId=A),P&&P!==`session`&&(e.kind=P),I.trim()&&(e.q=I.trim());let t=I.trim()?c.searchSessions({q:I.trim(),...M?{project:M}:{},...A?{gezel:A}:{},maxResults:10}).then(e=>e?.engine!==`unavailable`&&Array.isArray(e?.results)?e.results:[]).catch(()=>[]):Promise.resolve([]),r=await c.listHistory(e);V(await t);let i=P===`session`?r.entries.filter(e=>e.entryType===`session`):r.entries;n(i),z(e=>{let t=e=>e.entryType===`event`?e.id:`session:${e.id}`;if(e&&i.some(n=>t(n)===e))return e;let n=i[0];return n?t(n):null})}catch(e){b(e.message)}finally{w(!1)}},[M,A,P,I]);(0,m.useEffect)(()=>{c.listGezels().then(e=>E(e.gezels)).catch(()=>{}),c.listProjects().then(e=>O(e.projects)).catch(()=>{})},[]),(0,m.useEffect)(()=>{W()},[W]);let G=(0,m.useRef)(null),[K,Y]=(0,m.useState)(()=>S()),X=(0,m.useRef)(null),Z=(0,m.useCallback)(e=>{let t=x(e);Y(t);try{window.localStorage.setItem(_,t.toFixed(4))}catch{}},[]),Q=(0,m.useCallback)(e=>{e.preventDefault(),X.current={startX:e.clientX,startFraction:K,width:G.current?.clientWidth??1},document.body.classList.add(`chat-rail-resizing`),document.body.style.cursor=`col-resize`;let t=e=>{let t=X.current;!t||t.width<=0||Z(t.startFraction+(e.clientX-t.startX)/t.width)},n=()=>{X.current=null,document.body.style.cursor=``,document.body.classList.remove(`chat-rail-resizing`),window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},[K,Z]),$=(0,m.useCallback)(e=>{let t=e.shiftKey?.08:.02;e.key===`ArrowRight`?(e.preventDefault(),Z(K+t)):e.key===`ArrowLeft`?(e.preventDefault(),Z(K-t)):e.key===`Home`?(e.preventDefault(),Z(v)):e.key===`End`&&(e.preventDefault(),Z(y))},[K,Z]);return(0,h.jsxs)(`div`,{className:`history-view`,"data-testid":`history-view`,children:[(0,h.jsxs)(`header`,{className:`history-header`,children:[(0,h.jsx)(`h2`,{children:`History`}),(0,h.jsxs)(`div`,{className:`history-filters`,children:[e===void 0&&(0,h.jsxs)(r,{value:M||`__ALL__`,onValueChange:e=>N(e===`__ALL__`?``:e),children:[(0,h.jsx)(o,{children:(0,h.jsx)(a,{})}),(0,h.jsxs)(s,{children:[(0,h.jsx)(i,{value:`__ALL__`,children:`All projects`}),D.map(e=>(0,h.jsx)(i,{value:e.id,children:e.name},e.id))]})]}),(0,h.jsxs)(r,{value:A||`__ALL__`,onValueChange:e=>j(e===`__ALL__`?``:e),children:[(0,h.jsx)(o,{children:(0,h.jsx)(a,{})}),(0,h.jsxs)(s,{children:[(0,h.jsx)(i,{value:`__ALL__`,children:`All gezels`}),T.map(e=>(0,h.jsxs)(i,{value:e.id,children:[e.name,e.role?` — ${e.role}`:``]},e.id))]})]}),(0,h.jsxs)(r,{value:P||`__ALL__`,onValueChange:e=>F(e===`__ALL__`?``:e),children:[(0,h.jsx)(o,{children:(0,h.jsx)(a,{})}),(0,h.jsx)(s,{children:g.map(e=>(0,h.jsx)(i,{value:e.value||`__ALL__`,children:e.label},e.value||`__ALL__`))})]}),(0,h.jsx)(`input`,{placeholder:`Search…`,value:I,onChange:e=>L(e.target.value),style:{flex:1}}),(0,h.jsx)(`button`,{type:`button`,onClick:()=>void W(),children:`Refresh`})]})]}),f&&(0,h.jsx)(`p`,{className:`error`,children:f}),C&&t.length===0&&(0,h.jsx)(`p`,{className:`muted`,children:`Loading…`}),!C&&t.length===0&&!f&&(0,h.jsx)(`p`,{className:`muted`,children:`No entries yet. Create a gezel, edit a project, or have a chat — events will show up here.`}),(0,h.jsxs)(`div`,{className:`history-split`,ref:G,style:{"--history-list-width":`${(K*100).toFixed(2)}%`},children:[(0,h.jsxs)(`ul`,{className:`history-list`,children:[B.length>0&&(0,h.jsx)(`li`,{className:`history-item`,children:(0,h.jsx)(`span`,{className:`history-transcript-header muted`,children:`Said in chats`})}),B.map(e=>(0,h.jsx)(`li`,{className:`history-item`,children:(0,h.jsxs)(`button`,{type:`button`,className:`history-row`,onClick:()=>{let t={gezelId:e.gezelId,sessionId:e.sessionId,...e.projectId?{projectId:e.projectId}:{},messageIndex:e.messageStart};p([{kind:`open-session`,intent:t},d({kind:`gezel`,id:e.gezelId}),{kind:`event`,type:`gezel:open-session`,detail:t}])},children:[(0,h.jsxs)(`span`,{className:`history-line`,children:[(0,h.jsxs)(`span`,{className:`history-summary`,children:[H(e.gezelId)||e.gezelId,` · `,e.title||`Untitled session`]}),(0,h.jsx)(`time`,{className:`history-time`,dateTime:e.lastActivityAt,title:u(e.lastActivityAt),children:l(e.lastActivityAt)})]}),(0,h.jsxs)(`span`,{className:`history-meta`,children:[(0,h.jsx)(`span`,{className:`history-kind`,children:`Transcript`}),U(e.projectId)&&(0,h.jsx)(`span`,{className:`history-chip`,children:U(e.projectId)}),(0,h.jsx)(`span`,{className:`history-stat`,children:e.snippet})]})]})},`transcript:${e.sessionId}:${e.messageStart}`)),t.map(e=>{let t=e.entryType===`event`?e.id:`session:${e.id}`;return(0,h.jsx)(`li`,{className:`history-item`,children:(0,h.jsx)(`button`,{type:`button`,className:`history-row${R===t?` history-row-selected`:``}`,onClick:()=>z(t),children:e.entryType===`session`?(0,h.jsx)(J,{entry:e,gezelName:H(e.gezelId),projectName:U(e.projectId)}):(0,h.jsx)(q,{entry:e,gezelName:H(e.gezelId),projectName:U(e.projectId)})})},t)})]}),(0,h.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize history list`,tabIndex:0,className:`chat-rail-grip history-split-grip`,onMouseDown:Q,onKeyDown:$}),(0,h.jsx)(`section`,{className:`history-detail`,children:(()=>{let e=t.find(e=>(e.entryType===`event`?e.id:`session:${e.id}`)===R);return e?(0,h.jsx)(k,{entry:e,gezelName:H(e.gezelId),projectName:U(e.projectId),resolveGezel:H,resolveProject:U}):(0,h.jsx)(`p`,{className:`placeholder`,children:`Click a history entry on the left to view its details.`})})()})]})]})}var w={actionId:`Action`,appId:`App`,archived:`Status`,at:`When`,bookCatalogId:`Craftbook`,bytes:`Size`,capabilityFloor:`Capability floor`,caseId:`Case`,changed:`Changed fields`,craftbookId:`Craftbook`,createdAt:`Started`,credentialName:`Credential`,durationMs:`Duration`,fieldIds:`Fields`,fromPath:`From`,fromSteps:`Steps before`,gezel:`Gezel`,gezelId:`Gezel`,id:`Reference`,inputTokens:`Input tokens`,lastActivityAt:`Last activity`,messageCount:`Messages`,newName:`New name`,oldName:`Previous name`,outputTokens:`Output tokens`,previous:`Before`,previousStatus:`Previous status`,previousUrl:`Previous URL`,previousVersion:`Previous version`,project:`Project`,projectId:`Project`,questionId:`Question`,ref:`Task`,reportPath:`Report`,runId:`Run`,sessionId:`Chat thread`,stepId:`Step`,taskRef:`Task`,toPath:`To`,toSteps:`Steps after`,trialId:`Trial`},T={anthropic:`Anthropic`,"anthropic-cli":`Claude CLI`,"codex-cli":`Codex CLI`,copilot:`GitHub Copilot`,ds4:`DwarfStar`,"llama-cpp":`llama.cpp`,mlx:`MLX`,ollama:`Ollama`,openai:`OpenAI`,remote:`Remote device`},E=/(?:^|\.)(action|decision|failureClass|kind|outcome|phase|provider|runMode|source|state|status|storageScope|surface|tier|trigger|via)$/i,D=/(?:^|\.)(command|credentialName|id|key|model|path|ref|script|tool|url)$/i,O=/(?:^at$|At$|Date$|timestamp$)/i;function k({entry:e,gezelName:t,projectName:n,resolveGezel:r,resolveProject:i}){return e.entryType===`session`?(0,h.jsx)(j,{entry:e,gezelName:t,projectName:n}):(0,h.jsx)(A,{entry:e,gezelName:t,projectName:n,resolveGezel:r,resolveProject:i})}function A({entry:e,gezelName:t,projectName:n,resolveGezel:r,resolveProject:i}){let a=e.details,o=typeof a?.diff==`string`?a.diff:void 0,s=typeof a?.addedLines==`number`?a.addedLines:void 0,c=typeof a?.removedLines==`number`?a.removedLines:void 0,u=a?Object.fromEntries(Object.entries(a).filter(([e,t])=>t!==void 0&&![`diff`,`addedLines`,`removedLines`].includes(e))):void 0,d=u&&Object.keys(u).length>0,p={resolveGezel:r,resolveProject:i};return(0,h.jsxs)(`article`,{className:`history-detail-document`,children:[(0,h.jsxs)(`header`,{className:`history-detail-header`,children:[(0,h.jsx)(`p`,{className:`history-detail-eyebrow`,title:e.kind,children:K(e.kind)}),(0,h.jsx)(`h3`,{children:e.summary}),(0,h.jsxs)(`time`,{dateTime:e.at,className:`history-detail-time`,children:[H(e.at),` `,(0,h.jsxs)(`span`,{children:[`· `,l(e.at,{style:`long`})]})]})]}),(n||t)&&(0,h.jsx)(M,{heading:`Context`,children:(0,h.jsx)(P,{fields:{...n?{project:n}:{},...t?{gezel:t}:{}},context:p})}),d&&(0,h.jsx)(M,{heading:`Details`,children:(0,h.jsx)(P,{fields:u,context:p})}),o&&(0,h.jsx)(M,{heading:`Changes`,children:(0,h.jsx)(f,{diff:o,...s===void 0?{}:{addedLines:s},...c===void 0?{}:{removedLines:c}})}),(0,h.jsx)(N,{id:e.id})]})}function j({entry:e,gezelName:t,projectName:n}){return(0,h.jsxs)(`article`,{className:`history-detail-document`,children:[(0,h.jsxs)(`header`,{className:`history-detail-header`,children:[(0,h.jsx)(`p`,{className:`history-detail-eyebrow`,children:`Chat thread`}),(0,h.jsx)(`h3`,{children:e.title}),(0,h.jsxs)(`p`,{className:`history-detail-subtitle`,children:[t||e.gezelId,n?` in ${n}`:``]})]}),(0,h.jsx)(M,{heading:`Conversation`,children:(0,h.jsx)(P,{fields:{gezel:t||e.gezelId,project:n||e.projectId,messageCount:e.messageCount,durationMs:e.durationMs,archived:e.archived===!0?`Archived`:`Active`}})}),(0,h.jsx)(M,{heading:`Timing`,children:(0,h.jsx)(P,{fields:{createdAt:e.createdAt,lastActivityAt:e.lastActivityAt}})}),(0,h.jsx)(M,{heading:`Model`,children:(0,h.jsx)(P,{fields:{provider:e.providerName,...e.model?{model:e.model}:{}}})}),(0,h.jsx)(N,{id:e.id})]})}function M({heading:e,children:t}){return(0,h.jsxs)(`section`,{className:`history-detail-section`,children:[(0,h.jsx)(`h4`,{children:e}),t]})}function N({id:e}){return(0,h.jsxs)(`footer`,{className:`history-detail-reference`,children:[(0,h.jsx)(`span`,{children:`Record reference`}),(0,h.jsx)(`code`,{children:e})]})}function P({fields:e,context:t={},path:n=``}){let r=Object.entries(e).filter(([,e])=>e!==void 0);return r.length===0?(0,h.jsx)(`p`,{className:`muted`,children:`No additional details were recorded.`}):(0,h.jsx)(`dl`,{className:`history-detail-fields`,children:r.map(([e,r])=>{let i=n?`${n}.${e}`:e;return(0,h.jsxs)(`div`,{className:`history-detail-field`,children:[(0,h.jsx)(`dt`,{children:I(e)}),(0,h.jsx)(`dd`,{children:(0,h.jsx)(F,{field:e,fieldPath:i,value:r,context:t})})]},i)})})}function F({field:e,fieldPath:t,value:n,context:r}){if(n===null)return(0,h.jsx)(`span`,{className:`history-detail-empty`,children:`Not set`});if(typeof n==`boolean`)return(0,h.jsx)(`span`,{children:n?`Yes`:`No`});if(typeof n==`number`)return e.toLowerCase().endsWith(`ms`)?(0,h.jsx)(`span`,{children:U(n)}):e.toLowerCase().endsWith(`bytes`)||e===`bytes`?(0,h.jsx)(`span`,{children:W(n)}):(0,h.jsx)(`span`,{children:n.toLocaleString()});if(typeof n==`string`){if(O.test(e)&&V(n))return(0,h.jsx)(`time`,{dateTime:n,children:H(n)});let i=L(t,R(e,n,r));return D.test(t)?(0,h.jsx)(`code`,{className:`history-detail-code`,children:i}):(0,h.jsx)(`span`,{className:`history-detail-text`,children:i})}return Array.isArray(n)?n.length===0?(0,h.jsx)(`span`,{className:`history-detail-empty`,children:`None`}):(0,h.jsx)(`ul`,{className:`history-detail-list`,children:n.map((n,i)=>(0,h.jsx)(`li`,{children:B(n)?(0,h.jsx)(P,{fields:n,context:r,path:`${t}.${i}`}):(0,h.jsx)(F,{field:e,fieldPath:t,value:n,context:r})},`${t}:${i}`))}):B(n)?(0,h.jsx)(`div`,{className:`history-detail-nested`,children:(0,h.jsx)(P,{fields:n,context:r,path:t})}):(0,h.jsx)(`span`,{className:`history-detail-text`,children:String(n)})}function I(e){let t=w[e];if(t)return t;let n=e.replace(/[._-]+/g,` `).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).toLowerCase().replace(/\bid\b/g,`ID`).replace(/\burl\b/g,`URL`).replace(/\bapi\b/g,`API`).trim();return n.charAt(0).toUpperCase()+n.slice(1)}function L(e,t){return(e.split(`.`).at(-1)??e).toLowerCase().includes(`provider`)?T[t]??t:E.test(e)?z(t):t}function R(e,t,n){return e===`gezelId`?n.resolveGezel?.(t)||t:(e===`projectId`||e===`targetProjectId`)&&n.resolveProject?.(t)||t}function z(e){let t=e.replace(/[._-]+/g,` `);return t.charAt(0).toUpperCase()+t.slice(1)}function B(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function V(e){return!Number.isNaN(new Date(e).getTime())}function H(e){return V(e)?new Intl.DateTimeFormat(void 0,{dateStyle:`medium`,timeStyle:`short`}).format(new Date(e)):e}function U(e){if(!Number.isFinite(e)||e<0)return`${e} ms`;if(e<1e3)return`${Math.round(e)} ms`;let t=Math.round(e/1e3),n=Math.floor(t/86400),r=Math.floor(t%86400/3600),i=Math.floor(t%3600/60),a=t%60,o=[];return n&&o.push(`${n} ${n===1?`day`:`days`}`),r&&o.push(`${r} ${r===1?`hour`:`hours`}`),i&&o.push(`${i} ${i===1?`minute`:`minutes`}`),a&&o.length<2&&o.push(`${a} ${a===1?`second`:`seconds`}`),o.slice(0,2).join(` `)}function W(e){if(!Number.isFinite(e)||e<0)return`${e} bytes`;if(e<1024)return`${e.toLocaleString()} ${e===1?`byte`:`bytes`}`;let t=[`KB`,`MB`,`GB`,`TB`],n=e/1024,r=t[0];for(let e=1;e<t.length&&n>=1024;e+=1)n/=1024,r=t[e];return`${new Intl.NumberFormat(void 0,{maximumFractionDigits:1}).format(n)} ${r}`}var G={"gezel.created":`Gezel created`,"gezel.renamed":`Gezel renamed`,"gezel.settings.updated":`Gezel settings`,"project.created":`Project created`,"project.updated":`Project updated`,"project.about.updated":`Project brief`,"project.mission.updated":`Mission updated`,"project.voorman.changed":`Voorman changed`,"project.gezel.joined":`Joined project`,"icon.generated":`Icon generated`,"icon.reverted":`Icon reverted`,"poppetje.generated":`Portrait carved`,"document.created":`Document created`,"document.updated":`Document edited`,"document.renamed":`Document renamed`,"document.deleted":`Document deleted`,"craftbook.created":`Craftbook created`,"task.created":`Task created`,"tool.called":`Tool call`,"meester.changed":`Meester changed`,"klerk.changed":`Klerk changed`,"boekwachter.changed":`Boekwachter changed`,"keurmeester.changed":`Keurmeester changed`,"gilde.updated":`Catalog content updated`,"v1.chat.completion":`App chat`};function K(e){let t=G[e];if(t)return t;let n=e.split(`.`).join(` `);return n.charAt(0).toUpperCase()+n.slice(1)}function q({entry:e,gezelName:t,projectName:n}){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`span`,{className:`history-line`,children:[(0,h.jsx)(`span`,{className:`history-summary`,children:e.summary}),(0,h.jsx)(`time`,{className:`history-time`,dateTime:e.at,title:u(e.at),children:l(e.at)})]}),(0,h.jsxs)(`span`,{className:`history-meta`,children:[(0,h.jsx)(`span`,{className:`history-kind`,title:e.kind,children:K(e.kind)}),n&&(0,h.jsx)(`span`,{className:`history-chip`,children:n}),t&&(0,h.jsx)(`span`,{className:`history-chip`,children:t})]})]})}function J({entry:e,gezelName:t,projectName:n}){let r=Math.max(1,Math.round(e.durationMs/6e4)),i=e.durationMs<6e4?`<1m`:`${r}m`;return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`span`,{className:`history-line`,children:[(0,h.jsxs)(`span`,{className:`history-summary`,children:[t||e.gezelId,` · `,e.title]}),(0,h.jsx)(`time`,{className:`history-time`,dateTime:e.lastActivityAt,title:u(e.lastActivityAt),children:l(e.lastActivityAt)})]}),(0,h.jsxs)(`span`,{className:`history-meta`,children:[(0,h.jsx)(`span`,{className:`history-kind`,children:`Thread`}),n&&(0,h.jsx)(`span`,{className:`history-chip`,children:n}),(0,h.jsxs)(`span`,{className:`history-stat`,children:[e.messageCount,` msgs, `,i]})]})]})}export{C as HistoryView};
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,t as n}from"./jsx-runtime-CEpd2cAX.js";import{C as r,D as i,E as a,O as o,S as s,T as c,b as l,w as u,x as d}from"./primitives-DEsn1shf.js";import{Kt as f,R as p,an as m,bt as h,lt as g,pt as _}from"./dist-BPx-FyRH.js";import{t as v}from"./api-BX5xXiFs.js";import{t as y}from"./poppetje-Ce-02Aqi.js";import{n as b,t as x}from"./relative-time-B2kBaekd.js";import{lt as S}from"./doc-s6H7T0IO.js";import{n as C}from"./chunk-MIKKUKOD-XIkmalSN.js";import"./markdown-Bi9b5f5Y.js";import{P as w,W as T}from"./chunk-6ECMNUIP-C1kohb1U.js";import{n as E}from"./chunk-NNJLSQPW-DJA6camf.js";import{Lt as D,M as O,Rt as k,Tt as A,Vt as j,b as M,f as N,ft as P,j as F,lt as I,pt as ee,zt as L}from"./index-DXWR4qW1.js";import"./provider-default-BLsHrgzI.js";import{i as R,t as z}from"./ChatTimelineView-Do9EryEH.js";import{n as B}from"./composer-prefill-CbG_i1Rx.js";import{t as V}from"./SessionSwitcher-C8te7YSe.js";import{c as H,l as te,o as U,s as ne,t as re}from"./chat-thread-memory-CZGcwgGo.js";import{n as ie}from"./useCompactLayout-BarJPYcv.js";import{n as ae,t as oe}from"./HandboekMediaProvider-BfQW8_Nr.js";import{n as se}from"./useCopilotAvailability-BH1nLXQI.js";import{t as ce}from"./security-levels-QFeYFDP-.js";var W=e(t(),1),le=`gezel-first-run-intro`,G=n();function K(e,t,n){let r=e instanceof Error?e.message:String(e),i=e instanceof Error&&`mismatch`in e?e.mismatch:void 0;return i?{kind:`failed`,provider:t,modelId:n,error:r,mismatch:i}:{kind:`failed`,provider:t,modelId:n,error:r}}function ue({config:e,onConfigChanged:t,onModelInstalled:n}){let[r,i]=(0,W.useState)({kind:`hidden`}),[a,o]=(0,W.useState)(!1),[s,c]=(0,W.useState)(!1),[l,u]=(0,W.useState)(!1),d=(0,W.useRef)(!1),f=se(),p=(0,W.useCallback)(async()=>{if(e.provider!==`llama-cpp`&&e.provider!==`mlx`){i({kind:`hidden`});return}let t=e.provider,r=e.defaultModel?.[t];if(!r){i({kind:`hidden`});return}if(e.firstRunInstallError){i({kind:`failed`,provider:t,modelId:r,error:e.firstRunInstallError});return}try{let[e,a,o,s]=await Promise.all([t===`mlx`?v.listMlxModels():v.listLlamaCppModels(),t===`mlx`?v.listMlxActiveInstalls():v.listLlamaCppActiveInstalls(),v.getCatalogItem(`chat-model`,r).catch(()=>null),v.getMemoryProfile().catch(()=>null)]);if(e.models.some(e=>e.id===r)){i({kind:`hidden`}),d.current||(d.current=!0,A(t),n?.());return}let c=be(o,t),l=a.installs.find(e=>e.catalogId===r)??a.installs[0];if(l){i({kind:`installing`,provider:t,modelId:l.catalogId,sizeBytes:l.catalogId===r?c:null,progress:{bytesWritten:l.bytesWritten,totalBytes:l.totalBytes,phase:l.phase}});return}i({kind:`needs-download`,provider:t,modelId:r,sizeBytes:c,memory:s})}catch{}},[e.provider,e.defaultModel,e.firstRunInstallError,n]);(0,W.useEffect)(()=>{if(r.kind!==`installing`&&r.kind!==`hidden`)return;p();let e=setInterval(()=>void p(),3e3);return()=>clearInterval(e)},[p,r.kind]);let m=(0,W.useCallback)(async(e,t,n=!1)=>{let r=null,i=null,a=n?{skipSha:!0}:void 0;if(e===`mlx`?await v.installMlxModel(t,e=>{e.type===`error`&&(r=e.error,e.mismatch&&(i=e.mismatch))},void 0,a):await v.installLlamaCppModel(t,e=>{e.type===`error`&&(r=e.error,e.mismatch&&(i=e.mismatch))},void 0,a),r){let e=Error(r);throw i&&(e.mismatch=i),e}},[]),h=(0,W.useCallback)(async()=>{if(r.kind===`needs-download`){u(!0);try{i({kind:`installing`,provider:r.provider,modelId:r.modelId,sizeBytes:r.sizeBytes,progress:null}),await m(r.provider,r.modelId),await p()}catch(e){i(K(e,r.provider,r.modelId))}finally{u(!1)}}},[r,p,m]),g=(0,W.useCallback)(async()=>{if(r.kind===`failed`){o(!0);try{t(await v.updateConfig({firstRunInstallError:null})),await m(r.provider,r.modelId),await p()}catch(e){i(K(e,r.provider,r.modelId))}finally{o(!1)}}},[r,t,p,m]),_=(0,W.useCallback)(async()=>{if(!(r.kind!==`failed`||!r.mismatch)){o(!0);try{t(await v.updateConfig({firstRunInstallError:null})),i({kind:`installing`,provider:r.provider,modelId:r.modelId,sizeBytes:null,progress:null}),await m(r.provider,r.modelId,!0),await p()}catch(e){i(K(e,r.provider,r.modelId))}finally{o(!1)}}},[r,t,p,m]),y=(0,W.useCallback)(async()=>{if(f?.available===!1){window.dispatchEvent(new CustomEvent(`gezel:navigate`,{detail:{view:`settings`,section:`copilot`}})),i({kind:`hidden`});return}t(await v.updateConfig({provider:`copilot`})),i({kind:`hidden`})},[t,f]),b=(0,W.useCallback)(async()=>{if(r.kind===`failed`){c(!0);try{let n=r.modelId.replace(/-mlx$/,``);t(await v.updateConfig({provider:`llama-cpp`,defaultModel:{...e.defaultModel,"llama-cpp":n},firstRunInstallError:null})),await m(`llama-cpp`,n),await p()}catch(e){i(K(e,r.provider,r.modelId))}finally{c(!1)}}},[r,e.defaultModel,t,p,m]);if(r.kind===`hidden`)return null;if(r.kind===`needs-download`){let e=J(r.modelId),t=r.sizeBytes?ye(r.sizeBytes):null,n=t?`Download recommended model (${e}, ${t})`:`Download recommended model (${e})`;return(0,G.jsxs)(`output`,{className:`first-run-banner first-run-banner-installing`,children:[(0,G.jsx)(`div`,{className:`first-run-banner-head`,children:(0,G.jsx)(`strong`,{children:`Set up your first on-device model`})}),(0,G.jsxs)(`p`,{className:`first-run-banner-body`,children:[_e(r.memory),` We've picked one we think will work well on this device — click below to download it. Usually `,ve(r.sizeBytes),` on fast Internet, and you only have to do this once.`]}),(0,G.jsx)(`div`,{className:`first-run-banner-actions`,children:(0,G.jsx)(`button`,{type:`button`,className:`first-run-banner-btn first-run-banner-btn-primary`,onClick:()=>void h(),disabled:l,children:l?`Starting…`:n})})]})}if(r.kind===`installing`)return(0,G.jsxs)(`output`,{className:`first-run-banner first-run-banner-installing`,children:[(0,G.jsxs)(`div`,{className:`first-run-banner-head`,children:[(0,G.jsx)(`span`,{className:`first-run-banner-spinner`,"aria-hidden":!0}),(0,G.jsxs)(`strong`,{children:[`Downloading `,J(r.modelId),` for first-time setup`]})]}),(0,G.jsxs)(`p`,{className:`first-run-banner-body`,children:[`Gezel is downloading a local AI model so your conversations run on this device. Usually`,` `,ve(r.sizeBytes),` on fast Internet. You can start working with gezellen as soon as this finishes.`]}),(0,G.jsx)(fe,{progress:r.progress}),(0,G.jsx)(de,{})]});let x=r.provider===`mlx`,S=r.mismatch!=null,C=S?`${J(r.modelId)} is newer on Hugging Face than the version Gezel knows about`:`Couldn't download ${J(r.modelId)}`,w=S?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`p`,{className:`first-run-banner-body`,children:[`The file `,(0,G.jsx)(`code`,{children:r.mismatch?.file}),` on Hugging Face has changed since this version of Gezel was published, so its checksum doesn't match what we expected. The new file is probably fine — Hugging Face routinely re-publishes models with small upstream fixes — but we can't guarantee it.`]}),(0,G.jsx)(`p`,{className:`first-run-banner-body`,children:`You can download it anyway and start using it now, or wait for a Gezel update with a refreshed catalog.`})]}):(0,G.jsx)(`p`,{className:`first-run-banner-body`,children:r.error});return(0,G.jsxs)(`output`,{className:`first-run-banner first-run-banner-failed`,children:[(0,G.jsx)(`div`,{className:`first-run-banner-head`,children:(0,G.jsx)(`strong`,{children:C})}),w,(0,G.jsxs)(`div`,{className:`first-run-banner-actions`,children:[S&&(0,G.jsx)(`button`,{type:`button`,className:`first-run-banner-btn first-run-banner-btn-primary`,onClick:()=>void _(),disabled:a||s,title:`Download the current file from Hugging Face without verifying it against the catalog's pinned checksum.`,children:a?`Downloading…`:`Download anyway`}),(0,G.jsx)(`button`,{type:`button`,className:S?`first-run-banner-btn`:`first-run-banner-btn first-run-banner-btn-primary`,onClick:()=>void g(),disabled:a||s,children:a&&!S?`Retrying…`:`Retry download`}),x&&(0,G.jsx)(`button`,{type:`button`,className:`first-run-banner-btn`,onClick:()=>void b(),disabled:a||s,title:`Use the llama engine instead. Works without Python; slightly slower than MLX on Apple Silicon.`,children:s?`Switching…`:`Switch to llama`}),(0,G.jsx)(`button`,{type:`button`,className:`first-run-banner-btn`,onClick:()=>void y(),disabled:a||s,children:f?.available===!1?`Set up GitHub Copilot`:`Use GitHub Copilot instead`}),!S&&(0,G.jsx)(I,{className:`first-run-banner-btn`,report:{surface:`model-download`,message:r.error,detail:{code:`first-run-install-failed`,engine:r.provider}}})]})]})}function de(){return(0,G.jsxs)(`p`,{className:`first-run-banner-wait`,children:[`Nothing to do until this finishes — a good moment to read`,` `,(0,G.jsx)(`button`,{type:`button`,className:`gz-link-button`,onClick:()=>{document.getElementById(le)?.scrollIntoView({behavior:`smooth`,block:`start`})},children:`what gezel is and how to work with your crew →`})]})}function fe({progress:e}){let t=e!=null&&e.totalBytes>0&&e.phase===`downloading`,n=t?Math.min(100,Math.round(e.bytesWritten/e.totalBytes*100)):0,r=e?e.phase===`verifying`?`Checking download…`:e.phase===`extracting-metadata`?`Reading model info…`:t?`${q(e.bytesWritten)} of ${q(e.totalBytes)} · ${n}%`:e.bytesWritten>0?`${q(e.bytesWritten)} downloaded`:`Starting…`:`Starting…`;return(0,G.jsxs)(`div`,{className:`first-run-banner-progress`,children:[(0,G.jsx)(`div`,{className:t?`first-run-banner-bar`:`first-run-banner-bar first-run-banner-bar-indeterminate`,children:(0,G.jsx)(`div`,{className:`first-run-banner-bar-fill`,style:t?{width:`${n}%`}:void 0})}),(0,G.jsx)(`span`,{className:`first-run-banner-progress-label`,children:r})]})}function q(e){return e>=1024**3?`${(e/1024**3).toFixed(1)} GB`:e>=1024**2?`${(e/1024**2).toFixed(0)} MB`:e>=1024?`${(e/1024).toFixed(0)} KB`:`${e} B`}var pe=25e9,me=13e9,he=5e9,ge=8*1024**3;function _e(e){return e?e.source===`gpu-integrated`||e.source===`system-ram-fallback`||e.source!==`darwin-unified`&&e.gpuMemoryKind!==`unified`&&(e.gpuVramBytes==null||e.gpuVramBytes<ge)?`This device is best suited to small AI models.`:`You can run ${e.usableBytes>=pe?`large`:e.usableBytes>=me?`medium-size`:e.usableBytes>=he?`small-size`:`tiny`} AI models${e.source===`darwin-unified`||e.gpuMemoryKind===`discrete`||e.gpuMemoryKind===`unified`?` comfortably`:``} on this device.`:`You can run AI models on this device.`}function ve(e){if(!e)return`2–5 minutes`;let t=e/1024**3;return`~${Math.max(5,Math.ceil(t/5)*5)} minutes`}function ye(e){let t=e/1024**3;if(t>=1)return`~${t.toFixed(1)} GB`;let n=e/1024**2;return`~${Math.round(n)} MB`}function be(e,t){if(!e)return null;let n=e.manifest;return!n||n.kind!==`chat-model`?null:(t===`mlx`?n.mlx?.approxSizeBytes:n.llamaCpp?.approxSizeBytes)??n.approxSizeBytes??null}function J(e){switch(e){case`gemma4-e2b-q4`:case`gemma4-e2b`:case`gemma4-e2b-mlx`:return`Gemma 4 (E2B)`;case`gemma4-e4b-q4`:case`gemma4-e4b`:case`gemma4-e4b-mlx`:return`Gemma 4 (E4B)`;case`gemma4-12b-q4`:case`gemma4-12b-q8`:return`Gemma 4 (12B)`;case`gemma4-26b-q4`:case`gemma4-26b`:case`gemma4-26b-mlx`:return`Gemma 4 (26B-A4B MoE)`;case`gemma4-31b-q4`:return`Gemma 4 (31B)`;case`qwen3.6-27b-q4`:case`qwen3.6-27b-q8`:return`Qwen 3.6 (27B)`;case`qwen3.6-35b-a3b-q4`:case`qwen3.6-35b-a3b-q8`:return`Qwen 3.6 (35B-A3B MoE)`;default:return e}}function Y(e){return e==null?``:e>=1024**3?`~${(e/1024**3).toFixed(1)} GB`:`~${Math.round(e/1024**2)} MB`}function X(e){return e>=1024**3?`${(e/1024**3).toFixed(1)} GB`:e>=1024**2?`${(e/1024**2).toFixed(0)} MB`:e>=1024?`${(e/1024).toFixed(0)} KB`:`${e} B`}function xe(e,t,n){let r=null;for(let i of e){let e=i.manifest;_(e)&&h(t,n===`image`?{minRamGB:e.minRamGB}:{minVramGB:e.minVramGB})&&(r==null||(e.recoScore??0)>(r.recoScore??0))&&(r=e)}return r}function Se(e){let t=null;for(let n of e)_(n)&&(t==null||(n.recoScore??0)>(t.recoScore??0))&&(t=n);return t}function Ce(e){let t=(e.approxSizeBytes??0)+(e.auxiliaryFiles??[]).reduce((e,t)=>e+(t.sizeBytes??0),0);return t>0?t:null}function Z(e,t){return e.models.some(e=>e.id===t)}function we(){let[e,t]=(0,W.useState)(null),[n,f]=(0,W.useState)({}),[p,m]=(0,W.useState)(!1),[h,g]=(0,W.useState)(new Set),[_,y]=(0,W.useState)(null),[b,x]=(0,W.useState)(!1),[S,C]=(0,W.useState)(null),w=(0,W.useRef)(new Map),T=(0,W.useCallback)((e,t)=>{f(n=>({...n,[e]:t}))},[]),E=(0,W.useCallback)(async(e,t)=>{if(w.current.has(e.key))return;let n=new AbortController;w.current.set(e.key,n);let r=null;try{if(await t(t=>{if(t.type===`progress`){let n=t.bytesWrittenAll??t.bytesWritten,r=t.totalBytesAll??t.totalBytes;r&&n!=null&&T(e.key,{status:`installing`,pct:Math.min(100,Math.round(n/r*100)),bytesWritten:n,totalBytes:r})}else t.type===`error`&&(r=t.error??`download failed`)},n.signal),r)throw Error(r);T(e.key,{status:`done`,pct:100})}catch(t){if(n.signal.aborted)return;T(e.key,{status:`error`,pct:null,error:t instanceof Error?t.message:String(t)})}finally{w.current.get(e.key)===n&&w.current.delete(e.key)}},[T]);(0,W.useEffect)(()=>{let e=!1,n={models:[]};return(async()=>{try{let[r,i,a,o,s,c,l,u,d,p,m,h]=await Promise.all([v.getMemoryProfile(),v.listCatalogItems(`image-model`),v.listCatalogItems(`video-model`),v.listAudioCatalog(),v.listInstalledImageModels().catch(()=>n),v.listInstalledVideoModels().catch(()=>n),v.listInstalledSttModels().catch(()=>n),v.listInstalledTtsModels().catch(()=>n),v.listActiveImagePulls().catch(()=>({pulls:[]})),v.listActiveVideoPulls().catch(()=>({pulls:[]})),v.listRecognitionCatalog().catch(()=>({models:[]})),v.listInstalledRecognitionModels().catch(()=>n)]);if(e)return;let g={platform:r.platform,gpuVramBytes:r.gpuVramBytes,totalRamBytes:r.totalRamBytes,usableBytes:r.usableBytes,...r.budgetBytes===void 0?{}:{budgetBytes:r.budgetBytes}},_=[],y=xe(i.items,g,`image`);if(y){let e=d.pulls.find(e=>e.id===y.id&&!e.finished);_.push({key:`image`,id:y.id,what:`image model`,name:y.name,sizeBytes:Ce(y),installed:Z(s,y.id),start:(e,t)=>v.pullImageModel(y.id,e,t),cancel:()=>v.cancelImagePull(y.id),...e?{resume:{bytesWritten:e.bytesWritten,totalBytes:e.totalBytes,subscribe:(e,t)=>v.subscribeImagePull(y.id,e,t)}}:{}})}let b=[...m.models].filter(e=>!e.approxSizeBytes||e.approxSizeBytes<=g.usableBytes*.5).sort((e,t)=>t.recoScore-e.recoScore)[0];b&&_.push({key:`recognition`,id:b.id,what:`image reading`,name:b.name,sizeBytes:b.approxSizeBytes,installed:Z(h,b.id),start:(e,t)=>v.pullRecognitionModel(b.id,e,t)});let x=Se(o.stt);x&&_.push({key:`stt`,id:x.id,what:`speech-to-text`,name:x.name,sizeBytes:x.approxSizeBytes,installed:Z(l,x.id),start:(e,t)=>v.pullAudioModel(`stt`,x.id,e,t)});let S=Se(o.tts);S&&_.push({key:`tts`,id:S.id,what:`text-to-speech`,name:S.name,sizeBytes:S.approxSizeBytes,installed:Z(u,S.id),start:(e,t)=>v.pullAudioModel(`tts`,S.id,e,t)});let C=xe(a.items,g,`video`);if(C){let e=p.pulls.find(e=>e.id===C.id&&!e.finished);_.push({key:`video`,id:C.id,what:`video model`,name:C.name,sizeBytes:C.approxSizeBytes??null,installed:Z(c,C.id),start:(e,t)=>v.pullVideoModel(C.id,e,t),cancel:()=>v.cancelVideoPull(C.id),...e?{resume:{bytesWritten:e.bytesWritten,totalBytes:e.totalBytes,subscribe:(e,t)=>v.subscribeVideoPull(C.id,e,t)}}:{}})}t(_);let w={};for(let e of _)if(e.installed)w[e.key]={status:`done`,pct:100};else if(e.resume){let{bytesWritten:t,totalBytes:n}=e.resume;w[e.key]={status:`installing`,pct:n>0?Math.min(100,Math.round(t/n*100)):null,bytesWritten:t,totalBytes:n}}f(w);for(let e of _)!e.installed&&e.resume&&E(e,e.resume.subscribe)}catch{e||t([])}})(),()=>{e=!0}},[E]);let D=(0,W.useCallback)(async e=>{f(t=>{let n=t[e.key]?.status;return n===`installing`||n===`done`?t:{...t,[e.key]:{status:`installing`,pct:null}}}),await E(e,e.start)},[E]),O=(0,W.useCallback)(async e=>{w.current.get(e.key)?.abort();try{await e.cancel?.(),T(e.key,{status:`idle`,pct:null})}catch(t){T(e.key,{status:`error`,pct:null,error:t instanceof Error?t.message:String(t)})}},[T]),k=(0,W.useMemo)(()=>(e??[]).filter(e=>{let t=n[e.key]?.status??`idle`;return t===`idle`||t===`error`}),[e,n]),A=(0,W.useMemo)(()=>k.filter(e=>h.has(e.key)),[k,h]),j=(0,W.useMemo)(()=>A.reduce((e,t)=>e+(t.sizeBytes??0),0),[A]),M=(0,W.useMemo)(()=>A.filter(e=>e.sizeBytes==null).length,[A]),N=(0,W.useMemo)(()=>k.filter(e=>e.key!==`video`).reduce((e,t)=>e+(t.sizeBytes??0),0),[k]),P=(0,W.useCallback)(e=>{let t=e?k.filter(t=>t.key===e):k.filter(e=>e.key!==`video`);g(new Set(t.map(e=>e.key))),y(null),C(null),x(t.length>0),m(!0)},[k]);(0,W.useEffect)(()=>{if(!p||A.length===0){y(null),x(!1),C(null);return}if(j<=0){y(null),x(!1),C(`Gezel couldn't determine this model's size. Its installer will check space again before writing.`);return}let e=!1;return y(null),C(null),x(!0),v.checkModelDownloadSpace({sizeBytes:Math.ceil(j)}).then(t=>{e||y(t)}).catch(t=>{e||C(`Gezel couldn't measure free space (${t instanceof Error?t.message:String(t)}). Each installer will check again before writing.`)}).finally(()=>{e||x(!1)}),()=>{e=!0}},[p,j,A.length]);let F=(0,W.useCallback)(()=>{for(let e of A)D(e);m(!1)},[D,A]);if((0,W.useEffect)(()=>{let e=w.current;return()=>{for(let t of e.values())t.abort()}},[]),!e||e.length===0)return null;let I=k.length>0,ee=A.length>0&&!b&&(_===null||_.ok);return(0,G.jsxs)(`section`,{className:`setup-section home-media-section`,children:[(0,G.jsx)(`h3`,{children:`On-device media creation and processing`}),(0,G.jsx)(`p`,{className:`muted`,style:{marginTop:0},children:`Optional local models for images, speech, and video — the recommended picks that fit this device. Browse the rest, or manage downloads, in Settings.`}),(0,G.jsxs)(`button`,{type:`button`,className:`home-media-btn home-media-btn-primary`,onClick:()=>P(),disabled:!I,children:[`Choose downloads`,N>0?` · ${Y(N)}`:``]}),(0,G.jsx)(`p`,{className:`muted small home-media-plan-hint`,children:`Video stays off until you select it. Chat models are managed separately above.`}),(0,G.jsx)(`div`,{className:`home-media-downloads`,children:e.map(e=>{let t=n[e.key]??{status:`idle`,pct:null};return(0,G.jsxs)(`div`,{className:`home-media-row`,children:[t.status===`done`?(0,G.jsxs)(`span`,{className:`home-probe home-probe-ok small`,children:[`✓ `,e.name,` on device`]}):t.status===`installing`?(0,G.jsxs)(`div`,{className:`home-media-progress`,children:[(0,G.jsxs)(`div`,{className:`home-media-progress-heading`,children:[(0,G.jsxs)(`span`,{className:`muted small`,children:[`Downloading `,e.name,`…`]}),(0,G.jsx)(`button`,{type:`button`,className:`gz-link-button`,onClick:()=>void O(e),"aria-label":`Cancel ${e.name} download`,children:`Cancel`})]}),(0,G.jsx)(`div`,{className:t.pct==null?`first-run-banner-bar first-run-banner-bar-indeterminate`:`first-run-banner-bar`,children:(0,G.jsx)(`div`,{className:`first-run-banner-bar-fill`,style:t.pct==null?void 0:{width:`${t.pct}%`}})}),(0,G.jsx)(`span`,{className:`first-run-banner-progress-label`,children:t.bytesWritten!=null&&t.totalBytes?`${X(t.bytesWritten)} of ${X(t.totalBytes)} · ${t.pct??0}%`:`Starting…`})]}):(0,G.jsxs)(`button`,{type:`button`,className:`home-media-btn`,onClick:()=>P(e.key),children:[`Download `,e.what,` (`,e.name,e.sizeBytes?`, ${Y(e.sizeBytes)}`:``,`)`]}),t.status===`error`&&(0,G.jsxs)(`span`,{className:`home-probe home-probe-fail small`,children:[`✗ `,t.error]})]},e.key)})}),(0,G.jsx)(i,{open:p,onOpenChange:e=>{m(e),e||g(new Set)},children:(0,G.jsxs)(a,{children:[(0,G.jsx)(c,{}),(0,G.jsxs)(r,{className:`home-media-plan-dialog`,children:[(0,G.jsx)(o,{asChild:!0,children:(0,G.jsx)(`h3`,{children:`Review model downloads`})}),(0,G.jsx)(u,{asChild:!0,children:(0,G.jsx)(`p`,{className:`muted small`,children:`Nothing starts until you confirm this plan. Downloads go to Gezel model storage and remain visible below while they run.`})}),(0,G.jsxs)(`fieldset`,{className:`home-media-plan-list`,children:[(0,G.jsx)(`legend`,{className:`sr-only`,children:`Models to download`}),k.map(e=>(0,G.jsxs)(`label`,{className:`home-media-plan-item`,children:[(0,G.jsx)(`input`,{type:`checkbox`,checked:h.has(e.key),onChange:t=>{g(n=>{let r=new Set(n);return t.target.checked?r.add(e.key):r.delete(e.key),r}),y(null),C(null),x(!0)}}),(0,G.jsxs)(`span`,{className:`home-media-plan-copy`,children:[(0,G.jsxs)(`span`,{className:`home-media-plan-name`,children:[e.name,e.key===`video`&&(0,G.jsx)(`span`,{className:`home-media-plan-large`,children:`Large download`})]}),(0,G.jsxs)(`span`,{className:`muted small`,children:[e.what,e.sizeBytes?` · ${Y(e.sizeBytes)}`:` · size unavailable`]})]})]},e.key))]}),(0,G.jsxs)(`div`,{className:`home-media-plan-summary`,"aria-live":`polite`,children:[(0,G.jsx)(`strong`,{children:A.length===0?`Select at least one model.`:`${A.length} model${A.length===1?``:`s`} · ${j>0?Y(j):`size unavailable`}${M>0?` + ${M} unknown`:``}`}),b?(0,G.jsx)(`span`,{className:`muted small`,children:`Checking free space…`}):_?.known&&_.ok?(0,G.jsxs)(`span`,{className:`muted small`,children:[X(_.freeBytes),` free in `,_.storageLocation,`; this plan needs `,X(_.requiredBytes),` including safety headroom.`]}):_?.known&&!_.ok?(0,G.jsxs)(`span`,{className:`error small`,children:[`Not enough free space: this plan needs `,X(_.requiredBytes),`, but`,` `,_.storageLocation,` has `,X(_.freeBytes),` free.`]}):_&&!_.known?(0,G.jsx)(`span`,{className:`muted small`,children:`Free space could not be measured. Each installer will check again before writing.`}):S?(0,G.jsx)(`span`,{className:`muted small`,children:S}):null]}),(0,G.jsxs)(d,{children:[(0,G.jsx)(s,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,children:`Cancel`})}),(0,G.jsx)(l,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,className:`primary`,disabled:!ee,onClick:F,children:b?`Checking space…`:A.length>0?`Download ${A.length} model${A.length===1?``:`s`}`:`Choose models`})})]})]})]})})]})}var Q=`welcome`,Te=`gezel:handboek:article`;function $(e){try{window.localStorage.setItem(Te,e)}catch{}window.dispatchEvent(new CustomEvent(`gezel:navigate`,{detail:{view:`handboek`}}))}function Ee(){let[e,t]=(0,W.useState)(null),[n,r]=(0,W.useState)(!1),[i,a]=(0,W.useState)(`doc`),o=P()===`light`?F:void 0;(0,W.useEffect)(()=>{let e=!0;return v.getHandboekArticle(Q).then(n=>{e&&(n&&typeof n.markdown==`string`?t(n):r(!0))}).catch(()=>e&&r(!0)),()=>{e=!1}},[]);let s=(0,W.useMemo)(()=>e?oe(e.figures??[]):null,[e]),c=(0,W.useRef)(s);(0,W.useEffect)(()=>(c.current=s,()=>c.current?.dispose?.()),[s]);let l=(0,W.useMemo)(()=>e?ae(e.markdown):null,[e]),u=(0,W.useMemo)(()=>{if(!l)return null;try{return S(C(l))}catch{return null}},[l]),d=(0,W.useMemo)(()=>{if(!e||!l)return null;try{return S(C(l),{articleId:e.id,defaultDuration:e.defaultDuration??6})}catch{return null}},[e,l]);return n?(0,G.jsx)(`p`,{children:(0,G.jsx)(`button`,{type:`button`,className:`gz-link-button`,onClick:()=>$(Q),"data-testid":`home-intro-handboek-fallback`,children:`Open the Handboek for an introduction to gezel →`})}):!u||!s?(0,G.jsx)(`p`,{className:`muted`,"aria-live":`polite`,children:`Loading the Handboek…`}):(0,G.jsxs)(`div`,{className:`home-intro-article`,"data-testid":`home-intro-article`,children:[(0,G.jsxs)(`div`,{className:`home-intro-article-controls`,children:[(0,G.jsx)(`button`,{type:`button`,className:`gz-link-button`,onClick:()=>$(Q),title:`Read this article in the Handboek`,children:`Open in Handboek →`}),(0,G.jsxs)(`div`,{className:`gz-tray handboek-mode-tray`,role:`radiogroup`,"aria-label":`View as`,children:[(0,G.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":i===`doc`,className:i===`doc`?`gz-key gz-key-active`:`gz-key`,onClick:()=>a(`doc`),children:`Read`}),(0,G.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":i===`video`,className:i===`video`?`gz-key gz-key-active`:`gz-key`,onClick:()=>a(`video`),children:`Watch`})]})]}),(0,G.jsx)(`div`,{className:`home-intro-page`,children:(0,G.jsx)(T.Provider,{value:s,children:i===`doc`?(0,G.jsx)(`div`,{className:`home-intro-doc`,onClickCapture:e=>{let t=e.target.closest(`a`);if(!t)return;let n=t.getAttribute(`href`);!n||/^[a-z][a-z0-9+.-]*:/i.test(n)||n.startsWith(`//`)||n.startsWith(`#`)||(e.preventDefault(),e.stopPropagation(),$(n.split(/[?#]/)[0].replace(/\.md$/,``).replace(/^(\.\.?\/)+/,``).split(`/`).pop()||Q))},children:(0,G.jsx)(w,{doc:u,className:`gezel-article-view`,theme:O,surface:o,thinMargins:!0,imageDisplayMode:`inline`,showCover:!1})}):(0,G.jsx)(`div`,{className:`home-intro-player`,children:(0,G.jsx)(E,{doc:d??u,theme:O,displayMode:`video`,audioMode:`synthetic`,captionsEnabled:!0,captionStyle:`social`,autoPlay:!0,showControls:!0,showScrubber:!0})})})})]})}function De(e){return e<12?`Good morning`:e<18?`Good afternoon`:`Good evening`}function Oe(e,t=Date.now()){if(!e)return null;let n=t-Date.parse(e.generatedAt);return Number.isFinite(n)&&n<1296e5?e:null}function ke(e,t=Date.now()){return b(e,{now:t})}function Ae(e,t){let n=new Set(t.map(e=>e.id)),r=(e?.recentTabs??[]).filter(e=>e.kind===`project`).slice().sort((e,t)=>t.at-e.at);for(let e of r)if(e.kind===`project`&&n.has(e.id))return e.id;let i=t.find(e=>e.id!=="default");return i?i.id:t[0]?.id??`default`}function je({review:e}){let t=e.reports[0],n=e.reports.slice(1),[r,i]=(0,W.useState)(null),[a,o]=(0,W.useState)(null);(0,W.useEffect)(()=>{if(i(null),o(null),!t)return;let e=!1;return v.readProjectArtifact(t.projectId,t.path).then(t=>{e||i(t.content)}).catch(t=>{e||o(t.message)}),()=>{e=!0}},[t]);let s=(0,W.useMemo)(()=>{if(r===null)return null;try{return S(C(r),{articleId:`night-review`})}catch{return null}},[r]),c=(0,W.useMemo)(()=>t?ie({projectId:t.projectId,reportPath:t.path}):void 0,[t]),l=e.reports.reduce((e,t)=>e+t.actionCounts.suggested,0),u=e.diffpacks;return(0,G.jsxs)(`div`,{className:`home-workshop-status-report`,role:`tabpanel`,"data-testid":`night-review-panel`,children:[(0,G.jsxs)(`p`,{className:`home-workshop-night-summary`,children:[e.tasksCompleted.length,` task`,e.tasksCompleted.length===1?``:`s`,` finished overnight, `,e.reports.length,` report`,e.reports.length===1?``:`s`,` written`,u.length>0?`, ${u.length} change proposal${u.length===1?``:`s`} waiting`:``,l>0?` — ${l} suggested action${l===1?``:`s`} to review.`:`.`]}),u.length>0&&(0,G.jsx)(`div`,{className:`home-workshop-night-reports`,children:u.map(e=>(0,G.jsxs)(`button`,{type:`button`,className:`home-workshop-night-report-row`,onClick:()=>window.dispatchEvent(new CustomEvent(`gezel:open-tab`,{detail:{kind:`project`,id:e.projectId,activate:!0}})),children:[(0,G.jsx)(`span`,{className:`home-workshop-night-report-title`,children:e.title}),(0,G.jsxs)(`span`,{className:`muted small`,children:[e.projectName,` · `,e.fileCount,` file`,e.fileCount===1?``:`s`,` · +`,e.additions,` −`,e.deletions,e.drifted?` · out of date`:``]})]},`${e.projectId}:${e.packId}`))}),t&&(0,G.jsx)(`div`,{className:`home-workshop-status-body`,children:s?(0,G.jsx)(w,{doc:s,theme:O,thinMargins:!0,imageDisplayMode:`thumbnail`,fenceRenderers:c}):a?(0,G.jsx)(`p`,{className:`error small`,children:a}):(0,G.jsxs)(`p`,{className:`muted small`,children:[`Loading `,t.title,`…`]})}),n.length>0&&(0,G.jsx)(`div`,{className:`home-workshop-night-reports`,children:n.map(e=>(0,G.jsxs)(`button`,{type:`button`,className:`home-workshop-night-report-row`,onClick:()=>window.dispatchEvent(new CustomEvent(`gezel:open-tab`,{detail:{kind:`project`,id:e.projectId,activate:!0}})),children:[(0,G.jsx)(`span`,{className:`home-workshop-night-report-title`,children:e.title}),(0,G.jsxs)(`span`,{className:`muted small`,children:[e.projectName,e.actionCounts.suggested>0?` · ${e.actionCounts.suggested} action${e.actionCounts.suggested===1?``:`s`} to review`:``]})]},`${e.projectId}:${e.path}`))}),(0,G.jsx)(`div`,{className:`home-workshop-status-foot`,children:(0,G.jsxs)(`span`,{className:`home-workshop-status-meta`,title:x(e.windowEnd),children:[`Night window ended `,ke(e.windowEnd)]})})]})}function Me({report:e,running:t,onRefresh:n}){let r=(0,W.useMemo)(()=>{try{return S(C(e.report),{articleId:`meester-status`})}catch{return null}},[e.report]);return(0,G.jsxs)(`div`,{className:`home-workshop-status-report`,role:`tabpanel`,"data-testid":`status-report-panel`,children:[(0,G.jsx)(`div`,{className:`home-workshop-status-body`,children:r?(0,G.jsx)(w,{doc:r,theme:O,thinMargins:!0,imageDisplayMode:`thumbnail`}):(0,G.jsx)(`p`,{children:e.report})}),(0,G.jsxs)(`div`,{className:`home-workshop-status-foot`,children:[(0,G.jsxs)(`span`,{className:`home-workshop-status-meta`,title:x(e.generatedAt),children:[`Written `,ke(e.generatedAt)]}),n&&(0,G.jsx)(`button`,{type:`button`,className:`home-workshop-tip-action`,onClick:n,disabled:t,children:t?`Meester is writing…`:`Write a fresh report`})]})]})}function Ne({size:e=18,color:t=`var(--sage-deep)`}){return(0,G.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 24 24`,fill:`none`,stroke:t,strokeWidth:1.7,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,G.jsx)(`path`,{d:`M12 21 V11`}),(0,G.jsx)(`path`,{d:`M12 14.4 C8.5 14.4 6.4 11.9 6.4 8.4 C9.9 8.4 12 10.9 12 14`,fill:t,fillOpacity:.18}),(0,G.jsx)(`path`,{d:`M12 12.4 C15.5 12.4 17.6 9.9 17.6 6.4 C14.1 6.4 12 8.9 12 12`,fill:t,fillOpacity:.18})]})}var Pe=[{body:(0,G.jsx)(G.Fragment,{children:`Most of getting great work out of a gezel is shaping its brief. Trim a gezel’s standing orders and it’ll stop over-explaining.`}),action:`Train a gezel`,view:`gezels`},{body:(0,G.jsx)(G.Fragment,{children:`Teach a gezel once and it sticks — stamp today’s steps into a routine it can run on its own.`}),action:`Save a routine`,view:`scripts`},{body:(0,G.jsx)(G.Fragment,{children:`Your crew can grow with your work. A second specialist lets the first stay deep on one project.`}),action:`Hire a gezel`,view:`gezels`},{body:(0,G.jsxs)(G.Fragment,{children:[`Local models come first — cloud and the web are opt-in and `,(0,G.jsx)(`em`,{children:`always marked`}),`. Adjust your providers any time.`]}),action:`Open settings`,view:`settings`},{body:(0,G.jsx)(G.Fragment,{children:`Hand the meester a half-baked idea and they’ll shape it into something your crew can actually start on.`}),action:`See your projects`,view:`projects`}];function Fe({onNavigate:e}){let[t,n]=(0,W.useState)(0),r=Pe[t%Pe.length];return(0,G.jsxs)(`div`,{className:`home-workshop-tip`,children:[(0,G.jsx)(`span`,{className:`home-workshop-tip-sprout`,children:(0,G.jsx)(Ne,{size:18})}),(0,G.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,G.jsxs)(`div`,{className:`home-workshop-tip-label-row`,children:[(0,G.jsx)(`span`,{className:`home-workshop-eyebrow home-workshop-tip-label`,children:`Tip of the day`}),(0,G.jsx)(`button`,{type:`button`,className:`home-workshop-tip-cycle`,title:`Another tip`,"aria-label":`Show another tip`,onClick:()=>n(e=>e+1),children:`↻`})]}),(0,G.jsxs)(`div`,{className:`home-workshop-tip-body`,children:[r.body,` `,(0,G.jsxs)(`button`,{type:`button`,className:`home-workshop-tip-action`,onClick:()=>e?.(r.view),children:[r.action,` →`]})]})]})]})}function Ie({direction:e}){return(0,G.jsx)(`svg`,{"aria-hidden":`true`,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.4`,strokeLinecap:`round`,strokeLinejoin:`round`,children:e===`up`?(0,G.jsx)(`path`,{d:`M6 15 L12 9 L18 15`}):(0,G.jsx)(`path`,{d:`M6 9 L12 15 L18 9`})})}function Le({chips:e}){return(0,G.jsx)(G.Fragment,{children:e.map(e=>(0,G.jsxs)(`span`,{className:`home-workshop-chip`,children:[(0,G.jsx)(`span`,{className:`home-workshop-chip-dot`,style:{background:e.dot}}),e.label]},e.label))})}function Re({statusReport:e,greeting:t,onCtaClick:n}){return e?e.cta&&n?(0,G.jsx)(`h1`,{className:`home-workshop-headline`,children:(0,G.jsx)(`button`,{type:`button`,className:`home-workshop-headline-cta`,onClick:n,title:e.cta.label,children:e.headline})}):(0,G.jsx)(`h1`,{className:`home-workshop-headline`,children:e.headline}):(0,G.jsxs)(`h1`,{className:`home-workshop-headline`,children:[t,`.`]})}function ze({chips:e,meesterName:t,meesterPoppetje:n,meesterIcon:r,meesterIconOverride:i,collapsed:a,onToggleCollapse:o,tab:s,onTabChange:c,statusReport:l,statusRunning:u,onRunStatusReport:d,nightReview:f,onNavigate:p}){let m=k(),h=new Date,g=h.getHours(),_=De(g),v=l??null,b=()=>{let e=v?.cta?.target;e&&(e.kind===`view`?p?.(e.view):e.kind===`project`?window.dispatchEvent(new CustomEvent(`gezel:open-tab`,{detail:{kind:`project`,id:e.projectId,activate:!0}})):window.dispatchEvent(new CustomEvent(`gezel:open-tab`,{detail:{kind:`task`,ref:e.taskRef,activate:!0}})))},x=`${h.toLocaleDateString(void 0,{weekday:`long`})} ${g<12?`morning`:g<18?`afternoon`:`evening`} · ${h.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`,hour12:!1})}`;return a?(0,G.jsxs)(`div`,{className:`home-workshop-greeting-collapsed`,children:[(0,G.jsx)(Re,{statusReport:v,greeting:_,onCtaClick:b}),(0,G.jsx)(`div`,{className:`home-workshop-vrule`}),(0,G.jsx)(`div`,{style:{display:`flex`,gap:8,flexWrap:`wrap`,flex:1,minWidth:0},children:(0,G.jsx)(Le,{chips:e})}),(0,G.jsx)(`button`,{type:`button`,className:`home-workshop-collapse-btn`,onClick:o,title:`Expand the greeting`,"aria-label":`Expand the greeting`,children:(0,G.jsx)(Ie,{direction:`down`})})]}):(0,G.jsxs)(`div`,{className:`home-workshop-greeting`,"data-testid":`greeting-band`,children:[(0,G.jsxs)(`div`,{className:`home-workshop-greeting-top`,children:[(0,G.jsxs)(`div`,{className:`home-workshop-tabs`,role:`tablist`,"aria-label":`Home view`,children:[(0,G.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":s===`greeting`,className:`home-workshop-tab${s===`greeting`?` is-active`:``}`,onClick:()=>c(`greeting`),children:x}),v&&(0,G.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":s===`status`,className:`home-workshop-tab${s===`status`?` is-active`:``}`,onClick:()=>c(`status`),children:`Status report`}),f&&(0,G.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":s===`night`,className:`home-workshop-tab${s===`night`?` is-active`:``}`,onClick:()=>c(`night`),children:`Last night`}),(0,G.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":s===`tour`,className:`home-workshop-tab${s===`tour`?` is-active`:``}`,onClick:()=>c(`tour`),children:`New here? What is gezel`})]}),(0,G.jsx)(`button`,{type:`button`,className:`home-workshop-collapse-btn`,onClick:o,title:`Collapse to a single row`,"aria-label":`Collapse the greeting`,children:(0,G.jsx)(Ie,{direction:`up`})})]}),(0,G.jsxs)(`div`,{className:`home-workshop-greeting-cols`,children:[(0,G.jsxs)(`div`,{className:`home-workshop-greeting-left`,children:[s===`status`&&v?(0,G.jsx)(Me,{report:v,running:u??!1,...d?{onRefresh:d}:{}}):s===`night`&&f?(0,G.jsx)(je,{review:f}):s===`tour`?(0,G.jsx)(`div`,{className:`home-workshop-tour-inline`,role:`tabpanel`,children:(0,G.jsx)(Ee,{})}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(Re,{statusReport:v,greeting:_,onCtaClick:b}),(0,G.jsx)(Fe,{onNavigate:p})]}),(0,G.jsx)(`div`,{className:`home-workshop-chips`,children:(0,G.jsx)(Le,{chips:e})})]}),m&&(0,G.jsx)(`div`,{className:`home-workshop-greeting-right`,children:(0,G.jsxs)(`div`,{className:`home-workshop-figure`,children:[n?(0,G.jsx)(y,{poppetje:n,variant:`full`,size:64,title:`${t} poppetje`}):(0,G.jsx)(D,{poppetje:null,svg:r,iconOverride:i,name:t,size:64,variant:`full`}),(0,G.jsx)(`div`,{className:`home-workshop-shelf`}),(0,G.jsxs)(`div`,{className:`home-workshop-figure-label`,children:[t,` `,(0,G.jsx)(`em`,{children:`- Meester`})]})]})})]})]})}function Be({activeSessionId:e,onFocusSession:t,onToolActivity:n,onArtifactReference:r,onArtifactSeen:i,onWorkspaceReference:a,onWorkspaceSeen:o,onOpenReference:s,onTaskReference:c,emptyPlaceholder:l,emptyContent:u}){let d=(0,W.useCallback)(e=>v.listGlobalTimeline(e),[]),f=(0,W.useCallback)(()=>v.allEventsUrl(),[]);return(0,G.jsx)(z,{scopeKey:`global`,activeSessionId:e,onFocusSession:t,onToolActivity:n,onArtifactReference:r,onArtifactSeen:i,onWorkspaceReference:a,onWorkspaceSeen:o,onOpenReference:s,...c?{onTaskReference:c}:{},emptyPlaceholder:l,emptyContent:u,loadTimeline:d,streamUrl:f,showProjectName:!0})}var Ve=[`I want to start a project — can you help me work out what it needs?`,`What kind of gezellen can you bring on, and what are they good at?`,`Here is what I am working on today. Where should I start?`];function He({meesterName:e,meesterIcon:t,meesterPoppetje:n,meesterIconOverride:r,projectId:i}){return(0,G.jsxs)(`div`,{className:`meester-greeting`,children:[(0,G.jsx)(`div`,{className:`meester-greeting-figure`,children:(0,G.jsx)(D,{svg:t??null,poppetje:n??null,iconOverride:r===!0,name:e,size:64})}),(0,G.jsxs)(`div`,{className:`meester-greeting-body`,children:[(0,G.jsxs)(`h3`,{className:`meester-greeting-title`,children:[`Hello — I'm `,e,`, your meester.`]}),(0,G.jsx)(`p`,{className:`meester-greeting-lede`,children:`I'm the one you talk to first. Tell me what you're trying to get done and I'll work out which gezellen you need, bring them on, and set the project up around them. You can also just talk things through with me.`}),(0,G.jsx)(`fieldset`,{className:`meester-greeting-openers gz-tray`,"aria-label":`Ways to start`,children:Ve.map(e=>(0,G.jsx)(`button`,{type:`button`,className:`gz-key meester-greeting-opener`,onClick:()=>B(i,e),children:e},e))})]})]})}function Ue({meesterGezelId:e,meesterName:t,meesterIcon:n,meesterPoppetje:r,meesterIconOverride:i,emptyPlaceholder:a}){let o=U(re),[s,c]=(0,W.useState)(o?.sessionId??``),[l,u]=(0,W.useState)(0),[d,f]=(0,W.useState)([]),[m,h]=(0,W.useState)(o?.gezelId||e),[g,_]=(0,W.useState)(o?.projectId||`default`),y=M(),b=(0,W.useRef)(e);(0,W.useEffect)(()=>{b.current!==e&&(b.current=e,c(``),h(e),_(`default`)),v.listGezels().then(e=>f(e.gezels)).catch(()=>f([]))},[e]),(0,W.useEffect)(()=>{ne(re,{gezelId:m,projectId:g,sessionId:s})},[m,g,s]);let x=d.find(e=>e.id===m),S=m||e,C=x?p({name:x.name,roleBasedName:x.roleBasedName},y):S===e?t:S,w=x?x.role:S===e?`Meester`:void 0,T=x?x.icon??null:S===e?n:null,E=x?x.poppetje??null:S===e?r:null,D=x?x.iconOverride??!1:S===e&&i,O=(0,W.useMemo)(()=>H({role:S===e?`meester`:`other`,gezelName:C,gezelGender:x?.gender,fixedFunctionTool:x?.fixedFunction?.tool}),[S,C,e,x?.gender,x?.fixedFunction?.tool]);return(0,G.jsx)(`section`,{className:`home-workshop-conversation`,"data-testid":`meester-chat`,children:(0,G.jsx)(te,{chatKey:`meester:global`,projectId:g,skillsProjectId:g==="default"?void 0:g,children:({onToolActivity:o,onArtifactReference:f,onArtifactSeen:p,onWorkspaceReference:v,onWorkspaceSeen:y,recentReferences:b,onOpenReference:k,onTaskReference:A})=>(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(Be,{activeSessionId:s||void 0,onFocusSession:(e,t,n)=>{h(t),_(n),c(e)},onToolActivity:o,onArtifactReference:f,onArtifactSeen:p,onWorkspaceReference:v,onWorkspaceSeen:y,onOpenReference:k,onTaskReference:A,emptyPlaceholder:a,emptyContent:!m||m===e?(0,G.jsx)(He,{meesterName:t,meesterIcon:n,meesterPoppetje:r,meesterIconOverride:i,projectId:g}):void 0}),(0,G.jsx)(R,{gezelId:S,gezelName:C,gezelRoleBasedName:x?.roleBasedName,gezelRole:w,gezelIcon:T,gezelPoppetje:E,gezelIconOverride:D,recipientGezels:d,onPrimaryRecipientChange:e=>{h(e),_(`default`),c(``)},projectId:g,sessionId:s||void 0,onSessionCreated:e=>{c(e),u(e=>e+1)},onToolActivity:o,recentReferences:b,onOpenReference:k,placeholder:O,draftScope:`meester`,belowAddressLine:(0,G.jsx)(V,{gezelId:S,projectId:g,sessionId:s||void 0,gezelName:C,onSessionIdChange:e=>c(e??``),refreshKey:l})})]})})})}function We({config:e,projects:t,meesterGezelId:n,meesterName:r,meesterIcon:i,meesterPoppetje:a,meesterIconOverride:o,banner:s,onNavigate:c}){let[l,u]=(0,W.useState)(e?.homeGreetingCollapsed??!1),d=(0,W.useRef)(!1),f=(0,W.useRef)(!1);(0,W.useEffect)(()=>{d.current||f.current||!e||(d.current=!0,u(e.homeGreetingCollapsed===!0))},[e]);let p=(0,W.useCallback)(()=>{f.current=!0,u(e=>{let t=!e;return v.updateConfig({homeGreetingCollapsed:t}).catch(()=>{}),t})},[]),[m,h]=(0,W.useState)(`greeting`),[g,_]=(0,W.useState)(null),[y,b]=(0,W.useState)(!1),[x,S]=(0,W.useState)([]),[C,w]=(0,W.useState)([]),T=(0,W.useMemo)(()=>Ae(e,t),[e,t]),E=(0,W.useCallback)(()=>{v.listQuestions({pending:!0}).then(e=>w(e.questions??[])).catch(()=>{})},[]);(0,W.useEffect)(()=>{E()},[E]);let D=(0,W.useRef)(T);D.current=T;let O=(0,W.useCallback)(()=>{let e=D.current;if(!e){S([]);return}v.listProjectTasks(e).then(t=>{D.current===e&&S(t.tasks??[])}).catch(()=>{})},[]);(0,W.useEffect)(()=>{if(!T){S([]);return}O()},[T,O]);let k=(0,W.useCallback)(()=>{v.getMeesterStatus().then(e=>{_(e),b(e.running)}).catch(()=>{})},[]);(0,W.useEffect)(()=>{k();let e=new AbortController;return(async()=>{try{for await(let t of L({url:v.allEventsUrl(),headers:v.authHeader(),signal:e.signal,fetch:v.getFetch()})){let e=t.event;if(e.type===`question_asked`||e.type===`question_answered`){E();continue}if(e.type===`task_event`){O();continue}e.type===`meester_status`&&(e.state===`started`?b(!0):(b(!1),k()))}}catch{}})(),()=>e.abort()},[k,E,O]);let A=(0,W.useMemo)(()=>Oe(g?.report),[g]),[j,M]=(0,W.useState)(null);(0,W.useEffect)(()=>{let e=!1;return v.getNightShiftReview().then(t=>{if(e)return;let n=Date.parse(t.windowEnd),r=Number.isFinite(n)&&Date.now()-n<720*60*1e3,i=t.tasksCompleted.length>0||t.reports.length>0;M(r&&i?t:null)}).catch(()=>{}),()=>{e=!0}},[]);let N=(0,W.useCallback)(()=>{b(!0),v.runMeesterStatus().catch(()=>b(!1))},[]),P=(0,W.useMemo)(()=>x.filter(e=>e.status!==`canceled`),[x]),F=(0,W.useMemo)(()=>C.filter(e=>!e.answer),[C]).length+P.filter(e=>e.assignee.kind===`user`&&e.status!==`complete`).length,I=[];return F>0&&I.push({dot:`var(--ochre)`,label:`${F} waiting on you`}),(0,G.jsxs)(`div`,{className:`home-workshop`,"data-testid":`home-workshop`,children:[s,(0,G.jsx)(ze,{chips:I,meesterName:r,meesterPoppetje:a,meesterIcon:i,meesterIconOverride:o,collapsed:l,onToggleCollapse:p,tab:m,onTabChange:h,statusReport:A,statusRunning:y,onRunStatusReport:N,nightReview:j,onNavigate:c}),(0,G.jsx)(`div`,{className:`home-workshop-body`,children:(0,G.jsx)(`div`,{className:`home-workshop-main`,children:n?(0,G.jsx)(Ue,{meesterGezelId:n,meesterName:r,meesterIcon:i,meesterPoppetje:a,meesterIconOverride:o}):(0,G.jsxs)(`section`,{className:`home-workshop-conversation`,children:[(0,G.jsx)(`div`,{className:`home-workshop-eyebrow home-workshop-conversation-eyebrow`,children:`Talk to your meester`}),(0,G.jsxs)(`p`,{className:`home-workshop-rail-empty`,children:[`No meester is designated yet. Pick one in`,` `,(0,G.jsx)(`button`,{type:`button`,className:`home-workshop-tip-action`,onClick:()=>c?.(`settings`),children:`Settings`}),`.`]})]})})})]})}function Ge(e){return e===`darwin`?`mlx`:`llama-cpp`}var Ke=2e4,qe=720;function Je({platform:e,onNavigate:t}){let[n,r]=(0,W.useState)(null),[i,a]=(0,W.useState)(null),[o,s]=(0,W.useState)([]),[c,l]=(0,W.useState)(void 0),[u,d]=(0,W.useState)(void 0),[f,h]=(0,W.useState)(null),[_,y]=(0,W.useState)(null),[b,x]=(0,W.useState)(!1),S=M(),C=c?p({name:c,roleBasedName:u},S):void 0,[w,T]=(0,W.useState)({kind:`idle`}),[E,D]=(0,W.useState)(null),[O,k]=(0,W.useState)(null);(0,W.useEffect)(()=>{let e=!1,t=0,n=()=>{v.getConfig().then(t=>{e||r(t)}).catch(()=>{e||t>=40||(t+=1,window.setTimeout(n,500))})};return n(),v.health().then(a).catch(()=>{}),v.listProjects().then(e=>s(e.projects)).catch(()=>{}),()=>{e=!0}},[]),(0,W.useEffect)(()=>{let e=n?.meesterGezelId;if(!e){l(void 0),d(void 0),h(null),y(null),x(!1);return}v.listGezels().then(t=>{let n=t.gezels.find(t=>t.id===e);l(n?.name),d(n?.roleBasedName),h(n?.icon??null),y(n?.poppetje??null),x(n?.iconOverride??!1)}).catch(()=>{})},[n?.meesterGezelId]);let A=n?.provider??`llama-cpp`,j=n?.defaultModel?.[A],[P,F]=(0,W.useState)(void 0);(0,W.useEffect)(()=>{if(A!==`llama-cpp`||j){F(void 0);return}let e=!1;return(async()=>{try{let t=await v.listLlamaCppModels();e||F(t.models[0]?.name)}catch{}})(),()=>{e=!0}},[A,j]);let I=j??P,L=A===`copilot`?!!n?.hasGithubToken:A!==`openai`||!!n?.hasOpenaiApiKey;(0,W.useEffect)(()=>{n&&w.kind===`idle`&&(A===`copilot`||A===`ollama`||L)&&B(A)},[n?.provider,n?.hasGithubToken,n?.hasOpenaiApiKey,n?.ollamaBaseUrl]);let R=(0,W.useRef)(null),z=(0,W.useCallback)(()=>{R.current&&=(clearTimeout(R.current),null)},[]),B=(0,W.useCallback)(async(e,t=0)=>{z(),T(t>0?{kind:`probing`,retryAttempt:t,retryMax:qe}:{kind:`probing`});try{let r=await v.testProvider(e);if(r.ok){T({kind:`ok`,modelCount:r.modelCount});return}if(e===`ollama`&&n?.autoStartOllama!==!1&&t<qe){R.current=setTimeout(()=>{B(e,t+1)},Ke),T({kind:`probing`,retryAttempt:t+1,retryMax:qe});return}T({kind:`fail`,error:r.error})}catch(e){T({kind:`fail`,error:e.message})}},[z,n?.autoStartOllama]);(0,W.useEffect)(()=>()=>z(),[z]);let V=g(A)&&w.kind===`ok`&&w.modelCount===0;(0,W.useEffect)(()=>{w.kind===`ok`?k(!V):w.kind===`fail`&&k(!1)},[w.kind,V]);let H=A===`copilot`||A===`ollama`||L;(0,W.useEffect)(()=>{n&&!H&&k(!1)},[n,H]),(0,W.useEffect)(()=>{if(O!==null)return;let e=window.setTimeout(()=>k(!1),3e4);return()=>window.clearTimeout(e)},[O]),(0,W.useEffect)(()=>{O!==null&&window.dispatchEvent(new CustomEvent(`gezel:first-run`,{detail:{firstRun:!O}}))},[O]);let te=(0,W.useCallback)(()=>{B(A)},[B,A]),U=(0,G.jsx)(Ye,{state:N(),platform:e});return!n||O===null?(0,G.jsx)(`div`,{className:`home-view home-view-loading`,"aria-busy":`true`,children:(0,G.jsxs)(`div`,{className:`home-loading-placeholder`,"aria-live":`polite`,children:[(0,G.jsx)(`span`,{className:`home-loading-spinner`,"aria-hidden":!0}),(0,G.jsx)(`span`,{children:`Loading…`})]})}):O?(0,G.jsx)(We,{config:n,projects:o,meesterGezelId:n?.meesterGezelId,meesterName:C??`your meester`,meesterIcon:f,meesterPoppetje:_,meesterIconOverride:b,banner:U,onNavigate:t}):(0,G.jsxs)(`div`,{className:`home-view`,children:[U,(0,G.jsx)(`h1`,{className:`home-firstrun-heading`,children:`First run setup`}),(0,G.jsxs)(`p`,{className:`home-firstrun-lede muted`,children:[`Use the buttons below to download local models from`,` `,(0,G.jsx)(`a`,{href:`https://huggingface.co`,target:`_blank`,rel:`noreferrer`,style:{color:`inherit`},children:`Hugging Face`}),` `,`that will get you started.`]}),(0,G.jsxs)(`div`,{className:`home-firstrun-body`,children:[n&&(0,G.jsx)(ue,{config:n,onConfigChanged:r,onModelInstalled:te}),(0,G.jsxs)(`section`,{className:`setup-section home-ondevice-link`,children:[(0,G.jsx)(`button`,{type:`button`,className:`gz-link-button`,onClick:()=>{let e=Ge(i?.platform)===`mlx`?`mlx`:`llamaCpp`;ee(e),window.dispatchEvent(new CustomEvent(`gezel:navigate`,{detail:{view:`settings`,section:e}}))},children:`Manage Chat AI Models →`}),(0,G.jsx)(`p`,{className:`muted small`,style:{marginTop:`0.35rem`,marginBottom:0},children:`Browse other local models, or connect a cloud provider (GitHub Copilot, OpenAI, …), in Settings.`})]}),(0,G.jsx)(we,{}),(0,G.jsxs)(`section`,{className:`setup-section`,children:[(0,G.jsx)(`h3`,{children:`Experience`}),(0,G.jsx)(`p`,{className:`muted`,style:{marginTop:0},children:`Tune how your gezellen present themselves. Adjustable any time in Settings.`}),(0,G.jsxs)(`label`,{className:`debug-toggle`,children:[(0,G.jsx)(`input`,{type:`checkbox`,checked:n?.roleBasedNameOnlyMode===!0&&n?.showPoppetjes===!1,onChange:async e=>{let t=e.target.checked;try{let e=await v.updateConfig({roleBasedNameOnlyMode:t,showPoppetjes:!t});r(e),window.dispatchEvent(new CustomEvent(`gezel:config-updated`,{detail:e}))}catch{}}}),(0,G.jsx)(`span`,{children:`Boring mode — don't use names or show avatars`})]})]}),(0,G.jsx)(Xe,{level:n?.securityPolicy?.level,onChange:async e=>{try{let t=await v.updateConfig({securityPolicy:m(e)});r(t)}catch{}}})]}),(0,G.jsx)(Ze,{collapsed:E??!1,onToggle:()=>D(e=>!(e??!1)),version:i?.version,meesterName:C,isConfigured:!1,provider:A,defaultModel:I,llamaCppBackend:i?.llamaCppBackend,llamaCppDetectedVendor:i?.llamaCppDetectedVendor})]})}function Ye({state:e,platform:t}){let[n,r]=(0,W.useState)(!1),[i,a]=(0,W.useState)(null);return!e||e.kind!==`available`&&e.kind!==`ready`?null:e.kind===`available`?(0,G.jsxs)(`output`,{className:`app-fallback-banner`,"data-testid":`update-banner`,children:[(0,G.jsxs)(`strong`,{children:[`Gezel `,e.version,` is available.`]}),(0,G.jsx)(`span`,{children:`Linux updates are installed manually. Open the GitHub release, verify its SLSA build provenance, then install the package for your distribution.`}),(0,G.jsx)(`div`,{className:`app-fallback-banner-actions`,children:(0,G.jsx)(`a`,{className:`app-update-release-link`,href:f(e.version),children:`Open release and verification steps`})})]}):(0,G.jsxs)(`output`,{className:`app-fallback-banner`,"data-testid":`update-banner`,children:[(0,G.jsxs)(`strong`,{children:[`Gezel `,e.version,` is ready to install.`]}),(0,G.jsx)(`span`,{children:t===`darwin`?`Installing replaces Gezel and its background service together, so macOS will ask for an administrator password.`:`The update will install automatically after you quit Gezel completely. Closing the window may leave Gezel running in the system tray.`}),(0,G.jsx)(`div`,{className:`app-fallback-banner-actions`,children:(0,G.jsx)(`button`,{type:`button`,className:`primary`,disabled:n,onClick:()=>{r(!0),a(null),window.__GEZEL__?.update?.install().then(e=>{e.ok||(a(e.error),r(!1))})},children:n?t===`darwin`?`Opening installer…`:`Restarting…`:t===`darwin`?`Open installer`:`Install and restart`})}),i&&(0,G.jsxs)(`details`,{open:!0,children:[(0,G.jsx)(`summary`,{children:`Could not open the installer`}),(0,G.jsx)(`p`,{children:i})]})]})}function Xe({level:e,onChange:t}){let n=ce.find(t=>t.id===e);return(0,G.jsxs)(`section`,{className:`setup-section${e?` engagement-mode-${e}`:``}`,children:[(0,G.jsx)(`h3`,{children:`Security & compliance`}),(0,G.jsx)(`p`,{className:`muted`,style:{marginTop:0},children:`How much should gezellen be allowed to do? Pick a starting posture — you can fine-tune every capability later in Settings → Security & Compliance.`}),(0,G.jsx)(`div`,{className:`engagement-mode-switch gz-tray`,role:`radiogroup`,"aria-label":`Security posture`,children:ce.map(n=>(0,G.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":e===n.id,className:`gz-key${e===n.id?` gz-key-active`:``}`,onClick:()=>void t(n.id),children:[n.label,n.recommended?` ★`:``]},n.id))}),(0,G.jsx)(`p`,{className:`engagement-mode-description`,"aria-live":`polite`,children:n?n.description:`No level chosen yet — Lockdown (★) is a good default for most people.`})]})}function Ze({collapsed:e,onToggle:t,version:n,meesterName:r,isConfigured:i,provider:a,defaultModel:o,llamaCppBackend:s,llamaCppDetectedVendor:c}){if(e){let e=` ${Qe(a,o,s,c)}`;return(0,G.jsxs)(`section`,{className:`home-intro home-intro-compact`,children:[(0,G.jsxs)(`span`,{children:[`Welcome back`,n?` — gezel v${n}`:``,e]}),(0,G.jsx)(`button`,{type:`button`,className:`home-intro-toggle`,onClick:t,"aria-label":`Expand intro`,title:`Expand intro`,children:(0,G.jsx)(`span`,{"aria-hidden":!0,children:`▾`})})]})}return(0,G.jsx)(`section`,{className:`home-intro`,id:le,children:(0,G.jsxs)(`div`,{className:`home-intro-body`,children:[(0,G.jsxs)(`header`,{children:[(0,G.jsx)(`h2`,{children:(0,G.jsx)(`img`,{src:j,alt:`gezel`,className:`home-intro-logotype`})}),(0,G.jsx)(`button`,{type:`button`,className:`home-intro-toggle`,onClick:t,"aria-label":`Collapse intro`,title:`Collapse intro`,children:(0,G.jsx)(`span`,{"aria-hidden":!0,children:`▴`})})]}),(0,G.jsx)(Ee,{}),i?(0,G.jsxs)(`p`,{children:[`Get started with `,(0,G.jsx)(`strong`,{children:r??`your Meester`}),`, your meester, who acts as your concierge. You can work with`,` `,(0,G.jsx)(`strong`,{children:r??`your Meester`}),` to create a project and a crew to solve any productivity need you have.`]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`p`,{children:[`To get started, download the recommended `,(0,G.jsx)(`strong`,{children:`on-device`}),` model above — it runs privately on your machine, with no account or network required.`]}),(0,G.jsxs)(`p`,{className:`muted small`,children:[(0,G.jsx)(`strong`,{children:`Note:`}),` Gezel is still in very early preview. On-device models are humbler than cloud AI, but they're the easiest way to get a feel for Gezel. Want a different local model, or a cloud provider like GitHub Copilot or OpenAI? Manage them from the on-device engine page and Settings.`]})]})]})})}function Qe(e,t,n,r){if(e===`llama-cpp`){let e=$e(n,r);return t?`using ${e} with ${t}`:`using ${e}`}return e===`mlx`?t?`using MLX with ${t}`:`using MLX`:t?`using ${et(e)} ${t} by default`:`using ${et(e)} by default`}function $e(e,t){return e===`cuda`?`Nvidia GPU`:e===`metal`?`Apple GPU`:e===`cpu`?`CPU`:e===`vulkan`?t===`amd`?`AMD GPU`:t===`intel`?`Intel GPU`:t===`nvidia`?`Nvidia GPU`:`GPU`:`On-device`}function et(e){switch(e){case`copilot`:return`GitHub Copilot`;case`openai`:return`OpenAI`;case`anthropic`:return`Anthropic Claude`;case`anthropic-cli`:return`Anthropic Claude CLI`;case`codex-cli`:return`OpenAI Codex CLI`;case`ollama`:return`Ollama`;case`llama-cpp`:return`On-device`;case`mlx`:return`MLX`;case`ds4`:return`DwarfStar (ds4)`;case`remote`:return`Remote`}}export{Je as HomeView};
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,t as n}from"./jsx-runtime-CEpd2cAX.js";import{t as r}from"./api-BX5xXiFs.js";import{t as i}from"./ConfirmDialog-BHFs6vmJ.js";var a=e(t(),1),o=n();function s(e){return e?e>=1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:`${Math.max(1,Math.round(e/1024))} KB`:``}function c(e){return e.disabledReason?`quarantined — ${e.disabledReason}`:e.enabled?e.mounted?e.vectorCompatible===!1?`active · keyword search only`:`active`:`enabled (not mounted)`:`disabled`}function l(e){let t=e.trim();if(!t)return null;if(/^https?:\/\//i.test(t))try{let e=new URL(t);if((e.protocol===`http:`||e.protocol===`https:`)&&e.hostname)return`url`}catch{}if(!/\.gezk$/i.test(t))return null;let n=/^[a-z]:[\\/]/i.test(t),r=/^(?:\\\\|\/\/)[^\\/]+[\\/][^\\/]+/.test(t),i=t.startsWith(`/`);return n||r||i?`file`:null}function u(){let[e,t]=(0,a.useState)(null),[n,u]=(0,a.useState)(``),[d,f]=(0,a.useState)(``),[p,m]=(0,a.useState)(null),[h,g]=(0,a.useState)(null),[_,v]=(0,a.useState)(null),y=(0,a.useRef)(null),b=(0,a.useCallback)(()=>{window.dispatchEvent(new CustomEvent(`gezel:knowledge-catalogs-updated`))},[]),x=(0,a.useCallback)(async()=>{try{let e=await r.listKnowledgeCatalogs();t(e.catalogs)}catch(e){g(e instanceof Error?e.message:String(e))}},[]);(0,a.useEffect)(()=>(x(),()=>{y.current!==null&&window.clearTimeout(y.current)}),[x]);let S=(0,a.useCallback)(e=>{let t=2400,n=async()=>{try{let t=await r.getKnowledgeJob(e),n=t.events[t.events.length-1];if(n?.type===`progress`){let t=Number(n.bytesDone??0),r=Number(n.bytesTotal??0);m({jobId:e,phase:String(n.phase??`working`),pct:r>0?Math.floor(t/r*100):null,error:null})}if(t.finished){t.error?m({jobId:e,phase:`error`,pct:null,error:t.error}):(m(null),u(``),f(``)),await x(),b();return}}catch{}t--,t>0&&(y.current=window.setTimeout(()=>void n(),250))};n()},[x,b]),C=(0,a.useCallback)(async e=>{let t=e.trim(),n=l(t);if(!n)return;g(null);let i=n===`url`,a=d.trim().toLowerCase();if(i&&!/^[a-f0-9]{64}$/.test(a)){g(`Paste the publisher-provided SHA-256 digest before installing a URL.`);return}try{let{jobId:e}=await r.installKnowledgeCatalog({source:i?{kind:`url`,url:t,expectedSha256:a}:{kind:`file`,path:t}});m({jobId:e,phase:`starting`,pct:null,error:null}),S(e)}catch(e){g(e instanceof Error?e.message:String(e))}},[d,S]),w=(0,a.useCallback)(async()=>{let e=await window.__GEZEL__?.selectKnowledgeArchive?.();e&&(u(e),await C(e))},[C]),T=(0,a.useCallback)(async(e,t)=>{g(null);try{await r.updateKnowledgeCatalog(e,{enabled:t})}catch(e){g(e instanceof Error?e.message:String(e))}await x(),b()},[x,b]),E=(0,a.useCallback)(async e=>{v(null),g(null);try{await r.removeKnowledgeCatalog(e)}catch(e){g(e instanceof Error?e.message:String(e))}await x(),b()},[x,b]),D=e?.find(e=>e.ref.catalogId===_),O=l(n),k=O===`url`,A=/^[a-fA-F0-9]{64}$/.test(d.trim()),j=O!==null&&(!k||A)&&!(p&&!p.error);return(0,o.jsxs)(`section`,{style:{marginBottom:`2rem`},"data-testid":`knowledge-settings`,children:[(0,o.jsx)(`h3`,{children:`Knowledge`}),(0,o.jsx)(`p`,{className:`muted`,style:{marginTop:0},children:`Knowledge catalogs are searchable, citable reference libraries — encyclopedias, manuals, your own notes — packaged as .gezk files. Installed catalogs appear in the Knowledge area and your gezellen can search them and cite their sources. Everything stays on this device.`}),(0,o.jsxs)(`div`,{className:`ollama-section ollama-section--flat`,children:[(0,o.jsx)(`h4`,{children:`Add a catalog`}),(0,o.jsxs)(`div`,{className:`new-row`,style:{alignItems:`center`},children:[(0,o.jsx)(`input`,{type:`text`,style:{flex:1},placeholder:`Path to a .gezk file, or an https:// URL`,"aria-label":`Catalog file path or URL`,value:n,onChange:e=>u(e.target.value),onKeyDown:e=>{e.key===`Enter`&&j&&C(n)}}),window.__GEZEL__?.selectKnowledgeArchive&&(0,o.jsx)(`button`,{type:`button`,onClick:()=>void w(),children:`Browse…`}),O!==null&&(0,o.jsx)(`button`,{type:`button`,disabled:!j,onClick:()=>void C(n),children:`Install`})]}),k&&(0,o.jsxs)(`div`,{style:{marginTop:`0.5rem`},children:[(0,o.jsx)(`input`,{type:`text`,style:{width:`100%`},placeholder:`Publisher SHA-256 digest (64 hexadecimal characters)`,"aria-label":`Catalog SHA-256 digest`,value:d,spellCheck:!1,autoCapitalize:`none`,onChange:e=>f(e.target.value),onKeyDown:e=>{e.key===`Enter`&&j&&C(n)}}),(0,o.jsx)(`p`,{className:`muted small`,style:{margin:`0.35rem 0 0`},children:`Remote catalogs are installed only when their bytes match a SHA-256 digest you received from the publisher.`})]}),p&&!p.error&&(0,o.jsxs)(`div`,{className:`ollama-pull`,style:{marginTop:`0.5rem`},children:[(0,o.jsx)(`div`,{className:`ollama-pull-head`,children:(0,o.jsx)(`span`,{className:`muted small`,children:p.phase===`download`?`Downloading…`:`Installing…`})}),p.pct===null?(0,o.jsx)(`div`,{className:`ollama-pull-bar ollama-pull-bar-indeterminate`,children:(0,o.jsx)(`div`,{className:`ollama-pull-bar-fill`})}):(0,o.jsxs)(`div`,{className:`ollama-pull-bar`,children:[(0,o.jsx)(`div`,{className:`ollama-pull-bar-fill`,style:{width:`${p.pct}%`}}),(0,o.jsxs)(`span`,{className:`ollama-pull-bar-label`,children:[p.pct,`%`]})]})]}),p?.error&&(0,o.jsx)(`p`,{className:`error small`,children:p.error})]}),(0,o.jsxs)(`div`,{className:`ollama-section ollama-section--flat`,children:[(0,o.jsx)(`h4`,{children:`Installed catalogs`}),e===null&&(0,o.jsx)(`p`,{className:`muted small`,children:`loading…`}),e?.length===0&&(0,o.jsxs)(`p`,{className:`muted small`,children:[`Nothing installed yet. Build one from a folder of Markdown with`,` `,(0,o.jsx)(`code`,{children:`gezel knowledge init`}),` and `,(0,o.jsx)(`code`,{children:`gezel knowledge build`}),`, or install a published .gezk above.`]}),(e??[]).map(e=>(0,o.jsxs)(`div`,{className:`ollama-pull`,"data-testid":`knowledge-catalog-${e.ref.catalogId}`,children:[(0,o.jsxs)(`div`,{className:`ollama-pull-head`,children:[(0,o.jsx)(`strong`,{children:e.name??e.ref.catalogId}),(0,o.jsxs)(`span`,{className:`muted small`,children:[`v`,e.ref.version,e.documents===void 0?``:` · ${e.documents} documents`,e.sizeBytes?` · ${s(e.sizeBytes)}`:``]})]}),(0,o.jsx)(`p`,{className:`small${e.disabledReason?` error`:` muted`}`,style:{margin:`0.15rem 0 0.35rem`},children:c(e)}),(0,o.jsxs)(`div`,{className:`new-row`,style:{gap:`0.75rem`},children:[(0,o.jsxs)(`label`,{className:`new-row`,style:{alignItems:`center`,gap:`0.35rem`},children:[(0,o.jsx)(`input`,{type:`checkbox`,checked:e.enabled,onChange:t=>void T(e.ref.catalogId,t.target.checked)}),(0,o.jsx)(`span`,{className:`small`,children:`Enabled`})]}),(0,o.jsx)(`button`,{type:`button`,className:`gz-link-button danger`,onClick:()=>v(e.ref.catalogId),children:`Remove`})]})]},e.ref.catalogId))]}),h&&(0,o.jsx)(`p`,{className:`error small`,children:h}),(0,o.jsx)(i,{open:_!==null,title:`Remove ${D?.name??_??``}?`,message:D?.ref.storageScope===`machine-shared`?`Removes this catalog from your account. The shared copy other people on this device use is not touched.`:`Deletes this catalog and its files from your account. If you built it yourself and no longer have the .gezk, this is the only copy.`,confirmLabel:`Remove catalog`,danger:!0,onConfirm:()=>{_&&E(_)},onCancel:()=>v(null)})]})}export{u as KnowledgeCatalogsCard};