@pasko70/pibo 3.1.4 → 3.2.1
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 +2 -2
- package/dist/apps/chat-ui/assets/{dist-DkpIJ_Pp.js → dist-BL4oTUrk.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BOqsX6_s.js → dist-CQF9jyQW.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BcUbdOKJ.js → dist-DI39iyXK.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-a0mykCz7.js → dist-Drv_xdGh.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-qDZ-CdlK.js → dist-f-76_fmW.js} +1 -1
- package/dist/apps/chat-ui/assets/index-BTzIdlcK.css +1 -0
- package/dist/apps/chat-ui/assets/index-CgFDCgyv.js +228 -0
- package/dist/apps/chat-ui/index.html +2 -2
- package/dist/apps/chat-vscode-web/assets/index-B-TiIWb7.js +43 -0
- package/dist/apps/chat-vscode-web/assets/{index-SluZr_-r.css → index-b18ZkEo0.css} +1 -1
- package/dist/apps/chat-vscode-web/index.html +2 -2
- package/dist/session-ui/terminalRows.js +80 -1
- package/dist/setup/cli.js +5 -5
- package/docs/project/guides/pibo-on-windows-via-wsl.md +292 -0
- package/docs/project/guides/pibo-vscode-ext-quickstart.md +287 -0
- package/docs/project/installation-profiles.md +134 -0
- package/docs/project/operations/index.md +10 -0
- package/docs/{ops → project/operations}/install-developer-host.md +19 -0
- package/docs/{ops → project/operations}/install-user-host.md +19 -0
- package/docs/{ops → project/operations}/upgrade-user-to-developer-host.md +19 -0
- package/docs/{ops → project/operations}/vscode-extension-release.md +19 -0
- package/npm-shrinkwrap.json +4 -3
- package/package.json +17 -3
- package/skills/builtin/pibo-agent-runtime-adapter/references/testing-migration-and-validation.md +3 -1
- package/skills/builtin/pibo-spec-writing/SKILL.md +110 -168
- package/skills/builtin/prd/SKILL.md +18 -0
- package/dist/apps/chat-ui/assets/index-CmqRSbBU.css +0 -1
- package/dist/apps/chat-ui/assets/index-G2ic-FSG.js +0 -228
- package/dist/apps/chat-vscode-web/assets/index-zQ1fNz5K.js +0 -43
- package/docs/README.md +0 -34
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@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-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}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-400:oklch(78.9% .154 211.53);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-900:oklch(41% .159 10.272);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-semibold:600;--tracking-wider:.05em;--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%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.z-10{z-index:10}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.-ml-20{margin-left:calc(var(--spacing) * -20)}.ml-3{margin-left:calc(var(--spacing) * 3)}.block{display:block}.flex{display:flex}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-7{height:calc(var(--spacing) * 7)}.h-full{height:100%}.min-h-0{min-height:0}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-7{width:calc(var(--spacing) * 7)}.w-full{width:100%}.max-w-\[180px\]{max-width:180px}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[\#11a4d4\]{border-color:#11a4d4}.border-rose-700{border-color:var(--color-rose-700)}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-800{border-color:var(--color-slate-800)}.bg-\[\#0a1418\]{background-color:#0a1418}.bg-\[\#0c1820\]{background-color:#0c1820}.bg-\[\#102834\]{background-color:#102834}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-900\/40{background-color:#8b083666}@supports (color:color-mix(in lab, red, red)){.bg-rose-900\/40{background-color:color-mix(in oklab, var(--color-rose-900) 40%, transparent)}}.bg-slate-500{background-color:var(--color-slate-500)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.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)}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.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-\[10px\]{font-size:10px}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-rose-200{color:var(--color-rose-200)}.text-rose-300{color:var(--color-rose-300)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.hover\:border-\[\#11a4d4\]:hover{border-color:#11a4d4}.hover\:border-slate-500:hover{border-color:var(--color-slate-500)}.hover\:bg-\[\#102834\]:hover{background-color:#102834}.hover\:bg-rose-900\/30:hover{background-color:#8b08364d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-rose-900\/30:hover{background-color:color-mix(in oklab, var(--color-rose-900) 30%, transparent)}}.hover\:text-\[\#11a4d4\]:hover{color:#11a4d4}.hover\:text-slate-200:hover{color:var(--color-slate-200)}}}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;scrollbar-color:#334155 #101d22}html,body,#root{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#101d22;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Helvetica Neue,sans-serif}code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.session-signal{display:inline-block;box-shadow:0 0 #64748b00}.session-signal-idle{background:#475569}.session-signal-running{background:#0bda57;animation:1.9s ease-in-out infinite session-signal-slow-pulse}.session-signal-unread{background:#38bdf8;animation:.85s ease-in-out infinite session-signal-fast-pulse}.session-signal-error{background:#ef4444;animation:.55s ease-in-out infinite session-signal-error-blink}@keyframes session-signal-slow-pulse{0%,to{transform:scale(.95);box-shadow:0 0 #0bda5738}50%{transform:scale(1.15);box-shadow:0 0 0 5px #0bda5700}}@keyframes session-signal-fast-pulse{0%,to{transform:scale(.9);box-shadow:0 0 #38bdf861}50%{transform:scale(1.25);box-shadow:0 0 0 6px #38bdf800}}@keyframes session-signal-error-blink{0%,to{opacity:1;transform:scale(1.15);box-shadow:0 0 #ef444473}50%{opacity:.45;transform:scale(.9);box-shadow:0 0 0 6px #ef444400}}.compact-terminal-working-scramble{color:#737373;letter-spacing:-.02em;vertical-align:baseline;width:10ch;font-size:.92em;display:inline-flex}.compact-terminal-working-scramble>span{width:1ch;display:inline-block}.compact-terminal-working-scramble-active{color:#a3a3a3;text-shadow:0 0 4px #a3a3a324}@media (prefers-reduced-motion:reduce){.compact-terminal-working-scramble-active{color:#737373;text-shadow:none}}.model-response-markdown{color:#dbe7e8;overflow-wrap:anywhere}.model-response-markdown>:first-child{margin-top:0}.model-response-markdown>:last-child{margin-bottom:0}.model-response-markdown p{margin:0 0 .85rem}.model-response-markdown h1,.model-response-markdown h2,.model-response-markdown h3,.model-response-markdown h4{color:#f8fafc;letter-spacing:0;margin:1.1rem 0 .45rem;font-weight:700;line-height:1.25}.model-response-markdown h1{font-size:1.15rem}.model-response-markdown h2{font-size:1.05rem}.model-response-markdown h3,.model-response-markdown h4{font-size:.95rem}.model-response-markdown a{color:#42c7ec;text-underline-offset:3px;-webkit-text-decoration:underline #42c7ec73;text-decoration:underline #42c7ec73}.model-response-markdown a:hover{color:#7dd3fc;text-decoration-color:currentColor}.model-response-markdown strong{color:#f8fafc;font-weight:700}.model-response-markdown del{color:#94a3b8}.model-response-markdown ul,.model-response-markdown ol{margin:0 0 .95rem;padding-left:1.25rem;list-style-position:outside}.model-response-markdown ul{list-style-type:disc}.model-response-markdown ol{list-style-type:decimal}.model-response-markdown ul ul,.model-response-markdown ol ul{margin:.25rem 0;list-style-type:circle}.model-response-markdown ul ol,.model-response-markdown ol ol{margin:.25rem 0;list-style-type:lower-alpha}.model-response-markdown li{margin:.25rem 0;padding-left:.15rem}.model-response-markdown li::marker{color:#11a4d4}.model-response-markdown blockquote{color:#cbd5e1;background:#0bda5712;border-left:2px solid #0bda57;margin:.95rem 0;padding:.55rem .85rem}.model-response-markdown hr{border:0;border-top:1px solid #334155cc;margin:1rem 0}.model-response-markdown table{border-collapse:collapse;border:1px solid #334155e6;border-radius:3px;width:max-content;max-width:100%;margin:1rem 0;font-size:.82rem;display:block;overflow-x:auto}.model-response-markdown th,.model-response-markdown td{text-align:left;vertical-align:top;border:1px solid #334155cc;padding:.45rem .6rem}.model-response-markdown th{color:#e2f6fb;background:#11a4d41f;font-weight:700}.model-response-markdown td{color:#dbe7e8;background:#0e11166b}.model-response-markdown :not(pre)>code{color:#11a4d4;background:#111a1f;border:1px solid #e2e8f02e;border-radius:3px;padding:.1rem .3rem;font-size:.86em}.model-response-markdown pre{color:#d1d5db;background:#0e1116;border:1px solid #334155e6;border-left:2px solid #0bda57;border-radius:2px;margin:.95rem 0;padding:.85rem;font-size:.78rem;line-height:1.55;overflow-x:auto}.model-response-markdown pre code{color:inherit;font-size:inherit;background:0 0}.compact-terminal-markdown{color:#d4d4d4;overflow-wrap:anywhere;word-break:break-word;font-size:12px;line-height:1.45}.compact-terminal-markdown>:first-child{margin-top:0}.compact-terminal-markdown>:last-child{margin-bottom:0}.compact-terminal-markdown p{margin:0 0 .55rem}.compact-terminal-reasoning{color:#c7b27a}.compact-terminal-reasoning p{margin-bottom:.35rem}.compact-terminal-reasoning li::marker{color:#f59e0b}.compact-terminal-markdown h1,.compact-terminal-markdown h2,.compact-terminal-markdown h3,.compact-terminal-markdown h4{color:#f3f4f6;margin:.8rem 0 .35rem;font-size:.95rem;line-height:1.3}.compact-terminal-markdown a{color:#38bdf8}.compact-terminal-markdown ul,.compact-terminal-markdown ol{margin:0 0 .55rem;padding-left:1.35rem;list-style-position:outside}.compact-terminal-markdown ul{list-style-type:disc}.compact-terminal-markdown ol{list-style-type:decimal}.compact-terminal-markdown ul ul,.compact-terminal-markdown ol ul{margin:.2rem 0;list-style-type:circle}.compact-terminal-markdown ul ol,.compact-terminal-markdown ol ol{margin:.2rem 0;list-style-type:lower-alpha}.compact-terminal-markdown li{margin:.15rem 0;padding-left:.1rem}.compact-terminal-markdown li::marker{color:#38bdf8}.compact-terminal-markdown li>p{margin:.15rem 0}.compact-terminal-markdown input[type=checkbox]{vertical-align:-.12em;accent-color:#38bdf8;margin:0 .45rem 0 -1.15rem}.compact-terminal-markdown blockquote{color:#d4d4d4;background:#38bdf814;border-left:1px solid #38bdf8;margin:.6rem 0;padding:.45rem .7rem}.compact-terminal-markdown :not(pre)>code{color:#38bdf8;background:#161616;border:1px solid #5a5a5a99;border-radius:2px;padding:.05rem .25rem}.compact-terminal-markdown pre{color:#d4d4d4;background:#111;border:1px solid #2a2a2a;max-width:100%;margin:.65rem 0;padding:.65rem .8rem;font-size:.78rem;line-height:1.5;overflow-x:auto}.compact-terminal-markdown table{border-collapse:collapse;max-width:100%;display:block;overflow-x:auto}.compact-terminal-markdown th,.compact-terminal-markdown td{vertical-align:top;border:1px solid #2a2a2a;padding:.25rem .4rem}.compact-terminal-markdown th{color:#f3f4f6;background:#161616}.compact-terminal-markdown .token.comment,.model-response-markdown .token.comment,.compact-terminal-markdown .token.prolog,.model-response-markdown .token.prolog,.compact-terminal-markdown .token.doctype,.model-response-markdown .token.doctype,.compact-terminal-markdown .token.cdata,.model-response-markdown .token.cdata{color:#737373}.compact-terminal-markdown .token.punctuation,.model-response-markdown .token.punctuation{color:#94a3b8}.compact-terminal-markdown .token.property,.model-response-markdown .token.property,.compact-terminal-markdown .token.tag,.model-response-markdown .token.tag,.compact-terminal-markdown .token.boolean,.model-response-markdown .token.boolean,.compact-terminal-markdown .token.number,.model-response-markdown .token.number,.compact-terminal-markdown .token.constant,.model-response-markdown .token.constant,.compact-terminal-markdown .token.symbol,.model-response-markdown .token.symbol{color:#60a5fa}.compact-terminal-markdown .token.selector,.model-response-markdown .token.selector,.compact-terminal-markdown .token.attr-name,.model-response-markdown .token.attr-name,.compact-terminal-markdown .token.string,.model-response-markdown .token.string,.compact-terminal-markdown .token.char,.model-response-markdown .token.char,.compact-terminal-markdown .token.builtin,.model-response-markdown .token.builtin{color:#22c55e}.compact-terminal-markdown .token.operator,.model-response-markdown .token.operator,.compact-terminal-markdown .token.entity,.model-response-markdown .token.entity,.compact-terminal-markdown .token.url,.model-response-markdown .token.url,.compact-terminal-markdown .token.variable,.model-response-markdown .token.variable{color:#facc15}.compact-terminal-markdown .token.atrule,.model-response-markdown .token.atrule,.compact-terminal-markdown .token.attr-value,.model-response-markdown .token.attr-value,.compact-terminal-markdown .token.function,.model-response-markdown .token.function,.compact-terminal-markdown .token.class-name,.model-response-markdown .token.class-name{color:#38bdf8}.compact-terminal-markdown .token.keyword,.model-response-markdown .token.keyword{color:#d946ef}.compact-terminal-markdown .token.regex,.model-response-markdown .token.regex,.compact-terminal-markdown .token.important,.model-response-markdown .token.important{color:#fb923c}.compact-terminal-markdown .token.deleted,.model-response-markdown .token.deleted{color:#ef4444}.compact-terminal-markdown .token.inserted,.model-response-markdown .token.inserted{color:#22c55e}.compact-terminal-json{--w-rjv-background-color:transparent;--w-rjv-border-left:#2a2a2a;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.compact-terminal-function-call{overflow-wrap:anywhere;word-break:break-word}.compact-terminal-json-toggle{font:inherit;cursor:pointer;background:0 0;border:0;margin:0;padding:0}.compact-terminal-json-toggle:hover{text-underline-offset:2px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.compact-terminal-json-caret{color:#a3a3a3;width:.75em;text-decoration:none;display:inline-block}.context-files-view{grid-template-columns:minmax(0,1fr);height:100%;min-height:0;display:grid;position:relative;overflow:hidden}.context-files-view--panel-open{grid-template-columns:minmax(0,1fr) 300px}.context-files-workspace,.context-files-panel{min-height:0}.context-files-editor-frame .markdown-editor-shell{border:0;width:100%;height:100%;min-height:0}.workflow-prompt-editor-frame .markdown-editor-shell{width:100%;min-height:28rem}.context-files-panel-backdrop{display:none}@media (width<=1180px){.context-files-view--panel-open{grid-template-columns:minmax(0,1fr)}.context-files-panel{z-index:12;border-left-color:#334155;width:min(340px,100% - 1rem);position:absolute;inset:0 0 0 auto;box-shadow:-18px 0 48px #00000080}.context-files-panel-backdrop{z-index:11;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);cursor:default;background:#030a0da3;border:0;display:block;position:absolute;inset:0}}@media (width<=640px){.context-files-panel{width:100%}}@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}
|
|
2
|
+
@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-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}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-400:oklch(78.9% .154 211.53);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-900:oklch(41% .159 10.272);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-semibold:600;--tracking-wider:.05em;--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%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.z-10{z-index:10}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.-ml-20{margin-left:calc(var(--spacing) * -20)}.ml-3{margin-left:calc(var(--spacing) * 3)}.block{display:block}.flex{display:flex}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-7{height:calc(var(--spacing) * 7)}.h-full{height:100%}.min-h-0{min-height:0}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-7{width:calc(var(--spacing) * 7)}.w-full{width:100%}.max-w-\[180px\]{max-width:180px}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[\#11a4d4\]{border-color:#11a4d4}.border-rose-700{border-color:var(--color-rose-700)}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-800{border-color:var(--color-slate-800)}.bg-\[\#0a1418\]{background-color:#0a1418}.bg-\[\#0c1820\]{background-color:#0c1820}.bg-\[\#102834\]{background-color:#102834}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-900\/40{background-color:#8b083666}@supports (color:color-mix(in lab, red, red)){.bg-rose-900\/40{background-color:color-mix(in oklab, var(--color-rose-900) 40%, transparent)}}.bg-slate-500{background-color:var(--color-slate-500)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.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)}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.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-\[10px\]{font-size:10px}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-rose-200{color:var(--color-rose-200)}.text-rose-300{color:var(--color-rose-300)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.hover\:border-\[\#11a4d4\]:hover{border-color:#11a4d4}.hover\:border-slate-500:hover{border-color:var(--color-slate-500)}.hover\:bg-\[\#102834\]:hover{background-color:#102834}.hover\:bg-rose-900\/30:hover{background-color:#8b08364d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-rose-900\/30:hover{background-color:color-mix(in oklab, var(--color-rose-900) 30%, transparent)}}.hover\:text-\[\#11a4d4\]:hover{color:#11a4d4}.hover\:text-slate-200:hover{color:var(--color-slate-200)}}}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;scrollbar-color:#334155 #101d22}html,body,#root{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#101d22;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Helvetica Neue,sans-serif}code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.session-signal{display:inline-block;box-shadow:0 0 #64748b00}.session-signal-idle{background:#475569}.session-signal-running{background:#0bda57;animation:1.9s ease-in-out infinite session-signal-slow-pulse}.session-signal-unread{background:#38bdf8;animation:.85s ease-in-out infinite session-signal-fast-pulse}.session-signal-error{background:#ef4444;animation:.55s ease-in-out infinite session-signal-error-blink}@keyframes session-signal-slow-pulse{0%,to{transform:scale(.95);box-shadow:0 0 #0bda5738}50%{transform:scale(1.15);box-shadow:0 0 0 5px #0bda5700}}@keyframes session-signal-fast-pulse{0%,to{transform:scale(.9);box-shadow:0 0 #38bdf861}50%{transform:scale(1.25);box-shadow:0 0 0 6px #38bdf800}}@keyframes session-signal-error-blink{0%,to{opacity:1;transform:scale(1.15);box-shadow:0 0 #ef444473}50%{opacity:.45;transform:scale(.9);box-shadow:0 0 0 6px #ef444400}}@keyframes desktop-tab-drop-gap-enter{0%{opacity:0;width:0}to{opacity:1;width:.5rem}}.desktop-tab-drop-gap{animation:.12s ease-out both desktop-tab-drop-gap-enter}@media (prefers-reduced-motion:reduce){.desktop-tab-drop-gap{animation:none}}.compact-terminal-working-scramble{color:#737373;letter-spacing:-.02em;vertical-align:baseline;width:10ch;font-size:.92em;display:inline-flex}.compact-terminal-working-scramble>span{width:1ch;display:inline-block}.compact-terminal-working-scramble-active{color:#a3a3a3;text-shadow:0 0 4px #a3a3a324}@media (prefers-reduced-motion:reduce){.compact-terminal-working-scramble-active{color:#737373;text-shadow:none}}.model-response-markdown{color:#dbe7e8;overflow-wrap:anywhere}.model-response-markdown>:first-child{margin-top:0}.model-response-markdown>:last-child{margin-bottom:0}.model-response-markdown p{margin:0 0 .85rem}.model-response-markdown h1,.model-response-markdown h2,.model-response-markdown h3,.model-response-markdown h4{color:#f8fafc;letter-spacing:0;margin:1.1rem 0 .45rem;font-weight:700;line-height:1.25}.model-response-markdown h1{font-size:1.15rem}.model-response-markdown h2{font-size:1.05rem}.model-response-markdown h3,.model-response-markdown h4{font-size:.95rem}.model-response-markdown a{color:#42c7ec;text-underline-offset:3px;-webkit-text-decoration:underline #42c7ec73;text-decoration:underline #42c7ec73}.model-response-markdown a:hover{color:#7dd3fc;text-decoration-color:currentColor}.model-response-markdown strong{color:#f8fafc;font-weight:700}.model-response-markdown del{color:#94a3b8}.model-response-markdown ul,.model-response-markdown ol{margin:0 0 .95rem;padding-left:1.25rem;list-style-position:outside}.model-response-markdown ul{list-style-type:disc}.model-response-markdown ol{list-style-type:decimal}.model-response-markdown ul ul,.model-response-markdown ol ul{margin:.25rem 0;list-style-type:circle}.model-response-markdown ul ol,.model-response-markdown ol ol{margin:.25rem 0;list-style-type:lower-alpha}.model-response-markdown li{margin:.25rem 0;padding-left:.15rem}.model-response-markdown li::marker{color:#11a4d4}.model-response-markdown blockquote{color:#cbd5e1;background:#0bda5712;border-left:2px solid #0bda57;margin:.95rem 0;padding:.55rem .85rem}.model-response-markdown hr{border:0;border-top:1px solid #334155cc;margin:1rem 0}.model-response-markdown table{border-collapse:collapse;border:1px solid #334155e6;border-radius:3px;width:max-content;max-width:100%;margin:1rem 0;font-size:.82rem;display:block;overflow-x:auto}.model-response-markdown th,.model-response-markdown td{text-align:left;vertical-align:top;border:1px solid #334155cc;padding:.45rem .6rem}.model-response-markdown th{color:#e2f6fb;background:#11a4d41f;font-weight:700}.model-response-markdown td{color:#dbe7e8;background:#0e11166b}.model-response-markdown :not(pre)>code{color:#11a4d4;background:#111a1f;border:1px solid #e2e8f02e;border-radius:3px;padding:.1rem .3rem;font-size:.86em}.model-response-markdown pre{color:#d1d5db;background:#0e1116;border:1px solid #334155e6;border-left:2px solid #0bda57;border-radius:2px;margin:.95rem 0;padding:.85rem;font-size:.78rem;line-height:1.55;overflow-x:auto}.model-response-markdown pre code{color:inherit;font-size:inherit;background:0 0}.compact-terminal-markdown{color:#d4d4d4;overflow-wrap:anywhere;word-break:break-word;font-size:12px;line-height:1.45}.compact-terminal-markdown>:first-child{margin-top:0}.compact-terminal-markdown>:last-child{margin-bottom:0}.compact-terminal-markdown p{margin:0 0 .55rem}.compact-terminal-reasoning{color:#c7b27a}.compact-terminal-reasoning p{margin-bottom:.35rem}.compact-terminal-reasoning li::marker{color:#f59e0b}.compact-terminal-markdown h1,.compact-terminal-markdown h2,.compact-terminal-markdown h3,.compact-terminal-markdown h4{color:#f3f4f6;margin:.8rem 0 .35rem;font-size:.95rem;line-height:1.3}.compact-terminal-markdown a{color:#38bdf8}.compact-terminal-markdown ul,.compact-terminal-markdown ol{margin:0 0 .55rem;padding-left:1.35rem;list-style-position:outside}.compact-terminal-markdown ul{list-style-type:disc}.compact-terminal-markdown ol{list-style-type:decimal}.compact-terminal-markdown ul ul,.compact-terminal-markdown ol ul{margin:.2rem 0;list-style-type:circle}.compact-terminal-markdown ul ol,.compact-terminal-markdown ol ol{margin:.2rem 0;list-style-type:lower-alpha}.compact-terminal-markdown li{margin:.15rem 0;padding-left:.1rem}.compact-terminal-markdown li::marker{color:#38bdf8}.compact-terminal-markdown li>p{margin:.15rem 0}.compact-terminal-markdown input[type=checkbox]{vertical-align:-.12em;accent-color:#38bdf8;margin:0 .45rem 0 -1.15rem}.compact-terminal-markdown blockquote{color:#d4d4d4;background:#38bdf814;border-left:1px solid #38bdf8;margin:.6rem 0;padding:.45rem .7rem}.compact-terminal-markdown :not(pre)>code{color:#38bdf8;background:#161616;border:1px solid #5a5a5a99;border-radius:2px;padding:.05rem .25rem}.compact-terminal-markdown pre{color:#d4d4d4;background:#111;border:1px solid #2a2a2a;max-width:100%;margin:.65rem 0;padding:.65rem .8rem;font-size:.78rem;line-height:1.5;overflow-x:auto}.compact-terminal-markdown table{border-collapse:collapse;max-width:100%;display:block;overflow-x:auto}.compact-terminal-markdown th,.compact-terminal-markdown td{vertical-align:top;border:1px solid #2a2a2a;padding:.25rem .4rem}.compact-terminal-markdown th{color:#f3f4f6;background:#161616}.compact-terminal-markdown .token.comment,.model-response-markdown .token.comment,.compact-terminal-markdown .token.prolog,.model-response-markdown .token.prolog,.compact-terminal-markdown .token.doctype,.model-response-markdown .token.doctype,.compact-terminal-markdown .token.cdata,.model-response-markdown .token.cdata{color:#737373}.compact-terminal-markdown .token.punctuation,.model-response-markdown .token.punctuation{color:#94a3b8}.compact-terminal-markdown .token.property,.model-response-markdown .token.property,.compact-terminal-markdown .token.tag,.model-response-markdown .token.tag,.compact-terminal-markdown .token.boolean,.model-response-markdown .token.boolean,.compact-terminal-markdown .token.number,.model-response-markdown .token.number,.compact-terminal-markdown .token.constant,.model-response-markdown .token.constant,.compact-terminal-markdown .token.symbol,.model-response-markdown .token.symbol{color:#60a5fa}.compact-terminal-markdown .token.selector,.model-response-markdown .token.selector,.compact-terminal-markdown .token.attr-name,.model-response-markdown .token.attr-name,.compact-terminal-markdown .token.string,.model-response-markdown .token.string,.compact-terminal-markdown .token.char,.model-response-markdown .token.char,.compact-terminal-markdown .token.builtin,.model-response-markdown .token.builtin{color:#22c55e}.compact-terminal-markdown .token.operator,.model-response-markdown .token.operator,.compact-terminal-markdown .token.entity,.model-response-markdown .token.entity,.compact-terminal-markdown .token.url,.model-response-markdown .token.url,.compact-terminal-markdown .token.variable,.model-response-markdown .token.variable{color:#facc15}.compact-terminal-markdown .token.atrule,.model-response-markdown .token.atrule,.compact-terminal-markdown .token.attr-value,.model-response-markdown .token.attr-value,.compact-terminal-markdown .token.function,.model-response-markdown .token.function,.compact-terminal-markdown .token.class-name,.model-response-markdown .token.class-name{color:#38bdf8}.compact-terminal-markdown .token.keyword,.model-response-markdown .token.keyword{color:#d946ef}.compact-terminal-markdown .token.regex,.model-response-markdown .token.regex,.compact-terminal-markdown .token.important,.model-response-markdown .token.important{color:#fb923c}.compact-terminal-markdown .token.deleted,.model-response-markdown .token.deleted{color:#ef4444}.compact-terminal-markdown .token.inserted,.model-response-markdown .token.inserted{color:#22c55e}.compact-terminal-json{--w-rjv-background-color:transparent;--w-rjv-border-left:#2a2a2a;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.compact-terminal-function-call{overflow-wrap:anywhere;word-break:break-word}.compact-terminal-json-toggle{font:inherit;cursor:pointer;background:0 0;border:0;margin:0;padding:0}.compact-terminal-json-toggle:hover{text-underline-offset:2px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.compact-terminal-json-caret{color:#a3a3a3;width:.75em;text-decoration:none;display:inline-block}.context-files-view{grid-template-columns:minmax(0,1fr);height:100%;min-height:0;display:grid;position:relative;overflow:hidden}.context-files-view--panel-open{grid-template-columns:minmax(0,1fr) 300px}.context-files-workspace,.context-files-panel{min-height:0}.context-files-editor-frame .markdown-editor-shell{border:0;width:100%;height:100%;min-height:0}.workflow-prompt-editor-frame .markdown-editor-shell{width:100%;min-height:28rem}.context-files-panel-backdrop{display:none}@media (width<=1180px){.context-files-view--panel-open{grid-template-columns:minmax(0,1fr)}.context-files-panel{z-index:12;border-left-color:#334155;width:min(340px,100% - 1rem);position:absolute;inset:0 0 0 auto;box-shadow:-18px 0 48px #00000080}.context-files-panel-backdrop{z-index:11;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);cursor:default;background:#030a0da3;border:0;display:block;position:absolute;inset:0}}@media (width<=640px){.context-files-panel{width:100%}}@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}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<meta name="theme-color" content="#101d22" />
|
|
7
7
|
<title>Pibo</title>
|
|
8
|
-
<script type="module" crossorigin src="/apps/chat-vscode/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/apps/chat-vscode/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/apps/chat-vscode/assets/index-B-TiIWb7.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/apps/chat-vscode/assets/index-b18ZkEo0.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
|
@@ -4,6 +4,7 @@ import { terminalTextValue } from "./terminalValue.js";
|
|
|
4
4
|
export const MAX_COMPACT_TERMINAL_IMAGE_PREVIEWS = 20;
|
|
5
5
|
export const COMPACT_TERMINAL_OUTPUT_PREVIEW_LINES = 5;
|
|
6
6
|
export const COMPACT_TERMINAL_EXPLORING_PREVIEW_LINES = 6;
|
|
7
|
+
const NATIVE_HISTORY_ASSISTANT_ECHO_MAX_SKEW_MS = 1_000;
|
|
7
8
|
const CODEX_COMPATIBLE_TOOL_LABELS = {
|
|
8
9
|
browser_use_open_tabs: "browser_use.open_tabs",
|
|
9
10
|
browser_use_take_screenshot: "browser_use.take_screenshot",
|
|
@@ -227,7 +228,85 @@ function reconcileConceptualRowCandidates(candidates) {
|
|
|
227
228
|
},
|
|
228
229
|
};
|
|
229
230
|
}
|
|
230
|
-
return reconciled;
|
|
231
|
+
return reconcileNativeHistoryAssistantEchoes(reconciled);
|
|
232
|
+
}
|
|
233
|
+
// Large native histories intentionally keep fail-closed fallback identities. Collapse only
|
|
234
|
+
// an unambiguous, near-simultaneous event-log echo without changing the trace identity model.
|
|
235
|
+
function reconcileNativeHistoryAssistantEchoes(candidates) {
|
|
236
|
+
const groups = new Map();
|
|
237
|
+
for (let index = 0; index < candidates.length; index += 1) {
|
|
238
|
+
const row = candidates[index].row;
|
|
239
|
+
const source = isCanonicalEventAssistant(row)
|
|
240
|
+
? "canonical"
|
|
241
|
+
: isNativeHistoryAssistantFallback(row)
|
|
242
|
+
? "fallback"
|
|
243
|
+
: undefined;
|
|
244
|
+
const partIndex = assistantPartIndex(row.id);
|
|
245
|
+
if (!source || partIndex === undefined || typeof row.output !== "string")
|
|
246
|
+
continue;
|
|
247
|
+
const key = `${partIndex}\0${row.output}`;
|
|
248
|
+
const group = groups.get(key) ?? { canonical: [], fallback: [] };
|
|
249
|
+
group[source].push(index);
|
|
250
|
+
groups.set(key, group);
|
|
251
|
+
}
|
|
252
|
+
const next = [...candidates];
|
|
253
|
+
const removed = new Set();
|
|
254
|
+
for (const group of groups.values()) {
|
|
255
|
+
if (group.canonical.length !== 1 || group.fallback.length !== 1)
|
|
256
|
+
continue;
|
|
257
|
+
const canonicalIndex = group.canonical[0];
|
|
258
|
+
const fallbackIndex = group.fallback[0];
|
|
259
|
+
const canonical = next[canonicalIndex];
|
|
260
|
+
const fallback = next[fallbackIndex];
|
|
261
|
+
if (!nativeHistoryAssistantEchoTimestampsMatch(canonical.row, fallback.row))
|
|
262
|
+
continue;
|
|
263
|
+
next[canonicalIndex] = mergeNativeHistoryAssistantEcho(canonical, fallback);
|
|
264
|
+
removed.add(fallbackIndex);
|
|
265
|
+
}
|
|
266
|
+
return next.filter((_, index) => !removed.has(index));
|
|
267
|
+
}
|
|
268
|
+
function mergeNativeHistoryAssistantEcho(canonical, fallback) {
|
|
269
|
+
return {
|
|
270
|
+
...fallback,
|
|
271
|
+
...canonical,
|
|
272
|
+
turnId: canonical.turnId ?? fallback.turnId,
|
|
273
|
+
row: {
|
|
274
|
+
...fallback.row,
|
|
275
|
+
...canonical.row,
|
|
276
|
+
sourceNodeIds: [...new Set([...canonical.row.sourceNodeIds, ...fallback.row.sourceNodeIds])],
|
|
277
|
+
completedAt: canonical.row.completedAt ?? fallback.row.completedAt,
|
|
278
|
+
durationMs: canonical.row.durationMs ?? fallback.row.durationMs,
|
|
279
|
+
payloadRefs: { ...fallback.row.payloadRefs, ...canonical.row.payloadRefs },
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
function isCanonicalEventAssistant(row) {
|
|
284
|
+
const eventId = row.eventId;
|
|
285
|
+
return row.kind === "message.assistant"
|
|
286
|
+
&& row.status === "done"
|
|
287
|
+
&& row.orderSource === "event-log"
|
|
288
|
+
&& eventId !== undefined
|
|
289
|
+
&& !eventId.startsWith("native-history-group:");
|
|
290
|
+
}
|
|
291
|
+
function isNativeHistoryAssistantFallback(row) {
|
|
292
|
+
return row.kind === "message.assistant"
|
|
293
|
+
&& row.status === "done"
|
|
294
|
+
&& row.orderSource === "transcript"
|
|
295
|
+
&& row.eventId?.startsWith("native-history-group:") === true;
|
|
296
|
+
}
|
|
297
|
+
function nativeHistoryAssistantEchoTimestampsMatch(canonical, fallback) {
|
|
298
|
+
const canonicalAt = Date.parse(canonical.completedAt ?? canonical.startedAt ?? "");
|
|
299
|
+
const fallbackAt = Date.parse(fallback.completedAt ?? fallback.startedAt ?? "");
|
|
300
|
+
return Number.isFinite(canonicalAt)
|
|
301
|
+
&& Number.isFinite(fallbackAt)
|
|
302
|
+
&& Math.abs(canonicalAt - fallbackAt) <= NATIVE_HISTORY_ASSISTANT_ECHO_MAX_SKEW_MS;
|
|
303
|
+
}
|
|
304
|
+
function assistantPartIndex(rowId) {
|
|
305
|
+
const match = rowId.match(/:assistant:(\d+)$/);
|
|
306
|
+
if (!match)
|
|
307
|
+
return undefined;
|
|
308
|
+
const index = Number(match[1]);
|
|
309
|
+
return Number.isSafeInteger(index) ? index : undefined;
|
|
231
310
|
}
|
|
232
311
|
function mergeImagePreviews(existing, candidate) {
|
|
233
312
|
if (!existing?.length)
|
package/dist/setup/cli.js
CHANGED
|
@@ -128,7 +128,7 @@ export function createUserHostSetupPlan(options = {}) {
|
|
|
128
128
|
if (!options.domain)
|
|
129
129
|
warnings.push("No production domain was provided; generated Caddy/Auth examples use placeholders.");
|
|
130
130
|
if (process.platform === "win32" && !isWsl()) {
|
|
131
|
-
warnings.push("Pibo host setup targets Linux. Native Windows is not supported. Install WSL2 (https://aka.ms/wsl) and run setup inside the WSL distribution. See docs/guides/pibo-on-windows-via-wsl.md.");
|
|
131
|
+
warnings.push("Pibo host setup targets Linux. Native Windows is not supported. Install WSL2 (https://aka.ms/wsl) and run setup inside the WSL distribution. See docs/project/guides/pibo-on-windows-via-wsl.md.");
|
|
132
132
|
}
|
|
133
133
|
const generatedFiles = [
|
|
134
134
|
{
|
|
@@ -201,7 +201,7 @@ export function createDeveloperHostSetupPlan(options = {}) {
|
|
|
201
201
|
if (!options.prodDomain || !options.devDomain)
|
|
202
202
|
warnings.push("Production and dev domains should both be configured before requesting HTTPS certificates.");
|
|
203
203
|
if (process.platform === "win32" && !isWsl()) {
|
|
204
|
-
warnings.push("Pibo developer-host setup targets Linux. Native Windows is not supported. Install WSL2 (https://aka.ms/wsl) and run setup inside the WSL distribution. See docs/guides/pibo-on-windows-via-wsl.md.");
|
|
204
|
+
warnings.push("Pibo developer-host setup targets Linux. Native Windows is not supported. Install WSL2 (https://aka.ms/wsl) and run setup inside the WSL distribution. See docs/project/guides/pibo-on-windows-via-wsl.md.");
|
|
205
205
|
}
|
|
206
206
|
const generatedFiles = [
|
|
207
207
|
{
|
|
@@ -496,13 +496,13 @@ async function createDoctorStatus(options) {
|
|
|
496
496
|
if (wslInfo.isWsl) {
|
|
497
497
|
const versionLabel = wslInfo.version ? `WSL${wslInfo.version}` : "WSL";
|
|
498
498
|
const distroLabel = wslInfo.distro ? ` (${wslInfo.distro})` : "";
|
|
499
|
-
checks.push({ name: "platform.wsl", status: "ok", detail: `Running inside ${versionLabel}${distroLabel}; Pibo is fully supported here. See docs/guides/pibo-on-windows-via-wsl.md.` });
|
|
499
|
+
checks.push({ name: "platform.wsl", status: "ok", detail: `Running inside ${versionLabel}${distroLabel}; Pibo is fully supported here. See docs/project/guides/pibo-on-windows-via-wsl.md.` });
|
|
500
500
|
}
|
|
501
501
|
else if (process.platform === "win32") {
|
|
502
502
|
checks.push({
|
|
503
503
|
name: "platform.wsl",
|
|
504
504
|
status: "fail",
|
|
505
|
-
detail: "Native Windows is not supported. Install WSL2 (https://aka.ms/wsl) and run Pibo inside the WSL distribution. See docs/guides/pibo-on-windows-via-wsl.md.",
|
|
505
|
+
detail: "Native Windows is not supported. Install WSL2 (https://aka.ms/wsl) and run Pibo inside the WSL distribution. See docs/project/guides/pibo-on-windows-via-wsl.md.",
|
|
506
506
|
});
|
|
507
507
|
}
|
|
508
508
|
checks.push(...swapCheck(options.minSwapGb));
|
|
@@ -610,7 +610,7 @@ async function createDoctorStatus(options) {
|
|
|
610
610
|
recommendations.push("Browser-Use and Agent-Browser work directly under WSLg on Windows 11. On Windows 10, install an X server (e.g. VcXsrv) and export DISPLAY=:0 inside WSL.");
|
|
611
611
|
}
|
|
612
612
|
else if (process.platform === "win32") {
|
|
613
|
-
recommendations.push("Pibo does not run natively on Windows. Install WSL2 with `wsl --install` and follow docs/guides/pibo-on-windows-via-wsl.md.");
|
|
613
|
+
recommendations.push("Pibo does not run natively on Windows. Install WSL2 with `wsl --install` and follow docs/project/guides/pibo-on-windows-via-wsl.md.");
|
|
614
614
|
}
|
|
615
615
|
return {
|
|
616
616
|
node: process.versions.node,
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "Guide"
|
|
3
|
+
title: "Pibo on Windows via WSL"
|
|
4
|
+
description: "Guides Windows users through installing Pibo and the VS Code extension inside WSL2."
|
|
5
|
+
tags: ["installation", "windows", "wsl", "vscode"]
|
|
6
|
+
status: "draft"
|
|
7
|
+
authority: "directive"
|
|
8
|
+
generated:
|
|
9
|
+
by: "openai/codex"
|
|
10
|
+
at: "2026-08-30T15:47:50Z"
|
|
11
|
+
sources:
|
|
12
|
+
- id: "foundation-relocation-source"
|
|
13
|
+
resource: "https://github.com/Pascapone/pibo/blob/2aef244301f5d181624662fdad53e18e83e80bd9/docs/guides/pibo-on-windows-via-wsl.md"
|
|
14
|
+
title: "Original byte-preserved Pibo on Windows via WSL guide"
|
|
15
|
+
commit: "2aef244301f5d181624662fdad53e18e83e80bd9"
|
|
16
|
+
path: "docs/guides/pibo-on-windows-via-wsl.md"
|
|
17
|
+
sha256: "132f00469edcfa8915525bff4d0c9d82573ae53868a74db81d5224d354ce1d25"
|
|
18
|
+
relation: "Byte-identical body lineage before Foundation relocation."
|
|
19
|
+
---
|
|
20
|
+
# Pibo on Windows via WSL
|
|
21
|
+
|
|
22
|
+
Pibo is a Linux-first tool. Native Windows is **not** supported, but Pibo runs unmodified inside **WSL2** because WSL2 is a real Linux kernel with full filesystem, symlink, and process semantics. This guide walks a Windows user from a fresh machine to a working `pibo` install, including the Pibo VSCode extension.
|
|
23
|
+
|
|
24
|
+
Total setup time: **15–25 minutes** on Windows 11 with WSLg enabled.
|
|
25
|
+
|
|
26
|
+
## Why WSL and not native Windows?
|
|
27
|
+
|
|
28
|
+
| | Native Windows | WSL2 |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| **Code changes** | 12+ POSIX assumptions would need workarounds | 0 — Pibo already runs on Linux |
|
|
31
|
+
| **Docker workers** | Docker Desktop only, paths are awkward | Docker Desktop integrates with WSL2, no friction |
|
|
32
|
+
| **Browser-Use / Agent-Browser** | Need WSL or WSLg anyway | Works directly under WSLg |
|
|
33
|
+
| **`pibo setup` (systemd, caddy)** | Would need a Windows port | Works as on Linux |
|
|
34
|
+
| **Symlinks, file modes, line endings** | Pain | Native |
|
|
35
|
+
| **Long-term maintenance** | Two code paths | One code path |
|
|
36
|
+
|
|
37
|
+
Microsoft itself recommends WSL for Linux-style development on Windows. The VSCode "WSL" extension, Docker Desktop's WSL2 backend, and Windows 11's WSLg GUI integration make WSL a first-class dev environment.
|
|
38
|
+
|
|
39
|
+
## Prerequisites
|
|
40
|
+
|
|
41
|
+
- **Windows 10 version 2004+** or **Windows 11** (any edition)
|
|
42
|
+
- Administrator access for the WSL install
|
|
43
|
+
- About 5 GB free disk space (WSL image + Pibo + node_modules)
|
|
44
|
+
|
|
45
|
+
## Step 1 — Install WSL (5 min, one-time)
|
|
46
|
+
|
|
47
|
+
Open **PowerShell as Administrator** and run:
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
wsl --install
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Default settings install Ubuntu. Reboot when prompted. On first boot, Ubuntu sets a username and password.
|
|
54
|
+
|
|
55
|
+
Verify the install:
|
|
56
|
+
|
|
57
|
+
```powershell
|
|
58
|
+
wsl --status
|
|
59
|
+
# Default Distribution: Ubuntu
|
|
60
|
+
# Default Version: 2
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
> **Tip:** If you want a different distro (Debian, openSUSE, Alpine…), run `wsl --install -d <DistroName>`. The rest of this guide works for any of them.
|
|
64
|
+
|
|
65
|
+
## Step 2 — Verify the WSL version (1 min)
|
|
66
|
+
|
|
67
|
+
Inside the WSL shell (run `wsl` in PowerShell to enter it), confirm WSL2:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cat /proc/sys/kernel/osrelease
|
|
71
|
+
# Look for "microsoft-standard-WSL2" or "WSL2" in the output.
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
If you see "Microsoft" without the WSL2 marker, your distro is on WSL1. Convert it:
|
|
75
|
+
|
|
76
|
+
```powershell
|
|
77
|
+
# PowerShell
|
|
78
|
+
wsl --set-version Ubuntu 2
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
WSL1 cannot run Docker well and lacks the full Linux kernel Pibo expects. Use WSL2.
|
|
82
|
+
|
|
83
|
+
## Step 3 — Install Node.js 24+ inside WSL (3 min)
|
|
84
|
+
|
|
85
|
+
The Ubuntu default Node is often too old. Use NodeSource:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Inside WSL
|
|
89
|
+
sudo apt update
|
|
90
|
+
sudo apt install -y ca-certificates curl gnupg
|
|
91
|
+
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
|
|
92
|
+
sudo apt install -y nodejs build-essential
|
|
93
|
+
node --version # must print v24.x.x or higher
|
|
94
|
+
npm --version
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Step 4 — Install Pibo inside WSL (1 min)
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Inside WSL
|
|
101
|
+
npm install -g @pasko70/pibo
|
|
102
|
+
pibo --version
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Pibo's data lives in `~/.pibo` inside the WSL filesystem. This is intentional: WSL-native paths are fast, while `/mnt/c/...` mounts are slow. Keep Pibo's working data inside WSL.
|
|
106
|
+
|
|
107
|
+
## Step 5 — Install VSCode and the WSL extension (3 min)
|
|
108
|
+
|
|
109
|
+
1. Install **VSCode for Windows** from <https://code.visualstudio.com/> (the standard Windows .exe, not the .deb).
|
|
110
|
+
2. In VSCode, open the **Extensions** panel (Ctrl+Shift+X) and install **WSL** by Microsoft.
|
|
111
|
+
3. **Open your project folder inside WSL.** In the WSL terminal:
|
|
112
|
+
```bash
|
|
113
|
+
cd ~/projects/my-app # or wherever your project lives
|
|
114
|
+
code .
|
|
115
|
+
```
|
|
116
|
+
VSCode opens a second VSCode window. Title bar shows the distro name in green (`[WSL: Ubuntu]`). File editing, terminal, and extensions all run inside WSL.
|
|
117
|
+
|
|
118
|
+
> **Why this step matters:** when you run `code .` from inside WSL, VSCode installs its Linux server binary inside the WSL distro, the integrated terminal becomes a WSL bash, and `code` is added to WSL's `PATH`. That is what makes `pibo vscode install` work seamlessly.
|
|
119
|
+
|
|
120
|
+
## Step 6 — Configure Pibo auth (3 min)
|
|
121
|
+
|
|
122
|
+
Pibo uses [Better Auth](https://www.better-auth.com/) with Google OAuth. Set the keys once:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
# Inside WSL
|
|
126
|
+
pibo config set auth.baseURL http://127.0.0.1:4788
|
|
127
|
+
pibo config set auth.secret "$(openssl rand -hex 32)"
|
|
128
|
+
pibo config set auth.googleClientId <your-google-oauth-client-id>
|
|
129
|
+
pibo config set auth.googleClientSecret <your-google-oauth-client-secret>
|
|
130
|
+
pibo config set auth.allowedEmails you@example.com
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
To get Google OAuth credentials, create a Web Application client at <https://console.cloud.google.com/apis/credentials>. The redirect URI is `http://127.0.0.1:4788/api/auth/callback/google`. See the [Quick Start Guide](./pibo-vscode-ext-quickstart.md) for the full walkthrough.
|
|
134
|
+
|
|
135
|
+
## Step 7 — Start the Pibo gateway (1 min)
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Inside WSL, leave this running in a terminal
|
|
139
|
+
pibo gateway:web
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The gateway listens on `127.0.0.1:4788` **inside WSL**. Windows can reach this URL because WSL2 forwards localhost from Windows to the WSL2 VM by default.
|
|
143
|
+
|
|
144
|
+
Open a **second** WSL terminal and verify:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
curl -s http://127.0.0.1:4788/api/health
|
|
148
|
+
# or open in your Windows browser:
|
|
149
|
+
# http://127.0.0.1:4788/apps/chat
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
> **If localhost does not work in the Windows browser:** the WSL2 localhost forwarder is disabled or blocked. See [Troubleshooting](#localhost-forwarding-not-working) below.
|
|
153
|
+
|
|
154
|
+
## Step 8 — Install the Pibo VSCode extension (2 min)
|
|
155
|
+
|
|
156
|
+
### Option A — from the WSL terminal (recommended)
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# Inside the WSL VSCode terminal (Ctrl+`)
|
|
160
|
+
pibo vscode install
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
This downloads the latest VSIX from GitHub Releases and runs `code --install-extension` against the WSL `code` binary.
|
|
164
|
+
|
|
165
|
+
### Option B — from the Marketplace
|
|
166
|
+
|
|
167
|
+
Search **Pibo** by publisher `pibo` in the Extensions panel. Install the one named **Pibo** by `pibo`.
|
|
168
|
+
|
|
169
|
+
### Verify
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
pibo vscode status
|
|
173
|
+
# Should print the installed extension ID and the gateway URL.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Click the **Pibo** icon in the VSCode sidebar (left rail). A web view opens. Sign in with Google. The status bar at the bottom should show the room you are in.
|
|
177
|
+
|
|
178
|
+
## Step 9 — Optional — Docker workers
|
|
179
|
+
|
|
180
|
+
Pibo's compute workers run as Docker containers. To enable them on WSL:
|
|
181
|
+
|
|
182
|
+
1. Install **Docker Desktop for Windows**: <https://www.docker.com/products/docker-desktop/>
|
|
183
|
+
2. Open Docker Desktop → **Settings** → **Resources** → **WSL Integration**.
|
|
184
|
+
3. Enable the toggle for **Ubuntu** (or whichever distro you use).
|
|
185
|
+
4. Click **Apply & Restart**.
|
|
186
|
+
|
|
187
|
+
Test from WSL:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
docker run --rm hello-world
|
|
191
|
+
# Should print "Hello from Docker!"
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Pibo will detect Docker automatically. `pibo compute dev spawn --worktree <name>` now works.
|
|
195
|
+
|
|
196
|
+
## Step 10 — Optional — Browser-Use and Agent-Browser
|
|
197
|
+
|
|
198
|
+
Both tools need a graphical browser under the hood.
|
|
199
|
+
|
|
200
|
+
- **Windows 11 with WSLg** (default on fresh installs): no extra setup. Browser windows appear as regular Windows windows.
|
|
201
|
+
- **Windows 10 or older Windows 11 without WSLg**: install an X server in Windows (e.g. [VcXsrv](https://sourceforge.net/projects/vcxsrv/)) and export the display in WSL:
|
|
202
|
+
```bash
|
|
203
|
+
# Inside WSL ~/.bashrc
|
|
204
|
+
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
|
|
205
|
+
```
|
|
206
|
+
Launch VcXsrv in Windows with "Disable access control" ticked.
|
|
207
|
+
|
|
208
|
+
To install the tools:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
pibo tools install browser-use
|
|
212
|
+
pibo tools install agent-browser
|
|
213
|
+
pibo tools env browser-use
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Where Pibo stores things on WSL
|
|
217
|
+
|
|
218
|
+
| Path (inside WSL) | What |
|
|
219
|
+
|---|---|
|
|
220
|
+
| `~/.pibo/config.json` | Pibo configuration (auth, ports, etc.) |
|
|
221
|
+
| `~/.pibo/pibo.sqlite` | Sessions, rooms, signals |
|
|
222
|
+
| `~/.pibo/vscode/cache/` | VSIX cache for `pibo vscode install` |
|
|
223
|
+
| `<workspace>/.pibo/` | Per-workspace room state |
|
|
224
|
+
|
|
225
|
+
> Keep these inside the WSL filesystem (not under `/mnt/c/...`). Cross-FS access is slow and breaks symlinks.
|
|
226
|
+
|
|
227
|
+
## Troubleshooting
|
|
228
|
+
|
|
229
|
+
### Localhost forwarding not working
|
|
230
|
+
|
|
231
|
+
WSL2 forwards `localhost` from Windows to the WSL VM by default. If the gateway at `http://127.0.0.1:4788` is unreachable from a Windows browser:
|
|
232
|
+
|
|
233
|
+
1. **Check Windows version.** Localhost forwarding works on Windows 11 and on Windows 10 22H2+. Older builds had bugs.
|
|
234
|
+
2. **Check the WSL version.** Run `wsl --status` — `Default Version: 2`.
|
|
235
|
+
3. **Check Windows Firewall.** Allow inbound to WSL. Run in PowerShell as Admin:
|
|
236
|
+
```powershell
|
|
237
|
+
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
|
|
238
|
+
```
|
|
239
|
+
4. **Fallback:** use the WSL2 VM's IP. Inside WSL run:
|
|
240
|
+
```bash
|
|
241
|
+
hostname -I
|
|
242
|
+
# e.g. prints 172.21.123.45
|
|
243
|
+
```
|
|
244
|
+
Then in your Windows browser use `http://172.21.123.45:4788`. The IP changes on each WSL boot, so this is a workaround, not a permanent solution.
|
|
245
|
+
5. **Last resort:** set up `netsh interface portproxy`:
|
|
246
|
+
```powershell
|
|
247
|
+
# PowerShell as Admin
|
|
248
|
+
$wslIp = wsl hostname -I
|
|
249
|
+
netsh interface portproxy add v4tov4 listenport=4788 listenaddress=0.0.0.0 connectport=4788 connectaddress=$wslIp
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### `pibo setup doctor` warns about native Windows
|
|
253
|
+
|
|
254
|
+
You are running Pibo from a Windows PowerShell or `cmd.exe`, not from inside WSL. Open the **WSL** terminal (or run `wsl` from PowerShell) and try again.
|
|
255
|
+
|
|
256
|
+
### Browser-Use opens a blank window
|
|
257
|
+
|
|
258
|
+
The DISPLAY is not set or the X server is not running. On Windows 11 with WSLg, `echo $DISPLAY` should print something like `:0` or `wayland-0`. On Windows 10, start VcXsrv and export `DISPLAY` as shown above.
|
|
259
|
+
|
|
260
|
+
### `pibo vscode install` cannot find `code`
|
|
261
|
+
|
|
262
|
+
This means VSCode's WSL server is not active in the current VSCode window. Run `code .` from inside WSL once, restart VSCode, then try again. If you opened VSCode directly from the Start Menu (not via `code .` in WSL), you are in the Windows VSCode instance, not the WSL one.
|
|
263
|
+
|
|
264
|
+
### File edits are slow
|
|
265
|
+
|
|
266
|
+
You are editing files on `/mnt/c/...` (the Windows drive). Move the project into the WSL filesystem (`/home/<you>/projects/...`). NTFS access from WSL is slow because of `metadata` and `umask` differences.
|
|
267
|
+
|
|
268
|
+
### Docker commands fail inside WSL
|
|
269
|
+
|
|
270
|
+
Open Docker Desktop → Settings → Resources → WSL Integration → enable your distro → **Apply & Restart**. Verify with `docker run --rm hello-world`.
|
|
271
|
+
|
|
272
|
+
## Verifying everything works
|
|
273
|
+
|
|
274
|
+
Run the following inside WSL:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
pibo --version # 1.3.0 or higher
|
|
278
|
+
pibo setup doctor # all checks should be OK or WARN
|
|
279
|
+
pibo vscode status # extension should be installed
|
|
280
|
+
pibo tools list # should list browser-use, agent-browser, etc.
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Open the VSCode sidebar → Pibo icon → web view loads → sign in with Google → create a new session → send a message. The status bar at the bottom should show a green dot and your room name.
|
|
284
|
+
|
|
285
|
+
If all of that works, you are fully set up.
|
|
286
|
+
|
|
287
|
+
## What we deliberately do not support
|
|
288
|
+
|
|
289
|
+
- **Native Windows** (no WSL). Pibo will print a clear error pointing you back to this guide.
|
|
290
|
+
- **WSL1.** WSL1 lacks the full Linux kernel Pibo expects. Use WSL2.
|
|
291
|
+
- **Cygwin, MSYS2, Git Bash.** These are POSIX shims, not real Linux. Pibo will not work; use WSL2.
|
|
292
|
+
- **Windows Containers in Docker.** Pibo compute workers target Linux containers.
|