agenttwin 0.3.5 → 0.3.6

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.
@@ -1 +1 @@
1
- :root{--h-bg:#101013;--h-card:#161619;--h-card2:#1b1b1f;--h-line:#26262c;--h-line2:#313138;--h-ink:#ececee;--h-dim:#a3a6b0;--h-mut:#7e828d;--h-blue:#4c6fff;--h-bar:#3f66f5;--h-green:#3fbf7f;--h-red:#e5484d;--h-amber:#f2a33c;--h-orange:#e8833a}html{scrollbar-color:#3a3a42 #101013}body.view-home .brand,body.view-home .sidebar-toggle,body.view-home .workspace-name{display:none}body.view-home .app-layout{grid-template-columns:minmax(0,1fr)}body.view-home .app-nav{display:none}body.view-home main{padding:0;max-width:none}body.view-home footer{display:none}body.view-home .topbar{z-index:30;left:0;right:0;padding:10px 16px;display:flex;align-items:center;gap:8px}body.view-home .account-control{margin-left:0}body.view-home #api-message:not(:empty){position:relative;z-index:5;margin:68px 20px 0;background:#2a2320;border:1px solid #4a3a30;color:#e8d8c8}.visually-hidden{position:absolute;width:1px;height:1px;-webkit-clip-path:inset(50%);clip-path:inset(50%);overflow:hidden}body:not(.view-home) .workspace-name{display:none}.home-switcher{gap:2px;border:1px solid #ffffff17;background:#141419a8;border-radius:12px;padding:3px;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.home-switcher,.home-switcher button{display:inline-flex;align-items:center}.home-switcher button{gap:7px;border:0;background:transparent;color:#a9adb8;border-radius:9px;padding:6px 12px;min-height:28px;font-size:13px;font-weight:500;white-space:nowrap;transition:background .12s ease,color .12s ease}.home-switcher button.active,.home-switcher button:hover{background:#232330;color:#fff}.home-switcher button img,.home-switcher button svg{width:15px;height:15px;color:#fff;flex:none}.home-switcher button img{filter:brightness(0) invert(1)}.pill-count{min-width:17px;height:17px;padding:0 5px;display:inline-grid;place-items:center;background:#f2a33c;color:#16110a;border-radius:99px;font-size:10.5px;font-weight:600}.home-menu{position:absolute;left:0;top:44px;min-width:210px;background:#1a1a20;border:1px solid #2c2c34;border-radius:12px;box-shadow:0 18px 50px #000a;padding:6px;z-index:40}.home-menu[hidden]{display:none}.home-menu button{display:flex;width:100%;align-items:center;gap:10px;text-align:left;border:0;background:transparent;border-radius:8px;min-height:34px;padding:7px 10px;font-size:13px;color:#c9ccd5}.home-menu button img,.home-menu button svg{width:16px;height:16px;opacity:.8}.home-menu button:hover{background:#26262e;color:#fff}.home-menu button.active{background:#232330;color:#fff}.home-top-actions{margin-left:auto;display:flex;align-items:center;gap:8px}.home-search{display:inline-flex;align-items:center;gap:8px;border:1px solid #ffffff17;background:#141419a8;color:#9296a1;border-radius:10px;padding:6px 10px;min-height:34px;font-size:12.5px;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.home-search:hover{color:#d6d8df;border-color:#ffffff2a}.home-search svg{width:14px;height:14px}.home-search kbd{font:11px var(--mono);color:#7f8390;border:1px solid #ffffff14;border-radius:5px;padding:1px 5px;background:#ffffff08}.home-icon-btn{position:relative;display:grid;place-items:center;width:34px;height:34px;min-height:34px;padding:0;border:1px solid #ffffff17;background:#141419a8;color:#b9bcc6;border-radius:10px;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.home-icon-btn:hover{background:#1d1d24b8;color:#fff}.home-icon-btn svg{width:16px;height:16px}.bell-badge{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;display:grid;place-items:center;background:var(--h-amber);color:#16110a;border-radius:99px;font-size:10px;font-weight:650}.bell-badge:empty{display:none}.home-bell-wrap{position:relative}.bell-menu{left:auto;right:0;min-width:280px;padding:12px 8px 8px}.bell-menu .menu-label{font-size:11px;color:var(--h-mut);margin:0 8px 8px}.bell-item{display:flex;gap:10px;align-items:flex-start;padding:9px 10px;border-radius:8px;font-size:12.5px;color:#c9ccd5;text-align:left;width:100%;border:0;background:transparent}.bell-item:hover{background:#26262e}.bell-item .dot{width:7px;height:7px;border-radius:50%;background:var(--h-amber);flex:none;margin-top:5px}.bell-item small{display:block;color:var(--h-mut);font-size:11px;margin-top:2px}.home-hero{min-height:clamp(430px,58vh,560px);align-items:flex-end;justify-content:center;overflow:hidden}#home-sky{position:absolute;inset:0;width:100%;height:100%;image-rendering:pixelated}.home-hero:after{inset:auto 0 0 0;height:220px;background:linear-gradient(to bottom,transparent,var(--h-bg))}.hero-content{position:relative;z-index:2;text-align:center;padding:96px 20px 46px;width:min(560px,100%)}.hero-content h1{font-size:clamp(21px,2.6vw,28px);font-weight:550;letter-spacing:-.5px;color:#fff;text-shadow:0 2px 22px #0009;margin-bottom:18px;text-wrap:balance}.home-composer{text-align:left;border:1px solid #ffffff1c;box-shadow:0 24px 70px #000a;overflow:hidden}.composer-tabs{display:flex;align-items:center;gap:2px;padding:9px 10px;border-bottom:1px solid #ffffff10}.composer-tab{border:0;background:transparent;color:#9296a1;font-size:12.5px;font-weight:500;min-height:26px;padding:3px 10px;border-radius:7px}.composer-tab+.composer-tab{border-left:1px solid #ffffff12;border-radius:0 7px 7px 0}.composer-tab:hover{color:#d6d8df}.composer-tab.active{color:#fff}.composer-tab span{color:#7e828d;font-weight:450}.composer-spacer{flex:1 1}.composer-mini{color:#7f8390;display:grid;place-items:center}.composer-mini svg{width:15px;height:15px}#composer-input{display:block;width:100%;background:transparent;border:0;padding:14px 16px 8px;color:var(--h-ink);font:13.5px/1.6 Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;resize:none;outline:none}#composer-input::placeholder{color:#71747f}.composer-row{display:flex;padding:4px 8px 8px;flex-wrap:wrap}.chip,.composer-row{align-items:center;gap:6px}.chip{display:inline-flex;border:1px solid #ffffff14;background:#ffffff0a;color:#c4c7d0;border-radius:9px;padding:4px 9px;min-height:28px;font-size:12px;font-weight:450}.chip svg{width:13px;height:13px;color:#8b8e98}.chip .chevron{width:11px;height:11px;color:#7f8390}.chip:hover{background:#ffffff14;color:#fff}.chip.strong{color:#e8e9ee}.chip.dot{border-style:dashed;cursor:default}.chip.dot:hover{background:#ffffff0a;color:#c4c7d0}.dot-dot{width:6px;height:6px;border-radius:50%;background:var(--h-green)}.composer-flex{flex:1 1}.composer-send{width:30px;height:30px;min-width:30px;min-height:30px;padding:0;display:grid;place-items:center;border-radius:9px;border:1px solid #ffffff1c;background:#ffffff17;color:#e8e9ee}.composer-send:hover{background:#ffffff26}.composer-send svg{width:14px;height:14px}.composer-note{display:none;margin:0;padding:0 14px 10px;font-size:11.5px;color:#b7a98a;line-height:1.6}.composer-note.show{display:block}.home-body{position:relative;z-index:2;max-width:1180px;width:100%;padding:6px 20px 56px}.home-grid-head{display:flex;justify-content:flex-end;align-items:center;margin:2px 2px 10px}.grid-hint{margin-right:auto;font-size:11px;color:#767a86;letter-spacing:.2px}#home-customize{display:inline-flex;align-items:center;gap:7px;border:0;background:transparent;color:#8b8e98;font-size:12px;min-height:28px;padding:4px 8px}#home-customize:hover{color:#d6d8df}#home-customize svg{width:14px;height:14px}#home-customize[aria-pressed=true]{color:var(--h-blue)}.home-widgets{grid-gap:14px;gap:14px;grid-template-areas:"working receipts" "sandbox receipts" "services failures"}.area-working{grid-area:working}.area-receipts{grid-area:receipts}.area-sandbox{grid-area:sandbox}.area-services{grid-area:services}.area-failures{grid-area:failures}.widget{background:var(--h-card);border:1px solid var(--h-line);border-radius:14px;padding:13px 16px 14px;min-width:0;overflow:hidden}.widget>header{display:flex;align-items:center;gap:8px;margin-bottom:4px}.widget h2{font-size:12.5px;font-weight:500;color:#d3d5db;letter-spacing:-.1px}.w-ico{display:grid;place-items:center;color:#7e828d}.w-ico svg{width:14px;height:14px}.w-count{font-size:11.5px;color:#7e828d}.w-count.warn{color:var(--h-amber)}.w-head-meta{margin-left:auto;font-size:11px;color:#7e828d;display:inline-flex;align-items:center;gap:6px}.w-head-spin{margin-left:auto;color:#9aa0ab;display:grid;place-items:center}.w-head-spin svg{width:13px;height:13px}.spin{animation:spin 1.1s linear infinite;transform-origin:center}@keyframes spin{to{transform:rotate(1turn)}}.w-body{padding-top:6px}.w-empty{font-size:12px;color:var(--h-mut);line-height:1.7;padding:8px 0 4px}.task-row{display:flex;align-items:flex-start;gap:9px;padding:6px 0 2px}.task-spin{color:var(--h-blue);flex:none;margin-top:2px;display:grid;place-items:center}.task-spin svg{width:14px;height:14px}.task-row strong{display:block;font-size:13px;font-weight:500;color:#e8e9ee}.task-stat{color:#8b8e98;flex:none;margin-top:1px;display:grid;place-items:center}.task-stat svg{width:14px;height:14px}.task-row .w-when{margin-left:auto;font-size:11px;color:var(--h-amber);white-space:nowrap;display:inline-flex;gap:5px;align-items:center}.task-row .w-when:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--h-orange)}.task-row .w-when.quiet{color:#8b8e98}.task-row .w-when.quiet:before{display:none}.task-sub{margin:2px 0 0 23px;font:10.5px/1.6 var(--mono);color:#7f8390;overflow-wrap:anywhere}.linklike{border:0;background:transparent;color:#9aa0ab;font:inherit;padding:0;min-height:0;text-decoration:underline;text-underline-offset:3px}.linklike:hover{color:#fff}.group-label{display:flex;align-items:center;gap:6px;font-size:11px;color:#8b8e98;margin:10px 0 2px}.group-label b{font-weight:550}.group-label.warn b{color:var(--h-amber)}.group-label .g-spin{color:#8b8e98;display:grid}.group-label .g-spin svg{width:11px;height:11px}.review-row{display:flex;align-items:center;width:100%;text-align:left;padding:8px 10px;margin:0 -10px;min-height:0;border:0;border-radius:8px;background:transparent;font:inherit;color:inherit;box-shadow:inset 0 -1px 0 #1f1f25;transition:background .12s ease}.review-row:last-child{box-shadow:none}.review-row:hover{background:#1d1d24}.review-row .r-ico{color:#8b8e98;display:grid;flex:none}.review-row .r-ico svg{width:13px;height:13px}.review-row strong{font-size:12.5px;color:#dcdee4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1;min-width:0}.review-row:hover strong{color:#fff}.review-row .ref{font:10px/1.4 var(--mono);color:#838792;background:#232329;border-radius:5px;padding:2px 6px;white-space:nowrap}.review-row .r-status{font-size:11px;white-space:nowrap}.review-row .r-status.passed{color:var(--h-green)}.review-row .r-status.error,.review-row .r-status.failed{color:var(--h-red)}.review-row .r-status.incomplete{color:#9296a1}.review-row .r-time{font-size:10.5px;color:#7f8390;white-space:nowrap}.ok-ico{color:var(--h-green)}.warn-ico{color:var(--h-amber)}.bad-ico{color:var(--h-red)}.neutral-ico{color:#7e828d}.fact-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:10px 18px;gap:10px 18px;padding-top:8px}.fact-item{min-width:0}.fact-item span{display:block;font-size:9px;color:#7f8390;letter-spacing:.3px}.fact-item b{display:block;margin-top:2px;font-size:11.5px;font-weight:450;color:#dcdee4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.service-row{display:flex;align-items:baseline;gap:9px;padding:8px 0;border-bottom:1px solid #1f1f25;font-size:12.5px}.service-row:last-child{border-bottom:0}.service-row strong{font-weight:450;color:#dcdee4}.service-row .s-kind{flex:1 1;min-width:0;font-size:10.5px;color:#8b8e98;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.service-row .runner{font:10.5px var(--mono);color:#7f8390;white-space:nowrap}.failure-row{display:flex;align-items:center;gap:9px;padding:9px 0;border-bottom:1px solid #1f1f25;font-size:12.5px}.failure-row:last-child{border-bottom:0}.failure-row .bad-ico{display:grid;flex:none}.failure-row .bad-ico svg{width:13px;height:13px}.failure-row strong{font-weight:450;color:#dcdee4;white-space:nowrap}.failure-row .f-path{font:10.5px var(--mono);color:#7f8390;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.failure-row .f-time{margin-left:auto;font-size:11px;color:#7e828d;white-space:nowrap}.home-loop{position:fixed;right:18px;bottom:18px;z-index:25;display:inline-flex;align-items:center;gap:8px;border:1px solid #ffffff17;background:#1a1a20e0;color:#c9ccd5;border-radius:999px;padding:8px 13px;min-height:36px;font-size:12.5px;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);box-shadow:0 10px 30px #0008}.home-loop:hover{background:#22222ae8;color:#fff}.home-loop svg{width:14px;height:14px;color:#8b8e98}.home-loop .chevron{width:12px;height:12px}.loop-note{position:fixed;right:18px;bottom:62px;z-index:25;max-width:300px;background:#1a1a20;border:1px solid #2c2c34;border-radius:12px;padding:12px 14px;font-size:12px;line-height:1.65;color:#b9bcc6;box-shadow:0 18px 50px #000a}.palette{position:fixed;inset:0;z-index:60;background:#0009;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);display:flex;align-items:flex-start;justify-content:center;padding:16vh 20px 0}.palette[hidden]{display:none}.palette-panel{width:min(560px,100%);background:#1a1a20;border:1px solid #2e2e36;border-radius:14px;box-shadow:0 30px 80px #000c;overflow:hidden}.palette-panel input{width:100%;background:transparent;border:0;border-bottom:1px solid #26262c;color:#ececee;font-size:14px;padding:15px 16px;outline:none}.palette-list{max-height:300px;overflow:auto;padding:6px}.palette-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:0;background:transparent;border-radius:8px;padding:9px 10px;font-size:13px;color:#c9ccd5;min-height:36px}.palette-item.active,.palette-item:hover{background:#26262e;color:#fff}.palette-item small{margin-left:auto;font:10.5px var(--mono);color:#7f8390}.palette-item img,.palette-item svg{width:15px;height:15px;opacity:.8}.palette-empty{padding:16px;font-size:12.5px;color:#7e828d}.home-widgets.compact .widget{padding:10px 13px 11px}.home-widgets.compact .failure-row,.home-widgets.compact .review-row,.home-widgets.compact .service-row{padding:6px 10px}@media(max-width:900px){.home-widgets{grid-template-columns:1fr;grid-template-areas:"working" "receipts" "sandbox" "services" "failures"}.home-hero{min-height:420px}.hero-content{padding-top:84px}}@media(max-width:560px){body.view-home .topbar{padding:8px 10px}.home-search span{display:none}.home-search{padding:6px 8px}.home-search kbd{display:none}.home-body{padding:4px 12px 48px}.fact-grid{grid-template-columns:1fr}.home-switcher{max-width:calc(100vw - 150px);overflow-x:auto;scrollbar-width:none}.home-switcher::-webkit-scrollbar{display:none}.home-switcher button{font-size:12px;padding:5px 9px;gap:6px}}@media(prefers-reduced-motion:reduce){.spin{animation:none}}.widget{transition:border-color .15s ease}.widget:hover{border-color:#2e2e36}.widget .w-count{background:#232329;border-radius:6px;padding:1px 7px;font-size:10.5px}.widget .w-count:empty{display:none}.widget .w-count.warn{color:var(--h-amber)}.fact-item b{font-family:var(--mono);font-size:11px}.home-composer{transition:border-color .15s ease,box-shadow .15s ease}.home-composer:focus-within{border-color:#4c6fff59;box-shadow:0 24px 70px #000a,0 0 0 3px #4c6fff1f}.composer-send{background:var(--h-blue);border-color:var(--h-blue);color:#fff}.composer-send:hover{background:#5d7dff;border-color:#5d7dff}.chip,.composer-tab{transition:background .12s ease,color .12s ease,border-color .12s ease}.hero-content{animation:home-rise .45s ease both}.home-body{animation:home-rise .5s ease both}@keyframes home-rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.palette-list{scrollbar-width:thin;scrollbar-color:#2e2e36 transparent}.palette-hint{display:flex;gap:16px;padding:9px 16px;border-top:1px solid #26262c;font-size:10.5px;color:#8b8e98}.palette-hint kbd{font:10px var(--mono);color:#9aa0ab;border:1px solid #ffffff14;border-radius:4px;padding:1px 5px;background:#ffffff08;margin-right:4px}.chat-context{font-size:12px;color:var(--text-muted,#999);padding:0 18px 12px;margin:0}.chat-thread{max-height:420px;overflow:auto;border-top:1px solid rgba(255,255,255,.1);padding:16px 20px;text-align:left}.chat-message{margin:0 0 20px}.chat-message header{font-size:12px;color:#9696a0;margin-bottom:8px}.chat-message p{white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px;line-height:1.65;margin:0;color:#e1e1e6}.chat-message.user{border-left:2px solid #3c5bff;padding-left:12px}.composer-send:disabled{opacity:.4;cursor:wait}.hero-content{width:440px;max-width:100%;min-width:0;padding:82px 20px 24px;transition:width .2s ease}.hero-content.has-conversation{width:760px}.home-hero{min-height:350px}.home-composer{min-width:0;width:100%;max-width:100%}.chat-thread{max-height:280px;padding:14px 18px;overscroll-behavior:contain;min-width:0}.chat-message{margin-bottom:16px;min-width:0}.chat-content{font-size:13px;line-height:1.65;overflow-wrap:anywhere;color:#e1e1e6}.chat-content p{font-size:inherit;white-space:normal;line-height:inherit;margin:0 0 10px}.chat-message.user .chat-content p{white-space:pre-wrap}.chat-content :last-child{margin-bottom:0}.chat-content h1,.chat-content h2,.chat-content h3,.chat-content h4{font-size:14px;text-align:left;margin:12px 0 6px;text-shadow:none}.chat-content ol,.chat-content ul{margin:8px 0;padding-left:22px}.chat-content li{margin:4px 0}.chat-content code{font:12px/1.6 var(--mono);background:#ffffff0a;border-radius:4px;padding:2px 4px;overflow-wrap:anywhere}.chat-content pre{max-width:100%;overflow:auto;background:#0c0c10;border:1px solid var(--h-line);border-radius:8px;padding:12px;margin:10px 0;white-space:pre}.chat-content pre code{padding:0;background:none;white-space:pre}.chat-content table{display:block;max-width:100%;overflow:auto;border-collapse:collapse;margin:10px 0}.chat-content td,.chat-content th{border:1px solid var(--h-line);padding:6px 9px;text-align:left}.chat-content a{color:#8fa4ff;text-decoration:underline}.chat-content blockquote{border-left:2px solid var(--h-line2);margin:10px 0;padding-left:12px;color:var(--h-dim)}.chat-context{font-size:10.5px;padding:0 14px 8px}.home-widgets{grid-template-areas:"project receipts" "working receipts" "sandbox failures" "services failures"}.area-project{grid-area:project}.project-title{display:block;font-weight:500;margin:6px 0 12px}.project-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-gap:8px;gap:8px}.project-summary button{padding:8px;color:var(--h-dim);background:var(--h-card2);border:1px solid var(--h-line);border-radius:8px;font-size:11px}.project-summary b{display:block;color:var(--h-ink);margin-bottom:4px}@media(max-width:900px){.home-widgets{grid-template-columns:1fr;grid-template-areas:"project" "working" "receipts" "sandbox" "services" "failures"}}@media(prefers-reduced-motion:reduce){.hero-content{transition:none}}.home-hero{min-height:300px}.hero-content{padding:72px 20px 20px}body.view-home:has(#api-message:not(:empty)) .hero-content{padding-top:28px}.hero-content h1{font-size:22px;margin-bottom:14px}#home-sky{opacity:.25}.home-composer{background:#161619f5;box-shadow:0 12px 32px #0005}#composer-input{height:62px;min-height:62px;padding-top:10px}.chat-thread{max-height:180px;padding:12px 16px}.chat-disclosure{margin:0;padding:0 14px 10px;color:var(--h-mut);font-size:11px;line-height:1.6}.chat-disclosure summary{cursor:pointer;overflow-wrap:anywhere}.chat-disclosure p{margin:6px 0 0}@media(max-width:560px){.hero-content{padding:72px 12px 16px}.hero-content.has-conversation{width:100%}.chat-thread{max-height:180px}.hero-content h1{font-size:20px}}.home-hero{background:transparent;min-height:260px}.home-hero:after,.home-hero:before{display:none}.home-hero .hero-content{padding-top:42px}.hero-content h1{text-shadow:none;font-size:24px}.home-composer{background:#161619;border-color:#2b2b30;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:12px}.home-widgets .widget{border-radius:10px}.home-toolbar{margin-top:12px}.widget .w-empty{line-height:1.75}.composer-note{color:var(--muted)}body.view-home .topbar{position:-webkit-sticky;position:sticky;top:0;min-height:64px;background:#111114;border-bottom:1px solid #24242a;padding:10px 20px}body.view-home .brand{display:inline-flex;width:auto;font-size:17px;margin-right:20px;gap:10px}body.view-home .brand img{width:27px;height:27px}body.view-home #api-message:not(:empty){margin:14px 20px 0;padding:8px 0;border:0;border-radius:0;background:transparent;color:var(--muted);max-width:none}body.view-home .hero-content{padding-top:30px}#api-message:not(:empty){border:0;background:transparent;padding:10px 0;border-radius:0;color:var(--muted)}@media(max-width:760px){body.view-home .brand{font-size:0;margin-right:4px;gap:0}body.view-home .brand img{width:25px;height:25px}body.view-home .topbar{padding:10px 12px}.home-switcher{min-width:0;max-width:calc(100vw - 190px);overflow:auto}}.home-hero{isolation:isolate}.home-hero #home-sky{display:block;opacity:.38;pointer-events:none}.home-hero .hero-content{position:relative;z-index:1}.home-composer{background:#161619ed}.home-hero:after{display:block;content:"";position:absolute;inset:0;z-index:0;background:linear-gradient(180deg,#10101300 55%,#101013);pointer-events:none}.home-hero{min-height:400px}.home-hero .hero-content{padding:54px 20px 34px}.home-hero:after{background:linear-gradient(180deg,#10101300 65%,#101013)}.home-composer{background:#13131899;border-color:#ffffff26;border-radius:16px;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:0 20px 55px #0006}.home-widgets .widget{background:#18181de0;border-color:#ffffff15;border-radius:14px}.home-body .home-action,.home-widgets .widget{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.home-body .home-action{width:100%;margin:0 0 24px;background:#1b1b21b3}.account-connected #stats,.account-connected .run-sidebar{display:none}.account-connected .workspace{grid-template-columns:minmax(0,1fr)}.debug-section{margin-top:20px;border-top:1px solid #303034;padding-top:16px}.debug-section>summary{cursor:pointer;color:#bbb}.home-hero{min-height:220px}.home-overview-title{position:relative;z-index:1;padding:36px 20px;color:#fff;font-size:28px;letter-spacing:-.5px;text-shadow:0 2px 22px #0009}.home-assistant-bottom{display:flex;justify-content:center;margin-top:32px}.home-assistant-bottom .hero-content{padding:0;width:min(560px,100%)}.home-assistant-bottom .hero-content.has-conversation{width:min(720px,100%)}.home-assistant-bottom .home-composer{background:#18181db3}.home-assistant-bottom .hero-content{max-width:100%}@media(max-width:560px){.home-hero{min-height:180px}.home-overview-title{font-size:24px}.home-assistant-bottom{margin-top:24px}}#home-view{position:relative;isolation:isolate;padding-bottom:90px}.home-hero{position:static;min-height:190px}.home-hero #home-sky{-webkit-mask-image:linear-gradient(#000,#000b 35%,transparent);mask-image:linear-gradient(#000,#000b 35%,transparent)}.home-hero:after{display:none}.home-overview-title{font-size:30px;padding:42px 24px}.home-body{max-width:1080px;padding-bottom:24px}.home-body .home-action{background:#18181b80;border-color:#ffffff14;padding:22px 24px;border-radius:16px}.home-widgets{grid-template-areas:none;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.home-widgets .widget{grid-area:auto;min-height:140px;padding:18px;background:#17171bc9;border-radius:12px}.home-widgets .widget[hidden]{display:none}.home-widgets .w-empty{font-size:12px;line-height:1.65}.home-widget-controls{display:flex;gap:16px;flex-wrap:wrap;padding:16px;margin-bottom:16px;border:1px solid #ffffff18;border-radius:12px;background:#19191f}.home-widget-controls[hidden]{display:none}.home-widget-controls label{display:flex;align-items:center;gap:7px;font-size:12px}.home-widget-controls input{accent-color:#4c68ff}.home-assistant-bottom{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:30;max-width:calc(100vw - 32px)}#assistant-dock-toggle{padding:14px 20px;border-radius:40px;background:#202028ee;border:1px solid #ffffff30;color:#eee;box-shadow:0 8px 30px #0006;display:flex;gap:32px;align-items:center;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}#assistant-dock-panel[hidden],#assistant-dock-toggle[hidden]{display:none}#assistant-dock-panel{width:min(560px,calc(100vw - 32px));max-height:calc(100dvh - 160px);overflow:auto;padding:0}#assistant-dock-panel.has-conversation{width:min(720px,calc(100vw - 32px))}#assistant-dock-close{display:block;margin:0 0 8px auto;background:#202028;color:#ccc;border:1px solid #ffffff25;padding:6px 12px;border-radius:8px;font-size:12px}.home-assistant-bottom .home-composer{background:#19191ff5;box-shadow:0 20px 60px #0008}.failure-row{width:100%;text-align:left;background:none;border:0;color:inherit;cursor:pointer}.failure-row:hover{background:#ffffff08}#account-user-name{margin:8px 0;color:#ddd;font-size:13px}@media(max-width:900px){.home-widgets{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){body.view-home .topbar{display:flex;flex-wrap:wrap;gap:10px;min-height:106px;padding:10px 12px}body.view-home .brand{font-size:16px;flex:1 1;margin:0}body.view-home .home-top-actions{margin-left:auto}body.view-home #home-expand,body.view-home #home-search{display:none}body.view-home .home-switcher{order:10;width:100%;max-width:100%;display:flex;overflow:visible;padding:3px;justify-content:space-between}.home-switcher button{flex:1 1;justify-content:center;padding:8px 3px;gap:3px;font-size:11px;min-height:36px}.home-switcher button img,.home-switcher button svg{display:none}.home-overview-title{font-size:25px;padding:30px 18px}.home-hero{min-height:150px}.home-body .home-action{padding:18px;align-items:flex-start;gap:16px;flex-direction:column}.home-action h2{font-size:18px}.home-widgets{grid-template-columns:1fr}.home-widgets .widget{min-height:0;padding:16px}.home-grid-head{margin-top:20px}.home-assistant-bottom{bottom:12px}#assistant-dock-panel{max-height:calc(100dvh - 150px)}}.home-body{animation:none}.home-assistant-bottom{width:max-content}#assistant-dock-toggle{white-space:nowrap}@media(max-width:600px){body:not(.view-home) .topbar{height:auto;min-height:106px;display:flex;flex-wrap:wrap;padding:10px 12px;gap:10px}body:not(.view-home) .brand{width:auto;flex:1 1;font-size:16px}body:not(.view-home) .home-switcher{order:10;width:100%;max-width:100%;overflow:visible;justify-content:space-between}body:not(.view-home) #sidebar-toggle,body:not(.view-home) .home-top-actions{display:none}body:not(.view-home) .app-layout{grid-template-columns:minmax(0,1fr)}body:not(.view-home) .app-nav{display:none}.account-menu{right:0;left:auto}}.home-hero #home-sky{height:380px!important;-webkit-mask-image:linear-gradient(#000,#000 45%,transparent);mask-image:linear-gradient(#000,#000 45%,transparent)}body.view-settings .app-layout{grid-template-columns:minmax(0,1fr)}body.view-settings #sidebar-toggle,body.view-settings .app-nav{display:none}body.view-settings main{width:100%;max-width:1040px;margin:0 auto}.assistant-heading{display:flex;justify-content:space-between;align-items:center;padding:16px 16px 8px;gap:16px;font-size:14px}#assistant-project-context{font-size:12px;color:#aaa;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#assistant-connection-status{margin:0;padding:0 16px 12px;font-size:12px;color:#a8a8b3;line-height:1.6}#assistant-connect{margin:0 16px 14px;background:#4c68ff;border:0;border-radius:8px;padding:9px 12px;color:white;font-size:12px}#assistant-connect[hidden],#composer-input:disabled{display:none}.home-composer:has(#composer-input:disabled) .composer-row{display:none}.assistant-send-hint{font-size:11px;color:#92929f;flex:1 1;padding-left:8px}.composer-send{width:auto;min-width:64px;padding:6px 12px;font-size:12px}.sidebar-project,.sidebar-workflow{display:block;width:100%;text-align:left;border:0;background:transparent;color:#a9a9b3;padding:10px 14px;border-radius:8px;font-size:12px;overflow-wrap:anywhere}.sidebar-project.active,.sidebar-project:hover,.sidebar-workflow:hover{background:#ffffff0a;color:#eee}.sidebar-project{font-size:13px;font-weight:550}.sidebar-empty{font-size:12px;line-height:1.6;color:#777;padding:0 14px}#sidebar-projects{overflow:auto;flex:1 1;padding:10px 0}@media(max-width:600px){body:not(.view-home):not(.view-settings) .app-layout{display:block}body:not(.view-home):not(.view-settings) .app-nav{display:block;padding:8px 12px;border-bottom:1px solid #ffffff12;width:100%}body:not(.view-home):not(.view-settings) .app-nav .sidebar-bottom,body:not(.view-home):not(.view-settings) .app-nav .sidebar-primary{display:none}#sidebar-projects{display:flex;overflow:auto;gap:6px;padding:0}#sidebar-projects .sidebar-empty,#sidebar-projects .sidebar-label,#sidebar-projects .sidebar-workflow{display:none}#sidebar-projects .sidebar-project{width:auto;flex:none;padding:8px 12px}}.home-composer .chat-content :is(h1,h2,h3,h4){font-size:14px;line-height:1.5;font-weight:600;text-align:left;margin:12px 0 6px;letter-spacing:normal;text-shadow:none}body.view-home{--h-bg:#17181c}body.view-home,body.view-home main{background:var(--h-bg)}body.view-home .topbar{position:absolute;background:transparent;border:0;-webkit-backdrop-filter:none;backdrop-filter:none;min-height:56px;padding:10px 18px}body.view-home #api-message:not(:empty){position:absolute;top:58px;right:20px;max-width:360px;margin:0;padding:0;font-size:11px;text-align:right;color:#c0c9d4;z-index:3}#home-view{padding-bottom:48px;min-height:calc(100dvh - 20px)}.home-hero{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;min-height:390px;overflow:visible;isolation:auto;padding:218px 20px 32px;gap:16px}.home-hero #home-sky{position:absolute;inset:0;height:510px!important;width:100%!important;background:url(../media/moonlit-coast.bbe901a1.png) top/100% auto no-repeat;image-rendering:auto;opacity:1;-webkit-mask-image:linear-gradient(#000,#000 53%,transparent);mask-image:linear-gradient(#000,#000 53%,transparent);z-index:-1}.home-overview-title{font-size:22px;line-height:1.25;padding:0;margin:0;font-weight:550;letter-spacing:-.45px;text-shadow:0 2px 18px #0008;text-wrap:balance;text-align:center}.home-assistant-bottom{position:relative;bottom:auto;left:auto;transform:none;margin:0;z-index:3;width:min(480px,100%);max-width:100%;display:block}#assistant-dock-toggle{width:100%;justify-content:space-between;background:#1b1e25c9;border-color:#ffffff1c;border-radius:12px;padding:16px 18px;white-space:normal;font-size:13px;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:0 10px 40px #080a1040}#assistant-dock-panel,#assistant-dock-panel.has-conversation{width:100%;max-height:470px;overflow:auto}.home-assistant-bottom:has(.has-conversation){width:min(680px,100%)}.home-assistant-bottom .home-composer{border-radius:12px;background:#1d2027df;box-shadow:0 16px 40px #0a0c1250}#assistant-dock-close{margin-bottom:6px;background:#1b1e25aa}#assistant-connection-status{font-size:11px;padding-bottom:4px}#composer-input{min-height:64px;font-size:13px}#chat-thread{max-height:240px}.home-body{max-width:800px;padding:0 20px 32px;margin:0 auto}.home-body .home-action{padding:14px 16px;margin:0 0 18px;border-radius:10px;background:#20222780;border-color:#ffffff0c;gap:20px}.home-action h2{font-size:14px;margin:0 0 4px;font-weight:550}.home-action p{font-size:12px;margin:0;color:#a1a4ad}.home-action button{font-size:12px;padding:8px 12px;min-height:32px;flex:none;background:#2d354b;border:1px solid #67759255}.home-grid-head{margin:0 0 10px}.home-widgets{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:10px;gap:10px;align-items:start}.home-widgets .widget{background:#202227a8;border:1px solid #ffffff09;border-radius:9px;padding:14px 15px;min-height:0;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:none}.home-widgets .widget header{gap:7px;margin-bottom:12px}.home-widgets .widget h2{font-size:12px;font-weight:500;color:#d9dce2}.home-widgets .widget .w-empty{font-size:11px;line-height:1.6;color:#90949f;margin:0}.home-widgets .w-head-meta{font-size:10px;color:#9398a4}.review-row{grid-template-columns:16px minmax(0,1fr) auto;gap:8px;padding:9px 0}.review-row .ref{grid-column:2;font-size:10px}.review-row .r-time{display:none}.review-row strong{font-size:12px;font-weight:450}.review-row .r-status{font-size:10px}.project-title{font-size:14px}.project-summary{gap:6px}.project-summary button{padding:8px 0;text-align:left;font-size:10px}.project-summary b{font-size:20px;font-weight:500}.git-total{display:flex;align-items:baseline;gap:8px}.git-total strong{font-size:26px;font-weight:500;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.git-total span{font-size:10px;color:#9298a3}.git-bars{display:flex;align-items:flex-end;height:52px;gap:4px;margin:12px 0 8px}.git-bars span{flex:1 1;height:var(--bar);min-height:3px;background:#496da9;border-radius:2px 2px 0 0}.git-bars span:last-child{background:#698fd0}.git-foot{display:flex;justify-content:space-between;gap:8px;font-size:9px;color:#9298a3;margin:0 0 10px}.git-foot code{font-size:10px;color:#bdc5d2}.sync-command{display:block;font-size:11px;color:#bfc6d1;margin-top:10px}.activity-row{display:flex;align-items:flex-start;gap:8px;width:100%;padding:9px 0;border:0;border-bottom:1px solid #ffffff07;background:transparent;color:inherit;text-align:left;cursor:pointer}.activity-row:hover{background:#ffffff04}.activity-dot{width:5px;height:5px;flex:none;margin-top:5px;border-radius:50%;background:#7c99c4}.activity-dot.fault{background:#d7a46a}.activity-dot.write{background:#63a884}.activity-row strong{display:block;font-size:11px;font-weight:500}.activity-row small{display:block;font-size:10px;color:#9096a2;overflow-wrap:anywhere;line-height:1.5;margin-top:4px}.activity-row time{margin-left:auto;white-space:nowrap;font-size:9px;color:#7c8290}.home-widget-controls{font-size:11px;background:#21242bcc;border-radius:9px;padding:12px}.home-icon-btn,.home-top-actions .home-search{background:#11172255;border-color:#c4d2f020}.home-switcher{background:#151b265e;border-color:#d1dbec18}@media(max-width:600px){body.view-home .topbar{position:relative;background:#17181c;min-height:100px}body.view-home #api-message:not(:empty){position:relative;top:auto;right:auto;margin:8px 20px;text-align:left;max-width:none}.home-hero{min-height:310px;padding:162px 20px 24px}.home-hero #home-sky{height:410px!important;background-size:auto 410px;background-position:23% top}.home-overview-title{font-size:21px}.home-body{padding:0 16px 28px}.home-body .home-action{flex-direction:row;padding:12px;gap:12px}.home-action p{display:none}.home-widgets{grid-template-columns:minmax(0,1fr)}#assistant-dock-panel,.home-widgets #widget-git,.home-widgets #widget-project,.home-widgets #widget-receipts,.home-widgets #widget-sandbox,.home-widgets #widget-services,.home-widgets #widget-working{max-height:410px}.home-assistant-bottom{bottom:auto}.home-grid-head{margin-top:0}}.home-hero #home-sky{background-image:radial-gradient(circle,#11172388 .65px,transparent .95px),url(../media/moonlit-coast.bbe901a1.png);background-size:3px 3px,100% auto;background-position:top;background-repeat:repeat,no-repeat;-webkit-mask-image:linear-gradient(#000,#000 40%,#0009 61%,transparent 94%);mask-image:linear-gradient(#000,#000 40%,#0009 61%,transparent 94%)}.assistant-entry{display:flex;align-items:center;gap:8px;padding:5px 7px 5px 4px;border:1px solid #ffffff20;border-radius:32px;background:#1b1e25d9;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:0 10px 40px #080a1040}.assistant-entry #assistant-dock-toggle{flex:1 1;width:auto;min-width:0;padding:12px 14px;border:0;border-radius:28px;background:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}.home-assistant-bottom:has(#assistant-dock-panel:not([hidden])) .assistant-entry{display:none}.home-assistant-bottom .home-composer{border-radius:26px}.voice-button{display:grid;place-items:center;flex:none;width:36px;height:36px;min-height:36px;padding:8px;border-radius:50%;border:1px solid #ffffff14;background:#ffffff08;color:#c9d1df}.voice-button svg{width:18px;height:18px}.voice-button:hover{background:#ffffff14}.voice-button.recording{color:#ffb6b6;background:#662c3c;border-color:#b46777}.voice-button:disabled{opacity:.45}.composer-row .assistant-send-hint{flex:1 1;min-width:0}.composer-send{border-radius:22px}@media(max-width:600px){.home-hero #home-sky{background-size:3px 3px,auto 410px;background-position:top,23% top}.assistant-entry #assistant-dock-toggle{font-size:12px}.assistant-send-hint{font-size:10px}}.home-widgets>.widget-column{display:flex;flex-direction:column;gap:10px;min-width:0}.home-widgets>.widget-column:not(:has(>.widget:not([hidden]))){display:none}.home-widgets:has(>.widget-column:not(:has(>.widget:not([hidden])))){grid-template-columns:minmax(0,1fr)}@media(max-width:600px){.home-widgets>.widget-column{display:contents}.home-widgets #widget-project{order:0}.home-widgets #widget-receipts{order:1}.home-widgets #widget-git{order:2}.home-widgets #widget-working{order:3}.home-widgets #widget-services{order:4}.home-widgets #widget-sandbox{order:5}.home-widgets #widget-failures{order:6}}
1
+ :root{--h-bg:#101013;--h-card:#161619;--h-card2:#1b1b1f;--h-line:#26262c;--h-line2:#313138;--h-ink:#ececee;--h-dim:#a3a6b0;--h-mut:#7e828d;--h-blue:#4c6fff;--h-bar:#3f66f5;--h-green:#3fbf7f;--h-red:#e5484d;--h-amber:#f2a33c;--h-orange:#e8833a}html{scrollbar-color:#3a3a42 #101013}body.view-home .brand,body.view-home .sidebar-toggle,body.view-home .workspace-name{display:none}body.view-home .app-layout{grid-template-columns:minmax(0,1fr)}body.view-home .app-nav{display:none}body.view-home main{padding:0;max-width:none}body.view-home footer{display:none}body.view-home .topbar{z-index:30;left:0;right:0;padding:10px 16px;display:flex;align-items:center;gap:8px}body.view-home .account-control{margin-left:0}body.view-home #api-message:not(:empty){position:relative;z-index:5;margin:68px 20px 0;background:#2a2320;border:1px solid #4a3a30;color:#e8d8c8}.visually-hidden{position:absolute;width:1px;height:1px;-webkit-clip-path:inset(50%);clip-path:inset(50%);overflow:hidden}body:not(.view-home) .workspace-name{display:none}.home-switcher{gap:2px;border:1px solid #ffffff17;background:#141419a8;border-radius:12px;padding:3px;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.home-switcher,.home-switcher button{display:inline-flex;align-items:center}.home-switcher button{gap:7px;border:0;background:transparent;color:#a9adb8;border-radius:9px;padding:6px 12px;min-height:28px;font-size:13px;font-weight:500;white-space:nowrap;transition:background .12s ease,color .12s ease}.home-switcher button.active,.home-switcher button:hover{background:#232330;color:#fff}.home-switcher button img,.home-switcher button svg{width:15px;height:15px;color:#fff;flex:none}.home-switcher button img{filter:brightness(0) invert(1)}.pill-count{min-width:17px;height:17px;padding:0 5px;display:inline-grid;place-items:center;background:#f2a33c;color:#16110a;border-radius:99px;font-size:10.5px;font-weight:600}.home-menu{position:absolute;left:0;top:44px;min-width:210px;background:#1a1a20;border:1px solid #2c2c34;border-radius:12px;box-shadow:0 18px 50px #000a;padding:6px;z-index:40}.home-menu[hidden]{display:none}.home-menu button{display:flex;width:100%;align-items:center;gap:10px;text-align:left;border:0;background:transparent;border-radius:8px;min-height:34px;padding:7px 10px;font-size:13px;color:#c9ccd5}.home-menu button img,.home-menu button svg{width:16px;height:16px;opacity:.8}.home-menu button:hover{background:#26262e;color:#fff}.home-menu button.active{background:#232330;color:#fff}.home-top-actions{margin-left:auto;display:flex;align-items:center;gap:8px}.home-search{display:inline-flex;align-items:center;gap:8px;border:1px solid #ffffff17;background:#141419a8;color:#9296a1;border-radius:10px;padding:6px 10px;min-height:34px;font-size:12.5px;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.home-search:hover{color:#d6d8df;border-color:#ffffff2a}.home-search svg{width:14px;height:14px}.home-search kbd{font:11px var(--mono);color:#7f8390;border:1px solid #ffffff14;border-radius:5px;padding:1px 5px;background:#ffffff08}.home-icon-btn{position:relative;display:grid;place-items:center;width:34px;height:34px;min-height:34px;padding:0;border:1px solid #ffffff17;background:#141419a8;color:#b9bcc6;border-radius:10px;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.home-icon-btn:hover{background:#1d1d24b8;color:#fff}.home-icon-btn svg{width:16px;height:16px}.bell-badge{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;display:grid;place-items:center;background:var(--h-amber);color:#16110a;border-radius:99px;font-size:10px;font-weight:650}.bell-badge:empty{display:none}.home-bell-wrap{position:relative}.bell-menu{left:auto;right:0;min-width:280px;padding:12px 8px 8px}.bell-menu .menu-label{font-size:11px;color:var(--h-mut);margin:0 8px 8px}.bell-item{display:flex;gap:10px;align-items:flex-start;padding:9px 10px;border-radius:8px;font-size:12.5px;color:#c9ccd5;text-align:left;width:100%;border:0;background:transparent}.bell-item:hover{background:#26262e}.bell-item .dot{width:7px;height:7px;border-radius:50%;background:var(--h-amber);flex:none;margin-top:5px}.bell-item small{display:block;color:var(--h-mut);font-size:11px;margin-top:2px}.home-hero{min-height:clamp(430px,58vh,560px);align-items:flex-end;justify-content:center;overflow:hidden}#home-sky{position:absolute;inset:0;width:100%;height:100%;image-rendering:pixelated}.home-hero:after{inset:auto 0 0 0;height:220px;background:linear-gradient(to bottom,transparent,var(--h-bg))}.hero-content{position:relative;z-index:2;text-align:center;padding:96px 20px 46px;width:min(560px,100%)}.hero-content h1{font-size:clamp(21px,2.6vw,28px);font-weight:550;letter-spacing:-.5px;color:#fff;text-shadow:0 2px 22px #0009;margin-bottom:18px;text-wrap:balance}.home-composer{text-align:left;border:1px solid #ffffff1c;box-shadow:0 24px 70px #000a;overflow:hidden}.composer-tabs{display:flex;align-items:center;gap:2px;padding:9px 10px;border-bottom:1px solid #ffffff10}.composer-tab{border:0;background:transparent;color:#9296a1;font-size:12.5px;font-weight:500;min-height:26px;padding:3px 10px;border-radius:7px}.composer-tab+.composer-tab{border-left:1px solid #ffffff12;border-radius:0 7px 7px 0}.composer-tab:hover{color:#d6d8df}.composer-tab.active{color:#fff}.composer-tab span{color:#7e828d;font-weight:450}.composer-spacer{flex:1 1}.composer-mini{color:#7f8390;display:grid;place-items:center}.composer-mini svg{width:15px;height:15px}#composer-input{display:block;width:100%;background:transparent;border:0;padding:14px 16px 8px;color:var(--h-ink);font:13.5px/1.6 Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;resize:none;outline:none}#composer-input::placeholder{color:#71747f}.composer-row{display:flex;padding:4px 8px 8px;flex-wrap:wrap}.chip,.composer-row{align-items:center;gap:6px}.chip{display:inline-flex;border:1px solid #ffffff14;background:#ffffff0a;color:#c4c7d0;border-radius:9px;padding:4px 9px;min-height:28px;font-size:12px;font-weight:450}.chip svg{width:13px;height:13px;color:#8b8e98}.chip .chevron{width:11px;height:11px;color:#7f8390}.chip:hover{background:#ffffff14;color:#fff}.chip.strong{color:#e8e9ee}.chip.dot{border-style:dashed;cursor:default}.chip.dot:hover{background:#ffffff0a;color:#c4c7d0}.dot-dot{width:6px;height:6px;border-radius:50%;background:var(--h-green)}.composer-flex{flex:1 1}.composer-send{width:30px;height:30px;min-width:30px;min-height:30px;padding:0;display:grid;place-items:center;border-radius:9px;border:1px solid #ffffff1c;background:#ffffff17;color:#e8e9ee}.composer-send:hover{background:#ffffff26}.composer-send svg{width:14px;height:14px}.composer-note{display:none;margin:0;padding:0 14px 10px;font-size:11.5px;color:#b7a98a;line-height:1.6}.composer-note.show{display:block}.home-body{position:relative;z-index:2;max-width:1180px;width:100%;padding:6px 20px 56px}.home-grid-head{display:flex;justify-content:flex-end;align-items:center;margin:2px 2px 10px}.grid-hint{margin-right:auto;font-size:11px;color:#767a86;letter-spacing:.2px}#home-customize{display:inline-flex;align-items:center;gap:7px;border:0;background:transparent;color:#8b8e98;font-size:12px;min-height:28px;padding:4px 8px}#home-customize:hover{color:#d6d8df}#home-customize svg{width:14px;height:14px}#home-customize[aria-pressed=true]{color:var(--h-blue)}.home-widgets{grid-gap:14px;gap:14px;grid-template-areas:"working receipts" "sandbox receipts" "services failures"}.area-working{grid-area:working}.area-receipts{grid-area:receipts}.area-sandbox{grid-area:sandbox}.area-services{grid-area:services}.area-failures{grid-area:failures}.widget{background:var(--h-card);border:1px solid var(--h-line);border-radius:14px;padding:13px 16px 14px;min-width:0;overflow:hidden}.widget>header{display:flex;align-items:center;gap:8px;margin-bottom:4px}.widget h2{font-size:12.5px;font-weight:500;color:#d3d5db;letter-spacing:-.1px}.w-ico{display:grid;place-items:center;color:#7e828d}.w-ico svg{width:14px;height:14px}.w-count{font-size:11.5px;color:#7e828d}.w-count.warn{color:var(--h-amber)}.w-head-meta{margin-left:auto;font-size:11px;color:#7e828d;display:inline-flex;align-items:center;gap:6px}.w-head-spin{margin-left:auto;color:#9aa0ab;display:grid;place-items:center}.w-head-spin svg{width:13px;height:13px}.spin{animation:spin 1.1s linear infinite;transform-origin:center}@keyframes spin{to{transform:rotate(1turn)}}.w-body{padding-top:6px}.w-empty{font-size:12px;color:var(--h-mut);line-height:1.7;padding:8px 0 4px}.task-row{display:flex;align-items:flex-start;gap:9px;padding:6px 0 2px}.task-spin{color:var(--h-blue);flex:none;margin-top:2px;display:grid;place-items:center}.task-spin svg{width:14px;height:14px}.task-row strong{display:block;font-size:13px;font-weight:500;color:#e8e9ee}.task-stat{color:#8b8e98;flex:none;margin-top:1px;display:grid;place-items:center}.task-stat svg{width:14px;height:14px}.task-row .w-when{margin-left:auto;font-size:11px;color:var(--h-amber);white-space:nowrap;display:inline-flex;gap:5px;align-items:center}.task-row .w-when:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--h-orange)}.task-row .w-when.quiet{color:#8b8e98}.task-row .w-when.quiet:before{display:none}.task-sub{margin:2px 0 0 23px;font:10.5px/1.6 var(--mono);color:#7f8390;overflow-wrap:anywhere}.linklike{border:0;background:transparent;color:#9aa0ab;font:inherit;padding:0;min-height:0;text-decoration:underline;text-underline-offset:3px}.linklike:hover{color:#fff}.group-label{display:flex;align-items:center;gap:6px;font-size:11px;color:#8b8e98;margin:10px 0 2px}.group-label b{font-weight:550}.group-label.warn b{color:var(--h-amber)}.group-label .g-spin{color:#8b8e98;display:grid}.group-label .g-spin svg{width:11px;height:11px}.review-row{display:flex;align-items:center;width:100%;text-align:left;padding:8px 10px;margin:0 -10px;min-height:0;border:0;border-radius:8px;background:transparent;font:inherit;color:inherit;box-shadow:inset 0 -1px 0 #1f1f25;transition:background .12s ease}.review-row:last-child{box-shadow:none}.review-row:hover{background:#1d1d24}.review-row .r-ico{color:#8b8e98;display:grid;flex:none}.review-row .r-ico svg{width:13px;height:13px}.review-row strong{font-size:12.5px;color:#dcdee4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1;min-width:0}.review-row:hover strong{color:#fff}.review-row .ref{font:10px/1.4 var(--mono);color:#838792;background:#232329;border-radius:5px;padding:2px 6px;white-space:nowrap}.review-row .r-status{font-size:11px;white-space:nowrap}.review-row .r-status.passed{color:var(--h-green)}.review-row .r-status.error,.review-row .r-status.failed{color:var(--h-red)}.review-row .r-status.incomplete{color:#9296a1}.review-row .r-time{font-size:10.5px;color:#7f8390;white-space:nowrap}.ok-ico{color:var(--h-green)}.warn-ico{color:var(--h-amber)}.bad-ico{color:var(--h-red)}.neutral-ico{color:#7e828d}.fact-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:10px 18px;gap:10px 18px;padding-top:8px}.fact-item{min-width:0}.fact-item span{display:block;font-size:9px;color:#7f8390;letter-spacing:.3px}.fact-item b{display:block;margin-top:2px;font-size:11.5px;font-weight:450;color:#dcdee4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.service-row{display:flex;align-items:baseline;gap:9px;padding:8px 0;border-bottom:1px solid #1f1f25;font-size:12.5px}.service-row:last-child{border-bottom:0}.service-row strong{font-weight:450;color:#dcdee4}.service-row .s-kind{flex:1 1;min-width:0;font-size:10.5px;color:#8b8e98;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.service-row .runner{font:10.5px var(--mono);color:#7f8390;white-space:nowrap}.failure-row{display:flex;align-items:center;gap:9px;padding:9px 0;border-bottom:1px solid #1f1f25;font-size:12.5px}.failure-row:last-child{border-bottom:0}.failure-row .bad-ico{display:grid;flex:none}.failure-row .bad-ico svg{width:13px;height:13px}.failure-row strong{font-weight:450;color:#dcdee4;white-space:nowrap}.failure-row .f-path{font:10.5px var(--mono);color:#7f8390;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.failure-row .f-time{margin-left:auto;font-size:11px;color:#7e828d;white-space:nowrap}.home-loop{position:fixed;right:18px;bottom:18px;z-index:25;display:inline-flex;align-items:center;gap:8px;border:1px solid #ffffff17;background:#1a1a20e0;color:#c9ccd5;border-radius:999px;padding:8px 13px;min-height:36px;font-size:12.5px;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);box-shadow:0 10px 30px #0008}.home-loop:hover{background:#22222ae8;color:#fff}.home-loop svg{width:14px;height:14px;color:#8b8e98}.home-loop .chevron{width:12px;height:12px}.loop-note{position:fixed;right:18px;bottom:62px;z-index:25;max-width:300px;background:#1a1a20;border:1px solid #2c2c34;border-radius:12px;padding:12px 14px;font-size:12px;line-height:1.65;color:#b9bcc6;box-shadow:0 18px 50px #000a}.palette{position:fixed;inset:0;z-index:60;background:#0009;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);display:flex;align-items:flex-start;justify-content:center;padding:16vh 20px 0}.palette[hidden]{display:none}.palette-panel{width:min(560px,100%);background:#1a1a20;border:1px solid #2e2e36;border-radius:14px;box-shadow:0 30px 80px #000c;overflow:hidden}.palette-panel input{width:100%;background:transparent;border:0;border-bottom:1px solid #26262c;color:#ececee;font-size:14px;padding:15px 16px;outline:none}.palette-list{max-height:300px;overflow:auto;padding:6px}.palette-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:0;background:transparent;border-radius:8px;padding:9px 10px;font-size:13px;color:#c9ccd5;min-height:36px}.palette-item.active,.palette-item:hover{background:#26262e;color:#fff}.palette-item small{margin-left:auto;font:10.5px var(--mono);color:#7f8390}.palette-item img,.palette-item svg{width:15px;height:15px;opacity:.8}.palette-empty{padding:16px;font-size:12.5px;color:#7e828d}.home-widgets.compact .widget{padding:10px 13px 11px}.home-widgets.compact .failure-row,.home-widgets.compact .review-row,.home-widgets.compact .service-row{padding:6px 10px}@media(max-width:900px){.home-widgets{grid-template-columns:1fr;grid-template-areas:"working" "receipts" "sandbox" "services" "failures"}.home-hero{min-height:420px}.hero-content{padding-top:84px}}@media(max-width:560px){body.view-home .topbar{padding:8px 10px}.home-search span{display:none}.home-search{padding:6px 8px}.home-search kbd{display:none}.home-body{padding:4px 12px 48px}.fact-grid{grid-template-columns:1fr}.home-switcher{max-width:calc(100vw - 150px);overflow-x:auto;scrollbar-width:none}.home-switcher::-webkit-scrollbar{display:none}.home-switcher button{font-size:12px;padding:5px 9px;gap:6px}}@media(prefers-reduced-motion:reduce){.spin{animation:none}}.widget{transition:border-color .15s ease}.widget:hover{border-color:#2e2e36}.widget .w-count{background:#232329;border-radius:6px;padding:1px 7px;font-size:10.5px}.widget .w-count:empty{display:none}.widget .w-count.warn{color:var(--h-amber)}.fact-item b{font-family:var(--mono);font-size:11px}.home-composer{transition:border-color .15s ease,box-shadow .15s ease}.home-composer:focus-within{border-color:#4c6fff59;box-shadow:0 24px 70px #000a,0 0 0 3px #4c6fff1f}.composer-send{background:var(--h-blue);border-color:var(--h-blue);color:#fff}.composer-send:hover{background:#5d7dff;border-color:#5d7dff}.chip,.composer-tab{transition:background .12s ease,color .12s ease,border-color .12s ease}.hero-content{animation:home-rise .45s ease both}.home-body{animation:home-rise .5s ease both}@keyframes home-rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.palette-list{scrollbar-width:thin;scrollbar-color:#2e2e36 transparent}.palette-hint{display:flex;gap:16px;padding:9px 16px;border-top:1px solid #26262c;font-size:10.5px;color:#8b8e98}.palette-hint kbd{font:10px var(--mono);color:#9aa0ab;border:1px solid #ffffff14;border-radius:4px;padding:1px 5px;background:#ffffff08;margin-right:4px}.chat-context{font-size:12px;color:var(--text-muted,#999);padding:0 18px 12px;margin:0}.chat-thread{max-height:420px;overflow:auto;border-top:1px solid rgba(255,255,255,.1);padding:16px 20px;text-align:left}.chat-message{margin:0 0 20px}.chat-message header{font-size:12px;color:#9696a0;margin-bottom:8px}.chat-message p{white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px;line-height:1.65;margin:0;color:#e1e1e6}.chat-message.user{border-left:2px solid #3c5bff;padding-left:12px}.composer-send:disabled{opacity:.4;cursor:wait}.hero-content{width:440px;max-width:100%;min-width:0;padding:82px 20px 24px;transition:width .2s ease}.hero-content.has-conversation{width:760px}.home-hero{min-height:350px}.home-composer{min-width:0;width:100%;max-width:100%}.chat-thread{max-height:280px;padding:14px 18px;overscroll-behavior:contain;min-width:0}.chat-message{margin-bottom:16px;min-width:0}.chat-content{font-size:13px;line-height:1.65;overflow-wrap:anywhere;color:#e1e1e6}.chat-content p{font-size:inherit;white-space:normal;line-height:inherit;margin:0 0 10px}.chat-message.user .chat-content p{white-space:pre-wrap}.chat-content :last-child{margin-bottom:0}.chat-content h1,.chat-content h2,.chat-content h3,.chat-content h4{font-size:14px;text-align:left;margin:12px 0 6px;text-shadow:none}.chat-content ol,.chat-content ul{margin:8px 0;padding-left:22px}.chat-content li{margin:4px 0}.chat-content code{font:12px/1.6 var(--mono);background:#ffffff0a;border-radius:4px;padding:2px 4px;overflow-wrap:anywhere}.chat-content pre{max-width:100%;overflow:auto;background:#0c0c10;border:1px solid var(--h-line);border-radius:8px;padding:12px;margin:10px 0;white-space:pre}.chat-content pre code{padding:0;background:none;white-space:pre}.chat-content table{display:block;max-width:100%;overflow:auto;border-collapse:collapse;margin:10px 0}.chat-content td,.chat-content th{border:1px solid var(--h-line);padding:6px 9px;text-align:left}.chat-content a{color:#8fa4ff;text-decoration:underline}.chat-content blockquote{border-left:2px solid var(--h-line2);margin:10px 0;padding-left:12px;color:var(--h-dim)}.chat-context{font-size:10.5px;padding:0 14px 8px}.home-widgets{grid-template-areas:"project receipts" "working receipts" "sandbox failures" "services failures"}.area-project{grid-area:project}.project-title{display:block;font-weight:500;margin:6px 0 12px}.project-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-gap:8px;gap:8px}.project-summary button{padding:8px;color:var(--h-dim);background:var(--h-card2);border:1px solid var(--h-line);border-radius:8px;font-size:11px}.project-summary b{display:block;color:var(--h-ink);margin-bottom:4px}@media(max-width:900px){.home-widgets{grid-template-columns:1fr;grid-template-areas:"project" "working" "receipts" "sandbox" "services" "failures"}}@media(prefers-reduced-motion:reduce){.hero-content{transition:none}}.home-hero{min-height:300px}.hero-content{padding:72px 20px 20px}body.view-home:has(#api-message:not(:empty)) .hero-content{padding-top:28px}.hero-content h1{font-size:22px;margin-bottom:14px}#home-sky{opacity:.25}.home-composer{background:#161619f5;box-shadow:0 12px 32px #0005}#composer-input{height:62px;min-height:62px;padding-top:10px}.chat-thread{max-height:180px;padding:12px 16px}.chat-disclosure{margin:0;padding:0 14px 10px;color:var(--h-mut);font-size:11px;line-height:1.6}.chat-disclosure summary{cursor:pointer;overflow-wrap:anywhere}.chat-disclosure p{margin:6px 0 0}@media(max-width:560px){.hero-content{padding:72px 12px 16px}.hero-content.has-conversation{width:100%}.chat-thread{max-height:180px}.hero-content h1{font-size:20px}}.home-hero{background:transparent;min-height:260px}.home-hero:after,.home-hero:before{display:none}.home-hero .hero-content{padding-top:42px}.hero-content h1{text-shadow:none;font-size:24px}.home-composer{background:#161619;border-color:#2b2b30;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:12px}.home-widgets .widget{border-radius:10px}.home-toolbar{margin-top:12px}.widget .w-empty{line-height:1.75}.composer-note{color:var(--muted)}body.view-home .topbar{position:-webkit-sticky;position:sticky;top:0;min-height:64px;background:#111114;border-bottom:1px solid #24242a;padding:10px 20px}body.view-home .brand{display:inline-flex;width:auto;font-size:17px;margin-right:20px;gap:10px}body.view-home .brand img{width:27px;height:27px}body.view-home #api-message:not(:empty){margin:14px 20px 0;padding:8px 0;border:0;border-radius:0;background:transparent;color:var(--muted);max-width:none}body.view-home .hero-content{padding-top:30px}#api-message:not(:empty){border:0;background:transparent;padding:10px 0;border-radius:0;color:var(--muted)}@media(max-width:760px){body.view-home .brand{font-size:0;margin-right:4px;gap:0}body.view-home .brand img{width:25px;height:25px}body.view-home .topbar{padding:10px 12px}.home-switcher{min-width:0;max-width:calc(100vw - 190px);overflow:auto}}.home-hero{isolation:isolate}.home-hero #home-sky{display:block;opacity:.38;pointer-events:none}.home-hero .hero-content{position:relative;z-index:1}.home-composer{background:#161619ed}.home-hero:after{display:block;content:"";position:absolute;inset:0;z-index:0;background:linear-gradient(180deg,#10101300 55%,#101013);pointer-events:none}.home-hero{min-height:400px}.home-hero .hero-content{padding:54px 20px 34px}.home-hero:after{background:linear-gradient(180deg,#10101300 65%,#101013)}.home-composer{background:#13131899;border-color:#ffffff26;border-radius:16px;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:0 20px 55px #0006}.home-widgets .widget{background:#18181de0;border-color:#ffffff15;border-radius:14px}.home-body .home-action,.home-widgets .widget{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.home-body .home-action{width:100%;margin:0 0 24px;background:#1b1b21b3}.account-connected #stats,.account-connected .run-sidebar{display:none}.account-connected .workspace{grid-template-columns:minmax(0,1fr)}.debug-section{margin-top:20px;border-top:1px solid #303034;padding-top:16px}.debug-section>summary{cursor:pointer;color:#bbb}.home-hero{min-height:220px}.home-overview-title{position:relative;z-index:1;padding:36px 20px;color:#fff;font-size:28px;letter-spacing:-.5px;text-shadow:0 2px 22px #0009}.home-assistant-bottom{display:flex;justify-content:center;margin-top:32px}.home-assistant-bottom .hero-content{padding:0;width:min(560px,100%)}.home-assistant-bottom .hero-content.has-conversation{width:min(720px,100%)}.home-assistant-bottom .home-composer{background:#18181db3}.home-assistant-bottom .hero-content{max-width:100%}@media(max-width:560px){.home-hero{min-height:180px}.home-overview-title{font-size:24px}.home-assistant-bottom{margin-top:24px}}#home-view{position:relative;isolation:isolate;padding-bottom:90px}.home-hero{position:static;min-height:190px}.home-hero #home-sky{-webkit-mask-image:linear-gradient(#000,#000b 35%,transparent);mask-image:linear-gradient(#000,#000b 35%,transparent)}.home-hero:after{display:none}.home-overview-title{font-size:30px;padding:42px 24px}.home-body{max-width:1080px;padding-bottom:24px}.home-body .home-action{background:#18181b80;border-color:#ffffff14;padding:22px 24px;border-radius:16px}.home-widgets{grid-template-areas:none;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.home-widgets .widget{grid-area:auto;min-height:140px;padding:18px;background:#17171bc9;border-radius:12px}.home-widgets .widget[hidden]{display:none}.home-widgets .w-empty{font-size:12px;line-height:1.65}.home-widget-controls{display:flex;gap:16px;flex-wrap:wrap;padding:16px;margin-bottom:16px;border:1px solid #ffffff18;border-radius:12px;background:#19191f}.home-widget-controls[hidden]{display:none}.home-widget-controls label{display:flex;align-items:center;gap:7px;font-size:12px}.home-widget-controls input{accent-color:#4c68ff}.home-assistant-bottom{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:30;max-width:calc(100vw - 32px)}#assistant-dock-toggle{padding:14px 20px;border-radius:40px;background:#202028ee;border:1px solid #ffffff30;color:#eee;box-shadow:0 8px 30px #0006;display:flex;gap:32px;align-items:center;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}#assistant-dock-panel[hidden],#assistant-dock-toggle[hidden]{display:none}#assistant-dock-panel{width:min(560px,calc(100vw - 32px));max-height:calc(100dvh - 160px);overflow:auto;padding:0}#assistant-dock-panel.has-conversation{width:min(720px,calc(100vw - 32px))}#assistant-dock-close{display:block;margin:0 0 8px auto;background:#202028;color:#ccc;border:1px solid #ffffff25;padding:6px 12px;border-radius:8px;font-size:12px}.home-assistant-bottom .home-composer{background:#19191ff5;box-shadow:0 20px 60px #0008}.failure-row{width:100%;text-align:left;background:none;border:0;color:inherit;cursor:pointer}.failure-row:hover{background:#ffffff08}#account-user-name{margin:8px 0;color:#ddd;font-size:13px}@media(max-width:900px){.home-widgets{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){body.view-home .topbar{display:flex;flex-wrap:wrap;gap:10px;min-height:106px;padding:10px 12px}body.view-home .brand{font-size:16px;flex:1 1;margin:0}body.view-home .home-top-actions{margin-left:auto}body.view-home #home-expand,body.view-home #home-search{display:none}body.view-home .home-switcher{order:10;width:100%;max-width:100%;display:flex;overflow:visible;padding:3px;justify-content:space-between}.home-switcher button{flex:1 1;justify-content:center;padding:8px 3px;gap:3px;font-size:11px;min-height:36px}.home-switcher button img,.home-switcher button svg{display:none}.home-overview-title{font-size:25px;padding:30px 18px}.home-hero{min-height:150px}.home-body .home-action{padding:18px;align-items:flex-start;gap:16px;flex-direction:column}.home-action h2{font-size:18px}.home-widgets{grid-template-columns:1fr}.home-widgets .widget{min-height:0;padding:16px}.home-grid-head{margin-top:20px}.home-assistant-bottom{bottom:12px}#assistant-dock-panel{max-height:calc(100dvh - 150px)}}.home-body{animation:none}.home-assistant-bottom{width:max-content}#assistant-dock-toggle{white-space:nowrap}@media(max-width:600px){body:not(.view-home) .topbar{height:auto;min-height:106px;display:flex;flex-wrap:wrap;padding:10px 12px;gap:10px}body:not(.view-home) .brand{width:auto;flex:1 1;font-size:16px}body:not(.view-home) .home-switcher{order:10;width:100%;max-width:100%;overflow:visible;justify-content:space-between}body:not(.view-home) #sidebar-toggle,body:not(.view-home) .home-top-actions{display:none}body:not(.view-home) .app-layout{grid-template-columns:minmax(0,1fr)}body:not(.view-home) .app-nav{display:none}.account-menu{right:0;left:auto}}.home-hero #home-sky{height:380px!important;-webkit-mask-image:linear-gradient(#000,#000 45%,transparent);mask-image:linear-gradient(#000,#000 45%,transparent)}body.view-settings .app-layout{grid-template-columns:minmax(0,1fr)}body.view-settings #sidebar-toggle,body.view-settings .app-nav{display:none}body.view-settings main{width:100%;max-width:1040px;margin:0 auto}.assistant-heading{display:flex;justify-content:space-between;align-items:center;padding:16px 16px 8px;gap:16px;font-size:14px}#assistant-project-context{font-size:12px;color:#aaa;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#assistant-connection-status{margin:0;padding:0 16px 12px;font-size:12px;color:#a8a8b3;line-height:1.6}#assistant-connect{margin:0 16px 14px;background:#4c68ff;border:0;border-radius:8px;padding:9px 12px;color:white;font-size:12px}#assistant-connect[hidden],#composer-input:disabled{display:none}.home-composer:has(#composer-input:disabled) .composer-row{display:none}.assistant-send-hint{font-size:11px;color:#92929f;flex:1 1;padding-left:8px}.composer-send{width:auto;min-width:64px;padding:6px 12px;font-size:12px}.sidebar-project,.sidebar-workflow{display:block;width:100%;text-align:left;border:0;background:transparent;color:#a9a9b3;padding:10px 14px;border-radius:8px;font-size:12px;overflow-wrap:anywhere}.sidebar-project.active,.sidebar-project:hover,.sidebar-workflow:hover{background:#ffffff0a;color:#eee}.sidebar-project{font-size:13px;font-weight:550}.sidebar-empty{font-size:12px;line-height:1.6;color:#777;padding:0 14px}#sidebar-projects{overflow:auto;flex:1 1;padding:10px 0}@media(max-width:600px){body:not(.view-home):not(.view-settings) .app-layout{display:block}body:not(.view-home):not(.view-settings) .app-nav{display:block;padding:8px 12px;border-bottom:1px solid #ffffff12;width:100%}body:not(.view-home):not(.view-settings) .app-nav .sidebar-bottom,body:not(.view-home):not(.view-settings) .app-nav .sidebar-primary{display:none}#sidebar-projects{display:flex;overflow:auto;gap:6px;padding:0}#sidebar-projects .sidebar-empty,#sidebar-projects .sidebar-label,#sidebar-projects .sidebar-workflow{display:none}#sidebar-projects .sidebar-project{width:auto;flex:none;padding:8px 12px}}.home-composer .chat-content :is(h1,h2,h3,h4){font-size:14px;line-height:1.5;font-weight:600;text-align:left;margin:12px 0 6px;letter-spacing:normal;text-shadow:none}body.view-home{--h-bg:#17181c}body.view-home,body.view-home main{background:var(--h-bg)}body.view-home .topbar{position:absolute;background:transparent;border:0;-webkit-backdrop-filter:none;backdrop-filter:none;min-height:56px;padding:10px 18px}body.view-home #api-message:not(:empty){position:absolute;top:58px;right:20px;max-width:360px;margin:0;padding:0;font-size:11px;text-align:right;color:#c0c9d4;z-index:3}#home-view{padding-bottom:48px;min-height:calc(100dvh - 20px)}.home-hero{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;min-height:390px;overflow:visible;isolation:auto;padding:218px 20px 32px;gap:16px}.home-hero #home-sky{position:absolute;inset:0;height:510px!important;background:url(../media/moonlit-coast.bbe901a1.png) top/100% auto no-repeat;image-rendering:auto;opacity:1;-webkit-mask-image:linear-gradient(#000,#000 53%,transparent);mask-image:linear-gradient(#000,#000 53%,transparent);z-index:-1}.home-overview-title{font-size:22px;line-height:1.25;padding:0;margin:0;font-weight:550;letter-spacing:-.45px;text-shadow:0 2px 18px #0008;text-wrap:balance;text-align:center}.home-assistant-bottom{position:relative;bottom:auto;left:auto;transform:none;margin:0;z-index:3;width:min(480px,100%);max-width:100%;display:block}#assistant-dock-toggle{width:100%;justify-content:space-between;background:#1b1e25c9;border-color:#ffffff1c;border-radius:12px;padding:16px 18px;white-space:normal;font-size:13px;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:0 10px 40px #080a1040}#assistant-dock-panel,#assistant-dock-panel.has-conversation{width:100%;max-height:470px;overflow:auto}.home-assistant-bottom:has(.has-conversation){width:min(680px,100%)}.home-assistant-bottom .home-composer{border-radius:12px;background:#1d2027df;box-shadow:0 16px 40px #0a0c1250}#assistant-dock-close{margin-bottom:6px;background:#1b1e25aa}#assistant-connection-status{font-size:11px;padding-bottom:4px}#composer-input{min-height:64px;font-size:13px}#chat-thread{max-height:240px}.home-body{max-width:800px;padding:0 20px 32px;margin:0 auto}.home-body .home-action{padding:14px 16px;margin:0 0 18px;border-radius:10px;background:#20222780;border-color:#ffffff0c;gap:20px}.home-action h2{font-size:14px;margin:0 0 4px;font-weight:550}.home-action p{font-size:12px;margin:0;color:#a1a4ad}.home-action button{font-size:12px;padding:8px 12px;min-height:32px;flex:none;background:#2d354b;border:1px solid #67759255}.home-grid-head{margin:0 0 10px}.home-widgets{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:10px;gap:10px;align-items:start}.home-widgets .widget{background:#202227a8;border:1px solid #ffffff09;border-radius:9px;padding:14px 15px;min-height:0;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:none}.home-widgets .widget header{gap:7px;margin-bottom:12px}.home-widgets .widget h2{font-size:12px;font-weight:500;color:#d9dce2}.home-widgets .widget .w-empty{font-size:11px;line-height:1.6;color:#90949f;margin:0}.home-widgets .w-head-meta{font-size:10px;color:#9398a4}.review-row{grid-template-columns:16px minmax(0,1fr) auto;gap:8px;padding:9px 0}.review-row .ref{grid-column:2;font-size:10px}.review-row .r-time{display:none}.review-row strong{font-size:12px;font-weight:450}.review-row .r-status{font-size:10px}.project-title{font-size:14px}.project-summary{gap:6px}.project-summary button{padding:8px 0;text-align:left;font-size:10px}.project-summary b{font-size:20px;font-weight:500}.git-total{display:flex;align-items:baseline;gap:8px}.git-total strong{font-size:26px;font-weight:500;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.git-total span{font-size:10px;color:#9298a3}.git-bars{display:flex;align-items:flex-end;height:52px;gap:4px;margin:12px 0 8px}.git-bars span{flex:1 1;height:var(--bar);min-height:3px;background:#496da9;border-radius:2px 2px 0 0}.git-bars span:last-child{background:#698fd0}.git-foot{display:flex;justify-content:space-between;gap:8px;font-size:9px;color:#9298a3;margin:0 0 10px}.git-foot code{font-size:10px;color:#bdc5d2}.sync-command{display:block;font-size:11px;color:#bfc6d1;margin-top:10px}.activity-row{display:flex;align-items:flex-start;gap:8px;width:100%;padding:9px 0;border:0;border-bottom:1px solid #ffffff07;background:transparent;color:inherit;text-align:left;cursor:pointer}.activity-row:hover{background:#ffffff04}.activity-dot{width:5px;height:5px;flex:none;margin-top:5px;border-radius:50%;background:#7c99c4}.activity-dot.fault{background:#d7a46a}.activity-dot.write{background:#63a884}.activity-row strong{display:block;font-size:11px;font-weight:500}.activity-row small{display:block;font-size:10px;color:#9096a2;overflow-wrap:anywhere;line-height:1.5;margin-top:4px}.activity-row time{margin-left:auto;white-space:nowrap;font-size:9px;color:#7c8290}.home-widget-controls{font-size:11px;background:#21242bcc;border-radius:9px;padding:12px}.home-icon-btn,.home-top-actions .home-search{background:#11172255;border-color:#c4d2f020}.home-switcher{background:#151b265e;border-color:#d1dbec18}@media(max-width:600px){body.view-home .topbar{position:relative;background:#17181c;min-height:100px}body.view-home #api-message:not(:empty){position:relative;top:auto;right:auto;margin:8px 20px;text-align:left;max-width:none}.home-hero{min-height:310px;padding:162px 20px 24px}.home-hero #home-sky{height:410px!important;background-size:auto 410px;background-position:23% top}.home-overview-title{font-size:21px}.home-body{padding:0 16px 28px}.home-body .home-action{flex-direction:row;padding:12px;gap:12px}.home-action p{display:none}.home-widgets{grid-template-columns:minmax(0,1fr)}#assistant-dock-panel,.home-widgets #widget-git,.home-widgets #widget-project,.home-widgets #widget-receipts,.home-widgets #widget-sandbox,.home-widgets #widget-services,.home-widgets #widget-working{max-height:410px}.home-assistant-bottom{bottom:auto}.home-grid-head{margin-top:0}}.home-hero #home-sky{background-image:radial-gradient(circle,#11172388 .65px,transparent .95px),var(--home-art,url(../media/moonlit-coast.bbe901a1.png));background-size:3px 3px,100% auto;background-position:top;background-repeat:repeat,no-repeat;-webkit-mask-image:linear-gradient(#000,#000 40%,#0009 61%,transparent 94%);mask-image:linear-gradient(#000,#000 40%,#0009 61%,transparent 94%)}.assistant-entry{display:flex;align-items:center;gap:8px;padding:5px 7px 5px 4px;border:1px solid #ffffff20;border-radius:32px;background:#1b1e25d9;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:0 10px 40px #080a1040}.assistant-entry #assistant-dock-toggle{flex:1 1;width:auto;min-width:0;padding:12px 14px;border:0;border-radius:28px;background:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}.home-assistant-bottom:has(#assistant-dock-panel:not([hidden])) .assistant-entry{display:none}.home-assistant-bottom .home-composer{border-radius:26px}.voice-button{display:grid;place-items:center;flex:none;width:36px;height:36px;min-height:36px;padding:8px;border-radius:50%;border:1px solid #ffffff14;background:#ffffff08;color:#c9d1df}.voice-button svg{width:18px;height:18px}.voice-button:hover{background:#ffffff14}.voice-button.recording{color:#ffb6b6;background:#662c3c;border-color:#b46777}.voice-button:disabled{opacity:.45}.composer-row .assistant-send-hint{flex:1 1;min-width:0}.composer-send{border-radius:22px}@media(max-width:600px){.home-hero #home-sky{background-size:3px 3px,auto 410px;background-position:top,23% top}.assistant-entry #assistant-dock-toggle{font-size:12px}.assistant-send-hint{font-size:10px}}.home-widgets>.widget-column{display:flex;flex-direction:column;gap:10px;min-width:0}.home-widgets>.widget-column:not(:has(>.widget:not([hidden]))){display:none}.home-widgets:has(>.widget-column:not(:has(>.widget:not([hidden])))){grid-template-columns:minmax(0,1fr)}@media(max-width:600px){.home-widgets>.widget-column{display:contents}.home-widgets #widget-project{order:0}.home-widgets #widget-receipts{order:1}.home-widgets #widget-git{order:2}.home-widgets #widget-working{order:3}.home-widgets #widget-services{order:4}.home-widgets #widget-sandbox{order:5}.home-widgets #widget-failures{order:6}body:not(.view-home):not(.view-settings) .app-nav{position:static;top:auto;height:auto;min-height:0;max-height:none}#sidebar-projects .sidebar-workflow-group{display:none}}#home-view[data-home-scene=morning]{--home-art:url(../media/bay-morning.1a9f358c.png)}#home-view[data-home-scene=afternoon]{--home-art:url(../media/golden-gate-afternoon.3e7cea58.png)}#home-view[data-home-scene=evening]{--home-art:url(../media/moonlit-coast.bbe901a1.png)}#home-sky:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,#08112470,transparent 30%,#10141c18 65%,transparent);pointer-events:none}.home-artwork-controls{display:grid;grid-gap:8px;gap:8px;grid-column:1/-1;border-bottom:1px solid #ffffff14;padding-bottom:12px;margin-bottom:8px}.home-artwork-controls label{font-size:12px;color:#d9dce2}.home-artwork-controls select{width:100%;min-width:0;font-size:12px}.home-artwork-controls p{font-size:11px;color:#9ea6b5;margin:0}.home-hero{min-height:290px;padding-top:118px;--home-art-min-height:530px}.home-grid-head #home-customize,.home-grid-head .grid-hint{color:#d3d9e2;text-shadow:0 1px 6px #000b}.home-hero #home-sky{left:0;right:0;width:100%!important;height:var(--home-art-height,530px)!important;background-size:3px 3px,cover;background-position:top,50%;-webkit-mask-image:linear-gradient(#000,#000 60%,#000b 75%,transparent);mask-image:linear-gradient(#000,#000 60%,#000b 75%,transparent)}@media(max-width:600px){.home-hero{min-height:250px;padding-top:102px;--home-art-min-height:443px}.home-hero #home-sky{background-size:3px 3px,cover;background-position:top,30%}#home-view[data-home-scene=morning] #home-sky{background-position:top,65%}#home-view[data-home-scene=evening] #home-sky{background-position:top,23%}}#history-view .submitted-jobs[hidden]{display:none}#history-view .stats{margin:20px 0;padding:16px 0}#history-view .workspace{grid-template-columns:260px minmax(0,1fr);align-items:start;overflow:hidden}#history-view .run-sidebar{padding:18px;max-height:80dvh;overflow:auto}#history-view .run-filters{display:grid;grid-gap:12px;gap:12px;margin:14px 0 20px}#history-view .run-filters label{font-size:12px;color:var(--muted);display:grid;grid-gap:6px;gap:6px}#history-view .run-filters select{width:100%;min-width:0;background:var(--surface);color:var(--ink);padding:9px;border:1px solid var(--line);border-radius:8px}#history-view .run-row{width:100%;text-align:left;padding:13px 10px;margin:0 0 8px}#history-view .row-top{display:flex;justify-content:space-between;gap:8px;font-size:11px;color:var(--muted)}#history-view .run-row strong{display:block;font-size:13px;margin-top:8px;overflow-wrap:anywhere}#history-view .run-row .sub{line-height:1.7;margin-bottom:0}#history-view .detail{min-width:0;padding:26px}#history-view .detail-title{align-items:start;gap:14px}#history-view .detail-title h2{font-size:21px;overflow-wrap:anywhere}#history-view .result-banner{margin:20px 0;padding:18px}#history-view .result-banner strong{font-size:16px}#history-view .result-banner p{line-height:1.7;max-width:70ch}#history-view .tabs{overflow-x:auto;gap:22px;white-space:nowrap}#history-view .tabs button{min-height:44px}#history-view .run-context .facts{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}#history-view .fact dd{overflow-wrap:anywhere;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}#history-view .outcome-checks{padding:0;list-style:none;margin:14px 0}#history-view .outcome-check{padding:16px 0;border-bottom:1px solid var(--line)}#history-view .outcome-check>div{display:flex;align-items:start;gap:12px}#history-view .outcome-check strong{font-size:13px;font-weight:500;overflow-wrap:anywhere}#history-view .outcome-check p{font-size:13px;color:var(--muted);margin:8px 0;overflow-wrap:anywhere}#history-view .outcome-check code{color:var(--ink);white-space:pre-wrap}#history-view .agent-handoff{background:var(--soft);border:1px solid var(--line);border-radius:12px}#history-view .agent-handoff details{margin-top:16px}#history-view pre{max-height:420px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}#history-view .timeline{padding-left:0}#history-view .timeline p{overflow-wrap:anywhere;line-height:1.7}#history-view .comparison-warning{line-height:1.7}@media(max-width:900px){#history-view .workspace{grid-template-columns:220px minmax(0,1fr)}#history-view .detail{padding:20px}}@media(max-width:700px){#history-view .workspace{grid-template-columns:1fr}#history-view .run-sidebar{max-height:380px}#history-view .run-filters{grid-template-columns:1fr 1fr}#history-view .detail{padding:18px}#history-view .run-context .facts{grid-template-columns:1fr}#history-view .detail-title{flex-wrap:wrap}#history-view .tabs{gap:18px}}#history-view.has-results .stats{display:grid}#history-view .run-sidebar{display:block}#history-view .section{padding:0;margin:22px 0;min-height:0}#history-view .agent-handoff{padding:20px}#history-view .tab-panel{padding-top:6px}#history-view .section-title{font-size:inherit;letter-spacing:normal}#history-view .facts{margin-top:8px}#history-view .run-test-name{font-size:11px;color:var(--muted);margin:4px 0;overflow-wrap:anywhere}#history-view .workflow-test-history{display:grid;grid-gap:8px;gap:8px;margin:14px 0 22px}#history-view .workflow-test-history button{text-align:left;display:grid;grid-template-columns:1fr auto;grid-gap:4px 14px;gap:4px 14px;background:var(--surface);padding:12px}#history-view .workflow-test-history button>span:first-child{font-size:11px;color:var(--muted)}#history-view .workflow-test-history button strong{font-size:12px;font-weight:500;grid-column:1;overflow-wrap:anywhere}#history-view .workflow-test-history button .status{grid-column:2;grid-row:1/3;align-self:center}#history-view .workflow-test-history small{grid-column:1/-1;color:var(--muted)}#history-view .workflow-test-history button[aria-pressed=true]{border-color:var(--accent)}#history-view .baseline-label{display:grid;grid-gap:8px;gap:8px;margin:18px 0}#history-view .mobile-run-picker{display:none}@media(max-width:700px){#history-view .stats{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}#history-view .stat{border:0;padding:0}#history-view .stat strong{font-size:23px}#history-view .stat p{font-size:10px}#history-view .run-filters{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0}#history-view .run-filters select{font-size:11px;padding:8px 4px}#history-view .mobile-run-picker{display:grid;grid-gap:6px;gap:6px;font-size:12px;color:var(--muted)}#history-view .mobile-run-picker select{width:100%;min-width:0;padding:9px;background:var(--surface)}#history-view #runs{display:none}#history-view .run-sidebar{max-height:none}}#history-view #message{color:var(--muted);line-height:1.7;max-width:75ch}#configure-view .workflow-library{padding:0;border:0;background:transparent}.workflow-state-filters{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));grid-gap:.6rem;gap:.6rem}.workflow-state-filters button{display:flex;flex-direction:column;align-items:flex-start;gap:.4rem;padding:1rem;text-align:left}.workflow-state-filters b{font-size:1.5rem;font-weight:600}.workflow-state-filters span{color:var(--muted);font-size:.8rem}.workflow-state-filters [aria-pressed=true]{border-color:#7889bd;background:rgba(94,116,170,.14)}.workflow-toolbar{display:flex;align-items:flex-end;flex-wrap:wrap;gap:1rem;margin:1.5rem 0}.workflow-toolbar label{display:grid;grid-gap:.5rem;gap:.5rem;font-size:.8rem}.workflow-toolbar .workflow-search{flex:1 1;margin:0}.workflow-toolbar input,.workflow-toolbar select{width:100%;min-height:2.7rem}.workflow-toolbar>span{padding-bottom:.75rem;color:var(--muted);font-size:.8rem}#workflow-candidates{display:grid;grid-gap:.8rem;gap:.8rem}#configure-view .workflow-card{padding:1.2rem;border:1px solid var(--border);border-radius:12px;background:rgba(255,255,255,.025);display:block}.workflow-card-heading{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.5rem;margin-bottom:.7rem}.workflow-category{font-size:.75rem;color:var(--muted)}.workflow-evidence-status{font-size:.75rem;border-radius:99px;padding:.25rem .6rem;background:rgba(255,255,255,.05)}.workflow-evidence-status.attention{color:#efba8d}.workflow-evidence-status.passed{color:#a3d8b5}.workflow-evidence-status.retest{color:#c5c5ef}.workflow-facts{display:grid;grid-template-columns:1fr 1.5fr;grid-gap:1rem;gap:1rem;margin:1rem 0}.workflow-facts dt{color:var(--muted);font-size:.75rem;margin-bottom:.3rem}.workflow-facts dd{margin:0;font-size:.85rem;line-height:1.6}.workflow-card details{font-size:.8rem}.workflow-card details button{margin:.5rem .5rem 0 0}.workflow-card .actions{margin-top:1rem}#candidate-preparation pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:22rem;overflow:auto}.workflow-empty{padding:2rem;border:1px solid var(--border);border-radius:12px}@media(max-width:600px){.workflow-state-filters{grid-template-columns:repeat(2,minmax(0,1fr))}.workflow-state-filters button:first-child{grid-column:1/-1;flex-direction:row;align-items:center}.workflow-facts{grid-template-columns:1fr}.workflow-toolbar .workflow-search{flex-basis:100%}.workflow-card .actions button{flex:1 1}}#configure-view .bundle-upload>summary{cursor:pointer;font-weight:500}#configure-view .bundle-upload[open]>summary{margin-bottom:1.5rem}
@@ -1 +1 @@
1
- <!DOCTYPE html><!--It81cabE0Vc_SUEO_z8CQ--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="assets/logo/mark-twin-rings.svg"/><link rel="preload" as="image" href="assets/icons/ui/stack-simple.svg"/><link rel="preload" as="image" href="assets/icons/ui/git-branch.svg"/><link rel="preload" as="image" href="assets/icons/ui/clock.svg"/><link rel="preload" as="image" href="assets/icons/ui/plugs-connected.svg"/><link rel="stylesheet" href="assets/next/static/css/1323d7da89b3fa5e.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/45513ebc8c6ae800.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/62e3209163fa5e55.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="assets/next/static/chunks/webpack-330c9b9dd99c0d55.js"/><script src="assets/next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="assets/next/static/chunks/255-09fb0d129bb12f51.js" async=""></script><script src="assets/next/static/chunks/main-app-99295a8cc37e8a47.js" async=""></script><script src="assets/next/static/chunks/772-85561381eedc95da.js" async=""></script><script src="assets/next/static/chunks/app/dashboard/page-9b4372b1e47bc3bc.js" async=""></script><meta name="theme-color" content="#090909"/><link rel="icon" type="image/svg+xml" href="assets/logo/favicon.svg?v=white-rings"/><link rel="preload" href="assets/fonts/syne-400.ttf" as="font" type="font/ttf" crossorigin="anonymous"/><meta name="agenttwin-api-url" content="https://agenttwin-api.212.56.40.125.sslip.io"/><title>Workspace | AgentTwin</title><meta name="description" content="Discover your project, test workflows and inspect recorded results."/><script src="assets/next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><a class="skip" href="#main">Skip to content</a><div class="app-frame"><p class="announce-strip"><span class="record-dot"></span>AgentTwin / workflow testing</p><header class="topbar"><a class="brand" href="#home" aria-label="AgentTwin home"><img src="assets/logo/mark-twin-rings.svg" width="23" height="23" alt=""/>AgentTwin</a><button id="sidebar-toggle" class="sidebar-toggle" type="button" aria-label="Toggle sidebar" aria-expanded="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="3"></rect><path d="M9 4v16"></path></svg></button><nav class="home-switcher" aria-label="Switch view"><button type="button" data-view="home" class="active" aria-current="page"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="m3 10.5 9-7.5 9 7.5"></path><path d="M5.5 9v10.5h13V9"></path></svg>Home<span class="pill-count" id="home-badge" hidden="">0</span></button><button type="button" data-view="environment"><img src="assets/icons/ui/stack-simple.svg" alt=""/>Environment</button><button type="button" data-view="configure"><img src="assets/icons/ui/git-branch.svg" alt=""/>Workflows</button><button type="button" data-view="history"><img src="assets/icons/ui/clock.svg" alt=""/>Runs</button><button type="button" data-view="settings"><img src="assets/icons/ui/stack-simple.svg" alt=""/>Settings</button></nav><div class="home-top-actions"><button type="button" id="home-search" class="home-search" aria-label="Search"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><circle cx="11" cy="11" r="6.5"></circle><path d="m16 16 4.5 4.5"></path></svg><span class="hs-label">Search</span><kbd>⌘K</kbd></button><div class="home-bell-wrap"><button type="button" id="home-bell" class="home-icon-btn" aria-label="Notifications" aria-haspopup="true" aria-expanded="false" aria-controls="home-bell-menu"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M18 9a6 6 0 1 0-12 0c0 6-2 7-2 7h16s-2-1-2-7"></path><path d="M10 20a2.2 2.2 0 0 0 4 0"></path></svg><span class="bell-badge" id="bell-badge" hidden="">0</span></button><div id="home-bell-menu" class="home-menu bell-menu" hidden=""><p class="menu-label">Notifications</p><div id="bell-items"></div></div></div><button type="button" id="home-expand" class="home-icon-btn" aria-label="Toggle full screen"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M9 3H3v6M15 3h6v6M9 21H3v-6M15 21h6v-6"></path></svg></button></div><div class="workspace-name"><span id="workspace-label">Workspace</span><span class="workspace-divider">/</span><span id="current-view">Environment</span></div><div class="account-control"><button type="button" id="account-toggle" class="workspace-avatar" aria-label="Open account menu" aria-expanded="false" aria-controls="account-menu">AT</button><div id="account-menu" class="account-menu" hidden=""><p class="menu-label">Workspace</p><strong id="account-workspace">My workspace</strong><p id="account-user-name">Your name not set</p><p id="account-menu-status" class="muted">Not connected</p><button type="button" data-action="settings">Account &amp; settings</button><button type="button" data-action="history">View runs</button><button type="button" id="account-disconnect" disabled="">Disconnect account</button></div></div></header><div class="app-layout"><nav class="project-tabs app-nav" aria-label="Project views"><div class="sidebar-primary"><button id="sidebar-discover" class="sidebar-create" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M12 5v14M5 12h14"></path></svg>Connect project</button></div><div id="sidebar-projects" aria-label="Your repositories"></div><div class="sidebar-bottom"><a class="nav-item" href="https://agenttwin.si/docs/"><svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M12 5v15M12 5C9 3 5 3 2 4v15c3-1 7-1 10 1M12 5c3-2 7-2 10-1v15c-3-1-7-1-10 1"></path></svg>Documentation<span class="nav-external" aria-hidden="true">↗</span></a></div></nav><main id="main"><p id="api-message" class="coverage" role="status" aria-live="polite"></p><section id="home-view" hidden="" aria-label="Agent home"><div class="home-hero"><div id="home-sky" aria-hidden="true"></div><h1 class="home-overview-title">What should your agent test?</h1><section class="home-assistant-bottom" aria-label="Workflow assistant"><div class="assistant-entry"><button type="button" id="assistant-dock-toggle" aria-expanded="false" aria-controls="assistant-dock-panel">Ask about a workflow or test result <span aria-hidden="true">↑</span></button><button type="button" id="assistant-voice-entry" class="voice-button" aria-label="Dictate a message" title="Dictate a message"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><rect x="9" y="3" width="6" height="12" rx="3"></rect><path d="M5 10v2a7 7 0 0 0 14 0v-2M12 19v3M8 22h8"></path></svg></button></div><div class="hero-content" id="assistant-dock-panel" hidden=""><button type="button" id="assistant-dock-close" aria-label="Minimize workflow assistant">Minimize ↓</button><div class="home-composer" role="form" aria-label="Workflow assistant"><div class="assistant-heading"><strong>Ask AgentTwin</strong><span id="assistant-project-context"></span></div><p id="assistant-connection-status" role="status"></p><button type="button" id="assistant-connect">Connect your account</button><label class="visually-hidden" for="composer-input">Ask about your workflow</label><textarea id="composer-input" rows="3" placeholder="What would you like to test?" spellCheck="false"></textarea><div class="composer-row"><span class="assistant-send-hint">Ask about your workflows or run results</span><button type="button" id="composer-voice" class="voice-button" aria-label="Dictate a message" title="Dictate a message"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><rect x="9" y="3" width="6" height="12" rx="3"></rect><path d="M5 10v2a7 7 0 0 0 14 0v-2M12 19v3M8 22h8"></path></svg></button><button type="button" class="composer-send" id="composer-send" aria-label="Send message">Send ↑</button></div><div id="chat-thread" class="chat-thread" aria-label="Workflow conversation" hidden=""></div><p id="composer-note" class="composer-note" role="status"></p></div></div></section></div><div class="home-body"><section id="home-next-step" class="next-step home-action" aria-label="Next step"></section><div class="home-grid-head"><span class="grid-hint">Your workspace</span><button type="button" id="home-customize" aria-pressed="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><rect x="4" y="4" width="6.5" height="6.5" rx="1.5"></rect><rect x="13.5" y="4" width="6.5" height="6.5" rx="1.5"></rect><rect x="4" y="13.5" width="6.5" height="6.5" rx="1.5"></rect><rect x="13.5" y="13.5" width="6.5" height="6.5" rx="1.5"></rect></svg>Customize</button></div><div id="home-widget-controls" class="home-widget-controls" hidden=""></div><div class="home-widgets"><div class="widget-column"><article class="widget area-project" id="widget-project"><header><h2>Project discovery</h2></header><div class="w-body" id="project-body"></div></article><article class="widget area-git" id="widget-git"><header><h2>Git activity</h2><span id="git-meta" class="w-head-meta"></span></header><div class="w-body" id="git-body"></div></article><article class="widget area-working" id="widget-working"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M6 3v12a3 3 0 0 0 3 3h9"></path><path d="M6 3 3 6m3-3 3 3"></path><path d="m15 15 3 3 3-3"></path></svg></span><h2>Working now</h2><span class="w-count" id="working-count"></span><span class="w-head-meta" id="working-meta"></span></header><div class="w-body" id="working-body"></div></article><article class="widget area-sandbox" id="widget-sandbox"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="3" y="5" width="18" height="14" rx="3"></rect><path d="M3 10h18M8 5v5"></path></svg></span><h2>Last execution</h2><span class="w-head-meta" id="sandbox-meta"></span></header><div class="w-body" id="sandbox-body"></div></article></div><div class="widget-column"><article class="widget area-receipts" id="widget-receipts"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M6 3h9l4 4v14H6Z"></path><path d="M15 3v4h4"></path><path d="M9 12h7M9 16h7"></path></svg></span><h2>Test results</h2><span class="w-count warn" id="receipts-count"></span><span class="w-head-spin" id="receipts-spin" hidden=""><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="spin"><path d="M12 3a9 9 0 1 0 9 9" stroke-linecap="round"></path></svg></span></header><div class="w-body" id="receipts-body"></div></article><article class="widget area-services" id="widget-services"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="9"></circle><circle cx="12" cy="12" r="2.5"></circle><path d="M5.5 5.5 10 10m4 4 4.5 4.5M18.5 5.5 14 10m-4 4-4.5 4.5"></path></svg></span><h2>Observed activities</h2></header><div class="w-body" id="services-body"></div></article><article class="widget area-failures" id="widget-failures"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="9"></circle><path d="m9 9 6 6M15 9l-6 6"></path></svg></span><h2>Needs attention</h2><span class="w-head-meta" id="failures-meta"></span></header><div class="w-body" id="failures-body"></div></article></div></div></div></section><section id="environment-view"><div class="heading"><div><p class="eyebrow">Project / environment</p><h1 id="environment-title">A test world for your agent.</h1><p id="environment-subtitle" class="muted">Discover your project. Test what your agent does before it touches production.</p></div><div class="actions"><label class="upload">Import discovery<input id="inventory-import" type="file" accept="application/json,.json"/></label><button id="configure-run" class="primary" type="button">Review workflows →</button></div></div><div class="discovery-onboarding"><aside class="terminal-panel"><div class="terminal-title"><h2>Connect your project</h2><span>From your terminal</span></div><div class="terminal-content"><div class="terminal-command"><span class="command-prompt" aria-hidden="true">❯</span><code>npx agenttwin init</code><button id="copy-init" type="button" aria-label="Copy discovery command">Copy command <span aria-hidden="true">↗</span></button></div><p class="terminal-comment">Run in your repository · Node.js 22.12+</p><div class="terminal-output" id="terminal-output"></div><details class="discovery-help"><summary>Analyze with a coding agent</summary><p>Init offers OpenCode when installed. To launch it directly, run <code>npx agenttwin init --agent opencode</code>. Other agents can use the generated <code>AGENT-TASK.md</code>.</p></details><details class="discovery-help"><summary>Send findings to this workspace</summary><p>Connect your account in Settings, configure <code>AGENTTWIN_TOKEN</code> in your terminal, then run <code>npx agenttwin sync</code>. This sends discovery metadata. Application files upload separately when you execute a reviewed bundle.</p><button type="button" data-action="settings">Open connection settings →</button></details></div></aside><section class="workflow-area"><div class="section-title"><h2 id="discovery-workflows-title">Discovery</h2><button id="discovery-workflows-link" type="button" data-action="configure">View workflows →</button></div><div id="environment-workflows"></div></section></div><div class="welcome-next"><ol class="welcome-steps"><li><span>01</span><div><strong>Discover</strong><p>Find tools and code paths.</p></div></li><li><span>02</span><div><strong>Review</strong><p>Choose what needs testing.</p></div></li><li><span>03</span><div><strong>Run safely</strong><p>Test through the CLI.</p></div></li></ol><button id="welcome-select-software" type="button">Or select your tools manually <span aria-hidden="true">→</span></button></div><div id="environment-coverage" class="coverage-strip"></div><div class="environment-grid"><section class="discovery-area"><div class="section-title"><h2>Selected resources</h2><div class="actions"><button id="add-app-toggle" type="button">Add custom software</button><button id="select-software" type="button">Select software</button></div></div><p id="inventory-context" class="coverage">No project connected. Import the inventory from your CLI to see its dependencies and workflow candidates.</p><form id="add-app" class="app-declaration" hidden=""><label>App or tool name<input id="app-name" required="" maxLength="80" placeholder="For example, Apple Mail"/></label><label>How the agent uses it<select id="app-interface"><option value="desktop">Desktop interface · no API required</option><option value="browser">Browser interface</option><option value="api">API / connector</option><option value="terminal">Terminal / command line</option></select></label><button type="submit">Add to environment</button></form><section class="topology-panel"><header class="topology-heading"><h3>Environment map</h3><span id="resource-count">0 resources</span><div class="map-controls"><button id="map-zoom-out" type="button" aria-label="Zoom out">−</button><span id="map-zoom-label">100%</span><button id="map-zoom-in" type="button" aria-label="Zoom in">+</button><button id="map-fit" type="button">Reset view</button><button id="map-arrange" type="button">Arrange</button></div></header><div class="map-workspace"><div id="map-canvas" class="topology-canvas" tabindex="0" aria-label="Environment map. Drag empty space to pan; drag cards to move them. Use arrow keys to pan."><p id="topology-label" class="topology-label">Selected resources</p><div id="map-scroll-space" class="map-scroll-space"><div id="map-stage" class="map-stage"><svg id="map-edges" class="map-edges" aria-hidden="true"></svg><div id="environment-project" class="environment-project" data-node="project" tabindex="0" aria-label="Move project card"></div><div id="environment-tools" class="resource-grid"></div></div></div><div id="map-empty" class="map-empty"><img src="assets/icons/ui/plugs-connected.svg" width="26" height="26" alt=""/><h3>No resources selected</h3><p>Run init in your project, then import .agenttwin/inventory.json. You can also declare a resource manually.</p><button id="map-select-tools" type="button">Browse resource catalog</button></div><span class="map-hint">Drag to pan · drag cards to arrange</span></div><aside class="map-resource-rail"><label>Selected resources <span id="map-list-count"></span><input id="map-resource-search" type="search" placeholder="Find a selected tool"/></label><div id="map-resource-list"></div><div id="map-resource-detail"><p>Select a resource to inspect coverage.</p></div></aside></div><div class="map-pagination"><span id="map-page-label"></span><span>Scroll to explore · select a name to locate its card</span></div></section><p id="environment-message" role="status" aria-live="polite"></p><div id="removed-resource" class="removal-notice" role="status" hidden=""><span id="removed-resource-message"></span><button id="undo-remove-resource" type="button">Undo</button></div></section></div><details class="catalog-drawer"><summary>Select software <span>choose what your workflow uses</span></summary><div class="catalog-body"><div id="catalog-slot"><div class="connector-toolbar"><label>Find a connector<input id="connector-search" type="search" placeholder="Search services"/></label><button id="select-connectors" type="button">Select all</button><button id="clear-connectors" type="button">Clear selection</button></div><p id="connector-status" role="status" aria-live="polite"></p><div id="connector-catalog" class="connector-catalog"></div><button id="export-connectors" type="button">Export selection ↓</button></div></div></details><details class="coverage-note"><summary>Runtime coverage</summary><p>Node workflows with custom HTTP collections and bounded Slack operations run through the CLI. PostgreSQL and Redis worlds can use an explicitly selected cloud runner. Other provider adapters and browser/desktop execution require implementation. Native macOS apps need a compatible macOS runtime. Production accounts are not copied.</p></details></section><section id="configure-view" hidden=""><div class="heading"><div><p class="eyebrow">Project / workflows</p><h1 id="workflows-title">Workflows</h1><p id="workflows-subtitle" class="muted">Choose a code path. Define the world it runs in. Check the outcome.</p></div></div><div id="workflow-workspace"></div><details class="workflow-register advanced-workflows"><summary>Advanced: saved configurations and failure scenarios</summary><section id="saved-workflows"><div class="section-title"><h2>Saved configurations</h2><button type="button" id="workflow-refresh">Refresh</button></div><p class="coverage">Manage the starting state, fault conditions and expected outcomes for your workflows.</p><div id="workflow-saved-list"></div><details id="workflow-editor"><summary>Edit configuration</summary><label for="workflow-spec">agenttwin.world.json</label><textarea id="workflow-spec" rows="14" spellCheck="false" placeholder="Paste your world configuration or import a reviewed bundle above."></textarea><fieldset class="fault-controls"><legend>Failure scenario</legend><p class="coverage">Edit a draft, then rebuild and review its bundle before execution. Uploaded bundles keep their verified configuration.</p><label>Condition<select id="workflow-fault-type"><option value="none">Healthy execution — no injected fault</option><option value="timeout-after-write">Timeout after write</option></select></label><label>Target operation<select id="workflow-fault-target"><option value="">Load a configuration first</option></select></label><label>Response delay (milliseconds)<input id="workflow-fault-delay" type="number" min="1" max="10000" value="1200"/></label><button type="button" id="workflow-apply-fault">Apply to draft</button><p class="coverage">Timeout after write commits a write, then delays its response. Test whether retries duplicate actions. Runs report whether the fault actually activated. Other fault types are not implemented.</p></fieldset><div class="actions"><button type="button" id="workflow-save">Save draft</button><button type="button" id="workflow-new">New draft</button><button type="button" id="workflow-export">Download world configuration</button></div></details><p id="workflow-save-status" class="coverage" role="status"></p></section></details><section class="setup-card bundle-upload"><div class="section-title"><h2>Optional cloud execution</h2><label class="upload">Upload prepared workflow<input id="bundle-import" type="file" accept="application/json,.json"/></label></div><p class="setup-note">Upload the file prepared by your coding agent. AgentTwin checks the files and configuration before you run.</p><p id="workflow-connection" class="connection-note">Connect your account in Settings before executing. <button type="button" data-action="settings">Open settings →</button></p><div id="bundle-review"><p class="coverage">Select a prepared workflow bundle to review its files and configuration.</p></div><label class="bundle-consent"><input id="bundle-consent" type="checkbox"/>I reviewed these application files, fixture data and operation mappings for upload.</label><button id="submit-hosted-run" class="primary" type="button" disabled="">Run in cloud →</button></section><details class="coverage-note"><summary>Runtime coverage</summary><p>Node workflows with custom HTTP collections and bounded Slack operations run through the CLI. PostgreSQL and Redis worlds can use an explicitly selected cloud runner. Other provider adapters and browser/desktop execution require implementation. Native macOS apps need a compatible macOS runtime. Production accounts are not copied.</p></details></section><section id="settings-view" hidden=""><div class="heading"><div><h1>Settings</h1><p class="muted">Your workspace, account connection and dashboard preferences.</p></div></div><form id="workspace-preferences" class="settings-section"><div class="settings-section-heading"><h2>Workspace</h2><p>Preferences are saved in this browser. They do not change other team members’ settings.</p></div><div class="setting-row"><div><label for="workspace-display-name">Company or workspace name</label><p>Shown alongside your name in the account menu.</p></div><input id="workspace-display-name" type="text" maxLength="40" required="" autoComplete="off" value="My workspace"/></div><div class="setting-row"><div><label for="workspace-user-name">Your name</label><p>Shown in your account menu on this browser.</p></div><input id="workspace-user-name" type="text" maxLength="60" autoComplete="name"/></div><div class="settings-section-heading"><h2>Project preferences</h2><p>Guidance for new preparation tasks. Each reviewed workflow keeps its own execution limit.</p></div><div class="setting-row"><div><label for="default-run-timeout">Default execution limit</label><p>Suggested duration in the task sent to your coding agent.</p></div><div class="setting-unit"><input id="default-run-timeout" type="number" min="1" max="300" step="1" required="" value="20"/><span>seconds</span></div></div><div class="setting-row"><div><label for="receipt-load-limit">Results loaded per refresh</label><p>Limit receipt requests for large workspaces. The API lists the latest 100 jobs; unloaded receipts are fetched on subsequent refreshes.</p></div><input id="receipt-load-limit" type="number" min="1" max="100" required="" value="25"/></div><div class="settings-section-heading"><h2>Dashboard</h2></div><div class="setting-row"><div><label for="auto-refresh">Refresh automatically</label><p>Keep discovery and active run status up to date while this tab is visible. Manual refresh stays available.</p></div><input id="auto-refresh" type="checkbox" role="switch" checked=""/></div><div class="setting-row"><div><label for="compact-density">Compact lists</label><p>Fit more workflows and recorded runs on screen.</p></div><input id="compact-density" type="checkbox" role="switch"/></div><div class="setting-row"><div><label for="reduce-motion">Reduce motion</label><p>Disable transitions and smooth scrolling. Your system preference is also respected.</p></div><input id="reduce-motion" type="checkbox" role="switch"/></div><div class="settings-save"><p id="preferences-message" role="status" aria-live="polite">No unsaved changes.</p><button type="button" id="reset-preferences">Reset defaults</button><button type="submit" class="primary">Save preferences</button></div></form><form id="api-connect" class="settings-section api-connect setup-card"><div class="settings-section-heading"><h2>Account connection</h2><p>Connect to sync project discovery, submit workflows and retrieve evidence.</p></div><p id="account-connection-status" class="connection-status">Not connected</p><label for="api-url">AgentTwin API URL</label><input id="api-url" type="url" required="" placeholder="https://your-agenttwin-api.example"/><label for="api-token">Account token</label><div class="token-input"><input id="api-token" type="password" required="" autoComplete="off" placeholder="at_user_…"/><button id="toggle-token" type="button" aria-label="Show account token" aria-pressed="false">Show</button></div><div class="actions"><button type="submit" class="primary">Connect account</button><button type="button" id="api-sync-settings" disabled="">Refresh workspace</button><button type="button" id="api-disconnect" disabled="">Disconnect</button></div><p class="setup-note">Your token stays in memory for this tab and is cleared on disconnect or reload. It is never saved with your preferences.</p></form><section class="settings-section"><h2>Execution</h2><p>Test supported Node workflows with <code>npx agenttwin run</code> in your repository. Service twins start in-process; no containers or VM are required.</p><p>Choose <code>--runtime hosted</code> or <code>--runtime e2b</code> when the workflow needs a cloud machine. PostgreSQL and Redis currently require that runner. CLI execution uses your computer and is not an isolation boundary.</p><p>Run <code>npx agenttwin sync</code> to send discovery, Git metadata and CLI test evidence to this workspace. Review recorded output and fixtures before syncing.</p></section><section class="settings-section"><h2>Workflow assistant</h2><p id="settings-chat-status" role="status">Connect your account to check model availability.</p><p class="setup-note">The API operator configures the model. Provider credentials stay on the server. Messages, synced metadata, saved contracts and selected run evidence are sent to the configured model. Chat explains your project and results; it does not execute code. Source analysis requires a separate upload.</p></section><section class="settings-section settings-about"><h2>About this workspace</h2><dl><div><dt>Execution</dt><dd>CLI by default; cloud when required</dd></div><div><dt>Starting state</dt><dd>Reviewed fixtures and new test identities</dd></div><div><dt>Project sync</dt><dd>Discovery metadata; application files upload only with a reviewed bundle</dd></div></dl><a href="https://agenttwin.si/docs/">Read the documentation ↗</a></section></section><section id="history-view" hidden=""><div class="heading"><div><p class="eyebrow">Project / runs</p><h1 id="runs-title">Runs</h1><p id="runs-subtitle" class="muted">Activities, test outcomes and Git revisions from CLI and cloud runs.</p></div><div class="actions"><button id="reload" type="button">Refresh evidence</button><label class="primary upload">Import run.json<input id="import" type="file" accept="application/json,.json" multiple=""/></label></div></div><section class="workflow-register submitted-jobs"><div class="section-title"><h2>All runs</h2><button id="refresh-api-jobs" type="button" disabled="">Refresh</button></div><div id="api-jobs"><p class="coverage">Connect your account in Settings to load submitted runs.</p></div></section><p id="message" role="status" aria-live="polite"></p><section class="stats" id="stats" aria-label="Run summary"></section><div class="workspace"><aside class="run-sidebar"><div class="list-heading"><h2>Inspected results</h2><span id="run-count"></span></div><label class="search-label">Filter runs<input id="search" type="search" placeholder="Search workflow or run ID"/></label><div id="runs" aria-label="Select a run"><p class="muted">Loading run evidence…</p></div></aside><article id="detail" class="detail" aria-live="polite"><div class="empty"><h2>Loading evidence</h2><p>Fetching recorded test results.</p></div></article></div></section></main></div></div><!--$--><!--/$--><script src="assets/next/static/chunks/webpack-330c9b9dd99c0d55.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[2966,[\"772\",\"static/chunks/772-85561381eedc95da.js\",\"105\",\"static/chunks/app/dashboard/page-9b4372b1e47bc3bc.js\"],\"default\"]\n5:I[4431,[],\"OutletBoundary\"]\n7:I[5278,[],\"AsyncMetadataOutlet\"]\n9:I[4431,[],\"ViewportBoundary\"]\nb:I[4431,[],\"MetadataBoundary\"]\nc:\"$Sreact.suspense\"\ne:I[7150,[],\"\"]\n:HL[\"assets/next/static/css/1323d7da89b3fa5e.css\",\"style\"]\n:HL[\"assets/next/static/css/45513ebc8c6ae800.css\",\"style\"]\n:HL[\"assets/next/static/css/62e3209163fa5e55.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"It81cabE0Vc-SUEO_z8CQ\",\"p\":\"\",\"c\":[\"\",\"dashboard\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"dashboard\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/1323d7da89b3fa5e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"meta\",null,{\"name\":\"theme-color\",\"content\":\"#090909\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"type\":\"image/svg+xml\",\"href\":\"assets/logo/favicon.svg?v=white-rings\"}],[\"$\",\"link\",null,{\"rel\":\"preload\",\"href\":\"assets/fonts/syne-400.ttf\",\"as\":\"font\",\"type\":\"font/ttf\",\"crossOrigin\":\"anonymous\"}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"dashboard\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/45513ebc8c6ae800.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/62e3209163fa5e55.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[[\"$\",\"meta\",null,{\"name\":\"agenttwin-api-url\",\"content\":\"https://agenttwin-api.212.56.40.125.sslip.io\"}],[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L4\",null,{}],null,[\"$\",\"$L5\",null,{\"children\":[\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],null],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"fallback\":null,\"children\":\"$Ld\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\n"])</script><script>self.__next_f.push([1,"8:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Workspace | AgentTwin\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Discover your project, test workflows and inspect recorded results.\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"d:\"$8:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--HZwGKKvvx_oO6caYggjFh--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="assets/logo/mark-twin-rings.svg"/><link rel="preload" as="image" href="assets/icons/ui/stack-simple.svg"/><link rel="preload" as="image" href="assets/icons/ui/git-branch.svg"/><link rel="preload" as="image" href="assets/icons/ui/clock.svg"/><link rel="preload" as="image" href="assets/icons/ui/plugs-connected.svg"/><link rel="stylesheet" href="assets/next/static/css/1323d7da89b3fa5e.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/45513ebc8c6ae800.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/96e4f356a1159071.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="assets/next/static/chunks/webpack-f3b6dd27998e84ce.js"/><script src="assets/next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="assets/next/static/chunks/255-09fb0d129bb12f51.js" async=""></script><script src="assets/next/static/chunks/main-app-99295a8cc37e8a47.js" async=""></script><script src="assets/next/static/chunks/772-85561381eedc95da.js" async=""></script><script src="assets/next/static/chunks/app/dashboard/page-b79ed135f6bac5f7.js" async=""></script><meta name="theme-color" content="#090909"/><link rel="icon" type="image/svg+xml" href="assets/logo/favicon.svg?v=white-rings"/><link rel="preload" href="assets/fonts/syne-400.ttf" as="font" type="font/ttf" crossorigin="anonymous"/><meta name="agenttwin-api-url" content="https://agenttwin-api.212.56.40.125.sslip.io"/><title>Workspace | AgentTwin</title><meta name="description" content="Discover your project, test workflows and inspect recorded results."/><script src="assets/next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><a class="skip" href="#main">Skip to content</a><div class="app-frame"><p class="announce-strip"><span class="record-dot"></span>AgentTwin / workflow testing</p><header class="topbar"><a class="brand" href="#home" aria-label="AgentTwin home"><img src="assets/logo/mark-twin-rings.svg" width="23" height="23" alt=""/>AgentTwin</a><button id="sidebar-toggle" class="sidebar-toggle" type="button" aria-label="Toggle sidebar" aria-expanded="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="3"></rect><path d="M9 4v16"></path></svg></button><nav class="home-switcher" aria-label="Switch view"><button type="button" data-view="home" class="active" aria-current="page"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="m3 10.5 9-7.5 9 7.5"></path><path d="M5.5 9v10.5h13V9"></path></svg>Home<span class="pill-count" id="home-badge" hidden="">0</span></button><button type="button" data-view="environment"><img src="assets/icons/ui/stack-simple.svg" alt=""/>Environment</button><button type="button" data-view="configure"><img src="assets/icons/ui/git-branch.svg" alt=""/>Workflows</button><button type="button" data-view="history"><img src="assets/icons/ui/clock.svg" alt=""/>Runs</button><button type="button" data-view="settings"><img src="assets/icons/ui/stack-simple.svg" alt=""/>Settings</button></nav><div class="home-top-actions"><button type="button" id="home-search" class="home-search" aria-label="Search"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><circle cx="11" cy="11" r="6.5"></circle><path d="m16 16 4.5 4.5"></path></svg><span class="hs-label">Search</span><kbd>⌘K</kbd></button><div class="home-bell-wrap"><button type="button" id="home-bell" class="home-icon-btn" aria-label="Notifications" aria-haspopup="true" aria-expanded="false" aria-controls="home-bell-menu"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M18 9a6 6 0 1 0-12 0c0 6-2 7-2 7h16s-2-1-2-7"></path><path d="M10 20a2.2 2.2 0 0 0 4 0"></path></svg><span class="bell-badge" id="bell-badge" hidden="">0</span></button><div id="home-bell-menu" class="home-menu bell-menu" hidden=""><p class="menu-label">Notifications</p><div id="bell-items"></div></div></div><button type="button" id="home-expand" class="home-icon-btn" aria-label="Toggle full screen"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M9 3H3v6M15 3h6v6M9 21H3v-6M15 21h6v-6"></path></svg></button></div><div class="workspace-name"><span id="workspace-label">Workspace</span><span class="workspace-divider">/</span><span id="current-view">Environment</span></div><div class="account-control"><button type="button" id="account-toggle" class="workspace-avatar" aria-label="Open account menu" aria-expanded="false" aria-controls="account-menu">AT</button><div id="account-menu" class="account-menu" hidden=""><p class="menu-label">Workspace</p><strong id="account-workspace">My workspace</strong><p id="account-user-name">Your name not set</p><p id="account-menu-status" class="muted">Not connected</p><button type="button" data-action="settings">Account &amp; settings</button><button type="button" data-action="history">View runs</button><button type="button" id="account-disconnect" disabled="">Disconnect account</button></div></div></header><div class="app-layout"><nav class="project-tabs app-nav" aria-label="Project views"><div class="sidebar-primary"><button id="sidebar-discover" class="sidebar-create" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M12 5v14M5 12h14"></path></svg>Connect project</button></div><div id="sidebar-projects" aria-label="Your repositories"></div><div class="sidebar-bottom"><a class="nav-item" href="https://agenttwin.si/docs/"><svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M12 5v15M12 5C9 3 5 3 2 4v15c3-1 7-1 10 1M12 5c3-2 7-2 10-1v15c-3-1-7-1-10 1"></path></svg>Documentation<span class="nav-external" aria-hidden="true">↗</span></a></div></nav><main id="main"><p id="api-message" class="coverage" role="status" aria-live="polite"></p><section id="home-view" hidden="" aria-label="Agent home"><div class="home-hero"><div id="home-sky" aria-hidden="true"></div><h1 class="home-overview-title">What should your agent test?</h1><section class="home-assistant-bottom" aria-label="Workflow assistant"><div class="assistant-entry"><button type="button" id="assistant-dock-toggle" aria-expanded="false" aria-controls="assistant-dock-panel">Ask about a workflow or test result <span aria-hidden="true">↑</span></button><button type="button" id="assistant-voice-entry" class="voice-button" aria-label="Dictate a message" title="Dictate a message"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><rect x="9" y="3" width="6" height="12" rx="3"></rect><path d="M5 10v2a7 7 0 0 0 14 0v-2M12 19v3M8 22h8"></path></svg></button></div><div class="hero-content" id="assistant-dock-panel" hidden=""><button type="button" id="assistant-dock-close" aria-label="Minimize workflow assistant">Minimize ↓</button><div class="home-composer" role="form" aria-label="Workflow assistant"><div class="assistant-heading"><strong>Ask AgentTwin</strong><span id="assistant-project-context"></span></div><p id="assistant-connection-status" role="status"></p><button type="button" id="assistant-connect">Connect your account</button><label class="visually-hidden" for="composer-input">Ask about your workflow</label><textarea id="composer-input" rows="3" placeholder="What would you like to test?" spellCheck="false"></textarea><div class="composer-row"><span class="assistant-send-hint">Ask about your workflows or run results</span><button type="button" id="composer-voice" class="voice-button" aria-label="Dictate a message" title="Dictate a message"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><rect x="9" y="3" width="6" height="12" rx="3"></rect><path d="M5 10v2a7 7 0 0 0 14 0v-2M12 19v3M8 22h8"></path></svg></button><button type="button" class="composer-send" id="composer-send" aria-label="Send message">Send ↑</button></div><div id="chat-thread" class="chat-thread" aria-label="Workflow conversation" hidden=""></div><p id="composer-note" class="composer-note" role="status"></p></div></div></section></div><div class="home-body"><section id="home-next-step" class="next-step home-action" aria-label="Next step"></section><div class="home-grid-head"><span class="grid-hint">Your workspace</span><button type="button" id="home-customize" aria-pressed="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><rect x="4" y="4" width="6.5" height="6.5" rx="1.5"></rect><rect x="13.5" y="4" width="6.5" height="6.5" rx="1.5"></rect><rect x="4" y="13.5" width="6.5" height="6.5" rx="1.5"></rect><rect x="13.5" y="13.5" width="6.5" height="6.5" rx="1.5"></rect></svg>Customize</button></div><div id="home-widget-controls" class="home-widget-controls" hidden=""></div><div class="home-widgets"><div class="widget-column"><article class="widget area-project" id="widget-project"><header><h2>Project discovery</h2></header><div class="w-body" id="project-body"></div></article><article class="widget area-git" id="widget-git"><header><h2>Git activity</h2><span id="git-meta" class="w-head-meta"></span></header><div class="w-body" id="git-body"></div></article><article class="widget area-working" id="widget-working"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M6 3v12a3 3 0 0 0 3 3h9"></path><path d="M6 3 3 6m3-3 3 3"></path><path d="m15 15 3 3 3-3"></path></svg></span><h2>Working now</h2><span class="w-count" id="working-count"></span><span class="w-head-meta" id="working-meta"></span></header><div class="w-body" id="working-body"></div></article><article class="widget area-sandbox" id="widget-sandbox"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="3" y="5" width="18" height="14" rx="3"></rect><path d="M3 10h18M8 5v5"></path></svg></span><h2>Last execution</h2><span class="w-head-meta" id="sandbox-meta"></span></header><div class="w-body" id="sandbox-body"></div></article></div><div class="widget-column"><article class="widget area-receipts" id="widget-receipts"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M6 3h9l4 4v14H6Z"></path><path d="M15 3v4h4"></path><path d="M9 12h7M9 16h7"></path></svg></span><h2>Test results</h2><span class="w-count warn" id="receipts-count"></span><span class="w-head-spin" id="receipts-spin" hidden=""><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="spin"><path d="M12 3a9 9 0 1 0 9 9" stroke-linecap="round"></path></svg></span></header><div class="w-body" id="receipts-body"></div></article><article class="widget area-services" id="widget-services"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="9"></circle><circle cx="12" cy="12" r="2.5"></circle><path d="M5.5 5.5 10 10m4 4 4.5 4.5M18.5 5.5 14 10m-4 4-4.5 4.5"></path></svg></span><h2>Observed activities</h2></header><div class="w-body" id="services-body"></div></article><article class="widget area-failures" id="widget-failures"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="9"></circle><path d="m9 9 6 6M15 9l-6 6"></path></svg></span><h2>Needs attention</h2><span class="w-head-meta" id="failures-meta"></span></header><div class="w-body" id="failures-body"></div></article></div></div></div></section><section id="environment-view"><div class="heading"><div><p class="eyebrow">Project / environment</p><h1 id="environment-title">A test world for your agent.</h1><p id="environment-subtitle" class="muted">Discover your project. Test what your agent does before it touches production.</p></div><div class="actions"><label class="upload">Import discovery<input id="inventory-import" type="file" accept="application/json,.json"/></label><button id="configure-run" class="primary" type="button">Review workflows →</button></div></div><div class="discovery-onboarding"><aside class="terminal-panel"><div class="terminal-title"><h2>Connect your project</h2><span>From your terminal</span></div><div class="terminal-content"><div class="terminal-command"><span class="command-prompt" aria-hidden="true">❯</span><code>npx agenttwin init</code><button id="copy-init" type="button" aria-label="Copy discovery command">Copy command <span aria-hidden="true">↗</span></button></div><p class="terminal-comment">Run in your repository · Node.js 22.12+</p><div class="terminal-output" id="terminal-output"></div><details class="discovery-help"><summary>Analyze with a coding agent</summary><p>Init offers OpenCode when installed. To launch it directly, run <code>npx agenttwin init --agent opencode</code>. Other agents can use the generated <code>AGENT-TASK.md</code>.</p></details><details class="discovery-help"><summary>Send findings to this workspace</summary><p>Connect your account in Settings, configure <code>AGENTTWIN_TOKEN</code> in your terminal, then run <code>npx agenttwin sync</code>. This sends discovery metadata. Application files upload separately when you execute a reviewed bundle.</p><button type="button" data-action="settings">Open connection settings →</button></details></div></aside><section class="workflow-area"><div class="section-title"><h2 id="discovery-workflows-title">Discovery</h2><button id="discovery-workflows-link" type="button" data-action="configure">View workflows →</button></div><div id="environment-workflows"></div></section></div><div class="welcome-next"><ol class="welcome-steps"><li><span>01</span><div><strong>Discover</strong><p>Find tools and code paths.</p></div></li><li><span>02</span><div><strong>Review</strong><p>Choose what needs testing.</p></div></li><li><span>03</span><div><strong>Run safely</strong><p>Test through the CLI.</p></div></li></ol><button id="welcome-select-software" type="button">Or select your tools manually <span aria-hidden="true">→</span></button></div><div id="environment-coverage" class="coverage-strip"></div><div class="environment-grid"><section class="discovery-area"><div class="section-title"><h2>Selected resources</h2><div class="actions"><button id="add-app-toggle" type="button">Add custom software</button><button id="select-software" type="button">Select software</button></div></div><p id="inventory-context" class="coverage">No project connected. Import the inventory from your CLI to see its dependencies and workflow candidates.</p><form id="add-app" class="app-declaration" hidden=""><label>App or tool name<input id="app-name" required="" maxLength="80" placeholder="For example, Apple Mail"/></label><label>How the agent uses it<select id="app-interface"><option value="desktop">Desktop interface · no API required</option><option value="browser">Browser interface</option><option value="api">API / connector</option><option value="terminal">Terminal / command line</option></select></label><button type="submit">Add to environment</button></form><section class="topology-panel"><header class="topology-heading"><h3>Environment map</h3><span id="resource-count">0 resources</span><div class="map-controls"><button id="map-zoom-out" type="button" aria-label="Zoom out">−</button><span id="map-zoom-label">100%</span><button id="map-zoom-in" type="button" aria-label="Zoom in">+</button><button id="map-fit" type="button">Reset view</button><button id="map-arrange" type="button">Arrange</button></div></header><div class="map-workspace"><div id="map-canvas" class="topology-canvas" tabindex="0" aria-label="Environment map. Drag empty space to pan; drag cards to move them. Use arrow keys to pan."><p id="topology-label" class="topology-label">Selected resources</p><div id="map-scroll-space" class="map-scroll-space"><div id="map-stage" class="map-stage"><svg id="map-edges" class="map-edges" aria-hidden="true"></svg><div id="environment-project" class="environment-project" data-node="project" tabindex="0" aria-label="Move project card"></div><div id="environment-tools" class="resource-grid"></div></div></div><div id="map-empty" class="map-empty"><img src="assets/icons/ui/plugs-connected.svg" width="26" height="26" alt=""/><h3>No resources selected</h3><p>Run init in your project, then import .agenttwin/inventory.json. You can also declare a resource manually.</p><button id="map-select-tools" type="button">Browse resource catalog</button></div><span class="map-hint">Drag to pan · drag cards to arrange</span></div><aside class="map-resource-rail"><label>Selected resources <span id="map-list-count"></span><input id="map-resource-search" type="search" placeholder="Find a selected tool"/></label><div id="map-resource-list"></div><div id="map-resource-detail"><p>Select a resource to inspect coverage.</p></div></aside></div><div class="map-pagination"><span id="map-page-label"></span><span>Scroll to explore · select a name to locate its card</span></div></section><p id="environment-message" role="status" aria-live="polite"></p><div id="removed-resource" class="removal-notice" role="status" hidden=""><span id="removed-resource-message"></span><button id="undo-remove-resource" type="button">Undo</button></div></section></div><details class="catalog-drawer"><summary>Select software <span>choose what your workflow uses</span></summary><div class="catalog-body"><div id="catalog-slot"><div class="connector-toolbar"><label>Find a connector<input id="connector-search" type="search" placeholder="Search services"/></label><button id="select-connectors" type="button">Select all</button><button id="clear-connectors" type="button">Clear selection</button></div><p id="connector-status" role="status" aria-live="polite"></p><div id="connector-catalog" class="connector-catalog"></div><button id="export-connectors" type="button">Export selection ↓</button></div></div></details><details class="coverage-note"><summary>Runtime coverage</summary><p>Node workflows with custom HTTP collections and bounded Slack operations run through the CLI. PostgreSQL and Redis worlds can use an explicitly selected cloud runner. Other provider adapters and browser/desktop execution require implementation. Native macOS apps need a compatible macOS runtime. Production accounts are not copied.</p></details></section><section id="configure-view" hidden=""><div class="heading"><div><p class="eyebrow">Project / workflows</p><h1 id="workflows-title">Workflows</h1><p id="workflows-subtitle" class="muted">Choose a code path. Define the world it runs in. Check the outcome.</p></div></div><div id="workflow-workspace"></div><details class="workflow-register advanced-workflows"><summary>Advanced: saved configurations and failure scenarios</summary><section id="saved-workflows"><div class="section-title"><h2>Saved configurations</h2><button type="button" id="workflow-refresh">Refresh</button></div><p class="coverage">Manage the starting state, fault conditions and expected outcomes for your workflows.</p><div id="workflow-saved-list"></div><details id="workflow-editor"><summary>Edit configuration</summary><label for="workflow-spec">agenttwin.world.json</label><textarea id="workflow-spec" rows="14" spellCheck="false" placeholder="Paste your world configuration or import a reviewed bundle above."></textarea><fieldset class="fault-controls"><legend>Failure scenario</legend><p class="coverage">Edit a draft, then rebuild and review its bundle before execution. Uploaded bundles keep their verified configuration.</p><label>Condition<select id="workflow-fault-type"><option value="none">Healthy execution — no injected fault</option><option value="timeout-after-write">Timeout after write</option></select></label><label>Target operation<select id="workflow-fault-target"><option value="">Load a configuration first</option></select></label><label>Response delay (milliseconds)<input id="workflow-fault-delay" type="number" min="1" max="10000" value="1200"/></label><button type="button" id="workflow-apply-fault">Apply to draft</button><p class="coverage">Timeout after write commits a write, then delays its response. Test whether retries duplicate actions. Runs report whether the fault actually activated. Other fault types are not implemented.</p></fieldset><div class="actions"><button type="button" id="workflow-save">Save draft</button><button type="button" id="workflow-new">New draft</button><button type="button" id="workflow-export">Download world configuration</button></div></details><p id="workflow-save-status" class="coverage" role="status"></p></section></details><details class="setup-card bundle-upload"><summary>Run a prepared workflow on a cloud machine</summary><div class="section-title"><h2>Optional cloud execution</h2><label class="upload">Upload prepared workflow<input id="bundle-import" type="file" accept="application/json,.json"/></label></div><p class="setup-note">Upload the file prepared by your coding agent. AgentTwin checks the files and configuration before you run.</p><p id="workflow-connection" class="connection-note">Connect your account in Settings before executing. <button type="button" data-action="settings">Open settings →</button></p><div id="bundle-review"><p class="coverage">Select a prepared workflow bundle to review its files and configuration.</p></div><label class="bundle-consent"><input id="bundle-consent" type="checkbox"/>I reviewed these application files, fixture data and operation mappings for upload.</label><button id="submit-hosted-run" class="primary" type="button" disabled="">Run in cloud →</button></details><details class="coverage-note"><summary>Runtime coverage</summary><p>Node workflows with custom HTTP collections and bounded Slack operations run through the CLI. PostgreSQL and Redis worlds can use an explicitly selected cloud runner. Other provider adapters and browser/desktop execution require implementation. Native macOS apps need a compatible macOS runtime. Production accounts are not copied.</p></details></section><section id="settings-view" hidden=""><div class="heading"><div><h1>Settings</h1><p class="muted">Your workspace, account connection and dashboard preferences.</p></div></div><form id="workspace-preferences" class="settings-section"><div class="settings-section-heading"><h2>Workspace</h2><p>Preferences are saved in this browser. They do not change other team members’ settings.</p></div><div class="setting-row"><div><label for="workspace-display-name">Company or workspace name</label><p>Shown alongside your name in the account menu.</p></div><input id="workspace-display-name" type="text" maxLength="40" required="" autoComplete="off" value="My workspace"/></div><div class="setting-row"><div><label for="workspace-user-name">Your name</label><p>Shown in your account menu on this browser.</p></div><input id="workspace-user-name" type="text" maxLength="60" autoComplete="name"/></div><div class="settings-section-heading"><h2>Project preferences</h2><p>Guidance for new preparation tasks. Each reviewed workflow keeps its own execution limit.</p></div><div class="setting-row"><div><label for="default-run-timeout">Default execution limit</label><p>Suggested duration in the task sent to your coding agent.</p></div><div class="setting-unit"><input id="default-run-timeout" type="number" min="1" max="300" step="1" required="" value="20"/><span>seconds</span></div></div><div class="setting-row"><div><label for="receipt-load-limit">Results loaded per refresh</label><p>Limit receipt requests for large workspaces. The API lists the latest 100 jobs; unloaded receipts are fetched on subsequent refreshes.</p></div><input id="receipt-load-limit" type="number" min="1" max="100" required="" value="25"/></div><div class="settings-section-heading"><h2>Dashboard</h2></div><div class="setting-row"><div><label for="auto-refresh">Refresh automatically</label><p>Keep discovery and active run status up to date while this tab is visible. Manual refresh stays available.</p></div><input id="auto-refresh" type="checkbox" role="switch" checked=""/></div><div class="setting-row"><div><label for="compact-density">Compact lists</label><p>Fit more workflows and recorded runs on screen.</p></div><input id="compact-density" type="checkbox" role="switch"/></div><div class="setting-row"><div><label for="reduce-motion">Reduce motion</label><p>Disable transitions and smooth scrolling. Your system preference is also respected.</p></div><input id="reduce-motion" type="checkbox" role="switch"/></div><div class="settings-save"><p id="preferences-message" role="status" aria-live="polite">No unsaved changes.</p><button type="button" id="reset-preferences">Reset defaults</button><button type="submit" class="primary">Save preferences</button></div></form><form id="api-connect" class="settings-section api-connect setup-card"><div class="settings-section-heading"><h2>Account connection</h2><p>Connect to sync project discovery, submit workflows and retrieve evidence.</p></div><p id="account-connection-status" class="connection-status">Not connected</p><label for="api-url">AgentTwin API URL</label><input id="api-url" type="url" required="" placeholder="https://your-agenttwin-api.example"/><label for="api-token">Account token</label><div class="token-input"><input id="api-token" type="password" required="" autoComplete="off" placeholder="at_user_…"/><button id="toggle-token" type="button" aria-label="Show account token" aria-pressed="false">Show</button></div><div class="actions"><button type="submit" class="primary">Connect account</button><button type="button" id="api-sync-settings" disabled="">Refresh workspace</button><button type="button" id="api-disconnect" disabled="">Disconnect</button></div><p class="setup-note">Your token stays in memory for this tab and is cleared on disconnect or reload. It is never saved with your preferences.</p></form><section class="settings-section"><h2>Execution</h2><p>Test supported Node workflows with <code>npx agenttwin run</code> in your repository. Service twins start in-process; no containers or VM are required.</p><p>Choose <code>--runtime hosted</code> or <code>--runtime e2b</code> when the workflow needs a cloud machine. PostgreSQL and Redis currently require that runner. CLI execution uses your computer and is not an isolation boundary.</p><p>Run <code>npx agenttwin sync</code> to send discovery, Git metadata and CLI test evidence to this workspace. Review recorded output and fixtures before syncing.</p></section><section class="settings-section"><h2>Workflow assistant</h2><p id="settings-chat-status" role="status">Connect your account to check model availability.</p><p class="setup-note">The API operator configures the model. Provider credentials stay on the server. Messages, synced metadata, saved contracts and selected run evidence are sent to the configured model. Chat explains your project and results; it does not execute code. Source analysis requires a separate upload.</p></section><section class="settings-section settings-about"><h2>About this workspace</h2><dl><div><dt>Execution</dt><dd>CLI by default; cloud when required</dd></div><div><dt>Starting state</dt><dd>Reviewed fixtures and new test identities</dd></div><div><dt>Project sync</dt><dd>Discovery metadata; application files upload only with a reviewed bundle</dd></div></dl><a href="https://agenttwin.si/docs/">Read the documentation ↗</a></section></section><section id="history-view" hidden=""><div class="heading"><div><p class="eyebrow">Project / runs</p><h1 id="runs-title">Runs</h1><p id="runs-subtitle" class="muted">See what was tested, what happened, and what to fix.</p></div><div class="actions"><button id="reload" type="button">Refresh</button><label class="primary upload">Import test results<input id="import" type="file" accept="application/json,.json" multiple=""/></label></div></div><section class="workflow-register submitted-jobs"><div class="section-title"><h2>Execution queue</h2><button id="refresh-api-jobs" type="button" disabled="">Refresh</button></div><div id="api-jobs"><p class="coverage">Connect your account in Settings to load submitted runs.</p></div></section><p id="message" role="status" aria-live="polite"></p><section class="stats" id="stats" aria-label="Run summary"></section><div class="workspace"><aside class="run-sidebar"><div class="list-heading"><h2>Test history</h2><span id="run-count"></span></div><label class="search-label">Filter runs<input id="search" type="search" placeholder="Find a workflow, revision or run"/></label><div class="run-filters"><label>Repository<select id="run-project"><option value="all" selected="">All repositories</option></select></label><label>Outcome<select id="run-status"><option value="all" selected="">All outcomes</option><option value="passed">Passed</option><option value="failed">Failed</option><option value="error">Execution error</option><option value="incomplete">Incomplete</option></select></label><label>Workflow<select id="run-workflow"><option value="all" selected="">All workflows</option></select></label></div><label class="mobile-run-picker">Select test<select id="run-picker"><option value="" selected="">No tests loaded</option></select></label><div id="runs" aria-label="Select a run"><p class="muted">Loading run evidence…</p></div></aside><article id="detail" class="detail" aria-live="polite"><div class="empty"><h2>Loading evidence</h2><p>Fetching recorded test results.</p></div></article></div></section></main></div></div><!--$--><!--/$--><script src="assets/next/static/chunks/webpack-f3b6dd27998e84ce.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[8319,[\"772\",\"static/chunks/772-85561381eedc95da.js\",\"105\",\"static/chunks/app/dashboard/page-b79ed135f6bac5f7.js\"],\"default\"]\n5:I[4431,[],\"OutletBoundary\"]\n7:I[5278,[],\"AsyncMetadataOutlet\"]\n9:I[4431,[],\"ViewportBoundary\"]\nb:I[4431,[],\"MetadataBoundary\"]\nc:\"$Sreact.suspense\"\ne:I[7150,[],\"\"]\n:HL[\"assets/next/static/css/1323d7da89b3fa5e.css\",\"style\"]\n:HL[\"assets/next/static/css/45513ebc8c6ae800.css\",\"style\"]\n:HL[\"assets/next/static/css/96e4f356a1159071.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"HZwGKKvvx_oO6caYggjFh\",\"p\":\"\",\"c\":[\"\",\"dashboard\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"dashboard\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/1323d7da89b3fa5e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"meta\",null,{\"name\":\"theme-color\",\"content\":\"#090909\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"type\":\"image/svg+xml\",\"href\":\"assets/logo/favicon.svg?v=white-rings\"}],[\"$\",\"link\",null,{\"rel\":\"preload\",\"href\":\"assets/fonts/syne-400.ttf\",\"as\":\"font\",\"type\":\"font/ttf\",\"crossOrigin\":\"anonymous\"}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"dashboard\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/45513ebc8c6ae800.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/96e4f356a1159071.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[[\"$\",\"meta\",null,{\"name\":\"agenttwin-api-url\",\"content\":\"https://agenttwin-api.212.56.40.125.sslip.io\"}],[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L4\",null,{}],null,[\"$\",\"$L5\",null,{\"children\":[\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],null],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"fallback\":null,\"children\":\"$Ld\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\n"])</script><script>self.__next_f.push([1,"8:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Workspace | AgentTwin\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Discover your project, test workflows and inspect recorded results.\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"d:\"$8:metadata\"\n"])</script></body></html>