@coralai/sps-cli 0.55.0 → 0.55.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@ SPS (Smart Pipeline System) drives a Claude Code worker through task cards — c
12
12
  |---|---|---|
13
13
  | **Harness** | `sps agent` | Zero-config — one-shot or multi-turn chat with Claude. No project, no PM. |
14
14
  | **Pipeline** | `sps tick <project>` | Automated card-driven workflow with YAML-configurable stages. |
15
- | **Console** | `sps console` | Web UI — kanban, logs, workers, projects, chat (since v0.44). |
15
+ | **Console** | `sps console` | Web UI — kanban, logs, workers, projects, chat, processes, audit log (since v0.44). |
16
16
 
17
17
  The headline feature in v0.51 is the **Wiki Knowledge Base** — opt-in per project, structured cross-linked pages (modules / concepts / decisions / lessons / sources), 5-layer retrieval auto-injected into worker prompts. See [doc-28](../../docs/design/28-wiki-system.md) and [`ATTRIBUTION.md`](./ATTRIBUTION.md).
18
18
 
@@ -0,0 +1,10 @@
1
+ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
2
+ Theme: GitHub
3
+ Description: Light theme as seen on github.com
4
+ Author: github.com
5
+ Maintainer: @Hirse
6
+ Updated: 2021-05-15
7
+
8
+ Outdated base version: https://github.com/primer/github-syntax-light
9
+ Current colors taken from GitHub's CSS
10
+ */.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#005cc5}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-comment,.hljs-code,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */@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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--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-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono", "SF Mono", Monaco, Consolas, monospace;--color-green-600:oklch(62.7% .194 149.214);--color-gray-400:oklch(70.7% .022 261.325);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-6xl:72rem;--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: 1.5 ;--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: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-md:12px;--radius-lg:16px;--radius-xl:20px;--radius-2xl:1rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--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);--color-bg:#fff;--color-bg-cream:#fff9f5;--color-text:#2d3748;--color-text-muted:#475569;--color-text-subtle:#64748b;--color-border-light:#e2e8f0;--color-primary:#fdbcb4;--color-secondary:#add8e6;--color-accent-mint:#98ff98;--color-accent-purple:#e6e6fa;--color-accent-yellow:#fff3b0;--color-accent-pink:#ffd1dc;--color-running:#166534;--color-running-bg:#d4f5e4;--color-stuck:#92400e;--color-stuck-bg:#ffe8cf;--color-crashed:#991b1b;--color-crashed-bg:#ffe4e6;--color-idle:#475569;--color-idle-bg:#f1f5f9;--color-cta:#22c55e;--font-heading:"Fredoka", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-body:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif}}@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%;-moz-tab-size:4;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;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:before,:after{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--font-body);color:var(--color-text);background:var(--color-bg-cream);min-height:100vh;font-size:15px;line-height:1.5}h1,h2,h3,h4,h5{font-family:var(--font-heading);color:var(--color-text);letter-spacing:-.01em;margin:0;font-weight:700}:focus-visible{outline:3px solid var(--color-text);outline-offset:2px}@media(prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}}@layer components{.nb-card{background:var(--color-bg);border:3px solid var(--color-text);box-shadow:5px 5px 0 var(--color-text);border-radius:16px;padding:16px}.nb-card-interactive{cursor:pointer;transition:transform .18s ease-out,box-shadow .18s ease-out}.nb-card-interactive:hover{box-shadow:7px 7px 0 var(--color-text);transform:translate(-2px,-2px)}.nb-card-interactive:active{box-shadow:3px 3px 0 var(--color-text);transform:translate(1px,1px)}.nb-btn{border:3px solid var(--color-text);font-family:var(--font-body);color:var(--color-text);background:var(--color-bg);box-shadow:3px 3px 0 var(--color-text);-webkit-user-select:none;user-select:none;cursor:pointer;border-radius:12px;align-items:center;gap:8px;padding:10px 18px;font-size:14px;font-weight:700;line-height:20px;transition:transform .12s ease-out,box-shadow .12s ease-out;display:inline-flex}.nb-btn:hover{box-shadow:4px 4px 0 var(--color-text);transform:translate(-1px,-1px)}.nb-btn:active{box-shadow:1px 1px 0 var(--color-text);transform:translate(2px,2px)}.nb-btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:2px 2px 0 var(--color-text);transform:none}.nb-btn:disabled:hover{box-shadow:2px 2px 0 var(--color-text);transform:none}.nb-btn-primary{background:var(--color-cta)}.nb-btn-mint{background:var(--color-accent-mint)}.nb-btn-peach{background:var(--color-primary)}.nb-btn-blue{background:var(--color-secondary)}.nb-btn-yellow{background:var(--color-accent-yellow)}.nb-btn-purple{background:var(--color-accent-purple)}.nb-btn-danger{background:var(--color-crashed);color:#fff}.nb-input{border:3px solid var(--color-text);background:var(--color-bg);color:var(--color-text);font-family:var(--font-body);box-shadow:3px 3px 0 var(--color-text);border-radius:12px;padding:10px 16px;font-size:14px;font-weight:500;line-height:20px;transition:transform .12s,box-shadow .12s}.nb-input:focus{box-shadow:4px 4px 0 var(--color-text);outline:none;transform:translate(-1px,-1px)}.nb-badge{border:2px solid var(--color-text);font-family:var(--font-body);color:var(--color-text);background:var(--color-bg);border-radius:9999px;align-items:center;gap:4px;padding:4px 10px;font-size:12px;font-weight:700;line-height:16px;display:inline-flex}.nb-status{border:2px solid var(--color-text);font-family:var(--font-body);color:var(--color-text);border-radius:9999px;align-items:center;gap:5px;padding:4px 10px 4px 9px;font-size:11px;font-weight:700;line-height:16px;display:inline-flex}.nb-status:before{content:"";border:1.5px solid var(--color-text);background:currentColor;border-radius:50%;width:8px;height:8px}.prose-chat{color:var(--color-text);line-height:1.6}.prose-chat>:first-child{margin-top:0}.prose-chat>:last-child{margin-bottom:0}.prose-chat h1{font-family:var(--font-heading);margin:1em 0 .5em;font-size:1.5rem;font-weight:700}.prose-chat h2{font-family:var(--font-heading);margin:1em 0 .5em;font-size:1.25rem;font-weight:700}.prose-chat h3{font-family:var(--font-heading);margin:.8em 0 .4em;font-size:1.1rem;font-weight:700}.prose-chat h4,.prose-chat h5,.prose-chat h6{font-family:var(--font-heading);margin:.8em 0 .3em;font-weight:700}.prose-chat p{margin:.6em 0}.prose-chat ul,.prose-chat ol{margin:.6em 0;padding-left:1.6em}.prose-chat ul{list-style:outside}.prose-chat ol{list-style:decimal}.prose-chat li,.prose-chat li>ul,.prose-chat li>ol{margin:.2em 0}.prose-chat code{font-family:var(--font-mono);background:var(--color-bg-cream);border:1.5px solid var(--color-text);border-radius:4px;padding:0 4px;font-size:.9em}.prose-chat pre{background:var(--color-bg-cream);border:2px solid var(--color-text);font-family:var(--font-mono);border-radius:8px;margin:.8em 0;padding:12px;font-size:.85em;line-height:1.45;overflow-x:auto}.prose-chat pre code{font-size:inherit;background:0 0;border:0;padding:0}.prose-chat blockquote{border-left:3px solid var(--color-text);color:var(--color-text-muted);margin:.8em 0;padding-left:1em}.prose-chat table{border-collapse:collapse;border:2px solid var(--color-text);border-radius:8px;margin:.8em 0;overflow:hidden}.prose-chat th,.prose-chat td{border:1px solid var(--color-text);text-align:left;padding:6px 10px}.prose-chat th{background:var(--color-bg-cream);font-weight:700}.prose-chat a{color:var(--color-running);text-underline-offset:2px;text-decoration:underline}.prose-chat a:hover{color:var(--color-text)}.prose-chat hr{border:0;border-top:2px dashed var(--color-text);margin:1em 0}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1\/2{top:50%}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-3{right:calc(var(--spacing) * 3)}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.row-span-1{grid-row:span 1/span 1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.mx-auto{margin-inline:auto}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.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-8{margin-top:calc(var(--spacing) * 8)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-20{height:calc(var(--spacing) * 20)}.h-\[calc\(100vh-140px\)\]{height:calc(100vh - 140px)}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[280px\]{min-height:280px}.w-2{width:calc(var(--spacing) * 2)}.w-2\/3{width:66.6667%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[12rem\]{max-width:12rem}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[260px\]{max-width:260px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[130px\]{min-width:130px}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[100px_1fr\]{grid-template-columns:100px 1fr}.grid-cols-\[100px_60px_1fr\]{grid-template-columns:100px 60px 1fr}.grid-cols-\[100px_90px_60px_1fr\]{grid-template-columns:100px 90px 60px 1fr}.grid-cols-\[160px_1fr\]{grid-template-columns:160px 1fr}.grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr}.grid-cols-\[repeat\(auto-fill\,minmax\(280px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.grid-rows-\[1fr_40px\]{grid-template-rows:1fr 40px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.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-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}: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)))}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y-2>: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(2px * var(--tw-divide-y-reverse));border-bottom-width:calc(2px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-\[var\(--color-text\)\]\/20>:not(:last-child)){border-color:#2d374833}@supports (color:color-mix(in lab,red,red)){:where(.divide-\[var\(--color-text\)\]\/20>:not(:last-child)){border-color:color-mix(in oklab,var(--color-text) 20%,transparent)}}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-\[2px\]{border-style:var(--tw-border-style);border-width:2px}.border-\[3px\]{border-style:var(--tw-border-style);border-width:3px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[1\.5px\]{border-top-style:var(--tw-border-style);border-top-width:1.5px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.border-r-\[3px\]{border-right-style:var(--tw-border-style);border-right-width:3px}.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-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[var\(--color-border-light\)\]{border-color:var(--color-border-light)}.border-\[var\(--color-cta\)\]{border-color:var(--color-cta)}.border-\[var\(--color-running\)\]{border-color:var(--color-running)}.border-\[var\(--color-stuck\)\]{border-color:var(--color-stuck)}.border-\[var\(--color-text\)\]{border-color:var(--color-text)}.border-\[var\(--color-text\)\]\/10{border-color:#2d37481a}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-text\)\]\/10{border-color:color-mix(in oklab,var(--color-text) 10%,transparent)}}.border-\[var\(--color-text\)\]\/30{border-color:#2d37484d}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-text\)\]\/30{border-color:color-mix(in oklab,var(--color-text) 30%,transparent)}}.border-transparent{border-color:#0000}.bg-\[rgba\(45\,55\,72\,0\.4\)\]{background-color:#2d374866}.bg-\[rgba\(45\,55\,72\,0\.5\)\]{background-color:#2d374880}.bg-\[rgba\(45\,55\,72\,0\.6\)\]{background-color:#2d374899}.bg-\[var\(--color-accent-blue\)\]{background-color:var(--color-accent-blue)}.bg-\[var\(--color-accent-mint\)\]{background-color:var(--color-accent-mint)}.bg-\[var\(--color-accent-peach\)\]{background-color:var(--color-accent-peach)}.bg-\[var\(--color-accent-purple\)\]{background-color:var(--color-accent-purple)}.bg-\[var\(--color-accent-yellow\)\]{background-color:var(--color-accent-yellow)}.bg-\[var\(--color-bg\)\]{background-color:var(--color-bg)}.bg-\[var\(--color-bg-cream\)\]{background-color:var(--color-bg-cream)}.bg-\[var\(--color-border-light\)\]{background-color:var(--color-border-light)}.bg-\[var\(--color-crashed\)\]{background-color:var(--color-crashed)}.bg-\[var\(--color-crashed-bg\)\]{background-color:var(--color-crashed-bg)}.bg-\[var\(--color-cta\)\]{background-color:var(--color-cta)}.bg-\[var\(--color-primary\)\]{background-color:var(--color-primary)}.bg-\[var\(--color-running-bg\)\]{background-color:var(--color-running-bg)}.bg-\[var\(--color-secondary\)\]{background-color:var(--color-secondary)}.bg-\[var\(--color-stuck\)\]{background-color:var(--color-stuck)}.bg-\[var\(--color-stuck-bg\)\]{background-color:var(--color-stuck-bg)}.bg-\[var\(--color-text\)\]{background-color:var(--color-text)}.bg-\[var\(--color-text-subtle\)\]{background-color:var(--color-text-subtle)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-gray-400{background-color:var(--color-gray-400)}.bg-green-600{background-color:var(--color-green-600)}.bg-white{background-color:var(--color-white)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.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-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:calc(var(--spacing) * 0)}.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-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.font-\[family-name\:var\(--font-body\)\]{font-family:var(--font-body)}.font-\[family-name\:var\(--font-heading\)\]{font-family:var(--font-heading)}.font-\[family-name\:var\(--font-mono\)\],.font-mono{font-family:var(--font-mono)}.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-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))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[22px\]{--tw-leading:22px;line-height:22px}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--color-bg\)\]{color:var(--color-bg)}.text-\[var\(--color-crashed\)\]{color:var(--color-crashed)}.text-\[var\(--color-running\)\]{color:var(--color-running)}.text-\[var\(--color-stuck\)\]{color:var(--color-stuck)}.text-\[var\(--color-text\)\]{color:var(--color-text)}.text-\[var\(--color-text\)\]\/40{color:#2d374866}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-text\)\]\/40{color:color-mix(in oklab,var(--color-text) 40%,transparent)}}.text-\[var\(--color-text\)\]\/50{color:#2d374880}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-text\)\]\/50{color:color-mix(in oklab,var(--color-text) 50%,transparent)}}.text-\[var\(--color-text\)\]\/60{color:#2d374899}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-text\)\]\/60{color:color-mix(in oklab,var(--color-text) 60%,transparent)}}.text-\[var\(--color-text\)\]\/70{color:#2d3748b3}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-text\)\]\/70{color:color-mix(in oklab,var(--color-text) 70%,transparent)}}.text-\[var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[var\(--color-text-subtle\)\]{color:var(--color-text-subtle)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-2{text-decoration-thickness:2px}.accent-\[var\(--color-cta\)\]{accent-color:var(--color-cta)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.shadow{--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)}.shadow-\[1px_1px_0_var\(--color-text\)\]{--tw-shadow:1px 1px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[2px_2px_0_var\(--color-text\)\]{--tw-shadow:2px 2px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[3px_3px_0_var\(--color-text\)\]{--tw-shadow:3px 3px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[4px_4px_0_var\(--color-cta\)\]{--tw-shadow:4px 4px 0 var(--tw-shadow-color,var(--color-cta));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[4px_4px_0_var\(--color-text\)\]{--tw-shadow:4px 4px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[5px_5px_0_var\(--color-text\)\]{--tw-shadow:5px 5px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-nb{--tw-shadow:5px 5px 0 var(--tw-shadow-color,#2d3748);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[var\(--color-text\)\]{--tw-ring-color:var(--color-text)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,box-shadow\]{transition-property:transform,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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-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}.duration-\[180ms\]{--tw-duration:.18s;transition-duration:.18s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:-translate-x-0\.5:hover{--tw-translate-x:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-x-px:hover{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-px:hover{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-\[var\(--color-text\)\]:hover{border-color:var(--color-text)}.hover\:bg-\[var\(--color-accent-mint\)\]:hover{background-color:var(--color-accent-mint)}.hover\:bg-\[var\(--color-accent-yellow\)\]:hover{background-color:var(--color-accent-yellow)}.hover\:bg-\[var\(--color-bg-cream\)\]:hover{background-color:var(--color-bg-cream)}.hover\:text-\[var\(--color-crashed\)\]:hover{color:var(--color-crashed)}.hover\:text-\[var\(--color-text\)\]:hover{color:var(--color-text)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[2px_2px_0_var\(--color-text\)\]:hover{--tw-shadow:2px 2px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-\[3px_3px_0_var\(--color-text\)\]:hover{--tw-shadow:3px 3px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-\[4px_4px_0_var\(--color-text\)\]:hover{--tw-shadow:4px 4px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-\[5px_5px_0_var\(--color-text\)\]:hover{--tw-shadow:5px 5px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[var\(--color-text\)\]:focus-visible{--tw-ring-color:var(--color-text)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.active\:translate-x-0\.5:active{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.active\:translate-y-0\.5:active{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}}@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-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-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-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
@@ -372,13 +372,13 @@ Please change the parent <Route path="${_}"> to <Route path="${_==="/"?"*":`${_}
372
372
  *
373
373
  * This source code is licensed under the ISC license.
374
374
  * See the LICENSE file in the root directory of this source tree.
