@kimiclaw/cli 1.0.42 → 1.0.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +19 -21
  2. package/bin/dscode.exe +4 -0
  3. package/install.cjs +15 -0
  4. package/package.json +9 -9
  5. package/web/dist/assets/AssistantsView-Y4TXobGE.js +1 -0
  6. package/web/dist/assets/AutomationView-DfAF2L92.js +3 -0
  7. package/web/dist/assets/Button-D-g7PgYh.js +1 -0
  8. package/web/dist/assets/ChannelConfigView-WJ-zUV8p.js +12 -0
  9. package/web/dist/assets/ChartsView-CSAfGqTC.js +1 -0
  10. package/web/dist/assets/ConnectorsView-DaHmxnGE.js +2 -0
  11. package/web/dist/assets/{MessageBubble-CVGXupVH.js → DiffPreview-D8tIj_aF.js} +64 -67
  12. package/web/dist/assets/FileContextMenu-C5WYeBNu.js +1 -0
  13. package/web/dist/assets/FileTreeView-B7IN0KmE.js +1 -0
  14. package/web/dist/assets/HookConfigView-9gqvrRhQ.js +2 -0
  15. package/web/dist/assets/InboxView-BcEfijbj.js +1 -0
  16. package/web/dist/assets/InputArea-D5F91Uwk.js +14 -0
  17. package/web/dist/assets/Install-Cuelo0If.js +2 -0
  18. package/web/dist/assets/MemoryView-BvZSh5-T.js +1 -0
  19. package/web/dist/assets/ModelsView-BgvMN8xv.js +1 -0
  20. package/web/dist/assets/PluginsView-C3d6e8vV.js +1 -0
  21. package/web/dist/assets/ProjectsView-CM7GOsoK.js +1 -0
  22. package/web/dist/assets/SessionGrid-BQSrCDqQ.js +4 -0
  23. package/web/dist/assets/SettingsModal-BvGXq5EE.js +4 -0
  24. package/web/dist/assets/SkillsView-87kGRliE.js +1 -0
  25. package/web/dist/assets/TemplatesTab-8MLwVNwV.js +1 -0
  26. package/web/dist/assets/ToolsView-CjdYiaNz.js +1 -0
  27. package/web/dist/assets/{agentIconSet-B5GUQwel.js → agentIconSet-CDeMxTHf.js} +1 -1
  28. package/web/dist/assets/api-ZQf0Ys8y.js +1 -0
  29. package/web/dist/assets/channelMeta-BO645sjD.js +1 -0
  30. package/web/dist/assets/common-CPZxdYLs.js +304 -0
  31. package/web/dist/assets/icons-B8Ngx6rM.js +1 -0
  32. package/web/dist/assets/imageUrl-CrQM4gmf.js +74 -0
  33. package/web/dist/assets/index-Bm7r92T3.css +1 -0
  34. package/web/dist/assets/index-STsyoFCk.js +145 -0
  35. package/web/dist/assets/installDiagnosis-ZYUVgJIJ.js +3 -0
  36. package/web/dist/assets/{markdown-N5__3T-w.js → markdown-Cps-36Z5.js} +1 -1
  37. package/web/dist/assets/{panels-CIPgN61N.js → panels-DCwx2Pbu.js} +1 -1
  38. package/web/dist/assets/{react-vendor-CB4cLN-6.js → react-vendor-CXI113IS.js} +1 -1
  39. package/web/dist/assets/sessionKind-CZ1kQQII.js +1 -0
  40. package/web/dist/assets/{settingsStore-Xqln0d91.js → settingsStore-BSdi9gNd.js} +1 -1
  41. package/web/dist/assets/src-BK8SoTFV.js +1 -0
  42. package/web/dist/assets/{state-CSZ50keL.js → state-pOTP5BEk.js} +1 -1
  43. package/web/dist/assets/statusAxesRefresh--2evRuAU.js +1 -0
  44. package/web/dist/assets/sttLanguages-BPcOF0nQ.js +2 -0
  45. package/web/dist/assets/{types-JssxRFJn.js → threads-lr33dwqg.js} +1 -1
  46. package/web/dist/assets/useConfirm-CQjBnYuP.js +1 -0
  47. package/web/dist/assets/{useTranslation-B-mfApCn.js → useTranslation-gGKZZfux.js} +1 -1
  48. package/web/dist/assets/websocket-CeKJTCdp.js +1 -0
  49. package/web/dist/assets/whatsNewStore-C0hbStfc.js +1 -0
  50. package/web/dist/assets/{workspaceSemantics-RaIRer76.js → workspaceSemantics-CW8ytHq2.js} +3 -3
  51. package/web/dist/favicon.svg +31 -14
  52. package/web/dist/icons/icon-1024.png +0 -0
  53. package/web/dist/icons/icon-180.png +0 -0
  54. package/web/dist/icons/icon-192.png +0 -0
  55. package/web/dist/icons/icon-512.png +0 -0
  56. package/web/dist/icons/icon-maskable-512.png +0 -0
  57. package/web/dist/index.html +38 -35
  58. package/web/dist/logo.svg +42 -20
  59. package/web/dist/manifest.webmanifest +2 -2
  60. package/web/dist/assets/AssistantsView-Ct3BBpYf.js +0 -1
  61. package/web/dist/assets/AutomationView-CO-jVhee.js +0 -3
  62. package/web/dist/assets/ChannelConfigView-Ct1W584x.js +0 -8
  63. package/web/dist/assets/ChartsView-CAc37Sam.js +0 -1
  64. package/web/dist/assets/ConnectorsView-DP4bbh58.js +0 -1
  65. package/web/dist/assets/FileTreeView-DwsYfssO.js +0 -1
  66. package/web/dist/assets/HookConfigView-uFsqieii.js +0 -2
  67. package/web/dist/assets/InputArea-BY8quOiH.js +0 -14
  68. package/web/dist/assets/MemoryView-Bgd_lcTf.js +0 -1
  69. package/web/dist/assets/ModelsView-B271UV9L.js +0 -1
  70. package/web/dist/assets/PluginsView-Dz4fqQR1.js +0 -2
  71. package/web/dist/assets/ProjectsView-DF-YCV8y.js +0 -1
  72. package/web/dist/assets/SessionGrid-BIREstN2.js +0 -4
  73. package/web/dist/assets/SettingsModal-ZJeoZcCd.js +0 -4
  74. package/web/dist/assets/SkillsView-CH2ghYL2.js +0 -1
  75. package/web/dist/assets/TemplatesTab-BGe7_67s.js +0 -1
  76. package/web/dist/assets/ThreadsView-XditIHZ4.js +0 -2
  77. package/web/dist/assets/ToolsView-BBzsFdVZ.js +0 -1
  78. package/web/dist/assets/api-plEYhRn0.js +0 -1
  79. package/web/dist/assets/channelMeta-BGQXQxgj.js +0 -1
  80. package/web/dist/assets/common-Bbatsa0-.js +0 -192
  81. package/web/dist/assets/icons-CYDRRPKW.js +0 -1
  82. package/web/dist/assets/index-CTbLW314.js +0 -133
  83. package/web/dist/assets/index-DdzVrZye.css +0 -1
  84. package/web/dist/assets/src-49LUQhkG.js +0 -1
  85. package/web/dist/assets/sttLanguages-CSNMgUTz.js +0 -2
  86. package/web/dist/assets/ttsSettings-BwXYpDnk.js +0 -2
  87. package/web/dist/assets/useConfirm-Da8iQ_DZ.js +0 -1
  88. package/web/dist/assets/websocket-BnDwh01e.js +0 -1
  89. package/web/dist/assets/whatsNewStore-LpdLRLGl.js +0 -1
  90. /package/web/dist/assets/{MessageBubble-CCTRbIMZ.css → DiffPreview-CCTRbIMZ.css} +0 -0
