weifuwu 0.86.0 → 0.87.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 (651) hide show
  1. package/README.md +56 -45
  2. package/content/apps/admin.md +55 -0
  3. package/content/apps/agent-platform.md +35 -0
  4. package/content/apps/auth.md +49 -0
  5. package/content/apps/multi.md +44 -0
  6. package/content/apps/todo.md +51 -0
  7. package/content/backend/ai.md +28 -0
  8. package/content/backend/auth.md +20 -0
  9. package/content/backend/email.md +23 -0
  10. package/content/backend/graphql.md +23 -0
  11. package/content/backend/http.md +23 -0
  12. package/content/backend/limit.md +23 -0
  13. package/content/backend/middleware.md +17 -0
  14. package/content/backend/queue.md +23 -0
  15. package/content/backend/redis.md +26 -0
  16. package/content/backend/router.md +23 -0
  17. package/content/backend/schedule.md +23 -0
  18. package/content/backend/sql.md +27 -0
  19. package/content/backend/sse.md +26 -0
  20. package/content/backend/ws.md +26 -0
  21. package/content/capabilities/app-node.md +21 -0
  22. package/content/capabilities/data.md +21 -0
  23. package/content/capabilities/events.md +21 -0
  24. package/content/capabilities/hooks.md +22 -0
  25. package/content/capabilities/i18n.md +21 -0
  26. package/content/capabilities/popup.md +21 -0
  27. package/content/capabilities/render-only.md +23 -0
  28. package/content/capabilities/router.md +22 -0
  29. package/content/capabilities/self-id.md +21 -0
  30. package/content/capabilities/store.md +21 -0
  31. package/content/capabilities/theme.md +21 -0
  32. package/content/capabilities/two-phase.md +21 -0
  33. package/content/components/accordion.md +50 -0
  34. package/content/components/actionsheet.md +46 -0
  35. package/content/components/affix.md +51 -0
  36. package/content/components/aichat.md +57 -0
  37. package/content/components/alert.md +52 -0
  38. package/content/components/alertgroup.md +45 -0
  39. package/content/components/anchor.md +52 -0
  40. package/content/components/app.md +37 -0
  41. package/content/components/approvalcard.md +56 -0
  42. package/content/components/appshell.md +50 -0
  43. package/content/components/aspectratio.md +47 -0
  44. package/content/components/authpage.md +61 -0
  45. package/content/components/autocomplete-v2.md +40 -0
  46. package/content/components/autocomplete.md +56 -0
  47. package/content/components/avatar.md +51 -0
  48. package/content/components/avatargroup.md +47 -0
  49. package/content/components/backtop.md +53 -0
  50. package/content/components/badge.md +55 -0
  51. package/content/components/breadcrumb.md +49 -0
  52. package/content/components/button.md +63 -0
  53. package/content/components/calendar-v2.md +40 -0
  54. package/content/components/calendar.md +50 -0
  55. package/content/components/card.md +58 -0
  56. package/content/components/carousel.md +52 -0
  57. package/content/components/cascader-v2.md +39 -0
  58. package/content/components/cascader.md +54 -0
  59. package/content/components/chart.md +53 -0
  60. package/content/components/chatinput.md +63 -0
  61. package/content/components/checkbox.md +51 -0
  62. package/content/components/checkboxgroup.md +52 -0
  63. package/content/components/citationcard.md +48 -0
  64. package/content/components/codeblock.md +48 -0
  65. package/content/components/codeeditor.md +47 -0
  66. package/content/components/collapse.md +49 -0
  67. package/content/components/colorpicker.md +50 -0
  68. package/content/components/command.md +50 -0
  69. package/content/components/confirm.md +57 -0
  70. package/content/components/contextmenu.md +48 -0
  71. package/content/components/copybutton.md +51 -0
  72. package/content/components/datepicker.md +52 -0
  73. package/content/components/descriptions-v2.md +39 -0
  74. package/content/components/descriptions.md +52 -0
  75. package/content/components/diffview-v2.md +39 -0
  76. package/content/components/diffview.md +50 -0
  77. package/content/components/divider.md +48 -0
  78. package/content/components/drawer.md +55 -0
  79. package/content/components/dropdown.md +53 -0
  80. package/content/components/editor.md +49 -0
  81. package/content/components/emptystate.md +51 -0
  82. package/content/components/exportcsv.md +38 -0
  83. package/content/components/field.md +54 -0
  84. package/content/components/filepreview-office.md +37 -0
  85. package/content/components/filepreview.md +49 -0
  86. package/content/components/filetree.md +56 -0
  87. package/content/components/fileupload-v2.md +39 -0
  88. package/content/components/fileupload.md +57 -0
  89. package/content/components/floatbutton.md +52 -0
  90. package/content/components/form-v2.md +41 -0
  91. package/content/components/form.md +60 -0
  92. package/content/components/grid.md +51 -0
  93. package/content/components/highlight-v2.md +39 -0
  94. package/content/components/highlight.md +46 -0
  95. package/content/components/hovercard.md +51 -0
  96. package/content/components/icon.md +50 -0
  97. package/content/components/imagecropper.md +45 -0
  98. package/content/components/img.md +56 -0
  99. package/content/components/infinitescroll-v2.md +40 -0
  100. package/content/components/infinitescroll.md +54 -0
  101. package/content/components/input.md +65 -0
  102. package/content/components/inputnumber.md +58 -0
  103. package/content/components/inview.md +56 -0
  104. package/content/components/jsonschemaform.md +53 -0
  105. package/content/components/jsonviewer-v2.md +39 -0
  106. package/content/components/jsonviewer.md +49 -0
  107. package/content/components/kanban.md +46 -0
  108. package/content/components/label.md +48 -0
  109. package/content/components/layout.md +54 -0
  110. package/content/components/layoutcontent.md +43 -0
  111. package/content/components/layoutheader.md +43 -0
  112. package/content/components/layoutsider.md +43 -0
  113. package/content/components/link.md +52 -0
  114. package/content/components/list.md +44 -0
  115. package/content/components/loading.md +45 -0
  116. package/content/components/logviewer-v2.md +39 -0
  117. package/content/components/logviewer.md +53 -0
  118. package/content/components/markdown.md +51 -0
  119. package/content/components/markdowneditor.md +47 -0
  120. package/content/components/math.md +42 -0
  121. package/content/components/mentions-v2.md +39 -0
  122. package/content/components/mentions.md +52 -0
  123. package/content/components/menu.md +56 -0
  124. package/content/components/menubar.md +44 -0
  125. package/content/components/messagebubble.md +50 -0
  126. package/content/components/modal.md +59 -0
  127. package/content/components/navmenu.md +47 -0
  128. package/content/components/notification.md +51 -0
  129. package/content/components/pageheader.md +53 -0
  130. package/content/components/pagination.md +49 -0
  131. package/content/components/paragraph.md +45 -0
  132. package/content/components/passwordinput.md +57 -0
  133. package/content/components/pininput-v2.md +39 -0
  134. package/content/components/pininput.md +50 -0
  135. package/content/components/pipeline.md +49 -0
  136. package/content/components/popconfirm.md +58 -0
  137. package/content/components/popover.md +61 -0
  138. package/content/components/progressbar.md +50 -0
  139. package/content/components/prompttemplate.md +49 -0
  140. package/content/components/qrcode.md +50 -0
  141. package/content/components/radiogroup.md +53 -0
  142. package/content/components/rate.md +53 -0
  143. package/content/components/reasoningblock.md +47 -0
  144. package/content/components/relationgraph.md +52 -0
  145. package/content/components/resizable.md +53 -0
  146. package/content/components/result.md +49 -0
  147. package/content/components/scrollbar.md +49 -0
  148. package/content/components/searchinput.md +51 -0
  149. package/content/components/segmentedcontrol.md +59 -0
  150. package/content/components/select-searchable.md +47 -0
  151. package/content/components/select.md +66 -0
  152. package/content/components/sessionlist.md +52 -0
  153. package/content/components/sheetgrid.md +44 -0
  154. package/content/components/skeleton.md +55 -0
  155. package/content/components/slidecanvas.md +44 -0
  156. package/content/components/slider.md +62 -0
  157. package/content/components/sortablelist.md +39 -0
  158. package/content/components/space.md +52 -0
  159. package/content/components/sparkline.md +52 -0
  160. package/content/components/statcard-countdown.md +39 -0
  161. package/content/components/statcard.md +56 -0
  162. package/content/components/steps.md +48 -0
  163. package/content/components/switch.md +50 -0
  164. package/content/components/tabbar.md +45 -0
  165. package/content/components/table-v2.md +40 -0
  166. package/content/components/table.md +66 -0
  167. package/content/components/tabs.md +56 -0
  168. package/content/components/tag.md +51 -0
  169. package/content/components/tagsinput-v2.md +39 -0
  170. package/content/components/tagsinput.md +54 -0
  171. package/content/components/text.md +45 -0
  172. package/content/components/textarea.md +57 -0
  173. package/content/components/themeswitch.md +69 -0
  174. package/content/components/timeline.md +50 -0
  175. package/content/components/title.md +45 -0
  176. package/content/components/toast.md +52 -0
  177. package/content/components/toggle-togglegroup.md +52 -0
  178. package/content/components/togglegroup.md +47 -0
  179. package/content/components/toolcallcard.md +51 -0
  180. package/content/components/tooltip.md +50 -0
  181. package/content/components/tour.md +50 -0
  182. package/content/components/transfer.md +52 -0
  183. package/content/components/tree-v2.md +39 -0
  184. package/content/components/tree.md +59 -0
  185. package/content/components/treeselect.md +54 -0
  186. package/content/components/typography.md +51 -0
  187. package/content/components/videoplayer.md +52 -0
  188. package/content/components/virtuallist.md +52 -0
  189. package/content/components/virtualtable-v2.md +39 -0
  190. package/content/components/virtualtable.md +55 -0
  191. package/content/components/watermark.md +53 -0
  192. package/content/components/wave.md +43 -0
  193. package/content/guides/ai-chat-family.md +24 -0
  194. package/content/guides/choose.md +67 -0
  195. package/content/guides/component-model.md +32 -0
  196. package/content/guides/component-standards.md +123 -0
  197. package/{docs/components.md → content/guides/components-guide.md} +31 -7
  198. package/{docs/custom-components.md → content/guides/custom-component.md} +70 -55
  199. package/{docs/data.md → content/guides/data-guide.md} +5 -2
  200. package/content/guides/file-preview-family.md +18 -0
  201. package/{docs → content/guides}/frontend.md +122 -52
  202. package/content/guides/layout-choice.md +64 -0
  203. package/{docs/layout.md → content/guides/layout-guide.md} +12 -8
  204. package/{docs/frontend-middleware.md → content/guides/middleware.md} +34 -3
  205. package/{docs/mobile.md → content/guides/mobile-guide.md} +20 -24
  206. package/content/guides/page-building.md +98 -0
  207. package/content/guides/production.md +37 -0
  208. package/content/guides/quality.md +60 -0
  209. package/{docs/realtime.md → content/guides/realtime-guide.md} +6 -3
  210. package/content/guides/render-only.md +44 -0
  211. package/{docs/saas.md → content/guides/saas-guide.md} +8 -5
  212. package/{docs/server.md → content/guides/server-guide.md} +5 -2
  213. package/content/guides/start.md +41 -0
  214. package/{docs → content/guides}/styling.md +5 -1
  215. package/{docs/frontend-ui-dom.md → content/guides/ui-dom-guide.md} +7 -1
  216. package/content/index.json +4344 -0
  217. package/content/index.md +181 -0
  218. package/content/layout/align.md +20 -0
  219. package/content/layout/anchor.md +19 -0
  220. package/content/layout/app-shell.md +23 -0
  221. package/content/layout/border.md +20 -0
  222. package/content/layout/center.md +19 -0
  223. package/content/layout/cluster.md +19 -0
  224. package/content/layout/container.md +19 -0
  225. package/content/layout/fill.md +19 -0
  226. package/content/layout/grid.md +19 -0
  227. package/content/layout/hidden.md +22 -0
  228. package/content/layout/layer.md +19 -0
  229. package/content/layout/position.md +22 -0
  230. package/content/layout/row.md +23 -0
  231. package/content/layout/safe-area.md +20 -0
  232. package/content/layout/scroll.md +21 -0
  233. package/content/layout/spacing.md +22 -0
  234. package/content/layout/split.md +19 -0
  235. package/content/layout/stack.md +19 -0
  236. package/content/layout/surface.md +23 -0
  237. package/content/layout/text.md +22 -0
  238. package/content/patterns/app-shell.md +34 -0
  239. package/content/patterns/dashboard.md +36 -0
  240. package/content/patterns/data-screen.md +30 -0
  241. package/content/patterns/detail-page.md +31 -0
  242. package/content/patterns/docs.md +34 -0
  243. package/content/patterns/focus-task.md +34 -0
  244. package/content/patterns/landing.md +35 -0
  245. package/content/patterns/list-page.md +32 -0
  246. package/content/patterns/mobile.md +31 -0
  247. package/content/patterns/settings-page.md +33 -0
  248. package/content/patterns/workspace.md +32 -0
  249. package/dist/cli/apps-typecheck.test.d.ts +11 -0
  250. package/dist/cli/docs.d.ts +2 -0
  251. package/dist/cli/docs.mjs +10961 -0
  252. package/dist/cli/home-flash.test.d.ts +1 -0
  253. package/dist/{components → client/components}/Accordion/Accordion.d.ts +1 -1
  254. package/dist/client/components/ActionSheet/ActionSheet.d.ts +37 -0
  255. package/dist/{components → client/components}/Affix/Affix.d.ts +1 -1
  256. package/dist/{components → client/components}/AiChat/AiChat.d.ts +3 -3
  257. package/dist/{components → client/components}/Alert/Alert.d.ts +1 -1
  258. package/dist/{components → client/components}/AlertGroup/AlertGroup.d.ts +1 -1
  259. package/dist/{components → client/components}/Anchor/Anchor.d.ts +1 -1
  260. package/dist/client/components/AppShell/AppShell.d.ts +55 -0
  261. package/dist/{components → client/components}/ApprovalCard/ApprovalCard.d.ts +2 -2
  262. package/dist/{components → client/components}/AspectRatio/AspectRatio.d.ts +1 -1
  263. package/dist/{components → client/components}/AuthPage/AuthPage.d.ts +2 -2
  264. package/dist/{components → client/components}/AutoComplete/AutoComplete.d.ts +1 -1
  265. package/dist/{components → client/components}/Avatar/Avatar.d.ts +1 -1
  266. package/dist/{components → client/components}/AvatarGroup/AvatarGroup.d.ts +1 -1
  267. package/dist/{components → client/components}/BackTop/BackTop.d.ts +1 -1
  268. package/dist/{components → client/components}/Badge/Badge.d.ts +1 -1
  269. package/dist/{components → client/components}/Breadcrumb/Breadcrumb.d.ts +1 -1
  270. package/dist/{components → client/components}/Button/Button.d.ts +1 -1
  271. package/dist/{components → client/components}/Calendar/Calendar.d.ts +1 -1
  272. package/dist/{components → client/components}/Card/Card.d.ts +1 -1
  273. package/dist/{components → client/components}/Carousel/Carousel.d.ts +1 -1
  274. package/dist/{components → client/components}/Cascader/Cascader.d.ts +1 -1
  275. package/dist/{components → client/components}/Chart/Chart.d.ts +1 -1
  276. package/dist/{components → client/components}/Chart/chart-utils.d.ts +5 -1
  277. package/dist/{components → client/components}/ChatInput/ChatInput.d.ts +7 -7
  278. package/dist/{components → client/components}/Checkbox/Checkbox.d.ts +1 -1
  279. package/dist/{components → client/components}/CheckboxGroup/CheckboxGroup.d.ts +1 -1
  280. package/dist/{components → client/components}/CitationCard/CitationCard.d.ts +3 -3
  281. package/dist/{components → client/components}/CodeBlock/CodeBlock.d.ts +1 -1
  282. package/dist/client/components/CodeEditor/CodeEditor.d.ts +18 -0
  283. package/dist/{components → client/components}/Collapse/Collapse.d.ts +1 -1
  284. package/dist/{components → client/components}/ColorPicker/ColorPicker.d.ts +1 -1
  285. package/dist/{components → client/components}/Command/Command.d.ts +1 -1
  286. package/dist/{components → client/components}/Confirm/Confirm.d.ts +2 -7
  287. package/dist/{components → client/components}/ContextMenu/ContextMenu.d.ts +1 -1
  288. package/dist/{components → client/components}/CopyButton/CopyButton.d.ts +1 -1
  289. package/dist/{components → client/components}/DatePicker/DatePicker.d.ts +2 -2
  290. package/dist/{components → client/components}/Descriptions/Descriptions.d.ts +1 -1
  291. package/dist/{components → client/components}/DiffView/DiffView.d.ts +1 -1
  292. package/dist/{components → client/components}/Divider/Divider.d.ts +1 -1
  293. package/dist/{components → client/components}/Drawer/Drawer.d.ts +1 -1
  294. package/dist/{components → client/components}/Dropdown/Dropdown.d.ts +1 -1
  295. package/dist/{components → client/components}/Editor/Editor.d.ts +1 -1
  296. package/dist/{components → client/components}/Editor/tools/toolbar.d.ts +1 -1
  297. package/dist/{components → client/components}/EmptyState/EmptyState.d.ts +1 -1
  298. package/dist/client/components/ExportCSV/ExportCSV.d.ts +30 -0
  299. package/dist/{components → client/components}/Field/Field.d.ts +1 -1
  300. package/dist/{components → client/components}/FilePreview/FilePreview.d.ts +1 -1
  301. package/dist/client/components/FileTree/FileTree.d.ts +57 -0
  302. package/dist/{components → client/components}/FileUpload/FileUpload.d.ts +1 -1
  303. package/dist/{components → client/components}/FloatButton/FloatButton.d.ts +1 -1
  304. package/dist/{components → client/components}/Form/Form.d.ts +1 -1
  305. package/dist/{components → client/components}/Grid/Grid.d.ts +1 -1
  306. package/dist/{components → client/components}/Highlight/Highlight.d.ts +1 -1
  307. package/dist/{components → client/components}/HoverCard/HoverCard.d.ts +5 -4
  308. package/dist/{components → client/components}/Icon/Icon.d.ts +2 -2
  309. package/dist/client/components/ImageCropper/ImageCropper.d.ts +17 -0
  310. package/dist/{components → client/components}/Img/Img.d.ts +1 -1
  311. package/dist/{components → client/components}/InView/InView.d.ts +1 -1
  312. package/dist/{components → client/components}/InfiniteScroll/InfiniteScroll.d.ts +1 -1
  313. package/dist/{components → client/components}/Input/Input.d.ts +1 -1
  314. package/dist/{components → client/components}/InputNumber/InputNumber.d.ts +1 -1
  315. package/dist/{components → client/components}/JSONViewer/JSONViewer.d.ts +1 -1
  316. package/dist/{components → client/components}/JsonSchemaForm/JsonSchemaForm.d.ts +3 -3
  317. package/dist/{components → client/components}/Kanban/Kanban.d.ts +1 -1
  318. package/dist/{components → client/components}/Label/Label.d.ts +1 -1
  319. package/dist/{components → client/components}/Layout/Layout.d.ts +1 -1
  320. package/dist/{components → client/components}/Link/Link.d.ts +1 -1
  321. package/dist/{components → client/components}/List/List.d.ts +1 -1
  322. package/dist/{components → client/components}/Loading/Loading.d.ts +1 -1
  323. package/dist/{components → client/components}/LogViewer/LogViewer.d.ts +1 -1
  324. package/dist/{components → client/components}/Markdown/Markdown.d.ts +1 -1
  325. package/dist/client/components/MarkdownEditor/MarkdownEditor.d.ts +18 -0
  326. package/dist/client/components/Math/Math.d.ts +15 -0
  327. package/dist/{components → client/components}/Mentions/Mentions.d.ts +1 -1
  328. package/dist/{components → client/components}/Menu/Menu.d.ts +1 -1
  329. package/dist/{components → client/components}/Menubar/Menubar.d.ts +1 -1
  330. package/dist/{components → client/components}/MessageBubble/MessageBubble.d.ts +1 -1
  331. package/dist/{components → client/components}/Modal/Modal.d.ts +1 -1
  332. package/dist/{components → client/components}/NavMenu/NavMenu.d.ts +2 -2
  333. package/dist/{components → client/components}/Notification/Notification.d.ts +7 -2
  334. package/dist/{components → client/components}/PageHeader/PageHeader.d.ts +1 -1
  335. package/dist/{components → client/components}/Pagination/Pagination.d.ts +1 -1
  336. package/dist/{components → client/components}/PasswordInput/PasswordInput.d.ts +1 -1
  337. package/dist/{components → client/components}/PinInput/PinInput.d.ts +1 -1
  338. package/dist/{components → client/components}/Pipeline/Pipeline.d.ts +1 -1
  339. package/dist/{components → client/components}/Popconfirm/Popconfirm.d.ts +2 -2
  340. package/dist/{components → client/components}/Popover/Popover.d.ts +5 -4
  341. package/dist/{components → client/components}/ProgressBar/ProgressBar.d.ts +1 -1
  342. package/dist/client/components/PromptTemplate/PromptTemplate.d.ts +37 -0
  343. package/dist/{components → client/components}/QRCode/QRCode.d.ts +1 -1
  344. package/dist/{components → client/components}/RadioGroup/RadioGroup.d.ts +1 -1
  345. package/dist/{components → client/components}/Rate/Rate.d.ts +1 -1
  346. package/dist/{components → client/components}/ReasoningBlock/ReasoningBlock.d.ts +3 -3
  347. package/dist/client/components/RelationGraph/RelationGraph.d.ts +59 -0
  348. package/dist/{components → client/components}/Resizable/Resizable.d.ts +1 -1
  349. package/dist/{components → client/components}/Result/Result.d.ts +1 -1
  350. package/dist/{components → client/components}/Scrollbar/Scrollbar.d.ts +1 -1
  351. package/dist/{components → client/components}/SearchInput/SearchInput.d.ts +1 -1
  352. package/dist/{components → client/components}/SegmentedControl/SegmentedControl.d.ts +1 -1
  353. package/dist/{components → client/components}/Select/Select.d.ts +1 -1
  354. package/dist/{components → client/components}/SessionList/SessionList.d.ts +3 -3
  355. package/dist/{components → client/components}/SheetGrid/SheetGrid.d.ts +1 -1
  356. package/dist/{components → client/components}/Skeleton/Skeleton.d.ts +1 -1
  357. package/dist/{components → client/components}/SlideCanvas/SlideCanvas.d.ts +1 -1
  358. package/dist/client/components/Slider/Slider.d.ts +27 -0
  359. package/dist/client/components/SortableList/SortableList.d.ts +23 -0
  360. package/dist/{components → client/components}/Space/Space.d.ts +1 -1
  361. package/dist/{components → client/components}/Sparkline/Sparkline.d.ts +1 -1
  362. package/dist/{components → client/components}/StatCard/StatCard.d.ts +1 -1
  363. package/dist/{components → client/components}/Steps/Steps.d.ts +1 -1
  364. package/dist/{components → client/components}/Switch/Switch.d.ts +1 -1
  365. package/dist/client/components/TabBar/TabBar.d.ts +35 -0
  366. package/dist/{components → client/components}/Table/Table.d.ts +7 -1
  367. package/dist/client/components/Tabs/Tabs.d.ts +22 -0
  368. package/dist/{components → client/components}/Tag/Tag.d.ts +1 -1
  369. package/dist/{components → client/components}/TagsInput/TagsInput.d.ts +1 -1
  370. package/dist/{components → client/components}/Textarea/Textarea.d.ts +1 -1
  371. package/dist/{components → client/components}/ThemeSwitch/ThemeSwitch.d.ts +1 -1
  372. package/dist/{components → client/components}/Timeline/Timeline.d.ts +1 -1
  373. package/dist/{components → client/components}/Toast/Toast.d.ts +1 -1
  374. package/dist/{components → client/components}/ToggleGroup/ToggleGroup.d.ts +1 -1
  375. package/dist/{components → client/components}/ToolCallCard/ToolCallCard.d.ts +2 -2
  376. package/dist/{components → client/components}/Tooltip/Tooltip.d.ts +4 -3
  377. package/dist/{components → client/components}/Tour/Tour.d.ts +1 -1
  378. package/dist/{components → client/components}/Transfer/Transfer.d.ts +1 -1
  379. package/dist/{components → client/components}/Tree/Tree.d.ts +5 -1
  380. package/dist/{components → client/components}/TreeSelect/TreeSelect.d.ts +5 -1
  381. package/dist/{components → client/components}/Typography/Typography.d.ts +1 -1
  382. package/dist/client/components/VideoPlayer/VideoPlayer.d.ts +25 -0
  383. package/dist/{components → client/components}/VirtualList/VirtualList.d.ts +1 -1
  384. package/dist/{components → client/components}/VirtualTable/VirtualTable.d.ts +1 -1
  385. package/dist/{components → client/components}/Watermark/Watermark.d.ts +1 -1
  386. package/dist/client/components/Wave/Wave.d.ts +15 -0
  387. package/dist/{components → client/components}/index.d.ts +44 -5
  388. package/dist/client/components/index.js +57 -0
  389. package/dist/{components → client/components}/style.css +1081 -98
  390. package/dist/{layout → client/layout}/weifuwu-layout.css +60 -6
  391. package/dist/{office → client/office}/xml-serialize.d.ts +1 -1
  392. package/dist/client/vdom/browser/Browser.d.ts +73 -0
  393. package/dist/client/vdom/browser/create-client-browser.d.ts +11 -0
  394. package/dist/client/vdom/commands.d.ts +19 -0
  395. package/dist/client/vdom/context/UIContext.d.ts +61 -0
  396. package/dist/client/vdom/context/data.d.ts +17 -0
  397. package/dist/client/vdom/core/async-guard.d.ts +20 -0
  398. package/dist/client/vdom/core/build.d.ts +36 -0
  399. package/dist/client/vdom/core/command/create.d.ts +25 -0
  400. package/dist/client/vdom/core/command/index.d.ts +15 -0
  401. package/dist/client/vdom/core/command/insert.d.ts +32 -0
  402. package/dist/client/vdom/core/command/lifecycle.d.ts +47 -0
  403. package/dist/client/vdom/core/command/props.d.ts +22 -0
  404. package/dist/client/vdom/core/diff/attrs.d.ts +10 -0
  405. package/dist/client/vdom/core/diff/children.d.ts +29 -0
  406. package/dist/client/vdom/core/diff/cleanup.d.ts +44 -0
  407. package/dist/client/vdom/core/diff/index.d.ts +22 -0
  408. package/dist/client/vdom/core/diff/output.d.ts +30 -0
  409. package/dist/client/vdom/core/diff/same.d.ts +22 -0
  410. package/dist/client/vdom/core/field/attributes.d.ts +15 -0
  411. package/dist/client/vdom/core/field/events.d.ts +54 -0
  412. package/dist/client/vdom/core/field/index.d.ts +19 -0
  413. package/dist/client/vdom/core/field/key.d.ts +16 -0
  414. package/dist/client/vdom/core/field/props.d.ts +15 -0
  415. package/dist/client/vdom/core/field/ref.d.ts +38 -0
  416. package/dist/client/vdom/core/field/style.d.ts +17 -0
  417. package/dist/client/vdom/core/node/children.d.ts +20 -0
  418. package/dist/client/vdom/core/node/component.d.ts +93 -0
  419. package/dist/client/vdom/core/node/fragment.d.ts +14 -0
  420. package/dist/client/vdom/core/node/hole.d.ts +22 -0
  421. package/dist/client/vdom/core/node/index.d.ts +35 -0
  422. package/dist/client/vdom/core/node/keyed.d.ts +64 -0
  423. package/dist/client/vdom/core/node/native.d.ts +20 -0
  424. package/dist/client/vdom/core/node/portal.d.ts +11 -0
  425. package/dist/client/vdom/core/patch/fields.d.ts +15 -0
  426. package/dist/client/vdom/core/patch/index.d.ts +51 -0
  427. package/dist/client/vdom/core/patch/processors.d.ts +75 -0
  428. package/dist/client/vdom/core/patch/state-machine.d.ts +38 -0
  429. package/dist/client/vdom/core/patch/verify.d.ts +17 -0
  430. package/dist/client/vdom/core/router.d.ts +31 -0
  431. package/dist/client/vdom/core/serve.d.ts +75 -0
  432. package/dist/client/vdom/core/ssr/absorb.d.ts +53 -0
  433. package/dist/client/vdom/core/ssr/html.d.ts +32 -0
  434. package/dist/client/vdom/core/ssr/index.d.ts +25 -0
  435. package/dist/client/vdom/core/transform/component.d.ts +23 -0
  436. package/dist/client/vdom/core/transform/element.d.ts +21 -0
  437. package/dist/client/vdom/core/transform/fragment.d.ts +21 -0
  438. package/dist/client/vdom/core/transform/hole.d.ts +13 -0
  439. package/dist/client/vdom/core/transform/index.d.ts +46 -0
  440. package/dist/client/vdom/core/transform/states.d.ts +22 -0
  441. package/dist/client/vdom/core/transform/table.d.ts +28 -0
  442. package/dist/client/vdom/core/transform/text.d.ts +10 -0
  443. package/dist/client/vdom/core/vnode.d.ts +45 -0
  444. package/dist/client/vdom/dev/effect-guard.d.ts +8 -0
  445. package/dist/client/vdom/hooks/ai-stream.d.ts +46 -0
  446. package/dist/client/vdom/hooks/basic.d.ts +42 -0
  447. package/dist/client/vdom/hooks/chat.d.ts +91 -0
  448. package/dist/client/vdom/hooks/controlled.d.ts +27 -0
  449. package/dist/client/vdom/hooks/drag-media.d.ts +52 -0
  450. package/dist/client/vdom/hooks/env.d.ts +119 -0
  451. package/dist/client/vdom/hooks/input.d.ts +43 -0
  452. package/dist/client/vdom/hooks/observe.d.ts +60 -0
  453. package/dist/client/vdom/hooks/popup-manager.d.ts +92 -0
  454. package/dist/client/vdom/hooks/popup.d.ts +52 -0
  455. package/dist/client/vdom/hooks/stable.d.ts +45 -0
  456. package/dist/client/vdom/index.d.ts +67 -0
  457. package/dist/client/vdom/index.js +8 -0
  458. package/dist/client/vdom/jsx-runtime.d.ts +28 -0
  459. package/dist/client/vdom/jsx-runtime.js +1 -0
  460. package/dist/client/vdom/middlewares/api.d.ts +38 -0
  461. package/dist/client/vdom/middlewares/auth-i18n.d.ts +66 -0
  462. package/dist/client/vdom/middlewares/ws.d.ts +37 -0
  463. package/dist/client/vdom/store.d.ts +49 -0
  464. package/dist/client/vdom/testing.d.ts +46 -0
  465. package/dist/client/vdom/testing.js +2 -0
  466. package/dist/dev/index.d.ts +12 -0
  467. package/dist/dev/index.js +4 -4
  468. package/dist/{ai → server/ai}/contracts.d.ts +1 -1
  469. package/dist/{ai → server/ai}/index.d.ts +2 -2
  470. package/dist/{ai → server/ai}/types.d.ts +1 -1
  471. package/dist/{core → server/core}/router.d.ts +2 -4
  472. package/dist/{db → server/db}/contracts.d.ts +1 -1
  473. package/dist/server/db/postgres-server.d.ts +37 -0
  474. package/dist/server/db/redis-server.d.ts +32 -0
  475. package/dist/server/db/server.d.ts +30 -0
  476. package/dist/server/db/test-servers.d.ts +21 -0
  477. package/dist/{email → server/email}/contracts.d.ts +1 -1
  478. package/dist/{index.js → server/index.js} +3145 -2487
  479. package/dist/{ui → server/ui}/index.d.ts +2 -2
  480. package/dist/{user → server/user}/token.d.ts +1 -1
  481. package/dist/shared/router/trie.d.ts +61 -0
  482. package/docs/components-map.md +5 -5
  483. package/docs/style-guide.md +14 -2
  484. package/examples/apps/admin/README.md +23 -0
  485. package/examples/apps/admin/api.ts +27 -0
  486. package/examples/apps/admin/app.tsx +144 -0
  487. package/examples/apps/admin/main.tsx +8 -0
  488. package/examples/apps/admin/server.ts +37 -0
  489. package/examples/apps/auth/README.md +23 -0
  490. package/examples/apps/auth/api.ts +49 -0
  491. package/examples/apps/auth/app.tsx +137 -0
  492. package/examples/apps/auth/main.tsx +8 -0
  493. package/examples/apps/auth/server.ts +37 -0
  494. package/examples/apps/multi/README.md +23 -0
  495. package/examples/apps/multi/app.tsx +83 -0
  496. package/examples/apps/multi/main.tsx +8 -0
  497. package/examples/apps/multi/server.ts +33 -0
  498. package/examples/apps/todo/README.md +23 -0
  499. package/examples/apps/todo/api.ts +26 -0
  500. package/examples/apps/todo/app.tsx +128 -0
  501. package/examples/apps/todo/main.tsx +9 -0
  502. package/examples/apps/todo/server.ts +39 -0
  503. package/examples/hello-world/README.md +9 -0
  504. package/examples/hello-world/client.ts +14 -0
  505. package/examples/hello-world/routes.tsx +26 -0
  506. package/examples/hello-world/server.ts +46 -0
  507. package/examples/patterns/AppShell.tsx +224 -0
  508. package/examples/patterns/Dashboard.tsx +153 -0
  509. package/examples/patterns/DataScreen.tsx +104 -0
  510. package/examples/patterns/DetailPage.tsx +79 -0
  511. package/examples/patterns/Docs.tsx +105 -0
  512. package/examples/patterns/FocusTask.tsx +67 -0
  513. package/examples/patterns/Landing.tsx +90 -0
  514. package/examples/patterns/ListPage.tsx +77 -0
  515. package/examples/patterns/Mobile.tsx +154 -0
  516. package/examples/patterns/SettingsPage.tsx +98 -0
  517. package/examples/patterns/SplitWorkspace.tsx +113 -0
  518. package/package.json +61 -29
  519. package/dist/components/Slider/Slider.d.ts +0 -19
  520. package/dist/components/Tabs/Tabs.d.ts +0 -12
  521. package/dist/components/index.js +0 -55
  522. package/dist/ui-dom/Confirm.d.ts +0 -8
  523. package/dist/ui-dom/Notification.d.ts +0 -8
  524. package/dist/ui-dom/Toast.d.ts +0 -8
  525. package/dist/ui-dom/ai.d.ts +0 -59
  526. package/dist/ui-dom/browser.d.ts +0 -10
  527. package/dist/ui-dom/debug.d.ts +0 -21
  528. package/dist/ui-dom/hooks/chat.d.ts +0 -11
  529. package/dist/ui-dom/hooks/events.d.ts +0 -30
  530. package/dist/ui-dom/hooks/external.d.ts +0 -20
  531. package/dist/ui-dom/hooks/index.d.ts +0 -29
  532. package/dist/ui-dom/hooks/input.d.ts +0 -33
  533. package/dist/ui-dom/hooks/media.d.ts +0 -17
  534. package/dist/ui-dom/hooks/popup.d.ts +0 -30
  535. package/dist/ui-dom/hooks/stable.d.ts +0 -35
  536. package/dist/ui-dom/hooks/types.d.ts +0 -77
  537. package/dist/ui-dom/i18n.d.ts +0 -31
  538. package/dist/ui-dom/index.d.ts +0 -47
  539. package/dist/ui-dom/index.js +0 -41
  540. package/dist/ui-dom/jsx-runtime.d.ts +0 -4
  541. package/dist/ui-dom/jsx-runtime.js +0 -1
  542. package/dist/ui-dom/locale/en_US.d.ts +0 -69
  543. package/dist/ui-dom/locale/zh_CN.d.ts +0 -69
  544. package/dist/ui-dom/middleware/api.d.ts +0 -91
  545. package/dist/ui-dom/middleware/auth.d.ts +0 -30
  546. package/dist/ui-dom/middleware/ws.d.ts +0 -33
  547. package/dist/ui-dom/motion.d.ts +0 -8
  548. package/dist/ui-dom/popup-tracker.d.ts +0 -36
  549. package/dist/ui-dom/popup.d.ts +0 -42
  550. package/dist/ui-dom/store.d.ts +0 -24
  551. package/dist/ui-dom/testing.d.ts +0 -68
  552. package/dist/ui-dom/testing.js +0 -7
  553. package/dist/ui-dom/types.d.ts +0 -634
  554. package/dist/ui-dom/use-chat.d.ts +0 -95
  555. package/dist/ui-dom/vdom3/README.d.ts +0 -32
  556. package/dist/ui-dom/vdom3/app.d.ts +0 -20
  557. package/dist/ui-dom/vdom3/audit.d.ts +0 -29
  558. package/dist/ui-dom/vdom3/build.d.ts +0 -20
  559. package/dist/ui-dom/vdom3/commands.d.ts +0 -21
  560. package/dist/ui-dom/vdom3/comp-index.d.ts +0 -18
  561. package/dist/ui-dom/vdom3/delegate.d.ts +0 -53
  562. package/dist/ui-dom/vdom3/events.d.ts +0 -17
  563. package/dist/ui-dom/vdom3/index.d.ts +0 -42
  564. package/dist/ui-dom/vdom3/jsx.d.ts +0 -32
  565. package/dist/ui-dom/vdom3/record.d.ts +0 -16
  566. package/dist/ui-dom/vdom3/registry.d.ts +0 -30
  567. package/dist/ui-dom/vdom3/render.d.ts +0 -39
  568. package/dist/ui-dom/vdom3/replay.d.ts +0 -28
  569. package/dist/ui-dom/vdom3/root.d.ts +0 -24
  570. package/dist/ui-dom/vdom3/router.d.ts +0 -31
  571. package/dist/ui-dom/vdom3/scheduler.d.ts +0 -23
  572. package/dist/ui-dom/vdom3/ssr.d.ts +0 -27
  573. package/dist/ui-dom/vdom3/sync.d.ts +0 -22
  574. package/dist/ui-dom/vdom3/types.d.ts +0 -173
  575. package/dist/ui-dom/vdom3/ui.d.ts +0 -16
  576. package/dist/ui-dom/vdom3.js +0 -41
  577. package/dist/ui-dom/vnode.d.ts +0 -13
  578. /package/dist/{make-executable-schema.test.d.ts → cli/content-sync.test.d.ts} +0 -0
  579. /package/dist/{ui-dom/testing.test.d.ts → cli/docs-cli.test.d.ts} +0 -0
  580. /package/dist/{components → client/components}/CodeBlock/highlight.d.ts +0 -0
  581. /package/dist/{components → client/components}/DatePicker/calendar-utils.d.ts +0 -0
  582. /package/dist/{components → client/components}/DiffView/diff-utils.d.ts +0 -0
  583. /package/dist/{components → client/components}/Editor/edit-events.d.ts +0 -0
  584. /package/dist/{components → client/components}/Editor/model/apply.d.ts +0 -0
  585. /package/dist/{components → client/components}/Editor/model/diff.d.ts +0 -0
  586. /package/dist/{components → client/components}/Editor/model/dom.d.ts +0 -0
  587. /package/dist/{components → client/components}/Editor/model/history.d.ts +0 -0
  588. /package/dist/{components → client/components}/Editor/model/html.d.ts +0 -0
  589. /package/dist/{components → client/components}/Editor/model/inverse.d.ts +0 -0
  590. /package/dist/{components → client/components}/Editor/model/types.d.ts +0 -0
  591. /package/dist/{components → client/components}/Editor/tools/table.d.ts +0 -0
  592. /package/dist/{components → client/components}/Editor/tools/types.d.ts +0 -0
  593. /package/dist/{components → client/components}/FilePreview/markdown.d.ts +0 -0
  594. /package/dist/{components → client/components}/Markdown/parser.d.ts +0 -0
  595. /package/dist/{components → client/components}/OfficeEditor/ai/ai-bridge.d.ts +0 -0
  596. /package/dist/{components → client/components}/OfficeEditor/model/apply.d.ts +0 -0
  597. /package/dist/{components → client/components}/OfficeEditor/model/types.d.ts +0 -0
  598. /package/dist/{components → client/components}/Pipeline/dag-utils.d.ts +0 -0
  599. /package/dist/{components → client/components}/QRCode/qr.d.ts +0 -0
  600. /package/dist/{components → client/components}/Sparkline/sparkline-utils.d.ts +0 -0
  601. /package/dist/{office → client/office}/docx.d.ts +0 -0
  602. /package/dist/{office → client/office}/pptx.d.ts +0 -0
  603. /package/dist/{office → client/office}/xlsx.d.ts +0 -0
  604. /package/dist/{office → client/office}/xml.d.ts +0 -0
  605. /package/dist/{office → client/office}/zip.d.ts +0 -0
  606. /package/dist/{ai → server/ai}/agent.d.ts +0 -0
  607. /package/dist/{ai → server/ai}/client.d.ts +0 -0
  608. /package/dist/{ai → server/ai}/sse.d.ts +0 -0
  609. /package/dist/{core → server/core}/serve.d.ts +0 -0
  610. /package/dist/{core → server/core}/ws.d.ts +0 -0
  611. /package/dist/{db → server/db}/errors.d.ts +0 -0
  612. /package/dist/{db → server/db}/memory-redis.d.ts +0 -0
  613. /package/dist/{db → server/db}/memory-sql.d.ts +0 -0
  614. /package/dist/{db → server/db}/postgres/connection.d.ts +0 -0
  615. /package/dist/{db → server/db}/postgres/pool.d.ts +0 -0
  616. /package/dist/{db → server/db}/postgres/protocol.d.ts +0 -0
  617. /package/dist/{db → server/db}/postgres/schema.d.ts +0 -0
  618. /package/dist/{db → server/db}/query-builder.d.ts +0 -0
  619. /package/dist/{db → server/db}/query.d.ts +0 -0
  620. /package/dist/{db → server/db}/redis/client.d.ts +0 -0
  621. /package/dist/{db → server/db}/redis/commands.d.ts +0 -0
  622. /package/dist/{db → server/db}/redis/connection.d.ts +0 -0
  623. /package/dist/{db → server/db}/redis/pipeline.d.ts +0 -0
  624. /package/dist/{db → server/db}/redis/pool.d.ts +0 -0
  625. /package/dist/{db → server/db}/redis/resp.d.ts +0 -0
  626. /package/dist/{db → server/db}/redis/subscriber.d.ts +0 -0
  627. /package/dist/{db → server/db}/sql-parser.d.ts +0 -0
  628. /package/dist/{email → server/email}/index.d.ts +0 -0
  629. /package/dist/{email → server/email}/smtp.d.ts +0 -0
  630. /package/dist/{graphql.d.ts → server/graphql.d.ts} +0 -0
  631. /package/dist/{index.d.ts → server/index.d.ts} +0 -0
  632. /package/dist/{make-executable-schema.d.ts → server/make-executable-schema.d.ts} +0 -0
  633. /package/dist/{messager → server/messager}/index.d.ts +0 -0
  634. /package/dist/{middleware → server/middleware}/cors.d.ts +0 -0
  635. /package/dist/{middleware → server/middleware}/rate-limit.d.ts +0 -0
  636. /package/dist/{middleware → server/middleware}/static.d.ts +0 -0
  637. /package/dist/{postgres → server/postgres}/client.d.ts +0 -0
  638. /package/dist/{postgres → server/postgres}/index.d.ts +0 -0
  639. /package/dist/{postgres → server/postgres}/types.d.ts +0 -0
  640. /package/dist/{queue → server/queue}/index.d.ts +0 -0
  641. /package/dist/{redis → server/redis}/client.d.ts +0 -0
  642. /package/dist/{redis → server/redis}/index.d.ts +0 -0
  643. /package/dist/{redis → server/redis}/types.d.ts +0 -0
  644. /package/dist/{request.d.ts → server/request.d.ts} +0 -0
  645. /package/dist/{response.d.ts → server/response.d.ts} +0 -0
  646. /package/dist/{scheduler → server/scheduler}/cron.d.ts +0 -0
  647. /package/dist/{scheduler → server/scheduler}/index.d.ts +0 -0
  648. /package/dist/{types.d.ts → server/types.d.ts} +0 -0
  649. /package/dist/{ui → server/ui}/html-safe.d.ts +0 -0
  650. /package/dist/{user → server/user}/index.d.ts +0 -0
  651. /package/dist/{user → server/user}/password.d.ts +0 -0
