agenttwin 0.3.13 → 0.3.14

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.
Files changed (34) hide show
  1. package/dist/api.js +11 -1
  2. package/dist/cli.js +113 -18
  3. package/dist/dashboard/assets/next/static/chunks/app/account/password/{page-aaee6711085b485d.js → page-ebb8ab25df1b808e.js} +1 -1
  4. package/dist/dashboard/assets/next/static/chunks/app/dashboard/{layout-09cb13657f62384f.js → layout-f7cd10740b90145d.js} +1 -1
  5. package/dist/dashboard/assets/next/static/chunks/app/dashboard/{page-945c916b24f48675.js → page-a5ad912a1f481008.js} +1 -1
  6. package/dist/dashboard/assets/next/static/chunks/app/demo/{page-3cba0aab460c8677.js → page-5495d9cb9a3e1431.js} +1 -1
  7. package/dist/dashboard/assets/next/static/chunks/app/docs/[[...slug]]/{page-9f7b8dca8b973b15.js → page-9130f219b4b02112.js} +1 -1
  8. package/dist/dashboard/assets/next/static/chunks/app/enterprise/{page-4986698442bddc6b.js → page-b7e323d45eaf4952.js} +1 -1
  9. package/dist/dashboard/assets/next/static/chunks/app/{layout-09868e53e4f0541f.js → layout-ed5b209cd1b17365.js} +1 -1
  10. package/dist/dashboard/assets/next/static/chunks/app/login/page-3887863343ffce8c.js +1 -0
  11. package/dist/dashboard/assets/next/static/chunks/app/onboarding/{page-af2c4768dc34ec92.js → page-35795509a58cbc9c.js} +1 -1
  12. package/dist/dashboard/assets/next/static/chunks/app/{page-507229409812cedd.js → page-4d150b91a7a1abcc.js} +1 -1
  13. package/dist/dashboard/assets/next/static/chunks/app/pricing/page-388c0afb0ac51384.js +1 -0
  14. package/dist/dashboard/assets/next/static/chunks/app/signup/page-3887863343ffce8c.js +1 -0
  15. package/dist/dashboard/assets/next/static/chunks/app/v2/dashboard/{layout-77a57cd622171076.js → layout-1430f20bea23253f.js} +1 -1
  16. package/dist/dashboard/assets/next/static/chunks/app/v2/dashboard/page-12a8d96f5c18b411.js +1 -0
  17. package/dist/dashboard/assets/next/static/chunks/app/v2/layout-fb241571c2a60362.js +1 -0
  18. package/dist/dashboard/assets/next/static/chunks/app/v2/login/page-7ac4be578a219d6e.js +1 -0
  19. package/dist/dashboard/assets/next/static/chunks/app/v2/onboarding/{page-abfe2f36213848d7.js → page-16d9efad4103fb58.js} +1 -1
  20. package/dist/dashboard/assets/next/static/chunks/app/v2/{page-df6a34eff716d18e.js → page-1d465878abb57f0f.js} +1 -1
  21. package/dist/dashboard/assets/next/static/chunks/app/v2/signup/page-7ac4be578a219d6e.js +1 -0
  22. package/dist/dashboard/assets/next/static/chunks/{webpack-44457f45df749a89.js → webpack-9ed8651d8c2c40a2.js} +1 -1
  23. package/dist/dashboard/index.html +2 -2
  24. package/dist/gateway.js +11 -1
  25. package/package.json +1 -1
  26. package/dist/dashboard/assets/next/static/chunks/app/login/page-2e29d4b17645c34c.js +0 -1
  27. package/dist/dashboard/assets/next/static/chunks/app/pricing/page-c27282cd7bfb0fcf.js +0 -1
  28. package/dist/dashboard/assets/next/static/chunks/app/signup/page-2e29d4b17645c34c.js +0 -1
  29. package/dist/dashboard/assets/next/static/chunks/app/v2/dashboard/page-df34bcef0394d10d.js +0 -1
  30. package/dist/dashboard/assets/next/static/chunks/app/v2/layout-d1d715b5b2dae3cd.js +0 -1
  31. package/dist/dashboard/assets/next/static/chunks/app/v2/login/page-4f60d050bf954194.js +0 -1
  32. package/dist/dashboard/assets/next/static/chunks/app/v2/signup/page-4f60d050bf954194.js +0 -1
  33. /package/dist/dashboard/assets/next/static/{BbTZs0rKnsmj45peSnlwJ → O8JeB5KAl7-h1hCNIyUY7}/_buildManifest.js +0 -0
  34. /package/dist/dashboard/assets/next/static/{BbTZs0rKnsmj45peSnlwJ → O8JeB5KAl7-h1hCNIyUY7}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (()=>{"use strict";var e={},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}},i=!0;try{e[o](a,a.exports,r),i=!1}finally{i&&delete t[o]}return a.exports}r.m=e,(()=>{var e=[];r.O=(t,o,n,a)=>{if(o){a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[o,n,a];return}for(var u=1/0,i=0;i<e.length;i++){for(var[o,n,a]=e[i],c=!0,l=0;l<o.length;l++)(!1&a||u>=a)&&Object.keys(r.O).every(e=>r.O[e](o[l]))?o.splice(l--,1):(c=!1,a<u&&(u=a));if(c){e.splice(i--,1);var d=n();void 0!==d&&(t=d)}}return t}})(),r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;r.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);r.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var u=2&n&&o;"object"==typeof u&&!~e.indexOf(u);u=t(u))Object.getOwnPropertyNames(u).forEach(e=>i[e]=()=>o[e]);return i.default=()=>o,r.d(a,i),a}})(),r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,o)=>(r.f[o](e,t),t),[])),r.u=e=>"static/chunks/"+(911===e?"48a1527b":e)+"."+({794:"a624e6be9e42a62b",911:"6d52e40c5e62d9d5",2442:"9a266da6229b8ae0",2529:"07927d0600506985",3454:"d29ee7a49c2a4fba",5490:"0d5d8d5ea3577f20",7280:"01b3f749332bb075"})[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="_N_E:";r.l=(o,n,a,i)=>{if(e[o])return void e[o].push(n);if(void 0!==a)for(var u,c,l=document.getElementsByTagName("script"),d=0;d<l.length;d++){var f=l[d];if(f.getAttribute("src")==o||f.getAttribute("data-webpack")==t+a){u=f;break}}u||(c=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,r.nc&&u.setAttribute("nonce",r.nc),u.setAttribute("data-webpack",t+a),u.src=r.tu(o)),e[o]=[n];var s=(t,r)=>{u.onerror=u.onload=null,clearTimeout(p);var n=e[o];if(delete e[o],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(e=>e(r)),t)return t(r)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=s.bind(null,u.onerror),u.onload=s.bind(null,u.onload),c&&document.head.appendChild(u)}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:e=>e},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("nextjs#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="assets/next/",(()=>{var e={8068:0,3802:0,1839:0,6295:0,641:0,8056:0,9742:0,4481:0,9774:0,8605:0,4469:0,508:0,8347:0,9337:0,95:0,4129:0,7651:0,9446:0};r.f.j=(t,o)=>{var n=r.o(e,t)?e[t]:void 0;if(0!==n)if(n)o.push(n[2]);else if(/^(4(129|469|481)|8(056|068|347|605)|9(337|446|5|742|774)|1839|3802|508|6295|641|7651)$/.test(t))e[t]=0;else{var a=new Promise((r,o)=>n=e[t]=[r,o]);o.push(n[2]=a);var i=r.p+r.u(t),u=Error();r.l(i,o=>{if(r.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var a=o&&("load"===o.type?"missing":o.type),i=o&&o.target&&o.target.src;u.message="Loading chunk "+t+" failed.\n("+a+": "+i+")",u.name="ChunkLoadError",u.type=a,u.request=i,n[1](u)}},"chunk-"+t,t)}},r.O.j=t=>0===e[t];var t=(t,o)=>{var n,a,[i,u,c]=o,l=0;if(i.some(t=>0!==e[t])){for(n in u)r.o(u,n)&&(r.m[n]=u[n]);if(c)var d=c(r)}for(t&&t(o);l<i.length;l++)a=i[l],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(d)},o=self.webpackChunk_N_E=self.webpackChunk_N_E||[];o.forEach(t.bind(null,0)),o.push=t.bind(null,o.push.bind(o))})(),r.nc=void 0})();
1
+ (()=>{"use strict";var e={},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}},i=!0;try{e[o](a,a.exports,r),i=!1}finally{i&&delete t[o]}return a.exports}r.m=e,(()=>{var e=[];r.O=(t,o,n,a)=>{if(o){a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[o,n,a];return}for(var u=1/0,i=0;i<e.length;i++){for(var[o,n,a]=e[i],c=!0,l=0;l<o.length;l++)(!1&a||u>=a)&&Object.keys(r.O).every(e=>r.O[e](o[l]))?o.splice(l--,1):(c=!1,a<u&&(u=a));if(c){e.splice(i--,1);var d=n();void 0!==d&&(t=d)}}return t}})(),r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;r.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);r.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var u=2&n&&o;"object"==typeof u&&!~e.indexOf(u);u=t(u))Object.getOwnPropertyNames(u).forEach(e=>i[e]=()=>o[e]);return i.default=()=>o,r.d(a,i),a}})(),r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,o)=>(r.f[o](e,t),t),[])),r.u=e=>"static/chunks/"+(911===e?"48a1527b":e)+"."+({794:"a624e6be9e42a62b",911:"6d52e40c5e62d9d5",2442:"9a266da6229b8ae0",2529:"07927d0600506985",3454:"d29ee7a49c2a4fba",5490:"0d5d8d5ea3577f20",7280:"01b3f749332bb075"})[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="_N_E:";r.l=(o,n,a,i)=>{if(e[o])return void e[o].push(n);if(void 0!==a)for(var u,c,l=document.getElementsByTagName("script"),d=0;d<l.length;d++){var f=l[d];if(f.getAttribute("src")==o||f.getAttribute("data-webpack")==t+a){u=f;break}}u||(c=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,r.nc&&u.setAttribute("nonce",r.nc),u.setAttribute("data-webpack",t+a),u.src=r.tu(o)),e[o]=[n];var s=(t,r)=>{u.onerror=u.onload=null,clearTimeout(p);var n=e[o];if(delete e[o],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(e=>e(r)),t)return t(r)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=s.bind(null,u.onerror),u.onload=s.bind(null,u.onload),c&&document.head.appendChild(u)}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:e=>e},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("nextjs#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="assets/next/",(()=>{var e={8068:0,3802:0,1839:0,6295:0,641:0,4481:0,9774:0,9742:0,8056:0,8605:0,4469:0,508:0,8347:0,9337:0,95:0,4129:0,7651:0,9446:0};r.f.j=(t,o)=>{var n=r.o(e,t)?e[t]:void 0;if(0!==n)if(n)o.push(n[2]);else if(/^(4(129|469|481)|8(056|068|347|605)|9(337|446|5|742|774)|1839|3802|508|6295|641|7651)$/.test(t))e[t]=0;else{var a=new Promise((r,o)=>n=e[t]=[r,o]);o.push(n[2]=a);var i=r.p+r.u(t),u=Error();r.l(i,o=>{if(r.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var a=o&&("load"===o.type?"missing":o.type),i=o&&o.target&&o.target.src;u.message="Loading chunk "+t+" failed.\n("+a+": "+i+")",u.name="ChunkLoadError",u.type=a,u.request=i,n[1](u)}},"chunk-"+t,t)}},r.O.j=t=>0===e[t];var t=(t,o)=>{var n,a,[i,u,c]=o,l=0;if(i.some(t=>0!==e[t])){for(n in u)r.o(u,n)&&(r.m[n]=u[n]);if(c)var d=c(r)}for(t&&t(o);l<i.length;l++)a=i[l],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(d)},o=self.webpackChunk_N_E=self.webpackChunk_N_E||[];o.forEach(t.bind(null,0)),o.push=t.bind(null,o.push.bind(o))})(),r.nc=void 0})();
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><!--BbTZs0rKnsmj45peSnlwJ--><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/81a1668ab34a36e8.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/5d8899aaed08d7f2.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/eea0966f05042bde.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/0cf03e33b963e5cb.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/11f70fd04660da57.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/dd3fb06005e18149.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="assets/next/static/chunks/webpack-44457f45df749a89.js"/><script src="assets/next/static/chunks/6f3ce29d-af1469ba72f5d3e4.js" async=""></script><script src="assets/next/static/chunks/4816-45f42396ec2135cc.js" async=""></script><script src="assets/next/static/chunks/main-app-c83f3671ad6b824a.js" async=""></script><script src="assets/next/static/chunks/app/layout-09868e53e4f0541f.js" async=""></script><script src="assets/next/static/chunks/3916-2698a1a3ecb8649f.js" async=""></script><script src="assets/next/static/chunks/1981-2ce2c5edd154524a.js" async=""></script><script src="assets/next/static/chunks/app/dashboard/page-945c916b24f48675.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://api.agenttwin.si"/><title>Workspace | AgentTwin</title><meta name="description" content="Discover your project, test workflows and inspect recorded results."/><script>(function(){
1
+ <!DOCTYPE html><!--O8JeB5KAl7_h1hCNIyUY7--><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/81a1668ab34a36e8.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/5d8899aaed08d7f2.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/eea0966f05042bde.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/0cf03e33b963e5cb.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/11f70fd04660da57.css" data-precedence="next"/><link rel="stylesheet" href="assets/next/static/css/dd3fb06005e18149.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="assets/next/static/chunks/webpack-9ed8651d8c2c40a2.js"/><script src="assets/next/static/chunks/6f3ce29d-af1469ba72f5d3e4.js" async=""></script><script src="assets/next/static/chunks/4816-45f42396ec2135cc.js" async=""></script><script src="assets/next/static/chunks/main-app-c83f3671ad6b824a.js" async=""></script><script src="assets/next/static/chunks/app/layout-ed5b209cd1b17365.js" async=""></script><script src="assets/next/static/chunks/3916-2698a1a3ecb8649f.js" async=""></script><script src="assets/next/static/chunks/1981-2ce2c5edd154524a.js" async=""></script><script src="assets/next/static/chunks/app/dashboard/page-a5ad912a1f481008.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://api.agenttwin.si"/><title>Workspace | AgentTwin</title><meta name="description" content="Discover your project, test workflows and inspect recorded results."/><script>(function(){
2
2
  var attribute='bis_skin_checked';
3
3
  function clean(node){
4
4
  if(node.nodeType!==1)return;
@@ -13,4 +13,4 @@
13
13
  }else record.addedNodes.forEach(clean);
14
14
  });
15
15
  }).observe(document.documentElement,{subtree:true,childList:true,attributes:true,attributeFilter:[attribute]});
16
- })();</script><script>(function(){try{if(location.pathname.indexOf('/docs')!==0)return;var s=localStorage.getItem('agenttwin:docs-theme');var t=s==='light'||s==='dark'?s:(window.matchMedia('(prefers-color-scheme: light)').matches?'light':'dark');var d=document.documentElement;d.dataset.docsTheme=t;d.style.colorScheme=t;}catch(e){}})();</script><script defer="" data-domain="agenttwin.si" src="https://analytics.hirealpha.chat/js/script.js"></script><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"><a href="/login/" data-auth-link="true" class="home-search">Sign in</a><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=""><div class="account-menu-head"><span class="account-menu-avatar" aria-hidden="true">AT</span><span class="account-menu-identity"><strong id="account-user-name">Your name not set</strong><small id="account-workspace">My workspace</small></span></div><p id="account-menu-status" class="account-menu-status muted">Not connected</p><div class="account-menu-links"><a href="/login/" data-auth-link="true">Sign in</a><a href="/signup/" data-auth-link="true">Create an account</a><a href="/onboarding/">Connect a repository</a></div><div class="account-menu-actions"><button type="button" data-action="settings">Account &amp; settings</button><button type="button" data-action="history">View runs</button></div><div class="account-menu-footer"><button type="button" id="account-disconnect" disabled="">Sign out</button></div></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"><span class="assistant-entry-label-desktop">Ask about a workflow or test result</span><span class="assistant-entry-label-mobile">Ask AgentTwin</span><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-expanded="false" aria-controls="home-widget-controls"><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" role="region" aria-label="Customize home" 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><article class="widget area-readiness" id="widget-readiness"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M8 4H5v17h14V4h-3"></path><rect x="8" y="2" width="8" height="4" rx="1"></rect><path d="m8 13 3 3 5-6"></path></svg></span><h2>Test readiness</h2></header><div class="w-body" id="readiness-body"></div></article></div></div></div></section><section id="environment-view"><div id="environment-project-actions" class="environment-project-actions" hidden=""><p id="environment-removal-message" role="status" aria-live="polite"></p><button id="environment-delete-project" type="button"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M3 6h18M9 6V3h6v3M5 6l1 15h12l1-15M10 10v7M14 10v7"></path></svg>Delete project</button></div><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></section><section id="settings-view" hidden=""><div class="heading"><div><h1>Settings</h1><p class="muted">Your account, projects and dashboard preferences.</p></div></div><form id="api-connect"></form><section class="settings-section"><div class="settings-section-heading"><h2>Sign-in methods</h2><p>Signed up with Google? Create a password to use email sign-in with the same workspace.</p></div><a href="/account/password/">Email and password →</a></section><form id="workspace-preferences" class="settings-preferences"><section class="settings-section"><div class="settings-section-heading"><h2>Account &amp; company</h2><p>Your display details on this browser.</p></div><div class="setting-row"><div><label for="workspace-display-name">Company or workspace</label></div><input id="workspace-display-name" type="text" maxLength="40" required="" autoComplete="organization" value="My workspace"/></div><div class="setting-row"><div><label for="workspace-user-name">Your name</label></div><input id="workspace-user-name" type="text" maxLength="60" autoComplete="name"/></div><div class="settings-connection"><div class="settings-section-heading"><h3>Workspace connection</h3><p>Connect to see your synced projects and test results.</p></div><p id="account-connection-status" class="connection-status" role="status">Not connected</p><details class="settings-credentials"><summary>Connection details</summary><label for="api-url">Server address</label><input form="api-connect" id="api-url" type="url" required="" placeholder="https://your-agenttwin-api.example"/><label for="api-token">Account token</label><div class="token-input"><input form="api-connect" 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><p class="setup-note">Your token stays in this tab until you reload or disconnect.</p><button form="api-connect" type="submit" class="primary">Connect account</button></details><div class="actions"><button type="button" id="api-sync-settings" disabled="">Refresh projects</button><button type="button" id="api-disconnect" disabled="">Disconnect account</button></div><p id="settings-connection-message" role="status" aria-live="polite"></p><details class="settings-assistant-status"><summary>Assistant availability</summary><p id="settings-chat-status" role="status">Connect your account to check availability.</p></details></div></section><section class="settings-section"><div class="project-settings-heading"><div><h2>Projects</h2><p>Applications connected to this workspace.</p></div><a class="project-add" href="/onboarding/">Add project</a></div><div id="settings-repositories"><p class="muted">No projects connected.</p></div><p id="project-settings-message" role="status" aria-live="polite"></p></section><section class="settings-section"><div class="settings-section-heading"><h2>Testing</h2><p>Start locally. Choose a cloud machine only when a workflow needs one.</p></div><div class="settings-runtime"><span class="settings-default">Default</span><h3>Run in your repository</h3><p>Use <code>npx agenttwin run</code>, then <code>npx agenttwin sync</code> to see results here.</p></div><p class="setup-note">Execution limits, dependencies and cloud requirements belong to each workflow.</p><button type="button" data-goto="configure">Review workflows →</button></section><section class="settings-section"><div class="settings-section-heading"><h2>Preferences</h2><p>Make this dashboard comfortable for you.</p></div><div class="setting-row"><div><label for="dashboard-artwork">Home background</label><p>Automatic follows your local time.</p></div><select id="dashboard-artwork"><option value="auto" selected="">Automatic</option><option value="morning">Morning</option><option value="afternoon">Afternoon</option><option value="evening">Evening</option></select></div><div class="setting-row"><div><label for="auto-refresh">Live updates</label><p>Refresh project and run status while this tab is open.</p></div><input id="auto-refresh" type="checkbox" role="switch" checked=""/></div><div class="setting-row"><div><label for="compact-density">Compact layout</label><p>Fit more workflows and 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>Use fewer animations and transitions.</p></div><input id="reduce-motion" type="checkbox" role="switch"/></div></section><div class="settings-save"><p id="preferences-message" role="status" aria-live="polite">Changes save to this browser.</p><button type="button" id="reset-preferences">Reset preferences</button><button type="submit" class="primary">Save changes</button></div></form></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><button type="button" class="workspace-tour-launcher"><span aria-hidden="true">✦</span> Take a tour</button></div></div><!--$--><!--/$--><script src="assets/next/static/chunks/webpack-44457f45df749a89.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[4522,[\"7177\",\"static/chunks/app/layout-09868e53e4f0541f.js\"],\"default\"]\n3:I[19,[],\"\"]\n4:I[7023,[],\"\"]\n5:I[9399,[\"3916\",\"static/chunks/3916-2698a1a3ecb8649f.js\",\"1981\",\"static/chunks/1981-2ce2c5edd154524a.js\",\"5105\",\"static/chunks/app/dashboard/page-945c916b24f48675.js\"],\"default\"]\n9:I[3977,[],\"\"]\n:HL[\"assets/next/static/css/81a1668ab34a36e8.css\",\"style\"]\n:HL[\"assets/next/static/css/5d8899aaed08d7f2.css\",\"style\"]\n:HL[\"assets/next/static/css/eea0966f05042bde.css\",\"style\"]\n:HL[\"assets/next/static/css/0cf03e33b963e5cb.css\",\"style\"]\n:HL[\"assets/next/static/css/11f70fd04660da57.css\",\"style\"]\n:HL[\"assets/next/static/css/dd3fb06005e18149.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"BbTZs0rKnsmj45peSnlwJ\",\"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/81a1668ab34a36e8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){\\n var attribute='bis_skin_checked';\\n function clean(node){\\n if(node.nodeType!==1)return;\\n if(node.hasAttribute(attribute))node.removeAttribute(attribute);\\n node.querySelectorAll('['+attribute+']').forEach(function(element){element.removeAttribute(attribute);});\\n }\\n clean(document.documentElement);\\n new MutationObserver(function(records){\\n records.forEach(function(record){\\n if(record.type==='attributes'){\\n if(record.target.hasAttribute(attribute))record.target.removeAttribute(attribute);\\n }else record.addedNodes.forEach(clean);\\n });\\n }).observe(document.documentElement,{subtree:true,childList:true,attributes:true,attributeFilter:[attribute]});\\n})();\"}}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{if(location.pathname.indexOf('/docs')!==0)return;var s=localStorage.getItem('agenttwin:docs-theme');var t=s==='light'||s==='dark'?s:(window.matchMedia('(prefers-color-scheme: light)').matches?'light':'dark');var d=document.documentElement;d.dataset.docsTheme=t;d.style.colorScheme=t;}catch(e){}})();\"}}],[\"$\",\"script\",null,{\"defer\":true,\"data-domain\":\"agenttwin.si\",\"src\":\"https://analytics.hirealpha.chat/js/script.js\"}],[\"$\",\"$L2\",null,{}],[\"$\",\"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,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",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/5d8899aaed08d7f2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/eea0966f05042bde.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/0cf03e33b963e5cb.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[[\"$\",\"meta\",null,{\"name\":\"agenttwin-api-url\",\"content\":\"https://api.agenttwin.si\"}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L5\",null,{}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/11f70fd04660da57.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],\"$L6\"],\"$L7\"]}],{},null,false]},null,false]},null,false],\"$L8\",false]],\"m\":\"$undefined\",\"G\":[\"$9\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:I[9226,[],\"OutletBoundary\"]\nc:I[4943,[],\"AsyncMetadataOutlet\"]\ne:I[9226,[],\"ViewportBoundary\"]\n10:I[9226,[],\"MetadataBoundary\"]\n11:\"$Sreact.suspense\"\n6:[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/dd3fb06005e18149.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n7:[\"$\",\"$La\",null,{\"children\":[\"$Lb\",[\"$\",\"$Lc\",null,{\"promise\":\"$@d\"}]]}]\n8:[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],null],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$11\",null,{\"fallback\":null,\"children\":\"$L12\"}]}]}]]}]\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nb:null\n"])</script><script>self.__next_f.push([1,"d:{\"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,"12:\"$d:metadata\"\n"])</script></body></html>
16
+ })();</script><script>(function(){try{if(location.pathname.indexOf('/docs')!==0)return;var s=localStorage.getItem('agenttwin:docs-theme');var t=s==='light'||s==='dark'?s:(window.matchMedia('(prefers-color-scheme: light)').matches?'light':'dark');var d=document.documentElement;d.dataset.docsTheme=t;d.style.colorScheme=t;}catch(e){}})();</script><script defer="" data-domain="agenttwin.si" src="https://analytics.hirealpha.chat/js/script.js"></script><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"><a href="/login/" data-auth-link="true" class="home-search">Sign in</a><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=""><div class="account-menu-head"><span class="account-menu-avatar" aria-hidden="true">AT</span><span class="account-menu-identity"><strong id="account-user-name">Your name not set</strong><small id="account-workspace">My workspace</small></span></div><p id="account-menu-status" class="account-menu-status muted">Not connected</p><div class="account-menu-links"><a href="/login/" data-auth-link="true">Sign in</a><a href="/signup/" data-auth-link="true">Create an account</a><a href="/onboarding/">Connect a repository</a></div><div class="account-menu-actions"><button type="button" data-action="settings">Account &amp; settings</button><button type="button" data-action="history">View runs</button></div><div class="account-menu-footer"><button type="button" id="account-disconnect" disabled="">Sign out</button></div></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"><span class="assistant-entry-label-desktop">Ask about a workflow or test result</span><span class="assistant-entry-label-mobile">Ask AgentTwin</span><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-expanded="false" aria-controls="home-widget-controls"><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" role="region" aria-label="Customize home" 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><article class="widget area-readiness" id="widget-readiness"><header><span class="w-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M8 4H5v17h14V4h-3"></path><rect x="8" y="2" width="8" height="4" rx="1"></rect><path d="m8 13 3 3 5-6"></path></svg></span><h2>Test readiness</h2></header><div class="w-body" id="readiness-body"></div></article></div></div></div></section><section id="environment-view"><div id="environment-project-actions" class="environment-project-actions" hidden=""><p id="environment-removal-message" role="status" aria-live="polite"></p><button id="environment-delete-project" type="button"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M3 6h18M9 6V3h6v3M5 6l1 15h12l1-15M10 10v7M14 10v7"></path></svg>Delete project</button></div><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></section><section id="settings-view" hidden=""><div class="heading"><div><h1>Settings</h1><p class="muted">Your account, projects and dashboard preferences.</p></div></div><form id="api-connect"></form><section class="settings-section"><div class="settings-section-heading"><h2>Sign-in methods</h2><p>Signed up with Google? Create a password to use email sign-in with the same workspace.</p></div><a href="/account/password/">Email and password →</a></section><form id="workspace-preferences" class="settings-preferences"><section class="settings-section"><div class="settings-section-heading"><h2>Account &amp; company</h2><p>Your display details on this browser.</p></div><div class="setting-row"><div><label for="workspace-display-name">Company or workspace</label></div><input id="workspace-display-name" type="text" maxLength="40" required="" autoComplete="organization" value="My workspace"/></div><div class="setting-row"><div><label for="workspace-user-name">Your name</label></div><input id="workspace-user-name" type="text" maxLength="60" autoComplete="name"/></div><div class="settings-connection"><div class="settings-section-heading"><h3>Workspace connection</h3><p>Connect to see your synced projects and test results.</p></div><p id="account-connection-status" class="connection-status" role="status">Not connected</p><details class="settings-credentials"><summary>Connection details</summary><label for="api-url">Server address</label><input form="api-connect" id="api-url" type="url" required="" placeholder="https://your-agenttwin-api.example"/><label for="api-token">Account token</label><div class="token-input"><input form="api-connect" 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><p class="setup-note">Your token stays in this tab until you reload or disconnect.</p><button form="api-connect" type="submit" class="primary">Connect account</button></details><div class="actions"><button type="button" id="api-sync-settings" disabled="">Refresh projects</button><button type="button" id="api-disconnect" disabled="">Disconnect account</button></div><p id="settings-connection-message" role="status" aria-live="polite"></p><details class="settings-assistant-status"><summary>Assistant availability</summary><p id="settings-chat-status" role="status">Connect your account to check availability.</p></details></div></section><section class="settings-section"><div class="project-settings-heading"><div><h2>Projects</h2><p>Applications connected to this workspace.</p></div><a class="project-add" href="/onboarding/">Add project</a></div><div id="settings-repositories"><p class="muted">No projects connected.</p></div><p id="project-settings-message" role="status" aria-live="polite"></p></section><section class="settings-section"><div class="settings-section-heading"><h2>Testing</h2><p>Start locally. Choose a cloud machine only when a workflow needs one.</p></div><div class="settings-runtime"><span class="settings-default">Default</span><h3>Run in your repository</h3><p>Use <code>npx agenttwin run</code>, then <code>npx agenttwin sync</code> to see results here.</p></div><p class="setup-note">Execution limits, dependencies and cloud requirements belong to each workflow.</p><button type="button" data-goto="configure">Review workflows →</button></section><section class="settings-section"><div class="settings-section-heading"><h2>Preferences</h2><p>Make this dashboard comfortable for you.</p></div><div class="setting-row"><div><label for="dashboard-artwork">Home background</label><p>Automatic follows your local time.</p></div><select id="dashboard-artwork"><option value="auto" selected="">Automatic</option><option value="morning">Morning</option><option value="afternoon">Afternoon</option><option value="evening">Evening</option></select></div><div class="setting-row"><div><label for="auto-refresh">Live updates</label><p>Refresh project and run status while this tab is open.</p></div><input id="auto-refresh" type="checkbox" role="switch" checked=""/></div><div class="setting-row"><div><label for="compact-density">Compact layout</label><p>Fit more workflows and 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>Use fewer animations and transitions.</p></div><input id="reduce-motion" type="checkbox" role="switch"/></div></section><div class="settings-save"><p id="preferences-message" role="status" aria-live="polite">Changes save to this browser.</p><button type="button" id="reset-preferences">Reset preferences</button><button type="submit" class="primary">Save changes</button></div></form></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><button type="button" class="workspace-tour-launcher"><span aria-hidden="true">✦</span> Take a tour</button></div></div><!--$--><!--/$--><script src="assets/next/static/chunks/webpack-9ed8651d8c2c40a2.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[4522,[\"7177\",\"static/chunks/app/layout-ed5b209cd1b17365.js\"],\"default\"]\n3:I[19,[],\"\"]\n4:I[7023,[],\"\"]\n5:I[9399,[\"3916\",\"static/chunks/3916-2698a1a3ecb8649f.js\",\"1981\",\"static/chunks/1981-2ce2c5edd154524a.js\",\"5105\",\"static/chunks/app/dashboard/page-a5ad912a1f481008.js\"],\"default\"]\n9:I[3977,[],\"\"]\n:HL[\"assets/next/static/css/81a1668ab34a36e8.css\",\"style\"]\n:HL[\"assets/next/static/css/5d8899aaed08d7f2.css\",\"style\"]\n:HL[\"assets/next/static/css/eea0966f05042bde.css\",\"style\"]\n:HL[\"assets/next/static/css/0cf03e33b963e5cb.css\",\"style\"]\n:HL[\"assets/next/static/css/11f70fd04660da57.css\",\"style\"]\n:HL[\"assets/next/static/css/dd3fb06005e18149.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"O8JeB5KAl7-h1hCNIyUY7\",\"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/81a1668ab34a36e8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){\\n var attribute='bis_skin_checked';\\n function clean(node){\\n if(node.nodeType!==1)return;\\n if(node.hasAttribute(attribute))node.removeAttribute(attribute);\\n node.querySelectorAll('['+attribute+']').forEach(function(element){element.removeAttribute(attribute);});\\n }\\n clean(document.documentElement);\\n new MutationObserver(function(records){\\n records.forEach(function(record){\\n if(record.type==='attributes'){\\n if(record.target.hasAttribute(attribute))record.target.removeAttribute(attribute);\\n }else record.addedNodes.forEach(clean);\\n });\\n }).observe(document.documentElement,{subtree:true,childList:true,attributes:true,attributeFilter:[attribute]});\\n})();\"}}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{if(location.pathname.indexOf('/docs')!==0)return;var s=localStorage.getItem('agenttwin:docs-theme');var t=s==='light'||s==='dark'?s:(window.matchMedia('(prefers-color-scheme: light)').matches?'light':'dark');var d=document.documentElement;d.dataset.docsTheme=t;d.style.colorScheme=t;}catch(e){}})();\"}}],[\"$\",\"script\",null,{\"defer\":true,\"data-domain\":\"agenttwin.si\",\"src\":\"https://analytics.hirealpha.chat/js/script.js\"}],[\"$\",\"$L2\",null,{}],[\"$\",\"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,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",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/5d8899aaed08d7f2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/eea0966f05042bde.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/0cf03e33b963e5cb.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[[\"$\",\"meta\",null,{\"name\":\"agenttwin-api-url\",\"content\":\"https://api.agenttwin.si\"}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L5\",null,{}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/11f70fd04660da57.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],\"$L6\"],\"$L7\"]}],{},null,false]},null,false]},null,false],\"$L8\",false]],\"m\":\"$undefined\",\"G\":[\"$9\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:I[9226,[],\"OutletBoundary\"]\nc:I[4943,[],\"AsyncMetadataOutlet\"]\ne:I[9226,[],\"ViewportBoundary\"]\n10:I[9226,[],\"MetadataBoundary\"]\n11:\"$Sreact.suspense\"\n6:[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"assets/next/static/css/dd3fb06005e18149.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n7:[\"$\",\"$La\",null,{\"children\":[\"$Lb\",[\"$\",\"$Lc\",null,{\"promise\":\"$@d\"}]]}]\n8:[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],null],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$11\",null,{\"fallback\":null,\"children\":\"$L12\"}]}]}]]}]\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nb:null\n"])</script><script>self.__next_f.push([1,"d:{\"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,"12:\"$d:metadata\"\n"])</script></body></html>
package/dist/gateway.js CHANGED
@@ -4339,6 +4339,7 @@ async function startGateway(opts) {
4339
4339
  const passkeyChallenges = {};
4340
4340
  const devices = /* @__PURE__ */ new Map();
4341
4341
  let hashing = 0;
4342
+ let localOnboardingUntil = 0;
4342
4343
  const dummyPassword = randomBytes6(16).toString("hex") + ":" + randomBytes6(64).toString("hex");
4343
4344
  const server = createServer2(async (req, res) => {
4344
4345
  try {
@@ -4405,7 +4406,7 @@ async function startGateway(opts) {
4405
4406
  };
4406
4407
  const profile = (a) => ({ accountId: a.id, email: a.identity?.email, name: a.identity?.name ?? a.label, workspace: a.label, organization: a.organization, workspaceProfile: a.workspaceProfile, passwordEnabled: !!a.identity?.passwordHash, passwordSetupAllowed: !a.identity?.passwordHash && !!a.externalIdentities?.some((i) => i.provider === "google") });
4407
4408
  if (path2 === "/v1/dev/workspace" && req.method === "GET" && opts.localDevelopment && ["127.0.0.1", "localhost"].includes(opts.host ?? "") && verificationUrl === "http://localhost:3000/onboarding/") {
4408
- send(res, 200, { schema: "agenttwin/local-workspace-v1", dashboard: verificationUrl });
4409
+ send(res, 200, { schema: "agenttwin/local-workspace-v1", dashboard: verificationUrl, onboarding: localOnboardingUntil > Date.now() });
4409
4410
  return;
4410
4411
  }
4411
4412
  if (path2 === "/v1/auth/providers" && req.method === "GET") {
@@ -4908,6 +4909,15 @@ async function startGateway(opts) {
4908
4909
  send(res, 401, { error: "unauthorized" });
4909
4910
  return;
4910
4911
  }
4912
+ if (path2 === "/v1/dev/workspace" && req.method === "POST" && opts.localDevelopment && ["127.0.0.1", "localhost"].includes(opts.host ?? "") && verificationUrl === "http://localhost:3000/onboarding/") {
4913
+ if (token || !session || origin !== "http://localhost:3000") {
4914
+ send(res, 403, { error: "browser_session_required" });
4915
+ return;
4916
+ }
4917
+ localOnboardingUntil = Date.now() + 10 * 6e4;
4918
+ send(res, 200, { waiting: true });
4919
+ return;
4920
+ }
4911
4921
  if (path2 === "/v1/auth/password" && req.method === "POST") {
4912
4922
  if (token || !session || !account.identity || !origin || !allowedOrigins.has(origin)) {
4913
4923
  send(res, 403, { error: "browser_session_required" });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agenttwin",
3
- "version": "0.3.13",
3
+ "version": "0.3.14",
4
4
  "description": "Give your agent a test world before it touches the real one.",
5
5
  "keywords": [
6
6
  "agent",
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[879,4520],{3488:(e,s,_)=>{Promise.resolve().then(_.bind(_,650))}},e=>{e.O(0,[1839,650,7903,4816,7358],()=>e(e.s=3488)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6907],{3645:()=>{},6105:(e,n,a)=>{Promise.resolve().then(a.bind(a,9525)),Promise.resolve().then(a.t.bind(a,3645,23))},9525:(e,n,a)=>{"use strict";a.d(n,{default:()=>l});var s=a(1778),r=a(5226);let i=[{href:"/#worlds",label:"Worlds"},{href:"/#how",label:"How it works"},{href:"/#failures",label:"Failures"},{href:"/#pricing",label:"Pricing"},{href:"/enterprise/",label:"Enterprise"},{href:"/docs/",label:"Docs"}];function l(){let[e,n]=(0,r.useState)(!1),a=(0,r.useRef)(null),l=(0,r.useRef)(null);return(0,r.useEffect)(()=>{let e=e=>{var s,r;"Escape"===e.key&&(null==(s=l.current)?void 0:s.querySelector("#navlinks.is-open"))&&(n(!1),null==(r=a.current)||r.focus())},s=e=>{var a;(null==(a=l.current)?void 0:a.contains(e.target))||n(!1)},r=matchMedia("(min-width: 1024px)"),i=()=>n(!1);return document.addEventListener("keydown",e),document.addEventListener("click",s),r.addEventListener("change",i),()=>{document.removeEventListener("keydown",e),document.removeEventListener("click",s),r.removeEventListener("change",i)}},[]),(0,s.jsxs)("header",{className:"site-header",ref:l,children:[(0,s.jsxs)("a",{className:"brand",href:"/","aria-label":"AgentTwin home",children:[(0,s.jsx)("img",{src:"assets/logo/mark-twin-rings.svg?v=white-rings",alt:"",width:29,height:29}),"AgentTwin"]}),(0,s.jsxs)("nav",{className:"main-nav".concat(e?" is-open":""),id:"navlinks","aria-label":"Main navigation",children:[i.map(e=>(0,s.jsx)("a",{href:e.href,onClick:()=>n(!1),children:e.label},e.href)),(0,s.jsx)("a",{className:"nav-mobile-dashboard",href:"/dashboard/",onClick:()=>n(!1),children:"Open dashboard"})]}),(0,s.jsxs)("div",{className:"nav-actions",children:[(0,s.jsx)("a",{href:"/login/",children:"Sign in"}),(0,s.jsxs)("a",{className:"button button-white button-small",href:"/signup/",children:["Get started ",(0,s.jsx)("span",{"aria-hidden":"true",children:"\xbb"})]})]}),(0,s.jsxs)("button",{className:"menu-toggle",ref:a,type:"button","aria-label":e?"Close menu":"Open menu","aria-expanded":e,"aria-controls":"navlinks",onClick:()=>n(!e),children:[(0,s.jsx)("span",{}),(0,s.jsx)("span",{})]})]})}}},e=>{e.O(0,[4481,7903,4816,7358],()=>e(e.s=6105)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[879,4520],{3488:(e,s,_)=>{Promise.resolve().then(_.bind(_,650))}},e=>{e.O(0,[1839,650,7903,4816,7358],()=>e(e.s=3488)),_N_E=e.O()}]);