@saluzi/saluzi-edu 0.2.38 → 0.2.39

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.
@@ -0,0 +1 @@
1
+ @import "https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";@layer components;@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Poppins", system-ui, -apple-system, sans-serif;--font-serif:Georgia, "Times New Roman", serif;--font-mono:"JetBrains Mono", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-black:#000;--spacing:.25rem;--container-md:28rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--radius:.625rem;--font-display:"Poppins", sans-serif;--color-surface-3:#d4bfae;--color-text-primary:#372e37;--color-text-secondary:#737373;--color-background:#f0e0d3;--color-foreground:#372e37;--color-card:#e6d2c2;--color-primary:#7d5a8a;--color-primary-foreground:#f0e0d3;--color-secondary:#e6d2c2;--color-secondary-foreground:#372e37;--color-muted:#e6d2c2;--color-muted-foreground:#737373;--color-accent:#7d5a8a;--color-accent-foreground:#f0e0d3;--color-destructive:#4b1535;--color-border:#7d5a8a;--color-border-light:#e6d2c2;--color-ring:#7d5a8a}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html,body{background:var(--color-background);color:var(--color-text-primary);font-family:var(--font-sans);-webkit-font-smoothing:antialiased}*,:before,:after{border-color:var(--color-border)}}@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-2{left:calc(var(--spacing) * 2)}.left-4{left:calc(var(--spacing) * 4)}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-14{margin-bottom:calc(var(--spacing) * 14)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-full{width:100%;height:100%}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-16{height:calc(var(--spacing) * 16)}.h-\[46px\]{height:46px}.h-\[calc\(100vh-2rem\)\]{height:calc(100vh - 2rem)}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-\[200px\]{min-height:200px}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-full{width:100%}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[120px\]{min-width:120px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:50%}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-10{gap:calc(var(--spacing) * 10)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.self-start{align-self:flex-start}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:var(--radius)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-border{border-color:var(--color-border)}.border-border-light{border-color:var(--color-border-light)}.border-current{border-color:currentColor}.border-destructive{border-color:var(--color-destructive)}.border-muted-foreground\/30{border-color:#7373734d}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\/30{border-color:color-mix(in oklab, var(--color-muted-foreground) 30%, transparent)}}.border-primary{border-color:var(--color-primary)}.border-red-200{border-color:var(--color-red-200)}.border-transparent{border-color:#0000}.bg-accent{background-color:var(--color-accent)}.bg-background{background-color:var(--color-background)}.bg-background\/80{background-color:#f0e0d3cc}@supports (color:color-mix(in lab, red, red)){.bg-background\/80{background-color:color-mix(in oklab, var(--color-background) 80%, transparent)}}.bg-background\/90{background-color:#f0e0d3e6}@supports (color:color-mix(in lab, red, red)){.bg-background\/90{background-color:color-mix(in oklab, var(--color-background) 90%, transparent)}}.bg-background\/95{background-color:#f0e0d3f2}@supports (color:color-mix(in lab, red, red)){.bg-background\/95{background-color:color-mix(in oklab, var(--color-background) 95%, transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-card{background-color:var(--color-card)}.bg-destructive{background-color:var(--color-destructive)}.bg-muted{background-color:var(--color-muted)}.bg-muted\/40{background-color:#e6d2c266}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--color-muted) 40%, transparent)}}.bg-muted\/80{background-color:#e6d2c2cc}@supports (color:color-mix(in lab, red, red)){.bg-muted\/80{background-color:color-mix(in oklab, var(--color-muted) 80%, transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-secondary{background-color:var(--color-secondary)}.bg-surface-3{background-color:var(--color-surface-3)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-10{padding-inline:calc(var(--spacing) * 10)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.wrap-anywhere{overflow-wrap:anywhere}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-accent-foreground{color:var(--color-accent-foreground)}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-primary\/80{color:#7d5a8acc}@supports (color:color-mix(in lab, red, red)){.text-primary\/80{color:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.\[counter-increment\:line_0\]{counter-increment:line 0}.\[counter-reset\:line\]{counter-reset:line}@media (hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.before\:mr-4:before{content:var(--tw-content);margin-right:calc(var(--spacing) * 4)}.before\:inline-block:before{content:var(--tw-content);display:inline-block}.before\:w-4:before{content:var(--tw-content);width:calc(var(--spacing) * 4)}.before\:w-6:before{content:var(--tw-content);width:calc(var(--spacing) * 6)}.before\:text-right:before{content:var(--tw-content);text-align:right}.before\:font-mono:before{content:var(--tw-content);font-family:var(--font-mono)}.before\:text-\[13px\]:before{content:var(--tw-content);font-size:13px}.before\:text-muted-foreground\/50:before{content:var(--tw-content);color:#73737380}@supports (color:color-mix(in lab, red, red)){.before\:text-muted-foreground\/50:before{color:color-mix(in oklab, var(--color-muted-foreground) 50%, transparent)}}.before\:content-\[counter\(line\)\]:before{--tw-content:counter(line);content:var(--tw-content)}.before\:select-none:before{content:var(--tw-content);-webkit-user-select:none;user-select:none}.before\:\[counter-increment\:line\]:before{content:var(--tw-content);counter-increment:line}:is(.\*\:first\:mt-0>*):first-child{margin-top:calc(var(--spacing) * 0)}:is(.\*\:last\:mb-0>*):last-child{margin-bottom:calc(var(--spacing) * 0)}:is(.\*\:last\:after\:inline>*):last-child:after{content:var(--tw-content);display:inline}:is(.\*\:last\:after\:align-baseline>*):last-child:after{content:var(--tw-content);vertical-align:baseline}:is(.\*\:last\:after\:content-\(--streamdown-caret\)>*):last-child:after{--tw-content:var(--streamdown-caret);content:var(--tw-content)}@media (hover:hover){.hover\:bg-background:hover{background-color:var(--color-background)}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:bg-muted\/40:hover{background-color:#e6d2c266}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab, var(--color-muted) 40%, transparent)}}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-14{padding-inline:calc(var(--spacing) * 14)}.sm\:px-16{padding-inline:calc(var(--spacing) * 16)}.sm\:py-16{padding-block:calc(var(--spacing) * 16)}.sm\:py-20{padding-block:calc(var(--spacing) * 20)}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=64rem){.lg\:block{display:block}}@media (prefers-color-scheme:dark){.dark\:bg-\(--shiki-dark-bg\)\!{background-color:var(--shiki-dark-bg)!important}.dark\:text-\(--shiki-dark\)\!{color:var(--shiki-dark)!important}}.\[\&_svg\]\:h-auto svg{height:auto}.\[\&_svg\]\:w-auto svg{width:auto}.\[\&\>div\]\:h-full>div{height:100%}.\[\&\>div\]\:overflow-hidden>div{overflow:hidden}.\[\&\>p\]\:inline>p{display:inline}li .\[li_\&\]\:pl-6{padding-left:calc(var(--spacing) * 6)}}.dark{--color-surface-0:#1a1917;--color-surface-1:#222120;--color-surface-2:#2c2a28;--color-surface-3:#3a3835;--color-text-primary:#efeee9;--color-text-secondary:#969088;--color-text-muted:#5e5a54;--color-bg-inverted:#f6f5f2;--color-text-inverted:#2c2a28;--color-border:#3a3835;--color-border-light:#2c2a28;--color-background:#1a1917;--color-foreground:#efeee9;--color-card:#222120;--color-card-foreground:#efeee9;--color-popover:#1a1917;--color-popover-foreground:#efeee9;--color-primary:#7d5a8a;--color-primary-foreground:#efeee9;--color-secondary:#2c2a28;--color-secondary-foreground:#efeee9;--color-muted:#2c2a28;--color-muted-foreground:#969088;--color-accent:#7d5a8a;--color-accent-foreground:#efeee9;--color-destructive:#4b1535;--color-input:#3a3835;--color-ring:#7d5a8a}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-surface-3);border-radius:3px}.chapter-content{font-family:var(--font-sans);color:var(--color-text-primary);font-size:1.0625rem;line-height:1.75}.chapter-content p,.chapter-content ul,.chapter-content ol,.chapter-content blockquote,.chapter-content pre,.chapter-content table,.chapter-content hr,.chapter-content img{margin-top:1.25rem;margin-bottom:1.25rem}.chapter-content>:first-child,.chapter-content>div>:first-child{margin-top:0}.chapter-content>:last-child,.chapter-content>div>:last-child{margin-bottom:0}.chapter-content h1,.chapter-content h2,.chapter-content h3,.chapter-content h4,.chapter-content h5,.chapter-content h6{font-family:var(--font-display);letter-spacing:-.015em;color:var(--color-text-primary);margin-top:2.5rem;margin-bottom:1rem;font-weight:600;line-height:1.3}.chapter-content h1{margin-top:0;font-size:1.875rem}.chapter-content h2{border-bottom:1px solid var(--color-border-light);padding-bottom:.5rem;font-size:1.5rem}.chapter-content h3{font-size:1.25rem}.chapter-content h4{font-size:1.125rem}.chapter-content p{line-height:1.75}.chapter-content a{color:var(--color-primary);border-bottom:1px solid #0000;text-decoration:none;transition:border-color .2s}.chapter-content a:hover{border-bottom-color:var(--color-primary)}.chapter-content strong{color:var(--color-text-primary);font-weight:600}.chapter-content em{font-style:italic}.chapter-content ul,.chapter-content ol{padding-left:1.5rem}.chapter-content ul{list-style:outside}.chapter-content ol{list-style:decimal}.chapter-content li{margin-top:.5rem;margin-bottom:.5rem;line-height:1.7}.chapter-content li::marker{color:var(--color-primary)}.chapter-content blockquote{border-left:3px solid var(--color-primary);color:var(--color-text-secondary);padding:.5rem 0 .5rem 1.25rem;font-style:italic}.chapter-content code{font-family:var(--font-mono);background:var(--color-muted);color:var(--color-primary);border-radius:.375rem;padding:.125rem .375rem;font-size:.875em;font-weight:500}.chapter-content pre{background:var(--color-card);border:1px solid var(--color-border-light);border-radius:.75rem;padding:1.25rem 1.5rem;font-size:.875rem;line-height:1.6;overflow-x:auto}.chapter-content pre code{color:inherit;font-weight:inherit;background:0 0;border-radius:0;padding:0}.chapter-content pre code>span:last-child:empty{display:none}.chapter-content table{border-collapse:collapse;width:100%;font-size:.9375rem}.chapter-content th{text-align:left;font-family:var(--font-display);color:var(--color-text-primary);border-bottom:2px solid var(--color-primary);background:var(--color-muted);padding:.75rem 1rem;font-weight:600}.chapter-content td{border-bottom:1px solid var(--color-border-light);color:var(--color-text-primary);vertical-align:top;padding:.75rem 1rem}.chapter-content tr:hover td{background:var(--color-muted)}.chapter-content hr{border:none;border-top:1px solid var(--color-border-light)}.chapter-content img{border-radius:.625rem;max-width:100%;height:auto}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/streamdown-nMT_aKRc.js","assets/rolldown-runtime-S-ySWqyJ.js","assets/shiki-CMaUdEs0.js"])))=>i.map(i=>d[i]);
2
- import{c as e,l as t,o as n,s as r}from"./streamdown-nMT_aKRc.js";import{t as i}from"./vendor-BU1MXatO.js";import{Ja as a}from"./shiki-CMaUdEs0.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var o=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),s=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),c=e=>{let t=s(e);return t.charAt(0).toUpperCase()+t.slice(1)},l=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),u=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},d={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},f=t(),p=(0,f.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,f.createElement)(`svg`,{ref:c,...d,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:l(`lucide`,i),...!a&&!u(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,f.createElement)(e,t)),...Array.isArray(a)?a:[a]])),m=(e,t)=>{let n=(0,f.forwardRef)(({className:n,...r},i)=>(0,f.createElement)(p,{ref:i,iconNode:t,className:l(`lucide-${o(c(e))}`,`lucide-${e}`,n),...r}));return n.displayName=c(e),n},h=m(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]),g=m(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),_=m(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),v=m(`monitor`,[[`rect`,{width:`20`,height:`14`,x:`2`,y:`3`,rx:`2`,key:`48i651`}],[`line`,{x1:`8`,x2:`16`,y1:`21`,y2:`21`,key:`1svkeh`}],[`line`,{x1:`12`,x2:`12`,y1:`17`,y2:`21`,key:`vw1qmm`}]]),ee=m(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),y=m(`sun`,[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]),b=i();function x(...t){return r(e(t))}var S=n();function C({navigation:e,selected:t,onSelect:n,onHome:r}){return(0,S.jsxs)(`nav`,{className:`flex h-full w-64 flex-col border-r border-border bg-card`,children:[(0,S.jsx)(`div`,{className:`border-b border-border px-4 py-3`,children:(0,S.jsxs)(`button`,{type:`button`,onClick:()=>r?.(),title:`返回首页`,className:`block text-left transition-opacity hover:opacity-80`,children:[(0,S.jsx)(`h1`,{className:`font-display text-lg font-bold `+(t===null?`text-primary`:`text-primary/80`),children:`Saluzi Guide`}),(0,S.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`使用指南`})]})}),(0,S.jsxs)(`div`,{className:`flex-1 overflow-y-auto px-2 py-2`,children:[(0,S.jsx)(w,{label:`命令字典`,isActive:t===`__commands__`,onClick:()=>n(`__commands__`)}),(0,S.jsx)(`div`,{className:`my-2 border-t border-border-light`}),e.map(e=>(0,S.jsx)(T,{group:e,selected:t,onSelect:n},e.group))]})]})}function w({label:e,isActive:t,onClick:n}){return(0,S.jsx)(`button`,{type:`button`,onClick:n,className:x(`w-full rounded-md px-3 py-1.5 text-left text-sm transition-colors`,t?`bg-primary text-primary-foreground`:`text-foreground hover:bg-muted`),children:e})}function T({group:e,selected:t,onSelect:n}){let[r,i]=(0,f.useState)(!0);return(0,S.jsxs)(`div`,{className:`mb-1`,children:[(0,S.jsxs)(`button`,{type:`button`,onClick:()=>i(e=>!e),className:`flex w-full items-center gap-1 px-2 py-1.5 text-left text-xs font-semibold uppercase text-muted-foreground hover:text-foreground`,children:[r?(0,S.jsx)(g,{className:`h-3 w-3`}):(0,S.jsx)(_,{className:`h-3 w-3`}),e.group]}),r?(0,S.jsx)(`div`,{className:`ml-2 border-l border-border-light pl-2`,children:E(e.pages).map(e=>(0,S.jsx)(w,{label:e.title??e.path??``,isActive:t===e.path,onClick:()=>e.path&&n(e.path)},e.path))}):null]})}function E(e){let t=[];for(let n of e)n.path?t.push({title:n.title??n.path,path:n.path}):n.pages?t.push(...E(n.pages)):n.group&&t.push({title:n.group,path:void 0});return t}var D=`saluzi-guide-theme`;function O(){return typeof window>`u`?`light`:window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function k(){return typeof window>`u`?`system`:localStorage.getItem(D)??`system`}function A(e){let t=e===`system`?O():e,n=document.documentElement;n.classList.remove(`light`,`dark`),n.classList.add(t)}function j(){let[e,t]=(0,f.useState)(k);return(0,f.useEffect)(()=>{A(e),e===`system`?localStorage.removeItem(D):localStorage.setItem(D,e)},[e]),(0,f.useEffect)(()=>{if(e!==`system`)return;let t=window.matchMedia(`(prefers-color-scheme: dark)`),n=()=>A(`system`);return t.addEventListener(`change`,n),()=>t.removeEventListener(`change`,n)},[e]),{theme:e,setTheme:t,resolved:e===`system`?O():e}}function M(){let{theme:e,setTheme:t}=j();return(0,S.jsx)(`div`,{className:`inline-flex items-center gap-1 rounded-md border border-border bg-card p-1`,children:[{id:`light`,icon:y,label:`Light`},{id:`dark`,icon:ee,label:`Dark`},{id:`system`,icon:v,label:`Auto`}].map(({id:n,icon:r,label:i})=>(0,S.jsx)(`button`,{type:`button`,onClick:()=>t(n),"aria-label":i,"aria-pressed":e===n,className:x(`inline-flex h-7 w-7 items-center justify-center rounded-sm transition-colors`,e===n?`bg-primary text-primary-foreground`:`text-muted-foreground hover:text-foreground`),children:(0,S.jsx)(r,{className:`h-4 w-4`})},n))})}var N=[{id:`login`,step:1,title:`首次登录`,commands:[`/login`],description:`登录 Saluzi 账户或设置 API Key`,chapterPath:`docs/guide/getting-started`},{id:`model`,step:2,title:`选择与切换模型`,commands:[`/model`,`/effort`,`/mom`],description:`切换 Max/Pro/Std,调节推理深度,使用 MOM 混合模型`,chapterPath:`docs/guide/model-selection`},{id:`conversation`,step:3,title:`对话基础与多轮交互`,commands:[`/compact`,`/resume`,`/rewind`,`/export`],description:`第一次提问、多轮对话、流式输出、对话压缩与导出恢复`,chapterPath:`docs/guide/conversation-basics`},{id:`commit`,step:4,title:`查看与提交代码`,commands:[`/diff`,`/commit`,`/commit-push-pr`],description:`预览改动、提交、推送并创建 PR 一条龙`,chapterPath:`docs/guide/commit-workflow`},{id:`context`,step:5,title:`上下文与项目记忆`,commands:[`/add-dir`,`/memory`,`/compact`],description:`挂载目录、SALUZI.md 项目记忆、个人偏好,让 AI 更懂你的项目`,chapterPath:`docs/guide/context-tips`},{id:`cost`,step:6,title:`查看消耗`,commands:[`/cost`,`/stats`],description:`当前会话花费与历史统计`,chapterPath:`docs/guide/cost-usage`},{id:`troubleshoot`,step:7,title:`排障`,commands:[`/doctor`,`/help`,`/permissions`,`/plan`],description:`诊断安装、查命令、调整权限、规划模式`,chapterPath:`docs/guide/troubleshooting`},{id:`advanced`,step:8,title:`进阶探索:CodeGraph`,commands:[`/codegraph`],description:`本地代码知识图谱,符号搜索、调用链追踪、影响分析`,chapterPath:`docs/guide/codegraph`}];function P({workflow:e,onSelect:t}){return(0,S.jsxs)(`button`,{type:`button`,onClick:()=>e.chapterPath&&t?.(e.chapterPath),className:x(`group flex w-full flex-col gap-2 rounded-xl border border-border bg-card p-5 text-left`,`transition-shadow hover:shadow-md`,!e.chapterPath&&`cursor-default`),disabled:!e.chapterPath,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,S.jsx)(`span`,{className:`inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-primary text-sm font-semibold text-primary-foreground`,children:e.step}),(0,S.jsx)(`h3`,{className:`font-display text-base font-semibold text-foreground`,children:e.title}),e.chapterPath&&(0,S.jsx)(h,{className:`ml-auto h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-1`})]}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:e.commands.map(e=>(0,S.jsx)(`code`,{className:`rounded-md border border-border-light bg-background px-2 py-0.5 font-mono text-xs text-foreground`,children:e},e))})]})}function F({command:e}){let t=e.descriptionZh||e.description||`—`;return(0,S.jsxs)(`div`,{className:`flex flex-col gap-1.5 rounded-lg border border-border bg-card p-4`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,S.jsxs)(`code`,{className:`font-mono text-sm font-semibold text-primary`,children:[`/`,e.name]}),e.aliases?.length?(0,S.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`alias: `,e.aliases.map(e=>`/${e}`).join(`, `)]}):null]}),(0,S.jsx)(`p`,{className:`text-sm text-foreground`,children:t})]})}function I(){return(0,S.jsxs)(`div`,{className:`parade-preview-root`,style:{margin:`24px 0`},children:[(0,S.jsx)(`style`,{children:L}),(0,S.jsxs)(`div`,{className:`pp-window`,children:[(0,S.jsx)(`div`,{className:`pp-cube-stage`,children:(0,S.jsx)(`div`,{className:`pp-cube`})}),(0,S.jsxs)(`div`,{className:`pp-panel`,children:[(0,S.jsxs)(`div`,{className:`pp-counts-row`,children:[(0,S.jsx)(`span`,{className:`pp-running-count`,children:`2`}),(0,S.jsx)(`span`,{className:`pp-counts-sep`,children:`/`}),(0,S.jsxs)(`span`,{className:`pp-waiting-pill`,children:[(0,S.jsx)(`span`,{className:`pp-dot`}),`1`]})]}),(0,S.jsxs)(`div`,{className:`pp-sessions`,children:[(0,S.jsx)(`div`,{className:`pp-session-row`,children:`cli · coding auth module`}),(0,S.jsx)(`div`,{className:`pp-session-row`,children:`cli · review PR #42`}),(0,S.jsx)(`div`,{className:`pp-session-row pp-blocked`,children:`cli · waiting approval`})]}),(0,S.jsx)(`div`,{className:`pp-ws-status`})]})]}),(0,S.jsx)(`div`,{className:`pp-caption`,children:`示意图 · 实际数据来自当前会话`})]})}var L=`
2
+ import{c as e,l as t,o as n,s as r}from"./streamdown-nMT_aKRc.js";import{t as i}from"./vendor-BU1MXatO.js";import{Ja as a}from"./shiki-CMaUdEs0.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var o=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),s=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),c=e=>{let t=s(e);return t.charAt(0).toUpperCase()+t.slice(1)},l=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),u=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0},d={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},f=t(),p=(0,f.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,f.createElement)(`svg`,{ref:c,...d,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:l(`lucide`,i),...!a&&!u(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,f.createElement)(e,t)),...Array.isArray(a)?a:[a]])),m=(e,t)=>{let n=(0,f.forwardRef)(({className:n,...r},i)=>(0,f.createElement)(p,{ref:i,iconNode:t,className:l(`lucide-${o(c(e))}`,`lucide-${e}`,n),...r}));return n.displayName=c(e),n},h=m(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]),g=m(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),_=m(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),v=m(`monitor`,[[`rect`,{width:`20`,height:`14`,x:`2`,y:`3`,rx:`2`,key:`48i651`}],[`line`,{x1:`8`,x2:`16`,y1:`21`,y2:`21`,key:`1svkeh`}],[`line`,{x1:`12`,x2:`12`,y1:`17`,y2:`21`,key:`vw1qmm`}]]),ee=m(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),y=m(`sun`,[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]),b=i();function x(...t){return r(e(t))}var S=n();function C({navigation:e,selected:t,onSelect:n,onHome:r}){return(0,S.jsxs)(`nav`,{className:`flex h-full w-64 flex-col border-r border-border bg-card`,children:[(0,S.jsx)(`div`,{className:`flex h-16 items-center border-b border-border px-4`,children:(0,S.jsxs)(`button`,{type:`button`,onClick:()=>r?.(),title:`返回首页`,className:`block text-left transition-opacity hover:opacity-80`,children:[(0,S.jsx)(`h1`,{className:`font-display text-lg font-bold `+(t===null?`text-primary`:`text-primary/80`),children:`Saluzi Guide`}),(0,S.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`使用指南`})]})}),(0,S.jsxs)(`div`,{className:`flex-1 overflow-y-auto px-2 py-2`,children:[(0,S.jsx)(w,{label:`命令字典`,isActive:t===`__commands__`,onClick:()=>n(`__commands__`)}),(0,S.jsx)(`div`,{className:`my-2 border-t border-border-light`}),e.map(e=>(0,S.jsx)(T,{group:e,selected:t,onSelect:n},e.group))]})]})}function w({label:e,isActive:t,onClick:n}){return(0,S.jsx)(`button`,{type:`button`,onClick:n,className:x(`w-full rounded-md px-3 py-1.5 text-left text-sm transition-colors`,t?`bg-primary text-primary-foreground`:`text-foreground hover:bg-muted`),children:e})}function T({group:e,selected:t,onSelect:n}){let[r,i]=(0,f.useState)(!0);return(0,S.jsxs)(`div`,{className:`mb-1`,children:[(0,S.jsxs)(`button`,{type:`button`,onClick:()=>i(e=>!e),className:`flex w-full items-center gap-1 px-2 py-1.5 text-left text-xs font-semibold uppercase text-muted-foreground hover:text-foreground`,children:[r?(0,S.jsx)(g,{className:`h-3 w-3`}):(0,S.jsx)(_,{className:`h-3 w-3`}),e.group]}),r?(0,S.jsx)(`div`,{className:`ml-2 border-l border-border-light pl-2`,children:E(e.pages).map(e=>(0,S.jsx)(w,{label:e.title??e.path??``,isActive:t===e.path,onClick:()=>e.path&&n(e.path)},e.path))}):null]})}function E(e){let t=[];for(let n of e)n.path?t.push({title:n.title??n.path,path:n.path}):n.pages?t.push(...E(n.pages)):n.group&&t.push({title:n.group,path:void 0});return t}var D=`saluzi-guide-theme`;function O(){return typeof window>`u`?`light`:window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function k(){return typeof window>`u`?`system`:localStorage.getItem(D)??`system`}function A(e){let t=e===`system`?O():e,n=document.documentElement;n.classList.remove(`light`,`dark`),n.classList.add(t)}function j(){let[e,t]=(0,f.useState)(k);return(0,f.useEffect)(()=>{A(e),e===`system`?localStorage.removeItem(D):localStorage.setItem(D,e)},[e]),(0,f.useEffect)(()=>{if(e!==`system`)return;let t=window.matchMedia(`(prefers-color-scheme: dark)`),n=()=>A(`system`);return t.addEventListener(`change`,n),()=>t.removeEventListener(`change`,n)},[e]),{theme:e,setTheme:t,resolved:e===`system`?O():e}}function M(){let{theme:e,setTheme:t}=j();return(0,S.jsx)(`div`,{className:`inline-flex items-center gap-1 rounded-md border border-border bg-card p-1`,children:[{id:`light`,icon:y,label:`Light`},{id:`dark`,icon:ee,label:`Dark`},{id:`system`,icon:v,label:`Auto`}].map(({id:n,icon:r,label:i})=>(0,S.jsx)(`button`,{type:`button`,onClick:()=>t(n),"aria-label":i,"aria-pressed":e===n,className:x(`inline-flex h-7 w-7 items-center justify-center rounded-sm transition-colors`,e===n?`bg-primary text-primary-foreground`:`text-muted-foreground hover:text-foreground`),children:(0,S.jsx)(r,{className:`h-4 w-4`})},n))})}var N=[{id:`login`,step:1,title:`首次登录`,commands:[`/login`],description:`登录 Saluzi 账户或设置 API Key`,chapterPath:`docs/guide/getting-started`},{id:`model`,step:2,title:`选择与切换模型`,commands:[`/model`,`/effort`,`/mom`],description:`切换 Max/Pro/Std,调节推理深度,使用 MOM 混合模型`,chapterPath:`docs/guide/model-selection`},{id:`conversation`,step:3,title:`对话基础与多轮交互`,commands:[`/compact`,`/resume`,`/rewind`,`/export`],description:`第一次提问、多轮对话、流式输出、对话压缩与导出恢复`,chapterPath:`docs/guide/conversation-basics`},{id:`commit`,step:4,title:`查看与提交代码`,commands:[`/diff`,`/commit`,`/commit-push-pr`],description:`预览改动、提交、推送并创建 PR 一条龙`,chapterPath:`docs/guide/commit-workflow`},{id:`context`,step:5,title:`上下文与项目记忆`,commands:[`/add-dir`,`/memory`,`/compact`],description:`挂载目录、SALUZI.md 项目记忆、个人偏好,让 AI 更懂你的项目`,chapterPath:`docs/guide/context-tips`},{id:`cost`,step:6,title:`查看消耗`,commands:[`/cost`,`/stats`],description:`当前会话花费与历史统计`,chapterPath:`docs/guide/cost-usage`},{id:`troubleshoot`,step:7,title:`排障`,commands:[`/doctor`,`/help`,`/permissions`,`/plan`],description:`诊断安装、查命令、调整权限、规划模式`,chapterPath:`docs/guide/troubleshooting`},{id:`advanced`,step:8,title:`进阶探索:CodeGraph`,commands:[`/codegraph`],description:`本地代码知识图谱,符号搜索、调用链追踪、影响分析`,chapterPath:`docs/guide/codegraph`}];function P({workflow:e,onSelect:t}){return(0,S.jsxs)(`button`,{type:`button`,onClick:()=>e.chapterPath&&t?.(e.chapterPath),className:x(`group flex w-full flex-col gap-2 rounded-xl border border-border bg-card p-5 text-left`,`transition-shadow hover:shadow-md`,!e.chapterPath&&`cursor-default`),disabled:!e.chapterPath,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,S.jsx)(`span`,{className:`inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-primary text-sm font-semibold text-primary-foreground`,children:e.step}),(0,S.jsx)(`h3`,{className:`font-display text-base font-semibold text-foreground`,children:e.title}),e.chapterPath&&(0,S.jsx)(h,{className:`ml-auto h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-1`})]}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:e.commands.map(e=>(0,S.jsx)(`code`,{className:`rounded-md border border-border-light bg-background px-2 py-0.5 font-mono text-xs text-foreground`,children:e},e))})]})}function F({command:e}){let t=e.descriptionZh||e.description||`—`;return(0,S.jsxs)(`div`,{className:`flex flex-col gap-1.5 rounded-lg border border-border bg-card p-4`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,S.jsxs)(`code`,{className:`font-mono text-sm font-semibold text-primary`,children:[`/`,e.name]}),e.aliases?.length?(0,S.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`alias: `,e.aliases.map(e=>`/${e}`).join(`, `)]}):null]}),(0,S.jsx)(`p`,{className:`text-sm text-foreground`,children:t})]})}function I(){return(0,S.jsxs)(`div`,{className:`parade-preview-root`,style:{margin:`24px 0`},children:[(0,S.jsx)(`style`,{children:L}),(0,S.jsxs)(`div`,{className:`pp-window`,children:[(0,S.jsx)(`div`,{className:`pp-cube-stage`,children:(0,S.jsx)(`div`,{className:`pp-cube`})}),(0,S.jsxs)(`div`,{className:`pp-panel`,children:[(0,S.jsxs)(`div`,{className:`pp-counts-row`,children:[(0,S.jsx)(`span`,{className:`pp-running-count`,children:`2`}),(0,S.jsx)(`span`,{className:`pp-counts-sep`,children:`/`}),(0,S.jsxs)(`span`,{className:`pp-waiting-pill`,children:[(0,S.jsx)(`span`,{className:`pp-dot`}),`1`]})]}),(0,S.jsxs)(`div`,{className:`pp-sessions`,children:[(0,S.jsx)(`div`,{className:`pp-session-row`,children:`cli · coding auth module`}),(0,S.jsx)(`div`,{className:`pp-session-row`,children:`cli · review PR #42`}),(0,S.jsx)(`div`,{className:`pp-session-row pp-blocked`,children:`cli · waiting approval`})]}),(0,S.jsx)(`div`,{className:`pp-ws-status`})]})]}),(0,S.jsx)(`div`,{className:`pp-caption`,children:`示意图 · 实际数据来自当前会话`})]})}var L=`
3
3
  .parade-preview-root .pp-window {
4
4
  width: 100%;
5
5
  max-width: 320px;
@@ -164,4 +164,4 @@ import{c as e,l as t,o as n,s as r}from"./streamdown-nMT_aKRc.js";import{t as i}
164
164
  `,R=(0,f.lazy)(async()=>({default:(await a(()=>import(`./streamdown-nMT_aKRc.js`).then(e=>e.n),__vite__mapDeps([0,1,2]))).Streamdown}));function z(e){let t=e.split(`
165
165
  `),n=[],r=!1,i=``;for(let e=0;e<t.length;e++){let a=t[e],o=a.trim(),s=/^(`{3}|~{3})/.exec(o);if(s){r?o.startsWith(i.repeat(3))&&(r=!1,i=``):(r=!0,i=s[1][0]),n.push(a);continue}if(r){n.push(a);continue}if(o===``||/^#{1,6} /.test(o)||o.startsWith(`|`)||/^[-*+]\s/.test(o)||/^\d+\.\s/.test(o)||o.startsWith(`>`)||/^(-{3,}|\*{3,}|_{3,})$/.test(o)||o.startsWith("```")){n.push(a);continue}let c=(n[n.length-1]??``).trim();c!==``&&!/^#{1,6} /.test(c)&&!c.startsWith(`|`)&&!/^[-*+]\s/.test(c)&&!/^\d+\.\s/.test(c)&&!c.startsWith(`>`)&&!/^(-{3,}|\*{3,}|_{3,})$/.test(c)&&!c.startsWith("```")&&n.push(``),n.push(a)}return n.join(`
166
166
  `)}var B=`::parade-preview::`;function V(e){return e.replace(/[*_`~]/g,``).replace(/[^\p{L}\p{N}\s-]/gu,``).trim().toLowerCase().replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``)}function H(e){let t=e.split(`
167
- `),n=[],r=!1,i=``;for(let e of t){let t=e.trim(),a=/^(`{3}|~{3})/.exec(t);if(a){r?t.startsWith(i.repeat(3))&&(r=!1,i=``):(r=!0,i=a[1][0]);continue}if(r)continue;let o=/^(#{2,3})\s+(.+?)\s*$/.exec(t);if(!o)continue;let s=o[1].length,c=o[2],l=V(c);l&&n.push({level:s,text:c,slug:l})}let a=new Map;return n.map(e=>{let t=a.get(e.slug)??0;return a.set(e.slug,t+1),t===0?e:{...e,slug:`${e.slug}-${t}`}})}function U(e){let t=[],n=e.split(B);for(let e=0;e<n.length;e++)n[e]&&t.push({kind:`md`,content:z(n[e])}),e<n.length-1&&t.push({kind:`parade-preview`});return t}function W({chapter:e,path:t,onNavigate:n}){let r=e.frontmatter.title??t,i=(0,f.useRef)(null),a=(0,f.useRef)(null),[o,s]=(0,f.useState)(null),c=(0,f.useMemo)(()=>U(e.content.replace(/^\{\/\*[\s\S]*?\*\/\}\s*\n/gm,``).replace(/^\{\/\*[\s\S]*?\*\/\}/gm,``)),[e.content]),l=(0,f.useMemo)(()=>H(e.content),[e.content]);(0,f.useEffect)(()=>{if(!i.current||l.length===0)return;let e=i.current,t=()=>{e.querySelectorAll(`h2, h3`).forEach((e,t)=>{let n=l[t];n&&(e.id!==n.slug&&(e.id=n.slug),e.style.scrollMarginTop!==`5rem`&&(e.style.scrollMarginTop=`5rem`))})};t();let n=new MutationObserver(()=>t());return n.observe(e,{childList:!0,subtree:!0}),()=>n.disconnect()},[l,c]),(0,f.useEffect)(()=>{if(!i.current)return;let e=i.current.parentElement;for(;e&&getComputedStyle(e).overflowY!==`auto`;)e=e.parentElement;a.current=e},[]),(0,f.useEffect)(()=>{let e=a.current;if(!e||l.length===0)return;let t=()=>{let t=e.scrollTop,n=null;for(let e of l){let r=document.getElementById(e.slug);if(r)if(r.offsetTop-120<=t)n=e;else break}s(n?.slug??null)};return t(),e.addEventListener(`scroll`,t,{passive:!0}),()=>e.removeEventListener(`scroll`,t)},[l]);function u(e){if(!n)return null;if(e.startsWith(`docs/`))return e;let r=e.replace(/^(?:\.\.\/|\.\/|\/)+/,``);return r=r.replace(/\.(md|mdx)$/,``),r?`${t.split(`/`).slice(0,-1).join(`/`)}/${r}`:null}function d(e){if(!n)return;let t=e.target.closest(`a`);if(!t)return;let r=t.getAttribute(`href`);if(!r||/^(https?:|mailto:|#)/.test(r))return;let i=u(r);i&&(e.preventDefault(),n(i))}function p(e){let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:`smooth`,block:`start`}),s(e);return}let n=0,r=window.setInterval(()=>{n+=1;let t=document.getElementById(e);t?(window.clearInterval(r),t.scrollIntoView({behavior:`smooth`,block:`start`}),s(e)):n>=20&&window.clearInterval(r)},50)}let m=l.length>=2;return(0,S.jsx)(`div`,{className:`mx-auto max-w-5xl px-6 py-12 sm:px-10 sm:py-16`,children:(0,S.jsxs)(`div`,{className:`flex gap-10`,children:[(0,S.jsxs)(`article`,{ref:i,className:`min-w-0 max-w-2xl flex-1 px-2 sm:px-4`,onClick:d,children:[(0,S.jsxs)(`header`,{className:`mb-12 border-b border-border pb-8`,children:[(0,S.jsx)(`h1`,{className:`font-display text-4xl font-bold leading-tight tracking-tight text-foreground`,children:r}),e.frontmatter.description?(0,S.jsx)(`p`,{className:`mt-4 font-serif text-lg leading-relaxed text-muted-foreground`,children:e.frontmatter.description}):null,e.frontmatter.keywords?.length?(0,S.jsx)(`div`,{className:`mt-6 flex flex-wrap gap-2`,children:e.frontmatter.keywords.map(e=>(0,S.jsx)(`span`,{className:`rounded-full border border-border-light bg-muted px-3 py-1 text-xs font-medium text-muted-foreground`,children:e},e))}):null]}),(0,S.jsx)(`div`,{className:`chapter-content max-w-none`,children:(0,S.jsx)(f.Suspense,{fallback:(0,S.jsx)(`div`,{className:`py-8 text-sm text-muted-foreground`,children:`Loading content…`}),children:c.map((e,t)=>e.kind===`parade-preview`?(0,S.jsx)(I,{},`pp-${t}`):(0,S.jsx)(R,{children:e.content},`md-${t}`))})})]}),m?(0,S.jsx)(`aside`,{className:`sticky top-4 hidden h-[calc(100vh-2rem)] w-56 shrink-0 self-start overflow-y-auto lg:block`,children:(0,S.jsxs)(`nav`,{"aria-label":`章节目录`,children:[(0,S.jsx)(`p`,{className:`mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground`,children:`本章目录`}),(0,S.jsx)(`ul`,{className:`space-y-1 border-l border-border-light`,children:l.map(e=>{let t=o===e.slug;return(0,S.jsx)(`li`,{className:e.level===3?`ml-3`:``,children:(0,S.jsx)(`button`,{type:`button`,onClick:()=>p(e.slug),className:`block w-full border-l-2 py-1 pl-3 text-left text-xs leading-relaxed transition-colors `+(t?`border-primary text-primary`:`border-transparent text-muted-foreground hover:text-foreground`),style:{marginLeft:`-1px`},children:e.text})},e.slug)})})]})}):null]})})}var G=null;async function K(){if(G)return G;let e=await fetch(`./guide-data.json`);if(!e.ok)throw Error(`Failed to load guide-data.json: ${e.status}`);return G=await e.json(),G}function q(){let e=window.location.hash.replace(/^#\/?/,``);return e?e===`commands`?{kind:`commands`}:{kind:`chapter`,path:e}:{kind:`home`}}function J(e){return e.kind===`home`?`#/`:e.kind===`commands`?`#/commands`:`#/${e.path}`}function Y(){let[e,t]=(0,f.useState)(null),[n,r]=(0,f.useState)(null),[i,a]=(0,f.useState)(()=>q());if((0,f.useEffect)(()=>{K().then(t).catch(e=>r(e.message??String(e)))},[]),(0,f.useEffect)(()=>{let e=()=>a(q());return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[]),n)return(0,S.jsx)(`div`,{className:`flex h-screen items-center justify-center`,children:(0,S.jsxs)(`div`,{className:`max-w-md rounded-xl border border-destructive bg-card p-8 text-center`,children:[(0,S.jsx)(`h1`,{className:`font-display text-xl font-bold text-destructive`,children:`加载失败`}),(0,S.jsx)(`p`,{className:`mt-3 text-sm text-muted-foreground`,children:n}),(0,S.jsxs)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:[`请确认 guide-data.json 已生成(运行 `,(0,S.jsx)(`code`,{children:`npm run build:guide`}),`)。`]})]})});if(!e)return(0,S.jsx)(`div`,{className:`flex h-screen items-center justify-center text-muted-foreground`,children:`Loading guide…`});let o=e=>{let t=e===`__commands__`?{kind:`commands`}:{kind:`chapter`,path:e},n=J(t);window.location.hash!==n&&window.history.pushState(null,``,n),a(t)};return(0,S.jsxs)(`div`,{className:`flex h-screen w-screen overflow-hidden bg-background text-foreground`,children:[(0,S.jsx)(C,{navigation:e.navigation,selected:i.kind===`chapter`?i.path:i.kind===`commands`?`__commands__`:null,onSelect:o,onHome:()=>{let e=J({kind:`home`});window.location.hash!==e&&window.history.pushState(null,``,e),a({kind:`home`})}}),(0,S.jsxs)(`main`,{className:`flex flex-1 flex-col overflow-hidden`,children:[(0,S.jsx)(`header`,{className:`flex items-center justify-end border-b border-border bg-background/80 px-8 py-4 backdrop-blur-sm`,children:(0,S.jsx)(M,{})}),(0,S.jsx)(`div`,{className:`flex-1 overflow-y-auto`,children:i.kind===`home`?(0,S.jsx)(X,{data:e,onSelect:o}):i.kind===`commands`?(0,S.jsx)(Z,{data:e}):(0,S.jsx)(Q,{data:e,path:i.path,onSelect:o})})]})]})}function X({data:e,onSelect:t}){return(0,S.jsxs)(`div`,{className:`mx-auto max-w-5xl px-10 py-16 sm:px-16 sm:py-20`,children:[(0,S.jsxs)(`header`,{className:`mb-16`,children:[(0,S.jsx)(`p`,{className:`mb-3 text-xs font-semibold uppercase tracking-[0.2em] text-primary`,children:`Saluzi Guide`}),(0,S.jsx)(`h1`,{className:`font-display text-5xl font-bold leading-tight tracking-tight text-foreground`,children:`使用指南`}),(0,S.jsx)(`p`,{className:`mt-5 max-w-2xl font-serif text-lg leading-relaxed text-muted-foreground`,children:`Terminal-native agentic coding system · 终端原生的 AI 编程系统。 从新手入门到 Saluzi 特色,按你的节奏探索。`})]}),(0,S.jsxs)(`section`,{className:`mb-20`,children:[(0,S.jsxs)(`div`,{className:`mb-8 flex items-baseline justify-between border-b border-border pb-3`,children:[(0,S.jsx)(`h2`,{className:`font-display text-2xl font-semibold text-foreground`,children:`新手 Top 8 工作流`}),(0,S.jsx)(`span`,{className:`text-xs uppercase tracking-wider text-muted-foreground`,children:`按推荐顺序`})]}),(0,S.jsx)(`div`,{className:`grid grid-cols-1 gap-5 md:grid-cols-2`,children:N.map(e=>(0,S.jsx)(P,{workflow:e,onSelect:t},e.id))})]}),(0,S.jsxs)(`section`,{children:[(0,S.jsxs)(`div`,{className:`mb-8 flex items-baseline justify-between border-b border-border pb-3`,children:[(0,S.jsx)(`h2`,{className:`font-display text-2xl font-semibold text-foreground`,children:`Saluzi 特色`}),(0,S.jsx)(`span`,{className:`text-xs uppercase tracking-wider text-muted-foreground`,children:`saluzi 独有`})]}),(0,S.jsx)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-2`,children:e.navigation.find(e=>e.group===`Saluzi 特色`)?.pages.flatMap(e=>e.pages?e.pages:[e]).filter(e=>e.path).map(e=>(0,S.jsxs)(`button`,{type:`button`,onClick:()=>e.path&&t(e.path),className:`group flex items-center justify-between rounded-xl border border-border bg-card p-4 text-left transition-shadow hover:shadow-md`,children:[(0,S.jsx)(`span`,{className:`font-display text-base font-medium text-foreground`,children:e.title??e.path}),(0,S.jsx)(h,{className:`h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-1`})]},e.path))??null})]})]})}function Z({data:e}){return(0,S.jsxs)(`div`,{className:`mx-auto max-w-4xl px-10 py-16 sm:px-14 sm:py-20`,children:[(0,S.jsxs)(`header`,{className:`mb-14 border-b border-border pb-8`,children:[(0,S.jsx)(`p`,{className:`mb-3 text-xs font-semibold uppercase tracking-[0.2em] text-primary`,children:`Command Dictionary`}),(0,S.jsx)(`h1`,{className:`font-display text-4xl font-bold tracking-tight text-foreground`,children:`命令字典`}),(0,S.jsxs)(`p`,{className:`mt-4 font-serif text-base leading-relaxed text-muted-foreground`,children:[`按分类列出所有可用命令(共 `,Object.keys(e.commands).length,` 条)。每个卡片包含命令名称与描述,部分含别名。`]})]}),e.categories.map(e=>(0,S.jsxs)(`section`,{className:`mb-14`,children:[(0,S.jsx)(`h2`,{className:`mb-6 font-display text-xl font-semibold text-primary`,children:e.titleZh??e.title}),(0,S.jsx)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-2`,children:e.commands.map(e=>(0,S.jsx)(F,{command:e},e.name))})]},e.id))]})}function Q({data:e,path:t,onSelect:n}){let r=e.chapters[t];return r?(0,S.jsx)(W,{chapter:r,path:t,onNavigate:n}):(0,S.jsxs)(`div`,{className:`mx-auto max-w-2xl px-10 py-16`,children:[(0,S.jsx)(`h1`,{className:`font-display text-3xl font-bold text-foreground`,children:`未找到章节`}),(0,S.jsx)(`p`,{className:`mt-3 text-sm text-muted-foreground`,children:`该章节可能已移除或重命名。`})]})}var $=document.getElementById(`root`);if(!$)throw Error(`root element not found`);(0,b.createRoot)($).render((0,S.jsx)(f.StrictMode,{children:(0,S.jsx)(Y,{})}));
167
+ `),n=[],r=!1,i=``;for(let e of t){let t=e.trim(),a=/^(`{3}|~{3})/.exec(t);if(a){r?t.startsWith(i.repeat(3))&&(r=!1,i=``):(r=!0,i=a[1][0]);continue}if(r)continue;let o=/^(#{2,3})\s+(.+?)\s*$/.exec(t);if(!o)continue;let s=o[1].length,c=o[2],l=V(c);l&&n.push({level:s,text:c,slug:l})}let a=new Map;return n.map(e=>{let t=a.get(e.slug)??0;return a.set(e.slug,t+1),t===0?e:{...e,slug:`${e.slug}-${t}`}})}function U(e){let t=[],n=e.split(B);for(let e=0;e<n.length;e++)n[e]&&t.push({kind:`md`,content:z(n[e])}),e<n.length-1&&t.push({kind:`parade-preview`});return t}function W({chapter:e,path:t,onNavigate:n}){let r=e.frontmatter.title??t,i=(0,f.useRef)(null),a=(0,f.useRef)(null),[o,s]=(0,f.useState)(null),c=(0,f.useMemo)(()=>U(e.content.replace(/^\{\/\*[\s\S]*?\*\/\}\s*\n/gm,``).replace(/^\{\/\*[\s\S]*?\*\/\}/gm,``)),[e.content]),l=(0,f.useMemo)(()=>H(e.content),[e.content]);(0,f.useEffect)(()=>{if(!i.current||l.length===0)return;let e=i.current,t=()=>{e.querySelectorAll(`h2, h3`).forEach((e,t)=>{let n=l[t];n&&(e.id!==n.slug&&(e.id=n.slug),e.style.scrollMarginTop!==`5rem`&&(e.style.scrollMarginTop=`5rem`))})};t();let n=new MutationObserver(()=>t());return n.observe(e,{childList:!0,subtree:!0}),()=>n.disconnect()},[l,c]),(0,f.useEffect)(()=>{if(!i.current)return;let e=i.current.parentElement;for(;e&&getComputedStyle(e).overflowY!==`auto`;)e=e.parentElement;a.current=e},[]),(0,f.useEffect)(()=>{let e=a.current;if(!e||l.length===0)return;let t=()=>{let t=e.scrollTop,n=null;for(let e of l){let r=document.getElementById(e.slug);if(r)if(r.offsetTop-120<=t)n=e;else break}s(n?.slug??null)};return t(),e.addEventListener(`scroll`,t,{passive:!0}),()=>e.removeEventListener(`scroll`,t)},[l]);function u(e){if(!n)return null;if(e.startsWith(`docs/`))return e;let r=e.replace(/^(?:\.\.\/|\.\/|\/)+/,``);return r=r.replace(/\.(md|mdx)$/,``),r?`${t.split(`/`).slice(0,-1).join(`/`)}/${r}`:null}function d(e){if(!n)return;let t=e.target.closest(`a`);if(!t)return;let r=t.getAttribute(`href`);if(!r||/^(https?:|mailto:|#)/.test(r))return;let i=u(r);i&&(e.preventDefault(),n(i))}function p(e){let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:`smooth`,block:`start`}),s(e);return}let n=0,r=window.setInterval(()=>{n+=1;let t=document.getElementById(e);t?(window.clearInterval(r),t.scrollIntoView({behavior:`smooth`,block:`start`}),s(e)):n>=20&&window.clearInterval(r)},50)}let m=l.length>=2;return(0,S.jsx)(`div`,{className:`mx-auto max-w-5xl px-6 py-12 sm:px-10 sm:py-16`,children:(0,S.jsxs)(`div`,{className:`flex gap-10`,children:[(0,S.jsxs)(`article`,{ref:i,className:`min-w-0 max-w-2xl flex-1 px-2 sm:px-4`,onClick:d,children:[(0,S.jsxs)(`header`,{className:`mb-12 border-b border-border pb-8`,children:[(0,S.jsx)(`h1`,{className:`font-display text-4xl font-bold leading-tight tracking-tight text-foreground`,children:r}),e.frontmatter.description?(0,S.jsx)(`p`,{className:`mt-4 font-serif text-lg leading-relaxed text-muted-foreground`,children:e.frontmatter.description}):null,e.frontmatter.keywords?.length?(0,S.jsx)(`div`,{className:`mt-6 flex flex-wrap gap-2`,children:e.frontmatter.keywords.map(e=>(0,S.jsx)(`span`,{className:`rounded-full border border-border-light bg-muted px-3 py-1 text-xs font-medium text-muted-foreground`,children:e},e))}):null]}),(0,S.jsx)(`div`,{className:`chapter-content max-w-none`,children:(0,S.jsx)(f.Suspense,{fallback:(0,S.jsx)(`div`,{className:`py-8 text-sm text-muted-foreground`,children:`Loading content…`}),children:c.map((e,t)=>e.kind===`parade-preview`?(0,S.jsx)(I,{},`pp-${t}`):(0,S.jsx)(R,{children:e.content},`md-${t}`))})})]}),m?(0,S.jsx)(`aside`,{className:`sticky top-4 hidden h-[calc(100vh-2rem)] w-56 shrink-0 self-start overflow-y-auto lg:block`,children:(0,S.jsxs)(`nav`,{"aria-label":`章节目录`,children:[(0,S.jsx)(`p`,{className:`mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground`,children:`本章目录`}),(0,S.jsx)(`ul`,{className:`space-y-1 border-l border-border-light`,children:l.map(e=>{let t=o===e.slug;return(0,S.jsx)(`li`,{className:e.level===3?`ml-3`:``,children:(0,S.jsx)(`button`,{type:`button`,onClick:()=>p(e.slug),className:`block w-full border-l-2 py-1 pl-3 text-left text-xs leading-relaxed transition-colors `+(t?`border-primary text-primary`:`border-transparent text-muted-foreground hover:text-foreground`),style:{marginLeft:`-1px`},children:e.text})},e.slug)})})]})}):null]})})}var G=null;async function K(){if(G)return G;let e=await fetch(`./guide-data.json`);if(!e.ok)throw Error(`Failed to load guide-data.json: ${e.status}`);return G=await e.json(),G}function q(){let e=window.location.hash.replace(/^#\/?/,``);return e?e===`commands`?{kind:`commands`}:{kind:`chapter`,path:e}:{kind:`home`}}function J(e){return e.kind===`home`?`#/`:e.kind===`commands`?`#/commands`:`#/${e.path}`}function Y(){let[e,t]=(0,f.useState)(null),[n,r]=(0,f.useState)(null),[i,a]=(0,f.useState)(()=>q());if((0,f.useEffect)(()=>{K().then(t).catch(e=>r(e.message??String(e)))},[]),(0,f.useEffect)(()=>{let e=()=>a(q());return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[]),n)return(0,S.jsx)(`div`,{className:`flex h-screen items-center justify-center`,children:(0,S.jsxs)(`div`,{className:`max-w-md rounded-xl border border-destructive bg-card p-8 text-center`,children:[(0,S.jsx)(`h1`,{className:`font-display text-xl font-bold text-destructive`,children:`加载失败`}),(0,S.jsx)(`p`,{className:`mt-3 text-sm text-muted-foreground`,children:n}),(0,S.jsxs)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:[`请确认 guide-data.json 已生成(运行 `,(0,S.jsx)(`code`,{children:`npm run build:guide`}),`)。`]})]})});if(!e)return(0,S.jsx)(`div`,{className:`flex h-screen items-center justify-center text-muted-foreground`,children:`Loading guide…`});let o=e=>{let t=e===`__commands__`?{kind:`commands`}:{kind:`chapter`,path:e},n=J(t);window.location.hash!==n&&window.history.pushState(null,``,n),a(t)};return(0,S.jsxs)(`div`,{className:`flex h-screen w-screen overflow-hidden bg-background text-foreground`,children:[(0,S.jsx)(C,{navigation:e.navigation,selected:i.kind===`chapter`?i.path:i.kind===`commands`?`__commands__`:null,onSelect:o,onHome:()=>{let e=J({kind:`home`});window.location.hash!==e&&window.history.pushState(null,``,e),a({kind:`home`})}}),(0,S.jsxs)(`main`,{className:`flex flex-1 flex-col overflow-hidden`,children:[(0,S.jsx)(`header`,{className:`flex h-16 items-center justify-end border-b border-border bg-background/80 px-8 backdrop-blur-sm`,children:(0,S.jsx)(M,{})}),(0,S.jsx)(`div`,{className:`flex-1 overflow-y-auto`,children:i.kind===`home`?(0,S.jsx)(X,{data:e,onSelect:o}):i.kind===`commands`?(0,S.jsx)(Z,{data:e}):(0,S.jsx)(Q,{data:e,path:i.path,onSelect:o})})]})]})}function X({data:e,onSelect:t}){return(0,S.jsxs)(`div`,{className:`mx-auto max-w-5xl px-10 py-16 sm:px-16 sm:py-20`,children:[(0,S.jsxs)(`header`,{className:`mb-16`,children:[(0,S.jsx)(`p`,{className:`mb-3 text-xs font-semibold uppercase tracking-[0.2em] text-primary`,children:`Saluzi Guide`}),(0,S.jsx)(`h1`,{className:`font-display text-5xl font-bold leading-tight tracking-tight text-foreground`,children:`使用指南`}),(0,S.jsx)(`p`,{className:`mt-5 max-w-2xl font-serif text-lg leading-relaxed text-muted-foreground`,children:`Terminal-native agentic coding system · 终端原生的 AI 编程系统。 从新手入门到 Saluzi 特色,按你的节奏探索。`})]}),(0,S.jsxs)(`section`,{className:`mb-20`,children:[(0,S.jsxs)(`div`,{className:`mb-8 flex items-baseline justify-between border-b border-border pb-3`,children:[(0,S.jsx)(`h2`,{className:`font-display text-2xl font-semibold text-foreground`,children:`新手 Top 8 工作流`}),(0,S.jsx)(`span`,{className:`text-xs uppercase tracking-wider text-muted-foreground`,children:`按推荐顺序`})]}),(0,S.jsx)(`div`,{className:`grid grid-cols-1 gap-5 md:grid-cols-2`,children:N.map(e=>(0,S.jsx)(P,{workflow:e,onSelect:t},e.id))})]}),(0,S.jsxs)(`section`,{children:[(0,S.jsxs)(`div`,{className:`mb-8 flex items-baseline justify-between border-b border-border pb-3`,children:[(0,S.jsx)(`h2`,{className:`font-display text-2xl font-semibold text-foreground`,children:`Saluzi 特色`}),(0,S.jsx)(`span`,{className:`text-xs uppercase tracking-wider text-muted-foreground`,children:`saluzi 独有`})]}),(0,S.jsx)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-2`,children:e.navigation.find(e=>e.group===`Saluzi 特色`)?.pages.flatMap(e=>e.pages?e.pages:[e]).filter(e=>e.path).map(e=>(0,S.jsxs)(`button`,{type:`button`,onClick:()=>e.path&&t(e.path),className:`group flex items-center justify-between rounded-xl border border-border bg-card p-4 text-left transition-shadow hover:shadow-md`,children:[(0,S.jsx)(`span`,{className:`font-display text-base font-medium text-foreground`,children:e.title??e.path}),(0,S.jsx)(h,{className:`h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-1`})]},e.path))??null})]})]})}function Z({data:e}){return(0,S.jsxs)(`div`,{className:`mx-auto max-w-4xl px-10 py-16 sm:px-14 sm:py-20`,children:[(0,S.jsxs)(`header`,{className:`mb-14 border-b border-border pb-8`,children:[(0,S.jsx)(`p`,{className:`mb-3 text-xs font-semibold uppercase tracking-[0.2em] text-primary`,children:`Command Dictionary`}),(0,S.jsx)(`h1`,{className:`font-display text-4xl font-bold tracking-tight text-foreground`,children:`命令字典`}),(0,S.jsxs)(`p`,{className:`mt-4 font-serif text-base leading-relaxed text-muted-foreground`,children:[`按分类列出所有可用命令(共 `,Object.keys(e.commands).length,` 条)。每个卡片包含命令名称与描述,部分含别名。`]})]}),e.categories.map(e=>(0,S.jsxs)(`section`,{className:`mb-14`,children:[(0,S.jsx)(`h2`,{className:`mb-6 font-display text-xl font-semibold text-primary`,children:e.titleZh??e.title}),(0,S.jsx)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-2`,children:e.commands.map(e=>(0,S.jsx)(F,{command:e},e.name))})]},e.id))]})}function Q({data:e,path:t,onSelect:n}){let r=e.chapters[t];return r?(0,S.jsx)(W,{chapter:r,path:t,onNavigate:n}):(0,S.jsxs)(`div`,{className:`mx-auto max-w-2xl px-10 py-16`,children:[(0,S.jsx)(`h1`,{className:`font-display text-3xl font-bold text-foreground`,children:`未找到章节`}),(0,S.jsx)(`p`,{className:`mt-3 text-sm text-muted-foreground`,children:`该章节可能已移除或重命名。`})]})}var $=document.getElementById(`root`);if(!$)throw Error(`root element not found`);(0,b.createRoot)($).render((0,S.jsx)(f.StrictMode,{children:(0,S.jsx)(Y,{})}));
@@ -3023,18 +3023,21 @@
3023
3023
  },
3024
3024
  "docs/guide/mom-mixed-models": {
3025
3025
  "frontmatter": {
3026
- "title": "MOM 混合模型",
3027
- "description": "MOM(Mixture of Model)命令面板,配置多个顾问模型 + 一个主机模型,或运行一次性 MOM turn,实现模型混合调度。",
3026
+ "title": "MOM 混合模型 - 多模型协同决策与成本优化",
3027
+ "description": "MOM Saluzi 在一次对话里调度多个模型:mom-avg 并行多顾问 + 主机综合,mom-stair 弱模型先试、不够再升级。讲清何时该用 MOM、如何准确配置。",
3028
3028
  "keywords": [
3029
3029
  "MOM",
3030
3030
  "混合模型",
3031
3031
  "Mixture of Model",
3032
3032
  "多模型",
3033
3033
  "顾问",
3034
- "主机"
3034
+ "主机",
3035
+ "mom-avg",
3036
+ "mom-stair",
3037
+ "成本优化"
3035
3038
  ]
3036
3039
  },
3037
- "content": "\n## 什么是 MOM\n\nMOM(Mixture of Model)是 Saluzi 的混合模型调度系统。它允许配置:\n\n- **主机模型(host)**:负责最终输出与工具调用\n- **顾问模型(advisors)**:提供第二意见、代码审查、方案建议\n\n主机在关键决策点(如架构选择、复杂 bug 修复)会咨询顾问,综合多方建议后给出最终方案。\n\n## 配置 MOM\n\n```\n> /mom\n```\n\n打开 MOM 配置面板,可设置:\n\n| | 说明 |\n|----|------|\n| 主机 | 默认模型(如 Pro) |\n| 顾问 1 | 第一顾问(如 Max,深度推理) |\n| 顾问 2 | 第二顾问(如 Std,快速验证) |\n| 触发条件 | 何时咨询顾问(如代码改动 > 50 行) |\n| 模式 | inline(同步)或 fork(异步并行) |\n\n## 一次性 MOM turn\n\n```\n> /mom 帮我设计一个端口冲突处理策略\n```\n\n不修改全局配置,仅本次对话使用 MOM 模式:主机调度顾问,综合后输出。\n\n## 适用场景\n\n| 场景 | 推荐配置 |\n|------|---------|\n| 架构设计 | 主机 Pro + 顾问 Max |\n| 代码审查 | 主机 Pro + 顾问 Std(快速)+ 顾问 Max(深度) |\n| Bug 修复 | 主机 Pro + 顾问 Max |\n| 快速原型 | 仅主机,不启用顾问 |\n\n## 与普通对话的区别\n\n| 普通对话 | MOM 模式 |\n|---------|---------|\n| 单模型 | 多模型协同 |\n| 一次推理 | 多轮咨询 |\n| 成本低 | 成本高(顾问也消耗 token) |\n| 速度快 | 速度稍慢 |\n| 适合常规任务 | 适合关键决策 |\n\n## 成本控制\n\n顾问模型也会消耗 token。建议:\n\n- 日常对话不用 MOM\n- 关键决策(架构、安全审查)启用\n- 设置触发条件(如改动 > N 行才咨询)\n- `/cost` 监控消耗\n"
3040
+ "content": "\n## 为什么需要 MOM\n\n单模型对话有几类常见痛点,MOM 正是为解决它们而生:\n\n| 痛点 | 单模型表现 | MOM 解决方式 |\n|------|-----------|-------------|\n| 重要决策缺第二意见 | 一个模型说了算,错了也只能事后发现 | 多顾问并行给方案,主机综合后行动 |\n| 简单任务烧钱 | 用 Max 处理「重命名变量」大材小用 | 弱模型先试,简单任务不消耗强模型 token |\n| 复杂任务欠深度 | Std/Pro 推理深度不够,硬上又怕漏 | 强模型带完整工具循环兜底 |\n| 单一模型有盲区 | 不同模型擅长不同领域,只能赌一个 | 多 provider 顾问互补(如 Claude + Gemini + Grok) |\n| 关键改动无人审查 | 自己写自己改,bug 容易溜过去 | 顾问作为「审查者」给出反对意见 |\n\n一句话:**MOM 不是为了「更强」,而是为了「更稳 + 更省」**。它让简单任务便宜跑、关键决策有交叉验证、不同 provider 的模型互补盲区。\n\n## MOM 的两种内置模式\n\nMOM 是一个统称,下面注册了多个具名模式。每个模式 ID 同时也是虚拟模型名(可以直接 `/model mom-avg` 切换)和一次性命令名(`/mom-avg \"...\"`)。\n\n### mom-avg:并行顾问 + 主机综合\n\n工作流:\n\n```\n用户输入\n │\n ├──► 顾问 1(只读,text-only)──┐\n ├──► 顾问 2(只读,text-only)──┤\n ├──► 顾问 N(只读,text-only)──┤\n │ │\n ▼ ▼\n 主机模型 ◄──综合所有顾问建议──┘\n │\n ▼\n最终输出(带工具调用、文件编辑等完整能力)\n```\n\n关键点:\n\n- **顾问只读**:顾问不携带工具,只看对话历史给出建议文本,不能改文件、不能跑命令。这意味着顾问调用很快、很便宜(一次 text completion)。\n- **主机有完整能力**:主机收到所有顾问的建议后,作为「主持人」综合并执行——它可以读文件、改代码、跑测试,和普通对话完全一样。\n- **fanout 控制频率**:顾问不需要每轮都跑。默认 `user_turn`(每个用户消息跑一次,后续工具迭代复用同一份建议),也可设 `per_iteration`(每轮都跑,成本高)或 `every_n:N`(每 N 轮跑一次)。\n\n适合:**关键决策**——架构设计、安全审查、复杂 bug 方案选型。需要多角度意见时。\n\n### mom-stair:阶梯式弱→强升级\n\n工作流:\n\n```\n用户输入\n │\n ▼\n弱模型(带只读工具:Read/Grep/Glob)\n │ 自评置信度 0-1\n ├── 置信度 ≥ 阈值(默认 0.7)──► 直接交付答案,跳过强模型\n │\n └── 置信度 < 阈值 ──► 升级到下一阶段\n │\n ▼\n 强模型(完整工具循环)\n 接收弱模型的发现作为引导\n │\n ▼\n 最终输出\n```\n\n关键点:\n\n- **弱模型先试**:用 Std 或轻量模型尝试回答,可用只读工具(读文件、搜索代码)做基础调研。\n- **自评置信度**:弱模型给出答案时附带一个 0~1 的自评分。高于阈值就直接交付,**不调用强模型**——简单任务省一大笔 token。\n- **升级时传递发现**:弱模型调研得到的关键发现(key findings)和草稿答案会作为引导传给强模型,避免强模型从零开始重新探索。\n\n适合:**日常开发**——大部分任务用弱模型就能搞定,遇到真复杂的才升级到强模型。成本优化首选。\n\n## 三种使用方式\n\n### 1. 一次性 MOM 回合\n\n```bash\n# 用默认 MOM 模式跑一次,结束后自动恢复原模型\n> /mom 帮我设计一个端口冲突处理策略\n\n# 指定具体模式\n> /mom-avg 这段并发代码有什么竞态风险?\n> /mom-stair 重构这个 800 行的函数\n```\n\n特点:**不修改全局配置**,仅本次消息走 MOM 流程,下一条消息自动回到之前的模型。适合偶尔在关键节点用一下。\n\n### 2. 切换会话到 MOM 模式\n\n```bash\n> /model mom-avg\n```\n\n把当前会话的模型切到 `mom-avg`,后续所有消息都走 MOM 流程,直到再次 `/model` 切回。和切普通模型完全一样——MOM 模式 ID 在 `/model` 选择器里就能看到。\n\n### 3. 设为默认模式\n\n在 `/mom` 配置卡里把某个模式(如 `mom-stair`)设为 default,所有新会话默认走该模式。适合希望日常开发都享受成本优化的用户。\n\n## 配置 MOM\n\n```bash\n> /mom\n```\n\n打开 MOM 配置卡。这是一个多页 Ink 卡片:\n\n- **首页**:总开关、隐私过滤模式、模式列表(mom-avg / mom-stair)、模型池、默认模式\n- **每个模式一页**:顾问槽位、主机槽位、参数(fanout、超时、温度等)\n\n操作键:`Tab` 切页、`j/k` 上下导航、`←/→` 切区域、`Enter` 确认、`s` 保存、`Esc` 关闭。每个模式下都有底部快捷键提示,只显示当前可用的操作。\n\n### 模型池(modelPool)\n\n模型池是 MOM 可用的所有模型清单。每个条目有三种来源:\n\n| 类型 | 说明 | 适合场景 |\n|------|------|---------|\n| `preset` | 预设别名:`max`、`pro`、`std`、`subagent` | 最简,开箱即用 |\n| `key` | 引用 `/keys` 里绑定的 API Key(可指定该 Key 下的具体 modelName) | provider 混搭,如一个 Claude Key + 一个 Gemini Key |\n| `custom` | 自定义 provider + baseUrl + apiKey + model | 接入自部署模型、第三方兼容端点 |\n\n顾问和主机都从池里引用。配一个 `preset:std` 和一个 `key:my-gemini-key` 进池,就能让 mom-avg 的两个顾问分别是 Saluzi Std 和 Gemini。\n\n### 关键参数\n\n| 参数 | 作用 | 推荐值 |\n|------|------|--------|\n| `fanout` | 顾问调用频率:`user_turn` / `per_iteration` / `every_n:N` | `user_turn`(默认,省钱);只有真正需要每轮都参考意见时才用 `per_iteration` |\n| `privacyFilter` | 顾问输出脱敏:`off` / `display`(仅显示脱敏)/ `full`(连主机也看不到原话) | `off`(默认);处理敏感代码时用 `display` 或 `full` |\n| `degradedReferencePolicy` | 顾问失败时:`loud`(报错)/ `silent`(静默忽略) | `loud`(默认,能发现问题);成本敏感且可容忍漏掉顾问时用 `silent` |\n| `referenceMaxTokens` | 单个顾问最大输出 token | 2000~4000,避免顾问长篇大论 |\n| `referenceTimeout` | 顾问调用超时(秒) | 30~60,慢 provider 别拖死整个回合 |\n| `temperature` | 顾问采样温度 | 0.3~0.5(建议更有条理);想多角度发散可调高 |\n| `hostTemperature` | 主机采样温度 | 默认即可,主机需要稳定执行 |\n| `confidenceThreshold` | 仅 mom-stair:弱模型自评分低于此值则升级 | 0.7(默认);任务对准确度要求高可调到 0.8,省钱可调到 0.5 |\n\n## 推荐配置场景\n\n### 场景 1:日常开发(成本优先)\n\n```yaml\n默认模式: mom-stair\n弱模型: preset:std\n强模型: preset:pro\n置信度阈值: 0.6 # 稍低,更多任务用弱模型搞定\n```\n\n效果:80% 的简单任务由 Std 处理(便宜),剩下 20% 升级到 Pro。整体成本比纯 Pro 低 40~60%。\n\n### 场景 2:架构设计(质量优先)\n\n```yaml\n一次性调用: /mom-avg 帮我设计这个微服务拆分方案\n主机: preset:pro\n顾问 1: preset:max # 深度推理\n顾问 2: key:my-gemini-key # 不同视角\nfanout: user_turn\nreferenceMaxTokens: 4000\n```\n\n效果:Max 给出深思熟虑的方案,Gemini 提供不同训练集带来的视角差异,Pro 综合后执行。一次性使用,不污染日常对话。\n\n### 场景 3:安全审查(严格交叉验证)\n\n```yaml\n一次性调用: /mom-avg 审查这段处理用户输入的代码\n主机: preset:max\n顾问 1: preset:pro\n顾问 2: preset:pro # 两个 Pro 独立审查\nprivacyFilter: display # 显示时脱敏,避免敏感数据被多个 provider 看到\ndegradedReferencePolicy: loud # 任何一个顾问失败都要提示\n```\n\n效果:多个模型独立审查同一份代码,主机汇总所有发现。任何模型漏掉的漏洞都有可能被另一个发现。\n\n### 场景 4:复杂 bug(深度+广度)\n\n```yaml\n会话切换: /model mom-stair\n弱模型: preset:std # 先快速定位\n强模型: preset:max # 升级时用 Max 深度推理\n置信度阈值: 0.8 # 严格,避免弱模型误判\n```\n\n效果:Std 先用只读工具快速探索代码、给出初步判断。如果是简单 bug(如拼写错误),Std 直接修复;如果是涉及多模块的复杂 bug,升级到 Max 带完整工具循环深挖。\n\n## 成本控制要点\n\nMOM 用得不好可能比单模型还贵。几个原则:\n\n- **简单任务不要用 mom-avg**:mom-avg 至少调用 N+1 次模型(N 个顾问 + 1 个主机)。改个变量名用 mom-avg 是浪费。\n- **日常用 mom-stair 而非 mom-avg**:stair 只在弱模型搞不定时才升级,平均成本远低于 avg 的「每次都全员上场」。\n- **设 referenceMaxTokens**:顾问容易啰嗦,限制输出长度能直接省钱。\n- **fanout 用 user_turn**:除非真的需要每轮都参考意见,否则别用 `per_iteration`。\n- **关键决策用一次性 `/mom-avg`**:而不是把整个会话切到 mom-avg 模式。\n- **用 `/cost` 监控**:MOM 开启后会看到顾问调用的 token 消耗,发现异常及时调整。\n- **`/poor` 节约模式不影响 MOM**:`/poor` 只关记忆提取和提示建议,MOM 仍按配置运行。要省 MOM 的钱得调 `referenceMaxTokens` 和 `fanout`。\n\n## 与普通对话的对比\n\n| 维度 | 普通对话 | mom-stair | mom-avg |\n|------|---------|-----------|---------|\n| 模型调用次数 | 1 次 / 轮 | 1 次(简单)或 2+ 次(复杂) | N+1 次 / 用户回合 |\n| 简单任务成本 | 基准 | 低 30~50% | 高 2~5 倍 |\n| 复杂任务成本 | 基准 | 接近基准 | 高 2~5 倍 |\n| 决策质量 | 单模型 | 弱模型搞定时一般;升级后接近强模型 | 多角度交叉验证 |\n| 响应速度 | 最快 | 简单任务快;复杂任务稍慢 | 最慢(要等所有顾问) |\n| 适合场景 | 日常常规 | 日常开发 + 偶尔复杂 | 关键决策、安全审查 |\n\n## 常见误区\n\n**误区 1:MOM 一定比单模型好**\n不是。MOM 的并行调用本身有成本,简单任务用单模型更快更便宜。MOM 的价值在「关键决策有第二意见」和「简单任务不烧强模型」。\n\n**误区 2:顾问越多越好**\n顾问越多 token 越贵,且主机综合成本也上升。2~3 个互补顾问(如不同 provider、不同规模)通常比 5 个同质顾问效果好。\n\n**误区 3:把整个会话切到 mom-avg 就高枕无忧**\n会让每条消息都跑多顾问,成本爆炸。mom-avg 更适合用 `/mom-avg \"...\"` 一次性调用。\n\n**误区 4:mom-stair 的弱模型能解决一切**\n弱模型只有只读工具,不能改文件。它判定「我能搞定」时只是给出答案文本,真正的执行还得主机接力。所以 stair 的省钱逻辑是「简单咨询类问题」,不是「简单执行类问题」。\n\n**误区 5:自定义 provider 任何模型都能接**\ncustom entry 需要映射到 openai/anthropic/gemini/grok 之一的 SDK。Bedrock/Vertex 等需要专属 SDK 的 provider 暂时不能作为 MOM 主机(可作为顾问,但仍受相同限制)。\n\n## 下一步\n\n- [模型选择与切换](./model-selection) `/model`、`/effort` 与 MOM 的关系\n- [查看消耗](./cost-usage) `/cost` 监控 MOM 的顾问开销\n- [API Key 绑定](./keys-binding) — `/keys` 多 Key 调度,给 MOM 配多 provider 顾问\n- [对话基础](./conversation-basics) — 多轮对话与流式输出\n"
3038
3041
  },
3039
3042
  "docs/guide/saluzi-home": {
3040
3043
  "frontmatter": {
@@ -3164,10 +3167,13 @@
3164
3167
  "自托管",
3165
3168
  "Web UI",
3166
3169
  "Worker",
3167
- "acp-link"
3170
+ "acp-link",
3171
+ "claim",
3172
+ "权限",
3173
+ "可见域"
3168
3174
  ]
3169
3175
  },
3170
- "content": "\n## Remote Control Server (RCS)\n\nRCS 是 Saluzi 的自托管远程控制服务器,提供 Web UI 和会话管理。启动后,团队成员通过浏览器访问 Web UI,登录后即可创建会话、查看 worker 状态、与 agent 交互。\n\n## 启动 RCS\n\n```bash\n# 设置 API Key(管理员密码,也是 worker 连接 token)\nexport RCS_API_KEYS=sk-your-key\n\n# 启动(在 Saluzi CLI 中运行)\n> /rcs\n```\n\n也可通过 CLI 子命令直接启动:\n\n```bash\nslz rcs\n```\n\n默认端口 3000,Web UI 在 `http://localhost:3000/code/`。\n\n## RCS Web UI 使用\n\n### 用户注册与登录\n\n打开 Web UI 后需要登录:\n\n- **自注册**:如果 `RCS_ALLOW_REGISTRATION` 未设为 `false`(默认开放),首次访问可注册新账户(用户名 + 密码)。密码以 argon2id 加密存储,登录有速率限制(5 次失败后锁定 5 分钟)。\n- **邀请制**:将 `RCS_ALLOW_REGISTRATION=false` 后,只有管理员预先创建的账户能登录。\n- **管理员 API Key**:`RCS_API_KEYS` 中的 key 拥有系统级权限,可直接访问所有 API(不通过 Web UI 登录流程)。\n\n登录后浏览器会保存 session cookie(`rcs_access`),后续请求自动认证。\n\n### 会话管理\n\n登录后在 Web UI 中可以:\n\n- **创建会话**:选择可用的 worker,发起对话\n- **查看会话**:实时查看 worker 的输出,发送输入\n- **分享会话**:复制会话 URL 分享给队友(需登录才能查看)\n- **权限审批**:worker 请求工具权限时,Web UI 弹出审批提示\n\n### Worker 状态\n\nWeb UI 显示所有已连接的 worker(包括 slz CLI worker 和 acp-link agent):\n\n- **在线状态**:worker 当前是否可接受会话\n- **最大并发**:worker 配置的 `--capacity`\n- **最后活动时间**:最近一次心跳\n\n## RCS 服务器配置\n\n| 环境变量 | 默认 | 说明 |\n|---------|------|------|\n| `RCS_PORT` | 3000 | HTTP 端口 |\n| `RCS_HOST` | 0.0.0.0 | 监听地址 |\n| `RCS_API_KEYS` | — | 逗号分隔的 API Key(管理员权限,也是 worker 连接 token) |\n| `RCS_ALLOW_REGISTRATION` | true | 是否允许开放注册(设为 false 改为邀请制) |\n| `RCS_BASE_URL` | — | 外部访问 URL(反代时设置) |\n| `RCS_DB_PATH` | — | SQLite 数据库路径(默认内存,生产环境建议持久化) |\n| `RCS_WEB_CORS_ORIGINS` | — | Web UI CORS 允许的源(逗号分隔) |\n| `RCS_JWT_EXPIRES_IN` | 3600 | JWT 有效期(秒) |\n| `RCS_DISCONNECT_TIMEOUT` | 300 | 断开连接超时(秒) |\n| `RCS_WS_CLIENT_INACTIVITY_TIMEOUT` | 300 | WebSocket 客户端无活动超时(秒) |\n\n## Worker 接入\n\nWorker 是连接到 RCS 的 Saluzi CLI 实例,执行来自 Web UI 或其他客户端的会话。\n\n### 前置:设置环境变量\n\n**所有 worker 启动方式都需要先设置以下两个环境变量**:\n\n```bash\nexport SALUZI_BRIDGE_BASE_URL=http://rcs-host:3000\nexport SALUZI_BRIDGE_OAUTH_TOKEN=sk-your-key\n```\n\n- `SALUZI_BRIDGE_BASE_URL`:RCS 服务器地址\n- `SALUZI_BRIDGE_OAUTH_TOKEN`:必须与 RCS 启动时设置的 `RCS_API_KEYS` 中的某个 key 一致\n\n两个变量必须**同时设置**才生效。只设置一个会进入\"部分配置\"状态,启动时会提示补全。\n\n可选环境变量(用于归属和团队关联):\n\n| 环境变量 | 说明 |\n|---------|------|\n| `SALUZI_BRIDGE_USERNAME` | 归属用户名(发送为 `X-Username` 头,RCS 自动认领 env 到该用户) |\n| `SALUZI_BRIDGE_USER_ID` | 归属用户 ID(绕过自动认领,直接绑定到该用户) |\n| `SALUZI_BRIDGE_TEAM_ID` | 关联团队 ID(env 注册到指定团队) |\n| `SALUZI_ENVIRONMENT_KIND` | 设为 `bridge` 标记会话来源为 remote-control |\n| `SALUZI_USE_CCR_V2` | 启用 CCR v2 传输协议 |\n\n如果不设置 `SALUZI_BRIDGE_USERNAME`/`SALUZI_BRIDGE_USER_ID`/`SALUZI_BRIDGE_TEAM_ID`,且 token 是共享的管理员 API Key,RCS 会生成 `claim_token` 并打印认领 URL,worker 终端会显示该 URL 供用户认领。\n\n### 启动方式\n\n设置好环境变量后,推荐直接运行:\n\n```bash\nslz rc\n```\n\n`slz rc` 是最简的启动方式,默认配置即可作为 worker 连接到 RCS。它是 `slz remote-control` 的简写,也接受 `slz remote`、`slz sync`、`slz bridge` 作为别名。\n\n其他可选方式:\n\n```bash\n# 交互式会话 + worker(既可本地用,也接受远程请求)\nslz --remote-control\n\n# 普通会话自动连接(设置好环境变量后直接运行)\nslz\n```\n\n### 高级参数\n\n需要调整 worker 行为时,`slz rc` 支持以下参数:\n\n| 参数 | 说明 | 示例 |\n|------|------|------|\n| `--spawn <mode>` | Spawn 模式:`same-dir`、`worktree`、`session` | `--spawn=worktree` |\n| `--capacity <N>` | 最大并发会话数(仅 worktree/session 模式) | `--capacity=5` |\n| `--create-session-in-dir` | 启动时在当前目录预创建会话(默认开启) | `--no-create-session-in-dir` 禁用 |\n| `--session-id <id>` | 恢复指定会话 | `--session-id=abc123` |\n| `--continue` | 恢复最近会话 | — |\n| `--name <name>` | 会话名称(也用于 RCS 显示) | `--name=\"我的会话\"` |\n| `--username <name>` | 归属用户名(对应 `SALUZI_BRIDGE_USERNAME`) | `--username=alice` |\n| `--user-id <id>` | 归属用户 ID(对应 `SALUZI_BRIDGE_USER_ID`) | `--user-id=u-123` |\n| `--team-id <id>` | 关联团队 ID(对应 `SALUZI_BRIDGE_TEAM_ID`) | `--team-id=team-abc` |\n\n### Spawn 模式\n\n| 模式 | 说明 | 适用场景 |\n|------|------|---------|\n| `same-dir`(默认) | 所有会话在同一工作目录创建 | 单项目快速响应 |\n| `worktree` | 每个会话在独立 git worktree 中创建 | 多项目隔离,避免文件冲突 |\n| `session` | 单会话模式(容量固定为 1) | 简单场景,不需要并发 |\n\n## Worker 与 RCS 的关系\n\n```\n┌─────────────────┐\n│ RCS Server │ ← 运行 slz rcs\n│ (Web UI + API) │\n└────────┬────────┘\n │ Bridge 协议\n │\n ┌────┴────┐\n │ │\n┌───▼──┐ ┌──▼───┐\n│Worker│ │Worker│ ← slz rc / slz --remote-control / slz\n│ 1 │ │ 2 │\n└──────┘ └──────┘\n```\n\n- **RCS**:中央服务器,管理会话、用户、权限\n- **Worker**:通过 bridge 协议连接,从 RCS 获取任务,汇报状态\n- **Web UI**:通过浏览器访问 RCS,创建/查看会话\n\n## ACP 协议\n\nACP(Agent Control Protocol)让**外部 agent**(非 slz CLI,如 Claude Code、其他 ACP 兼容 agent)接入 RCS 的会话系统。slz CLI 自身使用 bridge 协议,不走 ACP。\n\n`acp-link` 是 ACP 桥接工具,随 `@saluzi/saluzi-edu` 一起安装,无需单独安装。\n\n### 连接 slz 到 RCS\n\n如果要让 slz CLI 作为 ACP agent 接入 RCS(而非 bridge worker),使用 `acp-link` 桥接:\n\n#### 1. 设置环境变量\n\n```bash\nexport ACP_RCS_URL=http://rcs-host:3000\nexport ACP_RCS_TOKEN=sk-your-key\n```\n\n- `ACP_RCS_URL`:RCS 服务器地址\n- `ACP_RCS_TOKEN`:必须与 RCS 的 `RCS_API_KEYS` 中的某个 key 一致\n\n可选环境变量:\n\n| 环境变量 | 说明 |\n|---------|------|\n| `ACP_RCS_GROUP` | Channel group ID(字母、数字、下划线、连字符) |\n| `ACP_RCS_USERNAME` | 归属用户名(自动认领 env 到该用户) |\n| `ACP_RCS_USER_ID` | 归属用户 ID(绕过自动认领) |\n| `ACP_RCS_TEAM_ID` | 关联团队 ID |\n| `ACP_AUTH_TOKEN` | 本地 WS 认证 token(不设则自动生成) |\n| `ACP_PERMISSION_MODE` | 默认权限模式 |\n\n#### 2. 启动 acp-link\n\n```bash\nacp-link slz -- --acp\n```\n\n`acp-link` 会启动 slz 作为子进程,通过 ACP 协议代理它与 RCS 之间的通信。slz 会出现在 RCS Web UI 的 agent 列表中,可接受会话请求。\n\n`--` 之后是传递给 slz 的参数(`--acp` 让 slz 进入 ACP 兼容模式)。\n\n### 连接 Claude Code 到 RCS\n\n`acp-link` 支持任何遵循 ACP 协议的 agent。以 Claude Code 为例:\n\n#### 1. 安装 claude-agent-acp\n\nClaude Code 的 ACP 适配包是 `@agentclientprotocol/claude-agent-acp`,需要单独安装:\n\n```bash\nnpm install -g @agentclientprotocol/claude-agent-acp\n```\n\n安装后会注册 `claude-agent-acp` 命令。\n\n#### 2. 设置环境变量\n\n```bash\nexport ACP_RCS_URL=http://rcs-host:3000\nexport ACP_RCS_TOKEN=sk-your-key\n```\n\n#### 3. 启动 acp-link 桥接\n\n```bash\nacp-link claude-agent-acp\n```\n\n`acp-link` 的第一个参数是 agent 的可执行命令名(这里是 `claude-agent-acp`)。`claude-agent-acp` 本身不需要额外参数,因此不需要 `--`。\n\n连接成功后,Claude Code 会作为 ACP agent 出现在 RCS Web UI 中,与 slz agent 并列,团队成员可在 Web UI 中选择它创建会话。\n\n其他 ACP 兼容 agent 的接入方式类似:安装对应的 ACP 适配包,然后用 `acp-link <命令名>` 启动。可在 npm 官网搜索 `@agentclientprotocol/*` 查找已适配的 agent。\n\n## 团队协作场景\n\n### 共享会话\n\n在 RCS Web UI 中创建会话,分享链接给队友(需登录才能查看),他们可查看或加入对话。\n\n### 多 Worker 协作\n\n团队多个成员各自启动 worker,连接到同一 RCS:\n\n```bash\n# 成员 A:默认配置\nslz rc\n\n# 成员 B:worktree 隔离,5 并发\nslz rc --spawn=worktree --capacity=5\n```\n\nWeb UI 显示所有 worker 状态,会话与权限集中管理。\n\n### 外部 Agent 接入\n\n用 ACP 让非 slz 的 agent 接入 RCS:\n\n```bash\n# Claude Code 通过 acp-link 接入\nacp-link claude -- --acp\n```\n\n接入后所有 agent 在 Web UI 中统一管理,团队成员可选择任意 agent 创建会话。\n\n## 安全建议\n\n- RCS 默认监听 0.0.0.0,生产环境建议用反代 + HTTPS\n- 用强 API Key,定期轮换\n- 生产环境关闭 `RCS_ALLOW_REGISTRATION` 改为邀请制\n- 使用 `RCS_WEB_CORS_ORIGINS` 限制 Web UI 访问来源\n- 设置 `RCS_DB_PATH` 持久化 SQLite 数据库\n- 限制 worker 的权限(`/permissions` 配置)\n\n## 故障排查\n\n| 问题 | 排查 |\n|------|------|\n| Worker 无法连接 | 检查 `SALUZI_BRIDGE_BASE_URL` 和 `SALUZI_BRIDGE_OAUTH_TOKEN` 是否同时设置;确认 token 与 RCS 的 `RCS_API_KEYS` 匹配 |\n| Web UI 登录失败 | 检查用户名密码;5 次失败后锁定 5 分钟 |\n| Web UI 401 | 确认使用 `RCS_API_KEYS` 中的 key 或有效的 session token |\n| acp-link 无法连接 RCS | 检查 `ACP_RCS_URL` 和 `ACP_RCS_TOKEN` 是否设置 |\n| Agent 不出现在 Web UI | 确认 acp-link 已启动且 `ACP_RCS_TOKEN` 与 `RCS_API_KEYS` 匹配 |\n| 会话超时 | 调整 `RCS_DISCONNECT_TIMEOUT` 和 `RCS_WS_CLIENT_INACTIVITY_TIMEOUT` |\n"
3176
+ "content": "\n## Remote Control Server (RCS)\n\nRCS 是 Saluzi 的自托管远程控制服务器,提供 Web UI 和会话管理。启动后,团队成员通过浏览器访问 Web UI,登录后即可创建会话、查看 worker 状态、与 agent 交互。\n\n## 启动 RCS\n\n```bash\n# 设置 API Key(管理员密码,也是 worker 连接 token)\nexport RCS_API_KEYS=sk-your-key\n\n# 启动(在 Saluzi CLI 中运行)\n> /rcs\n```\n\n也可通过 CLI 子命令直接启动:\n\n```bash\nslz rcs\n```\n\n默认端口 3000,Web UI 在 `http://localhost:3000/code/`。\n\n## RCS Web UI 使用\n\nWeb UI 是团队成员日常使用的控制面板:登录后可创建会话、查看 worker、审批权限、管理团队与环境。下面按首次部署到日常使用的顺序介绍。\n\n### 管理员初始化(首次访问)\n\n第一次打开 Web UI 时,系统没有任何用户。第一个登录的账号会成为系统管理员(role=admin),流程如下:\n\n1. 浏览器打开 `http://localhost:3000/code/`,自动跳转到 Setup 页面\n2. 填写表单:\n - **API Key**:必须与 RCS 启动时设置的 `RCS_API_KEYS` 中的某个 key 完全一致\n - **用户名**:登录用,后续不可改\n - **密码**:至少 8 位\n - **确认密码**\n3. 提交后第一个用户即成为 admin,进入管理面板\n\n后续访问的用户分两种:\n\n- **自注册**:如果 `RCS_ALLOW_REGISTRATION` 未设为 `false`(默认开放),新访问者可在登录页注册账户(用户名 + 密码)。密码以 argon2id 加密存储,登录有速率限制(5 次失败后锁定 5 分钟)。\n- **邀请制**:将 `RCS_ALLOW_REGISTRATION=false` 后,只有管理员预先创建的账户或通过团队邀请链接加入的用户能登录。\n\n管理员 API Key 拥有系统级权限,可直接访问所有 API(不通过 Web UI 登录流程)。\n\n登录后浏览器会保存 session cookie(`rcs_access`),后续请求自动认证。\n\n### 团队与角色\n\nRCS 用「团队」组织成员、环境和会话。每个登录用户都有一个「个人空间」(无需创建),可被加入一个或多个团队。\n\n**系统级角色**(`users.role`):\n\n| 角色 | 能力 |\n|------|------|\n| `admin` | 看到所有会话(含无主孤儿)、管理所有团队、转移任意环境;通常由 Setup 流程产生 |\n| 普通用户 | 仅看到自己拥有的、所属团队可见的、显式共享给自己的会话 |\n| `guest` | 不能创建团队;通常对应被降级的账户 |\n\n**团队级角色**(`team_members.role`):\n\n| 角色 | 团队内能力 |\n|------|-----------|\n| `owner` | 修改团队信息、删除团队、加/减成员、改成员角色、创建/撤销邀请、转移或解绑环境 |\n| `admin` | 加成员、创建/撤销邀请,但不能改 owner/admin 的角色,也不能删团队 |\n| `member` | 只能自退团队,看不到团队级管理按钮 |\n\n团队至少要保留一个 owner — 系统禁止降级或移除最后一个 owner。系统 admin 在任何团队中都视为 owner。\n\n**邀请加入**:团队 owner/admin 可在「团队详情 → 邀请」页面创建邀请链接,链接形如 `/join/<inv_xxx>`,可设置:\n\n- 角色:新成员加入后的角色(仅 `admin` 或 `member`,不能邀请为 owner)\n- 过期时间(默认 24 小时)\n- 最大使用次数(默认 1)\n\n也可以「添加已有用户」:通过用户名或用户 ID 搜索已注册账户,直接加入团队。\n\n### 环境管理\n\n「环境」(environment)是 worker 向 RCS 注册后产生的实体,代表一台正在提供 agent 服务的工作机。每个环境有:\n\n- 拥有者(owner_user_id,可能为空 → 需要认领)\n- 关联团队(可选,关联后团队内成员可见该环境及其会话)\n- worker 类型(slz CLI / ACP agent)、容量、心跳\n\n**环境的归属**:\n\n- 启动 worker 时通过 `--user-id` / `--team-id` 指定 → 直接归属到该用户或团队\n- 未指定且使用共享 API Key → 生成 `claim_token`,进入待认领状态(见下文 claim 机制)\n\n**环境与团队的关联**:\n\n- 在「团队详情 → 环境」页面可把个人环境链接到团队,或把团队环境解绑回个人\n- 环境可在团队之间转移(需要源团队和目标团队的 owner/admin 权限)\n- 转移环境时,该环境下的所有会话归属随之转移到目标团队\n\n### Claim 机制(环境认领)\n\n当 worker 使用共享 API Key 启动、且未指定 `--user-id` / `--team-id` 时,RCS 不会把环境直接归属给任何人,而是生成一个 `claim_token`(形如 `clm_xxxxxxxx`)并打印认领 URL:\n\n```\n/code/claim/clm_xxxxxxxx\n```\n\n**认领流程**:\n\n1. worker 启动后在终端看到认领 URL\n2. 把这个 URL 发给任意已登录用户\n3. 该用户在浏览器打开 URL → 自动调用 `/environments/claim` 接口\n4. 该环境的 `owner_user_id` 写入此用户,`claim_token` 清空\n5. 该环境下已经创建的会话也会一并 backfill 到该用户名下(否则会成为无主孤儿会话)\n\n`claim_token` 有过期时间(`claim_expires_at`),过期后无法认领。已被认领的环境再次访问会返回 409。\n\n这个机制让团队成员用共享 API Key 启动 worker 后,再由具体的人认领,避免环境长期处于无主状态。\n\n### 会话可见域\n\n每个会话有 `visibility` 字段,控制谁能看到它:\n\n| 可见域 | 谁能看到 |\n|--------|---------|\n| `private` | 仅会话的 user owner |\n| `team` | 会话所属团队的所有成员 |\n| `public` | 所有登录用户 |\n\n实际的可见规则综合考虑了 ownership、visibility 和显式共享:\n\n1. 系统 admin 能看到所有会话(含无主孤儿会话)\n2. 用户作为 user owner 拥有的会话\n3. 用户所属团队作为 team owner 拥有、且 visibility 为 `team` 或 `public` 的会话\n4. 通过 `session_shares` 显式共享给该用户的会话(未过期)\n5. 通过 `session_shares` 显式共享给该用户所属团队的会话(未过期)\n6. visibility=`public` 的会话\n7. 无主孤儿会话:仅 admin 可见\n\n**会话转移**:会话 owner(或团队 admin)可把会话从个人空间转到团队(visibility 自动变 `team`),或从团队转回个人(visibility 自动变 `private`)。转移时需要目标是该团队的 owner/admin。\n\n**会话分享**:会话 owner 可生成分享链接,授予指定用户或团队「只读」或「读写」权限,可设置过期时间。被分享者会在自己的会话列表里看到该会话。\n\n### 权限审批\n\nRCS Web UI 在 agent 请求工具调用时弹出审批面板。权限模式(permissionMode)有 6 种,决定 agent 是否需要等待人工确认:\n\n| 模式 | 行为 |\n|------|------|\n| `default` | 每次工具调用都请求确认 |\n| `auto` | agent 自动判断是否需要确认 |\n| `acceptEdits` | 自动接受文件编辑,其他工具仍需确认 |\n| `plan` | 规划模式,仅制定计划不执行 |\n| `dontAsk` | 不询问,直接执行 |\n| `bypassPermissions` | 绕过所有权限检查(仅 sandbox 环境可用,非 root) |\n\n权限模式可在创建会话时指定,也可在会话进行中切换。fallback 顺序:客户端传值 > acp-link 启动时的 `ACP_PERMISSION_MODE` 环境变量。\n\n**三种审批面板**:\n\n- **工具调用审批**:显示工具名、参数和描述,提供 Approve / Reject 按钮\n- **多问题面板**(AskUserQuestion):agent 一次提多个问题,用户在标签页中切换回答,每题可选预设选项或填写「Other」自定义文本\n- **计划审批**:显示 plan 内容,提供「Yes, auto-accept edits」「Yes, manually approve edits」「No, keep planning」三个选项,选 No 时可附反馈让 agent 重新规划\n\n### Worker 状态\n\nWeb UI 显示所有已连接的 worker(包括 slz CLI worker 和 acp-link agent):\n\n- **在线状态**:worker 当前是否可接受会话\n- **最大并发**:worker 配置的 `--capacity`\n- **最后活动时间**:最近一次心跳\n\n## RCS 服务器配置\n\n| 环境变量 | 默认 | 说明 |\n|---------|------|------|\n| `RCS_PORT` | 3000 | HTTP 端口 |\n| `RCS_HOST` | 0.0.0.0 | 监听地址 |\n| `RCS_API_KEYS` | — | 逗号分隔的 API Key(管理员权限,也是 worker 连接 token) |\n| `RCS_ALLOW_REGISTRATION` | true | 是否允许开放注册(设为 false 改为邀请制) |\n| `RCS_BASE_URL` | — | 外部访问 URL(反代时设置) |\n| `RCS_DB_PATH` | — | SQLite 数据库路径(默认内存,生产环境建议持久化) |\n| `RCS_WEB_CORS_ORIGINS` | — | Web UI CORS 允许的源(逗号分隔) |\n| `RCS_JWT_EXPIRES_IN` | 3600 | JWT 有效期(秒) |\n| `RCS_DISCONNECT_TIMEOUT` | 300 | 断开连接超时(秒) |\n| `RCS_WS_CLIENT_INACTIVITY_TIMEOUT` | 300 | WebSocket 客户端无活动超时(秒) |\n\n## Worker 接入\n\nWorker 是连接到 RCS 的 Saluzi CLI 实例,执行来自 Web UI 或其他客户端的会话。\n\n### 前置:设置环境变量\n\n**所有 worker 启动方式都需要先设置以下两个环境变量**:\n\n```bash\nexport SALUZI_BRIDGE_BASE_URL=http://rcs-host:3000\nexport SALUZI_BRIDGE_OAUTH_TOKEN=sk-your-key\n```\n\n- `SALUZI_BRIDGE_BASE_URL`:RCS 服务器地址\n- `SALUZI_BRIDGE_OAUTH_TOKEN`:必须与 RCS 启动时设置的 `RCS_API_KEYS` 中的某个 key 一致\n\n两个变量必须**同时设置**才生效。只设置一个会进入\"部分配置\"状态,启动时会提示补全。\n\n可选环境变量(用于归属和团队关联):\n\n| 环境变量 | 说明 |\n|---------|------|\n| `SALUZI_BRIDGE_USERNAME` | 归属用户名(发送为 `X-Username` 头,RCS 自动认领 env 到该用户) |\n| `SALUZI_BRIDGE_USER_ID` | 归属用户 ID(绕过自动认领,直接绑定到该用户) |\n| `SALUZI_BRIDGE_TEAM_ID` | 关联团队 ID(env 注册到指定团队) |\n| `SALUZI_ENVIRONMENT_KIND` | 设为 `bridge` 标记会话来源为 remote-control |\n| `SALUZI_USE_CCR_V2` | 启用 CCR v2 传输协议 |\n\n如果不设置 `SALUZI_BRIDGE_USERNAME`/`SALUZI_BRIDGE_USER_ID`/`SALUZI_BRIDGE_TEAM_ID`,且 token 是共享的管理员 API Key,RCS 会生成 `claim_token` 并打印认领 URL,worker 终端会显示该 URL 供用户认领(详见上文「Claim 机制」)。\n\n### 启动方式\n\n设置好环境变量后,推荐直接运行:\n\n```bash\nslz rc\n```\n\n`slz rc` 是最简的启动方式,默认配置即可作为 worker 连接到 RCS。它是 `slz remote-control` 的简写,也接受 `slz remote`、`slz sync`、`slz bridge` 作为别名。\n\n其他可选方式:\n\n```bash\n# 交互式会话 + worker(既可本地用,也接受远程请求)\nslz --remote-control\n\n# 普通会话自动连接(设置好环境变量后直接运行)\nslz\n```\n\n### 高级参数\n\n需要调整 worker 行为时,`slz rc` 支持以下参数:\n\n| 参数 | 说明 | 示例 |\n|------|------|------|\n| `--spawn <mode>` | Spawn 模式:`same-dir`、`worktree`、`session` | `--spawn=worktree` |\n| `--capacity <N>` | 最大并发会话数(仅 worktree/session 模式) | `--capacity=5` |\n| `--create-session-in-dir` | 启动时在当前目录预创建会话(默认开启) | `--no-create-session-in-dir` 禁用 |\n| `--session-id <id>` | 恢复指定会话 | `--session-id=abc123` |\n| `--continue` | 恢复最近会话 | — |\n| `--name <name>` | 会话名称(也用于 RCS 显示) | `--name=\"我的会话\"` |\n| `--username <name>` | 归属用户名(对应 `SALUZI_BRIDGE_USERNAME`) | `--username=alice` |\n| `--user-id <id>` | 归属用户 ID(对应 `SALUZI_BRIDGE_USER_ID`) | `--user-id=u-123` |\n| `--team-id <id>` | 关联团队 ID(对应 `SALUZI_BRIDGE_TEAM_ID`) | `--team-id=team-abc` |\n\n### Spawn 模式\n\n| 模式 | 说明 | 适用场景 |\n|------|------|---------|\n| `same-dir`(默认) | 所有会话在同一工作目录创建 | 单项目快速响应 |\n| `worktree` | 每个会话在独立 git worktree 中创建 | 多项目隔离,避免文件冲突 |\n| `session` | 单会话模式(容量固定为 1) | 简单场景,不需要并发 |\n\n## Worker 与 RCS 的关系\n\n```\n┌─────────────────┐\n│ RCS Server │ ← 运行 slz rcs\n│ (Web UI + API) │\n└────────┬────────┘\n │ Bridge 协议\n │\n ┌────┴────┐\n │ │\n┌───▼──┐ ┌──▼───┐\n│Worker│ │Worker│ ← slz rc / slz --remote-control / slz\n│ 1 │ │ 2 │\n└──────┘ └──────┘\n```\n\n- **RCS**:中央服务器,管理会话、用户、权限\n- **Worker**:通过 bridge 协议连接,从 RCS 获取任务,汇报状态\n- **Web UI**:通过浏览器访问 RCS,创建/查看会话\n\n## ACP 协议\n\nACP(Agent Control Protocol)让**外部 agent**(非 slz CLI,如 Claude Code、其他 ACP 兼容 agent)接入 RCS 的会话系统。slz CLI 自身使用 bridge 协议,不走 ACP。\n\n`acp-link` 是 ACP 桥接工具,随 `@saluzi/saluzi-edu` 一起安装,无需单独安装。\n\n### 连接 slz 到 RCS\n\n如果要让 slz CLI 作为 ACP agent 接入 RCS(而非 bridge worker),使用 `acp-link` 桥接:\n\n#### 1. 设置环境变量\n\n```bash\nexport ACP_RCS_URL=http://rcs-host:3000\nexport ACP_RCS_TOKEN=sk-your-key\n```\n\n- `ACP_RCS_URL`:RCS 服务器地址\n- `ACP_RCS_TOKEN`:必须与 RCS 的 `RCS_API_KEYS` 中的某个 key 一致\n\n可选环境变量:\n\n| 环境变量 | 说明 |\n|---------|------|\n| `ACP_RCS_GROUP` | Channel group ID(字母、数字、下划线、连字符) |\n| `ACP_RCS_USERNAME` | 归属用户名(自动认领 env 到该用户) |\n| `ACP_RCS_USER_ID` | 归属用户 ID(绕过自动认领) |\n| `ACP_RCS_TEAM_ID` | 关联团队 ID |\n| `ACP_AUTH_TOKEN` | 本地 WS 认证 token(不设则自动生成) |\n| `ACP_PERMISSION_MODE` | 默认权限模式 |\n\n#### 2. 启动 acp-link\n\n```bash\nacp-link slz -- --acp\n```\n\n`acp-link` 会启动 slz 作为子进程,通过 ACP 协议代理它与 RCS 之间的通信。slz 会出现在 RCS Web UI 的 agent 列表中,可接受会话请求。\n\n`--` 之后是传递给 slz 的参数(`--acp` 让 slz 进入 ACP 兼容模式)。\n\n### 连接 Claude Code 到 RCS\n\n`acp-link` 支持任何遵循 ACP 协议的 agent。Claude Code 通过专用的 ACP 适配包 `@agentclientprotocol/claude-agent-acp` 接入,接入命令是 `acp-link claude-agent-acp`(**不是** `acp-link claude`,因为 Claude Code 本身不直接说 ACP 协议,需要先装适配包)。\n\n#### 1. 安装 claude-agent-acp\n\nClaude Code 的 ACP 适配包需要单独安装:\n\n```bash\nnpm install -g @agentclientprotocol/claude-agent-acp\n```\n\n安装后会注册 `claude-agent-acp` 命令。\n\n#### 2. 设置环境变量\n\n```bash\nexport ACP_RCS_URL=http://rcs-host:3000\nexport ACP_RCS_TOKEN=sk-your-key\n```\n\n#### 3. 启动 acp-link 桥接\n\n```bash\nacp-link claude-agent-acp\n```\n\n`acp-link` 的第一个参数是 agent 的可执行命令名(这里是 `claude-agent-acp`)。`claude-agent-acp` 本身不需要额外参数,因此不需要 `--`。\n\n连接成功后,Claude Code 会作为 ACP agent 出现在 RCS Web UI 中,与 slz agent 并列,团队成员可在 Web UI 中选择它创建会话。\n\n其他 ACP 兼容 agent 的接入方式类似:安装对应的 ACP 适配包,然后用 `acp-link <命令名>` 启动。可在 npm 官网搜索 `@agentclientprotocol/*` 查找已适配的 agent。\n\n## 团队协作场景\n\n### 共享会话\n\n在 RCS Web UI 中创建会话,分享链接给队友(需登录才能查看),他们可查看或加入对话。也可通过 `session_shares` 显式授予指定用户或团队「只读」/「读写」权限,并设置过期时间。\n\n### 多 Worker 协作\n\n团队多个成员各自启动 worker,连接到同一 RCS:\n\n```bash\n# 成员 A:默认配置\nslz rc\n\n# 成员 B:worktree 隔离,5 并发\nslz rc --spawn=worktree --capacity=5\n```\n\nWeb UI 显示所有 worker 状态,会话与权限集中管理。\n\n### 外部 Agent 接入\n\n用 ACP 让非 slz 的 agent 接入 RCS。Claude Code 通过 `claude-agent-acp` 适配包接入:\n\n```bash\n# 先装适配包(仅一次)\nnpm install -g @agentclientprotocol/claude-agent-acp\n\n# 设置 RCS 连接\nexport ACP_RCS_URL=http://rcs-host:3000\nexport ACP_RCS_TOKEN=sk-your-key\n\n# 启动桥接\nacp-link claude-agent-acp\n```\n\n接入后所有 agent 在 Web UI 中统一管理,团队成员可选择任意 agent 创建会话。\n\n## 安全建议\n\n- RCS 默认监听 0.0.0.0,生产环境建议用反代 + HTTPS\n- 用强 API Key,定期轮换\n- 生产环境关闭 `RCS_ALLOW_REGISTRATION` 改为邀请制\n- 使用 `RCS_WEB_CORS_ORIGINS` 限制 Web UI 访问来源\n- 设置 `RCS_DB_PATH` 持久化 SQLite 数据库\n- 限制 worker 的权限(`/permissions` 配置)\n- `bypassPermissions` 模式仅在 sandbox 环境中启用,避免在主机直接放行所有工具调用\n\n## 故障排查\n\n| 问题 | 排查 |\n|------|------|\n| Worker 无法连接 | 检查 `SALUZI_BRIDGE_BASE_URL` 和 `SALUZI_BRIDGE_OAUTH_TOKEN` 是否同时设置;确认 token 与 RCS 的 `RCS_API_KEYS` 匹配 |\n| Web UI 登录失败 | 检查用户名密码;5 次失败后锁定 5 分钟 |\n| Web UI 401 | 确认使用 `RCS_API_KEYS` 中的 key 或有效的 session token |\n| 看不到某个会话 | 检查会话 visibility(private/team/public);确认是否在所属团队的成员列表里;admin 可看所有 |\n| 环境显示「待认领」 | worker 没指定 `--user-id`/`--team-id`,找到终端里的 `/code/claim/clm_xxx` URL,已登录用户打开即可认领 |\n| acp-link 无法连接 RCS | 检查 `ACP_RCS_URL` 和 `ACP_RCS_TOKEN` 是否设置 |\n| Agent 不出现在 Web UI | 确认 acp-link 已启动且 `ACP_RCS_TOKEN` 与 `RCS_API_KEYS` 匹配 |\n| 邀请链接失效 | 邀请 token 可能过期或达到 max_uses 上限;让团队 owner/admin 重新创建 |\n| 会话超时 | 调整 `RCS_DISCONNECT_TIMEOUT` 和 `RCS_WS_CLIENT_INACTIVITY_TIMEOUT` |\n"
3171
3177
  },
3172
3178
  "docs/guide/context-tips": {
3173
3179
  "frontmatter": {
@@ -11,12 +11,12 @@
11
11
  href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap"
12
12
  rel="stylesheet"
13
13
  />
14
- <script type="module" crossorigin src="/assets/main-DJkKJZ2i.js"></script>
14
+ <script type="module" crossorigin src="/assets/main-Ba71iEWV.js"></script>
15
15
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-S-ySWqyJ.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/shiki-CMaUdEs0.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/streamdown-nMT_aKRc.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/vendor-BU1MXatO.js">
19
- <link rel="stylesheet" crossorigin href="/assets/main-CvvQIOx-.css">
19
+ <link rel="stylesheet" crossorigin href="/assets/main-22dB0UT4.css">
20
20
  </head>
21
21
  <body>
22
22
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saluzi/saluzi-edu",
3
- "version": "0.2.38",
3
+ "version": "0.2.39",
4
4
  "description": "Saluzi CLI - interactive AI coding assistant in the terminal",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- @import "https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";@layer components;@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Poppins", system-ui, -apple-system, sans-serif;--font-serif:Georgia, "Times New Roman", serif;--font-mono:"JetBrains Mono", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-black:#000;--spacing:.25rem;--container-md:28rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--radius:.625rem;--font-display:"Poppins", sans-serif;--color-surface-3:#d4bfae;--color-text-primary:#372e37;--color-text-secondary:#737373;--color-background:#f0e0d3;--color-foreground:#372e37;--color-card:#e6d2c2;--color-primary:#7d5a8a;--color-primary-foreground:#f0e0d3;--color-secondary:#e6d2c2;--color-secondary-foreground:#372e37;--color-muted:#e6d2c2;--color-muted-foreground:#737373;--color-accent:#7d5a8a;--color-accent-foreground:#f0e0d3;--color-destructive:#4b1535;--color-border:#7d5a8a;--color-border-light:#e6d2c2;--color-ring:#7d5a8a}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html,body{background:var(--color-background);color:var(--color-text-primary);font-family:var(--font-sans);-webkit-font-smoothing:antialiased}*,:before,:after{border-color:var(--color-border)}}@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-2{left:calc(var(--spacing) * 2)}.left-4{left:calc(var(--spacing) * 4)}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-14{margin-bottom:calc(var(--spacing) * 14)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-full{width:100%;height:100%}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-\[46px\]{height:46px}.h-\[calc\(100vh-2rem\)\]{height:calc(100vh - 2rem)}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-\[200px\]{min-height:200px}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-full{width:100%}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[120px\]{min-width:120px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:50%}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-10{gap:calc(var(--spacing) * 10)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.self-start{align-self:flex-start}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:var(--radius)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-border{border-color:var(--color-border)}.border-border-light{border-color:var(--color-border-light)}.border-current{border-color:currentColor}.border-destructive{border-color:var(--color-destructive)}.border-muted-foreground\/30{border-color:#7373734d}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\/30{border-color:color-mix(in oklab, var(--color-muted-foreground) 30%, transparent)}}.border-primary{border-color:var(--color-primary)}.border-red-200{border-color:var(--color-red-200)}.border-transparent{border-color:#0000}.bg-accent{background-color:var(--color-accent)}.bg-background{background-color:var(--color-background)}.bg-background\/80{background-color:#f0e0d3cc}@supports (color:color-mix(in lab, red, red)){.bg-background\/80{background-color:color-mix(in oklab, var(--color-background) 80%, transparent)}}.bg-background\/90{background-color:#f0e0d3e6}@supports (color:color-mix(in lab, red, red)){.bg-background\/90{background-color:color-mix(in oklab, var(--color-background) 90%, transparent)}}.bg-background\/95{background-color:#f0e0d3f2}@supports (color:color-mix(in lab, red, red)){.bg-background\/95{background-color:color-mix(in oklab, var(--color-background) 95%, transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-card{background-color:var(--color-card)}.bg-destructive{background-color:var(--color-destructive)}.bg-muted{background-color:var(--color-muted)}.bg-muted\/40{background-color:#e6d2c266}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--color-muted) 40%, transparent)}}.bg-muted\/80{background-color:#e6d2c2cc}@supports (color:color-mix(in lab, red, red)){.bg-muted\/80{background-color:color-mix(in oklab, var(--color-muted) 80%, transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-secondary{background-color:var(--color-secondary)}.bg-surface-3{background-color:var(--color-surface-3)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-10{padding-inline:calc(var(--spacing) * 10)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.wrap-anywhere{overflow-wrap:anywhere}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-accent-foreground{color:var(--color-accent-foreground)}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-primary\/80{color:#7d5a8acc}@supports (color:color-mix(in lab, red, red)){.text-primary\/80{color:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.\[counter-increment\:line_0\]{counter-increment:line 0}.\[counter-reset\:line\]{counter-reset:line}@media (hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.before\:mr-4:before{content:var(--tw-content);margin-right:calc(var(--spacing) * 4)}.before\:inline-block:before{content:var(--tw-content);display:inline-block}.before\:w-4:before{content:var(--tw-content);width:calc(var(--spacing) * 4)}.before\:w-6:before{content:var(--tw-content);width:calc(var(--spacing) * 6)}.before\:text-right:before{content:var(--tw-content);text-align:right}.before\:font-mono:before{content:var(--tw-content);font-family:var(--font-mono)}.before\:text-\[13px\]:before{content:var(--tw-content);font-size:13px}.before\:text-muted-foreground\/50:before{content:var(--tw-content);color:#73737380}@supports (color:color-mix(in lab, red, red)){.before\:text-muted-foreground\/50:before{color:color-mix(in oklab, var(--color-muted-foreground) 50%, transparent)}}.before\:content-\[counter\(line\)\]:before{--tw-content:counter(line);content:var(--tw-content)}.before\:select-none:before{content:var(--tw-content);-webkit-user-select:none;user-select:none}.before\:\[counter-increment\:line\]:before{content:var(--tw-content);counter-increment:line}:is(.\*\:first\:mt-0>*):first-child{margin-top:calc(var(--spacing) * 0)}:is(.\*\:last\:mb-0>*):last-child{margin-bottom:calc(var(--spacing) * 0)}:is(.\*\:last\:after\:inline>*):last-child:after{content:var(--tw-content);display:inline}:is(.\*\:last\:after\:align-baseline>*):last-child:after{content:var(--tw-content);vertical-align:baseline}:is(.\*\:last\:after\:content-\(--streamdown-caret\)>*):last-child:after{--tw-content:var(--streamdown-caret);content:var(--tw-content)}@media (hover:hover){.hover\:bg-background:hover{background-color:var(--color-background)}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:bg-muted\/40:hover{background-color:#e6d2c266}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab, var(--color-muted) 40%, transparent)}}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-14{padding-inline:calc(var(--spacing) * 14)}.sm\:px-16{padding-inline:calc(var(--spacing) * 16)}.sm\:py-16{padding-block:calc(var(--spacing) * 16)}.sm\:py-20{padding-block:calc(var(--spacing) * 20)}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=64rem){.lg\:block{display:block}}@media (prefers-color-scheme:dark){.dark\:bg-\(--shiki-dark-bg\)\!{background-color:var(--shiki-dark-bg)!important}.dark\:text-\(--shiki-dark\)\!{color:var(--shiki-dark)!important}}.\[\&_svg\]\:h-auto svg{height:auto}.\[\&_svg\]\:w-auto svg{width:auto}.\[\&\>div\]\:h-full>div{height:100%}.\[\&\>div\]\:overflow-hidden>div{overflow:hidden}.\[\&\>p\]\:inline>p{display:inline}li .\[li_\&\]\:pl-6{padding-left:calc(var(--spacing) * 6)}}.dark{--color-surface-0:#1a1917;--color-surface-1:#222120;--color-surface-2:#2c2a28;--color-surface-3:#3a3835;--color-text-primary:#efeee9;--color-text-secondary:#969088;--color-text-muted:#5e5a54;--color-bg-inverted:#f6f5f2;--color-text-inverted:#2c2a28;--color-border:#3a3835;--color-border-light:#2c2a28;--color-background:#1a1917;--color-foreground:#efeee9;--color-card:#222120;--color-card-foreground:#efeee9;--color-popover:#1a1917;--color-popover-foreground:#efeee9;--color-primary:#7d5a8a;--color-primary-foreground:#efeee9;--color-secondary:#2c2a28;--color-secondary-foreground:#efeee9;--color-muted:#2c2a28;--color-muted-foreground:#969088;--color-accent:#7d5a8a;--color-accent-foreground:#efeee9;--color-destructive:#4b1535;--color-input:#3a3835;--color-ring:#7d5a8a}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-surface-3);border-radius:3px}.chapter-content{font-family:var(--font-sans);color:var(--color-text-primary);font-size:1.0625rem;line-height:1.75}.chapter-content p,.chapter-content ul,.chapter-content ol,.chapter-content blockquote,.chapter-content pre,.chapter-content table,.chapter-content hr,.chapter-content img{margin-top:1.25rem;margin-bottom:1.25rem}.chapter-content>:first-child,.chapter-content>div>:first-child{margin-top:0}.chapter-content>:last-child,.chapter-content>div>:last-child{margin-bottom:0}.chapter-content h1,.chapter-content h2,.chapter-content h3,.chapter-content h4,.chapter-content h5,.chapter-content h6{font-family:var(--font-display);letter-spacing:-.015em;color:var(--color-text-primary);margin-top:2.5rem;margin-bottom:1rem;font-weight:600;line-height:1.3}.chapter-content h1{margin-top:0;font-size:1.875rem}.chapter-content h2{border-bottom:1px solid var(--color-border-light);padding-bottom:.5rem;font-size:1.5rem}.chapter-content h3{font-size:1.25rem}.chapter-content h4{font-size:1.125rem}.chapter-content p{line-height:1.75}.chapter-content a{color:var(--color-primary);border-bottom:1px solid #0000;text-decoration:none;transition:border-color .2s}.chapter-content a:hover{border-bottom-color:var(--color-primary)}.chapter-content strong{color:var(--color-text-primary);font-weight:600}.chapter-content em{font-style:italic}.chapter-content ul,.chapter-content ol{padding-left:1.5rem}.chapter-content ul{list-style:outside}.chapter-content ol{list-style:decimal}.chapter-content li{margin-top:.5rem;margin-bottom:.5rem;line-height:1.7}.chapter-content li::marker{color:var(--color-primary)}.chapter-content blockquote{border-left:3px solid var(--color-primary);color:var(--color-text-secondary);padding:.5rem 0 .5rem 1.25rem;font-style:italic}.chapter-content code{font-family:var(--font-mono);background:var(--color-muted);color:var(--color-primary);border-radius:.375rem;padding:.125rem .375rem;font-size:.875em;font-weight:500}.chapter-content pre{background:var(--color-card);border:1px solid var(--color-border-light);border-radius:.75rem;padding:1.25rem 1.5rem;font-size:.875rem;line-height:1.6;overflow-x:auto}.chapter-content pre code{color:inherit;font-weight:inherit;background:0 0;border-radius:0;padding:0}.chapter-content pre code>span:last-child:empty{display:none}.chapter-content table{border-collapse:collapse;width:100%;font-size:.9375rem}.chapter-content th{text-align:left;font-family:var(--font-display);color:var(--color-text-primary);border-bottom:2px solid var(--color-primary);background:var(--color-muted);padding:.75rem 1rem;font-weight:600}.chapter-content td{border-bottom:1px solid var(--color-border-light);color:var(--color-text-primary);vertical-align:top;padding:.75rem 1rem}.chapter-content tr:hover td{background:var(--color-muted)}.chapter-content hr{border:none;border-top:1px solid var(--color-border-light)}.chapter-content img{border-radius:.625rem;max-width:100%;height:auto}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}