chatroom-cli 1.94.2 → 1.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.3.2 | 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-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-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}}}@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:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--radius-4xl:2rem;--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)}}@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}.chatroom-root *,.chatroom-root :before,.chatroom-root :after{box-sizing:border-box}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}}html,body,#root{height:100%}body{background-color:var(--chatroom-bg-primary);color:var(--chatroom-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.isolate{isolation:isolate}.z-50{z-index:50}.row-1{grid-row:1}.m-1{margin:var(--spacing)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mb-1{margin-bottom:var(--spacing)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-\[28px\]{height:28px}.h-full{height:100%}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[60vh\]{max-height:60vh}.min-h-0{min-height:0}.min-h-\[400px\]{min-height:400px}.min-h-screen{min-height:100vh}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-96{width:calc(var(--spacing) * 96)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[14rem\]{max-width:14rem}.max-w-\[40\%\]{max-width:40%}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[10rem\]{min-width:10rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.origin-\(--transform-origin\){transform-origin:var(--transform-origin)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0{gap:0}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded-4xl{border-radius:var(--radius-4xl)}.rounded-md,.rounded-none{border-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border{border-color:var(--border)}.border-chatroom-border{border-color:var(--chatroom-border)}.border-chatroom-status-error\/30{border-color:var(--chatroom-status-error)}@supports (color:color-mix(in lab,red,red)){.border-chatroom-status-error\/30{border-color:color-mix(in oklab,var(--chatroom-status-error) 30%,transparent)}}.border-chatroom-status-error\/40{border-color:var(--chatroom-status-error)}@supports (color:color-mix(in lab,red,red)){.border-chatroom-status-error\/40{border-color:color-mix(in oklab,var(--chatroom-status-error) 40%,transparent)}}.border-chatroom-status-info\/40{border-color:var(--chatroom-status-info)}@supports (color:color-mix(in lab,red,red)){.border-chatroom-status-info\/40{border-color:color-mix(in oklab,var(--chatroom-status-info) 40%,transparent)}}.border-chatroom-status-success{border-color:var(--chatroom-status-success)}.border-chatroom-status-warning\/40{border-color:var(--chatroom-status-warning)}@supports (color:color-mix(in lab,red,red)){.border-chatroom-status-warning\/40{border-color:color-mix(in oklab,var(--chatroom-status-warning) 40%,transparent)}}.border-transparent{border-color:#0000}.bg-background{background-color:var(--background)}.bg-chatroom-bg-hover{background-color:var(--chatroom-bg-hover)}.bg-chatroom-bg-primary{background-color:var(--chatroom-bg-primary)}.bg-chatroom-bg-secondary{background-color:var(--chatroom-bg-secondary)}.bg-chatroom-bg-tertiary{background-color:var(--chatroom-bg-tertiary)}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-muted{background-color:var(--muted)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.p-0{padding:0}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.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-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-chatroom-accent{color:var(--chatroom-accent)}.text-chatroom-status-error{color:var(--chatroom-status-error)}.text-chatroom-status-info{color:var(--chatroom-status-info)}.text-chatroom-status-success{color:var(--chatroom-status-success)}.text-chatroom-status-warning{color:var(--chatroom-status-warning)}.text-chatroom-text-muted{color:var(--chatroom-text-muted)}.text-chatroom-text-primary{color:var(--chatroom-text-primary)}.text-chatroom-text-secondary{color:var(--chatroom-text-secondary)}.text-destructive{color:var(--destructive)}.text-foreground{color:var(--foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline-offset-4{text-underline-offset:4px}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.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-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))}.delay-30{transition-delay:30ms}.delay-60{transition-delay:60ms}.delay-90{transition-delay:90ms}.outline-none{--tw-outline-style:none;outline-style:none}.\[claude\:role\@short-id\]{claude:role@short-id}.\[claude\:role\]{claude:role}.\[cursor-sdk\:builder\@c1\]{cursor-sdk:builder@c1}.delay-30{animation-delay:30ms}.delay-60{animation-delay:60ms}.delay-90{animation-delay:90ms}.running{animation-play-state:running}.placeholder\:text-chatroom-text-muted::placeholder{color:var(--chatroom-text-muted)}@media (hover:hover){.hover\:border-chatroom-border-strong:hover{border-color:var(--chatroom-border-strong)}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-chatroom-bg-hover:hover{background-color:var(--chatroom-bg-hover)}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-chatroom-accent:focus{border-color:var(--chatroom-accent)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:bg-chatroom-bg-hover:focus-visible{background-color:var(--chatroom-bg-hover)}.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-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-closed\:animate-out[data-closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-closed\:fade-out-0[data-closed]{--tw-exit-opacity:0}.data-closed\:zoom-out-95[data-closed]{--tw-exit-scale:.95}.data-open\:animate-in[data-open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-open\:fade-in-0[data-open]{--tw-enter-opacity:0}.data-open\:zoom-in-95[data-open]{--tw-enter-scale:.95}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}:root{--radius:0px;--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--ring:oklch(55.6% 0 0)}.dark{--chatroom-bg-primary:#09090b;--chatroom-bg-secondary:#18181b80;--chatroom-bg-tertiary:#18181b;--chatroom-bg-hover:#27272a;--chatroom-bg-surface:#18181bcc;--chatroom-border:#fafafa1a;--chatroom-border-strong:#fafafa33;--chatroom-text-primary:#fafafa;--chatroom-text-secondary:#a1a1aa;--chatroom-text-muted:#71717a;--chatroom-status-success:#34d399;--chatroom-status-warning:#fbbf24;--chatroom-status-error:#f87171;--chatroom-status-info:#60a5fa;--chatroom-accent:#fafafa;color-scheme:dark}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-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}@keyframes pulse{50%{opacity:.5}}
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en" class="dark">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Chatroom Daemon</title>
7
+ <script type="module" crossorigin src="/assets/index-C3Kp4LqQ.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-DvCxOxT9.css">
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>
package/dist/index.js CHANGED
@@ -78205,6 +78205,7 @@ var init_participant = __esm(() => {
78205
78205
  ONLINE_OR_STARTING_STATUSES = new Set([
78206
78206
  "agent.waiting",
78207
78207
  "agent.requestStart",
78208
+ "agent.restart",
78208
78209
  "agent.started",
78209
78210
  "task.acknowledged",
78210
78211
  "task.inProgress",
@@ -79042,6 +79043,32 @@ var init_builder_to_planner = __esm(() => {
79042
79043
  init_role_guidance_disclosure();
79043
79044
  });
79044
79045
 
79046
+ // ../../services/backend/prompts/enhancer/defragmentation-reference.ts
79047
+ function renderDefragmentationHandoffReference() {
79048
+ return [
79049
+ "### Defragmentation workflow checklist",
79050
+ 'Complete the optional **Defragmentation** section when the planner check-in addresses a large or multi-surface system revision, including refactoring, consolidation, or consistency work. Write exactly "Not Applicable." only when no such revision is proposed.',
79051
+ "",
79052
+ "1. **Study surfaces** — map all call sites, use cases, and complexity variants before proposing slices; name every relevant file/module",
79053
+ "2. **Golden implementation** — build a standalone canonical solution first; introduce canonical domain entities/types only when the studied variants require them, then shared use cases, UI components, or utilities; do not patch duplicates in place",
79054
+ "3. **Migrate callers** — refactor all consumers to the golden path; each slice must be shippable end-to-end",
79055
+ "4. **Delete legacy** — remove old implementations only after migration is complete; no dead-code leftovers",
79056
+ "",
79057
+ "### Anti-patterns to flag",
79058
+ "- Incremental copy-paste fixes across N files without a golden SSOT",
79059
+ "- New abstraction without studying all existing variants",
79060
+ '- Leaving old code "for safety" after migration',
79061
+ "- Slices that add helpers/infra without a runnable end-to-end outcome",
79062
+ "- Parallel implementations coexisting without a deletion plan",
79063
+ "",
79064
+ "### Structural decisions",
79065
+ "- Identify SSOT locations for domain entities, shared use cases, and UI components",
79066
+ "- Align with `structural-decisions` glossary: folder structure, file naming, interface locations",
79067
+ "- Flag when the plan scatters the canonical implementation across unrelated modules"
79068
+ ].join(`
79069
+ `);
79070
+ }
79071
+
79045
79072
  // ../../services/backend/prompts/enhancer/webapp-ux-reference.ts
79046
79073
  function renderWebappUxHandoffReference() {
79047
79074
  return [
@@ -79140,7 +79167,7 @@ function getEnhancerFeedbackTemplateBody() {
79140
79167
  <specific misreadings or missing constraints — what the user asked vs what the planner proposed>
79141
79168
  </handoff-overview>
79142
79169
 
79143
- <!-- UI collapses proofs, direction, ux, and notes by default; overview and action required are expanded -->
79170
+ <!-- UI collapses proofs, direction, ux, defragmentation, and notes by default; overview and action required are expanded -->
79144
79171
 
79145
79172
  <handoff-proofs>
79146
79173
  ## Reasoning review
@@ -79167,6 +79194,20 @@ function getEnhancerFeedbackTemplateBody() {
79167
79194
  - **Bulk safeguards:** <batch/multi-item operations gated by confirm with count/impact summary; cite missing confirms>
79168
79195
  </handoff-ux>
79169
79196
 
79197
+ <handoff-defragmentation>
79198
+ <!-- Optional — write exactly "Not Applicable." when no large or multi-surface system revision is proposed -->
79199
+ <!-- When revision work is proposed: specific findings tied to the planner's proposal. No code blocks (use Suggested edits). -->
79200
+ - **Surfaces:** <call sites and modules identified; gaps in surface mapping>
79201
+ - **Golden path:** <whether planner builds standalone canonical implementation first>
79202
+ - **Domain model:** <canonical types/entities needed or "not needed">
79203
+ - **Shared components:** <shared abstractions planned (use cases, UI, utilities)>
79204
+ - **Slice ordering:** <study → golden → migrate → delete sequence respected?>
79205
+ - **Migration plan:** <how all callers move to golden path>
79206
+ - **Deletion plan:** <old implementations slated for removal>
79207
+ - **Duplication:** <existing duplicates to eliminate; risk of new duplication>
79208
+ - **Structural decisions:** <folder/module boundaries; SSOT locations>
79209
+ </handoff-defragmentation>
79210
+
79170
79211
  <handoff-notes>
79171
79212
  ## Knowledge gaps
79172
79213
  <specific facts, files, or research to verify — name what to check and why>
@@ -79205,10 +79246,12 @@ ${getHandoffReportTemplateIntro("Planning Feedback (Enhancer → Planner)")}
79205
79246
 
79206
79247
  The planner sent you three XML sections. Your job is **advisory adversarial review** — raise risks, challenge assumptions, align with user intent. Be **specific and targeted**: cite concrete claims, files, UX choices, and gaps from the check-in so the planner can improve the plan without re-synthesizing vague feedback.
79207
79248
 
79208
- Give **concrete, actionable recommendations** in every section. End with **Recommendations** (second-last: summarized suggestions, tradeoffs, and considerations) then **Suggested edits** (last: proposed edits to grounding and the builder-handoff with file paths and code snippets). For UI work, complete the optional **UX** section using the reference below. **Do not rewrite their full builder brief.** The planner makes the final call.
79249
+ Give **concrete, actionable recommendations** in every section. End with **Recommendations** (second-last: summarized suggestions, tradeoffs, and considerations) then **Suggested edits** (last: proposed edits to grounding and the builder-handoff with file paths and code snippets). For UI work, complete the optional **UX** section using the reference below. For large or multi-surface revision work, complete the optional **Defragmentation** section using its reference below. **Do not rewrite their full builder brief.** The planner makes the final call.
79209
79250
 
79210
79251
  ${renderWebappUxHandoffReference()}
79211
79252
 
79253
+ ${renderDefragmentationHandoffReference()}
79254
+
79212
79255
  \`\`\`markdown
79213
79256
  ${getEnhancerFeedbackTemplateBody()}
79214
79257
  \`\`\`
@@ -80254,6 +80297,24 @@ var init_generator = __esm(() => {
80254
80297
  init_review_guidelines();
80255
80298
  });
80256
80299
 
80300
+ // src/infrastructure/deps/create-convex-command-deps.ts
80301
+ async function createConvexCommandDeps() {
80302
+ const client4 = await getConvexClient();
80303
+ const backend2 = {
80304
+ mutation: (endpoint, args2) => client4.mutation(endpoint, args2),
80305
+ query: (endpoint, args2) => client4.query(endpoint, args2)
80306
+ };
80307
+ const session2 = { getSessionId, getConvexUrl, getOtherSessionUrls };
80308
+ return {
80309
+ backend: backend2,
80310
+ session: session2
80311
+ };
80312
+ }
80313
+ var init_create_convex_command_deps = __esm(() => {
80314
+ init_storage();
80315
+ init_client2();
80316
+ });
80317
+
80257
80318
  // src/commands/handoff/index.ts
80258
80319
  var exports_handoff = {};
80259
80320
  __export(exports_handoff, {
@@ -80261,18 +80322,7 @@ __export(exports_handoff, {
80261
80322
  handoff: () => handoff
80262
80323
  });
80263
80324
  async function createDefaultDeps10() {
80264
- const client4 = await getConvexClient();
80265
- return {
80266
- backend: {
80267
- mutation: (endpoint, args2) => client4.mutation(endpoint, args2),
80268
- query: (endpoint, args2) => client4.query(endpoint, args2)
80269
- },
80270
- session: {
80271
- getSessionId,
80272
- getConvexUrl,
80273
- getOtherSessionUrls
80274
- }
80275
- };
80325
+ return createConvexCommandDeps();
80276
80326
  }
80277
80327
  function handleHandoffError(err) {
80278
80328
  return exports_Effect.sync(() => {
@@ -80389,8 +80439,7 @@ var init_handoff = __esm(() => {
80389
80439
  init_values();
80390
80440
  init_esm();
80391
80441
  init_api3();
80392
- init_storage();
80393
- init_client2();
80442
+ init_create_convex_command_deps();
80394
80443
  init_services();
80395
80444
  init_error_formatting();
80396
80445
  });
@@ -81687,18 +81736,7 @@ __export(exports_skill, {
81687
81736
  activateSkill: () => activateSkill
81688
81737
  });
81689
81738
  async function createDefaultDeps15() {
81690
- const client4 = await getConvexClient();
81691
- return {
81692
- backend: {
81693
- mutation: (endpoint, args2) => client4.mutation(endpoint, args2),
81694
- query: (endpoint, args2) => client4.query(endpoint, args2)
81695
- },
81696
- session: {
81697
- getSessionId,
81698
- getConvexUrl,
81699
- getOtherSessionUrls
81700
- }
81701
- };
81739
+ return createConvexCommandDeps();
81702
81740
  }
81703
81741
  function handleListSkillsError(err) {
81704
81742
  return exports_Effect.sync(() => {
@@ -81824,8 +81862,7 @@ var listSkillsEffect = (chatroomId, _options) => exports_Effect.gen(function* ()
81824
81862
  var init_skill = __esm(() => {
81825
81863
  init_esm();
81826
81864
  init_api3();
81827
- init_storage();
81828
- init_client2();
81865
+ init_create_convex_command_deps();
81829
81866
  init_services();
81830
81867
  init_convex_error();
81831
81868
  });
@@ -81883,6 +81920,111 @@ var init_send = __esm(() => {
81883
81920
  init_client2();
81884
81921
  });
81885
81922
 
81923
+ // ../../services/backend/src/domain/usecase/message/serialize-message.ts
81924
+ function attachmentContext(options) {
81925
+ return { chatroomId: options.chatroomId ?? "", role: options.role ?? "" };
81926
+ }
81927
+ function serializeLinearMessage(message, options) {
81928
+ const target = message.targetRole ? ` → ${message.targetRole}` : "";
81929
+ const attachments = message.attachments ? renderDeliveryAttachmentsBlock(message.attachments, attachmentContext(options)).join(`
81930
+ `) : "";
81931
+ return `${new Date(message._creationTime).toISOString()} | ${message.senderRole}${target}
81932
+ ${attachments ? `${attachments}
81933
+ ` : ""}
81934
+ ${message.content}`;
81935
+ }
81936
+ function serializeTaskOriginMessage(message) {
81937
+ return `<message sender="${escapeXmlAttribute(message.senderRole)}" message-id="${escapeXmlAttribute(message._id)}">
81938
+ <message-content>
81939
+ ${escapeXmlText(message.content)}
81940
+ </message-content>
81941
+ </message>`;
81942
+ }
81943
+ function serializeContextXmlMessage(message, options) {
81944
+ const indent = options.indent ?? " ";
81945
+ const attrs = contextMessageAttributes(message);
81946
+ const task = contextTaskBlock(message, indent);
81947
+ const attachmentLines = contextAttachmentLines(message, options, indent);
81948
+ return [
81949
+ `<message ${attrs}>`,
81950
+ task,
81951
+ ...attachmentLines,
81952
+ `${indent}Content:`,
81953
+ `${indent}<message-content>`,
81954
+ `${indent}${indent}${escapeXmlText(message.content)}`,
81955
+ `${indent}</message-content>`,
81956
+ `</message>`
81957
+ ].filter(Boolean).join(`
81958
+ `);
81959
+ }
81960
+ function contextMessageAttributes(message) {
81961
+ const target = message.targetRole ? ` to="${escapeXmlAttribute(message.targetRole)}"` : "";
81962
+ return `id="${escapeXmlAttribute(message._id)}" from="${escapeXmlAttribute(message.senderRole)}"${target} type="${escapeXmlAttribute(message.type)}"`;
81963
+ }
81964
+ function contextTaskBlock(message, indent) {
81965
+ if (!message.task)
81966
+ return "";
81967
+ return `
81968
+ ${indent}<task id="${escapeXmlAttribute(message.task._id)}" status="${escapeXmlAttribute(message.task.status)}">
81969
+ ${indent}${indent}${escapeXmlText(message.task.content)}
81970
+ ${indent}</task>`;
81971
+ }
81972
+ function contextAttachmentLines(message, options, indent) {
81973
+ if (!message.attachments)
81974
+ return [];
81975
+ return renderDeliveryAttachmentsBlock(message.attachments, attachmentContext(options)).map((line) => line ? indent + line : "");
81976
+ }
81977
+ function serializeMessage(message, options) {
81978
+ switch (options.profile) {
81979
+ case "linear":
81980
+ return serializeLinearMessage(message, options);
81981
+ case "task-origin":
81982
+ return serializeTaskOriginMessage(message);
81983
+ case "context-xml":
81984
+ return serializeContextXmlMessage(message, options);
81985
+ }
81986
+ }
81987
+ var init_serialize_message = __esm(() => {
81988
+ init_render_delivery_attachments();
81989
+ });
81990
+
81991
+ // ../../services/backend/src/domain/usecase/message/to-serializable-message.ts
81992
+ function normalizeDeliveryAttachments(input) {
81993
+ const attachments = {
81994
+ attachedTasks: input.attachedTasks?.map((item) => ({
81995
+ _id: item._id,
81996
+ content: item.content,
81997
+ status: item.status ?? item.backlogStatus ?? ""
81998
+ })),
81999
+ attachedBacklogItems: input.attachedBacklogItems?.map((item) => ({
82000
+ _id: item._id ?? item.id ?? "",
82001
+ content: item.content,
82002
+ status: item.status
82003
+ })),
82004
+ attachedMessages: input.attachedMessages,
82005
+ attachedSnippets: input.attachedSnippets
82006
+ };
82007
+ return Object.values(attachments).some((items) => items && items.length > 0) ? attachments : undefined;
82008
+ }
82009
+ function normalizeTask(input) {
82010
+ if (!input.taskId || input.taskStatus == null || input.taskContent == null)
82011
+ return;
82012
+ return { _id: input.taskId, status: input.taskStatus, content: input.taskContent };
82013
+ }
82014
+ function toSerializableMessage(input) {
82015
+ const attachments = normalizeDeliveryAttachments(input);
82016
+ return {
82017
+ _id: input._id,
82018
+ _creationTime: input._creationTime,
82019
+ senderRole: input.senderRole,
82020
+ targetRole: input.targetRole,
82021
+ type: input.type,
82022
+ content: input.content,
82023
+ ...attachments ? { attachments } : {},
82024
+ ...normalizeTask(input) ? { task: normalizeTask(input) } : {}
82025
+ };
82026
+ }
82027
+
81886
82028
  // src/commands/messages/messages-fs-service.ts
81887
82029
  import * as nodeFs2 from "node:fs/promises";
81888
82030
  function messageFilename(msg) {
@@ -81890,13 +82032,6 @@ function messageFilename(msg) {
81890
82032
  const receiver = msg.targetRole ?? "all";
81891
82033
  return `${sortPrefix}_${msg.senderRole}-to-${receiver}_${msg._id}.md`;
81892
82034
  }
81893
- function buildLinearMessageContent(msg) {
81894
- const ts = new Date(msg._creationTime).toISOString();
81895
- const receiver = msg.targetRole ? ` → ${msg.targetRole}` : "";
81896
- return `${ts} | ${msg.senderRole}${receiver}
81897
-
81898
- ${msg.content}`;
81899
- }
81900
82035
  var MessagesFsService, MessagesFsServiceLive, SORT_KEY_MAX = 9999999999999;
81901
82036
  var init_messages_fs_service = __esm(() => {
81902
82037
  init_esm();
@@ -82073,7 +82208,11 @@ var PAGE_SIZE = 50, SINCE_PAGE_SIZE = 500, ABSOLUTE_MAX = 5000, DEFAULT_LIMIT =
82073
82208
  const manifestEntries = [];
82074
82209
  for (const msg of messages) {
82075
82210
  const file = messageFilename(msg);
82076
- const content = buildLinearMessageContent(msg);
82211
+ const content = serializeMessage(toSerializableMessage(msg), {
82212
+ profile: "linear",
82213
+ chatroomId,
82214
+ role: options.role
82215
+ });
82077
82216
  const filePath = nodePath2.join(outputDir, file);
82078
82217
  yield* fs11.writeFile(filePath, content).pipe(exports_Effect.mapError((cause3) => ({
82079
82218
  _tag: "WriteFailed",
@@ -82131,6 +82270,7 @@ var PAGE_SIZE = 50, SINCE_PAGE_SIZE = 500, ABSOLUTE_MAX = 5000, DEFAULT_LIMIT =
82131
82270
  });
82132
82271
  });
82133
82272
  var init_download = __esm(() => {
82273
+ init_serialize_message();
82134
82274
  init_esm();
82135
82275
  init_messages_fs_service();
82136
82276
  init_api3();
@@ -82442,18 +82582,19 @@ __export(exports_context2, {
82442
82582
  inspectContext: () => inspectContext
82443
82583
  });
82444
82584
  async function createDefaultDeps18() {
82445
- const client4 = await getConvexClient();
82446
- return {
82447
- backend: {
82448
- mutation: (endpoint, args2) => client4.mutation(endpoint, args2),
82449
- query: (endpoint, args2) => client4.query(endpoint, args2)
82450
- },
82451
- session: {
82452
- getSessionId,
82453
- getConvexUrl,
82454
- getOtherSessionUrls
82455
- }
82456
- };
82585
+ return createConvexCommandDeps();
82586
+ }
82587
+ function requireAuthenticatedChatroom(chatroomId) {
82588
+ return exports_Effect.gen(function* () {
82589
+ const sessionId = yield* requireSessionIdEffect(() => ({
82590
+ _tag: "NotAuthenticated"
82591
+ }));
82592
+ yield* validateChatroomIdEffect(chatroomId, (id3) => ({
82593
+ _tag: "InvalidChatroomId",
82594
+ id: id3
82595
+ }));
82596
+ return sessionId;
82597
+ });
82457
82598
  }
82458
82599
  function handleContextError(err) {
82459
82600
  return exports_Effect.sync(() => {
@@ -82506,13 +82647,7 @@ async function inspectContext(chatroomId, options, deps) {
82506
82647
  }
82507
82648
  var readContextEffect = (chatroomId, options) => exports_Effect.gen(function* () {
82508
82649
  const backend2 = yield* BackendService;
82509
- const sessionId = yield* requireSessionIdEffect(() => ({
82510
- _tag: "NotAuthenticated"
82511
- }));
82512
- yield* validateChatroomIdEffect(chatroomId, (id3) => ({
82513
- _tag: "InvalidChatroomId",
82514
- id: id3
82515
- }));
82650
+ const sessionId = yield* requireAuthenticatedChatroom(chatroomId);
82516
82651
  const context5 = yield* backend2.query(api.messages.getContextForRole, {
82517
82652
  sessionId,
82518
82653
  chatroomId,
@@ -82559,47 +82694,12 @@ var readContextEffect = (chatroomId, options) => exports_Effect.gen(function* ()
82559
82694
  \uD83D\uDCAC Chat History:`);
82560
82695
  console.log("─".repeat(60));
82561
82696
  for (const message of context5.messages) {
82562
- const toAttr = message.targetRole ? ` to="${message.targetRole}"` : "";
82563
- console.log(`<message id="${message._id}" from="${message.senderRole}"${toAttr} type="${message.type}">`);
82564
- if (message.taskId) {
82565
- console.log(` Task:`);
82566
- console.log(` ID: ${message.taskId}`);
82567
- if (message.taskStatus) {
82568
- console.log(` Status: ${message.taskStatus}`);
82569
- }
82570
- if (message.taskContent) {
82571
- const safeTaskContent = sanitizeForTerminal(message.taskContent);
82572
- console.log(` Content:`);
82573
- console.log(` <task-content>`);
82574
- console.log(safeTaskContent.split(`
82575
- `).map((l) => ` ${l}`).join(`
82576
- `));
82577
- console.log(` </task-content>`);
82578
- }
82579
- }
82580
- if (message.attachedTasks && message.attachedTasks.length > 0) {
82581
- console.log(` Attachments:`);
82582
- for (const task of message.attachedTasks) {
82583
- console.log(` \uD83D\uDD39 Task ID: ${task._id}`);
82584
- console.log(` Type: Task`);
82585
- const contentLines = sanitizeForTerminal(task.content).split(`
82586
- `);
82587
- console.log(` Content:`);
82588
- console.log(` <task-content>`);
82589
- for (const line of contentLines) {
82590
- console.log(` ${line}`);
82591
- }
82592
- console.log(` </task-content>`);
82593
- }
82594
- }
82595
- console.log(` Content:`);
82596
- console.log(` <message-content>`);
82597
- const safeMessageContent = sanitizeForTerminal(message.content);
82598
- console.log(safeMessageContent.split(`
82599
- `).map((l) => ` ${l}`).join(`
82600
- `));
82601
- console.log(` </message-content>`);
82602
- console.log(`</message>`);
82697
+ const serialized = serializeMessage(toSerializableMessage(message), {
82698
+ profile: "context-xml",
82699
+ chatroomId,
82700
+ role: options.role
82701
+ });
82702
+ console.log(sanitizeForTerminal(serialized));
82603
82703
  }
82604
82704
  console.log(`
82605
82705
  ` + "═".repeat(60));
@@ -82607,13 +82707,7 @@ var readContextEffect = (chatroomId, options) => exports_Effect.gen(function* ()
82607
82707
  });
82608
82708
  }), newContextEffect = (chatroomId, options) => exports_Effect.gen(function* () {
82609
82709
  const backend2 = yield* BackendService;
82610
- const sessionId = yield* requireSessionIdEffect(() => ({
82611
- _tag: "NotAuthenticated"
82612
- }));
82613
- yield* validateChatroomIdEffect(chatroomId, (id3) => ({
82614
- _tag: "InvalidChatroomId",
82615
- id: id3
82616
- }));
82710
+ const sessionId = yield* requireAuthenticatedChatroom(chatroomId);
82617
82711
  if (!options.content || options.content.trim().length === 0) {
82618
82712
  return yield* exports_Effect.fail({ _tag: "EmptyContent" });
82619
82713
  }
@@ -82724,11 +82818,11 @@ var readContextEffect = (chatroomId, options) => exports_Effect.gen(function* ()
82724
82818
  });
82725
82819
  });
82726
82820
  var init_context2 = __esm(() => {
82821
+ init_serialize_message();
82727
82822
  init_esm();
82728
82823
  init_format_new_context_error();
82729
82824
  init_api3();
82730
- init_storage();
82731
- init_client2();
82825
+ init_create_convex_command_deps();
82732
82826
  init_services();
82733
82827
  });
82734
82828
 
@@ -82857,18 +82951,7 @@ __export(exports_artifact, {
82857
82951
  createArtifact: () => createArtifact
82858
82952
  });
82859
82953
  async function createDefaultDeps20() {
82860
- const client4 = await getConvexClient();
82861
- return {
82862
- backend: {
82863
- mutation: (endpoint, args2) => client4.mutation(endpoint, args2),
82864
- query: (endpoint, args2) => client4.query(endpoint, args2)
82865
- },
82866
- session: {
82867
- getSessionId,
82868
- getConvexUrl,
82869
- getOtherSessionUrls
82870
- }
82871
- };
82954
+ return createConvexCommandDeps();
82872
82955
  }
82873
82956
  function handleArtifactError(err) {
82874
82957
  return exports_Effect.sync(() => {
@@ -83019,8 +83102,7 @@ var createArtifactEffect = (chatroomId, options) => exports_Effect.gen(function*
83019
83102
  var init_artifact = __esm(() => {
83020
83103
  init_esm();
83021
83104
  init_api3();
83022
- init_storage();
83023
- init_client2();
83105
+ init_create_convex_command_deps();
83024
83106
  init_services();
83025
83107
  init_file_content();
83026
83108
  artifactErrorHandlers = {
@@ -98511,9 +98593,11 @@ function parseAssignedTaskSignal(raw) {
98511
98593
  return assignedTaskSignalSchema.parse(raw);
98512
98594
  }
98513
98595
  function parseAssignedTaskPresenceSignal(raw) {
98596
+ const full = assignedTaskPresenceSignalSchema.safeParse(raw);
98597
+ if (full.success)
98598
+ return full.data;
98514
98599
  const delta = assignedTaskPresenceDeltaSchema.safeParse(raw);
98515
- const hasFullWireFields = typeof raw === "object" && raw !== null && "chatroomId" in raw && "presenceUpdatedAt" in raw;
98516
- if (delta.success && !hasFullWireFields) {
98600
+ if (delta.success) {
98517
98601
  const presenceUpdatedAt = Number(delta.data.presenceKey.split(":")[0]);
98518
98602
  const resolvedAt = Number.isFinite(presenceUpdatedAt) ? presenceUpdatedAt : 0;
98519
98603
  return {
@@ -99436,11 +99520,13 @@ async function runRestartOrchestrator(deps, event) {
99436
99520
  markRestartOrchestratorInFlight(chatroomId, role, event.correlationId);
99437
99521
  try {
99438
99522
  resetRoleDeliveryState(chatroomId, role);
99523
+ await emitPhase(deps, event, "reset");
99439
99524
  await deps.agentMgr.stop({
99440
99525
  chatroomId,
99441
99526
  role,
99442
99527
  reason: "user.restart"
99443
99528
  });
99529
+ await emitPhase(deps, event, "spawn");
99444
99530
  const spawnResult = await exports_Effect.runPromise(deps.agentMgr.ensureRunning({
99445
99531
  chatroomId,
99446
99532
  role,
@@ -99454,13 +99540,17 @@ async function runRestartOrchestrator(deps, event) {
99454
99540
  await emitPhase(deps, event, "failed", spawnResult.error ?? "spawn failed");
99455
99541
  return;
99456
99542
  }
99543
+ await emitPhase(deps, event, "await_session");
99457
99544
  const harnessSessionId = await waitForHarnessSessionId(deps, event, spawnResult.pid);
99458
99545
  if (!harnessSessionId) {
99459
99546
  await emitPhase(deps, event, "failed", "harnessSessionId timeout");
99460
99547
  return;
99461
99548
  }
99462
99549
  await forceNativeWaiting(deps, event);
99550
+ await emitPhase(deps, event, "ready");
99551
+ await emitPhase(deps, event, "deliver");
99463
99552
  const deliveredTaskIds = await deliverPendingTasks(deps, event);
99553
+ await emitPhase(deps, event, "completed");
99464
99554
  await deps.session.backend.mutation(api.machines.emitRestartCompleted, {
99465
99555
  sessionId: deps.session.sessionId,
99466
99556
  machineId: deps.session.machineId,
@@ -127310,13 +127400,13 @@ import { dirname as dirname15, join as join27 } from "node:path";
127310
127400
  import { fileURLToPath as fileURLToPath7 } from "node:url";
127311
127401
  function clientDistCandidates(here) {
127312
127402
  return [
127403
+ join27(here, "client/build"),
127313
127404
  join27(here, "../client/build"),
127314
- join27(here, "../src/daemon/local-web/client/build"),
127315
- join27(here, "../../../src/daemon/local-web/client/build")
127405
+ join27(here, "../src/daemon/local-web/client/build")
127316
127406
  ];
127317
127407
  }
127318
- function resolveClientDistDir() {
127319
- const candidates = clientDistCandidates(dirname15(fileURLToPath7(import.meta.url)));
127408
+ function resolveClientDistDir(here = dirname15(fileURLToPath7(import.meta.url))) {
127409
+ const candidates = clientDistCandidates(here);
127320
127410
  for (const dir of candidates) {
127321
127411
  if (existsSync9(join27(dir, "index.html")))
127322
127412
  return dir;
@@ -127598,7 +127688,7 @@ async function startLocalWebServer(config4, deps = {}) {
127598
127688
  throw new Error(`local-web must bind to 127.0.0.1 only (got ${config4.host})`);
127599
127689
  }
127600
127690
  const streamHub = deps.streamHub ?? createStreamHub();
127601
- const clientDistDir = resolveClientDistDir();
127691
+ const clientDistDir = deps.clientDistDir ?? resolveClientDistDir();
127602
127692
  const server2 = createServer((req, res) => {
127603
127693
  if (tryServeStatic(req, res, clientDistDir))
127604
127694
  return;
@@ -128935,4 +129025,4 @@ program2.hook("preAction", async (_thisCommand, actionCommand) => {
128935
129025
  });
128936
129026
  program2.parse();
128937
129027
 
128938
- //# debugId=70FFCDEB51C1508364756E2164756E21
129028
+ //# debugId=3C5E79A2AC47FADE64756E2164756E21