@@ -0,0 +1,2 @@
1
+ var Tt=Symbol("vdom-fragment");function D(t){return t.type===Tt}function V(t){let e=t.children??(t.props.children===void 0?[]:t.props.children),n=o=>Array.isArray(o)?o.flatMap(n):[o];return Array.isArray(e)?e.flatMap(n):[e]}function I(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)&&D(t)?V(t).reduce((e,n)=>e+I(n),0):1}function Pe(t){return t==null||typeof t=="boolean"}function Ae(t){return!(t==null||typeof t=="boolean"||typeof t=="string"||typeof t=="number"||Array.isArray(t)||typeof t=="object"&&typeof t.type=="string"||typeof t.type=="function"||typeof t.type=="symbol")}function ke(t){return t==null?"null/undefined":typeof t=="object"?`object\uFF08type: ${typeof t.type}\uFF09`:typeof t}function Ct(t,e,n,o){return[{op:"createAnchor",id:t,...o!==void 0?{detail:o}:{}},{op:"insert",id:t,parent:e,ref:n}]}function oe(t,e,n,o,r){for(let s of Ct(e,n,o,r))t(s)}function U(t){return t===""?"hole":typeof t=="string"||typeof t=="number"?"text":Pe(t)?"hole":Array.isArray(t)?"array":typeof t.type=="string"?"element":D(t)?"fragment":typeof t.type=="function"?"component":(Ae(t),"invalid")}function De(t){return typeof t=="string"||typeof t=="number"?String(t):null}function M(t){return U(t)==="hole"}function G(t){return U(t)==="text"}function H(t,e){return`${t}.k${e.replace(/%/g,"%25").replace(/\./g,"%2E")}`}function L(t){return t==null||typeof t=="boolean"||typeof t=="string"||typeof t=="number"||Array.isArray(t)?null:t.key}function re(t){return L(t)!==null}function ie(t){let e=!1,n=!1;for(let o of t)if(re(o)?e=!0:n=!0,e&&n)return"mixed";return e?"all-keyed":"all-unkeyed"}function q(t,e){let n=new Set;for(let o of t){let r=L(o);if(r!==null){if(n.has(r)){console.warn(`[vdom] ${e}\uFF1A\u91CD\u590D key "${r}"\uFF08\u5217\u8868\u8EAB\u4EFD\u6620\u5C04\u6B67\u4E49\u2014\u2014\u589E\u5220/\u91CD\u6392\u884C\u4E3A\u4E0D\u786E\u5B9A\uFF09\u2014\u2014\u8BF7\u4E3A\u6BCF\u9879\u58F0\u660E\u552F\u4E00 key\uFF08\u6570\u636E id \u2192 keyBy\uFF09`);return}n.add(r)}}}function Ue(t,e){if(t.length<2)return;let n=t.some(r=>typeof r?.type=="function"),o=t.some(r=>!re(r)&&typeof r?.type=="function");if(n&&o){let r=t.map(s=>{let i=s;if(i==null)return"null";if(typeof i=="boolean")return"bool";if(typeof i=="string"||typeof i=="number")return"text";if(Array.isArray(i))return"arr";if(typeof i.type=="function"){let a=i.type.name;return"comp"+(a?":"+a:"")}return"el"+(i.key?`.k{${String(i.key).slice(0,16)}}`:"")});console.warn(`[vdom] ${e}\uFF1A\u5217\u8868\u542B\u65E0 key \u7684\u7EC4\u4EF6\u9879\uFF08\u957F\u5EA6 ${t.length}\uFF09\u2014\u2014\u9879: [${r.join(", ")}]\u2014\u2014\u52A8\u6001\u589E\u5220/\u91CD\u6392\u65F6\u72B6\u6001\u4F1A\u6309\u4F4D\u7F6E\u7EE7\u627F\u2014\u2014\u8BF7\u4E3A\u7EC4\u4EF6\u9879\u58F0\u660E key\uFF08\u6570\u636E id \u2192 keyBy\uFF09`)}}function E(t,e){return`${t}.${e}`}function pe(t){let e={};for(let[n,o]of Object.entries(t))n==="children"||n==="key"||n==="ref"||typeof o!="function"&&(e[n]=o);return e}async function $e(t,e,n,o,r,s){r({op:"create",id:e,tag:t.type,attrs:pe(t.props)});for(let[d,p]of Object.entries(t.props))d==="children"||d==="key"||d==="ref"||typeof p=="function"&&r({op:"setProp",id:e,key:d,value:p});r({op:"insert",id:e,parent:n,ref:o});let i=t.props.ref;typeof i=="function"&&r({op:"ref",id:e,fn:i});let a=V(t);q(a,`\u5143\u7D20 children\uFF08${e}\uFF09`);let l=null,u=0;for(let d of a){await s(d,e,u,l);let p=I(d);l=E(e,u+p-1),u+=p}r({op:"close",id:e})}function Nt(t){let e=new Set,n=t,o=()=>{for(let r of[...e])r()};return{get state(){return n},subscribe(r){return e.add(r),()=>{e.delete(r)}},set(r){n={...n,...r},o()},update(r){r(n),o()},notify:o}}function Ke(t){let e=Nt(t),n=(()=>e.state);return n.set=o=>e.set(o),n.update=o=>e.update(o),n.subscribe=o=>e.subscribe(o),n.notify=()=>e.notify(),n.store=e,n}function Fe(t,e,n){if(typeof e=="function"){let r=e;return i=>{i?r(i):n?.()}}return{current:e}}function Be(t,e,n){let o=typeof e=="object"?e:void 0,r=typeof e=="boolean"?e:!1,s=o??n,i=t.nextHookIndex(),a=t.getHookState(i)??{open:r};t.setHookState(i,a);let l=s?.open!==void 0;return{get open(){return s?.open??a.open},setOpen(u){l?(s?.onOpenChange||console.warn(`[vdom] useOpen${o?.name?`(${o.name})`:""} \u53D7\u63A7\u7F3A onOpenChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548`),s?.onOpenChange?.(u)):(a.open=u,t.requestRender())},toggle(){this.setOpen(!this.open)}}}function qe(t,e,n){let o=n?e:(()=>!0),r=n??e,s=t.getBrowser()?.window;if(!s)return()=>{};let i=l=>{if(typeof o=="string"){if(l.key!==o)return}else if(!o(l))return;r(l)};s.addEventListener("keydown",i);let a=()=>s.removeEventListener("keydown",i);return t.onUnmount(a),a}function _e(t,e,n,o,r,s,i,a){let l=t.getBoundingClientRect();if(l.width===0&&l.height===0)return null;let u=e.innerWidth,d=e.innerHeight,p,f;switch(r){case"bottom":p=l.bottom+s,f=a?l.left+l.width/2-n/2:l.left;break;case"top":p=l.top-o-s,f=a?l.left+l.width/2-n/2:l.left;break;case"left":p=a?l.top+l.height/2-o/2:l.top,f=l.left-n-s;break;case"right":p=a?l.top+l.height/2-o/2:l.top,f=l.right+s;break}return f+n>u-i&&(f=u-n-i),f<i&&(f=i),p+o>d-i&&(p=d-o-i),p<i&&(p=i),{top:p,left:f}}function je(t,e){let n=e.getComputedStyle(t).animationName;if(n&&n!=="none")return!0;for(let o of t.children){let r=e.getComputedStyle(o).animationName;if(r&&r!=="none")return!0}return!1}function We(t,e){let n=t.getBrowser()?.window,o=0,r=0,s={get top(){return o},get left(){return r},refresh:()=>{}},i=()=>{let u=e.el();if(!u)return;let d=u.getBoundingClientRect();if(d.width===0&&d.height===0)return;let p=e.compute(d);o=p.top,r=p.left},a,l=()=>{a||n&&(a=n.requestAnimationFrame(()=>{a=void 0,(e.isOpen?.()??!0)&&i()}))};return n&&(n.addEventListener("scroll",l,!0),n.addEventListener("resize",l),t.onUnmount(()=>{a!==void 0&&n.cancelAnimationFrame(a),n.removeEventListener("scroll",l,!0),n.removeEventListener("resize",l)})),s.refresh=i,s}function ze(t){let e=t?.key;return e==null?null:typeof e=="string"?e:typeof e=="number"?String(e):(console.warn(`[vdom] key \u5FC5\u987B\u662F string|number\u2014\u2014\u5F53\u524D ${typeof e}\uFF08\u5FFD\u7565\u2014\u2014\u4F4D\u7F6E\u8EAB\u4EFD\uFF09`),null)}function Ge(t){let e={...t??{}};return delete e.key,e}function Te(t,e,...n){let o=Ge(e);return n.length===1?o.children=n[0]:n.length>1&&(o.children=n),{type:t,props:o,key:ze(e)}}function R(t){if(t==null)return"hole";let e=U(t);return e==="invalid"?"hole":e}var Y=async(t,e,n)=>{n.emit({op:"remove",id:n.oldId}),await n.emitNode(e,n.parent,n.index,n.ref)};var J=async(t,e,n)=>{n.emit({op:"remove",id:n.oldId}),await n.emitNode(e,n.parent,n.index,n.ref)};function j(t,e,n){return typeof t?.type=="function"?E(e,0):Array.isArray(t)?e:M(t)?E(e,0):n}function se(t,e,n){return typeof t?.type=="function"||Array.isArray(t)?e:n}function N(t,e,n,o,r){if(globalThis.__DBG8&&console.log("[dbg-rmt]",e,"parent=",n,"type=",typeof t=="object"&&t!==null&&!Array.isArray(t)?String(t.type):Array.isArray(t)?"array":String(t)),M(t)){o({op:"remove",id:e});return}if(G(t)){o({op:"remove",id:e});return}if(Array.isArray(t)){globalThis.__DBG4&&console.log(`[dbg-arr] \u6570\u7EC4 base=${e} parent=${n} \u9879\u6570=${t.length}`);let l=0;for(let u of t)N(u,E(e,l),e,o,r),l+=I(u);return}let s=t;if(D(s)){let l=Number(e.slice(n.length+1)),u=V(s),d=l;for(let p of u)N(p,E(n,d),n,o,r),d+=I(p);return}if(typeof s.type=="function"){let l=s.key!==null?H(n,s.key):e;globalThis.__DBG5&&console.log(`[dbg-comp] unmount ${l} base=${e} parent=${n}`),o({op:"unmount",compId:l});let u=r?.get(l)?.lastOutput;if(u!==void 0){let d=W(u),p=j(d,l,e),m=d!==null&&typeof d=="object"&&!Array.isArray(d)&&D(d)?e.slice(0,e.lastIndexOf(".")):se(d,l,l);N(d,p,m,o,r)}}let i=V(s),a=0;i.forEach(l=>{let u=E(e,a);l!==null&&typeof l!="string"&&typeof l!="number"&&typeof l!="boolean"&&!Array.isArray(l)?N(l,u,e,o,r):o({op:"remove",id:u}),a+=I(l)}),o({op:"remove",id:e})}var X=async(t,e,n)=>{N(t,n.oldId,n.parent,n.emit,n.registry),await n.emitNode(e,n.parent,n.index,n.ref)};var Q=async(t,e,n)=>{globalThis.__DBG8&&console.log("[dbg-tc] oldCompId=",n.oldCompId,"oldId=",n.oldId,"parent=",n.parent,"index=",n.index),n.oldCompId&&n.emit({op:"unmount",compId:n.oldCompId});let o=n.registry?.get(n.oldCompId??"")?.lastOutput;if(o!==void 0){let r=W(o);N(r,j(r,n.oldCompId??"",E(n.parent,n.index)),se(r,n.oldCompId??"",n.parent),n.emit,n.registry)}else n.emit({op:"remove",id:n.oldId});await n.emitNode(e,n.parent,n.index,n.ref)};var $=async(t,e,n)=>{let o=Array.isArray(t)?t:V(t),r=n.index;for(let s of o)N(s,E(n.parent,r),n.parent,n.emit,n.registry),r+=I(s);await n.emitNode(e,n.parent,n.index,n.ref)};var St={text:{text:null,hole:Y,element:Y,component:Y,fragment:Y,array:Y},hole:{text:J,hole:null,element:J,component:J,fragment:J,array:J},element:{text:X,hole:X,element:null,component:X,fragment:X,array:X},component:{text:Q,hole:Q,element:Q,component:null,fragment:Q,array:Q},fragment:{text:$,hole:$,element:$,component:$,fragment:null,array:$},array:{text:$,hole:$,element:$,component:$,fragment:$,array:null}};function K(t,e){return St[t]?.[e]??null}function Ye(t,e,n,o){let r=pe(t.props),s=pe(e.props);for(let[i,a]of Object.entries(s))r[i]!==a&&o({op:"setProp",id:n,key:i,value:a});for(let i of Object.keys(r))i in s||o({op:"setProp",id:n,key:i,value:void 0});for(let[i,a]of Object.entries(e.props))i==="children"||i==="key"||typeof a=="function"&&t.props[i]!==a&&o({op:"setProp",id:n,key:i,value:a,prev:t.props[i]});for(let i of Object.keys(t.props))i==="children"||i==="key"||typeof t.props[i]=="function"&&e.props[i]===void 0&&o({op:"setProp",id:n,key:i,value:void 0,prev:t.props[i]})}async function Ze(t,e,n,o,r,s,i){let a=V(t),l=V(e),u=Array.isArray(t.props.children)!==Array.isArray(e.props.children);await le(a,l,n,o,r,s,i,u)}async function le(t,e,n,o,r,s,i,a=!1){if(t=Ce(t),e=Ce(e),!a){let f=v=>!M(v)&&!G(v)&&!Array.isArray(v),m=t.filter(f),k=e.filter(f),w=(v,C)=>C>=v.length||M(v[C]),g=v=>typeof v?.type=="function"&&!re(v),c=v=>w(t,v)||g(t[v]),y=v=>w(e,v)||g(e[v]);(e.some((v,C)=>g(v)&&!c(C))||t.some((v,C)=>g(v)&&!y(C)))&&Ue(k,`children\uFF08\u65E0 key \u7EC4\u4EF6\u5B9E\u69FD\u7FFB\u8F6C ${m.length}\u2192${k.length}\uFF09`)}if(globalThis.__WF_DEBUG_MOVED__&&console.log("[debug-dci] id=",n,"oldKeys=",JSON.stringify(t.map(L)),"newKeys=",JSON.stringify(e.map(L)),"lk=",ie(t),ie(e)),ie(e)==="all-keyed"&&ie(t)==="all-keyed"){await Qe(t,e,n,o,r,s,i);return}if(Xe(e)||Xe(t)){await Qe(t,e,n,o,r,s,i);return}let l=null,u=Math.min(t.length,e.length);for(let f=0;f<u;f++){let m=t[f]??null,k=e[f]??null,w=E(n,f);M(k)?M(m)||(await Je(m,n,w,r,i),oe(r,w,n,l)):await Vt(m,k,n,f,l,w,o,r,s,i),l=w}for(let f=t.length;f<e.length;f++)await o(e[f],n,f,l),l=E(n,f);let d=t.reduce((f,m)=>f+I(m),0),p=e.reduce((f,m)=>f+I(m),0);if(d>p){let f=d-p;for(let m=t.length-1;m>=0&&f>0;m--){let k=I(t[m]);k<=f&&(await Je(t[m],n,E(n,m),r,i),f-=k)}}}async function Je(t,e,n,o,r){if(M(t)){o({op:"remove",id:n});return}N(t,n,e,o,r)}function Ce(t){let e=[];for(let n of t)n!==null&&typeof n=="object"&&!Array.isArray(n)&&D(n)?e.push(...Ce(V(n))):e.push(n);return e}async function Vt(t,e,n,o,r,s,i,a,l,u){if(globalThis.__DBG7&&console.log("[dbg-slot]",s,"old=",t===null?"null":String(typeof t=="object"?t.type:t),"new=",e===null?"null":String(typeof e=="object"?e.type:e)),U(t)==="text"&&U(e)==="text"){String(t)!==String(e)&&a({op:"setText",id:s,value:String(e)});return}if(U(t)==="hole"){a({op:"remove",id:s}),await i(e,n,o,r);return}if(U(t)===U(e)&&typeof t!="string"&&typeof t!="number"){await z(t,e,n,o,r,i,a,l,u);return}let d=K(R(t),R(e));if(!d)throw new Error(`[vdom] \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A\u672A\u5B9A\u4E49\u8F6C\u6362 ${R(t)} \u2192 ${R(e)}\uFF08diffSlot\u2014\u2014\u5FC5\u987B\u663E\u5F0F\u8FC1\u79FB\u6216\u663E\u5F0F Reject\uFF09`);await d(t,e,{emit:a,emitNode:i,oldId:s,newId:s,parent:n,index:o,ref:r,oldCompId:typeof t?.type=="function"?s:void 0,registry:u})}function Xe(t){return t.some(re)}async function Qe(t,e,n,o,r,s,i){let a=new Map;t.forEach((c,y)=>{let x=L(c);x!==null&&!a.has(x)&&a.set(x,y)}),q(e,`keyed \u5217\u8868\uFF08${n}\uFF09`),q(t,`keyed \u5217\u8868\uFF08${n}\uFF09`);let l=new Set(e.map(c=>L(c)).filter(c=>c!==null)),u=new Map;for(let c=0;c<t.length;c++){let y=t[c];if(M(y)){r({op:"remove",id:E(n,c)});continue}if(G(y)){r({op:"remove",id:E(n,c)});continue}if(Array.isArray(y))continue;let x=L(y);if(x!==null){let v=(u.get(x)??0)+1;if(u.set(x,v),v===1)continue;N(y,E(n,c),n,r,i);continue}N(y,E(n,c),n,r,i)}for(let[c,y]of a)l.has(c)||N(t[y],E(n,y),n,r,i);let d=t.map(c=>L(c)).filter(c=>c!==null&&l.has(c)),p=e.map(c=>L(c)).filter(c=>c!==null&&a.has(c)),f=!0;{let c=0;for(let y of p){let x=d.indexOf(y,c);if(x===-1){f=!1;break}c=x+1}}if(!f){for(let[y,x]of a)l.has(y)||r({op:"unmount",compId:H(n,y)});t.forEach((y,x)=>{if(!M(y)){if(G(y)){r({op:"remove",id:E(n,x)});return}if(L(y)!==null){r({op:"remove",id:E(n,x)});return}N(y,E(n,x),n,r,i)}});let c=null;for(let y=0;y<e.length;y++){let x=e[y],v=L(x);if(v!==null&&typeof x.type=="function"){let C=H(n,v);await _(x,n,y,c,C,s,i,o,r)&&r({op:"mount",compId:C})}else await o(x,n,y,c);c=E(n,y)}return}let m=[];e.forEach((c,y)=>{let x=L(c);if(x===null)return;let v=a.get(x);v!==void 0&&v!==y&&m.push({oldIdx:v,newIdx:y})});let k=m.every(c=>c.newIdx<c.oldIdx);m.sort((c,y)=>k?c.newIdx-y.newIdx:y.newIdx-c.newIdx),globalThis.__WF_DEBUG_MOVED__&&console.log("[debug-moved] subseq=1 moved=",JSON.stringify(m),"oldIdxByKey=",JSON.stringify([...a.entries()]),"newKeys=",JSON.stringify([...l]),"parent=",n);for(let c of m)r({op:"move",id:E(n,c.oldIdx),parent:n,ref:null,newId:E(n,c.newIdx),noMove:!0});let w=!0,g=null;for(let c=0;c<e.length;c++){let y=e[c],x=L(y),v=E(n,c);if(x!==null){let C=a.get(x);C===void 0?await ae(y,n,c,g,x,o,r,s,i):typeof y.type=="function"?await ae(y,n,c,g,x,o,r,s,i):await z(t[C],y,n,c,g,o,r,s,i)}else await o(y,n,c,g);g=v}}async function ae(t,e,n,o,r,s,i,a,l){let u=t;if(typeof u.type=="function"){let d=H(e,r),f=l.get(d)?.lastOutput;await _(u,e,n,o,d,a,l,async(k,w,g,c)=>{await ce(f,k,w,g,c,s,i,a,l,z,d,E(e,n),(y,x,v,C,F)=>ae(y,x,v,C,F,s,i,a,l))},i)&&i({op:"mount",compId:d});return}await s(t,e,n,o)}async function ce(t,e,n,o,r,s,i,a,l,u,d,p,f){let m=()=>{if(t?.kind==="vnode"){let g=t.v;return g!==null&&typeof g=="object"&&typeof g.type=="function"?E(d,0):p}return E(d,0)},k=E(n,o),w=M(e);if(t===void 0){await s(e,n,o,r);return}switch(t.kind){case"hole":{if(!w){let g=K("hole",R(e));if(!g)throw new Error(`[vdom] \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A\u672A\u5B9A\u4E49\u8F6C\u6362 hole \u2192 ${R(e)}\uFF08\u7EC4\u4EF6\u8F93\u51FA\u5C55\u5F00\u2014\u2014P2 \u663E\u5F0F Reject\uFF09`);await g(null,e,{emit:i,emitNode:s,oldId:m(),newId:k,parent:n,index:o,ref:r,registry:l})}return}case"vnode":{if(w){let g=K(R(t.v),"hole");if(!g)throw new Error(`[vdom] \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A\u672A\u5B9A\u4E49\u8F6C\u6362 ${R(t.v)} \u2192 hole\uFF08\u7EC4\u4EF6\u8F93\u51FA\u6536\u7F29\u2014\u2014P2 \u663E\u5F0F Reject\uFF09`);let c=t.v,y=c!==null&&typeof c=="object"&&typeof c.type=="function"?c.key!==null?H(d,c.key):E(d,0):void 0;await g(t.v,e,{emit:i,emitNode:s,oldId:m(),newId:k,parent:n,index:o,ref:r,registry:l,oldCompId:y})}else if(Array.isArray(e)){let g=K(R(t.v),"array");if(!g)throw new Error(`[vdom] \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A\u672A\u5B9A\u4E49\u8F6C\u6362 ${R(t.v)} \u2192 array\uFF08\u5355\u8282\u70B9\u2192\u591A\u6839\u2014\u2014P2 \u663E\u5F0F Reject\uFF09`);await g(t.v,e,{emit:i,emitNode:s,oldId:m(),newId:k,parent:n,index:o,ref:r,registry:l})}else{let g=e;f&&g!==null&&typeof g=="object"&&typeof g.type=="function"&&g.key!==null?await f(e,n,o,r,g.key):await u(t.v,g,n,o,r,s,i,a,l)}return}case"array":{if(w){let g=K("array","hole");if(!g)throw new Error("[vdom] \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A\u672A\u5B9A\u4E49\u8F6C\u6362 array \u2192 hole\uFF08\u591A\u6839\u6536\u7F29\u2014\u2014P2 \u663E\u5F0F Reject\uFF09");await g(t.items,e,{emit:i,emitNode:s,oldId:m(),newId:k,parent:n,index:o,ref:r,registry:l})}else if(Array.isArray(e))await le(t.items,e,n,s,i,a,l);else{let g=K("array",R(e));if(!g)throw new Error(`[vdom] \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A\u672A\u5B9A\u4E49\u8F6C\u6362 array \u2192 ${R(e)}\uFF08\u591A\u6839\u2192\u5355\u8282\u70B9\u2014\u2014P2 \u663E\u5F0F Reject\uFF09`);await g(t.items,e,{emit:i,emitNode:s,oldId:m(),newId:k,parent:n,index:o,ref:r,registry:l})}return}}}async function z(t,e,n,o,r,s,i,a,l){let u=E(n,o);if(typeof e.type=="function"){let p=e.key!==null?H(n,e.key):u,f=typeof t.type=="function"&&t.key!==null?H(n,t.key):u,m=l.get(p);if(p!==f||m&&m.type!==e.type){let g=l.get(f);if(g){f!==p&&i({op:"unmount",compId:f});let c=g.lastOutput;if(c!==void 0){let y=W(c);N(y,j(y,f,E(n,o)),se(y,f,n),i,l)}Z(f,l)}m=void 0,await _(e,n,o,r,p,a,l,s,i),i({op:"mount",compId:p});return}let k=m?.lastOutput;await _(e,n,o,r,p,a,l,async(g,c,y,x)=>{await ce(k,g,c,y,x,s,i,a,l,z,p,E(n,o),(v,C,F,S,h)=>ae(v,C,F,S,h,s,i,a,l))})&&i({op:"mount",compId:p});return}if(typeof e.type=="string"&&typeof t.type=="string"){t.type===e.type?(Ye(t,e,u,i),await Ze(t,e,u,s,i,a,l)):(N(t,u,n,i,l),await s(e,n,o,r));return}if(D(t)&&D(e)){await le(V(t),V(e),n,s,i,a,l);return}throw new Error(`[vdom] \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1AdiffSame \u672A\u5B9A\u4E49\u540C\u6001\u5BF9\u7167 ${String(t.type)} \u2194 ${String(e.type)}\uFF08P2 \u663E\u5F0F Reject\uFF09`)}function me(t,e,n,o){return new ReadableStream({async start(r){let s=d=>r.enqueue(d),i=Ne(s,n,o),a=R(t),l=R(e),u=K(a,l);u?await u(t,e,{emit:s,emitNode:i,oldId:"root.0",newId:"root.0",parent:"root",index:0,ref:null,registry:o,oldCompId:typeof t.type=="function"?t.key!==null?H("root",t.key):"root.0":void 0}):await z(t,e,"root",0,null,i,s,n,o),s({op:"done"}),r.close()}})}var ge=class{table=new Map;rootTypes=new Set;doc;dispatchBound;container;phase="active";constructor(e,n){this.doc=e,this.container=n,this.dispatchBound=this.dispatch.bind(this)}set(e,n,o){if(this.phase==="disposed"){console.error(`[vdom] \u4E8B\u4EF6\u8868\u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Adisposed \u540E set(${e}, ${n}) \u88AB\u5FFD\u7565`);return}if(typeof o!="function"){console.warn(`[vdom] \u4E8B\u4EF6 ${n} \u975E\u51FD\u6570\u503C\u88AB\u8DF3\u8FC7\uFF08node ${e}\uFF09\u2014\u2014\u671F\u671B\u51FD\u6570\uFF0C\u5B9E\u9645 ${typeof o}`);return}let r=this.table.get(e);r||(r=new Map,this.table.set(e,r)),r.set(n,o),this.ensureRoot(n)}get(e,n){return this.table.get(e)?.get(n)}removeEvent(e,n){let o=this.table.get(e);o&&(o.delete(n),o.size===0&&this.table.delete(e))}remove(e){for(let n of[...this.table.keys()])(n===e||n.startsWith(e+"."))&&this.table.delete(n)}ensureRoot(e){this.rootTypes.has(e)||(this.doc.addEventListener(e,this.dispatchBound,{capture:!0}),this.rootTypes.add(e))}dispatch(e){if(this.container){let o=e.target;if(o&&!this.container.contains(o))return}if(e.type==="contextmenu"&&window.__dbgEvt){let o=e.target,r=[...this.table.entries()].map(([s,i])=>s+":"+[...i.keys()].join("+")).join(" | ");console.error("[dbg-evt-dispatch]","target:",o?.getAttribute("data-wf-id"),"ALL:",r.slice(0,400))}let n=e.target;for(n&&n.nodeType===3&&(n=n.parentElement);n;){if(!n.hasAttribute?.("data-wf-id")){let r=n.closest?.("[data-wf-id]");if(r&&r!==n){n=r;continue}}let o=n.getAttribute?.("data-wf-id");if(o){let r=this.table.get(o)?.get(e.type);if(r){try{Object.defineProperty(e,"currentTarget",{value:n,configurable:!0})}catch{}try{r(e)}catch(s){console.error("[vdom] \u4E8B\u4EF6 handler:",s)}if(e.cancelBubble)return}}n=n.parentElement}}dispose(){if(this.phase!=="disposed"){this.phase="disposed";for(let e of this.rootTypes)this.doc.removeEventListener(e,this.dispatchBound,{capture:!0});this.rootTypes.clear(),this.table.clear()}}},ee=/^on[A-Z]/;function de(t){return ee.test(t)?t.slice(2).toLowerCase():null}var ye=class{refs=new Map;phase="active";set(e,n,o){if(this.phase==="disposed"){console.error(`[vdom] ref \u8868\u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Adisposed \u540E set(${e}) \u88AB\u5FFD\u7565`);return}if(o&&o!==n&&typeof o=="function")try{o(null)}catch(r){console.error("[vdom] ref prev:",r)}this.refs.set(e,n)}mount(e,n){let o=this.refs.get(e);if(typeof o=="function")try{o(n)}catch(r){console.error("[vdom] ref mount:",r)}}unmount(e){for(let[n,o]of[...this.refs])if(n===e||n.startsWith(e+".")){if(typeof o=="function")try{o(null)}catch(r){console.error("[vdom] ref unmount:",r)}this.refs.delete(n)}}remap(e,n){for(let[o,r]of[...this.refs])(o===e||o.startsWith(e+"."))&&(this.refs.delete(o),this.refs.set(n+o.slice(e.length),r))}dispose(){this.phase!=="disposed"&&(this.phase="disposed",this.refs.clear())}};var he=class{queue=null;failed=!1;phase="inactive";begin(e){let n=[],o=r=>{n.push(r);for(let s of r.childNodes)o(s)};for(let r of e.childNodes)o(r);this.queue=n,this.failed=!1,this.phase="consuming"}end(){this.phase==="consuming"&&(this.queue&&this.queue.length>0&&(this.failed=!0),this.queue=null,this.phase=this.failed?"failed":"inactive")}reset(){this.queue=null,this.failed=!1,this.phase="inactive"}next(e,n,o){if(this.phase!=="consuming")return console.error(`[vdom] absorb \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Anext \u5728 ${this.phase} \u9636\u6BB5\u8C03\u7528\uFF08\u5E94 consuming\uFF09`),null;let r=this.queue;if(!r)return null;for(;r.length>0;){let s=r.shift();if(e==="element"?s.nodeType===1&&s.tagName.toLowerCase()===n:e==="text"?s.nodeType===3:s.nodeType===8){if(e==="text"&&o!==void 0){let a=s,l=a.textContent??"";if(l!==o&&l.startsWith(o)){let u=a.splitText(o.length);r.unshift(u)}}return s}}return this.failed=!0,this.phase="failed",null}};var Rt=new Set(["draggable","contenteditable","spellcheck"]);function Se(t,e,n){if(e==="innerHTML"||e==="textContent"||e==="value"){t[e]=n;return}if(n==null){t.removeAttribute(e);return}if(Rt.has(e)){t.setAttribute(e,n?"true":"false");return}if(n===!1){t.removeAttribute(e);return}if(e==="class"||e==="className"){t.setAttribute("class",String(n));return}if(typeof n=="boolean"){t.setAttribute(e,"");return}t.setAttribute(e,String(n))}var It=new Set(["zIndex","opacity","lineHeight","zoom","fontWeight","order","flex","flexGrow","flexShrink","flexBasis","animationIterationCount","orphans","widows","columns","columnCount","columnGap","counterIncrement","counterReset","aspectRatio","scale","rotate"]);function Mt(t,e,n){if(n==null||n===!1){e.startsWith("--")&&t.style.removeProperty(e),t.style[e]="";return}if(e.startsWith("--")){t.style.setProperty(e,String(n));return}typeof n=="number"&&!It.has(e)&&(n=`${n}px`),t.style[e]=String(n)}function Ve(t,e){if(typeof e=="string"){t.setAttribute("style",e);return}if(e&&typeof e=="object"){t.style.cssText="";for(let[n,o]of Object.entries(e))Mt(t,n,o)}}var Ht=new Set(["value","checked","selected","disabled","hidden","autofocus","defaultValue","defaultChecked","innerHTML","textContent","download","indeterminate","multiple","readOnly","required","tabIndex","spellcheck","draggable","scrollTop","scrollLeft","volume","muted","paused","playbackRate","open"]);function et(t){return Ht.has(t)}function tt(t,e,n){t[e]=n}function ue(t,e){for(let[n,o]of Object.entries(e))n==="style"?Ve(t,o):Se(t,n,o)}function nt(t,e,n,o,r,s){if(o!=="ref")if(typeof r=="function"||r===void 0&&typeof s=="function"){if(ee.test(o)){let i=de(o);i&&t.set(e,i,r)}return}else if(ee.test(o)){let i=de(o);i&&t.set(e,i,r)}else o==="style"?Ve(n,r):et(o)?tt(n,o,r):Se(n,o,r)}var Lt="http://www.w3.org/2000/svg",Ot=new Set(["svg","path","circle","line","rect","text","g","defs","marker","polyline","polygon","ellipse","use","symbol","tspan","textPath","clipPath","mask","pattern","linearGradient","radialGradient","stop"]);function ot(t,e){return Ot.has(e)?t.createElementNS(Lt,e):t.createElement(e)}function Pt(t,e){t.touched.add(e.id);let n=t.nodes.get(e.id);if(n&&n.nodeType===1&&n.tagName.toLowerCase()===e.tag)ue(n,e.attrs);else if(t.absorb.queue&&!n){let r=t.absorb.next("element",e.tag);if(r)ue(r,e.attrs),t.nodes.set(e.id,r);else{let s=ot(t.doc,e.tag);ue(s,e.attrs),t.nodes.set(e.id,s)}}else{let r=ot(t.doc,e.tag);ue(r,e.attrs),n&&(t.clearNodeRefs(e.id),t.eventRegistry.remove(e.id),n.replaceWith(r)),t.nodes.set(e.id,r)}let o=t.nodes.get(e.id);o&&o.nodeType===1&&o.setAttribute("data-wf-id",e.id)}function At(t,e){t.touched.add(e.id);let n=t.nodes.get(e.id);if(n&&n.nodeType===3)n.textContent!==e.value&&(n.textContent=e.value);else if(t.absorb.queue&&!n){let o=t.absorb.next("text",void 0,e.value);if(o)o.textContent!==e.value&&(o.textContent=e.value),t.nodes.set(e.id,o);else{let r=t.doc.createTextNode(e.value);t.nodes.set(e.id,r)}}else{let o=t.doc.createTextNode(e.value);n&&n.replaceWith(o),t.nodes.set(e.id,o)}}function Dt(t,e){t.touched.add(e.id);let n=t.nodes.get(e.id);if(n&&n.nodeType===8){let o=e.detail?`wf-hole: ${e.detail}`:"wf-hole";n.textContent!==o&&(n.textContent=o)}else if(t.absorb.queue&&!n){let o=t.absorb.next("comment");if(o)t.nodes.set(e.id,o);else{let r=t.doc.createComment(e.detail?`wf-hole: ${e.detail}`:"wf-hole");t.nodes.set(e.id,r)}}else{let o=t.doc.createComment(e.detail?`wf-hole: ${e.detail}`:"wf-hole");n&&n.replaceWith(o),t.nodes.set(e.id,o)}}function Ut(t,e){let n=t.nodes.get(e.id);if(!n||n.isConnected)return;let o=t.parentOf(e);if(o){if(o.nodeType===3){let r=o.parentElement;if(!r)return;let s=o.nextSibling&&o.nextSibling.parentNode===r?o.nextSibling:null;r.insertBefore(n,s),n.nodeType===1&&t.refRegistry.mount(e.id,n);return}if(o.nodeType===8){console.error(`[vdom] id \u7A7A\u95F4\u8FDD\u4F8B\uFF1Ainsert ${e.id} \u7684 parent \u662F\u6CE8\u91CA\u951A\uFF08${e.parent}\uFF09\u2014\u2014\u63D2\u5230\u7236\u5BB9\u5668`);let r=o.parentElement;r&&r.appendChild(n),n.nodeType===1&&t.refRegistry.mount(e.id,n);return}if(e.ref){let r=t.nodes.get(e.ref)??null;r&&r.parentNode===o?o.insertBefore(n,r.nextSibling):r?o.appendChild(n):o.insertBefore(n,o.firstChild)}else o.insertBefore(n,o.firstChild);n.nodeType===1&&t.refRegistry.mount(e.id,n)}}function $t(t,e){let n=t.nodes.get(e.id);if(n){if(!e.noMove){let o=t.parentOf(e);if(!o)return;let r=e.ref?t.nodes.get(e.ref)??null:null;r?o.insertBefore(n,r.nextSibling):e.first?o.insertBefore(n,o.firstChild):o.appendChild(n)}t.remapSubtree(e.id,e.newId)}}function Kt(t,e){t.clearNodeRefs(e.id),t.eventRegistry.remove(e.id),t.nodes.get(e.id)?.remove();let n=e.id+".";for(let o of[...t.nodes.keys()])o.startsWith(n)&&(t.clearNodeRefs(o),t.eventRegistry.remove(o),t.nodes.delete(o));t.nodes.delete(e.id)}function Ft(t,e){let n=t.nodes.get(e.id);n&&n.nodeType===3&&(n.textContent=e.value)}function Bt(t,e){let n=t.nodes.get(e.id);if(!n||n.nodeType!==1)return;let o=n;if(e.key==="ref"){let r=t.refRegistry.refs.get(e.id);if(e.value===void 0){t.refRegistry.set(e.id,void 0,r),t.refRegistry.refs.delete(e.id);return}t.refRegistry.set(e.id,e.value,r),o.isConnected&&t.refRegistry.mount(e.id,o);return}if(ee.test(e.key)){let r=de(e.key);r&&(e.value===void 0?t.eventRegistry.removeEvent(e.id,r):t.eventRegistry.set(e.id,r,e.value));return}nt(t.eventRegistry,e.id,o,e.key,e.value,e.prev)}function qt(t,e){let n=t.nodes.get(e.id);n&&n.nodeType===1&&typeof e.fn=="function"&&(t.refRegistry.set(e.id,e.fn),t.refRegistry.mount(e.id,n))}function _t(t,e){t.clearNodeRefs(e.id)}function jt(t,e){let n=t.registry?.get(e.compId);n&&(n.phase="mounted")}function Wt(t,e){t.registry&&Z(e.compId,t.registry)}function zt(t,e){if(e.full&&t.absorb.end(),e.full&&t.touched.size>0)for(let[n,o]of[...t.nodes])t.touched.has(n)||(t.clearNodeRefs(n),t.eventRegistry.remove(n),o.remove(),t.nodes.delete(n));t.touched.clear()}function rt(t,e){switch(e.op){case"create":Pt(t,e);break;case"createText":At(t,e);break;case"createAnchor":Dt(t,e);break;case"insert":Ut(t,e);break;case"move":$t(t,e);break;case"remove":Kt(t,e);break;case"setText":Ft(t,e);break;case"setProp":Bt(t,e);break;case"ref":qt(t,e);break;case"unref":_t(t,e);break;case"mount":jt(t,e);break;case"unmount":Wt(t,e);break;case"done":zt(t,e);break;case"close":break}}var te=class{nodes=new Map;touched=new Set;eventRegistry;refRegistry=new ye;absorb=new he;container;doc;registry;devVerify=null;constructor(e,n,o){this.container=e,this.doc=n,this.registry=o??null,this.eventRegistry=new ge(n,e)}dispose(){if(this.eventRegistry.dispose(),this.refRegistry.dispose(),this.registry)for(let e of[...this.registry.keys()].reverse()){let n=this.registry.get(e);if(n){for(let o of[...n.onUnmounts].reverse())try{o()}catch{}this.registry.delete(e)}}}clearNodeRefs(e){this.refRegistry.unmount(e)}remapSubtree(e,n){let o=(r,s)=>{let i=r.get(s);i!==void 0&&(r.delete(s),r.set(n+s.slice(e.length),i))};for(let r of[...this.nodes.keys()])if(r===e||r.startsWith(e+".")){o(this.nodes,r);let s=this.nodes.get(n+r.slice(e.length));s&&s.nodeType===1&&s.setAttribute("data-wf-id",n+r.slice(e.length))}this.refRegistry.remap(e,n);for(let r of[...this.eventRegistry.table.keys()])if(r===e||r.startsWith(e+".")){let s=this.eventRegistry.table.get(r);this.eventRegistry.table.delete(r),this.eventRegistry.table.set(n+r.slice(e.length),s)}if(this.registry){for(let r of[...this.registry.keys()])if(r===e||r.startsWith(e+".")){let s=this.registry.get(r);this.registry.delete(r),this.registry.set(n+r.slice(e.length),s)}}}parentOf(e){if(e.parent==="root")return this.container;let n=this.nodes.get(e.parent);if(n)return n;let o=e.parent.split(".");for(let r=o.length-1;r>0;r--){let s=o.slice(0,r).join(".");if(s==="root")return this.container;let i=this.nodes.get(s);if(i)return i}return null}apply(e){rt(this,e),this.devVerify&&this.devVerify(e,this)}};var ve="__wf_portal";function Re(t){return`${ve}-${t}`}function Gt(t){return typeof t=="function"?t():t}function it(t){return t?typeof t=="function"?t():t:null}function st(t,e){let n={tree:null,applier:null,container:null,chain:Promise.resolve(),version:0,open:!1,phase:"closed",disposed:!1,panel:null,pos:{top:0,left:0}},o=t.getBrowser()?.window,r=t.getBrowser()?.document,s=()=>{if(!r)return null;if(n.container)return n.container;let h=r.getElementById(ve);h||(h=r.createElement("div"),h.id=ve,r.body.appendChild(h));let b=e.key??"popup",T=r.getElementById(Re(b));return T?n.container=T:(n.container=r.createElement("div"),n.container.id=Re(b),h.appendChild(n.container)),n.container},i=0,a=()=>{if(n.disposed||!n.open)return;let h=it(e.anchor);if(!h||!n.panel){i++<10&&queueMicrotask(a);return}if(!o)return;let b=n.panel,T=b.offsetWidth||b.getBoundingClientRect().width,O=b.offsetHeight||b.getBoundingClientRect().height;if((T===0||O===0)&&i++<10){typeof o.requestAnimationFrame=="function"?o.requestAnimationFrame(a):queueMicrotask(a);return}let P=typeof e.placement=="function"?e.placement():e.placement??"bottom";if(e.position){let A=e.position();if(A&&typeof A.x=="number"&&typeof A.y=="number"){if(n.pos={top:A.y,left:A.x,width:A.width},n.applier){let fe=u(n.tree);fe&&d(fe)}return}}let B=_e(h,o,T,O,P,e.gap??8,e.margin??8,e.center??!0);if(!B){i++<10&&queueMicrotask(a);return}if(i=0,n.pos=B,n.applier){let A=u(n.tree);A&&d(A)}},l=h=>{if(n.panel=h,h&&n.open&&e.positioning!=="none"&&(o&&typeof o.requestAnimationFrame=="function"?o.requestAnimationFrame(a):queueMicrotask(a)),h&&e.presence){let b=T=>{n.phase==="exit"&&f()};h.addEventListener("animationend",b),t.onUnmount(()=>h.removeEventListener("animationend",b))}},u=h=>{if(!h)return null;let b=h;e.mask&&(b=Te("div",{class:"wf-popup-mask",style:{position:"fixed",inset:"0",background:"var(--wf-overlay, rgba(0,0,0,0.5))",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"var(--wf-z-modal, 1000)"},onClick:A=>{e.maskClosable!==!1&&A.target===A.currentTarget&&m()}},e.maskCentered?{...b,props:{...b.props??{}}}:Te("div",{class:"wf-popup-mask-inner"},b)));let T=b.props??{},O=e.positioning==="none"||String(T.class??"").includes("mask")?T.class??"":["wf-popup",T.class].filter(Boolean).join(" "),P=e.positioning==="none"?{...T.style??{},position:"fixed"}:{...T.style??{},position:"fixed",top:`${n.pos.top}px`,left:`${n.pos.left}px`,...n.pos.width!==void 0?{width:`${n.pos.width}px`}:{}};return{...b,props:{...T,class:O,style:P,ref:l}}},d=h=>{let b=++n.version,T=n.tree;n.tree=h,n.chain=n.chain.then(async()=>{if(n.disposed||b!==n.version)return;let O=n.applier;if(!O)return;let P=O.registry;if(!P)return;let B=t.getSharedContext()??{},fe=(T?me(T,h,B,P):be(h,B,P)).getReader();for(;;){let{value:Et,done:kt}=await fe.read();if(kt)break;if(n.disposed||b!==n.version)return;O.apply(Et)}}).catch(O=>{console.error("[popup] render error:",O)})},p=()=>{n.disposed||(n.disposed=!0,n.applier&&(n.applier.dispose(),n.applier=null),n.tree=null,n.container&&(n.container.remove(),n.container=null))},f=()=>{n.disposed||(n.open=!1,n.phase="closed",c(),p(),e.onClose?.())},m=()=>{!n.open||n.disposed||(e.presence?(n.phase="exit",n.panel&&o&&!je(n.panel,o)&&f(),n.panel||f()):f())},k={value:""},w={value:null},g={value:!1},c=()=>{g.value&&(r?.body&&(r.body.style.overflow=k.value),k.value="",w.value&&(w.value.focus?.(),w.value=null),g.value=!1)},y=()=>{g.value=!0,e.lockScroll&&r?.body&&(k.value=r.body.style.overflow,r.body.style.overflow="hidden"),e.trapFocus&&o&&(w.value=o.document.activeElement,t.scheduleAfterRender(()=>{let h=n.panel;h&&(h.querySelector?.("input, button, [tabindex], select, textarea")??h).focus?.()}))},x=null;e.trapFocus&&o&&(x=h=>{if(h.key!=="Tab"||!n.open||!n.panel)return;let b=Array.from(n.panel.querySelectorAll?.("input, button, [tabindex], select, textarea")??[]).filter(B=>!B.disabled&&B.offsetParent!==null);if(b.length===0)return;let T=b[0],O=b[b.length-1],P=o?.document.activeElement;h.shiftKey&&(P===T||P===n.panel||!n.panel.contains(P))?(h.preventDefault(),O.focus()):!h.shiftKey&&(P===O||!n.panel.contains(P))&&(h.preventDefault(),T.focus())},o.addEventListener("keydown",x));let v=h=>{if(!n.open||(e.closeOnOutside??!0)===!1)return;let b=h.target,T=it(e.anchor);b&&T?.contains(b)||b&&n.panel?.contains(b)||m()},C=h=>{n.open&&(e.closeOnEscape??!0)&&h.key==="Escape"&&m()};o&&(o.addEventListener("mousedown",v),o.addEventListener("keydown",C)),t.onUnmount(()=>{o&&(o.removeEventListener("mousedown",v),o.removeEventListener("keydown",C),x&&o.removeEventListener("keydown",x)),f()});let F=()=>{if(n.open||n.disposed)return;n.open=!0,n.phase="open";let h=s();if(!h)return;(e.trapFocus||e.lockScroll)&&y();let b=ne();n.applier=new te(h,r,b);let T=Gt(e.content);T!=null?d(u(T)):f()},S={close:m,update(h){if(!(n.disposed||!n.open)){if(h==null){m();return}if(e.position){let b=e.position();b&&typeof b.x=="number"&&typeof b.y=="number"&&(n.pos={top:b.y,left:b.x,width:b.width})}d(u(h))}},refresh(){if(n.disposed||!n.open||!n.tree)return;if(e.position){let b=e.position();b&&typeof b.x=="number"&&typeof b.y=="number"&&(n.pos={top:b.y,left:b.x,width:b.width})}let h=u(n.tree);h&&d(h)},get open(){return n.open}};return F(),S}function at(t,e,n){let o=t.nextHookIndex(),r=t.getHookState(o)??{value:n};t.setHookState(o,r);let s=e.value!==void 0;return{get value(){return e.value??r.value},controlled:e,setValue(i){s?(e.onChange||console.warn("[vdom] useControlled \u53D7\u63A7\u7F3A onChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548"),e.onChange?.(i)):(r.value=i,t.requestRender())}}}function Yt(t,e,n){if(typeof t=="string")return t==="win"||t==="window"?e:n?n.querySelector(t)??e:e;if(t&&typeof t=="object"&&!("nodeType"in t)){let o=t;if(typeof o.getScroller=="function"){let r=o.getScroller();return r||e}return o.root?typeof o.root=="string"?n?n.querySelector(o.root)??e:e:o.root:e}return e}function lt(t,e){let n=t.nextHookIndex(),o=t.getHookState(n)??{y:0,x:0,raf:null,handler:null,retries:0};t.setHookState(n,o);let r=t.getBrowser()?.window,s=t.getBrowser()?.document??null;if(!r)return{y:0,x:0,refresh:()=>{}};let i=()=>{if(typeof e=="function")return e();if(e&&typeof e=="object"&&!("nodeType"in e)){let u=e;return typeof u.getScroller=="function"?u.getScroller()??null:u.root?typeof u.root=="string"?s?s.querySelector(u.root)??r:r:u.root:r}return Yt(e,r,s)},a=u=>{u===r?(o.y=r.scrollY||0,o.x=r.scrollX||0):(o.y=u.scrollTop,o.x=u.scrollLeft)},l=()=>{if(o.handler)return;let u=i();if(!u){o.retries++<10&&t.scheduleAfterRender(l);return}let d=()=>{o.raf||(o.raf=r.requestAnimationFrame(()=>{o.raf=null,a(u),t.requestRender()}))};u.addEventListener("scroll",d,{passive:!0}),o.handler=d,t.onUnmount(()=>{o.raf&&r.cancelAnimationFrame(o.raf),u.removeEventListener("scroll",d),o.handler=null})};return l(),{get y(){return o.y},get x(){return o.x},refresh:()=>{let u=i();u&&a(u)}}}function dt(t,e){let n=t.nextHookIndex(),o=t.getHookState(n)??{isIn:!1,io:null,retries:0,ready:!1};t.setHookState(n,o);let s=t.getBrowser()?.window?.IntersectionObserver,i=e&&typeof e=="object"&&!("nodeType"in e)?e:void 0,a=i?.target??(typeof e=="function"||e&&"nodeType"in e?e:void 0),l=typeof i?.rootMargin=="function"?i.rootMargin():i?.rootMargin,u=typeof i?.threshold=="function"?i.threshold():i?.threshold,d=typeof i?.root=="function"?i.root():i?.root??null,p=f=>{if(!s||!f||o.io)return;let m=new s(k=>{let w=k[0];w&&w.isIntersecting!==o.isIn&&(o.isIn=w.isIntersecting,i?.onChange?.(w,w.isIntersecting),t.requestRender())},{root:d??void 0,rootMargin:l,threshold:u});m.observe(f),o.io=m,o.ready=!0,t.onUnmount(()=>o.io?.disconnect())};if(s&&!o.io){let f=typeof a=="function"?a():a??null;f?p(f):a!==void 0&&o.retries++<10&&t.scheduleAfterRender(()=>p(typeof a=="function"?a():a??null))}return{get isIn(){return o.isIn},get ready(){return o.ready},ref:f=>{f?p(f):o.io?.disconnect()},observe:f=>p(f),disconnect:()=>{o.io?.disconnect(),o.io=null}}}function ut(t,e,n){let o=t.nextHookIndex(),r=t.getHookState(o)??{keyword:"",selectedLabel:"",composing:!1};t.setHookState(o,r);let s=e.value!==void 0;return{controlled:e,get value(){return e.value??r.keyword},setValue(i){s?(e.onChange||console.warn(`[vdom] useControlledInput(${n?.name??""}) \u53D7\u63A7\u7F3A onChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548`),e.onChange?.(i)):(r.keyword=i,t.requestRender())},get keyword(){return r.keyword},setKeyword(i){r.keyword=i,r.composing||this.setValue(i)},get selectedLabel(){return r.selectedLabel},setSelectedLabel(i){r.selectedLabel=i},get isComposing(){return r.composing},onCompositionStart(){r.composing=!0},onCompositionEnd(){r.composing=!1}}}function ft(t,e){let n={draggable:!0,onDragStart:o=>{e.data!==void 0&&o.dataTransfer?.setData("text/plain",JSON.stringify(e.data)),e.onDragStart?.(o,e.data)},onDragEnd:o=>e.onDragEnd?.(o)};return{draggableProps:n,dragProps:n,dropProps:{onDragOver:o=>{o.preventDefault(),e.onDragOver?.(o)},onDragLeave:o=>e.onDragLeave?.(o),onDrop:o=>{o.preventDefault();let r;try{r=o.dataTransfer?.getData("text/plain")?JSON.parse(o.dataTransfer.getData("text/plain")):void 0}catch{r=void 0}e.onDrop?.(o,r)}}}}function Ie(t,e){let n=`media:${e}`,o=t.getInstanceData().get(n);o||(o={matches:!1,mql:null},t.getInstanceData().set(n,o));let r=t.getBrowser()?.window,i=(r?.matchMedia?.bind(r)??(typeof matchMedia=="function"?matchMedia.bind(void 0):void 0))?.(e);if(i&&(o.matches=i.matches,!o.mql)){let a=()=>{o.matches=i.matches,t.requestRender()};i.addEventListener("change",a),o.mql=i,t.onUnmount(()=>i.removeEventListener("change",a))}return()=>o.matches}function pt(t,e){let n=Object.entries(e).sort((o,r)=>o[1]-r[1]);return()=>{let o=n[0]?.[0]??"default";for(let[r,s]of n)Ie(t,`(min-width: ${s}px)`)()&&(o=r);return o}}var Jt=0,Me=()=>`m${Date.now().toString(36)}${(Jt++).toString(36)}`;function ct(t,e){let n=t.nextHookIndex(),o=t.getHookState(n)??{messages:[],status:"idle",subs:new Set,controller:null,seq:0,input:"",error:null,usage:null,step:null};if(t.setHookState(n,o),o.messages.length===0){let a=[];e.system&&a.push({id:Me(),role:"system",content:e.system}),e.initialMessages&&a.push(...e.initialMessages),o.messages=a}let r=()=>{for(let a of[...o.subs])a()},s=e.parseChunk??(a=>{let l=a.trim();if(!l||l.startsWith("event:"))return null;let u=l.startsWith("data:")?l.slice(5).trim():l;if(!u)return null;try{let d=JSON.parse(u);return d.toolCalls?d:d.text!==void 0?{content:String(d.text)}:d.content!==void 0?{content:d.content}:null}catch{return null}}),i={get state(){return o.messages},get messages(){return o.messages},get status(){return o.status},get input(){return o.input??""},setInput(a){o.input=a},get streaming(){return o.status==="streaming"},get error(){return o.error??null},get usage(){return o.usage??null},get step(){return o.step??null},subscribe(a){return o.subs.add(a),()=>{o.subs.delete(a)}},set(){},update(){},notify:r,async send(a=o.input){let l=typeof e.url=="function"?e.url():e.url??"/api/chat",u={id:Me(),role:"user",content:a};o.messages=[...o.messages,u];let d={id:Me(),role:"assistant",content:"",status:"streaming"};o.messages=[...o.messages,d],o.status="streaming",r();let p=new AbortController;o.controller=p;try{let f=await fetch(l,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({messages:o.messages.map(g=>({role:g.role,content:g.content}))}),signal:p.signal});if(!f.ok||!f.body)throw new Error(`[vdom] chat \u8BF7\u6C42\u5931\u8D25 ${f.status}`);let m=f.body.getReader(),k=new TextDecoder,w="";for(;;){let{value:g,done:c}=await m.read();if(c)break;w+=k.decode(g,{stream:!0});let y=w.split(`
2
+ `);w=y.pop()??"";for(let x of y){if(!x.trim())continue;let v=s(x);v&&(v.content&&(d.content+=v.content,r()),v.toolCalls&&(d.toolCalls=[...d.toolCalls??[],...v.toolCalls],r()))}}d.status=void 0,o.status="idle"}catch(f){f.name!=="AbortError"?(d.status="error",o.status="error"):(d.status=void 0,o.status="idle")}finally{o.controller=null,r()}},stop(){o.controller?.abort()},retry(){let a=[...o.messages].reverse().find(l=>l.role==="user");a&&i.send(a.content)},reset(){o.messages=[],o.status="idle",r()},async approve(a,l,u){let d=!1;o.messages=o.messages.map(p=>({...p,toolCalls:p.toolCalls?.map(f=>d||f.approved?f:(d=!0,{...f,approved:a!=="rejected",feedback:l,...a==="modified"&&u?{args:u}:{}}))})),r()}};return i}function Xt(t){let e=t.getBrowser()?.window;return e?.matchMedia?e.matchMedia.bind(e):typeof matchMedia=="function"?matchMedia.bind(void 0):null}function He(t){let e=Xt(t);return!!(e&&e("(prefers-reduced-motion: reduce)").matches)}function mt(t,e,n){let o=t.getBrowser()?.window,r=He(t),s=n?.duration??400;if(s<=0)return{value:e,reset:()=>{}};let i=n?.ease==="linear"?m=>m:m=>1-Math.pow(1-m,3),a,l=e,u=r?e:0,d={get value(){return u},set value(m){u=m},reset:()=>{}},p=()=>{t.requestRender()},f=m=>{if(l=m,r){d.value=m,p();return}if(m===d.value)return;if(!o){d.value=m;return}a&&o.cancelAnimationFrame(a);let k=d.value,w=o.performance.now(),g=c=>{let y=Math.min(1,(c-w)/s);d.value=Math.round(k+(m-k)*i(y)),y<1?a=o.requestAnimationFrame(g):a=void 0,p()};a=o.requestAnimationFrame(g)};return d.reset=m=>{m===l&&a||f(m)},t.onUnmount(()=>{a&&o&&(o.cancelAnimationFrame(a),a=void 0)}),d.reset(e),d}function gt(t,e){let n=t.getBrowser()?.window,o=0,r=0,s=!1,i=0,a=p=>{s&&e.onMove(p,{x:p.clientX-o,y:p.clientY-r})},l=p=>{s&&p.pointerId===i&&(s=!1,n&&(n.removeEventListener("pointermove",a),n.removeEventListener("pointerup",l),n.removeEventListener("pointercancel",u)),e.onEnd?.(p))},u=p=>{!s||p.pointerId!==i||(s=!1,n&&(n.removeEventListener("pointermove",a),n.removeEventListener("pointerup",l),n.removeEventListener("pointercancel",u)),e.onEnd?.(p))},d=p=>{s||(p.preventDefault(),s=!0,i=p.pointerId,o=p.clientX,r=p.clientY,n&&(n.addEventListener("pointermove",a),n.addEventListener("pointerup",l),n.addEventListener("pointercancel",u)),e.onStart?.(p))};return t.onUnmount(()=>{s&&n&&(n.removeEventListener("pointermove",a),n.removeEventListener("pointerup",l),n.removeEventListener("pointercancel",u),s=!1)}),{onPointerDown:d}}function yt(t){let e=t.getBrowser()?.window,n=e?.visualViewport,o=n?.height??e?.innerHeight??0,r=n?.offsetTop??0,s=!1,i={get height(){return o},get offsetTop(){return r},get keyboardOpen(){return s}},a=()=>{let l=e?.visualViewport;o=l?.height??e?.innerHeight??0,r=l?.offsetTop??0,s=o<(e?.innerHeight??0)*.9,t.requestRender()};if(e){let l=e.visualViewport;l?.addEventListener?(l.addEventListener("resize",a),l.addEventListener("scroll",a),t.onUnmount(()=>{l.removeEventListener("resize",a),l.removeEventListener("scroll",a)})):(e.addEventListener("resize",a),t.onUnmount(()=>e.removeEventListener("resize",a)))}return i}function ht(t){return{useExternal(e){let n=t.getInstanceData(),o=n.get(e);if(!o){let r=e.subscribe(()=>t.requestRender());t.onUnmount(r),o={unsub:r},n.set(e,o)}return()=>e.state},signal:e=>Ke(e),hold:e=>t.onUnmount(e),useStableRef:(e,n)=>Fe(t,e,n),useOpen:(e,n)=>Be(t,e,n),onUnmount:e=>t.onUnmount(e),useGlobalKey:(e,n)=>qe(t,e,n),openPopup:e=>st(t,e),usePopupPosition:e=>We(t,e),useControlled:(e,n)=>at(t,e,n),useScrollPosition:e=>lt(t,e),useInView:e=>dt(t,e),useControlledInput:(e,n)=>ut(t,e,n),useDragDrop:e=>ft(t,e),useMedia:e=>Ie(t,e),useBreakpoint:e=>pt(t,e),useChat:e=>ct(t,e),useTween:(e,n)=>mt(t,e,n),useDrag:e=>gt(t,e),useVisualViewport:()=>yt(t),useReducedMotion:()=>He(t)}}function Le(t,e,n){return e<=0?t:new Promise((o,r)=>{let s=setTimeout(()=>{r(new Error(`[vdom] \u5F02\u6B65\u8D85\u65F6\uFF08${e}ms\uFF09: ${n}`))},e);t.then(i=>{clearTimeout(s),o(i)},i=>{clearTimeout(s),r(i)})})}var Oe=0;function vt(){Oe++}function bt(){Oe>0&&Oe--}function Zt(t){return M(t)?{kind:"hole"}:Array.isArray(t)?{kind:"array",items:t}:{kind:"vnode",v:t}}function W(t){return t.kind==="hole"?null:t.kind==="array"?t.items:t.v}function ne(){let t=new Map;return{get:e=>t.get(e),set:(e,n)=>{t.set(e,n)},delete:e=>{t.delete(e)},keys:()=>[...t.keys()],asyncTimeout:15e3}}async function _(t,e,n,o,r,s,i,a,l){let u=t.type,d=i.get(r);if(d&&d.phase==="mounting")throw new Error(`[vdom] \u7EC4\u4EF6\u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A${r} \u6B63\u5728 mount\uFF08\u5F02\u6B65\u5DE5\u5382\u671F\u95F4\u91CD\u590D\u5F15\u7528\u2014\u2014\u5FAA\u73AF\u4F9D\u8D56\uFF1F\uFF09`);if(d&&d.type!==u){if(Z(r,i),d.lastOutput!==void 0&&l){let g=W(d.lastOutput);N(g,j(g,r,r),r,l,i)}d=void 0}let p=!d;if(!d){let g=[],c=new Map,y={n:0},x=new Map,v=Object.create(s);v.onUnmount=S=>{g.push(S)},v.ui=ht({requestRender:()=>{v.render?.()},onUnmount:S=>{g.push(S)},getBrowser:()=>s.browser??null,nextHookIndex:()=>y.n++,getHookState:S=>c.get(S),setHookState:(S,h)=>{c.set(S,h)},getInstanceData:()=>x,scheduleAfterRender:S=>s.afterRender?.(S),getSharedContext:()=>s??null});let C={type:u,renderFn:(()=>null),onUnmounts:g,hookSeq:y,hookStates:c,renderBase:0,phase:"mounting"};i.set(r,C);let F;try{let S=u(t.props,v);F=await Le(Promise.resolve(S),i.asyncTimeout,`mount(${r})`)}catch(S){i.delete(r);for(let h of g.reverse())try{h()}catch(b){console.error("[vdom] mount \u6E05\u7406:",b)}throw S}d={type:u,renderFn:F,onUnmounts:g,hookSeq:y,hookStates:c,renderBase:0,phase:"mounted"},d.renderBase=y.n,i.set(r,d)}d.hookSeq.n=d.renderBase;let f;try{vt();let g;try{g=d.renderFn(t.props)}finally{bt()}f=await Le(Promise.resolve(g),i.asyncTimeout,`renderFn(${r})`)}catch(g){console.error(`[vdom] renderFn \u8D85\u65F6/\u9519\u8BEF\uFF08${r}\uFF09\u2014\u2014\u7EC4\u4EF6\u7EA7 hole \u964D\u7EA7\uFF08\u4E0B\u4E00\u62CD\u91CD\u8BD5\u81EA\u6108\uFF09:`,g),f=null}d.lastOutput=Zt(f);let m=Array.isArray(f),k=typeof f?.type=="function",w=M(f);return await a(f,m||k||w?r:e,m||k||w?0:n,o),p}function Z(t,e){let n=[...e.keys()].filter(o=>o===t||o.startsWith(t+".")).reverse();for(let o of n){let r=e.get(o);if(r){for(let s of r.onUnmounts.reverse())try{s()}catch(i){console.error("[vdom] onUnmount:",i)}e.delete(o)}}}function Ne(t,e,n){let o=new Map,r=i=>{switch(i.op){case"create":{let a=o.get(i.id);a&&a!=="el"&&console.error(`[vdom] \u751F\u6210\u7AEF\u8FDD\u4F8B\uFF1Acreate ${i.id} \u7C7B\u578B\u51B2\u7A81\uFF08${a} \u2192 el\uFF09`),o.set(i.id,"el");break}case"createText":{let a=o.get(i.id);a&&a!=="text"&&console.error(`[vdom] \u751F\u6210\u7AEF\u8FDD\u4F8B\uFF1AcreateText ${i.id} \u7C7B\u578B\u51B2\u7A81\uFF08${a} \u2192 text\uFF09`),o.set(i.id,"text");break}case"createAnchor":{let a=o.get(i.id);a&&a!=="anchor"&&console.error(`[vdom] \u751F\u6210\u7AEF\u8FDD\u4F8B\uFF1AcreateAnchor ${i.id} \u7C7B\u578B\u51B2\u7A81\uFF08${a} \u2192 anchor\uFF09`),o.set(i.id,"anchor");break}case"insert":{let a=o.get(i.parent);a&&a!=="el"&&console.error(`[vdom] \u751F\u6210\u7AEF\u8FDD\u4F8B\uFF1Ainsert ${i.id} \u7684 parent ${i.parent} \u662F${a}\uFF08\u975E\u5BB9\u5668\u2014\u2014id \u7A7A\u95F4\u9519\u4F4D\uFF09`);break}default:break}t(i)},s=async(i,a,l,u)=>{let d=E(a,l);switch(U(i)){case"text":{let p=De(i);r({op:"createText",id:d,value:p}),r({op:"insert",id:d,parent:a,ref:u});return}case"hole":{oe(r,d,a,u);return}case"array":{let p=i;q(p,`\u6570\u7EC4\u5C55\u5F00\uFF08${a}\uFF09`);let f=l,m=u;for(let k of p){await s(k,a,f,m);let w=I(k);m=E(a,f+w-1),f+=w}return}case"fragment":{let p=V(i);q(p,`Fragment \u5C55\u5F00\uFF08${a}\uFF09`);let f=l,m=u;for(let k of p){await s(k,a,f,m);let w=I(k);m=E(a,f+w-1),f+=w}return}case"element":{await $e(i,d,a,u,r,s);return}case"component":{let p=i,f=p.key!==null?H(a,p.key):d;await _(p,a,l,u,f,e,n,s,t)&&t({op:"mount",compId:f});return}case"invalid":{console.warn(`[vdom] \u975E\u6CD5\u5B50\u8282\u70B9\u2014\u2014${ke(i)}`),oe(r,d,a,u,ke(i));return}}};return s}function be(t,e,n){let o=e??{},r=n??ne();return new ReadableStream({async start(s){await Ne(a=>s.enqueue(a),o,r)(t,"root",0,null),s.enqueue({op:"done",full:!0}),s.close()}})}function xe(t,e,n){if(t!==e)throw new Error(`${n??"assertEqual"}: ${JSON.stringify(t)} !== ${JSON.stringify(e)}`)}function xt(t,e){if(!t)throw new Error(e??"assertOk")}function wt(t){return t.nodeType===1?"element":t.nodeType===3?"text":t.nodeType===8?"hole":"comment"}function Fr(t,e,n="\u540C\u6784\uFF08childNodes \u957F\u5EA6 + \u4F4D\u7F6E + \u7C7B\u578B\uFF09"){xe(t.childNodes.length,e.length,`${n}\u2014\u2014\u957F\u5EA6\uFF08\u584C\u7F29/\u591A\u4F59\u5373 bug\uFF09`);for(let o=0;o<e.length;o++)xe(wt(t.childNodes[o]),e[o],`${n}\u2014\u2014\u4F4D\u7F6E ${o}\uFF08\u7B2C i \u9879 \u27F7 childNodes \u7B2C i \u4E2A\uFF09`)}function Br(t,e,n,o=`\u4F4D\u7F6E ${e}`){xt(t.childNodes[e],`${o}\u2014\u2014\u5B58\u5728`),xe(wt(t.childNodes[e]),n,`${o}\u2014\u2014\u7C7B\u578B`)}function qr(t,e,n,o="\u590D\u7528\u9879 DOM \u5F15\u7528\u4FDD\u6301\uFF08\u4E0D\u91CD\u5EFA\uFF09"){let r=t.querySelector(e);xt(r,`${o}\u2014\u2014\u65B0\u9879\u5B58\u5728`),xe(r,n,o)}async function _r(t,e,n,o,r=2,s="\u5F80\u8FD4\u53EF\u9006\uFF08\u72B6\u6001\u4E0D\u6F02\u79FB\uFF09"){for(let i=0;i<r;i++)t(),await o(n),t(),await o(e)}async function Yr(t,e,n){let o=await t(e,n);return typeof o=="function"?o(e):o}async function Jr(t,e,n){let o=await t(e,n);return()=>typeof o=="function"?o(e):o}function we(t,e){if(t==null||typeof t!="object")return;if(Array.isArray(t)){for(let o of t)we(o,e);return}e(t);let n=t?.props?.children;n!=null&&we(n,e)}function Xr(t,e){let n;return we(t,o=>{!n&&e(o)&&(n=o)}),n}function Qr(t,e){let n=[];return we(t,o=>{typeof o?.props?.class=="string"&&o.props.class.split(" ").includes(e)&&n.push(o)}),n}var Ee=new WeakMap;async function en(t,e,n){let o=t.ownerDocument;t.innerHTML="";let r=ne(),s=new te(t,o,r);Ee.set(t,{registry:r,applier:s});let i=be(e,n??{},r);for await(let a of i)s.apply(a)}async function Zr(t,e,n,o,r){let s=Ee.get(t);if(o==null)return t.innerHTML="",null;if(s){let i=me(n,o,r??{},s.registry);for await(let a of i)s.applier.apply(a)}else await en(t,o,r);return o}function ei(t){Ee.get(t)?.applier.dispose(),Ee.delete(t)}function ti(t,e){return Promise.resolve(t)}export{Fr as assertIsomorphic,qr as assertKept,_r as assertRoundTrip,Br as assertSlot,ti as buildToDom,ei as disposeToDom,Qr as findByClass,Xr as findVNode,Jr as mountComponent,en as mountToDom,Zr as patchToDom,Yr as renderVNode,wt as shapeOf,we as walkVNode};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * weifuwu/dev — Node 运行时 loader:让服务端直接跑 .ts / .tsx(含 JSX)
3
+ *
4
+ * 用法:
5
+ * node --import weifuwu/dev server.ts
6
+ *
7
+ * 原理:registerHooks 注册 load 钩子,用 esbuild 实时编译 .ts/.tsx——
8
+ * - loader: tsx(JSX → automatic,jsxImportSource 与客户端一致)
9
+ * - 零构建产物、零配置;与 ctx.ui.js 的前端动态编译同一理念
10
+ * - 两端同一 jsx 运行时 → 服务端/客户端 VNode 结构一致 → hydration 可靠
11
+ */
12
+ export {};
package/dist/dev/index.js CHANGED
@@ -5,9 +5,9 @@ import { fileURLToPath } from "node:url";
5
5
  import { transformSync } from "esbuild";
