my-durable 0.0.26 → 0.0.28
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/apps/dpi-backend/src/store.ts +7 -2
- package/apps/dpi-playground/apps/dpi-playground-fe/dist/assets/{index-C9OQe54o.js → index-8VVvzo6M.js} +3 -3
- package/apps/dpi-playground/apps/dpi-playground-fe/dist/assets/{index-DwYK0DEy.css → index-DxIvDff_.css} +1 -1
- package/apps/dpi-playground/apps/dpi-playground-fe/dist/index.html +2 -2
- package/apps/dpi-playground/apps/dpi-playground-fe/src/components/GitPanel.vue +9 -2
- package/docs/git-ui-checklist.md +1 -1
- package/package.json +1 -1
|
@@ -742,8 +742,13 @@ export class Store {
|
|
|
742
742
|
const blocks = Array.isArray(m.content) ? (m.content as unknown[]) : [];
|
|
743
743
|
for (const b of blocks as { type?: string; name?: string; arguments?: Record<string, unknown> }[]) {
|
|
744
744
|
if (b?.type !== "toolCall" || (b.name !== "write" && b.name !== "edit")) continue;
|
|
745
|
-
const
|
|
746
|
-
|
|
745
|
+
const args = b.arguments ?? {};
|
|
746
|
+
// pi's write/edit speak `path` (edit also nests edits[].path); some
|
|
747
|
+
// harnesses say file_path — accept both, never invent one.
|
|
748
|
+
const candidates: unknown[] = [args.file_path, args.path];
|
|
749
|
+
const edits = Array.isArray(args.edits) ? (args.edits as { path?: unknown }[]) : [];
|
|
750
|
+
for (const ed of edits) candidates.push(ed.path);
|
|
751
|
+
for (const f of candidates) if (typeof f === "string" && f.length > 0 && f.length < 4096) paths.add(f);
|
|
747
752
|
}
|
|
748
753
|
}
|
|
749
754
|
}
|
|
@@ -72,8 +72,8 @@ ${e}</tr>
|
|
|
72
72
|
`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${Sp(e,!0)}</code>`}br(e){return`<br>`}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=Cp(e);if(i===null)return r;e=i;let a=`<a href="`+e+`"`;return t&&(a+=` title="`+Sp(t)+`"`),a+=`>`+r+`</a>`,a}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=Cp(e);if(i===null)return Sp(n);e=i;let a=`<img src="${e}" alt="${Sp(n)}"`;return t&&(a+=` title="${Sp(t)}"`),a+=`>`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:Sp(e.text)}},Np=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return``+e}image({text:e}){return``+e}br(){return``}checkbox({raw:e}){return e}},Pp=class e{options;renderer;textRenderer;constructor(e){this.options=e||uf,this.options.renderer=this.options.renderer||new Mp,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Np}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e){this.renderer.parser=this;let t=``;for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let e=r,n=this.options.extensions.renderers[e.type].call({parser:this},e);if(n!==!1||![`space`,`hr`,`heading`,`code`,`table`,`blockquote`,`list`,`html`,`def`,`paragraph`,`text`].includes(e.type)){t+=n||``;continue}}let i=r;switch(i.type){case`space`:t+=this.renderer.space(i);break;case`hr`:t+=this.renderer.hr(i);break;case`heading`:t+=this.renderer.heading(i);break;case`code`:t+=this.renderer.code(i);break;case`table`:t+=this.renderer.table(i);break;case`blockquote`:t+=this.renderer.blockquote(i);break;case`list`:t+=this.renderer.list(i);break;case`checkbox`:t+=this.renderer.checkbox(i);break;case`html`:t+=this.renderer.html(i);break;case`def`:t+=this.renderer.def(i);break;case`paragraph`:t+=this.renderer.paragraph(i);break;case`text`:t+=this.renderer.text(i);break;default:{let e=`Token with "`+i.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=``;for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let e=this.options.extensions.renderers[i.type].call({parser:this},i);if(e!==!1||![`escape`,`html`,`link`,`image`,`strong`,`em`,`codespan`,`br`,`del`,`text`].includes(i.type)){n+=e||``;continue}}let a=i;switch(a.type){case`escape`:n+=t.text(a);break;case`html`:n+=t.html(a);break;case`link`:n+=t.link(a);break;case`image`:n+=t.image(a);break;case`checkbox`:n+=t.checkbox(a);break;case`strong`:n+=t.strong(a);break;case`em`:n+=t.em(a);break;case`codespan`:n+=t.codespan(a);break;case`br`:n+=t.br(a);break;case`del`:n+=t.del(a);break;case`text`:n+=t.text(a);break;default:{let e=`Token with "`+a.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}},Fp=class{options;block;constructor(e){this.options=e||uf}static passThroughHooks=new Set([`preprocess`,`postprocess`,`processAllTokens`,`emStrongMask`]);static passThroughHooksRespectAsync=new Set([`preprocess`,`postprocess`,`processAllTokens`]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?jp.lex:jp.lexInline}provideParser(e=this.block){return e?Pp.parse:Pp.parseInline}},Ip=new class{defaults=lf();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=Pp;Renderer=Mp;TextRenderer=Np;Lexer=jp;Tokenizer=Ap;Hooks=Fp;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case`table`:{let e=r;for(let r of e.header)n=n.concat(this.walkTokens(r.tokens,t));for(let r of e.rows)for(let e of r)n=n.concat(this.walkTokens(e.tokens,t));break}case`list`:{let e=r;n=n.concat(this.walkTokens(e.items,t));break}default:{let e=r;this.defaults.extensions?.childTokens?.[e.type]?this.defaults.extensions.childTokens[e.type].forEach(r=>{let i=e[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new Mp(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if([`options`,`parser`].includes(n))continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new Ap(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new Fp;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if([`options`,`block`].includes(n))continue;let r=n,i=e.hooks[r],a=t[r];t[r]=Fp.passThroughHooks.has(n)?e=>{if(this.defaults.async&&Fp.passThroughHooksRespectAsync.has(n))return(async()=>{let n=await i.call(t,e);return a.call(t,n)})();let r=i.call(t,e);return a.call(t,r)}:(...e)=>{if(this.defaults.async)return(async()=>{let n=await i.apply(t,e);return n===!1&&(n=await a.apply(t,e)),n})();let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return jp.lex(e,t??this.defaults)}parser(e,t){return Pp.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(Error(`marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.`));if(typeof t>`u`||t===null)return a(Error(`marked(): input parameter is undefined or null`));if(typeof t!=`string`)return a(Error(`marked(): input parameter is of type `+Object.prototype.toString.call(t)+`, string expected`));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let n=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer(e):e?jp.lex:jp.lexInline)(n,i),a=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(a,i.walkTokens));let o=await(i.hooks?await i.hooks.provideParser(e):e?Pp.parse:Pp.parseInline)(a,i);return i.hooks?await i.hooks.postprocess(o):o})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let n=(i.hooks?i.hooks.provideLexer(e):e?jp.lex:jp.lexInline)(t,i);i.hooks&&(n=i.hooks.processAllTokens(n)),i.walkTokens&&this.walkTokens(n,i.walkTokens);let r=(i.hooks?i.hooks.provideParser(e):e?Pp.parse:Pp.parseInline)(n,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}onError(e,t){return n=>{if(n.message+=`
|
|
73
73
|
Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+Sp(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function Lp(e,t){return Ip.parse(e,t)}Lp.options=Lp.setOptions=function(e){return Ip.setOptions(e),Lp.defaults=Ip.defaults,df(Lp.defaults),Lp},Lp.getDefaults=lf,Lp.defaults=uf,Lp.use=function(...e){return Ip.use(...e),Lp.defaults=Ip.defaults,df(Lp.defaults),Lp},Lp.walkTokens=function(e,t){return Ip.walkTokens(e,t)},Lp.parseInline=Ip.parseInline,Lp.Parser=Pp,Lp.parser=Pp.parse,Lp.Renderer=Mp,Lp.TextRenderer=Np,Lp.Lexer=jp,Lp.lexer=jp.lex,Lp.Tokenizer=Ap,Lp.Hooks=Fp,Lp.parse=Lp,Lp.options,Lp.setOptions,Lp.use,Lp.walkTokens,Lp.parseInline,Pp.parse,jp.lex;function Rp(e,t){this.v=e,this.k=t}function zp(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Bp(e){if(Array.isArray(e))return e}function Vp(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function Hp(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
74
74
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Up(e,t){return Bp(e)||Vp(e,t)||Wp(e,t)||Hp()}function Wp(e,t){if(e){if(typeof e==`string`)return zp(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?zp(e,t):void 0}}function Gp(e){var t,n;function r(t,n){try{var a=e[t](n),o=a.value,s=o instanceof Rp;Promise.resolve(s?o.v:o).then(function(n){if(s){var c=t===`return`&&o.k?t:`next`;if(!o.k||n.done)return r(c,n);n=e[c](n).value}i(!!a.done,n)},function(e){r(`throw`,e)})}catch(e){i(2,e)}}function i(e,i){e===2?t.reject(i):t.resolve({value:i,done:e}),(t=t.next)?r(t.key,t.arg):n=null}this._invoke=function(e,i){return new Promise(function(a,o){var s={key:e,arg:i,resolve:a,reject:o,next:null};n?n=n.next=s:(t=n=s,r(e,i))})},typeof e.return!=`function`&&(this.return=void 0)}Gp.prototype[typeof Symbol==`function`&&Symbol.asyncIterator||`@@asyncIterator`]=function(){return this},Gp.prototype.next=function(e){return this._invoke(`next`,e)},Gp.prototype.throw=function(e){return this._invoke(`throw`,e)},Gp.prototype.return=function(e){return this._invoke(`return`,e)};var Kp=Object.entries,qp=Object.setPrototypeOf,Jp=Object.isFrozen,Yp=Object.getPrototypeOf,Xp=Object.getOwnPropertyDescriptor,Zp=Object.freeze,Qp=Object.seal,$p=Object.create,em=typeof Reflect<`u`&&Reflect,tm=em.apply,nm=em.construct;Zp||=function(e){return e},Qp||=function(e){return e},tm||=function(e,t){var n=[...arguments].slice(2);return e.apply(t,n)},nm||=function(e){return new e(...[...arguments].slice(1))};var rm=Cm(Array.prototype.forEach);Array.prototype.indexOf;var im=Cm(Array.prototype.lastIndexOf),am=Cm(Array.prototype.pop),om=Cm(Array.prototype.push);Array.prototype.slice;var sm=Cm(Array.prototype.splice),cm=Array.isArray,lm=Cm(String.prototype.toLowerCase),um=Cm(String.prototype.toString),dm=Cm(String.prototype.match),fm=Cm(String.prototype.replace),pm=Cm(String.prototype.indexOf),mm=Cm(String.prototype.trim),hm=Cm(Number.prototype.toString),gm=Cm(Boolean.prototype.toString),_m=typeof BigInt>`u`?null:Cm(BigInt.prototype.toString),vm=typeof Symbol>`u`?null:Cm(Symbol.prototype.toString),ym=Cm(Object.prototype.hasOwnProperty),bm=Cm(Object.prototype.toString),xm=Cm(RegExp.prototype.test),Sm=wm(TypeError);function Cm(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return tm(e,t,n)}}function wm(e){return function(){return nm(e,[...arguments])}}function q(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:lm;if(qp&&qp(e,null),!cm(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(Jp(t)||(t[r]=e),i=e)}e[i]=!0}return e}function Tm(e){for(let t=0;t<e.length;t++)ym(e,t)||(e[t]=null);return e}function Em(e){let t=$p(null);for(let r of Kp(e)){var n=Up(r,2);let i=n[0],a=n[1];ym(e,i)&&(t[i]=cm(a)?Tm(a):a&&typeof a==`object`&&a.constructor===Object?Em(a):a)}return t}function Dm(e){switch(typeof e){case`string`:return e;case`number`:return hm(e);case`boolean`:return gm(e);case`bigint`:return _m?_m(e):`0`;case`symbol`:return vm?vm(e):`Symbol()`;case`undefined`:return bm(e);case`function`:case`object`:{if(e===null)return bm(e);let t=e,n=Om(t,`toString`);if(typeof n==`function`){let e=n(t);return typeof e==`string`?e:bm(e)}return bm(e)}default:return bm(e)}}function Om(e,t){for(;e!==null;){let n=Xp(e,t);if(n){if(n.get)return Cm(n.get);if(typeof n.value==`function`)return Cm(n.value)}e=Yp(e)}function n(){return null}return n}function km(e){try{return xm(e,``),!0}catch{return!1}}var Am=Zp(`a.abbr.acronym.address.area.article.aside.audio.b.bdi.bdo.big.blink.blockquote.body.br.button.canvas.caption.center.cite.code.col.colgroup.content.data.datalist.dd.decorator.del.details.dfn.dialog.dir.div.dl.dt.element.em.fieldset.figcaption.figure.font.footer.form.h1.h2.h3.h4.h5.h6.head.header.hgroup.hr.html.i.img.input.ins.kbd.label.legend.li.main.map.mark.marquee.menu.menuitem.meter.nav.nobr.ol.optgroup.option.output.p.picture.pre.progress.q.rp.rt.ruby.s.samp.search.section.select.shadow.slot.small.source.spacer.span.strike.strong.style.sub.summary.sup.table.tbody.td.template.textarea.tfoot.th.thead.time.tr.track.tt.u.ul.var.video.wbr`.split(`.`)),jm=Zp(`svg.a.altglyph.altglyphdef.altglyphitem.animatecolor.animatemotion.animatetransform.circle.clippath.defs.desc.ellipse.enterkeyhint.exportparts.filter.font.g.glyph.glyphref.hkern.image.inputmode.line.lineargradient.marker.mask.metadata.mpath.part.path.pattern.polygon.polyline.radialgradient.rect.stop.style.switch.symbol.text.textpath.title.tref.tspan.view.vkern`.split(`.`)),Mm=Zp([`feBlend`,`feColorMatrix`,`feComponentTransfer`,`feComposite`,`feConvolveMatrix`,`feDiffuseLighting`,`feDisplacementMap`,`feDistantLight`,`feDropShadow`,`feFlood`,`feFuncA`,`feFuncB`,`feFuncG`,`feFuncR`,`feGaussianBlur`,`feImage`,`feMerge`,`feMergeNode`,`feMorphology`,`feOffset`,`fePointLight`,`feSpecularLighting`,`feSpotLight`,`feTile`,`feTurbulence`]),Nm=Zp([`animate`,`color-profile`,`cursor`,`discard`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`foreignobject`,`hatch`,`hatchpath`,`mesh`,`meshgradient`,`meshpatch`,`meshrow`,`missing-glyph`,`script`,`set`,`solidcolor`,`unknown`,`use`]),Pm=Zp(`math.menclose.merror.mfenced.mfrac.mglyph.mi.mlabeledtr.mmultiscripts.mn.mo.mover.mpadded.mphantom.mroot.mrow.ms.mspace.msqrt.mstyle.msub.msup.msubsup.mtable.mtd.mtext.mtr.munder.munderover.mprescripts`.split(`.`)),Fm=Zp([`maction`,`maligngroup`,`malignmark`,`mlongdiv`,`mscarries`,`mscarry`,`msgroup`,`mstack`,`msline`,`msrow`,`semantics`,`annotation`,`annotation-xml`,`mprescripts`,`none`]),Im=Zp([`#text`]),Lm=Zp(`accept.action.align.alt.autocapitalize.autocomplete.autopictureinpicture.autoplay.background.bgcolor.border.capture.cellpadding.cellspacing.checked.cite.class.clear.color.cols.colspan.command.commandfor.controls.controlslist.coords.crossorigin.datetime.decoding.default.dir.disabled.disablepictureinpicture.disableremoteplayback.download.draggable.enctype.enterkeyhint.exportparts.face.for.headers.height.hidden.high.href.hreflang.id.inert.inputmode.integrity.ismap.kind.label.lang.list.loading.loop.low.max.maxlength.media.method.min.minlength.multiple.muted.name.nonce.noshade.novalidate.nowrap.open.optimum.part.pattern.placeholder.playsinline.popover.popovertarget.popovertargetaction.poster.preload.pubdate.radiogroup.readonly.rel.required.rev.reversed.role.rows.rowspan.spellcheck.scope.selected.shape.size.sizes.slot.span.srclang.start.src.srcset.step.style.summary.tabindex.title.translate.type.usemap.valign.value.width.wrap.xmlns`.split(`.`)),Rm=Zp(`accent-height.accumulate.additive.alignment-baseline.amplitude.ascent.attributename.attributetype.azimuth.basefrequency.baseline-shift.begin.bias.by.class.clip.clippathunits.clip-path.clip-rule.color.color-interpolation.color-interpolation-filters.color-profile.color-rendering.cx.cy.d.dx.dy.diffuseconstant.direction.display.divisor.dominant-baseline.dur.edgemode.elevation.end.exponent.fill.fill-opacity.fill-rule.filter.filterunits.flood-color.flood-opacity.font-family.font-size.font-size-adjust.font-stretch.font-style.font-variant.font-weight.fx.fy.g1.g2.glyph-name.glyphref.gradientunits.gradienttransform.height.href.id.image-rendering.in.in2.intercept.k.k1.k2.k3.k4.kerning.keypoints.keysplines.keytimes.lang.lengthadjust.letter-spacing.kernelmatrix.kernelunitlength.lighting-color.local.marker-end.marker-mid.marker-start.markerheight.markerunits.markerwidth.maskcontentunits.maskunits.max.mask.mask-type.media.method.mode.min.name.numoctaves.offset.operator.opacity.order.orient.orientation.origin.overflow.paint-order.path.pathlength.patterncontentunits.patterntransform.patternunits.pointer-events.points.preservealpha.preserveaspectratio.primitiveunits.r.rx.ry.radius.refx.refy.repeatcount.repeatdur.restart.result.rotate.scale.seed.shape-rendering.slope.specularconstant.specularexponent.spreadmethod.startoffset.stddeviation.stitchtiles.stop-color.stop-opacity.stroke-dasharray.stroke-dashoffset.stroke-linecap.stroke-linejoin.stroke-miterlimit.stroke-opacity.stroke.stroke-width.style.surfacescale.systemlanguage.tabindex.tablevalues.targetx.targety.transform.transform-origin.text-anchor.text-decoration.text-orientation.text-rendering.textlength.type.u1.u2.unicode.values.vector-effect.viewbox.visibility.version.vert-adv-y.vert-origin-x.vert-origin-y.width.word-spacing.wrap.writing-mode.xchannelselector.ychannelselector.x.x1.x2.xmlns.y.y1.y2.z.zoomandpan`.split(`.`)),zm=Zp(`accent.accentunder.align.bevelled.close.columnalign.columnlines.columnspacing.columnspan.denomalign.depth.dir.display.displaystyle.encoding.fence.frame.height.href.id.largeop.length.linethickness.lquote.lspace.mathbackground.mathcolor.mathsize.mathvariant.maxsize.minsize.movablelimits.notation.numalign.open.rowalign.rowlines.rowspacing.rowspan.rspace.rquote.scriptlevel.scriptminsize.scriptsizemultiplier.selection.separator.separators.stretchy.subscriptshift.supscriptshift.symmetric.voffset.width.xmlns`.split(`.`)),Bm=Zp([`xlink:href`,`xml:id`,`xlink:title`,`xml:space`,`xmlns:xlink`]),Vm=Qp(/{{[\w\W]*|^[\w\W]*}}/g),Hm=Qp(/<%[\w\W]*|^[\w\W]*%>/g),Um=Qp(/\${[\w\W]*/g),Wm=Qp(/^data-[\-\w.\u00B7-\uFFFF]+$/),Gm=Qp(/^aria-[\-\w]+$/),Km=Qp(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),qm=Qp(/^(?:\w+script|data):/i),Jm=Qp(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Ym=Qp(/^html$/i),Xm=Qp(/^[a-z][.\w]*(-[.\w]+)+$/i),Zm=Qp(/<[/\w!]/g),Qm=Qp(/<[/\w]/g),$m=Qp(/<\/no(script|embed|frames)/i),eh=Qp(/\/>/i),th={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},nh=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],rh=Zp(q({},nh)),ih=function(){let e={};return rm(nh,t=>{e[t]=Qp(RegExp(`</`+t+`(?=[\\t\\n\\f\\r />])`,`i`))}),Zp(e)}(),ah=function(){return typeof window>`u`?null:window},oh=function(e,t){if(typeof e!=`object`||typeof e.createPolicy!=`function`)return null;let n=null,r=`data-tt-policy-suffix`;t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let i=`dompurify`+(n?`#`+n:``);try{return e.createPolicy(i,{createHTML(e){return e},createScriptURL(e){return e}})}catch{return console.warn(`TrustedTypes policy `+i+` could not be created.`),null}},sh=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},ch=function(e,t,n,r){return ym(e,t)&&cm(e[t])?q(r.base?Em(r.base):{},e[t],r.transform):n},lh=function(e,t,n){let r=ym(e,t)?e[t]:void 0;return r&&typeof r==`object`?Em(r):n()};function uh(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ah(),t=e=>uh(e);if(t.version=`3.4.16`,t.removed=[],!e||!e.document||e.document.nodeType!==th.document||!e.Element)return t.isSupported=!1,t;let n=e.document,r=n,i=r.currentScript;e.DocumentFragment;let a=e.HTMLTemplateElement,o=e.Node,s=e.Element,c=e.NodeFilter;e.NamedNodeMap===void 0&&(e.NamedNodeMap||e.MozNamedAttrMap),e.HTMLFormElement;let l=e.DOMParser,u=e.trustedTypes,d=s.prototype,f=Om(d,`cloneNode`),p=Om(d,`remove`),m=Om(d,`removeAttributeNode`),h=Om(d,`nextSibling`),g=Om(d,`childNodes`),_=Om(d,`parentNode`),v=Om(d,`shadowRoot`),y=Om(d,`attributes`),b=o&&o.prototype?Om(o.prototype,`nodeType`):null,ee=o&&o.prototype?Om(o.prototype,`nodeName`):null,x=o&&o.prototype?Om(o.prototype,`ownerDocument`):null,S=function(e){return b?b(e):e.nodeType},te=function(e){return ee?ee(e):e.nodeName};if(typeof a==`function`){let e=n.createElement(`template`);e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let ne,re=``,ie,ae=!1,oe=0,se=function(){if(oe>0)throw Sm(`A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.`)},ce=function(e){se(),oe++;try{return ne.createHTML(e)}finally{oe--}},le=function(e){se(),oe++;try{return ne.createScriptURL(e)}finally{oe--}},ue=function(){return ae||=(ie=oh(u,i),!0),ie},de=n,C=de.implementation,fe=de.createNodeIterator,pe=de.createDocumentFragment,me=de.getElementsByTagName,he=r.importNode,ge=sh();t.isSupported=typeof Kp==`function`&&typeof _==`function`&&C&&C.createHTMLDocument!==void 0;let _e=Vm,ve=Hm,ye=Um,be=Wm,xe=Gm,Se=qm,w=Jm,Ce=Xm,we=Km,T=null,Te=q({},[...Am,...jm,...Mm,...Pm,...Im]),Ee=null,De=q({},[...Lm,...Rm,...zm,...Bm]),Oe=Object.seal($p(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ke=null,Ae=null,je=Object.seal($p(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),E=!0,Me=!0,Ne=!1,Pe=!0,Fe=!1,Ie=!0,D=!1,Le=!1,Re=null,ze=null,Be=!1,Ve=!1,He=!1,Ue=!1,We=!0,Ge=!1,Ke=`user-content-`,qe=!0,Je=!1,Ye={},Xe=null,Ze=q({},`annotation-xml.audio.colgroup.desc.foreignobject.head.iframe.math.mi.mn.mo.ms.mtext.noembed.noframes.noscript.plaintext.script.selectedcontent.style.svg.template.thead.title.video.xmp`.split(`.`)),Qe=null,$e=q({},[`audio`,`video`,`img`,`source`,`image`,`track`]),et=null,tt=q({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),nt=`http://www.w3.org/1998/Math/MathML`,rt=`http://www.w3.org/2000/svg`,it=`http://www.w3.org/1999/xhtml`,at=it,ot=!1,st=null,ct=q({},[nt,rt,it],um),lt=Zp([`mi`,`mo`,`mn`,`ms`,`mtext`]),ut=q({},lt),dt=Zp([`annotation-xml`]),ft=q({},dt),pt=q({},[`title`,`style`,`font`,`a`,`script`]),mt=null,ht=[`application/xhtml+xml`,`text/html`],gt=null,_t=null,vt=n.createElement(`form`),yt=function(e){return e instanceof RegExp||e instanceof Function},bt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(_t&&_t===e)return;(!e||typeof e!=`object`)&&(e={}),e=Em(e),mt=ht.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,gt=mt===`application/xhtml+xml`?um:lm,T=ch(e,`ALLOWED_TAGS`,Te,{transform:gt}),Ee=ch(e,`ALLOWED_ATTR`,De,{transform:gt}),st=ch(e,`ALLOWED_NAMESPACES`,ct,{transform:um}),et=ch(e,`ADD_URI_SAFE_ATTR`,tt,{transform:gt,base:tt}),Qe=ch(e,`ADD_DATA_URI_TAGS`,$e,{transform:gt,base:$e}),Xe=ch(e,`FORBID_CONTENTS`,Ze,{transform:gt}),ke=ch(e,`FORBID_TAGS`,Em({}),{transform:gt}),Ae=ch(e,`FORBID_ATTR`,Em({}),{transform:gt}),Ye=ym(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?Em(e.USE_PROFILES):e.USE_PROFILES:!1,E=e.ALLOW_ARIA_ATTR!==!1,Me=e.ALLOW_DATA_ATTR!==!1,Ne=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Pe=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Fe=e.SAFE_FOR_TEMPLATES||!1,Ie=e.SAFE_FOR_XML!==!1,D=e.WHOLE_DOCUMENT||!1,Ve=e.RETURN_DOM||!1,He=e.RETURN_DOM_FRAGMENT||!1,Ue=e.RETURN_TRUSTED_TYPE||!1,Be=e.FORCE_BODY||!1,We=e.SANITIZE_DOM!==!1,Ge=e.SANITIZE_NAMED_PROPS||!1,qe=e.KEEP_CONTENT!==!1,Je=e.IN_PLACE||!1,we=km(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:Km,at=typeof e.NAMESPACE==`string`?e.NAMESPACE:it,ut=lh(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>q({},lt)),ft=lh(e,`HTML_INTEGRATION_POINTS`,()=>q({},dt));let t=lh(e,`CUSTOM_ELEMENT_HANDLING`,()=>$p(null));if(Oe=$p(null),ym(t,`tagNameCheck`)&&yt(t.tagNameCheck)&&(Oe.tagNameCheck=t.tagNameCheck),ym(t,`attributeNameCheck`)&&yt(t.attributeNameCheck)&&(Oe.attributeNameCheck=t.attributeNameCheck),ym(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(Oe.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),Qp(Oe),Fe&&(Me=!1),He&&(Ve=!0),Ye&&(T=q({},Im),Ee=$p(null),Ye.html===!0&&(q(T,Am),q(Ee,Lm)),Ye.svg===!0&&(q(T,jm),q(Ee,Rm),q(Ee,Bm)),Ye.svgFilters===!0&&(q(T,Mm),q(Ee,Rm),q(Ee,Bm)),Ye.mathMl===!0&&(q(T,Pm),q(Ee,zm),q(Ee,Bm))),je.tagCheck=null,je.attributeCheck=null,ym(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?je.tagCheck=e.ADD_TAGS:cm(e.ADD_TAGS)&&(T===Te&&(T=Em(T)),q(T,e.ADD_TAGS,gt))),ym(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?je.attributeCheck=e.ADD_ATTR:cm(e.ADD_ATTR)&&(Ee===De&&(Ee=Em(Ee)),q(Ee,e.ADD_ATTR,gt))),ym(e,`ADD_FORBID_CONTENTS`)&&cm(e.ADD_FORBID_CONTENTS)&&(Xe===Ze&&(Xe=Em(Xe)),q(Xe,e.ADD_FORBID_CONTENTS,gt)),qe&&(T[`#text`]=!0),D&&q(T,[`html`,`head`,`body`]),T.table&&(q(T,[`tbody`]),delete ke.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw Sm(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw Sm(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=ne;ne=e.TRUSTED_TYPES_POLICY;try{re=ce(``)}catch(e){throw ne=t,e}}else e.TRUSTED_TYPES_POLICY===null?(ne=void 0,re=``):(ne===void 0&&(ne=ue()),ne&&typeof re==`string`&&(re=ce(``)));Zp&&Zp(e),_t=e},xt=q({},[...jm,...Mm,...Nm]),St=q({},[...Pm,...Fm]),Ct=function(e,t,n){return t.namespaceURI===it?e===`svg`:t.namespaceURI===nt?e===`svg`&&(n===`annotation-xml`||ut[n]):!!xt[e]},wt=function(e,t,n){return t.namespaceURI===it?e===`math`:t.namespaceURI===rt?e===`math`&&ft[n]:!!St[e]},Tt=function(e,t,n){return t.namespaceURI===rt&&!ft[n]||t.namespaceURI===nt&&!ut[n]?!1:!St[e]&&(pt[e]||!xt[e])},Et=function(e){let t=_(e);(!t||!t.tagName)&&(t={namespaceURI:at,tagName:`template`});let n=lm(e.tagName),r=lm(t.tagName);return st[e.namespaceURI]?e.namespaceURI===rt?Ct(n,t,r):e.namespaceURI===nt?wt(n,t,r):e.namespaceURI===it?Tt(n,t,r):!!(mt===`application/xhtml+xml`&&st[e.namespaceURI]):!1},Dt=function(e){om(t.removed,{element:e});try{_(e).removeChild(e)}catch{if(p(e),!_(e))throw Sm(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}},Ot=function(e,t,n){try{m(e,t)}catch{try{e.removeAttribute(n)}catch{}}},kt=function(e){Mt(e);let t=g(e);if(t){let e=[];rm(t,t=>{om(e,t)}),rm(e,e=>{try{p(e)}catch{}})}let n=y(e);if(n)for(let t=n.length-1;t>=0;--t){let r=n[t],i=r&&r.name;typeof i==`string`&&Ot(e,r,i)}},At=function(e,n,r){if(!r)try{r=n.getAttributeNode(e)}catch{r=null}om(t.removed,{attribute:r||null,from:n});try{r?m(n,r):n.removeAttribute(e)}catch{try{n.removeAttribute(e)}catch{}}if(e===`is`){if(Ve||He)try{Dt(n)}catch{}else try{n.setAttribute(e,``)}catch{}}},jt=function(e){let t=y(e);if(t)for(let n=t.length-1;n>=0;--n){let r=t[n],i=r&&r.name;typeof i!=`string`||Ee[gt(i)]||Ot(e,r,i)}},Mt=function(e){let t=[e];for(;t.length>0;){let e=t.pop();S(e)===th.element&&jt(e);let n=g(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},Nt=function(e,t){return Ie?e===`patchsrc`||e===`for`&&t!==`label`&&t!==`output`:!1},Pt=function(e){if(!Ie)return;let t=[e];for(;t.length>0;){let e=t.pop(),n=S(e);if(n===th.processingInstruction||n===th.comment&&xm(Qm,e.data)){try{p(e)}catch{}continue}if(n===th.element){let t=e,n=gt(te(e));try{t.hasAttribute&&t.hasAttribute(`patchsrc`)&&t.removeAttribute(`patchsrc`),t.hasAttribute&&t.hasAttribute(`for`)&&Nt(`for`,n)&&t.removeAttribute(`for`)}catch{}}let r=g(e);if(r)for(let e=r.length-1;e>=0;--e)t.push(r[e])}},Ft=function(e){let t=null,r=null;if(Be)e=`<remove></remove>`+e;else{let t=dm(e,/^[\r\n\t ]+/);r=t&&t[0]}mt===`application/xhtml+xml`&&at===it&&(e=`<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>`+e+`</body></html>`);let i=ne?ce(e):e;if(at===it)try{t=new l().parseFromString(i,mt)}catch{}if(!t||!t.documentElement){t=C.createDocument(at,`template`,null);try{t.documentElement.innerHTML=ot?re:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),at===it?me.call(t,D?`html`:`body`)[0]:D?t.documentElement:a},It=function(e){let t=x?x(e):e.ownerDocument;return fe.call(t||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},Lt=function(e){return e=fm(e,_e,` `),e=fm(e,ve,` `),e=fm(e,ye,` `),e},Rt=function(e){e.normalize();let t=x?x(e):e.ownerDocument,n=fe.call(t||e,e,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null),r=n.nextNode();for(;r;)r.data=Lt(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&rm(i,e=>{Bt(e.content)&&Rt(e.content)})},zt=function(e){let t=ee?ee(e):null;return typeof t!=`string`||gt(t)!==`form`?!1:typeof e.nodeName!=`string`||typeof e.textContent!=`string`||typeof e.removeChild!=`function`||e.attributes!==y(e)||typeof e.removeAttribute!=`function`||typeof e.removeAttributeNode!=`function`||typeof e.getAttributeNode!=`function`||typeof e.setAttribute!=`function`||typeof e.namespaceURI!=`string`||typeof e.insertBefore!=`function`||typeof e.hasChildNodes!=`function`||e.nodeType!==b(e)||e.childNodes!==g(e)},Bt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return b(e)===th.documentFragment}catch{return!1}},Vt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return typeof b(e)==`number`}catch{return!1}};function Ht(e,n,r){e.length!==0&&rm(e,e=>{e.call(t,n,r,_t)})}let Ut=function(e,t){return!!(Ie&&e.hasChildNodes()&&!Vt(e.firstElementChild)&&xm(Zm,e.textContent)&&xm(Zm,e.innerHTML)||Ie&&e.namespaceURI===it&&rh[t]&&(Vt(e.firstElementChild)||typeof e.textContent==`string`&&xm(ih[t],e.textContent))||e.nodeType===th.processingInstruction||Ie&&e.nodeType===th.comment&&xm(Qm,e.data))},Wt=function(e,t){return e instanceof RegExp?xm(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},Gt=function(e,t,n){if(!ke[t]&&Zt(t)&&Wt(Oe.tagNameCheck,t))return!1;if(qe&&!Xe[t]){let t=_(e),r=g(e);if(r&&t){let i=r.length;for(let a=i-1;a>=0;--a){let i=e===n?f(r[a],!0):r[a];t.insertBefore(i,h(e))}}}return Dt(e),!0},Kt=function(e,t,n,r){return e.length===0?t:t===n||t===r?Em(t):t},qt=function(e,t){return e===t||_(e)!==null?!1:(Je&&Mt(e),!0)},Jt=function(e,n){if(Ht(ge.beforeSanitizeElements,e,null),qt(e,n))return!0;if(zt(e))return Dt(e),!0;let r=gt(te(e));if(T=Kt(ge.uponSanitizeElement,T,Te,Re),Ht(ge.uponSanitizeElement,e,{tagName:r,allowedTags:T}),qt(e,n))return!0;if(Ut(e,r))return Dt(e),!0;if(ke[r]||!(je.tagCheck instanceof Function&&je.tagCheck(r))&&!T[r]){let t=Gt(e,r,n);return t===!1&&(Ht(ge.afterSanitizeElements,e,null),qt(e,n))?!0:t}if(S(e)===th.element&&!Et(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&xm($m,e.innerHTML))return Dt(e),!0;if(Fe&&e.nodeType===th.text){let n=Lt(e.textContent);e.textContent!==n&&(om(t.removed,{element:e.cloneNode()}),e.textContent=n)}return Ht(ge.afterSanitizeElements,e,null),qt(e,n)},Yt=function(e,t,r){if(Ae[t]||Nt(t,e)||We&&(t===`id`||t===`name`)&&(r in n||r in vt))return!1;let i=Ee[t]||je.attributeCheck instanceof Function&&je.attributeCheck(t,e);return Me&&xm(be,t)||E&&xm(xe,t)?!0:i?et[t]||xm(we,fm(r,w,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&pm(r,`data:`)===0&&Qe[e]||Ne&&!xm(Se,fm(r,w,``))?!0:!r:Zt(e)&&Wt(Oe.tagNameCheck,e)&&Wt(Oe.attributeNameCheck,t,e)||t===`is`&&Oe.allowCustomizedBuiltInElements&&Wt(Oe.tagNameCheck,r)},Xt=q({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]),Zt=function(e){return!Xt[lm(e)]&&xm(Ce,e)},Qt=function(e,t,n,r){if(ne&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return ce(r);case`TrustedScriptURL`:return le(r)}return r},O=function(e,t,n,r){try{return n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),!zt(e)||(Dt(e),!1)}catch{return At(t,e),!1}},$t=function(e,n){if(Ht(ge.beforeSanitizeAttributes,e,null),qt(e,n))return;let r=e.attributes;if(!r||zt(e))return;Ee=Kt(ge.uponSanitizeAttribute,Ee,De,ze);let i={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:Ee,forceKeepAttr:void 0},a=r.length,o=gt(e.nodeName);for(;a--;){let n=r[a],s=n.name,c=n.namespaceURI,l=n.value,u=gt(s),d=l,f=s===`value`?d:mm(d),p=!1;if(i.attrName=u,i.attrValue=f,i.keepAttr=!0,i.forceKeepAttr=void 0,Ht(ge.uponSanitizeAttribute,e,i),f=i.attrValue,Ge&&(u===`id`||u===`name`)&&pm(f,Ke)!==0&&(At(s,e,n),f=Ke+f,p=!0),Ie&&xm(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){At(s,e,n);continue}if(u===`attributename`&&dm(f,`href`)){At(s,e,n);continue}if(!i.forceKeepAttr){if(!i.keepAttr){At(s,e,n);continue}if(!Pe&&xm(eh,f)){At(s,e,n);continue}if(Fe&&(f=Lt(f)),!Yt(o,u,f)){At(s,e,n);continue}f=Qt(o,u,c,f),f!==d&&O(e,s,c,f)&&p&&am(t.removed)}}Ht(ge.afterSanitizeAttributes,e,null),qt(e,n)},en=function(e){let t=null,n=It(e);for(Ht(ge.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(Ht(ge.uponSanitizeShadowNode,t,null),Jt(t,e),$t(t,e),Bt(t.content)&&en(t.content),S(t)===th.element){let e=v(t);Bt(e)&&(tn(e),en(e))}Ht(ge.afterSanitizeShadowDOM,e,null)},tn=function(e){let t=[{node:e,shadow:null}];for(;t.length>0;){let e=t.pop();if(e.shadow){en(e.shadow);continue}let n=e.node,r=S(n)===th.element,i=g(n);if(i)for(let e=i.length-1;e>=0;--e)t.push({node:i[e],shadow:null});if(r){let e=ee?ee(n):null;if(typeof e==`string`&>(e)===`template`){let e=n.content;Bt(e)&&t.push({node:e,shadow:null})}}if(r){let e=v(n);Bt(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return t.sanitize=function(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=null,a=null,o=null,s=null;if(ot=!e,ot&&(e=`<!-->`),typeof e!=`string`&&!Vt(e)&&(e=Dm(e),typeof e!=`string`))throw Sm(`dirty is not a string, aborting`);if(!t.isSupported)return e;Le?(T=Re,Ee=ze):bt(n),(ge.uponSanitizeElement.length>0||ge.uponSanitizeAttribute.length>0)&&(T=Em(T)),ge.uponSanitizeAttribute.length>0&&(Ee=Em(Ee)),t.removed=[];let c=Je&&typeof e!=`string`&&Vt(e);if(c){Pt(e);let t=te(e);if(typeof t==`string`){let n=gt(t);if(!T[n]||ke[n])throw kt(e),Sm(`root node is forbidden and cannot be sanitized in-place`)}if(zt(e))throw kt(e),Sm(`root node is clobbered and cannot be sanitized in-place`);try{tn(e)}catch(t){throw kt(e),t}}else if(Vt(e))i=Ft(`<!---->`),a=i.ownerDocument.importNode(e,!0),a.nodeType===th.element&&a.nodeName===`BODY`||a.nodeName===`HTML`?i=a:i.appendChild(a),tn(i);else{if(!Ve&&!Fe&&!D&&e.indexOf(`<`)===-1)return ne&&Ue?ce(e):e;if(i=Ft(e),!i)return Ve?null:Ue?re:``}i&&Be&&Dt(i.firstChild);let l=c?e:i;try{let e=It(l);for(;o=e.nextNode();)Jt(o,l),$t(o,l),Bt(o.content)&&en(o.content)}catch(n){throw c&&(kt(e),rm(t.removed,e=>{e.element&&Mt(e.element)})),n}if(c){let n=!1;if(rm(t.removed,t=>{t.element&&(t.element===e&&(n=!0),Mt(t.element))}),n)throw Sm(`a node selected for removal could not be safely returned; refusing to sanitize in place`);return Fe&&Rt(e),e}if(Ve){if(Fe&&Rt(i),He)for(s=pe.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return(Ee.shadowroot||Ee.shadowrootmode)&&(s=he.call(r,s,!0)),s}let u=D?i.outerHTML:i.innerHTML;return D&&T[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&xm(Ym,i.ownerDocument.doctype.name)&&(u=`<!DOCTYPE `+i.ownerDocument.doctype.name+`>
|
|
75
|
-
`+u),Fe&&(u=Lt(u)),ne&&Ue?ce(u):u},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};bt(e),Le=!0,Re=T,ze=Ee},t.clearConfig=function(){_t=null,Le=!1,Re=null,ze=null,ne=ie,re=``},t.isValidAttribute=function(e,t,n){_t||bt({});let r=gt(e),i=gt(t);return Yt(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&ym(ge,e)&&om(ge[e],t)},t.removeHook=function(e,t){if(ym(ge,e)){if(t!==void 0){let n=im(ge[e],t);return n===-1?void 0:sm(ge[e],n,1)[0]}return am(ge[e])}},t.removeHooks=function(e){ym(ge,e)&&(ge[e]=[])},t.removeAllHooks=function(){ge=sh()},t}var dh=uh();function fh(e,t){let n;try{n=new URL(e.trim())}catch{return null}return n.protocol!==`https:`&&n.protocol!==`http:`||n.origin===t?null:n.href}var ph=`p.br.hr.strong.b.em.i.del.s.code.pre.blockquote.ul.ol.li.a.h1.h2.h3.h4.h5.h6.small.sub.sup.table.thead.tbody.tr.th.td.img.input`.split(`.`),mh=[`form`,`style`,`script`,`button`,`select`,`textarea`,`iframe`,`object`,`embed`,`svg`,`math`],hh={a:[`href`,`title`],img:[`src`,`alt`,`title`],th:[`colspan`,`rowspan`,`align`],td:[`colspan`,`rowspan`,`align`],ol:[`start`],code:[`class`],input:[`type`,`checked`,`disabled`]},gh=[...new Set(Object.values(hh).flat())],_h=/^language-[\w-]+$/,vh=/^\d{1,4}$/,yh=/^(left|right|center)$/i;function bh(e,t,n){if(!Object.hasOwn(hh,e)||!hh[e].includes(t))return!1;switch(t){case`class`:return _h.test(n);case`type`:return n.toLowerCase()===`checkbox`;case`colspan`:case`rowspan`:case`start`:return vh.test(n);case`align`:return yh.test(n);default:return!0}}var xh=/^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9+/]+={0,2}$/i,Sh=/^\/api(\/|$)/i;function Ch(e,t){if(xh.test(e))return!0;if(!e.trim())return!1;let n;try{n=new URL(e,t)}catch{return!1}return(n.protocol===`https:`||n.protocol===`http:`)&&n.origin===t&&!Sh.test(n.pathname)}dh.isSupported&&dh.addHook(`afterSanitizeAttributes`,e=>{let t=e.nodeName.toLowerCase();for(let{name:n,value:r}of Array.from(e.attributes))bh(t,n,r)||e.removeAttribute(n);if(t===`img`&&!Ch(e.getAttribute(`src`)??``,location.origin)){e.replaceWith(document.createTextNode(e.getAttribute(`alt`)??``));return}if(t===`input`){e.getAttribute(`type`)===null?e.remove():e.setAttribute(`disabled`,``);return}if(t!==`a`)return;let n=e.getAttribute(`href`),r=n===null?null:fh(n,location.origin);r?(e.setAttribute(`href`,r),e.setAttribute(`target`,`_blank`),e.setAttribute(`rel`,`noopener noreferrer`)):(e.removeAttribute(`href`),e.removeAttribute(`target`))});var wh={ALLOWED_TAGS:ph,ALLOWED_ATTR:gh,FORBID_TAGS:mh,ALLOW_DATA_ATTR:!1,ALLOW_ARIA_ATTR:!1},Th=new Map;function Eh(e){let t=Th.get(e);return t===void 0&&(t=dh.sanitize(Lp.parse(e,{async:!1}),wh),Th.size>400&&Th.delete(Th.keys().next().value),Th.set(e,t)),t}var Dh=`demo.job-runs`,Oh=e=>e.status!==`running`&&e.status!==`waiting`,kh=V(()=>gu.value?.info?.jobs??[]),Ah=e=>kh.value.find(t=>t.id===e),jh=V(()=>{let e=Nu.value.docs[Dh];return Object.values(e?.items??{}).sort((e,t)=>t.id-e.id)}),Mh=e=>jh.value.find(t=>t.id===e),Nh=e=>jh.value.find(t=>t.toolCallId===e),Ph=k(Date.now());setInterval(()=>Ph.value=Date.now(),1e3);var Fh=e=>e<1e3?`${Math.max(0,Math.round(e))}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m ${Math.round(e%6e4/1e3)}s`,Ih=k();async function Lh(e,t){if(!Ih.value){Ih.value=e;try{return await Wu(t)}finally{Ih.value=void 0}}}function Rh(e){$u.value&&nd(),setTimeout(()=>document.querySelector(`[data-job-run="${e}"]`)?.scrollIntoView({behavior:`smooth`,block:`center`}))}async function zh(e){let t=await Lh(`start:${e.id}`,()=>Cu.value.demo(`jobs`,{job:e.id}));t&&(G(`${e.title} started. It runs in the chat.`),Rh(t.taskId))}var Bh=(e,t)=>Lh(`decide:${e.id}`,()=>Cu.value.demo(`jobs/${e.id}/approval`,{approved:t})),Vh=e=>Lh(`stop:${e.id}`,()=>wu.value.abortTask(e.id));function Hh(e){U.value&&Tu({...U.value,agentId:e})}var Uh=[`data-job-run`,`aria-label`],Wh={class:`job-run-head`},Gh={class:`job-run-icon`},Kh={class:`job-run-titles`},qh={class:`job-run-eyebrow`},Jh={class:`job-run-repeat`},Yh={key:0,class:`job-run-about`},Xh={class:`job-run-meta`},Zh={key:0,class:`job-run-resumed`},Qh={class:`job-stepper`,"aria-label":`Phases`},$h=[`aria-current`],eg={class:`job-chip`},tg={class:`job-step-dot`},ng={class:`job-step-label`},rg={key:0,class:`job-step-progress`},ig={class:`job-phases`},ag=[`open`],og={class:`job-phase-n`},sg={class:`job-phase-summary`},cg={class:`job-phase-time`},lg={key:0,class:`job-phase-about`},ug={key:1,class:`job-steps`},dg=[`open`],fg={key:1,class:`job-step-line`},pg=[`onClick`],mg={key:2,class:`job-phase-empty`},hg={key:1,class:`job-approval`,role:`group`,"aria-label":`Approval`},gg={class:`job-approval-buttons`},_g=[`disabled`],vg=[`disabled`],yg={key:2,class:`message-error`},bg={class:`job-run-foot`},xg=[`disabled`],Sg=Or({__name:`JobCard`,props:{run:{}},setup(e){let t=e,n=V(()=>Ah(t.run.job)),r=V(()=>Oh(t.run)),i=V(()=>Fh((t.run.endedAt??Ph.value)-t.run.startedAt)),a={running:`Running`,waiting:`Waiting for you`,completed:`Completed`,failed:`Failed`,aborted:`Stopped`,declined:`Declined`},o={command:Qc,tool:al,agent:Zs,state:Qs,approval:Jc,checkpoint:pc,note:Dc},s=e=>e.kind===`tool`?`${e.label}: a subagent tool call, its own durable task`:e.label,c=e=>{let t=e.step,n=[`command`,`tool`,`state`].includes(t.kind)?oo(`code`,{title:s(t)},t.label):oo(`span`,{class:`job-step-text`},t.label),r=t.status===`running`?oo(Oc,{size:15,class:`spin`}):t.status===`done`?oo(ec,{size:15}):t.status===`waiting`?oo(yc,{size:15}):oo(ol,{size:15});return[oo(o[t.kind],{size:16,class:`job-step-kind`}),n,t.kind===`tool`&&t.detail?oo(`span`,{class:`job-step-args`,title:t.detail},t.detail):null,oo(`span`,{class:`job-step-state`},[r,t.ms!==void 0&&t.kind!==`note`?oo(`span`,Fh(t.ms)):null])]};c.props=[`step`];let l=e=>n.value?.phases.find(t=>t.id===e),u=e=>e.startedAt?Fh((e.endedAt??(e.status===`running`||e.status===`waiting`?Ph.value:e.startedAt))-e.startedAt):``,d=e=>e.status!==`pending`&&e.status!==`skipped`,f=V(()=>Object.entries(t.run.input)),p=V(()=>t.run.phases.find(e=>e.status===`waiting`));return(t,o)=>(P(),F(`article`,{class:w([`job-run`,`is-${e.run.status}`]),"data-job-run":e.run.id,"aria-label":`${e.run.title} run ${e.run.run}: ${a[e.run.status]}`},[L(`header`,Wh,[L(`span`,Gh,[R(A(il),{size:22})]),L(`div`,Kh,[L(`div`,qh,[o[3]||=L(`span`,null,`DURABLE JOB`,-1),L(`span`,Jh,[R(A(Gc),{size:15}),z(`Repeatable workflow, run #`+E(e.run.run),1)])]),L(`h3`,null,E(e.run.title),1)]),L(`span`,{class:w([`job-run-status`,e.run.status])},[o[4]||=L(`i`,null,null,-1),z(E(a[e.run.status]),1)],2)]),n.value?(P(),F(`p`,Yh,E(n.value.summary),1)):B(``,!0),L(`div`,Xh,[L(`span`,null,`task #`+E(e.run.id),1),L(`span`,null,E(e.run.startedBy===`agent`?`started by the agent`:`started by you`),1),L(`span`,null,E(i.value),1),(P(!0),F(N,null,M(f.value,([e,t])=>(P(),F(`span`,{key:e,class:`job-run-input`},E(e)+`=`+E(t),1))),128)),e.run.resumed?(P(),F(`span`,Zh,`resumed `+E(e.run.resumed)+`× after restart`,1)):B(``,!0)]),L(`ol`,Qh,[(P(!0),F(N,null,M(e.run.phases,(t,n)=>(P(),F(`li`,{key:t.id,class:w(`ph-${t.status}`),"aria-current":e.run.phase===t.id&&!r.value?`step`:void 0},[L(`span`,eg,[L(`span`,tg,[t.status===`done`?(P(),I(A(ec),{key:0,size:15})):t.status===`running`?(P(),I(A(Oc),{key:1,size:15,class:`spin`})):t.status===`waiting`?(P(),I(A(yc),{key:2,size:15})):[`failed`,`aborted`].includes(t.status)?(P(),I(A(ol),{key:3,size:15})):(P(),F(N,{key:4},[z(E(n+1),1)],64))]),L(`span`,ng,E(t.label),1),t.progress?(P(),F(`span`,rg,E(t.progress.done)+`/`+E(t.progress.total),1)):B(``,!0)])],10,$h))),128))]),L(`div`,ig,[(P(!0),F(N,null,M(e.run.phases,(e,t)=>(P(),F(`details`,{key:e.id,class:w([`job-phase`,`ph-${e.status}`]),open:d(e)},[L(`summary`,null,[L(`span`,og,E(t+1),1),L(`strong`,null,E(e.label),1),L(`span`,sg,E(e.summary??(e.status===`pending`?l(e.id)?.summary:e.status===`skipped`?`Skipped`:``)),1),L(`span`,cg,E(u(e)),1)]),e.status===`done`?B(``,!0):(P(),F(`p`,lg,E(l(e.id)?.summary),1)),e.steps.length?(P(),F(`ul`,ug,[(P(!0),F(N,null,M(e.steps,e=>(P(),F(`li`,{key:e.id,class:w([`k-${e.kind}`,`st-${e.status}`])},[e.detail&&e.kind!==`tool`?(P(),F(`details`,{key:0,open:e.status===`error`},[L(`summary`,null,[R(c,{step:e},null,8,[`step`])]),L(`pre`,null,E(e.detail),1)],8,dg)):(P(),F(`div`,fg,[R(c,{step:e},null,8,[`step`])])),e.kind===`agent`&&e.conversationId?(P(),F(`button`,{key:2,class:`text-button job-step-link`,onClick:t=>A(Hh)(e.conversationId)},` Open subagent #`+E(e.conversationId),9,pg)):B(``,!0)],2))),128))])):e.status===`pending`?(P(),F(`p`,mg,`Not started yet.`)):B(``,!0)],10,ag))),128))]),e.run.approval===`pending`?(P(),F(`div`,hg,[L(`div`,null,[R(A(Jc),{size:20}),o[5]||=L(`strong`,null,`Approve to continue`,-1)]),L(`p`,null,E(p.value?l(p.value.id)?.summary:`This run waits for you`)+`. It is paused on a saved checkpoint: close the browser or restart the device and the decision will still be waiting. `,1),L(`div`,gg,[L(`button`,{class:`primary small`,disabled:!!A(Ih),onClick:o[0]||=t=>A(Bh)(e.run,!0)},[R(A(ec),{size:18}),o[6]||=z(`Approve & continue `,-1)],8,_g),L(`button`,{class:`secondary`,disabled:!!A(Ih),onClick:o[1]||=t=>A(Bh)(e.run,!1)},`Decline`,8,vg)])])):B(``,!0),e.run.error&&e.run.status!==`aborted`?(P(),F(`p`,yg,E(e.run.error),1)):B(``,!0),L(`footer`,bg,[L(`span`,null,E(e.run.background?`Runs in the background: the conversation owns it, so Interrupt leaves it running.`:`Owned by this tool call: Interrupt stops it.`)+` Each phase saves a checkpoint, so a restart resumes the current phase.`,1),r.value?B(``,!0):(P(),F(`button`,{key:0,class:`secondary danger`,disabled:!!A(Ih),onClick:o[2]||=t=>A(Vh)(e.run)},[R(A(Pc),{size:16}),o[7]||=z(`Stop `,-1)],8,xg))])],10,Uh))}}),Cg={class:`message-label`},wg={class:`user-message`},Tg={class:`message-label`},Eg={key:0,class:`streaming`},Dg={key:1},Og=[`aria-label`],kg=[`innerHTML`],Ag={key:1,class:`thinking`},jg=[`data-call-id`],Mg={class:`tool-status`},Ng={class:`tool-section-label`},Pg=[`aria-label`,`onClick`],Fg={key:0,class:`typing`},Ig={key:1,class:`message-error`},Lg=[`aria-label`],Rg={key:3,class:`live-tool`},zg={key:0},Bg={class:`event-line`},Vg=[`aria-label`],Hg={key:0,class:`raw`},Ug=Or({__name:`TranscriptItem`,props:{item:{}},emits:[`fork`],setup(e,{emit:t}){let n=t,r=e=>e.status===`error`?`Error`:e.status===`done`?`Done`:e.status,i=e=>e.kind===`user`?`pi-user`:e.kind===`assistant`?e.streaming?`live-generation`:`pi-assistant`:e.kind===`tool-result`?`pi-tool-result`:e.kind===`tool`?`live-tool-entry`:e.entryKind.replaceAll(`.`,`-`);return(t,a)=>(P(),F(`article`,{class:w([`entry`,i(e.item)])},[e.item.kind===`user`?(P(),F(N,{key:0},[L(`div`,Cg,[a[3]||=z(` YOU `,-1),L(`span`,null,`#`+E(e.item.id),1)]),L(`div`,wg,E(e.item.text),1)],64)):e.item.kind===`assistant`?(P(),F(N,{key:1},[L(`div`,Tg,[a[5]||=z(` AGENT `,-1),e.item.streaming?(P(),F(`span`,Eg,`Working`)):(P(),F(`span`,Dg,`#`+E(e.item.id),1)),e.item.streaming?B(``,!0):(P(),F(`button`,{key:2,class:`fork-button`,"aria-label":`Fork at entry ${e.item.id}`,title:`Fork from this entry. App State stays shared.`,onClick:a[0]||=t=>n(`fork`,e.item.id)},[R(A(vc),{size:18}),a[4]||=z(`Fork `,-1)],8,Og))]),(P(!0),F(N,null,M(e.item.blocks,(e,t)=>(P(),F(N,{key:t},[e.type===`text`?(P(),F(`div`,{key:0,class:`markdown`,innerHTML:A(Eh)(e.text)},null,8,kg)):e.type===`thinking`?(P(),F(`details`,Ag,[a[6]||=L(`summary`,null,`Thinking`,-1),L(`div`,null,E(e.text),1)])):(P(),F(`details`,{key:2,class:w([`tool-call`,{failed:e.call.status===`error`}]),"data-call-id":e.call.callId},[L(`summary`,null,[e.call.status===`error`?(P(),I(A(Sc),{key:0,size:18})):e.call.status===`done`?(P(),I(A(ec),{key:1,size:18})):e.call.status===`running`?(P(),I(A(Us),{key:2,size:18})):(P(),I(A(al),{key:3,size:18})),L(`strong`,null,E(e.call.name),1),L(`code`,null,E(A(qu)(e.call.args)?.slice(0,90)),1),L(`span`,Mg,E(r(e.call)),1)]),a[10]||=L(`div`,{class:`tool-section-label`},`Input`,-1),L(`pre`,null,E(A(qu)(e.call.args)),1),e.call.result===void 0?e.call.output?(P(),F(N,{key:1},[a[9]||=L(`div`,{class:`tool-section-label`},`Live output`,-1),L(`pre`,null,E(e.call.output),1)],64)):B(``,!0):(P(),F(N,{key:0},[L(`div`,Ng,[a[8]||=L(`span`,null,`Result`,-1),e.call.resultEntryId===void 0?B(``,!0):(P(),F(`button`,{key:0,class:`fork-button`,"aria-label":`Fork at entry ${e.call.resultEntryId}`,title:`Fork after this result`,onClick:t=>n(`fork`,e.call.resultEntryId)},[R(A(vc),{size:18}),a[7]||=z(`Fork `,-1)],8,Pg))]),L(`pre`,null,E(e.call.result),1)],64))],10,jg)),e.type===`tool`&&e.call.name===`run_durable_job`&&A(Nh)(e.call.callId)?(P(),I(Sg,{key:3,run:A(Nh)(e.call.callId)},null,8,[`run`])):B(``,!0)],64))),128)),e.item.streaming&&!e.item.blocks.length?(P(),F(`div`,Fg,[...a[11]||=[L(`i`,null,null,-1),L(`i`,null,null,-1),L(`i`,null,null,-1)]])):B(``,!0),e.item.error?(P(),F(`div`,Ig,E(e.item.error),1)):B(``,!0)],64)):e.item.kind===`tool-result`?(P(),F(`details`,{key:2,class:w([`tool-result`,{failed:e.item.isError}])},[L(`summary`,null,[e.item.isError?(P(),I(A(Sc),{key:1,size:18})):(P(),I(A(ec),{key:0,size:18})),L(`strong`,null,E(e.item.name),1),L(`span`,null,E(e.item.isError?`error`:`result`),1),L(`button`,{class:`fork-button`,"aria-label":`Fork at entry ${e.item.id}`,onClick:a[1]||=js(t=>n(`fork`,e.item.id),[`prevent`])},[R(A(vc),{size:18}),a[12]||=z(`Fork `,-1)],8,Lg)]),L(`pre`,null,E(e.item.text),1)],2)):e.item.kind===`tool`?(P(),F(`div`,Rg,[L(`div`,null,[R(A(Us),{size:18}),L(`strong`,null,E(e.item.call.name),1),L(`span`,null,E(e.item.call.status),1)]),e.item.call.output?(P(),F(`pre`,zg,E(e.item.call.output),1)):B(``,!0),e.item.call.name===`run_durable_job`&&A(Nh)(e.item.call.callId)?(P(),I(Sg,{key:1,run:A(Nh)(e.item.call.callId)},null,8,[`run`])):B(``,!0)])):e.item.entryKind===`demo.job`&&A(Mh)(e.item.data.taskId)?(P(),I(Sg,{key:4,run:A(Mh)(e.item.data.taskId)},null,8,[`run`])):(P(),F(N,{key:5},[L(`div`,Bg,[e.item.entryKind===`demo.state-change`?(P(),I(A(Qs),{key:0,size:18})):(P(),I(A(Tc),{key:1,size:18})),L(`span`,null,E(e.item.text),1),L(`button`,{class:`fork-button`,"aria-label":`Fork at entry ${e.item.id}`,onClick:a[2]||=t=>n(`fork`,e.item.id)},[R(A(vc),{size:18}),a[13]||=z(`Fork `,-1)],8,Vg)]),e.item.note?(P(),F(`details`,Hg,[a[14]||=L(`summary`,null,`Context note`,-1),L(`pre`,null,E(e.item.note),1)])):B(``,!0)],64))],2))}}),Wg={key:0,class:`git-chip-wrap`},Gg=[`title`],Kg={class:`branch`},qg={key:0,class:`dirty`},Jg={key:1,class:`ahead`},Yg={key:2,class:`behind`},Xg=Or({__name:`GitChip`,props:{deviceId:{},cwd:{}},setup(e){let t=e,n=V(()=>t.cwd??xu.value?.cwd??``),r=V(()=>t.deviceId??hu.value),i=V(()=>Dd(r.value||`?`,n.value||`?`)),a=V(()=>i.value.status),o=V(()=>i.value.loading),s=V(()=>(a.value?.staged??0)+(a.value?.unstaged??0)+(a.value?.untracked??0));return kd(r.value||`?`,n.value||`?`),Jr(()=>kd(r.value||`?`,n.value||`?`)),j([r,n],()=>void kd(r.value||`?`,n.value||`?`)),(e,t)=>a.value?.repo||o.value?(P(),F(`span`,Wg,[L(`button`,{class:`crumb git-chip`,title:a.value?`${a.value.root} · ${a.value.head??``} ${a.value.subject??``} — opens the Git tab`:`loading git…`,onClick:t[0]||=e=>A(td)(`git`)},[R(A(gc),{size:16,"aria-hidden":`true`}),L(`span`,Kg,E(a.value?.branch??a.value?.head??`…`),1),s.value?(P(),F(`span`,qg,`±`+E(s.value),1)):B(``,!0),a.value?.ahead?(P(),F(`span`,Jg,`↑`+E(a.value.ahead),1)):B(``,!0),a.value?.behind?(P(),F(`span`,Yg,`↓`+E(a.value.behind),1)):B(``,!0),R(A(tc),{size:14,"aria-hidden":`true`})],8,Gg)])):B(``,!0)}}),Zg=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Qg=Zg(Xg,[[`__scopeId`,`data-v-c0fb9e98`]]),$g=()=>globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`,e_=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],t_={enabled:!0,reserveTokens:16384,backgroundTokens:32768,keepRecentTokens:2e3},n_={auto:2e5,wait:25e4};function r_(e){if(!(e>0))return{...t_};let t=Math.min(n_.wait,e-t_.reserveTokens),n=Math.min(n_.auto,t-t_.backgroundTokens);return{...t_,reserveTokens:e-t,backgroundTokens:t-n}}function i_(e,t){let n=Math.max(0,e-t.reserveTokens);return{wait:n,auto:t.backgroundTokens>0?Math.max(0,n-t.backgroundTokens):void 0}}var a_=(e,t)=>{if(e===void 0)throw Error(`No ${t} selected`);return e},o_=[{name:`compact`,args:`[instructions]`,description:`Summarize older context; stored entries stay`,run:async e=>{await a_(Cu.value,`agent`).compact(e||void 0),G(`Compaction requested. /tasks shows its outcome.`)}},{name:`reset`,args:`[handoff note]`,description:`Start a fresh context; history stays stored`,run:async e=>{await a_(Cu.value,`agent`).reset(e||void 0),G(`New context started.`)}},{name:`tasks`,description:`Open the Tasks panel`,run:()=>td(`tasks`)},{name:`new`,args:`[name]`,description:`New agent in this workspace`,run:async e=>{let t=a_(U.value,`workspace`),n=await a_(wu.value,`workspace`).createAgent(e?{name:e}:{});Tu({...t,agentId:n.id}),G(`New agent ${n.name}.`)}},{name:`fork`,args:`[entryId] [name]`,description:`Fork at an entry (default: the last reply)`,run:async e=>{let[t,...n]=e.split(/\s+/).filter(Boolean),r=t&&/^\d+$/.test(t)?Number(t):void 0,i=(r===void 0?[t,...n]:n).filter(Boolean).join(` `),a=r??Nu.value.entries.filter(e=>e.kind===`pi.assistant`).at(-1)?.id;if(a===void 0)throw Error(`Nothing to fork yet`);let o=a_(U.value,`agent`),s=await a_(Cu.value,`agent`).fork({entryId:a,name:i||void 0});Tu({...o,agentId:s.id}),G(`Forked at entry #${a}. App State stays shared.`)}},{name:`name`,args:`<name>`,description:`Rename this agent`,run:async e=>{if(!e)throw Error(`Usage: /name <name>`);await a_(Cu.value,`agent`).rename(e),G(`Agent renamed to ${e}.`)}},{name:`model`,description:`Choose this agent's model`,run:()=>W.dialog={kind:`models`}},{name:`thinking`,args:`<level>`,description:`Thinking level: ${e_.join(`, `)}`,run:async e=>{if(!e_.includes(e))throw Error(`Levels: ${e_.join(`, `)}`);await a_(Cu.value,`agent`).configure({thinkingLevel:e}),await Hu(),G(`Thinking ${e}. Used on the next turn.`)}},{name:`help`,description:`How this works, keys and commands`,run:()=>W.dialog={kind:`help`}}];function s_(e){let t=e.trim().match(/^\/(\S+)\s*([\s\S]*)$/),n=t&&o_.find(e=>e.name===t[1]);return n?{command:n,arg:t[2].trim()}:void 0}var c_={class:`composer-region`},l_={key:0,class:`queue`},u_=[`aria-label`,`onClick`],d_={class:`composer`},f_={key:0,class:`slash-menu`,role:`listbox`,"aria-label":`Slash commands`},p_=[`aria-selected`,`onMousedown`],m_={key:0,class:`slash-args`},h_={class:`slash-desc`},g_={class:`composer-toolbar`},__={class:`composer-left`},v_={class:`queue-mode`},y_={class:`composer-right`},b_=[`disabled`],x_=[`disabled`],S_=Or({__name:`Composer`,setup(e){let t=k(`followUp`),n=k(!1),r=V(()=>_u.value&&Nu.value.ready&&yu.status.value===`live`&&cu.value===`live`),i=k(0),a=k(!1),o=V(()=>{let e=W.composer.match(/^\/(\S*)$/);return e&&!a.value?o_.filter(t=>t.name.startsWith(e[1].toLowerCase())):[]});j(()=>W.composer,()=>{i.value=0,W.composer.startsWith(`/`)||(a.value=!1)});async function s(e,t=!1){!e.args||t&&e.args.startsWith(`[`)&&W.composer===`/${e.name}`?(W.composer=`/${e.name}`,await u()):W.composer=`/${e.name} `}function c(e){if(!o.value.length){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),u());return}if(e.key===`ArrowDown`||e.key===`ArrowUp`){let t=o.value.length;i.value=(i.value+(e.key===`ArrowDown`?1:t-1))%t}else if(e.key===`Tab`||e.key===`Enter`&&!e.shiftKey)s(o.value[i.value],e.key===`Enter`);else if(e.key===`Escape`)a.value=!0;else return;e.preventDefault(),e.stopPropagation()}async function l(e){let t=s_(e);return t?(n.value=!0,await Wu(async()=>{await t.command.run(t.arg),W.composer=``}),n.value=!1,!0):!1}async function u(){let e=W.composer.trim(),i=Cu.value;if(!e||n.value||!i||!r.value||e.startsWith(`/`)&&await l(e))return;n.value=!0;let a=U.value,o=`${a.deviceId}/${a.sessionId}/${a.agentId}`,s;try{s=JSON.parse(sessionStorage.getItem(`dpi.pending-send`)??`null`)}catch{}let c=s?.key===o&&s.content===e&&s.mode===t.value?s.requestId:$g();sessionStorage.setItem(`dpi.pending-send`,JSON.stringify({key:o,content:e,mode:t.value,requestId:c})),await Wu(async()=>{await i.send(e,t.value,c),sessionStorage.removeItem(`dpi.pending-send`),W.composer=``}),n.value=!1}function d(e){Wu(()=>Cu.value.withdraw(e))}return(e,a)=>(P(),F(`div`,c_,[A(Nu).inbox.length?(P(),F(`div`,l_,[(P(!0),F(N,null,M(A(Nu).inbox,e=>(P(),F(`div`,{key:e.id},[R(A(ac),{size:18}),L(`span`,null,E(e.mode===`steer`?`Steer`:`Queued`)+`: `+E(e.content??`Context update`),1),L(`button`,{class:`icon-button`,"aria-label":`Withdraw submission ${e.id}`,title:`Withdraw queued input`,onClick:t=>d(e.id)},[R(A(ol),{size:18})],8,u_)]))),128))])):B(``,!0),L(`div`,d_,[o.value.length?(P(),F(`ul`,f_,[(P(!0),F(N,null,M(o.value,(e,t)=>(P(),F(`li`,{key:e.name,role:`option`,"aria-selected":t===i.value,class:w({active:t===i.value}),onMousedown:js(t=>s(e),[`prevent`])},[L(`code`,null,`/`+E(e.name),1),e.args?(P(),F(`span`,m_,E(e.args),1)):B(``,!0),L(`span`,h_,E(e.description),1)],42,p_))),128))])):B(``,!0),Un(L(`textarea`,{"onUpdate:modelValue":a[0]||=e=>A(W).composer=e,rows:`2`,placeholder:`Give your agent something to do, or type / for commands…`,"aria-label":`Message your agent`,onKeydown:c},null,544),[[xs,A(W).composer]]),L(`div`,g_,[L(`div`,__,[L(`div`,v_,[Un(L(`select`,{"onUpdate:modelValue":a[1]||=e=>t.value=e,"aria-label":`When busy`,title:`Follow-up waits for this run. Steer joins after a tool round.`},[...a[3]||=[L(`option`,{value:`followUp`},`Follow-up`,-1),L(`option`,{value:`steer`},`Steer`,-1),L(`option`,{value:`reject`},`Reject if busy`,-1)]],512),[[ws,t.value]]),R(A(tc),{size:24,"aria-hidden":`true`})])]),L(`div`,y_,[L(`button`,{class:`interrupt`,disabled:!A(Lu)||A(Xu),title:`Stop foreground work and owned subagents (Escape). Background jobs continue.`,onClick:a[2]||=(...e)=>A(Zu)&&A(Zu)(...e)},[R(A(Pc),{size:24,class:`stop-sign`,fill:`currentColor`}),a[4]||=z(`Interrupt`,-1)],8,b_),L(`button`,{class:`send`,"aria-label":`Send message`,disabled:!A(W).composer.trim()||n.value||!r.value,onClick:u},[R(A(Ys),{size:20})],8,x_)])])]),a[5]||=L(`div`,{class:`composer-footnote`},[L(`span`,null,[L(`i`,{class:`live-dot`}),z(`Closing this window never interrupts your agent.`)])],-1)]))}}),C_={class:`chat-panel`},w_={class:`chat-header`},T_={class:`lineage-picker`},E_={class:`lineage-toolbar`},D_=[`title`],O_={class:`crumb-main`},k_={class:`device-chip`},A_=[`title`],j_={class:`crumb-main`},M_={class:`crumb-name`},N_=[`aria-current`,`title`,`onClick`],P_={class:`crumb-kind`},F_={class:`crumb-main`},I_={class:`crumb-name`},L_=[`disabled`],R_=[`aria-expanded`],z_={key:0,class:`lineage-source`},B_={id:`conversation-picker`,class:`conversation-picker`,role:`dialog`,"aria-label":`Choose conversation`},V_=[`aria-label`,`aria-current`,`onClick`],H_={class:`conversation-choice-content`},U_={class:`choice-lineage`},W_={class:`choice-source`},G_={key:0,class:`agent-stream-status`,role:`alert`},K_=[`disabled`],q_={key:0,class:`chat-empty`},J_={key:0},Y_={key:1},X_={key:0,class:`chat-empty`},Z_={class:`starter-grid`},Q_={key:1,class:`entry live-generation`},$_={class:`message-label`},ev={class:`streaming`},tv={key:2,class:`hint retry-note`},nv=Or({__name:`AgentView`,setup(e){let t=k(),n=k(),r=k(!1),i=V(()=>Nu.value.items),a=V(()=>i.value.some(e=>e.kind===`assistant`&&e.streaming)),o=V(()=>i.value.some(e=>e.kind===`tool`&&e.call.status===`running`||e.kind===`assistant`&&e.blocks.some(e=>e.type===`tool`&&e.call.status===`running`))),s=e=>e.kind===`fork`?`Forked from agent #${e.parentId} at entry #${e.forkedAt}`:e.kind===`subagent`?`Owned by agent #${e.ownerAgentId}`:`Root agent`,c=V(()=>Pu.value.map(e=>({...e,lineage:xl(Pu.value,e.id)})).sort((e,t)=>{for(let n=0;n<Math.min(e.lineage.length,t.lineage.length);n++)if(e.lineage[n].id!==t.lineage[n].id)return e.lineage[n].id-t.lineage[n].id;return e.lineage.length-t.lineage.length})),l=V(()=>Fu.value.at(-1)),u=e=>e.kind===`root`?`agent`:e.kind;function d(){U.value&&(pu.tree=!0,Ou(U.value.deviceId,!0))}function f(){let e=Pu.value.find(e=>e.kind===`root`)??Pu.value[0];e&&p(e.id)}function p(e){r.value=!1,U.value&&Tu({...U.value,agentId:e})}function m(e){let t=Cu.value,n=U.value;t&&n&&(W.dialog={kind:`prompt`,title:`Fork conversation`,hint:`${l.value?.name??`Agent #${n.agentId}`} / entry #${e}. Leave the name blank to use Fork #ID.`,label:`Fork name`,optional:!0,placeholder:`e.g. Alternative approach`,submit:`Create fork`,run:async r=>{let i=await t.fork({entryId:e,name:r||void 0});Tu({...n,agentId:i.id}),G(`Forked at entry #${e}. App State stays shared.`)}})}function h(){let e=Cu.value,t=l.value;e&&t&&(W.dialog={kind:`prompt`,title:`Rename agent`,label:`Agent name`,value:t.named?t.name:``,placeholder:t.name,submit:`Save name`,run:t=>e.rename(t)})}j(U,()=>{r.value=!1});let g=!0;return j(yu.version,()=>{let e=t.value;g=!e||e.scrollHeight-e.scrollTop-e.clientHeight<120},{flush:`pre`}),j(yu.version,()=>{g&&An(()=>t.value?.scrollTo({top:t.value.scrollHeight,behavior:`instant`}))}),j(()=>Fu.value.length,()=>void An(()=>n.value&&(n.value.scrollLeft=n.value.scrollWidth))),(e,g)=>(P(),F(`section`,C_,[L(`header`,w_,[L(`div`,T_,[L(`div`,E_,[L(`nav`,{ref_key:`lineageNav`,ref:n,class:`crumbs conversation-lineage`,"aria-label":`Conversation lineage`},[L(`button`,{class:`crumb`,title:`${A(gu)?.name} · ${A(gu)?.url}`,onClick:d},[g[5]||=L(`span`,{class:`crumb-kind`},`device`,-1),L(`span`,O_,[R(xd,{device:A(gu),size:18},null,8,[`device`]),L(`span`,k_,E(A(gu)?.name??A(gu)?.id),1)])],8,D_),R(A(nc),{class:`crumb-sep`,size:18,"aria-hidden":`true`}),L(`button`,{class:`crumb`,title:A(xu)?.cwd,onClick:f},[g[6]||=L(`span`,{class:`crumb-kind`},`workspace`,-1),L(`span`,j_,[R(A(mc),{size:18,"aria-hidden":`true`}),L(`span`,M_,E(A(xu)?.name),1)])],8,A_),A(xu)?.cwd?(P(),I(Qg,{key:0})):B(``,!0),(P(!0),F(N,null,M(A(Fu),e=>(P(),F(N,{key:e.id},[R(A(nc),{class:`crumb-sep`,size:18,"aria-hidden":`true`}),L(`button`,{class:w([`crumb`,{current:e.id===A(U)?.agentId}]),"aria-current":e.id===A(U)?.agentId?`page`:void 0,title:s(e),onClick:t=>p(e.id)},[L(`span`,P_,E(u(e)),1),L(`span`,F_,[e.kind===`fork`?(P(),I(A(vc),{key:0,size:18,"aria-hidden":`true`})):e.kind===`subagent`?(P(),I(A(sc),{key:1,size:18,"aria-hidden":`true`})):(P(),I(A(Ac),{key:2,size:18,"aria-hidden":`true`})),L(`span`,I_,E(e.name),1)])],10,N_)],64))),128))],512),L(`button`,{class:`icon-button`,"aria-label":`Rename agent`,title:`Rename this agent`,disabled:!l.value,onClick:h},[R(A(Bc),{size:18})],8,L_),L(`button`,{class:`icon-button conversation-menu-toggle`,"aria-label":`Browse conversations`,"aria-haspopup":`dialog`,"aria-expanded":r.value,"aria-controls":`conversation-picker`,title:`Browse roots and forks`,onClick:g[0]||=e=>r.value=!r.value},[R(A(tc),{size:18})],8,R_)]),l.value&&l.value.kind!==`root`?(P(),F(`div`,z_,E(s(l.value)),1)):B(``,!0),r.value?(P(),F(N,{key:1},[L(`button`,{class:`conversation-menu-dismiss`,"aria-label":`Close conversation picker`,onClick:g[1]||=e=>r.value=!1}),L(`section`,B_,[g[7]||=L(`div`,{class:`conversation-picker-heading`},`Roots & forks`,-1),(P(!0),F(N,null,M(c.value,e=>(P(),F(`button`,{key:e.id,class:w([`conversation-choice`,{selected:e.id===A(U)?.agentId}]),"aria-label":e.lineage.map(e=>e.name).join(` → `),"aria-current":e.id===A(U)?.agentId?`page`:void 0,onClick:t=>p(e.id)},[L(`div`,H_,[L(`span`,U_,[(P(!0),F(N,null,M(e.lineage,(t,n)=>(P(),F(N,{key:t.id},[n?(P(),I(A(nc),{key:0,size:18,"aria-hidden":`true`})):B(``,!0),L(`span`,{class:w({"choice-ancestor":n<e.lineage.length-1})},E(t.name),3)],64))),128))]),L(`span`,W_,E(s(e)),1)]),e.id===A(U)?.agentId?(P(),I(A(ec),{key:0,size:18,"aria-hidden":`true`})):e.kind===`fork`?(P(),I(A(vc),{key:1,size:18,"aria-hidden":`true`})):(P(),I(A(Ac),{key:2,size:18,"aria-hidden":`true`}))],10,V_))),128))])],64)):B(``,!0)])]),A(yu).fault.value||A(yu).status.value===`fault`||A(yu).status.value===`reconnecting`||A(Nu).ready&&A(yu).status.value===`connecting`?(P(),F(`div`,G_,[L(`div`,null,[L(`strong`,null,E(A(Nu).ready?`Cached transcript is stale.`:`Agent stream unavailable.`),1),L(`p`,null,E(A(yu).fault.value||`Updates are paused while the stream reconnects.`),1),g[8]||=L(`p`,null,`Sending is paused until a fresh snapshot arrives. Your draft is kept.`,-1)]),L(`button`,{disabled:A(yu).status.value===`connecting`,onClick:g[2]||=(...e)=>A(yu).retry&&A(yu).retry(...e)},` Retry stream `,8,K_)])):B(``,!0),L(`div`,{ref_key:`chat`,ref:t,class:`chat-scroll`,"data-testid":`chat`},[A(Nu).ready?(P(),F(N,{key:1},[i.value.length?B(``,!0):(P(),F(`div`,X_,[g[13]||=L(`div`,{class:`agent-orb`},[L(`img`,{src:`/icons/durable-pi.svg`,alt:`Durable Pi`}),L(`i`)],-1),g[14]||=L(`span`,{class:`eyebrow`},`YOUR DURABLE AGENT IS READY`,-1),g[15]||=L(`h2`,null,`A conversation with continuity.`,-1),L(`p`,null,`Messages, tools and state live on `+E(A(gu)?.id)+`, beyond this window.`,1),L(`div`,Z_,[L(`button`,{onClick:g[3]||=e=>A(Gu)(`Inspect this directory using your tools and give me a brief overview. Do not modify any files.`)},[R(A(mc),{size:18}),g[9]||=L(`strong`,null,`Explore this directory`,-1),g[10]||=L(`span`,null,`See coding tools in action`,-1),R(A(Js),{size:18})]),L(`button`,{onClick:g[4]||=e=>A(Gu)(`Use read_state, then update_state to add a field called progress with value 1 and a boolean called ready with value false.`)},[R(A(Qs),{size:18}),g[11]||=L(`strong`,null,`Make a state change`,-1),g[12]||=L(`span`,null,`Watch the workspace update`,-1),R(A(Js),{size:18})])])])),(P(!0),F(N,null,M(i.value,e=>(P(),I(Ug,{key:e.id,item:e,onFork:m},null,8,[`item`]))),128)),A(Nu).running&&!a.value&&!o.value?(P(),F(`div`,Q_,[L(`div`,$_,[g[16]||=z(` AGENT `,-1),L(`span`,ev,E(A(Nu).retry?`Retry scheduled`:`Working`),1)]),g[17]||=L(`div`,{class:`typing`},[L(`i`),L(`i`),L(`i`)],-1)])):B(``,!0),A(Nu).retry?(P(),F(`p`,tv,` Retrying: `+E(A(Nu).retry.error),1)):B(``,!0),(P(!0),F(N,null,M(A(Nu).notices,(e,t)=>(P(),F(`p`,{key:t,class:`message-error`},E(e),1))),128))],64)):(P(),F(`div`,q_,[R(A(Us),{size:30}),A(yu).status.value===`fault`?(P(),F(`h2`,J_,`This agent is unavailable.`)):(P(),F(`h2`,Y_,`Connecting to the agent…`)),L(`p`,null,`The agent keeps working on `+E(A(gu)?.id)+` while this view connects.`,1)]))],512),R(S_)]))}});function rv(e,t){return`${e}/${t.replaceAll(`~`,`~0`).replaceAll(`/`,`~1`)}`}var iv=[`data-state-path`],av={key:0,class:`state-field-heading`},ov=[`value`,`aria-label`,`disabled`],sv=[`value`],cv=[`aria-label`,`disabled`],lv=[`aria-label`,`disabled`],uv=[`aria-label`,`disabled`],dv=[`value`],fv=[`disabled`],pv=[`disabled`,`aria-label`],mv={key:2,class:`state-number`},hv=[`aria-label`,`disabled`],gv=[`aria-label`,`disabled`],_v=[`aria-label`,`disabled`],vv={key:3,class:`state-boolean`},yv=[`aria-label`,`aria-checked`,`disabled`],bv=[`aria-label`,`disabled`],xv={key:5,class:`muted`},Sv=Or({__name:`StateEditor`,props:{value:{type:[String,Number,Boolean,null,Array,Object]},path:{default:``},label:{default:`App State`},disabled:{type:Boolean}},emits:[`change`],setup(e,{emit:t}){let n=e,r=t,i=V(()=>n.value===null?`null`:Array.isArray(n.value)?`array`:typeof n.value),a=V(()=>i.value===`object`||i.value===`array`),o=V(()=>a.value?Object.entries(n.value):[]),s=k(``),c=k(!1),l=k(``),u=k(`string`),d=k(!1),f=[`string`,`number`,`boolean`,`object`,`array`,`null`],p={string:()=>``,number:()=>0,boolean:()=>!1,object:()=>({}),array:()=>[],null:()=>null};j(()=>n.value,e=>{c.value||(s.value=String(e??``))},{immediate:!0});function m(e,t){r(`change`,{operation:e,path:n.path,value:t})}function h(){c.value=!1;let e=i.value===`number`?Number(s.value):s.value;if(i.value===`number`&&(!String(s.value).trim()||!Number.isFinite(e))){s.value=String(n.value);return}e!==n.value&&m(`update`,e)}function g(){let e=i.value===`array`?`-`:l.value.trim();e&&(r(`change`,{operation:`create`,path:rv(n.path,e),value:p[u.value]()}),l.value=``,d.value=!1)}return(t,n)=>{let _=$r(`StateEditor`,!0);return P(),F(`div`,{class:w([`state-field`,{"state-root":e.path===``}]),"data-state-path":e.path},[e.path===``?B(``,!0):(P(),F(`div`,av,[L(`strong`,null,E(e.label),1),L(`select`,{value:i.value,"aria-label":`Type of ${e.path}`,disabled:e.disabled,onChange:n[0]||=e=>m(`update`,p[e.target.value]())},[(P(),F(N,null,M(f,e=>L(`option`,{key:e,value:e},E(e),9,sv)),64))],40,ov),L(`button`,{class:`icon-button`,"aria-label":`Delete ${e.path}`,title:`Delete field`,disabled:e.disabled,onClick:n[1]||=e=>m(`delete`)},[R(A($c),{size:18})],8,cv)])),a.value?(P(),F(N,{key:1},[(P(!0),F(N,null,M(o.value,([t,i])=>(P(),I(_,{key:t,value:i,path:A(rv)(e.path,t),label:t,disabled:e.disabled,onChange:n[2]||=e=>r(`change`,e)},null,8,[`value`,`path`,`label`,`disabled`]))),128)),d.value&&i.value===`array`?(P(),F(`form`,{key:0,class:`state-add`,onSubmit:js(g,[`prevent`])},[i.value===`array`?B(``,!0):Un((P(),F(`input`,{key:0,"onUpdate:modelValue":n[3]||=e=>l.value=e,placeholder:`Field name`,"aria-label":`New field name in ${e.path||`/`}`,required:``,disabled:e.disabled},null,8,lv)),[[xs,l.value]]),Un(L(`select`,{"onUpdate:modelValue":n[4]||=e=>u.value=e,"aria-label":`New field type in ${e.path||`/`}`,disabled:e.disabled},[(P(),F(N,null,M(f,e=>L(`option`,{key:e,value:e},E(e),9,dv)),64))],8,uv),[[ws,u.value]]),L(`button`,{class:`secondary small`,disabled:e.disabled||i.value!==`array`&&!l.value.trim()},` Add `,8,fv),L(`button`,{type:`button`,class:`text-button`,onClick:n[5]||=e=>d.value=!1},`Cancel`)],32)):i.value===`array`?(P(),F(`button`,{key:1,class:`text-button state-add-button`,disabled:e.disabled,"aria-label":`Add ${i.value===`array`?`item`:`field`} to ${e.path||`/`}`,onClick:n[6]||=e=>d.value=!0},[R(A(Hc),{size:18}),z(E(i.value===`array`?`Add item`:`Add field`),1)],8,pv)):B(``,!0)],64)):i.value===`number`?(P(),F(`div`,mv,[L(`button`,{class:`secondary`,"aria-label":`Decrement ${e.path}`,disabled:e.disabled,onClick:n[7]||=e=>m(`increment`,-1)},[R(A(jc),{size:18})],8,hv),Un(L(`input`,{"onUpdate:modelValue":n[8]||=e=>s.value=e,type:`number`,step:`any`,"aria-label":`Value of ${e.path}`,disabled:e.disabled,onFocus:n[9]||=e=>c.value=!0,onBlur:h,onKeydown:n[10]||=Ns(e=>e.target.blur(),[`enter`])},null,40,gv),[[xs,s.value]]),L(`button`,{class:`secondary`,"aria-label":`Increment ${e.path}`,disabled:e.disabled,onClick:n[11]||=e=>m(`increment`,1)},[R(A(Hc),{size:18})],8,_v)])):i.value===`boolean`?(P(),F(`div`,vv,[L(`button`,{class:w([`switch`,{on:e.value===!0}]),role:`switch`,"aria-label":`Value of ${e.path}`,"aria-checked":e.value===!0,disabled:e.disabled,onClick:n[12]||=t=>m(`update`,!e.value)},[...n[15]||=[L(`span`,null,null,-1)]],10,yv),L(`span`,null,E(e.value),1)])):i.value===`string`?Un((P(),F(`textarea`,{key:4,"onUpdate:modelValue":n[13]||=e=>s.value=e,rows:`2`,"aria-label":`Value of ${e.path}`,disabled:e.disabled,onFocus:n[14]||=e=>c.value=!0,onBlur:h},null,40,bv)),[[xs,s.value]]):(P(),F(`span`,xv,`null`))],10,iv)}}}),Cv=[`data-status`],wv=[`title`],Tv=[`title`],Ev=[`href`],Dv=[`title`],Ov=Or({__name:`TunnelStatusBar`,props:{device:{}},setup(e){let t=e,n=V(()=>t.device.status===`online`),r=V(()=>t.device.transport===`tunnel`),i=V(()=>n.value?r.value?`online · via tunnel`:`online · LAN`:r.value?`tunnel`:`LAN`),a=V(()=>t.device.tunnel?.state===`connected`);return(t,o)=>(P(),F(`span`,{class:`tunnel-status`,"data-status":e.device.status},[L(`span`,{class:`axis transport`,title:r.value?`Hub ⇄ device over the tunnel (WSS)`:`Hub → device over LAN`},[r.value?(P(),I(A($s),{key:0,size:13,class:w({live:a.value})},null,8,[`class`])):(P(),I(A(rl),{key:1,size:13,class:w({live:n.value})},null,8,[`class`])),z(` `+E(i.value),1)],8,wv),L(`span`,{class:w([`axis monitor`,e.device.status])},[e.device.status===`offline`?(P(),I(A(nl),{key:0,size:13})):(P(),F(N,{key:1},[z(E(e.device.status),1)],64))],2),r.value&&a.value&&e.device.tunnel?(P(),F(`span`,{key:0,class:`axis muted`,title:`tunnel last seen ${A(Yu)(e.device.tunnel.lastSeenAt)}`},E(e.device.tunnel.readerCount)+` reader`+E(e.device.tunnel.readerCount===1?``:`s`),9,Tv)):B(``,!0),e.device.url?(P(),F(`a`,{key:1,class:`axis url`,href:e.device.url,target:`_blank`,rel:`noreferrer`},E(e.device.url),9,Ev)):B(``,!0),e.device.lastSeenAt?(P(),F(`span`,{key:2,class:`axis muted`,title:`last probe ${A(Yu)(e.device.lastSeenAt)}`},E(A(Yu)(e.device.lastSeenAt)),9,Dv)):B(``,!0)],8,Cv))}});async function kv(e,t,n,r,i){let a=await fetch(`/api${t}`,{method:e,headers:n===void 0?{}:{"content-type":`application/json`},body:n===void 0?void 0:JSON.stringify(n),signal:r,...i?{keepalive:i}:{}}),o=await a.json().catch(()=>void 0);if(!a.ok){let e=o?.error;throw new Fl(e?.code??`internal`,e?.message??`${a.status} ${a.statusText}`,a.status)}return o}function Av(e){return e.offerUrl??e.pairUrl}var jv={pending:e=>kv(`GET`,`/pair/codes`,void 0,e),pairings:e=>kv(`GET`,`/pairings`,void 0,e),createCode:e=>kv(`POST`,`/pair/code`,{},e),resolveCode:(e,t)=>kv(`POST`,`/pair/resolve`,{code:e},t),codeState:(e,t)=>kv(`GET`,`/pair/codes/${encodeURIComponent(e)}`,void 0,t),approve:(e,t,n)=>kv(`POST`,`/pair/codes/${encodeURIComponent(e)}/approve`,t,n),cancel:(e,t,n)=>kv(`POST`,`/pair/codes/${encodeURIComponent(e)}/cancel`,{},t,n),rotate:(e,t)=>kv(`POST`,`/pairings/${encodeURIComponent(e)}/rotate`,{},t),revoke:(e,t=`user`,n)=>kv(`POST`,`/pairings/${encodeURIComponent(e)}/revoke`,{reason:t},n)},Mv=0;function Nv(){let e=++Mv,t=!1;return{gen:e,close:()=>t=!0,closed:()=>t}}var Pv=class extends Error{codeId;constructor(e){super(`pairing poll timed out for ${e}`),this.codeId=e,this.name=`PollTimeout`}},Fv=e=>e===`issued`||e===`cancelled`||e===`expired`;async function Iv(e,t,n={}){let r=n.intervalMs??1e3,i=Date.now()+(n.timeoutMs??33e4);for(;;){if(e.closed())return;if(n.signal?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`);if(Date.now()>i)throw new Pv(t);let a=await jv.codeState(t,n.signal);if(e.closed())return;if(e.state=a,n.onState?.(a),Fv(a.phase))return a;await new Promise(e=>setTimeout(e,r))}}var Lv={key:0,class:`token-manager`,"aria-label":`Credential manager`},Rv={class:`credential-fingerprint`},zv=[`title`],Bv={key:0,class:`rotation-badge`,role:`status`},Vv={class:`token-actions`},Hv=[`disabled`],Uv=[`disabled`],Wv={key:1,class:`message-error`,role:`alert`},Gv=Or({__name:`TokenManager`,props:{device:{}},setup(e){let t=e,n=k(!1),r=k(``),i=V(()=>t.device.pairing);async function a(){if(!n.value){n.value=!0,r.value=``;try{await jv.rotate(t.device.id),G(`Rotation queued — it completes when the device acknowledges the new credential.`)}catch(e){r.value=Zl(e)}finally{n.value=!1}}}async function o(){n.value||(W.dialog={kind:`prompt`,title:`Revoke ${t.device.id}?`,hint:`Every tunnel credential for this device dies at commit and the live tunnel is cut within a second. The device cleans its own files the next time it talks to the hub.`,submit:`Revoke`,danger:!0,run:async()=>{await jv.revoke(t.device.id,`user`),G(`Revoke committed on the hub. The tunnel is cut; the device cleans up on its next contact.`)}})}return(e,t)=>i.value?(P(),F(`section`,Lv,[L(`header`,null,[R(A(Cc),{size:15}),t[0]||=L(`h3`,null,`Credential`,-1),L(`span`,{class:w([`pairing-status`,i.value.status])},E(i.value.status),3)]),L(`dl`,null,[t[1]||=L(`dt`,null,`Key fingerprint`,-1),L(`dd`,null,[L(`code`,Rv,E(i.value.keyFingerprint),1)]),t[2]||=L(`dt`,null,`Paired`,-1),L(`dd`,{title:new Date(i.value.pairedAt).toISOString()},E(A(Yu)(i.value.pairedAt)),9,zv),t[3]||=L(`dt`,null,`Generation`,-1),L(`dd`,null,E(i.value.credentialGeneration),1)]),i.value.rotationPending?(P(),F(`p`,Bv,[R(A(Wc),{size:13,class:`spin`}),t[4]||=z(` rotation queued — waiting for the device to ACK `,-1)])):B(``,!0),L(`div`,Vv,[i.value.status===`paired`?(P(),F(`button`,{key:0,class:`small`,disabled:n.value||i.value.rotationPending,onClick:a},[R(A(Wc),{size:14}),t[5]||=z(` Rotate credential `,-1)],8,Hv)):B(``,!0),i.value.status===`paired`?(P(),F(`button`,{key:1,class:`small danger`,disabled:n.value,onClick:o},[R(A(Yc),{size:14}),t[6]||=z(` Revoke `,-1)],8,Uv)):B(``,!0)]),r.value?(P(),F(`p`,Wv,E(r.value),1)):B(``,!0)])):B(``,!0)}}),Kv={class:`tasks-panel`},qv={class:`panel-heading`},Jv={class:`tag`},Yv={key:0,class:`message-error`,role:`alert`},Xv={class:`task-section`,"aria-label":`Durable jobs`},Zv={key:0,class:`task-empty`},Qv=[`data-job`],$v={class:`job-def-head`},ey={key:0,class:`tag`},ty={class:`tag`},ny=[`aria-label`],ry=[`title`],iy={class:`job-def-meta`},ay=[`title`],oy=[`title`],sy={key:0,class:`job-def-last`},cy=[`onClick`],ly=[`disabled`,`onClick`],uy=[`disabled`,`onClick`],dy=[`disabled`,`onClick`],fy={class:`task-section`,"aria-label":`Agent activity`},py={class:`panel-heading`},my={key:0,class:`task-empty`},hy={key:1,class:`task-tree`},gy=[`data-task-kind`],_y={class:`tag`},vy={key:0,class:`task-phase`},yy=[`onClick`],by=[`disabled`],xy={class:`raw`},Sy=Or({__name:`TasksPanel`,setup(e){let t=k(``),n=k(!1),r=k([]),i=k(),a=e=>({running:`Running`,waiting:`Waiting`,completed:`Completed`,aborted:`Stopped`,declined:`Declined`,failed:`Failed`,pending:`Queued`,completing:`Finishing`,terminal:`Finished`})[e]??e,o=V(()=>new Map(kh.value.map(e=>[e.id,jh.value.find(t=>t.job===e.id)]))),s=V(()=>{let e=Iu.value,t=new Set(e.map(e=>e.id)),n=new Map;for(let r of e){let e=r.owner!==void 0&&t.has(r.owner)?r.owner:void 0;n.set(e,[...n.get(e)??[],r])}let r=[],i=(e,t)=>{for(let a of(n.get(e)??[]).sort((e,t)=>e.id-t.id))r.push({task:a,depth:t}),i(a.id,t+1)};return i(void 0,0),r}),c=e=>e.kind===`pi.tool`?{icon:al,name:e.label??`Tool call`,what:`tool call`}:e.kind===`pi.generation`?{icon:Zs,name:`Model response`,what:`generation`}:e.kind===`pi.compaction`?{icon:Tc,name:`Compaction`,what:`compaction`}:e.kind.startsWith(`demo.job.`)?{icon:il,name:e.label??Ah(e.kind.slice(9))?.title??e.kind,what:`durable job`}:e.kind===`demo.job-approval`?{icon:Jc,name:`Approval`,what:`waits for you`}:{icon:Us,name:e.label??e.kind,what:e.kind},l=e=>e.state.phase?e.kind.startsWith(`demo.job.`)?Ah(e.kind.slice(9))?.phases.find(t=>t.id===e.state.phase)?.label??e.state.phase:e.state.phase:``;async function u(){if(!n.value&&Cu.value){n.value=!0,t.value=``;try{await Cu.value.abort(!0)}catch(e){t.value=Zl(e)}finally{n.value=!1}}}async function d(e){let n=wu.value;if(e.target.open&&n)try{let[e,t]=await Promise.all([n.tasks(`terminal`,40),n.inspect()]);r.value=e,i.value=t}catch(e){t.value=Zl(e)}}let f=V(()=>r.value.filter(e=>e.state.status===`terminal`).slice(-12).reverse());return(e,r)=>(P(),F(`div`,Kv,[L(`div`,qv,[r[0]||=L(`h2`,null,`Tasks`,-1),L(`span`,Jv,E(A(Iu).length)+` active`,1)]),t.value?(P(),F(`p`,Yv,E(t.value),1)):B(``,!0),L(`section`,Xv,[L(`h3`,null,[R(A(Gc),{size:18}),r[1]||=z(`Durable jobs`,-1)]),r[2]||=L(`p`,{class:`hint`},[z(` Repeatable workflows with named phases. Every run follows the same phases and saves a checkpoint after each one. Start one here, or ask your agent: it finds these with `),L(`code`,null,`list_durable_jobs`),z(`, starts them with `),L(`code`,null,`run_durable_job`),z(` and checks them with `),L(`code`,null,`check_durable_job`),z(`. Runs play out live in the chat. `)],-1),A(kh).length?B(``,!0):(P(),F(`p`,Zv,` This device has no durable jobs. Deploy the latest backend to it. `)),(P(!0),F(N,null,M(A(kh),e=>(P(),F(`article`,{key:e.id,class:`job-def`,"data-job":e.id},[L(`div`,$v,[R(A(il),{size:18}),L(`strong`,null,E(e.title),1),e.approval?(P(),F(`span`,ey,`needs approval`)):B(``,!0),L(`span`,ty,`~`+E(e.seconds)+`s`,1)]),L(`p`,null,E(e.summary),1),L(`ol`,{class:`job-chain`,"aria-label":`${e.title} phases`},[(P(!0),F(N,null,M(e.phases,(e,t)=>(P(),F(`li`,{key:e.id,title:e.summary},[L(`span`,null,E(t+1),1),z(E(e.label),1),e.kind===`repeat`?(P(),I(A(Gc),{key:0,size:13})):B(``,!0),e.kind===`approval`?(P(),I(A(Jc),{key:1,size:13})):B(``,!0)],8,ry))),128))],8,ny),L(`div`,iy,[(P(!0),F(N,null,M(e.inputs,e=>(P(),F(`code`,{key:e.name,title:e.description},E(e.name)+`=`+E(e.default),9,ay))),128)),L(`code`,{title:`Each run saves its result to App State ${e.resultPath}`},`→ `+E(e.resultPath),9,oy)]),o.value.get(e.id)?(P(),F(`div`,sy,[L(`span`,null,[z(`Run #`+E(o.value.get(e.id).run)+`: `,1),L(`strong`,null,E(a(o.value.get(e.id).status)),1),A(Oh)(o.value.get(e.id))?B(``,!0):(P(),F(N,{key:0},[z(` in `+E(o.value.get(e.id).phases.find(t=>t.id===o.value.get(e.id).phase)?.label),1)],64))]),L(`button`,{class:`text-button`,onClick:t=>A(Rh)(o.value.get(e.id).id)},` Show in chat `,8,cy),o.value.get(e.id).approval===`pending`?(P(),F(N,{key:0},[L(`button`,{class:`primary small`,disabled:!!A(Ih),onClick:t=>A(Bh)(o.value.get(e.id),!0)},` Approve `,8,ly),L(`button`,{class:`secondary`,disabled:!!A(Ih),onClick:t=>A(Bh)(o.value.get(e.id),!1)},` Decline `,8,uy)],64)):B(``,!0)])):B(``,!0),L(`button`,{class:`secondary job-def-run`,disabled:!!A(Ih)||!A(Cu),onClick:t=>A(zh)(e)},[R(A(Vc),{size:16}),z(`Run `+E(e.title),1)],8,dy)],8,Qv))),128))]),L(`section`,fy,[L(`div`,py,[r[3]||=L(`h3`,null,`Agent activity`,-1),R(A(Us),{size:18})]),r[5]||=L(`p`,{class:`hint`},` Every model response and every tool call is its own durable task with an id, an owner and a checkpoint. Follow them live here; after a restart each one resumes or reports how it ended. `,-1),s.value.length?(P(),F(`ul`,hy,[(P(!0),F(N,null,M(s.value,({task:e,depth:t})=>(P(),F(`li`,{key:e.id,class:`task-row`,style:ve({"--depth":t}),"data-task-kind":e.kind},[(P(),I(ti(c(e).icon),{size:16})),L(`strong`,null,E(c(e).name),1),L(`span`,_y,E(a(e.state.status)),1),l(e)?(P(),F(`span`,vy,E(l(e)),1)):B(``,!0),L(`small`,null,`#`+E(e.id)+` `+E(c(e).what)+`, agent #`+E(e.conversationId)+E(e.effectiveBackground?`, background`:``),1),(P(!0),F(N,null,M(e.conversations,e=>(P(),F(`button`,{key:e,class:`text-button`,onClick:t=>A(Hh)(e)},` Open agent #`+E(e),9,yy))),128))],12,gy))),128))])):(P(),F(`p`,my,`Nothing running. Send a message or run a job.`)),r[6]||=L(`p`,{class:`hint`},` Interrupt or Esc stops foreground work and what it owns. Stop all also stops background runs. `,-1),L(`button`,{class:`secondary danger`,disabled:!A(Iu).length||n.value,onClick:u},[R(A(Pc),{size:18}),r[4]||=z(`Stop all `,-1)],8,by)]),L(`details`,{class:`raw task-section`,onToggle:d},[L(`summary`,null,[R(A(ac),{size:18}),r[7]||=z(`Runtime details`,-1)]),r[9]||=L(`p`,{class:`hint`},` Recent task results and recovery records, read from the device when opened. `,-1),(P(!0),F(N,null,M(f.value,e=>(P(),F(`details`,{key:e.id,class:`raw`},[L(`summary`,null,[z(E(e.kind)+` #`+E(e.id),1),L(`span`,null,E(a(e.state.outcome?.status??e.state.status)),1)]),L(`pre`,null,E(JSON.stringify(e.state.outcome,null,2)),1)]))),128)),L(`details`,xy,[r[8]||=L(`summary`,null,`Recovery inspection`,-1),L(`pre`,null,E(JSON.stringify(i.value,null,2)),1)])],32)]))}}),Cy={class:`git-pane`},wy={key:0,class:`hint`},Ty={key:0,class:`hint`},Ey={key:1,class:`muted-line`},Dy={key:2,class:`message-error`},Oy={key:0,class:`hint`},ky={key:0,class:`message-error merge-banner`},Ay=[`disabled`],jy={class:`panel-heading git-top`},My={class:`branch-wrap`},Ny=[`disabled`],Py={key:0,class:`menu`},Fy=[`onClick`],Iy={class:`muted-line`},Ly={class:`new-branch`},Ry=[`disabled`],zy={class:`auto-stash`},By={class:`tag`},Vy={key:0,class:`tag`},Hy={key:1,class:`tag`},Uy={key:2,class:`tag`,title:`vs the picked base`},Wy={class:`tag`},Gy=[`href`],Ky=[`disabled`],qy={class:`row ops`},Jy=[`disabled`],Yy=[`disabled`],Xy=[`disabled`],Zy=[`disabled`],Qy=[`disabled`],$y={key:1,class:`message-error hintbox`},eb=[`disabled`],tb=[`disabled`],nb={key:2,class:`message-error hintbox`},rb=[`disabled`],ib={class:`task-section`,"aria-label":`Commit`},ab={class:`panel-heading`},ob={class:`tag`},sb=[`disabled`],cb={key:0,class:`hintbox warn`},lb={key:1,class:`muted-line cap`},ub={key:2,class:`files`},db={class:`file all`},fb=[`checked`],pb={class:`muted-line`},mb=[`onClick`],hb={class:`muted-line`},gb={class:`file-label`},_b=[`checked`,`onChange`],vb=[`title`],yb=[`title`],bb={class:`file-acts`},xb=[`onClick`],Sb=[`onClick`],Cb=[`onClick`],wb={key:3,class:`files`},Tb={class:`file all`},Eb=[`checked`],Db={class:`muted-line`},Ob=[`onClick`],kb={class:`muted-line`},Ab={class:`file-label`},jb=[`checked`,`onChange`],Mb=[`title`],Nb=[`title`],Pb={class:`file-acts`},Fb=[`onClick`],Ib=[`onClick`],Lb=[`onClick`],Rb=[`onClick`],zb=[`onClick`],Bb={key:4,class:`file-diff`},Vb={class:`mode-chips`},Hb={key:0,class:`nums bin`},Ub={key:1,class:`nums`},Wb={key:2},Gb={class:`row`},Kb=[`disabled`],qb=[`disabled`],Jb=[`disabled`],Yb={class:`task-section`,"aria-label":`Log`},Xb={class:`panel-heading`},Zb=[`disabled`],Qb=[`disabled`],$b=[`disabled`],ex={key:0,class:`cps`},tx={key:0,class:`hint`},nx={class:`muted-line`},rx={class:`cp-subj`},ix=[`disabled`,`onClick`],ax={key:1,class:`hint`},ox={key:2,class:`commits`},sx=[`title`],cx=[`width`],lx=[`x1`,`x2`],ux=[`x1`,`x2`,`stroke`],dx=[`cx`,`fill`],fx=[`onClick`],px={class:`hash`},mx=[`href`],hx={key:1,class:`refs`},gx={class:`subject`},_x={class:`muted-line who`},vx={key:0,class:`commit-files`},yx=[`data-s`],bx={class:`path`},xx={key:0,class:`hint`},Sx={key:3,class:`message-error`},Cx={key:4,class:`hint`},wx={class:`task-section`,"aria-label":`Worktrees`},Tx={class:`panel-heading`},Ex={class:`branch-wrap`},Dx=[`disabled`],Ox={key:0,class:`menu`},kx=[`onClick`],Ax={class:`new-branch`},jx=[`disabled`],Mx=[`title`],Nx={class:`muted-line`},Px=[`disabled`,`onClick`],Fx=[`disabled`,`onClick`],Ix=[`disabled`,`onClick`],Lx={key:3,class:`op-out`},Rx=Zg(Or({__name:`GitPanel`,props:{deviceId:{},cwd:{}},setup(e){let t=e,n=V(()=>t.cwd??xu.value?.cwd??``),r=V(()=>t.deviceId??hu.value),i=V(()=>Dd(r.value||`?`,n.value||`?`)),a=V(()=>i.value.status),o=V(()=>i.value.loading),s=V(()=>i.value.refreshing),c=V(()=>i.value.error),l=V(()=>{let e=xu.value;return e&&e.cwd===n.value&&!t.deviceId?e.id:void 0}),u=k(``),d=k(``),f=k(``),p=k(new Set),m=k(!1),h=k(!1),g=k(``),_=k(null),v=k(`working`),y=V(()=>`dpi-git-draft:${r.value}:${n.value}`),b=k(null),ee=k(!0),x=k(``),S=k(!1),te=k([]),ne=V(()=>{if(!te.value.length||!n.value)return null;let e=e=>e.startsWith(`/`)||e.includes(`:\\`)?e:`${n.value}/${e}`,t=new Set(te.value);return{changed:(a.value?.files??[]).filter(n=>t.has(e(n.path))).length,total:te.value.length}}),re=k([]),ie=k(!1),ae=k(new Map),oe=k(new Set),se=()=>{typeof localStorage<`u`&&(f.value=localStorage.getItem(y.value)??``)};kd(r.value||`?`,n.value||`?`),se(),Jr(()=>kd(r.value||`?`,n.value||`?`)),j(f,e=>{typeof localStorage<`u`&&(e?localStorage.setItem(y.value,e):localStorage.removeItem(y.value))}),j([r,n],()=>{m.value=!1,h.value=!1,_.value=null,b.value=null,x.value=``,S.value=!1,te.value=[],ae.value=new Map,oe.value=new Set,kd(r.value||`?`,n.value||`?`),se()});let ce=()=>(p.value=new Set,_.value=null,kd(r.value||`?`,n.value||`?`,{force:!0})),le=V(()=>a.value?.files??[]);j(le,e=>{let t=new Set;for(let n of e)n.x!==`?`&&n.y!==`?`&&t.add(n.path);p.value=t});let ue=V(()=>le.value.some(e=>p.value.has(e.path))),de=V(()=>le.value.filter(e=>e.x!==` `&&e.x!==`?`)),C=V(()=>le.value.filter(e=>e.x===` `||e.x===`?`)),fe=V(()=>le.value.filter(e=>/U|A|D/.test(e.x)&&/U|A|D/.test(e.y))),pe=V(()=>le.value.length>=500),me=V(()=>(a.value?.staged??0)+(a.value?.unstaged??0)+(a.value?.untracked??0)>0),he=V(()=>!a.value?.identity?.name||!a.value?.identity?.email),ge=V(()=>{let e=a.value?.remoteUrl??``,t=e.match(/git@([^:]+):(.+?)(?:\.git)?$/)??e.match(/^https?:\/\/([^/]+)\/(.+?)(?:\.git)?$/);return t?`https://${t[1]}/${t[2]}`:``}),_e=e=>{let t=new Set(p.value);t.has(e)?t.delete(e):t.add(e),p.value=t},ve=e=>{let t=e.every(e=>p.value.has(e.path)),n=new Set(p.value);for(let r of e)t?n.delete(r.path):n.add(r.path);p.value=n},ye=e=>{let t=e.lastIndexOf(`/`);return t===-1?`.`:e.slice(0,t)},be=e=>{let t=new Map;for(let n of e){let e=ye(n.path);t.has(e)||t.set(e,[]),t.get(e).push(n)}return[...t.entries()].map(([e,t])=>({dir:e,files:t,open:!oe.value.has(e)}))},xe=e=>{let t=new Set(oe.value);t.has(e)?t.delete(e):t.add(e),oe.value=t},Se=e=>e.a===void 0&&e.d===void 0?``:e.a===-1||e.d===-1?`bin`:`+${e.a??0} −${e.d??0}`,Ce=e=>{navigator.clipboard?.writeText(e).then(()=>G(`copied ${e}`))};async function we(e,t={}){if(r.value&&n.value){u.value=e,d.value=``;try{let i=await Jl(r.value).gitOp(n.value,e,t);d.value=i.text||`(empty)`,e===`push`&&(x.value=``),e===`pull`&&(S.value=!1),[`fetch`,`pull`,`push`,`stash-push`,`stash-pop`].includes(e)&&G(`git ${e} ✓`),await ce(),qe(!0)}catch(t){let n=t.message;e===`push`&&(/no upstream|has no upstream|upstream is gone/i.test(n)?x.value=`no upstream — set it while pushing?`:/fetch first|non-fast-forward|rejected.*fetch|behind/i.test(n)?x.value=`the remote has work you lack — pull first`:/authentication|permission|could not read|403|denied/i.test(n)?x.value=`credentials rejected on the device — check its git login`:x.value=``),e===`pull`&&/not possible to fast-forward|divergent|unrelated histories/i.test(n)&&(S.value=!0),G(`git ${e}: ${n.slice(0,160)}`)}finally{u.value=``}}}async function T(e,t){if(!r.value||!n.value||!t&&e!==`stage`||e===`discard`&&t&&!confirm(`Roll back ${t} to HEAD? Uncommitted changes are lost.`))return;u.value=e;let i=t?[t]:le.value.filter(e=>e.x===` `||e.x===`M`).map(e=>e.path);try{G((await Jl(r.value).gitOp(n.value,e,{files:i})).text),await ce()}catch(t){G(`${e} failed: ${t.message.slice(0,140)}`)}finally{u.value=``}}async function Te(e){if(r.value&&n.value&&e.length){u.value=`unstage`;try{G((await Jl(r.value).gitOp(n.value,`unstage`,{files:e})).text),await ce()}catch(e){G(`unstage failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}}async function Ee(e){if(r.value&&n.value&&e.length){u.value=`ignore`;try{G((await Jl(r.value).gitOp(n.value,`ignore`,{lines:e})).text),await ce()}catch(e){G(`ignore failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}}async function De(e){if(r.value&&n.value){if(_.value?.path===e)return _.value=null;u.value=`diff`;try{let t=await Jl(r.value).gitOp(n.value,`diff-file`,{target:e,staged:v.value===`staged`});_.value={path:e,text:t.text}}catch(e){G(`diff failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}}let Oe=async()=>{let e=_.value?.path;_.value=null,e&&await De(e)},ke=V(()=>/Binary files .* differ/i.test(_.value?.text??``));async function Ae(){if(r.value&&n.value){u.value=`abort`;try{G((await Jl(r.value).gitOp(n.value,`merge-abort`)).text),await ce()}catch(e){G(`abort failed: ${e.message.slice(0,120)}`)}finally{u.value=``}}}async function je(e){if(m.value=!1,r.value&&n.value){u.value=`compare`;try{let t=await Jl(r.value).gitOp(n.value,`compare`,{ref:e});b.value={ref:e,ahead:t.ahead??0,behind:t.behind??0}}catch(e){G(`compare failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}}async function Me(e,t=!1){if(m.value=!1,!r.value||!n.value||e===a.value?.branch&&!t)return;u.value=`switch`;let i=Jl(r.value),o=!1;try{if(ee.value&&!t&&me.value&&(await i.gitOp(n.value,`stash-push`,{message:`dpi auto-stash before ${e}`}),o=!0),G((await i.gitOp(n.value,`switch`,{ref:e,create:t})).text||`switched to ${e}`),o)try{let e=await i.gitOp(n.value,`stash-pop`);/conflict/i.test(e.text)&&G(`stash popped WITH CONFLICTS — resolve in the file list`)}catch{G(`switched, but the stash did not pop — resolve manually (git stash list)`)}await ce(),qe(!0)}catch(e){if(G(`switch failed: ${e.message.slice(0,140)}`),o)try{await i.gitOp(n.value,`stash-pop`)}catch{}}finally{u.value=``}}async function Ne(e=!1){if(!r.value||!n.value||!f.value.trim())return;u.value=`commit`;let t=le.value.filter(e=>p.value.has(e.path)).map(e=>e.path);if(!t.length)return G(`check the files to commit — nothing is selected`);let i=Jl(r.value);try{if(G((await i.gitOp(n.value,`commit`,{message:f.value.trim(),files:t})).text),f.value=``,e)try{G(`pushed: ${(await i.gitOp(n.value,`push`)).text.slice(0,80)}`)}catch(e){G(`committed, but push failed: ${e.message.slice(0,120)}`)}await ce(),qe(!0)}catch(e){G(`commit failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}async function Pe(){if(!r.value||!n.value)return;let e=le.value.filter(e=>p.value.has(e.path)).map(e=>e.path);if(!e.length)return G(`check files first — the model summarises THOSE`);u.value=`ai`;let t=Jl(r.value),i=``;try{let a=lu.devices.value.find(e=>e.id===r.value)?.info,o=(a?.models??[]).find(e=>e.id===a?.defaultModel)??(a?.models??[])[0];if(!o)return G(`no model on the device`);let s=``;for(let r of e.slice(0,5)){let e=await t.gitOp(n.value,`diff-file`,{target:r});if(s+=`${e.text}\n`,s.length>4e3)break}s=s.slice(0,4e3),i=(await t.createSession({name:`git-msg`,cwd:n.value,model:{provider:o.provider,modelId:o.id}})).id;let c=await t.agent(i,1).send(`Write ONE concise git commit message (under 72 chars, imperative, no quotes, no backticks) for these changes:\n\n${s}`,`followUp`,void 0,12e4),l=c.status===`done`?c.answer.text.trim().split(`
|
|
76
|
-
`)[0]?.slice(0,100):``;l?f.value=l:G(`the model returned nothing usable`)}catch(e){G(`ai message failed: ${e.message.slice(0,120)}`)}finally{u.value=``,i&&t.session(i).archive().catch(()=>{})}}async function
|
|
77
|
-
`)[0]??`worktree ${i}`),g.value=``,await ce()}catch(e){G(`worktree failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}async function Be(e,t){if(r.value){u.value=`session`;try{let n=lu.devices.value.find(e=>e.id===r.value)?.info,i=(n?.models??[]).find(e=>e.id===n?.defaultModel)??(n?.models??[])[0];if(!i)return G(`no model available on ${r.value} — cannot create a session`);let a=await Jl(r.value).createSession({name:t??e.slice(e.lastIndexOf(`/`)+1),cwd:e,model:{provider:i.provider,modelId:i.id}});Tu({deviceId:r.value,sessionId:a.id,agentId:1}),G(`session "${a.name}" on ${e}`)}catch(e){G(`session failed: ${e.message.slice(0,160)}`)}finally{u.value=``}}}async function Ve(e){if(r.value){u.value=`go`;try{let t=(await Jl(r.value).sessions()).find(t=>t.cwd===e);t?(Tu({deviceId:r.value,sessionId:t.id,agentId:1}),G(`switched to session "${t.name}"`)):await Be(e,null)}catch(e){G(`switch failed: ${e.message.slice(0,120)}`)}finally{u.value=``}}}async function He(e){if(!r.value||!n.value)return;u.value=`wt`;let t=`Uncommitted changes in it will be LOST.`;try{let n=(await Jl(r.value).gitStatusBatch([e],{timeoutMs:6e4}))[e];t=(n?.staged??0)+(n?.unstaged??0)+(n?.untracked??0)>0?`It CONTAINS uncommitted changes — they will be LOST.`:`Its checkout is clean.`}catch{}if(confirm(`Remove worktree ${e}? ${t}`))try{await Jl(r.value).gitOp(n.value,`worktree-remove`,{target:e}),await ce()}catch(e){G(`remove failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}let Ue=k([]),We=k(!1),Ge=k(``),Ke=0;async function qe(e=!1){if(r.value&&n.value&&!(!e&&Ue.value.length&&Date.now()-Ke<12e4)){We.value=!0;try{let e=await Jl(r.value).gitOp(n.value,`log-list`);Ue.value=e.commits??[],Ge.value=``,Ke=Date.now()}catch(e){Ge.value=e.message.slice(0,120)}finally{We.value=!1}}}qe(),j([r,n],()=>{Ue.value=[],Ke=0,qe()});let Je=V(()=>(a.value?.worktrees??[]).filter(e=>e.path)),Ye=[`#4f8cc9`,`#b8860b`,`#7aa25c`,`#a061ba`,`#c96f6f`,`#5fa8a0`],Xe=V(()=>{let e=new Map,t=[],n=[];for(let r of Ue.value){let i=e.get(r.hash);i===void 0&&(i=n.indexOf(null),i===-1&&(n.push(null),i=n.length-1),e.set(r.hash,i)),n[i]=null;let a=[];r.parents.forEach((t,r)=>{let o=e.get(t);(o===void 0||n[o]===t)&&(o=n.indexOf(null),o===-1&&(n.push(null),o=n.length-1),e.set(t,o)),n[o]=t,r===0&&(n[i]=t),a.push(o)}),t.push({lane:i,parents:a,width:Math.max(1,n.length)})}return t}),Ze=e=>e*12+7;return(e,t)=>(P(),F(`div`,Cy,[n.value?(P(),F(N,{key:1},[o.value?(P(),F(`p`,Ty,`loading git…`)):s.value?(P(),F(`p`,Ey,`refreshing…`)):B(``,!0),c.value?(P(),F(`p`,Dy,[z(E(c.value)+` `,1),L(`button`,{onClick:t[0]||=e=>ce()},`retry`)])):B(``,!0),a.value?(P(),F(`div`,{key:3,class:w({stale:!!c.value||!!s.value})},[a.value.repo?(P(),F(N,{key:1},[a.value.merge?(P(),F(`p`,ky,[z(` merge in progress — `+E(a.value.conflicts??fe.value.length)+` unmerged path(s). Resolve them in the lists above, or `,1),L(`button`,{class:`small`,disabled:!!u.value,onClick:t[1]||=e=>Ae()},`abort merge`,8,Ay)])):B(``,!0),L(`div`,jy,[L(`div`,My,[L(`button`,{class:`branch-btn`,disabled:!!u.value,onClick:t[2]||=e=>m.value=!m.value},[R(A(gc),{size:16}),L(`strong`,null,E(a.value.branch??`detached`),1),R(A(tc),{size:14})],8,Ny),m.value?(P(),F(`div`,Py,[(P(!0),F(N,null,M(a.value.branches??[],e=>(P(),F(`button`,{key:e.name,class:w({cur:e.current}),onClick:t=>Me(e.name)},[R(A(gc),{size:13}),L(`span`,null,E(e.name),1),L(`span`,Iy,E(e.current?`current`:e.upstream?`→ ${e.upstream}`:``),1),t[37]||=L(`span`,{class:`grow`},null,-1),e.current?B(``,!0):(P(),I(A(_c),{key:0,size:13,title:`compare with this base`,onClick:js(t=>je(e.name),[`stop`])},null,8,[`onClick`]))],10,Fy))),128)),L(`div`,Ly,[Un(L(`input`,{"onUpdate:modelValue":t[3]||=e=>g.value=e,placeholder:`new branch…`,onKeyup:t[4]||=Ns(e=>g.value.trim()&&Me(g.value.trim(),!0),[`enter`])},null,544),[[xs,g.value]]),L(`button`,{disabled:!g.value.trim(),onClick:t[5]||=e=>Me(g.value.trim(),!0)},[R(A(Hc),{size:13})],8,Ry)]),L(`label`,zy,[Un(L(`input`,{type:`checkbox`,"onUpdate:modelValue":t[6]||=e=>ee.value=e},null,512),[[Ss,ee.value]]),t[38]||=z(` auto-stash on switch`,-1)])])):B(``,!0)]),L(`span`,By,E(a.value.upstream??`no upstream`),1),a.value.ahead?(P(),F(`span`,Vy,`↑`+E(a.value.ahead),1)):B(``,!0),a.value.behind?(P(),F(`span`,Hy,`↓`+E(a.value.behind),1)):B(``,!0),b.value?(P(),F(`span`,Uy,[z(` vs `+E(b.value.ref)+`: ↑`+E(b.value.ahead)+` ↓`+E(b.value.behind)+` `,1),L(`button`,{class:`tag-x`,onClick:t[7]||=e=>b.value=null},[R(A(ol),{size:11})])])):B(``,!0),L(`span`,Wy,`+`+E(a.value.staged??0)+` ~`+E(a.value.unstaged??0)+` ?`+E(a.value.untracked??0),1),ge.value?(P(),F(`a`,{key:3,class:`icon-button`,href:`${ge.value}/tree/${a.value.branch??``}`,target:`_blank`,rel:`noopener`,title:`open on the remote`},[R(A(qs),{size:15,style:{transform:`rotate(45deg)`}})],8,Gy)):B(``,!0),L(`button`,{class:`icon-button`,disabled:!!u.value||o.value||s.value,title:`refresh`,onClick:t[8]||=e=>ce()},[R(A(Wc),{size:16})],8,Ky)]),L(`div`,qy,[L(`button`,{class:`small`,disabled:!!u.value,onClick:t[9]||=e=>we(`fetch`)},[R(A(Gs),{size:14}),t[39]||=z(`fetch`,-1)],8,Jy),L(`button`,{class:`small`,disabled:!!u.value,onClick:t[10]||=e=>we(`pull`)},[R(A(Gs),{size:14}),t[40]||=z(`pull`,-1)],8,Yy),L(`button`,{class:`small primary`,disabled:!!u.value,title:`push`,onClick:t[11]||=e=>we(`push`)},[R(A(qs),{size:14}),t[41]||=z(`push`,-1)],8,Xy),L(`button`,{class:`small`,disabled:!!u.value,title:`stash changes`,onClick:t[12]||=e=>we(`stash-push`,{message:f.value.trim()||void 0})},[R(A(Zc),{size:14}),t[42]||=z(`stash`,-1)],8,Zy),L(`button`,{class:`small`,disabled:!!u.value,title:`pop the newest stash`,onClick:t[13]||=e=>we(`stash-pop`)},[R(A(Fc),{size:14}),t[43]||=z(`unstash`,-1)],8,Qy)]),x.value?(P(),F(`p`,$y,[z(E(x.value)+` `,1),x.value.includes(`upstream`)?(P(),F(`button`,{key:0,class:`small primary`,disabled:!!u.value,onClick:t[14]||=e=>we(`push`,{setUpstream:!0,ref:a.value.branch})},`push -u origin `+E(a.value.branch),9,eb)):x.value.includes(`remote has work`)?(P(),F(`button`,{key:1,class:`small primary`,disabled:!!u.value,onClick:t[15]||=e=>we(`pull`)},`pull now`,8,tb)):B(``,!0)])):B(``,!0),S.value?(P(),F(`p`,nb,[t[44]||=z(` fast-forward is not possible — branches diverged. `,-1),L(`button`,{class:`small primary`,disabled:!!u.value,onClick:t[16]||=e=>we(`pull`,{rebase:!0})},`pull --rebase`,8,rb)])):B(``,!0),L(`section`,ib,[L(`div`,ab,[t[45]||=L(`h4`,null,`Commit`,-1),L(`span`,ob,E(le.value.length?`${p.value.size}/${le.value.length} files`:`no changes`),1),t[46]||=L(`span`,{class:`grow`},null,-1),l.value?(P(),F(`button`,{key:0,class:`small`,disabled:!!u.value,title:`check the files this session's agent touched`,onClick:Fe},[R(A(pc),{size:13}),z(` session files`+E(ne.value?` (${ne.value.changed}/${ne.value.total})`:``),1)],8,sb)):B(``,!0)]),he.value?(P(),F(`p`,cb,[...t[47]||=[z(`git user.name/user.email is not set on the device — `,-1),L(`code`,null,`dpi device config`,-1),z(` or `,-1),L(`code`,null,`git config --global`,-1),z(` before committing.`,-1)]])):B(``,!0),pe.value?(P(),F(`p`,lb,`showing the first 500 changed files — commit in smaller batches`)):B(``,!0),de.value.length?(P(),F(`div`,ub,[L(`label`,db,[L(`input`,{type:`checkbox`,checked:de.value.every(e=>p.value.has(e.path)),onChange:t[17]||=e=>ve(de.value)},null,40,fb),L(`span`,pb,`Staged · `+E(de.value.length),1),t[50]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`icon-button`,title:`stage every changed file`,onClick:t[18]||=e=>T(`stage`)},[R(A(Hc),{size:13}),t[48]||=z(` all`,-1)]),L(`button`,{class:`icon-button`,title:`unstage all (git reset HEAD)`,onClick:t[19]||=e=>Te(de.value.map(e=>e.path))},[R(A(jc),{size:13}),t[49]||=z(` none`,-1)])]),(P(!0),F(N,null,M(be(de.value),e=>(P(),F(N,{key:e.dir},[e.dir===`.`?B(``,!0):(P(),F(`button`,{key:0,class:`dir-row`,onClick:t=>xe(e.dir)},[R(A(nc),{size:12,class:w({open:e.open})},null,8,[`class`]),z(E(e.dir),1),L(`span`,hb,`· `+E(e.files.length),1)],8,mb)),(P(!0),F(N,null,M(e.files,t=>Un((P(),F(`div`,{key:t.path,class:`file`},[L(`label`,gb,[L(`input`,{type:`checkbox`,checked:p.value.has(t.path),onChange:e=>_e(t.path)},null,40,_b),L(`code`,{class:`xy`,title:`index ${t.x} · worktree ${t.y}`},E(t.x)+E(t.y),9,vb),L(`span`,{class:`path`,title:t.path},E(t.path),9,yb),Se(t)?(P(),F(`span`,{key:0,class:w([`nums`,{bin:Se(t)===`bin`}])},E(Se(t)),3)):B(``,!0)]),L(`span`,bb,[L(`button`,{class:`icon-button`,title:`view diff`,onClick:e=>De(t.path)},[R(A(fc),{size:13})],8,xb),L(`button`,{class:`icon-button`,title:`unstage (git reset HEAD)`,onClick:e=>Te([t.path])},[R(A(jc),{size:13})],8,Sb),L(`button`,{class:`icon-button`,title:`roll back to HEAD`,onClick:e=>T(`discard`,t.path)},[R(A(lc),{size:13})],8,Cb)])])),[[Bo,e.open]])),128))],64))),128))])):B(``,!0),C.value.length?(P(),F(`div`,wb,[L(`label`,Tb,[L(`input`,{type:`checkbox`,checked:C.value.every(e=>p.value.has(e.path)),onChange:t[20]||=e=>ve(C.value)},null,40,Eb),L(`span`,Db,`Unstaged · `+E(C.value.length),1)]),(P(!0),F(N,null,M(be(C.value),e=>(P(),F(N,{key:e.dir},[e.dir===`.`?B(``,!0):(P(),F(`button`,{key:0,class:`dir-row`,onClick:t=>xe(e.dir)},[R(A(nc),{size:12,class:w({open:e.open})},null,8,[`class`]),z(E(e.dir),1),L(`span`,kb,`· `+E(e.files.length),1)],8,Ob)),(P(!0),F(N,null,M(e.files,t=>Un((P(),F(`div`,{key:t.path,class:`file`},[L(`label`,Ab,[L(`input`,{type:`checkbox`,checked:p.value.has(t.path),onChange:e=>_e(t.path)},null,40,jb),L(`code`,{class:`xy`,title:`index ${t.x} · worktree ${t.y}`},E(t.x)+E(t.y),9,Mb),L(`span`,{class:`path`,title:t.path},E(t.path),9,Nb),Se(t)?(P(),F(`span`,{key:0,class:w([`nums`,{bin:Se(t)===`bin`}])},E(Se(t)),3)):B(``,!0)]),L(`span`,Pb,[L(`button`,{class:`icon-button`,title:`view diff`,onClick:e=>De(t.path)},[R(A(fc),{size:13})],8,Fb),t.x===`?`?(P(),F(`button`,{key:0,class:`icon-button`,title:`add to .gitignore`,onClick:e=>Ee([t.path])},[R(A(Xs),{size:13})],8,Ib)):(P(),F(`button`,{key:1,class:`icon-button`,title:`stage (git add)`,onClick:e=>T(`stage`,t.path)},[R(A(Hc),{size:13})],8,Lb)),t.x===`?`?B(``,!0):(P(),F(`button`,{key:2,class:`icon-button`,title:`roll back to HEAD`,onClick:e=>T(`discard`,t.path)},[R(A(lc),{size:13})],8,Rb)),L(`button`,{class:`icon-button`,title:`copy path`,onClick:e=>Ce(t.path)},[R(A(oc),{size:13})],8,zb)])])),[[Bo,e.open]])),128))],64))),128))])):B(``,!0),_.value?(P(),F(`p`,Bb,[L(`strong`,null,E(_.value.path),1),L(`span`,Vb,[L(`button`,{class:w({on:v.value===`working`}),onClick:t[21]||=e=>{v.value=`working`,Oe()}},`working`,2),L(`button`,{class:w({on:v.value===`staged`}),onClick:t[22]||=e=>{v.value=`staged`,Oe()}},`staged`,2)]),ke.value?(P(),F(`span`,Hb,`binary file`)):_.value.text.length>8e3?(P(),F(`span`,Ub,`truncated at 8000 chars`)):B(``,!0),L(`button`,{class:`icon-button`,title:`close diff`,onClick:t[23]||=e=>_.value=null},[R(A(ol),{size:13})]),ke.value?B(``,!0):(P(),F(`pre`,Wb,E(_.value.text.slice(0,8e3)),1))])):B(``,!0),Un(L(`textarea`,{"onUpdate:modelValue":t[24]||=e=>f.value=e,rows:`4`,placeholder:`Commit message… (Ctrl+Enter to commit)`,onKeydown:[t[25]||=Ns(js(e=>Ne(),[`exact`,`prevent`]),[`enter`]),t[26]||=Ns(js(e=>Ne(),[`meta`,`prevent`]),[`enter`]),t[27]||=Ns(js(e=>Ne(),[`ctrl`,`prevent`]),[`enter`])]},null,544),[[xs,f.value]]),L(`div`,Gb,[L(`button`,{class:`small`,disabled:!!u.value||!p.value.size,title:`ask the device's model for a message`,onClick:Pe},[R(A(Xc),{size:14}),t[51]||=z(` ai message`,-1)],8,Kb),t[53]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`primary small`,disabled:!!u.value||!f.value.trim()||!ue.value,onClick:t[28]||=e=>Ne(!1)},[R(A(ec),{size:14}),z(` Commit`+E(p.value.size?` ${p.value.size} file${p.value.size>1?`s`:``}`:``),1)],8,qb),a.value.upstream?(P(),F(`button`,{key:0,class:`primary small`,disabled:!!u.value||!f.value.trim()||!ue.value,title:`commit, then push`,onClick:t[29]||=e=>Ne(!0)},[R(A(ec),{size:14}),t[52]||=z(` Commit & push `,-1)],8,Jb)):B(``,!0)])]),L(`section`,Yb,[L(`div`,Xb,[L(`h4`,null,[R(A(bc),{size:16}),t[54]||=z(` Log`,-1)]),t[56]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`small`,disabled:!!u.value,title:`save a checkpoint ref of HEAD`,onClick:D},[R(A(pc),{size:13}),t[55]||=z(` checkpoint`,-1)],8,Zb),L(`button`,{class:`small`,disabled:!!u.value,onClick:t[30]||=e=>ie.value=!ie.value},`checkpoints `+E(re.value.length?`(${re.value.length})`:``),9,Qb),L(`button`,{class:`icon-button`,disabled:We.value,title:`refresh log`,onClick:t[31]||=e=>qe(!0)},[R(A(Wc),{size:14})],8,$b)]),ie.value?(P(),F(`div`,ex,[re.value.length?B(``,!0):(P(),F(`p`,tx,`no checkpoints yet — one click saves a named ref of HEAD.`)),(P(!0),F(N,null,M(re.value,e=>(P(),F(`div`,{key:e.name,class:`cp-row`},[L(`code`,null,E(e.name),1),L(`span`,nx,E(e.hash)+` · `+E(e.date),1),L(`span`,rx,E(e.subject),1),t[58]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`small`,disabled:!!u.value,title:`reset --hard to this checkpoint (this worktree)`,onClick:t=>Re(e.name)},[R(A(el),{size:13}),t[57]||=z(` rewind`,-1)],8,ix)]))),128))])):B(``,!0),We.value&&!Ue.value.length?(P(),F(`p`,ax,`loading log…`)):Ue.value.length?(P(),F(`div`,ox,[(P(!0),F(N,null,M(Ue.value,(e,t)=>(P(),F(N,{key:e.hash},[L(`div`,{class:`commit-row`,title:e.refs},[Xe.value[t]?(P(),F(`svg`,{key:0,class:`lane`,width:Xe.value[t].width*12+4,height:`24`,"aria-hidden":`true`},[(P(!0),F(N,null,M(Xe.value[t].width,e=>(P(),F(`line`,{key:e,x1:Ze(e-1),x2:Ze(e-1),y1:`0`,y2:`24`,stroke:`#3a3134`,"stroke-width":`2`},null,8,lx))),128)),(P(!0),F(N,null,M(Xe.value[t].parents,(e,n)=>(P(),F(`line`,{key:`p`+n,x1:Ze(Xe.value[t].lane),x2:Ze(e),y1:`12`,y2:`24`,stroke:Ye[e%Ye.length],"stroke-width":`2`},null,8,ux))),128)),L(`circle`,{cx:Ze(Xe.value[t].lane),cy:`12`,r:`4`,fill:Ye[Xe.value[t].lane%Ye.length]},null,8,dx)],8,cx)):B(``,!0),L(`button`,{class:`icon-button hash-btn`,title:`files in this commit`,onClick:t=>Ie(e.hash)},[R(A(nc),{size:12,class:w({open:ae.value.has(e.hash)})},null,8,[`class`])],8,fx),L(`code`,px,[ge.value?(P(),F(`a`,{key:0,href:`${ge.value}/commit/${e.hash}`,target:`_blank`,rel:`noopener`,title:`on the remote`},E(e.hash),9,mx)):(P(),F(N,{key:1},[z(E(e.hash),1)],64))]),e.refs?(P(),F(`span`,hx,E(e.refs.split(`,`)[0]),1)):B(``,!0),L(`span`,gx,E(e.subject),1),L(`span`,_x,E(e.author)+` · `+E(e.date),1)],8,sx),ae.value.has(e.hash)?(P(),F(`div`,vx,[(P(!0),F(N,null,M(ae.value.get(e.hash),e=>(P(),F(`div`,{key:e.path,class:`cf`},[L(`code`,{class:`cf-status`,"data-s":e.status},E(e.status),9,yx),L(`span`,bx,E(e.path),1)]))),128)),ae.value.get(e.hash)?.length?B(``,!0):(P(),F(`p`,xx,`no files (merge/empty commit)`))])):B(``,!0)],64))),128))])):Ge.value?(P(),F(`p`,Sx,`log failed: `+E(Ge.value),1)):(P(),F(`p`,Cx,`no commits`))]),L(`section`,wx,[L(`div`,Tx,[L(`h4`,null,[R(A(Fc),{size:16}),t[59]||=z(` Worktrees`,-1)]),L(`div`,Ex,[L(`button`,{class:`small`,disabled:!!u.value,onClick:t[32]||=e=>h.value=!h.value},[R(A(Hc),{size:13}),t[60]||=z(` worktree`,-1)],8,Dx),h.value?(P(),F(`div`,Ox,[(P(!0),F(N,null,M((a.value.branches??[]).filter(e=>!e.current),e=>(P(),F(`button`,{key:e.name,onClick:t=>ze(e.name)},[R(A(gc),{size:13}),L(`span`,null,E(e.name),1),t[61]||=L(`span`,{class:`muted-line`},`existing`,-1)],8,kx))),128)),L(`div`,Ax,[Un(L(`input`,{"onUpdate:modelValue":t[33]||=e=>g.value=e,placeholder:`or a NEW branch…`,onKeyup:t[34]||=Ns(e=>g.value.trim()&&ze(g.value.trim()),[`enter`])},null,544),[[xs,g.value]]),L(`button`,{disabled:!g.value.trim(),onClick:t[35]||=e=>ze(g.value.trim())},`create`,8,jx)])])):B(``,!0)])]),(P(!0),F(N,null,M(Je.value,e=>(P(),F(`div`,{key:e.path,class:w([`wt`,{main:e.path===a.value.root}])},[L(`code`,{title:e.path},E(e.path),9,Mx),L(`span`,Nx,E(e.branch??e.head),1),t[62]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`icon-button`,disabled:!!u.value,title:`jump to this worktree (session or new)`,onClick:t=>Ve(e.path)},[R(A(Ks),{size:13})],8,Px),L(`button`,{class:`small`,disabled:!!u.value,title:`create a session on this worktree`,onClick:t=>Be(e.path,e.branch)},`session`,8,Fx),e.path===a.value.root?B(``,!0):(P(),F(`button`,{key:0,class:`icon-button`,disabled:!!u.value,onClick:t=>He(e.path)},[R(A(ol),{size:13})],8,Ix)),e.path===a.value.root?(P(),I(A(ec),{key:1,size:13,class:`muted-line`})):B(``,!0)],2))),128))]),d.value?(P(),F(`pre`,Lx,E(d.value.slice(0,6e3)),1)):B(``,!0)],64)):(P(),F(`p`,Oy,[...t[36]||=[z(`Not a git repository — run `,-1),L(`code`,null,`git init`,-1),z(` (or open a session inside a repo).`,-1)]]))],2)):B(``,!0)],64)):(P(),F(`p`,wy,`No session selected — open a session to see its git.`))]))}}),[[`__scopeId`,`data-v-409b464c`]]),zx={class:`extensions-panel`},Bx={class:`panel-heading`},Vx={key:0,class:`task-empty`},Hx=[`data-extension`],Ux={class:`ext-head`},Wx=[`aria-checked`,`aria-label`,`disabled`,`onClick`],Gx=[`checked`,`disabled`,`onChange`],Kx=Or({__name:`ExtensionsPanel`,setup(e){let t=rn(),n=k(!1);async function r(){let e=Cu.value;if(!e||!_u.value)return void(t.value=void 0);t.value=await e.extensions().catch(()=>void 0)??t.value}j([Cu,_u,()=>JSON.stringify(Nu.value.agent.extensions??null)],r,{immediate:!0});async function i(e){let r=Cu.value;if(r&&!n.value){n.value=!0;try{let n=await Wu(()=>r.setExtension(e));n&&(t.value=n),Hu()}finally{n.value=!1}}}return(e,r)=>(P(),F(`div`,zx,[L(`div`,Bx,[r[0]||=L(`h2`,null,`Extensions`,-1),R(A(Uc),{size:18})]),r[3]||=L(`p`,{class:`hint`},` Custom harness capabilities for this agent. Turn one on and the next request uses it. The choice is stored with the agent, so it survives restarts. `,-1),t.value?B(``,!0):(P(),F(`p`,Vx,`Loading extensions…`)),(P(!0),F(N,null,M(t.value?.extensions??[],e=>(P(),F(`article`,{key:e.name,class:w([`ext-card`,{on:e.enabled}]),"data-extension":e.name},[L(`div`,Ux,[L(`div`,null,[L(`strong`,null,E(e.title),1),L(`code`,null,E(e.name),1)]),L(`button`,{class:w([`switch`,{on:e.enabled}]),role:`switch`,"aria-checked":e.enabled,"aria-label":e.title,disabled:n.value,onClick:t=>i({name:e.name,enabled:!e.enabled})},[...r[1]||=[L(`span`,null,null,-1)]],10,Wx)]),L(`p`,null,E(e.description),1),e.prompts?(P(),F(`ul`,{key:0,class:w([`ext-prompts`,{off:!e.enabled}])},[(P(!0),F(N,null,M(e.prompts,e=>(P(),F(`li`,{key:e.id},[L(`label`,null,[L(`input`,{type:`checkbox`,checked:e.enabled,disabled:n.value,onChange:t=>i({prompt:e.id,enabled:t.target.checked})},null,40,Gx),L(`code`,null,E(e.id),1)]),L(`span`,null,E(e.description),1),L(`details`,null,[r[2]||=L(`summary`,null,`View prompt`,-1),L(`pre`,null,E(e.text),1)])]))),128))],2)):B(``,!0)],10,Hx))),128))]))}}),qx={class:`context-section`,"aria-labelledby":`context-title`},Jx={class:`section-label`},Yx={key:0,class:`hint`},Xx={class:`context-numbers`},Zx={class:`context-pct`},Qx={key:0,class:`context-compacting`},$x=[`aria-valuemax`,`aria-valuenow`,`aria-valuetext`],eS={class:`context-marker-label`},tS=[`aria-valuemin`,`aria-valuemax`,`aria-valuenow`,`aria-valuetext`],nS={class:`context-marker-label`},rS={class:`hint context-hint`},iS={class:`modal compaction-modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`compaction-title`},aS={class:`context-toggle`},oS=[`checked`],sS=512,cS=4096,lS=1024,uS=Or({__name:`ContextBar`,setup(e){let t=e=>e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e),n=V(()=>zu.value?.contextWindow??0),r=V(()=>{let e=Nu.value.entries;for(let t=e.length-1;t>=0;t--){if(e[t].kind!==`pi.assistant`)continue;let n=e[t].model?.find(e=>e.role===`assistant`)?.usage;if(n)return n.totalTokens||n.input+n.output+n.cacheRead+n.cacheWrite}return 0}),i=V(()=>Nu.value.compactions.length>0),a=k(),o=V(()=>a.value??xu.value?.compaction??r_(n.value));j(()=>JSON.stringify(xu.value?.compaction),e=>{a.value&&e===JSON.stringify(a.value)&&(a.value=void 0)});let s=k(),c=V(()=>W.dialog?.kind===`compaction`),l=()=>void(W.dialog=void 0);qr(()=>c.value&&l());let u=V(()=>s.value??i_(n.value,o.value)),d=e=>`${Math.min(100,Math.max(0,100*e/(n.value||1)))}%`,f=V(()=>Math.round(100*r.value/(n.value||1))),p=e=>{let t=e/(n.value||1);return t<.35?`start`:t>.65?`end`:`center`},m=(e,t)=>Math.min(n.value-lS,Math.max((t??cS)+lS,e)),h=(e,t)=>Math.min(t-lS,Math.max(cS,e));function g(e,t){let n=u.value,r=Math.round(t/sS)*sS;s.value=e===`wait`?{auto:n.auto,wait:m(r,n.auto)}:{auto:h(r,n.wait),wait:n.wait}}async function _(e){let t=wu.value;if(!t)return;let n=await Wu(()=>t.setCompaction(e));n&&(a.value=n),s.value=void 0}function v(){let e=s.value;e&&_({reserveTokens:n.value-e.wait,...e.auto===void 0?{}:{backgroundTokens:e.wait-e.auto}})}let y=k(),b;function ee(e,t){b=e,t.currentTarget.setPointerCapture(t.pointerId)}function x(e){if(!b||!y.value)return;let t=y.value.getBoundingClientRect();g(b,(e.clientX-t.left)/t.width*n.value)}function S(){b&&(b=void 0,v())}function te(e,t){let n=(t.shiftKey?8192:1024)*(t.key===`ArrowRight`||t.key===`ArrowUp`?1:t.key===`ArrowLeft`||t.key===`ArrowDown`?-1:0);if(!n)return;t.preventDefault();let r=u.value;g(e,(e===`auto`?r.auto??cS:r.wait)+n)}return(e,a)=>(P(),F(N,null,[L(`section`,qx,[L(`div`,Jx,[a[7]||=L(`span`,{id:`context-title`},`CONTEXT`,-1),n.value?(P(),F(`button`,{key:0,class:`context-details-toggle`,onClick:a[0]||=e=>A(W).dialog={kind:`compaction`}},[R(A(Sc),{size:16}),a[6]||=z(`Details `,-1)])):B(``,!0)]),n.value?(P(),F(N,{key:1},[L(`div`,Xx,[L(`strong`,null,E(t(r.value)),1),L(`span`,null,`of `+E(t(n.value))+` tokens`,1),L(`span`,Zx,E(f.value)+`%`,1),i.value?(P(),F(`span`,Qx,[...a[8]||=[L(`i`,null,null,-1),z(`Compacting`,-1)]])):B(``,!0)]),L(`div`,{ref_key:`bar`,ref:y,class:w([`context-bar`,{off:!o.value.enabled}]),onPointermove:x,onPointerup:S,onPointercancel:S},[L(`div`,{class:w([`context-fill`,{hot:u.value.auto!==void 0&&r.value>=u.value.auto}]),style:ve({width:d(r.value)})},null,6),L(`div`,{class:`context-reserve`,style:ve({left:d(u.value.wait)}),title:`Reserved for the answer`},null,4),u.value.auto===void 0?B(``,!0):(P(),F(`button`,{key:0,class:w([`context-marker auto`,`label-${p(u.value.auto)}`]),role:`slider`,"aria-label":`Automatic compaction starts at`,"aria-valuemin":cS,"aria-valuemax":u.value.wait-lS,"aria-valuenow":u.value.auto,"aria-valuetext":`${t(u.value.auto)} tokens`,style:ve({left:d(u.value.auto)}),onPointerdown:a[1]||=e=>ee(`auto`,e),onKeydown:a[2]||=e=>te(`auto`,e),onKeyup:v,onBlur:v},[L(`span`,eS,`Auto-compact at `+E(t(u.value.auto)),1)],46,$x)),L(`button`,{class:w([`context-marker wait`,`label-${p(u.value.wait)}`]),role:`slider`,"aria-label":`The next request waits for a summary at`,"aria-valuemin":(u.value.auto??cS)+lS,"aria-valuemax":n.value-lS,"aria-valuenow":u.value.wait,"aria-valuetext":`${t(u.value.wait)} tokens, ${t(n.value-u.value.wait)} reserved`,style:ve({left:d(u.value.wait)}),onPointerdown:a[3]||=e=>ee(`wait`,e),onKeydown:a[4]||=e=>te(`wait`,e),onKeyup:v,onBlur:v},[L(`span`,nS,`Reserve at `+E(t(u.value.wait)),1)],46,tS)],34),L(`p`,rS,[o.value.enabled?(P(),F(N,{key:0},[a[9]||=z(`Compacts in the background at `,-1),L(`strong`,null,E(t(u.value.auto??u.value.wait)),1),a[10]||=z(` and waits at `,-1),L(`strong`,null,E(t(u.value.wait)),1),a[11]||=z(`.`,-1)],64)):(P(),F(N,{key:1},[z(`Automatic compaction is off.`)],64))])],64)):(P(),F(`div`,Yx,`Pick a model to see its context window.`))]),(P(),I(ur,{to:`body`},[c.value?(P(),F(`div`,{key:0,class:`modal-backdrop`,onClick:js(l,[`self`])},[L(`section`,iS,[L(`header`,null,[a[12]||=L(`h2`,{id:`compaction-title`},`Context compaction`,-1),L(`button`,{class:`icon-button`,"aria-label":`Close context compaction`,onClick:l},[R(A(ol),{size:18})])]),L(`p`,null,[a[13]||=z(` A summary starts in the background at `,-1),L(`strong`,null,E(t(u.value.auto??u.value.wait)),1),a[14]||=z(`. Above `,-1),L(`strong`,null,E(t(u.value.wait)),1),z(` the next request waits for it, keeping `+E(t(n.value-u.value.wait))+` free for the answer. Drag a marker on the bar to change either point. `,1)]),a[16]||=L(`p`,null,[z(`Older entries stay stored, and `),L(`code`,null,`search_history`),z(` still finds them.`)],-1),L(`label`,aS,[L(`input`,{type:`checkbox`,checked:o.value.enabled,onChange:a[5]||=e=>_({enabled:e.target.checked})},null,40,oS),a[15]||=z(` Automatic compaction `,-1)]),a[17]||=L(`p`,{class:`hint`},[z(` Applies to every agent in this session. `),L(`code`,null,`/compact`),z(` works either way. `)],-1),L(`footer`,null,[L(`button`,{class:`secondary`,onClick:l},`Close`)])])])):B(``,!0)]))],64))}}),dS=/^[A-Za-z_$][\w$]*$/,fS=e=>` `.repeat(e);function pS(e,t){let n=[],r=(e,t=`text`)=>n.push({text:e,kind:t});return r(`function`,`keyword`),r(` `),r(e,`function`),r(`(`,`punct`),r(`args`),r(`: `,`punct`),mS(t,0,r),r(`): `,`punct`),r(`Promise`,`type`),r(`<`,`punct`),r(`ToolResult`,`type`),r(`>;`,`punct`),n}function mS(e,t,n){if(!e||typeof e!=`object`)return n(`unknown`,`type`);if(`const`in e)return _S(e.const,n);if(e.enum)return gS(e.enum.map(e=>({const:e})),t,n);if(e.anyOf??e.oneOf)return gS(e.anyOf??e.oneOf,t,n);if(Array.isArray(e.type))return gS(e.type.map(t=>({...e,type:t})),t,n);switch(e.type){case`string`:case`boolean`:case`null`:return n(e.type,`type`);case`number`:case`integer`:return n(`number`,`type`);case`array`:{let r=!!(e.items?.anyOf??e.items?.oneOf??e.items?.enum);return r&&n(`(`,`punct`),mS(e.items,t,n),r&&n(`)`,`punct`),n(`[]`,`punct`)}case`object`:return hS(e,t,n);default:return n(`unknown`,`type`)}}function hS(e,t,n){let r=Object.entries(e.properties??{});if(!r.length)return e.additionalProperties&&typeof e.additionalProperties==`object`?(n(`Record`,`type`),n(`<`,`punct`),n(`string`,`type`),n(`, `,`punct`),mS(e.additionalProperties,t,n),n(`>`,`punct`)):n(`{}`,`punct`);let i=new Set(e.required??[]);n(`{`,`punct`),n(`
|
|
75
|
+
`+u),Fe&&(u=Lt(u)),ne&&Ue?ce(u):u},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};bt(e),Le=!0,Re=T,ze=Ee},t.clearConfig=function(){_t=null,Le=!1,Re=null,ze=null,ne=ie,re=``},t.isValidAttribute=function(e,t,n){_t||bt({});let r=gt(e),i=gt(t);return Yt(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&ym(ge,e)&&om(ge[e],t)},t.removeHook=function(e,t){if(ym(ge,e)){if(t!==void 0){let n=im(ge[e],t);return n===-1?void 0:sm(ge[e],n,1)[0]}return am(ge[e])}},t.removeHooks=function(e){ym(ge,e)&&(ge[e]=[])},t.removeAllHooks=function(){ge=sh()},t}var dh=uh();function fh(e,t){let n;try{n=new URL(e.trim())}catch{return null}return n.protocol!==`https:`&&n.protocol!==`http:`||n.origin===t?null:n.href}var ph=`p.br.hr.strong.b.em.i.del.s.code.pre.blockquote.ul.ol.li.a.h1.h2.h3.h4.h5.h6.small.sub.sup.table.thead.tbody.tr.th.td.img.input`.split(`.`),mh=[`form`,`style`,`script`,`button`,`select`,`textarea`,`iframe`,`object`,`embed`,`svg`,`math`],hh={a:[`href`,`title`],img:[`src`,`alt`,`title`],th:[`colspan`,`rowspan`,`align`],td:[`colspan`,`rowspan`,`align`],ol:[`start`],code:[`class`],input:[`type`,`checked`,`disabled`]},gh=[...new Set(Object.values(hh).flat())],_h=/^language-[\w-]+$/,vh=/^\d{1,4}$/,yh=/^(left|right|center)$/i;function bh(e,t,n){if(!Object.hasOwn(hh,e)||!hh[e].includes(t))return!1;switch(t){case`class`:return _h.test(n);case`type`:return n.toLowerCase()===`checkbox`;case`colspan`:case`rowspan`:case`start`:return vh.test(n);case`align`:return yh.test(n);default:return!0}}var xh=/^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9+/]+={0,2}$/i,Sh=/^\/api(\/|$)/i;function Ch(e,t){if(xh.test(e))return!0;if(!e.trim())return!1;let n;try{n=new URL(e,t)}catch{return!1}return(n.protocol===`https:`||n.protocol===`http:`)&&n.origin===t&&!Sh.test(n.pathname)}dh.isSupported&&dh.addHook(`afterSanitizeAttributes`,e=>{let t=e.nodeName.toLowerCase();for(let{name:n,value:r}of Array.from(e.attributes))bh(t,n,r)||e.removeAttribute(n);if(t===`img`&&!Ch(e.getAttribute(`src`)??``,location.origin)){e.replaceWith(document.createTextNode(e.getAttribute(`alt`)??``));return}if(t===`input`){e.getAttribute(`type`)===null?e.remove():e.setAttribute(`disabled`,``);return}if(t!==`a`)return;let n=e.getAttribute(`href`),r=n===null?null:fh(n,location.origin);r?(e.setAttribute(`href`,r),e.setAttribute(`target`,`_blank`),e.setAttribute(`rel`,`noopener noreferrer`)):(e.removeAttribute(`href`),e.removeAttribute(`target`))});var wh={ALLOWED_TAGS:ph,ALLOWED_ATTR:gh,FORBID_TAGS:mh,ALLOW_DATA_ATTR:!1,ALLOW_ARIA_ATTR:!1},Th=new Map;function Eh(e){let t=Th.get(e);return t===void 0&&(t=dh.sanitize(Lp.parse(e,{async:!1}),wh),Th.size>400&&Th.delete(Th.keys().next().value),Th.set(e,t)),t}var Dh=`demo.job-runs`,Oh=e=>e.status!==`running`&&e.status!==`waiting`,kh=V(()=>gu.value?.info?.jobs??[]),Ah=e=>kh.value.find(t=>t.id===e),jh=V(()=>{let e=Nu.value.docs[Dh];return Object.values(e?.items??{}).sort((e,t)=>t.id-e.id)}),Mh=e=>jh.value.find(t=>t.id===e),Nh=e=>jh.value.find(t=>t.toolCallId===e),Ph=k(Date.now());setInterval(()=>Ph.value=Date.now(),1e3);var Fh=e=>e<1e3?`${Math.max(0,Math.round(e))}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m ${Math.round(e%6e4/1e3)}s`,Ih=k();async function Lh(e,t){if(!Ih.value){Ih.value=e;try{return await Wu(t)}finally{Ih.value=void 0}}}function Rh(e){$u.value&&nd(),setTimeout(()=>document.querySelector(`[data-job-run="${e}"]`)?.scrollIntoView({behavior:`smooth`,block:`center`}))}async function zh(e){let t=await Lh(`start:${e.id}`,()=>Cu.value.demo(`jobs`,{job:e.id}));t&&(G(`${e.title} started. It runs in the chat.`),Rh(t.taskId))}var Bh=(e,t)=>Lh(`decide:${e.id}`,()=>Cu.value.demo(`jobs/${e.id}/approval`,{approved:t})),Vh=e=>Lh(`stop:${e.id}`,()=>wu.value.abortTask(e.id));function Hh(e){U.value&&Tu({...U.value,agentId:e})}var Uh=[`data-job-run`,`aria-label`],Wh={class:`job-run-head`},Gh={class:`job-run-icon`},Kh={class:`job-run-titles`},qh={class:`job-run-eyebrow`},Jh={class:`job-run-repeat`},Yh={key:0,class:`job-run-about`},Xh={class:`job-run-meta`},Zh={key:0,class:`job-run-resumed`},Qh={class:`job-stepper`,"aria-label":`Phases`},$h=[`aria-current`],eg={class:`job-chip`},tg={class:`job-step-dot`},ng={class:`job-step-label`},rg={key:0,class:`job-step-progress`},ig={class:`job-phases`},ag=[`open`],og={class:`job-phase-n`},sg={class:`job-phase-summary`},cg={class:`job-phase-time`},lg={key:0,class:`job-phase-about`},ug={key:1,class:`job-steps`},dg=[`open`],fg={key:1,class:`job-step-line`},pg=[`onClick`],mg={key:2,class:`job-phase-empty`},hg={key:1,class:`job-approval`,role:`group`,"aria-label":`Approval`},gg={class:`job-approval-buttons`},_g=[`disabled`],vg=[`disabled`],yg={key:2,class:`message-error`},bg={class:`job-run-foot`},xg=[`disabled`],Sg=Or({__name:`JobCard`,props:{run:{}},setup(e){let t=e,n=V(()=>Ah(t.run.job)),r=V(()=>Oh(t.run)),i=V(()=>Fh((t.run.endedAt??Ph.value)-t.run.startedAt)),a={running:`Running`,waiting:`Waiting for you`,completed:`Completed`,failed:`Failed`,aborted:`Stopped`,declined:`Declined`},o={command:Qc,tool:al,agent:Zs,state:Qs,approval:Jc,checkpoint:pc,note:Dc},s=e=>e.kind===`tool`?`${e.label}: a subagent tool call, its own durable task`:e.label,c=e=>{let t=e.step,n=[`command`,`tool`,`state`].includes(t.kind)?oo(`code`,{title:s(t)},t.label):oo(`span`,{class:`job-step-text`},t.label),r=t.status===`running`?oo(Oc,{size:15,class:`spin`}):t.status===`done`?oo(ec,{size:15}):t.status===`waiting`?oo(yc,{size:15}):oo(ol,{size:15});return[oo(o[t.kind],{size:16,class:`job-step-kind`}),n,t.kind===`tool`&&t.detail?oo(`span`,{class:`job-step-args`,title:t.detail},t.detail):null,oo(`span`,{class:`job-step-state`},[r,t.ms!==void 0&&t.kind!==`note`?oo(`span`,Fh(t.ms)):null])]};c.props=[`step`];let l=e=>n.value?.phases.find(t=>t.id===e),u=e=>e.startedAt?Fh((e.endedAt??(e.status===`running`||e.status===`waiting`?Ph.value:e.startedAt))-e.startedAt):``,d=e=>e.status!==`pending`&&e.status!==`skipped`,f=V(()=>Object.entries(t.run.input)),p=V(()=>t.run.phases.find(e=>e.status===`waiting`));return(t,o)=>(P(),F(`article`,{class:w([`job-run`,`is-${e.run.status}`]),"data-job-run":e.run.id,"aria-label":`${e.run.title} run ${e.run.run}: ${a[e.run.status]}`},[L(`header`,Wh,[L(`span`,Gh,[R(A(il),{size:22})]),L(`div`,Kh,[L(`div`,qh,[o[3]||=L(`span`,null,`DURABLE JOB`,-1),L(`span`,Jh,[R(A(Gc),{size:15}),z(`Repeatable workflow, run #`+E(e.run.run),1)])]),L(`h3`,null,E(e.run.title),1)]),L(`span`,{class:w([`job-run-status`,e.run.status])},[o[4]||=L(`i`,null,null,-1),z(E(a[e.run.status]),1)],2)]),n.value?(P(),F(`p`,Yh,E(n.value.summary),1)):B(``,!0),L(`div`,Xh,[L(`span`,null,`task #`+E(e.run.id),1),L(`span`,null,E(e.run.startedBy===`agent`?`started by the agent`:`started by you`),1),L(`span`,null,E(i.value),1),(P(!0),F(N,null,M(f.value,([e,t])=>(P(),F(`span`,{key:e,class:`job-run-input`},E(e)+`=`+E(t),1))),128)),e.run.resumed?(P(),F(`span`,Zh,`resumed `+E(e.run.resumed)+`× after restart`,1)):B(``,!0)]),L(`ol`,Qh,[(P(!0),F(N,null,M(e.run.phases,(t,n)=>(P(),F(`li`,{key:t.id,class:w(`ph-${t.status}`),"aria-current":e.run.phase===t.id&&!r.value?`step`:void 0},[L(`span`,eg,[L(`span`,tg,[t.status===`done`?(P(),I(A(ec),{key:0,size:15})):t.status===`running`?(P(),I(A(Oc),{key:1,size:15,class:`spin`})):t.status===`waiting`?(P(),I(A(yc),{key:2,size:15})):[`failed`,`aborted`].includes(t.status)?(P(),I(A(ol),{key:3,size:15})):(P(),F(N,{key:4},[z(E(n+1),1)],64))]),L(`span`,ng,E(t.label),1),t.progress?(P(),F(`span`,rg,E(t.progress.done)+`/`+E(t.progress.total),1)):B(``,!0)])],10,$h))),128))]),L(`div`,ig,[(P(!0),F(N,null,M(e.run.phases,(e,t)=>(P(),F(`details`,{key:e.id,class:w([`job-phase`,`ph-${e.status}`]),open:d(e)},[L(`summary`,null,[L(`span`,og,E(t+1),1),L(`strong`,null,E(e.label),1),L(`span`,sg,E(e.summary??(e.status===`pending`?l(e.id)?.summary:e.status===`skipped`?`Skipped`:``)),1),L(`span`,cg,E(u(e)),1)]),e.status===`done`?B(``,!0):(P(),F(`p`,lg,E(l(e.id)?.summary),1)),e.steps.length?(P(),F(`ul`,ug,[(P(!0),F(N,null,M(e.steps,e=>(P(),F(`li`,{key:e.id,class:w([`k-${e.kind}`,`st-${e.status}`])},[e.detail&&e.kind!==`tool`?(P(),F(`details`,{key:0,open:e.status===`error`},[L(`summary`,null,[R(c,{step:e},null,8,[`step`])]),L(`pre`,null,E(e.detail),1)],8,dg)):(P(),F(`div`,fg,[R(c,{step:e},null,8,[`step`])])),e.kind===`agent`&&e.conversationId?(P(),F(`button`,{key:2,class:`text-button job-step-link`,onClick:t=>A(Hh)(e.conversationId)},` Open subagent #`+E(e.conversationId),9,pg)):B(``,!0)],2))),128))])):e.status===`pending`?(P(),F(`p`,mg,`Not started yet.`)):B(``,!0)],10,ag))),128))]),e.run.approval===`pending`?(P(),F(`div`,hg,[L(`div`,null,[R(A(Jc),{size:20}),o[5]||=L(`strong`,null,`Approve to continue`,-1)]),L(`p`,null,E(p.value?l(p.value.id)?.summary:`This run waits for you`)+`. It is paused on a saved checkpoint: close the browser or restart the device and the decision will still be waiting. `,1),L(`div`,gg,[L(`button`,{class:`primary small`,disabled:!!A(Ih),onClick:o[0]||=t=>A(Bh)(e.run,!0)},[R(A(ec),{size:18}),o[6]||=z(`Approve & continue `,-1)],8,_g),L(`button`,{class:`secondary`,disabled:!!A(Ih),onClick:o[1]||=t=>A(Bh)(e.run,!1)},`Decline`,8,vg)])])):B(``,!0),e.run.error&&e.run.status!==`aborted`?(P(),F(`p`,yg,E(e.run.error),1)):B(``,!0),L(`footer`,bg,[L(`span`,null,E(e.run.background?`Runs in the background: the conversation owns it, so Interrupt leaves it running.`:`Owned by this tool call: Interrupt stops it.`)+` Each phase saves a checkpoint, so a restart resumes the current phase.`,1),r.value?B(``,!0):(P(),F(`button`,{key:0,class:`secondary danger`,disabled:!!A(Ih),onClick:o[2]||=t=>A(Vh)(e.run)},[R(A(Pc),{size:16}),o[7]||=z(`Stop `,-1)],8,xg))])],10,Uh))}}),Cg={class:`message-label`},wg={class:`user-message`},Tg={class:`message-label`},Eg={key:0,class:`streaming`},Dg={key:1},Og=[`aria-label`],kg=[`innerHTML`],Ag={key:1,class:`thinking`},jg=[`data-call-id`],Mg={class:`tool-status`},Ng={class:`tool-section-label`},Pg=[`aria-label`,`onClick`],Fg={key:0,class:`typing`},Ig={key:1,class:`message-error`},Lg=[`aria-label`],Rg={key:3,class:`live-tool`},zg={key:0},Bg={class:`event-line`},Vg=[`aria-label`],Hg={key:0,class:`raw`},Ug=Or({__name:`TranscriptItem`,props:{item:{}},emits:[`fork`],setup(e,{emit:t}){let n=t,r=e=>e.status===`error`?`Error`:e.status===`done`?`Done`:e.status,i=e=>e.kind===`user`?`pi-user`:e.kind===`assistant`?e.streaming?`live-generation`:`pi-assistant`:e.kind===`tool-result`?`pi-tool-result`:e.kind===`tool`?`live-tool-entry`:e.entryKind.replaceAll(`.`,`-`);return(t,a)=>(P(),F(`article`,{class:w([`entry`,i(e.item)])},[e.item.kind===`user`?(P(),F(N,{key:0},[L(`div`,Cg,[a[3]||=z(` YOU `,-1),L(`span`,null,`#`+E(e.item.id),1)]),L(`div`,wg,E(e.item.text),1)],64)):e.item.kind===`assistant`?(P(),F(N,{key:1},[L(`div`,Tg,[a[5]||=z(` AGENT `,-1),e.item.streaming?(P(),F(`span`,Eg,`Working`)):(P(),F(`span`,Dg,`#`+E(e.item.id),1)),e.item.streaming?B(``,!0):(P(),F(`button`,{key:2,class:`fork-button`,"aria-label":`Fork at entry ${e.item.id}`,title:`Fork from this entry. App State stays shared.`,onClick:a[0]||=t=>n(`fork`,e.item.id)},[R(A(vc),{size:18}),a[4]||=z(`Fork `,-1)],8,Og))]),(P(!0),F(N,null,M(e.item.blocks,(e,t)=>(P(),F(N,{key:t},[e.type===`text`?(P(),F(`div`,{key:0,class:`markdown`,innerHTML:A(Eh)(e.text)},null,8,kg)):e.type===`thinking`?(P(),F(`details`,Ag,[a[6]||=L(`summary`,null,`Thinking`,-1),L(`div`,null,E(e.text),1)])):(P(),F(`details`,{key:2,class:w([`tool-call`,{failed:e.call.status===`error`}]),"data-call-id":e.call.callId},[L(`summary`,null,[e.call.status===`error`?(P(),I(A(Sc),{key:0,size:18})):e.call.status===`done`?(P(),I(A(ec),{key:1,size:18})):e.call.status===`running`?(P(),I(A(Us),{key:2,size:18})):(P(),I(A(al),{key:3,size:18})),L(`strong`,null,E(e.call.name),1),L(`code`,null,E(A(qu)(e.call.args)?.slice(0,90)),1),L(`span`,Mg,E(r(e.call)),1)]),a[10]||=L(`div`,{class:`tool-section-label`},`Input`,-1),L(`pre`,null,E(A(qu)(e.call.args)),1),e.call.result===void 0?e.call.output?(P(),F(N,{key:1},[a[9]||=L(`div`,{class:`tool-section-label`},`Live output`,-1),L(`pre`,null,E(e.call.output),1)],64)):B(``,!0):(P(),F(N,{key:0},[L(`div`,Ng,[a[8]||=L(`span`,null,`Result`,-1),e.call.resultEntryId===void 0?B(``,!0):(P(),F(`button`,{key:0,class:`fork-button`,"aria-label":`Fork at entry ${e.call.resultEntryId}`,title:`Fork after this result`,onClick:t=>n(`fork`,e.call.resultEntryId)},[R(A(vc),{size:18}),a[7]||=z(`Fork `,-1)],8,Pg))]),L(`pre`,null,E(e.call.result),1)],64))],10,jg)),e.type===`tool`&&e.call.name===`run_durable_job`&&A(Nh)(e.call.callId)?(P(),I(Sg,{key:3,run:A(Nh)(e.call.callId)},null,8,[`run`])):B(``,!0)],64))),128)),e.item.streaming&&!e.item.blocks.length?(P(),F(`div`,Fg,[...a[11]||=[L(`i`,null,null,-1),L(`i`,null,null,-1),L(`i`,null,null,-1)]])):B(``,!0),e.item.error?(P(),F(`div`,Ig,E(e.item.error),1)):B(``,!0)],64)):e.item.kind===`tool-result`?(P(),F(`details`,{key:2,class:w([`tool-result`,{failed:e.item.isError}])},[L(`summary`,null,[e.item.isError?(P(),I(A(Sc),{key:1,size:18})):(P(),I(A(ec),{key:0,size:18})),L(`strong`,null,E(e.item.name),1),L(`span`,null,E(e.item.isError?`error`:`result`),1),L(`button`,{class:`fork-button`,"aria-label":`Fork at entry ${e.item.id}`,onClick:a[1]||=js(t=>n(`fork`,e.item.id),[`prevent`])},[R(A(vc),{size:18}),a[12]||=z(`Fork `,-1)],8,Lg)]),L(`pre`,null,E(e.item.text),1)],2)):e.item.kind===`tool`?(P(),F(`div`,Rg,[L(`div`,null,[R(A(Us),{size:18}),L(`strong`,null,E(e.item.call.name),1),L(`span`,null,E(e.item.call.status),1)]),e.item.call.output?(P(),F(`pre`,zg,E(e.item.call.output),1)):B(``,!0),e.item.call.name===`run_durable_job`&&A(Nh)(e.item.call.callId)?(P(),I(Sg,{key:1,run:A(Nh)(e.item.call.callId)},null,8,[`run`])):B(``,!0)])):e.item.entryKind===`demo.job`&&A(Mh)(e.item.data.taskId)?(P(),I(Sg,{key:4,run:A(Mh)(e.item.data.taskId)},null,8,[`run`])):(P(),F(N,{key:5},[L(`div`,Bg,[e.item.entryKind===`demo.state-change`?(P(),I(A(Qs),{key:0,size:18})):(P(),I(A(Tc),{key:1,size:18})),L(`span`,null,E(e.item.text),1),L(`button`,{class:`fork-button`,"aria-label":`Fork at entry ${e.item.id}`,onClick:a[2]||=t=>n(`fork`,e.item.id)},[R(A(vc),{size:18}),a[13]||=z(`Fork `,-1)],8,Vg)]),e.item.note?(P(),F(`details`,Hg,[a[14]||=L(`summary`,null,`Context note`,-1),L(`pre`,null,E(e.item.note),1)])):B(``,!0)],64))],2))}}),Wg={key:0,class:`git-chip-wrap`},Gg=[`title`],Kg={class:`branch`},qg={key:0,class:`dirty`},Jg={key:1,class:`ahead`},Yg={key:2,class:`behind`},Xg=Or({__name:`GitChip`,props:{deviceId:{},cwd:{}},setup(e){let t=e,n=V(()=>t.cwd??xu.value?.cwd??``),r=V(()=>t.deviceId??hu.value),i=V(()=>Dd(r.value||`?`,n.value||`?`)),a=V(()=>i.value.status),o=V(()=>i.value.loading),s=V(()=>(a.value?.staged??0)+(a.value?.unstaged??0)+(a.value?.untracked??0));return kd(r.value||`?`,n.value||`?`),Jr(()=>kd(r.value||`?`,n.value||`?`)),j([r,n],()=>void kd(r.value||`?`,n.value||`?`)),(e,t)=>a.value?.repo||o.value?(P(),F(`span`,Wg,[L(`button`,{class:`crumb git-chip`,title:a.value?`${a.value.root} · ${a.value.head??``} ${a.value.subject??``} — opens the Git tab`:`loading git…`,onClick:t[0]||=e=>A(td)(`git`)},[R(A(gc),{size:16,"aria-hidden":`true`}),L(`span`,Kg,E(a.value?.branch??a.value?.head??`…`),1),s.value?(P(),F(`span`,qg,`±`+E(s.value),1)):B(``,!0),a.value?.ahead?(P(),F(`span`,Jg,`↑`+E(a.value.ahead),1)):B(``,!0),a.value?.behind?(P(),F(`span`,Yg,`↓`+E(a.value.behind),1)):B(``,!0),R(A(tc),{size:14,"aria-hidden":`true`})],8,Gg)])):B(``,!0)}}),Zg=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Qg=Zg(Xg,[[`__scopeId`,`data-v-c0fb9e98`]]),$g=()=>globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`,e_=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],t_={enabled:!0,reserveTokens:16384,backgroundTokens:32768,keepRecentTokens:2e3},n_={auto:2e5,wait:25e4};function r_(e){if(!(e>0))return{...t_};let t=Math.min(n_.wait,e-t_.reserveTokens),n=Math.min(n_.auto,t-t_.backgroundTokens);return{...t_,reserveTokens:e-t,backgroundTokens:t-n}}function i_(e,t){let n=Math.max(0,e-t.reserveTokens);return{wait:n,auto:t.backgroundTokens>0?Math.max(0,n-t.backgroundTokens):void 0}}var a_=(e,t)=>{if(e===void 0)throw Error(`No ${t} selected`);return e},o_=[{name:`compact`,args:`[instructions]`,description:`Summarize older context; stored entries stay`,run:async e=>{await a_(Cu.value,`agent`).compact(e||void 0),G(`Compaction requested. /tasks shows its outcome.`)}},{name:`reset`,args:`[handoff note]`,description:`Start a fresh context; history stays stored`,run:async e=>{await a_(Cu.value,`agent`).reset(e||void 0),G(`New context started.`)}},{name:`tasks`,description:`Open the Tasks panel`,run:()=>td(`tasks`)},{name:`new`,args:`[name]`,description:`New agent in this workspace`,run:async e=>{let t=a_(U.value,`workspace`),n=await a_(wu.value,`workspace`).createAgent(e?{name:e}:{});Tu({...t,agentId:n.id}),G(`New agent ${n.name}.`)}},{name:`fork`,args:`[entryId] [name]`,description:`Fork at an entry (default: the last reply)`,run:async e=>{let[t,...n]=e.split(/\s+/).filter(Boolean),r=t&&/^\d+$/.test(t)?Number(t):void 0,i=(r===void 0?[t,...n]:n).filter(Boolean).join(` `),a=r??Nu.value.entries.filter(e=>e.kind===`pi.assistant`).at(-1)?.id;if(a===void 0)throw Error(`Nothing to fork yet`);let o=a_(U.value,`agent`),s=await a_(Cu.value,`agent`).fork({entryId:a,name:i||void 0});Tu({...o,agentId:s.id}),G(`Forked at entry #${a}. App State stays shared.`)}},{name:`name`,args:`<name>`,description:`Rename this agent`,run:async e=>{if(!e)throw Error(`Usage: /name <name>`);await a_(Cu.value,`agent`).rename(e),G(`Agent renamed to ${e}.`)}},{name:`model`,description:`Choose this agent's model`,run:()=>W.dialog={kind:`models`}},{name:`thinking`,args:`<level>`,description:`Thinking level: ${e_.join(`, `)}`,run:async e=>{if(!e_.includes(e))throw Error(`Levels: ${e_.join(`, `)}`);await a_(Cu.value,`agent`).configure({thinkingLevel:e}),await Hu(),G(`Thinking ${e}. Used on the next turn.`)}},{name:`help`,description:`How this works, keys and commands`,run:()=>W.dialog={kind:`help`}}];function s_(e){let t=e.trim().match(/^\/(\S+)\s*([\s\S]*)$/),n=t&&o_.find(e=>e.name===t[1]);return n?{command:n,arg:t[2].trim()}:void 0}var c_={class:`composer-region`},l_={key:0,class:`queue`},u_=[`aria-label`,`onClick`],d_={class:`composer`},f_={key:0,class:`slash-menu`,role:`listbox`,"aria-label":`Slash commands`},p_=[`aria-selected`,`onMousedown`],m_={key:0,class:`slash-args`},h_={class:`slash-desc`},g_={class:`composer-toolbar`},__={class:`composer-left`},v_={class:`queue-mode`},y_={class:`composer-right`},b_=[`disabled`],x_=[`disabled`],S_=Or({__name:`Composer`,setup(e){let t=k(`followUp`),n=k(!1),r=V(()=>_u.value&&Nu.value.ready&&yu.status.value===`live`&&cu.value===`live`),i=k(0),a=k(!1),o=V(()=>{let e=W.composer.match(/^\/(\S*)$/);return e&&!a.value?o_.filter(t=>t.name.startsWith(e[1].toLowerCase())):[]});j(()=>W.composer,()=>{i.value=0,W.composer.startsWith(`/`)||(a.value=!1)});async function s(e,t=!1){!e.args||t&&e.args.startsWith(`[`)&&W.composer===`/${e.name}`?(W.composer=`/${e.name}`,await u()):W.composer=`/${e.name} `}function c(e){if(!o.value.length){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),u());return}if(e.key===`ArrowDown`||e.key===`ArrowUp`){let t=o.value.length;i.value=(i.value+(e.key===`ArrowDown`?1:t-1))%t}else if(e.key===`Tab`||e.key===`Enter`&&!e.shiftKey)s(o.value[i.value],e.key===`Enter`);else if(e.key===`Escape`)a.value=!0;else return;e.preventDefault(),e.stopPropagation()}async function l(e){let t=s_(e);return t?(n.value=!0,await Wu(async()=>{await t.command.run(t.arg),W.composer=``}),n.value=!1,!0):!1}async function u(){let e=W.composer.trim(),i=Cu.value;if(!e||n.value||!i||!r.value||e.startsWith(`/`)&&await l(e))return;n.value=!0;let a=U.value,o=`${a.deviceId}/${a.sessionId}/${a.agentId}`,s;try{s=JSON.parse(sessionStorage.getItem(`dpi.pending-send`)??`null`)}catch{}let c=s?.key===o&&s.content===e&&s.mode===t.value?s.requestId:$g();sessionStorage.setItem(`dpi.pending-send`,JSON.stringify({key:o,content:e,mode:t.value,requestId:c})),await Wu(async()=>{await i.send(e,t.value,c),sessionStorage.removeItem(`dpi.pending-send`),W.composer=``}),n.value=!1}function d(e){Wu(()=>Cu.value.withdraw(e))}return(e,a)=>(P(),F(`div`,c_,[A(Nu).inbox.length?(P(),F(`div`,l_,[(P(!0),F(N,null,M(A(Nu).inbox,e=>(P(),F(`div`,{key:e.id},[R(A(ac),{size:18}),L(`span`,null,E(e.mode===`steer`?`Steer`:`Queued`)+`: `+E(e.content??`Context update`),1),L(`button`,{class:`icon-button`,"aria-label":`Withdraw submission ${e.id}`,title:`Withdraw queued input`,onClick:t=>d(e.id)},[R(A(ol),{size:18})],8,u_)]))),128))])):B(``,!0),L(`div`,d_,[o.value.length?(P(),F(`ul`,f_,[(P(!0),F(N,null,M(o.value,(e,t)=>(P(),F(`li`,{key:e.name,role:`option`,"aria-selected":t===i.value,class:w({active:t===i.value}),onMousedown:js(t=>s(e),[`prevent`])},[L(`code`,null,`/`+E(e.name),1),e.args?(P(),F(`span`,m_,E(e.args),1)):B(``,!0),L(`span`,h_,E(e.description),1)],42,p_))),128))])):B(``,!0),Un(L(`textarea`,{"onUpdate:modelValue":a[0]||=e=>A(W).composer=e,rows:`2`,placeholder:`Give your agent something to do, or type / for commands…`,"aria-label":`Message your agent`,onKeydown:c},null,544),[[xs,A(W).composer]]),L(`div`,g_,[L(`div`,__,[L(`div`,v_,[Un(L(`select`,{"onUpdate:modelValue":a[1]||=e=>t.value=e,"aria-label":`When busy`,title:`Follow-up waits for this run. Steer joins after a tool round.`},[...a[3]||=[L(`option`,{value:`followUp`},`Follow-up`,-1),L(`option`,{value:`steer`},`Steer`,-1),L(`option`,{value:`reject`},`Reject if busy`,-1)]],512),[[ws,t.value]]),R(A(tc),{size:24,"aria-hidden":`true`})])]),L(`div`,y_,[L(`button`,{class:`interrupt`,disabled:!A(Lu)||A(Xu),title:`Stop foreground work and owned subagents (Escape). Background jobs continue.`,onClick:a[2]||=(...e)=>A(Zu)&&A(Zu)(...e)},[R(A(Pc),{size:24,class:`stop-sign`,fill:`currentColor`}),a[4]||=z(`Interrupt`,-1)],8,b_),L(`button`,{class:`send`,"aria-label":`Send message`,disabled:!A(W).composer.trim()||n.value||!r.value,onClick:u},[R(A(Ys),{size:20})],8,x_)])])]),a[5]||=L(`div`,{class:`composer-footnote`},[L(`span`,null,[L(`i`,{class:`live-dot`}),z(`Closing this window never interrupts your agent.`)])],-1)]))}}),C_={class:`chat-panel`},w_={class:`chat-header`},T_={class:`lineage-picker`},E_={class:`lineage-toolbar`},D_=[`title`],O_={class:`crumb-main`},k_={class:`device-chip`},A_=[`title`],j_={class:`crumb-main`},M_={class:`crumb-name`},N_=[`aria-current`,`title`,`onClick`],P_={class:`crumb-kind`},F_={class:`crumb-main`},I_={class:`crumb-name`},L_=[`disabled`],R_=[`aria-expanded`],z_={key:0,class:`lineage-source`},B_={id:`conversation-picker`,class:`conversation-picker`,role:`dialog`,"aria-label":`Choose conversation`},V_=[`aria-label`,`aria-current`,`onClick`],H_={class:`conversation-choice-content`},U_={class:`choice-lineage`},W_={class:`choice-source`},G_={key:0,class:`agent-stream-status`,role:`alert`},K_=[`disabled`],q_={key:0,class:`chat-empty`},J_={key:0},Y_={key:1},X_={key:0,class:`chat-empty`},Z_={class:`starter-grid`},Q_={key:1,class:`entry live-generation`},$_={class:`message-label`},ev={class:`streaming`},tv={key:2,class:`hint retry-note`},nv=Or({__name:`AgentView`,setup(e){let t=k(),n=k(),r=k(!1),i=V(()=>Nu.value.items),a=V(()=>i.value.some(e=>e.kind===`assistant`&&e.streaming)),o=V(()=>i.value.some(e=>e.kind===`tool`&&e.call.status===`running`||e.kind===`assistant`&&e.blocks.some(e=>e.type===`tool`&&e.call.status===`running`))),s=e=>e.kind===`fork`?`Forked from agent #${e.parentId} at entry #${e.forkedAt}`:e.kind===`subagent`?`Owned by agent #${e.ownerAgentId}`:`Root agent`,c=V(()=>Pu.value.map(e=>({...e,lineage:xl(Pu.value,e.id)})).sort((e,t)=>{for(let n=0;n<Math.min(e.lineage.length,t.lineage.length);n++)if(e.lineage[n].id!==t.lineage[n].id)return e.lineage[n].id-t.lineage[n].id;return e.lineage.length-t.lineage.length})),l=V(()=>Fu.value.at(-1)),u=e=>e.kind===`root`?`agent`:e.kind;function d(){U.value&&(pu.tree=!0,Ou(U.value.deviceId,!0))}function f(){let e=Pu.value.find(e=>e.kind===`root`)??Pu.value[0];e&&p(e.id)}function p(e){r.value=!1,U.value&&Tu({...U.value,agentId:e})}function m(e){let t=Cu.value,n=U.value;t&&n&&(W.dialog={kind:`prompt`,title:`Fork conversation`,hint:`${l.value?.name??`Agent #${n.agentId}`} / entry #${e}. Leave the name blank to use Fork #ID.`,label:`Fork name`,optional:!0,placeholder:`e.g. Alternative approach`,submit:`Create fork`,run:async r=>{let i=await t.fork({entryId:e,name:r||void 0});Tu({...n,agentId:i.id}),G(`Forked at entry #${e}. App State stays shared.`)}})}function h(){let e=Cu.value,t=l.value;e&&t&&(W.dialog={kind:`prompt`,title:`Rename agent`,label:`Agent name`,value:t.named?t.name:``,placeholder:t.name,submit:`Save name`,run:t=>e.rename(t)})}j(U,()=>{r.value=!1});let g=!0;return j(yu.version,()=>{let e=t.value;g=!e||e.scrollHeight-e.scrollTop-e.clientHeight<120},{flush:`pre`}),j(yu.version,()=>{g&&An(()=>t.value?.scrollTo({top:t.value.scrollHeight,behavior:`instant`}))}),j(()=>Fu.value.length,()=>void An(()=>n.value&&(n.value.scrollLeft=n.value.scrollWidth))),(e,g)=>(P(),F(`section`,C_,[L(`header`,w_,[L(`div`,T_,[L(`div`,E_,[L(`nav`,{ref_key:`lineageNav`,ref:n,class:`crumbs conversation-lineage`,"aria-label":`Conversation lineage`},[L(`button`,{class:`crumb`,title:`${A(gu)?.name} · ${A(gu)?.url}`,onClick:d},[g[5]||=L(`span`,{class:`crumb-kind`},`device`,-1),L(`span`,O_,[R(xd,{device:A(gu),size:18},null,8,[`device`]),L(`span`,k_,E(A(gu)?.name??A(gu)?.id),1)])],8,D_),R(A(nc),{class:`crumb-sep`,size:18,"aria-hidden":`true`}),L(`button`,{class:`crumb`,title:A(xu)?.cwd,onClick:f},[g[6]||=L(`span`,{class:`crumb-kind`},`workspace`,-1),L(`span`,j_,[R(A(mc),{size:18,"aria-hidden":`true`}),L(`span`,M_,E(A(xu)?.name),1)])],8,A_),A(xu)?.cwd?(P(),I(Qg,{key:0})):B(``,!0),(P(!0),F(N,null,M(A(Fu),e=>(P(),F(N,{key:e.id},[R(A(nc),{class:`crumb-sep`,size:18,"aria-hidden":`true`}),L(`button`,{class:w([`crumb`,{current:e.id===A(U)?.agentId}]),"aria-current":e.id===A(U)?.agentId?`page`:void 0,title:s(e),onClick:t=>p(e.id)},[L(`span`,P_,E(u(e)),1),L(`span`,F_,[e.kind===`fork`?(P(),I(A(vc),{key:0,size:18,"aria-hidden":`true`})):e.kind===`subagent`?(P(),I(A(sc),{key:1,size:18,"aria-hidden":`true`})):(P(),I(A(Ac),{key:2,size:18,"aria-hidden":`true`})),L(`span`,I_,E(e.name),1)])],10,N_)],64))),128))],512),L(`button`,{class:`icon-button`,"aria-label":`Rename agent`,title:`Rename this agent`,disabled:!l.value,onClick:h},[R(A(Bc),{size:18})],8,L_),L(`button`,{class:`icon-button conversation-menu-toggle`,"aria-label":`Browse conversations`,"aria-haspopup":`dialog`,"aria-expanded":r.value,"aria-controls":`conversation-picker`,title:`Browse roots and forks`,onClick:g[0]||=e=>r.value=!r.value},[R(A(tc),{size:18})],8,R_)]),l.value&&l.value.kind!==`root`?(P(),F(`div`,z_,E(s(l.value)),1)):B(``,!0),r.value?(P(),F(N,{key:1},[L(`button`,{class:`conversation-menu-dismiss`,"aria-label":`Close conversation picker`,onClick:g[1]||=e=>r.value=!1}),L(`section`,B_,[g[7]||=L(`div`,{class:`conversation-picker-heading`},`Roots & forks`,-1),(P(!0),F(N,null,M(c.value,e=>(P(),F(`button`,{key:e.id,class:w([`conversation-choice`,{selected:e.id===A(U)?.agentId}]),"aria-label":e.lineage.map(e=>e.name).join(` → `),"aria-current":e.id===A(U)?.agentId?`page`:void 0,onClick:t=>p(e.id)},[L(`div`,H_,[L(`span`,U_,[(P(!0),F(N,null,M(e.lineage,(t,n)=>(P(),F(N,{key:t.id},[n?(P(),I(A(nc),{key:0,size:18,"aria-hidden":`true`})):B(``,!0),L(`span`,{class:w({"choice-ancestor":n<e.lineage.length-1})},E(t.name),3)],64))),128))]),L(`span`,W_,E(s(e)),1)]),e.id===A(U)?.agentId?(P(),I(A(ec),{key:0,size:18,"aria-hidden":`true`})):e.kind===`fork`?(P(),I(A(vc),{key:1,size:18,"aria-hidden":`true`})):(P(),I(A(Ac),{key:2,size:18,"aria-hidden":`true`}))],10,V_))),128))])],64)):B(``,!0)])]),A(yu).fault.value||A(yu).status.value===`fault`||A(yu).status.value===`reconnecting`||A(Nu).ready&&A(yu).status.value===`connecting`?(P(),F(`div`,G_,[L(`div`,null,[L(`strong`,null,E(A(Nu).ready?`Cached transcript is stale.`:`Agent stream unavailable.`),1),L(`p`,null,E(A(yu).fault.value||`Updates are paused while the stream reconnects.`),1),g[8]||=L(`p`,null,`Sending is paused until a fresh snapshot arrives. Your draft is kept.`,-1)]),L(`button`,{disabled:A(yu).status.value===`connecting`,onClick:g[2]||=(...e)=>A(yu).retry&&A(yu).retry(...e)},` Retry stream `,8,K_)])):B(``,!0),L(`div`,{ref_key:`chat`,ref:t,class:`chat-scroll`,"data-testid":`chat`},[A(Nu).ready?(P(),F(N,{key:1},[i.value.length?B(``,!0):(P(),F(`div`,X_,[g[13]||=L(`div`,{class:`agent-orb`},[L(`img`,{src:`/icons/durable-pi.svg`,alt:`Durable Pi`}),L(`i`)],-1),g[14]||=L(`span`,{class:`eyebrow`},`YOUR DURABLE AGENT IS READY`,-1),g[15]||=L(`h2`,null,`A conversation with continuity.`,-1),L(`p`,null,`Messages, tools and state live on `+E(A(gu)?.id)+`, beyond this window.`,1),L(`div`,Z_,[L(`button`,{onClick:g[3]||=e=>A(Gu)(`Inspect this directory using your tools and give me a brief overview. Do not modify any files.`)},[R(A(mc),{size:18}),g[9]||=L(`strong`,null,`Explore this directory`,-1),g[10]||=L(`span`,null,`See coding tools in action`,-1),R(A(Js),{size:18})]),L(`button`,{onClick:g[4]||=e=>A(Gu)(`Use read_state, then update_state to add a field called progress with value 1 and a boolean called ready with value false.`)},[R(A(Qs),{size:18}),g[11]||=L(`strong`,null,`Make a state change`,-1),g[12]||=L(`span`,null,`Watch the workspace update`,-1),R(A(Js),{size:18})])])])),(P(!0),F(N,null,M(i.value,e=>(P(),I(Ug,{key:e.id,item:e,onFork:m},null,8,[`item`]))),128)),A(Nu).running&&!a.value&&!o.value?(P(),F(`div`,Q_,[L(`div`,$_,[g[16]||=z(` AGENT `,-1),L(`span`,ev,E(A(Nu).retry?`Retry scheduled`:`Working`),1)]),g[17]||=L(`div`,{class:`typing`},[L(`i`),L(`i`),L(`i`)],-1)])):B(``,!0),A(Nu).retry?(P(),F(`p`,tv,` Retrying: `+E(A(Nu).retry.error),1)):B(``,!0),(P(!0),F(N,null,M(A(Nu).notices,(e,t)=>(P(),F(`p`,{key:t,class:`message-error`},E(e),1))),128))],64)):(P(),F(`div`,q_,[R(A(Us),{size:30}),A(yu).status.value===`fault`?(P(),F(`h2`,J_,`This agent is unavailable.`)):(P(),F(`h2`,Y_,`Connecting to the agent…`)),L(`p`,null,`The agent keeps working on `+E(A(gu)?.id)+` while this view connects.`,1)]))],512),R(S_)]))}});function rv(e,t){return`${e}/${t.replaceAll(`~`,`~0`).replaceAll(`/`,`~1`)}`}var iv=[`data-state-path`],av={key:0,class:`state-field-heading`},ov=[`value`,`aria-label`,`disabled`],sv=[`value`],cv=[`aria-label`,`disabled`],lv=[`aria-label`,`disabled`],uv=[`aria-label`,`disabled`],dv=[`value`],fv=[`disabled`],pv=[`disabled`,`aria-label`],mv={key:2,class:`state-number`},hv=[`aria-label`,`disabled`],gv=[`aria-label`,`disabled`],_v=[`aria-label`,`disabled`],vv={key:3,class:`state-boolean`},yv=[`aria-label`,`aria-checked`,`disabled`],bv=[`aria-label`,`disabled`],xv={key:5,class:`muted`},Sv=Or({__name:`StateEditor`,props:{value:{type:[String,Number,Boolean,null,Array,Object]},path:{default:``},label:{default:`App State`},disabled:{type:Boolean}},emits:[`change`],setup(e,{emit:t}){let n=e,r=t,i=V(()=>n.value===null?`null`:Array.isArray(n.value)?`array`:typeof n.value),a=V(()=>i.value===`object`||i.value===`array`),o=V(()=>a.value?Object.entries(n.value):[]),s=k(``),c=k(!1),l=k(``),u=k(`string`),d=k(!1),f=[`string`,`number`,`boolean`,`object`,`array`,`null`],p={string:()=>``,number:()=>0,boolean:()=>!1,object:()=>({}),array:()=>[],null:()=>null};j(()=>n.value,e=>{c.value||(s.value=String(e??``))},{immediate:!0});function m(e,t){r(`change`,{operation:e,path:n.path,value:t})}function h(){c.value=!1;let e=i.value===`number`?Number(s.value):s.value;if(i.value===`number`&&(!String(s.value).trim()||!Number.isFinite(e))){s.value=String(n.value);return}e!==n.value&&m(`update`,e)}function g(){let e=i.value===`array`?`-`:l.value.trim();e&&(r(`change`,{operation:`create`,path:rv(n.path,e),value:p[u.value]()}),l.value=``,d.value=!1)}return(t,n)=>{let _=$r(`StateEditor`,!0);return P(),F(`div`,{class:w([`state-field`,{"state-root":e.path===``}]),"data-state-path":e.path},[e.path===``?B(``,!0):(P(),F(`div`,av,[L(`strong`,null,E(e.label),1),L(`select`,{value:i.value,"aria-label":`Type of ${e.path}`,disabled:e.disabled,onChange:n[0]||=e=>m(`update`,p[e.target.value]())},[(P(),F(N,null,M(f,e=>L(`option`,{key:e,value:e},E(e),9,sv)),64))],40,ov),L(`button`,{class:`icon-button`,"aria-label":`Delete ${e.path}`,title:`Delete field`,disabled:e.disabled,onClick:n[1]||=e=>m(`delete`)},[R(A($c),{size:18})],8,cv)])),a.value?(P(),F(N,{key:1},[(P(!0),F(N,null,M(o.value,([t,i])=>(P(),I(_,{key:t,value:i,path:A(rv)(e.path,t),label:t,disabled:e.disabled,onChange:n[2]||=e=>r(`change`,e)},null,8,[`value`,`path`,`label`,`disabled`]))),128)),d.value&&i.value===`array`?(P(),F(`form`,{key:0,class:`state-add`,onSubmit:js(g,[`prevent`])},[i.value===`array`?B(``,!0):Un((P(),F(`input`,{key:0,"onUpdate:modelValue":n[3]||=e=>l.value=e,placeholder:`Field name`,"aria-label":`New field name in ${e.path||`/`}`,required:``,disabled:e.disabled},null,8,lv)),[[xs,l.value]]),Un(L(`select`,{"onUpdate:modelValue":n[4]||=e=>u.value=e,"aria-label":`New field type in ${e.path||`/`}`,disabled:e.disabled},[(P(),F(N,null,M(f,e=>L(`option`,{key:e,value:e},E(e),9,dv)),64))],8,uv),[[ws,u.value]]),L(`button`,{class:`secondary small`,disabled:e.disabled||i.value!==`array`&&!l.value.trim()},` Add `,8,fv),L(`button`,{type:`button`,class:`text-button`,onClick:n[5]||=e=>d.value=!1},`Cancel`)],32)):i.value===`array`?(P(),F(`button`,{key:1,class:`text-button state-add-button`,disabled:e.disabled,"aria-label":`Add ${i.value===`array`?`item`:`field`} to ${e.path||`/`}`,onClick:n[6]||=e=>d.value=!0},[R(A(Hc),{size:18}),z(E(i.value===`array`?`Add item`:`Add field`),1)],8,pv)):B(``,!0)],64)):i.value===`number`?(P(),F(`div`,mv,[L(`button`,{class:`secondary`,"aria-label":`Decrement ${e.path}`,disabled:e.disabled,onClick:n[7]||=e=>m(`increment`,-1)},[R(A(jc),{size:18})],8,hv),Un(L(`input`,{"onUpdate:modelValue":n[8]||=e=>s.value=e,type:`number`,step:`any`,"aria-label":`Value of ${e.path}`,disabled:e.disabled,onFocus:n[9]||=e=>c.value=!0,onBlur:h,onKeydown:n[10]||=Ns(e=>e.target.blur(),[`enter`])},null,40,gv),[[xs,s.value]]),L(`button`,{class:`secondary`,"aria-label":`Increment ${e.path}`,disabled:e.disabled,onClick:n[11]||=e=>m(`increment`,1)},[R(A(Hc),{size:18})],8,_v)])):i.value===`boolean`?(P(),F(`div`,vv,[L(`button`,{class:w([`switch`,{on:e.value===!0}]),role:`switch`,"aria-label":`Value of ${e.path}`,"aria-checked":e.value===!0,disabled:e.disabled,onClick:n[12]||=t=>m(`update`,!e.value)},[...n[15]||=[L(`span`,null,null,-1)]],10,yv),L(`span`,null,E(e.value),1)])):i.value===`string`?Un((P(),F(`textarea`,{key:4,"onUpdate:modelValue":n[13]||=e=>s.value=e,rows:`2`,"aria-label":`Value of ${e.path}`,disabled:e.disabled,onFocus:n[14]||=e=>c.value=!0,onBlur:h},null,40,bv)),[[xs,s.value]]):(P(),F(`span`,xv,`null`))],10,iv)}}}),Cv=[`data-status`],wv=[`title`],Tv=[`title`],Ev=[`href`],Dv=[`title`],Ov=Or({__name:`TunnelStatusBar`,props:{device:{}},setup(e){let t=e,n=V(()=>t.device.status===`online`),r=V(()=>t.device.transport===`tunnel`),i=V(()=>n.value?r.value?`online · via tunnel`:`online · LAN`:r.value?`tunnel`:`LAN`),a=V(()=>t.device.tunnel?.state===`connected`);return(t,o)=>(P(),F(`span`,{class:`tunnel-status`,"data-status":e.device.status},[L(`span`,{class:`axis transport`,title:r.value?`Hub ⇄ device over the tunnel (WSS)`:`Hub → device over LAN`},[r.value?(P(),I(A($s),{key:0,size:13,class:w({live:a.value})},null,8,[`class`])):(P(),I(A(rl),{key:1,size:13,class:w({live:n.value})},null,8,[`class`])),z(` `+E(i.value),1)],8,wv),L(`span`,{class:w([`axis monitor`,e.device.status])},[e.device.status===`offline`?(P(),I(A(nl),{key:0,size:13})):(P(),F(N,{key:1},[z(E(e.device.status),1)],64))],2),r.value&&a.value&&e.device.tunnel?(P(),F(`span`,{key:0,class:`axis muted`,title:`tunnel last seen ${A(Yu)(e.device.tunnel.lastSeenAt)}`},E(e.device.tunnel.readerCount)+` reader`+E(e.device.tunnel.readerCount===1?``:`s`),9,Tv)):B(``,!0),e.device.url?(P(),F(`a`,{key:1,class:`axis url`,href:e.device.url,target:`_blank`,rel:`noreferrer`},E(e.device.url),9,Ev)):B(``,!0),e.device.lastSeenAt?(P(),F(`span`,{key:2,class:`axis muted`,title:`last probe ${A(Yu)(e.device.lastSeenAt)}`},E(A(Yu)(e.device.lastSeenAt)),9,Dv)):B(``,!0)],8,Cv))}});async function kv(e,t,n,r,i){let a=await fetch(`/api${t}`,{method:e,headers:n===void 0?{}:{"content-type":`application/json`},body:n===void 0?void 0:JSON.stringify(n),signal:r,...i?{keepalive:i}:{}}),o=await a.json().catch(()=>void 0);if(!a.ok){let e=o?.error;throw new Fl(e?.code??`internal`,e?.message??`${a.status} ${a.statusText}`,a.status)}return o}function Av(e){return e.offerUrl??e.pairUrl}var jv={pending:e=>kv(`GET`,`/pair/codes`,void 0,e),pairings:e=>kv(`GET`,`/pairings`,void 0,e),createCode:e=>kv(`POST`,`/pair/code`,{},e),resolveCode:(e,t)=>kv(`POST`,`/pair/resolve`,{code:e},t),codeState:(e,t)=>kv(`GET`,`/pair/codes/${encodeURIComponent(e)}`,void 0,t),approve:(e,t,n)=>kv(`POST`,`/pair/codes/${encodeURIComponent(e)}/approve`,t,n),cancel:(e,t,n)=>kv(`POST`,`/pair/codes/${encodeURIComponent(e)}/cancel`,{},t,n),rotate:(e,t)=>kv(`POST`,`/pairings/${encodeURIComponent(e)}/rotate`,{},t),revoke:(e,t=`user`,n)=>kv(`POST`,`/pairings/${encodeURIComponent(e)}/revoke`,{reason:t},n)},Mv=0;function Nv(){let e=++Mv,t=!1;return{gen:e,close:()=>t=!0,closed:()=>t}}var Pv=class extends Error{codeId;constructor(e){super(`pairing poll timed out for ${e}`),this.codeId=e,this.name=`PollTimeout`}},Fv=e=>e===`issued`||e===`cancelled`||e===`expired`;async function Iv(e,t,n={}){let r=n.intervalMs??1e3,i=Date.now()+(n.timeoutMs??33e4);for(;;){if(e.closed())return;if(n.signal?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`);if(Date.now()>i)throw new Pv(t);let a=await jv.codeState(t,n.signal);if(e.closed())return;if(e.state=a,n.onState?.(a),Fv(a.phase))return a;await new Promise(e=>setTimeout(e,r))}}var Lv={key:0,class:`token-manager`,"aria-label":`Credential manager`},Rv={class:`credential-fingerprint`},zv=[`title`],Bv={key:0,class:`rotation-badge`,role:`status`},Vv={class:`token-actions`},Hv=[`disabled`],Uv=[`disabled`],Wv={key:1,class:`message-error`,role:`alert`},Gv=Or({__name:`TokenManager`,props:{device:{}},setup(e){let t=e,n=k(!1),r=k(``),i=V(()=>t.device.pairing);async function a(){if(!n.value){n.value=!0,r.value=``;try{await jv.rotate(t.device.id),G(`Rotation queued — it completes when the device acknowledges the new credential.`)}catch(e){r.value=Zl(e)}finally{n.value=!1}}}async function o(){n.value||(W.dialog={kind:`prompt`,title:`Revoke ${t.device.id}?`,hint:`Every tunnel credential for this device dies at commit and the live tunnel is cut within a second. The device cleans its own files the next time it talks to the hub.`,submit:`Revoke`,danger:!0,run:async()=>{await jv.revoke(t.device.id,`user`),G(`Revoke committed on the hub. The tunnel is cut; the device cleans up on its next contact.`)}})}return(e,t)=>i.value?(P(),F(`section`,Lv,[L(`header`,null,[R(A(Cc),{size:15}),t[0]||=L(`h3`,null,`Credential`,-1),L(`span`,{class:w([`pairing-status`,i.value.status])},E(i.value.status),3)]),L(`dl`,null,[t[1]||=L(`dt`,null,`Key fingerprint`,-1),L(`dd`,null,[L(`code`,Rv,E(i.value.keyFingerprint),1)]),t[2]||=L(`dt`,null,`Paired`,-1),L(`dd`,{title:new Date(i.value.pairedAt).toISOString()},E(A(Yu)(i.value.pairedAt)),9,zv),t[3]||=L(`dt`,null,`Generation`,-1),L(`dd`,null,E(i.value.credentialGeneration),1)]),i.value.rotationPending?(P(),F(`p`,Bv,[R(A(Wc),{size:13,class:`spin`}),t[4]||=z(` rotation queued — waiting for the device to ACK `,-1)])):B(``,!0),L(`div`,Vv,[i.value.status===`paired`?(P(),F(`button`,{key:0,class:`small`,disabled:n.value||i.value.rotationPending,onClick:a},[R(A(Wc),{size:14}),t[5]||=z(` Rotate credential `,-1)],8,Hv)):B(``,!0),i.value.status===`paired`?(P(),F(`button`,{key:1,class:`small danger`,disabled:n.value,onClick:o},[R(A(Yc),{size:14}),t[6]||=z(` Revoke `,-1)],8,Uv)):B(``,!0)]),r.value?(P(),F(`p`,Wv,E(r.value),1)):B(``,!0)])):B(``,!0)}}),Kv={class:`tasks-panel`},qv={class:`panel-heading`},Jv={class:`tag`},Yv={key:0,class:`message-error`,role:`alert`},Xv={class:`task-section`,"aria-label":`Durable jobs`},Zv={key:0,class:`task-empty`},Qv=[`data-job`],$v={class:`job-def-head`},ey={key:0,class:`tag`},ty={class:`tag`},ny=[`aria-label`],ry=[`title`],iy={class:`job-def-meta`},ay=[`title`],oy=[`title`],sy={key:0,class:`job-def-last`},cy=[`onClick`],ly=[`disabled`,`onClick`],uy=[`disabled`,`onClick`],dy=[`disabled`,`onClick`],fy={class:`task-section`,"aria-label":`Agent activity`},py={class:`panel-heading`},my={key:0,class:`task-empty`},hy={key:1,class:`task-tree`},gy=[`data-task-kind`],_y={class:`tag`},vy={key:0,class:`task-phase`},yy=[`onClick`],by=[`disabled`],xy={class:`raw`},Sy=Or({__name:`TasksPanel`,setup(e){let t=k(``),n=k(!1),r=k([]),i=k(),a=e=>({running:`Running`,waiting:`Waiting`,completed:`Completed`,aborted:`Stopped`,declined:`Declined`,failed:`Failed`,pending:`Queued`,completing:`Finishing`,terminal:`Finished`})[e]??e,o=V(()=>new Map(kh.value.map(e=>[e.id,jh.value.find(t=>t.job===e.id)]))),s=V(()=>{let e=Iu.value,t=new Set(e.map(e=>e.id)),n=new Map;for(let r of e){let e=r.owner!==void 0&&t.has(r.owner)?r.owner:void 0;n.set(e,[...n.get(e)??[],r])}let r=[],i=(e,t)=>{for(let a of(n.get(e)??[]).sort((e,t)=>e.id-t.id))r.push({task:a,depth:t}),i(a.id,t+1)};return i(void 0,0),r}),c=e=>e.kind===`pi.tool`?{icon:al,name:e.label??`Tool call`,what:`tool call`}:e.kind===`pi.generation`?{icon:Zs,name:`Model response`,what:`generation`}:e.kind===`pi.compaction`?{icon:Tc,name:`Compaction`,what:`compaction`}:e.kind.startsWith(`demo.job.`)?{icon:il,name:e.label??Ah(e.kind.slice(9))?.title??e.kind,what:`durable job`}:e.kind===`demo.job-approval`?{icon:Jc,name:`Approval`,what:`waits for you`}:{icon:Us,name:e.label??e.kind,what:e.kind},l=e=>e.state.phase?e.kind.startsWith(`demo.job.`)?Ah(e.kind.slice(9))?.phases.find(t=>t.id===e.state.phase)?.label??e.state.phase:e.state.phase:``;async function u(){if(!n.value&&Cu.value){n.value=!0,t.value=``;try{await Cu.value.abort(!0)}catch(e){t.value=Zl(e)}finally{n.value=!1}}}async function d(e){let n=wu.value;if(e.target.open&&n)try{let[e,t]=await Promise.all([n.tasks(`terminal`,40),n.inspect()]);r.value=e,i.value=t}catch(e){t.value=Zl(e)}}let f=V(()=>r.value.filter(e=>e.state.status===`terminal`).slice(-12).reverse());return(e,r)=>(P(),F(`div`,Kv,[L(`div`,qv,[r[0]||=L(`h2`,null,`Tasks`,-1),L(`span`,Jv,E(A(Iu).length)+` active`,1)]),t.value?(P(),F(`p`,Yv,E(t.value),1)):B(``,!0),L(`section`,Xv,[L(`h3`,null,[R(A(Gc),{size:18}),r[1]||=z(`Durable jobs`,-1)]),r[2]||=L(`p`,{class:`hint`},[z(` Repeatable workflows with named phases. Every run follows the same phases and saves a checkpoint after each one. Start one here, or ask your agent: it finds these with `),L(`code`,null,`list_durable_jobs`),z(`, starts them with `),L(`code`,null,`run_durable_job`),z(` and checks them with `),L(`code`,null,`check_durable_job`),z(`. Runs play out live in the chat. `)],-1),A(kh).length?B(``,!0):(P(),F(`p`,Zv,` This device has no durable jobs. Deploy the latest backend to it. `)),(P(!0),F(N,null,M(A(kh),e=>(P(),F(`article`,{key:e.id,class:`job-def`,"data-job":e.id},[L(`div`,$v,[R(A(il),{size:18}),L(`strong`,null,E(e.title),1),e.approval?(P(),F(`span`,ey,`needs approval`)):B(``,!0),L(`span`,ty,`~`+E(e.seconds)+`s`,1)]),L(`p`,null,E(e.summary),1),L(`ol`,{class:`job-chain`,"aria-label":`${e.title} phases`},[(P(!0),F(N,null,M(e.phases,(e,t)=>(P(),F(`li`,{key:e.id,title:e.summary},[L(`span`,null,E(t+1),1),z(E(e.label),1),e.kind===`repeat`?(P(),I(A(Gc),{key:0,size:13})):B(``,!0),e.kind===`approval`?(P(),I(A(Jc),{key:1,size:13})):B(``,!0)],8,ry))),128))],8,ny),L(`div`,iy,[(P(!0),F(N,null,M(e.inputs,e=>(P(),F(`code`,{key:e.name,title:e.description},E(e.name)+`=`+E(e.default),9,ay))),128)),L(`code`,{title:`Each run saves its result to App State ${e.resultPath}`},`→ `+E(e.resultPath),9,oy)]),o.value.get(e.id)?(P(),F(`div`,sy,[L(`span`,null,[z(`Run #`+E(o.value.get(e.id).run)+`: `,1),L(`strong`,null,E(a(o.value.get(e.id).status)),1),A(Oh)(o.value.get(e.id))?B(``,!0):(P(),F(N,{key:0},[z(` in `+E(o.value.get(e.id).phases.find(t=>t.id===o.value.get(e.id).phase)?.label),1)],64))]),L(`button`,{class:`text-button`,onClick:t=>A(Rh)(o.value.get(e.id).id)},` Show in chat `,8,cy),o.value.get(e.id).approval===`pending`?(P(),F(N,{key:0},[L(`button`,{class:`primary small`,disabled:!!A(Ih),onClick:t=>A(Bh)(o.value.get(e.id),!0)},` Approve `,8,ly),L(`button`,{class:`secondary`,disabled:!!A(Ih),onClick:t=>A(Bh)(o.value.get(e.id),!1)},` Decline `,8,uy)],64)):B(``,!0)])):B(``,!0),L(`button`,{class:`secondary job-def-run`,disabled:!!A(Ih)||!A(Cu),onClick:t=>A(zh)(e)},[R(A(Vc),{size:16}),z(`Run `+E(e.title),1)],8,dy)],8,Qv))),128))]),L(`section`,fy,[L(`div`,py,[r[3]||=L(`h3`,null,`Agent activity`,-1),R(A(Us),{size:18})]),r[5]||=L(`p`,{class:`hint`},` Every model response and every tool call is its own durable task with an id, an owner and a checkpoint. Follow them live here; after a restart each one resumes or reports how it ended. `,-1),s.value.length?(P(),F(`ul`,hy,[(P(!0),F(N,null,M(s.value,({task:e,depth:t})=>(P(),F(`li`,{key:e.id,class:`task-row`,style:ve({"--depth":t}),"data-task-kind":e.kind},[(P(),I(ti(c(e).icon),{size:16})),L(`strong`,null,E(c(e).name),1),L(`span`,_y,E(a(e.state.status)),1),l(e)?(P(),F(`span`,vy,E(l(e)),1)):B(``,!0),L(`small`,null,`#`+E(e.id)+` `+E(c(e).what)+`, agent #`+E(e.conversationId)+E(e.effectiveBackground?`, background`:``),1),(P(!0),F(N,null,M(e.conversations,e=>(P(),F(`button`,{key:e,class:`text-button`,onClick:t=>A(Hh)(e)},` Open agent #`+E(e),9,yy))),128))],12,gy))),128))])):(P(),F(`p`,my,`Nothing running. Send a message or run a job.`)),r[6]||=L(`p`,{class:`hint`},` Interrupt or Esc stops foreground work and what it owns. Stop all also stops background runs. `,-1),L(`button`,{class:`secondary danger`,disabled:!A(Iu).length||n.value,onClick:u},[R(A(Pc),{size:18}),r[4]||=z(`Stop all `,-1)],8,by)]),L(`details`,{class:`raw task-section`,onToggle:d},[L(`summary`,null,[R(A(ac),{size:18}),r[7]||=z(`Runtime details`,-1)]),r[9]||=L(`p`,{class:`hint`},` Recent task results and recovery records, read from the device when opened. `,-1),(P(!0),F(N,null,M(f.value,e=>(P(),F(`details`,{key:e.id,class:`raw`},[L(`summary`,null,[z(E(e.kind)+` #`+E(e.id),1),L(`span`,null,E(a(e.state.outcome?.status??e.state.status)),1)]),L(`pre`,null,E(JSON.stringify(e.state.outcome,null,2)),1)]))),128)),L(`details`,xy,[r[8]||=L(`summary`,null,`Recovery inspection`,-1),L(`pre`,null,E(JSON.stringify(i.value,null,2)),1)])],32)]))}}),Cy={class:`git-pane`},wy={key:0,class:`hint`},Ty={key:0,class:`hint`},Ey={key:1,class:`muted-line`},Dy={key:2,class:`message-error`},Oy={key:0,class:`hint`},ky={key:0,class:`message-error merge-banner`},Ay=[`disabled`],jy={class:`panel-heading git-top`},My={class:`branch-wrap`},Ny=[`disabled`],Py={key:0,class:`menu`},Fy=[`onClick`],Iy={class:`muted-line`},Ly={class:`new-branch`},Ry=[`disabled`],zy={class:`auto-stash`},By={class:`tag`},Vy={key:0,class:`tag`},Hy={key:1,class:`tag`},Uy={key:2,class:`tag`,title:`vs the picked base`},Wy={class:`tag`},Gy=[`href`],Ky=[`disabled`],qy={class:`row ops`},Jy=[`disabled`],Yy=[`disabled`],Xy=[`disabled`],Zy=[`disabled`],Qy=[`disabled`],$y={key:1,class:`message-error hintbox`},eb=[`disabled`],tb=[`disabled`],nb={key:2,class:`message-error hintbox`},rb=[`disabled`],ib={class:`task-section`,"aria-label":`Commit`},ab={class:`panel-heading`},ob={class:`tag`},sb=[`disabled`],cb={key:0,class:`hintbox warn`},lb={key:1,class:`muted-line cap`},ub={key:2,class:`files`},db={class:`file all`},fb=[`checked`],pb={class:`muted-line`},mb=[`onClick`],hb={class:`muted-line`},gb={class:`file-label`},_b=[`checked`,`onChange`],vb=[`title`],yb=[`title`],bb={class:`file-acts`},xb=[`onClick`],Sb=[`onClick`],Cb=[`onClick`],wb={key:3,class:`files`},Tb={class:`file all`},Eb=[`checked`],Db={class:`muted-line`},Ob=[`onClick`],kb={class:`muted-line`},Ab={class:`file-label`},jb=[`checked`,`onChange`],Mb=[`title`],Nb=[`title`],Pb={class:`file-acts`},Fb=[`onClick`],Ib=[`onClick`],Lb=[`onClick`],Rb=[`onClick`],zb=[`onClick`],Bb={key:4,class:`file-diff`},Vb={class:`mode-chips`},Hb={key:0,class:`nums bin`},Ub={key:1,class:`nums`},Wb={key:2},Gb={class:`row`},Kb=[`disabled`],qb=[`disabled`],Jb=[`disabled`],Yb={class:`task-section`,"aria-label":`Log`},Xb={class:`panel-heading`},Zb=[`disabled`],Qb=[`disabled`],$b=[`disabled`],ex={key:0,class:`cps`},tx={key:0,class:`hint`},nx={class:`muted-line`},rx={class:`cp-subj`},ix=[`disabled`,`onClick`],ax={key:1,class:`hint`},ox={key:2,class:`commits`},sx=[`title`],cx=[`width`],lx=[`x1`,`x2`],ux=[`x1`,`x2`,`stroke`],dx=[`cx`,`fill`],fx=[`onClick`],px={class:`hash`},mx=[`href`],hx={key:1,class:`refs`},gx={class:`subject`},_x={class:`muted-line who`},vx={key:0,class:`commit-files`},yx=[`data-s`],bx={class:`path`},xx={key:0,class:`hint`},Sx={key:3,class:`message-error`},Cx={key:4,class:`hint`},wx={class:`task-section`,"aria-label":`Worktrees`},Tx={class:`panel-heading`},Ex={class:`branch-wrap`},Dx=[`disabled`],Ox={key:0,class:`menu`},kx=[`onClick`],Ax={class:`new-branch`},jx=[`disabled`],Mx=[`title`],Nx={class:`muted-line`},Px=[`disabled`,`onClick`],Fx=[`disabled`,`onClick`],Ix=[`disabled`,`onClick`],Lx={key:3,class:`op-out`},Rx=Zg(Or({__name:`GitPanel`,props:{deviceId:{},cwd:{}},setup(e){let t=e,n=V(()=>t.cwd??xu.value?.cwd??``),r=V(()=>t.deviceId??hu.value),i=V(()=>Dd(r.value||`?`,n.value||`?`)),a=V(()=>i.value.status),o=V(()=>i.value.loading),s=V(()=>i.value.refreshing),c=V(()=>i.value.error),l=V(()=>{let e=xu.value;return e&&e.cwd===n.value&&!t.deviceId?e.id:void 0}),u=k(``),d=k(``),f=k(``),p=k(new Set),m=k(!1),h=k(!1),g=k(``),_=k(null),v=k(`working`),y=V(()=>`dpi-git-draft:${r.value}:${n.value}`),b=k(null),ee=k(!0),x=k(``),S=k(!1),te=k([]),ne=V(()=>{if(!te.value.length||!n.value)return null;let e=e=>e.startsWith(`/`)||e.includes(`:\\`)?e:`${n.value}/${e}`,t=new Set(te.value);return{changed:(a.value?.files??[]).filter(n=>t.has(e(n.path))).length,total:te.value.length}}),re=k([]),ie=k(!1),ae=k(new Map),oe=k(new Set),se=()=>{typeof localStorage<`u`&&(f.value=localStorage.getItem(y.value)??``)};kd(r.value||`?`,n.value||`?`),se(),Jr(()=>kd(r.value||`?`,n.value||`?`)),j(f,e=>{typeof localStorage<`u`&&(e?localStorage.setItem(y.value,e):localStorage.removeItem(y.value))}),j([r,n],()=>{m.value=!1,h.value=!1,_.value=null,b.value=null,x.value=``,S.value=!1,te.value=[],ae.value=new Map,oe.value=new Set,kd(r.value||`?`,n.value||`?`),se()});let ce=()=>(p.value=new Set,_.value=null,kd(r.value||`?`,n.value||`?`,{force:!0})),le=V(()=>a.value?.files??[]);j(le,e=>{let t=new Set;for(let n of e)n.x!==`?`&&n.y!==`?`&&t.add(n.path);p.value=t});let ue=V(()=>le.value.some(e=>p.value.has(e.path))),de=V(()=>le.value.filter(e=>e.x!==` `&&e.x!==`?`)),C=V(()=>le.value.filter(e=>e.x===` `||e.x===`?`)),fe=V(()=>le.value.filter(e=>/U|A|D/.test(e.x)&&/U|A|D/.test(e.y))),pe=V(()=>le.value.length>=500),me=V(()=>(a.value?.staged??0)+(a.value?.unstaged??0)+(a.value?.untracked??0)>0),he=V(()=>!a.value?.identity?.name||!a.value?.identity?.email),ge=V(()=>{let e=a.value?.remoteUrl??``,t=e.match(/git@([^:]+):(.+?)(?:\.git)?$/)??e.match(/^https?:\/\/([^/]+)\/(.+?)(?:\.git)?$/);return t?`https://${t[1]}/${t[2]}`:``}),_e=e=>{let t=new Set(p.value);t.has(e)?t.delete(e):t.add(e),p.value=t},ve=e=>{let t=e.every(e=>p.value.has(e.path)),n=new Set(p.value);for(let r of e)t?n.delete(r.path):n.add(r.path);p.value=n},ye=e=>{let t=e.lastIndexOf(`/`);return t===-1?`.`:e.slice(0,t)},be=e=>{let t=new Map;for(let n of e){let e=ye(n.path);t.has(e)||t.set(e,[]),t.get(e).push(n)}return[...t.entries()].map(([e,t])=>({dir:e,files:t,open:!oe.value.has(e)}))},xe=e=>{let t=new Set(oe.value);t.has(e)?t.delete(e):t.add(e),oe.value=t},Se=e=>e.a===void 0&&e.d===void 0?``:e.a===-1||e.d===-1?`bin`:`+${e.a??0} −${e.d??0}`,Ce=e=>{navigator.clipboard?.writeText(e).then(()=>G(`copied ${e}`))};async function we(e,t={}){if(r.value&&n.value){u.value=e,d.value=``;try{let i=await Jl(r.value).gitOp(n.value,e,t);d.value=i.text||`(empty)`,e===`push`&&(x.value=``),e===`pull`&&(S.value=!1),[`fetch`,`pull`,`push`,`stash-push`,`stash-pop`].includes(e)&&G(`git ${e} ✓`),await ce(),Je(!0)}catch(t){let n=t.message;e===`push`&&(/no upstream|has no upstream|upstream is gone/i.test(n)?x.value=`no upstream — set it while pushing?`:/fetch first|non-fast-forward|rejected.*fetch|behind/i.test(n)?x.value=`the remote has work you lack — pull first`:/authentication|permission|could not read|403|denied/i.test(n)?x.value=`credentials rejected on the device — check its git login`:x.value=``),e===`pull`&&/not possible to fast-forward|divergent|unrelated histories/i.test(n)&&(S.value=!0),G(`git ${e}: ${n.slice(0,160)}`)}finally{u.value=``}}}async function T(e,t){if(!r.value||!n.value||!t&&e!==`stage`||e===`discard`&&t&&!confirm(`Roll back ${t} to HEAD? Uncommitted changes are lost.`))return;u.value=e;let i=t?[t]:le.value.filter(e=>e.x===` `||e.x===`M`).map(e=>e.path);try{G((await Jl(r.value).gitOp(n.value,e,{files:i})).text),await ce()}catch(t){G(`${e} failed: ${t.message.slice(0,140)}`)}finally{u.value=``}}async function Te(e){if(r.value&&n.value&&e.length){u.value=`unstage`;try{G((await Jl(r.value).gitOp(n.value,`unstage`,{files:e})).text),await ce()}catch(e){G(`unstage failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}}async function Ee(e){if(r.value&&n.value&&e.length){u.value=`ignore`;try{G((await Jl(r.value).gitOp(n.value,`ignore`,{lines:e})).text),await ce()}catch(e){G(`ignore failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}}async function De(e){if(r.value&&n.value){if(_.value?.path===e)return _.value=null;u.value=`diff`;try{let t=await Jl(r.value).gitOp(n.value,`diff-file`,{target:e,staged:v.value===`staged`});_.value={path:e,text:t.text}}catch(e){G(`diff failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}}let Oe=async()=>{let e=_.value?.path;_.value=null,e&&await De(e)},ke=V(()=>/Binary files .* differ/i.test(_.value?.text??``));async function Ae(){if(r.value&&n.value){u.value=`abort`;try{G((await Jl(r.value).gitOp(n.value,`merge-abort`)).text),await ce()}catch(e){G(`abort failed: ${e.message.slice(0,120)}`)}finally{u.value=``}}}async function je(e){if(m.value=!1,r.value&&n.value){u.value=`compare`;try{let t=await Jl(r.value).gitOp(n.value,`compare`,{ref:e});b.value={ref:e,ahead:t.ahead??0,behind:t.behind??0}}catch(e){G(`compare failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}}async function Me(e,t=!1){if(m.value=!1,!r.value||!n.value||e===a.value?.branch&&!t)return;u.value=`switch`;let i=Jl(r.value),o=!1;try{if(ee.value&&!t&&me.value&&(await i.gitOp(n.value,`stash-push`,{message:`dpi auto-stash before ${e}`}),o=!0),G((await i.gitOp(n.value,`switch`,{ref:e,create:t})).text||`switched to ${e}`),o)try{let e=await i.gitOp(n.value,`stash-pop`);/conflict/i.test(e.text)&&G(`stash popped WITH CONFLICTS — resolve in the file list`)}catch{G(`switched, but the stash did not pop — resolve manually (git stash list)`)}await ce(),Je(!0)}catch(e){if(G(`switch failed: ${e.message.slice(0,140)}`),o)try{await i.gitOp(n.value,`stash-pop`)}catch{}}finally{u.value=``}}async function Ne(e=!1){if(!r.value||!n.value||!f.value.trim())return;u.value=`commit`;let t=le.value.filter(e=>p.value.has(e.path)).map(e=>e.path);if(!t.length)return G(`check the files to commit — nothing is selected`);let i=Jl(r.value);try{if(G((await i.gitOp(n.value,`commit`,{message:f.value.trim(),files:t})).text),f.value=``,e)try{G(`pushed: ${(await i.gitOp(n.value,`push`)).text.slice(0,80)}`)}catch(e){G(`committed, but push failed: ${e.message.slice(0,120)}`)}await ce(),Je(!0)}catch(e){G(`commit failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}function Pe(e){let t=e?.models??[];return t.find(t=>`${t.provider}/${t.id}`===e?.defaultModel)??t[0]}async function Fe(){if(!r.value||!n.value)return;let e=le.value.filter(e=>p.value.has(e.path)).map(e=>e.path);if(!e.length)return G(`check files first — the model summarises THOSE`);u.value=`ai`;let t=Jl(r.value),i=``;try{let a=lu.devices.value.find(e=>e.id===r.value)?.info,o=Pe(a);if(!o)return G(`no model on the device`);let s=``;for(let r of e.slice(0,5)){let e=await t.gitOp(n.value,`diff-file`,{target:r});if(s+=`${e.text}\n`,s.length>4e3)break}s=s.slice(0,4e3),i=(await t.createSession({name:`git-msg`,cwd:n.value,model:{provider:o.provider,modelId:o.id}})).id;let c=await t.agent(i,1).send(`Write ONE concise git commit message (under 72 chars, imperative, no quotes, no backticks) for these changes:\n\n${s}`,`followUp`,void 0,12e4),l=c.status===`done`?c.answer.text.trim().split(`
|
|
76
|
+
`)[0]?.slice(0,100):``;l?f.value=l:G(`the model returned nothing usable`)}catch(e){G(`ai message failed: ${e.message.slice(0,120)}`)}finally{u.value=``,i&&t.session(i).archive().catch(()=>{})}}async function Ie(){if(r.value&&l.value){u.value=`session-files`;try{let e=await Jl(r.value).sessionGitFiles(l.value);te.value=e.files;let t=e=>e.startsWith(`/`)||e.includes(`:\\`)?e:`${n.value}/${e}`,i=new Set(e.files.map(t)),a=le.value.filter(e=>i.has(t(e.path)));p.value=new Set(a.map(e=>e.path)),G(a.length?`${a.length} session file(s) still changed — checked`:`the session touched nothing that is still changed`)}catch(e){G(`session files failed: ${e.message.slice(0,120)}`)}finally{u.value=``}}}async function D(e){if(ae.value.has(e)){ae.value.delete(e),ae.value=new Map(ae.value);return}if(r.value&&n.value)try{let t=await Jl(r.value).gitOp(n.value,`show-files`,{target:e});ae.value=new Map(ae.value).set(e,t.changed??[])}catch(e){G(`commit files failed: ${e.message.slice(0,120)}`)}}async function Le(){if(!r.value||!n.value)return;let e=`cp-${new Date().toISOString().slice(0,16).replace(/[-:T]/g,``)}`;u.value=`checkpoint`;try{G((await Jl(r.value).gitOp(n.value,`checkpoint`,{name:e})).text),ie.value=!0,await Re()}catch(e){G(`checkpoint failed: ${e.message.slice(0,120)}`)}finally{u.value=``}}async function Re(){if(r.value&&n.value)try{let e=await Jl(r.value).gitOp(n.value,`checkpoints`);re.value=e.checkpoints??[]}catch{re.value=[]}}async function ze(e){if(r.value&&n.value&&confirm(`Rewind this worktree to checkpoint "${e}"? reset --hard — ALL uncommitted changes here are LOST.`)){u.value=`rewind`;try{G((await Jl(r.value).gitOp(n.value,`rewind`,{name:e})).text),await ce(),Je(!0)}catch(e){G(`rewind failed: ${e.message.slice(0,120)}`)}finally{u.value=``}}}j(ie,e=>{e&&Re()});async function Be(e){if(h.value=!1,!r.value||!n.value||!a.value?.root)return;let t=a.value.root,i=`${t.slice(0,t.lastIndexOf(`/`))}/${t.slice(t.lastIndexOf(`/`)+1)}-${e.replace(/[/\\]+/g,`-`)}`;u.value=`wt`;try{G((await Jl(r.value).gitOp(n.value,`worktree-add`,{branch:e,target:i})).text.split(`
|
|
77
|
+
`)[0]??`worktree ${i}`),g.value=``,await ce()}catch(e){G(`worktree failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}async function Ve(e,t){if(r.value){u.value=`session`;try{let n=lu.devices.value.find(e=>e.id===r.value)?.info,i=Pe(n);if(!i)return G(`no model available on ${r.value} — cannot create a session`);let a=await Jl(r.value).createSession({name:t??e.slice(e.lastIndexOf(`/`)+1),cwd:e,model:{provider:i.provider,modelId:i.id}});Tu({deviceId:r.value,sessionId:a.id,agentId:1}),G(`session "${a.name}" on ${e}`)}catch(e){G(`session failed: ${e.message.slice(0,160)}`)}finally{u.value=``}}}async function He(e){if(r.value){u.value=`go`;try{let t=(await Jl(r.value).sessions()).find(t=>t.cwd===e);t?(Tu({deviceId:r.value,sessionId:t.id,agentId:1}),G(`switched to session "${t.name}"`)):await Ve(e,null)}catch(e){G(`switch failed: ${e.message.slice(0,120)}`)}finally{u.value=``}}}async function Ue(e){if(!r.value||!n.value)return;u.value=`wt`;let t=`Uncommitted changes in it will be LOST.`;try{let n=(await Jl(r.value).gitStatusBatch([e],{timeoutMs:6e4}))[e];t=(n?.staged??0)+(n?.unstaged??0)+(n?.untracked??0)>0?`It CONTAINS uncommitted changes — they will be LOST.`:`Its checkout is clean.`}catch{}if(confirm(`Remove worktree ${e}? ${t}`))try{await Jl(r.value).gitOp(n.value,`worktree-remove`,{target:e}),await ce()}catch(e){G(`remove failed: ${e.message.slice(0,140)}`)}finally{u.value=``}}let We=k([]),Ge=k(!1),Ke=k(``),qe=0;async function Je(e=!1){if(r.value&&n.value&&!(!e&&We.value.length&&Date.now()-qe<12e4)){Ge.value=!0;try{let e=await Jl(r.value).gitOp(n.value,`log-list`);We.value=e.commits??[],Ke.value=``,qe=Date.now()}catch(e){Ke.value=e.message.slice(0,120)}finally{Ge.value=!1}}}Je(),j([r,n],()=>{We.value=[],qe=0,Je()});let Ye=V(()=>(a.value?.worktrees??[]).filter(e=>e.path)),Xe=[`#4f8cc9`,`#b8860b`,`#7aa25c`,`#a061ba`,`#c96f6f`,`#5fa8a0`],Ze=V(()=>{let e=new Map,t=[],n=[];for(let r of We.value){let i=e.get(r.hash);i===void 0&&(i=n.indexOf(null),i===-1&&(n.push(null),i=n.length-1),e.set(r.hash,i)),n[i]=null;let a=[];r.parents.forEach((t,r)=>{let o=e.get(t);(o===void 0||n[o]===t)&&(o=n.indexOf(null),o===-1&&(n.push(null),o=n.length-1),e.set(t,o)),n[o]=t,r===0&&(n[i]=t),a.push(o)}),t.push({lane:i,parents:a,width:Math.max(1,n.length)})}return t}),Qe=e=>e*12+7;return(e,t)=>(P(),F(`div`,Cy,[n.value?(P(),F(N,{key:1},[o.value?(P(),F(`p`,Ty,`loading git…`)):s.value?(P(),F(`p`,Ey,`refreshing…`)):B(``,!0),c.value?(P(),F(`p`,Dy,[z(E(c.value)+` `,1),L(`button`,{onClick:t[0]||=e=>ce()},`retry`)])):B(``,!0),a.value?(P(),F(`div`,{key:3,class:w({stale:!!c.value||!!s.value})},[a.value.repo?(P(),F(N,{key:1},[a.value.merge?(P(),F(`p`,ky,[z(` merge in progress — `+E(a.value.conflicts??fe.value.length)+` unmerged path(s). Resolve them in the lists above, or `,1),L(`button`,{class:`small`,disabled:!!u.value,onClick:t[1]||=e=>Ae()},`abort merge`,8,Ay)])):B(``,!0),L(`div`,jy,[L(`div`,My,[L(`button`,{class:`branch-btn`,disabled:!!u.value,onClick:t[2]||=e=>m.value=!m.value},[R(A(gc),{size:16}),L(`strong`,null,E(a.value.branch??`detached`),1),R(A(tc),{size:14})],8,Ny),m.value?(P(),F(`div`,Py,[(P(!0),F(N,null,M(a.value.branches??[],e=>(P(),F(`button`,{key:e.name,class:w({cur:e.current}),onClick:t=>Me(e.name)},[R(A(gc),{size:13}),L(`span`,null,E(e.name),1),L(`span`,Iy,E(e.current?`current`:e.upstream?`→ ${e.upstream}`:``),1),t[37]||=L(`span`,{class:`grow`},null,-1),e.current?B(``,!0):(P(),I(A(_c),{key:0,size:13,title:`compare with this base`,onClick:js(t=>je(e.name),[`stop`])},null,8,[`onClick`]))],10,Fy))),128)),L(`div`,Ly,[Un(L(`input`,{"onUpdate:modelValue":t[3]||=e=>g.value=e,placeholder:`new branch…`,onKeyup:t[4]||=Ns(e=>g.value.trim()&&Me(g.value.trim(),!0),[`enter`])},null,544),[[xs,g.value]]),L(`button`,{disabled:!g.value.trim(),onClick:t[5]||=e=>Me(g.value.trim(),!0)},[R(A(Hc),{size:13})],8,Ry)]),L(`label`,zy,[Un(L(`input`,{type:`checkbox`,"onUpdate:modelValue":t[6]||=e=>ee.value=e},null,512),[[Ss,ee.value]]),t[38]||=z(` auto-stash on switch`,-1)])])):B(``,!0)]),L(`span`,By,E(a.value.upstream??`no upstream`),1),a.value.ahead?(P(),F(`span`,Vy,`↑`+E(a.value.ahead),1)):B(``,!0),a.value.behind?(P(),F(`span`,Hy,`↓`+E(a.value.behind),1)):B(``,!0),b.value?(P(),F(`span`,Uy,[z(` vs `+E(b.value.ref)+`: ↑`+E(b.value.ahead)+` ↓`+E(b.value.behind)+` `,1),L(`button`,{class:`tag-x`,onClick:t[7]||=e=>b.value=null},[R(A(ol),{size:11})])])):B(``,!0),L(`span`,Wy,`+`+E(a.value.staged??0)+` ~`+E(a.value.unstaged??0)+` ?`+E(a.value.untracked??0),1),ge.value?(P(),F(`a`,{key:3,class:`icon-button`,href:`${ge.value}/tree/${a.value.branch??``}`,target:`_blank`,rel:`noopener`,title:`open on the remote`},[R(A(qs),{size:15,style:{transform:`rotate(45deg)`}})],8,Gy)):B(``,!0),L(`button`,{class:`icon-button`,disabled:!!u.value||o.value||s.value,title:`refresh`,onClick:t[8]||=e=>ce()},[R(A(Wc),{size:16})],8,Ky)]),L(`div`,qy,[L(`button`,{class:`small`,disabled:!!u.value,onClick:t[9]||=e=>we(`fetch`)},[R(A(Gs),{size:14}),t[39]||=z(`fetch`,-1)],8,Jy),L(`button`,{class:`small`,disabled:!!u.value,onClick:t[10]||=e=>we(`pull`)},[R(A(Gs),{size:14}),t[40]||=z(`pull`,-1)],8,Yy),L(`button`,{class:`small primary`,disabled:!!u.value,title:`push`,onClick:t[11]||=e=>we(`push`)},[R(A(qs),{size:14}),t[41]||=z(`push`,-1)],8,Xy),L(`button`,{class:`small`,disabled:!!u.value,title:`stash changes`,onClick:t[12]||=e=>we(`stash-push`,{message:f.value.trim()||void 0})},[R(A(Zc),{size:14}),t[42]||=z(`stash`,-1)],8,Zy),L(`button`,{class:`small`,disabled:!!u.value,title:`pop the newest stash`,onClick:t[13]||=e=>we(`stash-pop`)},[R(A(Fc),{size:14}),t[43]||=z(`unstash`,-1)],8,Qy)]),x.value?(P(),F(`p`,$y,[z(E(x.value)+` `,1),x.value.includes(`upstream`)?(P(),F(`button`,{key:0,class:`small primary`,disabled:!!u.value,onClick:t[14]||=e=>we(`push`,{setUpstream:!0,ref:a.value.branch})},`push -u origin `+E(a.value.branch),9,eb)):x.value.includes(`remote has work`)?(P(),F(`button`,{key:1,class:`small primary`,disabled:!!u.value,onClick:t[15]||=e=>we(`pull`)},`pull now`,8,tb)):B(``,!0)])):B(``,!0),S.value?(P(),F(`p`,nb,[t[44]||=z(` fast-forward is not possible — branches diverged. `,-1),L(`button`,{class:`small primary`,disabled:!!u.value,onClick:t[16]||=e=>we(`pull`,{rebase:!0})},`pull --rebase`,8,rb)])):B(``,!0),L(`section`,ib,[L(`div`,ab,[t[45]||=L(`h4`,null,`Commit`,-1),L(`span`,ob,E(le.value.length?`${p.value.size}/${le.value.length} files`:`no changes`),1),t[46]||=L(`span`,{class:`grow`},null,-1),l.value?(P(),F(`button`,{key:0,class:`small`,disabled:!!u.value,title:`check the files this session's agent touched`,onClick:Ie},[R(A(pc),{size:13}),z(` session files`+E(ne.value?` (${ne.value.changed}/${ne.value.total})`:``),1)],8,sb)):B(``,!0)]),he.value?(P(),F(`p`,cb,[...t[47]||=[z(`git user.name/user.email is not set on the device — `,-1),L(`code`,null,`dpi device config`,-1),z(` or `,-1),L(`code`,null,`git config --global`,-1),z(` before committing.`,-1)]])):B(``,!0),pe.value?(P(),F(`p`,lb,`showing the first 500 changed files — commit in smaller batches`)):B(``,!0),de.value.length?(P(),F(`div`,ub,[L(`label`,db,[L(`input`,{type:`checkbox`,checked:de.value.every(e=>p.value.has(e.path)),onChange:t[17]||=e=>ve(de.value)},null,40,fb),L(`span`,pb,`Staged · `+E(de.value.length),1),t[50]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`icon-button`,title:`stage every changed file`,onClick:t[18]||=e=>T(`stage`)},[R(A(Hc),{size:13}),t[48]||=z(` all`,-1)]),L(`button`,{class:`icon-button`,title:`unstage all (git reset HEAD)`,onClick:t[19]||=e=>Te(de.value.map(e=>e.path))},[R(A(jc),{size:13}),t[49]||=z(` none`,-1)])]),(P(!0),F(N,null,M(be(de.value),e=>(P(),F(N,{key:e.dir},[e.dir===`.`?B(``,!0):(P(),F(`button`,{key:0,class:`dir-row`,onClick:t=>xe(e.dir)},[R(A(nc),{size:12,class:w({open:e.open})},null,8,[`class`]),z(E(e.dir),1),L(`span`,hb,`· `+E(e.files.length),1)],8,mb)),(P(!0),F(N,null,M(e.files,t=>Un((P(),F(`div`,{key:t.path,class:`file`},[L(`label`,gb,[L(`input`,{type:`checkbox`,checked:p.value.has(t.path),onChange:e=>_e(t.path)},null,40,_b),L(`code`,{class:`xy`,title:`index ${t.x} · worktree ${t.y}`},E(t.x)+E(t.y),9,vb),L(`span`,{class:`path`,title:t.path},E(t.path),9,yb),Se(t)?(P(),F(`span`,{key:0,class:w([`nums`,{bin:Se(t)===`bin`}])},E(Se(t)),3)):B(``,!0)]),L(`span`,bb,[L(`button`,{class:`icon-button`,title:`view diff`,onClick:e=>De(t.path)},[R(A(fc),{size:13})],8,xb),L(`button`,{class:`icon-button`,title:`unstage (git reset HEAD)`,onClick:e=>Te([t.path])},[R(A(jc),{size:13})],8,Sb),L(`button`,{class:`icon-button`,title:`roll back to HEAD`,onClick:e=>T(`discard`,t.path)},[R(A(lc),{size:13})],8,Cb)])])),[[Bo,e.open]])),128))],64))),128))])):B(``,!0),C.value.length?(P(),F(`div`,wb,[L(`label`,Tb,[L(`input`,{type:`checkbox`,checked:C.value.every(e=>p.value.has(e.path)),onChange:t[20]||=e=>ve(C.value)},null,40,Eb),L(`span`,Db,`Unstaged · `+E(C.value.length),1)]),(P(!0),F(N,null,M(be(C.value),e=>(P(),F(N,{key:e.dir},[e.dir===`.`?B(``,!0):(P(),F(`button`,{key:0,class:`dir-row`,onClick:t=>xe(e.dir)},[R(A(nc),{size:12,class:w({open:e.open})},null,8,[`class`]),z(E(e.dir),1),L(`span`,kb,`· `+E(e.files.length),1)],8,Ob)),(P(!0),F(N,null,M(e.files,t=>Un((P(),F(`div`,{key:t.path,class:`file`},[L(`label`,Ab,[L(`input`,{type:`checkbox`,checked:p.value.has(t.path),onChange:e=>_e(t.path)},null,40,jb),L(`code`,{class:`xy`,title:`index ${t.x} · worktree ${t.y}`},E(t.x)+E(t.y),9,Mb),L(`span`,{class:`path`,title:t.path},E(t.path),9,Nb),Se(t)?(P(),F(`span`,{key:0,class:w([`nums`,{bin:Se(t)===`bin`}])},E(Se(t)),3)):B(``,!0)]),L(`span`,Pb,[L(`button`,{class:`icon-button`,title:`view diff`,onClick:e=>De(t.path)},[R(A(fc),{size:13})],8,Fb),t.x===`?`?(P(),F(`button`,{key:0,class:`icon-button`,title:`add to .gitignore`,onClick:e=>Ee([t.path])},[R(A(Xs),{size:13})],8,Ib)):(P(),F(`button`,{key:1,class:`icon-button`,title:`stage (git add)`,onClick:e=>T(`stage`,t.path)},[R(A(Hc),{size:13})],8,Lb)),t.x===`?`?B(``,!0):(P(),F(`button`,{key:2,class:`icon-button`,title:`roll back to HEAD`,onClick:e=>T(`discard`,t.path)},[R(A(lc),{size:13})],8,Rb)),L(`button`,{class:`icon-button`,title:`copy path`,onClick:e=>Ce(t.path)},[R(A(oc),{size:13})],8,zb)])])),[[Bo,e.open]])),128))],64))),128))])):B(``,!0),_.value?(P(),F(`p`,Bb,[L(`strong`,null,E(_.value.path),1),L(`span`,Vb,[L(`button`,{class:w({on:v.value===`working`}),onClick:t[21]||=e=>{v.value=`working`,Oe()}},`working`,2),L(`button`,{class:w({on:v.value===`staged`}),onClick:t[22]||=e=>{v.value=`staged`,Oe()}},`staged`,2)]),ke.value?(P(),F(`span`,Hb,`binary file`)):_.value.text.length>8e3?(P(),F(`span`,Ub,`truncated at 8000 chars`)):B(``,!0),L(`button`,{class:`icon-button`,title:`close diff`,onClick:t[23]||=e=>_.value=null},[R(A(ol),{size:13})]),ke.value?B(``,!0):(P(),F(`pre`,Wb,E(_.value.text.slice(0,8e3)),1))])):B(``,!0),Un(L(`textarea`,{"onUpdate:modelValue":t[24]||=e=>f.value=e,rows:`4`,placeholder:`Commit message… (Ctrl+Enter to commit)`,onKeydown:[t[25]||=Ns(js(e=>Ne(),[`exact`,`prevent`]),[`enter`]),t[26]||=Ns(js(e=>Ne(),[`meta`,`prevent`]),[`enter`]),t[27]||=Ns(js(e=>Ne(),[`ctrl`,`prevent`]),[`enter`])]},null,544),[[xs,f.value]]),L(`div`,Gb,[L(`button`,{class:`small`,disabled:!!u.value||!p.value.size,title:`ask the device's model for a message`,onClick:Fe},[R(A(Xc),{size:14}),t[51]||=z(` ai message`,-1)],8,Kb),t[53]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`primary small`,disabled:!!u.value||!f.value.trim()||!ue.value,onClick:t[28]||=e=>Ne(!1)},[R(A(ec),{size:14}),z(` Commit`+E(p.value.size?` ${p.value.size} file${p.value.size>1?`s`:``}`:``),1)],8,qb),a.value.upstream?(P(),F(`button`,{key:0,class:`primary small`,disabled:!!u.value||!f.value.trim()||!ue.value,title:`commit, then push`,onClick:t[29]||=e=>Ne(!0)},[R(A(ec),{size:14}),t[52]||=z(` Commit & push `,-1)],8,Jb)):B(``,!0)])]),L(`section`,Yb,[L(`div`,Xb,[L(`h4`,null,[R(A(bc),{size:16}),t[54]||=z(` Log`,-1)]),t[56]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`small`,disabled:!!u.value,title:`save a checkpoint ref of HEAD`,onClick:Le},[R(A(pc),{size:13}),t[55]||=z(` checkpoint`,-1)],8,Zb),L(`button`,{class:`small`,disabled:!!u.value,onClick:t[30]||=e=>ie.value=!ie.value},`checkpoints `+E(re.value.length?`(${re.value.length})`:``),9,Qb),L(`button`,{class:`icon-button`,disabled:Ge.value,title:`refresh log`,onClick:t[31]||=e=>Je(!0)},[R(A(Wc),{size:14})],8,$b)]),ie.value?(P(),F(`div`,ex,[re.value.length?B(``,!0):(P(),F(`p`,tx,`no checkpoints yet — one click saves a named ref of HEAD.`)),(P(!0),F(N,null,M(re.value,e=>(P(),F(`div`,{key:e.name,class:`cp-row`},[L(`code`,null,E(e.name),1),L(`span`,nx,E(e.hash)+` · `+E(e.date),1),L(`span`,rx,E(e.subject),1),t[58]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`small`,disabled:!!u.value,title:`reset --hard to this checkpoint (this worktree)`,onClick:t=>ze(e.name)},[R(A(el),{size:13}),t[57]||=z(` rewind`,-1)],8,ix)]))),128))])):B(``,!0),Ge.value&&!We.value.length?(P(),F(`p`,ax,`loading log…`)):We.value.length?(P(),F(`div`,ox,[(P(!0),F(N,null,M(We.value,(e,t)=>(P(),F(N,{key:e.hash},[L(`div`,{class:`commit-row`,title:e.refs},[Ze.value[t]?(P(),F(`svg`,{key:0,class:`lane`,width:Ze.value[t].width*12+4,height:`24`,"aria-hidden":`true`},[(P(!0),F(N,null,M(Ze.value[t].width,e=>(P(),F(`line`,{key:e,x1:Qe(e-1),x2:Qe(e-1),y1:`0`,y2:`24`,stroke:`#3a3134`,"stroke-width":`2`},null,8,lx))),128)),(P(!0),F(N,null,M(Ze.value[t].parents,(e,n)=>(P(),F(`line`,{key:`p`+n,x1:Qe(Ze.value[t].lane),x2:Qe(e),y1:`12`,y2:`24`,stroke:Xe[e%Xe.length],"stroke-width":`2`},null,8,ux))),128)),L(`circle`,{cx:Qe(Ze.value[t].lane),cy:`12`,r:`4`,fill:Xe[Ze.value[t].lane%Xe.length]},null,8,dx)],8,cx)):B(``,!0),L(`button`,{class:`icon-button hash-btn`,title:`files in this commit`,onClick:t=>D(e.hash)},[R(A(nc),{size:12,class:w({open:ae.value.has(e.hash)})},null,8,[`class`])],8,fx),L(`code`,px,[ge.value?(P(),F(`a`,{key:0,href:`${ge.value}/commit/${e.hash}`,target:`_blank`,rel:`noopener`,title:`on the remote`},E(e.hash),9,mx)):(P(),F(N,{key:1},[z(E(e.hash),1)],64))]),e.refs?(P(),F(`span`,hx,E(e.refs.split(`,`)[0]),1)):B(``,!0),L(`span`,gx,E(e.subject),1),L(`span`,_x,E(e.author)+` · `+E(e.date),1)],8,sx),ae.value.has(e.hash)?(P(),F(`div`,vx,[(P(!0),F(N,null,M(ae.value.get(e.hash),e=>(P(),F(`div`,{key:e.path,class:`cf`},[L(`code`,{class:`cf-status`,"data-s":e.status},E(e.status),9,yx),L(`span`,bx,E(e.path),1)]))),128)),ae.value.get(e.hash)?.length?B(``,!0):(P(),F(`p`,xx,`no files (merge/empty commit)`))])):B(``,!0)],64))),128))])):Ke.value?(P(),F(`p`,Sx,`log failed: `+E(Ke.value),1)):(P(),F(`p`,Cx,`no commits`))]),L(`section`,wx,[L(`div`,Tx,[L(`h4`,null,[R(A(Fc),{size:16}),t[59]||=z(` Worktrees`,-1)]),L(`div`,Ex,[L(`button`,{class:`small`,disabled:!!u.value,onClick:t[32]||=e=>h.value=!h.value},[R(A(Hc),{size:13}),t[60]||=z(` worktree`,-1)],8,Dx),h.value?(P(),F(`div`,Ox,[(P(!0),F(N,null,M((a.value.branches??[]).filter(e=>!e.current),e=>(P(),F(`button`,{key:e.name,onClick:t=>Be(e.name)},[R(A(gc),{size:13}),L(`span`,null,E(e.name),1),t[61]||=L(`span`,{class:`muted-line`},`existing`,-1)],8,kx))),128)),L(`div`,Ax,[Un(L(`input`,{"onUpdate:modelValue":t[33]||=e=>g.value=e,placeholder:`or a NEW branch…`,onKeyup:t[34]||=Ns(e=>g.value.trim()&&Be(g.value.trim()),[`enter`])},null,544),[[xs,g.value]]),L(`button`,{disabled:!g.value.trim(),onClick:t[35]||=e=>Be(g.value.trim())},`create`,8,jx)])])):B(``,!0)])]),(P(!0),F(N,null,M(Ye.value,e=>(P(),F(`div`,{key:e.path,class:w([`wt`,{main:e.path===a.value.root}])},[L(`code`,{title:e.path},E(e.path),9,Mx),L(`span`,Nx,E(e.branch??e.head),1),t[62]||=L(`span`,{class:`grow`},null,-1),L(`button`,{class:`icon-button`,disabled:!!u.value,title:`jump to this worktree (session or new)`,onClick:t=>He(e.path)},[R(A(Ks),{size:13})],8,Px),L(`button`,{class:`small`,disabled:!!u.value,title:`create a session on this worktree`,onClick:t=>Ve(e.path,e.branch)},`session`,8,Fx),e.path===a.value.root?B(``,!0):(P(),F(`button`,{key:0,class:`icon-button`,disabled:!!u.value,onClick:t=>Ue(e.path)},[R(A(ol),{size:13})],8,Ix)),e.path===a.value.root?(P(),I(A(ec),{key:1,size:13,class:`muted-line`})):B(``,!0)],2))),128))]),d.value?(P(),F(`pre`,Lx,E(d.value.slice(0,6e3)),1)):B(``,!0)],64)):(P(),F(`p`,Oy,[...t[36]||=[z(`Not a git repository — run `,-1),L(`code`,null,`git init`,-1),z(` (or open a session inside a repo).`,-1)]]))],2)):B(``,!0)],64)):(P(),F(`p`,wy,`No session selected — open a session to see its git.`))]))}}),[[`__scopeId`,`data-v-8bdca98b`]]),zx={class:`extensions-panel`},Bx={class:`panel-heading`},Vx={key:0,class:`task-empty`},Hx=[`data-extension`],Ux={class:`ext-head`},Wx=[`aria-checked`,`aria-label`,`disabled`,`onClick`],Gx=[`checked`,`disabled`,`onChange`],Kx=Or({__name:`ExtensionsPanel`,setup(e){let t=rn(),n=k(!1);async function r(){let e=Cu.value;if(!e||!_u.value)return void(t.value=void 0);t.value=await e.extensions().catch(()=>void 0)??t.value}j([Cu,_u,()=>JSON.stringify(Nu.value.agent.extensions??null)],r,{immediate:!0});async function i(e){let r=Cu.value;if(r&&!n.value){n.value=!0;try{let n=await Wu(()=>r.setExtension(e));n&&(t.value=n),Hu()}finally{n.value=!1}}}return(e,r)=>(P(),F(`div`,zx,[L(`div`,Bx,[r[0]||=L(`h2`,null,`Extensions`,-1),R(A(Uc),{size:18})]),r[3]||=L(`p`,{class:`hint`},` Custom harness capabilities for this agent. Turn one on and the next request uses it. The choice is stored with the agent, so it survives restarts. `,-1),t.value?B(``,!0):(P(),F(`p`,Vx,`Loading extensions…`)),(P(!0),F(N,null,M(t.value?.extensions??[],e=>(P(),F(`article`,{key:e.name,class:w([`ext-card`,{on:e.enabled}]),"data-extension":e.name},[L(`div`,Ux,[L(`div`,null,[L(`strong`,null,E(e.title),1),L(`code`,null,E(e.name),1)]),L(`button`,{class:w([`switch`,{on:e.enabled}]),role:`switch`,"aria-checked":e.enabled,"aria-label":e.title,disabled:n.value,onClick:t=>i({name:e.name,enabled:!e.enabled})},[...r[1]||=[L(`span`,null,null,-1)]],10,Wx)]),L(`p`,null,E(e.description),1),e.prompts?(P(),F(`ul`,{key:0,class:w([`ext-prompts`,{off:!e.enabled}])},[(P(!0),F(N,null,M(e.prompts,e=>(P(),F(`li`,{key:e.id},[L(`label`,null,[L(`input`,{type:`checkbox`,checked:e.enabled,disabled:n.value,onChange:t=>i({prompt:e.id,enabled:t.target.checked})},null,40,Gx),L(`code`,null,E(e.id),1)]),L(`span`,null,E(e.description),1),L(`details`,null,[r[2]||=L(`summary`,null,`View prompt`,-1),L(`pre`,null,E(e.text),1)])]))),128))],2)):B(``,!0)],10,Hx))),128))]))}}),qx={class:`context-section`,"aria-labelledby":`context-title`},Jx={class:`section-label`},Yx={key:0,class:`hint`},Xx={class:`context-numbers`},Zx={class:`context-pct`},Qx={key:0,class:`context-compacting`},$x=[`aria-valuemax`,`aria-valuenow`,`aria-valuetext`],eS={class:`context-marker-label`},tS=[`aria-valuemin`,`aria-valuemax`,`aria-valuenow`,`aria-valuetext`],nS={class:`context-marker-label`},rS={class:`hint context-hint`},iS={class:`modal compaction-modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`compaction-title`},aS={class:`context-toggle`},oS=[`checked`],sS=512,cS=4096,lS=1024,uS=Or({__name:`ContextBar`,setup(e){let t=e=>e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e),n=V(()=>zu.value?.contextWindow??0),r=V(()=>{let e=Nu.value.entries;for(let t=e.length-1;t>=0;t--){if(e[t].kind!==`pi.assistant`)continue;let n=e[t].model?.find(e=>e.role===`assistant`)?.usage;if(n)return n.totalTokens||n.input+n.output+n.cacheRead+n.cacheWrite}return 0}),i=V(()=>Nu.value.compactions.length>0),a=k(),o=V(()=>a.value??xu.value?.compaction??r_(n.value));j(()=>JSON.stringify(xu.value?.compaction),e=>{a.value&&e===JSON.stringify(a.value)&&(a.value=void 0)});let s=k(),c=V(()=>W.dialog?.kind===`compaction`),l=()=>void(W.dialog=void 0);qr(()=>c.value&&l());let u=V(()=>s.value??i_(n.value,o.value)),d=e=>`${Math.min(100,Math.max(0,100*e/(n.value||1)))}%`,f=V(()=>Math.round(100*r.value/(n.value||1))),p=e=>{let t=e/(n.value||1);return t<.35?`start`:t>.65?`end`:`center`},m=(e,t)=>Math.min(n.value-lS,Math.max((t??cS)+lS,e)),h=(e,t)=>Math.min(t-lS,Math.max(cS,e));function g(e,t){let n=u.value,r=Math.round(t/sS)*sS;s.value=e===`wait`?{auto:n.auto,wait:m(r,n.auto)}:{auto:h(r,n.wait),wait:n.wait}}async function _(e){let t=wu.value;if(!t)return;let n=await Wu(()=>t.setCompaction(e));n&&(a.value=n),s.value=void 0}function v(){let e=s.value;e&&_({reserveTokens:n.value-e.wait,...e.auto===void 0?{}:{backgroundTokens:e.wait-e.auto}})}let y=k(),b;function ee(e,t){b=e,t.currentTarget.setPointerCapture(t.pointerId)}function x(e){if(!b||!y.value)return;let t=y.value.getBoundingClientRect();g(b,(e.clientX-t.left)/t.width*n.value)}function S(){b&&(b=void 0,v())}function te(e,t){let n=(t.shiftKey?8192:1024)*(t.key===`ArrowRight`||t.key===`ArrowUp`?1:t.key===`ArrowLeft`||t.key===`ArrowDown`?-1:0);if(!n)return;t.preventDefault();let r=u.value;g(e,(e===`auto`?r.auto??cS:r.wait)+n)}return(e,a)=>(P(),F(N,null,[L(`section`,qx,[L(`div`,Jx,[a[7]||=L(`span`,{id:`context-title`},`CONTEXT`,-1),n.value?(P(),F(`button`,{key:0,class:`context-details-toggle`,onClick:a[0]||=e=>A(W).dialog={kind:`compaction`}},[R(A(Sc),{size:16}),a[6]||=z(`Details `,-1)])):B(``,!0)]),n.value?(P(),F(N,{key:1},[L(`div`,Xx,[L(`strong`,null,E(t(r.value)),1),L(`span`,null,`of `+E(t(n.value))+` tokens`,1),L(`span`,Zx,E(f.value)+`%`,1),i.value?(P(),F(`span`,Qx,[...a[8]||=[L(`i`,null,null,-1),z(`Compacting`,-1)]])):B(``,!0)]),L(`div`,{ref_key:`bar`,ref:y,class:w([`context-bar`,{off:!o.value.enabled}]),onPointermove:x,onPointerup:S,onPointercancel:S},[L(`div`,{class:w([`context-fill`,{hot:u.value.auto!==void 0&&r.value>=u.value.auto}]),style:ve({width:d(r.value)})},null,6),L(`div`,{class:`context-reserve`,style:ve({left:d(u.value.wait)}),title:`Reserved for the answer`},null,4),u.value.auto===void 0?B(``,!0):(P(),F(`button`,{key:0,class:w([`context-marker auto`,`label-${p(u.value.auto)}`]),role:`slider`,"aria-label":`Automatic compaction starts at`,"aria-valuemin":cS,"aria-valuemax":u.value.wait-lS,"aria-valuenow":u.value.auto,"aria-valuetext":`${t(u.value.auto)} tokens`,style:ve({left:d(u.value.auto)}),onPointerdown:a[1]||=e=>ee(`auto`,e),onKeydown:a[2]||=e=>te(`auto`,e),onKeyup:v,onBlur:v},[L(`span`,eS,`Auto-compact at `+E(t(u.value.auto)),1)],46,$x)),L(`button`,{class:w([`context-marker wait`,`label-${p(u.value.wait)}`]),role:`slider`,"aria-label":`The next request waits for a summary at`,"aria-valuemin":(u.value.auto??cS)+lS,"aria-valuemax":n.value-lS,"aria-valuenow":u.value.wait,"aria-valuetext":`${t(u.value.wait)} tokens, ${t(n.value-u.value.wait)} reserved`,style:ve({left:d(u.value.wait)}),onPointerdown:a[3]||=e=>ee(`wait`,e),onKeydown:a[4]||=e=>te(`wait`,e),onKeyup:v,onBlur:v},[L(`span`,nS,`Reserve at `+E(t(u.value.wait)),1)],46,tS)],34),L(`p`,rS,[o.value.enabled?(P(),F(N,{key:0},[a[9]||=z(`Compacts in the background at `,-1),L(`strong`,null,E(t(u.value.auto??u.value.wait)),1),a[10]||=z(` and waits at `,-1),L(`strong`,null,E(t(u.value.wait)),1),a[11]||=z(`.`,-1)],64)):(P(),F(N,{key:1},[z(`Automatic compaction is off.`)],64))])],64)):(P(),F(`div`,Yx,`Pick a model to see its context window.`))]),(P(),I(ur,{to:`body`},[c.value?(P(),F(`div`,{key:0,class:`modal-backdrop`,onClick:js(l,[`self`])},[L(`section`,iS,[L(`header`,null,[a[12]||=L(`h2`,{id:`compaction-title`},`Context compaction`,-1),L(`button`,{class:`icon-button`,"aria-label":`Close context compaction`,onClick:l},[R(A(ol),{size:18})])]),L(`p`,null,[a[13]||=z(` A summary starts in the background at `,-1),L(`strong`,null,E(t(u.value.auto??u.value.wait)),1),a[14]||=z(`. Above `,-1),L(`strong`,null,E(t(u.value.wait)),1),z(` the next request waits for it, keeping `+E(t(n.value-u.value.wait))+` free for the answer. Drag a marker on the bar to change either point. `,1)]),a[16]||=L(`p`,null,[z(`Older entries stay stored, and `),L(`code`,null,`search_history`),z(` still finds them.`)],-1),L(`label`,aS,[L(`input`,{type:`checkbox`,checked:o.value.enabled,onChange:a[5]||=e=>_({enabled:e.target.checked})},null,40,oS),a[15]||=z(` Automatic compaction `,-1)]),a[17]||=L(`p`,{class:`hint`},[z(` Applies to every agent in this session. `),L(`code`,null,`/compact`),z(` works either way. `)],-1),L(`footer`,null,[L(`button`,{class:`secondary`,onClick:l},`Close`)])])])):B(``,!0)]))],64))}}),dS=/^[A-Za-z_$][\w$]*$/,fS=e=>` `.repeat(e);function pS(e,t){let n=[],r=(e,t=`text`)=>n.push({text:e,kind:t});return r(`function`,`keyword`),r(` `),r(e,`function`),r(`(`,`punct`),r(`args`),r(`: `,`punct`),mS(t,0,r),r(`): `,`punct`),r(`Promise`,`type`),r(`<`,`punct`),r(`ToolResult`,`type`),r(`>;`,`punct`),n}function mS(e,t,n){if(!e||typeof e!=`object`)return n(`unknown`,`type`);if(`const`in e)return _S(e.const,n);if(e.enum)return gS(e.enum.map(e=>({const:e})),t,n);if(e.anyOf??e.oneOf)return gS(e.anyOf??e.oneOf,t,n);if(Array.isArray(e.type))return gS(e.type.map(t=>({...e,type:t})),t,n);switch(e.type){case`string`:case`boolean`:case`null`:return n(e.type,`type`);case`number`:case`integer`:return n(`number`,`type`);case`array`:{let r=!!(e.items?.anyOf??e.items?.oneOf??e.items?.enum);return r&&n(`(`,`punct`),mS(e.items,t,n),r&&n(`)`,`punct`),n(`[]`,`punct`)}case`object`:return hS(e,t,n);default:return n(`unknown`,`type`)}}function hS(e,t,n){let r=Object.entries(e.properties??{});if(!r.length)return e.additionalProperties&&typeof e.additionalProperties==`object`?(n(`Record`,`type`),n(`<`,`punct`),n(`string`,`type`),n(`, `,`punct`),mS(e.additionalProperties,t,n),n(`>`,`punct`)):n(`{}`,`punct`);let i=new Set(e.required??[]);n(`{`,`punct`),n(`
|
|
78
78
|
`);for(let[e,a]of r){let r=vS(a);r&&n(`${fS(t+1)}${r}\n`,`comment`),n(fS(t+1)),n(dS.test(e)?e:JSON.stringify(e),`property`),n(i.has(e)?`: `:`?: `,`punct`),mS(a,t+1,n),n(`;`,`punct`),n(`
|
|
79
79
|
`)}n(fS(t)),n(`}`,`punct`)}function gS(e,t,n){e.forEach((e,r)=>{r&&n(` | `,`punct`),mS(e,t,n)})}function _S(e,t){if(typeof e==`string`)return t(JSON.stringify(e),`string`);if(typeof e==`number`)return t(String(e),`number`);t(String(e),`type`)}function vS(e){let t=[e.description,e.minimum===void 0?``:`@minimum ${e.minimum}`,e.maximum===void 0?``:`@maximum ${e.maximum}`,e.default===void 0?``:`@default ${JSON.stringify(e.default)}`].filter(Boolean);return t.length?`/** ${t.join(` `)} */`:``}var yS={key:0,class:`panel-rail`,"aria-label":`Inspector (collapsed)`},bS=[`title`],xS=[`aria-label`,`title`,`onClick`],SS={key:0,class:`count`},CS={class:`inspector-tabs`,role:`tablist`,"aria-label":`Session details`},wS=[`id`,`aria-selected`,`onClick`],TS={key:0,class:`count`},ES=[`title`],DS=[`aria-labelledby`],OS={class:`session-heading`},kS=[`title`],AS={class:`cwd-trail`,dir:`rtl`},jS={dir:`ltr`},MS={class:`session-status`},NS={key:0,class:`background-pill`},PS=[`title`],FS={class:`model-section`},IS=[`src`],LS={class:`thinking-row`},RS=[`value`],zS={class:`stats-section`,"aria-labelledby":`stats-title`},BS={class:`metrics`},VS=[`title`],HS={class:`usage-breakdown`,"aria-label":`Agent token and cost breakdown`},US={scope:`row`},WS={class:`panel-heading`},GS={class:`hint app-state-description`},KS=[`disabled`],qS={class:`state-json-actions`},JS={key:0,class:`hint`},YS=[`disabled`],XS=[`disabled`],ZS={key:0,class:`message-error`,role:`alert`},QS={class:`panel-heading`},$S={class:`tag`},eC={class:`hook-card`},tC=[`aria-checked`],nC={key:0,class:`tag tool-disabled`},rC={class:`tag`},iC=[`aria-label`],aC=Or({__name:`Inspector`,setup(e){let t=V(()=>new Map(Bu.value?.tools.map(e=>[e.name,pS(e.name,e.parameters)]))),n=[{id:`session`,label:`Session`,icon:mc},{id:`git`,label:`Git`,icon:gc},{id:`state`,label:`State`,icon:Qs},{id:`tasks`,label:`Tasks`,icon:Us},{id:`tools`,label:`Tools`,icon:al},{id:`extensions`,label:`Extend`,icon:Uc}],r=V(()=>[{label:`Input`,tokens:Ru.value.input,cost:Ru.value.inputCost},{label:`Output`,tokens:Ru.value.output,cost:Ru.value.outputCost},{label:`Cache read`,tokens:Ru.value.cacheRead,cost:Ru.value.cacheReadCost},{label:`Cache write`,tokens:Ru.value.cacheWrite,cost:Ru.value.cacheWriteCost}]),i=V(()=>Iu.value.filter(e=>e.background).length);function a(e,t){Wu(async()=>{await Cu.value.configure(e),await Hu(),t&&G(t)})}function o(){let e=wu.value;e&&(W.dialog={kind:`prompt`,title:`Rename session`,label:`Session name`,value:xu.value?.name??``,submit:`Save name`,run:t=>e.rename(t)})}let s=bu.sharedState,c=k(``),l=k(``),u=k(0),d=k(!1),f=k(``),p=V(()=>c.value!==l.value),m=V(()=>p.value&&s.value?.revision!==u.value);function h(){c.value=qu(s.value?.value??{}),l.value=c.value,u.value=s.value?.revision??0,f.value=``}j(s,()=>!p.value&&h(),{immediate:!0});async function g(e){if(!d.value&&Cu.value){d.value=!0,f.value=``;try{await Cu.value.demo(`state`,e)}catch(e){f.value=Zl(e)}finally{d.value=!1}}}async function _(){if(!d.value&&Cu.value){f.value=``,d.value=!0;try{let e=JSON.parse(c.value);if(!e||Array.isArray(e)||typeof e!=`object`)throw Error(`App State must be a JSON object.`);let t=await Cu.value.demo(`state`,{operation:`update`,path:``,value:e,expectedRevision:u.value});c.value=qu(t.value),l.value=c.value,u.value=t.revision,G(`Shared App State saved.`)}catch(e){f.value=Zl(e)}finally{d.value=!1}}}let v=V(()=>Bu.value?.config.readOnly===!0),y=V(()=>Bu.value?.tools.filter(e=>e.offered).length??0);return(e,l)=>(P(),F(`aside`,{class:w([`inspector`,{collapsed:!A(ed),overlay:A(W).inspectorOverlay}])},[A(ed)?(P(),F(N,{key:1},[L(`div`,CS,[(P(),F(N,null,M(n,e=>L(`button`,{id:`inspector-tab-${e.id}`,key:e.id,role:`tab`,"aria-controls":`inspector-panel`,"aria-selected":A(W).tab===e.id,class:w({active:A(W).tab===e.id}),onClick:t=>A(W).tab=e.id},[(P(),I(ti(e.icon),{size:18})),z(E(e.label),1),e.id===`tasks`&&A(Iu).length?(P(),F(`span`,TS,E(A(Iu).length),1)):B(``,!0)],10,wS)),64)),L(`button`,{class:`icon-button panel-toggle`,"aria-label":`Collapse inspector`,title:`Collapse inspector (${A(od).inspector})`,onClick:l[1]||=e=>A(nd)()},[R(A(Ic),{size:18})],8,ES)]),L(`div`,{id:`inspector-panel`,class:w([`inspector-body`,{"session-panel":A(W).tab===`session`}]),role:`tabpanel`,"aria-labelledby":`inspector-tab-${A(W).tab}`},[A(W).tab===`session`?(P(),F(N,{key:0},[L(`section`,OS,[L(`h1`,null,[L(`span`,null,E(A(xu)?.name??`Loading session`),1),L(`button`,{class:`icon-button`,title:`Rename session`,"aria-label":`Rename session`,onClick:o},[R(A(Bc),{size:18})])]),L(`button`,{class:`path cwd-button`,title:A(xu)?.cwd,"aria-label":`Show full working directory`,onClick:l[2]||=e=>A(W).dialog={kind:`path`,path:A(xu)?.cwd??``}},[R(A(mc),{size:18}),L(`span`,AS,[L(`bdi`,jS,E(A(xu)?.cwd),1)])],8,kS),L(`div`,MS,[L(`span`,{class:w([`status-pill`,{working:A(Lu)}])},[l[7]||=L(`i`,null,null,-1),z(E(A(Lu)?`Working`:`Idle`),1)],2),i.value?(P(),F(`span`,NS,E(i.value)+` background`,1)):B(``,!0),L(`span`,{class:`saved`,title:A(gu)?.id},[R(A(Kc),{size:18}),z(E(A(gu)?.name??A(gu)?.id),1)],8,PS),A(gu)?(P(),I(Ov,{key:1,device:A(gu)},null,8,[`device`])):B(``,!0)])]),A(gu)?(P(),I(Gv,{key:0,device:A(gu)},null,8,[`device`])):B(``,!0),L(`section`,FS,[l[14]||=L(`div`,{class:`section-label`},[L(`span`,null,`AGENT`)],-1),L(`button`,{class:`model-button`,onClick:l[3]||=e=>A(W).dialog={kind:`models`}},[L(`img`,{src:A(Ju)(A(Nu).agent.model?.modelId),alt:``},null,8,IS),L(`div`,null,[L(`strong`,null,E(A(zu)?.name??A(Nu).agent.model?.modelId??`Loading…`),1),L(`small`,null,E(A(zu)?.tier??``)+` / `+E(A(Nu).agent.model?.provider??``),1)]),R(A(tc),{size:18})]),L(`div`,LS,[l[8]||=L(`span`,null,`Thinking`,-1),L(`select`,{"aria-label":`Thinking level`,value:A(Nu).agent.thinkingLevel??`low`,onChange:l[4]||=e=>a({thinkingLevel:e.target.value},`Thinking ${e.target.value}. Used on the next turn.`)},[(P(!0),F(N,null,M(A(e_),e=>(P(),F(`option`,{key:e},E(e),1))),128))],40,RS)]),R(uS),L(`section`,zS,[l[13]||=L(`div`,{class:`section-label`},[L(`span`,{id:`stats-title`},`STATS`)],-1),L(`div`,BS,[L(`div`,{title:`${A(Ru).tokens.toLocaleString(`en-US`)} total tokens`},[L(`span`,null,E(A(Ku)(A(Ru).tokens)),1),l[9]||=L(`small`,null,`total tokens`,-1)],8,VS),L(`div`,null,[L(`span`,null,`$`+E(A(Ru).cost.toFixed(4)),1),l[10]||=L(`small`,null,`agent cost`,-1)]),L(`div`,null,[L(`span`,null,E(A(Bu)?.tools.length??0),1),l[11]||=L(`small`,null,`tools`,-1)])]),L(`table`,HS,[l[12]||=L(`thead`,null,[L(`tr`,null,[L(`th`,{scope:`col`},`Type`),L(`th`,{scope:`col`},`Tokens`),L(`th`,{scope:`col`},`Cost (USD)`)])],-1),L(`tbody`,null,[(P(!0),F(N,null,M(r.value,e=>(P(),F(`tr`,{key:e.label},[L(`th`,US,E(e.label),1),L(`td`,null,E(e.tokens.toLocaleString(`en-US`)),1),L(`td`,null,`$`+E(e.cost.toFixed(4)),1)]))),128))])])])])],64)):B(``,!0),A(W).tab===`state`?(P(),F(N,{key:1},[L(`div`,WS,[l[15]||=L(`h2`,null,`App State`,-1),R(A(Qs),{size:18})]),L(`p`,GS,` One shared JSON object for every agent, session and fork on `+E(A(gu)?.name??A(gu)?.id)+`. You and your agents can read, create, update or delete values and fields. Changes appear live and persist across closed browsers, interrupted agents and backend restarts. `,1),Un(L(`textarea`,{"onUpdate:modelValue":l[5]||=e=>c.value=e,class:`app-state-json`,"aria-label":`App State JSON`,spellcheck:`false`,disabled:d.value||!A(s),rows:`12`},null,8,KS),[[xs,c.value]]),L(`div`,qS,[m.value?(P(),F(`span`,JS,`State changed elsewhere. Load the latest JSON before saving.`)):B(``,!0),p.value?(P(),F(`button`,{key:1,class:`secondary`,disabled:d.value,onClick:h},E(m.value?`Load latest`:`Reset`),9,YS)):B(``,!0),L(`button`,{class:`primary small`,disabled:!p.value||d.value||m.value,onClick:_},E(d.value?`Saving…`:`Save JSON`),9,XS)]),f.value?(P(),F(`p`,ZS,E(f.value),1)):B(``,!0),R(Sv,{value:A(s)?.value??{},disabled:d.value||p.value||!A(s),onChange:g},null,8,[`value`,`disabled`])],64)):B(``,!0),A(W).tab===`tasks`?(P(),I(Sy,{key:2})):B(``,!0),A(W).tab===`git`?(P(),I(Rx,{key:3})):B(``,!0),A(W).tab===`extensions`?(P(),I(Kx,{key:4})):B(``,!0),A(W).tab===`tools`?(P(),F(N,{key:5},[L(`div`,QS,[l[16]||=L(`h2`,null,`Tools`,-1),L(`span`,$S,E(y.value)+` / `+E(A(Bu)?.tools.length??0),1)]),l[20]||=L(`p`,{class:`hint`},` Every tool this agent's extensions provide. Open one to see its definition. `,-1),L(`div`,eC,[L(`div`,null,[R(A(Jc),{size:18}),l[18]||=L(`strong`,null,`Read only`,-1),L(`button`,{class:w([`switch`,{on:v.value}]),role:`switch`,"aria-checked":v.value,"aria-label":`Read only`,onClick:l[6]||=e=>a({readOnly:!v.value},v.value?`Read only off. Every tool is back.`:`Read only on. Tools that write are disabled.`)},[...l[17]||=[L(`span`,null,null,-1)]],10,tC)]),l[19]||=L(`p`,null,` Offers this agent only tools that read. Tools that create, update or delete leave its next request, and the choice is stored with the agent. `,-1)]),(P(!0),F(N,null,M(A(Bu)?.tools,e=>(P(),F(`details`,{key:e.name,class:w([`tool-row`,{disabled:!e.offered}])},[L(`summary`,null,[R(A(al),{size:18}),L(`strong`,null,E(e.name),1),e.offered?B(``,!0):(P(),F(`span`,nC,`disabled`)),L(`span`,rC,E(e.replay===`safe`?`replay safe`:`interrupt on crash`),1)]),L(`p`,null,E(e.description),1),e.parameters?(P(),F(`pre`,{key:0,class:`tool-signature`,"aria-label":`${e.name} TypeScript definition`},[L(`code`,null,[(P(!0),F(N,null,M(t.value.get(e.name),(e,t)=>(P(),F(`span`,{key:t,class:w(`tk-${e.kind}`)},E(e.text),3))),128))])],8,iC)):B(``,!0),L(`small`,null,E(e.replay===`safe`?`An interrupted execution may run again after recovery.`:`A crash records an interrupted result instead of rerunning this effect.`),1)],2))),128))],64)):B(``,!0)],10,DS)],64)):(P(),F(`div`,yS,[L(`button`,{class:`icon-button panel-toggle`,"aria-label":`Expand inspector`,title:`Expand inspector (${A(od).inspector})`,onClick:l[0]||=e=>A(td)()},[R(A(Lc),{size:18})],8,bS),(P(),F(N,null,M(n,e=>L(`button`,{key:e.id,class:w([`rail-tab`,{active:A(W).tab===e.id}]),"aria-label":`Open ${e.label}`,title:e.label,onClick:t=>A(td)(e.id)},[(P(),I(ti(e.icon),{size:20})),e.id===`tasks`&&A(Iu).length?(P(),F(`span`,SS,E(A(Iu).length),1)):B(``,!0)],10,xS)),64))]))],2))}}),oC={class:`chat-empty`},sC={class:`eyebrow`},cC={key:3,class:`hint offline-error`},lC={key:4,class:`offline-command`},uC={key:5,class:`hint`},dC={key:6,class:`hint`},fC={class:`offline-actions`},pC=[`disabled`],mC={key:7,class:`message-error`,role:`alert`},hC=Or({__name:`OfflinePanel`,props:{device:{}},setup(e){let t=e,n=k(!1),r=k(``),i=V(()=>{let e=t.device,n=e.source===`config`;switch(e.status){case`checking`:return{title:`Checking ${e.id}…`,text:`Probing the device. This view fills in as soon as it answers.`};case`unauthorized`:return e.transport===`tunnel`?{title:`${e.id} tunnel credentials are not valid`,text:`Pair the device again — the hub will mint a fresh credential.`}:{title:e.hasToken?`${e.id} rejected its token`:`No token for ${e.id}`,text:e.hasToken?`The device's DPI_TOKEN changed (a rotate or a rebuilt device). Copy the current token into this hub's registry, then check again.`:`This hub has no token for the device yet. Register it, then check again.`,command:n&&e.kind!==`url`?`just net register ${e.id}`:`just net register ${e.id} --token <token>`};case`mismatch`:return{title:`${e.id} answers as a different device`,text:`The URL now reaches a backend with another identity (a rebuilt VM or a new data directory). If that is expected, register it again: that trusts the identity it answers with now.`,command:e.kind===`url`?`just net register ${e.id} --token <token>`:`just net register ${e.id}`};case`incompatible`:return{title:`${e.id} speaks another API version`,text:`Update the device's dpi-backend.`,command:n?`just net deploy ${e.id}`:void 0};default:return{title:`${e.id} is offline`,text:`Last seen ${Yu(e.lastSeenAt)}. Its agents keep their state on the device and resume when its backend starts again. The tree shows the last known sessions.`,command:n?e.kind===`local`?`just backend run`:e.kind===`url`?void 0:`just net restart ${e.id}`:void 0,alt:n&&e.kind!==`local`&&e.kind!==`url`?`just net up ${e.id}`:void 0}}});async function a(){n.value=!0,r.value=``;try{let e=await Xl.check(t.device.id);e.status===`online`&&G(`${e.id} is online.`)}catch(e){r.value=Zl(e)}finally{n.value=!1}}async function o(e){try{await navigator.clipboard.writeText(e),G(`Copied.`)}catch{G(`Clipboard needs localhost or HTTPS. Select the text to copy.`)}}return(t,s)=>(P(),F(`section`,{class:w([`chat-panel offline-panel`,e.device.status]),"aria-live":`polite`},[L(`div`,oC,[e.device.status===`checking`?(P(),I(A(kc),{key:0,class:`spin`,size:30})):e.device.status===`mismatch`||e.device.status===`unauthorized`?(P(),I(A(qc),{key:1,size:30})):(P(),I(A(nl),{key:2,size:30})),L(`span`,sC,E(e.device.kind.toUpperCase())+` · `+E(e.device.url??(e.device.transport===`tunnel`?`tunnel`:`no endpoint`)),1),L(`h2`,null,E(i.value.title),1),L(`p`,null,E(i.value.text),1),e.device.error?(P(),F(`p`,cC,E(e.device.error),1)):B(``,!0),i.value.command?(P(),F(`div`,lC,[L(`code`,null,E(i.value.command),1),L(`button`,{class:`icon-button`,"aria-label":`Copy command`,onClick:s[0]||=e=>o(i.value.command)},[R(A(oc),{size:18})])])):B(``,!0),i.value.command?(P(),F(`p`,uC,`Run it in this repo's terminal, then press Check now.`)):B(``,!0),i.value.alt?(P(),F(`p`,dC,[s[2]||=z(` Never deployed or rebuilt? `,-1),L(`code`,null,E(i.value.alt),1),s[3]||=z(` provisions it from scratch. `,-1)])):B(``,!0),L(`div`,fC,[L(`button`,{class:`secondary`,disabled:n.value,onClick:s[1]||=e=>a()},[R(A(Wc),{size:18}),z(E(n.value?`Checking…`:`Check now`),1)],8,pC)]),r.value?(P(),F(`p`,mC,E(r.value),1)):B(``,!0)])],2))}}),gC={class:`dir-browser`},_C={class:`dir-path`},vC=[`disabled`],yC=[`aria-busy`],bC=[`title`],xC=[`aria-selected`,`title`,`onClick`],SC={key:1,class:`hint`},CC={key:0,class:`message-error`,role:`alert`},wC=Or({__name:`DirBrowser`,props:li({deviceId:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,n=ki(e,`modelValue`),r=k(),i=k(!1),a=k(``),o=0;async function s(e){let s=++o,c=t.deviceId;i.value=!0,a.value=``;try{let t=await Jl(c).dirs(e);return s===o?(r.value=t,t.path&&(n.value=t.path),t):void 0}catch(e){s===o&&(a.value=Zl(e));return}finally{s===o&&(i.value=!1)}}return j(()=>t.deviceId,async()=>{r.value=void 0;let e=await s(``),t=e?.dirs[0];t&&!e.path&&await s(t.path)},{immediate:!0}),(e,t)=>(P(),F(`div`,gC,[L(`div`,_C,[Un(L(`input`,{"onUpdate:modelValue":t[0]||=e=>n.value=e,"aria-label":`Working directory`,required:``,placeholder:`/path/to/project`,spellcheck:`false`,autocomplete:`off`,onKeydown:t[1]||=Ns(js(e=>s(n.value),[`prevent`]),[`enter`])},null,544),[[xs,n.value]]),L(`button`,{type:`button`,class:`secondary small`,disabled:i.value||!n.value,onClick:t[2]||=e=>s(n.value)},` Go `,8,vC)]),L(`div`,{class:`dir-list`,role:`listbox`,"aria-label":`Directories`,"aria-busy":i.value},[L(`button`,{type:`button`,class:`dir-item`,title:`Start directories`,onClick:t[3]||=e=>s(``)},[R(A(xc),{size:16}),t[5]||=L(`span`,null,`Start dirs`,-1)]),r.value?.parent?(P(),F(`button`,{key:0,type:`button`,class:`dir-item`,title:r.value.parent,onClick:t[4]||=e=>s(r.value.parent)},[R(A(cc),{size:16}),t[6]||=L(`span`,null,`..`,-1)],8,bC)):B(``,!0),(P(!0),F(N,null,M(r.value?.dirs,e=>(P(),F(`button`,{key:e.path,type:`button`,class:`dir-item`,role:`option`,"aria-selected":e.path===n.value,title:e.path,onClick:t=>s(e.path)},[e.path===n.value?(P(),I(A(mc),{key:0,size:16})):(P(),I(A(hc),{key:1,size:16})),L(`span`,null,E(e.name),1)],8,xC))),128)),r.value&&!r.value.dirs.length?(P(),F(`p`,SC,`No subdirectories.`)):B(``,!0)],8,yC),a.value?(P(),F(`p`,CC,E(a.value),1)):B(``,!0)]))}}),TC={key:0,class:`message-error`},EC=[`value`],DC={class:`field`},OC={key:0,class:`hint`,title:`The device has no provider key — it lists its built-in catalog, and chat needs OPENROUTER_API_KEY set in the device's env file`},kC=[`value`],AC={key:2,class:`message-error`,role:`alert`},jC=[`disabled`],MC=Or({__name:`NewSessionDialog`,props:{deviceId:{}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=V(()=>lu.devices.value.filter(e=>e.status===`online`)),a=k(i.value.find(e=>e.id===n.deviceId)?.id??i.value[0]?.id??``),o=V(()=>i.value.find(e=>e.id===a.value)),s=V(()=>{let e=o.value?.info?.models??[];if(e.length)return e;let t=o.value?.info;return t?.defaultModel&&t.provider?[{id:t.defaultModel,provider:t.provider,name:`${t.defaultModel} (device default)`,tier:`—`,icon:`lab.png`,contextWindow:0,reasoning:!1,cost:{input:0,output:0}}]:[]}),c=V(()=>!s.value.length||(o.value?.info?.models?.length??0)===0),l=V(()=>!!o.value?.info?.providerKeyMissing),u=e=>`${e.provider}/${e.id}`,d=k({name:``,cwd:``,model:``}),f=k(!1),p=k(``);j(o,e=>{let t=s.value,n=t.find(t=>t.id===e?.info?.defaultModel)??t[0];d.value.model=n?u(n):``,d.value.cwd=``},{immediate:!0});async function m(){if(!f.value&&o.value){f.value=!0,p.value=``;try{let e=s.value.find(e=>u(e)===d.value.model)??s.value[0];if(!e)throw Error(`Choose a model`);let t=await Jl(o.value.id).createSession({name:d.value.name.trim()||`New session`,cwd:d.value.cwd.trim(),model:{provider:e.provider,modelId:e.id}}),n=t.agents.find(e=>e.kind===`root`)??t.agents[0];Tu({deviceId:o.value.id,sessionId:t.id,agentId:n?.id??1}),G(`Session created on ${o.value.id}.`),r(`close`)}catch(e){p.value=Zl(e)}finally{f.value=!1}}}return(e,t)=>(P(),F(`div`,{class:`modal-backdrop`,onClick:t[6]||=js(e=>r(`close`),[`self`])},[L(`form`,{class:`modal session-modal`,onSubmit:js(m,[`prevent`])},[L(`header`,null,[t[7]||=L(`div`,null,[L(`span`,{class:`eyebrow`},`A PERSISTENT WORKSPACE`),L(`h2`,null,`New session`)],-1),L(`button`,{type:`button`,class:`icon-button`,"aria-label":`Close new session`,onClick:t[0]||=e=>r(`close`)},[R(A(ol),{size:18})])]),i.value.length?(P(),F(N,{key:1},[L(`label`,null,[t[8]||=z(`Device`,-1),Un(L(`select`,{"onUpdate:modelValue":t[1]||=e=>a.value=e,"aria-label":`Device`},[(P(!0),F(N,null,M(i.value,e=>(P(),F(`option`,{key:e.id,value:e.id},E(e.name)+E(e.info?.hostname&&e.info.hostname!==e.name?` · ${e.info.hostname}`:``),9,EC))),128))],512),[[ws,a.value]])]),L(`label`,null,[t[9]||=z(`Session name`,-1),Un(L(`input`,{"onUpdate:modelValue":t[2]||=e=>d.value.name=e,autofocus:``,placeholder:`My durable agent`,maxlength:`100`},null,512),[[xs,d.value.name]])]),L(`div`,DC,[L(`span`,null,`Working directory on `+E(i.value.find(e=>e.id===a.value)?.name??a.value),1),R(wC,{modelValue:d.value.cwd,"onUpdate:modelValue":t[3]||=e=>d.value.cwd=e,"device-id":a.value},null,8,[`modelValue`,`device-id`])]),L(`label`,null,[t[10]||=z(`Model`,-1),c.value||l.value?(P(),F(`span`,OC,`no API key on device — chat needs one`)):B(``,!0),Un(L(`select`,{"onUpdate:modelValue":t[4]||=e=>d.value.model=e,"aria-label":`New session model`},[(P(!0),F(N,null,M(s.value,e=>(P(),F(`option`,{key:u(e),value:u(e)},E(e.tier)+` / `+E(e.name),9,kC))),128))],512),[[ws,d.value.model]])])],64)):(P(),F(`p`,TC,` No device is online. Start one with just backend run or just net up <id>, then try again. `)),p.value?(P(),F(`p`,AC,E(p.value),1)):B(``,!0),L(`footer`,null,[L(`button`,{type:`button`,class:`secondary`,onClick:t[5]||=e=>r(`close`)},`Cancel`),L(`button`,{class:`primary`,disabled:f.value||!d.value.model||!d.value.cwd||!o.value},[R(A(Hc),{size:18}),z(E(f.value?`Creating…`:`Create session`),1)],8,jC)])],32)]))}}),NC=new Uint8Array(512),PC=new Uint8Array(256);(()=>{let e=1;for(let t=0;t<255;t++)NC[t]=e,PC[e]=t,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)NC[e]=NC[e-255]})();var FC=(e,t)=>e===0||t===0?0:NC[PC[e]+PC[t]];function IC(e){let t=[1];for(let n=0;n<e;n++){let e=Array(t.length+1).fill(0);for(let r=0;r<t.length;r++)e[r]^=t[r],e[r+1]^=FC(t[r],NC[n]);t=e}return t}function LC(e,t){let n=IC(t),r=Array(t).fill(0);for(let i of e){let e=i^r[0];r.shift(),r.push(0);for(let i=0;i<t;i++)r[i]^=FC(n[i+1],e)}return r}var RC=[21,25,29,33,37,41,45,49,53,57,61,65],zC=[19,34,55,80,108,136,156,194,232,274,324,370],BC=[7,10,15,20,26,36,40,48,60,72,80,96],VC=[7,10,15,20,26,18,20,24,30,18,20,24],HC=[[[1,19]],[[1,34]],[[1,55]],[[1,80]],[[1,108]],[[2,68]],[[2,78]],[[2,97]],[[2,116]],[[2,68],[2,69]],[[4,81]],[[2,92],[2,93]]],UC=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58]],WC=e=>e<=9?8:16;function GC(e){for(let t=1;t<=RC.length;t++)if(4+WC(t)+e*8<=zC[t-1]*8)return t;throw Error(`qr: payload too long (${e} bytes; v12L max ${zC[11]-3})`)}function KC(e,t){let n=[...new TextEncoder().encode(e)],r=[],i=(e,t)=>{for(let n=t-1;n>=0;n--)r.push(e>>n&1)};i(4,4),i(n.length,WC(t));for(let e of n)i(e,8);let a=zC[t-1],o=a*8;for(i(0,Math.min(4,o-r.length));r.length%8!=0;)r.push(0);let s=[236,17],c=0;for(;r.length<o;)i(s[c++%2],8);let l=[];for(let e=0;e<a;e++){let t=0;for(let n=0;n<8;n++)t=t<<1|r[e*8+n];l.push(t)}return l}function qC(e,t){let n=VC[e-1],r=[],i=0;for(let[n,a]of HC[e-1])for(let e=0;e<n;e++)r.push(t.slice(i,i+=a));let a=[],o=Math.max(...r.map(e=>e.length));for(let e=0;e<o;e++)for(let t of r)e<t.length&&a.push(t[e]);let s=r.map(e=>LC(e,n));for(let e=0;e<n;e++)for(let t of s)a.push(t[e]);return a}function JC(e){return Array.from({length:e},()=>Array(e).fill(!1))}function YC(e,t){let n=RC[t-1],r=(t,r)=>{for(let i=-1;i<=7;i++)for(let a=-1;a<=7;a++){let o=t+i,s=r+a;if(o<0||o>=n||s<0||s>=n)continue;let c=i>=0&&i<=6&&a>=0&&a<=6&&(i===0||i===6||a===0||a===6),l=i>=2&&i<=4&&a>=2&&a<=4;e[o][s]=c||l}};r(0,0),r(0,n-7),r(n-7,0);for(let t=8;t<n-8;t++)e[6][t]=t%2==0,e[t][6]=t%2==0;let i=UC[t-1];for(let t of i)for(let r of i)if(!(t<=8&&r<=8||t<=8&&r>=n-9||t>=n-9&&r<=8))for(let n=-2;n<=2;n++)for(let i=-2;i<=2;i++)e[t+n][r+i]=Math.max(Math.abs(n),Math.abs(i))!==1;if(e[n-8][8]=!0,t>=7){let r=t<<12;for(let e=17;e>=12;e--)r>>e&1&&(r^=7973<<e-12);let i=t<<12|r&4095;for(let t=0;t<18;t++){let r=(i>>t&1)==1,a=n-11+t%3,o=t/3|0;e[a][o]=r,e[o][a]=r}}}function XC(e){let t=8|e,n=t;for(let e=0;e<10;e++)n=n<<1^(n>>9&1?1335:0);let r=(t<<10|n)^21522,i=[];for(let e=14;e>=0;e--)i.push((r>>e&1)==1);return i}function ZC(e,t){let n=RC[0]*0+e.length,r=XC(t);for(let t=0;t<=5;t++)e[8][t]=r[t];e[8][7]=r[6],e[8][8]=r[7],e[7][8]=r[8];for(let t=9;t<15;t++)e[14-t][8]=r[t];for(let t=0;t<7;t++)e[n-1-t][8]=r[t];e[8][n-8]=r[7];for(let t=8;t<15;t++)e[8][n-15+t]=r[t];e[n-8][8]=!0}function QC(e,t,n,r){let i=e.length;RC[n-1]*RC[n-1];let a=e=>((t[e>>3]??0)>>7-(e&7)&1)==1,o=0,s=!0;for(let t=i-1;t>0;t-=2){t===6&&t--;for(let c=0;c<i;c++){let l=s?i-1-c:c;for(let i of[t,t-1]){if(ew(l,i,n))continue;if(o>=(zC[n-1]+BC[n-1])*8){o++;continue}let t=a(o++);$C(l,i,r)&&(t=!t),e[l][i]=t}}s=!s}}function $C(e,t,n){switch(n){case 0:return(e+t)%2==0;case 1:return e%2==0;case 2:return t%3==0;case 3:return(e+t)%3==0;case 4:return(Math.floor(e/2)+Math.floor(t/3))%2==0;case 5:return e*t%2+e*t%3==0;case 6:return(e*t%2+e*t%3)%2==0;default:return((e+t)%2+e*t%3)%2==0}}function ew(e,t,n){let r=RC[n-1];if(e<=8&&t<=8||e<=8&&t>=r-8||e>=r-8&&t<=8||e===6||t===6||n>=7&&(e>=r-11&&e<=r-9&&t<=5||t>=r-11&&t<=r-9&&e<=5))return!0;let i=UC[n-1];for(let n of i)for(let a of i)if(!(n<=8&&a<=8||n<=8&&a>=r-9||n>=r-9&&a<=8)&&Math.abs(e-n)<=2&&Math.abs(t-a)<=2)return!0;return!1}function tw(e){let t=e.length,n=0;for(let r=0;r<2;r++)for(let i=0;i<t;i++){let a=1;for(let o=1;o<t;o++)(r===0?e[i][o]:e[o][i])===(r===0?e[i][o-1]:e[o-1][i])?(a++,o===t-1&&a>=5&&(n+=3+(a-5))):(a>=5&&(n+=3+(a-5)),a=1)}for(let r=0;r<t-1;r++)for(let i=0;i<t-1;i++){let t=e[r][i];e[r][i+1]===t&&e[r+1][i]===t&&e[r+1][i+1]===t&&(n+=3)}let r=[!0,!1,!0,!0,!0,!1,!0,!1,!1,!1,!1],i=(e,t)=>{for(let i=0;i+11<=t;i++){let t=!0;for(let n=0;n<11;n++)if(e(i+n)!==r[n]){t=!1;break}t&&(n+=40)}};for(let n=0;n<t;n++)i(t=>e[n][t],t);for(let n=0;n<t;n++)i(t=>e[t][n],t);let a=0;for(let t of e)for(let e of t)e&&a++;let o=a*100/(t*t);return n+=Math.floor(Math.abs(o-50)/5)*10,n}function nw(e,t){let n=GC(new TextEncoder().encode(e).length),r=RC[n-1],i=qC(n,KC(e,n)),a=JC(r);return YC(a,n),QC(a,i,n,t),ZC(a,t),a}function rw(e,t){if(t!==void 0)return nw(e,t);let n;for(let t=0;t<8;t++){let r=nw(e,t),i=tw(r);(!n||i<n.score)&&(n={m:r,score:i})}return n.m}function iw(e,t=160){let n=rw(e),r=n.length,i=t/(r+8),a=``;for(let e=0;e<r;e++)for(let t=0;t<r;t++)n[e][t]&&(a+=`<rect x="${((t+4)*i).toFixed(2)}" y="${((e+4)*i).toFixed(2)}" width="${i.toFixed(3)}" height="${i.toFixed(3)}"/>`);return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${t} ${t}" shape-rendering="crispEdges"><rect width="${t}" height="${t}" fill="#fff"/><g fill="#000">${a}</g></svg>`}var aw={class:`device-handoff`,"aria-label":`Pair this machine`},ow={class:`row`},sw=[`disabled`],cw=[`disabled`],lw={key:0,class:`target`,"data-testid":`device-url`},uw={key:1,class:`err`},dw=Zg(Or({__name:`DeviceHandoff`,props:{offerFragment:{}},setup(e){let t=e,n=k(`4780`),r=k(!1),i=V(()=>{let e=/^\d{1,5}$/.test(n.value)?Number(n.value):0;if(!(!e||e<1||e>65535))return`http://127.0.0.1:${e}/pair#${t.offerFragment}`});function a(){let e=i.value;e&&window.open(e,`_blank`,`noopener`)}async function o(){let e=i.value;if(e)try{await navigator.clipboard.writeText(e),r.value=!0,setTimeout(()=>r.value=!1,1600)}catch{}}return(e,t)=>(P(),F(`section`,aw,[L(`header`,null,[R(A(Mc),{size:18}),t[1]||=L(`h3`,null,`Pair THIS machine`,-1)]),t[4]||=L(`p`,{class:`what`},[z(` If this browser runs on the device itself, open its local pairing page — the offer is relayed inside the link, nothing is sent to the hub. Start `),L(`code`,null,`dpi device`),z(` there first. `)],-1),L(`div`,ow,[L(`label`,null,[t[2]||=z(` local port `,-1),Un(L(`input`,{"onUpdate:modelValue":t[0]||=e=>n.value=e,inputmode:`numeric`,spellcheck:`false`,"aria-label":`Local dpi backend port`},null,512),[[xs,n.value]])]),L(`button`,{class:`primary`,type:`button`,disabled:!i.value,onClick:a},[R(A(dc),{size:15}),t[3]||=z(`Open the device page `,-1)],8,sw),L(`button`,{class:`secondary`,type:`button`,disabled:!i.value,onClick:o},[R(A(oc),{size:15}),z(E(r.value?`Copied`:`Copy link`),1)],8,cw)]),i.value?(P(),F(`p`,lw,E(i.value),1)):B(``,!0),i.value?B(``,!0):(P(),F(`p`,uw,`port must be 1–65535`))]))}}),[[`__scopeId`,`data-v-01884b7b`]]);function fw(e){return xw(e)&&!pw(e)&&!Tw(e)&&Symbol.asyncIterator in e}function pw(e){return Array.isArray(e)}function mw(e){return typeof e==`bigint`}function hw(e){return typeof e==`boolean`}function gw(e){return e instanceof globalThis.Date}function _w(e){return typeof e==`function`}function vw(e){return xw(e)&&!pw(e)&&!Tw(e)&&Symbol.iterator in e}function yw(e){return e===null}function bw(e){return typeof e==`number`}function xw(e){return typeof e==`object`&&!!e}function Sw(e){return e instanceof globalThis.RegExp}function Cw(e){return typeof e==`string`}function ww(e){return typeof e==`symbol`}function Tw(e){return e instanceof globalThis.Uint8Array}function Ew(e){return e===void 0}function Dw(e){return e.map(e=>Mw(e))}function Ow(e){return new Date(e.getTime())}function kw(e){return new Uint8Array(e)}function Aw(e){return new RegExp(e.source,e.flags)}function jw(e){let t={};for(let n of Object.getOwnPropertyNames(e))t[n]=Mw(e[n]);for(let n of Object.getOwnPropertySymbols(e))t[n]=Mw(e[n]);return t}function Mw(e){return pw(e)?Dw(e):gw(e)?Ow(e):Tw(e)?kw(e):Sw(e)?Aw(e):xw(e)?jw(e):e}function Nw(e){return Mw(e)}function Pw(e,t){return Nw(t===void 0?e:{...t,...e})}function Fw(e){return typeof e==`object`&&!!e}function Iw(e){return globalThis.Array.isArray(e)&&!globalThis.ArrayBuffer.isView(e)}function Lw(e){return e===void 0}function Rw(e){return typeof e==`number`}var zw;(function(e){e.InstanceMode=`default`,e.ExactOptionalPropertyTypes=!1,e.AllowArrayObject=!1,e.AllowNaN=!1,e.AllowNullVoid=!1;function t(t,n){return e.ExactOptionalPropertyTypes?n in t:t[n]!==void 0}e.IsExactOptionalProperty=t;function n(t){let n=Fw(t);return e.AllowArrayObject?n:n&&!Iw(t)}e.IsObjectLike=n;function r(e){return n(e)&&!(e instanceof Date)&&!(e instanceof Uint8Array)}e.IsRecordLike=r;function i(t){return e.AllowNaN?Rw(t):Number.isFinite(t)}e.IsNumberLike=i;function a(t){let n=Lw(t);return e.AllowNullVoid?n||t===null:n}e.IsVoidLike=a})(zw||={});function Bw(e){return globalThis.Object.freeze(e).map(e=>Gw(e))}function Vw(e){return e}function Hw(e){return e}function Uw(e){return e}function Ww(e){let t={};for(let n of Object.getOwnPropertyNames(e))t[n]=Gw(e[n]);for(let n of Object.getOwnPropertySymbols(e))t[n]=Gw(e[n]);return globalThis.Object.freeze(t)}function Gw(e){return pw(e)?Bw(e):gw(e)?Vw(e):Tw(e)?Hw(e):Sw(e)?Uw(e):xw(e)?Ww(e):e}function J(e,t){let n=t===void 0?e:{...t,...e};switch(zw.InstanceMode){case`freeze`:return Gw(n);case`clone`:return Nw(n);default:return n}}var Kw=class extends Error{constructor(e){super(e)}},qw=Symbol.for(`TypeBox.Transform`),Jw=Symbol.for(`TypeBox.Readonly`),Yw=Symbol.for(`TypeBox.Optional`),Xw=Symbol.for(`TypeBox.Hint`),Y=Symbol.for(`TypeBox.Kind`);function Zw(e){return xw(e)&&e[Jw]===`Readonly`}function Qw(e){return xw(e)&&e[Yw]===`Optional`}function $w(e){return X(e,`Any`)}function eT(e){return X(e,`Argument`)}function tT(e){return X(e,`Array`)}function nT(e){return X(e,`AsyncIterator`)}function rT(e){return X(e,`BigInt`)}function iT(e){return X(e,`Boolean`)}function aT(e){return X(e,`Computed`)}function oT(e){return X(e,`Constructor`)}function sT(e){return X(e,`Date`)}function cT(e){return X(e,`Function`)}function lT(e){return X(e,`Integer`)}function uT(e){return X(e,`Intersect`)}function dT(e){return X(e,`Iterator`)}function X(e,t){return xw(e)&&Y in e&&e[Y]===t}function fT(e){return hw(e)||bw(e)||Cw(e)}function pT(e){return X(e,`Literal`)}function mT(e){return X(e,`MappedKey`)}function hT(e){return X(e,`MappedResult`)}function gT(e){return X(e,`Never`)}function _T(e){return X(e,`Not`)}function vT(e){return X(e,`Null`)}function yT(e){return X(e,`Number`)}function bT(e){return X(e,`Object`)}function xT(e){return X(e,`Promise`)}function ST(e){return X(e,`Record`)}function CT(e){return X(e,`Ref`)}function wT(e){return X(e,`RegExp`)}function TT(e){return X(e,`String`)}function ET(e){return X(e,`Symbol`)}function DT(e){return X(e,`TemplateLiteral`)}function OT(e){return X(e,`This`)}function kT(e){return xw(e)&&qw in e}function AT(e){return X(e,`Tuple`)}function jT(e){return X(e,`Undefined`)}function MT(e){return X(e,`Union`)}function NT(e){return X(e,`Uint8Array`)}function PT(e){return X(e,`Unknown`)}function FT(e){return X(e,`Unsafe`)}function IT(e){return X(e,`Void`)}function LT(e){return xw(e)&&Y in e&&Cw(e[Y])}function RT(e){return $w(e)||eT(e)||tT(e)||iT(e)||rT(e)||nT(e)||aT(e)||oT(e)||sT(e)||cT(e)||lT(e)||uT(e)||dT(e)||pT(e)||mT(e)||hT(e)||gT(e)||_T(e)||vT(e)||yT(e)||bT(e)||xT(e)||ST(e)||CT(e)||wT(e)||TT(e)||ET(e)||DT(e)||OT(e)||AT(e)||jT(e)||MT(e)||NT(e)||PT(e)||FT(e)||IT(e)||LT(e)}var zT=`Argument.Any.Array.AsyncIterator.BigInt.Boolean.Computed.Constructor.Date.Enum.Function.Integer.Intersect.Iterator.Literal.MappedKey.MappedResult.Not.Null.Number.Object.Promise.Record.Ref.RegExp.String.Symbol.TemplateLiteral.This.Tuple.Undefined.Union.Uint8Array.Unknown.Void`.split(`.`);function BT(e){try{return new RegExp(e),!0}catch{return!1}}function VT(e){if(!Cw(e))return!1;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n>=7&&n<=13||n===27||n===127)return!1}return!0}function HT(e){return GT(e)||BE(e)}function UT(e){return Ew(e)||mw(e)}function WT(e){return Ew(e)||bw(e)}function GT(e){return Ew(e)||hw(e)}function KT(e){return Ew(e)||Cw(e)}function qT(e){return Ew(e)||Cw(e)&&VT(e)&&BT(e)}function JT(e){return Ew(e)||Cw(e)&&VT(e)}function YT(e){return Ew(e)||BE(e)}function XT(e){return xw(e)&&e[Yw]===`Optional`}function ZT(e){return Z(e,`Any`)&&KT(e.$id)}function QT(e){return Z(e,`Argument`)&&bw(e.index)}function $T(e){return Z(e,`Array`)&&e.type===`array`&&KT(e.$id)&&BE(e.items)&&WT(e.minItems)&&WT(e.maxItems)&>(e.uniqueItems)&&YT(e.contains)&&WT(e.minContains)&&WT(e.maxContains)}function eE(e){return Z(e,`AsyncIterator`)&&e.type===`AsyncIterator`&&KT(e.$id)&&BE(e.items)}function tE(e){return Z(e,`BigInt`)&&e.type===`bigint`&&KT(e.$id)&&UT(e.exclusiveMaximum)&&UT(e.exclusiveMinimum)&&UT(e.maximum)&&UT(e.minimum)&&UT(e.multipleOf)}function nE(e){return Z(e,`Boolean`)&&e.type===`boolean`&&KT(e.$id)}function rE(e){return Z(e,`Computed`)&&Cw(e.target)&&pw(e.parameters)&&e.parameters.every(e=>BE(e))}function iE(e){return Z(e,`Constructor`)&&e.type===`Constructor`&&KT(e.$id)&&pw(e.parameters)&&e.parameters.every(e=>BE(e))&&BE(e.returns)}function aE(e){return Z(e,`Date`)&&e.type===`Date`&&KT(e.$id)&&WT(e.exclusiveMaximumTimestamp)&&WT(e.exclusiveMinimumTimestamp)&&WT(e.maximumTimestamp)&&WT(e.minimumTimestamp)&&WT(e.multipleOfTimestamp)}function oE(e){return Z(e,`Function`)&&e.type===`Function`&&KT(e.$id)&&pw(e.parameters)&&e.parameters.every(e=>BE(e))&&BE(e.returns)}function sE(e){return Z(e,`Integer`)&&e.type===`integer`&&KT(e.$id)&&WT(e.exclusiveMaximum)&&WT(e.exclusiveMinimum)&&WT(e.maximum)&&WT(e.minimum)&&WT(e.multipleOf)}function cE(e){return xw(e)&&Object.entries(e).every(([e,t])=>VT(e)&&BE(t))}function lE(e){return Z(e,`Intersect`)&&!(Cw(e.type)&&e.type!==`object`)&&pw(e.allOf)&&e.allOf.every(e=>BE(e)&&!jE(e))&&KT(e.type)&&(GT(e.unevaluatedProperties)||YT(e.unevaluatedProperties))&&KT(e.$id)}function uE(e){return Z(e,`Iterator`)&&e.type===`Iterator`&&KT(e.$id)&&BE(e.items)}function Z(e,t){return xw(e)&&Y in e&&e[Y]===t}function dE(e){return mE(e)&&Cw(e.const)}function fE(e){return mE(e)&&bw(e.const)}function pE(e){return mE(e)&&hw(e.const)}function mE(e){return Z(e,`Literal`)&&KT(e.$id)&&hE(e.const)}function hE(e){return hw(e)||bw(e)||Cw(e)}function gE(e){return Z(e,`MappedKey`)&&pw(e.keys)&&e.keys.every(e=>bw(e)||Cw(e))}function _E(e){return Z(e,`MappedResult`)&&cE(e.properties)}function vE(e){return Z(e,`Never`)&&xw(e.not)&&Object.getOwnPropertyNames(e.not).length===0}function yE(e){return Z(e,`Not`)&&BE(e.not)}function bE(e){return Z(e,`Null`)&&e.type===`null`&&KT(e.$id)}function xE(e){return Z(e,`Number`)&&e.type===`number`&&KT(e.$id)&&WT(e.exclusiveMaximum)&&WT(e.exclusiveMinimum)&&WT(e.maximum)&&WT(e.minimum)&&WT(e.multipleOf)}function SE(e){return Z(e,`Object`)&&e.type===`object`&&KT(e.$id)&&cE(e.properties)&&HT(e.additionalProperties)&&WT(e.minProperties)&&WT(e.maxProperties)}function CE(e){return Z(e,`Promise`)&&e.type===`Promise`&&KT(e.$id)&&BE(e.item)}function wE(e){return Z(e,`Record`)&&e.type===`object`&&KT(e.$id)&&HT(e.additionalProperties)&&xw(e.patternProperties)&&(e=>{let t=Object.getOwnPropertyNames(e.patternProperties);return t.length===1&&BT(t[0])&&xw(e.patternProperties)&&BE(e.patternProperties[t[0]])})(e)}function TE(e){return Z(e,`Ref`)&&KT(e.$id)&&Cw(e.$ref)}function EE(e){return Z(e,`RegExp`)&&KT(e.$id)&&Cw(e.source)&&Cw(e.flags)&&WT(e.maxLength)&&WT(e.minLength)}function DE(e){return Z(e,`String`)&&e.type===`string`&&KT(e.$id)&&WT(e.minLength)&&WT(e.maxLength)&&qT(e.pattern)&&JT(e.format)}function OE(e){return Z(e,`Symbol`)&&e.type===`symbol`&&KT(e.$id)}function kE(e){return Z(e,`TemplateLiteral`)&&e.type===`string`&&Cw(e.pattern)&&e.pattern[0]===`^`&&e.pattern[e.pattern.length-1]===`$`}function AE(e){return Z(e,`This`)&&KT(e.$id)&&Cw(e.$ref)}function jE(e){return xw(e)&&qw in e}function ME(e){return Z(e,`Tuple`)&&e.type===`array`&&KT(e.$id)&&bw(e.minItems)&&bw(e.maxItems)&&e.minItems===e.maxItems&&(Ew(e.items)&&Ew(e.additionalItems)&&e.minItems===0||pw(e.items)&&e.items.every(e=>BE(e)))}function NE(e){return Z(e,`Undefined`)&&e.type===`undefined`&&KT(e.$id)}function PE(e){return Z(e,`Union`)&&KT(e.$id)&&xw(e)&&pw(e.anyOf)&&e.anyOf.every(e=>BE(e))}function FE(e){return Z(e,`Uint8Array`)&&e.type===`Uint8Array`&&KT(e.$id)&&WT(e.minByteLength)&&WT(e.maxByteLength)}function IE(e){return Z(e,`Unknown`)&&KT(e.$id)}function LE(e){return Z(e,`Unsafe`)}function RE(e){return Z(e,`Void`)&&e.type===`void`&&KT(e.$id)}function zE(e){return xw(e)&&Y in e&&Cw(e[Y])&&!zT.includes(e[Y])}function BE(e){return xw(e)&&(ZT(e)||QT(e)||$T(e)||nE(e)||tE(e)||eE(e)||rE(e)||iE(e)||aE(e)||oE(e)||sE(e)||lE(e)||uE(e)||mE(e)||gE(e)||_E(e)||vE(e)||yE(e)||bE(e)||xE(e)||SE(e)||CE(e)||wE(e)||TE(e)||EE(e)||DE(e)||OE(e)||kE(e)||AE(e)||ME(e)||NE(e)||PE(e)||FE(e)||IE(e)||LE(e)||RE(e)||zE(e))}var VE=`(true|false)`,HE=`(0|[1-9][0-9]*)`,UE=`(.*)`,WE=`(?!.*)`;`${VE}`;var GE=`^${HE}$`,KE=`^${UE}$`,qE=`^${WE}$`;function JE(e,t){return e.includes(t)}function YE(e){return[...new Set(e)]}function XE(e,t){return e.filter(e=>t.includes(e))}function ZE(e,t){return e.reduce((e,t)=>XE(e,t),t)}function QE(e){return e.length===1?e[0]:e.length>1?ZE(e.slice(1),e[0]):[]}function $E(e){let t=[];for(let n of e)t.push(...n);return t}function eD(e){return J({[Y]:`Any`},e)}function tD(e,t){return J({[Y]:`Array`,type:`array`,items:e},t)}function nD(e){return J({[Y]:`Argument`,index:e})}function rD(e,t){return J({[Y]:`AsyncIterator`,type:`AsyncIterator`,items:e},t)}function iD(e,t,n){return J({[Y]:`Computed`,target:e,parameters:t},n)}function aD(e,t){let{[t]:n,...r}=e;return r}function oD(e,t){return t.reduce((e,t)=>aD(e,t),e)}function sD(e){return J({[Y]:`Never`,not:{}},e)}function cD(e){return J({[Y]:`MappedResult`,properties:e})}function lD(e,t,n){return J({[Y]:`Constructor`,type:`Constructor`,parameters:e,returns:t},n)}function uD(e,t,n){return J({[Y]:`Function`,type:`Function`,parameters:e,returns:t},n)}function dD(e,t){return J({[Y]:`Union`,anyOf:e},t)}function fD(e){return e.some(e=>Qw(e))}function pD(e){return e.map(e=>Qw(e)?mD(e):e)}function mD(e){return oD(e,[Yw])}function hD(e,t){return fD(e)?tk(dD(pD(e),t)):dD(pD(e),t)}function gD(e,t){return e.length===1?J(e[0],t):e.length===0?sD(t):hD(e,t)}function _D(e,t){return e.length===0?sD(t):e.length===1?J(e[0],t):dD(e,t)}var vD=class extends Kw{};function yD(e){return e.replace(/\\\$/g,`$`).replace(/\\\*/g,`*`).replace(/\\\^/g,`^`).replace(/\\\|/g,`|`).replace(/\\\(/g,`(`).replace(/\\\)/g,`)`)}function bD(e,t,n){return e[t]===n&&e.charCodeAt(t-1)!==92}function xD(e,t){return bD(e,t,`(`)}function SD(e,t){return bD(e,t,`)`)}function CD(e,t){return bD(e,t,`|`)}function wD(e){if(!(xD(e,0)&&SD(e,e.length-1)))return!1;let t=0;for(let n=0;n<e.length;n++)if(xD(e,n)&&(t+=1),SD(e,n)&&--t,t===0&&n!==e.length-1)return!1;return!0}function TD(e){return e.slice(1,e.length-1)}function ED(e){let t=0;for(let n=0;n<e.length;n++)if(xD(e,n)&&(t+=1),SD(e,n)&&--t,CD(e,n)&&t===0)return!0;return!1}function DD(e){for(let t=0;t<e.length;t++)if(xD(e,t))return!0;return!1}function OD(e){let[t,n]=[0,0],r=[];for(let i=0;i<e.length;i++)if(xD(e,i)&&(t+=1),SD(e,i)&&--t,CD(e,i)&&t===0){let t=e.slice(n,i);t.length>0&&r.push(AD(t)),n=i+1}let i=e.slice(n);return i.length>0&&r.push(AD(i)),r.length===0?{type:`const`,const:``}:r.length===1?r[0]:{type:`or`,expr:r}}function kD(e){function t(e,t){if(!xD(e,t))throw new vD(`TemplateLiteralParser: Index must point to open parens`);let n=0;for(let r=t;r<e.length;r++)if(xD(e,r)&&(n+=1),SD(e,r)&&--n,n===0)return[t,r];throw new vD(`TemplateLiteralParser: Unclosed group parens in expression`)}function n(e,t){for(let n=t;n<e.length;n++)if(xD(e,n))return[t,n];return[t,e.length]}let r=[];for(let i=0;i<e.length;i++)if(xD(e,i)){let[n,a]=t(e,i),o=e.slice(n,a+1);r.push(AD(o)),i=a}else{let[t,a]=n(e,i),o=e.slice(t,a);o.length>0&&r.push(AD(o)),i=a-1}return r.length===0?{type:`const`,const:``}:r.length===1?r[0]:{type:`and`,expr:r}}function AD(e){return wD(e)?AD(TD(e)):ED(e)?OD(e):DD(e)?kD(e):{type:`const`,const:yD(e)}}function jD(e){return AD(e.slice(1,e.length-1))}var MD=class extends Kw{};function ND(e){return e.type===`or`&&e.expr.length===2&&e.expr[0].type===`const`&&e.expr[0].const===`0`&&e.expr[1].type===`const`&&e.expr[1].const===`[1-9][0-9]*`}function PD(e){return e.type===`or`&&e.expr.length===2&&e.expr[0].type===`const`&&e.expr[0].const===`true`&&e.expr[1].type===`const`&&e.expr[1].const===`false`}function FD(e){return e.type===`const`&&e.const===`.*`}function ID(e){return ND(e)||FD(e)?!1:PD(e)?!0:e.type===`and`||e.type===`or`?e.expr.every(e=>ID(e)):e.type===`const`||(()=>{throw new MD(`Unknown expression type`)})()}function LD(e){return ID(jD(e.pattern))}var RD=class extends Kw{};function*zD(e){if(e.length===1)return yield*e[0];for(let t of e[0])for(let n of zD(e.slice(1)))yield`${t}${n}`}function*BD(e){return yield*zD(e.expr.map(e=>[...UD(e)]))}function*VD(e){for(let t of e.expr)yield*UD(t)}function*HD(e){return yield e.const}function*UD(e){return e.type===`and`?yield*BD(e):e.type===`or`?yield*VD(e):e.type===`const`?yield*HD(e):(()=>{throw new RD(`Unknown expression`)})()}function WD(e){let t=jD(e.pattern);return ID(t)?[...UD(t)]:[]}function GD(e,t){return J({[Y]:`Literal`,const:e,type:typeof e},t)}function KD(e){return J({[Y]:`Boolean`,type:`boolean`},e)}function qD(e){return J({[Y]:`BigInt`,type:`bigint`},e)}function JD(e){return J({[Y]:`Number`,type:`number`},e)}function YD(e){return J({[Y]:`String`,type:`string`},e)}function*XD(e){let t=e.trim().replace(/"|'/g,``);return t===`boolean`?yield KD():t===`number`?yield JD():t===`bigint`?yield qD():t===`string`?yield YD():yield(()=>{let e=t.split(`|`).map(e=>GD(e.trim()));return e.length===0?sD():e.length===1?e[0]:gD(e)})()}function*ZD(e){if(e[1]!==`{`)return yield*[GD(`$`),...QD(e.slice(1))];for(let t=2;t<e.length;t++)if(e[t]===`}`){let n=XD(e.slice(2,t)),r=QD(e.slice(t+1));return yield*[...n,...r]}yield GD(e)}function*QD(e){for(let t=0;t<e.length;t++)if(e[t]===`$`)return yield*[GD(e.slice(0,t)),...ZD(e.slice(t))];yield GD(e)}function $D(e){return[...QD(e)]}var eO=class extends Kw{};function tO(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function nO(e,t){return DT(e)?e.pattern.slice(1,e.pattern.length-1):MT(e)?`(${e.anyOf.map(e=>nO(e,t)).join(`|`)})`:yT(e)||lT(e)||rT(e)?`${t}${HE}`:TT(e)?`${t}${UE}`:pT(e)?`${t}${tO(e.const.toString())}`:iT(e)?`${t}${VE}`:(()=>{throw new eO(`Unexpected Kind '${e[Y]}'`)})()}function rO(e){return`^${e.map(e=>nO(e,``)).join(``)}$`}function iO(e){return gD(WD(e).map(e=>GD(e)))}function aO(e,t){let n=Cw(e)?rO($D(e)):rO(e);return J({[Y]:`TemplateLiteral`,type:`string`,pattern:n},t)}function oO(e){return WD(e).map(e=>e.toString())}function sO(e){let t=[];for(let n of e)t.push(...lO(n));return t}function cO(e){return[e.toString()]}function lO(e){return[...new Set(DT(e)?oO(e):MT(e)?sO(e.anyOf):pT(e)?cO(e.const):yT(e)||lT(e)?[`[number]`]:[])]}function uO(e,t,n){let r={};for(let i of Object.getOwnPropertyNames(t))r[i]=wO(e,lO(t[i]),n);return r}function dO(e,t,n){return uO(e,t.properties,n)}function fO(e,t,n){return cD(dO(e,t,n))}function pO(e,t){return e.map(e=>xO(e,t))}function mO(e){return e.filter(e=>!gT(e))}function hO(e,t){return uk(mO(pO(e,t)))}function gO(e){return e.some(e=>gT(e))?[]:e}function _O(e,t){return gD(gO(pO(e,t)))}function vO(e,t){return t in e?e[t]:t===`[number]`?gD(e):sD()}function yO(e,t){return t===`[number]`?e:sD()}function bO(e,t){return t in e?e[t]:sD()}function xO(e,t){return uT(e)?hO(e.allOf,t):MT(e)?_O(e.anyOf,t):AT(e)?vO(e.items??[],t):tT(e)?yO(e.items,t):bT(e)?bO(e.properties,t):sD()}function SO(e,t){return t.map(t=>xO(e,t))}function CO(e,t){return gD(SO(e,t))}function wO(e,t,n){if(CT(e)||CT(t)){if(!RT(e)||!RT(t))throw new Kw(`Index types using Ref parameters require both Type and Key to be of TSchema`);return iD(`Index`,[e,t])}return hT(t)?fO(e,t,n):mT(t)?OO(e,t,n):J(RT(t)?CO(e,lO(t)):CO(e,t),n)}function TO(e,t,n){return{[t]:wO(e,[t],Nw(n))}}function EO(e,t,n){return t.reduce((t,r)=>({...t,...TO(e,r,n)}),{})}function DO(e,t,n){return EO(e,t.keys,n)}function OO(e,t,n){return cD(DO(e,t,n))}function kO(e,t){return J({[Y]:`Iterator`,type:`Iterator`,items:e},t)}function AO(e){return globalThis.Object.keys(e).filter(t=>!Qw(e[t]))}function jO(e,t){let n=AO(e);return J(n.length>0?{[Y]:`Object`,type:`object`,required:n,properties:e}:{[Y]:`Object`,type:`object`,properties:e},t)}var MO=jO;function NO(e,t){return J({[Y]:`Promise`,type:`Promise`,item:e},t)}function PO(e){return J(oD(e,[Jw]))}function FO(e){return J({...e,[Jw]:`Readonly`})}function IO(e,t){return t===!1?PO(e):FO(e)}function LO(e,t){let n=t??!0;return hT(e)?BO(e,n):IO(e,n)}function RO(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=LO(e[r],t);return n}function zO(e,t){return RO(e.properties,t)}function BO(e,t){return cD(zO(e,t))}function VO(e,t){return J(e.length>0?{[Y]:`Tuple`,type:`array`,items:e,additionalItems:!1,minItems:e.length,maxItems:e.length}:{[Y]:`Tuple`,type:`array`,minItems:e.length,maxItems:e.length},t)}function HO(e,t){return e in t?YO(e,t[e]):cD(t)}function UO(e){return{[e]:GD(e)}}function WO(e){let t={};for(let n of e)t[n]=GD(n);return t}function GO(e,t){return JE(t,e)?UO(e):WO(t)}function KO(e,t){return HO(e,GO(e,t))}function qO(e,t){return t.map(t=>YO(e,t))}function JO(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=YO(e,t[r]);return n}function YO(e,t){let n={...t};return Qw(t)?tk(YO(e,oD(t,[Yw]))):Zw(t)?LO(YO(e,oD(t,[Jw]))):hT(t)?HO(e,t.properties):mT(t)?KO(e,t.keys):oT(t)?lD(qO(e,t.parameters),YO(e,t.returns),n):cT(t)?uD(qO(e,t.parameters),YO(e,t.returns),n):nT(t)?rD(YO(e,t.items),n):dT(t)?kO(YO(e,t.items),n):uT(t)?dk(qO(e,t.allOf),n):MT(t)?_D(qO(e,t.anyOf),n):AT(t)?VO(qO(e,t.items??[]),n):bT(t)?MO(JO(e,t.properties),n):tT(t)?tD(YO(e,t.items),n):xT(t)?NO(YO(e,t.item),n):t}function XO(e,t){let n={};for(let r of e)n[r]=YO(r,t);return n}function ZO(e,t,n){let r=RT(e)?lO(e):e;return MO(XO(r,t({[Y]:`MappedKey`,keys:r})),n)}function QO(e){return J(oD(e,[Yw]))}function $O(e){return J({...e,[Yw]:`Optional`})}function ek(e,t){return t===!1?QO(e):$O(e)}function tk(e,t){let n=t??!0;return hT(e)?ik(e,n):ek(e,n)}function nk(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=tk(e[r],t);return n}function rk(e,t){return nk(e.properties,t)}function ik(e,t){return cD(rk(e,t))}function ak(e,t={}){let n=e.every(e=>bT(e)),r=RT(t.unevaluatedProperties)?{unevaluatedProperties:t.unevaluatedProperties}:{};return J(t.unevaluatedProperties===!1||RT(t.unevaluatedProperties)||n?{...r,[Y]:`Intersect`,type:`object`,allOf:e}:{...r,[Y]:`Intersect`,allOf:e},t)}function ok(e){return e.every(e=>Qw(e))}function sk(e){return oD(e,[Yw])}function ck(e){return e.map(e=>Qw(e)?sk(e):e)}function lk(e,t){return ok(e)?tk(ak(ck(e),t)):ak(ck(e),t)}function uk(e,t={}){if(e.length===1)return J(e[0],t);if(e.length===0)return sD(t);if(e.some(e=>kT(e)))throw Error(`Cannot intersect transform types`);return lk(e,t)}function dk(e,t){if(e.length===1)return J(e[0],t);if(e.length===0)return sD(t);if(e.some(e=>kT(e)))throw Error(`Cannot intersect transform types`);return ak(e,t)}function fk(...e){let[t,n]=typeof e[0]==`string`?[e[0],e[1]]:[e[0].$id,e[1]];if(typeof t!=`string`)throw new Kw(`Ref: $ref must be a string`);return J({[Y]:`Ref`,$ref:t},n)}function pk(e,t){return iD(`Awaited`,[iD(e,t)])}function mk(e){return iD(`Awaited`,[fk(e)])}function hk(e){return dk(vk(e))}function gk(e){return _D(vk(e))}function _k(e){return yk(e)}function vk(e){return e.map(e=>yk(e))}function yk(e,t){return J(aT(e)?pk(e.target,e.parameters):uT(e)?hk(e.allOf):MT(e)?gk(e.anyOf):xT(e)?_k(e.item):CT(e)?mk(e.$ref):e,t)}function bk(e){let t=[];for(let n of e)t.push(Dk(n));return t}function xk(e){return $E(bk(e))}function Sk(e){return QE(bk(e))}function Ck(e){return e.map((e,t)=>t.toString())}function wk(e){return[`[number]`]}function Tk(e){return globalThis.Object.getOwnPropertyNames(e)}function Ek(e){return Ok?globalThis.Object.getOwnPropertyNames(e).map(e=>e[0]===`^`&&e[e.length-1]===`$`?e.slice(1,e.length-1):e):[]}function Dk(e){return uT(e)?xk(e.allOf):MT(e)?Sk(e.anyOf):AT(e)?Ck(e.items??[]):tT(e)?wk(e.items):bT(e)?Tk(e.properties):ST(e)?Ek(e.patternProperties):[]}var Ok=!1;function kk(e,t){return iD(`KeyOf`,[iD(e,t)])}function Ak(e){return iD(`KeyOf`,[fk(e)])}function jk(e,t){return J(gD(Mk(Dk(e))),t)}function Mk(e){return e.map(e=>e===`[number]`?JD():GD(e))}function Nk(e,t){return aT(e)?kk(e.target,e.parameters):CT(e)?Ak(e.$ref):hT(e)?Ik(e,t):jk(e,t)}function Pk(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=Nk(e[r],Nw(t));return n}function Fk(e,t){return Pk(e.properties,t)}function Ik(e,t){return cD(Fk(e,t))}function Lk(e){let t=[];for(let n of e)t.push(...Dk(n));return YE(t)}function Rk(e){return e.filter(e=>!gT(e))}function zk(e,t){let n=[];for(let r of e)n.push(...SO(r,[t]));return Rk(n)}function Bk(e,t){let n={};for(let r of t)n[r]=uk(zk(e,r));return n}function Vk(e,t){return MO(Bk(e,Lk(e)),t)}function Hk(e){return J({[Y]:`Date`,type:`Date`},e)}function Uk(e){return J({[Y]:`Null`,type:`null`},e)}function Wk(e){return J({[Y]:`Symbol`,type:`symbol`},e)}function Gk(e){return J({[Y]:`Undefined`,type:`undefined`},e)}function Kk(e){return J({[Y]:`Uint8Array`,type:`Uint8Array`},e)}function qk(e){return J({[Y]:`Unknown`},e)}function Jk(e){return e.map(e=>Zk(e,!1))}function Yk(e){let t={};for(let n of globalThis.Object.getOwnPropertyNames(e))t[n]=LO(Zk(e[n],!1));return t}function Xk(e,t){return t===!0?e:LO(e)}function Zk(e,t){return fw(e)||vw(e)?Xk(eD(),t):pw(e)?LO(VO(Jk(e))):Tw(e)?Kk():gw(e)?Hk():xw(e)?Xk(MO(Yk(e)),t):_w(e)?Xk(uD([],qk()),t):Ew(e)?Gk():yw(e)?Uk():ww(e)?Wk():mw(e)?qD():bw(e)||hw(e)||Cw(e)?GD(e):MO({})}function Qk(e,t){return J(Zk(e,!0),t)}function $k(e,t){return oT(e)?VO(e.parameters,t):sD(t)}function eA(e,t){if(Ew(e))throw Error(`Enum undefined or empty`);let n=globalThis.Object.getOwnPropertyNames(e).filter(e=>isNaN(e)).map(t=>e[t]);return _D([...new Set(n)].map(e=>GD(e)),{...t,[Xw]:`Enum`})}var tA=class extends Kw{},Q;(function(e){e[e.Union=0]=`Union`,e[e.True=1]=`True`,e[e.False=2]=`False`})(Q||={});function nA(e){return e===Q.False?e:Q.True}function rA(e){throw new tA(e)}function iA(e){return vE(e)||lE(e)||PE(e)||IE(e)||ZT(e)}function aA(e,t){return vE(t)?CA(e,t):lE(t)?yA(e,t):PE(t)?oj(e,t):IE(t)?cj(e,t):ZT(t)?oA(e,t):rA(`StructuralRight`)}function oA(e,t){return Q.True}function sA(e,t){return lE(t)?yA(e,t):PE(t)&&t.anyOf.some(e=>ZT(e)||IE(e))?Q.True:PE(t)?Q.Union:IE(t)||ZT(t)?Q.True:Q.Union}function cA(e,t){return IE(e)?Q.False:ZT(e)?Q.Union:vE(e)?Q.True:Q.False}function lA(e,t){return SE(t)&&BA(t)?Q.True:iA(t)?aA(e,t):$T(t)?nA(fj(e.items,t.items)):Q.False}function uA(e,t){return iA(t)?aA(e,t):eE(t)?nA(fj(e.items,t.items)):Q.False}function dA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):tE(t)?Q.True:Q.False}function fA(e,t){return pE(e)||nE(e)?Q.True:Q.False}function pA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):nE(t)?Q.True:Q.False}function mA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):iE(t)?e.parameters.length>t.parameters.length?Q.False:e.parameters.every((e,n)=>nA(fj(t.parameters[n],e))===Q.True)?nA(fj(e.returns,t.returns)):Q.False:Q.False}function hA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):aE(t)?Q.True:Q.False}function gA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):oE(t)?e.parameters.length>t.parameters.length?Q.False:e.parameters.every((e,n)=>nA(fj(t.parameters[n],e))===Q.True)?nA(fj(e.returns,t.returns)):Q.False:Q.False}function _A(e,t){return mE(e)&&bw(e.const)||xE(e)||sE(e)?Q.True:Q.False}function vA(e,t){return sE(t)||xE(t)?Q.True:iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):Q.False}function yA(e,t){return t.allOf.every(t=>fj(e,t)===Q.True)?Q.True:Q.False}function bA(e,t){return e.allOf.some(e=>fj(e,t)===Q.True)?Q.True:Q.False}function xA(e,t){return iA(t)?aA(e,t):uE(t)?nA(fj(e.items,t.items)):Q.False}function SA(e,t){return mE(t)&&t.const===e.const?Q.True:iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):DE(t)?ZA(e,t):xE(t)?OA(e,t):sE(t)?_A(e,t):nE(t)?fA(e,t):Q.False}function CA(e,t){return Q.False}function wA(e,t){return Q.True}function TA(e){let[t,n]=[e,0];for(;yE(t);)t=t.not,n+=1;return n%2==0?t:qk()}function EA(e,t){return yE(e)?fj(TA(e),t):yE(t)?fj(e,TA(t)):rA(`Invalid fallthrough for Not`)}function DA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):bE(t)?Q.True:Q.False}function OA(e,t){return fE(e)||xE(e)||sE(e)?Q.True:Q.False}function kA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):sE(t)||xE(t)?Q.True:Q.False}function AA(e,t){return Object.getOwnPropertyNames(e.properties).length===t}function jA(e){return BA(e)}function MA(e){return AA(e,0)||AA(e,1)&&`description`in e.properties&&PE(e.properties.description)&&e.properties.description.anyOf.length===2&&(DE(e.properties.description.anyOf[0])&&NE(e.properties.description.anyOf[1])||DE(e.properties.description.anyOf[1])&&NE(e.properties.description.anyOf[0]))}function NA(e){return AA(e,0)}function PA(e){return AA(e,0)}function FA(e){return AA(e,0)}function IA(e){return AA(e,0)}function LA(e){return BA(e)}function RA(e){let t=JD();return AA(e,0)||AA(e,1)&&`length`in e.properties&&nA(fj(e.properties.length,t))===Q.True}function zA(e){return AA(e,0)}function BA(e){let t=JD();return AA(e,0)||AA(e,1)&&`length`in e.properties&&nA(fj(e.properties.length,t))===Q.True}function VA(e){let t=uD([eD()],eD());return AA(e,0)||AA(e,1)&&`then`in e.properties&&nA(fj(e.properties.then,t))===Q.True}function HA(e,t){return fj(e,t)===Q.False||XT(e)&&!XT(t)?Q.False:Q.True}function UA(e,t){return IE(e)?Q.False:ZT(e)?Q.Union:vE(e)||dE(e)&&jA(t)||fE(e)&&NA(t)||pE(e)&&PA(t)||OE(e)&&MA(t)||tE(e)&&FA(t)||DE(e)&&jA(t)||OE(e)&&MA(t)||xE(e)&&NA(t)||sE(e)&&NA(t)||nE(e)&&PA(t)||FE(e)&&LA(t)||aE(e)&&IA(t)||iE(e)&&zA(t)||oE(e)&&RA(t)?Q.True:wE(e)&&DE(KA(e))?t[Xw]===`Record`?Q.True:Q.False:wE(e)&&xE(KA(e))&&AA(t,0)?Q.True:Q.False}function WA(e,t){return iA(t)?aA(e,t):wE(t)?JA(e,t):SE(t)?(()=>{for(let n of Object.getOwnPropertyNames(t.properties)){if(!(n in e.properties)&&!XT(t.properties[n]))return Q.False;if(XT(t.properties[n]))return Q.True;if(HA(e.properties[n],t.properties[n])===Q.False)return Q.False}return Q.True})():Q.False}function GA(e,t){return iA(t)?aA(e,t):SE(t)&&VA(t)?Q.True:CE(t)?nA(fj(e.item,t.item)):Q.False}function KA(e){return GE in e.patternProperties?JD():KE in e.patternProperties?YD():rA(`Unknown record key pattern`)}function qA(e){return GE in e.patternProperties?e.patternProperties[GE]:KE in e.patternProperties?e.patternProperties[KE]:rA(`Unable to get record value schema`)}function JA(e,t){let[n,r]=[KA(t),qA(t)];return dE(e)&&xE(n)&&nA(fj(e,r))===Q.True?Q.True:FE(e)&&xE(n)||DE(e)&&xE(n)||$T(e)&&xE(n)?fj(e,r):SE(e)?(()=>{for(let t of Object.getOwnPropertyNames(e.properties))if(HA(r,e.properties[t])===Q.False)return Q.False;return Q.True})():Q.False}function YA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?fj(qA(e),qA(t)):Q.False}function XA(e,t){return fj(EE(e)?YD():e,EE(t)?YD():t)}function ZA(e,t){return mE(e)&&Cw(e.const)||DE(e)?Q.True:Q.False}function QA(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):DE(t)?Q.True:Q.False}function $A(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):OE(t)?Q.True:Q.False}function ej(e,t){return kE(e)?fj(iO(e),t):kE(t)?fj(e,iO(t)):rA(`Invalid fallthrough for TemplateLiteral`)}function tj(e,t){return $T(t)&&e.items!==void 0&&e.items.every(e=>fj(e,t.items)===Q.True)}function nj(e,t){return vE(e)?Q.True:IE(e)?Q.False:ZT(e)?Q.Union:Q.False}function rj(e,t){return iA(t)?aA(e,t):SE(t)&&BA(t)||$T(t)&&tj(e,t)?Q.True:ME(t)?Ew(e.items)&&!Ew(t.items)||!Ew(e.items)&&Ew(t.items)?Q.False:Ew(e.items)&&!Ew(t.items)||e.items.every((e,n)=>fj(e,t.items[n])===Q.True)?Q.True:Q.False:Q.False}function ij(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):FE(t)?Q.True:Q.False}function aj(e,t){return iA(t)?aA(e,t):SE(t)?UA(e,t):wE(t)?JA(e,t):RE(t)?uj(e,t):NE(t)?Q.True:Q.False}function oj(e,t){return t.anyOf.some(t=>fj(e,t)===Q.True)?Q.True:Q.False}function sj(e,t){return e.anyOf.every(e=>fj(e,t)===Q.True)?Q.True:Q.False}function cj(e,t){return Q.True}function lj(e,t){return vE(t)?CA(e,t):lE(t)?yA(e,t):PE(t)?oj(e,t):ZT(t)?oA(e,t):DE(t)?ZA(e,t):xE(t)?OA(e,t):sE(t)?_A(e,t):nE(t)?fA(e,t):$T(t)?cA(e,t):ME(t)?nj(e,t):SE(t)?UA(e,t):IE(t)?Q.True:Q.False}function uj(e,t){return NE(e)||NE(e)?Q.True:Q.False}function dj(e,t){return lE(t)?yA(e,t):PE(t)?oj(e,t):IE(t)?cj(e,t):ZT(t)?oA(e,t):SE(t)?UA(e,t):RE(t)?Q.True:Q.False}function fj(e,t){return kE(e)||kE(t)?ej(e,t):EE(e)||EE(t)?XA(e,t):yE(e)||yE(t)?EA(e,t):ZT(e)?sA(e,t):$T(e)?lA(e,t):tE(e)?dA(e,t):nE(e)?pA(e,t):eE(e)?uA(e,t):iE(e)?mA(e,t):aE(e)?hA(e,t):oE(e)?gA(e,t):sE(e)?vA(e,t):lE(e)?bA(e,t):uE(e)?xA(e,t):mE(e)?SA(e,t):vE(e)?wA(e,t):bE(e)?DA(e,t):xE(e)?kA(e,t):SE(e)?WA(e,t):wE(e)?YA(e,t):DE(e)?QA(e,t):OE(e)?$A(e,t):ME(e)?rj(e,t):CE(e)?GA(e,t):FE(e)?ij(e,t):NE(e)?aj(e,t):PE(e)?sj(e,t):IE(e)?lj(e,t):RE(e)?dj(e,t):rA(`Unknown left type operand '${e[Y]}'`)}function pj(e,t){return fj(e,t)}function mj(e,t,n,r,i){let a={};for(let o of globalThis.Object.getOwnPropertyNames(e))a[o]=vj(e[o],t,n,r,Nw(i));return a}function hj(e,t,n,r,i){return mj(e.properties,t,n,r,i)}function gj(e,t,n,r,i){return cD(hj(e,t,n,r,i))}function _j(e,t,n,r){let i=pj(e,t);return i===Q.Union?_D([n,r]):i===Q.True?n:r}function vj(e,t,n,r,i){return hT(e)?gj(e,t,n,r,i):mT(e)?J(Sj(e,t,n,r,i)):J(_j(e,t,n,r),i)}function yj(e,t,n,r,i){return{[e]:vj(GD(e),t,n,r,Nw(i))}}function bj(e,t,n,r,i){return e.reduce((e,a)=>({...e,...yj(a,t,n,r,i)}),{})}function xj(e,t,n,r,i){return bj(e.keys,t,n,r,i)}function Sj(e,t,n,r,i){return cD(xj(e,t,n,r,i))}function Cj(e,t){return Tj(iO(e),t)}function wj(e,t){let n=e.filter(e=>pj(e,t)===Q.False);return n.length===1?n[0]:_D(n)}function Tj(e,t,n={}){return DT(e)?J(Cj(e,t),n):hT(e)?J(Oj(e,t),n):J(MT(e)?wj(e.anyOf,t):pj(e,t)===Q.False?e:sD(),n)}function Ej(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=Tj(e[r],t);return n}function Dj(e,t){return Ej(e.properties,t)}function Oj(e,t){return cD(Dj(e,t))}function kj(e,t){return jj(iO(e),t)}function Aj(e,t){let n=e.filter(e=>pj(e,t)!==Q.False);return n.length===1?n[0]:_D(n)}function jj(e,t,n){return DT(e)?J(kj(e,t),n):hT(e)?J(Pj(e,t),n):J(MT(e)?Aj(e.anyOf,t):pj(e,t)===Q.False?sD():e,n)}function Mj(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=jj(e[r],t);return n}function Nj(e,t){return Mj(e.properties,t)}function Pj(e,t){return cD(Nj(e,t))}function Fj(e,t){return oT(e)?J(e.returns,t):sD(t)}function Ij(e){return LO(tk(e))}function Lj(e,t,n){return J({[Y]:`Record`,type:`object`,patternProperties:{[e]:t}},n)}function Rj(e,t,n){let r={};for(let n of e)r[n]=t;return MO(r,{...n,[Xw]:`Record`})}function zj(e,t,n){return LD(e)?Rj(lO(e),t,n):Lj(e.pattern,t,n)}function Bj(e,t,n){return Rj(lO(_D(e)),t,n)}function Vj(e,t,n){return Rj([e.toString()],t,n)}function Hj(e,t,n){return Lj(e.source,t,n)}function Uj(e,t,n){return Lj(Ew(e.pattern)?KE:e.pattern,t,n)}function Wj(e,t,n){return Lj(KE,t,n)}function Gj(e,t,n){return Lj(qE,t,n)}function Kj(e,t,n){return MO({true:t,false:t},n)}function qj(e,t,n){return Lj(GE,t,n)}function Jj(e,t,n){return Lj(GE,t,n)}function Yj(e,t,n={}){return MT(e)?Bj(e.anyOf,t,n):DT(e)?zj(e,t,n):pT(e)?Vj(e.const,t,n):iT(e)?Kj(e,t,n):lT(e)?qj(e,t,n):yT(e)?Jj(e,t,n):wT(e)?Hj(e,t,n):TT(e)?Uj(e,t,n):$w(e)?Wj(e,t,n):gT(e)?Gj(e,t,n):sD(n)}function Xj(e){return globalThis.Object.getOwnPropertyNames(e.patternProperties)[0]}function Zj(e){let t=Xj(e);return t===KE?YD():t===GE?JD():YD({pattern:t})}function Qj(e){return e.patternProperties[Xj(e)]}function $j(e,t){return t.parameters=pM(e,t.parameters),t.returns=mM(e,t.returns),t}function eM(e,t){return t.parameters=pM(e,t.parameters),t.returns=mM(e,t.returns),t}function tM(e,t){return t.allOf=pM(e,t.allOf),t}function nM(e,t){return t.anyOf=pM(e,t.anyOf),t}function rM(e,t){return Ew(t.items)||(t.items=pM(e,t.items)),t}function iM(e,t){return t.items=mM(e,t.items),t}function aM(e,t){return t.items=mM(e,t.items),t}function oM(e,t){return t.items=mM(e,t.items),t}function sM(e,t){return t.item=mM(e,t.item),t}function cM(e,t){let n=fM(e,t.properties);return{...t,...MO(n)}}function lM(e,t){let n=Yj(mM(e,Zj(t)),mM(e,Qj(t)));return{...t,...n}}function uM(e,t){return t.index in e?e[t.index]:qk()}function dM(e,t){let n=Zw(t),r=Qw(t),i=mM(e,t);return n&&r?Ij(i):n&&!r?LO(i):!n&&r?tk(i):i}function fM(e,t){return globalThis.Object.getOwnPropertyNames(t).reduce((n,r)=>({...n,[r]:dM(e,t[r])}),{})}function pM(e,t){return t.map(t=>mM(e,t))}function mM(e,t){return oT(t)?$j(e,t):cT(t)?eM(e,t):uT(t)?tM(e,t):MT(t)?nM(e,t):AT(t)?rM(e,t):tT(t)?iM(e,t):nT(t)?aM(e,t):dT(t)?oM(e,t):xT(t)?sM(e,t):bT(t)?cM(e,t):ST(t)?lM(e,t):eT(t)?uM(e,t):t}function hM(e,t){return mM(t,Pw(e))}function gM(e){return J({[Y]:`Integer`,type:`integer`},e)}function _M(e,t,n){return{[e]:OM(GD(e),t,Nw(n))}}function vM(e,t,n){return e.reduce((e,r)=>({...e,..._M(r,t,n)}),{})}function yM(e,t,n){return vM(e.keys,t,n)}function bM(e,t,n){return cD(yM(e,t,n))}function xM(e){let[t,n]=[e.slice(0,1),e.slice(1)];return[t.toLowerCase(),n].join(``)}function SM(e){let[t,n]=[e.slice(0,1),e.slice(1)];return[t.toUpperCase(),n].join(``)}function CM(e){return e.toUpperCase()}function wM(e){return e.toLowerCase()}function TM(e,t,n){let r=jD(e.pattern);return ID(r)?aO([_D(DM([...UD(r)].map(e=>GD(e)),t))],n):{...e,pattern:EM(e.pattern,t)}}function EM(e,t){return typeof e==`string`?t===`Uncapitalize`?xM(e):t===`Capitalize`?SM(e):t===`Uppercase`?CM(e):t===`Lowercase`?wM(e):e:e.toString()}function DM(e,t){return e.map(e=>OM(e,t))}function OM(e,t,n={}){return mT(e)?bM(e,t,n):DT(e)?TM(e,t,n):MT(e)?_D(DM(e.anyOf,t),n):pT(e)?GD(EM(e.const,t),n):J(e,n)}function kM(e,t={}){return OM(e,`Capitalize`,t)}function AM(e,t={}){return OM(e,`Lowercase`,t)}function jM(e,t={}){return OM(e,`Uncapitalize`,t)}function MM(e,t={}){return OM(e,`Uppercase`,t)}function NM(e,t,n){let r={};for(let i of globalThis.Object.getOwnPropertyNames(e))r[i]=UM(e[i],t,Nw(n));return r}function PM(e,t,n){return NM(e.properties,t,n)}function FM(e,t,n){return cD(PM(e,t,n))}function IM(e,t){return e.map(e=>HM(e,t))}function LM(e,t){return e.map(e=>HM(e,t))}function RM(e,t){let{[t]:n,...r}=e;return r}function zM(e,t){return t.reduce((e,t)=>RM(e,t),e)}function BM(e,t,n){let r=oD(e,[qw,`$id`,`required`,`properties`]);return MO(zM(n,t),r)}function VM(e){return _D(e.reduce((e,t)=>fT(t)?[...e,GD(t)]:e,[]))}function HM(e,t){return uT(e)?dk(IM(e.allOf,t)):MT(e)?_D(LM(e.anyOf,t)):bT(e)?BM(e,t,e.properties):MO({})}function UM(e,t,n){let r=pw(t)?VM(t):t,i=RT(t)?lO(t):t,a=CT(e),o=CT(t);return hT(e)?FM(e,i,n):mT(t)?qM(e,t,n):a&&o||!a&&o||a&&!o?iD(`Omit`,[e,r],n):J({...HM(e,i),...n})}function WM(e,t,n){return{[t]:UM(e,[t],Nw(n))}}function GM(e,t,n){return t.reduce((t,r)=>({...t,...WM(e,r,n)}),{})}function KM(e,t,n){return GM(e,t.keys,n)}function qM(e,t,n){return cD(KM(e,t,n))}function JM(e,t,n){let r={};for(let i of globalThis.Object.getOwnPropertyNames(e))r[i]=rN(e[i],t,Nw(n));return r}function YM(e,t,n){return JM(e.properties,t,n)}function XM(e,t,n){return cD(YM(e,t,n))}function ZM(e,t){return e.map(e=>nN(e,t))}function QM(e,t){return e.map(e=>nN(e,t))}function $M(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function eN(e,t,n){let r=oD(e,[qw,`$id`,`required`,`properties`]);return MO($M(n,t),r)}function tN(e){return _D(e.reduce((e,t)=>fT(t)?[...e,GD(t)]:e,[]))}function nN(e,t){return uT(e)?dk(ZM(e.allOf,t)):MT(e)?_D(QM(e.anyOf,t)):bT(e)?eN(e,t,e.properties):MO({})}function rN(e,t,n){let r=pw(t)?tN(t):t,i=RT(t)?lO(t):t,a=CT(e),o=CT(t);return hT(e)?XM(e,i,n):mT(t)?sN(e,t,n):a&&o||!a&&o||a&&!o?iD(`Pick`,[e,r],n):J({...nN(e,i),...n})}function iN(e,t,n){return{[t]:rN(e,[t],Nw(n))}}function aN(e,t,n){return t.reduce((t,r)=>({...t,...iN(e,r,n)}),{})}function oN(e,t,n){return aN(e,t.keys,n)}function sN(e,t,n){return cD(oN(e,t,n))}function cN(e,t){return iD(`Partial`,[iD(e,t)])}function lN(e){return iD(`Partial`,[fk(e)])}function uN(e){let t={};for(let n of globalThis.Object.getOwnPropertyNames(e))t[n]=tk(e[n]);return t}function dN(e,t){let n=oD(e,[qw,`$id`,`required`,`properties`]);return MO(uN(t),n)}function fN(e){return e.map(e=>pN(e))}function pN(e){return aT(e)?cN(e.target,e.parameters):CT(e)?lN(e.$ref):uT(e)?dk(fN(e.allOf)):MT(e)?_D(fN(e.anyOf)):bT(e)?dN(e,e.properties):rT(e)||iT(e)||lT(e)||pT(e)||vT(e)||yT(e)||TT(e)||ET(e)||jT(e)?e:MO({})}function mN(e,t){return hT(e)?_N(e,t):J({...pN(e),...t})}function hN(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=mN(e[r],Nw(t));return n}function gN(e,t){return hN(e.properties,t)}function _N(e,t){return cD(gN(e,t))}function vN(e,t){return iD(`Required`,[iD(e,t)])}function yN(e){return iD(`Required`,[fk(e)])}function bN(e){let t={};for(let n of globalThis.Object.getOwnPropertyNames(e))t[n]=oD(e[n],[Yw]);return t}function xN(e,t){let n=oD(e,[qw,`$id`,`required`,`properties`]);return MO(bN(t),n)}function SN(e){return e.map(e=>CN(e))}function CN(e){return aT(e)?vN(e.target,e.parameters):CT(e)?yN(e.$ref):uT(e)?dk(SN(e.allOf)):MT(e)?_D(SN(e.anyOf)):bT(e)?xN(e,e.properties):rT(e)||iT(e)||lT(e)||pT(e)||vT(e)||yT(e)||TT(e)||ET(e)||jT(e)?e:MO({})}function wN(e,t){return hT(e)?DN(e,t):J({...CN(e),...t})}function TN(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=wN(e[r],t);return n}function EN(e,t){return TN(e.properties,t)}function DN(e,t){return cD(EN(e,t))}function ON(e,t){return t.map(t=>CT(t)?kN(e,t.$ref):XN(e,t))}function kN(e,t){return t in e?CT(e[t])?kN(e,e[t].$ref):XN(e,e[t]):sD()}function AN(e){return yk(e[0])}function jN(e){return wO(e[0],e[1])}function MN(e){return Nk(e[0])}function NN(e){return mN(e[0])}function PN(e){return UM(e[0],e[1])}function FN(e){return rN(e[0],e[1])}function IN(e){return wN(e[0])}function LN(e,t,n){let r=ON(e,n);return t===`Awaited`?AN(r):t===`Index`?jN(r):t===`KeyOf`?MN(r):t===`Partial`?NN(r):t===`Omit`?PN(r):t===`Pick`?FN(r):t===`Required`?IN(r):sD()}function RN(e,t){return tD(XN(e,t))}function zN(e,t){return rD(XN(e,t))}function BN(e,t,n){return lD(YN(e,t),XN(e,n))}function VN(e,t,n){return uD(YN(e,t),XN(e,n))}function HN(e,t){return dk(YN(e,t))}function UN(e,t){return kO(XN(e,t))}function WN(e,t){return MO(globalThis.Object.keys(t).reduce((n,r)=>({...n,[r]:XN(e,t[r])}),{}))}function GN(e,t){let[n,r]=[XN(e,Qj(t)),Xj(t)],i=Pw(t);return i.patternProperties[r]=n,i}function KN(e,t){return CT(t)?{...kN(e,t.$ref),[qw]:t[qw]}:t}function qN(e,t){return VO(YN(e,t))}function JN(e,t){return _D(YN(e,t))}function YN(e,t){return t.map(t=>XN(e,t))}function XN(e,t){return Qw(t)?J(XN(e,oD(t,[Yw])),t):Zw(t)?J(XN(e,oD(t,[Jw])),t):kT(t)?J(KN(e,t),t):tT(t)?J(RN(e,t.items),t):nT(t)?J(zN(e,t.items),t):aT(t)?J(LN(e,t.target,t.parameters)):oT(t)?J(BN(e,t.parameters,t.returns),t):cT(t)?J(VN(e,t.parameters,t.returns),t):uT(t)?J(HN(e,t.allOf),t):dT(t)?J(UN(e,t.items),t):bT(t)?J(WN(e,t.properties),t):ST(t)?J(GN(e,t)):AT(t)?J(qN(e,t.items||[]),t):MT(t)?J(JN(e,t.anyOf),t):t}function ZN(e,t){return t in e?XN(e,e[t]):sD()}function QN(e){return globalThis.Object.getOwnPropertyNames(e).reduce((t,n)=>({...t,[n]:ZN(e,n)}),{})}var $N=class{constructor(e){let t=QN(e),n=this.WithIdentifiers(t);this.$defs=n}Import(e,t){let n={...this.$defs,[e]:J(this.$defs[e],t)};return J({[Y]:`Import`,$defs:n,$ref:e})}WithIdentifiers(e){return globalThis.Object.getOwnPropertyNames(e).reduce((t,n)=>({...t,[n]:{...e[n],$id:n}}),{})}};function eP(e){return new $N(e)}function tP(e,t){return J({[Y]:`Not`,not:e},t)}function nP(e,t){return cT(e)?VO(e.parameters,t):sD()}var rP=0;function iP(e,t={}){Ew(t.$id)&&(t.$id=`T${rP++}`);let n=Pw(e({[Y]:`This`,$ref:`${t.$id}`}));return n.$id=t.$id,J({[Xw]:`Recursive`,...n},t)}function aP(e,t){let n=Cw(e)?new globalThis.RegExp(e):e;return J({[Y]:`RegExp`,type:`RegExp`,source:n.source,flags:n.flags},t)}function oP(e){return uT(e)?e.allOf:MT(e)?e.anyOf:AT(e)?e.items??[]:[]}function sP(e){return oP(e)}function cP(e,t){return cT(e)?J(e.returns,t):sD(t)}var lP=class{constructor(e){this.schema=e}Decode(e){return new uP(this.schema,e)}},uP=class{constructor(e,t){this.schema=e,this.decode=t}EncodeTransform(e,t){let n={Encode:n=>t[qw].Encode(e(n)),Decode:e=>this.decode(t[qw].Decode(e))};return{...t,[qw]:n}}EncodeSchema(e,t){let n={Decode:this.decode,Encode:e};return{...t,[qw]:n}}Encode(e){return kT(this.schema)?this.EncodeTransform(e,this.schema):this.EncodeSchema(e,this.schema)}};function dP(e){return new lP(e)}function fP(e={}){return J({[Y]:e[Y]??`Unsafe`},e)}function pP(e){return J({[Y]:`Void`,type:`void`},e)}var $=t({Any:()=>eD,Argument:()=>nD,Array:()=>tD,AsyncIterator:()=>rD,Awaited:()=>yk,BigInt:()=>qD,Boolean:()=>KD,Capitalize:()=>kM,Composite:()=>Vk,Const:()=>Qk,Constructor:()=>lD,ConstructorParameters:()=>$k,Date:()=>Hk,Enum:()=>eA,Exclude:()=>Tj,Extends:()=>vj,Extract:()=>jj,Function:()=>uD,Index:()=>wO,InstanceType:()=>Fj,Instantiate:()=>hM,Integer:()=>gM,Intersect:()=>dk,Iterator:()=>kO,KeyOf:()=>Nk,Literal:()=>GD,Lowercase:()=>AM,Mapped:()=>ZO,Module:()=>eP,Never:()=>sD,Not:()=>tP,Null:()=>Uk,Number:()=>JD,Object:()=>MO,Omit:()=>UM,Optional:()=>tk,Parameters:()=>nP,Partial:()=>mN,Pick:()=>rN,Promise:()=>NO,Readonly:()=>LO,ReadonlyOptional:()=>Ij,Record:()=>Yj,Recursive:()=>iP,Ref:()=>fk,RegExp:()=>aP,Required:()=>wN,Rest:()=>sP,ReturnType:()=>cP,String:()=>YD,Symbol:()=>Wk,TemplateLiteral:()=>aO,Transform:()=>dP,Tuple:()=>VO,Uint8Array:()=>Kk,Uncapitalize:()=>jM,Undefined:()=>Gk,Union:()=>_D,Unknown:()=>qk,Unsafe:()=>fP,Uppercase:()=>MM,Void:()=>pP}),mP={additionalProperties:!1},hP=$.String({pattern:`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`,minLength:36,maxLength:36}),gP=$.String({pattern:`^[a-z0-9][a-z0-9-]{0,31}(?![\\s\\S])`,minLength:1,maxLength:32}),_P=$.String({pattern:`^sha256:[0-9a-f]{64}$`,minLength:71,maxLength:71}),vP=$.String({pattern:`^[A-Za-z0-9_-]{43}$`,minLength:43,maxLength:43}),yP=$.String({pattern:`^dpt_[A-Za-z0-9_-]{43}$`,minLength:47,maxLength:47}),bP=`[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}`,xP=`^(?:${bP}|[A-Z2-7]{12}|[A-Z2-7]{8})(?![\\s\\S])`,SP=$.String({pattern:xP,minLength:8,maxLength:36}),CP=new RegExp(xP),wP=/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/;function TP(e){return typeof e!=`string`||e.length>36?!1:CP.test(e)}function EP(e){if(typeof e!=`string`)return;if(wP.test(e)){let t=e.toLowerCase();return TP(t)?t:void 0}let t=e.replace(/[\s-]+/g,``).toUpperCase();if(TP(t)&&!(/[\s-]/.test(e)&&t.length!==12))return t}$.Object({type:$.Literal(`pair.request`),v:$.Literal(1),requestId:hP,code:SP,deviceUid:hP,deviceName:$.String({minLength:1,maxLength:64}),hostname:$.Optional($.String({minLength:1,maxLength:128})),platform:$.Optional($.String({minLength:1,maxLength:64})),publicKey:$.String({minLength:1,maxLength:256}),keyFingerprint:_P,clientTime:$.Integer(),hubNonce:$.Optional(vP)},mP),$.Object({type:$.Literal(`pair.device-request`),v:$.Literal(1),requestId:hP,deviceUid:hP,deviceName:$.String({minLength:1,maxLength:64}),hostname:$.Optional($.String({minLength:1,maxLength:128})),platform:$.Optional($.String({minLength:1,maxLength:64})),publicKey:$.String({minLength:1,maxLength:256}),keyFingerprint:_P,clientTime:$.Integer(),hubNonce:$.Optional(vP)},mP);var DP=$.Object({type:$.Literal(`pair.challenge`),v:$.Literal(1),enrollmentId:hP,nonce:vP,issuedAt:$.Integer(),hubId:hP,hubPublicKey:$.Optional($.String({minLength:1,maxLength:256})),hubKeyFingerprint:$.Optional(_P),hubSignature:$.Optional($.String({pattern:`^[A-Za-z0-9_-]{86}$`,minLength:86,maxLength:86}))},mP);$.Object({type:$.Literal(`pair.device-ack`),v:$.Literal(1),codeId:hP,code:SP,expiresAt:$.Integer(),hubOrigin:$.String(),hubId:hP,challenge:DP},mP),$.Object({type:$.Literal(`pair.response`),v:$.Literal(1),enrollmentId:hP,nonce:vP,signature:$.String({pattern:`^[A-Za-z0-9_-]{86}$`,minLength:86,maxLength:86})},mP),$.Object({type:$.Literal(`pair.pending`),v:$.Literal(1),enrollmentId:hP,state:$.Literal(`awaiting_approval`),expiresAt:$.Integer(),pollAfterMs:$.Integer({minimum:1})},mP),$.Object({type:$.Literal(`pair.token`),v:$.Literal(1),enrollmentId:hP,deviceUid:hP,deviceId:gP,pairingEpoch:hP,credentialId:hP,generation:$.Integer({minimum:1}),hubId:hP,hubOrigin:$.String(),hubUrl:$.String(),tunnelToken:yP,issuedAt:$.Integer(),expiresAt:$.Null(),hubKeyFingerprint:$.Optional(_P)},mP),$.Object({enrollmentId:hP,deviceUid:hP,keyFingerprint:_P,replaceKey:$.Optional($.Boolean())},mP),$.Object({type:$.Literal(`pair.revoke`),v:$.Literal(1),deviceId:gP,pairingEpoch:hP,reason:$.Union([$.Literal(`user`),$.Literal(`compromise`),$.Literal(`hub_migrated`)]),revokedAt:$.Integer()},mP);var OP=$.Object({type:$.Literal(`pair.error`),v:$.Literal(1),code:$.Union([$.Literal(`code_invalid`),$.Literal(`code_expired`),$.Literal(`code_used`),$.Literal(`code_in_use`),$.Literal(`rate_limited`),$.Literal(`signature_invalid`),$.Literal(`clock_skew`),$.Literal(`paired_elsewhere`),$.Literal(`hub_required`),$.Literal(`fingerprint_mismatch`),$.Literal(`identity_conflict`),$.Literal(`enrollment_lost`),$.Literal(`enrollment_cancelled`),$.Literal(`already_issued`),$.Literal(`challenge_expired`)]),message:$.String({maxLength:512}),retryAfterMs:$.Optional($.Integer({minimum:1}))},mP);$.Object({type:$.Literal(`pair.code`),v:$.Literal(1),codeId:hP,code:SP,expiresAt:$.Integer(),hubOrigin:$.String({maxLength:2048}),pairUrl:$.String({maxLength:4096}),offerUrl:$.Optional($.String({maxLength:2048}))},mP);var kP=$.Union([$.Literal(`open`),$.Literal(`awaiting_proof`),$.Literal(`awaiting_approval`),$.Literal(`approved`),$.Literal(`issued`),$.Literal(`connected`),$.Literal(`cancelled`),$.Literal(`expired`)]);$.Object({type:$.Literal(`pair.code-state`),v:$.Literal(1),codeId:hP,expiresAt:$.Integer(),phase:kP,enrollment:$.Optional($.Object({enrollmentId:hP,deviceUid:hP,deviceName:$.String({minLength:1,maxLength:64}),keyFingerprint:_P,proofVerified:$.Boolean(),keyChanged:$.Boolean()},mP)),deviceId:$.Optional(gP),error:$.Optional(OP)},mP);function AP(e){if(typeof e!=`string`||e.length===0||e.length>2048)return{ok:!1,error:`origin: empty or too long`};if(/\s|\n|\r|\t/.test(e))return{ok:!1,error:`origin: whitespace not allowed`};let t;try{t=new URL(e)}catch{return{ok:!1,error:`origin: not a valid URL`}}return t.protocol!==`https:`&&!(t.protocol===`http:`&&/^(127\.0\.0\.1|\[::1\]|localhost)$/.test(t.hostname))?{ok:!1,error:`origin: HTTPS origin required`}:t.username||t.password?{ok:!1,error:`origin: userinfo not allowed`}:t.search||t.hash?{ok:!1,error:`origin: query/fragment not allowed`}:t.pathname!==`/`&&t.pathname!==``?{ok:!1,error:`origin: base path not allowed`}:{ok:!0,origin:t.origin,tunnelUrl:`${t.origin}/api/tunnel`}}function jP(e){if(e!==``&&/^[A-Za-z0-9_-]+$/.test(e))try{let t=atob(e.replace(/-/g,`+`).replace(/_/g,`/`)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}catch{return}}var MP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,NP=RegExp(`^${bP}$`),PP=/^sha256:[0-9a-f]{64}$/;function FP(e){let t=jP(e);if(!t||t.length>1024)return;let n;try{n=JSON.parse(new TextDecoder().decode(t))}catch{return}if(!n||typeof n!=`object`||Array.isArray(n))return;let r=n;if(r.v!==2&&r.v!==3)return;let i=r.v===3?6:5;if(Object.keys(r).length!==i||typeof r.hub!=`string`)return;let a=AP(r.hub);if(a.ok&&a.origin===r.hub&&typeof r.id==`string`&&MP.test(r.id)&&typeof r.code==`string`&&NP.test(r.code)&&typeof r.exp==`number`&&Number.isSafeInteger(r.exp))return r.v===3?typeof r.kfp!=`string`||!PP.test(r.kfp)?void 0:{v:3,hub:r.hub,id:r.id,code:r.code,exp:r.exp,kfp:r.kfp}:{v:2,hub:r.hub,id:r.id,code:r.code,exp:r.exp}}function IP(e,t=Date.now()){let n=FP(e);if(n&&!(n.exp<t-3e4)&&!(n.exp>t+6e5))return n}function LP(e,t=Date.now()){let n;try{n=new URL(e)}catch{return}if(!/^\/pair\/?$/.test(n.pathname)||n.username||n.password||n.search||!n.hash.startsWith(`#offer=`))return;let r=IP(n.hash.slice(7),t);if(r&&r.hub===n.origin)return{offer:r,rest:`${n.origin}/pair`}}function RP(e){if(!/^\/pair\/?$/.test(e.pathname))return;if(e.hash.startsWith(`#offer=`)){let t=LP(e.href);if(t)return{code:t.offer.code,origin:e.origin,offerFragment:e.hash.slice(1)};let n=IP(e.hash.slice(7));return n&&n.hub!==e.origin?{error:`This pairing link does not belong to this hub. Open the original hub link instead.`}:{error:`Invalid pairing link. Use a complete link from the hub wizard.`}}let t=e.searchParams;if(!t.has(`code`)&&!t.has(`origin`)&&!t.has(`v`))return;let n=t.get(`code`),r=n===null?void 0:EP(n);if(e.username||e.password||e.hash||t.getAll(`code`).length!==1||!r||t.getAll(`v`).length!==1||t.get(`v`)!==`1`)return{error:`Invalid pairing link. Use a complete version 1 link from the hub wizard.`};if(t.has(`origin`))try{let n=new URL(t.get(`origin`));if(t.getAll(`origin`).length!==1||n.origin!==e.origin||n.pathname!==`/`||n.username||n.password||n.search||n.hash)throw Error(`origin mismatch`)}catch{return{error:`This pairing link does not belong to this hub. Open the original hub link instead.`}}return{code:r,origin:e.origin}}var zP=e=>/^\/pair\/?$/.test(e.pathname)?`/`:void 0,BP=e=>/^\/pair\/?$/.test(e.pathname)&&RP(e)===void 0?`/`:void 0,VP=4e3;async function HP(e){if(!e.needsCancel)return{closed:!0,confirmed:!0};let t,n=await Promise.race([e.cancel().catch(()=>`failed`),new Promise(n=>t=setTimeout(()=>n(`failed`),e.timeoutMs))]);return clearTimeout(t),{closed:n!==`issued`,confirmed:n===`cancelled`}}var UP={class:`modal pair-wizard`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`pair-title`},WP={key:1,class:`pair-pending`,"aria-label":`Machines waiting for approval`},GP={class:`who`},KP={key:0,class:`muted`},qP={key:1,class:`muted`},JP={class:`fp`},YP={class:`row`},XP={class:`phase`},ZP=[`onClick`],QP={key:2,class:`hint`},$P={class:`pair-steps`,"aria-label":`Pairing progress`},eF={class:`pair-grid`},tF={class:`pair-code-box`},nF={class:`pair-code`,"aria-label":`Pairing code`},rF={class:`pair-copy-actions`},iF=[`innerHTML`],aF={class:`pair-side`},oF={key:0,class:`hint`},sF={class:`pair-fingerprint`},cF={class:`fp`},lF={class:`pair-confirm`},uF={key:0,class:`pair-confirm warn`},dF=[`disabled`],fF=[`disabled`],pF={class:`hint`},mF=[`disabled`],hF={key:5,class:`error`,role:`alert`},gF={key:4},_F={class:`error`,role:`alert`},vF=Or({__name:`PairDeviceWizard`,props:{handoff:{}},emits:[`close`],setup(e,{expose:t,emit:n}){let r=n,i=e,a=k(`boot`),o=k(),s=k(),c=k(),l=k(``),u=k(!1),d=k(!1),f=k(!1),p=k(!1),m=k(!1),h=k(!1),g=k(),_=k([]),v=V(()=>{let e=s.value?.code??``;return!TP(e)||e.includes(`-`)?e:(e.match(/.{4}/g)??[]).join(`-`)}),y=V(()=>s.value?Av(s.value):``),b=V(()=>y.value?iw(y.value,148):``),ee=V(()=>c.value?.enrollment?.keyFingerprint??``),x=V(()=>c.value?.deviceId??``);j(x,e=>{g.value?.(),e&&(g.value=j(()=>lu.devices.value.find(t=>t.id===e)?.status,e=>{e===`online`&&(G(`Device paired and online.`),g.value?.(),g.value=void 0)},{immediate:!0}))});async function S(e){a.value=`boot`,l.value=``,f.value=!1,p.value=!1,c.value=void 0,s.value=void 0,o.value?.close();let t=Nv();o.value=t;try{let n=e?await jv.resolveCode(e):await jv.createCode();if(t.closed()){await jv.cancel(n.codeId).catch(()=>{G(`The late pairing code could not be cancelled. Check device credentials before retrying.`)});return}if(s.value=n,a.value=`code`,e){let e=zP(new URL(window.location.href));e&&window.history.replaceState(window.history.state,``,e)}Iv(t,n.codeId,{intervalMs:1e3,onState:e=>{c.value=e,e.phase===`awaiting_proof`?a.value=`proof`:e.phase===`awaiting_approval`||e.phase===`approved`?a.value=`approve`:e.phase===`issued`||e.phase===`connected`?a.value=`issued`:e.phase===`cancelled`?a.value=`cancelled`:e.phase===`expired`&&(a.value=`expired`)}}).catch(e=>{t.closed()||(l.value=e instanceof Error?e.message:String(e),a.value=`expired`)})}catch(e){l.value=e instanceof Error?e.message:String(e),a.value=`expired`}}async function te(){let e=c.value,t=o.value;if(e?.enrollment&&t&&!u.value){u.value=!0,l.value=``;try{let t=await jv.approve(s.value.codeId,{enrollmentId:e.enrollment.enrollmentId,deviceUid:e.enrollment.deviceUid,keyFingerprint:e.enrollment.keyFingerprint,...p.value?{replaceKey:!0}:{}});c.value=t,(t.phase===`issued`||t.phase===`connected`)&&(a.value=`issued`)}catch(e){l.value=e instanceof Error?e.message:String(e)}finally{u.value=!1}}}async function ne(e){if(!s.value)return`cancelled`;try{let t=await jv.cancel(s.value.codeId,void 0,e);return c.value=t,o.value&&(o.value.state=t),a.value=t.phase===`expired`?`expired`:`cancelled`,o.value?.close(),`cancelled`}catch(e){if(e instanceof Fl&&e.status===409&&String(e.code)===`already_issued`){let e=await jv.codeState(s.value.codeId).catch(()=>void 0);return e&&(c.value=e,o.value&&(o.value.state=e)),a.value=`issued`,l.value=`Credential already issued. Closing does not revoke it; choose Revoke explicitly if needed.`,`issued`}return l.value=e instanceof Error?e.message:String(e),`failed`}}let re=()=>ne(!1),ie=()=>[`issued`,`connected`,`cancelled`,`expired`].includes(c.value?.phase??``);async function ae(){let e=x.value;if(e){u.value=!0;try{await jv.revoke(e,`user`),G(`Issued credential revoked.`),r(`close`)}catch(e){l.value=e instanceof Error?e.message:String(e)}finally{u.value=!1}}}async function oe(){if(s.value)try{await navigator.clipboard.writeText(s.value.code),m.value=!0,setTimeout(()=>m.value=!1,1500)}catch{l.value=`Clipboard unavailable; copy the code manually.`}}async function se(){if(s.value)try{await navigator.clipboard.writeText(s.value.offerUrl??s.value.pairUrl),h.value=!0,setTimeout(()=>h.value=!1,1500)}catch{l.value=`Clipboard unavailable; copy the link manually.`}}async function ce(){if(!d.value){d.value=!0,u.value=!0;try{let e=await HP({needsCancel:!!s.value&&!ie(),cancel:re,timeoutMs:VP});if(!e.closed)return;o.value?.close(),g.value?.(),e.confirmed||G(`Pairing cancellation was not confirmed. The code expires on its own; check device credentials before retrying.`),r(`close`)}finally{d.value=!1,u.value=!1}}}t({close:ce});let le;async function ue(){try{_.value=(await jv.pending()).codes}catch{}}async function de(e){s.value=void 0,c.value=void 0,l.value=``;let t=Nv();o.value=t,a.value=e.phase===`approved_ready`?`approve`:`proof`,Iv(t,e.codeId,{intervalMs:1e3,onState:e=>{c.value=e,e.phase===`awaiting_proof`?a.value=`proof`:e.phase===`awaiting_approval`||e.phase===`approved`?a.value=`approve`:e.phase===`issued`||e.phase===`connected`?a.value=`issued`:e.phase===`cancelled`?a.value=`cancelled`:e.phase===`expired`&&(a.value=`expired`)}}).catch(e=>{l.value=e instanceof Error?e.message:String(e)})}return Ur(()=>{if(ue(),le=setInterval(()=>void ue(),3e3),i.handoff&&`error`in i.handoff){l.value=i.handoff.error,a.value=`expired`;return}S(i.handoff?.code)}),Kr(()=>{clearInterval(le);let e=o.value;e&&!e.closed()&&s.value&&!ie()&&ne(!0).then(e=>{e!==`cancelled`&&G(`Pairing cancellation was not confirmed. Check device credentials before retrying.`)}),e?.close(),g.value?.()}),(e,t)=>(P(),F(`div`,{class:`modal-backdrop`,onClick:js(ce,[`self`])},[L(`div`,UP,[L(`header`,null,[t[5]||=L(`h2`,{id:`pair-title`},`Pair a device`,-1),L(`button`,{type:`button`,class:`icon-button`,"aria-label":`Close dialog`,onClick:ce},[R(A(ol),{size:18})])]),i.handoff&&`offerFragment`in i.handoff&&i.handoff.offerFragment?(P(),I(dw,{key:0,"offer-fragment":i.handoff.offerFragment},null,8,[`offer-fragment`])):B(``,!0),_.value.length?(P(),F(`section`,WP,[t[6]||=L(`h3`,null,`Machines waiting for you`,-1),L(`ul`,null,[(P(!0),F(N,null,M(_.value,e=>(P(),F(`li`,{key:e.codeId},[L(`div`,GP,[L(`strong`,null,E(e.deviceName??`unnamed device`),1),e.hostname?(P(),F(`span`,KP,E(e.hostname),1)):B(``,!0),e.platform?(P(),F(`span`,qP,E(e.platform),1)):B(``,!0)]),L(`div`,JP,E(e.keyFingerprint),1),L(`div`,YP,[L(`span`,XP,E(e.phase.replaceAll(`_`,` `)),1),L(`button`,{type:`button`,class:`small`,onClick:t=>de(e)},`Review`,8,ZP)])]))),128))]),t[7]||=L(`p`,{class:`hint`},` Compare each fingerprint with the machine's own terminal before approving. Codes are minted by the hub — nothing has to be copied to the machine. `,-1)])):B(``,!0),a.value===`boot`?(P(),F(`p`,QP,`Minting a pairing code…`)):s.value?(P(),F(N,{key:3},[L(`ol`,$P,[t[8]||=L(`li`,{class:w({on:!0})},`Code`,-1),L(`li`,{class:w({on:[`proof`,`approve`,`issued`].includes(a.value)})},`Proof`,2),L(`li`,{class:w({on:[`approve`,`issued`].includes(a.value)})},`Fingerprint`,2),L(`li`,{class:w({on:a.value===`issued`})},`Online`,2)]),L(`div`,eF,[L(`div`,tF,[L(`div`,nF,E(v.value),1),L(`div`,rF,[L(`button`,{type:`button`,class:`small`,onClick:oe},[R(A(oc),{size:14}),z(` `+E(m.value?`Copied`:`Copy code`),1)]),L(`button`,{type:`button`,class:`small`,onClick:se,title:`Self-contained link: hub, code and expiry all in the fragment — it never reaches server logs`},[R(A(oc),{size:14}),z(` `+E(h.value?`Copied link`:`Copy link`),1)])]),t[9]||=L(`p`,{class:`hint`},` Run the device pairing command and scan, or enter this code on the device. Expires in 5 minutes. `,-1),L(`div`,{class:`pair-qr`,"aria-label":`Pairing QR code`,title:`Same offer link as Copy link: hub, code and expiry all in the #offer= fragment — it never reaches server logs`,innerHTML:b.value},null,8,iF)]),L(`div`,aF,[a.value===`code`||a.value===`proof`?(P(),F(`p`,oF,[R(A(Wc),{size:14,class:`spin`}),t[10]||=z(` Waiting for the device to submit its signing proof… `,-1)])):a.value===`approve`?(P(),F(N,{key:1},[L(`div`,sF,[t[11]||=L(`h3`,null,`Device key fingerprint`,-1),L(`code`,cF,E(ee.value),1),t[12]||=L(`p`,{class:`hint`},` Compare ALL 64 hex characters with the fingerprint shown on the device screen. `,-1)]),L(`label`,lF,[Un(L(`input`,{"onUpdate:modelValue":t[0]||=e=>f.value=e,type:`checkbox`},null,512),[[Ss,f.value]]),t[13]||=z(` The fingerprint matches the device display exactly `,-1)]),c.value?.enrollment?.keyChanged?(P(),F(`label`,uF,[Un(L(`input`,{"onUpdate:modelValue":t[1]||=e=>p.value=e,type:`checkbox`},null,512),[[Ss,p.value]]),R(A(qc),{size:14}),t[14]||=z(` Device is already paired with a DIFFERENT key — replace the stored key (replaceKey) `,-1)])):B(``,!0),L(`button`,{type:`button`,class:`primary`,disabled:!f.value||u.value||c.value?.enrollment?.keyChanged===!0&&!p.value,onClick:te},` Approve device `,8,dF),L(`button`,{type:`button`,class:`small`,disabled:u.value,onClick:re},` Cancel pairing `,8,fF)],64)):a.value===`issued`?(P(),F(N,{key:2},[L(`p`,pF,[R(A(rc),{size:14}),t[15]||=z(` Credential issued. The device is connecting through the tunnel — you will get a toast once the monitor probe reports it online. `,-1)]),L(`button`,{type:`button`,class:`small`,onClick:ce},`Close`),L(`button`,{type:`button`,class:`small danger`,disabled:!x.value||u.value,title:`Mistaken approval? Revoke the credential now.`,onClick:ae},` Revoke this credential `,8,mF)],64)):a.value===`cancelled`?(P(),F(N,{key:3},[t[16]||=L(`p`,{class:`hint`},`Pairing was cancelled (or the signature failed too many times).`,-1),L(`button`,{type:`button`,class:`small`,onClick:t[2]||=e=>S()},`Start over`)],64)):a.value===`expired`?(P(),F(N,{key:4},[t[17]||=L(`p`,{class:`hint`},`The pairing code expired.`,-1),L(`button`,{type:`button`,class:`small`,onClick:t[3]||=e=>S()},`New code`)],64)):B(``,!0),l.value?(P(),F(`p`,hF,E(l.value),1)):B(``,!0)])])],64)):(P(),F(`div`,gF,[L(`p`,_F,E(l.value||`This pairing link is unavailable.`),1),L(`button`,{type:`button`,class:`small`,onClick:t[4]||=e=>S()},`New code`)]))])]))}}),yF={class:`modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`device-credentials-title`},bF={class:`hint`},xF={key:1,class:`hint`},SF=Or({__name:`DeviceCredentialsDialog`,props:{deviceId:{}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=V(()=>lu.devices.value.find(e=>e.id===n.deviceId));return(e,t)=>(P(),F(`div`,{class:`modal-backdrop`,onClick:t[2]||=js(e=>r(`close`),[`self`])},[L(`section`,yF,[L(`header`,null,[t[3]||=L(`h2`,{id:`device-credentials-title`},`Device credentials`,-1),L(`button`,{class:`icon-button`,"aria-label":`Close device credentials`,onClick:t[0]||=e=>r(`close`)},[R(A(ol),{size:18})])]),i.value?(P(),F(N,{key:0},[L(`p`,null,[z(E(i.value.name)+` `,1),L(`code`,null,E(i.value.id),1)]),L(`p`,bF,E(i.value.status)+` · tunnel `+E(i.value.tunnel?.state??`disconnected`)+` · `+E(i.value.tunnel?.readerCount??0)+` readers `,1),R(Gv,{device:i.value},null,8,[`device`])],64)):(P(),F(`p`,xF,`This device is no longer in the registry.`)),L(`footer`,null,[L(`button`,{class:`secondary`,onClick:t[1]||=e=>r(`close`)},`Close`)])])]))}}),CF={id:`prompt-title`},wF=[`disabled`],TF={key:0,class:`hint`},EF={key:1},DF={key:0,class:`muted`},OF=[`placeholder`,`disabled`],kF=[`required`,`placeholder`,`aria-label`,`disabled`],AF={key:2,class:`message-error`,role:`alert`},jF=[`disabled`],MF=[`disabled`],NF=Or({__name:`PromptDialog`,props:{dialog:{}},emits:[`close`],setup(e,{emit:t}){let n=e,r=t,i=k(n.dialog.value??``),a=k(!1),o=k(``),s=k(),c=!!n.dialog.label;async function l(){if(!a.value&&(!c||n.dialog.optional||i.value.trim())){a.value=!0,o.value=``;try{await n.dialog.run(i.value.trim()),r(`close`)}catch(e){o.value=Zl(e)}finally{a.value=!1}}}return Ur(()=>void An(()=>(s.value?.focus(),s.value?.select()))),(t,n)=>(P(),F(`div`,{class:`modal-backdrop`,onClick:n[4]||=js(e=>!a.value&&r(`close`),[`self`])},[L(`form`,{class:`modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`prompt-title`,onSubmit:js(l,[`prevent`])},[L(`header`,null,[L(`h2`,CF,E(e.dialog.title),1),L(`button`,{type:`button`,class:`icon-button`,"aria-label":`Close dialog`,disabled:a.value,onClick:n[0]||=e=>r(`close`)},[R(A(ol),{size:18})],8,wF)]),e.dialog.hint?(P(),F(`p`,TF,E(e.dialog.hint),1)):B(``,!0),c?(P(),F(`label`,EF,[z(E(e.dialog.label)+` `,1),e.dialog.optional?(P(),F(`span`,DF,`(optional)`)):B(``,!0),e.dialog.multiline?Un((P(),F(`textarea`,{key:1,ref_key:`input`,ref:s,"onUpdate:modelValue":n[1]||=e=>i.value=e,rows:`4`,placeholder:e.dialog.placeholder,disabled:a.value},null,8,OF)),[[xs,i.value]]):Un((P(),F(`input`,{key:2,ref_key:`input`,ref:s,"onUpdate:modelValue":n[2]||=e=>i.value=e,maxlength:`100`,required:!e.dialog.optional,placeholder:e.dialog.placeholder,"aria-label":e.dialog.label,disabled:a.value},null,8,kF)),[[xs,i.value]])])):B(``,!0),o.value?(P(),F(`p`,AF,E(o.value),1)):B(``,!0),L(`footer`,null,[L(`button`,{type:`button`,class:`secondary`,disabled:a.value,onClick:n[3]||=e=>r(`close`)},` Cancel `,8,jF),L(`button`,{class:w([`primary`,{danger:e.dialog.danger}]),disabled:a.value||c&&!e.dialog.optional&&!i.value.trim()},E(a.value?`Working…`:e.dialog.submit),11,MF)])],32)]))}}),PF={class:`modal model-modal`},FF={class:`eyebrow`},IF={class:`model-list`},LF=[`onClick`],RF=[`src`],zF={class:`hint`},BF=Or({__name:`ModelPicker`,emits:[`close`],setup(e,{emit:t}){let n=t,r=k(``),i=V(()=>Mu.value.filter(e=>`${e.name} ${e.id} ${e.tier}`.toLowerCase().includes(r.value.toLowerCase()))),a=e=>e.id===Nu.value.agent.model?.modelId&&e.provider===Nu.value.agent.model?.provider;async function o(e){await Wu(()=>Cu.value.configure({model:{provider:e.provider,modelId:e.id}}))&&(await Hu(),G(`Model saved. Used on the next turn.`),n(`close`))}return(e,t)=>(P(),F(`div`,{class:`modal-backdrop`,onClick:t[2]||=js(e=>n(`close`),[`self`])},[L(`section`,PF,[L(`header`,null,[L(`div`,null,[L(`span`,FF,`PER AGENT · `+E(A(gu)?.id),1),t[3]||=L(`h2`,null,`Choose a model`,-1)]),L(`button`,{class:`icon-button`,"aria-label":`Close model picker`,onClick:t[0]||=e=>n(`close`)},[R(A(ol),{size:18})])]),Un(L(`input`,{"onUpdate:modelValue":t[1]||=e=>r.value=e,placeholder:`Search models or tiers…`,"aria-label":`Search models`},null,512),[[xs,r.value]]),L(`div`,IF,[(P(!0),F(N,null,M(i.value,e=>(P(),F(`button`,{key:`${e.provider}/${e.id}`,class:w({selected:a(e)}),onClick:t=>o(e)},[L(`img`,{src:A(Ju)(e.id),alt:``},null,8,RF),L(`div`,null,[L(`strong`,null,E(e.name),1),L(`small`,null,E(e.tier)+` / `+E(e.provider)+` / `+E(A(Ku)(e.contextWindow))+` context`,1)]),a(e)?(P(),I(A(ec),{key:0,size:18})):B(``,!0)],10,LF))),128))]),L(`p`,zF,`Models available on `+E(A(gu)?.id)+`. Provider keys stay on the device.`,1)])]))}}),VF={class:`dialog`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`help-title`},HF={class:`dialog-head`},UF={class:`dialog-body`},WF={class:`n`},GF={class:`body`},KF={class:`help-callout`},qF={class:`dialog-foot`},JF={class:`right`},YF=Or({__name:`HelpDialog`,setup(e){let t=[{title:`Pick a device, start a session`,body:`Every device in the tree runs dpi-backend. A session gets its own SQLite database on that device, in the directory you choose.`},{title:`Send work, then close the browser`,body:`The device owns the run. Reopening restores committed messages, state and live progress.`},{title:`Change state and fork`,body:`Edit App State by hand or through the agent. Every session and fork on a device shares it.`},{title:`Interrupt deliberately`,body:`Interrupt stops foreground work and owned subagents. Background jobs continue. Stop all includes them.`},{title:`Explore the boundaries`,body:`Queue a follow-up, steer after tools, wait for approval, compact context, reset or inspect raw state.`},{title:`Restart a device`,body:`Its tree dims and shows the restart command. Checkpointed jobs recover on boot. Replay-safe tools may rerun. Other interrupted tools return an error.`}];return(e,n)=>(P(),F(`div`,{class:`scrim`,onClick:n[2]||=js(e=>A(W).dialog=void 0,[`self`])},[L(`section`,VF,[L(`div`,HF,[n[3]||=L(`div`,null,[L(`span`,{class:`dialog-eyebrow`},`LEARN BY DOING`),L(`h3`,{id:`help-title`},`What makes this durable?`)],-1),L(`button`,{class:`icon-button`,"aria-label":`Close help`,onClick:n[0]||=e=>A(W).dialog=void 0},[R(A(ol),{size:18})])]),L(`div`,UF,[(P(),F(N,null,M(t,(e,t)=>L(`div`,{key:e.title,class:`help-step`},[L(`span`,WF,E(String(t+1).padStart(2,`0`)),1),L(`div`,null,[L(`b`,null,E(e.title),1),L(`div`,GF,E(e.body),1)])])),64)),L(`div`,KF,[R(A(Sc),{size:18}),n[4]||=L(`span`,null,`Durable does not mean exactly-once external effects. Checkpoints protect progress. Tools still need their own idempotency.`,-1)])]),L(`div`,qF,[L(`div`,JF,[L(`button`,{class:`secondary`,type:`button`,onClick:n[1]||=e=>A(W).dialog=void 0},`Close`)])])])]))}}),XF=Gt({needed:!1,busy:!1,error:``}),ZF=new Set,QF=e=>{let t=[...ZF];ZF=new Set;for(let n of t)n(e)},$F=()=>new Promise(e=>ZF.add(e));async function eI(e){if(XF.busy||!e)return!1;XF.busy=!0,XF.error=``;try{let t=await fetch(`/api/session`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({token:e})});return await t.text().catch(()=>``),t.ok?(XF.needed=!1,QF(!0),!0):(XF.error=t.status===401?`That token was not accepted.`:t.status===429?`Too many attempts. Wait a minute and try again.`:`Login failed (${t.status}).`,!1)}catch{return XF.error=`Cannot reach the hub.`,!1}finally{XF.busy=!1}}var tI=e=>{try{return new URL(e,location.href).pathname===`/api/session`}catch{return e===`/api/session`}};function nI(e){return(async(t,n)=>{let r=()=>e(t,n),i=await r();if(i.status!==401||tI(typeof t==`string`?t:t instanceof URL?t.href:t.url)||n?.body instanceof ReadableStream)return i;XF.needed=!0;let a=await i.text().catch(()=>``);return await $F()?r():new Response(a,{status:i.status,headers:i.headers})})}function rI(){typeof window>`u`||window.__adminFetch||(window.__adminFetch=!0,window.fetch=nI(window.fetch.bind(window)))}var iI={class:`login-veil`,"data-testid":`login-card`},aI=[`disabled`],oI={key:0,class:`message-error`,role:`alert`},sI=[`disabled`],cI=Or({__name:`LoginCard`,setup(e){let t=k(``),n=k();async function r(){if(XF.busy||!t.value.trim())return;let e=await eI(t.value.trim());t.value=``,e&&n.value?.blur()}return Ur(()=>void An(()=>n.value?.focus())),(e,i)=>(P(),F(`div`,iI,[L(`form`,{class:`modal login-card`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`login-title`,onSubmit:js(r,[`prevent`])},[i[2]||=L(`header`,null,[L(`h2`,{id:`login-title`},`Admin token`)],-1),i[3]||=L(`p`,{class:`hint`},[z(` This hub is locked. Sign in with the token from its `),L(`code`,null,`admin.token`),z(` file. `)],-1),i[4]||=L(`label`,{for:`admin-token`},`Admin token`,-1),Un(L(`input`,{id:`admin-token`,ref_key:`input`,ref:n,"onUpdate:modelValue":i[0]||=e=>t.value=e,type:`password`,name:`admin-token`,autocomplete:`off`,spellcheck:`false`,placeholder:`adm_…`,"aria-label":`Admin token`,disabled:A(XF).busy,onKeydown:i[1]||=Ns(e=>A(XF).error=``,[`esc`])},null,40,aI),[[xs,t.value]]),A(XF).error?(P(),F(`p`,oI,E(A(XF).error),1)):B(``,!0),L(`footer`,null,[L(`button`,{class:`primary`,type:`submit`,disabled:A(XF).busy||!t.value.trim()},E(A(XF).busy?`Checking…`:`Sign in`),9,sI)])],32)]))}}),lI={key:0,class:`toast`,role:`status`},uI=Or({__name:`Toast`,setup(e){return(e,t)=>(P(),I(So,{name:`toast`},{default:Hn(()=>[A(W).toast?(P(),F(`div`,lI,[R(A(ec),{size:18}),z(E(A(W).toast),1)])):B(``,!0)]),_:1}))}}),dI={class:`shell`,"data-testid":`app-shell`},fI={key:0,class:`error-banner`,role:`alert`},pI={key:4,class:`welcome`,"data-testid":`welcome-empty`},mI=[`disabled`],hI={class:`welcome-features`},gI={class:`modal path-modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`path-title`},_I={class:`full-directory`},vI=Or({__name:`App`,setup(e){let t=()=>lu.devices.value.filter(e=>e.status===`online`).length,n=k();function r(){W.dialog={kind:`new-session`,deviceId:U.value?.deviceId}}function i(e){let t=W.dialog?void 0:sd(e);if(t)return e.preventDefault(),t===`tree`?rd():id();if(e.key===`Escape`){if(W.dialog){W.dialog.kind===`pair`?n.value?.close():W.dialog=void 0;return}!e.repeat&&!e.isComposing&&Lu.value&&(e.preventDefault(),Zu()),W.drawer=!1,W.inspectorOverlay=!1}}function a(e){let t=e.clientX,n=fu.value,r=e=>fu.value=Math.max(220,Math.min(560,n+e.clientX-t)),i=()=>{window.removeEventListener(`pointermove`,r),window.removeEventListener(`pointerup`,i)};window.addEventListener(`pointermove`,r),window.addEventListener(`pointerup`,i)}return Ur(()=>jd()),Ur(()=>{document.addEventListener(`keydown`,i),Au()}),Kr(()=>{su.stop(),document.removeEventListener(`keydown`,i)}),(e,i)=>(P(),F(`div`,dI,[R(hd,{onNewSession:r}),A(W).error?(P(),F(`div`,fI,[R(A(Sc),{size:18}),L(`span`,null,E(A(W).error),1),L(`button`,{class:`icon-button`,"aria-label":`Dismiss error`,onClick:i[0]||=e=>A(W).error=``},`×`)])):B(``,!0),L(`main`,{class:`net-workspace`,style:ve({"--tree-w":`${A(fu)}px`})},[R(cf),A(pu).tree?(P(),F(`div`,{key:0,class:`tree-resizer`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize network tree`,onPointerdown:js(a,[`prevent`])},null,32)):B(``,!0),A(W).drawer?(P(),F(`div`,{key:1,class:`tree-backdrop`,onClick:i[1]||=e=>A(W).drawer=!1})):B(``,!0),A(U)&&A(gu)&&A(_u)?(P(),F(N,{key:2},[R(aC),A(W).inspectorOverlay?(P(),F(`div`,{key:0,class:`inspector-backdrop`,onClick:i[2]||=e=>A(nd)()})):B(``,!0),(P(),I(nv,{key:`${A(U).deviceId}/${A(U).sessionId}`}))],64)):A(U)&&A(gu)?(P(),I(hC,{key:3,device:A(gu)},null,8,[`device`])):(P(),F(`section`,pI,[i[14]||=L(`img`,{class:`welcome-symbol`,src:`/icons/durable-pi.svg`,alt:`Durable Pi`},null,-1),i[15]||=L(`span`,{class:`eyebrow`},`THE DURABLE AGENT NETWORK`,-1),i[16]||=L(`h1`,null,[z(`Close the tab.`),L(`br`),z(`The work continues.`)],-1),i[17]||=L(`p`,null,`Agents run on your devices. This page is only a window into them.`,-1),L(`button`,{class:`primary`,disabled:!t(),onClick:r},[R(A(Hc),{size:18}),z(E(A(lu).devices.value.length?`Create a session`:`Add a device to dpi-network.yaml`),1)],8,mI),L(`div`,hI,[L(`span`,null,[R(A(uc),{size:18}),i[11]||=z(`SQLite on each device`,-1)]),L(`span`,null,[R(A(vc),{size:18}),i[12]||=z(`Branch any agent`,-1)]),L(`span`,null,[R(A(Us),{size:18}),i[13]||=z(`Watch from anywhere`,-1)])])]))],4),R(vd),A(W).dialog?.kind===`pair`?(P(),I(vF,{key:1,ref_key:`pairWizard`,ref:n,handoff:A(W).dialog.handoff,onClose:i[3]||=e=>A(W).dialog=void 0},null,8,[`handoff`])):B(``,!0),A(W).dialog?.kind===`credentials`?(P(),I(SF,{key:2,"device-id":A(W).dialog.deviceId,onClose:i[4]||=e=>A(W).dialog=void 0},null,8,[`device-id`])):B(``,!0),A(W).dialog?.kind===`new-session`?(P(),I(MC,{key:3,"device-id":A(W).dialog.deviceId,onClose:i[5]||=e=>A(W).dialog=void 0},null,8,[`device-id`])):A(W).dialog?.kind===`prompt`?(P(),I(NF,{key:4,dialog:A(W).dialog,onClose:i[6]||=e=>A(W).dialog=void 0},null,8,[`dialog`])):A(W).dialog?.kind===`models`?(P(),I(BF,{key:5,onClose:i[7]||=e=>A(W).dialog=void 0})):A(W).dialog?.kind===`path`?(P(),F(`div`,{key:6,class:`modal-backdrop`,onClick:i[10]||=js(e=>A(W).dialog=void 0,[`self`])},[L(`section`,gI,[L(`header`,null,[i[18]||=L(`h2`,{id:`path-title`},`Working directory`,-1),L(`button`,{class:`icon-button`,"aria-label":`Close working directory`,onClick:i[8]||=e=>A(W).dialog=void 0},[R(A(ol),{size:18})])]),L(`code`,_I,E(A(W).dialog.path),1),L(`footer`,null,[L(`button`,{class:`secondary`,onClick:i[9]||=e=>A(W).dialog=void 0},`Close`)])])])):A(W).dialog?.kind===`help`?(P(),I(YF,{key:7})):B(``,!0),A(XF).needed?(P(),I(cI,{key:8})):B(``,!0),R(uI)]))}});rI();var yI=new URL(window.location.href);if(/^\/pair\/?$/.test(yI.pathname)){let e=RP(yI);e?(yI.search=``,yI.hash=``,window.history.replaceState(window.history.state,``,yI),W.dialog={kind:`pair`,handoff:e}):window.history.replaceState(window.history.state,``,BP(yI))}Ls(vI).mount(`#app`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;450;500;550;600;650;700&family=Manrope:wght@400;500;600;650;700;750;800&family=IBM+Plex+Mono:wght@400;500&display=swap";.git-chip-wrap[data-v-c0fb9e98]{align-items:center;display:inline-flex;position:relative}.git-chip[data-v-c0fb9e98]{gap:4px}.git-chip .branch[data-v-c0fb9e98]{text-overflow:ellipsis;white-space:nowrap;max-width:14ch;overflow:hidden}.dirty[data-v-c0fb9e98]{color:var(--warn,#e5a50a)}.ahead[data-v-c0fb9e98]{color:var(--ok,#2ea043)}.behind[data-v-c0fb9e98]{color:var(--info,#58a6ff)}.tunnel-status{flex-wrap:wrap;align-items:center;gap:.5rem;font-size:.75rem;display:inline-flex}.tunnel-status .axis{border:1px solid var(--border,#333);border-radius:999px;align-items:center;gap:.25rem;padding:.1rem .5rem;display:inline-flex}.tunnel-status .axis.transport{color:var(--fg,#eee)}.tunnel-status .axis.monitor.offline{color:var(--muted,#888)}.tunnel-status .axis.monitor.unauthorized,.tunnel-status .axis.monitor.mismatch,.tunnel-status .axis.monitor.incompatible{color:var(--warn,#e0b040)}.tunnel-status .axis.monitor.online{color:var(--ok,#6cc070)}.tunnel-status .axis.muted{color:var(--muted,#888);border-style:dashed}.tunnel-status .axis.url{color:var(--accent,#7ab8ff);text-decoration:none}.tunnel-status .live{color:var(--ok,#6cc070)}.token-manager{border:1px solid var(--border,#333);border-radius:8px;flex-direction:column;gap:.5rem;padding:.6rem .8rem;font-size:.8rem;display:flex}.token-manager header{align-items:center;gap:.4rem;display:flex}.token-manager h3{text-transform:uppercase;letter-spacing:.08em;margin:0;font-size:.8rem}.token-manager .pairing-status{border:1px solid var(--border,#333);border-radius:999px;margin-left:auto;padding:.05rem .5rem;font-size:.7rem}.token-manager .pairing-status.paired{color:var(--ok,#6cc070)}.token-manager .pairing-status.revoked{color:var(--warn,#e0b040)}.token-manager dl{grid-template-columns:auto 1fr;gap:.15rem .8rem;margin:0;display:grid}.token-manager dt{color:var(--muted,#888)}.token-manager dd{text-overflow:ellipsis;min-width:0;margin:0;overflow:hidden}.token-manager .credential-fingerprint{white-space:normal;overflow-wrap:anywhere}.token-manager .rotation-badge{color:var(--warn,#e0b040);align-items:center;gap:.35rem;margin:0;font-size:.75rem;display:flex}.token-manager .token-actions{flex-wrap:wrap;gap:.5rem;display:flex}.token-manager .spin{animation:1.2s linear infinite tm-spin}@keyframes tm-spin{to{transform:rotate(360deg)}}.git-pane[data-v-409b464c]{gap:4px;display:grid}.git-top[data-v-409b464c]{flex-wrap:wrap;gap:8px}.branch-wrap[data-v-409b464c]{position:relative}.branch-btn[data-v-409b464c]{border:1px solid var(--line);border-radius:6px;align-items:center;gap:7px;padding:6px 12px;display:inline-flex}.branch-btn strong[data-v-409b464c]{font-size:16px}.menu[data-v-409b464c]{z-index:40;background:var(--bg-2,#221a1c);border:1px solid var(--line);border-radius:8px;min-width:300px;max-height:280px;padding:4px;position:absolute;top:calc(100% + 6px);left:0;overflow:auto;box-shadow:0 10px 30px #00000080}.menu button[data-v-409b464c]{text-align:left;border-radius:6px;align-items:center;gap:10px;width:100%;padding:7px 10px;font-size:15px;display:flex}.menu button[data-v-409b464c]:hover,.menu button.cur[data-v-409b464c]{background:#403536}.menu .new-branch[data-v-409b464c]{border-top:1px solid var(--line);gap:6px;padding:8px;display:flex}.menu .new-branch input[data-v-409b464c]{flex:1;min-width:0}.auto-stash[data-v-409b464c]{opacity:.85;align-items:center;gap:8px;padding:8px 10px;font-size:14px;display:flex}.muted-line[data-v-409b464c]{opacity:.65;font-size:13px}.cap[data-v-409b464c]{padding:4px 0}.row[data-v-409b464c]{flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0;display:flex}.hintbox[data-v-409b464c]{border-radius:6px;flex-wrap:wrap;align-items:center;gap:10px;margin:4px 0;padding:6px 10px;display:flex}.hintbox.warn[data-v-409b464c]{border:1px solid var(--warn,#e5a50a);color:var(--warn,#e5a50a)}.merge-banner[data-v-409b464c]{border-radius:6px;padding:8px 10px}.files[data-v-409b464c]{border:1px solid var(--line);border-radius:8px;max-height:260px;padding:4px 10px;overflow:auto}.file[data-v-409b464c]{justify-content:space-between;align-items:center;gap:6px;padding:3px 0;display:flex}.file.all[data-v-409b464c]{border-bottom:1px solid var(--line)}.file-label[data-v-409b464c]{cursor:pointer;flex:1;align-items:center;gap:8px;min-width:0;display:flex}.file .path[data-v-409b464c]{text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.file .xy[data-v-409b464c]{opacity:.7;font-size:12px}.nums[data-v-409b464c]{opacity:.8;color:var(--ok,#2ea043);white-space:nowrap;font-size:11px}.nums.bin[data-v-409b464c]{color:var(--warn,#e5a50a)}.dir-row[data-v-409b464c]{opacity:.8;align-items:center;gap:6px;width:100%;padding:3px 0;font-size:13px;display:flex}.dir-row .open[data-v-409b464c]{transform:rotate(90deg)}.file-acts[data-v-409b464c]{gap:2px;display:flex}.file-diff[data-v-409b464c]{border:1px solid var(--line);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;margin:8px 0;padding:8px 10px;display:flex}.file-diff pre[data-v-409b464c]{width:100%;max-height:260px;margin:6px 0 0;font-size:12px;overflow:auto}.mode-chips[data-v-409b464c]{gap:2px;display:inline-flex}.mode-chips button[data-v-409b464c]{border:1px solid var(--line);border-radius:10px;padding:2px 8px;font-size:12px}.mode-chips button.on[data-v-409b464c]{background:#403536}textarea[data-v-409b464c]{resize:vertical;width:100%;min-height:76px;font:inherit;margin-top:8px}.commits[data-v-409b464c]{gap:3px;max-height:340px;display:grid;overflow:auto}.commit-row[data-v-409b464c]{white-space:nowrap;align-items:center;gap:8px;display:flex}.commit-row .lane[data-v-409b464c]{flex-shrink:0}.commit-row .hash[data-v-409b464c]{color:var(--ok,#2ea043);font-size:13px}.hash-btn svg[data-v-409b464c]{transition:transform .1s}.hash-btn svg.open[data-v-409b464c]{transform:rotate(90deg)}.commit-row .refs[data-v-409b464c]{color:var(--warn,#e5a50a);text-overflow:ellipsis;max-width:18ch;font-size:12px;overflow:hidden}.commit-row .subject[data-v-409b464c]{text-overflow:ellipsis;max-width:40%;font-size:14px;overflow:hidden}.commit-row .who[data-v-409b464c]{font-size:12px}.commit-files[data-v-409b464c]{border-left:2px solid var(--line);margin-left:16px;padding:2px 0 6px 34px}.cf[data-v-409b464c]{gap:10px;padding:1px 0;font-size:13px;display:flex}.cf-status[data-v-409b464c]{opacity:.8;width:2ch;font-size:11px}.cps[data-v-409b464c]{border:1px solid var(--line);border-radius:8px;margin-bottom:6px;padding:4px 10px}.cp-row[data-v-409b464c]{align-items:center;gap:10px;padding:2px 0;font-size:14px;display:flex}.cp-row code[data-v-409b464c]{color:var(--warn,#e5a50a)}.cp-subj[data-v-409b464c]{text-overflow:ellipsis;white-space:nowrap;max-width:40%;overflow:hidden}.wt[data-v-409b464c]{align-items:center;gap:8px;padding:2px 0;display:flex}.wt code[data-v-409b464c]{text-overflow:ellipsis;white-space:nowrap;max-width:40%;font-size:13px;overflow:hidden}.wt.main code[data-v-409b464c]{font-weight:650}.grow[data-v-409b464c]{flex:1}.tag-x[data-v-409b464c]{opacity:.7;margin-left:4px;display:inline-flex}.op-out[data-v-409b464c]{background:#00000040;border-radius:6px;max-height:300px;margin-top:8px;padding:10px;font-size:12px;overflow:auto}h4[data-v-409b464c]{align-items:center;gap:8px;margin:0;font-size:16px;display:flex}.device-handoff[data-v-01884b7b]{border:1px solid var(--border);background:var(--panel);border-radius:12px;margin-bottom:14px;padding:14px 16px}header[data-v-01884b7b]{align-items:center;gap:8px;margin-bottom:6px;font-weight:650;display:flex}h3[data-v-01884b7b]{margin:0;font-size:14.5px}.what[data-v-01884b7b]{color:var(--muted);margin:0 0 10px;font-size:13px}code[data-v-01884b7b]{font-family:ui-monospace,monospace;font-size:12px}.row[data-v-01884b7b]{flex-wrap:wrap;align-items:end;gap:8px;display:flex}label[data-v-01884b7b]{color:var(--muted);gap:4px;font-size:12px;display:grid}input[data-v-01884b7b]{border:1px solid var(--border);background:var(--panel);width:90px;color:inherit;font:inherit;border-radius:8px;padding:7px 9px}.err[data-v-01884b7b]{color:var(--danger,#f28b82);margin:8px 0 0;font-size:12.5px}.target[data-v-01884b7b]{color:var(--muted);word-break:break-all;margin:10px 0 0;font-family:ui-monospace,monospace;font-size:12px}.pair-wizard .pair-steps{color:var(--muted,#888);gap:.5rem;margin:.25rem 0 .75rem;padding:0;font-size:.78rem;list-style:none;display:flex}.pair-wizard .pair-steps li{border:1px solid #0000;border-radius:999px;padding:.15rem .6rem}.pair-wizard .pair-steps li.on{color:var(--fg,#eee);border-color:currentColor}.pair-wizard .pair-grid{grid-template-columns:auto 1fr;align-items:start;gap:1rem;display:grid}.pair-wizard .pair-code{letter-spacing:.18em;font-size:1.7rem;font-family:var(--mono,monospace);margin-bottom:.35rem}.pair-wizard .pair-copy-actions{flex-wrap:wrap;gap:.4rem;display:flex}.pair-wizard .pair-qr svg{border:1px solid var(--border,#333);border-radius:6px}.pair-wizard .pair-side{flex-direction:column;gap:.6rem;min-width:0;display:flex}.pair-wizard .fp{word-break:break-all;background:var(--bg2,#222);border-radius:6px;padding:.4rem;font-size:.78rem;display:block}.pair-wizard .pair-confirm{align-items:center;gap:.45rem;font-size:.85rem;display:flex}.pair-wizard .pair-confirm.warn{color:var(--warn,#e0b040)}.pair-wizard .spin{animation:1.2s linear infinite pair-spin}@keyframes pair-spin{to{transform:rotate(360deg)}}.pair-pending{border:1px solid #2a3442;border-radius:12px;margin:0 0 18px;padding:14px 16px}.pair-pending h3{margin:0 0 10px;font-size:14px}.pair-pending ul{gap:10px;margin:0;padding:0;list-style:none;display:grid}.pair-pending li{border-bottom:1px solid #222b36;gap:4px;padding-bottom:10px;display:grid}.pair-pending li:last-child{border-bottom:0;padding-bottom:0}.pair-pending .who{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}.pair-pending .fp{word-break:break-all;color:#7ee2a8;font-family:ui-monospace,monospace;font-size:12px}.pair-pending .row{justify-content:space-between;align-items:center;gap:10px;display:flex}.pair-pending .phase{color:#8fa0b5;font-size:12px}:root{font-family:var(--font-body);color:var(--fg);background:var(--bg);font-synthesis:none;--bg:#151010;--tree:#181213;--chat:#161011;--panel:#1c1516;--card:#251a1b;--line-soft:#2a2021;--fg:#f2eeee;--faint:#8d7778;--primary:#b9283c;--primary-line:#df5363;--primary-hover:#cf354a;--on-primary:#fff;--ok:#6fcf97;--warn:#f2c94c;--err:#ff6b6b;--offline:#5a4a4b;--font-body:"DM Sans", "Segoe UI", sans-serif;--font-display:"Manrope", "Segoe UI", sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, Menlo, monospace;--topbar-h:65px;--tree-w:300px;--insp-w:450px;--radius:10px;--radius-sm:6px;--ease:cubic-bezier(.2, .7, .3, 1);--secondary:#c9a87c;--muted:var(--secondary);--line:#332829;--accent:#ff8997;--surface:#1e1718;--font-title:var(--font-display);font-size:16px}*{box-sizing:border-box}body{margin:0}button,input,textarea,select{font:inherit}button{cursor:pointer}button,a,input,textarea,select{-webkit-tap-highlight-color:transparent}button{color:inherit;background:0 0;border:0;justify-content:center;align-items:center;gap:7px;display:inline-flex}button:disabled{opacity:.8;cursor:not-allowed}button:not(:disabled):hover{filter:brightness(1.13)}button:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:3px}input,textarea,select{color:inherit;background:var(--chat);border:1px solid var(--line);border-radius:7px;outline:none;min-width:0;padding:10px 12px}input::placeholder,textarea::placeholder{color:var(--fg)}textarea{resize:vertical;line-height:1.6}select{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;cursor:pointer}h1,h2,h3,p{margin:0}h1,h2,h3{font-family:var(--font-title)}h2{font-size:16px;font-weight:650}pre,code{font-family:var(--font-mono)}pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:16px;line-height:1.7}small{font-size:16px}svg{flex-shrink:0}.shell{flex-direction:column;height:100dvh;display:flex;overflow:hidden}.topbar{height:var(--topbar-h);min-height:var(--topbar-h);border-bottom:1px solid var(--line);background:var(--panel);z-index:10;justify-content:space-between;align-items:center;padding:0 26px 0 17px;display:flex}.brand,.top-actions{align-items:center;gap:14px;display:flex}.brand strong{letter-spacing:-.5px;font-size:16px;font-family:var(--font-title);font-weight:750}.brandmark{flex-shrink:0;width:45px;height:25px;margin-left:3px;display:block}.brand-separator{color:var(--fg);margin:0 2px;font-weight:400}.muted{color:var(--muted)}.icon-button{width:29px;height:29px;color:var(--muted);border-radius:5px;padding:4px}.icon-button:hover{color:var(--fg);background:#ffffff08}.primary{background:var(--accent);color:var(--fg);border:1px solid var(--accent);white-space:nowrap;border-radius:7px;padding:12px 18px;font-weight:650;box-shadow:0 1px 2px #0002}.primary.small{padding:8px 12px;font-size:16px}.secondary{background:#2b2021;border:1px solid #443738;border-radius:6px;padding:8px 12px;font-size:16px;font-weight:500}.connection{color:var(--muted);align-items:center;gap:7px;font-size:16px;display:flex}.connection i,.live-dot{background:#756062;border-radius:100%;flex-shrink:0;width:5px;height:5px;display:inline-block}.connection .online,.live-dot{background:var(--accent);box-shadow:0 0 7px #cdadb018}.version{font-family:var(--font-mono);color:var(--fg);border:1px solid #3b3031;border-radius:4px;padding:4px 6px;font-size:16px}.workspace{flex:1;grid-template-columns:minmax(340px,34%) minmax(0,1fr);min-height:0;display:grid}.inspector{border-right:1px solid var(--line);background:var(--panel);flex-direction:column;min-height:0;display:flex}.session-heading{padding:25px 26px 21px}.eyebrow{letter-spacing:1.8px;color:var(--fg);font-size:16px;font-weight:600}.session-heading h1{color:var(--fg);letter-spacing:-.7px;overflow-wrap:anywhere;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px;font-size:16px;font-weight:650;display:flex}.path{font-family:var(--font-mono);color:var(--fg);overflow-wrap:anywhere;align-items:center;gap:7px;font-size:16px;display:flex}.session-status{align-items:center;gap:9px;margin-top:19px;display:flex}.status-pill{color:var(--fg);background:#352728;border-radius:4px;align-items:center;gap:6px;padding:4px 8px;font-size:16px;line-height:1.3;display:flex}.status-pill i{background:currentColor;border-radius:50%;width:4px;height:4px}.status-pill.working{color:var(--accent);background:#412b2d}.working i{animation:1.5s infinite pulse}.saved{color:var(--fg);align-items:center;gap:5px;margin-left:auto;font-size:16px;display:flex}.background-pill{color:var(--fg);font-size:16px}.model-section{border-top:1px solid var(--line);padding:18px 26px 22px}.section-label{letter-spacing:1.3px;color:var(--fg);justify-content:space-between;margin-bottom:13px;font-size:16px;display:flex}.section-label span+span{letter-spacing:0;color:var(--fg)}.model-button{text-align:left;background:#251c1d;border:1px solid #423435;border-radius:8px;width:100%;padding:11px 13px}.model-button img,.model-list img{object-fit:contain;background:#f0e8e9;border-radius:6px;width:29px;height:29px;padding:3px}.model-button>div{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.model-button strong{text-overflow:ellipsis;white-space:nowrap;font-size:16px;overflow:hidden}.model-button small{color:var(--muted);font-size:16px}.thinking-row{color:var(--fg);justify-content:space-between;align-items:center;margin-top:10px;font-size:16px;display:flex}.thinking-row select{color:var(--fg);background:0 0;border:0;padding:4px 2px;font-size:16px}.metrics{grid-template-columns:1fr 1.3fr .5fr;margin-top:21px;display:grid}.metrics>div{flex-direction:column;gap:5px;display:flex}.metrics span{font-family:var(--font-title);letter-spacing:-.5px;font-size:19px;font-weight:500}.metrics small{color:var(--fg);font-size:16px}.stats-section{margin-top:24px}.stats-section .metrics{margin-top:14px}.usage-breakdown{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;margin-top:22px;font-size:16px}.usage-breakdown th,.usage-breakdown td{text-align:right;border-bottom:1px solid var(--line);padding:10px 0;font-weight:400}.usage-breakdown th{color:var(--secondary)}.usage-breakdown th:first-child{text-align:left}.usage-breakdown td{color:var(--fg)}.inspector-tabs{border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--tree);padding:0 16px;display:flex}.inspector-tabs button{color:var(--fg);border-bottom:2px solid #0000;flex:1;gap:6px;padding:15px 3px 13px;font-size:16px}.inspector-tabs button.active{color:var(--accent);border-bottom-color:var(--accent)}.count{background:#462f31;border-radius:4px;padding:1px 4px;font-size:16px}.inspector-body{scrollbar-width:thin;scrollbar-color:var(--line) transparent;flex:1;padding:23px 26px 32px;overflow:auto}.panel-heading{justify-content:space-between;align-items:center;gap:9px;display:flex}.panel-heading svg{color:var(--fg)}.tag{color:var(--fg);white-space:nowrap;background:#302526;border:1px solid #403536;border-radius:4px;padding:3px 5px;font-size:16px}.tag.completed{color:var(--accent)}.tag.waiting,.tag.aborted,.tag.rejected{color:var(--fg)}.hint{color:var(--fg);margin:8px 0 18px;font-size:16px;line-height:1.65}.field-label{letter-spacing:1px;color:var(--fg);margin-bottom:8px;font-size:16px;display:block}.inline-input{background:#181112;border:1px solid #3a2d2e;border-radius:7px;align-items:center;display:flex;overflow:hidden}.inline-input input{width:100%;box-shadow:none;background:0 0;border:0;padding:10px;font-size:16px}.inline-input .icon-button{margin-right:4px}.counter-card{background:#261b1c;border:1px solid #403031;border-radius:8px;justify-content:space-between;align-items:center;margin:16px 0;padding:17px 15px;display:flex}.app-state-json{white-space:pre-wrap;overflow-wrap:anywhere;border:1px solid var(--line);background:#140e10;border-radius:8px;max-height:300px;margin:16px 0 24px;padding:16px;font-size:16px;line-height:1.6;overflow:auto}.state-field{min-width:0}.state-field:not(.state-root){border:1px solid var(--line);border-radius:8px;margin:10px 0;padding:12px}.state-field .state-field{background:#25191c40}.state-field-heading{align-items:center;gap:8px;margin-bottom:12px;display:flex}.state-field-heading strong{overflow-wrap:anywhere;flex:1;min-width:0;font-size:16px}.state-field-heading select{width:auto;max-width:120px;color:var(--secondary);padding:5px}.state-field-heading .icon-button{flex-shrink:0}.state-field textarea,.state-field input{width:100%;min-width:0;font-size:16px}.state-number{align-items:center;gap:8px;display:flex}.state-number input{text-align:center;appearance:textfield}.state-number input::-webkit-inner-spin-button{appearance:none}.state-number input::-webkit-outer-spin-button{appearance:none}.state-number button{flex-shrink:0;padding:10px}.state-boolean{align-items:center;gap:12px;display:flex}.state-boolean>span{color:var(--secondary)}.state-add{flex-wrap:wrap;gap:8px;margin-top:12px;display:flex}.state-add input{flex-basis:100%}.state-add select{flex:1;width:auto}.state-add-button{margin-top:8px}.counter-card .field-label{margin:0;font-size:16px}.counter-card strong{font-family:var(--font-title);color:var(--accent);margin-top:4px;font-size:32px;font-weight:500;line-height:1.1;display:block}.counter-card .secondary{color:var(--fg);background:#392a2b;border-color:#5a3c3f;padding:7px 9px;font-size:16px}.note{color:var(--fg);overflow-wrap:anywhere;align-items:flex-start;gap:8px;margin:0 0 10px;font-size:16px;line-height:1.6;display:flex}.note>span{background:#836669;border-radius:50%;flex-shrink:0;width:4px;height:4px;margin-top:7px}.notes{margin-bottom:14px}.raw{border-top:1px solid var(--line);margin-top:16px;padding-top:12px}.raw summary{cursor:pointer;color:var(--fg);font-family:var(--font-mono);align-items:center;gap:7px;font-size:16px;list-style:none;display:flex}.raw summary:after{content:"+";color:var(--fg);margin-left:auto}.raw[open] summary:after{content:"−"}.raw summary span{color:var(--fg);margin-left:auto;font-size:16px}.raw pre{background:var(--chat);color:var(--fg);border:1px solid #35292a;border-radius:6px;max-height:340px;padding:11px;overflow:auto}.raw textarea{width:100%;font-size:16px}.raw button{margin-top:8px}.section-divider{border-top:1px solid var(--line);margin:25px 0 22px}.demo-action{text-align:left;border-bottom:1px solid #362829;align-items:center;gap:11px;width:100%;padding:12px 0;display:flex}.demo-action>span:nth-child(2){flex-direction:column;flex:1;gap:4px;display:flex}.demo-action strong{font-size:16px;font-weight:500}.demo-action small{color:var(--fg);font-size:16px}.demo-action>svg{color:var(--fg)}.demo-icon{width:32px;height:32px;color:var(--accent);background:#3b292b;border-radius:7px;justify-content:center;align-items:center;display:flex}.demo-icon.lavender{color:var(--fg);background:#3b292b}.job-card{background:#26191a;border:1px solid #453536;border-radius:7px;margin-top:16px;padding:13px}.job-title{justify-content:space-between;align-items:center;gap:5px;display:flex}.job-title strong{font-size:16px;font-weight:500}.progress{background:#403031;border-radius:4px;height:3px;margin:14px 0 8px;overflow:hidden}.progress>div{background:var(--accent);height:100%;transition:width .3s}.job-meta{font-family:var(--font-mono);color:var(--fg);justify-content:space-between;gap:6px;font-size:16px;display:flex}.approval{flex-wrap:wrap;gap:7px;margin-top:15px;display:flex}.approval>span{width:100%;color:var(--fg);margin-bottom:3px;font-size:16px}.approval button{padding:6px 10px;font-size:16px}.text-button{color:var(--accent);margin-top:12px;padding:0;font-size:16px}.danger{color:var(--fg)}.inspector-footer{height:39px;min-height:39px;color:var(--fg);border-top:1px solid #372728;align-items:center;gap:8px;padding:0 22px;font-size:16px;display:flex}.inspector-footer .icon-button{margin-left:auto}.chat-panel{background:var(--chat);flex-direction:column;min-height:0;display:flex;position:relative}.agent-stream-status{border-bottom:1px solid var(--warn);color:var(--warn);flex-wrap:wrap;align-items:center;gap:12px;padding:12px 24px;display:flex}.agent-stream-status>div{overflow-wrap:anywhere;flex:220px;min-width:0}.agent-stream-status p{margin:4px 0 0;font-size:13px}.chat-header{border-bottom:1px solid var(--line);background:#1c1415;justify-content:space-between;align-items:center;min-height:63px;padding:0 25px;display:flex}.conversation-select{color:var(--fg);align-items:center;gap:9px;min-width:0;display:flex}.conversation-select select{box-shadow:none;color:var(--fg);background:0 0;border:0;max-width:230px;padding:8px 3px;font-size:16px}.fork-label{white-space:nowrap;color:var(--fg);align-items:center;gap:3px;font-size:16px;display:flex}.chat-header-actions{align-items:center;gap:8px;display:flex}.relative{position:relative}.dropdown{z-index:20;background:var(--line-soft);border:1px solid #4b3b3c;border-radius:8px;min-width:205px;padding:6px;position:absolute;top:36px;right:0;box-shadow:0 10px 35px #0005}.dropdown button{width:100%;color:var(--fg);border-radius:5px;justify-content:flex-start;padding:10px 9px;font-size:16px;display:flex}.dropdown button:hover{background:#3c2d2e}.chat-scroll{scrollbar-width:thin;scrollbar-color:var(--line) transparent;scroll-behavior:smooth;flex:1;padding:32px clamp(24px,5vw,88px) 20px;overflow:auto}.chat-empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;min-height:100%;padding:30px 0 48px;display:flex}.agent-orb{background:radial-gradient(at top,#492d2f,#281a1b);border:1px solid #503a3c;border-radius:17px;justify-content:center;align-items:center;width:58px;height:58px;margin-bottom:26px;display:flex;position:relative;box-shadow:0 10px 50px #b07d820c}.agent-orb>img{width:45px;height:25px}.agent-orb>i{border:3px solid var(--chat);background:var(--accent);border-radius:50%;width:11px;height:11px;position:absolute;bottom:-1px;right:-2px}.chat-empty .eyebrow{letter-spacing:2.1px;font-size:16px}.chat-empty h2{letter-spacing:-.8px;margin:11px 0;font-size:27px;font-weight:500}.chat-empty p{color:var(--fg);font-size:16px;line-height:1.7}.starter-grid{grid-template-columns:1fr 1fr;gap:13px;width:100%;max-width:470px;margin-top:34px;display:grid}.starter-grid button{text-align:left;background:var(--tree);border:1px solid #3c2c2d;border-radius:8px;flex-direction:column;align-items:flex-start;gap:6px;padding:18px;display:flex;position:relative}.starter-grid button>svg:first-child{color:var(--fg);margin-bottom:13px}.starter-grid strong{font-size:16px;font-weight:500}.starter-grid span{color:var(--fg);font-size:16px}.starter-grid button>svg:last-child{color:var(--fg);position:absolute;top:16px;right:13px}.composer-region{background:linear-gradient(transparent, var(--chat) 15%);padding:18px clamp(20px,3vw,46px) 16px}.composer{background:#281c1d;border:1px solid #513d3f;border-radius:11px;box-shadow:0 6px 30px #0002}.composer textarea{resize:none;width:100%;min-height:80px;max-height:220px;box-shadow:none;background:0 0;border:0;padding:18px 20px 9px;font-size:16px;display:block}.composer-toolbar{justify-content:space-between;align-items:center;gap:7px;padding:9px 11px 12px 17px;display:flex}.composer-left,.composer-right{align-items:center;gap:12px;display:flex}.context-indicator{color:var(--fg);align-items:center;gap:5px;font-size:16px;display:flex}.composer-left select{color:var(--fg);background:0 0;border:0;padding:4px;font-size:16px}.interrupt{color:var(--fg);background:#452b2d24;border:1px solid #66414460;border-radius:5px;padding:6px 8px;font-size:16px}.send{background:var(--accent);width:33px;height:33px;color:var(--fg);border-radius:7px}.composer-footnote{color:var(--fg);justify-content:space-between;align-items:center;gap:12px;margin-top:11px;font-size:16px;display:flex}.composer-footnote>span:first-child{align-items:center;gap:6px;display:flex}.composer-footnote .live-dot{width:4px;height:4px}.entry{margin-bottom:26px;position:relative}.message-label{color:var(--fg);letter-spacing:1.3px;align-items:center;gap:8px;margin-bottom:10px;font-size:16px;display:flex}.message-label>span:not(.mini-pi):not(.streaming){font-family:var(--font-mono);letter-spacing:0;color:var(--fg);font-size:16px}.user-message{white-space:pre-wrap;color:var(--fg);font-size:16px;line-height:1.8}.pi-user{border-bottom:1px solid #392628;padding-bottom:20px}.mini-pi{flex-shrink:0;width:36px;height:20px}.markdown{color:var(--fg);overflow-wrap:anywhere;font-size:16px;line-height:1.85}.markdown p{margin:0 0 14px}.markdown p:last-child{margin-bottom:0}.markdown h1,.markdown h2,.markdown h3{color:var(--fg);margin:22px 0 12px;font-size:16px}.markdown ul,.markdown ol{margin:12px 0;padding-left:23px}.markdown li{margin:6px 0}.markdown strong{color:var(--fg);font-weight:600}.markdown code{color:var(--fg);background:#3a2628;border-radius:4px;padding:2px 5px;font-size:16px}.markdown pre{white-space:pre;background:#251819;border:1px solid #3d2b2d;border-radius:7px;margin:14px 0;padding:16px;overflow:auto}.markdown pre code{background:0 0;padding:0}.markdown a{color:var(--accent)}.markdown table{border-collapse:collapse;width:100%}.markdown td,.markdown th{border:1px solid var(--line);text-align:left;padding:8px}.fork-button{color:var(--fg);letter-spacing:0;opacity:1;white-space:nowrap;margin-left:auto;padding:3px 5px;font-size:16px;display:inline-flex}.entry:hover .fork-button,.fork-button:focus-visible{opacity:1}.event-line{color:var(--fg);align-items:center;gap:7px;padding:8px 0;font-size:16px;display:flex}.event-line>span{flex:1}.pi-tool-result{margin-top:-17px;margin-bottom:20px}.tool-call,.tool-result{color:var(--fg);background:#251819;border:1px solid #453032;border-radius:6px;margin:10px 0;font-size:16px;overflow:hidden}.tool-call summary,.tool-result summary{cursor:pointer;align-items:center;gap:9px;padding:10px 12px;list-style:none;display:flex}.tool-call summary:after,.tool-result summary:after{content:"⌄";color:var(--fg);margin-left:auto}.tool-call summary code{white-space:nowrap;text-overflow:ellipsis;color:var(--fg);font-size:16px;overflow:hidden}.tool-call pre,.tool-result pre{color:var(--fg);border-top:1px solid #412b2d;max-height:340px;margin:0;padding:11px;overflow:auto}.tool-result{background:#201415;border-color:#3b2b2c}.tool-result summary>span{color:var(--fg);font-size:16px}.tool-result.failed{color:var(--fg);border-color:#673f43}.tool-call.failed{border-color:#a44c58}.tool-status{color:var(--secondary);margin-left:auto}.tool-section-label{color:var(--secondary);border-top:1px solid #412b2d;align-items:center;gap:12px;padding:10px 12px;display:flex}.tool-section-label .fork-button{margin-left:auto}.thinking{color:var(--fg);margin:8px 0 16px;font-size:16px}.thinking summary{cursor:pointer}.thinking div{white-space:pre-wrap;color:var(--fg);border-left:1px solid #5a3a3d;margin-top:12px;padding-left:12px;font-size:16px;line-height:1.8}.message-error{color:var(--fg);overflow-wrap:anywhere;background:#39232550;border:1px solid #6b4245;border-radius:6px;margin-top:10px;padding:10px;font-size:16px;line-height:1.7}.streaming{letter-spacing:0;color:var(--accent);margin-left:auto;font-size:16px}.typing{gap:5px;padding:12px 0;display:flex}.typing i{background:#af7c81;border-radius:50%;width:5px;height:5px;animation:1.2s infinite pulse}.typing i:nth-child(2){animation-delay:.2s}.typing i:nth-child(3){animation-delay:.4s}.live-tool{background:#2c1d1e;border:1px solid #624346;border-radius:6px;margin:10px 0;padding:11px}.live-tool>div{color:var(--fg);align-items:center;gap:8px;font-size:16px;display:flex}.live-tool>div>span{color:var(--fg);margin-left:auto;font-size:16px}.live-tool pre{max-height:150px;color:var(--fg);overflow:auto}.queue{background:#2e1f20;border:1px solid #4a3537;border-radius:7px;margin-bottom:10px;padding:5px 10px}.queue>div{color:var(--fg);align-items:center;gap:7px;font-size:16px;display:flex}.queue span{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.history-banner{color:var(--fg);background:#33292a33;align-items:center;gap:7px;padding:8px 26px;font-size:16px;display:flex}.empty-panel{color:var(--fg);flex-direction:column;align-items:center;gap:12px;padding:30px 0;font-size:16px;display:flex}.empty-panel strong{color:var(--fg);font-weight:500}.task-card{background:#2a1b1c;border:1px solid #4d3537;border-radius:7px;margin:10px 0;padding:13px}.task-card.child{border-left:2px solid #84595d;margin-left:14px}.task-card>div:first-child{justify-content:space-between;align-items:center;gap:6px;display:flex}.task-card strong{font-family:var(--font-mono);overflow-wrap:anywhere;font-size:16px;font-weight:400}.task-card p{color:var(--fg);margin:8px 0 11px;font-size:16px}.hook-card{background:#2a2525;border:1px solid #483c3d;border-radius:7px;margin-bottom:20px;padding:14px}.hook-card>div{color:var(--fg);align-items:center;gap:8px;display:flex}.hook-card strong{font-size:16px;font-weight:500}.hook-card p{color:var(--fg);margin-top:10px;font-size:16px;line-height:1.6}.switch{background:#544b4c;border-radius:12px;justify-content:flex-start;width:29px;height:17px;margin-left:auto;padding:2px}.switch>span{background:#dbcccd;border-radius:50%;width:13px;height:13px}.switch.on{background:var(--primary);justify-content:flex-end}.tool-row{border-bottom:1px solid #3a2a2b;padding:12px 0}.tool-row summary{cursor:pointer;color:var(--fg);align-items:center;gap:7px;list-style:none;display:flex}.tool-row strong{font-family:var(--font-mono);font-size:16px;font-weight:500}.tool-row .tag{margin-left:auto;font-size:16px}.tool-row p{color:var(--fg);white-space:pre-wrap;margin:12px 0;font-size:16px;line-height:1.75}.tool-row small{color:var(--fg);line-height:1.6}.tool-signature{border:1px solid var(--line);font-family:var(--font-mono);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--fg);background:#120d0e;border-radius:8px;margin:0 0 12px;padding:12px 14px;font-size:14px;line-height:1.6}.tk-keyword{color:var(--accent)}.tk-function{color:#ffd38a}.tk-property{color:#9ed8cf}.tk-type{color:#8fb6ff}.tk-string{color:#e6b98f}.tk-number{color:#d4a5ff}.tk-comment{color:var(--faint);font-style:italic}.tk-punct{color:#b8a6a7}.prompt-chip{width:100%;color:var(--fg);text-align:left;border-bottom:1px solid var(--line);justify-content:space-between;padding:14px 0;font-size:16px;display:flex}.drawer-backdrop{z-index:40;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#0007;position:fixed;inset:65px 0 0}.sessions-drawer{background:var(--card);border-right:1px solid #513d3f;flex-direction:column;width:326px;max-width:90vw;height:100%;padding:24px 18px;display:flex;box-shadow:20px 0 70px #0004}.sessions-drawer header{justify-content:space-between;align-items:center;margin-bottom:22px;padding:0 7px;display:flex}.sessions-drawer h2{font-size:17px;font-weight:550}.sessions-drawer h2 span{color:var(--fg);margin-left:6px;font-size:16px}.sessions-drawer>.primary{margin:0 6px 22px}.session-list{flex:1;overflow:auto}.session-item{text-align:left;border:1px solid #0000;border-radius:7px;flex-direction:column;align-items:stretch;gap:10px;width:100%;margin-bottom:7px;padding:15px;display:flex}.session-item.active{background:#362527;border-color:#5e3e41}.session-item:hover{background:#312324}.session-item strong{justify-content:space-between;align-items:center;font-size:16px;font-weight:550;display:flex}.session-item .path{font-size:16px}.session-model{color:var(--fg);overflow-wrap:anywhere;align-items:center;gap:6px;font-size:16px;display:flex}.session-model img{background:#ecdfe0;border-radius:3px;width:15px;height:15px;padding:1px}.active-dot{background:var(--accent);border-radius:50%;width:5px;height:5px}.sessions-drawer footer{color:var(--fg);align-items:center;gap:8px;padding:18px 8px 0;font-size:16px;display:flex}.modal-backdrop{z-index:80;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);background:#0d0808bd;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.modal{background:var(--panel);border:1px solid var(--line);border-radius:12px;width:460px;max-width:100%;max-height:90dvh;padding:28px;overflow:auto;box-shadow:0 24px 70px #0000008c}.modal header{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:27px;display:flex}.modal header h2{letter-spacing:-.5px;margin-top:7px;font-size:22px;font-weight:550}.modal label{color:var(--fg);flex-direction:column;gap:9px;margin-top:20px;font-size:16px;display:flex}.modal input,.modal select{width:100%;padding:12px;font-size:16px}.modal small.path{color:var(--fg);margin-top:-1px;font-size:16px;line-height:1.6}.modal footer{justify-content:flex-end;gap:10px;margin-top:26px;display:flex}.model-modal{flex-direction:column;width:500px;display:flex;overflow:hidden}.login-veil{z-index:100;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);background:#0d0808e0;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.login-card{width:400px}.login-card .hint{color:var(--fg);font-size:15px;line-height:1.55}.login-card footer{justify-content:flex-end}.model-list{max-height:50vh;margin-top:12px;overflow:auto}.model-list button{text-align:left;border-radius:6px;justify-content:flex-start;gap:12px;width:100%;padding:12px 10px;display:flex}.model-list button.selected,.model-list button:hover{background:#402b2d}.model-list button>div{flex-direction:column;flex:1;gap:5px;display:flex}.model-list strong{font-size:16px;font-weight:500}.model-list small{color:var(--fg);font-size:16px}.model-modal .hint{margin:14px 0 0}.learning-list{flex-direction:column;gap:23px;padding:0;list-style:none;display:flex}.learning-list li{gap:17px;display:flex}.learning-list li>span{font-family:var(--font-mono);color:var(--fg);border:1px solid #5a383b;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:27px;font-size:16px;display:flex}.learning-list strong{color:var(--fg);font-size:16px;font-weight:500}.learning-list p{color:var(--fg);margin-top:5px;font-size:16px;line-height:1.8}.help-modal{width:530px}.toast{z-index:100;background:var(--card);color:var(--on-primary);border:1px solid var(--line);border-radius:999px;align-items:center;gap:10px;max-width:90%;padding:13px 19px;font-size:16px;font-weight:600;line-height:1.5;display:flex;position:fixed;bottom:28px;left:50%;transform:translate(-50%);box-shadow:0 10px 30px #00000073}.toast svg{color:var(--accent);flex-shrink:0}.pi-user .message-label{justify-content:flex-end}.pi-user .user-message{text-align:right}.state-json-actions{flex-wrap:wrap;justify-content:flex-end;gap:10px;margin-bottom:20px;display:flex}.state-json-actions .hint{flex-basis:100%;margin:0}textarea.app-state-json{resize:vertical;width:100%;min-height:280px;max-height:none;font-family:var(--font-mono);color:var(--fg);margin-bottom:10px}.toast-enter-active,.toast-leave-active{transition:opacity .2s}.toast-enter-from,.toast-leave-to{opacity:0}.error-banner{color:var(--fg);z-index:90;background:#462b2d;align-items:center;gap:10px;padding:10px 25px;font-size:16px;display:flex}.error-banner span{flex:1}.welcome{text-align:center;background:radial-gradient(#39232533,#0000 65%);flex-direction:column;flex:1;justify-content:center;align-items:center;padding:35px;display:flex}.welcome-symbol{width:126px;height:70px;margin-bottom:33px;position:relative}.welcome .eyebrow{color:var(--fg);letter-spacing:2.6px;font-size:16px}.welcome h1{letter-spacing:-2.5px;color:var(--fg);margin:20px 0;font-size:clamp(36px,4.6vw,64px);font-weight:500;line-height:1.15}.welcome p{color:var(--fg);margin:4px 0 30px;font-size:16px}.welcome-features{color:var(--fg);gap:33px;margin-top:70px;font-size:16px;display:flex}.welcome-features>span{align-items:center;gap:8px;display:flex}.selected{color:var(--accent)}@keyframes pulse{0%,to{opacity:.45}50%{opacity:1}}@media (width>=1600px){.workspace{grid-template-columns:440px minmax(0,1fr)}.chat-scroll{padding-left:max(70px,50% - 385px);padding-right:max(70px,50% - 385px)}.composer-region{padding-left:max(46px,50% - 415px);padding-right:max(46px,50% - 415px)}}@media (width<=1050px){.workspace{grid-template-columns:330px minmax(0,1fr)}.session-heading,.model-section,.inspector-body{padding-left:20px;padding-right:20px}.chat-empty h2{font-size:23px}.composer-footnote>span:last-child{display:none}.starter-grid{grid-template-columns:1fr;max-width:300px}.starter-grid button{padding:13px}.starter-grid button>svg:first-child{margin-bottom:3px}.topbar{padding-right:16px}}@media (width<=740px){.shell{height:auto;min-height:100dvh;overflow:visible}.topbar{height:58px;min-height:58px;padding:0 12px;position:sticky;top:0}.brand{gap:8px}.brand strong{font-size:16px}.brand-separator,.brand>.muted,.version,.connection{display:none}.top-actions{gap:5px}.workspace{flex-direction:column;display:flex}.inspector{border-right:0;border-bottom:1px solid var(--line);min-height:310px;max-height:55vh}.session-heading{padding:17px 20px 10px}.session-heading h1{margin:5px 0;font-size:19px}.session-heading>.eyebrow,.session-status,.model-section,.inspector-footer{display:none}.inspector-tabs{padding:0 13px}.inspector-tabs button{padding:11px 3px}.inspector-body{min-height:150px;padding:17px 20px}.chat-panel{height:85dvh;min-height:500px}.chat-header{min-height:55px;padding:0 13px}.chat-scroll{padding:24px 22px}.chat-empty h2{font-size:22px}.composer-region{padding:12px}.composer-left{gap:3px}.composer-left .context-indicator{display:none}.composer-right{gap:8px}.modal{padding:22px}.welcome{min-height:90dvh}.welcome-features{flex-direction:column;align-items:center;gap:20px;margin-top:40px}.drawer-backdrop{top:58px}.toast{width:max-content;max-width:90%;font-size:16px;bottom:15px}.fork-label{display:none}}@media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important;animation:none!important}}@media (width<=740px){.model-section{padding:9px 20px;display:block}.model-section .section-label,.model-section .thinking-row,.model-section .metrics{display:none}.model-button{padding:7px 10px}.model-button img{width:24px;height:24px}.model-button small{display:none}}.primary,.send{background:var(--primary);border-color:var(--primary-line);color:#fff}.primary:hover,.send:hover{background:var(--primary-hover)}.model-button img,.model-list img{background:#fff;border:1px solid #67575c;flex-shrink:0;width:42px;height:42px;padding:5px}.session-model img{background:#fff;flex-shrink:0;width:32px;height:32px;padding:3px}img[src$=openai\.png]{background:#242024;border-color:#81747a;padding:3px}button:disabled{opacity:1;color:#d4c7ca;background-color:#33272b;border-color:#554249}.icon-button{width:36px;height:36px;color:var(--fg)}.inspector-tabs{padding:0 10px}.inspector-tabs button{min-width:0;padding:15px 7px 13px}.session-heading h1{line-height:1.4}.session-status,.section-label,.panel-heading,.job-title,.job-meta,.composer-footnote,.composer-toolbar{flex-wrap:wrap}.metrics{grid-template-columns:1fr 1.4fr .6fr;gap:12px}.metrics small{line-height:1.5}.model-button{min-height:70px}.model-button small{line-height:1.5}.model-button strong{white-space:normal}.inspector-footer{height:auto;min-height:52px;padding:8px 20px}.counter-card{flex-wrap:wrap;gap:12px}.counter-card .field-label{max-width:180px;line-height:1.5}.raw summary{flex-wrap:wrap;line-height:1.6}.raw summary span{color:var(--fg)}.tool-row summary{flex-wrap:wrap}.tool-row .tag{margin-left:auto}.tool-call summary{flex-wrap:wrap}.tool-call summary code{max-width:100%}.fork-button{opacity:1;color:#ffd3da}.session-item .path{line-height:1.6}.sessions-drawer{width:420px}.modal{width:560px}.model-modal{width:650px}.model-list button{min-height:78px}.model-list small{line-height:1.5}.task-card>div:first-child{flex-wrap:wrap}.composer-footnote{line-height:1.6}.composer-left,.composer-right{flex-wrap:wrap;gap:8px}.send{width:40px;height:40px}.interrupt{min-height:40px}.tag{line-height:1.4}.brand{gap:10px}.welcome-features{flex-wrap:wrap;justify-content:center}@media (width>=741px) and (width<=1599px){.workspace{grid-template-columns:minmax(410px,36%) minmax(0,1fr)}.chat-scroll{padding-left:30px;padding-right:30px}.composer-footnote>span:last-child{display:none}.chat-header{flex-wrap:wrap;gap:10px;padding:10px 18px}}@media (width<=1100px) and (width>=741px){.brand>.muted,.brand-separator,.version{display:none}.starter-grid{grid-template-columns:1fr}.composer-left .context-indicator{display:none}.conversation-select select{max-width:205px}}@media (width<=740px){.inspector{max-height:60vh}.topbar{height:68px;min-height:68px}.top-actions .icon-button{display:none}.brand strong{font-size:16px}.model-button img{width:40px;height:40px}.model-button small{display:block}.model-button{min-height:64px}.inspector-tabs{padding:0 4px}.inspector-tabs button{gap:4px;padding:12px 4px}.inspector-body{padding:18px 16px}.conversation-select{gap:6px;max-width:calc(100% - 94px)}.conversation-select select{width:100%;max-width:180px}.chat-header-actions{gap:0}.chat-header-actions .icon-button{width:30px}.chat-header{padding:0 10px}.drawer-backdrop{top:68px}.composer-toolbar{padding-left:9px}.composer-left select{max-width:120px;padding-left:0}.composer-footnote{align-items:flex-start}.composer-footnote>span:first-child{align-items:baseline}.starter-grid strong,.starter-grid span{line-height:1.5}.chat-empty{padding:24px 0}.chat-panel{min-height:760px}.modal{padding:20px}.top-actions .primary{padding:8px}}.session-heading .cwd-button{text-align:left;width:100%;min-width:0;display:flex}.cwd-button:hover{color:var(--fg)}.cwd-button svg{flex-shrink:0}.cwd-trail{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.full-directory{white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.6;display:block}.modal.path-modal{width:max-content;min-width:min(960px,100%)}.markdown :is(h4,h5,h6,small,sub,sup){font-size:16px}.inspector>.inspector-tabs{border-top:0;flex-shrink:0;min-height:74px;padding:0 8px}.inspector>.inspector-tabs button{flex-direction:column;gap:5px;padding:10px 4px;line-height:1.4;position:relative}.inspector-tabs .count{position:absolute;top:4px;right:4px}.inspector-body.session-panel{padding:0 0 24px}.session-panel .session-heading{padding:24px 26px}.session-panel .model-section{padding:22px 26px}@media (width<=740px){.inspector>.inspector-tabs{padding:0 4px}.session-panel .session-heading,.session-panel .model-section{padding:20px 16px}.session-panel .session-heading>.eyebrow{display:block}.session-panel .session-status,.session-panel .section-label,.session-panel .thinking-row{display:flex}.session-panel .metrics{display:grid}}.hint,.path,.eyebrow,.section-label,.section-label span+span,.field-label,.counter-card .field-label,.model-button small,.model-list small,.metrics small,.thinking-row>span,.saved,.job-meta,.demo-action small,.task-card p,.tool-row p,.tool-row small,.tool-call summary code,.tool-result summary>span,.thinking,.thinking div,.raw summary,.raw summary span,.message-label>span:not(.mini-pi):not(.streaming),.composer-footnote,.context-indicator,.composer-left select,.version,.session-model,.sessions-drawer footer,.inspector-footer,.starter-grid span,.chat-empty p,.welcome p,.welcome-features,.learning-list p{color:var(--secondary)}input::placeholder,textarea::placeholder{color:var(--secondary);opacity:1}.chat-header{flex-wrap:nowrap;gap:14px}.chat-header-actions{flex-shrink:0}.lineage-picker{flex:1;min-width:0;padding:8px 0;position:relative}.lineage-toolbar{align-items:center;gap:4px;min-width:0;display:flex}.conversation-lineage{scrollbar-width:thin;scrollbar-color:var(--line) transparent;align-items:center;gap:4px;min-width:0;display:flex;overflow-x:auto}.lineage-crumb{color:var(--secondary);white-space:nowrap;border-radius:6px;flex-shrink:0;padding:7px 9px;font-size:16px}.lineage-crumb:hover{background:#342328}.lineage-crumb.current{color:var(--accent);background:#392328}.lineage-separator{color:var(--secondary)}.conversation-menu-toggle{flex-shrink:0}.lineage-source{color:var(--secondary);margin:4px 9px 0;font-size:16px;line-height:1.5}.conversation-menu-dismiss{z-index:25;cursor:default;position:fixed;inset:0}.conversation-picker{z-index:30;background:#251b1e;border:1px solid #68474e;border-radius:9px;width:min(540px,100vw - 48px);max-height:min(65vh,620px);padding:8px;position:absolute;top:100%;left:0;overflow-y:auto;box-shadow:0 16px 48px #0007}.conversation-picker-heading{color:var(--secondary);padding:10px 12px 14px;font-size:16px}.conversation-choice{text-align:left;border-radius:6px;justify-content:space-between;align-items:center;gap:14px;width:100%;padding:12px;display:flex}.conversation-choice:hover,.conversation-choice.selected{background:#3b272d}.conversation-choice-content{flex-direction:column;gap:6px;min-width:0;display:flex}.choice-lineage{color:var(--fg);flex-wrap:wrap;align-items:center;gap:5px;font-size:16px;line-height:1.5;display:flex}.choice-lineage>span{white-space:nowrap}.choice-lineage .choice-ancestor,.choice-lineage>svg,.choice-source{color:var(--secondary)}.choice-source{font-size:16px;line-height:1.5}.conversation-choice.selected .choice-lineage>span:last-child{color:var(--accent)}@media (width<=740px){.chat-header{flex-wrap:wrap;gap:4px;padding:8px 10px}.lineage-picker{flex-basis:100%;width:100%}.chat-header-actions{margin-left:auto}.conversation-picker{width:min(540px,100vw - 20px)}.lineage-crumb{padding:7px}}.queue-mode{min-width:150px;position:relative}.composer-left .queue-mode select{appearance:none;color:#f8eeee;cursor:pointer;background:#342329;border:1px solid #77515a;border-radius:8px;width:100%;max-width:none;min-height:40px;padding:7px 36px 7px 12px;font-size:16px;font-weight:600}.queue-mode>svg{pointer-events:none;color:var(--secondary);position:absolute;top:50%;right:10px;transform:translateY(-50%)}.interrupt .stop-sign{color:#ff647a;stroke:#ffb5c0;flex-shrink:0}.switch{border-radius:20px;flex-shrink:0;width:58px;height:34px;padding:4px}.switch>span{width:26px;height:26px}.state-boolean .switch{margin-left:0}.task-section{border-top:1px solid var(--line);margin-top:24px;padding-top:20px}.task-section h3,.task-example h4{align-items:center;gap:8px;margin:0 0 10px;font-size:16px;font-weight:650;display:flex}.task-example{border:1px solid var(--line);background:#25191c;border-radius:8px;margin-top:12px;padding:16px}.task-example p,.task-explanation p,.task-empty{color:var(--secondary);margin:8px 0 14px;font-size:16px;line-height:1.6}.task-decision-buttons{flex-wrap:wrap;gap:8px;margin:16px 0;display:flex}.approval-card{border-color:#c68957}.tasks-panel .task-note{margin-bottom:0}.tasks-panel .task-card .raw{margin-top:12px}.chat-header-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.chat-header{flex-wrap:wrap}.chat-header-actions .secondary{min-height:38px}@media (width<=740px){.topbar{flex-wrap:wrap;gap:12px;height:auto;padding:12px 16px}.top-actions{flex-wrap:wrap;gap:8px;margin-left:auto}.chat-header-actions{justify-content:flex-start;width:100%}}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--line);background-clip:padding-box;border:2px solid #0000;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:var(--faint);background-clip:padding-box}.label{font-family:var(--font-display);letter-spacing:.14em;text-transform:uppercase;color:var(--faint);font-size:14px;font-weight:700}.topbar-sep{background:var(--line);flex-shrink:0;width:1px;height:22px}.daemon{color:var(--faint);flex-wrap:wrap;align-items:center;gap:8px;min-width:0;font-size:15px;display:flex}.daemon b{color:var(--fg);font-weight:500;font-family:var(--font-mono)}.daemon .sep{color:var(--offline);flex-shrink:0}.dot{background:var(--ok);width:8px;height:8px;box-shadow:0 0 0 3px color-mix(in oklab, var(--ok) 16%, transparent);border-radius:50%;flex:0 0 8px;display:inline-block}.dot.off{background:var(--offline);box-shadow:none}.chip{border:1px solid var(--line);height:28px;font-family:var(--font-mono);color:var(--faint);background:var(--bg);white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-size:13px;display:inline-flex}.chip b{color:var(--fg);font-weight:500}.chip.accent{border-color:color-mix(in oklab, var(--accent) 40%, var(--line));color:var(--accent)}.chip .dot{width:7px;height:7px;box-shadow:none;flex:0 0 7px}.secondary{border:1px solid var(--line);background:var(--card);transition:background .12s var(--ease), border-color .12s var(--ease)}.secondary:not(:disabled):hover{border-color:var(--faint)}.scrim{z-index:80;background:#0a0607ad;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.dialog{border:1px solid var(--line);background:var(--panel);border-radius:12px;width:min(560px,100%);max-height:calc(100dvh - 40px);overflow-y:auto;box-shadow:0 24px 70px #0000008c}.dialog-head{justify-content:space-between;align-items:flex-start;gap:12px;padding:18px 20px 0;display:flex}.dialog-eyebrow{font-family:var(--font-display);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-size:14px;font-weight:700}.dialog h3{font-family:var(--font-display);letter-spacing:-.01em;margin:5px 0 0;font-size:20px;font-weight:700}.dialog-body{flex-direction:column;gap:12px;padding:16px 20px;display:flex}.help-step{border-bottom:1px solid var(--line-soft);grid-template-columns:26px minmax(0,1fr);gap:10px;padding:7px 0;font-size:16px;display:grid}.help-step:last-of-type{border-bottom:0}.help-step .n{font-family:var(--font-mono);color:var(--accent)}.help-step b{font-weight:600}.help-step .body{color:var(--muted);margin-top:2px;line-height:1.6}.help-callout{border-radius:var(--radius-sm);border:1px solid var(--line);background:var(--chat);color:var(--muted);align-items:flex-start;gap:10px;margin-top:4px;padding:10px 12px;font-size:16px;display:flex}.help-callout svg{flex-shrink:0;margin-top:2px}.dialog-foot{align-items:center;gap:8px;padding:0 20px 18px;display:flex}.dialog-foot .right{gap:8px;margin-left:auto;display:flex}.mnav{display:none}@media (width<=760px){.daemon,.topbar-sep{display:none}.mnav{padding:4px 6px calc(4px + env(safe-area-inset-bottom));border-top:1px solid var(--line);background:var(--panel);grid-template-columns:repeat(3,1fr);gap:2px;display:grid}.mnav button{min-height:48px;color:var(--faint);background:0 0;border:0;border-radius:8px;flex-direction:column;justify-content:center;align-items:center;gap:2px;font-size:12px;display:flex;position:relative}.mnav button.is-on{color:var(--accent);background:color-mix(in oklab, var(--accent) 9%, transparent)}.mnav .badge{background:var(--primary);min-width:16px;height:16px;color:var(--on-primary);font-family:var(--font-mono);border-radius:999px;padding:0 4px;font-size:11px;line-height:16px;position:absolute;top:5px;right:calc(50% - 22px)}}.composer:focus-within{border-color:color-mix(in oklab, var(--accent) 55%, var(--line));box-shadow:0 0 0 3px color-mix(in oklab, var(--accent) 10%, transparent)}.send{border:1px solid var(--primary-line);transition:background .12s var(--ease);border-radius:8px}.pi-user{border-bottom:0;flex-direction:column;align-items:flex-end;gap:8px;padding-bottom:12px;display:flex}.pi-user .user-message{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);max-width:78%;padding:10px 14px}.inspector-tabs{background:var(--tree)}.inspector-tabs button{color:var(--muted)}.inspector-tabs button:hover{color:var(--fg)}.inspector-tabs button.active{color:var(--accent)}.insp-tab-active-line{border-bottom:2px solid var(--accent)}.switch{background:var(--offline)}.switch.on{background:var(--primary)}.switch.on>span{background:var(--on-primary)}.tool-call{background:var(--card);border-color:var(--line)}.tool-result{background:var(--chat)}.tool-result.failed,.tool-call.failed{border-color:color-mix(in oklab, var(--err) 45%, var(--line))}.metrics{border:1px solid var(--line);border-radius:var(--radius);background:var(--line);gap:1px;overflow:hidden}.metrics>div{background:var(--chat);padding:9px 12px}.metrics span{font-family:var(--font-mono);font-weight:500}.model-button{background:var(--chat);border:1px solid var(--line);border-radius:var(--radius)}.model-button:hover{border-color:var(--faint)}input,textarea,select{border-radius:var(--radius-sm)}input:focus,textarea:focus,select:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in oklab, var(--accent) 10%, transparent)}.chat-panel{background:var(--chat)}.chat-header,.inspector{background:var(--panel)}.network-sidebar{background:var(--tree)}.net-workspace{--tree-w:300px;--inspector-w:450px;--rail-w:52px;flex:1;min-height:0;display:flex;position:relative}.net-workspace>.chat-panel,.net-workspace>.welcome,.net-workspace>.offline-panel{flex:auto;min-width:0}.net-workspace>.network-sidebar{width:var(--tree-w);flex:none}.net-workspace>.network-sidebar.collapsed{width:var(--rail-w)}.net-workspace>.inspector{width:var(--inspector-w);border-right:1px solid var(--line);border-left:0;flex:none;min-height:0;max-height:none}.net-workspace>.inspector.collapsed{width:var(--rail-w)}.network-summary{color:var(--muted);border:1px solid var(--line);white-space:nowrap;border-radius:999px;align-items:center;gap:6px;margin-left:6px;padding:3px 10px;font-size:15px;display:inline-flex}.tree-toggle,.inspector-toggle,.tree-backdrop,.inspector-backdrop{display:none}.panel-rail{scrollbar-width:none;flex-direction:column;align-items:center;gap:6px;height:100%;padding:10px 0;display:flex;overflow-y:auto}.panel-rail .panel-toggle{margin-bottom:6px}.rail-device,.rail-tab{width:38px;height:38px;color:var(--muted);border-radius:8px;position:relative}.rail-device:hover,.rail-tab:hover{color:var(--fg);background:#ffffff0a}.rail-tab.active{color:var(--accent);background:#ff899714}.rail-device .dot{width:8px;height:8px;box-shadow:0 0 0 2px var(--tree);flex-basis:8px;position:absolute;bottom:4px;right:4px}.rail-tab .count{background:var(--accent);color:#1a1012;border-radius:8px;min-width:16px;height:16px;padding:0 4px;font-size:11px;line-height:16px;position:absolute;top:2px;right:2px}.inspector .panel-rail{background:var(--panel)}.inspector-tabs .panel-toggle{align-self:center;margin-left:auto}.device-icon{flex:none;display:inline-block}.device-icon.exe,.device-icon.apple{color:#e9e2e2}.network-sidebar{background:var(--tree);border-right:1px solid var(--line);flex-direction:column;min-height:0;display:flex}.tree-head{color:var(--muted);letter-spacing:1.6px;justify-content:space-between;align-items:center;padding:10px 12px 10px 16px;font-size:14px;font-weight:650;display:flex}.tree-head span{align-items:center;gap:8px;display:inline-flex}.tree-list{scrollbar-width:thin;scrollbar-color:var(--line) transparent;outline:none;flex:1;padding:4px 6px 12px;overflow:auto}.tree-list:focus-visible{box-shadow:inset 0 0 0 1px #856669}.tree-empty{padding:12px 10px}.tree-row{--depth:0;min-height:34px;padding:3px 6px 3px calc(4px + var(--depth) * 16px);cursor:pointer;color:#e9e2e2;white-space:nowrap;border-radius:6px;align-items:center;gap:7px;font-size:15px;display:flex;position:relative}.tree-row:hover{background:#ffffff08}.tree-row.focus{box-shadow:inset 0 0 0 1px #6d5557}.tree-row.sel{background:#ff899714}.tree-row.sel:before{content:"";background:var(--accent);border-radius:2px;width:3px;position:absolute;top:5px;bottom:5px;left:0}.tree-row.stale{opacity:.55}.tree-row .chev{width:18px;height:18px;color:var(--muted);flex:0 0 18px;padding:0}.tree-row span.chev{display:inline-block}.tree-row .name{text-overflow:ellipsis;min-width:0;overflow:hidden}.tree-row.device .name{font-family:var(--font-mono);font-size:15px}.tree-row.session .name{font-weight:600}.tree-row .ico{color:var(--muted);flex:none}.tree-row .ico.root{color:var(--accent)}.tree-row .badge{color:var(--muted);font-size:12px;font-family:var(--font-mono);border:1px solid #443738;border-radius:4px;padding:1px 5px}.tree-row .meta,.tree-row .path{color:var(--muted);text-overflow:ellipsis;min-width:0;font-size:13px;overflow:hidden}.tree-row .path{font-family:var(--font-mono);flex:1}.tree-row .meta.err{color:#ff8a80}.tree-row .acts{background:var(--tree);border-radius:6px;gap:2px;margin-left:auto;display:none}.tree-row:hover .acts,.tree-row.focus .acts{display:inline-flex}.tree-row:hover .acts~*,.tree-row .acts .icon-button{width:26px;height:26px}.tree-row .acts .icon-button:disabled{opacity:.35;background:0 0}.tree-row .bg-count{color:var(--muted);align-items:center;gap:4px;font-size:13px;display:inline-flex}.tree-row>.dot.work,.tree-row>.bg-count{margin-left:auto}.tree-row>.dot.work+.bg-count{margin-left:6px}.tree-row:hover>.dot.work,.tree-row:hover>.bg-count,.tree-row.focus>.dot.work,.tree-row.focus>.bg-count{display:none}.dot{background:#756062;border-radius:50%;flex:0 0 9px;width:9px;height:9px;display:inline-block}.dot.on{background:var(--ok);box-shadow:0 0 6px #6fcf9766}.dot.chk{background:var(--secondary);animation:1.1s ease-in-out infinite dpi-pulse}.dot.err{background:var(--err)}.dot.off{background:var(--offline)}.dot.work{background:var(--accent);animation:1.1s ease-in-out infinite dpi-pulse}.dot.bg{border:2px solid var(--accent);background:0 0;width:9px;height:9px}@keyframes dpi-pulse{50%{opacity:.35}}.tree-resizer{cursor:col-resize;z-index:5;flex:0 0 6px;width:6px;margin:0 -3px;position:relative}.tree-resizer:hover{background:#ff899733}.crumbs{scrollbar-width:thin;scrollbar-color:var(--line) transparent;align-items:flex-end;gap:4px;min-width:0;padding:2px 0;display:flex;overflow-x:auto}.crumb{color:#e9e2e2;border-radius:8px;flex-direction:column;flex:none;align-items:flex-start;gap:2px;max-width:260px;padding:5px 10px 6px;display:inline-flex}.crumb:hover{background:#ffffff0a}.crumb.current{color:var(--accent);background:#ff899714}.crumb-kind{letter-spacing:1.2px;text-transform:uppercase;color:var(--muted);font-size:11px;line-height:1}.crumb-main{align-items:center;gap:7px;min-width:0;max-width:100%;font-size:17px;font-weight:600;line-height:1.2;display:inline-flex}.crumb-name,.crumb .device-chip{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.crumb .device-chip{font-family:var(--font-mono)}.crumb-sep{color:var(--muted);flex:none;margin-bottom:8px}.chat-header-actions .secondary.active{border-color:var(--accent)}.history-divider{color:var(--muted);letter-spacing:1px;text-transform:uppercase;align-items:center;gap:8px;margin:8px 0 18px;font-size:14px;display:flex}.history-divider:after{content:"";border-top:1px dashed #4a3b3c;flex:1}.entry.history{opacity:.6}.retry-note{margin-top:4px}.session-modal{width:1120px}.device-modal code,.session-modal code{overflow-wrap:anywhere}.modal .field{flex-direction:column;gap:9px;margin-top:20px;display:flex}.dir-browser{flex-direction:column;gap:8px;display:flex}.dir-path{gap:8px;display:flex}.dir-path input{font-family:var(--font-mono);flex:1;font-size:14px!important}.dir-list{border:1px solid var(--line);background:var(--chat);border-radius:7px;max-height:220px;padding:4px;overflow:auto}.dir-item{color:#e9e2e2;border-radius:5px;justify-content:flex-start;width:100%;padding:6px 8px;font-size:15px}.dir-item:hover{background:#ffffff0a}.dir-item[aria-selected=true]{color:#fff;background:#ff899714}.dir-item span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.device-result{overflow-wrap:anywhere;border:1px solid #544042;border-radius:8px;align-items:flex-start;gap:10px;margin-top:18px;padding:12px;display:flex}.device-result.online{border-color:#6fcf9777}.device-result:not(.online){border-color:#ff6b6b77}.primary.danger{background:#c94f5d;border-color:#c94f5d}.offline-panel .chat-empty{gap:6px;max-width:640px;margin:0 auto}.offline-panel .eyebrow{font-family:var(--font-mono);letter-spacing:.5px;color:var(--muted);overflow-wrap:anywhere}.offline-panel.unauthorized svg,.offline-panel.mismatch svg{color:var(--err)}.offline-error{font-family:var(--font-mono);overflow-wrap:anywhere;font-size:14px}.offline-command{border:1px solid var(--line);background:#0f0a0b;border-radius:8px;align-items:center;gap:8px;margin:10px 0 4px;padding:10px 14px;display:inline-flex}.offline-command code{color:#fff;font-size:17px}.offline-actions{gap:10px;margin-top:16px;display:flex}.spin{animation:1s linear infinite dpi-spin}@keyframes dpi-spin{to{transform:rotate(360deg)}}@media (width<=1100px){.inspector-toggle{display:inline-flex}.net-workspace>.inspector.overlay{z-index:30;width:min(420px,100%);position:absolute;top:0;bottom:0;left:0;box-shadow:20px 0 60px #0008}.inspector-backdrop{z-index:29;background:#0d080899;display:block;position:absolute;inset:0}}@media (width<=760px){.tree-resizer{display:none}.tree-toggle{display:inline-flex}.net-workspace>.network-sidebar{display:none}.net-workspace>.network-sidebar.open{z-index:40;width:min(340px,90vw);display:flex;position:absolute;top:0;bottom:0;left:0;box-shadow:20px 0 60px #0008}.tree-backdrop{z-index:39;background:#0d080899;display:block;position:absolute;inset:0}.network-summary,.new-agent-button{display:none!important}.shell{height:100dvh;overflow:hidden}.net-workspace .chat-panel{height:auto;min-height:0}.net-workspace>.inspector .session-status,.net-workspace>.inspector .model-section{display:block}.top-actions .inspector-toggle{display:inline-flex}.crumb-kind{display:none}}.net-workspace .lineage-picker{flex:240px}.net-workspace .conversation-lineage{flex:0 auto}.composer{position:relative}.slash-menu{background:var(--card);z-index:20;border:1px solid #544042;border-radius:10px;max-height:320px;margin:0;padding:6px;list-style:none;position:absolute;bottom:calc(100% + 8px);left:0;right:0;overflow-y:auto;box-shadow:0 20px 60px #0007}.slash-menu li{cursor:pointer;border-radius:6px;align-items:baseline;gap:10px;padding:7px 10px;display:flex}.slash-menu li.active{background:#ff899714}.slash-menu code{color:var(--accent);font-size:15px}.slash-args{color:var(--muted);font-family:var(--font-mono);font-size:14px}.slash-desc{color:var(--muted);text-align:right;margin-left:auto;font-size:14px}.job-run{border:1px solid #5a3a3e;border-left:4px solid var(--accent);min-width:0;color:var(--fg);background:linear-gradient(#2a1b1d,#221617);border-radius:9px;margin:14px 0 6px;padding:16px 18px 14px}.job-run.is-completed{border-left-color:var(--ok)}.job-run.is-waiting{border-left-color:var(--warn)}.job-run.is-failed,.job-run.is-declined,.job-run.is-aborted{border-left-color:#8d6a6d}.job-run-head{align-items:center;gap:12px;display:flex}.job-run-icon{width:40px;height:40px;color:var(--accent);background:#3d2629;border-radius:9px;flex:none;place-items:center;display:grid}.job-run-titles{flex:1;min-width:0}.job-run-titles h3{font-family:var(--font-title);margin:2px 0 0;font-size:19px;font-weight:750}.job-run-eyebrow{letter-spacing:1.2px;color:var(--secondary);flex-wrap:wrap;align-items:center;gap:4px 12px;font-size:16px;display:flex}.job-run-repeat{letter-spacing:0;color:var(--fg);align-items:center;gap:5px;display:inline-flex}.job-run-status{background:#352728;border-radius:5px;flex:none;align-items:center;gap:7px;padding:4px 9px;font-size:16px;display:inline-flex}.job-run-status i{background:currentColor;border-radius:50%;width:7px;height:7px}.job-run-status.running{color:var(--accent)}.job-run-status.running i{animation:1.5s infinite pulse}.job-run-status.waiting{color:var(--warn)}.job-run-status.completed{color:var(--ok)}.job-run-about{margin:12px 0 8px;font-size:16px;line-height:1.55}.job-run-meta{font-family:var(--font-mono);color:var(--secondary);flex-wrap:wrap;gap:6px 14px;font-size:16px;display:flex}.job-run-input,.job-run-resumed{color:var(--fg)}.job-run-resumed{color:var(--warn)}.job-stepper{flex-wrap:wrap;align-items:center;gap:8px 0;margin:16px 0 12px;padding:0;list-style:none;display:flex}.job-stepper li{align-items:center;display:inline-flex}.job-stepper li:not(:last-child):after{content:"→";color:#8d6a6d;margin:0 8px}.job-chip{background:#241819;border:1px solid #4a3638;border-radius:999px;align-items:center;gap:7px;padding:4px 11px 4px 4px;font-size:16px;display:inline-flex}.job-step-dot{width:24px;height:24px;font-family:var(--font-mono);background:#3a2a2c;border-radius:50%;place-items:center;font-size:15px;display:grid}.ph-done .job-chip{border-color:#3f6b52}.ph-done .job-step-dot{color:#b9f2cf;background:#24543a}.ph-running .job-chip{border-color:var(--accent);box-shadow:0 0 0 3px #ff899722}.ph-running .job-step-dot{color:var(--accent);background:#5a2a31}.ph-waiting .job-chip{border-color:var(--warn);box-shadow:0 0 0 3px #f2c94c22}.ph-waiting .job-step-dot{color:var(--warn);background:#574719}.ph-failed .job-chip,.ph-aborted .job-chip{border-color:#8d4a52}.job-stepper .ph-skipped{opacity:.55}.job-step-progress{font-family:var(--font-mono);color:var(--secondary)}.job-phases{grid-template-columns:minmax(0,1fr);gap:6px;display:grid}.job-phase{background:#1f1415;border:1px solid #3c2b2d;border-radius:7px}.job-phase.ph-running{border-color:#6a3a41}.job-phase.ph-waiting{border-color:#6b5a24}.job-phase.ph-skipped,.job-phase.ph-pending{opacity:.7}.job-phase>summary{cursor:pointer;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:9px 12px;font-size:16px;list-style:none;display:flex}.job-phase summary::-webkit-details-marker{display:none}.job-phase-n{font-family:var(--font-mono);color:var(--secondary)}.job-phase-summary{color:#e6d7d8;flex:1;min-width:160px}.job-phase-time{font-family:var(--font-mono);color:var(--secondary);margin-left:auto}.job-phase-about,.job-phase-empty{color:var(--secondary);margin:0;padding:0 12px 8px 34px;font-size:16px}.job-steps{grid-template-columns:minmax(0,1fr);gap:5px;margin:0;padding:0 12px 10px 34px;list-style:none;display:grid}.job-steps>li{font-size:16px;display:block}.job-steps summary,.job-step-line{align-items:center;gap:9px;min-width:0;list-style:none;display:flex}.job-steps summary{cursor:pointer}.job-steps summary:after{content:"⌄";color:var(--secondary);margin-left:2px}.job-steps details[open] summary:after{content:"⌃"}.job-steps code{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--font-mono);background:#2c1e20;border-radius:4px;padding:1px 6px;font-size:16px;overflow:hidden}.job-steps .k-tool code{border:1px solid #5a3a3e;flex:none}.job-step-kind{color:var(--secondary)}.job-steps .k-tool .job-step-kind,.job-steps .k-agent .job-step-kind{color:var(--accent)}.job-step-text{min-width:0;color:var(--fg)}.job-step-args{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--font-mono);color:var(--secondary);overflow:hidden}.job-step-state{font-family:var(--font-mono);color:var(--secondary);flex:none;align-items:center;gap:5px;display:inline-flex}.job-steps .st-done .job-step-state svg{color:var(--ok)}.job-steps .st-error .job-step-state svg{color:#ff8997}.job-steps .st-waiting .job-step-state svg{color:var(--warn)}.job-steps pre{white-space:pre-wrap;color:#e6d7d8;background:#180f10;border-radius:5px;max-height:180px;margin:4px 0 2px 25px;padding:7px 9px;font-size:16px;overflow:auto}.job-step-link{margin:2px 0 0 25px}.job-approval{background:#2c2514;border:1px solid #8a7330;border-radius:8px;margin-top:12px;padding:12px 14px}.job-approval>div:first-child{color:var(--warn);align-items:center;gap:8px;display:flex}.job-approval p{margin:6px 0 10px;font-size:16px;line-height:1.5}.job-approval-buttons{flex-wrap:wrap;gap:8px;display:flex}.job-run-foot{color:var(--secondary);border-top:1px solid #3c2b2d;flex-wrap:wrap;align-items:center;gap:8px 14px;margin-top:12px;padding-top:10px;font-size:16px;display:flex}.job-run-foot span{flex:1;min-width:220px}.job-def{background:#241819;border:1px solid #453536;border-radius:8px;margin-top:12px;padding:13px}.job-def-head{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.job-def-head svg{color:var(--accent)}.job-def-head strong{margin-right:auto;font-size:16px}.job-def p{margin:8px 0;font-size:16px;line-height:1.5}.job-chain{flex-wrap:wrap;gap:6px 4px;margin:8px 0;padding:0;list-style:none;display:flex}.job-chain li{border:1px solid #4a3638;border-radius:999px;align-items:center;gap:5px;padding:3px 9px 3px 3px;font-size:16px;display:inline-flex}.job-chain li span{width:20px;height:20px;font-family:var(--font-mono);background:#3a2a2c;border-radius:50%;place-items:center;font-size:14px;display:grid}.job-chain li:not(:last-child):after{content:"→";color:#8d6a6d;margin-left:4px}.job-def-meta{flex-wrap:wrap;gap:6px;display:flex}.job-def-meta code{font-family:var(--font-mono);color:var(--secondary);overflow-wrap:anywhere;font-size:16px}.job-def-last{flex-wrap:wrap;align-items:center;gap:6px 10px;margin-top:10px;font-size:16px;display:flex}.job-def-last .text-button{margin-top:0}.job-def-run{margin-top:12px}.task-tree{gap:4px;margin:0 0 12px;padding:0;list-style:none;display:grid}.task-row{margin-left:calc(var(--depth) * 18px);background:#211617;border:1px solid #3c2b2d;border-left:3px solid #5a3a3e;border-radius:6px;flex-wrap:wrap;align-items:center;gap:4px 8px;padding:7px 10px;font-size:16px;display:flex}.task-row[data-task-kind=pi\.tool]{border-left-color:var(--accent)}.task-row[data-task-kind^="demo.job."]{border-left-color:var(--warn)}.task-row small{width:100%;font-family:var(--font-mono);color:var(--secondary);font-size:16px}.task-row .text-button{margin-top:0}.task-phase{font-family:var(--font-mono);color:var(--secondary)}.context-section{margin-top:18px}.context-numbers{flex-wrap:wrap;align-items:baseline;gap:6px 8px;font-size:16px;display:flex}.context-numbers strong{font-family:var(--font-title);font-size:22px}.context-pct{font-family:var(--font-mono);color:var(--secondary)}.context-compacting{color:var(--warn);align-items:center;gap:6px;margin-left:auto;display:inline-flex}.context-compacting i{background:currentColor;border-radius:50%;width:7px;height:7px;animation:1.2s infinite pulse}.context-bar{touch-action:none;background:#2d2122;border:1px solid #453536;border-radius:7px;height:14px;margin:40px 0 44px;position:relative}.context-bar.off .context-marker{opacity:.45}.context-fill{background:linear-gradient(90deg, #8a3a45, var(--accent));border-radius:7px 0 0 7px;transition:width .3s;position:absolute;inset:0 auto 0 0}.context-fill.hot{background:linear-gradient(90deg, #8a3a45, var(--warn))}.context-reserve{background:repeating-linear-gradient(135deg,#ffffff10 0 5px,#0000 5px 10px);border-left:1px solid #8d6a6d;border-radius:0 7px 7px 0;position:absolute;top:0;bottom:0;right:0}.context-marker{background:var(--warn);cursor:ew-resize;touch-action:none;border-radius:2px;width:4px;height:26px;margin-left:-2px;padding:0;position:absolute;top:-7px}.context-marker:before{content:"";position:absolute;inset:-4px -10px}.context-marker.wait{background:var(--fg)}.context-marker-label{white-space:nowrap;font-size:16px;font-family:var(--font-mono);color:var(--warn);pointer-events:none;position:absolute;left:50%;transform:translate(-50%)}.context-marker.auto .context-marker-label{bottom:calc(100% + 4px)}.context-marker.wait .context-marker-label{color:var(--fg);top:calc(100% + 4px)}.context-marker.label-start .context-marker-label{left:-2px;transform:none}.context-marker.label-end .context-marker-label{left:auto;right:-2px;transform:none}.context-hint{margin:0 0 10px}.context-details-toggle{color:var(--warn);letter-spacing:0;align-items:center;gap:4px;padding:0;font-size:16px;display:inline-flex}.compaction-modal p{margin:0 0 12px;font-size:16px;line-height:1.6}.modal .context-toggle{flex-direction:row;align-items:center;gap:8px;margin-top:6px}.modal .context-toggle input{width:auto;padding:0}.context-toggle{flex-wrap:wrap;align-items:center;gap:4px 8px;font-size:16px;display:flex}.context-toggle small{width:100%;color:var(--secondary);font-size:16px}.ext-card{background:#241819;border:1px solid #453536;border-left:3px solid #5a3a3e;border-radius:8px;margin-top:12px;padding:13px 14px}.ext-card.on{border-left-color:var(--ok)}.ext-head{align-items:center;gap:12px;display:flex}.ext-head>div{flex-wrap:wrap;align-items:baseline;gap:4px 10px;min-width:0;display:flex}.ext-head strong{font-size:16px}.ext-head code{font-family:var(--font-mono);color:var(--secondary);font-size:16px}.ext-card>p{margin:8px 0 0;font-size:16px;line-height:1.5}.ext-prompts{border-top:1px solid #3c2b2d;gap:10px;margin:12px 0 0;padding:10px 0 0;list-style:none;display:grid}.ext-prompts.off{opacity:.6}.ext-prompts li{gap:4px;font-size:16px;display:grid}.ext-prompts label{cursor:pointer;align-items:center;gap:8px;display:flex}.ext-prompts code{font-family:var(--font-mono);font-size:16px}.ext-prompts li>span{color:var(--secondary);padding-left:26px;line-height:1.45}.ext-prompts details{padding-left:26px}.ext-prompts summary{cursor:pointer;color:var(--accent)}.ext-prompts pre{white-space:pre-wrap;background:#180f10;border-radius:6px;max-height:260px;margin:6px 0 0;padding:9px;font-size:16px;overflow:auto}.tool-row.disabled summary>strong,.tool-row.disabled summary>svg,.tool-row.disabled>p,.tool-row.disabled>pre,.tool-row.disabled>small{opacity:.45}.tool-row summary .tag.tool-disabled{color:var(--warn);border-color:#6b5a24;margin-left:2px;margin-right:auto}.tool-row summary .tag.tool-disabled+.tag{margin-left:auto}
|
|
1
|
+
@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;450;500;550;600;650;700&family=Manrope:wght@400;500;600;650;700;750;800&family=IBM+Plex+Mono:wght@400;500&display=swap";.git-chip-wrap[data-v-c0fb9e98]{align-items:center;display:inline-flex;position:relative}.git-chip[data-v-c0fb9e98]{gap:4px}.git-chip .branch[data-v-c0fb9e98]{text-overflow:ellipsis;white-space:nowrap;max-width:14ch;overflow:hidden}.dirty[data-v-c0fb9e98]{color:var(--warn,#e5a50a)}.ahead[data-v-c0fb9e98]{color:var(--ok,#2ea043)}.behind[data-v-c0fb9e98]{color:var(--info,#58a6ff)}.tunnel-status{flex-wrap:wrap;align-items:center;gap:.5rem;font-size:.75rem;display:inline-flex}.tunnel-status .axis{border:1px solid var(--border,#333);border-radius:999px;align-items:center;gap:.25rem;padding:.1rem .5rem;display:inline-flex}.tunnel-status .axis.transport{color:var(--fg,#eee)}.tunnel-status .axis.monitor.offline{color:var(--muted,#888)}.tunnel-status .axis.monitor.unauthorized,.tunnel-status .axis.monitor.mismatch,.tunnel-status .axis.monitor.incompatible{color:var(--warn,#e0b040)}.tunnel-status .axis.monitor.online{color:var(--ok,#6cc070)}.tunnel-status .axis.muted{color:var(--muted,#888);border-style:dashed}.tunnel-status .axis.url{color:var(--accent,#7ab8ff);text-decoration:none}.tunnel-status .live{color:var(--ok,#6cc070)}.token-manager{border:1px solid var(--border,#333);border-radius:8px;flex-direction:column;gap:.5rem;padding:.6rem .8rem;font-size:.8rem;display:flex}.token-manager header{align-items:center;gap:.4rem;display:flex}.token-manager h3{text-transform:uppercase;letter-spacing:.08em;margin:0;font-size:.8rem}.token-manager .pairing-status{border:1px solid var(--border,#333);border-radius:999px;margin-left:auto;padding:.05rem .5rem;font-size:.7rem}.token-manager .pairing-status.paired{color:var(--ok,#6cc070)}.token-manager .pairing-status.revoked{color:var(--warn,#e0b040)}.token-manager dl{grid-template-columns:auto 1fr;gap:.15rem .8rem;margin:0;display:grid}.token-manager dt{color:var(--muted,#888)}.token-manager dd{text-overflow:ellipsis;min-width:0;margin:0;overflow:hidden}.token-manager .credential-fingerprint{white-space:normal;overflow-wrap:anywhere}.token-manager .rotation-badge{color:var(--warn,#e0b040);align-items:center;gap:.35rem;margin:0;font-size:.75rem;display:flex}.token-manager .token-actions{flex-wrap:wrap;gap:.5rem;display:flex}.token-manager .spin{animation:1.2s linear infinite tm-spin}@keyframes tm-spin{to{transform:rotate(360deg)}}.git-pane[data-v-8bdca98b]{gap:4px;display:grid}.git-top[data-v-8bdca98b]{flex-wrap:wrap;gap:8px}.branch-wrap[data-v-8bdca98b]{position:relative}.branch-btn[data-v-8bdca98b]{border:1px solid var(--line);border-radius:6px;align-items:center;gap:7px;padding:6px 12px;display:inline-flex}.branch-btn strong[data-v-8bdca98b]{font-size:16px}.menu[data-v-8bdca98b]{z-index:40;background:var(--bg-2,#221a1c);border:1px solid var(--line);border-radius:8px;min-width:300px;max-height:280px;padding:4px;position:absolute;top:calc(100% + 6px);left:0;overflow:auto;box-shadow:0 10px 30px #00000080}.menu button[data-v-8bdca98b]{text-align:left;border-radius:6px;align-items:center;gap:10px;width:100%;padding:7px 10px;font-size:15px;display:flex}.menu button[data-v-8bdca98b]:hover,.menu button.cur[data-v-8bdca98b]{background:#403536}.menu .new-branch[data-v-8bdca98b]{border-top:1px solid var(--line);gap:6px;padding:8px;display:flex}.menu .new-branch input[data-v-8bdca98b]{flex:1;min-width:0}.auto-stash[data-v-8bdca98b]{opacity:.85;align-items:center;gap:8px;padding:8px 10px;font-size:14px;display:flex}.muted-line[data-v-8bdca98b]{opacity:.65;font-size:13px}.cap[data-v-8bdca98b]{padding:4px 0}.row[data-v-8bdca98b]{flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0;display:flex}.hintbox[data-v-8bdca98b]{border-radius:6px;flex-wrap:wrap;align-items:center;gap:10px;margin:4px 0;padding:6px 10px;display:flex}.hintbox.warn[data-v-8bdca98b]{border:1px solid var(--warn,#e5a50a);color:var(--warn,#e5a50a)}.merge-banner[data-v-8bdca98b]{border-radius:6px;padding:8px 10px}.files[data-v-8bdca98b]{border:1px solid var(--line);border-radius:8px;max-height:260px;padding:4px 10px;overflow:auto}.file[data-v-8bdca98b]{justify-content:space-between;align-items:center;gap:6px;padding:3px 0;display:flex}.file.all[data-v-8bdca98b]{border-bottom:1px solid var(--line)}.file-label[data-v-8bdca98b]{cursor:pointer;flex:1;align-items:center;gap:8px;min-width:0;display:flex}.file .path[data-v-8bdca98b]{text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.file .xy[data-v-8bdca98b]{opacity:.7;font-size:12px}.nums[data-v-8bdca98b]{opacity:.8;color:var(--ok,#2ea043);white-space:nowrap;font-size:11px}.nums.bin[data-v-8bdca98b]{color:var(--warn,#e5a50a)}.dir-row[data-v-8bdca98b]{opacity:.8;align-items:center;gap:6px;width:100%;padding:3px 0;font-size:13px;display:flex}.dir-row .open[data-v-8bdca98b]{transform:rotate(90deg)}.file-acts[data-v-8bdca98b]{gap:2px;display:flex}.file-diff[data-v-8bdca98b]{border:1px solid var(--line);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;margin:8px 0;padding:8px 10px;display:flex}.file-diff pre[data-v-8bdca98b]{width:100%;max-height:260px;margin:6px 0 0;font-size:12px;overflow:auto}.mode-chips[data-v-8bdca98b]{gap:2px;display:inline-flex}.mode-chips button[data-v-8bdca98b]{border:1px solid var(--line);border-radius:10px;padding:2px 8px;font-size:12px}.mode-chips button.on[data-v-8bdca98b]{background:#403536}textarea[data-v-8bdca98b]{resize:vertical;width:100%;min-height:76px;font:inherit;margin-top:8px}.commits[data-v-8bdca98b]{gap:3px;max-height:340px;display:grid;overflow:auto}.commit-row[data-v-8bdca98b]{white-space:nowrap;align-items:center;gap:8px;display:flex}.commit-row .lane[data-v-8bdca98b]{flex-shrink:0}.commit-row .hash[data-v-8bdca98b]{color:var(--ok,#2ea043);font-size:13px}.hash-btn svg[data-v-8bdca98b]{transition:transform .1s}.hash-btn svg.open[data-v-8bdca98b]{transform:rotate(90deg)}.commit-row .refs[data-v-8bdca98b]{color:var(--warn,#e5a50a);text-overflow:ellipsis;max-width:18ch;font-size:12px;overflow:hidden}.commit-row .subject[data-v-8bdca98b]{text-overflow:ellipsis;max-width:40%;font-size:14px;overflow:hidden}.commit-row .who[data-v-8bdca98b]{font-size:12px}.commit-files[data-v-8bdca98b]{border-left:2px solid var(--line);margin-left:16px;padding:2px 0 6px 34px}.cf[data-v-8bdca98b]{gap:10px;padding:1px 0;font-size:13px;display:flex}.cf-status[data-v-8bdca98b]{opacity:.8;width:2ch;font-size:11px}.cps[data-v-8bdca98b]{border:1px solid var(--line);border-radius:8px;margin-bottom:6px;padding:4px 10px}.cp-row[data-v-8bdca98b]{align-items:center;gap:10px;padding:2px 0;font-size:14px;display:flex}.cp-row code[data-v-8bdca98b]{color:var(--warn,#e5a50a)}.cp-subj[data-v-8bdca98b]{text-overflow:ellipsis;white-space:nowrap;max-width:40%;overflow:hidden}.wt[data-v-8bdca98b]{align-items:center;gap:8px;padding:2px 0;display:flex}.wt code[data-v-8bdca98b]{text-overflow:ellipsis;white-space:nowrap;max-width:40%;font-size:13px;overflow:hidden}.wt.main code[data-v-8bdca98b]{font-weight:650}.grow[data-v-8bdca98b]{flex:1}.tag-x[data-v-8bdca98b]{opacity:.7;margin-left:4px;display:inline-flex}.op-out[data-v-8bdca98b]{background:#00000040;border-radius:6px;max-height:300px;margin-top:8px;padding:10px;font-size:12px;overflow:auto}h4[data-v-8bdca98b]{align-items:center;gap:8px;margin:0;font-size:16px;display:flex}.device-handoff[data-v-01884b7b]{border:1px solid var(--border);background:var(--panel);border-radius:12px;margin-bottom:14px;padding:14px 16px}header[data-v-01884b7b]{align-items:center;gap:8px;margin-bottom:6px;font-weight:650;display:flex}h3[data-v-01884b7b]{margin:0;font-size:14.5px}.what[data-v-01884b7b]{color:var(--muted);margin:0 0 10px;font-size:13px}code[data-v-01884b7b]{font-family:ui-monospace,monospace;font-size:12px}.row[data-v-01884b7b]{flex-wrap:wrap;align-items:end;gap:8px;display:flex}label[data-v-01884b7b]{color:var(--muted);gap:4px;font-size:12px;display:grid}input[data-v-01884b7b]{border:1px solid var(--border);background:var(--panel);width:90px;color:inherit;font:inherit;border-radius:8px;padding:7px 9px}.err[data-v-01884b7b]{color:var(--danger,#f28b82);margin:8px 0 0;font-size:12.5px}.target[data-v-01884b7b]{color:var(--muted);word-break:break-all;margin:10px 0 0;font-family:ui-monospace,monospace;font-size:12px}.pair-wizard .pair-steps{color:var(--muted,#888);gap:.5rem;margin:.25rem 0 .75rem;padding:0;font-size:.78rem;list-style:none;display:flex}.pair-wizard .pair-steps li{border:1px solid #0000;border-radius:999px;padding:.15rem .6rem}.pair-wizard .pair-steps li.on{color:var(--fg,#eee);border-color:currentColor}.pair-wizard .pair-grid{grid-template-columns:auto 1fr;align-items:start;gap:1rem;display:grid}.pair-wizard .pair-code{letter-spacing:.18em;font-size:1.7rem;font-family:var(--mono,monospace);margin-bottom:.35rem}.pair-wizard .pair-copy-actions{flex-wrap:wrap;gap:.4rem;display:flex}.pair-wizard .pair-qr svg{border:1px solid var(--border,#333);border-radius:6px}.pair-wizard .pair-side{flex-direction:column;gap:.6rem;min-width:0;display:flex}.pair-wizard .fp{word-break:break-all;background:var(--bg2,#222);border-radius:6px;padding:.4rem;font-size:.78rem;display:block}.pair-wizard .pair-confirm{align-items:center;gap:.45rem;font-size:.85rem;display:flex}.pair-wizard .pair-confirm.warn{color:var(--warn,#e0b040)}.pair-wizard .spin{animation:1.2s linear infinite pair-spin}@keyframes pair-spin{to{transform:rotate(360deg)}}.pair-pending{border:1px solid #2a3442;border-radius:12px;margin:0 0 18px;padding:14px 16px}.pair-pending h3{margin:0 0 10px;font-size:14px}.pair-pending ul{gap:10px;margin:0;padding:0;list-style:none;display:grid}.pair-pending li{border-bottom:1px solid #222b36;gap:4px;padding-bottom:10px;display:grid}.pair-pending li:last-child{border-bottom:0;padding-bottom:0}.pair-pending .who{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}.pair-pending .fp{word-break:break-all;color:#7ee2a8;font-family:ui-monospace,monospace;font-size:12px}.pair-pending .row{justify-content:space-between;align-items:center;gap:10px;display:flex}.pair-pending .phase{color:#8fa0b5;font-size:12px}:root{font-family:var(--font-body);color:var(--fg);background:var(--bg);font-synthesis:none;--bg:#151010;--tree:#181213;--chat:#161011;--panel:#1c1516;--card:#251a1b;--line-soft:#2a2021;--fg:#f2eeee;--faint:#8d7778;--primary:#b9283c;--primary-line:#df5363;--primary-hover:#cf354a;--on-primary:#fff;--ok:#6fcf97;--warn:#f2c94c;--err:#ff6b6b;--offline:#5a4a4b;--font-body:"DM Sans", "Segoe UI", sans-serif;--font-display:"Manrope", "Segoe UI", sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, Menlo, monospace;--topbar-h:65px;--tree-w:300px;--insp-w:450px;--radius:10px;--radius-sm:6px;--ease:cubic-bezier(.2, .7, .3, 1);--secondary:#c9a87c;--muted:var(--secondary);--line:#332829;--accent:#ff8997;--surface:#1e1718;--font-title:var(--font-display);font-size:16px}*{box-sizing:border-box}body{margin:0}button,input,textarea,select{font:inherit}button{cursor:pointer}button,a,input,textarea,select{-webkit-tap-highlight-color:transparent}button{color:inherit;background:0 0;border:0;justify-content:center;align-items:center;gap:7px;display:inline-flex}button:disabled{opacity:.8;cursor:not-allowed}button:not(:disabled):hover{filter:brightness(1.13)}button:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:3px}input,textarea,select{color:inherit;background:var(--chat);border:1px solid var(--line);border-radius:7px;outline:none;min-width:0;padding:10px 12px}input::placeholder,textarea::placeholder{color:var(--fg)}textarea{resize:vertical;line-height:1.6}select{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;cursor:pointer}h1,h2,h3,p{margin:0}h1,h2,h3{font-family:var(--font-title)}h2{font-size:16px;font-weight:650}pre,code{font-family:var(--font-mono)}pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:16px;line-height:1.7}small{font-size:16px}svg{flex-shrink:0}.shell{flex-direction:column;height:100dvh;display:flex;overflow:hidden}.topbar{height:var(--topbar-h);min-height:var(--topbar-h);border-bottom:1px solid var(--line);background:var(--panel);z-index:10;justify-content:space-between;align-items:center;padding:0 26px 0 17px;display:flex}.brand,.top-actions{align-items:center;gap:14px;display:flex}.brand strong{letter-spacing:-.5px;font-size:16px;font-family:var(--font-title);font-weight:750}.brandmark{flex-shrink:0;width:45px;height:25px;margin-left:3px;display:block}.brand-separator{color:var(--fg);margin:0 2px;font-weight:400}.muted{color:var(--muted)}.icon-button{width:29px;height:29px;color:var(--muted);border-radius:5px;padding:4px}.icon-button:hover{color:var(--fg);background:#ffffff08}.primary{background:var(--accent);color:var(--fg);border:1px solid var(--accent);white-space:nowrap;border-radius:7px;padding:12px 18px;font-weight:650;box-shadow:0 1px 2px #0002}.primary.small{padding:8px 12px;font-size:16px}.secondary{background:#2b2021;border:1px solid #443738;border-radius:6px;padding:8px 12px;font-size:16px;font-weight:500}.connection{color:var(--muted);align-items:center;gap:7px;font-size:16px;display:flex}.connection i,.live-dot{background:#756062;border-radius:100%;flex-shrink:0;width:5px;height:5px;display:inline-block}.connection .online,.live-dot{background:var(--accent);box-shadow:0 0 7px #cdadb018}.version{font-family:var(--font-mono);color:var(--fg);border:1px solid #3b3031;border-radius:4px;padding:4px 6px;font-size:16px}.workspace{flex:1;grid-template-columns:minmax(340px,34%) minmax(0,1fr);min-height:0;display:grid}.inspector{border-right:1px solid var(--line);background:var(--panel);flex-direction:column;min-height:0;display:flex}.session-heading{padding:25px 26px 21px}.eyebrow{letter-spacing:1.8px;color:var(--fg);font-size:16px;font-weight:600}.session-heading h1{color:var(--fg);letter-spacing:-.7px;overflow-wrap:anywhere;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px;font-size:16px;font-weight:650;display:flex}.path{font-family:var(--font-mono);color:var(--fg);overflow-wrap:anywhere;align-items:center;gap:7px;font-size:16px;display:flex}.session-status{align-items:center;gap:9px;margin-top:19px;display:flex}.status-pill{color:var(--fg);background:#352728;border-radius:4px;align-items:center;gap:6px;padding:4px 8px;font-size:16px;line-height:1.3;display:flex}.status-pill i{background:currentColor;border-radius:50%;width:4px;height:4px}.status-pill.working{color:var(--accent);background:#412b2d}.working i{animation:1.5s infinite pulse}.saved{color:var(--fg);align-items:center;gap:5px;margin-left:auto;font-size:16px;display:flex}.background-pill{color:var(--fg);font-size:16px}.model-section{border-top:1px solid var(--line);padding:18px 26px 22px}.section-label{letter-spacing:1.3px;color:var(--fg);justify-content:space-between;margin-bottom:13px;font-size:16px;display:flex}.section-label span+span{letter-spacing:0;color:var(--fg)}.model-button{text-align:left;background:#251c1d;border:1px solid #423435;border-radius:8px;width:100%;padding:11px 13px}.model-button img,.model-list img{object-fit:contain;background:#f0e8e9;border-radius:6px;width:29px;height:29px;padding:3px}.model-button>div{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.model-button strong{text-overflow:ellipsis;white-space:nowrap;font-size:16px;overflow:hidden}.model-button small{color:var(--muted);font-size:16px}.thinking-row{color:var(--fg);justify-content:space-between;align-items:center;margin-top:10px;font-size:16px;display:flex}.thinking-row select{color:var(--fg);background:0 0;border:0;padding:4px 2px;font-size:16px}.metrics{grid-template-columns:1fr 1.3fr .5fr;margin-top:21px;display:grid}.metrics>div{flex-direction:column;gap:5px;display:flex}.metrics span{font-family:var(--font-title);letter-spacing:-.5px;font-size:19px;font-weight:500}.metrics small{color:var(--fg);font-size:16px}.stats-section{margin-top:24px}.stats-section .metrics{margin-top:14px}.usage-breakdown{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;margin-top:22px;font-size:16px}.usage-breakdown th,.usage-breakdown td{text-align:right;border-bottom:1px solid var(--line);padding:10px 0;font-weight:400}.usage-breakdown th{color:var(--secondary)}.usage-breakdown th:first-child{text-align:left}.usage-breakdown td{color:var(--fg)}.inspector-tabs{border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--tree);padding:0 16px;display:flex}.inspector-tabs button{color:var(--fg);border-bottom:2px solid #0000;flex:1;gap:6px;padding:15px 3px 13px;font-size:16px}.inspector-tabs button.active{color:var(--accent);border-bottom-color:var(--accent)}.count{background:#462f31;border-radius:4px;padding:1px 4px;font-size:16px}.inspector-body{scrollbar-width:thin;scrollbar-color:var(--line) transparent;flex:1;padding:23px 26px 32px;overflow:auto}.panel-heading{justify-content:space-between;align-items:center;gap:9px;display:flex}.panel-heading svg{color:var(--fg)}.tag{color:var(--fg);white-space:nowrap;background:#302526;border:1px solid #403536;border-radius:4px;padding:3px 5px;font-size:16px}.tag.completed{color:var(--accent)}.tag.waiting,.tag.aborted,.tag.rejected{color:var(--fg)}.hint{color:var(--fg);margin:8px 0 18px;font-size:16px;line-height:1.65}.field-label{letter-spacing:1px;color:var(--fg);margin-bottom:8px;font-size:16px;display:block}.inline-input{background:#181112;border:1px solid #3a2d2e;border-radius:7px;align-items:center;display:flex;overflow:hidden}.inline-input input{width:100%;box-shadow:none;background:0 0;border:0;padding:10px;font-size:16px}.inline-input .icon-button{margin-right:4px}.counter-card{background:#261b1c;border:1px solid #403031;border-radius:8px;justify-content:space-between;align-items:center;margin:16px 0;padding:17px 15px;display:flex}.app-state-json{white-space:pre-wrap;overflow-wrap:anywhere;border:1px solid var(--line);background:#140e10;border-radius:8px;max-height:300px;margin:16px 0 24px;padding:16px;font-size:16px;line-height:1.6;overflow:auto}.state-field{min-width:0}.state-field:not(.state-root){border:1px solid var(--line);border-radius:8px;margin:10px 0;padding:12px}.state-field .state-field{background:#25191c40}.state-field-heading{align-items:center;gap:8px;margin-bottom:12px;display:flex}.state-field-heading strong{overflow-wrap:anywhere;flex:1;min-width:0;font-size:16px}.state-field-heading select{width:auto;max-width:120px;color:var(--secondary);padding:5px}.state-field-heading .icon-button{flex-shrink:0}.state-field textarea,.state-field input{width:100%;min-width:0;font-size:16px}.state-number{align-items:center;gap:8px;display:flex}.state-number input{text-align:center;appearance:textfield}.state-number input::-webkit-inner-spin-button{appearance:none}.state-number input::-webkit-outer-spin-button{appearance:none}.state-number button{flex-shrink:0;padding:10px}.state-boolean{align-items:center;gap:12px;display:flex}.state-boolean>span{color:var(--secondary)}.state-add{flex-wrap:wrap;gap:8px;margin-top:12px;display:flex}.state-add input{flex-basis:100%}.state-add select{flex:1;width:auto}.state-add-button{margin-top:8px}.counter-card .field-label{margin:0;font-size:16px}.counter-card strong{font-family:var(--font-title);color:var(--accent);margin-top:4px;font-size:32px;font-weight:500;line-height:1.1;display:block}.counter-card .secondary{color:var(--fg);background:#392a2b;border-color:#5a3c3f;padding:7px 9px;font-size:16px}.note{color:var(--fg);overflow-wrap:anywhere;align-items:flex-start;gap:8px;margin:0 0 10px;font-size:16px;line-height:1.6;display:flex}.note>span{background:#836669;border-radius:50%;flex-shrink:0;width:4px;height:4px;margin-top:7px}.notes{margin-bottom:14px}.raw{border-top:1px solid var(--line);margin-top:16px;padding-top:12px}.raw summary{cursor:pointer;color:var(--fg);font-family:var(--font-mono);align-items:center;gap:7px;font-size:16px;list-style:none;display:flex}.raw summary:after{content:"+";color:var(--fg);margin-left:auto}.raw[open] summary:after{content:"−"}.raw summary span{color:var(--fg);margin-left:auto;font-size:16px}.raw pre{background:var(--chat);color:var(--fg);border:1px solid #35292a;border-radius:6px;max-height:340px;padding:11px;overflow:auto}.raw textarea{width:100%;font-size:16px}.raw button{margin-top:8px}.section-divider{border-top:1px solid var(--line);margin:25px 0 22px}.demo-action{text-align:left;border-bottom:1px solid #362829;align-items:center;gap:11px;width:100%;padding:12px 0;display:flex}.demo-action>span:nth-child(2){flex-direction:column;flex:1;gap:4px;display:flex}.demo-action strong{font-size:16px;font-weight:500}.demo-action small{color:var(--fg);font-size:16px}.demo-action>svg{color:var(--fg)}.demo-icon{width:32px;height:32px;color:var(--accent);background:#3b292b;border-radius:7px;justify-content:center;align-items:center;display:flex}.demo-icon.lavender{color:var(--fg);background:#3b292b}.job-card{background:#26191a;border:1px solid #453536;border-radius:7px;margin-top:16px;padding:13px}.job-title{justify-content:space-between;align-items:center;gap:5px;display:flex}.job-title strong{font-size:16px;font-weight:500}.progress{background:#403031;border-radius:4px;height:3px;margin:14px 0 8px;overflow:hidden}.progress>div{background:var(--accent);height:100%;transition:width .3s}.job-meta{font-family:var(--font-mono);color:var(--fg);justify-content:space-between;gap:6px;font-size:16px;display:flex}.approval{flex-wrap:wrap;gap:7px;margin-top:15px;display:flex}.approval>span{width:100%;color:var(--fg);margin-bottom:3px;font-size:16px}.approval button{padding:6px 10px;font-size:16px}.text-button{color:var(--accent);margin-top:12px;padding:0;font-size:16px}.danger{color:var(--fg)}.inspector-footer{height:39px;min-height:39px;color:var(--fg);border-top:1px solid #372728;align-items:center;gap:8px;padding:0 22px;font-size:16px;display:flex}.inspector-footer .icon-button{margin-left:auto}.chat-panel{background:var(--chat);flex-direction:column;min-height:0;display:flex;position:relative}.agent-stream-status{border-bottom:1px solid var(--warn);color:var(--warn);flex-wrap:wrap;align-items:center;gap:12px;padding:12px 24px;display:flex}.agent-stream-status>div{overflow-wrap:anywhere;flex:220px;min-width:0}.agent-stream-status p{margin:4px 0 0;font-size:13px}.chat-header{border-bottom:1px solid var(--line);background:#1c1415;justify-content:space-between;align-items:center;min-height:63px;padding:0 25px;display:flex}.conversation-select{color:var(--fg);align-items:center;gap:9px;min-width:0;display:flex}.conversation-select select{box-shadow:none;color:var(--fg);background:0 0;border:0;max-width:230px;padding:8px 3px;font-size:16px}.fork-label{white-space:nowrap;color:var(--fg);align-items:center;gap:3px;font-size:16px;display:flex}.chat-header-actions{align-items:center;gap:8px;display:flex}.relative{position:relative}.dropdown{z-index:20;background:var(--line-soft);border:1px solid #4b3b3c;border-radius:8px;min-width:205px;padding:6px;position:absolute;top:36px;right:0;box-shadow:0 10px 35px #0005}.dropdown button{width:100%;color:var(--fg);border-radius:5px;justify-content:flex-start;padding:10px 9px;font-size:16px;display:flex}.dropdown button:hover{background:#3c2d2e}.chat-scroll{scrollbar-width:thin;scrollbar-color:var(--line) transparent;scroll-behavior:smooth;flex:1;padding:32px clamp(24px,5vw,88px) 20px;overflow:auto}.chat-empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;min-height:100%;padding:30px 0 48px;display:flex}.agent-orb{background:radial-gradient(at top,#492d2f,#281a1b);border:1px solid #503a3c;border-radius:17px;justify-content:center;align-items:center;width:58px;height:58px;margin-bottom:26px;display:flex;position:relative;box-shadow:0 10px 50px #b07d820c}.agent-orb>img{width:45px;height:25px}.agent-orb>i{border:3px solid var(--chat);background:var(--accent);border-radius:50%;width:11px;height:11px;position:absolute;bottom:-1px;right:-2px}.chat-empty .eyebrow{letter-spacing:2.1px;font-size:16px}.chat-empty h2{letter-spacing:-.8px;margin:11px 0;font-size:27px;font-weight:500}.chat-empty p{color:var(--fg);font-size:16px;line-height:1.7}.starter-grid{grid-template-columns:1fr 1fr;gap:13px;width:100%;max-width:470px;margin-top:34px;display:grid}.starter-grid button{text-align:left;background:var(--tree);border:1px solid #3c2c2d;border-radius:8px;flex-direction:column;align-items:flex-start;gap:6px;padding:18px;display:flex;position:relative}.starter-grid button>svg:first-child{color:var(--fg);margin-bottom:13px}.starter-grid strong{font-size:16px;font-weight:500}.starter-grid span{color:var(--fg);font-size:16px}.starter-grid button>svg:last-child{color:var(--fg);position:absolute;top:16px;right:13px}.composer-region{background:linear-gradient(transparent, var(--chat) 15%);padding:18px clamp(20px,3vw,46px) 16px}.composer{background:#281c1d;border:1px solid #513d3f;border-radius:11px;box-shadow:0 6px 30px #0002}.composer textarea{resize:none;width:100%;min-height:80px;max-height:220px;box-shadow:none;background:0 0;border:0;padding:18px 20px 9px;font-size:16px;display:block}.composer-toolbar{justify-content:space-between;align-items:center;gap:7px;padding:9px 11px 12px 17px;display:flex}.composer-left,.composer-right{align-items:center;gap:12px;display:flex}.context-indicator{color:var(--fg);align-items:center;gap:5px;font-size:16px;display:flex}.composer-left select{color:var(--fg);background:0 0;border:0;padding:4px;font-size:16px}.interrupt{color:var(--fg);background:#452b2d24;border:1px solid #66414460;border-radius:5px;padding:6px 8px;font-size:16px}.send{background:var(--accent);width:33px;height:33px;color:var(--fg);border-radius:7px}.composer-footnote{color:var(--fg);justify-content:space-between;align-items:center;gap:12px;margin-top:11px;font-size:16px;display:flex}.composer-footnote>span:first-child{align-items:center;gap:6px;display:flex}.composer-footnote .live-dot{width:4px;height:4px}.entry{margin-bottom:26px;position:relative}.message-label{color:var(--fg);letter-spacing:1.3px;align-items:center;gap:8px;margin-bottom:10px;font-size:16px;display:flex}.message-label>span:not(.mini-pi):not(.streaming){font-family:var(--font-mono);letter-spacing:0;color:var(--fg);font-size:16px}.user-message{white-space:pre-wrap;color:var(--fg);font-size:16px;line-height:1.8}.pi-user{border-bottom:1px solid #392628;padding-bottom:20px}.mini-pi{flex-shrink:0;width:36px;height:20px}.markdown{color:var(--fg);overflow-wrap:anywhere;font-size:16px;line-height:1.85}.markdown p{margin:0 0 14px}.markdown p:last-child{margin-bottom:0}.markdown h1,.markdown h2,.markdown h3{color:var(--fg);margin:22px 0 12px;font-size:16px}.markdown ul,.markdown ol{margin:12px 0;padding-left:23px}.markdown li{margin:6px 0}.markdown strong{color:var(--fg);font-weight:600}.markdown code{color:var(--fg);background:#3a2628;border-radius:4px;padding:2px 5px;font-size:16px}.markdown pre{white-space:pre;background:#251819;border:1px solid #3d2b2d;border-radius:7px;margin:14px 0;padding:16px;overflow:auto}.markdown pre code{background:0 0;padding:0}.markdown a{color:var(--accent)}.markdown table{border-collapse:collapse;width:100%}.markdown td,.markdown th{border:1px solid var(--line);text-align:left;padding:8px}.fork-button{color:var(--fg);letter-spacing:0;opacity:1;white-space:nowrap;margin-left:auto;padding:3px 5px;font-size:16px;display:inline-flex}.entry:hover .fork-button,.fork-button:focus-visible{opacity:1}.event-line{color:var(--fg);align-items:center;gap:7px;padding:8px 0;font-size:16px;display:flex}.event-line>span{flex:1}.pi-tool-result{margin-top:-17px;margin-bottom:20px}.tool-call,.tool-result{color:var(--fg);background:#251819;border:1px solid #453032;border-radius:6px;margin:10px 0;font-size:16px;overflow:hidden}.tool-call summary,.tool-result summary{cursor:pointer;align-items:center;gap:9px;padding:10px 12px;list-style:none;display:flex}.tool-call summary:after,.tool-result summary:after{content:"⌄";color:var(--fg);margin-left:auto}.tool-call summary code{white-space:nowrap;text-overflow:ellipsis;color:var(--fg);font-size:16px;overflow:hidden}.tool-call pre,.tool-result pre{color:var(--fg);border-top:1px solid #412b2d;max-height:340px;margin:0;padding:11px;overflow:auto}.tool-result{background:#201415;border-color:#3b2b2c}.tool-result summary>span{color:var(--fg);font-size:16px}.tool-result.failed{color:var(--fg);border-color:#673f43}.tool-call.failed{border-color:#a44c58}.tool-status{color:var(--secondary);margin-left:auto}.tool-section-label{color:var(--secondary);border-top:1px solid #412b2d;align-items:center;gap:12px;padding:10px 12px;display:flex}.tool-section-label .fork-button{margin-left:auto}.thinking{color:var(--fg);margin:8px 0 16px;font-size:16px}.thinking summary{cursor:pointer}.thinking div{white-space:pre-wrap;color:var(--fg);border-left:1px solid #5a3a3d;margin-top:12px;padding-left:12px;font-size:16px;line-height:1.8}.message-error{color:var(--fg);overflow-wrap:anywhere;background:#39232550;border:1px solid #6b4245;border-radius:6px;margin-top:10px;padding:10px;font-size:16px;line-height:1.7}.streaming{letter-spacing:0;color:var(--accent);margin-left:auto;font-size:16px}.typing{gap:5px;padding:12px 0;display:flex}.typing i{background:#af7c81;border-radius:50%;width:5px;height:5px;animation:1.2s infinite pulse}.typing i:nth-child(2){animation-delay:.2s}.typing i:nth-child(3){animation-delay:.4s}.live-tool{background:#2c1d1e;border:1px solid #624346;border-radius:6px;margin:10px 0;padding:11px}.live-tool>div{color:var(--fg);align-items:center;gap:8px;font-size:16px;display:flex}.live-tool>div>span{color:var(--fg);margin-left:auto;font-size:16px}.live-tool pre{max-height:150px;color:var(--fg);overflow:auto}.queue{background:#2e1f20;border:1px solid #4a3537;border-radius:7px;margin-bottom:10px;padding:5px 10px}.queue>div{color:var(--fg);align-items:center;gap:7px;font-size:16px;display:flex}.queue span{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.history-banner{color:var(--fg);background:#33292a33;align-items:center;gap:7px;padding:8px 26px;font-size:16px;display:flex}.empty-panel{color:var(--fg);flex-direction:column;align-items:center;gap:12px;padding:30px 0;font-size:16px;display:flex}.empty-panel strong{color:var(--fg);font-weight:500}.task-card{background:#2a1b1c;border:1px solid #4d3537;border-radius:7px;margin:10px 0;padding:13px}.task-card.child{border-left:2px solid #84595d;margin-left:14px}.task-card>div:first-child{justify-content:space-between;align-items:center;gap:6px;display:flex}.task-card strong{font-family:var(--font-mono);overflow-wrap:anywhere;font-size:16px;font-weight:400}.task-card p{color:var(--fg);margin:8px 0 11px;font-size:16px}.hook-card{background:#2a2525;border:1px solid #483c3d;border-radius:7px;margin-bottom:20px;padding:14px}.hook-card>div{color:var(--fg);align-items:center;gap:8px;display:flex}.hook-card strong{font-size:16px;font-weight:500}.hook-card p{color:var(--fg);margin-top:10px;font-size:16px;line-height:1.6}.switch{background:#544b4c;border-radius:12px;justify-content:flex-start;width:29px;height:17px;margin-left:auto;padding:2px}.switch>span{background:#dbcccd;border-radius:50%;width:13px;height:13px}.switch.on{background:var(--primary);justify-content:flex-end}.tool-row{border-bottom:1px solid #3a2a2b;padding:12px 0}.tool-row summary{cursor:pointer;color:var(--fg);align-items:center;gap:7px;list-style:none;display:flex}.tool-row strong{font-family:var(--font-mono);font-size:16px;font-weight:500}.tool-row .tag{margin-left:auto;font-size:16px}.tool-row p{color:var(--fg);white-space:pre-wrap;margin:12px 0;font-size:16px;line-height:1.75}.tool-row small{color:var(--fg);line-height:1.6}.tool-signature{border:1px solid var(--line);font-family:var(--font-mono);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--fg);background:#120d0e;border-radius:8px;margin:0 0 12px;padding:12px 14px;font-size:14px;line-height:1.6}.tk-keyword{color:var(--accent)}.tk-function{color:#ffd38a}.tk-property{color:#9ed8cf}.tk-type{color:#8fb6ff}.tk-string{color:#e6b98f}.tk-number{color:#d4a5ff}.tk-comment{color:var(--faint);font-style:italic}.tk-punct{color:#b8a6a7}.prompt-chip{width:100%;color:var(--fg);text-align:left;border-bottom:1px solid var(--line);justify-content:space-between;padding:14px 0;font-size:16px;display:flex}.drawer-backdrop{z-index:40;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#0007;position:fixed;inset:65px 0 0}.sessions-drawer{background:var(--card);border-right:1px solid #513d3f;flex-direction:column;width:326px;max-width:90vw;height:100%;padding:24px 18px;display:flex;box-shadow:20px 0 70px #0004}.sessions-drawer header{justify-content:space-between;align-items:center;margin-bottom:22px;padding:0 7px;display:flex}.sessions-drawer h2{font-size:17px;font-weight:550}.sessions-drawer h2 span{color:var(--fg);margin-left:6px;font-size:16px}.sessions-drawer>.primary{margin:0 6px 22px}.session-list{flex:1;overflow:auto}.session-item{text-align:left;border:1px solid #0000;border-radius:7px;flex-direction:column;align-items:stretch;gap:10px;width:100%;margin-bottom:7px;padding:15px;display:flex}.session-item.active{background:#362527;border-color:#5e3e41}.session-item:hover{background:#312324}.session-item strong{justify-content:space-between;align-items:center;font-size:16px;font-weight:550;display:flex}.session-item .path{font-size:16px}.session-model{color:var(--fg);overflow-wrap:anywhere;align-items:center;gap:6px;font-size:16px;display:flex}.session-model img{background:#ecdfe0;border-radius:3px;width:15px;height:15px;padding:1px}.active-dot{background:var(--accent);border-radius:50%;width:5px;height:5px}.sessions-drawer footer{color:var(--fg);align-items:center;gap:8px;padding:18px 8px 0;font-size:16px;display:flex}.modal-backdrop{z-index:80;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);background:#0d0808bd;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.modal{background:var(--panel);border:1px solid var(--line);border-radius:12px;width:460px;max-width:100%;max-height:90dvh;padding:28px;overflow:auto;box-shadow:0 24px 70px #0000008c}.modal header{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:27px;display:flex}.modal header h2{letter-spacing:-.5px;margin-top:7px;font-size:22px;font-weight:550}.modal label{color:var(--fg);flex-direction:column;gap:9px;margin-top:20px;font-size:16px;display:flex}.modal input,.modal select{width:100%;padding:12px;font-size:16px}.modal small.path{color:var(--fg);margin-top:-1px;font-size:16px;line-height:1.6}.modal footer{justify-content:flex-end;gap:10px;margin-top:26px;display:flex}.model-modal{flex-direction:column;width:500px;display:flex;overflow:hidden}.login-veil{z-index:100;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);background:#0d0808e0;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.login-card{width:400px}.login-card .hint{color:var(--fg);font-size:15px;line-height:1.55}.login-card footer{justify-content:flex-end}.model-list{max-height:50vh;margin-top:12px;overflow:auto}.model-list button{text-align:left;border-radius:6px;justify-content:flex-start;gap:12px;width:100%;padding:12px 10px;display:flex}.model-list button.selected,.model-list button:hover{background:#402b2d}.model-list button>div{flex-direction:column;flex:1;gap:5px;display:flex}.model-list strong{font-size:16px;font-weight:500}.model-list small{color:var(--fg);font-size:16px}.model-modal .hint{margin:14px 0 0}.learning-list{flex-direction:column;gap:23px;padding:0;list-style:none;display:flex}.learning-list li{gap:17px;display:flex}.learning-list li>span{font-family:var(--font-mono);color:var(--fg);border:1px solid #5a383b;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:27px;font-size:16px;display:flex}.learning-list strong{color:var(--fg);font-size:16px;font-weight:500}.learning-list p{color:var(--fg);margin-top:5px;font-size:16px;line-height:1.8}.help-modal{width:530px}.toast{z-index:100;background:var(--card);color:var(--on-primary);border:1px solid var(--line);border-radius:999px;align-items:center;gap:10px;max-width:90%;padding:13px 19px;font-size:16px;font-weight:600;line-height:1.5;display:flex;position:fixed;bottom:28px;left:50%;transform:translate(-50%);box-shadow:0 10px 30px #00000073}.toast svg{color:var(--accent);flex-shrink:0}.pi-user .message-label{justify-content:flex-end}.pi-user .user-message{text-align:right}.state-json-actions{flex-wrap:wrap;justify-content:flex-end;gap:10px;margin-bottom:20px;display:flex}.state-json-actions .hint{flex-basis:100%;margin:0}textarea.app-state-json{resize:vertical;width:100%;min-height:280px;max-height:none;font-family:var(--font-mono);color:var(--fg);margin-bottom:10px}.toast-enter-active,.toast-leave-active{transition:opacity .2s}.toast-enter-from,.toast-leave-to{opacity:0}.error-banner{color:var(--fg);z-index:90;background:#462b2d;align-items:center;gap:10px;padding:10px 25px;font-size:16px;display:flex}.error-banner span{flex:1}.welcome{text-align:center;background:radial-gradient(#39232533,#0000 65%);flex-direction:column;flex:1;justify-content:center;align-items:center;padding:35px;display:flex}.welcome-symbol{width:126px;height:70px;margin-bottom:33px;position:relative}.welcome .eyebrow{color:var(--fg);letter-spacing:2.6px;font-size:16px}.welcome h1{letter-spacing:-2.5px;color:var(--fg);margin:20px 0;font-size:clamp(36px,4.6vw,64px);font-weight:500;line-height:1.15}.welcome p{color:var(--fg);margin:4px 0 30px;font-size:16px}.welcome-features{color:var(--fg);gap:33px;margin-top:70px;font-size:16px;display:flex}.welcome-features>span{align-items:center;gap:8px;display:flex}.selected{color:var(--accent)}@keyframes pulse{0%,to{opacity:.45}50%{opacity:1}}@media (width>=1600px){.workspace{grid-template-columns:440px minmax(0,1fr)}.chat-scroll{padding-left:max(70px,50% - 385px);padding-right:max(70px,50% - 385px)}.composer-region{padding-left:max(46px,50% - 415px);padding-right:max(46px,50% - 415px)}}@media (width<=1050px){.workspace{grid-template-columns:330px minmax(0,1fr)}.session-heading,.model-section,.inspector-body{padding-left:20px;padding-right:20px}.chat-empty h2{font-size:23px}.composer-footnote>span:last-child{display:none}.starter-grid{grid-template-columns:1fr;max-width:300px}.starter-grid button{padding:13px}.starter-grid button>svg:first-child{margin-bottom:3px}.topbar{padding-right:16px}}@media (width<=740px){.shell{height:auto;min-height:100dvh;overflow:visible}.topbar{height:58px;min-height:58px;padding:0 12px;position:sticky;top:0}.brand{gap:8px}.brand strong{font-size:16px}.brand-separator,.brand>.muted,.version,.connection{display:none}.top-actions{gap:5px}.workspace{flex-direction:column;display:flex}.inspector{border-right:0;border-bottom:1px solid var(--line);min-height:310px;max-height:55vh}.session-heading{padding:17px 20px 10px}.session-heading h1{margin:5px 0;font-size:19px}.session-heading>.eyebrow,.session-status,.model-section,.inspector-footer{display:none}.inspector-tabs{padding:0 13px}.inspector-tabs button{padding:11px 3px}.inspector-body{min-height:150px;padding:17px 20px}.chat-panel{height:85dvh;min-height:500px}.chat-header{min-height:55px;padding:0 13px}.chat-scroll{padding:24px 22px}.chat-empty h2{font-size:22px}.composer-region{padding:12px}.composer-left{gap:3px}.composer-left .context-indicator{display:none}.composer-right{gap:8px}.modal{padding:22px}.welcome{min-height:90dvh}.welcome-features{flex-direction:column;align-items:center;gap:20px;margin-top:40px}.drawer-backdrop{top:58px}.toast{width:max-content;max-width:90%;font-size:16px;bottom:15px}.fork-label{display:none}}@media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important;animation:none!important}}@media (width<=740px){.model-section{padding:9px 20px;display:block}.model-section .section-label,.model-section .thinking-row,.model-section .metrics{display:none}.model-button{padding:7px 10px}.model-button img{width:24px;height:24px}.model-button small{display:none}}.primary,.send{background:var(--primary);border-color:var(--primary-line);color:#fff}.primary:hover,.send:hover{background:var(--primary-hover)}.model-button img,.model-list img{background:#fff;border:1px solid #67575c;flex-shrink:0;width:42px;height:42px;padding:5px}.session-model img{background:#fff;flex-shrink:0;width:32px;height:32px;padding:3px}img[src$=openai\.png]{background:#242024;border-color:#81747a;padding:3px}button:disabled{opacity:1;color:#d4c7ca;background-color:#33272b;border-color:#554249}.icon-button{width:36px;height:36px;color:var(--fg)}.inspector-tabs{padding:0 10px}.inspector-tabs button{min-width:0;padding:15px 7px 13px}.session-heading h1{line-height:1.4}.session-status,.section-label,.panel-heading,.job-title,.job-meta,.composer-footnote,.composer-toolbar{flex-wrap:wrap}.metrics{grid-template-columns:1fr 1.4fr .6fr;gap:12px}.metrics small{line-height:1.5}.model-button{min-height:70px}.model-button small{line-height:1.5}.model-button strong{white-space:normal}.inspector-footer{height:auto;min-height:52px;padding:8px 20px}.counter-card{flex-wrap:wrap;gap:12px}.counter-card .field-label{max-width:180px;line-height:1.5}.raw summary{flex-wrap:wrap;line-height:1.6}.raw summary span{color:var(--fg)}.tool-row summary{flex-wrap:wrap}.tool-row .tag{margin-left:auto}.tool-call summary{flex-wrap:wrap}.tool-call summary code{max-width:100%}.fork-button{opacity:1;color:#ffd3da}.session-item .path{line-height:1.6}.sessions-drawer{width:420px}.modal{width:560px}.model-modal{width:650px}.model-list button{min-height:78px}.model-list small{line-height:1.5}.task-card>div:first-child{flex-wrap:wrap}.composer-footnote{line-height:1.6}.composer-left,.composer-right{flex-wrap:wrap;gap:8px}.send{width:40px;height:40px}.interrupt{min-height:40px}.tag{line-height:1.4}.brand{gap:10px}.welcome-features{flex-wrap:wrap;justify-content:center}@media (width>=741px) and (width<=1599px){.workspace{grid-template-columns:minmax(410px,36%) minmax(0,1fr)}.chat-scroll{padding-left:30px;padding-right:30px}.composer-footnote>span:last-child{display:none}.chat-header{flex-wrap:wrap;gap:10px;padding:10px 18px}}@media (width<=1100px) and (width>=741px){.brand>.muted,.brand-separator,.version{display:none}.starter-grid{grid-template-columns:1fr}.composer-left .context-indicator{display:none}.conversation-select select{max-width:205px}}@media (width<=740px){.inspector{max-height:60vh}.topbar{height:68px;min-height:68px}.top-actions .icon-button{display:none}.brand strong{font-size:16px}.model-button img{width:40px;height:40px}.model-button small{display:block}.model-button{min-height:64px}.inspector-tabs{padding:0 4px}.inspector-tabs button{gap:4px;padding:12px 4px}.inspector-body{padding:18px 16px}.conversation-select{gap:6px;max-width:calc(100% - 94px)}.conversation-select select{width:100%;max-width:180px}.chat-header-actions{gap:0}.chat-header-actions .icon-button{width:30px}.chat-header{padding:0 10px}.drawer-backdrop{top:68px}.composer-toolbar{padding-left:9px}.composer-left select{max-width:120px;padding-left:0}.composer-footnote{align-items:flex-start}.composer-footnote>span:first-child{align-items:baseline}.starter-grid strong,.starter-grid span{line-height:1.5}.chat-empty{padding:24px 0}.chat-panel{min-height:760px}.modal{padding:20px}.top-actions .primary{padding:8px}}.session-heading .cwd-button{text-align:left;width:100%;min-width:0;display:flex}.cwd-button:hover{color:var(--fg)}.cwd-button svg{flex-shrink:0}.cwd-trail{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.full-directory{white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.6;display:block}.modal.path-modal{width:max-content;min-width:min(960px,100%)}.markdown :is(h4,h5,h6,small,sub,sup){font-size:16px}.inspector>.inspector-tabs{border-top:0;flex-shrink:0;min-height:74px;padding:0 8px}.inspector>.inspector-tabs button{flex-direction:column;gap:5px;padding:10px 4px;line-height:1.4;position:relative}.inspector-tabs .count{position:absolute;top:4px;right:4px}.inspector-body.session-panel{padding:0 0 24px}.session-panel .session-heading{padding:24px 26px}.session-panel .model-section{padding:22px 26px}@media (width<=740px){.inspector>.inspector-tabs{padding:0 4px}.session-panel .session-heading,.session-panel .model-section{padding:20px 16px}.session-panel .session-heading>.eyebrow{display:block}.session-panel .session-status,.session-panel .section-label,.session-panel .thinking-row{display:flex}.session-panel .metrics{display:grid}}.hint,.path,.eyebrow,.section-label,.section-label span+span,.field-label,.counter-card .field-label,.model-button small,.model-list small,.metrics small,.thinking-row>span,.saved,.job-meta,.demo-action small,.task-card p,.tool-row p,.tool-row small,.tool-call summary code,.tool-result summary>span,.thinking,.thinking div,.raw summary,.raw summary span,.message-label>span:not(.mini-pi):not(.streaming),.composer-footnote,.context-indicator,.composer-left select,.version,.session-model,.sessions-drawer footer,.inspector-footer,.starter-grid span,.chat-empty p,.welcome p,.welcome-features,.learning-list p{color:var(--secondary)}input::placeholder,textarea::placeholder{color:var(--secondary);opacity:1}.chat-header{flex-wrap:nowrap;gap:14px}.chat-header-actions{flex-shrink:0}.lineage-picker{flex:1;min-width:0;padding:8px 0;position:relative}.lineage-toolbar{align-items:center;gap:4px;min-width:0;display:flex}.conversation-lineage{scrollbar-width:thin;scrollbar-color:var(--line) transparent;align-items:center;gap:4px;min-width:0;display:flex;overflow-x:auto}.lineage-crumb{color:var(--secondary);white-space:nowrap;border-radius:6px;flex-shrink:0;padding:7px 9px;font-size:16px}.lineage-crumb:hover{background:#342328}.lineage-crumb.current{color:var(--accent);background:#392328}.lineage-separator{color:var(--secondary)}.conversation-menu-toggle{flex-shrink:0}.lineage-source{color:var(--secondary);margin:4px 9px 0;font-size:16px;line-height:1.5}.conversation-menu-dismiss{z-index:25;cursor:default;position:fixed;inset:0}.conversation-picker{z-index:30;background:#251b1e;border:1px solid #68474e;border-radius:9px;width:min(540px,100vw - 48px);max-height:min(65vh,620px);padding:8px;position:absolute;top:100%;left:0;overflow-y:auto;box-shadow:0 16px 48px #0007}.conversation-picker-heading{color:var(--secondary);padding:10px 12px 14px;font-size:16px}.conversation-choice{text-align:left;border-radius:6px;justify-content:space-between;align-items:center;gap:14px;width:100%;padding:12px;display:flex}.conversation-choice:hover,.conversation-choice.selected{background:#3b272d}.conversation-choice-content{flex-direction:column;gap:6px;min-width:0;display:flex}.choice-lineage{color:var(--fg);flex-wrap:wrap;align-items:center;gap:5px;font-size:16px;line-height:1.5;display:flex}.choice-lineage>span{white-space:nowrap}.choice-lineage .choice-ancestor,.choice-lineage>svg,.choice-source{color:var(--secondary)}.choice-source{font-size:16px;line-height:1.5}.conversation-choice.selected .choice-lineage>span:last-child{color:var(--accent)}@media (width<=740px){.chat-header{flex-wrap:wrap;gap:4px;padding:8px 10px}.lineage-picker{flex-basis:100%;width:100%}.chat-header-actions{margin-left:auto}.conversation-picker{width:min(540px,100vw - 20px)}.lineage-crumb{padding:7px}}.queue-mode{min-width:150px;position:relative}.composer-left .queue-mode select{appearance:none;color:#f8eeee;cursor:pointer;background:#342329;border:1px solid #77515a;border-radius:8px;width:100%;max-width:none;min-height:40px;padding:7px 36px 7px 12px;font-size:16px;font-weight:600}.queue-mode>svg{pointer-events:none;color:var(--secondary);position:absolute;top:50%;right:10px;transform:translateY(-50%)}.interrupt .stop-sign{color:#ff647a;stroke:#ffb5c0;flex-shrink:0}.switch{border-radius:20px;flex-shrink:0;width:58px;height:34px;padding:4px}.switch>span{width:26px;height:26px}.state-boolean .switch{margin-left:0}.task-section{border-top:1px solid var(--line);margin-top:24px;padding-top:20px}.task-section h3,.task-example h4{align-items:center;gap:8px;margin:0 0 10px;font-size:16px;font-weight:650;display:flex}.task-example{border:1px solid var(--line);background:#25191c;border-radius:8px;margin-top:12px;padding:16px}.task-example p,.task-explanation p,.task-empty{color:var(--secondary);margin:8px 0 14px;font-size:16px;line-height:1.6}.task-decision-buttons{flex-wrap:wrap;gap:8px;margin:16px 0;display:flex}.approval-card{border-color:#c68957}.tasks-panel .task-note{margin-bottom:0}.tasks-panel .task-card .raw{margin-top:12px}.chat-header-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.chat-header{flex-wrap:wrap}.chat-header-actions .secondary{min-height:38px}@media (width<=740px){.topbar{flex-wrap:wrap;gap:12px;height:auto;padding:12px 16px}.top-actions{flex-wrap:wrap;gap:8px;margin-left:auto}.chat-header-actions{justify-content:flex-start;width:100%}}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--line);background-clip:padding-box;border:2px solid #0000;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:var(--faint);background-clip:padding-box}.label{font-family:var(--font-display);letter-spacing:.14em;text-transform:uppercase;color:var(--faint);font-size:14px;font-weight:700}.topbar-sep{background:var(--line);flex-shrink:0;width:1px;height:22px}.daemon{color:var(--faint);flex-wrap:wrap;align-items:center;gap:8px;min-width:0;font-size:15px;display:flex}.daemon b{color:var(--fg);font-weight:500;font-family:var(--font-mono)}.daemon .sep{color:var(--offline);flex-shrink:0}.dot{background:var(--ok);width:8px;height:8px;box-shadow:0 0 0 3px color-mix(in oklab, var(--ok) 16%, transparent);border-radius:50%;flex:0 0 8px;display:inline-block}.dot.off{background:var(--offline);box-shadow:none}.chip{border:1px solid var(--line);height:28px;font-family:var(--font-mono);color:var(--faint);background:var(--bg);white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-size:13px;display:inline-flex}.chip b{color:var(--fg);font-weight:500}.chip.accent{border-color:color-mix(in oklab, var(--accent) 40%, var(--line));color:var(--accent)}.chip .dot{width:7px;height:7px;box-shadow:none;flex:0 0 7px}.secondary{border:1px solid var(--line);background:var(--card);transition:background .12s var(--ease), border-color .12s var(--ease)}.secondary:not(:disabled):hover{border-color:var(--faint)}.scrim{z-index:80;background:#0a0607ad;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.dialog{border:1px solid var(--line);background:var(--panel);border-radius:12px;width:min(560px,100%);max-height:calc(100dvh - 40px);overflow-y:auto;box-shadow:0 24px 70px #0000008c}.dialog-head{justify-content:space-between;align-items:flex-start;gap:12px;padding:18px 20px 0;display:flex}.dialog-eyebrow{font-family:var(--font-display);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-size:14px;font-weight:700}.dialog h3{font-family:var(--font-display);letter-spacing:-.01em;margin:5px 0 0;font-size:20px;font-weight:700}.dialog-body{flex-direction:column;gap:12px;padding:16px 20px;display:flex}.help-step{border-bottom:1px solid var(--line-soft);grid-template-columns:26px minmax(0,1fr);gap:10px;padding:7px 0;font-size:16px;display:grid}.help-step:last-of-type{border-bottom:0}.help-step .n{font-family:var(--font-mono);color:var(--accent)}.help-step b{font-weight:600}.help-step .body{color:var(--muted);margin-top:2px;line-height:1.6}.help-callout{border-radius:var(--radius-sm);border:1px solid var(--line);background:var(--chat);color:var(--muted);align-items:flex-start;gap:10px;margin-top:4px;padding:10px 12px;font-size:16px;display:flex}.help-callout svg{flex-shrink:0;margin-top:2px}.dialog-foot{align-items:center;gap:8px;padding:0 20px 18px;display:flex}.dialog-foot .right{gap:8px;margin-left:auto;display:flex}.mnav{display:none}@media (width<=760px){.daemon,.topbar-sep{display:none}.mnav{padding:4px 6px calc(4px + env(safe-area-inset-bottom));border-top:1px solid var(--line);background:var(--panel);grid-template-columns:repeat(3,1fr);gap:2px;display:grid}.mnav button{min-height:48px;color:var(--faint);background:0 0;border:0;border-radius:8px;flex-direction:column;justify-content:center;align-items:center;gap:2px;font-size:12px;display:flex;position:relative}.mnav button.is-on{color:var(--accent);background:color-mix(in oklab, var(--accent) 9%, transparent)}.mnav .badge{background:var(--primary);min-width:16px;height:16px;color:var(--on-primary);font-family:var(--font-mono);border-radius:999px;padding:0 4px;font-size:11px;line-height:16px;position:absolute;top:5px;right:calc(50% - 22px)}}.composer:focus-within{border-color:color-mix(in oklab, var(--accent) 55%, var(--line));box-shadow:0 0 0 3px color-mix(in oklab, var(--accent) 10%, transparent)}.send{border:1px solid var(--primary-line);transition:background .12s var(--ease);border-radius:8px}.pi-user{border-bottom:0;flex-direction:column;align-items:flex-end;gap:8px;padding-bottom:12px;display:flex}.pi-user .user-message{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);max-width:78%;padding:10px 14px}.inspector-tabs{background:var(--tree)}.inspector-tabs button{color:var(--muted)}.inspector-tabs button:hover{color:var(--fg)}.inspector-tabs button.active{color:var(--accent)}.insp-tab-active-line{border-bottom:2px solid var(--accent)}.switch{background:var(--offline)}.switch.on{background:var(--primary)}.switch.on>span{background:var(--on-primary)}.tool-call{background:var(--card);border-color:var(--line)}.tool-result{background:var(--chat)}.tool-result.failed,.tool-call.failed{border-color:color-mix(in oklab, var(--err) 45%, var(--line))}.metrics{border:1px solid var(--line);border-radius:var(--radius);background:var(--line);gap:1px;overflow:hidden}.metrics>div{background:var(--chat);padding:9px 12px}.metrics span{font-family:var(--font-mono);font-weight:500}.model-button{background:var(--chat);border:1px solid var(--line);border-radius:var(--radius)}.model-button:hover{border-color:var(--faint)}input,textarea,select{border-radius:var(--radius-sm)}input:focus,textarea:focus,select:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in oklab, var(--accent) 10%, transparent)}.chat-panel{background:var(--chat)}.chat-header,.inspector{background:var(--panel)}.network-sidebar{background:var(--tree)}.net-workspace{--tree-w:300px;--inspector-w:450px;--rail-w:52px;flex:1;min-height:0;display:flex;position:relative}.net-workspace>.chat-panel,.net-workspace>.welcome,.net-workspace>.offline-panel{flex:auto;min-width:0}.net-workspace>.network-sidebar{width:var(--tree-w);flex:none}.net-workspace>.network-sidebar.collapsed{width:var(--rail-w)}.net-workspace>.inspector{width:var(--inspector-w);border-right:1px solid var(--line);border-left:0;flex:none;min-height:0;max-height:none}.net-workspace>.inspector.collapsed{width:var(--rail-w)}.network-summary{color:var(--muted);border:1px solid var(--line);white-space:nowrap;border-radius:999px;align-items:center;gap:6px;margin-left:6px;padding:3px 10px;font-size:15px;display:inline-flex}.tree-toggle,.inspector-toggle,.tree-backdrop,.inspector-backdrop{display:none}.panel-rail{scrollbar-width:none;flex-direction:column;align-items:center;gap:6px;height:100%;padding:10px 0;display:flex;overflow-y:auto}.panel-rail .panel-toggle{margin-bottom:6px}.rail-device,.rail-tab{width:38px;height:38px;color:var(--muted);border-radius:8px;position:relative}.rail-device:hover,.rail-tab:hover{color:var(--fg);background:#ffffff0a}.rail-tab.active{color:var(--accent);background:#ff899714}.rail-device .dot{width:8px;height:8px;box-shadow:0 0 0 2px var(--tree);flex-basis:8px;position:absolute;bottom:4px;right:4px}.rail-tab .count{background:var(--accent);color:#1a1012;border-radius:8px;min-width:16px;height:16px;padding:0 4px;font-size:11px;line-height:16px;position:absolute;top:2px;right:2px}.inspector .panel-rail{background:var(--panel)}.inspector-tabs .panel-toggle{align-self:center;margin-left:auto}.device-icon{flex:none;display:inline-block}.device-icon.exe,.device-icon.apple{color:#e9e2e2}.network-sidebar{background:var(--tree);border-right:1px solid var(--line);flex-direction:column;min-height:0;display:flex}.tree-head{color:var(--muted);letter-spacing:1.6px;justify-content:space-between;align-items:center;padding:10px 12px 10px 16px;font-size:14px;font-weight:650;display:flex}.tree-head span{align-items:center;gap:8px;display:inline-flex}.tree-list{scrollbar-width:thin;scrollbar-color:var(--line) transparent;outline:none;flex:1;padding:4px 6px 12px;overflow:auto}.tree-list:focus-visible{box-shadow:inset 0 0 0 1px #856669}.tree-empty{padding:12px 10px}.tree-row{--depth:0;min-height:34px;padding:3px 6px 3px calc(4px + var(--depth) * 16px);cursor:pointer;color:#e9e2e2;white-space:nowrap;border-radius:6px;align-items:center;gap:7px;font-size:15px;display:flex;position:relative}.tree-row:hover{background:#ffffff08}.tree-row.focus{box-shadow:inset 0 0 0 1px #6d5557}.tree-row.sel{background:#ff899714}.tree-row.sel:before{content:"";background:var(--accent);border-radius:2px;width:3px;position:absolute;top:5px;bottom:5px;left:0}.tree-row.stale{opacity:.55}.tree-row .chev{width:18px;height:18px;color:var(--muted);flex:0 0 18px;padding:0}.tree-row span.chev{display:inline-block}.tree-row .name{text-overflow:ellipsis;min-width:0;overflow:hidden}.tree-row.device .name{font-family:var(--font-mono);font-size:15px}.tree-row.session .name{font-weight:600}.tree-row .ico{color:var(--muted);flex:none}.tree-row .ico.root{color:var(--accent)}.tree-row .badge{color:var(--muted);font-size:12px;font-family:var(--font-mono);border:1px solid #443738;border-radius:4px;padding:1px 5px}.tree-row .meta,.tree-row .path{color:var(--muted);text-overflow:ellipsis;min-width:0;font-size:13px;overflow:hidden}.tree-row .path{font-family:var(--font-mono);flex:1}.tree-row .meta.err{color:#ff8a80}.tree-row .acts{background:var(--tree);border-radius:6px;gap:2px;margin-left:auto;display:none}.tree-row:hover .acts,.tree-row.focus .acts{display:inline-flex}.tree-row:hover .acts~*,.tree-row .acts .icon-button{width:26px;height:26px}.tree-row .acts .icon-button:disabled{opacity:.35;background:0 0}.tree-row .bg-count{color:var(--muted);align-items:center;gap:4px;font-size:13px;display:inline-flex}.tree-row>.dot.work,.tree-row>.bg-count{margin-left:auto}.tree-row>.dot.work+.bg-count{margin-left:6px}.tree-row:hover>.dot.work,.tree-row:hover>.bg-count,.tree-row.focus>.dot.work,.tree-row.focus>.bg-count{display:none}.dot{background:#756062;border-radius:50%;flex:0 0 9px;width:9px;height:9px;display:inline-block}.dot.on{background:var(--ok);box-shadow:0 0 6px #6fcf9766}.dot.chk{background:var(--secondary);animation:1.1s ease-in-out infinite dpi-pulse}.dot.err{background:var(--err)}.dot.off{background:var(--offline)}.dot.work{background:var(--accent);animation:1.1s ease-in-out infinite dpi-pulse}.dot.bg{border:2px solid var(--accent);background:0 0;width:9px;height:9px}@keyframes dpi-pulse{50%{opacity:.35}}.tree-resizer{cursor:col-resize;z-index:5;flex:0 0 6px;width:6px;margin:0 -3px;position:relative}.tree-resizer:hover{background:#ff899733}.crumbs{scrollbar-width:thin;scrollbar-color:var(--line) transparent;align-items:flex-end;gap:4px;min-width:0;padding:2px 0;display:flex;overflow-x:auto}.crumb{color:#e9e2e2;border-radius:8px;flex-direction:column;flex:none;align-items:flex-start;gap:2px;max-width:260px;padding:5px 10px 6px;display:inline-flex}.crumb:hover{background:#ffffff0a}.crumb.current{color:var(--accent);background:#ff899714}.crumb-kind{letter-spacing:1.2px;text-transform:uppercase;color:var(--muted);font-size:11px;line-height:1}.crumb-main{align-items:center;gap:7px;min-width:0;max-width:100%;font-size:17px;font-weight:600;line-height:1.2;display:inline-flex}.crumb-name,.crumb .device-chip{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.crumb .device-chip{font-family:var(--font-mono)}.crumb-sep{color:var(--muted);flex:none;margin-bottom:8px}.chat-header-actions .secondary.active{border-color:var(--accent)}.history-divider{color:var(--muted);letter-spacing:1px;text-transform:uppercase;align-items:center;gap:8px;margin:8px 0 18px;font-size:14px;display:flex}.history-divider:after{content:"";border-top:1px dashed #4a3b3c;flex:1}.entry.history{opacity:.6}.retry-note{margin-top:4px}.session-modal{width:1120px}.device-modal code,.session-modal code{overflow-wrap:anywhere}.modal .field{flex-direction:column;gap:9px;margin-top:20px;display:flex}.dir-browser{flex-direction:column;gap:8px;display:flex}.dir-path{gap:8px;display:flex}.dir-path input{font-family:var(--font-mono);flex:1;font-size:14px!important}.dir-list{border:1px solid var(--line);background:var(--chat);border-radius:7px;max-height:220px;padding:4px;overflow:auto}.dir-item{color:#e9e2e2;border-radius:5px;justify-content:flex-start;width:100%;padding:6px 8px;font-size:15px}.dir-item:hover{background:#ffffff0a}.dir-item[aria-selected=true]{color:#fff;background:#ff899714}.dir-item span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.device-result{overflow-wrap:anywhere;border:1px solid #544042;border-radius:8px;align-items:flex-start;gap:10px;margin-top:18px;padding:12px;display:flex}.device-result.online{border-color:#6fcf9777}.device-result:not(.online){border-color:#ff6b6b77}.primary.danger{background:#c94f5d;border-color:#c94f5d}.offline-panel .chat-empty{gap:6px;max-width:640px;margin:0 auto}.offline-panel .eyebrow{font-family:var(--font-mono);letter-spacing:.5px;color:var(--muted);overflow-wrap:anywhere}.offline-panel.unauthorized svg,.offline-panel.mismatch svg{color:var(--err)}.offline-error{font-family:var(--font-mono);overflow-wrap:anywhere;font-size:14px}.offline-command{border:1px solid var(--line);background:#0f0a0b;border-radius:8px;align-items:center;gap:8px;margin:10px 0 4px;padding:10px 14px;display:inline-flex}.offline-command code{color:#fff;font-size:17px}.offline-actions{gap:10px;margin-top:16px;display:flex}.spin{animation:1s linear infinite dpi-spin}@keyframes dpi-spin{to{transform:rotate(360deg)}}@media (width<=1100px){.inspector-toggle{display:inline-flex}.net-workspace>.inspector.overlay{z-index:30;width:min(420px,100%);position:absolute;top:0;bottom:0;left:0;box-shadow:20px 0 60px #0008}.inspector-backdrop{z-index:29;background:#0d080899;display:block;position:absolute;inset:0}}@media (width<=760px){.tree-resizer{display:none}.tree-toggle{display:inline-flex}.net-workspace>.network-sidebar{display:none}.net-workspace>.network-sidebar.open{z-index:40;width:min(340px,90vw);display:flex;position:absolute;top:0;bottom:0;left:0;box-shadow:20px 0 60px #0008}.tree-backdrop{z-index:39;background:#0d080899;display:block;position:absolute;inset:0}.network-summary,.new-agent-button{display:none!important}.shell{height:100dvh;overflow:hidden}.net-workspace .chat-panel{height:auto;min-height:0}.net-workspace>.inspector .session-status,.net-workspace>.inspector .model-section{display:block}.top-actions .inspector-toggle{display:inline-flex}.crumb-kind{display:none}}.net-workspace .lineage-picker{flex:240px}.net-workspace .conversation-lineage{flex:0 auto}.composer{position:relative}.slash-menu{background:var(--card);z-index:20;border:1px solid #544042;border-radius:10px;max-height:320px;margin:0;padding:6px;list-style:none;position:absolute;bottom:calc(100% + 8px);left:0;right:0;overflow-y:auto;box-shadow:0 20px 60px #0007}.slash-menu li{cursor:pointer;border-radius:6px;align-items:baseline;gap:10px;padding:7px 10px;display:flex}.slash-menu li.active{background:#ff899714}.slash-menu code{color:var(--accent);font-size:15px}.slash-args{color:var(--muted);font-family:var(--font-mono);font-size:14px}.slash-desc{color:var(--muted);text-align:right;margin-left:auto;font-size:14px}.job-run{border:1px solid #5a3a3e;border-left:4px solid var(--accent);min-width:0;color:var(--fg);background:linear-gradient(#2a1b1d,#221617);border-radius:9px;margin:14px 0 6px;padding:16px 18px 14px}.job-run.is-completed{border-left-color:var(--ok)}.job-run.is-waiting{border-left-color:var(--warn)}.job-run.is-failed,.job-run.is-declined,.job-run.is-aborted{border-left-color:#8d6a6d}.job-run-head{align-items:center;gap:12px;display:flex}.job-run-icon{width:40px;height:40px;color:var(--accent);background:#3d2629;border-radius:9px;flex:none;place-items:center;display:grid}.job-run-titles{flex:1;min-width:0}.job-run-titles h3{font-family:var(--font-title);margin:2px 0 0;font-size:19px;font-weight:750}.job-run-eyebrow{letter-spacing:1.2px;color:var(--secondary);flex-wrap:wrap;align-items:center;gap:4px 12px;font-size:16px;display:flex}.job-run-repeat{letter-spacing:0;color:var(--fg);align-items:center;gap:5px;display:inline-flex}.job-run-status{background:#352728;border-radius:5px;flex:none;align-items:center;gap:7px;padding:4px 9px;font-size:16px;display:inline-flex}.job-run-status i{background:currentColor;border-radius:50%;width:7px;height:7px}.job-run-status.running{color:var(--accent)}.job-run-status.running i{animation:1.5s infinite pulse}.job-run-status.waiting{color:var(--warn)}.job-run-status.completed{color:var(--ok)}.job-run-about{margin:12px 0 8px;font-size:16px;line-height:1.55}.job-run-meta{font-family:var(--font-mono);color:var(--secondary);flex-wrap:wrap;gap:6px 14px;font-size:16px;display:flex}.job-run-input,.job-run-resumed{color:var(--fg)}.job-run-resumed{color:var(--warn)}.job-stepper{flex-wrap:wrap;align-items:center;gap:8px 0;margin:16px 0 12px;padding:0;list-style:none;display:flex}.job-stepper li{align-items:center;display:inline-flex}.job-stepper li:not(:last-child):after{content:"→";color:#8d6a6d;margin:0 8px}.job-chip{background:#241819;border:1px solid #4a3638;border-radius:999px;align-items:center;gap:7px;padding:4px 11px 4px 4px;font-size:16px;display:inline-flex}.job-step-dot{width:24px;height:24px;font-family:var(--font-mono);background:#3a2a2c;border-radius:50%;place-items:center;font-size:15px;display:grid}.ph-done .job-chip{border-color:#3f6b52}.ph-done .job-step-dot{color:#b9f2cf;background:#24543a}.ph-running .job-chip{border-color:var(--accent);box-shadow:0 0 0 3px #ff899722}.ph-running .job-step-dot{color:var(--accent);background:#5a2a31}.ph-waiting .job-chip{border-color:var(--warn);box-shadow:0 0 0 3px #f2c94c22}.ph-waiting .job-step-dot{color:var(--warn);background:#574719}.ph-failed .job-chip,.ph-aborted .job-chip{border-color:#8d4a52}.job-stepper .ph-skipped{opacity:.55}.job-step-progress{font-family:var(--font-mono);color:var(--secondary)}.job-phases{grid-template-columns:minmax(0,1fr);gap:6px;display:grid}.job-phase{background:#1f1415;border:1px solid #3c2b2d;border-radius:7px}.job-phase.ph-running{border-color:#6a3a41}.job-phase.ph-waiting{border-color:#6b5a24}.job-phase.ph-skipped,.job-phase.ph-pending{opacity:.7}.job-phase>summary{cursor:pointer;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:9px 12px;font-size:16px;list-style:none;display:flex}.job-phase summary::-webkit-details-marker{display:none}.job-phase-n{font-family:var(--font-mono);color:var(--secondary)}.job-phase-summary{color:#e6d7d8;flex:1;min-width:160px}.job-phase-time{font-family:var(--font-mono);color:var(--secondary);margin-left:auto}.job-phase-about,.job-phase-empty{color:var(--secondary);margin:0;padding:0 12px 8px 34px;font-size:16px}.job-steps{grid-template-columns:minmax(0,1fr);gap:5px;margin:0;padding:0 12px 10px 34px;list-style:none;display:grid}.job-steps>li{font-size:16px;display:block}.job-steps summary,.job-step-line{align-items:center;gap:9px;min-width:0;list-style:none;display:flex}.job-steps summary{cursor:pointer}.job-steps summary:after{content:"⌄";color:var(--secondary);margin-left:2px}.job-steps details[open] summary:after{content:"⌃"}.job-steps code{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--font-mono);background:#2c1e20;border-radius:4px;padding:1px 6px;font-size:16px;overflow:hidden}.job-steps .k-tool code{border:1px solid #5a3a3e;flex:none}.job-step-kind{color:var(--secondary)}.job-steps .k-tool .job-step-kind,.job-steps .k-agent .job-step-kind{color:var(--accent)}.job-step-text{min-width:0;color:var(--fg)}.job-step-args{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--font-mono);color:var(--secondary);overflow:hidden}.job-step-state{font-family:var(--font-mono);color:var(--secondary);flex:none;align-items:center;gap:5px;display:inline-flex}.job-steps .st-done .job-step-state svg{color:var(--ok)}.job-steps .st-error .job-step-state svg{color:#ff8997}.job-steps .st-waiting .job-step-state svg{color:var(--warn)}.job-steps pre{white-space:pre-wrap;color:#e6d7d8;background:#180f10;border-radius:5px;max-height:180px;margin:4px 0 2px 25px;padding:7px 9px;font-size:16px;overflow:auto}.job-step-link{margin:2px 0 0 25px}.job-approval{background:#2c2514;border:1px solid #8a7330;border-radius:8px;margin-top:12px;padding:12px 14px}.job-approval>div:first-child{color:var(--warn);align-items:center;gap:8px;display:flex}.job-approval p{margin:6px 0 10px;font-size:16px;line-height:1.5}.job-approval-buttons{flex-wrap:wrap;gap:8px;display:flex}.job-run-foot{color:var(--secondary);border-top:1px solid #3c2b2d;flex-wrap:wrap;align-items:center;gap:8px 14px;margin-top:12px;padding-top:10px;font-size:16px;display:flex}.job-run-foot span{flex:1;min-width:220px}.job-def{background:#241819;border:1px solid #453536;border-radius:8px;margin-top:12px;padding:13px}.job-def-head{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.job-def-head svg{color:var(--accent)}.job-def-head strong{margin-right:auto;font-size:16px}.job-def p{margin:8px 0;font-size:16px;line-height:1.5}.job-chain{flex-wrap:wrap;gap:6px 4px;margin:8px 0;padding:0;list-style:none;display:flex}.job-chain li{border:1px solid #4a3638;border-radius:999px;align-items:center;gap:5px;padding:3px 9px 3px 3px;font-size:16px;display:inline-flex}.job-chain li span{width:20px;height:20px;font-family:var(--font-mono);background:#3a2a2c;border-radius:50%;place-items:center;font-size:14px;display:grid}.job-chain li:not(:last-child):after{content:"→";color:#8d6a6d;margin-left:4px}.job-def-meta{flex-wrap:wrap;gap:6px;display:flex}.job-def-meta code{font-family:var(--font-mono);color:var(--secondary);overflow-wrap:anywhere;font-size:16px}.job-def-last{flex-wrap:wrap;align-items:center;gap:6px 10px;margin-top:10px;font-size:16px;display:flex}.job-def-last .text-button{margin-top:0}.job-def-run{margin-top:12px}.task-tree{gap:4px;margin:0 0 12px;padding:0;list-style:none;display:grid}.task-row{margin-left:calc(var(--depth) * 18px);background:#211617;border:1px solid #3c2b2d;border-left:3px solid #5a3a3e;border-radius:6px;flex-wrap:wrap;align-items:center;gap:4px 8px;padding:7px 10px;font-size:16px;display:flex}.task-row[data-task-kind=pi\.tool]{border-left-color:var(--accent)}.task-row[data-task-kind^="demo.job."]{border-left-color:var(--warn)}.task-row small{width:100%;font-family:var(--font-mono);color:var(--secondary);font-size:16px}.task-row .text-button{margin-top:0}.task-phase{font-family:var(--font-mono);color:var(--secondary)}.context-section{margin-top:18px}.context-numbers{flex-wrap:wrap;align-items:baseline;gap:6px 8px;font-size:16px;display:flex}.context-numbers strong{font-family:var(--font-title);font-size:22px}.context-pct{font-family:var(--font-mono);color:var(--secondary)}.context-compacting{color:var(--warn);align-items:center;gap:6px;margin-left:auto;display:inline-flex}.context-compacting i{background:currentColor;border-radius:50%;width:7px;height:7px;animation:1.2s infinite pulse}.context-bar{touch-action:none;background:#2d2122;border:1px solid #453536;border-radius:7px;height:14px;margin:40px 0 44px;position:relative}.context-bar.off .context-marker{opacity:.45}.context-fill{background:linear-gradient(90deg, #8a3a45, var(--accent));border-radius:7px 0 0 7px;transition:width .3s;position:absolute;inset:0 auto 0 0}.context-fill.hot{background:linear-gradient(90deg, #8a3a45, var(--warn))}.context-reserve{background:repeating-linear-gradient(135deg,#ffffff10 0 5px,#0000 5px 10px);border-left:1px solid #8d6a6d;border-radius:0 7px 7px 0;position:absolute;top:0;bottom:0;right:0}.context-marker{background:var(--warn);cursor:ew-resize;touch-action:none;border-radius:2px;width:4px;height:26px;margin-left:-2px;padding:0;position:absolute;top:-7px}.context-marker:before{content:"";position:absolute;inset:-4px -10px}.context-marker.wait{background:var(--fg)}.context-marker-label{white-space:nowrap;font-size:16px;font-family:var(--font-mono);color:var(--warn);pointer-events:none;position:absolute;left:50%;transform:translate(-50%)}.context-marker.auto .context-marker-label{bottom:calc(100% + 4px)}.context-marker.wait .context-marker-label{color:var(--fg);top:calc(100% + 4px)}.context-marker.label-start .context-marker-label{left:-2px;transform:none}.context-marker.label-end .context-marker-label{left:auto;right:-2px;transform:none}.context-hint{margin:0 0 10px}.context-details-toggle{color:var(--warn);letter-spacing:0;align-items:center;gap:4px;padding:0;font-size:16px;display:inline-flex}.compaction-modal p{margin:0 0 12px;font-size:16px;line-height:1.6}.modal .context-toggle{flex-direction:row;align-items:center;gap:8px;margin-top:6px}.modal .context-toggle input{width:auto;padding:0}.context-toggle{flex-wrap:wrap;align-items:center;gap:4px 8px;font-size:16px;display:flex}.context-toggle small{width:100%;color:var(--secondary);font-size:16px}.ext-card{background:#241819;border:1px solid #453536;border-left:3px solid #5a3a3e;border-radius:8px;margin-top:12px;padding:13px 14px}.ext-card.on{border-left-color:var(--ok)}.ext-head{align-items:center;gap:12px;display:flex}.ext-head>div{flex-wrap:wrap;align-items:baseline;gap:4px 10px;min-width:0;display:flex}.ext-head strong{font-size:16px}.ext-head code{font-family:var(--font-mono);color:var(--secondary);font-size:16px}.ext-card>p{margin:8px 0 0;font-size:16px;line-height:1.5}.ext-prompts{border-top:1px solid #3c2b2d;gap:10px;margin:12px 0 0;padding:10px 0 0;list-style:none;display:grid}.ext-prompts.off{opacity:.6}.ext-prompts li{gap:4px;font-size:16px;display:grid}.ext-prompts label{cursor:pointer;align-items:center;gap:8px;display:flex}.ext-prompts code{font-family:var(--font-mono);font-size:16px}.ext-prompts li>span{color:var(--secondary);padding-left:26px;line-height:1.45}.ext-prompts details{padding-left:26px}.ext-prompts summary{cursor:pointer;color:var(--accent)}.ext-prompts pre{white-space:pre-wrap;background:#180f10;border-radius:6px;max-height:260px;margin:6px 0 0;padding:9px;font-size:16px;overflow:auto}.tool-row.disabled summary>strong,.tool-row.disabled summary>svg,.tool-row.disabled>p,.tool-row.disabled>pre,.tool-row.disabled>small{opacity:.45}.tool-row summary .tag.tool-disabled{color:var(--warn);border-color:#6b5a24;margin-left:2px;margin-right:auto}.tool-row summary .tag.tool-disabled+.tag{margin-left:auto}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<meta name="referrer" content="no-referrer" />
|
|
8
8
|
<link rel="icon" type="image/svg+xml" href="/icons/durable-pi.svg" />
|
|
9
9
|
<title>Durable Pi | Network</title>
|
|
10
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
10
|
+
<script type="module" crossorigin src="/assets/index-8VVvzo6M.js"></script>
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DxIvDff_.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="app"></div>
|
|
@@ -380,6 +380,13 @@ async function commit(thenPush = false) {
|
|
|
380
380
|
}
|
|
381
381
|
}
|
|
382
382
|
|
|
383
|
+
/** The device's default model can drift out of its own catalog (seen live);
|
|
384
|
+
* any panel action needing a model falls back to the first catalog entry. */
|
|
385
|
+
function pickModel(info: { models?: { id: string; provider: string }[]; defaultModel?: string } | undefined) {
|
|
386
|
+
const models = info?.models ?? [];
|
|
387
|
+
return models.find((m) => `${m.provider}/${m.id}` === info?.defaultModel) ?? models[0];
|
|
388
|
+
}
|
|
389
|
+
|
|
383
390
|
/** orca/zcode AI message: ask the device's own model to title the changelist. */
|
|
384
391
|
async function aiMessage() {
|
|
385
392
|
if (!devId.value || !cwd.value) return;
|
|
@@ -390,7 +397,7 @@ async function aiMessage() {
|
|
|
390
397
|
let sid = "";
|
|
391
398
|
try {
|
|
392
399
|
const info = network.devices.value.find((d) => d.id === devId.value)?.info;
|
|
393
|
-
const model = (info
|
|
400
|
+
const model = pickModel(info);
|
|
394
401
|
if (!model) return notify("no model on the device");
|
|
395
402
|
let diff = "";
|
|
396
403
|
for (const f of chosen.slice(0, 5)) {
|
|
@@ -522,7 +529,7 @@ async function sessionOn(path: string, branch: string | null) {
|
|
|
522
529
|
busy.value = "session";
|
|
523
530
|
try {
|
|
524
531
|
const info = network.devices.value.find((d) => d.id === devId.value)?.info;
|
|
525
|
-
const model = (info
|
|
532
|
+
const model = pickModel(info);
|
|
526
533
|
if (!model) return notify(`no model available on ${devId.value} — cannot create a session`);
|
|
527
534
|
const s = await deviceClient(devId.value).createSession({
|
|
528
535
|
name: branch ?? path.slice(path.lastIndexOf("/") + 1),
|
package/docs/git-ui-checklist.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Git UI Feature Checklist — orca / paseo / zcode → durable-pi
|
|
2
2
|
|
|
3
3
|
Run: `team_20261024073535_a2a56c3410bfe1d9` · Steps: 01_explore (research) → 02_analyze (verify/correct) → 03_write (this file)
|
|
4
|
-
Status: **verified against source** — every coverage claim below was re-read in the actual files before persisting (see [Verification log](#verification-log)).
|
|
4
|
+
Status: **verified against source** · **ADOPTED: all waves shipped — 0.0.25 (1a + redesign) and 0.0.26/0.0.27 (1b + 2 + 3, incl. the flagship session-scoped commit, live-proven through the production tunnel)** — every coverage claim below was re-read in the actual files before persisting (see [Verification log](#verification-log)).
|
|
5
5
|
|
|
6
6
|
## Why this doc exists
|
|
7
7
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "my-durable",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.28",
|
|
4
4
|
"description": "Durable Pi \u2014 the durable agent network: hub web UI, device backend daemon, TUI admin and the shared SDK, packaged as one runnable monorepo install",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|