@@ -1 +0,0 @@
1
- .widget-grid{grid-template-columns:minmax(0,1fr);grid-auto-flow:dense;align-items:start;gap:.5rem;display:grid}.widget-grid[data-cols="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}.widget-grid[data-cols="4"]{grid-template-columns:repeat(4,minmax(0,1fr))}.wg-cell{min-width:0}.wg-cell:empty{display:none}.widget-grid[data-cols="2"]>.wg-cell[data-span="2"],.widget-grid[data-cols="4"]>.wg-cell[data-span="2"]{grid-column:span 2}.widget-grid>.wg-cell[data-span=full]{grid-column:1/-1}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/inter-latin-400-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/fonts/inter-latin-600-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,ui-sans-serif,system-ui,PingFang SC,-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:SF Mono,Monaco,Menlo,Consolas,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (width>=640px){.container{max-width:640px}}@media (width>=768px){.container{max-width:768px}}@media (width>=1024px){.container{max-width:1024px}}@media (width>=1280px){.container{max-width:1280px}}@media (width>=1536px){.container{max-width:1536px}}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.-inset-x-4{left:-1rem;right:-1rem}.inset-x-0{left:0;right:0}.inset-x-0\.5{left:.125rem;right:.125rem}.inset-x-1{left:.25rem;right:.25rem}.inset-x-2{left:.5rem;right:.5rem}.inset-y-0{top:0;bottom:0}.inset-y-0\.5{top:.125rem;bottom:.125rem}.inset-y-1{top:.25rem;bottom:.25rem}.-end-0\.5{inset-inline-end:-.125rem}.-end-1{inset-inline-end:-.25rem}.-left-0\.5{left:-.125rem}.-left-1{left:-.25rem}.-right-1{right:-.25rem}.-top-0\.5{top:-.125rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-0\.5{bottom:.125rem}.bottom-2{bottom:.5rem}.bottom-20{bottom:5rem}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.bottom-5{bottom:1.25rem}.bottom-9{bottom:2.25rem}.bottom-full{bottom:100%}.end-0\.5{inset-inline-end:.125rem}.end-1{inset-inline-end:.25rem}.end-1\.5{inset-inline-end:.375rem}.end-2{inset-inline-end:.5rem}.end-3{inset-inline-end:.75rem}.end-4{inset-inline-end:1rem}.end-5{inset-inline-end:1.25rem}.end-\[calc\(100\%\+8px\)\]{inset-inline-end:calc(100% + 8px)}.end-full{inset-inline-end:100%}.left-0{left:0}.left-0\.5{left:.125rem}.left-1\/2{left:50%}.right-0{right:0}.right-0\.5{right:.125rem}.right-1\.5{right:.375rem}.right-3{right:.75rem}.start-0{inset-inline-start:0}.start-0\.5{inset-inline-start:.125rem}.start-1{inset-inline-start:.25rem}.start-1\.5{inset-inline-start:.375rem}.start-2{inset-inline-start:.5rem}.start-2\.5{inset-inline-start:.625rem}.start-3{inset-inline-start:.75rem}.start-4{inset-inline-start:1rem}.start-7{inset-inline-start:1.75rem}.start-\[18px\]{inset-inline-start:18px}.start-\[2px\]{inset-inline-start:2px}.start-\[7px\]{inset-inline-start:7px}.start-\[calc\(100\%\+8px\)\]{inset-inline-start:calc(100% + 8px)}.top-0{top:0}.top-0\.5{top:.125rem}.top-1{top:.25rem}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-\[3px\]{top:3px}.top-full{top:100%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[110\]{z-index:110}.z-\[58\]{z-index:58}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.z-\[80\]{z-index:80}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2/span 2}.col-span-full{grid-column:1/-1}.m-0{margin:0}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.-me-1{margin-inline-end:-.25rem}.-ml-3\.5{margin-left:-.875rem}.-ms-1{margin-inline-start:-.25rem}.-ms-2{margin-inline-start:-.5rem}.-ms-3{margin-inline-start:-.75rem}.-ms-3\.5{margin-inline-start:-.875rem}.-ms-4{margin-inline-start:-1rem}.-mt-4{margin-top:-1rem}.-mt-px{margin-top:-1px}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.me-0\.5{margin-inline-end:.125rem}.me-1{margin-inline-end:.25rem}.me-2{margin-inline-end:.5rem}.me-2\.5{margin-inline-end:.625rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-6{margin-left:1.5rem}.ml-auto{margin-left:auto}.ms-0\.5{margin-inline-start:.125rem}.ms-1{margin-inline-start:.25rem}.ms-1\.5{margin-inline-start:.375rem}.ms-2{margin-inline-start:.5rem}.ms-3{margin-inline-start:.75rem}.ms-4{margin-inline-start:1rem}.ms-\[11px\]{margin-inline-start:11px}.ms-\[15px\]{margin-inline-start:15px}.ms-auto{margin-inline-start:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-\[1px\]{margin-top:1px}.mt-\[3px\]{margin-top:3px}.mt-\[5px\]{margin-top:5px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.inline-grid{display:inline-grid}.contents{display:contents}.\!hidden{display:none!important}.hidden{display:none}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:16/9}.h-0{height:0}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[18px\]{height:18px}.h-\[20px\]{height:20px}.h-\[22px\]{height:22px}.h-\[260px\]{height:260px}.h-\[26px\]{height:26px}.h-\[30px\]{height:30px}.h-\[3px\]{height:3px}.h-\[520px\]{height:520px}.h-\[52vh\]{height:52vh}.h-\[72vh\]{height:72vh}.h-\[80vh\]{height:80vh}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-28{max-height:7rem}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-56{max-height:14rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.max-h-\[26vh\]{max-height:26vh}.max-h-\[280px\]{max-height:280px}.max-h-\[28vh\]{max-height:28vh}.max-h-\[300px\]{max-height:300px}.max-h-\[40vh\]{max-height:40vh}.max-h-\[420px\]{max-height:420px}.max-h-\[46vh\]{max-height:46vh}.max-h-\[48vh\]{max-height:48vh}.max-h-\[50vh\]{max-height:50vh}.max-h-\[55vh\]{max-height:55vh}.max-h-\[62vh\]{max-height:62vh}.max-h-\[640px\]{max-height:640px}.max-h-\[70vh\]{max-height:70vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[calc\(100vh-2rem\)\]{max-height:calc(100vh - 2rem)}.max-h-\[min\(60vh\,18rem\)\]{max-height:min(60vh,18rem)}.max-h-\[min\(60vh\,540px\)\]{max-height:min(60vh,540px)}.max-h-full{max-height:100%}.max-h-none{max-height:none}.min-h-0{min-height:0}.min-h-11{min-height:2.75rem}.min-h-28{min-height:7rem}.min-h-9{min-height:2.25rem}.min-h-\[220px\]{min-height:220px}.min-h-\[36px\]{min-height:36px}.min-h-\[520px\]{min-height:520px}.min-h-\[55vh\]{min-height:55vh}.min-h-\[60px\]{min-height:60px}.min-h-\[64px\]{min-height:64px}.min-h-\[72px\]{min-height:72px}.min-h-\[8\.5rem\]{min-height:8.5rem}.min-h-\[92px\]{min-height:92px}.min-h-screen{min-height:100vh}.w-0{width:0}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/3{width:33.3333%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/5{width:40%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/5{width:60%}.w-32{width:8rem}.w-4{width:1rem}.w-4\/5{width:80%}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[18px\]{width:18px}.w-\[260px\]{width:260px}.w-\[2px\]{width:2px}.w-\[320px\]{width:320px}.w-\[340px\]{width:340px}.w-\[360px\]{width:360px}.w-\[3px\]{width:3px}.w-\[400px\]{width:400px}.w-\[560px\]{width:560px}.w-\[74px\]{width:74px}.w-\[84px\]{width:84px}.w-\[96px\]{width:96px}.w-\[9ch\]{width:9ch}.w-\[calc\(50\%-2px\)\]{width:calc(50% - 2px)}.w-\[min\(20rem\,calc\(100vw-1\.5rem\)\)\]{width:min(20rem,100vw - 1.5rem)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.min-w-0{min-width:0}.min-w-10{min-width:2.5rem}.min-w-\[1\.75rem\]{min-width:1.75rem}.min-w-\[120px\]{min-width:120px}.min-w-\[14px\]{min-width:14px}.min-w-\[200px\]{min-width:200px}.min-w-\[20px\]{min-width:20px}.min-w-\[2px\]{min-width:2px}.min-w-\[80px\]{min-width:80px}.min-w-\[96px\]{min-width:96px}.min-w-\[9rem\]{min-width:9rem}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-7xl{max-width:80rem}.max-w-\[1040px\]{max-width:1040px}.max-w-\[10rem\]{max-width:10rem}.max-w-\[11rem\]{max-width:11rem}.max-w-\[13rem\]{max-width:13rem}.max-w-\[140px\]{max-width:140px}.max-w-\[14rem\]{max-width:14rem}.max-w-\[160px\]{max-width:160px}.max-w-\[16rem\]{max-width:16rem}.max-w-\[180px\]{max-width:180px}.max-w-\[18rem\]{max-width:18rem}.max-w-\[220px\]{max-width:220px}.max-w-\[240px\]{max-width:240px}.max-w-\[24rem\]{max-width:24rem}.max-w-\[26rem\]{max-width:26rem}.max-w-\[300px\]{max-width:300px}.max-w-\[46ch\]{max-width:46ch}.max-w-\[60\%\]{max-width:60%}.max-w-\[70vw\]{max-width:70vw}.max-w-\[78\%\]{max-width:78%}.max-w-\[7rem\]{max-width:7rem}.max-w-\[8rem\]{max-width:8rem}.max-w-\[90\%\]{max-width:90%}.max-w-\[92vw\]{max-width:92vw}.max-w-\[980px\]{max-width:980px}.max-w-\[calc\(100\%-3rem\)\]{max-width:calc(100% - 3rem)}.max-w-\[calc\(100vw-1\.5rem\)\]{max-width:calc(100vw - 1.5rem)}.max-w-\[min\(45\%\,12rem\)\]{max-width:min(45%,12rem)}.max-w-\[min\(70\%\,26rem\)\]{max-width:min(70%,26rem)}.max-w-\[min\(80vw\,30rem\)\]{max-width:min(80vw,30rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-right{transform-origin:100%}.-translate-x-1{--tw-translate-x:-.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\/2{--tw-translate-x:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0\.5{--tw-translate-x:.125rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x:.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-2{--tw-translate-x:.5rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-4{--tw-translate-x:1rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-6{--tw-translate-x:1.5rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[18px\]{--tw-translate-x:18px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate:-90deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-1{--tw-rotate:1deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate:45deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes fadeInUp{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in-up{animation:.4s ease-out fadeInUp}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-help{cursor:help}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-ns-resize{cursor:ns-resize}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.cursor-wait{cursor:wait}.cursor-zoom-in{cursor:zoom-in}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;user-select:none}.select-all{-webkit-user-select:all;user-select:all}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.scroll-mt-5{scroll-margin-top:1.25rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-\[3rem_repeat\(7\,minmax\(0\,1fr\)\)\]{grid-template-columns:3rem repeat(7,minmax(0,1fr))}.grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-\[2px\]{gap:2px}.gap-px{gap:1px}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-0\.5{row-gap:.125rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2{row-gap:.5rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-dark-border>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(var(--color-border) / var(--tw-divide-opacity,1))}.divide-dark-border\/60>:not([hidden])~:not([hidden]){border-color:rgb(var(--color-border) / .6)}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-balance{text-wrap:balance}.text-pretty{text-wrap:pretty}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:var(--radius-md)}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[0\.25rem\]{border-radius:.25rem}.rounded-\[0\.2rem\]{border-radius:.2rem}.rounded-\[1px\]{border-radius:1px}.rounded-\[2px\]{border-radius:2px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.rounded-e-full{border-start-end-radius:9999px;border-end-end-radius:9999px}.rounded-e-lg{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.rounded-s-full{border-start-start-radius:9999px;border-end-start-radius:9999px}.rounded-s-lg{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.rounded-t{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0}.border-b-2{border-bottom-width:2px}.border-e{border-inline-end-width:1px}.border-e-0{border-inline-end-width:0}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-r-2{border-right-width:2px}.border-s{border-inline-start-width:1px}.border-s-0{border-inline-start-width:0}.border-s-2{border-inline-start-width:2px}.border-s-4{border-inline-start-width:4px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-dashed{border-style:dashed}.border-accent-blue{--tw-border-opacity:1;border-color:rgb(var(--color-accent-blue) / var(--tw-border-opacity,1))}.border-accent-blue\/20{border-color:rgb(var(--color-accent-blue) / .2)}.border-accent-blue\/30{border-color:rgb(var(--color-accent-blue) / .3)}.border-accent-blue\/40{border-color:rgb(var(--color-accent-blue) / .4)}.border-accent-blue\/50{border-color:rgb(var(--color-accent-blue) / .5)}.border-accent-blue\/60{border-color:rgb(var(--color-accent-blue) / .6)}.border-accent-blue\/70{border-color:rgb(var(--color-accent-blue) / .7)}.border-accent-cyan\/20{border-color:#39c5cf33}.border-accent-cyan\/30{border-color:#39c5cf4d}.border-accent-cyan\/40{border-color:#39c5cf66}.border-accent-green{--tw-border-opacity:1;border-color:rgb(var(--color-accent-green) / var(--tw-border-opacity,1))}.border-accent-green\/30{border-color:rgb(var(--color-accent-green) / .3)}.border-accent-green\/40{border-color:rgb(var(--color-accent-green) / .4)}.border-accent-orange\/30{border-color:#d777534d}.border-accent-purple{--tw-border-opacity:1;border-color:rgb(var(--color-accent-purple) / var(--tw-border-opacity,1))}.border-accent-purple\/30{border-color:rgb(var(--color-accent-purple) / .3)}.border-accent-purple\/40{border-color:rgb(var(--color-accent-purple) / .4)}.border-accent-red{--tw-border-opacity:1;border-color:rgb(var(--color-accent-red) / var(--tw-border-opacity,1))}.border-accent-red\/30{border-color:rgb(var(--color-accent-red) / .3)}.border-accent-red\/40{border-color:rgb(var(--color-accent-red) / .4)}.border-accent-red\/50{border-color:rgb(var(--color-accent-red) / .5)}.border-accent-red\/60{border-color:rgb(var(--color-accent-red) / .6)}.border-accent-yellow{--tw-border-opacity:1;border-color:rgb(var(--color-accent-yellow) / var(--tw-border-opacity,1))}.border-accent-yellow\/10{border-color:rgb(var(--color-accent-yellow) / .1)}.border-accent-yellow\/15{border-color:rgb(var(--color-accent-yellow) / .15)}.border-accent-yellow\/20{border-color:rgb(var(--color-accent-yellow) / .2)}.border-accent-yellow\/30{border-color:rgb(var(--color-accent-yellow) / .3)}.border-accent-yellow\/40{border-color:rgb(var(--color-accent-yellow) / .4)}.border-accent-yellow\/50{border-color:rgb(var(--color-accent-yellow) / .5)}.border-accent-yellow\/60{border-color:rgb(var(--color-accent-yellow) / .6)}.border-amber-500\/40{border-color:#f59e0b66}.border-dark-border{--tw-border-opacity:1;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1))}.border-dark-border\/20{border-color:rgb(var(--color-border) / .2)}.border-dark-border\/25{border-color:rgb(var(--color-border) / .25)}.border-dark-border\/30{border-color:rgb(var(--color-border) / .3)}.border-dark-border\/40{border-color:rgb(var(--color-border) / .4)}.border-dark-border\/50{border-color:rgb(var(--color-border) / .5)}.border-dark-border\/60{border-color:rgb(var(--color-border) / .6)}.border-dark-border\/70{border-color:rgb(var(--color-border) / .7)}.border-dark-muted\/40{border-color:rgb(var(--color-muted) / .4)}.border-transparent{border-color:#0000}.border-white\/25{border-color:#ffffff40}.border-t-accent-blue{--tw-border-opacity:1;border-top-color:rgb(var(--color-accent-blue) / var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:#0000}.bg-accent-blue{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-blue) / var(--tw-bg-opacity,1))}.bg-accent-blue-muted{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-blue-muted) / var(--tw-bg-opacity,1))}.bg-accent-blue\/10{background-color:rgb(var(--color-accent-blue) / .1)}.bg-accent-blue\/15{background-color:rgb(var(--color-accent-blue) / .15)}.bg-accent-blue\/20{background-color:rgb(var(--color-accent-blue) / .2)}.bg-accent-blue\/40{background-color:rgb(var(--color-accent-blue) / .4)}.bg-accent-blue\/5{background-color:rgb(var(--color-accent-blue) / .05)}.bg-accent-blue\/60{background-color:rgb(var(--color-accent-blue) / .6)}.bg-accent-blue\/70{background-color:rgb(var(--color-accent-blue) / .7)}.bg-accent-blue\/\[0\.04\]{background-color:rgb(var(--color-accent-blue) / .04)}.bg-accent-cyan{--tw-bg-opacity:1;background-color:rgb(57 197 207/var(--tw-bg-opacity,1))}.bg-accent-cyan\/10{background-color:#39c5cf1a}.bg-accent-cyan\/15{background-color:#39c5cf26}.bg-accent-fg\/20{background-color:rgb(var(--color-accent-fg) / .2)}.bg-accent-green{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-green) / var(--tw-bg-opacity,1))}.bg-accent-green\/10{background-color:rgb(var(--color-accent-green) / .1)}.bg-accent-green\/15{background-color:rgb(var(--color-accent-green) / .15)}.bg-accent-green\/20{background-color:rgb(var(--color-accent-green) / .2)}.bg-accent-green\/5{background-color:rgb(var(--color-accent-green) / .05)}.bg-accent-green\/80{background-color:rgb(var(--color-accent-green) / .8)}.bg-accent-green\/\[0\.06\]{background-color:rgb(var(--color-accent-green) / .06)}.bg-accent-green\/\[0\.12\]{background-color:rgb(var(--color-accent-green) / .12)}.bg-accent-orange{--tw-bg-opacity:1;background-color:rgb(215 119 83/var(--tw-bg-opacity,1))}.bg-accent-orange\/15{background-color:#d7775326}.bg-accent-orange\/5{background-color:#d777530d}.bg-accent-purple{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-purple) / var(--tw-bg-opacity,1))}.bg-accent-purple\/10{background-color:rgb(var(--color-accent-purple) / .1)}.bg-accent-purple\/15{background-color:rgb(var(--color-accent-purple) / .15)}.bg-accent-purple\/20{background-color:rgb(var(--color-accent-purple) / .2)}.bg-accent-purple\/70{background-color:rgb(var(--color-accent-purple) / .7)}.bg-accent-red{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-red) / var(--tw-bg-opacity,1))}.bg-accent-red\/10{background-color:rgb(var(--color-accent-red) / .1)}.bg-accent-red\/15{background-color:rgb(var(--color-accent-red) / .15)}.bg-accent-red\/20{background-color:rgb(var(--color-accent-red) / .2)}.bg-accent-red\/5{background-color:rgb(var(--color-accent-red) / .05)}.bg-accent-red\/80{background-color:rgb(var(--color-accent-red) / .8)}.bg-accent-red\/\[0\.06\]{background-color:rgb(var(--color-accent-red) / .06)}.bg-accent-yellow{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-yellow) / var(--tw-bg-opacity,1))}.bg-accent-yellow\/10{background-color:rgb(var(--color-accent-yellow) / .1)}.bg-accent-yellow\/15{background-color:rgb(var(--color-accent-yellow) / .15)}.bg-accent-yellow\/20{background-color:rgb(var(--color-accent-yellow) / .2)}.bg-accent-yellow\/25{background-color:rgb(var(--color-accent-yellow) / .25)}.bg-accent-yellow\/5,.bg-accent-yellow\/\[0\.05\]{background-color:rgb(var(--color-accent-yellow) / .05)}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/20{background-color:#0003}.bg-black\/70{background-color:#000000b3}.bg-black\/80{background-color:#000c}.bg-current{background-color:currentColor}.bg-dark-base{--tw-bg-opacity:1;background-color:rgb(var(--color-base) / var(--tw-bg-opacity,1))}.bg-dark-bg{--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1))}.bg-dark-bg\/20{background-color:rgb(var(--color-bg) / .2)}.bg-dark-bg\/40{background-color:rgb(var(--color-bg) / .4)}.bg-dark-bg\/45{background-color:rgb(var(--color-bg) / .45)}.bg-dark-bg\/50{background-color:rgb(var(--color-bg) / .5)}.bg-dark-bg\/60{background-color:rgb(var(--color-bg) / .6)}.bg-dark-bg\/70{background-color:rgb(var(--color-bg) / .7)}.bg-dark-bg\/80{background-color:rgb(var(--color-bg) / .8)}.bg-dark-bg\/85{background-color:rgb(var(--color-bg) / .85)}.bg-dark-bg\/90{background-color:rgb(var(--color-bg) / .9)}.bg-dark-bg\/95{background-color:rgb(var(--color-bg) / .95)}.bg-dark-border{--tw-bg-opacity:1;background-color:rgb(var(--color-border) / var(--tw-bg-opacity,1))}.bg-dark-border\/40{background-color:rgb(var(--color-border) / .4)}.bg-dark-border\/50{background-color:rgb(var(--color-border) / .5)}.bg-dark-border\/60{background-color:rgb(var(--color-border) / .6)}.bg-dark-border\/70{background-color:rgb(var(--color-border) / .7)}.bg-dark-hover{--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1))}.bg-dark-hover\/20{background-color:rgb(var(--color-hover) / .2)}.bg-dark-hover\/30{background-color:rgb(var(--color-hover) / .3)}.bg-dark-hover\/40{background-color:rgb(var(--color-hover) / .4)}.bg-dark-hover\/50{background-color:rgb(var(--color-hover) / .5)}.bg-dark-hover\/60{background-color:rgb(var(--color-hover) / .6)}.bg-dark-hover\/70{background-color:rgb(var(--color-hover) / .7)}.bg-dark-muted{--tw-bg-opacity:1;background-color:rgb(var(--color-muted) / var(--tw-bg-opacity,1))}.bg-dark-muted\/35{background-color:rgb(var(--color-muted) / .35)}.bg-dark-muted\/40{background-color:rgb(var(--color-muted) / .4)}.bg-dark-muted\/60{background-color:rgb(var(--color-muted) / .6)}.bg-dark-overlay{--tw-bg-opacity:1;background-color:rgb(var(--color-overlay) / var(--tw-bg-opacity,1))}.bg-dark-overlay\/70{background-color:rgb(var(--color-overlay) / .7)}.bg-dark-overlay\/95{background-color:rgb(var(--color-overlay) / .95)}.bg-dark-raised{--tw-bg-opacity:1;background-color:rgb(var(--color-raised) / var(--tw-bg-opacity,1))}.bg-dark-surface{--tw-bg-opacity:1;background-color:rgb(var(--color-surface) / var(--tw-bg-opacity,1))}.bg-dark-surface\/40{background-color:rgb(var(--color-surface) / .4)}.bg-dark-surface\/45{background-color:rgb(var(--color-surface) / .45)}.bg-dark-surface\/50{background-color:rgb(var(--color-surface) / .5)}.bg-dark-surface\/60{background-color:rgb(var(--color-surface) / .6)}.bg-dark-surface\/70{background-color:rgb(var(--color-surface) / .7)}.bg-dark-surface\/80{background-color:rgb(var(--color-surface) / .8)}.bg-dark-surface\/90{background-color:rgb(var(--color-surface) / .9)}.bg-dark-surface\/95{background-color:rgb(var(--color-surface) / .95)}.bg-dark-tertiary{--tw-bg-opacity:1;background-color:rgb(var(--color-tertiary) / var(--tw-bg-opacity,1))}.bg-dark-text{--tw-bg-opacity:1;background-color:rgb(var(--color-text) / var(--tw-bg-opacity,1))}.bg-dark-text\/60{background-color:rgb(var(--color-text) / .6)}.bg-dark-text\/70{background-color:rgb(var(--color-text) / .7)}.bg-diff-added-bg{background-color:rgb(var(--color-accent-green) / .12)}.bg-diff-added\/30{background-color:rgb(var(--color-accent-green) / .3)}.bg-diff-removed-bg{background-color:rgb(var(--color-accent-red) / .12)}.bg-diff-removed\/30{background-color:rgb(var(--color-accent-red) / .3)}.bg-transparent{background-color:#0000}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/20{background-color:#fff3}.bg-gradient-to-r{background-image:linear-gradient(to right, var(--tw-gradient-stops))}.from-accent-blue{--tw-gradient-from:rgb(var(--color-accent-blue) / 1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--color-accent-blue) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-accent-blue\/70{--tw-gradient-from:rgb(var(--color-accent-blue) / .7) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--color-accent-blue) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-transparent{--tw-gradient-from:transparent var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.via-white\/60{--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), #fff9 var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-accent-blue{--tw-gradient-to:rgb(var(--color-accent-blue) / 1) var(--tw-gradient-to-position)}.to-accent-purple{--tw-gradient-to:rgb(var(--color-accent-purple) / 1) var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.fill-accent-blue{fill:rgb(var(--color-accent-blue) / 1)}.fill-accent-blue\/70{fill:rgb(var(--color-accent-blue) / .7)}.fill-accent-green{fill:rgb(var(--color-accent-green) / 1)}.fill-accent-purple{fill:rgb(var(--color-accent-purple) / 1)}.fill-accent-red{fill:rgb(var(--color-accent-red) / 1)}.fill-accent-yellow{fill:rgb(var(--color-accent-yellow) / 1)}.fill-current{fill:currentColor}.fill-dark-border{fill:rgb(var(--color-border) / 1)}.fill-dark-muted{fill:rgb(var(--color-muted) / 1)}.fill-dark-text{fill:rgb(var(--color-text) / 1)}.stroke-accent-blue{stroke:rgb(var(--color-accent-blue) / 1)}.stroke-accent-green{stroke:rgb(var(--color-accent-green) / 1)}.stroke-accent-purple{stroke:rgb(var(--color-accent-purple) / 1)}.stroke-accent-red{stroke:rgb(var(--color-accent-red) / 1)}.stroke-accent-yellow{stroke:rgb(var(--color-accent-yellow) / 1)}.stroke-dark-border{stroke:rgb(var(--color-border) / 1)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-px{padding:1px}.\!px-0{padding-left:0!important;padding-right:0!important}.\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\!px-3{padding-left:.75rem!important;padding-right:.75rem!important}.\!py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.py-px{padding-top:1px;padding-bottom:1px}.\!pb-1{padding-bottom:.25rem!important}.\!pt-2{padding-top:.5rem!important}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-8{padding-bottom:2rem}.pb-\[calc\(env\(safe-area-inset-bottom\,0px\)\+0\.75rem\)\]{padding-bottom:calc(env(safe-area-inset-bottom,0px) + .75rem)}.pe-1{padding-inline-end:.25rem}.pe-1\.5{padding-inline-end:.375rem}.pe-10{padding-inline-end:2.5rem}.pe-11{padding-inline-end:2.75rem}.pe-2{padding-inline-end:.5rem}.pe-2\.5{padding-inline-end:.625rem}.pe-3{padding-inline-end:.75rem}.pe-4{padding-inline-end:1rem}.pe-6{padding-inline-end:1.5rem}.pe-7{padding-inline-end:1.75rem}.pe-8{padding-inline-end:2rem}.pe-9{padding-inline-end:2.25rem}.pl-0{padding-left:0}.pl-3{padding-left:.75rem}.pr-1{padding-right:.25rem}.ps-1{padding-inline-start:.25rem}.ps-1\.5{padding-inline-start:.375rem}.ps-10{padding-inline-start:2.5rem}.ps-2{padding-inline-start:.5rem}.ps-2\.5{padding-inline-start:.625rem}.ps-3{padding-inline-start:.75rem}.ps-4{padding-inline-start:1rem}.ps-5{padding-inline-start:1.25rem}.ps-6{padding-inline-start:1.5rem}.ps-7{padding-inline-start:1.75rem}.ps-8{padding-inline-start:2rem}.ps-9{padding-inline-start:2.25rem}.ps-\[1\.375rem\]{padding-inline-start:1.375rem}.ps-\[18px\]{padding-inline-start:18px}.ps-\[38px\]{padding-inline-start:38px}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-8{padding-top:2rem}.pt-\[12vh\]{padding-top:12vh}.pt-\[1px\]{padding-top:1px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.align-baseline{vertical-align:baseline}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:SF Mono,Monaco,Menlo,Consolas,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.9em\]{font-size:.9em}.text-\[14\.5px\]{font-size:14.5px}.text-avatar{font-size:9px}.text-badge{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-compact{font-size:13px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-meta{font-size:11px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-\[14px\]{line-height:14px}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-accent-blue{--tw-text-opacity:1;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1))}.text-accent-blue\/60{color:rgb(var(--color-accent-blue) / .6)}.text-accent-blue\/70{color:rgb(var(--color-accent-blue) / .7)}.text-accent-blue\/80{color:rgb(var(--color-accent-blue) / .8)}.text-accent-blue\/90{color:rgb(var(--color-accent-blue) / .9)}.text-accent-cyan{--tw-text-opacity:1;color:rgb(57 197 207/var(--tw-text-opacity,1))}.text-accent-fg{--tw-text-opacity:1;color:rgb(var(--color-accent-fg) / var(--tw-text-opacity,1))}.text-accent-fg\/70{color:rgb(var(--color-accent-fg) / .7)}.text-accent-fg\/75{color:rgb(var(--color-accent-fg) / .75)}.text-accent-green{--tw-text-opacity:1;color:rgb(var(--color-accent-green) / var(--tw-text-opacity,1))}.text-accent-green\/70{color:rgb(var(--color-accent-green) / .7)}.text-accent-green\/80{color:rgb(var(--color-accent-green) / .8)}.text-accent-orange{--tw-text-opacity:1;color:rgb(215 119 83/var(--tw-text-opacity,1))}.text-accent-orange\/90{color:#d77753e6}.text-accent-purple{--tw-text-opacity:1;color:rgb(var(--color-accent-purple) / var(--tw-text-opacity,1))}.text-accent-purple\/80{color:rgb(var(--color-accent-purple) / .8)}.text-accent-red{--tw-text-opacity:1;color:rgb(var(--color-accent-red) / var(--tw-text-opacity,1))}.text-accent-red\/70{color:rgb(var(--color-accent-red) / .7)}.text-accent-red\/80{color:rgb(var(--color-accent-red) / .8)}.text-accent-red\/90{color:rgb(var(--color-accent-red) / .9)}.text-accent-yellow{--tw-text-opacity:1;color:rgb(var(--color-accent-yellow) / var(--tw-text-opacity,1))}.text-accent-yellow\/50{color:rgb(var(--color-accent-yellow) / .5)}.text-accent-yellow\/60{color:rgb(var(--color-accent-yellow) / .6)}.text-accent-yellow\/70{color:rgb(var(--color-accent-yellow) / .7)}.text-accent-yellow\/75{color:rgb(var(--color-accent-yellow) / .75)}.text-accent-yellow\/80{color:rgb(var(--color-accent-yellow) / .8)}.text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}.text-amber-200\/60{color:#fde68a99}.text-amber-200\/80{color:#fde68acc}.text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.text-amber-300\/90{color:#fcd34de6}.text-dark-bg{--tw-text-opacity:1;color:rgb(var(--color-bg) / var(--tw-text-opacity,1))}.text-dark-border{--tw-text-opacity:1;color:rgb(var(--color-border) / var(--tw-text-opacity,1))}.text-dark-muted{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1))}.text-dark-muted\/30{color:rgb(var(--color-muted) / .3)}.text-dark-muted\/35{color:rgb(var(--color-muted) / .35)}.text-dark-muted\/40{color:rgb(var(--color-muted) / .4)}.text-dark-muted\/50{color:rgb(var(--color-muted) / .5)}.text-dark-muted\/55{color:rgb(var(--color-muted) / .55)}.text-dark-muted\/60{color:rgb(var(--color-muted) / .6)}.text-dark-muted\/70{color:rgb(var(--color-muted) / .7)}.text-dark-muted\/80{color:rgb(var(--color-muted) / .8)}.text-dark-muted\/90{color:rgb(var(--color-muted) / .9)}.text-dark-tertiary{--tw-text-opacity:1;color:rgb(var(--color-tertiary) / var(--tw-text-opacity,1))}.text-dark-text{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.text-dark-text\/80{color:rgb(var(--color-text) / .8)}.text-dark-text\/85{color:rgb(var(--color-text) / .85)}.text-dark-text\/90{color:rgb(var(--color-text) / .9)}.text-diff-added{--tw-text-opacity:1;color:rgb(var(--color-accent-green) / var(--tw-text-opacity,1))}.text-diff-removed{--tw-text-opacity:1;color:rgb(var(--color-accent-red) / var(--tw-text-opacity,1))}.text-emerald-300\/90{color:#6ee7b7e6}.text-overlay-fg{--tw-text-opacity:1;color:rgb(var(--color-overlay-fg) / var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-400\/90{color:#f87171e6}.text-transparent{color:#0000}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.decoration-accent-blue\/30{-webkit-text-decoration-color:rgb(var(--color-accent-blue) / .3);text-decoration-color:rgb(var(--color-accent-blue) / .3)}.decoration-accent-blue\/40{-webkit-text-decoration-color:rgb(var(--color-accent-blue) / .4);text-decoration-color:rgb(var(--color-accent-blue) / .4)}.decoration-dark-border{-webkit-text-decoration-color:rgb(var(--color-border) / 1);text-decoration-color:rgb(var(--color-border) / 1)}.decoration-dark-muted\/40{-webkit-text-decoration-color:rgb(var(--color-muted) / .4);text-decoration-color:rgb(var(--color-muted) / .4)}.underline-offset-2{text-underline-offset:2px}.placeholder-dark-muted::placeholder{--tw-placeholder-opacity:1;color:rgb(var(--color-muted) / var(--tw-placeholder-opacity,1))}.placeholder-dark-muted\/50::placeholder{color:rgb(var(--color-muted) / .5)}.placeholder-dark-muted\/60::placeholder{color:rgb(var(--color-muted) / .6)}.caret-dark-text{caret-color:rgb(var(--color-text) / 1)}.accent-\[rgb\(var\(--color-accent-blue\)\)\]{accent-color:rgb(var(--color-accent-blue))}.accent-accent-blue{accent-color:rgb(var(--color-accent-blue) / 1)}.accent-accent-green{accent-color:rgb(var(--color-accent-green) / 1)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow{--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-\[0_10px_32px_rgba\(0\,0\,0\,0\.28\)\]{--tw-shadow:0 10px 32px #00000047;--tw-shadow-colored:0 10px 32px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-\[0_8px_20px_rgb\(var\(--color-accent-blue\)\/0\.14\)\]{--tw-shadow:0 8px 20px rgb(var(--color-accent-blue)/.14);--tw-shadow-colored:0 8px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-drawer{--tw-shadow:var(--shadow-drawer);--tw-shadow-colored:var(--shadow-drawer);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-md{--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-pop{--tw-shadow:var(--shadow-pop);--tw-shadow-colored:var(--shadow-pop);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-xl{--tw-shadow:var(--shadow-xl);--tw-shadow-colored:var(--shadow-xl);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.outline-none{outline-offset:2px;outline:2px solid #0000}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-accent-blue{--tw-ring-opacity:1;--tw-ring-color:rgb(var(--color-accent-blue) / var(--tw-ring-opacity,1))}.ring-accent-blue\/25{--tw-ring-color:rgb(var(--color-accent-blue) / .25)}.ring-accent-blue\/30{--tw-ring-color:rgb(var(--color-accent-blue) / .3)}.ring-accent-blue\/40{--tw-ring-color:rgb(var(--color-accent-blue) / .4)}.ring-accent-blue\/45{--tw-ring-color:rgb(var(--color-accent-blue) / .45)}.ring-accent-blue\/50{--tw-ring-color:rgb(var(--color-accent-blue) / .5)}.ring-accent-blue\/60{--tw-ring-color:rgb(var(--color-accent-blue) / .6)}.ring-accent-blue\/70{--tw-ring-color:rgb(var(--color-accent-blue) / .7)}.ring-black\/30{--tw-ring-color:#0000004d}.ring-dark-border{--tw-ring-opacity:1;--tw-ring-color:rgb(var(--color-border) / var(--tw-ring-opacity,1))}.ring-dark-border\/60{--tw-ring-color:rgb(var(--color-border) / .6)}.ring-offset-2{--tw-ring-offset-width:2px}.ring-offset-dark-bg{--tw-ring-offset-color:rgb(var(--color-bg) / 1)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\[stroke-dashoffset\]{transition-property:stroke-dashoffset;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\[transform\,width\,height\,opacity\,box-shadow\]{transition-property:transform,width,height,opacity,box-shadow;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\[width\]{transition-property:width;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-1000{transition-duration:1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.duration-base{transition-duration:var(--dur-base)}.duration-snap{transition-duration:var(--dur-snap)}.ease-expo{transition-timing-function:var(--ease-expo)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-overshoot{transition-timing-function:var(--ease-overshoot)}.will-change-transform{will-change:transform}:root{--color-base:233 238 243;--color-bg:247 251 255;--color-surface:255 255 255;--color-border:195 217 240;--color-hover:241 242 243;--color-raised:241 242 243;--color-overlay:255 255 255;--color-overlay-hover:241 242 243;--color-overlay-border:195 217 240;--color-text:16 35 58;--color-muted:91 119 148;--color-tertiary:130 152 175;--color-accent-blue:31 111 235;--color-accent-blue-muted:194 210 235;--color-accent-green:31 157 99;--color-accent-red:209 56 63;--color-accent-yellow:184 134 11;--color-accent-purple:125 63 196;--color-accent-fg:255 255 255;--color-overlay-fg:255 255 255;--status-working:79 127 208;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 2px 0 rgb(var(--color-text) / .05);--shadow-md:0 4px 6px -1px rgb(var(--color-text) / .1), 0 2px 4px -2px rgb(var(--color-text) / .1);--shadow-lg:0 10px 15px -3px rgb(var(--color-text) / .1), 0 4px 6px -4px rgb(var(--color-text) / .1);--shadow-xl:0 20px 25px -5px rgb(var(--color-text) / .1), 0 8px 10px -6px rgb(var(--color-text) / .1);--shadow-air-1:0 1px 2px rgb(var(--color-text) / .04), 0 2px 8px rgb(var(--color-text) / .03);--shadow-air-2:0 4px 12px rgb(var(--color-text) / .05), 0 12px 32px rgb(var(--color-text) / .06);--shadow-pop:0 16px 48px rgb(var(--color-text) / .16);--shadow-drawer:0 0 40px rgb(var(--color-text) / .22);--ui-scrim:rgb(var(--color-text) / .45);--dur-micro:60ms;--dur-snap:.12s;--dur-base:.2s;--dur-sheet:.3s;--dur-slow:.45s;--ease-expo:cubic-bezier(.16, 1, .3, 1);--ease-snap:cubic-bezier(.32, .72, 0, 1);--ease-overshoot:cubic-bezier(.34, 1.3, .64, 1);--ease-decel:cubic-bezier(.165, .84, .44, 1);--ui-hairline:1px;--board-gap:24px}.light{--color-base:233 238 243;--color-bg:247 251 255;--color-surface:255 255 255;--color-border:195 217 240;--color-hover:241 242 243;--color-raised:241 242 243;--color-overlay:255 255 255;--color-overlay-hover:241 242 243;--color-overlay-border:195 217 240;--color-text:16 35 58;--color-muted:91 119 148;--color-tertiary:130 152 175;--color-accent-blue:31 111 235;--color-accent-blue-muted:194 210 235;--color-accent-green:31 157 99;--color-accent-red:209 56 63;--color-accent-yellow:184 134 11;--color-accent-purple:125 63 196;--status-working:79 127 208}@media (resolution>=2x){:root{--ui-hairline:.5px}}@media (resolution>=3x){:root{--ui-hairline:calc(1px / 3)}}.dark{--color-base:0 0 0;--color-bg:0 0 0;--color-surface:13 13 13;--color-raised:27 27 27;--color-overlay:40 40 40;--color-overlay-hover:50 50 50;--color-overlay-border:54 54 54;--color-border:38 38 38;--color-hover:27 27 27;--color-text:242 242 242;--color-muted:154 154 154;--color-tertiary:116 116 116;--color-accent-blue:77 163 255;--color-accent-blue-muted:15 33 51;--color-accent-green:72 199 142;--color-accent-red:255 107 107;--color-accent-yellow:255 204 102;--color-accent-purple:177 140 255;--status-working:123 162 240;--shadow-sm:0 1px 2px 0 #0000000d;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--shadow-air-1:0 1px 2px #0000000a, 0 2px 8px #00000008;--shadow-air-2:0 4px 12px #0000000d, 0 12px 32px #0000000f;--shadow-pop:0 16px 48px #0000008c;--shadow-drawer:0 0 40px #0009;--ui-scrim:#181818bf}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{overscroll-behavior:none;width:100%;height:100%;overflow:hidden}:root{--safe-area-top:env(safe-area-inset-top,0px);--safe-area-right:env(safe-area-inset-right,0px);--safe-area-bottom:env(safe-area-inset-bottom,0px);--safe-area-left:env(safe-area-inset-left,0px)}@media (display-mode:standalone){.app-shell{padding-top:var(--safe-area-top);padding-right:var(--safe-area-right);padding-bottom:var(--safe-area-bottom);padding-left:var(--safe-area-left)}}body{background-color:rgb(var(--color-bg));color:rgb(var(--color-text));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;font-feature-settings:"cv02", "cv03", "cv04", "cv11";font-family:Inter,ui-sans-serif,system-ui,PingFang SC,-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;line-height:1.5}.board-ground{background-image:radial-gradient(circle, rgb(var(--color-border)) 1px, transparent 1px);background-size:var(--board-gap) var(--board-gap);background-position:-1px -1px}.chart-placeholder{background-image:radial-gradient(circle, rgb(var(--color-border)) 1px, transparent 1px);background-position:-1px -1px;background-size:12px 12px}[data-theme-pattern=grid] .app-shell,[data-theme-pattern=grid] .chat-workspace,[data-theme-pattern=grid] .canvas-plane,[data-theme-pattern=grid] .workbench-sidebar,[data-theme-pattern=grid] .ui-page{background-image:linear-gradient(rgb(var(--color-border) / .6) 1px, transparent 1px), linear-gradient(90deg, rgb(var(--color-border) / .6) 1px, transparent 1px);background-size:22px 22px}button,input,textarea,select{font:inherit}*{scrollbar-width:thin;scrollbar-color:rgb(var(--color-border)) transparent}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background-color:rgb(var(--color-border));background-clip:padding-box;border:3px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--color-muted))}::-webkit-scrollbar-corner{background:0 0}.custom-scrollbar{scrollbar-width:thin;scrollbar-color:rgb(var(--color-border)) transparent}.custom-scrollbar::-webkit-scrollbar{width:10px;height:10px}.custom-scrollbar::-webkit-scrollbar-track{background:0 0}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:rgb(var(--color-border));background-clip:padding-box;border:3px solid #0000;border-radius:999px}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--color-muted))}.scrollbar-thin-x{scrollbar-width:auto;scrollbar-color:auto}.scrollbar-thin-x::-webkit-scrollbar{width:6px;height:6px}.scrollbar-thin-x::-webkit-scrollbar-track{background:0 0}.scrollbar-thin-x::-webkit-scrollbar-thumb{background-clip:border-box;background-color:rgb(var(--color-muted) / .45);border:0;border-radius:999px}.scrollbar-thin-x::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--color-muted) / .75)}@supports not selector(::-webkit-scrollbar){.scrollbar-thin-x{scrollbar-width:thin;scrollbar-color:rgb(var(--color-border)) transparent}}.scrollbar-none{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-none::-webkit-scrollbar{display:none}::selection{background-color:rgb(var(--color-accent-blue) / .18)}:focus-visible{outline:2px solid rgb(var(--color-accent-blue) / .7);outline-offset:1px}.btn{-webkit-user-select:none;user-select:none;border-radius:var(--radius-lg);justify-content:center;align-items:center;gap:.5rem;padding:.5rem .875rem;font-size:.875rem;font-weight:500;line-height:1.25rem;transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-flex}.btn:active{--tw-scale-x:.98;--tw-scale-y:.98;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:disabled{cursor:not-allowed;opacity:.4}.btn-primary{--tw-bg-opacity:1;background-color:rgb(var(--color-text) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-bg) / var(--tw-text-opacity,1));--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.btn-primary:hover{opacity:.85}.btn-accent{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-blue) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-accent-fg) / var(--tw-text-opacity,1));--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.btn-accent:hover{opacity:.9}.btn-secondary{--tw-border-opacity:1;border-width:1px;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.btn-secondary:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1))}.btn-ghost{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1))}.btn-ghost:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.btn-danger{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-red) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-accent-fg) / var(--tw-text-opacity,1));--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.btn-danger:hover{opacity:.9}.btn-sm{border-radius:var(--radius-md);gap:.375rem;padding:.25rem .625rem;font-size:.75rem;line-height:1rem}.btn-lg{gap:.625rem;padding:.625rem 1.25rem;font-size:1rem;line-height:1.5rem}.btn-pill{border-radius:9999px}.input{border-radius:var(--radius-lg);--tw-border-opacity:1;border-width:1px;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1));--tw-text-opacity:1;width:100%;color:rgb(var(--color-text) / var(--tw-text-opacity,1));padding:.625rem .875rem;font-size:.875rem;line-height:1.25rem}.input::placeholder{color:rgb(var(--color-muted) / .7)}.input{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.input:focus{border-color:rgb(var(--color-accent-blue) / .6);outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000);--tw-ring-color:rgb(var(--color-accent-blue) / .15);outline:2px solid #0000}.card,.panel-surface{border-radius:var(--radius-xl);--tw-border-opacity:1;border-width:1px;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1));--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.paper-surface{background:rgb(var(--color-bg) / .85);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.app-shell{background-color:rgb(var(--color-bg))}@media (width>=768px){.app-shell{grid-template-columns:var(--ui-sidebar-width) minmax(0, 1fr);transition:grid-template-columns .2s ease-in-out;display:grid}.app-shell[data-sidebar-collapsed=true]{grid-template-columns:var(--ui-sidebar-rail) minmax(0, 1fr)}.app-shell[data-sidebar-maximized=true]{grid-template-columns:0 minmax(0,1fr)}.app-shell[data-sidebar-resizing=true]{transition:none}}.workbench-frame{border:1px solid rgb(var(--color-border));background:rgb(var(--color-bg) / .85);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.mimo-tab{border-radius:var(--radius-lg);border-width:1px;border-color:#0000;align-items:center;gap:.5rem;padding:.375rem .75rem;font-size:.875rem;line-height:1.25rem;transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-flex}.mimo-tab[data-active=true]{--tw-border-opacity:1;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.mimo-tab[data-active=false]{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1))}.mimo-tab[data-active=false]:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.side-nav-item{-webkit-user-select:none;user-select:none;border-radius:var(--radius-lg);align-items:center;gap:.625rem;width:100%;padding:.5rem .625rem;font-size:13px;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.1s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:flex;position:relative}.side-nav-item[data-active=true]{background-color:rgb(var(--color-accent-blue) / .1);--tw-text-opacity:1;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1))}.side-nav-item[data-active=false]{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1))}.side-nav-item[data-active=false]:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.side-nav-item[data-active=true]:before{content:"";background:rgb(var(--color-accent-blue));border-radius:999px;width:3px;height:16px;position:absolute;top:50%;left:-10px;transform:translateY(-50%)}.side-group-label{-webkit-user-select:none;user-select:none;text-transform:uppercase;letter-spacing:.08em;color:rgb(var(--color-muted) / .7);padding:1rem .625rem .25rem;font-size:11px;font-weight:600}.section-title{letter-spacing:.025em;--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:.875rem;font-weight:600;line-height:1.25rem}.subtle-label{text-transform:uppercase;letter-spacing:.18em;--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1));font-size:11px}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes slideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes slideInRight{0%{opacity:0;transform:translate(16px)}to{opacity:1;transform:translate(0)}}@keyframes pulse-soft{0%,to{opacity:1}50%{opacity:.72}}@keyframes blink{0%,to{opacity:1}50%{opacity:.35}}@keyframes pixel-run{0%,49.9%{opacity:1}50%,to{opacity:.18}}.pixel-spinner{vertical-align:middle;grid-template-rows:repeat(2,3px);grid-template-columns:repeat(2,3px);gap:2px;display:inline-grid}.pixel-spinner>span{background:currentColor;width:3px;height:3px;animation:.8s linear infinite pixel-run}.pixel-spinner>span:first-child{animation-delay:0s}.pixel-spinner>span:nth-child(2){animation-delay:.2s}.pixel-spinner>span:nth-child(4){animation-delay:.4s}.pixel-spinner>span:nth-child(3){animation-delay:.6s}.pixel-grid{vertical-align:middle;grid-template-rows:repeat(2,3px);grid-template-columns:repeat(2,3px);gap:2px;display:inline-grid}.pixel-grid>span{background:currentColor;width:3px;height:3px}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes slideUp{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes marquee-pingpong{0%,10%{transform:translate(0)}50%,60%{transform:translateX(var(--marquee-shift,0px))}to{transform:translate(0)}}.marquee-track{animation-name:marquee-pingpong;animation-duration:var(--marquee-dur,8s);will-change:transform;animation-timing-function:linear;animation-iteration-count:infinite}@media (prefers-reduced-motion:reduce){.marquee-track{animation:none}}@keyframes slideUpSheet{0%{opacity:.4;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.animate-fade-in{animation:.3s ease-out fadeIn}.animate-slide-up-sheet{animation:.26s cubic-bezier(.22,1,.36,1) slideUpSheet}.animate-slide-up{animation:.28s cubic-bezier(.22,1,.36,1) slideUp}.animate-slide-in{animation:.3s ease-out slideIn}.animate-slide-in-right{animation:.3s ease-out slideInRight}@keyframes slideOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(16px)}}.animate-slide-out{animation:.18s ease-in forwards slideOut}.ui-overlay-backdrop,.ui-overlay-panel,.ui-overlay-panel-edge,.ui-overlay-panel-sheet,.ui-overlay-panel-fade{animation-fill-mode:both}.ui-scrim{background-color:var(--ui-scrim)}.ui-surface-overlay{--color-border:var(--color-overlay-border);--color-hover:var(--color-overlay-hover);--color-raised:var(--color-overlay-hover)}.ui-overlay-backdrop{animation-duration:var(--dur-base);animation-timing-function:var(--ease-expo)}.ui-overlay-panel,.ui-overlay-panel-edge,.ui-overlay-panel-sheet{animation-duration:var(--dur-sheet);animation-timing-function:var(--ease-decel)}.ui-overlay-panel-fade{animation-duration:var(--dur-base);animation-timing-function:var(--ease-expo)}.ui-overlay-backdrop[data-phase=exit],.ui-overlay-panel[data-phase=exit],.ui-overlay-panel-edge[data-phase=exit],.ui-overlay-panel-sheet[data-phase=exit],.ui-overlay-panel-fade[data-phase=exit]{animation-duration:var(--dur-base);animation-timing-function:var(--ease-expo);pointer-events:none}.ui-overlay-backdrop[data-phase=enter]{animation-name:overlayScrimIn}.ui-overlay-backdrop[data-phase=exit]{animation-name:overlayScrimOut}.ui-overlay-panel[data-phase=enter]{animation-name:overlayPanelIn}.ui-overlay-panel[data-phase=exit]{animation-name:overlayPanelOut}.ui-overlay-panel-edge[data-phase=enter]{animation-name:overlayPanelEdgeIn}.ui-overlay-panel-edge[data-phase=exit]{animation-name:overlayPanelEdgeOut}.ui-overlay-panel-sheet[data-phase=enter]{animation-name:overlaySheetIn}.ui-overlay-panel-sheet[data-phase=exit]{animation-name:overlaySheetOut}.ui-overlay-panel-fade[data-phase=enter]{animation-name:overlayPanelFadeIn}.ui-overlay-panel-fade[data-phase=exit]{animation-name:overlayPanelFadeOut}@keyframes overlayScrimIn{0%{opacity:0}to{opacity:1}}@keyframes overlayScrimOut{0%{opacity:1}to{opacity:0;visibility:hidden}}@keyframes overlayPanelIn{0%{opacity:0;transform:translateY(8px)scale(.97)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes overlayPanelOut{0%{opacity:1;transform:translateY(0)scale(1)}to{opacity:0;visibility:hidden;transform:translateY(4px)scale(.985)}}@keyframes overlayPanelEdgeIn{0%{opacity:0;transform:translate(16px)}to{opacity:1;transform:translate(0)}}@keyframes overlayPanelEdgeOut{0%{opacity:1;transform:translate(0)}to{opacity:0;visibility:hidden;transform:translate(16px)}}@keyframes overlaySheetIn{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlaySheetOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;visibility:hidden;transform:translateY(100%)}}@keyframes overlayPanelFadeIn{0%{opacity:0}to{opacity:1}}@keyframes overlayPanelFadeOut{0%{opacity:1}to{opacity:0;visibility:hidden}}.animate-pulse-soft{animation:2s ease-in-out infinite pulse-soft}.animate-blink{animation:1s infinite blink}@keyframes railFlash{0%{background-color:rgb(var(--color-accent-blue) / .16);box-shadow:inset 2px 0 0 0 rgb(var(--color-accent-blue) / .6);opacity:1}55%{background-color:rgb(var(--color-accent-blue) / .1)}to{opacity:0;background-color:#0000;box-shadow:inset 2px 0 #0000}}.animate-rail-flash{border-radius:.5rem;animation:1.6s cubic-bezier(.22,1,.36,1) forwards railFlash}.animate-spin{animation:1s linear infinite spin}.skeleton-shimmer{background-image:linear-gradient(90deg, rgb(var(--color-border) / .34) 25%, rgb(var(--color-muted) / .18) 37%, rgb(var(--color-border) / .34) 63%);background-size:200% 100%;animation:1.4s ease-in-out infinite shimmer}@keyframes install-sweep{0%{transform:translate(-100%)}to{transform:translate(400%)}}.install-progress-track{background-color:rgb(var(--color-border) / .45);position:relative;overflow:hidden}.install-progress-track:after{content:"";inset-block:0;background:linear-gradient(90deg, rgb(var(--color-accent-blue) / 0), rgb(var(--color-accent-blue) / .9), rgb(var(--color-accent-blue) / 0));border-radius:9999px;width:25%;animation:1.1s cubic-bezier(.4,0,.2,1) infinite install-sweep;position:absolute;left:0}@media (prefers-reduced-motion:reduce){.install-progress-track:after{opacity:.5;width:100%;animation:none}}@keyframes compact-sheen{0%{transform:translate(-100%)}to{transform:translate(320%)}}.animate-compact-sheen{animation:1.5s cubic-bezier(.4,0,.2,1) infinite compact-sheen}.compact-progress-fill{transition:width var(--dur-slow) var(--ease-decel)}@keyframes compact-stripes{0%{transform:translate(0)}to{transform:translate(-16px)}}.compact-stripes{background-image:repeating-linear-gradient(115deg,#ffffff29 0 6px,#0000 6px 16px);animation:.9s linear infinite compact-stripes}@keyframes compact-live-dot{0%,to{opacity:.35;transform:scale(.85)}50%{opacity:1;transform:scale(1.15)}}.compact-live-dot{animation:compact-live-dot 1.4s var(--ease-standard,ease-in-out) infinite}.compact-bar-collapse{transition:width .7s var(--ease-decel)}@media (prefers-reduced-motion:reduce){.animate-compact-sheen{opacity:0;animation:none}.compact-stripes{background-image:none;animation:none}.compact-live-dot{opacity:.8;animation:none}.compact-bar-collapse{transition:none}}.markdown-content{white-space:normal;word-break:break-word}.markdown-content h1{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));margin-top:1rem;margin-bottom:.5rem;font-size:1.5rem;font-weight:700;line-height:2rem}.markdown-content h2{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));margin-top:1rem;margin-bottom:.5rem;font-size:1.25rem;font-weight:600;line-height:1.75rem}.markdown-content h3{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));margin-top:.75rem;margin-bottom:.5rem;font-size:1.125rem;font-weight:600;line-height:1.75rem}.markdown-content p{margin-top:.5rem;margin-bottom:.5rem}.markdown-content ul,.markdown-content ol{margin-top:.5rem;margin-bottom:.5rem;padding-left:1.5rem}.markdown-content li{margin-top:.25rem;margin-bottom:.25rem}.markdown-content code{border-radius:var(--radius-md);--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1));padding:.125rem .375rem;font-family:SF Mono,Monaco,Menlo,Consolas,monospace;font-size:.85em}.markdown-content pre{border-radius:var(--radius-xl);--tw-border-opacity:1;border-width:1px;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(var(--color-surface) / var(--tw-bg-opacity,1));margin-top:.75rem;margin-bottom:.75rem;padding:.875rem;overflow-x:auto}.markdown-content pre code{background-color:#0000;padding:0}.markdown-content blockquote{border-inline-start-width:3px;border-color:rgb(var(--color-accent-blue) / .4);--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1));margin-top:.75rem;margin-bottom:.75rem;padding-inline-start:1rem}.markdown-content a{--tw-text-opacity:1;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1));text-decoration-line:underline;-webkit-text-decoration-color:rgb(var(--color-accent-blue) / .3);text-decoration-color:rgb(var(--color-accent-blue) / .3);text-underline-offset:2px}.markdown-content a:hover{-webkit-text-decoration-color:rgb(var(--color-accent-blue) / .6);text-decoration-color:rgb(var(--color-accent-blue) / .6)}.markdown-content table{border-collapse:collapse;border-radius:var(--radius-lg);width:100%;margin-top:.75rem;margin-bottom:.75rem;overflow:hidden}.markdown-content th,.markdown-content td{--tw-border-opacity:1;border-width:1px;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));text-align:left;padding:.5rem .75rem}.markdown-content th{--tw-bg-opacity:1;background-color:rgb(var(--color-surface) / var(--tw-bg-opacity,1));font-weight:600}code[class*=language-],pre[class*=language-]{font-family:SF Mono,Monaco,Menlo,Consolas,monospace;font-size:.875rem;line-height:1.25rem}.token.comment,.token.prolog,.token.doctype,.token.cdata{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1))}.token.punctuation{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{--tw-text-opacity:1;color:rgb(var(--color-accent-red) / var(--tw-text-opacity,1))}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{--tw-text-opacity:1;color:rgb(var(--color-accent-green) / var(--tw-text-opacity,1))}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{--tw-text-opacity:1;color:rgb(var(--color-accent-yellow) / var(--tw-text-opacity,1))}.token.atrule,.token.attr-value,.token.keyword{--tw-text-opacity:1;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1))}.token.function,.token.class-name{color:rgb(var(--color-accent-purple))}.token.regex,.token.important,.token.variable{--tw-text-opacity:1;color:rgb(var(--color-accent-yellow) / var(--tw-text-opacity,1))}.chat-stack{width:100%;margin-left:auto;margin-right:auto;padding-left:1rem;padding-right:1rem}@media (width>=640px){.chat-stack{padding-left:1.5rem;padding-right:1.5rem}}.chat-stack{max-width:var(--chat-col-width)}.chat-col{width:100%;max-width:var(--chat-col-width);margin-left:auto;margin-right:auto}.chat-drawer-col{box-sizing:border-box;width:100%;max-width:calc(var(--chat-col-width) + 2 * var(--composer-gutter));padding-inline:var(--composer-gutter);margin-left:auto;margin-right:auto}.start-col{width:100%;max-width:var(--start-col-width);margin-left:auto;margin-right:auto}.chat-msg{align-items:flex-start;gap:.75rem;width:100%;animation:.4s ease-out fadeInUp;display:flex}.chat-msg[data-role=user]{flex-direction:row-reverse}.chat-msg[data-role=system]{justify-content:center}.chat-card{border-radius:var(--radius-xl);background-color:rgb(var(--color-surface) / .6);min-width:0;box-shadow:var(--shadow-air-1);flex:1;padding:1rem 1.25rem 2.25rem}.chat-avatar{--tw-border-opacity:1;border-width:1px;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1));--tw-text-opacity:1;width:2rem;height:2rem;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1));border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;margin-top:.125rem;display:flex}.chat-avatar[data-status=running]:after{content:"";position:absolute}.chat-msg[data-role=user]>.chat-avatar{border-color:rgb(var(--color-border) / .5);background-color:rgb(var(--color-accent-blue) / .1);--tw-text-opacity:1;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1))}.chat-card .markdown-content{font-size:14.5px;line-height:1.625}.chat-card .markdown-content>:first-child{margin-top:0}.chat-card .markdown-content>:last-child{margin-bottom:0}@keyframes typing-dots{0%,60%,to{opacity:.3;transform:translateY(0)}30%{opacity:1;transform:translateY(-2px)}}.chat-typing-dots{align-items:center;gap:.25rem;display:inline-flex}.chat-typing-dots>span{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-blue) / var(--tw-bg-opacity,1));border-radius:9999px;width:.375rem;height:.375rem;animation:1.2s ease-in-out infinite typing-dots}.chat-typing-dots>span:nth-child(2){animation-delay:.15s}.chat-typing-dots>span:nth-child(3){animation-delay:.3s}:root{--ui-sidebar-width:17.5rem;--ui-sidebar-rail:3.5rem;--ui-content-max:52rem;--ui-control-height:2.25rem;--ui-focus-ring:0 0 0 4px rgb(var(--color-accent-blue) / .12);--ui-panel-glow:0 18px 50px #00000014;--chat-col-width:min(100%, 62rem);--composer-gutter:clamp(1.5rem, 4%, 5rem);--start-col-width:44rem}@media (width>=1024px){:root{--start-col-width:52rem}}@media (width>=1280px){:root{--start-col-width:58rem}}@media (width>=1600px){:root{--start-col-width:64rem}}.ui-page{scrollbar-width:thin;scrollbar-color:rgb(var(--color-border)) transparent;height:100%;min-height:0;overflow-y:auto}.ui-page::-webkit-scrollbar{width:10px;height:10px}.ui-page::-webkit-scrollbar-track{background:0 0}.ui-page::-webkit-scrollbar-thumb{background-color:rgb(var(--color-border));background-clip:padding-box;border:3px solid #0000;border-radius:999px}.ui-page::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--color-muted))}.ui-page{background-color:rgb(var(--color-bg))}.ui-page-inner{width:100%;max-width:84rem;margin-left:auto;margin-right:auto;padding:1.25rem 1rem}@media (width>=640px){.ui-page-inner{padding-left:1.5rem;padding-right:1.5rem}}@media (width>=1024px){.ui-page-inner{padding-left:2rem;padding-right:2rem}}.ui-page-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1.25rem;display:flex}.ui-page-title{letter-spacing:-.02em;--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:1.25rem;font-weight:600;line-height:1.75rem}@media (width>=640px){.ui-page-title{font-size:1.5rem;line-height:2rem}}.ui-page-subtitle{--tw-text-opacity:1;max-width:42rem;color:rgb(var(--color-muted) / var(--tw-text-opacity,1));margin-top:.25rem;font-size:.875rem;line-height:1.5rem}.ui-section{border-radius:var(--radius-xl);border-width:1px;border-color:rgb(var(--color-border) / .7);background-color:rgb(var(--color-surface) / .45);padding:1rem}@media (width>=640px){.ui-section{padding:1.25rem}}.ui-section{box-shadow:var(--shadow-air-1)}.ui-section-title{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;line-height:1.25rem;display:flex}.ui-section-kicker{text-transform:uppercase;letter-spacing:.16em;color:rgb(var(--color-muted) / .7);font-size:10px;font-weight:600}.ui-card{border-radius:var(--radius-xl);border-width:1px;border-color:rgb(var(--color-border) / .7);background-color:rgb(var(--color-surface) / .65);transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ui-card-interactive{cursor:pointer;border-radius:var(--radius-xl);border-width:1px;border-color:rgb(var(--color-border) / .7);background-color:rgb(var(--color-surface) / .65);transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ui-card-interactive:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:rgb(var(--color-accent-blue) / .4);background-color:rgb(var(--color-hover) / .6);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.ui-card-interactive[data-active=true],.ui-card[data-selected=true]{border-color:rgb(var(--color-accent-blue) / .6);background-color:rgb(var(--color-accent-blue) / .1);box-shadow:inset 3px 0 0 rgb(var(--color-accent-blue))}.ui-input{border-radius:var(--radius-xl);--tw-border-opacity:1;border-width:1px;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1));--tw-text-opacity:1;width:100%;color:rgb(var(--color-text) / var(--tw-text-opacity,1));padding:.625rem .875rem;font-size:.875rem;line-height:1.25rem}.ui-input::placeholder{color:rgb(var(--color-muted) / .6)}.ui-input{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ui-input:focus{border-color:rgb(var(--color-accent-blue) / .6);outline-offset:2px;box-shadow:var(--ui-focus-ring);outline:2px solid #0000}.ui-icon-button{border-radius:var(--radius-lg);--tw-text-opacity:1;width:2.25rem;height:2.25rem;color:rgb(var(--color-muted) / var(--tw-text-opacity,1));justify-content:center;align-items:center;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-flex}.ui-icon-button:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.ui-icon-button:disabled{cursor:not-allowed;opacity:.4}.ui-icon-button[data-active=true]{background-color:rgb(var(--color-accent-blue) / .1);--tw-text-opacity:1;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1))}.ui-divider{border-color:rgb(var(--color-border) / .6)}.ui-empty-state{border-radius:var(--radius-xl);--tw-border-opacity:1;border-style:dashed;border-width:1px;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1));background-color:rgb(var(--color-surface) / .35);text-align:center;padding:2.5rem 1.5rem}.ui-status-dot{border-radius:9999px;width:.5rem;height:.5rem;display:inline-block}.ui-status-dot[data-status=online]{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-green) / var(--tw-bg-opacity,1))}.ui-status-dot[data-status=busy]{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-yellow) / var(--tw-bg-opacity,1));animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}.ui-status-dot[data-status=error]{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-red) / var(--tw-bg-opacity,1))}.ui-status-dot[data-status=offline]{background-color:rgb(var(--color-muted) / .5)}.workbench-sidebar{background-color:rgb(var(--color-bg));background-color:color-mix(in oklab, rgb(var(--color-bg)), #000 12%);box-shadow:inset -1px 0 0 rgb(var(--color-border) / .7)}.workbench-sidebar .side-nav-item{border-radius:var(--radius-lg);transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);position:relative}.workbench-sidebar .side-nav-item[data-active=true]{background-color:rgb(var(--color-accent-blue) / .1);--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));box-shadow:inset 2px 0 0 rgb(var(--color-accent-blue))}.workbench-sidebar .side-nav-item[data-active=true]:after{content:"";--tw-bg-opacity:1;background-color:rgb(var(--color-accent-blue) / var(--tw-bg-opacity,1));border-radius:9999px;width:.375rem;height:.375rem;position:absolute;inset-inline-end:.5rem}.side-rail-tile{border-radius:var(--radius-xl);color:rgb(var(--color-muted));transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);position:relative}.side-rail-tile[data-status=waiting]{background:rgb(var(--color-accent-yellow) / .13)}.side-rail-tile[data-status=running]{background:rgb(var(--color-accent-blue) / .08)}.side-rail-tile[data-status=failed]{background:rgb(var(--color-accent-red) / .1)}.side-rail-tile[data-status=done]{opacity:.55}.side-rail-tile:hover,.side-rail-tile[data-status=done]:hover{background:rgb(var(--color-hover));opacity:1;color:rgb(var(--color-text))}.side-rail-tile[data-active=true]{background:rgb(var(--color-hover));box-shadow:inset 0 0 0 1px rgb(var(--color-accent-blue) / .45)}.side-rail-tile[data-needs-input]:before{content:"";inset-inline-start:-4px;border-radius:999px;width:2px;height:14px;position:absolute;top:50%;translate:0 -50%}.side-rail-tile[data-needs-input=approval]:before{background:rgb(var(--color-accent-yellow));animation:2s ease-in-out infinite railWaitingFlag}.side-rail-tile[data-needs-input=question]:before{background:rgb(var(--color-accent-blue))}@keyframes railWaitingFlag{0%,to{opacity:.4}50%{opacity:1}}.side-rail-switch{cursor:pointer;transition:color .15s}.side-rail-switch-track{background:rgb(var(--color-hover) / .7);box-shadow:inset 0 0 0 1px rgb(var(--color-border) / .8);transition:background-color .16s,box-shadow .16s}.side-rail-switch-knob{background:rgb(var(--color-text) / .16);color:rgb(var(--color-text));transition:transform .18s cubic-bezier(.4,0,.2,1),background-color .16s,color .16s;inset-block-start:3px;inset-inline-start:3px;box-shadow:0 1px 2px #00000059}.side-rail-switch[data-on=true] .side-rail-switch-knob{transform:translate(16px)}[dir=rtl] .side-rail-switch[data-on=true] .side-rail-switch-knob{transform:translate(-16px)}.side-rail-switch:hover,.side-rail-switch:focus-visible{color:rgb(var(--color-accent-blue))}.side-rail-switch:hover .side-rail-switch-track,.side-rail-switch:focus-visible .side-rail-switch-track{background:rgb(var(--color-accent-blue) / .18);box-shadow:inset 0 0 0 1px rgb(var(--color-accent-blue) / .45)}.side-rail-switch:hover .side-rail-switch-knob,.side-rail-switch:focus-visible .side-rail-switch-knob{background:rgb(var(--color-accent-blue));color:rgb(var(--color-accent-fg));transform:translate(16px)}[dir=rtl] .side-rail-switch:hover .side-rail-switch-knob,[dir=rtl] .side-rail-switch:focus-visible .side-rail-switch-knob{transform:translate(-16px)}.rail-ring{pointer-events:none;width:0;height:0}.rail-ring-btn{inset-inline-start:0;pointer-events:auto;width:19px;height:19px;transform:translate(-50%, -50%) translate(var(--rail-ring-x), var(--rail-ring-y));border-radius:999px;animation:.14s cubic-bezier(.34,1.36,.64,1) backwards railRingIn;position:absolute;top:0}@keyframes railRingIn{0%{opacity:0;scale:.5}to{opacity:1;scale:1}}.rail-bubble{animation:.16s ease-out railBubbleIn}@keyframes railBubbleIn{0%{opacity:0;transform:translate(-6px)}to{opacity:1;transform:translate(0)}}.rail-bubble-countdown{background:rgb(var(--color-accent-blue) / .6);height:2px;transition:width 1s linear;display:block}@media (prefers-reduced-motion:reduce){.side-rail-tile[data-needs-input]:before,.rail-ring-btn,.rail-bubble{animation:none}.rail-bubble-countdown{transition:none}}.chat-workspace{background-color:rgb(var(--color-bg))}.chat-toolbar{z-index:10;-webkit-user-select:none;user-select:none;flex-shrink:0;position:relative}.chat-toolbar-meta{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1));align-items:center;gap:.375rem;font-size:11px;display:none}@media (width>=640px){.chat-toolbar-meta{display:flex}}.chat-composer-shell{background-image:linear-gradient(to top, var(--tw-gradient-stops));--tw-gradient-from:rgb(var(--color-bg) / 1) var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), rgb(var(--color-bg) / .95) var(--tw-gradient-via-position), var(--tw-gradient-to);padding-inline:var(--composer-gutter)}.chat-composer-card{border-color:rgb(var(--color-border) / .8);background-color:rgb(var(--color-surface) / .9);--tw-backdrop-blur:blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);box-shadow:var(--shadow-air-1)}.chat-composer-card:focus-within{border-color:rgb(var(--color-accent-blue) / .55);box-shadow:var(--ui-focus-ring), var(--shadow-air-2)}.chat-empty-orb{border-radius:var(--radius-2xl);border-width:1px;border-color:rgb(var(--color-accent-blue) / .2);background-color:rgb(var(--color-accent-blue) / .1);width:4rem;height:4rem;box-shadow:0 0 0 8px rgb(var(--color-accent-blue) / .035), 0 12px 35px rgb(var(--color-accent-blue) / .12);justify-content:center;align-items:center;margin-bottom:1.25rem;margin-left:auto;margin-right:auto;display:flex;position:relative}.chat-empty-orb:before{content:"";border-width:1px;border-color:rgb(var(--color-accent-blue) / .1);border-radius:1.25rem;position:absolute;inset:-8px}.chat-message-actions{opacity:0;transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.chat-msg:hover .chat-message-actions,.chat-msg:focus-within .chat-message-actions{opacity:1}.text-shimmer{background:linear-gradient(90deg, rgb(var(--color-muted) / .75) 0%, rgb(var(--color-muted) / .75) 38%, rgb(var(--color-text)) 50%, rgb(var(--color-muted) / .75) 62%, rgb(var(--color-muted) / .75) 100%);color:#0000;background-size:200% 100%;-webkit-background-clip:text;background-clip:text;animation:2.2s linear infinite shimmer}.rate-spinner{flex-shrink:0;display:inline-block;position:relative}.rate-spinner[data-accent=blue]{--rs-mid:59 130 246;--rs-head:126 165 252}.rate-spinner[data-accent=purple]{--rs-mid:139 92 246;--rs-head:196 140 250}.rs-arc{border:var(--rs-stroke,1.4px) solid transparent;border-radius:50%;position:absolute;inset:0}.rs-arc--a{border-top-color:rgb(var(--rs-head));animation:rs-spin var(--rs-dur,2.2s) linear infinite}.rs-arc--b{border-bottom-color:rgb(var(--rs-mid));animation:rs-spin-rev var(--rs-dur,2.2s) linear infinite}@keyframes rs-spin{to{transform:rotate(360deg)}}@keyframes rs-spin-rev{to{transform:rotate(-360deg)}}@media (prefers-reduced-motion:reduce){.rs-arc{animation:none}}.tl-row{position:relative}.tl-line{background:linear-gradient(to bottom, rgb(var(--color-muted) / .28), rgb(var(--color-muted) / .14));pointer-events:none;width:1px;position:absolute;top:24px;bottom:-2px;left:14px}.tl-node{border-radius:9999px;flex-shrink:0;width:.5rem;height:.5rem;display:inline-block;position:relative}.tl-node[data-status=pending]{background-color:rgb(var(--color-muted) / .35)}.tl-node[data-status=success]{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-green) / var(--tw-bg-opacity,1))}.tl-node[data-status=warning]{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-yellow) / var(--tw-bg-opacity,1))}.tl-node[data-status=error]{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-red) / var(--tw-bg-opacity,1));animation:.4s cubic-bezier(.36,.07,.19,.97) both tl-shake}.tl-node[data-status=running]{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-blue) / var(--tw-bg-opacity,1))}.tl-node[data-status=running]:after{content:"";border:1.5px solid rgb(var(--color-accent-blue) / .5);border-radius:9999px;animation:1.6s ease-out infinite tl-pulse;position:absolute;inset:-3px}.tv-pre{white-space:pre-wrap;word-break:break-all;padding:.5rem;font-family:SF Mono,Monaco,Menlo,Consolas,monospace;font-size:11px}@keyframes tl-pulse{0%{opacity:1;transform:scale(.55)}70%,to{opacity:0;transform:scale(1.7)}}@keyframes tl-shake{10%,90%{transform:translate(-1px)}20%,80%{transform:translate(2px)}30%,50%,70%{transform:translate(-3px)}40%,60%{transform:translate(3px)}}.status-pill{white-space:nowrap;border-radius:9999px;align-items:center;gap:.25rem;padding:.125rem .5rem;font-size:11px;font-weight:500;line-height:1;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-flex}.status-pill[data-tone=brand]{background:rgb(var(--color-accent-blue) / .1);color:rgb(var(--color-accent-blue))}.status-pill[data-tone=green]{background:rgb(var(--color-accent-green) / .1);color:rgb(var(--color-accent-green))}.status-pill[data-tone=yellow]{background:rgb(var(--color-accent-yellow) / .12);color:rgb(var(--color-accent-yellow))}.status-pill[data-tone=purple]{background:rgb(var(--color-accent-purple) / .1);color:rgb(var(--color-accent-purple))}.status-pill[data-tone=red]{background:rgb(var(--color-accent-red) / .1);color:rgb(var(--color-accent-red))}.status-pill[data-tone=neutral]{background:rgb(var(--color-muted) / .1);color:rgb(var(--color-muted))}.toast-card{border-radius:var(--radius-xl);background:rgb(var(--color-surface) / .92);border-width:1px;border-color:rgb(var(--color-border));box-shadow:var(--shadow-air-2);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);align-items:flex-start;gap:.625rem;padding:.625rem .75rem;display:flex}.toast-card-count{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);background:rgb(var(--color-muted) / .14);color:rgb(var(--color-text));border-radius:9999px;flex-shrink:0;margin-inline-start:.125rem;padding:1px .375rem;font-size:10px;font-weight:600}@media (width<=767px){.ui-page-inner{padding:1rem .75rem}.ui-section{border-radius:var(--radius-xl);padding:.875rem}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}:root{--ui-eyebrow-tracking:.08em}.ui-eyebrow{text-transform:uppercase;letter-spacing:var(--ui-eyebrow-tracking);color:rgb(var(--color-muted));font-size:.75rem;font-weight:600;line-height:1rem}.ui-ink-faint{color:rgb(var(--color-muted) / .6)}.ui-gram{border-left:2px solid var(--ui-state-edge,transparent);transition:background-color .24s,border-color .24s}.ui-gram--wash{background-color:var(--ui-state-bg,transparent)}.ui-state-draft{--ui-state-bg:rgb(var(--color-accent-blue) / .06);--ui-state-edge:rgb(var(--color-accent-blue) / .4);color:rgb(var(--color-text) / .9)}.ui-state-committed{--ui-state-bg:transparent;--ui-state-edge:rgb(var(--color-border))}.ui-state-verified{--ui-state-bg:rgb(var(--color-accent-green) / .08);--ui-state-edge:rgb(var(--color-accent-green))}.ui-state-failed{--ui-state-bg:rgb(var(--color-accent-red) / .08);--ui-state-edge:rgb(var(--color-accent-red))}.ui-state-erased{--ui-state-bg:transparent;--ui-state-edge:rgb(var(--color-border))}.ui-state-erased,.ui-state-erased *{color:rgb(var(--color-muted) / .6)}.ui-gram--flat{border-left-width:0}.ui-fold{grid-template-rows:1fr;transition:grid-template-rows .36s;display:grid}.ui-fold>*{min-height:0;overflow:hidden}.ui-fold[data-collapsed=true]{grid-template-rows:0fr}.status-dot{background:rgb(var(--color-muted));width:7px;height:7px;box-shadow:0 0 0 3px rgb(var(--color-muted) / .14);border-radius:9999px;flex:none;display:inline-block}.status-dot[data-tone=working]{background:rgb(var(--status-working));box-shadow:0 0 0 3px rgb(var(--status-working) / .16)}.status-dot[data-tone=waiting]{background:rgb(var(--color-accent-yellow));box-shadow:0 0 0 3px rgb(var(--color-accent-yellow) / .16)}.status-dot[data-tone=review]{background:rgb(var(--color-accent-green));box-shadow:0 0 0 3px rgb(var(--color-accent-green) / .16)}.status-dot[data-live=true]{animation:2s ease-in-out infinite statusPulse}@keyframes statusPulse{0%,to{opacity:1}50%{opacity:.4}}.card-lift{transition:transform .18s,border-color .18s,background-color .18s}.card-lift:hover{transform:translateY(-1px)}@media (prefers-reduced-motion:reduce){.status-dot[data-live=true]{animation:none}.card-lift,.card-lift:hover{transition:none;transform:none}}.mobile-tab-bar{display:none}@media (width<=767px) and (orientation:portrait){.mobile-tab-bar{display:block}.mobile-tab-bar-gutter{padding-bottom:calc(var(--mobile-tab-bar-h,3.5rem) + env(safe-area-inset-bottom,0px))}}.viz-carousel{scroll-snap-type:x mandatory;scroll-behavior:smooth;scrollbar-width:none;overscroll-behavior-x:contain;gap:.625rem;padding-block:.25rem .375rem;display:flex;overflow-x:auto}.viz-carousel::-webkit-scrollbar{display:none}.viz-carousel>*{scroll-snap-align:start;scroll-snap-stop:always;flex:none;width:clamp(11rem,30%,15rem)}.viz-carousel{--viz-fade:2.5rem}.viz-carousel[data-fade=right]{-webkit-mask-image:linear-gradient(to right, #000 0, #000 calc(100% - var(--viz-fade)), #000000d9 calc(100% - var(--viz-fade) * .87), #000000b3 calc(100% - var(--viz-fade) * .75), #00000080 calc(100% - var(--viz-fade) * .6), #0000004d calc(100% - var(--viz-fade) * .45), #00000026 calc(100% - var(--viz-fade) * .3), #0000000d calc(100% - var(--viz-fade) * .15), transparent calc(100% + 1px));-webkit-mask-image:linear-gradient(to right, #000 0, #000 calc(100% - var(--viz-fade)), #000000d9 calc(100% - var(--viz-fade) * .87), #000000b3 calc(100% - var(--viz-fade) * .75), #00000080 calc(100% - var(--viz-fade) * .6), #0000004d calc(100% - var(--viz-fade) * .45), #00000026 calc(100% - var(--viz-fade) * .3), #0000000d calc(100% - var(--viz-fade) * .15), transparent calc(100% + 1px));mask-image:linear-gradient(to right, #000 0, #000 calc(100% - var(--viz-fade)), #000000d9 calc(100% - var(--viz-fade) * .87), #000000b3 calc(100% - var(--viz-fade) * .75), #00000080 calc(100% - var(--viz-fade) * .6), #0000004d calc(100% - var(--viz-fade) * .45), #00000026 calc(100% - var(--viz-fade) * .3), #0000000d calc(100% - var(--viz-fade) * .15), transparent calc(100% + 1px))}.viz-carousel[data-fade=left]{-webkit-mask-image:linear-gradient(to right, transparent -1px, #0000000d calc(var(--viz-fade) * .15), #00000026 calc(var(--viz-fade) * .3), #0000004d calc(var(--viz-fade) * .45), #00000080 calc(var(--viz-fade) * .6), #000000b3 calc(var(--viz-fade) * .75), #000000d9 calc(var(--viz-fade) * .87), #000 var(--viz-fade), #000 100%);-webkit-mask-image:linear-gradient(to right, transparent -1px, #0000000d calc(var(--viz-fade) * .15), #00000026 calc(var(--viz-fade) * .3), #0000004d calc(var(--viz-fade) * .45), #00000080 calc(var(--viz-fade) * .6), #000000b3 calc(var(--viz-fade) * .75), #000000d9 calc(var(--viz-fade) * .87), #000 var(--viz-fade), #000 100%);mask-image:linear-gradient(to right, transparent -1px, #0000000d calc(var(--viz-fade) * .15), #00000026 calc(var(--viz-fade) * .3), #0000004d calc(var(--viz-fade) * .45), #00000080 calc(var(--viz-fade) * .6), #000000b3 calc(var(--viz-fade) * .75), #000000d9 calc(var(--viz-fade) * .87), #000 var(--viz-fade), #000 100%)}.viz-carousel[data-fade=both]{-webkit-mask-image:linear-gradient(to right, transparent -1px, #0000000d calc(var(--viz-fade) * .15), #00000026 calc(var(--viz-fade) * .3), #0000004d calc(var(--viz-fade) * .45), #00000080 calc(var(--viz-fade) * .6), #000000b3 calc(var(--viz-fade) * .75), #000000d9 calc(var(--viz-fade) * .87), #000 var(--viz-fade), #000 calc(100% - var(--viz-fade)), #000000d9 calc(100% - var(--viz-fade) * .87), #000000b3 calc(100% - var(--viz-fade) * .75), #00000080 calc(100% - var(--viz-fade) * .6), #0000004d calc(100% - var(--viz-fade) * .45), #00000026 calc(100% - var(--viz-fade) * .3), #0000000d calc(100% - var(--viz-fade) * .15), transparent calc(100% + 1px));-webkit-mask-image:linear-gradient(to right, transparent -1px, #0000000d calc(var(--viz-fade) * .15), #00000026 calc(var(--viz-fade) * .3), #0000004d calc(var(--viz-fade) * .45), #00000080 calc(var(--viz-fade) * .6), #000000b3 calc(var(--viz-fade) * .75), #000000d9 calc(var(--viz-fade) * .87), #000 var(--viz-fade), #000 calc(100% - var(--viz-fade)), #000000d9 calc(100% - var(--viz-fade) * .87), #000000b3 calc(100% - var(--viz-fade) * .75), #00000080 calc(100% - var(--viz-fade) * .6), #0000004d calc(100% - var(--viz-fade) * .45), #00000026 calc(100% - var(--viz-fade) * .3), #0000000d calc(100% - var(--viz-fade) * .15), transparent calc(100% + 1px));mask-image:linear-gradient(to right, transparent -1px, #0000000d calc(var(--viz-fade) * .15), #00000026 calc(var(--viz-fade) * .3), #0000004d calc(var(--viz-fade) * .45), #00000080 calc(var(--viz-fade) * .6), #000000b3 calc(var(--viz-fade) * .75), #000000d9 calc(var(--viz-fade) * .87), #000 var(--viz-fade), #000 calc(100% - var(--viz-fade)), #000000d9 calc(100% - var(--viz-fade) * .87), #000000b3 calc(100% - var(--viz-fade) * .75), #00000080 calc(100% - var(--viz-fade) * .6), #0000004d calc(100% - var(--viz-fade) * .45), #00000026 calc(100% - var(--viz-fade) * .3), #0000000d calc(100% - var(--viz-fade) * .15), transparent calc(100% + 1px))}.type-display{letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:2.25rem;font-weight:600;line-height:1.25}.type-heading-xl{letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:1.5rem;font-weight:600;line-height:1.25}.type-heading-lg{letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:1.25rem;font-weight:600;line-height:1.25}.type-heading{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:1.125rem;font-weight:600;line-height:1.375}.type-heading-sm{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:1rem;font-weight:600;line-height:1.375}.type-body-lg{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:1rem;line-height:1.5}.type-body{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:.875rem;line-height:1.5}.type-body-emphasized{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1));font-size:.875rem;font-weight:500;line-height:1.5}.type-body-sm,.type-caption{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1));font-size:.75rem;line-height:1.5}.fade-mask-y{-webkit-mask-image:linear-gradient(to bottom, transparent -1px, #0000000d calc(var(--ui-fade-top,0px) * .15), #00000026 calc(var(--ui-fade-top,0px) * .3), #0000004d calc(var(--ui-fade-top,0px) * .45), #00000080 calc(var(--ui-fade-top,0px) * .6), #000000b3 calc(var(--ui-fade-top,0px) * .75), #000000d9 calc(var(--ui-fade-top,0px) * .87), #000 var(--ui-fade-top,0px), #000 calc(100% - var(--ui-fade-bottom,0px)), #000000d9 calc(100% - var(--ui-fade-bottom,0px) * .87), #000000b3 calc(100% - var(--ui-fade-bottom,0px) * .75), #00000080 calc(100% - var(--ui-fade-bottom,0px) * .6), #0000004d calc(100% - var(--ui-fade-bottom,0px) * .45), #00000026 calc(100% - var(--ui-fade-bottom,0px) * .3), #0000000d calc(100% - var(--ui-fade-bottom,0px) * .15), transparent calc(100% + 1px));-webkit-mask-image:linear-gradient(to bottom, transparent -1px, #0000000d calc(var(--ui-fade-top,0px) * .15), #00000026 calc(var(--ui-fade-top,0px) * .3), #0000004d calc(var(--ui-fade-top,0px) * .45), #00000080 calc(var(--ui-fade-top,0px) * .6), #000000b3 calc(var(--ui-fade-top,0px) * .75), #000000d9 calc(var(--ui-fade-top,0px) * .87), #000 var(--ui-fade-top,0px), #000 calc(100% - var(--ui-fade-bottom,0px)), #000000d9 calc(100% - var(--ui-fade-bottom,0px) * .87), #000000b3 calc(100% - var(--ui-fade-bottom,0px) * .75), #00000080 calc(100% - var(--ui-fade-bottom,0px) * .6), #0000004d calc(100% - var(--ui-fade-bottom,0px) * .45), #00000026 calc(100% - var(--ui-fade-bottom,0px) * .3), #0000000d calc(100% - var(--ui-fade-bottom,0px) * .15), transparent calc(100% + 1px));mask-image:linear-gradient(to bottom, transparent -1px, #0000000d calc(var(--ui-fade-top,0px) * .15), #00000026 calc(var(--ui-fade-top,0px) * .3), #0000004d calc(var(--ui-fade-top,0px) * .45), #00000080 calc(var(--ui-fade-top,0px) * .6), #000000b3 calc(var(--ui-fade-top,0px) * .75), #000000d9 calc(var(--ui-fade-top,0px) * .87), #000 var(--ui-fade-top,0px), #000 calc(100% - var(--ui-fade-bottom,0px)), #000000d9 calc(100% - var(--ui-fade-bottom,0px) * .87), #000000b3 calc(100% - var(--ui-fade-bottom,0px) * .75), #00000080 calc(100% - var(--ui-fade-bottom,0px) * .6), #0000004d calc(100% - var(--ui-fade-bottom,0px) * .45), #00000026 calc(100% - var(--ui-fade-bottom,0px) * .3), #0000000d calc(100% - var(--ui-fade-bottom,0px) * .15), transparent calc(100% + 1px));transition:-webkit-mask-image var(--dur-snap) var(--ease-expo);transition:mask-image var(--dur-snap) var(--ease-expo);transition:mask-image var(--dur-snap) var(--ease-expo), -webkit-mask-image var(--dur-snap) var(--ease-expo)}.ui-clamp{min-width:0}.ui-clamp[data-expanded=false]{max-height:var(--ui-clamp-max-h);-webkit-mask-image:linear-gradient(to bottom, #000 calc(100% - var(--ui-clamp-fade)), #000000d9 calc(100% - var(--ui-clamp-fade) * .87), #000000b3 calc(100% - var(--ui-clamp-fade) * .75), #00000080 calc(100% - var(--ui-clamp-fade) * .6), #0000004d calc(100% - var(--ui-clamp-fade) * .45), #00000026 calc(100% - var(--ui-clamp-fade) * .3), #0000000d calc(100% - var(--ui-clamp-fade) * .15), transparent calc(100% + 1px));-webkit-mask-image:linear-gradient(to bottom, #000 calc(100% - var(--ui-clamp-fade)), #000000d9 calc(100% - var(--ui-clamp-fade) * .87), #000000b3 calc(100% - var(--ui-clamp-fade) * .75), #00000080 calc(100% - var(--ui-clamp-fade) * .6), #0000004d calc(100% - var(--ui-clamp-fade) * .45), #00000026 calc(100% - var(--ui-clamp-fade) * .3), #0000000d calc(100% - var(--ui-clamp-fade) * .15), transparent calc(100% + 1px));mask-image:linear-gradient(to bottom, #000 calc(100% - var(--ui-clamp-fade)), #000000d9 calc(100% - var(--ui-clamp-fade) * .87), #000000b3 calc(100% - var(--ui-clamp-fade) * .75), #00000080 calc(100% - var(--ui-clamp-fade) * .6), #0000004d calc(100% - var(--ui-clamp-fade) * .45), #00000026 calc(100% - var(--ui-clamp-fade) * .3), #0000000d calc(100% - var(--ui-clamp-fade) * .15), transparent calc(100% + 1px));overflow:hidden}.markdown-content h1,.markdown-content h2,.markdown-content h3{text-wrap:balance}.markdown-content p{text-wrap:pretty}.border-hairline{border-width:var(--ui-hairline)}.snap-row{scroll-snap-type:x proximity;overscroll-behavior-x:contain}.snap-row>*{scroll-snap-align:start}@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){html:not([data-perf-mode=performance]) .reveal-on-scroll{animation:linear both reveal-on-scroll;animation-timeline:view();animation-range:entry}}}@keyframes reveal-on-scroll{0%{opacity:0;translate:0 8px}to{opacity:1;translate:none}}.placeholder\:text-dark-muted::placeholder{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1))}.placeholder\:text-dark-muted\/40::placeholder{color:rgb(var(--color-muted) / .4)}.placeholder\:text-dark-muted\/50::placeholder{color:rgb(var(--color-muted) / .5)}.placeholder\:text-dark-muted\/55::placeholder{color:rgb(var(--color-muted) / .55)}.first\:mt-1:first-child{margin-top:.25rem}.last\:mb-0:last-child{margin-bottom:0}.last\:border-0:last-child{border-width:0}.last\:border-b-0:last-child{border-bottom-width:0}.odd\:bg-dark-base:nth-child(odd){--tw-bg-opacity:1;background-color:rgb(var(--color-base) / var(--tw-bg-opacity,1))}.even\:bg-dark-hover\/30:nth-child(2n){background-color:rgb(var(--color-hover) / .3)}.even\:bg-dark-surface\/40:nth-child(2n){background-color:rgb(var(--color-surface) / .4)}.focus-within\:pointer-events-auto:focus-within{pointer-events:auto}.focus-within\:border-accent-blue:focus-within{--tw-border-opacity:1;border-color:rgb(var(--color-accent-blue) / var(--tw-border-opacity,1))}.focus-within\:border-accent-blue\/45:focus-within{border-color:rgb(var(--color-accent-blue) / .45)}.focus-within\:border-accent-blue\/50:focus-within{border-color:rgb(var(--color-accent-blue) / .5)}.focus-within\:bg-dark-hover\/40:focus-within{background-color:rgb(var(--color-hover) / .4)}.focus-within\:opacity-100:focus-within{opacity:1}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus-within\:ring-accent-blue\/60:focus-within{--tw-ring-color:rgb(var(--color-accent-blue) / .6)}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.03\]:hover{--tw-scale-x:1.03;--tw-scale-y:1.03;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent-blue:hover{--tw-border-opacity:1;border-color:rgb(var(--color-accent-blue) / var(--tw-border-opacity,1))}.hover\:border-accent-blue\/30:hover{border-color:rgb(var(--color-accent-blue) / .3)}.hover\:border-accent-blue\/40:hover{border-color:rgb(var(--color-accent-blue) / .4)}.hover\:border-accent-blue\/45:hover{border-color:rgb(var(--color-accent-blue) / .45)}.hover\:border-accent-blue\/50:hover{border-color:rgb(var(--color-accent-blue) / .5)}.hover\:border-accent-blue\/60:hover{border-color:rgb(var(--color-accent-blue) / .6)}.hover\:border-accent-green\/50:hover{border-color:rgb(var(--color-accent-green) / .5)}.hover\:border-accent-red:hover{--tw-border-opacity:1;border-color:rgb(var(--color-accent-red) / var(--tw-border-opacity,1))}.hover\:border-accent-red\/50:hover{border-color:rgb(var(--color-accent-red) / .5)}.hover\:border-accent-red\/60:hover{border-color:rgb(var(--color-accent-red) / .6)}.hover\:border-dark-border:hover{--tw-border-opacity:1;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1))}.hover\:border-dark-hover:hover{--tw-border-opacity:1;border-color:rgb(var(--color-hover) / var(--tw-border-opacity,1))}.hover\:border-dark-muted\/50:hover{border-color:rgb(var(--color-muted) / .5)}.hover\:border-dark-tertiary:hover{--tw-border-opacity:1;border-color:rgb(var(--color-tertiary) / var(--tw-border-opacity,1))}.hover\:bg-accent-blue:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-blue) / var(--tw-bg-opacity,1))}.hover\:bg-accent-blue\/10:hover{background-color:rgb(var(--color-accent-blue) / .1)}.hover\:bg-accent-blue\/15:hover{background-color:rgb(var(--color-accent-blue) / .15)}.hover\:bg-accent-blue\/20:hover{background-color:rgb(var(--color-accent-blue) / .2)}.hover\:bg-accent-blue\/25:hover{background-color:rgb(var(--color-accent-blue) / .25)}.hover\:bg-accent-blue\/30:hover{background-color:rgb(var(--color-accent-blue) / .3)}.hover\:bg-accent-blue\/80:hover{background-color:rgb(var(--color-accent-blue) / .8)}.hover\:bg-accent-cyan\/20:hover{background-color:#39c5cf33}.hover\:bg-accent-green:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-accent-green) / var(--tw-bg-opacity,1))}.hover\:bg-accent-green\/10:hover{background-color:rgb(var(--color-accent-green) / .1)}.hover\:bg-accent-green\/15:hover{background-color:rgb(var(--color-accent-green) / .15)}.hover\:bg-accent-green\/20:hover{background-color:rgb(var(--color-accent-green) / .2)}.hover\:bg-accent-green\/25:hover{background-color:rgb(var(--color-accent-green) / .25)}.hover\:bg-accent-green\/30:hover{background-color:rgb(var(--color-accent-green) / .3)}.hover\:bg-accent-purple\/15:hover{background-color:rgb(var(--color-accent-purple) / .15)}.hover\:bg-accent-purple\/20:hover{background-color:rgb(var(--color-accent-purple) / .2)}.hover\:bg-accent-red\/10:hover{background-color:rgb(var(--color-accent-red) / .1)}.hover\:bg-accent-red\/15:hover{background-color:rgb(var(--color-accent-red) / .15)}.hover\:bg-accent-red\/20:hover{background-color:rgb(var(--color-accent-red) / .2)}.hover\:bg-accent-red\/25:hover{background-color:rgb(var(--color-accent-red) / .25)}.hover\:bg-accent-red\/30:hover{background-color:rgb(var(--color-accent-red) / .3)}.hover\:bg-accent-red\/80:hover{background-color:rgb(var(--color-accent-red) / .8)}.hover\:bg-accent-yellow\/10:hover{background-color:rgb(var(--color-accent-yellow) / .1)}.hover\:bg-accent-yellow\/15:hover{background-color:rgb(var(--color-accent-yellow) / .15)}.hover\:bg-accent-yellow\/25:hover{background-color:rgb(var(--color-accent-yellow) / .25)}.hover\:bg-accent-yellow\/60:hover{background-color:rgb(var(--color-accent-yellow) / .6)}.hover\:bg-accent-yellow\/70:hover{background-color:rgb(var(--color-accent-yellow) / .7)}.hover\:bg-dark-bg:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1))}.hover\:bg-dark-border:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-border) / var(--tw-bg-opacity,1))}.hover\:bg-dark-border\/60:hover{background-color:rgb(var(--color-border) / .6)}.hover\:bg-dark-hover:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1))}.hover\:bg-dark-hover\/30:hover{background-color:rgb(var(--color-hover) / .3)}.hover\:bg-dark-hover\/40:hover{background-color:rgb(var(--color-hover) / .4)}.hover\:bg-dark-hover\/50:hover{background-color:rgb(var(--color-hover) / .5)}.hover\:bg-dark-hover\/60:hover{background-color:rgb(var(--color-hover) / .6)}.hover\:bg-dark-muted\/50:hover{background-color:rgb(var(--color-muted) / .5)}.hover\:bg-dark-muted\/60:hover{background-color:rgb(var(--color-muted) / .6)}.hover\:bg-dark-raised:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-raised) / var(--tw-bg-opacity,1))}.hover\:bg-dark-surface:hover{--tw-bg-opacity:1;background-color:rgb(var(--color-surface) / var(--tw-bg-opacity,1))}.hover\:bg-dark-surface\/40:hover{background-color:rgb(var(--color-surface) / .4)}.hover\:bg-dark-surface\/60:hover{background-color:rgb(var(--color-surface) / .6)}.hover\:bg-dark-surface\/80:hover{background-color:rgb(var(--color-surface) / .8)}.hover\:bg-white\/30:hover{background-color:#ffffff4d}.hover\:text-accent-blue:hover{--tw-text-opacity:1;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1))}.hover\:text-accent-fg:hover{--tw-text-opacity:1;color:rgb(var(--color-accent-fg) / var(--tw-text-opacity,1))}.hover\:text-accent-red:hover{--tw-text-opacity:1;color:rgb(var(--color-accent-red) / var(--tw-text-opacity,1))}.hover\:text-accent-yellow:hover{--tw-text-opacity:1;color:rgb(var(--color-accent-yellow) / var(--tw-text-opacity,1))}.hover\:text-dark-bg:hover{--tw-text-opacity:1;color:rgb(var(--color-bg) / var(--tw-text-opacity,1))}.hover\:text-dark-muted:hover{--tw-text-opacity:1;color:rgb(var(--color-muted) / var(--tw-text-opacity,1))}.hover\:text-dark-text:hover{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:no-underline:hover{text-decoration-line:none}.hover\:decoration-accent-blue:hover{-webkit-text-decoration-color:rgb(var(--color-accent-blue) / 1);text-decoration-color:rgb(var(--color-accent-blue) / 1)}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-85:hover{opacity:.85}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-95:hover{opacity:.95}.hover\:shadow-sm:hover{--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:var(--shadow-xl);--tw-shadow-colored:var(--shadow-xl);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.hover\:brightness-110:hover{--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-accent-blue:focus{--tw-border-opacity:1;border-color:rgb(var(--color-accent-blue) / var(--tw-border-opacity,1))}.focus\:border-accent-blue\/50:focus{border-color:rgb(var(--color-accent-blue) / .5)}.focus\:border-accent-blue\/60:focus{border-color:rgb(var(--color-accent-blue) / .6)}.focus\:border-accent-green:focus{--tw-border-opacity:1;border-color:rgb(var(--color-accent-green) / var(--tw-border-opacity,1))}.focus\:border-accent-red:focus{--tw-border-opacity:1;border-color:rgb(var(--color-accent-red) / var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline-offset:2px;outline:2px solid #0000}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus\:ring-accent-blue:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(var(--color-accent-blue) / var(--tw-ring-opacity,1))}.focus\:ring-accent-blue\/10:focus{--tw-ring-color:rgb(var(--color-accent-blue) / .1)}.focus\:ring-accent-blue\/15:focus{--tw-ring-color:rgb(var(--color-accent-blue) / .15)}.focus\:ring-accent-blue\/20:focus{--tw-ring-color:rgb(var(--color-accent-blue) / .2)}.focus\:ring-accent-blue\/50:focus{--tw-ring-color:rgb(var(--color-accent-blue) / .5)}.focus\:ring-accent-red\/20:focus{--tw-ring-color:rgb(var(--color-accent-red) / .2)}.focus-visible\:bg-accent-blue\/10:focus-visible{background-color:rgb(var(--color-accent-blue) / .1)}.focus-visible\:opacity-100:focus-visible{opacity:1}.focus-visible\:outline-none:focus-visible{outline-offset:2px;outline:2px solid #0000}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-1:focus-visible{outline-width:1px}.focus-visible\:outline-accent-blue:focus-visible{outline-color:rgb(var(--color-accent-blue) / 1)}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.focus-visible\:ring-accent-blue:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(var(--color-accent-blue) / var(--tw-ring-opacity,1))}.focus-visible\:ring-accent-blue\/50:focus-visible{--tw-ring-color:rgb(var(--color-accent-blue) / .5)}.focus-visible\:ring-accent-blue\/60:focus-visible{--tw-ring-color:rgb(var(--color-accent-blue) / .6)}.focus-visible\:ring-accent-yellow\/60:focus-visible{--tw-ring-color:rgb(var(--color-accent-yellow) / .6)}.active\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-dark-hover:active{--tw-bg-opacity:1;background-color:rgb(var(--color-hover) / var(--tw-bg-opacity,1))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-dark-border\/60:disabled{border-color:rgb(var(--color-border) / .6)}.disabled\:bg-transparent:disabled{background-color:#0000}.disabled\:text-dark-muted\/40:disabled{color:rgb(var(--color-muted) / .4)}.disabled\:opacity-25:disabled{opacity:.25}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:hover\:bg-transparent:hover:disabled{background-color:#0000}.group:focus-within .group-focus-within\:opacity-100{opacity:1}.group:hover .group-hover\:pointer-events-auto{pointer-events:auto}.group\/item:hover .group-hover\/item\:line-clamp-none{-webkit-line-clamp:none;-webkit-box-orient:horizontal;display:block;overflow:visible}.group\/agent-row:hover .group-hover\/agent-row\:flex{display:flex}.group\/item:hover .group-hover\/item\:translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/dot:hover .group-hover\/dot\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/dot:hover .group-hover\/dot\:bg-dark-muted{--tw-bg-opacity:1;background-color:rgb(var(--color-muted) / var(--tw-bg-opacity,1))}.group\/item:hover .group-hover\/item\:bg-dark-border\/80{background-color:rgb(var(--color-border) / .8)}.group\/track:hover .group-hover\/track\:bg-dark-muted\/70{background-color:rgb(var(--color-muted) / .7)}.group:hover .group-hover\:bg-accent-blue\/40{background-color:rgb(var(--color-accent-blue) / .4)}.group:hover .group-hover\:bg-accent-blue\/70{background-color:rgb(var(--color-accent-blue) / .7)}.group\/item:hover .group-hover\/item\:text-dark-text{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.group:hover .group-hover\:text-accent-blue{--tw-text-opacity:1;color:rgb(var(--color-accent-blue) / var(--tw-text-opacity,1))}.group:hover .group-hover\:text-accent-yellow{--tw-text-opacity:1;color:rgb(var(--color-accent-yellow) / var(--tw-text-opacity,1))}.group:hover .group-hover\:text-dark-text{--tw-text-opacity:1;color:rgb(var(--color-text) / var(--tw-text-opacity,1))}.group:hover .group-hover\:decoration-accent-blue{-webkit-text-decoration-color:rgb(var(--color-accent-blue) / 1);text-decoration-color:rgb(var(--color-accent-blue) / 1)}.group\/dir:hover .group-hover\/dir\:opacity-100,.group\/folder:hover .group-hover\/folder\:opacity-100,.group\/hdr:hover .group-hover\/hdr\:opacity-100,.group\/item:hover .group-hover\/item\:opacity-100,.group\/tab:hover .group-hover\/tab\:opacity-100,.group\/track:hover .group-hover\/track\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}.group:hover .group-hover\:opacity-70{opacity:.7}.group:focus-visible .group-focus-visible\:bg-accent-blue\/60{background-color:rgb(var(--color-accent-blue) / .6)}.group:focus-visible .group-focus-visible\:bg-accent-blue\/70{background-color:rgb(var(--color-accent-blue) / .7)}.group:focus-visible .group-focus-visible\:opacity-100{opacity:1}@media (prefers-reduced-motion:reduce){.motion-reduce\:transition-none{transition-property:none}}@media not all and (width>=768px){.max-md\:order-3{order:3}.max-md\:order-4{order:4}.max-md\:mt-auto{margin-top:auto}.max-md\:justify-start{justify-content:flex-start}}@media not all and (width>=640px){.max-sm\:hidden{display:none}}@media (width>=640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:max-h-72{max-height:18rem}.sm\:w-auto{width:auto}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-3{gap:.75rem}.sm\:self-start{align-self:flex-start}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media (width>=768px){.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (width>=1024px){.lg\:block{display:block}.lg\:inline-block{display:inline-block}.lg\:inline{display:inline}.lg\:w-20{width:5rem}.lg\:w-72{width:18rem}.lg\:w-\[440px\]{width:440px}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_300px\]{grid-template-columns:minmax(0,1fr) 300px}.lg\:flex-row{flex-direction:row}.lg\:flex-nowrap{flex-wrap:nowrap}.lg\:items-start{align-items:flex-start}.lg\:border-s{border-inline-start-width:1px}.lg\:border-dark-border{--tw-border-opacity:1;border-color:rgb(var(--color-border) / var(--tw-border-opacity,1))}.lg\:ps-5{padding-inline-start:1.25rem}}@media (width>=1280px){.xl\:inline{display:inline}.xl\:flex{display:flex}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-\[3fr_2fr\]{grid-template-columns:3fr 2fr}}@media (width>=1536px){.\32 xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.rtl\:origin-left:where([dir=rtl],[dir=rtl] *){transform-origin:0}.rtl\:-translate-x-2:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-.5rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-x-4:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-1rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-1:where([dir=rtl],[dir=rtl] *){--tw-translate-x:.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:rotate-180:where([dir=rtl],[dir=rtl] *){--tw-rotate:180deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:bg-gradient-to-l:where([dir=rtl],[dir=rtl] *){background-image:linear-gradient(to left, var(--tw-gradient-stops))}.\[\&\>\*\]\:h-full>*{height:100%}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_pre\]\:bg-dark-bg pre{--tw-bg-opacity:1;background-color:rgb(var(--color-bg) / var(--tw-bg-opacity,1))}.\[\&_pre\]\:p-3 pre{padding:.75rem}.\[\&_svg\]\:h-auto svg{height:auto}.\[\&_svg\]\:max-w-full svg{max-width:100%}html[data-perf-mode=balanced] *,html[data-perf-mode=balanced] :before,html[data-perf-mode=balanced] :after{-webkit-backdrop-filter:none!important;animation-iteration-count:1!important}html[data-perf-mode=balanced] .animate-spin,html[data-perf-mode=balanced] .rate-spinner,html[data-perf-mode=balanced] .rate-spinner *,html[data-perf-mode=balanced] .ag-ring[data-status=running],html[data-perf-mode=balanced] .ag-ring[data-status=running]:after{animation-iteration-count:infinite!important}html[data-perf-mode=performance] *,html[data-perf-mode=performance] :before,html[data-perf-mode=performance] :after{-webkit-backdrop-filter:none!important;scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}html[data-perf-mode=performance] .animate-spin{animation-duration:1s!important;animation-iteration-count:infinite!important}html[data-perf-mode=performance] .rate-spinner .rs-arc{animation-duration:var(--rs-dur,2.2s)!important;animation-iteration-count:infinite!important}html[data-perf-mode=performance] .ag-ring[data-status=running],html[data-perf-mode=performance] .ag-ring[data-status=running]:after{animation-duration:1.5s!important;animation-iteration-count:infinite!important}@media (prefers-reduced-motion:no-preference){html[data-perf-mode=balanced] .marquee-track,html[data-perf-mode=performance] .marquee-track{animation-duration:var(--marquee-dur,8s)!important;animation-iteration-count:infinite!important}}html[data-perf-mode=performance] .chat-msg:not(:last-child){content-visibility:auto;contain-intrinsic-size:auto 120px}
@@ -1 +0,0 @@
1
- import{a as e,c as t,d as n,f as r,l as i,n as a,p as o,r as s,s as c,t as l,u as ee}from"./types-JssxRFJn.js";function u(e){return{schema:o(),...e}}var d=[],f=new Set;function p(e){for(let t of e){if(f.has(t.type))throw Error(`[protocol] duplicate event type: ${t.type}`);f.add(t.type),d.push(t)}return e}function m(e){return d.find(t=>t.type===e)}new Proxy({},{get:(e,t)=>typeof t==`string`?m(t)?.schema:void 0,has:(e,t)=>typeof t==`string`&&!!m(t)?.schema,ownKeys:()=>d.map(e=>e.type),getOwnPropertyDescriptor:(e,t)=>typeof t==`string`&&m(t)?{enumerable:!0,configurable:!0,value:m(t)?.schema}:void 0}),p([u({type:`connected`,description:`WebSocket 已连接`,category:`session`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0}),u({type:`session_created`,description:`新会话已创建`,category:`session`,emittedBy:[`server`,`core`],handledByCli:!0,handledByWeb:!0,note:`CLI/Web 均已处理(Web: systemHandlers session_created);background=true 表示后台新建,客户端只入列不抢前台`,schema:i({id:n(),newSessionId:n().optional(),title:n().optional(),workspaceDir:n().optional(),background:s().optional()}).partial()}),u({type:`session_resumed`,description:`会话从存储中恢复`,category:`session`,emittedBy:[`core`,`server`],handledByCli:!0,handledByWeb:!0,note:`CLI/Web 均已处理(Web: systemHandlers session_resumed)`,schema:i({id:n()}).partial()}),u({type:`session_forked`,description:`会话已复制(fork),新会话已创建并广播`,category:`session`,emittedBy:[`core`,`server`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`Web: useWebSocket 收到广播后在标签栏插入新标签(已存在则跳过,且不夺走当前焦点)。CLI 侧为记录在案的刻意缺口(见 cli/hooks/forkCommand.ts)`,schema:i({sourceId:n(),newSessionId:n(),title:n()}).partial()}),u({type:`auth_required`,description:`需要认证`,category:`session`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18)`}),u({type:`auth_success`,description:`认证成功`,category:`session`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18)`}),u({type:`auth_failed`,description:`认证失败`,category:`session`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18)`}),u({type:`message_ack`,description:`消息确认`,category:`session`,emittedBy:[`client`],handledByCli:!1,handledByWeb:!1,note:`CLI 发送给服务器的入站事件,无需 handler`}),u({type:`workspace_changed`,description:`工作空间已切换`,category:`session`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0,schema:i({workspaceDir:n()}).partial()}),u({type:`session_switched`,description:`会话已切换`,category:`session`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18); Web 已处理(切换 activeSessionId)`,schema:i({id:n()}).partial()}),u({type:`disconnected`,description:`连接断开`,category:`session`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0}),u({type:`session_delegation_start`,description:`会话 A 向会话 B 发起委派任务(send_to_session 工具)`,category:`session`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`客户端把 task 作为一条系统消息展示在目标会话(B)时间线上;A 阻塞等待 B 完成`,schema:i({fromSessionId:n(),fromTitle:n(),toSessionId:n(),toTitle:n(),task:n()}).partial()}),u({type:`session_delegation_end`,description:`会话委派任务完成(成功/失败)`,category:`session`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`结果回填到 A 的 send_to_session 工具结果;客户端据此关闭目标会话的委派横幅`,schema:i({fromSessionId:n(),toSessionId:n(),fromTitle:n(),toTitle:n(),ok:s(),summary:n()}).partial()}),u({type:`session_direct_delivered`,description:`用户消息经会话 A 直连投递给会话 B(deliverDirectMessage,不经 A 的模型)`,category:`session`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`投递卡渲染在 A(邮局)的时间线;queued=true 表示 B 正在跑、已排队作新一轮(复用 delegationQueue 互斥门)`,schema:i({fromSessionId:n(),fromTitle:n(),toSessionId:n(),toTitle:n(),text:n(),deliveryId:n(),traceId:n(),hopCount:t(),queued:s()}).partial()}),u({type:`session_direct_completed`,description:`直连消息在会话 B 执行完成(成功/失败),结果转达回 A`,category:`session`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`回复卡渲染在 A 的时间线:summary 是展示优化,outputMessageIds 是事实链(可回溯 B 的原始输出)`,schema:i({fromSessionId:n(),toSessionId:n(),deliveryId:n(),traceId:n(),hopCount:t(),ok:s(),status:n(),summary:n(),outputMessageIds:a(n())}).partial()}),u({type:`session_run_changed`,description:`会话的 run 状态发生迁移(**只是刷新提示,不是状态**)`,category:`session`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:"⚠️ **payload 刻意不含 status** —— 状态以 `GET /api/sessions` 的查询为准(响应里的 `status` 字段一直都在,本事件只用来标记「该重拉了」)。理由照抄 `worktree_service_changed`:事件是瞬时的,而「我下午回来看它还在跑吗」必须能重新查询;带上 status 就等于同时存在两份真相,必然漂移。⚠️ 本事件**只覆盖 `setActiveRun` 的迁移**(running / paused / complete / error / stopped / interrupted)。「等用户」那两态(等审批 / 等回答)**不走这里** —— 它们由既有的 `hook_ask` / `ask_user_question` 覆盖。消费方不要把它当成「所有分组变化」的统一广播点。接线:core 侧挂在 `SessionStore.onRunStatusChange` 的既有订阅上(与 watchdog、notifyDispatchedSessionTerminal 同一个订阅,**不改 setActiveRun** 那条热路径)。CLI 侧未接线(无「按需分组」消费面),故 intentionalGap 保持 true —— 该 flag 与 handledByCli 被 CLI 接线完整性门禁共用,提前置 false 会把它当成新缺口误报(同 worktree_service_changed 的口径)。设计:docs/architecture-design/SESSION_TRIAGE_PLAN.md 的 D1",schema:i({sessionId:n()}).partial()}),u({type:`effort_set`,description:`设置会话推理力度(入站控制消息:Web 的 chip / CLI 的 /effort 上行)`,category:`session`,emittedBy:[`client`],handledByCli:!1,handledByWeb:!1,note:`入站事件(client→server):core.handleControlMessage 处理,写 session.reasoningEffort 后回 reasoning_effort_ack`}),u({type:`reasoning_effort_ack`,description:`推理力度回执(会话级设置已生效,或输入被拒)`,category:`session`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`会话级状态:server 用 sendToSession 定向发往**绑定了该会话**的连接(与 hook_auto_ack 同款,否则 A 会话改档会串到 B 会话客户端的显示上);无绑定连接时退化为广播(headless / 尚未 resume)。payload { ok, effort, ui, error }:effort 是归一后的 wire 值(与写进请求体的同一份),ui 是 UI 轴档位 off|low|medium|high|extra_high|max。客户端只认回执,不各自推档位。`,schema:i({ok:s(),effort:n(),ui:n(),error:n()}).partial()})]),p([u({type:`start`,description:`AI 开始生成`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`content`,description:`生成内容增量`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,schema:i({text:n(),content:n(),index:t()}).partial(),note:`载荷 { text, index }:index 为服务端稳定 block index(TurnEngine 每轮分配),客户端据此把多段正文与思考/工具按时间序穿插;content 为兼容旧字段`}),u({type:`thinking`,description:`思考过程增量`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,schema:i({text:n(),content:n(),index:t()}).partial(),note:`载荷 { text, index }:index 为服务端稳定 block index,客户端按 index upsert 成独立思考块(工具调用前后各一段)`}),u({type:`tool_call`,description:`工具调用流式增量`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`tool_result`,description:`工具执行结果`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`tool_execution_start`,description:`工具执行阶段开始(无流事件时段开始)`,category:`stream`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!1,note:`纯 core 内部遥测:供运行时暂停/恢复 stall 心跳与全局看门狗;CLI/Web 无 handler(前端无需展示),仅 queryEngine 消费`,intentionalGap:!0}),u({type:`tool_execution_end`,description:`工具执行阶段结束(恢复 stall 心跳与全局看门狗)`,category:`stream`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!1,note:`配合 tool_execution_start:防止 180s 心跳把合法长等待误判为流挂起而 abort + 重放整轮工具调用;CLI/Web 无 handler`,intentionalGap:!0}),u({type:`tool_diff`,description:`工具执行中的参数 diff 增量(P0-2 diffConsumer 生产者推送)`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`tool_output`,description:`工具执行期间的实时输出增量(stdout/stderr chunk,Phase0 OutputStream 生产者推送)`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,schema:i({toolCallId:n(),stream:e([`stdout`,`stderr`]),chunk:n(),seq:t(),timestamp:t()}).partial(),note:`增量、可丢;权威输出仍是 tool_result,权威时序仍是 ExecutionLedger。生产者侧节流(时间窗聚合 + 每调用字节上限),不得用于 reset stall 心跳。命名对齐 tool_call/tool_result/tool_diff 家族`}),u({type:`step_start`,description:`步骤开始`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`step_thinking`,description:`步骤思考`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`step_action`,description:`步骤动作`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`step_complete`,description:`步骤完成`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`turn_summary`,description:`回合结束摘要(思考时长+工具计数+头条)`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI/Web 渲染为折叠摘要行(Thought for Ns, ran N …)`}),u({type:`cache_stats`,description:`本轮 run 前缀缓存命中统计(命中/未命中 token、命中率、调用次数)`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`run 结束时由 queryEngine 发送;CLI/Web 在模型名旁展示命中率`,schema:i({cacheHitTokens:t(),cacheMissTokens:t(),cacheHitRate:t().optional(),cacheStatsCalls:t()}).partial()}),u({type:`web_search`,description:`模型内置联网搜索状态(DeepSeek Responses web_search_call:searching/completed/failed)`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`由服务端执行搜索,客户端仅展示状态(🔍搜索中 → ✅完成)`,schema:i({state:n()}).partial()}),u({type:`progress`,description:`通用进度(当前未使用)`,category:`stream`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!1,deprecated:!0,note:`已定义但从未发送;原先唯一提及它的 SendMessageTool 空壳已于 2026-10-05 删除`}),u({type:`complete`,description:`生成完成`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`error`,description:`生成错误`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,schema:i({message:n()}).partial()}),u({type:`generation_paused`,description:`生成已暂停`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`generation_resumed`,description:`生成已恢复`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`stall_detected`,description:`流级卡死检测(自动重试/通知)`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`由 StreamHeartbeat 或 StallDetector 触发;CLI/Web 显示重试进度`}),u({type:`task_interrupted`,description:`任务中断(服务重启/异常退出)`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`服务启动扫描时将 running activeRun 标记为 interrupted 后触发;对话会话由看门狗自动续跑(客户端提示「已开始自动续跑」),/continue 退化为手动接管入口,/resume 仍用于切换会话`}),u({type:`prompt_suggestion`,description:`回合结束后生成的下一条输入建议(预填输入框的幽灵提示)`,category:`stream`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`core 在正常收场后用一次轻量 LLM 调用生成单条建议(settings.promptSuggestion.* 可关);CLI/Web 把它渲染成输入框里的幽灵文本,Enter 直接发送、任意键改写`,schema:i({text:n(),source:n().optional()}).partial()}),u({type:`step_prompt`,description:`步骤提示(Web 路由用)`,category:`stream`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!0,note:`Web 路由的内部事件,不通过 WS 发送`}),u({type:`browser_frame`,description:`浏览器实时画面帧(A 方案截图流:Playwright 有头 Chromium 的页面帧推给 Web 渲染)`,category:`stream`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,schema:i({tabId:n(),url:n(),title:n(),seq:t(),timestamp:t(),dataUri:n(),format:e([`jpeg`,`png`])}).partial(),note:`增量、可丢、只读呈现(A 方案「只能看」):由 BrowserFrameStream 生产者按帧率节流后推送;权威状态仍是浏览器本身与 browser_snapshot。dataUri 为 data:image/<format>;base64,... 内联帧;CLI 无 handler(终端无法渲染位图)`})]),p([u({type:`plan_mode_change`,description:`模式切换`,category:`plan`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`历史名称,实际承载 act/goal/chat/normal 的模式切换(core modeManager 变更 → server 分发;Web 用户切换时也会回发)。data 携带 previousMode/newMode/frontendMode/sessionId/timestamp`}),u({type:`plan_mode_change_ack`,description:`模式切换 ACK(服务器确认模式变更)`,category:`plan`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!1,note:`server app.ts 对 plan_mode_change 消息的应答;data 携带 mode/auto`}),u({type:`mode_state`,description:`模式状态同步(值 + 来源 + 锁定)`,category:`plan`,emittedBy:[`server`],handledByCli:!1,handledByWeb:!0,note:`server 在 ModeManager 任意变更时广播:data 携带 mode/previousMode/source(default|user_override|auto_router)/locked/reason/auto/autoLevel;Web 据此同步模式值、锁定状态与 auto 档位(autoLevel 是该会话的生效档位,已含会话 floor)——只覆盖基础模式,且不回发 plan_mode_change(否则一次广播会被 server 判成 user_override 误锁模式)`,schema:i({mode:n(),previousMode:n(),source:n(),locked:s(),reason:n(),auto:s(),autoLevel:t()}).partial()}),u({type:`mode_suggestion`,description:`自动评估建议切换模式(被用户锁定拦截,待用户确认)`,category:`plan`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`queryEngine 仲裁拒绝自动建议时 emit(仅 user_override 场景)。Web 弹建议横幅,Apply 走既有 plan_mode_change(user_override 语义);CLI 以**非交互**方式消费:状态行上方一行「建议切到 X · 走 /X 应用」,到点自清(不弹窗、不抢键、不改模式)。CLI 没有确认入口这一事实不变,故不再标记 intentionalGap。`,schema:i({currentMode:n(),suggestedMode:n(),confidence:t(),reason:n(),decisionSource:n()}).partial()})]);var h=i({id:n().optional(),type:n().optional(),scope:n().optional(),confidence:t().optional(),priority:n().optional(),tokens:t().optional(),preview:n().optional(),summary:n().optional(),reason:n().optional()}).partial(),te=i({id:n().optional(),type:n().optional(),scope:n().optional(),confidence:t().optional(),tags:a(n()).optional(),preview:n().optional()}).partial(),ne=i({query:n().optional(),hits:a(te).optional(),count:t().optional()}).partial();p([u({type:`token_update`,description:`Token 用量更新`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:"data 携带 promptTokens/completionTokens(+promptCache*),可选 model/source/workflowNodeTokens;core 在 provider delta 发射点就地补 costUsd(models.dev 单价,只有这一条路径会盖章),CLI/Web 据此累加会话级 `$ spent`"}),u({type:`context_compressed`,description:`上下文已压缩`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`compaction_progress`,description:`压缩进度更新`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`context_analysis`,description:`上下文分布分析`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18); Web 有 handler 但路由不可达`}),u({type:`threshold_warning`,description:`Token 阈值警告`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18); Web 有 handler 但路由不可达`}),u({type:`threshold_error`,description:`Token 阈值错误`,category:`context`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!1,deprecated:!0,note:`功能存在但被 context_blocked 覆盖,事件未使用`}),u({type:`context_blocked`,description:`上下文已满,生成被阻止`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18); Web 有 handler 但路由不可达`}),u({type:`blocking_limit`,description:`已达到阻止极限`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18); Web 有 handler 但路由不可达`}),u({type:`compaction_started`,description:`压缩任务已启动(phase/trigger)`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`compaction_finished`,description:`压缩任务结束(done/failed/aborted)`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`tool_retry`,description:`工具重试`,category:`context`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!0,deprecated:!0,note:`重试信息已含于 tool_result/error,Web handler 保留但路由不可达`}),u({type:`model_fallback`,description:`模型回退`,category:`context`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!0,deprecated:!0,note:`降级信息已含于 degradation_update,Web handler 保留但路由不可达`}),u({type:`usage`,description:`Token 用量`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`context_breakdown`,description:`上下文容量分类占比(系统提示词/消息/工具/技能/MCP),供 Web 上下文条抽屉与 CLI 状态行容量横条展示`,category:`context`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`每轮 query 上下文组装后估算各组件 token,并带出 contextWindow(容量条的分母);Web 端点状态栏上下文条上拉展示明细,CLI 只画同一条堆叠横条(不重复文字)`}),u({type:`memory_recall`,description:`本回合记忆召回快照(真正注入的条目 + 被预算挡掉的候选)`,category:`context`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,note:`每轮上下文组装后发出。items = 预算截断后**真正进入 prompt** 的那批,dropped = 有相关性但被 maxItems/token 预算挡掉的候选(二者都只带 200 字预览,全文不下发 —— 每轮都发,全文会把 WS 单帧撑到几十 KB);turnId 供 Web 按回合分组、高亮当前回合。tool = 模型主动调 memory_search 的一次快照,由该工具执行后以**独立帧**发出(不带 turnId,客户端按会话累积)—— 同一个类型承载两种帧,靠字段区分。CLI 无 handler:终端没有右栏,/memory 命令走本地 store 另一条路。`,schema:i({turnId:n().optional(),query:n().optional(),items:a(h).optional(),dropped:a(h).optional(),itemCount:t().optional(),droppedCount:t().optional(),totalTokens:t().optional(),wasTruncated:s().optional(),tool:ne.optional()}).partial()})]),p([u({type:`workflow_started`,description:`工作流已启动`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`data.nodes 携带 LLM 合成完整节点清单(含 type/children/priority,前端可分层渲染)`,schema:i({workflowId:n().optional(),title:n().optional(),goalId:n().optional(),totalNodes:t().optional(),nodes:a(l()).optional()}).partial()}),u({type:`workflow_event`,description:`工作流事件`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`workflow_progress`,description:`工作流进度`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`nodeStatuses: 逐节点状态全量映射(断线重连可重建视图)`,schema:i({runId:n().optional(),status:n().optional(),completedNodes:t().optional(),totalNodes:t().optional(),tokensUsed:t().optional(),tokensRemaining:t().optional(),currentNodeId:n().optional(),nodeStatuses:ee(n(),n()).optional()}).partial()}),u({type:`workflow_finished`,description:`工作流完成`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,schema:i({runId:n().optional(),status:n().optional(),output:l().optional(),error:n().optional()}).partial()}),u({type:`workflow_error`,description:`工作流错误`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`workflow_checkpoint`,description:`工作流检查点`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`workflow_node_start`,description:`工作流节点开始`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,schema:i({nodeId:n().optional(),title:n().optional(),type:n().optional()}).partial()}),u({type:`workflow_node_complete`,description:`工作流节点完成`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`durationMs: 节点耗时;attempts: retry 重试次数(retry 原语节点)`,schema:i({nodeId:n().optional(),title:n().optional(),status:n().optional(),result:l().optional(),error:n().optional(),durationMs:t().optional(),attempts:t().optional()}).partial()}),u({type:`workflow_node_retry`,description:`工作流节点重试(retry 原语每次重试发出)`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`attempt > 1 时发出;reason 为上一次尝试的失败原因`,schema:i({nodeId:n().optional(),childId:n().optional(),attempt:t().optional(),maxAttempts:t().optional(),reason:n().optional()}).partial()}),u({type:`workflow_paused`,description:`工作流已暂停`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`workflow_resumed`,description:`工作流已恢复`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`workflow_cancelled`,description:`工作流已取消`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`workflow_recovered`,description:`工作流已恢复(从故障)`,category:`workflow`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!1,deprecated:!0,note:`已被 workflow_resumed 覆盖,核心从未发送`}),u({type:`workflow_handoff`,description:`ReAct 转交 workflow(范式切换)`,category:`workflow`,emittedBy:[`none`],handledByCli:!0,handledByWeb:!0,deprecated:!0,note:`Agent Loop 单核模型重构后退役:workflow 判定改为计划注入(见 workflow_plan_ready),核心不再发送;CLI/Web 保留 handler 兼容旧服务端回放`}),u({type:`workflow_plan_ready`,description:`范式路由:LLM 合成的执行计划提案就绪(confirm=true 时等待用户确认)`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`payload 携带 planId/title/nodes/parallelGroups/estimatedTokens/runtimeAvailable;confirm=false 保持兼容的立即执行路径`,schema:i({planId:n(),title:n().optional(),reason:n().optional(),confirm:s().optional(),nodes:a(l()).optional(),parallelGroups:a(a(n())).optional(),estimatedTokens:t().optional(),runtimeAvailable:s().optional()}).partial()}),u({type:`workflow_confirm_ack`,description:`工作流提案确认结果(start/cancel/change/runtime)`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,schema:i({planId:n().optional(),action:n().optional(),ok:s().optional(),auto:s().optional()}).partial()}),u({type:`workflow_status`,description:`workflow run 状态查询响应(状态对账:连接/重连后拉取终态)`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`2026-08-14: 配合 get_workflow_status 请求,修复一次性事件流漏终态导致的 UI 卡死;runs[].nodeStatuses 为逐节点状态映射`,schema:i({runs:a(l()).optional()}).partial()})]),p([u({type:`dwf_offer`,description:`动态工作流确认请求(模型写了 _<name>_workflow.js,询问是否运行)`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`回合尾嗅探到新写的 workflow 脚本时发出;用户经 dwf_confirm(run|view|no) 应答;执行期进度复用 workflow_* 事件`,schema:i({offerId:n(),sessionId:n().optional(),fileName:n(),filePath:n().optional(),title:n().optional(),description:n().optional(),phases:a(i({title:n(),detail:n().optional()})).optional(),agentCount:t().optional(),scriptPreview:n().optional(),tokenWarning:n().optional()}).partial()}),u({type:`dwf_confirm_ack`,description:`动态工作流确认应答(服务器处理 dwf_confirm 后回执)`,category:`workflow`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0,note:`data 携带 offerId/action/ok;view 时 scriptPreview 为全量脚本;未知 offerId → ok:false`,schema:i({offerId:n(),action:n(),ok:s(),scriptPreview:n().optional(),error:n().optional()}).partial()}),u({type:`dwf_cancelled`,description:`动态工作流已取消(用户 no / 运行中取消)`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,schema:i({offerId:n().optional(),runId:n().optional(),reason:n().optional()}).partial()}),u({type:`dwf_promotable`,description:`动态工作流可沉淀为模板(provenance 账本 successfulRuns ≥3,邀请 Save as template)`,category:`workflow`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`run 终态后由 onTerminal 检测发出;门槛按成功 run 数(successfulRuns,COMPLETED 计数)计,总 run 含失败不达标;用户经 dwf_promote { workflowId } 确认沉淀;promote 成功后模板存在 → 不再提示;用户 No/本地 dismiss 仅清除提示不落服务端标记 → 后续成功 run 终态仍会再次提示(幂等提示而非只提示一次)`,schema:i({workflowId:n(),sessionId:n().optional(),name:n().optional(),runs:t().optional(),successRate:t().optional(),avgTokens:t().optional(),lastRunAt:t().optional()}).partial()}),u({type:`dwf_promote_ack`,description:`沉淀为模板的结果回执(处理 dwf_promote 后)`,category:`workflow`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0,schema:i({workflowId:n(),ok:s(),templateId:n().optional(),reason:n().optional()}).partial()})]),p([u({type:`filejob_start`,description:`文件处理任务开始(解析/渲染)`,category:`task`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`对话内嵌文件处理面板;Web 已处理,CLI 已处理(2026-08-07 状态行)`}),u({type:`filejob_progress`,description:`文件处理进度更新`,category:`task`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`解析/渲染进度百分比`,schema:i({progress:t()}).partial()}),u({type:`filejob_result`,description:`文件处理完成(结果文件列表)`,category:`task`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`携带 RenderedFileResult[]`,schema:a(l())}),u({type:`filejob_error`,description:`文件处理失败`,category:`task`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`脱敏错误详情`})]),p([u({type:`goal_created`,description:`目标已创建`,category:`goal`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`2026-07-21: Web handled via goal_tasks/goal_task_update`}),u({type:`goal_tasks`,description:`目标任务列表(批量初始化看板)`,category:`goal`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`2026-07-21: 统一看板数据源`}),u({type:`goal_task_update`,description:`目标任务更新`,category:`goal`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`2026-07-21: Web 已添加 handler`}),u({type:`goal_update`,description:`目标元信息更新(retitle / 看板整体刷新)`,category:`goal`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`漂移修复:goalManager.retitle / GoalTool 此前已在发射但未注册;tasks 为空数组时 Web 清空看板`}),u({type:`goal_completed`,description:`目标已完成(workflow 终态自动推导)`,category:`goal`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`2026-08-14: 此前 goals.complete() 无任何调用点,goal 工作流跑完后 goal 永远停在 active —— 新增终态事件供两端对账`}),u({type:`goal_route_decision`,description:`Goal 智能路由结果(simple/medium/hard 分流结论)`,category:`goal`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`2026-09-06 P1: goal 模式消息不再固定跑 4 子代理流水线。默认层只展示一行结论(tier 标签 + 一句话理由 + 耗时),完整判定细节走 debug 层日志`,schema:i({tier:e([`simple`,`medium`,`hard`]),summary:n().optional(),source:e([`override`,`llm`,`fallback`]).optional(),latencyMs:t().optional(),reason:n().optional(),confidence:t().optional(),goalId:n().optional(),runId:n().optional(),message:n().optional()}).partial()})]),p([u({type:`hook_ask`,description:`Hook 审批请求`,category:`hook`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0}),u({type:`hook_allow`,description:`Hook 允许响应`,category:`hook`,emittedBy:[`client`],handledByCli:!1,handledByWeb:!1,note:`入站事件(CLI→服务器),无需 handler`}),u({type:`hook_deny`,description:`Hook 拒绝响应`,category:`hook`,emittedBy:[`client`],handledByCli:!1,handledByWeb:!1,note:`入站事件(CLI→服务器),无需 handler`}),u({type:`hook_response_ack`,description:`Hook 响应确认`,category:`hook`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已添加 handler(2026-07-01); Web systemHandlers 已处理(2026-08-07)`}),u({type:`ask_user_question`,description:`向用户提问`,category:`hook`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`question_answer_ack`,description:`提问回答确认`,category:`hook`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`Web useWebSocket 已处理(dismiss 提问弹窗)`}),u({type:`form_request`,description:`右栏表单待填请求(collect_form)`,category:`hook`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,note:`Web 已接线(2026-02):useWebSocket 早于 sessionId 守卫分派到 formStore → 右栏 FormWidget。CLI 物理上没有右栏,终端里 collect_form 靠超时退化成提问。`}),u({type:`form_answer`,description:`右栏表单提交(Web→服务器,转 core submitFormAnswer)`,category:`hook`,emittedBy:[`client`],handledByCli:!1,handledByWeb:!1,note:`入站事件(Web→服务器),由 server dispatch 转给 core,无需 handler`}),u({type:`form_answer_ack`,description:`表单提交确认(含会话中断取消)`,category:`hook`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,note:`Web 已接线:useWebSocket → formStore.applyAck(成功转「已提交」摘要态,失败把 issues 摊回字段)。CLI 无右栏,不消费。`}),u({type:`form_cancelled`,description:`表单被会话中断/停止取消`,category:`hook`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,note:`Web 已接线:→ formStore.markCancelled,卡不删(答案仍会落盘),只标注「AI 已不再等待」。CLI 无右栏,不消费。`}),u({type:`hook_auto_ack`,description:`Hook 自动模式确认`,category:`hook`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`Web 已处理(2026-08-07 toast 提示)`}),u({type:`tool.approval_required`,description:`工具调用需要审批(无人值守运行触发,未放行即拒绝)`,category:`hook`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`无人值守/定时运行写操作需审批的通知;Inbox 审批队列已退役,Web 显式 no-op,CLI 走 hook 链审批`}),u({type:`permission_decision`,description:`审批决策已落审计(结构化条目 + 环形缓冲)`,category:`hook`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!1,intentionalGap:!0,note:`读者尚未接线(recently-denied 面板 / REST,见 a2)。先声明并发射,接线时只改订阅方、不动发射端;handledBy* 保持 false 是为了不谎报有 handler。`})]),p([u({type:`mcp_update`,description:`MCP 状态更新`,category:`mcp`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已添加 handler(2026-07-01)`})]),p([u({type:`doctor_result`,description:`诊断完成`,category:`diagnostic`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`degradation`,description:`降级状态更新(遗留)`,category:`diagnostic`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`degradation_update`,description:`降级状态更新`,category:`diagnostic`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0})]),p([u({type:`commands_list`,description:`命令列表(服务器→客户端)`,category:`system`,emittedBy:[`core`,`server`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(setDynamicCommands); Web systemHandlers 已处理(2026-08-07)`}),u({type:`ping`,description:`心跳 Ping`,category:`system`,emittedBy:[`client`],handledByCli:!1,handledByWeb:!1,note:`由 Server 的 WS 层自动处理`}),u({type:`pong`,description:`心跳 Pong`,category:`system`,emittedBy:[`server`],handledByCli:!1,handledByWeb:!1,note:`由 Client 的 WS 层自动处理`}),u({type:`hello`,description:`客户端首帧握手`,category:`system`,emittedBy:[`client`],handledByCli:!1,handledByWeb:!1,note:`由 Server rpc/handshake.ts 拦截处理,不进事件总线;web 已接入(services/websocket.ts)。规范见 docs/protocol-compatibility.md`}),u({type:`hello_ack`,description:`首帧握手回执(serverVersion/protocolVersion/capabilities)`,category:`system`,emittedBy:[`server`],handledByCli:!1,handledByWeb:!1,note:`由 Client 的 WS 层拦截处理(web: services/websocket.ts → stores/connectionStore),不进事件总线;capabilities 是 R4 能力门禁的唯一合法依据`}),u({type:`log`,description:`服务端日志`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`notification`,description:`通知消息`,category:`system`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0}),u({type:`channel_message`,description:`频道入站消息(转发到 Web UI)`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18); Web 已处理(2026-08-07 通知)`}),u({type:`channel_status`,description:`频道连接状态变更`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18); Web 已处理(channelsStore)`}),u({type:`channel_error`,description:`频道运行时错误`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`CLI 已处理(2026-07-18); Web 已处理(2026-08-07 通知)`}),u({type:`todo_update`,description:`待办事项更新`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0}),u({type:`todo_item_done`,description:`待办项完成`,category:`system`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!0,deprecated:!0,note:`已退役:core/server 无发射点(待办统一走 todo_update 全表替换);Web handler 保留兼容`}),u({type:`todo_progress`,description:`待办进度`,category:`system`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!1,deprecated:!0,note:`已退役:core/server 无发射点,CLI 无 handler,Web 侧为空 case`}),u({type:`board_update`,description:`共享工作板更新(作用域 = 工作目录 + 会话类型)`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`BoardTool emit;payload.data 为 {items:[...]} 的 JSON 字符串。板按会话类型分作用域(board/boardBinding.ts),当前只有 PM 有板。CLI 渲染 BoardPanel,Web 写入 workflowStore(source=board) 复用 TaskBoardWidget`}),u({type:`tombstone`,description:`消息已删除/墓碑`,category:`system`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!1,deprecated:!0,note:`Web/CLI 本地消息删除渲染概念,无 WS 发射端`}),u({type:`status`,description:`状态更新(modelName/connected/statusText)`,category:`system`,emittedBy:[`core`,`server`],handledByCli:!0,handledByWeb:!0,schema:i({modelName:n(),connected:s(),statusText:n()}).partial()}),u({type:`model_name`,description:`当前模型名称`,category:`system`,emittedBy:[`core`,`server`],handledByCli:!0,handledByWeb:!0,schema:i({model:n(),modelRef:n(),source:e([`session`,`mode`,`global`]),data:n()}).partial(),note:`model 顶层裸模型 id;modelRef 为 provider:model 复合身份(同 id 多 provider 去歧义,CLI/Web 状态行 + 模型选择器用);source 标记模型来源 session/mode/global(session = 仅本会话切换)`}),u({type:`models_updated`,description:`模型列表已更新(models.dev 快照刷新后广播)`,category:`system`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0,note:`app.ts 模型端点写入 / config.yaml 外部变更后全量广播;CLI useAppConnection 重拉并预热列表,Web useWebSocket 转 window 'models-updated'(ModelsView / ModelPicker 监听刷新)。两端接线由 useWebSocket.modelsUpdated.test.tsx 从原始 wire 字节锁定`}),u({type:`throttle`,description:`速率限制状态`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`Web 已处理(2026-08-07 toast 提示)`}),u({type:`code_review_ready`,description:`代码审查结果就绪`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`Web 已处理(2026-08-07 toast 提示)`}),u({type:`pdca_phase`,description:`PDCA 循环阶段`,category:`system`,emittedBy:[`none`],handledByCli:!0,handledByWeb:!1,deprecated:!0,note:`已退役:5-phase light pipeline 被 WorkflowRuntime 取代`}),u({type:`command_start`,description:`命令开始(Web 路由用)`,category:`system`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!0,deprecated:!0,note:`Web systemHandler 有 case 但核心无发送方,保留兼容`}),u({type:`command_complete`,description:`命令完成(Web 路由用)`,category:`system`,emittedBy:[`none`],handledByCli:!1,handledByWeb:!0,deprecated:!0,note:`Web systemHandler 有 case 但核心无发送方,保留兼容`}),u({type:`command_error`,description:`命令错误(Web 路由用)`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`core index.ts:1270 真实 emit;CLI useStreamHandlers:741 与 Web systemHandlers 均已处理`}),u({type:`worktree_service_changed`,description:`worktree 声明的服务已启动/停止(**只是刷新提示,不是状态**)`,category:`system`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:"⚠️ **payload 刻意不含 status** —— 状态以 `GET /api/worktree-services` 的查询为准,事件只用来标记「该重拉了」。这是 thread.ts 文件头已经写死的那条不变量(「任何消费方都不能靠事件推导状态,必须以查询快照为准」),照抄而非新立。理由:事件是瞬时的,而「我下午回来看它还活着吗」必须能重新查询。接线:core 侧由 DeepSeekCodeRuntime 把 WorktreeServiceRuntime 的变更监听接到 emit;Web 已接线。CLI 侧未接线(S3 待定),故 intentionalGap 保持 true —— 该 flag 与 handledByCli 被 CLI 接线完整性门禁共用,提前置 false 会把它当成新缺口误报。设计:docs/architecture-design/WORKTREE_SERVICE_STATUS_UI_PLAN.md",schema:i({sessionId:n(),name:n(),action:e([`started`,`stopped`])}).partial()}),u({type:`visual_artifacts_updated`,description:`视觉产物注册表落了新版本(**只是刷新提示,不是状态**)`,category:`system`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:"⚠️ payload 只给**地址**(sessionId + logicalId),不给版本号/类型/渲染器等内容 —— 内容以 `GET /api/visual-artifacts` 的查询为准。理由照抄上面 worktree_service_changed:事件是瞬时的,而「我下午回来看它还在不在」必须能重新查询;带上内容就等于同时存在两份真相,必然漂移。两个地址各有各的用处,且**必须都给**:sessionId 是清单刷新键(该会话的「产物」视图),logicalId 是版本链刷新键 —— 链的取数键**不含产者**(身份 = 工作区 + 产物路径,见 visualArtifacts/artifact.ts 文件头),所以「产者会话」与「正在看这条链的会话」可能不是同一个,少给 logicalId 就只能重拉产者自己那个槽。接线:core 侧由 createVisualArtifactRegistrar 的 notify(**落盘成功后**)→ runtime.emit;Web 已接线(useWebSocket → visualArtifactsStore.refreshPublished,只重拉**已持有**的槽与链)。CLI 侧未接线(无「产物」面板),故 intentionalGap 保持 true —— 该 flag 与 handledByCli 被CLI 接线完整性门禁共用,提前置 false 会把它当成新缺口误报(同 worktree_service_changed 的口径)。设计:docs/architecture-design/VISUAL_ARTIFACT_READ_SIDE_PLAN.md §4「实时刷新」行",schema:i({sessionId:n(),logicalId:n()}).partial()})]),p([u({type:`automation.update`,description:`自动化任务新增/更新/删除/状态变更`,category:`automation`,emittedBy:[`server`],handledByCli:!0,handledByWeb:!0,note:`REST /api/automations 已可用;Web 自动化视图消费`}),u({type:`automation.run`,description:`自动化触发运行(started/finished/error)`,category:`automation`,emittedBy:[`core`,`server`],handledByCli:!0,handledByWeb:!0,note:`CLI 状态提示;Web RunDetail 消费`})]),p([u({type:`agent_started`,description:`Agent 启动(统一生命周期)`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`AgentRunner.beginLifecycle 注册控制面时 emit;data 携带 agentId/toolCallId/parentAgentId/rootId/depth/sessionId/scope/state/elapsedMs`,schema:i({agentId:n(),toolCallId:n().optional(),parentAgentId:n().optional(),rootId:n().optional(),depth:t().optional(),sessionId:n().optional(),scope:n().optional(),state:n().optional(),elapsedMs:t().optional()}).partial()}),u({type:`agent_progress`,description:`Agent 实时进度(派生行,零 LLM 成本)`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`AgentRunner 包装 onProgress 节流(≥1s 或轮次变化穿透)后 emit;data 携带 agentId/toolCallId/iteration{current,max}/tools{current,recent}/lastContent/elapsedMs`,schema:i({agentId:n(),toolCallId:n().optional(),iteration:i({current:t(),max:t().optional()}).optional(),tools:i({current:n().optional(),recent:a(n()).optional()}).optional(),lastContent:n().optional(),elapsedMs:t().optional(),totalTokens:t().optional()}).partial()}),u({type:`agent_completed`,description:`Agent 正常完成`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`AgentRunner endLifecycle(status=completed)时 emit`,schema:i({agentId:n(),toolCallId:n().optional(),scope:n().optional(),state:n().optional(),elapsedMs:t().optional()}).partial()}),u({type:`agent_cancelled`,description:`Agent 被用户/控制面停止(partial result 已返回)`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`AgentRunner endLifecycle(status=cancelled)时 emit;detail 携带停止原因。语义 = 停止工作、整理已有发现,partial result 已随工具结果回传父 agent`,schema:i({agentId:n(),toolCallId:n().optional(),scope:n().optional(),state:n().optional(),elapsedMs:t().optional(),detail:n().optional()}).partial()}),u({type:`agent_failed`,description:`Agent 失败/超时/被硬杀`,category:`system`,emittedBy:[`core`],handledByCli:!0,handledByWeb:!0,note:`AgentRunner endLifecycle(status=error/timeout/max_iterations/budget_exceeded)或 kill 时 emit;error 携带原因`,schema:i({agentId:n(),toolCallId:n().optional(),scope:n().optional(),state:n().optional(),elapsedMs:t().optional(),error:n().optional()}).partial()})]);var re=e([`info`,`action_required`,`error`]),g={threadId:n(),runId:n().optional(),alias:n().optional(),severity:re.optional(),dedupKey:n().optional()};p([u({type:`thread_started`,description:`Thread 开始执行`,category:`thread`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`P0-A 立契约;P1 由 ThreadScheduler 发射。replyMode:batch,不进 outbox(易失可接受)`,schema:i({...g,source:n().optional(),model:n().optional(),branch:n().optional(),worktreePath:n().optional(),cwd:n().optional()}).partial()}),u({type:`thread_progress`,description:`Thread 中间进度(派生行,零 LLM 成本)`,category:`thread`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`P0-A 立契约;P1 由 RuntimeNotification 经 dispatcher 出口发射。⚠️ payload 摘要必须自带上界 ≤600 字符(对齐 goalNotifier.MAX_RESULT_CHARS),否则 batch 的 4000 字闸在合并多条后会立刻触发。replyMode:batch,不进 outbox`,schema:i({...g,summary:n().optional(),round:t().optional(),maxRounds:t().optional(),currentTool:n().optional(),elapsedMs:t().optional()}).partial()}),u({type:`thread_checkpoint`,description:`Thread 到达检查点(瞬态通知,**不是**状态)`,category:`thread`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`⚠️ 这是**通知事件**,不是 ThreadStatus 的取值(v9.1 §3.2(a):v9 曾把它写进状态枚举,导致 watcher 无法判断『还能不能 await』;处于 checkpoint 的 thread 实际仍是 RUNNING/PAUSED)`,schema:i({...g,checkpointId:n().optional(),label:n().optional(),resumable:s().optional()}).partial()}),u({type:`thread_completed`,description:`Thread 正常完成(全部 Run 终态)`,category:`thread`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`进 outbox + replyMode:immediate —— detach 后这是用户**唯一**的结果来源(v9.1 §10 约束②)`,schema:i({...g,summary:n().optional(),artifactCount:t().optional(),durationMs:t().optional()}).partial()}),u({type:`thread_failed`,description:`Thread 失败(Run 报错 / 审批超时且高风险 / 预算终止)`,category:`thread`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`进 outbox + replyMode:immediate(同 thread_completed,结果必须送达)`,schema:i({...g,error:n().optional(),reason:e([`run_error`,`approval_expired`,`budget_exceeded`,`interrupted`,`unknown`]).optional()}).partial()}),u({type:`thread_artifact`,description:`Thread 产出 Artifact(§3.4 的 Manifest 条目落定)`,category:`thread`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:"replyMode:batch。⚠️ `id` 逐次唯一、`logicalId` 跨版本稳定 —— 消费方按 logicalId 归组、按 id 溯源(v9.1 §3.4:只有 id+version 时语义二义)。接线进展(P0-C A2):**core 侧已有 emitter** —— 产者用 `register_thread_artifact` 登记,经 ArtifactManifest 落定后由宿主出口发出(artifactStore 自己不发,§10 约束①)。消费端:Web 的项目「库」面板(`scheduleLibraryRefresh`)订阅本事件去**重拉**,事件只作提示、内容以 `GET /api/projects/:id/library` 为准(400ms 合并窗口,库未打开时零请求);CLI 侧仍无消费方,故 `intentionalGap` 保持 true;payload.locator 刻意不含 `content`(schema 无此字段,且正文由 path/commit 指过去)",schema:i({...g,artifactId:n().optional(),logicalId:n().optional(),version:t().optional(),producerRunId:n().optional(),artifactType:e([`patch`,`test-report`,`decision`,`design`,`benchmark`]).optional(),status:e([`draft`,`pending_review`,`approved`,`published`,`deprecated`]).optional(),locator:i({commit:n().optional(),files:a(n()).optional(),path:n().optional(),messageIds:a(n()).optional()}).partial().optional()}).partial()}),u({type:`thread_cost`,description:`Thread 成本汇总(token / 轮次)`,category:`thread`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`replyMode:batch,不进 outbox。数据源 = provider 返回的 usage,与预算强制点(§3.5)同处采集,不重复埋点。预算按 **Run** 计数(Thread 1:N Run,retry 应重置预算)`,schema:i({...g,tokensIn:t().optional(),tokensOut:t().optional(),rounds:t().optional(),maxTokens:t().optional(),utilization:t().optional()}).partial()}),u({type:`approval_expired`,description:`审批单据已失效(重启 sweep 或 TTL 到期)`,category:`thread`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:"进 outbox + replyMode:immediate。作用是**清理悬空单据**:`permissions.ts` 的 pending Map 在内存,进程重启后 IM 侧那条『请回复 批准/拒绝』仍在,用户回复会落进『不认』分支 = 静默失败。发这条让它显式失效(v9.1 §8.2b)",schema:i({...g,approvalId:n().optional(),toolName:n().optional(),risk:n().optional(),expiredAt:n().optional(),cause:e([`ttl`,`restart`]).optional()}).partial()})]);var ie=e([`info`,`action_required`,`error`]),ae=[`task-terminal`,`goal-raised`,`review-resolved`,`approval-resolved`,`escalation-raised`,`user-message`,`heartbeat-stall`,`alarm`],_={projectKey:n(),pmThreadId:n().optional(),runId:n().optional(),severity:ie.optional(),dedupKey:n().optional()};p([u({type:`pm_started`,description:`项目经理开始值守(启用/恢复)`,category:`pm`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`replyMode:batch(⚠️ 目标口径,见文件头注②),不进 outbox。项目页据此渲染 PM 面板的『值守中』态`,schema:i({..._,enabledBy:e([`user`,`im`,`config`,`restart`]).optional()}).partial()}),u({type:`pm_wakeup`,description:`项目经理被唤醒(事件驱动 turn 开始)`,category:`pm`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`replyMode:batch(⚠️ 目标口径,见文件头注②),不进 outbox(高频易失)。默认层只展示一行『被 X 唤醒』,合并窗口细节走 debug 日志`,schema:i({..._,reason:e(ae).optional(),summary:n().optional()}).partial()}),u({type:`pm_report`,description:`项目经理进度汇报`,category:`pm`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`replyMode:batch(⚠️ 目标口径,见文件头注②),不进 outbox。IM 出向经 dispatcher(照 goalNotifier 模式);各摘要字段 ≤600 字符(文件头注③)`,schema:i({..._,title:n().optional(),progressSummary:n().optional(),blockers:n().optional(),nextAction:n().optional(),approvalsPending:t().optional(),route:i({kind:e([`answer`,`thread`,`goal`,`handoff`,`approval`,`session`]),refs:i({goalId:n().optional(),threadIds:a(n()).optional(),projectKey:n().optional()}).optional(),suggest:i({title:n(),seed:n().optional()}).optional(),reason:n()}).optional()}).partial()}),u({type:`pm_approval_requested`,description:`项目经理发起审批(L1 必审动作)`,category:`pm`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`replyMode:immediate(⚠️ 目标口径,见文件头注②:outbox 尚未实现)。action_required 不能被合并进 30s 窗口(v9.1 §10)。底层复用 escalation:escalationId 即 REST 裁决门 POST /api/threads/escalations/:id/resolve 的 id`,schema:i({..._,escalationId:n().optional(),title:n().optional(),summary:n().optional(),requestedAction:n().optional(),reason:e([`budget-exceeded`,`policy`,`external-send`]).optional()}).partial()}),u({type:`pm_approval_resolved`,description:`项目经理审批已决议(批准/拒绝)`,category:`pm`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`replyMode:immediate(⚠️ 目标口径,见文件头注②)。终态通知必须送达。决议同时触发 coordinatorWakeup(approval-resolved)唤醒 PM 继续或放弃`,schema:i({..._,escalationId:n().optional(),decision:e([`approved`,`rejected`]).optional(),comment:n().optional()}).partial()}),u({type:`pm_stopped`,description:`项目经理停止值守`,category:`pm`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`replyMode:immediate(⚠️ 目标口径,见文件头注②)。停止后不再唤醒;在跑 turn 自然结束;执行线程不受影响`,schema:i({..._,cause:e([`user`,`project-archived`,`error`]).optional()}).partial()}),u({type:`pm_duty_changed`,description:`全局值守经理(总经理)席位变更(选任/转回前台)`,category:`pm`,emittedBy:[`core`],handledByCli:!1,handledByWeb:!0,intentionalGap:!0,note:`replyMode:batch(⚠️ 目标口径,见文件头注②),不进 outbox。全局唯一席位的选任/清空(spec 2026-09-26);dutyProjectKey 为空 = 转回前台(席位空缺)。Web 经理名册据此翻转值守徽标`,schema:i({..._,dutyProjectKey:n().nullable().optional(),previousProjectKey:n().nullable().optional()}).partial()})]);var v=n().min(1).max(128).regex(/^[a-z][a-z0-9._-]*$/,`command id must match ^[a-z][a-z0-9._-]*$`);i({id:n().min(1).max(128),command:v,payload:o().optional(),timeoutMs:t().int().positive().max(3e5).optional(),sender:n().max(128).optional()}),i({success:s(),requestId:n(),command:v,result:o().optional(),error:n().optional(),durationMs:t().min(0).optional()});var oe=i({capability:v,command:v,description:n().max(500).optional(),provider:n().max(128).optional()});i({version:c(`1`),capabilities:a(oe)});var y=i({version:c(`1`),type:e([`ready`,`select`,`inspect`,`screenshot`,`highlight`,`command`,`event`]),requestId:n().min(1).max(128),payload:o().optional()}).passthrough();i({type:n().min(1).max(128).regex(/^[a-z][a-z0-9._-]*$/,`event type must match ^[a-z][a-z0-9._-]*$`),payload:o().optional(),source:n().max(128).optional(),timestamp:t().nonnegative().optional()}),i({type:c(`workspace_event`),sessionId:n().optional(),data:r([n(),y]).optional(),traceId:n().optional()});var se=d.map(e=>({eventType:e.type,description:e.description,category:e.category,emittedBy:e.emittedBy,handledByCli:e.handledByCli,handledByWeb:e.handledByWeb,...e.deprecated===void 0?{}:{deprecated:e.deprecated},...e.intentionalGap===void 0?{}:{intentionalGap:e.intentionalGap},...e.note===void 0?{}:{note:e.note}})),b=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`,`ultra`,`persistent`];b.filter(e=>e!==`ultra`&&e!==`persistent`);var x={off:`none`,disable:`none`,disabled:`none`,no:`none`,extra_high:`xhigh`,"extra-high":`xhigh`,extrahigh:`xhigh`,very_high:`xhigh`,"very-high":`xhigh`,x_high:`xhigh`,"x-high":`xhigh`,default:`medium`};new Set(b);function ce(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();if(t)return x[t]??t}function le(e){return e===`ultra`?`max`:e===`persistent`?`disabled`:e}var S=[`off`,`low`,`medium`,`high`,`extra_high`,`max`],ue={off:{level:`off`,wire:`none`,label:`OFF`,hint:`关闭思考(wire: none)`},low:{level:`low`,wire:`low`,label:`LOW`,hint:`最省 token,适合一句话就能答的活`},medium:{level:`medium`,wire:`medium`,label:`MED`,hint:`默认档(wire 上等价于不指定)`},high:{level:`high`,wire:`high`,label:`HIGH`,hint:`高:复杂重构、长链路排查`},extra_high:{level:`extra_high`,wire:`xhigh`,label:`XHIGH`,hint:`超高:难调试的并发/跨包改动`},max:{level:`max`,wire:`max`,label:`MAX`,hint:`最高:最难的问题,更慢也更贵`}};function C(e){return typeof e==`string`&&S.includes(e)}function de(e,t=`medium`){return C(e)?e:t}function fe(e){let t=ce(e);if(t===void 0)return;let n=le(t);if(n===`none`||n===`disabled`)return`off`;if(n===`minimal`||n===`low`)return`low`;if(n===`medium`)return`medium`;if(n===`high`)return`high`;if(n===`xhigh`)return`extra_high`;if(n===`max`)return`max`}function w(e,t){let n=S.indexOf(e)+t;return n<0?S[0]:n>=S.length?S[S.length-1]:S[n]}var T=[`waiting`,`review`,`working`,`paused`,`done`];function E(e){let t=new Map;for(let n of e){let e=t.get(n.logicalId);e?e.push(n):t.set(n.logicalId,[n])}let n=[...t.values()];for(let e of n)e.sort((e,t)=>t.version-e.version||(e.artifactId<t.artifactId?-1:+(e.artifactId>t.artifactId)));return n.sort((e,t)=>{let n=e[0]?.version??0,r=t[0]?.version??0;if(n!==r)return r-n;let i=e[0]?.logicalId??``,a=t[0]?.logicalId??``;return i<a?-1:+(i>a)}),n}function D(e){if(typeof e!=`string`)return;let t=e.trim().replace(/\\/g,`/`).replace(/\/{2,}/g,`/`);if(!t)return;let n=t.replace(/\/+$/,``);return n?/^[a-zA-Z]:$/.test(n)?`${n}/`:n:`/`}function O(e){return D(e)?.toLowerCase()}function k(e){if(!e)return;let t=e.replace(/\/+$/,``).split(`/`);return t[t.length-1]||e}function A(e){switch(e.group){case`waiting`:return`blocked`;case`review`:return`review`;case`working`:return e.status===`WAITING_COORDINATOR`?`coordinating`:e.status===`BLOCKED_CLAIM`?`claim-blocked`:`working`;case`paused`:return e.status===`INTERRUPTED`?`interrupted`:`paused`;case`done`:return e.status===`FAILED`?`failed`:e.status===`CANCELLED`?`cancelled`:`completed`;default:return}}function j(e){if(e.status===`WAITING_COORDINATOR`)return`waitingCoordinator`;if(e.status===`BLOCKED_CLAIM`)return`blockedClaim`;if(e.group===`waiting`)return`waitingApproval`;if(e.status===`INTERRUPTED`)return`interrupted`}function M(e,t=Date.now()){if(!e)return;let n=Date.parse(e);if(!Number.isFinite(n))return;let r=Math.floor(Math.max(0,t-n)/6e4);if(r<1)return`<1m`;if(r<60)return`${r}m`;let i=Math.floor(r/60);return i<24?`${i}h`:`${Math.floor(i/24)}d`}var N=`[A-Za-z0-9]{4,}`,P=RegExp(`(?<![A-Za-z0-9_])(th_${N})`),F=RegExp(`^th_${N}$`);function I(e){return F.test(e)}var L=`THREADS_DISABLED`,R=[{code:`zh`,name:`Simplified Chinese`,native:`简体中文`},{code:`en`,name:`English`,native:`English`},{code:`ja`,name:`Japanese`,native:`日本語`},{code:`ko`,name:`Korean`,native:`한국어`},{code:`de`,name:`German`,native:`Deutsch`},{code:`fr`,name:`French`,native:`Français`},{code:`es`,name:`Spanish`,native:`Español`},{code:`pt`,name:`Portuguese`,native:`Português`},{code:`ru`,name:`Russian`,native:`Русский`},{code:`it`,name:`Italian`,native:`Italiano`},{code:`ar`,name:`Arabic`,native:`العربية`},{code:`id`,name:`Indonesian`,native:`Bahasa Indonesia`}].map(e=>e.code);function z(e){return typeof e==`string`&&R.includes(e)}var B=[`1`];function V(e){return B.includes(e)}var H={maxFields:12,maxOptions:20,maxIdChars:40,maxTitleChars:120,maxSubmitLabelChars:20,maxLabelChars:60,maxHelpChars:200,maxPlaceholderChars:80,maxDescriptionChars:4e3,maxTextValueChars:2e4,maxAcceptChars:120,maxFiles:5,maxFileSizeMb:10,maxAnswerBytes:524288},pe=/^f-[0-9]{8}-[0-9]{1,6}$/;function U(e){return typeof e==`string`&&pe.test(e)}var me=`.agent/forms`,he=`.agent/uploads`;function ge(e){return`${he}/${e}`}var _e=[`text`,`textarea`,`number`,`select`,`multi`,`boolean`,`date`,`file`];function ve(e){switch(e.kind){case`number`:return null;case`boolean`:return!1;case`multi`:case`file`:return[];default:return``}}function ye(e){return e==null?!0:typeof e==`string`?e.trim()===``:Array.isArray(e)?e.length===0:!1}function be(e){return e.maxLength??H.maxTextValueChars}function xe(e){return e.maxSizeMb??H.maxFileSizeMb}var Se=[`native`],Ce=/^[A-Za-z_][A-Za-z0-9_]{0,39}$/,we=new Set(_e);function W(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function G(e){return typeof e==`number`&&Number.isFinite(e)}function Te(e){let t;try{t=JSON.parse(e)}catch{return{ok:!1,issues:[{code:`descriptor.not_json`}]}}return K(t)}function K(e){if(!W(e))return{ok:!1,issues:[{code:`descriptor.not_object`}]};let t=[];e.type!==`form`&&t.push({code:`descriptor.bad_type`,value:Q(e.type)});let n=e.renderer;typeof n==`string`&&Se.includes(n)||t.push({code:`descriptor.bad_renderer`,value:Q(n)});let r=e.version;typeof r==`string`&&V(r)||t.push({code:`descriptor.bad_version`,value:Q(r)});let i=e.source;if(!W(i))return t.push({code:`descriptor.bad_source`}),{ok:!1,issues:t};U(i.id)||t.push({code:`descriptor.bad_id`,value:Q(i.id)}),(typeof i.sessionId!=`string`||i.sessionId.trim()===``)&&t.push({code:`descriptor.bad_session`});let a=X(i.title,H.maxTitleChars,t),o=Z(i.description,H.maxDescriptionChars,`description`,t),s=Z(i.submitLabel,H.maxSubmitLabelChars,`submitLabel`,t),c=q(i.fields,t);if(t.length>0)return{ok:!1,issues:t};let l={id:i.id,sessionId:i.sessionId,title:a,fields:c};return o!==void 0&&(l.description=o),s!==void 0&&(l.submitLabel=s),{ok:!0,value:{type:`form`,renderer:n,version:`1`,source:l}}}function q(e,t){if(!Array.isArray(e)||e.length===0)return t.push({code:`descriptor.no_fields`}),[];e.length>H.maxFields&&t.push({code:`descriptor.too_many_fields`,limit:H.maxFields,actual:e.length});let n=[],r=new Set;return e.slice(0,H.maxFields).forEach((e,i)=>{let a=Ee(e,i,r,t);a&&n.push(a)}),n}function Ee(e,t,n,r){if(!W(e))return r.push({code:`descriptor.field_not_object`,fieldIndex:t}),null;let i=e.id;if(typeof i!=`string`||i.length>H.maxIdChars||!Ce.test(i))return r.push({code:`descriptor.bad_field_id`,fieldIndex:t,value:Q(i)}),null;if(n.has(i))return r.push({code:`descriptor.duplicate_field_id`,fieldId:i}),null;n.add(i);let a=e.kind;if(typeof a!=`string`||!we.has(a))return r.push({code:`descriptor.bad_kind`,fieldId:i,fieldIndex:t,value:Q(a)}),null;let o=X(e.label,H.maxLabelChars,r,i);if(o===null)return null;let s={id:i,label:o};e.required!==void 0&&(typeof e.required==`boolean`?s.required=e.required:r.push({code:`descriptor.bad_required`,fieldId:i}));let c=Z(e.help,H.maxHelpChars,`help`,r,i);c!==void 0&&(s.help=c);let l=Z(e.placeholder,H.maxPlaceholderChars,`placeholder`,r,i);switch(l!==void 0&&(s.placeholder=l),a){case`text`:return{...s,...J(e,i,r),kind:`text`};case`textarea`:return{...s,...J(e,i,r),kind:`textarea`};case`number`:return{...s,...De(e,i,r),kind:`number`};case`select`:return{...s,...Y(e,i,r),kind:`select`};case`multi`:return{...s,...Y(e,i,r),kind:`multi`};case`boolean`:return{...s,kind:`boolean`};case`date`:return{...s,kind:`date`};case`file`:return{...s,...Oe(e,i,r),kind:`file`}}}function J(e,t,n){let r=e.maxLength;return r===void 0?{}:!G(r)||r<=0||r>H.maxTextValueChars?(n.push({code:`descriptor.bad_limit`,fieldId:t,value:`maxLength`}),{}):{maxLength:Math.floor(r)}}function De(e,t,n){let r={};for(let i of[`min`,`max`,`step`]){let a=e[i];a!==void 0&&(!G(a)||i===`step`&&a<=0?n.push({code:`descriptor.bad_limit`,fieldId:t,value:i}):r[i]=a)}return r.min!==void 0&&r.max!==void 0&&r.min>r.max&&n.push({code:`descriptor.bad_limit`,fieldId:t,value:`min>max`}),r}function Y(e,t,n){let r=e.options;if(!Array.isArray(r)||r.length===0)return n.push({code:`descriptor.missing_options`,fieldId:t}),{options:[]};r.length>H.maxOptions&&n.push({code:`descriptor.too_many_options`,fieldId:t,limit:H.maxOptions,actual:r.length});let i=[],a=new Set;for(let e of r)typeof e!=`string`||e.trim()===``||e.length>H.maxLabelChars?n.push({code:`descriptor.bad_option`,fieldId:t,value:Q(e)}):a.has(e)?n.push({code:`descriptor.duplicate_option`,fieldId:t,value:e}):(a.add(e),i.push(e));return{options:i}}function Oe(e,t,n){let r={},i=e.accept;i!==void 0&&(typeof i!=`string`||i.length>H.maxAcceptChars?n.push({code:`descriptor.bad_file_limit`,fieldId:t,value:`accept`}):i.trim()!==``&&(r.accept=i));let a=e.maxSizeMb;return a!==void 0&&(!G(a)||a<=0||a>H.maxFileSizeMb?n.push({code:`descriptor.bad_file_limit`,fieldId:t,value:`maxSizeMb`}):r.maxSizeMb=a),r}function X(e,t,n,r){let i=r?{fieldId:r}:{};return typeof e!=`string`||e.trim()===``?(n.push({code:r===void 0?`descriptor.missing_title`:`descriptor.missing_label`,...i}),null):e.length>t?(n.push({code:r===void 0?`descriptor.title_too_long`:`descriptor.label_too_long`,...i,limit:t,actual:e.length}),null):e}function Z(e,t,n,r,i){if(typeof e==`string`&&e.trim()!==``){if(e.length>t)r.push({code:{description:`descriptor.description_too_long`,submitLabel:`descriptor.submit_label_too_long`,help:`descriptor.help_too_long`,placeholder:`descriptor.placeholder_too_long`}[n],...i?{fieldId:i}:{},limit:t,actual:e.length});else return e}}function Q(e){return typeof e==`string`?e.slice(0,80):e===null?`null`:e===void 0?`undefined`:typeof e==`number`||typeof e==`boolean`?String(e):Array.isArray(e)?`array`:typeof e}var ke=[`openai-chat-completions`,`openai-completions`,`openai-responses`,`anthropic-messages`,`codex-responses`,`claude-code`],Ae=[`mode_instruction`,`session_mentions`,`retry_instruction`,`system_stable`,`system_dynamic`,`memory_injection`,`session_memory_summary`,`pm_wakeup_context`,`thread_task_context`];function $(e){return typeof e==`string`&&Ae.includes(e)}function je(e){return $(e.kind)?!0:e.type===`system`&&typeof e.content==`string`&&e.content.trimStart().startsWith(`[Session Memory Summary]`)}se.map(e=>e.eventType);export{C as A,j as C,ue as D,S as E,de as O,O as S,k as T,P as _,K as a,I as b,xe as c,H as d,ge as f,T as g,L as h,Te as i,w as j,fe as k,ye as l,z as m,je as n,ve as o,U as p,$ as r,be as s,ke as t,me as u,M as v,A as w,D as x,E as y};
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Kr as t,_n as n}from"./icons-CYDRRPKW.js";import{t as r}from"./useTranslation-B-mfApCn.js";import{h as i}from"./ttsSettings-BwXYpDnk.js";import{s as a}from"./useConfirm-Da8iQ_DZ.js";import{D as o,E as s,O as c,j as l}from"./src-49LUQhkG.js";import{A as u,E as d,r as f}from"./settingsStore-Xqln0d91.js";import{I as p}from"./markdown-N5__3T-w.js";import{n as m}from"./websocket-BnDwh01e.js";function h(e){return(String(e??``).trim().toLowerCase().split(/[-_]/)[0]??``)||`en`}var g=e(t(),1),_={off:`chat.effortOff`,low:`chat.effortLow`,medium:`chat.effortMedium`,high:`chat.effortHigh`,extra_high:`chat.effortExtraHigh`,max:`chat.effortMax`},v={off:`text-dark-muted`,low:`text-accent-green`,medium:`text-accent-yellow`,high:`text-accent-red`,extra_high:`text-accent-purple`,max:`text-accent-blue`},y=Object.fromEntries(Object.keys(_).map(e=>[e,{labelKey:_[e],color:v[e]}])),b=p(),x=s.filter(e=>e!==`off`),S=s.length-1,C=(0,g.memo)(function({syncSession:e=!0}){let{t}=r(),u=f(e=>e.effort),d=c(u),p=y[d],h=s.indexOf(d),_=o[d],v=(0,g.useRef)(null),C=(0,g.useCallback)(t=>{if(f.getState().setEffort(t),!e)return;let n=i.getState().activeSessionId;n&&m.setSessionId(n),m.send({type:`effort_set`,sessionId:n??void 0,data:JSON.stringify({effort:t})})},[e]),w=(0,g.useCallback)(e=>{let t=e.shiftKey||e.altKey?-1:1,n=l(c(f.getState().effort),t);n!==d&&C(n)},[C,d]),T=(0,g.useRef)(0);(0,g.useEffect)(()=>{let e=v.current;if(!e)return;let t=e=>{let t=Math.abs(e.deltaY)>=Math.abs(e.deltaX)?e.deltaY:0;if(t===0||(e.preventDefault(),T.current+=t,Math.abs(T.current)<30))return;let n=T.current>0?1:-1;T.current=0,C(l(c(f.getState().effort),n>0?-1:1))};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[C]);let E=(0,g.useCallback)(e=>{let t=c(f.getState().effort),n=n=>{e.preventDefault(),C(l(t,n))};switch(e.key){case`ArrowUp`:case`ArrowRight`:n(1);break;case`ArrowDown`:case`ArrowLeft`:n(-1);break;case`Home`:e.preventDefault(),C(s[0]);break;case`End`:e.preventDefault(),C(s[S])}},[C]),D=[`${t(`chat.effort`)} ${h}/${S} · ${t(p.labelKey)} — ${_.hint}`,`wire: ${_.wire}${d===`medium`?` — ${t(`chat.effortImplicitHint`)}`:``}`,t(`chat.effortChipHint`)];return(0,b.jsxs)(`div`,{ref:v,role:`slider`,tabIndex:0,"data-testid":`effort-chip`,onClick:w,onKeyDown:E,title:D.join(`
2
- `),"aria-label":t(`chat.effortChipAria`,{level:t(p.labelKey)}),"aria-valuemin":0,"aria-valuemax":S,"aria-valuenow":h,"aria-valuetext":`${t(p.labelKey)} (${h}/${S})`,className:`flex h-8 shrink-0 cursor-pointer items-center gap-1 rounded-full border border-dark-border bg-dark-surface px-2.5 text-meta font-medium transition-colors outline-none select-none hover:bg-dark-hover focus-visible:ring-1 focus-visible:ring-accent-yellow/60`,children:[(0,b.jsx)(n,{size:12,className:a(`shrink-0`,p.color),"aria-hidden":`true`}),(0,b.jsx)(`span`,{className:a(`flex items-end gap-[2px]`,p.color),"aria-hidden":`true`,children:x.map((e,t)=>{let n=h>=t+1;return(0,b.jsx)(`span`,{onClick:t=>{t.stopPropagation(),C(e)},className:a(`w-[3px] rounded-sm transition-colors`,n?`bg-current`:`bg-dark-border hover:bg-dark-muted/60`),style:{height:5+t*2}},e)})}),(0,b.jsx)(`span`,{className:p.color,children:t(p.labelKey)})]})}),w=[{code:`en`,label:`English`,short:`EN`},{code:`zh`,label:`中文`,short:`中`},{code:`ja`,label:`日本語`,short:`JA`},{code:`ko`,label:`한국어`,short:`KO`},{code:`fr`,label:`Français`,short:`FR`},{code:`de`,label:`Deutsch`,short:`DE`},{code:`es`,label:`Español`,short:`ES`},{code:`ru`,label:`Русский`,short:`RU`},{code:`pt`,label:`Português`,short:`PT`},{code:`it`,label:`Italiano`,short:`IT`}],T=`dsc.stt.lang`,E=new Set(w.map(e=>e.code));function D(e){let t=(e??``).trim().toLowerCase();return E.has(t)?t:null}function O(e){return D(e)??`en`}function k(e){return w.find(t=>t.code===e)??{code:`en`,label:`English`,short:`EN`}}function A(e){return O(h(e))}function j(){try{let e=D(localStorage.getItem(T));if(e)return e}catch{}let e=d;try{e=u(f.getState().language)}catch{}return A(e)}function M(e){try{localStorage.setItem(T,e)}catch{}}export{k as a,j as i,O as n,C as o,M as r,y as s,w as t};