pi-kot 0.1.21 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/pi-kot.mjs +148 -0
- package/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/client/assets/index-CE_Na97I.js +75 -0
- package/client/assets/index-CE_Na97I.js.map +1 -0
- package/client/assets/index-QP95zkpd.css +1 -0
- package/client/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/client/assets/vendor-codemirror-CD3uCqRj.js +48 -0
- package/client/assets/vendor-codemirror-CD3uCqRj.js.map +1 -0
- package/client/assets/vendor-icons-W8thHNMl.js +2 -0
- package/client/assets/vendor-icons-W8thHNMl.js.map +1 -0
- package/client/assets/vendor-katex-4z5K3dyr.js +260 -0
- package/client/assets/vendor-katex-4z5K3dyr.js.map +1 -0
- package/client/assets/vendor-katex-CYlHEDRF.css +1 -0
- package/client/assets/vendor-markdown-BSzxNR_7.js +35 -0
- package/client/assets/vendor-markdown-BSzxNR_7.js.map +1 -0
- package/client/assets/vendor-prism-CQGp13s2.js +4 -0
- package/client/assets/vendor-prism-CQGp13s2.js.map +1 -0
- package/client/assets/vendor-xterm-BrP-ENHg.css +1 -0
- package/client/assets/vendor-xterm-DXwh06H3.js +36 -0
- package/client/assets/vendor-xterm-DXwh06H3.js.map +1 -0
- package/client/index.html +23 -0
- package/package.json +5 -3
- package/server/ask-user-question/envelope.d.ts +11 -0
- package/server/ask-user-question/envelope.d.ts.map +1 -0
- package/server/ask-user-question/envelope.js +41 -0
- package/server/ask-user-question/envelope.js.map +1 -0
- package/server/ask-user-question/plan-mode-question-tool.d.ts +26 -0
- package/server/ask-user-question/plan-mode-question-tool.d.ts.map +1 -0
- package/server/ask-user-question/plan-mode-question-tool.js +273 -0
- package/server/ask-user-question/plan-mode-question-tool.js.map +1 -0
- package/server/ask-user-question/prompt-strings.d.ts +4 -0
- package/server/ask-user-question/prompt-strings.d.ts.map +1 -0
- package/server/ask-user-question/prompt-strings.js +18 -0
- package/server/ask-user-question/prompt-strings.js.map +1 -0
- package/server/ask-user-question/registry.d.ts +39 -0
- package/server/ask-user-question/registry.d.ts.map +1 -0
- package/server/ask-user-question/registry.js +124 -0
- package/server/ask-user-question/registry.js.map +1 -0
- package/server/ask-user-question/tool.d.ts +4 -0
- package/server/ask-user-question/tool.d.ts.map +1 -0
- package/server/ask-user-question/tool.js +68 -0
- package/server/ask-user-question/tool.js.map +1 -0
- package/server/ask-user-question/types.d.ts +50 -0
- package/server/ask-user-question/types.d.ts.map +1 -0
- package/server/ask-user-question/types.js +7 -0
- package/server/ask-user-question/types.js.map +1 -0
- package/server/ask-user-question/validate.d.ts +3 -0
- package/server/ask-user-question/validate.d.ts.map +1 -0
- package/server/ask-user-question/validate.js +67 -0
- package/server/ask-user-question/validate.js.map +1 -0
- package/server/clone-provider.d.ts +55 -0
- package/server/clone-provider.d.ts.map +1 -0
- package/server/clone-provider.js +172 -0
- package/server/clone-provider.js.map +1 -0
- package/server/compaction-cards.d.ts +62 -0
- package/server/compaction-cards.d.ts.map +1 -0
- package/server/compaction-cards.js +180 -0
- package/server/compaction-cards.js.map +1 -0
- package/server/compaction-continuation.d.ts +112 -0
- package/server/compaction-continuation.d.ts.map +1 -0
- package/server/compaction-continuation.js +65 -0
- package/server/compaction-continuation.js.map +1 -0
- package/server/config-store.d.ts +97 -0
- package/server/config-store.d.ts.map +1 -0
- package/server/config-store.js +351 -0
- package/server/config-store.js.map +1 -0
- package/server/config.d.ts +24 -0
- package/server/config.d.ts.map +1 -0
- package/server/config.js +67 -0
- package/server/config.js.map +1 -0
- package/server/event-stream.d.ts +28 -0
- package/server/event-stream.d.ts.map +1 -0
- package/server/event-stream.js +153 -0
- package/server/event-stream.js.map +1 -0
- package/server/extension-manager.d.ts +116 -0
- package/server/extension-manager.d.ts.map +1 -0
- package/server/extension-manager.js +586 -0
- package/server/extension-manager.js.map +1 -0
- package/server/extension-scanner.d.ts +26 -0
- package/server/extension-scanner.d.ts.map +1 -0
- package/server/extension-scanner.js +107 -0
- package/server/extension-scanner.js.map +1 -0
- package/server/extension-ui-bridge.d.ts +35 -0
- package/server/extension-ui-bridge.d.ts.map +1 -0
- package/server/extension-ui-bridge.js +228 -0
- package/server/extension-ui-bridge.js.map +1 -0
- package/server/file-manager.d.ts +79 -0
- package/server/file-manager.d.ts.map +1 -0
- package/server/file-manager.js +535 -0
- package/server/file-manager.js.map +1 -0
- package/server/file-searcher.d.ts +29 -0
- package/server/file-searcher.d.ts.map +1 -0
- package/server/file-searcher.js +318 -0
- package/server/file-searcher.js.map +1 -0
- package/server/git-operations.d.ts +346 -0
- package/server/git-operations.d.ts.map +1 -0
- package/server/git-operations.js +884 -0
- package/server/git-operations.js.map +1 -0
- package/server/hunk-stager.d.ts +56 -0
- package/server/hunk-stager.d.ts.map +1 -0
- package/server/hunk-stager.js +137 -0
- package/server/hunk-stager.js.map +1 -0
- package/server/index.d.ts +21 -0
- package/server/index.d.ts.map +1 -0
- package/server/index.js +262 -0
- package/server/index.js.map +1 -0
- package/server/mcp/config.d.ts +23 -0
- package/server/mcp/config.d.ts.map +1 -0
- package/server/mcp/config.js +139 -0
- package/server/mcp/config.js.map +1 -0
- package/server/mcp/manager.d.ts +40 -0
- package/server/mcp/manager.d.ts.map +1 -0
- package/server/mcp/manager.js +435 -0
- package/server/mcp/manager.js.map +1 -0
- package/server/mcp/stdio-trust.d.ts +5 -0
- package/server/mcp/stdio-trust.d.ts.map +1 -0
- package/server/mcp/stdio-trust.js +78 -0
- package/server/mcp/stdio-trust.js.map +1 -0
- package/server/mcp/tool-bridge.d.ts +33 -0
- package/server/mcp/tool-bridge.d.ts.map +1 -0
- package/server/mcp/tool-bridge.js +138 -0
- package/server/mcp/tool-bridge.js.map +1 -0
- package/server/orchestration/config.d.ts +5 -0
- package/server/orchestration/config.d.ts.map +1 -0
- package/server/orchestration/config.js +35 -0
- package/server/orchestration/config.js.map +1 -0
- package/server/orchestration/event-bridge.d.ts +32 -0
- package/server/orchestration/event-bridge.d.ts.map +1 -0
- package/server/orchestration/event-bridge.js +110 -0
- package/server/orchestration/event-bridge.js.map +1 -0
- package/server/orchestration/inbox.d.ts +9 -0
- package/server/orchestration/inbox.d.ts.map +1 -0
- package/server/orchestration/inbox.js +186 -0
- package/server/orchestration/inbox.js.map +1 -0
- package/server/orchestration/init.d.ts +2 -0
- package/server/orchestration/init.d.ts.map +1 -0
- package/server/orchestration/init.js +22 -0
- package/server/orchestration/init.js.map +1 -0
- package/server/orchestration/store.d.ts +33 -0
- package/server/orchestration/store.d.ts.map +1 -0
- package/server/orchestration/store.js +331 -0
- package/server/orchestration/store.js.map +1 -0
- package/server/orchestration/tools.d.ts +15 -0
- package/server/orchestration/tools.d.ts.map +1 -0
- package/server/orchestration/tools.js +621 -0
- package/server/orchestration/tools.js.map +1 -0
- package/server/orchestration/types.d.ts +68 -0
- package/server/orchestration/types.d.ts.map +1 -0
- package/server/orchestration/types.js +43 -0
- package/server/orchestration/types.js.map +1 -0
- package/server/orchestration/worker-lifecycle.d.ts +15 -0
- package/server/orchestration/worker-lifecycle.d.ts.map +1 -0
- package/server/orchestration/worker-lifecycle.js +45 -0
- package/server/orchestration/worker-lifecycle.js.map +1 -0
- package/server/path-refs.d.ts +5 -0
- package/server/path-refs.d.ts.map +1 -0
- package/server/path-refs.js +249 -0
- package/server/path-refs.js.map +1 -0
- package/server/routes/_schemas.d.ts +16 -0
- package/server/routes/_schemas.d.ts.map +1 -0
- package/server/routes/_schemas.js +12 -0
- package/server/routes/_schemas.js.map +1 -0
- package/server/routes/ask-user-question.d.ts +3 -0
- package/server/routes/ask-user-question.d.ts.map +1 -0
- package/server/routes/ask-user-question.js +105 -0
- package/server/routes/ask-user-question.js.map +1 -0
- package/server/routes/auth.d.ts +8 -0
- package/server/routes/auth.d.ts.map +1 -0
- package/server/routes/auth.js +225 -0
- package/server/routes/auth.js.map +1 -0
- package/server/routes/config.d.ts +3 -0
- package/server/routes/config.d.ts.map +1 -0
- package/server/routes/config.js +602 -0
- package/server/routes/config.js.map +1 -0
- package/server/routes/control.d.ts +3 -0
- package/server/routes/control.d.ts.map +1 -0
- package/server/routes/control.js +365 -0
- package/server/routes/control.js.map +1 -0
- package/server/routes/exec.d.ts +3 -0
- package/server/routes/exec.d.ts.map +1 -0
- package/server/routes/exec.js +426 -0
- package/server/routes/exec.js.map +1 -0
- package/server/routes/extension-commands.d.ts +22 -0
- package/server/routes/extension-commands.d.ts.map +1 -0
- package/server/routes/extension-commands.js +178 -0
- package/server/routes/extension-commands.js.map +1 -0
- package/server/routes/extensions.d.ts +8 -0
- package/server/routes/extensions.d.ts.map +1 -0
- package/server/routes/extensions.js +414 -0
- package/server/routes/extensions.js.map +1 -0
- package/server/routes/files.d.ts +3 -0
- package/server/routes/files.d.ts.map +1 -0
- package/server/routes/files.js +835 -0
- package/server/routes/files.js.map +1 -0
- package/server/routes/git.d.ts +3 -0
- package/server/routes/git.d.ts.map +1 -0
- package/server/routes/git.js +1058 -0
- package/server/routes/git.js.map +1 -0
- package/server/routes/mcp.d.ts +3 -0
- package/server/routes/mcp.d.ts.map +1 -0
- package/server/routes/mcp.js +403 -0
- package/server/routes/mcp.js.map +1 -0
- package/server/routes/orchestration.d.ts +3 -0
- package/server/routes/orchestration.d.ts.map +1 -0
- package/server/routes/orchestration.js +251 -0
- package/server/routes/orchestration.js.map +1 -0
- package/server/routes/projects.d.ts +3 -0
- package/server/routes/projects.d.ts.map +1 -0
- package/server/routes/projects.js +421 -0
- package/server/routes/projects.js.map +1 -0
- package/server/routes/prompt.d.ts +3 -0
- package/server/routes/prompt.d.ts.map +1 -0
- package/server/routes/prompt.js +311 -0
- package/server/routes/prompt.js.map +1 -0
- package/server/routes/session-extensions.d.ts +11 -0
- package/server/routes/session-extensions.d.ts.map +1 -0
- package/server/routes/session-extensions.js +171 -0
- package/server/routes/session-extensions.js.map +1 -0
- package/server/routes/sessions.d.ts +3 -0
- package/server/routes/sessions.d.ts.map +1 -0
- package/server/routes/sessions.js +706 -0
- package/server/routes/sessions.js.map +1 -0
- package/server/routes/skills.d.ts +14 -0
- package/server/routes/skills.d.ts.map +1 -0
- package/server/routes/skills.js +448 -0
- package/server/routes/skills.js.map +1 -0
- package/server/routes/stream.d.ts +3 -0
- package/server/routes/stream.d.ts.map +1 -0
- package/server/routes/stream.js +112 -0
- package/server/routes/stream.js.map +1 -0
- package/server/routes/terminal.d.ts +28 -0
- package/server/routes/terminal.d.ts.map +1 -0
- package/server/routes/terminal.js +211 -0
- package/server/routes/terminal.js.map +1 -0
- package/server/routes/tunnel.d.ts +13 -0
- package/server/routes/tunnel.d.ts.map +1 -0
- package/server/routes/tunnel.js +231 -0
- package/server/routes/tunnel.js.map +1 -0
- package/server/session-alerts.d.ts +28 -0
- package/server/session-alerts.d.ts.map +1 -0
- package/server/session-alerts.js +38 -0
- package/server/session-alerts.js.map +1 -0
- package/server/session-store.d.ts +164 -0
- package/server/session-store.d.ts.map +1 -0
- package/server/session-store.js +754 -0
- package/server/session-store.js.map +1 -0
- package/server/skill-policy.d.ts +47 -0
- package/server/skill-policy.d.ts.map +1 -0
- package/server/skill-policy.js +178 -0
- package/server/skill-policy.js.map +1 -0
- package/server/terminal-provider.d.ts +54 -0
- package/server/terminal-provider.d.ts.map +1 -0
- package/server/terminal-provider.js +220 -0
- package/server/terminal-provider.js.map +1 -0
- package/server/tool-policy.d.ts +39 -0
- package/server/tool-policy.d.ts.map +1 -0
- package/server/tool-policy.js +121 -0
- package/server/tool-policy.js.map +1 -0
- package/server/tunnel/executable-search.d.ts +43 -0
- package/server/tunnel/executable-search.d.ts.map +1 -0
- package/server/tunnel/executable-search.js +148 -0
- package/server/tunnel/executable-search.js.map +1 -0
- package/server/tunnel/install-help.d.ts +19 -0
- package/server/tunnel/install-help.d.ts.map +1 -0
- package/server/tunnel/install-help.js +47 -0
- package/server/tunnel/install-help.js.map +1 -0
- package/server/tunnel/providers/ngrok.d.ts +31 -0
- package/server/tunnel/providers/ngrok.d.ts.map +1 -0
- package/server/tunnel/providers/ngrok.js +461 -0
- package/server/tunnel/providers/ngrok.js.map +1 -0
- package/server/tunnel/registry.d.ts +13 -0
- package/server/tunnel/registry.d.ts.map +1 -0
- package/server/tunnel/registry.js +56 -0
- package/server/tunnel/registry.js.map +1 -0
- package/server/tunnel/service.d.ts +13 -0
- package/server/tunnel/service.d.ts.map +1 -0
- package/server/tunnel/service.js +156 -0
- package/server/tunnel/service.js.map +1 -0
- package/server/tunnel/types.d.ts +163 -0
- package/server/tunnel/types.d.ts.map +1 -0
- package/server/tunnel/types.js +214 -0
- package/server/tunnel/types.js.map +1 -0
- package/server/ui-settings-store.d.ts +25 -0
- package/server/ui-settings-store.d.ts.map +1 -0
- package/server/ui-settings-store.js +91 -0
- package/server/ui-settings-store.js.map +1 -0
- package/server/workspace-store.d.ts +25 -0
- package/server/workspace-store.d.ts.map +1 -0
- package/server/workspace-store.js +157 -0
- package/server/workspace-store.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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AAa,IAArB,CACE,IAAK,GACL,IAAK,IACL,IAAK,IACH,GACE,EACA,EACA,EACA,EACA,CACF,EACA,GAA0B,EAAG,CAAY,EACzC,MACF,IAAK,IACH,MACF,IAAK,IACH,IAAI,EAAW,EAAa,UACnB,EAAa,gBAAtB,MAaM,EAAS,aAAe,EAC1B,GACE,EACA,EACA,EACA,EACA,CACF,GAnBA,EAAS,YAAc,EACrB,GACE,EACA,EACA,EACA,EACA,CACF,EACA,GACE,EACA,CACF,EASN,GACE,EAAQ,MACR,GACE,EAAa,UACb,CACF,EACF,MACF,IAAK,IACH,GACE,EACA,EACA,EACA,EACA,CACF,EACA,GACE,EAAQ,MACR,GAA8B,EAAa,UAAW,CAAY,EACpE,MACF,QACE,GACE,EACA,EACA,EACA,EACA,CACF,CACJ,CACA,EAAc,EAAY,OAC5B,CACF,CACA,SAAS,GACP,EACA,EACA,CACA,GAAI,EAAY,aAAe,MAC7B,IAAK,EAAc,EAAY,MAAgB,IAAT,MAAwB,CAC5D,IAAI,EAAe,EACjB,EAAe,EACf,EAAQ,EAAa,MACvB,OAAQ,EAAa,IAArB,CACE,IAAK,IACH,GAAwC,EAAc,CAAY,EAClE,EAAQ,MACN,GACE,EAAa,UACb,CACF,EACF,MACF,IAAK,IACH,GAAwC,EAAc,CAAY,EAClE,EAAQ,MACN,GAA8B,EAAa,UAAW,CAAY,EACpE,MACF,QACE,GAAwC,EAAc,CAAY,CACtE,CACA,EAAc,EAAY,OAC5B,CACJ,CACA,IAAI,GAAsB,KAC1B,SAAS,GACP,EACA,EACA,EACA,CACA,GAAI,EAAY,aAAe,GAC7B,IAAK,EAAc,EAAY,MAAgB,IAAT,MACpC,GACE,EACA,EACA,CACF,EACG,EAAc,EAAY,OACnC,CACA,SAAS,GACP,EACA,EACA,EACA,CACA,OAAQ,EAAM,IAAd,CACE,IAAK,IACH,GACE,EACA,EACA,CACF,EACA,EAAM,MAAQ,IACH,EAAM,gBAAf,MACA,GACE,EACA,GACA,EAAM,cACN,EAAM,aACR,EACF,MACF,IAAK,GACH,GACE,EACA,EACA,CACF,EACA,MACF,I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,GACH,IAAK,EAAQ,WAAa,EAAO,MACnC,IAAK,GACH,GACE,EACA,EACA,GACA,CAAC,EACH,EACA,MAAM,EACR,IAAK,GACH,GAAsC,KACtC,MACF,IAAK,GACL,IAAK,GACH,MACF,QACE,MAAM,MAAM,EAAuB,GAAG,CAAC,CAC3C,CACA,IACG,EAAQ,YAAc,IACrB,EAAa,GAA+B,IAAM,EAAI,EACxD,GAAK,GACL,CAOA,GANA,GACE,EACA,EACA,GACA,CAAC,EACH,EACU,GAAa,EAAiB,EAAG,CAAC,CAAC,IAAzC,EAA4C,MAAM,EACtD,GAAsB,EACtB,EAAgB,cAAgB,GAC9B,GAAoB,KAClB,KACA,EACA,EACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,EACA,YACA,GACA,CACF,EACA,CACF,EACA,MAAM,CACR,CACA,GACE,EACA,EACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,EACA,KACA,GACA,CACF,CACF,CACF,CACA,KACF,OAAS,GACT,GAAsB,CAAa,CACrC,CACA,SAAS,GACP,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAGA,GAFA,EAAK,cAAgB,GACrB,EAAwB,EAAa,aAEnC,EAAwB,OACV,EAAwB,WAAtC,SACA,CACA,EAAwB,CACtB,YAAa,KACb,MAAO,EACP,SAAU,EACV,SAAU,EACV,gBAAiB,CAAC,EAClB,iBAAkB,CAAC,EACnB,yBAA0B,CAAC,EAC3B,UAAW,EACb,EACA,GACE,EACA,EACA,CACF,EACA,IAAI,GACD,EAAQ,YAAc,EACnB,GAA+B,EAAI,GAClC,EAAQ,WAAa,EACpB,GAAiC,EAAI,EACrC,EAKR,GAJA,EAAgB,GACd,EACA,CACF,EACa,IAAT,KAAwB,CAC1B,GAAsB,EACtB,EAAK,oBAAsB,EACzB,GAAW,KACT,KACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,KACA,EACA,CACF,CACF,EACA,GAAkB,EAAM,EAAO,EAAa,CAAC,CAAwB,EACr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,WACL,IAAK,WACL,IAAK,UACL,IAAK,QACL,IAAK,WACL,IAAK,0BACL,IAAK,wBACL,IAAK,iBACL,IAAK,SACL,IAAK,OACL,IAAK,WACL,IAAK,aACL,IAAK,OACL,IAAK,cACL,IAAK,WACL,IAAK,WACL,IAAK,WACL,IAAK,SACL,IAAK,WACL,IAAK,YACH,GAAwB,OAAO,GAAtB,YAA4C,OAAO,GAApB,SACpC,EAAW,aAAa,EAAK,EAAE,EAC/B,EAAW,gBAAgB,CAAG,EAClC,MACF,IAAK,UACL,IAAK,WACH,CAAC,IAAM,EACH,EAAW,aAAa,EAAK,EAAE,EAC/B,CAAC,IAAM,GACG,GAAR,MACe,OAAO,GAAtB,YACa,OAAO,GAApB,SACA,EAAW,aAAa,EAAK,CAAK,EAClC,EAAW,gBAAgB,CAAG,EACpC,MACF,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACK,GAAR,MACe,OAAO,GAAtB,YACa,OAAO,GAApB,UACA,CAAC,MAAM,CAAK,GACZ,GAAK,EACD,EAAW,aAAa,EAAK,CAAK,EAClC,EAAW,gBAAgB,CAAG,EAClC,MACF,IAAK,UACL,IAAK,QACK,GAAR,MACe,OAAO,GAAtB,YACa,OAAO,GAApB,UACA,MAAM,CAAK,EACP,EAAW,gBAAgB,CAAG,EAC9B,EAAW,aAAa,EAAK,CAAK,EACtC,MACF,IAAK,UACH,EAA0B,eAAgB,CAAU,EACpD,EAA0B,SAAU,CAAU,EAC9C,GAAqB,EAAY,UAAW,CAAK,EACjD,MACF,IAAK,eACH,GACE,EACA,+BACA,gBACA,CACF,EACA,MACF,IAAK,eACH,GACE,EACA,+BACA,gBACA,CACF,EACA,MACF,IAAK,YACH,GACE,EACA,+BACA,aACA,CACF,EACA,MACF,IAAK,YACH,GACE,EACA,+BACA,aACA,CACF,EACA,MACF,IAAK,aACH,GACE,EACA,+BACA,cACA,CACF,EACA,MACF,IAAK,YACH,GACE,EACA,+BACA,aACA,CACF,EACA,MACF,IAAK,UACH,GACE,EACA,uCACA,WACA,CACF,EACA,MACF,IAAK,UACH,GACE,EACA,uCACA,W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","names":[],"ignoreList":[0,1,2,3,4,5,6,7,14,15,16,17,18,19,20,21,22,23],"sources":["../../../../node_modules/scheduler/cjs/scheduler.production.js","../../../../node_modules/scheduler/index.js","../../../../node_modules/react-dom/cjs/react-dom.production.js","../../../../node_modules/react-dom/index.js","../../../../node_modules/react-dom/cjs/react-dom-client.production.js","../../../../node_modules/react-dom/client.js","../../../../node_modules/zustand/esm/vanilla.mjs","../../../../node_modules/zustand/esm/react.mjs","../../src/lib/api-client.ts","../../src/lib/sse-client.ts","../../src/stores/ask-user-question-store.ts","../../src/stores/extension-ui-store.ts","../../src/stores/session-store.ts","../../src/hooks/use-extensions.ts","../../../../node_modules/html-to-image/es/util.js","../../../../node_modules/html-to-image/es/clone-pseudos.js","../../../../node_modules/html-to-image/es/mimes.js","../../../../node_modules/html-to-image/es/dataurl.js","../../../../node_modules/html-to-image/es/clone-node.js","../../../../node_modules/html-to-image/es/embed-resources.js","../../../../node_modules/html-to-image/es/embed-images.js","../../../../node_modules/html-to-image/es/apply-style.js","../../../../node_modules/html-to-image/es/embed-webfonts.js","../../../../node_modules/html-to-image/es/index.js","../../src/components/ChatMarkdown.tsx","../../src/components/CompactionCard.tsx","../../src/stores/preferences-store.ts","../../src/lib/tool-call-pairing.ts","../../src/components/ChatView.tsx","../../src/components/ModelDropdown.tsx","../../src/components/ChatInput.tsx","../../src/components/AskUserQuestionPanel.tsx","../../src/components/LoadingSkeleton.tsx","../../src/components/OrchestrationPanel.tsx","../../src/components/ContextBar.tsx","../../src/stores/mcp-store.ts","../../src/components/SlidePanel.tsx","../../src/components/MCPPanel.tsx","../../src/components/SessionTreePanel.tsx","../../src/lib/theme.ts","../../src/components/settings/AppearanceTab.tsx","../../src/components/AddProviderDialog.tsx","../../src/components/Modal.tsx","../../src/components/settings/shared.tsx","../../src/components/settings/ProvidersTab.tsx","../../src/components/settings/AgentTab.tsx","../../src/components/settings/GeneralTab.tsx","../../src/components/ExtensionsTab.tsx","../../src/components/SkillEditor.tsx","../../src/components/SkillsTab.tsx","../../src/components/TunnelTab.tsx","../../src/components/SettingsPanel.tsx","../../src/components/CodeMirrorEditor.tsx","../../src/components/RenderedView.tsx","../../src/components/GitPanel.tsx","../../src/components/FileExplorer.tsx","../../src/stores/terminal-store.ts","../../src/components/TerminalPanel.tsx","../../src/components/ExtensionUIInteractionModal.tsx","../../src/components/NotificationToast.tsx","../../src/stores/favorite-store.ts","../../src/components/SessionList.tsx","../../src/components/AddProjectDialog.tsx","../../src/components/ErrorBoundary.tsx","../../src/hooks/useTouchSwipe.ts","../../src/stores/layout-store.ts","../../src/App.tsx","../../src/main.tsx"],"sourcesContent":["/**\n * @license React\n * scheduler.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nfunction push(heap, node) {\n var index = heap.length;\n heap.push(node);\n a: for (; 0 < index; ) {\n var parentIndex = (index - 1) >>> 1,\n parent = heap[parentIndex];\n if (0 < compare(parent, node))\n (heap[parentIndex] = node), (heap[index] = parent), (index = parentIndex);\n else break a;\n }\n}\nfunction peek(heap) {\n return 0 === heap.length ? null : heap[0];\n}\nfunction pop(heap) {\n if (0 === heap.length) return null;\n var first = heap[0],\n last = heap.pop();\n if (last !== first) {\n heap[0] = last;\n a: for (\n var index = 0, length = heap.length, halfLength = length >>> 1;\n index < halfLength;\n\n ) {\n var leftIndex = 2 * (index + 1) - 1,\n left = heap[leftIndex],\n rightIndex = leftIndex + 1,\n right = heap[rightIndex];\n if (0 > compare(left, last))\n rightIndex < length && 0 > compare(right, left)\n ? ((heap[index] = right),\n (heap[rightIndex] = last),\n (index = rightIndex))\n : ((heap[index] = left),\n (heap[leftIndex] = last),\n (index = leftIndex));\n else if (rightIndex < length && 0 > compare(right, last))\n (heap[index] = right), (heap[rightIndex] = last), (index = rightIndex);\n else break a;\n }\n }\n return first;\n}\nfunction compare(a, b) {\n var diff = a.sortIndex - b.sortIndex;\n return 0 !== diff ? diff : a.id - b.id;\n}\nexports.unstable_now = void 0;\nif (\"object\" === typeof performance && \"function\" === typeof performance.now) {\n var localPerformance = performance;\n exports.unstable_now = function () {\n return localPerformance.now();\n };\n} else {\n var localDate = Date,\n initialTime = localDate.now();\n exports.unstable_now = function () {\n return localDate.now() - initialTime;\n };\n}\nvar taskQueue = [],\n timerQueue = [],\n taskIdCounter = 1,\n currentTask = null,\n currentPriorityLevel = 3,\n isPerformingWork = !1,\n isHostCallbackScheduled = !1,\n isHostTimeoutScheduled = !1,\n needsPaint = !1,\n localSetTimeout = \"function\" === typeof setTimeout ? setTimeout : null,\n localClearTimeout = \"function\" === typeof clearTimeout ? clearTimeout : null,\n localSetImmediate = \"undefined\" !== typeof setImmediate ? setImmediate : null;\nfunction advanceTimers(currentTime) {\n for (var timer = peek(timerQueue); null !== timer; ) {\n if (null === timer.callback) pop(timerQueue);\n else if (timer.startTime <= currentTime)\n pop(timerQueue),\n (timer.sortIndex = timer.expirationTime),\n push(taskQueue, timer);\n else break;\n timer = peek(timerQueue);\n }\n}\nfunction handleTimeout(currentTime) {\n isHostTimeoutScheduled = !1;\n advanceTimers(currentTime);\n if (!isHostCallbackScheduled)\n if (null !== peek(taskQueue))\n (isHostCallbackScheduled = !0),\n isMessageLoopRunning ||\n ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline());\n else {\n var firstTimer = peek(timerQueue);\n null !== firstTimer &&\n requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n }\n}\nvar isMessageLoopRunning = !1,\n taskTimeoutID = -1,\n frameInterval = 5,\n startTime = -1;\nfunction shouldYieldToHost() {\n return needsPaint\n ? !0\n : exports.unstable_now() - startTime < frameInterval\n ? !1\n : !0;\n}\nfunction performWorkUntilDeadline() {\n needsPaint = !1;\n if (isMessageLoopRunning) {\n var currentTime = exports.unstable_now();\n startTime = currentTime;\n var hasMoreWork = !0;\n try {\n a: {\n isHostCallbackScheduled = !1;\n isHostTimeoutScheduled &&\n ((isHostTimeoutScheduled = !1),\n localClearTimeout(taskTimeoutID),\n (taskTimeoutID = -1));\n isPerformingWork = !0;\n var previousPriorityLevel = currentPriorityLevel;\n try {\n b: {\n advanceTimers(currentTime);\n for (\n currentTask = peek(taskQueue);\n null !== currentTask &&\n !(\n currentTask.expirationTime > currentTime && shouldYieldToHost()\n );\n\n ) {\n var callback = currentTask.callback;\n if (\"function\" === typeof callback) {\n currentTask.callback = null;\n currentPriorityLevel = currentTask.priorityLevel;\n var continuationCallback = callback(\n currentTask.expirationTime <= currentTime\n );\n currentTime = exports.unstable_now();\n if (\"function\" === typeof continuationCallback) {\n currentTask.callback = continuationCallback;\n advanceTimers(currentTime);\n hasMoreWork = !0;\n break b;\n }\n currentTask === peek(taskQueue) && pop(taskQueue);\n advanceTimers(currentTime);\n } else pop(taskQueue);\n currentTask = peek(taskQueue);\n }\n if (null !== currentTask) hasMoreWork = !0;\n else {\n var firstTimer = peek(timerQueue);\n null !== firstTimer &&\n requestHostTimeout(\n handleTimeout,\n firstTimer.startTime - currentTime\n );\n hasMoreWork = !1;\n }\n }\n break a;\n } finally {\n (currentTask = null),\n (currentPriorityLevel = previousPriorityLevel),\n (isPerformingWork = !1);\n }\n hasMoreWork = void 0;\n }\n } finally {\n hasMoreWork\n ? schedulePerformWorkUntilDeadline()\n : (isMessageLoopRunning = !1);\n }\n }\n}\nvar schedulePerformWorkUntilDeadline;\nif (\"function\" === typeof localSetImmediate)\n schedulePerformWorkUntilDeadline = function () {\n localSetImmediate(performWorkUntilDeadline);\n };\nelse if (\"undefined\" !== typeof MessageChannel) {\n var channel = new MessageChannel(),\n port = channel.port2;\n channel.port1.onmessage = performWorkUntilDeadline;\n schedulePerformWorkUntilDeadline = function () {\n port.postMessage(null);\n };\n} else\n schedulePerformWorkUntilDeadline = function () {\n localSetTimeout(performWorkUntilDeadline, 0);\n };\nfunction requestHostTimeout(callback, ms) {\n taskTimeoutID = localSetTimeout(function () {\n callback(exports.unstable_now());\n }, ms);\n}\nexports.unstable_IdlePriority = 5;\nexports.unstable_ImmediatePriority = 1;\nexports.unstable_LowPriority = 4;\nexports.unstable_NormalPriority = 3;\nexports.unstable_Profiling = null;\nexports.unstable_UserBlockingPriority = 2;\nexports.unstable_cancelCallback = function (task) {\n task.callback = null;\n};\nexports.unstable_forceFrameRate = function (fps) {\n 0 > fps || 125 < fps\n ? console.error(\n \"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"\n )\n : (frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5);\n};\nexports.unstable_getCurrentPriorityLevel = function () {\n return currentPriorityLevel;\n};\nexports.unstable_next = function (eventHandler) {\n switch (currentPriorityLevel) {\n case 1:\n case 2:\n case 3:\n var priorityLevel = 3;\n break;\n default:\n priorityLevel = currentPriorityLevel;\n }\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = priorityLevel;\n try {\n return eventHandler();\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n};\nexports.unstable_requestPaint = function () {\n needsPaint = !0;\n};\nexports.unstable_runWithPriority = function (priorityLevel, eventHandler) {\n switch (priorityLevel) {\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n break;\n default:\n priorityLevel = 3;\n }\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = priorityLevel;\n try {\n return eventHandler();\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n};\nexports.unstable_scheduleCallback = function (\n priorityLevel,\n callback,\n options\n) {\n var currentTime = exports.unstable_now();\n \"object\" === typeof options && null !== options\n ? ((options = options.delay),\n (options =\n \"number\" === typeof options && 0 < options\n ? currentTime + options\n : currentTime))\n : (options = currentTime);\n switch (priorityLevel) {\n case 1:\n var timeout = -1;\n break;\n case 2:\n timeout = 250;\n break;\n case 5:\n timeout = 1073741823;\n break;\n case 4:\n timeout = 1e4;\n break;\n default:\n timeout = 5e3;\n }\n timeout = options + timeout;\n priorityLevel = {\n id: taskIdCounter++,\n callback: callback,\n priorityLevel: priorityLevel,\n startTime: options,\n expirationTime: timeout,\n sortIndex: -1\n };\n options > currentTime\n ? ((priorityLevel.sortIndex = options),\n push(timerQueue, priorityLevel),\n null === peek(taskQueue) &&\n priorityLevel === peek(timerQueue) &&\n (isHostTimeoutScheduled\n ? (localClearTimeout(taskTimeoutID), (taskTimeoutID = -1))\n : (isHostTimeoutScheduled = !0),\n requestHostTimeout(handleTimeout, options - currentTime)))\n : ((priorityLevel.sortIndex = timeout),\n push(taskQueue, priorityLevel),\n isHostCallbackScheduled ||\n isPerformingWork ||\n ((isHostCallbackScheduled = !0),\n isMessageLoopRunning ||\n ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline())));\n return priorityLevel;\n};\nexports.unstable_shouldYield = shouldYieldToHost;\nexports.unstable_wrapCallback = function (callback) {\n var parentPriorityLevel = currentPriorityLevel;\n return function () {\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = parentPriorityLevel;\n try {\n return callback.apply(this, arguments);\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n };\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction noop() {}\nvar Internals = {\n d: {\n f: noop,\n r: function () {\n throw Error(formatProdErrorMessage(522));\n },\n D: noop,\n C: noop,\n L: noop,\n m: noop,\n X: noop,\n S: noop,\n M: noop\n },\n p: 0,\n findDOMNode: null\n },\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\");\nfunction createPortal$1(children, containerInfo, implementation) {\n var key =\n 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n return {\n $$typeof: REACT_PORTAL_TYPE,\n key: null == key ? null : \"\" + key,\n children: children,\n containerInfo: containerInfo,\n implementation: implementation\n };\n}\nvar ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;\nfunction getCrossOriginStringAs(as, input) {\n if (\"font\" === as) return \"\";\n if (\"string\" === typeof input)\n return \"use-credentials\" === input ? input : \"\";\n}\nexports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n Internals;\nexports.createPortal = function (children, container) {\n var key =\n 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n if (\n !container ||\n (1 !== container.nodeType &&\n 9 !== container.nodeType &&\n 11 !== container.nodeType)\n )\n throw Error(formatProdErrorMessage(299));\n return createPortal$1(children, container, null, key);\n};\nexports.flushSync = function (fn) {\n var previousTransition = ReactSharedInternals.T,\n previousUpdatePriority = Internals.p;\n try {\n if (((ReactSharedInternals.T = null), (Internals.p = 2), fn)) return fn();\n } finally {\n (ReactSharedInternals.T = previousTransition),\n (Internals.p = previousUpdatePriority),\n Internals.d.f();\n }\n};\nexports.preconnect = function (href, options) {\n \"string\" === typeof href &&\n (options\n ? ((options = options.crossOrigin),\n (options =\n \"string\" === typeof options\n ? \"use-credentials\" === options\n ? options\n : \"\"\n : void 0))\n : (options = null),\n Internals.d.C(href, options));\n};\nexports.prefetchDNS = function (href) {\n \"string\" === typeof href && Internals.d.D(href);\n};\nexports.preinit = function (href, options) {\n if (\"string\" === typeof href && options && \"string\" === typeof options.as) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin),\n integrity =\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n fetchPriority =\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0;\n \"style\" === as\n ? Internals.d.S(\n href,\n \"string\" === typeof options.precedence ? options.precedence : void 0,\n {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority\n }\n )\n : \"script\" === as &&\n Internals.d.X(href, {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n};\nexports.preinitModule = function (href, options) {\n if (\"string\" === typeof href)\n if (\"object\" === typeof options && null !== options) {\n if (null == options.as || \"script\" === options.as) {\n var crossOrigin = getCrossOriginStringAs(\n options.as,\n options.crossOrigin\n );\n Internals.d.M(href, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n } else null == options && Internals.d.M(href);\n};\nexports.preload = function (href, options) {\n if (\n \"string\" === typeof href &&\n \"object\" === typeof options &&\n null !== options &&\n \"string\" === typeof options.as\n ) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin);\n Internals.d.L(href, as, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0,\n type: \"string\" === typeof options.type ? options.type : void 0,\n fetchPriority:\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0,\n referrerPolicy:\n \"string\" === typeof options.referrerPolicy\n ? options.referrerPolicy\n : void 0,\n imageSrcSet:\n \"string\" === typeof options.imageSrcSet ? options.imageSrcSet : void 0,\n imageSizes:\n \"string\" === typeof options.imageSizes ? options.imageSizes : void 0,\n media: \"string\" === typeof options.media ? options.media : void 0\n });\n }\n};\nexports.preloadModule = function (href, options) {\n if (\"string\" === typeof href)\n if (options) {\n var crossOrigin = getCrossOriginStringAs(options.as, options.crossOrigin);\n Internals.d.m(href, {\n as:\n \"string\" === typeof options.as && \"script\" !== options.as\n ? options.as\n : void 0,\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0\n });\n } else Internals.d.m(href);\n};\nexports.requestFormReset = function (form) {\n Internals.d.r(form);\n};\nexports.unstable_batchedUpdates = function (fn, a) {\n return fn(a);\n};\nexports.useFormState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useFormState(action, initialState, permalink);\n};\nexports.useFormStatus = function () {\n return ReactSharedInternals.H.useHostTransitionStatus();\n};\nexports.version = \"19.2.7\";\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n","/**\n * @license React\n * react-dom-client.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n\"use strict\";\nvar Scheduler = require(\"scheduler\"),\n React = require(\"react\"),\n ReactDOM = require(\"react-dom\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction isValidContainer(node) {\n return !(\n !node ||\n (1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType)\n );\n}\nfunction getNearestMountedFiber(fiber) {\n var node = fiber,\n nearestMounted = fiber;\n if (fiber.alternate) for (; node.return; ) node = node.return;\n else {\n fiber = node;\n do\n (node = fiber),\n 0 !== (node.flags & 4098) && (nearestMounted = node.return),\n (fiber = node.return);\n while (fiber);\n }\n return 3 === node.tag ? nearestMounted : null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n if (13 === fiber.tag) {\n var suspenseState = fiber.memoizedState;\n null === suspenseState &&\n ((fiber = fiber.alternate),\n null !== fiber && (suspenseState = fiber.memoizedState));\n if (null !== suspenseState) return suspenseState.dehydrated;\n }\n return null;\n}\nfunction getActivityInstanceFromFiber(fiber) {\n if (31 === fiber.tag) {\n var activityState = fiber.memoizedState;\n null === activityState &&\n ((fiber = fiber.alternate),\n null !== fiber && (activityState = fiber.memoizedState));\n if (null !== activityState) return activityState.dehydrated;\n }\n return null;\n}\nfunction assertIsMounted(fiber) {\n if (getNearestMountedFiber(fiber) !== fiber)\n throw Error(formatProdErrorMessage(188));\n}\nfunction findCurrentFiberUsingSlowPath(fiber) {\n var alternate = fiber.alternate;\n if (!alternate) {\n alternate = getNearestMountedFiber(fiber);\n if (null === alternate) throw Error(formatProdErrorMessage(188));\n return alternate !== fiber ? null : fiber;\n }\n for (var a = fiber, b = alternate; ; ) {\n var parentA = a.return;\n if (null === parentA) break;\n var parentB = parentA.alternate;\n if (null === parentB) {\n b = parentA.return;\n if (null !== b) {\n a = b;\n continue;\n }\n break;\n }\n if (parentA.child === parentB.child) {\n for (parentB = parentA.child; parentB; ) {\n if (parentB === a) return assertIsMounted(parentA), fiber;\n if (parentB === b) return assertIsMounted(parentA), alternate;\n parentB = parentB.sibling;\n }\n throw Error(formatProdErrorMessage(188));\n }\n if (a.return !== b.return) (a = parentA), (b = parentB);\n else {\n for (var didFindChild = !1, child$0 = parentA.child; child$0; ) {\n if (child$0 === a) {\n didFindChild = !0;\n a = parentA;\n b = parentB;\n break;\n }\n if (child$0 === b) {\n didFindChild = !0;\n b = parentA;\n a = parentB;\n break;\n }\n child$0 = child$0.sibling;\n }\n if (!didFindChild) {\n for (child$0 = parentB.child; child$0; ) {\n if (child$0 === a) {\n didFindChild = !0;\n a = parentB;\n b = parentA;\n break;\n }\n if (child$0 === b) {\n didFindChild = !0;\n b = parentB;\n a = parentA;\n break;\n }\n child$0 = child$0.sibling;\n }\n if (!didFindChild) throw Error(formatProdErrorMessage(189));\n }\n }\n if (a.alternate !== b) throw Error(formatProdErrorMessage(190));\n }\n if (3 !== a.tag) throw Error(formatProdErrorMessage(188));\n return a.stateNode.current === a ? fiber : alternate;\n}\nfunction findCurrentHostFiberImpl(node) {\n var tag = node.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;\n for (node = node.child; null !== node; ) {\n tag = findCurrentHostFiberImpl(node);\n if (null !== tag) return tag;\n node = node.sibling;\n }\n return null;\n}\nvar assign = Object.assign,\n REACT_LEGACY_ELEMENT_TYPE = Symbol.for(\"react.element\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\nSymbol.for(\"react.scope\");\nvar REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\");\nSymbol.for(\"react.legacy_hidden\");\nSymbol.for(\"react.tracing_marker\");\nvar REACT_MEMO_CACHE_SENTINEL = Symbol.for(\"react.memo_cache_sentinel\");\nSymbol.for(\"react.view_transition\");\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\");\nfunction getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (type.$$typeof) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n}\nvar isArrayImpl = Array.isArray,\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n ReactDOMSharedInternals =\n ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n sharedNotPendingObject = {\n pending: !1,\n data: null,\n method: null,\n action: null\n },\n valueStack = [],\n index = -1;\nfunction createCursor(defaultValue) {\n return { current: defaultValue };\n}\nfunction pop(cursor) {\n 0 > index ||\n ((cursor.current = valueStack[index]), (valueStack[index] = null), index--);\n}\nfunction push(cursor, value) {\n index++;\n valueStack[index] = cursor.current;\n cursor.current = value;\n}\nvar contextStackCursor = createCursor(null),\n contextFiberStackCursor = createCursor(null),\n rootInstanceStackCursor = createCursor(null),\n hostTransitionProviderCursor = createCursor(null);\nfunction pushHostContainer(fiber, nextRootInstance) {\n push(rootInstanceStackCursor, nextRootInstance);\n push(contextFiberStackCursor, fiber);\n push(contextStackCursor, null);\n switch (nextRootInstance.nodeType) {\n case 9:\n case 11:\n fiber = (fiber = nextRootInstance.documentElement)\n ? (fiber = fiber.namespaceURI)\n ? getOwnHostContext(fiber)\n : 0\n : 0;\n break;\n default:\n if (\n ((fiber = nextRootInstance.tagName),\n (nextRootInstance = nextRootInstance.namespaceURI))\n )\n (nextRootInstance = getOwnHostContext(nextRootInstance)),\n (fiber = getChildHostContextProd(nextRootInstance, fiber));\n else\n switch (fiber) {\n case \"svg\":\n fiber = 1;\n break;\n case \"math\":\n fiber = 2;\n break;\n default:\n fiber = 0;\n }\n }\n pop(contextStackCursor);\n push(contextStackCursor, fiber);\n}\nfunction popHostContainer() {\n pop(contextStackCursor);\n pop(contextFiberStackCursor);\n pop(rootInstanceStackCursor);\n}\nfunction pushHostContext(fiber) {\n null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber);\n var context = contextStackCursor.current;\n var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type);\n context !== JSCompiler_inline_result &&\n (push(contextFiberStackCursor, fiber),\n push(contextStackCursor, JSCompiler_inline_result));\n}\nfunction popHostContext(fiber) {\n contextFiberStackCursor.current === fiber &&\n (pop(contextStackCursor), pop(contextFiberStackCursor));\n hostTransitionProviderCursor.current === fiber &&\n (pop(hostTransitionProviderCursor),\n (HostTransitionContext._currentValue = sharedNotPendingObject));\n}\nvar prefix, suffix;\nfunction describeBuiltInComponentFrame(name) {\n if (void 0 === prefix)\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = (match && match[1]) || \"\";\n suffix =\n -1 < x.stack.indexOf(\"\\n at\")\n ? \" (<anonymous>)\"\n : -1 < x.stack.indexOf(\"@\")\n ? \"@unknown:0:0\"\n : \"\";\n }\n return \"\\n\" + prefix + name + suffix;\n}\nvar reentry = !1;\nfunction describeNativeComponentFrame(fn, construct) {\n if (!fn || reentry) return \"\";\n reentry = !0;\n var previousPrepareStackTrace = Error.prepareStackTrace;\n Error.prepareStackTrace = void 0;\n try {\n var RunInRootFrame = {\n DetermineComponentFrameRoot: function () {\n try {\n if (construct) {\n var Fake = function () {\n throw Error();\n };\n Object.defineProperty(Fake.prototype, \"props\", {\n set: function () {\n throw Error();\n }\n });\n if (\"object\" === typeof Reflect && Reflect.construct) {\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n var control = x;\n }\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x$1) {\n control = x$1;\n }\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x$2) {\n control = x$2;\n }\n (Fake = fn()) &&\n \"function\" === typeof Fake.catch &&\n Fake.catch(function () {});\n }\n } catch (sample) {\n if (sample && control && \"string\" === typeof sample.stack)\n return [sample.stack, control.stack];\n }\n return [null, null];\n }\n };\n RunInRootFrame.DetermineComponentFrameRoot.displayName =\n \"DetermineComponentFrameRoot\";\n var namePropDescriptor = Object.getOwnPropertyDescriptor(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\"\n );\n namePropDescriptor &&\n namePropDescriptor.configurable &&\n Object.defineProperty(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\",\n { value: \"DetermineComponentFrameRoot\" }\n );\n var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(),\n sampleStack = _RunInRootFrame$Deter[0],\n controlStack = _RunInRootFrame$Deter[1];\n if (sampleStack && controlStack) {\n var sampleLines = sampleStack.split(\"\\n\"),\n controlLines = controlStack.split(\"\\n\");\n for (\n namePropDescriptor = RunInRootFrame = 0;\n RunInRootFrame < sampleLines.length &&\n !sampleLines[RunInRootFrame].includes(\"DetermineComponentFrameRoot\");\n\n )\n RunInRootFrame++;\n for (\n ;\n namePropDescriptor < controlLines.length &&\n !controlLines[namePropDescriptor].includes(\n \"DetermineComponentFrameRoot\"\n );\n\n )\n namePropDescriptor++;\n if (\n RunInRootFrame === sampleLines.length ||\n namePropDescriptor === controlLines.length\n )\n for (\n RunInRootFrame = sampleLines.length - 1,\n namePropDescriptor = controlLines.length - 1;\n 1 <= RunInRootFrame &&\n 0 <= namePropDescriptor &&\n sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor];\n\n )\n namePropDescriptor--;\n for (\n ;\n 1 <= RunInRootFrame && 0 <= namePropDescriptor;\n RunInRootFrame--, namePropDescriptor--\n )\n if (sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]) {\n if (1 !== RunInRootFrame || 1 !== namePropDescriptor) {\n do\n if (\n (RunInRootFrame--,\n namePropDescriptor--,\n 0 > namePropDescriptor ||\n sampleLines[RunInRootFrame] !==\n controlLines[namePropDescriptor])\n ) {\n var frame =\n \"\\n\" +\n sampleLines[RunInRootFrame].replace(\" at new \", \" at \");\n fn.displayName &&\n frame.includes(\"<anonymous>\") &&\n (frame = frame.replace(\"<anonymous>\", fn.displayName));\n return frame;\n }\n while (1 <= RunInRootFrame && 0 <= namePropDescriptor);\n }\n break;\n }\n }\n } finally {\n (reentry = !1), (Error.prepareStackTrace = previousPrepareStackTrace);\n }\n return (previousPrepareStackTrace = fn ? fn.displayName || fn.name : \"\")\n ? describeBuiltInComponentFrame(previousPrepareStackTrace)\n : \"\";\n}\nfunction describeFiber(fiber, childFiber) {\n switch (fiber.tag) {\n case 26:\n case 27:\n case 5:\n return describeBuiltInComponentFrame(fiber.type);\n case 16:\n return describeBuiltInComponentFrame(\"Lazy\");\n case 13:\n return fiber.child !== childFiber && null !== childFiber\n ? describeBuiltInComponentFrame(\"Suspense Fallback\")\n : describeBuiltInComponentFrame(\"Suspense\");\n case 19:\n return describeBuiltInComponentFrame(\"SuspenseList\");\n case 0:\n case 15:\n return describeNativeComponentFrame(fiber.type, !1);\n case 11:\n return describeNativeComponentFrame(fiber.type.render, !1);\n case 1:\n return describeNativeComponentFrame(fiber.type, !0);\n case 31:\n return describeBuiltInComponentFrame(\"Activity\");\n default:\n return \"\";\n }\n}\nfunction getStackByFiberInDevAndProd(workInProgress) {\n try {\n var info = \"\",\n previous = null;\n do\n (info += describeFiber(workInProgress, previous)),\n (previous = workInProgress),\n (workInProgress = workInProgress.return);\n while (workInProgress);\n return info;\n } catch (x) {\n return \"\\nError generating stack: \" + x.message + \"\\n\" + x.stack;\n }\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n scheduleCallback$3 = Scheduler.unstable_scheduleCallback,\n cancelCallback$1 = Scheduler.unstable_cancelCallback,\n shouldYield = Scheduler.unstable_shouldYield,\n requestPaint = Scheduler.unstable_requestPaint,\n now = Scheduler.unstable_now,\n getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n NormalPriority$1 = Scheduler.unstable_NormalPriority,\n LowPriority = Scheduler.unstable_LowPriority,\n IdlePriority = Scheduler.unstable_IdlePriority,\n log$1 = Scheduler.log,\n unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,\n rendererID = null,\n injectedHook = null;\nfunction setIsStrictModeForDevtools(newIsStrictMode) {\n \"function\" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);\n if (injectedHook && \"function\" === typeof injectedHook.setStrictMode)\n try {\n injectedHook.setStrictMode(rendererID, newIsStrictMode);\n } catch (err) {}\n}\nvar clz32 = Math.clz32 ? Math.clz32 : clz32Fallback,\n log = Math.log,\n LN2 = Math.LN2;\nfunction clz32Fallback(x) {\n x >>>= 0;\n return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;\n}\nvar nextTransitionUpdateLane = 256,\n nextTransitionDeferredLane = 262144,\n nextRetryLane = 4194304;\nfunction getHighestPriorityLanes(lanes) {\n var pendingSyncLanes = lanes & 42;\n if (0 !== pendingSyncLanes) return pendingSyncLanes;\n switch (lanes & -lanes) {\n case 1:\n return 1;\n case 2:\n return 2;\n case 4:\n return 4;\n case 8:\n return 8;\n case 16:\n return 16;\n case 32:\n return 32;\n case 64:\n return 64;\n case 128:\n return 128;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n return lanes & 261888;\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return lanes & 3932160;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return lanes & 62914560;\n case 67108864:\n return 67108864;\n case 134217728:\n return 134217728;\n case 268435456:\n return 268435456;\n case 536870912:\n return 536870912;\n case 1073741824:\n return 0;\n default:\n return lanes;\n }\n}\nfunction getNextLanes(root, wipLanes, rootHasPendingCommit) {\n var pendingLanes = root.pendingLanes;\n if (0 === pendingLanes) return 0;\n var nextLanes = 0,\n suspendedLanes = root.suspendedLanes,\n pingedLanes = root.pingedLanes;\n root = root.warmLanes;\n var nonIdlePendingLanes = pendingLanes & 134217727;\n 0 !== nonIdlePendingLanes\n ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),\n 0 !== pendingLanes\n ? (nextLanes = getHighestPriorityLanes(pendingLanes))\n : ((pingedLanes &= nonIdlePendingLanes),\n 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = nonIdlePendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))))\n : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),\n 0 !== nonIdlePendingLanes\n ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))\n : 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = pendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));\n return 0 === nextLanes\n ? 0\n : 0 !== wipLanes &&\n wipLanes !== nextLanes &&\n 0 === (wipLanes & suspendedLanes) &&\n ((suspendedLanes = nextLanes & -nextLanes),\n (rootHasPendingCommit = wipLanes & -wipLanes),\n suspendedLanes >= rootHasPendingCommit ||\n (32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)))\n ? wipLanes\n : nextLanes;\n}\nfunction checkIfRootIsPrerendering(root, renderLanes) {\n return (\n 0 ===\n (root.pendingLanes &\n ~(root.suspendedLanes & ~root.pingedLanes) &\n renderLanes)\n );\n}\nfunction computeExpirationTime(lane, currentTime) {\n switch (lane) {\n case 1:\n case 2:\n case 4:\n case 8:\n case 64:\n return currentTime + 250;\n case 16:\n case 32:\n case 128:\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return currentTime + 5e3;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return -1;\n case 67108864:\n case 134217728:\n case 268435456:\n case 536870912:\n case 1073741824:\n return -1;\n default:\n return -1;\n }\n}\nfunction claimNextRetryLane() {\n var lane = nextRetryLane;\n nextRetryLane <<= 1;\n 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);\n return lane;\n}\nfunction createLaneMap(initial) {\n for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);\n return laneMap;\n}\nfunction markRootUpdated$1(root, updateLane) {\n root.pendingLanes |= updateLane;\n 268435456 !== updateLane &&\n ((root.suspendedLanes = 0), (root.pingedLanes = 0), (root.warmLanes = 0));\n}\nfunction markRootFinished(\n root,\n finishedLanes,\n remainingLanes,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes\n) {\n var previouslyPendingLanes = root.pendingLanes;\n root.pendingLanes = remainingLanes;\n root.suspendedLanes = 0;\n root.pingedLanes = 0;\n root.warmLanes = 0;\n root.expiredLanes &= remainingLanes;\n root.entangledLanes &= remainingLanes;\n root.errorRecoveryDisabledLanes &= remainingLanes;\n root.shellSuspendCounter = 0;\n var entanglements = root.entanglements,\n expirationTimes = root.expirationTimes,\n hiddenUpdates = root.hiddenUpdates;\n for (\n remainingLanes = previouslyPendingLanes & ~remainingLanes;\n 0 < remainingLanes;\n\n ) {\n var index$7 = 31 - clz32(remainingLanes),\n lane = 1 << index$7;\n entanglements[index$7] = 0;\n expirationTimes[index$7] = -1;\n var hiddenUpdatesForLane = hiddenUpdates[index$7];\n if (null !== hiddenUpdatesForLane)\n for (\n hiddenUpdates[index$7] = null, index$7 = 0;\n index$7 < hiddenUpdatesForLane.length;\n index$7++\n ) {\n var update = hiddenUpdatesForLane[index$7];\n null !== update && (update.lane &= -536870913);\n }\n remainingLanes &= ~lane;\n }\n 0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0);\n 0 !== suspendedRetryLanes &&\n 0 === updatedLanes &&\n 0 !== root.tag &&\n (root.suspendedLanes |=\n suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes));\n}\nfunction markSpawnedDeferredLane(root, spawnedLane, entangledLanes) {\n root.pendingLanes |= spawnedLane;\n root.suspendedLanes &= ~spawnedLane;\n var spawnedLaneIndex = 31 - clz32(spawnedLane);\n root.entangledLanes |= spawnedLane;\n root.entanglements[spawnedLaneIndex] =\n root.entanglements[spawnedLaneIndex] |\n 1073741824 |\n (entangledLanes & 261930);\n}\nfunction markRootEntangled(root, entangledLanes) {\n var rootEntangledLanes = (root.entangledLanes |= entangledLanes);\n for (root = root.entanglements; rootEntangledLanes; ) {\n var index$8 = 31 - clz32(rootEntangledLanes),\n lane = 1 << index$8;\n (lane & entangledLanes) | (root[index$8] & entangledLanes) &&\n (root[index$8] |= entangledLanes);\n rootEntangledLanes &= ~lane;\n }\n}\nfunction getBumpedLaneForHydration(root, renderLanes) {\n var renderLane = renderLanes & -renderLanes;\n renderLane =\n 0 !== (renderLane & 42) ? 1 : getBumpedLaneForHydrationByLane(renderLane);\n return 0 !== (renderLane & (root.suspendedLanes | renderLanes))\n ? 0\n : renderLane;\n}\nfunction getBumpedLaneForHydrationByLane(lane) {\n switch (lane) {\n case 2:\n lane = 1;\n break;\n case 8:\n lane = 4;\n break;\n case 32:\n lane = 16;\n break;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n lane = 128;\n break;\n case 268435456:\n lane = 134217728;\n break;\n default:\n lane = 0;\n }\n return lane;\n}\nfunction lanesToEventPriority(lanes) {\n lanes &= -lanes;\n return 2 < lanes\n ? 8 < lanes\n ? 0 !== (lanes & 134217727)\n ? 32\n : 268435456\n : 8\n : 2;\n}\nfunction resolveUpdatePriority() {\n var updatePriority = ReactDOMSharedInternals.p;\n if (0 !== updatePriority) return updatePriority;\n updatePriority = window.event;\n return void 0 === updatePriority ? 32 : getEventPriority(updatePriority.type);\n}\nfunction runWithPriority(priority, fn) {\n var previousPriority = ReactDOMSharedInternals.p;\n try {\n return (ReactDOMSharedInternals.p = priority), fn();\n } finally {\n ReactDOMSharedInternals.p = previousPriority;\n }\n}\nvar randomKey = Math.random().toString(36).slice(2),\n internalInstanceKey = \"__reactFiber$\" + randomKey,\n internalPropsKey = \"__reactProps$\" + randomKey,\n internalContainerInstanceKey = \"__reactContainer$\" + randomKey,\n internalEventHandlersKey = \"__reactEvents$\" + randomKey,\n internalEventHandlerListenersKey = \"__reactListeners$\" + randomKey,\n internalEventHandlesSetKey = \"__reactHandles$\" + randomKey,\n internalRootNodeResourcesKey = \"__reactResources$\" + randomKey,\n internalHoistableMarker = \"__reactMarker$\" + randomKey;\nfunction detachDeletedInstance(node) {\n delete node[internalInstanceKey];\n delete node[internalPropsKey];\n delete node[internalEventHandlersKey];\n delete node[internalEventHandlerListenersKey];\n delete node[internalEventHandlesSetKey];\n}\nfunction getClosestInstanceFromNode(targetNode) {\n var targetInst = targetNode[internalInstanceKey];\n if (targetInst) return targetInst;\n for (var parentNode = targetNode.parentNode; parentNode; ) {\n if (\n (targetInst =\n parentNode[internalContainerInstanceKey] ||\n parentNode[internalInstanceKey])\n ) {\n parentNode = targetInst.alternate;\n if (\n null !== targetInst.child ||\n (null !== parentNode && null !== parentNode.child)\n )\n for (\n targetNode = getParentHydrationBoundary(targetNode);\n null !== targetNode;\n\n ) {\n if ((parentNode = targetNode[internalInstanceKey])) return parentNode;\n targetNode = getParentHydrationBoundary(targetNode);\n }\n return targetInst;\n }\n targetNode = parentNode;\n parentNode = targetNode.parentNode;\n }\n return null;\n}\nfunction getInstanceFromNode(node) {\n if (\n (node = node[internalInstanceKey] || node[internalContainerInstanceKey])\n ) {\n var tag = node.tag;\n if (\n 5 === tag ||\n 6 === tag ||\n 13 === tag ||\n 31 === tag ||\n 26 === tag ||\n 27 === tag ||\n 3 === tag\n )\n return node;\n }\n return null;\n}\nfunction getNodeFromInstance(inst) {\n var tag = inst.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode;\n throw Error(formatProdErrorMessage(33));\n}\nfunction getResourcesFromRoot(root) {\n var resources = root[internalRootNodeResourcesKey];\n resources ||\n (resources = root[internalRootNodeResourcesKey] =\n { hoistableStyles: new Map(), hoistableScripts: new Map() });\n return resources;\n}\nfunction markNodeAsHoistable(node) {\n node[internalHoistableMarker] = !0;\n}\nvar allNativeEvents = new Set(),\n registrationNameDependencies = {};\nfunction registerTwoPhaseEvent(registrationName, dependencies) {\n registerDirectEvent(registrationName, dependencies);\n registerDirectEvent(registrationName + \"Capture\", dependencies);\n}\nfunction registerDirectEvent(registrationName, dependencies) {\n registrationNameDependencies[registrationName] = dependencies;\n for (\n registrationName = 0;\n registrationName < dependencies.length;\n registrationName++\n )\n allNativeEvents.add(dependencies[registrationName]);\n}\nvar VALID_ATTRIBUTE_NAME_REGEX = RegExp(\n \"^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$\"\n ),\n illegalAttributeNameCache = {},\n validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n if (hasOwnProperty.call(validatedAttributeNameCache, attributeName))\n return !0;\n if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return !1;\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName))\n return (validatedAttributeNameCache[attributeName] = !0);\n illegalAttributeNameCache[attributeName] = !0;\n return !1;\n}\nfunction setValueForAttribute(node, name, value) {\n if (isAttributeNameSafe(name))\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n node.removeAttribute(name);\n return;\n case \"boolean\":\n var prefix$10 = name.toLowerCase().slice(0, 5);\n if (\"data-\" !== prefix$10 && \"aria-\" !== prefix$10) {\n node.removeAttribute(name);\n return;\n }\n }\n node.setAttribute(name, \"\" + value);\n }\n}\nfunction setValueForKnownAttribute(node, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n node.setAttribute(name, \"\" + value);\n }\n}\nfunction setValueForNamespacedAttribute(node, namespace, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n node.setAttributeNS(namespace, name, \"\" + value);\n }\n}\nfunction getToStringValue(value) {\n switch (typeof value) {\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n case \"undefined\":\n return value;\n case \"object\":\n return value;\n default:\n return \"\";\n }\n}\nfunction isCheckable(elem) {\n var type = elem.type;\n return (\n (elem = elem.nodeName) &&\n \"input\" === elem.toLowerCase() &&\n (\"checkbox\" === type || \"radio\" === type)\n );\n}\nfunction trackValueOnNode(node, valueField, currentValue) {\n var descriptor = Object.getOwnPropertyDescriptor(\n node.constructor.prototype,\n valueField\n );\n if (\n !node.hasOwnProperty(valueField) &&\n \"undefined\" !== typeof descriptor &&\n \"function\" === typeof descriptor.get &&\n \"function\" === typeof descriptor.set\n ) {\n var get = descriptor.get,\n set = descriptor.set;\n Object.defineProperty(node, valueField, {\n configurable: !0,\n get: function () {\n return get.call(this);\n },\n set: function (value) {\n currentValue = \"\" + value;\n set.call(this, value);\n }\n });\n Object.defineProperty(node, valueField, {\n enumerable: descriptor.enumerable\n });\n return {\n getValue: function () {\n return currentValue;\n },\n setValue: function (value) {\n currentValue = \"\" + value;\n },\n stopTracking: function () {\n node._valueTracker = null;\n delete node[valueField];\n }\n };\n }\n}\nfunction track(node) {\n if (!node._valueTracker) {\n var valueField = isCheckable(node) ? \"checked\" : \"value\";\n node._valueTracker = trackValueOnNode(\n node,\n valueField,\n \"\" + node[valueField]\n );\n }\n}\nfunction updateValueIfChanged(node) {\n if (!node) return !1;\n var tracker = node._valueTracker;\n if (!tracker) return !0;\n var lastValue = tracker.getValue();\n var value = \"\";\n node &&\n (value = isCheckable(node)\n ? node.checked\n ? \"true\"\n : \"false\"\n : node.value);\n node = value;\n return node !== lastValue ? (tracker.setValue(node), !0) : !1;\n}\nfunction getActiveElement(doc) {\n doc = doc || (\"undefined\" !== typeof document ? document : void 0);\n if (\"undefined\" === typeof doc) return null;\n try {\n return doc.activeElement || doc.body;\n } catch (e) {\n return doc.body;\n }\n}\nvar escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\\n\"\\\\]/g;\nfunction escapeSelectorAttributeValueInsideDoubleQuotes(value) {\n return value.replace(\n escapeSelectorAttributeValueInsideDoubleQuotesRegex,\n function (ch) {\n return \"\\\\\" + ch.charCodeAt(0).toString(16) + \" \";\n }\n );\n}\nfunction updateInput(\n element,\n value,\n defaultValue,\n lastDefaultValue,\n checked,\n defaultChecked,\n type,\n name\n) {\n element.name = \"\";\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type\n ? (element.type = type)\n : element.removeAttribute(\"type\");\n if (null != value)\n if (\"number\" === type) {\n if ((0 === value && \"\" === element.value) || element.value != value)\n element.value = \"\" + getToStringValue(value);\n } else\n element.value !== \"\" + getToStringValue(value) &&\n (element.value = \"\" + getToStringValue(value));\n else\n (\"submit\" !== type && \"reset\" !== type) || element.removeAttribute(\"value\");\n null != value\n ? setDefaultValue(element, type, getToStringValue(value))\n : null != defaultValue\n ? setDefaultValue(element, type, getToStringValue(defaultValue))\n : null != lastDefaultValue && element.removeAttribute(\"value\");\n null == checked &&\n null != defaultChecked &&\n (element.defaultChecked = !!defaultChecked);\n null != checked &&\n (element.checked =\n checked && \"function\" !== typeof checked && \"symbol\" !== typeof checked);\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name\n ? (element.name = \"\" + getToStringValue(name))\n : element.removeAttribute(\"name\");\n}\nfunction initInput(\n element,\n value,\n defaultValue,\n checked,\n defaultChecked,\n type,\n name,\n isHydrating\n) {\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type &&\n (element.type = type);\n if (null != value || null != defaultValue) {\n if (\n !(\n (\"submit\" !== type && \"reset\" !== type) ||\n (void 0 !== value && null !== value)\n )\n ) {\n track(element);\n return;\n }\n defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n value = null != value ? \"\" + getToStringValue(value) : defaultValue;\n isHydrating || value === element.value || (element.value = value);\n element.defaultValue = value;\n }\n checked = null != checked ? checked : defaultChecked;\n checked =\n \"function\" !== typeof checked && \"symbol\" !== typeof checked && !!checked;\n element.checked = isHydrating ? element.checked : !!checked;\n element.defaultChecked = !!checked;\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name &&\n (element.name = name);\n track(element);\n}\nfunction setDefaultValue(node, type, value) {\n (\"number\" === type && getActiveElement(node.ownerDocument) === node) ||\n node.defaultValue === \"\" + value ||\n (node.defaultValue = \"\" + value);\n}\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n node = node.options;\n if (multiple) {\n multiple = {};\n for (var i = 0; i < propValue.length; i++)\n multiple[\"$\" + propValue[i]] = !0;\n for (propValue = 0; propValue < node.length; propValue++)\n (i = multiple.hasOwnProperty(\"$\" + node[propValue].value)),\n node[propValue].selected !== i && (node[propValue].selected = i),\n i && setDefaultSelected && (node[propValue].defaultSelected = !0);\n } else {\n propValue = \"\" + getToStringValue(propValue);\n multiple = null;\n for (i = 0; i < node.length; i++) {\n if (node[i].value === propValue) {\n node[i].selected = !0;\n setDefaultSelected && (node[i].defaultSelected = !0);\n return;\n }\n null !== multiple || node[i].disabled || (multiple = node[i]);\n }\n null !== multiple && (multiple.selected = !0);\n }\n}\nfunction updateTextarea(element, value, defaultValue) {\n if (\n null != value &&\n ((value = \"\" + getToStringValue(value)),\n value !== element.value && (element.value = value),\n null == defaultValue)\n ) {\n element.defaultValue !== value && (element.defaultValue = value);\n return;\n }\n element.defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n}\nfunction initTextarea(element, value, defaultValue, children) {\n if (null == value) {\n if (null != children) {\n if (null != defaultValue) throw Error(formatProdErrorMessage(92));\n if (isArrayImpl(children)) {\n if (1 < children.length) throw Error(formatProdErrorMessage(93));\n children = children[0];\n }\n defaultValue = children;\n }\n null == defaultValue && (defaultValue = \"\");\n value = defaultValue;\n }\n defaultValue = getToStringValue(value);\n element.defaultValue = defaultValue;\n children = element.textContent;\n children === defaultValue &&\n \"\" !== children &&\n null !== children &&\n (element.value = children);\n track(element);\n}\nfunction setTextContent(node, text) {\n if (text) {\n var firstChild = node.firstChild;\n if (\n firstChild &&\n firstChild === node.lastChild &&\n 3 === firstChild.nodeType\n ) {\n firstChild.nodeValue = text;\n return;\n }\n }\n node.textContent = text;\n}\nvar unitlessNumbers = new Set(\n \"animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp\".split(\n \" \"\n )\n);\nfunction setValueForStyle(style, styleName, value) {\n var isCustomProperty = 0 === styleName.indexOf(\"--\");\n null == value || \"boolean\" === typeof value || \"\" === value\n ? isCustomProperty\n ? style.setProperty(styleName, \"\")\n : \"float\" === styleName\n ? (style.cssFloat = \"\")\n : (style[styleName] = \"\")\n : isCustomProperty\n ? style.setProperty(styleName, value)\n : \"number\" !== typeof value ||\n 0 === value ||\n unitlessNumbers.has(styleName)\n ? \"float\" === styleName\n ? (style.cssFloat = value)\n : (style[styleName] = (\"\" + value).trim())\n : (style[styleName] = value + \"px\");\n}\nfunction setValueForStyles(node, styles, prevStyles) {\n if (null != styles && \"object\" !== typeof styles)\n throw Error(formatProdErrorMessage(62));\n node = node.style;\n if (null != prevStyles) {\n for (var styleName in prevStyles)\n !prevStyles.hasOwnProperty(styleName) ||\n (null != styles && styles.hasOwnProperty(styleName)) ||\n (0 === styleName.indexOf(\"--\")\n ? node.setProperty(styleName, \"\")\n : \"float\" === styleName\n ? (node.cssFloat = \"\")\n : (node[styleName] = \"\"));\n for (var styleName$16 in styles)\n (styleName = styles[styleName$16]),\n styles.hasOwnProperty(styleName$16) &&\n prevStyles[styleName$16] !== styleName &&\n setValueForStyle(node, styleName$16, styleName);\n } else\n for (var styleName$17 in styles)\n styles.hasOwnProperty(styleName$17) &&\n setValueForStyle(node, styleName$17, styles[styleName$17]);\n}\nfunction isCustomElement(tagName) {\n if (-1 === tagName.indexOf(\"-\")) return !1;\n switch (tagName) {\n case \"annotation-xml\":\n case \"color-profile\":\n case \"font-face\":\n case \"font-face-src\":\n case \"font-face-uri\":\n case \"font-face-format\":\n case \"font-face-name\":\n case \"missing-glyph\":\n return !1;\n default:\n return !0;\n }\n}\nvar aliases = new Map([\n [\"acceptCharset\", \"accept-charset\"],\n [\"htmlFor\", \"for\"],\n [\"httpEquiv\", \"http-equiv\"],\n [\"crossOrigin\", \"crossorigin\"],\n [\"accentHeight\", \"accent-height\"],\n [\"alignmentBaseline\", \"alignment-baseline\"],\n [\"arabicForm\", \"arabic-form\"],\n [\"baselineShift\", \"baseline-shift\"],\n [\"capHeight\", \"cap-height\"],\n [\"clipPath\", \"clip-path\"],\n [\"clipRule\", \"clip-rule\"],\n [\"colorInterpolation\", \"color-interpolation\"],\n [\"colorInterpolationFilters\", \"color-interpolation-filters\"],\n [\"colorProfile\", \"color-profile\"],\n [\"colorRendering\", \"color-rendering\"],\n [\"dominantBaseline\", \"dominant-baseline\"],\n [\"enableBackground\", \"enable-background\"],\n [\"fillOpacity\", \"fill-opacity\"],\n [\"fillRule\", \"fill-rule\"],\n [\"floodColor\", \"flood-color\"],\n [\"floodOpacity\", \"flood-opacity\"],\n [\"fontFamily\", \"font-family\"],\n [\"fontSize\", \"font-size\"],\n [\"fontSizeAdjust\", \"font-size-adjust\"],\n [\"fontStretch\", \"font-stretch\"],\n [\"fontStyle\", \"font-style\"],\n [\"fontVariant\", \"font-variant\"],\n [\"fontWeight\", \"font-weight\"],\n [\"glyphName\", \"glyph-name\"],\n [\"glyphOrientationHorizontal\", \"glyph-orientation-horizontal\"],\n [\"glyphOrientationVertical\", \"glyph-orientation-vertical\"],\n [\"horizAdvX\", \"horiz-adv-x\"],\n [\"horizOriginX\", \"horiz-origin-x\"],\n [\"imageRendering\", \"image-rendering\"],\n [\"letterSpacing\", \"letter-spacing\"],\n [\"lightingColor\", \"lighting-color\"],\n [\"markerEnd\", \"marker-end\"],\n [\"markerMid\", \"marker-mid\"],\n [\"markerStart\", \"marker-start\"],\n [\"overlinePosition\", \"overline-position\"],\n [\"overlineThickness\", \"overline-thickness\"],\n [\"paintOrder\", \"paint-order\"],\n [\"panose-1\", \"panose-1\"],\n [\"pointerEvents\", \"pointer-events\"],\n [\"renderingIntent\", \"rendering-intent\"],\n [\"shapeRendering\", \"shape-rendering\"],\n [\"stopColor\", \"stop-color\"],\n [\"stopOpacity\", \"stop-opacity\"],\n [\"strikethroughPosition\", \"strikethrough-position\"],\n [\"strikethroughThickness\", \"strikethrough-thickness\"],\n [\"strokeDasharray\", \"stroke-dasharray\"],\n [\"strokeDashoffset\", \"stroke-dashoffset\"],\n [\"strokeLinecap\", \"stroke-linecap\"],\n [\"strokeLinejoin\", \"stroke-linejoin\"],\n [\"strokeMiterlimit\", \"stroke-miterlimit\"],\n [\"strokeOpacity\", \"stroke-opacity\"],\n [\"strokeWidth\", \"stroke-width\"],\n [\"textAnchor\", \"text-anchor\"],\n [\"textDecoration\", \"text-decoration\"],\n [\"textRendering\", \"text-rendering\"],\n [\"transformOrigin\", \"transform-origin\"],\n [\"underlinePosition\", \"underline-position\"],\n [\"underlineThickness\", \"underline-thickness\"],\n [\"unicodeBidi\", \"unicode-bidi\"],\n [\"unicodeRange\", \"unicode-range\"],\n [\"unitsPerEm\", \"units-per-em\"],\n [\"vAlphabetic\", \"v-alphabetic\"],\n [\"vHanging\", \"v-hanging\"],\n [\"vIdeographic\", \"v-ideographic\"],\n [\"vMathematical\", \"v-mathematical\"],\n [\"vectorEffect\", \"vector-effect\"],\n [\"vertAdvY\", \"vert-adv-y\"],\n [\"vertOriginX\", \"vert-origin-x\"],\n [\"vertOriginY\", \"vert-origin-y\"],\n [\"wordSpacing\", \"word-spacing\"],\n [\"writingMode\", \"writing-mode\"],\n [\"xmlnsXlink\", \"xmlns:xlink\"],\n [\"xHeight\", \"x-height\"]\n ]),\n isJavaScriptProtocol =\n /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*:/i;\nfunction sanitizeURL(url) {\n return isJavaScriptProtocol.test(\"\" + url)\n ? \"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')\"\n : url;\n}\nfunction noop$1() {}\nvar currentReplayingEvent = null;\nfunction getEventTarget(nativeEvent) {\n nativeEvent = nativeEvent.target || nativeEvent.srcElement || window;\n nativeEvent.correspondingUseElement &&\n (nativeEvent = nativeEvent.correspondingUseElement);\n return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent;\n}\nvar restoreTarget = null,\n restoreQueue = null;\nfunction restoreStateOfTarget(target) {\n var internalInstance = getInstanceFromNode(target);\n if (internalInstance && (target = internalInstance.stateNode)) {\n var props = target[internalPropsKey] || null;\n a: switch (((target = internalInstance.stateNode), internalInstance.type)) {\n case \"input\":\n updateInput(\n target,\n props.value,\n props.defaultValue,\n props.defaultValue,\n props.checked,\n props.defaultChecked,\n props.type,\n props.name\n );\n internalInstance = props.name;\n if (\"radio\" === props.type && null != internalInstance) {\n for (props = target; props.parentNode; ) props = props.parentNode;\n props = props.querySelectorAll(\n 'input[name=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(\n \"\" + internalInstance\n ) +\n '\"][type=\"radio\"]'\n );\n for (\n internalInstance = 0;\n internalInstance < props.length;\n internalInstance++\n ) {\n var otherNode = props[internalInstance];\n if (otherNode !== target && otherNode.form === target.form) {\n var otherProps = otherNode[internalPropsKey] || null;\n if (!otherProps) throw Error(formatProdErrorMessage(90));\n updateInput(\n otherNode,\n otherProps.value,\n otherProps.defaultValue,\n otherProps.defaultValue,\n otherProps.checked,\n otherProps.defaultChecked,\n otherProps.type,\n otherProps.name\n );\n }\n }\n for (\n internalInstance = 0;\n internalInstance < props.length;\n internalInstance++\n )\n (otherNode = props[internalInstance]),\n otherNode.form === target.form && updateValueIfChanged(otherNode);\n }\n break a;\n case \"textarea\":\n updateTextarea(target, props.value, props.defaultValue);\n break a;\n case \"select\":\n (internalInstance = props.value),\n null != internalInstance &&\n updateOptions(target, !!props.multiple, internalInstance, !1);\n }\n }\n}\nvar isInsideEventHandler = !1;\nfunction batchedUpdates$1(fn, a, b) {\n if (isInsideEventHandler) return fn(a, b);\n isInsideEventHandler = !0;\n try {\n var JSCompiler_inline_result = fn(a);\n return JSCompiler_inline_result;\n } finally {\n if (\n ((isInsideEventHandler = !1),\n null !== restoreTarget || null !== restoreQueue)\n )\n if (\n (flushSyncWork$1(),\n restoreTarget &&\n ((a = restoreTarget),\n (fn = restoreQueue),\n (restoreQueue = restoreTarget = null),\n restoreStateOfTarget(a),\n fn))\n )\n for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]);\n }\n}\nfunction getListener(inst, registrationName) {\n var stateNode = inst.stateNode;\n if (null === stateNode) return null;\n var props = stateNode[internalPropsKey] || null;\n if (null === props) return null;\n stateNode = props[registrationName];\n a: switch (registrationName) {\n case \"onClick\":\n case \"onClickCapture\":\n case \"onDoubleClick\":\n case \"onDoubleClickCapture\":\n case \"onMouseDown\":\n case \"onMouseDownCapture\":\n case \"onMouseMove\":\n case \"onMouseMoveCapture\":\n case \"onMouseUp\":\n case \"onMouseUpCapture\":\n case \"onMouseEnter\":\n (props = !props.disabled) ||\n ((inst = inst.type),\n (props = !(\n \"button\" === inst ||\n \"input\" === inst ||\n \"select\" === inst ||\n \"textarea\" === inst\n )));\n inst = !props;\n break a;\n default:\n inst = !1;\n }\n if (inst) return null;\n if (stateNode && \"function\" !== typeof stateNode)\n throw Error(\n formatProdErrorMessage(231, registrationName, typeof stateNode)\n );\n return stateNode;\n}\nvar canUseDOM = !(\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ),\n passiveBrowserEventsSupported = !1;\nif (canUseDOM)\n try {\n var options = {};\n Object.defineProperty(options, \"passive\", {\n get: function () {\n passiveBrowserEventsSupported = !0;\n }\n });\n window.addEventListener(\"test\", options, options);\n window.removeEventListener(\"test\", options, options);\n } catch (e) {\n passiveBrowserEventsSupported = !1;\n }\nvar root = null,\n startText = null,\n fallbackText = null;\nfunction getData() {\n if (fallbackText) return fallbackText;\n var start,\n startValue = startText,\n startLength = startValue.length,\n end,\n endValue = \"value\" in root ? root.value : root.textContent,\n endLength = endValue.length;\n for (\n start = 0;\n start < startLength && startValue[start] === endValue[start];\n start++\n );\n var minEnd = startLength - start;\n for (\n end = 1;\n end <= minEnd &&\n startValue[startLength - end] === endValue[endLength - end];\n end++\n );\n return (fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0));\n}\nfunction getEventCharCode(nativeEvent) {\n var keyCode = nativeEvent.keyCode;\n \"charCode\" in nativeEvent\n ? ((nativeEvent = nativeEvent.charCode),\n 0 === nativeEvent && 13 === keyCode && (nativeEvent = 13))\n : (nativeEvent = keyCode);\n 10 === nativeEvent && (nativeEvent = 13);\n return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0;\n}\nfunction functionThatReturnsTrue() {\n return !0;\n}\nfunction functionThatReturnsFalse() {\n return !1;\n}\nfunction createSyntheticEvent(Interface) {\n function SyntheticBaseEvent(\n reactName,\n reactEventType,\n targetInst,\n nativeEvent,\n nativeEventTarget\n ) {\n this._reactName = reactName;\n this._targetInst = targetInst;\n this.type = reactEventType;\n this.nativeEvent = nativeEvent;\n this.target = nativeEventTarget;\n this.currentTarget = null;\n for (var propName in Interface)\n Interface.hasOwnProperty(propName) &&\n ((reactName = Interface[propName]),\n (this[propName] = reactName\n ? reactName(nativeEvent)\n : nativeEvent[propName]));\n this.isDefaultPrevented = (\n null != nativeEvent.defaultPrevented\n ? nativeEvent.defaultPrevented\n : !1 === nativeEvent.returnValue\n )\n ? functionThatReturnsTrue\n : functionThatReturnsFalse;\n this.isPropagationStopped = functionThatReturnsFalse;\n return this;\n }\n assign(SyntheticBaseEvent.prototype, {\n preventDefault: function () {\n this.defaultPrevented = !0;\n var event = this.nativeEvent;\n event &&\n (event.preventDefault\n ? event.preventDefault()\n : \"unknown\" !== typeof event.returnValue && (event.returnValue = !1),\n (this.isDefaultPrevented = functionThatReturnsTrue));\n },\n stopPropagation: function () {\n var event = this.nativeEvent;\n event &&\n (event.stopPropagation\n ? event.stopPropagation()\n : \"unknown\" !== typeof event.cancelBubble &&\n (event.cancelBubble = !0),\n (this.isPropagationStopped = functionThatReturnsTrue));\n },\n persist: function () {},\n isPersistent: functionThatReturnsTrue\n });\n return SyntheticBaseEvent;\n}\nvar EventInterface = {\n eventPhase: 0,\n bubbles: 0,\n cancelable: 0,\n timeStamp: function (event) {\n return event.timeStamp || Date.now();\n },\n defaultPrevented: 0,\n isTrusted: 0\n },\n SyntheticEvent = createSyntheticEvent(EventInterface),\n UIEventInterface = assign({}, EventInterface, { view: 0, detail: 0 }),\n SyntheticUIEvent = createSyntheticEvent(UIEventInterface),\n lastMovementX,\n lastMovementY,\n lastMouseEvent,\n MouseEventInterface = assign({}, UIEventInterface, {\n screenX: 0,\n screenY: 0,\n clientX: 0,\n clientY: 0,\n pageX: 0,\n pageY: 0,\n ctrlKey: 0,\n shiftKey: 0,\n altKey: 0,\n metaKey: 0,\n getModifierState: getEventModifierState,\n button: 0,\n buttons: 0,\n relatedTarget: function (event) {\n return void 0 === event.relatedTarget\n ? event.fromElement === event.srcElement\n ? event.toElement\n : event.fromElement\n : event.relatedTarget;\n },\n movementX: function (event) {\n if (\"movementX\" in event) return event.movementX;\n event !== lastMouseEvent &&\n (lastMouseEvent && \"mousemove\" === event.type\n ? ((lastMovementX = event.screenX - lastMouseEvent.screenX),\n (lastMovementY = event.screenY - lastMouseEvent.screenY))\n : (lastMovementY = lastMovementX = 0),\n (lastMouseEvent = event));\n return lastMovementX;\n },\n movementY: function (event) {\n return \"movementY\" in event ? event.movementY : lastMovementY;\n }\n }),\n SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface),\n DragEventInterface = assign({}, MouseEventInterface, { dataTransfer: 0 }),\n SyntheticDragEvent = createSyntheticEvent(DragEventInterface),\n FocusEventInterface = assign({}, UIEventInterface, { relatedTarget: 0 }),\n SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface),\n AnimationEventInterface = assign({}, EventInterface, {\n animationName: 0,\n elapsedTime: 0,\n pseudoElement: 0\n }),\n SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface),\n ClipboardEventInterface = assign({}, EventInterface, {\n clipboardData: function (event) {\n return \"clipboardData\" in event\n ? event.clipboardData\n : window.clipboardData;\n }\n }),\n SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface),\n CompositionEventInterface = assign({}, EventInterface, { data: 0 }),\n SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface),\n normalizeKey = {\n Esc: \"Escape\",\n Spacebar: \" \",\n Left: \"ArrowLeft\",\n Up: \"ArrowUp\",\n Right: \"ArrowRight\",\n Down: \"ArrowDown\",\n Del: \"Delete\",\n Win: \"OS\",\n Menu: \"ContextMenu\",\n Apps: \"ContextMenu\",\n Scroll: \"ScrollLock\",\n MozPrintableKey: \"Unidentified\"\n },\n translateToKey = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 12: \"Clear\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 19: \"Pause\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 45: \"Insert\",\n 46: \"Delete\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 224: \"Meta\"\n },\n modifierKeyToProp = {\n Alt: \"altKey\",\n Control: \"ctrlKey\",\n Meta: \"metaKey\",\n Shift: \"shiftKey\"\n };\nfunction modifierStateGetter(keyArg) {\n var nativeEvent = this.nativeEvent;\n return nativeEvent.getModifierState\n ? nativeEvent.getModifierState(keyArg)\n : (keyArg = modifierKeyToProp[keyArg])\n ? !!nativeEvent[keyArg]\n : !1;\n}\nfunction getEventModifierState() {\n return modifierStateGetter;\n}\nvar KeyboardEventInterface = assign({}, UIEventInterface, {\n key: function (nativeEvent) {\n if (nativeEvent.key) {\n var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n if (\"Unidentified\" !== key) return key;\n }\n return \"keypress\" === nativeEvent.type\n ? ((nativeEvent = getEventCharCode(nativeEvent)),\n 13 === nativeEvent ? \"Enter\" : String.fromCharCode(nativeEvent))\n : \"keydown\" === nativeEvent.type || \"keyup\" === nativeEvent.type\n ? translateToKey[nativeEvent.keyCode] || \"Unidentified\"\n : \"\";\n },\n code: 0,\n location: 0,\n ctrlKey: 0,\n shiftKey: 0,\n altKey: 0,\n metaKey: 0,\n repeat: 0,\n locale: 0,\n getModifierState: getEventModifierState,\n charCode: function (event) {\n return \"keypress\" === event.type ? getEventCharCode(event) : 0;\n },\n keyCode: function (event) {\n return \"keydown\" === event.type || \"keyup\" === event.type\n ? event.keyCode\n : 0;\n },\n which: function (event) {\n return \"keypress\" === event.type\n ? getEventCharCode(event)\n : \"keydown\" === event.type || \"keyup\" === event.type\n ? event.keyCode\n : 0;\n }\n }),\n SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface),\n PointerEventInterface = assign({}, MouseEventInterface, {\n pointerId: 0,\n width: 0,\n height: 0,\n pressure: 0,\n tangentialPressure: 0,\n tiltX: 0,\n tiltY: 0,\n twist: 0,\n pointerType: 0,\n isPrimary: 0\n }),\n SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface),\n TouchEventInterface = assign({}, UIEventInterface, {\n touches: 0,\n targetTouches: 0,\n changedTouches: 0,\n altKey: 0,\n metaKey: 0,\n ctrlKey: 0,\n shiftKey: 0,\n getModifierState: getEventModifierState\n }),\n SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface),\n TransitionEventInterface = assign({}, EventInterface, {\n propertyName: 0,\n elapsedTime: 0,\n pseudoElement: 0\n }),\n SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface),\n WheelEventInterface = assign({}, MouseEventInterface, {\n deltaX: function (event) {\n return \"deltaX\" in event\n ? event.deltaX\n : \"wheelDeltaX\" in event\n ? -event.wheelDeltaX\n : 0;\n },\n deltaY: function (event) {\n return \"deltaY\" in event\n ? event.deltaY\n : \"wheelDeltaY\" in event\n ? -event.wheelDeltaY\n : \"wheelDelta\" in event\n ? -event.wheelDelta\n : 0;\n },\n deltaZ: 0,\n deltaMode: 0\n }),\n SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface),\n ToggleEventInterface = assign({}, EventInterface, {\n newState: 0,\n oldState: 0\n }),\n SyntheticToggleEvent = createSyntheticEvent(ToggleEventInterface),\n END_KEYCODES = [9, 13, 27, 32],\n canUseCompositionEvent = canUseDOM && \"CompositionEvent\" in window,\n documentMode = null;\ncanUseDOM &&\n \"documentMode\" in document &&\n (documentMode = document.documentMode);\nvar canUseTextInputEvent = canUseDOM && \"TextEvent\" in window && !documentMode,\n useFallbackCompositionData =\n canUseDOM &&\n (!canUseCompositionEvent ||\n (documentMode && 8 < documentMode && 11 >= documentMode)),\n SPACEBAR_CHAR = String.fromCharCode(32),\n hasSpaceKeypress = !1;\nfunction isFallbackCompositionEnd(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"keyup\":\n return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);\n case \"keydown\":\n return 229 !== nativeEvent.keyCode;\n case \"keypress\":\n case \"mousedown\":\n case \"focusout\":\n return !0;\n default:\n return !1;\n }\n}\nfunction getDataFromCustomEvent(nativeEvent) {\n nativeEvent = nativeEvent.detail;\n return \"object\" === typeof nativeEvent && \"data\" in nativeEvent\n ? nativeEvent.data\n : null;\n}\nvar isComposing = !1;\nfunction getNativeBeforeInputChars(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"compositionend\":\n return getDataFromCustomEvent(nativeEvent);\n case \"keypress\":\n if (32 !== nativeEvent.which) return null;\n hasSpaceKeypress = !0;\n return SPACEBAR_CHAR;\n case \"textInput\":\n return (\n (domEventName = nativeEvent.data),\n domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName\n );\n default:\n return null;\n }\n}\nfunction getFallbackBeforeInputChars(domEventName, nativeEvent) {\n if (isComposing)\n return \"compositionend\" === domEventName ||\n (!canUseCompositionEvent &&\n isFallbackCompositionEnd(domEventName, nativeEvent))\n ? ((domEventName = getData()),\n (fallbackText = startText = root = null),\n (isComposing = !1),\n domEventName)\n : null;\n switch (domEventName) {\n case \"paste\":\n return null;\n case \"keypress\":\n if (\n !(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) ||\n (nativeEvent.ctrlKey && nativeEvent.altKey)\n ) {\n if (nativeEvent.char && 1 < nativeEvent.char.length)\n return nativeEvent.char;\n if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);\n }\n return null;\n case \"compositionend\":\n return useFallbackCompositionData && \"ko\" !== nativeEvent.locale\n ? null\n : nativeEvent.data;\n default:\n return null;\n }\n}\nvar supportedInputTypes = {\n color: !0,\n date: !0,\n datetime: !0,\n \"datetime-local\": !0,\n email: !0,\n month: !0,\n number: !0,\n password: !0,\n range: !0,\n search: !0,\n tel: !0,\n text: !0,\n time: !0,\n url: !0,\n week: !0\n};\nfunction isTextInputElement(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return \"input\" === nodeName\n ? !!supportedInputTypes[elem.type]\n : \"textarea\" === nodeName\n ? !0\n : !1;\n}\nfunction createAndAccumulateChangeEvent(\n dispatchQueue,\n inst,\n nativeEvent,\n target\n) {\n restoreTarget\n ? restoreQueue\n ? restoreQueue.push(target)\n : (restoreQueue = [target])\n : (restoreTarget = target);\n inst = accumulateTwoPhaseListeners(inst, \"onChange\");\n 0 < inst.length &&\n ((nativeEvent = new SyntheticEvent(\n \"onChange\",\n \"change\",\n null,\n nativeEvent,\n target\n )),\n dispatchQueue.push({ event: nativeEvent, listeners: inst }));\n}\nvar activeElement$1 = null,\n activeElementInst$1 = null;\nfunction runEventInBatch(dispatchQueue) {\n processDispatchQueue(dispatchQueue, 0);\n}\nfunction getInstIfValueChanged(targetInst) {\n var targetNode = getNodeFromInstance(targetInst);\n if (updateValueIfChanged(targetNode)) return targetInst;\n}\nfunction getTargetInstForChangeEvent(domEventName, targetInst) {\n if (\"change\" === domEventName) return targetInst;\n}\nvar isInputEventSupported = !1;\nif (canUseDOM) {\n var JSCompiler_inline_result$jscomp$286;\n if (canUseDOM) {\n var isSupported$jscomp$inline_427 = \"oninput\" in document;\n if (!isSupported$jscomp$inline_427) {\n var element$jscomp$inline_428 = document.createElement(\"div\");\n element$jscomp$inline_428.setAttribute(\"oninput\", \"return;\");\n isSupported$jscomp$inline_427 =\n \"function\" === typeof element$jscomp$inline_428.oninput;\n }\n JSCompiler_inline_result$jscomp$286 = isSupported$jscomp$inline_427;\n } else JSCompiler_inline_result$jscomp$286 = !1;\n isInputEventSupported =\n JSCompiler_inline_result$jscomp$286 &&\n (!document.documentMode || 9 < document.documentMode);\n}\nfunction stopWatchingForValueChange() {\n activeElement$1 &&\n (activeElement$1.detachEvent(\"onpropertychange\", handlePropertyChange),\n (activeElementInst$1 = activeElement$1 = null));\n}\nfunction handlePropertyChange(nativeEvent) {\n if (\n \"value\" === nativeEvent.propertyName &&\n getInstIfValueChanged(activeElementInst$1)\n ) {\n var dispatchQueue = [];\n createAndAccumulateChangeEvent(\n dispatchQueue,\n activeElementInst$1,\n nativeEvent,\n getEventTarget(nativeEvent)\n );\n batchedUpdates$1(runEventInBatch, dispatchQueue);\n }\n}\nfunction handleEventsForInputEventPolyfill(domEventName, target, targetInst) {\n \"focusin\" === domEventName\n ? (stopWatchingForValueChange(),\n (activeElement$1 = target),\n (activeElementInst$1 = targetInst),\n activeElement$1.attachEvent(\"onpropertychange\", handlePropertyChange))\n : \"focusout\" === domEventName && stopWatchingForValueChange();\n}\nfunction getTargetInstForInputEventPolyfill(domEventName) {\n if (\n \"selectionchange\" === domEventName ||\n \"keyup\" === domEventName ||\n \"keydown\" === domEventName\n )\n return getInstIfValueChanged(activeElementInst$1);\n}\nfunction getTargetInstForClickEvent(domEventName, targetInst) {\n if (\"click\" === domEventName) return getInstIfValueChanged(targetInst);\n}\nfunction getTargetInstForInputOrChangeEvent(domEventName, targetInst) {\n if (\"input\" === domEventName || \"change\" === domEventName)\n return getInstIfValueChanged(targetInst);\n}\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is;\nfunction shallowEqual(objA, objB) {\n if (objectIs(objA, objB)) return !0;\n if (\n \"object\" !== typeof objA ||\n null === objA ||\n \"object\" !== typeof objB ||\n null === objB\n )\n return !1;\n var keysA = Object.keys(objA),\n keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return !1;\n for (keysB = 0; keysB < keysA.length; keysB++) {\n var currentKey = keysA[keysB];\n if (\n !hasOwnProperty.call(objB, currentKey) ||\n !objectIs(objA[currentKey], objB[currentKey])\n )\n return !1;\n }\n return !0;\n}\nfunction getLeafNode(node) {\n for (; node && node.firstChild; ) node = node.firstChild;\n return node;\n}\nfunction getNodeForCharacterOffset(root, offset) {\n var node = getLeafNode(root);\n root = 0;\n for (var nodeEnd; node; ) {\n if (3 === node.nodeType) {\n nodeEnd = root + node.textContent.length;\n if (root <= offset && nodeEnd >= offset)\n return { node: node, offset: offset - root };\n root = nodeEnd;\n }\n a: {\n for (; node; ) {\n if (node.nextSibling) {\n node = node.nextSibling;\n break a;\n }\n node = node.parentNode;\n }\n node = void 0;\n }\n node = getLeafNode(node);\n }\n}\nfunction containsNode(outerNode, innerNode) {\n return outerNode && innerNode\n ? outerNode === innerNode\n ? !0\n : outerNode && 3 === outerNode.nodeType\n ? !1\n : innerNode && 3 === innerNode.nodeType\n ? containsNode(outerNode, innerNode.parentNode)\n : \"contains\" in outerNode\n ? outerNode.contains(innerNode)\n : outerNode.compareDocumentPosition\n ? !!(outerNode.compareDocumentPosition(innerNode) & 16)\n : !1\n : !1;\n}\nfunction getActiveElementDeep(containerInfo) {\n containerInfo =\n null != containerInfo &&\n null != containerInfo.ownerDocument &&\n null != containerInfo.ownerDocument.defaultView\n ? containerInfo.ownerDocument.defaultView\n : window;\n for (\n var element = getActiveElement(containerInfo.document);\n element instanceof containerInfo.HTMLIFrameElement;\n\n ) {\n try {\n var JSCompiler_inline_result =\n \"string\" === typeof element.contentWindow.location.href;\n } catch (err) {\n JSCompiler_inline_result = !1;\n }\n if (JSCompiler_inline_result) containerInfo = element.contentWindow;\n else break;\n element = getActiveElement(containerInfo.document);\n }\n return element;\n}\nfunction hasSelectionCapabilities(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return (\n nodeName &&\n ((\"input\" === nodeName &&\n (\"text\" === elem.type ||\n \"search\" === elem.type ||\n \"tel\" === elem.type ||\n \"url\" === elem.type ||\n \"password\" === elem.type)) ||\n \"textarea\" === nodeName ||\n \"true\" === elem.contentEditable)\n );\n}\nvar skipSelectionChangeEvent =\n canUseDOM && \"documentMode\" in document && 11 >= document.documentMode,\n activeElement = null,\n activeElementInst = null,\n lastSelection = null,\n mouseDown = !1;\nfunction constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {\n var doc =\n nativeEventTarget.window === nativeEventTarget\n ? nativeEventTarget.document\n : 9 === nativeEventTarget.nodeType\n ? nativeEventTarget\n : nativeEventTarget.ownerDocument;\n mouseDown ||\n null == activeElement ||\n activeElement !== getActiveElement(doc) ||\n ((doc = activeElement),\n \"selectionStart\" in doc && hasSelectionCapabilities(doc)\n ? (doc = { start: doc.selectionStart, end: doc.selectionEnd })\n : ((doc = (\n (doc.ownerDocument && doc.ownerDocument.defaultView) ||\n window\n ).getSelection()),\n (doc = {\n anchorNode: doc.anchorNode,\n anchorOffset: doc.anchorOffset,\n focusNode: doc.focusNode,\n focusOffset: doc.focusOffset\n })),\n (lastSelection && shallowEqual(lastSelection, doc)) ||\n ((lastSelection = doc),\n (doc = accumulateTwoPhaseListeners(activeElementInst, \"onSelect\")),\n 0 < doc.length &&\n ((nativeEvent = new SyntheticEvent(\n \"onSelect\",\n \"select\",\n null,\n nativeEvent,\n nativeEventTarget\n )),\n dispatchQueue.push({ event: nativeEvent, listeners: doc }),\n (nativeEvent.target = activeElement))));\n}\nfunction makePrefixMap(styleProp, eventName) {\n var prefixes = {};\n prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n prefixes[\"Webkit\" + styleProp] = \"webkit\" + eventName;\n prefixes[\"Moz\" + styleProp] = \"moz\" + eventName;\n return prefixes;\n}\nvar vendorPrefixes = {\n animationend: makePrefixMap(\"Animation\", \"AnimationEnd\"),\n animationiteration: makePrefixMap(\"Animation\", \"AnimationIteration\"),\n animationstart: makePrefixMap(\"Animation\", \"AnimationStart\"),\n transitionrun: makePrefixMap(\"Transition\", \"TransitionRun\"),\n transitionstart: makePrefixMap(\"Transition\", \"TransitionStart\"),\n transitioncancel: makePrefixMap(\"Transition\", \"TransitionCancel\"),\n transitionend: makePrefixMap(\"Transition\", \"TransitionEnd\")\n },\n prefixedEventNames = {},\n style = {};\ncanUseDOM &&\n ((style = document.createElement(\"div\").style),\n \"AnimationEvent\" in window ||\n (delete vendorPrefixes.animationend.animation,\n delete vendorPrefixes.animationiteration.animation,\n delete vendorPrefixes.animationstart.animation),\n \"TransitionEvent\" in window ||\n delete vendorPrefixes.transitionend.transition);\nfunction getVendorPrefixedEventName(eventName) {\n if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];\n if (!vendorPrefixes[eventName]) return eventName;\n var prefixMap = vendorPrefixes[eventName],\n styleProp;\n for (styleProp in prefixMap)\n if (prefixMap.hasOwnProperty(styleProp) && styleProp in style)\n return (prefixedEventNames[eventName] = prefixMap[styleProp]);\n return eventName;\n}\nvar ANIMATION_END = getVendorPrefixedEventName(\"animationend\"),\n ANIMATION_ITERATION = getVendorPrefixedEventName(\"animationiteration\"),\n ANIMATION_START = getVendorPrefixedEventName(\"animationstart\"),\n TRANSITION_RUN = getVendorPrefixedEventName(\"transitionrun\"),\n TRANSITION_START = getVendorPrefixedEventName(\"transitionstart\"),\n TRANSITION_CANCEL = getVendorPrefixedEventName(\"transitioncancel\"),\n TRANSITION_END = getVendorPrefixedEventName(\"transitionend\"),\n topLevelEventsToReactNames = new Map(),\n simpleEventPluginEvents =\n \"abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\n \" \"\n );\nsimpleEventPluginEvents.push(\"scrollEnd\");\nfunction registerSimpleEvent(domEventName, reactName) {\n topLevelEventsToReactNames.set(domEventName, reactName);\n registerTwoPhaseEvent(reactName, [domEventName]);\n}\nvar reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n concurrentQueues = [],\n concurrentQueuesIndex = 0,\n concurrentlyUpdatedLanes = 0;\nfunction finishQueueingConcurrentUpdates() {\n for (\n var endIndex = concurrentQueuesIndex,\n i = (concurrentlyUpdatedLanes = concurrentQueuesIndex = 0);\n i < endIndex;\n\n ) {\n var fiber = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var queue = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var update = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var lane = concurrentQueues[i];\n concurrentQueues[i++] = null;\n if (null !== queue && null !== update) {\n var pending = queue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n queue.pending = update;\n }\n 0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane);\n }\n}\nfunction enqueueUpdate$1(fiber, queue, update, lane) {\n concurrentQueues[concurrentQueuesIndex++] = fiber;\n concurrentQueues[concurrentQueuesIndex++] = queue;\n concurrentQueues[concurrentQueuesIndex++] = update;\n concurrentQueues[concurrentQueuesIndex++] = lane;\n concurrentlyUpdatedLanes |= lane;\n fiber.lanes |= lane;\n fiber = fiber.alternate;\n null !== fiber && (fiber.lanes |= lane);\n}\nfunction enqueueConcurrentHookUpdate(fiber, queue, update, lane) {\n enqueueUpdate$1(fiber, queue, update, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction enqueueConcurrentRenderForLane(fiber, lane) {\n enqueueUpdate$1(fiber, null, null, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) {\n sourceFiber.lanes |= lane;\n var alternate = sourceFiber.alternate;\n null !== alternate && (alternate.lanes |= lane);\n for (var isHidden = !1, parent = sourceFiber.return; null !== parent; )\n (parent.childLanes |= lane),\n (alternate = parent.alternate),\n null !== alternate && (alternate.childLanes |= lane),\n 22 === parent.tag &&\n ((sourceFiber = parent.stateNode),\n null === sourceFiber || sourceFiber._visibility & 1 || (isHidden = !0)),\n (sourceFiber = parent),\n (parent = parent.return);\n return 3 === sourceFiber.tag\n ? ((parent = sourceFiber.stateNode),\n isHidden &&\n null !== update &&\n ((isHidden = 31 - clz32(lane)),\n (sourceFiber = parent.hiddenUpdates),\n (alternate = sourceFiber[isHidden]),\n null === alternate\n ? (sourceFiber[isHidden] = [update])\n : alternate.push(update),\n (update.lane = lane | 536870912)),\n parent)\n : null;\n}\nfunction getRootForUpdatedFiber(sourceFiber) {\n if (50 < nestedUpdateCount)\n throw (\n ((nestedUpdateCount = 0),\n (rootWithNestedUpdates = null),\n Error(formatProdErrorMessage(185)))\n );\n for (var parent = sourceFiber.return; null !== parent; )\n (sourceFiber = parent), (parent = sourceFiber.return);\n return 3 === sourceFiber.tag ? sourceFiber.stateNode : null;\n}\nvar emptyContextObject = {};\nfunction FiberNode(tag, pendingProps, key, mode) {\n this.tag = tag;\n this.key = key;\n this.sibling =\n this.child =\n this.return =\n this.stateNode =\n this.type =\n this.elementType =\n null;\n this.index = 0;\n this.refCleanup = this.ref = null;\n this.pendingProps = pendingProps;\n this.dependencies =\n this.memoizedState =\n this.updateQueue =\n this.memoizedProps =\n null;\n this.mode = mode;\n this.subtreeFlags = this.flags = 0;\n this.deletions = null;\n this.childLanes = this.lanes = 0;\n this.alternate = null;\n}\nfunction createFiberImplClass(tag, pendingProps, key, mode) {\n return new FiberNode(tag, pendingProps, key, mode);\n}\nfunction shouldConstruct(Component) {\n Component = Component.prototype;\n return !(!Component || !Component.isReactComponent);\n}\nfunction createWorkInProgress(current, pendingProps) {\n var workInProgress = current.alternate;\n null === workInProgress\n ? ((workInProgress = createFiberImplClass(\n current.tag,\n pendingProps,\n current.key,\n current.mode\n )),\n (workInProgress.elementType = current.elementType),\n (workInProgress.type = current.type),\n (workInProgress.stateNode = current.stateNode),\n (workInProgress.alternate = current),\n (current.alternate = workInProgress))\n : ((workInProgress.pendingProps = pendingProps),\n (workInProgress.type = current.type),\n (workInProgress.flags = 0),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.deletions = null));\n workInProgress.flags = current.flags & 65011712;\n workInProgress.childLanes = current.childLanes;\n workInProgress.lanes = current.lanes;\n workInProgress.child = current.child;\n workInProgress.memoizedProps = current.memoizedProps;\n workInProgress.memoizedState = current.memoizedState;\n workInProgress.updateQueue = current.updateQueue;\n pendingProps = current.dependencies;\n workInProgress.dependencies =\n null === pendingProps\n ? null\n : { lanes: pendingProps.lanes, firstContext: pendingProps.firstContext };\n workInProgress.sibling = current.sibling;\n workInProgress.index = current.index;\n workInProgress.ref = current.ref;\n workInProgress.refCleanup = current.refCleanup;\n return workInProgress;\n}\nfunction resetWorkInProgress(workInProgress, renderLanes) {\n workInProgress.flags &= 65011714;\n var current = workInProgress.alternate;\n null === current\n ? ((workInProgress.childLanes = 0),\n (workInProgress.lanes = renderLanes),\n (workInProgress.child = null),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.memoizedProps = null),\n (workInProgress.memoizedState = null),\n (workInProgress.updateQueue = null),\n (workInProgress.dependencies = null),\n (workInProgress.stateNode = null))\n : ((workInProgress.childLanes = current.childLanes),\n (workInProgress.lanes = current.lanes),\n (workInProgress.child = current.child),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.deletions = null),\n (workInProgress.memoizedProps = current.memoizedProps),\n (workInProgress.memoizedState = current.memoizedState),\n (workInProgress.updateQueue = current.updateQueue),\n (workInProgress.type = current.type),\n (renderLanes = current.dependencies),\n (workInProgress.dependencies =\n null === renderLanes\n ? null\n : {\n lanes: renderLanes.lanes,\n firstContext: renderLanes.firstContext\n }));\n return workInProgress;\n}\nfunction createFiberFromTypeAndProps(\n type,\n key,\n pendingProps,\n owner,\n mode,\n lanes\n) {\n var fiberTag = 0;\n owner = type;\n if (\"function\" === typeof type) shouldConstruct(type) && (fiberTag = 1);\n else if (\"string\" === typeof type)\n fiberTag = isHostHoistableType(\n type,\n pendingProps,\n contextStackCursor.current\n )\n ? 26\n : \"html\" === type || \"head\" === type || \"body\" === type\n ? 27\n : 5;\n else\n a: switch (type) {\n case REACT_ACTIVITY_TYPE:\n return (\n (type = createFiberImplClass(31, pendingProps, key, mode)),\n (type.elementType = REACT_ACTIVITY_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_FRAGMENT_TYPE:\n return createFiberFromFragment(pendingProps.children, mode, lanes, key);\n case REACT_STRICT_MODE_TYPE:\n fiberTag = 8;\n mode |= 24;\n break;\n case REACT_PROFILER_TYPE:\n return (\n (type = createFiberImplClass(12, pendingProps, key, mode | 2)),\n (type.elementType = REACT_PROFILER_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_SUSPENSE_TYPE:\n return (\n (type = createFiberImplClass(13, pendingProps, key, mode)),\n (type.elementType = REACT_SUSPENSE_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_SUSPENSE_LIST_TYPE:\n return (\n (type = createFiberImplClass(19, pendingProps, key, mode)),\n (type.elementType = REACT_SUSPENSE_LIST_TYPE),\n (type.lanes = lanes),\n type\n );\n default:\n if (\"object\" === typeof type && null !== type)\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n fiberTag = 10;\n break a;\n case REACT_CONSUMER_TYPE:\n fiberTag = 9;\n break a;\n case REACT_FORWARD_REF_TYPE:\n fiberTag = 11;\n break a;\n case REACT_MEMO_TYPE:\n fiberTag = 14;\n break a;\n case REACT_LAZY_TYPE:\n fiberTag = 16;\n owner = null;\n break a;\n }\n fiberTag = 29;\n pendingProps = Error(\n formatProdErrorMessage(130, null === type ? \"null\" : typeof type, \"\")\n );\n owner = null;\n }\n key = createFiberImplClass(fiberTag, pendingProps, key, mode);\n key.elementType = type;\n key.type = owner;\n key.lanes = lanes;\n return key;\n}\nfunction createFiberFromFragment(elements, mode, lanes, key) {\n elements = createFiberImplClass(7, elements, key, mode);\n elements.lanes = lanes;\n return elements;\n}\nfunction createFiberFromText(content, mode, lanes) {\n content = createFiberImplClass(6, content, null, mode);\n content.lanes = lanes;\n return content;\n}\nfunction createFiberFromDehydratedFragment(dehydratedNode) {\n var fiber = createFiberImplClass(18, null, null, 0);\n fiber.stateNode = dehydratedNode;\n return fiber;\n}\nfunction createFiberFromPortal(portal, mode, lanes) {\n mode = createFiberImplClass(\n 4,\n null !== portal.children ? portal.children : [],\n portal.key,\n mode\n );\n mode.lanes = lanes;\n mode.stateNode = {\n containerInfo: portal.containerInfo,\n pendingChildren: null,\n implementation: portal.implementation\n };\n return mode;\n}\nvar CapturedStacks = new WeakMap();\nfunction createCapturedValueAtFiber(value, source) {\n if (\"object\" === typeof value && null !== value) {\n var existing = CapturedStacks.get(value);\n if (void 0 !== existing) return existing;\n source = {\n value: value,\n source: source,\n stack: getStackByFiberInDevAndProd(source)\n };\n CapturedStacks.set(value, source);\n return source;\n }\n return {\n value: value,\n source: source,\n stack: getStackByFiberInDevAndProd(source)\n };\n}\nvar forkStack = [],\n forkStackIndex = 0,\n treeForkProvider = null,\n treeForkCount = 0,\n idStack = [],\n idStackIndex = 0,\n treeContextProvider = null,\n treeContextId = 1,\n treeContextOverflow = \"\";\nfunction pushTreeFork(workInProgress, totalChildren) {\n forkStack[forkStackIndex++] = treeForkCount;\n forkStack[forkStackIndex++] = treeForkProvider;\n treeForkProvider = workInProgress;\n treeForkCount = totalChildren;\n}\nfunction pushTreeId(workInProgress, totalChildren, index) {\n idStack[idStackIndex++] = treeContextId;\n idStack[idStackIndex++] = treeContextOverflow;\n idStack[idStackIndex++] = treeContextProvider;\n treeContextProvider = workInProgress;\n var baseIdWithLeadingBit = treeContextId;\n workInProgress = treeContextOverflow;\n var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1;\n baseIdWithLeadingBit &= ~(1 << baseLength);\n index += 1;\n var length = 32 - clz32(totalChildren) + baseLength;\n if (30 < length) {\n var numberOfOverflowBits = baseLength - (baseLength % 5);\n length = (\n baseIdWithLeadingBit &\n ((1 << numberOfOverflowBits) - 1)\n ).toString(32);\n baseIdWithLeadingBit >>= numberOfOverflowBits;\n baseLength -= numberOfOverflowBits;\n treeContextId =\n (1 << (32 - clz32(totalChildren) + baseLength)) |\n (index << baseLength) |\n baseIdWithLeadingBit;\n treeContextOverflow = length + workInProgress;\n } else\n (treeContextId =\n (1 << length) | (index << baseLength) | baseIdWithLeadingBit),\n (treeContextOverflow = workInProgress);\n}\nfunction pushMaterializedTreeId(workInProgress) {\n null !== workInProgress.return &&\n (pushTreeFork(workInProgress, 1), pushTreeId(workInProgress, 1, 0));\n}\nfunction popTreeContext(workInProgress) {\n for (; workInProgress === treeForkProvider; )\n (treeForkProvider = forkStack[--forkStackIndex]),\n (forkStack[forkStackIndex] = null),\n (treeForkCount = forkStack[--forkStackIndex]),\n (forkStack[forkStackIndex] = null);\n for (; workInProgress === treeContextProvider; )\n (treeContextProvider = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null),\n (treeContextOverflow = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null),\n (treeContextId = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null);\n}\nfunction restoreSuspendedTreeContext(workInProgress, suspendedContext) {\n idStack[idStackIndex++] = treeContextId;\n idStack[idStackIndex++] = treeContextOverflow;\n idStack[idStackIndex++] = treeContextProvider;\n treeContextId = suspendedContext.id;\n treeContextOverflow = suspendedContext.overflow;\n treeContextProvider = workInProgress;\n}\nvar hydrationParentFiber = null,\n nextHydratableInstance = null,\n isHydrating = !1,\n hydrationErrors = null,\n rootOrSingletonContext = !1,\n HydrationMismatchException = Error(formatProdErrorMessage(519));\nfunction throwOnHydrationMismatch(fiber) {\n var error = Error(\n formatProdErrorMessage(\n 418,\n 1 < arguments.length && void 0 !== arguments[1] && arguments[1]\n ? \"text\"\n : \"HTML\",\n \"\"\n )\n );\n queueHydrationError(createCapturedValueAtFiber(error, fiber));\n throw HydrationMismatchException;\n}\nfunction prepareToHydrateHostInstance(fiber) {\n var instance = fiber.stateNode,\n type = fiber.type,\n props = fiber.memoizedProps;\n instance[internalInstanceKey] = fiber;\n instance[internalPropsKey] = props;\n switch (type) {\n case \"dialog\":\n listenToNonDelegatedEvent(\"cancel\", instance);\n listenToNonDelegatedEvent(\"close\", instance);\n break;\n case \"iframe\":\n case \"object\":\n case \"embed\":\n listenToNonDelegatedEvent(\"load\", instance);\n break;\n case \"video\":\n case \"audio\":\n for (type = 0; type < mediaEventTypes.length; type++)\n listenToNonDelegatedEvent(mediaEventTypes[type], instance);\n break;\n case \"source\":\n listenToNonDelegatedEvent(\"error\", instance);\n break;\n case \"img\":\n case \"image\":\n case \"link\":\n listenToNonDelegatedEvent(\"error\", instance);\n listenToNonDelegatedEvent(\"load\", instance);\n break;\n case \"details\":\n listenToNonDelegatedEvent(\"toggle\", instance);\n break;\n case \"input\":\n listenToNonDelegatedEvent(\"invalid\", instance);\n initInput(\n instance,\n props.value,\n props.defaultValue,\n props.checked,\n props.defaultChecked,\n props.type,\n props.name,\n !0\n );\n break;\n case \"select\":\n listenToNonDelegatedEvent(\"invalid\", instance);\n break;\n case \"textarea\":\n listenToNonDelegatedEvent(\"invalid\", instance),\n initTextarea(instance, props.value, props.defaultValue, props.children);\n }\n type = props.children;\n (\"string\" !== typeof type &&\n \"number\" !== typeof type &&\n \"bigint\" !== typeof type) ||\n instance.textContent === \"\" + type ||\n !0 === props.suppressHydrationWarning ||\n checkForUnmatchedText(instance.textContent, type)\n ? (null != props.popover &&\n (listenToNonDelegatedEvent(\"beforetoggle\", instance),\n listenToNonDelegatedEvent(\"toggle\", instance)),\n null != props.onScroll && listenToNonDelegatedEvent(\"scroll\", instance),\n null != props.onScrollEnd &&\n listenToNonDelegatedEvent(\"scrollend\", instance),\n null != props.onClick && (instance.onclick = noop$1),\n (instance = !0))\n : (instance = !1);\n instance || throwOnHydrationMismatch(fiber, !0);\n}\nfunction popToNextHostParent(fiber) {\n for (hydrationParentFiber = fiber.return; hydrationParentFiber; )\n switch (hydrationParentFiber.tag) {\n case 5:\n case 31:\n case 13:\n rootOrSingletonContext = !1;\n return;\n case 27:\n case 3:\n rootOrSingletonContext = !0;\n return;\n default:\n hydrationParentFiber = hydrationParentFiber.return;\n }\n}\nfunction popHydrationState(fiber) {\n if (fiber !== hydrationParentFiber) return !1;\n if (!isHydrating) return popToNextHostParent(fiber), (isHydrating = !0), !1;\n var tag = fiber.tag,\n JSCompiler_temp;\n if ((JSCompiler_temp = 3 !== tag && 27 !== tag)) {\n if ((JSCompiler_temp = 5 === tag))\n (JSCompiler_temp = fiber.type),\n (JSCompiler_temp =\n !(\"form\" !== JSCompiler_temp && \"button\" !== JSCompiler_temp) ||\n shouldSetTextContent(fiber.type, fiber.memoizedProps));\n JSCompiler_temp = !JSCompiler_temp;\n }\n JSCompiler_temp && nextHydratableInstance && throwOnHydrationMismatch(fiber);\n popToNextHostParent(fiber);\n if (13 === tag) {\n fiber = fiber.memoizedState;\n fiber = null !== fiber ? fiber.dehydrated : null;\n if (!fiber) throw Error(formatProdErrorMessage(317));\n nextHydratableInstance =\n getNextHydratableInstanceAfterHydrationBoundary(fiber);\n } else if (31 === tag) {\n fiber = fiber.memoizedState;\n fiber = null !== fiber ? fiber.dehydrated : null;\n if (!fiber) throw Error(formatProdErrorMessage(317));\n nextHydratableInstance =\n getNextHydratableInstanceAfterHydrationBoundary(fiber);\n } else\n 27 === tag\n ? ((tag = nextHydratableInstance),\n isSingletonScope(fiber.type)\n ? ((fiber = previousHydratableOnEnteringScopedSingleton),\n (previousHydratableOnEnteringScopedSingleton = null),\n (nextHydratableInstance = fiber))\n : (nextHydratableInstance = tag))\n : (nextHydratableInstance = hydrationParentFiber\n ? getNextHydratable(fiber.stateNode.nextSibling)\n : null);\n return !0;\n}\nfunction resetHydrationState() {\n nextHydratableInstance = hydrationParentFiber = null;\n isHydrating = !1;\n}\nfunction upgradeHydrationErrorsToRecoverable() {\n var queuedErrors = hydrationErrors;\n null !== queuedErrors &&\n (null === workInProgressRootRecoverableErrors\n ? (workInProgressRootRecoverableErrors = queuedErrors)\n : workInProgressRootRecoverableErrors.push.apply(\n workInProgressRootRecoverableErrors,\n queuedErrors\n ),\n (hydrationErrors = null));\n return queuedErrors;\n}\nfunction queueHydrationError(error) {\n null === hydrationErrors\n ? (hydrationErrors = [error])\n : hydrationErrors.push(error);\n}\nvar valueCursor = createCursor(null),\n currentlyRenderingFiber$1 = null,\n lastContextDependency = null;\nfunction pushProvider(providerFiber, context, nextValue) {\n push(valueCursor, context._currentValue);\n context._currentValue = nextValue;\n}\nfunction popProvider(context) {\n context._currentValue = valueCursor.current;\n pop(valueCursor);\n}\nfunction scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {\n for (; null !== parent; ) {\n var alternate = parent.alternate;\n (parent.childLanes & renderLanes) !== renderLanes\n ? ((parent.childLanes |= renderLanes),\n null !== alternate && (alternate.childLanes |= renderLanes))\n : null !== alternate &&\n (alternate.childLanes & renderLanes) !== renderLanes &&\n (alternate.childLanes |= renderLanes);\n if (parent === propagationRoot) break;\n parent = parent.return;\n }\n}\nfunction propagateContextChanges(\n workInProgress,\n contexts,\n renderLanes,\n forcePropagateEntireTree\n) {\n var fiber = workInProgress.child;\n null !== fiber && (fiber.return = workInProgress);\n for (; null !== fiber; ) {\n var list = fiber.dependencies;\n if (null !== list) {\n var nextFiber = fiber.child;\n list = list.firstContext;\n a: for (; null !== list; ) {\n var dependency = list;\n list = fiber;\n for (var i = 0; i < contexts.length; i++)\n if (dependency.context === contexts[i]) {\n list.lanes |= renderLanes;\n dependency = list.alternate;\n null !== dependency && (dependency.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(\n list.return,\n renderLanes,\n workInProgress\n );\n forcePropagateEntireTree || (nextFiber = null);\n break a;\n }\n list = dependency.next;\n }\n } else if (18 === fiber.tag) {\n nextFiber = fiber.return;\n if (null === nextFiber) throw Error(formatProdErrorMessage(341));\n nextFiber.lanes |= renderLanes;\n list = nextFiber.alternate;\n null !== list && (list.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress);\n nextFiber = null;\n } else nextFiber = fiber.child;\n if (null !== nextFiber) nextFiber.return = fiber;\n else\n for (nextFiber = fiber; null !== nextFiber; ) {\n if (nextFiber === workInProgress) {\n nextFiber = null;\n break;\n }\n fiber = nextFiber.sibling;\n if (null !== fiber) {\n fiber.return = nextFiber.return;\n nextFiber = fiber;\n break;\n }\n nextFiber = nextFiber.return;\n }\n fiber = nextFiber;\n }\n}\nfunction propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n forcePropagateEntireTree\n) {\n current = null;\n for (\n var parent = workInProgress, isInsidePropagationBailout = !1;\n null !== parent;\n\n ) {\n if (!isInsidePropagationBailout)\n if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = !0;\n else if (0 !== (parent.flags & 262144)) break;\n if (10 === parent.tag) {\n var currentParent = parent.alternate;\n if (null === currentParent) throw Error(formatProdErrorMessage(387));\n currentParent = currentParent.memoizedProps;\n if (null !== currentParent) {\n var context = parent.type;\n objectIs(parent.pendingProps.value, currentParent.value) ||\n (null !== current ? current.push(context) : (current = [context]));\n }\n } else if (parent === hostTransitionProviderCursor.current) {\n currentParent = parent.alternate;\n if (null === currentParent) throw Error(formatProdErrorMessage(387));\n currentParent.memoizedState.memoizedState !==\n parent.memoizedState.memoizedState &&\n (null !== current\n ? current.push(HostTransitionContext)\n : (current = [HostTransitionContext]));\n }\n parent = parent.return;\n }\n null !== current &&\n propagateContextChanges(\n workInProgress,\n current,\n renderLanes,\n forcePropagateEntireTree\n );\n workInProgress.flags |= 262144;\n}\nfunction checkIfContextChanged(currentDependencies) {\n for (\n currentDependencies = currentDependencies.firstContext;\n null !== currentDependencies;\n\n ) {\n if (\n !objectIs(\n currentDependencies.context._currentValue,\n currentDependencies.memoizedValue\n )\n )\n return !0;\n currentDependencies = currentDependencies.next;\n }\n return !1;\n}\nfunction prepareToReadContext(workInProgress) {\n currentlyRenderingFiber$1 = workInProgress;\n lastContextDependency = null;\n workInProgress = workInProgress.dependencies;\n null !== workInProgress && (workInProgress.firstContext = null);\n}\nfunction readContext(context) {\n return readContextForConsumer(currentlyRenderingFiber$1, context);\n}\nfunction readContextDuringReconciliation(consumer, context) {\n null === currentlyRenderingFiber$1 && prepareToReadContext(consumer);\n return readContextForConsumer(consumer, context);\n}\nfunction readContextForConsumer(consumer, context) {\n var value = context._currentValue;\n context = { context: context, memoizedValue: value, next: null };\n if (null === lastContextDependency) {\n if (null === consumer) throw Error(formatProdErrorMessage(308));\n lastContextDependency = context;\n consumer.dependencies = { lanes: 0, firstContext: context };\n consumer.flags |= 524288;\n } else lastContextDependency = lastContextDependency.next = context;\n return value;\n}\nvar AbortControllerLocal =\n \"undefined\" !== typeof AbortController\n ? AbortController\n : function () {\n var listeners = [],\n signal = (this.signal = {\n aborted: !1,\n addEventListener: function (type, listener) {\n listeners.push(listener);\n }\n });\n this.abort = function () {\n signal.aborted = !0;\n listeners.forEach(function (listener) {\n return listener();\n });\n };\n },\n scheduleCallback$2 = Scheduler.unstable_scheduleCallback,\n NormalPriority = Scheduler.unstable_NormalPriority,\n CacheContext = {\n $$typeof: REACT_CONTEXT_TYPE,\n Consumer: null,\n Provider: null,\n _currentValue: null,\n _currentValue2: null,\n _threadCount: 0\n };\nfunction createCache() {\n return {\n controller: new AbortControllerLocal(),\n data: new Map(),\n refCount: 0\n };\n}\nfunction releaseCache(cache) {\n cache.refCount--;\n 0 === cache.refCount &&\n scheduleCallback$2(NormalPriority, function () {\n cache.controller.abort();\n });\n}\nvar currentEntangledListeners = null,\n currentEntangledPendingCount = 0,\n currentEntangledLane = 0,\n currentEntangledActionThenable = null;\nfunction entangleAsyncAction(transition, thenable) {\n if (null === currentEntangledListeners) {\n var entangledListeners = (currentEntangledListeners = []);\n currentEntangledPendingCount = 0;\n currentEntangledLane = requestTransitionLane();\n currentEntangledActionThenable = {\n status: \"pending\",\n value: void 0,\n then: function (resolve) {\n entangledListeners.push(resolve);\n }\n };\n }\n currentEntangledPendingCount++;\n thenable.then(pingEngtangledActionScope, pingEngtangledActionScope);\n return thenable;\n}\nfunction pingEngtangledActionScope() {\n if (\n 0 === --currentEntangledPendingCount &&\n null !== currentEntangledListeners\n ) {\n null !== currentEntangledActionThenable &&\n (currentEntangledActionThenable.status = \"fulfilled\");\n var listeners = currentEntangledListeners;\n currentEntangledListeners = null;\n currentEntangledLane = 0;\n currentEntangledActionThenable = null;\n for (var i = 0; i < listeners.length; i++) (0, listeners[i])();\n }\n}\nfunction chainThenableValue(thenable, result) {\n var listeners = [],\n thenableWithOverride = {\n status: \"pending\",\n value: null,\n reason: null,\n then: function (resolve) {\n listeners.push(resolve);\n }\n };\n thenable.then(\n function () {\n thenableWithOverride.status = \"fulfilled\";\n thenableWithOverride.value = result;\n for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result);\n },\n function (error) {\n thenableWithOverride.status = \"rejected\";\n thenableWithOverride.reason = error;\n for (error = 0; error < listeners.length; error++)\n (0, listeners[error])(void 0);\n }\n );\n return thenableWithOverride;\n}\nvar prevOnStartTransitionFinish = ReactSharedInternals.S;\nReactSharedInternals.S = function (transition, returnValue) {\n globalMostRecentTransitionTime = now();\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n entangleAsyncAction(transition, returnValue);\n null !== prevOnStartTransitionFinish &&\n prevOnStartTransitionFinish(transition, returnValue);\n};\nvar resumedCache = createCursor(null);\nfunction peekCacheFromPool() {\n var cacheResumedFromPreviousRender = resumedCache.current;\n return null !== cacheResumedFromPreviousRender\n ? cacheResumedFromPreviousRender\n : workInProgressRoot.pooledCache;\n}\nfunction pushTransition(offscreenWorkInProgress, prevCachePool) {\n null === prevCachePool\n ? push(resumedCache, resumedCache.current)\n : push(resumedCache, prevCachePool.pool);\n}\nfunction getSuspendedCache() {\n var cacheFromPool = peekCacheFromPool();\n return null === cacheFromPool\n ? null\n : { parent: CacheContext._currentValue, pool: cacheFromPool };\n}\nvar SuspenseException = Error(formatProdErrorMessage(460)),\n SuspenseyCommitException = Error(formatProdErrorMessage(474)),\n SuspenseActionException = Error(formatProdErrorMessage(542)),\n noopSuspenseyCommitThenable = { then: function () {} };\nfunction isThenableResolved(thenable) {\n thenable = thenable.status;\n return \"fulfilled\" === thenable || \"rejected\" === thenable;\n}\nfunction trackUsedThenable(thenableState, thenable, index) {\n index = thenableState[index];\n void 0 === index\n ? thenableState.push(thenable)\n : index !== thenable && (thenable.then(noop$1, noop$1), (thenable = index));\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw (\n ((thenableState = thenable.reason),\n checkIfUseWrappedInAsyncCatch(thenableState),\n thenableState)\n );\n default:\n if (\"string\" === typeof thenable.status) thenable.then(noop$1, noop$1);\n else {\n thenableState = workInProgressRoot;\n if (null !== thenableState && 100 < thenableState.shellSuspendCounter)\n throw Error(formatProdErrorMessage(482));\n thenableState = thenable;\n thenableState.status = \"pending\";\n thenableState.then(\n function (fulfilledValue) {\n if (\"pending\" === thenable.status) {\n var fulfilledThenable = thenable;\n fulfilledThenable.status = \"fulfilled\";\n fulfilledThenable.value = fulfilledValue;\n }\n },\n function (error) {\n if (\"pending\" === thenable.status) {\n var rejectedThenable = thenable;\n rejectedThenable.status = \"rejected\";\n rejectedThenable.reason = error;\n }\n }\n );\n }\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw (\n ((thenableState = thenable.reason),\n checkIfUseWrappedInAsyncCatch(thenableState),\n thenableState)\n );\n }\n suspendedThenable = thenable;\n throw SuspenseException;\n }\n}\nfunction resolveLazy(lazyType) {\n try {\n var init = lazyType._init;\n return init(lazyType._payload);\n } catch (x) {\n if (null !== x && \"object\" === typeof x && \"function\" === typeof x.then)\n throw ((suspendedThenable = x), SuspenseException);\n throw x;\n }\n}\nvar suspendedThenable = null;\nfunction getSuspendedThenable() {\n if (null === suspendedThenable) throw Error(formatProdErrorMessage(459));\n var thenable = suspendedThenable;\n suspendedThenable = null;\n return thenable;\n}\nfunction checkIfUseWrappedInAsyncCatch(rejectedReason) {\n if (\n rejectedReason === SuspenseException ||\n rejectedReason === SuspenseActionException\n )\n throw Error(formatProdErrorMessage(483));\n}\nvar thenableState$1 = null,\n thenableIndexCounter$1 = 0;\nfunction unwrapThenable(thenable) {\n var index = thenableIndexCounter$1;\n thenableIndexCounter$1 += 1;\n null === thenableState$1 && (thenableState$1 = []);\n return trackUsedThenable(thenableState$1, thenable, index);\n}\nfunction coerceRef(workInProgress, element) {\n element = element.props.ref;\n workInProgress.ref = void 0 !== element ? element : null;\n}\nfunction throwOnInvalidObjectTypeImpl(returnFiber, newChild) {\n if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE)\n throw Error(formatProdErrorMessage(525));\n returnFiber = Object.prototype.toString.call(newChild);\n throw Error(\n formatProdErrorMessage(\n 31,\n \"[object Object]\" === returnFiber\n ? \"object with keys {\" + Object.keys(newChild).join(\", \") + \"}\"\n : returnFiber\n )\n );\n}\nfunction createChildReconciler(shouldTrackSideEffects) {\n function deleteChild(returnFiber, childToDelete) {\n if (shouldTrackSideEffects) {\n var deletions = returnFiber.deletions;\n null === deletions\n ? ((returnFiber.deletions = [childToDelete]), (returnFiber.flags |= 16))\n : deletions.push(childToDelete);\n }\n }\n function deleteRemainingChildren(returnFiber, currentFirstChild) {\n if (!shouldTrackSideEffects) return null;\n for (; null !== currentFirstChild; )\n deleteChild(returnFiber, currentFirstChild),\n (currentFirstChild = currentFirstChild.sibling);\n return null;\n }\n function mapRemainingChildren(currentFirstChild) {\n for (var existingChildren = new Map(); null !== currentFirstChild; )\n null !== currentFirstChild.key\n ? existingChildren.set(currentFirstChild.key, currentFirstChild)\n : existingChildren.set(currentFirstChild.index, currentFirstChild),\n (currentFirstChild = currentFirstChild.sibling);\n return existingChildren;\n }\n function useFiber(fiber, pendingProps) {\n fiber = createWorkInProgress(fiber, pendingProps);\n fiber.index = 0;\n fiber.sibling = null;\n return fiber;\n }\n function placeChild(newFiber, lastPlacedIndex, newIndex) {\n newFiber.index = newIndex;\n if (!shouldTrackSideEffects)\n return (newFiber.flags |= 1048576), lastPlacedIndex;\n newIndex = newFiber.alternate;\n if (null !== newIndex)\n return (\n (newIndex = newIndex.index),\n newIndex < lastPlacedIndex\n ? ((newFiber.flags |= 67108866), lastPlacedIndex)\n : newIndex\n );\n newFiber.flags |= 67108866;\n return lastPlacedIndex;\n }\n function placeSingleChild(newFiber) {\n shouldTrackSideEffects &&\n null === newFiber.alternate &&\n (newFiber.flags |= 67108866);\n return newFiber;\n }\n function updateTextNode(returnFiber, current, textContent, lanes) {\n if (null === current || 6 !== current.tag)\n return (\n (current = createFiberFromText(textContent, returnFiber.mode, lanes)),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, textContent);\n current.return = returnFiber;\n return current;\n }\n function updateElement(returnFiber, current, element, lanes) {\n var elementType = element.type;\n if (elementType === REACT_FRAGMENT_TYPE)\n return updateFragment(\n returnFiber,\n current,\n element.props.children,\n lanes,\n element.key\n );\n if (\n null !== current &&\n (current.elementType === elementType ||\n (\"object\" === typeof elementType &&\n null !== elementType &&\n elementType.$$typeof === REACT_LAZY_TYPE &&\n resolveLazy(elementType) === current.type))\n )\n return (\n (current = useFiber(current, element.props)),\n coerceRef(current, element),\n (current.return = returnFiber),\n current\n );\n current = createFiberFromTypeAndProps(\n element.type,\n element.key,\n element.props,\n null,\n returnFiber.mode,\n lanes\n );\n coerceRef(current, element);\n current.return = returnFiber;\n return current;\n }\n function updatePortal(returnFiber, current, portal, lanes) {\n if (\n null === current ||\n 4 !== current.tag ||\n current.stateNode.containerInfo !== portal.containerInfo ||\n current.stateNode.implementation !== portal.implementation\n )\n return (\n (current = createFiberFromPortal(portal, returnFiber.mode, lanes)),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, portal.children || []);\n current.return = returnFiber;\n return current;\n }\n function updateFragment(returnFiber, current, fragment, lanes, key) {\n if (null === current || 7 !== current.tag)\n return (\n (current = createFiberFromFragment(\n fragment,\n returnFiber.mode,\n lanes,\n key\n )),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, fragment);\n current.return = returnFiber;\n return current;\n }\n function createChild(returnFiber, newChild, lanes) {\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return (\n (newChild = createFiberFromText(\n \"\" + newChild,\n returnFiber.mode,\n lanes\n )),\n (newChild.return = returnFiber),\n newChild\n );\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return (\n (lanes = createFiberFromTypeAndProps(\n newChild.type,\n newChild.key,\n newChild.props,\n null,\n returnFiber.mode,\n lanes\n )),\n coerceRef(lanes, newChild),\n (lanes.return = returnFiber),\n lanes\n );\n case REACT_PORTAL_TYPE:\n return (\n (newChild = createFiberFromPortal(\n newChild,\n returnFiber.mode,\n lanes\n )),\n (newChild.return = returnFiber),\n newChild\n );\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n createChild(returnFiber, newChild, lanes)\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return (\n (newChild = createFiberFromFragment(\n newChild,\n returnFiber.mode,\n lanes,\n null\n )),\n (newChild.return = returnFiber),\n newChild\n );\n if (\"function\" === typeof newChild.then)\n return createChild(returnFiber, unwrapThenable(newChild), lanes);\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return createChild(\n returnFiber,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function updateSlot(returnFiber, oldFiber, newChild, lanes) {\n var key = null !== oldFiber ? oldFiber.key : null;\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return null !== key\n ? null\n : updateTextNode(returnFiber, oldFiber, \"\" + newChild, lanes);\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return newChild.key === key\n ? updateElement(returnFiber, oldFiber, newChild, lanes)\n : null;\n case REACT_PORTAL_TYPE:\n return newChild.key === key\n ? updatePortal(returnFiber, oldFiber, newChild, lanes)\n : null;\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n updateSlot(returnFiber, oldFiber, newChild, lanes)\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return null !== key\n ? null\n : updateFragment(returnFiber, oldFiber, newChild, lanes, null);\n if (\"function\" === typeof newChild.then)\n return updateSlot(\n returnFiber,\n oldFiber,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return updateSlot(\n returnFiber,\n oldFiber,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n newChild,\n lanes\n ) {\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return (\n (existingChildren = existingChildren.get(newIdx) || null),\n updateTextNode(returnFiber, existingChildren, \"\" + newChild, lanes)\n );\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return (\n (existingChildren =\n existingChildren.get(\n null === newChild.key ? newIdx : newChild.key\n ) || null),\n updateElement(returnFiber, existingChildren, newChild, lanes)\n );\n case REACT_PORTAL_TYPE:\n return (\n (existingChildren =\n existingChildren.get(\n null === newChild.key ? newIdx : newChild.key\n ) || null),\n updatePortal(returnFiber, existingChildren, newChild, lanes)\n );\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n newChild,\n lanes\n )\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return (\n (existingChildren = existingChildren.get(newIdx) || null),\n updateFragment(returnFiber, existingChildren, newChild, lanes, null)\n );\n if (\"function\" === typeof newChild.then)\n return updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function reconcileChildrenArray(\n returnFiber,\n currentFirstChild,\n newChildren,\n lanes\n ) {\n for (\n var resultingFirstChild = null,\n previousNewFiber = null,\n oldFiber = currentFirstChild,\n newIdx = (currentFirstChild = 0),\n nextOldFiber = null;\n null !== oldFiber && newIdx < newChildren.length;\n newIdx++\n ) {\n oldFiber.index > newIdx\n ? ((nextOldFiber = oldFiber), (oldFiber = null))\n : (nextOldFiber = oldFiber.sibling);\n var newFiber = updateSlot(\n returnFiber,\n oldFiber,\n newChildren[newIdx],\n lanes\n );\n if (null === newFiber) {\n null === oldFiber && (oldFiber = nextOldFiber);\n break;\n }\n shouldTrackSideEffects &&\n oldFiber &&\n null === newFiber.alternate &&\n deleteChild(returnFiber, oldFiber);\n currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n null === previousNewFiber\n ? (resultingFirstChild = newFiber)\n : (previousNewFiber.sibling = newFiber);\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n if (newIdx === newChildren.length)\n return (\n deleteRemainingChildren(returnFiber, oldFiber),\n isHydrating && pushTreeFork(returnFiber, newIdx),\n resultingFirstChild\n );\n if (null === oldFiber) {\n for (; newIdx < newChildren.length; newIdx++)\n (oldFiber = createChild(returnFiber, newChildren[newIdx], lanes)),\n null !== oldFiber &&\n ((currentFirstChild = placeChild(\n oldFiber,\n currentFirstChild,\n newIdx\n )),\n null === previousNewFiber\n ? (resultingFirstChild = oldFiber)\n : (previousNewFiber.sibling = oldFiber),\n (previousNewFiber = oldFiber));\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n for (\n oldFiber = mapRemainingChildren(oldFiber);\n newIdx < newChildren.length;\n newIdx++\n )\n (nextOldFiber = updateFromMap(\n oldFiber,\n returnFiber,\n newIdx,\n newChildren[newIdx],\n lanes\n )),\n null !== nextOldFiber &&\n (shouldTrackSideEffects &&\n null !== nextOldFiber.alternate &&\n oldFiber.delete(\n null === nextOldFiber.key ? newIdx : nextOldFiber.key\n ),\n (currentFirstChild = placeChild(\n nextOldFiber,\n currentFirstChild,\n newIdx\n )),\n null === previousNewFiber\n ? (resultingFirstChild = nextOldFiber)\n : (previousNewFiber.sibling = nextOldFiber),\n (previousNewFiber = nextOldFiber));\n shouldTrackSideEffects &&\n oldFiber.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n function reconcileChildrenIterator(\n returnFiber,\n currentFirstChild,\n newChildren,\n lanes\n ) {\n if (null == newChildren) throw Error(formatProdErrorMessage(151));\n for (\n var resultingFirstChild = null,\n previousNewFiber = null,\n oldFiber = currentFirstChild,\n newIdx = (currentFirstChild = 0),\n nextOldFiber = null,\n step = newChildren.next();\n null !== oldFiber && !step.done;\n newIdx++, step = newChildren.next()\n ) {\n oldFiber.index > newIdx\n ? ((nextOldFiber = oldFiber), (oldFiber = null))\n : (nextOldFiber = oldFiber.sibling);\n var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);\n if (null === newFiber) {\n null === oldFiber && (oldFiber = nextOldFiber);\n break;\n }\n shouldTrackSideEffects &&\n oldFiber &&\n null === newFiber.alternate &&\n deleteChild(returnFiber, oldFiber);\n currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n null === previousNewFiber\n ? (resultingFirstChild = newFiber)\n : (previousNewFiber.sibling = newFiber);\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n if (step.done)\n return (\n deleteRemainingChildren(returnFiber, oldFiber),\n isHydrating && pushTreeFork(returnFiber, newIdx),\n resultingFirstChild\n );\n if (null === oldFiber) {\n for (; !step.done; newIdx++, step = newChildren.next())\n (step = createChild(returnFiber, step.value, lanes)),\n null !== step &&\n ((currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n null === previousNewFiber\n ? (resultingFirstChild = step)\n : (previousNewFiber.sibling = step),\n (previousNewFiber = step));\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n for (\n oldFiber = mapRemainingChildren(oldFiber);\n !step.done;\n newIdx++, step = newChildren.next()\n )\n (step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes)),\n null !== step &&\n (shouldTrackSideEffects &&\n null !== step.alternate &&\n oldFiber.delete(null === step.key ? newIdx : step.key),\n (currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n null === previousNewFiber\n ? (resultingFirstChild = step)\n : (previousNewFiber.sibling = step),\n (previousNewFiber = step));\n shouldTrackSideEffects &&\n oldFiber.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n function reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n ) {\n \"object\" === typeof newChild &&\n null !== newChild &&\n newChild.type === REACT_FRAGMENT_TYPE &&\n null === newChild.key &&\n (newChild = newChild.props.children);\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n a: {\n for (var key = newChild.key; null !== currentFirstChild; ) {\n if (currentFirstChild.key === key) {\n key = newChild.type;\n if (key === REACT_FRAGMENT_TYPE) {\n if (7 === currentFirstChild.tag) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(\n currentFirstChild,\n newChild.props.children\n );\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n }\n } else if (\n currentFirstChild.elementType === key ||\n (\"object\" === typeof key &&\n null !== key &&\n key.$$typeof === REACT_LAZY_TYPE &&\n resolveLazy(key) === currentFirstChild.type)\n ) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(currentFirstChild, newChild.props);\n coerceRef(lanes, newChild);\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n }\n deleteRemainingChildren(returnFiber, currentFirstChild);\n break;\n } else deleteChild(returnFiber, currentFirstChild);\n currentFirstChild = currentFirstChild.sibling;\n }\n newChild.type === REACT_FRAGMENT_TYPE\n ? ((lanes = createFiberFromFragment(\n newChild.props.children,\n returnFiber.mode,\n lanes,\n newChild.key\n )),\n (lanes.return = returnFiber),\n (returnFiber = lanes))\n : ((lanes = createFiberFromTypeAndProps(\n newChild.type,\n newChild.key,\n newChild.props,\n null,\n returnFiber.mode,\n lanes\n )),\n coerceRef(lanes, newChild),\n (lanes.return = returnFiber),\n (returnFiber = lanes));\n }\n return placeSingleChild(returnFiber);\n case REACT_PORTAL_TYPE:\n a: {\n for (key = newChild.key; null !== currentFirstChild; ) {\n if (currentFirstChild.key === key)\n if (\n 4 === currentFirstChild.tag &&\n currentFirstChild.stateNode.containerInfo ===\n newChild.containerInfo &&\n currentFirstChild.stateNode.implementation ===\n newChild.implementation\n ) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(currentFirstChild, newChild.children || []);\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n } else {\n deleteRemainingChildren(returnFiber, currentFirstChild);\n break;\n }\n else deleteChild(returnFiber, currentFirstChild);\n currentFirstChild = currentFirstChild.sibling;\n }\n lanes = createFiberFromPortal(newChild, returnFiber.mode, lanes);\n lanes.return = returnFiber;\n returnFiber = lanes;\n }\n return placeSingleChild(returnFiber);\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n )\n );\n }\n if (isArrayImpl(newChild))\n return reconcileChildrenArray(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n if (getIteratorFn(newChild)) {\n key = getIteratorFn(newChild);\n if (\"function\" !== typeof key) throw Error(formatProdErrorMessage(150));\n newChild = key.call(newChild);\n return reconcileChildrenIterator(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n }\n if (\"function\" === typeof newChild.then)\n return reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n ? ((newChild = \"\" + newChild),\n null !== currentFirstChild && 6 === currentFirstChild.tag\n ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling),\n (lanes = useFiber(currentFirstChild, newChild)),\n (lanes.return = returnFiber),\n (returnFiber = lanes))\n : (deleteRemainingChildren(returnFiber, currentFirstChild),\n (lanes = createFiberFromText(newChild, returnFiber.mode, lanes)),\n (lanes.return = returnFiber),\n (returnFiber = lanes)),\n placeSingleChild(returnFiber))\n : deleteRemainingChildren(returnFiber, currentFirstChild);\n }\n return function (returnFiber, currentFirstChild, newChild, lanes) {\n try {\n thenableIndexCounter$1 = 0;\n var firstChildFiber = reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n thenableState$1 = null;\n return firstChildFiber;\n } catch (x) {\n if (x === SuspenseException || x === SuspenseActionException) throw x;\n var fiber = createFiberImplClass(29, x, null, returnFiber.mode);\n fiber.lanes = lanes;\n fiber.return = returnFiber;\n return fiber;\n } finally {\n }\n };\n}\nvar reconcileChildFibers = createChildReconciler(!0),\n mountChildFibers = createChildReconciler(!1),\n hasForceUpdate = !1;\nfunction initializeUpdateQueue(fiber) {\n fiber.updateQueue = {\n baseState: fiber.memoizedState,\n firstBaseUpdate: null,\n lastBaseUpdate: null,\n shared: { pending: null, lanes: 0, hiddenCallbacks: null },\n callbacks: null\n };\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n current = current.updateQueue;\n workInProgress.updateQueue === current &&\n (workInProgress.updateQueue = {\n baseState: current.baseState,\n firstBaseUpdate: current.firstBaseUpdate,\n lastBaseUpdate: current.lastBaseUpdate,\n shared: current.shared,\n callbacks: null\n });\n}\nfunction createUpdate(lane) {\n return { lane: lane, tag: 0, payload: null, callback: null, next: null };\n}\nfunction enqueueUpdate(fiber, update, lane) {\n var updateQueue = fiber.updateQueue;\n if (null === updateQueue) return null;\n updateQueue = updateQueue.shared;\n if (0 !== (executionContext & 2)) {\n var pending = updateQueue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n updateQueue.pending = update;\n update = getRootForUpdatedFiber(fiber);\n markUpdateLaneFromFiberToRoot(fiber, null, lane);\n return update;\n }\n enqueueUpdate$1(fiber, updateQueue, update, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction entangleTransitions(root, fiber, lane) {\n fiber = fiber.updateQueue;\n if (null !== fiber && ((fiber = fiber.shared), 0 !== (lane & 4194048))) {\n var queueLanes = fiber.lanes;\n queueLanes &= root.pendingLanes;\n lane |= queueLanes;\n fiber.lanes = lane;\n markRootEntangled(root, lane);\n }\n}\nfunction enqueueCapturedUpdate(workInProgress, capturedUpdate) {\n var queue = workInProgress.updateQueue,\n current = workInProgress.alternate;\n if (\n null !== current &&\n ((current = current.updateQueue), queue === current)\n ) {\n var newFirst = null,\n newLast = null;\n queue = queue.firstBaseUpdate;\n if (null !== queue) {\n do {\n var clone = {\n lane: queue.lane,\n tag: queue.tag,\n payload: queue.payload,\n callback: null,\n next: null\n };\n null === newLast\n ? (newFirst = newLast = clone)\n : (newLast = newLast.next = clone);\n queue = queue.next;\n } while (null !== queue);\n null === newLast\n ? (newFirst = newLast = capturedUpdate)\n : (newLast = newLast.next = capturedUpdate);\n } else newFirst = newLast = capturedUpdate;\n queue = {\n baseState: current.baseState,\n firstBaseUpdate: newFirst,\n lastBaseUpdate: newLast,\n shared: current.shared,\n callbacks: current.callbacks\n };\n workInProgress.updateQueue = queue;\n return;\n }\n workInProgress = queue.lastBaseUpdate;\n null === workInProgress\n ? (queue.firstBaseUpdate = capturedUpdate)\n : (workInProgress.next = capturedUpdate);\n queue.lastBaseUpdate = capturedUpdate;\n}\nvar didReadFromEntangledAsyncAction = !1;\nfunction suspendIfUpdateReadFromEntangledAsyncAction() {\n if (didReadFromEntangledAsyncAction) {\n var entangledActionThenable = currentEntangledActionThenable;\n if (null !== entangledActionThenable) throw entangledActionThenable;\n }\n}\nfunction processUpdateQueue(\n workInProgress$jscomp$0,\n props,\n instance$jscomp$0,\n renderLanes\n) {\n didReadFromEntangledAsyncAction = !1;\n var queue = workInProgress$jscomp$0.updateQueue;\n hasForceUpdate = !1;\n var firstBaseUpdate = queue.firstBaseUpdate,\n lastBaseUpdate = queue.lastBaseUpdate,\n pendingQueue = queue.shared.pending;\n if (null !== pendingQueue) {\n queue.shared.pending = null;\n var lastPendingUpdate = pendingQueue,\n firstPendingUpdate = lastPendingUpdate.next;\n lastPendingUpdate.next = null;\n null === lastBaseUpdate\n ? (firstBaseUpdate = firstPendingUpdate)\n : (lastBaseUpdate.next = firstPendingUpdate);\n lastBaseUpdate = lastPendingUpdate;\n var current = workInProgress$jscomp$0.alternate;\n null !== current &&\n ((current = current.updateQueue),\n (pendingQueue = current.lastBaseUpdate),\n pendingQueue !== lastBaseUpdate &&\n (null === pendingQueue\n ? (current.firstBaseUpdate = firstPendingUpdate)\n : (pendingQueue.next = firstPendingUpdate),\n (current.lastBaseUpdate = lastPendingUpdate)));\n }\n if (null !== firstBaseUpdate) {\n var newState = queue.baseState;\n lastBaseUpdate = 0;\n current = firstPendingUpdate = lastPendingUpdate = null;\n pendingQueue = firstBaseUpdate;\n do {\n var updateLane = pendingQueue.lane & -536870913,\n isHiddenUpdate = updateLane !== pendingQueue.lane;\n if (\n isHiddenUpdate\n ? (workInProgressRootRenderLanes & updateLane) === updateLane\n : (renderLanes & updateLane) === updateLane\n ) {\n 0 !== updateLane &&\n updateLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction = !0);\n null !== current &&\n (current = current.next =\n {\n lane: 0,\n tag: pendingQueue.tag,\n payload: pendingQueue.payload,\n callback: null,\n next: null\n });\n a: {\n var workInProgress = workInProgress$jscomp$0,\n update = pendingQueue;\n updateLane = props;\n var instance = instance$jscomp$0;\n switch (update.tag) {\n case 1:\n workInProgress = update.payload;\n if (\"function\" === typeof workInProgress) {\n newState = workInProgress.call(instance, newState, updateLane);\n break a;\n }\n newState = workInProgress;\n break a;\n case 3:\n workInProgress.flags = (workInProgress.flags & -65537) | 128;\n case 0:\n workInProgress = update.payload;\n updateLane =\n \"function\" === typeof workInProgress\n ? workInProgress.call(instance, newState, updateLane)\n : workInProgress;\n if (null === updateLane || void 0 === updateLane) break a;\n newState = assign({}, newState, updateLane);\n break a;\n case 2:\n hasForceUpdate = !0;\n }\n }\n updateLane = pendingQueue.callback;\n null !== updateLane &&\n ((workInProgress$jscomp$0.flags |= 64),\n isHiddenUpdate && (workInProgress$jscomp$0.flags |= 8192),\n (isHiddenUpdate = queue.callbacks),\n null === isHiddenUpdate\n ? (queue.callbacks = [updateLane])\n : isHiddenUpdate.push(updateLane));\n } else\n (isHiddenUpdate = {\n lane: updateLane,\n tag: pendingQueue.tag,\n payload: pendingQueue.payload,\n callback: pendingQueue.callback,\n next: null\n }),\n null === current\n ? ((firstPendingUpdate = current = isHiddenUpdate),\n (lastPendingUpdate = newState))\n : (current = current.next = isHiddenUpdate),\n (lastBaseUpdate |= updateLane);\n pendingQueue = pendingQueue.next;\n if (null === pendingQueue)\n if (((pendingQueue = queue.shared.pending), null === pendingQueue))\n break;\n else\n (isHiddenUpdate = pendingQueue),\n (pendingQueue = isHiddenUpdate.next),\n (isHiddenUpdate.next = null),\n (queue.lastBaseUpdate = isHiddenUpdate),\n (queue.shared.pending = null);\n } while (1);\n null === current && (lastPendingUpdate = newState);\n queue.baseState = lastPendingUpdate;\n queue.firstBaseUpdate = firstPendingUpdate;\n queue.lastBaseUpdate = current;\n null === firstBaseUpdate && (queue.shared.lanes = 0);\n workInProgressRootSkippedLanes |= lastBaseUpdate;\n workInProgress$jscomp$0.lanes = lastBaseUpdate;\n workInProgress$jscomp$0.memoizedState = newState;\n }\n}\nfunction callCallback(callback, context) {\n if (\"function\" !== typeof callback)\n throw Error(formatProdErrorMessage(191, callback));\n callback.call(context);\n}\nfunction commitCallbacks(updateQueue, context) {\n var callbacks = updateQueue.callbacks;\n if (null !== callbacks)\n for (\n updateQueue.callbacks = null, updateQueue = 0;\n updateQueue < callbacks.length;\n updateQueue++\n )\n callCallback(callbacks[updateQueue], context);\n}\nvar currentTreeHiddenStackCursor = createCursor(null),\n prevEntangledRenderLanesCursor = createCursor(0);\nfunction pushHiddenContext(fiber, context) {\n fiber = entangledRenderLanes;\n push(prevEntangledRenderLanesCursor, fiber);\n push(currentTreeHiddenStackCursor, context);\n entangledRenderLanes = fiber | context.baseLanes;\n}\nfunction reuseHiddenContextOnStack() {\n push(prevEntangledRenderLanesCursor, entangledRenderLanes);\n push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current);\n}\nfunction popHiddenContext() {\n entangledRenderLanes = prevEntangledRenderLanesCursor.current;\n pop(currentTreeHiddenStackCursor);\n pop(prevEntangledRenderLanesCursor);\n}\nvar suspenseHandlerStackCursor = createCursor(null),\n shellBoundary = null;\nfunction pushPrimaryTreeSuspenseHandler(handler) {\n var current = handler.alternate;\n push(suspenseStackCursor, suspenseStackCursor.current & 1);\n push(suspenseHandlerStackCursor, handler);\n null === shellBoundary &&\n (null === current || null !== currentTreeHiddenStackCursor.current\n ? (shellBoundary = handler)\n : null !== current.memoizedState && (shellBoundary = handler));\n}\nfunction pushDehydratedActivitySuspenseHandler(fiber) {\n push(suspenseStackCursor, suspenseStackCursor.current);\n push(suspenseHandlerStackCursor, fiber);\n null === shellBoundary && (shellBoundary = fiber);\n}\nfunction pushOffscreenSuspenseHandler(fiber) {\n 22 === fiber.tag\n ? (push(suspenseStackCursor, suspenseStackCursor.current),\n push(suspenseHandlerStackCursor, fiber),\n null === shellBoundary && (shellBoundary = fiber))\n : reuseSuspenseHandlerOnStack(fiber);\n}\nfunction reuseSuspenseHandlerOnStack() {\n push(suspenseStackCursor, suspenseStackCursor.current);\n push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current);\n}\nfunction popSuspenseHandler(fiber) {\n pop(suspenseHandlerStackCursor);\n shellBoundary === fiber && (shellBoundary = null);\n pop(suspenseStackCursor);\n}\nvar suspenseStackCursor = createCursor(0);\nfunction findFirstSuspended(row) {\n for (var node = row; null !== node; ) {\n if (13 === node.tag) {\n var state = node.memoizedState;\n if (\n null !== state &&\n ((state = state.dehydrated),\n null === state ||\n isSuspenseInstancePending(state) ||\n isSuspenseInstanceFallback(state))\n )\n return node;\n } else if (\n 19 === node.tag &&\n (\"forwards\" === node.memoizedProps.revealOrder ||\n \"backwards\" === node.memoizedProps.revealOrder ||\n \"unstable_legacy-backwards\" === node.memoizedProps.revealOrder ||\n \"together\" === node.memoizedProps.revealOrder)\n ) {\n if (0 !== (node.flags & 128)) return node;\n } else if (null !== node.child) {\n node.child.return = node;\n node = node.child;\n continue;\n }\n if (node === row) break;\n for (; null === node.sibling; ) {\n if (null === node.return || node.return === row) return null;\n node = node.return;\n }\n node.sibling.return = node.return;\n node = node.sibling;\n }\n return null;\n}\nvar renderLanes = 0,\n currentlyRenderingFiber = null,\n currentHook = null,\n workInProgressHook = null,\n didScheduleRenderPhaseUpdate = !1,\n didScheduleRenderPhaseUpdateDuringThisPass = !1,\n shouldDoubleInvokeUserFnsInHooksDEV = !1,\n localIdCounter = 0,\n thenableIndexCounter = 0,\n thenableState = null,\n globalClientIdCounter = 0;\nfunction throwInvalidHookError() {\n throw Error(formatProdErrorMessage(321));\n}\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n if (null === prevDeps) return !1;\n for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++)\n if (!objectIs(nextDeps[i], prevDeps[i])) return !1;\n return !0;\n}\nfunction renderWithHooks(\n current,\n workInProgress,\n Component,\n props,\n secondArg,\n nextRenderLanes\n) {\n renderLanes = nextRenderLanes;\n currentlyRenderingFiber = workInProgress;\n workInProgress.memoizedState = null;\n workInProgress.updateQueue = null;\n workInProgress.lanes = 0;\n ReactSharedInternals.H =\n null === current || null === current.memoizedState\n ? HooksDispatcherOnMount\n : HooksDispatcherOnUpdate;\n shouldDoubleInvokeUserFnsInHooksDEV = !1;\n nextRenderLanes = Component(props, secondArg);\n shouldDoubleInvokeUserFnsInHooksDEV = !1;\n didScheduleRenderPhaseUpdateDuringThisPass &&\n (nextRenderLanes = renderWithHooksAgain(\n workInProgress,\n Component,\n props,\n secondArg\n ));\n finishRenderingHooks(current);\n return nextRenderLanes;\n}\nfunction finishRenderingHooks(current) {\n ReactSharedInternals.H = ContextOnlyDispatcher;\n var didRenderTooFewHooks = null !== currentHook && null !== currentHook.next;\n renderLanes = 0;\n workInProgressHook = currentHook = currentlyRenderingFiber = null;\n didScheduleRenderPhaseUpdate = !1;\n thenableIndexCounter = 0;\n thenableState = null;\n if (didRenderTooFewHooks) throw Error(formatProdErrorMessage(300));\n null === current ||\n didReceiveUpdate ||\n ((current = current.dependencies),\n null !== current &&\n checkIfContextChanged(current) &&\n (didReceiveUpdate = !0));\n}\nfunction renderWithHooksAgain(workInProgress, Component, props, secondArg) {\n currentlyRenderingFiber = workInProgress;\n var numberOfReRenders = 0;\n do {\n didScheduleRenderPhaseUpdateDuringThisPass && (thenableState = null);\n thenableIndexCounter = 0;\n didScheduleRenderPhaseUpdateDuringThisPass = !1;\n if (25 <= numberOfReRenders) throw Error(formatProdErrorMessage(301));\n numberOfReRenders += 1;\n workInProgressHook = currentHook = null;\n if (null != workInProgress.updateQueue) {\n var children = workInProgress.updateQueue;\n children.lastEffect = null;\n children.events = null;\n children.stores = null;\n null != children.memoCache && (children.memoCache.index = 0);\n }\n ReactSharedInternals.H = HooksDispatcherOnRerender;\n children = Component(props, secondArg);\n } while (didScheduleRenderPhaseUpdateDuringThisPass);\n return children;\n}\nfunction TransitionAwareHostComponent() {\n var dispatcher = ReactSharedInternals.H,\n maybeThenable = dispatcher.useState()[0];\n maybeThenable =\n \"function\" === typeof maybeThenable.then\n ? useThenable(maybeThenable)\n : maybeThenable;\n dispatcher = dispatcher.useState()[0];\n (null !== currentHook ? currentHook.memoizedState : null) !== dispatcher &&\n (currentlyRenderingFiber.flags |= 1024);\n return maybeThenable;\n}\nfunction checkDidRenderIdHook() {\n var didRenderIdHook = 0 !== localIdCounter;\n localIdCounter = 0;\n return didRenderIdHook;\n}\nfunction bailoutHooks(current, workInProgress, lanes) {\n workInProgress.updateQueue = current.updateQueue;\n workInProgress.flags &= -2053;\n current.lanes &= ~lanes;\n}\nfunction resetHooksOnUnwind(workInProgress) {\n if (didScheduleRenderPhaseUpdate) {\n for (\n workInProgress = workInProgress.memoizedState;\n null !== workInProgress;\n\n ) {\n var queue = workInProgress.queue;\n null !== queue && (queue.pending = null);\n workInProgress = workInProgress.next;\n }\n didScheduleRenderPhaseUpdate = !1;\n }\n renderLanes = 0;\n workInProgressHook = currentHook = currentlyRenderingFiber = null;\n didScheduleRenderPhaseUpdateDuringThisPass = !1;\n thenableIndexCounter = localIdCounter = 0;\n thenableState = null;\n}\nfunction mountWorkInProgressHook() {\n var hook = {\n memoizedState: null,\n baseState: null,\n baseQueue: null,\n queue: null,\n next: null\n };\n null === workInProgressHook\n ? (currentlyRenderingFiber.memoizedState = workInProgressHook = hook)\n : (workInProgressHook = workInProgressHook.next = hook);\n return workInProgressHook;\n}\nfunction updateWorkInProgressHook() {\n if (null === currentHook) {\n var nextCurrentHook = currentlyRenderingFiber.alternate;\n nextCurrentHook =\n null !== nextCurrentHook ? nextCurrentHook.memoizedState : null;\n } else nextCurrentHook = currentHook.next;\n var nextWorkInProgressHook =\n null === workInProgressHook\n ? currentlyRenderingFiber.memoizedState\n : workInProgressHook.next;\n if (null !== nextWorkInProgressHook)\n (workInProgressHook = nextWorkInProgressHook),\n (currentHook = nextCurrentHook);\n else {\n if (null === nextCurrentHook) {\n if (null === currentlyRenderingFiber.alternate)\n throw Error(formatProdErrorMessage(467));\n throw Error(formatProdErrorMessage(310));\n }\n currentHook = nextCurrentHook;\n nextCurrentHook = {\n memoizedState: currentHook.memoizedState,\n baseState: currentHook.baseState,\n baseQueue: currentHook.baseQueue,\n queue: currentHook.queue,\n next: null\n };\n null === workInProgressHook\n ? (currentlyRenderingFiber.memoizedState = workInProgressHook =\n nextCurrentHook)\n : (workInProgressHook = workInProgressHook.next = nextCurrentHook);\n }\n return workInProgressHook;\n}\nfunction createFunctionComponentUpdateQueue() {\n return { lastEffect: null, events: null, stores: null, memoCache: null };\n}\nfunction useThenable(thenable) {\n var index = thenableIndexCounter;\n thenableIndexCounter += 1;\n null === thenableState && (thenableState = []);\n thenable = trackUsedThenable(thenableState, thenable, index);\n index = currentlyRenderingFiber;\n null ===\n (null === workInProgressHook\n ? index.memoizedState\n : workInProgressHook.next) &&\n ((index = index.alternate),\n (ReactSharedInternals.H =\n null === index || null === index.memoizedState\n ? HooksDispatcherOnMount\n : HooksDispatcherOnUpdate));\n return thenable;\n}\nfunction use(usable) {\n if (null !== usable && \"object\" === typeof usable) {\n if (\"function\" === typeof usable.then) return useThenable(usable);\n if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable);\n }\n throw Error(formatProdErrorMessage(438, String(usable)));\n}\nfunction useMemoCache(size) {\n var memoCache = null,\n updateQueue = currentlyRenderingFiber.updateQueue;\n null !== updateQueue && (memoCache = updateQueue.memoCache);\n if (null == memoCache) {\n var current = currentlyRenderingFiber.alternate;\n null !== current &&\n ((current = current.updateQueue),\n null !== current &&\n ((current = current.memoCache),\n null != current &&\n (memoCache = {\n data: current.data.map(function (array) {\n return array.slice();\n }),\n index: 0\n })));\n }\n null == memoCache && (memoCache = { data: [], index: 0 });\n null === updateQueue &&\n ((updateQueue = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = updateQueue));\n updateQueue.memoCache = memoCache;\n updateQueue = memoCache.data[memoCache.index];\n if (void 0 === updateQueue)\n for (\n updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0;\n current < size;\n current++\n )\n updateQueue[current] = REACT_MEMO_CACHE_SENTINEL;\n memoCache.index++;\n return updateQueue;\n}\nfunction basicStateReducer(state, action) {\n return \"function\" === typeof action ? action(state) : action;\n}\nfunction updateReducer(reducer) {\n var hook = updateWorkInProgressHook();\n return updateReducerImpl(hook, currentHook, reducer);\n}\nfunction updateReducerImpl(hook, current, reducer) {\n var queue = hook.queue;\n if (null === queue) throw Error(formatProdErrorMessage(311));\n queue.lastRenderedReducer = reducer;\n var baseQueue = hook.baseQueue,\n pendingQueue = queue.pending;\n if (null !== pendingQueue) {\n if (null !== baseQueue) {\n var baseFirst = baseQueue.next;\n baseQueue.next = pendingQueue.next;\n pendingQueue.next = baseFirst;\n }\n current.baseQueue = baseQueue = pendingQueue;\n queue.pending = null;\n }\n pendingQueue = hook.baseState;\n if (null === baseQueue) hook.memoizedState = pendingQueue;\n else {\n current = baseQueue.next;\n var newBaseQueueFirst = (baseFirst = null),\n newBaseQueueLast = null,\n update = current,\n didReadFromEntangledAsyncAction$60 = !1;\n do {\n var updateLane = update.lane & -536870913;\n if (\n updateLane !== update.lane\n ? (workInProgressRootRenderLanes & updateLane) === updateLane\n : (renderLanes & updateLane) === updateLane\n ) {\n var revertLane = update.revertLane;\n if (0 === revertLane)\n null !== newBaseQueueLast &&\n (newBaseQueueLast = newBaseQueueLast.next =\n {\n lane: 0,\n revertLane: 0,\n gesture: null,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n updateLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction$60 = !0);\n else if ((renderLanes & revertLane) === revertLane) {\n update = update.next;\n revertLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction$60 = !0);\n continue;\n } else\n (updateLane = {\n lane: 0,\n revertLane: update.revertLane,\n gesture: null,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n null === newBaseQueueLast\n ? ((newBaseQueueFirst = newBaseQueueLast = updateLane),\n (baseFirst = pendingQueue))\n : (newBaseQueueLast = newBaseQueueLast.next = updateLane),\n (currentlyRenderingFiber.lanes |= revertLane),\n (workInProgressRootSkippedLanes |= revertLane);\n updateLane = update.action;\n shouldDoubleInvokeUserFnsInHooksDEV &&\n reducer(pendingQueue, updateLane);\n pendingQueue = update.hasEagerState\n ? update.eagerState\n : reducer(pendingQueue, updateLane);\n } else\n (revertLane = {\n lane: updateLane,\n revertLane: update.revertLane,\n gesture: update.gesture,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n null === newBaseQueueLast\n ? ((newBaseQueueFirst = newBaseQueueLast = revertLane),\n (baseFirst = pendingQueue))\n : (newBaseQueueLast = newBaseQueueLast.next = revertLane),\n (currentlyRenderingFiber.lanes |= updateLane),\n (workInProgressRootSkippedLanes |= updateLane);\n update = update.next;\n } while (null !== update && update !== current);\n null === newBaseQueueLast\n ? (baseFirst = pendingQueue)\n : (newBaseQueueLast.next = newBaseQueueFirst);\n if (\n !objectIs(pendingQueue, hook.memoizedState) &&\n ((didReceiveUpdate = !0),\n didReadFromEntangledAsyncAction$60 &&\n ((reducer = currentEntangledActionThenable), null !== reducer))\n )\n throw reducer;\n hook.memoizedState = pendingQueue;\n hook.baseState = baseFirst;\n hook.baseQueue = newBaseQueueLast;\n queue.lastRenderedState = pendingQueue;\n }\n null === baseQueue && (queue.lanes = 0);\n return [hook.memoizedState, queue.dispatch];\n}\nfunction rerenderReducer(reducer) {\n var hook = updateWorkInProgressHook(),\n queue = hook.queue;\n if (null === queue) throw Error(formatProdErrorMessage(311));\n queue.lastRenderedReducer = reducer;\n var dispatch = queue.dispatch,\n lastRenderPhaseUpdate = queue.pending,\n newState = hook.memoizedState;\n if (null !== lastRenderPhaseUpdate) {\n queue.pending = null;\n var update = (lastRenderPhaseUpdate = lastRenderPhaseUpdate.next);\n do (newState = reducer(newState, update.action)), (update = update.next);\n while (update !== lastRenderPhaseUpdate);\n objectIs(newState, hook.memoizedState) || (didReceiveUpdate = !0);\n hook.memoizedState = newState;\n null === hook.baseQueue && (hook.baseState = newState);\n queue.lastRenderedState = newState;\n }\n return [newState, dispatch];\n}\nfunction updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {\n var fiber = currentlyRenderingFiber,\n hook = updateWorkInProgressHook(),\n isHydrating$jscomp$0 = isHydrating;\n if (isHydrating$jscomp$0) {\n if (void 0 === getServerSnapshot) throw Error(formatProdErrorMessage(407));\n getServerSnapshot = getServerSnapshot();\n } else getServerSnapshot = getSnapshot();\n var snapshotChanged = !objectIs(\n (currentHook || hook).memoizedState,\n getServerSnapshot\n );\n snapshotChanged &&\n ((hook.memoizedState = getServerSnapshot), (didReceiveUpdate = !0));\n hook = hook.queue;\n updateEffect(subscribeToStore.bind(null, fiber, hook, subscribe), [\n subscribe\n ]);\n if (\n hook.getSnapshot !== getSnapshot ||\n snapshotChanged ||\n (null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1)\n ) {\n fiber.flags |= 2048;\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n updateStoreInstance.bind(\n null,\n fiber,\n hook,\n getServerSnapshot,\n getSnapshot\n ),\n null\n );\n if (null === workInProgressRoot) throw Error(formatProdErrorMessage(349));\n isHydrating$jscomp$0 ||\n 0 !== (renderLanes & 127) ||\n pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n }\n return getServerSnapshot;\n}\nfunction pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {\n fiber.flags |= 16384;\n fiber = { getSnapshot: getSnapshot, value: renderedSnapshot };\n getSnapshot = currentlyRenderingFiber.updateQueue;\n null === getSnapshot\n ? ((getSnapshot = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = getSnapshot),\n (getSnapshot.stores = [fiber]))\n : ((renderedSnapshot = getSnapshot.stores),\n null === renderedSnapshot\n ? (getSnapshot.stores = [fiber])\n : renderedSnapshot.push(fiber));\n}\nfunction updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {\n inst.value = nextSnapshot;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n}\nfunction subscribeToStore(fiber, inst, subscribe) {\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n });\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction forceStoreRerender(fiber) {\n var root = enqueueConcurrentRenderForLane(fiber, 2);\n null !== root && scheduleUpdateOnFiber(root, fiber, 2);\n}\nfunction mountStateImpl(initialState) {\n var hook = mountWorkInProgressHook();\n if (\"function\" === typeof initialState) {\n var initialStateInitializer = initialState;\n initialState = initialStateInitializer();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n initialStateInitializer();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n }\n hook.memoizedState = hook.baseState = initialState;\n hook.queue = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: initialState\n };\n return hook;\n}\nfunction updateOptimisticImpl(hook, current, passthrough, reducer) {\n hook.baseState = passthrough;\n return updateReducerImpl(\n hook,\n currentHook,\n \"function\" === typeof reducer ? reducer : basicStateReducer\n );\n}\nfunction dispatchActionState(\n fiber,\n actionQueue,\n setPendingState,\n setState,\n payload\n) {\n if (isRenderPhaseUpdate(fiber)) throw Error(formatProdErrorMessage(485));\n fiber = actionQueue.action;\n if (null !== fiber) {\n var actionNode = {\n payload: payload,\n action: fiber,\n next: null,\n isTransition: !0,\n status: \"pending\",\n value: null,\n reason: null,\n listeners: [],\n then: function (listener) {\n actionNode.listeners.push(listener);\n }\n };\n null !== ReactSharedInternals.T\n ? setPendingState(!0)\n : (actionNode.isTransition = !1);\n setState(actionNode);\n setPendingState = actionQueue.pending;\n null === setPendingState\n ? ((actionNode.next = actionQueue.pending = actionNode),\n runActionStateAction(actionQueue, actionNode))\n : ((actionNode.next = setPendingState.next),\n (actionQueue.pending = setPendingState.next = actionNode));\n }\n}\nfunction runActionStateAction(actionQueue, node) {\n var action = node.action,\n payload = node.payload,\n prevState = actionQueue.state;\n if (node.isTransition) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n try {\n var returnValue = action(prevState, payload),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n handleActionReturnValue(actionQueue, node, returnValue);\n } catch (error) {\n onActionError(actionQueue, node, error);\n } finally {\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n } else\n try {\n (prevTransition = action(prevState, payload)),\n handleActionReturnValue(actionQueue, node, prevTransition);\n } catch (error$66) {\n onActionError(actionQueue, node, error$66);\n }\n}\nfunction handleActionReturnValue(actionQueue, node, returnValue) {\n null !== returnValue &&\n \"object\" === typeof returnValue &&\n \"function\" === typeof returnValue.then\n ? returnValue.then(\n function (nextState) {\n onActionSuccess(actionQueue, node, nextState);\n },\n function (error) {\n return onActionError(actionQueue, node, error);\n }\n )\n : onActionSuccess(actionQueue, node, returnValue);\n}\nfunction onActionSuccess(actionQueue, actionNode, nextState) {\n actionNode.status = \"fulfilled\";\n actionNode.value = nextState;\n notifyActionListeners(actionNode);\n actionQueue.state = nextState;\n actionNode = actionQueue.pending;\n null !== actionNode &&\n ((nextState = actionNode.next),\n nextState === actionNode\n ? (actionQueue.pending = null)\n : ((nextState = nextState.next),\n (actionNode.next = nextState),\n runActionStateAction(actionQueue, nextState)));\n}\nfunction onActionError(actionQueue, actionNode, error) {\n var last = actionQueue.pending;\n actionQueue.pending = null;\n if (null !== last) {\n last = last.next;\n do\n (actionNode.status = \"rejected\"),\n (actionNode.reason = error),\n notifyActionListeners(actionNode),\n (actionNode = actionNode.next);\n while (actionNode !== last);\n }\n actionQueue.action = null;\n}\nfunction notifyActionListeners(actionNode) {\n actionNode = actionNode.listeners;\n for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])();\n}\nfunction actionStateReducer(oldState, newState) {\n return newState;\n}\nfunction mountActionState(action, initialStateProp) {\n if (isHydrating) {\n var ssrFormState = workInProgressRoot.formState;\n if (null !== ssrFormState) {\n a: {\n var JSCompiler_inline_result = currentlyRenderingFiber;\n if (isHydrating) {\n if (nextHydratableInstance) {\n b: {\n var JSCompiler_inline_result$jscomp$0 = nextHydratableInstance;\n for (\n var inRootOrSingleton = rootOrSingletonContext;\n 8 !== JSCompiler_inline_result$jscomp$0.nodeType;\n\n ) {\n if (!inRootOrSingleton) {\n JSCompiler_inline_result$jscomp$0 = null;\n break b;\n }\n JSCompiler_inline_result$jscomp$0 = getNextHydratable(\n JSCompiler_inline_result$jscomp$0.nextSibling\n );\n if (null === JSCompiler_inline_result$jscomp$0) {\n JSCompiler_inline_result$jscomp$0 = null;\n break b;\n }\n }\n inRootOrSingleton = JSCompiler_inline_result$jscomp$0.data;\n JSCompiler_inline_result$jscomp$0 =\n \"F!\" === inRootOrSingleton || \"F\" === inRootOrSingleton\n ? JSCompiler_inline_result$jscomp$0\n : null;\n }\n if (JSCompiler_inline_result$jscomp$0) {\n nextHydratableInstance = getNextHydratable(\n JSCompiler_inline_result$jscomp$0.nextSibling\n );\n JSCompiler_inline_result =\n \"F!\" === JSCompiler_inline_result$jscomp$0.data;\n break a;\n }\n }\n throwOnHydrationMismatch(JSCompiler_inline_result);\n }\n JSCompiler_inline_result = !1;\n }\n JSCompiler_inline_result && (initialStateProp = ssrFormState[0]);\n }\n }\n ssrFormState = mountWorkInProgressHook();\n ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp;\n JSCompiler_inline_result = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: actionStateReducer,\n lastRenderedState: initialStateProp\n };\n ssrFormState.queue = JSCompiler_inline_result;\n ssrFormState = dispatchSetState.bind(\n null,\n currentlyRenderingFiber,\n JSCompiler_inline_result\n );\n JSCompiler_inline_result.dispatch = ssrFormState;\n JSCompiler_inline_result = mountStateImpl(!1);\n inRootOrSingleton = dispatchOptimisticSetState.bind(\n null,\n currentlyRenderingFiber,\n !1,\n JSCompiler_inline_result.queue\n );\n JSCompiler_inline_result = mountWorkInProgressHook();\n JSCompiler_inline_result$jscomp$0 = {\n state: initialStateProp,\n dispatch: null,\n action: action,\n pending: null\n };\n JSCompiler_inline_result.queue = JSCompiler_inline_result$jscomp$0;\n ssrFormState = dispatchActionState.bind(\n null,\n currentlyRenderingFiber,\n JSCompiler_inline_result$jscomp$0,\n inRootOrSingleton,\n ssrFormState\n );\n JSCompiler_inline_result$jscomp$0.dispatch = ssrFormState;\n JSCompiler_inline_result.memoizedState = action;\n return [initialStateProp, ssrFormState, !1];\n}\nfunction updateActionState(action) {\n var stateHook = updateWorkInProgressHook();\n return updateActionStateImpl(stateHook, currentHook, action);\n}\nfunction updateActionStateImpl(stateHook, currentStateHook, action) {\n currentStateHook = updateReducerImpl(\n stateHook,\n currentStateHook,\n actionStateReducer\n )[0];\n stateHook = updateReducer(basicStateReducer)[0];\n if (\n \"object\" === typeof currentStateHook &&\n null !== currentStateHook &&\n \"function\" === typeof currentStateHook.then\n )\n try {\n var state = useThenable(currentStateHook);\n } catch (x) {\n if (x === SuspenseException) throw SuspenseActionException;\n throw x;\n }\n else state = currentStateHook;\n currentStateHook = updateWorkInProgressHook();\n var actionQueue = currentStateHook.queue,\n dispatch = actionQueue.dispatch;\n action !== currentStateHook.memoizedState &&\n ((currentlyRenderingFiber.flags |= 2048),\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n actionStateActionEffect.bind(null, actionQueue, action),\n null\n ));\n return [state, dispatch, stateHook];\n}\nfunction actionStateActionEffect(actionQueue, action) {\n actionQueue.action = action;\n}\nfunction rerenderActionState(action) {\n var stateHook = updateWorkInProgressHook(),\n currentStateHook = currentHook;\n if (null !== currentStateHook)\n return updateActionStateImpl(stateHook, currentStateHook, action);\n updateWorkInProgressHook();\n stateHook = stateHook.memoizedState;\n currentStateHook = updateWorkInProgressHook();\n var dispatch = currentStateHook.queue.dispatch;\n currentStateHook.memoizedState = action;\n return [stateHook, dispatch, !1];\n}\nfunction pushSimpleEffect(tag, inst, create, deps) {\n tag = { tag: tag, create: create, deps: deps, inst: inst, next: null };\n inst = currentlyRenderingFiber.updateQueue;\n null === inst &&\n ((inst = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = inst));\n create = inst.lastEffect;\n null === create\n ? (inst.lastEffect = tag.next = tag)\n : ((deps = create.next),\n (create.next = tag),\n (tag.next = deps),\n (inst.lastEffect = tag));\n return tag;\n}\nfunction updateRef() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction mountEffectImpl(fiberFlags, hookFlags, create, deps) {\n var hook = mountWorkInProgressHook();\n currentlyRenderingFiber.flags |= fiberFlags;\n hook.memoizedState = pushSimpleEffect(\n 1 | hookFlags,\n { destroy: void 0 },\n create,\n void 0 === deps ? null : deps\n );\n}\nfunction updateEffectImpl(fiberFlags, hookFlags, create, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var inst = hook.memoizedState.inst;\n null !== currentHook &&\n null !== deps &&\n areHookInputsEqual(deps, currentHook.memoizedState.deps)\n ? (hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps))\n : ((currentlyRenderingFiber.flags |= fiberFlags),\n (hook.memoizedState = pushSimpleEffect(\n 1 | hookFlags,\n inst,\n create,\n deps\n )));\n}\nfunction mountEffect(create, deps) {\n mountEffectImpl(8390656, 8, create, deps);\n}\nfunction updateEffect(create, deps) {\n updateEffectImpl(2048, 8, create, deps);\n}\nfunction useEffectEventImpl(payload) {\n currentlyRenderingFiber.flags |= 4;\n var componentUpdateQueue = currentlyRenderingFiber.updateQueue;\n if (null === componentUpdateQueue)\n (componentUpdateQueue = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = componentUpdateQueue),\n (componentUpdateQueue.events = [payload]);\n else {\n var events = componentUpdateQueue.events;\n null === events\n ? (componentUpdateQueue.events = [payload])\n : events.push(payload);\n }\n}\nfunction updateEvent(callback) {\n var ref = updateWorkInProgressHook().memoizedState;\n useEffectEventImpl({ ref: ref, nextImpl: callback });\n return function () {\n if (0 !== (executionContext & 2)) throw Error(formatProdErrorMessage(440));\n return ref.impl.apply(void 0, arguments);\n };\n}\nfunction updateInsertionEffect(create, deps) {\n return updateEffectImpl(4, 2, create, deps);\n}\nfunction updateLayoutEffect(create, deps) {\n return updateEffectImpl(4, 4, create, deps);\n}\nfunction imperativeHandleEffect(create, ref) {\n if (\"function\" === typeof ref) {\n create = create();\n var refCleanup = ref(create);\n return function () {\n \"function\" === typeof refCleanup ? refCleanup() : ref(null);\n };\n }\n if (null !== ref && void 0 !== ref)\n return (\n (create = create()),\n (ref.current = create),\n function () {\n ref.current = null;\n }\n );\n}\nfunction updateImperativeHandle(ref, create, deps) {\n deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n updateEffectImpl(4, 4, imperativeHandleEffect.bind(null, create, ref), deps);\n}\nfunction mountDebugValue() {}\nfunction updateCallback(callback, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var prevState = hook.memoizedState;\n if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n return prevState[0];\n hook.memoizedState = [callback, deps];\n return callback;\n}\nfunction updateMemo(nextCreate, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var prevState = hook.memoizedState;\n if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n return prevState[0];\n prevState = nextCreate();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n nextCreate();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n hook.memoizedState = [prevState, deps];\n return prevState;\n}\nfunction mountDeferredValueImpl(hook, value, initialValue) {\n if (\n void 0 === initialValue ||\n (0 !== (renderLanes & 1073741824) &&\n 0 === (workInProgressRootRenderLanes & 261930))\n )\n return (hook.memoizedState = value);\n hook.memoizedState = initialValue;\n hook = requestDeferredLane();\n currentlyRenderingFiber.lanes |= hook;\n workInProgressRootSkippedLanes |= hook;\n return initialValue;\n}\nfunction updateDeferredValueImpl(hook, prevValue, value, initialValue) {\n if (objectIs(value, prevValue)) return value;\n if (null !== currentTreeHiddenStackCursor.current)\n return (\n (hook = mountDeferredValueImpl(hook, value, initialValue)),\n objectIs(hook, prevValue) || (didReceiveUpdate = !0),\n hook\n );\n if (\n 0 === (renderLanes & 42) ||\n (0 !== (renderLanes & 1073741824) &&\n 0 === (workInProgressRootRenderLanes & 261930))\n )\n return (didReceiveUpdate = !0), (hook.memoizedState = value);\n hook = requestDeferredLane();\n currentlyRenderingFiber.lanes |= hook;\n workInProgressRootSkippedLanes |= hook;\n return prevValue;\n}\nfunction startTransition(fiber, queue, pendingState, finishedState, callback) {\n var previousPriority = ReactDOMSharedInternals.p;\n ReactDOMSharedInternals.p =\n 0 !== previousPriority && 8 > previousPriority ? previousPriority : 8;\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n dispatchOptimisticSetState(fiber, !1, queue, pendingState);\n try {\n var returnValue = callback(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n if (\n null !== returnValue &&\n \"object\" === typeof returnValue &&\n \"function\" === typeof returnValue.then\n ) {\n var thenableForFinishedState = chainThenableValue(\n returnValue,\n finishedState\n );\n dispatchSetStateInternal(\n fiber,\n queue,\n thenableForFinishedState,\n requestUpdateLane(fiber)\n );\n } else\n dispatchSetStateInternal(\n fiber,\n queue,\n finishedState,\n requestUpdateLane(fiber)\n );\n } catch (error) {\n dispatchSetStateInternal(\n fiber,\n queue,\n { then: function () {}, status: \"rejected\", reason: error },\n requestUpdateLane()\n );\n } finally {\n (ReactDOMSharedInternals.p = previousPriority),\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n}\nfunction noop() {}\nfunction startHostTransition(formFiber, pendingState, action, formData) {\n if (5 !== formFiber.tag) throw Error(formatProdErrorMessage(476));\n var queue = ensureFormComponentIsStateful(formFiber).queue;\n startTransition(\n formFiber,\n queue,\n pendingState,\n sharedNotPendingObject,\n null === action\n ? noop\n : function () {\n requestFormReset$1(formFiber);\n return action(formData);\n }\n );\n}\nfunction ensureFormComponentIsStateful(formFiber) {\n var existingStateHook = formFiber.memoizedState;\n if (null !== existingStateHook) return existingStateHook;\n existingStateHook = {\n memoizedState: sharedNotPendingObject,\n baseState: sharedNotPendingObject,\n baseQueue: null,\n queue: {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: sharedNotPendingObject\n },\n next: null\n };\n var initialResetState = {};\n existingStateHook.next = {\n memoizedState: initialResetState,\n baseState: initialResetState,\n baseQueue: null,\n queue: {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: initialResetState\n },\n next: null\n };\n formFiber.memoizedState = existingStateHook;\n formFiber = formFiber.alternate;\n null !== formFiber && (formFiber.memoizedState = existingStateHook);\n return existingStateHook;\n}\nfunction requestFormReset$1(formFiber) {\n var stateHook = ensureFormComponentIsStateful(formFiber);\n null === stateHook.next && (stateHook = formFiber.alternate.memoizedState);\n dispatchSetStateInternal(\n formFiber,\n stateHook.next.queue,\n {},\n requestUpdateLane()\n );\n}\nfunction useHostTransitionStatus() {\n return readContext(HostTransitionContext);\n}\nfunction updateId() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction updateRefresh() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction refreshCache(fiber) {\n for (var provider = fiber.return; null !== provider; ) {\n switch (provider.tag) {\n case 24:\n case 3:\n var lane = requestUpdateLane();\n fiber = createUpdate(lane);\n var root$69 = enqueueUpdate(provider, fiber, lane);\n null !== root$69 &&\n (scheduleUpdateOnFiber(root$69, provider, lane),\n entangleTransitions(root$69, provider, lane));\n provider = { cache: createCache() };\n fiber.payload = provider;\n return;\n }\n provider = provider.return;\n }\n}\nfunction dispatchReducerAction(fiber, queue, action) {\n var lane = requestUpdateLane();\n action = {\n lane: lane,\n revertLane: 0,\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n isRenderPhaseUpdate(fiber)\n ? enqueueRenderPhaseUpdate(queue, action)\n : ((action = enqueueConcurrentHookUpdate(fiber, queue, action, lane)),\n null !== action &&\n (scheduleUpdateOnFiber(action, fiber, lane),\n entangleTransitionUpdate(action, queue, lane)));\n}\nfunction dispatchSetState(fiber, queue, action) {\n var lane = requestUpdateLane();\n dispatchSetStateInternal(fiber, queue, action, lane);\n}\nfunction dispatchSetStateInternal(fiber, queue, action, lane) {\n var update = {\n lane: lane,\n revertLane: 0,\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update);\n else {\n var alternate = fiber.alternate;\n if (\n 0 === fiber.lanes &&\n (null === alternate || 0 === alternate.lanes) &&\n ((alternate = queue.lastRenderedReducer), null !== alternate)\n )\n try {\n var currentState = queue.lastRenderedState,\n eagerState = alternate(currentState, action);\n update.hasEagerState = !0;\n update.eagerState = eagerState;\n if (objectIs(eagerState, currentState))\n return (\n enqueueUpdate$1(fiber, queue, update, 0),\n null === workInProgressRoot && finishQueueingConcurrentUpdates(),\n !1\n );\n } catch (error) {\n } finally {\n }\n action = enqueueConcurrentHookUpdate(fiber, queue, update, lane);\n if (null !== action)\n return (\n scheduleUpdateOnFiber(action, fiber, lane),\n entangleTransitionUpdate(action, queue, lane),\n !0\n );\n }\n return !1;\n}\nfunction dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) {\n action = {\n lane: 2,\n revertLane: requestTransitionLane(),\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n if (isRenderPhaseUpdate(fiber)) {\n if (throwIfDuringRender) throw Error(formatProdErrorMessage(479));\n } else\n (throwIfDuringRender = enqueueConcurrentHookUpdate(\n fiber,\n queue,\n action,\n 2\n )),\n null !== throwIfDuringRender &&\n scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2);\n}\nfunction isRenderPhaseUpdate(fiber) {\n var alternate = fiber.alternate;\n return (\n fiber === currentlyRenderingFiber ||\n (null !== alternate && alternate === currentlyRenderingFiber)\n );\n}\nfunction enqueueRenderPhaseUpdate(queue, update) {\n didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate =\n !0;\n var pending = queue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n queue.pending = update;\n}\nfunction entangleTransitionUpdate(root, queue, lane) {\n if (0 !== (lane & 4194048)) {\n var queueLanes = queue.lanes;\n queueLanes &= root.pendingLanes;\n lane |= queueLanes;\n queue.lanes = lane;\n markRootEntangled(root, lane);\n }\n}\nvar ContextOnlyDispatcher = {\n readContext: readContext,\n use: use,\n useCallback: throwInvalidHookError,\n useContext: throwInvalidHookError,\n useEffect: throwInvalidHookError,\n useImperativeHandle: throwInvalidHookError,\n useLayoutEffect: throwInvalidHookError,\n useInsertionEffect: throwInvalidHookError,\n useMemo: throwInvalidHookError,\n useReducer: throwInvalidHookError,\n useRef: throwInvalidHookError,\n useState: throwInvalidHookError,\n useDebugValue: throwInvalidHookError,\n useDeferredValue: throwInvalidHookError,\n useTransition: throwInvalidHookError,\n useSyncExternalStore: throwInvalidHookError,\n useId: throwInvalidHookError,\n useHostTransitionStatus: throwInvalidHookError,\n useFormState: throwInvalidHookError,\n useActionState: throwInvalidHookError,\n useOptimistic: throwInvalidHookError,\n useMemoCache: throwInvalidHookError,\n useCacheRefresh: throwInvalidHookError\n};\nContextOnlyDispatcher.useEffectEvent = throwInvalidHookError;\nvar HooksDispatcherOnMount = {\n readContext: readContext,\n use: use,\n useCallback: function (callback, deps) {\n mountWorkInProgressHook().memoizedState = [\n callback,\n void 0 === deps ? null : deps\n ];\n return callback;\n },\n useContext: readContext,\n useEffect: mountEffect,\n useImperativeHandle: function (ref, create, deps) {\n deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n mountEffectImpl(\n 4194308,\n 4,\n imperativeHandleEffect.bind(null, create, ref),\n deps\n );\n },\n useLayoutEffect: function (create, deps) {\n return mountEffectImpl(4194308, 4, create, deps);\n },\n useInsertionEffect: function (create, deps) {\n mountEffectImpl(4, 2, create, deps);\n },\n useMemo: function (nextCreate, deps) {\n var hook = mountWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var nextValue = nextCreate();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n nextCreate();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n hook.memoizedState = [nextValue, deps];\n return nextValue;\n },\n useReducer: function (reducer, initialArg, init) {\n var hook = mountWorkInProgressHook();\n if (void 0 !== init) {\n var initialState = init(initialArg);\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n init(initialArg);\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n } else initialState = initialArg;\n hook.memoizedState = hook.baseState = initialState;\n reducer = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: reducer,\n lastRenderedState: initialState\n };\n hook.queue = reducer;\n reducer = reducer.dispatch = dispatchReducerAction.bind(\n null,\n currentlyRenderingFiber,\n reducer\n );\n return [hook.memoizedState, reducer];\n },\n useRef: function (initialValue) {\n var hook = mountWorkInProgressHook();\n initialValue = { current: initialValue };\n return (hook.memoizedState = initialValue);\n },\n useState: function (initialState) {\n initialState = mountStateImpl(initialState);\n var queue = initialState.queue,\n dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue);\n queue.dispatch = dispatch;\n return [initialState.memoizedState, dispatch];\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = mountWorkInProgressHook();\n return mountDeferredValueImpl(hook, value, initialValue);\n },\n useTransition: function () {\n var stateHook = mountStateImpl(!1);\n stateHook = startTransition.bind(\n null,\n currentlyRenderingFiber,\n stateHook.queue,\n !0,\n !1\n );\n mountWorkInProgressHook().memoizedState = stateHook;\n return [!1, stateHook];\n },\n useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {\n var fiber = currentlyRenderingFiber,\n hook = mountWorkInProgressHook();\n if (isHydrating) {\n if (void 0 === getServerSnapshot)\n throw Error(formatProdErrorMessage(407));\n getServerSnapshot = getServerSnapshot();\n } else {\n getServerSnapshot = getSnapshot();\n if (null === workInProgressRoot)\n throw Error(formatProdErrorMessage(349));\n 0 !== (workInProgressRootRenderLanes & 127) ||\n pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n }\n hook.memoizedState = getServerSnapshot;\n var inst = { value: getServerSnapshot, getSnapshot: getSnapshot };\n hook.queue = inst;\n mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [\n subscribe\n ]);\n fiber.flags |= 2048;\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n updateStoreInstance.bind(\n null,\n fiber,\n inst,\n getServerSnapshot,\n getSnapshot\n ),\n null\n );\n return getServerSnapshot;\n },\n useId: function () {\n var hook = mountWorkInProgressHook(),\n identifierPrefix = workInProgressRoot.identifierPrefix;\n if (isHydrating) {\n var JSCompiler_inline_result = treeContextOverflow;\n var idWithLeadingBit = treeContextId;\n JSCompiler_inline_result =\n (\n idWithLeadingBit & ~(1 << (32 - clz32(idWithLeadingBit) - 1))\n ).toString(32) + JSCompiler_inline_result;\n identifierPrefix =\n \"_\" + identifierPrefix + \"R_\" + JSCompiler_inline_result;\n JSCompiler_inline_result = localIdCounter++;\n 0 < JSCompiler_inline_result &&\n (identifierPrefix += \"H\" + JSCompiler_inline_result.toString(32));\n identifierPrefix += \"_\";\n } else\n (JSCompiler_inline_result = globalClientIdCounter++),\n (identifierPrefix =\n \"_\" +\n identifierPrefix +\n \"r_\" +\n JSCompiler_inline_result.toString(32) +\n \"_\");\n return (hook.memoizedState = identifierPrefix);\n },\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: mountActionState,\n useActionState: mountActionState,\n useOptimistic: function (passthrough) {\n var hook = mountWorkInProgressHook();\n hook.memoizedState = hook.baseState = passthrough;\n var queue = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: null,\n lastRenderedState: null\n };\n hook.queue = queue;\n hook = dispatchOptimisticSetState.bind(\n null,\n currentlyRenderingFiber,\n !0,\n queue\n );\n queue.dispatch = hook;\n return [passthrough, hook];\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: function () {\n return (mountWorkInProgressHook().memoizedState = refreshCache.bind(\n null,\n currentlyRenderingFiber\n ));\n },\n useEffectEvent: function (callback) {\n var hook = mountWorkInProgressHook(),\n ref = { impl: callback };\n hook.memoizedState = ref;\n return function () {\n if (0 !== (executionContext & 2))\n throw Error(formatProdErrorMessage(440));\n return ref.impl.apply(void 0, arguments);\n };\n }\n },\n HooksDispatcherOnUpdate = {\n readContext: readContext,\n use: use,\n useCallback: updateCallback,\n useContext: readContext,\n useEffect: updateEffect,\n useImperativeHandle: updateImperativeHandle,\n useInsertionEffect: updateInsertionEffect,\n useLayoutEffect: updateLayoutEffect,\n useMemo: updateMemo,\n useReducer: updateReducer,\n useRef: updateRef,\n useState: function () {\n return updateReducer(basicStateReducer);\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = updateWorkInProgressHook();\n return updateDeferredValueImpl(\n hook,\n currentHook.memoizedState,\n value,\n initialValue\n );\n },\n useTransition: function () {\n var booleanOrThenable = updateReducer(basicStateReducer)[0],\n start = updateWorkInProgressHook().memoizedState;\n return [\n \"boolean\" === typeof booleanOrThenable\n ? booleanOrThenable\n : useThenable(booleanOrThenable),\n start\n ];\n },\n useSyncExternalStore: updateSyncExternalStore,\n useId: updateId,\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: updateActionState,\n useActionState: updateActionState,\n useOptimistic: function (passthrough, reducer) {\n var hook = updateWorkInProgressHook();\n return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: updateRefresh\n };\nHooksDispatcherOnUpdate.useEffectEvent = updateEvent;\nvar HooksDispatcherOnRerender = {\n readContext: readContext,\n use: use,\n useCallback: updateCallback,\n useContext: readContext,\n useEffect: updateEffect,\n useImperativeHandle: updateImperativeHandle,\n useInsertionEffect: updateInsertionEffect,\n useLayoutEffect: updateLayoutEffect,\n useMemo: updateMemo,\n useReducer: rerenderReducer,\n useRef: updateRef,\n useState: function () {\n return rerenderReducer(basicStateReducer);\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = updateWorkInProgressHook();\n return null === currentHook\n ? mountDeferredValueImpl(hook, value, initialValue)\n : updateDeferredValueImpl(\n hook,\n currentHook.memoizedState,\n value,\n initialValue\n );\n },\n useTransition: function () {\n var booleanOrThenable = rerenderReducer(basicStateReducer)[0],\n start = updateWorkInProgressHook().memoizedState;\n return [\n \"boolean\" === typeof booleanOrThenable\n ? booleanOrThenable\n : useThenable(booleanOrThenable),\n start\n ];\n },\n useSyncExternalStore: updateSyncExternalStore,\n useId: updateId,\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: rerenderActionState,\n useActionState: rerenderActionState,\n useOptimistic: function (passthrough, reducer) {\n var hook = updateWorkInProgressHook();\n if (null !== currentHook)\n return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n hook.baseState = passthrough;\n return [passthrough, hook.queue.dispatch];\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: updateRefresh\n};\nHooksDispatcherOnRerender.useEffectEvent = updateEvent;\nfunction applyDerivedStateFromProps(\n workInProgress,\n ctor,\n getDerivedStateFromProps,\n nextProps\n) {\n ctor = workInProgress.memoizedState;\n getDerivedStateFromProps = getDerivedStateFromProps(nextProps, ctor);\n getDerivedStateFromProps =\n null === getDerivedStateFromProps || void 0 === getDerivedStateFromProps\n ? ctor\n : assign({}, ctor, getDerivedStateFromProps);\n workInProgress.memoizedState = getDerivedStateFromProps;\n 0 === workInProgress.lanes &&\n (workInProgress.updateQueue.baseState = getDerivedStateFromProps);\n}\nvar classComponentUpdater = {\n enqueueSetState: function (inst, payload, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.payload = payload;\n void 0 !== callback && null !== callback && (update.callback = callback);\n payload = enqueueUpdate(inst, update, lane);\n null !== payload &&\n (scheduleUpdateOnFiber(payload, inst, lane),\n entangleTransitions(payload, inst, lane));\n },\n enqueueReplaceState: function (inst, payload, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.tag = 1;\n update.payload = payload;\n void 0 !== callback && null !== callback && (update.callback = callback);\n payload = enqueueUpdate(inst, update, lane);\n null !== payload &&\n (scheduleUpdateOnFiber(payload, inst, lane),\n entangleTransitions(payload, inst, lane));\n },\n enqueueForceUpdate: function (inst, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.tag = 2;\n void 0 !== callback && null !== callback && (update.callback = callback);\n callback = enqueueUpdate(inst, update, lane);\n null !== callback &&\n (scheduleUpdateOnFiber(callback, inst, lane),\n entangleTransitions(callback, inst, lane));\n }\n};\nfunction checkShouldComponentUpdate(\n workInProgress,\n ctor,\n oldProps,\n newProps,\n oldState,\n newState,\n nextContext\n) {\n workInProgress = workInProgress.stateNode;\n return \"function\" === typeof workInProgress.shouldComponentUpdate\n ? workInProgress.shouldComponentUpdate(newProps, newState, nextContext)\n : ctor.prototype && ctor.prototype.isPureReactComponent\n ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)\n : !0;\n}\nfunction callComponentWillReceiveProps(\n workInProgress,\n instance,\n newProps,\n nextContext\n) {\n workInProgress = instance.state;\n \"function\" === typeof instance.componentWillReceiveProps &&\n instance.componentWillReceiveProps(newProps, nextContext);\n \"function\" === typeof instance.UNSAFE_componentWillReceiveProps &&\n instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n instance.state !== workInProgress &&\n classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n}\nfunction resolveClassComponentProps(Component, baseProps) {\n var newProps = baseProps;\n if (\"ref\" in baseProps) {\n newProps = {};\n for (var propName in baseProps)\n \"ref\" !== propName && (newProps[propName] = baseProps[propName]);\n }\n if ((Component = Component.defaultProps)) {\n newProps === baseProps && (newProps = assign({}, newProps));\n for (var propName$73 in Component)\n void 0 === newProps[propName$73] &&\n (newProps[propName$73] = Component[propName$73]);\n }\n return newProps;\n}\nfunction defaultOnUncaughtError(error) {\n reportGlobalError(error);\n}\nfunction defaultOnCaughtError(error) {\n console.error(error);\n}\nfunction defaultOnRecoverableError(error) {\n reportGlobalError(error);\n}\nfunction logUncaughtError(root, errorInfo) {\n try {\n var onUncaughtError = root.onUncaughtError;\n onUncaughtError(errorInfo.value, { componentStack: errorInfo.stack });\n } catch (e$74) {\n setTimeout(function () {\n throw e$74;\n });\n }\n}\nfunction logCaughtError(root, boundary, errorInfo) {\n try {\n var onCaughtError = root.onCaughtError;\n onCaughtError(errorInfo.value, {\n componentStack: errorInfo.stack,\n errorBoundary: 1 === boundary.tag ? boundary.stateNode : null\n });\n } catch (e$75) {\n setTimeout(function () {\n throw e$75;\n });\n }\n}\nfunction createRootErrorUpdate(root, errorInfo, lane) {\n lane = createUpdate(lane);\n lane.tag = 3;\n lane.payload = { element: null };\n lane.callback = function () {\n logUncaughtError(root, errorInfo);\n };\n return lane;\n}\nfunction createClassErrorUpdate(lane) {\n lane = createUpdate(lane);\n lane.tag = 3;\n return lane;\n}\nfunction initializeClassErrorUpdate(update, root, fiber, errorInfo) {\n var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n if (\"function\" === typeof getDerivedStateFromError) {\n var error = errorInfo.value;\n update.payload = function () {\n return getDerivedStateFromError(error);\n };\n update.callback = function () {\n logCaughtError(root, fiber, errorInfo);\n };\n }\n var inst = fiber.stateNode;\n null !== inst &&\n \"function\" === typeof inst.componentDidCatch &&\n (update.callback = function () {\n logCaughtError(root, fiber, errorInfo);\n \"function\" !== typeof getDerivedStateFromError &&\n (null === legacyErrorBoundariesThatAlreadyFailed\n ? (legacyErrorBoundariesThatAlreadyFailed = new Set([this]))\n : legacyErrorBoundariesThatAlreadyFailed.add(this));\n var stack = errorInfo.stack;\n this.componentDidCatch(errorInfo.value, {\n componentStack: null !== stack ? stack : \"\"\n });\n });\n}\nfunction throwException(\n root,\n returnFiber,\n sourceFiber,\n value,\n rootRenderLanes\n) {\n sourceFiber.flags |= 32768;\n if (\n null !== value &&\n \"object\" === typeof value &&\n \"function\" === typeof value.then\n ) {\n returnFiber = sourceFiber.alternate;\n null !== returnFiber &&\n propagateParentContextChanges(\n returnFiber,\n sourceFiber,\n rootRenderLanes,\n !0\n );\n sourceFiber = suspenseHandlerStackCursor.current;\n if (null !== sourceFiber) {\n switch (sourceFiber.tag) {\n case 31:\n case 13:\n return (\n null === shellBoundary\n ? renderDidSuspendDelayIfPossible()\n : null === sourceFiber.alternate &&\n 0 === workInProgressRootExitStatus &&\n (workInProgressRootExitStatus = 3),\n (sourceFiber.flags &= -257),\n (sourceFiber.flags |= 65536),\n (sourceFiber.lanes = rootRenderLanes),\n value === noopSuspenseyCommitThenable\n ? (sourceFiber.flags |= 16384)\n : ((returnFiber = sourceFiber.updateQueue),\n null === returnFiber\n ? (sourceFiber.updateQueue = new Set([value]))\n : returnFiber.add(value),\n attachPingListener(root, value, rootRenderLanes)),\n !1\n );\n case 22:\n return (\n (sourceFiber.flags |= 65536),\n value === noopSuspenseyCommitThenable\n ? (sourceFiber.flags |= 16384)\n : ((returnFiber = sourceFiber.updateQueue),\n null === returnFiber\n ? ((returnFiber = {\n transitions: null,\n markerInstances: null,\n retryQueue: new Set([value])\n }),\n (sourceFiber.updateQueue = returnFiber))\n : ((sourceFiber = returnFiber.retryQueue),\n null === sourceFiber\n ? (returnFiber.retryQueue = new Set([value]))\n : sourceFiber.add(value)),\n attachPingListener(root, value, rootRenderLanes)),\n !1\n );\n }\n throw Error(formatProdErrorMessage(435, sourceFiber.tag));\n }\n attachPingListener(root, value, rootRenderLanes);\n renderDidSuspendDelayIfPossible();\n return !1;\n }\n if (isHydrating)\n return (\n (returnFiber = suspenseHandlerStackCursor.current),\n null !== returnFiber\n ? (0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256),\n (returnFiber.flags |= 65536),\n (returnFiber.lanes = rootRenderLanes),\n value !== HydrationMismatchException &&\n ((root = Error(formatProdErrorMessage(422), { cause: value })),\n queueHydrationError(createCapturedValueAtFiber(root, sourceFiber))))\n : (value !== HydrationMismatchException &&\n ((returnFiber = Error(formatProdErrorMessage(423), {\n cause: value\n })),\n queueHydrationError(\n createCapturedValueAtFiber(returnFiber, sourceFiber)\n )),\n (root = root.current.alternate),\n (root.flags |= 65536),\n (rootRenderLanes &= -rootRenderLanes),\n (root.lanes |= rootRenderLanes),\n (value = createCapturedValueAtFiber(value, sourceFiber)),\n (rootRenderLanes = createRootErrorUpdate(\n root.stateNode,\n value,\n rootRenderLanes\n )),\n enqueueCapturedUpdate(root, rootRenderLanes),\n 4 !== workInProgressRootExitStatus &&\n (workInProgressRootExitStatus = 2)),\n !1\n );\n var wrapperError = Error(formatProdErrorMessage(520), { cause: value });\n wrapperError = createCapturedValueAtFiber(wrapperError, sourceFiber);\n null === workInProgressRootConcurrentErrors\n ? (workInProgressRootConcurrentErrors = [wrapperError])\n : workInProgressRootConcurrentErrors.push(wrapperError);\n 4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2);\n if (null === returnFiber) return !0;\n value = createCapturedValueAtFiber(value, sourceFiber);\n sourceFiber = returnFiber;\n do {\n switch (sourceFiber.tag) {\n case 3:\n return (\n (sourceFiber.flags |= 65536),\n (root = rootRenderLanes & -rootRenderLanes),\n (sourceFiber.lanes |= root),\n (root = createRootErrorUpdate(sourceFiber.stateNode, value, root)),\n enqueueCapturedUpdate(sourceFiber, root),\n !1\n );\n case 1:\n if (\n ((returnFiber = sourceFiber.type),\n (wrapperError = sourceFiber.stateNode),\n 0 === (sourceFiber.flags & 128) &&\n (\"function\" === typeof returnFiber.getDerivedStateFromError ||\n (null !== wrapperError &&\n \"function\" === typeof wrapperError.componentDidCatch &&\n (null === legacyErrorBoundariesThatAlreadyFailed ||\n !legacyErrorBoundariesThatAlreadyFailed.has(wrapperError)))))\n )\n return (\n (sourceFiber.flags |= 65536),\n (rootRenderLanes &= -rootRenderLanes),\n (sourceFiber.lanes |= rootRenderLanes),\n (rootRenderLanes = createClassErrorUpdate(rootRenderLanes)),\n initializeClassErrorUpdate(\n rootRenderLanes,\n root,\n sourceFiber,\n value\n ),\n enqueueCapturedUpdate(sourceFiber, rootRenderLanes),\n !1\n );\n }\n sourceFiber = sourceFiber.return;\n } while (null !== sourceFiber);\n return !1;\n}\nvar SelectiveHydrationException = Error(formatProdErrorMessage(461)),\n didReceiveUpdate = !1;\nfunction reconcileChildren(current, workInProgress, nextChildren, renderLanes) {\n workInProgress.child =\n null === current\n ? mountChildFibers(workInProgress, null, nextChildren, renderLanes)\n : reconcileChildFibers(\n workInProgress,\n current.child,\n nextChildren,\n renderLanes\n );\n}\nfunction updateForwardRef(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n Component = Component.render;\n var ref = workInProgress.ref;\n if (\"ref\" in nextProps) {\n var propsWithoutRef = {};\n for (var key in nextProps)\n \"ref\" !== key && (propsWithoutRef[key] = nextProps[key]);\n } else propsWithoutRef = nextProps;\n prepareToReadContext(workInProgress);\n nextProps = renderWithHooks(\n current,\n workInProgress,\n Component,\n propsWithoutRef,\n ref,\n renderLanes\n );\n key = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && key && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n return workInProgress.child;\n}\nfunction updateMemoComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n if (null === current) {\n var type = Component.type;\n if (\n \"function\" === typeof type &&\n !shouldConstruct(type) &&\n void 0 === type.defaultProps &&\n null === Component.compare\n )\n return (\n (workInProgress.tag = 15),\n (workInProgress.type = type),\n updateSimpleMemoComponent(\n current,\n workInProgress,\n type,\n nextProps,\n renderLanes\n )\n );\n current = createFiberFromTypeAndProps(\n Component.type,\n null,\n nextProps,\n workInProgress,\n workInProgress.mode,\n renderLanes\n );\n current.ref = workInProgress.ref;\n current.return = workInProgress;\n return (workInProgress.child = current);\n }\n type = current.child;\n if (!checkScheduledUpdateOrContext(current, renderLanes)) {\n var prevProps = type.memoizedProps;\n Component = Component.compare;\n Component = null !== Component ? Component : shallowEqual;\n if (Component(prevProps, nextProps) && current.ref === workInProgress.ref)\n return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n }\n workInProgress.flags |= 1;\n current = createWorkInProgress(type, nextProps);\n current.ref = workInProgress.ref;\n current.return = workInProgress;\n return (workInProgress.child = current);\n}\nfunction updateSimpleMemoComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n if (null !== current) {\n var prevProps = current.memoizedProps;\n if (\n shallowEqual(prevProps, nextProps) &&\n current.ref === workInProgress.ref\n )\n if (\n ((didReceiveUpdate = !1),\n (workInProgress.pendingProps = nextProps = prevProps),\n checkScheduledUpdateOrContext(current, renderLanes))\n )\n 0 !== (current.flags & 131072) && (didReceiveUpdate = !0);\n else\n return (\n (workInProgress.lanes = current.lanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n }\n return updateFunctionComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n );\n}\nfunction updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n nextProps\n) {\n var nextChildren = nextProps.children,\n prevState = null !== current ? current.memoizedState : null;\n null === current &&\n null === workInProgress.stateNode &&\n (workInProgress.stateNode = {\n _visibility: 1,\n _pendingMarkers: null,\n _retryCache: null,\n _transitions: null\n });\n if (\"hidden\" === nextProps.mode) {\n if (0 !== (workInProgress.flags & 128)) {\n prevState =\n null !== prevState ? prevState.baseLanes | renderLanes : renderLanes;\n if (null !== current) {\n nextProps = workInProgress.child = current.child;\n for (nextChildren = 0; null !== nextProps; )\n (nextChildren =\n nextChildren | nextProps.lanes | nextProps.childLanes),\n (nextProps = nextProps.sibling);\n nextProps = nextChildren & ~prevState;\n } else (nextProps = 0), (workInProgress.child = null);\n return deferHiddenOffscreenComponent(\n current,\n workInProgress,\n prevState,\n renderLanes,\n nextProps\n );\n }\n if (0 !== (renderLanes & 536870912))\n (workInProgress.memoizedState = { baseLanes: 0, cachePool: null }),\n null !== current &&\n pushTransition(\n workInProgress,\n null !== prevState ? prevState.cachePool : null\n ),\n null !== prevState\n ? pushHiddenContext(workInProgress, prevState)\n : reuseHiddenContextOnStack(),\n pushOffscreenSuspenseHandler(workInProgress);\n else\n return (\n (nextProps = workInProgress.lanes = 536870912),\n deferHiddenOffscreenComponent(\n current,\n workInProgress,\n null !== prevState ? prevState.baseLanes | renderLanes : renderLanes,\n renderLanes,\n nextProps\n )\n );\n } else\n null !== prevState\n ? (pushTransition(workInProgress, prevState.cachePool),\n pushHiddenContext(workInProgress, prevState),\n reuseSuspenseHandlerOnStack(workInProgress),\n (workInProgress.memoizedState = null))\n : (null !== current && pushTransition(workInProgress, null),\n reuseHiddenContextOnStack(),\n reuseSuspenseHandlerOnStack(workInProgress));\n reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n return workInProgress.child;\n}\nfunction bailoutOffscreenComponent(current, workInProgress) {\n (null !== current && 22 === current.tag) ||\n null !== workInProgress.stateNode ||\n (workInProgress.stateNode = {\n _visibility: 1,\n _pendingMarkers: null,\n _retryCache: null,\n _transitions: null\n });\n return workInProgress.sibling;\n}\nfunction deferHiddenOffscreenComponent(\n current,\n workInProgress,\n nextBaseLanes,\n renderLanes,\n remainingChildLanes\n) {\n var JSCompiler_inline_result = peekCacheFromPool();\n JSCompiler_inline_result =\n null === JSCompiler_inline_result\n ? null\n : { parent: CacheContext._currentValue, pool: JSCompiler_inline_result };\n workInProgress.memoizedState = {\n baseLanes: nextBaseLanes,\n cachePool: JSCompiler_inline_result\n };\n null !== current && pushTransition(workInProgress, null);\n reuseHiddenContextOnStack();\n pushOffscreenSuspenseHandler(workInProgress);\n null !== current &&\n propagateParentContextChanges(current, workInProgress, renderLanes, !0);\n workInProgress.childLanes = remainingChildLanes;\n return null;\n}\nfunction mountActivityChildren(workInProgress, nextProps) {\n nextProps = mountWorkInProgressOffscreenFiber(\n { mode: nextProps.mode, children: nextProps.children },\n workInProgress.mode\n );\n nextProps.ref = workInProgress.ref;\n workInProgress.child = nextProps;\n nextProps.return = workInProgress;\n return nextProps;\n}\nfunction retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n) {\n reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n current = mountActivityChildren(workInProgress, workInProgress.pendingProps);\n current.flags |= 2;\n popSuspenseHandler(workInProgress);\n workInProgress.memoizedState = null;\n return current;\n}\nfunction updateActivityComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n didSuspend = 0 !== (workInProgress.flags & 128);\n workInProgress.flags &= -129;\n if (null === current) {\n if (isHydrating) {\n if (\"hidden\" === nextProps.mode)\n return (\n (current = mountActivityChildren(workInProgress, nextProps)),\n (workInProgress.lanes = 536870912),\n bailoutOffscreenComponent(null, current)\n );\n pushDehydratedActivitySuspenseHandler(workInProgress);\n (current = nextHydratableInstance)\n ? ((current = canHydrateHydrationBoundary(\n current,\n rootOrSingletonContext\n )),\n (current = null !== current && \"&\" === current.data ? current : null),\n null !== current &&\n ((workInProgress.memoizedState = {\n dehydrated: current,\n treeContext:\n null !== treeContextProvider\n ? { id: treeContextId, overflow: treeContextOverflow }\n : null,\n retryLane: 536870912,\n hydrationErrors: null\n }),\n (renderLanes = createFiberFromDehydratedFragment(current)),\n (renderLanes.return = workInProgress),\n (workInProgress.child = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null)))\n : (current = null);\n if (null === current) throw throwOnHydrationMismatch(workInProgress);\n workInProgress.lanes = 536870912;\n return null;\n }\n return mountActivityChildren(workInProgress, nextProps);\n }\n var prevState = current.memoizedState;\n if (null !== prevState) {\n var dehydrated = prevState.dehydrated;\n pushDehydratedActivitySuspenseHandler(workInProgress);\n if (didSuspend)\n if (workInProgress.flags & 256)\n (workInProgress.flags &= -257),\n (workInProgress = retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n ));\n else if (null !== workInProgress.memoizedState)\n (workInProgress.child = current.child),\n (workInProgress.flags |= 128),\n (workInProgress = null);\n else throw Error(formatProdErrorMessage(558));\n else if (\n (didReceiveUpdate ||\n propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n (didSuspend = 0 !== (renderLanes & current.childLanes)),\n didReceiveUpdate || didSuspend)\n ) {\n nextProps = workInProgressRoot;\n if (\n null !== nextProps &&\n ((dehydrated = getBumpedLaneForHydration(nextProps, renderLanes)),\n 0 !== dehydrated && dehydrated !== prevState.retryLane)\n )\n throw (\n ((prevState.retryLane = dehydrated),\n enqueueConcurrentRenderForLane(current, dehydrated),\n scheduleUpdateOnFiber(nextProps, current, dehydrated),\n SelectiveHydrationException)\n );\n renderDidSuspendDelayIfPossible();\n workInProgress = retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else\n (current = prevState.treeContext),\n (nextHydratableInstance = getNextHydratable(dehydrated.nextSibling)),\n (hydrationParentFiber = workInProgress),\n (isHydrating = !0),\n (hydrationErrors = null),\n (rootOrSingletonContext = !1),\n null !== current &&\n restoreSuspendedTreeContext(workInProgress, current),\n (workInProgress = mountActivityChildren(workInProgress, nextProps)),\n (workInProgress.flags |= 4096);\n return workInProgress;\n }\n current = createWorkInProgress(current.child, {\n mode: nextProps.mode,\n children: nextProps.children\n });\n current.ref = workInProgress.ref;\n workInProgress.child = current;\n current.return = workInProgress;\n return current;\n}\nfunction markRef(current, workInProgress) {\n var ref = workInProgress.ref;\n if (null === ref)\n null !== current &&\n null !== current.ref &&\n (workInProgress.flags |= 4194816);\n else {\n if (\"function\" !== typeof ref && \"object\" !== typeof ref)\n throw Error(formatProdErrorMessage(284));\n if (null === current || current.ref !== ref)\n workInProgress.flags |= 4194816;\n }\n}\nfunction updateFunctionComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n Component = renderWithHooks(\n current,\n workInProgress,\n Component,\n nextProps,\n void 0,\n renderLanes\n );\n nextProps = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && nextProps && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, Component, renderLanes);\n return workInProgress.child;\n}\nfunction replayFunctionComponent(\n current,\n workInProgress,\n nextProps,\n Component,\n secondArg,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n workInProgress.updateQueue = null;\n nextProps = renderWithHooksAgain(\n workInProgress,\n Component,\n nextProps,\n secondArg\n );\n finishRenderingHooks(current);\n Component = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && Component && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n return workInProgress.child;\n}\nfunction updateClassComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n if (null === workInProgress.stateNode) {\n var context = emptyContextObject,\n contextType = Component.contextType;\n \"object\" === typeof contextType &&\n null !== contextType &&\n (context = readContext(contextType));\n context = new Component(nextProps, context);\n workInProgress.memoizedState =\n null !== context.state && void 0 !== context.state ? context.state : null;\n context.updater = classComponentUpdater;\n workInProgress.stateNode = context;\n context._reactInternals = workInProgress;\n context = workInProgress.stateNode;\n context.props = nextProps;\n context.state = workInProgress.memoizedState;\n context.refs = {};\n initializeUpdateQueue(workInProgress);\n contextType = Component.contextType;\n context.context =\n \"object\" === typeof contextType && null !== contextType\n ? readContext(contextType)\n : emptyContextObject;\n context.state = workInProgress.memoizedState;\n contextType = Component.getDerivedStateFromProps;\n \"function\" === typeof contextType &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n contextType,\n nextProps\n ),\n (context.state = workInProgress.memoizedState));\n \"function\" === typeof Component.getDerivedStateFromProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate ||\n (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n \"function\" !== typeof context.componentWillMount) ||\n ((contextType = context.state),\n \"function\" === typeof context.componentWillMount &&\n context.componentWillMount(),\n \"function\" === typeof context.UNSAFE_componentWillMount &&\n context.UNSAFE_componentWillMount(),\n contextType !== context.state &&\n classComponentUpdater.enqueueReplaceState(context, context.state, null),\n processUpdateQueue(workInProgress, nextProps, context, renderLanes),\n suspendIfUpdateReadFromEntangledAsyncAction(),\n (context.state = workInProgress.memoizedState));\n \"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308);\n nextProps = !0;\n } else if (null === current) {\n context = workInProgress.stateNode;\n var unresolvedOldProps = workInProgress.memoizedProps,\n oldProps = resolveClassComponentProps(Component, unresolvedOldProps);\n context.props = oldProps;\n var oldContext = context.context,\n contextType$jscomp$0 = Component.contextType;\n contextType = emptyContextObject;\n \"object\" === typeof contextType$jscomp$0 &&\n null !== contextType$jscomp$0 &&\n (contextType = readContext(contextType$jscomp$0));\n var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n contextType$jscomp$0 =\n \"function\" === typeof getDerivedStateFromProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate;\n unresolvedOldProps = workInProgress.pendingProps !== unresolvedOldProps;\n contextType$jscomp$0 ||\n (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n \"function\" !== typeof context.componentWillReceiveProps) ||\n ((unresolvedOldProps || oldContext !== contextType) &&\n callComponentWillReceiveProps(\n workInProgress,\n context,\n nextProps,\n contextType\n ));\n hasForceUpdate = !1;\n var oldState = workInProgress.memoizedState;\n context.state = oldState;\n processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n suspendIfUpdateReadFromEntangledAsyncAction();\n oldContext = workInProgress.memoizedState;\n unresolvedOldProps || oldState !== oldContext || hasForceUpdate\n ? (\"function\" === typeof getDerivedStateFromProps &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n getDerivedStateFromProps,\n nextProps\n ),\n (oldContext = workInProgress.memoizedState)),\n (oldProps =\n hasForceUpdate ||\n checkShouldComponentUpdate(\n workInProgress,\n Component,\n oldProps,\n nextProps,\n oldState,\n oldContext,\n contextType\n ))\n ? (contextType$jscomp$0 ||\n (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n \"function\" !== typeof context.componentWillMount) ||\n (\"function\" === typeof context.componentWillMount &&\n context.componentWillMount(),\n \"function\" === typeof context.UNSAFE_componentWillMount &&\n context.UNSAFE_componentWillMount()),\n \"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308))\n : (\"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308),\n (workInProgress.memoizedProps = nextProps),\n (workInProgress.memoizedState = oldContext)),\n (context.props = nextProps),\n (context.state = oldContext),\n (context.context = contextType),\n (nextProps = oldProps))\n : (\"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308),\n (nextProps = !1));\n } else {\n context = workInProgress.stateNode;\n cloneUpdateQueue(current, workInProgress);\n contextType = workInProgress.memoizedProps;\n contextType$jscomp$0 = resolveClassComponentProps(Component, contextType);\n context.props = contextType$jscomp$0;\n getDerivedStateFromProps = workInProgress.pendingProps;\n oldState = context.context;\n oldContext = Component.contextType;\n oldProps = emptyContextObject;\n \"object\" === typeof oldContext &&\n null !== oldContext &&\n (oldProps = readContext(oldContext));\n unresolvedOldProps = Component.getDerivedStateFromProps;\n (oldContext =\n \"function\" === typeof unresolvedOldProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate) ||\n (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n \"function\" !== typeof context.componentWillReceiveProps) ||\n ((contextType !== getDerivedStateFromProps || oldState !== oldProps) &&\n callComponentWillReceiveProps(\n workInProgress,\n context,\n nextProps,\n oldProps\n ));\n hasForceUpdate = !1;\n oldState = workInProgress.memoizedState;\n context.state = oldState;\n processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n suspendIfUpdateReadFromEntangledAsyncAction();\n var newState = workInProgress.memoizedState;\n contextType !== getDerivedStateFromProps ||\n oldState !== newState ||\n hasForceUpdate ||\n (null !== current &&\n null !== current.dependencies &&\n checkIfContextChanged(current.dependencies))\n ? (\"function\" === typeof unresolvedOldProps &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n unresolvedOldProps,\n nextProps\n ),\n (newState = workInProgress.memoizedState)),\n (contextType$jscomp$0 =\n hasForceUpdate ||\n checkShouldComponentUpdate(\n workInProgress,\n Component,\n contextType$jscomp$0,\n nextProps,\n oldState,\n newState,\n oldProps\n ) ||\n (null !== current &&\n null !== current.dependencies &&\n checkIfContextChanged(current.dependencies)))\n ? (oldContext ||\n (\"function\" !== typeof context.UNSAFE_componentWillUpdate &&\n \"function\" !== typeof context.componentWillUpdate) ||\n (\"function\" === typeof context.componentWillUpdate &&\n context.componentWillUpdate(nextProps, newState, oldProps),\n \"function\" === typeof context.UNSAFE_componentWillUpdate &&\n context.UNSAFE_componentWillUpdate(\n nextProps,\n newState,\n oldProps\n )),\n \"function\" === typeof context.componentDidUpdate &&\n (workInProgress.flags |= 4),\n \"function\" === typeof context.getSnapshotBeforeUpdate &&\n (workInProgress.flags |= 1024))\n : (\"function\" !== typeof context.componentDidUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 4),\n \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 1024),\n (workInProgress.memoizedProps = nextProps),\n (workInProgress.memoizedState = newState)),\n (context.props = nextProps),\n (context.state = newState),\n (context.context = oldProps),\n (nextProps = contextType$jscomp$0))\n : (\"function\" !== typeof context.componentDidUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 4),\n \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 1024),\n (nextProps = !1));\n }\n context = nextProps;\n markRef(current, workInProgress);\n nextProps = 0 !== (workInProgress.flags & 128);\n context || nextProps\n ? ((context = workInProgress.stateNode),\n (Component =\n nextProps && \"function\" !== typeof Component.getDerivedStateFromError\n ? null\n : context.render()),\n (workInProgress.flags |= 1),\n null !== current && nextProps\n ? ((workInProgress.child = reconcileChildFibers(\n workInProgress,\n current.child,\n null,\n renderLanes\n )),\n (workInProgress.child = reconcileChildFibers(\n workInProgress,\n null,\n Component,\n renderLanes\n )))\n : reconcileChildren(current, workInProgress, Component, renderLanes),\n (workInProgress.memoizedState = context.state),\n (current = workInProgress.child))\n : (current = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n ));\n return current;\n}\nfunction mountHostRootWithoutHydrating(\n current,\n workInProgress,\n nextChildren,\n renderLanes\n) {\n resetHydrationState();\n workInProgress.flags |= 256;\n reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n return workInProgress.child;\n}\nvar SUSPENDED_MARKER = {\n dehydrated: null,\n treeContext: null,\n retryLane: 0,\n hydrationErrors: null\n};\nfunction mountSuspenseOffscreenState(renderLanes) {\n return { baseLanes: renderLanes, cachePool: getSuspendedCache() };\n}\nfunction getRemainingWorkInPrimaryTree(\n current,\n primaryTreeDidDefer,\n renderLanes\n) {\n current = null !== current ? current.childLanes & ~renderLanes : 0;\n primaryTreeDidDefer && (current |= workInProgressDeferredLane);\n return current;\n}\nfunction updateSuspenseComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n showFallback = !1,\n didSuspend = 0 !== (workInProgress.flags & 128),\n JSCompiler_temp;\n (JSCompiler_temp = didSuspend) ||\n (JSCompiler_temp =\n null !== current && null === current.memoizedState\n ? !1\n : 0 !== (suspenseStackCursor.current & 2));\n JSCompiler_temp && ((showFallback = !0), (workInProgress.flags &= -129));\n JSCompiler_temp = 0 !== (workInProgress.flags & 32);\n workInProgress.flags &= -33;\n if (null === current) {\n if (isHydrating) {\n showFallback\n ? pushPrimaryTreeSuspenseHandler(workInProgress)\n : reuseSuspenseHandlerOnStack(workInProgress);\n (current = nextHydratableInstance)\n ? ((current = canHydrateHydrationBoundary(\n current,\n rootOrSingletonContext\n )),\n (current = null !== current && \"&\" !== current.data ? current : null),\n null !== current &&\n ((workInProgress.memoizedState = {\n dehydrated: current,\n treeContext:\n null !== treeContextProvider\n ? { id: treeContextId, overflow: treeContextOverflow }\n : null,\n retryLane: 536870912,\n hydrationErrors: null\n }),\n (renderLanes = createFiberFromDehydratedFragment(current)),\n (renderLanes.return = workInProgress),\n (workInProgress.child = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null)))\n : (current = null);\n if (null === current) throw throwOnHydrationMismatch(workInProgress);\n isSuspenseInstanceFallback(current)\n ? (workInProgress.lanes = 32)\n : (workInProgress.lanes = 536870912);\n return null;\n }\n var nextPrimaryChildren = nextProps.children;\n nextProps = nextProps.fallback;\n if (showFallback)\n return (\n reuseSuspenseHandlerOnStack(workInProgress),\n (showFallback = workInProgress.mode),\n (nextPrimaryChildren = mountWorkInProgressOffscreenFiber(\n { mode: \"hidden\", children: nextPrimaryChildren },\n showFallback\n )),\n (nextProps = createFiberFromFragment(\n nextProps,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.return = workInProgress),\n (nextPrimaryChildren.sibling = nextProps),\n (workInProgress.child = nextPrimaryChildren),\n (nextProps = workInProgress.child),\n (nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes)),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n bailoutOffscreenComponent(null, nextProps)\n );\n pushPrimaryTreeSuspenseHandler(workInProgress);\n return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren);\n }\n var prevState = current.memoizedState;\n if (\n null !== prevState &&\n ((nextPrimaryChildren = prevState.dehydrated), null !== nextPrimaryChildren)\n ) {\n if (didSuspend)\n workInProgress.flags & 256\n ? (pushPrimaryTreeSuspenseHandler(workInProgress),\n (workInProgress.flags &= -257),\n (workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n )))\n : null !== workInProgress.memoizedState\n ? (reuseSuspenseHandlerOnStack(workInProgress),\n (workInProgress.child = current.child),\n (workInProgress.flags |= 128),\n (workInProgress = null))\n : (reuseSuspenseHandlerOnStack(workInProgress),\n (nextPrimaryChildren = nextProps.fallback),\n (showFallback = workInProgress.mode),\n (nextProps = mountWorkInProgressOffscreenFiber(\n { mode: \"visible\", children: nextProps.children },\n showFallback\n )),\n (nextPrimaryChildren = createFiberFromFragment(\n nextPrimaryChildren,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.flags |= 2),\n (nextProps.return = workInProgress),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.sibling = nextPrimaryChildren),\n (workInProgress.child = nextProps),\n reconcileChildFibers(\n workInProgress,\n current.child,\n null,\n renderLanes\n ),\n (nextProps = workInProgress.child),\n (nextProps.memoizedState =\n mountSuspenseOffscreenState(renderLanes)),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n (workInProgress = bailoutOffscreenComponent(null, nextProps)));\n else if (\n (pushPrimaryTreeSuspenseHandler(workInProgress),\n isSuspenseInstanceFallback(nextPrimaryChildren))\n ) {\n JSCompiler_temp =\n nextPrimaryChildren.nextSibling &&\n nextPrimaryChildren.nextSibling.dataset;\n if (JSCompiler_temp) var digest = JSCompiler_temp.dgst;\n JSCompiler_temp = digest;\n nextProps = Error(formatProdErrorMessage(419));\n nextProps.stack = \"\";\n nextProps.digest = JSCompiler_temp;\n queueHydrationError({ value: nextProps, source: null, stack: null });\n workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else if (\n (didReceiveUpdate ||\n propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)),\n didReceiveUpdate || JSCompiler_temp)\n ) {\n JSCompiler_temp = workInProgressRoot;\n if (\n null !== JSCompiler_temp &&\n ((nextProps = getBumpedLaneForHydration(JSCompiler_temp, renderLanes)),\n 0 !== nextProps && nextProps !== prevState.retryLane)\n )\n throw (\n ((prevState.retryLane = nextProps),\n enqueueConcurrentRenderForLane(current, nextProps),\n scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps),\n SelectiveHydrationException)\n );\n isSuspenseInstancePending(nextPrimaryChildren) ||\n renderDidSuspendDelayIfPossible();\n workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else\n isSuspenseInstancePending(nextPrimaryChildren)\n ? ((workInProgress.flags |= 192),\n (workInProgress.child = current.child),\n (workInProgress = null))\n : ((current = prevState.treeContext),\n (nextHydratableInstance = getNextHydratable(\n nextPrimaryChildren.nextSibling\n )),\n (hydrationParentFiber = workInProgress),\n (isHydrating = !0),\n (hydrationErrors = null),\n (rootOrSingletonContext = !1),\n null !== current &&\n restoreSuspendedTreeContext(workInProgress, current),\n (workInProgress = mountSuspensePrimaryChildren(\n workInProgress,\n nextProps.children\n )),\n (workInProgress.flags |= 4096));\n return workInProgress;\n }\n if (showFallback)\n return (\n reuseSuspenseHandlerOnStack(workInProgress),\n (nextPrimaryChildren = nextProps.fallback),\n (showFallback = workInProgress.mode),\n (prevState = current.child),\n (digest = prevState.sibling),\n (nextProps = createWorkInProgress(prevState, {\n mode: \"hidden\",\n children: nextProps.children\n })),\n (nextProps.subtreeFlags = prevState.subtreeFlags & 65011712),\n null !== digest\n ? (nextPrimaryChildren = createWorkInProgress(\n digest,\n nextPrimaryChildren\n ))\n : ((nextPrimaryChildren = createFiberFromFragment(\n nextPrimaryChildren,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.flags |= 2)),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.return = workInProgress),\n (nextProps.sibling = nextPrimaryChildren),\n (workInProgress.child = nextProps),\n bailoutOffscreenComponent(null, nextProps),\n (nextProps = workInProgress.child),\n (nextPrimaryChildren = current.child.memoizedState),\n null === nextPrimaryChildren\n ? (nextPrimaryChildren = mountSuspenseOffscreenState(renderLanes))\n : ((showFallback = nextPrimaryChildren.cachePool),\n null !== showFallback\n ? ((prevState = CacheContext._currentValue),\n (showFallback =\n showFallback.parent !== prevState\n ? { parent: prevState, pool: prevState }\n : showFallback))\n : (showFallback = getSuspendedCache()),\n (nextPrimaryChildren = {\n baseLanes: nextPrimaryChildren.baseLanes | renderLanes,\n cachePool: showFallback\n })),\n (nextProps.memoizedState = nextPrimaryChildren),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n bailoutOffscreenComponent(current.child, nextProps)\n );\n pushPrimaryTreeSuspenseHandler(workInProgress);\n renderLanes = current.child;\n current = renderLanes.sibling;\n renderLanes = createWorkInProgress(renderLanes, {\n mode: \"visible\",\n children: nextProps.children\n });\n renderLanes.return = workInProgress;\n renderLanes.sibling = null;\n null !== current &&\n ((JSCompiler_temp = workInProgress.deletions),\n null === JSCompiler_temp\n ? ((workInProgress.deletions = [current]), (workInProgress.flags |= 16))\n : JSCompiler_temp.push(current));\n workInProgress.child = renderLanes;\n workInProgress.memoizedState = null;\n return renderLanes;\n}\nfunction mountSuspensePrimaryChildren(workInProgress, primaryChildren) {\n primaryChildren = mountWorkInProgressOffscreenFiber(\n { mode: \"visible\", children: primaryChildren },\n workInProgress.mode\n );\n primaryChildren.return = workInProgress;\n return (workInProgress.child = primaryChildren);\n}\nfunction mountWorkInProgressOffscreenFiber(offscreenProps, mode) {\n offscreenProps = createFiberImplClass(22, offscreenProps, null, mode);\n offscreenProps.lanes = 0;\n return offscreenProps;\n}\nfunction retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n) {\n reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n current = mountSuspensePrimaryChildren(\n workInProgress,\n workInProgress.pendingProps.children\n );\n current.flags |= 2;\n workInProgress.memoizedState = null;\n return current;\n}\nfunction scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {\n fiber.lanes |= renderLanes;\n var alternate = fiber.alternate;\n null !== alternate && (alternate.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);\n}\nfunction initSuspenseListRenderState(\n workInProgress,\n isBackwards,\n tail,\n lastContentRow,\n tailMode,\n treeForkCount\n) {\n var renderState = workInProgress.memoizedState;\n null === renderState\n ? (workInProgress.memoizedState = {\n isBackwards: isBackwards,\n rendering: null,\n renderingStartTime: 0,\n last: lastContentRow,\n tail: tail,\n tailMode: tailMode,\n treeForkCount: treeForkCount\n })\n : ((renderState.isBackwards = isBackwards),\n (renderState.rendering = null),\n (renderState.renderingStartTime = 0),\n (renderState.last = lastContentRow),\n (renderState.tail = tail),\n (renderState.tailMode = tailMode),\n (renderState.treeForkCount = treeForkCount));\n}\nfunction updateSuspenseListComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n revealOrder = nextProps.revealOrder,\n tailMode = nextProps.tail;\n nextProps = nextProps.children;\n var suspenseContext = suspenseStackCursor.current,\n shouldForceFallback = 0 !== (suspenseContext & 2);\n shouldForceFallback\n ? ((suspenseContext = (suspenseContext & 1) | 2),\n (workInProgress.flags |= 128))\n : (suspenseContext &= 1);\n push(suspenseStackCursor, suspenseContext);\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n nextProps = isHydrating ? treeForkCount : 0;\n if (!shouldForceFallback && null !== current && 0 !== (current.flags & 128))\n a: for (current = workInProgress.child; null !== current; ) {\n if (13 === current.tag)\n null !== current.memoizedState &&\n scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n else if (19 === current.tag)\n scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n else if (null !== current.child) {\n current.child.return = current;\n current = current.child;\n continue;\n }\n if (current === workInProgress) break a;\n for (; null === current.sibling; ) {\n if (null === current.return || current.return === workInProgress)\n break a;\n current = current.return;\n }\n current.sibling.return = current.return;\n current = current.sibling;\n }\n switch (revealOrder) {\n case \"forwards\":\n renderLanes = workInProgress.child;\n for (revealOrder = null; null !== renderLanes; )\n (current = renderLanes.alternate),\n null !== current &&\n null === findFirstSuspended(current) &&\n (revealOrder = renderLanes),\n (renderLanes = renderLanes.sibling);\n renderLanes = revealOrder;\n null === renderLanes\n ? ((revealOrder = workInProgress.child), (workInProgress.child = null))\n : ((revealOrder = renderLanes.sibling), (renderLanes.sibling = null));\n initSuspenseListRenderState(\n workInProgress,\n !1,\n revealOrder,\n renderLanes,\n tailMode,\n nextProps\n );\n break;\n case \"backwards\":\n case \"unstable_legacy-backwards\":\n renderLanes = null;\n revealOrder = workInProgress.child;\n for (workInProgress.child = null; null !== revealOrder; ) {\n current = revealOrder.alternate;\n if (null !== current && null === findFirstSuspended(current)) {\n workInProgress.child = revealOrder;\n break;\n }\n current = revealOrder.sibling;\n revealOrder.sibling = renderLanes;\n renderLanes = revealOrder;\n revealOrder = current;\n }\n initSuspenseListRenderState(\n workInProgress,\n !0,\n renderLanes,\n null,\n tailMode,\n nextProps\n );\n break;\n case \"together\":\n initSuspenseListRenderState(\n workInProgress,\n !1,\n null,\n null,\n void 0,\n nextProps\n );\n break;\n default:\n workInProgress.memoizedState = null;\n }\n return workInProgress.child;\n}\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {\n null !== current && (workInProgress.dependencies = current.dependencies);\n workInProgressRootSkippedLanes |= workInProgress.lanes;\n if (0 === (renderLanes & workInProgress.childLanes))\n if (null !== current) {\n if (\n (propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n !1\n ),\n 0 === (renderLanes & workInProgress.childLanes))\n )\n return null;\n } else return null;\n if (null !== current && workInProgress.child !== current.child)\n throw Error(formatProdErrorMessage(153));\n if (null !== workInProgress.child) {\n current = workInProgress.child;\n renderLanes = createWorkInProgress(current, current.pendingProps);\n workInProgress.child = renderLanes;\n for (renderLanes.return = workInProgress; null !== current.sibling; )\n (current = current.sibling),\n (renderLanes = renderLanes.sibling =\n createWorkInProgress(current, current.pendingProps)),\n (renderLanes.return = workInProgress);\n renderLanes.sibling = null;\n }\n return workInProgress.child;\n}\nfunction checkScheduledUpdateOrContext(current, renderLanes) {\n if (0 !== (current.lanes & renderLanes)) return !0;\n current = current.dependencies;\n return null !== current && checkIfContextChanged(current) ? !0 : !1;\n}\nfunction attemptEarlyBailoutIfNoScheduledUpdate(\n current,\n workInProgress,\n renderLanes\n) {\n switch (workInProgress.tag) {\n case 3:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n resetHydrationState();\n break;\n case 27:\n case 5:\n pushHostContext(workInProgress);\n break;\n case 4:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n break;\n case 10:\n pushProvider(\n workInProgress,\n workInProgress.type,\n workInProgress.memoizedProps.value\n );\n break;\n case 31:\n if (null !== workInProgress.memoizedState)\n return (\n (workInProgress.flags |= 128),\n pushDehydratedActivitySuspenseHandler(workInProgress),\n null\n );\n break;\n case 13:\n var state$102 = workInProgress.memoizedState;\n if (null !== state$102) {\n if (null !== state$102.dehydrated)\n return (\n pushPrimaryTreeSuspenseHandler(workInProgress),\n (workInProgress.flags |= 128),\n null\n );\n if (0 !== (renderLanes & workInProgress.child.childLanes))\n return updateSuspenseComponent(current, workInProgress, renderLanes);\n pushPrimaryTreeSuspenseHandler(workInProgress);\n current = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n );\n return null !== current ? current.sibling : null;\n }\n pushPrimaryTreeSuspenseHandler(workInProgress);\n break;\n case 19:\n var didSuspendBefore = 0 !== (current.flags & 128);\n state$102 = 0 !== (renderLanes & workInProgress.childLanes);\n state$102 ||\n (propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n !1\n ),\n (state$102 = 0 !== (renderLanes & workInProgress.childLanes)));\n if (didSuspendBefore) {\n if (state$102)\n return updateSuspenseListComponent(\n current,\n workInProgress,\n renderLanes\n );\n workInProgress.flags |= 128;\n }\n didSuspendBefore = workInProgress.memoizedState;\n null !== didSuspendBefore &&\n ((didSuspendBefore.rendering = null),\n (didSuspendBefore.tail = null),\n (didSuspendBefore.lastEffect = null));\n push(suspenseStackCursor, suspenseStackCursor.current);\n if (state$102) break;\n else return null;\n case 22:\n return (\n (workInProgress.lanes = 0),\n updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n workInProgress.pendingProps\n )\n );\n case 24:\n pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n }\n return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n}\nfunction beginWork(current, workInProgress, renderLanes) {\n if (null !== current)\n if (current.memoizedProps !== workInProgress.pendingProps)\n didReceiveUpdate = !0;\n else {\n if (\n !checkScheduledUpdateOrContext(current, renderLanes) &&\n 0 === (workInProgress.flags & 128)\n )\n return (\n (didReceiveUpdate = !1),\n attemptEarlyBailoutIfNoScheduledUpdate(\n current,\n workInProgress,\n renderLanes\n )\n );\n didReceiveUpdate = 0 !== (current.flags & 131072) ? !0 : !1;\n }\n else\n (didReceiveUpdate = !1),\n isHydrating &&\n 0 !== (workInProgress.flags & 1048576) &&\n pushTreeId(workInProgress, treeForkCount, workInProgress.index);\n workInProgress.lanes = 0;\n switch (workInProgress.tag) {\n case 16:\n a: {\n var props = workInProgress.pendingProps;\n current = resolveLazy(workInProgress.elementType);\n workInProgress.type = current;\n if (\"function\" === typeof current)\n shouldConstruct(current)\n ? ((props = resolveClassComponentProps(current, props)),\n (workInProgress.tag = 1),\n (workInProgress = updateClassComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n )))\n : ((workInProgress.tag = 0),\n (workInProgress = updateFunctionComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n )));\n else {\n if (void 0 !== current && null !== current) {\n var $$typeof = current.$$typeof;\n if ($$typeof === REACT_FORWARD_REF_TYPE) {\n workInProgress.tag = 11;\n workInProgress = updateForwardRef(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n );\n break a;\n } else if ($$typeof === REACT_MEMO_TYPE) {\n workInProgress.tag = 14;\n workInProgress = updateMemoComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n );\n break a;\n }\n }\n workInProgress = getComponentNameFromType(current) || current;\n throw Error(formatProdErrorMessage(306, workInProgress, \"\"));\n }\n }\n return workInProgress;\n case 0:\n return updateFunctionComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 1:\n return (\n (props = workInProgress.type),\n ($$typeof = resolveClassComponentProps(\n props,\n workInProgress.pendingProps\n )),\n updateClassComponent(\n current,\n workInProgress,\n props,\n $$typeof,\n renderLanes\n )\n );\n case 3:\n a: {\n pushHostContainer(\n workInProgress,\n workInProgress.stateNode.containerInfo\n );\n if (null === current) throw Error(formatProdErrorMessage(387));\n props = workInProgress.pendingProps;\n var prevState = workInProgress.memoizedState;\n $$typeof = prevState.element;\n cloneUpdateQueue(current, workInProgress);\n processUpdateQueue(workInProgress, props, null, renderLanes);\n var nextState = workInProgress.memoizedState;\n props = nextState.cache;\n pushProvider(workInProgress, CacheContext, props);\n props !== prevState.cache &&\n propagateContextChanges(\n workInProgress,\n [CacheContext],\n renderLanes,\n !0\n );\n suspendIfUpdateReadFromEntangledAsyncAction();\n props = nextState.element;\n if (prevState.isDehydrated)\n if (\n ((prevState = {\n element: props,\n isDehydrated: !1,\n cache: nextState.cache\n }),\n (workInProgress.updateQueue.baseState = prevState),\n (workInProgress.memoizedState = prevState),\n workInProgress.flags & 256)\n ) {\n workInProgress = mountHostRootWithoutHydrating(\n current,\n workInProgress,\n props,\n renderLanes\n );\n break a;\n } else if (props !== $$typeof) {\n $$typeof = createCapturedValueAtFiber(\n Error(formatProdErrorMessage(424)),\n workInProgress\n );\n queueHydrationError($$typeof);\n workInProgress = mountHostRootWithoutHydrating(\n current,\n workInProgress,\n props,\n renderLanes\n );\n break a;\n } else {\n current = workInProgress.stateNode.containerInfo;\n switch (current.nodeType) {\n case 9:\n current = current.body;\n break;\n default:\n current =\n \"HTML\" === current.nodeName\n ? current.ownerDocument.body\n : current;\n }\n nextHydratableInstance = getNextHydratable(current.firstChild);\n hydrationParentFiber = workInProgress;\n isHydrating = !0;\n hydrationErrors = null;\n rootOrSingletonContext = !0;\n renderLanes = mountChildFibers(\n workInProgress,\n null,\n props,\n renderLanes\n );\n for (workInProgress.child = renderLanes; renderLanes; )\n (renderLanes.flags = (renderLanes.flags & -3) | 4096),\n (renderLanes = renderLanes.sibling);\n }\n else {\n resetHydrationState();\n if (props === $$typeof) {\n workInProgress = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n );\n break a;\n }\n reconcileChildren(current, workInProgress, props, renderLanes);\n }\n workInProgress = workInProgress.child;\n }\n return workInProgress;\n case 26:\n return (\n markRef(current, workInProgress),\n null === current\n ? (renderLanes = getResource(\n workInProgress.type,\n null,\n workInProgress.pendingProps,\n null\n ))\n ? (workInProgress.memoizedState = renderLanes)\n : isHydrating ||\n ((renderLanes = workInProgress.type),\n (current = workInProgress.pendingProps),\n (props = getOwnerDocumentFromRootContainer(\n rootInstanceStackCursor.current\n ).createElement(renderLanes)),\n (props[internalInstanceKey] = workInProgress),\n (props[internalPropsKey] = current),\n setInitialProperties(props, renderLanes, current),\n markNodeAsHoistable(props),\n (workInProgress.stateNode = props))\n : (workInProgress.memoizedState = getResource(\n workInProgress.type,\n current.memoizedProps,\n workInProgress.pendingProps,\n current.memoizedState\n )),\n null\n );\n case 27:\n return (\n pushHostContext(workInProgress),\n null === current &&\n isHydrating &&\n ((props = workInProgress.stateNode =\n resolveSingletonInstance(\n workInProgress.type,\n workInProgress.pendingProps,\n rootInstanceStackCursor.current\n )),\n (hydrationParentFiber = workInProgress),\n (rootOrSingletonContext = !0),\n ($$typeof = nextHydratableInstance),\n isSingletonScope(workInProgress.type)\n ? ((previousHydratableOnEnteringScopedSingleton = $$typeof),\n (nextHydratableInstance = getNextHydratable(props.firstChild)))\n : (nextHydratableInstance = $$typeof)),\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n markRef(current, workInProgress),\n null === current && (workInProgress.flags |= 4194304),\n workInProgress.child\n );\n case 5:\n if (null === current && isHydrating) {\n if (($$typeof = props = nextHydratableInstance))\n (props = canHydrateInstance(\n props,\n workInProgress.type,\n workInProgress.pendingProps,\n rootOrSingletonContext\n )),\n null !== props\n ? ((workInProgress.stateNode = props),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = getNextHydratable(props.firstChild)),\n (rootOrSingletonContext = !1),\n ($$typeof = !0))\n : ($$typeof = !1);\n $$typeof || throwOnHydrationMismatch(workInProgress);\n }\n pushHostContext(workInProgress);\n $$typeof = workInProgress.type;\n prevState = workInProgress.pendingProps;\n nextState = null !== current ? current.memoizedProps : null;\n props = prevState.children;\n shouldSetTextContent($$typeof, prevState)\n ? (props = null)\n : null !== nextState &&\n shouldSetTextContent($$typeof, nextState) &&\n (workInProgress.flags |= 32);\n null !== workInProgress.memoizedState &&\n (($$typeof = renderWithHooks(\n current,\n workInProgress,\n TransitionAwareHostComponent,\n null,\n null,\n renderLanes\n )),\n (HostTransitionContext._currentValue = $$typeof));\n markRef(current, workInProgress);\n reconcileChildren(current, workInProgress, props, renderLanes);\n return workInProgress.child;\n case 6:\n if (null === current && isHydrating) {\n if ((current = renderLanes = nextHydratableInstance))\n (renderLanes = canHydrateTextInstance(\n renderLanes,\n workInProgress.pendingProps,\n rootOrSingletonContext\n )),\n null !== renderLanes\n ? ((workInProgress.stateNode = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null),\n (current = !0))\n : (current = !1);\n current || throwOnHydrationMismatch(workInProgress);\n }\n return null;\n case 13:\n return updateSuspenseComponent(current, workInProgress, renderLanes);\n case 4:\n return (\n pushHostContainer(\n workInProgress,\n workInProgress.stateNode.containerInfo\n ),\n (props = workInProgress.pendingProps),\n null === current\n ? (workInProgress.child = reconcileChildFibers(\n workInProgress,\n null,\n props,\n renderLanes\n ))\n : reconcileChildren(current, workInProgress, props, renderLanes),\n workInProgress.child\n );\n case 11:\n return updateForwardRef(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 7:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps,\n renderLanes\n ),\n workInProgress.child\n );\n case 8:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 12:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 10:\n return (\n (props = workInProgress.pendingProps),\n pushProvider(workInProgress, workInProgress.type, props.value),\n reconcileChildren(current, workInProgress, props.children, renderLanes),\n workInProgress.child\n );\n case 9:\n return (\n ($$typeof = workInProgress.type._context),\n (props = workInProgress.pendingProps.children),\n prepareToReadContext(workInProgress),\n ($$typeof = readContext($$typeof)),\n (props = props($$typeof)),\n (workInProgress.flags |= 1),\n reconcileChildren(current, workInProgress, props, renderLanes),\n workInProgress.child\n );\n case 14:\n return updateMemoComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 15:\n return updateSimpleMemoComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 19:\n return updateSuspenseListComponent(current, workInProgress, renderLanes);\n case 31:\n return updateActivityComponent(current, workInProgress, renderLanes);\n case 22:\n return updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n workInProgress.pendingProps\n );\n case 24:\n return (\n prepareToReadContext(workInProgress),\n (props = readContext(CacheContext)),\n null === current\n ? (($$typeof = peekCacheFromPool()),\n null === $$typeof &&\n (($$typeof = workInProgressRoot),\n (prevState = createCache()),\n ($$typeof.pooledCache = prevState),\n prevState.refCount++,\n null !== prevState && ($$typeof.pooledCacheLanes |= renderLanes),\n ($$typeof = prevState)),\n (workInProgress.memoizedState = { parent: props, cache: $$typeof }),\n initializeUpdateQueue(workInProgress),\n pushProvider(workInProgress, CacheContext, $$typeof))\n : (0 !== (current.lanes & renderLanes) &&\n (cloneUpdateQueue(current, workInProgress),\n processUpdateQueue(workInProgress, null, null, renderLanes),\n suspendIfUpdateReadFromEntangledAsyncAction()),\n ($$typeof = current.memoizedState),\n (prevState = workInProgress.memoizedState),\n $$typeof.parent !== props\n ? (($$typeof = { parent: props, cache: props }),\n (workInProgress.memoizedState = $$typeof),\n 0 === workInProgress.lanes &&\n (workInProgress.memoizedState =\n workInProgress.updateQueue.baseState =\n $$typeof),\n pushProvider(workInProgress, CacheContext, props))\n : ((props = prevState.cache),\n pushProvider(workInProgress, CacheContext, props),\n props !== $$typeof.cache &&\n propagateContextChanges(\n workInProgress,\n [CacheContext],\n renderLanes,\n !0\n ))),\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 29:\n throw workInProgress.pendingProps;\n }\n throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction markUpdate(workInProgress) {\n workInProgress.flags |= 4;\n}\nfunction preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n oldProps,\n newProps,\n renderLanes\n) {\n if ((type = 0 !== (workInProgress.mode & 32))) type = !1;\n if (type) {\n if (\n ((workInProgress.flags |= 16777216),\n (renderLanes & 335544128) === renderLanes)\n )\n if (workInProgress.stateNode.complete) workInProgress.flags |= 8192;\n else if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;\n else\n throw (\n ((suspendedThenable = noopSuspenseyCommitThenable),\n SuspenseyCommitException)\n );\n } else workInProgress.flags &= -16777217;\n}\nfunction preloadResourceAndSuspendIfNeeded(workInProgress, resource) {\n if (\"stylesheet\" !== resource.type || 0 !== (resource.state.loading & 4))\n workInProgress.flags &= -16777217;\n else if (((workInProgress.flags |= 16777216), !preloadResource(resource)))\n if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;\n else\n throw (\n ((suspendedThenable = noopSuspenseyCommitThenable),\n SuspenseyCommitException)\n );\n}\nfunction scheduleRetryEffect(workInProgress, retryQueue) {\n null !== retryQueue && (workInProgress.flags |= 4);\n workInProgress.flags & 16384 &&\n ((retryQueue =\n 22 !== workInProgress.tag ? claimNextRetryLane() : 536870912),\n (workInProgress.lanes |= retryQueue),\n (workInProgressSuspendedRetryLanes |= retryQueue));\n}\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n if (!isHydrating)\n switch (renderState.tailMode) {\n case \"hidden\":\n hasRenderedATailFallback = renderState.tail;\n for (var lastTailNode = null; null !== hasRenderedATailFallback; )\n null !== hasRenderedATailFallback.alternate &&\n (lastTailNode = hasRenderedATailFallback),\n (hasRenderedATailFallback = hasRenderedATailFallback.sibling);\n null === lastTailNode\n ? (renderState.tail = null)\n : (lastTailNode.sibling = null);\n break;\n case \"collapsed\":\n lastTailNode = renderState.tail;\n for (var lastTailNode$106 = null; null !== lastTailNode; )\n null !== lastTailNode.alternate && (lastTailNode$106 = lastTailNode),\n (lastTailNode = lastTailNode.sibling);\n null === lastTailNode$106\n ? hasRenderedATailFallback || null === renderState.tail\n ? (renderState.tail = null)\n : (renderState.tail.sibling = null)\n : (lastTailNode$106.sibling = null);\n }\n}\nfunction bubbleProperties(completedWork) {\n var didBailout =\n null !== completedWork.alternate &&\n completedWork.alternate.child === completedWork.child,\n newChildLanes = 0,\n subtreeFlags = 0;\n if (didBailout)\n for (var child$107 = completedWork.child; null !== child$107; )\n (newChildLanes |= child$107.lanes | child$107.childLanes),\n (subtreeFlags |= child$107.subtreeFlags & 65011712),\n (subtreeFlags |= child$107.flags & 65011712),\n (child$107.return = completedWork),\n (child$107 = child$107.sibling);\n else\n for (child$107 = completedWork.child; null !== child$107; )\n (newChildLanes |= child$107.lanes | child$107.childLanes),\n (subtreeFlags |= child$107.subtreeFlags),\n (subtreeFlags |= child$107.flags),\n (child$107.return = completedWork),\n (child$107 = child$107.sibling);\n completedWork.subtreeFlags |= subtreeFlags;\n completedWork.childLanes = newChildLanes;\n return didBailout;\n}\nfunction completeWork(current, workInProgress, renderLanes) {\n var newProps = workInProgress.pendingProps;\n popTreeContext(workInProgress);\n switch (workInProgress.tag) {\n case 16:\n case 15:\n case 0:\n case 11:\n case 7:\n case 8:\n case 12:\n case 9:\n case 14:\n return bubbleProperties(workInProgress), null;\n case 1:\n return bubbleProperties(workInProgress), null;\n case 3:\n renderLanes = workInProgress.stateNode;\n newProps = null;\n null !== current && (newProps = current.memoizedState.cache);\n workInProgress.memoizedState.cache !== newProps &&\n (workInProgress.flags |= 2048);\n popProvider(CacheContext);\n popHostContainer();\n renderLanes.pendingContext &&\n ((renderLanes.context = renderLanes.pendingContext),\n (renderLanes.pendingContext = null));\n if (null === current || null === current.child)\n popHydrationState(workInProgress)\n ? markUpdate(workInProgress)\n : null === current ||\n (current.memoizedState.isDehydrated &&\n 0 === (workInProgress.flags & 256)) ||\n ((workInProgress.flags |= 1024),\n upgradeHydrationErrorsToRecoverable());\n bubbleProperties(workInProgress);\n return null;\n case 26:\n var type = workInProgress.type,\n nextResource = workInProgress.memoizedState;\n null === current\n ? (markUpdate(workInProgress),\n null !== nextResource\n ? (bubbleProperties(workInProgress),\n preloadResourceAndSuspendIfNeeded(workInProgress, nextResource))\n : (bubbleProperties(workInProgress),\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n null,\n newProps,\n renderLanes\n )))\n : nextResource\n ? nextResource !== current.memoizedState\n ? (markUpdate(workInProgress),\n bubbleProperties(workInProgress),\n preloadResourceAndSuspendIfNeeded(workInProgress, nextResource))\n : (bubbleProperties(workInProgress),\n (workInProgress.flags &= -16777217))\n : ((current = current.memoizedProps),\n current !== newProps && markUpdate(workInProgress),\n bubbleProperties(workInProgress),\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n current,\n newProps,\n renderLanes\n ));\n return null;\n case 27:\n popHostContext(workInProgress);\n renderLanes = rootInstanceStackCursor.current;\n type = workInProgress.type;\n if (null !== current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (!newProps) {\n if (null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n bubbleProperties(workInProgress);\n return null;\n }\n current = contextStackCursor.current;\n popHydrationState(workInProgress)\n ? prepareToHydrateHostInstance(workInProgress, current)\n : ((current = resolveSingletonInstance(type, newProps, renderLanes)),\n (workInProgress.stateNode = current),\n markUpdate(workInProgress));\n }\n bubbleProperties(workInProgress);\n return null;\n case 5:\n popHostContext(workInProgress);\n type = workInProgress.type;\n if (null !== current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (!newProps) {\n if (null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n bubbleProperties(workInProgress);\n return null;\n }\n nextResource = contextStackCursor.current;\n if (popHydrationState(workInProgress))\n prepareToHydrateHostInstance(workInProgress, nextResource);\n else {\n var ownerDocument = getOwnerDocumentFromRootContainer(\n rootInstanceStackCursor.current\n );\n switch (nextResource) {\n case 1:\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/2000/svg\",\n type\n );\n break;\n case 2:\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/1998/Math/MathML\",\n type\n );\n break;\n default:\n switch (type) {\n case \"svg\":\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/2000/svg\",\n type\n );\n break;\n case \"math\":\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/1998/Math/MathML\",\n type\n );\n break;\n case \"script\":\n nextResource = ownerDocument.createElement(\"div\");\n nextResource.innerHTML = \"<script>\\x3c/script>\";\n nextResource = nextResource.removeChild(\n nextResource.firstChild\n );\n break;\n case \"select\":\n nextResource =\n \"string\" === typeof newProps.is\n ? ownerDocument.createElement(\"select\", {\n is: newProps.is\n })\n : ownerDocument.createElement(\"select\");\n newProps.multiple\n ? (nextResource.multiple = !0)\n : newProps.size && (nextResource.size = newProps.size);\n break;\n default:\n nextResource =\n \"string\" === typeof newProps.is\n ? ownerDocument.createElement(type, { is: newProps.is })\n : ownerDocument.createElement(type);\n }\n }\n nextResource[internalInstanceKey] = workInProgress;\n nextResource[internalPropsKey] = newProps;\n a: for (\n ownerDocument = workInProgress.child;\n null !== ownerDocument;\n\n ) {\n if (5 === ownerDocument.tag || 6 === ownerDocument.tag)\n nextResource.appendChild(ownerDocument.stateNode);\n else if (\n 4 !== ownerDocument.tag &&\n 27 !== ownerDocument.tag &&\n null !== ownerDocument.child\n ) {\n ownerDocument.child.return = ownerDocument;\n ownerDocument = ownerDocument.child;\n continue;\n }\n if (ownerDocument === workInProgress) break a;\n for (; null === ownerDocument.sibling; ) {\n if (\n null === ownerDocument.return ||\n ownerDocument.return === workInProgress\n )\n break a;\n ownerDocument = ownerDocument.return;\n }\n ownerDocument.sibling.return = ownerDocument.return;\n ownerDocument = ownerDocument.sibling;\n }\n workInProgress.stateNode = nextResource;\n a: switch (\n (setInitialProperties(nextResource, type, newProps), type)\n ) {\n case \"button\":\n case \"input\":\n case \"select\":\n case \"textarea\":\n newProps = !!newProps.autoFocus;\n break a;\n case \"img\":\n newProps = !0;\n break a;\n default:\n newProps = !1;\n }\n newProps && markUpdate(workInProgress);\n }\n }\n bubbleProperties(workInProgress);\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n workInProgress.type,\n null === current ? null : current.memoizedProps,\n workInProgress.pendingProps,\n renderLanes\n );\n return null;\n case 6:\n if (current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (\"string\" !== typeof newProps && null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n current = rootInstanceStackCursor.current;\n if (popHydrationState(workInProgress)) {\n current = workInProgress.stateNode;\n renderLanes = workInProgress.memoizedProps;\n newProps = null;\n type = hydrationParentFiber;\n if (null !== type)\n switch (type.tag) {\n case 27:\n case 5:\n newProps = type.memoizedProps;\n }\n current[internalInstanceKey] = workInProgress;\n current =\n current.nodeValue === renderLanes ||\n (null !== newProps && !0 === newProps.suppressHydrationWarning) ||\n checkForUnmatchedText(current.nodeValue, renderLanes)\n ? !0\n : !1;\n current || throwOnHydrationMismatch(workInProgress, !0);\n } else\n (current =\n getOwnerDocumentFromRootContainer(current).createTextNode(\n newProps\n )),\n (current[internalInstanceKey] = workInProgress),\n (workInProgress.stateNode = current);\n }\n bubbleProperties(workInProgress);\n return null;\n case 31:\n renderLanes = workInProgress.memoizedState;\n if (null === current || null !== current.memoizedState) {\n newProps = popHydrationState(workInProgress);\n if (null !== renderLanes) {\n if (null === current) {\n if (!newProps) throw Error(formatProdErrorMessage(318));\n current = workInProgress.memoizedState;\n current = null !== current ? current.dehydrated : null;\n if (!current) throw Error(formatProdErrorMessage(557));\n current[internalInstanceKey] = workInProgress;\n } else\n resetHydrationState(),\n 0 === (workInProgress.flags & 128) &&\n (workInProgress.memoizedState = null),\n (workInProgress.flags |= 4);\n bubbleProperties(workInProgress);\n current = !1;\n } else\n (renderLanes = upgradeHydrationErrorsToRecoverable()),\n null !== current &&\n null !== current.memoizedState &&\n (current.memoizedState.hydrationErrors = renderLanes),\n (current = !0);\n if (!current) {\n if (workInProgress.flags & 256)\n return popSuspenseHandler(workInProgress), workInProgress;\n popSuspenseHandler(workInProgress);\n return null;\n }\n if (0 !== (workInProgress.flags & 128))\n throw Error(formatProdErrorMessage(558));\n }\n bubbleProperties(workInProgress);\n return null;\n case 13:\n newProps = workInProgress.memoizedState;\n if (\n null === current ||\n (null !== current.memoizedState &&\n null !== current.memoizedState.dehydrated)\n ) {\n type = popHydrationState(workInProgress);\n if (null !== newProps && null !== newProps.dehydrated) {\n if (null === current) {\n if (!type) throw Error(formatProdErrorMessage(318));\n type = workInProgress.memoizedState;\n type = null !== type ? type.dehydrated : null;\n if (!type) throw Error(formatProdErrorMessage(317));\n type[internalInstanceKey] = workInProgress;\n } else\n resetHydrationState(),\n 0 === (workInProgress.flags & 128) &&\n (workInProgress.memoizedState = null),\n (workInProgress.flags |= 4);\n bubbleProperties(workInProgress);\n type = !1;\n } else\n (type = upgradeHydrationErrorsToRecoverable()),\n null !== current &&\n null !== current.memoizedState &&\n (current.memoizedState.hydrationErrors = type),\n (type = !0);\n if (!type) {\n if (workInProgress.flags & 256)\n return popSuspenseHandler(workInProgress), workInProgress;\n popSuspenseHandler(workInProgress);\n return null;\n }\n }\n popSuspenseHandler(workInProgress);\n if (0 !== (workInProgress.flags & 128))\n return (workInProgress.lanes = renderLanes), workInProgress;\n renderLanes = null !== newProps;\n current = null !== current && null !== current.memoizedState;\n renderLanes &&\n ((newProps = workInProgress.child),\n (type = null),\n null !== newProps.alternate &&\n null !== newProps.alternate.memoizedState &&\n null !== newProps.alternate.memoizedState.cachePool &&\n (type = newProps.alternate.memoizedState.cachePool.pool),\n (nextResource = null),\n null !== newProps.memoizedState &&\n null !== newProps.memoizedState.cachePool &&\n (nextResource = newProps.memoizedState.cachePool.pool),\n nextResource !== type && (newProps.flags |= 2048));\n renderLanes !== current &&\n renderLanes &&\n (workInProgress.child.flags |= 8192);\n scheduleRetryEffect(workInProgress, workInProgress.updateQueue);\n bubbleProperties(workInProgress);\n return null;\n case 4:\n return (\n popHostContainer(),\n null === current &&\n listenToAllSupportedEvents(workInProgress.stateNode.containerInfo),\n bubbleProperties(workInProgress),\n null\n );\n case 10:\n return (\n popProvider(workInProgress.type), bubbleProperties(workInProgress), null\n );\n case 19:\n pop(suspenseStackCursor);\n newProps = workInProgress.memoizedState;\n if (null === newProps) return bubbleProperties(workInProgress), null;\n type = 0 !== (workInProgress.flags & 128);\n nextResource = newProps.rendering;\n if (null === nextResource)\n if (type) cutOffTailIfNeeded(newProps, !1);\n else {\n if (\n 0 !== workInProgressRootExitStatus ||\n (null !== current && 0 !== (current.flags & 128))\n )\n for (current = workInProgress.child; null !== current; ) {\n nextResource = findFirstSuspended(current);\n if (null !== nextResource) {\n workInProgress.flags |= 128;\n cutOffTailIfNeeded(newProps, !1);\n current = nextResource.updateQueue;\n workInProgress.updateQueue = current;\n scheduleRetryEffect(workInProgress, current);\n workInProgress.subtreeFlags = 0;\n current = renderLanes;\n for (renderLanes = workInProgress.child; null !== renderLanes; )\n resetWorkInProgress(renderLanes, current),\n (renderLanes = renderLanes.sibling);\n push(\n suspenseStackCursor,\n (suspenseStackCursor.current & 1) | 2\n );\n isHydrating &&\n pushTreeFork(workInProgress, newProps.treeForkCount);\n return workInProgress.child;\n }\n current = current.sibling;\n }\n null !== newProps.tail &&\n now() > workInProgressRootRenderTargetTime &&\n ((workInProgress.flags |= 128),\n (type = !0),\n cutOffTailIfNeeded(newProps, !1),\n (workInProgress.lanes = 4194304));\n }\n else {\n if (!type)\n if (\n ((current = findFirstSuspended(nextResource)), null !== current)\n ) {\n if (\n ((workInProgress.flags |= 128),\n (type = !0),\n (current = current.updateQueue),\n (workInProgress.updateQueue = current),\n scheduleRetryEffect(workInProgress, current),\n cutOffTailIfNeeded(newProps, !0),\n null === newProps.tail &&\n \"hidden\" === newProps.tailMode &&\n !nextResource.alternate &&\n !isHydrating)\n )\n return bubbleProperties(workInProgress), null;\n } else\n 2 * now() - newProps.renderingStartTime >\n workInProgressRootRenderTargetTime &&\n 536870912 !== renderLanes &&\n ((workInProgress.flags |= 128),\n (type = !0),\n cutOffTailIfNeeded(newProps, !1),\n (workInProgress.lanes = 4194304));\n newProps.isBackwards\n ? ((nextResource.sibling = workInProgress.child),\n (workInProgress.child = nextResource))\n : ((current = newProps.last),\n null !== current\n ? (current.sibling = nextResource)\n : (workInProgress.child = nextResource),\n (newProps.last = nextResource));\n }\n if (null !== newProps.tail)\n return (\n (current = newProps.tail),\n (newProps.rendering = current),\n (newProps.tail = current.sibling),\n (newProps.renderingStartTime = now()),\n (current.sibling = null),\n (renderLanes = suspenseStackCursor.current),\n push(\n suspenseStackCursor,\n type ? (renderLanes & 1) | 2 : renderLanes & 1\n ),\n isHydrating && pushTreeFork(workInProgress, newProps.treeForkCount),\n current\n );\n bubbleProperties(workInProgress);\n return null;\n case 22:\n case 23:\n return (\n popSuspenseHandler(workInProgress),\n popHiddenContext(),\n (newProps = null !== workInProgress.memoizedState),\n null !== current\n ? (null !== current.memoizedState) !== newProps &&\n (workInProgress.flags |= 8192)\n : newProps && (workInProgress.flags |= 8192),\n newProps\n ? 0 !== (renderLanes & 536870912) &&\n 0 === (workInProgress.flags & 128) &&\n (bubbleProperties(workInProgress),\n workInProgress.subtreeFlags & 6 && (workInProgress.flags |= 8192))\n : bubbleProperties(workInProgress),\n (renderLanes = workInProgress.updateQueue),\n null !== renderLanes &&\n scheduleRetryEffect(workInProgress, renderLanes.retryQueue),\n (renderLanes = null),\n null !== current &&\n null !== current.memoizedState &&\n null !== current.memoizedState.cachePool &&\n (renderLanes = current.memoizedState.cachePool.pool),\n (newProps = null),\n null !== workInProgress.memoizedState &&\n null !== workInProgress.memoizedState.cachePool &&\n (newProps = workInProgress.memoizedState.cachePool.pool),\n newProps !== renderLanes && (workInProgress.flags |= 2048),\n null !== current && pop(resumedCache),\n null\n );\n case 24:\n return (\n (renderLanes = null),\n null !== current && (renderLanes = current.memoizedState.cache),\n workInProgress.memoizedState.cache !== renderLanes &&\n (workInProgress.flags |= 2048),\n popProvider(CacheContext),\n bubbleProperties(workInProgress),\n null\n );\n case 25:\n return null;\n case 30:\n return null;\n }\n throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction unwindWork(current, workInProgress) {\n popTreeContext(workInProgress);\n switch (workInProgress.tag) {\n case 1:\n return (\n (current = workInProgress.flags),\n current & 65536\n ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n : null\n );\n case 3:\n return (\n popProvider(CacheContext),\n popHostContainer(),\n (current = workInProgress.flags),\n 0 !== (current & 65536) && 0 === (current & 128)\n ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n : null\n );\n case 26:\n case 27:\n case 5:\n return popHostContext(workInProgress), null;\n case 31:\n if (null !== workInProgress.memoizedState) {\n popSuspenseHandler(workInProgress);\n if (null === workInProgress.alternate)\n throw Error(formatProdErrorMessage(340));\n resetHydrationState();\n }\n current = workInProgress.flags;\n return current & 65536\n ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n : null;\n case 13:\n popSuspenseHandler(workInProgress);\n current = workInProgress.memoizedState;\n if (null !== current && null !== current.dehydrated) {\n if (null === workInProgress.alternate)\n throw Error(formatProdErrorMessage(340));\n resetHydrationState();\n }\n current = workInProgress.flags;\n return current & 65536\n ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n : null;\n case 19:\n return pop(suspenseStackCursor), null;\n case 4:\n return popHostContainer(), null;\n case 10:\n return popProvider(workInProgress.type), null;\n case 22:\n case 23:\n return (\n popSuspenseHandler(workInProgress),\n popHiddenContext(),\n null !== current && pop(resumedCache),\n (current = workInProgress.flags),\n current & 65536\n ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n : null\n );\n case 24:\n return popProvider(CacheContext), null;\n case 25:\n return null;\n default:\n return null;\n }\n}\nfunction unwindInterruptedWork(current, interruptedWork) {\n popTreeContext(interruptedWork);\n switch (interruptedWork.tag) {\n case 3:\n popProvider(CacheContext);\n popHostContainer();\n break;\n case 26:\n case 27:\n case 5:\n popHostContext(interruptedWork);\n break;\n case 4:\n popHostContainer();\n break;\n case 31:\n null !== interruptedWork.memoizedState &&\n popSuspenseHandler(interruptedWork);\n break;\n case 13:\n popSuspenseHandler(interruptedWork);\n break;\n case 19:\n pop(suspenseStackCursor);\n break;\n case 10:\n popProvider(interruptedWork.type);\n break;\n case 22:\n case 23:\n popSuspenseHandler(interruptedWork);\n popHiddenContext();\n null !== current && pop(resumedCache);\n break;\n case 24:\n popProvider(CacheContext);\n }\n}\nfunction commitHookEffectListMount(flags, finishedWork) {\n try {\n var updateQueue = finishedWork.updateQueue,\n lastEffect = null !== updateQueue ? updateQueue.lastEffect : null;\n if (null !== lastEffect) {\n var firstEffect = lastEffect.next;\n updateQueue = firstEffect;\n do {\n if ((updateQueue.tag & flags) === flags) {\n lastEffect = void 0;\n var create = updateQueue.create,\n inst = updateQueue.inst;\n lastEffect = create();\n inst.destroy = lastEffect;\n }\n updateQueue = updateQueue.next;\n } while (updateQueue !== firstEffect);\n }\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n}\nfunction commitHookEffectListUnmount(\n flags,\n finishedWork,\n nearestMountedAncestor$jscomp$0\n) {\n try {\n var updateQueue = finishedWork.updateQueue,\n lastEffect = null !== updateQueue ? updateQueue.lastEffect : null;\n if (null !== lastEffect) {\n var firstEffect = lastEffect.next;\n updateQueue = firstEffect;\n do {\n if ((updateQueue.tag & flags) === flags) {\n var inst = updateQueue.inst,\n destroy = inst.destroy;\n if (void 0 !== destroy) {\n inst.destroy = void 0;\n lastEffect = finishedWork;\n var nearestMountedAncestor = nearestMountedAncestor$jscomp$0,\n destroy_ = destroy;\n try {\n destroy_();\n } catch (error) {\n captureCommitPhaseError(\n lastEffect,\n nearestMountedAncestor,\n error\n );\n }\n }\n }\n updateQueue = updateQueue.next;\n } while (updateQueue !== firstEffect);\n }\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n}\nfunction commitClassCallbacks(finishedWork) {\n var updateQueue = finishedWork.updateQueue;\n if (null !== updateQueue) {\n var instance = finishedWork.stateNode;\n try {\n commitCallbacks(updateQueue, instance);\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n }\n}\nfunction safelyCallComponentWillUnmount(\n current,\n nearestMountedAncestor,\n instance\n) {\n instance.props = resolveClassComponentProps(\n current.type,\n current.memoizedProps\n );\n instance.state = current.memoizedState;\n try {\n instance.componentWillUnmount();\n } catch (error) {\n captureCommitPhaseError(current, nearestMountedAncestor, error);\n }\n}\nfunction safelyAttachRef(current, nearestMountedAncestor) {\n try {\n var ref = current.ref;\n if (null !== ref) {\n switch (current.tag) {\n case 26:\n case 27:\n case 5:\n var instanceToUse = current.stateNode;\n break;\n case 30:\n instanceToUse = current.stateNode;\n break;\n default:\n instanceToUse = current.stateNode;\n }\n \"function\" === typeof ref\n ? (current.refCleanup = ref(instanceToUse))\n : (ref.current = instanceToUse);\n }\n } catch (error) {\n captureCommitPhaseError(current, nearestMountedAncestor, error);\n }\n}\nfunction safelyDetachRef(current, nearestMountedAncestor) {\n var ref = current.ref,\n refCleanup = current.refCleanup;\n if (null !== ref)\n if (\"function\" === typeof refCleanup)\n try {\n refCleanup();\n } catch (error) {\n captureCommitPhaseError(current, nearestMountedAncestor, error);\n } finally {\n (current.refCleanup = null),\n (current = current.alternate),\n null != current && (current.refCleanup = null);\n }\n else if (\"function\" === typeof ref)\n try {\n ref(null);\n } catch (error$140) {\n captureCommitPhaseError(current, nearestMountedAncestor, error$140);\n }\n else ref.current = null;\n}\nfunction commitHostMount(finishedWork) {\n var type = finishedWork.type,\n props = finishedWork.memoizedProps,\n instance = finishedWork.stateNode;\n try {\n a: switch (type) {\n case \"button\":\n case \"input\":\n case \"select\":\n case \"textarea\":\n props.autoFocus && instance.focus();\n break a;\n case \"img\":\n props.src\n ? (instance.src = props.src)\n : props.srcSet && (instance.srcset = props.srcSet);\n }\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n}\nfunction commitHostUpdate(finishedWork, newProps, oldProps) {\n try {\n var domElement = finishedWork.stateNode;\n updateProperties(domElement, finishedWork.type, oldProps, newProps);\n domElement[internalPropsKey] = newProps;\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n}\nfunction isHostParent(fiber) {\n return (\n 5 === fiber.tag ||\n 3 === fiber.tag ||\n 26 === fiber.tag ||\n (27 === fiber.tag && isSingletonScope(fiber.type)) ||\n 4 === fiber.tag\n );\n}\nfunction getHostSibling(fiber) {\n a: for (;;) {\n for (; null === fiber.sibling; ) {\n if (null === fiber.return || isHostParent(fiber.return)) return null;\n fiber = fiber.return;\n }\n fiber.sibling.return = fiber.return;\n for (\n fiber = fiber.sibling;\n 5 !== fiber.tag && 6 !== fiber.tag && 18 !== fiber.tag;\n\n ) {\n if (27 === fiber.tag && isSingletonScope(fiber.type)) continue a;\n if (fiber.flags & 2) continue a;\n if (null === fiber.child || 4 === fiber.tag) continue a;\n else (fiber.child.return = fiber), (fiber = fiber.child);\n }\n if (!(fiber.flags & 2)) return fiber.stateNode;\n }\n}\nfunction insertOrAppendPlacementNodeIntoContainer(node, before, parent) {\n var tag = node.tag;\n if (5 === tag || 6 === tag)\n (node = node.stateNode),\n before\n ? (9 === parent.nodeType\n ? parent.body\n : \"HTML\" === parent.nodeName\n ? parent.ownerDocument.body\n : parent\n ).insertBefore(node, before)\n : ((before =\n 9 === parent.nodeType\n ? parent.body\n : \"HTML\" === parent.nodeName\n ? parent.ownerDocument.body\n : parent),\n before.appendChild(node),\n (parent = parent._reactRootContainer),\n (null !== parent && void 0 !== parent) ||\n null !== before.onclick ||\n (before.onclick = noop$1));\n else if (\n 4 !== tag &&\n (27 === tag &&\n isSingletonScope(node.type) &&\n ((parent = node.stateNode), (before = null)),\n (node = node.child),\n null !== node)\n )\n for (\n insertOrAppendPlacementNodeIntoContainer(node, before, parent),\n node = node.sibling;\n null !== node;\n\n )\n insertOrAppendPlacementNodeIntoContainer(node, before, parent),\n (node = node.sibling);\n}\nfunction insertOrAppendPlacementNode(node, before, parent) {\n var tag = node.tag;\n if (5 === tag || 6 === tag)\n (node = node.stateNode),\n before ? parent.insertBefore(node, before) : parent.appendChild(node);\n else if (\n 4 !== tag &&\n (27 === tag && isSingletonScope(node.type) && (parent = node.stateNode),\n (node = node.child),\n null !== node)\n )\n for (\n insertOrAppendPlacementNode(node, before, parent), node = node.sibling;\n null !== node;\n\n )\n insertOrAppendPlacementNode(node, before, parent), (node = node.sibling);\n}\nfunction commitHostSingletonAcquisition(finishedWork) {\n var singleton = finishedWork.stateNode,\n props = finishedWork.memoizedProps;\n try {\n for (\n var type = finishedWork.type, attributes = singleton.attributes;\n attributes.length;\n\n )\n singleton.removeAttributeNode(attributes[0]);\n setInitialProperties(singleton, type, props);\n singleton[internalInstanceKey] = finishedWork;\n singleton[internalPropsKey] = props;\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n}\nvar offscreenSubtreeIsHidden = !1,\n offscreenSubtreeWasHidden = !1,\n needsFormReset = !1,\n PossiblyWeakSet = \"function\" === typeof WeakSet ? WeakSet : Set,\n nextEffect = null;\nfunction commitBeforeMutationEffects(root, firstChild) {\n root = root.containerInfo;\n eventsEnabled = _enabled;\n root = getActiveElementDeep(root);\n if (hasSelectionCapabilities(root)) {\n if (\"selectionStart\" in root)\n var JSCompiler_temp = {\n start: root.selectionStart,\n end: root.selectionEnd\n };\n else\n a: {\n JSCompiler_temp =\n ((JSCompiler_temp = root.ownerDocument) &&\n JSCompiler_temp.defaultView) ||\n window;\n var selection =\n JSCompiler_temp.getSelection && JSCompiler_temp.getSelection();\n if (selection && 0 !== selection.rangeCount) {\n JSCompiler_temp = selection.anchorNode;\n var anchorOffset = selection.anchorOffset,\n focusNode = selection.focusNode;\n selection = selection.focusOffset;\n try {\n JSCompiler_temp.nodeType, focusNode.nodeType;\n } catch (e$20) {\n JSCompiler_temp = null;\n break a;\n }\n var length = 0,\n start = -1,\n end = -1,\n indexWithinAnchor = 0,\n indexWithinFocus = 0,\n node = root,\n parentNode = null;\n b: for (;;) {\n for (var next; ; ) {\n node !== JSCompiler_temp ||\n (0 !== anchorOffset && 3 !== node.nodeType) ||\n (start = length + anchorOffset);\n node !== focusNode ||\n (0 !== selection && 3 !== node.nodeType) ||\n (end = length + selection);\n 3 === node.nodeType && (length += node.nodeValue.length);\n if (null === (next = node.firstChild)) break;\n parentNode = node;\n node = next;\n }\n for (;;) {\n if (node === root) break b;\n parentNode === JSCompiler_temp &&\n ++indexWithinAnchor === anchorOffset &&\n (start = length);\n parentNode === focusNode &&\n ++indexWithinFocus === selection &&\n (end = length);\n if (null !== (next = node.nextSibling)) break;\n node = parentNode;\n parentNode = node.parentNode;\n }\n node = next;\n }\n JSCompiler_temp =\n -1 === start || -1 === end ? null : { start: start, end: end };\n } else JSCompiler_temp = null;\n }\n JSCompiler_temp = JSCompiler_temp || { start: 0, end: 0 };\n } else JSCompiler_temp = null;\n selectionInformation = { focusedElem: root, selectionRange: JSCompiler_temp };\n _enabled = !1;\n for (nextEffect = firstChild; null !== nextEffect; )\n if (\n ((firstChild = nextEffect),\n (root = firstChild.child),\n 0 !== (firstChild.subtreeFlags & 1028) && null !== root)\n )\n (root.return = firstChild), (nextEffect = root);\n else\n for (; null !== nextEffect; ) {\n firstChild = nextEffect;\n focusNode = firstChild.alternate;\n root = firstChild.flags;\n switch (firstChild.tag) {\n case 0:\n if (\n 0 !== (root & 4) &&\n ((root = firstChild.updateQueue),\n (root = null !== root ? root.events : null),\n null !== root)\n )\n for (\n JSCompiler_temp = 0;\n JSCompiler_temp < root.length;\n JSCompiler_temp++\n )\n (anchorOffset = root[JSCompiler_temp]),\n (anchorOffset.ref.impl = anchorOffset.nextImpl);\n break;\n case 11:\n case 15:\n break;\n case 1:\n if (0 !== (root & 1024) && null !== focusNode) {\n root = void 0;\n JSCompiler_temp = firstChild;\n anchorOffset = focusNode.memoizedProps;\n focusNode = focusNode.memoizedState;\n selection = JSCompiler_temp.stateNode;\n try {\n var resolvedPrevProps = resolveClassComponentProps(\n JSCompiler_temp.type,\n anchorOffset\n );\n root = selection.getSnapshotBeforeUpdate(\n resolvedPrevProps,\n focusNode\n );\n selection.__reactInternalSnapshotBeforeUpdate = root;\n } catch (error) {\n captureCommitPhaseError(\n JSCompiler_temp,\n JSCompiler_temp.return,\n error\n );\n }\n }\n break;\n case 3:\n if (0 !== (root & 1024))\n if (\n ((root = firstChild.stateNode.containerInfo),\n (JSCompiler_temp = root.nodeType),\n 9 === JSCompiler_temp)\n )\n clearContainerSparingly(root);\n else if (1 === JSCompiler_temp)\n switch (root.nodeName) {\n case \"HEAD\":\n case \"HTML\":\n case \"BODY\":\n clearContainerSparingly(root);\n break;\n default:\n root.textContent = \"\";\n }\n break;\n case 5:\n case 26:\n case 27:\n case 6:\n case 4:\n case 17:\n break;\n default:\n if (0 !== (root & 1024)) throw Error(formatProdErrorMessage(163));\n }\n root = firstChild.sibling;\n if (null !== root) {\n root.return = firstChild.return;\n nextEffect = root;\n break;\n }\n nextEffect = firstChild.return;\n }\n}\nfunction commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) {\n var flags = finishedWork.flags;\n switch (finishedWork.tag) {\n case 0:\n case 11:\n case 15:\n recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n flags & 4 && commitHookEffectListMount(5, finishedWork);\n break;\n case 1:\n recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n if (flags & 4)\n if (((finishedRoot = finishedWork.stateNode), null === current))\n try {\n finishedRoot.componentDidMount();\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n else {\n var prevProps = resolveClassComponentProps(\n finishedWork.type,\n current.memoizedProps\n );\n current = current.memoizedState;\n try {\n finishedRoot.componentDidUpdate(\n prevProps,\n current,\n finishedRoot.__reactInternalSnapshotBeforeUpdate\n );\n } catch (error$139) {\n captureCommitPhaseError(\n finishedWork,\n finishedWork.return,\n error$139\n );\n }\n }\n flags & 64 && commitClassCallbacks(finishedWork);\n flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);\n break;\n case 3:\n recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n if (\n flags & 64 &&\n ((finishedRoot = finishedWork.updateQueue), null !== finishedRoot)\n ) {\n current = null;\n if (null !== finishedWork.child)\n switch (finishedWork.child.tag) {\n case 27:\n case 5:\n current = finishedWork.child.stateNode;\n break;\n case 1:\n current = finishedWork.child.stateNode;\n }\n try {\n commitCallbacks(finishedRoot, current);\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n }\n break;\n case 27:\n null === current &&\n flags & 4 &&\n commitHostSingletonAcquisition(finishedWork);\n case 26:\n case 5:\n recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n null === current && flags & 4 && commitHostMount(finishedWork);\n flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);\n break;\n case 12:\n recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n break;\n case 31:\n recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n flags & 4 && commitActivityHydrationCallbacks(finishedRoot, finishedWork);\n break;\n case 13:\n recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n flags & 64 &&\n ((finishedRoot = finishedWork.memoizedState),\n null !== finishedRoot &&\n ((finishedRoot = finishedRoot.dehydrated),\n null !== finishedRoot &&\n ((finishedWork = retryDehydratedSuspenseBoundary.bind(\n null,\n finishedWork\n )),\n registerSuspenseInstanceRetry(finishedRoot, finishedWork))));\n break;\n case 22:\n flags = null !== finishedWork.memoizedState || offscreenSubtreeIsHidden;\n if (!flags) {\n current =\n (null !== current && null !== current.memoizedState) ||\n offscreenSubtreeWasHidden;\n prevProps = offscreenSubtreeIsHidden;\n var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;\n offscreenSubtreeIsHidden = flags;\n (offscreenSubtreeWasHidden = current) && !prevOffscreenSubtreeWasHidden\n ? recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n 0 !== (finishedWork.subtreeFlags & 8772)\n )\n : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n offscreenSubtreeIsHidden = prevProps;\n offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;\n }\n break;\n case 30:\n break;\n default:\n recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n }\n}\nfunction detachFiberAfterEffects(fiber) {\n var alternate = fiber.alternate;\n null !== alternate &&\n ((fiber.alternate = null), detachFiberAfterEffects(alternate));\n fiber.child = null;\n fiber.deletions = null;\n fiber.sibling = null;\n 5 === fiber.tag &&\n ((alternate = fiber.stateNode),\n null !== alternate && detachDeletedInstance(alternate));\n fiber.stateNode = null;\n fiber.return = null;\n fiber.dependencies = null;\n fiber.memoizedProps = null;\n fiber.memoizedState = null;\n fiber.pendingProps = null;\n fiber.stateNode = null;\n fiber.updateQueue = null;\n}\nvar hostParent = null,\n hostParentIsContainer = !1;\nfunction recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n parent\n) {\n for (parent = parent.child; null !== parent; )\n commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, parent),\n (parent = parent.sibling);\n}\nfunction commitDeletionEffectsOnFiber(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n) {\n if (injectedHook && \"function\" === typeof injectedHook.onCommitFiberUnmount)\n try {\n injectedHook.onCommitFiberUnmount(rendererID, deletedFiber);\n } catch (err) {}\n switch (deletedFiber.tag) {\n case 26:\n offscreenSubtreeWasHidden ||\n safelyDetachRef(deletedFiber, nearestMountedAncestor);\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n deletedFiber.memoizedState\n ? deletedFiber.memoizedState.count--\n : deletedFiber.stateNode &&\n ((deletedFiber = deletedFiber.stateNode),\n deletedFiber.parentNode.removeChild(deletedFiber));\n break;\n case 27:\n offscreenSubtreeWasHidden ||\n safelyDetachRef(deletedFiber, nearestMountedAncestor);\n var prevHostParent = hostParent,\n prevHostParentIsContainer = hostParentIsContainer;\n isSingletonScope(deletedFiber.type) &&\n ((hostParent = deletedFiber.stateNode), (hostParentIsContainer = !1));\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n releaseSingletonInstance(deletedFiber.stateNode);\n hostParent = prevHostParent;\n hostParentIsContainer = prevHostParentIsContainer;\n break;\n case 5:\n offscreenSubtreeWasHidden ||\n safelyDetachRef(deletedFiber, nearestMountedAncestor);\n case 6:\n prevHostParent = hostParent;\n prevHostParentIsContainer = hostParentIsContainer;\n hostParent = null;\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n hostParent = prevHostParent;\n hostParentIsContainer = prevHostParentIsContainer;\n if (null !== hostParent)\n if (hostParentIsContainer)\n try {\n (9 === hostParent.nodeType\n ? hostParent.body\n : \"HTML\" === hostParent.nodeName\n ? hostParent.ownerDocument.body\n : hostParent\n ).removeChild(deletedFiber.stateNode);\n } catch (error) {\n captureCommitPhaseError(\n deletedFiber,\n nearestMountedAncestor,\n error\n );\n }\n else\n try {\n hostParent.removeChild(deletedFiber.stateNode);\n } catch (error) {\n captureCommitPhaseError(\n deletedFiber,\n nearestMountedAncestor,\n error\n );\n }\n break;\n case 18:\n null !== hostParent &&\n (hostParentIsContainer\n ? ((finishedRoot = hostParent),\n clearHydrationBoundary(\n 9 === finishedRoot.nodeType\n ? finishedRoot.body\n : \"HTML\" === finishedRoot.nodeName\n ? finishedRoot.ownerDocument.body\n : finishedRoot,\n deletedFiber.stateNode\n ),\n retryIfBlockedOn(finishedRoot))\n : clearHydrationBoundary(hostParent, deletedFiber.stateNode));\n break;\n case 4:\n prevHostParent = hostParent;\n prevHostParentIsContainer = hostParentIsContainer;\n hostParent = deletedFiber.stateNode.containerInfo;\n hostParentIsContainer = !0;\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n hostParent = prevHostParent;\n hostParentIsContainer = prevHostParentIsContainer;\n break;\n case 0:\n case 11:\n case 14:\n case 15:\n commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor);\n offscreenSubtreeWasHidden ||\n commitHookEffectListUnmount(4, deletedFiber, nearestMountedAncestor);\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n break;\n case 1:\n offscreenSubtreeWasHidden ||\n (safelyDetachRef(deletedFiber, nearestMountedAncestor),\n (prevHostParent = deletedFiber.stateNode),\n \"function\" === typeof prevHostParent.componentWillUnmount &&\n safelyCallComponentWillUnmount(\n deletedFiber,\n nearestMountedAncestor,\n prevHostParent\n ));\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n break;\n case 21:\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n break;\n case 22:\n offscreenSubtreeWasHidden =\n (prevHostParent = offscreenSubtreeWasHidden) ||\n null !== deletedFiber.memoizedState;\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n offscreenSubtreeWasHidden = prevHostParent;\n break;\n default:\n recursivelyTraverseDeletionEffects(\n finishedRoot,\n nearestMountedAncestor,\n deletedFiber\n );\n }\n}\nfunction commitActivityHydrationCallbacks(finishedRoot, finishedWork) {\n if (\n null === finishedWork.memoizedState &&\n ((finishedRoot = finishedWork.alternate),\n null !== finishedRoot &&\n ((finishedRoot = finishedRoot.memoizedState), null !== finishedRoot))\n ) {\n finishedRoot = finishedRoot.dehydrated;\n try {\n retryIfBlockedOn(finishedRoot);\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n }\n}\nfunction commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {\n if (\n null === finishedWork.memoizedState &&\n ((finishedRoot = finishedWork.alternate),\n null !== finishedRoot &&\n ((finishedRoot = finishedRoot.memoizedState),\n null !== finishedRoot &&\n ((finishedRoot = finishedRoot.dehydrated), null !== finishedRoot)))\n )\n try {\n retryIfBlockedOn(finishedRoot);\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n}\nfunction getRetryCache(finishedWork) {\n switch (finishedWork.tag) {\n case 31:\n case 13:\n case 19:\n var retryCache = finishedWork.stateNode;\n null === retryCache &&\n (retryCache = finishedWork.stateNode = new PossiblyWeakSet());\n return retryCache;\n case 22:\n return (\n (finishedWork = finishedWork.stateNode),\n (retryCache = finishedWork._retryCache),\n null === retryCache &&\n (retryCache = finishedWork._retryCache = new PossiblyWeakSet()),\n retryCache\n );\n default:\n throw Error(formatProdErrorMessage(435, finishedWork.tag));\n }\n}\nfunction attachSuspenseRetryListeners(finishedWork, wakeables) {\n var retryCache = getRetryCache(finishedWork);\n wakeables.forEach(function (wakeable) {\n if (!retryCache.has(wakeable)) {\n retryCache.add(wakeable);\n var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable);\n wakeable.then(retry, retry);\n }\n });\n}\nfunction recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber) {\n var deletions = parentFiber.deletions;\n if (null !== deletions)\n for (var i = 0; i < deletions.length; i++) {\n var childToDelete = deletions[i],\n root = root$jscomp$0,\n returnFiber = parentFiber,\n parent = returnFiber;\n a: for (; null !== parent; ) {\n switch (parent.tag) {\n case 27:\n if (isSingletonScope(parent.type)) {\n hostParent = parent.stateNode;\n hostParentIsContainer = !1;\n break a;\n }\n break;\n case 5:\n hostParent = parent.stateNode;\n hostParentIsContainer = !1;\n break a;\n case 3:\n case 4:\n hostParent = parent.stateNode.containerInfo;\n hostParentIsContainer = !0;\n break a;\n }\n parent = parent.return;\n }\n if (null === hostParent) throw Error(formatProdErrorMessage(160));\n commitDeletionEffectsOnFiber(root, returnFiber, childToDelete);\n hostParent = null;\n hostParentIsContainer = !1;\n root = childToDelete.alternate;\n null !== root && (root.return = null);\n childToDelete.return = null;\n }\n if (parentFiber.subtreeFlags & 13886)\n for (parentFiber = parentFiber.child; null !== parentFiber; )\n commitMutationEffectsOnFiber(parentFiber, root$jscomp$0),\n (parentFiber = parentFiber.sibling);\n}\nvar currentHoistableRoot = null;\nfunction commitMutationEffectsOnFiber(finishedWork, root) {\n var current = finishedWork.alternate,\n flags = finishedWork.flags;\n switch (finishedWork.tag) {\n case 0:\n case 11:\n case 14:\n case 15:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n flags & 4 &&\n (commitHookEffectListUnmount(3, finishedWork, finishedWork.return),\n commitHookEffectListMount(3, finishedWork),\n commitHookEffectListUnmount(5, finishedWork, finishedWork.return));\n break;\n case 1:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n flags & 512 &&\n (offscreenSubtreeWasHidden ||\n null === current ||\n safelyDetachRef(current, current.return));\n flags & 64 &&\n offscreenSubtreeIsHidden &&\n ((finishedWork = finishedWork.updateQueue),\n null !== finishedWork &&\n ((flags = finishedWork.callbacks),\n null !== flags &&\n ((current = finishedWork.shared.hiddenCallbacks),\n (finishedWork.shared.hiddenCallbacks =\n null === current ? flags : current.concat(flags)))));\n break;\n case 26:\n var hoistableRoot = currentHoistableRoot;\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n flags & 512 &&\n (offscreenSubtreeWasHidden ||\n null === current ||\n safelyDetachRef(current, current.return));\n if (flags & 4) {\n var currentResource = null !== current ? current.memoizedState : null;\n flags = finishedWork.memoizedState;\n if (null === current)\n if (null === flags)\n if (null === finishedWork.stateNode) {\n a: {\n flags = finishedWork.type;\n current = finishedWork.memoizedProps;\n hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n b: switch (flags) {\n case \"title\":\n currentResource =\n hoistableRoot.getElementsByTagName(\"title\")[0];\n if (\n !currentResource ||\n currentResource[internalHoistableMarker] ||\n currentResource[internalInstanceKey] ||\n \"http://www.w3.org/2000/svg\" ===\n currentResource.namespaceURI ||\n currentResource.hasAttribute(\"itemprop\")\n )\n (currentResource = hoistableRoot.createElement(flags)),\n hoistableRoot.head.insertBefore(\n currentResource,\n hoistableRoot.querySelector(\"head > title\")\n );\n setInitialProperties(currentResource, flags, current);\n currentResource[internalInstanceKey] = finishedWork;\n markNodeAsHoistable(currentResource);\n flags = currentResource;\n break a;\n case \"link\":\n var maybeNodes = getHydratableHoistableCache(\n \"link\",\n \"href\",\n hoistableRoot\n ).get(flags + (current.href || \"\"));\n if (maybeNodes)\n for (var i = 0; i < maybeNodes.length; i++)\n if (\n ((currentResource = maybeNodes[i]),\n currentResource.getAttribute(\"href\") ===\n (null == current.href || \"\" === current.href\n ? null\n : current.href) &&\n currentResource.getAttribute(\"rel\") ===\n (null == current.rel ? null : current.rel) &&\n currentResource.getAttribute(\"title\") ===\n (null == current.title ? null : current.title) &&\n currentResource.getAttribute(\"crossorigin\") ===\n (null == current.crossOrigin\n ? null\n : current.crossOrigin))\n ) {\n maybeNodes.splice(i, 1);\n break b;\n }\n currentResource = hoistableRoot.createElement(flags);\n setInitialProperties(currentResource, flags, current);\n hoistableRoot.head.appendChild(currentResource);\n break;\n case \"meta\":\n if (\n (maybeNodes = getHydratableHoistableCache(\n \"meta\",\n \"content\",\n hoistableRoot\n ).get(flags + (current.content || \"\")))\n )\n for (i = 0; i < maybeNodes.length; i++)\n if (\n ((currentResource = maybeNodes[i]),\n currentResource.getAttribute(\"content\") ===\n (null == current.content\n ? null\n : \"\" + current.content) &&\n currentResource.getAttribute(\"name\") ===\n (null == current.name ? null : current.name) &&\n currentResource.getAttribute(\"property\") ===\n (null == current.property\n ? null\n : current.property) &&\n currentResource.getAttribute(\"http-equiv\") ===\n (null == current.httpEquiv\n ? null\n : current.httpEquiv) &&\n currentResource.getAttribute(\"charset\") ===\n (null == current.charSet\n ? null\n : current.charSet))\n ) {\n maybeNodes.splice(i, 1);\n break b;\n }\n currentResource = hoistableRoot.createElement(flags);\n setInitialProperties(currentResource, flags, current);\n hoistableRoot.head.appendChild(currentResource);\n break;\n default:\n throw Error(formatProdErrorMessage(468, flags));\n }\n currentResource[internalInstanceKey] = finishedWork;\n markNodeAsHoistable(currentResource);\n flags = currentResource;\n }\n finishedWork.stateNode = flags;\n } else\n mountHoistable(\n hoistableRoot,\n finishedWork.type,\n finishedWork.stateNode\n );\n else\n finishedWork.stateNode = acquireResource(\n hoistableRoot,\n flags,\n finishedWork.memoizedProps\n );\n else\n currentResource !== flags\n ? (null === currentResource\n ? null !== current.stateNode &&\n ((current = current.stateNode),\n current.parentNode.removeChild(current))\n : currentResource.count--,\n null === flags\n ? mountHoistable(\n hoistableRoot,\n finishedWork.type,\n finishedWork.stateNode\n )\n : acquireResource(\n hoistableRoot,\n flags,\n finishedWork.memoizedProps\n ))\n : null === flags &&\n null !== finishedWork.stateNode &&\n commitHostUpdate(\n finishedWork,\n finishedWork.memoizedProps,\n current.memoizedProps\n );\n }\n break;\n case 27:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n flags & 512 &&\n (offscreenSubtreeWasHidden ||\n null === current ||\n safelyDetachRef(current, current.return));\n null !== current &&\n flags & 4 &&\n commitHostUpdate(\n finishedWork,\n finishedWork.memoizedProps,\n current.memoizedProps\n );\n break;\n case 5:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n flags & 512 &&\n (offscreenSubtreeWasHidden ||\n null === current ||\n safelyDetachRef(current, current.return));\n if (finishedWork.flags & 32) {\n hoistableRoot = finishedWork.stateNode;\n try {\n setTextContent(hoistableRoot, \"\");\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n }\n flags & 4 &&\n null != finishedWork.stateNode &&\n ((hoistableRoot = finishedWork.memoizedProps),\n commitHostUpdate(\n finishedWork,\n hoistableRoot,\n null !== current ? current.memoizedProps : hoistableRoot\n ));\n flags & 1024 && (needsFormReset = !0);\n break;\n case 6:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n if (flags & 4) {\n if (null === finishedWork.stateNode)\n throw Error(formatProdErrorMessage(162));\n flags = finishedWork.memoizedProps;\n current = finishedWork.stateNode;\n try {\n current.nodeValue = flags;\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n }\n break;\n case 3:\n tagCaches = null;\n hoistableRoot = currentHoistableRoot;\n currentHoistableRoot = getHoistableRoot(root.containerInfo);\n recursivelyTraverseMutationEffects(root, finishedWork);\n currentHoistableRoot = hoistableRoot;\n commitReconciliationEffects(finishedWork);\n if (flags & 4 && null !== current && current.memoizedState.isDehydrated)\n try {\n retryIfBlockedOn(root.containerInfo);\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n needsFormReset &&\n ((needsFormReset = !1), recursivelyResetForms(finishedWork));\n break;\n case 4:\n flags = currentHoistableRoot;\n currentHoistableRoot = getHoistableRoot(\n finishedWork.stateNode.containerInfo\n );\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n currentHoistableRoot = flags;\n break;\n case 12:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n break;\n case 31:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n flags & 4 &&\n ((flags = finishedWork.updateQueue),\n null !== flags &&\n ((finishedWork.updateQueue = null),\n attachSuspenseRetryListeners(finishedWork, flags)));\n break;\n case 13:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n finishedWork.child.flags & 8192 &&\n (null !== finishedWork.memoizedState) !==\n (null !== current && null !== current.memoizedState) &&\n (globalMostRecentFallbackTime = now());\n flags & 4 &&\n ((flags = finishedWork.updateQueue),\n null !== flags &&\n ((finishedWork.updateQueue = null),\n attachSuspenseRetryListeners(finishedWork, flags)));\n break;\n case 22:\n hoistableRoot = null !== finishedWork.memoizedState;\n var wasHidden = null !== current && null !== current.memoizedState,\n prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden,\n prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;\n offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || hoistableRoot;\n offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || wasHidden;\n recursivelyTraverseMutationEffects(root, finishedWork);\n offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;\n offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;\n commitReconciliationEffects(finishedWork);\n if (flags & 8192)\n a: for (\n root = finishedWork.stateNode,\n root._visibility = hoistableRoot\n ? root._visibility & -2\n : root._visibility | 1,\n hoistableRoot &&\n (null === current ||\n wasHidden ||\n offscreenSubtreeIsHidden ||\n offscreenSubtreeWasHidden ||\n recursivelyTraverseDisappearLayoutEffects(finishedWork)),\n current = null,\n root = finishedWork;\n ;\n\n ) {\n if (5 === root.tag || 26 === root.tag) {\n if (null === current) {\n wasHidden = current = root;\n try {\n if (((currentResource = wasHidden.stateNode), hoistableRoot))\n (maybeNodes = currentResource.style),\n \"function\" === typeof maybeNodes.setProperty\n ? maybeNodes.setProperty(\"display\", \"none\", \"important\")\n : (maybeNodes.display = \"none\");\n else {\n i = wasHidden.stateNode;\n var styleProp = wasHidden.memoizedProps.style,\n display =\n void 0 !== styleProp &&\n null !== styleProp &&\n styleProp.hasOwnProperty(\"display\")\n ? styleProp.display\n : null;\n i.style.display =\n null == display || \"boolean\" === typeof display\n ? \"\"\n : (\"\" + display).trim();\n }\n } catch (error) {\n captureCommitPhaseError(wasHidden, wasHidden.return, error);\n }\n }\n } else if (6 === root.tag) {\n if (null === current) {\n wasHidden = root;\n try {\n wasHidden.stateNode.nodeValue = hoistableRoot\n ? \"\"\n : wasHidden.memoizedProps;\n } catch (error) {\n captureCommitPhaseError(wasHidden, wasHidden.return, error);\n }\n }\n } else if (18 === root.tag) {\n if (null === current) {\n wasHidden = root;\n try {\n var instance = wasHidden.stateNode;\n hoistableRoot\n ? hideOrUnhideDehydratedBoundary(instance, !0)\n : hideOrUnhideDehydratedBoundary(wasHidden.stateNode, !1);\n } catch (error) {\n captureCommitPhaseError(wasHidden, wasHidden.return, error);\n }\n }\n } else if (\n ((22 !== root.tag && 23 !== root.tag) ||\n null === root.memoizedState ||\n root === finishedWork) &&\n null !== root.child\n ) {\n root.child.return = root;\n root = root.child;\n continue;\n }\n if (root === finishedWork) break a;\n for (; null === root.sibling; ) {\n if (null === root.return || root.return === finishedWork) break a;\n current === root && (current = null);\n root = root.return;\n }\n current === root && (current = null);\n root.sibling.return = root.return;\n root = root.sibling;\n }\n flags & 4 &&\n ((flags = finishedWork.updateQueue),\n null !== flags &&\n ((current = flags.retryQueue),\n null !== current &&\n ((flags.retryQueue = null),\n attachSuspenseRetryListeners(finishedWork, current))));\n break;\n case 19:\n recursivelyTraverseMutationEffects(root, finishedWork);\n commitReconciliationEffects(finishedWork);\n flags & 4 &&\n ((flags = finishedWork.updateQueue),\n null !== flags &&\n ((finishedWork.updateQueue = null),\n attachSuspenseRetryListeners(finishedWork, flags)));\n break;\n case 30:\n break;\n case 21:\n break;\n default:\n recursivelyTraverseMutationEffects(root, finishedWork),\n commitReconciliationEffects(finishedWork);\n }\n}\nfunction commitReconciliationEffects(finishedWork) {\n var flags = finishedWork.flags;\n if (flags & 2) {\n try {\n for (\n var hostParentFiber, parentFiber = finishedWork.return;\n null !== parentFiber;\n\n ) {\n if (isHostParent(parentFiber)) {\n hostParentFiber = parentFiber;\n break;\n }\n parentFiber = parentFiber.return;\n }\n if (null == hostParentFiber) throw Error(formatProdErrorMessage(160));\n switch (hostParentFiber.tag) {\n case 27:\n var parent = hostParentFiber.stateNode,\n before = getHostSibling(finishedWork);\n insertOrAppendPlacementNode(finishedWork, before, parent);\n break;\n case 5:\n var parent$141 = hostParentFiber.stateNode;\n hostParentFiber.flags & 32 &&\n (setTextContent(parent$141, \"\"), (hostParentFiber.flags &= -33));\n var before$142 = getHostSibling(finishedWork);\n insertOrAppendPlacementNode(finishedWork, before$142, parent$141);\n break;\n case 3:\n case 4:\n var parent$143 = hostParentFiber.stateNode.containerInfo,\n before$144 = getHostSibling(finishedWork);\n insertOrAppendPlacementNodeIntoContainer(\n finishedWork,\n before$144,\n parent$143\n );\n break;\n default:\n throw Error(formatProdErrorMessage(161));\n }\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n finishedWork.flags &= -3;\n }\n flags & 4096 && (finishedWork.flags &= -4097);\n}\nfunction recursivelyResetForms(parentFiber) {\n if (parentFiber.subtreeFlags & 1024)\n for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n var fiber = parentFiber;\n recursivelyResetForms(fiber);\n 5 === fiber.tag && fiber.flags & 1024 && fiber.stateNode.reset();\n parentFiber = parentFiber.sibling;\n }\n}\nfunction recursivelyTraverseLayoutEffects(root, parentFiber) {\n if (parentFiber.subtreeFlags & 8772)\n for (parentFiber = parentFiber.child; null !== parentFiber; )\n commitLayoutEffectOnFiber(root, parentFiber.alternate, parentFiber),\n (parentFiber = parentFiber.sibling);\n}\nfunction recursivelyTraverseDisappearLayoutEffects(parentFiber) {\n for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n var finishedWork = parentFiber;\n switch (finishedWork.tag) {\n case 0:\n case 11:\n case 14:\n case 15:\n commitHookEffectListUnmount(4, finishedWork, finishedWork.return);\n recursivelyTraverseDisappearLayoutEffects(finishedWork);\n break;\n case 1:\n safelyDetachRef(finishedWork, finishedWork.return);\n var instance = finishedWork.stateNode;\n \"function\" === typeof instance.componentWillUnmount &&\n safelyCallComponentWillUnmount(\n finishedWork,\n finishedWork.return,\n instance\n );\n recursivelyTraverseDisappearLayoutEffects(finishedWork);\n break;\n case 27:\n releaseSingletonInstance(finishedWork.stateNode);\n case 26:\n case 5:\n safelyDetachRef(finishedWork, finishedWork.return);\n recursivelyTraverseDisappearLayoutEffects(finishedWork);\n break;\n case 22:\n null === finishedWork.memoizedState &&\n recursivelyTraverseDisappearLayoutEffects(finishedWork);\n break;\n case 30:\n recursivelyTraverseDisappearLayoutEffects(finishedWork);\n break;\n default:\n recursivelyTraverseDisappearLayoutEffects(finishedWork);\n }\n parentFiber = parentFiber.sibling;\n }\n}\nfunction recursivelyTraverseReappearLayoutEffects(\n finishedRoot$jscomp$0,\n parentFiber,\n includeWorkInProgressEffects\n) {\n includeWorkInProgressEffects =\n includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 8772);\n for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n var current = parentFiber.alternate,\n finishedRoot = finishedRoot$jscomp$0,\n finishedWork = parentFiber,\n flags = finishedWork.flags;\n switch (finishedWork.tag) {\n case 0:\n case 11:\n case 15:\n recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n includeWorkInProgressEffects\n );\n commitHookEffectListMount(4, finishedWork);\n break;\n case 1:\n recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n includeWorkInProgressEffects\n );\n current = finishedWork;\n finishedRoot = current.stateNode;\n if (\"function\" === typeof finishedRoot.componentDidMount)\n try {\n finishedRoot.componentDidMount();\n } catch (error) {\n captureCommitPhaseError(current, current.return, error);\n }\n current = finishedWork;\n finishedRoot = current.updateQueue;\n if (null !== finishedRoot) {\n var instance = current.stateNode;\n try {\n var hiddenCallbacks = finishedRoot.shared.hiddenCallbacks;\n if (null !== hiddenCallbacks)\n for (\n finishedRoot.shared.hiddenCallbacks = null, finishedRoot = 0;\n finishedRoot < hiddenCallbacks.length;\n finishedRoot++\n )\n callCallback(hiddenCallbacks[finishedRoot], instance);\n } catch (error) {\n captureCommitPhaseError(current, current.return, error);\n }\n }\n includeWorkInProgressEffects &&\n flags & 64 &&\n commitClassCallbacks(finishedWork);\n safelyAttachRef(finishedWork, finishedWork.return);\n break;\n case 27:\n commitHostSingletonAcquisition(finishedWork);\n case 26:\n case 5:\n recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n includeWorkInProgressEffects\n );\n includeWorkInProgressEffects &&\n null === current &&\n flags & 4 &&\n commitHostMount(finishedWork);\n safelyAttachRef(finishedWork, finishedWork.return);\n break;\n case 12:\n recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n includeWorkInProgressEffects\n );\n break;\n case 31:\n recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n includeWorkInProgressEffects\n );\n includeWorkInProgressEffects &&\n flags & 4 &&\n commitActivityHydrationCallbacks(finishedRoot, finishedWork);\n break;\n case 13:\n recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n includeWorkInProgressEffects\n );\n includeWorkInProgressEffects &&\n flags & 4 &&\n commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n break;\n case 22:\n null === finishedWork.memoizedState &&\n recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n includeWorkInProgressEffects\n );\n safelyAttachRef(finishedWork, finishedWork.return);\n break;\n case 30:\n break;\n default:\n recursivelyTraverseReappearLayoutEffects(\n finishedRoot,\n finishedWork,\n includeWorkInProgressEffects\n );\n }\n parentFiber = parentFiber.sibling;\n }\n}\nfunction commitOffscreenPassiveMountEffects(current, finishedWork) {\n var previousCache = null;\n null !== current &&\n null !== current.memoizedState &&\n null !== current.memoizedState.cachePool &&\n (previousCache = current.memoizedState.cachePool.pool);\n current = null;\n null !== finishedWork.memoizedState &&\n null !== finishedWork.memoizedState.cachePool &&\n (current = finishedWork.memoizedState.cachePool.pool);\n current !== previousCache &&\n (null != current && current.refCount++,\n null != previousCache && releaseCache(previousCache));\n}\nfunction commitCachePassiveMountEffect(current, finishedWork) {\n current = null;\n null !== finishedWork.alternate &&\n (current = finishedWork.alternate.memoizedState.cache);\n finishedWork = finishedWork.memoizedState.cache;\n finishedWork !== current &&\n (finishedWork.refCount++, null != current && releaseCache(current));\n}\nfunction recursivelyTraversePassiveMountEffects(\n root,\n parentFiber,\n committedLanes,\n committedTransitions\n) {\n if (parentFiber.subtreeFlags & 10256)\n for (parentFiber = parentFiber.child; null !== parentFiber; )\n commitPassiveMountOnFiber(\n root,\n parentFiber,\n committedLanes,\n committedTransitions\n ),\n (parentFiber = parentFiber.sibling);\n}\nfunction commitPassiveMountOnFiber(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n) {\n var flags = finishedWork.flags;\n switch (finishedWork.tag) {\n case 0:\n case 11:\n case 15:\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n flags & 2048 && commitHookEffectListMount(9, finishedWork);\n break;\n case 1:\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n break;\n case 3:\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n flags & 2048 &&\n ((finishedRoot = null),\n null !== finishedWork.alternate &&\n (finishedRoot = finishedWork.alternate.memoizedState.cache),\n (finishedWork = finishedWork.memoizedState.cache),\n finishedWork !== finishedRoot &&\n (finishedWork.refCount++,\n null != finishedRoot && releaseCache(finishedRoot)));\n break;\n case 12:\n if (flags & 2048) {\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n finishedRoot = finishedWork.stateNode;\n try {\n var _finishedWork$memoize2 = finishedWork.memoizedProps,\n id = _finishedWork$memoize2.id,\n onPostCommit = _finishedWork$memoize2.onPostCommit;\n \"function\" === typeof onPostCommit &&\n onPostCommit(\n id,\n null === finishedWork.alternate ? \"mount\" : \"update\",\n finishedRoot.passiveEffectDuration,\n -0\n );\n } catch (error) {\n captureCommitPhaseError(finishedWork, finishedWork.return, error);\n }\n } else\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n break;\n case 31:\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n break;\n case 13:\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n break;\n case 23:\n break;\n case 22:\n _finishedWork$memoize2 = finishedWork.stateNode;\n id = finishedWork.alternate;\n null !== finishedWork.memoizedState\n ? _finishedWork$memoize2._visibility & 2\n ? recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n )\n : recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork)\n : _finishedWork$memoize2._visibility & 2\n ? recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n )\n : ((_finishedWork$memoize2._visibility |= 2),\n recursivelyTraverseReconnectPassiveEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions,\n 0 !== (finishedWork.subtreeFlags & 10256) || !1\n ));\n flags & 2048 && commitOffscreenPassiveMountEffects(id, finishedWork);\n break;\n case 24:\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n flags & 2048 &&\n commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n break;\n default:\n recursivelyTraversePassiveMountEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions\n );\n }\n}\nfunction recursivelyTraverseReconnectPassiveEffects(\n finishedRoot$jscomp$0,\n parentFiber,\n committedLanes$jscomp$0,\n committedTransitions$jscomp$0,\n includeWorkInProgressEffects\n) {\n includeWorkInProgressEffects =\n includeWorkInProgressEffects &&\n (0 !== (parentFiber.subtreeFlags & 10256) || !1);\n for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n var finishedRoot = finishedRoot$jscomp$0,\n finishedWork = parentFiber,\n committedLanes = committedLanes$jscomp$0,\n committedTransitions = committedTransitions$jscomp$0,\n flags = finishedWork.flags;\n switch (finishedWork.tag) {\n case 0:\n case 11:\n case 15:\n recursivelyTraverseReconnectPassiveEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions,\n includeWorkInProgressEffects\n );\n commitHookEffectListMount(8, finishedWork);\n break;\n case 23:\n break;\n case 22:\n var instance = finishedWork.stateNode;\n null !== finishedWork.memoizedState\n ? instance._visibility & 2\n ? recursivelyTraverseReconnectPassiveEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions,\n includeWorkInProgressEffects\n )\n : recursivelyTraverseAtomicPassiveEffects(\n finishedRoot,\n finishedWork\n )\n : ((instance._visibility |= 2),\n recursivelyTraverseReconnectPassiveEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions,\n includeWorkInProgressEffects\n ));\n includeWorkInProgressEffects &&\n flags & 2048 &&\n commitOffscreenPassiveMountEffects(\n finishedWork.alternate,\n finishedWork\n );\n break;\n case 24:\n recursivelyTraverseReconnectPassiveEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions,\n includeWorkInProgressEffects\n );\n includeWorkInProgressEffects &&\n flags & 2048 &&\n commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n break;\n default:\n recursivelyTraverseReconnectPassiveEffects(\n finishedRoot,\n finishedWork,\n committedLanes,\n committedTransitions,\n includeWorkInProgressEffects\n );\n }\n parentFiber = parentFiber.sibling;\n }\n}\nfunction recursivelyTraverseAtomicPassiveEffects(\n finishedRoot$jscomp$0,\n parentFiber\n) {\n if (parentFiber.subtreeFlags & 10256)\n for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n var finishedRoot = finishedRoot$jscomp$0,\n finishedWork = parentFiber,\n flags = finishedWork.flags;\n switch (finishedWork.tag) {\n case 22:\n recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n flags & 2048 &&\n commitOffscreenPassiveMountEffects(\n finishedWork.alternate,\n finishedWork\n );\n break;\n case 24:\n recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n flags & 2048 &&\n commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n break;\n default:\n recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n }\n parentFiber = parentFiber.sibling;\n }\n}\nvar suspenseyCommitFlag = 8192;\nfunction recursivelyAccumulateSuspenseyCommit(\n parentFiber,\n committedLanes,\n suspendedState\n) {\n if (parentFiber.subtreeFlags & suspenseyCommitFlag)\n for (parentFiber = parentFiber.child; null !== parentFiber; )\n accumulateSuspenseyCommitOnFiber(\n parentFiber,\n committedLanes,\n suspendedState\n ),\n (parentFiber = parentFiber.sibling);\n}\nfunction accumulateSuspenseyCommitOnFiber(\n fiber,\n committedLanes,\n suspendedState\n) {\n switch (fiber.tag) {\n case 26:\n recursivelyAccumulateSuspenseyCommit(\n fiber,\n committedLanes,\n suspendedState\n );\n fiber.flags & suspenseyCommitFlag &&\n null !== fiber.memoizedState &&\n suspendResource(\n suspendedState,\n currentHoistableRoot,\n fiber.memoizedState,\n fiber.memoizedProps\n );\n break;\n case 5:\n recursivelyAccumulateSuspenseyCommit(\n fiber,\n committedLanes,\n suspendedState\n );\n break;\n case 3:\n case 4:\n var previousHoistableRoot = currentHoistableRoot;\n currentHoistableRoot = getHoistableRoot(fiber.stateNode.containerInfo);\n recursivelyAccumulateSuspenseyCommit(\n fiber,\n committedLanes,\n suspendedState\n );\n currentHoistableRoot = previousHoistableRoot;\n break;\n case 22:\n null === fiber.memoizedState &&\n ((previousHoistableRoot = fiber.alternate),\n null !== previousHoistableRoot &&\n null !== previousHoistableRoot.memoizedState\n ? ((previousHoistableRoot = suspenseyCommitFlag),\n (suspenseyCommitFlag = 16777216),\n recursivelyAccumulateSuspenseyCommit(\n fiber,\n committedLanes,\n suspendedState\n ),\n (suspenseyCommitFlag = previousHoistableRoot))\n : recursivelyAccumulateSuspenseyCommit(\n fiber,\n committedLanes,\n suspendedState\n ));\n break;\n default:\n recursivelyAccumulateSuspenseyCommit(\n fiber,\n committedLanes,\n suspendedState\n );\n }\n}\nfunction detachAlternateSiblings(parentFiber) {\n var previousFiber = parentFiber.alternate;\n if (\n null !== previousFiber &&\n ((parentFiber = previousFiber.child), null !== parentFiber)\n ) {\n previousFiber.child = null;\n do\n (previousFiber = parentFiber.sibling),\n (parentFiber.sibling = null),\n (parentFiber = previousFiber);\n while (null !== parentFiber);\n }\n}\nfunction recursivelyTraversePassiveUnmountEffects(parentFiber) {\n var deletions = parentFiber.deletions;\n if (0 !== (parentFiber.flags & 16)) {\n if (null !== deletions)\n for (var i = 0; i < deletions.length; i++) {\n var childToDelete = deletions[i];\n nextEffect = childToDelete;\n commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n childToDelete,\n parentFiber\n );\n }\n detachAlternateSiblings(parentFiber);\n }\n if (parentFiber.subtreeFlags & 10256)\n for (parentFiber = parentFiber.child; null !== parentFiber; )\n commitPassiveUnmountOnFiber(parentFiber),\n (parentFiber = parentFiber.sibling);\n}\nfunction commitPassiveUnmountOnFiber(finishedWork) {\n switch (finishedWork.tag) {\n case 0:\n case 11:\n case 15:\n recursivelyTraversePassiveUnmountEffects(finishedWork);\n finishedWork.flags & 2048 &&\n commitHookEffectListUnmount(9, finishedWork, finishedWork.return);\n break;\n case 3:\n recursivelyTraversePassiveUnmountEffects(finishedWork);\n break;\n case 12:\n recursivelyTraversePassiveUnmountEffects(finishedWork);\n break;\n case 22:\n var instance = finishedWork.stateNode;\n null !== finishedWork.memoizedState &&\n instance._visibility & 2 &&\n (null === finishedWork.return || 13 !== finishedWork.return.tag)\n ? ((instance._visibility &= -3),\n recursivelyTraverseDisconnectPassiveEffects(finishedWork))\n : recursivelyTraversePassiveUnmountEffects(finishedWork);\n break;\n default:\n recursivelyTraversePassiveUnmountEffects(finishedWork);\n }\n}\nfunction recursivelyTraverseDisconnectPassiveEffects(parentFiber) {\n var deletions = parentFiber.deletions;\n if (0 !== (parentFiber.flags & 16)) {\n if (null !== deletions)\n for (var i = 0; i < deletions.length; i++) {\n var childToDelete = deletions[i];\n nextEffect = childToDelete;\n commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n childToDelete,\n parentFiber\n );\n }\n detachAlternateSiblings(parentFiber);\n }\n for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n deletions = parentFiber;\n switch (deletions.tag) {\n case 0:\n case 11:\n case 15:\n commitHookEffectListUnmount(8, deletions, deletions.return);\n recursivelyTraverseDisconnectPassiveEffects(deletions);\n break;\n case 22:\n i = deletions.stateNode;\n i._visibility & 2 &&\n ((i._visibility &= -3),\n recursivelyTraverseDisconnectPassiveEffects(deletions));\n break;\n default:\n recursivelyTraverseDisconnectPassiveEffects(deletions);\n }\n parentFiber = parentFiber.sibling;\n }\n}\nfunction commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n deletedSubtreeRoot,\n nearestMountedAncestor\n) {\n for (; null !== nextEffect; ) {\n var fiber = nextEffect;\n switch (fiber.tag) {\n case 0:\n case 11:\n case 15:\n commitHookEffectListUnmount(8, fiber, nearestMountedAncestor);\n break;\n case 23:\n case 22:\n if (\n null !== fiber.memoizedState &&\n null !== fiber.memoizedState.cachePool\n ) {\n var cache = fiber.memoizedState.cachePool.pool;\n null != cache && cache.refCount++;\n }\n break;\n case 24:\n releaseCache(fiber.memoizedState.cache);\n }\n cache = fiber.child;\n if (null !== cache) (cache.return = fiber), (nextEffect = cache);\n else\n a: for (fiber = deletedSubtreeRoot; null !== nextEffect; ) {\n cache = nextEffect;\n var sibling = cache.sibling,\n returnFiber = cache.return;\n detachFiberAfterEffects(cache);\n if (cache === fiber) {\n nextEffect = null;\n break a;\n }\n if (null !== sibling) {\n sibling.return = returnFiber;\n nextEffect = sibling;\n break a;\n }\n nextEffect = returnFiber;\n }\n }\n}\nvar DefaultAsyncDispatcher = {\n getCacheForType: function (resourceType) {\n var cache = readContext(CacheContext),\n cacheForType = cache.data.get(resourceType);\n void 0 === cacheForType &&\n ((cacheForType = resourceType()),\n cache.data.set(resourceType, cacheForType));\n return cacheForType;\n },\n cacheSignal: function () {\n return readContext(CacheContext).controller.signal;\n }\n },\n PossiblyWeakMap = \"function\" === typeof WeakMap ? WeakMap : Map,\n executionContext = 0,\n workInProgressRoot = null,\n workInProgress = null,\n workInProgressRootRenderLanes = 0,\n workInProgressSuspendedReason = 0,\n workInProgressThrownValue = null,\n workInProgressRootDidSkipSuspendedSiblings = !1,\n workInProgressRootIsPrerendering = !1,\n workInProgressRootDidAttachPingListener = !1,\n entangledRenderLanes = 0,\n workInProgressRootExitStatus = 0,\n workInProgressRootSkippedLanes = 0,\n workInProgressRootInterleavedUpdatedLanes = 0,\n workInProgressRootPingedLanes = 0,\n workInProgressDeferredLane = 0,\n workInProgressSuspendedRetryLanes = 0,\n workInProgressRootConcurrentErrors = null,\n workInProgressRootRecoverableErrors = null,\n workInProgressRootDidIncludeRecursiveRenderUpdate = !1,\n globalMostRecentFallbackTime = 0,\n globalMostRecentTransitionTime = 0,\n workInProgressRootRenderTargetTime = Infinity,\n workInProgressTransitions = null,\n legacyErrorBoundariesThatAlreadyFailed = null,\n pendingEffectsStatus = 0,\n pendingEffectsRoot = null,\n pendingFinishedWork = null,\n pendingEffectsLanes = 0,\n pendingEffectsRemainingLanes = 0,\n pendingPassiveTransitions = null,\n pendingRecoverableErrors = null,\n nestedUpdateCount = 0,\n rootWithNestedUpdates = null;\nfunction requestUpdateLane() {\n return 0 !== (executionContext & 2) && 0 !== workInProgressRootRenderLanes\n ? workInProgressRootRenderLanes & -workInProgressRootRenderLanes\n : null !== ReactSharedInternals.T\n ? requestTransitionLane()\n : resolveUpdatePriority();\n}\nfunction requestDeferredLane() {\n if (0 === workInProgressDeferredLane)\n if (0 === (workInProgressRootRenderLanes & 536870912) || isHydrating) {\n var lane = nextTransitionDeferredLane;\n nextTransitionDeferredLane <<= 1;\n 0 === (nextTransitionDeferredLane & 3932160) &&\n (nextTransitionDeferredLane = 262144);\n workInProgressDeferredLane = lane;\n } else workInProgressDeferredLane = 536870912;\n lane = suspenseHandlerStackCursor.current;\n null !== lane && (lane.flags |= 32);\n return workInProgressDeferredLane;\n}\nfunction scheduleUpdateOnFiber(root, fiber, lane) {\n if (\n (root === workInProgressRoot &&\n (2 === workInProgressSuspendedReason ||\n 9 === workInProgressSuspendedReason)) ||\n null !== root.cancelPendingCommit\n )\n prepareFreshStack(root, 0),\n markRootSuspended(\n root,\n workInProgressRootRenderLanes,\n workInProgressDeferredLane,\n !1\n );\n markRootUpdated$1(root, lane);\n if (0 === (executionContext & 2) || root !== workInProgressRoot)\n root === workInProgressRoot &&\n (0 === (executionContext & 2) &&\n (workInProgressRootInterleavedUpdatedLanes |= lane),\n 4 === workInProgressRootExitStatus &&\n markRootSuspended(\n root,\n workInProgressRootRenderLanes,\n workInProgressDeferredLane,\n !1\n )),\n ensureRootIsScheduled(root);\n}\nfunction performWorkOnRoot(root$jscomp$0, lanes, forceSync) {\n if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(327));\n var shouldTimeSlice =\n (!forceSync &&\n 0 === (lanes & 127) &&\n 0 === (lanes & root$jscomp$0.expiredLanes)) ||\n checkIfRootIsPrerendering(root$jscomp$0, lanes),\n exitStatus = shouldTimeSlice\n ? renderRootConcurrent(root$jscomp$0, lanes)\n : renderRootSync(root$jscomp$0, lanes, !0),\n renderWasConcurrent = shouldTimeSlice;\n do {\n if (0 === exitStatus) {\n workInProgressRootIsPrerendering &&\n !shouldTimeSlice &&\n markRootSuspended(root$jscomp$0, lanes, 0, !1);\n break;\n } else {\n forceSync = root$jscomp$0.current.alternate;\n if (\n renderWasConcurrent &&\n !isRenderConsistentWithExternalStores(forceSync)\n ) {\n exitStatus = renderRootSync(root$jscomp$0, lanes, !1);\n renderWasConcurrent = !1;\n continue;\n }\n if (2 === exitStatus) {\n renderWasConcurrent = lanes;\n if (root$jscomp$0.errorRecoveryDisabledLanes & renderWasConcurrent)\n var JSCompiler_inline_result = 0;\n else\n (JSCompiler_inline_result = root$jscomp$0.pendingLanes & -536870913),\n (JSCompiler_inline_result =\n 0 !== JSCompiler_inline_result\n ? JSCompiler_inline_result\n : JSCompiler_inline_result & 536870912\n ? 536870912\n : 0);\n if (0 !== JSCompiler_inline_result) {\n lanes = JSCompiler_inline_result;\n a: {\n var root = root$jscomp$0;\n exitStatus = workInProgressRootConcurrentErrors;\n var wasRootDehydrated = root.current.memoizedState.isDehydrated;\n wasRootDehydrated &&\n (prepareFreshStack(root, JSCompiler_inline_result).flags |= 256);\n JSCompiler_inline_result = renderRootSync(\n root,\n JSCompiler_inline_result,\n !1\n );\n if (2 !== JSCompiler_inline_result) {\n if (\n workInProgressRootDidAttachPingListener &&\n !wasRootDehydrated\n ) {\n root.errorRecoveryDisabledLanes |= renderWasConcurrent;\n workInProgressRootInterleavedUpdatedLanes |=\n renderWasConcurrent;\n exitStatus = 4;\n break a;\n }\n renderWasConcurrent = workInProgressRootRecoverableErrors;\n workInProgressRootRecoverableErrors = exitStatus;\n null !== renderWasConcurrent &&\n (null === workInProgressRootRecoverableErrors\n ? (workInProgressRootRecoverableErrors = renderWasConcurrent)\n : workInProgressRootRecoverableErrors.push.apply(\n workInProgressRootRecoverableErrors,\n renderWasConcurrent\n ));\n }\n exitStatus = JSCompiler_inline_result;\n }\n renderWasConcurrent = !1;\n if (2 !== exitStatus) continue;\n }\n }\n if (1 === exitStatus) {\n prepareFreshStack(root$jscomp$0, 0);\n markRootSuspended(root$jscomp$0, lanes, 0, !0);\n break;\n }\n a: {\n shouldTimeSlice = root$jscomp$0;\n renderWasConcurrent = exitStatus;\n switch (renderWasConcurrent) {\n case 0:\n case 1:\n throw Error(formatProdErrorMessage(345));\n case 4:\n if ((lanes & 4194048) !== lanes) break;\n case 6:\n markRootSuspended(\n shouldTimeSlice,\n lanes,\n workInProgressDeferredLane,\n !workInProgressRootDidSkipSuspendedSiblings\n );\n break a;\n case 2:\n workInProgressRootRecoverableErrors = null;\n break;\n case 3:\n case 5:\n break;\n default:\n throw Error(formatProdErrorMessage(329));\n }\n if (\n (lanes & 62914560) === lanes &&\n ((exitStatus = globalMostRecentFallbackTime + 300 - now()),\n 10 < exitStatus)\n ) {\n markRootSuspended(\n shouldTimeSlice,\n lanes,\n workInProgressDeferredLane,\n !workInProgressRootDidSkipSuspendedSiblings\n );\n if (0 !== getNextLanes(shouldTimeSlice, 0, !0)) break a;\n pendingEffectsLanes = lanes;\n shouldTimeSlice.timeoutHandle = scheduleTimeout(\n commitRootWhenReady.bind(\n null,\n shouldTimeSlice,\n forceSync,\n workInProgressRootRecoverableErrors,\n workInProgressTransitions,\n workInProgressRootDidIncludeRecursiveRenderUpdate,\n lanes,\n workInProgressDeferredLane,\n workInProgressRootInterleavedUpdatedLanes,\n workInProgressSuspendedRetryLanes,\n workInProgressRootDidSkipSuspendedSiblings,\n renderWasConcurrent,\n \"Throttled\",\n -0,\n 0\n ),\n exitStatus\n );\n break a;\n }\n commitRootWhenReady(\n shouldTimeSlice,\n forceSync,\n workInProgressRootRecoverableErrors,\n workInProgressTransitions,\n workInProgressRootDidIncludeRecursiveRenderUpdate,\n lanes,\n workInProgressDeferredLane,\n workInProgressRootInterleavedUpdatedLanes,\n workInProgressSuspendedRetryLanes,\n workInProgressRootDidSkipSuspendedSiblings,\n renderWasConcurrent,\n null,\n -0,\n 0\n );\n }\n }\n break;\n } while (1);\n ensureRootIsScheduled(root$jscomp$0);\n}\nfunction commitRootWhenReady(\n root,\n finishedWork,\n recoverableErrors,\n transitions,\n didIncludeRenderPhaseUpdate,\n lanes,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes,\n didSkipSuspendedSiblings,\n exitStatus,\n suspendedCommitReason,\n completedRenderStartTime,\n completedRenderEndTime\n) {\n root.timeoutHandle = -1;\n suspendedCommitReason = finishedWork.subtreeFlags;\n if (\n suspendedCommitReason & 8192 ||\n 16785408 === (suspendedCommitReason & 16785408)\n ) {\n suspendedCommitReason = {\n stylesheets: null,\n count: 0,\n imgCount: 0,\n imgBytes: 0,\n suspenseyImages: [],\n waitingForImages: !0,\n waitingForViewTransition: !1,\n unsuspend: noop$1\n };\n accumulateSuspenseyCommitOnFiber(\n finishedWork,\n lanes,\n suspendedCommitReason\n );\n var timeoutOffset =\n (lanes & 62914560) === lanes\n ? globalMostRecentFallbackTime - now()\n : (lanes & 4194048) === lanes\n ? globalMostRecentTransitionTime - now()\n : 0;\n timeoutOffset = waitForCommitToBeReady(\n suspendedCommitReason,\n timeoutOffset\n );\n if (null !== timeoutOffset) {\n pendingEffectsLanes = lanes;\n root.cancelPendingCommit = timeoutOffset(\n commitRoot.bind(\n null,\n root,\n finishedWork,\n lanes,\n recoverableErrors,\n transitions,\n didIncludeRenderPhaseUpdate,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes,\n exitStatus,\n suspendedCommitReason,\n null,\n completedRenderStartTime,\n completedRenderEndTime\n )\n );\n markRootSuspended(root, lanes, spawnedLane, !didSkipSuspendedSiblings);\n return;\n }\n }\n commitRoot(\n root,\n finishedWork,\n lanes,\n recoverableErrors,\n transitions,\n didIncludeRenderPhaseUpdate,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes\n );\n}\nfunction isRenderConsistentWithExternalStores(finishedWork) {\n for (var node = finishedWork; ; ) {\n var tag = node.tag;\n if (\n (0 === tag || 11 === tag || 15 === tag) &&\n node.flags & 16384 &&\n ((tag = node.updateQueue),\n null !== tag && ((tag = tag.stores), null !== tag))\n )\n for (var i = 0; i < tag.length; i++) {\n var check = tag[i],\n getSnapshot = check.getSnapshot;\n check = check.value;\n try {\n if (!objectIs(getSnapshot(), check)) return !1;\n } catch (error) {\n return !1;\n }\n }\n tag = node.child;\n if (node.subtreeFlags & 16384 && null !== tag)\n (tag.return = node), (node = tag);\n else {\n if (node === finishedWork) break;\n for (; null === node.sibling; ) {\n if (null === node.return || node.return === finishedWork) return !0;\n node = node.return;\n }\n node.sibling.return = node.return;\n node = node.sibling;\n }\n }\n return !0;\n}\nfunction markRootSuspended(\n root,\n suspendedLanes,\n spawnedLane,\n didAttemptEntireTree\n) {\n suspendedLanes &= ~workInProgressRootPingedLanes;\n suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes;\n root.suspendedLanes |= suspendedLanes;\n root.pingedLanes &= ~suspendedLanes;\n didAttemptEntireTree && (root.warmLanes |= suspendedLanes);\n didAttemptEntireTree = root.expirationTimes;\n for (var lanes = suspendedLanes; 0 < lanes; ) {\n var index$6 = 31 - clz32(lanes),\n lane = 1 << index$6;\n didAttemptEntireTree[index$6] = -1;\n lanes &= ~lane;\n }\n 0 !== spawnedLane &&\n markSpawnedDeferredLane(root, spawnedLane, suspendedLanes);\n}\nfunction flushSyncWork$1() {\n return 0 === (executionContext & 6)\n ? (flushSyncWorkAcrossRoots_impl(0, !1), !1)\n : !0;\n}\nfunction resetWorkInProgressStack() {\n if (null !== workInProgress) {\n if (0 === workInProgressSuspendedReason)\n var interruptedWork = workInProgress.return;\n else\n (interruptedWork = workInProgress),\n (lastContextDependency = currentlyRenderingFiber$1 = null),\n resetHooksOnUnwind(interruptedWork),\n (thenableState$1 = null),\n (thenableIndexCounter$1 = 0),\n (interruptedWork = workInProgress);\n for (; null !== interruptedWork; )\n unwindInterruptedWork(interruptedWork.alternate, interruptedWork),\n (interruptedWork = interruptedWork.return);\n workInProgress = null;\n }\n}\nfunction prepareFreshStack(root, lanes) {\n var timeoutHandle = root.timeoutHandle;\n -1 !== timeoutHandle &&\n ((root.timeoutHandle = -1), cancelTimeout(timeoutHandle));\n timeoutHandle = root.cancelPendingCommit;\n null !== timeoutHandle &&\n ((root.cancelPendingCommit = null), timeoutHandle());\n pendingEffectsLanes = 0;\n resetWorkInProgressStack();\n workInProgressRoot = root;\n workInProgress = timeoutHandle = createWorkInProgress(root.current, null);\n workInProgressRootRenderLanes = lanes;\n workInProgressSuspendedReason = 0;\n workInProgressThrownValue = null;\n workInProgressRootDidSkipSuspendedSiblings = !1;\n workInProgressRootIsPrerendering = checkIfRootIsPrerendering(root, lanes);\n workInProgressRootDidAttachPingListener = !1;\n workInProgressSuspendedRetryLanes =\n workInProgressDeferredLane =\n workInProgressRootPingedLanes =\n workInProgressRootInterleavedUpdatedLanes =\n workInProgressRootSkippedLanes =\n workInProgressRootExitStatus =\n 0;\n workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors =\n null;\n workInProgressRootDidIncludeRecursiveRenderUpdate = !1;\n 0 !== (lanes & 8) && (lanes |= lanes & 32);\n var allEntangledLanes = root.entangledLanes;\n if (0 !== allEntangledLanes)\n for (\n root = root.entanglements, allEntangledLanes &= lanes;\n 0 < allEntangledLanes;\n\n ) {\n var index$4 = 31 - clz32(allEntangledLanes),\n lane = 1 << index$4;\n lanes |= root[index$4];\n allEntangledLanes &= ~lane;\n }\n entangledRenderLanes = lanes;\n finishQueueingConcurrentUpdates();\n return timeoutHandle;\n}\nfunction handleThrow(root, thrownValue) {\n currentlyRenderingFiber = null;\n ReactSharedInternals.H = ContextOnlyDispatcher;\n thrownValue === SuspenseException || thrownValue === SuspenseActionException\n ? ((thrownValue = getSuspendedThenable()),\n (workInProgressSuspendedReason = 3))\n : thrownValue === SuspenseyCommitException\n ? ((thrownValue = getSuspendedThenable()),\n (workInProgressSuspendedReason = 4))\n : (workInProgressSuspendedReason =\n thrownValue === SelectiveHydrationException\n ? 8\n : null !== thrownValue &&\n \"object\" === typeof thrownValue &&\n \"function\" === typeof thrownValue.then\n ? 6\n : 1);\n workInProgressThrownValue = thrownValue;\n null === workInProgress &&\n ((workInProgressRootExitStatus = 1),\n logUncaughtError(\n root,\n createCapturedValueAtFiber(thrownValue, root.current)\n ));\n}\nfunction shouldRemainOnPreviousScreen() {\n var handler = suspenseHandlerStackCursor.current;\n return null === handler\n ? !0\n : (workInProgressRootRenderLanes & 4194048) ===\n workInProgressRootRenderLanes\n ? null === shellBoundary\n ? !0\n : !1\n : (workInProgressRootRenderLanes & 62914560) ===\n workInProgressRootRenderLanes ||\n 0 !== (workInProgressRootRenderLanes & 536870912)\n ? handler === shellBoundary\n : !1;\n}\nfunction pushDispatcher() {\n var prevDispatcher = ReactSharedInternals.H;\n ReactSharedInternals.H = ContextOnlyDispatcher;\n return null === prevDispatcher ? ContextOnlyDispatcher : prevDispatcher;\n}\nfunction pushAsyncDispatcher() {\n var prevAsyncDispatcher = ReactSharedInternals.A;\n ReactSharedInternals.A = DefaultAsyncDispatcher;\n return prevAsyncDispatcher;\n}\nfunction renderDidSuspendDelayIfPossible() {\n workInProgressRootExitStatus = 4;\n workInProgressRootDidSkipSuspendedSiblings ||\n ((workInProgressRootRenderLanes & 4194048) !==\n workInProgressRootRenderLanes &&\n null !== suspenseHandlerStackCursor.current) ||\n (workInProgressRootIsPrerendering = !0);\n (0 === (workInProgressRootSkippedLanes & 134217727) &&\n 0 === (workInProgressRootInterleavedUpdatedLanes & 134217727)) ||\n null === workInProgressRoot ||\n markRootSuspended(\n workInProgressRoot,\n workInProgressRootRenderLanes,\n workInProgressDeferredLane,\n !1\n );\n}\nfunction renderRootSync(root, lanes, shouldYieldForPrerendering) {\n var prevExecutionContext = executionContext;\n executionContext |= 2;\n var prevDispatcher = pushDispatcher(),\n prevAsyncDispatcher = pushAsyncDispatcher();\n if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes)\n (workInProgressTransitions = null), prepareFreshStack(root, lanes);\n lanes = !1;\n var exitStatus = workInProgressRootExitStatus;\n a: do\n try {\n if (0 !== workInProgressSuspendedReason && null !== workInProgress) {\n var unitOfWork = workInProgress,\n thrownValue = workInProgressThrownValue;\n switch (workInProgressSuspendedReason) {\n case 8:\n resetWorkInProgressStack();\n exitStatus = 6;\n break a;\n case 3:\n case 2:\n case 9:\n case 6:\n null === suspenseHandlerStackCursor.current && (lanes = !0);\n var reason = workInProgressSuspendedReason;\n workInProgressSuspendedReason = 0;\n workInProgressThrownValue = null;\n throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason);\n if (\n shouldYieldForPrerendering &&\n workInProgressRootIsPrerendering\n ) {\n exitStatus = 0;\n break a;\n }\n break;\n default:\n (reason = workInProgressSuspendedReason),\n (workInProgressSuspendedReason = 0),\n (workInProgressThrownValue = null),\n throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason);\n }\n }\n workLoopSync();\n exitStatus = workInProgressRootExitStatus;\n break;\n } catch (thrownValue$165) {\n handleThrow(root, thrownValue$165);\n }\n while (1);\n lanes && root.shellSuspendCounter++;\n lastContextDependency = currentlyRenderingFiber$1 = null;\n executionContext = prevExecutionContext;\n ReactSharedInternals.H = prevDispatcher;\n ReactSharedInternals.A = prevAsyncDispatcher;\n null === workInProgress &&\n ((workInProgressRoot = null),\n (workInProgressRootRenderLanes = 0),\n finishQueueingConcurrentUpdates());\n return exitStatus;\n}\nfunction workLoopSync() {\n for (; null !== workInProgress; ) performUnitOfWork(workInProgress);\n}\nfunction renderRootConcurrent(root, lanes) {\n var prevExecutionContext = executionContext;\n executionContext |= 2;\n var prevDispatcher = pushDispatcher(),\n prevAsyncDispatcher = pushAsyncDispatcher();\n workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes\n ? ((workInProgressTransitions = null),\n (workInProgressRootRenderTargetTime = now() + 500),\n prepareFreshStack(root, lanes))\n : (workInProgressRootIsPrerendering = checkIfRootIsPrerendering(\n root,\n lanes\n ));\n a: do\n try {\n if (0 !== workInProgressSuspendedReason && null !== workInProgress) {\n lanes = workInProgress;\n var thrownValue = workInProgressThrownValue;\n b: switch (workInProgressSuspendedReason) {\n case 1:\n workInProgressSuspendedReason = 0;\n workInProgressThrownValue = null;\n throwAndUnwindWorkLoop(root, lanes, thrownValue, 1);\n break;\n case 2:\n case 9:\n if (isThenableResolved(thrownValue)) {\n workInProgressSuspendedReason = 0;\n workInProgressThrownValue = null;\n replaySuspendedUnitOfWork(lanes);\n break;\n }\n lanes = function () {\n (2 !== workInProgressSuspendedReason &&\n 9 !== workInProgressSuspendedReason) ||\n workInProgressRoot !== root ||\n (workInProgressSuspendedReason = 7);\n ensureRootIsScheduled(root);\n };\n thrownValue.then(lanes, lanes);\n break a;\n case 3:\n workInProgressSuspendedReason = 7;\n break a;\n case 4:\n workInProgressSuspendedReason = 5;\n break a;\n case 7:\n isThenableResolved(thrownValue)\n ? ((workInProgressSuspendedReason = 0),\n (workInProgressThrownValue = null),\n replaySuspendedUnitOfWork(lanes))\n : ((workInProgressSuspendedReason = 0),\n (workInProgressThrownValue = null),\n throwAndUnwindWorkLoop(root, lanes, thrownValue, 7));\n break;\n case 5:\n var resource = null;\n switch (workInProgress.tag) {\n case 26:\n resource = workInProgress.memoizedState;\n case 5:\n case 27:\n var hostFiber = workInProgress;\n if (\n resource\n ? preloadResource(resource)\n : hostFiber.stateNode.complete\n ) {\n workInProgressSuspendedReason = 0;\n workInProgressThrownValue = null;\n var sibling = hostFiber.sibling;\n if (null !== sibling) workInProgress = sibling;\n else {\n var returnFiber = hostFiber.return;\n null !== returnFiber\n ? ((workInProgress = returnFiber),\n completeUnitOfWork(returnFiber))\n : (workInProgress = null);\n }\n break b;\n }\n }\n workInProgressSuspendedReason = 0;\n workInProgressThrownValue = null;\n throwAndUnwindWorkLoop(root, lanes, thrownValue, 5);\n break;\n case 6:\n workInProgressSuspendedReason = 0;\n workInProgressThrownValue = null;\n throwAndUnwindWorkLoop(root, lanes, thrownValue, 6);\n break;\n case 8:\n resetWorkInProgressStack();\n workInProgressRootExitStatus = 6;\n break a;\n default:\n throw Error(formatProdErrorMessage(462));\n }\n }\n workLoopConcurrentByScheduler();\n break;\n } catch (thrownValue$167) {\n handleThrow(root, thrownValue$167);\n }\n while (1);\n lastContextDependency = currentlyRenderingFiber$1 = null;\n ReactSharedInternals.H = prevDispatcher;\n ReactSharedInternals.A = prevAsyncDispatcher;\n executionContext = prevExecutionContext;\n if (null !== workInProgress) return 0;\n workInProgressRoot = null;\n workInProgressRootRenderLanes = 0;\n finishQueueingConcurrentUpdates();\n return workInProgressRootExitStatus;\n}\nfunction workLoopConcurrentByScheduler() {\n for (; null !== workInProgress && !shouldYield(); )\n performUnitOfWork(workInProgress);\n}\nfunction performUnitOfWork(unitOfWork) {\n var next = beginWork(unitOfWork.alternate, unitOfWork, entangledRenderLanes);\n unitOfWork.memoizedProps = unitOfWork.pendingProps;\n null === next ? completeUnitOfWork(unitOfWork) : (workInProgress = next);\n}\nfunction replaySuspendedUnitOfWork(unitOfWork) {\n var next = unitOfWork;\n var current = next.alternate;\n switch (next.tag) {\n case 15:\n case 0:\n next = replayFunctionComponent(\n current,\n next,\n next.pendingProps,\n next.type,\n void 0,\n workInProgressRootRenderLanes\n );\n break;\n case 11:\n next = replayFunctionComponent(\n current,\n next,\n next.pendingProps,\n next.type.render,\n next.ref,\n workInProgressRootRenderLanes\n );\n break;\n case 5:\n resetHooksOnUnwind(next);\n default:\n unwindInterruptedWork(current, next),\n (next = workInProgress =\n resetWorkInProgress(next, entangledRenderLanes)),\n (next = beginWork(current, next, entangledRenderLanes));\n }\n unitOfWork.memoizedProps = unitOfWork.pendingProps;\n null === next ? completeUnitOfWork(unitOfWork) : (workInProgress = next);\n}\nfunction throwAndUnwindWorkLoop(\n root,\n unitOfWork,\n thrownValue,\n suspendedReason\n) {\n lastContextDependency = currentlyRenderingFiber$1 = null;\n resetHooksOnUnwind(unitOfWork);\n thenableState$1 = null;\n thenableIndexCounter$1 = 0;\n var returnFiber = unitOfWork.return;\n try {\n if (\n throwException(\n root,\n returnFiber,\n unitOfWork,\n thrownValue,\n workInProgressRootRenderLanes\n )\n ) {\n workInProgressRootExitStatus = 1;\n logUncaughtError(\n root,\n createCapturedValueAtFiber(thrownValue, root.current)\n );\n workInProgress = null;\n return;\n }\n } catch (error) {\n if (null !== returnFiber) throw ((workInProgress = returnFiber), error);\n workInProgressRootExitStatus = 1;\n logUncaughtError(\n root,\n createCapturedValueAtFiber(thrownValue, root.current)\n );\n workInProgress = null;\n return;\n }\n if (unitOfWork.flags & 32768) {\n if (isHydrating || 1 === suspendedReason) root = !0;\n else if (\n workInProgressRootIsPrerendering ||\n 0 !== (workInProgressRootRenderLanes & 536870912)\n )\n root = !1;\n else if (\n ((workInProgressRootDidSkipSuspendedSiblings = root = !0),\n 2 === suspendedReason ||\n 9 === suspendedReason ||\n 3 === suspendedReason ||\n 6 === suspendedReason)\n )\n (suspendedReason = suspenseHandlerStackCursor.current),\n null !== suspendedReason &&\n 13 === suspendedReason.tag &&\n (suspendedReason.flags |= 16384);\n unwindUnitOfWork(unitOfWork, root);\n } else completeUnitOfWork(unitOfWork);\n}\nfunction completeUnitOfWork(unitOfWork) {\n var completedWork = unitOfWork;\n do {\n if (0 !== (completedWork.flags & 32768)) {\n unwindUnitOfWork(\n completedWork,\n workInProgressRootDidSkipSuspendedSiblings\n );\n return;\n }\n unitOfWork = completedWork.return;\n var next = completeWork(\n completedWork.alternate,\n completedWork,\n entangledRenderLanes\n );\n if (null !== next) {\n workInProgress = next;\n return;\n }\n completedWork = completedWork.sibling;\n if (null !== completedWork) {\n workInProgress = completedWork;\n return;\n }\n workInProgress = completedWork = unitOfWork;\n } while (null !== completedWork);\n 0 === workInProgressRootExitStatus && (workInProgressRootExitStatus = 5);\n}\nfunction unwindUnitOfWork(unitOfWork, skipSiblings) {\n do {\n var next = unwindWork(unitOfWork.alternate, unitOfWork);\n if (null !== next) {\n next.flags &= 32767;\n workInProgress = next;\n return;\n }\n next = unitOfWork.return;\n null !== next &&\n ((next.flags |= 32768), (next.subtreeFlags = 0), (next.deletions = null));\n if (\n !skipSiblings &&\n ((unitOfWork = unitOfWork.sibling), null !== unitOfWork)\n ) {\n workInProgress = unitOfWork;\n return;\n }\n workInProgress = unitOfWork = next;\n } while (null !== unitOfWork);\n workInProgressRootExitStatus = 6;\n workInProgress = null;\n}\nfunction commitRoot(\n root,\n finishedWork,\n lanes,\n recoverableErrors,\n transitions,\n didIncludeRenderPhaseUpdate,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes\n) {\n root.cancelPendingCommit = null;\n do flushPendingEffects();\n while (0 !== pendingEffectsStatus);\n if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(327));\n if (null !== finishedWork) {\n if (finishedWork === root.current) throw Error(formatProdErrorMessage(177));\n didIncludeRenderPhaseUpdate = finishedWork.lanes | finishedWork.childLanes;\n didIncludeRenderPhaseUpdate |= concurrentlyUpdatedLanes;\n markRootFinished(\n root,\n lanes,\n didIncludeRenderPhaseUpdate,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes\n );\n root === workInProgressRoot &&\n ((workInProgress = workInProgressRoot = null),\n (workInProgressRootRenderLanes = 0));\n pendingFinishedWork = finishedWork;\n pendingEffectsRoot = root;\n pendingEffectsLanes = lanes;\n pendingEffectsRemainingLanes = didIncludeRenderPhaseUpdate;\n pendingPassiveTransitions = transitions;\n pendingRecoverableErrors = recoverableErrors;\n 0 !== (finishedWork.subtreeFlags & 10256) ||\n 0 !== (finishedWork.flags & 10256)\n ? ((root.callbackNode = null),\n (root.callbackPriority = 0),\n scheduleCallback$1(NormalPriority$1, function () {\n flushPassiveEffects();\n return null;\n }))\n : ((root.callbackNode = null), (root.callbackPriority = 0));\n recoverableErrors = 0 !== (finishedWork.flags & 13878);\n if (0 !== (finishedWork.subtreeFlags & 13878) || recoverableErrors) {\n recoverableErrors = ReactSharedInternals.T;\n ReactSharedInternals.T = null;\n transitions = ReactDOMSharedInternals.p;\n ReactDOMSharedInternals.p = 2;\n spawnedLane = executionContext;\n executionContext |= 4;\n try {\n commitBeforeMutationEffects(root, finishedWork, lanes);\n } finally {\n (executionContext = spawnedLane),\n (ReactDOMSharedInternals.p = transitions),\n (ReactSharedInternals.T = recoverableErrors);\n }\n }\n pendingEffectsStatus = 1;\n flushMutationEffects();\n flushLayoutEffects();\n flushSpawnedWork();\n }\n}\nfunction flushMutationEffects() {\n if (1 === pendingEffectsStatus) {\n pendingEffectsStatus = 0;\n var root = pendingEffectsRoot,\n finishedWork = pendingFinishedWork,\n rootMutationHasEffect = 0 !== (finishedWork.flags & 13878);\n if (0 !== (finishedWork.subtreeFlags & 13878) || rootMutationHasEffect) {\n rootMutationHasEffect = ReactSharedInternals.T;\n ReactSharedInternals.T = null;\n var previousPriority = ReactDOMSharedInternals.p;\n ReactDOMSharedInternals.p = 2;\n var prevExecutionContext = executionContext;\n executionContext |= 4;\n try {\n commitMutationEffectsOnFiber(finishedWork, root);\n var priorSelectionInformation = selectionInformation,\n curFocusedElem = getActiveElementDeep(root.containerInfo),\n priorFocusedElem = priorSelectionInformation.focusedElem,\n priorSelectionRange = priorSelectionInformation.selectionRange;\n if (\n curFocusedElem !== priorFocusedElem &&\n priorFocusedElem &&\n priorFocusedElem.ownerDocument &&\n containsNode(\n priorFocusedElem.ownerDocument.documentElement,\n priorFocusedElem\n )\n ) {\n if (\n null !== priorSelectionRange &&\n hasSelectionCapabilities(priorFocusedElem)\n ) {\n var start = priorSelectionRange.start,\n end = priorSelectionRange.end;\n void 0 === end && (end = start);\n if (\"selectionStart\" in priorFocusedElem)\n (priorFocusedElem.selectionStart = start),\n (priorFocusedElem.selectionEnd = Math.min(\n end,\n priorFocusedElem.value.length\n ));\n else {\n var doc = priorFocusedElem.ownerDocument || document,\n win = (doc && doc.defaultView) || window;\n if (win.getSelection) {\n var selection = win.getSelection(),\n length = priorFocusedElem.textContent.length,\n start$jscomp$0 = Math.min(priorSelectionRange.start, length),\n end$jscomp$0 =\n void 0 === priorSelectionRange.end\n ? start$jscomp$0\n : Math.min(priorSelectionRange.end, length);\n !selection.extend &&\n start$jscomp$0 > end$jscomp$0 &&\n ((curFocusedElem = end$jscomp$0),\n (end$jscomp$0 = start$jscomp$0),\n (start$jscomp$0 = curFocusedElem));\n var startMarker = getNodeForCharacterOffset(\n priorFocusedElem,\n start$jscomp$0\n ),\n endMarker = getNodeForCharacterOffset(\n priorFocusedElem,\n end$jscomp$0\n );\n if (\n startMarker &&\n endMarker &&\n (1 !== selection.rangeCount ||\n selection.anchorNode !== startMarker.node ||\n selection.anchorOffset !== startMarker.offset ||\n selection.focusNode !== endMarker.node ||\n selection.focusOffset !== endMarker.offset)\n ) {\n var range = doc.createRange();\n range.setStart(startMarker.node, startMarker.offset);\n selection.removeAllRanges();\n start$jscomp$0 > end$jscomp$0\n ? (selection.addRange(range),\n selection.extend(endMarker.node, endMarker.offset))\n : (range.setEnd(endMarker.node, endMarker.offset),\n selection.addRange(range));\n }\n }\n }\n }\n doc = [];\n for (\n selection = priorFocusedElem;\n (selection = selection.parentNode);\n\n )\n 1 === selection.nodeType &&\n doc.push({\n element: selection,\n left: selection.scrollLeft,\n top: selection.scrollTop\n });\n \"function\" === typeof priorFocusedElem.focus &&\n priorFocusedElem.focus();\n for (\n priorFocusedElem = 0;\n priorFocusedElem < doc.length;\n priorFocusedElem++\n ) {\n var info = doc[priorFocusedElem];\n info.element.scrollLeft = info.left;\n info.element.scrollTop = info.top;\n }\n }\n _enabled = !!eventsEnabled;\n selectionInformation = eventsEnabled = null;\n } finally {\n (executionContext = prevExecutionContext),\n (ReactDOMSharedInternals.p = previousPriority),\n (ReactSharedInternals.T = rootMutationHasEffect);\n }\n }\n root.current = finishedWork;\n pendingEffectsStatus = 2;\n }\n}\nfunction flushLayoutEffects() {\n if (2 === pendingEffectsStatus) {\n pendingEffectsStatus = 0;\n var root = pendingEffectsRoot,\n finishedWork = pendingFinishedWork,\n rootHasLayoutEffect = 0 !== (finishedWork.flags & 8772);\n if (0 !== (finishedWork.subtreeFlags & 8772) || rootHasLayoutEffect) {\n rootHasLayoutEffect = ReactSharedInternals.T;\n ReactSharedInternals.T = null;\n var previousPriority = ReactDOMSharedInternals.p;\n ReactDOMSharedInternals.p = 2;\n var prevExecutionContext = executionContext;\n executionContext |= 4;\n try {\n commitLayoutEffectOnFiber(root, finishedWork.alternate, finishedWork);\n } finally {\n (executionContext = prevExecutionContext),\n (ReactDOMSharedInternals.p = previousPriority),\n (ReactSharedInternals.T = rootHasLayoutEffect);\n }\n }\n pendingEffectsStatus = 3;\n }\n}\nfunction flushSpawnedWork() {\n if (4 === pendingEffectsStatus || 3 === pendingEffectsStatus) {\n pendingEffectsStatus = 0;\n requestPaint();\n var root = pendingEffectsRoot,\n finishedWork = pendingFinishedWork,\n lanes = pendingEffectsLanes,\n recoverableErrors = pendingRecoverableErrors;\n 0 !== (finishedWork.subtreeFlags & 10256) ||\n 0 !== (finishedWork.flags & 10256)\n ? (pendingEffectsStatus = 5)\n : ((pendingEffectsStatus = 0),\n (pendingFinishedWork = pendingEffectsRoot = null),\n releaseRootPooledCache(root, root.pendingLanes));\n var remainingLanes = root.pendingLanes;\n 0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null);\n lanesToEventPriority(lanes);\n finishedWork = finishedWork.stateNode;\n if (injectedHook && \"function\" === typeof injectedHook.onCommitFiberRoot)\n try {\n injectedHook.onCommitFiberRoot(\n rendererID,\n finishedWork,\n void 0,\n 128 === (finishedWork.current.flags & 128)\n );\n } catch (err) {}\n if (null !== recoverableErrors) {\n finishedWork = ReactSharedInternals.T;\n remainingLanes = ReactDOMSharedInternals.p;\n ReactDOMSharedInternals.p = 2;\n ReactSharedInternals.T = null;\n try {\n for (\n var onRecoverableError = root.onRecoverableError, i = 0;\n i < recoverableErrors.length;\n i++\n ) {\n var recoverableError = recoverableErrors[i];\n onRecoverableError(recoverableError.value, {\n componentStack: recoverableError.stack\n });\n }\n } finally {\n (ReactSharedInternals.T = finishedWork),\n (ReactDOMSharedInternals.p = remainingLanes);\n }\n }\n 0 !== (pendingEffectsLanes & 3) && flushPendingEffects();\n ensureRootIsScheduled(root);\n remainingLanes = root.pendingLanes;\n 0 !== (lanes & 261930) && 0 !== (remainingLanes & 42)\n ? root === rootWithNestedUpdates\n ? nestedUpdateCount++\n : ((nestedUpdateCount = 0), (rootWithNestedUpdates = root))\n : (nestedUpdateCount = 0);\n flushSyncWorkAcrossRoots_impl(0, !1);\n }\n}\nfunction releaseRootPooledCache(root, remainingLanes) {\n 0 === (root.pooledCacheLanes &= remainingLanes) &&\n ((remainingLanes = root.pooledCache),\n null != remainingLanes &&\n ((root.pooledCache = null), releaseCache(remainingLanes)));\n}\nfunction flushPendingEffects() {\n flushMutationEffects();\n flushLayoutEffects();\n flushSpawnedWork();\n return flushPassiveEffects();\n}\nfunction flushPassiveEffects() {\n if (5 !== pendingEffectsStatus) return !1;\n var root = pendingEffectsRoot,\n remainingLanes = pendingEffectsRemainingLanes;\n pendingEffectsRemainingLanes = 0;\n var renderPriority = lanesToEventPriority(pendingEffectsLanes),\n prevTransition = ReactSharedInternals.T,\n previousPriority = ReactDOMSharedInternals.p;\n try {\n ReactDOMSharedInternals.p = 32 > renderPriority ? 32 : renderPriority;\n ReactSharedInternals.T = null;\n renderPriority = pendingPassiveTransitions;\n pendingPassiveTransitions = null;\n var root$jscomp$0 = pendingEffectsRoot,\n lanes = pendingEffectsLanes;\n pendingEffectsStatus = 0;\n pendingFinishedWork = pendingEffectsRoot = null;\n pendingEffectsLanes = 0;\n if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(331));\n var prevExecutionContext = executionContext;\n executionContext |= 4;\n commitPassiveUnmountOnFiber(root$jscomp$0.current);\n commitPassiveMountOnFiber(\n root$jscomp$0,\n root$jscomp$0.current,\n lanes,\n renderPriority\n );\n executionContext = prevExecutionContext;\n flushSyncWorkAcrossRoots_impl(0, !1);\n if (\n injectedHook &&\n \"function\" === typeof injectedHook.onPostCommitFiberRoot\n )\n try {\n injectedHook.onPostCommitFiberRoot(rendererID, root$jscomp$0);\n } catch (err) {}\n return !0;\n } finally {\n (ReactDOMSharedInternals.p = previousPriority),\n (ReactSharedInternals.T = prevTransition),\n releaseRootPooledCache(root, remainingLanes);\n }\n}\nfunction captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {\n sourceFiber = createCapturedValueAtFiber(error, sourceFiber);\n sourceFiber = createRootErrorUpdate(rootFiber.stateNode, sourceFiber, 2);\n rootFiber = enqueueUpdate(rootFiber, sourceFiber, 2);\n null !== rootFiber &&\n (markRootUpdated$1(rootFiber, 2), ensureRootIsScheduled(rootFiber));\n}\nfunction captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error) {\n if (3 === sourceFiber.tag)\n captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);\n else\n for (; null !== nearestMountedAncestor; ) {\n if (3 === nearestMountedAncestor.tag) {\n captureCommitPhaseErrorOnRoot(\n nearestMountedAncestor,\n sourceFiber,\n error\n );\n break;\n } else if (1 === nearestMountedAncestor.tag) {\n var instance = nearestMountedAncestor.stateNode;\n if (\n \"function\" ===\n typeof nearestMountedAncestor.type.getDerivedStateFromError ||\n (\"function\" === typeof instance.componentDidCatch &&\n (null === legacyErrorBoundariesThatAlreadyFailed ||\n !legacyErrorBoundariesThatAlreadyFailed.has(instance)))\n ) {\n sourceFiber = createCapturedValueAtFiber(error, sourceFiber);\n error = createClassErrorUpdate(2);\n instance = enqueueUpdate(nearestMountedAncestor, error, 2);\n null !== instance &&\n (initializeClassErrorUpdate(\n error,\n instance,\n nearestMountedAncestor,\n sourceFiber\n ),\n markRootUpdated$1(instance, 2),\n ensureRootIsScheduled(instance));\n break;\n }\n }\n nearestMountedAncestor = nearestMountedAncestor.return;\n }\n}\nfunction attachPingListener(root, wakeable, lanes) {\n var pingCache = root.pingCache;\n if (null === pingCache) {\n pingCache = root.pingCache = new PossiblyWeakMap();\n var threadIDs = new Set();\n pingCache.set(wakeable, threadIDs);\n } else\n (threadIDs = pingCache.get(wakeable)),\n void 0 === threadIDs &&\n ((threadIDs = new Set()), pingCache.set(wakeable, threadIDs));\n threadIDs.has(lanes) ||\n ((workInProgressRootDidAttachPingListener = !0),\n threadIDs.add(lanes),\n (root = pingSuspendedRoot.bind(null, root, wakeable, lanes)),\n wakeable.then(root, root));\n}\nfunction pingSuspendedRoot(root, wakeable, pingedLanes) {\n var pingCache = root.pingCache;\n null !== pingCache && pingCache.delete(wakeable);\n root.pingedLanes |= root.suspendedLanes & pingedLanes;\n root.warmLanes &= ~pingedLanes;\n workInProgressRoot === root &&\n (workInProgressRootRenderLanes & pingedLanes) === pingedLanes &&\n (4 === workInProgressRootExitStatus ||\n (3 === workInProgressRootExitStatus &&\n (workInProgressRootRenderLanes & 62914560) ===\n workInProgressRootRenderLanes &&\n 300 > now() - globalMostRecentFallbackTime)\n ? 0 === (executionContext & 2) && prepareFreshStack(root, 0)\n : (workInProgressRootPingedLanes |= pingedLanes),\n workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes &&\n (workInProgressSuspendedRetryLanes = 0));\n ensureRootIsScheduled(root);\n}\nfunction retryTimedOutBoundary(boundaryFiber, retryLane) {\n 0 === retryLane && (retryLane = claimNextRetryLane());\n boundaryFiber = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);\n null !== boundaryFiber &&\n (markRootUpdated$1(boundaryFiber, retryLane),\n ensureRootIsScheduled(boundaryFiber));\n}\nfunction retryDehydratedSuspenseBoundary(boundaryFiber) {\n var suspenseState = boundaryFiber.memoizedState,\n retryLane = 0;\n null !== suspenseState && (retryLane = suspenseState.retryLane);\n retryTimedOutBoundary(boundaryFiber, retryLane);\n}\nfunction resolveRetryWakeable(boundaryFiber, wakeable) {\n var retryLane = 0;\n switch (boundaryFiber.tag) {\n case 31:\n case 13:\n var retryCache = boundaryFiber.stateNode;\n var suspenseState = boundaryFiber.memoizedState;\n null !== suspenseState && (retryLane = suspenseState.retryLane);\n break;\n case 19:\n retryCache = boundaryFiber.stateNode;\n break;\n case 22:\n retryCache = boundaryFiber.stateNode._retryCache;\n break;\n default:\n throw Error(formatProdErrorMessage(314));\n }\n null !== retryCache && retryCache.delete(wakeable);\n retryTimedOutBoundary(boundaryFiber, retryLane);\n}\nfunction scheduleCallback$1(priorityLevel, callback) {\n return scheduleCallback$3(priorityLevel, callback);\n}\nvar firstScheduledRoot = null,\n lastScheduledRoot = null,\n didScheduleMicrotask = !1,\n mightHavePendingSyncWork = !1,\n isFlushingWork = !1,\n currentEventTransitionLane = 0;\nfunction ensureRootIsScheduled(root) {\n root !== lastScheduledRoot &&\n null === root.next &&\n (null === lastScheduledRoot\n ? (firstScheduledRoot = lastScheduledRoot = root)\n : (lastScheduledRoot = lastScheduledRoot.next = root));\n mightHavePendingSyncWork = !0;\n didScheduleMicrotask ||\n ((didScheduleMicrotask = !0), scheduleImmediateRootScheduleTask());\n}\nfunction flushSyncWorkAcrossRoots_impl(syncTransitionLanes, onlyLegacy) {\n if (!isFlushingWork && mightHavePendingSyncWork) {\n isFlushingWork = !0;\n do {\n var didPerformSomeWork = !1;\n for (var root$170 = firstScheduledRoot; null !== root$170; ) {\n if (!onlyLegacy)\n if (0 !== syncTransitionLanes) {\n var pendingLanes = root$170.pendingLanes;\n if (0 === pendingLanes) var JSCompiler_inline_result = 0;\n else {\n var suspendedLanes = root$170.suspendedLanes,\n pingedLanes = root$170.pingedLanes;\n JSCompiler_inline_result =\n (1 << (31 - clz32(42 | syncTransitionLanes) + 1)) - 1;\n JSCompiler_inline_result &=\n pendingLanes & ~(suspendedLanes & ~pingedLanes);\n JSCompiler_inline_result =\n JSCompiler_inline_result & 201326741\n ? (JSCompiler_inline_result & 201326741) | 1\n : JSCompiler_inline_result\n ? JSCompiler_inline_result | 2\n : 0;\n }\n 0 !== JSCompiler_inline_result &&\n ((didPerformSomeWork = !0),\n performSyncWorkOnRoot(root$170, JSCompiler_inline_result));\n } else\n (JSCompiler_inline_result = workInProgressRootRenderLanes),\n (JSCompiler_inline_result = getNextLanes(\n root$170,\n root$170 === workInProgressRoot ? JSCompiler_inline_result : 0,\n null !== root$170.cancelPendingCommit ||\n -1 !== root$170.timeoutHandle\n )),\n 0 === (JSCompiler_inline_result & 3) ||\n checkIfRootIsPrerendering(root$170, JSCompiler_inline_result) ||\n ((didPerformSomeWork = !0),\n performSyncWorkOnRoot(root$170, JSCompiler_inline_result));\n root$170 = root$170.next;\n }\n } while (didPerformSomeWork);\n isFlushingWork = !1;\n }\n}\nfunction processRootScheduleInImmediateTask() {\n processRootScheduleInMicrotask();\n}\nfunction processRootScheduleInMicrotask() {\n mightHavePendingSyncWork = didScheduleMicrotask = !1;\n var syncTransitionLanes = 0;\n 0 !== currentEventTransitionLane &&\n shouldAttemptEagerTransition() &&\n (syncTransitionLanes = currentEventTransitionLane);\n for (\n var currentTime = now(), prev = null, root = firstScheduledRoot;\n null !== root;\n\n ) {\n var next = root.next,\n nextLanes = scheduleTaskForRootDuringMicrotask(root, currentTime);\n if (0 === nextLanes)\n (root.next = null),\n null === prev ? (firstScheduledRoot = next) : (prev.next = next),\n null === next && (lastScheduledRoot = prev);\n else if (\n ((prev = root), 0 !== syncTransitionLanes || 0 !== (nextLanes & 3))\n )\n mightHavePendingSyncWork = !0;\n root = next;\n }\n (0 !== pendingEffectsStatus && 5 !== pendingEffectsStatus) ||\n flushSyncWorkAcrossRoots_impl(syncTransitionLanes, !1);\n 0 !== currentEventTransitionLane && (currentEventTransitionLane = 0);\n}\nfunction scheduleTaskForRootDuringMicrotask(root, currentTime) {\n for (\n var suspendedLanes = root.suspendedLanes,\n pingedLanes = root.pingedLanes,\n expirationTimes = root.expirationTimes,\n lanes = root.pendingLanes & -62914561;\n 0 < lanes;\n\n ) {\n var index$5 = 31 - clz32(lanes),\n lane = 1 << index$5,\n expirationTime = expirationTimes[index$5];\n if (-1 === expirationTime) {\n if (0 === (lane & suspendedLanes) || 0 !== (lane & pingedLanes))\n expirationTimes[index$5] = computeExpirationTime(lane, currentTime);\n } else expirationTime <= currentTime && (root.expiredLanes |= lane);\n lanes &= ~lane;\n }\n currentTime = workInProgressRoot;\n suspendedLanes = workInProgressRootRenderLanes;\n suspendedLanes = getNextLanes(\n root,\n root === currentTime ? suspendedLanes : 0,\n null !== root.cancelPendingCommit || -1 !== root.timeoutHandle\n );\n pingedLanes = root.callbackNode;\n if (\n 0 === suspendedLanes ||\n (root === currentTime &&\n (2 === workInProgressSuspendedReason ||\n 9 === workInProgressSuspendedReason)) ||\n null !== root.cancelPendingCommit\n )\n return (\n null !== pingedLanes &&\n null !== pingedLanes &&\n cancelCallback$1(pingedLanes),\n (root.callbackNode = null),\n (root.callbackPriority = 0)\n );\n if (\n 0 === (suspendedLanes & 3) ||\n checkIfRootIsPrerendering(root, suspendedLanes)\n ) {\n currentTime = suspendedLanes & -suspendedLanes;\n if (currentTime === root.callbackPriority) return currentTime;\n null !== pingedLanes && cancelCallback$1(pingedLanes);\n switch (lanesToEventPriority(suspendedLanes)) {\n case 2:\n case 8:\n suspendedLanes = UserBlockingPriority;\n break;\n case 32:\n suspendedLanes = NormalPriority$1;\n break;\n case 268435456:\n suspendedLanes = IdlePriority;\n break;\n default:\n suspendedLanes = NormalPriority$1;\n }\n pingedLanes = performWorkOnRootViaSchedulerTask.bind(null, root);\n suspendedLanes = scheduleCallback$3(suspendedLanes, pingedLanes);\n root.callbackPriority = currentTime;\n root.callbackNode = suspendedLanes;\n return currentTime;\n }\n null !== pingedLanes && null !== pingedLanes && cancelCallback$1(pingedLanes);\n root.callbackPriority = 2;\n root.callbackNode = null;\n return 2;\n}\nfunction performWorkOnRootViaSchedulerTask(root, didTimeout) {\n if (0 !== pendingEffectsStatus && 5 !== pendingEffectsStatus)\n return (root.callbackNode = null), (root.callbackPriority = 0), null;\n var originalCallbackNode = root.callbackNode;\n if (flushPendingEffects() && root.callbackNode !== originalCallbackNode)\n return null;\n var workInProgressRootRenderLanes$jscomp$0 = workInProgressRootRenderLanes;\n workInProgressRootRenderLanes$jscomp$0 = getNextLanes(\n root,\n root === workInProgressRoot ? workInProgressRootRenderLanes$jscomp$0 : 0,\n null !== root.cancelPendingCommit || -1 !== root.timeoutHandle\n );\n if (0 === workInProgressRootRenderLanes$jscomp$0) return null;\n performWorkOnRoot(root, workInProgressRootRenderLanes$jscomp$0, didTimeout);\n scheduleTaskForRootDuringMicrotask(root, now());\n return null != root.callbackNode && root.callbackNode === originalCallbackNode\n ? performWorkOnRootViaSchedulerTask.bind(null, root)\n : null;\n}\nfunction performSyncWorkOnRoot(root, lanes) {\n if (flushPendingEffects()) return null;\n performWorkOnRoot(root, lanes, !0);\n}\nfunction scheduleImmediateRootScheduleTask() {\n scheduleMicrotask(function () {\n 0 !== (executionContext & 6)\n ? scheduleCallback$3(\n ImmediatePriority,\n processRootScheduleInImmediateTask\n )\n : processRootScheduleInMicrotask();\n });\n}\nfunction requestTransitionLane() {\n if (0 === currentEventTransitionLane) {\n var actionScopeLane = currentEntangledLane;\n 0 === actionScopeLane &&\n ((actionScopeLane = nextTransitionUpdateLane),\n (nextTransitionUpdateLane <<= 1),\n 0 === (nextTransitionUpdateLane & 261888) &&\n (nextTransitionUpdateLane = 256));\n currentEventTransitionLane = actionScopeLane;\n }\n return currentEventTransitionLane;\n}\nfunction coerceFormActionProp(actionProp) {\n return null == actionProp ||\n \"symbol\" === typeof actionProp ||\n \"boolean\" === typeof actionProp\n ? null\n : \"function\" === typeof actionProp\n ? actionProp\n : sanitizeURL(\"\" + actionProp);\n}\nfunction createFormDataWithSubmitter(form, submitter) {\n var temp = submitter.ownerDocument.createElement(\"input\");\n temp.name = submitter.name;\n temp.value = submitter.value;\n form.id && temp.setAttribute(\"form\", form.id);\n submitter.parentNode.insertBefore(temp, submitter);\n form = new FormData(form);\n temp.parentNode.removeChild(temp);\n return form;\n}\nfunction extractEvents$1(\n dispatchQueue,\n domEventName,\n maybeTargetInst,\n nativeEvent,\n nativeEventTarget\n) {\n if (\n \"submit\" === domEventName &&\n maybeTargetInst &&\n maybeTargetInst.stateNode === nativeEventTarget\n ) {\n var action = coerceFormActionProp(\n (nativeEventTarget[internalPropsKey] || null).action\n ),\n submitter = nativeEvent.submitter;\n submitter &&\n ((domEventName = (domEventName = submitter[internalPropsKey] || null)\n ? coerceFormActionProp(domEventName.formAction)\n : submitter.getAttribute(\"formAction\")),\n null !== domEventName && ((action = domEventName), (submitter = null)));\n var event = new SyntheticEvent(\n \"action\",\n \"action\",\n null,\n nativeEvent,\n nativeEventTarget\n );\n dispatchQueue.push({\n event: event,\n listeners: [\n {\n instance: null,\n listener: function () {\n if (nativeEvent.defaultPrevented) {\n if (0 !== currentEventTransitionLane) {\n var formData = submitter\n ? createFormDataWithSubmitter(nativeEventTarget, submitter)\n : new FormData(nativeEventTarget);\n startHostTransition(\n maybeTargetInst,\n {\n pending: !0,\n data: formData,\n method: nativeEventTarget.method,\n action: action\n },\n null,\n formData\n );\n }\n } else\n \"function\" === typeof action &&\n (event.preventDefault(),\n (formData = submitter\n ? createFormDataWithSubmitter(nativeEventTarget, submitter)\n : new FormData(nativeEventTarget)),\n startHostTransition(\n maybeTargetInst,\n {\n pending: !0,\n data: formData,\n method: nativeEventTarget.method,\n action: action\n },\n action,\n formData\n ));\n },\n currentTarget: nativeEventTarget\n }\n ]\n });\n }\n}\nfor (\n var i$jscomp$inline_1577 = 0;\n i$jscomp$inline_1577 < simpleEventPluginEvents.length;\n i$jscomp$inline_1577++\n) {\n var eventName$jscomp$inline_1578 =\n simpleEventPluginEvents[i$jscomp$inline_1577],\n domEventName$jscomp$inline_1579 =\n eventName$jscomp$inline_1578.toLowerCase(),\n capitalizedEvent$jscomp$inline_1580 =\n eventName$jscomp$inline_1578[0].toUpperCase() +\n eventName$jscomp$inline_1578.slice(1);\n registerSimpleEvent(\n domEventName$jscomp$inline_1579,\n \"on\" + capitalizedEvent$jscomp$inline_1580\n );\n}\nregisterSimpleEvent(ANIMATION_END, \"onAnimationEnd\");\nregisterSimpleEvent(ANIMATION_ITERATION, \"onAnimationIteration\");\nregisterSimpleEvent(ANIMATION_START, \"onAnimationStart\");\nregisterSimpleEvent(\"dblclick\", \"onDoubleClick\");\nregisterSimpleEvent(\"focusin\", \"onFocus\");\nregisterSimpleEvent(\"focusout\", \"onBlur\");\nregisterSimpleEvent(TRANSITION_RUN, \"onTransitionRun\");\nregisterSimpleEvent(TRANSITION_START, \"onTransitionStart\");\nregisterSimpleEvent(TRANSITION_CANCEL, \"onTransitionCancel\");\nregisterSimpleEvent(TRANSITION_END, \"onTransitionEnd\");\nregisterDirectEvent(\"onMouseEnter\", [\"mouseout\", \"mouseover\"]);\nregisterDirectEvent(\"onMouseLeave\", [\"mouseout\", \"mouseover\"]);\nregisterDirectEvent(\"onPointerEnter\", [\"pointerout\", \"pointerover\"]);\nregisterDirectEvent(\"onPointerLeave\", [\"pointerout\", \"pointerover\"]);\nregisterTwoPhaseEvent(\n \"onChange\",\n \"change click focusin focusout input keydown keyup selectionchange\".split(\" \")\n);\nregisterTwoPhaseEvent(\n \"onSelect\",\n \"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\n \" \"\n )\n);\nregisterTwoPhaseEvent(\"onBeforeInput\", [\n \"compositionend\",\n \"keypress\",\n \"textInput\",\n \"paste\"\n]);\nregisterTwoPhaseEvent(\n \"onCompositionEnd\",\n \"compositionend focusout keydown keypress keyup mousedown\".split(\" \")\n);\nregisterTwoPhaseEvent(\n \"onCompositionStart\",\n \"compositionstart focusout keydown keypress keyup mousedown\".split(\" \")\n);\nregisterTwoPhaseEvent(\n \"onCompositionUpdate\",\n \"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \")\n);\nvar mediaEventTypes =\n \"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\n \" \"\n ),\n nonDelegatedEvents = new Set(\n \"beforetoggle cancel close invalid load scroll scrollend toggle\"\n .split(\" \")\n .concat(mediaEventTypes)\n );\nfunction processDispatchQueue(dispatchQueue, eventSystemFlags) {\n eventSystemFlags = 0 !== (eventSystemFlags & 4);\n for (var i = 0; i < dispatchQueue.length; i++) {\n var _dispatchQueue$i = dispatchQueue[i],\n event = _dispatchQueue$i.event;\n _dispatchQueue$i = _dispatchQueue$i.listeners;\n a: {\n var previousInstance = void 0;\n if (eventSystemFlags)\n for (\n var i$jscomp$0 = _dispatchQueue$i.length - 1;\n 0 <= i$jscomp$0;\n i$jscomp$0--\n ) {\n var _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0],\n instance = _dispatchListeners$i.instance,\n currentTarget = _dispatchListeners$i.currentTarget;\n _dispatchListeners$i = _dispatchListeners$i.listener;\n if (instance !== previousInstance && event.isPropagationStopped())\n break a;\n previousInstance = _dispatchListeners$i;\n event.currentTarget = currentTarget;\n try {\n previousInstance(event);\n } catch (error) {\n reportGlobalError(error);\n }\n event.currentTarget = null;\n previousInstance = instance;\n }\n else\n for (\n i$jscomp$0 = 0;\n i$jscomp$0 < _dispatchQueue$i.length;\n i$jscomp$0++\n ) {\n _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0];\n instance = _dispatchListeners$i.instance;\n currentTarget = _dispatchListeners$i.currentTarget;\n _dispatchListeners$i = _dispatchListeners$i.listener;\n if (instance !== previousInstance && event.isPropagationStopped())\n break a;\n previousInstance = _dispatchListeners$i;\n event.currentTarget = currentTarget;\n try {\n previousInstance(event);\n } catch (error) {\n reportGlobalError(error);\n }\n event.currentTarget = null;\n previousInstance = instance;\n }\n }\n }\n}\nfunction listenToNonDelegatedEvent(domEventName, targetElement) {\n var JSCompiler_inline_result = targetElement[internalEventHandlersKey];\n void 0 === JSCompiler_inline_result &&\n (JSCompiler_inline_result = targetElement[internalEventHandlersKey] =\n new Set());\n var listenerSetKey = domEventName + \"__bubble\";\n JSCompiler_inline_result.has(listenerSetKey) ||\n (addTrappedEventListener(targetElement, domEventName, 2, !1),\n JSCompiler_inline_result.add(listenerSetKey));\n}\nfunction listenToNativeEvent(domEventName, isCapturePhaseListener, target) {\n var eventSystemFlags = 0;\n isCapturePhaseListener && (eventSystemFlags |= 4);\n addTrappedEventListener(\n target,\n domEventName,\n eventSystemFlags,\n isCapturePhaseListener\n );\n}\nvar listeningMarker = \"_reactListening\" + Math.random().toString(36).slice(2);\nfunction listenToAllSupportedEvents(rootContainerElement) {\n if (!rootContainerElement[listeningMarker]) {\n rootContainerElement[listeningMarker] = !0;\n allNativeEvents.forEach(function (domEventName) {\n \"selectionchange\" !== domEventName &&\n (nonDelegatedEvents.has(domEventName) ||\n listenToNativeEvent(domEventName, !1, rootContainerElement),\n listenToNativeEvent(domEventName, !0, rootContainerElement));\n });\n var ownerDocument =\n 9 === rootContainerElement.nodeType\n ? rootContainerElement\n : rootContainerElement.ownerDocument;\n null === ownerDocument ||\n ownerDocument[listeningMarker] ||\n ((ownerDocument[listeningMarker] = !0),\n listenToNativeEvent(\"selectionchange\", !1, ownerDocument));\n }\n}\nfunction addTrappedEventListener(\n targetContainer,\n domEventName,\n eventSystemFlags,\n isCapturePhaseListener\n) {\n switch (getEventPriority(domEventName)) {\n case 2:\n var listenerWrapper = dispatchDiscreteEvent;\n break;\n case 8:\n listenerWrapper = dispatchContinuousEvent;\n break;\n default:\n listenerWrapper = dispatchEvent;\n }\n eventSystemFlags = listenerWrapper.bind(\n null,\n domEventName,\n eventSystemFlags,\n targetContainer\n );\n listenerWrapper = void 0;\n !passiveBrowserEventsSupported ||\n (\"touchstart\" !== domEventName &&\n \"touchmove\" !== domEventName &&\n \"wheel\" !== domEventName) ||\n (listenerWrapper = !0);\n isCapturePhaseListener\n ? void 0 !== listenerWrapper\n ? targetContainer.addEventListener(domEventName, eventSystemFlags, {\n capture: !0,\n passive: listenerWrapper\n })\n : targetContainer.addEventListener(domEventName, eventSystemFlags, !0)\n : void 0 !== listenerWrapper\n ? targetContainer.addEventListener(domEventName, eventSystemFlags, {\n passive: listenerWrapper\n })\n : targetContainer.addEventListener(domEventName, eventSystemFlags, !1);\n}\nfunction dispatchEventForPluginEventSystem(\n domEventName,\n eventSystemFlags,\n nativeEvent,\n targetInst$jscomp$0,\n targetContainer\n) {\n var ancestorInst = targetInst$jscomp$0;\n if (\n 0 === (eventSystemFlags & 1) &&\n 0 === (eventSystemFlags & 2) &&\n null !== targetInst$jscomp$0\n )\n a: for (;;) {\n if (null === targetInst$jscomp$0) return;\n var nodeTag = targetInst$jscomp$0.tag;\n if (3 === nodeTag || 4 === nodeTag) {\n var container = targetInst$jscomp$0.stateNode.containerInfo;\n if (container === targetContainer) break;\n if (4 === nodeTag)\n for (nodeTag = targetInst$jscomp$0.return; null !== nodeTag; ) {\n var grandTag = nodeTag.tag;\n if (\n (3 === grandTag || 4 === grandTag) &&\n nodeTag.stateNode.containerInfo === targetContainer\n )\n return;\n nodeTag = nodeTag.return;\n }\n for (; null !== container; ) {\n nodeTag = getClosestInstanceFromNode(container);\n if (null === nodeTag) return;\n grandTag = nodeTag.tag;\n if (\n 5 === grandTag ||\n 6 === grandTag ||\n 26 === grandTag ||\n 27 === grandTag\n ) {\n targetInst$jscomp$0 = ancestorInst = nodeTag;\n continue a;\n }\n container = container.parentNode;\n }\n }\n targetInst$jscomp$0 = targetInst$jscomp$0.return;\n }\n batchedUpdates$1(function () {\n var targetInst = ancestorInst,\n nativeEventTarget = getEventTarget(nativeEvent),\n dispatchQueue = [];\n a: {\n var reactName = topLevelEventsToReactNames.get(domEventName);\n if (void 0 !== reactName) {\n var SyntheticEventCtor = SyntheticEvent,\n reactEventType = domEventName;\n switch (domEventName) {\n case \"keypress\":\n if (0 === getEventCharCode(nativeEvent)) break a;\n case \"keydown\":\n case \"keyup\":\n SyntheticEventCtor = SyntheticKeyboardEvent;\n break;\n case \"focusin\":\n reactEventType = \"focus\";\n SyntheticEventCtor = SyntheticFocusEvent;\n break;\n case \"focusout\":\n reactEventType = \"blur\";\n SyntheticEventCtor = SyntheticFocusEvent;\n break;\n case \"beforeblur\":\n case \"afterblur\":\n SyntheticEventCtor = SyntheticFocusEvent;\n break;\n case \"click\":\n if (2 === nativeEvent.button) break a;\n case \"auxclick\":\n case \"dblclick\":\n case \"mousedown\":\n case \"mousemove\":\n case \"mouseup\":\n case \"mouseout\":\n case \"mouseover\":\n case \"contextmenu\":\n SyntheticEventCtor = SyntheticMouseEvent;\n break;\n case \"drag\":\n case \"dragend\":\n case \"dragenter\":\n case \"dragexit\":\n case \"dragleave\":\n case \"dragover\":\n case \"dragstart\":\n case \"drop\":\n SyntheticEventCtor = SyntheticDragEvent;\n break;\n case \"touchcancel\":\n case \"touchend\":\n case \"touchmove\":\n case \"touchstart\":\n SyntheticEventCtor = SyntheticTouchEvent;\n break;\n case ANIMATION_END:\n case ANIMATION_ITERATION:\n case ANIMATION_START:\n SyntheticEventCtor = SyntheticAnimationEvent;\n break;\n case TRANSITION_END:\n SyntheticEventCtor = SyntheticTransitionEvent;\n break;\n case \"scroll\":\n case \"scrollend\":\n SyntheticEventCtor = SyntheticUIEvent;\n break;\n case \"wheel\":\n SyntheticEventCtor = SyntheticWheelEvent;\n break;\n case \"copy\":\n case \"cut\":\n case \"paste\":\n SyntheticEventCtor = SyntheticClipboardEvent;\n break;\n case \"gotpointercapture\":\n case \"lostpointercapture\":\n case \"pointercancel\":\n case \"pointerdown\":\n case \"pointermove\":\n case \"pointerout\":\n case \"pointerover\":\n case \"pointerup\":\n SyntheticEventCtor = SyntheticPointerEvent;\n break;\n case \"toggle\":\n case \"beforetoggle\":\n SyntheticEventCtor = SyntheticToggleEvent;\n }\n var inCapturePhase = 0 !== (eventSystemFlags & 4),\n accumulateTargetOnly =\n !inCapturePhase &&\n (\"scroll\" === domEventName || \"scrollend\" === domEventName),\n reactEventName = inCapturePhase\n ? null !== reactName\n ? reactName + \"Capture\"\n : null\n : reactName;\n inCapturePhase = [];\n for (\n var instance = targetInst, lastHostComponent;\n null !== instance;\n\n ) {\n var _instance = instance;\n lastHostComponent = _instance.stateNode;\n _instance = _instance.tag;\n (5 !== _instance && 26 !== _instance && 27 !== _instance) ||\n null === lastHostComponent ||\n null === reactEventName ||\n ((_instance = getListener(instance, reactEventName)),\n null != _instance &&\n inCapturePhase.push(\n createDispatchListener(instance, _instance, lastHostComponent)\n ));\n if (accumulateTargetOnly) break;\n instance = instance.return;\n }\n 0 < inCapturePhase.length &&\n ((reactName = new SyntheticEventCtor(\n reactName,\n reactEventType,\n null,\n nativeEvent,\n nativeEventTarget\n )),\n dispatchQueue.push({ event: reactName, listeners: inCapturePhase }));\n }\n }\n if (0 === (eventSystemFlags & 7)) {\n a: {\n reactName =\n \"mouseover\" === domEventName || \"pointerover\" === domEventName;\n SyntheticEventCtor =\n \"mouseout\" === domEventName || \"pointerout\" === domEventName;\n if (\n reactName &&\n nativeEvent !== currentReplayingEvent &&\n (reactEventType =\n nativeEvent.relatedTarget || nativeEvent.fromElement) &&\n (getClosestInstanceFromNode(reactEventType) ||\n reactEventType[internalContainerInstanceKey])\n )\n break a;\n if (SyntheticEventCtor || reactName) {\n reactName =\n nativeEventTarget.window === nativeEventTarget\n ? nativeEventTarget\n : (reactName = nativeEventTarget.ownerDocument)\n ? reactName.defaultView || reactName.parentWindow\n : window;\n if (SyntheticEventCtor) {\n if (\n ((reactEventType =\n nativeEvent.relatedTarget || nativeEvent.toElement),\n (SyntheticEventCtor = targetInst),\n (reactEventType = reactEventType\n ? getClosestInstanceFromNode(reactEventType)\n : null),\n null !== reactEventType &&\n ((accumulateTargetOnly =\n getNearestMountedFiber(reactEventType)),\n (inCapturePhase = reactEventType.tag),\n reactEventType !== accumulateTargetOnly ||\n (5 !== inCapturePhase &&\n 27 !== inCapturePhase &&\n 6 !== inCapturePhase)))\n )\n reactEventType = null;\n } else (SyntheticEventCtor = null), (reactEventType = targetInst);\n if (SyntheticEventCtor !== reactEventType) {\n inCapturePhase = SyntheticMouseEvent;\n _instance = \"onMouseLeave\";\n reactEventName = \"onMouseEnter\";\n instance = \"mouse\";\n if (\"pointerout\" === domEventName || \"pointerover\" === domEventName)\n (inCapturePhase = SyntheticPointerEvent),\n (_instance = \"onPointerLeave\"),\n (reactEventName = \"onPointerEnter\"),\n (instance = \"pointer\");\n accumulateTargetOnly =\n null == SyntheticEventCtor\n ? reactName\n : getNodeFromInstance(SyntheticEventCtor);\n lastHostComponent =\n null == reactEventType\n ? reactName\n : getNodeFromInstance(reactEventType);\n reactName = new inCapturePhase(\n _instance,\n instance + \"leave\",\n SyntheticEventCtor,\n nativeEvent,\n nativeEventTarget\n );\n reactName.target = accumulateTargetOnly;\n reactName.relatedTarget = lastHostComponent;\n _instance = null;\n getClosestInstanceFromNode(nativeEventTarget) === targetInst &&\n ((inCapturePhase = new inCapturePhase(\n reactEventName,\n instance + \"enter\",\n reactEventType,\n nativeEvent,\n nativeEventTarget\n )),\n (inCapturePhase.target = lastHostComponent),\n (inCapturePhase.relatedTarget = accumulateTargetOnly),\n (_instance = inCapturePhase));\n accumulateTargetOnly = _instance;\n if (SyntheticEventCtor && reactEventType)\n b: {\n inCapturePhase = getParent;\n reactEventName = SyntheticEventCtor;\n instance = reactEventType;\n lastHostComponent = 0;\n for (\n _instance = reactEventName;\n _instance;\n _instance = inCapturePhase(_instance)\n )\n lastHostComponent++;\n _instance = 0;\n for (var tempB = instance; tempB; tempB = inCapturePhase(tempB))\n _instance++;\n for (; 0 < lastHostComponent - _instance; )\n (reactEventName = inCapturePhase(reactEventName)),\n lastHostComponent--;\n for (; 0 < _instance - lastHostComponent; )\n (instance = inCapturePhase(instance)), _instance--;\n for (; lastHostComponent--; ) {\n if (\n reactEventName === instance ||\n (null !== instance && reactEventName === instance.alternate)\n ) {\n inCapturePhase = reactEventName;\n break b;\n }\n reactEventName = inCapturePhase(reactEventName);\n instance = inCapturePhase(instance);\n }\n inCapturePhase = null;\n }\n else inCapturePhase = null;\n null !== SyntheticEventCtor &&\n accumulateEnterLeaveListenersForEvent(\n dispatchQueue,\n reactName,\n SyntheticEventCtor,\n inCapturePhase,\n !1\n );\n null !== reactEventType &&\n null !== accumulateTargetOnly &&\n accumulateEnterLeaveListenersForEvent(\n dispatchQueue,\n accumulateTargetOnly,\n reactEventType,\n inCapturePhase,\n !0\n );\n }\n }\n }\n a: {\n reactName = targetInst ? getNodeFromInstance(targetInst) : window;\n SyntheticEventCtor =\n reactName.nodeName && reactName.nodeName.toLowerCase();\n if (\n \"select\" === SyntheticEventCtor ||\n (\"input\" === SyntheticEventCtor && \"file\" === reactName.type)\n )\n var getTargetInstFunc = getTargetInstForChangeEvent;\n else if (isTextInputElement(reactName))\n if (isInputEventSupported)\n getTargetInstFunc = getTargetInstForInputOrChangeEvent;\n else {\n getTargetInstFunc = getTargetInstForInputEventPolyfill;\n var handleEventFunc = handleEventsForInputEventPolyfill;\n }\n else\n (SyntheticEventCtor = reactName.nodeName),\n !SyntheticEventCtor ||\n \"input\" !== SyntheticEventCtor.toLowerCase() ||\n (\"checkbox\" !== reactName.type && \"radio\" !== reactName.type)\n ? targetInst &&\n isCustomElement(targetInst.elementType) &&\n (getTargetInstFunc = getTargetInstForChangeEvent)\n : (getTargetInstFunc = getTargetInstForClickEvent);\n if (\n getTargetInstFunc &&\n (getTargetInstFunc = getTargetInstFunc(domEventName, targetInst))\n ) {\n createAndAccumulateChangeEvent(\n dispatchQueue,\n getTargetInstFunc,\n nativeEvent,\n nativeEventTarget\n );\n break a;\n }\n handleEventFunc && handleEventFunc(domEventName, reactName, targetInst);\n \"focusout\" === domEventName &&\n targetInst &&\n \"number\" === reactName.type &&\n null != targetInst.memoizedProps.value &&\n setDefaultValue(reactName, \"number\", reactName.value);\n }\n handleEventFunc = targetInst ? getNodeFromInstance(targetInst) : window;\n switch (domEventName) {\n case \"focusin\":\n if (\n isTextInputElement(handleEventFunc) ||\n \"true\" === handleEventFunc.contentEditable\n )\n (activeElement = handleEventFunc),\n (activeElementInst = targetInst),\n (lastSelection = null);\n break;\n case \"focusout\":\n lastSelection = activeElementInst = activeElement = null;\n break;\n case \"mousedown\":\n mouseDown = !0;\n break;\n case \"contextmenu\":\n case \"mouseup\":\n case \"dragend\":\n mouseDown = !1;\n constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);\n break;\n case \"selectionchange\":\n if (skipSelectionChangeEvent) break;\n case \"keydown\":\n case \"keyup\":\n constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);\n }\n var fallbackData;\n if (canUseCompositionEvent)\n b: {\n switch (domEventName) {\n case \"compositionstart\":\n var eventType = \"onCompositionStart\";\n break b;\n case \"compositionend\":\n eventType = \"onCompositionEnd\";\n break b;\n case \"compositionupdate\":\n eventType = \"onCompositionUpdate\";\n break b;\n }\n eventType = void 0;\n }\n else\n isComposing\n ? isFallbackCompositionEnd(domEventName, nativeEvent) &&\n (eventType = \"onCompositionEnd\")\n : \"keydown\" === domEventName &&\n 229 === nativeEvent.keyCode &&\n (eventType = \"onCompositionStart\");\n eventType &&\n (useFallbackCompositionData &&\n \"ko\" !== nativeEvent.locale &&\n (isComposing || \"onCompositionStart\" !== eventType\n ? \"onCompositionEnd\" === eventType &&\n isComposing &&\n (fallbackData = getData())\n : ((root = nativeEventTarget),\n (startText = \"value\" in root ? root.value : root.textContent),\n (isComposing = !0))),\n (handleEventFunc = accumulateTwoPhaseListeners(targetInst, eventType)),\n 0 < handleEventFunc.length &&\n ((eventType = new SyntheticCompositionEvent(\n eventType,\n domEventName,\n null,\n nativeEvent,\n nativeEventTarget\n )),\n dispatchQueue.push({ event: eventType, listeners: handleEventFunc }),\n fallbackData\n ? (eventType.data = fallbackData)\n : ((fallbackData = getDataFromCustomEvent(nativeEvent)),\n null !== fallbackData && (eventType.data = fallbackData))));\n if (\n (fallbackData = canUseTextInputEvent\n ? getNativeBeforeInputChars(domEventName, nativeEvent)\n : getFallbackBeforeInputChars(domEventName, nativeEvent))\n )\n (eventType = accumulateTwoPhaseListeners(targetInst, \"onBeforeInput\")),\n 0 < eventType.length &&\n ((handleEventFunc = new SyntheticCompositionEvent(\n \"onBeforeInput\",\n \"beforeinput\",\n null,\n nativeEvent,\n nativeEventTarget\n )),\n dispatchQueue.push({\n event: handleEventFunc,\n listeners: eventType\n }),\n (handleEventFunc.data = fallbackData));\n extractEvents$1(\n dispatchQueue,\n domEventName,\n targetInst,\n nativeEvent,\n nativeEventTarget\n );\n }\n processDispatchQueue(dispatchQueue, eventSystemFlags);\n });\n}\nfunction createDispatchListener(instance, listener, currentTarget) {\n return {\n instance: instance,\n listener: listener,\n currentTarget: currentTarget\n };\n}\nfunction accumulateTwoPhaseListeners(targetFiber, reactName) {\n for (\n var captureName = reactName + \"Capture\", listeners = [];\n null !== targetFiber;\n\n ) {\n var _instance2 = targetFiber,\n stateNode = _instance2.stateNode;\n _instance2 = _instance2.tag;\n (5 !== _instance2 && 26 !== _instance2 && 27 !== _instance2) ||\n null === stateNode ||\n ((_instance2 = getListener(targetFiber, captureName)),\n null != _instance2 &&\n listeners.unshift(\n createDispatchListener(targetFiber, _instance2, stateNode)\n ),\n (_instance2 = getListener(targetFiber, reactName)),\n null != _instance2 &&\n listeners.push(\n createDispatchListener(targetFiber, _instance2, stateNode)\n ));\n if (3 === targetFiber.tag) return listeners;\n targetFiber = targetFiber.return;\n }\n return [];\n}\nfunction getParent(inst) {\n if (null === inst) return null;\n do inst = inst.return;\n while (inst && 5 !== inst.tag && 27 !== inst.tag);\n return inst ? inst : null;\n}\nfunction accumulateEnterLeaveListenersForEvent(\n dispatchQueue,\n event,\n target,\n common,\n inCapturePhase\n) {\n for (\n var registrationName = event._reactName, listeners = [];\n null !== target && target !== common;\n\n ) {\n var _instance3 = target,\n alternate = _instance3.alternate,\n stateNode = _instance3.stateNode;\n _instance3 = _instance3.tag;\n if (null !== alternate && alternate === common) break;\n (5 !== _instance3 && 26 !== _instance3 && 27 !== _instance3) ||\n null === stateNode ||\n ((alternate = stateNode),\n inCapturePhase\n ? ((stateNode = getListener(target, registrationName)),\n null != stateNode &&\n listeners.unshift(\n createDispatchListener(target, stateNode, alternate)\n ))\n : inCapturePhase ||\n ((stateNode = getListener(target, registrationName)),\n null != stateNode &&\n listeners.push(\n createDispatchListener(target, stateNode, alternate)\n )));\n target = target.return;\n }\n 0 !== listeners.length &&\n dispatchQueue.push({ event: event, listeners: listeners });\n}\nvar NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g,\n NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\nfunction normalizeMarkupForTextOrAttribute(markup) {\n return (\"string\" === typeof markup ? markup : \"\" + markup)\n .replace(NORMALIZE_NEWLINES_REGEX, \"\\n\")\n .replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, \"\");\n}\nfunction checkForUnmatchedText(serverText, clientText) {\n clientText = normalizeMarkupForTextOrAttribute(clientText);\n return normalizeMarkupForTextOrAttribute(serverText) === clientText ? !0 : !1;\n}\nfunction setProp(domElement, tag, key, value, props, prevValue) {\n switch (key) {\n case \"children\":\n \"string\" === typeof value\n ? \"body\" === tag ||\n (\"textarea\" === tag && \"\" === value) ||\n setTextContent(domElement, value)\n : (\"number\" === typeof value || \"bigint\" === typeof value) &&\n \"body\" !== tag &&\n setTextContent(domElement, \"\" + value);\n break;\n case \"className\":\n setValueForKnownAttribute(domElement, \"class\", value);\n break;\n case \"tabIndex\":\n setValueForKnownAttribute(domElement, \"tabindex\", value);\n break;\n case \"dir\":\n case \"role\":\n case \"viewBox\":\n case \"width\":\n case \"height\":\n setValueForKnownAttribute(domElement, key, value);\n break;\n case \"style\":\n setValueForStyles(domElement, value, prevValue);\n break;\n case \"data\":\n if (\"object\" !== tag) {\n setValueForKnownAttribute(domElement, \"data\", value);\n break;\n }\n case \"src\":\n case \"href\":\n if (\"\" === value && (\"a\" !== tag || \"href\" !== key)) {\n domElement.removeAttribute(key);\n break;\n }\n if (\n null == value ||\n \"function\" === typeof value ||\n \"symbol\" === typeof value ||\n \"boolean\" === typeof value\n ) {\n domElement.removeAttribute(key);\n break;\n }\n value = sanitizeURL(\"\" + value);\n domElement.setAttribute(key, value);\n break;\n case \"action\":\n case \"formAction\":\n if (\"function\" === typeof value) {\n domElement.setAttribute(\n key,\n \"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')\"\n );\n break;\n } else\n \"function\" === typeof prevValue &&\n (\"formAction\" === key\n ? (\"input\" !== tag &&\n setProp(domElement, tag, \"name\", props.name, props, null),\n setProp(\n domElement,\n tag,\n \"formEncType\",\n props.formEncType,\n props,\n null\n ),\n setProp(\n domElement,\n tag,\n \"formMethod\",\n props.formMethod,\n props,\n null\n ),\n setProp(\n domElement,\n tag,\n \"formTarget\",\n props.formTarget,\n props,\n null\n ))\n : (setProp(domElement, tag, \"encType\", props.encType, props, null),\n setProp(domElement, tag, \"method\", props.method, props, null),\n setProp(domElement, tag, \"target\", props.target, props, null)));\n if (\n null == value ||\n \"symbol\" === typeof value ||\n \"boolean\" === typeof value\n ) {\n domElement.removeAttribute(key);\n break;\n }\n value = sanitizeURL(\"\" + value);\n domElement.setAttribute(key, value);\n break;\n case \"onClick\":\n null != value && (domElement.onclick = noop$1);\n break;\n case \"onScroll\":\n null != value && listenToNonDelegatedEvent(\"scroll\", domElement);\n break;\n case \"onScrollEnd\":\n null != value && listenToNonDelegatedEvent(\"scrollend\", domElement);\n break;\n case \"dangerouslySetInnerHTML\":\n if (null != value) {\n if (\"object\" !== typeof value || !(\"__html\" in value))\n throw Error(formatProdErrorMessage(61));\n key = value.__html;\n if (null != key) {\n if (null != props.children) throw Error(formatProdErrorMessage(60));\n domElement.innerHTML = key;\n }\n }\n break;\n case \"multiple\":\n domElement.multiple =\n value && \"function\" !== typeof value && \"symbol\" !== typeof value;\n break;\n case \"muted\":\n domElement.muted =\n value && \"function\" !== typeof value && \"symbol\" !== typeof value;\n break;\n case \"suppressContentEditableWarning\":\n case \"suppressHydrationWarning\":\n case \"defaultValue\":\n case \"defaultChecked\":\n case \"innerHTML\":\n case \"ref\":\n break;\n case \"autoFocus\":\n break;\n case \"xlinkHref\":\n if (\n null == value ||\n \"function\" === typeof value ||\n \"boolean\" === typeof value ||\n \"symbol\" === typeof value\n ) {\n domElement.removeAttribute(\"xlink:href\");\n break;\n }\n key = sanitizeURL(\"\" + value);\n domElement.setAttributeNS(\n \"http://www.w3.org/1999/xlink\",\n \"xlink:href\",\n key\n );\n break;\n case \"contentEditable\":\n case \"spellCheck\":\n case \"draggable\":\n case \"value\":\n case \"autoReverse\":\n case \"externalResourcesRequired\":\n case \"focusable\":\n case \"preserveAlpha\":\n null != value && \"function\" !== typeof value && \"symbol\" !== typeof value\n ? domElement.setAttribute(key, \"\" + value)\n : domElement.removeAttribute(key);\n break;\n case \"inert\":\n case \"allowFullScreen\":\n case \"async\":\n case \"autoPlay\":\n case \"controls\":\n case \"default\":\n case \"defer\":\n case \"disabled\":\n case \"disablePictureInPicture\":\n case \"disableRemotePlayback\":\n case \"formNoValidate\":\n case \"hidden\":\n case \"loop\":\n case \"noModule\":\n case \"noValidate\":\n case \"open\":\n case \"playsInline\":\n case \"readOnly\":\n case \"required\":\n case \"reversed\":\n case \"scoped\":\n case \"seamless\":\n case \"itemScope\":\n value && \"function\" !== typeof value && \"symbol\" !== typeof value\n ? domElement.setAttribute(key, \"\")\n : domElement.removeAttribute(key);\n break;\n case \"capture\":\n case \"download\":\n !0 === value\n ? domElement.setAttribute(key, \"\")\n : !1 !== value &&\n null != value &&\n \"function\" !== typeof value &&\n \"symbol\" !== typeof value\n ? domElement.setAttribute(key, value)\n : domElement.removeAttribute(key);\n break;\n case \"cols\":\n case \"rows\":\n case \"size\":\n case \"span\":\n null != value &&\n \"function\" !== typeof value &&\n \"symbol\" !== typeof value &&\n !isNaN(value) &&\n 1 <= value\n ? domElement.setAttribute(key, value)\n : domElement.removeAttribute(key);\n break;\n case \"rowSpan\":\n case \"start\":\n null == value ||\n \"function\" === typeof value ||\n \"symbol\" === typeof value ||\n isNaN(value)\n ? domElement.removeAttribute(key)\n : domElement.setAttribute(key, value);\n break;\n case \"popover\":\n listenToNonDelegatedEvent(\"beforetoggle\", domElement);\n listenToNonDelegatedEvent(\"toggle\", domElement);\n setValueForAttribute(domElement, \"popover\", value);\n break;\n case \"xlinkActuate\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/1999/xlink\",\n \"xlink:actuate\",\n value\n );\n break;\n case \"xlinkArcrole\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/1999/xlink\",\n \"xlink:arcrole\",\n value\n );\n break;\n case \"xlinkRole\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/1999/xlink\",\n \"xlink:role\",\n value\n );\n break;\n case \"xlinkShow\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/1999/xlink\",\n \"xlink:show\",\n value\n );\n break;\n case \"xlinkTitle\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/1999/xlink\",\n \"xlink:title\",\n value\n );\n break;\n case \"xlinkType\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/1999/xlink\",\n \"xlink:type\",\n value\n );\n break;\n case \"xmlBase\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/XML/1998/namespace\",\n \"xml:base\",\n value\n );\n break;\n case \"xmlLang\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/XML/1998/namespace\",\n \"xml:lang\",\n value\n );\n break;\n case \"xmlSpace\":\n setValueForNamespacedAttribute(\n domElement,\n \"http://www.w3.org/XML/1998/namespace\",\n \"xml:space\",\n value\n );\n break;\n case \"is\":\n setValueForAttribute(domElement, \"is\", value);\n break;\n case \"innerText\":\n case \"textContent\":\n break;\n default:\n if (\n !(2 < key.length) ||\n (\"o\" !== key[0] && \"O\" !== key[0]) ||\n (\"n\" !== key[1] && \"N\" !== key[1])\n )\n (key = aliases.get(key) || key),\n setValueForAttribute(domElement, key, value);\n }\n}\nfunction setPropOnCustomElement(domElement, tag, key, value, props, prevValue) {\n switch (key) {\n case \"style\":\n setValueForStyles(domElement, value, prevValue);\n break;\n case \"dangerouslySetInnerHTML\":\n if (null != value) {\n if (\"object\" !== typeof value || !(\"__html\" in value))\n throw Error(formatProdErrorMessage(61));\n key = value.__html;\n if (null != key) {\n if (null != props.children) throw Error(formatProdErrorMessage(60));\n domElement.innerHTML = key;\n }\n }\n break;\n case \"children\":\n \"string\" === typeof value\n ? setTextContent(domElement, value)\n : (\"number\" === typeof value || \"bigint\" === typeof value) &&\n setTextContent(domElement, \"\" + value);\n break;\n case \"onScroll\":\n null != value && listenToNonDelegatedEvent(\"scroll\", domElement);\n break;\n case \"onScrollEnd\":\n null != value && listenToNonDelegatedEvent(\"scrollend\", domElement);\n break;\n case \"onClick\":\n null != value && (domElement.onclick = noop$1);\n break;\n case \"suppressContentEditableWarning\":\n case \"suppressHydrationWarning\":\n case \"innerHTML\":\n case \"ref\":\n break;\n case \"innerText\":\n case \"textContent\":\n break;\n default:\n if (!registrationNameDependencies.hasOwnProperty(key))\n a: {\n if (\n \"o\" === key[0] &&\n \"n\" === key[1] &&\n ((props = key.endsWith(\"Capture\")),\n (tag = key.slice(2, props ? key.length - 7 : void 0)),\n (prevValue = domElement[internalPropsKey] || null),\n (prevValue = null != prevValue ? prevValue[key] : null),\n \"function\" === typeof prevValue &&\n domElement.removeEventListener(tag, prevValue, props),\n \"function\" === typeof value)\n ) {\n \"function\" !== typeof prevValue &&\n null !== prevValue &&\n (key in domElement\n ? (domElement[key] = null)\n : domElement.hasAttribute(key) &&\n domElement.removeAttribute(key));\n domElement.addEventListener(tag, value, props);\n break a;\n }\n key in domElement\n ? (domElement[key] = value)\n : !0 === value\n ? domElement.setAttribute(key, \"\")\n : setValueForAttribute(domElement, key, value);\n }\n }\n}\nfunction setInitialProperties(domElement, tag, props) {\n switch (tag) {\n case \"div\":\n case \"span\":\n case \"svg\":\n case \"path\":\n case \"a\":\n case \"g\":\n case \"p\":\n case \"li\":\n break;\n case \"img\":\n listenToNonDelegatedEvent(\"error\", domElement);\n listenToNonDelegatedEvent(\"load\", domElement);\n var hasSrc = !1,\n hasSrcSet = !1,\n propKey;\n for (propKey in props)\n if (props.hasOwnProperty(propKey)) {\n var propValue = props[propKey];\n if (null != propValue)\n switch (propKey) {\n case \"src\":\n hasSrc = !0;\n break;\n case \"srcSet\":\n hasSrcSet = !0;\n break;\n case \"children\":\n case \"dangerouslySetInnerHTML\":\n throw Error(formatProdErrorMessage(137, tag));\n default:\n setProp(domElement, tag, propKey, propValue, props, null);\n }\n }\n hasSrcSet &&\n setProp(domElement, tag, \"srcSet\", props.srcSet, props, null);\n hasSrc && setProp(domElement, tag, \"src\", props.src, props, null);\n return;\n case \"input\":\n listenToNonDelegatedEvent(\"invalid\", domElement);\n var defaultValue = (propKey = propValue = hasSrcSet = null),\n checked = null,\n defaultChecked = null;\n for (hasSrc in props)\n if (props.hasOwnProperty(hasSrc)) {\n var propValue$184 = props[hasSrc];\n if (null != propValue$184)\n switch (hasSrc) {\n case \"name\":\n hasSrcSet = propValue$184;\n break;\n case \"type\":\n propValue = propValue$184;\n break;\n case \"checked\":\n checked = propValue$184;\n break;\n case \"defaultChecked\":\n defaultChecked = propValue$184;\n break;\n case \"value\":\n propKey = propValue$184;\n break;\n case \"defaultValue\":\n defaultValue = propValue$184;\n break;\n case \"children\":\n case \"dangerouslySetInnerHTML\":\n if (null != propValue$184)\n throw Error(formatProdErrorMessage(137, tag));\n break;\n default:\n setProp(domElement, tag, hasSrc, propValue$184, props, null);\n }\n }\n initInput(\n domElement,\n propKey,\n defaultValue,\n checked,\n defaultChecked,\n propValue,\n hasSrcSet,\n !1\n );\n return;\n case \"select\":\n listenToNonDelegatedEvent(\"invalid\", domElement);\n hasSrc = propValue = propKey = null;\n for (hasSrcSet in props)\n if (\n props.hasOwnProperty(hasSrcSet) &&\n ((defaultValue = props[hasSrcSet]), null != defaultValue)\n )\n switch (hasSrcSet) {\n case \"value\":\n propKey = defaultValue;\n break;\n case \"defaultValue\":\n propValue = defaultValue;\n break;\n case \"multiple\":\n hasSrc = defaultValue;\n default:\n setProp(domElement, tag, hasSrcSet, defaultValue, props, null);\n }\n tag = propKey;\n props = propValue;\n domElement.multiple = !!hasSrc;\n null != tag\n ? updateOptions(domElement, !!hasSrc, tag, !1)\n : null != props && updateOptions(domElement, !!hasSrc, props, !0);\n return;\n case \"textarea\":\n listenToNonDelegatedEvent(\"invalid\", domElement);\n propKey = hasSrcSet = hasSrc = null;\n for (propValue in props)\n if (\n props.hasOwnProperty(propValue) &&\n ((defaultValue = props[propValue]), null != defaultValue)\n )\n switch (propValue) {\n case \"value\":\n hasSrc = defaultValue;\n break;\n case \"defaultValue\":\n hasSrcSet = defaultValue;\n break;\n case \"children\":\n propKey = defaultValue;\n break;\n case \"dangerouslySetInnerHTML\":\n if (null != defaultValue) throw Error(formatProdErrorMessage(91));\n break;\n default:\n setProp(domElement, tag, propValue, defaultValue, props, null);\n }\n initTextarea(domElement, hasSrc, hasSrcSet, propKey);\n return;\n case \"option\":\n for (checked in props)\n if (\n props.hasOwnProperty(checked) &&\n ((hasSrc = props[checked]), null != hasSrc)\n )\n switch (checked) {\n case \"selected\":\n domElement.selected =\n hasSrc &&\n \"function\" !== typeof hasSrc &&\n \"symbol\" !== typeof hasSrc;\n break;\n default:\n setProp(domElement, tag, checked, hasSrc, props, null);\n }\n return;\n case \"dialog\":\n listenToNonDelegatedEvent(\"beforetoggle\", domElement);\n listenToNonDelegatedEvent(\"toggle\", domElement);\n listenToNonDelegatedEvent(\"cancel\", domElement);\n listenToNonDelegatedEvent(\"close\", domElement);\n break;\n case \"iframe\":\n case \"object\":\n listenToNonDelegatedEvent(\"load\", domElement);\n break;\n case \"video\":\n case \"audio\":\n for (hasSrc = 0; hasSrc < mediaEventTypes.length; hasSrc++)\n listenToNonDelegatedEvent(mediaEventTypes[hasSrc], domElement);\n break;\n case \"image\":\n listenToNonDelegatedEvent(\"error\", domElement);\n listenToNonDelegatedEvent(\"load\", domElement);\n break;\n case \"details\":\n listenToNonDelegatedEvent(\"toggle\", domElement);\n break;\n case \"embed\":\n case \"source\":\n case \"link\":\n listenToNonDelegatedEvent(\"error\", domElement),\n listenToNonDelegatedEvent(\"load\", domElement);\n case \"area\":\n case \"base\":\n case \"br\":\n case \"col\":\n case \"hr\":\n case \"keygen\":\n case \"meta\":\n case \"param\":\n case \"track\":\n case \"wbr\":\n case \"menuitem\":\n for (defaultChecked in props)\n if (\n props.hasOwnProperty(defaultChecked) &&\n ((hasSrc = props[defaultChecked]), null != hasSrc)\n )\n switch (defaultChecked) {\n case \"children\":\n case \"dangerouslySetInnerHTML\":\n throw Error(formatProdErrorMessage(137, tag));\n default:\n setProp(domElement, tag, defaultChecked, hasSrc, props, null);\n }\n return;\n default:\n if (isCustomElement(tag)) {\n for (propValue$184 in props)\n props.hasOwnProperty(propValue$184) &&\n ((hasSrc = props[propValue$184]),\n void 0 !== hasSrc &&\n setPropOnCustomElement(\n domElement,\n tag,\n propValue$184,\n hasSrc,\n props,\n void 0\n ));\n return;\n }\n }\n for (defaultValue in props)\n props.hasOwnProperty(defaultValue) &&\n ((hasSrc = props[defaultValue]),\n null != hasSrc &&\n setProp(domElement, tag, defaultValue, hasSrc, props, null));\n}\nfunction updateProperties(domElement, tag, lastProps, nextProps) {\n switch (tag) {\n case \"div\":\n case \"span\":\n case \"svg\":\n case \"path\":\n case \"a\":\n case \"g\":\n case \"p\":\n case \"li\":\n break;\n case \"input\":\n var name = null,\n type = null,\n value = null,\n defaultValue = null,\n lastDefaultValue = null,\n checked = null,\n defaultChecked = null;\n for (propKey in lastProps) {\n var lastProp = lastProps[propKey];\n if (lastProps.hasOwnProperty(propKey) && null != lastProp)\n switch (propKey) {\n case \"checked\":\n break;\n case \"value\":\n break;\n case \"defaultValue\":\n lastDefaultValue = lastProp;\n default:\n nextProps.hasOwnProperty(propKey) ||\n setProp(domElement, tag, propKey, null, nextProps, lastProp);\n }\n }\n for (var propKey$201 in nextProps) {\n var propKey = nextProps[propKey$201];\n lastProp = lastProps[propKey$201];\n if (\n nextProps.hasOwnProperty(propKey$201) &&\n (null != propKey || null != lastProp)\n )\n switch (propKey$201) {\n case \"type\":\n type = propKey;\n break;\n case \"name\":\n name = propKey;\n break;\n case \"checked\":\n checked = propKey;\n break;\n case \"defaultChecked\":\n defaultChecked = propKey;\n break;\n case \"value\":\n value = propKey;\n break;\n case \"defaultValue\":\n defaultValue = propKey;\n break;\n case \"children\":\n case \"dangerouslySetInnerHTML\":\n if (null != propKey)\n throw Error(formatProdErrorMessage(137, tag));\n break;\n default:\n propKey !== lastProp &&\n setProp(\n domElement,\n tag,\n propKey$201,\n propKey,\n nextProps,\n lastProp\n );\n }\n }\n updateInput(\n domElement,\n value,\n defaultValue,\n lastDefaultValue,\n checked,\n defaultChecked,\n type,\n name\n );\n return;\n case \"select\":\n propKey = value = defaultValue = propKey$201 = null;\n for (type in lastProps)\n if (\n ((lastDefaultValue = lastProps[type]),\n lastProps.hasOwnProperty(type) && null != lastDefaultValue)\n )\n switch (type) {\n case \"value\":\n break;\n case \"multiple\":\n propKey = lastDefaultValue;\n default:\n nextProps.hasOwnProperty(type) ||\n setProp(\n domElement,\n tag,\n type,\n null,\n nextProps,\n lastDefaultValue\n );\n }\n for (name in nextProps)\n if (\n ((type = nextProps[name]),\n (lastDefaultValue = lastProps[name]),\n nextProps.hasOwnProperty(name) &&\n (null != type || null != lastDefaultValue))\n )\n switch (name) {\n case \"value\":\n propKey$201 = type;\n break;\n case \"defaultValue\":\n defaultValue = type;\n break;\n case \"multiple\":\n value = type;\n default:\n type !== lastDefaultValue &&\n setProp(\n domElement,\n tag,\n name,\n type,\n nextProps,\n lastDefaultValue\n );\n }\n tag = defaultValue;\n lastProps = value;\n nextProps = propKey;\n null != propKey$201\n ? updateOptions(domElement, !!lastProps, propKey$201, !1)\n : !!nextProps !== !!lastProps &&\n (null != tag\n ? updateOptions(domElement, !!lastProps, tag, !0)\n : updateOptions(domElement, !!lastProps, lastProps ? [] : \"\", !1));\n return;\n case \"textarea\":\n propKey = propKey$201 = null;\n for (defaultValue in lastProps)\n if (\n ((name = lastProps[defaultValue]),\n lastProps.hasOwnProperty(defaultValue) &&\n null != name &&\n !nextProps.hasOwnProperty(defaultValue))\n )\n switch (defaultValue) {\n case \"value\":\n break;\n case \"children\":\n break;\n default:\n setProp(domElement, tag, defaultValue, null, nextProps, name);\n }\n for (value in nextProps)\n if (\n ((name = nextProps[value]),\n (type = lastProps[value]),\n nextProps.hasOwnProperty(value) && (null != name || null != type))\n )\n switch (value) {\n case \"value\":\n propKey$201 = name;\n break;\n case \"defaultValue\":\n propKey = name;\n break;\n case \"children\":\n break;\n case \"dangerouslySetInnerHTML\":\n if (null != name) throw Error(formatProdErrorMessage(91));\n break;\n default:\n name !== type &&\n setProp(domElement, tag, value, name, nextProps, type);\n }\n updateTextarea(domElement, propKey$201, propKey);\n return;\n case \"option\":\n for (var propKey$217 in lastProps)\n if (\n ((propKey$201 = lastProps[propKey$217]),\n lastProps.hasOwnProperty(propKey$217) &&\n null != propKey$201 &&\n !nextProps.hasOwnProperty(propKey$217))\n )\n switch (propKey$217) {\n case \"selected\":\n domElement.selected = !1;\n break;\n default:\n setProp(\n domElement,\n tag,\n propKey$217,\n null,\n nextProps,\n propKey$201\n );\n }\n for (lastDefaultValue in nextProps)\n if (\n ((propKey$201 = nextProps[lastDefaultValue]),\n (propKey = lastProps[lastDefaultValue]),\n nextProps.hasOwnProperty(lastDefaultValue) &&\n propKey$201 !== propKey &&\n (null != propKey$201 || null != propKey))\n )\n switch (lastDefaultValue) {\n case \"selected\":\n domElement.selected =\n propKey$201 &&\n \"function\" !== typeof propKey$201 &&\n \"symbol\" !== typeof propKey$201;\n break;\n default:\n setProp(\n domElement,\n tag,\n lastDefaultValue,\n propKey$201,\n nextProps,\n propKey\n );\n }\n return;\n case \"img\":\n case \"link\":\n case \"area\":\n case \"base\":\n case \"br\":\n case \"col\":\n case \"embed\":\n case \"hr\":\n case \"keygen\":\n case \"meta\":\n case \"param\":\n case \"source\":\n case \"track\":\n case \"wbr\":\n case \"menuitem\":\n for (var propKey$222 in lastProps)\n (propKey$201 = lastProps[propKey$222]),\n lastProps.hasOwnProperty(propKey$222) &&\n null != propKey$201 &&\n !nextProps.hasOwnProperty(propKey$222) &&\n setProp(domElement, tag, propKey$222, null, nextProps, propKey$201);\n for (checked in nextProps)\n if (\n ((propKey$201 = nextProps[checked]),\n (propKey = lastProps[checked]),\n nextProps.hasOwnProperty(checked) &&\n propKey$201 !== propKey &&\n (null != propKey$201 || null != propKey))\n )\n switch (checked) {\n case \"children\":\n case \"dangerouslySetInnerHTML\":\n if (null != propKey$201)\n throw Error(formatProdErrorMessage(137, tag));\n break;\n default:\n setProp(\n domElement,\n tag,\n checked,\n propKey$201,\n nextProps,\n propKey\n );\n }\n return;\n default:\n if (isCustomElement(tag)) {\n for (var propKey$227 in lastProps)\n (propKey$201 = lastProps[propKey$227]),\n lastProps.hasOwnProperty(propKey$227) &&\n void 0 !== propKey$201 &&\n !nextProps.hasOwnProperty(propKey$227) &&\n setPropOnCustomElement(\n domElement,\n tag,\n propKey$227,\n void 0,\n nextProps,\n propKey$201\n );\n for (defaultChecked in nextProps)\n (propKey$201 = nextProps[defaultChecked]),\n (propKey = lastProps[defaultChecked]),\n !nextProps.hasOwnProperty(defaultChecked) ||\n propKey$201 === propKey ||\n (void 0 === propKey$201 && void 0 === propKey) ||\n setPropOnCustomElement(\n domElement,\n tag,\n defaultChecked,\n propKey$201,\n nextProps,\n propKey\n );\n return;\n }\n }\n for (var propKey$232 in lastProps)\n (propKey$201 = lastProps[propKey$232]),\n lastProps.hasOwnProperty(propKey$232) &&\n null != propKey$201 &&\n !nextProps.hasOwnProperty(propKey$232) &&\n setProp(domElement, tag, propKey$232, null, nextProps, propKey$201);\n for (lastProp in nextProps)\n (propKey$201 = nextProps[lastProp]),\n (propKey = lastProps[lastProp]),\n !nextProps.hasOwnProperty(lastProp) ||\n propKey$201 === propKey ||\n (null == propKey$201 && null == propKey) ||\n setProp(domElement, tag, lastProp, propKey$201, nextProps, propKey);\n}\nfunction isLikelyStaticResource(initiatorType) {\n switch (initiatorType) {\n case \"css\":\n case \"script\":\n case \"font\":\n case \"img\":\n case \"image\":\n case \"input\":\n case \"link\":\n return !0;\n default:\n return !1;\n }\n}\nfunction estimateBandwidth() {\n if (\"function\" === typeof performance.getEntriesByType) {\n for (\n var count = 0,\n bits = 0,\n resourceEntries = performance.getEntriesByType(\"resource\"),\n i = 0;\n i < resourceEntries.length;\n i++\n ) {\n var entry = resourceEntries[i],\n transferSize = entry.transferSize,\n initiatorType = entry.initiatorType,\n duration = entry.duration;\n if (transferSize && duration && isLikelyStaticResource(initiatorType)) {\n initiatorType = 0;\n duration = entry.responseEnd;\n for (i += 1; i < resourceEntries.length; i++) {\n var overlapEntry = resourceEntries[i],\n overlapStartTime = overlapEntry.startTime;\n if (overlapStartTime > duration) break;\n var overlapTransferSize = overlapEntry.transferSize,\n overlapInitiatorType = overlapEntry.initiatorType;\n overlapTransferSize &&\n isLikelyStaticResource(overlapInitiatorType) &&\n ((overlapEntry = overlapEntry.responseEnd),\n (initiatorType +=\n overlapTransferSize *\n (overlapEntry < duration\n ? 1\n : (duration - overlapStartTime) /\n (overlapEntry - overlapStartTime))));\n }\n --i;\n bits += (8 * (transferSize + initiatorType)) / (entry.duration / 1e3);\n count++;\n if (10 < count) break;\n }\n }\n if (0 < count) return bits / count / 1e6;\n }\n return navigator.connection &&\n ((count = navigator.connection.downlink), \"number\" === typeof count)\n ? count\n : 5;\n}\nvar eventsEnabled = null,\n selectionInformation = null;\nfunction getOwnerDocumentFromRootContainer(rootContainerElement) {\n return 9 === rootContainerElement.nodeType\n ? rootContainerElement\n : rootContainerElement.ownerDocument;\n}\nfunction getOwnHostContext(namespaceURI) {\n switch (namespaceURI) {\n case \"http://www.w3.org/2000/svg\":\n return 1;\n case \"http://www.w3.org/1998/Math/MathML\":\n return 2;\n default:\n return 0;\n }\n}\nfunction getChildHostContextProd(parentNamespace, type) {\n if (0 === parentNamespace)\n switch (type) {\n case \"svg\":\n return 1;\n case \"math\":\n return 2;\n default:\n return 0;\n }\n return 1 === parentNamespace && \"foreignObject\" === type\n ? 0\n : parentNamespace;\n}\nfunction shouldSetTextContent(type, props) {\n return (\n \"textarea\" === type ||\n \"noscript\" === type ||\n \"string\" === typeof props.children ||\n \"number\" === typeof props.children ||\n \"bigint\" === typeof props.children ||\n (\"object\" === typeof props.dangerouslySetInnerHTML &&\n null !== props.dangerouslySetInnerHTML &&\n null != props.dangerouslySetInnerHTML.__html)\n );\n}\nvar currentPopstateTransitionEvent = null;\nfunction shouldAttemptEagerTransition() {\n var event = window.event;\n if (event && \"popstate\" === event.type) {\n if (event === currentPopstateTransitionEvent) return !1;\n currentPopstateTransitionEvent = event;\n return !0;\n }\n currentPopstateTransitionEvent = null;\n return !1;\n}\nvar scheduleTimeout = \"function\" === typeof setTimeout ? setTimeout : void 0,\n cancelTimeout = \"function\" === typeof clearTimeout ? clearTimeout : void 0,\n localPromise = \"function\" === typeof Promise ? Promise : void 0,\n scheduleMicrotask =\n \"function\" === typeof queueMicrotask\n ? queueMicrotask\n : \"undefined\" !== typeof localPromise\n ? function (callback) {\n return localPromise\n .resolve(null)\n .then(callback)\n .catch(handleErrorInNextTick);\n }\n : scheduleTimeout;\nfunction handleErrorInNextTick(error) {\n setTimeout(function () {\n throw error;\n });\n}\nfunction isSingletonScope(type) {\n return \"head\" === type;\n}\nfunction clearHydrationBoundary(parentInstance, hydrationInstance) {\n var node = hydrationInstance,\n depth = 0;\n do {\n var nextNode = node.nextSibling;\n parentInstance.removeChild(node);\n if (nextNode && 8 === nextNode.nodeType)\n if (((node = nextNode.data), \"/$\" === node || \"/&\" === node)) {\n if (0 === depth) {\n parentInstance.removeChild(nextNode);\n retryIfBlockedOn(hydrationInstance);\n return;\n }\n depth--;\n } else if (\n \"$\" === node ||\n \"$?\" === node ||\n \"$~\" === node ||\n \"$!\" === node ||\n \"&\" === node\n )\n depth++;\n else if (\"html\" === node)\n releaseSingletonInstance(parentInstance.ownerDocument.documentElement);\n else if (\"head\" === node) {\n node = parentInstance.ownerDocument.head;\n releaseSingletonInstance(node);\n for (var node$jscomp$0 = node.firstChild; node$jscomp$0; ) {\n var nextNode$jscomp$0 = node$jscomp$0.nextSibling,\n nodeName = node$jscomp$0.nodeName;\n node$jscomp$0[internalHoistableMarker] ||\n \"SCRIPT\" === nodeName ||\n \"STYLE\" === nodeName ||\n (\"LINK\" === nodeName &&\n \"stylesheet\" === node$jscomp$0.rel.toLowerCase()) ||\n node.removeChild(node$jscomp$0);\n node$jscomp$0 = nextNode$jscomp$0;\n }\n } else\n \"body\" === node &&\n releaseSingletonInstance(parentInstance.ownerDocument.body);\n node = nextNode;\n } while (node);\n retryIfBlockedOn(hydrationInstance);\n}\nfunction hideOrUnhideDehydratedBoundary(suspenseInstance, isHidden) {\n var node = suspenseInstance;\n suspenseInstance = 0;\n do {\n var nextNode = node.nextSibling;\n 1 === node.nodeType\n ? isHidden\n ? ((node._stashedDisplay = node.style.display),\n (node.style.display = \"none\"))\n : ((node.style.display = node._stashedDisplay || \"\"),\n \"\" === node.getAttribute(\"style\") && node.removeAttribute(\"style\"))\n : 3 === node.nodeType &&\n (isHidden\n ? ((node._stashedText = node.nodeValue), (node.nodeValue = \"\"))\n : (node.nodeValue = node._stashedText || \"\"));\n if (nextNode && 8 === nextNode.nodeType)\n if (((node = nextNode.data), \"/$\" === node))\n if (0 === suspenseInstance) break;\n else suspenseInstance--;\n else\n (\"$\" !== node && \"$?\" !== node && \"$~\" !== node && \"$!\" !== node) ||\n suspenseInstance++;\n node = nextNode;\n } while (node);\n}\nfunction clearContainerSparingly(container) {\n var nextNode = container.firstChild;\n nextNode && 10 === nextNode.nodeType && (nextNode = nextNode.nextSibling);\n for (; nextNode; ) {\n var node = nextNode;\n nextNode = nextNode.nextSibling;\n switch (node.nodeName) {\n case \"HTML\":\n case \"HEAD\":\n case \"BODY\":\n clearContainerSparingly(node);\n detachDeletedInstance(node);\n continue;\n case \"SCRIPT\":\n case \"STYLE\":\n continue;\n case \"LINK\":\n if (\"stylesheet\" === node.rel.toLowerCase()) continue;\n }\n container.removeChild(node);\n }\n}\nfunction canHydrateInstance(instance, type, props, inRootOrSingleton) {\n for (; 1 === instance.nodeType; ) {\n var anyProps = props;\n if (instance.nodeName.toLowerCase() !== type.toLowerCase()) {\n if (\n !inRootOrSingleton &&\n (\"INPUT\" !== instance.nodeName || \"hidden\" !== instance.type)\n )\n break;\n } else if (!inRootOrSingleton)\n if (\"input\" === type && \"hidden\" === instance.type) {\n var name = null == anyProps.name ? null : \"\" + anyProps.name;\n if (\n \"hidden\" === anyProps.type &&\n instance.getAttribute(\"name\") === name\n )\n return instance;\n } else return instance;\n else if (!instance[internalHoistableMarker])\n switch (type) {\n case \"meta\":\n if (!instance.hasAttribute(\"itemprop\")) break;\n return instance;\n case \"link\":\n name = instance.getAttribute(\"rel\");\n if (\"stylesheet\" === name && instance.hasAttribute(\"data-precedence\"))\n break;\n else if (\n name !== anyProps.rel ||\n instance.getAttribute(\"href\") !==\n (null == anyProps.href || \"\" === anyProps.href\n ? null\n : anyProps.href) ||\n instance.getAttribute(\"crossorigin\") !==\n (null == anyProps.crossOrigin ? null : anyProps.crossOrigin) ||\n instance.getAttribute(\"title\") !==\n (null == anyProps.title ? null : anyProps.title)\n )\n break;\n return instance;\n case \"style\":\n if (instance.hasAttribute(\"data-precedence\")) break;\n return instance;\n case \"script\":\n name = instance.getAttribute(\"src\");\n if (\n (name !== (null == anyProps.src ? null : anyProps.src) ||\n instance.getAttribute(\"type\") !==\n (null == anyProps.type ? null : anyProps.type) ||\n instance.getAttribute(\"crossorigin\") !==\n (null == anyProps.crossOrigin ? null : anyProps.crossOrigin)) &&\n name &&\n instance.hasAttribute(\"async\") &&\n !instance.hasAttribute(\"itemprop\")\n )\n break;\n return instance;\n default:\n return instance;\n }\n instance = getNextHydratable(instance.nextSibling);\n if (null === instance) break;\n }\n return null;\n}\nfunction canHydrateTextInstance(instance, text, inRootOrSingleton) {\n if (\"\" === text) return null;\n for (; 3 !== instance.nodeType; ) {\n if (\n (1 !== instance.nodeType ||\n \"INPUT\" !== instance.nodeName ||\n \"hidden\" !== instance.type) &&\n !inRootOrSingleton\n )\n return null;\n instance = getNextHydratable(instance.nextSibling);\n if (null === instance) return null;\n }\n return instance;\n}\nfunction canHydrateHydrationBoundary(instance, inRootOrSingleton) {\n for (; 8 !== instance.nodeType; ) {\n if (\n (1 !== instance.nodeType ||\n \"INPUT\" !== instance.nodeName ||\n \"hidden\" !== instance.type) &&\n !inRootOrSingleton\n )\n return null;\n instance = getNextHydratable(instance.nextSibling);\n if (null === instance) return null;\n }\n return instance;\n}\nfunction isSuspenseInstancePending(instance) {\n return \"$?\" === instance.data || \"$~\" === instance.data;\n}\nfunction isSuspenseInstanceFallback(instance) {\n return (\n \"$!\" === instance.data ||\n (\"$?\" === instance.data && \"loading\" !== instance.ownerDocument.readyState)\n );\n}\nfunction registerSuspenseInstanceRetry(instance, callback) {\n var ownerDocument = instance.ownerDocument;\n if (\"$~\" === instance.data) instance._reactRetry = callback;\n else if (\"$?\" !== instance.data || \"loading\" !== ownerDocument.readyState)\n callback();\n else {\n var listener = function () {\n callback();\n ownerDocument.removeEventListener(\"DOMContentLoaded\", listener);\n };\n ownerDocument.addEventListener(\"DOMContentLoaded\", listener);\n instance._reactRetry = listener;\n }\n}\nfunction getNextHydratable(node) {\n for (; null != node; node = node.nextSibling) {\n var nodeType = node.nodeType;\n if (1 === nodeType || 3 === nodeType) break;\n if (8 === nodeType) {\n nodeType = node.data;\n if (\n \"$\" === nodeType ||\n \"$!\" === nodeType ||\n \"$?\" === nodeType ||\n \"$~\" === nodeType ||\n \"&\" === nodeType ||\n \"F!\" === nodeType ||\n \"F\" === nodeType\n )\n break;\n if (\"/$\" === nodeType || \"/&\" === nodeType) return null;\n }\n }\n return node;\n}\nvar previousHydratableOnEnteringScopedSingleton = null;\nfunction getNextHydratableInstanceAfterHydrationBoundary(hydrationInstance) {\n hydrationInstance = hydrationInstance.nextSibling;\n for (var depth = 0; hydrationInstance; ) {\n if (8 === hydrationInstance.nodeType) {\n var data = hydrationInstance.data;\n if (\"/$\" === data || \"/&\" === data) {\n if (0 === depth)\n return getNextHydratable(hydrationInstance.nextSibling);\n depth--;\n } else\n (\"$\" !== data &&\n \"$!\" !== data &&\n \"$?\" !== data &&\n \"$~\" !== data &&\n \"&\" !== data) ||\n depth++;\n }\n hydrationInstance = hydrationInstance.nextSibling;\n }\n return null;\n}\nfunction getParentHydrationBoundary(targetInstance) {\n targetInstance = targetInstance.previousSibling;\n for (var depth = 0; targetInstance; ) {\n if (8 === targetInstance.nodeType) {\n var data = targetInstance.data;\n if (\n \"$\" === data ||\n \"$!\" === data ||\n \"$?\" === data ||\n \"$~\" === data ||\n \"&\" === data\n ) {\n if (0 === depth) return targetInstance;\n depth--;\n } else (\"/$\" !== data && \"/&\" !== data) || depth++;\n }\n targetInstance = targetInstance.previousSibling;\n }\n return null;\n}\nfunction resolveSingletonInstance(type, props, rootContainerInstance) {\n props = getOwnerDocumentFromRootContainer(rootContainerInstance);\n switch (type) {\n case \"html\":\n type = props.documentElement;\n if (!type) throw Error(formatProdErrorMessage(452));\n return type;\n case \"head\":\n type = props.head;\n if (!type) throw Error(formatProdErrorMessage(453));\n return type;\n case \"body\":\n type = props.body;\n if (!type) throw Error(formatProdErrorMessage(454));\n return type;\n default:\n throw Error(formatProdErrorMessage(451));\n }\n}\nfunction releaseSingletonInstance(instance) {\n for (var attributes = instance.attributes; attributes.length; )\n instance.removeAttributeNode(attributes[0]);\n detachDeletedInstance(instance);\n}\nvar preloadPropsMap = new Map(),\n preconnectsSet = new Set();\nfunction getHoistableRoot(container) {\n return \"function\" === typeof container.getRootNode\n ? container.getRootNode()\n : 9 === container.nodeType\n ? container\n : container.ownerDocument;\n}\nvar previousDispatcher = ReactDOMSharedInternals.d;\nReactDOMSharedInternals.d = {\n f: flushSyncWork,\n r: requestFormReset,\n D: prefetchDNS,\n C: preconnect,\n L: preload,\n m: preloadModule,\n X: preinitScript,\n S: preinitStyle,\n M: preinitModuleScript\n};\nfunction flushSyncWork() {\n var previousWasRendering = previousDispatcher.f(),\n wasRendering = flushSyncWork$1();\n return previousWasRendering || wasRendering;\n}\nfunction requestFormReset(form) {\n var formInst = getInstanceFromNode(form);\n null !== formInst && 5 === formInst.tag && \"form\" === formInst.type\n ? requestFormReset$1(formInst)\n : previousDispatcher.r(form);\n}\nvar globalDocument = \"undefined\" === typeof document ? null : document;\nfunction preconnectAs(rel, href, crossOrigin) {\n var ownerDocument = globalDocument;\n if (ownerDocument && \"string\" === typeof href && href) {\n var limitedEscapedHref =\n escapeSelectorAttributeValueInsideDoubleQuotes(href);\n limitedEscapedHref =\n 'link[rel=\"' + rel + '\"][href=\"' + limitedEscapedHref + '\"]';\n \"string\" === typeof crossOrigin &&\n (limitedEscapedHref += '[crossorigin=\"' + crossOrigin + '\"]');\n preconnectsSet.has(limitedEscapedHref) ||\n (preconnectsSet.add(limitedEscapedHref),\n (rel = { rel: rel, crossOrigin: crossOrigin, href: href }),\n null === ownerDocument.querySelector(limitedEscapedHref) &&\n ((href = ownerDocument.createElement(\"link\")),\n setInitialProperties(href, \"link\", rel),\n markNodeAsHoistable(href),\n ownerDocument.head.appendChild(href)));\n }\n}\nfunction prefetchDNS(href) {\n previousDispatcher.D(href);\n preconnectAs(\"dns-prefetch\", href, null);\n}\nfunction preconnect(href, crossOrigin) {\n previousDispatcher.C(href, crossOrigin);\n preconnectAs(\"preconnect\", href, crossOrigin);\n}\nfunction preload(href, as, options) {\n previousDispatcher.L(href, as, options);\n var ownerDocument = globalDocument;\n if (ownerDocument && href && as) {\n var preloadSelector =\n 'link[rel=\"preload\"][as=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(as) +\n '\"]';\n \"image\" === as\n ? options && options.imageSrcSet\n ? ((preloadSelector +=\n '[imagesrcset=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(\n options.imageSrcSet\n ) +\n '\"]'),\n \"string\" === typeof options.imageSizes &&\n (preloadSelector +=\n '[imagesizes=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(\n options.imageSizes\n ) +\n '\"]'))\n : (preloadSelector +=\n '[href=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n '\"]')\n : (preloadSelector +=\n '[href=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n '\"]');\n var key = preloadSelector;\n switch (as) {\n case \"style\":\n key = getStyleKey(href);\n break;\n case \"script\":\n key = getScriptKey(href);\n }\n preloadPropsMap.has(key) ||\n ((href = assign(\n {\n rel: \"preload\",\n href:\n \"image\" === as && options && options.imageSrcSet ? void 0 : href,\n as: as\n },\n options\n )),\n preloadPropsMap.set(key, href),\n null !== ownerDocument.querySelector(preloadSelector) ||\n (\"style\" === as &&\n ownerDocument.querySelector(getStylesheetSelectorFromKey(key))) ||\n (\"script\" === as &&\n ownerDocument.querySelector(getScriptSelectorFromKey(key))) ||\n ((as = ownerDocument.createElement(\"link\")),\n setInitialProperties(as, \"link\", href),\n markNodeAsHoistable(as),\n ownerDocument.head.appendChild(as)));\n }\n}\nfunction preloadModule(href, options) {\n previousDispatcher.m(href, options);\n var ownerDocument = globalDocument;\n if (ownerDocument && href) {\n var as = options && \"string\" === typeof options.as ? options.as : \"script\",\n preloadSelector =\n 'link[rel=\"modulepreload\"][as=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(as) +\n '\"][href=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n '\"]',\n key = preloadSelector;\n switch (as) {\n case \"audioworklet\":\n case \"paintworklet\":\n case \"serviceworker\":\n case \"sharedworker\":\n case \"worker\":\n case \"script\":\n key = getScriptKey(href);\n }\n if (\n !preloadPropsMap.has(key) &&\n ((href = assign({ rel: \"modulepreload\", href: href }, options)),\n preloadPropsMap.set(key, href),\n null === ownerDocument.querySelector(preloadSelector))\n ) {\n switch (as) {\n case \"audioworklet\":\n case \"paintworklet\":\n case \"serviceworker\":\n case \"sharedworker\":\n case \"worker\":\n case \"script\":\n if (ownerDocument.querySelector(getScriptSelectorFromKey(key)))\n return;\n }\n as = ownerDocument.createElement(\"link\");\n setInitialProperties(as, \"link\", href);\n markNodeAsHoistable(as);\n ownerDocument.head.appendChild(as);\n }\n }\n}\nfunction preinitStyle(href, precedence, options) {\n previousDispatcher.S(href, precedence, options);\n var ownerDocument = globalDocument;\n if (ownerDocument && href) {\n var styles = getResourcesFromRoot(ownerDocument).hoistableStyles,\n key = getStyleKey(href);\n precedence = precedence || \"default\";\n var resource = styles.get(key);\n if (!resource) {\n var state = { loading: 0, preload: null };\n if (\n (resource = ownerDocument.querySelector(\n getStylesheetSelectorFromKey(key)\n ))\n )\n state.loading = 5;\n else {\n href = assign(\n { rel: \"stylesheet\", href: href, \"data-precedence\": precedence },\n options\n );\n (options = preloadPropsMap.get(key)) &&\n adoptPreloadPropsForStylesheet(href, options);\n var link = (resource = ownerDocument.createElement(\"link\"));\n markNodeAsHoistable(link);\n setInitialProperties(link, \"link\", href);\n link._p = new Promise(function (resolve, reject) {\n link.onload = resolve;\n link.onerror = reject;\n });\n link.addEventListener(\"load\", function () {\n state.loading |= 1;\n });\n link.addEventListener(\"error\", function () {\n state.loading |= 2;\n });\n state.loading |= 4;\n insertStylesheet(resource, precedence, ownerDocument);\n }\n resource = {\n type: \"stylesheet\",\n instance: resource,\n count: 1,\n state: state\n };\n styles.set(key, resource);\n }\n }\n}\nfunction preinitScript(src, options) {\n previousDispatcher.X(src, options);\n var ownerDocument = globalDocument;\n if (ownerDocument && src) {\n var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts,\n key = getScriptKey(src),\n resource = scripts.get(key);\n resource ||\n ((resource = ownerDocument.querySelector(getScriptSelectorFromKey(key))),\n resource ||\n ((src = assign({ src: src, async: !0 }, options)),\n (options = preloadPropsMap.get(key)) &&\n adoptPreloadPropsForScript(src, options),\n (resource = ownerDocument.createElement(\"script\")),\n markNodeAsHoistable(resource),\n setInitialProperties(resource, \"link\", src),\n ownerDocument.head.appendChild(resource)),\n (resource = {\n type: \"script\",\n instance: resource,\n count: 1,\n state: null\n }),\n scripts.set(key, resource));\n }\n}\nfunction preinitModuleScript(src, options) {\n previousDispatcher.M(src, options);\n var ownerDocument = globalDocument;\n if (ownerDocument && src) {\n var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts,\n key = getScriptKey(src),\n resource = scripts.get(key);\n resource ||\n ((resource = ownerDocument.querySelector(getScriptSelectorFromKey(key))),\n resource ||\n ((src = assign({ src: src, async: !0, type: \"module\" }, options)),\n (options = preloadPropsMap.get(key)) &&\n adoptPreloadPropsForScript(src, options),\n (resource = ownerDocument.createElement(\"script\")),\n markNodeAsHoistable(resource),\n setInitialProperties(resource, \"link\", src),\n ownerDocument.head.appendChild(resource)),\n (resource = {\n type: \"script\",\n instance: resource,\n count: 1,\n state: null\n }),\n scripts.set(key, resource));\n }\n}\nfunction getResource(type, currentProps, pendingProps, currentResource) {\n var JSCompiler_inline_result = (JSCompiler_inline_result =\n rootInstanceStackCursor.current)\n ? getHoistableRoot(JSCompiler_inline_result)\n : null;\n if (!JSCompiler_inline_result) throw Error(formatProdErrorMessage(446));\n switch (type) {\n case \"meta\":\n case \"title\":\n return null;\n case \"style\":\n return \"string\" === typeof pendingProps.precedence &&\n \"string\" === typeof pendingProps.href\n ? ((currentProps = getStyleKey(pendingProps.href)),\n (pendingProps = getResourcesFromRoot(\n JSCompiler_inline_result\n ).hoistableStyles),\n (currentResource = pendingProps.get(currentProps)),\n currentResource ||\n ((currentResource = {\n type: \"style\",\n instance: null,\n count: 0,\n state: null\n }),\n pendingProps.set(currentProps, currentResource)),\n currentResource)\n : { type: \"void\", instance: null, count: 0, state: null };\n case \"link\":\n if (\n \"stylesheet\" === pendingProps.rel &&\n \"string\" === typeof pendingProps.href &&\n \"string\" === typeof pendingProps.precedence\n ) {\n type = getStyleKey(pendingProps.href);\n var styles$243 = getResourcesFromRoot(\n JSCompiler_inline_result\n ).hoistableStyles,\n resource$244 = styles$243.get(type);\n resource$244 ||\n ((JSCompiler_inline_result =\n JSCompiler_inline_result.ownerDocument || JSCompiler_inline_result),\n (resource$244 = {\n type: \"stylesheet\",\n instance: null,\n count: 0,\n state: { loading: 0, preload: null }\n }),\n styles$243.set(type, resource$244),\n (styles$243 = JSCompiler_inline_result.querySelector(\n getStylesheetSelectorFromKey(type)\n )) &&\n !styles$243._p &&\n ((resource$244.instance = styles$243),\n (resource$244.state.loading = 5)),\n preloadPropsMap.has(type) ||\n ((pendingProps = {\n rel: \"preload\",\n as: \"style\",\n href: pendingProps.href,\n crossOrigin: pendingProps.crossOrigin,\n integrity: pendingProps.integrity,\n media: pendingProps.media,\n hrefLang: pendingProps.hrefLang,\n referrerPolicy: pendingProps.referrerPolicy\n }),\n preloadPropsMap.set(type, pendingProps),\n styles$243 ||\n preloadStylesheet(\n JSCompiler_inline_result,\n type,\n pendingProps,\n resource$244.state\n )));\n if (currentProps && null === currentResource)\n throw Error(formatProdErrorMessage(528, \"\"));\n return resource$244;\n }\n if (currentProps && null !== currentResource)\n throw Error(formatProdErrorMessage(529, \"\"));\n return null;\n case \"script\":\n return (\n (currentProps = pendingProps.async),\n (pendingProps = pendingProps.src),\n \"string\" === typeof pendingProps &&\n currentProps &&\n \"function\" !== typeof currentProps &&\n \"symbol\" !== typeof currentProps\n ? ((currentProps = getScriptKey(pendingProps)),\n (pendingProps = getResourcesFromRoot(\n JSCompiler_inline_result\n ).hoistableScripts),\n (currentResource = pendingProps.get(currentProps)),\n currentResource ||\n ((currentResource = {\n type: \"script\",\n instance: null,\n count: 0,\n state: null\n }),\n pendingProps.set(currentProps, currentResource)),\n currentResource)\n : { type: \"void\", instance: null, count: 0, state: null }\n );\n default:\n throw Error(formatProdErrorMessage(444, type));\n }\n}\nfunction getStyleKey(href) {\n return 'href=\"' + escapeSelectorAttributeValueInsideDoubleQuotes(href) + '\"';\n}\nfunction getStylesheetSelectorFromKey(key) {\n return 'link[rel=\"stylesheet\"][' + key + \"]\";\n}\nfunction stylesheetPropsFromRawProps(rawProps) {\n return assign({}, rawProps, {\n \"data-precedence\": rawProps.precedence,\n precedence: null\n });\n}\nfunction preloadStylesheet(ownerDocument, key, preloadProps, state) {\n ownerDocument.querySelector('link[rel=\"preload\"][as=\"style\"][' + key + \"]\")\n ? (state.loading = 1)\n : ((key = ownerDocument.createElement(\"link\")),\n (state.preload = key),\n key.addEventListener(\"load\", function () {\n return (state.loading |= 1);\n }),\n key.addEventListener(\"error\", function () {\n return (state.loading |= 2);\n }),\n setInitialProperties(key, \"link\", preloadProps),\n markNodeAsHoistable(key),\n ownerDocument.head.appendChild(key));\n}\nfunction getScriptKey(src) {\n return '[src=\"' + escapeSelectorAttributeValueInsideDoubleQuotes(src) + '\"]';\n}\nfunction getScriptSelectorFromKey(key) {\n return \"script[async]\" + key;\n}\nfunction acquireResource(hoistableRoot, resource, props) {\n resource.count++;\n if (null === resource.instance)\n switch (resource.type) {\n case \"style\":\n var instance = hoistableRoot.querySelector(\n 'style[data-href~=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(props.href) +\n '\"]'\n );\n if (instance)\n return (\n (resource.instance = instance),\n markNodeAsHoistable(instance),\n instance\n );\n var styleProps = assign({}, props, {\n \"data-href\": props.href,\n \"data-precedence\": props.precedence,\n href: null,\n precedence: null\n });\n instance = (hoistableRoot.ownerDocument || hoistableRoot).createElement(\n \"style\"\n );\n markNodeAsHoistable(instance);\n setInitialProperties(instance, \"style\", styleProps);\n insertStylesheet(instance, props.precedence, hoistableRoot);\n return (resource.instance = instance);\n case \"stylesheet\":\n styleProps = getStyleKey(props.href);\n var instance$249 = hoistableRoot.querySelector(\n getStylesheetSelectorFromKey(styleProps)\n );\n if (instance$249)\n return (\n (resource.state.loading |= 4),\n (resource.instance = instance$249),\n markNodeAsHoistable(instance$249),\n instance$249\n );\n instance = stylesheetPropsFromRawProps(props);\n (styleProps = preloadPropsMap.get(styleProps)) &&\n adoptPreloadPropsForStylesheet(instance, styleProps);\n instance$249 = (\n hoistableRoot.ownerDocument || hoistableRoot\n ).createElement(\"link\");\n markNodeAsHoistable(instance$249);\n var linkInstance = instance$249;\n linkInstance._p = new Promise(function (resolve, reject) {\n linkInstance.onload = resolve;\n linkInstance.onerror = reject;\n });\n setInitialProperties(instance$249, \"link\", instance);\n resource.state.loading |= 4;\n insertStylesheet(instance$249, props.precedence, hoistableRoot);\n return (resource.instance = instance$249);\n case \"script\":\n instance$249 = getScriptKey(props.src);\n if (\n (styleProps = hoistableRoot.querySelector(\n getScriptSelectorFromKey(instance$249)\n ))\n )\n return (\n (resource.instance = styleProps),\n markNodeAsHoistable(styleProps),\n styleProps\n );\n instance = props;\n if ((styleProps = preloadPropsMap.get(instance$249)))\n (instance = assign({}, props)),\n adoptPreloadPropsForScript(instance, styleProps);\n hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n styleProps = hoistableRoot.createElement(\"script\");\n markNodeAsHoistable(styleProps);\n setInitialProperties(styleProps, \"link\", instance);\n hoistableRoot.head.appendChild(styleProps);\n return (resource.instance = styleProps);\n case \"void\":\n return null;\n default:\n throw Error(formatProdErrorMessage(443, resource.type));\n }\n else\n \"stylesheet\" === resource.type &&\n 0 === (resource.state.loading & 4) &&\n ((instance = resource.instance),\n (resource.state.loading |= 4),\n insertStylesheet(instance, props.precedence, hoistableRoot));\n return resource.instance;\n}\nfunction insertStylesheet(instance, precedence, root) {\n for (\n var nodes = root.querySelectorAll(\n 'link[rel=\"stylesheet\"][data-precedence],style[data-precedence]'\n ),\n last = nodes.length ? nodes[nodes.length - 1] : null,\n prior = last,\n i = 0;\n i < nodes.length;\n i++\n ) {\n var node = nodes[i];\n if (node.dataset.precedence === precedence) prior = node;\n else if (prior !== last) break;\n }\n prior\n ? prior.parentNode.insertBefore(instance, prior.nextSibling)\n : ((precedence = 9 === root.nodeType ? root.head : root),\n precedence.insertBefore(instance, precedence.firstChild));\n}\nfunction adoptPreloadPropsForStylesheet(stylesheetProps, preloadProps) {\n null == stylesheetProps.crossOrigin &&\n (stylesheetProps.crossOrigin = preloadProps.crossOrigin);\n null == stylesheetProps.referrerPolicy &&\n (stylesheetProps.referrerPolicy = preloadProps.referrerPolicy);\n null == stylesheetProps.title && (stylesheetProps.title = preloadProps.title);\n}\nfunction adoptPreloadPropsForScript(scriptProps, preloadProps) {\n null == scriptProps.crossOrigin &&\n (scriptProps.crossOrigin = preloadProps.crossOrigin);\n null == scriptProps.referrerPolicy &&\n (scriptProps.referrerPolicy = preloadProps.referrerPolicy);\n null == scriptProps.integrity &&\n (scriptProps.integrity = preloadProps.integrity);\n}\nvar tagCaches = null;\nfunction getHydratableHoistableCache(type, keyAttribute, ownerDocument) {\n if (null === tagCaches) {\n var cache = new Map();\n var caches = (tagCaches = new Map());\n caches.set(ownerDocument, cache);\n } else\n (caches = tagCaches),\n (cache = caches.get(ownerDocument)),\n cache || ((cache = new Map()), caches.set(ownerDocument, cache));\n if (cache.has(type)) return cache;\n cache.set(type, null);\n ownerDocument = ownerDocument.getElementsByTagName(type);\n for (caches = 0; caches < ownerDocument.length; caches++) {\n var node = ownerDocument[caches];\n if (\n !(\n node[internalHoistableMarker] ||\n node[internalInstanceKey] ||\n (\"link\" === type && \"stylesheet\" === node.getAttribute(\"rel\"))\n ) &&\n \"http://www.w3.org/2000/svg\" !== node.namespaceURI\n ) {\n var nodeKey = node.getAttribute(keyAttribute) || \"\";\n nodeKey = type + nodeKey;\n var existing = cache.get(nodeKey);\n existing ? existing.push(node) : cache.set(nodeKey, [node]);\n }\n }\n return cache;\n}\nfunction mountHoistable(hoistableRoot, type, instance) {\n hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n hoistableRoot.head.insertBefore(\n instance,\n \"title\" === type ? hoistableRoot.querySelector(\"head > title\") : null\n );\n}\nfunction isHostHoistableType(type, props, hostContext) {\n if (1 === hostContext || null != props.itemProp) return !1;\n switch (type) {\n case \"meta\":\n case \"title\":\n return !0;\n case \"style\":\n if (\n \"string\" !== typeof props.precedence ||\n \"string\" !== typeof props.href ||\n \"\" === props.href\n )\n break;\n return !0;\n case \"link\":\n if (\n \"string\" !== typeof props.rel ||\n \"string\" !== typeof props.href ||\n \"\" === props.href ||\n props.onLoad ||\n props.onError\n )\n break;\n switch (props.rel) {\n case \"stylesheet\":\n return (\n (type = props.disabled),\n \"string\" === typeof props.precedence && null == type\n );\n default:\n return !0;\n }\n case \"script\":\n if (\n props.async &&\n \"function\" !== typeof props.async &&\n \"symbol\" !== typeof props.async &&\n !props.onLoad &&\n !props.onError &&\n props.src &&\n \"string\" === typeof props.src\n )\n return !0;\n }\n return !1;\n}\nfunction preloadResource(resource) {\n return \"stylesheet\" === resource.type && 0 === (resource.state.loading & 3)\n ? !1\n : !0;\n}\nfunction suspendResource(state, hoistableRoot, resource, props) {\n if (\n \"stylesheet\" === resource.type &&\n (\"string\" !== typeof props.media ||\n !1 !== matchMedia(props.media).matches) &&\n 0 === (resource.state.loading & 4)\n ) {\n if (null === resource.instance) {\n var key = getStyleKey(props.href),\n instance = hoistableRoot.querySelector(\n getStylesheetSelectorFromKey(key)\n );\n if (instance) {\n hoistableRoot = instance._p;\n null !== hoistableRoot &&\n \"object\" === typeof hoistableRoot &&\n \"function\" === typeof hoistableRoot.then &&\n (state.count++,\n (state = onUnsuspend.bind(state)),\n hoistableRoot.then(state, state));\n resource.state.loading |= 4;\n resource.instance = instance;\n markNodeAsHoistable(instance);\n return;\n }\n instance = hoistableRoot.ownerDocument || hoistableRoot;\n props = stylesheetPropsFromRawProps(props);\n (key = preloadPropsMap.get(key)) &&\n adoptPreloadPropsForStylesheet(props, key);\n instance = instance.createElement(\"link\");\n markNodeAsHoistable(instance);\n var linkInstance = instance;\n linkInstance._p = new Promise(function (resolve, reject) {\n linkInstance.onload = resolve;\n linkInstance.onerror = reject;\n });\n setInitialProperties(instance, \"link\", props);\n resource.instance = instance;\n }\n null === state.stylesheets && (state.stylesheets = new Map());\n state.stylesheets.set(resource, hoistableRoot);\n (hoistableRoot = resource.state.preload) &&\n 0 === (resource.state.loading & 3) &&\n (state.count++,\n (resource = onUnsuspend.bind(state)),\n hoistableRoot.addEventListener(\"load\", resource),\n hoistableRoot.addEventListener(\"error\", resource));\n }\n}\nvar estimatedBytesWithinLimit = 0;\nfunction waitForCommitToBeReady(state, timeoutOffset) {\n state.stylesheets &&\n 0 === state.count &&\n insertSuspendedStylesheets(state, state.stylesheets);\n return 0 < state.count || 0 < state.imgCount\n ? function (commit) {\n var stylesheetTimer = setTimeout(function () {\n state.stylesheets &&\n insertSuspendedStylesheets(state, state.stylesheets);\n if (state.unsuspend) {\n var unsuspend = state.unsuspend;\n state.unsuspend = null;\n unsuspend();\n }\n }, 6e4 + timeoutOffset);\n 0 < state.imgBytes &&\n 0 === estimatedBytesWithinLimit &&\n (estimatedBytesWithinLimit = 62500 * estimateBandwidth());\n var imgTimer = setTimeout(\n function () {\n state.waitingForImages = !1;\n if (\n 0 === state.count &&\n (state.stylesheets &&\n insertSuspendedStylesheets(state, state.stylesheets),\n state.unsuspend)\n ) {\n var unsuspend = state.unsuspend;\n state.unsuspend = null;\n unsuspend();\n }\n },\n (state.imgBytes > estimatedBytesWithinLimit ? 50 : 800) +\n timeoutOffset\n );\n state.unsuspend = commit;\n return function () {\n state.unsuspend = null;\n clearTimeout(stylesheetTimer);\n clearTimeout(imgTimer);\n };\n }\n : null;\n}\nfunction onUnsuspend() {\n this.count--;\n if (0 === this.count && (0 === this.imgCount || !this.waitingForImages))\n if (this.stylesheets) insertSuspendedStylesheets(this, this.stylesheets);\n else if (this.unsuspend) {\n var unsuspend = this.unsuspend;\n this.unsuspend = null;\n unsuspend();\n }\n}\nvar precedencesByRoot = null;\nfunction insertSuspendedStylesheets(state, resources) {\n state.stylesheets = null;\n null !== state.unsuspend &&\n (state.count++,\n (precedencesByRoot = new Map()),\n resources.forEach(insertStylesheetIntoRoot, state),\n (precedencesByRoot = null),\n onUnsuspend.call(state));\n}\nfunction insertStylesheetIntoRoot(root, resource) {\n if (!(resource.state.loading & 4)) {\n var precedences = precedencesByRoot.get(root);\n if (precedences) var last = precedences.get(null);\n else {\n precedences = new Map();\n precedencesByRoot.set(root, precedences);\n for (\n var nodes = root.querySelectorAll(\n \"link[data-precedence],style[data-precedence]\"\n ),\n i = 0;\n i < nodes.length;\n i++\n ) {\n var node = nodes[i];\n if (\n \"LINK\" === node.nodeName ||\n \"not all\" !== node.getAttribute(\"media\")\n )\n precedences.set(node.dataset.precedence, node), (last = node);\n }\n last && precedences.set(null, last);\n }\n nodes = resource.instance;\n node = nodes.getAttribute(\"data-precedence\");\n i = precedences.get(node) || last;\n i === last && precedences.set(null, nodes);\n precedences.set(node, nodes);\n this.count++;\n last = onUnsuspend.bind(this);\n nodes.addEventListener(\"load\", last);\n nodes.addEventListener(\"error\", last);\n i\n ? i.parentNode.insertBefore(nodes, i.nextSibling)\n : ((root = 9 === root.nodeType ? root.head : root),\n root.insertBefore(nodes, root.firstChild));\n resource.state.loading |= 4;\n }\n}\nvar HostTransitionContext = {\n $$typeof: REACT_CONTEXT_TYPE,\n Provider: null,\n Consumer: null,\n _currentValue: sharedNotPendingObject,\n _currentValue2: sharedNotPendingObject,\n _threadCount: 0\n};\nfunction FiberRootNode(\n containerInfo,\n tag,\n hydrate,\n identifierPrefix,\n onUncaughtError,\n onCaughtError,\n onRecoverableError,\n onDefaultTransitionIndicator,\n formState\n) {\n this.tag = 1;\n this.containerInfo = containerInfo;\n this.pingCache = this.current = this.pendingChildren = null;\n this.timeoutHandle = -1;\n this.callbackNode =\n this.next =\n this.pendingContext =\n this.context =\n this.cancelPendingCommit =\n null;\n this.callbackPriority = 0;\n this.expirationTimes = createLaneMap(-1);\n this.entangledLanes =\n this.shellSuspendCounter =\n this.errorRecoveryDisabledLanes =\n this.expiredLanes =\n this.warmLanes =\n this.pingedLanes =\n this.suspendedLanes =\n this.pendingLanes =\n 0;\n this.entanglements = createLaneMap(0);\n this.hiddenUpdates = createLaneMap(null);\n this.identifierPrefix = identifierPrefix;\n this.onUncaughtError = onUncaughtError;\n this.onCaughtError = onCaughtError;\n this.onRecoverableError = onRecoverableError;\n this.pooledCache = null;\n this.pooledCacheLanes = 0;\n this.formState = formState;\n this.incompleteTransitions = new Map();\n}\nfunction createFiberRoot(\n containerInfo,\n tag,\n hydrate,\n initialChildren,\n hydrationCallbacks,\n isStrictMode,\n identifierPrefix,\n formState,\n onUncaughtError,\n onCaughtError,\n onRecoverableError,\n onDefaultTransitionIndicator\n) {\n containerInfo = new FiberRootNode(\n containerInfo,\n tag,\n hydrate,\n identifierPrefix,\n onUncaughtError,\n onCaughtError,\n onRecoverableError,\n onDefaultTransitionIndicator,\n formState\n );\n tag = 1;\n !0 === isStrictMode && (tag |= 24);\n isStrictMode = createFiberImplClass(3, null, null, tag);\n containerInfo.current = isStrictMode;\n isStrictMode.stateNode = containerInfo;\n tag = createCache();\n tag.refCount++;\n containerInfo.pooledCache = tag;\n tag.refCount++;\n isStrictMode.memoizedState = {\n element: initialChildren,\n isDehydrated: hydrate,\n cache: tag\n };\n initializeUpdateQueue(isStrictMode);\n return containerInfo;\n}\nfunction getContextForSubtree(parentComponent) {\n if (!parentComponent) return emptyContextObject;\n parentComponent = emptyContextObject;\n return parentComponent;\n}\nfunction updateContainerImpl(\n rootFiber,\n lane,\n element,\n container,\n parentComponent,\n callback\n) {\n parentComponent = getContextForSubtree(parentComponent);\n null === container.context\n ? (container.context = parentComponent)\n : (container.pendingContext = parentComponent);\n container = createUpdate(lane);\n container.payload = { element: element };\n callback = void 0 === callback ? null : callback;\n null !== callback && (container.callback = callback);\n element = enqueueUpdate(rootFiber, container, lane);\n null !== element &&\n (scheduleUpdateOnFiber(element, rootFiber, lane),\n entangleTransitions(element, rootFiber, lane));\n}\nfunction markRetryLaneImpl(fiber, retryLane) {\n fiber = fiber.memoizedState;\n if (null !== fiber && null !== fiber.dehydrated) {\n var a = fiber.retryLane;\n fiber.retryLane = 0 !== a && a < retryLane ? a : retryLane;\n }\n}\nfunction markRetryLaneIfNotHydrated(fiber, retryLane) {\n markRetryLaneImpl(fiber, retryLane);\n (fiber = fiber.alternate) && markRetryLaneImpl(fiber, retryLane);\n}\nfunction attemptContinuousHydration(fiber) {\n if (13 === fiber.tag || 31 === fiber.tag) {\n var root = enqueueConcurrentRenderForLane(fiber, 67108864);\n null !== root && scheduleUpdateOnFiber(root, fiber, 67108864);\n markRetryLaneIfNotHydrated(fiber, 67108864);\n }\n}\nfunction attemptHydrationAtCurrentPriority(fiber) {\n if (13 === fiber.tag || 31 === fiber.tag) {\n var lane = requestUpdateLane();\n lane = getBumpedLaneForHydrationByLane(lane);\n var root = enqueueConcurrentRenderForLane(fiber, lane);\n null !== root && scheduleUpdateOnFiber(root, fiber, lane);\n markRetryLaneIfNotHydrated(fiber, lane);\n }\n}\nvar _enabled = !0;\nfunction dispatchDiscreteEvent(\n domEventName,\n eventSystemFlags,\n container,\n nativeEvent\n) {\n var prevTransition = ReactSharedInternals.T;\n ReactSharedInternals.T = null;\n var previousPriority = ReactDOMSharedInternals.p;\n try {\n (ReactDOMSharedInternals.p = 2),\n dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);\n } finally {\n (ReactDOMSharedInternals.p = previousPriority),\n (ReactSharedInternals.T = prevTransition);\n }\n}\nfunction dispatchContinuousEvent(\n domEventName,\n eventSystemFlags,\n container,\n nativeEvent\n) {\n var prevTransition = ReactSharedInternals.T;\n ReactSharedInternals.T = null;\n var previousPriority = ReactDOMSharedInternals.p;\n try {\n (ReactDOMSharedInternals.p = 8),\n dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);\n } finally {\n (ReactDOMSharedInternals.p = previousPriority),\n (ReactSharedInternals.T = prevTransition);\n }\n}\nfunction dispatchEvent(\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n) {\n if (_enabled) {\n var blockedOn = findInstanceBlockingEvent(nativeEvent);\n if (null === blockedOn)\n dispatchEventForPluginEventSystem(\n domEventName,\n eventSystemFlags,\n nativeEvent,\n return_targetInst,\n targetContainer\n ),\n clearIfContinuousEvent(domEventName, nativeEvent);\n else if (\n queueIfContinuousEvent(\n blockedOn,\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n )\n )\n nativeEvent.stopPropagation();\n else if (\n (clearIfContinuousEvent(domEventName, nativeEvent),\n eventSystemFlags & 4 &&\n -1 < discreteReplayableEvents.indexOf(domEventName))\n ) {\n for (; null !== blockedOn; ) {\n var fiber = getInstanceFromNode(blockedOn);\n if (null !== fiber)\n switch (fiber.tag) {\n case 3:\n fiber = fiber.stateNode;\n if (fiber.current.memoizedState.isDehydrated) {\n var lanes = getHighestPriorityLanes(fiber.pendingLanes);\n if (0 !== lanes) {\n var root = fiber;\n root.pendingLanes |= 2;\n for (root.entangledLanes |= 2; lanes; ) {\n var lane = 1 << (31 - clz32(lanes));\n root.entanglements[1] |= lane;\n lanes &= ~lane;\n }\n ensureRootIsScheduled(fiber);\n 0 === (executionContext & 6) &&\n ((workInProgressRootRenderTargetTime = now() + 500),\n flushSyncWorkAcrossRoots_impl(0, !1));\n }\n }\n break;\n case 31:\n case 13:\n (root = enqueueConcurrentRenderForLane(fiber, 2)),\n null !== root && scheduleUpdateOnFiber(root, fiber, 2),\n flushSyncWork$1(),\n markRetryLaneIfNotHydrated(fiber, 2);\n }\n fiber = findInstanceBlockingEvent(nativeEvent);\n null === fiber &&\n dispatchEventForPluginEventSystem(\n domEventName,\n eventSystemFlags,\n nativeEvent,\n return_targetInst,\n targetContainer\n );\n if (fiber === blockedOn) break;\n blockedOn = fiber;\n }\n null !== blockedOn && nativeEvent.stopPropagation();\n } else\n dispatchEventForPluginEventSystem(\n domEventName,\n eventSystemFlags,\n nativeEvent,\n null,\n targetContainer\n );\n }\n}\nfunction findInstanceBlockingEvent(nativeEvent) {\n nativeEvent = getEventTarget(nativeEvent);\n return findInstanceBlockingTarget(nativeEvent);\n}\nvar return_targetInst = null;\nfunction findInstanceBlockingTarget(targetNode) {\n return_targetInst = null;\n targetNode = getClosestInstanceFromNode(targetNode);\n if (null !== targetNode) {\n var nearestMounted = getNearestMountedFiber(targetNode);\n if (null === nearestMounted) targetNode = null;\n else {\n var tag = nearestMounted.tag;\n if (13 === tag) {\n targetNode = getSuspenseInstanceFromFiber(nearestMounted);\n if (null !== targetNode) return targetNode;\n targetNode = null;\n } else if (31 === tag) {\n targetNode = getActivityInstanceFromFiber(nearestMounted);\n if (null !== targetNode) return targetNode;\n targetNode = null;\n } else if (3 === tag) {\n if (nearestMounted.stateNode.current.memoizedState.isDehydrated)\n return 3 === nearestMounted.tag\n ? nearestMounted.stateNode.containerInfo\n : null;\n targetNode = null;\n } else nearestMounted !== targetNode && (targetNode = null);\n }\n }\n return_targetInst = targetNode;\n return null;\n}\nfunction getEventPriority(domEventName) {\n switch (domEventName) {\n case \"beforetoggle\":\n case \"cancel\":\n case \"click\":\n case \"close\":\n case \"contextmenu\":\n case \"copy\":\n case \"cut\":\n case \"auxclick\":\n case \"dblclick\":\n case \"dragend\":\n case \"dragstart\":\n case \"drop\":\n case \"focusin\":\n case \"focusout\":\n case \"input\":\n case \"invalid\":\n case \"keydown\":\n case \"keypress\":\n case \"keyup\":\n case \"mousedown\":\n case \"mouseup\":\n case \"paste\":\n case \"pause\":\n case \"play\":\n case \"pointercancel\":\n case \"pointerdown\":\n case \"pointerup\":\n case \"ratechange\":\n case \"reset\":\n case \"resize\":\n case \"seeked\":\n case \"submit\":\n case \"toggle\":\n case \"touchcancel\":\n case \"touchend\":\n case \"touchstart\":\n case \"volumechange\":\n case \"change\":\n case \"selectionchange\":\n case \"textInput\":\n case \"compositionstart\":\n case \"compositionend\":\n case \"compositionupdate\":\n case \"beforeblur\":\n case \"afterblur\":\n case \"beforeinput\":\n case \"blur\":\n case \"fullscreenchange\":\n case \"focus\":\n case \"hashchange\":\n case \"popstate\":\n case \"select\":\n case \"selectstart\":\n return 2;\n case \"drag\":\n case \"dragenter\":\n case \"dragexit\":\n case \"dragleave\":\n case \"dragover\":\n case \"mousemove\":\n case \"mouseout\":\n case \"mouseover\":\n case \"pointermove\":\n case \"pointerout\":\n case \"pointerover\":\n case \"scroll\":\n case \"touchmove\":\n case \"wheel\":\n case \"mouseenter\":\n case \"mouseleave\":\n case \"pointerenter\":\n case \"pointerleave\":\n return 8;\n case \"message\":\n switch (getCurrentPriorityLevel()) {\n case ImmediatePriority:\n return 2;\n case UserBlockingPriority:\n return 8;\n case NormalPriority$1:\n case LowPriority:\n return 32;\n case IdlePriority:\n return 268435456;\n default:\n return 32;\n }\n default:\n return 32;\n }\n}\nvar hasScheduledReplayAttempt = !1,\n queuedFocus = null,\n queuedDrag = null,\n queuedMouse = null,\n queuedPointers = new Map(),\n queuedPointerCaptures = new Map(),\n queuedExplicitHydrationTargets = [],\n discreteReplayableEvents =\n \"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset\".split(\n \" \"\n );\nfunction clearIfContinuousEvent(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"focusin\":\n case \"focusout\":\n queuedFocus = null;\n break;\n case \"dragenter\":\n case \"dragleave\":\n queuedDrag = null;\n break;\n case \"mouseover\":\n case \"mouseout\":\n queuedMouse = null;\n break;\n case \"pointerover\":\n case \"pointerout\":\n queuedPointers.delete(nativeEvent.pointerId);\n break;\n case \"gotpointercapture\":\n case \"lostpointercapture\":\n queuedPointerCaptures.delete(nativeEvent.pointerId);\n }\n}\nfunction accumulateOrCreateContinuousQueuedReplayableEvent(\n existingQueuedEvent,\n blockedOn,\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n) {\n if (\n null === existingQueuedEvent ||\n existingQueuedEvent.nativeEvent !== nativeEvent\n )\n return (\n (existingQueuedEvent = {\n blockedOn: blockedOn,\n domEventName: domEventName,\n eventSystemFlags: eventSystemFlags,\n nativeEvent: nativeEvent,\n targetContainers: [targetContainer]\n }),\n null !== blockedOn &&\n ((blockedOn = getInstanceFromNode(blockedOn)),\n null !== blockedOn && attemptContinuousHydration(blockedOn)),\n existingQueuedEvent\n );\n existingQueuedEvent.eventSystemFlags |= eventSystemFlags;\n blockedOn = existingQueuedEvent.targetContainers;\n null !== targetContainer &&\n -1 === blockedOn.indexOf(targetContainer) &&\n blockedOn.push(targetContainer);\n return existingQueuedEvent;\n}\nfunction queueIfContinuousEvent(\n blockedOn,\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n) {\n switch (domEventName) {\n case \"focusin\":\n return (\n (queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(\n queuedFocus,\n blockedOn,\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n )),\n !0\n );\n case \"dragenter\":\n return (\n (queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(\n queuedDrag,\n blockedOn,\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n )),\n !0\n );\n case \"mouseover\":\n return (\n (queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(\n queuedMouse,\n blockedOn,\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n )),\n !0\n );\n case \"pointerover\":\n var pointerId = nativeEvent.pointerId;\n queuedPointers.set(\n pointerId,\n accumulateOrCreateContinuousQueuedReplayableEvent(\n queuedPointers.get(pointerId) || null,\n blockedOn,\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n )\n );\n return !0;\n case \"gotpointercapture\":\n return (\n (pointerId = nativeEvent.pointerId),\n queuedPointerCaptures.set(\n pointerId,\n accumulateOrCreateContinuousQueuedReplayableEvent(\n queuedPointerCaptures.get(pointerId) || null,\n blockedOn,\n domEventName,\n eventSystemFlags,\n targetContainer,\n nativeEvent\n )\n ),\n !0\n );\n }\n return !1;\n}\nfunction attemptExplicitHydrationTarget(queuedTarget) {\n var targetInst = getClosestInstanceFromNode(queuedTarget.target);\n if (null !== targetInst) {\n var nearestMounted = getNearestMountedFiber(targetInst);\n if (null !== nearestMounted)\n if (((targetInst = nearestMounted.tag), 13 === targetInst)) {\n if (\n ((targetInst = getSuspenseInstanceFromFiber(nearestMounted)),\n null !== targetInst)\n ) {\n queuedTarget.blockedOn = targetInst;\n runWithPriority(queuedTarget.priority, function () {\n attemptHydrationAtCurrentPriority(nearestMounted);\n });\n return;\n }\n } else if (31 === targetInst) {\n if (\n ((targetInst = getActivityInstanceFromFiber(nearestMounted)),\n null !== targetInst)\n ) {\n queuedTarget.blockedOn = targetInst;\n runWithPriority(queuedTarget.priority, function () {\n attemptHydrationAtCurrentPriority(nearestMounted);\n });\n return;\n }\n } else if (\n 3 === targetInst &&\n nearestMounted.stateNode.current.memoizedState.isDehydrated\n ) {\n queuedTarget.blockedOn =\n 3 === nearestMounted.tag\n ? nearestMounted.stateNode.containerInfo\n : null;\n return;\n }\n }\n queuedTarget.blockedOn = null;\n}\nfunction attemptReplayContinuousQueuedEvent(queuedEvent) {\n if (null !== queuedEvent.blockedOn) return !1;\n for (\n var targetContainers = queuedEvent.targetContainers;\n 0 < targetContainers.length;\n\n ) {\n var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.nativeEvent);\n if (null === nextBlockedOn) {\n nextBlockedOn = queuedEvent.nativeEvent;\n var nativeEventClone = new nextBlockedOn.constructor(\n nextBlockedOn.type,\n nextBlockedOn\n );\n currentReplayingEvent = nativeEventClone;\n nextBlockedOn.target.dispatchEvent(nativeEventClone);\n currentReplayingEvent = null;\n } else\n return (\n (targetContainers = getInstanceFromNode(nextBlockedOn)),\n null !== targetContainers &&\n attemptContinuousHydration(targetContainers),\n (queuedEvent.blockedOn = nextBlockedOn),\n !1\n );\n targetContainers.shift();\n }\n return !0;\n}\nfunction attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {\n attemptReplayContinuousQueuedEvent(queuedEvent) && map.delete(key);\n}\nfunction replayUnblockedEvents() {\n hasScheduledReplayAttempt = !1;\n null !== queuedFocus &&\n attemptReplayContinuousQueuedEvent(queuedFocus) &&\n (queuedFocus = null);\n null !== queuedDrag &&\n attemptReplayContinuousQueuedEvent(queuedDrag) &&\n (queuedDrag = null);\n null !== queuedMouse &&\n attemptReplayContinuousQueuedEvent(queuedMouse) &&\n (queuedMouse = null);\n queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);\n queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);\n}\nfunction scheduleCallbackIfUnblocked(queuedEvent, unblocked) {\n queuedEvent.blockedOn === unblocked &&\n ((queuedEvent.blockedOn = null),\n hasScheduledReplayAttempt ||\n ((hasScheduledReplayAttempt = !0),\n Scheduler.unstable_scheduleCallback(\n Scheduler.unstable_NormalPriority,\n replayUnblockedEvents\n )));\n}\nvar lastScheduledReplayQueue = null;\nfunction scheduleReplayQueueIfNeeded(formReplayingQueue) {\n lastScheduledReplayQueue !== formReplayingQueue &&\n ((lastScheduledReplayQueue = formReplayingQueue),\n Scheduler.unstable_scheduleCallback(\n Scheduler.unstable_NormalPriority,\n function () {\n lastScheduledReplayQueue === formReplayingQueue &&\n (lastScheduledReplayQueue = null);\n for (var i = 0; i < formReplayingQueue.length; i += 3) {\n var form = formReplayingQueue[i],\n submitterOrAction = formReplayingQueue[i + 1],\n formData = formReplayingQueue[i + 2];\n if (\"function\" !== typeof submitterOrAction)\n if (null === findInstanceBlockingTarget(submitterOrAction || form))\n continue;\n else break;\n var formInst = getInstanceFromNode(form);\n null !== formInst &&\n (formReplayingQueue.splice(i, 3),\n (i -= 3),\n startHostTransition(\n formInst,\n {\n pending: !0,\n data: formData,\n method: form.method,\n action: submitterOrAction\n },\n submitterOrAction,\n formData\n ));\n }\n }\n ));\n}\nfunction retryIfBlockedOn(unblocked) {\n function unblock(queuedEvent) {\n return scheduleCallbackIfUnblocked(queuedEvent, unblocked);\n }\n null !== queuedFocus && scheduleCallbackIfUnblocked(queuedFocus, unblocked);\n null !== queuedDrag && scheduleCallbackIfUnblocked(queuedDrag, unblocked);\n null !== queuedMouse && scheduleCallbackIfUnblocked(queuedMouse, unblocked);\n queuedPointers.forEach(unblock);\n queuedPointerCaptures.forEach(unblock);\n for (var i = 0; i < queuedExplicitHydrationTargets.length; i++) {\n var queuedTarget = queuedExplicitHydrationTargets[i];\n queuedTarget.blockedOn === unblocked && (queuedTarget.blockedOn = null);\n }\n for (\n ;\n 0 < queuedExplicitHydrationTargets.length &&\n ((i = queuedExplicitHydrationTargets[0]), null === i.blockedOn);\n\n )\n attemptExplicitHydrationTarget(i),\n null === i.blockedOn && queuedExplicitHydrationTargets.shift();\n i = (unblocked.ownerDocument || unblocked).$$reactFormReplay;\n if (null != i)\n for (queuedTarget = 0; queuedTarget < i.length; queuedTarget += 3) {\n var form = i[queuedTarget],\n submitterOrAction = i[queuedTarget + 1],\n formProps = form[internalPropsKey] || null;\n if (\"function\" === typeof submitterOrAction)\n formProps || scheduleReplayQueueIfNeeded(i);\n else if (formProps) {\n var action = null;\n if (submitterOrAction && submitterOrAction.hasAttribute(\"formAction\"))\n if (\n ((form = submitterOrAction),\n (formProps = submitterOrAction[internalPropsKey] || null))\n )\n action = formProps.formAction;\n else {\n if (null !== findInstanceBlockingTarget(form)) continue;\n }\n else action = formProps.action;\n \"function\" === typeof action\n ? (i[queuedTarget + 1] = action)\n : (i.splice(queuedTarget, 3), (queuedTarget -= 3));\n scheduleReplayQueueIfNeeded(i);\n }\n }\n}\nfunction defaultOnDefaultTransitionIndicator() {\n function handleNavigate(event) {\n event.canIntercept &&\n \"react-transition\" === event.info &&\n event.intercept({\n handler: function () {\n return new Promise(function (resolve) {\n return (pendingResolve = resolve);\n });\n },\n focusReset: \"manual\",\n scroll: \"manual\"\n });\n }\n function handleNavigateComplete() {\n null !== pendingResolve && (pendingResolve(), (pendingResolve = null));\n isCancelled || setTimeout(startFakeNavigation, 20);\n }\n function startFakeNavigation() {\n if (!isCancelled && !navigation.transition) {\n var currentEntry = navigation.currentEntry;\n currentEntry &&\n null != currentEntry.url &&\n navigation.navigate(currentEntry.url, {\n state: currentEntry.getState(),\n info: \"react-transition\",\n history: \"replace\"\n });\n }\n }\n if (\"object\" === typeof navigation) {\n var isCancelled = !1,\n pendingResolve = null;\n navigation.addEventListener(\"navigate\", handleNavigate);\n navigation.addEventListener(\"navigatesuccess\", handleNavigateComplete);\n navigation.addEventListener(\"navigateerror\", handleNavigateComplete);\n setTimeout(startFakeNavigation, 100);\n return function () {\n isCancelled = !0;\n navigation.removeEventListener(\"navigate\", handleNavigate);\n navigation.removeEventListener(\"navigatesuccess\", handleNavigateComplete);\n navigation.removeEventListener(\"navigateerror\", handleNavigateComplete);\n null !== pendingResolve && (pendingResolve(), (pendingResolve = null));\n };\n }\n}\nfunction ReactDOMRoot(internalRoot) {\n this._internalRoot = internalRoot;\n}\nReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render =\n function (children) {\n var root = this._internalRoot;\n if (null === root) throw Error(formatProdErrorMessage(409));\n var current = root.current,\n lane = requestUpdateLane();\n updateContainerImpl(current, lane, children, root, null, null);\n };\nReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount =\n function () {\n var root = this._internalRoot;\n if (null !== root) {\n this._internalRoot = null;\n var container = root.containerInfo;\n updateContainerImpl(root.current, 2, null, root, null, null);\n flushSyncWork$1();\n container[internalContainerInstanceKey] = null;\n }\n };\nfunction ReactDOMHydrationRoot(internalRoot) {\n this._internalRoot = internalRoot;\n}\nReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {\n if (target) {\n var updatePriority = resolveUpdatePriority();\n target = { blockedOn: null, target: target, priority: updatePriority };\n for (\n var i = 0;\n i < queuedExplicitHydrationTargets.length &&\n 0 !== updatePriority &&\n updatePriority < queuedExplicitHydrationTargets[i].priority;\n i++\n );\n queuedExplicitHydrationTargets.splice(i, 0, target);\n 0 === i && attemptExplicitHydrationTarget(target);\n }\n};\nvar isomorphicReactPackageVersion$jscomp$inline_1840 = React.version;\nif (\n \"19.2.7\" !==\n isomorphicReactPackageVersion$jscomp$inline_1840\n)\n throw Error(\n formatProdErrorMessage(\n 527,\n isomorphicReactPackageVersion$jscomp$inline_1840,\n \"19.2.7\"\n )\n );\nReactDOMSharedInternals.findDOMNode = function (componentOrElement) {\n var fiber = componentOrElement._reactInternals;\n if (void 0 === fiber) {\n if (\"function\" === typeof componentOrElement.render)\n throw Error(formatProdErrorMessage(188));\n componentOrElement = Object.keys(componentOrElement).join(\",\");\n throw Error(formatProdErrorMessage(268, componentOrElement));\n }\n componentOrElement = findCurrentFiberUsingSlowPath(fiber);\n componentOrElement =\n null !== componentOrElement\n ? findCurrentHostFiberImpl(componentOrElement)\n : null;\n componentOrElement =\n null === componentOrElement ? null : componentOrElement.stateNode;\n return componentOrElement;\n};\nvar internals$jscomp$inline_2347 = {\n bundleType: 0,\n version: \"19.2.7\",\n rendererPackageName: \"react-dom\",\n currentDispatcherRef: ReactSharedInternals,\n reconcilerVersion: \"19.2.7\"\n};\nif (\"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {\n var hook$jscomp$inline_2348 = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (\n !hook$jscomp$inline_2348.isDisabled &&\n hook$jscomp$inline_2348.supportsFiber\n )\n try {\n (rendererID = hook$jscomp$inline_2348.inject(\n internals$jscomp$inline_2347\n )),\n (injectedHook = hook$jscomp$inline_2348);\n } catch (err) {}\n}\nexports.createRoot = function (container, options) {\n if (!isValidContainer(container)) throw Error(formatProdErrorMessage(299));\n var isStrictMode = !1,\n identifierPrefix = \"\",\n onUncaughtError = defaultOnUncaughtError,\n onCaughtError = defaultOnCaughtError,\n onRecoverableError = defaultOnRecoverableError;\n null !== options &&\n void 0 !== options &&\n (!0 === options.unstable_strictMode && (isStrictMode = !0),\n void 0 !== options.identifierPrefix &&\n (identifierPrefix = options.identifierPrefix),\n void 0 !== options.onUncaughtError &&\n (onUncaughtError = options.onUncaughtError),\n void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError),\n void 0 !== options.onRecoverableError &&\n (onRecoverableError = options.onRecoverableError));\n options = createFiberRoot(\n container,\n 1,\n !1,\n null,\n null,\n isStrictMode,\n identifierPrefix,\n null,\n onUncaughtError,\n onCaughtError,\n onRecoverableError,\n defaultOnDefaultTransitionIndicator\n );\n container[internalContainerInstanceKey] = options.current;\n listenToAllSupportedEvents(container);\n return new ReactDOMRoot(options);\n};\nexports.hydrateRoot = function (container, initialChildren, options) {\n if (!isValidContainer(container)) throw Error(formatProdErrorMessage(299));\n var isStrictMode = !1,\n identifierPrefix = \"\",\n onUncaughtError = defaultOnUncaughtError,\n onCaughtError = defaultOnCaughtError,\n onRecoverableError = defaultOnRecoverableError,\n formState = null;\n null !== options &&\n void 0 !== options &&\n (!0 === options.unstable_strictMode && (isStrictMode = !0),\n void 0 !== options.identifierPrefix &&\n (identifierPrefix = options.identifierPrefix),\n void 0 !== options.onUncaughtError &&\n (onUncaughtError = options.onUncaughtError),\n void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError),\n void 0 !== options.onRecoverableError &&\n (onRecoverableError = options.onRecoverableError),\n void 0 !== options.formState && (formState = options.formState));\n initialChildren = createFiberRoot(\n container,\n 1,\n !0,\n initialChildren,\n null != options ? options : null,\n isStrictMode,\n identifierPrefix,\n formState,\n onUncaughtError,\n onCaughtError,\n onRecoverableError,\n defaultOnDefaultTransitionIndicator\n );\n initialChildren.context = getContextForSubtree(null);\n options = initialChildren.current;\n isStrictMode = requestUpdateLane();\n isStrictMode = getBumpedLaneForHydrationByLane(isStrictMode);\n identifierPrefix = createUpdate(isStrictMode);\n identifierPrefix.callback = null;\n enqueueUpdate(options, identifierPrefix, isStrictMode);\n options = isStrictMode;\n initialChildren.current.lanes = options;\n markRootUpdated$1(initialChildren, options);\n ensureRootIsScheduled(initialChildren);\n container[internalContainerInstanceKey] = initialChildren.current;\n listenToAllSupportedEvents(container);\n return new ReactDOMHydrationRoot(initialChildren);\n};\nexports.version = \"19.2.7\";\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom-client.production.js');\n} else {\n module.exports = require('./cjs/react-dom-client.development.js');\n}\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","/**\n * Typed API client for pi-kot's REST API.\n *\n * All HTTP calls go through this module — components never call fetch() directly.\n */\n\nconst BASE = \"\"; // Same origin via Vite proxy\n\nimport type { SessionContextResponse, McpServersResponse, McpSettingsResponse, McpServerConfig, ToolOverridesResponse } from \"./api-client/types\";\n\n/**\n * Window event dispatched whenever an authenticated request returns 401.\n * The App listens for this to clear auth state and show the login screen.\n */\nexport const UNAUTHORIZED_EVENT = \"pi-kot:unauthorized\";\n\n/**\n * Register a handler that fires on any 401 response.\n * Returns a cleanup function to unsubscribe.\n */\nexport function onUnauthorized(handler: () => void): () => void {\n const fn = (): void => handler();\n window.addEventListener(UNAUTHORIZED_EVENT, fn);\n return () => window.removeEventListener(UNAUTHORIZED_EVENT, fn);\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n message: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nasync function request<T>(\n method: string,\n path: string,\n body?: unknown,\n): Promise<T> {\n const headers: Record<string, string> = {};\n if (body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const token = getStoredToken();\n if (token !== undefined) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n const res = await fetch(`${BASE}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n if (res.status === 204) {\n return undefined as T;\n }\n\n if (res.status === 401) {\n clearStoredToken();\n window.dispatchEvent(new Event(UNAUTHORIZED_EVENT));\n }\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new ApiError(res.status, data.message ?? data.error ?? res.statusText);\n }\n\n return res.json() as Promise<T>;\n}\n\n// ---- Version ----\n\nexport interface VersionResponse {\n serverVersion: string;\n sdkVersion: string;\n}\n\nexport interface VersionCheckResponse {\n serverVersion: string;\n sdkVersion: string;\n latestSdkVersion: string;\n updateAvailable: boolean;\n}\n\nexport async function getVersions(): Promise<VersionResponse> {\n return request<VersionResponse>(\"GET\", \"/api/v1/version\");\n}\n\nexport async function checkSdkUpdate(): Promise<VersionCheckResponse> {\n return request<VersionCheckResponse>(\"GET\", \"/api/v1/version/check-update\");\n}\n\n// ---- Auth ----\n\n\nexport interface HealthResponse {\n status: string;\n activeSessions: number;\n}\n\nexport interface AuthStatusResponse {\n authEnabled: boolean;\n}\n\nexport interface LoginResponse {\n token: string;\n}\n\nexport function getStoredToken(): string | undefined {\n try {\n const t = localStorage.getItem(\"pi-kot/auth-token\");\n return t ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function clearStoredToken(): void {\n try {\n localStorage.removeItem(\"pi-kot/auth-token\");\n } catch {\n // private mode\n }\n}\n\nexport async function fetchHealth(): Promise<HealthResponse> {\n return request<HealthResponse>(\"GET\", \"/api/v1/health\");\n}\n\nexport async function fetchAuthStatus(): Promise<AuthStatusResponse> {\n return request<AuthStatusResponse>(\"GET\", \"/api/v1/auth/status\");\n}\n\nexport async function login(password: string): Promise<LoginResponse> {\n const res = await fetch(`${BASE}/api/v1/auth/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ password }),\n });\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new ApiError(res.status, data.error ?? \"login_failed\");\n }\n const data = (await res.json()) as LoginResponse;\n try {\n localStorage.setItem(\"pi-kot/auth-token\", data.token);\n } catch {\n // private mode\n }\n return data;\n}\n\n// ---- Sessions ----\n\nexport interface SessionSummary {\n sessionId: string;\n projectId: string;\n isLive: boolean;\n name?: string;\n createdAt: string;\n lastActivityAt: string;\n messageCount: number;\n supervisorId?: string;\n}\n\nexport interface CreateSessionRequest {\n projectId?: string;\n workspacePath?: string;\n}\n\nexport interface CreateSessionResponse {\n sessionId: string;\n projectId: string;\n createdAt: string;\n}\n\nexport interface SessionMessagesResponse {\n messages: unknown[];\n}\n\nexport interface PromptResponse {\n accepted: boolean;\n}\n\nexport async function createSession(\n req: CreateSessionRequest = {},\n): Promise<CreateSessionResponse> {\n return request<CreateSessionResponse>(\"POST\", \"/api/v1/sessions\", req);\n}\n\nexport async function listSessions(\n projectId?: string,\n): Promise<{ sessions: SessionSummary[] }> {\n const qs = projectId !== undefined ? `?projectId=${encodeURIComponent(projectId)}` : \"\";\n return request<{ sessions: SessionSummary[] }>(\"GET\", `/api/v1/sessions${qs}`);\n}\n\nexport async function getSessionMessages(\n sessionId: string,\n): Promise<SessionMessagesResponse> {\n return request<SessionMessagesResponse>(\n \"GET\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/messages`,\n );\n}\n\nexport async function getSessionContext(\n sessionId: string,\n): Promise<SessionContextResponse> {\n return request<SessionContextResponse>(\n \"GET\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/context`,\n );\n}\n\n/** SDK-compatible ImageContent shape (matches @earendil-works/pi-ai's ImageContent). */\nexport interface ImageContent {\n type: \"image\";\n data: string; // base64 encoded image data\n mimeType: string; // e.g., \"image/jpeg\", \"image/png\"\n}\n\nexport async function sendPrompt(\n sessionId: string,\n text: string,\n streamingBehavior?: \"steer\" | \"followUp\",\n images?: ImageContent[],\n): Promise<PromptResponse> {\n return request<PromptResponse>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/prompt`,\n { text, streamingBehavior, images },\n );\n}\n\nexport async function abortSession(sessionId: string): Promise<{ aborted: boolean }> {\n return request<{ aborted: boolean }>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/abort`,\n );\n}\n\nexport async function deleteSession(sessionId: string): Promise<{ disposed: boolean }> {\n return request<{ disposed: boolean }>(\n \"DELETE\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}`,\n );\n}\n\nexport async function steerSession(\n sessionId: string,\n text: string,\n mode: \"steer\" | \"followUp\" = \"steer\",\n images?: ImageContent[],\n): Promise<{ accepted: boolean }> {\n return request<{ accepted: boolean }>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/steer`,\n { text, mode, images },\n );\n}\n\nexport async function renameSession(\n sessionId: string,\n name: string,\n): Promise<{ renamed: boolean }> {\n return request<{ renamed: boolean }>(\n \"PATCH\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/name`,\n { name },\n );\n}\n\nexport async function archiveSession(\n sessionId: string,\n projectId?: string,\n): Promise<{ archived: boolean }> {\n return request<{ archived: boolean }>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/archive`,\n projectId !== undefined ? { projectId } : undefined,\n );\n}\n\nexport async function unarchiveSession(\n sessionId: string,\n projectId: string,\n): Promise<{ unarchived: boolean }> {\n return request<{ unarchived: boolean }>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/unarchive`,\n { projectId },\n );\n}\n\nexport async function listArchivedSessions(\n projectId: string,\n): Promise<{ sessions: SessionSummary[] }> {\n return request<{ sessions: SessionSummary[] }>(\n \"GET\",\n `/api/v1/sessions?projectId=${encodeURIComponent(projectId)}&archived=true`,\n );\n}\n\n// ---- Projects ----\n\nexport interface Project {\n id: string;\n name: string;\n path: string;\n createdAt: string;\n}\n\nexport interface BrowseSuggestions {\n suggestions: string[];\n}\n\nexport async function browseDirectories(\n query: string,\n): Promise<BrowseSuggestions> {\n return request<BrowseSuggestions>(\n \"GET\",\n `/api/v1/projects/browse?q=${encodeURIComponent(query)}`,\n );\n}\n\nexport async function fetchProjects(): Promise<{ projects: Project[] }> {\n return request<{ projects: Project[] }>(\"GET\", \"/api/v1/projects\");\n}\n\nexport async function createProjectAPI(\n name: string,\n path: string,\n): Promise<Project> {\n return request<Project>(\"POST\", \"/api/v1/projects\", { name, path });\n}\n\nexport async function deleteProjectAPI(\n id: string,\n): Promise<{ deleted: boolean }> {\n return request<{ deleted: boolean }>(\n \"DELETE\",\n `/api/v1/projects/${encodeURIComponent(id)}`,\n );\n}\n\n// ---- Filesystem (browsing for Add Project dialog) ----\n\nexport interface FsEntry {\n name: string;\n path: string;\n isDirectory: boolean;\n}\n\nexport async function fetchHomeDir(): Promise<string> {\n const res = await request<{ home: string }>(\"GET\", \"/api/v1/filesystem/home\");\n return res.home;\n}\n\nexport async function listDir(path: string): Promise<FsEntry[]> {\n const res = await request<{ entries: FsEntry[] }>(\n \"GET\",\n `/api/v1/filesystem/list?path=${encodeURIComponent(path)}`,\n );\n return res.entries;\n}\n\n// ---- Files ----\n\nexport interface FileTreeNode {\n name: string;\n path: string;\n type: \"file\" | \"directory\";\n children?: FileTreeNode[];\n truncated?: boolean;\n}\n\nexport interface FileReadResponse {\n path: string;\n content: string;\n size: number;\n language: string;\n binary: boolean;\n}\n\nexport async function filesTree(\n projectId: string,\n maxDepth?: number,\n): Promise<FileTreeNode> {\n const qs = new URLSearchParams({ projectId });\n if (maxDepth !== undefined) qs.set(\"maxDepth\", String(maxDepth));\n return request<FileTreeNode>(\"GET\", `/api/v1/files/tree?${qs.toString()}`);\n}\n\nexport async function filesRead(\n projectId: string,\n path: string,\n): Promise<FileReadResponse> {\n const qs = new URLSearchParams({ projectId, path });\n return request<FileReadResponse>(\"GET\", `/api/v1/files/read?${qs.toString()}`);\n}\n\nexport async function filesWrite(\n projectId: string,\n path: string,\n content: string,\n): Promise<{ path: string }> {\n return request(\"PUT\", `/api/v1/files/write`, { projectId, path, content });\n}\n\nexport async function filesRename(\n projectId: string,\n path: string,\n name: string,\n): Promise<{ path: string }> {\n return request(\"POST\", `/api/v1/files/rename`, { projectId, path, name });\n}\n\nexport async function filesMkdir(\n projectId: string,\n parentPath: string,\n name: string,\n): Promise<{ path: string }> {\n return request(\"POST\", `/api/v1/files/mkdir`, { projectId, parentPath, name });\n}\n\n/**\n * Download a file or directory from the project.\n * Files stream verbatim; directories download as a tar.gz archive.\n * Triggers a browser download via a temporary anchor element.\n */\nexport async function filesDownload(\n projectId: string,\n path: string,\n): Promise<void> {\n const token = getStoredToken();\n const qs = new URLSearchParams({ projectId, path });\n const res = await fetch(`${BASE}/api/v1/files/download?${qs.toString()}`, {\n headers: token !== undefined ? { Authorization: `Bearer ${token}` } : {},\n });\n if (res.status === 401) {\n clearStoredToken();\n window.dispatchEvent(new Event(UNAUTHORIZED_EVENT));\n }\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new ApiError(res.status, data.message ?? data.error ?? res.statusText);\n }\n const blob = await res.blob();\n const disposition = res.headers.get(\"Content-Disposition\") ?? \"\";\n const filenameMatch = disposition.match(/filename\\*?=UTF-8''([^;]+)/) || disposition.match(/filename=\"?([^\";]+)\"?/);\n const filename = filenameMatch ? decodeURIComponent(filenameMatch[1]) : path.split(\"/\").pop() ?? \"download\";\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\nexport async function filesDelete(\n projectId: string,\n path: string,\n opts?: { recursive?: boolean },\n): Promise<void> {\n const qs = new URLSearchParams({ projectId, path });\n if (opts?.recursive === true) qs.set(\"recursive\", \"true\");\n return request(\"DELETE\", `/api/v1/files/delete?${qs.toString()}`);\n}\n\n/**\n * Move a file or directory within a project.\n * @param projectId - project target\n * @param src - source path (relative to project root)\n * @param dest - destination path (relative to project root, full path)\n */\nexport async function filesMove(\n projectId: string,\n src: string,\n dest: string,\n): Promise<{ path: string }> {\n const headers: Record<string, string> = {};\n const token = getStoredToken();\n if (token !== undefined) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n const res = await fetch(`${BASE}/api/v1/files/move`, {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId, src, dest }),\n });\n\n if (res.status === 401) {\n clearStoredToken();\n window.dispatchEvent(new Event(UNAUTHORIZED_EVENT));\n }\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new ApiError(res.status, data.message ?? data.error ?? res.statusText);\n }\n\n return res.json() as Promise<{ path: string }>;\n}\n\nexport async function filesSearch(\n projectId: string,\n q: string,\n opts?: { limit?: number; regex?: boolean; caseSensitive?: boolean },\n): Promise<{\n engine: \"ripgrep\" | \"node\";\n matches: Array<{ path: string; line: number; column: number; length: number; lineSnippet: string }>;\n truncated: boolean;\n}> {\n const qs = new URLSearchParams({ projectId, q });\n if (opts?.limit !== undefined) qs.set(\"limit\", String(opts.limit));\n if (opts?.regex) qs.set(\"regex\", \"1\");\n if (opts?.caseSensitive) qs.set(\"caseSensitive\", \"1\");\n return request(\"GET\", `/api/v1/files/search?${qs.toString()}`);\n}\n\nexport interface UploadResult {\n path: string;\n size: number;\n sha256: string;\n}\n\nexport interface UploadResponse {\n files: UploadResult[];\n}\n\n/**\n * Upload one or more files into a project folder via multipart/form-data.\n * Each file is streamed to the server, hashed with SHA-256, and atomically\n * renamed into place. Returns the uploaded file paths, sizes, and hashes.\n *\n * @param projectId - project target\n * @param parentPath - project-relative parent directory path (\"\" for root)\n * @param files - File objects from a file input or drop event\n * @param opts - optional overwrite flag\n */\nexport async function filesUpload(\n projectId: string,\n parentPath: string,\n files: File[],\n opts?: { overwrite?: boolean },\n): Promise<UploadResponse> {\n const fd = new FormData();\n fd.append(\"projectId\", projectId);\n fd.append(\"parentPath\", parentPath);\n if (opts?.overwrite === true) fd.append(\"overwrite\", \"1\");\n\n // Detect folder upload via webkitRelativePath (folder picker) or\n // uploadRelativePath (Web FileSystem API from drag-and-drop) and set\n // path:<index> fields so the server can reconstruct nested structure.\n for (const [index, file] of files.entries()) {\n const withPath = file as File & { webkitRelativePath?: string; uploadRelativePath?: string };\n const relPath = withPath.uploadRelativePath ?? withPath.webkitRelativePath;\n if (relPath && relPath.length > 0) {\n fd.append(`path:${index}`, relPath);\n }\n fd.append(`file:${index}`, file, relPath && relPath.length > 0 ? relPath : file.name);\n }\n\n const headers: Record<string, string> = {};\n const token = getStoredToken();\n if (token !== undefined) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n // Don't set Content-Type — the browser sets it with the multipart boundary\n\n const res = await fetch(`${BASE}/api/v1/files/upload`, {\n method: \"POST\",\n headers,\n body: fd,\n });\n\n if (res.status === 401) {\n clearStoredToken();\n window.dispatchEvent(new Event(UNAUTHORIZED_EVENT));\n }\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new ApiError(res.status, data.message ?? data.error ?? res.statusText);\n }\n\n return res.json() as Promise<UploadResponse>;\n}\n\n// ---- Git Clone ----\n\nexport interface CloneRepoRequest {\n url: string;\n folderName: string;\n projectName: string;\n branch?: string;\n token?: string;\n insecureTls?: boolean;\n /** Full path to clone into. When set, overrides the default workspace-relative resolution. */\n targetPath?: string;\n}\n\nexport type CloneEvent =\n | { type: \"started\"; cloneUrlForDisplay: string }\n | { type: \"progress\"; phase: string; percent: number | null; raw: string }\n | { type: \"stderr\"; line: string }\n | { type: \"done\"; target: string }\n | { type: \"project_created\"; id: string; name: string; path: string }\n | { type: \"error\"; message: string };\n\nexport function cloneRepo(\n req: CloneRepoRequest,\n onEvent: (event: CloneEvent) => void,\n onError?: (err: Error) => void,\n): () => void {\n const controller = new AbortController();\n const token = getStoredToken();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (token !== undefined) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n (async () => {\n try {\n const res = await fetch(`${BASE}/api/v1/projects/clone`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(req),\n signal: controller.signal,\n });\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new ApiError(res.status, data.message ?? data.error ?? \"Clone failed\");\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n throw new ApiError(0, \"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const event = JSON.parse(line.slice(6)) as CloneEvent;\n onEvent(event);\n } catch {\n // skip malformed events\n }\n }\n }\n }\n } catch (err) {\n if (controller.signal.aborted) return;\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n })();\n\n return () => controller.abort();\n}\n\n// ---- Providers / Models ----\n\nexport interface ModelInfo {\n id: string;\n name: string;\n contextWindow: number;\n maxTokens: number;\n reasoning: boolean;\n input: string[];\n hasAuth: boolean;\n supportedThinkingLevels: string[];\n}\n\nexport interface ProviderGroup {\n provider: string;\n models: ModelInfo[];\n}\n\nexport interface ProvidersResponse {\n providers: ProviderGroup[];\n}\n\nexport async function fetchProviders(scoped?: boolean): Promise<ProvidersResponse> {\n const qs = scoped ? \"?scoped=true\" : \"\";\n return request<ProvidersResponse>(\"GET\", `/api/v1/config/providers${qs}`);\n}\n\nexport interface AuthSummaryResponse {\n providers: Record<string, { configured: boolean; source?: string; label?: string }>;\n}\n\nexport async function getAuthSummary(): Promise<AuthSummaryResponse> {\n return request<AuthSummaryResponse>(\"GET\", \"/api/v1/config/auth\");\n}\n\nexport async function setApiKey(provider: string, apiKey: string): Promise<{ provider: string; configured: boolean }> {\n return request(\"PUT\", `/api/v1/config/auth/${encodeURIComponent(provider)}`, { apiKey });\n}\n\nexport async function removeApiKey(provider: string): Promise<void> {\n await request(\"DELETE\", `/api/v1/config/auth/${encodeURIComponent(provider)}`);\n}\n\nexport async function getSettings(): Promise<Record<string, unknown>> {\n return request<Record<string, unknown>>(\"GET\", \"/api/v1/config/settings\");\n}\n\nexport async function updateSettings(\n patch: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n return request<Record<string, unknown>>(\"PUT\", \"/api/v1/config/settings\", patch);\n}\n\n/** UI preferences (theme, toggles) — persisted server-side */\nexport async function getUiSettings(): Promise<Record<string, unknown>> {\n return request<Record<string, unknown>>(\"GET\", \"/api/v1/config/ui-settings\");\n}\n\nexport async function updateUiSettings(\n patch: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n return request<Record<string, unknown>>(\"PUT\", \"/api/v1/config/ui-settings\", patch);\n}\n\nexport async function getModelsJson(): Promise<{ providers: Record<string, unknown> }> {\n return request(\"GET\", \"/api/v1/config/models\");\n}\n\nexport async function putModelsJson(\n data: { providers: Record<string, unknown> },\n): Promise<{ providers: Record<string, unknown> }> {\n return request(\"PUT\", `/api/v1/config/models`, data);\n}\n\n// ---- Custom Provider Wizard ----\n\nexport interface ProbeRequest {\n baseUrl: string;\n apiKey?: string;\n apiType?: string;\n headers?: Record<string, string>;\n}\n\nexport interface ProbeResult {\n reachable: boolean;\n error?: string;\n detectedApiType?: string;\n suggestedName?: string;\n models?: Array<{ id: string; name?: string }>;\n rawResponse?: unknown;\n}\n\nexport async function probeProvider(\n req: ProbeRequest,\n): Promise<ProbeResult> {\n return request<ProbeResult>(\"POST\", \"/api/v1/config/providers/probe\", req);\n}\n\nexport async function addCustomProvider(\n providerName: string,\n config: Record<string, unknown>,\n): Promise<{ providers: Record<string, unknown> }> {\n return request<{ providers: Record<string, unknown> }>(\n \"POST\",\n \"/api/v1/config/providers\",\n { providerName, config },\n );\n}\n\nexport async function removeCustomProvider(\n providerName: string,\n): Promise<{ providers: Record<string, unknown> }> {\n return request<{ providers: Record<string, unknown> }>(\n \"DELETE\",\n `/api/v1/config/providers/${encodeURIComponent(providerName)}`,\n );\n}\n\n// ---- Enabled Models (scoped models) ----\n\nexport interface EnabledModelsResponse {\n enabledModels: string[] | null;\n}\n\nexport async function getEnabledModels(): Promise<EnabledModelsResponse> {\n return request<EnabledModelsResponse>(\"GET\", \"/api/v1/config/enabled-models\");\n}\n\nexport async function setEnabledModels(\n enabledModels: string[] | null,\n): Promise<EnabledModelsResponse> {\n return request<EnabledModelsResponse>(\"PUT\", \"/api/v1/config/enabled-models\", { enabledModels });\n}\n\n// ---- Model Management ----\n\nexport interface SetModelResponse {\n provider: string;\n modelId: string;\n}\n\nexport interface GetModelResponse {\n provider: string;\n modelId: string;\n}\n\nexport async function setSessionModel(\n sessionId: string,\n provider: string,\n modelId: string,\n): Promise<SetModelResponse> {\n return request<SetModelResponse>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/model`,\n { provider, modelId },\n );\n}\n\nexport async function getSessionModel(\n sessionId: string,\n): Promise<GetModelResponse> {\n return request<GetModelResponse>(\n \"GET\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/model`,\n );\n}\n\nexport interface ExecResponse {\n exitCode: number | null;\n output: string;\n durationMs: number;\n truncated: boolean;\n cancelled: boolean;\n}\n\nexport interface CompactSessionResponse {\n summary: string;\n tokensBefore: number;\n}\n\nexport async function execCommand(\n sessionId: string,\n command: string,\n opts?: { excludeFromContext?: boolean },\n): Promise<ExecResponse> {\n return request<ExecResponse>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/exec`,\n { command, excludeFromContext: opts?.excludeFromContext },\n );\n}\n\nexport function execCommandStream(\n sessionId: string,\n command: string,\n opts?: { excludeFromContext?: boolean },\n): { promise: Promise<ExecResponse>; abort: () => void } {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n const token = getStoredToken();\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n const abortController = new AbortController();\n const promise = fetch(\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/exec-stream`,\n {\n method: \"POST\",\n headers,\n signal: abortController.signal,\n body: JSON.stringify({ command, excludeFromContext: opts?.excludeFromContext }),\n },\n ).then(async (res) => {\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.message || `exec-stream failed: ${res.status}`);\n }\n return res.json() as Promise<ExecResponse>;\n });\n return {\n promise,\n abort: () => abortController.abort(),\n };\n}\n\n/**\n * Cancel the currently running streaming exec command for a session.\n */\nexport async function cancelExec(sessionId: string): Promise<void> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n const token = getStoredToken();\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n // Send a body so Fastify doesn't wait for one\n const res = await fetch(\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/exec-cancel`,\n { method: \"POST\", headers, body: \"{}\" },\n );\n if (!res.ok) {\n console.warn(\"cancelExec failed:\", res.status);\n }\n}\n\nexport async function compactSession(\n sessionId: string,\n customInstructions?: string,\n): Promise<CompactSessionResponse> {\n return request<CompactSessionResponse>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/compact`,\n customInstructions !== undefined ? { customInstructions } : {},\n );\n}\n\n// ── Compaction History ──\n\nexport interface CompactionEvent {\n id: string;\n timestamp: string;\n summary: string;\n tokensBefore: number;\n /** Estimated token size of the kept context after compaction (optional — SDK 0.79.8+). */\n estimatedTokensAfter?: number;\n insertBeforeIndex: number;\n archivedMessages: unknown[];\n}\n\nexport interface CompactionsResponse {\n compactions: CompactionEvent[];\n}\n\nexport async function getCompactions(\n sessionId: string,\n): Promise<CompactionsResponse> {\n return request<CompactionsResponse>(\n \"GET\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/compactions`,\n );\n}\n\n// ---- Session Tree / Navigate / Fork ----\n\nexport interface SessionTreeEntry {\n id: string;\n parentId: string | null;\n type: string;\n timestamp: string;\n role?: string;\n preview?: string;\n label?: string;\n}\n\nexport interface SessionTreeResponse {\n leafId: string | null;\n branchIds: string[];\n entries: SessionTreeEntry[];\n}\n\nexport async function getSessionTree(\n sessionId: string,\n): Promise<SessionTreeResponse> {\n return request<SessionTreeResponse>(\n \"GET\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/tree`,\n );\n}\n\nexport interface NavigateSessionResponse {\n cancelled: boolean;\n aborted?: boolean;\n editorText?: string;\n}\n\nexport async function navigateSession(\n sessionId: string,\n entryId: string,\n opts?: { summarize?: boolean; customInstructions?: string; label?: string },\n): Promise<NavigateSessionResponse> {\n return request<NavigateSessionResponse>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/navigate`,\n { entryId, ...opts },\n );\n}\n\nexport interface ForkSessionResponse {\n sessionId: string;\n projectId: string;\n}\n\nexport async function forkSession(\n sessionId: string,\n entryId: string,\n): Promise<ForkSessionResponse> {\n return request<ForkSessionResponse>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/fork`,\n { entryId },\n );\n}\n\n// ---- Ask User Question ----\n\nexport interface AskQuestion {\n question: string;\n header: string;\n options: { label: string; description: string; preview?: string }[];\n multiSelect?: boolean;\n}\n\nexport interface AskUserQuestionAnswer {\n questionIndex: number;\n question: string;\n kind: \"option\" | \"custom\" | \"chat\" | \"multi\";\n answer: string | null;\n selected?: string[];\n notes?: string;\n preview?: string;\n}\n\nexport async function getPendingAskQuestions(\n sessionId: string,\n): Promise<{ requestId: string; questions: AskQuestion[] }[]> {\n const res = await request<{ pending: { requestId: string; questions: AskQuestion[] }[] }>(\n \"GET\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/ask-user-question/pending`,\n );\n return res.pending;\n}\n\nexport async function answerAskQuestion(\n sessionId: string,\n requestId: string,\n answers: AskUserQuestionAnswer[],\n cancelled = false,\n): Promise<void> {\n await request(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/ask-user-question/answer`,\n { requestId, answers, cancelled },\n );\n}\n\n// ── Orchestration ──\n\nexport interface OrchestrationConfig {\n available?: boolean;\n disabled?: boolean;\n disabledReason?: string;\n maxWorkersPerSupervisor?: number;\n tools?: string[];\n}\n\nexport interface SessionOrchestrationRole {\n sessionId: string;\n role: \"supervisor\" | \"worker\" | \"standalone\";\n supervisorId?: string;\n}\n\nexport interface WorkerListItem {\n workerId: string;\n state: string;\n isLive: boolean;\n name: string | null;\n messageCount: number | null;\n lastStateAt: string | null;\n}\n\nexport interface InboxItem {\n id: string;\n type: string;\n workerId: string;\n occurredAt: string;\n data: Record<string, unknown>;\n delivered: boolean;\n}\n\nexport async function fetchOrchestrationConfig(): Promise<OrchestrationConfig> {\n return request(\"GET\", \"/api/v1/orchestration/config\");\n}\n\nexport async function getSessionOrchestrationRole(\n sessionId: string,\n): Promise<SessionOrchestrationRole> {\n return request(\n \"GET\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(sessionId)}`,\n );\n}\n\nexport async function enableSupervisorUI(\n sessionId: string,\n): Promise<{ enabled: boolean; sessionId: string }> {\n return request(\n \"POST\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(sessionId)}/enable`,\n );\n}\n\nexport async function disableSupervisorUI(\n sessionId: string,\n): Promise<{ disabled: boolean; sessionId: string }> {\n return request(\n \"POST\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(sessionId)}/disable`,\n );\n}\n\nexport async function listWorkers(\n sessionId: string,\n): Promise<{ workers: WorkerListItem[] }> {\n return request(\n \"GET\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(sessionId)}/workers`,\n );\n}\n\nexport async function fetchInbox(\n sessionId: string,\n): Promise<{ items: InboxItem[]; count: number }> {\n return request(\n \"GET\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(sessionId)}/inbox`,\n );\n}\n\nexport async function clearInboxUI(\n sessionId: string,\n): Promise<{ cleared: boolean }> {\n return request(\n \"POST\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(sessionId)}/inbox/clear`,\n );\n}\n\nexport async function detachWorkerUI(\n supervisorId: string,\n workerId: string,\n): Promise<{ detached: boolean; workerId: string }> {\n return request(\n \"POST\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(supervisorId)}/workers/${encodeURIComponent(workerId)}/detach`,\n );\n}\n\nexport async function killWorkerUI(\n supervisorId: string,\n workerId: string,\n): Promise<{ killed: boolean; workerId: string }> {\n return request(\n \"POST\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(supervisorId)}/workers/${encodeURIComponent(workerId)}/kill`,\n );\n}\n\nexport async function resumeWorkerUI(\n supervisorId: string,\n workerId: string,\n): Promise<{ resumed: boolean; workerId: string; wasCold: boolean }> {\n return request(\n \"POST\",\n `/api/v1/orchestration/sessions/${encodeURIComponent(supervisorId)}/workers/${encodeURIComponent(workerId)}/resume`,\n );\n}\n\n// ---- Extension Discovery ----\n\nexport interface DiscoveredExtension {\n name: string;\n source: \"extensions_dir\" | \"agents_dir\" | \"package\" | \"builtin\";\n description: string;\n version?: string;\n /** Original package identifier (e.g. \"npm:@ayulab/pi-rewind\"). Only set for package source. */\n package?: string;\n agentTypes?: string[];\n enablesFeatures?: string[];\n}\n\nexport interface RecommendedExtension {\n id: string;\n name: string;\n description: string;\n package: string;\n category: \"orchestration\" | \"tools\" | \"ui\" | \"integration\" | \"productivity\";\n installed: boolean;\n verified?: boolean;\n providesAgentTypes?: string[];\n enablesFeatures?: string[];\n icon: string;\n}\n\nexport interface AgentDef {\n name: string;\n description: string;\n model?: string;\n tools?: string[];\n source: \"file\" | \"builtin\";\n}\n\nexport interface ExtensionsResponse {\n detected: DiscoveredExtension[];\n recommended: RecommendedExtension[];\n agents: AgentDef[];\n}\n\nexport interface CompleteFilesResponse {\n paths: string[];\n}\n\n/**\n * Fetch file path suggestions for the chat input's `@` autocomplete.\n * Returns paths ranked so basename matches beat deep-path matches.\n */\nexport async function completeFiles(\n projectId: string,\n query: string,\n opts?: { limit?: number },\n): Promise<CompleteFilesResponse> {\n const qs = new URLSearchParams({ projectId, query });\n if (opts?.limit !== undefined) qs.set(\"limit\", String(opts.limit));\n return request<CompleteFilesResponse>(\n \"GET\",\n `/api/v1/files/complete?${qs.toString()}`,\n );\n}\n\nexport async function fetchExtensions(): Promise<ExtensionsResponse> {\n return request<ExtensionsResponse>(\"GET\", \"/api/v1/extensions\");\n}\n\nexport async function installExtension(\n packageName: string,\n): Promise<{ success: boolean; error?: string }> {\n return request(\"POST\", \"/api/v1/extensions/install\", { package: packageName });\n}\n\nexport async function installManualExtension(\n installSpec: string,\n): Promise<{ success: boolean; error?: string }> {\n return request(\"POST\", \"/api/v1/extensions/install-manual\", { package: installSpec });\n}\n\nexport async function uninstallExtension(\n packageName: string,\n): Promise<{ success: boolean; error?: string }> {\n return request(\"POST\", \"/api/v1/extensions/uninstall\", { package: packageName });\n}\n\n// ---- Extension Updates ----\n\nexport interface ExtensionUpdateInfo {\n package: string;\n name: string;\n installed: string | undefined;\n latest: string | undefined;\n updateAvailable: boolean;\n}\n\nexport async function checkExtensionUpdates(): Promise<ExtensionUpdateInfo[]> {\n return request<ExtensionUpdateInfo[]>(\"GET\", \"/api/v1/extensions/updates\");\n}\n\nexport async function updateExtension(\n packageName: string,\n): Promise<{ success: boolean; error?: string }> {\n return request(\"POST\", \"/api/v1/extensions/update\", { package: packageName });\n}\n\n// ---- Extension Config (pi-vision-tool) ----\n\nexport const REASONING_LEVELS = [\"off\", \"low\", \"medium\", \"high\", \"xhigh\"] as const;\nexport type ReasoningLevel = (typeof REASONING_LEVELS)[number];\n\nexport interface VisionConfigResponse {\n installed: boolean;\n provider?: string | null;\n model?: string | null;\n enabled?: boolean;\n maxDimension?: number;\n jpegQuality?: number;\n defaultReasoningEffort?: ReasoningLevel;\n}\n\nexport async function getVisionConfig(): Promise<VisionConfigResponse> {\n return request<VisionConfigResponse>(\"GET\", \"/api/v1/extensions/vision-config\");\n}\n\nexport interface SetVisionConfigPayload {\n provider?: string;\n model?: string;\n enabled?: boolean;\n maxDimension?: number;\n jpegQuality?: number;\n defaultReasoningEffort?: string;\n}\n\nexport async function setVisionConfig(cfg: SetVisionConfigPayload): Promise<{ saved: boolean }> {\n return request<{ saved: boolean }>(\"PUT\", \"/api/v1/extensions/vision-config\", cfg);\n}\n\n// ---- Control ----\n\nexport interface ReloadResponse {\n reloaded: boolean;\n method: string;\n}\n\nexport async function reloadAgent(): Promise<ReloadResponse> {\n return request<ReloadResponse>(\"POST\", \"/api/v1/control/reload\");\n}\n\n// ---- Session Extensions (runtime state) ----\n\nexport interface SessionExtensionInfo {\n activeExtensions: Array<{ path: string; displayPath: string }>;\n commands: Array<{ name: string; invocationName: string; description: string }>;\n registeredTools: Array<{ name: string; description: string }>;\n eventHandlers: string[];\n}\n\n/**\n * Get runtime extension state for a live session — what extensions are\n * active, what commands and tools they registered.\n */\nexport async function fetchSessionExtensions(\n sessionId: string,\n): Promise<SessionExtensionInfo> {\n return request<SessionExtensionInfo>(\n \"GET\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/extensions`,\n );\n}\n\n// ---- Extension Commands (generic bridge) ----\n\nexport interface InvokeCommandResponse {\n accepted: boolean;\n}\n\n/**\n * Invoke a registered extension command (e.g. \"/rewind\") via the\n * extension UI bridge. Returns 202 Accepted — the command runs\n * asynchronously and drives its UI interactions over SSE\n * (`extension_ui_select`, `extension_ui_confirm`, etc.).\n */\nexport async function invokeExtensionCommand(\n sessionId: string,\n command: string,\n args?: string,\n): Promise<InvokeCommandResponse> {\n return request<InvokeCommandResponse>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/command`,\n { command, args },\n );\n}\n\n/**\n * Respond to a pending extension UI interaction (select, confirm, input).\n * The `requestId` comes from the `extension_ui_*` SSE event.\n */\nexport async function respondExtensionUI(\n sessionId: string,\n requestId: string,\n value: unknown,\n): Promise<{ resolved: boolean }> {\n return request<{ resolved: boolean }>(\n \"POST\",\n `/api/v1/sessions/${encodeURIComponent(sessionId)}/extension-ui/respond`,\n { requestId, value },\n );\n}\n\n// ---- MCP ----\n\nexport async function getMcpSettings(): Promise<McpSettingsResponse> {\n return request<McpSettingsResponse>(\"GET\", \"/api/v1/mcp/settings\");\n}\n\nexport async function setMcpEnabled(enabled: boolean): Promise<McpSettingsResponse> {\n return request<McpSettingsResponse>(\"PUT\", \"/api/v1/mcp/settings\", { enabled });\n}\n\nexport async function listMcpServers(projectId?: string): Promise<McpServersResponse> {\n const qs = projectId !== undefined ? `?projectId=${encodeURIComponent(projectId)}` : \"\";\n return request<McpServersResponse>(\"GET\", `/api/v1/mcp/servers${qs}`);\n}\n\nexport async function upsertMcpServer(\n name: string,\n config: McpServerConfig,\n): Promise<{ name: string }> {\n return request<{ name: string }>(\n \"PUT\",\n `/api/v1/mcp/servers/${encodeURIComponent(name)}`,\n config,\n );\n}\n\nexport async function deleteMcpServer(name: string): Promise<{ deleted: boolean }> {\n return request<{ deleted: boolean }>(\n \"DELETE\",\n `/api/v1/mcp/servers/${encodeURIComponent(name)}`,\n );\n}\n\nexport async function probeMcpServer(name: string, projectId?: string): Promise<McpServersResponse> {\n const qs = projectId !== undefined ? `?projectId=${encodeURIComponent(projectId)}` : \"\";\n return request<McpServersResponse>(\n \"POST\",\n `/api/v1/mcp/servers/${encodeURIComponent(name)}/probe${qs}`,\n );\n}\n\nexport async function grantStdioMcpTrust(projectId: string): Promise<{ trusted: boolean }> {\n return request<{ trusted: boolean }>(\"POST\", `/api/v1/mcp/trust/${encodeURIComponent(projectId)}`);\n}\n\nexport async function revokeStdioMcpTrust(projectId: string): Promise<void> {\n return request<void>(\"DELETE\", `/api/v1/mcp/trust/${encodeURIComponent(projectId)}`);\n}\n\n// ---- Tool listing / overrides ----\n\nexport interface ToolListingItem {\n name: string;\n description: string;\n enabled: boolean;\n globalEnabled: boolean;\n projectOverride?: \"enabled\" | \"disabled\";\n}\n\nexport interface ToolListing {\n builtin: ToolListingItem[];\n mcp: {\n server: string;\n scope: \"global\" | \"project\";\n projectId?: string;\n enabled: boolean;\n state: string;\n lastError?: string;\n tools: (ToolListingItem & { shortName: string })[];\n }[];\n extension: { packageSource: string; tools: ToolListingItem[] }[];\n}\n\nexport async function listTools(projectId?: string): Promise<ToolListing> {\n const qs = projectId !== undefined ? `?projectId=${encodeURIComponent(projectId)}` : \"\";\n return request<ToolListing>(\"GET\", `/api/v1/config/tools${qs}`);\n}\n\nexport async function setToolEnabled(\n family: \"builtin\" | \"mcp\" | \"extension\",\n name: string,\n enabled: boolean,\n opts?: { scope?: \"global\" | \"project\"; projectId?: string },\n): Promise<{ ok: boolean }> {\n const qs = opts?.projectId !== undefined ? `?projectId=${encodeURIComponent(opts.projectId)}` : \"\";\n return request<{ ok: boolean }>(\n \"PUT\",\n `/api/v1/config/tools/${encodeURIComponent(family)}/${encodeURIComponent(name)}/enabled${qs}`,\n { enabled, scope: opts?.scope },\n );\n}\n\nexport async function listToolOverrides(): Promise<ToolOverridesResponse> {\n return request<ToolOverridesResponse>(\"GET\", \"/api/v1/config/tools/overrides\");\n}\n\nexport async function clearToolProjectOverride(\n family: \"builtin\" | \"mcp\" | \"extension\",\n name: string,\n projectId: string,\n): Promise<{ ok: boolean }> {\n return request<{ ok: boolean }>(\n \"DELETE\",\n `/api/v1/config/tools/${encodeURIComponent(family)}/${encodeURIComponent(name)}/enabled?projectId=${encodeURIComponent(projectId)}`,\n );\n}\n\n// ---- Skills listing / overrides ----\n\nimport type {\n SkillsListResponse,\n SkillOverridesResponse,\n SkillDetailResponse,\n} from \"./api-client/types\";\n\nexport async function listSkills(\n projectId?: string,\n): Promise<SkillsListResponse> {\n const qs =\n projectId !== undefined\n ? `?projectId=${encodeURIComponent(projectId)}`\n : \"\";\n return request<SkillsListResponse>(\n \"GET\",\n `/api/v1/config/skills${qs}`,\n );\n}\n\nexport async function listSkillOverrides(): Promise<SkillOverridesResponse> {\n return request<SkillOverridesResponse>(\n \"GET\",\n \"/api/v1/config/skills/overrides\",\n );\n}\n\nexport async function setSkillEnabled(\n name: string,\n enabled: boolean,\n opts?: { scope?: \"global\" | \"project\"; projectId?: string },\n): Promise<{ ok: boolean }> {\n const qs =\n opts?.projectId !== undefined\n ? `?projectId=${encodeURIComponent(opts.projectId)}`\n : \"\";\n return request<{ ok: boolean }>(\n \"PUT\",\n `/api/v1/config/skills/${encodeURIComponent(name)}/enabled${qs}`,\n { enabled, scope: opts?.scope },\n );\n}\n\nexport async function clearSkillProjectOverride(\n name: string,\n projectId: string,\n): Promise<{ ok: boolean }> {\n return request<{ ok: boolean }>(\n \"DELETE\",\n `/api/v1/config/skills/${encodeURIComponent(name)}/enabled?projectId=${encodeURIComponent(projectId)}`,\n );\n}\n\n// ── Skill Detail ────────────────────────────────────────────────────\n\nexport async function getSkillDetail(\n name: string,\n): Promise<SkillDetailResponse> {\n return request<SkillDetailResponse>(\n \"GET\",\n `/api/v1/config/skills/${encodeURIComponent(name)}`,\n );\n}\n\nexport async function updateSkill(\n name: string,\n body: { description: string; instructions: string },\n): Promise<{ ok: boolean }> {\n return request<{ ok: boolean }>(\n \"PUT\",\n `/api/v1/config/skills/${encodeURIComponent(name)}`,\n body,\n );\n}\n\n// ── Tunnel ────────────────────────────────────────────────────────────────\n\nexport interface TunnelCheckResponse {\n available: boolean;\n provider: string;\n version: string | null;\n dependency: string | null;\n installCommand: string | null;\n installUrl: string | null;\n platform: string;\n message: string | null;\n}\n\nexport interface TunnelDoctorCheck {\n id: string;\n label: string;\n status: \"pass\" | \"fail\" | \"warn\";\n detail: string;\n}\n\nexport interface TunnelDoctorMode {\n mode: string;\n checks: TunnelDoctorCheck[];\n summary: { ready: boolean; failures: number; warnings: number };\n ready: boolean;\n blockers: string[];\n}\n\nexport interface TunnelDoctorResponse {\n ok: boolean;\n provider: string;\n providerChecks: TunnelDoctorCheck[];\n modes: TunnelDoctorMode[];\n}\n\nexport interface TunnelStatusResponse {\n active: boolean;\n url: string | null;\n mode: string | null;\n provider: string | null;\n providerMetadata: Record<string, unknown> | null;\n localPort: number | null;\n}\n\nexport interface TunnelStartResponse {\n ok: boolean;\n url: string;\n mode: string;\n provider: string;\n providerMetadata: Record<string, unknown> | null;\n localPort: number;\n}\n\nexport interface TunnelStopResponse {\n ok: boolean;\n wasActive: boolean;\n}\n\nexport async function checkTunnel(): Promise<TunnelCheckResponse> {\n return request<TunnelCheckResponse>(\"GET\", \"/api/v1/tunnel/check\");\n}\n\nexport async function doctorTunnel(): Promise<TunnelDoctorResponse> {\n return request<TunnelDoctorResponse>(\"GET\", \"/api/v1/tunnel/doctor\");\n}\n\nexport async function getTunnelStatus(): Promise<TunnelStatusResponse> {\n return request<TunnelStatusResponse>(\"GET\", \"/api/v1/tunnel/status\");\n}\n\nexport async function startTunnel(body?: Record<string, unknown>): Promise<TunnelStartResponse> {\n return request<TunnelStartResponse>(\"POST\", \"/api/v1/tunnel/start\", body ?? {});\n}\n\nexport async function stopTunnel(): Promise<TunnelStopResponse> {\n return request<TunnelStopResponse>(\"POST\", \"/api/v1/tunnel/stop\");\n}\n","import { clearStoredToken, getStoredToken } from \"./api-client\";\n\n/**\n * SSE reader using fetch + ReadableStream so we can send\n * Authorization header (native EventSource doesn't support custom headers).\n */\n\nconst MAX_BACKOFF_MS = 30_000;\nconst TERMINAL_STATUS = new Set([401, 404, 409]);\n\nfunction backoffDelay(attempt: number): number {\n return Math.min(2 ** attempt * 1000, MAX_BACKOFF_MS);\n}\n\nfunction abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted === true) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(resolve, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nexport interface StreamSSEOptions<T> {\n signal?: AbortSignal;\n onEvent: (event: T) => void | Promise<void>;\n onClose?: () => void;\n onReconnect?: (info: { attempt: number; delayMs: number; reason: string }) => void;\n maxReconnects?: number;\n}\n\nexport interface SSEClient {\n close: () => void;\n}\n\n/**\n * Connect to an SSE stream for a session.\n * Returns an SSEClient with a close() method for clean teardown.\n */\nexport function streamSessionSSE(\n sessionId: string,\n options: StreamSSEOptions<Record<string, unknown>>,\n): SSEClient {\n const { signal, onEvent, onClose, onReconnect, maxReconnects = 0 } = options;\n let closed = false;\n let reconnectAttempt = 0;\n\n const abortController = new AbortController();\n\n async function connect(): Promise<void> {\n while (!closed && !(signal?.aborted ?? false)) {\n try {\n const url = `/api/v1/sessions/${encodeURIComponent(sessionId)}/stream`;\n const headers: Record<string, string> = {\n Accept: \"text/event-stream\",\n };\n const token = getStoredToken();\n if (token !== undefined) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n const res = await fetch(url, {\n headers,\n signal: abortController.signal,\n });\n\n if (!res.ok) {\n if (TERMINAL_STATUS.has(res.status)) {\n if (res.status === 401) clearStoredToken();\n throw new Error(`SSE terminated: ${res.status}`);\n }\n throw new Error(`SSE non-ok: ${res.status}`);\n }\n\n // Reset reconnect count on successful connection\n reconnectAttempt = 0;\n\n const reader = res.body!\n .pipeThrough(new TextDecoderStream())\n .getReader();\n\n let buffer = \"\";\n\n while (!closed && !(signal?.aborted ?? false)) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += value;\n let idx: number;\n while ((idx = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n for (const line of block.split(\"\\n\")) {\n if (line.startsWith(\"data: \")) {\n try {\n const payload = JSON.parse(line.slice(6));\n await onEvent(payload);\n } catch {\n // skip malformed events per forwards-compat\n }\n }\n // Comment lines (: ...) and other non-data lines are ignored\n }\n }\n }\n } catch (err: unknown) {\n if (closed || signal?.aborted) break;\n\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.startsWith(\"SSE terminated:\")) break;\n\n reconnectAttempt++;\n if (maxReconnects > 0 && reconnectAttempt > maxReconnects) break;\n\n const delay = backoffDelay(reconnectAttempt);\n onReconnect?.({\n attempt: reconnectAttempt,\n delayMs: delay,\n reason: msg,\n });\n\n try {\n await abortableSleep(delay, signal);\n } catch {\n break; // aborted\n }\n }\n }\n\n onClose?.();\n }\n\n // Start connecting in the background\n connect().catch(() => {\n // errors are handled internally\n });\n\n return {\n close: () => {\n closed = true;\n abortController.abort();\n },\n };\n}\n","import { create } from \"zustand\";\nimport type { AskQuestion } from \"../lib/api-client\";\n\nexport interface PendingAskQuestion {\n requestId: string;\n sessionId: string;\n questions: AskQuestion[];\n}\n\ninterface AskUserQuestionState {\n pendingBySession: Record<string, PendingAskQuestion | undefined>;\n setPending: (pending: PendingAskQuestion) => void;\n clearPending: (sessionId: string, requestId?: string) => void;\n}\n\nexport const useAskUserQuestionStore = create<AskUserQuestionState>((set, get) => ({\n pendingBySession: {},\n setPending: (pending) =>\n set((s) => ({ pendingBySession: { ...s.pendingBySession, [pending.sessionId]: pending } })),\n clearPending: (sessionId, requestId) => {\n const cur = get().pendingBySession[sessionId];\n if (cur === undefined) return;\n if (requestId !== undefined && cur.requestId !== requestId) return;\n set((s) => ({ pendingBySession: { ...s.pendingBySession, [sessionId]: undefined } }));\n },\n}));\n","/**\n * Extension UI Bridge Store — manages pending extension UI interactions\n * that are bridged from the extension runner to the browser GUI.\n *\n * When an extension command calls `ctx.ui.select(\"Rewind to checkpoint:\", ...)`,\n * the server sends an `extension_ui_select` SSE event. This store captures\n * it and makes it available for React components to render.\n */\n\nimport { create } from \"zustand\";\n\n// ── Types ───────────────────────────────────────────────────────────\n\nexport interface ExtensionUISelect {\n type: \"select\";\n requestId: string;\n title: string;\n options: string[];\n}\n\nexport interface ExtensionUIConfirm {\n type: \"confirm\";\n requestId: string;\n title: string;\n message: string;\n}\n\nexport interface ExtensionUIInput {\n type: \"input\";\n requestId: string;\n title: string;\n placeholder: string;\n}\n\nexport interface ExtensionUINotify {\n type: \"notify\";\n message: string;\n notificationType: \"info\" | \"warning\" | \"error\";\n}\n\nexport interface ExtensionUIDone {\n type: \"done\";\n command: string;\n status: \"ok\" | \"error\";\n message?: string;\n}\n\nexport type ExtensionUIEvent =\n | ExtensionUISelect\n | ExtensionUIConfirm\n | ExtensionUIInput\n | ExtensionUINotify\n | ExtensionUIDone;\n\n/**\n * A visible notification toast. Auto-dismissed after a timeout.\n */\nexport interface ExtensionUINotification {\n /** Unique id for this notification (for dismissal). */\n id: string;\n message: string;\n type: \"info\" | \"warning\" | \"error\";\n /** ISO timestamp when the notification was created. */\n createdAt: number;\n}\n\n// ── State ───────────────────────────────────────────────────────────\n\ninterface ExtensionUIState {\n /** The currently active interaction (if any). Only one at a time. */\n activeInteraction: ExtensionUIEvent | undefined;\n /** Whether a command is currently running. */\n commandRunning: boolean;\n /** The name of the running command. */\n activeCommand: string | undefined;\n /** Visible notification toasts. */\n notifications: ExtensionUINotification[];\n}\n\ninterface ExtensionUIActions {\n /** Push an event from the SSE stream. */\n pushEvent: (event: ExtensionUIEvent) => void;\n /** Clear the current interaction (after responding). */\n clearInteraction: () => void;\n /** Cancel the running command. */\n cancelCommand: () => void;\n /** Dismiss a notification by id. */\n dismissNotification: (id: string) => void;\n}\n\ntype ExtensionUIStore = ExtensionUIState & ExtensionUIActions;\n\nlet _notifCounter = 0;\n\nexport const useExtensionUIStore = create<ExtensionUIStore>((set) => ({\n activeInteraction: undefined,\n commandRunning: false,\n activeCommand: undefined,\n notifications: [],\n\n pushEvent: (event) => {\n // Strip the \"extension_ui_\" prefix to match the switch cases below.\n // Server sends prefixed types (\"extension_ui_select\", \"extension_ui_done\")\n // but the client uses short names (\"select\", \"done\") for readability.\n const eventType = event.type.replace(/^extension_ui_/, \"\");\n // Narrow the event type after stripping the prefix\n switch (eventType) {\n case \"select\":\n case \"confirm\":\n case \"input\":\n set({ activeInteraction: event as ExtensionUIEvent, commandRunning: true });\n break;\n case \"notify\": {\n const n = event as { type: string; notificationType: string; message: string };\n const id = `ext-notif-${++_notifCounter}`;\n const notif: ExtensionUINotification = {\n id,\n message: n.message,\n type: n.notificationType as \"info\" | \"warning\" | \"error\",\n createdAt: Date.now(),\n };\n set((state) => ({\n notifications: [...state.notifications, notif],\n }));\n // Auto-dismiss after 8 seconds\n setTimeout(() => {\n set((state) => ({\n notifications: state.notifications.filter((n) => n.id !== id),\n }));\n }, 8000);\n break;\n }\n case \"done\":\n set({\n activeInteraction: undefined,\n commandRunning: false,\n activeCommand: undefined,\n });\n break;\n }\n },\n\n clearInteraction: () => {\n set({ activeInteraction: undefined });\n },\n\n cancelCommand: () => {\n set({\n activeInteraction: undefined,\n commandRunning: false,\n activeCommand: undefined,\n });\n },\n\n dismissNotification: (id: string) => {\n set((state) => ({\n notifications: state.notifications.filter((n) => n.id !== id),\n }));\n },\n}));\n","import { create } from \"zustand\";\nimport {\n type SessionSummary,\n type Project,\n type ImageContent,\n createSession,\n listSessions,\n getSessionMessages,\n sendPrompt,\n abortSession,\n steerSession,\n fetchProjects,\n renameSession as renameSessionAPI,\n archiveSession as archiveSessionAPI,\n unarchiveSession as unarchiveSessionAPI,\n deleteProjectAPI,\n compactSession,\n getCompactions,\n} from \"../lib/api-client\";\nimport type { CompactionEvent } from \"../lib/api-client\";\nimport { streamSessionSSE, type SSEClient } from \"../lib/sse-client\";\nimport { useAskUserQuestionStore } from \"./ask-user-question-store\";\nimport { useExtensionUIStore } from \"./extension-ui-store\";\n\nexport const EMPTY_MESSAGES: unknown[] = [];\nexport const EMPTY_COMPACTIONS: CompactionEvent[] = [];\nexport const EMPTY_QUEUED: { steering: string[]; followUp: string[] } = {\n steering: [],\n followUp: [],\n};\n\n// ── localStorage persistence keys ──\n\nconst ACTIVE_PROJECT_KEY = \"pi-kot/active-project-id\";\nconst ACTIVE_SESSION_KEY = \"pi-kot/active-session-id\";\n\nfunction getInitialActiveProjectId(): string | undefined {\n try {\n // URL hash takes priority (deep link / bookmark)\n const hash = window.location.hash;\n const m = hash.match(/^#\\/project\\/([^/]+)/);\n if (m) return m[1];\n return localStorage.getItem(ACTIVE_PROJECT_KEY) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getInitialActiveSessionId(): string | undefined {\n try {\n const hash = window.location.hash;\n const m = hash.match(/^#\\/project\\/[^/]+\\/session\\/([^/]+)/);\n if (m) return m[1];\n return localStorage.getItem(ACTIVE_SESSION_KEY) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface MessageLike {\n role?: string;\n content?: unknown;\n [k: string]: unknown;\n}\n\ninterface StreamState {\n text: string;\n activeToolName: string | undefined;\n isStreaming: boolean;\n}\n\ninterface SessionState {\n /** All known projects. */\n projects: Project[];\n /** Currently active project ID. */\n activeProjectId: string | undefined;\n /** All known sessions (flat, for sidebar). */\n sessions: SessionSummary[];\n /** Sessions per project (loaded by loadProjectSessions). */\n projectSessions: Record<string, SessionSummary[]>;\n /** Archived sessions per project. */\n archivedSessions: Record<string, SessionSummary[]>;\n /** Currently active session ID. */\n activeSessionId: string | undefined;\n /** Messages for the active session. */\n messages: unknown[];\n /** Per-session compaction archive from GET /sessions/:id/compactions. */\n compactionsBySession: Record<string, CompactionEvent[]>;\n /** Per-session monotonic counter bumped on every compaction_end event. */\n compactionEndCountBySession: Record<string, number>;\n /** Pending steer/followUp messages per session (from SSE queued event). */\n queuedBySession: Record<string, { steering: string[]; followUp: string[] } | undefined>;\n /** Streaming state per session. */\n streamState: StreamState;\n /** Whether we're loading. */\n loading: boolean;\n /** Error message, if any. */\n error: string | undefined;\n /** SSE client handle (for cleanup). */\n sseClient: SSEClient | undefined;\n /** SSE connection state for the active session. */\n connectionState: \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n}\n\ninterface SessionActions {\n loadProjects: () => Promise<void>;\n setActiveProject: (id: string) => Promise<void>;\n loadProjectSessions: (projectId: string) => Promise<void>;\n createAndActivate: (projectId?: string) => Promise<string>;\n setActiveSession: (id: string) => Promise<void>;\n connectSSE: (sessionId: string) => void;\n sendPrompt: (text: string, images?: ImageContent[]) => Promise<void>;\n sendSteer: (text: string, images?: ImageContent[]) => Promise<void>;\n abort: () => Promise<void>;\n refreshSessions: () => Promise<void>;\n renameSession: (sessionId: string, name: string) => Promise<void>;\n archiveSession: (sessionId: string) => Promise<void>;\n unarchiveSession: (sessionId: string, projectId: string) => Promise<void>;\n loadArchivedSessions: (projectId: string) => Promise<void>;\n loadCompactions: (sessionId: string) => Promise<void>;\n compactAndReload: (sessionId: string) => Promise<{ summary: string; tokensBefore: number }>;\n reloadMessages: (sessionId: string) => Promise<void>;\n clearError: () => void;\n deleteProject: (id: string) => Promise<void>;\n}\n\ntype SessionStore = SessionState & SessionActions;\n\nexport const useSessionStore = create<SessionStore>((set, get) => ({\n // State\n projects: [],\n activeProjectId: getInitialActiveProjectId(),\n sessions: [],\n projectSessions: {},\n archivedSessions: {},\n activeSessionId: getInitialActiveSessionId(),\n messages: [],\n compactionsBySession: {},\n compactionEndCountBySession: {},\n queuedBySession: {},\n streamState: { text: \"\", activeToolName: undefined, isStreaming: false },\n loading: false,\n error: undefined,\n sseClient: undefined,\n connectionState: \"disconnected\",\n\n // Actions\n loadProjects: async () => {\n try {\n const { projects } = await fetchProjects();\n const state = get();\n let nextProjectId = state.activeProjectId;\n\n // Validate stored project still exists on the server\n if (nextProjectId !== undefined && !projects.some((p) => p.id === nextProjectId)) {\n nextProjectId = undefined;\n }\n\n // Auto-select first project if none active and projects exist\n if (nextProjectId === undefined && projects.length > 0) {\n nextProjectId = projects[0].id;\n }\n\n set({ projects, activeProjectId: nextProjectId });\n\n if (nextProjectId !== undefined) {\n try {\n localStorage.setItem(ACTIVE_PROJECT_KEY, nextProjectId);\n } catch { /* private mode */ }\n await get().loadProjectSessions(nextProjectId);\n }\n } catch (err) {\n set({ error: err instanceof Error ? err.message : \"Failed to load projects\" });\n }\n },\n\n setActiveProject: async (id: string) => {\n try {\n localStorage.setItem(ACTIVE_PROJECT_KEY, id);\n localStorage.removeItem(ACTIVE_SESSION_KEY);\n } catch { /* private mode */ }\n set({ activeProjectId: id, activeSessionId: undefined, messages: [] });\n // Disconnect old SSE\n const old = get().sseClient;\n old?.close();\n set({ sseClient: undefined, connectionState: \"disconnected\" });\n await get().loadProjectSessions(id);\n },\n\n loadProjectSessions: async (projectId: string) => {\n try {\n const { sessions } = await listSessions(projectId);\n set((s) => ({\n projectSessions: { ...s.projectSessions, [projectId]: sessions },\n sessions,\n }));\n } catch (err) {\n set({ error: err instanceof Error ? err.message : \"Failed to load sessions\" });\n }\n },\n\n refreshSessions: async () => {\n const { activeProjectId } = get();\n if (activeProjectId !== undefined) {\n await get().loadProjectSessions(activeProjectId);\n }\n },\n\n createAndActivate: async (projectId?: string) => {\n set({ loading: true, error: undefined });\n const pid = projectId ?? get().activeProjectId ?? \"default\";\n try {\n const res = await createSession({ projectId: pid });\n const summary: SessionSummary = {\n sessionId: res.sessionId,\n projectId: res.projectId,\n isLive: true,\n messageCount: 0,\n lastActivityAt: res.createdAt,\n createdAt: res.createdAt,\n };\n set((s) => ({\n sessions: [summary, ...s.sessions],\n projectSessions: s.activeProjectId\n ? { ...s.projectSessions, [s.activeProjectId]: [summary, ...(s.projectSessions[s.activeProjectId] ?? [])] }\n : s.projectSessions,\n activeSessionId: res.sessionId,\n messages: [],\n loading: false,\n }));\n try {\n localStorage.setItem(ACTIVE_SESSION_KEY, res.sessionId);\n } catch { /* private mode */ }\n get().connectSSE(res.sessionId);\n return res.sessionId;\n } catch (err) {\n set({\n loading: false,\n error: err instanceof Error ? err.message : \"Failed to create session\",\n });\n return \"\";\n }\n },\n\n setActiveSession: async (id: string) => {\n try {\n localStorage.setItem(ACTIVE_SESSION_KEY, id);\n } catch { /* private mode */ }\n // Disconnect old SSE\n const old = get().sseClient;\n old?.close();\n\n set({\n activeSessionId: id,\n messages: [],\n streamState: { text: \"\", activeToolName: undefined, isStreaming: false },\n queuedBySession: {},\n error: undefined,\n });\n\n // Load messages\n try {\n const { messages } = await getSessionMessages(id);\n set({ messages });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : \"Failed to load messages\" });\n }\n\n // Connect SSE\n get().connectSSE(id);\n },\n\n connectSSE: (sessionId: string) => {\n const old = get().sseClient;\n old?.close();\n set({ connectionState: \"connecting\" });\n\n // RAF-coalesced text delta buffer (like forge)\n let pendingDelta = \"\";\n let rafId: number | undefined;\n const flushDelta = () => {\n rafId = undefined;\n const text = pendingDelta;\n if (text.length === 0) return;\n pendingDelta = \"\";\n set((s) => ({\n streamState: {\n ...s.streamState,\n text: s.streamState.text + text,\n },\n }));\n };\n\n // Debounced message refetch (like forge's scheduleMessagesRefetch)\n let refetchInflight = false;\n let refetchQueued = false;\n const refetchMessages = () => {\n if (refetchInflight) {\n refetchQueued = true;\n return;\n }\n refetchInflight = true;\n getSessionMessages(sessionId)\n .then(({ messages }) => {\n set({ messages });\n })\n .catch(() => {})\n .finally(() => {\n if (refetchQueued) {\n refetchQueued = false;\n refetchInflight = false;\n refetchMessages();\n } else {\n refetchInflight = false;\n }\n });\n };\n\n // Load the per-compaction archive on open so historical\n // CompactionCards render immediately.\n void get().loadCompactions(sessionId);\n\n const client = streamSessionSSE(sessionId, {\n onEvent: (event) => {\n // Any event means the connection is alive\n set({ connectionState: \"connected\" });\n switch (event.type) {\n case \"snapshot\": {\n const msgs = (event.messages as unknown[]) ?? [];\n set({\n messages: msgs,\n streamState: {\n text: \"\",\n activeToolName: undefined,\n isStreaming: event.isStreaming === true,\n },\n });\n break;\n }\n case \"agent_start\": {\n set({\n streamState: {\n text: \"\",\n activeToolName: undefined,\n isStreaming: true,\n },\n });\n break;\n }\n case \"message_update\": {\n const assistantEvent = event.assistantMessageEvent as Record<string, unknown> | undefined;\n if (assistantEvent?.type === \"text_delta\") {\n const delta = assistantEvent.delta as string;\n if (delta) {\n // RAF-coalesce like forge: accumulate, flush once per frame\n pendingDelta += delta;\n if (rafId === undefined) {\n rafId = requestAnimationFrame(flushDelta);\n }\n }\n }\n // tool_use_start etc are handled by refetching messages —\n // the SDK finalizes the assistant message with toolCall\n // blocks before emitting tool_execution_start.\n break;\n }\n case \"tool_execution_start\": {\n set((s) => ({\n streamState: {\n ...s.streamState,\n activeToolName: event.toolName as string | undefined,\n },\n }));\n // Refetch so the toolCall block appears in messages immediately\n refetchMessages();\n break;\n }\n case \"tool_execution_end\": {\n set((s) => ({\n streamState: {\n ...s.streamState,\n activeToolName: undefined,\n },\n }));\n // Refetch so the toolResult appears in messages\n refetchMessages();\n break;\n }\n case \"ask_user_question\": {\n const { requestId, questions } = event as unknown as {\n requestId: string;\n questions: import(\"../lib/api-client\").AskQuestion[];\n };\n useAskUserQuestionStore.getState().setPending({\n requestId,\n sessionId,\n questions,\n });\n break;\n }\n case \"ask_user_question_cancelled\": {\n const { requestId: cancelledId } = event as unknown as {\n requestId: string;\n };\n useAskUserQuestionStore.getState().clearPending(sessionId, cancelledId);\n break;\n }\n case \"compaction_start\": {\n // Show a brief banner so the user knows compaction is in progress.\n // On manual compact there's already a \"Compacting…\" state in\n // ChatInput, but auto-compact (context overflow) needs this.\n set((s) => ({\n streamState: {\n ...s.streamState,\n activeToolName: \"compacting…\",\n },\n }));\n break;\n }\n case \"compaction_end\": {\n // Clear the compacting indicator.\n set((s) => ({\n streamState: {\n ...s.streamState,\n activeToolName: undefined,\n },\n // Bump the compaction-end counter so panels that need to\n // react (e.g. ContextInspectorPanel re-fetching token\n // usage) get a stable signal.\n compactionEndCountBySession: {\n ...s.compactionEndCountBySession,\n [sessionId]: (s.compactionEndCountBySession[sessionId] ?? 0) + 1,\n },\n }));\n // Refetch compactions FIRST so the card data is available,\n // then refetch messages. If messages update before compactions\n // arrive, the ChatView renders post-compaction messages without\n // the CompactionCard — a brief flash of ungrouped tool calls.\n void get().loadCompactions(sessionId).then(() => {\n refetchMessages();\n });\n break;\n }\n case \"queued\": {\n const ev = event as { steering?: unknown; followUp?: unknown };\n const steering = Array.isArray(ev.steering)\n ? (ev.steering as unknown[]).filter((v): v is string => typeof v === \"string\")\n : [];\n const followUp = Array.isArray(ev.followUp)\n ? (ev.followUp as unknown[]).filter((v): v is string => typeof v === \"string\")\n : [];\n set((s) => ({\n queuedBySession: {\n ...s.queuedBySession,\n [sessionId]:\n steering.length === 0 && followUp.length === 0\n ? undefined\n : { steering, followUp },\n },\n }));\n break;\n }\n case \"agent_end\": {\n // Flush any remaining text delta\n if (rafId !== undefined) {\n cancelAnimationFrame(rafId);\n rafId = undefined;\n }\n flushDelta();\n\n const agentEndEv = event as Record<string, unknown>;\n const willRetry = agentEndEv.willRetry === true;\n\n if (willRetry) {\n // SDK auto-retry will restart the agent — keep isStreaming true\n // so the abort button stays visible throughout the retry cycle.\n // Without this, isStreaming toggles off then immediately on\n // (agent_end → agent_start), causing the UI buttons to flicker.\n set((s) => ({\n streamState: {\n ...s.streamState,\n text: \"\",\n },\n }));\n } else {\n // Surface error from the final failed attempt, if any.\n // The SDK puts errorMessage at the event top level only for\n // synthetic agent_end (promise rejection). For real agent_end\n // events, it's in the last assistant message's errorMessage.\n let errorMessage = agentEndEv.errorMessage as string | undefined;\n if (!errorMessage) {\n const msgs = agentEndEv.messages as unknown[] | undefined;\n if (msgs && msgs.length > 0) {\n const last = msgs[msgs.length - 1] as Record<string, unknown> | undefined;\n if (last?.role === \"assistant\" && last?.stopReason === \"error\") {\n errorMessage = last.errorMessage as string | undefined;\n }\n }\n }\n\n // Stop streaming\n set({\n streamState: {\n text: \"\",\n activeToolName: undefined,\n isStreaming: false,\n },\n });\n\n // Show error from failed LLM calls (out of credit, etc.)\n if (errorMessage) {\n set({ error: errorMessage });\n }\n\n // Clear queued on final agent end\n set((s) => ({\n queuedBySession: { ...s.queuedBySession, [sessionId]: undefined },\n }));\n }\n\n refetchMessages();\n break;\n }\n case \"message_end\": {\n // Flush any remaining text delta, then clear stream text\n // so the next assistant message starts with a fresh buffer.\n // Without this, text from multiple messages accumulates into\n // one blob in the streaming bubble at the bottom, making it\n // look like all agent text \"bleeds into 1\" across tool calls.\n if (rafId !== undefined) {\n cancelAnimationFrame(rafId);\n rafId = undefined;\n }\n flushDelta();\n set((s) => ({\n streamState: {\n ...s.streamState,\n text: \"\",\n },\n }));\n refetchMessages();\n break;\n }\n case \"auto_retry_start\": {\n const retryEv = event as Record<string, unknown>;\n const attempt = retryEv.attempt ?? \"?\";\n const maxAttempts = retryEv.maxAttempts ?? \"?\";\n const errMsg = (retryEv.errorMessage as string) ?? \"Unknown error\";\n set({ error: `Model error — retrying (${attempt}/${maxAttempts}): ${errMsg}` });\n break;\n }\n\n case \"auto_retry_end\": {\n const retryEndEv = event as Record<string, unknown>;\n if (retryEndEv.success === true) {\n // Retry succeeded — clear the error banner\n set({ error: undefined });\n } else {\n // All retries exhausted — show the final error from the provider\n const finalError = retryEndEv.finalError as string | undefined;\n if (finalError) {\n set({ error: finalError });\n }\n }\n break;\n }\n\n case \"tool_result\": {\n // Refetch to show the toolResult block inline in the\n // rendered messages. Don't clear stream text — the agent\n // may continue writing (same message) after analyzing the result.\n if (rafId !== undefined) {\n cancelAnimationFrame(rafId);\n rafId = undefined;\n }\n flushDelta();\n refetchMessages();\n break;\n }\n // ── Extension UI bridge events ──\n case \"extension_ui_select\":\n case \"extension_ui_confirm\":\n case \"extension_ui_input\":\n case \"extension_ui_notify\":\n case \"extension_ui_done\": {\n useExtensionUIStore.getState().pushEvent(\n event as unknown as import(\"../stores/extension-ui-store\").ExtensionUIEvent,\n );\n break;\n }\n // ── Streaming exec events (!cmd / !!cmd live terminal) ──\n case \"exec_start\": {\n const { command, excludeFromContext } = event as unknown as {\n command: string;\n excludeFromContext: boolean;\n };\n // Push an optimistic bashExecution message that streams live\n const optimisticMsg = {\n role: \"bashExecution\",\n command,\n output: \"\",\n exitCode: undefined as number | undefined, // undefined = running\n cancelled: false,\n truncated: false,\n excludeFromContext,\n timestamp: Date.now(),\n _pendingExec: true, // marker for the UI to show cancel button\n };\n set((s) => ({\n messages: [...s.messages, optimisticMsg],\n }));\n break;\n }\n case \"exec_update\": {\n const { output } = event as unknown as { output: string };\n set((s) => {\n const msgs = [...s.messages];\n const last = msgs[msgs.length - 1];\n if (last && (last as Record<string, unknown>)._pendingExec) {\n (last as Record<string, unknown>).output = ((last as Record<string, unknown>).output as string ?? \"\") + output;\n }\n return { messages: msgs };\n });\n break;\n }\n case \"exec_end\": {\n const { exitCode, output, error, cancelled: execCancelled } = event as unknown as {\n exitCode: number | null;\n output: string;\n error?: string;\n cancelled?: boolean;\n };\n set((s) => {\n const msgs = [...s.messages];\n const last = msgs[msgs.length - 1];\n if (last && (last as Record<string, unknown>)._pendingExec) {\n const m = last as Record<string, unknown>;\n if (execCancelled) {\n m.cancelled = true;\n m.exitCode = exitCode; // null for killed process — fine, cancelled takes priority in UI\n } else {\n m.exitCode = exitCode;\n m.cancelled = false;\n }\n m.output = error ? `${m.output as string}${output}\\n\\n[error] ${error}` : output;\n m.truncated = false;\n }\n return { messages: msgs };\n });\n const sid = get().activeSessionId;\n if (sid !== undefined) {\n setTimeout(() => get().reloadMessages(sid), 500);\n }\n break;\n }\n }\n },\n onReconnect: ({ attempt }) => {\n set({ connectionState: \"connecting\" });\n if (attempt > 1) {\n set({ error: `Reconnecting... (attempt ${attempt})` });\n }\n },\n onClose: () => {\n set({ connectionState: \"disconnected\" });\n },\n });\n\n set({ sseClient: client });\n },\n\n sendPrompt: async (text: string, images?: ImageContent[]) => {\n const { activeSessionId } = get();\n if (activeSessionId === undefined) return;\n\n // Add user message immediately (optimistic)\n const optimisticContent: Record<string, unknown>[] = [{ type: \"text\", text }];\n if (images !== undefined && images.length > 0) {\n for (const img of images) {\n // Use the base64 data as a data URL for the optimistic preview\n optimisticContent.push({\n type: \"image\",\n mimeType: img.mimeType,\n data: `data:${img.mimeType};base64,${img.data}`,\n __blobUrl: true,\n });\n }\n }\n\n set((s) => ({\n messages: [\n ...s.messages,\n { role: \"user\", content: optimisticContent },\n ],\n }));\n\n try {\n await sendPrompt(activeSessionId, text, undefined, images);\n } catch (err) {\n set((s) => ({\n error: err instanceof Error ? err.message : \"Failed to send prompt\",\n // If an existing stream was active, reset it\n streamState: s.streamState.isStreaming\n ? { text: \"\", activeToolName: undefined, isStreaming: false }\n : s.streamState,\n }));\n }\n },\n\n sendSteer: async (text: string, images?: ImageContent[]) => {\n const { activeSessionId } = get();\n if (activeSessionId === undefined) return;\n\n // Build optimistic content\n const optimisticContent: Record<string, unknown>[] = [{ type: \"text\", text }];\n if (images !== undefined && images.length > 0) {\n for (const img of images) {\n optimisticContent.push({\n type: \"image\",\n mimeType: img.mimeType,\n data: `data:${img.mimeType};base64,${img.data}`,\n __blobUrl: true,\n });\n }\n }\n\n // Add user message immediately with metadata.steer=true\n set((s) => ({\n messages: [\n ...s.messages,\n { role: \"user\", content: optimisticContent, metadata: { steer: true } },\n ],\n }));\n\n try {\n await steerSession(activeSessionId, text, \"steer\", images);\n } catch (err) {\n set((s) => ({\n error: err instanceof Error ? err.message : \"Failed to steer\",\n // If an existing stream was active, reset it\n streamState: s.streamState.isStreaming\n ? { text: \"\", activeToolName: undefined, isStreaming: false }\n : s.streamState,\n }));\n }\n },\n\n abort: async () => {\n const { activeSessionId } = get();\n if (activeSessionId === undefined) return;\n\n // Optimistically reset streaming state so the UI responds immediately\n // (abort button disappears, send button reappears). The SSE agent_end\n // will confirm this, but we don't wait for it.\n set({\n streamState: {\n text: \"\",\n activeToolName: undefined,\n isStreaming: false,\n },\n });\n\n try {\n await abortSession(activeSessionId);\n } catch {\n // best-effort — SSE events will eventually confirm the state\n }\n },\n\n renameSession: async (sessionId: string, name: string) => {\n try {\n await renameSessionAPI(sessionId, name);\n // Update local state\n set((s) => ({\n sessions: s.sessions.map((sess) =>\n sess.sessionId === sessionId ? { ...sess, name } : sess,\n ),\n projectSessions: Object.fromEntries(\n Object.entries(s.projectSessions).map(([pid, sessions]) => [\n pid,\n sessions.map((sess) =>\n sess.sessionId === sessionId ? { ...sess, name } : sess,\n ),\n ]),\n ),\n }));\n } catch (err) {\n set({ error: err instanceof Error ? err.message : \"Failed to rename session\" });\n }\n },\n\n archiveSession: async (sessionId: string) => {\n // Find the projectId from local state\n const state = get();\n const session = state.sessions.find((s) => s.sessionId === sessionId);\n const projectId = session?.projectId ?? state.activeProjectId;\n try {\n await archiveSessionAPI(sessionId, projectId);\n // Remove from local state\n const wasActive = get().activeSessionId === sessionId;\n set((s) => ({\n sessions: s.sessions.filter((sess) => sess.sessionId !== sessionId),\n projectSessions: projectId\n ? {\n ...s.projectSessions,\n [projectId]: (s.projectSessions[projectId] ?? []).filter(\n (sess) => sess.sessionId !== sessionId,\n ),\n }\n : s.projectSessions,\n activeSessionId:\n s.activeSessionId === sessionId ? undefined : s.activeSessionId,\n }));\n if (wasActive) {\n try {\n localStorage.removeItem(ACTIVE_SESSION_KEY);\n } catch { /* private mode */ }\n }\n } catch (err) {\n set({ error: err instanceof Error ? err.message : \"Failed to archive session\" });\n }\n },\n\n unarchiveSession: async (sessionId: string, projectId: string) => {\n try {\n await unarchiveSessionAPI(sessionId, projectId);\n // Reload both active and archived sessions\n await get().loadProjectSessions(projectId);\n await get().loadArchivedSessions(projectId);\n } catch (err) {\n set({ error: err instanceof Error ? err.message : \"Failed to restore session\" });\n }\n },\n\n loadArchivedSessions: async (projectId: string) => {\n try {\n const { listArchivedSessions } = await import(\"../lib/api-client\");\n const { sessions } = await listArchivedSessions(projectId);\n set((s) => ({\n archivedSessions: { ...s.archivedSessions, [projectId]: sessions },\n }));\n } catch {\n // silently fail\n }\n },\n\n loadCompactions: async (sessionId: string) => {\n try {\n const { compactions } = await getCompactions(sessionId);\n set((s) => ({\n compactionsBySession: { ...s.compactionsBySession, [sessionId]: compactions },\n }));\n } catch {\n // Non-fatal — chat just renders without the cards.\n }\n },\n\n compactAndReload: async (sessionId: string) => {\n // Call the compact API. If it succeeds, also refetch messages and\n // compactions so the ChatView updates even if SSE compaction_end\n // events don't fire (race on manual compact).\n // Load compactions FIRST, then messages — prevents a flash where\n // post-compaction messages render without the CompactionCard.\n const result = await compactSession(sessionId);\n await get().loadCompactions(sessionId);\n await get().reloadMessages(sessionId);\n return result;\n },\n\n reloadMessages: async (sessionId: string) => {\n try {\n const { getSessionMessages } = await import(\"../lib/api-client\");\n const { messages } = await getSessionMessages(sessionId);\n set({ messages });\n } catch {\n // silently fail — next SSE snapshot will fix it\n }\n },\n\n clearError: () => set({ error: undefined }),\n\n deleteProject: async (id: string) => {\n try {\n await deleteProjectAPI(id);\n const state = get();\n if (state.activeProjectId === id) {\n try {\n localStorage.removeItem(ACTIVE_PROJECT_KEY);\n localStorage.removeItem(ACTIVE_SESSION_KEY);\n } catch { /* private mode */ }\n }\n let nextActiveProjectId: string | undefined = state.activeProjectId;\n let nextSessions: SessionSummary[] = state.sessions;\n if (state.activeProjectId === id) {\n nextActiveProjectId = undefined;\n nextSessions = [];\n }\n const old = get().sseClient;\n old?.close();\n const { projects } = await fetchProjects();\n if (nextActiveProjectId === undefined && projects.length > 0) {\n nextActiveProjectId = projects[0].id;\n const { sessions } = await listSessions(nextActiveProjectId);\n nextSessions = sessions;\n }\n set({\n projects,\n activeProjectId: nextActiveProjectId,\n activeSessionId: undefined,\n messages: [],\n sessions: nextSessions,\n projectSessions: nextActiveProjectId\n ? { [nextActiveProjectId]: nextSessions }\n : {},\n sseClient: undefined,\n streamState: { text: \"\", activeToolName: undefined, isStreaming: false },\n error: undefined,\n });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : \"Failed to delete project\" });\n }\n },\n\n // ── Session Tree / Navigate / Fork ──\n\n getSessionTree: async (sessionId: string) => {\n const { getSessionTree: api } = await import(\"../lib/api-client\");\n return api(sessionId);\n },\n\n navigateSession: async (\n sessionId: string,\n entryId: string,\n opts?: { summarize?: boolean; customInstructions?: string; label?: string },\n ) => {\n const { navigateSession: api } = await import(\"../lib/api-client\");\n return api(sessionId, entryId, opts);\n },\n\n forkSession: async (sessionId: string, entryId: string) => {\n const { forkSession: api } = await import(\"../lib/api-client\");\n return api(sessionId, entryId);\n },\n}));\n","/**\n * Hook to detect installed pi extensions at runtime.\n * Used to conditionally activate UI features (detect → activate).\n *\n * Caches the result so it's not refetched on every render.\n */\n\nimport { useEffect, useState, useRef } from \"react\";\nimport { fetchExtensions } from \"../lib/api-client\";\n\ninterface ExtensionState {\n /** Whether pi-rewind is installed */\n rewind: boolean;\n /** Whether pi-subagents or similar is installed */\n subagents: boolean;\n /** Whether pi-orchestration is installed */\n orchestration: boolean;\n /** Loading state */\n loading: boolean;\n}\n\nconst EMPTY: ExtensionState = {\n rewind: false,\n subagents: false,\n orchestration: false,\n loading: true,\n};\n\nlet cached: ExtensionState | null = null;\nlet fetchPromise: Promise<void> | null = null;\n\nexport function useExtensions(): ExtensionState {\n const [state, setState] = useState<ExtensionState>(cached ?? EMPTY);\n const mounted = useRef(true);\n\n useEffect(() => {\n mounted.current = true;\n\n if (cached !== null) {\n setState(cached);\n return;\n }\n\n if (fetchPromise === null) {\n fetchPromise = fetchExtensions()\n .then((res) => {\n // Check if pi-rewind is in detected packages\n const rewindInstalled = res.detected.some(\n (d) =>\n d.name.includes(\"rewind\") ||\n d.name.includes(\"pi-rewind\") ||\n d.name.includes(\"@ayulab/pi-rewind\"),\n );\n\n // Check recommended list too — must be marked as installed\n const rewindRecommended = res.recommended.some(\n (r) => r.installed && (r.id === \"pi-rewind\" || r.name === \"@ayulab/pi-rewind\"),\n );\n\n const subagentsInstalled =\n res.detected.some(\n (d) =>\n d.agentTypes?.includes(\"scout\") ||\n d.name.includes(\"subagents\"),\n ) ||\n res.recommended.some(\n (r) =>\n r.installed && (r.id === \"pi-subagents\" || r.id === \"@ifi/pi-extension-subagents\"),\n );\n\n const orchInstalled =\n res.detected.some((d) => d.name.includes(\"orchestr\")) ||\n res.recommended.some((r) => r.id === \"pi-orchestration\" && r.installed);\n\n cached = {\n rewind: rewindInstalled || rewindRecommended,\n subagents: subagentsInstalled,\n orchestration: orchInstalled,\n loading: false,\n };\n if (mounted.current) setState(cached!);\n })\n .catch(() => {\n cached = { rewind: false, subagents: false, orchestration: false, loading: false };\n if (mounted.current) setState(cached!);\n });\n }\n\n fetchPromise.then(() => {\n if (mounted.current && cached !== null) setState(cached);\n });\n\n return () => {\n mounted.current = false;\n };\n }, []);\n\n return state;\n}\n","export function resolveUrl(url, baseUrl) {\n // url is absolute already\n if (url.match(/^[a-z]+:\\/\\//i)) {\n return url;\n }\n // url is absolute already, without protocol\n if (url.match(/^\\/\\//)) {\n return window.location.protocol + url;\n }\n // dataURI, mailto:, tel:, etc.\n if (url.match(/^[a-z]+:/i)) {\n return url;\n }\n const doc = document.implementation.createHTMLDocument();\n const base = doc.createElement('base');\n const a = doc.createElement('a');\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl) {\n base.href = baseUrl;\n }\n a.href = url;\n return a.href;\n}\nexport const uuid = (() => {\n // generate uuid for className of pseudo elements.\n // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n let counter = 0;\n // ref: http://stackoverflow.com/a/6248722/2519373\n const random = () => \n // eslint-disable-next-line no-bitwise\n `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n})();\nexport function delay(ms) {\n return (args) => new Promise((resolve) => {\n setTimeout(() => resolve(args), ms);\n });\n}\nexport function toArray(arrayLike) {\n const arr = [];\n for (let i = 0, l = arrayLike.length; i < l; i++) {\n arr.push(arrayLike[i]);\n }\n return arr;\n}\nlet styleProps = null;\nexport function getStyleProperties(options = {}) {\n if (styleProps) {\n return styleProps;\n }\n if (options.includeStyleProperties) {\n styleProps = options.includeStyleProperties;\n return styleProps;\n }\n styleProps = toArray(window.getComputedStyle(document.documentElement));\n return styleProps;\n}\nfunction px(node, styleProperty) {\n const win = node.ownerDocument.defaultView || window;\n const val = win.getComputedStyle(node).getPropertyValue(styleProperty);\n return val ? parseFloat(val.replace('px', '')) : 0;\n}\nfunction getNodeWidth(node) {\n const leftBorder = px(node, 'border-left-width');\n const rightBorder = px(node, 'border-right-width');\n return node.clientWidth + leftBorder + rightBorder;\n}\nfunction getNodeHeight(node) {\n const topBorder = px(node, 'border-top-width');\n const bottomBorder = px(node, 'border-bottom-width');\n return node.clientHeight + topBorder + bottomBorder;\n}\nexport function getImageSize(targetNode, options = {}) {\n const width = options.width || getNodeWidth(targetNode);\n const height = options.height || getNodeHeight(targetNode);\n return { width, height };\n}\nexport function getPixelRatio() {\n let ratio;\n let FINAL_PROCESS;\n try {\n FINAL_PROCESS = process;\n }\n catch (e) {\n // pass\n }\n const val = FINAL_PROCESS && FINAL_PROCESS.env\n ? FINAL_PROCESS.env.devicePixelRatio\n : null;\n if (val) {\n ratio = parseInt(val, 10);\n if (Number.isNaN(ratio)) {\n ratio = 1;\n }\n }\n return ratio || window.devicePixelRatio || 1;\n}\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384;\nexport function checkCanvasDimensions(canvas) {\n if (canvas.width > canvasDimensionLimit ||\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvasDimensionLimit &&\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvas.height) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n else if (canvas.width > canvasDimensionLimit) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n}\nexport function canvasToBlob(canvas, options = {}) {\n if (canvas.toBlob) {\n return new Promise((resolve) => {\n canvas.toBlob(resolve, options.type ? options.type : 'image/png', options.quality ? options.quality : 1);\n });\n }\n return new Promise((resolve) => {\n const binaryString = window.atob(canvas\n .toDataURL(options.type ? options.type : undefined, options.quality ? options.quality : undefined)\n .split(',')[1]);\n const len = binaryString.length;\n const binaryArray = new Uint8Array(len);\n for (let i = 0; i < len; i += 1) {\n binaryArray[i] = binaryString.charCodeAt(i);\n }\n resolve(new Blob([binaryArray], {\n type: options.type ? options.type : 'image/png',\n }));\n });\n}\nexport function createImage(url) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n img.decode().then(() => {\n requestAnimationFrame(() => resolve(img));\n });\n };\n img.onerror = reject;\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.src = url;\n });\n}\nexport async function svgToDataURL(svg) {\n return Promise.resolve()\n .then(() => new XMLSerializer().serializeToString(svg))\n .then(encodeURIComponent)\n .then((html) => `data:image/svg+xml;charset=utf-8,${html}`);\n}\nexport async function nodeToDataURL(node, width, height) {\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n const foreignObject = document.createElementNS(xmlns, 'foreignObject');\n svg.setAttribute('width', `${width}`);\n svg.setAttribute('height', `${height}`);\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`);\n foreignObject.setAttribute('width', '100%');\n foreignObject.setAttribute('height', '100%');\n foreignObject.setAttribute('x', '0');\n foreignObject.setAttribute('y', '0');\n foreignObject.setAttribute('externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n foreignObject.appendChild(node);\n return svgToDataURL(svg);\n}\nexport const isInstanceOfElement = (node, instance) => {\n if (node instanceof instance)\n return true;\n const nodePrototype = Object.getPrototypeOf(node);\n if (nodePrototype === null)\n return false;\n return (nodePrototype.constructor.name === instance.name ||\n isInstanceOfElement(nodePrototype, instance));\n};\n//# sourceMappingURL=util.js.map","import { uuid, getStyleProperties } from './util';\nfunction formatCSSText(style) {\n const content = style.getPropertyValue('content');\n return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`;\n}\nfunction formatCSSProperties(style, options) {\n return getStyleProperties(options)\n .map((name) => {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n return `${name}: ${value}${priority ? ' !important' : ''};`;\n })\n .join(' ');\n}\nfunction getPseudoElementStyle(className, pseudo, style, options) {\n const selector = `.${className}:${pseudo}`;\n const cssText = style.cssText\n ? formatCSSText(style)\n : formatCSSProperties(style, options);\n return document.createTextNode(`${selector}{${cssText}}`);\n}\nfunction clonePseudoElement(nativeNode, clonedNode, pseudo, options) {\n const style = window.getComputedStyle(nativeNode, pseudo);\n const content = style.getPropertyValue('content');\n if (content === '' || content === 'none') {\n return;\n }\n const className = uuid();\n try {\n clonedNode.className = `${clonedNode.className} ${className}`;\n }\n catch (err) {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.appendChild(getPseudoElementStyle(className, pseudo, style, options));\n clonedNode.appendChild(styleElement);\n}\nexport function clonePseudoElements(nativeNode, clonedNode, options) {\n clonePseudoElement(nativeNode, clonedNode, ':before', options);\n clonePseudoElement(nativeNode, clonedNode, ':after', options);\n}\n//# sourceMappingURL=clone-pseudos.js.map","const WOFF = 'application/font-woff';\nconst JPEG = 'image/jpeg';\nconst mimes = {\n woff: WOFF,\n woff2: WOFF,\n ttf: 'application/font-truetype',\n eot: 'application/vnd.ms-fontobject',\n png: 'image/png',\n jpg: JPEG,\n jpeg: JPEG,\n gif: 'image/gif',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n};\nfunction getExtension(url) {\n const match = /\\.([^./]*?)$/g.exec(url);\n return match ? match[1] : '';\n}\nexport function getMimeType(url) {\n const extension = getExtension(url).toLowerCase();\n return mimes[extension] || '';\n}\n//# sourceMappingURL=mimes.js.map","function getContentFromDataUrl(dataURL) {\n return dataURL.split(/,/)[1];\n}\nexport function isDataUrl(url) {\n return url.search(/^(data:)/) !== -1;\n}\nexport function makeDataUrl(content, mimeType) {\n return `data:${mimeType};base64,${content}`;\n}\nexport async function fetchAsDataURL(url, init, process) {\n const res = await fetch(url, init);\n if (res.status === 404) {\n throw new Error(`Resource \"${res.url}\" not found`);\n }\n const blob = await res.blob();\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = () => {\n try {\n resolve(process({ res, result: reader.result }));\n }\n catch (error) {\n reject(error);\n }\n };\n reader.readAsDataURL(blob);\n });\n}\nconst cache = {};\nfunction getCacheKey(url, contentType, includeQueryParams) {\n let key = url.replace(/\\?.*/, '');\n if (includeQueryParams) {\n key = url;\n }\n // font resource\n if (/ttf|otf|eot|woff2?/i.test(key)) {\n key = key.replace(/.*\\//, '');\n }\n return contentType ? `[${contentType}]${key}` : key;\n}\nexport async function resourceToDataURL(resourceUrl, contentType, options) {\n const cacheKey = getCacheKey(resourceUrl, contentType, options.includeQueryParams);\n if (cache[cacheKey] != null) {\n return cache[cacheKey];\n }\n // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n if (options.cacheBust) {\n // eslint-disable-next-line no-param-reassign\n resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime();\n }\n let dataURL;\n try {\n const content = await fetchAsDataURL(resourceUrl, options.fetchRequestInit, ({ res, result }) => {\n if (!contentType) {\n // eslint-disable-next-line no-param-reassign\n contentType = res.headers.get('Content-Type') || '';\n }\n return getContentFromDataUrl(result);\n });\n dataURL = makeDataUrl(content, contentType);\n }\n catch (error) {\n dataURL = options.imagePlaceholder || '';\n let msg = `Failed to fetch resource: ${resourceUrl}`;\n if (error) {\n msg = typeof error === 'string' ? error : error.message;\n }\n if (msg) {\n console.warn(msg);\n }\n }\n cache[cacheKey] = dataURL;\n return dataURL;\n}\n//# sourceMappingURL=dataurl.js.map","import { clonePseudoElements } from './clone-pseudos';\nimport { createImage, toArray, isInstanceOfElement, getStyleProperties, } from './util';\nimport { getMimeType } from './mimes';\nimport { resourceToDataURL } from './dataurl';\nasync function cloneCanvasElement(canvas) {\n const dataURL = canvas.toDataURL();\n if (dataURL === 'data:,') {\n return canvas.cloneNode(false);\n }\n return createImage(dataURL);\n}\nasync function cloneVideoElement(video, options) {\n if (video.currentSrc) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.width = video.clientWidth;\n canvas.height = video.clientHeight;\n ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n const dataURL = canvas.toDataURL();\n return createImage(dataURL);\n }\n const poster = video.poster;\n const contentType = getMimeType(poster);\n const dataURL = await resourceToDataURL(poster, contentType, options);\n return createImage(dataURL);\n}\nasync function cloneIFrameElement(iframe, options) {\n var _a;\n try {\n if ((_a = iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) === null || _a === void 0 ? void 0 : _a.body) {\n return (await cloneNode(iframe.contentDocument.body, options, true));\n }\n }\n catch (_b) {\n // Failed to clone iframe\n }\n return iframe.cloneNode(false);\n}\nasync function cloneSingleNode(node, options) {\n if (isInstanceOfElement(node, HTMLCanvasElement)) {\n return cloneCanvasElement(node);\n }\n if (isInstanceOfElement(node, HTMLVideoElement)) {\n return cloneVideoElement(node, options);\n }\n if (isInstanceOfElement(node, HTMLIFrameElement)) {\n return cloneIFrameElement(node, options);\n }\n return node.cloneNode(isSVGElement(node));\n}\nconst isSlotElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SLOT';\nconst isSVGElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SVG';\nasync function cloneChildren(nativeNode, clonedNode, options) {\n var _a, _b;\n if (isSVGElement(clonedNode)) {\n return clonedNode;\n }\n let children = [];\n if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n children = toArray(nativeNode.assignedNodes());\n }\n else if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n ((_a = nativeNode.contentDocument) === null || _a === void 0 ? void 0 : _a.body)) {\n children = toArray(nativeNode.contentDocument.body.childNodes);\n }\n else {\n children = toArray(((_b = nativeNode.shadowRoot) !== null && _b !== void 0 ? _b : nativeNode).childNodes);\n }\n if (children.length === 0 ||\n isInstanceOfElement(nativeNode, HTMLVideoElement)) {\n return clonedNode;\n }\n await children.reduce((deferred, child) => deferred\n .then(() => cloneNode(child, options))\n .then((clonedChild) => {\n if (clonedChild) {\n clonedNode.appendChild(clonedChild);\n }\n }), Promise.resolve());\n return clonedNode;\n}\nfunction cloneCSSStyle(nativeNode, clonedNode, options) {\n const targetStyle = clonedNode.style;\n if (!targetStyle) {\n return;\n }\n const sourceStyle = window.getComputedStyle(nativeNode);\n if (sourceStyle.cssText) {\n targetStyle.cssText = sourceStyle.cssText;\n targetStyle.transformOrigin = sourceStyle.transformOrigin;\n }\n else {\n getStyleProperties(options).forEach((name) => {\n let value = sourceStyle.getPropertyValue(name);\n if (name === 'font-size' && value.endsWith('px')) {\n const reducedFont = Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1;\n value = `${reducedFont}px`;\n }\n if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n name === 'display' &&\n value === 'inline') {\n value = 'block';\n }\n if (name === 'd' && clonedNode.getAttribute('d')) {\n value = `path(${clonedNode.getAttribute('d')})`;\n }\n targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));\n });\n }\n}\nfunction cloneInputValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n clonedNode.innerHTML = nativeNode.value;\n }\n if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n clonedNode.setAttribute('value', nativeNode.value);\n }\n}\nfunction cloneSelectValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n const clonedSelect = clonedNode;\n const selectedOption = Array.from(clonedSelect.children).find((child) => nativeNode.value === child.getAttribute('value'));\n if (selectedOption) {\n selectedOption.setAttribute('selected', '');\n }\n }\n}\nfunction decorate(nativeNode, clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n cloneCSSStyle(nativeNode, clonedNode, options);\n clonePseudoElements(nativeNode, clonedNode, options);\n cloneInputValue(nativeNode, clonedNode);\n cloneSelectValue(nativeNode, clonedNode);\n }\n return clonedNode;\n}\nasync function ensureSVGSymbols(clone, options) {\n const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : [];\n if (uses.length === 0) {\n return clone;\n }\n const processedDefs = {};\n for (let i = 0; i < uses.length; i++) {\n const use = uses[i];\n const id = use.getAttribute('xlink:href');\n if (id) {\n const exist = clone.querySelector(id);\n const definition = document.querySelector(id);\n if (!exist && definition && !processedDefs[id]) {\n // eslint-disable-next-line no-await-in-loop\n processedDefs[id] = (await cloneNode(definition, options, true));\n }\n }\n }\n const nodes = Object.values(processedDefs);\n if (nodes.length) {\n const ns = 'http://www.w3.org/1999/xhtml';\n const svg = document.createElementNS(ns, 'svg');\n svg.setAttribute('xmlns', ns);\n svg.style.position = 'absolute';\n svg.style.width = '0';\n svg.style.height = '0';\n svg.style.overflow = 'hidden';\n svg.style.display = 'none';\n const defs = document.createElementNS(ns, 'defs');\n svg.appendChild(defs);\n for (let i = 0; i < nodes.length; i++) {\n defs.appendChild(nodes[i]);\n }\n clone.appendChild(svg);\n }\n return clone;\n}\nexport async function cloneNode(node, options, isRoot) {\n if (!isRoot && options.filter && !options.filter(node)) {\n return null;\n }\n return Promise.resolve(node)\n .then((clonedNode) => cloneSingleNode(clonedNode, options))\n .then((clonedNode) => cloneChildren(node, clonedNode, options))\n .then((clonedNode) => decorate(node, clonedNode, options))\n .then((clonedNode) => ensureSVGSymbols(clonedNode, options));\n}\n//# sourceMappingURL=clone-node.js.map","import { resolveUrl } from './util';\nimport { getMimeType } from './mimes';\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl';\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction toRegex(url) {\n // eslint-disable-next-line no-useless-escape\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1');\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g');\n}\nexport function parseURLs(cssText) {\n const urls = [];\n cssText.replace(URL_REGEX, (raw, quotation, url) => {\n urls.push(url);\n return raw;\n });\n return urls.filter((url) => !isDataUrl(url));\n}\nexport async function embed(cssText, resourceURL, baseURL, options, getContentFromUrl) {\n try {\n const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL;\n const contentType = getMimeType(resourceURL);\n let dataURL;\n if (getContentFromUrl) {\n const content = await getContentFromUrl(resolvedURL);\n dataURL = makeDataUrl(content, contentType);\n }\n else {\n dataURL = await resourceToDataURL(resolvedURL, contentType, options);\n }\n return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`);\n }\n catch (error) {\n // pass\n }\n return cssText;\n}\nfunction filterPreferredFontFormat(str, { preferredFontFormat }) {\n return !preferredFontFormat\n ? str\n : str.replace(FONT_SRC_REGEX, (match) => {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || [];\n if (!format) {\n return '';\n }\n if (format === preferredFontFormat) {\n return `src: ${src};`;\n }\n }\n });\n}\nexport function shouldEmbed(url) {\n return url.search(URL_REGEX) !== -1;\n}\nexport async function embedResources(cssText, baseUrl, options) {\n if (!shouldEmbed(cssText)) {\n return cssText;\n }\n const filteredCSSText = filterPreferredFontFormat(cssText, options);\n const urls = parseURLs(filteredCSSText);\n return urls.reduce((deferred, url) => deferred.then((css) => embed(css, url, baseUrl, options)), Promise.resolve(filteredCSSText));\n}\n//# sourceMappingURL=embed-resources.js.map","import { embedResources } from './embed-resources';\nimport { toArray, isInstanceOfElement } from './util';\nimport { isDataUrl, resourceToDataURL } from './dataurl';\nimport { getMimeType } from './mimes';\nasync function embedProp(propName, node, options) {\n var _a;\n const propValue = (_a = node.style) === null || _a === void 0 ? void 0 : _a.getPropertyValue(propName);\n if (propValue) {\n const cssString = await embedResources(propValue, null, options);\n node.style.setProperty(propName, cssString, node.style.getPropertyPriority(propName));\n return true;\n }\n return false;\n}\nasync function embedBackground(clonedNode, options) {\n ;\n (await embedProp('background', clonedNode, options)) ||\n (await embedProp('background-image', clonedNode, options));\n (await embedProp('mask', clonedNode, options)) ||\n (await embedProp('-webkit-mask', clonedNode, options)) ||\n (await embedProp('mask-image', clonedNode, options)) ||\n (await embedProp('-webkit-mask-image', clonedNode, options));\n}\nasync function embedImageNode(clonedNode, options) {\n const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement);\n if (!(isImageElement && !isDataUrl(clonedNode.src)) &&\n !(isInstanceOfElement(clonedNode, SVGImageElement) &&\n !isDataUrl(clonedNode.href.baseVal))) {\n return;\n }\n const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal;\n const dataURL = await resourceToDataURL(url, getMimeType(url), options);\n await new Promise((resolve, reject) => {\n clonedNode.onload = resolve;\n clonedNode.onerror = options.onImageErrorHandler\n ? (...attributes) => {\n try {\n resolve(options.onImageErrorHandler(...attributes));\n }\n catch (error) {\n reject(error);\n }\n }\n : reject;\n const image = clonedNode;\n if (image.decode) {\n image.decode = resolve;\n }\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n if (isImageElement) {\n clonedNode.srcset = '';\n clonedNode.src = dataURL;\n }\n else {\n clonedNode.href.baseVal = dataURL;\n }\n });\n}\nasync function embedChildren(clonedNode, options) {\n const children = toArray(clonedNode.childNodes);\n const deferreds = children.map((child) => embedImages(child, options));\n await Promise.all(deferreds).then(() => clonedNode);\n}\nexport async function embedImages(clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n await embedBackground(clonedNode, options);\n await embedImageNode(clonedNode, options);\n await embedChildren(clonedNode, options);\n }\n}\n//# sourceMappingURL=embed-images.js.map","export function applyStyle(node, options) {\n const { style } = node;\n if (options.backgroundColor) {\n style.backgroundColor = options.backgroundColor;\n }\n if (options.width) {\n style.width = `${options.width}px`;\n }\n if (options.height) {\n style.height = `${options.height}px`;\n }\n const manual = options.style;\n if (manual != null) {\n Object.keys(manual).forEach((key) => {\n style[key] = manual[key];\n });\n }\n return node;\n}\n//# sourceMappingURL=apply-style.js.map","import { toArray } from './util';\nimport { fetchAsDataURL } from './dataurl';\nimport { shouldEmbed, embedResources } from './embed-resources';\nconst cssFetchCache = {};\nasync function fetchCSS(url) {\n let cache = cssFetchCache[url];\n if (cache != null) {\n return cache;\n }\n const res = await fetch(url);\n const cssText = await res.text();\n cache = { url, cssText };\n cssFetchCache[url] = cache;\n return cache;\n}\nasync function embedFonts(data, options) {\n let cssText = data.cssText;\n const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g;\n const fontLocs = cssText.match(/url\\([^)]+\\)/g) || [];\n const loadFonts = fontLocs.map(async (loc) => {\n let url = loc.replace(regexUrl, '$1');\n if (!url.startsWith('https://')) {\n url = new URL(url, data.url).href;\n }\n return fetchAsDataURL(url, options.fetchRequestInit, ({ result }) => {\n cssText = cssText.replace(loc, `url(${result})`);\n return [loc, result];\n });\n });\n return Promise.all(loadFonts).then(() => cssText);\n}\nfunction parseCSS(source) {\n if (source == null) {\n return [];\n }\n const result = [];\n const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi;\n // strip out comments\n let cssText = source.replace(commentsRegex, '');\n // eslint-disable-next-line prefer-regex-literals\n const keyframesRegex = new RegExp('((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})', 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const matches = keyframesRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n result.push(matches[0]);\n }\n cssText = cssText.replace(keyframesRegex, '');\n const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n // to match css & media queries together\n const combinedCSSRegex = '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})';\n // unified regex\n const unifiedRegex = new RegExp(combinedCSSRegex, 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let matches = importRegex.exec(cssText);\n if (matches === null) {\n matches = unifiedRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n else {\n importRegex.lastIndex = unifiedRegex.lastIndex;\n }\n }\n else {\n unifiedRegex.lastIndex = importRegex.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nasync function getCSSRules(styleSheets, options) {\n const ret = [];\n const deferreds = [];\n // First loop inlines imports\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item, index) => {\n if (item.type === CSSRule.IMPORT_RULE) {\n let importIndex = index + 1;\n const url = item.href;\n const deferred = fetchCSS(url)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n try {\n sheet.insertRule(rule, rule.startsWith('@import')\n ? (importIndex += 1)\n : sheet.cssRules.length);\n }\n catch (error) {\n console.error('Error inserting rule from remote css', {\n rule,\n error,\n });\n }\n }))\n .catch((e) => {\n console.error('Error loading remote css', e.toString());\n });\n deferreds.push(deferred);\n }\n });\n }\n catch (e) {\n const inline = styleSheets.find((a) => a.href == null) || document.styleSheets[0];\n if (sheet.href != null) {\n deferreds.push(fetchCSS(sheet.href)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n inline.insertRule(rule, inline.cssRules.length);\n }))\n .catch((err) => {\n console.error('Error loading remote stylesheet', err);\n }));\n }\n console.error('Error inlining remote css file', e);\n }\n }\n });\n return Promise.all(deferreds).then(() => {\n // Second loop parses rules\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item) => {\n ret.push(item);\n });\n }\n catch (e) {\n console.error(`Error while reading CSS rules from ${sheet.href}`, e);\n }\n }\n });\n return ret;\n });\n}\nfunction getWebFontRules(cssRules) {\n return cssRules\n .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')));\n}\nasync function parseWebFontRules(node, options) {\n if (node.ownerDocument == null) {\n throw new Error('Provided element is not within a Document');\n }\n const styleSheets = toArray(node.ownerDocument.styleSheets);\n const cssRules = await getCSSRules(styleSheets, options);\n return getWebFontRules(cssRules);\n}\nfunction normalizeFontFamily(font) {\n return font.trim().replace(/[\"']/g, '');\n}\nfunction getUsedFonts(node) {\n const fonts = new Set();\n function traverse(node) {\n const fontFamily = node.style.fontFamily || getComputedStyle(node).fontFamily;\n fontFamily.split(',').forEach((font) => {\n fonts.add(normalizeFontFamily(font));\n });\n Array.from(node.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n traverse(child);\n }\n });\n }\n traverse(node);\n return fonts;\n}\nexport async function getWebFontCSS(node, options) {\n const rules = await parseWebFontRules(node, options);\n const usedFonts = getUsedFonts(node);\n const cssTexts = await Promise.all(rules\n .filter((rule) => usedFonts.has(normalizeFontFamily(rule.style.fontFamily)))\n .map((rule) => {\n const baseUrl = rule.parentStyleSheet\n ? rule.parentStyleSheet.href\n : null;\n return embedResources(rule.cssText, baseUrl, options);\n }));\n return cssTexts.join('\\n');\n}\nexport async function embedWebFonts(clonedNode, options) {\n const cssText = options.fontEmbedCSS != null\n ? options.fontEmbedCSS\n : options.skipFonts\n ? null\n : await getWebFontCSS(clonedNode, options);\n if (cssText) {\n const styleNode = document.createElement('style');\n const sytleContent = document.createTextNode(cssText);\n styleNode.appendChild(sytleContent);\n if (clonedNode.firstChild) {\n clonedNode.insertBefore(styleNode, clonedNode.firstChild);\n }\n else {\n clonedNode.appendChild(styleNode);\n }\n }\n}\n//# sourceMappingURL=embed-webfonts.js.map","import { cloneNode } from './clone-node';\nimport { embedImages } from './embed-images';\nimport { applyStyle } from './apply-style';\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts';\nimport { getImageSize, getPixelRatio, createImage, canvasToBlob, nodeToDataURL, checkCanvasDimensions, } from './util';\nexport async function toSvg(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const clonedNode = (await cloneNode(node, options, true));\n await embedWebFonts(clonedNode, options);\n await embedImages(clonedNode, options);\n applyStyle(clonedNode, options);\n const datauri = await nodeToDataURL(clonedNode, width, height);\n return datauri;\n}\nexport async function toCanvas(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const svg = await toSvg(node, options);\n const img = await createImage(svg);\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n const ratio = options.pixelRatio || getPixelRatio();\n const canvasWidth = options.canvasWidth || width;\n const canvasHeight = options.canvasHeight || height;\n canvas.width = canvasWidth * ratio;\n canvas.height = canvasHeight * ratio;\n if (!options.skipAutoScale) {\n checkCanvasDimensions(canvas);\n }\n canvas.style.width = `${canvasWidth}`;\n canvas.style.height = `${canvasHeight}`;\n if (options.backgroundColor) {\n context.fillStyle = options.backgroundColor;\n context.fillRect(0, 0, canvas.width, canvas.height);\n }\n context.drawImage(img, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\nexport async function toPixelData(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const canvas = await toCanvas(node, options);\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, width, height).data;\n}\nexport async function toPng(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL();\n}\nexport async function toJpeg(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL('image/jpeg', options.quality || 1);\n}\nexport async function toBlob(node, options = {}) {\n const canvas = await toCanvas(node, options);\n const blob = await canvasToBlob(canvas);\n return blob;\n}\nexport async function getFontEmbedCSS(node, options = {}) {\n return getWebFontCSS(node, options);\n}\n//# sourceMappingURL=index.js.map","import { useEffect, useMemo, useState, type HTMLAttributes, type ReactNode } from \"react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { Highlight, themes as prismThemes } from \"prism-react-renderer\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport rehypeKatex from \"rehype-katex\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport \"katex/dist/katex.min.css\";\n\ntype Props = { text: string; chatStyleBreaks?: boolean };\n\n/**\n * Regex matching a <proposed_plan>...</proposed_plan> block (non-greedy).\n * Captures the inner content in group 1.\n */\nconst PROPOSED_PLAN_RE = /<proposed_plan>([\\s\\S]*?)<\\/proposed_plan>/gi;\n\nconst LIGHT_RE = /^light|clean|terracotta|sage$/i;\n\nfunction ThemeAwareCode({ className, children, ...rest }: HTMLAttributes<HTMLElement>): ReactNode {\n const [isLight, setIsLight] = useState(() => {\n if (typeof window === \"undefined\") return false;\n try {\n const theme = document.documentElement.getAttribute(\"data-theme\");\n if (theme && LIGHT_RE.test(theme)) return true;\n } catch {}\n return window.matchMedia?.(\"(prefers-color-scheme: light)\")?.matches ?? false;\n });\n\n useEffect(() => {\n const root = document.documentElement;\n const read = () => {\n const theme = root.getAttribute(\"data-theme\");\n setIsLight(!!(theme && LIGHT_RE.test(theme)));\n };\n read();\n const mq = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n const handler = () => read();\n mq?.addEventListener?.(\"change\", handler);\n const obs = new MutationObserver(handler);\n root && obs.observe(root, { attributes: true, attributeFilter: [\"data-theme\"] });\n return () => {\n mq?.removeEventListener?.(\"change\", handler);\n obs.disconnect();\n };\n }, []);\n\n const langMatch = /language-([\\w-]+)/.exec(className ?? \"\");\n const code = String(children ?? \"\").replace(/\\n$/, \"\");\n const isBlock = langMatch !== null || code.includes(\"\\n\");\n\n if (!isBlock) {\n return (\n <code className=\"inline-code\" {...rest}>\n {children}\n </code>\n );\n }\n\n const language = langMatch?.[1] ?? \"text\";\n const prismTheme = isLight ? prismThemes.vsLight : prismThemes.vsDark;\n const codeBg = isLight ? \"#f8fafc\" : \"#0d0d0d\";\n\n return (\n <div className=\"code-block-wrap\">\n <CodeCopyButton code={code} />\n <Highlight code={code} language={language} theme={prismTheme}>\n {({ style, tokens, getLineProps, getTokenProps }) => (\n <pre className=\"code-block\" style={{ ...style, background: codeBg }}>\n {tokens.map((line, i) => {\n const lineProps = getLineProps({ line });\n return (\n <div key={i} {...lineProps}>\n {line.map((token, key) => {\n const tokenProps = getTokenProps({ token });\n return <span key={key} {...tokenProps} />;\n })}\n </div>\n );\n })}\n </pre>\n )}\n </Highlight>\n </div>\n );\n}\n\nfunction CodeCopyButton({ code }: { code: string }) {\n const [copied, setCopied] = useState(false);\n const flash = () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n };\n const fallback = (text: string): void => {\n try {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n document.body.removeChild(ta);\n flash();\n } catch {\n // Clipboard unavailable\n }\n };\n const onClick = () => {\n if (!code) return;\n const writeAsync = navigator.clipboard?.writeText?.bind(navigator.clipboard);\n if (writeAsync !== undefined) {\n void writeAsync(code).then(flash).catch(() => fallback(code));\n } else {\n fallback(code);\n }\n };\n return (\n <button type=\"button\" onClick={onClick} className=\"code-copy-btn\" title=\"Copy code block\" aria-label=\"Copy code block\">\n {copied ? <Check size={13} /> : <Copy size={13} />}\n </button>\n );\n}\n\nconst components: Components = {\n h1: ({ children }) => <h1 className=\"md-h1\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"md-h2\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"md-h3\">{children}</h3>,\n h4: ({ children }) => <h4 className=\"md-h4\">{children}</h4>,\n\n p: ({ children }) => <p className=\"md-p\">{children}</p>,\n ul: ({ children }) => <ul className=\"md-ul\">{children}</ul>,\n ol: ({ children }) => <ol className=\"md-ol\">{children}</ol>,\n li: ({ children }) => <li className=\"md-li\">{children}</li>,\n\n blockquote: ({ children }) => <blockquote className=\"md-blockquote\">{children}</blockquote>,\n hr: () => <hr className=\"md-hr\" />,\n a: ({ href, children }) => (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"md-link\">\n {children}\n </a>\n ),\n\n table: ({ children }) => (\n <div className=\"table-wrapper\">\n <table className=\"md-table\">{children}</table>\n </div>\n ),\n th: ({ children }) => <th className=\"md-th\">{children}</th>,\n td: ({ children }) => <td className=\"md-td\">{children}</td>,\n\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n\n code: ThemeAwareCode,\n pre: ({ children }) => <>{children}</>,\n};\n\n/**\n * Styled card for <proposed_plan> blocks rendered by the pi-plan-mode extension.\n * Displays the inner plan content as markdown inside a bordered panel.\n */\nfunction ProposedPlanCard({ content }: { content: string }) {\n return (\n <div\n style={{\n border: \"1px solid var(--accent-subtle, rgba(255,255,255,0.12))\",\n borderRadius: \"var(--radius-md, 10px)\",\n padding: \"16px 20px\",\n margin: \"16px 0\",\n background: \"var(--bg-glass-strong, rgba(255,255,255,0.04))\",\n }}\n >\n <div style={{\n fontSize: \"11px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: \"var(--text-dim, rgba(255,255,255,0.3))\",\n marginBottom: \"12px\",\n }}>\n Proposed Plan\n </div>\n <ChatMarkdown text={content} />\n </div>\n );\n}\n\n/**\n * Split input text into an array of segments: either plain markdown strings\n * or ProposedPlanCard components (for <proposed_plan> blocks).\n */\nfunction renderSegments(text: string): (string | ReactNode)[] {\n const segments: (string | ReactNode)[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n // Reset regex state\n PROPOSED_PLAN_RE.lastIndex = 0;\n\n while ((match = PROPOSED_PLAN_RE.exec(text)) !== null) {\n // Push leading plain text before this match\n if (match.index > lastIndex) {\n segments.push(text.slice(lastIndex, match.index));\n }\n // Push the card for the proposed plan block\n segments.push(<ProposedPlanCard key={match.index} content={match[1].trim()} />);\n lastIndex = match.index + match[0].length;\n }\n\n // Push any trailing plain text\n if (lastIndex < text.length) {\n segments.push(text.slice(lastIndex));\n }\n\n return segments.length > 0 ? segments : [text];\n}\n\nexport function ChatMarkdown({ text, chatStyleBreaks }: Props) {\n const plugins = chatStyleBreaks ? [remarkGfm, remarkMath, remarkBreaks] : [remarkGfm, remarkMath];\n\n const segments = useMemo(() => renderSegments(text), [text]);\n\n // Fast path: no proposed_plan blocks — just render as plain markdown\n if (segments.length === 1 && typeof segments[0] === \"string\") {\n return (\n <div className=\"md-root text-sm break-words\" style={{ overflowWrap: \"anywhere\" }}>\n <ReactMarkdown remarkPlugins={plugins} rehypePlugins={[rehypeKatex]} components={components}>\n {text}\n </ReactMarkdown>\n </div>\n );\n }\n\n // Mixed: segments contain ProposedPlanCard components interspersed with markdown text\n return (\n <div className=\"md-root text-sm break-words\" style={{ overflowWrap: \"anywhere\" }}>\n {segments.map((seg, i) =>\n typeof seg === \"string\" ? (\n <ReactMarkdown\n key={i}\n remarkPlugins={plugins}\n rehypePlugins={[rehypeKatex]}\n components={components}\n >\n {seg}\n </ReactMarkdown>\n ) : (\n seg\n )\n )}\n </div>\n );\n}\n","import { memo, useRef, useState } from \"react\";\nimport { ChevronDown, ChevronRight, ChevronUp, Layers } from \"lucide-react\";\nimport { ChatMarkdown } from \"./ChatMarkdown\";\nimport type { CompactionEvent } from \"../lib/api-client\";\n\nconst NEAR_BOTTOM_PX = 96;\n\nfunction isNearBottom(el: HTMLElement): boolean {\n return el.scrollHeight - el.scrollTop - el.clientHeight <= NEAR_BOTTOM_PX;\n}\n\nfunction findScrollParent(start: Element | null): HTMLElement | undefined {\n let node = start;\n while (node instanceof HTMLElement) {\n const style = window.getComputedStyle(node);\n if (/(auto|scroll)/.test(style.overflowY)) return node;\n node = node.parentElement;\n }\n return undefined;\n}\n\n/**\n * Inline marker card rendered between chat messages at every point\n * where pi compacted the context. Collapsed default — shows a single\n * line \"Compacted\" with summary, token count, and timestamp. Click to\n * expand and see the archived messages.\n *\n * Uses pi-kot's theme CSS variables (--accent, --bg-glass, --border,\n * --text-*) so it integrates with any theme.\n */\nexport function CompactionCard({\n event,\n renderArchived,\n}: {\n event: CompactionEvent;\n /** Lazy renderer for archived messages — parent passes this so the\n * archived messages are only rendered into a self-contained component\n * when the card is expanded. Keeps the main ChatView render loop\n * fast by avoiding markdown-heavy archived messages on every tick. */\n renderArchived?: () => React.ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const when = new Date(event.timestamp);\n const timeLabel = `${when.toLocaleDateString()} ${when.toLocaleTimeString()}`;\n const archivedCount = event.archivedMessages.length;\n // Strip SDK prefix like \"Goal:\" or \"Summary:\" — the card already says \"Compacted\"\n const summaryText = event.summary.replace(/^(Goal|Summary):\\s*/i, \"\");\n const rootRef = useRef<HTMLDivElement>(null);\n\n const toggleOpen = (nextOpen: boolean): void => {\n const scroller = findScrollParent(rootRef.current);\n const wasPinnedToBottom = scroller !== undefined && isNearBottom(scroller);\n setOpen(nextOpen);\n if (nextOpen && wasPinnedToBottom) {\n window.requestAnimationFrame(() => {\n scroller.scrollTop = scroller.scrollHeight;\n });\n }\n };\n\n const collapseBtn = (pos: \"top\" | \"bottom\"): React.ReactNode => (\n <button\n type=\"button\"\n onClick={() => toggleOpen(false)}\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"4px\",\n padding: \"6px 8px\",\n fontSize: \"10px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"var(--text-dim)\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"var(--radius-sm)\",\n cursor: \"pointer\",\n }}\n title=\"Collapse archived messages\"\n aria-label={`Collapse compaction summary from ${pos}`}\n >\n <ChevronDown size={11} />\n Collapse\n </button>\n );\n\n return (\n <div\n ref={rootRef}\n style={{\n margin: \"8px 0\",\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid var(--border)\",\n background: \"var(--bg-glass)\",\n overflow: \"hidden\",\n }}\n >\n {open && (\n <div\n style={{\n borderBottom: \"1px solid var(--border)\",\n padding: \"12px\",\n }}\n >\n {collapseBtn(\"top\")}\n\n {/* Full SDK summary */}\n {event.summary.length > 0 && (\n <div\n style={{\n margin: \"12px 0\",\n padding: \"8px 10px\",\n borderRadius: \"var(--radius-sm)\",\n background: \"var(--bg-glass-strong)\",\n fontSize: \"11px\",\n lineHeight: \"1.6\",\n color: \"var(--text-secondary)\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {summaryText}\n </div>\n )}\n\n {/* Archived messages — rendered lazily via parent callback */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n opacity: 0.85,\n }}\n >\n {renderArchived?.()}\n </div>\n\n <div style={{ marginTop: \"12px\" }}>{collapseBtn(\"bottom\")}</div>\n </div>\n )}\n\n {/* Collapsed header */}\n <button\n type=\"button\"\n onClick={() => toggleOpen(!open)}\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"8px 12px\",\n textAlign: \"left\",\n fontSize: \"12px\",\n color: \"var(--text-secondary)\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"background var(--duration) var(--ease)\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.background = \"var(--bg-glass-hover)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.background = \"transparent\";\n }}\n title={\n open\n ? \"Hide archived messages\"\n : `Expand ${archivedCount} archived message${archivedCount === 1 ? \"\" : \"s\"}`\n }\n >\n {open ? (\n <ChevronUp size={12} style={{ color: \"var(--accent)\" }} />\n ) : (\n <ChevronRight size={12} style={{ color: \"var(--accent)\" }} />\n )}\n <Layers size={12} style={{ color: \"var(--accent)\", flexShrink: 0 }} />\n <span\n style={{\n flex: 1,\n fontWeight: 600,\n color: \"var(--text-primary)\",\n fontFeatureSettings: \"'tnum'\",\n }}\n >\n Compacted\n </span>\n <span\n style={{\n fontFamily: \"monospace\",\n fontSize: \"10px\",\n color: \"var(--text-dim)\",\n fontVariantNumeric: \"tabular-nums\",\n whiteSpace: \"nowrap\",\n }}\n >\n -{archivedCount} msg · -{event.tokensBefore.toLocaleString()} tok\n {event.estimatedTokensAfter !== undefined && (\n <>\n <span style={{ margin: \"0 2px\", color: \"var(--border)\" }}>→</span>\n ~{event.estimatedTokensAfter.toLocaleString()} tok\n </>\n )}\n </span>\n <span\n style={{\n fontSize: \"10px\",\n color: \"var(--text-dim)\",\n fontVariantNumeric: \"tabular-nums\",\n whiteSpace: \"nowrap\",\n }}\n >\n {timeLabel}\n </span>\n </button>\n\n {/* Summary preview when collapsed — one line, truncated */}\n {!open && event.summary.length > 0 && (\n <div\n style={{\n padding: \"0 12px 8px 12px\",\n fontSize: \"11px\",\n lineHeight: \"1.4\",\n color: \"var(--text-dim)\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n textOverflow: \"ellipsis\",\n }}\n >\n {summaryText}\n </div>\n )}\n </div>\n );\n}\n\n\n","import { create } from \"zustand\";\n\nconst LS_STICKY_USER_HEADER = \"pi-kot/sticky-user-header\";\nconst LS_SHOW_TOKEN_USAGE = \"pi-kot/show-token-usage\";\nconst LS_COMPRESS_IMAGES = \"pi-kot/compress-images\";\n\nfunction loadStickyUserHeader(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n const v = localStorage.getItem(LS_STICKY_USER_HEADER);\n return v === null ? false : v === \"true\";\n } catch {\n return false;\n }\n}\n\nfunction loadShowTokenUsage(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n const v = localStorage.getItem(LS_SHOW_TOKEN_USAGE);\n return v === null ? false : v === \"true\";\n } catch {\n return false;\n }\n}\n\nfunction loadCompressImages(): boolean {\n if (typeof window === \"undefined\") return true;\n try {\n const v = localStorage.getItem(LS_COMPRESS_IMAGES);\n return v === null ? true : v === \"true\";\n } catch {\n return true;\n }\n}\n\nexport interface PreferencesState {\n stickyUserHeader: boolean;\n setStickyUserHeader: (enabled: boolean) => void;\n showTokenUsage: boolean;\n setShowTokenUsage: (enabled: boolean) => void;\n compressImages: boolean;\n setCompressImages: (enabled: boolean) => void;\n}\n\nexport const usePreferencesStore = create<PreferencesState>((set) => ({\n stickyUserHeader: loadStickyUserHeader(),\n showTokenUsage: loadShowTokenUsage(),\n\n setStickyUserHeader: (enabled) => {\n try {\n localStorage.setItem(LS_STICKY_USER_HEADER, String(enabled));\n } catch {\n // private mode\n }\n set({ stickyUserHeader: enabled });\n },\n\n setShowTokenUsage: (enabled) => {\n try {\n localStorage.setItem(LS_SHOW_TOKEN_USAGE, String(enabled));\n } catch {\n // private mode\n }\n set({ showTokenUsage: enabled });\n },\n\n compressImages: loadCompressImages(),\n\n setCompressImages: (enabled) => {\n try {\n localStorage.setItem(LS_COMPRESS_IMAGES, String(enabled));\n } catch {\n // private mode\n }\n set({ compressImages: enabled });\n },\n}));\n","/**\n * Tool call pairing — matches toolCall blocks in assistant messages\n * with toolResult messages by toolCallId.\n */\n\nexport interface PairableMessage {\n role?: string;\n type?: string;\n content?: unknown;\n toolCallId?: unknown;\n [key: string]: unknown;\n}\n\nexport interface ToolCallPairing {\n /** Tool results keyed by the assistant-side tool call id. */\n toolResultsById: Map<string, PairableMessage>;\n /** Assistant-side tool call ids that have a matched standalone result. */\n pairedIds: Set<string>;\n /** Result message objects that have been paired (skip standalone render). */\n pairedResultMessages: Set<PairableMessage>;\n}\n\nexport function buildToolCallPairing(\n messages: readonly PairableMessage[],\n): ToolCallPairing {\n const toolResultsById = new Map<string, PairableMessage>();\n const pairedIds = new Set<string>();\n const pairedResultMessages = new Set<PairableMessage>();\n\n // Collect all tool call IDs from assistant messages\n const callIds = new Set<string>();\n for (const m of messages) {\n if (m.role !== \"assistant\" || !Array.isArray(m.content)) continue;\n for (const block of m.content as Record<string, unknown>[]) {\n if (!isToolCallBlock(block)) continue;\n const id = getToolCallId(block);\n if (id !== undefined) callIds.add(id);\n }\n }\n\n // Match tool results to call IDs\n for (const m of messages) {\n if (m.role !== \"toolResult\" || typeof m.toolCallId !== \"string\") continue;\n if (!callIds.has(m.toolCallId)) continue;\n toolResultsById.set(m.toolCallId, m);\n pairedIds.add(m.toolCallId);\n pairedResultMessages.add(m);\n }\n\n return { toolResultsById, pairedIds, pairedResultMessages };\n}\n\nexport function isPairedToolResult(\n pairing: ToolCallPairing,\n message: PairableMessage,\n): boolean {\n return pairing.pairedResultMessages.has(message);\n}\n\nexport function isToolCallBlock(\n block: Record<string, unknown> | undefined,\n): block is Record<string, unknown> {\n return block?.type === \"toolCall\";\n}\n\nexport function getToolCallId(block: Record<string, unknown>): string | undefined {\n return typeof block.id === \"string\" && block.id.length > 0 ? block.id : undefined;\n}\n\n/* ── Tool batch segmentation (from forge's ChatView.tsx) ── */\n\nexport type ToolBatchEntry =\n | { kind: \"tool\"; block: Record<string, unknown>; result: PairableMessage | undefined }\n | { kind: \"thinking\"; block: Record<string, unknown> };\n\nexport interface AssistantRenderSegment {\n kind: \"assistant\" | \"tools\";\n /** For assistant segments: the content blocks to render as prose. */\n content?: Record<string, unknown>[];\n /** For tools segments: the tool/thinking entries. */\n entries?: ToolBatchEntry[];\n /** Whether this tools segment can be batched into a single collapsible card. */\n batchable?: boolean;\n}\n\nconst NON_BATCHABLE_TOOL_NAMES = new Set([\"edit\", \"write\"]);\nconst MAX_TOOL_BATCH_SIZE = Number.POSITIVE_INFINITY;\n\nfunction isBatchableToolCall(block: Record<string, unknown> | undefined): boolean {\n return isToolCallBlock(block) && !NON_BATCHABLE_TOOL_NAMES.has(String(block.name ?? \"\"));\n}\n\nfunction isToolBatchThinkingBlock(block: Record<string, unknown> | undefined): boolean {\n return block?.type === \"thinking\";\n}\n\nfunction isToolBatchWhitespaceBlock(block: Record<string, unknown> | undefined): boolean {\n return block?.type === \"text\" && typeof block.text === \"string\" && block.text.trim().length === 0;\n}\n\nfunction isToolCall(block: Record<string, unknown> | undefined): boolean {\n return isToolCallBlock(block);\n}\n\nfunction takeTrailingToolRunContext(\n prose: Record<string, unknown>[],\n): ToolBatchEntry[] {\n const trailing: ToolBatchEntry[] = [];\n while (prose.length > 0) {\n const block = prose[prose.length - 1]!;\n if (isToolBatchWhitespaceBlock(block)) {\n prose.pop();\n continue;\n }\n if (!isToolBatchThinkingBlock(block)) break;\n trailing.unshift({ kind: \"thinking\", block });\n prose.pop();\n }\n return trailing;\n}\n\nfunction countToolBatchCalls(entries: ToolBatchEntry[]): number {\n return entries.filter((entry) => entry.kind === \"tool\").length;\n}\n\n/**\n * Split an assistant message's content array into segments.\n *\n * ToolCall blocks are extracted from prose bubbles and grouped into\n * collapsible batch cards. Thinking blocks immediately preceding\n * tool calls are grouped with the tools. Non-batchable tools (edit,\n * write) get individual entries.\n *\n * Returns undefined when the message has no tool calls at all (no\n * segmentation needed).\n */\nexport function splitAssistantToolSegments(\n content: Record<string, unknown>[],\n toolResultsById: Map<string, PairableMessage> | undefined,\n): AssistantRenderSegment[] | undefined {\n const segments: AssistantRenderSegment[] = [];\n let prose: Record<string, unknown>[] = [];\n let sawToolSegment = false;\n const flushProse = (): void => {\n if (prose.length === 0) return;\n segments.push({ kind: \"assistant\", content: prose });\n prose = [];\n };\n\n let i = 0;\n while (i < content.length) {\n const block = content[i]!;\n if (!isToolCall(block)) {\n prose.push(block);\n i += 1;\n continue;\n }\n\n const leadingContext = takeTrailingToolRunContext(prose);\n flushProse();\n sawToolSegment = true;\n\n // Non-batchable tool (edit, write) — individual entry\n if (!isBatchableToolCall(block)) {\n const id = getToolCallId(block);\n segments.push({\n kind: \"tools\",\n batchable: false,\n entries: [\n ...leadingContext,\n {\n kind: \"tool\",\n block,\n result: id !== undefined ? toolResultsById?.get(id) : undefined,\n },\n ],\n });\n i += 1;\n continue;\n }\n\n // Batchable tools — group consecutive tools + thinking\n const entries: ToolBatchEntry[] = [...leadingContext];\n while (i < content.length && countToolBatchCalls(entries) < MAX_TOOL_BATCH_SIZE) {\n const current = content[i];\n if (current === undefined) break;\n if (isToolBatchThinkingBlock(current)) {\n entries.push({ kind: \"thinking\", block: current });\n i += 1;\n continue;\n }\n if (isToolBatchWhitespaceBlock(current)) {\n i += 1;\n continue;\n }\n if (!isBatchableToolCall(current)) break;\n const id = getToolCallId(current);\n entries.push({\n kind: \"tool\",\n block: current,\n result: id !== undefined ? toolResultsById?.get(id) : undefined,\n });\n i += 1;\n }\n segments.push({ kind: \"tools\", batchable: true, entries });\n }\n flushProse();\n\n return sawToolSegment ? segments : undefined;\n}\n\n/** Extract a one-line preview from tool arguments. */\nexport function toolPreviewFromArgs(\n name: string,\n args: unknown,\n): string | undefined {\n const argsObj =\n typeof args === \"object\" && args !== null\n ? (args as Record<string, unknown>)\n : undefined;\n\n if (name === \"bash\" && typeof argsObj?.command === \"string\") return argsObj.command;\n if (\n (name === \"read\" || name === \"write\" || name === \"edit\") &&\n typeof argsObj?.path === \"string\"\n )\n return argsObj.path;\n if (name === \"grep\" && typeof argsObj?.pattern === \"string\") return argsObj.pattern;\n if (name === \"glob\" && typeof argsObj?.pattern === \"string\") return argsObj.pattern;\n if (name === \"web_search\" && typeof argsObj?.query === \"string\") return argsObj.query;\n if (name === \"web_fetch\" && typeof argsObj?.url === \"string\") return argsObj.url;\n\n return undefined;\n}\n\n/** Count +/- lines in a diff string. */\nexport function countDiffLines(diff: string): { adds: number; dels: number } {\n const adds = (diff.match(/^\\+/gm) ?? []).length;\n const dels = (diff.match(/^\\-/gm) ?? []).length;\n return { adds, dels };\n}\n","import { useEffect, useLayoutEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport { Copy, Check, CornerUpLeft, ImageDown } from \"lucide-react\";\nimport { useExtensions } from \"../hooks/use-extensions\";\nimport { invokeExtensionCommand, cancelExec } from \"../lib/api-client\";\nimport type { CompactionEvent } from \"../lib/api-client\";\nimport { toPng } from \"html-to-image\";\nimport { ChatMarkdown } from \"./ChatMarkdown\";\nimport { CompactionCard } from \"./CompactionCard\";\nimport { useSessionStore, EMPTY_COMPACTIONS } from \"../stores/session-store\";\nimport { usePreferencesStore } from \"../stores/preferences-store\";\nimport {\n buildToolCallPairing,\n splitAssistantToolSegments,\n isPairedToolResult,\n getToolCallId,\n toolPreviewFromArgs,\n countDiffLines,\n type PairableMessage,\n type ToolCallPairing,\n type ToolBatchEntry,\n type AssistantRenderSegment,\n} from \"../lib/tool-call-pairing\";\n\n/** Shape of a bash execution message from the SDK. */\ninterface BashExecMessage {\n role: \"bashExecution\";\n command: string;\n output: string;\n exitCode: number | undefined;\n cancelled: boolean;\n truncated: boolean;\n excludeFromContext?: boolean;\n timestamp: number;\n}\n\ninterface Props {\n sessionId: string;\n modelName?: string;\n providerName?: string;\n}\n\nfunction extractText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((block: Record<string, unknown>) => {\n const t = block.type as string;\n if (t === \"text\") return (block.text as string) ?? \"\";\n if (t === \"thinking\" || t === \"reasoning\") return \"\";\n return \"\";\n })\n .join(\"\");\n }\n return String(content ?? \"\");\n}\n\n/** Extract image blocks from an SDK content array, returning { mimeType, data } for rendering. */\nfunction extractImages(content: unknown): { mimeType: string; data: string; __blobUrl?: boolean }[] {\n if (!Array.isArray(content)) return [];\n return content\n .filter((block: Record<string, unknown>) => block.type === \"image\")\n .map((block: Record<string, unknown>) => ({\n mimeType: (block.mimeType as string) ?? \"image/png\",\n data: (block.data as string) ?? \"\",\n __blobUrl: (block as { __blobUrl?: boolean }).__blobUrl,\n }));\n}\n\n/** Render images inline. Used inside user message bubbles. */\nfunction UserImages({ images }: { images: { mimeType: string; data: string; __blobUrl?: boolean }[] }) {\n if (images.length === 0) return null;\n return (\n <div className=\"user-images-row\">\n {images.map((img, i) => {\n // Optimistic entries use a complete data URL stored in img.data.\n // Canonical entries from the server have raw base64 in img.data.\n const src = img.__blobUrl\n ? img.data\n : `data:${img.mimeType};base64,${img.data}`;\n return (\n <img\n key={i}\n src={src}\n alt={`Attached image ${i + 1}`}\n className=\"user-image-thumb\"\n loading=\"lazy\"\n onError={(e) => {\n // Failed to load — could be blob URL revoked or bad data\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n );\n })}\n </div>\n );\n}\n\n/** Archived messages rendered inside a CompactionCard's expand drawer.\n * Memo'd so it only renders when expanded, not on every ChatView tick. */\nconst ArchivedMessages = memo(function ArchivedMessages({\n messages,\n}: {\n messages: unknown[];\n}) {\n return (\n <>\n {messages.map((raw, i) => {\n const m = raw as { role?: string; content?: unknown };\n const text = extractText(m.content);\n const imgs = extractImages(m.content);\n const isUser = m.role === \"user\";\n return (\n <div\n key={i}\n style={{\n borderRadius: \"var(--radius-sm)\",\n padding: \"8px 10px\",\n fontSize: \"12px\",\n lineHeight: \"1.5\",\n color: \"var(--text-primary)\",\n background: isUser\n ? \"var(--user-bubble)\"\n : \"transparent\",\n border: isUser\n ? \"1px solid var(--user-bubble-border)\"\n : \"none\",\n whiteSpace: isUser ? \"pre-wrap\" : undefined,\n }}\n >\n {isUser ? (\n <>\n <UserImages images={imgs} />\n {text}\n </>\n ) : (\n <ChatMarkdown text={text} />\n )}\n </div>\n );\n })}\n </>\n );\n});\n\n/* ── Tool Call Components (ported from forge, styled with theme vars) ── */\n\n/** Map a tool name to a descriptive emoji icon. */\nfunction getToolIcon(name: string): string {\n const n = name.toLowerCase();\n if (n.includes(\"bash\") || n.includes(\"shell\") || n.includes(\"exec\") || n.includes(\"run\")) return \"⚡\";\n if (n.includes(\"read\") || n.includes(\"cat\") || n.includes(\"view\") || n.includes(\"get\")) return \"📄\";\n if (n.includes(\"write\") || n.includes(\"create\") || n.includes(\"save\") || n.includes(\"put\")) return \"✏️\";\n if (n.includes(\"edit\") || n.includes(\"patch\") || n.includes(\"update\") || n.includes(\"replace\")) return \"🔧\";\n if (n.includes(\"search\") || n.includes(\"grep\") || n.includes(\"find\") || n.includes(\"ls\") || n.includes(\"list\")) return \"🔍\";\n if (n.includes(\"delete\") || n.includes(\"remove\") || n.includes(\"rm\")) return \"🗑️\";\n if (n.includes(\"move\") || n.includes(\"rename\") || n.includes(\"mv\")) return \"📦\";\n if (n.includes(\"git\") || n.includes(\"commit\") || n.includes(\"branch\")) return \"🌿\";\n if (n.includes(\"web\") || n.includes(\"fetch\") || n.includes(\"http\") || n.includes(\"url\")) return \"🌐\";\n if (n.includes(\"test\") || n.includes(\"spec\")) return \"🧪\";\n if (n.includes(\"ask\") || n.includes(\"question\") || n.includes(\"prompt\")) return \"💬\";\n return \"🔩\";\n}\n\n/** Render the thinking block content. */\nfunction ThinkingBlock({ text }: { text: string }) {\n const [open, setOpen] = useState(false);\n return (\n <details\n open={open}\n className=\"thinking-block\"\n >\n <summary\n onClick={(e) => { e.preventDefault(); setOpen((o) => !o); }}\n >\n {open ? \"▾\" : \"▸\"} Thinking…\n </summary>\n {open && (\n <pre className=\"thinking-content\">{text}</pre>\n )}\n </details>\n );\n}\n\n/** Render a single tool call + its result as a timeline node. */\nfunction ToolCallEntry({\n block,\n result,\n}: {\n block: Record<string, unknown>;\n result: PairableMessage | undefined;\n}) {\n const [detailsOpen, setDetailsOpen] = useState(false);\n const name = String(block.name ?? \"tool\");\n const args = block.arguments ?? block.input ?? {};\n const argsText = typeof args === \"string\" ? args : JSON.stringify(args, null, 2);\n\n const isError = result?.isError === true;\n const isRunning = result === undefined;\n const resultContent = Array.isArray(result?.content) ? result?.content : [];\n const outputText = resultContent\n .filter((c): c is { type: \"text\"; text: string } => {\n const o = c as { type?: unknown; text?: unknown };\n return o.type === \"text\" && typeof o.text === \"string\";\n })\n .map((c) => c.text)\n .join(\"\\n\");\n\n // Smart disclosure: first line of output shown inline\n const outputPreview = outputText.split(\"\\n\").find((l) => l.trim().length > 0) ?? \"\";\n\n const preview = toolPreviewFromArgs(name, args);\n const icon = getToolIcon(name);\n\n return (\n <div className=\"tool-timeline-node\">\n <span\n className={`tool-timeline-icon${isRunning ? \" running\" : isError ? \" error\" : \" success\"}`}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n <div className=\"tool-timeline-content\">\n <div className=\"tool-timeline-row\">\n <span className=\"tool-timeline-name\">{name}</span>\n {preview && <span className=\"tool-timeline-arg\" title={preview}>{preview}</span>}\n {isRunning && <span className=\"tool-timeline-running\" aria-label=\"running\">running…</span>}\n {!isRunning && outputText.length > 0 && (\n <button\n type=\"button\"\n className=\"tool-timeline-details-btn\"\n onClick={() => setDetailsOpen((o) => !o)}\n aria-expanded={detailsOpen}\n aria-label={detailsOpen ? \"Hide details\" : \"Show details\"}\n >\n {detailsOpen ? \"hide\" : \"details\"}\n </button>\n )}\n </div>\n {/* Smart-disclosure output preview (always shown when not expanded) */}\n {!isRunning && !detailsOpen && outputPreview.length > 0 && (\n <div className=\"tool-timeline-output-preview\" title={outputPreview}>\n {isError ? \"✖ \" : \"✓ \"}{outputPreview}\n </div>\n )}\n {/* Expanded details pane */}\n {detailsOpen && (\n <div className=\"tool-timeline-details\">\n {argsText.length > 2 && (\n <div>\n <div className=\"tool-timeline-section-label\">input</div>\n <pre className=\"tool-timeline-code\">\n {argsText.length > 2000 ? argsText.slice(0, 2000) + \"\\n…(truncated)\" : argsText}\n </pre>\n </div>\n )}\n {outputText.length > 0 && (\n <div>\n <div className=\"tool-timeline-section-label\">{isError ? \"error\" : \"output\"}</div>\n <pre className=\"tool-timeline-code\">\n {outputText.length > 4000 ? outputText.slice(0, 4000) + \"\\n…(truncated)\" : outputText}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/** Render a batch of tool calls as a collapsible timeline group. */\nfunction ToolCallBatchCard({ entries }: { entries: ToolBatchEntry[] }) {\n const [open, setOpen] = useState(false);\n const toolEntries = entries.filter((entry) => entry.kind === \"tool\");\n const toolCount = toolEntries.length;\n const errored = toolEntries.some((e) => e.result?.isError === true);\n\n // Unique tool names for the inline preview\n const names = [...new Set(toolEntries.map((e) => String(e.block.name ?? \"tool\")))];\n const previewText = names.slice(0, 4).join(\" · \") + (names.length > 4 ? \" · …\" : \"\");\n\n return (\n <details\n open={open}\n className=\"tool-timeline\"\n style={{ marginLeft: 0 }}\n >\n <summary\n className=\"tool-timeline-header\"\n onClick={(e) => { e.preventDefault(); setOpen((o) => !o); }}\n aria-label={`${toolCount} tool ${toolCount === 1 ? \"call\" : \"calls\"}: ${previewText}`}\n >\n <span className=\"tool-timeline-chevron\" aria-hidden=\"true\">{open ? \"▾\" : \"▸\"}</span>\n <span className=\"tool-timeline-batch-label\">\n ↳ {toolCount} {toolCount === 1 ? \"tool\" : \"tools\"}\n </span>\n <span className=\"tool-timeline-batch-preview\">{previewText}</span>\n {errored && (\n <span className=\"tool-timeline-badge error\" aria-label=\"error\">error</span>\n )}\n </summary>\n <div className=\"tool-timeline-track\">\n {entries.map((entry, j) =>\n entry.kind === \"thinking\" ? (\n <ThinkingBlock key={j} text={entry.block.thinking as string ?? \"\"} />\n ) : (\n <ToolCallEntry key={j} block={entry.block} result={entry.result} />\n ),\n )}\n </div>\n </details>\n );\n}\n\n/** Render an assistant prose/thinking block. */\nfunction AssistantBlock({ block }: { block: Record<string, unknown> }) {\n const type = block.type;\n if (type === \"text\" && typeof block.text === \"string\") {\n return <ChatMarkdown text={block.text} />;\n }\n if (type === \"thinking\" && typeof block.thinking === \"string\") {\n return <ThinkingBlock text={block.thinking} />;\n }\n return null;\n}\n\n/** Choose rendering strategy for an assistant render segment. */\nfunction AssistantRenderSegmentView({\n segment,\n}: {\n segment: AssistantRenderSegment;\n}) {\n if (segment.kind === \"assistant\" && segment.content !== undefined) {\n const blocks = segment.content;\n return (\n <div className=\"assistant-blocks\">\n {blocks.map((block: Record<string, unknown>, i: number) => (\n <AssistantBlock key={i} block={block} />\n ))}\n </div>\n );\n }\n\n const entries = segment.entries;\n if (!entries) return null;\n const toolEntry = entries.find((entry: ToolBatchEntry) => entry.kind === \"tool\");\n const hasThinking = entries.some((entry: ToolBatchEntry) => entry.kind === \"thinking\");\n const toolCount = entries.filter((e: ToolBatchEntry) => e.kind === \"tool\").length;\n\n if (toolCount === 1 && !hasThinking && toolEntry !== undefined) {\n return (\n <div className=\"tool-timeline\">\n <ToolCallEntry block={toolEntry.block} result={toolEntry.result} />\n </div>\n );\n }\n return <ToolCallBatchCard entries={entries} />;\n}\n\n/* ── Sticky user message component ── */\n\nfunction UserMessageBubble({ text, isSteer, images }: { text: string; isSteer?: boolean; images?: { mimeType: string; data: string; __blobUrl?: boolean }[] }) {\n const [expanded, setExpanded] = useState(false);\n const [isLong, setIsLong] = useState(false);\n const textRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = textRef.current;\n if (!el) return;\n const check = () => {\n if (!expanded) {\n setIsLong(el.scrollHeight > el.clientHeight);\n }\n };\n check();\n const ro = new ResizeObserver(check);\n ro.observe(el);\n return () => ro.disconnect();\n }, [text, expanded]);\n\n return (\n <div className=\"message-row user\">\n <div className=\"message-bubble user\">\n {isSteer && <span className=\"steer-tag\">steer</span>}\n {images !== undefined && images.length > 0 && (\n <UserImages images={images} />\n )}\n <div\n ref={textRef}\n style={{\n overflow: \"hidden\",\n transition: \"max-height 0.25s ease\",\n maxHeight: !expanded ? \"4em\" : \"2000px\",\n ...(!expanded\n ? {\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }\n : {}),\n } as React.CSSProperties}\n >\n {text}\n </div>\n {isLong && (\n <div\n onClick={() => setExpanded((e) => !e)}\n style={{\n marginTop: 6,\n fontSize: 12,\n color: \"var(--accent-text)\",\n cursor: \"pointer\",\n userSelect: \"none\",\n }}\n >\n {expanded ? \"▲ Show less\" : \"▼ Show more\"}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Copy button for assistant messages ── */\n\nfunction CopyMsgButton({ getText }: { getText: () => string }) {\n const [copied, setCopied] = useState(false);\n const onClick = (): void => {\n const text = getText();\n if (text.length === 0) return;\n const writeAsync = navigator.clipboard?.writeText?.bind(navigator.clipboard);\n if (writeAsync !== undefined) {\n void writeAsync(text)\n .then(() => {\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n })\n .catch(() => fallback(text));\n } else {\n fallback(text);\n }\n };\n const fallback = (text: string): void => {\n try {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n document.body.removeChild(ta);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n // Clipboard unavailable — user can still select + Ctrl+C.\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n className=\"copy-msg-btn\"\n title=\"Copy message\"\n aria-label=\"Copy message\"\n >\n {copied ? <Check size={12} /> : <Copy size={12} />}\n </button>\n );\n}\n\n/* ── Save as PNG button for assistant messages ── */\n\nfunction SaveAsPngButton({ getText: _getText }: { getText: () => string }) {\n const [saving, setSaving] = useState(false);\n\n const onClick = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (saving) return;\n\n // Find the .message-row.assistant siblings before the footer\n const btn = e.currentTarget as HTMLElement;\n const footer = btn.closest(\".assistant-msg-footer\") as HTMLElement | null;\n if (!footer) return;\n const turnContainer = footer.parentElement;\n if (!turnContainer) return;\n\n const sourceBubbles: HTMLElement[] = [];\n let pastFooter = false;\n for (let i = turnContainer.children.length - 1; i >= 0; i--) {\n const child = turnContainer.children[i] as HTMLElement;\n if (child === footer) { pastFooter = true; continue; }\n if (!pastFooter) continue;\n if (child.classList.contains(\"message-row\")) {\n const bubble = child.querySelector<HTMLElement>(\".message-bubble.assistant\");\n if (bubble) {\n // Only take the last assistant bubble (closest to footer) — tool calls come before\n sourceBubbles.push(bubble);\n break;\n }\n continue;\n }\n if (child.classList.contains(\"message-row\") && child.classList.contains(\"user\")) {\n break;\n }\n }\n if (sourceBubbles.length === 0) return;\n\n setSaving(true);\n try {\n const rootStyle = window.getComputedStyle(document.documentElement);\n const bgColor =\n rootStyle.getPropertyValue(\"--bg-solid\").trim() ||\n rootStyle.getPropertyValue(\"--surface-background\").trim() ||\n window.getComputedStyle(document.body).backgroundColor ||\n \"#1a1a1a\";\n const paddingSize = 40;\n\n const wrapper = document.createElement(\"div\");\n wrapper.style.cssText = `\n padding: ${paddingSize}px;\n background-color: ${bgColor};\n display: inline-block;\n width: 680px;\n `;\n\n for (const originalBubble of sourceBubbles) {\n const computedStyle = window.getComputedStyle(originalBubble);\n const clone = originalBubble.cloneNode(true) as HTMLElement;\n // Inline the root element's computed styles + disable transform/contain that interfere with SVG\n clone.style.cssText = `\n ${computedStyle.cssText}\n transform: none;\n contain: none;\n overflow: visible;\n scrollbar-width: none;\n -ms-overflow-style: none;\n `;\n\n // Strip scrollbars from all child elements too (Firefox + legacy Edge)\n clone.querySelectorAll<HTMLElement>(\"*\").forEach((el) => {\n el.style.scrollbarWidth = \"none\";\n });\n\n // Inject a tiny style to suppress WebKit scrollbars (Chrome, Safari)\n const webkitStyle = document.createElement(\"style\");\n webkitStyle.textContent = `\n .png-clone::-webkit-scrollbar,\n .png-clone *::-webkit-scrollbar {\n display: none;\n }\n `;\n clone.classList.add(\"png-clone\");\n clone.insertBefore(webkitStyle, clone.firstChild);\n\n // In the PNG, code blocks must wrap text (no scrolling in a still image)\n clone.querySelectorAll<HTMLElement>(\"pre, pre code\").forEach((el) => {\n el.style.whiteSpace = \"pre-wrap\";\n el.style.wordBreak = \"break-word\";\n el.style.overflowWrap = \"break-word\";\n el.style.overflow = \"visible\";\n });\n\n // Hide interactive elements by data-attr or class\n clone.querySelectorAll<HTMLElement>(\n \".copy-msg-btn, .rewind-btn, .code-copy-btn, .tool-timeline-details-btn\"\n ).forEach((el) => { el.style.display = \"none\"; });\n\n wrapper.appendChild(clone);\n }\n\n document.body.appendChild(wrapper);\n\n const dataUrl = await toPng(wrapper, {\n quality: 1,\n pixelRatio: 3,\n backgroundColor: bgColor,\n });\n\n document.body.removeChild(wrapper);\n\n const link = document.createElement(\"a\");\n link.download = `message-${Date.now()}.png`;\n link.href = dataUrl;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } catch (err) {\n console.error(\"Failed to save message as PNG:\", err);\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"copy-msg-btn save-png-btn\"\n title=\"Save message as PNG\"\n aria-label=\"Save message as PNG\"\n disabled={saving}\n >\n <ImageDown size={12} />\n </button>\n );\n}\n\n/* ── Bash execution bubble ── */\n\nfunction BashExecBubble({ msg, sessionId }: { msg: BashExecMessage; sessionId: string }) {\n const [expanded, setExpanded] = useState(false);\n const [cancelling, setCancelling] = useState(false);\n const [cancelFailed, setCancelFailed] = useState(false);\n\n const isPending = (msg as unknown as Record<string, unknown>)._pendingExec === true;\n const isRunning = isPending && msg.exitCode === undefined;\n const hasOutput = msg.output.length > 0;\n\n // Auto-expand when command transitions from running → finished.\n // On fresh mount (page refresh/reloadMessages), stays collapsed.\n const wasRunning = useRef(isRunning);\n useEffect(() => {\n if (wasRunning.current && !isRunning) {\n setExpanded(true);\n }\n wasRunning.current = isRunning;\n }, [isRunning]);\n\n // Safety timeout: if we've been in cancelling state for 3s without\n // the command actually stopping (no exec_end SSE), force-show an\n // error so the user isn't stuck forever.\n useEffect(() => {\n if (!cancelling) return;\n const timeout = setTimeout(() => {\n setCancelling(false);\n setCancelFailed(true);\n }, 3000);\n return () => clearTimeout(timeout);\n }, [cancelling]);\n\n let icon: string;\n let status: string;\n if (msg.cancelled) {\n icon = \"⛔\";\n status = \"cancelled\";\n } else if (cancelFailed) {\n icon = \"⚠️\";\n status = \"cancel timed out\";\n } else if (cancelling) {\n icon = \"⏳\";\n status = \"cancelling…\";\n } else if (isRunning) {\n icon = \"⟳\";\n status = \"running\";\n } else if (msg.exitCode === 0) {\n icon = \"✅\";\n status = \"success\";\n } else {\n icon = \"❌\";\n status = `exit ${msg.exitCode ?? \"?\"}`;\n }\n\n return (\n <div className=\"message-row user\">\n <div className=\"message-bubble user\" style={{ borderLeft: \"3px solid var(--accent-text)\", maxWidth: \"100%\" }}>\n <div\n role={hasOutput ? \"button\" : undefined}\n tabIndex={hasOutput ? 0 : undefined}\n onClick={() => { if (!isRunning && hasOutput) setExpanded((v) => !v); }}\n onKeyDown={(e) => { if ((e.key === \"Enter\" || e.key === \" \") && !isRunning && hasOutput) { e.preventDefault(); setExpanded((v) => !v); } }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n cursor: hasOutput && !isRunning ? \"pointer\" : \"default\",\n userSelect: \"none\",\n }}\n >\n {hasOutput && !isRunning && (\n <span style={{ fontSize: 9, opacity: 0.5, width: 12, textAlign: \"center\", flexShrink: 0 }}>\n {expanded ? \"▾\" : \"▸\"}\n </span>\n )}\n <span style={{ fontFamily: \"monospace\", fontWeight: 600 }}>\n $ {msg.command}\n </span>\n <span style={{ fontSize: 10, opacity: 0.65 }}>\n {icon} {status}\n </span>\n {msg.excludeFromContext && (\n <span style={{ fontSize: 9, padding: \"0 4px\", borderRadius: 3, background: \"var(--bg-subtle)\", opacity: 0.5 }}>\n local only\n </span>\n )}\n {/* Cancel button on running exec */}\n {isPending && isRunning && !cancelling && (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); setCancelling(true); cancelExec(sessionId); }}\n style={{\n marginLeft: \"auto\",\n background: \"var(--bg-glass-active)\",\n border: \"1px solid var(--border)\",\n borderRadius: \"var(--radius-sm)\",\n padding: \"1px 6px\",\n fontSize: 10,\n cursor: \"pointer\",\n color: \"var(--text-secondary)\",\n }}\n >\n cancel\n </button>\n )}\n {/* Cancelling feedback while server shortens the timeout */}\n {cancelling && isPending && (\n <span style={{ fontSize: 9, opacity: 0.5, marginLeft: \"auto\" }}>\n cancelling…\n </span>\n )}\n {/* Byte size when collapsed */}\n {hasOutput && !expanded && !isRunning && (\n <span style={{ fontSize: 9, opacity: 0.4, marginLeft: \"auto\" }}>\n {msg.output.length < 1024\n ? `${msg.output.length} B`\n : `${(msg.output.length / 1024).toFixed(1)} KB`}\n </span>\n )}\n </div>\n {/* Live output — always visible when running */}\n {isRunning && (\n <pre\n style={{\n fontSize: 11,\n fontFamily: \"monospace\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-all\",\n margin: \"6px 0 0\",\n maxHeight: 400,\n overflow: \"auto\",\n opacity: 0.85,\n }}\n >\n {msg.output || \"\"}\n <span style={{ animation: \"blink 1s step-end infinite\" }}>█</span>\n </pre>\n )}\n {/* Final output — collapsible */}\n {!isRunning && hasOutput && expanded && (\n <pre\n style={{\n fontSize: 11,\n fontFamily: \"monospace\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-all\",\n margin: \"6px 0 0\",\n maxHeight: 400,\n overflow: \"auto\",\n }}\n >\n {msg.truncated ? msg.output + \"\\n…(truncated)\" : msg.output}\n </pre>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Token usage badge ── */\n\nfunction TokenUsageBadge({ msg }: {\n msg?: Record<string, unknown>;\n}) {\n const usage = msg?.usage as { input?: number; output?: number; cacheRead?: number } | undefined;\n const input = usage?.input;\n const output = usage?.output;\n const cacheRead = usage?.cacheRead;\n\n if (input == null && output == null && !(cacheRead && cacheRead > 0)) return null;\n\n return (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n {input != null && (\n <span style={{ fontSize: 10, color: \"var(--text-secondary)\" }}>↑ {input.toLocaleString()} in</span>\n )}\n {output != null && (\n <span style={{ fontSize: 10, color: \"var(--text-secondary)\" }}>↓ {output.toLocaleString()} out</span>\n )}\n {cacheRead && cacheRead > 0 && (\n <span style={{ fontSize: 10, color: \"var(--text-secondary)\" }}>⚡ {cacheRead.toLocaleString()} cached</span>\n )}\n </span>\n );\n}\n\n/* ── Rewind button ── */\n\nfunction RewindMsgButton({ sessionId }: { sessionId: string }) {\n const [invoking, setInvoking] = useState(false);\n return (\n <button\n type=\"button\"\n disabled={invoking}\n onClick={async (e) => {\n e.preventDefault();\n e.stopPropagation();\n setInvoking(true);\n try {\n await invokeExtensionCommand(sessionId, \"rewind\");\n } catch {\n // error handled\n } finally {\n setInvoking(false);\n }\n }}\n className=\"copy-msg-btn rewind-btn\"\n title=\"Rewind to checkpoint (requires pi-rewind)\"\n aria-label=\"Rewind\"\n >\n <CornerUpLeft size={12} />\n </button>\n );\n}\n\n/* ── Model badge for assistant messages ──\n Reads model/provider from the message object so each response\n shows the model that actually generated it, even after switching. */\n\nfunction ModelBadge({ msg, fallbackModel, fallbackProvider }: {\n msg?: Record<string, unknown>;\n fallbackModel?: string;\n fallbackProvider?: string;\n}) {\n const modelName =\n (typeof msg?.model === \"string\" ? msg.model : undefined) ?? fallbackModel;\n const providerName =\n (typeof msg?.provider === \"string\" ? msg.provider : undefined) ?? fallbackProvider;\n if (!modelName) return null;\n return (\n <span className=\"assistant-msg-model\">\n {providerName ? `${providerName} / ` : \"\"}{modelName}\n </span>\n );\n}\n\n/* ── Main ChatView ── */\n\nconst MAX_TOOL_BATCH_TOOLS = 100;\n\nexport function ChatView({ sessionId, modelName, providerName }: Props) {\n const messages = useSessionStore((s) => s.messages);\n const rawCompactions = useSessionStore((s) => s.compactionsBySession[sessionId] ?? EMPTY_COMPACTIONS);\n // Only show compaction cards when the current leaf is AT a compaction\n // point (messages[0] is the SDK-synthesized compactionSummary). If you\n // navigate to a pre-compaction leaf, messages[0] is a normal user\n // message and compaction cards should be hidden.\n const compactions = (messages as PairableMessage[])[0]?.role === \"compactionSummary\"\n ? rawCompactions\n : EMPTY_COMPACTIONS;\n const streamText = useSessionStore((s) => s.streamState.text);\n const isStreaming = useSessionStore((s) => s.streamState.isStreaming);\n const activeToolName = useSessionStore((s) => s.streamState.activeToolName);\n const queued = useSessionStore((s) => s.queuedBySession[sessionId]);\n const error = useSessionStore((s) => s.error);\n const clearError = useSessionStore((s) => s.clearError);\n const sendPrompt = useSessionStore((s) => s.sendPrompt);\n const { rewind: rewindAvailable } = useExtensions();\n\n const stickyUserHeader = usePreferencesStore((s) => s.stickyUserHeader);\n const showTokenUsage = usePreferencesStore((s) => s.showTokenUsage);\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const isFollowingBottomRef = useRef(true);\n const lastScrollTopRef = useRef(0);\n const NEAR_BOTTOM_PX = 24;\n // Track user's scroll intent: isFollowingBottomRef stays true while\n // the user is near the bottom, false when they scroll up.\n const onScroll = (): void => {\n const el = scrollRef.current;\n if (el === null) return;\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n const scrolledUp = el.scrollTop < lastScrollTopRef.current - 1;\n isFollowingBottomRef.current = !scrolledUp && distance <= NEAR_BOTTOM_PX;\n lastScrollTopRef.current = el.scrollTop;\n };\n\n // Layout effect: runs before paint, so scroll-to-bottom happens\n // before the user sees anything. Fires on every message/streaming\n // change — not just session switches. When the user has scrolled up,\n // restores scrollTop to prevent browser scroll anchoring from\n // nudging the viewport when content below them changes.\n useLayoutEffect(() => {\n const el = scrollRef.current;\n if (el === null || messages.length === 0) return;\n if (isFollowingBottomRef.current) {\n el.scrollTop = el.scrollHeight;\n lastScrollTopRef.current = el.scrollTop;\n } else {\n // User scrolled up — restore position to prevent browser nudge\n el.scrollTop = lastScrollTopRef.current;\n }\n }, [messages, streamText]);\n\n // Build tool pairing once per render cycle\n const pairing = useMemo(() => buildToolCallPairing(messages as PairableMessage[]), [messages]);\n\n // Render loop: iterate messages by flat index so\n // CompactionCards splice at arbitrary insertBeforeIndex positions,\n // not just at user message boundaries. Preserves turn-grouped\n // visual layout (sticky user header, copy/rewind buttons).\n const renderedRows = useMemo(() => {\n const { toolResultsById } = pairing;\n const out: React.ReactNode[] = [];\n\n // Group compactions by insertBeforeIndex for O(1) lookup.\n const compactionsAt = new Map<number, CompactionEvent[]>();\n for (const ev of compactions) {\n const list = compactionsAt.get(ev.insertBeforeIndex) ?? [];\n list.push(ev);\n compactionsAt.set(ev.insertBeforeIndex, list);\n }\n\n // Helper: push all compaction cards for a given index.\n const pushCardsAt = (idx: number): void => {\n const events = compactionsAt.get(idx);\n if (events === undefined) return;\n for (const ev of events) {\n out.push(<CompactionCard key={`compaction-${ev.id}`} event={ev} />);\n }\n };\n\n // Kept-window range: messages in [1, latestCard.insertBeforeIndex)\n // are hidden from inline bubbles; they appear inside the latest\n // CompactionCard's expand drawer instead.\n const latestCard =\n compactions.length > 0 ? compactions[compactions.length - 1] : undefined;\n const keptWindowEnd = latestCard?.insertBeforeIndex ?? 0;\n\n // Helper: extract images from a user message's content\n const userImages = (m: PairableMessage) => extractImages(m.content);\n\n // Common helper: assistant message rendering (tool batching etc.)\n const renderAssistantMsgs = (msgs: PairableMessage[], turnIdx: number) => {\n const elements: React.ReactNode[] = [];\n const pendingBatch: ToolBatchEntry[] = [];\n let renderedBatchSerial = 0;\n\n const flushPendingBatch = () => {\n if (pendingBatch.length === 0) return;\n const chunk = [...pendingBatch];\n pendingBatch.length = 0;\n const batchKey = `turn-${turnIdx}-batch-${renderedBatchSerial}`;\n elements.push(\n <div key={batchKey}>\n <ToolCallBatchCard entries={chunk} />\n </div>,\n );\n renderedBatchSerial += 1;\n };\n\n for (const m of msgs) {\n if (Array.isArray(m.content)) {\n const segments = splitAssistantToolSegments(\n m.content as Record<string, unknown>[],\n toolResultsById,\n );\n if (segments !== undefined) {\n for (const seg of segments) {\n if (seg.kind === \"tools\" && seg.entries) {\n pendingBatch.push(...seg.entries);\n continue;\n }\n flushPendingBatch();\n elements.push(\n <div key={`turn-${turnIdx}-seg-${elements.length}`} className=\"message-row assistant\">\n <div className=\"message-bubble assistant\">\n <AssistantRenderSegmentView segment={seg} />\n </div>\n </div>,\n );\n }\n continue;\n }\n }\n\n flushPendingBatch();\n const text = extractText(m.content);\n if (text.length > 0) {\n elements.push(\n <div key={`turn-${turnIdx}-text-${elements.length}`} className=\"message-row assistant\">\n <div className=\"message-bubble assistant\">\n <ChatMarkdown text={text} />\n </div>\n </div>,\n );\n }\n }\n flushPendingBatch();\n return elements;\n };\n\n // Turn-grouped rendering helpers (for sticky user header mode)\n // Collect messages by turn during flat iteration, then flush\n // the accumulated turn as a grouped container.\n let currentUserIdx = -1;\n let currentUserMsg: PairableMessage | undefined;\n const currentAssistantMsgs: PairableMessage[] = [];\n\n const flushTurn = (): void => {\n if (currentUserMsg === undefined) return;\n const text = extractText(currentUserMsg.content);\n const combinedAssistantText = currentAssistantMsgs\n .map(m => extractText(m.content))\n .filter(t => t.length > 0)\n .join(\"\\n\\n\");\n\n const isSteer = (currentUserMsg.metadata as { steer?: boolean } | undefined)?.steer === true;\n\n // Read model info from the LAST assistant message in this turn\n // so the badge reflects the actual generating model, not the\n // currently-selected one. Falls back to the global props if the\n // message object doesn't carry model info (older sessions).\n const lastAssistantMsg = currentAssistantMsgs.length > 0\n ? (currentAssistantMsgs[currentAssistantMsgs.length - 1] as Record<string, unknown>)\n : undefined;\n\n if (stickyUserHeader && text.length > 0) {\n out.push(\n <div key={`turn-${currentUserIdx}`} style={{ position: \"relative\" }}>\n <div\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 10,\n background: \"var(--bg-solid)\",\n overflowAnchor: \"none\",\n }}\n >\n <UserMessageBubble text={text} isSteer={isSteer} images={userImages(currentUserMsg)} />\n {text.length > 0 && (\n <div className=\"assistant-msg-footer user\">\n <CopyMsgButton getText={() => text} />\n {rewindAvailable && <RewindMsgButton sessionId={sessionId} />}\n </div>\n )}\n <div\n aria-hidden=\"true\"\n style={{\n pointerEvents: \"none\",\n position: \"absolute\",\n left: 0,\n right: 0,\n top: \"100%\",\n zIndex: 0,\n height: 12,\n background:\n \"linear-gradient(to bottom, var(--bg-solid), transparent)\",\n }}\n />\n </div>\n {currentAssistantMsgs.length > 0 &&\n renderAssistantMsgs(currentAssistantMsgs, currentUserIdx)}\n {combinedAssistantText.length > 0 && (\n <div className=\"assistant-msg-footer\">\n <CopyMsgButton getText={() => combinedAssistantText} />\n <SaveAsPngButton getText={() => combinedAssistantText} />\n {showTokenUsage && <TokenUsageBadge msg={lastAssistantMsg} />}\n <ModelBadge msg={lastAssistantMsg} fallbackModel={modelName} fallbackProvider={providerName} />\n </div>\n )}\n </div>,\n );\n } else {\n // Non-sticky mode: render user message normally\n out.push(\n <div\n key={`user-${currentUserIdx}`}\n className=\"message-row user\"\n data-message-index={currentUserIdx}\n >\n <div className=\"message-bubble user\">\n {isSteer && <span className=\"steer-tag\">steer</span>}\n <UserImages images={userImages(currentUserMsg)} />\n {text}\n </div>\n </div>,\n );\n if (text.length > 0) {\n out.push(\n <div key={`user-${currentUserIdx}-copy`} className=\"assistant-msg-footer user\">\n <CopyMsgButton getText={() => text} />\n {rewindAvailable && <RewindMsgButton sessionId={sessionId} />}\n </div>,\n );\n }\n if (currentAssistantMsgs.length > 0) {\n out.push(...renderAssistantMsgs(currentAssistantMsgs, currentUserIdx));\n }\n if (combinedAssistantText.length > 0) {\n out.push(\n <div key={`turn-${currentUserIdx}-copy`} className=\"assistant-msg-footer\">\n <CopyMsgButton getText={() => combinedAssistantText} />\n <SaveAsPngButton getText={() => combinedAssistantText} />\n {showTokenUsage && <TokenUsageBadge msg={lastAssistantMsg} />}\n <ModelBadge msg={lastAssistantMsg} fallbackModel={modelName} fallbackProvider={providerName} />\n </div>,\n );\n }\n }\n\n currentUserMsg = undefined;\n currentAssistantMsgs.length = 0;\n };\n\n // ── Flat index iteration ──\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i] as PairableMessage;\n\n // Compaction cards render BEFORE the message at index i.\n pushCardsAt(i);\n\n // Tool results are rendered inline with their tool call.\n if (isPairedToolResult(pairing, m)) continue;\n\n // Skip the SDK-synthesized compactionSummary — the same text\n // is inside our CompactionCard.\n if (m.role === \"compactionSummary\") {\n continue;\n }\n\n // Kept-window suppression: messages between index 1 and\n // keptWindowEnd were kept verbatim by the latest compaction\n // and appear inside that card's expand drawer.\n if (latestCard !== undefined && i >= 1 && i < keptWindowEnd) {\n continue;\n }\n\n if (m.role === \"user\") {\n flushTurn();\n currentUserIdx = i;\n currentUserMsg = m;\n } else if (m.role === \"assistant\") {\n if (currentUserMsg !== undefined) {\n currentAssistantMsgs.push(m);\n } else {\n // Orphan assistant message (kept-window boundary case where\n // the preceding user was hidden). Render standalone.\n out.push(<div key={`orphan-${i}`} data-message-index={i}>\n {renderAssistantMsgs([m], i)}\n </div>);\n }\n } else if (m.role === \"bashExecution\") {\n // Bash execution messages (!cmd / !!cmd) render as standalone bubbles\n flushTurn();\n out.push(\n <BashExecBubble key={`bash-${i}`} msg={m as unknown as BashExecMessage} sessionId={sessionId} />,\n );\n }\n }\n\n // Flush the last accumulated turn.\n flushTurn();\n\n // Trailing cards: insertBeforeIndex === messages.length means\n // the entire current context was archived with no new messages\n // yet. Render the card at the bottom.\n pushCardsAt(messages.length);\n\n return out;\n }, [messages, pairing, stickyUserHeader, compactions, sessionId, rewindAvailable]);\n\n return (\n <div className=\"messages-container\" style={stickyUserHeader ? { paddingTop: 50 } : undefined}>\n {error !== undefined && (\n <div onClick={clearError} className=\"error-banner\">\n {error} — click to dismiss\n </div>\n )}\n\n {messages.length === 0 && !isStreaming ? (\n <div className=\"welcome\">\n <div className=\"welcome-icon\">💬</div>\n <div className=\"welcome-text\">Send a message to start chatting</div>\n <div className=\"welcome-hint\">with the pi coding agent</div>\n </div>\n ) : (\n <div ref={scrollRef} onScroll={onScroll} style={stickyUserHeader ? { paddingTop: 0 } : undefined} className=\"chat-scroll\">\n <div className=\"chat-message-list\">\n {renderedRows}\n\n {isStreaming && streamText.length > 0 && (\n <div className=\"message-row assistant streaming-row\">\n <div className=\"message-bubble assistant streaming-bubble\">\n {activeToolName && (\n <div className=\"tool-badge\">\n <span className=\"tool-badge-dot\" />\n {activeToolName}\n </div>\n )}\n <div className=\"streaming-text\">\n <ChatMarkdown text={streamText} />\n <span className=\"streaming-cursor\">▊</span>\n </div>\n </div>\n </div>\n )}\n\n {isStreaming && streamText.length === 0 && (\n <div className=\"message-row assistant streaming-row\">\n <div className=\"message-bubble assistant thinking-bubble\">\n {activeToolName ? (\n <span className=\"thinking-running\">\n <span className=\"tool-badge-dot\" />\n running <code className=\"thinking-code\">{activeToolName}</code>\n </span>\n ) : (\n <span className=\"pi-thinking-dots\" aria-hidden=\"true\">\n <span>.</span><span>.</span><span>.</span>\n </span>\n )}\n </div>\n </div>\n )}\n\n {queued !== undefined && (queued.steering.length > 0 || queued.followUp.length > 0) && (\n <div className=\"queued-msgs\">\n {[...queued.steering.map((t) => ({ kind: \"steer\" as const, text: t })), ...queued.followUp.map((t) => ({ kind: \"followUp\" as const, text: t }))].map(\n (q, i) => (\n <div key={i} className=\"queued-msg-item\">\n <span className={`queued-badge ${q.kind}`}>{q.kind === \"steer\" ? \"steer\" : \"follow-up\"}</span>\n <span className=\"queued-msg-text\" title={q.text}>{q.text}</span>\n </div>\n ),\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useState, useRef, useCallback, useMemo } from \"react\";\nimport {\n fetchProviders,\n setSessionModel,\n getSettings,\n getEnabledModels,\n type ProviderGroup,\n type ModelInfo,\n} from \"../lib/api-client\";\n\ninterface Props {\n sessionId: string | undefined;\n /** Currently selected model id (empty string = using default) */\n selected: string;\n /** Called when a model is successfully set on the session */\n onSelect: (modelId: string, provider: string) => void;\n /** Called on error */\n onError: (error: string) => void;\n /** Compact trigger — show model name only, truncated to 20 chars, no auto-focus */\n compact?: boolean;\n}\n\ninterface FlatModel {\n value: string;\n provider: string;\n name: string;\n hasAuth: boolean;\n contextWindow: number;\n}\n\nfunction flattenModels(providers: ProviderGroup[]): FlatModel[] {\n const out: FlatModel[] = [];\n for (const p of providers) {\n for (const m of p.models) {\n out.push({\n value: m.id,\n provider: p.provider,\n name: m.name,\n hasAuth: m.hasAuth,\n contextWindow: m.contextWindow,\n });\n }\n }\n return out;\n}\n\nfunction scoreOption(opt: FlatModel, query: string): number | undefined {\n const q = query.toLowerCase();\n // Exact prefix match on name → highest priority\n if (opt.name.toLowerCase().startsWith(q)) return 0;\n // Provider match → second priority\n if (opt.provider.toLowerCase().includes(q)) return 1;\n // Name contains → third\n if (opt.name.toLowerCase().includes(q)) return 2;\n // ID match → lowest\n if (opt.value.toLowerCase().includes(q)) return 3;\n return undefined;\n}\n\nexport function ModelDropdown({ sessionId, selected, onSelect, onError, compact }: Props) {\n const [open, setOpen] = useState(false);\n const [providers, setProviders] = useState<ProviderGroup[]>([]);\n const [defaultModel, setDefaultModel] = useState<{ provider: string; modelId: string } | undefined>(undefined);\n const [search, setSearch] = useState(\"\");\n const [activeIdx, setActiveIdx] = useState(-1);\n const [setting, setSetting] = useState<string | undefined>(undefined);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n // Load providers + default model + enabled models on mount\n useEffect(() => {\n (async () => {\n try {\n const [providersRes, settingsRes, enabledRes] = await Promise.all([\n fetchProviders(),\n getSettings(),\n getEnabledModels(),\n ]);\n const enabledArr = enabledRes.enabledModels;\n if (enabledArr !== null && enabledArr.length > 0) {\n // Scoping active — filter to only enabled models by fullId\n const enabledSet = new Set(enabledArr);\n const filtered = providersRes.providers\n .map((p) => ({\n ...p,\n models: p.models.filter((m) => enabledSet.has(`${p.provider}/${m.id}`)),\n }))\n .filter((p) => p.models.length > 0);\n setProviders(filtered);\n } else {\n setProviders(providersRes.providers);\n }\n const dp = settingsRes.defaultProvider as string | undefined;\n const dm = settingsRes.defaultModel as string | undefined;\n if (dp && dm) {\n setDefaultModel({ provider: dp, modelId: dm });\n }\n } catch {\n // server not reachable\n }\n })();\n }, []);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n window.addEventListener(\"mousedown\", handler);\n return () => window.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n // Reset search + active index on open\n useEffect(() => {\n if (open) {\n setSearch(\"\");\n setActiveIdx(-1);\n }\n }, [open]);\n\n const options = useMemo(() => flattenModels(providers), [providers]);\n\n const filtered = useMemo(() => {\n const configured = options.filter((o) => o.hasAuth);\n if (search.trim().length === 0) {\n return configured;\n }\n const scored: { opt: FlatModel; score: number }[] = [];\n for (const opt of configured) {\n const score = scoreOption(opt, search);\n if (score !== undefined) scored.push({ opt, score });\n }\n scored.sort((a, b) => a.score - b.score);\n return scored.map((x) => x.opt);\n }, [options, search]);\n\n const selectedOption = options.find((o) => o.value === selected);\n\n const triggerLabel =\n compact\n ? (selectedOption?.name ?? defaultModel?.modelId ?? \"default\").slice(0, 20)\n : selectedOption !== undefined\n ? `${selectedOption.provider} / ${selectedOption.name}`\n : defaultModel !== undefined && defaultModel.provider.length > 0 && defaultModel.modelId.length > 0\n ? `${defaultModel.provider} / ${defaultModel.modelId} (default)`\n : \"default model\";\n\n const commit = (idx: number): void => {\n setOpen(false);\n if (idx === -1) {\n // \"Use default\" — clear session override\n if (sessionId !== undefined) {\n setSetting(\"default\");\n setSessionModel(sessionId, defaultModel?.provider ?? \"\", defaultModel?.modelId ?? \"\")\n .then(() => onSelect(\"\", \"\"))\n .catch((err) => onError(err instanceof Error ? err.message : \"Failed\"))\n .finally(() => setSetting(undefined));\n } else {\n onSelect(\"\", \"\");\n }\n return;\n }\n const opt = filtered[idx];\n if (opt === undefined) return;\n\n if (sessionId === undefined) {\n onSelect(opt.value, opt.provider);\n return;\n }\n\n setSetting(opt.value);\n setSessionModel(sessionId, opt.provider, opt.value)\n .then(() => onSelect(opt.value, opt.provider))\n .catch((err) => onError(err instanceof Error ? err.message : \"Failed\"))\n .finally(() => setSetting(undefined));\n };\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIdx((i) => Math.min(i + 1, filtered.length));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIdx((i) => Math.max(i - 1, -1));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n commit(activeIdx);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n }\n },\n [filtered, activeIdx],\n );\n\n // Scroll active item into view\n useEffect(() => {\n if (!open || listRef.current === null || activeIdx < 0) return;\n const el = listRef.current.querySelector<HTMLElement>(`[data-idx=\"${activeIdx}\"]`);\n el?.scrollIntoView({ block: \"nearest\" });\n }, [open, activeIdx]);\n\n return (\n <div ref={wrapperRef} className=\"model-dropdown\">\n <button\n type=\"button\"\n className=\"model-dropdown-btn\"\n onClick={() => setOpen((o) => !o)}\n disabled={setting !== undefined}\n title={triggerLabel}\n style={{ opacity: setting !== undefined ? 0.6 : 1 }}\n >\n <span style={{ flex: 1, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\" }}>\n {setting !== undefined\n ? \"Setting...\"\n : triggerLabel}\n </span>\n <span className=\"model-dropdown-chevron\">▾</span>\n </button>\n\n {open && (\n <div className=\"model-dropdown-menu\" style={{ left: \"auto\", right: 0, maxWidth: \"calc(100vw - 32px)\" }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setActiveIdx(-1);\n }}\n onKeyDown={onKeyDown}\n placeholder=\"Search provider or model…\"\n className=\"model-dropdown-search\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"none\"\n spellCheck={false}\n />\n <div ref={listRef} className=\"model-dropdown-list\">\n {/* \"Use agent default\" row */}\n <button\n data-idx={-1}\n onMouseEnter={() => setActiveIdx(-1)}\n onClick={() => commit(-1)}\n className={`model-dropdown-item ${activeIdx === -1 ? \"model-dropdown-active\" : \"\"}`}\n >\n <span>Use agent default</span>\n {defaultModel !== undefined && defaultModel.provider.length > 0 && (\n <span className=\"model-dropdown-item-ctx\">\n {defaultModel.provider} / {defaultModel.modelId}\n </span>\n )}\n {selected === \"\" && <span className=\"text-green\">●</span>}\n </button>\n\n {filtered.length === 0 ? (\n <div className=\"model-dropdown-empty\">\n {search ? \"No models match\" : \"No models available\"}\n </div>\n ) : (\n filtered.map((opt, i) => (\n <button\n key={opt.value}\n data-idx={i}\n onMouseEnter={() => setActiveIdx(i)}\n onClick={() => commit(i)}\n className={`model-dropdown-item ${activeIdx === i ? \"model-dropdown-active\" : \"\"}`}\n style={{\n opacity: opt.hasAuth ? 1 : 0.4,\n cursor: opt.hasAuth ? \"pointer\" : \"not-allowed\",\n }}\n title={!opt.hasAuth ? `No API key for ${opt.provider}` : undefined}\n >\n <span className=\"model-dropdown-item-main\">\n <span className=\"model-dropdown-provider\">{opt.provider}</span>\n <span className=\"model-dropdown-name\">{opt.name}</span>\n </span>\n {!opt.hasAuth && (\n <span className=\"model-dropdown-warn\">⚠</span>\n )}\n {opt.value === selected && <span className=\"text-green\">●</span>}\n </button>\n ))\n )}\n </div>\n <div className=\"model-dropdown-footer\">\n {filtered.length} of {options.length} models — ↑↓ move, Enter pick, Esc close\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { type FormEvent, useRef, useEffect, useState, useCallback, type ClipboardEvent } from \"react\";\nimport { useSessionStore } from \"../stores/session-store\";\nimport { usePreferencesStore } from \"../stores/preferences-store\";\nimport type { ImageContent } from \"../lib/api-client\";\nimport { fetchSessionExtensions, execCommand, execCommandStream, completeFiles } from \"../lib/api-client\";\nimport { ModelDropdown } from \"./ModelDropdown\";\n\ninterface Props {\n sessionId: string;\n showOrch?: boolean;\n setShowOrch?: (v: boolean) => void;\n selectedModel?: string;\n onModelSelect?: (modelId: string, provider: string) => void;\n onModelError?: (error: string) => void;\n}\n\n/**\n * Slash command descriptor for the chat input.\n */\ninterface SlashCommand {\n name: string;\n description: string;\n handler: (sessionId: string) => Promise<void>;\n /** Whether this is an extension command that needs the invokeExtensionCommand API */\n isExtension?: boolean;\n}\n\nexport function ChatInput({ sessionId, showOrch, setShowOrch, selectedModel, onModelSelect, onModelError }: Props) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const isStreaming = useSessionStore((s) => s.streamState.isStreaming);\n const activeToolName = useSessionStore((s) => s.streamState.activeToolName);\n const sendPrompt = useSessionStore((s) => s.sendPrompt);\n const sendSteer = useSessionStore((s) => s.sendSteer);\n const abort = useSessionStore((s) => s.abort);\n const reloadMessages = useSessionStore((s) => s.reloadMessages);\n const [slashSuggestions, setSlashSuggestions] = useState<SlashCommand[]>([]);\n const [extensionCommands, setExtensionCommands] = useState<SlashCommand[]>([]);\n const [compacting, setCompacting] = useState(false);\n const [compactMessage, setCompactMessage] = useState<string | null>(null);\n\n // ── @-autocomplete state ──\n const project = useSessionStore((s) => {\n if (s.activeProjectId === undefined) return undefined;\n return s.projects.find((p) => p.id === s.activeProjectId);\n });\n const [acToken, setAcToken] = useState<{ start: number; end: number; query: string } | undefined>();\n const [acSuggestions, setAcSuggestions] = useState<string[]>([]);\n const [acSelectedIdx, setAcSelectedIdx] = useState(0);\n const acFetchSeqRef = useRef(0);\n\n // ── Bang mode (! / !!) ──\n const bangMode: \"context\" | \"local\" | undefined = (() => {\n if (isStreaming) return undefined;\n const text = textareaRef.current?.value ?? \"\";\n if (text.startsWith(\"!!\")) return \"local\";\n if (text.startsWith(\"!\")) return \"context\";\n return undefined;\n })();\n\n // Auto-clear inline message after 2.5s\n useEffect(() => {\n if (compactMessage === null) return;\n const id = setTimeout(() => setCompactMessage(null), 2500);\n return () => clearTimeout(id);\n }, [compactMessage]);\n\n // Fetch extension commands from the session's ExtensionRunner\n useEffect(() => {\n if (!sessionId) return;\n let cancelled = false;\n fetchSessionExtensions(sessionId)\n .then((info) => {\n if (cancelled) return;\n const cmds: SlashCommand[] = info.commands.map((cmd) => ({\n name: \"/\" + cmd.invocationName,\n description: cmd.description || \"Extension command\",\n handler: async (sid: string) => {\n const { invokeExtensionCommand } = await import(\"../lib/api-client\");\n await invokeExtensionCommand(sid, cmd.invocationName);\n },\n isExtension: true,\n }));\n setExtensionCommands(cmds);\n })\n .catch(() => {\n // session may not be live yet — that's fine\n });\n return () => {\n cancelled = true;\n };\n }, [sessionId]);\n\n // Build the full slash command list from builtins + extension commands\n const builtinCommands: SlashCommand[] = [\n {\n name: \"/compact\",\n description: \"Manually compact the session context\",\n handler: async (sid: string) => {\n try {\n await useSessionStore.getState().compactAndReload(sid);\n } catch (err: unknown) {\n const msg =\n err instanceof Error ? err.message : String(err);\n if (msg.includes(\"nothing_to_compact\")) {\n setCompactMessage(\"Nothing to compact\");\n return;\n }\n throw err;\n }\n },\n },\n {\n name: \"/compact with summary\",\n description: \"Compact and keep focus on specific areas\",\n handler: async (sid: string) => {\n try {\n await useSessionStore.getState().compactAndReload(sid);\n } catch (err: unknown) {\n const msg =\n err instanceof Error ? err.message : String(err);\n if (msg.includes(\"nothing_to_compact\")) {\n setCompactMessage(\"Nothing to compact\");\n return;\n }\n throw err;\n }\n },\n },\n {\n name: \"/reload\",\n description: \"Reload agent config and rebuild session tools\",\n handler: async () => {\n const { reloadAgent } = await import(\"../lib/api-client\");\n await reloadAgent();\n },\n },\n {\n name: \"/abort\",\n description: \"Abort the current streaming response\",\n handler: async () => {\n useSessionStore.getState().abort();\n },\n },\n ];\n const allSlashCommands = [...builtinCommands, ...extensionCommands];\n\n // ── Image attachments ──\n const [images, setImages] = useState<{ file: File; dataUrl: string }[]>([]);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const MAX_IMAGES = 5;\n const MAX_IMAGE_BYTES = 10 * 1024 * 1024; // 10 MB\n const ACCEPTED_IMAGE_TYPES = [\"image/png\", \"image/jpeg\", \"image/webp\", \"image/gif\"];\n const compressImages = usePreferencesStore((s) => s.compressImages);\n\n /**\n * Downscale an image to at most 2048px on the longest edge.\n * Converts to JPEG quality 0.85. Returns a Blob.\n * If the image is already smaller, returns the original File unchanged.\n */\n const compressImage = useCallback(\n (file: File): Promise<Blob> =>\n new Promise((resolve, reject) => {\n if (!compressImages) {\n resolve(file);\n return;\n }\n const img = new Image();\n img.onload = () => {\n const MAX_DIM = 2048;\n if (img.width <= MAX_DIM && img.height <= MAX_DIM) {\n URL.revokeObjectURL(img.src);\n resolve(file);\n return;\n }\n let { width, height } = img;\n if (width > height) {\n if (width > MAX_DIM) {\n height = Math.round((height * MAX_DIM) / width);\n width = MAX_DIM;\n }\n } else {\n if (height > MAX_DIM) {\n width = Math.round((width * MAX_DIM) / height);\n height = MAX_DIM;\n }\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\")!;\n // Fill white background for PNG transparency\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n URL.revokeObjectURL(img.src);\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob);\n else reject(new Error(\"Canvas toBlob returned null\"));\n },\n \"image/jpeg\",\n 0.85,\n );\n };\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(\"Failed to decode image for compression\"));\n };\n img.src = URL.createObjectURL(file);\n }),\n [compressImages],\n );\n\n const fileToBase64 = (file: Blob): Promise<string> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n // Strip the data:image/...;base64, prefix\n const comma = result.indexOf(\",\");\n resolve(comma !== -1 ? result.slice(comma + 1) : result);\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n\n const addImageFiles = (files: FileList | File[]) => {\n const next = [...images];\n for (const f of files) {\n if (!ACCEPTED_IMAGE_TYPES.includes(f.type)) continue;\n if (f.size > MAX_IMAGE_BYTES) continue;\n if (next.length >= MAX_IMAGES) break;\n const dataUrl = URL.createObjectURL(f);\n next.push({ file: f, dataUrl });\n }\n setImages(next);\n };\n\n const removeImage = (idx: number) => {\n const removed = images[idx];\n if (removed !== undefined) {\n URL.revokeObjectURL(removed.dataUrl);\n }\n setImages((cur) => cur.filter((_, i) => i !== idx));\n };\n\n const handleFilePicker = () => fileInputRef.current?.click();\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) addImageFiles(e.target.files);\n e.target.value = \"\";\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n const imageFiles: File[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith(\"image/\")) {\n const file = item.getAsFile();\n if (file) imageFiles.push(file);\n }\n }\n if (imageFiles.length > 0) {\n e.preventDefault();\n addImageFiles(imageFiles);\n }\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer.files) addImageFiles(e.dataTransfer.files);\n };\n\n useEffect(() => {\n const el = textareaRef.current;\n if (el !== null) {\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, 200)}px`;\n }\n }, []);\n\n // ── @-autocomplete logic ──\n\n /** Find an @-token at the caret position, if any. */\n const findAcToken = (value: string, caret: number): { start: number; end: number; query: string } | undefined => {\n if (caret <= 0) return undefined;\n let i = caret - 1;\n while (i >= 0) {\n const ch = value[i];\n if (ch === undefined) break;\n if (/\\s/.test(ch)) return undefined;\n if (ch === \"@\") {\n const prev = i === 0 ? \" \" : value[i - 1];\n if (prev === undefined || /\\s/.test(prev)) {\n return { start: i, end: caret, query: value.slice(i + 1, caret) };\n }\n return undefined; // email@example.com\n }\n i -= 1;\n }\n return undefined;\n };\n\n // Debounced fetch of @-completion suggestions\n useEffect(() => {\n if (acToken === undefined || project === undefined) return undefined;\n const seq = acFetchSeqRef.current + 1;\n acFetchSeqRef.current = seq;\n const handle = window.setTimeout(() => {\n completeFiles(project.id, acToken.query, { limit: 20 })\n .then((r) => {\n if (acFetchSeqRef.current !== seq) return; // stale\n setAcSuggestions(r.paths);\n setAcSelectedIdx(0);\n })\n .catch(() => {\n if (acFetchSeqRef.current !== seq) return;\n setAcSuggestions([]);\n });\n }, 100);\n return () => window.clearTimeout(handle);\n }, [acToken, project]);\n\n /** Insert the highlighted suggestion in place of the partial token. */\n const acInsert = (path: string): void => {\n if (acToken === undefined) return;\n const el = textareaRef.current;\n if (el === null) return;\n const before = el.value.slice(0, acToken.start);\n const after = el.value.slice(acToken.end);\n const replacement = `@\"${path}\"`;\n const next = `${before}${replacement}${after}`;\n el.value = next;\n setAcToken(undefined);\n setAcSuggestions([]);\n // Move caret after the inserted path\n const newCaret = acToken.start + replacement.length;\n el.setSelectionRange(newCaret, newCaret);\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, 200)}px`;\n };\n\n const acClose = (): void => {\n setAcToken(undefined);\n setAcSuggestions([]);\n };\n\n // ── Submit handler ──\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n const el = textareaRef.current;\n if (el === null) return;\n const text = el.value.trim();\n if (text.length === 0 && images.length === 0) return;\n\n // Check if the input is a slash command\n if (text.startsWith(\"/\") && !isStreaming) {\n const trimmed = text.trim().toLowerCase();\n const matched = allSlashCommands.find((cmd) => cmd.name.startsWith(trimmed));\n if (matched) {\n el.value = \"\";\n el.style.height = \"auto\";\n setSlashSuggestions([]);\n setImages([]);\n acClose();\n await matched.handler(sessionId);\n return;\n }\n }\n\n // ── Bash exec dispatch: !cmd / !!cmd (streaming) ──\n if (!isStreaming && /^!!?[^!]/.test(text)) {\n const excludeFromContext = text.startsWith(\"!!\");\n const command = text.slice(excludeFromContext ? 2 : 1).trim();\n if (command.length === 0) {\n setCompactMessage(\"Empty bash command. Type something after the `!`.\");\n return;\n }\n el.value = \"\";\n el.style.height = \"auto\";\n setSlashSuggestions([]);\n setImages([]);\n acClose();\n\n const { promise } = execCommandStream(sessionId, command, { excludeFromContext });\n try {\n await promise;\n await reloadMessages(sessionId);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n setCompactMessage(`Command failed: ${msg}`);\n }\n return;\n }\n\n // ── Convert images to SDK ImageContent[] ──\n let imageContents: ImageContent[] | undefined;\n if (images.length > 0) {\n imageContents = await Promise.all(\n images.map(async ({ file }) => {\n const compressed = await compressImage(file);\n return {\n type: \"image\" as const,\n data: await fileToBase64(compressed),\n // If compression changed the file, mimeType is now JPEG\n mimeType: compressed === file ? file.type : \"image/jpeg\",\n };\n }),\n );\n }\n\n el.value = \"\";\n el.style.height = \"auto\";\n setSlashSuggestions([]);\n acClose();\n\n // Keep blob URLs alive for optimistic display\n setImages([]);\n\n if (isStreaming) {\n await sendSteer(text, imageContents);\n } else {\n await sendPrompt(text, imageContents);\n }\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit(e);\n }\n };\n\n const handleInput = useCallback(() => {\n const el = textareaRef.current;\n if (el === null) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, 200)}px`;\n\n const text = el.value;\n\n // ── Detect slash commands ──\n if (text.startsWith(\"/\")) {\n const trimmed = text.trim().toLowerCase();\n const matched = allSlashCommands.filter((cmd) => cmd.name.startsWith(trimmed));\n setSlashSuggestions(matched);\n } else {\n setSlashSuggestions([]);\n }\n\n // ── Detect @-autocomplete token ──\n const caret = el.selectionStart;\n if (caret !== undefined && !isStreaming) {\n const token = findAcToken(text, caret);\n setAcToken(token);\n } else {\n acClose();\n }\n }, [extensionCommands, allSlashCommands, isStreaming]);\n\n const handleSlashCommand = async (cmd: SlashCommand) => {\n const el = textareaRef.current;\n if (el === null) return;\n el.value = \"\";\n el.style.height = \"auto\";\n setSlashSuggestions([]);\n acClose();\n setCompacting(true);\n try {\n await cmd.handler(sessionId);\n } catch (err) {\n console.error(\"Slash command failed:\", err);\n } finally {\n setCompacting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} onDragOver={handleDragOver} onDrop={handleDrop} className=\"ti-area\">\n {isStreaming && (\n <div className=\"ti-steer-badge\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n <span>Your message will redirect the agent after its current tool calls</span>\n </div>\n )}\n <div className=\"ti-container\">\n {/* Inline status message */}\n {compactMessage !== null && (\n <div\n style={{\n fontSize: 11,\n color: \"var(--text-dim)\",\n padding: \"2px 0 0\",\n textAlign: \"center\",\n }}\n >\n {compactMessage}\n </div>\n )}\n {/* Slash command suggestions */}\n {slashSuggestions.length > 0 && (\n <div className=\"ti-slash-suggestions\">\n {slashSuggestions.map((cmd) => (\n <button\n key={cmd.name}\n type=\"button\"\n className=\"ti-slash-item\"\n onClick={() => handleSlashCommand(cmd)}\n disabled={compacting}\n >\n <span className=\"ti-slash-name\">{cmd.name}</span>\n <span className=\"ti-slash-desc\">{cmd.description}</span>\n </button>\n ))}\n </div>\n )}\n\n {/* @-completion popover — anchored above the textarea */}\n {acToken !== undefined && acSuggestions.length > 0 && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: 0,\n right: 0,\n zIndex: 10,\n marginBottom: 4,\n overflow: \"hidden\",\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid var(--border)\",\n background: \"var(--bg-frosted)\",\n boxShadow: \"0 8px 24px rgba(0,0,0,0.4)\",\n }}\n >\n <div\n style={{\n maxHeight: \"60vh\",\n overflowY: \"auto\",\n padding: \"4px 0\",\n }}\n >\n {acSuggestions.map((path, i) => (\n <button\n key={path}\n onMouseDown={(ev) => {\n ev.preventDefault();\n acInsert(path);\n }}\n onMouseEnter={() => setAcSelectedIdx(i)}\n style={{\n display: \"block\",\n width: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n padding: \"6px 12px\",\n textAlign: \"left\",\n fontFamily: \"monospace\",\n fontSize: 12,\n border: \"none\",\n cursor: \"pointer\",\n background: i === acSelectedIdx ? \"var(--accent-bg, var(--bg-glass-active))\" : \"transparent\",\n color: i === acSelectedIdx ? \"var(--text-primary)\" : \"var(--text-secondary)\",\n }}\n title={path}\n >\n {path}\n </button>\n ))}\n </div>\n <div\n style={{\n borderTop: \"1px solid var(--border)\",\n padding: \"4px 12px\",\n fontSize: 10,\n color: \"var(--text-dim)\",\n }}\n >\n ↑↓ navigate · Enter/Tab insert · Esc close\n </div>\n </div>\n )}\n\n {/* Image preview thumbnails */}\n {images.length > 0 && (\n <div className=\"ti-image-preview-row\">\n {images.map((img, i) => (\n <div key={i} className=\"ti-image-preview-item\">\n <img src={img.dataUrl} alt={`Attachment ${i + 1}`} className=\"ti-image-thumb\" />\n <button\n type=\"button\"\n className=\"ti-image-remove\"\n onClick={() => removeImage(i)}\n aria-label=\"Remove image\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className=\"ti-input\"\n onKeyDown={onKeyDown}\n onPaste={handlePaste}\n onInput={handleInput}\n placeholder={\n compacting\n ? \"Compacting…\"\n : isStreaming\n ? \"Steer the agent…\"\n : \"Send a message... (/compact, /abort, !cmd, @file)\"\n }\n disabled={compacting}\n rows={1}\n />\n\n <div className=\"ti-toolbar\">\n <div className=\"ti-toolbar-left\">\n {/* Bang mode indicator */}\n {bangMode !== undefined && (\n <span\n style={{\n fontSize: 10,\n color: bangMode === \"local\" ? \"var(--accent-text)\" : \"var(--text-secondary)\",\n padding: \"0 6px\",\n fontFamily: \"monospace\",\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n opacity: 0.7,\n }}\n title={\n bangMode === \"local\"\n ? \"!! — bash runs locally, output stays out of LLM context\"\n : \"! — bash runs, output feeds into next LLM turn\"\n }\n >\n {bangMode === \"local\" ? \"!! local\" : \"! context\"}\n </span>\n )}\n\n {/* Image attach button */}\n <button\n type=\"button\"\n className=\"ti-toolbar-btn\"\n onClick={handleFilePicker}\n title=\"Attach image\"\n tabIndex={-1}\n disabled={images.length >= MAX_IMAGES}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,image/gif\"\n multiple\n style={{ display: \"none\" }}\n onChange={handleFileChange}\n />\n\n <button\n type=\"button\"\n className=\"ti-toolbar-btn\"\n onClick={() => setShowOrch?.(!showOrch)}\n title=\"Subagent\"\n tabIndex={-1}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" style={{ fill: showOrch ? \"currentColor\" : \"none\" }} />\n </svg>\n </button>\n </div>\n\n <div className=\"ti-toolbar-right\">\n {onModelSelect !== undefined && (\n <ModelDropdown\n sessionId={sessionId}\n selected={selectedModel ?? \"\"}\n onSelect={onModelSelect}\n onError={onModelError ?? (() => {})}\n compact\n />\n )}\n {isStreaming ? (\n <>\n <button type=\"button\" onClick={abort} className=\"ti-abort-btn\" title=\"Abort\" tabIndex={-1}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n </button>\n <button type=\"submit\" className=\"ti-send-btn ti-steer-send\" title=\"Send (steer)\" tabIndex={-1} disabled={compacting}>\n <span className=\"ti-send-icon\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n </span>\n </button>\n </>\n ) : (\n <button type=\"submit\" className={`ti-send-btn${isStreaming && activeToolName ? \" pulsing\" : \"\"}`} title=\"Send\" tabIndex={-1} disabled={compacting}>\n <span className=\"ti-send-icon\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n </span>\n </button>\n )}\n </div>\n </div>\n </div>\n </form>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { answerAskQuestion, getPendingAskQuestions, type AskQuestion } from \"../lib/api-client\";\nimport { useAskUserQuestionStore, type PendingAskQuestion } from \"../stores/ask-user-question-store\";\n\ninterface Props {\n sessionId: string;\n}\n\nexport function AskUserQuestionPanel({ sessionId }: Props) {\n const pending = useAskUserQuestionStore((s) => s.pendingBySession[sessionId]);\n if (pending === undefined) return null;\n return <PanelBody key={pending.requestId} pending={pending} />;\n}\n\ninterface PendingAnswer {\n selectedLabel?: string;\n customText?: string;\n multiLabels?: string[];\n}\n\nfunction PanelBody({ pending }: { pending: PendingAskQuestion }) {\n const clearPending = useAskUserQuestionStore((s) => s.clearPending);\n const [tab, setTab] = useState(0);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | undefined>(undefined);\n const [drafts, setDrafts] = useState<(PendingAnswer | null)[]>(() =>\n pending.questions.map(() => null),\n );\n\n const current = pending.questions[tab];\n if (current === undefined) return null;\n\n const isLast = tab === pending.questions.length - 1;\n\n const saveDraft = (answer: PendingAnswer): void => {\n setDrafts((prev) => {\n const next = [...prev];\n next[tab] = answer;\n return next;\n });\n };\n\n const getDraft = (): PendingAnswer => drafts[tab] ?? {};\n\n const buildAnswers = () => {\n return pending.questions.map((q, i) => {\n const draft = drafts[i];\n if (draft === null) {\n return {\n questionIndex: i,\n question: q.question,\n kind: \"chat\" as const,\n answer: null,\n };\n }\n if (draft.customText !== undefined) {\n return {\n questionIndex: i,\n question: q.question,\n kind: \"custom\" as const,\n answer: draft.customText,\n };\n }\n if (q.multiSelect) {\n return {\n questionIndex: i,\n question: q.question,\n kind: \"multi\" as const,\n answer: null,\n selected: draft.multiLabels ?? [],\n };\n }\n return {\n questionIndex: i,\n question: q.question,\n kind: \"option\" as const,\n answer: draft.selectedLabel ?? null,\n };\n });\n };\n\n const submit = async (cancelled = false) => {\n setSubmitting(true);\n setError(undefined);\n try {\n const answers = cancelled ? [] : buildAnswers();\n await answerAskQuestion(pending.sessionId, pending.requestId, answers, cancelled);\n clearPending(pending.sessionId, pending.requestId);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleNext = () => {\n setTab((t) => Math.min(t + 1, pending.questions.length - 1));\n };\n\n const handlePrev = () => {\n setTab((t) => Math.max(t - 1, 0));\n };\n\n return (\n <div\n style={{\n border: \"1px solid var(--border)\",\n borderRadius: 12,\n background: \"var(--bg-glass-strong)\",\n padding: 16,\n margin: \"8px auto\",\n maxWidth: 800,\n width: \"100%\",\n boxSizing: \"border-box\",\n }}\n >\n {/* Header */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 12 }}>\n <span style={{ fontSize: 13, fontWeight: 600, color: \"var(--text-primary)\" }}>\n {current.header}\n </span>\n {pending.questions.length > 1 && (\n <span style={{ fontSize: 11, color: \"var(--text-dim)\" }}>\n {tab + 1} / {pending.questions.length}\n </span>\n )}\n <div style={{ flex: 1 }} />\n <button\n onClick={() => void submit(true)}\n disabled={submitting}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--text-tertiary)\",\n cursor: \"pointer\",\n fontSize: 12,\n padding: \"2px 6px\",\n borderRadius: 4,\n }}\n title=\"Chat about this instead\"\n >\n ✕ Chat about it\n </button>\n </div>\n\n {/* Question */}\n <div style={{ fontSize: 14, color: \"var(--text-primary)\", marginBottom: 12, lineHeight: 1.5 }}>\n {current.question}\n </div>\n\n {/* Options */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {current.multiSelect ? (\n <MultiSelectOptions\n options={current.options}\n selected={getDraft().multiLabels ?? []}\n onChange={(labels) => saveDraft({ multiLabels: labels })}\n />\n ) : (\n <SingleSelectOptions\n options={current.options}\n selected={getDraft().selectedLabel}\n onSelect={(label) => saveDraft({ selectedLabel: label, customText: undefined })}\n />\n )}\n\n {/* Custom input */}\n {!current.multiSelect && (\n <div style={{ marginTop: 8 }}>\n <input\n type=\"text\"\n placeholder=\"Type something...\"\n value={getDraft().customText ?? \"\"}\n onChange={(e) =>\n saveDraft({ customText: e.target.value, selectedLabel: undefined })\n }\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 8,\n border: \"1px solid var(--input-border)\",\n background: \"var(--input-bg)\",\n color: \"var(--text-primary)\",\n fontSize: 13,\n fontFamily: \"inherit\",\n outline: \"none\",\n }}\n />\n </div>\n )}\n </div>\n\n {/* Error */}\n {error !== undefined && (\n <div style={{ fontSize: 12, color: \"var(--error)\", marginTop: 8 }}>{error}</div>\n )}\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginTop: 12,\n gap: 8,\n }}\n >\n <div>\n {tab > 0 && (\n <button\n onClick={handlePrev}\n disabled={submitting}\n style={btnStyle}\n >\n ← Back\n </button>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 6 }}>\n {isLast ? (\n <button\n onClick={() => void submit(false)}\n disabled={submitting}\n style={{ ...btnStyle, background: \"var(--accent)\", color: \"#fff\" }}\n >\n {submitting ? \"Submitting...\" : \"Submit\"}\n </button>\n ) : (\n <button\n onClick={handleNext}\n disabled={submitting}\n style={btnStyle}\n >\n Next →\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nconst btnStyle: React.CSSProperties = {\n padding: \"6px 14px\",\n borderRadius: 8,\n border: \"1px solid var(--border)\",\n background: \"var(--bg-glass-hover)\",\n color: \"var(--text-primary)\",\n fontSize: 13,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n};\n\nfunction SingleSelectOptions({\n options,\n selected,\n onSelect,\n}: {\n options: AskQuestion[\"options\"];\n selected?: string;\n onSelect: (label: string) => void;\n}) {\n return (\n <>\n {options.map((opt) => (\n <button\n key={opt.label}\n onClick={() => onSelect(opt.label)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n padding: \"8px 12px\",\n borderRadius: 8,\n border: `1px solid ${selected === opt.label ? \"var(--accent)\" : \"var(--border)\"}`,\n background:\n selected === opt.label ? \"var(--accent-subtle)\" : \"var(--bg-glass)\",\n color: \"var(--text-primary)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontSize: 13,\n fontFamily: \"inherit\",\n transition: \"all 0.15s\",\n }}\n >\n <span style={{ fontWeight: 500 }}>{opt.label}</span>\n <span style={{ fontSize: 12, color: \"var(--text-secondary)\" }}>\n {opt.description}\n </span>\n </button>\n ))}\n </>\n );\n}\n\nfunction MultiSelectOptions({\n options,\n selected,\n onChange,\n}: {\n options: AskQuestion[\"options\"];\n selected: string[];\n onChange: (labels: string[]) => void;\n}) {\n const toggle = (label: string) => {\n if (selected.includes(label)) {\n onChange(selected.filter((l) => l !== label));\n } else {\n onChange([...selected, label]);\n }\n };\n\n return (\n <>\n {options.map((opt) => {\n const isChecked = selected.includes(opt.label);\n return (\n <label\n key={opt.label}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 10,\n padding: \"8px 12px\",\n borderRadius: 8,\n border: `1px solid ${isChecked ? \"var(--accent)\" : \"var(--border)\"}`,\n background: isChecked ? \"var(--accent-subtle)\" : \"var(--bg-glass)\",\n cursor: \"pointer\",\n fontSize: 13,\n fontFamily: \"inherit\",\n transition: \"all 0.15s\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={() => toggle(opt.label)}\n style={{ marginTop: 2, accentColor: \"var(--accent-text)\" }}\n />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n <span style={{ fontWeight: 500 }}>{opt.label}</span>\n <span style={{ fontSize: 12, color: \"var(--text-secondary)\" }}>\n {opt.description}\n </span>\n </div>\n </label>\n );\n })}\n </>\n );\n}\n","import { useId, type CSSProperties } from \"react\";\n\ninterface Props {\n /** Skeleton variant */\n variant?: \"text\" | \"card\" | \"list\" | \"tree\" | \"circle\";\n /** Number of lines/items to show (for text/list variants) */\n count?: number;\n /** Width override (e.g. \"60%\", \"200px\") */\n width?: string;\n /** Height override (e.g. \"40px\") */\n height?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n}\n\n/**\n * Animated loading skeleton placeholder.\n *\n * Variants:\n * text — multiple shimmer lines (default: 3 lines, last 60% width)\n * card — a full card block with title + description lines\n * list — row items with icon circle + text lines\n * tree — indented file tree lines\n * circle — circular shimmer (avatar/icon placeholder)\n *\n * Usage:\n * <LoadingSkeleton variant=\"list\" count={5} />\n * <LoadingSkeleton variant=\"card\" count={2} />\n */\nexport function LoadingSkeleton({ variant = \"text\", count = 1, width, height, style }: Props) {\n const uid = useId();\n\n const shared: CSSProperties = {\n borderRadius: \"4px\",\n background: `linear-gradient(90deg,\n var(--text-ghost, rgba(255,255,255,0.10)) 25%,\n var(--text-dim, rgba(255,255,255,0.35)) 50%,\n var(--text-ghost, rgba(255,255,255,0.10)) 75%)`,\n backgroundSize: \"200% 100%\",\n animation: `${uid}-shimmer 1.4s ease-in-out infinite`,\n width,\n height,\n };\n\n const animationStyle = `\n@keyframes ${uid}-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}`;\n\n if (variant === \"circle\") {\n return (\n <>\n <style>{animationStyle}</style>\n <div\n style={{\n ...shared,\n width: width ?? \"32px\",\n height: height ?? \"32px\",\n borderRadius: \"50%\",\n flexShrink: 0,\n ...style,\n }}\n />\n </>\n );\n }\n\n if (variant === \"card\") {\n return (\n <>\n <style>{animationStyle}</style>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12, ...style }}>\n {Array.from({ length: count }, (_, i) => (\n <div\n key={i}\n style={{\n padding: \"14px\",\n borderRadius: \"8px\",\n border: \"1px solid var(--border, #444)\",\n background: \"var(--header-bg, rgba(55,55,60,0.75))\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 10,\n }}\n >\n <div style={{ ...shared, height: \"14px\", width: \"55%\" }} />\n <div style={{ ...shared, height: \"10px\", width: \"85%\" }} />\n <div style={{ ...shared, height: \"10px\", width: \"40%\" }} />\n </div>\n ))}\n </div>\n </>\n );\n }\n\n if (variant === \"tree\") {\n return (\n <>\n <style>{animationStyle}</style>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, padding: \"4px 0\", ...style }}>\n {Array.from({ length: count }, (_, i) => (\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: 8, paddingLeft: `${(i % 3) * 16 + 8}px` }}>\n <div style={{ ...shared, width: \"14px\", height: \"14px\", borderRadius: \"3px\", flexShrink: 0 }} />\n <div style={{ ...shared, height: \"10px\", width: `${50 + (i % 3) * 20}%` }} />\n </div>\n ))}\n </div>\n </>\n );\n }\n\n if (variant === \"list\") {\n return (\n <>\n <style>{animationStyle}</style>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, ...style }}>\n {Array.from({ length: count }, (_, i) => (\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: 10, padding: \"6px 0\" }}>\n <div style={{ ...shared, width: \"24px\", height: \"24px\", borderRadius: \"4px\", flexShrink: 0 }} />\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <div style={{ ...shared, height: \"10px\", width: `${65 + (i % 3) * 15}%` }} />\n <div style={{ ...shared, height: \"8px\", width: `${40 + (i % 2) * 20}%` }} />\n </div>\n </div>\n ))}\n </div>\n </>\n );\n }\n\n // text variant (default)\n return (\n <>\n <style>{animationStyle}</style>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, ...style }}>\n {Array.from({ length: count }, (_, i) => (\n <div\n key={i}\n style={{\n ...shared,\n height: \"10px\",\n width: i === count - 1 && count > 1 ? \"60%\" : \"100%\",\n }}\n />\n ))}\n </div>\n </>\n );\n}\n","import { useEffect, useState, useCallback } from \"react\";\nimport { LoadingSkeleton } from \"./LoadingSkeleton\";\nimport type {\n OrchestrationConfig,\n WorkerListItem,\n InboxItem,\n} from \"../lib/api-client\";\nimport {\n fetchOrchestrationConfig,\n getSessionOrchestrationRole,\n enableSupervisorUI,\n disableSupervisorUI,\n listWorkers,\n fetchInbox,\n clearInboxUI,\n killWorkerUI,\n detachWorkerUI,\n resumeWorkerUI,\n} from \"../lib/api-client\";\n\ninterface Props {\n sessionId: string;\n open: boolean;\n onClose: () => void;\n}\n\ntype Role = \"supervisor\" | \"worker\" | \"standalone\" | \"loading\";\n\nexport function OrchestrationPanel({ sessionId, open, onClose }: Props) {\n const [config, setConfig] = useState<OrchestrationConfig | null>(null);\n const [role, setRole] = useState<Role>(\"loading\");\n const [workers, setWorkers] = useState<WorkerListItem[]>([]);\n const [inboxItems, setInboxItems] = useState<InboxItem[]>([]);\n const [inboxCount, setInboxCount] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [enabling, setEnabling] = useState(false);\n\n const loadData = useCallback(async () => {\n try {\n const cfg = await fetchOrchestrationConfig();\n setConfig(cfg);\n if (cfg.available === false) return;\n\n const roleData = await getSessionOrchestrationRole(sessionId);\n setRole(roleData.role);\n\n if (roleData.role === \"supervisor\") {\n const [w, i] = await Promise.all([\n listWorkers(sessionId),\n fetchInbox(sessionId),\n ]);\n setWorkers(w.workers);\n setInboxItems(i.items);\n setInboxCount(i.count);\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n }, [sessionId]);\n\n useEffect(() => {\n if (!open) return;\n loadData();\n const interval = setInterval(loadData, 4000);\n return () => clearInterval(interval);\n }, [open, loadData]);\n\n const handleEnable = async () => {\n setEnabling(true);\n setError(null);\n try {\n await enableSupervisorUI(sessionId);\n await loadData();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n setEnabling(false);\n };\n\n const handleDisable = async () => {\n setError(null);\n try {\n await disableSupervisorUI(sessionId);\n await loadData();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n };\n\n const handleKill = async (workerId: string) => {\n try {\n await killWorkerUI(sessionId, workerId);\n await loadData();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n };\n\n const handleDetach = async (workerId: string) => {\n try {\n await detachWorkerUI(sessionId, workerId);\n await loadData();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n };\n\n const handleResume = async (workerId: string) => {\n try {\n await resumeWorkerUI(sessionId, workerId);\n await loadData();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n };\n\n if (!open) return null;\n\n if (config?.available === false) {\n return (\n <div\n style={{\n padding: \"12px 16px\",\n fontSize: \"12px\",\n color: \"var(--text-dim)\",\n borderBottom: \"1px solid var(--border-color)\",\n }}\n >\n 🚫 Orchestration unavailable: {config.disabledReason ?? \"disabled\"}\n </div>\n );\n }\n\n const pendingCount = inboxItems.filter((i) => !i.delivered).length;\n\n return (\n <div\n style={{\n padding: \"10px 16px\",\n fontSize: \"12px\",\n color: \"var(--text-secondary)\",\n borderBottom: \"1px solid var(--border-color)\",\n background: \"var(--bg-secondary)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n maxWidth: 800,\n margin: \"0 auto\",\n width: \"100%\",\n boxSizing: \"border-box\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <span style={{ fontWeight: 600, fontSize: \"13px\" }}>\n ⚡ Orchestration\n </span>\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--text-dim)\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n }}\n >\n ✕\n </button>\n </div>\n\n {role === \"loading\" && <LoadingSkeleton variant=\"list\" count={2} />}\n\n {role === \"standalone\" && (\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"center\",\n }}\n >\n <span>Session is standalone.</span>\n <button\n type=\"button\"\n onClick={handleEnable}\n disabled={enabling}\n style={{\n padding: \"4px 10px\",\n fontSize: \"11px\",\n fontWeight: 600,\n background: \"var(--accent-bg)\",\n color: \"var(--accent-text)\",\n border: \"1px solid var(--accent-border)\",\n borderRadius: \"var(--radius-sm)\",\n cursor: enabling ? \"wait\" : \"pointer\",\n }}\n >\n {enabling ? \"Enabling...\" : \"Enable supervisor mode\"}\n </button>\n </div>\n )}\n\n {role === \"supervisor\" && (\n <>\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n }}\n >\n <span style={{ color: \"var(--accent-text)\", fontWeight: 500 }}>\n ✅ Supervisor active\n </span>\n <span style={{ color: \"var(--text-dim)\" }}>\n {workers.length} worker(s)\n {pendingCount > 0 && (\n <span style={{ color: \"#e5c07b\", marginLeft: \"4px\" }}>\n · {pendingCount} pending inbox\n </span>\n )}\n </span>\n <button\n type=\"button\"\n onClick={handleDisable}\n style={{\n padding: \"3px 8px\",\n fontSize: \"11px\",\n background: \"none\",\n color: \"var(--text-dim)\",\n border: \"1px solid var(--border-color)\",\n borderRadius: \"var(--radius-sm)\",\n cursor: \"pointer\",\n }}\n >\n Disable\n </button>\n </div>\n\n {workers.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}>\n {workers.map((w) => (\n <div\n key={w.workerId}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontSize: \"11px\",\n padding: \"4px 6px\",\n background: \"var(--bg-primary)\",\n borderRadius: \"var(--radius-sm)\",\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: w.isLive\n ? w.state === \"running\" || w.state === \"streaming\"\n ? \"#98c379\"\n : w.state === \"awaiting_question\"\n ? \"#e5c07b\"\n : w.state === \"errored\"\n ? \"#e06c75\"\n : \"#56b6c2\"\n : \"#5c6370\",\n display: \"inline-block\",\n }}\n />\n <span style={{ flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\" }}>\n {w.name ?? w.workerId.slice(0, 8)}\n </span>\n <span style={{ color: \"var(--text-dim)\" }}>{w.state}</span>\n {!w.isLive && (\n <button\n type=\"button\"\n onClick={() => handleResume(w.workerId)}\n style={{\n padding: \"1px 5px\",\n fontSize: \"10px\",\n background: \"none\",\n border: \"1px solid var(--border-color)\",\n borderRadius: \"var(--radius-sm)\",\n cursor: \"pointer\",\n }}\n >\n Resume\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => handleDetach(w.workerId)}\n title=\"Detach\"\n style={{\n padding: \"1px 5px\",\n fontSize: \"10px\",\n background: \"none\",\n border: \"1px solid var(--border-color)\",\n borderRadius: \"var(--radius-sm)\",\n cursor: \"pointer\",\n }}\n >\n Detach\n </button>\n <button\n type=\"button\"\n onClick={() => handleKill(w.workerId)}\n title=\"Kill\"\n style={{\n padding: \"1px 5px\",\n fontSize: \"10px\",\n background: \"none\",\n border: \"1px solid #e06c75\",\n color: \"#e06c75\",\n borderRadius: \"var(--radius-sm)\",\n cursor: \"pointer\",\n }}\n >\n Kill\n </button>\n </div>\n ))}\n </div>\n )}\n\n {pendingCount > 0 && (\n <div\n style={{\n fontSize: \"11px\",\n padding: \"4px 6px\",\n background: \"var(--bg-primary)\",\n borderRadius: \"var(--radius-sm)\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span>{pendingCount} undelivered inbox item(s)</span>\n <button\n type=\"button\"\n onClick={async () => {\n await clearInboxUI(sessionId);\n await loadData();\n }}\n style={{\n padding: \"1px 5px\",\n fontSize: \"10px\",\n background: \"none\",\n border: \"1px solid var(--border-color)\",\n borderRadius: \"var(--radius-sm)\",\n cursor: \"pointer\",\n }}\n >\n Clear inbox\n </button>\n </div>\n )}\n </>\n )}\n\n {role === \"worker\" && (\n <span>This session is a worker. Orchestration is managed by the supervisor.</span>\n )}\n\n {error !== null && (\n <div style={{ color: \"#e06c75\", fontSize: \"11px\" }}>Error: {error}</div>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { getSessionContext } from \"../lib/api-client\";\nimport { useSessionStore } from \"../stores/session-store\";\nimport type { SessionContextResponse } from \"../lib/api-client/types\";\n\nexport function useContextData(sessionId: string | undefined) {\n const [data, setData] = useState<SessionContextResponse | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | undefined>(undefined);\n\n useEffect(() => {\n if (sessionId === undefined) {\n setData(null);\n return;\n }\n\n const fetch = async () => {\n try {\n const res = await getSessionContext(sessionId);\n setData(res);\n } catch {\n setData(null);\n }\n };\n\n fetch();\n intervalRef.current = setInterval(fetch, 5000);\n\n return () => {\n clearInterval(intervalRef.current);\n };\n }, [sessionId]);\n\n return data;\n}\n\nexport function ContextPill({\n data,\n onInspect,\n}: {\n data: SessionContextResponse | null;\n onInspect: (data: SessionContextResponse) => void;\n}) {\n const pct = data?.contextUsage?.percent ?? null;\n if (pct === null) return null;\n\n const rounded = Math.round(pct);\n\n return (\n <button\n type=\"button\"\n className=\"ctx-pill\"\n onClick={() => data !== null && onInspect(data)}\n title={`Context: ${data!.contextUsage!.tokens?.toLocaleString() ?? \"?\"} / ${data!.contextUsage!.contextWindow.toLocaleString()} tokens`}\n >\n <span className=\"ctx-pill-dot\" />\n {rounded}%\n </button>\n );\n}\n\nfunction formatCost(cost: number): string {\n if (cost < 0.001) return \"$0.00\";\n return `$${cost.toFixed(4)}`;\n}\n\nexport function ContextInspectModal({ data, sessionId, onClose }: { data: SessionContextResponse; sessionId?: string; onClose: () => void }) {\n const dialogRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n const usage = data.contextUsage;\n const s = data.stats;\n const pct = usage?.percent ?? null;\n const barColor =\n pct !== null && pct >= 90 ? \"var(--error)\" :\n pct !== null && pct >= 70 ? \"var(--warning)\" :\n \"var(--accent)\";\n\n const [compacting, setCompacting] = useState(false);\n const [compactError, setCompactError] = useState<string | null>(null);\n const [compactResult, setCompactResult] = useState<{ summary: string; tokensBefore: number } | null>(null);\n\n const handleCompact = async () => {\n if (sessionId === undefined) return;\n setCompacting(true);\n setCompactError(null);\n setCompactResult(null);\n try {\n const result = await useSessionStore.getState().compactAndReload(sessionId);\n setCompactResult(result);\n } catch (err) {\n setCompactError(err instanceof Error ? err.message : String(err));\n } finally {\n setCompacting(false);\n }\n };\n\n return (\n <div className=\"settings-overlay\" onClick={onClose} role=\"dialog\" aria-modal=\"true\">\n <div\n ref={dialogRef}\n className=\"settings-panel\"\n style={{ maxWidth: \"420px\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <header className=\"settings-header\">\n <span className=\"settings-section-title\" style={{ margin: 0, textTransform: \"none\", letterSpacing: 0, fontSize: \"13px\" }}>\n Context Inspector\n </span>\n <button type=\"button\" className=\"settings-close\" onClick={onClose}>✕</button>\n </header>\n\n <div className=\"settings-body\" style={{ padding: \"12px 16px 16px\" }}>\n {pct !== null && (\n <div className=\"settings-card\" style={{ marginBottom: \"10px\" }}>\n <div className=\"settings-card-header\">\n <div className=\"ctx-modal-track\" style={{ flex: 1 }}>\n <div className=\"ctx-modal-fill\" style={{ width: `${Math.min(pct, 100)}%`, background: barColor }} />\n </div>\n <span style={{ fontSize: \"12px\", fontWeight: 600, color: \"var(--text-primary)\", fontVariantNumeric: \"tabular-nums\", whiteSpace: \"nowrap\" }}>\n {Math.round(pct)}%\n </span>\n </div>\n <div className=\"ctx-modal-labels\" style={{ padding: \"0 12px 8px\" }}>\n <span>{usage!.tokens?.toLocaleString() ?? \"?\"} / {usage!.contextWindow.toLocaleString()} tokens</span>\n </div>\n </div>\n )}\n\n <div className=\"settings-card\" style={{ marginBottom: \"10px\" }}>\n <div className=\"settings-card-header\">\n <span className=\"settings-section-title\" style={{ margin: 0 }}>Tokens</span>\n </div>\n <div style={{ padding: \"0 12px 8px\" }}>\n <Row label=\"Input\" value={s.tokens.input.toLocaleString()} />\n <Row label=\"Output\" value={s.tokens.output.toLocaleString()} />\n <Row label=\"Cache Read\" value={s.tokens.cacheRead.toLocaleString()} />\n <Row label=\"Cache Write\" value={s.tokens.cacheWrite.toLocaleString()} />\n <Row label=\"Total\" value={s.tokens.total.toLocaleString()} accent />\n </div>\n </div>\n\n <div className=\"settings-card\" style={{ marginBottom: \"10px\" }}>\n <div className=\"settings-card-header\">\n <span className=\"settings-section-title\" style={{ margin: 0 }}>Cost</span>\n </div>\n <div style={{ padding: \"0 12px 8px\" }}>\n <Row label=\"Total spent\" value={formatCost(s.cost)} />\n </div>\n </div>\n\n <div className=\"settings-card\">\n <div className=\"settings-card-header\">\n <span className=\"settings-section-title\" style={{ margin: 0 }}>Conversation</span>\n </div>\n <div style={{ padding: \"0 12px 8px\" }}>\n <Row label=\"User messages\" value={String(s.userMessages)} />\n <Row label=\"Assistant messages\" value={String(s.assistantMessages)} />\n <Row label=\"Tool calls\" value={String(s.toolCalls)} />\n <Row label=\"Tool results\" value={String(s.toolResults)} />\n </div>\n </div>\n\n {/* Compact button */}\n <div className=\"settings-card\" style={{ marginTop: \"10px\" }}>\n <div style={{ padding: \"10px 12px\" }}>\n <button\n type=\"button\"\n className=\"compact-ctx-btn\"\n onClick={handleCompact}\n disabled={compacting}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n border: \"1px solid var(--border)\",\n borderRadius: \"var(--radius-sm)\",\n background: \"var(--surface-2)\",\n color: \"var(--text-primary)\",\n fontSize: \"12px\",\n fontWeight: 600,\n cursor: compacting ? \"wait\" : \"pointer\",\n opacity: compacting ? 0.6 : 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"6px\",\n }}\n >\n {compacting ? (\n <>⏳ Compacting…</>\n ) : (\n <>🗜️ Compact session</>\n )}\n </button>\n\n {/* Success feedback */}\n {compactResult !== null && (\n <div style={{\n marginTop: \"8px\",\n padding: \"6px 10px\",\n background: \"color-mix(in srgb, var(--accent) 8%, transparent)\",\n borderRadius: \"var(--radius-sm)\",\n fontSize: \"11px\",\n lineHeight: 1.5,\n color: \"var(--text-primary)\",\n maxHeight: \"120px\",\n overflowY: \"auto\",\n }}>\n <div style={{ fontWeight: 600, marginBottom: \"2px\" }}>\n ✅ Compacted — context was {compactResult.tokensBefore.toLocaleString()} tokens\n </div>\n <div style={{ color: \"var(--text-dim)\" }}>\n {compactResult.summary.slice(0, 300)}\n {compactResult.summary.length > 300 ? \"…\" : \"\"}\n </div>\n </div>\n )}\n\n {compactError !== null && (\n <div style={{\n marginTop: \"6px\",\n fontSize: \"11px\",\n color: \"var(--error)\",\n textAlign: \"center\",\n }}>\n {compactError}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction Row({ label, value, accent }: { label: string; value: string; accent?: boolean }) {\n return (\n <div style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"3px 0\",\n fontSize: \"12px\",\n color: \"var(--text-secondary)\",\n }}>\n <span>{label}</span>\n <span style={{\n fontVariantNumeric: \"tabular-nums\",\n color: accent ? \"var(--accent)\" : \"var(--text-primary)\",\n fontWeight: accent ? 600 : 500,\n }}>{value}</span>\n </div>\n );\n}\n","import { create } from \"zustand\";\nimport {\n getMcpSettings,\n setMcpEnabled as apiSetMcpEnabled,\n listMcpServers,\n upsertMcpServer,\n deleteMcpServer,\n probeMcpServer,\n grantStdioMcpTrust,\n revokeStdioMcpTrust,\n} from \"../lib/api-client\";\nimport type {\n McpServerConfig,\n McpServerStatus,\n McpSettingsResponse,\n} from \"../lib/api-client/types\";\n\nconst POLL_INTERVAL_MS = 30_000;\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction sameSettings(a: McpSettingsResponse | undefined, b: McpSettingsResponse): boolean {\n return a?.enabled === b.enabled && a.connected === b.connected && a.total === b.total;\n}\n\nfunction sameProjectData(a: McpProjectData | undefined, b: McpProjectData): boolean {\n return (\n a !== undefined &&\n stableJson(a.status) === stableJson(b.status) &&\n stableJson(a.stdioTrust) === stableJson(b.stdioTrust)\n );\n}\n\n/**\n * Module-level stable empty array. Zustand selectors compare return\n * values by reference; returning a fresh `[]` from a `useMcpStore(s\n * => ... ?? [])` selector triggers a re-render on every store update\n * (the new literal is a different reference even when the underlying\n * value didn't change), eventually crashing the React tree with\n * \"Maximum update depth exceeded.\"\n */\nexport const EMPTY_STATUS: McpServerStatus[] = [];\n\ninterface McpProjectData {\n status: McpServerStatus[];\n stdioTrust?: { trusted: boolean };\n}\n\ninterface McpState {\n settings: McpSettingsResponse | undefined;\n globalServers: Record<string, McpServerConfig>;\n globalStatus: McpServerStatus[];\n byProject: Record<string, McpProjectData>;\n loading: boolean;\n error: string | null;\n pollHandle: ReturnType<typeof setInterval> | undefined;\n\n startPolling: () => void;\n stopPolling: () => void;\n refreshSettings: () => Promise<void>;\n refreshProject: (projectId: string) => Promise<void>;\n setMcpEnabled: (enabled: boolean) => Promise<void>;\n upsertServer: (name: string, config: McpServerConfig) => Promise<void>;\n deleteServer: (name: string) => Promise<void>;\n probeServer: (name: string, projectId?: string) => Promise<void>;\n grantStdioTrust: (projectId: string) => Promise<void>;\n revokeStdioTrust: (projectId: string) => Promise<void>;\n}\n\nlet refreshInFlight = false;\n\nexport const useMcpStore = create<McpState>((set, get) => ({\n settings: undefined,\n globalServers: {},\n globalStatus: EMPTY_STATUS,\n byProject: {},\n loading: false,\n error: null,\n pollHandle: undefined,\n\n startPolling: () => {\n const h = setInterval(async () => {\n if (typeof document !== \"undefined\" && document.hidden) return;\n if (refreshInFlight) return;\n await get().refreshSettings();\n }, POLL_INTERVAL_MS);\n set({ pollHandle: h });\n get().refreshSettings();\n },\n\n stopPolling: () => {\n const h = get().pollHandle;\n if (h !== undefined) {\n clearInterval(h);\n set({ pollHandle: undefined });\n }\n },\n\n refreshSettings: async () => {\n if (refreshInFlight) return;\n refreshInFlight = true;\n try {\n const [settings, serversRes] = await Promise.all([\n getMcpSettings(),\n listMcpServers(),\n ]);\n set((state) => {\n const nextGlobalServers = serversRes.servers;\n const nextGlobalStatus = serversRes.status;\n const serversChanged = stableJson(state.globalServers) !== stableJson(nextGlobalServers);\n const statusChanged = stableJson(state.globalStatus) !== stableJson(nextGlobalStatus);\n const s = sameSettings(state.settings, settings);\n if (!serversChanged && !statusChanged && s) {\n return { loading: false, error: null };\n }\n return {\n settings,\n globalServers: nextGlobalServers,\n globalStatus: nextGlobalStatus,\n loading: false,\n error: null,\n };\n });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : \"Failed to load MCP settings\", loading: false });\n } finally {\n refreshInFlight = false;\n }\n },\n\n refreshProject: async (projectId: string) => {\n try {\n const res = await listMcpServers(projectId);\n const data: McpProjectData = { status: res.status, stdioTrust: res.stdioTrust };\n set((state) => {\n const existing = state.byProject[projectId];\n if (sameProjectData(existing, data)) return state;\n return {\n byProject: {\n ...state.byProject,\n [projectId]: data,\n },\n };\n });\n } catch {\n // silently ignore\n }\n },\n\n setMcpEnabled: async (enabled: boolean) => {\n const res = await apiSetMcpEnabled(enabled);\n set((state) => sameSettings(state.settings, res) ? state : { settings: res });\n },\n\n upsertServer: async (name: string, config: McpServerConfig) => {\n await upsertMcpServer(name, config);\n await get().refreshSettings();\n },\n\n deleteServer: async (name: string) => {\n await deleteMcpServer(name);\n await get().refreshSettings();\n },\n\n probeServer: async (name: string, projectId?: string) => {\n await probeMcpServer(name, projectId);\n if (projectId !== undefined) {\n await get().refreshProject(projectId);\n } else {\n await get().refreshSettings();\n }\n },\n\n grantStdioTrust: async (projectId: string) => {\n await grantStdioMcpTrust(projectId);\n await get().refreshProject(projectId);\n },\n\n revokeStdioTrust: async (projectId: string) => {\n await revokeStdioMcpTrust(projectId);\n await get().refreshProject(projectId);\n },\n}));\n","/**\n * SlidePanel — reusable overlay/modal shell for pi-kot panels.\n *\n * Three rendering modes determined by the props:\n * 1. **Simple** — pass `title` and `children`. Renders default header\n * (title + close button) in the `.settings-header` layout.\n * 2. **Custom header** — pass `header` instead of `title`. The entire\n * header area is replaced (you own the close button).\n * 3. **Right panel** — pass `side=\"right\"`. Slides in from the right\n * edge (for FileExplorer‑style layouts).\n *\n * Responsive: on ≤600px the overlay switches to a bottom‑sheet\n * presentation (`.settings-overlay` → `align-items: flex-end`,\n * `.settings-panel` → `sheetUp` animation). This is handled purely\n * in CSS so no JS breakpoint logic is needed.\n *\n * Includes Escape‑key dismiss and click‑outside‑to‑close.\n */\n\nimport { useEffect, useCallback, type ReactNode, type CSSProperties } from \"react\";\n\nexport type SlidePanelSide = \"center\" | \"right\";\n\ninterface SlidePanelProps {\n /** Whether the panel is visible */\n open: boolean;\n /** Called when the user closes (Escape / backdrop click / close button) */\n onClose: () => void;\n\n /** Simple header: string title with a default close button.\n * Ignored when `header` is also provided. */\n title?: string;\n\n /** Full custom header JSX. When set, `title` is ignored and\n * you must render your own close button (or wire one to `onClose`). */\n header?: ReactNode;\n\n /** Panel body content */\n children: ReactNode;\n\n /** Side from which the panel enters: \"center\" (modal, default)\n * or \"right\" (slide‑in panel, e.g. FileExplorer). */\n side?: SlidePanelSide;\n\n /** Desktop width override (e.g. 640, \"520px\") */\n width?: number | string;\n /** Desktop max‑width override */\n maxWidth?: number | string;\n\n /** Extra class name forwarded to the `.settings-panel` element */\n className?: string;\n /** Extra inline styles forwarded to the `.settings-panel` element */\n style?: CSSProperties;\n}\n\nexport function SlidePanel({\n open,\n onClose,\n title,\n header,\n children,\n side = \"center\",\n width,\n maxWidth,\n className = \"\",\n style,\n}: SlidePanelProps) {\n // Escape‑key dismiss\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose],\n );\n\n useEffect(() => {\n if (!open) return;\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, handleKeyDown]);\n\n if (!open) return null;\n\n // ── Right side panel (e.g. FileExplorer) ──\n if (side === \"right\") {\n return (\n <div className=\"slide-panel-overlay\" onClick={onClose} role=\"dialog\" aria-modal=\"true\">\n <div\n className={`slide-panel slide-panel--right ${className}`}\n style={{\n width: typeof width === \"number\" ? `${width}px` : width,\n maxWidth: typeof maxWidth === \"number\" ? `${maxWidth}px` : maxWidth,\n ...style,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </div>\n );\n }\n\n // ── Center modal (default) ──\n return (\n <div className=\"settings-overlay\" onClick={onClose} role=\"dialog\" aria-modal=\"true\">\n <div\n className={`settings-panel ${className}`}\n style={{\n width: typeof width === \"number\" ? `${width}px` : width,\n maxWidth: typeof maxWidth === \"number\" ? `${maxWidth}px` : maxWidth,\n ...style,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* ── Header ── */}\n {header !== undefined ? (\n header\n ) : (\n <header className=\"settings-header\">\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--text-primary)\",\n }}\n >\n {title}\n </span>\n <button type=\"button\" className=\"settings-close\" onClick={onClose}>\n ✕\n </button>\n </header>\n )}\n\n {/* ── Body ── */}\n <div className=\"settings-body\">{children}</div>\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useMcpStore } from \"../stores/mcp-store\";\nimport { listTools, setToolEnabled, listToolOverrides, clearToolProjectOverride, fetchProjects } from \"../lib/api-client\";\nimport type { McpServerConfig, McpServerStatus, ToolOverridesResponse } from \"../lib/api-client/types\";\nimport { SlidePanel } from \"./SlidePanel\";\n\nexport function MCPPanel({ onClose }: { onClose: () => void }) {\n const settings = useMcpStore((s) => s.settings);\n const globalServers = useMcpStore((s) => s.globalServers);\n const globalStatus = useMcpStore((s) => s.globalStatus);\n const loading = useMcpStore((s) => s.loading);\n const error = useMcpStore((s) => s.error);\n const startPolling = useMcpStore((s) => s.startPolling);\n const stopPolling = useMcpStore((s) => s.stopPolling);\n const setMcpEnabled = useMcpStore((s) => s.setMcpEnabled);\n const deleteServer = useMcpStore((s) => s.deleteServer);\n const probeServer = useMcpStore((s) => s.probeServer);\n const upsertServer = useMcpStore((s) => s.upsertServer);\n\n const [showAddForm, setShowAddForm] = useState(false);\n const [editingName, setEditingName] = useState<string | undefined>(undefined);\n const [probeLoading, setProbeLoading] = useState<string | null>(null);\n\n useEffect(() => {\n startPolling();\n return () => stopPolling();\n }, [startPolling, stopPolling]);\n\n\n\n const handleProbe = async (name: string) => {\n setProbeLoading(name);\n try {\n await probeServer(name);\n } finally {\n setProbeLoading(null);\n }\n };\n\n const handleToggleServer = async (name: string, next: boolean) => {\n const prev = globalServers[name];\n if (prev === undefined) return;\n await upsertServer(name, { ...prev, enabled: next });\n };\n\n const handleEdit = (name: string) => {\n setShowAddForm(false);\n setEditingName(name);\n };\n\n const handleAdd = () => {\n setEditingName(undefined);\n setShowAddForm(true);\n };\n\n const serverEntries = Object.entries(globalServers);\n\n return (\n <SlidePanel open onClose={onClose} title=\"MCP Settings\" style={{ maxWidth: \"520px\" }}>\n <div style={{ padding: \"12px 16px 16px\" }}>\n {error !== null && (\n <div className=\"mcp-error\">{error}</div>\n )}\n\n {loading && settings === undefined ? (\n <div style={{ padding: \"20px 0\", textAlign: \"center\", color: \"var(--text-dim)\", fontSize: \"12px\" }}>\n Loading MCP configuration...\n </div>\n ) : (\n <>\n <div className=\"settings-card\" style={{ marginBottom: \"10px\" }}>\n <div className=\"settings-card-header\">\n <span className=\"settings-section-title\" style={{ margin: 0 }}>Status</span>\n <label className=\"mcp-toggle\" style={{ cursor: \"pointer\" }}>\n <span\n className=\"mcp-toggle-track\"\n data-enabled={settings?.enabled ?? false}\n onClick={() => setMcpEnabled(!(settings?.enabled ?? false))}\n >\n <span className=\"mcp-toggle-thumb\" />\n </span>\n <span style={{ fontSize: \"12px\", color: \"var(--text-secondary)\" }}>\n {settings?.enabled ? \"Enabled\" : \"Disabled\"}\n </span>\n </label>\n </div>\n {settings !== undefined && (\n <div style={{ padding: \"0 12px 8px\", fontSize: \"12px\", color: \"var(--text-dim)\" }}>\n {settings.connected} / {settings.total} servers connected\n </div>\n )}\n </div>\n\n <div className=\"settings-card\" style={{ marginBottom: \"10px\" }}>\n <div className=\"settings-card-header\">\n <span className=\"settings-section-title\" style={{ margin: 0 }}>Servers</span>\n <button\n type=\"button\"\n className=\"mcp-add-btn\"\n onClick={() => editingName !== undefined ? setEditingName(undefined) : handleAdd()}\n title=\"Add server\"\n >\n +\n </button>\n </div>\n\n {(!showAddForm && editingName === undefined) && serverEntries.length === 0 ? (\n <div style={{ padding: \"12px\", textAlign: \"center\", fontSize: \"12px\", color: \"var(--text-dim)\" }}>\n No MCP servers configured\n </div>\n ) : (\n <div className=\"mcp-server-list\">\n {showAddForm && (\n <McpServerForm\n onSave={async (name, config) => {\n await upsertServer(name, config);\n setShowAddForm(false);\n }}\n onCancel={() => setShowAddForm(false)}\n />\n )}\n\n {editingName !== undefined && globalServers[editingName] !== undefined && (\n <McpServerForm\n key={editingName}\n initialName={editingName}\n initialConfig={globalServers[editingName]}\n isEditing\n onSave={async (_name, config) => {\n await upsertServer(editingName, config);\n setEditingName(undefined);\n }}\n onCancel={() => setEditingName(undefined)}\n />\n )}\n\n {serverEntries.map(([name]) => {\n const st = globalStatus.find((s) => s.name === name);\n return (\n <McpServerRow\n key={name}\n name={name}\n config={globalServers[name]}\n status={st}\n probeLoading={probeLoading === name}\n onToggle={(next) => handleToggleServer(name, next)}\n onEdit={() => handleEdit(name)}\n onProbe={() => handleProbe(name)}\n onDelete={() => deleteServer(name)}\n isEditing={editingName === name}\n />\n );\n })}\n {globalStatus\n .filter((s) => !globalServers[s.name])\n .map((st) => (\n <McpServerRow\n key={st.name}\n name={st.name}\n config={undefined}\n status={st}\n probeLoading={probeLoading === st.name}\n onProbe={() => handleProbe(st.name)}\n onDelete={() => deleteServer(st.name)}\n />\n ))}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n </SlidePanel>\n );\n}\n\nfunction McpServerRow({\n name,\n config,\n status,\n probeLoading,\n onToggle,\n onEdit,\n onProbe,\n onDelete,\n isEditing,\n}: {\n name: string;\n config: McpServerConfig | undefined;\n status: McpServerStatus | undefined;\n probeLoading: boolean;\n onToggle?: (enabled: boolean) => Promise<void>;\n onEdit?: () => void;\n onProbe: () => Promise<void>;\n onDelete: () => void;\n isEditing?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [tools, setTools] = useState<Array<{ name: string; shortName: string; description: string; enabled: boolean; globalEnabled: boolean; projectOverride?: \"enabled\" | \"disabled\" }> | null>(null);\n const [toolsLoading, setToolsLoading] = useState(false);\n const [togglingTools, setTogglingTools] = useState<Set<string>>(new Set());\n const [projectsList, setProjectsList] = useState<Array<{ id: string; name: string }>>([]);\n const [overridesData, setOverridesData] = useState<ToolOverridesResponse | null>(null);\n\n const serverEnabled = config?.enabled !== false;\n const effectiveState = serverEnabled ? (status?.state ?? \"idle\") : \"disabled\";\n\n const stateColor =\n effectiveState === \"connected\" ? \"var(--success)\" :\n effectiveState === \"connecting\" ? \"var(--warning)\" :\n effectiveState === \"error\" ? \"var(--error)\" :\n effectiveState === \"trust_required\" ? \"var(--warning)\" :\n effectiveState === \"disabled\" ? \"var(--text-dim)\" :\n \"var(--text-dim)\";\n\n const stateLabel =\n effectiveState === \"connected\" ? \"Connected\" :\n effectiveState === \"connecting\" ? \"Connecting...\" :\n effectiveState === \"error\" ? `Error${status?.lastError ? `: ${status.lastError}` : \"\"}` :\n effectiveState === \"disabled\" ? (serverEnabled ? \"Disabled\" : \"Disabled\") :\n effectiveState === \"trust_required\" ? \"Trust Required\" :\n effectiveState === \"idle\" ? \"Idle\" :\n status !== undefined ? status.state : \"—\";\n\n const kindLabel = status?.kind ?? \"—\";\n\n const loadTools = useCallback(async () => {\n setToolsLoading(true);\n try {\n const [listing, overrides, projRes] = await Promise.all([\n listTools(),\n listToolOverrides(),\n fetchProjects(),\n ]);\n setOverridesData(overrides);\n setProjectsList(projRes.projects.map((p) => ({ id: p.id, name: p.name })));\n const srv = listing.mcp.find((s) => s.server === name);\n setTools(srv?.tools.map((t) => ({ name: t.name, shortName: t.shortName, description: t.description, enabled: t.enabled, globalEnabled: t.globalEnabled, projectOverride: t.projectOverride })) ?? []);\n } catch (err) {\n console.warn(\"loadTools failed:\", err);\n setTools([]);\n } finally {\n setToolsLoading(false);\n }\n }, [name]);\n\n const toggleToolGlobal = async (bridgedName: string, nextEnabled: boolean) => {\n setTogglingTools((prev) => new Set(prev).add(bridgedName));\n try {\n await setToolEnabled(\"mcp\", bridgedName, nextEnabled, { scope: \"global\" });\n setTools((prev) => prev?.map((t) => t.name === bridgedName ? { ...t, enabled: nextEnabled, globalEnabled: nextEnabled } : t) ?? null);\n } finally {\n setTogglingTools((prev) => { const next = new Set(prev); next.delete(bridgedName); return next; });\n }\n };\n\n const setProjectToolOverride = async (bridgedName: string, projectId: string, state: \"enabled\" | \"disabled\" | undefined) => {\n const key = `proj:${projectId}:${bridgedName}`;\n setTogglingTools((prev) => new Set(prev).add(key));\n try {\n if (state === undefined) {\n await clearToolProjectOverride(\"mcp\", bridgedName, projectId);\n } else {\n await setToolEnabled(\"mcp\", bridgedName, state === \"enabled\", { scope: \"project\", projectId });\n }\n await loadTools();\n } finally {\n setTogglingTools((prev) => { const next = new Set(prev); next.delete(key); return next; });\n }\n };\n\n const handleExpand = () => {\n const next = !expanded;\n setExpanded(next);\n if (next) loadTools();\n };\n\n const handleProbeAndReload = async () => {\n setToolsLoading(true);\n try {\n await onProbe();\n const [listing, overrides, projRes] = await Promise.all([\n listTools(),\n listToolOverrides(),\n fetchProjects(),\n ]);\n setOverridesData(overrides);\n setProjectsList(projRes.projects.map((p) => ({ id: p.id, name: p.name })));\n const srv = listing.mcp.find((s) => s.server === name);\n setTools(srv?.tools.map((t) => ({ name: t.name, shortName: t.shortName, description: t.description, enabled: t.enabled, globalEnabled: t.globalEnabled, projectOverride: t.projectOverride })) ?? []);\n } catch (err) {\n console.warn(\"reload after probe failed:\", err);\n setTools([]);\n } finally {\n setToolsLoading(false);\n }\n };\n\n const expandable = status !== undefined;\n const isDisabled = effectiveState === \"disabled\";\n\n return (\n <div className=\"mcp-server-item\" onClick={expandable ? handleExpand : undefined}>\n <div className=\"mcp-server-header\" style={isEditing ? { opacity: 0.5, pointerEvents: \"none\" } : undefined}>\n <span className=\"mcp-server-chevron\">{expanded ? \"▾\" : \"▸\"}</span>\n <span className=\"mcp-server-state-dot\" style={{ background: stateColor }} />\n <span className=\"mcp-server-name\">{name}</span>\n {config !== undefined && (\n <span className=\"mcp-server-badge\" style={{ fontSize: \"10px\", color: serverEnabled ? \"var(--text-secondary)\" : \"var(--text-dim)\" }}>\n {serverEnabled ? \"Enabled\" : \"Disabled\"}\n </span>\n )}\n <span className=\"mcp-server-badge\" data-kind={kindLabel}>{kindLabel}</span>\n {status !== undefined && (\n <span className=\"mcp-server-tools\">{status.toolCount} tools</span>\n )}\n </div>\n\n {expanded && !isEditing && (\n <div className=\"mcp-server-details\" onClick={(e) => e.stopPropagation()}>\n <div className=\"mcp-server-meta\" style={{ fontSize: \"11px\", color: \"var(--text-dim)\", paddingBottom: \"6px\" }}>\n <span style={{ color: stateColor, fontWeight: 600 }}>{stateLabel}</span>\n {status?.url !== undefined && <span style={{ marginLeft: \"8px\" }}>{status.url}</span>}\n {status?.command !== undefined && <span style={{ marginLeft: \"8px\" }}>{status.command} {(status.args ?? []).slice(0, 2).join(\" \")}</span>}\n </div>\n\n {toolsLoading ? (\n <div style={{ fontSize: \"11px\", color: \"var(--text-dim)\", padding: \"4px 0\" }}>Loading tools...</div>\n ) : tools !== null && tools.length > 0 ? (\n <div className=\"mcp-tools-list\">\n <div className=\"mcp-tools-header\">Tools</div>\n {tools.map((t) => (\n <ToolCascadeRow\n key={t.name}\n family=\"mcp\"\n name={t.shortName}\n fqn={t.name}\n description={t.description}\n enabled={t.enabled}\n globalEnabled={t.globalEnabled}\n projectOverride={t.projectOverride}\n projectsList={projectsList}\n overridesData={overridesData}\n busy={togglingTools.has(t.name)}\n onToggleGlobal={(next) => toggleToolGlobal(t.name, next)}\n onSetProjectOverride={(pid, state) => setProjectToolOverride(t.name, pid, state)}\n />\n ))}\n </div>\n ) : tools !== null ? (\n <div style={{ fontSize: \"11px\", color: \"var(--text-dim)\", padding: \"4px 0\" }}>No tools available</div>\n ) : null}\n\n <div className=\"mcp-server-actions\" style={{ marginTop: \"6px\", display: \"flex\", gap: \"4px\", flexWrap: \"wrap\" }}>\n {onToggle !== undefined && (\n <button\n type=\"button\"\n className={`mcp-action-btn ${serverEnabled ? \"\" : \"mcp-action-btn-danger\"}`}\n onClick={() => onToggle(!serverEnabled)}\n >\n {serverEnabled ? \"Disable\" : \"Enable\"}\n </button>\n )}\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n onClick={handleProbeAndReload}\n disabled={probeLoading || isDisabled}\n >\n {probeLoading ? \"Probing...\" : \"Probe\"}\n </button>\n {onEdit !== undefined && (\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n onClick={(e) => { e.stopPropagation(); onEdit(); }}\n >\n Edit\n </button>\n )}\n <button\n type=\"button\"\n className=\"mcp-action-btn mcp-action-btn-danger\"\n onClick={(e) => { e.stopPropagation(); onDelete(); }}\n >\n Remove\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nconst SECRET_PLACEHOLDER = \"***REDACTED***\";\n\nfunction McpServerForm({\n initialName,\n initialConfig,\n isEditing,\n onSave,\n onCancel,\n}: {\n initialName?: string;\n initialConfig?: McpServerConfig;\n isEditing?: boolean;\n onSave: (name: string, config: McpServerConfig) => Promise<void>;\n onCancel: () => void;\n}) {\n const isStdio = initialConfig !== undefined\n ? typeof initialConfig.command === \"string\" && initialConfig.command.length > 0\n : false;\n\n const [name, setName] = useState(initialName ?? \"\");\n const [kind, setKind] = useState<\"remote\" | \"stdio\">(isStdio ? \"stdio\" : \"remote\");\n const [enabled, setEnabled] = useState(initialConfig?.enabled !== false);\n const [url, setUrl] = useState(initialConfig?.url ?? \"\");\n const [transport, setTransport] = useState(initialConfig?.transport ?? \"auto\");\n const [command, setCommand] = useState(initialConfig?.command ?? \"\");\n const [args, setArgs] = useState((initialConfig?.args ?? []).join(\" \"));\n const [cwd, setCwd] = useState(initialConfig?.cwd ?? \"\");\n const [envEntries, setEnvEntries] = useState<{ key: string; value: string }[]>(\n Object.entries(initialConfig?.env ?? {}).map(([k, v]) => ({ key: k, value: v }))\n );\n const [headersEntries, setHeadersEntries] = useState<{ key: string; value: string }[]>(\n Object.entries(initialConfig?.headers ?? {}).map(([k, v]) => ({ key: k, value: v }))\n );\n const [saving, setSaving] = useState(false);\n const [formError, setFormError] = useState<string | null>(null);\n\n const handleSave = async () => {\n setFormError(null);\n const trimmedName = name.trim();\n if (trimmedName.length === 0) {\n setFormError(\"Server name is required\");\n return;\n }\n\n const config: McpServerConfig = { enabled };\n\n if (kind === \"remote\") {\n if (url.trim().length === 0) {\n setFormError(\"URL is required for remote servers\");\n return;\n }\n config.url = url.trim();\n config.transport = transport as \"auto\" | \"streamable-http\" | \"sse\";\n const hdrs: Record<string, string> = {};\n for (const e of headersEntries) {\n if (e.key.trim().length > 0) hdrs[e.key.trim()] = e.value;\n }\n if (Object.keys(hdrs).length > 0) config.headers = hdrs;\n } else {\n if (command.trim().length === 0) {\n setFormError(\"Command is required for stdio servers\");\n return;\n }\n config.command = command.trim();\n if (args.trim().length > 0) {\n config.args = args.split(\" \").filter(Boolean);\n }\n if (cwd.trim().length > 0) config.cwd = cwd.trim();\n const env: Record<string, string> = {};\n for (const e of envEntries) {\n if (e.key.trim().length > 0) env[e.key.trim()] = e.value;\n }\n if (Object.keys(env).length > 0) config.env = env;\n }\n\n setSaving(true);\n try {\n await onSave(trimmedName, config);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : \"Failed to save server\");\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <div className=\"mcp-form\" onClick={(e) => e.stopPropagation()}>\n <div className=\"mcp-form-row\">\n <label className=\"mcp-form-label\">Name</label>\n <input\n className=\"mcp-form-input\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"my-mcp-server\"\n disabled={isEditing}\n style={isEditing ? { opacity: 0.6 } : undefined}\n />\n </div>\n <div className=\"mcp-form-row\">\n <label className=\"mcp-form-label\">Type</label>\n <select\n className=\"mcp-form-select\"\n value={kind}\n onChange={(e) => setKind(e.target.value as \"remote\" | \"stdio\")}\n disabled={isEditing}\n style={isEditing ? { opacity: 0.6 } : undefined}\n >\n <option value=\"stdio\">stdio</option>\n <option value=\"remote\">Remote URL</option>\n </select>\n {isEditing && (\n <span style={{ fontSize: \"10px\", color: \"var(--text-dim)\", marginLeft: \"6px\" }}>\n (locked while editing)\n </span>\n )}\n </div>\n <div className=\"mcp-form-row\">\n <label className=\"mcp-form-label\">Enabled</label>\n <label className=\"mcp-form-checkbox-label\" style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => setEnabled(e.target.checked)}\n />\n <span style={{ fontSize: \"11px\", color: \"var(--text-secondary)\" }}>\n Disabled servers don't connect or contribute tools\n </span>\n </label>\n </div>\n {kind === \"remote\" ? (\n <>\n <div className=\"mcp-form-row\">\n <label className=\"mcp-form-label\">URL</label>\n <input\n className=\"mcp-form-input\"\n type=\"text\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"http://localhost:8080/mcp\"\n />\n </div>\n <div className=\"mcp-form-row\">\n <label className=\"mcp-form-label\">Transport</label>\n <select\n className=\"mcp-form-select\"\n value={transport}\n onChange={(e) => setTransport(e.target.value as \"auto\" | \"streamable-http\" | \"sse\")}\n >\n <option value=\"auto\">Auto</option>\n <option value=\"streamable-http\">Streamable HTTP</option>\n <option value=\"sse\">SSE</option>\n </select>\n </div>\n <div className=\"mcp-form-section-label\">Headers</div>\n {headersEntries.map((entry, i) => (\n <div key={i} className=\"mcp-form-row mcp-form-row-inline\">\n <input\n className=\"mcp-form-input mcp-form-input-half\"\n type=\"text\"\n value={entry.key}\n onChange={(e) => {\n const next = [...headersEntries];\n next[i] = { ...next[i], key: e.target.value };\n setHeadersEntries(next);\n }}\n placeholder=\"Authorization\"\n />\n <input\n className=\"mcp-form-input mcp-form-input-half\"\n type={entry.value === SECRET_PLACEHOLDER ? \"text\" : \"password\"}\n value={entry.value === SECRET_PLACEHOLDER ? \"\" : entry.value}\n onChange={(e) => {\n const next = [...headersEntries];\n next[i] = { ...next[i], value: e.target.value };\n setHeadersEntries(next);\n }}\n placeholder={entry.value === SECRET_PLACEHOLDER ? \"leave blank to keep stored value\" : \"Bearer ...\"}\n />\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n onClick={() => setHeadersEntries(headersEntries.filter((_, j) => j !== i))}\n >\n ✕\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n style={{ alignSelf: \"flex-start\" }}\n onClick={() => setHeadersEntries([...headersEntries, { key: \"\", value: \"\" }])}\n >\n + Header\n </button>\n </>\n ) : (\n <>\n <div className=\"mcp-form-row\">\n <label className=\"mcp-form-label\">Command</label>\n <input\n className=\"mcp-form-input\"\n type=\"text\"\n value={command}\n onChange={(e) => setCommand(e.target.value)}\n placeholder=\"npx\"\n />\n </div>\n <div className=\"mcp-form-row\">\n <label className=\"mcp-form-label\">Args</label>\n <input\n className=\"mcp-form-input\"\n type=\"text\"\n value={args}\n onChange={(e) => setArgs(e.target.value)}\n placeholder=\"-y @modelcontextprotocol/server-filesystem /path\"\n />\n </div>\n <div className=\"mcp-form-row\">\n <label className=\"mcp-form-label\">Working Directory</label>\n <input\n className=\"mcp-form-input\"\n type=\"text\"\n value={cwd}\n onChange={(e) => setCwd(e.target.value)}\n placeholder=\"/absolute/path (optional)\"\n />\n </div>\n <div className=\"mcp-form-section-label\">Environment Variables</div>\n {envEntries.map((entry, i) => (\n <div key={i} className=\"mcp-form-row mcp-form-row-inline\">\n <input\n className=\"mcp-form-input mcp-form-input-half\"\n type=\"text\"\n value={entry.key}\n onChange={(e) => {\n const next = [...envEntries];\n next[i] = { ...next[i], key: e.target.value };\n setEnvEntries(next);\n }}\n placeholder=\"MY_VAR\"\n />\n <input\n className=\"mcp-form-input mcp-form-input-half\"\n type={entry.value === SECRET_PLACEHOLDER ? \"text\" : \"password\"}\n value={entry.value === SECRET_PLACEHOLDER ? \"\" : entry.value}\n onChange={(e) => {\n const next = [...envEntries];\n next[i] = { ...next[i], value: e.target.value };\n setEnvEntries(next);\n }}\n placeholder={entry.value === SECRET_PLACEHOLDER ? \"leave blank to keep stored value\" : \"value\"}\n />\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n onClick={() => setEnvEntries(envEntries.filter((_, j) => j !== i))}\n >\n ✕\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n style={{ alignSelf: \"flex-start\" }}\n onClick={() => setEnvEntries([...envEntries, { key: \"\", value: \"\" }])}\n >\n + Env Var\n </button>\n </>\n )}\n {formError !== null && <div className=\"mcp-form-error\">{formError}</div>}\n <div className=\"mcp-form-actions\">\n <button type=\"button\" className=\"mcp-action-btn\" onClick={onCancel}>Cancel</button>\n <button type=\"button\" className=\"mcp-action-btn mcp-action-btn-primary\" onClick={handleSave} disabled={saving}>\n {saving ? \"Saving...\" : isEditing ? \"Save changes\" : \"Save\"}\n </button>\n </div>\n </div>\n );\n}\n\n// ── ToolCascadeRow ──────────────────────────────────────────────────────────\n\ninterface ToolCascadeRowProps {\n family: \"builtin\" | \"mcp\" | \"extension\";\n name: string;\n fqn: string;\n description: string;\n enabled: boolean;\n globalEnabled: boolean;\n projectOverride?: \"enabled\" | \"disabled\";\n projectsList: Array<{ id: string; name: string }>;\n overridesData: ToolOverridesResponse | null;\n busy: boolean;\n onToggleGlobal: (next: boolean) => void;\n onSetProjectOverride: (projectId: string, state: \"enabled\" | \"disabled\" | undefined) => void;\n}\n\nfunction ToolCascadeRow({\n family,\n name,\n fqn,\n description,\n enabled,\n globalEnabled,\n projectOverride,\n projectsList,\n overridesData,\n busy,\n onToggleGlobal,\n onSetProjectOverride,\n}: ToolCascadeRowProps) {\n const [showOverrides, setShowOverrides] = useState(false);\n\n const existingOverrideProjects = overridesData !== null\n ? Object.entries(overridesData.projects)\n .filter(([, ov]) => {\n const arr = ov[family];\n return arr.enable.includes(fqn) || arr.disable.includes(fqn);\n })\n .map(([pid]) => pid)\n : [];\n\n const availableForOverride = projectsList.filter(\n (p) => !existingOverrideProjects.includes(p.id),\n );\n\n return (\n <div className=\"mcp-tool-row\" style={{ flexDirection: \"column\", alignItems: \"stretch\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\", width: \"100%\" }}>\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: enabled ? \"var(--success, #22c55e)\" : \"var(--text-dim)\",\n flexShrink: 0,\n }}\n />\n <div className=\"mcp-tool-info\" style={{ flex: 1, minWidth: 0 }}>\n <span className=\"mcp-tool-name\">{name}</span>\n <span className=\"mcp-tool-fqn\">{fqn}</span>\n {description !== \"\" && <span className=\"mcp-tool-desc\">{description}</span>}\n </div>\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n style={{ fontSize: \"10px\", padding: \"2px 6px\" }}\n disabled={busy}\n onClick={() => onToggleGlobal(!globalEnabled)}\n >\n {busy ? \"...\" : globalEnabled ? \"Global: enabled\" : \"Global: disabled\"}\n </button>\n {projectsList.length > 0 && (\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n style={{ fontSize: \"10px\", padding: \"2px 6px\" }}\n onClick={() => setShowOverrides(!showOverrides)}\n >\n {showOverrides ? \"▴\" : \"▾\"} Overrides ({existingOverrideProjects.length})\n </button>\n )}\n </div>\n\n {showOverrides && (\n <div style={{ paddingLeft: \"20px\", paddingTop: \"6px\" }}>\n {existingOverrideProjects.map((pid) => {\n const proj = projectsList.find((p) => p.id === pid);\n const ov = overridesData?.projects[pid]?.[family];\n const currentState: \"enabled\" | \"disabled\" | undefined =\n ov?.enable.includes(fqn) ? \"enabled\" :\n ov?.disable.includes(fqn) ? \"disabled\" :\n undefined;\n return (\n <div key={pid} style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\", marginBottom: \"4px\" }}>\n <span style={{ fontSize: \"11px\", color: \"var(--text-secondary)\", minWidth: \"80px\" }}>\n {proj?.name ?? pid}\n </span>\n <TriStatePicker\n value={currentState}\n disabled={busy}\n onChange={(state) => onSetProjectOverride(pid, state)}\n />\n </div>\n );\n })}\n {availableForOverride.length > 0 && (\n <AddOverrideDropdown\n projects={availableForOverride}\n busy={busy}\n onSet={(pid, state) => onSetProjectOverride(pid, state)}\n />\n )}\n {existingOverrideProjects.length === 0 && availableForOverride.length === 0 && (\n <span style={{ fontSize: \"11px\", color: \"var(--text-dim)\" }}>No projects configured</span>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ── TriStatePicker ──────────────────────────────────────────────────────────\n\ninterface TriStatePickerProps {\n value: \"enabled\" | \"disabled\" | undefined;\n disabled: boolean;\n onChange: (state: \"enabled\" | \"disabled\" | undefined) => void;\n}\n\nfunction TriStatePicker({ value, disabled, onChange }: TriStatePickerProps) {\n const states = [\n { label: \"Inherit\", state: undefined as \"enabled\" | \"disabled\" | undefined },\n { label: \"Enabled\", state: \"enabled\" as \"enabled\" | \"disabled\" | undefined },\n { label: \"Disabled\", state: \"disabled\" as \"enabled\" | \"disabled\" | undefined },\n ];\n\n return (\n <div className=\"mcp-tristate\" style={{ display: \"inline-flex\", borderRadius: \"4px\", overflow: \"hidden\", border: \"1px solid var(--border, #333)\" }}>\n {states.map((s) => {\n const active = value === s.state;\n const bg =\n active && s.state === \"enabled\" ? \"var(--success, #22c55e)\" :\n active && s.state === \"disabled\" ? \"var(--error, #ef4444)\" :\n active ? \"var(--bg-tertiary, #333)\" :\n \"transparent\";\n return (\n <button\n key={s.label}\n type=\"button\"\n disabled={disabled}\n style={{\n padding: \"2px 8px\",\n fontSize: \"10px\",\n border: \"none\",\n borderRight: \"1px solid var(--border, #333)\",\n cursor: disabled ? \"default\" : \"pointer\",\n background: bg,\n color: active ? \"#fff\" : \"var(--text-secondary)\",\n fontWeight: active ? 600 : 400,\n }}\n onClick={() => onChange(s.state)}\n >\n {s.label}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ── AddOverrideDropdown ─────────────────────────────────────────────────────\n\ninterface AddOverrideDropdownProps {\n projects: Array<{ id: string; name: string }>;\n busy: boolean;\n onSet: (projectId: string, state: \"enabled\" | \"disabled\") => void;\n}\n\nfunction AddOverrideDropdown({ projects, busy, onSet }: AddOverrideDropdownProps) {\n const [open, setOpen] = useState(false);\n const [selected, setSelected] = useState(projects[0]?.id ?? \"\");\n\n if (projects.length === 0) return null;\n\n return (\n <div style={{ marginTop: \"4px\" }}>\n {!open ? (\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n style={{ fontSize: \"10px\", padding: \"2px 6px\" }}\n onClick={() => setOpen(true)}\n >\n + Add override for…\n </button>\n ) : (\n <div className=\"mcp-override-form\" style={{ display: \"flex\", alignItems: \"center\", gap: \"4px\", flexWrap: \"wrap\" }}>\n <select\n className=\"mcp-form-select mcp-override-select\"\n style={{ fontSize: \"10px\", padding: \"2px 4px\", maxWidth: \"160px\" }}\n value={selected}\n onChange={(e) => setSelected(e.target.value)}\n >\n {projects.map((p) => (\n <option key={p.id} value={p.id}>{p.name}</option>\n ))}\n </select>\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n style={{ fontSize: \"10px\", padding: \"2px 6px\" }}\n disabled={busy || selected.length === 0}\n onClick={() => { onSet(selected, \"enabled\"); setOpen(false); }}\n >\n Enable here\n </button>\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n style={{ fontSize: \"10px\", padding: \"2px 6px\" }}\n disabled={busy || selected.length === 0}\n onClick={() => { onSet(selected, \"disabled\"); setOpen(false); }}\n >\n Disable here\n </button>\n <button\n type=\"button\"\n className=\"mcp-action-btn\"\n style={{ fontSize: \"10px\", padding: \"2px 6px\" }}\n onClick={() => setOpen(false)}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { SlidePanel } from \"./SlidePanel\";\nimport {\n getSessionTree,\n navigateSession,\n forkSession as forkSessionAPI,\n type SessionTreeEntry,\n type SessionTreeResponse,\n} from \"../lib/api-client\";\nimport { useSessionStore } from \"../stores/session-store\";\n\n/**\n * Session Tree Panel — modal overlay showing branching conversation history.\n *\n * Two views:\n * - List: indented vertical list with role badges\n * - Graph: branching graph with connected columns\n *\n * Actions per entry:\n * - Navigate: click to move the session leaf to this entry (in-place)\n * - Fork: create a new session from this entry\n */\n\ninterface Props {\n sessionId: string;\n projectId: string;\n open: boolean;\n onClose: () => void;\n}\n\ninterface NodeView extends SessionTreeEntry {\n depth: number;\n branchLevel: number;\n onActivePath: boolean;\n isLeaf: boolean;\n siblings: number;\n isBranchHead: boolean;\n}\n\nconst MODEL_KEY_PREFIX = \"pi-kot/model/\";\n\nexport function SessionTreePanel({ sessionId, projectId, open, onClose }: Props) {\n const isStreaming = useSessionStore((s) => s.streamState.isStreaming);\n const setActiveSession = useSessionStore((s) => s.setActiveSession);\n const loadProjectSessions = useSessionStore((s) => s.loadProjectSessions);\n const refreshSessions = useSessionStore((s) => s.refreshSessions);\n const reloadMessages = useSessionStore((s) => s.reloadMessages);\n\n const [tree, setTree] = useState<SessionTreeResponse | undefined>(undefined);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n const [showConfirm, setShowConfirm] = useState<{\n entryId: string;\n abandons: boolean;\n streaming: boolean;\n } | undefined>(undefined);\n\n const refresh = async () => {\n setLoading(true);\n setError(undefined);\n try {\n const t = await getSessionTree(sessionId);\n setTree(t);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load tree\");\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n void refresh();\n }, [sessionId]);\n\n // Auto-refresh every 5 seconds while streaming\n useEffect(() => {\n if (!isStreaming) return;\n const id = setInterval(() => void refresh(), 5000);\n return () => clearInterval(id);\n }, [isStreaming, sessionId]);\n\n const nodes = useMemo(() => {\n if (tree === undefined) return [];\n return flattenTree(tree);\n }, [tree]);\n\n const navigate = (entryId: string) => {\n if (busy || tree === undefined) return;\n if (tree.leafId === entryId) return;\n const abandons = tree.leafId !== null && currentLeafAbandonedBy(tree, entryId);\n if (isStreaming || abandons) {\n setShowConfirm({ entryId, abandons, streaming: isStreaming });\n return;\n }\n void executeNavigate(entryId, {});\n };\n\n const executeNavigate = async (\n entryId: string,\n opts: { summarize?: boolean; customInstructions?: string; label?: string },\n ): Promise<void> => {\n setBusy(true);\n setError(undefined);\n try {\n await navigateSession(sessionId, entryId, opts);\n // Refresh tree + reload messages in-place.\n // Do NOT close the panel or re-activate the session — that\n // would reconnect SSE unnecessarily and can make it look like\n // a new session appeared in the sidebar.\n await refresh();\n await reloadMessages(sessionId);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Navigate failed\");\n } finally {\n setBusy(false);\n }\n };\n\n const fork = async (\n entryId: string,\n opts: { editDraft?: string; parentId?: string | null } = {},\n ) => {\n if (busy) return;\n setBusy(true);\n setError(undefined);\n try {\n const forkAt =\n opts.parentId !== undefined && opts.parentId !== null ? opts.parentId : entryId;\n const forked = await forkSessionAPI(sessionId, forkAt);\n // Carry the per-session model choice across the fork\n try {\n const sourceModel = localStorage.getItem(MODEL_KEY_PREFIX + sessionId);\n if (sourceModel !== null && sourceModel.length > 0) {\n localStorage.setItem(MODEL_KEY_PREFIX + forked.sessionId, sourceModel);\n }\n } catch {\n // private-mode storage failure\n }\n await loadProjectSessions(projectId);\n setActiveSession(forked.sessionId);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Fork failed\");\n setBusy(false);\n }\n };\n\n const [view, setView] = useState<\"list\" | \"graph\">(\"list\");\n\n return (\n <SlidePanel\n open={open}\n onClose={onClose}\n header={\n <header className=\"settings-header\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span style={{ fontSize: \"13px\", color: \"var(--text-dim)\" }}>🌿</span>\n <span style={{ fontSize: \"13px\", fontWeight: 600, color: \"var(--text-primary)\" }}>\n Session Tree\n </span>\n {busy && <span style={{ fontSize: \"11px\", color: \"var(--text-dim)\" }}>working...</span>}\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n <div\n style={{\n display: \"flex\",\n overflow: \"hidden\",\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid var(--border)\",\n }}\n >\n <button\n onClick={() => setView(\"list\")}\n style={{\n padding: \"2px 10px\",\n fontSize: \"10px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n border: \"none\",\n background: view === \"list\" ? \"var(--bg-glass-strong)\" : \"transparent\",\n color: view === \"list\" ? \"var(--text-primary)\" : \"var(--text-dim)\",\n cursor: \"pointer\",\n }}\n >\n List\n </button>\n <button\n onClick={() => setView(\"graph\")}\n style={{\n padding: \"2px 10px\",\n fontSize: \"10px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n border: \"none\",\n background: view === \"graph\" ? \"var(--bg-glass-strong)\" : \"transparent\",\n color: view === \"graph\" ? \"var(--text-primary)\" : \"var(--text-dim)\",\n cursor: \"pointer\",\n }}\n >\n Graph\n </button>\n </div>\n <button\n onClick={() => void refresh()}\n disabled={loading || busy}\n className=\"settings-close\"\n title=\"Refresh\"\n style={{ fontSize: \"13px\" }}\n >\n ↻\n </button>\n <button\n onClick={onClose}\n className=\"settings-close\"\n title=\"Close\"\n >\n ✕\n </button>\n </div>\n </header>\n }\n style={{ width: 640, maxWidth: \"92vw\", maxHeight: \"80vh\" }}\n >\n {/* Error */}\n {error !== undefined && (\n <div className=\"settings-error\">\n {error}\n </div>\n )}\n\n {/* Body wrapper for padding */}\n <div style={{ padding: \"12px\" }}>\n {loading && tree === undefined && (\n <div style={{ textAlign: \"center\", padding: \"24px\", color: \"var(--text-dim)\", fontSize: \"12px\" }}>\n Loading tree…\n </div>\n )}\n {!loading && nodes.length === 0 && (\n <div style={{ textAlign: \"center\", padding: \"24px\", color: \"var(--text-dim)\", fontSize: \"12px\" }}>\n No entries yet.\n </div>\n )}\n {view === \"list\" && nodes.length > 0 && (\n <ul style={{ listStyle: \"none\", padding: 0, margin: 0 }}>\n {nodes.map((n) => (\n <TreeRow\n key={n.id}\n node={n}\n disabled={busy}\n onNavigate={() => navigate(n.id)}\n onFork={() =>\n fork(n.id, {\n ...(n.type === \"message\" && n.role === \"user\"\n ? { editDraft: n.preview ?? \"\", parentId: n.parentId }\n : {}),\n })\n }\n />\n ))}\n </ul>\n )}\n {view === \"graph\" && tree !== undefined && (\n <SessionTreeGraph\n tree={tree}\n disabled={busy}\n onNavigate={(id) => navigate(id)}\n onForkAfterTurn={(lastEntryId) => fork(lastEntryId)}\n />\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 16px\",\n borderTop: \"1px solid var(--border)\",\n fontSize: \"10px\",\n color: \"var(--text-dim)\",\n }}\n >\n <span>Click a row to navigate · ↻ on user messages to fork</span>\n {tree !== undefined && (\n <span>{tree.entries.length} {tree.entries.length === 1 ? \"entry\" : \"entries\"}</span>\n )}\n </div>\n\n {/* Confirm dialog */}\n {showConfirm !== undefined && (\n <NavigateConfirmDialog\n state={showConfirm}\n onCancel={() => setShowConfirm(undefined)}\n onConfirm={(opts) => {\n const entryId = showConfirm.entryId;\n setShowConfirm(undefined);\n void executeNavigate(entryId, opts);\n }}\n />\n )}\n </SlidePanel>\n );\n}\n\n/* ── Navigate Confirm Dialog ── */\n\ninterface ConfirmState {\n entryId: string;\n abandons: boolean;\n streaming: boolean;\n}\n\nfunction NavigateConfirmDialog({\n state,\n onCancel,\n onConfirm,\n}: {\n state: ConfirmState;\n onCancel: () => void;\n onConfirm: (opts: { summarize?: boolean; customInstructions?: string; label?: string }) => void;\n}) {\n const [label, setLabel] = useState(\"\");\n const [summarize, setSummarize] = useState(false);\n const [customInstructions, setCustomInstructions] = useState(\"\");\n\n const dialogStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 1100,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.5)\",\n padding: \"16px\",\n };\n\n const panelStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n width: state.abandons ? \"440px\" : \"360px\",\n borderRadius: \"var(--radius)\",\n border: \"1px solid var(--tool-border)\",\n background: \"var(--bg-frosted)\",\n backdropFilter: \"blur(var(--blur-heavy))\",\n padding: \"16px\",\n gap: \"12px\",\n };\n\n return (\n <div style={dialogStyle} onClick={onCancel}>\n <div style={panelStyle} onClick={(e) => e.stopPropagation()}>\n <div style={{ fontSize: \"13px\", fontWeight: 600, color: \"var(--text-primary)\" }}>\n Navigate session leaf\n </div>\n\n {state.streaming && (\n <div\n style={{\n padding: \"6px 10px\",\n fontSize: \"11px\",\n borderRadius: \"var(--radius-sm)\",\n background: \"color-mix(in srgb, var(--warning, #fbbf24) 10%, transparent)\",\n border: \"1px solid color-mix(in srgb, var(--warning, #fbbf24) 30%, transparent)\",\n color: \"var(--warning)\",\n }}\n >\n The agent is currently running. Navigating will abort the in-progress turn.\n </div>\n )}\n\n {state.abandons && (\n <>\n <p style={{ fontSize: \"11px\", color: \"var(--text-secondary)\", margin: 0 }}>\n You’re leaving the current branch behind. You can bookmark or summarize it.\n </p>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}>\n <span style={{ fontSize: \"11px\", color: \"var(--text-dim)\" }}>\n Label for the abandoned branch <span style={{ opacity: 0.5 }}>(optional)</span>\n </span>\n <input\n type=\"text\"\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"e.g. wrong-approach\"\n maxLength={200}\n style={{\n padding: \"6px 8px\",\n fontSize: \"11px\",\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid var(--border)\",\n background: \"var(--bg-solid)\",\n color: \"var(--text-primary)\",\n outline: \"none\",\n }}\n />\n </label>\n <label\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n padding: \"8px\",\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid var(--tool-border)\",\n background: \"var(--bg-solid)\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={summarize}\n onChange={(e) => setSummarize(e.target.checked)}\n style={{ marginTop: \"2px\" }}\n />\n <span style={{ fontSize: \"11px\", color: \"var(--text-secondary)\", flex: 1 }}>\n Have pi write a <code style={{ fontSize: \"10px\" }}>branch_summary</code> entry\n capturing what this branch did.\n </span>\n </label>\n {summarize && (\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}>\n <span style={{ fontSize: \"11px\", color: \"var(--text-dim)\" }}>\n Custom instructions <span style={{ opacity: 0.5 }}>(optional)</span>\n </span>\n <textarea\n value={customInstructions}\n onChange={(e) => setCustomInstructions(e.target.value)}\n rows={3}\n placeholder=\"e.g. Focus on what files were changed\"\n style={{\n padding: \"6px 8px\",\n fontSize: \"11px\",\n fontFamily: \"monospace\",\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid var(--border)\",\n background: \"var(--bg-solid)\",\n color: \"var(--text-primary)\",\n outline: \"none\",\n resize: \"vertical\",\n }}\n />\n </label>\n )}\n </>\n )}\n\n {!state.streaming && !state.abandons && (\n <p style={{ fontSize: \"11px\", color: \"var(--text-secondary)\", margin: 0 }}>\n Confirm navigation?\n </p>\n )}\n\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: \"8px\", paddingTop: \"4px\" }}>\n <button\n onClick={onCancel}\n style={{\n padding: \"6px 14px\",\n fontSize: \"11px\",\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid var(--border)\",\n background: \"transparent\",\n color: \"var(--text-secondary)\",\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n onClick={() => {\n const opts: { summarize?: boolean; customInstructions?: string; label?: string } = {};\n const trimmedLabel = label.trim();\n if (trimmedLabel.length > 0) opts.label = trimmedLabel;\n if (summarize) {\n opts.summarize = true;\n const trimmedInstr = customInstructions.trim();\n if (trimmedInstr.length > 0) opts.customInstructions = trimmedInstr;\n }\n onConfirm(opts);\n }}\n style={{\n padding: \"6px 14px\",\n fontSize: \"11px\",\n fontWeight: 600,\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: state.streaming ? \"var(--warning, #d97706)\" : \"var(--text-primary)\",\n color: state.streaming ? \"#fff\" : \"var(--bg-solid)\",\n cursor: \"pointer\",\n }}\n >\n {state.streaming ? \"Abort & navigate\" : \"Navigate\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Tree Row ── */\n\nconst MAX_INDENT_DEPTH = 4;\nconst INDENT_PX = 18;\nconst BRANCH_OFFSET_PX = 10;\nconst MAX_BRANCH_LEVEL = 8;\n\nconst BRANCH_PALETTE = [\n \"var(--accent)\",\n \"var(--accent-text)\",\n \"var(--warning)\",\n \"var(--success)\",\n \"var(--error)\",\n \"var(--border-bright)\",\n];\n\nfunction branchAccent(level: number): string {\n if (level <= 0) return \"transparent\";\n return BRANCH_PALETTE[(level - 1) % BRANCH_PALETTE.length]!;\n}\n\nfunction entryTypeLabel(node: SessionTreeEntry): string {\n if (node.type === \"message\") return node.role ?? \"message\";\n if (node.type === \"thinking_level_change\") return \"thinking\";\n if (node.type === \"model_change\") return \"model\";\n if (node.type === \"compaction\") return \"compact\";\n if (node.type === \"branch_summary\") return \"branch\";\n if (node.type === \"label\") return \"label\";\n if (node.type === \"session_info\") return \"info\";\n if (node.type === \"custom\") return \"custom\";\n if (node.type === \"custom_message\") return \"extension\";\n return node.type;\n}\n\nfunction roleBadgeColor(role?: string, type?: string): React.CSSProperties {\n if (role === \"user\") return { background: \"var(--accent-subtle)\", color: \"var(--accent-text)\" };\n if (role === \"assistant\") return { background: \"color-mix(in srgb, var(--accent) 12%, transparent)\", color: \"var(--accent)\" };\n if (type === \"branch_summary\") return { background: \"color-mix(in srgb, var(--warning, #fbbf24) 15%, transparent)\", color: \"var(--warning, #fbbf24)\" };\n if (type === \"compaction\") return { background: \"color-mix(in srgb, var(--accent) 8%, transparent)\", color: \"var(--text-dim)\" };\n return { background: \"rgba(255,255,255,0.04)\", color: \"var(--text-dim)\" };\n}\n\nfunction TreeRow({\n node,\n disabled,\n onNavigate,\n onFork,\n}: {\n node: NodeView;\n disabled: boolean;\n onNavigate: () => void;\n onFork: () => void;\n}) {\n const indent =\n Math.min(node.depth, MAX_INDENT_DEPTH) * INDENT_PX +\n Math.min(node.branchLevel, MAX_BRANCH_LEVEL) * BRANCH_OFFSET_PX;\n const isUserMessage = node.type === \"message\" && node.role === \"user\";\n const dim = !node.onActivePath;\n const labelText = entryTypeLabel(node);\n\n const rowStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"6px\",\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid\",\n padding: \"6px 8px\",\n ...(node.isLeaf\n ? { borderColor: \"var(--accent)\", background: \"var(--accent-subtle)\" }\n : node.onActivePath\n ? { borderColor: \"var(--tool-border)\", background: \"var(--bg-glass)\" }\n : { borderColor: \"var(--tool-border)\", background: \"transparent\" }),\n opacity: dim ? 0.55 : 1,\n ...(node.branchLevel > 0\n ? { boxShadow: `inset 3px 0 0 ${branchAccent(node.branchLevel)}` }\n : {}),\n };\n\n return (\n <li style={{ paddingLeft: `${indent}px`, minWidth: 0 }}>\n <div style={rowStyle}>\n {/* Action buttons */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"2px\", paddingTop: \"1px\", flexShrink: 0 }}>\n {!node.isLeaf ? (\n <button\n onClick={onNavigate}\n disabled={disabled}\n title=\"Navigate to this entry\"\n style={{\n padding: \"2px\",\n fontSize: \"11px\",\n border: \"none\",\n background: \"transparent\",\n color: \"var(--text-dim)\",\n cursor: disabled ? \"default\" : \"pointer\",\n borderRadius: \"3px\",\n lineHeight: 1,\n }}\n >\n ◎\n </button>\n ) : (\n <span style={{ display: \"inline-block\", width: \"18px\" }} />\n )}\n {isUserMessage ? (\n <button\n onClick={onFork}\n disabled={disabled}\n title=\"Fork from this message\"\n style={{\n padding: \"2px\",\n fontSize: \"11px\",\n border: \"none\",\n background: \"transparent\",\n color: \"var(--text-dim)\",\n cursor: disabled ? \"default\" : \"pointer\",\n borderRadius: \"3px\",\n lineHeight: 1,\n }}\n >\n ↻\n </button>\n ) : (\n <span style={{ display: \"inline-block\", width: \"18px\" }} />\n )}\n </div>\n\n {/* Content */}\n <button\n onClick={onNavigate}\n disabled={disabled || node.isLeaf}\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"2px\",\n textAlign: \"left\",\n border: \"none\",\n background: \"transparent\",\n cursor: disabled || node.isLeaf ? \"default\" : \"pointer\",\n padding: 0,\n }}\n >\n <div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: \"4px\" }}>\n <span\n style={{\n padding: \"1px 6px\",\n fontSize: \"9px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.03em\",\n borderRadius: \"3px\",\n ...roleBadgeColor(node.role, node.type),\n }}\n >\n {labelText}\n </span>\n {node.isBranchHead && (\n <span\n style={{\n padding: \"1px 6px\",\n fontSize: \"9px\",\n textTransform: \"uppercase\",\n borderRadius: \"3px\",\n background: `${branchAccent(node.branchLevel)}33`,\n color: branchAccent(node.branchLevel),\n }}\n >\n branch {node.branchLevel}\n </span>\n )}\n {node.label !== undefined && node.label.length > 0 && (\n <span\n style={{\n padding: \"1px 6px\",\n fontSize: \"9px\",\n borderRadius: \"3px\",\n background: \"var(--bg-glass-strong)\",\n color: \"var(--text-secondary)\",\n }}\n >\n ★ {node.label}\n </span>\n )}\n {node.isLeaf && (\n <span\n style={{\n padding: \"1px 6px\",\n fontSize: \"9px\",\n borderRadius: \"3px\",\n background: \"color-mix(in srgb, var(--success, #34d399) 15%, transparent)\",\n color: \"var(--success, #34d399)\",\n }}\n >\n leaf\n </span>\n )}\n {node.siblings > 1 && (\n <span style={{ fontSize: \"9px\", color: \"var(--warning)\" }} title={`${node.siblings} branches diverge here`}>\n ⑂ {node.siblings}\n </span>\n )}\n <span style={{ fontSize: \"9px\", color: \"var(--text-ghost)\" }}>\n {new Date(node.timestamp).toLocaleString()}\n </span>\n </div>\n {node.preview !== undefined && (\n <p\n style={{\n width: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n margin: 0,\n fontSize: \"11px\",\n color: \"var(--text-secondary)\",\n }}\n >\n {node.preview}\n </p>\n )}\n </button>\n </div>\n </li>\n );\n}\n\n/* ── Tree flattening ── */\n\nfunction flattenTree(tree: SessionTreeResponse): NodeView[] {\n const childrenByParent = new Map<string | null, SessionTreeEntry[]>();\n for (const e of tree.entries) {\n const list = childrenByParent.get(e.parentId);\n if (list === undefined) childrenByParent.set(e.parentId, [e]);\n else list.push(e);\n }\n for (const list of childrenByParent.values()) {\n list.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n }\n const onPath = new Set(tree.branchIds);\n const out: NodeView[] = [];\n const visit = (parentId: string | null, branchLevel: number) => {\n const list = childrenByParent.get(parentId);\n if (list === undefined) return;\n const siblings = list.length;\n list.forEach((e, idx) => {\n const childLevel = idx === 0 ? branchLevel : branchLevel + 1;\n const isBranchHead = idx > 0 && childLevel > 0;\n out.push({\n ...e,\n depth: e.type === \"message\" ? (e.role === \"user\" ? 0 : e.role === \"tool\" ? 2 : 1) : 0,\n branchLevel: childLevel,\n onActivePath: onPath.has(e.id),\n isLeaf: tree.leafId === e.id,\n siblings,\n isBranchHead,\n });\n visit(e.id, childLevel);\n });\n };\n visit(null, 0);\n return out;\n}\n\nfunction currentLeafAbandonedBy(tree: SessionTreeResponse, targetId: string): boolean {\n if (tree.leafId === null || tree.leafId === targetId) return false;\n const byId = new Map(tree.entries.map((e) => [e.id, e]));\n let cur: string | null = tree.leafId;\n while (cur !== null) {\n if (cur === targetId) return false;\n cur = byId.get(cur)?.parentId ?? null;\n }\n return true;\n}\n\n/* ── Graph View ── */\n\ninterface TurnNode {\n id: string;\n parentId: string | null;\n col: number;\n row: number;\n isOnActivePath: boolean;\n isLeafTurn: boolean;\n roleLabel: string;\n preview: string;\n isUserAnchor: boolean;\n anchorParentId: string | null;\n lastEntryId: string;\n timestamp: string;\n}\n\nconst NODE_WIDTH = 200;\nconst NODE_HEIGHT = 68;\nconst COL_GAP = 48;\nconst ROW_GAP = 24;\nconst PAD = 20;\n\nfunction buildTurns(tree: SessionTreeResponse): TurnNode[] {\n const byId = new Map(tree.entries.map((e) => [e.id, e]));\n const childrenByParent = new Map<string | null, SessionTreeEntry[]>();\n for (const e of tree.entries) {\n const list = childrenByParent.get(e.parentId);\n if (list === undefined) childrenByParent.set(e.parentId, [e]);\n else list.push(e);\n }\n for (const list of childrenByParent.values()) {\n list.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n }\n\n // Build turns\n const owningTurn = new Map<string, string>();\n const computeOwner = (entry: SessionTreeEntry): string => {\n const cached = owningTurn.get(entry.id);\n if (cached !== undefined) return cached;\n if (entry.type === \"message\" && entry.role === \"user\") {\n owningTurn.set(entry.id, entry.id);\n return entry.id;\n }\n if (entry.parentId === null) {\n owningTurn.set(entry.id, entry.id);\n return entry.id;\n }\n const parent = byId.get(entry.parentId);\n if (parent === undefined) {\n owningTurn.set(entry.id, entry.id);\n return entry.id;\n }\n const owner = computeOwner(parent);\n owningTurn.set(entry.id, owner);\n return owner;\n };\n for (const e of tree.entries) computeOwner(e);\n\n const turnsByAnchor = new Map<string, TurnNode>();\n for (const e of tree.entries) {\n if (owningTurn.get(e.id) !== e.id) continue;\n const isUser = e.type === \"message\" && e.role === \"user\";\n turnsByAnchor.set(e.id, {\n id: e.id,\n parentId: null,\n col: 0,\n row: 0,\n isOnActivePath: false,\n isLeafTurn: false,\n roleLabel: isUser ? \"user\" : entryTypeLabel(e),\n preview: e.preview ?? \"\",\n isUserAnchor: isUser,\n anchorParentId: e.parentId,\n lastEntryId: e.id,\n timestamp: e.timestamp,\n });\n }\n\n // Update lastEntryId for each turn: walk all entries owned by the\n // turn and keep the one with the latest timestamp. Without this\n // pass lastEntryId stays on the anchor (the user message) so\n // navigating/forking lands on the parent instead of the reply.\n for (const e of tree.entries) {\n const owner = owningTurn.get(e.id)!;\n const turn = turnsByAnchor.get(owner);\n if (turn === undefined) continue;\n const currentLast = byId.get(turn.lastEntryId);\n if (\n currentLast === undefined ||\n e.timestamp.localeCompare(currentLast.timestamp) >= 0\n ) {\n turn.lastEntryId = e.id;\n }\n }\n\n // Parent-link turns\n for (const turn of turnsByAnchor.values()) {\n if (turn.anchorParentId === null) continue;\n const parentOwner = owningTurn.get(turn.anchorParentId);\n if (parentOwner === undefined || parentOwner === turn.id) continue;\n turn.parentId = parentOwner;\n }\n\n // Active-path + leaf flags\n const onPath = new Set(tree.branchIds);\n const leafOwner = tree.leafId !== null ? owningTurn.get(tree.leafId) : undefined;\n for (const t of turnsByAnchor.values()) {\n t.isOnActivePath = onPath.has(t.id);\n t.isLeafTurn = leafOwner === t.id;\n }\n\n // Layout: columns\n const childrenByTurnParent = new Map<string | null, TurnNode[]>();\n for (const t of turnsByAnchor.values()) {\n const list = childrenByTurnParent.get(t.parentId);\n if (list === undefined) childrenByTurnParent.set(t.parentId, [t]);\n else list.push(t);\n }\n for (const list of childrenByTurnParent.values()) {\n list.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n }\n\n let nextFreeCol = 0;\n const visit = (parentId: string | null, parentCol: number) => {\n const kids = childrenByTurnParent.get(parentId) ?? [];\n kids.forEach((kid, idx) => {\n let col: number;\n if (idx === 0) {\n col = parentCol;\n } else {\n col = nextFreeCol;\n nextFreeCol += 1;\n }\n kid.col = col;\n visit(kid.id, col);\n });\n };\n const roots = childrenByTurnParent.get(null) ?? [];\n roots.forEach((root, idx) => {\n if (idx === 0) {\n root.col = 0;\n nextFreeCol = Math.max(nextFreeCol, 1);\n } else {\n root.col = nextFreeCol;\n nextFreeCol += 1;\n }\n visit(root.id, root.col);\n });\n\n // Row assignment: chain-depth from root\n const depthMemo = new Map<string, number>();\n const computeDepth = (turn: TurnNode): number => {\n const cached = depthMemo.get(turn.id);\n if (cached !== undefined) return cached;\n if (turn.parentId === null) {\n depthMemo.set(turn.id, 0);\n return 0;\n }\n const parent = turnsByAnchor.get(turn.parentId);\n if (parent === undefined) {\n depthMemo.set(turn.id, 0);\n return 0;\n }\n const d = computeDepth(parent) + 1;\n depthMemo.set(turn.id, d);\n return d;\n };\n for (const t of turnsByAnchor.values()) t.row = computeDepth(t);\n\n return [...turnsByAnchor.values()].sort((a, b) =>\n a.row !== b.row ? a.row - b.row : a.col - b.col,\n );\n}\n\nfunction SessionTreeGraph({\n tree,\n disabled,\n onNavigate,\n onForkAfterTurn,\n}: {\n tree: SessionTreeResponse;\n disabled: boolean;\n onNavigate: (entryId: string) => void;\n onForkAfterTurn: (lastEntryId: string) => void;\n}) {\n const turns = useMemo(() => buildTurns(tree), [tree]);\n const layout = useMemo(() => {\n if (turns.length === 0) return { width: 0, height: 0 };\n const maxCol = turns.reduce((m, t) => Math.max(m, t.col), 0);\n const maxRow = turns.reduce((m, t) => Math.max(m, t.row), 0);\n return {\n width: PAD * 2 + (maxCol + 1) * NODE_WIDTH + maxCol * COL_GAP,\n height: PAD * 2 + (maxRow + 1) * NODE_HEIGHT + maxRow * ROW_GAP,\n };\n }, [turns]);\n\n if (turns.length === 0) {\n return <div style={{ textAlign: \"center\", padding: \"24px\", color: \"var(--text-dim)\", fontSize: \"12px\" }}>No turns to render.</div>;\n }\n\n const xOf = (col: number): number => PAD + col * (NODE_WIDTH + COL_GAP);\n const yOf = (row: number): number => PAD + row * (NODE_HEIGHT + ROW_GAP);\n const turnsById = new Map(turns.map((t) => [t.id, t]));\n\n return (\n <div style={{ position: \"relative\", width: `${layout.width}px`, height: `${layout.height}px` }}>\n <svg aria-hidden style={{ position: \"absolute\", left: 0, top: 0, pointerEvents: \"none\" }} width={layout.width} height={layout.height}>\n {turns.map((t) => {\n if (t.parentId === null) return null;\n const parent = turnsById.get(t.parentId);\n if (parent === undefined) return null;\n const px = xOf(parent.col) + NODE_WIDTH / 2;\n const py = yOf(parent.row) + NODE_HEIGHT;\n const cx = xOf(t.col) + NODE_WIDTH / 2;\n const cy = yOf(t.row);\n const onActive = t.isOnActivePath && parent.isOnActivePath;\n const d = px === cx\n ? `M ${px} ${py} L ${cx} ${cy}`\n : (() => {\n const bendY = py + (cy - py) / 2;\n const r = 6;\n const goingRight = cx > px;\n const cornerInX = goingRight ? px + r : px - r;\n const cornerOutX = goingRight ? cx - r : cx + r;\n return [\n `M ${px} ${py}`,\n `L ${px} ${bendY - r}`,\n `Q ${px} ${bendY} ${cornerInX} ${bendY}`,\n `L ${cornerOutX} ${bendY}`,\n `Q ${cx} ${bendY} ${cx} ${bendY + r}`,\n `L ${cx} ${cy}`,\n ].join(\" \");\n })();\n return (\n <path\n key={t.id}\n d={d}\n fill=\"none\"\n stroke={onActive ? \"#a3a3a3\" : \"#404040\"}\n strokeWidth={onActive ? 1.5 : 1}\n strokeOpacity={onActive ? 0.85 : 0.5}\n />\n );\n })}\n </svg>\n {turns.map((t) => (\n <GraphNode\n key={t.id}\n turn={t}\n x={xOf(t.col)}\n y={yOf(t.row)}\n disabled={disabled}\n // Navigate to the LAST entry in the turn (assistant reply /\n // tool result). If the last entry happens to be a user message\n // (turn has no response yet), fall back to the turn's anchor\n // (also a user message) — the SDK navigates to the parent in\n // that case, which is the intended \"edit\" position.\n //\n // Never navigate to a user message entry directly: the SDK's\n // navigateTree sets leaf = parent for user messages, which\n // creates a -1 offset in the graph (click turn 4 → shows turn 3).\n onNavigate={() => onNavigate(t.lastEntryId)}\n onForkAfterTurn={() => onForkAfterTurn(t.lastEntryId)}\n />\n ))}\n </div>\n );\n}\n\nfunction GraphNode({\n turn,\n x,\n y,\n disabled,\n onNavigate,\n onForkAfterTurn,\n}: {\n turn: TurnNode;\n x: number;\n y: number;\n disabled: boolean;\n onNavigate: () => void;\n onForkAfterTurn: () => void;\n}) {\n const dim = !turn.isOnActivePath;\n const borderColor = turn.isLeafTurn\n ? \"var(--accent)\"\n : turn.isOnActivePath\n ? \"var(--tool-border)\"\n : \"var(--tool-border)\";\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: `${x}px`,\n top: `${y}px`,\n width: `${NODE_WIDTH}px`,\n height: `${NODE_HEIGHT}px`,\n borderRadius: \"var(--radius-sm)\",\n border: \"1px solid\",\n borderColor,\n background: turn.isLeafTurn\n ? \"var(--accent-subtle)\"\n : turn.isOnActivePath\n ? \"var(--bg-glass)\"\n : \"var(--bg-solid)\",\n opacity: dim ? 0.55 : 1,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n <button\n onClick={onNavigate}\n disabled={disabled}\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n justifyContent: \"center\",\n padding: \"6px 8px\",\n gap: \"2px\",\n textAlign: \"left\",\n border: \"none\",\n background: \"transparent\",\n cursor: disabled ? \"default\" : \"pointer\",\n width: \"100%\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"4px\", flexWrap: \"wrap\" }}>\n <span\n style={{\n padding: \"1px 5px\",\n fontSize: \"8px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.03em\",\n borderRadius: \"2px\",\n ...roleBadgeColor(\n turn.roleLabel === \"user\" ? \"user\" : turn.roleLabel === \"assistant\" ? \"assistant\" : undefined,\n undefined,\n ),\n }}\n >\n {turn.roleLabel}\n </span>\n {turn.isLeafTurn && (\n <span style={{ fontSize: \"8px\", color: \"var(--accent-text)\" }}>leaf</span>\n )}\n </div>\n {turn.preview.length > 0 && (\n <p\n style={{\n margin: 0,\n fontSize: \"10px\",\n color: \"var(--text-secondary)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"100%\",\n }}\n >\n {turn.preview.slice(0, 60)}{turn.preview.length > 60 ? \"…\" : \"\"}\n </p>\n )}\n </button>\n {turn.isUserAnchor && (\n <button\n onClick={onForkAfterTurn}\n disabled={disabled}\n title=\"Fork from this turn\"\n style={{\n padding: \"1px 6px\",\n fontSize: \"9px\",\n border: \"none\",\n borderTop: \"1px solid var(--tool-border)\",\n background: \"transparent\",\n color: \"var(--text-dim)\",\n cursor: disabled ? \"default\" : \"pointer\",\n width: \"100%\",\n }}\n >\n ↻ fork\n </button>\n )}\n </div>\n );\n}\n","export interface ThemeInfo {\n id: string;\n name: string;\n base: \"dark\" | \"light\";\n colors: string[];\n}\n\nexport const themes: ThemeInfo[] = [\n { id: \"night\", name: \"Dusk\", base: \"dark\", colors: [\"#212121\", \"#a0a0a0\", \"#777777\", \"#666666\"] },\n { id: \"midnight\", name: \"Midnight\", base: \"dark\", colors: [\"#000000\", \"#5a7a9a\", \"#4a5565\", \"#4a5a72\"] },\n { id: \"dawn\", name: \"Dawn\", base: \"dark\", colors: [\"#1a1d26\", \"#7a8ab0\", \"#6a5a80\", \"#5a7a9a\"] },\n { id: \"monokai\", name: \"Monokai\", base: \"dark\", colors: [\"#272822\", \"#ae81ff\", \"#f92672\", \"#a6e22e\"] },\n { id: \"dracula\", name: \"Dracula\", base: \"dark\", colors: [\"#282a36\", \"#bd93f9\", \"#ff79c6\", \"#50fa7b\"] },\n { id: \"nord\", name: \"Nord\", base: \"dark\", colors: [\"#2e3440\", \"#88c0d0\", \"#81a1c1\", \"#5e81ac\"] },\n { id: \"bourbon\", name: \"Bourbon\", base: \"dark\", colors: [\"#1a1410\", \"#d4a054\", \"#c07030\", \"#8b6914\"] },\n { id: \"flexoki-dark\", name: \"Flexoki Dark\", base: \"dark\", colors: [\"#171515\", \"#da702c\", \"#4385be\", \"#a0af54\"] },\n { id: \"clean\", name: \"Clean\", base: \"light\", colors: [\"#ffffff\", \"#0580c4\", \"#007aff\", \"#5ac8fa\"] },\n { id: \"terracotta\", name: \"Terracotta\", base: \"light\", colors: [\"#f4f1ec\", \"#b06a48\", \"#5c2860\", \"#3a6a9b\"] },\n { id: \"sage\", name: \"Sage\", base: \"light\", colors: [\"#f0f2ec\", \"#6a7d5a\", \"#4a3860\", \"#3a6a7a\"] },\n { id: \"flexoki-light\", name: \"Flexoki Light\", base: \"light\", colors: [\"#fffdf4\", \"#bc5215\", \"#205ea6\", \"#66800b\"] },\n];\n\nexport function getSavedTheme(): string {\n try {\n const saved = localStorage.getItem(\"pi-kot-theme\");\n if (saved && themes.some((t) => t.id === saved)) return saved;\n } catch {\n // private mode\n }\n // Auto-detect from OS\n if (window.matchMedia?.(\"(prefers-color-scheme: light)\").matches) return \"terracotta\";\n return \"night\";\n}\n\nexport function applyTheme(themeId: string): void {\n const theme = themes.find((t) => t.id === themeId);\n if (!theme) return;\n document.documentElement.setAttribute(\"data-theme\", theme.base);\n document.documentElement.setAttribute(\"data-accent\", themeId);\n try {\n localStorage.setItem(\"pi-kot-theme\", themeId);\n } catch {\n // private mode\n }\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { getSavedTheme, applyTheme, themes } from \"../../lib/theme\";\nimport {\n usePreferencesStore,\n type PreferencesState,\n} from \"../../stores/preferences-store\";\nimport { getUiSettings, updateUiSettings } from \"../../lib/api-client\";\n\ntype UiSettings = {\n theme?: string;\n stickyUserHeader?: boolean;\n showTokenUsage?: boolean;\n compressImages?: boolean;\n};\n\nexport function AppearanceTab() {\n const [current, setCurrent] = useState(() => getSavedTheme());\n const [serverSynced, setServerSynced] = useState(false);\n\n const stickyUserHeader = usePreferencesStore(\n (s: PreferencesState) => s.stickyUserHeader,\n );\n const setStickyUserHeader = usePreferencesStore(\n (s: PreferencesState) => s.setStickyUserHeader,\n );\n const showTokenUsage = usePreferencesStore(\n (s: PreferencesState) => s.showTokenUsage,\n );\n const setShowTokenUsage = usePreferencesStore(\n (s: PreferencesState) => s.setShowTokenUsage,\n );\n const compressImages = usePreferencesStore(\n (s: PreferencesState) => s.compressImages,\n );\n const setCompressImages = usePreferencesStore(\n (s: PreferencesState) => s.setCompressImages,\n );\n\n // ── Load server-persisted settings on mount ────────────────────────────\n useEffect(() => {\n let cancelled = false;\n getUiSettings()\n .then((server: UiSettings) => {\n if (cancelled) return;\n setServerSynced(true);\n\n // Apply server theme if present\n if (server.theme && server.theme !== current) {\n setCurrent(server.theme);\n applyTheme(server.theme);\n }\n\n // Apply server toggles (zustand handles localStorage sync)\n if (typeof server.stickyUserHeader === \"boolean\") {\n setStickyUserHeader(server.stickyUserHeader);\n }\n if (typeof server.showTokenUsage === \"boolean\") {\n setShowTokenUsage(server.showTokenUsage);\n }\n if (typeof server.compressImages === \"boolean\") {\n setCompressImages(server.compressImages);\n }\n })\n .catch(() => {\n // Server not available — fall back to localStorage/zustand (no-op)\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── Persist both locally and server-side ────────────────────────────────\n const persist = useCallback(\n (patch: UiSettings) => {\n // Fire-and-forget server sync (best-effort)\n updateUiSettings(patch).catch(() => {});\n },\n [],\n );\n\n const select = (id: string) => {\n setCurrent(id);\n applyTheme(id);\n persist({ theme: id });\n };\n\n const handleStickyChange = (checked: boolean) => {\n setStickyUserHeader(checked);\n persist({ stickyUserHeader: checked });\n };\n\n const handleTokenUsageChange = (checked: boolean) => {\n setShowTokenUsage(checked);\n persist({ showTokenUsage: checked });\n };\n\n const handleCompressChange = (checked: boolean) => {\n setCompressImages(checked);\n persist({ compressImages: checked });\n };\n\n return (\n <div className=\"settings-fields\">\n <p className=\"settings-hint\">\n Choose a theme. \n {serverSynced\n ? \" Preferences saved server-side (survives cache clears).\"\n : \" Server offline — saved locally only.\"}\n </p>\n <div className=\"settings-theme-grid\">\n {themes.map((t: { id: string; name: string }) => (\n <button\n key={t.id}\n onClick={() => select(t.id)}\n className={`settings-theme-swatch ${current === t.id ? \"settings-theme-active\" : \"\"}`}\n >\n {t.name}\n </button>\n ))}\n </div>\n\n <div className=\"settings-field\">\n <label className=\"settings-label\">Chat</label>\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n cursor: \"pointer\",\n userSelect: \"none\",\n fontSize: 13,\n color: \"var(--text-secondary)\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={stickyUserHeader}\n onChange={(e) => handleStickyChange(e.target.checked)}\n style={{\n width: 16,\n height: 16,\n accentColor: \"var(--accent-text)\",\n cursor: \"pointer\",\n }}\n />\n Sticky user header — pin your message at the top while scrolling\n through the assistant’s reply\n </label>\n </div>\n\n <div className=\"settings-field\">\n <label className=\"settings-label\">Chat</label>\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n cursor: \"pointer\",\n userSelect: \"none\",\n fontSize: 13,\n color: \"var(--text-secondary)\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={showTokenUsage}\n onChange={(e) => handleTokenUsageChange(e.target.checked)}\n style={{\n width: 16,\n height: 16,\n accentColor: \"var(--accent-text)\",\n cursor: \"pointer\",\n }}\n />\n Show token usage — display input/output/cached tokens on each\n assistant message\n </label>\n </div>\n\n <div className=\"settings-field\">\n <label className=\"settings-label\">Images</label>\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n cursor: \"pointer\",\n userSelect: \"none\",\n fontSize: 13,\n color: \"var(--text-secondary)\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={compressImages}\n onChange={(e) => handleCompressChange(e.target.checked)}\n style={{\n width: 16,\n height: 16,\n accentColor: \"var(--accent-text)\",\n cursor: \"pointer\",\n }}\n />\n Compress images — downscale large images before sending (saves\n bandwidth, reduces token cost)\n </label>\n </div>\n </div>\n );\n}\n","/**\n * AddProviderDialog — Step-by-step wizard for adding custom LLM providers.\n *\n * Steps:\n * 1. Enter base URL + provider name + optional API key\n * 2. Test connection (probe endpoint, auto-detect API type, fetch models)\n * 3. Review discovered models, adjust names, set context windows\n * 4. Confirm and save to models.json\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Globe,\n Key,\n CheckCircle,\n XCircle,\n Loader2,\n RefreshCw,\n Save,\n Settings,\n Zap,\n X,\n ChevronRight,\n Image,\n} from \"lucide-react\";\nimport {\n probeProvider,\n addCustomProvider,\n fetchProviders,\n} from \"../lib/api-client\";\nimport type { ProbeResult } from \"../lib/api-client\";\n\n// ── API type options ──────────────────────────────────────────────────────\n\nconst API_TYPE_OPTIONS = [\n { value: \"openai-completions\", label: \"OpenAI Compatible (Chat Completions)\" },\n { value: \"openai-responses\", label: \"OpenAI Responses API\" },\n { value: \"anthropic-messages\", label: \"Anthropic Messages API\" },\n { value: \"google-generative-ai\", label: \"Google Generative AI\" },\n { value: \"mistral-conversations\", label: \"Mistral Conversations\" },\n] as const;\n\n// ── Model configuration interface ─────────────────────────────────────────\n\ninterface ModelEntry {\n id: string;\n name: string;\n contextWindow: number;\n maxTokens: number;\n reasoning: boolean;\n vision: boolean;\n selected: boolean;\n}\n\n// ── Steps ─────────────────────────────────────────────────────────────────\n\ntype Step = \"url\" | \"testing\" | \"models\" | \"save\";\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n onError: (msg: string | undefined) => void;\n onSaved: () => void;\n}\n\nexport function AddProviderDialog({ open, onClose, onError, onSaved }: Props) {\n // ── Step 1 state ──────────────────────────────────────────────────────\n const [step, setStep] = useState<Step>(\"url\");\n const [baseUrl, setBaseUrl] = useState(\"\");\n const [providerName, setProviderName] = useState(\"\");\n const [apiKey, setApiKey] = useState(\"\");\n const [apiType, setApiType] = useState(\"openai-completions\");\n const [showKey, setShowKey] = useState(false);\n const [connectionTested, setConnectionTested] = useState(false);\n\n // ── Step 2 state (testing) ────────────────────────────────────────────\n const [testResult, setTestResult] = useState<ProbeResult | undefined>(undefined);\n const [testing, setTesting] = useState(false);\n\n // ── Step 3 state (model review) ───────────────────────────────────────\n const [models, setModels] = useState<ModelEntry[]>([]);\n const [selectAll, setSelectAll] = useState(true);\n\n // ── Step 4 (saving) ───────────────────────────────────────────────────\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n\n // Refs\n const urlRef = useRef<HTMLInputElement>(null);\n\n // ── Reset on open ─────────────────────────────────────────────────────\n useEffect(() => {\n if (!open) return;\n setStep(\"url\");\n setBaseUrl(\"\");\n setProviderName(\"\");\n setApiKey(\"\");\n setApiType(\"openai-completions\");\n setShowKey(false);\n setConnectionTested(false);\n setTestResult(undefined);\n setTesting(false);\n setModels([]);\n setSelectAll(true);\n setSaving(false);\n setSaved(false);\n onError(undefined);\n requestAnimationFrame(() => urlRef.current?.focus());\n }, [open, onError]);\n\n // ── Step 2: Test connection ───────────────────────────────────────────\n\n const handleTestConnection = useCallback(async () => {\n if (!baseUrl.trim()) return;\n setTesting(true);\n setTestResult(undefined);\n onError(undefined);\n\n try {\n const result = await probeProvider({\n baseUrl: baseUrl.trim(),\n apiKey: apiKey.trim() || undefined,\n apiType,\n });\n setTestResult(result);\n\n if (result.reachable && result.models && result.models.length > 0) {\n // Auto-suggest a provider name from the probe result\n if (!providerName.trim() && result.suggestedName) {\n setProviderName(result.suggestedName);\n }\n\n setModels(\n result.models.map((m) => ({\n id: m.id,\n name: m.name ?? m.id,\n contextWindow: 128000,\n maxTokens: 4096,\n reasoning: false,\n vision: false,\n selected: true,\n })),\n );\n setConnectionTested(true);\n setStep(\"models\");\n } else if (result.reachable) {\n // Reachable but no models — let user add models manually\n setConnectionTested(true);\n setModels([]);\n setStep(\"models\");\n } else {\n // Not reachable — stay on url step to let user fix\n setConnectionTested(false);\n }\n } catch (err) {\n onError(err instanceof Error ? err.message : \"Test connection failed\");\n setTestResult({\n reachable: false,\n error: err instanceof Error ? err.message : \"Unknown error\",\n });\n } finally {\n setTesting(false);\n }\n }, [baseUrl, apiKey, apiType, providerName, onError]);\n\n // ── Auto-test when Enter is pressed on the URL step ───────────────────\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && step === \"url\" && baseUrl.trim()) {\n e.preventDefault();\n void handleTestConnection();\n }\n },\n [step, baseUrl, handleTestConnection],\n );\n\n // ── Toggle all models ─────────────────────────────────────────────────\n const toggleSelectAll = useCallback(() => {\n setSelectAll((prev) => {\n const next = !prev;\n setModels((ms) => ms.map((m) => ({ ...m, selected: next })));\n return next;\n });\n }, []);\n\n // ── Toggle individual model ───────────────────────────────────────────\n const toggleModel = useCallback((id: string) => {\n setModels((ms) =>\n ms.map((m) => (m.id === id ? { ...m, selected: !m.selected } : m)),\n );\n }, []);\n\n // ── Update model field (contextWindow, maxTokens, name, reasoning) ────\n const updateModel = useCallback(\n (id: string, field: keyof ModelEntry, value: string | number | boolean) => {\n setModels((ms) =>\n ms.map((m) => (m.id === id ? { ...m, [field]: value } : m)),\n );\n },\n [],\n );\n\n // ── Step 4: Save ──────────────────────────────────────────────────────\n\n const handleSave = useCallback(async () => {\n if (!providerName.trim() || !baseUrl.trim()) return;\n setSaving(true);\n onError(undefined);\n\n // Build the provider config for models.json\n const selectedModels = models.filter((m) => m.selected);\n const providerConfig: Record<string, unknown> = {\n baseUrl: baseUrl.trim(),\n api: apiType,\n };\n\n // Only include apiKey if provided\n if (apiKey.trim()) {\n providerConfig.apiKey = apiKey.trim();\n }\n\n // Include models if we have any\n if (selectedModels.length > 0) {\n providerConfig.models = selectedModels.map((m) => {\n const modelConfig: Record<string, unknown> = {\n id: m.id,\n name: m.name,\n contextWindow: m.contextWindow,\n maxTokens: m.maxTokens,\n input: m.vision ? [\"text\", \"image\"] : [\"text\"],\n };\n if (m.reasoning) {\n modelConfig.reasoning = true;\n }\n // Only include cost if non-zero\n modelConfig.cost = {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n };\n return modelConfig;\n });\n }\n\n try {\n await addCustomProvider(providerName.trim(), providerConfig);\n setSaved(true);\n setStep(\"save\");\n onSaved();\n // Auto-close after a moment\n setTimeout(() => {\n onClose();\n }, 2000);\n } catch (err) {\n onError(err instanceof Error ? err.message : \"Failed to save provider\");\n } finally {\n setSaving(false);\n }\n }, [baseUrl, providerName, apiKey, apiType, models, onSaved, onClose, onError]);\n\n // ── Re-test (go back to testing) ──────────────────────────────────────\n const handleRetest = useCallback(() => {\n setStep(\"url\");\n setTestResult(undefined);\n setConnectionTested(false);\n }, []);\n\n if (!open) return null;\n\n return (\n <div className=\"settings-overlay\" onClick={onClose}>\n <div\n className=\"settings-panel\"\n onClick={(e) => e.stopPropagation()}\n style={{ width: 640, maxWidth: \"92vw\", height: \"540px\" }}\n >\n {/* Header */}\n <header className=\"settings-header\">\n <span\n style={{\n fontSize: \"14px\",\n fontWeight: 700,\n color: \"var(--accent-text)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n {step === \"url\" && <><Zap size={16} /> Add Custom Provider</>}\n {step === \"testing\" && <><Loader2 size={16} className=\"animate-spin\" /> Testing Connection…</>}\n {step === \"models\" && <><Settings size={16} /> Configure Models</>}\n {step === \"save\" && <><CheckCircle size={16} /> Provider Added</>}\n </span>\n <button className=\"settings-close\" onClick={onClose} title=\"Close\">\n <X size={16} />\n </button>\n </header>\n\n {/* Step indicator */}\n <div className=\"add-provider-steps\">\n {([\"url\", \"models\", \"save\"] as Step[]).map((s, i) => (\n <div\n key={s}\n className={`add-provider-step ${\n step === s || (step === \"testing\" && s === \"url\")\n ? \"active\"\n : step === \"models\" && s === \"url\"\n ? \"done\"\n : step === \"save\" && (s === \"url\" || s === \"models\")\n ? \"done\"\n : \"\"\n }`}\n >\n <span className=\"add-provider-step-num\">\n {s === \"url\" && step !== \"save\" ? \"1\" : s === \"url\" ? \"✓\" : s === \"models\" ? \"2\" : \"✓\"}\n </span>\n <span className=\"add-provider-step-label\">\n {s === \"url\" ? \"Connect\" : s === \"models\" ? \"Models\" : \"Save\"}\n </span>\n {i < 2 && <ChevronRight size={14} className=\"add-provider-step-arrow\" />}\n </div>\n ))}\n </div>\n\n {/* Body */}\n <div className=\"add-provider-body\">\n {/* ── STEP 1: URL / Provider Name / API Key ── */}\n {step === \"url\" && (\n <div className=\"add-provider-form\">\n <div className=\"add-provider-field\">\n <label className=\"add-provider-label\">Base URL</label>\n <div className=\"add-provider-input-row\">\n <Globe size={14} className=\"add-provider-input-icon\" />\n <input\n ref={urlRef}\n type=\"url\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"https://api.example.com/v1\"\n className=\"add-provider-input\"\n spellCheck={false}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <div className=\"add-provider-field\">\n <label className=\"add-provider-label\">Provider Name</label>\n <div className=\"add-provider-input-row\">\n <input\n type=\"text\"\n value={providerName}\n onChange={(e) => setProviderName(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"my-local-llm\"\n className=\"add-provider-input\"\n spellCheck={false}\n autoComplete=\"off\"\n />\n </div>\n <p className=\"add-provider-hint\">\n Used as the identifier in models.json. Auto-suggested from URL.\n </p>\n </div>\n\n <div className=\"add-provider-field\">\n <label className=\"add-provider-label\">API Key (optional)</label>\n <div className=\"add-provider-input-row\">\n <Key size={14} className=\"add-provider-input-icon\" />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"sk-... or leave blank\"\n className=\"add-provider-input\"\n spellCheck={false}\n autoComplete=\"off\"\n />\n <button\n className=\"add-provider-toggle-btn\"\n onClick={() => setShowKey((v) => !v)}\n tabIndex={-1}\n title={showKey ? \"Hide key\" : \"Show key\"}\n >\n {showKey ? \"Hide\" : \"Show\"}\n </button>\n </div>\n </div>\n\n <div className=\"add-provider-field\">\n <label className=\"add-provider-label\">API Type</label>\n <select\n value={apiType}\n onChange={(e) => setApiType(e.target.value)}\n className=\"add-provider-select\"\n >\n {API_TYPE_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n <p className=\"add-provider-hint\">\n Most OpenAI-compatible endpoints use \"OpenAI Compatible\". Auto-detected when possible.\n </p>\n </div>\n\n {testResult && !testResult.reachable && (\n <div className=\"add-provider-error-row\">\n <XCircle size={14} />\n <span>{testResult.error ?? \"Connection failed\"}</span>\n </div>\n )}\n\n <div className=\"add-provider-actions\">\n <button\n className=\"add-provider-btn-primary\"\n disabled={!baseUrl.trim() || testing}\n onClick={() => void handleTestConnection()}\n >\n {testing ? (\n <><Loader2 size={14} className=\"animate-spin\" /> Testing…</>\n ) : (\n <><Zap size={14} /> Test Connection</>\n )}\n </button>\n <button\n className=\"add-provider-btn\"\n onClick={onClose}\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n {/* ── STEP 2: Testing (brief interstitial) — testing state is handled above ── */}\n {step === \"testing\" && (\n <div className=\"add-provider-testing\">\n <Loader2 size={32} className=\"animate-spin\" style={{ color: \"var(--accent-text)\" }} />\n <p>Testing connection to {baseUrl}…</p>\n {/* This step auto-transitions in handleTestConnection */}\n </div>\n )}\n\n {/* ── STEP 3: Model Review ── */}\n {step === \"models\" && (\n <div className=\"add-provider-model-review\">\n {testResult?.reachable && (\n <div className=\"add-provider-success-banner\">\n <CheckCircle size={14} />\n <span>\n Connected to {baseUrl} — detected API: <strong>{testResult.detectedApiType}</strong>\n </span>\n </div>\n )}\n\n {models.length > 0 ? (\n <>\n <div className=\"add-provider-model-toolbar\">\n <label className=\"add-provider-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectAll}\n onChange={toggleSelectAll}\n className=\"add-provider-checkbox\"\n />\n {selectAll ? \"Deselect all\" : \"Select all\"} ({models.filter((m) => m.selected).length}/{models.length})\n </label>\n </div>\n\n <div className=\"add-provider-model-list\">\n {models.map((m) => (\n <div\n key={m.id}\n className={`add-provider-model-card ${m.selected ? \"\" : \"dimmed\"}`}\n >\n <div className=\"add-provider-model-header\">\n <label className=\"add-provider-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={m.selected}\n onChange={() => toggleModel(m.id)}\n className=\"add-provider-checkbox\"\n />\n <span className=\"add-provider-model-id\">{m.id}</span>\n </label>\n </div>\n {m.selected && (\n <div className=\"add-provider-model-fields\">\n <div className=\"add-provider-model-field\">\n <label>Name</label>\n <input\n type=\"text\"\n value={m.name}\n onChange={(e) => updateModel(m.id, \"name\", e.target.value)}\n className=\"add-provider-small-input\"\n />\n </div>\n <div className=\"add-provider-model-field\">\n <label>Context</label>\n <select\n value={m.contextWindow}\n onChange={(e) =>\n updateModel(m.id, \"contextWindow\", Number(e.target.value))\n }\n className=\"add-provider-small-select\"\n >\n <option value={4096}>4K</option>\n <option value={8192}>8K</option>\n <option value={16384}>16K</option>\n <option value={32768}>32K</option>\n <option value={65536}>64K</option>\n <option value={128000}>128K</option>\n <option value={200000}>200K</option>\n <option value={262144}>256K</option>\n <option value={524288}>512K</option>\n <option value={1048576}>1M</option>\n <option value={2097152}>2M</option>\n </select>\n </div>\n <div className=\"add-provider-model-field\">\n <label>Max tokens</label>\n <select\n value={m.maxTokens}\n onChange={(e) =>\n updateModel(m.id, \"maxTokens\", Number(e.target.value))\n }\n className=\"add-provider-small-select\"\n >\n <option value={2048}>2K</option>\n <option value={4096}>4K</option>\n <option value={8192}>8K</option>\n <option value={16384}>16K</option>\n <option value={32768}>32K</option>\n <option value={65536}>64K</option>\n <option value={131072}>128K</option>\n </select>\n </div>\n <div className=\"add-provider-model-field\">\n <label>Thinking</label>\n <label className=\"add-provider-toggle-label\">\n <input\n type=\"checkbox\"\n checked={m.reasoning}\n onChange={(e) => updateModel(m.id, \"reasoning\", e.target.checked)}\n className=\"add-provider-checkbox\"\n />\n Extended thinking\n </label>\n </div>\n <div className=\"add-provider-model-field\">\n <label>Vision</label>\n <label className=\"add-provider-toggle-label\">\n <input\n type=\"checkbox\"\n checked={m.vision}\n onChange={(e) => updateModel(m.id, \"vision\", e.target.checked)}\n className=\"add-provider-checkbox\"\n />\n Image input\n </label>\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n </>\n ) : (\n <div className=\"add-provider-empty-models\">\n {testResult?.reachable && testResult?.detectedApiType === \"anthropic-messages\" ? (\n <p>\n Anthropic does not expose a models endpoint. Add models manually below.\n </p>\n ) : (\n <p>\n No models were discovered. You can still save the provider and add models\n manually to models.json.\n </p>\n )}\n {/* Allow adding a model manually */}\n <div className=\"add-provider-manual-model\">\n <input\n type=\"text\"\n placeholder=\"model-id (e.g. claude-sonnet-4)\"\n className=\"add-provider-input\"\n id=\"manual-model-id\"\n style={{ flex: 1 }}\n />\n <button\n className=\"add-provider-btn-primary\"\n onClick={() => {\n const input = document.getElementById(\"manual-model-id\") as HTMLInputElement;\n if (input?.value.trim()) {\n setModels((prev) => [\n ...prev,\n {\n id: input.value.trim(),\n name: input.value.trim(),\n contextWindow: 128000,\n maxTokens: 4096,\n reasoning: false,\n vision: false,\n selected: true,\n },\n ]);\n input.value = \"\";\n }\n }}\n style={{ whiteSpace: \"nowrap\" }}\n >\n Add model\n </button>\n </div>\n </div>\n )}\n\n <div className=\"add-provider-actions\" style={{ borderTop: \"1px solid var(--border)\", paddingTop: 12, marginTop: 8 }}>\n <button\n className=\"add-provider-btn-primary\"\n disabled={saving || !baseUrl.trim()}\n onClick={() => void handleSave()}\n >\n {saving ? (\n <><Loader2 size={14} className=\"animate-spin\" /> Saving…</>\n ) : (\n <><Save size={14} /> Save Provider</>\n )}\n </button>\n <button className=\"add-provider-btn\" onClick={handleRetest}>\n <RefreshCw size={14} /> Retest\n </button>\n <button className=\"add-provider-btn\" onClick={onClose}>\n Cancel\n </button>\n </div>\n </div>\n )}\n\n {/* ── STEP 4: Saved ── */}\n {step === \"save\" && (\n <div className=\"add-provider-saved\">\n <CheckCircle size={48} style={{ color: \"var(--accent-text)\" }} />\n <h3>Provider Added</h3>\n <p>\n <strong>{providerName}</strong> has been saved to{\" \"}\n <code className=\"font-mono\">models.json</code> with{\" \"}\n {models.filter((m) => m.selected).length} model\n {models.filter((m) => m.selected).length !== 1 ? \"s\" : \"\"}.\n </p>\n <p className=\"add-provider-hint\">\n Reload the page or open the model picker to use the new provider.\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useId, useRef, useState, type ReactNode, type RefObject } from \"react\";\nimport { X } from \"lucide-react\";\n\n/**\n * Visual primitive for modal dialogs. Replaces the built-in\n * `window.prompt` / `window.confirm` calls that some browser configs\n * intercept and that look nothing like the rest of the app.\n *\n * Behaviour:\n * - Esc closes (calls `onClose`).\n * - Click on the backdrop closes.\n * - Click on the dialog body does NOT close.\n * - Focus moves to the first focusable element inside on open;\n * Tab-cycles within the dialog (basic trap, sufficient for our\n * single-input + two-button dialogs).\n * - Renders inline (no Portal) — the app shell is full-screen\n * `flex h-screen` so a `fixed inset-0` overlay reliably covers it.\n */\nexport function Modal({\n open,\n onClose,\n title,\n children,\n width,\n initialFocusRef,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n width?: string;\n /**\n * Optional ref to the element that should receive focus when the\n * dialog opens. When omitted, focus moves to the first focusable\n * descendant — but the close-X is usually that, which is rarely\n * what callers want. PromptDialog passes its input ref here.\n */\n initialFocusRef?: RefObject<HTMLElement | null>;\n}) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n\n // Stash the latest `onClose` and `initialFocusRef` in refs so the\n // mount-time effect doesn't depend on them. Without this, callers\n // who pass an inline arrow (`onClose={() => setOpen(false)}`) — the\n // common case — give us a NEW function reference every render. With\n // those props in the dep array, every keystroke that re-renders\n // the parent retriggers our effect: cleanup steals focus back to\n // the trigger, then setTimeout re-focuses the first focusable\n // (the header X), so the user types one char then loses focus to\n // the close button. Refs let us read the latest callback inside\n // the handler without forcing the effect to re-run.\n const onCloseRef = useRef(onClose);\n const initialFocusRefRef = useRef(initialFocusRef);\n useEffect(() => {\n onCloseRef.current = onClose;\n });\n useEffect(() => {\n initialFocusRefRef.current = initialFocusRef;\n });\n\n useEffect(() => {\n if (!open) return undefined;\n // Capture the trigger so we can restore focus to it on close —\n // standard a11y pattern, keeps keyboard users on the same row of\n // the UI they just acted on. Also snapshot the dialog DOM node\n // here so the cleanup contains() check still works after React\n // has cleared the ref on unmount.\n const previouslyFocused = document.activeElement as HTMLElement | null;\n const dialogNode = dialogRef.current;\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCloseRef.current();\n return;\n }\n if (e.key === \"Tab\" && dialogRef.current !== null) {\n // Tiny focus trap: collect focusable descendants, wrap the\n // selection at the boundaries. Good enough for our dialogs;\n // not a fully spec-compliant trap.\n const focusables = dialogRef.current.querySelectorAll<HTMLElement>(\n 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n if (focusables.length === 0) return;\n const first = focusables[0]!;\n const last = focusables[focusables.length - 1]!;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener(\"keydown\", onKey);\n // Initial focus: prefer the caller-provided ref (input field for\n // PromptDialog) over \"first focusable\" — which would land on the\n // header X button and require Tab before the user could type.\n const id = window.setTimeout(() => {\n const focusTarget = initialFocusRefRef.current?.current;\n if (focusTarget !== undefined && focusTarget !== null) {\n focusTarget.focus();\n return;\n }\n const first = dialogRef.current?.querySelector<HTMLElement>(\n 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n first?.focus();\n }, 0);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n window.clearTimeout(id);\n // Restore focus only if it's still inside our dialog. If the\n // user clicked elsewhere on the page since open, don't yank\n // their focus back.\n if (\n previouslyFocused !== null &&\n document.contains(previouslyFocused) &&\n dialogNode !== null &&\n dialogNode.contains(document.activeElement)\n ) {\n previouslyFocused.focus();\n }\n };\n }, [open]);\n\n if (!open) return null;\n return (\n <div\n className=\"modal-overlay\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n >\n <div\n ref={dialogRef}\n className=\"modal-dialog\"\n style={width !== undefined ? { maxWidth: width } : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n <header className=\"modal-header\">\n <h2 id={titleId} className=\"modal-title\">\n {title}\n </h2>\n <button\n onClick={onClose}\n className=\"modal-close-btn\"\n title=\"Close (Esc)\"\n aria-label=\"Close\"\n >\n <X size={18} />\n </button>\n </header>\n {children}\n </div>\n </div>\n );\n}\n\n/**\n * Text-input prompt. Replaces `window.prompt(message)`. Calls\n * `onSubmit` with the trimmed value when the user hits Enter or\n * clicks the primary button; calls `onClose` on Esc / backdrop /\n * Cancel. Empty submissions are blocked by disabling the primary\n * button.\n */\nexport function PromptDialog({\n open,\n onClose,\n onSubmit,\n title,\n label,\n initialValue = \"\",\n placeholder,\n primaryLabel = \"OK\",\n}: {\n open: boolean;\n onClose: () => void;\n onSubmit: (value: string) => void;\n title: string;\n label: string;\n initialValue?: string;\n placeholder?: string;\n primaryLabel?: string;\n}) {\n const [value, setValue] = useState(initialValue);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Reset the draft each time the dialog opens.\n useEffect(() => {\n if (open) setValue(initialValue);\n }, [open, initialValue]);\n\n const trimmed = value.trim();\n const submit = (): void => {\n if (trimmed.length === 0) return;\n onSubmit(trimmed);\n };\n\n return (\n <Modal open={open} onClose={onClose} title={title} initialFocusRef={inputRef}>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n submit();\n }}\n className=\"prompt-form modal-body\"\n >\n <label className=\"prompt-label\">\n <span className=\"prompt-label-text\">{label}</span>\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n className=\"prompt-input\"\n />\n </label>\n <footer className=\"confirm-footer\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"confirm-btn-cancel\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={trimmed.length === 0}\n className=\"confirm-btn-primary\"\n >\n {primaryLabel}\n </button>\n </footer>\n </form>\n </Modal>\n );\n}\n\n/**\n * Confirmation dialog. Replaces `window.confirm(message)`. The\n * `tone=\"danger\"` variant red-tints the primary button — used for\n * destructive operations (delete, etc.).\n */\nexport function ConfirmDialog({\n open,\n onClose,\n onConfirm,\n title,\n message,\n primaryLabel = \"Confirm\",\n tone = \"default\",\n}: {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n message: string;\n primaryLabel?: string;\n tone?: \"default\" | \"danger\";\n}) {\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"modal-body\">\n <p className=\"confirm-message\">{message}</p>\n <footer className=\"confirm-footer\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"confirm-btn-cancel\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n className={tone === \"danger\" ? \"confirm-btn-danger\" : \"confirm-btn-primary\"}\n >\n {primaryLabel}\n </button>\n </footer>\n </div>\n </Modal>\n );\n}\n","import { useEffect, useState } from \"react\";\n\n/** Hook: auto-clears a \"saved\" flash after 2.5s. */\nexport function useSavedFlash(\n savedAt: number | undefined,\n clear: () => void,\n): void {\n useEffect(() => {\n if (savedAt === undefined) return undefined;\n const id = window.setTimeout(clear, 2500);\n return () => window.clearTimeout(id);\n }, [savedAt, clear]);\n}\n\n/** Format an unknown error to a readable string. */\nexport function errorMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/** Shared field wrapper with label and optional hint. */\nexport function Field({\n label,\n hint,\n children,\n}: {\n label: string;\n hint?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"settings-field\">\n <label className=\"settings-label\">{label}</label>\n {hint !== undefined && <p className=\"settings-hint\">{hint}</p>}\n {children}\n </div>\n );\n}\n\n/** Text input with save button. */\nexport function TextSetting({\n value,\n onSave,\n disabled,\n}: {\n value: string;\n onSave: (v: string) => void | Promise<void>;\n disabled: boolean;\n}) {\n const [draft, setDraft] = useState(value);\n useEffect(() => setDraft(value), [value]);\n const dirty = draft !== value;\n return (\n <div className=\"settings-field-row\">\n <input\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n disabled={disabled}\n className=\"settings-input\"\n />\n <button\n onClick={() => void onSave(draft)}\n disabled={disabled || !dirty}\n className=\"settings-btn settings-btn-primary\"\n >\n Save\n </button>\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport {\n fetchProviders,\n getAuthSummary,\n setApiKey,\n removeApiKey,\n getModelsJson,\n putModelsJson,\n removeCustomProvider,\n type ProvidersResponse,\n type AuthSummaryResponse,\n} from \"../../lib/api-client\";\nimport { AddProviderDialog } from \"../AddProviderDialog\";\nimport { ConfirmDialog } from \"../Modal\";\nimport { errorMsg } from \"./shared\";\n\ninterface Props {\n onError: (msg: string | undefined) => void;\n}\n\nexport function ProvidersTab({ onError }: Props) {\n const [providers, setProviders] = useState<ProvidersResponse | undefined>(undefined);\n const [auth, setAuth] = useState<AuthSummaryResponse | undefined>(undefined);\n const [showAddDialog, setShowAddDialog] = useState(false);\n const [customProviders, setCustomProviders] = useState<Set<string>>(new Set());\n const [removingProvider, setRemovingProvider] = useState<string | undefined>(undefined);\n const [editingProvider, setEditingProvider] = useState<string | undefined>(undefined);\n const [keyDraft, setKeyDraft] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [showModelsJson, setShowModelsJson] = useState(false);\n const [rawJson, setRawJson] = useState<string | undefined>(undefined);\n const [jsonSavedAt, setJsonSavedAt] = useState<number | undefined>(undefined);\n\n const refresh = async (): Promise<void> => {\n onError(undefined);\n try {\n const [p, a, m] = await Promise.all([\n fetchProviders(),\n getAuthSummary(),\n getModelsJson(),\n ]);\n setProviders(p);\n setAuth(a);\n const custom = new Set(Object.keys(m.providers));\n setCustomProviders(custom);\n } catch (err) {\n onError(`Failed to load providers: ${errorMsg(err)}`);\n }\n };\n\n useEffect(() => {\n void refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const saveKey = async (provider: string): Promise<void> => {\n if (keyDraft.trim().length === 0) return;\n setBusy(true);\n try {\n await setApiKey(provider, keyDraft.trim());\n setEditingProvider(undefined);\n setKeyDraft(\"\");\n await refresh();\n } catch (err) {\n onError(`Save key failed: ${errorMsg(err)}`);\n } finally {\n setBusy(false);\n }\n };\n\n const removeKey = async (provider: string): Promise<void> => {\n if (!confirm(`Remove the stored key for \"${provider}\"?`)) return;\n setBusy(true);\n try {\n await removeApiKey(provider);\n await refresh();\n } catch (err) {\n onError(`Remove key failed: ${errorMsg(err)}`);\n } finally {\n setBusy(false);\n }\n };\n\n const saveRawJson = async (): Promise<void> => {\n if (rawJson === undefined) return;\n setBusy(true);\n try {\n const parsed = JSON.parse(rawJson);\n await putModelsJson(parsed);\n setJsonSavedAt(Date.now());\n await refresh();\n } catch {\n onError(\"models.json: invalid JSON\");\n } finally {\n setBusy(false);\n }\n };\n\n const loadModelsJson = async (): Promise<void> => {\n try {\n const m = await getModelsJson();\n setRawJson(JSON.stringify(m, null, 2));\n } catch (err) {\n onError(`Load models.json failed: ${errorMsg(err)}`);\n }\n };\n\n if (providers === undefined) {\n return <p className=\"settings-hint\">Loading providers…</p>;\n }\n\n return (\n <div className=\"space-y-3\">\n <p className=\"settings-hint\">\n Built-in providers and anything in <code className=\"font-mono\">models.json</code>. Stored\n API keys are presence-only — actual values are never sent to the browser.\n </p>\n {providers.providers.length === 0 && (\n <p className=\"settings-hint italic\">No providers configured.</p>\n )}\n {providers.providers.map((p) => {\n const presence = auth?.providers[p.provider];\n const configured = presence?.configured === true;\n const editing = editingProvider === p.provider;\n return (\n <div key={p.provider} className=\"settings-card\">\n <div className=\"settings-card-header\">\n <div className=\"settings-card-left\">\n <span className=\"font-mono text-sm\">{p.provider}</span>\n <span className={`settings-badge ${configured ? \"settings-badge-on\" : \"settings-badge-off\"}`}>\n {configured ? \"key set\" : \"no key\"}\n </span>\n {customProviders.has(p.provider) && (\n <span className=\"settings-badge-custom\">models.json</span>\n )}\n {presence?.source !== undefined && (\n <span className=\"text-xs text-dim\">via {presence.source}</span>\n )}\n </div>\n <div className=\"settings-card-actions\">\n {!editing && (\n <button\n onClick={() => {\n setEditingProvider(p.provider);\n setKeyDraft(\"\");\n }}\n className=\"settings-btn\"\n >\n {configured ? \"Replace key\" : \"Add key\"}\n </button>\n )}\n {configured && !editing && (\n <button\n onClick={() => void removeKey(p.provider)}\n disabled={busy}\n className=\"settings-btn settings-btn-danger\"\n >\n Remove\n </button>\n )}\n {customProviders.has(p.provider) && !editing && (\n <button\n onClick={() => setRemovingProvider(p.provider)}\n disabled={busy}\n className=\"settings-btn-delete\"\n title=\"Remove from models.json\"\n >\n Delete provider\n </button>\n )}\n </div>\n </div>\n {editing && (\n <div className=\"settings-card-edit\">\n <input\n type=\"password\"\n value={keyDraft}\n onChange={(e) => setKeyDraft(e.target.value)}\n placeholder=\"Paste API key\"\n autoFocus\n className=\"settings-input\"\n />\n <button\n onClick={() => void saveKey(p.provider)}\n disabled={busy || keyDraft.trim().length === 0}\n className=\"settings-btn settings-btn-primary\"\n >\n {busy ? \"Saving…\" : \"Save\"}\n </button>\n <button\n onClick={() => {\n setEditingProvider(undefined);\n setKeyDraft(\"\");\n }}\n className=\"settings-btn\"\n >\n Cancel\n </button>\n </div>\n )}\n <details className=\"settings-details\">\n <summary className=\"settings-summary\">\n {p.models.length} model{p.models.length === 1 ? \"\" : \"s\"}\n </summary>\n <ul className=\"settings-model-list\">\n {p.models.map((m) => (\n <li key={m.id} className=\"settings-model-item\">\n <span className={m.hasAuth ? \"\" : \"text-dim\"}>{m.name}</span>\n <span className=\"text-dim\">ctx {Math.round(m.contextWindow / 1000)}k</span>\n </li>\n ))}\n </ul>\n </details>\n </div>\n );\n })}\n\n <div className=\"add-provider-actions\" style={{ marginTop: 16, marginBottom: 8 }}>\n <button\n onClick={() => setShowAddDialog(true)}\n className=\"settings-btn settings-btn-primary\"\n >\n + Add Custom Provider\n </button>\n </div>\n\n <AddProviderDialog\n open={showAddDialog}\n onClose={() => {\n setShowAddDialog(false);\n void refresh();\n }}\n onError={onError}\n onSaved={() => {\n void refresh();\n }}\n />\n\n <ConfirmDialog\n open={removingProvider !== undefined}\n onClose={() => setRemovingProvider(undefined)}\n onConfirm={async () => {\n const name = removingProvider;\n setRemovingProvider(undefined);\n if (name === undefined) return;\n setBusy(true);\n try {\n await removeCustomProvider(name);\n await refresh();\n } catch (err) {\n onError(`Remove failed: ${errorMsg(err)}`);\n } finally {\n setBusy(false);\n }\n }}\n title=\"Delete provider\"\n message={`Remove \"${removingProvider ?? \"\"}\" from models.json? This can be undone by adding it again.`}\n primaryLabel=\"Delete\"\n tone=\"danger\"\n />\n\n <div className=\"settings-raw-json\">\n <button\n onClick={() => {\n if (showModelsJson) {\n setShowModelsJson(false);\n } else {\n setShowModelsJson(true);\n if (rawJson === undefined) void loadModelsJson();\n }\n }}\n className=\"settings-btn\"\n >\n {showModelsJson ? \"Hide\" : \"Show\"} models.json raw editor\n </button>\n {showModelsJson && rawJson !== undefined && (\n <div className=\"settings-json-area\">\n <textarea\n value={rawJson}\n onChange={(e) => setRawJson(e.target.value)}\n spellCheck={false}\n rows={12}\n className=\"settings-textarea\"\n />\n <div className=\"settings-json-actions\">\n {jsonSavedAt !== undefined && (\n <span className=\"settings-json-flash\">Saved</span>\n )}\n <button\n onClick={() => void loadModelsJson()}\n disabled={busy}\n className=\"settings-btn\"\n >\n Reload\n </button>\n <button\n onClick={() => void saveRawJson()}\n disabled={busy}\n className=\"settings-btn settings-btn-primary\"\n >\n {busy ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useMemo } from \"react\";\nimport {\n fetchProviders,\n getSettings,\n updateSettings,\n getEnabledModels,\n setEnabledModels as saveEnabledModels,\n type ProvidersResponse,\n} from \"../../lib/api-client\";\nimport { Field, errorMsg } from \"./shared\";\n\ninterface Props {\n onError: (msg: string | undefined) => void;\n}\n\nexport function AgentTab({ onError }: Props) {\n const [settings, setSettings] = useState<Record<string, unknown> | undefined>(undefined);\n const [allProviders, setAllProviders] = useState<ProvidersResponse | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState<string>(\"\");\n const [selectedModel, setSelectedModel] = useState<string>(\"\");\n const [orchProvider, setOrchProvider] = useState<string>(\"\");\n const [orchModel, setOrchModel] = useState<string>(\"\");\n\n // ── Scoped models state ──\n const [enabledModels, setEnabledModelsState] = useState<string[] | null>(null);\n const [scopedOn, setScopedOn] = useState(false);\n const [scopedDraft, setScopedDraft] = useState<string[] | null>(null);\n const [showScopePicker, setShowScopePicker] = useState(false);\n const [scopeSearch, setScopeSearch] = useState(\"\");\n\n const refresh = async (): Promise<void> => {\n onError(undefined);\n try {\n const [s, p, em] = await Promise.all([\n getSettings(),\n fetchProviders(),\n getEnabledModels(),\n ]);\n setSettings(s);\n setAllProviders(p);\n const models = em.enabledModels;\n setEnabledModelsState(models);\n setScopedOn(models !== null && !(Array.isArray(models) && models.length === 0));\n setScopedDraft(models);\n const sp = typeof s.defaultProvider === \"string\" ? s.defaultProvider : \"\";\n const sm = typeof s.defaultModel === \"string\" ? s.defaultModel : \"\";\n setSelectedProvider(sp);\n setSelectedModel(sm);\n setOrchProvider(typeof s.orchProvider === \"string\" ? s.orchProvider : \"\");\n setOrchModel(typeof s.orchModel === \"string\" ? s.orchModel : \"\");\n } catch (err) {\n onError(`Failed to load settings: ${errorMsg(err)}`);\n }\n };\n\n useEffect(() => {\n void refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const save = async (patch: Record<string, unknown>): Promise<void> => {\n setBusy(true);\n try {\n const next = await updateSettings(patch);\n setSettings(next);\n } catch (err) {\n onError(`Save failed: ${errorMsg(err)}`);\n } finally {\n setBusy(false);\n }\n };\n\n // ── Derive scoped provider listing ───────────────────────────────────\n const scopedProviders = useMemo(() => {\n if (!allProviders) return undefined;\n if (!scopedOn || enabledModels === null || enabledModels.length === 0) {\n return allProviders;\n }\n return {\n providers: allProviders.providers\n .map((p) => ({\n ...p,\n models: p.models.filter((m) =>\n enabledModels.includes(`${p.provider}/${m.id}`),\n ),\n }))\n .filter((p) => p.models.length > 0),\n };\n }, [allProviders, scopedOn, enabledModels]);\n\n const activeProviders = scopedOn ? scopedProviders : allProviders;\n const providerOptions = activeProviders\n ? activeProviders.providers.map((p) => ({ value: p.provider, label: p.provider }))\n : [];\n\n const currentGroup = activeProviders?.providers.find((p) => p.provider === selectedProvider);\n const modelOptions = currentGroup\n ? currentGroup.models.map((m) => ({ value: m.id, label: m.name }))\n : [];\n\n const orchGroup = activeProviders?.providers.find((p) => p.provider === orchProvider);\n const orchModelOptions = orchGroup\n ? orchGroup.models.map((m) => ({ value: m.id, label: m.name }))\n : [];\n\n const handleProviderChange = (v: string) => {\n setSelectedProvider(v);\n const group = activeProviders?.providers.find((p) => p.provider === v);\n const modelAvailable = group?.models.some((m) => m.id === selectedModel);\n if (!modelAvailable) setSelectedModel(\"\");\n void save({ defaultProvider: v.length === 0 ? null : v });\n };\n\n const handleModelChange = (v: string) => {\n setSelectedModel(v);\n void save({ defaultModel: v.length === 0 ? null : v });\n };\n\n const handleOrchProviderChange = (v: string) => {\n setOrchProvider(v);\n const group = activeProviders?.providers.find((p) => p.provider === v);\n const modelAvailable = group?.models.some((m) => m.id === orchModel);\n if (!modelAvailable) setOrchModel(\"\");\n void save({ orchProvider: v.length === 0 ? null : v });\n };\n\n const handleOrchModelChange = (v: string) => {\n setOrchModel(v);\n void save({ orchModel: v.length === 0 ? null : v });\n };\n\n // ── Scoped model handlers ────────────────────────────────────────────\n const persistScope = async (models: string[] | null): Promise<void> => {\n setBusy(true);\n try {\n await saveEnabledModels(models);\n setEnabledModelsState(models);\n setScopedOn(models !== null && !(Array.isArray(models) && models.length === 0));\n setScopedDraft(models);\n } catch (err) {\n onError(`Save scope failed: ${errorMsg(err)}`);\n } finally {\n setBusy(false);\n }\n };\n\n const toggleScopedOn = async (on: boolean) => {\n if (on) {\n const allIds = allProviders\n ? allProviders.providers.flatMap((p) => p.models.map((m) => `${p.provider}/${m.id}`))\n : [];\n const draft = scopedDraft ?? allIds;\n setScopedDraft(draft);\n setScopedOn(true);\n setShowScopePicker(true);\n } else {\n setShowScopePicker(false);\n await persistScope(null);\n }\n };\n\n const allModelEntries = useMemo(() => {\n if (!allProviders) return [];\n return allProviders.providers.flatMap((p) =>\n p.models\n .filter((m) => m.hasAuth)\n .map((m) => ({\n fullId: `${p.provider}/${m.id}`,\n provider: p.provider,\n modelName: m.name,\n modelId: m.id,\n hasAuth: m.hasAuth,\n })),\n );\n }, [allProviders]);\n\n const filteredEntries = useMemo(() => {\n if (!scopeSearch) return allModelEntries;\n const q = scopeSearch.toLowerCase();\n return allModelEntries.filter(\n (e) =>\n e.fullId.toLowerCase().includes(q) ||\n e.modelName.toLowerCase().includes(q) ||\n e.provider.toLowerCase().includes(q),\n );\n }, [allModelEntries, scopeSearch]);\n\n const toggleModelInDraft = (fullId: string) => {\n const draft = scopedDraft ?? allModelEntries.map((e) => e.fullId);\n const next = draft.includes(fullId)\n ? draft.filter((id) => id !== fullId)\n : [...draft, fullId];\n const allCount = allModelEntries.length;\n const isAllEnabled = next.length === allCount;\n setScopedDraft(isAllEnabled ? null : next);\n };\n\n const saveScopeDraft = async () => {\n await persistScope(scopedDraft);\n };\n\n if (settings === undefined) {\n return <p className=\"settings-hint\">Loading settings…</p>;\n }\n\n return (\n <div className=\"settings-fields\">\n <Field label=\"Default provider\" hint=\"Select an LLM provider\">\n <select\n value={selectedProvider}\n disabled={busy}\n onChange={(e) => handleProviderChange(e.target.value)}\n className=\"settings-select\"\n >\n <option value=\"\">(none)</option>\n {providerOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </Field>\n <Field label=\"Default model\" hint=\"Model from the selected provider\">\n <select\n value={selectedModel}\n disabled={busy || selectedProvider.length === 0}\n onChange={(e) => handleModelChange(e.target.value)}\n className=\"settings-select\"\n >\n <option value=\"\">(none)</option>\n {modelOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </Field>\n <Field label=\"Thinking level\" hint=\"off, minimal, low, medium, high, xhigh\">\n <SelectSetting\n value={\n settings && typeof settings.defaultThinkingLevel === \"string\"\n ? settings.defaultThinkingLevel\n : \"\"\n }\n options={[\"\", \"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"]}\n onSave={(v) => save({ defaultThinkingLevel: v.length === 0 ? null : v })}\n disabled={busy}\n />\n </Field>\n\n <hr className=\"settings-divider\" />\n\n <p className=\"settings-section-title\">Model Scope</p>\n <div className=\"settings-field\">\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n cursor: \"pointer\",\n userSelect: \"none\",\n fontSize: 13,\n color: \"var(--text-secondary)\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={scopedOn}\n onChange={(e) => void toggleScopedOn(e.target.checked)}\n style={{\n width: 16,\n height: 16,\n accentColor: \"var(--accent-text)\",\n cursor: \"pointer\",\n }}\n />\n Hide unused models — only show selected models in dropdowns\n </label>\n {scopedOn && !showScopePicker && (\n <div style={{ marginTop: 8 }}>\n <span style={{ fontSize: 12, color: \"var(--text-secondary)\" }}>\n {scopedDraft === null\n ? \"All models visible\"\n : `${scopedDraft.length} of ${allModelEntries.length} models selected`}\n </span>\n <button\n onClick={() => setShowScopePicker(true)}\n className=\"settings-btn\"\n style={{ marginLeft: 12 }}\n >\n Select models\n </button>\n </div>\n )}\n </div>\n\n {scopedOn && showScopePicker && (\n <div className=\"scope-picker-section\">\n <input\n type=\"text\"\n value={scopeSearch}\n onChange={(e) => setScopeSearch(e.target.value)}\n placeholder=\"Search models…\"\n className=\"settings-input\"\n style={{ marginBottom: 8, width: \"100%\" }}\n autoFocus\n />\n <div className=\"scope-model-list\">\n {filteredEntries.map((entry) => {\n const draft = scopedDraft ?? allModelEntries.map((e) => e.fullId);\n const checked = draft.includes(entry.fullId);\n return (\n <label\n key={entry.fullId}\n className=\"scope-model-item\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n cursor: \"pointer\",\n padding: \"4px 0\",\n fontSize: 13,\n userSelect: \"none\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggleModelInDraft(entry.fullId)}\n style={{\n width: 14,\n height: 14,\n accentColor: \"var(--accent-text)\",\n cursor: \"pointer\",\n flexShrink: 0,\n }}\n />\n <span\n style={{\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: 12,\n color: \"var(--text-secondary)\",\n }}\n >\n {entry.provider}/\n </span>\n <span style={{ fontSize: 13 }}>{entry.modelName}</span>\n {!entry.hasAuth && (\n <span className=\"settings-badge settings-badge-off\">\n no key\n </span>\n )}\n </label>\n );\n })}\n {filteredEntries.length === 0 && (\n <p style={{ fontSize: 12, color: \"var(--text-secondary)\", padding: \"8px 0\" }}>\n No models match “{scopeSearch}”\n </p>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 8, marginTop: 10 }}>\n <button\n onClick={() => void saveScopeDraft()}\n disabled={busy}\n className=\"settings-btn settings-btn-primary\"\n >\n {busy ? \"Saving…\" : \"Save selection\"}\n </button>\n <button\n onClick={() => {\n setShowScopePicker(false);\n setScopeSearch(\"\");\n setScopedDraft(enabledModels);\n if (enabledModels === null || enabledModels.length === 0) {\n setScopedOn(false);\n }\n }}\n className=\"settings-btn\"\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n <hr className=\"settings-divider\" />\n\n <p className=\"settings-section-title\">Orchestrator</p>\n <Field label=\"Orch provider\" hint=\"Model for supervisor/worker sessions (leave empty to use default)\">\n <select\n value={orchProvider}\n disabled={busy}\n onChange={(e) => handleOrchProviderChange(e.target.value)}\n className=\"settings-select\"\n >\n <option value=\"\">(use default)</option>\n {providerOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </Field>\n <Field label=\"Orch model\" hint=\"Model for supervisor/worker sessions\">\n <select\n value={orchModel}\n disabled={busy || orchProvider.length === 0}\n onChange={(e) => handleOrchModelChange(e.target.value)}\n className=\"settings-select\"\n >\n <option value=\"\">(use default)</option>\n {orchModelOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </Field>\n </div>\n );\n}\n\n// ── Inline select setting (used locally) ───────────────────────────────\n\nfunction SelectSetting({\n value,\n options,\n onSave,\n disabled,\n}: {\n value: string;\n options: string[];\n onSave: (v: string) => void | Promise<void>;\n disabled: boolean;\n}) {\n return (\n <select\n value={value}\n disabled={disabled}\n onChange={(e) => void onSave(e.target.value)}\n className=\"settings-select\"\n >\n {options.map((o) => (\n <option key={o} value={o}>\n {o.length === 0 ? \"(unset)\" : o}\n </option>\n ))}\n </select>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { getVersions, checkSdkUpdate } from \"../../lib/api-client\";\nimport { errorMsg } from \"./shared\";\n\nexport function GeneralTab() {\n const [versions, setVersions] = useState<{ serverVersion: string; sdkVersion: string } | undefined>(undefined);\n const [checkResult, setCheckResult] = useState<{\n latestSdkVersion: string;\n updateAvailable: boolean;\n error?: string;\n } | undefined>(undefined);\n const [checking, setChecking] = useState(false);\n\n useEffect(() => {\n getVersions()\n .then(setVersions)\n .catch(() => {});\n }, []);\n\n const handleCheckUpdate = async () => {\n setChecking(true);\n setCheckResult(undefined);\n try {\n const res = await checkSdkUpdate();\n setCheckResult({\n latestSdkVersion: res.latestSdkVersion,\n updateAvailable: res.updateAvailable,\n });\n } catch (err) {\n setCheckResult({ latestSdkVersion: \"?\", updateAvailable: false, error: errorMsg(err) });\n } finally {\n setChecking(false);\n }\n };\n\n return (\n <div className=\"settings-fields\">\n <div className=\"settings-field\">\n <label className=\"settings-label\">About</label>\n <p className=\"settings-hint\">\n pi-kot — a web UI for the pi coding agent.\n </p>\n </div>\n\n <hr className=\"settings-divider\" />\n\n <div className=\"settings-field\">\n <label className=\"settings-label\">Versions</label>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, marginTop: 4 }}>\n <div style={{ display: \"flex\", gap: 16, fontSize: 13, alignItems: \"center\" }}>\n <span style={{ color: \"var(--text-secondary)\", minWidth: 100 }}>pi-kot server</span>\n <span style={{ fontFamily: \"var(--font-mono, monospace)\", fontWeight: 600 }}>\n {versions?.serverVersion ?? \"…\"}\n </span>\n </div>\n <div style={{ display: \"flex\", gap: 16, fontSize: 13, alignItems: \"center\" }}>\n <span style={{ color: \"var(--text-secondary)\", minWidth: 100 }}>pi SDK</span>\n <span style={{ fontFamily: \"var(--font-mono, monospace)\", fontWeight: 600 }}>\n {versions?.sdkVersion ?? \"…\"}\n </span>\n </div>\n {checkResult !== undefined && (\n <div style={{ display: \"flex\", gap: 16, fontSize: 13, alignItems: \"center\" }}>\n <span style={{ color: \"var(--text-secondary)\", minWidth: 100 }}>Latest SDK</span>\n <span style={{ fontFamily: \"var(--font-mono, monospace)\", fontWeight: 600 }}>\n {checkResult.error !== undefined ? (\n <span style={{ color: \"var(--danger, #e74c3c)\" }}>Check failed</span>\n ) : (\n checkResult.latestSdkVersion\n )}\n </span>\n {checkResult.error === undefined && checkResult.updateAvailable && (\n <span style={{\n fontSize: 11,\n color: \"#fff\",\n background: \"var(--accent-text, #3b82f6)\",\n padding: \"1px 8px\",\n borderRadius: 4,\n fontWeight: 600,\n }}>\n Update available\n </span>\n )}\n {checkResult.error === undefined && !checkResult.updateAvailable && (\n <span style={{ fontSize: 11, color: \"var(--text-secondary)\" }}>Up to date</span>\n )}\n </div>\n )}\n {checkResult?.error !== undefined && (\n <p style={{ fontSize: 12, color: \"var(--danger, #e74c3c)\", margin: 0 }}>\n {checkResult.error}\n </p>\n )}\n </div>\n <div style={{ marginTop: 10, display: \"flex\", gap: 8 }}>\n <button\n onClick={() => void handleCheckUpdate()}\n disabled={checking}\n className=\"settings-btn\"\n >\n {checking ? \"Checking…\" : checkResult !== undefined ? \"Check again\" : \"Check for updates\"}\n </button>\n </div>\n </div>\n\n <hr className=\"settings-divider\" />\n\n <div className=\"settings-field\">\n <button\n onClick={() => window.location.reload()}\n className=\"settings-btn\"\n >\n Reload page\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Extensions Tab — runtime extension discovery and curated recommendations.\n *\n * Shows what pi.dev extensions are installed, and recommends optimised ones.\n */\n\nimport { useEffect, useState, useCallback } from \"react\";\nimport {\n fetchExtensions,\n fetchSessionExtensions,\n installExtension as installExtApi,\n installManualExtension as installManualApi,\n uninstallExtension as uninstallExtApi,\n checkExtensionUpdates,\n updateExtension as updateExtApi,\n reloadAgent,\n getVisionConfig,\n setVisionConfig,\n fetchProviders,\n listTools,\n setToolEnabled,\n REASONING_LEVELS,\n type ExtensionsResponse,\n type RecommendedExtension,\n type DiscoveredExtension,\n type AgentDef,\n type ExtensionUpdateInfo,\n type VisionConfigResponse,\n type SetVisionConfigPayload,\n type ProviderGroup,\n type SessionExtensionInfo,\n type ToolListing,\n type ReasoningLevel,\n} from \"../lib/api-client\";\nimport { useSessionStore } from \"../stores/session-store\";\n\n// ── Styles (inline for self-contained component) ──────────────────────\n\nconst s = {\n section: {\n marginBottom: 24,\n } as React.CSSProperties,\n heading: {\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--text-primary)\",\n marginBottom: 8,\n } as React.CSSProperties,\n subheading: {\n fontSize: 11,\n color: \"var(--text-dim)\",\n marginBottom: 8,\n } as React.CSSProperties,\n card: {\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 10,\n padding: \"10px 12px\",\n borderRadius: 8,\n background: \"var(--bg-glass)\",\n border: \"1px solid var(--border-color)\",\n marginBottom: 8,\n } as React.CSSProperties,\n cardIcon: {\n fontSize: 20,\n lineHeight: 1,\n marginTop: 2,\n } as React.CSSProperties,\n cardBody: {\n flex: 1,\n minWidth: 0,\n } as React.CSSProperties,\n cardTitle: {\n fontSize: 12,\n fontWeight: 600,\n color: \"var(--text-primary)\",\n marginBottom: 2,\n } as React.CSSProperties,\n cardDesc: {\n fontSize: 11,\n color: \"var(--text-secondary)\",\n lineHeight: 1.4,\n } as React.CSSProperties,\n cardMeta: {\n fontSize: 10,\n color: \"var(--text-dim)\",\n marginTop: 4,\n display: \"flex\",\n gap: 8,\n flexWrap: \"wrap\",\n } as React.CSSProperties,\n tag: {\n display: \"inline-block\",\n padding: \"1px 6px\",\n borderRadius: 4,\n fontSize: 10,\n fontWeight: 600,\n } as React.CSSProperties,\n badge: {\n display: \"inline-block\",\n padding: \"1px 6px\",\n borderRadius: 4,\n fontSize: 10,\n fontWeight: 600,\n } as React.CSSProperties,\n installBtn: {\n padding: \"4px 12px\",\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 6,\n cursor: \"pointer\",\n border: \"1px solid var(--border-color)\",\n whiteSpace: \"nowrap\" as const,\n } as React.CSSProperties,\n categoryGroup: {\n marginBottom: 12,\n } as React.CSSProperties,\n agentConfigRow: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 8px\",\n fontSize: 11,\n borderBottom: \"1px solid var(--border-color)\",\n } as React.CSSProperties,\n reloadBtn: {\n float: \"right\" as const,\n padding: \"2px 8px\",\n fontSize: 10,\n borderRadius: 4,\n cursor: \"pointer\",\n border: \"1px solid var(--border-color)\",\n background: \"none\",\n color: \"var(--text-dim)\",\n } as React.CSSProperties,\n empty: {\n fontSize: 11,\n color: \"var(--text-dim)\",\n fontStyle: \"italic\",\n padding: \"12px 0\",\n textAlign: \"center\" as const,\n } as React.CSSProperties,\n};\n\n// ── Shared input/select styles for vision tool settings ──\nconst inputStyle: React.CSSProperties = {\n width: 80,\n padding: \"4px 6px\",\n fontSize: 11,\n borderRadius: 6,\n border: \"1px solid var(--border-color)\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-primary)\",\n outline: \"none\",\n};\nconst selectStyle: React.CSSProperties = {\n width: 110,\n padding: \"4px 6px\",\n fontSize: 11,\n borderRadius: 6,\n border: \"1px solid var(--border-color)\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-primary)\",\n outline: \"none\",\n cursor: \"pointer\",\n};\n\n// ── Category labels ────────────────────────────────────────────────────\n\nconst categoryLabels: Record<string, string> = {\n orchestration: \"🎯 Orchestration\",\n tools: \"🛠️ Tools & Integrations\",\n productivity: \"⚡ Productivity\",\n integration: \"🔗 Integrations\",\n ui: \"🎨 UI Enhancements\",\n};\n\n// ── Main Component ─────────────────────────────────────────────────────\n\nexport function ExtensionsTab({ onError }: { onError: (msg: string) => void }) {\n const [data, setData] = useState<ExtensionsResponse | null>(null);\n const [loading, setLoading] = useState(true);\n const [activeSessionExts, setActiveSessionExts] = useState<SessionExtensionInfo | null>(null);\n const activeSessionId = useSessionStore((s) => s.activeSessionId);\n const [installing, setInstalling] = useState<string | null>(null);\n const [uninstalling, setUninstalling] = useState<string | null>(null);\n const [updating, setUpdating] = useState<string | null>(null);\n const [reloading, setReloading] = useState(false);\n const [reloadSuccess, setReloadSuccess] = useState(false);\n const [refreshing, setRefreshing] = useState(0);\n const [updates, setUpdates] = useState<ExtensionUpdateInfo[] | undefined>(undefined);\n const [checkingUpdates, setCheckingUpdates] = useState(false);\n const [manualInput, setManualInput] = useState(\"\");\n const [manualInstalling, setManualInstalling] = useState(false);\n\n // ── Vision tool config (secret: only shown when pi-vision-tool is installed) ──\n const [visionConfig, setVisionConfigState] = useState<VisionConfigResponse | null>(null);\n const [visionProviders, setVisionProviders] = useState<ProviderGroup[]>([]);\n const [visionCfgSaving, setVisionCfgSaving] = useState(false);\n // ── Tool listing for extension tool toggles ──\n const [toolListing, setToolListing] = useState<ToolListing | undefined>(undefined);\n const [toolBusy, setToolBusy] = useState<string | undefined>(undefined);\n\n /** Match an extension's package name to tools registered by that package. */\n const matchToolsForExtension = (\n ext: DiscoveredExtension,\n listing: ToolListing,\n ): { tools: ToolListing[\"extension\"][number][\"tools\"]; loaded: boolean } => {\n const pkg = ext.package?.replace(\"npm:\", \"\");\n if (!pkg) return { tools: [], loaded: true };\n const matched = listing.extension.find(\n (extGroup) => extGroup.packageSource === pkg,\n );\n return {\n tools: matched?.tools ?? [],\n loaded: true,\n };\n };\n\n const load = useCallback(async () => {\n try {\n setLoading(true);\n const result = await fetchExtensions();\n setData(result);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n }, [onError]);\n\n useEffect(() => {\n load();\n }, [load, refreshing]);\n\n // Fetch tool listing for extension tool toggles\n useEffect(() => {\n listTools()\n .then(setToolListing)\n .catch(() => {});\n }, [refreshing]);\n\n const handleToggleTool = async (name: string, enabled: boolean) => {\n setToolBusy(name);\n try {\n await setToolEnabled(\"extension\", name, enabled, { scope: \"global\" });\n // Re-fetch to reflect state\n const updated = await listTools();\n setToolListing(updated);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setToolBusy(undefined);\n }\n };\n\n // Fetch active session extension info when session changes\n useEffect(() => {\n if (!activeSessionId) {\n setActiveSessionExts(null);\n return;\n }\n let cancelled = false;\n fetchSessionExtensions(activeSessionId)\n .then((info) => {\n if (!cancelled) setActiveSessionExts(info);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, [activeSessionId, refreshing]);\n\n const handleUninstall = async (ext: DiscoveredExtension) => {\n const pkgId = ext.package ?? ext.name;\n if (!confirm(`Uninstall \"${ext.name}\"? It will be removed from the packages list and can be reinstalled from recommendations.`)) return;\n setUninstalling(ext.name);\n try {\n const result = await uninstallExtApi(pkgId);\n if (!result.success) {\n onError(result.error ?? \"Uninstall failed\");\n }\n setRefreshing((n) => n + 1);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setUninstalling(null);\n }\n };\n\n const handleInstall = async (ext: RecommendedExtension) => {\n setInstalling(ext.id);\n try {\n const result = await installExtApi(ext.package);\n if (!result.success) {\n onError(result.error ?? \"Install failed\");\n }\n // Refresh the list\n setRefreshing((n) => n + 1);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setInstalling(null);\n }\n };\n\n const handleCheckUpdates = async () => {\n setCheckingUpdates(true);\n try {\n const result = await checkExtensionUpdates();\n setUpdates(result);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setCheckingUpdates(false);\n }\n };\n\n const handleUpdate = async (pkg: string) => {\n setUpdating(pkg);\n try {\n const result = await updateExtApi(pkg);\n if (!result.success) {\n onError(result.error ?? \"Update failed\");\n }\n // Re-check updates after update\n setUpdates(undefined);\n setRefreshing((n) => n + 1);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setUpdating(null);\n }\n };\n\n const handleReload = async () => {\n setReloading(true);\n setReloadSuccess(false);\n try {\n await reloadAgent();\n // Server re-reads configs — just refresh our lists (no slow full page reload)\n setUpdates(undefined);\n setRefreshing((n) => n + 1);\n setReloadSuccess(true);\n setTimeout(() => setReloadSuccess(false), 2000);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setReloading(false);\n }\n };\n\n const handleManualInstall = async () => {\n const spec = manualInput.trim();\n if (spec.length === 0) return;\n setManualInstalling(true);\n try {\n const result = await installManualApi(spec);\n if (!result.success) {\n onError(result.error ?? \"Install failed\");\n }\n setManualInput(\"\");\n setRefreshing((n) => n + 1);\n setUpdates(undefined);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setManualInstalling(false);\n }\n };\n\n const hasSubagents = data?.detected.some(\n (d) =>\n d.agentTypes?.includes(\"scout\") ||\n d.agentTypes?.includes(\"planner\") ||\n d.agentTypes?.includes(\"worker\"),\n ) ?? false;\n\n // Also check recommended list for installed subagent providers\n const subagentInstalled = data?.recommended.some(\n (r) =>\n r.installed &&\n r.providesAgentTypes?.includes(\"scout\") &&\n r.providesAgentTypes?.includes(\"worker\"),\n ) ?? false;\n\n const showAgentSettings = hasSubagents || subagentInstalled;\n\n // ── Vision tool detection & providers fetch (MUST be before early return) ──\n const hasVisionTool =\n data?.detected.some(\n (d) => d.name === \"pi-vision-tool\" || d.package === \"npm:pi-vision-tool\",\n ) ?? false;\n\n useEffect(() => {\n if (!hasVisionTool) {\n setVisionConfigState(null);\n return;\n }\n getVisionConfig().then(setVisionConfigState).catch(() => {});\n fetchProviders().then((r) => setVisionProviders(r.providers)).catch(() => {});\n }, [hasVisionTool, refreshing]);\n\n if (loading && !data) {\n return <div style={{ padding: 16, fontSize: 12, color: \"var(--text-dim)\" }}>Loading extensions…</div>;\n }\n\n const handleSaveVisionConfig = async (\n patch: Partial<SetVisionConfigPayload>,\n ) => {\n setVisionCfgSaving(true);\n try {\n await setVisionConfig(patch);\n setVisionConfigState((prev) => (prev ? { ...prev, ...patch } : null) as VisionConfigResponse | null);\n } catch (err) {\n onError(err instanceof Error ? err.message : String(err));\n } finally {\n setVisionCfgSaving(false);\n }\n };\n\n // ── Agent Type Settings (shown when subagent extension is detected) ──\n\n return (\n <div style={{ fontSize: 12 }}>\n {/* ── Info banner ── */}\n <div\n style={{\n background: \"rgba(52, 211, 153, 0.1)\",\n border: \"1px solid rgba(52, 211, 153, 0.25)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n marginBottom: 16,\n fontSize: 11,\n color: \"#34d399\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <span style={{ fontSize: 16 }}>🔌</span>\n <span>\n Extensions are installed via <code style={{ fontSize: 10 }}>npm install</code> and\n auto-activated in all running sessions. Look for the{\" \"}\n <strong>Active</strong> badge.\n </span>\n </div>\n\n {/* ── Agent type settings (conditional) ── */}\n {showAgentSettings && (\n <div style={s.section}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div>\n <div style={s.heading}>🧩 Agent Type Settings</div>\n <div style={s.subheading}>\n Default models for each subagent type. Edit the agent markdown files in{\" \"}\n <code style={{ fontSize: 10 }}>~/.pi/agent/agents/</code> to change.\n </div>\n </div>\n <span style={s.badge}>pi-subagents detected</span>\n </div>\n\n <div\n style={{\n borderRadius: 8,\n border: \"1px solid var(--border-color)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n ...s.agentConfigRow,\n fontWeight: 600,\n fontSize: 10,\n color: \"var(--text-dim)\",\n textTransform: \"uppercase\" as const,\n borderBottom: \"2px solid var(--border-color)\",\n }}\n >\n <span style={{ width: 70 }}>Agent</span>\n <span style={{ flex: 1 }}>Default Model</span>\n <span style={{ width: 120 }}>Tools</span>\n <span style={{ width: 60, textAlign: \"right\" as const }}>Source</span>\n </div>\n\n {renderAgentRow({ name: \"scout\", description: \"Fast codebase recon\", model: \"claude-haiku-4-5\", tools: [\"read\", \"grep\", \"find\", \"ls\", \"bash\"], source: \"builtin\" }, data?.agents)}\n {renderAgentRow({ name: \"planner\", description: \"Implementation plans\", model: \"claude-sonnet-4-5\", tools: [\"read\", \"grep\", \"find\", \"ls\"], source: \"builtin\" }, data?.agents)}\n {renderAgentRow({ name: \"reviewer\", description: \"Code review & QA\", model: \"claude-sonnet-4-5\", tools: [\"read\", \"grep\", \"find\", \"ls\", \"bash\"], source: \"builtin\" }, data?.agents)}\n {renderAgentRow({ name: \"worker\", description: \"General-purpose execution\", model: \"claude-sonnet-4-5\", tools: [], source: \"builtin\" }, data?.agents)}\n </div>\n\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginTop: 6 }}>\n 💡 Install the <strong>pi-subagents</strong> extension below to activate these agent types.\n Models are set in <code>~/.pi/agent/agents/<name>.md</code> frontmatter.\n </div>\n </div>\n )}\n\n {/* ── Vision Tool Config (secret: only when pi-vision-tool is installed) ── */}\n {hasVisionTool && visionConfig?.installed && (\n <div style={s.section}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div>\n <div style={s.heading}>👁️ Vision Tool Settings</div>\n <div style={s.subheading}>\n Select which provider/model to delegate image analysis to.{\" \"}\n <code style={{ fontSize: 10 }}>describe_image</code> will route to this model.\n </div>\n </div>\n <span style={s.badge}>pi-vision-tool detected</span>\n </div>\n\n <div style={{ display: \"flex\", gap: 8, alignItems: \"end\", marginTop: 8 }}>\n <div style={{ flex: 1 }}>\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginBottom: 4 }}>Provider</div>\n <select\n value={visionConfig.provider ?? \"\"}\n onChange={(e) => {\n const p = e.target.value;\n // Reset model when provider changes\n const firstModel = visionProviders.find((g) => g.provider === p)?.models?.[0];\n void handleSaveVisionConfig({ provider: p, model: firstModel?.id ?? \"\" });\n }}\n style={{\n width: \"100%\",\n padding: \"6px 8px\",\n fontSize: 11,\n borderRadius: 6,\n border: \"1px solid var(--border-color)\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-primary)\",\n outline: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"\" disabled>Select provider…</option>\n {visionProviders.map((g) => (\n <option key={g.provider} value={g.provider}>{g.provider}</option>\n ))}\n </select>\n </div>\n\n <div style={{ flex: 1 }}>\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginBottom: 4 }}>Model</div>\n <select\n value={visionConfig.model ?? \"\"}\n onChange={(e) => {\n void handleSaveVisionConfig({ provider: visionConfig.provider ?? \"\", model: e.target.value });\n }}\n style={{\n width: \"100%\",\n padding: \"6px 8px\",\n fontSize: 11,\n borderRadius: 6,\n border: \"1px solid var(--border-color)\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-primary)\",\n outline: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"\" disabled>Select model…</option>\n {visionProviders\n .find((g) => g.provider === visionConfig.provider)\n ?.models?.filter((m) => m.input?.includes(\"image\"))\n .map((m) => (\n <option key={m.id} value={m.id}>{m.name ?? m.id}</option>\n ))}\n </select>\n </div>\n\n <div>\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginBottom: 4 }}> </div>\n {visionCfgSaving && <span style={{ fontSize: 10, color: \"var(--text-dim)\" }}>Saving…</span>}\n {!visionCfgSaving && visionConfig.provider && visionConfig.model && (\n <span style={{ fontSize: 10, color: \"#22c55e\" }}>✓ Saved</span>\n )}\n </div>\n </div>\n\n {/* ── Advanced vision settings ── */}\n <div style={{ display: \"flex\", gap: 12, flexWrap: \"wrap\", marginTop: 10 }}>\n {/* Enabled toggle */}\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 11, cursor: \"pointer\" }}>\n <input\n type=\"checkbox\"\n checked={visionConfig.enabled !== false}\n onChange={(e) =>\n void handleSaveVisionConfig({ enabled: e.target.checked })\n }\n />\n Enabled\n </label>\n\n {/* Max dimension */}\n <div>\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginBottom: 4 }}>Max dim (px)</div>\n <input\n type=\"number\"\n min={100}\n max={5000}\n value={visionConfig.maxDimension ?? 1568}\n onChange={(e) => {\n const v = parseInt(e.target.value, 10);\n if (!isNaN(v) && v >= 100 && v <= 5000)\n void handleSaveVisionConfig({ maxDimension: v });\n }}\n style={inputStyle}\n />\n </div>\n\n {/* JPEG quality */}\n <div>\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginBottom: 4 }}>JPEG quality</div>\n <input\n type=\"number\"\n min={1}\n max={100}\n value={visionConfig.jpegQuality ?? 85}\n onChange={(e) => {\n const v = parseInt(e.target.value, 10);\n if (!isNaN(v) && v >= 1 && v <= 100)\n void handleSaveVisionConfig({ jpegQuality: v });\n }}\n style={{ ...inputStyle, width: 70 }}\n />\n </div>\n\n {/* Reasoning effort */}\n <div>\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginBottom: 4 }}>Reasoning effort</div>\n <select\n value={visionConfig.defaultReasoningEffort ?? \"off\"}\n onChange={(e) =>\n void handleSaveVisionConfig({ defaultReasoningEffort: e.target.value as string })\n }\n style={selectStyle}\n >\n {REASONING_LEVELS.map((level) => (\n <option key={level} value={level}>{level}</option>\n ))}\n </select>\n </div>\n </div>\n\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginTop: 8 }}>\n Config saved to <code style={{ fontSize: 10 }}>~/.pi/agent/vision-tool.json</code>.\n </div>\n </div>\n )}\n\n {/* ── Detected / Installed ── */}\n <div style={s.section}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div style={s.heading}>📦 Installed Extensions</div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n onClick={handleCheckUpdates}\n disabled={checkingUpdates || loading}\n style={{\n ...s.reloadBtn,\n padding: \"2px 8px\",\n width: \"auto\",\n fontSize: 11,\n }}\n title=\"Check for updates\"\n >\n {checkingUpdates ? \"Checking...\" : \"Check Updates\"}\n </button>\n <button\n onClick={() => setRefreshing((n) => n + 1)}\n style={s.reloadBtn}\n title=\"Refresh\"\n >\n ↻\n </button>\n </div>\n </div>\n\n {!data || data.detected.length === 0 ? (\n <div style={s.empty}>\n No extensions detected. Install some from the recommendations below.\n </div>\n ) : (\n data.detected.map((ext, i) => {\n const extUpdate = updates?.find(\n (u) => u.package === (ext.package?.replace(\"npm:\", \"\") ?? ext.name),\n );\n // Check if this extension is active in the current session\n const extName = ext.name;\n const isActiveInSession = activeSessionExts?.activeExtensions.some(\n (ae) =>\n ae.displayPath === extName ||\n ae.displayPath.includes(extName) ||\n extName.includes(ae.displayPath),\n ) ?? false;\n return (\n <div key={`det-${i}`}>\n <InstalledCard\n ext={ext}\n update={extUpdate}\n active={isActiveInSession}\n sessionCommands={activeSessionExts?.commands ?? null}\n updating={updating === (ext.package ?? ext.name)}\n uninstalling={uninstalling === ext.name}\n onUninstall={handleUninstall}\n onUpdate={handleUpdate}\n tools={\n toolListing\n ? matchToolsForExtension(ext, toolListing).tools\n : undefined\n }\n onToggleTool={handleToggleTool}\n toolToolsLoaded={toolListing !== undefined}\n />\n </div>\n );\n })\n )}\n </div>\n\n {/* ── Recommended ── */}\n <div style={s.section}>\n <div style={s.heading}>💎 Recommended for pi-kot</div>\n <div style={s.subheading}>\n Curated pi.dev extensions optimised for the web UI. Click to install.\n </div>\n\n {groupByCategory(data?.recommended ?? []).map(([cat, exts]) => (\n <div key={cat} style={s.categoryGroup}>\n <div\n style={{\n fontSize: 11,\n fontWeight: 600,\n color: \"var(--text-secondary)\",\n marginBottom: 6,\n }}\n >\n {categoryLabels[cat] ?? cat}\n </div>\n\n {exts.map((ext) => (\n <RecommendedCard\n key={ext.id}\n ext={ext}\n installing={installing === ext.id}\n onInstall={() => handleInstall(ext)}\n />\n ))}\n </div>\n ))}\n </div>\n\n {/* ── Manual install ── */}\n <div style={s.section}>\n <div style={s.heading}>🔧 Manual Install</div>\n <div style={s.subheading}>\n Install any pi extension by its install spec. Delegates to{\" \"}\n <code style={{ fontSize: 10 }}>pi install <spec></code> CLI.\n </div>\n <div style={{ display: \"flex\", gap: 6, alignItems: \"center\" }}>\n <input\n type=\"text\"\n value={manualInput}\n onChange={(e) => setManualInput(e.target.value)}\n placeholder={\"e.g. npm:pi-free or git:github.com/apmantza/pi-free\"}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") void handleManualInstall();\n }}\n style={{\n flex: 1,\n padding: \"6px 10px\",\n fontSize: 11,\n fontFamily: \"monospace\",\n borderRadius: 6,\n border: \"1px solid var(--border-color)\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-primary)\",\n outline: \"none\",\n }}\n />\n <button\n onClick={handleManualInstall}\n disabled={manualInstalling || manualInput.trim().length === 0}\n style={{\n padding: \"6px 14px\",\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 6,\n cursor: \"pointer\",\n border: \"1px solid var(--border-color)\",\n background: manualInstalling ? \"var(--bg-glass)\" : \"var(--accent-bg, #3b82f6)\",\n color: manualInstalling ? \"var(--text-dim)\" : \"white\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {manualInstalling ? \"Installing…\" : \"pi install\"}\n </button>\n </div>\n </div>\n\n {/* ── Reload agent ── */}\n <div style={s.section}>\n <div style={s.heading}>🔄 Agent Reload</div>\n <div style={s.subheading}>\n Reload the pi agent configuration (MCP + extension cache) after installing\n or updating extensions. Fast — no full page reload.\n </div>\n <button\n onClick={handleReload}\n disabled={reloading}\n style={{\n padding: \"6px 14px\",\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 6,\n cursor: reloading ? \"default\" : \"pointer\",\n border: \"1px solid var(--border-color)\",\n background: reloading ? \"var(--bg-glass)\" : \"var(--accent-bg, #3b82f6)\",\n color: reloading ? \"var(--text-dim)\" : \"white\",\n }}\n >\n {reloading ? \"Reloading…\" : reloadSuccess ? \"Reloaded ✓\" : \"/reload\"}\n </button>\n </div>\n </div>\n );\n}\n\n// ── Sub-components ─────────────────────────────────────────────────────\n\nfunction renderAgentRow(\n builtin: AgentDef,\n userAgents: AgentDef[] | undefined,\n) {\n const override = userAgents?.find((a) => a.name === builtin.name);\n const agent = override ?? builtin;\n\n return (\n <div key={agent.name} style={s.agentConfigRow}>\n <span style={{ width: 70, fontWeight: 600 }}>{agent.name}</span>\n <span style={{ flex: 1, color: \"var(--text-secondary)\", fontFamily: \"monospace\", fontSize: 10 }}>\n {agent.model ?? \"—\"}\n </span>\n <span style={{ width: 120, color: \"var(--text-dim)\", fontSize: 10, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {agent.tools && agent.tools.length > 0 ? agent.tools.join(\", \") : \"(all)\"}\n </span>\n <span\n style={{\n width: 60,\n textAlign: \"right\",\n fontSize: 10,\n color: agent.source === \"file\" ? \"var(--accent-text)\" : \"var(--text-dim)\",\n }}\n >\n {agent.source === \"file\" ? \"custom\" : \"builtin\"}\n </span>\n </div>\n );\n}\n\nfunction InstalledCard({\n ext,\n update,\n active,\n sessionCommands,\n updating,\n uninstalling,\n onUninstall,\n onUpdate,\n tools,\n toolToolsLoaded,\n onToggleTool,\n}: {\n ext: DiscoveredExtension;\n update?: ExtensionUpdateInfo;\n active?: boolean;\n sessionCommands?: Array<{ name: string; invocationName: string; description: string }> | null;\n updating?: boolean;\n uninstalling: boolean;\n onUninstall: (ext: DiscoveredExtension) => void;\n onUpdate: (pkg: string) => void;\n tools?: ToolListing[\"extension\"][number][\"tools\"];\n toolToolsLoaded?: boolean;\n onToggleTool?: (name: string, enabled: boolean) => void;\n}) {\n // Find commands contributed by this extension (fuzzy match by name prefix)\n const extCmds = sessionCommands?.filter(\n (c) =>\n ext.name.includes(c.name) ||\n c.name.includes(ext.name.replace(/^npm:/, \"\")) ||\n ext.package?.includes(c.name) ||\n c.name.includes(ext.name),\n ) ?? [];\n\n const body = (\n <>\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 10,\n flex: 1,\n }}\n >\n <span style={s.cardIcon}>\n {ext.source === \"extensions_dir\" ? \"📄\" : ext.source === \"agents_dir\" ? \"🤖\" : \"📦\"}\n </span>\n <div style={s.cardBody}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <div style={s.cardTitle}>{ext.name}</div>\n {active && (\n <span\n style={{\n display: \"inline-block\",\n padding: \"1px 7px\",\n borderRadius: 10,\n fontSize: 10,\n fontWeight: 600,\n background: \"rgba(52, 211, 153, 0.15)\",\n color: \"#34d399\",\n border: \"1px solid rgba(52, 211, 153, 0.3)\",\n lineHeight: \"18px\",\n }}\n >\n Active\n </span>\n )}\n {update?.updateAvailable && (\n <span\n style={{\n display: \"inline-block\",\n padding: \"1px 7px\",\n borderRadius: 10,\n fontSize: 10,\n fontWeight: 600,\n background: \"rgba(34, 197, 94, 0.15)\",\n color: \"#22c55e\",\n border: \"1px solid rgba(34, 197, 94, 0.3)\",\n lineHeight: \"18px\",\n }}\n >\n {update.installed} → {update.latest}\n </span>\n )}\n </div>\n <div style={s.cardDesc}>{ext.description}</div>\n {update && !update.updateAvailable && update.installed && (\n <div style={{ ...s.cardMeta, color: \"var(--text-dim)\" }}>\n v{update.installed}\n </div>\n )}\n <div style={s.cardMeta}>\n <span\n style={{\n ...s.tag,\n background: ext.source === \"package\" ? \"var(--accent-subtle)\" : \"var(--bg-glass-hover)\",\n color: ext.source === \"package\" ? \"var(--accent-text)\" : \"var(--text-dim)\",\n }}\n >\n {ext.source === \"package\" ? \"npm package\" : ext.source === \"extensions_dir\" ? \"extension\" : ext.source === \"agents_dir\" ? \"agent\" : \"builtin\"}\n </span>\n {ext.agentTypes && ext.agentTypes.length > 0 && (\n <span style={{ color: \"var(--text-dim)\" }}>\n agents: {ext.agentTypes.join(\", \")}\n </span>\n )}\n {ext.enablesFeatures && ext.enablesFeatures.length > 0 && (\n <span style={{ color: \"var(--text-dim)\" }}>\n ✨ {ext.enablesFeatures[0]}\n {ext.enablesFeatures.length > 1 ? ` +${ext.enablesFeatures.length - 1}` : \"\"}\n </span>\n )}\n {extCmds.length > 0 && (\n <span style={{ color: \"var(--accent-text, #818cf8)\" }}>\n /{extCmds.map((c) => c.invocationName).join(\", /\")}\n </span>\n )}\n {tools !== undefined && (\n <span style={{ color: \"var(--text-dim)\" }}>\n {tools.length} tool{tools.length === 1 ? \"\" : \"s\"}\n </span>\n )}\n </div>\n </div>\n {ext.source === \"package\" && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4, flexShrink: 0 }}>\n {update?.updateAvailable && (\n <button\n onClick={() => onUpdate(ext.package ?? ext.name)}\n disabled={updating}\n style={{\n padding: \"4px 10px\",\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 6,\n cursor: \"pointer\",\n border: \"1px solid rgba(34, 197, 94, 0.4)\",\n background: updating ? \"var(--bg-glass)\" : \"rgba(34, 197, 94, 0.1)\",\n color: \"#22c55e\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {updating ? \"…\" : \"Update\"}\n </button>\n )}\n <button\n onClick={() => onUninstall(ext)}\n disabled={uninstalling}\n style={{\n padding: \"4px 10px\",\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 6,\n cursor: \"pointer\",\n border: \"1px solid rgba(224, 108, 117, 0.4)\",\n background: uninstalling ? \"var(--bg-glass)\" : \"rgba(224, 108, 117, 0.1)\",\n color: \"var(--accent-red, #e06c75)\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {uninstalling ? \"…\" : \"Uninstall\"}\n </button>\n </div>\n )}\n </div>\n {/* ── Tool toggles ── */}\n {tools !== undefined && toolToolsLoaded && (\n <ToolSection\n tools={tools}\n onToggle={onToggleTool}\n />\n )}\n </>\n );\n\n return (\n <div\n style={{\n borderRadius: 8,\n background: \"var(--bg-glass)\",\n border: \"1px solid var(--border-color)\",\n marginBottom: 8,\n overflow: \"hidden\",\n }}\n >\n <div style={{ padding: \"10px 12px\" }}>\n {body}\n </div>\n </div>\n );\n}\n\nfunction RecommendedCard({\n ext,\n installing,\n onInstall,\n}: {\n ext: RecommendedExtension;\n installing: boolean;\n onInstall: () => void;\n}) {\n const [installed, setInstalled] = useState(ext.installed);\n const [justInstalled, setJustInstalled] = useState(false);\n\n const handleClick = async () => {\n if (installed) return;\n setInstalled(true);\n setJustInstalled(true);\n onInstall();\n };\n\n return (\n <div\n style={{\n ...s.card,\n opacity: installed ? 0.7 : 1,\n }}\n >\n <span style={s.cardIcon}>{ext.icon}</span>\n <div style={s.cardBody}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <div style={s.cardTitle}>{ext.name}</div>\n {ext.verified && (\n <span\n style={{\n display: \"inline-block\",\n padding: \"1px 7px\",\n borderRadius: 10,\n fontSize: 10,\n fontWeight: 600,\n background: \"rgba(34, 197, 94, 0.15)\",\n color: \"#22c55e\",\n border: \"1px solid rgba(34, 197, 94, 0.3)\",\n lineHeight: \"18px\",\n }}\n >\n ✓ Verified\n </span>\n )}\n </div>\n <div style={s.cardDesc}>{ext.description}</div>\n <div style={s.cardMeta}>\n {ext.providesAgentTypes && ext.providesAgentTypes.length > 0 && (\n <span style={{ color: \"var(--text-dim)\" }}>\n agents: {ext.providesAgentTypes.join(\", \")}\n </span>\n )}\n {ext.enablesFeatures && ext.enablesFeatures.length > 0 && (\n <span style={{ color: \"var(--text-dim)\" }}>\n ✨ {ext.enablesFeatures.join(\" · \")}\n </span>\n )}\n </div>\n </div>\n <button\n onClick={handleClick}\n disabled={installed || installing}\n style={{\n ...s.installBtn,\n background: installed\n ? \"var(--accent-subtle)\"\n : \"var(--accent-bg, #3b82f6)\",\n color: installed ? \"var(--accent-text)\" : \"white\",\n borderColor: installed ? \"var(--accent-border)\" : \"transparent\",\n cursor: installed ? \"default\" : \"pointer\",\n }}\n >\n {installing ? \"…\" : installed ? \"✓ Installed\" : \"Install\"}\n </button>\n </div>\n );\n}\n\n// ── Tool Section (collapsible tool toggles) ─────────────────────────────\n\nfunction ToolSection({\n tools,\n onToggle,\n}: {\n tools: ToolListing[\"extension\"][number][\"tools\"];\n onToggle?: (name: string, enabled: boolean) => void;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n return (\n <div style={{ borderTop: \"1px solid var(--border-color)\", marginTop: 8 }}>\n <button\n onClick={() => setExpanded((e) => !e)}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"6px 12px\",\n fontSize: 11,\n fontWeight: 600,\n border: \"none\",\n background: \"transparent\",\n color: \"var(--text-secondary)\",\n cursor: \"pointer\",\n userSelect: \"none\",\n }}\n >\n <span>\n {expanded ? \"▾\" : \"▸\"} Tools ({tools.length})\n </span>\n </button>\n {expanded && (\n <div style={{ padding: \"0 12px 8px\", display: \"flex\", flexDirection: \"column\", gap: 3 }}>\n {tools.length === 0 && (\n <p style={{ fontSize: 11, fontStyle: \"italic\", color: \"var(--text-dim)\", padding: \"4px 8px\" }}>\n No tools registered yet. Start a session to load extension tools, or check the extension docs.\n </p>\n )}\n {tools.map((t) => (\n <ToolToggleRow\n key={t.name}\n tool={t}\n onToggle={onToggle}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolToggleRow({\n tool,\n onToggle,\n}: {\n tool: ToolListing[\"extension\"][number][\"tools\"][number];\n onToggle?: (name: string, enabled: boolean) => void;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"4px 8px\",\n borderRadius: 6,\n background: \"var(--bg-glass-hover, rgba(0,0,0,0.03))\",\n fontSize: 11,\n opacity: tool.globalEnabled ? 1 : 0.5,\n transition: \"opacity 0.15s\",\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n flexShrink: 0,\n background: tool.globalEnabled ? \"var(--success, #34d399)\" : \"var(--border)\",\n }}\n title={`Global: ${tool.globalEnabled ? \"enabled\" : \"disabled\"}`}\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <span\n style={{\n fontWeight: 600,\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: 11,\n color: \"var(--text-primary)\",\n }}\n >\n {tool.name}\n </span>\n {tool.description && (\n <p\n style={{\n margin: \"1px 0 0\",\n fontSize: 10,\n color: \"var(--text-dim)\",\n lineHeight: 1.3,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n title={tool.description}\n >\n {tool.description}\n </p>\n )}\n </div>\n {onToggle && (\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n cursor: \"pointer\",\n flexShrink: 0,\n userSelect: \"none\",\n }}\n title={`${tool.globalEnabled ? \"Disable\" : \"Enable\"} this tool globally`}\n >\n <input\n type=\"checkbox\"\n checked={tool.globalEnabled}\n onChange={(e) => onToggle(tool.name, e.target.checked)}\n style={{\n width: 13,\n height: 13,\n accentColor: \"var(--accent-text, #3b82f6)\",\n cursor: \"pointer\",\n }}\n />\n <span\n style={{\n fontSize: 10,\n color: tool.globalEnabled ? \"var(--success, #34d399)\" : \"var(--text-dim)\",\n fontWeight: 600,\n minWidth: 44,\n }}\n >\n {tool.globalEnabled ? \"on\" : \"off\"}\n </span>\n </label>\n )}\n </div>\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────\n\nfunction groupByCategory(\n items: RecommendedExtension[],\n): [string, RecommendedExtension[]][] {\n const map = new Map<string, RecommendedExtension[]>();\n for (const item of items) {\n const arr = map.get(item.category) ?? [];\n arr.push(item);\n map.set(item.category, arr);\n }\n return Array.from(map.entries());\n}\n","/**\n * SkillEditor — inline skill editor that replaces the skills list\n * inside the settings panel, below .settings-header.\n */\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport { getSkillDetail, updateSkill } from \"../lib/api-client\";\nimport type { SkillSummary } from \"../lib/api-client/types\";\n\ninterface Props {\n skill: SkillSummary;\n onBack: () => void;\n onSaved: () => void;\n onError: (msg: string) => void;\n}\n\nexport function SkillEditor({ skill, onBack, onSaved, onError: onErrorProp }: Props) {\n const onErrorRef = useRef(onErrorProp);\n onErrorRef.current = onErrorProp;\n const onSavedRef = useRef(onSaved);\n onSavedRef.current = onSaved;\n\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [description, setDescription] = useState(\"\");\n const [instructions, setInstructions] = useState(\"\");\n const [showPreview, setShowPreview] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Load skill content on mount\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n getSkillDetail(skill.name)\n .then((detail) => {\n if (cancelled) return;\n setDescription(detail.md.description ?? \"\");\n setInstructions(detail.md.instructions);\n })\n .catch((err) => {\n if (cancelled) return;\n const msg = `Failed to load skill: ${err instanceof Error ? err.message : String(err)}`;\n setError(msg);\n onErrorRef.current(msg);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [skill.name]);\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n try {\n await updateSkill(skill.name, { description, instructions });\n onSavedRef.current();\n onBack();\n } catch (err) {\n const msg = `Failed to save: ${err instanceof Error ? err.message : String(err)}`;\n setError(msg);\n onErrorRef.current(msg);\n } finally {\n setSaving(false);\n }\n }, [skill.name, description, instructions, onBack]);\n\n // ── Simple markdown render ────────────────────────────────────────\n\n const renderMarkdown = (text: string) =>\n text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/^### (.+)$/gm, '<h3 style=\"margin:12px 0 4px;font-size:15px;font-weight:600\">$1</h3>')\n .replace(/^## (.+)$/gm, '<h2 style=\"margin:14px 0 6px;font-size:17px;font-weight:600\">$1</h2>')\n .replace(/^# (.+)$/gm, '<h1 style=\"margin:16px 0 8px;font-size:19px;font-weight:600\">$1</h1>')\n .replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\")\n .replace(/\\*(.+?)\\*/g, \"<em>$1</em>\")\n .replace(/`(.+?)`/g, '<code style=\"background:var(--bg-glass);padding:1px 4px;border-radius:3px;font-family:var(--font-mono,monospace);font-size:0.9em\">$1</code>')\n .replace(/^- (.+)$/gm, '<li style=\"margin-left:16px\">$1</li>')\n .replace(/\\n/g, \"<br/>\");\n\n // ── Loading state ─────────────────────────────────────────────────\n\n if (loading) {\n return (\n <div style={{ padding: 24, textAlign: \"center\", color: \"var(--text-dim)\" }}>\n Loading…\n </div>\n );\n }\n\n // ── Error state ───────────────────────────────────────────────────\n\n if (error) {\n return (\n <div style={{ padding: 24 }}>\n <p style={{ color: \"var(--danger, #e74c3c)\", marginBottom: 12 }}>{error}</p>\n <button onClick={onBack} className=\"settings-btn\" style={{ fontSize: 12 }}>\n ← Back to skills\n </button>\n </div>\n );\n }\n\n // ── Editor ────────────────────────────────────────────────────────\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n padding: \"0 12px 12px\",\n }}\n >\n {/* Inline header: back button + skill name */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n marginBottom: 8,\n flexShrink: 0,\n }}\n >\n <button\n onClick={onBack}\n style={{\n padding: \"3px 8px\",\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 4,\n border: \"1px solid var(--border-color)\",\n background: \"transparent\",\n color: \"var(--text-secondary)\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: 0,\n }}\n >\n ← Back\n </button>\n <div style={{ minWidth: 0, flex: 1 }}>\n <div style={{ fontSize: 13, fontWeight: 600, color: \"var(--text-primary)\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {skill.name}\n </div>\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", marginTop: 1 }}>\n {skill.filePath.length > 70 ? \"…\" + skill.filePath.slice(-67) : skill.filePath}\n </div>\n </div>\n </div>\n\n {/* Description */}\n <div style={{ marginBottom: 6, flexShrink: 0 }}>\n <label\n style={{\n display: \"block\",\n fontSize: 11,\n fontWeight: 600,\n marginBottom: 4,\n color: \"var(--text-primary)\",\n }}\n >\n Description <span style={{ color: \"var(--danger, #e74c3c)\" }}>*</span>\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What does this skill do?\"\n rows={2}\n style={{\n width: \"100%\",\n resize: \"none\",\n minHeight: 38,\n padding: \"6px 10px\",\n fontSize: 12,\n fontFamily: \"inherit\",\n border: \"1px solid var(--border-color)\",\n borderRadius: 6,\n background: \"var(--bg-glass)\",\n color: \"var(--text-primary)\",\n boxSizing: \"border-box\",\n }}\n />\n </div>\n\n {/* Instructions */}\n <div style={{ display: \"flex\", flexDirection: \"column\", flex: 1, minHeight: 0 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: 4,\n flexShrink: 0,\n }}\n >\n <label style={{ fontSize: 11, fontWeight: 600, color: \"var(--text-primary)\" }}>\n Instructions\n </label>\n <button\n onClick={() => setShowPreview((p) => !p)}\n style={{\n fontSize: 10,\n padding: \"2px 8px\",\n borderRadius: 4,\n border: \"1px solid var(--border-color)\",\n background: showPreview ? \"var(--accent-bg)\" : \"transparent\",\n color: showPreview ? \"white\" : \"var(--text-dim)\",\n cursor: \"pointer\",\n fontWeight: 600,\n }}\n >\n {showPreview ? \"Edit\" : \"Preview\"}\n </button>\n </div>\n\n <div\n style={{\n flex: 1,\n minHeight: 0,\n border: \"1px solid var(--border-color)\",\n borderRadius: 6,\n overflow: \"hidden\",\n background: \"var(--bg-glass)\",\n }}\n >\n {showPreview ? (\n <div\n style={{\n padding: \"12px 16px\",\n fontSize: 12,\n lineHeight: 1.5,\n color: \"var(--text-primary)\",\n overflow: \"auto\",\n height: \"100%\",\n whiteSpace: \"pre-wrap\",\n }}\n dangerouslySetInnerHTML={{ __html: renderMarkdown(instructions) }}\n />\n ) : (\n <textarea\n value={instructions}\n onChange={(e) => setInstructions(e.target.value)}\n placeholder=\"Skill instructions (Markdown)…\"\n style={{\n width: \"100%\",\n height: \"100%\",\n resize: \"none\",\n padding: \"12px 16px\",\n fontSize: 12,\n fontFamily: \"var(--font-mono, monospace)\",\n border: \"none\",\n background: \"transparent\",\n color: \"var(--text-primary)\",\n lineHeight: 1.5,\n outline: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: 8,\n paddingTop: 10,\n flexShrink: 0,\n flexWrap: \"wrap\",\n }}\n >\n <button\n onClick={onBack}\n style={{\n padding: \"6px 14px\",\n fontSize: 12,\n fontWeight: 600,\n borderRadius: 6,\n border: \"1px solid var(--border-color)\",\n background: \"transparent\",\n color: \"var(--text-secondary)\",\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={saving || !description.trim()}\n style={{\n padding: \"6px 14px\",\n fontSize: 12,\n fontWeight: 600,\n borderRadius: 6,\n border: \"none\",\n background: saving ? \"var(--bg-glass)\" : \"var(--accent-bg, #3b82f6)\",\n color: \"white\",\n cursor: saving ? \"default\" : \"pointer\",\n opacity: saving || !description.trim() ? 0.6 : 1,\n }}\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Skills Tab — list all discovered pi agent skills with enable/disable\n * toggles, diagnostics display, search filtering, and editing.\n */\nimport { useEffect, useState, useMemo } from \"react\";\nimport {\n listSkills,\n setSkillEnabled,\n} from \"../lib/api-client\";\nimport type { SkillSummary, SkillDiagnostic, SkillsListResponse } from \"../lib/api-client/types\";\nimport { SkillEditor } from \"./SkillEditor\";\n\ninterface Props {\n onError: (msg: string | undefined) => void;\n}\n\nexport function SkillsTab({ onError }: Props) {\n const [data, setData] = useState<SkillsListResponse | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [sourceFilter, setSourceFilter] = useState<string>(\"all\");\n const [editingSkill, setEditingSkill] = useState<SkillSummary | null>(null);\n\n const refresh = async () => {\n onError(undefined);\n try {\n const result = await listSkills();\n setData(result);\n } catch (err) {\n onError(`Failed to load skills: ${err instanceof Error ? err.message : String(err)}`);\n }\n };\n\n useEffect(() => {\n void refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleToggle = async (skill: SkillSummary, nextEnabled: boolean) => {\n setBusy(true);\n try {\n await setSkillEnabled(skill.name, nextEnabled);\n await refresh();\n } catch (err) {\n onError(`Toggle failed: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n setBusy(false);\n }\n };\n\n // ── Filtering ───────────────────────────────────────────────────────\n\n const filtered = useMemo(() => {\n if (!data) return [];\n let list = data.skills;\n if (search.trim()) {\n const q = search.toLowerCase();\n list = list.filter(\n (s: SkillSummary) =>\n s.name.toLowerCase().includes(q) ||\n s.description.toLowerCase().includes(q) ||\n s.filePath.toLowerCase().includes(q),\n );\n }\n if (sourceFilter !== \"all\") {\n list = list.filter((s: SkillSummary) => s.source === sourceFilter);\n }\n return list;\n }, [data, search, sourceFilter]);\n\n // ── Source counts for filter button labels ──────────────────────────\n\n const sourceCounts = useMemo(() => {\n if (!data) return {} as Record<string, number>;\n const counts: Record<string, number> = {};\n for (const s of data.skills) {\n counts[s.source] = (counts[s.source] ?? 0) + 1;\n }\n return counts;\n }, [data]);\n\n const hasDiagnostics =\n data && data.diagnostics && data.diagnostics.length > 0;\n\n if (data === undefined) {\n return <p className=\"settings-hint\">Loading skills…</p>;\n }\n\n return (\n <div style={{\n height: editingSkill ? \"100%\" : undefined,\n display: editingSkill ? \"flex\" : undefined,\n flexDirection: \"column\",\n minHeight: 0,\n overflow: editingSkill ? \"hidden\" : undefined,\n }}>\n {!editingSkill && (\n <p className=\"settings-hint\">\n Skills are self-contained capability packages loaded from{\" \"}\n <code className=\"font-mono\">~/.pi/agent/skills/</code> and project skill\n directories. Toggle individual skills on or off.\n </p>\n )}\n\n {/* ── Diagnostics banner ──────────────────────────────────────── */}\n {hasDiagnostics && (\n <div style={{ marginBottom: 12 }}>\n {data!.diagnostics.map((d: SkillDiagnostic, i: number) => (\n <DiagnosticBanner key={i} diagnostic={d} />\n ))}\n </div>\n )}\n\n {/* ── Toolbar: search + filters ───────────────────────────────── */}\n {!editingSkill && (\n <div\n style={{\n display: \"flex\",\n gap: 8,\n alignItems: \"center\",\n marginBottom: 10,\n flexWrap: \"wrap\",\n }}\n >\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search skills…\"\n className=\"settings-input\"\n style={{ flex: 1, minWidth: 140 }}\n />\n <div style={{ display: \"flex\", gap: 4 }}>\n {([\"all\", \"global\", \"project\", \"extension\"] as const).map((f) => {\n const count =\n f === \"all\" ? data.skills.length : (sourceCounts[f] ?? 0);\n return (\n <button\n key={f}\n onClick={() => setSourceFilter(f)}\n className={`settings-tab ${sourceFilter === f ? \"settings-tab-active\" : \"\"}`}\n style={{\n fontSize: 11,\n padding: \"2px 8px\",\n borderRadius: 4,\n border: \"none\",\n cursor: \"pointer\",\n }}\n >\n {f === \"all\"\n ? `All (${count})`\n : `${f} (${count})`}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* ── Skills list or inline editor ──────────────────────────── */}\n {editingSkill ? (\n <SkillEditor\n skill={editingSkill}\n onBack={() => setEditingSkill(null)}\n onSaved={() => void refresh()}\n onError={(msg) => onError(msg)}\n />\n ) : (\n <>\n {filtered.length === 0 && (\n <p className=\"settings-hint\" style={{ marginTop: 16 }}>\n {search\n ? `No skills match \"${search}\"`\n : \"No skills found.\"}\n </p>\n )}\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {filtered.map((skill) => (\n <SkillCard\n key={skill.name}\n skill={skill}\n onToggle={(next) => void handleToggle(skill, next)}\n onEdit={() => setEditingSkill(skill)}\n disabled={busy}\n />\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n\n// ── Skill Card ─────────────────────────────────────────────────────────\n\nfunction SkillCard({\n skill,\n onToggle,\n onEdit,\n disabled,\n}: {\n skill: SkillSummary;\n onToggle: (enabled: boolean) => void;\n onEdit: () => void;\n disabled: boolean;\n}) {\n const sourceLabel =\n skill.source === \"extension\"\n ? `Extension: ${skill.extensionPath ?? \"unknown\"}`\n : skill.source === \"project\"\n ? \"Project skill\"\n : \"Global skill\";\n\n const sourceBadgeClass =\n skill.source === \"extension\"\n ? \"settings-badge settings-badge-off\"\n : skill.source === \"project\"\n ? \"settings-badge\"\n : \"settings-badge settings-badge-on\";\n\n return (\n <div\n className=\"settings-card\"\n style={{\n opacity: skill.effective ? 1 : 0.55,\n transition: \"opacity 0.15s\",\n }}\n >\n {/* Header row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 10,\n }}\n >\n {/* Toggle switch */}\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n flexShrink: 0,\n marginTop: 2,\n }}\n >\n <input\n type=\"checkbox\"\n checked={skill.effective}\n disabled={disabled}\n onChange={(e) => onToggle(e.target.checked)}\n style={{\n width: 15,\n height: 15,\n accentColor: \"var(--accent-text)\",\n cursor: \"inherit\",\n }}\n />\n </label>\n\n {/* Main content */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* ── Action buttons ──────────────────────────────────────── */}\n <div\n style={{\n display: \"flex\",\n gap: 4,\n justifyContent: \"flex-end\",\n marginBottom: 4,\n }}\n >\n <button\n onClick={onEdit}\n disabled={skill.source === \"extension\"}\n title={skill.source === \"extension\" ? \"Extension skills cannot be edited\" : \"Edit skill\"}\n style={{\n fontSize: 10,\n padding: \"2px 8px\",\n borderRadius: 4,\n border: \"1px solid var(--border-color)\",\n background: \"transparent\",\n color: skill.source === \"extension\" ? \"var(--text-dim)\" : \"var(--text-secondary)\",\n cursor: skill.source === \"extension\" ? \"not-allowed\" : \"pointer\",\n fontWeight: 600,\n opacity: skill.source === \"extension\" ? 0.5 : 1,\n }}\n >\n ✎ Edit\n </button>\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexWrap: \"wrap\",\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--text-primary)\",\n }}\n >\n {skill.name}\n </span>\n <span className={sourceBadgeClass}>{skill.source}</span>\n {skill.disableModelInvocation && (\n <span\n className=\"settings-badge settings-badge-off\"\n title=\"Hidden from system prompt; use /skill:name to invoke\"\n >\n manual only\n </span>\n )}\n {skill.projectOverride !== undefined && (\n <span\n className={\n skill.projectOverride === \"enabled\"\n ? \"settings-badge settings-badge-on\"\n : \"settings-badge settings-badge-off\"\n }\n title=\"Per-project override active\"\n style={{ fontSize: 10 }}\n >\n {skill.projectOverride === \"enabled\"\n ? \"project: on\"\n : \"project: off\"}\n </span>\n )}\n </div>\n\n <p\n style={{\n fontSize: 11,\n color: \"var(--text-secondary)\",\n margin: \"2px 0 0\",\n lineHeight: 1.4,\n }}\n >\n {skill.description}\n </p>\n\n <div\n style={{\n fontSize: 10,\n color: \"var(--text-dim)\",\n marginTop: 2,\n display: \"flex\",\n gap: 8,\n flexWrap: \"wrap\",\n alignItems: \"center\",\n }}\n >\n <span title={skill.filePath}>\n {skill.filePath.length > 60\n ? \"…\" + skill.filePath.slice(-57)\n : skill.filePath}\n </span>\n <span>·</span>\n <span>{sourceLabel}</span>\n {!skill.effective && (\n <>\n <span>·</span>\n <span style={{ color: \"var(--danger, #e74c3c)\" }}>disabled</span>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// ── Diagnostic Banner ──────────────────────────────────────────────────\n\nfunction DiagnosticBanner({ diagnostic }: { diagnostic: SkillDiagnostic }) {\n const isError = diagnostic.type === \"error\";\n const isCollision = diagnostic.type === \"collision\";\n\n const bg = isError\n ? \"rgba(231, 76, 60, 0.08)\"\n : isCollision\n ? \"rgba(243, 156, 18, 0.08)\"\n : \"rgba(243, 156, 18, 0.05)\";\n const border = isError\n ? \"1px solid rgba(231, 76, 60, 0.3)\"\n : isCollision\n ? \"1px solid rgba(243, 156, 18, 0.3)\"\n : \"1px solid rgba(243, 156, 18, 0.2)\";\n const label = isError ? \"Error\" : isCollision ? \"Collision\" : \"Warning\";\n\n return (\n <div\n style={{\n padding: \"8px 10px\",\n borderRadius: 6,\n background: bg,\n border,\n marginBottom: 6,\n fontSize: 12,\n lineHeight: 1.4,\n }}\n >\n <strong style={{ fontSize: 11, textTransform: \"uppercase\", letterSpacing: 0.5 }}>\n {label}\n </strong>\n : {diagnostic.message}\n {diagnostic.path && (\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginTop: 4 }}>\n {diagnostic.path}\n </div>\n )}\n {diagnostic.collision && (\n <div style={{ fontSize: 10, color: \"var(--text-dim)\", marginTop: 4 }}>\n Winner: {diagnostic.collision.winnerPath}\n <br />\n Loser: {diagnostic.collision.loserPath}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Tunnel Tab — ngrok tunnel management for the Settings panel.\n */\nimport { useEffect, useState, useCallback } from \"react\";\nimport {\n checkTunnel,\n doctorTunnel,\n getTunnelStatus,\n startTunnel,\n stopTunnel,\n type TunnelCheckResponse,\n type TunnelDoctorResponse,\n type TunnelStatusResponse,\n} from \"../lib/api-client\";\n\ntype TunnelState = \"idle\" | \"starting\" | \"stopping\" | \"error\";\n\nconst STATUS_COLORS: Record<string, string> = {\n pass: \"var(--accent-green, #98c379)\",\n fail: \"var(--accent-red, #e06c75)\",\n warn: \"var(--accent-yellow, #e5c07b)\",\n};\n\nfunction StatusDot({ status }: { status: string }) {\n return (\n <span style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: STATUS_COLORS[status] ?? \"var(--text-dim)\",\n flexShrink: 0,\n display: \"inline-block\",\n }} />\n );\n}\n\nfunction StatusBadge({ status, label }: { status: string; label: string }) {\n const color = STATUS_COLORS[status] ?? \"var(--text-dim)\";\n return (\n <span style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"3px 10px\",\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 500,\n color,\n background: `color-mix(in srgb, ${color} 12%, transparent)`,\n border: `1px solid color-mix(in srgb, ${color} 25%, transparent)`,\n }}>\n <StatusDot status={status} />\n {label}\n </span>\n );\n}\n\nfunction copyToClipboard(text: string): Promise<void> {\n // Preferred: async clipboard API (requires secure context)\n if (typeof navigator?.clipboard?.writeText === \"function\") {\n return navigator.clipboard.writeText(text).catch(() => fallbackCopy(text));\n }\n return fallbackCopy(text);\n}\n\nfunction fallbackCopy(text: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n document.body.removeChild(ta);\n resolve();\n } catch {\n reject(new Error(\"clipboard fallback failed\"));\n }\n });\n}\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n const [failed, setFailed] = useState(false);\n return (\n <button\n onClick={async () => {\n setFailed(false);\n try {\n await copyToClipboard(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n } catch {\n setFailed(true);\n setTimeout(() => setFailed(false), 2000);\n }\n }}\n style={{\n background: \"var(--bg-glass)\",\n border: \"1px solid var(--border)\",\n borderRadius: 4,\n padding: \"2px 8px\",\n fontSize: 11,\n cursor: \"pointer\",\n color: failed ? \"var(--accent-red, #e06c75)\" : copied ? \"var(--accent-green, #98c379)\" : \"var(--text-dim)\",\n whiteSpace: \"nowrap\",\n }}\n title=\"Copy URL\"\n >\n {failed ? \"Failed\" : copied ? \"Copied!\" : \"Copy\"}\n </button>\n );\n}\n\nexport function TunnelTab() {\n const [check, setCheck] = useState<TunnelCheckResponse | null>(null);\n const [doctor, setDoctor] = useState<TunnelDoctorResponse | null>(null);\n const [status, setStatus] = useState<TunnelStatusResponse | null>(null);\n const [tunnelState, setTunnelState] = useState<TunnelState>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n const [running, setRunning] = useState(false);\n\n const refresh = useCallback(async () => {\n try {\n const [c, d, s] = await Promise.all([\n checkTunnel(),\n doctorTunnel(),\n getTunnelStatus(),\n ]);\n setCheck(c);\n setDoctor(d);\n setStatus(s);\n setRunning(s.active);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load tunnel info\");\n }\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleStart = async () => {\n setTunnelState(\"starting\");\n setError(null);\n try {\n const result = await startTunnel();\n setRunning(true);\n setStatus({\n active: true,\n url: result.url,\n mode: result.mode,\n provider: result.provider,\n providerMetadata: result.providerMetadata,\n localPort: result.localPort,\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to start tunnel\");\n } finally {\n setTunnelState(\"idle\");\n }\n };\n\n const handleStop = async () => {\n setTunnelState(\"stopping\");\n setError(null);\n try {\n await stopTunnel();\n setRunning(false);\n setStatus((prev) => prev ? { ...prev, active: false, url: null } : null);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to stop tunnel\");\n } finally {\n setTunnelState(\"idle\");\n }\n };\n\n const ngrokInstalled = check?.available ?? false;\n\n return (\n <div className=\"settings-section\" style={{ padding: \"20px 24px\" }}>\n <h3 style={{ margin: \"0 0 16px\", fontSize: 15, fontWeight: 600 }}>\n Ngrok Tunnel\n </h3>\n\n {/* Installation status */}\n <div style={{\n background: \"var(--bg-frosted)\",\n borderRadius: 8,\n padding: 16,\n marginBottom: 16,\n }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 8, flexWrap: \"wrap\" }}>\n <span style={{ fontSize: 13, fontWeight: 500 }}>Status</span>\n <StatusBadge\n status={ngrokInstalled ? \"pass\" : \"fail\"}\n label={ngrokInstalled ? \"ngrok installed\" : \"ngrok not installed\"}\n />\n </div>\n {check && (\n <div style={{ fontSize: 12, color: \"var(--text-dim)\", lineHeight: 1.6 }}>\n {check.version && <div>Version: {check.version}</div>}\n {!ngrokInstalled && check.installCommand && (\n <div style={{ marginTop: 8 }}>\n <span>Install: </span>\n <code style={{\n background: \"var(--bg-glass)\",\n padding: \"2px 8px\",\n borderRadius: 4,\n fontSize: 12,\n }}>\n {check.installCommand}\n </code>\n {check.installUrl && (\n <span style={{ marginLeft: 8 }}>\n <a\n href={check.installUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: \"var(--accent)\" }}\n >\n Download\n </a>\n </span>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Diagnostics */}\n {doctor && (\n <div style={{\n background: \"var(--bg-frosted)\",\n borderRadius: 8,\n padding: 16,\n marginBottom: 16,\n }}>\n <div style={{ fontSize: 13, fontWeight: 500, marginBottom: 10 }}>\n Diagnostics\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {doctor.providerChecks.map((c) => (\n <div key={c.id} style={{ display: \"flex\", alignItems: \"center\", gap: 8, fontSize: 12, flexWrap: \"wrap\" }}>\n <StatusBadge status={c.status} label={c.label} />\n <span style={{ color: \"var(--text-dim)\", fontSize: 11 }}>\n {c.detail}\n </span>\n </div>\n ))}\n </div>\n {doctor.modes.map((mode) => (\n <div key={mode.mode} style={{ marginTop: 10 }}>\n <div style={{\n fontSize: 12,\n fontWeight: 500,\n marginBottom: 6,\n textTransform: \"capitalize\",\n }}>\n {mode.mode} mode\n </div>\n {mode.blockers.length > 0 && (\n <div style={{ fontSize: 11, color: \"var(--accent-red, #e06c75)\" }}>\n Blockers: {mode.blockers.join(\", \")}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Active tunnel */}\n {running && status?.url && (\n <div style={{\n background: \"var(--bg-frosted)\",\n borderRadius: 8,\n padding: 16,\n marginBottom: 16,\n border: \"1px solid var(--accent-green, #98c379)\",\n }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 8 }}>\n <span style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: \"var(--accent-green, #98c379)\",\n }} />\n <span style={{ fontSize: 13, fontWeight: 500 }}>Tunnel Active</span>\n </div>\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n fontSize: 13,\n fontFamily: \"var(--font-mono, monospace)\",\n color: \"var(--text-primary)\",\n }}>\n <span>{status.url}</span>\n <CopyButton text={status.url} />\n </div>\n <div style={{ fontSize: 11, color: \"var(--text-dim)\", marginTop: 4 }}>\n Provider: {status.provider} · Mode: {status.mode}\n </div>\n </div>\n )}\n\n {/* Error */}\n {error && (\n <div style={{\n background: \"var(--bg-frosted)\",\n borderRadius: 8,\n padding: 12,\n marginBottom: 16,\n border: \"1px solid var(--accent-red, #e06c75)\",\n fontSize: 12,\n color: \"var(--accent-red, #e06c75)\",\n }}>\n {error}\n </div>\n )}\n\n {/* Controls */}\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n onClick={handleStart}\n disabled={!ngrokInstalled || running || tunnelState === \"starting\" || tunnelState === \"stopping\"}\n className=\"settings-tab settings-tab-active\"\n style={{\n padding: \"8px 20px\",\n fontSize: 13,\n fontWeight: 500,\n border: running ? \"1px solid var(--accent-green, #98c379)\" : \"none\",\n borderRadius: 6,\n cursor: !ngrokInstalled || running || tunnelState !== \"idle\" ? \"not-allowed\" : \"pointer\",\n opacity: !ngrokInstalled || running || tunnelState !== \"idle\" ? 0.5 : 1,\n background: running\n ? \"var(--bg-glass)\"\n : \"var(--accent)\",\n color: running\n ? \"var(--accent-green, #98c379)\"\n : \"#fff\",\n }}\n >\n {tunnelState === \"starting\"\n ? \"Starting...\"\n : running\n ? \"Tunnel Active\"\n : \"Start Tunnel\"}\n </button>\n <button\n onClick={handleStop}\n disabled={!running || tunnelState !== \"idle\"}\n className=\"settings-tab\"\n style={{\n padding: \"8px 20px\",\n fontSize: 13,\n fontWeight: 500,\n border: \"1px solid var(--accent-red, #e06c75)\",\n borderRadius: 6,\n cursor: !running || tunnelState !== \"idle\" ? \"not-allowed\" : \"pointer\",\n opacity: !running || tunnelState !== \"idle\" ? 0.5 : 1,\n background: \"var(--bg-glass)\",\n color: \"var(--accent-red, #e06c75)\",\n }}\n >\n {tunnelState === \"stopping\" ? \"Stopping...\" : \"Stop Tunnel\"}\n </button>\n <button\n onClick={refresh}\n className=\"settings-tab\"\n style={{\n padding: \"8px 12px\",\n fontSize: 12,\n border: \"1px solid var(--border)\",\n borderRadius: 6,\n cursor: \"pointer\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-dim)\",\n }}\n title=\"Refresh\"\n >\n ↻\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Settings Panel — modal overlay with config tabs.\n *\n * Shell component that renders tab navigation and delegates content\n * to individual tab components in ./settings/.\n */\nimport { useState, useEffect } from \"react\";\nimport { SlidePanel } from \"./SlidePanel\";\nimport { AppearanceTab } from \"./settings/AppearanceTab\";\nimport { ProvidersTab } from \"./settings/ProvidersTab\";\nimport { AgentTab } from \"./settings/AgentTab\";\nimport { GeneralTab } from \"./settings/GeneralTab\";\nimport { ExtensionsTab } from \"./ExtensionsTab\";\nimport { SkillsTab } from \"./SkillsTab\";\nimport { TunnelTab } from \"./TunnelTab\";\n\ntype Tab = \"appearance\" | \"providers\" | \"agent\" | \"general\" | \"extensions\" | \"skills\" | \"tunnel\";\n\ninterface Props {\n onClose: () => void;\n initialTab?: Tab;\n}\n\nexport function SettingsPanel({ onClose, initialTab }: Props) {\n const visibleTabs: Tab[] = [\"appearance\", \"providers\", \"agent\", \"general\", \"extensions\", \"skills\", \"tunnel\"];\n\n const [tab, setTab] = useState<Tab>(initialTab ?? \"appearance\");\n const [error, setError] = useState<string | undefined>(undefined);\n const [isMobile, setIsMobile] = useState(window.innerWidth <= 600);\n\n useEffect(() => {\n const onResize = () => setIsMobile(window.innerWidth <= 600);\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (!visibleTabs.includes(tab)) setTab(\"appearance\");\n }, [tab]);\n\n useEffect(() => {\n if (initialTab !== undefined && visibleTabs.includes(initialTab)) {\n setTab(initialTab);\n } else if (initialTab === undefined || !visibleTabs.includes(initialTab)) {\n setTab(\"appearance\");\n }\n }, [initialTab]);\n\n return (\n <SlidePanel\n open\n onClose={onClose}\n header={\n <header className=\"settings-header\">\n <div className=\"settings-tabs\" style={{\n display: \"flex\",\n gap: 2,\n overflowX: isMobile ? \"auto\" : undefined,\n whiteSpace: \"nowrap\",\n flex: 1,\n minWidth: 0,\n msOverflowStyle: \"none\",\n scrollbarWidth: \"none\",\n }}>\n {visibleTabs.map((t) => (\n <button\n key={t}\n onClick={() => setTab(t)}\n className={`settings-tab ${tab === t ? \"settings-tab-active\" : \"\"}`}\n >\n {t === \"appearance\"\n ? \"Appearance\"\n : t === \"providers\"\n ? \"Providers\"\n : t === \"agent\"\n ? \"Agent\"\n : t === \"extensions\"\n ? \"Extensions ⚗️\"\n : t === \"skills\"\n ? \"Skills\"\n : t === \"tunnel\"\n ? \"Tunnel 🚇\"\n : \"General\"}\n </button>\n ))}\n </div>\n <button\n onClick={onClose}\n className=\"settings-close\"\n title=\"Close (Esc)\"\n style={{ flexShrink: 0 }}\n >\n ✕\n </button>\n </header>\n }\n style={{\n width: isMobile ? \"100vw\" : 720,\n maxWidth: \"100vw\",\n height: isMobile ? \"100dvh\" : \"85vh\",\n maxHeight: isMobile ? \"100dvh\" : undefined,\n borderRadius: isMobile ? 0 : undefined,\n }}\n >\n {error !== undefined && (\n <div className=\"settings-error\">\n {error}\n </div>\n )}\n\n {tab === \"appearance\" && <AppearanceTab />}\n {tab === \"providers\" && <ProvidersTab onError={setError} />}\n {tab === \"agent\" && <AgentTab onError={setError} />}\n {tab === \"extensions\" && <ExtensionsTab onError={setError} />}\n {tab === \"skills\" && <SkillsTab onError={setError} />}\n {tab === \"tunnel\" && <TunnelTab />}\n {tab === \"general\" && <GeneralTab />}\n </SlidePanel>\n );\n}\n","import { useRef, useEffect, useMemo } from \"react\";\nimport { EditorState, Compartment } from \"@codemirror/state\";\nimport { EditorView, keymap } from \"@codemirror/view\";\nimport { basicSetup } from \"@codemirror/basic-setup\";\nimport { syntaxHighlighting, HighlightStyle } from \"@codemirror/language\";\nimport { tags } from \"@lezer/highlight\";\nimport { javascript } from \"@codemirror/lang-javascript\";\nimport { python } from \"@codemirror/lang-python\";\nimport { rust } from \"@codemirror/lang-rust\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport { json } from \"@codemirror/lang-json\";\nimport { html } from \"@codemirror/lang-html\";\nimport { css } from \"@codemirror/lang-css\";\nimport { cpp } from \"@codemirror/lang-cpp\";\nimport { yaml } from \"@codemirror/lang-yaml\";\n\ninterface Props {\n value: string;\n onChange: (val: string) => void;\n onSave?: () => void;\n fileName: string;\n wordWrap?: boolean;\n}\n\nconst EXT_TO_LANG: Record<string, string> = {\n ts: \"typescript\", tsx: \"tsx\", js: \"javascript\", jsx: \"jsx\",\n json: \"json\", css: \"css\", html: \"html\", md: \"markdown\",\n py: \"python\", rs: \"rust\", go: \"go\", sh: \"bash\", bash: \"bash\",\n yaml: \"yaml\", yml: \"yaml\", toml: \"toml\", sql: \"sql\",\n cpp: \"cpp\", c: \"cpp\", h: \"cpp\", hpp: \"cpp\",\n java: \"java\", xml: \"html\", svg: \"html\",\n mjs: \"javascript\", mts: \"typescript\", cjs: \"javascript\",\n};\n\nfunction languageFromExt(fileName: string) {\n const ext = fileName.split(\".\").pop()?.toLowerCase() ?? \"\";\n const lang = EXT_TO_LANG[ext];\n switch (lang) {\n case \"typescript\": return javascript({ typescript: true });\n case \"tsx\": return javascript({ jsx: true, typescript: true });\n case \"javascript\": return javascript();\n case \"jsx\": return javascript({ jsx: true });\n case \"python\": return python();\n case \"rust\": return rust();\n case \"markdown\": return markdown();\n case \"json\": return json();\n case \"html\": return html();\n case \"css\": return css();\n case \"cpp\": return cpp();\n case \"yaml\": return yaml();\n default: return javascript();\n }\n}\n\n// Theme-adaptive syntax highlighting using CSS variables.\n// Works in both light and dark themes.\nconst themeHighlight = HighlightStyle.define([\n { tag: tags.keyword, color: \"var(--cm-keyword, var(--accent-text))\", fontWeight: \"bold\" },\n { tag: tags.operator, color: \"var(--cm-operator, var(--text-secondary))\" },\n { tag: tags.string, color: \"var(--cm-string, #98c379)\" },\n { tag: tags.number, color: \"var(--cm-number, #d19a66)\" },\n { tag: tags.bool, color: \"var(--cm-bool, #d19a66)\" },\n { tag: tags.null, color: \"var(--cm-null, #d19a66)\" },\n { tag: tags.comment, color: \"var(--cm-comment, #5c6370)\", fontStyle: \"italic\" },\n { tag: tags.lineComment, color: \"var(--cm-comment, #5c6370)\", fontStyle: \"italic\" },\n { tag: tags.blockComment, color: \"var(--cm-comment, #5c6370)\", fontStyle: \"italic\" },\n { tag: tags.function(tags.variableName), color: \"var(--cm-function, #61afef)\" },\n { tag: tags.function(tags.propertyName), color: \"var(--cm-function, #61afef)\" },\n { tag: tags.className, color: \"var(--cm-class, #e5c07b)\" },\n { tag: tags.typeName, color: \"var(--cm-type, #e5c07b)\" },\n { tag: tags.propertyName, color: \"var(--cm-property, var(--text-primary))\" },\n { tag: tags.variableName, color: \"var(--cm-variable, var(--text-primary))\" },\n { tag: tags.attributeName, color: \"var(--cm-attr-name, #98c379)\" },\n { tag: tags.attributeValue, color: \"var(--cm-attr-value, #98c379)\" },\n { tag: tags.tagName, color: \"var(--cm-tag, var(--accent-text))\" },\n { tag: tags.punctuation, color: \"var(--cm-punctuation, var(--text-dim))\" },\n { tag: tags.bracket, color: \"var(--cm-bracket, var(--text-dim))\" },\n { tag: tags.regexp, color: \"var(--cm-regex, #c678dd)\" },\n { tag: tags.escape, color: \"var(--cm-escape, #c678dd)\" },\n { tag: tags.link, color: \"var(--cm-link, #61afef)\", textDecoration: \"underline\" },\n { tag: tags.heading, color: \"var(--cm-heading, var(--accent-text))\", fontWeight: \"bold\" },\n { tag: tags.strong, fontWeight: \"bold\" },\n { tag: tags.emphasis, fontStyle: \"italic\" },\n { tag: tags.inserted, color: \"var(--cm-inserted, #98c379)\" },\n { tag: tags.deleted, color: \"var(--cm-deleted, #e06c75)\" },\n { tag: tags.changed, color: \"var(--cm-changed, #d19a66)\" },\n { tag: tags.meta, color: \"var(--cm-meta, var(--text-dim))\" },\n]);\n\nexport function CodeMirrorEditor({\n value,\n onChange,\n onSave,\n fileName,\n wordWrap = false,\n}: Props) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const wrappingCompartment = useRef(new Compartment());\n const onChangeRef = useRef(onChange);\n const onSaveRef = useRef(onSave);\n onChangeRef.current = onChange;\n onSaveRef.current = onSave;\n\n const language = useMemo(() => languageFromExt(fileName), [fileName]);\n\n // Re-create editor when language changes (file switch)\n const langKey = useMemo(() => fileName, [fileName]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n const updateListener = EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onChangeRef.current(update.state.doc.toString());\n }\n });\n\n const saveKeymap = keymap.of([\n { key: \"Mod-s\", run: () => { onSaveRef.current?.(); return true; } },\n ]);\n\n // Editor chrome that adapts to CSS variables\n const chromeTheme = EditorView.theme({\n \"&\": { fontSize: \"13px\", height: \"100%\" },\n \".cm-scroller\": { overflow: \"auto\" },\n \".cm-content\": {\n fontFamily: \"var(--font-mono, 'JetBrains Mono', 'Fira Code', monospace)\",\n padding: \"8px 0\",\n },\n \".cm-gutters\": {\n borderRight: \"1px solid var(--border)\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-dim)\",\n },\n \".cm-activeLineGutter\": { background: \"var(--bg-glass-hover)\" },\n \".cm-activeLine\": { background: \"var(--bg-glass-hover)\" },\n \"&.cm-focused .cm-cursor\": { borderLeftColor: \"var(--accent-text)\" },\n \".cm-selectionBackground\": { background: \"var(--selection-bg, rgba(255,255,255,0.1))\" },\n \"&.cm-focused .cm-selectionBackground\": {\n background: \"var(--selection-bg-focused, rgba(255,255,255,0.15))\",\n },\n \".cm-matchingBracket\": {\n background: \"rgba(255,255,255,0.08)\",\n outline: \"1px solid var(--text-dim)\",\n },\n \".cm-foldPlaceholder\": {\n background: \"var(--bg-glass)\",\n border: \"1px solid var(--border)\",\n color: \"var(--text-dim)\",\n },\n });\n\n const state = EditorState.create({\n doc: value,\n extensions: [\n basicSetup,\n syntaxHighlighting(themeHighlight, { fallback: true }),\n language,\n chromeTheme,\n updateListener,\n saveKeymap,\n wrappingCompartment.current.of(wordWrap ? EditorView.lineWrapping : []),\n ],\n });\n\n const view = new EditorView({ state, parent: containerRef.current });\n viewRef.current = view;\n\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langKey]);\n\n // Sync value from external changes\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n const current = view.state.doc.toString();\n if (current !== value) {\n view.dispatch({\n changes: { from: 0, to: current.length, insert: value },\n });\n }\n }, [value]);\n\n // Toggle word wrap\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: wrappingCompartment.current.reconfigure(\n wordWrap ? EditorView.lineWrapping : [],\n ),\n });\n }, [wordWrap]);\n\n return (\n <div\n ref={containerRef}\n style={{ flex: 1, overflow: \"hidden\", background: \"var(--bg-solid)\" }}\n />\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport { Highlight, themes as prismThemes } from \"prism-react-renderer\";\n\ninterface Props {\n content: string;\n fileName: string;\n}\n\nconst LIGHT_RE = /^light|clean|terracotta|sage$/i;\n\nfunction useIsLight(): boolean {\n const [isLight, setIsLight] = useState(() => {\n if (typeof window === \"undefined\") return false;\n try {\n const theme = document.documentElement.getAttribute(\"data-theme\");\n if (theme && LIGHT_RE.test(theme)) return true;\n } catch {}\n return window.matchMedia?.(\"(prefers-color-scheme: light)\")?.matches ?? false;\n });\n\n useEffect(() => {\n const root = document.documentElement;\n const read = () => {\n const theme = root.getAttribute(\"data-theme\");\n setIsLight(!!(theme && LIGHT_RE.test(theme)));\n };\n read();\n const mq = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n const handler = () => read();\n mq?.addEventListener?.(\"change\", handler);\n const obs = new MutationObserver(handler);\n root && obs.observe(root, { attributes: true, attributeFilter: [\"data-theme\"] });\n return () => {\n mq?.removeEventListener?.(\"change\", handler);\n obs.disconnect();\n };\n }, []);\n\n return isLight;\n}\n\nconst EXT_TO_LANG: Record<string, string> = {\n ts: \"typescript\", tsx: \"tsx\", js: \"javascript\", jsx: \"jsx\",\n json: \"json\", css: \"css\", html: \"markup\", md: \"markdown\",\n py: \"python\", rs: \"rust\", go: \"go\", sh: \"bash\", bash: \"bash\",\n yaml: \"yaml\", yml: \"yaml\", toml: \"toml\", sql: \"sql\",\n cpp: \"cpp\", c: \"cpp\", h: \"cpp\", hpp: \"cpp\",\n java: \"java\", xml: \"markup\", svg: \"markup\",\n kt: \"kotlin\", dart: \"dart\", rb: \"ruby\", php: \"php\",\n r: \"r\", scala: \"scala\", swift: \"swift\",\n};\n\nfunction CodeBlock({ code, language }: { code: string; language: string }) {\n const isLight = useIsLight();\n const lang = EXT_TO_LANG[language] ?? \"bash\";\n const prismTheme = isLight ? prismThemes.vsLight : prismThemes.vsDark;\n return (\n <Highlight\n theme={prismTheme}\n code={code.trimEnd()}\n language={lang}\n >\n {({ className, style, tokens, getLineProps, getTokenProps }) => (\n <pre\n className={className}\n style={{\n ...style,\n margin: 0,\n padding: \"12px 14px\",\n fontSize: \"12px\",\n lineHeight: 1.6,\n overflowX: \"auto\",\n borderRadius: \"6px\",\n background: \"var(--bg-glass-strong)\",\n }}\n >\n <code>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line, key: i })}>\n <span\n style={{\n display: \"inline-block\",\n width: \"2ch\",\n textAlign: \"right\",\n marginRight: \"12px\",\n userSelect: \"none\",\n opacity: 0.35,\n fontSize: \"11px\",\n }}\n >\n {i + 1}\n </span>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token, key })} />\n ))}\n </div>\n ))}\n </code>\n </pre>\n )}\n </Highlight>\n );\n}\n\nfunction isMarkdown(fileName: string): boolean {\n const ext = fileName.split(\".\").pop()?.toLowerCase() ?? \"\";\n return ext === \"md\" || ext === \"mdx\";\n}\n\nexport function RenderedView({ content, fileName }: Props) {\n const ext = fileName.split(\".\").pop()?.toLowerCase() ?? \"\";\n\n if (isMarkdown(fileName)) {\n return (\n <div\n className=\"markdown-preview\"\n style={{\n padding: \"16px 20px\",\n fontSize: \"14px\",\n lineHeight: 1.7,\n color: \"var(--text-primary)\",\n overflowY: \"auto\",\n height: \"100%\",\n }}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className ?? \"\");\n const codeStr = String(children).replace(/\\n$/, \"\");\n if (match) {\n return <CodeBlock code={codeStr} language={match[1]} />;\n }\n return (\n <code\n style={{\n background: \"var(--bg-glass-strong)\",\n padding: \"2px 5px\",\n borderRadius: \"3px\",\n fontSize: \"0.9em\",\n color: \"var(--accent-text)\",\n }}\n {...props}\n >\n {children}\n </code>\n );\n },\n pre({ children }) {\n return <>{children}</>;\n },\n a({ href, children }) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ color: \"var(--accent-text)\" }}\n >\n {children}\n </a>\n );\n },\n table({ children }) {\n return (\n <div className=\"table-wrapper\">\n <table className=\"md-table\">\n {children}\n </table>\n </div>\n );\n },\n th({ children }) {\n return <th className=\"md-th\">{children}</th>;\n },\n td({ children }) {\n return <td className=\"md-td\">{children}</td>;\n },\n blockquote({ children }) {\n return (\n <blockquote\n style={{\n borderLeft: \"3px solid var(--accent-bg)\",\n margin: \"12px 0\",\n padding: \"4px 14px\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-secondary)\",\n }}\n >\n {children}\n </blockquote>\n );\n },\n h1({ children }) {\n return (\n <h1\n style={{\n fontSize: \"20px\",\n fontWeight: 700,\n margin: \"20px 0 10px\",\n color: \"var(--text-primary)\",\n borderBottom: \"1px solid var(--border)\",\n paddingBottom: \"6px\",\n }}\n >\n {children}\n </h1>\n );\n },\n h2({ children }) {\n return (\n <h2\n style={{\n fontSize: \"17px\",\n fontWeight: 600,\n margin: \"18px 0 8px\",\n color: \"var(--text-primary)\",\n borderBottom: \"1px solid var(--border)\",\n paddingBottom: \"4px\",\n }}\n >\n {children}\n </h2>\n );\n },\n h3({ children }) {\n return (\n <h3\n style={{\n fontSize: \"15px\",\n fontWeight: 600,\n margin: \"14px 0 6px\",\n color: \"var(--text-primary)\",\n }}\n >\n {children}\n </h3>\n );\n },\n hr() {\n return (\n <hr\n style={{\n border: \"none\",\n borderTop: \"1px solid var(--border)\",\n margin: \"16px 0\",\n }}\n />\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n }\n\n // For non-markdown files: syntax-highlighted code block\n return (\n <div\n style={{\n padding: \"16px 0\",\n fontSize: \"13px\",\n overflowY: \"auto\",\n height: \"100%\",\n }}\n >\n <CodeBlock code={content} language={ext} />\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { getStoredToken } from \"../lib/api-client\";\n\n/** Wrapper around fetch that includes the auth token when available. */\nasync function authFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const token = getStoredToken();\n const headers: Record<string, string> = { ...(init?.headers as Record<string, string> ?? {}) };\n if (token !== undefined) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n return fetch(input, { ...init, headers });\n}\n\n/* ----------------------------- types ----------------------------- */\n\ntype FileStatusKind =\n | \"modified\" | \"added\" | \"deleted\" | \"renamed\" | \"copied\"\n | \"untracked\" | \"ignored\" | \"conflicted\" | \"unknown\";\n\ninterface GitFileStatus {\n path: string;\n staged: boolean;\n unstaged: boolean;\n kind: FileStatusKind;\n code: string;\n originalPath?: string;\n}\n\ninterface GitStatus {\n isGitRepo: boolean;\n branch?: string;\n files: GitFileStatus[];\n}\n\ninterface GitLogEntry {\n hash: string;\n message: string;\n author: string;\n date: string;\n}\n\ninterface GitBranch {\n name: string;\n current: boolean;\n remote: boolean;\n}\n\ntype CacheEntry<T> =\n | { state: \"loading\" }\n | { state: \"error\"; message: string }\n | { state: \"loaded\"; value: T };\n\ninterface CommitFileEntry {\n path: string;\n changeType: string;\n}\n\ninterface GitWorktreeEntry {\n path: string;\n head?: string;\n branch?: string;\n bare: boolean;\n detached: boolean;\n current: boolean;\n}\n\n/* ----------------------------- component ----------------------------- */\n\ninterface Props {\n projectId: string;\n}\n\nexport function GitPanel({ projectId }: Props) {\n const [status, setStatus] = useState<GitStatus | undefined>(undefined);\n const [statusError, setStatusError] = useState<string | undefined>();\n const [branchBusy, setBranchBusy] = useState<string | undefined>();\n const [log, setLog] = useState<GitLogEntry[] | undefined>();\n const [branches, setBranches] = useState<GitBranch[] | undefined>();\n const [showLog, setShowLog] = useState(false);\n const [showBranches, setShowBranches] = useState(false);\n const [showWorktrees, setShowWorktrees] = useState(false);\n const [worktrees, setWorktrees] = useState<GitWorktreeEntry[] | undefined>();\n const [worktreeBusy, setWorktreeBusy] = useState<string | undefined>();\n const [expandedCommits, setExpandedCommits] = useState<Set<string>>(new Set());\n const [commitFilesCache, setCommitFilesCache] = useState<Record<string, CacheEntry<CommitFileEntry[]>>>({});\n const [commitDiffs, setCommitDiffs] = useState<Record<string, CacheEntry<string>>>({});\n const [copiedPath, setCopiedPath] = useState<string | undefined>();\n const [commitMessage, setCommitMessage] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [opError, setOpError] = useState<string | undefined>();\n const [opResult, setOpResult] = useState<string | undefined>();\n\n // Per-file diff cache\n const [openDiffs, setOpenDiffs] = useState<Record<string, string | \"loading\" | \"error\">>({});\n // Revert confirm state (click-twice)\n const [pendingRevert, setPendingRevert] = useState<string | undefined>();\n const revertTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const clearPendingRevert = () => {\n if (revertTimerRef.current !== undefined) clearTimeout(revertTimerRef.current);\n setPendingRevert(undefined);\n };\n\n // Revert confirm timeout\n useEffect(() => {\n return () => {\n if (revertTimerRef.current !== undefined) clearTimeout(revertTimerRef.current);\n };\n }, []);\n\n const fetchStatus = useCallback(async () => {\n setStatusError(undefined);\n try {\n const qs = new URLSearchParams({ projectId });\n const res = await authFetch(`/api/v1/git/status?${qs}`);\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error((body as { message?: string }).message ?? \"status failed\");\n }\n const data = (await res.json()) as GitStatus;\n setStatus(data);\n\n // Prune stale diffs\n const liveFiles = new Set(data.files.map((f) => f.path));\n setOpenDiffs((prev) => {\n let changed = false;\n const next: typeof prev = {};\n for (const [key, val] of Object.entries(prev)) {\n const path = key.split(\"|\")[0] ?? \"\";\n if (liveFiles.has(path)) next[key] = val;\n else changed = true;\n }\n return changed ? next : prev;\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"fetch failed\";\n setStatusError(msg);\n setStatus(undefined);\n }\n }, [projectId]);\n\n // Initial load\n useEffect(() => {\n fetchStatus();\n }, [fetchStatus]);\n\n // Lazy-load log\n useEffect(() => {\n if (showLog) {\n const qs = new URLSearchParams({ projectId, limit: \"30\" });\n authFetch(`/api/v1/git/log?${qs}`)\n .then((r) => r.json() as Promise<{ commits: GitLogEntry[] }>)\n .then((d) => setLog(d.commits))\n .catch(() => setLog([]));\n }\n }, [showLog, projectId]);\n\n // Lazy-load branches\n useEffect(() => {\n if (showBranches) {\n const qs = new URLSearchParams({ projectId });\n authFetch(`/api/v1/git/branches?${qs}`)\n .then((r) => r.json() as Promise<{ branches: GitBranch[] }>)\n .then((d) => setBranches(d.branches))\n .catch(() => setBranches([]));\n }\n }, [showBranches, projectId]);\n\n // Lazy-load worktrees\n useEffect(() => {\n if (showWorktrees) {\n const qs = new URLSearchParams({ projectId });\n authFetch(`/api/v1/git/worktrees?${qs}`)\n .then((r) => r.json() as Promise<{ worktrees: GitWorktreeEntry[] }>)\n .then((d) => setWorktrees(d.worktrees))\n .catch(() => setWorktrees([]));\n }\n }, [showWorktrees, projectId]);\n\n const toggleDiff = async (file: GitFileStatus, staged: boolean) => {\n const key = `${file.path}|${staged ? \"staged\" : \"unstaged\"}`;\n if (openDiffs[key] !== undefined) {\n setOpenDiffs((s) => { const n = { ...s }; delete n[key]; return n; });\n return;\n }\n setOpenDiffs((s) => ({ ...s, [key]: \"loading\" }));\n try {\n const qs = new URLSearchParams({ projectId, path: file.path });\n if (staged) qs.set(\"staged\", \"1\");\n const res = await authFetch(`/api/v1/git/diff/file?${qs}`);\n if (!res.ok) throw new Error(\"diff failed\");\n const data = (await res.json()) as { diff: string };\n setOpenDiffs((s) => ({ ...s, [key]: data.diff }));\n } catch {\n setOpenDiffs((s) => ({ ...s, [key]: \"error\" }));\n }\n };\n\n const stage = async (paths: string[]) => {\n if (paths.length === 0) return;\n setBusy(true); setOpError(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/stage\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId, paths }),\n });\n if (!res.ok) throw new Error((await res.json().catch(() => ({})) as { message?: string }).message ?? \"stage failed\");\n await fetchStatus();\n } catch (err) { setOpError(err instanceof Error ? err.message : \"stage failed\"); }\n finally { setBusy(false); }\n };\n\n const unstage = async (paths: string[]) => {\n if (paths.length === 0) return;\n setBusy(true); setOpError(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/unstage\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId, paths }),\n });\n if (!res.ok) throw new Error(\"unstage failed\");\n await fetchStatus();\n } catch (err) { setOpError(err instanceof Error ? err.message : \"unstage failed\"); }\n finally { setBusy(false); }\n };\n\n const handleRevert = async (path: string) => {\n if (pendingRevert === path) {\n clearPendingRevert();\n setBusy(true); setOpError(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/revert\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId, paths: [path] }),\n });\n if (!res.ok) throw new Error(\"revert failed\");\n setOpResult(`Reverted ${path}`);\n await fetchStatus();\n } catch (err) { setOpError(err instanceof Error ? err.message : \"revert failed\"); }\n finally { setBusy(false); }\n } else {\n clearPendingRevert();\n setPendingRevert(path);\n revertTimerRef.current = setTimeout(() => setPendingRevert(undefined), 3000);\n }\n };\n\n const commit = async () => {\n const msg = commitMessage.trim();\n if (!msg) return;\n setBusy(true); setOpError(undefined); setOpResult(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/commit\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId, message: msg }),\n });\n if (!res.ok) throw new Error((await res.json().catch(() => ({})) as { error?: string }).error ?? \"commit failed\");\n const data = (await res.json()) as { hash: string };\n setCommitMessage(\"\");\n setOpResult(`Committed ${data.hash.slice(0, 7)}`);\n await fetchStatus();\n if (showLog) {\n const qs = new URLSearchParams({ projectId, limit: \"30\" });\n const r = await authFetch(`/api/v1/git/log?${qs}`);\n const d = await r.json() as { commits: GitLogEntry[] };\n setLog(d.commits);\n }\n } catch (err) { setOpError(err instanceof Error ? err.message : \"commit failed\"); }\n finally { setBusy(false); }\n };\n\n const doPush = async () => {\n setBusy(true); setOpError(undefined); setOpResult(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/push\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId }),\n });\n if (!res.ok) throw new Error(\"push failed\");\n const data = (await res.json()) as { output: string };\n setOpResult(data.output.trim().split(\"\\n\").pop() ?? \"Pushed\");\n } catch (err) { setOpError(err instanceof Error ? err.message : \"push failed\"); }\n finally { setBusy(false); }\n };\n\n const doPull = async () => {\n setBusy(true); setOpError(undefined); setOpResult(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/pull\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId }),\n });\n if (!res.ok) throw new Error(\"pull failed\");\n const data = (await res.json()) as { output: string };\n setOpResult(data.output.trim().split(\"\\n\").pop() ?? \"Pulled\");\n await fetchStatus();\n } catch (err) { setOpError(err instanceof Error ? err.message : \"pull failed\"); }\n finally { setBusy(false); }\n };\n\n const doFetch = async () => {\n setBusy(true); setOpError(undefined); setOpResult(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/fetch\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId }),\n });\n if (!res.ok) throw new Error(\"fetch failed\");\n const data = (await res.json()) as { output: string };\n setOpResult(data.output.trim().split(\"\\n\").pop() ?? \"Fetched\");\n } catch (err) { setOpError(err instanceof Error ? err.message : \"fetch failed\"); }\n finally { setBusy(false); }\n };\n\n const checkout = async (branch: string) => {\n setBranchBusy(branch); setOpError(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/checkout\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId, branch }),\n });\n if (!res.ok) throw new Error(\"checkout failed\");\n await Promise.all([fetchStatus(), reloadBranches()]);\n } catch (err) { setOpError(err instanceof Error ? err.message : \"checkout failed\"); }\n finally { setBranchBusy(undefined); }\n };\n\n const reloadBranches = async () => {\n const qs = new URLSearchParams({ projectId });\n try {\n const res = await authFetch(`/api/v1/git/branches?${qs}`);\n const d = await res.json() as { branches: GitBranch[] };\n setBranches(d.branches);\n } catch { /* ignore */ }\n };\n\n const reloadWorktrees = async () => {\n const qs = new URLSearchParams({ projectId });\n try {\n const res = await authFetch(`/api/v1/git/worktrees?${qs}`);\n const d = await res.json() as { worktrees: GitWorktreeEntry[] };\n setWorktrees(d.worktrees);\n } catch { /* ignore */ }\n };\n\n const handleTryCommit = async (hash: string) => {\n setWorktreeBusy(hash);\n setOpError(undefined);\n setOpResult(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/worktree/add\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId, commitHash: hash }),\n });\n if (!res.ok) throw new Error(\"worktree creation failed\");\n const data = (await res.json()) as { path: string };\n setOpResult(`Worktree created at ${data.path}`);\n if (showWorktrees) await reloadWorktrees();\n } catch (err) {\n setOpError(err instanceof Error ? err.message : \"worktree creation failed\");\n } finally {\n setWorktreeBusy(undefined);\n }\n };\n\n const handleRemoveWorktree = async (path: string) => {\n setWorktreeBusy(path);\n setOpError(undefined);\n setOpResult(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/worktree/remove\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId, worktreePath: path }),\n });\n if (!res.ok) throw new Error(\"worktree removal failed\");\n setOpResult(`Removed worktree at ${path}`);\n await reloadWorktrees();\n } catch (err) {\n setOpError(err instanceof Error ? err.message : \"worktree removal failed\");\n } finally {\n setWorktreeBusy(undefined);\n }\n };\n\n /* ---------- commit file & diff loaders ---------- */\n\n const loadCommitFiles = useCallback(async (hash: string) => {\n const key = hash;\n const cached = commitFilesCache[key];\n if (cached !== undefined && cached.state === \"loaded\") return;\n\n setCommitFilesCache((s) => ({ ...s, [key]: { state: \"loading\" } }));\n try {\n const qs = new URLSearchParams({ projectId, hash });\n const res = await authFetch(`/api/v1/git/commit/files?${qs}`);\n if (!res.ok) throw new Error(\"commit files fetch failed\");\n const data = (await res.json()) as { files: CommitFileEntry[] };\n setCommitFilesCache((s) => ({\n ...s,\n [key]: { state: \"loaded\", value: data.files },\n }));\n } catch (err) {\n setCommitFilesCache((s) => ({\n ...s,\n [key]: { state: \"error\", message: err instanceof Error ? err.message : \"unknown error\" },\n }));\n }\n }, [projectId, commitFilesCache]);\n\n const toggleCommitDiff = useCallback(async (hash: string, path: string) => {\n const key = `${hash}|${path}`;\n const cached = commitDiffs[key];\n\n // Toggle: if open, close it\n if (cached !== undefined && cached.state === \"loaded\") {\n setCommitDiffs((s) => {\n const n = { ...s };\n delete n[key];\n return n;\n });\n return;\n }\n\n setCommitDiffs((s) => ({ ...s, [key]: { state: \"loading\" } }));\n try {\n const qs = new URLSearchParams({ projectId, hash, path });\n const res = await authFetch(`/api/v1/git/commit/diff?${qs}`);\n if (!res.ok) throw new Error(\"commit diff fetch failed\");\n const data = (await res.json()) as { diff: string };\n setCommitDiffs((s) => ({\n ...s,\n [key]: { state: \"loaded\", value: data.diff },\n }));\n } catch (err) {\n setCommitDiffs((s) => ({\n ...s,\n [key]: { state: \"error\", message: err instanceof Error ? err.message : \"unknown error\" },\n }));\n }\n }, [projectId, commitDiffs]);\n\n const toggleCommitExpanded = useCallback((hash: string) => {\n setExpandedCommits((prev) => {\n const next = new Set(prev);\n if (next.has(hash)) {\n next.delete(hash);\n } else {\n next.add(hash);\n }\n return next;\n });\n // Lazy-load files when expanding\n loadCommitFiles(hash);\n }, [loadCommitFiles]);\n\n /* ----------------------------- git init ----------------------------- */\n\n if (status?.isGitRepo === false) {\n const handleInit = async () => {\n setBusy(true); setOpError(undefined);\n try {\n const res = await authFetch(\"/api/v1/git/init\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ projectId }),\n });\n if (!res.ok) throw new Error(\"init failed\");\n await fetchStatus();\n } catch (err) { setOpError(err instanceof Error ? err.message : \"init failed\"); }\n finally { setBusy(false); }\n };\n return (\n <div style={{ padding: \"24px 16px\", textAlign: \"center\" }}>\n <p style={{ fontSize: \"12px\", color: \"var(--text-dim)\", marginBottom: \"12px\" }}>\n This project isn't a git repository.\n </p>\n <button\n onClick={handleInit}\n disabled={busy}\n style={{\n padding: \"6px 14px\", fontSize: \"12px\", fontWeight: 600,\n background: \"var(--accent-bg)\", color: \"var(--accent-text)\",\n border: \"1px solid var(--border)\", borderRadius: \"var(--radius-sm)\",\n cursor: busy ? \"default\" : \"pointer\", opacity: busy ? 0.5 : 1,\n }}\n >\n {busy ? \"Initializing…\" : \"Initialize git repo\"}\n </button>\n {opError && (\n <p style={{ fontSize: \"10px\", color: \"var(--error)\", marginTop: \"8px\" }}>{opError}</p>\n )}\n </div>\n );\n }\n\n const stagedFiles = status?.files.filter((f) => f.staged) ?? [];\n const unstagedFiles = status?.files.filter((f) => f.unstaged && !f.staged) ?? [];\n const trackedUnstaged = status?.files.filter((f) => f.unstaged) ?? [];\n const untrackedFiles = status?.files.filter((f) => f.kind === \"untracked\") ?? [];\n\n const s = {\n padding: \"4px 10px\", fontSize: \"10px\", fontWeight: 600,\n border: \"1px solid var(--border)\", borderRadius: \"var(--radius-sm)\",\n cursor: \"pointer\", background: \"transparent\", color: \"var(--text-secondary)\",\n };\n\n return (\n <div style={{ fontSize: \"13px\", color: \"var(--text-secondary)\", display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n {/* Header: branch + refresh */}\n <div style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n padding: \"10px 14px\", borderBottom: \"1px solid var(--border)\",\n }}>\n <span style={{ fontWeight: 700, fontSize: \"14px\", color: \"var(--text-primary)\" }}>\n {status?.branch ? (\n <><span style={{ color: \"var(--accent-text)\" }}>⎇</span> {status.branch}</>\n ) : \"—\"}\n </span>\n <button onClick={fetchStatus} title=\"Refresh\" className=\"git-action-btn git-refresh-btn\" type=\"button\">↻</button>\n </div>\n\n {/* Error/success banners */}\n {(statusError || opError) && (\n <div style={{ padding: \"4px 12px\", fontSize: \"10px\", color: \"var(--error)\", background: \"rgba(248,113,113,0.08)\", borderBottom: \"1px solid var(--border)\" }}>\n {opError ?? statusError}\n </div>\n )}\n {opResult && (\n <div style={{ padding: \"4px 12px\", fontSize: \"10px\", color: \"var(--accent-text)\", background: \"rgba(152,195,121,0.08)\", borderBottom: \"1px solid var(--border)\" }}>\n {opResult}\n </div>\n )}\n\n {/* Scrollable content */}\n <div style={{ flex: 1, overflowY: \"auto\" }}>\n {status === undefined && (\n <div style={{ padding: \"16px\", textAlign: \"center\", color: \"var(--text-dim)\", fontSize: \"11px\" }}>Loading git status…</div>\n )}\n\n {/* ── Staged files ── */}\n {stagedFiles.length > 0 && (\n <FileGroup\n label={`Staged (${stagedFiles.length})`}\n files={stagedFiles}\n onFileAction={(f) => unstage([f.path])}\n fileActionLabel=\"Unstage\"\n groupActionLabel=\"Unstage all\"\n onGroupAction={() => unstage(stagedFiles.map((f) => f.path))}\n onClickFile={(f) => toggleDiff(f, true)}\n openDiffs={openDiffs}\n staged\n />\n )}\n\n {/* ── Unstaged changes ── */}\n {trackedUnstaged.length > 0 && (\n <FileGroup\n label={`Changes (${trackedUnstaged.length})`}\n files={trackedUnstaged}\n onFileAction={(f) => stage([f.path])}\n fileActionLabel=\"Stage\"\n groupActionLabel=\"Stage all\"\n onGroupAction={() => stage(trackedUnstaged.map((f) => f.path))}\n onClickFile={(f) => toggleDiff(f, false)}\n onRevert={(f) => handleRevert(f.path)}\n pendingRevert={pendingRevert}\n openDiffs={openDiffs}\n staged={false}\n />\n )}\n\n {/* ── Untracked files ── */}\n {untrackedFiles.length > 0 && (\n <FileGroup\n label={`Untracked (${untrackedFiles.length})`}\n files={untrackedFiles}\n onFileAction={(f) => stage([f.path])}\n fileActionLabel=\"Stage\"\n groupActionLabel=\"Stage all\"\n onGroupAction={() => stage(untrackedFiles.map((f) => f.path))}\n onClickFile={(f) => toggleDiff(f, false)}\n openDiffs={openDiffs}\n staged={false}\n />\n )}\n\n {status?.files.length === 0 && (\n <div style={{ padding: \"16px\", textAlign: \"center\", color: \"var(--text-dim)\", fontSize: \"11px\" }}>\n Working tree clean.\n </div>\n )}\n\n {/* ── Commit section ── */}\n <div style={{ borderTop: \"1px solid var(--border)\", padding: \"10px 12px\" }}>\n <textarea\n value={commitMessage}\n onChange={(e) => setCommitMessage(e.target.value)}\n placeholder=\"Commit message…\"\n rows={3}\n style={{\n width: \"100%\", resize: \"none\", fontSize: \"13px\",\n background: \"var(--bg-glass)\", border: \"1px solid var(--border)\",\n borderRadius: \"var(--radius-sm)\", padding: \"8px 10px\",\n color: \"var(--text-primary)\", outline: \"none\", fontFamily: \"inherit\",\n }}\n />\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginTop: \"8px\" }}>\n <span style={{ fontSize: \"12px\", color: \"var(--text-dim)\" }}>{stagedFiles.length} staged</span>\n <button\n onClick={commit}\n disabled={busy || stagedFiles.length === 0 || !commitMessage.trim()}\n className={`git-action-btn git-commit-btn ${stagedFiles.length > 0 && commitMessage.trim() ? \"ready\" : \"disabled\"}`}\n type=\"button\"\n >\n Commit\n </button>\n </div>\n </div>\n\n {/* ── Push / Pull / Fetch ── */}\n <div style={{ borderTop: \"1px solid var(--border)\", padding: \"10px 12px\" }}>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <button onClick={doFetch} disabled={busy} className=\"git-action-btn git-remote-btn\" type=\"button\">Fetch</button>\n <button onClick={doPull} disabled={busy} className=\"git-action-btn git-remote-btn\" type=\"button\">Pull</button>\n <button onClick={doPush} disabled={busy} className=\"git-action-btn git-remote-btn\" type=\"button\">Push</button>\n </div>\n </div>\n </div>\n\n {/* ── Log ── */}\n <div style={{ borderTop: \"1px solid var(--border)\" }}>\n <button\n onClick={() => setShowLog((v) => !v)}\n className=\"git-section-toggle\"\n type=\"button\"\n >\n <span>Log</span>\n <span className={`git-section-chevron${showLog ? \" open\" : \"\"}`}>▾</span>\n </button>\n {showLog && (\n <div style={{ padding: \"0 12px 8px\" }}>\n {log === undefined ? (\n <div style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>Loading…</div>\n ) : log.length === 0 ? (\n <div style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>No commits yet.</div>\n ) : (\n <ul style={{ listStyle: \"none\", padding: 0, margin: 0 }}>\n {log.map((c) => {\n const busy = worktreeBusy === c.hash;\n const expanded = expandedCommits.has(c.hash);\n const filesEntry = commitFilesCache[c.hash];\n\n return (\n <li key={c.hash} style={{ borderBottom: \"1px solid var(--border)\", fontSize: \"11px\" }}>\n {/* Commit row — click to expand */}\n <div\n onClick={() => toggleCommitExpanded(c.hash)}\n style={{\n display: \"flex\", gap: \"6px\", alignItems: \"baseline\",\n padding: \"4px 0\", cursor: \"pointer\",\n }}\n >\n <span style={{ fontSize: \"8px\", color: \"var(--text-dim)\", width: \"10px\", flexShrink: 0 }}>\n {expanded ? \"▾\" : \"▸\"}\n </span>\n <code style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontFamily: \"monospace\" }}>\n {c.hash.slice(0, 7)}\n </code>\n <span style={{\n color: \"var(--text-primary)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n }}>\n {c.message}\n </span>\n <button\n onClick={(e) => { e.stopPropagation(); handleTryCommit(c.hash); }}\n disabled={busy}\n title=\"Try this commit in a linked worktree\"\n className=\"git-try-btn\"\n type=\"button\"\n >\n {busy ? \"…\" : \"Try →\"}\n </button>\n </div>\n <div style={{ fontSize: \"9px\", color: \"var(--text-dim)\", paddingLeft: \"16px\", marginBottom: expanded ? 4 : 0 }}>\n {c.author} · {new Date(c.date).toLocaleString()}\n </div>\n\n {/* Expanded: files + diffs */}\n {expanded && (\n <div style={{ padding: \"0 0 4px 16px\" }}>\n {filesEntry === undefined || filesEntry.state === \"loading\" ? (\n <div style={{ fontSize: \"9px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>\n Loading files…\n </div>\n ) : filesEntry.state === \"error\" ? (\n <div style={{ fontSize: \"9px\", color: \"var(--error)\" }}>\n {filesEntry.message}\n </div>\n ) : filesEntry.value.length === 0 ? (\n <div style={{ fontSize: \"9px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>\n (no files)\n </div>\n ) : (\n <ul style={{ listStyle: \"none\", padding: 0, margin: 0 }}>\n {filesEntry.value.map((f) => {\n const diffKey = `${c.hash}|${f.path}`;\n const diffEntry = commitDiffs[diffKey];\n return (\n <li key={f.path} style={{ borderTop: \"1px solid var(--border)\" }}>\n {/* File row */}\n <div\n onClick={() => toggleCommitDiff(c.hash, f.path)}\n style={{\n display: \"flex\", alignItems: \"center\", gap: \"4px\",\n padding: \"3px 4px\", cursor: \"pointer\",\n fontSize: \"10px\", fontFamily: \"monospace\",\n background: diffEntry !== undefined && diffEntry.state === \"loaded\"\n ? \"var(--accent-subtle)\" : \"transparent\",\n }}\n >\n <span style={{\n width: \"14px\", flexShrink: 0, textAlign: \"center\",\n fontWeight: 700, fontSize: \"10px\",\n color: commitKindColor(f.changeType),\n }}>\n {commitKindBadge(f.changeType)}\n </span>\n <span style={{\n flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\", color: \"var(--text-primary)\",\n }}>\n {f.path}\n </span>\n <span style={{ fontSize: \"8px\", color: \"var(--text-dim)\" }}>\n {diffEntry !== undefined && diffEntry.state === \"loaded\" ? \"▾\" : \"▸\"}\n </span>\n </div>\n {/* Inline diff */}\n {diffEntry !== undefined && diffEntry.state === \"loaded\" && (\n <div style={{\n borderTop: \"1px solid var(--border)\",\n background: \"var(--bg-glass)\",\n padding: \"4px 8px\",\n }}>\n <DiffView diff={diffEntry.value} />\n </div>\n )}\n {diffEntry !== undefined && diffEntry.state === \"loading\" && (\n <div style={{\n fontSize: \"9px\", color: \"var(--text-dim)\",\n fontStyle: \"italic\", padding: \"2px 8px\",\n }}>\n Loading diff…\n </div>\n )}\n {diffEntry !== undefined && diffEntry.state === \"error\" && (\n <div style={{\n fontSize: \"9px\", color: \"var(--error)\",\n padding: \"2px 8px\",\n }}>\n {diffEntry.message}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n )}\n </div>\n\n {/* ── Worktrees ── */}\n <div style={{ borderTop: \"1px solid var(--border)\" }}>\n <button\n onClick={() => setShowWorktrees((v) => !v)}\n className=\"git-section-toggle\"\n type=\"button\"\n >\n <span>Worktrees</span>\n <span className={`git-section-chevron${showWorktrees ? \" open\" : \"\"}`}>▾</span>\n </button>\n {showWorktrees && (\n <div style={{ padding: \"0 12px 8px\" }}>\n {worktrees === undefined ? (\n <div style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>Loading…</div>\n ) : worktrees.length === 0 ? (\n <div style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>No worktrees.</div>\n ) : (\n <ul style={{ listStyle: \"none\", padding: 0, margin: 0 }}>\n {worktrees.filter((w) => !w.current).map((w) => {\n const busy = worktreeBusy === w.path;\n const copied = copiedPath === w.path;\n return (\n <li key={w.path} style={{\n display: \"flex\", alignItems: \"center\", gap: \"4px\",\n padding: \"3px 4px\", borderRadius: \"var(--radius-sm)\",\n fontSize: \"10px\", fontFamily: \"monospace\",\n color: \"var(--text-secondary)\",\n }}>\n <span style={{ flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {w.path}\n </span>\n {w.head && (\n <span style={{ fontSize: \"9px\", color: \"var(--text-dim)\" }}>\n {w.head.slice(0, 7)}\n </span>\n )}\n <button\n onClick={() => {\n copyToClipboard(w.path);\n setCopiedPath(w.path);\n setTimeout(() => setCopiedPath(undefined), 1500);\n }}\n title=\"Copy path\"\n style={{\n background: \"none\", border: \"none\", cursor: \"pointer\",\n fontSize: \"10px\", color: copied ? \"var(--accent-text)\" : \"var(--text-dim)\",\n padding: \"1px 4px\", opacity: 0.7,\n }}\n type=\"button\"\n >\n {copied ? \"✓\" : \"📋\"}\n </button>\n <button\n onClick={() => handleRemoveWorktree(w.path)}\n disabled={busy}\n style={{\n background: \"none\", border: \"none\", cursor: \"pointer\",\n fontSize: \"10px\", color: \"var(--error)\", padding: \"1px 4px\",\n opacity: busy ? 0.4 : 0.7,\n }}\n type=\"button\"\n >\n {busy ? \"…\" : \"✕\"}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n )}\n </div>\n\n {/* ── Branches ── */}\n <div style={{ borderTop: \"1px solid var(--border)\" }}>\n <button\n onClick={() => setShowBranches((v) => !v)}\n className=\"git-section-toggle\"\n type=\"button\"\n >\n <span>Branches</span>\n <span className={`git-section-chevron${showBranches ? \" open\" : \"\"}`}>▾</span>\n </button>\n {showBranches && (\n <div style={{ padding: \"0 12px 8px\" }}>\n {branches === undefined ? (\n <div style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>Loading…</div>\n ) : branches.length === 0 ? (\n <div style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>No branches.</div>\n ) : (\n <ul style={{ listStyle: \"none\", padding: 0, margin: 0 }}>\n {branches.map((b) => {\n const busy = branchBusy === b.name;\n return (\n <li key={b.name} style={{\n display: \"flex\", alignItems: \"center\", gap: \"4px\",\n padding: \"3px 4px\", borderRadius: \"var(--radius-sm)\",\n fontSize: \"11px\", fontFamily: \"monospace\",\n color: b.current ? \"var(--accent-text)\" : \"var(--text-secondary)\",\n }}>\n <span style={{ width: \"12px\", flexShrink: 0 }}>\n {b.current ? \"✓\" : \"\"}\n </span>\n <span style={{ flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {b.name}\n </span>\n {b.remote && (\n <span style={{ fontSize: \"9px\", color: \"var(--text-dim)\" }}>remote</span>\n )}\n {!b.current && !b.remote && (\n <div style={{ display: \"flex\", gap: \"2px\" }}>\n <button\n onClick={() => checkout(b.name)}\n disabled={busy}\n style={{\n background: \"none\", border: \"none\", cursor: \"pointer\",\n fontSize: \"10px\", color: \"var(--text-dim)\", padding: \"1px 4px\",\n opacity: busy ? 0.4 : 0.7,\n }}\n type=\"button\"\n >\n checkout\n </button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ----------------------------- sub-components ----------------------------- */\n\ninterface FileGroupProps {\n label: string;\n files: GitFileStatus[];\n onFileAction: (f: GitFileStatus) => void;\n fileActionLabel: string;\n groupActionLabel: string;\n onGroupAction: () => void;\n onClickFile: (f: GitFileStatus) => void;\n openDiffs: Record<string, string | \"loading\" | \"error\">;\n staged: boolean;\n onRevert?: (f: GitFileStatus) => void;\n pendingRevert?: string;\n}\n\nfunction FileGroup(props: FileGroupProps) {\n return (\n <div>\n <div style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n padding: \"8px 14px\", borderBottom: \"1px solid var(--border)\",\n background: \"var(--accent-subtle)\",\n }}>\n <span style={{ fontSize: \"11px\", fontWeight: 700, textTransform: \"uppercase\", letterSpacing: \"0.5px\", color: \"var(--text-secondary)\" }}>\n {props.label}\n </span>\n <button\n onClick={props.onGroupAction}\n className=\"git-action-btn git-group-action-btn\"\n type=\"button\"\n >\n {props.groupActionLabel}\n </button>\n </div>\n <ul style={{ listStyle: \"none\", padding: 0, margin: 0 }}>\n {props.files.map((f) => {\n const key = `${f.path}|${props.staged ? \"staged\" : \"unstaged\"}`;\n const diffState = props.openDiffs[key];\n return (\n <li key={f.path} style={{ borderBottom: \"1px solid var(--border)\" }}>\n <div className=\"git-file-row\">\n {/* Badge */}\n <span style={{\n width: \"20px\", flexShrink: 0, textAlign: \"center\",\n fontSize: \"12px\", fontFamily: \"monospace\", fontWeight: 700,\n color: kindColor(f.kind),\n }}>\n {kindBadge(f.kind)}\n </span>\n {/* File name */}\n <button\n onClick={() => props.onClickFile(f)}\n style={{\n flex: 1, background: \"none\", border: \"none\",\n color: \"var(--text-primary)\", cursor: \"pointer\",\n fontSize: \"12px\", fontFamily: \"monospace\",\n textAlign: \"left\", overflow: \"hidden\", textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\", padding: \"2px 4px\", borderRadius: \"var(--radius-sm)\",\n }}\n type=\"button\"\n >\n {f.path}\n </button>\n {/* Revert */}\n {props.onRevert && (\n <button\n onClick={() => props.onRevert!(f)}\n className={`git-action-btn git-revert-btn${props.pendingRevert === f.path ? \" pending\" : \"\"}`}\n title=\"Revert (discard changes)\"\n type=\"button\"\n >\n {props.pendingRevert === f.path ? \"Confirm?\" : \"↩\"}\n </button>\n )}\n {/* Action */}\n <button\n onClick={() => props.onFileAction(f)}\n className=\"git-action-btn git-file-action-btn\"\n type=\"button\"\n >\n {props.fileActionLabel}\n </button>\n </div>\n {/* Inline diff */}\n {diffState !== undefined && (\n <div style={{ borderTop: \"1px solid var(--border)\", background: \"var(--bg-glass)\", padding: \"4px 12px\" }}>\n {diffState === \"loading\" ? (\n <div style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>Loading diff…</div>\n ) : diffState === \"error\" ? (\n <div style={{ fontSize: \"10px\", color: \"var(--error)\" }}>Failed to load diff.</div>\n ) : diffState.length === 0 ? (\n <div style={{ fontSize: \"10px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>(no diff)</div>\n ) : (\n <DiffView diff={diffState} />\n )}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/* ─── DiffView — colored unified-diff renderer ─── */\n\ninterface DiffViewProps {\n diff: string;\n}\n\nfunction DiffView({ diff }: DiffViewProps) {\n const lines = diff.split(\"\\n\");\n\n return (\n <div style={{ fontSize: \"10px\", overflow: \"auto\", lineHeight: 1.5, fontFamily: \"monospace\", whiteSpace: \"pre\", maxHeight: \"320px\" }}>\n {lines.map((line, i) => {\n const prefix = line.charAt(0);\n let bg: string | undefined;\n let color: string | undefined;\n let leftBorder: string | undefined;\n\n if (prefix === \"+\") {\n bg = \"rgba(152,195,121,0.12)\";\n color = \"#b8d4a0\";\n leftBorder = \"2px solid rgba(152,195,121,0.5)\";\n } else if (prefix === \"-\") {\n bg = \"rgba(248,113,113,0.12)\";\n color = \"#f0a0a0\";\n leftBorder = \"2px solid rgba(248,113,113,0.5)\";\n } else if (line.startsWith(\"@@\")) {\n bg = \"rgba(139,169,219,0.08)\";\n color = \"var(--accent-text)\";\n }\n\n return (\n <div\n key={i}\n style={{\n background: bg ?? \"transparent\",\n color: color ?? \"var(--text-secondary)\",\n borderLeft: leftBorder ?? \"2px solid transparent\",\n padding: \"0 8px\",\n minHeight: \"14px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {line || \"\\u00A0\"}\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Copy `text` to clipboard. Works on HTTPS and HTTP (both desktop +\n * mobile) by trying the async Clipboard API first and falling back\n * to the legacy `execCommand('copy')` via a temp textarea. On mobile\n * the textarea approach is the most reliable since the async API is\n * restricted to secure contexts on some browsers.\n */\nfunction copyToClipboard(text: string): void {\n if (navigator.clipboard?.writeText !== undefined) {\n navigator.clipboard.writeText(text).catch(() => {\n fallbackCopy(text);\n });\n } else {\n fallbackCopy(text);\n }\n}\n\nfunction fallbackCopy(text: string): void {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n ta.style.pointerEvents = \"none\";\n document.body.appendChild(ta);\n ta.select();\n try {\n document.execCommand(\"copy\");\n } catch {\n // Still failed — at least the path is visible in the UI\n }\n document.body.removeChild(ta);\n}\n\n\nfunction kindBadge(kind: FileStatusKind): string {\n switch (kind) {\n case \"modified\": return \"M\";\n case \"added\": return \"A\";\n case \"deleted\": return \"D\";\n case \"renamed\": return \"R\";\n case \"copied\": return \"C\";\n case \"untracked\": return \"?\";\n case \"ignored\": return \"!\";\n case \"conflicted\": return \"U\";\n default: return \"·\";\n }\n}\n\nfunction kindColor(kind: FileStatusKind): string {\n switch (kind) {\n case \"modified\": return \"var(--accent-text)\";\n case \"added\": return \"#98c379\";\n case \"deleted\": return \"var(--error)\";\n case \"untracked\": return \"var(--text-dim)\";\n case \"conflicted\": return \"var(--error)\";\n default: return \"var(--text-dim)\";\n }\n}\n\n/* ─── Commit file helpers (same visual style) ─── */\n\nfunction commitKindBadge(changeType: string): string {\n switch (changeType) {\n case \"A\": return \"A\";\n case \"M\": return \"M\";\n case \"D\": return \"D\";\n case \"R\": return \"R\";\n case \"C\": return \"C\";\n default: return \"·\";\n }\n}\n\nfunction commitKindColor(changeType: string): string {\n switch (changeType) {\n case \"M\": return \"var(--accent-text)\";\n case \"A\": return \"#98c379\";\n case \"D\": return \"var(--error)\";\n default: return \"var(--text-dim)\";\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CodeMirrorEditor } from \"./CodeMirrorEditor\";\nimport { LoadingSkeleton } from \"./LoadingSkeleton\";\nimport { RenderedView } from \"./RenderedView\";\nimport { GitPanel } from \"./GitPanel\";\nimport { filesTree, filesRead, filesWrite, filesRename, filesMkdir, filesDelete, filesMove, filesSearch, filesUpload, filesDownload } from \"../lib/api-client\";\nimport { useSessionStore } from \"../stores/session-store\";\n\ninterface TreeNode {\n name: string;\n path: string;\n type: \"file\" | \"directory\";\n children?: TreeNode[];\n}\n\n// ─── Web FileSystem helpers for folder drag-and-drop ───\n// Uses DataTransferItem.webkitGetAsEntry() → FileSystemDirectoryEntry → FileSystemFileEntry\n// to recursively read directory contents from OS drag-and-drop.\n// Works in Chrome/Edge/Safari. Firefox has partial support.\n\ntype FileSystemEntryLike = { name: string; isFile: boolean; isDirectory: boolean };\ntype FileSystemFileEntryLike = FileSystemEntryLike & {\n isFile: true;\n file: (success: (file: File) => void, failure?: (err: DOMException) => void) => void;\n};\ntype FileSystemDirectoryEntryLike = FileSystemEntryLike & {\n isDirectory: true;\n createReader: () => { readEntries: (cb: (entries: FileSystemEntryLike[]) => void) => void };\n};\n\nfunction getDataTransferEntry(item: DataTransferItem): FileSystemEntryLike | null {\n const withEntry = item as unknown as { webkitGetAsEntry?: () => FileSystemEntryLike | null };\n return withEntry.webkitGetAsEntry?.() ?? null;\n}\n\nfunction withUploadRelativePath(file: File, relativePath: string): File {\n const uploadFile = file as File & { uploadRelativePath?: string };\n uploadFile.uploadRelativePath = relativePath;\n return uploadFile;\n}\n\nasync function collectEntryFiles(\n entry: FileSystemEntryLike,\n relativePath: string,\n out: File[],\n): Promise<void> {\n if (entry.isFile) {\n const file = await new Promise<File>((resolve, reject) => {\n (entry as FileSystemFileEntryLike).file(resolve, reject);\n });\n out.push(withUploadRelativePath(file, relativePath));\n return;\n }\n if (!entry.isDirectory) return;\n const reader = (entry as FileSystemDirectoryEntryLike).createReader();\n const children = await new Promise<FileSystemEntryLike[]>((resolve) => {\n reader.readEntries(resolve);\n });\n await Promise.all(\n children.map((child) => collectEntryFiles(child, `${relativePath}/${child.name}`, out)),\n );\n}\n\nasync function collectDroppedUploadFiles(dataTransfer: DataTransfer): Promise<File[]> {\n const entries = Array.from(dataTransfer.items)\n .map((item) => getDataTransferEntry(item))\n .filter((entry): entry is FileSystemEntryLike => entry !== null);\n if (entries.length === 0) {\n // Fallback: plain file drag (no directory entries)\n return Array.from(dataTransfer.files).map((file) => withUploadRelativePath(file, file.name));\n }\n const files: File[] = [];\n for (const entry of entries) {\n await collectEntryFiles(entry, entry.name, files);\n }\n return files;\n}\n\nexport type ExplorerTab = \"files\" | \"git\";\n\ninterface Props {\n projectId: string;\n open: boolean;\n onClose: () => void;\n initialTab?: ExplorerTab;\n}\n\ninterface SearchMatch {\n path: string;\n line: number;\n column: number;\n length: number;\n lineSnippet: string;\n}\n\ninterface SearchResult {\n engine: \"ripgrep\" | \"node\";\n matches: SearchMatch[];\n truncated: boolean;\n}\n\ninterface OpenFileState {\n path: string;\n content: string;\n saved: string;\n dirty: boolean;\n language: string;\n saving: boolean;\n loadingError?: string;\n}\n\ntype PaneView = \"tree\" | \"editor\";\n\nconst DEFAULT_EXPLORER_WIDTH = 360;\nconst MIN_EXPLORER_WIDTH = 220;\nconst MAX_EXPLORER_WIDTH = 800;\n\nconst CONTENT_SEARCH_DEBOUNCE_MS = 300;\nconst MIN_CONTENT_SEARCH_LEN = 3;\n\nfunction groupByPath(matches: SearchMatch[]): [string, SearchMatch[]][] {\n const map = new Map<string, SearchMatch[]>();\n for (const m of matches) {\n const list = map.get(m.path);\n if (list === undefined) map.set(m.path, [m]);\n else list.push(m);\n }\n return Array.from(map.entries());\n}\n\nexport function FileExplorer({ projectId, open, onClose, initialTab }: Props) {\n const [tree, setTree] = useState<TreeNode[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [search, setSearch] = useState(\"\");\n const [renaming, setRenaming] = useState<string | undefined>();\n const [renameDraft, setRenameDraft] = useState(\"\");\n const [showCreate, setShowCreate] = useState<\"file\" | \"folder\" | undefined>();\n const [createParent, setCreateParent] = useState(\"\");\n const [createName, setCreateName] = useState(\"\");\n const [confirmDelete, setConfirmDelete] = useState<string | undefined>();\n const [openFiles, setOpenFiles] = useState<OpenFileState[]>([]);\n const [activePath, setActivePath] = useState<string | undefined>();\n const [tab, setTab] = useState<ExplorerTab>(initialTab ?? \"files\");\n const [view, setView] = useState<PaneView>(\"tree\");\n\n // Sync initialTab changes (e.g. when header git button clicked while panel is open)\n useEffect(() => {\n if (initialTab !== undefined && initialTab !== tab) {\n setTab(initialTab);\n if (initialTab === \"files\") setView(\"tree\");\n }\n }, [initialTab]);\n const [editorMode, setEditorMode] = useState<\"raw\" | \"rendered\">(\"raw\");\n const [wordWrap, setWordWrap] = useState(true);\n\n // ── Context menu for right-click / long-press ──\n const [contextMenu, setContextMenu] = useState<{\n x: number;\n y: number;\n node: TreeNode;\n } | null>(null);\n const contextMenuRef = useRef<HTMLDivElement>(null);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const longPressPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const uploadRef = useRef<HTMLInputElement>(null);\n const uploadFolderRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const [dropTargetFolder, setDropTargetFolder] = useState<string | undefined>(undefined);\n const dragOverFolder = useRef<string | undefined>(undefined);\n const projectPath = useSessionStore((s) =>\n s.projects.find((p) => p.id === projectId)?.path ?? \"\",\n );\n\n // ── Resizable panel ──\n const [panelWidth, setPanelWidth] = useState(DEFAULT_EXPLORER_WIDTH);\n const resizeRef = useRef<{ startX: number; startW: number } | undefined>(undefined);\n\n const onResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n resizeRef.current = { startX: e.clientX, startW: panelWidth };\n const onMove = (ev: MouseEvent) => {\n if (resizeRef.current === undefined) return;\n const dx = ev.clientX - resizeRef.current.startX;\n const w = Math.min(MAX_EXPLORER_WIDTH, Math.max(MIN_EXPLORER_WIDTH, resizeRef.current.startW - dx));\n setPanelWidth(w);\n };\n const onUp = () => {\n resizeRef.current = undefined;\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n }, [panelWidth]);\n\n // ── Content search state (integrated into Files tab) ──\n const [contentSearchResults, setContentSearchResults] = useState<SearchResult | undefined>(undefined);\n const [contentSearchLoading, setContentSearchLoading] = useState(false);\n const [contentSearchError, setContentSearchError] = useState<string | undefined>();\n const [expandedSearchFiles, setExpandedSearchFiles] = useState<Set<string>>(new Set());\n\n // Debounced content search that fires when the tree's filename search is long enough\n useEffect(() => {\n if (tab !== \"files\" || !open) {\n setContentSearchResults(undefined);\n return;\n }\n const q = search.trim();\n if (q.length < MIN_CONTENT_SEARCH_LEN) {\n setContentSearchResults(undefined);\n setContentSearchError(undefined);\n setContentSearchLoading(false);\n return;\n }\n setContentSearchLoading(true);\n setContentSearchError(undefined);\n\n const timer = setTimeout(async () => {\n try {\n const res = await filesSearch(projectId, q);\n setContentSearchResults(res);\n const groups = groupByPath(res.matches);\n setExpandedSearchFiles(new Set(groups.slice(0, 5).map(([p]) => p)));\n } catch (err) {\n setContentSearchError(err instanceof Error ? err.message : \"search failed\");\n setContentSearchResults(undefined);\n } finally {\n setContentSearchLoading(false);\n }\n }, CONTENT_SEARCH_DEBOUNCE_MS);\n\n return () => clearTimeout(timer);\n }, [search, tab, open, projectId]);\n\n // ── Close context menu on click outside / Escape ──\n useEffect(() => {\n if (!contextMenu) return;\n const handleClick = (e: MouseEvent) => {\n if (contextMenuRef.current && !contextMenuRef.current.contains(e.target as Node)) {\n setContextMenu(null);\n }\n };\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setContextMenu(null);\n };\n // Delay adding listener to avoid the same click that opened the menu from closing it\n const raf = requestAnimationFrame(() => {\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n });\n return () => {\n cancelAnimationFrame(raf);\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [contextMenu]);\n\n // ── Clipboard helpers ──\n const copyToClipboard = useCallback(async (text: string, label: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setError(undefined);\n } catch {\n // Fallback for insecure contexts\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n document.body.removeChild(ta);\n }\n }, []);\n\n const handleCopyRelativePath = useCallback((path: string) => {\n copyToClipboard(path, \"Relative path\");\n setContextMenu(null);\n }, [copyToClipboard]);\n\n const handleCopyAbsolutePath = useCallback((path: string) => {\n const abs = projectPath ? `${projectPath}/${path}`.replace(/\\/$/, \"\") : path;\n copyToClipboard(abs, \"Absolute path\");\n setContextMenu(null);\n }, [projectPath, copyToClipboard]);\n\n // ── Context menu handlers ──\n const showContextMenu = useCallback((e: React.MouseEvent | { clientX: number; clientY: number }, node: TreeNode) => {\n const panel = document.querySelector(\".file-explorer-panel\");\n if (!panel) return;\n const rect = panel.getBoundingClientRect();\n // Clamp to panel bounds\n const x = Math.min(e.clientX - rect.left, rect.width - 180);\n const y = Math.min(e.clientY - rect.top, rect.height - 120);\n setContextMenu({ x: Math.max(4, x), y: Math.max(4, y), node });\n }, []);\n\n const handleRowContextMenu = useCallback((e: React.MouseEvent, node: TreeNode) => {\n e.preventDefault();\n e.stopPropagation();\n showContextMenu(e, node);\n }, [showContextMenu]);\n\n const handleTouchStart = useCallback((e: React.TouchEvent, node: TreeNode) => {\n const touch = e.touches[0];\n longPressPos.current = { x: touch.clientX, y: touch.clientY };\n longPressTimer.current = setTimeout(() => {\n longPressTimer.current = undefined;\n showContextMenu({ clientX: touch.clientX, clientY: touch.clientY }, node);\n }, 500);\n }, [showContextMenu]);\n\n const handleTouchEnd = useCallback(() => {\n if (longPressTimer.current) {\n clearTimeout(longPressTimer.current);\n longPressTimer.current = undefined;\n }\n }, []);\n\n const handleTouchMove = useCallback(() => {\n if (longPressTimer.current) {\n clearTimeout(longPressTimer.current);\n longPressTimer.current = undefined;\n }\n }, []);\n\n const renameRef = useRef<HTMLInputElement>(null);\n const createRef = useRef<HTMLInputElement>(null);\n\n const loadTree = useCallback(async () => {\n setLoading(true);\n setError(undefined);\n try {\n const data = await filesTree(projectId);\n setTree((data as { children?: TreeNode[] }).children ?? []);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"load failed\");\n } finally {\n setLoading(false);\n }\n }, [projectId]);\n\n /**\n * Upload files into a project folder. `parentPath` is project-relative\n * (\"\" for root, \"src\" for src/, \"src/components\" for nested).\n * Files with `uploadRelativePath` (Web FileSystem API from drag-and-drop)\n * or `webkitRelativePath` (folder picker) have their sub-path\n * preserved automatically via the `path:<index>` field.\n */\n const handleUpload = useCallback(async (files: File[] | null, parentPath?: string) => {\n if (!files || files.length === 0) return;\n setUploading(true);\n setError(undefined);\n try {\n const fileArray = Array.from(files);\n await filesUpload(projectId, parentPath ?? \"\", fileArray);\n await loadTree();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"upload failed\");\n } finally {\n setUploading(false);\n }\n }, [projectId, loadTree]);\n\n useEffect(() => { loadTree(); }, [loadTree]);\n\n useEffect(() => {\n if (showCreate) createRef.current?.focus();\n }, [showCreate]);\n useEffect(() => {\n if (renaming !== undefined) renameRef.current?.focus();\n }, [renaming]);\n\n const openFile = useCallback(async (path: string) => {\n const existing = openFiles.find((f) => f.path === path);\n if (existing) {\n setActivePath(path);\n setView(\"editor\");\n return;\n }\n\n setError(undefined);\n const placeholder: OpenFileState = {\n path, content: \"\", saved: \"\", dirty: false, language: \"\", saving: false,\n };\n setOpenFiles((prev) => [...prev, placeholder]);\n setActivePath(path);\n setView(\"editor\");\n\n try {\n const data = await filesRead(projectId, path);\n const content = data.binary ? \"(binary file)\" : data.content ?? \"\";\n setOpenFiles((prev) =>\n prev.map((f) =>\n f.path === path ? { ...f, content, saved: content, language: data.language, dirty: false } : f,\n ),\n );\n } catch (err) {\n setError(err instanceof Error ? err.message : \"read failed\");\n setOpenFiles((prev) => prev.filter((f) => f.path !== path));\n setActivePath((prev) => (prev === path ? undefined : prev));\n setView(\"tree\");\n }\n }, [openFiles, activePath, projectId]);\n\n const handleTabClose = useCallback((path: string) => {\n setOpenFiles((prev) => prev.filter((f) => f.path !== path));\n setActivePath((prev) => {\n if (prev !== path) return prev;\n const remaining = openFiles.filter((f) => f.path !== path);\n return remaining.length > 0 ? remaining[remaining.length - 1].path : undefined;\n });\n }, [openFiles]);\n\n const handleSave = async () => {\n if (!activePath) return;\n const file = openFiles.find((f) => f.path === activePath);\n if (!file || file.saving) return;\n\n setOpenFiles((prev) => prev.map((f) => (f.path === activePath ? { ...f, saving: true } : f)));\n setError(undefined);\n try {\n await filesWrite(projectId, activePath, file.content);\n setOpenFiles((prev) =>\n prev.map((f) =>\n f.path === activePath ? { ...f, dirty: false, saved: file.content, saving: false } : f,\n ),\n );\n } catch (err) {\n setError(err instanceof Error ? err.message : \"save failed\");\n setOpenFiles((prev) => prev.map((f) => (f.path === activePath ? { ...f, saving: false } : f)));\n }\n };\n\n const handleContentChange = useCallback((value: string) => {\n if (!activePath) return;\n setOpenFiles((prev) =>\n prev.map((f) =>\n f.path === activePath ? { ...f, content: value, dirty: value !== f.saved } : f,\n ),\n );\n }, [activePath]);\n\n const toggleFolder = (path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path); else next.add(path);\n return next;\n });\n };\n\n const handleRename = async (oldPath: string) => {\n const name = renameDraft.trim();\n if (!name || name === oldPath.split(\"/\").pop()) {\n setRenaming(undefined);\n return;\n }\n try {\n await filesRename(projectId, oldPath, name);\n setRenaming(undefined);\n setOpenFiles((prev) =>\n prev.map((f) => {\n const parent = oldPath.includes(\"/\") ? oldPath.substring(0, oldPath.lastIndexOf(\"/\")) : \"\";\n const newPath = parent ? `${parent}/${name}` : name;\n return f.path === oldPath ? { ...f, path: newPath } : f;\n }),\n );\n if (activePath === oldPath) {\n const parent = oldPath.includes(\"/\") ? oldPath.substring(0, oldPath.lastIndexOf(\"/\")) : \"\";\n setActivePath(parent ? `${parent}/${name}` : name);\n }\n await loadTree();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"rename failed\");\n setRenaming(undefined);\n }\n };\n\n const handleCreate = async () => {\n const name = createName.trim();\n if (!name) { setShowCreate(undefined); return; }\n try {\n if (showCreate === \"folder\") {\n const parent = createParent || \"/\";\n await filesMkdir(projectId, parent, name);\n } else {\n const path = createParent ? `${createParent}/${name}` : `/${name}`;\n await filesWrite(projectId, path, \"\");\n }\n setShowCreate(undefined);\n setCreateName(\"\");\n await loadTree();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"create failed\");\n setShowCreate(undefined);\n }\n };\n\n const handleDelete = async (path: string) => {\n try {\n await filesDelete(projectId, path, { recursive: true });\n setConfirmDelete(undefined);\n setOpenFiles((prev) => prev.filter((f) => f.path !== path));\n setActivePath((prev) => {\n if (prev !== path) return prev;\n const remaining = openFiles.filter((f) => f.path !== path);\n return remaining.length > 0 ? remaining[0].path : undefined;\n });\n await loadTree();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"delete failed\");\n setConfirmDelete(undefined);\n }\n };\n\n // Filter tree by search\n const filteredTree = useMemo(() => {\n if (!search) return tree;\n const q = search.toLowerCase();\n const filter = (nodes: TreeNode[]): TreeNode[] =>\n nodes.filter((n) => {\n const match = n.name.toLowerCase().includes(q);\n if (n.type === \"directory\" && n.children) {\n const filtered = filter(n.children);\n return match || filtered.length > 0;\n }\n return match;\n });\n return filter(tree);\n }, [tree, search]);\n\n // ---- Tree node renderer ----\n const renderNode = (node: TreeNode, depth: number) => {\n const isExpanded = expanded.has(node.path);\n const isDir = node.type === \"directory\";\n const isRenaming = renaming === node.path;\n const isDropTarget = isDir && dropTargetFolder === node.path;\n\n return (\n <div key={node.path}>\n <div\n onContextMenu={(e) => handleRowContextMenu(e, node)}\n onTouchStart={(e) => handleTouchStart(e, node)}\n onTouchEnd={handleTouchEnd}\n onTouchMove={handleTouchMove}\n onDragStart={(e) => {\n e.stopPropagation();\n e.dataTransfer.setData(\"application/x-pi-path\", node.path);\n e.dataTransfer.effectAllowed = \"move\";\n }}\n onDragOver={isDir ? (e) => {\n e.preventDefault();\n e.stopPropagation();\n const hasPiPath = e.dataTransfer.types.includes(\"application/x-pi-path\");\n e.dataTransfer.dropEffect = hasPiPath ? \"move\" : \"copy\";\n dragOverFolder.current = node.path;\n setDropTargetFolder(node.path);\n } : undefined}\n onDragLeave={isDir ? () => {\n if (dragOverFolder.current === node.path) {\n dragOverFolder.current = undefined;\n setDropTargetFolder(undefined);\n }\n } : undefined}\n onDrop={isDir ? async (e) => {\n e.preventDefault();\n e.stopPropagation();\n setDropTargetFolder(undefined);\n dragOverFolder.current = undefined;\n\n // Unified drop handler: check for in-app drag (move) first,\n // then fall back to OS file drag (upload).\n const src = e.dataTransfer.getData(\"application/x-pi-path\");\n if (src.length > 0) {\n // In-app drag → MOVE\n if (src === node.path) return; // same dir = no-op\n if (node.path.startsWith(`${src}/`)) return; // refuse descendant\n const name = src.split(\"/\").pop() ?? \"\";\n const dest = `${node.path}/${name}`;\n try {\n await filesMove(projectId, src, dest);\n await loadTree();\n } catch {\n // error rendered via store/error slot\n }\n return;\n }\n\n // OS file drag → UPLOAD\n const files = await collectDroppedUploadFiles(e.dataTransfer);\n if (files.length > 0) await handleUpload(files, node.path);\n } : undefined}\n style={{\n display: \"flex\", alignItems: \"center\", gap: \"2px\",\n padding: \"2px 0\", paddingLeft: `${8 + depth * 16}px`,\n position: \"relative\",\n outline: isDropTarget ? \"1px solid var(--accent)\" : undefined,\n outlineOffset: \"-1px\",\n borderRadius: \"2px\",\n }}\n className={`file-tree-row${contextMenu?.node.path === node.path ? \" file-tree-row-active\" : \"\"}${isDropTarget ? \" file-tree-row-drop-target\" : \"\"}`}\n draggable={true}\n >\n {isDir ? (\n <button\n onClick={() => toggleFolder(node.path)}\n style={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", background: \"none\", border: \"none\", cursor: \"pointer\", padding: \"2px\", width: \"20px\", height: \"20px\", flexShrink: 0, color: \"var(--accent)\" }}\n type=\"button\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\n </svg>\n </button>\n ) : (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", width: \"20px\", height: \"20px\", flexShrink: 0, color: \"var(--text-dim)\" }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\" />\n <polyline points=\"13 2 13 9 20 9\" />\n </svg>\n </span>\n )}\n\n {isRenaming ? (\n <input\n ref={renameRef}\n value={renameDraft}\n onChange={(e) => setRenameDraft(e.target.value)}\n onBlur={() => handleRename(node.path)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleRename(node.path);\n if (e.key === \"Escape\") setRenaming(undefined);\n }}\n onClick={(e) => e.stopPropagation()}\n style={{\n flex: 1, background: \"var(--bg-solid)\", border: \"1px solid var(--border-bright)\",\n borderRadius: \"var(--radius-sm)\", padding: \"1px 4px\", fontSize: \"12px\",\n color: \"var(--text-primary)\", outline: \"none\", minWidth: 0,\n }}\n />\n ) : (\n <button\n onClick={() => { if (isDir) toggleFolder(node.path); else openFile(node.path); }}\n style={{\n flex: 1, background: \"none\", border: \"none\",\n color: \"var(--text-primary)\", cursor: \"pointer\", fontSize: \"12px\",\n textAlign: \"left\", padding: \"1px 4px\", borderRadius: \"var(--radius-sm)\",\n minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\",\n }}\n title={node.path}\n type=\"button\"\n >\n {node.name}\n </button>\n )}\n\n {!isRenaming && (\n <div style={{ display: \"flex\", gap: \"1px\", flexShrink: 0 }} className=\"file-row-actions\">\n {isDir && (\n <button\n onClick={() => { setCreateParent(node.path); setShowCreate(\"file\"); setCreateName(\"\"); }}\n title=\"New file in this folder\"\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: \"1px 3px\", fontSize: \"11px\", color: \"var(--text-dim)\" }} type=\"button\"\n >+</button>\n )}\n <button\n onClick={() => { setRenaming(node.path); setRenameDraft(node.name); setTimeout(() => renameRef.current?.focus(), 50); }}\n title=\"Rename\"\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: \"1px 3px\", fontSize: \"11px\", color: \"var(--text-dim)\" }} type=\"button\"\n >✏️</button>\n <button\n onClick={() => setConfirmDelete(node.path)}\n title=\"Delete\"\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: \"1px 3px\", fontSize: \"11px\", color: \"var(--text-dim)\" }} type=\"button\"\n >🗑</button>\n </div>\n )}\n </div>\n {isDir && isExpanded && node.children && (\n <div>{node.children.map((child) => renderNode(child, depth + 1))}</div>\n )}\n </div>\n );\n };\n\n const activeFile = openFiles.find((f) => f.path === activePath);\n\n return (\n <div\n className=\"file-explorer-panel\"\n style={{\n position: \"fixed\",\n top: 50,\n right: 0,\n bottom: 0,\n zIndex: 120,\n background: \"var(--bg-solid)\",\n borderLeft: \"1px solid var(--border)\",\n boxShadow: \"-10px 0 28px rgba(0,0,0,0.35)\",\n display: \"flex\",\n flexDirection: \"column\",\n width: panelWidth,\n transform: open ? \"translateX(0)\" : \"translateX(100%)\",\n transition: \"transform 0.18s ease\",\n willChange: \"transform\",\n userSelect: resizeRef.current !== undefined ? \"none\" : undefined,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* ── Resize handle ── */}\n <div\n onMouseDown={onResizeStart}\n className=\"file-explorer-resize-handle\"\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: \"5px\",\n cursor: \"col-resize\",\n zIndex: 10,\n background: \"transparent\",\n transition: \"background 0.15s ease\",\n }}\n />\n\n {/* ── Tab bar ── */}\n <div className=\"fe-tab-bar\" style={{\n display: \"flex\", borderBottom: \"1px solid var(--border)\",\n background: \"var(--bg-glass)\", flexShrink: 0,\n }}>\n <button\n onClick={() => { setTab(\"files\"); setView(\"tree\"); }}\n style={{\n flex: 1, padding: \"11px 12px\", fontSize: \"13px\", fontWeight: 600,\n background: tab === \"files\" ? \"var(--bg-solid)\" : \"transparent\",\n color: tab === \"files\" ? \"var(--accent-text)\" : \"var(--text-dim)\",\n border: \"none\", borderBottom: tab === \"files\" ? \"2px solid var(--accent-text)\" : \"2px solid transparent\",\n cursor: \"pointer\", transition: \"all 0.12s ease\",\n }}\n type=\"button\"\n >\n 📁 Files\n </button>\n <button\n onClick={() => setTab(\"git\")}\n style={{\n flex: 1, padding: \"11px 12px\", fontSize: \"13px\", fontWeight: 600,\n background: tab === \"git\" ? \"var(--bg-solid)\" : \"transparent\",\n color: tab === \"git\" ? \"var(--accent-text)\" : \"var(--text-dim)\",\n border: \"none\", borderBottom: tab === \"git\" ? \"2px solid var(--accent-text)\" : \"2px solid transparent\",\n cursor: \"pointer\", transition: \"all 0.12s ease\",\n }}\n type=\"button\"\n >\n ⎇ Git\n </button>\n\n </div>\n\n {/* ── Git tab ── */}\n {tab === \"git\" && (\n <GitPanel projectId={projectId} />\n )}\n\n {/* ── Files tab ── */}\n {tab === \"files\" && view === \"tree\" && (\n <>\n {/* Hidden file inputs for upload */}\n <input\n ref={uploadRef}\n type=\"file\"\n multiple\n style={{ display: \"none\" }}\n onChange={(e) => { handleUpload(e.target.files ? Array.from(e.target.files) : null); e.target.value = \"\"; }}\n />\n <input\n ref={uploadFolderRef}\n type=\"file\"\n /* @ts-ignore — webkitdirectory is a webkit extension but works in all major browsers */\n webkitdirectory\n style={{ display: \"none\" }}\n onChange={(e) => { handleUpload(e.target.files ? Array.from(e.target.files) : null); e.target.value = \"\"; }}\n />\n\n {/* Header */}\n <div style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n padding: \"10px 12px\", borderBottom: \"1px solid var(--border)\",\n }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n <span style={{ fontSize: \"13px\", fontWeight: 600, color: \"var(--text-primary)\" }}>\n Files\n </span>\n {loading && <span style={{ fontSize: \"10px\", color: \"var(--text-dim)\" }}>loading...</span>}\n </div>\n <div style={{ display: \"flex\", gap: \"2px\" }}>\n <button onClick={() => uploadRef.current?.click()} title=\"Upload files\" disabled={uploading} style={{ background: \"none\", border: \"none\", color: uploading ? \"var(--text-dim)\" : \"var(--text-secondary)\", cursor: uploading ? \"default\" : \"pointer\", padding: \"2px 5px\", fontSize: \"13px\", borderRadius: \"var(--radius-sm)\" }} type=\"button\">{uploading ? \"⏳\" : \"↑\"}</button>\n <button onClick={() => uploadFolderRef.current?.click()} title=\"Upload folder\" disabled={uploading} style={{ background: \"none\", border: \"none\", color: uploading ? \"var(--text-dim)\" : \"var(--text-secondary)\", cursor: uploading ? \"default\" : \"pointer\", padding: \"2px 5px\", fontSize: \"13px\", borderRadius: \"var(--radius-sm)\" }} type=\"button\">{uploading ? \"⏳\" : \"📁↑\"}</button>\n <button onClick={() => { setCreateParent(\"\"); setShowCreate(\"file\"); setCreateName(\"\"); }} title=\"New file\" style={{ background: \"none\", border: \"none\", color: \"var(--text-dim)\", cursor: \"pointer\", padding: \"2px 5px\", fontSize: \"13px\", borderRadius: \"var(--radius-sm)\" }} type=\"button\">+📄</button>\n <button onClick={() => { setCreateParent(\"\"); setShowCreate(\"folder\"); setCreateName(\"\"); }} title=\"New folder\" style={{ background: \"none\", border: \"none\", color: \"var(--text-dim)\", cursor: \"pointer\", padding: \"2px 5px\", fontSize: \"13px\", borderRadius: \"var(--radius-sm)\" }} type=\"button\">+📁</button>\n <button onClick={loadTree} title=\"Refresh\" style={{ background: \"none\", border: \"none\", color: \"var(--text-dim)\", cursor: \"pointer\", padding: \"2px 5px\", fontSize: \"14px\", borderRadius: \"var(--radius-sm)\" }} type=\"button\">↻</button>\n <button onClick={onClose} title=\"Close\" style={{ background: \"none\", border: \"none\", color: \"var(--text-secondary)\", cursor: \"pointer\", padding: \"2px 5px\", fontSize: \"15px\", borderRadius: \"var(--radius-sm)\" }} type=\"button\">✕</button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div style={{ padding: \"4px 12px\", fontSize: \"10px\", color: \"var(--error)\", background: \"rgba(248,113,113,0.08)\", borderBottom: \"1px solid var(--tool-border)\" }}>\n {error}\n </div>\n )}\n\n {/* Search */}\n <div style={{ padding: \"6px 10px\" }}>\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search files or code...\"\n style={{\n width: \"100%\", background: \"var(--bg-glass)\", border: \"1px solid var(--border)\",\n borderRadius: \"var(--radius-sm)\", padding: \"4px 8px\", fontSize: \"12px\",\n color: \"var(--text-primary)\", outline: \"none\",\n }}\n />\n </div>\n\n {/* Create dialog */}\n {showCreate && (\n <div style={{ padding: \"4px 10px 6px\", borderBottom: \"1px solid var(--border)\", display: \"flex\", gap: \"4px\", alignItems: \"center\", fontSize: \"11px\" }}>\n <span style={{ color: \"var(--text-dim)\", flexShrink: 0 }}>\n {showCreate === \"file\" ? \"📄\" : \"📁\"}:\n </span>\n <input\n ref={createRef}\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") handleCreate(); if (e.key === \"Escape\") setShowCreate(undefined); }}\n placeholder={showCreate === \"file\" ? \"name.ts\" : \"folder-name\"}\n style={{\n flex: 1, background: \"var(--bg-solid)\", border: \"1px solid var(--border-bright)\",\n borderRadius: \"var(--radius-sm)\", padding: \"2px 5px\", fontSize: \"11px\",\n color: \"var(--text-primary)\", outline: \"none\",\n }}\n />\n <button onClick={handleCreate} style={{ padding: \"2px 6px\", fontSize: \"10px\", border: \"1px solid var(--border)\", borderRadius: \"var(--radius-sm)\", background: \"var(--accent-bg)\", color: \"var(--accent-text)\", cursor: \"pointer\" }} type=\"button\">Create</button>\n <button onClick={() => setShowCreate(undefined)} style={{ padding: \"2px 6px\", fontSize: \"10px\", border: \"none\", background: \"none\", color: \"var(--text-dim)\", cursor: \"pointer\" }} type=\"button\">Cancel</button>\n </div>\n )}\n\n {/* Delete confirmation */}\n {confirmDelete && (\n <div style={{ padding: \"4px 10px\", borderBottom: \"1px solid var(--border)\", display: \"flex\", gap: \"6px\", alignItems: \"center\", fontSize: \"11px\", background: \"rgba(248,113,113,0.06)\" }}>\n <span style={{ color: \"var(--error)\" }}>Delete {confirmDelete.split(\"/\").pop()}?</span>\n <button onClick={() => handleDelete(confirmDelete)} style={{ padding: \"2px 6px\", fontSize: \"10px\", border: \"1px solid var(--error)\", borderRadius: \"var(--radius-sm)\", background: \"transparent\", color: \"var(--error)\", cursor: \"pointer\" }} type=\"button\">Delete</button>\n <button onClick={() => setConfirmDelete(undefined)} style={{ padding: \"2px 6px\", fontSize: \"10px\", border: \"none\", background: \"none\", color: \"var(--text-dim)\", cursor: \"pointer\" }} type=\"button\">Cancel</button>\n </div>\n )}\n\n {/* Drag-drop overlay hint */}\n {uploading && (\n <div style={{\n position: \"absolute\", inset: 0, zIndex: 10,\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n background: \"var(--bg-glass)\",\n fontSize: \"13px\", color: \"var(--accent-text)\",\n }}>\n Uploading…\n </div>\n )}\n\n {/* Tree + content search results */}\n <div\n style={{ flex: 1, overflowY: \"auto\", padding: \"4px 0\", fontSize: \"12px\", position: \"relative\" }}\n onDragOver={(e) => {\n e.preventDefault();\n // Set dropEffect based on drag source: in-app drags use \"move\",\n // OS drags (files, folders from desktop) use \"copy\".\n const hasCustomMime = e.dataTransfer.types.includes(\"application/x-pi-path\");\n e.dataTransfer.dropEffect = hasCustomMime ? \"move\" : \"copy\";\n // Capture the folder being hovered from the ref set by row-level\n // onDragOver handlers. The ref lets us read the latest value\n // without re-rendering on every dragover event.\n }}\n onDrop={async (e) => {\n e.preventDefault();\n setDropTargetFolder(undefined);\n\n // Unified drop handler: check for in-app drag (move) first,\n // then fall back to OS file drag (upload).\n const src = e.dataTransfer.getData(\"application/x-pi-path\");\n if (src.length > 0) {\n // In-app drag → MOVE to project root (empty area = root)\n const name = src.split(\"/\").pop() ?? \"\";\n const dest = name; // root = no folder prefix\n try {\n await filesMove(projectId, src, dest);\n await loadTree();\n } catch {\n // error rendered via store/error slot\n }\n dragOverFolder.current = undefined;\n return;\n }\n\n // OS file drag → UPLOAD to root (empty area = root)\n const files = await collectDroppedUploadFiles(e.dataTransfer);\n if (files.length > 0) {\n await handleUpload(files, \"\"); // root for container drops\n dragOverFolder.current = undefined;\n }\n }}\n >\n {loading && tree.length === 0 && (\n <div style={{ padding: \"8px 12px\" }}>\n <LoadingSkeleton variant=\"tree\" count={8} />\n </div>\n )}\n\n {/* ── Content search results (fires when search >= 3 chars) ── */}\n {contentSearchLoading && (\n <div style={{ padding: \"4px 12px 2px\", fontSize: \"11px\", color: \"var(--text-dim)\" }}>\n Searching file contents…\n </div>\n )}\n {contentSearchError !== undefined && (\n <div style={{ padding: \"2px 12px\", fontSize: \"10px\", color: \"var(--error)\" }}>\n {contentSearchError}\n </div>\n )}\n {!contentSearchLoading && contentSearchResults !== undefined && contentSearchResults.matches.length > 0 && (\n <>\n <div style={{\n padding: \"3px 12px\", fontSize: \"10px\", color: \"var(--text-dim)\",\n borderBottom: \"1px solid var(--border)\", display: \"flex\", gap: \"8px\", alignItems: \"center\",\n }}>\n <span>📄 {contentSearchResults.matches.length} match{contentSearchResults.matches.length !== 1 ? \"es\" : \"\"} in {groupByPath(contentSearchResults.matches).length} file{groupByPath(contentSearchResults.matches).length !== 1 ? \"s\" : \"\"}</span>\n {contentSearchResults.truncated && <span style={{ color: \"var(--accent-bg)\" }}>truncated</span>}\n {contentSearchResults.engine === \"node\" && (\n <span style={{\n fontSize: \"8px\", fontWeight: 600, textTransform: \"uppercase\",\n background: \"rgba(229,188,96,0.15)\", color: \"var(--accent-bg)\",\n padding: \"1px 5px\", borderRadius: \"var(--radius-sm)\",\n }}>fallback</span>\n )}\n </div>\n {groupByPath(contentSearchResults.matches).map(([filePath, matches]) => {\n const isExpanded = expandedSearchFiles.has(filePath);\n return (\n <div key={`cs-${filePath}`}>\n <div\n onClick={() => setExpandedSearchFiles((prev) => {\n const next = new Set(prev);\n if (next.has(filePath)) next.delete(filePath); else next.add(filePath);\n return next;\n })}\n style={{\n display: \"flex\", alignItems: \"center\", gap: \"4px\",\n padding: \"3px 10px\", cursor: \"pointer\",\n color: \"var(--text-secondary)\", fontSize: \"11px\",\n fontFamily: \"monospace\",\n }}\n >\n <span style={{ fontSize: \"10px\", width: \"12px\", flexShrink: 0 }}>{isExpanded ? \"▾\" : \"▸\"}</span>\n <span style={{ flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>{filePath}</span>\n <span style={{ fontSize: \"10px\", color: \"var(--text-dim)\", flexShrink: 0 }}>{matches.length}</span>\n </div>\n {isExpanded && matches.map((m, i) => (\n <div\n key={`${filePath}-${m.line}-${m.column}-${i}`}\n onClick={() => openFile(filePath)}\n title={`${filePath}:${m.line}:${m.column}`}\n style={{\n display: \"flex\", gap: \"8px\", padding: \"1px 10px 1px 24px\",\n cursor: \"pointer\", fontSize: \"11px\", fontFamily: \"monospace\",\n color: \"var(--text-dim)\",\n }}\n className=\"search-match-row\"\n >\n <span style={{\n color: \"var(--text-dim)\", width: \"36px\",\n flexShrink: 0, textAlign: \"right\", fontSize: \"10px\",\n }}>{m.line}</span>\n <span style={{ flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {(() => {\n const col = m.column - 1;\n const len = m.length;\n const snippet = m.lineSnippet;\n const before = snippet.slice(0, col);\n const hit = snippet.slice(col, col + len);\n const after = snippet.slice(col + len);\n return (\n <>\n <span>{before}</span>\n <span style={{ background: \"rgba(229,188,96,0.35)\", color: \"var(--text-primary)\", borderRadius: \"2px\" }}>{hit}</span>\n <span>{after}</span>\n </>\n );\n })()}\n </span>\n </div>\n ))}\n </div>\n );\n })}\n </>\n )}\n\n {/* ── File tree (filename filtered) ── */}\n {filteredTree.length === 0 && !loading && (\n <div style={{ padding: \"16px\", textAlign: \"center\", color: \"var(--text-dim)\", fontSize: \"12px\" }}>\n {search ? \"No files match\" : \"No files\"}\n </div>\n )}\n {filteredTree.map((node) => renderNode(node, 0))}\n </div>\n </>\n )}\n\n {/* ── VIEW: Editor ── */}\n {tab === \"files\" && view === \"editor\" && (\n <>\n {/* Editor header with back button + tabs */}\n <div style={{\n display: \"flex\", alignItems: \"center\", gap: \"4px\",\n padding: \"6px 10px\", borderBottom: \"1px solid var(--border)\",\n background: \"var(--bg-glass)\",\n }}>\n <button\n onClick={() => setView(\"tree\")}\n title=\"Back to file tree\"\n style={{\n background: \"none\", border: \"none\", color: \"var(--text-secondary)\",\n cursor: \"pointer\", padding: \"4px 8px\", fontSize: \"14px\",\n borderRadius: \"var(--radius-sm)\", flexShrink: 0, lineHeight: 1,\n }}\n type=\"button\"\n >\n ←\n </button>\n\n {/* Tab strip */}\n <div style={{ display: \"flex\", flex: 1, overflowX: \"auto\", gap: \"2px\" }}>\n {openFiles.map((f) => {\n const isActive = f.path === activePath;\n return (\n <div\n key={f.path}\n style={{\n display: \"flex\", alignItems: \"center\", gap: \"3px\",\n padding: \"3px 8px\", fontSize: \"11px\", whiteSpace: \"nowrap\",\n borderRadius: \"var(--radius-sm)\",\n background: isActive ? \"var(--accent-subtle)\" : \"transparent\",\n color: isActive ? \"var(--accent-text)\" : \"var(--text-dim)\",\n cursor: \"default\", minWidth: 0,\n }}\n >\n <button\n onClick={() => setActivePath(f.path)}\n style={{\n background: \"none\", border: \"none\", color: \"inherit\",\n cursor: \"pointer\", padding: 0, fontSize: \"11px\",\n overflow: \"hidden\", textOverflow: \"ellipsis\",\n }}\n type=\"button\"\n >\n {f.dirty && (\n <span style={{ color: \"var(--accent-bg)\", marginRight: \"2px\" }}>●</span>\n )}\n {f.path.split(\"/\").pop()}\n </button>\n <button\n onClick={() => handleTabClose(f.path)}\n title=\"Close tab\"\n style={{\n background: \"none\", border: \"none\", color: \"var(--text-dim)\",\n cursor: \"pointer\", padding: \"1px\", fontSize: \"10px\",\n opacity: 0.5, lineHeight: 1, flexShrink: 0,\n }}\n >\n ✕\n </button>\n </div>\n );\n })}\n </div>\n\n {/* Close button */}\n <button\n onClick={onClose}\n title=\"Close\"\n style={{\n background: \"none\", border: \"none\", color: \"var(--text-secondary)\",\n cursor: \"pointer\", padding: \"2px 5px\", fontSize: \"15px\",\n borderRadius: \"var(--radius-sm)\", flexShrink: 0, lineHeight: 1,\n }}\n type=\"button\"\n >\n ✕\n </button>\n </div>\n\n {/* Error */}\n {error && (\n <div style={{ padding: \"4px 14px\", fontSize: \"10px\", color: \"var(--error)\", background: \"rgba(248,113,113,0.08)\", borderBottom: \"1px solid var(--tool-border)\" }}>\n {error}\n </div>\n )}\n\n {/* Active editor */}\n {activeFile ? (\n <>\n {/* Editor toolbar */}\n <div style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: \"6px\",\n padding: \"3px 10px\", fontSize: \"10px\", color: \"var(--text-dim)\",\n borderBottom: \"1px solid var(--border)\",\n }}>\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", flex: 1 }}>\n {activeFile.path}\n </span>\n\n {/* Raw / Rendered toggle */}\n <div style={{\n display: \"flex\", gap: \"1px\",\n background: \"var(--bg-glass)\", borderRadius: \"var(--radius-sm)\",\n padding: \"1px\", flexShrink: 0,\n }}>\n <button\n onClick={() => setEditorMode(\"raw\")}\n style={{\n background: editorMode === \"raw\" ? \"var(--bg-solid)\" : \"transparent\",\n border: \"none\", cursor: \"pointer\",\n color: editorMode === \"raw\" ? \"var(--text-primary)\" : \"var(--text-dim)\",\n fontSize: \"10px\", fontWeight: 600,\n padding: \"2px 8px\", borderRadius: \"var(--radius-sm)\",\n }}\n type=\"button\"\n >\n Raw\n </button>\n <button\n onClick={() => setEditorMode(\"rendered\")}\n style={{\n background: editorMode === \"rendered\" ? \"var(--bg-solid)\" : \"transparent\",\n border: \"none\", cursor: \"pointer\",\n color: editorMode === \"rendered\" ? \"var(--text-primary)\" : \"var(--text-dim)\",\n fontSize: \"10px\", fontWeight: 600,\n padding: \"2px 8px\", borderRadius: \"var(--radius-sm)\",\n }}\n type=\"button\"\n >\n Rendered\n </button>\n </div>\n\n {/* Word wrap toggle */}\n {editorMode === \"raw\" && (\n <button\n onClick={() => setWordWrap((w) => !w)}\n title=\"Toggle word wrap\"\n style={{\n padding: \"2px 6px\", fontSize: \"9px\", fontWeight: 600,\n border: \"1px solid var(--border)\", borderRadius: \"var(--radius-sm)\",\n background: wordWrap ? \"var(--accent-bg)\" : \"transparent\",\n color: wordWrap ? \"var(--accent-text)\" : \"var(--text-dim)\",\n cursor: \"pointer\", flexShrink: 0,\n }}\n type=\"button\"\n >\n WRAP\n </button>\n )}\n\n <button\n onClick={handleSave}\n disabled={!activeFile.dirty || activeFile.saving}\n style={{\n padding: \"2px 8px\", fontSize: \"10px\", fontWeight: 600, flexShrink: 0,\n border: \"1px solid var(--border)\", borderRadius: \"var(--radius-sm)\",\n background: activeFile.dirty ? \"var(--accent-bg)\" : \"transparent\",\n color: activeFile.dirty ? \"var(--accent-text)\" : \"var(--text-dim)\",\n cursor: activeFile.dirty && !activeFile.saving ? \"pointer\" : \"default\",\n }}\n type=\"button\"\n >\n {activeFile.saving ? \"Saving…\" : activeFile.dirty ? \"Save\" : \"Saved\"}\n </button>\n </div>\n\n {editorMode === \"raw\" ? (\n <CodeMirrorEditor\n key={`editor-${activeFile.path}`}\n value={activeFile.content}\n onChange={(val) => handleContentChange(val)}\n onSave={handleSave}\n fileName={activeFile.path.split(\"/\").pop() ?? activeFile.path}\n wordWrap={wordWrap}\n />\n ) : (\n <RenderedView\n content={activeFile.content}\n fileName={activeFile.path.split(\"/\").pop() ?? activeFile.path}\n />\n )}\n </>\n ) : (\n <div style={{\n flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n fontSize: \"12px\", color: \"var(--text-dim)\",\n }}>\n No file selected\n </div>\n )}\n </>\n )}\n\n {/* ── Context menu ── */}\n {contextMenu && (\n <>\n {/* Backdrop to capture clicks outside on mobile */}\n <div\n style={{\n position: \"fixed\", inset: 0, zIndex: 999,\n background: \"transparent\",\n }}\n onClick={() => setContextMenu(null)}\n />\n <div\n ref={contextMenuRef}\n style={{\n position: \"absolute\",\n left: contextMenu.x,\n top: contextMenu.y,\n zIndex: 1000,\n minWidth: \"180px\",\n background: \"var(--bg-solid)\",\n border: \"1px solid var(--border-bright)\",\n borderRadius: \"var(--radius-sm)\",\n boxShadow: \"0 4px 16px rgba(0,0,0,0.4)\",\n padding: \"4px 0\",\n fontSize: \"12px\",\n userSelect: \"none\",\n }}\n onClick={() => setContextMenu(null)}\n >\n {/* Header showing the file/folder name */}\n <div style={{\n padding: \"4px 12px 6px\",\n borderBottom: \"1px solid var(--border)\",\n color: \"var(--text-primary)\",\n fontWeight: 600,\n fontSize: \"11px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"220px\",\n }}>\n {contextMenu.node.type === \"directory\" ? \"📁\" : \"📄\"} {contextMenu.node.name}\n </div>\n\n {/* Copy Relative Path */}\n <div\n className=\"context-menu-item\"\n onClick={(e) => { e.stopPropagation(); handleCopyRelativePath(contextMenu.node.path); }}\n style={contextMenuItemStyle}\n >\n <span style={{ width: \"16px\", textAlign: \"center\", flexShrink: 0 }}>📋</span>\n <span>Copy Relative Path</span>\n </div>\n\n {/* Copy Absolute Path */}\n <div\n className=\"context-menu-item\"\n onClick={(e) => { e.stopPropagation(); handleCopyAbsolutePath(contextMenu.node.path); }}\n style={contextMenuItemStyle}\n >\n <span style={{ width: \"16px\", textAlign: \"center\", flexShrink: 0 }}>📎</span>\n <span>Copy Absolute Path</span>\n </div>\n\n {/* Download */}\n <div\n className=\"context-menu-item\"\n onClick={async (e) => {\n e.stopPropagation();\n setContextMenu(null);\n try {\n await filesDownload(projectId, contextMenu.node.path);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"download failed\");\n }\n }}\n style={contextMenuItemStyle}\n >\n <span style={{ width: \"16px\", textAlign: \"center\", flexShrink: 0 }}>⬇️</span>\n <span>{contextMenu.node.type === \"directory\" ? \"Download as Zip\" : \"Download\"}</span>\n </div>\n\n {/* Separator */}\n <div style={{ height: \"1px\", background: \"var(--border)\", margin: \"4px 0\" }} />\n\n {/* New File (directories only) */}\n {contextMenu.node.type === \"directory\" && (\n <div\n className=\"context-menu-item\"\n onClick={(e) => {\n e.stopPropagation();\n setContextMenu(null);\n setCreateParent(contextMenu.node.path);\n setShowCreate(\"file\");\n setCreateName(\"\");\n }}\n style={contextMenuItemStyle}\n >\n <span style={{ width: \"16px\", textAlign: \"center\", flexShrink: 0 }}>📄</span>\n <span>New File</span>\n </div>\n )}\n\n {/* New Folder (directories only) */}\n {contextMenu.node.type === \"directory\" && (\n <div\n className=\"context-menu-item\"\n onClick={(e) => {\n e.stopPropagation();\n setContextMenu(null);\n setCreateParent(contextMenu.node.path);\n setShowCreate(\"folder\");\n setCreateName(\"\");\n }}\n style={contextMenuItemStyle}\n >\n <span style={{ width: \"16px\", textAlign: \"center\", flexShrink: 0 }}>📁</span>\n <span>New Folder</span>\n </div>\n )}\n\n {/* Rename */}\n <div\n className=\"context-menu-item\"\n onClick={(e) => {\n e.stopPropagation();\n setContextMenu(null);\n setRenaming(contextMenu.node.path);\n setRenameDraft(contextMenu.node.name);\n setTimeout(() => renameRef.current?.focus(), 50);\n }}\n style={contextMenuItemStyle}\n >\n <span style={{ width: \"16px\", textAlign: \"center\", flexShrink: 0 }}>✏️</span>\n <span>Rename</span>\n </div>\n\n {/* Delete */}\n <div\n className=\"context-menu-item\"\n onClick={(e) => {\n e.stopPropagation();\n setContextMenu(null);\n setConfirmDelete(contextMenu.node.path);\n }}\n style={{\n ...contextMenuItemStyle,\n color: \"var(--error)\",\n }}\n >\n <span style={{ width: \"16px\", textAlign: \"center\", flexShrink: 0 }}>🗑</span>\n <span>Delete</span>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n\nconst contextMenuItemStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"6px 12px\",\n cursor: \"pointer\",\n color: \"var(--text-secondary)\",\n transition: \"background 0.1s ease\",\n};\n","/**\n * Terminal tab store — persisted to sessionStorage.\n *\n * Tab metadata (id, projectId, label) is stored here. The actual\n * WebSocket + xterm instances live outside React in a module-level\n * Map inside TerminalPanel.tsx.\n *\n * Persisting to sessionStorage means a page reload reattaches each\n * tab to its existing PTY on the server (via tabId). After the\n * idle timeout (10 min) the server kills the PTY.\n */\n\nimport { create } from \"zustand\";\n\nexport interface TerminalTab {\n id: string;\n projectId: string;\n label: string;\n createdAt: number;\n}\n\ninterface TerminalState {\n tabs: TerminalTab[];\n activeTabId: string | undefined;\n\n openTab: (projectId: string) => string;\n closeTab: (id: string) => void;\n setActiveTab: (id: string | undefined) => void;\n closeProjectTabs: (projectId: string) => void;\n}\n\nconst STORAGE_KEY = \"pi-kot.terminal.tabs.v1\";\n\ninterface PersistedShape {\n tabs: TerminalTab[];\n activeTabId: string | undefined;\n}\n\nfunction readPersisted(): PersistedShape {\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY);\n if (raw === null) return { tabs: [], activeTabId: undefined };\n const parsed = JSON.parse(raw) as unknown;\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n !Array.isArray((parsed as { tabs?: unknown }).tabs)\n ) {\n return { tabs: [], activeTabId: undefined };\n }\n const tabs: TerminalTab[] = [];\n for (const t of (parsed as { tabs: unknown[] }).tabs) {\n if (\n typeof t === \"object\" &&\n t !== null &&\n typeof (t as TerminalTab).id === \"string\" &&\n typeof (t as TerminalTab).projectId === \"string\" &&\n typeof (t as TerminalTab).label === \"string\" &&\n typeof (t as TerminalTab).createdAt === \"number\"\n ) {\n tabs.push(t as TerminalTab);\n }\n }\n const activeRaw = (parsed as { activeTabId?: unknown }).activeTabId;\n const activeTabId = typeof activeRaw === \"string\" ? activeRaw : undefined;\n return {\n tabs,\n activeTabId: tabs.some((t) => t.id === activeTabId) ? activeTabId : tabs[0]?.id,\n };\n } catch {\n return { tabs: [], activeTabId: undefined };\n }\n}\n\nfunction writePersisted(state: PersistedShape): void {\n try {\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n } catch {\n // private mode\n }\n}\n\nlet counter = 0;\nconst newId = (): string => `term-${Date.now().toString(36)}-${(counter++).toString(36)}`;\n\nconst initial = readPersisted();\n\nexport const useTerminalStore = create<TerminalState>((set) => ({\n tabs: initial.tabs,\n activeTabId: initial.activeTabId,\n\n openTab: (projectId) => {\n const id = newId();\n set((s) => {\n const projectTabs = s.tabs.filter((t) => t.projectId === projectId);\n const tab: TerminalTab = {\n id,\n projectId,\n label: `Terminal ${projectTabs.length + 1}`,\n createdAt: Date.now(),\n };\n const next = { tabs: [...s.tabs, tab], activeTabId: id };\n writePersisted(next);\n return next;\n });\n return id;\n },\n\n closeTab: (id) => {\n set((s) => {\n const idx = s.tabs.findIndex((t) => t.id === id);\n if (idx === -1) return {};\n const tabs = s.tabs.slice(0, idx).concat(s.tabs.slice(idx + 1));\n const activeTabId =\n s.activeTabId === id ? (tabs[idx] ?? tabs[idx - 1] ?? tabs[0])?.id : s.activeTabId;\n const next = { tabs, activeTabId };\n writePersisted(next);\n return next;\n });\n },\n\n setActiveTab: (id) =>\n set((s) => {\n const next = { ...s, activeTabId: id };\n writePersisted({ tabs: next.tabs, activeTabId: id });\n return { activeTabId: id };\n }),\n\n closeProjectTabs: (projectId) => {\n set((s) => {\n const tabs = s.tabs.filter((t) => t.projectId !== projectId);\n const activeTabId = tabs.some((t) => t.id === s.activeTabId) ? s.activeTabId : tabs[0]?.id;\n const next = { tabs, activeTabId };\n writePersisted(next);\n return next;\n });\n },\n}));\n","/**\n * TerminalPanel — multi-tab xterm.js terminal with persistent PTY sessions.\n *\n * Architecture:\n *\n * - **Persistent across panel toggle:** The panel stays mounted even\n * when visually hidden (CSS display:none). Each tab's WebSocket\n * and xterm instance live in a module-level Map, outlasting React\n * renders. When the panel is hidden, the WS stays connected and\n * the PTY keeps running on the server.\n *\n * - **Multi-tab:** Each tab gets its own WS + PTY on the server,\n * tracked by a stable `tabId`. Tab metadata is in a Zustand store\n * persisted to sessionStorage.\n *\n * - **Reattach:** On page reload, the store restores tabs from\n * sessionStorage and reconnects each with the same `tabId`, so the\n * server reattaches to the existing PTY and replays recent output.\n */\n\nimport { useEffect, useRef, useCallback, useState } from \"react\";\nimport { Terminal } from \"@xterm/xterm\";\nimport { FitAddon } from \"@xterm/addon-fit\";\nimport \"@xterm/xterm/css/xterm.css\";\nimport { useTerminalStore, type TerminalTab } from \"../stores/terminal-store\";\nimport { getStoredToken } from \"../lib/api-client\";\nimport { useSessionStore } from \"../stores/session-store\";\n\ninterface TerminalPanelProps {\n open: boolean;\n onClose: () => void;\n}\n\ninterface Live {\n term: Terminal;\n fit: FitAddon;\n ws: WebSocket;\n observer: ResizeObserver;\n lastSize: { cols: number; rows: number };\n reconnectAttempt: number;\n reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n disposed: boolean;\n ctrlActive: boolean;\n}\n\nconst live = new Map<string, Live>();\n\nfunction disableBrowserTextAssist(host: HTMLElement): void {\n const input = host.querySelector(\"textarea\");\n if (input === null) return;\n input.setAttribute(\"autocomplete\", \"off\");\n input.setAttribute(\"autocorrect\", \"off\");\n input.setAttribute(\"autocapitalize\", \"none\");\n input.setAttribute(\"spellcheck\", \"false\");\n}\n\nfunction syncPtySize(entry: Live, force = false): void {\n const cols = entry.term.cols;\n const rows = entry.term.rows;\n if (!force && cols === entry.lastSize.cols && rows === entry.lastSize.rows) return;\n entry.lastSize = { cols, rows };\n if (entry.ws.readyState === WebSocket.OPEN) {\n entry.ws.send(JSON.stringify({ type: \"resize\", cols, rows }));\n }\n}\n\nfunction fitAndSyncPty(entry: Live, force = false): void {\n entry.fit.fit();\n syncPtySize(entry, force);\n}\n\nfunction reconnectDelayMs(attempt: number): number {\n const seconds = [1, 2, 4, 8, 16, 30];\n return (seconds[Math.min(attempt, seconds.length - 1)] ?? 30) * 1000;\n}\n\nfunction isTerminalCloseCode(code: number): boolean {\n return code === 1000 || code === 4401 || code === 4404;\n}\n\nexport function TerminalPanel({ open, onClose }: TerminalPanelProps) {\n const projectId = useSessionStore((s) => s.activeProjectId);\n const tabs = useTerminalStore((s) => s.tabs);\n const activeTabId = useTerminalStore((s) => s.activeTabId);\n const openTab = useTerminalStore((s) => s.openTab);\n const closeTab = useTerminalStore((s) => s.closeTab);\n const setActiveTab = useTerminalStore((s) => s.setActiveTab);\n\n // Track virtual keyboard offset on mobile so the panel sits above it\n const [keyboardOffset, setKeyboardOffset] = useState(0);\n const [isMobile, setIsMobile] = useState(false);\n const [ctrlActive, setCtrlActive] = useState(false);\n\n useEffect(() => {\n const checkMobile = () => setIsMobile(window.innerWidth <= 600);\n checkMobile();\n window.addEventListener(\"resize\", checkMobile);\n return () => window.removeEventListener(\"resize\", checkMobile);\n }, []);\n\n // VisualViewport: track keyboard height for the bottom offset\n useEffect(() => {\n const vv = window.visualViewport;\n if (!vv) return;\n const update = () => {\n const offset = Math.max(0, window.innerHeight - vv.height);\n setKeyboardOffset(offset);\n };\n vv.addEventListener(\"resize\", update);\n return () => vv.removeEventListener(\"resize\", update);\n }, []);\n\n const projectTabs = tabs.filter((t) => t.projectId === projectId);\n const activeTab = projectTabs.find((t) => t.id === activeTabId) ?? projectTabs[0];\n\n const onNewTab = (): void => {\n if (projectId === undefined) return;\n openTab(projectId);\n };\n\n const onCloseTab = (id: string): void => {\n teardown(id);\n closeTab(id);\n };\n\n // On mobile: full-screen overlay. On desktop: bottom panel.\n const isFullScreen = isMobile && open;\n\n // Sends raw ANSI sequence directly to the active WebSocket\n const sendKey = (sequence: string) => {\n if (!activeTabId) return;\n const entry = live.get(activeTabId);\n if (entry && entry.ws.readyState === WebSocket.OPEN) {\n entry.ws.send(JSON.stringify({ type: \"input\", data: sequence }));\n entry.term.focus();\n }\n };\n\n return (\n <div\n className=\"terminal-panel-root\"\n style={{\n display: open ? \"flex\" : \"none\",\n position: \"fixed\",\n zIndex: isFullScreen ? 300 : 100,\n flexDirection: \"column\",\n background: \"var(--bg-solid, #1e1e2e)\",\n overscrollBehavior: \"none\",\n transition: \"bottom 0.15s ease\",\n ...(isFullScreen\n ? {\n // Full-screen: cover the entire viewport above the keyboard\n inset: `0 0 ${keyboardOffset}px 0`,\n paddingTop: \"env(safe-area-inset-top, 0px)\",\n paddingBottom: keyboardOffset === 0 ? \"env(safe-area-inset-bottom, 0px)\" : 0,\n }\n : {\n // Desktop: bottom panel\n bottom: keyboardOffset,\n left: 0,\n right: 0,\n height: \"35vh\",\n minHeight: 180,\n borderTop: \"1px solid var(--border-color, #313244)\",\n }),\n }}\n >\n {/* Tab bar */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 8px\",\n height: 32,\n fontSize: 12,\n color: \"var(--text-dim, #6c7086)\",\n userSelect: \"none\",\n flexShrink: 0,\n borderBottom: \"1px solid var(--border-color, #313244)\",\n background: \"var(--bg-glass, rgba(255,255,255,0.04))\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2, overflow: \"hidden\" }}>\n {projectTabs.length === 0 && (\n <span style={{ padding: \"0 8px\", fontSize: 11, fontStyle: \"italic\", color: \"var(--text-dim)\" }}>\n No terminals open.\n </span>\n )}\n {projectTabs.map((t) => {\n const isActive = t.id === activeTab?.id;\n return (\n <div\n key={t.id}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n borderRadius: 4,\n padding: \"2px 8px\",\n fontSize: 11,\n cursor: \"default\",\n background: isActive ? \"var(--bg-glass-active, rgba(255,255,255,0.08))\" : \"transparent\",\n color: isActive ? \"var(--text-primary, #fff)\" : \"var(--text-dim, #6c7086)\",\n }}\n >\n <span\n onClick={() => setActiveTab(t.id)}\n style={{\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n whiteSpace: \"nowrap\",\n }}\n >\n <span style={{ fontSize: 10 }}>{`>`}_</span>\n {t.label}\n </span>\n <button\n onClick={() => onCloseTab(t.id)}\n style={{\n all: \"unset\",\n cursor: \"pointer\",\n padding: \"1px 3px\",\n borderRadius: 3,\n fontSize: 10,\n lineHeight: 1,\n color: \"var(--text-dim, #6c7086)\",\n opacity: 0.6,\n }}\n title=\"Close terminal (kills the PTY)\"\n >\n ✕\n </button>\n </div>\n );\n })}\n <button\n onClick={onNewTab}\n style={{\n all: \"unset\",\n cursor: \"pointer\",\n padding: \"2px 6px\",\n borderRadius: 4,\n fontSize: 11,\n color: \"var(--text-dim, #6c7086)\",\n marginLeft: 4,\n whiteSpace: \"nowrap\",\n }}\n title=\"New terminal\"\n >\n + New\n </button>\n </div>\n <button\n onClick={onClose}\n style={{\n all: \"unset\",\n cursor: \"pointer\",\n padding: \"2px 6px\",\n borderRadius: 4,\n fontSize: 13,\n color: \"var(--text-dim, #6c7086)\",\n lineHeight: 1,\n }}\n title=\"Close terminal panel\"\n >\n ✕\n </button>\n </div>\n\n {/* Terminal hosts */}\n <div style={{ position: \"relative\", flex: 1, overflow: \"hidden\" }}>\n {projectTabs.length === 0 && (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 12,\n fontStyle: \"italic\",\n color: \"var(--text-dim, #6c7086)\",\n }}\n >\n Click \"New\" to open a terminal.\n </div>\n )}\n {tabs.map((t) => (\n <TerminalHost\n key={t.id}\n tab={t}\n visible={t.projectId === projectId && t.id === activeTab?.id}\n ctrlActive={t.id === activeTab?.id ? ctrlActive : false}\n setCtrlActive={setCtrlActive}\n />\n ))}\n </div>\n\n {/* Mobile Quick Keys (Tab, ESC, Ctrl+C, Arrows) */}\n {isFullScreen && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"4px 8px\",\n background: \"var(--bg-frosted, rgba(33, 33, 33, 0.85))\",\n borderTop: \"1px solid var(--border-color, #313244)\",\n overflowX: \"auto\",\n WebkitOverflowScrolling: \"touch\",\n flexShrink: 0,\n scrollbarWidth: \"none\", // hide scrollbar on Firefox\n }}\n >\n <style>{`\n .terminal-quick-key {\n all: unset;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 40px;\n height: 32px;\n border-radius: 4px;\n background: var(--bg-glass, rgba(255, 255, 255, 0.04));\n color: var(--text-primary, #cdd6f4);\n font-size: 13px;\n font-family: ui-monospace, SFMono-Regular, monospace;\n cursor: pointer;\n }\n .terminal-quick-key:active {\n background: var(--bg-glass-active, rgba(255, 255, 255, 0.08));\n }\n .terminal-quick-key.active {\n background: var(--accent, #89b4fa);\n color: #11111b;\n font-weight: bold;\n }\n `}</style>\n \n <button \n className={`terminal-quick-key ${ctrlActive ? 'active' : ''}`} \n onPointerDown={(e) => {\n e.preventDefault(); // Prevents terminal textarea from losing focus\n setCtrlActive((v) => !v);\n }}\n >\n CTRL\n </button>\n <button className=\"terminal-quick-key\" onPointerDown={(e) => { e.preventDefault(); sendKey(\"\\x03\"); }}>^C</button>\n <button className=\"terminal-quick-key\" onPointerDown={(e) => { e.preventDefault(); sendKey(\"\\x1B\"); }}>ESC</button>\n <button className=\"terminal-quick-key\" onPointerDown={(e) => { e.preventDefault(); sendKey(\"\\x09\"); }}>TAB</button>\n <div style={{ width: 1, height: 20, background: \"var(--border-color, #313244)\", margin: \"0 4px\" }} />\n <button className=\"terminal-quick-key\" onPointerDown={(e) => { e.preventDefault(); sendKey(\"\\x1b[A\"); }}>↑</button>\n <button className=\"terminal-quick-key\" onPointerDown={(e) => { e.preventDefault(); sendKey(\"\\x1b[B\"); }}>↓</button>\n <button className=\"terminal-quick-key\" onPointerDown={(e) => { e.preventDefault(); sendKey(\"\\x1b[D\"); }}>←</button>\n <button className=\"terminal-quick-key\" onPointerDown={(e) => { e.preventDefault(); sendKey(\"\\x1b[C\"); }}>→</button>\n </div>\n )}\n </div>\n );\n}\n\nfunction TerminalHost({\n tab,\n visible,\n ctrlActive,\n setCtrlActive,\n}: {\n tab: TerminalTab;\n visible: boolean;\n ctrlActive: boolean;\n setCtrlActive: (v: boolean) => void;\n}) {\n const hostRef = useRef<HTMLDivElement>(null);\n\n const ctrlActiveRef = useRef(ctrlActive);\n useEffect(() => {\n ctrlActiveRef.current = ctrlActive;\n }, [ctrlActive]);\n\n useEffect(() => {\n if (hostRef.current === null) return undefined;\n const host = hostRef.current;\n\n // Re-mount path: existing live entry — re-attach xterm to fresh host div\n const existing = live.get(tab.id);\n if (existing !== undefined) {\n try {\n const root = existing.term.element;\n if (root !== undefined && root.parentNode !== host) {\n host.appendChild(root);\n } else {\n existing.term.open(host);\n }\n disableBrowserTextAssist(host);\n fitAndSyncPty(existing, true);\n } catch {\n // transient\n }\n const observer = new ResizeObserver(() => {\n try {\n fitAndSyncPty(existing);\n } catch {\n // host detached momentarily\n }\n });\n observer.observe(host);\n try {\n existing.observer.disconnect();\n } catch {\n // ignore\n }\n existing.observer = observer;\n requestAnimationFrame(() => {\n try {\n fitAndSyncPty(existing);\n existing.term.focus();\n } catch {\n // ignore\n }\n });\n return () => {\n try {\n observer.disconnect();\n } catch {\n // ignore\n }\n };\n }\n\n // First mount: create xterm + WS\n const isMobileDevice = window.innerWidth <= 600;\n const term = new Terminal({\n theme: {\n background: cssVar(\"--bg-solid\", \"#1e1e2e\"),\n foreground: cssVar(\"--text-primary\", \"#cdd6f4\"),\n cursor: cssVar(\"--accent-text\", \"#89b4fa\"),\n selectionBackground: cssVar(\"--accent\", \"#89b4fa\"),\n black: cssVar(\"--ansi-black\", \"#45475a\"),\n red: cssVar(\"--ansi-red\", \"#f38ba8\"),\n green: cssVar(\"--ansi-green\", \"#a6e3a1\"),\n yellow: cssVar(\"--ansi-yellow\", \"#f9e2af\"),\n blue: cssVar(\"--ansi-blue\", \"#89b4fa\"),\n magenta: cssVar(\"--ansi-magenta\", \"#f5c2e7\"),\n cyan: cssVar(\"--ansi-cyan\", \"#94e2d5\"),\n white: cssVar(\"--ansi-white\", \"#bac2de\"),\n brightBlack: cssVar(\"--ansi-bright-black\", \"#585b70\"),\n brightRed: cssVar(\"--ansi-bright-red\", \"#f38ba8\"),\n brightGreen: cssVar(\"--ansi-bright-green\", \"#a6e3a1\"),\n brightYellow: cssVar(\"--ansi-bright-yellow\", \"#f9e2af\"),\n brightBlue: cssVar(\"--ansi-bright-blue\", \"#89b4fa\"),\n brightMagenta: cssVar(\"--ansi-bright-magenta\", \"#f5c2e7\"),\n brightCyan: cssVar(\"--ansi-bright-cyan\", \"#94e2d5\"),\n brightWhite: cssVar(\"--ansi-bright-white\", \"#a6adc8\"),\n },\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: isMobileDevice ? 12 : 13,\n cursorBlink: true,\n scrollback: 5000,\n allowTransparency: true,\n });\n\n const fit = new FitAddon();\n term.loadAddon(fit);\n term.open(host);\n disableBrowserTextAssist(host);\n fit.fit();\n\n const initialSize = { cols: term.cols, rows: term.rows };\n const ws = attachWebSocket(tab.id, tab.projectId, term, initialSize, false);\n\n const dataDisposable = term.onData((data) => {\n const sock = live.get(tab.id)?.ws;\n if (sock?.readyState === WebSocket.OPEN) {\n if (ctrlActiveRef.current && data.length === 1) {\n // Translate the character to its CTRL equivalent\n const charCode = data.charCodeAt(0);\n // If it's a letter, apply bitwise AND 0x1F. e.g. 'c' (99) -> 3 (^C)\n let ctrlChar = data;\n if (charCode >= 97 && charCode <= 122) { // a-z\n ctrlChar = String.fromCharCode(charCode - 96);\n } else if (charCode >= 65 && charCode <= 90) { // A-Z\n ctrlChar = String.fromCharCode(charCode - 64);\n }\n sock.send(JSON.stringify({ type: \"input\", data: ctrlChar }));\n setCtrlActive(false); // Reset after single use\n } else {\n sock.send(JSON.stringify({ type: \"input\", data }));\n }\n }\n });\n\n const observer = new ResizeObserver(() => {\n try {\n const entry = live.get(tab.id);\n if (entry === undefined) return;\n fitAndSyncPty(entry);\n } catch {\n // host detached momentarily\n }\n });\n observer.observe(host);\n\n // --- Touch Gestures (Termius-inspired) ---\n // Long-press + drag → continuous arrow keys with speed gears (3 levels)\n // Double-tap → Tab\n // 3-finger tap → Paste (reads from clipboard)\n // 2-finger scroll → scroll terminal buffer\n\n let touchStartX: number | null = null;\n let touchStartY: number | null = null;\n let lastTouchY: number | null = null; // Used for 2-finger scrolling\n let remainderPx = 0;\n const lineHeightPx = 16;\n\n // Long-press + drag state\n let longPressTimer: ReturnType<typeof setTimeout> | undefined;\n let isArrowMode = false;\n let arrowInterval: ReturnType<typeof setInterval> | undefined;\n let arrowAnchorX = 0;\n let arrowAnchorY = 0;\n let lastArrowDir = '';\n let lastArrowGear = -1;\n\n // Double-tap state\n let lastTapTime = 0;\n\n const LONG_PRESS_MS = 150;\n const DOUBLE_TAP_MS = 300;\n const ARROW_GEAR_THRESHOLDS = [\n { minDist: 0, interval: 150 }, // Gear 1: normal\n { minDist: 100, interval: 80 }, // Gear 2: fast\n { minDist: 200, interval: 40 }, // Gear 3: turbo\n ];\n\n function getArrowGear(dist: number): number {\n for (let i = ARROW_GEAR_THRESHOLDS.length - 1; i >= 0; i--) {\n if (dist >= ARROW_GEAR_THRESHOLDS[i].minDist) return i;\n }\n return 0;\n }\n\n function stopArrows(): void {\n if (arrowInterval !== undefined) {\n clearInterval(arrowInterval);\n arrowInterval = undefined;\n }\n isArrowMode = false;\n lastArrowDir = '';\n lastArrowGear = -1;\n host.style.userSelect = '';\n }\n\n function fireArrow(x: number, y: number): void {\n const deltaX = x - arrowAnchorX;\n const deltaY = y - arrowAnchorY;\n const dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n if (dist < 15) return; // dead zone near center\n\n const dir = Math.abs(deltaX) > Math.abs(deltaY)\n ? (deltaX > 0 ? 'right' : 'left')\n : (deltaY > 0 ? 'down' : 'up');\n const gear = getArrowGear(dist);\n\n if (dir !== lastArrowDir || gear !== lastArrowGear) {\n lastArrowDir = dir;\n lastArrowGear = gear;\n if (arrowInterval !== undefined) clearInterval(arrowInterval);\n\n const seq = dir === 'right' ? \"\\x1b[C\"\n : dir === 'left' ? \"\\x1b[D\"\n : dir === 'down' ? \"\\x1b[B\"\n : \"\\x1b[A\";\n\n // Send immediately then on interval\n const sock = live.get(tab.id)?.ws;\n if (sock?.readyState === WebSocket.OPEN) {\n sock.send(JSON.stringify({ type: \"input\", data: seq }));\n }\n\n arrowInterval = setInterval(() => {\n const sock = live.get(tab.id)?.ws;\n if (sock?.readyState === WebSocket.OPEN) {\n sock.send(JSON.stringify({ type: \"input\", data: seq }));\n }\n }, ARROW_GEAR_THRESHOLDS[gear].interval);\n }\n }\n\n const onTouchStart = (e: TouchEvent) => {\n if (e.touches.length === 1) {\n touchStartX = e.touches[0].clientX;\n touchStartY = e.touches[0].clientY;\n\n // Start long-press timer for arrow mode\n if (longPressTimer !== undefined) clearTimeout(longPressTimer);\n longPressTimer = setTimeout(() => {\n arrowAnchorX = touchStartX!;\n arrowAnchorY = touchStartY!;\n isArrowMode = true;\n host.style.userSelect = 'none';\n }, LONG_PRESS_MS);\n\n } else if (e.touches.length === 2) {\n if (longPressTimer !== undefined) {\n clearTimeout(longPressTimer);\n longPressTimer = undefined;\n }\n lastTouchY = (e.touches[0].clientY + e.touches[1].clientY) / 2;\n remainderPx = 0;\n }\n };\n\n const onTouchMove = (e: TouchEvent) => {\n // --- 2-Finger Scrolling ---\n if (e.touches.length === 2 && lastTouchY !== null) {\n if (longPressTimer !== undefined) {\n clearTimeout(longPressTimer);\n longPressTimer = undefined;\n }\n const currentY = (e.touches[0].clientY + e.touches[1].clientY) / 2;\n const stepY = lastTouchY - currentY;\n lastTouchY = currentY;\n\n if (Math.abs(stepY) < 1) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const totalPx = remainderPx + stepY;\n const lines = Math.trunc(totalPx / lineHeightPx);\n remainderPx = totalPx - (lines * lineHeightPx);\n\n if (lines !== 0) {\n term.scrollLines(lines);\n }\n return;\n }\n\n // --- Arrow Mode (long-press + drag) ---\n if (e.touches.length === 1 && isArrowMode) {\n e.preventDefault();\n e.stopPropagation();\n fireArrow(e.touches[0].clientX, e.touches[0].clientY);\n return;\n }\n\n // --- Cancel long-press if finger moves before timer fires ---\n if (e.touches.length === 1 && !isArrowMode && touchStartX !== null && touchStartY !== null && longPressTimer !== undefined) {\n const dx = e.touches[0].clientX - touchStartX;\n const dy = e.touches[0].clientY - touchStartY;\n if (Math.max(Math.abs(dx), Math.abs(dy)) > 20) {\n clearTimeout(longPressTimer);\n longPressTimer = undefined;\n }\n }\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n // --- 3-finger tap → Paste ---\n if (e.changedTouches.length === 3) {\n stopArrows();\n if (longPressTimer !== undefined) {\n clearTimeout(longPressTimer);\n longPressTimer = undefined;\n }\n navigator.clipboard.readText().then((text) => {\n const sock = live.get(tab.id)?.ws;\n if (sock?.readyState === WebSocket.OPEN) {\n sock.send(JSON.stringify({ type: \"input\", data: text }));\n }\n }).catch(() => {\n // Clipboard read failed (permission denied, etc.) — silently ignore\n });\n touchStartX = null;\n touchStartY = null;\n lastTouchY = null;\n return;\n }\n\n // Stop arrow mode\n if (isArrowMode) {\n stopArrows();\n touchStartX = null;\n touchStartY = null;\n lastTouchY = null;\n return;\n }\n\n // Cancel long-press timer if finger lifted before it fired\n if (longPressTimer !== undefined) {\n clearTimeout(longPressTimer);\n longPressTimer = undefined;\n\n // --- Double-tap detection → Tab ---\n const now = Date.now();\n if (touchStartX !== null && touchStartY !== null) {\n if (now - lastTapTime < DOUBLE_TAP_MS) {\n const sock = live.get(tab.id)?.ws;\n if (sock?.readyState === WebSocket.OPEN) {\n sock.send(JSON.stringify({ type: \"input\", data: \"\\x09\" }));\n }\n lastTapTime = 0;\n } else {\n lastTapTime = now;\n }\n }\n }\n\n // Focus terminal so keyboard appears (preventDefault on touchstart blocks click events)\n term.focus();\n\n touchStartX = null;\n touchStartY = null;\n lastTouchY = null;\n };\n\n const onTouchCancel = (): void => {\n stopArrows();\n if (longPressTimer !== undefined) {\n clearTimeout(longPressTimer);\n longPressTimer = undefined;\n }\n touchStartX = null;\n touchStartY = null;\n lastTouchY = null;\n };\n\n host.addEventListener(\"touchstart\", onTouchStart, { passive: false });\n host.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n host.addEventListener(\"touchend\", onTouchEnd);\n host.addEventListener(\"touchcancel\", onTouchCancel);\n\n // Prevent long-press context menu and text selection from browser defaults\n const onContextMenu = (e: Event) => { e.preventDefault(); };\n const onSelectStart = (e: Event) => { e.preventDefault(); };\n host.addEventListener(\"contextmenu\", onContextMenu);\n host.addEventListener(\"selectstart\", onSelectStart);\n host.style.setProperty(\"-webkit-touch-callout\", \"none\");\n\n live.set(tab.id, {\n term,\n fit,\n ws,\n observer,\n lastSize: initialSize,\n reconnectAttempt: 0,\n reconnectTimer: undefined,\n disposed: false,\n ctrlActive: false,\n });\n\n void dataDisposable;\n\n return () => {\n // Panel hidden: disconnect only the observer. WS + term survive.\n try {\n observer.disconnect();\n host.removeEventListener(\"touchstart\", onTouchStart);\n host.removeEventListener(\"touchmove\", onTouchMove);\n host.removeEventListener(\"touchend\", onTouchEnd);\n host.removeEventListener(\"touchcancel\", onTouchCancel);\n host.removeEventListener(\"contextmenu\", onContextMenu);\n host.removeEventListener(\"selectstart\", onSelectStart);\n host.style.setProperty(\"-webkit-touch-callout\", \"\");\n } catch {\n // ignore\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tab.id]);\n\n // Visible → fit + focus\n useEffect(() => {\n if (!visible) return;\n const entry = live.get(tab.id);\n if (entry === undefined) return;\n requestAnimationFrame(() => {\n try {\n fitAndSyncPty(entry);\n entry.term.focus();\n } catch {\n // ignore\n }\n });\n }, [visible, tab.id]);\n\n const onHostClick = (): void => {\n live.get(tab.id)?.term.focus();\n };\n\n return (\n <div\n ref={hostRef}\n onClick={onHostClick}\n className=\"terminal-host\"\n style={{\n position: \"absolute\",\n inset: 0,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n zIndex: visible ? 1 : 0,\n padding: \"2px 4px 8px 4px\",\n touchAction: \"none\", // Prevent native browser pinch-zoom/pan inside the terminal area\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n }}\n />\n );\n}\n\nfunction attachWebSocket(\n tabId: string,\n projectId: string,\n term: Terminal,\n size: { cols: number; rows: number },\n isReconnect: boolean,\n): WebSocket {\n const proto = window.location.protocol === \"https:\" ? \"wss\" : \"ws\";\n const stored = getStoredToken();\n const tokenQs = stored !== undefined ? `&token=${encodeURIComponent(stored)}` : \"\";\n const url = `${proto}://${window.location.host}/api/v1/terminal?projectId=${encodeURIComponent(\n projectId,\n )}&tabId=${encodeURIComponent(tabId)}${tokenQs}`;\n\n const ws = new WebSocket(url);\n ws.binaryType = \"arraybuffer\";\n\n ws.onopen = () => {\n const entry = live.get(tabId);\n const currentSize =\n entry !== undefined ? { cols: entry.term.cols, rows: entry.term.rows } : size;\n ws.send(JSON.stringify({ type: \"resize\", cols: currentSize.cols, rows: currentSize.rows }));\n if (entry !== undefined) {\n entry.lastSize = currentSize;\n entry.reconnectAttempt = 0;\n }\n void isReconnect;\n };\n\n ws.onmessage = (e) => {\n if (typeof e.data === \"string\") {\n // JSON control messages (open, exit, error)\n try {\n const msg = JSON.parse(e.data);\n if (msg.type === \"open\") {\n term.writeln(`\\r\\n\\x1b[32mTerminal opened at ${msg.cwd}\\x1b[0m`);\n return;\n }\n if (msg.type === \"exit\") {\n term.writeln(`\\r\\n\\x1b[31mProcess exited with code ${msg.code}\\x1b[0m`);\n return;\n }\n if (msg.type === \"error\") {\n term.writeln(`\\r\\n\\x1b[31mError: ${msg.message}\\x1b[0m`);\n return;\n }\n } catch {\n // not JSON — write as text\n term.write(e.data);\n }\n } else if (e.data instanceof ArrayBuffer) {\n term.write(new Uint8Array(e.data));\n }\n };\n\n ws.onclose = (e) => {\n const entry = live.get(tabId);\n if (entry === undefined || entry.disposed) return;\n if (isTerminalCloseCode(e.code)) {\n let msg = `[connection closed: ${String(e.code)}]`;\n if (e.code === 4401) {\n msg = \"[connection closed (4401): session expired — refresh the page after logging back in]\";\n } else if (e.code === 4404) {\n msg = \"[connection closed (4404): project no longer exists]\";\n }\n term.write(`\\r\\n${msg}\\r\\n`);\n return;\n }\n const attempt = entry.reconnectAttempt + 1;\n entry.reconnectAttempt = attempt;\n const delay = reconnectDelayMs(attempt);\n term.write(\n `\\r\\n[connection lost (${String(e.code)}) — reconnecting in ${String(delay / 1000)}s, attempt ${String(attempt)}]\\r\\n`,\n );\n entry.reconnectTimer = setTimeout(() => {\n const cur = live.get(tabId);\n if (cur === undefined || cur.disposed) return;\n cur.reconnectTimer = undefined;\n cur.ws = attachWebSocket(tabId, projectId, term, cur.lastSize, true);\n }, delay);\n };\n\n return ws;\n}\n\nfunction teardown(id: string): void {\n const entry = live.get(id);\n if (entry === undefined) return;\n entry.disposed = true;\n if (entry.reconnectTimer !== undefined) clearTimeout(entry.reconnectTimer);\n live.delete(id);\n try {\n entry.observer.disconnect();\n } catch {\n // ignore\n }\n try {\n if (entry.ws.readyState === WebSocket.OPEN || entry.ws.readyState === WebSocket.CONNECTING) {\n entry.ws.close(1000, \"tab_closed\");\n }\n } catch {\n // ignore\n }\n try {\n entry.term.dispose();\n } catch {\n // ignore\n }\n}\n\nfunction cssVar(name: string, fallback: string): string {\n if (typeof document === \"undefined\") return fallback;\n const val = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n return val || fallback;\n}\n","/**\n * ExtensionUIInteractionModal — renders extension UI bridge interactions\n * (select, confirm, input) as modal dialogs in the web GUI.\n *\n * When an extension command calls `ctx.ui.select()` / `ctx.ui.confirm()`\n * / `ctx.ui.input()`, the server sends an SSE event with type\n * `extension_ui_select` etc. The extension-ui-store captures it and this\n * component renders the appropriate dialog, collects user input, and\n * responds via `POST /extension-ui/respond`.\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useExtensionUIStore, type ExtensionUIEvent } from \"../stores/extension-ui-store\";\nimport { respondExtensionUI } from \"../lib/api-client\";\n\ninterface Props {\n sessionId: string;\n}\n\nexport function ExtensionUIInteractionModal({ sessionId }: Props) {\n const activeInteraction = useExtensionUIStore((s) => s.activeInteraction);\n const clearInteraction = useExtensionUIStore((s) => s.clearInteraction);\n const cancelCommand = useExtensionUIStore((s) => s.cancelCommand);\n const commandRunning = useExtensionUIStore((s) => s.commandRunning);\n const [inputValue, setInputValue] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Cancel: tell the server the user dismissed, then clear client state.\n // Without the server cancel, the pending promise stays alive for 2 minutes\n // before timing out — leaving \"Extension command running…\" visible.\n const handleCancel = useCallback(() => {\n const inter = useExtensionUIStore.getState().activeInteraction;\n if (inter && 'requestId' in inter) {\n const reqId = (inter as { requestId: string }).requestId;\n respondExtensionUI(sessionId, reqId, \"\").catch(() => {});\n }\n cancelCommand();\n }, [sessionId, cancelCommand]);\n\n // Reset local state when interaction changes\n useEffect(() => {\n setInputValue(\"\");\n setSelectedIndex(0);\n }, [activeInteraction?.type]);\n\n if (activeInteraction === undefined && !commandRunning) return null;\n\n // ── Not running + no interaction = stale state, don't show ──\n if (!commandRunning && activeInteraction === undefined) return null;\n\n // ── Handle select — server sends prefixed type \"extension_ui_select\"\n // (store stores original prefixed type; TS type has short name — cast at runtime)\n const evType = (activeInteraction as { type: string } | undefined)?.type ?? \"\";\n if (evType === \"extension_ui_select\") { \n const ev = activeInteraction as ExtensionUIEvent & { type: string; requestId: string; title: string; options: string[] };\n return (\n <div className=\"settings-overlay\" onClick={handleCancel}>\n <div\n className=\"settings-panel rewind-panel\"\n onClick={(e) => e.stopPropagation()}\n style={{\n width: 520,\n maxWidth: \"92vw\",\n height: \"auto\",\n maxHeight: \"80vh\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <header className=\"settings-header\">\n <span style={{ fontSize: 14, fontWeight: 600 }}>{ev.title}</span>\n <button onClick={handleCancel} className=\"settings-close\" title=\"Cancel\">\n ✕\n </button>\n </header>\n <div className=\"settings-body\" style={{ padding: \"12px 16px\", overflowY: \"auto\", flex: 1 }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 3 }}>\n {ev.options.map((option, i) => {\n // Parse multi-line checkpoint items: first line is the label, rest is detail\n const lines = option.split(\"\\n\").filter(Boolean);\n const label = lines[0] ?? option;\n // Strip ANSI escape codes — browsers don't interpret them\n const detail = lines.slice(1).join(\" \").trim().replace(/\\u001b\\[[0-9;]*m/g, '');\n return (\n <button\n key={i}\n onClick={async (e) => {\n e.stopPropagation();\n try {\n // Send the FULL option string — pi-rewind uses\n // items.indexOf(selected) to find the checkpoint.\n await respondExtensionUI(sessionId, ev.requestId, option);\n } catch (err) {\n console.error(\"Extension UI respond failed:\", err);\n }\n // Don't clearInteraction here — the next interaction's\n // SSE event would be cleared by the finally block.\n // The overlay's onClick handles stale-state cleanup.\n }}\n onMouseEnter={() => setSelectedIndex(i)}\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"flex-start\",\n gap: 10,\n padding: \"8px 10px\",\n borderRadius: 6,\n border: i === selectedIndex ? \"1px solid var(--accent-border)\" : \"1px solid transparent\",\n background: i === selectedIndex ? \"var(--accent-subtle)\" : \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontSize: 11,\n fontFamily: \"inherit\",\n color: \"var(--text-primary)\",\n transition: \"background 0.15s\",\n }}\n >\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 22,\n height: 22,\n borderRadius: \"50%\",\n background: \"var(--bg-glass-hover)\",\n color: \"var(--text-dim)\",\n fontSize: 10,\n fontWeight: 700,\n flexShrink: 0,\n marginTop: 1,\n }}\n >\n {i + 1}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 11,\n fontWeight: 500,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </div>\n {detail && (\n <div\n style={{\n fontSize: 10,\n color: \"var(--text-dim)\",\n marginTop: 2,\n fontFamily: \"monospace\",\n }}\n >\n {detail}\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n <div style={{ padding: \"8px 16px\", borderTop: \"1px solid var(--border-color)\", fontSize: 10, color: \"var(--text-dim)\", textAlign: \"center\" }}>\n Select an option above\n </div>\n </div>\n </div>\n );\n }\n\n // ── Handle confirm ──\n // ── Handle confirm\n if (evType === \"extension_ui_confirm\") {\n const ev = activeInteraction as ExtensionUIEvent & { type: string; requestId: string; title: string; message: string };\n return (\n <div className=\"settings-overlay\" onClick={handleCancel}>\n <div\n className=\"settings-panel rewind-panel\"\n onClick={(e) => e.stopPropagation()}\n style={{ width: 420, maxWidth: \"92vw\", height: \"auto\", minHeight: 0 }}\n >\n <header className=\"settings-header\">\n <span style={{ fontSize: 14, fontWeight: 600 }}>{ev.title}</span>\n <button onClick={handleCancel} className=\"settings-close\" title=\"Cancel\">\n ✕\n </button>\n </header>\n <div className=\"settings-body\" style={{ padding: \"16px\" }}>\n <p style={{ fontSize: 13, color: \"var(--text-secondary)\", marginBottom: 20, lineHeight: 1.5 }}>\n {ev.message}\n </p>\n <div style={{ display: \"flex\", gap: 8, justifyContent: \"flex-end\" }}>\n <button\n onClick={async (e) => {\n e.stopPropagation();\n try { await respondExtensionUI(sessionId, ev.requestId, false); } catch (err) { console.error(err); }\n }}\n className=\"settings-tab\"\n style={{ padding: \"6px 14px\", fontSize: 12 }}\n >\n No\n </button>\n <button\n onClick={async (e) => {\n e.stopPropagation();\n try { await respondExtensionUI(sessionId, ev.requestId, true); } catch (err) { console.error(err); }\n }}\n className=\"settings-tab settings-tab-active\"\n style={{ padding: \"6px 14px\", fontSize: 12 }}\n >\n Yes\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Handle input ──\n // ── Handle input\n if (evType === \"extension_ui_input\") {\n const ev = activeInteraction as ExtensionUIEvent & { type: string; requestId: string; title: string; placeholder: string };\n return (\n <div className=\"settings-overlay\" onClick={handleCancel}>\n <div\n className=\"settings-panel rewind-panel\"\n onClick={(e) => e.stopPropagation()}\n style={{ width: 420, maxWidth: \"92vw\", height: \"auto\", minHeight: 0 }}\n >\n <header className=\"settings-header\">\n <span style={{ fontSize: 14, fontWeight: 600 }}>{ev.title}</span>\n <button onClick={handleCancel} className=\"settings-close\" title=\"Cancel\">\n ✕\n </button>\n </header>\n <div className=\"settings-body\" style={{ padding: \"16px\" }}>\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder={ev.placeholder}\n autoFocus\n style={{\n width: \"100%\",\n padding: \"8px 10px\",\n fontSize: 12,\n borderRadius: 6,\n border: \"1px solid var(--border-color)\",\n background: \"var(--bg-glass)\",\n color: \"var(--text-primary)\",\n outline: \"none\",\n fontFamily: \"inherit\",\n boxSizing: \"border-box\",\n marginBottom: 12,\n }}\n onKeyDown={async (e) => {\n if (e.key === \"Enter\") {\n e.stopPropagation();\n try { await respondExtensionUI(sessionId, ev.requestId, inputValue); } catch (err) { console.error(err); }\n }\n if (e.key === \"Escape\") {\n handleCancel();\n }\n }}\n />\n <div style={{ display: \"flex\", gap: 8, justifyContent: \"flex-end\" }}>\n <button\n onClick={handleCancel}\n className=\"settings-tab\"\n style={{ padding: \"6px 14px\", fontSize: 12 }}\n >\n Cancel\n </button>\n <button\n onClick={async (e) => {\n e.stopPropagation();\n try { await respondExtensionUI(sessionId, ev.requestId, inputValue); } catch (err) { console.error(err); }\n }}\n className=\"settings-tab settings-tab-active\"\n style={{ padding: \"6px 14px\", fontSize: 12 }}\n >\n OK\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Unknown interaction type, or command running without interaction ──\n if (commandRunning && activeInteraction === undefined) {\n return (\n <div className=\"settings-overlay\">\n <div\n className=\"settings-panel rewind-panel\"\n onClick={(e) => e.stopPropagation()}\n style={{ width: 300, maxWidth: \"92vw\", height: \"auto\", minHeight: 0, textAlign: \"center\" }}\n >\n <div className=\"settings-body\" style={{ padding: \"20px\" }}>\n <div style={{ fontSize: 12, color: \"var(--text-dim)\" }}>\n Extension command running…\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return null;\n}\n","/**\n * NotificationToast — card overlay for extension command results\n * (`extension_ui_notify` SSE events). Renders a centered card\n * matching the settings-panel style, with frosted glass, blur,\n * border, and the sheetIn animation.\n *\n * Only the most recent notification is shown at a time.\n * Auto-dismisses after 15 seconds or on click/dismiss button.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useExtensionUIStore } from \"../stores/extension-ui-store\";\n\nexport function NotificationToast() {\n const notifications = useExtensionUIStore((s) => s.notifications);\n const dismiss = useExtensionUIStore((s) => s.dismissNotification);\n\n // Track the \"live\" notification: the most recent one that has been\n // acknowledged (viewed). We re-render whenever a new notification\n // arrives, showing the latest one.\n const [liveId, setLiveId] = useState<string | null>(null);\n const [message, setMessage] = useState(\"\");\n const [type, setType] = useState<\"info\" | \"warning\" | \"error\">(\"info\");\n const [visible, setVisible] = useState(false);\n\n // Pick the latest notification\n const latest = notifications[notifications.length - 1];\n\n useEffect(() => {\n if (latest && latest.id !== liveId) {\n setLiveId(latest.id);\n setMessage(latest.message);\n setType(latest.type);\n setVisible(true);\n // Auto-dismiss after 15s\n const timer = setTimeout(() => {\n setVisible(false);\n setTimeout(() => dismiss(latest.id), 300); // wait for outro\n }, 15000);\n return () => clearTimeout(timer);\n }\n }, [latest, liveId, dismiss]);\n\n const handleDismiss = () => {\n if (!liveId) return;\n setVisible(false);\n // Wait for the CSS animation to finish before removing from store\n setTimeout(() => {\n dismiss(liveId);\n setLiveId(null);\n }, 250);\n };\n\n if (!liveId || !message) return null;\n\n return (\n <div className=\"toast-overlay\" onClick={handleDismiss}>\n <div\n className={`toast-card ${visible ? \"toast-card-enter\" : \"toast-card-exit\"}`}\n onClick={(e) => e.stopPropagation()}\n role=\"alert\"\n >\n <header className=\"toast-card-header\">\n <span className=\"toast-card-title\">\n {type === \"info\" && \"ℹ️\"}\n {type === \"warning\" && \"⚠️\"}\n {type === \"error\" && \"❌\"}\n <span style={{ marginLeft: 6 }}>\n {type === \"info\" && \"Context Mode\"}\n {type === \"warning\" && \"Warning\"}\n {type === \"error\" && \"Error\"}\n </span>\n </span>\n <button\n className=\"toast-card-close\"\n onClick={handleDismiss}\n aria-label=\"Dismiss\"\n >\n ✕\n </button>\n </header>\n <div className=\"toast-card-body\">\n <pre className=\"toast-card-content\">{message}</pre>\n </div>\n </div>\n </div>\n );\n}\n","import { create } from \"zustand\";\n\nconst STORAGE_KEY = \"pi-kot/favorite-sessions\";\n\nfunction load(): string[] {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n return raw ? (JSON.parse(raw) as string[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction save(ids: string[]): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(ids));\n } catch {\n // private mode\n }\n}\n\ninterface FavoriteStore {\n favorites: string[];\n toggle: (sessionId: string) => void;\n}\n\nexport const useFavoriteStore = create<FavoriteStore>((set, get) => ({\n favorites: load(),\n toggle: (sessionId) => {\n const current = get().favorites;\n const next = current.includes(sessionId)\n ? current.filter((id) => id !== sessionId)\n : [...current, sessionId];\n save(next);\n set({ favorites: next });\n },\n}));\n","import { useState, useMemo } from \"react\";\nimport type { SessionSummary } from \"../lib/api-client\";\nimport { useSessionStore } from \"../stores/session-store\";\nimport { useFavoriteStore } from \"../stores/favorite-store\";\n\nconst PAGE_SIZE = 8; // sessions shown before \"Show more\"\nconst SEARCH_THRESHOLD = 10; // show search input once a project has this many sessions\n\ninterface Props {\n projectId: string;\n sessions: SessionSummary[];\n activeSessionId: string | undefined;\n isStreaming: boolean;\n renamingSessionId: string | undefined;\n renameValue: string;\n renameInputRef: React.RefObject<HTMLInputElement | null>;\n expandedWorkerGroups: Set<string>;\n pendingRevert?: string;\n onSelect: (sessionId: string) => void;\n onRenameStart: (sessionId: string, currentName: string) => void;\n onRenameChange: (value: string) => void;\n onRenameCommit: (sessionId: string, oldName: string) => void;\n onRenameCancel: () => void;\n onToggleWorkerGroup: (sessionId: string) => void;\n onNewSession: () => void;\n}\n\nexport function SessionList({\n projectId,\n sessions,\n activeSessionId,\n isStreaming,\n renamingSessionId,\n renameValue,\n renameInputRef,\n expandedWorkerGroups,\n onSelect,\n onRenameStart,\n onRenameChange,\n onRenameCommit,\n onRenameCancel,\n onToggleWorkerGroup,\n onNewSession,\n}: Props) {\n const [query, setQuery] = useState(\"\");\n const [showAll, setShowAll] = useState(false);\n\n const supervisors = useMemo(() => sessions.filter((s) => !s.supervisorId), [sessions]);\n const workers = useMemo(() => sessions.filter((s) => s.supervisorId), [sessions]);\n const unattachedWorkers = useMemo(\n () => workers.filter((w) => !supervisors.some((s) => s.sessionId === w.supervisorId)),\n [workers, supervisors],\n );\n\n const q = query.trim().toLowerCase();\n\n // Filter supervisors by query\n const filteredSupervisors = useMemo(() => {\n if (!q) return supervisors;\n return supervisors.filter((s) =>\n (s.name ?? `Session ${s.sessionId.slice(0, 8)}`).toLowerCase().includes(q),\n );\n }, [supervisors, q]);\n\n // Paginate — always keep active session visible regardless of page\n const truncated = !showAll && !q && filteredSupervisors.length > PAGE_SIZE;\n const visibleSupervisors = truncated\n ? filteredSupervisors.slice(0, PAGE_SIZE).includes(\n filteredSupervisors.find((s) => s.sessionId === activeSessionId) ?? filteredSupervisors[0],\n )\n // active is within first page — just slice\n ? filteredSupervisors.slice(0, PAGE_SIZE)\n // active is beyond first page — show first PAGE_SIZE-1 + the active one\n : [\n ...filteredSupervisors.slice(0, PAGE_SIZE - 1),\n filteredSupervisors.find((s) => s.sessionId === activeSessionId) ?? filteredSupervisors[PAGE_SIZE - 1],\n ].filter(Boolean) as SessionSummary[]\n : filteredSupervisors;\n\n const hiddenCount = filteredSupervisors.length - visibleSupervisors.length;\n\n const { favorites: favIds, toggle: toggleFav } = useFavoriteStore();\n const { favSessions, normalSessions } = useMemo(() => {\n const fav: SessionSummary[] = [];\n const normal: SessionSummary[] = [];\n for (const s of visibleSupervisors) {\n if (favIds.includes(s.sessionId)) {\n fav.push(s);\n } else {\n normal.push(s);\n }\n }\n return { favSessions: fav, normalSessions: normal };\n }, [visibleSupervisors, favIds]);\n\n const showSearch = sessions.length >= SEARCH_THRESHOLD;\n\n const renderRow = (supervisor: SessionSummary) => {\n const childWorkers = workers.filter((w) => w.supervisorId === supervisor.sessionId);\n const isExpandedGroup = expandedWorkerGroups.has(supervisor.sessionId);\n const isActive = activeSessionId === supervisor.sessionId;\n const displayName = supervisor.name ?? `Session ${supervisor.sessionId.slice(0, 8)}`;\n const isFav = favIds.includes(supervisor.sessionId);\n\n return (\n <div key={supervisor.sessionId}>\n <div\n onClick={(e) => {\n if (renamingSessionId === supervisor.sessionId) return;\n e.stopPropagation();\n onSelect(supervisor.sessionId);\n }}\n className={`session-item${isActive ? \" active\" : \"\"}`}\n onDoubleClick={(e) => {\n e.stopPropagation();\n onRenameStart(supervisor.sessionId, displayName);\n }}\n >\n {childWorkers.length > 0 && (\n <span\n className=\"project-chevron\"\n onClick={(e) => { e.stopPropagation(); onToggleWorkerGroup(supervisor.sessionId); }}\n style={{ cursor: \"pointer\", marginRight: \"4px\" }}\n >\n {isExpandedGroup ? \"▾\" : \"▶\"}\n </span>\n )}\n {renamingSessionId === supervisor.sessionId ? (\n <input\n ref={renameInputRef}\n className=\"session-rename-input\"\n value={renameValue}\n onChange={(e) => onRenameChange(e.target.value)}\n onBlur={() => onRenameCommit(supervisor.sessionId, displayName)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n else if (e.key === \"Escape\") onRenameCancel();\n }}\n onClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <button\n className={`session-fav-btn${isFav ? \" favorited\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n toggleFav(supervisor.sessionId);\n }}\n title={isFav ? \"Remove from favorites\" : \"Add to favorites\"}\n >\n {isFav ? \"★\" : \"☆\"}\n </button>\n <span className=\"session-name\">{displayName}</span>\n <button\n className=\"session-archive-btn\"\n title=\"Archive session\"\n onClick={(e) => {\n e.stopPropagation();\n if (confirm(`Archive \"${displayName}\"?`)) {\n useSessionStore.getState().archiveSession(supervisor.sessionId);\n }\n }}\n >\n ✕\n </button>\n </>\n )}\n </div>\n\n {childWorkers.length > 0 && isExpandedGroup && (\n <div className=\"session-children\">\n {childWorkers.map((worker) => (\n <WorkerItem\n key={worker.sessionId}\n worker={worker}\n isActive={activeSessionId === worker.sessionId}\n isStreaming={isStreaming && activeSessionId === worker.sessionId}\n onSelect={onSelect}\n />\n ))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"session-list project-sublist\">\n {/* ── Search ── */}\n {showSearch && (\n <div style={{ padding: \"2px 8px 3px\" }}>\n <input\n value={query}\n onChange={(e) => { setQuery(e.target.value); setShowAll(false); }}\n placeholder=\"Search sessions…\"\n className=\"session-search-input\"\n type=\"search\"\n />\n </div>\n )}\n\n {/* ── Empty states ── */}\n {supervisors.length === 0 && workers.length === 0 && (\n <div style={{ padding: \"6px 12px 2px\", fontSize: \"11px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>\n No sessions yet\n </div>\n )}\n {q && filteredSupervisors.length === 0 && (\n <div style={{ padding: \"6px 12px 2px\", fontSize: \"11px\", color: \"var(--text-dim)\", fontStyle: \"italic\" }}>\n No matches for \"{query}\"\n </div>\n )}\n\n {/* ── Favorites section ── */}\n {favSessions.length > 0 && !q && (\n <>\n <div className=\"favorites-section-header\">★ Favorites</div>\n {favSessions.map(renderRow)}\n {normalSessions.length > 0 && <div className=\"favorites-section-divider\" />}\n </>\n )}\n {/* ── All sessions ── */}\n {q ? visibleSupervisors.map(renderRow) : normalSessions.map(renderRow)}\n\n {/* ── Show more / less ── */}\n {truncated && hiddenCount > 0 && (\n <button\n className=\"session-show-more-btn\"\n onClick={() => setShowAll(true)}\n type=\"button\"\n >\n ↓ {hiddenCount} more session{hiddenCount !== 1 ? \"s\" : \"\"}\n </button>\n )}\n {showAll && filteredSupervisors.length > PAGE_SIZE && (\n <button\n className=\"session-show-more-btn\"\n onClick={() => setShowAll(false)}\n type=\"button\"\n >\n ↑ Show less\n </button>\n )}\n\n {/* ── Unattached workers ── */}\n {unattachedWorkers.map((worker) => (\n <WorkerItem\n key={worker.sessionId}\n worker={worker}\n isActive={activeSessionId === worker.sessionId}\n isStreaming={isStreaming && activeSessionId === worker.sessionId}\n onSelect={onSelect}\n />\n ))}\n\n {/* ── New session ── */}\n <button\n className=\"new-session-row\"\n onClick={(e) => { e.stopPropagation(); onNewSession(); }}\n type=\"button\"\n >\n <span style={{ fontSize: \"14px\", lineHeight: 1 }}>+</span>\n New session\n </button>\n </div>\n );\n}\n\n/* ── Worker item (shared) ── */\nfunction WorkerItem({\n worker,\n isActive,\n isStreaming,\n onSelect,\n}: {\n worker: SessionSummary;\n isActive: boolean;\n isStreaming: boolean;\n onSelect: (id: string) => void;\n}) {\n return (\n <div\n onClick={(e) => { e.stopPropagation(); onSelect(worker.sessionId); }}\n className={`session-item session-worker-item${isActive ? \" active\" : \"\"}`}\n >\n <span\n className={`session-worker-dot${isStreaming ? \" active\" : \"\"}`}\n style={{\n background: worker.isLive && !isStreaming\n ? \"#98c379\"\n : !worker.isLive\n ? \"#56b6c2\"\n : undefined,\n }}\n />\n <span className=\"session-worker-name\">\n {worker.name ?? `Session ${worker.sessionId.slice(0, 8)}`}\n </span>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Folder,\n ChevronRight,\n Plus,\n ArrowLeft,\n Eye,\n EyeOff,\n GitBranch,\n Globe,\n X,\n} from \"lucide-react\";\nimport {\n fetchHomeDir,\n listDir,\n createProjectAPI,\n cloneRepo,\n} from \"../lib/api-client\";\nimport type { FsEntry, CloneRepoRequest } from \"../lib/api-client\";\nimport { useSessionStore } from \"../stores/session-store\";\n\ninterface AddProjectDialogProps {\n open: boolean;\n onClose: () => void;\n}\n\n/** Resolve ~/ prefix to the actual home directory path. */\nfunction resolveTilde(path: string, homeDir: string): string {\n if (path === \"~\") return homeDir;\n if (path.startsWith(\"~/\")) return homeDir + path.slice(1);\n return path;\n}\n\n/** Get the directory portion of a display path (e.g. \"~/foo/bar\" → \"~/foo/\"). */\nfunction getBrowseDir(displayPath: string): string {\n if (displayPath.endsWith(\"/\")) return displayPath;\n const i = displayPath.lastIndexOf(\"/\");\n return i >= 0 ? displayPath.slice(0, i + 1) : displayPath;\n}\n\n/** Get the trailing segment after the last /. */\nfunction getLeaf(displayPath: string): string {\n if (displayPath.endsWith(\"/\")) return \"\";\n const i = displayPath.lastIndexOf(\"/\");\n return i >= 0 ? displayPath.slice(i + 1) : displayPath;\n}\n\n/**\n * Extract a human-readable repo name from a git clone URL.\n * Examples:\n * https://github.com/user/repo.git → repo\n * https://github.com/user/repo → repo\n * git@github.com:user/my-repo.git → my-repo\n * https://gitlab.com/group/subgroup/proj → proj\n */\nfunction deriveNameFromUrl(url: string): string {\n try {\n // Strip trailing .git\n const cleaned = url.replace(/\\.git$/, \"\");\n // Handle both https:// and git@ ssh-style URLs\n const lastSegment = cleaned.split(\"/\").filter(Boolean).pop() || \"\";\n // For ssh-style (git@host:path), the path may be colon-separated\n const afterColon = lastSegment.split(\":\").filter(Boolean).pop() || \"\";\n return afterColon || lastSegment;\n } catch {\n return \"\";\n }\n}\n\nexport function AddProjectDialog({ open, onClose }: AddProjectDialogProps) {\n const [homeDir, setHomeDir] = useState(\"\");\n const [path, setPath] = useState(\"~/\");\n const [entries, setEntries] = useState<FsEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const [hoverIdx, setHoverIdx] = useState(0);\n const [showHidden, setShowHidden] = useState(false);\n const [cloneMode, setCloneMode] = useState(false);\n const [cloneUrl, setCloneUrl] = useState(\"\");\n const [cloneToCustomPath, setCloneToCustomPath] = useState(false);\n const [cloning, setCloning] = useState(false);\n const [adding, setAdding] = useState(false);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const loadProjects = useSessionStore((s) => s.loadProjects);\n const setActiveProject = useSessionStore((s) => s.setActiveProject);\n\n // ---- reset on open ----\n useEffect(() => {\n if (!open) return;\n let dead = false;\n setPath(\"~/\");\n setCloneUrl(\"\");\n setCloneMode(false);\n setShowHidden(false);\n setHoverIdx(0);\n setError(undefined);\n setAdding(false);\n setCloning(false);\n\n fetchHomeDir()\n .then((h) => {\n if (!dead) {\n setHomeDir(h);\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n })\n .catch(() => {\n if (!dead) {\n setHomeDir(\"/\");\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n });\n\n return () => {\n dead = true;\n };\n }, [open]);\n\n // ---- resolved directory to browse ----\n const browseDir = useMemo(\n () => (homeDir ? resolveTilde(getBrowseDir(path), homeDir) : \"\"),\n [path, homeDir],\n );\n\n // ---- load directory entries ----\n useEffect(() => {\n if (!open || !browseDir) {\n setEntries([]);\n return;\n }\n let dead = false;\n setLoading(true);\n setError(undefined);\n\n listDir(browseDir)\n .then((list) => {\n if (!dead) setEntries(list);\n })\n .catch((err) => {\n if (!dead) {\n setEntries([]);\n setError(err instanceof Error ? err.message : \"Failed to load directory\");\n }\n })\n .finally(() => {\n if (!dead) setLoading(false);\n });\n\n return () => {\n dead = true;\n };\n }, [open, browseDir]);\n\n // ---- filtered entries ----\n const leafFilter = getLeaf(path);\n const filtered = useMemo(() => {\n const lower = leafFilter.toLowerCase();\n const showAll = showHidden || leafFilter.startsWith(\".\");\n return entries.filter(\n (e) =>\n e.isDirectory &&\n (showAll || !e.name.startsWith(\".\")) &&\n e.name.toLowerCase().startsWith(lower),\n );\n }, [entries, leafFilter, showHidden]);\n\n useEffect(() => {\n setHoverIdx(0);\n }, [filtered.length]);\n\n const hasParent = path !== \"~/\" && path !== \"/\";\n const absolutePath = useMemo(\n () => (homeDir ? resolveTilde(path.replace(/\\/+$/, \"\"), homeDir) : \"\"),\n [path, homeDir],\n );\n\n // ---- navigation ----\n const enterDir = useCallback(\n (entryPath: string) => {\n const rel = entryPath.startsWith(homeDir)\n ? \"~\" + entryPath.slice(homeDir.length)\n : entryPath;\n setPath(rel + \"/\");\n },\n [homeDir],\n );\n\n const goUp = useCallback(() => {\n const dir = getBrowseDir(path.replace(/\\/+$/, \"\"));\n const trimmed = dir.replace(/\\/+$/, \"\");\n if (trimmed === \"~\" || trimmed === \"\") {\n const parentOfHome = homeDir ? homeDir.split(\"/\").slice(0, -1).join(\"/\") || \"/\" : \"/\";\n const rel = parentOfHome === \"/\" ? \"/\" : \"~\" + parentOfHome.slice(homeDir.lastIndexOf(\"/\"));\n setPath(rel.endsWith(\"/\") ? rel : rel + \"/\");\n return;\n }\n const i = trimmed.lastIndexOf(\"/\");\n const parent = i >= 0 ? trimmed.slice(0, i + 1) : \"/\";\n setPath(parent);\n }, [path, homeDir]);\n\n // ---- quick-add project from entry ----\n const quickAdd = useCallback(\n async (entryPath: string) => {\n try {\n const name = entryPath.split(\"/\").filter(Boolean).pop() || \"unnamed\";\n await createProjectAPI(name, entryPath);\n await loadProjects();\n const state = useSessionStore.getState();\n const last = state.projects[state.projects.length - 1];\n if (last) setActiveProject(last.id);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to add project\");\n }\n },\n [loadProjects, setActiveProject, onClose],\n );\n\n // ---- add current path ----\n const addCurrent = useCallback(async () => {\n if (!absolutePath || adding) return;\n setAdding(true);\n setError(undefined);\n try {\n const name = absolutePath.split(\"/\").filter(Boolean).pop() || \"unnamed\";\n await createProjectAPI(name, absolutePath);\n await loadProjects();\n const state = useSessionStore.getState();\n const last = state.projects[state.projects.length - 1];\n if (last) setActiveProject(last.id);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to add project\");\n } finally {\n setAdding(false);\n }\n }, [absolutePath, adding, loadProjects, setActiveProject, onClose]);\n\n // ---- clone ----\n const handleClone = useCallback(() => {\n if (!cloneUrl.trim() || !absolutePath || cloning) return;\n setCloning(true);\n setError(undefined);\n\n // Derive folder/project name from the clone URL, not from the browse path\n const folderName = deriveNameFromUrl(cloneUrl.trim()) || \"repo\";\n const payload: CloneRepoRequest = {\n url: cloneUrl.trim(),\n folderName,\n projectName: folderName,\n };\n // When custom-path toggle is on, clone into the browsed dir as a subfolder\n if (cloneToCustomPath) {\n payload.targetPath = absolutePath.replace(/\\/+$/, \"\") + \"/\" + folderName;\n }\n cloneRepo(payload,\n (event) => {\n switch (event.type) {\n case \"done\":\n loadProjects().then(() => {\n const state = useSessionStore.getState();\n const last = state.projects[state.projects.length - 1];\n if (last) setActiveProject(last.id);\n onClose();\n });\n setCloning(false);\n break;\n case \"error\":\n setError(event.message);\n setCloning(false);\n break;\n }\n },\n (err) => {\n setError(err.message);\n setCloning(false);\n },\n );\n }, [cloneUrl, absolutePath, cloneToCustomPath, cloning, loadProjects, setActiveProject, onClose]);\n\n // ---- keyboard ----\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setHoverIdx((i) => Math.min(filtered.length - 1, i + 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHoverIdx((i) => Math.max(0, i - 1));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (filtered.length > 0 && hoverIdx >= 0) {\n const entry = filtered[hoverIdx];\n if (leafFilter && !entry.name.startsWith(leafFilter)) {\n setPath(getBrowseDir(path) + entry.name + \"/\");\n } else {\n enterDir(entry.path);\n }\n }\n } else if (e.key === \"Backspace\" && !path) {\n e.preventDefault();\n onClose();\n }\n },\n [filtered, hoverIdx, leafFilter, path, enterDir, onClose],\n );\n\n if (!open) return null;\n\n return (\n <div className=\"settings-overlay\" onClick={onClose}>\n <div\n className=\"settings-panel add-project-settings-panel\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <header className=\"settings-header\">\n <span\n style={{\n fontSize: \"14px\",\n fontWeight: 700,\n color: \"var(--accent-text)\",\n }}\n >\n Add Project\n </span>\n <button className=\"settings-close\" onClick={onClose} title=\"Close\">\n <X size={16} />\n </button>\n </header>\n\n {/* Body */}\n <div className=\"add-project-dialog-body\">\n {/* Mode toggle */}\n <div className=\"add-project-dialog-bar\">\n <button\n className={\"add-project-dialog-tab\" + (cloneMode ? \"\" : \" active\")}\n onClick={() => setCloneMode(false)}\n >\n <Folder size={14} />\n Browse\n </button>\n <button\n className={\"add-project-dialog-tab\" + (cloneMode ? \" active\" : \"\")}\n onClick={() => setCloneMode(true)}\n >\n <GitBranch size={14} />\n Clone\n </button>\n </div>\n\n {/* Clone URL */}\n {cloneMode && (\n <div className=\"add-project-dialog-clone-row\">\n <Globe size={14} className=\"add-project-dialog-icon\" />\n <input\n type=\"text\"\n value={cloneUrl}\n onChange={(e) => setCloneUrl(e.target.value)}\n placeholder=\"https://github.com/user/repo.git\"\n className=\"add-project-dialog-input\"\n style={{ paddingLeft: \"30px\" }}\n spellCheck={false}\n />\n </div>\n )}\n\n {/* Clone destination toggle */}\n {cloneMode && (\n <div className=\"add-project-dialog-clone-dest\">\n <label className=\"add-project-dialog-toggle\">\n <input\n type=\"checkbox\"\n checked={cloneToCustomPath}\n onChange={(e) => setCloneToCustomPath(e.target.checked)}\n />\n <span className=\"add-project-dialog-toggle-track\">\n <span className=\"add-project-dialog-toggle-knob\" />\n </span>\n <span className=\"add-project-dialog-toggle-label\">\n {cloneToCustomPath ? \"Clone to custom path\" : \"Clone to workspace\"}\n </span>\n </label>\n </div>\n )}\n\n {/* Path with Add/Clone button */}\n <div className=\"add-project-dialog-path-row\">\n <Folder size={14} className=\"add-project-dialog-icon\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={path}\n onChange={(e) => setPath(e.target.value.replace(/\\\\/g, \"/\"))}\n onKeyDown={onKeyDown}\n placeholder=\"~/\"\n className=\"add-project-dialog-input\"\n spellCheck={false}\n />\n <button\n className=\"add-project-dialog-btn\"\n disabled={\n cloneMode\n ? !cloneUrl.trim() || !absolutePath || cloning\n : !absolutePath || adding\n }\n onClick={cloneMode ? handleClone : addCurrent}\n >\n {cloneMode\n ? cloning\n ? \"Cloning…\"\n : \"Clone & Add\"\n : adding\n ? \"Adding…\"\n : \"Add\"}\n </button>\n </div>\n\n {/* Toolbar */}\n <div className=\"add-project-dialog-tools\">\n <button\n className=\"add-project-dialog-tool\"\n onClick={goUp}\n disabled={!hasParent}\n title=\"Go up\"\n >\n <ArrowLeft size={14} />\n <span>..</span>\n </button>\n <button\n className=\"add-project-dialog-tool\"\n onClick={() => setShowHidden((v) => !v)}\n title={showHidden ? \"Hide hidden files\" : \"Show hidden files\"}\n >\n {showHidden ? <EyeOff size={14} /> : <Eye size={14} />}\n <span>{showHidden ? \"Hide hidden\" : \"Show hidden\"}</span>\n </button>\n <span className=\"add-project-dialog-path-display\">\n {absolutePath}\n </span>\n </div>\n\n {/* Error */}\n {error && <div className=\"add-project-dialog-error\">{error}</div>}\n\n {/* Directory list */}\n <div className=\"add-project-dialog-list\">\n {loading ? (\n <div className=\"add-project-dialog-empty\">Loading…</div>\n ) : filtered.length === 0 ? (\n <div className=\"add-project-dialog-empty\">\n {leafFilter ? \"No matching directories\" : \"Empty directory\"}\n </div>\n ) : (\n filtered.map((entry, i) => {\n const hl = i === hoverIdx;\n return (\n <div\n key={entry.path}\n className={\"add-project-dialog-entry\" + (hl ? \" highlighted\" : \"\")}\n onMouseEnter={() => setHoverIdx(i)}\n onClick={() => enterDir(entry.path)}\n >\n <ChevronRight size={14} className=\"add-project-dialog-entry-arrow\" />\n <Folder size={14} className=\"add-project-dialog-entry-folder\" />\n <span className=\"add-project-dialog-entry-name\">{entry.name}</span>\n <button\n className=\"add-project-dialog-entry-add\"\n onClick={(e) => {\n e.stopPropagation();\n quickAdd(entry.path);\n }}\n title=\"Add as project\"\n >\n <Plus size={14} />\n </button>\n </div>\n );\n })\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"add-project-dialog-footer\">\n ↑↓ Navigate · Enter browse · + quick-add\n </div>\n </div>\n </div>\n );\n}\n","import { Component, type ErrorInfo, type ReactNode } from \"react\";\n\ninterface Props {\n children: ReactNode;\n /** Optional — show a compact inline fallback instead of a full block. Good for sidebar panels. */\n compact?: boolean;\n /** Optional label for logging / identification. */\n label?: string;\n}\n\ninterface State {\n error: Error | null;\n}\n\n/**\n * React error boundary that catches render errors in its subtree.\n *\n * Usage:\n * <ErrorBoundary label=\"ChatView\">\n * <ChatView />\n * </ErrorBoundary>\n *\n * Shows a fallback UI with the error name/message and a Retry button.\n * Set `compact` for sidebar/panel contexts where a full block is too loud.\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n console.error(\n `[ErrorBoundary${this.props.label ? `:${this.props.label}` : \"\"}]`,\n error,\n info.componentStack,\n );\n }\n\n private handleRetry = () => {\n this.setState({ error: null });\n };\n\n render() {\n if (this.state.error === null) {\n return this.props.children;\n }\n\n const { error } = this.state;\n const { compact } = this.props;\n\n if (compact) {\n return (\n <div\n style={{\n padding: \"12px\",\n margin: \"8px\",\n borderRadius: \"6px\",\n background: \"var(--bg-glass, rgba(220,80,80,0.08))\",\n border: \"1px solid var(--accent-red, #e06c75)\",\n fontSize: \"12px\",\n color: \"var(--text-secondary, #999)\",\n lineHeight: 1.4,\n }}\n >\n <div style={{ fontWeight: 600, color: \"var(--accent-red, #e06c75)\", marginBottom: 4 }}>\n ⚠️ {error.name ?? \"Error\"}\n </div>\n <div style={{ marginBottom: 8, wordBreak: \"break-word\" }}>{error.message}</div>\n <button\n onClick={this.handleRetry}\n style={{\n padding: \"4px 10px\",\n fontSize: \"11px\",\n borderRadius: \"4px\",\n border: \"1px solid var(--border, #444)\",\n background: \"var(--bg-surface, #1e1e1e)\",\n color: \"var(--text-primary, #ddd)\",\n cursor: \"pointer\",\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px 24px\",\n height: \"100%\",\n boxSizing: \"border-box\",\n }}\n >\n <div\n style={{\n maxWidth: 480,\n width: \"100%\",\n padding: \"24px\",\n borderRadius: \"8px\",\n background: \"var(--bg-surface, #1e1e1e)\",\n border: \"1px solid var(--border, #444)\",\n }}\n >\n <div\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"var(--accent-red, #e06c75)\",\n marginBottom: 8,\n }}\n >\n Something went wrong\n </div>\n <div\n style={{\n fontSize: 12,\n color: \"var(--text-secondary, #999)\",\n marginBottom: 4,\n fontFamily: \"monospace\",\n }}\n >\n {error.name}\n </div>\n <div\n style={{\n fontSize: 13,\n color: \"var(--text-primary, #ddd)\",\n marginBottom: 20,\n lineHeight: 1.5,\n wordBreak: \"break-word\",\n }}\n >\n {error.message}\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n onClick={this.handleRetry}\n style={{\n padding: \"6px 16px\",\n fontSize: 12,\n borderRadius: \"6px\",\n border: \"none\",\n background: \"var(--accent-primary, #569cd6)\",\n color: \"#fff\",\n cursor: \"pointer\",\n }}\n >\n Retry\n </button>\n <button\n onClick={() => {\n this.setState({ error: null });\n window.location.reload();\n }}\n style={{\n padding: \"6px 16px\",\n fontSize: 12,\n borderRadius: \"6px\",\n border: \"1px solid var(--border, #444)\",\n background: \"transparent\",\n color: \"var(--text-secondary, #999)\",\n cursor: \"pointer\",\n }}\n >\n Reload page\n </button>\n </div>\n </div>\n </div>\n );\n }\n}\n","import { useEffect, useRef } from \"react\";\n\nexport function useTouchSwipe(opts: {\n onSwipeLeft?: () => void;\n onSwipeRight?: () => void;\n threshold?: number;\n}) {\n const touchStart = useRef<{ x: number; y: number } | null>(null);\n const threshold = opts.threshold || 50;\n\n useEffect(() => {\n const handleTouchStart = (e: TouchEvent) => {\n touchStart.current = {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY,\n };\n };\n\n const handleTouchEnd = (e: TouchEvent) => {\n if (!touchStart.current) return;\n const xDiff = touchStart.current.x - e.changedTouches[0].clientX;\n const yDiff = touchStart.current.y - e.changedTouches[0].clientY;\n\n if (Math.abs(xDiff) > Math.abs(yDiff) && Math.abs(xDiff) > threshold) {\n if (xDiff > 0 && opts.onSwipeLeft) {\n opts.onSwipeLeft();\n } else if (xDiff < 0 && opts.onSwipeRight) {\n opts.onSwipeRight();\n }\n }\n touchStart.current = null;\n };\n\n window.addEventListener(\"touchstart\", handleTouchStart, { passive: true });\n window.addEventListener(\"touchend\", handleTouchEnd, { passive: true });\n\n return () => {\n window.removeEventListener(\"touchstart\", handleTouchStart);\n window.removeEventListener(\"touchend\", handleTouchEnd);\n };\n }, [opts.onSwipeLeft, opts.onSwipeRight, threshold]);\n}\n","/**\n * Layout store — sidebar collapse, panel visibility, mobile detection.\n *\n * Consolidates UI layout state that was previously scattered across\n * a dozen useState calls in App.tsx. Panels use a simple boolean or\n * tab selector; the store provides compound actions for common\n * interactions (e.g. open panel + close sidebar).\n */\n\nimport { create } from \"zustand\";\n\nexport type ExplorerTab = \"files\" | \"git\";\nexport type PanelName = \"settings\" | \"mcp\" | \"terminal\" | \"tree\" | \"orch\";\n\ninterface LayoutState {\n /* ── Sidebar ── */\n sidebarCollapsed: boolean;\n\n /* ── Panels and dialogs (boolean visibility) ── */\n showTreePanel: boolean;\n showSettings: boolean;\n showOrch: boolean;\n showMCP: boolean;\n showTerminal: boolean;\n showAddProjectDialog: boolean;\n\n /* ── File explorer / git tab (tri-state: undefined = closed) ── */\n explorerTab: ExplorerTab | undefined;\n\n /* ── Derived ── */\n isMobile: boolean;\n\n /* ── Actions ── */\n toggleSidebar: () => void;\n setSidebarCollapsed: (collapsed: boolean) => void;\n closeSidebarOnMobile: () => void;\n\n setShowTreePanel: (open: boolean) => void;\n setShowSettings: (open: boolean) => void;\n setShowOrch: (open: boolean) => void;\n setShowMCP: (open: boolean) => void;\n setShowTerminal: (open: boolean) => void;\n setShowAddProjectDialog: (open: boolean) => void;\n\n /** Set explorer tab to a specific value (undefined = close) */\n setExplorerTab: (tab: ExplorerTab | undefined) => void;\n /** Toggle files tab — opens if closed, switches to files if on git, closes if on files */\n toggleExplorerTab: (tab: ExplorerTab) => void;\n\n /** Close every panel and sidebar (useful for deep-link \"reset\") */\n closeAllPanels: () => void;\n\n setIsMobile: (v: boolean) => void;\n}\n\nexport const useLayoutStore = create<LayoutState>((set, get) => ({\n sidebarCollapsed: false,\n showTreePanel: false,\n showSettings: false,\n showOrch: false,\n showMCP: false,\n showTerminal: false,\n showAddProjectDialog: false,\n explorerTab: undefined,\n isMobile: typeof window !== \"undefined\" ? window.innerWidth <= 600 : false,\n\n /* ── Sidebar actions ── */\n\n toggleSidebar: () => {\n const { sidebarCollapsed, setExplorerTab } = get();\n // opening the sidebar also closes the explorer (keeps one panel at a time on mobile)\n if (sidebarCollapsed) {\n setExplorerTab(undefined);\n }\n set({ sidebarCollapsed: !sidebarCollapsed });\n },\n\n setSidebarCollapsed: (collapsed) => set({ sidebarCollapsed: collapsed }),\n\n closeSidebarOnMobile: () => {\n if (window.innerWidth <= 600) {\n set({ sidebarCollapsed: true });\n }\n },\n\n /* ── Panel toggles ── */\n\n setShowTreePanel: (open) => set({ showTreePanel: open }),\n setShowSettings: (open) => set({ showSettings: open }),\n setShowOrch: (open) => set({ showOrch: open }),\n setShowMCP: (open) => set({ showMCP: open }),\n setShowTerminal: (open) => set({ showTerminal: open }),\n setShowAddProjectDialog: (open) => set({ showAddProjectDialog: open }),\n\n /* ── Explorer ── */\n\n setExplorerTab: (tab) => set({ explorerTab: tab }),\n\n toggleExplorerTab: (tab) => {\n const { explorerTab } = get();\n if (explorerTab === tab) {\n // same tab → close\n set({ explorerTab: undefined });\n } else {\n // different tab or closed → open at this tab\n set({ explorerTab: tab, sidebarCollapsed: true });\n }\n },\n\n /* ── Bulk ── */\n\n closeAllPanels: () =>\n set({\n showTreePanel: false,\n showSettings: false,\n showOrch: false,\n showMCP: false,\n showTerminal: false,\n showAddProjectDialog: false,\n explorerTab: undefined,\n }),\n\n /* ── Responsive ── */\n\n setIsMobile: (v) => set({ isMobile: v }),\n}));\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport { useSessionStore } from \"./stores/session-store\";\nimport { ChatView } from \"./components/ChatView\";\nimport { ChatInput } from \"./components/ChatInput\";\nimport { AskUserQuestionPanel } from \"./components/AskUserQuestionPanel\";\nimport { OrchestrationPanel } from \"./components/OrchestrationPanel\";\n\nimport { ContextInspectModal, useContextData, ContextPill } from \"./components/ContextBar\";\nimport { MCPPanel } from \"./components/MCPPanel\";\nimport { SessionTreePanel } from \"./components/SessionTreePanel\";\nimport { SettingsPanel } from \"./components/SettingsPanel\";\nimport { FileExplorer } from \"./components/FileExplorer\";\nimport { TerminalPanel } from \"./components/TerminalPanel\";\nimport { ExtensionUIInteractionModal } from \"./components/ExtensionUIInteractionModal\";\nimport { NotificationToast } from \"./components/NotificationToast\";\nimport { SessionList } from \"./components/SessionList\";\nimport { AddProjectDialog } from \"./components/AddProjectDialog\";\nimport { ErrorBoundary } from \"./components/ErrorBoundary\";\nimport { LoadingSkeleton } from \"./components/LoadingSkeleton\";\nimport { useTouchSwipe } from \"./hooks/useTouchSwipe\";\nimport { useLayoutStore } from \"./stores/layout-store\";\n\nimport type { SessionContextResponse } from \"./lib/api-client/types\";\nimport {\n fetchAuthStatus,\n login,\n onUnauthorized,\n clearStoredToken,\n type SessionSummary,\n type Project,\n fetchProviders,\n type ProviderGroup,\n getSessionModel,\n} from \"./lib/api-client\";\n\n// Module-level guard against React StrictMode double-invocation\n// Tracks which project IDs have had an auto-created session.\nconst _autoCreatedProjects = new Set<string>();\n\n// Tracks whether the initial app boot is done. Once true, subsequent\n// project switches (user clicking a folder) stop auto-selecting the\n// first session — the welcome screen stays visible instead.\nlet _initialBootDone = false;\n\nconst PROJECT_COLORS = [\n \"var(--accent)\",\n \"#d19a66\",\n \"#56b6c2\",\n \"#c678dd\",\n \"#e5c07b\",\n \"#98c379\",\n \"#e06c75\",\n \"#61afef\",\n];\n\nfunction projectColor(id: string): string {\n let hash = 0;\n for (let i = 0; i < id.length; i++) {\n hash = ((hash << 5) - hash) + id.charCodeAt(i);\n hash |= 0;\n }\n return PROJECT_COLORS[Math.abs(hash) % PROJECT_COLORS.length];\n}\n\nexport function App() {\n const activeSessionId = useSessionStore((s) => s.activeSessionId);\n const activeProjectId = useSessionStore((s) => s.activeProjectId);\n const sessions = useSessionStore((s) => s.sessions);\n const projects = useSessionStore((s) => s.projects);\n const projectSessions = useSessionStore((s) => s.projectSessions);\n const loadProjects = useSessionStore((s) => s.loadProjects);\n const setActiveProject = useSessionStore((s) => s.setActiveProject);\n const createAndActivate = useSessionStore((s) => s.createAndActivate);\n const setActiveSession = useSessionStore((s) => s.setActiveSession);\n const refreshSessions = useSessionStore((s) => s.refreshSessions);\n const isStreaming = useSessionStore((s) => s.streamState.isStreaming);\n const connectionState = useSessionStore((s) => s.connectionState);\n\n const [authRequired, setAuthRequired] = useState(false);\n const [password, setPassword] = useState(\"\");\n const [loginError, setLoginError] = useState<string | undefined>();\n const [loading, setLoading] = useState(true);\n const [selectedModel, setSelectedModel] = useState(\"\");\n const [selectedProvider, setSelectedProvider] = useState(\"\");\n const [providers, setProviders] = useState<ProviderGroup[]>([]);\n const [modelError, setModelError] = useState<string | undefined>();\n const [expandedProjects, setExpandedProjects] = useState<Set<string>>(new Set());\n const [renamingSessionId, setRenamingSessionId] = useState<string | undefined>();\n const [renameValue, setRenameValue] = useState(\"\");\n const [showArchived, setShowArchived] = useState<string | undefined>();\n const [projectToDelete, setProjectToDelete] = useState<string | undefined>();\n const [inspectData, setInspectData] = useState<SessionContextResponse | undefined>(undefined);\n const [expandedWorkerGroups, setExpandedWorkerGroups] = useState<Set<string>>(new Set());\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n\n const contextData = useContextData(activeSessionId);\n\n const {\n sidebarCollapsed, showTreePanel, showSettings, showOrch, showMCP, showTerminal,\n showAddProjectDialog, explorerTab, isMobile,\n toggleSidebar, setSidebarCollapsed, closeSidebarOnMobile,\n setShowTreePanel, setShowSettings, setShowOrch, setShowMCP, setShowTerminal,\n setShowAddProjectDialog, setExplorerTab, toggleExplorerTab,\n setIsMobile,\n } = useLayoutStore();\n\n // Keep isMobile in sync with viewport\n useEffect(() => {\n const onResize = () => setIsMobile(window.innerWidth <= 600);\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useTouchSwipe({\n onSwipeLeft: () => setSidebarCollapsed(true),\n onSwipeRight: () => setSidebarCollapsed(false),\n threshold: 60,\n });\n\n // Bootstrap: check auth, load projects, fetch models\n useEffect(() => {\n (async () => {\n try {\n const { authEnabled } = await fetchAuthStatus();\n if (authEnabled) {\n const token =\n typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"pi-kot/auth-token\")\n : null;\n if (token === null) {\n setAuthRequired(true);\n setLoading(false);\n return;\n }\n }\n await loadProjects();\n } catch {\n // server not reachable yet\n }\n\n // Fetch available models\n try {\n const res = await fetchProviders();\n setProviders(res.providers);\n const allModels = res.providers.flatMap((p) => p.models);\n\n // Try to restore previously selected model from localStorage\n let restored = false;\n try {\n const stored = localStorage.getItem(\"pi-kot-model\");\n if (stored) {\n const parsed = JSON.parse(stored) as { modelId: string; provider: string };\n const match = allModels.find(\n (m) => m.id === parsed.modelId && m.hasAuth,\n );\n if (match) {\n setSelectedModel(match.id);\n setSelectedProvider(parsed.provider);\n restored = true;\n }\n }\n } catch {\n // localStorage read or parse failed\n }\n\n if (!restored) {\n const firstWithAuth = allModels.find((m) => m.hasAuth);\n if (firstWithAuth) {\n setSelectedModel(firstWithAuth.id);\n setSelectedProvider(\n res.providers.find((p) =>\n p.models.some((m) => m.id === firstWithAuth.id)\n )?.provider ?? \"\",\n );\n } else if (allModels.length > 0) {\n setSelectedModel(allModels[0].id);\n setSelectedProvider(res.providers[0]?.provider ?? \"\");\n }\n }\n } catch {\n // providers not available\n }\n\n setLoading(false);\n })();\n }, []);\n\n // Auto-expand active project\n useEffect(() => {\n if (activeProjectId !== undefined) {\n setExpandedProjects((prev) => new Set(prev).add(activeProjectId));\n }\n }, [activeProjectId]);\n\n // Restore stored session on refresh, or auto-select/auto-create as fallback\n useEffect(() => {\n if (loading || authRequired || projects.length === 0) return;\n if (activeProjectId === undefined) return;\n\n const projectSessionsList = projectSessions[activeProjectId];\n // Wait for sessions to finish loading (undefined = still loading)\n if (projectSessionsList === undefined) return;\n\n // Initial boot (first time we reach here after loading completes).\n // Restore a stored session, auto-select the first, or auto-create.\n // Subsequent project switches (user clicking a folder) leave the\n // welcome screen visible — no auto-select, no lag from loading a\n // session the user didn't ask for.\n if (!_initialBootDone) {\n _initialBootDone = true;\n\n // We have a stored session ID (from localStorage or URL hash)\n if (activeSessionId !== undefined) {\n const exists = projectSessionsList.some(\n (s) => s.sessionId === activeSessionId,\n );\n if (!exists) {\n // Stored session was deleted on the server — clear ID and fall through\n try {\n localStorage.removeItem(\"pi-kot/active-session-id\");\n } catch { /* private mode */ }\n useSessionStore.setState({ activeSessionId: undefined });\n return; // Let next render auto-select/create\n }\n // Session still exists — check if it needs activation (page refresh case)\n const st = useSessionStore.getState();\n if (st.sseClient === undefined) {\n setActiveSession(activeSessionId);\n }\n return;\n }\n\n // No stored session — auto-select first or create\n if (projectSessionsList.length > 0) {\n setActiveSession(projectSessionsList[0].sessionId);\n } else if (!_autoCreatedProjects.has(activeProjectId)) {\n _autoCreatedProjects.add(activeProjectId);\n createAndActivate(activeProjectId);\n }\n }\n }, [loading, authRequired, activeProjectId, projectSessions, activeSessionId]);\n\n // Restore per-session model override when switching sessions\n useEffect(() => {\n if (!activeSessionId) return;\n (async () => {\n try {\n const res = await getSessionModel(activeSessionId);\n if (res.provider && res.modelId) {\n setSelectedModel(res.modelId);\n setSelectedProvider(res.provider);\n try {\n localStorage.setItem(\n \"pi-kot-model\",\n JSON.stringify({ modelId: res.modelId, provider: res.provider }),\n );\n } catch {\n // private mode\n }\n }\n } catch {\n // Session not live or not available — keep current selection\n }\n })();\n }, [activeSessionId]);\n\n // ── URL hash sync (deep-linkable sessions) ──\n // Write the active project/session into the URL hash so a refresh\n // or bookmark restores the same view.\n useEffect(() => {\n const pid = activeProjectId;\n const sid = activeSessionId;\n let newHash: string;\n if (pid && sid) {\n newHash = `#/project/${pid}/session/${sid}`;\n } else if (pid) {\n newHash = `#/project/${pid}`;\n } else {\n newHash = \"#\";\n }\n if (window.location.hash !== newHash) {\n history.replaceState(null, \"\", newHash);\n }\n }, [activeProjectId, activeSessionId]);\n\n // Respond to back/forward hash navigation\n useEffect(() => {\n const onHashChange = () => {\n const hash = window.location.hash;\n const m = hash.match(/^#\\/project\\/([^/]+)(?:\\/session\\/([^/]+))?$/);\n if (!m) return;\n const hashProjectId = m[1];\n const hashSessionId = m[2] ?? undefined;\n const state = useSessionStore.getState();\n if (hashSessionId && hashSessionId !== state.activeSessionId) {\n const exists = Object.values(state.projectSessions).some((list) =>\n list.some((s) => s.sessionId === hashSessionId),\n );\n if (exists) {\n // Ensure we're on the right project first\n if (hashProjectId !== state.activeProjectId) {\n state.setActiveProject(hashProjectId).then(() => {\n state.setActiveSession(hashSessionId);\n });\n } else {\n state.setActiveSession(hashSessionId);\n }\n }\n }\n };\n window.addEventListener(\"hashchange\", onHashChange);\n return () => window.removeEventListener(\"hashchange\", onHashChange);\n }, []);\n\n // Listen for 401 unauthorized events from the API client.\n // When the server rejects a stale token (e.g. password changed,\n // server restarted) this clears auth and shows the login form.\n useEffect(() => {\n const unsub = onUnauthorized(() => {\n setPassword(\"\");\n setLoginError(undefined);\n setAuthRequired(true);\n });\n return unsub;\n }, []);\n\n const handleClearToken = useCallback(() => {\n clearStoredToken();\n setPassword(\"\");\n setLoginError(undefined);\n setAuthRequired(true);\n }, []);\n\n // Auto-expand worker groups when any worker in any project is live\n useEffect(() => {\n const allSessions = Object.values(projectSessions).flat();\n const toExpand = new Set(expandedWorkerGroups);\n allSessions.filter((s) => s.supervisorId && s.isLive).forEach((s) => toExpand.add(s.supervisorId!));\n setExpandedWorkerGroups(toExpand);\n }, [projectSessions]);\n\n const handleLogin = async () => {\n try {\n await login(password);\n setLoginError(undefined);\n setAuthRequired(false);\n await loadProjects();\n } catch {\n setLoginError(\"Invalid password\");\n }\n };\n\n const handleModelSelect = useCallback(\n (modelId: string, provider: string) => {\n setSelectedModel(modelId);\n setSelectedProvider(provider);\n setModelError(undefined);\n try {\n localStorage.setItem(\"pi-kot-model\", JSON.stringify({ modelId, provider }));\n } catch {\n // private mode\n }\n },\n [],\n );\n\n const handleModelError = useCallback((error: string) => {\n setModelError(error);\n }, []);\n\n const toggleProject = (projectId: string) => {\n setExpandedProjects((prev) => {\n const next = new Set(prev);\n if (next.has(projectId)) {\n next.delete(projectId);\n } else {\n next.add(projectId);\n }\n return next;\n });\n };\n\n if (loading) {\n return (\n <div className=\"centered\">\n <div style={{ width: \"100%\", maxWidth: 400, display: \"flex\", flexDirection: \"column\", gap: 24 }}>\n <LoadingSkeleton variant=\"card\" count={2} />\n <LoadingSkeleton variant=\"list\" count={4} />\n </div>\n </div>\n );\n }\n\n if (authRequired) {\n return (\n <div className=\"centered\">\n <form\n onSubmit={(e) => { e.preventDefault(); handleLogin(); }}\n className=\"login-form\"\n >\n <h2 className=\"login-title\">pi-kot</h2>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => { setPassword(e.target.value); setLoginError(undefined); }}\n placeholder=\"Enter password\"\n autoFocus\n autoComplete=\"new-password\"\n className={`login-input${loginError ? \" login-input-error\" : \"\"}`}\n />\n {loginError && <div className=\"login-error\">{loginError}</div>}\n <button type=\"submit\" className=\"login-btn\">Login</button>\n <button\n type=\"button\"\n onClick={handleClearToken}\n className=\"login-btn\"\n style={{\n background: \"none\",\n border: \"1px solid var(--border-color, #444)\",\n color: \"var(--text-dim, #888)\",\n fontSize: \"11px\",\n marginTop: \"4px\",\n }}\n >\n Clear stored token\n </button>\n </form>\n </div>\n );\n }\n\n return (\n <div className=\"app-layout\">\n {/* Mobile backdrop — tapping outside sidebar closes it */}\n {!sidebarCollapsed && (\n <div\n className=\"sidebar-backdrop\"\n onClick={() => setSidebarCollapsed(true)}\n aria-hidden=\"true\"\n />\n )}\n {/* Sidebar — collapsible */}\n <div className={`sidebar${sidebarCollapsed ? \" collapsed\" : \"\"}`}>\n <div className=\"sidebar-header\" style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <span\n style={{\n fontSize: \"14px\",\n fontWeight: 700,\n color: \"var(--accent-text)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n }}\n >\n <span\n title={\n connectionState === \"connected\"\n ? \"Connected\"\n : connectionState === \"connecting\"\n ? \"Connecting…\"\n : connectionState === \"error\"\n ? \"Connection error\"\n : \"Disconnected\"\n }\n style={{\n display: \"inline-block\",\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background:\n connectionState === \"connected\"\n ? \"#4caf50\"\n : connectionState === \"connecting\"\n ? \"#f0c040\"\n : connectionState === \"error\"\n ? \"#e06c75\"\n : \"#666\",\n boxShadow:\n connectionState === \"connected\"\n ? \"0 0 5px rgba(76, 175, 80, 0.6)\"\n : \"none\",\n transition: \"all 0.3s\",\n animation: connectionState === \"connecting\"\n ? \"connection-pulse 1.2s ease-in-out infinite\"\n : \"none\",\n }}\n />\n pi-kot\n </span>\n <button\n onClick={() => setShowAddProjectDialog(true)}\n title=\"Add a new project\"\n style={{\n background: 'transparent',\n border: '1px solid var(--border)',\n color: 'var(--text-secondary)',\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n cursor: 'pointer',\n lineHeight: 1,\n padding: '4px 8px',\n borderRadius: 'var(--radius-sm)',\n transition: 'all var(--duration) var(--ease)'\n }}\n onMouseOver={(e) => {\n e.currentTarget.style.color = 'var(--text-primary)';\n e.currentTarget.style.background = 'var(--bg-glass-hover)';\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.color = 'var(--text-secondary)';\n e.currentTarget.style.background = 'transparent';\n }}\n >\n Add Project\n </button>\n </div>\n\n {/* Project list */}\n <div className=\"project-list\">\n {projects.map((project: Project) => {\n const isActive = project.id === activeProjectId;\n const isExpanded = expandedProjects.has(project.id);\n const pSessions = projectSessions[project.id] ?? [];\n\n return (\n <div key={project.id} className={`project-group${isActive ? \" active\" : \"\"}`}>\n {/* Project header */}\n <div\n className={`project-row${isActive ? \" active\" : \"\"}`}\n onClick={() => {\n if (isActive) {\n toggleProject(project.id);\n } else {\n setActiveProject(project.id);\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {/* Folder icon (default) / arrow (on hover) */}\n <span className=\"project-icon\">\n <svg\n className=\"project-icon-folder\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ color: projectColor(project.id) }}\n >\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\n </svg>\n <svg\n className=\"project-icon-arrow\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n </span>\n\n {/* Project name — lowercase, truncate */}\n <span className=\"project-name\">{project.name.toLowerCase()}</span>\n\n {/* Hover-reveal project menu (left group) */}\n <div className=\"project-actions-left\">\n {project.name !== \"Default\" && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n setProjectToDelete(project.id);\n }}\n className=\"project-action-btn\"\n title=\"Remove from sidebar\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"5 14 12 5 19 14\" />\n <line x1=\"4\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Far-right new session button */}\n <div className=\"project-actions-right\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n createAndActivate(project.id);\n }}\n className=\"project-action-btn\"\n title=\"New draft session\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Session list inside project */}\n {isExpanded && (\n <SessionList\n projectId={project.id}\n sessions={pSessions}\n activeSessionId={activeSessionId}\n isStreaming={isStreaming}\n renamingSessionId={renamingSessionId}\n renameValue={renameValue}\n renameInputRef={renameInputRef}\n expandedWorkerGroups={expandedWorkerGroups}\n onSelect={(sessionId) => {\n setActiveSession(sessionId);\n closeSidebarOnMobile();\n }}\n onRenameStart={(sessionId, currentName) => {\n setRenamingSessionId(sessionId);\n setRenameValue(currentName);\n setTimeout(() => renameInputRef.current?.focus(), 50);\n }}\n onRenameChange={setRenameValue}\n onRenameCommit={(sessionId, oldName) => {\n const trimmed = renameValue.trim();\n if (trimmed.length > 0 && trimmed !== oldName) {\n useSessionStore.getState().renameSession(sessionId, trimmed);\n }\n setRenamingSessionId(undefined);\n }}\n onRenameCancel={() => setRenamingSessionId(undefined)}\n onToggleWorkerGroup={(sessionId) => {\n setExpandedWorkerGroups((prev) => {\n const next = new Set(prev);\n if (next.has(sessionId)) next.delete(sessionId);\n else next.add(sessionId);\n return next;\n });\n }}\n onNewSession={() => {\n createAndActivate(project.id);\n closeSidebarOnMobile();\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {/* Archived sessions section */}\n {activeProjectId !== undefined && (\n <>\n <div\n className=\"archived-toggle\"\n onClick={() => {\n const next = showArchived === activeProjectId ? undefined : activeProjectId;\n if (next !== undefined) {\n useSessionStore.getState().loadArchivedSessions(activeProjectId);\n }\n setShowArchived(next);\n }}\n >\n <span className=\"project-chevron\">{showArchived === activeProjectId ? \"▾\" : \"▸\"}</span>\n <span className=\"project-name\" style={{ fontSize: \"12px\" }}>\n Archived\n </span>\n </div>\n {showArchived === activeProjectId && (() => {\n const archived = useSessionStore.getState().archivedSessions[activeProjectId];\n if (archived === undefined) return <div className=\"archived-status\"><LoadingSkeleton variant=\"list\" count={2} /></div>;\n if (archived.length === 0) return <div className=\"archived-status\">No archived sessions</div>;\n return (\n <div className=\"session-list project-sublist archived-list\">\n {archived.map((s: SessionSummary) => (\n <div key={s.sessionId} className=\"session-item archived\">\n <span className=\"session-name\">\n {s.name ?? `Session ${s.sessionId.slice(0, 8)}`}\n </span>\n <button\n className=\"session-restore-btn\"\n title=\"Restore session\"\n onClick={(e) => {\n e.stopPropagation();\n useSessionStore.getState().unarchiveSession(s.sessionId, activeProjectId);\n }}\n >\n ↻\n </button>\n </div>\n ))}\n </div>\n );\n })()}\n </>\n )}\n\n {/* Sidebar Footer (Mobile Actions) */}\n <div className=\"sidebar-footer\">\n <div className=\"mobile-only\" style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <button\n type=\"button\"\n onClick={() => { setShowMCP(true); setSidebarCollapsed(true); }}\n className=\"add-project-toggle\"\n style={{ display: 'flex', alignItems: 'center', gap: '8px' }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n MCP Settings\n </button>\n <button\n type=\"button\"\n onClick={() => { setShowSettings(true); setSidebarCollapsed(true); }}\n className=\"add-project-toggle\"\n style={{ display: 'flex', alignItems: 'center', gap: '8px' }}\n >\n ⚙ Settings\n </button>\n <button\n type=\"button\"\n onClick={() => { handleClearToken(); setSidebarCollapsed(true); }}\n className=\"add-project-toggle\"\n style={{ display: 'flex', alignItems: 'center', gap: '8px', color: 'var(--text-secondary)' }}\n >\n Sign out\n </button>\n </div>\n </div>\n </div>\n\n {/* Main chat area */}\n <div className=\"main-area\">\n {/* Sticky header bar */}\n <div className=\"header\">\n <div className=\"header-left\">\n <button\n type=\"button\"\n onClick={toggleSidebar}\n className=\"sidebar-toggle\"\n title={sidebarCollapsed ? \"Show sidebar\" : \"Hide sidebar\"}\n >\n {sidebarCollapsed ? \"☰\" : \"✕\"}\n </button>\n {activeSessionId !== undefined && (\n <>\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 500,\n color: \"var(--text-secondary)\",\n marginLeft: \"8px\",\n }}\n >\n Session {activeSessionId.slice(0, 8)}\n </span>\n <button\n type=\"button\"\n onClick={() => setShowTreePanel(true)}\n title=\"Session tree (branching history)\"\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--text-dim)\",\n fontSize: \"12px\",\n cursor: \"pointer\",\n padding: \"3px 6px\",\n borderRadius: \"var(--radius-sm)\",\n lineHeight: 1,\n }}\n >\n 🌿\n </button>\n </>\n )}\n </div>\n <div className=\"header-right\">\n <ContextPill\n data={contextData}\n onInspect={(d) => setInspectData(d)}\n />\n <button\n type=\"button\"\n onClick={() => toggleExplorerTab(\"files\")}\n title=\"File explorer\"\n style={{\n background: \"none\",\n border: \"none\",\n color: explorerTab === \"files\" ? \"var(--accent-text)\" : \"var(--text-dim)\",\n fontSize: \"12px\",\n cursor: \"pointer\",\n padding: \"3px 6px\",\n borderRadius: \"var(--radius-sm)\",\n lineHeight: 1,\n }}\n >\n 📂\n </button>\n <button\n type=\"button\"\n onClick={() => { setShowTerminal(true); setSidebarCollapsed(true); }}\n title=\"Terminal\"\n style={{\n background: \"none\",\n border: \"none\",\n color: showTerminal ? \"var(--accent-text)\" : \"var(--text-dim)\",\n fontSize: \"12px\",\n cursor: \"pointer\",\n padding: \"3px 6px\",\n borderRadius: \"var(--radius-sm)\",\n lineHeight: 1,\n }}\n >\n >_\n </button>\n <div className=\"header-overflow desktop-only\">\n <button\n type=\"button\"\n onClick={() => setShowMCP(true)}\n title=\"MCP Settings\"\n style={{\n background: \"none\",\n border: \"none\",\n color: showMCP ? \"var(--accent-text)\" : \"var(--text-dim)\",\n fontSize: \"12px\",\n cursor: \"pointer\",\n padding: \"3px 6px\",\n borderRadius: \"var(--radius-sm)\",\n lineHeight: 1,\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => setShowSettings(true)}\n title=\"Settings\"\n style={{\n background: \"none\",\n border: \"none\",\n color: showSettings ? \"var(--accent-text)\" : \"var(--text-dim)\",\n fontSize: \"14px\",\n cursor: \"pointer\",\n padding: \"3px 6px\",\n borderRadius: \"var(--radius-sm)\",\n lineHeight: 1,\n }}\n >\n ⚙\n </button>\n <button\n type=\"button\"\n onClick={handleClearToken}\n title=\"Sign out (clear stored token)\"\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--text-dim)\",\n fontSize: \"12px\",\n cursor: \"pointer\",\n padding: \"3px 6px\",\n borderRadius: \"var(--radius-sm)\",\n lineHeight: 1,\n }}\n >\n Sign out\n </button>\n </div>\n </div>\n </div>\n\n {/* Model error banner */}\n {modelError !== undefined && (\n <div\n onClick={() => setModelError(undefined)}\n className=\"error-banner\"\n style={{\n position: \"absolute\",\n top: \"52px\",\n left: \"16px\",\n right: \"16px\",\n zIndex: 9,\n cursor: \"pointer\",\n }}\n >\n {modelError} — click to dismiss\n </div>\n )}\n\n {activeSessionId !== undefined ? (\n <>\n <ErrorBoundary label=\"ChatView\" compact>\n <ChatView sessionId={activeSessionId} modelName={selectedModel || undefined} providerName={selectedProvider || undefined} />\n </ErrorBoundary>\n <ErrorBoundary label=\"OrchestrationPanel\" compact>\n <OrchestrationPanel\n sessionId={activeSessionId}\n open={showOrch}\n onClose={() => setShowOrch(false)}\n />\n </ErrorBoundary>\n <AskUserQuestionPanel sessionId={activeSessionId} />\n <ChatInput\n sessionId={activeSessionId}\n showOrch={showOrch}\n setShowOrch={setShowOrch}\n selectedModel={selectedModel}\n onModelSelect={handleModelSelect}\n onModelError={handleModelError}\n />\n </>\n ) : (\n <div className=\"centered\" style={{ height: \"100%\" }}>\n <div className=\"welcome\">\n <div className=\"welcome-icon\">⌨️</div>\n <div className=\"welcome-text\">Select or create a session</div>\n <div className=\"welcome-hint\">to start chatting with the coding agent</div>\n </div>\n </div>\n )}\n </div>\n\n {/* Session Tree Panel overlay */}\n {activeSessionId !== undefined && activeProjectId !== undefined && (\n <ErrorBoundary label=\"SessionTreePanel\" compact>\n <SessionTreePanel\n sessionId={activeSessionId}\n projectId={activeProjectId}\n open={showTreePanel}\n onClose={() => setShowTreePanel(false)}\n />\n </ErrorBoundary>\n )}\n\n {/* Explorer panel (Files + Git tabs) */}\n {activeProjectId !== undefined && (\n <ErrorBoundary label=\"FileExplorer\" compact>\n <FileExplorer\n projectId={activeProjectId}\n open={explorerTab !== undefined}\n onClose={() => setExplorerTab(undefined)}\n initialTab={explorerTab}\n />\n </ErrorBoundary>\n )}\n\n {/* Settings Panel overlay */}\n {/* Confirm project delete — matches settings/rewind modal animation */}\n {projectToDelete !== undefined && (\n <div className=\"settings-overlay\" onClick={() => setProjectToDelete(undefined)}>\n <div\n className=\"settings-panel rewind-panel\"\n onClick={(e) => e.stopPropagation()}\n style={{ width: 420, maxWidth: \"90vw\", height: \"auto\", minHeight: 0 }}\n >\n <header className=\"settings-header\">\n <span style={{ fontSize: 14, fontWeight: 600 }}>Remove project?</span>\n <button\n onClick={() => setProjectToDelete(undefined)}\n className=\"settings-close\"\n title=\"Close\"\n >\n ✕\n </button>\n </header>\n <div className=\"settings-body\" style={{ padding: \"16px\" }}>\n <p style={{ fontSize: 13, color: \"var(--text-secondary)\", marginBottom: 20, lineHeight: 1.5 }}>\n This removes <strong>{projects.find(p => p.id === projectToDelete)?.name ?? projectToDelete}</strong> from the sidebar — all sessions stay safely on disk. You can add it back anytime.\n </p>\n <div style={{ display: \"flex\", gap: 8, justifyContent: \"flex-end\" }}>\n <button\n onClick={() => setProjectToDelete(undefined)}\n className=\"settings-tab\"\n style={{ padding: \"6px 14px\", fontSize: 12 }}\n >\n Cancel\n </button>\n <button\n onClick={() => {\n useSessionStore.getState().deleteProject(projectToDelete);\n setProjectToDelete(undefined);\n }}\n className=\"settings-tab settings-tab-active\"\n style={{ padding: \"6px 14px\", fontSize: 12, background: \"var(--accent-red, #e06c75)\", color: \"#fff\", border: \"none\" }}\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showSettings && (\n <ErrorBoundary label=\"SettingsPanel\" compact>\n <SettingsPanel onClose={() => setShowSettings(false)} />\n </ErrorBoundary>\n )}\n\n {inspectData !== undefined && (\n <ContextInspectModal data={inspectData} onClose={() => setInspectData(undefined)} sessionId={activeSessionId} />\n )}\n\n <ErrorBoundary label=\"TerminalPanel\" compact>\n <TerminalPanel\n open={showTerminal}\n onClose={() => setShowTerminal(false)}\n />\n </ErrorBoundary>\n\n {showMCP && (\n <ErrorBoundary label=\"MCPPanel\" compact>\n <MCPPanel onClose={() => setShowMCP(false)} />\n </ErrorBoundary>\n )}\n\n {/* Extension UI bridge interactions (select/confirm/input from extension commands) */}\n {activeSessionId !== undefined && (\n <ExtensionUIInteractionModal sessionId={activeSessionId} />\n )}\n\n {/* Extension command notifications (toast from ctx.ui.notify) */}\n <NotificationToast />\n\n {showAddProjectDialog && (\n <AddProjectDialog\n open={showAddProjectDialog}\n onClose={() => setShowAddProjectDialog(false)}\n />\n )}\n </div>\n );\n}\n","import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\nimport { getSavedTheme, applyTheme } from \"./lib/theme\";\nimport \"./styles/themes.css\";\n\n// Apply saved theme before first render\napplyTheme(getSavedTheme());\n\nconst root = document.getElementById(\"root\");\nif (root === null) throw new Error(\"root element not found\");\n\ncreateRoot(root).render(\n <StrictMode>\n <App />\n </StrictMode>,\n);\n"],"file":"index-CE_Na97I.js"}
|