375
- */const uA=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],dA=Te("zap",uA),fA={"app.title":"SPS Console","nav.chat":"Chat","nav.projects":"Projects","nav.board":"Board","nav.workers":"Workers","nav.logs":"Logs","nav.skills":"Skills","nav.system":"System","nav.processes":"Processes","nav.audit":"Audit Log","nav.aria":"Main navigation","processes.title":"Processes","processes.subtitle":"Claude processes launched by SPS ACP (others, e.g. your own session, are not shown)","processes.refresh":"Refresh","processes.aliveCount":"{n}/{total} alive","processes.col.slot":"Slot","processes.col.project":"Project","processes.col.state":"State","processes.col.memory":"Memory","processes.col.action":"Action","processes.empty":"No SPS processes","processes.kill":"Kill","processes.killConfirm":"Kill process {slot}?","audit.title":"Audit Log","audit.subtitle":"Project lifecycle: create / modify / delete","audit.refresh":"Refresh","audit.filter.all":"All","audit.action.create":"Create","audit.action.modify":"Modify","audit.action.delete":"Delete","audit.col.time":"Time","audit.col.action":"Action","audit.col.project":"Project","audit.col.detail":"Detail","audit.empty":"No audit records","lang.toggle.aria":"Switch interface language","lang.en":"EN","lang.zh":"中","status.server":"server","status.offline":"offline","status.sse.open":"SSE","status.sse.connecting":"SSE·connect","status.sse.down":"SSE·down","status.pipelines.tooltip":"Active pipelines","status.workers.tooltip":"Active workers","status.pipeline.unit":"pipeline","status.worker.unit":"worker","common.save":"Save","common.cancel":"Cancel","common.delete":"Delete","common.confirm":"Confirm","common.create":"Create","common.edit":"Edit","common.close":"Close","common.loading":"Loading…","common.error":"Error","common.retry":"Retry","common.empty":"Nothing here yet","common.search":"Search","common.refresh":"Refresh","common.copy":"Copy","common.copied":"Copied","common.yes":"Yes","common.no":"No","common.required":"Required","common.optional":"Optional","common.ok":"OK","projects.title":"Projects 🎯","projects.count":"{count} local project(s)","projects.refresh.hint":"Click refresh to retry","projects.new":"New project","projects.load.failed":"Failed to load","projects.empty.title":"No projects yet ✨","projects.empty.hint":"Run {cmd} to create your first project.","newProject.title":"New project","newProject.subtitle":"Set up a project; the worker will run automatically","newProject.field.name":"Project name","newProject.field.name.help":"Lowercase letters, digits, _ and - only","newProject.field.dir":"Project directory","newProject.field.dir.help":"Absolute path; will be created if missing","newProject.field.branch":"Merge target branch","newProject.field.branch.help":"Default: main","newProject.field.maxWorkers":"Max concurrent workers","newProject.field.maxWorkers.help":"Per-project worker count (1 recommended)","newProject.field.ackTimeout":"ACK timeout (seconds)","newProject.field.ackTimeout.help":"How long to wait for the worker to ACK (default 300)","newProject.field.gitlabProject":"GitLab/GitHub remote","newProject.field.gitlabProject.help":"Format: user/repo (optional)","newProject.field.matrixRoom":"Matrix room ID","newProject.field.matrixRoom.help":"Optional, falls back to global default","newProject.field.git":"Enable git","newProject.field.git.help":"Off → non-code project, no commit/push/MR steps","newProject.field.wiki":"Enable Wiki knowledge base","newProject.field.wiki.help":"v0.51+: scaffold wiki/ in the project, inject 5-layer retrieval into worker prompts","newProject.submit":"Create project","newProject.creating":"Creating…","newProject.created":"Project created","newProject.error.dirRequired":"Project directory is required","newProject.dir.browse":"Browse","newProject.dir.browseAria":"Pick directory","newProject.back":"Back","newProject.back.aria":"Back to projects","newProject.field.name.placeholder":"e.g. acme-web","newProject.field.name.example":"Letters, digits, underscore, hyphen. e.g. acme-web","newProject.field.name.invalid":"Name only allows a-z A-Z 0-9 _ -","newProject.field.dir.long":"Absolute path on this machine (code or docs). Independent of git toggle.","newProject.field.dir.placeholder":"/home/you/code/acme","newProject.field.dir.createIfMissing":"Auto-create if missing (recommended — otherwise .claude/ and wiki/ install gets skipped)","newProject.field.dir.pickerTitle":"Pick project directory","newProject.field.maxWorkers.short":"Max workers","newProject.field.ackTimeout.minutes":"ACK timeout (min)","newProject.field.ackTimeout.minutes.help":"How long after dispatch before the worker is considered failed if no ACK","newProject.field.git.label":"Enable Git (worker auto commit + push)","newProject.field.git.detail":"When off, the worker only does the task, no version control — fits docs / data-processing non-code projects.","newProject.field.git.branch":"Merge branch","newProject.field.gitlabProject.label":"Git remote project path","newProject.field.gitlabProject.help2":"Like user/repo. Empty = skip remote API (commit/push local only)","newProject.field.gitlabProject.placeholder":"user/repo","newProject.field.gitlabProjectId":"GitLab project ID","newProject.field.gitlabProjectId.help":"Number; leave blank for GitHub","newProject.field.gitlabProjectId.placeholder":"42","newProject.field.wiki.label":"Enable Wiki knowledge base (per-project, doc-28)","newProject.field.wiki.detail":"Scaffolds {wikiCode} and injects 5-layer retrieval + wiki-update hints into the worker prompt. You can also run {wikiInit} later.","newProject.section.notifications":"Notifications","newProject.field.matrixRoom.label":"Matrix room ID","newProject.field.matrixRoom.help2":"Empty = use global config; blank = no notifications","newProject.field.matrixRoom.placeholder":"!abc:matrix.example.com","newProject.error.create.title":"Create failed","projectDetail.tab.pipeline":"Pipeline","projectDetail.tab.conf":"Conf","projectDetail.tab.delete":"Delete project","projectDetail.delete.title":"Delete this project","projectDetail.delete.warn":"This will remove the project conf, runtime, and worktrees. The repository under {repoDir} is untouched.","projectDetail.delete.confirmLabel":"Type the project name to confirm","projectDetail.delete.button":"Delete project","projectDetail.delete.deleting":"Deleting…","projectDetail.lastActivity":"Last activity","projectDetail.notFound":"Project not found","projectDetail.notFoundHint":"It may have been deleted or renamed.","projectDetail.backToList":"Back to projects","pipeline.editor.title":"Pipeline YAML","pipeline.editor.savedAt":"Saved {time}","pipeline.editor.unsaved":"Unsaved changes","pipeline.editor.save":"Save","pipeline.editor.saving":"Saving…","pipeline.editor.reload":"Reload from disk","pipeline.editor.discard.title":"Discard unsaved changes?","pipeline.editor.discard.body":"Your edits will be lost.","pipeline.editor.errors":"YAML parse errors","pipeline.editor.list":"Pipelines","pipeline.editor.list.add":"New pipeline","pipeline.editor.list.delete":"Delete pipeline","pipeline.editor.list.use":"Use as active","pipeline.editor.list.activeBadge":"active","pipeline.editor.list.sample":"sample","pipeline.editor.delete.confirm.title":"Delete pipeline {name}?","pipeline.editor.delete.confirm.body":"This action cannot be undone.","pipeline.newDialog.title":"New pipeline","pipeline.newDialog.field.filename":"Filename","pipeline.newDialog.field.filename.help":"Letters, digits, _ and - only; .yaml will be appended","pipeline.newDialog.field.copyFrom":"Copy from","pipeline.newDialog.copyFrom.sample":"sample template","pipeline.newDialog.copyFrom.active":"current active","pipeline.newDialog.create":"Create","projectDetail.tab.overview":"Overview","projectDetail.tab.config":"Config","projectDetail.tab.pipelines":"Pipelines","projectDetail.tab.danger":"Danger zone","projectDetail.openBoard":"Board","projectDetail.overview.repoDir":"Repo path","projectDetail.overview.pmBackend":"PM backend","projectDetail.overview.agent":"Agent","projectDetail.overview.cards":"Cards","projectDetail.overview.cards.value":"{total} total · {inprogress} in progress · {done} done","projectDetail.overview.workers":"Workers","projectDetail.overview.workers.value":"{total} total ({active} active)","projectDetail.overview.pipeline":"Pipeline","projectDetail.overview.lastActivity":"Last activity","projectDetail.overview.notFound":"Project {name} not found or unreadable.","projectDetail.config.confDirty":"● Unsaved changes","projectDetail.config.reload":"Reload","projectDetail.config.save":"Save","projectDetail.config.saveAria":"Save config","projectDetail.config.editorAria":"conf file editor","projectDetail.config.error.conflict.title":"Config was modified elsewhere","projectDetail.config.error.conflict.body":"The conf file was changed while you were editing. Click Reload, then re-edit.","projectDetail.config.error.save.title":"Save failed","projectDetail.config.error.load":"Load failed: {detail}","projectDetail.pipelines.title":"Pipelines","projectDetail.pipelines.add":"New pipeline","projectDetail.pipelines.empty":'No pipeline files yet. Click "New pipeline" to start.',"projectDetail.pipelines.activeBadge":"active","projectDetail.pipelines.edit":"Edit","projectDetail.pipelines.editAria":"Edit {name}","projectDetail.pipelines.switch":"Switch","projectDetail.pipelines.switchAria":"Switch to {name}","projectDetail.pipelines.switch.confirm.title":"Switch to {name}","projectDetail.pipelines.switch.confirm.body":"The current project.yaml will be overwritten with the contents of {name}. Continue?","projectDetail.pipelines.switch.confirm.button":"Switch","projectDetail.pipelines.switch.error":"Switch failed","projectDetail.pipelines.delete.confirm.title":"Delete {name}","projectDetail.pipelines.delete.confirm.body":"This pipeline file will be permanently deleted.","projectDetail.pipelines.delete.error":"Delete failed","projectDetail.pipelines.deleteAria":"Delete {name}","projectDetail.pipelines.create.error":"Create failed","projectDetail.danger.title":"Delete project","projectDetail.danger.body":"This clears {path} (all cards, runtime, logs).","projectDetail.danger.includeClaude.label":"Also clear repo's .claude/","projectDetail.danger.includeClaude.note":"The repo itself is untouched; only this directory is cleaned.","projectDetail.danger.confirmPrompt":"Type the project name {name} to confirm:","projectDetail.danger.deleteAria":"Permanently delete project","projectDetail.danger.deleteButton":"Permanently delete","projectDetail.danger.deleted.title":"Deleted","projectDetail.danger.deleted.bodyWithList":`Project deleted. Also cleaned up:
375
+ */const uA=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],dA=Te("zap",uA),fA={"app.title":"SPS Console","nav.chat":"Chat","nav.projects":"Projects","nav.board":"Board","nav.workers":"Workers","nav.logs":"Logs","nav.skills":"Skills","nav.system":"System","nav.processes":"Processes","nav.audit":"Audit Log","nav.aria":"Main navigation","processes.title":"Processes","processes.subtitle":"Claude processes launched by SPS ACP (others, e.g. your own session, are not shown)","processes.refresh":"Refresh","processes.aliveCount":"{n}/{total} alive","processes.col.slot":"Slot","processes.col.project":"Project","processes.col.state":"State","processes.col.memory":"Memory","processes.col.action":"Action","processes.empty":"No SPS processes","processes.filter.all":"All","processes.filter.alive":"Running","processes.filter.offline":"Offline","processes.kill":"Kill","processes.killConfirm":"Kill process {slot}?","audit.title":"Audit Log","audit.subtitle":"Project lifecycle: create / modify / delete","audit.refresh":"Refresh","audit.filter.all":"All","audit.action.create":"Create","audit.action.modify":"Modify","audit.action.delete":"Delete","audit.col.time":"Time","audit.col.action":"Action","audit.col.project":"Project","audit.col.detail":"Detail","audit.empty":"No audit records","lang.toggle.aria":"Switch interface language","lang.en":"EN","lang.zh":"中","status.server":"server","status.offline":"offline","status.sse.open":"SSE","status.sse.connecting":"SSE·connect","status.sse.down":"SSE·down","status.pipelines.tooltip":"Active pipelines","status.workers.tooltip":"Active workers","status.pipeline.unit":"pipeline","status.worker.unit":"worker","common.save":"Save","common.cancel":"Cancel","common.delete":"Delete","common.confirm":"Confirm","common.create":"Create","common.edit":"Edit","common.close":"Close","common.loading":"Loading…","common.error":"Error","common.retry":"Retry","common.empty":"Nothing here yet","common.search":"Search","common.refresh":"Refresh","common.copy":"Copy","common.copied":"Copied","common.yes":"Yes","common.no":"No","common.required":"Required","common.optional":"Optional","common.ok":"OK","projects.title":"Projects 🎯","projects.count":"{count} local project(s)","projects.refresh.hint":"Click refresh to retry","projects.new":"New project","projects.load.failed":"Failed to load","projects.empty.title":"No projects yet ✨","projects.empty.hint":"Run {cmd} to create your first project.","newProject.title":"New project","newProject.subtitle":"Set up a project; the worker will run automatically","newProject.field.name":"Project name","newProject.field.name.help":"Lowercase letters, digits, _ and - only","newProject.field.dir":"Project directory","newProject.field.dir.help":"Absolute path; will be created if missing","newProject.field.branch":"Merge target branch","newProject.field.branch.help":"Default: main","newProject.field.maxWorkers":"Max concurrent workers","newProject.field.maxWorkers.help":"Per-project worker count (1 recommended)","newProject.field.ackTimeout":"ACK timeout (seconds)","newProject.field.ackTimeout.help":"How long to wait for the worker to ACK (default 300)","newProject.field.gitlabProject":"GitLab/GitHub remote","newProject.field.gitlabProject.help":"Format: user/repo (optional)","newProject.field.matrixRoom":"Matrix room ID","newProject.field.matrixRoom.help":"Optional, falls back to global default","newProject.field.git":"Enable git","newProject.field.git.help":"Off → non-code project, no commit/push/MR steps","newProject.field.wiki":"Enable Wiki knowledge base","newProject.field.wiki.help":"v0.51+: scaffold wiki/ in the project, inject 5-layer retrieval into worker prompts","newProject.submit":"Create project","newProject.creating":"Creating…","newProject.created":"Project created","newProject.error.dirRequired":"Project directory is required","newProject.dir.browse":"Browse","newProject.dir.browseAria":"Pick directory","newProject.back":"Back","newProject.back.aria":"Back to projects","newProject.field.name.placeholder":"e.g. acme-web","newProject.field.name.example":"Letters, digits, underscore, hyphen. e.g. acme-web","newProject.field.name.invalid":"Name only allows a-z A-Z 0-9 _ -","newProject.field.dir.long":"Absolute path on this machine (code or docs). Independent of git toggle.","newProject.field.dir.placeholder":"/home/you/code/acme","newProject.field.dir.createIfMissing":"Auto-create if missing (recommended — otherwise .claude/ and wiki/ install gets skipped)","newProject.field.dir.pickerTitle":"Pick project directory","newProject.field.maxWorkers.short":"Max workers","newProject.field.ackTimeout.minutes":"ACK timeout (min)","newProject.field.ackTimeout.minutes.help":"How long after dispatch before the worker is considered failed if no ACK","newProject.field.git.label":"Enable Git (worker auto commit + push)","newProject.field.git.detail":"When off, the worker only does the task, no version control — fits docs / data-processing non-code projects.","newProject.field.git.branch":"Merge branch","newProject.field.gitlabProject.label":"Git remote project path","newProject.field.gitlabProject.help2":"Like user/repo. Empty = skip remote API (commit/push local only)","newProject.field.gitlabProject.placeholder":"user/repo","newProject.field.gitlabProjectId":"GitLab project ID","newProject.field.gitlabProjectId.help":"Number; leave blank for GitHub","newProject.field.gitlabProjectId.placeholder":"42","newProject.field.wiki.label":"Enable Wiki knowledge base (per-project, doc-28)","newProject.field.wiki.detail":"Scaffolds {wikiCode} and injects 5-layer retrieval + wiki-update hints into the worker prompt. You can also run {wikiInit} later.","newProject.section.notifications":"Notifications","newProject.field.matrixRoom.label":"Matrix room ID","newProject.field.matrixRoom.help2":"Empty = use global config; blank = no notifications","newProject.field.matrixRoom.placeholder":"!abc:matrix.example.com","newProject.error.create.title":"Create failed","projectDetail.tab.pipeline":"Pipeline","projectDetail.tab.conf":"Conf","projectDetail.tab.delete":"Delete project","projectDetail.delete.title":"Delete this project","projectDetail.delete.warn":"This will remove the project conf, runtime, and worktrees. The repository under {repoDir} is untouched.","projectDetail.delete.confirmLabel":"Type the project name to confirm","projectDetail.delete.button":"Delete project","projectDetail.delete.deleting":"Deleting…","projectDetail.lastActivity":"Last activity","projectDetail.notFound":"Project not found","projectDetail.notFoundHint":"It may have been deleted or renamed.","projectDetail.backToList":"Back to projects","pipeline.editor.title":"Pipeline YAML","pipeline.editor.savedAt":"Saved {time}","pipeline.editor.unsaved":"Unsaved changes","pipeline.editor.save":"Save","pipeline.editor.saving":"Saving…","pipeline.editor.reload":"Reload from disk","pipeline.editor.discard.title":"Discard unsaved changes?","pipeline.editor.discard.body":"Your edits will be lost.","pipeline.editor.errors":"YAML parse errors","pipeline.editor.list":"Pipelines","pipeline.editor.list.add":"New pipeline","pipeline.editor.list.delete":"Delete pipeline","pipeline.editor.list.use":"Use as active","pipeline.editor.list.activeBadge":"active","pipeline.editor.list.sample":"sample","pipeline.editor.delete.confirm.title":"Delete pipeline {name}?","pipeline.editor.delete.confirm.body":"This action cannot be undone.","pipeline.newDialog.title":"New pipeline","pipeline.newDialog.field.filename":"Filename","pipeline.newDialog.field.filename.help":"Letters, digits, _ and - only; .yaml will be appended","pipeline.newDialog.field.copyFrom":"Copy from","pipeline.newDialog.copyFrom.sample":"sample template","pipeline.newDialog.copyFrom.active":"current active","pipeline.newDialog.create":"Create","projectDetail.tab.overview":"Overview","projectDetail.tab.config":"Config","projectDetail.tab.pipelines":"Pipelines","projectDetail.tab.danger":"Danger zone","projectDetail.openBoard":"Board","projectDetail.overview.repoDir":"Repo path","projectDetail.overview.pmBackend":"PM backend","projectDetail.overview.agent":"Agent","projectDetail.overview.cards":"Cards","projectDetail.overview.cards.value":"{total} total · {inprogress} in progress · {done} done","projectDetail.overview.workers":"Workers","projectDetail.overview.workers.value":"{total} total ({active} active)","projectDetail.overview.pipeline":"Pipeline","projectDetail.overview.lastActivity":"Last activity","projectDetail.overview.notFound":"Project {name} not found or unreadable.","projectDetail.config.confDirty":"● Unsaved changes","projectDetail.config.reload":"Reload","projectDetail.config.save":"Save","projectDetail.config.saveAria":"Save config","projectDetail.config.editorAria":"conf file editor","projectDetail.config.error.conflict.title":"Config was modified elsewhere","projectDetail.config.error.conflict.body":"The conf file was changed while you were editing. Click Reload, then re-edit.","projectDetail.config.error.save.title":"Save failed","projectDetail.config.error.load":"Load failed: {detail}","projectDetail.pipelines.title":"Pipelines","projectDetail.pipelines.add":"New pipeline","projectDetail.pipelines.empty":'No pipeline files yet. Click "New pipeline" to start.',"projectDetail.pipelines.activeBadge":"active","projectDetail.pipelines.edit":"Edit","projectDetail.pipelines.editAria":"Edit {name}","projectDetail.pipelines.switch":"Switch","projectDetail.pipelines.switchAria":"Switch to {name}","projectDetail.pipelines.switch.confirm.title":"Switch to {name}","projectDetail.pipelines.switch.confirm.body":"The current project.yaml will be overwritten with the contents of {name}. Continue?","projectDetail.pipelines.switch.confirm.button":"Switch","projectDetail.pipelines.switch.error":"Switch failed","projectDetail.pipelines.delete.confirm.title":"Delete {name}","projectDetail.pipelines.delete.confirm.body":"This pipeline file will be permanently deleted.","projectDetail.pipelines.delete.error":"Delete failed","projectDetail.pipelines.deleteAria":"Delete {name}","projectDetail.pipelines.create.error":"Create failed","projectDetail.danger.title":"Delete project","projectDetail.danger.body":"This clears {path} (all cards, runtime, logs).","projectDetail.danger.includeClaude.label":"Also clear repo's .claude/","projectDetail.danger.includeClaude.note":"The repo itself is untouched; only this directory is cleaned.","projectDetail.danger.confirmPrompt":"Type the project name {name} to confirm:","projectDetail.danger.deleteAria":"Permanently delete project","projectDetail.danger.deleteButton":"Permanently delete","projectDetail.danger.deleted.title":"Deleted","projectDetail.danger.deleted.bodyWithList":`Project deleted. Also cleaned up:
376
376
  {paths}`,"projectDetail.danger.deleted.body":"Project deleted.","projectDetail.danger.error":"Delete failed","pipelineEditor.close":"Close","pipelineEditor.error.conflict.title":"File was modified elsewhere","pipelineEditor.error.yaml.title":"YAML syntax error","pipelineEditor.error.save.title":"Save failed","pipelineEditor.error.serialize.title":"YAML serialize failed","pipelineEditor.error.load":"Load failed: {detail}","pipelineEditor.mode.structured":"Structured","pipelineEditor.mode.yaml":"Raw YAML","pipelineEditor.parseError.prefix":"YAML parse: {detail}","pipelineEditor.activeWarning":"⚠ This is the active pipeline — saving will take effect on the next tick","pipelineEditor.yamlAria":"pipeline YAML editor","pipelineEditor.status.unsaved":"● Unsaved","pipelineEditor.status.saved":"Saved","pipelineEditor.status.noChanges":"No changes","pipelineEditor.reload":"Reload","pipelineEditor.save":"Save","pipelineEditor.saveAria":"Save pipeline","pipelineEditor.activeBadge":"active","pipelineEditor.modeHint":"project = event-driven pipeline (default) · steps = sequential script","pipelineEditor.stages.heading":"Stages ({count})","pipelineEditor.stages.add":"Add stage","pipelineEditor.stages.empty":'No stages yet. Click "Add stage" to start.',"pipelineEditor.stage.name.hint":"Unique stage name","pipelineEditor.stage.profile.hint":"skill profile, may be empty","pipelineEditor.stage.cardState.hint":"Card state during this stage","pipelineEditor.stage.timeout.hint":"Optional, e.g. 30m 2h","pipelineEditor.stage.trigger.hint":"Trigger condition, blank uses default","pipelineEditor.stage.onComplete.hint":"Action on success","pipelineEditor.stage.onFail.action.hint":"Action on failure, e.g. label NEEDS-FIX","pipelineEditor.stage.onFail.comment.hint":"Comment written on the card","pipelineEditor.stage.halt.note":"(stops pipeline on failure; uncheck to continue with next card)","pipelineEditor.stage.moveUp":"Move up","pipelineEditor.stage.moveDown":"Move down","pipelineEditor.stage.remove":"Remove stage","newPipelineDialog.title":"New pipeline","newPipelineDialog.field.filename.label":"Filename","newPipelineDialog.field.filename.placeholder":"e.g. ci","newPipelineDialog.field.filename.help":"Will be saved as {filename}. Only a-z A-Z 0-9 _ - allowed; an existing file errors 409.","newPipelineDialog.section.template":"Initial content","newPipelineDialog.template.blank.label":"Blank template","newPipelineDialog.template.blank.desc":"Minimal 1-stage pipeline (develop → Done)","newPipelineDialog.template.sample.label":"Tutorial template","newPipelineDialog.template.sample.desc":"Copied from sample.yaml.example (annotated, every field explained)","newPipelineDialog.template.sample.unavailable":"sample.yaml.example does not exist","newPipelineDialog.template.active.label":"Copy current active","newPipelineDialog.template.active.desc":"Copied from project.yaml (build on the current config)","newPipelineDialog.template.active.unavailable":"project.yaml does not exist","newPipelineDialog.create.aria":"Create pipeline","newPipelineDialog.cancel":"Cancel","board.title":"Board ✨","board.title.bare":"Board","board.subtitle":"{name} · {cards} cards · {workers} workers active","board.pickPrompt.title":"Pick a project 🎯","board.pickPrompt.body":"The board is per-project. Pick one to start:","board.action.start":"Start","board.action.stop":"Stop","board.action.startAria":"Start pipeline","board.action.stopAria":"Stop pipeline","board.action.startError":"Failed to start pipeline","board.action.stopError":"Failed to stop pipeline","board.action.reset":"Reset","board.action.resetError":"Reset failed","board.action.reset.confirm.title":"Reset the entire pipeline","board.action.reset.confirm.body":"This clears all cards’ run state, worker markers, and branches. Cannot be undone.","board.action.reset.confirm.button":"Reset all","board.action.newCard":"New card","board.action.newCard.error":"Failed to create card","board.action.moveCard.error":"Failed to move card","board.search.placeholder":"Search title / skill / label…","board.search.aria":"Search cards","board.filter.clear":"Clear","board.filter.clearAria":"Clear filters","board.filter.aria":"Filter by {label}","board.filter.clearSelection":"Clear selection","board.error.loadCards":"Failed to load cards","board.col.planning":"Planning","board.col.backlog":"Backlog","board.col.todo":"Todo","board.col.inprogress":"Inprogress","board.col.qa":"QA / Review","board.col.done":"Done","kanban.checklist.label":"Checklist {done}/{total}","kanban.checklist.more":"… {count} more","kanban.column.empty":"— empty —","kanban.time.justNow":"just now","kanban.time.minutes":"{n}m ago","kanban.time.hours":"{n}h ago","kanban.time.days":"{n}d ago","newCard.title":"New card","newCard.field.title":"Title *","newCard.field.title.placeholder":"e.g. Add GitHub OAuth login","newCard.field.title.help":"Short, clear goal (<200 chars)","newCard.field.description":"Description","newCard.field.description.placeholder":"User story, requirements, acceptance criteria, references… Claude reads this when starting","newCard.field.description.help":"Markdown supported. If empty, Claude only sees the title.","newCard.field.skills":"Skills","newCard.field.skills.help":"Pick which skills get loaded (via frontmatter `skills:`). Optional — worker falls back to project-level skills.","newCard.field.skills.loading":"Loading skills…","newCard.field.skills.error":"Failed to load skills (creation still works): {detail}","newCard.field.skills.selected":"{count} selected: {names}","newCard.field.dispatch":"Dispatch","newCard.field.dispatch.label":"Dispatch immediately (go straight to Backlog)","newCard.field.dispatch.help":"Default off: card lands in Planning to wait; drag to Backlog when ready. On: skip Planning, the next tick assigns a worker.","newCard.create.aria":"Create card","cardDetail.loading":"Loading…","cardDetail.error.load":"Failed to load card","cardDetail.tabs.overview":"Overview","cardDetail.tabs.body":"Description","cardDetail.tabs.checklist":"Checklist","cardDetail.tabs.history":"History","cardDetail.tabs.actions":"Actions","cardDetail.field.state":"State","cardDetail.field.skills":"Skills","cardDetail.field.labels":"Labels","cardDetail.field.branch":"Branch","cardDetail.field.assignee":"Assignee","cardDetail.field.created":"Created","cardDetail.field.updated":"Updated","cardDetail.field.empty":"—","cardDetail.actions.delete":"Delete card","cardDetail.actions.delete.confirm.title":"Delete card #{seq}","cardDetail.actions.delete.confirm.body":"This card will be permanently deleted.","cardDetail.actions.delete.error":"Delete failed","cardDetail.actions.update.error":"Update failed","cardDetail.body.empty":"No description","cardDetail.checklist.empty":"No checklist","cardDetail.checklist.progress":"Progress {done}/{total}","cardDetail.history.empty":"No history","cardDetail.notFound":"Card #{seq} not found","cardDetail.copy.aria":"Copy seq","cardDetail.close.aria":"Close","cardDetail.save":"Save","cardDetail.saving":"Saving…","workers.title":"Workers 👷","workers.summary":"Across {projects} projects · {running} running · {starting} starting · {stuck} stuck · {crashed} crashed · {idle} idle","workers.summary.stuck":"{n} stuck","workers.summary.crashed":"{n} crashed","workers.refresh.aria":"Refresh","workers.refresh":"Refresh","workers.error.load":"Load failed: {detail}","workers.empty.hint":"Click a project / worker to see details","logs.title":"Logs 📜","logs.subtitle.allProjects":"All projects","logs.subtitle.project":"{name} live tail","logs.filter.errors":"Errors only","logs.filter.errors.aria":"Show errors only","logs.filter.search.placeholder":"Filter messages…","logs.empty":"No logs yet — waiting for events","logs.error.load":"Failed to load logs","logs.refresh":"Refresh","logs.refresh.aria":"Refresh logs","logs.scroll.bottom.aria":"Scroll to bottom","logs.scroll.pause":"Paused (autoscroll off)","logs.scroll.resume":"Resume autoscroll","logs.subtitle.allProjectsCount":"All projects ({count})","logs.poll.5s":"5s polling","logs.paused":"⏸ PAUSED","logs.mode.live":"Live","logs.mode.history":"History","logs.history.startAria":"Query start time","logs.history.queryAria":"Query","logs.history.query":"Query","logs.filter.project.aria":"Filter project","logs.filter.project.all":"All projects","logs.filter.keyword.placeholder":"Filter keyword…","logs.filter.keyword.aria":"Filter logs","logs.empty.match":"No matching logs","skills.title":"Skills 🧠","skills.subtitle":"Skills shared across projects (managed via `sps skill ...`)","skills.empty.title":"No skills yet","skills.empty.hint":"Run {cmd} to sync the bundled skills.","skills.linked.tooltip":"linked into this project","skills.frozen.tooltip":"frozen (per-project copy)","skills.category.all":"All","skills.category.language":"language","skills.category.end":"end","skills.category.persona":"persona","skills.category.workflow":"workflow","skills.category.other":"other","skills.subtitleCount":"{count} user-level skill(s)","skills.search.placeholder":"Search skill…","skills.search.aria":"Search skill","skillDetail.actionFailed":"{label} failed","skillDetail.unfreezeAction":"Unfreeze","skillDetail.freezeAction":"Freeze","skillDetail.removeAction":"Remove","skillDetail.removeConfirm.title":"Remove {name} from {project}","skillDetail.removeConfirm.body":"The skill link will be removed; the project will not see this skill on next run.","skillDetail.removeConfirm.button":"Remove","skillDetail.unfreezeConfirm.title":"Unfreeze {name} @ {project}","skillDetail.unfreezeConfirm.body":"Local changes to this skill will be overwritten with the latest shared version.","skillDetail.unfreezeConfirm.button":"Unfreeze","skillDetail.close.aria":"Close","skillDetail.loading":"Loading…","skillDetail.error.load":"Load failed: {detail}","skillDetail.section.projects":"Per-project link status","skillDetail.section.empty":"No projects yet. Create one first.","skillDetail.section.preview":"SKILL.md preview","skillDetail.toggleSection.aria":"{action} {file}","skillDetail.expand":"Expand","skillDetail.collapse":"Collapse","system.title":"System 🛠","system.subtitle":"Global config + diagnostics + upgrades","system.section.env":"Global env","system.section.env.help":"Stored in ~/.coral/env (mode 600). Used by all projects.","system.section.env.save":"Save env","system.section.env.error.conflict":"env was modified elsewhere","system.section.env.error.save":"Failed to save env","system.section.env.error.load":"Failed to load env","system.section.env.dirtyDot":"● Unsaved","system.section.env.aria":"env editor","system.section.env.reload":"Reload","system.section.upgrade":"Upgrade","system.section.upgrade.current":"Current: v{version}","system.section.upgrade.latest":"Latest on npm: v{version}","system.section.upgrade.uptodate":"Up to date","system.section.upgrade.update":"Upgrade now","system.section.upgrade.upgrading":"Upgrading…","system.section.upgrade.checking":"Checking npm…","system.section.upgrade.checkError":"Check failed: {detail}","system.section.upgrade.upgradeError":"Upgrade failed: {detail}","system.section.upgrade.upgradeError.title":"Upgrade failed","system.section.upgrade.command":"Or run in terminal: {cmd}","system.section.upgrade.runningPipelines":"Pipelines running — stop them first: {projects}","system.section.diagnostics":"Diagnostics","system.section.diagnostics.help":"Run sps doctor across all projects, see failures at a glance","system.section.diagnostics.run":"Run diagnostics","system.section.diagnostics.running":"Running…","system.section.diagnostics.empty":"No projects","system.section.diagnostics.checkAria":"Check {project}","system.section.diagnostics.statusOk":"OK","system.section.diagnostics.statusFail":"Issues","system.section.diagnostics.error":"Diagnostic failed: {detail}","system.h1":"System ⚙️","system.runtime":"Runtime","system.env.title.code":"~/.coral/env","system.env.title.prefix":"Global config ","system.env.edit.aria":"Edit env file","system.env.edit.button":"Edit","system.env.editing.label":"⚠ Editing","system.env.empty.before":'env file does not exist. Click "Edit" or run ',"system.env.empty.after":" in the terminal.","system.env.warning":"⚠ This file contains plaintext credentials. Keep mode 0600 on save.","system.env.aria":"env editor","system.env.dirtyMark":" · ● Unsaved","system.env.cancel":"Cancel","system.env.save":"Save","system.env.save.aria":"Save env","system.env.error.conflict.title":"env was modified elsewhere","system.env.error.save.title":"Save failed","system.env.error.conflict.body":"Cancel and reopen the editor.","system.upgrade.title":"Version","system.upgrade.checkLatest.aria":"Check latest version","system.upgrade.checkUpdate":"Check update","system.upgrade.label.current":"sps-cli (current)","system.upgrade.label.latest":"npm (latest)","system.upgrade.latestPill":"latest","system.upgrade.button.upgradeAria":"Upgrade to latest","system.upgrade.button.upgrade":"Upgrade","system.upgrade.button.copyAria":"Copy upgrade command","system.upgrade.button.copyTitle":"Copy command (run manually if auto upgrade fails)","system.upgrade.button.copy":"Copy command","system.upgrade.label.installed":"Installed","system.upgrade.installed.ok":"Active (restart console to see)","system.upgrade.installed.fail":"Upgrade not effective","system.upgrade.label.check":"Check","system.upgrade.confirm.title":"Upgrade sps-cli","system.upgrade.confirm.body":"Current {current}, upgrade to {latest}. Requires all pipelines stopped. Restart sps console after upgrade.","system.upgrade.confirm.button":"Upgrade","system.upgrade.success.title":"Upgrade complete","system.upgrade.success.body":'Installed v{version}. Run `pkill -f "sps console"` and restart to see it.',"system.upgrade.notEffective.title":"Upgrade not effective","system.upgrade.notEffective.same":"npm finished but the version did not change (still {version}) — likely a permissions or registry issue. Copy the command below to run manually.","system.upgrade.notEffective.notInstalled":"npm did not install a new version. Copy the command to run manually, or check the log below.","system.upgrade.error.title":"Upgrade failed","system.upgrade.copy.success.title":"Command copied","system.upgrade.copy.success.body":`Paste it into a terminal:
377
377
  {cmd}`,"system.upgrade.copy.fail.title":"Copy failed","system.upgrade.copy.fail.body":`Copy manually:
378
378
  {cmd}`,"system.diagnostics.title":"Project health check","system.diagnostics.checkAll":"Check all","system.diagnostics.empty":"No projects yet.","system.diagnostics.expandAria":"Expand","system.diagnostics.collapseAria":"Collapse","system.diagnostics.never":'Click "Check" to run sps doctor',"system.diagnostics.checkAria":"Check","system.diagnostics.check":"Check","system.diagnostics.noFixesNeeded":"Nothing to fix","system.diagnostics.fix.tip":"Run sps doctor <proj> --fix: auto-create .claude/hooks/stop.sh, state.json, etc.","system.diagnostics.fixAria":"Auto fix","system.diagnostics.fix":"Fix","system.diagnostics.fixed":"Fixed","system.diagnostics.error.fix":"doctor fix failed","system.diagnostics.error.check":"doctor check failed","chat.title":"Chat 💬","chat.empty.title":"Chat 💬","chat.empty.hint":'Click "New chat" on the left to start a session, or just type below — a session will be auto-created.',"chat.empty.shortcuts":"Enter to send · Shift+Enter for newline · streamed reply","chat.list.heading":"History {count}","chat.list.new":"New chat","chat.list.empty":"No chats yet. Click above to start.","chat.list.delete.aria":"Delete chat","chat.list.deleteCli.aria":"Remove this CLI session from the Console (does not affect Claude jsonl history)","chat.list.openAria":"Open chat {title}{cwd}","chat.list.cwdSuffix":" (cwd: {cwd})","chat.list.msgs":"{count} msg · {time}","chat.delete.confirm.title":"Delete chat","chat.delete.confirm.body.cli":"Will be removed from the Console list (the daemon session is stopped). The Claude CLI history under ~/.claude/projects is preserved — to continue, run `sps agent --chat --name <name>` in a terminal.","chat.delete.confirm.body.console":"Chat history will be permanently deleted.","chat.delete.confirm.button":"Delete","chat.cli.banner.bold":"CLI session","chat.cli.banner":"This session was created by sps agent. The Console only shows history. To continue, run in a terminal:","chat.input.placeholder":"Say something… (Enter to send, Shift+Enter for newline, drag files / paste images)","chat.input.dragOver":"Drop to attach…","chat.input.aria":"Message input","chat.input.attach.aria":"Attach a local file","chat.input.attach.title":"Attach a local file (also drag / paste images)","chat.input.send":"Send","chat.input.send.aria":"Send","chat.input.interrupt":"Stop","chat.input.interrupt.aria":"Stop generation","chat.input.uploading":"Uploading…","chat.input.removeAttachment":"Remove {name}","chat.error.interrupt.title":"Interrupt failed","chat.cliBadge":"CLI","chat.cliBadge.tooltip":"Created by sps agent CLI; history is read live from Claude jsonl (read-only).","chat.session.title":"{title}","chat.session.id":"{id}","chat.session.empty":"Type a question below to start · Enter to send · Shift+Enter for newline","notFound.title":"404","notFound.body":"This page does not exist.","notFound.home":"Back to home","workers.active.empty":"No workers running.","workers.alerts.allHealthy":"All workers healthy","workers.alerts.pidDead":"PID dead.","workers.alerts.markerStale":"marker stale {ago}.","workers.capacity.col.project":"Project","workers.capacity.col.usage":"Usage","workers.capacity.col.other":"Other","workers.capacity.detailHint":"details →","workers.panel.boardLink":"Board →","workers.panel.loading":"Loading workers…","workers.panel.empty.slots":"This project has no worker slots.","workers.panel.empty.noWorker":"No workers","workers.panel.empty.pickOne":"Pick a worker","workers.panel.idle.short":"idle","workers.panel.section.currentCard":"Current card","workers.panel.idle.full":"Slot idle, no current card.","workers.panel.section.claudeOutput":"Claude output · last {n} lines","workers.panel.output.loading":"Loading…","workers.panel.output.empty":"No session output yet. The worker needs a few seconds to start.","workers.panel.section.heartbeat":"Supervisor heartbeat · last {n} lines","workers.panel.heartbeat.fullLog":"View full log →","workers.panel.action.restart":"Restart","workers.panel.action.restart.confirm.title":"Restart worker-{slot}","workers.panel.action.restart.confirm.body":"Kill the process, then re-launch onto #{seq}","workers.panel.action.restart.confirm.button":"Restart","workers.panel.action.restart.error":"Restart failed","workers.panel.action.kill":"Kill","workers.panel.action.kill.confirm.title":"Kill worker-{slot}","workers.panel.action.kill.confirm.body":"The current task will be force-aborted.","workers.panel.action.kill.confirm.button":"Kill","workers.panel.action.kill.error":"Kill failed","dialog.confirm.default":"OK","dialog.alert.default":"Got it","dialog.cancel.default":"Cancel","dirPicker.title.default":"Pick a directory","dirPicker.close.aria":"Close","dirPicker.up.aria":"Parent directory","dirPicker.up.title":"Parent directory","dirPicker.home.aria":"Back to home","dirPicker.home.title":"Back to home","dirPicker.loading":"Loading…","dirPicker.error.title":"Read failed","dirPicker.empty":"— empty —","dirPicker.enter.aria":"Enter {name}/","dirPicker.pickFile.aria":"Pick {name} (double-click to confirm)","dirPicker.fileLocked":"File not selectable","dirPicker.cancel":"Cancel","dirPicker.useFile":"Use this file","dirPicker.useFile.tooltip.empty":"Click a file first","dirPicker.useDir":"Use this directory","errorBoundary.title":"💥 UI crashed","errorBoundary.refresh":"Refresh page","chat.error.create.title":"Failed to create chat","chat.error.send.title":"Send failed","chat.error.fileTooBig.title":"File too large","chat.error.fileTooBig.body":"Per-file limit is 50 MB; this is {size} MB ({name})","chat.error.uploadAttachment.title":"Attachment upload failed","chat.placeholder.attachment":"(attachment)","chat.placeholder.viewAttachment":"(see attachment)","chat.placeholder.attachmentTitle":"Attachment","chat.attachment.previewTooltip":`{name}
379
379
  {path}
380
380
  Click to preview`,"chat.attachment.previewSimpleTooltip":`{name}
381
- Click to zoom`,"chat.attachment.preview.aria":"Preview {name}","chat.attachment.close.aria":"Close","chat.attachment.readErr":"Read failed: {detail}","chat.attachment.loading":"Loading…","chat.attachment.unsupported":"This file type cannot be previewed inline.","chat.attachment.download":"Download","chat.message.role.you":"You","chat.message.role.error":"Error","chat.message.role.assistant":"assistant","chat.message.truncated":"⚠ Output exceeded 10MB and was truncated","chat.filePicker.title":"Pick attachment file","chat.newSession.title":"New chat","chat.newSession.title.aria":"New chat","chat.newSession.close.aria":"Close","chat.newSession.field.title":"Title (optional)","chat.newSession.field.title.placeholder":"Empty = auto-generate from first message","chat.newSession.field.cwd":"Working directory (optional)","chat.newSession.field.cwd.browse":"Browse","chat.newSession.field.cwd.browseAria":"Pick directory","chat.newSession.field.cwd.title":"Pick directory","chat.newSession.field.cwd.help1":"The agent reads/writes files here. Absolute path; must exist.","chat.newSession.field.cwd.help2":"Empty = use the daemon’s startup cwd.","chat.newSession.cancel":"Cancel","chat.newSession.create":"Create","cardModal.editing":"⚠ Editing","cardModal.title.aria":"Card title","cardModal.editAria":"Edit card","cardModal.edit":"Edit","cardModal.close.aria":"Close","cardModal.error.save.title":"Save failed","cardModal.error.load":"Load failed: {detail}","cardModal.skills.loading":"Loading skill list…","cardModal.label.removeAria":"Remove {label}","cardModal.label.addPlaceholder":"+ Add label","cardModal.label.addAria":"Add label","cardModal.label.note":"Note: AI-PIPELINE / STARTED-* / COMPLETED-* / NEEDS-FIX are managed by the pipeline; manual changes may be overwritten","cardModal.section.description":"Description","cardModal.section.empty":"(empty)","cardModal.section.checklist":"Checklist","cardModal.checklist.empty":"No checklist items. Add `- [ ] item` syntax in the description.","cardModal.section.log":"Log","cardModal.body.aria":"Card description","cardModal.body.replaceNote":'Only replaces the "## Description" section; checklist and log sections are untouched.',"cardModal.action.launch":"Launch worker","cardModal.action.launch.disabledDone":"Card is done; drag back to Todo to launch","cardModal.action.launch.disabledRunning":"Pipeline is running — supervisor dispatches automatically, no manual launch needed","cardModal.action.launch.error":"Launch worker failed","cardModal.action.reset":"Reset card","cardModal.action.reset.confirm.title":"Reset card #{seq}","cardModal.action.reset.confirm.body":"Card state goes back to initial; checklist progress is cleared.","cardModal.action.reset.confirm.button":"Reset","cardModal.action.reset.error":"Reset failed","cardModal.action.delete":"Delete card","cardModal.action.delete.confirm1.title":"Delete card #{seq}","cardModal.action.delete.confirm1.body":'About to delete "{title}". This cannot be undone (the md file is physically removed). Continue?',"cardModal.action.delete.confirm1.button":"Continue","cardModal.action.delete.confirm2.title":"Final confirmation","cardModal.action.delete.confirm2.body":"Please re-confirm deleting card #{seq}."},hA={"app.title":"SPS 控制台","nav.chat":"对话","nav.projects":"项目","nav.board":"看板","nav.workers":"Workers","nav.logs":"日志","nav.skills":"技能","nav.system":"系统","nav.processes":"进程","nav.audit":"审计日志","nav.aria":"主导航","processes.title":"进程监控","processes.subtitle":"SPS ACP 启动的 claude 进程(其它途径启动的,如你自己的会话,不显示)","processes.refresh":"刷新","processes.aliveCount":"运行中 {n}/{total}","processes.col.slot":"会话槽","processes.col.project":"项目","processes.col.state":"状态","processes.col.memory":"内存","processes.col.action":"操作","processes.empty":"没有 SPS 进程","processes.kill":"关闭","processes.killConfirm":"确定关闭进程 {slot}?","audit.title":"审计日志","audit.subtitle":"项目生命周期:创建 / 修改 / 删除","audit.refresh":"刷新","audit.filter.all":"全部","audit.action.create":"创建","audit.action.modify":"修改","audit.action.delete":"删除","audit.col.time":"时间","audit.col.action":"动作","audit.col.project":"项目","audit.col.detail":"详情","audit.empty":"暂无审计记录","lang.toggle.aria":"切换界面语言","lang.en":"EN","lang.zh":"中","status.server":"服务","status.offline":"离线","status.sse.open":"SSE","status.sse.connecting":"SSE·连接中","status.sse.down":"SSE·断开","status.pipelines.tooltip":"活跃流水线数","status.workers.tooltip":"活跃 Worker 数","status.pipeline.unit":"流水线","status.worker.unit":"Worker","common.save":"保存","common.cancel":"取消","common.delete":"删除","common.confirm":"确认","common.create":"创建","common.edit":"编辑","common.close":"关闭","common.loading":"加载中…","common.error":"出错","common.retry":"重试","common.empty":"暂无内容","common.search":"搜索","common.refresh":"刷新","common.copy":"复制","common.copied":"已复制","common.yes":"是","common.no":"否","common.required":"必填","common.optional":"可选","common.ok":"好","projects.title":"项目 🎯","projects.count":"本机有 {count} 个项目","projects.refresh.hint":"点击刷新重试","projects.new":"新建项目","projects.load.failed":"加载失败","projects.empty.title":"还没有项目 ✨","projects.empty.hint":"运行 {cmd} 创建第一个项目。","newProject.title":"新建项目","newProject.subtitle":"配置一个项目,worker 自动开跑","newProject.field.name":"项目名","newProject.field.name.help":"只允许小写字母、数字、_ 和 -","newProject.field.dir":"项目目录","newProject.field.dir.help":"绝对路径;不存在会自动创建","newProject.field.branch":"合并目标分支","newProject.field.branch.help":"默认 main","newProject.field.maxWorkers":"最大并发 Worker 数","newProject.field.maxWorkers.help":"单项目并发数(推荐 1)","newProject.field.ackTimeout":"ACK 超时(秒)","newProject.field.ackTimeout.help":"Worker 响应等待秒数(默认 300)","newProject.field.gitlabProject":"GitLab/GitHub 远程","newProject.field.gitlabProject.help":"格式:用户名/仓库(可选)","newProject.field.matrixRoom":"Matrix 房间 ID","newProject.field.matrixRoom.help":"可选;不填则用全局默认","newProject.field.git":"启用 git","newProject.field.git.help":"关闭 → 非代码项目,跳过 commit/push/MR","newProject.field.wiki":"启用 Wiki 知识库","newProject.field.wiki.help":"v0.51+:在项目下生成 wiki/ 骨架,Worker prompt 自动注入 5 层检索","newProject.submit":"创建项目","newProject.creating":"创建中…","newProject.created":"项目已创建","newProject.error.dirRequired":"项目目录必填","newProject.dir.browse":"浏览","newProject.dir.browseAria":"选择目录","newProject.back":"返回","newProject.back.aria":"返回项目列表","newProject.field.name.placeholder":"例如:acme-web","newProject.field.name.example":"只能用字母、数字、下划线、连字符。例如 acme-web","newProject.field.name.invalid":"名称只能包含 a-z A-Z 0-9 _ -","newProject.field.dir.long":"本机绝对路径(代码或文档都可)。和是否启用 git 无关。","newProject.field.dir.placeholder":"/home/you/code/acme","newProject.field.dir.createIfMissing":"目录不存在时自动创建(推荐 —— 否则 .claude/ 和 wiki/ 安装会被跳过)","newProject.field.dir.pickerTitle":"选择项目目录","newProject.field.maxWorkers.short":"最大 Worker 数","newProject.field.ackTimeout.minutes":"ACK 超时(分钟)","newProject.field.ackTimeout.minutes.help":"Worker 启动后多久没 ACK 视为失败","newProject.field.git.label":"启用 Git(Worker 自动 commit + push)","newProject.field.git.detail":"关闭后 Worker 只做任务、不做版本控制;适合文档/数据处理等非代码项目。","newProject.field.git.branch":"合并分支","newProject.field.gitlabProject.label":"Git 远程项目路径","newProject.field.gitlabProject.help2":"如 user/repo,空则跳过远程 API(只本地 commit/push)","newProject.field.gitlabProject.placeholder":"user/repo","newProject.field.gitlabProjectId":"GitLab 项目 ID","newProject.field.gitlabProjectId.help":"数字;GitHub 用户留空","newProject.field.gitlabProjectId.placeholder":"42","newProject.field.wiki.label":"启用 Wiki 知识库(per-project,doc-28)","newProject.field.wiki.detail":"开启后自动 scaffold {wikiCode} 目录,并向 Worker prompt 注入 5 层检索上下文与 wiki-update 提示。可后续 {wikiInit} 补办。","newProject.section.notifications":"通知","newProject.field.matrixRoom.label":"Matrix 房间 ID","newProject.field.matrixRoom.help2":"空则使用全局配置;不填 = 不通知","newProject.field.matrixRoom.placeholder":"!abc:matrix.example.com","newProject.error.create.title":"创建失败","projectDetail.tab.pipeline":"流水线","projectDetail.tab.conf":"配置","projectDetail.tab.delete":"删除项目","projectDetail.delete.title":"删除该项目","projectDetail.delete.warn":"会删除项目配置、运行时和 worktree。{repoDir} 下的代码仓库不动。","projectDetail.delete.confirmLabel":"输入项目名以确认","projectDetail.delete.button":"删除项目","projectDetail.delete.deleting":"删除中…","projectDetail.lastActivity":"最后活跃","projectDetail.notFound":"项目不存在","projectDetail.notFoundHint":"可能已被删除或重命名。","projectDetail.backToList":"返回项目列表","pipeline.editor.title":"流水线 YAML","pipeline.editor.savedAt":"{time} 已保存","pipeline.editor.unsaved":"有未保存的修改","pipeline.editor.save":"保存","pipeline.editor.saving":"保存中…","pipeline.editor.reload":"从磁盘重新加载","pipeline.editor.discard.title":"放弃未保存的修改?","pipeline.editor.discard.body":"你的编辑会丢失。","pipeline.editor.errors":"YAML 解析错误","pipeline.editor.list":"流水线","pipeline.editor.list.add":"新建流水线","pipeline.editor.list.delete":"删除流水线","pipeline.editor.list.use":"设为当前","pipeline.editor.list.activeBadge":"当前","pipeline.editor.list.sample":"示例","pipeline.editor.delete.confirm.title":"删除流水线 {name}?","pipeline.editor.delete.confirm.body":"此操作不可撤销。","pipeline.newDialog.title":"新建流水线","pipeline.newDialog.field.filename":"文件名","pipeline.newDialog.field.filename.help":"只允许字母、数字、_ 和 -;自动追加 .yaml","pipeline.newDialog.field.copyFrom":"复制自","pipeline.newDialog.copyFrom.sample":"示例模板","pipeline.newDialog.copyFrom.active":"当前活动","pipeline.newDialog.create":"创建","projectDetail.tab.overview":"概览","projectDetail.tab.config":"配置","projectDetail.tab.pipelines":"流水线","projectDetail.tab.danger":"危险操作","projectDetail.openBoard":"看板","projectDetail.overview.repoDir":"仓库路径","projectDetail.overview.pmBackend":"PM 后端","projectDetail.overview.agent":"Agent","projectDetail.overview.cards":"卡片","projectDetail.overview.cards.value":"共 {total} 张 · {inprogress} 进行中 · {done} 完成","projectDetail.overview.workers":"Worker","projectDetail.overview.workers.value":"共 {total} 个({active} 活跃)","projectDetail.overview.pipeline":"Pipeline","projectDetail.overview.lastActivity":"最近活动","projectDetail.overview.notFound":"项目 {name} 不存在或无法读取。","projectDetail.config.confDirty":"● 未保存的修改","projectDetail.config.reload":"重新加载","projectDetail.config.save":"保存","projectDetail.config.saveAria":"保存配置","projectDetail.config.editorAria":"conf 文件编辑器","projectDetail.config.error.conflict.title":"配置已被其他地方修改","projectDetail.config.error.conflict.body":'conf 文件在你编辑期间被改过。点"重新加载"后再编辑。',"projectDetail.config.error.save.title":"保存失败","projectDetail.config.error.load":"加载失败:{detail}","projectDetail.pipelines.title":"流水线","projectDetail.pipelines.add":"新建流水线","projectDetail.pipelines.empty":'还没有流水线文件。点"新建流水线"开始。',"projectDetail.pipelines.activeBadge":"当前","projectDetail.pipelines.edit":"编辑","projectDetail.pipelines.editAria":"编辑 {name}","projectDetail.pipelines.switch":"切换","projectDetail.pipelines.switchAria":"切换到 {name}","projectDetail.pipelines.switch.confirm.title":"切换到 {name}","projectDetail.pipelines.switch.confirm.body":"当前 project.yaml 会被 {name} 的内容覆盖。继续?","projectDetail.pipelines.switch.confirm.button":"切换","projectDetail.pipelines.switch.error":"切换失败","projectDetail.pipelines.delete.confirm.title":"删除 {name}","projectDetail.pipelines.delete.confirm.body":"这个流水线文件会被永久删除。","projectDetail.pipelines.delete.error":"删除失败","projectDetail.pipelines.deleteAria":"删除 {name}","projectDetail.pipelines.create.error":"创建失败","projectDetail.danger.title":"删除项目","projectDetail.danger.body":"这会清理 {path}(包括所有卡片、runtime、logs)。","projectDetail.danger.includeClaude.label":"同时清理 repo 的 .claude/","projectDetail.danger.includeClaude.note":"repo 本身不动,只清这个目录。","projectDetail.danger.confirmPrompt":"输入项目名 {name} 确认:","projectDetail.danger.deleteAria":"永久删除项目","projectDetail.danger.deleteButton":"永久删除","projectDetail.danger.deleted.title":"已删除","projectDetail.danger.deleted.bodyWithList":`项目已删除。同时清理了:
381
+ Click to zoom`,"chat.attachment.preview.aria":"Preview {name}","chat.attachment.close.aria":"Close","chat.attachment.readErr":"Read failed: {detail}","chat.attachment.loading":"Loading…","chat.attachment.unsupported":"This file type cannot be previewed inline.","chat.attachment.download":"Download","chat.message.role.you":"You","chat.message.role.error":"Error","chat.message.role.assistant":"assistant","chat.message.truncated":"⚠ Output exceeded 10MB and was truncated","chat.filePicker.title":"Pick attachment file","chat.newSession.title":"New chat","chat.newSession.title.aria":"New chat","chat.newSession.close.aria":"Close","chat.newSession.field.title":"Title (optional)","chat.newSession.field.title.placeholder":"Empty = auto-generate from first message","chat.newSession.field.cwd":"Working directory (optional)","chat.newSession.field.cwd.browse":"Browse","chat.newSession.field.cwd.browseAria":"Pick directory","chat.newSession.field.cwd.title":"Pick directory","chat.newSession.field.cwd.help1":"The agent reads/writes files here. Absolute path; must exist.","chat.newSession.field.cwd.help2":"Empty = use the daemon’s startup cwd.","chat.newSession.cancel":"Cancel","chat.newSession.create":"Create","cardModal.editing":"⚠ Editing","cardModal.title.aria":"Card title","cardModal.editAria":"Edit card","cardModal.edit":"Edit","cardModal.close.aria":"Close","cardModal.error.save.title":"Save failed","cardModal.error.load":"Load failed: {detail}","cardModal.skills.loading":"Loading skill list…","cardModal.label.removeAria":"Remove {label}","cardModal.label.addPlaceholder":"+ Add label","cardModal.label.addAria":"Add label","cardModal.label.note":"Note: AI-PIPELINE / STARTED-* / COMPLETED-* / NEEDS-FIX are managed by the pipeline; manual changes may be overwritten","cardModal.section.description":"Description","cardModal.section.empty":"(empty)","cardModal.section.checklist":"Checklist","cardModal.checklist.empty":"No checklist items. Add `- [ ] item` syntax in the description.","cardModal.section.log":"Log","cardModal.body.aria":"Card description","cardModal.body.replaceNote":'Only replaces the "## Description" section; checklist and log sections are untouched.',"cardModal.action.launch":"Launch worker","cardModal.action.launch.disabledDone":"Card is done; drag back to Todo to launch","cardModal.action.launch.disabledRunning":"Pipeline is running — supervisor dispatches automatically, no manual launch needed","cardModal.action.launch.error":"Launch worker failed","cardModal.action.reset":"Reset card","cardModal.action.reset.confirm.title":"Reset card #{seq}","cardModal.action.reset.confirm.body":"Card state goes back to initial; checklist progress is cleared.","cardModal.action.reset.confirm.button":"Reset","cardModal.action.reset.error":"Reset failed","cardModal.action.delete":"Delete card","cardModal.action.delete.confirm1.title":"Delete card #{seq}","cardModal.action.delete.confirm1.body":'About to delete "{title}". This cannot be undone (the md file is physically removed). Continue?',"cardModal.action.delete.confirm1.button":"Continue","cardModal.action.delete.confirm2.title":"Final confirmation","cardModal.action.delete.confirm2.body":"Please re-confirm deleting card #{seq}."},hA={"app.title":"SPS 控制台","nav.chat":"对话","nav.projects":"项目","nav.board":"看板","nav.workers":"Workers","nav.logs":"日志","nav.skills":"技能","nav.system":"系统","nav.processes":"进程","nav.audit":"审计日志","nav.aria":"主导航","processes.title":"进程监控","processes.subtitle":"SPS ACP 启动的 claude 进程(其它途径启动的,如你自己的会话,不显示)","processes.refresh":"刷新","processes.aliveCount":"运行中 {n}/{total}","processes.col.slot":"会话槽","processes.col.project":"项目","processes.col.state":"状态","processes.col.memory":"内存","processes.col.action":"操作","processes.empty":"没有 SPS 进程","processes.filter.all":"全部","processes.filter.alive":"运行中","processes.filter.offline":"离线","processes.kill":"关闭","processes.killConfirm":"确定关闭进程 {slot}?","audit.title":"审计日志","audit.subtitle":"项目生命周期:创建 / 修改 / 删除","audit.refresh":"刷新","audit.filter.all":"全部","audit.action.create":"创建","audit.action.modify":"修改","audit.action.delete":"删除","audit.col.time":"时间","audit.col.action":"动作","audit.col.project":"项目","audit.col.detail":"详情","audit.empty":"暂无审计记录","lang.toggle.aria":"切换界面语言","lang.en":"EN","lang.zh":"中","status.server":"服务","status.offline":"离线","status.sse.open":"SSE","status.sse.connecting":"SSE·连接中","status.sse.down":"SSE·断开","status.pipelines.tooltip":"活跃流水线数","status.workers.tooltip":"活跃 Worker 数","status.pipeline.unit":"流水线","status.worker.unit":"Worker","common.save":"保存","common.cancel":"取消","common.delete":"删除","common.confirm":"确认","common.create":"创建","common.edit":"编辑","common.close":"关闭","common.loading":"加载中…","common.error":"出错","common.retry":"重试","common.empty":"暂无内容","common.search":"搜索","common.refresh":"刷新","common.copy":"复制","common.copied":"已复制","common.yes":"是","common.no":"否","common.required":"必填","common.optional":"可选","common.ok":"好","projects.title":"项目 🎯","projects.count":"本机有 {count} 个项目","projects.refresh.hint":"点击刷新重试","projects.new":"新建项目","projects.load.failed":"加载失败","projects.empty.title":"还没有项目 ✨","projects.empty.hint":"运行 {cmd} 创建第一个项目。","newProject.title":"新建项目","newProject.subtitle":"配置一个项目,worker 自动开跑","newProject.field.name":"项目名","newProject.field.name.help":"只允许小写字母、数字、_ 和 -","newProject.field.dir":"项目目录","newProject.field.dir.help":"绝对路径;不存在会自动创建","newProject.field.branch":"合并目标分支","newProject.field.branch.help":"默认 main","newProject.field.maxWorkers":"最大并发 Worker 数","newProject.field.maxWorkers.help":"单项目并发数(推荐 1)","newProject.field.ackTimeout":"ACK 超时(秒)","newProject.field.ackTimeout.help":"Worker 响应等待秒数(默认 300)","newProject.field.gitlabProject":"GitLab/GitHub 远程","newProject.field.gitlabProject.help":"格式:用户名/仓库(可选)","newProject.field.matrixRoom":"Matrix 房间 ID","newProject.field.matrixRoom.help":"可选;不填则用全局默认","newProject.field.git":"启用 git","newProject.field.git.help":"关闭 → 非代码项目,跳过 commit/push/MR","newProject.field.wiki":"启用 Wiki 知识库","newProject.field.wiki.help":"v0.51+:在项目下生成 wiki/ 骨架,Worker prompt 自动注入 5 层检索","newProject.submit":"创建项目","newProject.creating":"创建中…","newProject.created":"项目已创建","newProject.error.dirRequired":"项目目录必填","newProject.dir.browse":"浏览","newProject.dir.browseAria":"选择目录","newProject.back":"返回","newProject.back.aria":"返回项目列表","newProject.field.name.placeholder":"例如:acme-web","newProject.field.name.example":"只能用字母、数字、下划线、连字符。例如 acme-web","newProject.field.name.invalid":"名称只能包含 a-z A-Z 0-9 _ -","newProject.field.dir.long":"本机绝对路径(代码或文档都可)。和是否启用 git 无关。","newProject.field.dir.placeholder":"/home/you/code/acme","newProject.field.dir.createIfMissing":"目录不存在时自动创建(推荐 —— 否则 .claude/ 和 wiki/ 安装会被跳过)","newProject.field.dir.pickerTitle":"选择项目目录","newProject.field.maxWorkers.short":"最大 Worker 数","newProject.field.ackTimeout.minutes":"ACK 超时(分钟)","newProject.field.ackTimeout.minutes.help":"Worker 启动后多久没 ACK 视为失败","newProject.field.git.label":"启用 Git(Worker 自动 commit + push)","newProject.field.git.detail":"关闭后 Worker 只做任务、不做版本控制;适合文档/数据处理等非代码项目。","newProject.field.git.branch":"合并分支","newProject.field.gitlabProject.label":"Git 远程项目路径","newProject.field.gitlabProject.help2":"如 user/repo,空则跳过远程 API(只本地 commit/push)","newProject.field.gitlabProject.placeholder":"user/repo","newProject.field.gitlabProjectId":"GitLab 项目 ID","newProject.field.gitlabProjectId.help":"数字;GitHub 用户留空","newProject.field.gitlabProjectId.placeholder":"42","newProject.field.wiki.label":"启用 Wiki 知识库(per-project,doc-28)","newProject.field.wiki.detail":"开启后自动 scaffold {wikiCode} 目录,并向 Worker prompt 注入 5 层检索上下文与 wiki-update 提示。可后续 {wikiInit} 补办。","newProject.section.notifications":"通知","newProject.field.matrixRoom.label":"Matrix 房间 ID","newProject.field.matrixRoom.help2":"空则使用全局配置;不填 = 不通知","newProject.field.matrixRoom.placeholder":"!abc:matrix.example.com","newProject.error.create.title":"创建失败","projectDetail.tab.pipeline":"流水线","projectDetail.tab.conf":"配置","projectDetail.tab.delete":"删除项目","projectDetail.delete.title":"删除该项目","projectDetail.delete.warn":"会删除项目配置、运行时和 worktree。{repoDir} 下的代码仓库不动。","projectDetail.delete.confirmLabel":"输入项目名以确认","projectDetail.delete.button":"删除项目","projectDetail.delete.deleting":"删除中…","projectDetail.lastActivity":"最后活跃","projectDetail.notFound":"项目不存在","projectDetail.notFoundHint":"可能已被删除或重命名。","projectDetail.backToList":"返回项目列表","pipeline.editor.title":"流水线 YAML","pipeline.editor.savedAt":"{time} 已保存","pipeline.editor.unsaved":"有未保存的修改","pipeline.editor.save":"保存","pipeline.editor.saving":"保存中…","pipeline.editor.reload":"从磁盘重新加载","pipeline.editor.discard.title":"放弃未保存的修改?","pipeline.editor.discard.body":"你的编辑会丢失。","pipeline.editor.errors":"YAML 解析错误","pipeline.editor.list":"流水线","pipeline.editor.list.add":"新建流水线","pipeline.editor.list.delete":"删除流水线","pipeline.editor.list.use":"设为当前","pipeline.editor.list.activeBadge":"当前","pipeline.editor.list.sample":"示例","pipeline.editor.delete.confirm.title":"删除流水线 {name}?","pipeline.editor.delete.confirm.body":"此操作不可撤销。","pipeline.newDialog.title":"新建流水线","pipeline.newDialog.field.filename":"文件名","pipeline.newDialog.field.filename.help":"只允许字母、数字、_ 和 -;自动追加 .yaml","pipeline.newDialog.field.copyFrom":"复制自","pipeline.newDialog.copyFrom.sample":"示例模板","pipeline.newDialog.copyFrom.active":"当前活动","pipeline.newDialog.create":"创建","projectDetail.tab.overview":"概览","projectDetail.tab.config":"配置","projectDetail.tab.pipelines":"流水线","projectDetail.tab.danger":"危险操作","projectDetail.openBoard":"看板","projectDetail.overview.repoDir":"仓库路径","projectDetail.overview.pmBackend":"PM 后端","projectDetail.overview.agent":"Agent","projectDetail.overview.cards":"卡片","projectDetail.overview.cards.value":"共 {total} 张 · {inprogress} 进行中 · {done} 完成","projectDetail.overview.workers":"Worker","projectDetail.overview.workers.value":"共 {total} 个({active} 活跃)","projectDetail.overview.pipeline":"Pipeline","projectDetail.overview.lastActivity":"最近活动","projectDetail.overview.notFound":"项目 {name} 不存在或无法读取。","projectDetail.config.confDirty":"● 未保存的修改","projectDetail.config.reload":"重新加载","projectDetail.config.save":"保存","projectDetail.config.saveAria":"保存配置","projectDetail.config.editorAria":"conf 文件编辑器","projectDetail.config.error.conflict.title":"配置已被其他地方修改","projectDetail.config.error.conflict.body":'conf 文件在你编辑期间被改过。点"重新加载"后再编辑。',"projectDetail.config.error.save.title":"保存失败","projectDetail.config.error.load":"加载失败:{detail}","projectDetail.pipelines.title":"流水线","projectDetail.pipelines.add":"新建流水线","projectDetail.pipelines.empty":'还没有流水线文件。点"新建流水线"开始。',"projectDetail.pipelines.activeBadge":"当前","projectDetail.pipelines.edit":"编辑","projectDetail.pipelines.editAria":"编辑 {name}","projectDetail.pipelines.switch":"切换","projectDetail.pipelines.switchAria":"切换到 {name}","projectDetail.pipelines.switch.confirm.title":"切换到 {name}","projectDetail.pipelines.switch.confirm.body":"当前 project.yaml 会被 {name} 的内容覆盖。继续?","projectDetail.pipelines.switch.confirm.button":"切换","projectDetail.pipelines.switch.error":"切换失败","projectDetail.pipelines.delete.confirm.title":"删除 {name}","projectDetail.pipelines.delete.confirm.body":"这个流水线文件会被永久删除。","projectDetail.pipelines.delete.error":"删除失败","projectDetail.pipelines.deleteAria":"删除 {name}","projectDetail.pipelines.create.error":"创建失败","projectDetail.danger.title":"删除项目","projectDetail.danger.body":"这会清理 {path}(包括所有卡片、runtime、logs)。","projectDetail.danger.includeClaude.label":"同时清理 repo 的 .claude/","projectDetail.danger.includeClaude.note":"repo 本身不动,只清这个目录。","projectDetail.danger.confirmPrompt":"输入项目名 {name} 确认:","projectDetail.danger.deleteAria":"永久删除项目","projectDetail.danger.deleteButton":"永久删除","projectDetail.danger.deleted.title":"已删除","projectDetail.danger.deleted.bodyWithList":`项目已删除。同时清理了:
382
382
  {paths}`,"projectDetail.danger.deleted.body":"项目已删除。","projectDetail.danger.error":"删除失败","pipelineEditor.close":"关闭","pipelineEditor.error.conflict.title":"文件已被其他地方修改","pipelineEditor.error.yaml.title":"YAML 语法错误","pipelineEditor.error.save.title":"保存失败","pipelineEditor.error.serialize.title":"YAML 序列化失败","pipelineEditor.error.load":"加载失败:{detail}","pipelineEditor.mode.structured":"结构化","pipelineEditor.mode.yaml":"原始 YAML","pipelineEditor.parseError.prefix":"YAML 解析:{detail}","pipelineEditor.activeWarning":"⚠ 这是当前激活的流水线,保存后下一轮 tick 生效","pipelineEditor.yamlAria":"pipeline YAML 编辑器","pipelineEditor.status.unsaved":"● 未保存","pipelineEditor.status.saved":"已保存","pipelineEditor.status.noChanges":"无变化","pipelineEditor.reload":"重新加载","pipelineEditor.save":"保存","pipelineEditor.saveAria":"保存 pipeline","pipelineEditor.activeBadge":"当前","pipelineEditor.modeHint":"project = 事件驱动流水线(默认) · steps = 顺序脚本","pipelineEditor.stages.heading":"Stages({count})","pipelineEditor.stages.add":"添加 stage","pipelineEditor.stages.empty":'还没 stage。点"添加 stage"开始。',"pipelineEditor.stage.name.hint":"stage 唯一名","pipelineEditor.stage.profile.hint":"skill 画像,可空","pipelineEditor.stage.cardState.hint":"本 stage 期间卡片状态","pipelineEditor.stage.timeout.hint":"可选,如 30m 2h","pipelineEditor.stage.trigger.hint":"触发条件,可空走默认","pipelineEditor.stage.onComplete.hint":"成功后动作","pipelineEditor.stage.onFail.action.hint":"失败时动作,如 label NEEDS-FIX","pipelineEditor.stage.onFail.comment.hint":"写进卡片的注释","pipelineEditor.stage.halt.note":"(失败后停流水线;去掉则继续下一张卡)","pipelineEditor.stage.moveUp":"上移","pipelineEditor.stage.moveDown":"下移","pipelineEditor.stage.remove":"删除 stage","newPipelineDialog.title":"新建流水线","newPipelineDialog.field.filename.label":"文件名","newPipelineDialog.field.filename.placeholder":"例如 ci","newPipelineDialog.field.filename.help":"实际会保存为 {filename}。只允许 a-z A-Z 0-9 _ -;已有同名文件会 409 报错。","newPipelineDialog.section.template":"初始内容","newPipelineDialog.template.blank.label":"空白模板","newPipelineDialog.template.blank.desc":"最简 1 stage(develop → Done)","newPipelineDialog.template.sample.label":"教学模板","newPipelineDialog.template.sample.desc":"从 sample.yaml.example 复制(带注释,讲解所有字段)","newPipelineDialog.template.sample.unavailable":"sample.yaml.example 不存在","newPipelineDialog.template.active.label":"复制当前活动的","newPipelineDialog.template.active.desc":"从 project.yaml 复制(基于目前的配置改)","newPipelineDialog.template.active.unavailable":"project.yaml 不存在","newPipelineDialog.create.aria":"创建 pipeline","newPipelineDialog.cancel":"取消","board.title":"看板 ✨","board.title.bare":"看板","board.subtitle":"{name} · {cards} 张卡片 · {workers} workers 活跃","board.pickPrompt.title":"选择一个项目 🎯","board.pickPrompt.body":"看板按项目分。挑一个开始:","board.action.start":"启动","board.action.stop":"停止","board.action.startAria":"启动 pipeline","board.action.stopAria":"停止 pipeline","board.action.startError":"启动 pipeline 失败","board.action.stopError":"停止 pipeline 失败","board.action.reset":"重置","board.action.resetError":"重置失败","board.action.reset.confirm.title":"重置整个流水线","board.action.reset.confirm.body":"这会清空所有卡片的运行状态、worker marker、分支。不可撤销。","board.action.reset.confirm.button":"重置全部","board.action.newCard":"新卡片","board.action.newCard.error":"新建卡片失败","board.action.moveCard.error":"移动卡片失败","board.search.placeholder":"搜索标题 / skill / label…","board.search.aria":"搜索卡片","board.filter.clear":"清空","board.filter.clearAria":"清空筛选","board.filter.aria":"按 {label} 筛选","board.filter.clearSelection":"清空选择","board.error.loadCards":"加载卡片失败","board.col.planning":"Planning","board.col.backlog":"Backlog","board.col.todo":"Todo","board.col.inprogress":"Inprogress","board.col.qa":"QA / Review","board.col.done":"Done","kanban.checklist.label":"检查清单 {done}/{total}","kanban.checklist.more":"… 还有 {count} 条","kanban.column.empty":"— 空 —","kanban.time.justNow":"刚才","kanban.time.minutes":"{n} 分钟前","kanban.time.hours":"{n} 小时前","kanban.time.days":"{n} 天前","newCard.title":"新建卡片","newCard.field.title":"标题 *","newCard.field.title.placeholder":"例如:接入 GitHub OAuth 登录","newCard.field.title.help":"写简短明了的目标(<200 字符)","newCard.field.description":"描述","newCard.field.description.placeholder":"用户故事、需求、验收标准、参考资料… Claude 启动时会读这里的内容","newCard.field.description.help":"支持 markdown。空的话就只有 title,Claude 只能靠 title 推断要做啥。","newCard.field.skills":"技能","newCard.field.skills.help":"勾选哪些 skill 会被加载(走 frontmatter `skills:`)。不选也行,Worker 默认加载项目级 skills。","newCard.field.skills.loading":"加载 skill 列表…","newCard.field.skills.error":"skill 列表加载失败,不影响创建:{detail}","newCard.field.skills.selected":"已选 {count} 个:{names}","newCard.field.dispatch":"派发","newCard.field.dispatch.label":"立即派发执行(直接进 Backlog)","newCard.field.dispatch.help":"默认不勾:卡进 Planning 暂存,等你看板上拖到 Backlog 再开工。勾上:跳过暂存,下次 tick 直接派 worker 跑。","newCard.create.aria":"创建卡片","cardDetail.loading":"加载中…","cardDetail.error.load":"卡片加载失败","cardDetail.tabs.overview":"概览","cardDetail.tabs.body":"描述","cardDetail.tabs.checklist":"检查清单","cardDetail.tabs.history":"历史","cardDetail.tabs.actions":"操作","cardDetail.field.state":"状态","cardDetail.field.skills":"技能","cardDetail.field.labels":"标签","cardDetail.field.branch":"分支","cardDetail.field.assignee":"处理人","cardDetail.field.created":"创建时间","cardDetail.field.updated":"更新时间","cardDetail.field.empty":"—","cardDetail.actions.delete":"删除卡片","cardDetail.actions.delete.confirm.title":"删除卡片 #{seq}","cardDetail.actions.delete.confirm.body":"该卡片会被永久删除。","cardDetail.actions.delete.error":"删除失败","cardDetail.actions.update.error":"更新失败","cardDetail.body.empty":"没有描述","cardDetail.checklist.empty":"没有检查清单","cardDetail.checklist.progress":"进度 {done}/{total}","cardDetail.history.empty":"没有历史记录","cardDetail.notFound":"卡片 #{seq} 不存在","cardDetail.copy.aria":"复制 seq","cardDetail.close.aria":"关闭","cardDetail.save":"保存","cardDetail.saving":"保存中…","workers.title":"Workers 👷","workers.summary":"跨 {projects} 项目 · {running} 跑 · {starting} 启动 · {stuck} 卡 · {crashed} 崩 · {idle} 闲","workers.summary.stuck":"{n} 卡","workers.summary.crashed":"{n} 崩","workers.refresh.aria":"刷新","workers.refresh":"刷新","workers.error.load":"加载失败:{detail}","workers.empty.hint":"点击项目 / worker 查看详情","logs.title":"日志 📜","logs.subtitle.allProjects":"全部项目","logs.subtitle.project":"{name} 实时日志","logs.filter.errors":"只看错误","logs.filter.errors.aria":"只显示错误","logs.filter.search.placeholder":"过滤消息…","logs.empty":"还没有日志 —— 等待事件中","logs.error.load":"日志加载失败","logs.refresh":"刷新","logs.refresh.aria":"刷新日志","logs.scroll.bottom.aria":"滚动到底部","logs.scroll.pause":"已暂停(自动滚动关闭)","logs.scroll.resume":"恢复自动滚动","logs.subtitle.allProjectsCount":"全部项目({count})","logs.poll.5s":"5s 轮询","logs.paused":"⏸ 已暂停","logs.mode.live":"实时","logs.mode.history":"历史","logs.history.startAria":"查询起始时间","logs.history.queryAria":"查询","logs.history.query":"查询","logs.filter.project.aria":"筛选项目","logs.filter.project.all":"全部项目","logs.filter.keyword.placeholder":"过滤关键字…","logs.filter.keyword.aria":"过滤日志","logs.empty.match":"没有匹配的日志","skills.title":"技能 🧠","skills.subtitle":"跨项目共用的 skill(用 `sps skill ...` 管理)","skills.empty.title":"还没有 skill","skills.empty.hint":"运行 {cmd} 同步 bundled skills。","skills.linked.tooltip":"已链接到该项目","skills.frozen.tooltip":"已冻结(项目独立副本)","skills.category.all":"全部","skills.category.language":"语言","skills.category.end":"终端","skills.category.persona":"角色","skills.category.workflow":"流程","skills.category.other":"其它","skills.subtitleCount":"{count} 个 user-level skill","skills.search.placeholder":"搜索 skill…","skills.search.aria":"搜索 skill","skillDetail.actionFailed":"{label}失败","skillDetail.unfreezeAction":"解冻","skillDetail.freezeAction":"冻结","skillDetail.removeAction":"移除","skillDetail.removeConfirm.title":"从 {project} 移除 {name}","skillDetail.removeConfirm.body":"skill 链接会被解除,项目后续运行时将无法使用该 skill。","skillDetail.removeConfirm.button":"移除","skillDetail.unfreezeConfirm.title":"解冻 {name} @ {project}","skillDetail.unfreezeConfirm.body":"本地对这个 skill 的改动会被覆盖,回到最新共享版本。","skillDetail.unfreezeConfirm.button":"解冻","skillDetail.close.aria":"关闭","skillDetail.loading":"加载中…","skillDetail.error.load":"加载失败:{detail}","skillDetail.section.projects":"项目链接状态","skillDetail.section.empty":"还没有任何项目。先去创建一个项目。","skillDetail.section.preview":"SKILL.md 预览","skillDetail.toggleSection.aria":"{action} {file}","skillDetail.expand":"展开","skillDetail.collapse":"收起","system.title":"系统 🛠","system.subtitle":"全局配置 + 诊断 + 升级","system.section.env":"全局 env","system.section.env.help":"存储在 ~/.coral/env(mode 600)。所有项目共用。","system.section.env.save":"保存 env","system.section.env.error.conflict":"env 已被其它地方修改","system.section.env.error.save":"保存 env 失败","system.section.env.error.load":"加载 env 失败","system.section.env.dirtyDot":"● 未保存","system.section.env.aria":"env 编辑器","system.section.env.reload":"重新加载","system.section.upgrade":"升级","system.section.upgrade.current":"当前:v{version}","system.section.upgrade.latest":"npm 最新:v{version}","system.section.upgrade.uptodate":"已是最新","system.section.upgrade.update":"立即升级","system.section.upgrade.upgrading":"升级中…","system.section.upgrade.checking":"正在查询 npm…","system.section.upgrade.checkError":"查询失败:{detail}","system.section.upgrade.upgradeError":"升级失败:{detail}","system.section.upgrade.upgradeError.title":"升级失败","system.section.upgrade.command":"或在终端执行:{cmd}","system.section.upgrade.runningPipelines":"有 pipeline 在跑,先停止:{projects}","system.section.diagnostics":"诊断","system.section.diagnostics.help":"一次性跑所有项目的 sps doctor,看哪些项目出问题","system.section.diagnostics.run":"运行诊断","system.section.diagnostics.running":"运行中…","system.section.diagnostics.empty":"没有项目","system.section.diagnostics.checkAria":"检查 {project}","system.section.diagnostics.statusOk":"正常","system.section.diagnostics.statusFail":"有问题","system.section.diagnostics.error":"诊断失败:{detail}","system.h1":"系统 ⚙️","system.runtime":"运行时","system.env.title.code":"~/.coral/env","system.env.title.prefix":"全局配置 ","system.env.edit.aria":"编辑 env 文件","system.env.edit.button":"编辑","system.env.editing.label":"⚠ 编辑模式","system.env.empty.before":'env 文件不存在。点"编辑"或者终端运行 ',"system.env.empty.after":"。","system.env.warning":"⚠ 文件包含凭证明文。保存时保持 0600 权限。","system.env.aria":"env 文件编辑器","system.env.dirtyMark":" · ● 未保存","system.env.cancel":"取消","system.env.save":"保存","system.env.save.aria":"保存 env","system.env.error.conflict.title":"env 被其他地方修改了","system.env.error.save.title":"保存失败","system.env.error.conflict.body":"请点取消后重开编辑。","system.upgrade.title":"版本","system.upgrade.checkLatest.aria":"检查最新版本","system.upgrade.checkUpdate":"检查更新","system.upgrade.label.current":"sps-cli(当前)","system.upgrade.label.latest":"npm(最新)","system.upgrade.latestPill":"最新","system.upgrade.button.upgradeAria":"升级到最新版本","system.upgrade.button.upgrade":"升级","system.upgrade.button.copyAria":"复制升级命令","system.upgrade.button.copyTitle":"自动升级失败时手动跑","system.upgrade.button.copy":"复制命令","system.upgrade.label.installed":"已安装","system.upgrade.installed.ok":"已生效(重启 console 后可见)","system.upgrade.installed.fail":"未升级成功","system.upgrade.label.check":"检查","system.upgrade.confirm.title":"升级 sps-cli","system.upgrade.confirm.body":"当前 {current},升级到 {latest}。要求所有 pipeline 已停止。升级后请重启 sps console 生效。","system.upgrade.confirm.button":"升级","system.upgrade.success.title":"升级完成","system.upgrade.success.body":'装上了 v{version}。请 `pkill -f "sps console"` 再重启以生效。',"system.upgrade.notEffective.title":"升级未生效","system.upgrade.notEffective.same":"npm 执行完毕但版本没变(仍 {version})——多半是权限或 registry 问题。可复制下面的命令在终端手动跑。","system.upgrade.notEffective.notInstalled":"npm 没装上新版本。可复制命令手动跑,或看下面日志定位。","system.upgrade.error.title":"升级失败","system.upgrade.copy.success.title":"命令已复制","system.upgrade.copy.success.body":`粘贴到终端运行即可:
383
383
  {cmd}`,"system.upgrade.copy.fail.title":"复制失败","system.upgrade.copy.fail.body":`请手动复制:
384
384
  {cmd}`,"system.diagnostics.title":"项目健康检查","system.diagnostics.checkAll":"检查全部","system.diagnostics.empty":"还没有项目。","system.diagnostics.expandAria":"展开","system.diagnostics.collapseAria":"折叠","system.diagnostics.never":'点 "检查" 运行 sps doctor',"system.diagnostics.checkAria":"检查","system.diagnostics.check":"检查","system.diagnostics.noFixesNeeded":"已无可修问题","system.diagnostics.fix.tip":"调 sps doctor <proj> --fix:自动创建 .claude/hooks/stop.sh、state.json 等","system.diagnostics.fixAria":"自动修复","system.diagnostics.fix":"修复","system.diagnostics.fixed":"已修复","system.diagnostics.error.fix":"doctor 修复失败","system.diagnostics.error.check":"doctor 检查失败","chat.title":"对话 💬","chat.empty.title":"对话 💬","chat.empty.hint":'点左上角"新建对话"开始一个 session。或直接在下方输入,会自动建 session。',"chat.empty.shortcuts":"Enter 发送 · Shift+Enter 换行 · 内容流式返回","chat.list.heading":"历史 {count}","chat.list.new":"新建对话","chat.list.empty":"还没对话。点上面新建。","chat.list.delete.aria":"删除对话","chat.list.deleteCli.aria":"从 Console 移除该 CLI 会话(不影响 Claude jsonl 存档)","chat.list.openAria":"打开对话 {title}{cwd}","chat.list.cwdSuffix":"(工作目录 {cwd})","chat.list.msgs":"{count} 条 · {time}","chat.delete.confirm.title":"删除对话","chat.delete.confirm.body.cli":"会从 Console 列表移除(停 daemon 会话)。Claude CLI 在 ~/.claude/projects 下的对话存档会保留 —— 想恢复到终端继续聊就重新跑 sps agent --chat --name <名>。","chat.delete.confirm.body.console":"对话记录会永久删除,不可恢复。","chat.delete.confirm.button":"删除","chat.cli.banner.bold":"CLI 会话","chat.cli.banner":"这是 CLI 会话(由 sps agent 创建),Console 仅展示历史。续聊请在终端运行:","chat.input.placeholder":"说点什么… (Enter 发送,Shift+Enter 换行,可拖入文件 / 粘贴图片)","chat.input.dragOver":"松开鼠标以附加文件…","chat.input.aria":"消息输入","chat.input.attach.aria":"附加本地文件","chat.input.attach.title":"附加本地文件(也可拖拽 / 粘贴图片)","chat.input.send":"发送","chat.input.send.aria":"发送","chat.input.interrupt":"中断","chat.input.interrupt.aria":"中断生成","chat.input.uploading":"上传中…","chat.input.removeAttachment":"移除 {name}","chat.error.interrupt.title":"中断失败","chat.cliBadge":"CLI","chat.cliBadge.tooltip":"该会话由 sps agent CLI 创建,从 Claude jsonl 实时读取(只读)","chat.session.title":"{title}","chat.session.id":"{id}","chat.session.empty":"下方输入问题开始对话 · Enter 发送 · Shift+Enter 换行","notFound.title":"404","notFound.body":"这个页面不存在。","notFound.home":"回到首页","workers.active.empty":"没有 worker 在运行。","workers.alerts.allHealthy":"全部 worker 健康","workers.alerts.pidDead":"PID 已死。","workers.alerts.markerStale":"marker 停 {ago}。","workers.capacity.col.project":"项目","workers.capacity.col.usage":"占用","workers.capacity.col.other":"其它","workers.capacity.detailHint":"详情 →","workers.panel.boardLink":"看板 →","workers.panel.loading":"加载 workers…","workers.panel.empty.slots":"该项目没有 worker slot。","workers.panel.empty.noWorker":"无 worker","workers.panel.empty.pickOne":"请选择一个 worker","workers.panel.idle.short":"空闲","workers.panel.section.currentCard":"当前卡片","workers.panel.idle.full":"slot 空闲,没有当前卡片。","workers.panel.section.claudeOutput":"Claude 输出 · 最近 {n} 行","workers.panel.output.loading":"加载中…","workers.panel.output.empty":"还没收到 session 输出。Worker 刚启动时需要几秒。","workers.panel.section.heartbeat":"Supervisor 心跳 · 最近 {n} 行","workers.panel.heartbeat.fullLog":"查看完整 log →","workers.panel.action.restart":"重启","workers.panel.action.restart.confirm.title":"重启 worker-{slot}","workers.panel.action.restart.confirm.body":"先杀进程,再重新 launch 到 #{seq}","workers.panel.action.restart.confirm.button":"重启","workers.panel.action.restart.error":"重启失败","workers.panel.action.kill":"终止","workers.panel.action.kill.confirm.title":"终止 worker-{slot}","workers.panel.action.kill.confirm.body":"当前任务强制中断。","workers.panel.action.kill.confirm.button":"终止","workers.panel.action.kill.error":"终止失败","dialog.confirm.default":"确定","dialog.alert.default":"知道了","dialog.cancel.default":"取消","dirPicker.title.default":"选择目录","dirPicker.close.aria":"关闭","dirPicker.up.aria":"上级目录","dirPicker.up.title":"上级目录","dirPicker.home.aria":"回到 Home","dirPicker.home.title":"回到 Home","dirPicker.loading":"加载中...","dirPicker.error.title":"读取失败","dirPicker.empty":"— 空目录 —","dirPicker.enter.aria":"进入 {name}/","dirPicker.pickFile.aria":"选择 {name}(双击直接确认)","dirPicker.fileLocked":"文件不可选","dirPicker.cancel":"取消","dirPicker.useFile":"使用此文件","dirPicker.useFile.tooltip.empty":"请先点选一个文件","dirPicker.useDir":"选此目录","errorBoundary.title":"💥 UI 崩了","errorBoundary.refresh":"刷新页面","chat.error.create.title":"新建对话失败","chat.error.send.title":"发送失败","chat.error.fileTooBig.title":"文件超过上限","chat.error.fileTooBig.body":"单文件上限 50 MB;当前 {size} MB({name})","chat.error.uploadAttachment.title":"附件上传失败","chat.placeholder.attachment":"(附件)","chat.placeholder.viewAttachment":"(请查看附件)","chat.placeholder.attachmentTitle":"附件","chat.attachment.previewTooltip":`{name}
@@ -564,4 +564,4 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
564
564
  https://github.com/highlightjs/highlight.js/issues/2277`),Qt=fe,ft=Ae),Ye===void 0&&(Ye=!0);const bn={code:ft,language:Qt};Mr("before:highlight",bn);const Vn=bn.result?bn.result:ia(bn.language,bn.code,Ye);return Vn.code=bn.code,Mr("after:highlight",Vn),Vn}function ia(fe,Ae,Ye,ft){const Qt=Object.create(null);function bn(be,Ne){return be.keywords[Ne]}function Vn(){if(!Le.keywords){Xt.addText(ht);return}let be=0;Le.keywordPatternRe.lastIndex=0;let Ne=Le.keywordPatternRe.exec(ht),qe="";for(;Ne;){qe+=ht.substring(be,Ne.index);const Ze=un.case_insensitive?Ne[0].toLowerCase():Ne[0],Bt=bn(Le,Ze);if(Bt){const[di,Jl]=Bt;if(Xt.addText(qe),qe="",Qt[Ze]=(Qt[Ze]||0)+1,Qt[Ze]<=ws&&(Ia+=Jl),di.startsWith("_"))qe+=Ne[0];else{const zc=un.classNameAliases[di]||di;Wn(Ne[0],zc)}}else qe+=Ne[0];be=Le.keywordPatternRe.lastIndex,Ne=Le.keywordPatternRe.exec(ht)}qe+=ht.substring(be),Xt.addText(qe)}function In(){if(ht==="")return;let be=null;if(typeof Le.subLanguage=="string"){if(!se[Le.subLanguage]){Xt.addText(ht);return}be=ia(Le.subLanguage,ht,!0,Ic[Le.subLanguage]),Ic[Le.subLanguage]=be._top}else be=Es(ht,Le.subLanguage.length?Le.subLanguage:null);Le.relevance>0&&(Ia+=be.relevance),Xt.__addSublanguage(be._emitter,be.language)}function _t(){Le.subLanguage!=null?In():Vn(),ht=""}function Wn(be,Ne){be!==""&&(Xt.startScope(Ne),Xt.addText(be),Xt.endScope())}function Rc(be,Ne){let qe=1;const Ze=Ne.length-1;for(;qe<=Ze;){if(!be._emit[qe]){qe++;continue}const Bt=un.classNameAliases[be[qe]]||be[qe],di=Ne[qe];Bt?Wn(di,Bt):(ht=di,Vn(),ht=""),qe++}}function _s(be,Ne){return be.scope&&typeof be.scope=="string"&&Xt.openNode(un.classNameAliases[be.scope]||be.scope),be.beginScope&&(be.beginScope._wrap?(Wn(ht,un.classNameAliases[be.beginScope._wrap]||be.beginScope._wrap),ht=""):be.beginScope._multi&&(Rc(be.beginScope,Ne),ht="")),Le=Object.create(be,{parent:{value:Le}}),Le}function Wl(be,Ne,qe){let Ze=T(be.endRe,qe);if(Ze){if(be["on:end"]){const Bt=new t(be);be["on:end"](Ne,Bt),Bt.isMatchIgnored&&(Ze=!1)}if(Ze){for(;be.endsParent&&be.parent;)be=be.parent;return be}}if(be.endsWithParent)return Wl(be.parent,Ne,qe)}function Ns(be){return Le.matcher.regexIndex===0?(ht+=be[0],1):(za=!0,0)}function sf(be){const Ne=be[0],qe=be.rule,Ze=new t(qe),Bt=[qe.__beforeBegin,qe["on:begin"]];for(const di of Bt)if(di&&(di(be,Ze),Ze.isMatchIgnored))return Ns(Ne);return qe.skip?ht+=Ne:(qe.excludeBegin&&(ht+=Ne),_t(),!qe.returnBegin&&!qe.excludeBegin&&(ht=Ne)),_s(qe,be),qe.returnBegin?0:Ne.length}function zn(be){const Ne=be[0],qe=Ae.substring(be.index),Ze=Wl(Le,be,qe);if(!Ze)return jr;const Bt=Le;Le.endScope&&Le.endScope._wrap?(_t(),Wn(Ne,Le.endScope._wrap)):Le.endScope&&Le.endScope._multi?(_t(),Rc(Le.endScope,be)):Bt.skip?ht+=Ne:(Bt.returnEnd||Bt.excludeEnd||(ht+=Ne),_t(),Bt.excludeEnd&&(ht=Ne));do Le.scope&&Xt.closeNode(),!Le.skip&&!Le.subLanguage&&(Ia+=Le.relevance),Le=Le.parent;while(Le!==Ze.parent);return Ze.starts&&_s(Ze.starts,be),Bt.returnEnd?0:Ne.length}function Xl(){const be=[];for(let Ne=Le;Ne!==un;Ne=Ne.parent)Ne.scope&&be.unshift(Ne.scope);be.forEach(Ne=>Xt.openNode(Ne))}let Rr={};function Cs(be,Ne){const qe=Ne&&Ne[0];if(ht+=be,qe==null)return _t(),0;if(Rr.type==="begin"&&Ne.type==="end"&&Rr.index===Ne.index&&qe===""){if(ht+=Ae.slice(Ne.index,Ne.index+1),!Ct){const Ze=new Error(`0 width match regex (${fe})`);throw Ze.languageName=fe,Ze.badRule=Rr.rule,Ze}return 1}if(Rr=Ne,Ne.type==="begin")return sf(Ne);if(Ne.type==="illegal"&&!Ye){const Ze=new Error('Illegal lexeme "'+qe+'" for mode "'+(Le.scope||"<unnamed>")+'"');throw Ze.mode=Le,Ze}else if(Ne.type==="end"){const Ze=zn(Ne);if(Ze!==jr)return Ze}if(Ne.type==="illegal"&&qe==="")return ht+=`
565
565
  `,1;if(Zl>1e5&&Zl>Ne.index*3)throw new Error("potential infinite loop, way more iterations than matches");return ht+=qe,qe.length}const un=Cn(fe);if(!un)throw zt(vt.replace("{}",fe)),new Error('Unknown language: "'+fe+'"');const Lc=cn(un);let Ts="",Le=ft||Lc;const Ic={},Xt=new ke.__emitter(ke);Xl();let ht="",Ia=0,sa=0,Zl=0,za=!1;try{if(un.__emitTokens)un.__emitTokens(Ae,Xt);else{for(Le.matcher.considerAll();;){Zl++,za?za=!1:Le.matcher.considerAll(),Le.matcher.lastIndex=sa;const be=Le.matcher.exec(Ae);if(!be)break;const Ne=Ae.substring(sa,be.index),qe=Cs(Ne,be);sa=be.index+qe}Cs(Ae.substring(sa))}return Xt.finalize(),Ts=Xt.toHTML(),{language:fe,value:Ts,relevance:Ia,illegal:!1,_emitter:Xt,_top:Le}}catch(be){if(be.message&&be.message.includes("Illegal"))return{language:fe,value:Nn(Ae),illegal:!0,relevance:0,_illegalBy:{message:be.message,index:sa,context:Ae.slice(sa-100,sa+100),mode:be.mode,resultSoFar:Ts},_emitter:Xt};if(Ct)return{language:fe,value:Nn(Ae),illegal:!1,relevance:0,errorRaised:be,_emitter:Xt,_top:Le};throw be}}function ks(fe){const Ae={value:Nn(fe),illegal:!1,relevance:0,_top:Se,_emitter:new ke.__emitter(ke)};return Ae._emitter.addText(fe),Ae}function Es(fe,Ae){Ae=Ae||ke.languages||Object.keys(se);const Ye=ks(fe),ft=Ae.filter(Cn).filter(Ra).map(_t=>ia(_t,fe,!1));ft.unshift(Ye);const Qt=ft.sort((_t,Wn)=>{if(_t.relevance!==Wn.relevance)return Wn.relevance-_t.relevance;if(_t.language&&Wn.language){if(Cn(_t.language).supersetOf===Wn.language)return 1;if(Cn(Wn.language).supersetOf===_t.language)return-1}return 0}),[bn,Vn]=Qt,In=bn;return In.secondBest=Vn,In}function $i(fe,Ae,Ye){const ft=Ae&&ve[Ae]||Ye;fe.classList.add("hljs"),fe.classList.add(`language-${ft}`)}function Gt(fe){let Ae=null;const Ye=Kt(fe);if(Ie(Ye))return;if(Mr("before:highlightElement",{el:fe,language:Ye}),fe.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",fe);return}if(fe.children.length>0&&(ke.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(fe)),ke.throwUnescapedHTML))throw new qi("One of your code blocks includes unescaped HTML.",fe.innerHTML);Ae=fe;const ft=Ae.textContent,Qt=Ye?Dt(ft,{language:Ye,ignoreIllegals:!0}):Es(ft);fe.innerHTML=Qt.value,fe.dataset.highlighted="yes",$i(fe,Ye,Qt.language),fe.result={language:Qt.language,re:Qt.relevance,relevance:Qt.relevance},Qt.secondBest&&(fe.secondBest={language:Qt.secondBest.language,relevance:Qt.secondBest.relevance}),Mr("after:highlightElement",{el:fe,result:Qt,text:ft})}function gn(fe){ke=jc(ke,fe)}const Ma=()=>{Ss(),ne("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function Yl(){Ss(),ne("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let Oc=!1;function Ss(){function fe(){Ss()}if(document.readyState==="loading"){Oc||window.addEventListener("DOMContentLoaded",fe,!1),Oc=!0;return}document.querySelectorAll(ke.cssSelector).forEach(Gt)}function Dc(fe,Ae){let Ye=null;try{Ye=Ae(z)}catch(ft){if(zt("Language definition for '{}' could not be registered.".replace("{}",fe)),Ct)zt(ft);else throw ft;Ye=Se}Ye.name||(Ye.name=fe),se[fe]=Ye,Ye.rawDefinition=Ae.bind(null,z),Ye.aliases&&aa(Ye.aliases,{languageName:fe})}function Dr(fe){delete se[fe];for(const Ae of Object.keys(ve))ve[Ae]===fe&&delete ve[Ae]}function Vl(){return Object.keys(se)}function Cn(fe){return fe=(fe||"").toLowerCase(),se[fe]||se[ve[fe]]}function aa(fe,{languageName:Ae}){typeof fe=="string"&&(fe=[fe]),fe.forEach(Ye=>{ve[Ye.toLowerCase()]=Ae})}function Ra(fe){const Ae=Cn(fe);return Ae&&!Ae.disableAutodetect}function La(fe){fe["before:highlightBlock"]&&!fe["before:highlightElement"]&&(fe["before:highlightElement"]=Ae=>{fe["before:highlightBlock"](Object.assign({block:Ae.el},Ae))}),fe["after:highlightBlock"]&&!fe["after:highlightElement"]&&(fe["after:highlightElement"]=Ae=>{fe["after:highlightBlock"](Object.assign({block:Ae.el},Ae))})}function Wt(fe){La(fe),Be.push(fe)}function Mc(fe){const Ae=Be.indexOf(fe);Ae!==-1&&Be.splice(Ae,1)}function Mr(fe,Ae){const Ye=fe;Be.forEach(function(ft){ft[Ye]&&ft[Ye](Ae)})}function ra(fe){return ne("10.7.0","highlightBlock will be removed entirely in v12.0"),ne("10.7.0","Please use highlightElement now."),Gt(fe)}Object.assign(z,{highlight:Dt,highlightAuto:Es,highlightAll:Ss,highlightElement:Gt,highlightBlock:ra,configure:gn,initHighlighting:Ma,initHighlightingOnLoad:Yl,registerLanguage:Dc,unregisterLanguage:Dr,listLanguages:Vl,getLanguage:Cn,registerAliases:aa,autoDetection:Ra,inherit:jc,addPlugin:Wt,removePlugin:Mc}),z.debugMode=function(){Ct=!1},z.safeMode=function(){Ct=!0},z.versionString=dt,z.regex={concat:w,lookahead:v,either:_,optional:E,anyNumberOfTimes:x};for(const fe in ye)typeof ye[fe]=="object"&&e(ye[fe]);return Object.assign(z,ye),z},Ln=Or({});return Ln.newInstance=()=>Or({}),Gp=Ln,Ln.HighlightJS=Ln,Ln.default=Ln,Gp}var NB=_B();const CB=Lm(NB),cw={},TB="hljs-";function AB(e){const t=CB.newInstance();return e&&o(e),{highlight:n,highlightAuto:a,listLanguages:s,register:o,registerAlias:c,registered:d};function n(h,p,b){const g=b||cw,v=typeof g.prefix=="string"?g.prefix:TB;if(!t.getLanguage(h))throw new Error("Unknown language: `"+h+"` is not registered");t.configure({__emitter:jB,classPrefix:v});const x=t.highlight(p,{ignoreIllegals:!0,language:h});if(x.errorRaised)throw new Error("Could not highlight with `Highlight.js`",{cause:x.errorRaised});const E=x._emitter.root,w=E.data;return w.language=x.language,w.relevance=x.relevance,E}function a(h,p){const g=(p||cw).subset||s();let v=-1,x=0,E;for(;++v<g.length;){const w=g[v];if(!t.getLanguage(w))continue;const S=n(w,h,p);S.data&&S.data.relevance!==void 0&&S.data.relevance>x&&(x=S.data.relevance,E=S)}return E||{type:"root",children:[],data:{language:void 0,relevance:x}}}function s(){return t.listLanguages()}function o(h,p){if(typeof h=="string")t.registerLanguage(h,p);else{let b;for(b in h)Object.hasOwn(h,b)&&t.registerLanguage(b,h[b])}}function c(h,p){if(typeof h=="string")t.registerAliases(typeof p=="string"?p:[...p],{languageName:h});else{let b;for(b in h)if(Object.hasOwn(h,b)){const g=h[b];t.registerAliases(typeof g=="string"?g:[...g],{languageName:b})}}}function d(h){return!!t.getLanguage(h)}}class jB{constructor(t){this.options=t,this.root={type:"root",children:[],data:{language:void 0,relevance:0}},this.stack=[this.root]}addText(t){if(t==="")return;const n=this.stack[this.stack.length-1],a=n.children[n.children.length-1];a&&a.type==="text"?a.value+=t:n.children.push({type:"text",value:t})}startScope(t){this.openNode(String(t))}endScope(){this.closeNode()}__addSublanguage(t,n){const a=this.stack[this.stack.length-1],s=t.root.children;n?a.children.push({type:"element",tagName:"span",properties:{className:[n]},children:s}):a.children.push(...s)}openNode(t){const n=this,a=t.split(".").map(function(c,d){return d?c+"_".repeat(d):n.options.classPrefix+c}),s=this.stack[this.stack.length-1],o={type:"element",tagName:"span",properties:{className:a},children:[]};s.children.push(o),this.stack.push(o)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}}const OB={};function Pg(e){const t=e||OB,n=t.aliases,a=t.detect||!1,s=t.languages||SB,o=t.plainText,c=t.prefix,d=t.subset;let h="hljs";const p=AB(s);if(n&&p.registerAlias(n),c){const b=c.indexOf("-");h=b===-1?c:c.slice(0,b)}return function(b,g){rf(b,"element",function(v,x,E){if(v.tagName!=="code"||!E||E.type!=="element"||E.tagName!=="pre")return;const w=DB(v);if(w===!1||!w&&!a||w&&o&&o.includes(w))return;Array.isArray(v.properties.className)||(v.properties.className=[]),v.properties.className.includes(h)||v.properties.className.unshift(h);const S=Xz(v,{whitespace:"pre"});let _;try{_=w?p.highlight(w,S,{prefix:c}):p.highlightAuto(S,{prefix:c,subset:d})}catch(C){const T=C;if(w&&/Unknown language/.test(T.message)){g.message("Cannot highlight as `"+w+"`, it’s not registered",{ancestors:[E,v],cause:T,place:v.position,ruleId:"missing-language",source:"rehype-highlight"});return}throw T}!w&&_.data&&_.data.language&&v.properties.className.push("language-"+_.data.language),_.children.length>0&&(v.children=_.children)})}}function DB(e){const t=e.properties.className;let n=-1;if(!Array.isArray(t))return;let a;for(;++n<t.length;){const s=String(t[n]);if(s==="no-highlight"||s==="nohighlight")return!1;!a&&s.slice(0,5)==="lang-"&&(a=s.slice(5)),!a&&s.slice(0,9)==="language-"&&(a=s.slice(9))}return a}function MB({name:e,projects:t,onClose:n,onChange:a}){const s=ze(),{confirm:o,alert:c}=ci(),{data:d,isLoading:h,isError:p,error:b,refetch:g}=rt({queryKey:["skill",e],queryFn:()=>xO(e)});A.useEffect(()=>{const C=T=>{T.key==="Escape"&&n()};return window.addEventListener("keydown",C),()=>window.removeEventListener("keydown",C)},[n]);const v=async(C,T)=>{try{await T(),await g(),a()}catch(D){c({title:s("skillDetail.actionFailed",{label:C}),body:D instanceof Error?D.message:String(D)})}},x=C=>v("link",()=>wO(e,C)),E=async C=>{await o({title:s("skillDetail.removeConfirm.title",{project:C,name:e}),body:s("skillDetail.removeConfirm.body"),confirm:s("skillDetail.removeConfirm.button"),danger:!0})&&await v("unlink",()=>kO(e,C))},w=C=>v("freeze",()=>EO(e,C)),S=async C=>{await o({title:s("skillDetail.unfreezeConfirm.title",{name:e,project:C}),body:s("skillDetail.unfreezeConfirm.body"),confirm:s("skillDetail.unfreezeConfirm.button"),danger:!0})&&await v("unfreeze",()=>SO(e,C))},_=new Map(((d==null?void 0:d.linkedProjects)??[]).map(C=>[C.project,C.state]));return f.jsx("div",{role:"dialog","aria-modal":"true",className:"fixed inset-0 z-40 flex items-start justify-center p-6 bg-black/30 overflow-auto",children:f.jsxs("div",{className:"nb-card mt-8 w-full max-w-4xl",children:[f.jsxs("header",{className:"flex items-start justify-between gap-4 mb-4",children:[f.jsxs("div",{children:[f.jsx("h2",{className:"font-[family-name:var(--font-heading)] text-3xl font-bold",children:e}),d&&f.jsxs("p",{className:"text-sm text-[var(--color-text-muted)] mt-1",children:[d.category," · ",d.origin||"local"]})]}),f.jsx("button",{onClick:n,className:"nb-btn nb-btn-mint p-2","aria-label":s("skillDetail.close.aria"),type:"button",children:f.jsx(_i,{size:16,strokeWidth:3})})]}),h&&f.jsx("p",{children:s("skillDetail.loading")}),p&&f.jsx("p",{className:"text-[var(--color-crashed)]",children:s("skillDetail.error.load",{detail:b instanceof Error?b.message:String(b)})}),d&&f.jsxs("div",{className:"flex flex-col gap-4",children:[f.jsxs("div",{className:"nb-card bg-[var(--color-bg-cream)] p-4",children:[f.jsx("h3",{className:"font-[family-name:var(--font-heading)] text-sm font-bold mb-3 uppercase tracking-wider",children:s("skillDetail.section.projects")}),f.jsxs("div",{className:"flex flex-col gap-2",children:[t.map(C=>{const T=_.get(C);return f.jsxs("div",{className:"flex items-center justify-between gap-3 p-2 bg-[var(--color-bg)] border-2 border-[var(--color-text)] rounded-lg",children:[f.jsxs("div",{className:"flex items-center gap-3",children:[f.jsx("span",{className:"font-[family-name:var(--font-mono)] font-bold text-sm",children:C}),T==="linked"&&f.jsx("span",{className:"nb-status",style:{background:"var(--color-running-bg)",color:"var(--color-running)"},children:"linked"}),T==="frozen"&&f.jsx("span",{className:"nb-status",style:{background:"var(--color-stuck-bg)",color:"var(--color-stuck)"},children:"frozen"}),!T&&f.jsx("span",{className:"nb-status",style:{background:"var(--color-idle-bg)",color:"var(--color-idle)"},children:"absent"})]}),f.jsxs("div",{className:"flex gap-2",children:[!T&&f.jsxs("button",{className:"nb-btn nb-btn-primary",style:{padding:"4px 10px",fontSize:11},onClick:()=>x(C),type:"button",children:[f.jsx(TT,{size:11})," link"]}),T==="linked"&&f.jsxs(f.Fragment,{children:[f.jsxs("button",{className:"nb-btn",style:{padding:"4px 10px",fontSize:11},onClick:()=>w(C),type:"button",children:[f.jsx(ZT,{size:11})," freeze"]}),f.jsx("button",{className:"nb-btn nb-btn-danger",style:{padding:"4px 10px",fontSize:11},onClick:()=>E(C),type:"button",children:"unlink"})]}),T==="frozen"&&f.jsxs(f.Fragment,{children:[f.jsxs("button",{className:"nb-btn",style:{padding:"4px 10px",fontSize:11},onClick:()=>S(C),type:"button",children:[f.jsx(sT,{size:11})," unfreeze"]}),f.jsx("button",{className:"nb-btn nb-btn-danger",style:{padding:"4px 10px",fontSize:11},onClick:()=>E(C),type:"button",children:"unlink"})]})]})]},C)}),t.length===0&&f.jsx("p",{className:"text-sm text-[var(--color-text-muted)] italic",children:s("skillDetail.section.empty")})]})]}),f.jsxs("div",{children:[f.jsx("h3",{className:"font-[family-name:var(--font-heading)] text-sm font-bold mb-2 uppercase tracking-wider",children:s("skillDetail.section.preview")}),f.jsx("div",{className:"prose-chat bg-[var(--color-bg-cream)] border-2 border-[var(--color-text)] rounded-lg p-4 max-h-80 overflow-auto text-sm",children:d.body?f.jsx(Dg,{remarkPlugins:[Ig],rehypePlugins:[Pg],children:d.body}):f.jsx("p",{className:"text-[var(--color-text-muted)] italic",children:"(empty)"})})]}),d.references.length>0&&f.jsxs("div",{children:[f.jsx("h3",{className:"font-[family-name:var(--font-heading)] text-sm font-bold mb-2 uppercase tracking-wider",children:"References"}),f.jsx("ul",{className:"flex flex-col gap-2",children:d.references.map(C=>f.jsx(RB,{skillName:e,file:C.name,lines:C.lines},C.name))})]})]})]})})}function RB({skillName:e,file:t,lines:n}){const a=ze(),[s,o]=A.useState(!1),{data:c,isLoading:d,isError:h,error:p}=rt({queryKey:["skill-ref",e,t],queryFn:()=>vO(e,t),enabled:s,staleTime:1/0});return f.jsxs("li",{className:"border-2 border-[var(--color-text)] rounded-lg overflow-hidden bg-[var(--color-bg-cream)]",children:[f.jsxs("button",{type:"button",onClick:()=>o(b=>!b),"aria-label":a("skillDetail.toggleSection.aria",{action:a(s?"skillDetail.collapse":"skillDetail.expand"),file:t}),"aria-expanded":s,className:"w-full flex items-center gap-2 px-3 py-2 text-sm font-[family-name:var(--font-mono)] hover:bg-[var(--color-accent-yellow)] transition-colors",children:[f.jsx(Bd,{size:12,strokeWidth:3,className:["transition-transform",s?"rotate-90":""].join(" ")}),f.jsx(kc,{size:12,strokeWidth:2.5}),f.jsx("span",{className:"flex-1 text-left font-bold",children:t}),f.jsxs("span",{className:"text-xs text-[var(--color-text-subtle)]",children:[n," lines"]})]}),s&&f.jsxs("div",{className:"px-4 py-3 border-t-2 border-[var(--color-text)] bg-[var(--color-bg)] max-h-96 overflow-auto",children:[d&&f.jsx("p",{className:"text-xs text-[var(--color-text-muted)]",children:a("skillDetail.loading")}),h&&f.jsx("p",{className:"text-xs text-[var(--color-crashed)]",children:a("skillDetail.error.load",{detail:p instanceof Error?p.message:String(p)})}),c&&f.jsx("div",{className:"prose-chat text-sm",children:f.jsx(Dg,{remarkPlugins:[Ig],rehypePlugins:[Pg],children:c.content})})]})]})}const LB=[{value:"all",labelKey:"skills.category.all"},{value:"language",labelKey:"skills.category.language"},{value:"end",labelKey:"skills.category.end"},{value:"persona",labelKey:"skills.category.persona"},{value:"workflow",labelKey:"skills.category.workflow"},{value:"other",labelKey:"skills.category.other"}],IB={language:"var(--color-accent-purple)",end:"var(--color-secondary)",persona:"var(--color-primary)",workflow:"var(--color-accent-mint)",other:"var(--color-bg-cream)"};function zB(){var x;const e=ze(),[t,n]=A.useState("all"),[a,s]=A.useState(""),[o,c]=A.useState(null),d=En(),{data:h,isLoading:p}=rt({queryKey:["skills"],queryFn:()=>pg()}),b=rt({queryKey:["projects"],queryFn:Nr}),g=A.useMemo(()=>((h==null?void 0:h.data)??[]).filter(w=>!(t!=="all"&&w.category!==t||a&&!w.name.toLowerCase().includes(a.toLowerCase()))),[h,t,a]),v=A.useMemo(()=>{const E=(h==null?void 0:h.data)??[],w={all:E.length};for(const S of E)w[S.category]=(w[S.category]??0)+1;return w},[h]);return f.jsxs("div",{className:"flex flex-col gap-4 max-w-full",children:[f.jsxs("header",{className:"flex items-center justify-between flex-wrap gap-3",children:[f.jsxs("div",{children:[f.jsx("h1",{className:"font-[family-name:var(--font-heading)] text-4xl font-bold",children:"Skills 🎯"}),f.jsx("p",{className:"text-sm text-[var(--color-text-muted)] mt-1",children:p?e("common.loading"):e("skills.subtitleCount",{count:(h==null?void 0:h.data.length)??0})})]}),f.jsx("div",{className:"flex gap-3 items-center",children:f.jsxs("button",{className:"nb-btn nb-btn-mint",onClick:async()=>{await _O(),d.invalidateQueries({queryKey:["skills"]})},type:"button",children:[f.jsx(Er,{size:14,strokeWidth:2.5}),"Sync bundled"]})})]}),f.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[f.jsxs("div",{className:"relative flex-1 max-w-md",children:[f.jsx(kd,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-[var(--color-text-subtle)]"}),f.jsx("input",{className:"nb-input pl-9 w-full",placeholder:e("skills.search.placeholder"),value:a,onChange:E=>s(E.target.value),"aria-label":e("skills.search.aria")})]}),f.jsx("div",{className:"flex gap-1 p-1 bg-[var(--color-bg)] border-[2px] border-[var(--color-text)] rounded-full shadow-[2px_2px_0_var(--color-text)]",children:LB.map(E=>f.jsxs("button",{type:"button",onClick:()=>n(E.value),className:["px-3 py-1 rounded-full text-xs font-bold font-[family-name:var(--font-body)]",t===E.value?"bg-[var(--color-text)] text-[var(--color-bg)]":"text-[var(--color-text-muted)] hover:text-[var(--color-text)]"].join(" "),children:[e(E.labelKey)," ",v[E.value]]},E.value))})]}),f.jsx("div",{className:"grid gap-4 grid-cols-[repeat(auto-fill,minmax(280px,1fr))]",children:g.map(E=>{var w;return f.jsx(BB,{skill:E,projectCount:((w=b.data)==null?void 0:w.data.length)??0,onOpen:()=>c(E.name)},E.name)})}),o&&f.jsx(MB,{name:o,projects:((x=b.data)==null?void 0:x.data.map(E=>E.name))??[],onClose:()=>c(null),onChange:()=>d.invalidateQueries({queryKey:["skills"]})})]})}function BB({skill:e,projectCount:t,onOpen:n}){const a=IB[e.category];return f.jsxs("article",{onClick:n,onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),n())},tabIndex:0,role:"button","aria-label":`Open ${e.name}`,className:"nb-card nb-card-interactive flex flex-col gap-3",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx("h3",{className:"font-[family-name:var(--font-heading)] font-bold text-lg",children:e.name}),f.jsx("span",{className:"nb-badge text-[10px]",style:{background:a},children:e.category})]}),f.jsx("p",{className:"text-sm text-[var(--color-text-muted)] leading-5 line-clamp-3",children:e.description||"(no description)"}),f.jsxs("div",{className:"flex items-center justify-between text-xs font-[family-name:var(--font-mono)] pt-2 border-t-[1.5px] border-dashed border-[var(--color-border-light)]",children:[f.jsx("span",{className:"font-bold",children:e.linkedProjects.length>0?`● linked in ${e.linkedProjects.length}`:"○ not linked"}),f.jsxs("span",{className:"text-[var(--color-text-subtle)]",children:[t," projects"]})]})]})}function PB(){var o;const e=ze(),t=rt({queryKey:["system-info"],queryFn:wk}),n=rt({queryKey:["system-env"],queryFn:wA}),[a,s]=A.useState(!1);return f.jsxs("div",{className:"flex flex-col gap-6 max-w-4xl",children:[f.jsx("header",{children:f.jsx("h1",{className:"font-[family-name:var(--font-heading)] text-4xl font-bold",children:e("system.h1")})}),f.jsx(UB,{current:(o=t.data)==null?void 0:o.version}),f.jsxs("section",{className:"nb-card",children:[f.jsx("h2",{className:"font-[family-name:var(--font-heading)] text-xl font-bold mb-3",children:e("system.runtime")}),t.data?f.jsxs("dl",{className:"grid grid-cols-[160px_1fr] gap-y-2 text-sm",children:[f.jsx("dt",{className:"font-bold",children:"Node"}),f.jsx("dd",{className:"font-[family-name:var(--font-mono)]",children:t.data.nodeVersion}),f.jsx("dt",{className:"font-bold",children:"Platform"}),f.jsx("dd",{className:"font-[family-name:var(--font-mono)]",children:t.data.platform}),f.jsx("dt",{className:"font-bold",children:"PID"}),f.jsx("dd",{className:"font-[family-name:var(--font-mono)]",children:t.data.pid??"—"}),f.jsx("dt",{className:"font-bold",children:"Uptime"}),f.jsx("dd",{className:"font-[family-name:var(--font-mono)]",children:HB(t.data.uptimeMs)})]}):f.jsx("p",{className:"text-[var(--color-text-muted)]",children:e("common.loading")})]}),f.jsxs("section",{className:"nb-card",children:[f.jsxs("div",{className:"flex items-center justify-between mb-3",children:[f.jsxs("h2",{className:"font-[family-name:var(--font-heading)] text-xl font-bold",children:[e("system.env.title.prefix"),f.jsx("code",{className:"text-sm font-[family-name:var(--font-mono)] font-normal bg-[var(--color-bg-cream)] border-2 border-[var(--color-text)] px-2 py-0.5 rounded",children:"~/.coral/env"})]}),a?f.jsx("span",{className:"text-xs text-[var(--color-stuck)] font-bold",children:e("system.env.editing.label")}):f.jsxs("button",{className:"nb-btn",style:{padding:"6px 12px",fontSize:12},onClick:()=>s(!0),type:"button","aria-label":e("system.env.edit.aria"),children:[f.jsx(Wm,{size:12,strokeWidth:2.5})," ",e("system.env.edit.button")]})]}),a?f.jsx(FB,{onClose:()=>{s(!1),n.refetch()}}):n.data&&n.data.exists?f.jsx("dl",{className:"grid grid-cols-[220px_1fr] gap-y-1 text-sm font-[family-name:var(--font-mono)]",children:n.data.entries.map(c=>f.jsxs("div",{className:"contents",children:[f.jsxs("dt",{className:"font-bold flex items-center gap-2",children:[c.masked&&f.jsx("span",{className:"text-[var(--color-stuck)]",children:"🔒"}),c.key]}),f.jsx("dd",{className:"text-[var(--color-text-muted)] truncate",children:c.value})]},c.key))}):f.jsxs("p",{className:"text-[var(--color-text-muted)] text-sm",children:[e("system.env.empty.before"),f.jsx("code",{className:"bg-[var(--color-bg-cream)] border-2 border-[var(--color-text)] px-2 py-0.5 rounded font-[family-name:var(--font-mono)]",children:"sps setup"}),e("system.env.empty.after")]})]}),f.jsx(qB,{})]})}function UB({current:e}){var w;const t=ze(),{confirm:n,alert:a}=ci(),[s,o]=A.useState(!1),[c,d]=A.useState(null),h=rt({queryKey:["latest-version"],queryFn:SA,enabled:!1}),[p,b]=A.useState(null),[g,v]=A.useState("npm i -g @coralai/sps-cli@latest"),x=async()=>{var _;if(await n({title:t("system.upgrade.confirm.title"),body:t("system.upgrade.confirm.body",{current:e??"?",latest:((_=h.data)==null?void 0:_.latest)??"?"}),confirm:t("system.upgrade.confirm.button")})){o(!0),d(null),b(null);try{const C=await _A();if(d(C.output),b(C.installedVersion),v(C.command),C.ok)a({title:t("system.upgrade.success.title"),body:t("system.upgrade.success.body",{version:C.installedVersion??"?"})});else{const T=C.installedVersion&&C.installedVersion===e?t("system.upgrade.notEffective.same",{version:C.installedVersion}):t("system.upgrade.notEffective.notInstalled");a({title:t("system.upgrade.notEffective.title"),body:T})}}catch(C){d(C.message),a({title:t("system.upgrade.error.title"),body:C.message})}finally{o(!1)}}},E=async()=>{const S=h.data&&!h.data.upToDate?`npm i -g @coralai/sps-cli@${h.data.latest}`:g;try{await navigator.clipboard.writeText(S),a({title:t("system.upgrade.copy.success.title"),body:t("system.upgrade.copy.success.body",{cmd:S})})}catch{a({title:t("system.upgrade.copy.fail.title"),body:t("system.upgrade.copy.fail.body",{cmd:S})})}};return f.jsxs("section",{className:"nb-card",children:[f.jsxs("div",{className:"flex items-center justify-between mb-3",children:[f.jsx("h2",{className:"font-[family-name:var(--font-heading)] text-xl font-bold",children:t("system.upgrade.title")}),f.jsxs("button",{className:"nb-btn",style:{padding:"6px 12px",fontSize:12},onClick:()=>h.refetch(),disabled:h.isFetching||!e,type:"button","aria-label":t("system.upgrade.checkLatest.aria"),children:[h.isFetching?f.jsx(jt,{size:12,strokeWidth:3,className:"animate-spin"}):f.jsx(Er,{size:12,strokeWidth:2.5}),t("system.upgrade.checkUpdate")]})]}),f.jsxs("dl",{className:"grid grid-cols-[160px_1fr] gap-y-2 text-sm",children:[f.jsx("dt",{className:"font-bold",children:t("system.upgrade.label.current")}),f.jsx("dd",{className:"font-[family-name:var(--font-mono)]",children:e??"—"}),h.data&&f.jsxs(f.Fragment,{children:[f.jsx("dt",{className:"font-bold",children:t("system.upgrade.label.latest")}),f.jsxs("dd",{className:"font-[family-name:var(--font-mono)] flex items-center gap-2 flex-wrap",children:[h.data.latest,h.data.upToDate?f.jsx("span",{className:"nb-status",style:{background:"var(--color-running-bg)",color:"var(--color-running)"},children:t("system.upgrade.latestPill")}):f.jsxs(f.Fragment,{children:[f.jsxs("button",{className:"nb-btn nb-btn-primary",style:{padding:"3px 10px",fontSize:11},onClick:x,disabled:s,type:"button","aria-label":t("system.upgrade.button.upgradeAria"),children:[s?f.jsx(jt,{size:11,strokeWidth:3,className:"animate-spin"}):f.jsx(sk,{size:11,strokeWidth:2.5}),t("system.upgrade.button.upgrade")]}),f.jsxs("button",{className:"nb-btn",style:{padding:"3px 10px",fontSize:11},onClick:E,type:"button","aria-label":t("system.upgrade.button.copyAria"),title:t("system.upgrade.button.copyTitle"),children:[f.jsx(Z2,{size:11,strokeWidth:2.5})," ",t("system.upgrade.button.copy")]})]})]})]}),p&&f.jsxs(f.Fragment,{children:[f.jsx("dt",{className:"font-bold",children:t("system.upgrade.label.installed")}),f.jsxs("dd",{className:"font-[family-name:var(--font-mono)] flex items-center gap-2",children:[p,p===((w=h.data)==null?void 0:w.latest)?f.jsx("span",{className:"nb-status",style:{background:"var(--color-running-bg)",color:"var(--color-running)"},children:t("system.upgrade.installed.ok")}):p===e?f.jsx("span",{className:"nb-status",style:{background:"var(--color-stuck-bg)",color:"var(--color-stuck)"},children:t("system.upgrade.installed.fail")}):null]})]}),h.isError&&f.jsxs(f.Fragment,{children:[f.jsx("dt",{className:"font-bold",children:t("system.upgrade.label.check")}),f.jsx("dd",{className:"text-[var(--color-crashed)] text-xs",children:h.error instanceof Error?h.error.message:String(h.error)})]})]}),c&&f.jsx("pre",{className:"mt-3 text-xs font-[family-name:var(--font-mono)] bg-[var(--color-bg-cream)] border-2 border-[var(--color-text)] rounded-lg p-3 max-h-40 overflow-auto whitespace-pre-wrap",children:c})]})}function FB({onClose:e}){const t=ze(),n=En(),{alert:a}=ci(),s=rt({queryKey:["system-env-raw"],queryFn:kA}),[o,c]=A.useState(null),[d,h]=A.useState(null);A.useEffect(()=>{s.data&&o===null&&(c(s.data.content),h(s.data.etag))},[s.data,o]);const p=o!==null&&s.data&&o!==s.data.content,b=Mn({mutationFn:()=>{if(o===null)throw new Error("no draft");return EA(o,d??"")},onSuccess:()=>{n.invalidateQueries({queryKey:["system-env"]}),n.invalidateQueries({queryKey:["system-env-raw"]}),e()},onError:g=>{const v=g.status;a({title:t(v===409?"system.env.error.conflict.title":"system.env.error.save.title"),body:v===409?t("system.env.error.conflict.body"):g instanceof Error?g.message:String(g)})}});return s.isLoading?f.jsx("p",{className:"text-[var(--color-text-muted)]",children:t("common.loading")}):f.jsxs("div",{children:[f.jsx("p",{className:"text-xs text-[var(--color-stuck)] font-bold mb-2",children:t("system.env.warning")}),f.jsx("textarea",{className:"nb-input w-full font-[family-name:var(--font-mono)] text-xs",style:{minHeight:320,resize:"vertical"},value:o??"",onChange:g=>c(g.target.value),spellCheck:!1,"aria-label":t("system.env.aria")}),f.jsxs("div",{className:"flex items-center justify-between mt-3",children:[f.jsxs("span",{className:"text-xs text-[var(--color-text-muted)] font-[family-name:var(--font-mono)]",children:[d?`etag: ${d}`:"",p?t("system.env.dirtyMark"):""]}),f.jsxs("div",{className:"flex gap-2",children:[f.jsxs("button",{className:"nb-btn",style:{padding:"6px 12px"},onClick:e,disabled:b.isPending,type:"button",children:[f.jsx(_i,{size:12,strokeWidth:3})," ",t("system.env.cancel")]}),f.jsxs("button",{className:"nb-btn nb-btn-primary",style:{padding:"6px 12px"},onClick:()=>b.mutate(),disabled:!p||b.isPending,type:"button","aria-label":t("system.env.save.aria"),children:[b.isPending?f.jsx(jt,{size:12,strokeWidth:3,className:"animate-spin"}):f.jsx(Pd,{size:12,strokeWidth:3}),t("system.env.save")]})]})]})]})}function qB(){var v;const e=ze(),{alert:t}=ci(),n=rt({queryKey:["projects"],queryFn:Nr}),[a,s]=A.useState({}),[o,c]=A.useState({}),[d,h]=A.useState({}),p=(((v=n.data)==null?void 0:v.data)??[]).map(x=>({project:x.name})),b=async(x,E)=>{c(w=>({...w,[x]:E?"fix":"check"}));try{const w=await NA(x,E);s(S=>({...S,[x]:w})),h(S=>({...S,[x]:!0}))}catch(w){t({title:e(E?"system.diagnostics.error.fix":"system.diagnostics.error.check"),body:w instanceof Error?w.message:String(w)})}finally{c(w=>({...w,[x]:null}))}},g=async()=>{for(const x of p)await b(x.project,!1)};return f.jsxs("section",{className:"nb-card",children:[f.jsxs("div",{className:"flex items-center justify-between mb-3",children:[f.jsx("h2",{className:"font-[family-name:var(--font-heading)] text-xl font-bold",children:e("system.diagnostics.title")}),f.jsxs("button",{className:"nb-btn nb-btn-mint",style:{padding:"6px 12px",fontSize:12},onClick:()=>{g()},disabled:p.length===0||Object.values(o).some(Boolean),type:"button",children:[f.jsx(Er,{size:12,strokeWidth:2.5}),e("system.diagnostics.checkAll")]})]}),p.length===0?f.jsx("p",{className:"text-[var(--color-text-muted)] text-sm",children:e("system.diagnostics.empty")}):f.jsx("ul",{className:"flex flex-col gap-2",children:p.map(x=>{const E=a[x.project],w=o[x.project],S=E?E.checks.filter(D=>D.status==="fail").length:0,_=E?E.checks.filter(D=>D.status==="warn").length:0,C=d[x.project]??!1,T=E!=null;return f.jsxs("li",{className:"bg-[var(--color-bg-cream)] border-2 border-[var(--color-text)] rounded-lg",children:[f.jsxs("div",{className:"flex items-center gap-3 px-3 py-2",children:[f.jsxs("button",{type:"button",onClick:()=>h(D=>({...D,[x.project]:!C})),disabled:!T,className:"flex items-center gap-2 flex-1 text-left min-w-0","aria-label":e(C?"system.diagnostics.collapseAria":"system.diagnostics.expandAria"),children:[T&&E.ok?f.jsx(fm,{size:16,className:"text-[var(--color-running)] shrink-0",strokeWidth:2.5}):T?f.jsx(sc,{size:16,className:"text-[var(--color-stuck)] shrink-0",strokeWidth:2.5}):f.jsx(fm,{size:16,className:"text-[var(--color-text-subtle)] shrink-0",strokeWidth:2.5}),T&&(C?f.jsx(wc,{size:12}):f.jsx(Bd,{size:12})),f.jsx("span",{className:"font-bold font-[family-name:var(--font-mono)]",children:x.project}),T?E.ok?f.jsx("span",{className:"text-xs text-[var(--color-running)] font-semibold",children:"OK"}):f.jsxs("span",{className:"text-xs text-[var(--color-stuck)] font-semibold",children:[S," fail · ",_," warn"]}):f.jsx("span",{className:"text-xs text-[var(--color-text-muted)]",children:e("system.diagnostics.never")})]}),f.jsxs("button",{className:"nb-btn",style:{padding:"4px 10px",fontSize:11},onClick:()=>{b(x.project,!1)},disabled:!!w,type:"button","aria-label":e("system.diagnostics.checkAria"),children:[w==="check"?f.jsx(jt,{size:11,strokeWidth:3,className:"animate-spin"}):f.jsx(Er,{size:11,strokeWidth:2.5}),e("system.diagnostics.check")]}),f.jsxs("button",{className:"nb-btn nb-btn-primary",style:{padding:"4px 10px",fontSize:11},onClick:()=>{b(x.project,!0)},disabled:!!w||T&&E.ok,type:"button","aria-label":e("system.diagnostics.fixAria"),title:T&&E.ok?e("system.diagnostics.noFixesNeeded"):e("system.diagnostics.fix.tip"),children:[w==="fix"?f.jsx(jt,{size:11,strokeWidth:3,className:"animate-spin"}):f.jsx(gk,{size:11,strokeWidth:2.5}),e("system.diagnostics.fix")]})]}),C&&T&&f.jsxs("div",{className:"border-t-2 border-dashed border-[var(--color-text)] px-3 py-2",children:[f.jsx("ul",{className:"flex flex-col gap-1 text-xs font-[family-name:var(--font-mono)]",children:E.checks.map((D,B)=>f.jsx($B,{check:D},`${D.name}-${B}`))}),E.fixes.length>0&&f.jsxs("div",{className:"mt-3 bg-[var(--color-running-bg)] border-2 border-[var(--color-running)] rounded p-2",children:[f.jsx("div",{className:"text-xs font-bold text-[var(--color-running)] mb-1",children:e("system.diagnostics.fixed")}),f.jsx("ul",{className:"text-xs list-disc pl-4",children:E.fixes.map((D,B)=>f.jsx("li",{children:D},B))})]})]})]},x.project)})})]})}function $B({check:e}){const t=e.status==="pass"?f.jsx(fm,{size:12,className:"text-[var(--color-running)]",strokeWidth:2.5}):e.status==="fail"?f.jsx(sc,{size:12,className:"text-[var(--color-crashed)]",strokeWidth:2.5}):e.status==="warn"?f.jsx(sc,{size:12,className:"text-[var(--color-stuck)]",strokeWidth:2.5}):f.jsx("span",{className:"w-3 h-3 rounded-full bg-[var(--color-text-subtle)] inline-block"});return f.jsxs("li",{className:"flex items-start gap-2",children:[f.jsx("span",{className:"pt-0.5 shrink-0",children:t}),f.jsx("span",{className:"font-bold w-32 shrink-0",children:e.name}),f.jsx("span",{className:"text-[var(--color-text-muted)] break-words",children:e.message})]})}function HB(e){const t=Math.floor(e/1e3),n=Math.floor(t/3600),a=Math.floor(t%3600/60),s=t%60;return n>0?`${n}h ${a}m ${s}s`:a>0?`${a}m ${s}s`:`${s}s`}function KB(){return It("/api/chat/sessions")}function GB(e){return It(`/api/chat/sessions/${e}`)}async function Qp(e={}){const t=await fetch("/api/chat/sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw new Error(`${t.status}: ${await t.text()}`);return await t.json()}async function QB(e){const t=await fetch(`/api/chat/sessions/${e}`,{method:"DELETE"});if(!t.ok)throw new Error(`${t.status}`)}async function YB(e,t,n){const a=await fetch(`/api/chat/sessions/${e}/messages`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t,attachments:n})});if(!a.ok)throw new Error(`${a.status}: ${await a.text()}`);return await a.json()}async function VB(e){const t=await fetch(`/api/chat/sessions/${e}/interrupt`,{method:"POST"});if(!t.ok&&t.status!==204)throw new Error(`${t.status}: ${await t.text()}`)}function WB(e,t){const n=t?`?since=${encodeURIComponent(t)}`:"";return It(`/api/chat/sessions/${e}/messages${n}`)}function uw(){var ce,de,re,O,R,Q,j,ge,_e;const e=ze(),{sessionId:t}=Qw(),n=_r(),a=En(),{confirm:s,alert:o}=ci(),c=rt({queryKey:["chat-sessions"],queryFn:KB}),d=rt({queryKey:["chat-session",t],queryFn:()=>GB(t??""),enabled:!!t}),[h,p]=A.useState(null),[b,g]=A.useState(""),[v,x]=A.useState(!1),E=A.useRef(null),[w,S]=A.useState(!1),[_,C]=A.useState([]),[T,D]=A.useState(!1),[B,M]=A.useState(!1),[q,F]=A.useState(!1),[ee,P]=A.useState(null);A.useEffect(()=>{if(!t)return;const Y=new EventSource(`/stream/chat/${encodeURIComponent(t)}`);let xe=!0;return Y.addEventListener("open",()=>{if(xe){xe=!1;return}const V=a.getQueryData(["chat-session",t]),ae=V!=null&&V.messages.length?V.messages[V.messages.length-1].ts:void 0;WB(t,ae).then(ye=>{ye.data.length!==0&&a.setQueryData(["chat-session",t],Pe=>{if(!Pe)return Pe;const Ot=new Set(Pe.messages.map(on=>on.id)),St=ye.data.filter(on=>!Ot.has(on.id));return St.length===0?Pe:{...Pe,messages:[...Pe.messages,...St],lastMessageAt:St[St.length-1].ts,messageCount:Pe.messageCount+St.length}})}).catch(()=>{})}),Y.addEventListener("chat.message",V=>{try{const ae=JSON.parse(V.data);a.setQueryData(["chat-session",t],ye=>{if(!ye||ye.messages.some(St=>St.id===ae.message.id))return ye;const Ot=ye.messages.findIndex(St=>St.role==="user"&&St.id.startsWith("optim-")&&St.content===ae.message.content);if(Ot>=0){const St=[...ye.messages];return St[Ot]=ae.message,{...ye,messages:St}}return{...ye,messages:[...ye.messages,ae.message]}})}catch{}}),Y.addEventListener("chat.message.pending",V=>{try{const ae=JSON.parse(V.data);p({id:ae.assistantId,blocks:[],done:!1,finalMessage:null})}catch{}}),Y.addEventListener("chat.message.chunk.text",V=>{try{const ae=JSON.parse(V.data);p(ye=>{if(!ye||ye.id!==ae.assistantId)return ye;const Pe=[...ye.blocks],Ot=Pe[Pe.length-1];return Ot&&Ot.type==="text"?Pe[Pe.length-1]={...Ot,target:Ot.target+ae.text}:Pe.push({type:"text",target:ae.text,displayed:""}),{...ye,blocks:Pe}})}catch{}}),Y.addEventListener("chat.message.chunk.tool_use",V=>{try{const ae=JSON.parse(V.data);p(ye=>!ye||ye.id!==ae.assistantId?ye:{...ye,blocks:[...ye.blocks,{type:"tool_use",id:ae.id,title:ae.title,kind:ae.kind,status:ae.status}]})}catch{}}),Y.addEventListener("chat.message.chunk.tool_update",V=>{try{const ae=JSON.parse(V.data);p(ye=>!ye||ye.id!==ae.assistantId?ye:{...ye,blocks:ye.blocks.map(Pe=>Pe.type==="tool_use"&&Pe.id===ae.id?{...Pe,status:ae.status}:Pe)})}catch{}}),Y.addEventListener("chat.message.complete",V=>{try{const ae=JSON.parse(V.data);p(ye=>ye&&ye.id===ae.assistantId?{...ye,done:!0,finalMessage:ae.message}:ye)}catch{}}),()=>Y.close()},[t,a]),A.useEffect(()=>{if(!h)return;const Y=h.blocks.reduce((V,ae)=>ae.type==="text"?V+(ae.target.length-ae.displayed.length):V,0);if(Y<=0){if(h.done&&h.finalMessage){const V=h.finalMessage;a.setQueryData(["chat-session",t],ae=>!ae||ae.messages.some(ye=>ye.id===V.id)?ae:{...ae,messages:[...ae.messages,V],lastMessageAt:V.ts,messageCount:ae.messageCount+1}),a.invalidateQueries({queryKey:["chat-sessions"]}),p(null),x(!1)}return}const xe=setTimeout(()=>{p(V=>{if(!V)return V;let ae=Math.max(1,Math.ceil(Y/40));const ye=V.blocks.map(Pe=>{if(Pe.type!=="text"||ae<=0)return Pe;const Ot=Pe.target.length-Pe.displayed.length;if(Ot<=0)return Pe;const St=Math.min(Ot,ae);return ae-=St,{...Pe,displayed:Pe.target.slice(0,Pe.displayed.length+St)}});return{...V,blocks:ye}})},25);return()=>clearTimeout(xe)},[h,a,t]),A.useEffect(()=>{const Y=E.current;Y&&(Y.scrollTop=Y.scrollHeight)},[d.data,h]);const X=A.useCallback(async(Y={})=>{var xe,V;try{const ae=await Qp({cwd:((xe=Y.cwd)==null?void 0:xe.trim())||void 0,title:((V=Y.title)==null?void 0:V.trim())||void 0});a.invalidateQueries({queryKey:["chat-sessions"]}),n(`/chat/${ae.id}`),S(!1)}catch(ae){o({title:e("chat.error.create.title"),body:ae instanceof Error?ae.message:String(ae)})}},[a,n,o,e]),J=A.useCallback(async()=>{const Y=b.trim();if(!Y&&_.length===0||v)return;let xe=t;if(!xe){const ye=await Qp();a.invalidateQueries({queryKey:["chat-sessions"]}),xe=ye.id,n(`/chat/${xe}`,{replace:!0})}const V=_.map(ye=>ye.path),ae={id:`optim-${Date.now()}`,role:"user",content:Y||e("chat.placeholder.attachment"),ts:new Date().toISOString(),status:"complete",attachments:V.length>0?V:void 0};a.setQueryData(["chat-session",xe],ye=>ye?{...ye,messages:[...ye.messages,ae],lastMessageAt:ae.ts,messageCount:ye.messageCount+1}:{id:xe,createdAt:ae.ts,lastMessageAt:ae.ts,title:Y.slice(0,60)||e("chat.placeholder.attachmentTitle"),project:null,messageCount:1,messages:[ae]}),g(""),C([]),x(!0);try{await YB(xe,Y||e("chat.placeholder.viewAttachment"),V.length>0?V:void 0)}catch(ye){x(!1),console.error("sendMessage failed",ye),o({title:e("chat.error.send.title"),body:ye instanceof Error?ye.message:String(ye)})}},[b,_,v,t,a,n,o,e]),pe=A.useCallback(async Y=>{if(Y.size>kk){o({title:e("chat.error.fileTooBig.title"),body:e("chat.error.fileTooBig.body",{size:(Y.size/1024/1024).toFixed(2),name:Y.name})});return}let xe=t;if(!xe){const V=await Qp();a.invalidateQueries({queryKey:["chat-sessions"]}),xe=V.id,n(`/chat/${xe}`,{replace:!0})}D(!0);try{const V=await WA(xe,Y);C(ae=>[...ae,{path:V.path,name:V.name}])}catch(V){o({title:e("chat.error.uploadAttachment.title"),body:V instanceof Error?V.message:String(V)})}finally{D(!1)}},[t,a,n,o,e]),ue=A.useCallback(Y=>{C(xe=>xe.filter(V=>V.path!==Y))},[]),te=A.useCallback(async(Y,xe)=>{await s({title:e("chat.delete.confirm.title"),body:e(xe==="cli"?"chat.delete.confirm.body.cli":"chat.delete.confirm.body.console"),confirm:e("chat.delete.confirm.button"),danger:!0})&&(await QB(Y),a.invalidateQueries({queryKey:["chat-sessions"]}),t===Y&&n("/chat"))},[a,t,n,s,e]),$=A.useCallback(async()=>{if(t)try{await VB(t)}catch(Y){o({title:e("chat.error.interrupt.title"),body:Y instanceof Error?Y.message:String(Y)})}},[t,o,e]);return f.jsxs("div",{className:"grid grid-cols-[260px_1fr] gap-4 h-[calc(100vh-140px)]",children:[f.jsxs("aside",{className:"nb-card p-3 overflow-auto flex flex-col gap-2",children:[f.jsxs("button",{className:"nb-btn nb-btn-primary w-full justify-center",onClick:()=>S(!0),type:"button",children:[f.jsx(Bi,{size:14,strokeWidth:3}),e("chat.list.new")]}),f.jsx("div",{className:"mt-2 text-xs font-[family-name:var(--font-heading)] uppercase tracking-wider text-[var(--color-text-muted)] px-2",children:e("chat.list.heading",{count:((ce=c.data)==null?void 0:ce.data.length)??0})}),f.jsxs("div",{className:"flex flex-col gap-1.5 mt-1",children:[(((de=c.data)==null?void 0:de.data)??[]).map(Y=>f.jsxs("div",{className:["group flex items-start gap-2 p-2 rounded-lg border-2 border-transparent",t===Y.id?"bg-[var(--color-accent-mint)] border-[var(--color-text)] shadow-[2px_2px_0_var(--color-text)]":"hover:bg-[var(--color-bg-cream)] hover:border-[var(--color-text)]"].join(" "),children:[f.jsxs("button",{type:"button","aria-label":e("chat.list.openAria",{title:Y.title,cwd:Y.cwd?e("chat.list.cwdSuffix",{cwd:Y.cwd}):""}),onClick:()=>n(`/chat/${Y.id}`),className:"flex items-start gap-2 flex-1 min-w-0 text-left",children:[f.jsx(Yv,{size:14,strokeWidth:2.5,className:"mt-0.5 flex-shrink-0"}),f.jsxs("div",{className:"flex-1 min-w-0",children:[f.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[f.jsx("p",{className:"text-sm font-semibold truncate flex-1",children:Y.title}),Y.source==="cli"&&f.jsx("span",{className:"flex-shrink-0 px-1.5 py-0 rounded-md bg-[var(--color-accent-purple)] border-2 border-[var(--color-text)] text-[9px] font-[family-name:var(--font-mono)] uppercase tracking-wider leading-tight",title:e("chat.cliBadge.tooltip"),children:e("chat.cliBadge")})]}),f.jsx("p",{className:"text-[10px] text-[var(--color-text-muted)] font-[family-name:var(--font-mono)] truncate",children:e("chat.list.msgs",{count:Y.messageCount,time:X1(Y.lastMessageAt??Y.createdAt,e)})}),Y.cwd&&f.jsxs("p",{className:"text-[10px] text-[var(--color-text-subtle)] font-[family-name:var(--font-mono)] truncate flex items-center gap-1",title:Y.cwd,children:[f.jsx(oc,{size:9,strokeWidth:2.5,className:"flex-shrink-0"}),f.jsx("span",{className:"truncate",dir:"rtl",children:Y.cwd})]})]})]}),f.jsx("button",{type:"button","aria-label":Y.source==="cli"?e("chat.list.deleteCli.aria"):e("chat.list.delete.aria"),className:"opacity-0 group-hover:opacity-100 p-1 hover:text-[var(--color-crashed)]",onClick:xe=>{xe.stopPropagation(),te(Y.id,Y.source)},children:f.jsx(zl,{size:12})})]},Y.id)),(((re=c.data)==null?void 0:re.data)??[]).length===0&&f.jsx("p",{className:"text-xs text-[var(--color-text-subtle)] italic text-center py-4",children:e("chat.list.empty")})]})]}),f.jsx("div",{className:"nb-card p-0 flex flex-col overflow-hidden",children:t?f.jsxs(f.Fragment,{children:[f.jsxs("header",{className:"px-4 py-3 border-b-2 border-[var(--color-text)] bg-[var(--color-bg-cream)]",children:[f.jsx("h2",{className:"font-[family-name:var(--font-heading)] font-bold text-lg",children:((O=d.data)==null?void 0:O.title)??e("common.loading")}),f.jsx("p",{className:"text-xs text-[var(--color-text-muted)] font-[family-name:var(--font-mono)]",children:t}),((R=d.data)==null?void 0:R.cwd)&&f.jsxs("p",{className:"text-xs text-[var(--color-text-muted)] font-[family-name:var(--font-mono)] flex items-center gap-1 mt-1",title:d.data.cwd,children:[f.jsx(oc,{size:11,strokeWidth:2.5,className:"flex-shrink-0"}),f.jsx("span",{className:"truncate",children:d.data.cwd})]})]}),f.jsxs("div",{ref:E,className:"flex-1 overflow-auto p-4 flex flex-col gap-4",children:[(((Q=d.data)==null?void 0:Q.messages)??[]).map(Y=>f.jsx(JB,{msg:Y,sessionId:t??null,onPreviewAttachment:xe=>P(xe)},Y.id)),h&&f.jsx(tP,{pending:h}),!d.isLoading&&(((j=d.data)==null?void 0:j.messages)??[]).length===0&&!h&&!v&&f.jsx("p",{className:"text-center text-[var(--color-text-subtle)] italic mt-12",children:e("chat.session.empty")})]}),((ge=d.data)==null?void 0:ge.source)==="cli"?f.jsxs("div",{className:"border-t-2 border-[var(--color-text)] p-4 bg-[var(--color-accent-purple)]",children:[f.jsxs("p",{className:"text-sm font-[family-name:var(--font-mono)] text-[var(--color-text-muted)] text-center",children:[f.jsx("strong",{children:e("chat.cli.banner.bold")})," — ",e("chat.cli.banner")]}),f.jsxs("pre",{className:"mt-2 px-3 py-2 bg-[var(--color-bg)] border-2 border-[var(--color-text)] rounded-md text-xs font-[family-name:var(--font-mono)] overflow-x-auto",children:["sps agent --chat --name ",(t??"").replace(/^session-/,"")]})]}):f.jsxs("div",{className:["border-t-2 border-[var(--color-text)] p-3 bg-[var(--color-bg-cream)] transition-colors",q?"bg-[var(--color-accent-mint)]":""].join(" "),onDragOver:Y=>{Y.dataTransfer.types.includes("Files")&&(Y.preventDefault(),Y.dataTransfer.dropEffect="copy",q||F(!0))},onDragLeave:()=>F(!1),onDrop:Y=>{if(!Y.dataTransfer.types.includes("Files"))return;Y.preventDefault(),F(!1);const xe=Array.from(Y.dataTransfer.files??[]);for(const V of xe)pe(V)},children:[(_.length>0||T)&&f.jsxs("div",{className:"flex flex-wrap gap-2 mb-2",children:[_.map(Y=>f.jsxs("button",{type:"button",className:"flex items-center gap-1.5 px-2 py-1 rounded-md bg-[var(--color-bg)] border-2 border-[var(--color-text)] text-xs font-[family-name:var(--font-mono)] hover:bg-[var(--color-accent-mint)] group",onClick:()=>P(Y.path),title:e("chat.attachment.previewTooltip",{name:Y.name,path:Y.path}),children:[Md(Y.path)?f.jsx(kT,{size:11,strokeWidth:2.5,className:"flex-shrink-0"}):f.jsx(kc,{size:11,strokeWidth:2.5,className:"flex-shrink-0"}),f.jsx("span",{className:"truncate max-w-[180px]",children:Y.name}),f.jsx("span",{role:"button","aria-label":e("chat.input.removeAttachment",{name:Y.name}),className:"ml-1 hover:text-[var(--color-crashed)] cursor-pointer",onClick:xe=>{xe.stopPropagation(),ue(Y.path)},children:f.jsx(_i,{size:11,strokeWidth:3})})]},Y.path)),T&&f.jsxs("span",{className:"flex items-center gap-1.5 px-2 py-1 text-xs text-[var(--color-text-muted)] font-[family-name:var(--font-mono)]",children:[f.jsx(jt,{size:11,strokeWidth:2.5,className:"animate-spin"}),e("chat.input.uploading")]})]}),f.jsxs("div",{className:"flex gap-2 items-end",children:[f.jsx("button",{type:"button",className:"nb-btn flex-shrink-0",onClick:()=>M(!0),disabled:v,"aria-label":e("chat.input.attach.aria"),title:e("chat.input.attach.title"),children:f.jsx(RT,{size:14,strokeWidth:2.5})}),f.jsx("textarea",{className:"nb-input flex-1 resize-none",placeholder:e(q?"chat.input.dragOver":"chat.input.placeholder"),rows:2,value:b,onChange:Y=>g(Y.target.value),onKeyDown:Y=>{Y.key==="Enter"&&!Y.shiftKey&&!Y.nativeEvent.isComposing&&(Y.preventDefault(),J())},onPaste:Y=>{const V=Array.from(Y.clipboardData.items??[]).filter(ae=>ae.kind==="file"&&ae.type.startsWith("image/"));if(V.length!==0){Y.preventDefault();for(const ae of V){const ye=ae.getAsFile();ye&&pe(ye)}}},"aria-label":e("chat.input.aria")}),h?f.jsxs("button",{className:"nb-btn nb-btn-danger",onClick:$,type:"button","aria-label":e("chat.input.interrupt.aria"),children:[f.jsx(fk,{size:14,strokeWidth:3}),e("chat.input.interrupt")]}):f.jsxs("button",{className:"nb-btn nb-btn-primary",onClick:J,disabled:!b.trim()&&_.length===0||v,type:"button","aria-label":e("chat.input.send.aria"),children:[v?f.jsx(jt,{size:14,strokeWidth:3,className:"animate-spin"}):f.jsx(QT,{size:14,strokeWidth:3}),e("chat.input.send")]})]})]})]}):f.jsx("div",{className:"flex-1 flex items-center justify-center p-8",children:f.jsxs("div",{className:"text-center max-w-md",children:[f.jsx("div",{className:"w-20 h-20 rounded-2xl bg-[var(--color-accent-mint)] border-[3px] border-[var(--color-text)] shadow-[3px_3px_0_var(--color-text)] flex items-center justify-center mx-auto mb-4",children:f.jsx(Yv,{size:32,strokeWidth:2.5})}),f.jsx("h1",{className:"font-[family-name:var(--font-heading)] text-2xl font-bold mb-2",children:e("chat.empty.title")}),f.jsx("p",{className:"text-sm text-[var(--color-text-muted)] mb-4",children:e("chat.empty.hint")}),f.jsx("p",{className:"text-xs text-[var(--color-text-subtle)] italic",children:e("chat.empty.shortcuts")})]})})}),w&&f.jsx(ZB,{onCancel:()=>S(!1),onCreate:Y=>X(Y)}),B&&f.jsx(Zm,{mode:"file",title:e("chat.filePicker.title"),initialPath:((_e=d.data)==null?void 0:_e.cwd)??void 0,onCancel:()=>M(!1),onSelect:Y=>{C(xe=>{if(xe.some(ae=>ae.path===Y))return xe;const V=Y.split(/[\\/]/).pop()||Y;return[...xe,{path:Y,name:V}]}),M(!1)}}),ee&&t&&f.jsx(XB,{sessionId:t,path:ee,onClose:()=>P(null)})]})}function Md(e){return/\.(png|jpe?g|gif|webp|svg|avif)$/i.test(e)}function dw(e){return/\.pdf$/i.test(e)}function Yp(e){return/\.(txt|md|log|json|yaml|yml|csv|html|xml|tsx?|jsx?|css|sh|ya?ml|conf|toml|ini|env|gitignore|sql|py|rb|go|rs|java|kt|swift|c|cc|cpp|h|hpp)$/i.test(e)}function XB({sessionId:e,path:t,onClose:n}){const a=ze(),[s,o]=A.useState(null),[c,d]=A.useState(null);A.useEffect(()=>{const b=g=>{g.key==="Escape"&&(g.preventDefault(),n())};return window.addEventListener("keydown",b),()=>window.removeEventListener("keydown",b)},[n]),A.useEffect(()=>{if(!Yp(t))return;let b=!1;return fetch(pm(e,t)).then(async g=>{if(!g.ok)throw new Error(`${g.status}`);return g.text()}).then(g=>{b||o(g.length>2e5?g.slice(0,2e5)+`
566
566
 
567
- …(truncated)`:g)}).catch(g=>{b||d(g instanceof Error?g.message:String(g))}),()=>{b=!0}},[e,t]);const h=pm(e,t),p=t.split(/[\\/]/).pop()??t;return f.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-[rgba(45,55,72,0.6)] p-4",role:"presentation",children:f.jsxs("div",{className:"nb-card bg-[var(--color-bg)] max-w-3xl w-full p-5 flex flex-col",style:{maxHeight:"85vh"},role:"dialog","aria-modal":"true","aria-label":a("chat.attachment.preview.aria",{name:p}),children:[f.jsxs("header",{className:"flex items-center justify-between mb-3 shrink-0",children:[f.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[f.jsx(nT,{size:16,strokeWidth:2.5,className:"flex-shrink-0"}),f.jsx("h3",{className:"font-[family-name:var(--font-heading)] font-bold text-base truncate",children:p})]}),f.jsx("button",{type:"button",className:"p-1 hover:bg-[var(--color-bg-cream)] rounded flex-shrink-0",onClick:n,"aria-label":a("chat.attachment.close.aria"),children:f.jsx(_i,{size:16,strokeWidth:3})})]}),f.jsx("p",{className:"text-[10px] text-[var(--color-text-muted)] font-[family-name:var(--font-mono)] truncate mb-2 shrink-0",title:t,dir:"rtl",children:t}),f.jsxs("div",{className:"flex-1 overflow-auto border-2 border-[var(--color-text)] rounded-lg bg-[var(--color-bg-cream)] min-h-0",children:[Md(t)&&f.jsx("div",{className:"flex items-center justify-center p-4",children:f.jsx("img",{src:h,alt:`Preview: ${p}`,className:"max-w-full max-h-[60vh] object-contain"})}),dw(t)&&f.jsx("iframe",{src:h,title:`PDF: ${p}`,className:"w-full",style:{height:"60vh",border:0}}),Yp(t)&&f.jsx("pre",{className:"p-3 text-xs font-[family-name:var(--font-mono)] whitespace-pre-wrap break-words",children:c?f.jsx("span",{className:"text-[var(--color-crashed)]",children:a("chat.attachment.readErr",{detail:c})}):s===null?f.jsx("span",{className:"text-[var(--color-text-muted)]",children:a("chat.attachment.loading")}):s}),!Md(t)&&!dw(t)&&!Yp(t)&&f.jsxs("div",{className:"p-6 text-center text-sm text-[var(--color-text-muted)]",children:[f.jsx("p",{className:"mb-3",children:a("chat.attachment.unsupported")}),f.jsx("a",{href:h,download:p,className:"nb-btn nb-btn-primary inline-flex",children:a("chat.attachment.download")})]})]})]})})}function ZB({onCancel:e,onCreate:t}){const n=ze(),[a,s]=A.useState(""),[o,c]=A.useState(""),[d,h]=A.useState(!1),[p,b]=A.useState(!1);A.useEffect(()=>{if(p)return;const v=x=>{x.key==="Escape"&&(x.preventDefault(),e())};return window.addEventListener("keydown",v),()=>window.removeEventListener("keydown",v)},[e,p]);const g=async()=>{if(!d){h(!0);try{t({title:a.trim()||void 0,cwd:o.trim()||void 0})}finally{h(!1)}}};return f.jsxs("div",{className:"fixed inset-0 z-40 flex items-center justify-center bg-[rgba(45,55,72,0.4)] p-4",role:"presentation",children:[f.jsxs("div",{className:"nb-card bg-[var(--color-bg)] max-w-md w-full p-5",role:"dialog","aria-modal":"true","aria-label":n("chat.newSession.title.aria"),children:[f.jsxs("header",{className:"flex items-center justify-between mb-4",children:[f.jsx("h2",{className:"font-[family-name:var(--font-heading)] font-bold text-lg",children:n("chat.newSession.title")}),f.jsx("button",{type:"button",className:"p-1 hover:bg-[var(--color-bg-cream)] rounded",onClick:e,"aria-label":n("chat.newSession.close.aria"),children:f.jsx(_i,{size:16,strokeWidth:3})})]}),f.jsxs("div",{className:"flex flex-col gap-4",children:[f.jsxs("div",{children:[f.jsx("label",{htmlFor:"new-session-title",className:"block text-xs font-bold mb-1.5 uppercase tracking-wider",children:n("chat.newSession.field.title")}),f.jsx("input",{id:"new-session-title",type:"text",className:"nb-input w-full",placeholder:n("chat.newSession.field.title.placeholder"),value:a,onChange:v=>s(v.target.value),autoFocus:!0})]}),f.jsxs("div",{children:[f.jsx("label",{htmlFor:"new-session-cwd",className:"block text-xs font-bold mb-1.5 uppercase tracking-wider",children:n("chat.newSession.field.cwd")}),f.jsxs("div",{className:"flex gap-2",children:[f.jsx("input",{id:"new-session-cwd",type:"text",className:"nb-input flex-1 font-[family-name:var(--font-mono)] text-sm",placeholder:"/home/coral/projects/my-app",value:o,onChange:v=>c(v.target.value)}),f.jsxs("button",{type:"button",className:"nb-btn flex-shrink-0",onClick:()=>b(!0),"aria-label":n("chat.newSession.field.cwd.browseAria"),title:n("chat.newSession.field.cwd.browseAria"),children:[f.jsx(lk,{size:14,strokeWidth:2.5}),n("chat.newSession.field.cwd.browse")]})]}),f.jsxs("p",{className:"text-[11px] text-[var(--color-text-muted)] mt-1.5 leading-relaxed",children:[f.jsx(oc,{size:10,strokeWidth:2.5,className:"inline mr-1 -mt-0.5"}),n("chat.newSession.field.cwd.help1")," ",n("chat.newSession.field.cwd.help2")]})]}),f.jsxs("div",{className:"flex gap-2 justify-end pt-2",children:[f.jsx("button",{type:"button",className:"nb-btn",onClick:e,children:n("chat.newSession.cancel")}),f.jsxs("button",{type:"button",className:"nb-btn nb-btn-primary",onClick:g,disabled:d,children:[d?f.jsx(jt,{size:14,strokeWidth:3,className:"animate-spin"}):f.jsx(Bi,{size:14,strokeWidth:3}),n("chat.newSession.create")]})]})]})]}),p&&f.jsx(Zm,{initialPath:o.trim()||void 0,onCancel:()=>b(!1),onSelect:v=>{c(v),b(!1)}})]})}function JB({msg:e,sessionId:t,onPreviewAttachment:n}){const a=ze(),s=e.role==="user",o=e.role==="error",c=e.blocks&&e.blocks.length>0?e.blocks:[{type:"text",text:e.content}],d=e.attachments??[];return f.jsx("div",{className:s?"self-end max-w-3xl":"self-start max-w-3xl",children:f.jsxs("div",{className:["nb-card",s?"bg-[var(--color-secondary)]":o?"bg-[var(--color-crashed-bg)]":"bg-[var(--color-bg)]"].join(" "),children:[f.jsxs("p",{className:"text-xs font-bold uppercase tracking-wider text-[var(--color-text-muted)] mb-2 flex items-center gap-2",children:[a(s?"chat.message.role.you":o?"chat.message.role.error":"chat.message.role.assistant"),f.jsx("span",{className:"font-normal",children:"·"}),f.jsx("span",{className:"font-normal cursor-help",title:iP(e.ts),children:X1(e.ts,a)})]}),f.jsx("div",{className:"flex flex-col gap-2",children:c.map((h,p)=>f.jsx(nP,{block:h},p))}),d.length>0&&t&&f.jsx("div",{className:"mt-3 pt-3 border-t-2 border-dashed border-[var(--color-text)]/30 flex flex-wrap gap-2",children:d.map(h=>f.jsx(eP,{sessionId:t,path:h,onPreview:()=>n(h)},h))}),e.truncated&&f.jsx("p",{className:"mt-3 px-3 py-2 bg-[var(--color-stuck-bg)] border-2 border-[var(--color-stuck)] rounded-lg text-xs text-[var(--color-stuck)] font-bold",children:a("chat.message.truncated")})]})})}function eP({sessionId:e,path:t,onPreview:n}){const a=ze(),s=t.split(/[\\/]/).pop()??t;return Md(t)?f.jsx("button",{type:"button",onClick:n,className:"block rounded-md overflow-hidden border-2 border-[var(--color-text)] hover:shadow-[2px_2px_0_var(--color-text)] transition-shadow",title:a("chat.attachment.previewSimpleTooltip",{name:s}),children:f.jsx("img",{src:pm(e,t),alt:s,className:"block max-h-40 max-w-[12rem] object-cover",loading:"lazy"})}):f.jsxs("button",{type:"button",onClick:n,className:"flex items-center gap-1.5 px-2 py-1 rounded-md bg-[var(--color-bg)] border-2 border-[var(--color-text)] text-xs font-[family-name:var(--font-mono)] hover:bg-[var(--color-accent-mint)]",title:a("chat.attachment.previewTooltip",{name:s,path:t}),children:[f.jsx(kc,{size:11,strokeWidth:2.5,className:"flex-shrink-0"}),f.jsx("span",{className:"truncate max-w-[200px]",children:s})]})}function tP({pending:e}){const t=(()=>{for(let n=e.blocks.length-1;n>=0;n--)if(e.blocks[n].type==="text")return n;return-1})();return f.jsx("div",{className:"self-start max-w-3xl",children:f.jsxs("div",{className:"nb-card bg-[var(--color-bg)]",children:[f.jsxs("p",{className:"text-xs font-bold uppercase tracking-wider text-[var(--color-text-muted)] mb-2 flex items-center gap-2",children:["assistant",f.jsx("span",{className:"font-normal",children:"·"}),f.jsxs("span",{className:"flex items-center gap-1 font-normal text-[var(--color-running)]",children:[f.jsx(jt,{size:10,strokeWidth:3,className:"animate-spin"}),"streaming"]})]}),f.jsxs("div",{className:"flex flex-col gap-2",children:[e.blocks.length===0&&f.jsx("p",{className:"text-sm text-[var(--color-text-muted)] italic",children:"…"}),e.blocks.map((n,a)=>{if(n.type==="text"){const s=a===t;return f.jsxs("div",{className:"relative",children:[f.jsx(V1,{text:n.displayed}),s&&f.jsx("span",{className:"inline-block w-2 h-4 ml-1 bg-[var(--color-text)] animate-pulse align-middle"})]},a)}return f.jsx(W1,{tool:n},a)})]})]})})}function nP({block:e}){return e.type==="text"?f.jsx(V1,{text:e.text}):f.jsx(W1,{tool:e})}function V1({text:e}){return e?f.jsx("div",{className:"text-sm font-[family-name:var(--font-body)] break-words prose-chat",children:f.jsx(Dg,{remarkPlugins:[Ig],rehypePlugins:[Pg],children:e})}):null}function W1({tool:e}){const[t,n]=A.useState(!1),a=e.status==="completed",s=e.status==="failed",o=!a&&!s;return f.jsxs("div",{className:"border-2 border-[var(--color-text)] rounded-lg overflow-hidden bg-[var(--color-bg-cream)]",children:[f.jsxs("button",{type:"button",onClick:()=>n(c=>!c),className:"w-full flex items-center gap-2 px-3 py-2 text-xs font-[family-name:var(--font-mono)] hover:bg-[var(--color-accent-yellow)] transition-colors",children:[f.jsx(Bd,{size:12,strokeWidth:3,className:["transition-transform",t?"rotate-90":""].join(" ")}),f.jsx(gk,{size:12,strokeWidth:2.5}),f.jsx("span",{className:"font-bold",children:e.kind}),f.jsx("span",{className:"flex-1 text-left text-[var(--color-text-muted)] truncate",children:e.title}),o&&f.jsx(jt,{size:12,strokeWidth:3,className:"animate-spin text-[var(--color-running)]"}),a&&f.jsx(lc,{size:12,strokeWidth:2.5,className:"text-[var(--color-running)]"}),s&&f.jsx(ak,{size:12,strokeWidth:2.5,className:"text-[var(--color-crashed)]"})]}),t&&f.jsxs("div",{className:"px-3 py-2 text-xs font-[family-name:var(--font-mono)] text-[var(--color-text-muted)] border-t-2 border-[var(--color-text)]",children:[f.jsxs("div",{children:["id: ",f.jsx("span",{className:"text-[var(--color-text)]",children:e.id})]}),f.jsxs("div",{children:["status: ",f.jsx("span",{className:"text-[var(--color-text)]",children:e.status})]})]})]})}function X1(e,t){if(!e)return"";const n=new Date(e),a=Date.now()-n.getTime();return a<6e4?t("kanban.time.justNow"):a<36e5?t("kanban.time.minutes",{n:Math.floor(a/6e4)}):a<864e5?t("kanban.time.hours",{n:Math.floor(a/36e5)}):n.toLocaleDateString()}function iP(e){if(!e)return;const t=new Date(e),n=a=>String(a).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function aP(){return It("/api/processes").then(e=>e.data)}function rP(e){return vA(`/api/processes/${e}/kill`)}const sP="border-[3px] border-[var(--color-text)] rounded-2xl bg-white shadow-[4px_4px_0_var(--color-text)]";function lP({p:e}){const t=e.alive?e.sessionState??"alive":"offline",n=e.alive?"bg-[var(--color-accent-mint)]":"bg-[var(--color-bg-cream)] text-[var(--color-text)]/60";return f.jsxs("span",{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded-lg border-2 border-[var(--color-text)] text-xs font-bold font-[family-name:var(--font-mono)] ${n}`,children:[f.jsx("span",{className:`w-2 h-2 rounded-full ${e.alive?"bg-green-600":"bg-gray-400"}`}),t]})}function oP(){const e=ze(),t=En(),[n,a]=A.useState(null),s=rt({queryKey:["processes"],queryFn:aP,refetchInterval:5e3}),o=Mn({mutationFn:rP,onSuccess:h=>{a(h.message),t.invalidateQueries({queryKey:["processes"]})},onError:h=>a(h instanceof Error?h.message:String(h))}),c=s.data??[],d=c.filter(h=>h.alive).length;return f.jsxs("div",{className:"p-6 max-w-[1100px] mx-auto",children:[f.jsxs("div",{className:"flex items-center gap-3 mb-1",children:[f.jsx(rk,{size:22,strokeWidth:2.5}),f.jsx("h1",{className:"font-[family-name:var(--font-heading)] font-bold text-2xl",children:e("processes.title")}),f.jsxs("button",{type:"button","aria-label":e("processes.refresh"),onClick:()=>t.invalidateQueries({queryKey:["processes"]}),className:"ml-auto inline-flex items-center gap-1.5 px-3 py-1.5 rounded-xl border-2 border-[var(--color-text)] bg-white text-sm font-semibold shadow-[2px_2px_0_var(--color-text)] hover:-translate-x-px hover:-translate-y-px focus-visible:outline focus-visible:outline-2",children:[s.isFetching?f.jsx(jt,{size:15,className:"animate-spin"}):f.jsx(Er,{size:15}),e("processes.refresh")]})]}),f.jsxs("p",{className:"text-sm text-[var(--color-text)]/70 mb-4",children:[e("processes.subtitle")," · ",e("processes.aliveCount").replace("{n}",String(d)).replace("{total}",String(c.length))]}),n&&f.jsx("div",{className:"mb-3 px-3 py-2 rounded-xl border-2 border-[var(--color-text)] bg-[var(--color-bg-cream)] text-sm font-mono",children:n}),f.jsx("div",{className:`${sP} overflow-hidden`,children:f.jsxs("table",{className:"w-full text-sm",children:[f.jsx("thead",{className:"bg-[var(--color-bg-cream)] font-[family-name:var(--font-heading)]",children:f.jsxs("tr",{className:"text-left",children:[f.jsx("th",{className:"px-3 py-2",children:e("processes.col.slot")}),f.jsx("th",{className:"px-3 py-2",children:e("processes.col.project")}),f.jsx("th",{className:"px-3 py-2",children:"PID"}),f.jsx("th",{className:"px-3 py-2",children:e("processes.col.state")}),f.jsx("th",{className:"px-3 py-2",children:e("processes.col.memory")}),f.jsx("th",{className:"px-3 py-2",children:e("processes.col.action")})]})}),f.jsxs("tbody",{className:"font-[family-name:var(--font-mono)]",children:[c.length===0&&f.jsx("tr",{children:f.jsx("td",{colSpan:6,className:"px-3 py-6 text-center text-[var(--color-text)]/50",children:e("processes.empty")})}),c.map(h=>f.jsxs("tr",{className:"border-t-2 border-[var(--color-text)]/10",title:h.cwd??"",children:[f.jsx("td",{className:"px-3 py-2 max-w-[260px] truncate",children:h.slot}),f.jsx("td",{className:"px-3 py-2",children:h.project??"—"}),f.jsx("td",{className:"px-3 py-2",children:h.pid??"—"}),f.jsx("td",{className:"px-3 py-2",children:f.jsx(lP,{p:h})}),f.jsx("td",{className:"px-3 py-2",children:h.memoryMB!=null?`${h.memoryMB} MB`:"—"}),f.jsx("td",{className:"px-3 py-2",children:h.alive&&h.pid!=null?f.jsxs("button",{type:"button","aria-label":`${e("processes.kill")} ${h.slot}`,onClick:()=>{confirm(e("processes.killConfirm").replace("{slot}",h.slot))&&o.mutate(h.pid)},className:"inline-flex items-center gap-1 px-2.5 py-1 rounded-lg border-2 border-[var(--color-text)] bg-[var(--color-accent-peach)] text-xs font-bold shadow-[2px_2px_0_var(--color-text)] hover:-translate-x-px hover:-translate-y-px active:translate-x-0.5 active:translate-y-0.5 focus-visible:outline focus-visible:outline-2",children:[f.jsx(ak,{size:13})," ",e("processes.kill")]}):f.jsx("span",{className:"text-[var(--color-text)]/40 text-xs",children:"—"})})]},h.slot))]})]})})]})}function cP(e={}){const t=new URLSearchParams;e.project&&t.set("project",e.project),e.action&&t.set("action",e.action);const n=t.toString();return It(`/api/audit${n?`?${n}`:""}`).then(a=>a.data)}const uP="border-[3px] border-[var(--color-text)] rounded-2xl bg-white shadow-[4px_4px_0_var(--color-text)]",dP={create:"bg-[var(--color-accent-mint)]",modify:"bg-[var(--color-accent-yellow)]",delete:"bg-[var(--color-accent-peach)]"};function fP(){const e=ze(),t=En(),[n,a]=A.useState(""),s=rt({queryKey:["audit",n],queryFn:()=>cP(n?{action:n}:{}),refetchInterval:8e3}),o=s.data??[],c=d=>e(`audit.action.${d}`);return f.jsxs("div",{className:"p-6 max-w-[1000px] mx-auto",children:[f.jsxs("div",{className:"flex items-center gap-3 mb-1",children:[f.jsx(uk,{size:22,strokeWidth:2.5}),f.jsx("h1",{className:"font-[family-name:var(--font-heading)] font-bold text-2xl",children:e("audit.title")}),f.jsxs("button",{type:"button","aria-label":e("audit.refresh"),onClick:()=>t.invalidateQueries({queryKey:["audit"]}),className:"ml-auto inline-flex items-center gap-1.5 px-3 py-1.5 rounded-xl border-2 border-[var(--color-text)] bg-white text-sm font-semibold shadow-[2px_2px_0_var(--color-text)] hover:-translate-x-px hover:-translate-y-px focus-visible:outline focus-visible:outline-2",children:[s.isFetching?f.jsx(jt,{size:15,className:"animate-spin"}):f.jsx(Er,{size:15}),e("audit.refresh")]})]}),f.jsx("p",{className:"text-sm text-[var(--color-text)]/70 mb-4",children:e("audit.subtitle")}),f.jsx("div",{className:"flex gap-2 mb-3",children:["","create","modify","delete"].map(d=>f.jsx("button",{type:"button","aria-label":d?c(d):e("audit.filter.all"),onClick:()=>a(d),className:`px-3 py-1 rounded-lg border-2 border-[var(--color-text)] text-sm font-bold shadow-[2px_2px_0_var(--color-text)] focus-visible:outline focus-visible:outline-2 ${n===d?"bg-[var(--color-accent-blue)]":"bg-white hover:-translate-x-px hover:-translate-y-px"}`,children:d?c(d):e("audit.filter.all")},d||"all"))}),f.jsx("div",{className:`${uP} overflow-hidden`,children:f.jsxs("table",{className:"w-full text-sm",children:[f.jsx("thead",{className:"bg-[var(--color-bg-cream)] font-[family-name:var(--font-heading)]",children:f.jsxs("tr",{className:"text-left",children:[f.jsx("th",{className:"px-3 py-2",children:e("audit.col.time")}),f.jsx("th",{className:"px-3 py-2",children:e("audit.col.action")}),f.jsx("th",{className:"px-3 py-2",children:e("audit.col.project")}),f.jsx("th",{className:"px-3 py-2",children:e("audit.col.detail")})]})}),f.jsxs("tbody",{className:"font-[family-name:var(--font-mono)]",children:[o.length===0&&f.jsx("tr",{children:f.jsx("td",{colSpan:4,className:"px-3 py-6 text-center text-[var(--color-text)]/50",children:e("audit.empty")})}),o.map((d,h)=>f.jsxs("tr",{className:"border-t-2 border-[var(--color-text)]/10",children:[f.jsx("td",{className:"px-3 py-2 whitespace-nowrap",children:new Date(d.ts).toLocaleString()}),f.jsx("td",{className:"px-3 py-2",children:f.jsx("span",{className:`inline-block px-2 py-0.5 rounded-lg border-2 border-[var(--color-text)] text-xs font-bold ${dP[d.action]}`,children:c(d.action)})}),f.jsx("td",{className:"px-3 py-2",children:d.project}),f.jsx("td",{className:"px-3 py-2 text-[var(--color-text)]/70",children:d.detail??(d.source?`(${d.source})`:"—")})]},`${d.ts}-${h}`))]})]})})]})}function hP(){const e=ze();return f.jsxs("div",{className:"nb-card max-w-2xl mt-12",children:[f.jsx("h1",{className:"font-[family-name:var(--font-heading)] text-4xl font-bold mb-2",children:e("notFound.title")}),f.jsx("p",{className:"text-[var(--color-text-muted)] mb-6",children:e("notFound.body")}),f.jsx(ps,{to:"/",className:"nb-btn nb-btn-mint inline-flex",children:e("notFound.home")})]})}function pP(){return f.jsx($A,{children:f.jsx(WC,{children:f.jsxs(xn,{element:f.jsx(FA,{}),children:[f.jsx(xn,{index:!0,element:f.jsx(QC,{to:"/projects",replace:!0})}),f.jsx(xn,{path:"/projects",element:f.jsx(HA,{})}),f.jsx(xn,{path:"/projects/new",element:f.jsx(tj,{})}),f.jsx(xn,{path:"/projects/:name",element:f.jsx(pO,{})}),f.jsx(xn,{path:"/board",element:f.jsx(eD,{})}),f.jsx(xn,{path:"/workers",element:f.jsx(mD,{})}),f.jsx(xn,{path:"/logs",element:f.jsx(vD,{})}),f.jsx(xn,{path:"/skills",element:f.jsx(zB,{})}),f.jsx(xn,{path:"/system",element:f.jsx(PB,{})}),f.jsx(xn,{path:"/processes",element:f.jsx(oP,{})}),f.jsx(xn,{path:"/audit",element:f.jsx(fP,{})}),f.jsx(xn,{path:"/chat",element:f.jsx(uw,{})}),f.jsx(xn,{path:"/chat/:sessionId",element:f.jsx(uw,{})}),f.jsx(xn,{path:"*",element:f.jsx(hP,{})})]})})})}qA();const mP=new zN({defaultOptions:{queries:{staleTime:3e4,refetchOnWindowFocus:!1}}}),Z1=document.getElementById("root");if(!Z1)throw new Error("#root not found");fN.createRoot(Z1).render(f.jsx(A.StrictMode,{children:f.jsx(gA,{children:f.jsx(BN,{client:mP,children:f.jsx(w2,{children:f.jsx(ZA,{children:f.jsx(pP,{})})})})})}));
567
+ …(truncated)`:g)}).catch(g=>{b||d(g instanceof Error?g.message:String(g))}),()=>{b=!0}},[e,t]);const h=pm(e,t),p=t.split(/[\\/]/).pop()??t;return f.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-[rgba(45,55,72,0.6)] p-4",role:"presentation",children:f.jsxs("div",{className:"nb-card bg-[var(--color-bg)] max-w-3xl w-full p-5 flex flex-col",style:{maxHeight:"85vh"},role:"dialog","aria-modal":"true","aria-label":a("chat.attachment.preview.aria",{name:p}),children:[f.jsxs("header",{className:"flex items-center justify-between mb-3 shrink-0",children:[f.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[f.jsx(nT,{size:16,strokeWidth:2.5,className:"flex-shrink-0"}),f.jsx("h3",{className:"font-[family-name:var(--font-heading)] font-bold text-base truncate",children:p})]}),f.jsx("button",{type:"button",className:"p-1 hover:bg-[var(--color-bg-cream)] rounded flex-shrink-0",onClick:n,"aria-label":a("chat.attachment.close.aria"),children:f.jsx(_i,{size:16,strokeWidth:3})})]}),f.jsx("p",{className:"text-[10px] text-[var(--color-text-muted)] font-[family-name:var(--font-mono)] truncate mb-2 shrink-0",title:t,dir:"rtl",children:t}),f.jsxs("div",{className:"flex-1 overflow-auto border-2 border-[var(--color-text)] rounded-lg bg-[var(--color-bg-cream)] min-h-0",children:[Md(t)&&f.jsx("div",{className:"flex items-center justify-center p-4",children:f.jsx("img",{src:h,alt:`Preview: ${p}`,className:"max-w-full max-h-[60vh] object-contain"})}),dw(t)&&f.jsx("iframe",{src:h,title:`PDF: ${p}`,className:"w-full",style:{height:"60vh",border:0}}),Yp(t)&&f.jsx("pre",{className:"p-3 text-xs font-[family-name:var(--font-mono)] whitespace-pre-wrap break-words",children:c?f.jsx("span",{className:"text-[var(--color-crashed)]",children:a("chat.attachment.readErr",{detail:c})}):s===null?f.jsx("span",{className:"text-[var(--color-text-muted)]",children:a("chat.attachment.loading")}):s}),!Md(t)&&!dw(t)&&!Yp(t)&&f.jsxs("div",{className:"p-6 text-center text-sm text-[var(--color-text-muted)]",children:[f.jsx("p",{className:"mb-3",children:a("chat.attachment.unsupported")}),f.jsx("a",{href:h,download:p,className:"nb-btn nb-btn-primary inline-flex",children:a("chat.attachment.download")})]})]})]})})}function ZB({onCancel:e,onCreate:t}){const n=ze(),[a,s]=A.useState(""),[o,c]=A.useState(""),[d,h]=A.useState(!1),[p,b]=A.useState(!1);A.useEffect(()=>{if(p)return;const v=x=>{x.key==="Escape"&&(x.preventDefault(),e())};return window.addEventListener("keydown",v),()=>window.removeEventListener("keydown",v)},[e,p]);const g=async()=>{if(!d){h(!0);try{t({title:a.trim()||void 0,cwd:o.trim()||void 0})}finally{h(!1)}}};return f.jsxs("div",{className:"fixed inset-0 z-40 flex items-center justify-center bg-[rgba(45,55,72,0.4)] p-4",role:"presentation",children:[f.jsxs("div",{className:"nb-card bg-[var(--color-bg)] max-w-md w-full p-5",role:"dialog","aria-modal":"true","aria-label":n("chat.newSession.title.aria"),children:[f.jsxs("header",{className:"flex items-center justify-between mb-4",children:[f.jsx("h2",{className:"font-[family-name:var(--font-heading)] font-bold text-lg",children:n("chat.newSession.title")}),f.jsx("button",{type:"button",className:"p-1 hover:bg-[var(--color-bg-cream)] rounded",onClick:e,"aria-label":n("chat.newSession.close.aria"),children:f.jsx(_i,{size:16,strokeWidth:3})})]}),f.jsxs("div",{className:"flex flex-col gap-4",children:[f.jsxs("div",{children:[f.jsx("label",{htmlFor:"new-session-title",className:"block text-xs font-bold mb-1.5 uppercase tracking-wider",children:n("chat.newSession.field.title")}),f.jsx("input",{id:"new-session-title",type:"text",className:"nb-input w-full",placeholder:n("chat.newSession.field.title.placeholder"),value:a,onChange:v=>s(v.target.value),autoFocus:!0})]}),f.jsxs("div",{children:[f.jsx("label",{htmlFor:"new-session-cwd",className:"block text-xs font-bold mb-1.5 uppercase tracking-wider",children:n("chat.newSession.field.cwd")}),f.jsxs("div",{className:"flex gap-2",children:[f.jsx("input",{id:"new-session-cwd",type:"text",className:"nb-input flex-1 font-[family-name:var(--font-mono)] text-sm",placeholder:"/home/coral/projects/my-app",value:o,onChange:v=>c(v.target.value)}),f.jsxs("button",{type:"button",className:"nb-btn flex-shrink-0",onClick:()=>b(!0),"aria-label":n("chat.newSession.field.cwd.browseAria"),title:n("chat.newSession.field.cwd.browseAria"),children:[f.jsx(lk,{size:14,strokeWidth:2.5}),n("chat.newSession.field.cwd.browse")]})]}),f.jsxs("p",{className:"text-[11px] text-[var(--color-text-muted)] mt-1.5 leading-relaxed",children:[f.jsx(oc,{size:10,strokeWidth:2.5,className:"inline mr-1 -mt-0.5"}),n("chat.newSession.field.cwd.help1")," ",n("chat.newSession.field.cwd.help2")]})]}),f.jsxs("div",{className:"flex gap-2 justify-end pt-2",children:[f.jsx("button",{type:"button",className:"nb-btn",onClick:e,children:n("chat.newSession.cancel")}),f.jsxs("button",{type:"button",className:"nb-btn nb-btn-primary",onClick:g,disabled:d,children:[d?f.jsx(jt,{size:14,strokeWidth:3,className:"animate-spin"}):f.jsx(Bi,{size:14,strokeWidth:3}),n("chat.newSession.create")]})]})]})]}),p&&f.jsx(Zm,{initialPath:o.trim()||void 0,onCancel:()=>b(!1),onSelect:v=>{c(v),b(!1)}})]})}function JB({msg:e,sessionId:t,onPreviewAttachment:n}){const a=ze(),s=e.role==="user",o=e.role==="error",c=e.blocks&&e.blocks.length>0?e.blocks:[{type:"text",text:e.content}],d=e.attachments??[];return f.jsx("div",{className:s?"self-end max-w-3xl":"self-start max-w-3xl",children:f.jsxs("div",{className:["nb-card",s?"bg-[var(--color-secondary)]":o?"bg-[var(--color-crashed-bg)]":"bg-[var(--color-bg)]"].join(" "),children:[f.jsxs("p",{className:"text-xs font-bold uppercase tracking-wider text-[var(--color-text-muted)] mb-2 flex items-center gap-2",children:[a(s?"chat.message.role.you":o?"chat.message.role.error":"chat.message.role.assistant"),f.jsx("span",{className:"font-normal",children:"·"}),f.jsx("span",{className:"font-normal cursor-help",title:iP(e.ts),children:X1(e.ts,a)})]}),f.jsx("div",{className:"flex flex-col gap-2",children:c.map((h,p)=>f.jsx(nP,{block:h},p))}),d.length>0&&t&&f.jsx("div",{className:"mt-3 pt-3 border-t-2 border-dashed border-[var(--color-text)]/30 flex flex-wrap gap-2",children:d.map(h=>f.jsx(eP,{sessionId:t,path:h,onPreview:()=>n(h)},h))}),e.truncated&&f.jsx("p",{className:"mt-3 px-3 py-2 bg-[var(--color-stuck-bg)] border-2 border-[var(--color-stuck)] rounded-lg text-xs text-[var(--color-stuck)] font-bold",children:a("chat.message.truncated")})]})})}function eP({sessionId:e,path:t,onPreview:n}){const a=ze(),s=t.split(/[\\/]/).pop()??t;return Md(t)?f.jsx("button",{type:"button",onClick:n,className:"block rounded-md overflow-hidden border-2 border-[var(--color-text)] hover:shadow-[2px_2px_0_var(--color-text)] transition-shadow",title:a("chat.attachment.previewSimpleTooltip",{name:s}),children:f.jsx("img",{src:pm(e,t),alt:s,className:"block max-h-40 max-w-[12rem] object-cover",loading:"lazy"})}):f.jsxs("button",{type:"button",onClick:n,className:"flex items-center gap-1.5 px-2 py-1 rounded-md bg-[var(--color-bg)] border-2 border-[var(--color-text)] text-xs font-[family-name:var(--font-mono)] hover:bg-[var(--color-accent-mint)]",title:a("chat.attachment.previewTooltip",{name:s,path:t}),children:[f.jsx(kc,{size:11,strokeWidth:2.5,className:"flex-shrink-0"}),f.jsx("span",{className:"truncate max-w-[200px]",children:s})]})}function tP({pending:e}){const t=(()=>{for(let n=e.blocks.length-1;n>=0;n--)if(e.blocks[n].type==="text")return n;return-1})();return f.jsx("div",{className:"self-start max-w-3xl",children:f.jsxs("div",{className:"nb-card bg-[var(--color-bg)]",children:[f.jsxs("p",{className:"text-xs font-bold uppercase tracking-wider text-[var(--color-text-muted)] mb-2 flex items-center gap-2",children:["assistant",f.jsx("span",{className:"font-normal",children:"·"}),f.jsxs("span",{className:"flex items-center gap-1 font-normal text-[var(--color-running)]",children:[f.jsx(jt,{size:10,strokeWidth:3,className:"animate-spin"}),"streaming"]})]}),f.jsxs("div",{className:"flex flex-col gap-2",children:[e.blocks.length===0&&f.jsx("p",{className:"text-sm text-[var(--color-text-muted)] italic",children:"…"}),e.blocks.map((n,a)=>{if(n.type==="text"){const s=a===t;return f.jsxs("div",{className:"relative",children:[f.jsx(V1,{text:n.displayed}),s&&f.jsx("span",{className:"inline-block w-2 h-4 ml-1 bg-[var(--color-text)] animate-pulse align-middle"})]},a)}return f.jsx(W1,{tool:n},a)})]})]})})}function nP({block:e}){return e.type==="text"?f.jsx(V1,{text:e.text}):f.jsx(W1,{tool:e})}function V1({text:e}){return e?f.jsx("div",{className:"text-sm font-[family-name:var(--font-body)] break-words prose-chat",children:f.jsx(Dg,{remarkPlugins:[Ig],rehypePlugins:[Pg],children:e})}):null}function W1({tool:e}){const[t,n]=A.useState(!1),a=e.status==="completed",s=e.status==="failed",o=!a&&!s;return f.jsxs("div",{className:"border-2 border-[var(--color-text)] rounded-lg overflow-hidden bg-[var(--color-bg-cream)]",children:[f.jsxs("button",{type:"button",onClick:()=>n(c=>!c),className:"w-full flex items-center gap-2 px-3 py-2 text-xs font-[family-name:var(--font-mono)] hover:bg-[var(--color-accent-yellow)] transition-colors",children:[f.jsx(Bd,{size:12,strokeWidth:3,className:["transition-transform",t?"rotate-90":""].join(" ")}),f.jsx(gk,{size:12,strokeWidth:2.5}),f.jsx("span",{className:"font-bold",children:e.kind}),f.jsx("span",{className:"flex-1 text-left text-[var(--color-text-muted)] truncate",children:e.title}),o&&f.jsx(jt,{size:12,strokeWidth:3,className:"animate-spin text-[var(--color-running)]"}),a&&f.jsx(lc,{size:12,strokeWidth:2.5,className:"text-[var(--color-running)]"}),s&&f.jsx(ak,{size:12,strokeWidth:2.5,className:"text-[var(--color-crashed)]"})]}),t&&f.jsxs("div",{className:"px-3 py-2 text-xs font-[family-name:var(--font-mono)] text-[var(--color-text-muted)] border-t-2 border-[var(--color-text)]",children:[f.jsxs("div",{children:["id: ",f.jsx("span",{className:"text-[var(--color-text)]",children:e.id})]}),f.jsxs("div",{children:["status: ",f.jsx("span",{className:"text-[var(--color-text)]",children:e.status})]})]})]})}function X1(e,t){if(!e)return"";const n=new Date(e),a=Date.now()-n.getTime();return a<6e4?t("kanban.time.justNow"):a<36e5?t("kanban.time.minutes",{n:Math.floor(a/6e4)}):a<864e5?t("kanban.time.hours",{n:Math.floor(a/36e5)}):n.toLocaleDateString()}function iP(e){if(!e)return;const t=new Date(e),n=a=>String(a).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function aP(){return It("/api/processes").then(e=>e.data)}function rP(e){return vA(`/api/processes/${e}/kill`)}const sP="border-[3px] border-[var(--color-text)] rounded-2xl bg-white shadow-[4px_4px_0_var(--color-text)]";function lP({p:e}){const t=e.alive?e.sessionState??"alive":"offline",n=e.alive?"bg-[var(--color-accent-mint)]":"bg-[var(--color-bg-cream)] text-[var(--color-text)]/60";return f.jsxs("span",{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded-lg border-2 border-[var(--color-text)] text-xs font-bold font-[family-name:var(--font-mono)] ${n}`,children:[f.jsx("span",{className:`w-2 h-2 rounded-full ${e.alive?"bg-green-600":"bg-gray-400"}`}),t]})}function oP(){const e=ze(),t=En(),[n,a]=A.useState(null),[s,o]=A.useState("all"),c=rt({queryKey:["processes"],queryFn:aP,refetchInterval:5e3}),d=Mn({mutationFn:rP,onSuccess:g=>{a(g.message),t.invalidateQueries({queryKey:["processes"]})},onError:g=>a(g instanceof Error?g.message:String(g))}),h=c.data??[],p=h.filter(g=>g.alive).length,b=h.filter(g=>s==="alive"?g.alive:s==="offline"?!g.alive:!0).slice().sort((g,v)=>Number(v.alive)-Number(g.alive));return f.jsxs("div",{className:"max-w-full",children:[f.jsxs("div",{className:"flex items-center gap-3 mb-1",children:[f.jsx(rk,{size:22,strokeWidth:2.5}),f.jsx("h1",{className:"font-[family-name:var(--font-heading)] font-bold text-2xl",children:e("processes.title")}),f.jsxs("button",{type:"button","aria-label":e("processes.refresh"),onClick:()=>t.invalidateQueries({queryKey:["processes"]}),className:"ml-auto inline-flex items-center gap-1.5 px-3 py-1.5 rounded-xl border-2 border-[var(--color-text)] bg-white text-sm font-semibold shadow-[2px_2px_0_var(--color-text)] hover:-translate-x-px hover:-translate-y-px focus-visible:outline focus-visible:outline-2",children:[c.isFetching?f.jsx(jt,{size:15,className:"animate-spin"}):f.jsx(Er,{size:15}),e("processes.refresh")]})]}),f.jsxs("p",{className:"text-sm text-[var(--color-text)]/70 mb-4",children:[e("processes.subtitle")," · ",e("processes.aliveCount").replace("{n}",String(p)).replace("{total}",String(h.length))]}),n&&f.jsx("div",{className:"mb-3 px-3 py-2 rounded-xl border-2 border-[var(--color-text)] bg-[var(--color-bg-cream)] text-sm font-mono",children:n}),f.jsx("div",{className:"flex gap-2 mb-3",children:["all","alive","offline"].map(g=>f.jsx("button",{type:"button","aria-label":e(`processes.filter.${g}`),onClick:()=>o(g),className:`px-3 py-1 rounded-lg border-2 border-[var(--color-text)] text-sm font-bold shadow-[2px_2px_0_var(--color-text)] focus-visible:outline focus-visible:outline-2 ${s===g?"bg-[var(--color-accent-blue)]":"bg-white hover:-translate-x-px hover:-translate-y-px"}`,children:e(`processes.filter.${g}`)},g))}),f.jsx("div",{className:`${sP} overflow-hidden`,children:f.jsxs("table",{className:"w-full text-sm",children:[f.jsx("thead",{className:"bg-[var(--color-bg-cream)] font-[family-name:var(--font-heading)]",children:f.jsxs("tr",{className:"text-left",children:[f.jsx("th",{className:"px-3 py-2",children:e("processes.col.slot")}),f.jsx("th",{className:"px-3 py-2",children:e("processes.col.project")}),f.jsx("th",{className:"px-3 py-2",children:"PID"}),f.jsx("th",{className:"px-3 py-2",children:e("processes.col.state")}),f.jsx("th",{className:"px-3 py-2",children:e("processes.col.memory")}),f.jsx("th",{className:"px-3 py-2",children:e("processes.col.action")})]})}),f.jsxs("tbody",{className:"font-[family-name:var(--font-mono)]",children:[b.length===0&&f.jsx("tr",{children:f.jsx("td",{colSpan:6,className:"px-3 py-6 text-center text-[var(--color-text)]/50",children:e("processes.empty")})}),b.map(g=>f.jsxs("tr",{className:"border-t-2 border-[var(--color-text)]/10",title:g.cwd??"",children:[f.jsx("td",{className:"px-3 py-2 max-w-[260px] truncate",children:g.slot}),f.jsx("td",{className:"px-3 py-2",children:g.project??"—"}),f.jsx("td",{className:"px-3 py-2",children:g.pid??"—"}),f.jsx("td",{className:"px-3 py-2",children:f.jsx(lP,{p:g})}),f.jsx("td",{className:"px-3 py-2",children:g.memoryMB!=null?`${g.memoryMB} MB`:"—"}),f.jsx("td",{className:"px-3 py-2",children:g.alive&&g.pid!=null?f.jsxs("button",{type:"button","aria-label":`${e("processes.kill")} ${g.slot}`,onClick:()=>{confirm(e("processes.killConfirm").replace("{slot}",g.slot))&&d.mutate(g.pid)},className:"inline-flex items-center gap-1 px-2.5 py-1 rounded-lg border-2 border-[var(--color-text)] bg-[var(--color-accent-peach)] text-xs font-bold shadow-[2px_2px_0_var(--color-text)] hover:-translate-x-px hover:-translate-y-px active:translate-x-0.5 active:translate-y-0.5 focus-visible:outline focus-visible:outline-2",children:[f.jsx(ak,{size:13})," ",e("processes.kill")]}):f.jsx("span",{className:"text-[var(--color-text)]/40 text-xs",children:"—"})})]},g.slot))]})]})})]})}function cP(e={}){const t=new URLSearchParams;e.project&&t.set("project",e.project),e.action&&t.set("action",e.action);const n=t.toString();return It(`/api/audit${n?`?${n}`:""}`).then(a=>a.data)}const uP="border-[3px] border-[var(--color-text)] rounded-2xl bg-white shadow-[4px_4px_0_var(--color-text)]",dP={create:"bg-[var(--color-accent-mint)]",modify:"bg-[var(--color-accent-yellow)]",delete:"bg-[var(--color-accent-peach)]"};function fP(){const e=ze(),t=En(),[n,a]=A.useState(""),s=rt({queryKey:["audit",n],queryFn:()=>cP(n?{action:n}:{}),refetchInterval:8e3}),o=s.data??[],c=d=>e(`audit.action.${d}`);return f.jsxs("div",{className:"max-w-full",children:[f.jsxs("div",{className:"flex items-center gap-3 mb-1",children:[f.jsx(uk,{size:22,strokeWidth:2.5}),f.jsx("h1",{className:"font-[family-name:var(--font-heading)] font-bold text-2xl",children:e("audit.title")}),f.jsxs("button",{type:"button","aria-label":e("audit.refresh"),onClick:()=>t.invalidateQueries({queryKey:["audit"]}),className:"ml-auto inline-flex items-center gap-1.5 px-3 py-1.5 rounded-xl border-2 border-[var(--color-text)] bg-white text-sm font-semibold shadow-[2px_2px_0_var(--color-text)] hover:-translate-x-px hover:-translate-y-px focus-visible:outline focus-visible:outline-2",children:[s.isFetching?f.jsx(jt,{size:15,className:"animate-spin"}):f.jsx(Er,{size:15}),e("audit.refresh")]})]}),f.jsx("p",{className:"text-sm text-[var(--color-text)]/70 mb-4",children:e("audit.subtitle")}),f.jsx("div",{className:"flex gap-2 mb-3",children:["","create","modify","delete"].map(d=>f.jsx("button",{type:"button","aria-label":d?c(d):e("audit.filter.all"),onClick:()=>a(d),className:`px-3 py-1 rounded-lg border-2 border-[var(--color-text)] text-sm font-bold shadow-[2px_2px_0_var(--color-text)] focus-visible:outline focus-visible:outline-2 ${n===d?"bg-[var(--color-accent-blue)]":"bg-white hover:-translate-x-px hover:-translate-y-px"}`,children:d?c(d):e("audit.filter.all")},d||"all"))}),f.jsx("div",{className:`${uP} overflow-hidden`,children:f.jsxs("table",{className:"w-full text-sm",children:[f.jsx("thead",{className:"bg-[var(--color-bg-cream)] font-[family-name:var(--font-heading)]",children:f.jsxs("tr",{className:"text-left",children:[f.jsx("th",{className:"px-3 py-2",children:e("audit.col.time")}),f.jsx("th",{className:"px-3 py-2",children:e("audit.col.action")}),f.jsx("th",{className:"px-3 py-2",children:e("audit.col.project")}),f.jsx("th",{className:"px-3 py-2",children:e("audit.col.detail")})]})}),f.jsxs("tbody",{className:"font-[family-name:var(--font-mono)]",children:[o.length===0&&f.jsx("tr",{children:f.jsx("td",{colSpan:4,className:"px-3 py-6 text-center text-[var(--color-text)]/50",children:e("audit.empty")})}),o.map((d,h)=>f.jsxs("tr",{className:"border-t-2 border-[var(--color-text)]/10",children:[f.jsx("td",{className:"px-3 py-2 whitespace-nowrap",children:new Date(d.ts).toLocaleString()}),f.jsx("td",{className:"px-3 py-2",children:f.jsx("span",{className:`inline-block px-2 py-0.5 rounded-lg border-2 border-[var(--color-text)] text-xs font-bold ${dP[d.action]}`,children:c(d.action)})}),f.jsx("td",{className:"px-3 py-2",children:d.project}),f.jsx("td",{className:"px-3 py-2 text-[var(--color-text)]/70",children:d.detail??(d.source?`(${d.source})`:"—")})]},`${d.ts}-${h}`))]})]})})]})}function hP(){const e=ze();return f.jsxs("div",{className:"nb-card max-w-2xl mt-12",children:[f.jsx("h1",{className:"font-[family-name:var(--font-heading)] text-4xl font-bold mb-2",children:e("notFound.title")}),f.jsx("p",{className:"text-[var(--color-text-muted)] mb-6",children:e("notFound.body")}),f.jsx(ps,{to:"/",className:"nb-btn nb-btn-mint inline-flex",children:e("notFound.home")})]})}function pP(){return f.jsx($A,{children:f.jsx(WC,{children:f.jsxs(xn,{element:f.jsx(FA,{}),children:[f.jsx(xn,{index:!0,element:f.jsx(QC,{to:"/projects",replace:!0})}),f.jsx(xn,{path:"/projects",element:f.jsx(HA,{})}),f.jsx(xn,{path:"/projects/new",element:f.jsx(tj,{})}),f.jsx(xn,{path:"/projects/:name",element:f.jsx(pO,{})}),f.jsx(xn,{path:"/board",element:f.jsx(eD,{})}),f.jsx(xn,{path:"/workers",element:f.jsx(mD,{})}),f.jsx(xn,{path:"/logs",element:f.jsx(vD,{})}),f.jsx(xn,{path:"/skills",element:f.jsx(zB,{})}),f.jsx(xn,{path:"/system",element:f.jsx(PB,{})}),f.jsx(xn,{path:"/processes",element:f.jsx(oP,{})}),f.jsx(xn,{path:"/audit",element:f.jsx(fP,{})}),f.jsx(xn,{path:"/chat",element:f.jsx(uw,{})}),f.jsx(xn,{path:"/chat/:sessionId",element:f.jsx(uw,{})}),f.jsx(xn,{path:"*",element:f.jsx(hP,{})})]})})})}qA();const mP=new zN({defaultOptions:{queries:{staleTime:3e4,refetchOnWindowFocus:!1}}}),Z1=document.getElementById("root");if(!Z1)throw new Error("#root not found");fN.createRoot(Z1).render(f.jsx(A.StrictMode,{children:f.jsx(gA,{children:f.jsx(BN,{client:mP,children:f.jsx(w2,{children:f.jsx(ZA,{children:f.jsx(pP,{})})})})})}));
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;500;600;700&family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
10
- <script type="module" crossorigin src="/assets/index-MD2KZ6Dd.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-BJcVygZ0.css">
10
+ <script type="module" crossorigin src="/assets/index-d1nmsVQ5.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-BsxZE28I.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coralai/sps-cli",
3
- "version": "0.55.0",
3
+ "version": "0.55.2",
4
4
  "description": "SPS CLI — AI-driven development pipeline orchestrator",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -1,10 +0,0 @@
