@codeyam-editor/codeyam-editor 0.1.5 → 0.1.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.
Files changed (76) hide show
  1. package/npm/cli.js +5 -1
  2. package/npm/cloud.js +1884 -210
  3. package/npm/codesign-plan.js +68 -0
  4. package/npm/empty-project-dir.js +92 -7
  5. package/npm/fleet-add-failure.js +252 -0
  6. package/npm/fleet-asset-version.js +37 -0
  7. package/npm/fleet-auth-health.js +143 -5
  8. package/npm/fleet-build-data.js +60 -5
  9. package/npm/fleet-cleanup.js +114 -9
  10. package/npm/fleet-destroy-safety.js +230 -13
  11. package/npm/fleet-early-roster.js +87 -0
  12. package/npm/fleet-effect-poll.js +110 -0
  13. package/npm/fleet-env.js +86 -0
  14. package/npm/fleet-ghcr-secret.js +129 -0
  15. package/npm/fleet-git-maintenance.js +142 -0
  16. package/npm/fleet-host-op-limiter.js +68 -0
  17. package/npm/fleet-iap-token.js +165 -0
  18. package/npm/fleet-live-status.js +40 -8
  19. package/npm/fleet-memory.js +245 -9
  20. package/npm/fleet-plans.js +98 -4
  21. package/npm/fleet-pool.js +75 -16
  22. package/npm/fleet-prewarm.js +87 -11
  23. package/npm/fleet-project-drift.js +58 -0
  24. package/npm/fleet-public-url.js +234 -0
  25. package/npm/fleet-queue.js +58 -1
  26. package/npm/fleet-reachability-debounce.js +69 -0
  27. package/npm/fleet-reachability.js +80 -0
  28. package/npm/fleet-reset.js +32 -0
  29. package/npm/fleet-running-plan.js +85 -0
  30. package/npm/fleet-session-token-cache.js +65 -0
  31. package/npm/fleet-setup-steps.js +19 -12
  32. package/npm/fleet-status-refs.js +96 -0
  33. package/npm/fleet-strand.js +39 -8
  34. package/npm/fleet-stuck-status.js +13 -7
  35. package/npm/fleet-vm-access.js +170 -0
  36. package/npm/fleet-vm-probe-target.js +282 -0
  37. package/npm/fleet-vm-readiness.js +136 -3
  38. package/npm/google-ingress.js +15 -0
  39. package/npm/ingress-invoke.js +478 -0
  40. package/npm/launch-config.js +182 -6
  41. package/npm/scenario-check.js +282 -10
  42. package/npm/scenario-handlers.js +85 -27
  43. package/npm/scenario-interactivity.js +145 -6
  44. package/npm/scenario-issues.js +13 -1
  45. package/npm/scenario-mocks.js +129 -26
  46. package/npm/scenario-playwright.js +286 -12
  47. package/npm/script-drift.js +72 -1
  48. package/npm/utils.js +37 -3
  49. package/package.json +5 -5
  50. package/ui/dist/assets/{ContainerInspector-D7VZkkaj.js → ContainerInspector-DgM0pTAx.js} +1 -1
  51. package/ui/dist/assets/EditorShell-B7Q06uJ_.js +252 -0
  52. package/ui/dist/assets/EditorShell-DP5UY20G.css +1 -0
  53. package/ui/dist/assets/{Markdown-BoLHHFXH.js → Markdown-Chgdf3PW.js} +1 -1
  54. package/ui/dist/assets/ProjectLauncherScreen-BRrEr8Ng.js +1 -0
  55. package/ui/dist/assets/ScenarioDataPanel-BeQfa28g.js +9 -0
  56. package/ui/dist/assets/{ScenarioDataPanel-DYP7pi_n.css → ScenarioDataPanel-C1LukYI6.css} +1 -1
  57. package/ui/dist/assets/{ScenarioDataPanelFullPage-CBLTGC4-.js → ScenarioDataPanelFullPage-BLqRCxQX.js} +1 -1
  58. package/ui/dist/assets/ScenarioRenderer-CIAxfHPh.js +21 -0
  59. package/ui/dist/assets/{StepsSimulator-BFldWyoX.js → StepsSimulator-CymGgfbu.js} +1 -1
  60. package/ui/dist/assets/index-BygCiJSb.css +1 -0
  61. package/ui/dist/assets/{index-QsOiOG9x.js → index-DCHqRrwO.js} +4 -4
  62. package/ui/dist/assets/{markdown-v0F0UEt3.js → markdown-C9tbsVHX.js} +1 -1
  63. package/ui/dist/assets/react-nrLBr15I.js +28 -0
  64. package/ui/dist/assets/{useEvents-DHkLJZR4.js → useEvents-S3Qk1Y_d.js} +1 -1
  65. package/ui/dist/assets/useServerIdentity-B7rI0u3O.js +1 -0
  66. package/ui/dist/index.html +4 -4
  67. package/ui/dist/open-source/codeyam-counter.png +0 -0
  68. package/ui/dist/open-source/el-carot.png +0 -0
  69. package/ui/dist/open-source/tabcommand.png +0 -0
  70. package/ui/dist/assets/EditorShell-DHhIaotd.css +0 -1
  71. package/ui/dist/assets/EditorShell-r-796N_W.js +0 -191
  72. package/ui/dist/assets/ProjectLauncherScreen-Ck-XWkQN.js +0 -1
  73. package/ui/dist/assets/ScenarioDataPanel-B9iDSUpA.js +0 -5
  74. package/ui/dist/assets/ScenarioRenderer-BhLfT-nX.js +0 -21
  75. package/ui/dist/assets/index-CIXZkwfB.css +0 -1
  76. package/ui/dist/assets/react-CSS0HapR.js +0 -28