6
6
  var SRC_ROOT = new URL("..", import.meta.url).pathname;
7
7
  var BARE_ALIASES = {
8
- "weifuwu/ui-dom/jsx-runtime": SRC_ROOT + "ui-dom/jsx-runtime.ts",
9
- "weifuwu/ui-dom/testing": SRC_ROOT + "ui-dom/testing.ts",
10
- "weifuwu/ui-dom": SRC_ROOT + "ui-dom/index.ts",
8
+ "weifuwu/vdom/jsx-runtime": SRC_ROOT + "vdom/jsx-runtime.ts",
9
+ "weifuwu/vdom/testing": SRC_ROOT + "vdom/testing.ts",
10
+ "weifuwu/vdom": SRC_ROOT + "vdom/index.ts",
11
11
  "weifuwu/components": SRC_ROOT + "components/index.ts",
12
12
  "weifuwu": SRC_ROOT + "index.ts"
13
13
  };
@@ -33,7 +33,7 @@ registerHooks({
33
33
  const result = transformSync(code, {
34
34
  loader: url.endsWith(".tsx") ? "tsx" : "ts",
35
35
  jsx: "automatic",
36
- jsxImportSource: "weifuwu/ui-dom",
36
+ jsxImportSource: "weifuwu/vdom",
37
37
  format: "esm",
38
38
  sourcemap: "inline",
39
39
  target: "node22"
@@ -9,7 +9,7 @@
9
9
  * baseUrl: DEEPSEEK_BASE_URL → 'https://api.deepseek.com/v1'
10
10
  * defaultModel: DEEPSEEK_MODEL → 'deepseek-v4-flash'
11
11
  *
12
- * 裁剪声明(诚实裁剪——AGENTS.md CS-05):
12
+ * 裁剪声明(诚实裁剪——CS-05):
13
13
  * ✅ 对话/流式/SSE 协议(§1)/ agent 工具循环 + HITL 审批 / embedding(可选 provider)
14
14
  * ❌ 附件、多模态、函数调用中间态缓存(agent 状态由调用方持有)
15
15
  */
@@ -26,7 +26,7 @@
26
26
  * baseUrl: DEEPSEEK_BASE_URL → 'https://api.deepseek.com/v1'
27
27
  * defaultModel: DEEPSEEK_MODEL → 'deepseek-v4-flash'
28
28
  */
29
- import type { Context, Middleware } from '../types.ts';
29
+ import type { Context, Middleware } from '../../server/types.ts';
30
30
  import { type AiClient, type AiClientOptions } from './client.ts';
31
31
  import type { Ai } from './contracts.ts';
32
32
  export type { Ai } from './contracts.ts';
@@ -43,7 +43,7 @@ export interface AiClientModule extends Middleware<Context, Context & AiInjected
43
43
  /** 内部:单轮 LLM 流式 → emit 事件 + 聚合结果(agent 引擎用——不在契约 Ai) */
44
44
  streamStep: AiClient['streamStep'];
45
45
  }
46
- declare module '../types.ts' {
46
+ declare module '../../server/types.ts' {
47
47
  interface Context {
48
48
  /** 注入模块本身(含 agent / approve),worker 场景直接 a.chat() */
49
49
  ai?: Ai;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 纯类型,零运行时成本。两端同源:
5
5
  * - 后端:从 weifuwu 主包导入(src/index.ts re-export)
6
- * - 前端:从 weifuwu/ui-dom 导入(src/ui-dom/index.ts re-export)
6
+ * - 前端:从 weifuwu/vdom 导入(src/client/vdom/index.ts re-export)
7
7
  *
8
8
  * 修改本文件 = 修改协议,需同步更新 docs/ai-contract.md。
9
9
  */
@@ -66,13 +66,11 @@ export declare class Router<T extends object = Context> {
66
66
  private _route;
67
67
  private _routeImpl;
68
68
  private _mountRouter;
69
- private _collect;
70
- private _collectWs;
71
- private splitPath;
69
+ private _collectAll;
70
+ private _collectAllWs;
72
71
  private _collectRoutes;
73
72
  private _collectWsRoutes;
74
73
  private matchTrie;
75
- private _wildcardMatch;
76
74
  private _resolveMatch;
77
75
  private matchWsTrie;
78
76
  private handle;
@@ -10,7 +10,7 @@
10
10
  * Sql SQL 标签模板(ctx.sql)——makeSql(PgPool) 实现
11
11
  * Redis Redis 命令面(ctx.redis)——RedisPool 实现
12
12
  *
13
- * 变更纪律(AGENTS.md §11 协议层):改契约须 TDD 先行 + 真库验证(CS-04/CS-05)。
13
+ * 变更纪律( 协议层):改契约须 TDD 先行 + 真库验证(CS-04/CS-05)。
14
14
  */
15
15
  import type { RespValue } from './redis/resp.ts';
16
16
  import type { RedisSubscriber } from './redis/subscriber.ts';
@@ -0,0 +1,37 @@
1
+ import type { DBServer } from './server.ts';
2
+ export interface PostgresServerOptions {
3
+ /** 监听端口(0 = 随机)。默认 0。 */
4
+ port?: number;
5
+ /** 认证口令(无密码 = AuthenticationOk 直过)。默认无。 */
6
+ password?: string;
7
+ /** 数据库名(startup 参数校验)。默认接受任意。 */
8
+ database?: string;
9
+ }
10
+ export declare class MemoryPostgresServer implements DBServer {
11
+ port: number;
12
+ url: string;
13
+ private server;
14
+ private engine;
15
+ private opts;
16
+ private closed;
17
+ private queryLog;
18
+ private txSnap;
19
+ /** 命名 prepared statement 缓存(客户端复用——同 sql 不发 Parse) */
20
+ private statements;
21
+ /** portal → statement 绑定(Bind 创建、Execute 按 portal 执行——客户端 portal 通常空名) */
22
+ private portals;
23
+ constructor(options?: PostgresServerOptions);
24
+ start(): Promise<void>;
25
+ close(): Promise<void>;
26
+ /** 测试辅助:执行过的 SQL 列表 */
27
+ get queries(): string[];
28
+ private handleSocket;
29
+ /** startup:196608(协议 3.0)+ 参数 k\0v\0... */
30
+ private handleStartup;
31
+ private handleMessage;
32
+ /** 执行 SQL(MemorySql 引擎——async 异常转 { error }) */
33
+ private executeSql;
34
+ /** 运行查询并编码应答 */
35
+ private runQuery;
36
+ private writeQueryResult;
37
+ }
@@ -0,0 +1,32 @@
1
+ import type { DBServer } from './server.ts';
2
+ export interface RedisServerOptions {
3
+ /** 监听端口(0 = 随机)。默认 0。 */
4
+ port?: number;
5
+ /** 认证口令(REQUIREPASS——AUTH 通过后可用)。默认无。 */
6
+ password?: string;
7
+ /** 故障注入:命令处理器(返回 undefined = 正常执行;返回特殊值 = 模拟故障) */
8
+ onCommand?: (socketId: number, name: string, args: string[]) => void;
9
+ }
10
+ export declare class MemoryRedisServer implements DBServer {
11
+ port: number;
12
+ url: string;
13
+ private server;
14
+ private engine;
15
+ private sockets;
16
+ private subChannels;
17
+ private blpopWaiters;
18
+ private nextId;
19
+ private opts;
20
+ private closed;
21
+ constructor(options?: RedisServerOptions);
22
+ start(): Promise<void>;
23
+ close(): Promise<void>;
24
+ /** 测试辅助:断开发送端 socket(模拟 CLIENT KILL / 网络中断) */
25
+ killSocket(socketId: number): void;
26
+ /** 测试辅助:当前连接数 */
27
+ get connectionCount(): number;
28
+ private handleSocket;
29
+ private dispatch;
30
+ /** PUBLISH 后推送给精确订阅者(服务器主动消息:*3 message channel payload) */
31
+ private pushToSubscribers;
32
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * weifuwu/db — DBServer 接口:内存协议服务器(测试/开发零外部依赖)
3
+ *
4
+ * 进程内起真实线协议服务器(TCP),客户端无需改动直接连接:
5
+ * MemoryRedisServer → RESP 协议 + MemoryRedis 存储引擎(命令面复用)
6
+ * MemoryPostgresServer → PG v3 协议 + MemorySql 存储引擎(SQL 执行复用)
7
+ *
8
+ * 用途:
9
+ * - 引擎协议测试(connection/pool/client/subscriber)——无 docker
10
+ * - 开发/CI 起一个"假服务器"验证客户端协议行为
11
+ * - 故障注入:kill 连接 / 不响应 / 阻塞命令——编程式(服务器钩子)
12
+ *
13
+ * 与 MemoryRedis/MemorySql(客户端内存实现)区别:
14
+ * 客户端内存实现 = 进程内直接调(无网络);DBServer = 真实 TCP 线协议——
15
+ * 验证客户端与"服务器"的网络交互(编解码/重连/订阅推送/认证握手)。
16
+ */
17
+ export interface DBServer {
18
+ /** 监听端口(0 = 随机分配) */
19
+ port: number;
20
+ /** 客户端连接串(redis://127.0.0.1:port 或 postgres://user@127.0.0.1:port/db) */
21
+ url: string;
22
+ /** 启动监听(幂等) */
23
+ start(): Promise<void>;
24
+ /** 关闭服务器与全部连接(幂等) */
25
+ close(): Promise<void>;
26
+ }
27
+ export { MemoryRedisServer } from './redis-server.ts';
28
+ export type { RedisServerOptions } from './redis-server.ts';
29
+ export { MemoryPostgresServer } from './postgres-server.ts';
30
+ export type { PostgresServerOptions } from './postgres-server.ts';
@@ -0,0 +1,21 @@
1
+ export interface TestServers {
2
+ redis: {
3
+ port: number;
4
+ url: string;
5
+ };
6
+ pg: {
7
+ port: number;
8
+ url: string;
9
+ };
10
+ }
11
+ export declare function startTestServers(): Promise<TestServers>;
12
+ /** 仅 Redis(不需要 PG 的测试文件) */
13
+ export declare function startRedisServer(): Promise<{
14
+ port: number;
15
+ url: string;
16
+ }>;
17
+ /** 仅 PG(不需要 Redis 的测试文件) */
18
+ export declare function startPgServer(): Promise<{
19
+ port: number;
20
+ url: string;
21
+ }>;
@@ -4,7 +4,7 @@
4
4
  * 消费方(ctx.email / 业务模块)只依赖 Mailer 接口,
5
5
  * 自研引擎(src/email/index.ts 中间件 + smtp.ts 自研 SMTP 客户端)实现它。
6
6
  *
7
- * 裁剪声明(诚实裁剪——AGENTS.md CS-05):
7
+ * 裁剪声明(诚实裁剪——CS-05):
8
8
  * ✅ 统一 send 接口 / text + html / 多收件人 / 自定义适配器
9
9
  * ❌ 附件(SMTP MIME multipart 未实现)、退信/送达率(服务商职责)、
10
10
  * 批量营销、隐式入队(文档给"发邮件 = ctx.queue.add"示例)