1
- pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
2
- Theme: GitHub
3
- Description: Light theme as seen on github.com
4
- Author: github.com
5
- Maintainer: @Hirse
6
- Updated: 2021-05-15
7
-
8
- Outdated base version: https://github.com/primer/github-syntax-light
9
- Current colors taken from GitHub's CSS
10
- */.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#005cc5}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-comment,.hljs-code,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */@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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--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-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono", "SF Mono", Monaco, Consolas, monospace;--color-green-600:oklch(62.7% .194 149.214);--color-gray-400:oklch(70.7% .022 261.325);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-6xl:72rem;--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: 1.5 ;--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: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-md:12px;--radius-lg:16px;--radius-xl:20px;--radius-2xl:1rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--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);--color-bg:#fff;--color-bg-cream:#fff9f5;--color-text:#2d3748;--color-text-muted:#475569;--color-text-subtle:#64748b;--color-border-light:#e2e8f0;--color-primary:#fdbcb4;--color-secondary:#add8e6;--color-accent-mint:#98ff98;--color-accent-purple:#e6e6fa;--color-accent-yellow:#fff3b0;--color-accent-pink:#ffd1dc;--color-running:#166534;--color-running-bg:#d4f5e4;--color-stuck:#92400e;--color-stuck-bg:#ffe8cf;--color-crashed:#991b1b;--color-crashed-bg:#ffe4e6;--color-idle:#475569;--color-idle-bg:#f1f5f9;--color-cta:#22c55e;--font-heading:"Fredoka", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-body:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif}}@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%;-moz-tab-size:4;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;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:before,:after{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--font-body);color:var(--color-text);background:var(--color-bg-cream);min-height:100vh;font-size:15px;line-height:1.5}h1,h2,h3,h4,h5{font-family:var(--font-heading);color:var(--color-text);letter-spacing:-.01em;margin:0;font-weight:700}:focus-visible{outline:3px solid var(--color-text);outline-offset:2px}@media(prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}}@layer components{.nb-card{background:var(--color-bg);border:3px solid var(--color-text);box-shadow:5px 5px 0 var(--color-text);border-radius:16px;padding:16px}.nb-card-interactive{cursor:pointer;transition:transform .18s ease-out,box-shadow .18s ease-out}.nb-card-interactive:hover{box-shadow:7px 7px 0 var(--color-text);transform:translate(-2px,-2px)}.nb-card-interactive:active{box-shadow:3px 3px 0 var(--color-text);transform:translate(1px,1px)}.nb-btn{border:3px solid var(--color-text);font-family:var(--font-body);color:var(--color-text);background:var(--color-bg);box-shadow:3px 3px 0 var(--color-text);-webkit-user-select:none;user-select:none;cursor:pointer;border-radius:12px;align-items:center;gap:8px;padding:10px 18px;font-size:14px;font-weight:700;line-height:20px;transition:transform .12s ease-out,box-shadow .12s ease-out;display:inline-flex}.nb-btn:hover{box-shadow:4px 4px 0 var(--color-text);transform:translate(-1px,-1px)}.nb-btn:active{box-shadow:1px 1px 0 var(--color-text);transform:translate(2px,2px)}.nb-btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:2px 2px 0 var(--color-text);transform:none}.nb-btn:disabled:hover{box-shadow:2px 2px 0 var(--color-text);transform:none}.nb-btn-primary{background:var(--color-cta)}.nb-btn-mint{background:var(--color-accent-mint)}.nb-btn-peach{background:var(--color-primary)}.nb-btn-blue{background:var(--color-secondary)}.nb-btn-yellow{background:var(--color-accent-yellow)}.nb-btn-purple{background:var(--color-accent-purple)}.nb-btn-danger{background:var(--color-crashed);color:#fff}.nb-input{border:3px solid var(--color-text);background:var(--color-bg);color:var(--color-text);font-family:var(--font-body);box-shadow:3px 3px 0 var(--color-text);border-radius:12px;padding:10px 16px;font-size:14px;font-weight:500;line-height:20px;transition:transform .12s,box-shadow .12s}.nb-input:focus{box-shadow:4px 4px 0 var(--color-text);outline:none;transform:translate(-1px,-1px)}.nb-badge{border:2px solid var(--color-text);font-family:var(--font-body);color:var(--color-text);background:var(--color-bg);border-radius:9999px;align-items:center;gap:4px;padding:4px 10px;font-size:12px;font-weight:700;line-height:16px;display:inline-flex}.nb-status{border:2px solid var(--color-text);font-family:var(--font-body);color:var(--color-text);border-radius:9999px;align-items:center;gap:5px;padding:4px 10px 4px 9px;font-size:11px;font-weight:700;line-height:16px;display:inline-flex}.nb-status:before{content:"";border:1.5px solid var(--color-text);background:currentColor;border-radius:50%;width:8px;height:8px}.prose-chat{color:var(--color-text);line-height:1.6}.prose-chat>:first-child{margin-top:0}.prose-chat>:last-child{margin-bottom:0}.prose-chat h1{font-family:var(--font-heading);margin:1em 0 .5em;font-size:1.5rem;font-weight:700}.prose-chat h2{font-family:var(--font-heading);margin:1em 0 .5em;font-size:1.25rem;font-weight:700}.prose-chat h3{font-family:var(--font-heading);margin:.8em 0 .4em;font-size:1.1rem;font-weight:700}.prose-chat h4,.prose-chat h5,.prose-chat h6{font-family:var(--font-heading);margin:.8em 0 .3em;font-weight:700}.prose-chat p{margin:.6em 0}.prose-chat ul,.prose-chat ol{margin:.6em 0;padding-left:1.6em}.prose-chat ul{list-style:outside}.prose-chat ol{list-style:decimal}.prose-chat li,.prose-chat li>ul,.prose-chat li>ol{margin:.2em 0}.prose-chat code{font-family:var(--font-mono);background:var(--color-bg-cream);border:1.5px solid var(--color-text);border-radius:4px;padding:0 4px;font-size:.9em}.prose-chat pre{background:var(--color-bg-cream);border:2px solid var(--color-text);font-family:var(--font-mono);border-radius:8px;margin:.8em 0;padding:12px;font-size:.85em;line-height:1.45;overflow-x:auto}.prose-chat pre code{font-size:inherit;background:0 0;border:0;padding:0}.prose-chat blockquote{border-left:3px solid var(--color-text);color:var(--color-text-muted);margin:.8em 0;padding-left:1em}.prose-chat table{border-collapse:collapse;border:2px solid var(--color-text);border-radius:8px;margin:.8em 0;overflow:hidden}.prose-chat th,.prose-chat td{border:1px solid var(--color-text);text-align:left;padding:6px 10px}.prose-chat th{background:var(--color-bg-cream);font-weight:700}.prose-chat a{color:var(--color-running);text-underline-offset:2px;text-decoration:underline}.prose-chat a:hover{color:var(--color-text)}.prose-chat hr{border:0;border-top:2px dashed var(--color-text);margin:1em 0}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1\/2{top:50%}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-3{right:calc(var(--spacing) * 3)}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.row-span-1{grid-row:span 1/span 1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.mx-auto{margin-inline:auto}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.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-8{margin-top:calc(var(--spacing) * 8)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-20{height:calc(var(--spacing) * 20)}.h-\[calc\(100vh-140px\)\]{height:calc(100vh - 140px)}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[280px\]{min-height:280px}.w-2{width:calc(var(--spacing) * 2)}.w-2\/3{width:66.6667%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[12rem\]{max-width:12rem}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[260px\]{max-width:260px}.max-w-\[1000px\]{max-width:1000px}.max-w-\[1100px\]{max-width:1100px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[130px\]{min-width:130px}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[100px_1fr\]{grid-template-columns:100px 1fr}.grid-cols-\[100px_60px_1fr\]{grid-template-columns:100px 60px 1fr}.grid-cols-\[100px_90px_60px_1fr\]{grid-template-columns:100px 90px 60px 1fr}.grid-cols-\[160px_1fr\]{grid-template-columns:160px 1fr}.grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr}.grid-cols-\[repeat\(auto-fill\,minmax\(280px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.grid-rows-\[1fr_40px\]{grid-template-rows:1fr 40px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.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-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}: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)))}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y-2>: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(2px * var(--tw-divide-y-reverse));border-bottom-width:calc(2px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-\[var\(--color-text\)\]\/20>:not(:last-child)){border-color:#2d374833}@supports (color:color-mix(in lab,red,red)){:where(.divide-\[var\(--color-text\)\]\/20>:not(:last-child)){border-color:color-mix(in oklab,var(--color-text) 20%,transparent)}}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-\[2px\]{border-style:var(--tw-border-style);border-width:2px}.border-\[3px\]{border-style:var(--tw-border-style);border-width:3px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[1\.5px\]{border-top-style:var(--tw-border-style);border-top-width:1.5px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.border-r-\[3px\]{border-right-style:var(--tw-border-style);border-right-width:3px}.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-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[var\(--color-border-light\)\]{border-color:var(--color-border-light)}.border-\[var\(--color-cta\)\]{border-color:var(--color-cta)}.border-\[var\(--color-running\)\]{border-color:var(--color-running)}.border-\[var\(--color-stuck\)\]{border-color:var(--color-stuck)}.border-\[var\(--color-text\)\]{border-color:var(--color-text)}.border-\[var\(--color-text\)\]\/10{border-color:#2d37481a}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-text\)\]\/10{border-color:color-mix(in oklab,var(--color-text) 10%,transparent)}}.border-\[var\(--color-text\)\]\/30{border-color:#2d37484d}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-text\)\]\/30{border-color:color-mix(in oklab,var(--color-text) 30%,transparent)}}.border-transparent{border-color:#0000}.bg-\[rgba\(45\,55\,72\,0\.4\)\]{background-color:#2d374866}.bg-\[rgba\(45\,55\,72\,0\.5\)\]{background-color:#2d374880}.bg-\[rgba\(45\,55\,72\,0\.6\)\]{background-color:#2d374899}.bg-\[var\(--color-accent-blue\)\]{background-color:var(--color-accent-blue)}.bg-\[var\(--color-accent-mint\)\]{background-color:var(--color-accent-mint)}.bg-\[var\(--color-accent-peach\)\]{background-color:var(--color-accent-peach)}.bg-\[var\(--color-accent-purple\)\]{background-color:var(--color-accent-purple)}.bg-\[var\(--color-accent-yellow\)\]{background-color:var(--color-accent-yellow)}.bg-\[var\(--color-bg\)\]{background-color:var(--color-bg)}.bg-\[var\(--color-bg-cream\)\]{background-color:var(--color-bg-cream)}.bg-\[var\(--color-border-light\)\]{background-color:var(--color-border-light)}.bg-\[var\(--color-crashed\)\]{background-color:var(--color-crashed)}.bg-\[var\(--color-crashed-bg\)\]{background-color:var(--color-crashed-bg)}.bg-\[var\(--color-cta\)\]{background-color:var(--color-cta)}.bg-\[var\(--color-primary\)\]{background-color:var(--color-primary)}.bg-\[var\(--color-running-bg\)\]{background-color:var(--color-running-bg)}.bg-\[var\(--color-secondary\)\]{background-color:var(--color-secondary)}.bg-\[var\(--color-stuck\)\]{background-color:var(--color-stuck)}.bg-\[var\(--color-stuck-bg\)\]{background-color:var(--color-stuck-bg)}.bg-\[var\(--color-text\)\]{background-color:var(--color-text)}.bg-\[var\(--color-text-subtle\)\]{background-color:var(--color-text-subtle)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-gray-400{background-color:var(--color-gray-400)}.bg-green-600{background-color:var(--color-green-600)}.bg-white{background-color:var(--color-white)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.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-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:calc(var(--spacing) * 0)}.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-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.font-\[family-name\:var\(--font-body\)\]{font-family:var(--font-body)}.font-\[family-name\:var\(--font-heading\)\]{font-family:var(--font-heading)}.font-\[family-name\:var\(--font-mono\)\],.font-mono{font-family:var(--font-mono)}.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-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))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[22px\]{--tw-leading:22px;line-height:22px}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--color-bg\)\]{color:var(--color-bg)}.text-\[var\(--color-crashed\)\]{color:var(--color-crashed)}.text-\[var\(--color-running\)\]{color:var(--color-running)}.text-\[var\(--color-stuck\)\]{color:var(--color-stuck)}.text-\[var\(--color-text\)\]{color:var(--color-text)}.text-\[var\(--color-text\)\]\/40{color:#2d374866}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-text\)\]\/40{color:color-mix(in oklab,var(--color-text) 40%,transparent)}}.text-\[var\(--color-text\)\]\/50{color:#2d374880}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-text\)\]\/50{color:color-mix(in oklab,var(--color-text) 50%,transparent)}}.text-\[var\(--color-text\)\]\/60{color:#2d374899}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-text\)\]\/60{color:color-mix(in oklab,var(--color-text) 60%,transparent)}}.text-\[var\(--color-text\)\]\/70{color:#2d3748b3}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-text\)\]\/70{color:color-mix(in oklab,var(--color-text) 70%,transparent)}}.text-\[var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[var\(--color-text-subtle\)\]{color:var(--color-text-subtle)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-2{text-decoration-thickness:2px}.accent-\[var\(--color-cta\)\]{accent-color:var(--color-cta)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.shadow{--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)}.shadow-\[1px_1px_0_var\(--color-text\)\]{--tw-shadow:1px 1px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[2px_2px_0_var\(--color-text\)\]{--tw-shadow:2px 2px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[3px_3px_0_var\(--color-text\)\]{--tw-shadow:3px 3px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[4px_4px_0_var\(--color-cta\)\]{--tw-shadow:4px 4px 0 var(--tw-shadow-color,var(--color-cta));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[4px_4px_0_var\(--color-text\)\]{--tw-shadow:4px 4px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[5px_5px_0_var\(--color-text\)\]{--tw-shadow:5px 5px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-nb{--tw-shadow:5px 5px 0 var(--tw-shadow-color,#2d3748);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[var\(--color-text\)\]{--tw-ring-color:var(--color-text)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,box-shadow\]{transition-property:transform,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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-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}.duration-\[180ms\]{--tw-duration:.18s;transition-duration:.18s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:-translate-x-0\.5:hover{--tw-translate-x:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-x-px:hover{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-px:hover{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-\[var\(--color-text\)\]:hover{border-color:var(--color-text)}.hover\:bg-\[var\(--color-accent-mint\)\]:hover{background-color:var(--color-accent-mint)}.hover\:bg-\[var\(--color-accent-yellow\)\]:hover{background-color:var(--color-accent-yellow)}.hover\:bg-\[var\(--color-bg-cream\)\]:hover{background-color:var(--color-bg-cream)}.hover\:text-\[var\(--color-crashed\)\]:hover{color:var(--color-crashed)}.hover\:text-\[var\(--color-text\)\]:hover{color:var(--color-text)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[2px_2px_0_var\(--color-text\)\]:hover{--tw-shadow:2px 2px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-\[3px_3px_0_var\(--color-text\)\]:hover{--tw-shadow:3px 3px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-\[4px_4px_0_var\(--color-text\)\]:hover{--tw-shadow:4px 4px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-\[5px_5px_0_var\(--color-text\)\]:hover{--tw-shadow:5px 5px 0 var(--tw-shadow-color,var(--color-text));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[var\(--color-text\)\]:focus-visible{--tw-ring-color:var(--color-text)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.active\:translate-x-0\.5:active{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.active\:translate-y-0\.5:active{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}}@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-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-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-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}