@@ -1 +0,0 @@
1
- import{j as e}from"./markdown-v0F0UEt3.js";import{b as s}from"./react-CSS0HapR.js";function C(t){const r=t.filter(a=>a.isCurrent),o=t.filter(a=>!a.isCurrent);return[...r,...o]}function k({projects:t,loading:r=!1,error:o=null,openError:a=null,busyPath:b=null,onOpen:m,onStop:u,onScan:l,scanning:v=!1,scanResult:h=null,scanError:j=null,onCreate:p,creating:f=!1,createError:w=null,suggestedNewProjectPath:y=null,bootstrapping:d=!1}){return e.jsx("div",{className:"flex min-h-screen flex-col items-center bg-[var(--bg-deep)] px-6 py-16 text-[var(--text-primary)]",children:e.jsxs("div",{className:"w-full max-w-2xl",children:[e.jsx(T,{}),p&&e.jsx(O,{onCreate:p,creating:f,createError:w,suggestedNewProjectPath:y}),l&&e.jsx(_,{onScan:l,scanning:v,scanResult:h,scanError:j}),d&&e.jsx(L,{}),a&&e.jsx(J,{message:a}),r?e.jsx(A,{}):o?e.jsx(H,{message:o}):t.length===0?e.jsx(D,{onScan:l,scanning:v}):e.jsx("ul",{className:"flex flex-col gap-3",children:C(t).map(N=>e.jsx(E,{project:N,busy:b===N.path,onOpen:m,onStop:u},N.path))})]})})}function E({project:t,busy:r,onOpen:o,onStop:a}){const{name:b,path:m,exists:u,running:l,controlPort:v,tests:h,thumbnailUrl:j,isCurrent:p}=t;return e.jsxs("li",{className:`flex items-center justify-between gap-4 rounded-lg border bg-[var(--bg-card)] px-4 py-3 ${p?"border-[var(--accent-active)]":"border-[var(--border-default)]"} ${u?"":"opacity-60"}`,children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[e.jsx($,{src:u?j:null,name:b}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"truncate font-medium text-[var(--text-primary)]",children:b}),p&&e.jsx(R,{}),l&&e.jsx(B,{controlPort:v})]}),e.jsx("div",{className:"truncate text-xs text-[var(--text-dim)]",title:m,children:m}),u?e.jsx(G,{tests:h}):e.jsx("div",{className:"mt-1 text-xs text-[var(--accent-orange)]",children:"Folder missing — moved or deleted"})]})]}),e.jsx(F,{path:m,exists:u,running:l,busy:r,isCurrent:p,onOpen:o,onStop:a})]})}function T(){return e.jsxs("header",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-semibold text-[var(--text-primary)]",children:"Your projects"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--text-muted)]",children:"Pick a project to open in the editor, or stop one that's running."})]})}function O({onCreate:t,creating:r=!1,createError:o=null,suggestedNewProjectPath:a=null,defaultOpen:b=!1}){const[m,u]=s.useState(b),[l,v]=s.useState(""),[h,j]=s.useState(""),p=s.useRef(!1);s.useEffect(()=>{p.current||a&&l===""&&v(a)},[a,l]);const f=d=>{p.current=!0,v(d)};if(!(m||r||o!==null))return e.jsx("div",{className:"mb-3",children:e.jsx("button",{type:"button",onClick:()=>u(!0),className:"text-sm text-[var(--text-secondary)] underline-offset-2 transition hover:text-[var(--text-primary)] hover:underline",children:"+ New project…"})});const y=()=>{const d=l.trim();d.length>0&&!r&&t(d,h.trim())};return e.jsxs("div",{className:"mb-3 rounded-lg border border-[var(--border-default)] bg-[var(--bg-card)] px-4 py-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",value:l,onChange:d=>f(d.target.value),onKeyDown:d=>{d.key==="Enter"&&y()},placeholder:"/path/to/new/project","aria-label":"Folder for the new project",className:"min-w-0 flex-1 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-3 py-1.5 text-sm text-[var(--text-primary)] placeholder:text-[var(--text-dim)] focus:border-[var(--accent-active)] focus:outline-none"}),e.jsx("button",{type:"button",disabled:r||l.trim().length===0,onClick:y,className:"shrink-0 rounded bg-[var(--accent-active)] px-3 py-1.5 text-sm font-medium text-[var(--bg-deep)] transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40",children:r?"Creating…":"Create"})]}),e.jsx("input",{type:"text",value:h,onChange:d=>j(d.target.value),onKeyDown:d=>{d.key==="Enter"&&y()},placeholder:"Project name (optional)","aria-label":"Project name (optional)",className:"mt-2 w-full rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-3 py-1.5 text-sm text-[var(--text-primary)] placeholder:text-[var(--text-dim)] focus:border-[var(--accent-active)] focus:outline-none"}),o&&e.jsx("div",{className:"mt-2 whitespace-pre-line text-xs text-[var(--accent-red)]",children:o})]})}function _({onScan:t,scanning:r=!1,scanResult:o=null,scanError:a=null}){const[b,m]=s.useState(!1),[u,l]=s.useState(""),[v,h]=s.useState(!0);if(!(b||r||o!==null||a!==null))return e.jsx("div",{className:"mb-6",children:e.jsx("button",{type:"button",onClick:()=>m(!0),className:"text-sm text-[var(--text-secondary)] underline-offset-2 transition hover:text-[var(--text-primary)] hover:underline",children:"+ Add projects from a folder…"})});const p=()=>{const f=u.trim();f.length>0&&!r&&t(f,v)};return e.jsxs("div",{className:"mb-6 rounded-lg border border-[var(--border-default)] bg-[var(--bg-card)] px-4 py-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",value:u,onChange:f=>l(f.target.value),onKeyDown:f=>{f.key==="Enter"&&p()},placeholder:"/path/to/your/workspace","aria-label":"Folder to scan for projects",className:"min-w-0 flex-1 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-3 py-1.5 text-sm text-[var(--text-primary)] placeholder:text-[var(--text-dim)] focus:border-[var(--accent-active)] focus:outline-none"}),e.jsx("button",{type:"button",disabled:r||u.trim().length===0,onClick:p,className:"shrink-0 rounded bg-[var(--accent-active)] px-3 py-1.5 text-sm font-medium text-[var(--bg-deep)] transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40",children:r?"Scanning…":"Scan"})]}),e.jsxs("label",{className:"mt-2 flex items-center gap-2 text-xs text-[var(--text-muted)]",children:[e.jsx("input",{type:"checkbox",checked:v,onChange:f=>h(f.target.checked)}),"Remember this folder and re-scan it next time"]}),a&&e.jsx("div",{className:"mt-2 text-xs text-[var(--accent-red)]",children:a}),o&&!a&&e.jsxs("div",{className:"mt-2 text-xs text-[var(--accent-green)]",children:["Found ",o.found," project",o.found===1?"":"s",", ",o.added," new"]})]})}function L(){return e.jsx("div",{className:"mb-6 rounded-lg border border-[var(--border-default)] bg-[var(--bg-card)] px-4 py-3 text-sm text-[var(--text-muted)]",children:"Looking for your projects…"})}function F({path:t,exists:r,running:o,busy:a,isCurrent:b=!1,onOpen:m,onStop:u}){const l=a?"Opening…":b?"Open this project":o?"Reopen":"Open";return e.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[o&&r&&e.jsx("button",{type:"button",disabled:a,onClick:()=>u(t),className:"rounded border border-[var(--border-default)] px-3 py-1.5 text-sm text-[var(--text-secondary)] transition hover:border-[var(--accent-red)] hover:text-[var(--accent-red)] disabled:cursor-not-allowed disabled:opacity-50",children:a?"Stopping…":"Stop"}),e.jsx("button",{type:"button",disabled:!r||a,onClick:()=>m(t),className:"rounded bg-[var(--accent-active)] px-3 py-1.5 text-sm font-medium text-[var(--bg-deep)] transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40",children:l})]})}function R(){return e.jsx("span",{className:"inline-flex items-center rounded-full bg-[var(--accent-active)]/15 px-2 py-0.5 text-xs font-medium text-[var(--accent-active)]",children:"Current"})}function $({src:t,name:r}){return e.jsx("div",{className:"h-12 w-16 shrink-0 overflow-hidden rounded border border-[var(--border-subtle)] bg-[var(--bg-surface)]",children:t?e.jsx("img",{src:t,alt:`${r} preview`,className:"h-full w-full object-cover"}):e.jsx("div",{className:"flex h-full w-full items-center justify-center text-[10px] text-[var(--text-dim)]",children:"no preview"})})}function G({tests:t}){return!t||t.total===0?e.jsx("div",{className:"mt-1 text-xs text-[var(--text-dim)]",children:"No tests yet"}):e.jsxs("div",{className:"mt-1 flex items-center gap-2 text-xs",children:[e.jsxs("span",{className:"text-[var(--text-muted)]",children:[t.total," tests"]}),t.passed>0&&e.jsxs("span",{className:"text-[var(--accent-green)]",children:[t.passed," passed"]}),t.failed>0&&e.jsxs("span",{className:"text-[var(--accent-red)]",children:[t.failed," failed"]})]})}function B({controlPort:t}){return e.jsxs("span",{className:"inline-flex items-center gap-1.5 rounded-full bg-[var(--accent-green)]/15 px-2 py-0.5 text-xs text-[var(--accent-green)]",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-[var(--accent-green)]"}),"running",t?` · :${t}`:""]})}function A(){return e.jsx("div",{className:"rounded-lg border border-[var(--border-default)] bg-[var(--bg-card)] px-4 py-6 text-sm text-[var(--text-muted)]",children:"Loading projects…"})}function H({message:t}){return e.jsxs("div",{className:"whitespace-pre-line rounded-lg border border-[var(--accent-red)]/40 bg-[var(--bg-card)] px-4 py-6 text-sm text-[var(--accent-red)]",children:["Couldn't load projects: ",t]})}function J({message:t}){return e.jsx("div",{className:"mb-3 whitespace-pre-line rounded-lg border border-[var(--accent-red)]/40 bg-[var(--bg-card)] px-4 py-3 font-mono text-xs text-[var(--accent-red)]",children:t})}function D({onScan:t,scanning:r=!1}={}){return e.jsx("div",{className:"rounded-lg border border-dashed border-[var(--border-default)] bg-[var(--bg-card)] px-4 py-10 text-center",children:e.jsx("p",{className:"text-sm text-[var(--text-muted)]",children:t?e.jsxs(e.Fragment,{children:["No projects yet."," ",r?"Scanning for projects…":"Add a folder above to scan for projects already on disk, or run"," ",!r&&e.jsx("code",{className:"rounded bg-[var(--bg-input)] px-1.5 py-0.5 text-xs text-[var(--text-secondary)]",children:"codeyam-editor init"}),!r&&" in a project folder."]}):e.jsxs(e.Fragment,{children:["No projects yet. Run"," ",e.jsx("code",{className:"rounded bg-[var(--bg-input)] px-1.5 py-0.5 text-xs text-[var(--text-secondary)]",children:"codeyam-editor init"})," ","in a project folder to get started."]})})})}const ee=Object.freeze(Object.defineProperty({__proto__:null,CurrentBadge:R,ProjectBootstrapBanner:L,ProjectCreateForm:O,ProjectLauncher:k,ProjectLauncherEmpty:D,ProjectLauncherError:H,ProjectLauncherHeader:T,ProjectLauncherLoading:A,ProjectOpenError:J,ProjectRow:E,ProjectRowActions:F,ProjectScanForm:_,RunningBadge:B,Thumbnail:$,sortCurrentFirst:C},Symbol.toStringTag,{value:"Module"})),Q=3e3;function W(){const[t,r]=s.useState(null),[o,a]=s.useState(null),[b,m]=s.useState(null),[u,l]=s.useState(null),[v,h]=s.useState(!1),[j,p]=s.useState(null),[f,w]=s.useState(null),[y,d]=s.useState(!1),[N,P]=s.useState(null),[K,M]=s.useState(!1),[z,I]=s.useState(null),g=s.useCallback(async()=>{try{const c=await fetch("/api/projects");if(!c.ok)throw new Error(`HTTP ${c.status}`);const n=await c.json();r(Array.isArray(n.projects)?n.projects:[]),I(typeof n.suggestedNewProjectPath=="string"?n.suggestedNewProjectPath:null),a(null)}catch(c){a(c instanceof Error?c.message:"Failed to load projects")}},[]),S=s.useCallback(async()=>{try{const c=await fetch("/api/projects/scan-status");if(!c.ok)return;const i=!!(await c.json()).running;M(x=>(x&&!i&&g(),i))}catch{}},[g]);s.useEffect(()=>{g(),S();const c=setInterval(()=>{document.visibilityState==="visible"&&(g(),S())},Q),n=()=>{document.visibilityState==="visible"&&(g(),S())};return document.addEventListener("visibilitychange",n),()=>{clearInterval(c),document.removeEventListener("visibilitychange",n)}},[g,S]);const U=s.useCallback(async(c,n)=>{h(!0),w(null),p(null);try{const i=await fetch("/api/projects/scan",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({root:c,remember:n})}),x=await i.json().catch(()=>({}));if(!i.ok)throw new Error(typeof x.error=="string"?x.error:`HTTP ${i.status}`);r(Array.isArray(x.projects)?x.projects:[]),p({found:x.found??0,added:x.added??0})}catch(i){w(i instanceof Error?i.message:"Scan failed")}finally{h(!1)}},[]),V=s.useCallback(async(c,n)=>{d(!0),P(null);try{const i=await fetch("/api/projects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n?{path:c,name:n}:{path:c})}),x=await i.json().catch(()=>({}));if(!i.ok)throw new Error(typeof x.error=="string"?x.error:`HTTP ${i.status}`);if(typeof x.url=="string"){window.location.href=x.url;return}throw new Error("create did not return a url")}catch(i){P(i instanceof Error?i.message:"Failed to create project"),d(!1)}},[]),Y=s.useCallback(async c=>{l(c),m(null);try{const n=await fetch("/api/projects/open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:c})}),i=await n.json().catch(()=>({}));if(!n.ok)throw new Error(typeof i.error=="string"?i.error:`HTTP ${n.status}`);const{url:x}=i;if(typeof x=="string"){window.location.href=x;return}throw new Error("open did not return a url")}catch(n){m(n instanceof Error?n.message:"Failed to open project"),l(null)}},[]),q=s.useCallback(async c=>{l(c);try{const n=await fetch("/api/projects/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:c})});if(!n.ok)throw new Error(`HTTP ${n.status}`);await g()}catch(n){a(n instanceof Error?n.message:"Failed to stop project")}finally{l(null)}},[g]);return e.jsx(k,{projects:t??[],loading:t===null&&o===null,error:o,openError:b,busyPath:u,onOpen:Y,onStop:q,onScan:U,scanning:v,scanResult:j,scanError:f,onCreate:V,creating:y,createError:N,suggestedNewProjectPath:z,bootstrapping:K})}const te=Object.freeze(Object.defineProperty({__proto__:null,ProjectLauncherScreen:W},Symbol.toStringTag,{value:"Module"}));export{R as C,W as P,B as R,$ as T,te as _,J as a,D as b,H as c,A as d,T as e,L as f,O as g,_ as h,F as i,E as j,k,ee as l};
@@ -1,5 +0,0 @@
1
- import{j as n}from"./markdown-v0F0UEt3.js";import{b as l}from"./react-CSS0HapR.js";import{u as er}from"./useEvents-DHkLJZR4.js";import{r as tr,a as rr}from"./xterm--24IGk-x.js";import{l as z,c as nr}from"./index-QsOiOG9x.js";const me=4e3;function Re(e){let t;try{t=JSON.stringify(e,null,2)}catch{t=String(e)}return t.length>me?`${t.slice(0,me)}
2
- … (truncated, ${t.length-me} more chars)`:t}function ar({slug:e,scenarioName:t,seedTabs:r,mockEntries:a,selectedMock:s,selectedSeedTab:o,selectedSeedRows:c}){const i=[],p=t??e;if(i.push(`# Edit Scenario Data: "${p}"`),i.push(""),i.push(`**Slug**: ${e}`),i.push(`**Scenario file**: .codeyam/scenarios/${e}.json`),i.push(""),i.push("## Scenario overview"),r.length>0){i.push("### Seed & Local tables");for(const f of r){const g=f.category?` (${f.category})`:"";i.push(`- **${f.label}**${g} — dataKey \`${f.dataKey}\``)}i.push("")}if(a.length>0){i.push("### HTTP mocks");const f=new Map;for(const g of a){const h=f.get(g.source)??[];h.push(g),f.set(g.source,h)}for(const[g,h]of f){i.push(`**${g}** (${h.length}):`);for(const d of h)i.push(`- \`${d.method} ${d.pathPattern}\``)}i.push("")}if(s){const f=`${s.method} ${s.pathPattern}`;i.push(`## Currently viewing: mock \`${f}\``),i.push(`- **Source**: ${s.source}`),s.status!==void 0&&i.push(`- **Status**: ${s.status}`);const g=s.headers??{},h=Object.entries(g);if(h.length>0){i.push("- **Headers**:");for(const[d,m]of h)i.push(` - \`${d}: ${m}\``)}s.body!==void 0&&s.body!==null?(i.push("- **Body**:"),i.push("```json"),i.push(Re(s.body)),i.push("```")):i.push("- **Body**: (empty)"),i.push("")}else if(o){if(i.push(`## Currently viewing: seed table **${o.label}**`),i.push(`- **dataKey**: \`${o.dataKey}\``),o.category&&i.push(`- **Category**: ${o.category}`),o.description&&i.push(`- **Description**: ${o.description}`),o.schemaFields&&o.schemaFields.length>0){i.push("- **Schema**:");for(const f of o.schemaFields){const g=f.isId?" (PK)":"";i.push(` - \`${f.name}\`: ${f.type}${g}`)}}c&&c.length>0?(i.push(`- **Rows** (${c.length}):`),i.push("```json"),i.push(Re(c)),i.push("```")):i.push("- **Rows**: (none yet)"),i.push("")}return i.push("## Your task"),i.push("The user is looking at the Scenario Data Panel and wants your help adjusting its data. Ask what change they'd like to make."),i.push(""),i.push("Typical edits:"),i.push('- Tweak an HTTP mock body, status, or headers → update `mocks.http["METHOD /path"]` in the scenario JSON'),i.push("- Add or remove seed rows → update the `seed` section"),i.push("- Adjust `localStorage` values → update the `localStorage` section"),i.push(""),i.push("To save changes:"),i.push("1. Write the updated scenario JSON to `.codeyam/tmp/scenario.json`"),i.push("2. Run: `codeyam-editor editor register @.codeyam/tmp/scenario.json`"),i.push("3. The editor will reload automatically and the panel will reflect the new data."),i.join(`
3
- `)}const _e=new Set;let Z=null;const sr=150;function sa(e){return _e.add(e),()=>{_e.delete(e)}}function J(){Z&&clearTimeout(Z),Z=setTimeout(()=>{Z=null;for(const e of _e)e()},sr)}const Se=new Set;function oa(e){for(const t of Se)t(e)}function or(e){return Se.add(e),()=>{Se.delete(e)}}function ir({onSelect:e,onFocus:t}){l.useEffect(()=>or(({routeKey:r,jsonPath:a})=>{e(r),t(a)}),[e,t])}const Ne="claude";function q(e){switch(e){case"codex":return"Codex";case"gemini":return"Gemini";default:return"Claude"}}const cr=3e3;function Ue(){const[e,t]=l.useState(null),[r,a]=l.useState(!0),[s,o]=l.useState(null),c=l.useRef(null),i=l.useCallback(async()=>{try{const p=await fetch("/api/config");if(!p.ok)throw new Error(`HTTP ${p.status}`);const f=await p.json(),g={projectTitle:f.projectTitle??null,projectDescription:f.projectDescription??null,provider:f.provider??Ne,port:f.port??3e3,previewOrigin:f.previewOrigin??null,screenSizes:f.screenSizes??{},defaultScreenSize:f.defaultScreenSize??null,apps:f.apps??[],admin:f.admin??!1,mobileTerminalCommands:f.mobileTerminalCommands??[],launcherUrl:f.launcherUrl??null,projectCount:f.projectCount??0},h=JSON.stringify(g);h!==c.current&&(c.current=h,t(g)),o(null)}catch(p){o(p instanceof Error?p.message:"Failed to load config")}finally{a(!1)}},[]);return l.useEffect(()=>{i();const p=setInterval(()=>{i()},cr);return()=>clearInterval(p)},[i]),{config:e,apps:(e==null?void 0:e.apps)??[],loading:r,error:s,refetch:i}}async function se(e){try{const t=await e.json();if(t.error)return t.error}catch{}return`Request failed (${e.status})`}async function lr(e,t=null){const r=t!=null?`?since_ms=${encodeURIComponent(t)}`:"",s=await(await fetch(`/api/mock-panel/${encodeURIComponent(e)}${r}`)).json();if("error"in s)throw new Error(s.error);return s}async function De(e,t){const r=`/api/scenarios/${encodeURIComponent(e)}/mocks/${encodeURIComponent(t.routeKey)}`,a=await fetch(r,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:t.status,body:t.body,headers:t.headers})});if(!a.ok)throw new Error(await se(a))}async function dr(e,t){const r=`/api/scenarios/${encodeURIComponent(e)}/mocks/${encodeURIComponent(t)}`,a=await fetch(r,{method:"DELETE"});if(!a.ok)throw new Error(await se(a))}async function ur(e,t){const r=`/api/scenarios/${encodeURIComponent(e)}/mocks/${encodeURIComponent(t)}/passthrough`,a=await fetch(r,{method:"POST"});if(!a.ok)throw new Error(await se(a))}function V(e){return e.kind==="shared"?`shared:${e.slug}`:e.kind}async function fr(e){const t=await fetch("/api/mocks/save-scoped",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),r=await t.json();if(!t.ok||"success"in r&&r.success===!1)throw new Error("error"in r?r.error:`Save failed (${t.status})`);return r}async function pr(e,t,r){const a=new URLSearchParams({scenarioSlug:e,routeKey:t,scope:V(r)}),s=await fetch(`/api/mocks/save-scope-impact?${a.toString()}`);if(!s.ok)throw new Error(await se(s));return(await s.json()).impactedScenarios??[]}function hr(){const[e,t]=l.useState(null),[r,a]=l.useState(null),s=l.useRef(null),o=async()=>{try{const i=await fetch("/api/editor-dev-server");if(!i.ok)throw new Error(`Failed to fetch dev server status: ${i.statusText}`);const p=await i.json(),f=JSON.stringify(p);if(f===s.current){a(null);return}s.current=f,t(p),a(null)}catch(i){a(i instanceof Error?i.message:String(i))}};return l.useEffect(()=>{o();const i=setInterval(o,1e3);return()=>clearInterval(i)},[]),{status:e,error:r,restart:async()=>{try{const i=await fetch("/api/editor-dev-server",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"restart"})});if(!i.ok)throw new Error(`Failed to restart dev server: ${i.statusText}`);o()}catch(i){a(i instanceof Error?i.message:String(i))}}}}function mr(e){const[t,r]=l.useState([]),[a,s]=l.useState(null),[o,c]=l.useState(!1),[i,p]=l.useState(null),{events:f}=er(),{status:g}=hr(),h=(g==null?void 0:g.lastIframeLoadedAtMs)??null,d=l.useCallback(async()=>{if(!e){r([]),s(null);return}c(!0),p(null);try{const u=await lr(e,h);r(u.entries),s(u.defaultSlug)}catch(u){p(u instanceof Error?u.message:"Failed to load mocks")}finally{c(!1)}},[e,h]);l.useEffect(()=>{d()},[d]),l.useEffect(()=>{const u=f[f.length-1];!u||u.type!=="http_request"||d()},[f,d]);const m=l.useCallback(async u=>{e&&(await De(e,u),await d())},[e,d]),x=l.useCallback(async u=>{e&&(u.scope.kind==="scenario"?await De(e,{routeKey:u.routeKey,status:u.status,body:u.body,headers:u.headers}):await fr({scenarioSlug:e,routeKey:u.routeKey,scope:u.scope,status:u.status,body:u.body,headers:u.headers}),await d())},[e,d]),b=l.useCallback(async u=>{e&&(await dr(e,u),await d())},[e,d]),y=l.useCallback(async u=>{e&&(await ur(e,u),await d())},[e,d]);return{entries:t,defaultSlug:a,loading:o,error:i,refresh:d,upsert:m,upsertScoped:x,remove:b,setPassthrough:y}}function xr(e){const t={};for(const[r,a]of Object.entries(e))if(typeof a=="string")try{const s=JSON.parse(a);Array.isArray(s)?t[r]=s:typeof s=="object"&&s!==null&&(t[r]=[s])}catch{}else Array.isArray(a)&&(t[r]=a);return t}function br(e,t){return e.length===0||t.length===0?!1:e.filter(a=>t.includes(a)).length>=Math.min(e.length,t.length)*.5}function gr(e){return e==null?"null":typeof e=="number"?Number.isInteger(e)?"int4":"float":typeof e=="boolean"?"bool":typeof e=="object"?Array.isArray(e)?"array":"json":"text"}function yr(e,t){return e.length>0?Object.keys(e[0]):t?t.map(r=>r.name):[]}function vr(e,t,r){const a=new Map((r||[]).map(o=>[o.name,o.type])),s={};for(const o of e)s[o]=a.get(o)||(t.length>0?gr(t[0][o]):"text");return s}function jr(e,t){var r;return((r=t==null?void 0:t.find(a=>a.isId))==null?void 0:r.name)||e.find(a=>a==="id")||null}function _r(e,t){const{_metadata:r,...a}=t,s=a.localStorage&&typeof a.localStorage=="object"&&!Array.isArray(a.localStorage)?xr(a.localStorage):{},o={};if(a.seed&&typeof a.seed=="object"&&!Array.isArray(a.seed))for(const[d,m]of Object.entries(a.seed))Array.isArray(m)&&(o[d]=m);const c={},i=[],p=new Set,f=new Set,g=new Set;for(const d of e){const m=d.name.charAt(0).toLowerCase()+d.name.slice(1),x=d.fields.map(u=>u.name);let b=null,y=[];for(const u of[d.name,m,`${m}s`])if(u in a&&Array.isArray(a[u])){b=u,y=a[u],f.add(u);break}if(!b){for(const u of[d.name,m,`${m}s`])if(u in o){b=u,y=o[u],g.add(u),u in s&&p.add(u);break}}if(!b){for(const u of[d.name,m,`${m}s`])if(u in s){b=m,y=s[u],p.add(u);break}}if(!b){for(const[u,v]of Object.entries(s))if(!p.has(u)&&v.length>0&&br(x,Object.keys(v[0]))){b=m,y=v,p.add(u);break}}b||(b=m),c[b]=y,i.push({label:d.name,dataKey:b,category:d.category,description:d.description,schemaFields:d.fields.map(u=>({name:u.name,type:u.type,isId:u.isId??!1}))})}const h=new Set(["name","id","url","dimensions","componentName","scenarioType","pageFilePath","routeName","description","props","env"]);for(const[d,m]of Object.entries(a))d==="_metadata"||d==="localStorage"||d==="seed"||d==="type"||d==="mocks"||h.has(d)||f.has(d)||Sr(m)&&(c[d]=m,i.push({label:d,dataKey:d}));for(const[d,m]of Object.entries(o))g.has(d)||(c[d]=m,i.push({label:d,dataKey:d}));for(const[d,m]of Object.entries(s))p.has(d)||(c[d]=m,i.push({label:d,dataKey:d}));return{data:c,tabs:i}}function Ie(e){return e==="null"?null:e==="true"?!0:e==="false"?!1:e===""?"":isNaN(Number(e))?e:Number(e)}function Sr(e){return Array.isArray(e)&&e.length>0&&typeof e[0]=="object"&&e[0]!==null}function wr(e){if(typeof e!="object"||e===null||!("props"in e))return null;const t=e.props;return typeof t!="object"||t===null||Array.isArray(t)?null:t}function kr(e){if(typeof e!="object"||e===null||!("browserState"in e))return null;const t=e.browserState;return typeof t!="object"||t===null||Array.isArray(t)?null:t}function Cr(e,t){const r=new Set;for(const a of t){const s=e[a.dataKey];Array.isArray(s)&&s.length>0&&r.add(a.dataKey)}return r}function Nr(e){if(typeof e=="object"&&e!==null&&"shares"in e){const t=e.shares;if(Array.isArray(t))return t.filter(r=>typeof r=="string")}return[]}function Er(e){const[t,r]=l.useState({data:null,tableTabs:[],scenarioOwnedDataKeys:new Set,shares:[],props:null,browserState:null,loading:!0,error:null});return l.useEffect(()=>{r(a=>({...a,loading:!0,error:null})),Promise.all([fetch("/api/data-structure").then(a=>a.json()).catch(()=>[]),fetch(`/api/scenarios/${encodeURIComponent(e)}`).then(a=>{if(!a.ok)throw new Error(`HTTP ${a.status}`);return a.json()})]).then(([a,s])=>{const o=_r(Array.isArray(a)?a:[],s);r({data:o.data,tableTabs:o.tabs,scenarioOwnedDataKeys:Cr(o.data,o.tabs),shares:Nr(s),props:wr(s),browserState:kr(s),loading:!1,error:null})}).catch(a=>r({data:null,tableTabs:[],scenarioOwnedDataKeys:new Set,shares:[],props:null,browserState:null,loading:!1,error:a instanceof Error?a.message:"Failed to load"}))},[e]),t}function Ee(e,t=""){return`/api/scenarios/${encodeURIComponent(e)}/draft${t}`}async function Tr(e){const t=await fetch(Ee(e,"/status"));if(!t.ok)return{isDirty:!1,diffSummary:null};const r=await t.json();return{isDirty:!!r.isDirty,diffSummary:r.diffSummary??null}}async function Or(e){const t=await fetch(Ee(e,"/commit"),{method:"POST"});if(!t.ok)throw new Error(`Save failed (${t.status})`)}async function Mr(e){const t=await fetch(Ee(e),{method:"DELETE"});if(!t.ok)throw new Error(`Cancel failed (${t.status})`)}function Ar({slug:e,onPreviewReload:t}){const[r,a]=l.useState(!1),[s,o]=l.useState(null),[c,i]=l.useState(!1),[p,f]=l.useState(!1),[g,h]=l.useState(null),d=l.useRef(null),m=l.useCallback(async()=>{if(!e){a(!1),o(null);return}try{const v=await Tr(e);a(v.isDirty),o(v.diffSummary)}catch{}},[e]);l.useEffect(()=>{m()},[m]),l.useEffect(()=>{if(!r)return;const v=C=>{C.preventDefault(),C.returnValue=""};return window.addEventListener("beforeunload",v),()=>window.removeEventListener("beforeunload",v)},[r]);const x=l.useCallback(()=>{d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{m()},100)},[m]),b=l.useCallback(async()=>{if(e){i(!0),h(null);try{await Or(e),a(!1),o(null),t&&t()}catch(v){h(v instanceof Error?v.message:"Save failed")}finally{i(!1)}}},[e,t]),y=l.useCallback(async()=>{if(e){f(!0),h(null);try{await Mr(e),a(!1),o(null),t&&t()}catch(v){h(v instanceof Error?v.message:"Cancel failed")}finally{f(!1)}}},[e,t]),u=l.useCallback(v=>r?window.confirm(v):!0,[r]);return{isDirty:r,saving:c,cancelling:p,error:g,diffSummary:s,save:b,cancel:y,markDirty:x,confirmIfDirty:u}}const Pr={scenario:"Scenario",shared:"Shared",default:"Defaults","catalog-only":"Observed only",passthrough:"Passthrough"},Rr={scenario:null,shared:null,default:null,"catalog-only":"Observed during live traffic but not mocked yet. Promote it to a scenario mock to capture and edit the response.",passthrough:null};function We(e){return Pr[e]??e}function Dr(e){return Rr[e]??null}const Ir={scenario:"bg-emerald-500/15 text-emerald-300 border-emerald-500/40",shared:"bg-violet-500/15 text-violet-300 border-violet-500/40",default:"bg-[#D7FF63]/15 text-[#D7FF63] border-[#D7FF63]/40","catalog-only":"bg-slate-500/15 text-slate-300 border-slate-500/40",passthrough:"bg-zinc-500/15 text-zinc-300 border-zinc-500/40"};function Te({source:e}){const t=Dr(e);return n.jsx("span",{className:`px-1.5 py-0.5 rounded border ${Ir[e]}`,title:t??`source: ${e}`,children:We(e)})}const ia=Object.freeze(Object.defineProperty({__proto__:null,MockSourceBadge:Te},Symbol.toStringTag,{value:"Module"}));function Je({label:e,scenarioCount:t,inheritedCount:r,expanded:a,onToggle:s}){const o=r===0;return n.jsxs("h3",{className:"px-3 pb-1 text-[10px] font-semibold uppercase tracking-wider text-[var(--text-dim)]",children:[n.jsx("div",{className:"mb-0.5",children:e}),n.jsxs("div",{className:"flex items-center gap-1 normal-case tracking-normal font-normal",children:[n.jsxs("span",{children:[t," scenario-specific"]}),n.jsx("span",{"aria-hidden":!0,children:"·"}),n.jsxs("button",{type:"button",onClick:s,disabled:o,"aria-expanded":a,className:`inline-flex items-center gap-0.5 ${o?"cursor-default text-[var(--text-dim)]":"cursor-pointer hover:text-[var(--text-primary)]"}`,children:[n.jsx("span",{"aria-hidden":!0,className:"inline-block w-2 text-[9px]",children:o?"":a?"▾":"▸"}),n.jsxs("span",{children:[r," inherited from default"]})]})]})]})}const ca=Object.freeze(Object.defineProperty({__proto__:null,SidebarGroupOverrideHeader:Je},Symbol.toStringTag,{value:"Module"}));function Xe({children:e}){return n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"mx-3 my-1 border-t border-[var(--border-subtle)]"}),n.jsx("div",{className:"px-3 pb-1 text-[9px] uppercase tracking-wider text-[var(--text-dim)]",children:"Inherited from default"}),e]})}const la=Object.freeze(Object.defineProperty({__proto__:null,SidebarInheritedSection:Xe},Symbol.toStringTag,{value:"Module"}));function qe({slug:e}){return n.jsx("span",{className:"px-1 py-0.5 rounded border text-[9px] font-mono bg-violet-500/10 text-violet-300 border-violet-500/30",title:`from shared-data set: ${e}`,children:e})}const da=Object.freeze(Object.defineProperty({__proto__:null,MockSharedSlugBadge:qe},Symbol.toStringTag,{value:"Module"})),$r={GET:"text-emerald-400",POST:"text-[#D7FF63]",PUT:"text-amber-400",PATCH:"text-purple-400",DELETE:"text-red-400"};function Ge({entry:e,routeKey:t,active:r,onSelect:a}){const s=$r[e.method]??"text-[var(--text-muted)]";return n.jsxs("button",{onClick:a,className:`w-full text-left px-3 py-1.5 text-xs flex items-center gap-2 border-l-2 transition-colors cursor-pointer ${r?"bg-[var(--accent-blue)]/10 border-[var(--accent-blue)] text-[var(--text-primary)]":"border-transparent text-[var(--text-muted)] hover:bg-[var(--bg-card)] hover:text-[var(--text-primary)]"}`,title:t,children:[n.jsx("span",{className:`font-mono text-[9px] font-semibold ${s}`,children:e.method}),n.jsx("span",{className:"truncate flex-1 font-mono",children:e.pathPattern}),e.source==="shared"&&e.sharedSlug&&n.jsx(qe,{slug:e.sharedSlug})]})}const ua=Object.freeze(Object.defineProperty({__proto__:null,SidebarMockEntryRow:Ge},Symbol.toStringTag,{value:"Module"})),Lr=["scenario","shared","default","catalog-only","passthrough"];function U(e){return`${e.method} ${e.pathPattern}`}function Qe({seedTabs:e,mockEntries:t,selection:r,onSelect:a,overrides:s}){const o=new Map;for(const c of t){const i=o.get(c.source)??[];i.push(c),o.set(c.source,i)}return n.jsxs("nav",{className:"w-56 shrink-0 border-r border-[var(--border-subtle)] bg-[var(--bg-deep)] overflow-y-auto",children:[n.jsxs(te,{label:"Browser Environment",count:4,emptyHint:"",children:[n.jsx(X,{label:"Cookies",active:(r==null?void 0:r.kind)==="browser"&&r.tab==="cookies",onSelect:()=>a({kind:"browser",tab:"cookies"})}),n.jsx(X,{label:"Local Storage",active:(r==null?void 0:r.kind)==="browser"&&r.tab==="localStorage",onSelect:()=>a({kind:"browser",tab:"localStorage"})}),n.jsx(X,{label:"Session Storage",active:(r==null?void 0:r.kind)==="browser"&&r.tab==="sessionStorage",onSelect:()=>a({kind:"browser",tab:"sessionStorage"})}),n.jsx(X,{label:"Request Headers",active:(r==null?void 0:r.kind)==="browser"&&r.tab==="headers",onSelect:()=>a({kind:"browser",tab:"headers"})})]}),n.jsx(te,{label:"Seed & Local",count:e.length,emptyHint:"No seed or localStorage data",override:s?{scenarioCount:s.scenarioSeedCount,inheritedCount:s.inheritedSeedCount,renderInherited:()=>$e({tabs:s.inheritedSeedTabs,selection:r,onSelect:a})}:void 0,children:$e({tabs:e,selection:r,onSelect:a})}),n.jsx(te,{label:"Mock APIs",count:t.length,emptyHint:"No HTTP mocks registered",override:s?{scenarioCount:s.scenarioMockCount,inheritedCount:s.inheritedMockCount,renderInherited:()=>Le({entries:s.inheritedMockEntries,selection:r,onSelect:a})}:void 0,children:Le({entries:t,grouped:o,selection:r,onSelect:a})})]})}function $e({tabs:e,selection:t,onSelect:r}){return e.map(a=>{const s=(t==null?void 0:t.kind)==="seed"&&t.dataKey===a.dataKey;return n.jsxs("button",{onClick:()=>r({kind:"seed",dataKey:a.dataKey}),className:`w-full text-left px-3 py-1.5 text-xs flex items-center gap-2 border-l-2 transition-colors cursor-pointer ${s?"bg-[var(--accent-active)]/10 border-[var(--accent-active)] text-[var(--text-primary)]":"border-transparent text-[var(--text-muted)] hover:bg-[var(--bg-card)] hover:text-[var(--text-primary)]"}`,children:[n.jsx("span",{className:"truncate flex-1",children:a.label}),a.category&&n.jsx("span",{className:"text-[9px] uppercase tracking-wide text-[var(--text-dim)]",children:a.category==="mock-api"?"API":a.category})]},a.dataKey)})}function X({label:e,active:t,onSelect:r}){return n.jsxs("button",{onClick:r,className:`w-full text-left px-3 py-1.5 text-xs flex items-center gap-2 border-l-2 transition-colors cursor-pointer ${t?"bg-[var(--accent-active)]/10 border-[var(--accent-active)] text-[var(--text-primary)]":"border-transparent text-[var(--text-muted)] hover:bg-[var(--bg-card)] hover:text-[var(--text-primary)]"}`,children:[n.jsx("span",{className:"truncate flex-1",children:e}),n.jsx("span",{className:"text-[9px] uppercase tracking-wide text-[var(--text-dim)]",children:"ENV"})]})}function Le({entries:e,grouped:t,selection:r,onSelect:a}){const s=t??Br(e);return Lr.flatMap(o=>{const c=s.get(o)??[];return c.length===0?[]:[n.jsxs("div",{className:"px-3 pt-2 pb-1 text-[9px] uppercase tracking-wider text-[var(--text-dim)] font-semibold flex items-center gap-1.5",children:[We(o),n.jsx(Te,{source:o})]},`hdr-${o}`),...c.map(i=>{const p=U(i),f=(r==null?void 0:r.kind)==="mock"&&r.routeKey===p;return n.jsx(Ge,{entry:i,routeKey:p,active:f,onSelect:()=>a({kind:"mock",routeKey:p})},p)})]})}function Br(e){const t=new Map;for(const r of e){const a=t.get(r.source)??[];a.push(r),t.set(r.source,a)}return t}function te({label:e,count:t,emptyHint:r,children:a,override:s}){const[o,c]=l.useState(!1);if(s){const{scenarioCount:i,inheritedCount:p,renderInherited:f}=s,g=i+(o?p:0);return n.jsxs("section",{className:"py-2",children:[n.jsx(Je,{label:e,scenarioCount:i,inheritedCount:p,expanded:o,onToggle:()=>c(h=>!h)}),g===0?n.jsx("p",{className:"px-3 py-1 text-[10px] italic text-[var(--text-dim)]",children:r}):n.jsxs("div",{children:[a,o&&p>0&&n.jsx(Xe,{children:f()})]})]})}return n.jsxs("section",{className:"py-2",children:[n.jsxs("h3",{className:"px-3 pb-1 text-[10px] font-semibold uppercase tracking-wider text-[var(--text-dim)] flex items-center justify-between",children:[n.jsx("span",{children:e}),n.jsx("span",{children:t})]}),t===0?n.jsx("p",{className:"px-3 py-1 text-[10px] italic text-[var(--text-dim)]",children:r}):n.jsx("div",{children:a})]})}const fa=Object.freeze(Object.defineProperty({__proto__:null,BrowserStateButton:X,ScenarioDataPanelSidebar:Qe,SidebarGroup:te,routeKeyFor:U},Symbol.toStringTag,{value:"Module"}));function Fr({seedTabs:e,mockEntries:t,initialSection:r,selection:a,setSelection:s}){l.useEffect(()=>{if(a)return;const o=r==="mocks",c=r==="seed";if(o&&t.length>0){s({kind:"mock",routeKey:U(t[0])});return}if(c&&e.length>0){s({kind:"seed",dataKey:e[0].dataKey});return}e.length>0?s({kind:"seed",dataKey:e[0].dataKey}):t.length>0&&s({kind:"mock",routeKey:U(t[0])})},[r,t,e,a,s])}const we={state:"unknown",provider:Ne,credsPresent:!0,reason:null,expiresAt:null,probeInFlight:!1,probeAttempts:0,backendFieldAbsent:!1};function Kr(e){if(e==null)return{...we,backendFieldAbsent:!0};if(typeof e!="object")return we;const t=e,r=t.state==="authenticated"||t.state==="needs-login"||t.state==="unknown"?t.state:"unknown",a=t.provider==="claude"||t.provider==="codex"||t.provider==="gemini"?t.provider:Ne,s=typeof t.credsPresent=="boolean"?t.credsPresent:!0,o=t.reason==="token-expired"||t.reason==="api-401"||t.reason==="no-credentials"||t.reason==="probe-timeout"?t.reason:null,c=typeof t.tokenExpiresAt=="string"?t.tokenExpiresAt:typeof t.expiresAt=="string"?t.expiresAt:null,i=typeof t.probeInFlight=="boolean"?t.probeInFlight:!1,p=typeof t.probeAttempts=="number"&&Number.isFinite(t.probeAttempts)&&t.probeAttempts>=0?t.probeAttempts:0;return{state:r,provider:a,credsPresent:s,reason:o,expiresAt:c,probeInFlight:i,probeAttempts:p,backendFieldAbsent:!1}}const zr=1e3;function Hr(){const[e,t]=l.useState(we),r=l.useRef(e.state);r.current=e.state;const a=l.useCallback(async()=>{try{const s=await fetch("/api/config");if(!s.ok)return;const o=await s.json();t(Kr(o.providerAuth))}catch{}},[]);return l.useEffect(()=>{a()},[a]),l.useEffect(()=>{if(e.state!=="unknown")return;const s=window.setInterval(()=>{r.current==="unknown"&&a()},zr);return()=>window.clearInterval(s)},[e.state,a]),l.useEffect(()=>{const s=()=>{t(o=>({...o,state:"needs-login"})),a()};return window.addEventListener("agent-auth-required",s),()=>window.removeEventListener("agent-auth-required",s)},[a]),l.useEffect(()=>{const s=()=>{t(o=>({...o,state:"authenticated"})),a()};return window.addEventListener("agent-auth-resolved",s),()=>window.removeEventListener("agent-auth-resolved",s)},[a]),{state:e.state,provider:e.provider,credsPresent:e.credsPresent,reason:e.reason,expiresAt:e.expiresAt,probeInFlight:e.probeInFlight,probeAttempts:e.probeAttempts,backendFieldAbsent:e.backendFieldAbsent,refresh:a}}var Yr=tr(),Vr=rr();function Ur(e){const t=window.location.protocol==="https:"?"wss:":"ws:",r=new URL(`${t}//${window.location.host}/ws/terminal`);return e!=null&&e.provider&&r.searchParams.set("provider",e.provider),e!=null&&e.mode&&r.searchParams.set("mode",e.mode),e!=null&&e.sessionId&&r.searchParams.set("sessionId",e.sessionId),e!=null&&e.chatKey&&r.searchParams.set("chatKey",e.chatKey),e!=null&&e.cols&&e.cols>0&&r.searchParams.set("cols",String(e.cols)),e!=null&&e.rows&&e.rows>0&&r.searchParams.set("rows",String(e.rows)),r.toString()}async function Wr(e){try{if(typeof navigator<"u"&&navigator.clipboard&&typeof navigator.clipboard.writeText=="function")return await navigator.clipboard.writeText(e),!0}catch{}return Jr(e)}function Jr(e){var s;if(typeof document>"u"||!document.body)return!1;const t=document.activeElement,r=document.createElement("textarea");r.value=e,r.setAttribute("readonly",""),r.style.position="fixed",r.style.top="0",r.style.left="-9999px",r.style.opacity="0",r.style.pointerEvents="none",document.body.appendChild(r);let a=!1;try{r.focus(),r.select(),a=document.execCommand("copy")}catch{a=!1}finally{r.remove(),(s=t==null?void 0:t.focus)==null||s.call(t)}return a}function Xr(){if(typeof navigator>"u")return!1;const e=navigator.platform??"";return e?/Mac|iPhone|iPad|iPod/i.test(e):/Mac|iPhone|iPad|iPod/i.test(navigator.userAgent??"")}function qr(e,t,r={}){const a=r.isMac??Xr(),s=r.onError,o=r.onCopy;let c=null;async function i(x){if(!x)return!1;let b=!1;try{b=await Wr(x)}catch(y){return s==null||s(Be("copy",y)),!1}if(b){try{e.clearSelection()}catch{}o==null||o()}else s==null||s(Qr("copy"));return b}async function p(){return e.hasSelection()?i(e.getSelection()):!1}async function f(){try{const x=await navigator.clipboard.readText();x&&e.paste(x)}catch(x){s==null||s(Be("paste",x))}}function g(x){return x.type!=="keydown"?!0:a?(x.metaKey&&!x.ctrlKey&&!x.altKey&&x.key.toLowerCase()==="c"||x.ctrlKey&&!x.metaKey&&!x.altKey&&!x.shiftKey&&x.key.toLowerCase()==="c")&&e.hasSelection()?(p(),!1):!0:(x.ctrlKey&&x.shiftKey&&!x.metaKey&&!x.altKey&&x.key.toLowerCase()==="c"||x.ctrlKey&&!x.shiftKey&&!x.metaKey&&!x.altKey&&x.key.toLowerCase()==="c")&&e.hasSelection()?(p(),!1):!0}e.attachCustomKeyEventHandler(g);function h(){if(!c)return;const{root:x,onDocumentClick:b,onKeyDown:y}=c;document.removeEventListener("mousedown",b,!0),document.removeEventListener("keydown",y,!0),x.remove(),c=null}function d(x,b,y){h();const u=document.createElement("div");u.setAttribute("data-terminal-clipboard-menu","true"),u.style.position="fixed",u.style.left=`${x}px`,u.style.top=`${b}px`,u.style.zIndex="1000",u.style.minWidth="180px",u.style.padding="4px 0",u.style.background="var(--bg-card)",u.style.border="1px solid var(--border-subtle)",u.style.borderRadius="6px",u.style.boxShadow="0 8px 24px rgba(0, 0, 0, 0.35)",u.style.fontSize="12px",u.style.color="var(--text-primary)",u.style.userSelect="none";const v=a?"⌘C":"Ctrl+Shift+C",C=a?"⌘V":"Ctrl+Shift+V",j=xe("Copy",v,!y,()=>{i(y),h()}),S=xe("Paste",C,!1,()=>{f(),h()}),I=xe("Select All","",!1,()=>{try{e.selectAll()}catch{}const w=e.hasSelection()?e.getSelection():"";i(w),h()});u.appendChild(j),u.appendChild(S),u.appendChild(I),document.body.appendChild(u),Gr(u,x,b);const N=w=>{u.contains(w.target)||h()},_=w=>{w.key==="Escape"&&(w.preventDefault(),h())};document.addEventListener("mousedown",N,!0),document.addEventListener("keydown",_,!0),c={root:u,onDocumentClick:N,onKeyDown:_}}function m(x){x.preventDefault();const b=e.hasSelection()?e.getSelection():"";d(x.clientX,x.clientY,b)}return t.addEventListener("contextmenu",m),()=>{t.removeEventListener("contextmenu",m),h(),e.attachCustomKeyEventHandler(()=>!0)}}function xe(e,t,r,a){const s=document.createElement("button");s.type="button",s.disabled=r,s.style.display="flex",s.style.justifyContent="space-between",s.style.alignItems="center",s.style.gap="16px",s.style.width="100%",s.style.padding="6px 12px",s.style.border="none",s.style.background="transparent",s.style.textAlign="left",s.style.fontSize="12px",s.style.cursor=r?"default":"pointer",s.style.color=r?"var(--text-dim)":"var(--text-primary)";const o=document.createElement("span");if(o.textContent=e,s.appendChild(o),t){const c=document.createElement("span");c.textContent=t,c.style.color="var(--text-dim)",c.style.fontSize="11px",s.appendChild(c)}return r||(s.addEventListener("mouseenter",()=>{s.style.background="var(--border-subtle)"}),s.addEventListener("mouseleave",()=>{s.style.background="transparent"}),s.addEventListener("click",()=>a())),s}function Gr(e,t,r){const a=typeof window<"u"?window.innerWidth:0,s=typeof window<"u"?window.innerHeight:0;if(!a||!s)return;const o=e.getBoundingClientRect(),c=4;let i=t,p=r;o.width&&t+o.width+c>a&&(i=Math.max(c,a-o.width-c)),o.height&&r+o.height+c>s&&(p=Math.max(c,s-o.height-c)),e.style.left=`${i}px`,e.style.top=`${p}px`}function Be(e,t){const r=t instanceof Error?t.message:String(t);return`Clipboard ${e} failed: ${r}`}function Qr(e){return`Clipboard ${e} blocked by the browser.`}function Zr(e,t,r,a,s,o){const c=e.leftBorderCol+1;if(t===a)return s-r;if(a<t){let f=r-c;f+=1;for(let h=a+1;h<t;h++){const d=o(h);if(d===null)return null;f+=Math.max(1,d-c+1)}const g=o(a);return g===null?null:(f+=Math.max(0,g-s),-f)}const i=o(t);if(i===null)return null;let p=Math.max(0,i-r)+1;for(let f=t+1;f<a;f++){const g=o(f);if(g===null)return null;p+=Math.max(1,g-c+1)}return p+=s-c,p}const ee=new Set(["│","┃","║","|"]);function en(e,t,r,a){const s=e.baseY,o=(m,x)=>{const b=e.getLine(s+m);if(!b)return null;const y=b.getCell(x);return y?y.getChars():null},c=m=>{let x=-1;for(let y=0;y<r;y++){const u=o(m,y);if(u!==null&&ee.has(u)){x=y;break}}if(x===-1)return null;let b=-1;for(let y=r-1;y>x;y--){const u=o(m,y);if(u!==null&&ee.has(u)){b=y;break}}return b===-1?null:{leftBorderCol:x,rightBorderCol:b}};let i=t,p=c(t);if(!p){const m=c(t-1);if(m)i=t-1,p=m;else{const x=c(t+1);x&&(i=t+1,p=x)}}if(!p)return null;const{leftBorderCol:f,rightBorderCol:g}=p;let h=i;for(let m=i-1;m>=0;m--){const x=o(m,f);if(x===null)break;if(!(x===""||x===" ")){if(!ee.has(x))break;h=m}}let d=i;for(let m=i+1;m<a;m++){const x=o(m,f);if(x===null)break;if(!(x===""||x===" ")){if(!ee.has(x))break;d=m}}return{topRow:h,bottomRow:d,leftBorderCol:f,rightBorderCol:g}}function tn(e,t,r,a){const s=e.getLine(e.baseY+t);if(!s)return null;for(let o=a;o>=r;o--){const c=s.getCell(o);if(!c)continue;const i=c.getChars();if(i!==""&&i!==" ")return o}return r-1}const rn=200;function nn(e){const{click:t,terminal:r,cellSurface:a,debug:s}=e,o=r.buffer.active,c=j=>{s==null||s({cursorY:o.cursorY,cursorX:o.cursorX,originalTargetCol:j.originalTargetCol??j.targetCol,snapped:j.snapped??!1,...j})};if(o.type==="alternate")return c({targetRow:-1,targetCol:-1,box:null,rejected:"alt-screen",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;if(o.viewportY!==o.baseY)return c({targetRow:-1,targetCol:-1,box:null,rejected:"scrollback",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;const i=a.getBoundingClientRect();if(i.width===0||i.height===0)return c({targetRow:-1,targetCol:-1,box:null,rejected:"outside-grid",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;const p=t.clientX-i.left,f=t.clientY-i.top;if(p<0||f<0||p>=i.width||f>=i.height)return c({targetRow:-1,targetCol:-1,box:null,rejected:"outside-grid",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;const g=i.width/r.cols,h=i.height/r.rows,d=Math.floor(p/g),m=Math.floor(f/h),x=r.modes.applicationCursorKeysMode,b=x?"\x1BOC":"\x1B[C",y=x?"\x1BOD":"\x1B[D",u=en(o,o.cursorY,r.cols,r.rows);if(u){if(m<u.topRow||m>u.bottomRow)return c({targetRow:m,targetCol:d,box:u,rejected:"out-of-box",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;if(d<=u.leftBorderCol||d>=u.rightBorderCol)return c({targetRow:m,targetCol:d,box:u,rejected:"border",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;const j=u.leftBorderCol+1,S=u.rightBorderCol-1,I=D=>tn(o,D,j,S),N=o.cursorY<u.topRow||o.cursorY>u.bottomRow,_=N?u.bottomRow:o.cursorY,w=N?S:o.cursorX,$=m!==_;let k=null;if($&&(k=I(m),k===null))return c({targetRow:m,targetCol:d,originalTargetCol:d,snapped:!1,box:u,rejected:"unreadable-row",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;let A=d,B=!1;if($&&k!==null){const D=Math.max(j,k);d>D&&(A=D,B=!0)}if(m===_&&A===w)return c({targetRow:m,targetCol:A,originalTargetCol:d,snapped:B,box:u,rejected:"same-cell",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;const L=Zr(u,_,w,m,A,I);if(L===null)return c({targetRow:m,targetCol:A,originalTargetCol:d,snapped:B,box:u,rejected:"unreadable-row",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;if(L===0)return c({targetRow:m,targetCol:A,originalTargetCol:d,snapped:B,box:u,rejected:"same-cell",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;if(Math.abs(L)>rn)return c({targetRow:m,targetCol:A,originalTargetCol:d,snapped:B,box:u,rejected:"emit-cap",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;const P=L<0?y.repeat(-L):b.repeat(L);return c({targetRow:m,targetCol:A,originalTargetCol:d,snapped:B,box:u,rejected:null,emittedDirection:L<0?"left":"right",emittedByteCount:P.length,predictedCursorY:m,predictedCursorX:A}),P}if(m!==o.cursorY)return c({targetRow:m,targetCol:d,box:null,rejected:"out-of-box",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;const v=d-o.cursorX;if(v===0)return c({targetRow:m,targetCol:d,box:null,rejected:"same-cell",emittedDirection:null,emittedByteCount:0,predictedCursorY:null,predictedCursorX:null}),null;const C=v<0?y.repeat(-v):b.repeat(v);return c({targetRow:m,targetCol:d,box:null,rejected:null,emittedDirection:v<0?"left":"right",emittedByteCount:C.length,predictedCursorY:m,predictedCursorX:d}),C}const Fe=1;function an(e,t){const{sendInput:r,pixelThreshold:a=3,timeThresholdMs:s=300,now:o=()=>Date.now(),onVerificationDisable:c}=t,i=e.element;if(!i)return()=>{};const p=i.querySelector(".xterm-screen")??i;let f=null,g=!1,h=null,d=null;const m=typeof e.onRender=="function"?e.onRender.bind(e):null;m&&(d=m(()=>{const y=h;if(!y)return;h=null;const u=e.buffer.active,v=Math.abs(u.cursorY-y.y),C=Math.abs(u.cursorX-y.x);if(v>Fe||C>Fe){g=!0;const j={predicted:y,actual:{y:u.cursorY,x:u.cursorX}};c?c(j):console.warn("[click-cursor] disabled — cursor diverged from prediction",j)}}));function x(y){if(y.button!==0||y.altKey||y.shiftKey||y.metaKey||y.ctrlKey){f=null;return}f={clientX:y.clientX,clientY:y.clientY,at:o()}}function b(y){var _;const u=f;if(f=null,!u)return;const v=y.clientX-u.clientX,C=y.clientY-u.clientY;if(Math.hypot(v,C)>a||o()-u.at>s)return;const j=typeof window<"u"&&((_=window.localStorage)==null?void 0:_.getItem("codeyam.terminalClickDebug"))==="1";if(j)try{const w=e.buffer.active,$=w.cursorY,k={};for(let A=-2;A<=2;A++){const B=$+A,L=w.getLine(w.baseY+B);if(!L)continue;const P=[];for(let D=0;D<e.cols;D++){const F=L.getCell(D);P.push(F?F.getChars():"")}k[`row${B}`]=P.join("|")}console.log("[click-cursor] buffer dump",{cursorY:$,cursorX:w.cursorX,viewportY:w.viewportY,baseY:w.baseY,rows:k})}catch{}let S=null;const I=w=>{S=w,j&&console.log("[click-cursor] result",w)},N=nn({click:{clientX:y.clientX,clientY:y.clientY},terminal:e,cellSurface:p,debug:I});if(N){if(S){const w=S,$=w.box!==null&&w.targetRow!==w.cursorY;if($&&g){j&&console.log("[click-cursor] suppressed by verification-disabled");return}$&&w.predictedCursorY!==null&&w.predictedCursorX!==null&&(h={y:w.predictedCursorY,x:w.predictedCursorX})}r(N)}}return p.addEventListener("mousedown",x),p.addEventListener("mouseup",b),()=>{p.removeEventListener("mousedown",x),p.removeEventListener("mouseup",b),d==null||d.dispose()}}async function Ze(e=1500){try{return(await fetch("/api/health",{signal:AbortSignal.timeout(e)})).ok}catch{return!1}}function sn(e,t){let r=!1,a=null;async function s(){if(!r){if(await Ze(1500)){r||t();return}r||(a=setTimeout(s,e))}}return a=setTimeout(s,e),()=>{r=!0,a&&(clearTimeout(a),a=null)}}const on="The editor server closed the terminal connection with no further detail.";function cn(e){if(e&&typeof e=="object"&&"message"in e){const t=e.message;if(typeof t=="string"&&t.length>0)return t}return on}let et=!1;function be(e){et=e}function pa(){return et}function tt(){return n.jsx("div",{"data-testid":"terminal-connecting-hint",className:"absolute top-2 right-3 text-xs font-mono text-[#aaa] pointer-events-none z-10 select-none",children:"Connecting…"})}const ha=Object.freeze(Object.defineProperty({__proto__:null,TerminalConnectingHint:tt},Symbol.toStringTag,{value:"Module"}));function rt({attempt:e,maxAttempts:t,pulseKey:r}){return n.jsx("div",{"data-testid":"terminal-reconnecting-banner",className:"absolute inset-0 flex items-start justify-center pt-3 z-10 bg-black/40",children:n.jsxs("div",{"data-testid":"terminal-reconnecting-banner-label",className:"px-4 py-2 rounded font-mono text-sm shadow terminal-disconnect-pulse bg-amber-500/90 text-black",children:["Reconnecting… (attempt ",e," of ",t,")"]},r)})}const ma=Object.freeze(Object.defineProperty({__proto__:null,TerminalReconnectingBanner:rt},Symbol.toStringTag,{value:"Module"}));function nt({onRefresh:e}){return n.jsx("div",{"data-testid":"terminal-failed-banner",className:"absolute inset-0 flex items-start justify-center pt-3 z-10 bg-black/60",children:n.jsxs("div",{className:"px-4 py-2 rounded font-mono text-sm shadow flex items-center gap-3 terminal-disconnect-pulse bg-red-500/90 text-white",children:[n.jsx("span",{children:"Connection lost. The page must be refreshed to continue."}),n.jsx("button",{type:"button",onClick:e,"data-testid":"terminal-failed-banner-refresh",className:"px-2 py-1 rounded bg-white text-red-700 font-medium cursor-pointer hover:bg-red-50",children:"Refresh page"})]})})}const xa=Object.freeze(Object.defineProperty({__proto__:null,TerminalFailedBanner:nt},Symbol.toStringTag,{value:"Module"}));function at({onReload:e}){return n.jsx("div",{"data-testid":"terminal-server-stopped-banner",className:"absolute inset-0 flex items-start justify-center pt-3 z-10 bg-black/60",children:n.jsxs("div",{className:"px-4 py-2 rounded font-mono text-sm shadow flex items-center gap-3 terminal-disconnect-pulse bg-red-500/90 text-white",children:[n.jsx("span",{children:"Editor stopped — restart it from your terminal to continue."}),n.jsx("button",{type:"button",onClick:e,"data-testid":"terminal-server-stopped-banner-reload",className:"px-2 py-1 rounded bg-white text-red-700 font-medium cursor-pointer hover:bg-red-50",children:"Reload page"})]})})}const ba=Object.freeze(Object.defineProperty({__proto__:null,TerminalServerStoppedBanner:at},Symbol.toStringTag,{value:"Module"}));function st({message:e,onRefresh:t}){return n.jsx("div",{"data-testid":"terminal-server-error-banner",className:"absolute inset-0 flex items-start justify-center pt-3 z-10 bg-black/60",children:n.jsxs("div",{className:"px-4 py-3 rounded font-mono text-sm shadow flex items-start gap-3 max-w-2xl bg-amber-500/95 text-black border border-amber-700",children:[n.jsx("pre",{"data-testid":"terminal-server-error-banner-message",className:"whitespace-pre-wrap break-words flex-1 m-0 font-mono text-xs leading-snug",children:e}),n.jsx("button",{type:"button",onClick:t,"data-testid":"terminal-server-error-banner-refresh",className:"px-2 py-1 rounded bg-white text-amber-900 font-medium cursor-pointer hover:bg-amber-50 self-start",children:"Refresh"})]})})}const ga=Object.freeze(Object.defineProperty({__proto__:null,TerminalServerErrorBanner:st},Symbol.toStringTag,{value:"Module"}));function ot({status:e,pulseKey:t,onRefresh:r}){return e.kind==="open"||e.kind==="ended"?null:e.kind==="connecting"?n.jsx(tt,{}):e.kind==="reconnecting"?n.jsx(rt,{attempt:e.attempt,maxAttempts:e.maxAttempts,pulseKey:t}):e.kind==="server-stopped"?n.jsx(at,{onReload:r}):e.kind==="server-error"?n.jsx(st,{message:e.message,onRefresh:r}):n.jsx(nt,{onRefresh:r})}const ya=Object.freeze(Object.defineProperty({__proto__:null,TerminalDisconnectOverlay:ot},Symbol.toStringTag,{value:"Module"}));function it({status:e,onRetry:t}){return e==="retrying"?n.jsx("div",{"data-testid":"mini-agent-launch-retrying",className:"absolute inset-x-0 top-2 z-10 flex justify-center pointer-events-none",children:n.jsx("span",{className:"font-mono text-xs italic text-[var(--text-dim)] bg-black/40 px-2 py-1 rounded",children:"Launch slow — retrying…"})}):e==="failed"?n.jsx("div",{role:"alert","data-testid":"mini-agent-launch-failed-banner",className:"absolute inset-0 flex items-start justify-center pt-3 z-10 bg-black/60",children:n.jsxs("div",{className:"px-4 py-2 rounded font-mono text-sm shadow flex items-center gap-3 terminal-disconnect-pulse bg-red-500/90 text-white",children:[n.jsx("span",{children:"Couldn't launch the build agent — the shell prompt didn't respond in time."}),n.jsx("button",{type:"button",onClick:t,"data-testid":"mini-agent-launch-failed-retry",className:"px-2 py-1 rounded bg-white text-red-700 font-medium cursor-pointer hover:bg-red-50",children:"Retry"})]})}):null}const va=Object.freeze(Object.defineProperty({__proto__:null,MiniAgentLaunchOverlay:it},Symbol.toStringTag,{value:"Module"})),ln=40;function dn(e){const t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t&&t.slice(0,ln).replace(/-+$/,"")||"session"}const re=new Map;function Oe(e,t){const r=re.get(e);if(!r){let a;try{a=t()}catch(s){return Promise.reject(s)}return a instanceof Promise?Ke(e,a):Promise.resolve()}return Ke(e,r.then(()=>t()))}function Ke(e,t){const r=t.catch(()=>{});return re.set(e,r),r.then(()=>{re.get(e)===r&&re.delete(e)}),t}const oe="build",ze="miniagent";function Me(e){window.dispatchEvent(new CustomEvent("terminal-send-input",{detail:e}))}function ja(e){Oe(oe,()=>Me(e))}const ne=50;function un(e,t=Me,r=oe){return Oe(r,()=>new Promise(a=>{t(e),setTimeout(()=>{t("\r"),a()},ne)}))}const ge=3e3;function ct(e){return e==="gemini"?"gemini":"claude"}function fn(e,t){return`${ct(e)} '${t}'\r`}async function pn(e,t=Me,r=oe){const a=dn(e);await un(`/rename ${a}`,t,r)}function hn(e,t,r,a=oe){z("dispatch-rename",{phase:"queued",caller:t,label:e,delayMs:ge}),setTimeout(()=>{z("dispatch-rename",{phase:"fired",caller:t,label:e,delayMs:ge}),pn(e,r,a)},ge)}function mn(e,t){const r=ct(e),a=`mkdir -p .codeyam/tmp && cat > .codeyam/tmp/inline-prompt.md << 'INLINE_PROMPT_EOF'
4
- ${t}
5
- INLINE_PROMPT_EOF\r`,s=`${r} "Read the file at '.codeyam/tmp/inline-prompt.md' for your instructions."\r`;return[a,s]}function xn({idleMs:e,ceilingMs:t}){return new Promise(r=>{let a=null,s=null,o=!1;function c(){o||(o=!0,a!==null&&clearTimeout(a),s!==null&&clearTimeout(s),window.removeEventListener("miniagent-output",p),r())}function i(){a!==null&&clearTimeout(a),a=setTimeout(c,e)}function p(){i()}window.addEventListener("miniagent-output",p),s=setTimeout(c,t),i()})}const bn=350,gn=4e3,yn=8e3,vn=500,Y={armed:"mini-agent-launch-armed",fired:"mini-agent-launch-fired",confirmed:"mini-agent-launch-confirmed",relaunch:"mini-agent-relaunch",failed:"mini-agent-launch-failed",reattached:"mini-agent-launch-reattached"};function jn(e){const{provider:t,slashCommand:r,prompt:a,chatName:s,sendInput:o}=e,[c,i]=l.useState("idle"),p=l.useRef(o),f=l.useRef(r),g=l.useRef(a),h=l.useRef(s),d=l.useRef(t);l.useEffect(()=>{p.current=o},[o]),l.useEffect(()=>{f.current=r},[r]),l.useEffect(()=>{g.current=a},[a]),l.useEffect(()=>{h.current=s},[s]),l.useEffect(()=>{d.current=t},[t]);const m=l.useRef(0),x=l.useRef(!1),b=l.useRef(0),y=l.useCallback((N,_)=>{const w=f.current,$=g.current;Oe(ze,()=>{if(w){const P=fn(d.current,w),D=ye(P);return N(D),new Promise(F=>{setTimeout(()=>{_()&&N("\r"),F()},ne)})}const[k,A]=mn(d.current,$??""),B=ye(k),L=ye(A);return N(B),new Promise(P=>{setTimeout(()=>{if(!_())return P();N("\r"),setTimeout(()=>{if(!_())return P();N(L),setTimeout(()=>{_()&&N("\r"),P()},ne)},vn)},ne)})})},[]),u=l.useCallback(()=>{const N=++m.current,_=Date.now();b.current=_,i("armed"),z(Y.armed,{provider:d.current,slashCommand:f.current,chatName:h.current,hasPrompt:typeof g.current=="string"});function w(){return m.current===N}function $(k){w()&&(i(k===1?"firing":"retrying"),z(k===1?Y.fired:Y.relaunch,{provider:d.current,slashCommand:f.current,chatName:h.current,attempt:k,elapsedMs:Date.now()-_}),y(p.current,w),x.current||(x.current=!0,hn(h.current,"mini-agent-chat",A=>p.current(A),ze)),setTimeout(()=>{w()&&(k===1?$(2):(i("failed"),z(Y.failed,{provider:d.current,slashCommand:f.current,reason:"banner-timeout",elapsedMs:Date.now()-_})))},yn))}xn({idleMs:bn,ceilingMs:gn}).then(()=>{w()&&$(1)})},[y]),v=l.useCallback(()=>{x.current=!1,u()},[u]),C=l.useCallback(()=>{u()},[u]),j=l.useCallback(()=>{m.current!==0&&(m.current++,i("confirmed"),z(Y.confirmed,{elapsedMs:Date.now()-b.current}))},[]),S=l.useCallback(()=>{m.current!==0&&(m.current++,i("failed"),z(Y.failed,{reason:"startup-failed",elapsedMs:Date.now()-b.current}))},[]),I=l.useCallback(()=>{m.current++,i("confirmed"),z(Y.reattached,{provider:d.current,chatName:h.current})},[]);return l.useEffect(()=>()=>{m.current++},[]),{status:c,arm:v,retry:C,onBannerReady:j,onStartupFailed:S,onReattached:I}}function ye(e){return e.endsWith("\r")?e.slice(0,-1):e}const ie=l.createContext({registerSender:()=>{},setReady:()=>{},sendToAgent:()=>!1,agentReady:!1});function _n({children:e}){const t=l.useRef(null),[r,a]=l.useState(!1),s=l.useCallback(p=>{t.current=p},[]),o=l.useCallback(p=>{a(p)},[]),c=l.useCallback(p=>{const f=t.current;return f?f(p):!1},[]),i=l.useMemo(()=>({registerSender:s,setReady:o,sendToAgent:c,agentReady:r}),[s,o,c,r]);return n.jsx(ie.Provider,{value:i,children:e})}function Sn(){const{sendToAgent:e,agentReady:t}=l.useContext(ie);return{sendToAgent:e,agentReady:t}}function wn(e,t){const{registerSender:r,setReady:a}=l.useContext(ie);l.useEffect(()=>(r(e),()=>r(null)),[r,e]),l.useEffect(()=>(a(t),()=>a(!1)),[a,t])}function lt(){const{registerSender:e,setReady:t}=l.useContext(ie);return{registerSender:e,setReady:t}}const _a=Object.freeze(Object.defineProperty({__proto__:null,AgentInputProvider:_n,useAgentInput:Sn,useAgentInputChannel:lt,useRegisterAgentInput:wn},Symbol.toStringTag,{value:"Module"})),dt=l.createContext({openPicker:()=>{}});function kn({openPicker:e,children:t}){const r=l.useMemo(()=>({openPicker:e}),[e]);return n.jsx(dt.Provider,{value:r,children:t})}function ut(){return l.useContext(dt)}const Sa=Object.freeze(Object.defineProperty({__proto__:null,FilePickerProvider:kn,useFilePicker:ut},Symbol.toStringTag,{value:"Module"}));function ft({className:e=""}){const{openPicker:t}=ut();return n.jsxs("button",{type:"button",onClick:t,title:"Attach a file","aria-label":"Attach a file","data-testid":"attach-file-button",className:`inline-flex items-center gap-1 text-xs font-medium cursor-pointer bg-transparent border-none text-[var(--text-dim)] hover:text-[var(--text-primary)] transition ${e}`,children:[n.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:n.jsx("path",{d:"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"})}),"Attach file"]})}const wa=Object.freeze(Object.defineProperty({__proto__:null,AttachFileButton:ft},Symbol.toStringTag,{value:"Module"})),He=15;function pt({chatName:e,prompt:t,slashCommand:r,height:a=400,onClose:s}){const o=l.useRef(null),c=l.useRef(null),i=l.useRef(null);l.useRef(t);const{config:p}=Ue(),f=(p==null?void 0:p.provider)??"claude",[g,h]=l.useState({kind:"connecting"}),[d,m]=l.useState(0),x=l.useCallback(N=>{const _=c.current;(_==null?void 0:_.readyState)===WebSocket.OPEN&&_.send(JSON.stringify({type:"input",data:N}))},[]),{registerSender:b,setReady:y}=lt(),u=l.useCallback(N=>{var _;return((_=c.current)==null?void 0:_.readyState)===WebSocket.OPEN?(c.current.send(JSON.stringify({type:"input",data:N})),!0):!1},[]),v=g.kind==="open";l.useEffect(()=>(v&&b(u),()=>b(null)),[b,u,v]),l.useEffect(()=>(y(v),()=>y(!1)),[y,v]);const C=l.useCallback(()=>{var N,_;((N=c.current)==null?void 0:N.readyState)===WebSocket.OPEN&&(b(u),y(!0)),(_=i.current)==null||_.focus()},[b,y,u]),j=jn({provider:f,slashCommand:r,prompt:t,chatName:e,sendInput:x}),S=l.useRef(j);l.useEffect(()=>{S.current=j});const I=l.useRef(e);return l.useEffect(()=>{I.current=e}),l.useEffect(()=>{const N=o.current;if(!N)return;const _=new Yr.Terminal({theme:{background:"#1a1a1a",foreground:"#d4d4d4",cursor:"#d4d4d4",selectionBackground:"#264f78"},fontSize:12,fontFamily:"'IBM Plex Mono', 'Menlo', 'Monaco', monospace",cursorBlink:!0,scrollback:5e3,allowProposedApi:!0}),w=new Vr.FitAddon;_.loadAddon(w),_.open(N);const $=qr(_,N,{onError:E=>console.warn("[MiniAgentChat]",E)}),k=an(_,{sendInput:E=>{const T=c.current;(T==null?void 0:T.readyState)===WebSocket.OPEN&&T.send(JSON.stringify({type:"input",data:E}))}});requestAnimationFrame(()=>{try{w.fit()}catch{}}),i.current=_;const A={current:"inline"},B={current:null},L={current:!1},P={current:!1};let D=0,F=null;function H(){h({kind:"connecting"});const E=Ur({mode:A.current,sessionId:B.current??void 0,chatKey:e,cols:_.cols,rows:_.rows}),T=new WebSocket(E);T.binaryType="arraybuffer",c.current=T,T.onopen=()=>{D=0,h({kind:"open"}),be(!0),window.dispatchEvent(new CustomEvent("miniagent-ws-open")),T.send(JSON.stringify({type:"resize",cols:_.cols,rows:_.rows}))},T.onmessage=R=>{if(R.data instanceof ArrayBuffer){_.write(new Uint8Array(R.data)),window.dispatchEvent(new CustomEvent("miniagent-output"));return}try{const O=JSON.parse(R.data);if(O.type==="error"){P.current=!0,h({kind:"server-error",message:cn(O)});return}if(O.type==="session-id"){if(O.sessionId&&(B.current=O.sessionId,A.current="resume"),O.reattached===!0){L.current=!0,S.current.onReattached();return}L.current||(L.current=!0,S.current.arm());return}if(O.type==="agent-idle"||O.type==="claude-idle"){window.dispatchEvent(new CustomEvent("miniagent-agent-idle",{detail:{chatName:I.current}}));return}if(O.type==="agent-active"||O.type==="claude-active"){window.dispatchEvent(new CustomEvent("miniagent-agent-active",{detail:{chatName:I.current}}));return}if(O.type==="agent-banner-ready"){S.current.onBannerReady();return}if(O.type==="agent-auth-required"){window.dispatchEvent(new CustomEvent("agent-auth-required"));return}if(O.type==="startup-failed"){S.current.onStartupFailed();return}}catch{_.write(R.data),window.dispatchEvent(new CustomEvent("miniagent-output"))}},T.onerror=()=>{},T.onclose=async()=>{if(be(!1),P.current){h(O=>O.kind==="server-error"?O:{kind:"ended"});return}const R=await Ze();if(!P.current){if(!R){h({kind:"server-stopped"}),F==null||F(),F=sn(2e3,()=>{P.current||window.location.reload()});return}if(D<He){const O=D<4?1e3*Math.pow(2,D):1e4;D++,h({kind:"reconnecting",attempt:D,maxAttempts:He}),setTimeout(()=>{P.current||H()},O)}else h({kind:"failed"})}}}try{w.fit()}catch{}H(),_.onData(E=>{const T=c.current;(T==null?void 0:T.readyState)===WebSocket.OPEN?T.send(JSON.stringify({type:"input",data:E})):m(R=>R+1)});const Q=new ResizeObserver(()=>{try{w.fit();const E=c.current;(E==null?void 0:E.readyState)===WebSocket.OPEN&&E.send(JSON.stringify({type:"resize",cols:_.cols,rows:_.rows}))}catch{}});Q.observe(N);function W(){var E;(E=i.current)==null||E.focus()}window.addEventListener("terminal-focus",W);function K(E){const T=E.detail,R=c.current;typeof T=="string"&&(R==null?void 0:R.readyState)===WebSocket.OPEN&&R.send(JSON.stringify({type:"input",data:T}))}return window.addEventListener("miniagent-send-input",K),()=>{var T;P.current=!0,be(!1),F==null||F(),F=null,window.removeEventListener("terminal-focus",W),window.removeEventListener("miniagent-send-input",K),Q.disconnect(),$(),k();const E=c.current;(E==null?void 0:E.readyState)===WebSocket.OPEN&&E.close(),(T=i.current)==null||T.dispose()}},[f]),n.jsxs("div",{"data-codeyam-hydrated":"MiniAgentChat",className:"mt-2 border border-[var(--border-subtle)] rounded-lg overflow-hidden",children:[n.jsxs("div",{className:"flex items-center justify-between px-3 py-1.5 bg-[var(--bg-card)]",children:[n.jsx("span",{className:"text-xs font-medium text-[var(--accent-active)]",children:q(f)}),n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(ft,{}),s&&n.jsx("button",{onClick:s,className:"text-[var(--text-dim)] hover:text-[var(--text-primary)] text-xs bg-transparent border-none cursor-pointer",children:"Close"})]})]}),n.jsxs("div",{ref:o,onClick:C,style:{height:a,background:"#1a1a1a",padding:"6px 10px",position:"relative",overflow:"hidden"},children:[n.jsx(ot,{status:g,pulseKey:d,onRefresh:()=>window.location.reload()}),n.jsx(it,{status:j.status,onRetry:j.retry})]})]})}const ka=Object.freeze(Object.defineProperty({__proto__:null,MiniAgentChat:pt},Symbol.toStringTag,{value:"Module"}));function ht(e){return e>=500?"transient":"rejected"}function mt({provider:e,onAuthenticated:t}){const[r,a]=l.useState(""),[s,o]=l.useState(!1),[c,i]=l.useState(null),[p,f]=l.useState(!1),g=q(e),h=l.useCallback(async()=>{if(r.trim()){o(!0),i(null),f(!1);try{const d=await fetch("/api/auth/api-key",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({provider:e,key:r.trim()})});if(!d.ok){if(ht(d.status)==="transient"){f(!0),i(`The editor was briefly unreachable (HTTP ${d.status}). Your key wasn't rejected — try again.`);return}const m=await d.json().catch(()=>({}));i(m.error??`Could not save the key (HTTP ${d.status}).`);return}a(""),t()}catch{f(!0),i("Could not reach the editor to save the key. Try again.")}finally{o(!1)}}},[r,e,t]);return n.jsxs("div",{"data-testid":"api-key-flow",className:"space-y-3",children:[n.jsxs("p",{className:"text-sm text-[#8E8E8E]",children:["Paste your ",g," API key. It is stored locally in",n.jsx("code",{className:"mx-1 text-[#D7FF63]",children:".codeyam/editor.local.json"}),"and never committed."]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"password",value:r,onChange:d=>a(d.target.value),placeholder:`${g} API key`,className:"flex-1 min-w-0 px-2 py-1.5 rounded bg-black border border-[#3A3A3A] text-white text-sm"}),n.jsx("button",{onClick:()=>void h(),disabled:s||!r.trim(),className:"px-3 py-1.5 text-sm rounded-md bg-[#D7FF63] text-black font-medium cursor-pointer disabled:opacity-50",children:s?"Saving…":"Save"})]}),c?n.jsxs("div",{className:"space-y-2",children:[n.jsx("p",{className:"text-sm text-[#FF8B43]",children:c}),p?n.jsx("button",{"data-testid":"api-key-flow-retry",onClick:()=>void h(),disabled:s||!r.trim(),className:"px-3 py-1.5 text-sm rounded-md border border-[#3A3A3A] text-white font-medium cursor-pointer disabled:opacity-50",children:s?"Saving…":"Retry"}):null]}):null]})}const Ca=Object.freeze(Object.defineProperty({__proto__:null,ApiKeyFlow:mt,classifyApiKeySaveFailure:ht},Symbol.toStringTag,{value:"Module"})),Cn=500,Nn=2e4;function xt({onAuthenticated:e}){const[t,r]=l.useState({state:"starting"}),[a,s]=l.useState(""),[o,c]=l.useState(!1),[i,p]=l.useState(!1),[f,g]=l.useState(!1),[h,d]=l.useState(!1),m=l.useRef(!1),x=l.useRef(e);x.current=e;const b=l.useCallback(async()=>{try{const S=await fetch("/api/auth/status");if(!S.ok)return;const I=await S.json();r(I),I.state==="authenticated"&&!m.current&&(m.current=!0,x.current())}catch{}},[]),y=l.useCallback(async()=>{m.current=!1,g(!1),r({state:"starting"});try{await fetch("/api/auth/start",{method:"POST"})}catch{r({state:"failed",error:"Could not start the login process."})}},[]);l.useEffect(()=>{y()},[y]),l.useEffect(()=>{const S=window.setInterval(()=>void b(),Cn);return()=>window.clearInterval(S)},[b]),l.useEffect(()=>{if(t.state!=="starting"){g(!1);return}const S=window.setTimeout(()=>g(!0),Nn);return()=>window.clearTimeout(S)},[t.state]);const u=l.useCallback(async()=>{if(a.trim()){c(!0);try{const S=await fetch("/api/auth/code",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({code:a.trim()})});if(S.ok)s("");else{const I=await S.json().catch(()=>({}));r({state:"failed",error:I.error??"Code not accepted — check the value and try again."})}}catch{r({state:"failed",error:"Could not submit the code."})}finally{c(!1)}}},[a]),v=l.useCallback(async()=>{try{await fetch("/api/auth/cancel",{method:"POST"})}catch{}y()},[y]),C=l.useCallback(async()=>{d(!0);try{await fetch("/api/auth/refresh-cache",{method:"POST"}),e()}catch{}finally{d(!1)}},[e]),j=l.useCallback(()=>{var S;t.url&&((S=navigator.clipboard)==null||S.writeText(t.url),p(!0),window.setTimeout(()=>p(!1),1500))},[t.url]);return f&&t.state==="starting"?n.jsxs("div",{"data-testid":"claude-oauth-timeout",className:"space-y-3",children:[n.jsxs("p",{className:"text-sm text-[#FF8B43]",children:["Login link preparation timed out — the backend may be wedged. Try again, recheck if you already authenticated elsewhere, or open a terminal and run ",n.jsx("code",{className:"text-white",children:"claude /login"})," ","directly."]}),n.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.jsx("button",{onClick:()=>void v(),"data-testid":"claude-oauth-timeout-retry",className:"px-3 py-2 text-sm rounded-md bg-[#D7FF63] text-black font-medium cursor-pointer",children:"Retry"}),n.jsx("button",{onClick:()=>void C(),"data-testid":"claude-oauth-timeout-recheck",disabled:h,className:"px-3 py-2 text-sm rounded-md border border-[#3A3A3A] text-white cursor-pointer disabled:opacity-50",children:h?"Rechecking…":"I already logged in — recheck"})]})]}):t.state==="failed"?n.jsxs("div",{"data-testid":"claude-oauth-failed",className:"space-y-3",children:[n.jsx("p",{className:"text-sm text-[#FF8B43]",children:t.error??"Login failed."}),n.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.jsx("button",{onClick:()=>void v(),className:"px-3 py-2 text-sm rounded-md bg-[#D7FF63] text-black font-medium cursor-pointer",children:"Try again"}),n.jsx("button",{onClick:()=>void C(),"data-testid":"claude-oauth-failed-recheck",disabled:h,className:"px-3 py-2 text-sm rounded-md border border-[#3A3A3A] text-white cursor-pointer disabled:opacity-50",children:h?"Rechecking…":"I already logged in — recheck"})]})]}):t.state==="authenticated"?n.jsx("p",{"data-testid":"claude-oauth-authenticated",className:"text-sm text-[#D7FF63]",children:"Connected. Opening Build…"}):t.state==="url-ready"&&t.url?n.jsxs("div",{"data-testid":"claude-oauth-url-ready",className:"space-y-3",children:[n.jsx("p",{className:"text-sm text-[#8E8E8E]",children:"Open this URL in your browser, approve access, then paste the code back here:"}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("code",{className:"flex-1 min-w-0 truncate px-2 py-1.5 rounded bg-black text-[#D7FF63] text-xs",children:t.url}),n.jsx("button",{onClick:j,className:"px-2 py-1.5 text-xs rounded-md border border-[#3A3A3A] text-white cursor-pointer",children:i?"Copied":"Copy"}),n.jsx("a",{href:t.url,target:"_blank",rel:"noreferrer",className:"px-2 py-1.5 text-xs rounded-md border border-[#3A3A3A] text-white cursor-pointer",children:"Open"})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"text",value:a,onChange:S=>s(S.target.value),placeholder:"Paste the code from the browser here",className:"flex-1 min-w-0 px-2 py-1.5 rounded bg-black border border-[#3A3A3A] text-white text-sm"}),n.jsx("button",{onClick:()=>void u(),disabled:o||!a.trim(),className:"px-3 py-1.5 text-sm rounded-md bg-[#D7FF63] text-black font-medium cursor-pointer disabled:opacity-50",children:o?"Submitting…":"Submit"})]})]}):n.jsx("p",{"data-testid":"claude-oauth-starting",className:"text-sm text-[#8E8E8E]",children:"Preparing the login link…"})}const Na=Object.freeze(Object.defineProperty({__proto__:null,ClaudeOAuthFlow:xt},Symbol.toStringTag,{value:"Module"}));function bt({provider:e,onAuthenticated:t,onClose:r}){const a=q(e);return n.jsx("div",{"data-testid":"provider-auth-modal",className:"fixed inset-0 z-[100] flex items-center justify-center",style:{background:"rgba(30, 30, 30, 0.90)"},children:n.jsxs("div",{className:"w-[32rem] max-w-[90vw] rounded-lg border border-[#3A3A3A] bg-[#1E1E1E] p-6 space-y-4",children:[n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("h2",{className:"text-base font-medium text-white",children:["Connect your ",a," account"]}),n.jsx("button",{onClick:r,"aria-label":"Close",className:"text-[#8E8E8E] hover:text-white cursor-pointer",children:"✕"})]}),e==="claude"?n.jsx(xt,{onAuthenticated:t}):n.jsx(mt,{provider:e,onAuthenticated:t})]})})}const Ea=Object.freeze(Object.defineProperty({__proto__:null,ProviderAuthModal:bt},Symbol.toStringTag,{value:"Module"}));function En(e){const t=new Date(e).getTime()-Date.now(),r=Math.abs(Math.round(t/36e5));if(r<1)return t<0?"just now":"very soon";if(r<48)return t<0?`${r} h ago`:`in ${r} h`;const a=Math.round(r/24);return t<0?`${a} d ago`:`in ${a} d`}function gt({provider:e,credsPresent:t=!0,reason:r=null,expiresAt:a=null,sessionOngoing:s=!1,onAuthenticated:o,onAuthorized:c}){const[i,p]=l.useState(!1),[f,g]=l.useState(!1),h=q(e),d=l.useCallback(()=>{p(!1),o(),c==null||c()},[o,c]),m=l.useCallback(async()=>{g(!0);try{await fetch("/api/auth/refresh-cache",{method:"POST"}),o()}catch{}finally{g(!1)}},[o]),x=e==="claude"&&!t,b=a?` (token expired ${En(a)})`:"",y=x?`${h} credentials file is missing`:r==="token-expired"?`Your ${h} token has expired`:r==="api-401"?`${h} authentication rejected (401)`:`Connect your ${h} account`,u=s?" Your Build session stays open — you can finish logging in here or directly in the Build terminal.":"",v=x?"The editor couldn't find ~/.claude/.credentials.json on this machine — likely deleted between editor restarts (operator-side action, a Reconfigure, or a stale image). Re-seed by clicking Authenticate to run OAuth, or — on a fleet VM — copy the file from a donor VM through the dashboard.":r==="token-expired"?`Your ${h} token has expired${b} — click Authenticate to refresh it. On a fleet VM the dashboard can copy a fresh token from a donor VM.${u}`:r==="api-401"?`The ${h} server rejected your credentials (401)${b}. This usually means the token was revoked or expired. Click Authenticate to re-connect.${u}`:s?"You can finish logging in here or directly in the Build terminal — your session stays open either way. On a cloud VM the dashboard usually does this for you; locally you connect once here.":`Authentication used to happen inside the Build terminal. Now it lives here, out of your way. Connect ${h} to unlock the Build tab. On a cloud VM the dashboard usually does this for you; locally you connect once here.`;return n.jsxs("div",{"data-testid":"provider-auth-gate","data-auth-variant":x?"creds-missing":"needs-login","data-auth-card":!0,className:"m-4 rounded-lg border border-[#D7FF63]/40 bg-[#1E1E1E] p-5 space-y-3",children:[n.jsx("h2",{className:"text-base font-medium text-white",children:y}),n.jsx("p",{className:"text-sm text-[#8E8E8E]",children:v}),n.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[n.jsx("button",{onClick:()=>p(!0),className:"px-3 py-2 text-sm rounded-md bg-[#D7FF63] text-black font-medium cursor-pointer",children:"Authenticate"}),n.jsx("button",{onClick:()=>void m(),"data-testid":"provider-auth-gate-recheck",disabled:f,className:"px-3 py-2 text-sm rounded-md border border-[#3A3A3A] text-white cursor-pointer disabled:opacity-50",children:f?"Rechecking…":"Already logged in? Recheck"})]}),i?n.jsx(bt,{provider:e,onAuthenticated:d,onClose:()=>p(!1)}):null]})}const Ta=Object.freeze(Object.defineProperty({__proto__:null,ProviderAuthenticateCta:gt},Symbol.toStringTag,{value:"Module"}));let ve=!1;function yt(e){const{state:t,provider:r,credsPresent:a,reason:s,expiresAt:o,refresh:c}=Hr(),[i]=l.useState(()=>ve);return l.useEffect(()=>{t==="authenticated"?ve=!0:t==="needs-login"&&(ve=!1)},[t]),t==="needs-login"?n.jsx(gt,{provider:r,credsPresent:a,reason:s,expiresAt:o,onAuthenticated:()=>void c(),onAuthorized:()=>{}}):t==="authenticated"||i?n.jsx(pt,{...e}):n.jsxs("div",{"data-testid":"gated-agent-chat-checking",className:"mt-2 flex items-center gap-3 rounded-lg border border-[var(--border-subtle)] px-3 py-4",children:[n.jsx("span",{"aria-hidden":"true",className:"h-4 w-4 rounded-full border-2 border-[var(--text-dim)] border-t-transparent animate-spin"}),n.jsx("span",{className:"text-xs text-[var(--text-dim)]",children:"Checking your account…"})]})}const Oa=Object.freeze(Object.defineProperty({__proto__:null,GatedAgentChat:yt},Symbol.toStringTag,{value:"Module"}));function vt(){return n.jsx("div",{className:"flex h-full items-center justify-center p-6",children:n.jsxs("div",{className:"max-w-xs text-center space-y-2",children:[n.jsx("p",{className:"text-sm text-[var(--text-muted)]",children:"No scenario data yet."}),n.jsx("p",{className:"text-xs text-[var(--text-dim)]",children:"Seed data and HTTP mocks will appear here as the scenario captures them, or add them with the scenario editor."})]})})}const Ma=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelEmptyState:vt},Symbol.toStringTag,{value:"Module"}));function jt({variant:e,onClose:t}){return e!=="slideOver"?null:n.jsx("button",{onClick:t,className:"rounded border border-[var(--border-default)] bg-transparent px-2 py-1 text-xs text-[var(--text-muted)] hover:text-[var(--text-primary)] cursor-pointer",children:"Close"})}const Aa=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelCloseButton:jt},Symbol.toStringTag,{value:"Module"}));function _t({variant:e,providerLabel:t,chatOpen:r,onToggleChat:a}){const s=e==="inline",o=s?"flex items-center gap-1.5 px-3 py-1.5 rounded border text-xs font-medium cursor-pointer transition-colors":"flex items-center gap-1.5 px-2.5 py-1 rounded border text-xs cursor-pointer transition-colors",c=r?"border-[var(--accent-active)] bg-[var(--accent-active)]/15 text-[var(--accent-active)]":s?"border-[var(--accent-active)] bg-[var(--accent-active)] text-black hover:bg-[var(--accent-active)]/90":"border-[var(--border-default)] bg-transparent text-[var(--text-muted)] hover:text-[var(--text-primary)] hover:border-[var(--accent-active)]/40";return n.jsxs("button",{type:"button",onClick:a,className:`${o} ${c}`,title:`Open a chat with ${t} seeded with this scenario's context`,children:[n.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:n.jsx("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})}),"Edit with ",t]})}const Pa=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelEditChatButton:_t},Symbol.toStringTag,{value:"Module"})),ke=new Set,Ce=new Set;let St={isActive:!1,previewSlug:null};function Tn(){for(const e of ke)e()}function Ra(e){return ke.add(e),()=>{ke.delete(e)}}function Da(e){St=e;for(const t of Ce)t(e)}function On(e){return Ce.add(e),()=>{Ce.delete(e)}}function Ye(){return St}function Mn(){const[e,t]=l.useState(()=>Ye());return l.useEffect(()=>(t(Ye()),On(t)),[]),e}function wt({panelSlug:e,scenarioState:t}){const r=Mn(),{isActive:a,previewSlug:s}=t??r;return s!==e?null:n.jsxs("button",{type:"button","aria-pressed":a,onClick:()=>Tn(),title:a?"Exit inspect data source":"Inspect data source — click a value in the live preview to see its mock",className:a?"flex items-center gap-1.5 px-2.5 py-1 rounded border text-xs cursor-pointer transition-colors border-[var(--accent-active)] bg-[var(--accent-active)]/15 text-[var(--accent-active)]":"flex items-center gap-1.5 px-2.5 py-1 rounded border text-xs cursor-pointer transition-colors border-[var(--border-default)] bg-transparent text-[var(--text-muted)] hover:text-[var(--text-primary)] hover:border-[var(--accent-active)]/40",children:[n.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("circle",{cx:"11",cy:"11",r:"8"}),n.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]}),a?"Inspecting…":"Inspect data"]})}const Ia=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelInspectButton:wt},Symbol.toStringTag,{value:"Module"}));function kt({variant:e,slug:t}){const r=()=>window.open(nr(t),"_blank");return e==="slideOver"?n.jsx("button",{type:"button",onClick:r,className:"p-1.5 rounded text-[var(--text-dim)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-card)] transition-colors cursor-pointer",title:"Open in new window",children:n.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),n.jsx("polyline",{points:"15 3 21 3 21 9"}),n.jsx("line",{x1:"10",y1:"14",x2:"21",y2:"3"})]})}):e==="inline"?n.jsxs("button",{type:"button",onClick:r,className:"flex items-center gap-1.5 px-2.5 py-1 rounded border border-[var(--border-default)] bg-transparent text-xs text-[var(--text-muted)] hover:text-[var(--text-primary)] hover:border-[var(--accent-active)]/40 transition-colors cursor-pointer",title:"Open the full data editor in a new browser tab",children:[n.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),n.jsx("polyline",{points:"15 3 21 3 21 9"}),n.jsx("line",{x1:"10",y1:"14",x2:"21",y2:"3"})]}),"Open in new tab"]}):null}const $a=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelOpenInNewButton:kt},Symbol.toStringTag,{value:"Module"}));function Ct(e){if(!e)return"Unsaved changes";const t=[];e.mocks.length>0&&t.push(`${e.mocks.length} mock${e.mocks.length===1?"":"s"}`);const r=e.seed.length;return r>0&&t.push(`${r} seed ${r===1?"table":"tables"}`),t.length>0?`Unsaved changes (${t.join(", ")})`:"Unsaved changes"}function Nt({diff:e,saving:t,cancelling:r,error:a,onSave:s,onCancel:o}){return n.jsxs("div",{className:"flex items-center justify-between gap-2 rounded border border-amber-500/40 bg-amber-500/10 px-2 py-1.5","data-testid":"scenario-draft-bar",children:[n.jsx("span",{className:"text-xs text-amber-300 font-medium",children:Ct(e)}),n.jsxs("div",{className:"flex items-center gap-2",children:[a&&n.jsx("span",{className:"text-xs text-red-400",children:a}),n.jsx("button",{type:"button",onClick:o,disabled:r||t,className:"px-2 py-0.5 text-xs rounded border border-[var(--border-default)] bg-[var(--bg-surface)] text-[var(--text-primary)] hover:bg-[var(--bg-input)] disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer",children:r?"Discarding…":"Cancel"}),n.jsx("button",{type:"button",onClick:s,disabled:r||t,className:"px-3 py-0.5 text-xs rounded border border-[var(--accent-blue)] bg-[var(--accent-blue)]/20 text-[var(--accent-blue)] hover:bg-[var(--accent-blue)]/30 disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer",children:t?"Saving…":"Save"})]})]})}const La=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDraftBar:Nt,summarizeDraftDiff:Ct},Symbol.toStringTag,{value:"Module"}));function Et({title:e,slug:t,provider:r,chatOpen:a,onToggleChat:s,variant:o,onClose:c,draftDirty:i,draftDiff:p,draftSaving:f,draftCancelling:g,draftError:h,onSave:d,onCancel:m}){const x=q(r),b=!!i&&!!d&&!!m;return n.jsxs("header",{className:"flex flex-col gap-2 border-b border-[var(--border-subtle)] bg-[var(--bg-deep)] px-4 py-3",children:[n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[n.jsx("div",{className:"min-w-0",children:n.jsxs("h2",{className:"text-sm font-medium text-[var(--text-primary)] truncate",children:["Scenario data: ",e]})}),n.jsxs("div",{className:"flex items-center gap-1",children:[n.jsx(_t,{variant:o,providerLabel:x,chatOpen:a,onToggleChat:s}),n.jsx(wt,{panelSlug:t}),n.jsx(kt,{variant:o,slug:t}),c&&n.jsx(jt,{variant:o,onClose:c})]})]}),b&&d&&m&&n.jsx(Nt,{diff:p??null,saving:f??!1,cancelling:g??!1,error:h??null,onSave:d,onCancel:m})]})}const Ba=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelHeader:Et},Symbol.toStringTag,{value:"Module"}));function An(e,t){const[r,a]=l.useState(e.status??200),[s,o]=l.useState(e.body??null),[c,i]=l.useState(()=>Object.entries(e.headers??{}).map(([h,d])=>({name:h,value:d})));l.useEffect(()=>{a(e.status??200),o(e.body??null),i(Object.entries(e.headers??{}).map(([h,d])=>({name:h,value:d})))},[t,e.status,e.body,e.headers]);const p=l.useMemo(()=>e.headers??{},[e.headers]),f=l.useMemo(()=>{if((e.status??200)!==r||JSON.stringify(e.body??null)!==JSON.stringify(s))return!0;const h={};for(const b of c)b.name.trim()&&(h[b.name.trim()]=b.value);const d=p,m=Object.keys(d),x=Object.keys(h);if(m.length!==x.length)return!0;for(const b of x)if(d[b]!==h[b])return!0;return!1},[r,s,c,e.status,e.body,p]);return{status:r,setStatus:a,body:s,setBody:o,headers:c,setHeaders:i,isDirty:f,buildPayload:()=>{const h={};for(const d of c)d.name.trim()&&(h[d.name.trim()]=d.value);return{status:r,body:s,headers:h}}}}const Pn=e=>navigator.clipboard.writeText(e);function Rn(e={}){const{writer:t=Pn,resetMs:r=2e3}=e,[a,s]=l.useState(!1),o=l.useRef(null),c=l.useCallback(async i=>{await t(i),s(!0),o.current!==null&&clearTimeout(o.current),o.current=setTimeout(()=>{s(!1),o.current=null},r)},[t,r]);return{copied:a,copy:c}}function Tt({body:e,onBodyChange:t}){const{copied:r,copy:a}=Rn();async function s(){try{const c=await navigator.clipboard.readText(),i=JSON.parse(c);t(i)}catch{}}function o(){a(JSON.stringify(e,null,2))}return n.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[n.jsx("button",{type:"button",onClick:()=>void s(),className:"text-[10px] px-2 py-0.5 rounded border border-[var(--border-default)] bg-transparent text-[var(--text-muted)] hover:text-[var(--text-primary)] cursor-pointer",children:"Paste"}),n.jsx("button",{type:"button",onClick:o,className:"text-[10px] px-2 py-0.5 rounded border border-[var(--border-default)] bg-transparent text-[var(--text-muted)] hover:text-[var(--text-primary)] cursor-pointer",children:r?"Copied":"Copy"})]})}const Fa=Object.freeze(Object.defineProperty({__proto__:null,JsonBodyActions:Tt},Symbol.toStringTag,{value:"Module"}));function G(e){return JSON.stringify(e)}function Ot(e,t){return e?e instanceof Set?e.has(t):e.includes(t):!1}function Dn(e){const t=new Set;function r(a,s){if(a!==null&&typeof a=="object")if(t.add(G(s)),Array.isArray(a))a.forEach((o,c)=>r(o,[...s,c]));else for(const[o,c]of Object.entries(a))r(c,[...s,o])}return r(e,[]),t}function In(e){return e===null?"text-slate-400 italic":typeof e=="string"?"text-emerald-300":typeof e=="number"?"text-amber-300":typeof e=="boolean"?"text-[#D7FF63]":"text-[var(--text-primary)]"}function $n(e){return e===null?"null":typeof e=="string"?`"${e}"`:String(e)}function Ln(e){return e===null?"null":typeof e=="string"?e:String(e)}function Bn(e){const t=e.trim();if(t==="")return"";if(t==="null")return null;if(t==="true")return!0;if(t==="false")return!1;try{return JSON.parse(t)}catch{return e}}function ce(e){return JSON.parse(JSON.stringify(e))}function Fn(e,t,r){if(t.length===0)return r;const a=ce(e);let s=a;for(let o=0;o<t.length-1;o++)s=s[t[o]];return s[t[t.length-1]]=r,a}function Ae(e,t){if(t.length===0)return e;const r=ce(e);let a=r;for(let o=0;o<t.length-1;o++)a=a[t[o]];const s=t[t.length-1];return Array.isArray(a)?a.splice(s,1):delete a[s],r}function Kn(e,t){const r=ce(e);let a=r;for(const s of t)a=a[s];return Array.isArray(a)&&a.push(null),r}function zn(e,t,r){const a=ce(e);let s=a;for(const o of t)s=s[o];return s&&typeof s=="object"&&!Array.isArray(s)&&(s[r]=""),a}function Hn(e){if(typeof e!="string"||e.length===0||e!=="$"&&!e.startsWith("$.")&&!e.startsWith("$["))return null;const t=[];let r=e[0]==="$"?1:0;for(;r<e.length;){const a=e[r];if(a==="."){r+=1;const s=r;for(;r<e.length&&e[r]!=="."&&e[r]!=="[";)r+=1;const o=e.slice(s,r);if(o.length===0)return null;t.push(o)}else if(a==="["){const s=e.indexOf("]",r);if(s===-1)return null;const o=e.slice(r+1,s);if(o.length===0)return null;const c=Number(o);if(!Number.isInteger(c)||c<0)return null;t.push(c),r=s+1}else return null}return t}function Yn(e,t){l.useEffect(()=>{if(!e)return;const r=Hn(e);r&&t(a=>{const s=new Set(a);for(let o=0;o<r.length;o++)s.add(G(r.slice(0,o)));return s})},[e,t])}function le({collapsible:e,isOpen:t,onToggle:r,parentKey:a,readOnly:s,onRemove:o,children:c}){return n.jsxs("div",{className:"group/row flex items-center gap-1 min-h-[1.5em] hover:bg-[var(--bg-card)]/30 rounded px-1",children:[e?n.jsx("button",{type:"button",onClick:r,className:"w-4 h-4 flex items-center justify-center text-[var(--text-dim)] hover:text-[var(--text-primary)] bg-transparent border-none cursor-pointer p-0","aria-label":t?"Collapse":"Expand",children:n.jsx("span",{className:"text-[10px]",children:t?"▾":"▸"})}):n.jsx("span",{className:"w-4"}),a!==null&&n.jsxs(n.Fragment,{children:[n.jsx("span",{className:"text-cyan-300",children:typeof a=="number"?`[${a}]`:a}),n.jsx("span",{className:"text-[var(--text-dim)]",children:":"})]}),n.jsx("div",{className:"flex-1 min-w-0 flex items-center gap-1",children:c}),!s&&o&&n.jsx("button",{type:"button",onClick:o,className:"opacity-0 group-hover/row:opacity-100 text-[10px] text-[var(--text-dim)] hover:text-red-400 bg-transparent border-none cursor-pointer px-1",title:"Remove",children:"×"})]})}const Ka=Object.freeze(Object.defineProperty({__proto__:null,JsonTreeNodeLine:le},Symbol.toStringTag,{value:"Module"}));function Mt(e){const{value:t,path:r,parentKey:a,expanded:s,onToggle:o,readOnly:c}=e,i=G(r),p=Ot(s,i),f=t.length>0;return n.jsxs("div",{children:[n.jsxs(le,{collapsible:f,isOpen:p,onToggle:()=>o(i),parentKey:a,readOnly:c,onRemove:r.length>0?()=>e.onValueChange(Ae(e.rootValue,r)):null,children:[n.jsx("span",{className:"text-[var(--text-dim)]",children:"["}),!p&&n.jsxs(n.Fragment,{children:[f&&n.jsxs("span",{className:"text-[var(--text-dim)] italic",children:[" ","…",t.length," item",t.length===1?"":"s"," "]}),n.jsx("span",{className:"text-[var(--text-dim)]",children:"]"})]})]}),p&&n.jsxs("div",{className:"ml-4 border-l border-[var(--border-subtle)] pl-2",children:[t.map((g,h)=>l.createElement(de,{...e,key:h,value:g,path:[...r,h],parentKey:h,isLast:h===t.length-1})),!c&&n.jsx("button",{type:"button",onClick:()=>e.onValueChange(Kn(e.rootValue,r)),className:"text-[10px] text-[var(--accent-blue)] hover:underline bg-transparent border-none cursor-pointer py-0.5",children:"+ Add item"})]}),p&&n.jsx("div",{className:"text-[var(--text-dim)]",children:"]"})]})}const za=Object.freeze(Object.defineProperty({__proto__:null,JsonTreeArrayNode:Mt},Symbol.toStringTag,{value:"Module"}));function At({onSave:e,onCancel:t}){const[r,a]=l.useState("");return n.jsxs("div",{className:"flex items-center gap-1 py-0.5",children:[n.jsx("span",{className:"text-[var(--text-dim)] text-[10px]",children:"+ key:"}),n.jsx("input",{autoFocus:!0,value:r,onChange:s=>a(s.target.value),onBlur:()=>e(r),onKeyDown:s=>{s.key==="Enter"?(s.preventDefault(),e(r)):s.key==="Escape"&&(s.preventDefault(),t())},placeholder:"keyName",className:"rounded border border-[var(--accent-active)]/50 bg-[var(--bg-surface)] px-1 py-0 text-xs font-mono text-[var(--text-primary)] min-w-[6rem]"})]})}const Ha=Object.freeze(Object.defineProperty({__proto__:null,JsonTreeAddKeyInput:At},Symbol.toStringTag,{value:"Module"}));function Pt(e){const{value:t,path:r,parentKey:a,expanded:s,onToggle:o,readOnly:c,addingKeyAtPath:i,onStartAddKey:p,onStopAddKey:f}=e,g=G(r),h=Ot(s,g),d=Object.entries(t),m=d.length>0,x=i===g;return n.jsxs("div",{children:[n.jsxs(le,{collapsible:m,isOpen:h,onToggle:()=>o(g),parentKey:a,readOnly:c,onRemove:r.length>0?()=>e.onValueChange(Ae(e.rootValue,r)):null,children:[n.jsx("span",{className:"text-[var(--text-dim)]",children:"{"}),!h&&n.jsxs(n.Fragment,{children:[m&&n.jsxs("span",{className:"text-[var(--text-dim)] italic",children:[" ","…",d.length," key",d.length===1?"":"s"," "]}),n.jsx("span",{className:"text-[var(--text-dim)]",children:"}"})]})]}),h&&n.jsxs("div",{className:"ml-4 border-l border-[var(--border-subtle)] pl-2",children:[d.map(([b,y],u)=>l.createElement(de,{...e,key:b,value:y,path:[...r,b],parentKey:b,isLast:u===d.length-1})),!c&&!x&&n.jsx("button",{type:"button",onClick:()=>p(g),className:"text-[10px] text-[var(--accent-blue)] hover:underline bg-transparent border-none cursor-pointer py-0.5",children:"+ Add key"}),!c&&x&&n.jsx(At,{onSave:b=>{b.trim()&&e.onValueChange(zn(e.rootValue,r,b.trim())),f()},onCancel:f})]}),h&&n.jsx("div",{className:"text-[var(--text-dim)]",children:"}"})]})}const Ya=Object.freeze(Object.defineProperty({__proto__:null,JsonTreeObjectNode:Pt},Symbol.toStringTag,{value:"Module"}));function Rt({initial:e,onSave:t,onCancel:r}){const[a,s]=l.useState(e);return n.jsx("input",{autoFocus:!0,value:a,onChange:o=>s(o.target.value),onBlur:()=>t(a),onKeyDown:o=>{o.key==="Enter"?(o.preventDefault(),t(a)):o.key==="Escape"&&(o.preventDefault(),r())},className:"flex-1 min-w-[4rem] rounded border border-[var(--accent-active)]/50 bg-[var(--bg-surface)] px-1 py-0 text-xs font-mono text-[var(--text-primary)]"})}const Va=Object.freeze(Object.defineProperty({__proto__:null,JsonTreePrimitiveEditor:Rt},Symbol.toStringTag,{value:"Module"}));function Dt(e){const{value:t,path:r,parentKey:a,readOnly:s,editingPath:o,onStartEdit:c,onStopEdit:i}=e,p=G(r),f=o===p;return n.jsx(le,{collapsible:!1,isOpen:!1,parentKey:a,readOnly:s,onToggle:()=>{},onRemove:r.length>0?()=>e.onValueChange(Ae(e.rootValue,r)):null,children:f?n.jsx(Rt,{initial:Ln(t),onSave:g=>{const h=Bn(g);e.onValueChange(Fn(e.rootValue,r,h)),i()},onCancel:i}):n.jsx("button",{type:"button",onClick:s?void 0:()=>c(p),disabled:s,className:`${s?"":"hover:bg-[var(--bg-card)] cursor-pointer"} bg-transparent border-none px-1 py-0 rounded ${In(t)} text-left font-mono`,title:s?void 0:"Click to edit",children:$n(t)})})}const Ua=Object.freeze(Object.defineProperty({__proto__:null,JsonTreePrimitiveNode:Dt},Symbol.toStringTag,{value:"Module"}));function de(e){const{value:t}=e;return Array.isArray(t)?n.jsx(Mt,{...e,value:t}):t!==null&&typeof t=="object"?n.jsx(Pt,{...e,value:t}):n.jsx(Dt,{...e})}const Wa=Object.freeze(Object.defineProperty({__proto__:null,JsonTreeNode:de},Symbol.toStringTag,{value:"Module"}));function ue({value:e,onChange:t,readOnly:r=!1,focusJsonPath:a}){const[s,o]=l.useState(()=>Dn(e)),[c,i]=l.useState(null),[p,f]=l.useState(null);Yn(a,o);function g(h){o(d=>{const m=new Set(d);return m.has(h)?m.delete(h):m.add(h),m})}return n.jsx("div",{className:"flex flex-col h-full min-h-0",children:n.jsx("div",{className:"flex-1 min-h-0 overflow-auto font-mono text-xs leading-relaxed text-[var(--text-primary)] bg-[var(--bg-input)] border border-[var(--border-default)] rounded p-3",children:n.jsx(de,{value:e,path:[],parentKey:null,isLast:!0,readOnly:r,expanded:s,editingPath:c,addingKeyAtPath:p,onToggle:g,onStartEdit:i,onStopEdit:()=>i(null),onStartAddKey:f,onStopAddKey:()=>f(null),onValueChange:t,rootValue:e})})})}const Ja=Object.freeze(Object.defineProperty({__proto__:null,JsonTreeEditor:ue},Symbol.toStringTag,{value:"Module"}));function It({headers:e,onChange:t}){function r(o,c){t(e.map((i,p)=>p===o?{...i,...c}:i))}function a(){t([...e,{name:"",value:""}])}function s(o){t(e.filter((c,i)=>i!==o))}return n.jsxs("div",{className:"space-y-1",children:[n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsx("label",{className:"text-xs text-[var(--text-muted)]",children:"Headers"}),n.jsx("button",{type:"button",onClick:a,className:"text-xs text-[var(--accent-blue)] hover:underline bg-transparent border-none cursor-pointer",children:"+ Add"})]}),e.length===0&&n.jsx("p",{className:"text-xs text-[var(--text-dim)] italic",children:"No headers"}),e.map((o,c)=>n.jsxs("div",{className:"flex gap-2",children:[n.jsx("input",{value:o.name,onChange:i=>r(c,{name:i.target.value}),placeholder:"Name",className:"flex-1 rounded border border-[var(--border-default)] bg-[var(--bg-surface)] px-2 py-1 text-xs font-mono"}),n.jsx("input",{value:o.value,onChange:i=>r(c,{value:i.target.value}),placeholder:"Value",className:"flex-1 rounded border border-[var(--border-default)] bg-[var(--bg-surface)] px-2 py-1 text-xs font-mono"}),n.jsx("button",{type:"button",onClick:()=>s(c),className:"px-2 text-xs text-[var(--text-dim)] hover:text-red-400 bg-transparent border-none cursor-pointer",children:"×"})]},c))]})}const Xa=Object.freeze(Object.defineProperty({__proto__:null,MockBodyHeadersEditor:It},Symbol.toStringTag,{value:"Module"})),je=5;function Vn(e,t){if(e==="loading")return"Computing impact…";if(e==null)return"";if(t.kind==="scenario")return"Affects only this scenario.";if(e.length===0)return"Affects no other scenarios.";const r=e.length===1?"scenario":"scenarios",a=e.slice(0,je).join(", "),s=e.length>je?`, +${e.length-je} more`:"";return`Affects ${e.length} ${r}: ${a}${s}`}function Un(e){const t=[{label:"This scenario only",description:"Write to this scenario's mocks file. The row's source flips to scenario.",scope:{kind:"scenario"}}];return e.source==="shared"&&e.sharedSlug&&t.push({label:`Shared data set "${e.sharedSlug}"`,description:"Write to the shared set this row came from. Affects every scenario opted into it.",scope:{kind:"shared",slug:e.sharedSlug}}),(e.source==="default"||e.source==="shared")&&t.push({label:"Defaults",description:"Write to _default.json. Affects every scenario that falls through to defaults for this route.",scope:{kind:"default"}}),t}function Wn(e,t){if(e.source==="default"){const r=t.findIndex(a=>a.scope.kind==="default");if(r>=0)return r}if(e.source==="shared"){const r=t.findIndex(a=>a.scope.kind==="shared"&&a.scope.slug===(e.sharedSlug??""));if(r>=0)return r}return 0}function Jn(e,t,r){const[a,s]=l.useState({}),o=r.map(c=>V(c.scope)).join("|");return l.useEffect(()=>{let c=!1;return(async()=>{const p={};for(const f of r)p[V(f.scope)]="loading";s(p);for(const f of r)try{const g=await pr(e,t,f.scope);if(c)return;s(h=>({...h,[V(f.scope)]:g}))}catch{if(c)return;s(g=>({...g,[V(f.scope)]:[]}))}})(),()=>{c=!0}},[e,t,o]),a}function $t({choice:e,selected:t,impactLabel:r,onSelect:a}){return n.jsxs("label",{className:`flex cursor-pointer flex-col rounded border p-3 text-xs transition-colors ${t?"border-violet-500 bg-violet-500/10":"border-[var(--border-subtle)] hover:bg-[var(--bg-elevated)]"}`,children:[n.jsxs("span",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"radio",name:"save-scope",checked:t,onChange:a}),n.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:e.label})]}),n.jsx("span",{className:"mt-1 pl-6 text-[var(--text-muted)]",children:e.description}),n.jsx("span",{className:"mt-1 pl-6 text-[var(--text-dim)] italic",children:r})]})}const qa=Object.freeze(Object.defineProperty({__proto__:null,SaveScopeChoiceRow:$t},Symbol.toStringTag,{value:"Module"}));function Lt({entry:e,scenarioSlug:t,routeKey:r,onCancel:a,onConfirm:s}){const o=Un(e),[c,i]=l.useState(()=>Wn(e,o)),p=Jn(t,r,o),[f,g]=l.useState(!1),[h,d]=l.useState(null),m=async()=>{const x=o[c];if(x){g(!0),d(null);try{await s(x.scope)}catch(b){d(b instanceof Error?b.message:"Save failed")}finally{g(!1)}}};return n.jsx("div",{role:"dialog","aria-modal":"true","aria-labelledby":"save-scope-modal-title",className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60",children:n.jsxs("div",{className:"w-[28rem] max-w-[90vw] rounded-lg border border-[var(--border-default)] bg-[var(--bg-surface)] p-5 shadow-xl",children:[n.jsx("h2",{id:"save-scope-modal-title",className:"text-sm font-semibold text-[var(--text-primary)]",children:"Where should this save land?"}),n.jsx("p",{className:"mt-1 text-xs text-[var(--text-muted)]",children:r}),n.jsx("div",{className:"mt-4 space-y-2",children:o.map((x,b)=>n.jsx($t,{choice:x,selected:c===b,impactLabel:Vn(p[V(x.scope)],x.scope),onSelect:()=>i(b)},V(x.scope)))}),h&&n.jsx("p",{className:"mt-3 text-xs text-red-400",role:"alert",children:h}),n.jsxs("div",{className:"mt-5 flex justify-end gap-2",children:[n.jsx("button",{type:"button",onClick:a,disabled:f,className:"rounded border border-[var(--border-default)] px-3 py-1.5 text-xs text-[var(--text-primary)] hover:bg-[var(--bg-elevated)] disabled:opacity-50",children:"Cancel"}),n.jsx("button",{type:"button",onClick:()=>void m(),disabled:f,className:"rounded bg-violet-500 px-3 py-1.5 text-xs font-medium text-white hover:bg-violet-400 disabled:opacity-50",children:f?"Saving…":"Save"})]})]})})}const Ga=Object.freeze(Object.defineProperty({__proto__:null,SaveScopeModal:Lt},Symbol.toStringTag,{value:"Module"}));function Bt({entry:e,routeKey:t,scenarioSlug:r,onSave:a,focusJsonPath:s}){const o=An(e,t),[c,i]=l.useState(null),[p,f]=l.useState(!1),[g,h]=l.useState(!1);l.useEffect(()=>{i(null),h(!1)},[t]);const d=async x=>{f(!0),i(null);try{const b=o.buildPayload();await a({routeKey:t,...b,scope:x})}catch(b){throw i(b instanceof Error?b.message:"Save failed"),b}finally{f(!1)}},m=async()=>{if(o.isDirty){if(e.source==="scenario"){try{await d({kind:"scenario"})}catch{}return}h(!0)}};return n.jsxs("div",{className:"flex flex-col gap-3 h-full min-h-0",children:[c&&n.jsx("p",{className:"text-xs text-red-400",children:c}),n.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[n.jsx("label",{className:"text-xs text-[var(--text-muted)]",children:"Status"}),n.jsx("input",{type:"number",value:o.status,onChange:x=>o.setStatus(Number(x.target.value)),className:"w-20 rounded border border-[var(--border-default)] bg-[var(--bg-surface)] px-2 py-1 text-xs font-mono"}),n.jsx("div",{className:"flex-1"}),n.jsx("button",{type:"button",onClick:()=>void m(),disabled:!o.isDirty||p,className:"rounded bg-violet-500 px-3 py-1 text-xs font-medium text-white hover:bg-violet-400 disabled:opacity-50",children:p?"Saving…":o.isDirty?"Save changes":"Saved"})]}),n.jsx(It,{headers:o.headers,onChange:o.setHeaders}),n.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[n.jsxs("div",{className:"flex items-center gap-2 pb-1",children:[n.jsx("label",{className:"text-xs text-[var(--text-muted)]",children:"Body"}),n.jsx(Tt,{body:o.body,onBodyChange:o.setBody})]}),n.jsx(ue,{value:o.body,onChange:o.setBody,focusJsonPath:s},t)]}),g&&n.jsx(Lt,{entry:e,scenarioSlug:r,routeKey:t,onCancel:()=>h(!1),onConfirm:async x=>{await d(x),h(!1)}})]})}const Qa=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelMainMockEditable:Bt},Symbol.toStringTag,{value:"Module"}));function Xn(e,t){if(e==null)return"never";const r=Math.max(0,Math.floor((t-e)/1e3));if(r<60)return`${r}s ago`;const a=Math.floor(r/60);return a<60?`${a}m ago`:`${Math.floor(a/60)}h ago`}const Ve={GET:"text-emerald-400 border-emerald-400/40",POST:"text-[#D7FF63] border-[#D7FF63]/40",PUT:"text-amber-400 border-amber-400/40",PATCH:"text-purple-400 border-purple-400/40",DELETE:"text-red-400 border-red-400/40"};function qn(e){return Ve[e]??Ve.GET}function Ft({entry:e,scenarioHasDefaultFallback:t,onSave:r,onRemove:a,onPassthrough:s}){const o=`${e.method} ${e.pathPattern}`,c=qn(e.method),i=e.status??e.lastObservedStatus,p=l.useMemo(()=>e.lastObservedMs?Xn(e.lastObservedMs,Date.now()):null,[e.lastObservedMs]),f="px-3 py-1 rounded border border-[var(--border-default)] bg-transparent text-[var(--text-muted)] hover:text-[var(--text-primary)] cursor-pointer text-xs";return n.jsxs("header",{className:"border-b border-[var(--border-subtle)] bg-[var(--bg-deep)] px-4 py-3 space-y-2 flex-shrink-0",children:[n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsx("span",{className:`px-2 py-0.5 rounded border font-mono text-xs ${c}`,children:e.method}),n.jsx("span",{className:"font-mono text-sm text-[var(--text-primary)] break-all",children:e.pathPattern}),n.jsx(Te,{source:e.source}),i!==void 0&&n.jsx("span",{className:"px-1.5 py-0.5 rounded border border-[var(--border-default)] text-[var(--text-muted)] font-mono text-xs",children:i}),e.observedCount>0&&n.jsxs("span",{className:"ml-auto text-xs text-[var(--text-dim)]",children:[e.observedCount,"× ",p?`· ${p}`:""]})]}),e.variants.length>1&&n.jsxs("div",{className:"text-[10px] text-[var(--text-dim)] font-mono",children:["variants: ",e.variants.filter(g=>g!==o).join(", ")]}),n.jsxs("div",{className:"flex flex-wrap gap-2 pt-1",children:[e.source==="scenario"&&t&&n.jsx("button",{onClick:()=>void a(o),className:f,title:"Remove this scenario mock and fall back to the default",children:"Revert to default"}),e.source==="scenario"&&n.jsx("button",{onClick:()=>void s(o),className:f,children:"Mark passthrough"}),e.source==="default"&&n.jsxs(n.Fragment,{children:[n.jsx("button",{onClick:()=>void r({routeKey:o,status:e.status??200,body:e.body,headers:e.headers??{},scope:{kind:"scenario"}}),className:"px-3 py-1 rounded border border-emerald-500/50 bg-emerald-500/10 text-emerald-300 hover:bg-emerald-500/20 cursor-pointer text-xs",title:"Copy default body into this scenario",children:"Promote to scenario"}),n.jsx("button",{onClick:()=>void s(o),className:f,children:"Mark passthrough"})]}),e.source==="passthrough"&&n.jsx("button",{onClick:()=>void a(o),className:f,children:"Undo passthrough"})]})]})}const Za=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelMainMockHeader:Ft},Symbol.toStringTag,{value:"Module"}));function Kt({entry:e}){const t=Object.entries(e.headers??{}),r=e.body!==void 0&&e.body!==null;return!r&&t.length===0?n.jsx("p",{className:"text-xs italic text-[var(--text-dim)]",children:e.source==="catalog-only"?"No mock body yet — this endpoint has only been observed, not mocked. Promote it to a scenario to start editing.":e.source==="passthrough"?"This endpoint passes through to the upstream service.":"No body configured."}):n.jsxs("div",{className:"space-y-3 h-full min-h-0 flex flex-col",children:[t.length>0&&n.jsxs("section",{className:"space-y-1 flex-shrink-0",children:[n.jsx("h4",{className:"text-xs font-medium uppercase tracking-wide text-[var(--text-dim)]",children:"Headers"}),n.jsx("dl",{className:"text-xs font-mono space-y-0.5",children:t.map(([a,s])=>n.jsxs("div",{className:"flex gap-2",children:[n.jsxs("dt",{className:"text-[var(--text-muted)]",children:[a,":"]}),n.jsx("dd",{className:"text-[var(--text-primary)] break-all",children:s})]},a))})]}),r&&n.jsxs("section",{className:"flex-1 min-h-0 flex flex-col",children:[n.jsx("h4",{className:"text-xs font-medium uppercase tracking-wide text-[var(--text-dim)] pb-1",children:"Body"}),n.jsx(ue,{value:e.body,onChange:()=>{},readOnly:!0},`${e.method} ${e.pathPattern}`)]})]})}const es=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelMainMockReadOnly:Kt},Symbol.toStringTag,{value:"Module"}));function zt({entry:e,scenarioSlug:t,scenarioHasDefaultFallback:r,onSave:a,onRemove:s,onPassthrough:o,focusJsonPath:c}){const i=`${e.method} ${e.pathPattern}`,p=e.source==="scenario"||e.source==="default"||e.source==="shared";return n.jsxs("div",{className:"flex flex-col h-full min-h-0",children:[n.jsx(Ft,{entry:e,scenarioHasDefaultFallback:r,onSave:a,onRemove:s,onPassthrough:o}),n.jsx("div",{className:"flex-1 min-h-0 overflow-auto p-4",children:p?n.jsx(Bt,{entry:e,routeKey:i,scenarioSlug:t,onSave:a,focusJsonPath:c}):n.jsx(Kt,{entry:e})})]})}const ts=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelMainMock:zt},Symbol.toStringTag,{value:"Module"}));function Gn({slug:e,tab:t,initialRows:r,onCellEdited:a}){const[s,o]=l.useState(r),[c,i]=l.useState(null),[p,f]=l.useState(""),[g,h]=l.useState(""),d=l.useRef(null);l.useEffect(()=>{o(r),i(null)},[t.dataKey,r]);function m(v,C){const j=s[v];i({row:v,col:C});const S=j[C]===null?"":typeof j[C]=="object"?JSON.stringify(j[C]):String(j[C]);f(S),h(S)}function x(v){if(f(v),d.current&&clearTimeout(d.current),!c)return;const C=c;d.current=setTimeout(()=>{u(C.row,C.col,v)},600)}function b(){c&&(d.current&&clearTimeout(d.current),u(c.row,c.col,p),i(null))}function y(){if(d.current&&clearTimeout(d.current),!!c){if(p!==g){const v=[...s];v[c.row]={...v[c.row],[c.col]:Ie(g)},o(v),fetch(`/api/scenarios/${encodeURIComponent(e)}/data`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({table:t.dataKey,rowIndex:c.row,column:c.col,value:g})}).then(()=>{J(),a&&a()}).catch(()=>{})}i(null)}}async function u(v,C,j){const S=[...s];S[v]={...S[v],[C]:Ie(j)},o(S);try{await fetch(`/api/scenarios/${encodeURIComponent(e)}/data`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({table:t.dataKey,rowIndex:v,column:C,value:j})}),J(),a&&a()}catch{}}return{rows:s,editingCell:c,editValue:p,handleEditCell:m,handleEditValueChange:x,handleSave:b,handleCancelEdit:y}}function Ht({tab:e}){return!e.description&&!e.category?null:n.jsxs("div",{className:"flex items-center gap-2 px-3 py-1.5 bg-[var(--bg-deep)] border-b border-[var(--border-subtle)]",children:[e.category&&n.jsx("span",{className:`text-[9px] rounded px-1.5 py-0 border ${e.category==="datastore"?"text-[var(--accent-active)]/80 bg-[var(--accent-active)]/10 border-[var(--accent-active)]/30":e.category==="mock-api"?"text-[#D7FF63]/80 bg-[#D7FF63]/10 border-[#D7FF63]/30":"text-[var(--text-muted)] bg-[var(--bg-surface)]/30 border-[var(--text-dim)]/30"}`,children:e.category==="mock-api"?"API Mock":e.category}),e.description&&n.jsx("span",{className:"text-[10px] text-[var(--text-dim)]",children:e.description})]})}const rs=Object.freeze(Object.defineProperty({__proto__:null,DataViewerCategoryBadge:Ht},Symbol.toStringTag,{value:"Module"}));function Yt({editingCell:e,editValue:t,onEditValueChange:r,onSave:a,onCancel:s}){return n.jsxs("div",{className:"border-t border-[var(--border-default)] bg-[var(--bg-deep)] px-3 py-2",children:[n.jsx("div",{className:"flex items-center gap-2 mb-1.5",children:n.jsxs("span",{className:"text-[10px] text-[var(--text-muted)]",children:["Editing"," ",n.jsx("strong",{className:"text-[var(--text-secondary)]",children:e.col})," ","in row ",e.row+1]})}),n.jsx("textarea",{value:t,onChange:o=>r(o.target.value),className:"w-full px-2 py-1.5 text-[11px] bg-[var(--bg-card)] text-[var(--text-primary)] border border-[var(--border-default)] rounded outline-none focus:border-[var(--accent-active)]/50 resize-y min-h-[60px] max-h-[200px] font-mono",autoFocus:!0,rows:t.length>100?4:2,onKeyDown:o=>{o.key==="Escape"&&s(),o.key==="Enter"&&(o.metaKey||o.ctrlKey)&&a()}}),n.jsxs("div",{className:"flex items-center gap-2 mt-1.5",children:[n.jsx("button",{onClick:a,className:"px-3 py-1 text-[10px] font-medium text-[var(--bg-deep)] bg-[var(--accent-active)] rounded cursor-pointer border-none hover:bg-[var(--accent-active)]/80 transition-colors",children:"Save"}),n.jsx("button",{onClick:s,className:"px-3 py-1 text-[10px] text-[var(--text-muted)] hover:text-[var(--text-primary)] bg-transparent border-none cursor-pointer",children:"Cancel"}),n.jsxs("span",{className:"text-[9px] text-[var(--text-dim)] ml-auto",children:["⌘","+Enter to save, Esc to cancel"]})]})]})}const ns=Object.freeze(Object.defineProperty({__proto__:null,DataViewerCellEditor:Yt},Symbol.toStringTag,{value:"Module"}));function Vt({columns:e,colTypes:t,pkCol:r,rows:a,onEditCell:s}){return e.length===0?n.jsx("div",{className:"px-3 py-4 text-[10px] text-[var(--text-dim)] text-center",children:"No columns defined for this table"}):n.jsx("div",{className:"overflow-x-auto max-h-[300px] overflow-y-auto",children:n.jsxs("table",{className:"w-full text-[10px] border-collapse table-fixed",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"bg-[var(--bg-deep)] sticky top-0 z-10",children:[n.jsx("th",{className:"text-right text-[var(--text-dim)] font-normal px-2 py-1.5 border-b border-[var(--border-default)] w-8",children:"#"}),e.map(o=>n.jsx(Ut,{name:o,type:t[o],isPk:o===r},o))]})}),n.jsx("tbody",{children:a.map((o,c)=>n.jsx(Wt,{row:o,rowIndex:c,columns:e,pkCol:r,onEditCell:s},c))})]})})}function Ut({name:e,type:t,isPk:r}){return n.jsxs("th",{className:"text-left px-2 py-1.5 border-b border-[var(--border-default)] whitespace-nowrap overflow-hidden",children:[r&&n.jsx("span",{className:"inline-block text-[8px] font-bold text-[var(--bg-deep)] bg-[var(--accent-active)] rounded px-1 py-0 mr-1.5 align-middle",children:"PK"}),n.jsx("span",{className:"text-[var(--text-secondary)] font-medium",children:e}),n.jsx("span",{className:"text-[var(--text-dim)] font-normal ml-1",children:t})]})}function Wt({row:e,rowIndex:t,columns:r,pkCol:a,onEditCell:s}){return n.jsxs("tr",{className:"border-b border-[var(--border-subtle)] hover:bg-[var(--bg-card)] group/row",children:[n.jsx("td",{className:"text-right text-[var(--text-dim)] px-2 py-1.5 w-8 select-none",children:t+1}),r.map(o=>n.jsx(Jt,{value:e[o],isPk:o===a,onEdit:()=>s(t,o)},o))]})}function Jt({value:e,isPk:t,onEdit:r}){return n.jsxs("td",{className:`px-2 py-1.5 overflow-hidden relative group/cell ${t?"text-[var(--accent-active)] font-medium":"text-[var(--text-secondary)]"}`,title:String(e??""),children:[n.jsx("span",{className:"truncate block whitespace-nowrap",children:e===null?n.jsx("span",{className:"text-[var(--text-dim)] italic",children:"null"}):typeof e=="object"?n.jsx("span",{className:"text-[var(--text-dim)]",children:JSON.stringify(e)}):typeof e=="number"?n.jsx("span",{className:"text-amber-400",children:String(e)}):String(e)}),n.jsx("button",{onClick:a=>{a.stopPropagation(),r()},className:"absolute right-1 top-1/2 -translate-y-1/2 opacity-0 group-hover/cell:opacity-100 text-[var(--text-dim)] hover:text-[var(--text-primary)] bg-[var(--bg-card)] border border-[var(--border-default)] rounded cursor-pointer p-0.5 transition-opacity",title:"Edit",children:n.jsxs("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),n.jsx("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})]})})]})}const as=Object.freeze(Object.defineProperty({__proto__:null,DataViewerCell:Jt,DataViewerColumnHeader:Ut,DataViewerRow:Wt,DataViewerTable:Vt},Symbol.toStringTag,{value:"Module"}));function Xt({slug:e,tab:t,initialRows:r,onCellEdited:a}){const{rows:s,editingCell:o,editValue:c,handleEditCell:i,handleEditValueChange:p,handleSave:f,handleCancelEdit:g}=Gn({slug:e,tab:t,initialRows:r,onCellEdited:a}),h=yr(s,t.schemaFields),d=vr(h,s,t.schemaFields),m=jr(h,t.schemaFields);return n.jsxs("div",{className:"flex flex-col h-full min-h-0",children:[n.jsx(Ht,{tab:t}),n.jsx("div",{className:"flex-1 min-h-0 overflow-auto",children:n.jsx(Vt,{columns:h,colTypes:d,pkCol:m,rows:s,onEditCell:i})}),o&&n.jsx(Yt,{editingCell:o,editValue:c,onEditValueChange:p,onSave:f,onCancel:g})]})}const ss=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelMainTable:Xt},Symbol.toStringTag,{value:"Module"}));function Qn({slug:e,browserState:t,tab:r,onCellEdited:a}){const s=l.useMemo(()=>{if(!t)return{};switch(r){case"cookies":return t.cookies??{};case"localStorage":return t.localStorage??{};case"sessionStorage":return t.sessionStorage??{};case"headers":return t.requestHeaders??{};default:return{}}},[t,r]),o=l.useCallback(async p=>{const f=r==="headers"?"browserState.requestHeaders":`browserState.${r}`;try{await fetch(`/api/scenarios/${encodeURIComponent(e)}/data`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:f,value:JSON.stringify(p)})}),J(),a&&a()}catch{}},[e,r,a]),c=l.useMemo(()=>{switch(r){case"cookies":return"Cookies";case"localStorage":return"Local Storage";case"sessionStorage":return"Session Storage";case"headers":return"Request Headers"}},[r]),i=l.useMemo(()=>{switch(r){case"cookies":return"Cookies injected via Set-Cookie headers on the scenario's initial response.";case"localStorage":return"localStorage items set before the app's JavaScript executes.";case"sessionStorage":return"sessionStorage items set before the app's JavaScript executes.";case"headers":return"Custom headers added to every outbound HTTP request from the iframe."}},[r]);return{value:s,handleChange:o,label:c,description:i}}function qt({slug:e,browserState:t,tab:r,onCellEdited:a}){const{value:s,handleChange:o,label:c,description:i}=Qn({slug:e,browserState:t,tab:r,onCellEdited:a});return n.jsxs("div",{className:"flex flex-col h-full min-h-0",children:[n.jsxs("div",{className:"px-4 py-3 border-b border-[var(--border-subtle)]",children:[n.jsx("h2",{className:"text-sm font-semibold text-[var(--text-primary)]",children:c}),n.jsx("p",{className:"text-xs text-[var(--text-dim)] mt-1",children:i})]}),n.jsx("div",{className:"flex-1 min-h-0 p-4 overflow-auto",children:n.jsx(ue,{value:s,onChange:o})})]})}const os=Object.freeze(Object.defineProperty({__proto__:null,BrowserStateTab:qt},Symbol.toStringTag,{value:"Module"}));function ae({label:e,active:t,onClick:r}){return n.jsx("button",{type:"button",onClick:r,className:`px-2 py-0.5 rounded-full border text-[10px] font-mono transition-colors cursor-pointer ${t?"bg-violet-500/25 text-violet-100 border-violet-400/70":"bg-violet-500/10 text-violet-300 border-violet-500/40 hover:bg-violet-500/20"}`,"aria-pressed":t,children:e})}const is=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelMockDataBadge:ae},Symbol.toStringTag,{value:"Module"}));function Gt({shares:e,activeBadge:t,onSelect:r}){return n.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap border-b border-[var(--border-subtle)] bg-[var(--bg-deep)] px-4 py-2","data-testid":"scenario-mock-data-strip",children:[n.jsx("span",{className:"text-[10px] uppercase tracking-wider text-[var(--text-dim)] font-semibold",children:"Mock Data:"}),n.jsx(ae,{label:"This Page",active:t.kind==="this-page",onClick:()=>r({kind:"this-page"})}),e.map(a=>n.jsx(ae,{label:a,active:t.kind==="share"&&t.slug===a,onClick:()=>r({kind:"share",slug:a})},a)),n.jsx(ae,{label:"Defaults",active:t.kind==="defaults",onClick:()=>r({kind:"defaults"})})]})}const cs=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanelMockDataStrip:Gt},Symbol.toStringTag,{value:"Module"}));function Zn({slug:e,scenarioName:t,initialSection:r,onClose:a,variant:s="slideOver"}){const{data:o,tableTabs:c,scenarioOwnedDataKeys:i,shares:p,browserState:f,loading:g,error:h}=Er(e),{entries:d,loading:m,error:x,upsertScoped:b,remove:y,setPassthrough:u}=mr(e),{config:v}=Ue(),C=(v==null?void 0:v.provider)??"claude",j=Ar({slug:e,onPreviewReload:J}),S=l.useCallback(()=>{j.markDirty(),J()},[j]),I=l.useCallback(async M=>{await b(M),S()},[b,S]),N=l.useCallback(async M=>{await y(M),S()},[y,S]),_=l.useCallback(async M=>{await u(M),S()},[u,S]),w=l.useCallback(()=>{j.markDirty(),J()},[j]),$=l.useCallback(()=>{a&&j.confirmIfDirty("Discard unsaved changes to this scenario?")&&a()},[a,j]),[k,A]=l.useState(null),[B,L]=l.useState(null),[P,D]=l.useState(!1),F=l.useCallback(M=>A({kind:"mock",routeKey:M}),[]);ir({onSelect:F,onFocus:L});const[H,Q]=l.useState({kind:"this-page"}),W=g||m,K=l.useMemo(()=>s==="inline"?c.filter(M=>i.has(M.dataKey)):c,[s,c,i]),E=l.useMemo(()=>{if(s!=="inline")return d;switch(H.kind){case"this-page":return d.filter(M=>M.consumedThisPageLoad);case"defaults":return d.filter(M=>M.source==="default");case"share":return d.filter(M=>M.source==="shared"&&M.sharedSlug===H.slug)}},[s,d,H]);Fr({seedTabs:K,mockEntries:E,initialSection:r,selection:k,setSelection:A});const T=l.useMemo(()=>{const M=new Set;for(const Pe of d)Pe.source==="default"&&M.add(U(Pe));return M},[d]),R=(k==null?void 0:k.kind)==="seed"?K.find(M=>M.dataKey===k.dataKey)??null:null,O=(k==null?void 0:k.kind)==="mock"?E.find(M=>U(M)===k.routeKey)??null:null,fe=R&&o?o[R.dataKey]??[]:[],Qt=l.useMemo(()=>ar({slug:e,scenarioName:t,seedTabs:K,mockEntries:E,selectedMock:O,selectedSeedTab:R,selectedSeedRows:fe}),[e,t,K,E,O,R,fe]),Zt=t??e,pe=K.length>0||E.length>0,he=n.jsxs("div",{className:"flex flex-col h-full min-h-0",children:[n.jsx(Et,{title:Zt,slug:e,provider:C,chatOpen:P,onToggleChat:()=>D(M=>!M),variant:s,onClose:a?$:void 0,draftDirty:j.isDirty,draftDiff:j.diffSummary,draftSaving:j.saving,draftCancelling:j.cancelling,draftError:j.error,onSave:()=>void j.save(),onCancel:()=>void j.cancel()}),s==="inline"&&n.jsx(Gt,{shares:p,activeBadge:H,onSelect:Q}),P&&n.jsx("div",{className:"flex-shrink-0 border-b border-[var(--border-subtle)] bg-[var(--bg-deep)]",children:n.jsx(yt,{chatName:`edit-data-${e}`,prompt:Qt,height:360,onClose:()=>D(!1)})}),n.jsxs("div",{className:"flex flex-1 min-h-0",children:[n.jsx(Qe,{seedTabs:K,mockEntries:E,selection:k,onSelect:A}),n.jsx("main",{className:"flex-1 min-w-0 min-h-0 bg-[var(--bg-deep)] flex flex-col",children:n.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[h&&n.jsxs("p",{className:"p-4 text-xs text-red-400",children:["Seed error: ",h]}),x&&n.jsxs("p",{className:"p-4 text-xs text-red-400",children:["Mocks error: ",x]}),!W&&!pe&&n.jsx(vt,{}),R&&n.jsx(Xt,{slug:e,tab:R,initialRows:fe,onCellEdited:w}),O&&n.jsx(zt,{entry:O,scenarioSlug:e,scenarioHasDefaultFallback:T.has(U(O)),onSave:I,onRemove:N,onPassthrough:_,focusJsonPath:B}),(k==null?void 0:k.kind)==="browser"&&n.jsx(qt,{slug:e,browserState:f,tab:k.tab,onCellEdited:w}),!R&&!O&&(k==null?void 0:k.kind)!=="browser"&&pe&&!W&&n.jsx("p",{className:"p-4 text-xs text-[var(--text-dim)] italic",children:"Select a data source from the left to view it."}),W&&!pe&&n.jsx("p",{className:"p-4 text-xs text-[var(--text-dim)]",children:"Loading scenario data…"})]})})]})]});return s==="fullPage"?n.jsx("div",{className:"fixed inset-0 bg-[var(--bg-deep)] text-[var(--text-primary)]",children:he}):s==="inline"?n.jsx("div",{className:"rounded-md border border-[var(--border-subtle)] bg-[var(--bg-deep)] max-h-[min(640px,70vh)] min-h-0 flex flex-col overflow-hidden",children:he}):n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"fixed inset-0 z-40 bg-black/40",onClick:$,"aria-label":"Close scenario data panel"}),n.jsx("aside",{className:"fixed right-0 top-0 z-50 h-full w-full max-w-4xl border-l border-[var(--border-default)] bg-[var(--bg-deep)] shadow-2xl",children:he})]})}const ls=Object.freeze(Object.defineProperty({__proto__:null,ScenarioDataPanel:Zn},Symbol.toStringTag,{value:"Module"}));export{at as $,_n as A,qt as B,qe as C,Wt as D,Ge as E,Lt as F,$t as G,Qe as H,Gt as I,Dt as J,ae as K,kt as L,It as M,Ft as N,zt as O,wt as P,Et as Q,vt as R,Zn as S,st as T,_t as U,jt as V,Vt as W,Yt as X,Ht as Y,Xe as Z,Je as _,Te as a,Rn as a$,nt as a0,rt as a1,tt as a2,ot as a3,ft as a4,mt as a5,xt as a6,bt as a7,yt as a8,gt as a9,Pa as aA,Aa as aB,ls as aC,Ga as aD,qa as aE,Ta as aF,Ea as aG,ia as aH,da as aI,Xa as aJ,va as aK,ka as aL,Ua as aM,Va as aN,Ya as aO,Ka as aP,Wa as aQ,Ja as aR,za as aS,Ha as aT,Fa as aU,Oa as aV,as as aW,ns as aX,rs as aY,os as aZ,wa as a_,Sa as aa,_a as ab,Na as ac,Ca as ad,ba as ae,ga as af,ma as ag,xa as ah,ya as ai,ha as aj,ua as ak,la as al,ca as am,La as an,fa as ao,$a as ap,cs as aq,is as ar,ss as as,es as at,Za as au,Qa as av,ts as aw,Ia as ax,Ba as ay,Ma as az,Xt as b,Ue as b0,q as b1,Me as b2,pn as b3,ge as b4,un as b5,ja as b6,Yr as b7,Vr as b8,qr as b9,an as ba,Ur as bb,cn as bc,Ze as bd,sn as be,ht as bf,ne as bg,Wr as bh,hr as bi,sa as bj,Da as bk,Ra as bl,oa as bm,pa as bn,Sn as bo,Hr as bp,Ne as bq,kn as br,Bt as c,Kt as d,J as e,Xn as f,Ar as g,Er as h,mr as i,te as j,Ut as k,Jt as l,X as m,it as n,pt as o,Ie as p,Rt as q,Pt as r,le as s,de as t,wn as u,ue as v,Mt as w,At as x,Tt as y,Nt as z};