@grackle-ai/web 0.48.0 → 0.49.0

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.
@@ -95,4 +95,4 @@ const grackle = await host.mcpServer({
95
95
  url: env.vars.GRACKLE_MCP_URL,
96
96
  });
97
97
 
98
- $\`Summarize the current tasks.\`;`,rows:20,className:$e.scriptEditor,required:!0,"data-testid":"persona-script-editor"})]})]}),h.jsxs("div",{className:$e.formActions,children:[h.jsx("button",{type:"submit",className:$e.btnPrimary,children:u?"Save":"Create"}),h.jsx("button",{type:"button",onClick:q,className:$e.btnSecondary,children:"Cancel"})]})]});return h.jsxs("div",{className:$e.container,children:[h.jsxs("div",{className:$e.header,children:[h.jsx("h2",{children:"Personas"}),h.jsx("button",{onClick:te,className:$e.btnPrimary,children:"+ New Persona"})]}),(m||u)&&ue(),n.length===0&&!m?h.jsx("p",{className:$e.empty,children:"No personas yet. Create one to get started."}):h.jsx("div",{className:$e.list,children:n.map(K=>{const Ge=r===K.id,we=K.type==="script";return h.jsxs("div",{className:`${$e.card} ${(u==null?void 0:u.id)===K.id?$e.active:""}`,"data-testid":`persona-card-${K.id}`,children:[h.jsxs("div",{className:$e.cardHeader,children:[h.jsxs("span",{className:$e.cardTitle,children:[h.jsx("strong",{children:K.name}),h.jsx("span",{className:$e.typeBadge,"data-testid":`persona-type-badge-${K.id}`,children:we?"Script":"Agent"}),Ge&&h.jsx("span",{className:$e.defaultBadge,"data-testid":`persona-default-badge-${K.id}`,children:"App Default"})]}),h.jsxs("div",{className:$e.cardActions,children:[!Ge&&h.jsx("button",{onClick:()=>d(K.id),className:$e.btnSmall,"data-testid":`persona-set-default-${K.id}`,title:"Set as app default persona",children:"Set Default"}),h.jsx("button",{onClick:()=>pe(K),className:$e.btnSmall,children:"Edit"}),y===K.id?h.jsxs(h.Fragment,{children:[h.jsx("button",{onClick:()=>Q(K.id),className:$e.btnDanger,children:"Confirm"}),h.jsx("button",{onClick:()=>v(null),className:$e.btnSmall,children:"Cancel"})]}):h.jsx("button",{onClick:()=>v(K.id),className:$e.btnSmall,children:"Delete"})]})]}),K.description&&h.jsx("p",{className:$e.description,children:K.description}),h.jsxs("div",{className:$e.meta,children:[K.runtime&&h.jsxs("span",{children:["Runtime: ",K.runtime]}),K.model&&h.jsxs("span",{children:["Model: ",K.model]}),K.maxTurns>0&&h.jsxs("span",{children:["Max turns: ",K.maxTurns]})]}),we?h.jsxs("details",{className:$e.promptDetails,children:[h.jsx("summary",{children:"Script"}),h.jsx("pre",{className:$e.promptText,children:K.script})]}):h.jsxs("details",{className:$e.promptDetails,children:[h.jsx("summary",{children:"System Prompt"}),h.jsx("pre",{className:$e.promptText,children:K.systemPrompt})]})]},K.id)})})]})}function g6(){return h.jsx(m6,{})}function v6(){const{themeId:n,resolvedThemeId:a,setTheme:i,preferSystem:o,setPreferSystem:r}=W0();return h.jsxs("section",{className:re.section,children:[h.jsx("h3",{className:re.sectionTitle,children:"Appearance"}),h.jsx("p",{className:re.sectionDescription,children:"Choose how Grackle looks across the app."}),h.jsx("div",{className:re.themeOptions,children:ac.filter(d=>!d.hidden).map(d=>{const u=!!(d.variantLightId&&d.variantDarkId),p=u?n===d.id||n===d.variantLightId||n===d.variantDarkId:n===d.id,m=u&&a===d.variantLightId;return h.jsxs("button",{type:"button",className:`${re.themeOption} ${p?re.themeOptionSelected:""}`,"aria-pressed":p,onClick:()=>i(d.id),children:[h.jsxs("span",{className:re.themeOptionHeader,children:[h.jsxs("span",{children:[h.jsx("span",{className:re.themeOptionLabel,children:d.label}),h.jsx("span",{className:re.themeOptionDesc,children:d.description})]}),u&&h.jsxs("span",{className:re.variantToggle,children:[h.jsx("span",{role:"button",tabIndex:0,className:`${re.variantButton} ${p&&m?re.variantActive:""}`,onClick:g=>{g.stopPropagation(),r(!1),i(d.variantLightId)},onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),g.stopPropagation(),r(!1),i(d.variantLightId))},"aria-label":"Light variant","aria-pressed":p&&m,children:"☼"}),h.jsx("span",{role:"button",tabIndex:0,className:`${re.variantButton} ${p&&!m?re.variantActive:""}`,onClick:g=>{g.stopPropagation(),r(!1),i(d.variantDarkId)},onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),g.stopPropagation(),r(!1),i(d.variantDarkId))},"aria-label":"Dark variant","aria-pressed":p&&!m,children:"☾"})]})]}),d.swatches&&h.jsx("span",{className:re.themeSwatches,children:d.swatches.map((g,y)=>h.jsx("span",{className:re.themeSwatch,style:{background:g}},y))})]},d.id)})}),h.jsxs("label",{className:re.systemToggle,children:[h.jsx("input",{type:"checkbox",checked:o,onChange:d=>r(d.target.checked)}),h.jsx("span",{children:"Match system light/dark preference"})]}),h.jsx("p",{className:re.systemToggleHint,children:"Automatically switches between light and dark variants when available."}),h.jsxs("p",{className:re.themeActive,children:["Active theme: ",h.jsx("strong",{children:a})]})]})}function y6(){return h.jsx(v6,{})}function b6(){const{connected:n,environments:a,sessions:i}=Lt(),o=a.filter(u=>u.status==="connected").length,r=a.length,d=i.filter(u=>["running","idle"].includes(u.status)).length;return h.jsxs("section",{className:re.section,"data-testid":"about-panel",children:[h.jsx("h3",{className:re.sectionTitle,children:"About"}),h.jsx("p",{className:re.sectionDescription,children:"Connection status and application information."}),h.jsxs("div",{className:re.aboutGrid,children:[h.jsxs("div",{className:re.aboutItem,children:[h.jsx("span",{className:re.aboutLabel,children:"Connection"}),h.jsxs("span",{className:re.aboutValue,children:[h.jsx("span",{className:`${re.aboutDot} ${n?re.aboutDotConnected:re.aboutDotDisconnected}`}),n?"Connected":"Disconnected"]})]}),h.jsxs("div",{className:re.aboutItem,children:[h.jsx("span",{className:re.aboutLabel,children:"Environments"}),h.jsxs("span",{className:re.aboutValue,children:[o,"/",r," connected"]})]}),h.jsxs("div",{className:re.aboutItem,children:[h.jsx("span",{className:re.aboutLabel,children:"Active Sessions"}),h.jsx("span",{className:re.aboutValue,children:d})]}),h.jsxs("div",{className:re.aboutItem,children:[h.jsx("span",{className:re.aboutLabel,children:"Version"}),h.jsx("span",{className:re.aboutValue,children:"0.47.1"})]})]})]})}function S6(){return h.jsx(b6,{})}const x6="_wizard_1260s_1",_6="_container_1260s_10",T6="_stepContent_1260s_19",E6="_logoArea_1260s_28",C6="_logoImage_1260s_32",A6="_heading_1260s_41",k6="_tagline_1260s_49",w6="_subtitle_1260s_56",N6="_featureList_1260s_64",j6="_runtimeGrid_1260s_89",D6="_runtimeCard_1260s_101",M6="_runtimeName_1260s_133",R6="_runtimeDescription_1260s_139",O6="_buttonRow_1260s_144",B6="_primaryButton_1260s_151",L6="_ghostButton_1260s_185",I6="_dots_1260s_213",U6="_dot_1260s_213",st={wizard:x6,container:_6,stepContent:T6,logoArea:E6,logoImage:C6,heading:A6,tagline:k6,subtitle:w6,featureList:N6,runtimeGrid:j6,runtimeCard:D6,runtimeName:M6,runtimeDescription:R6,buttonRow:O6,primaryButton:B6,ghostButton:L6,dots:I6,dot:U6};function z6({onNext:n}){return h.jsxs("div",{className:st.stepContent,"data-testid":"setup-welcome",children:[h.jsx("div",{className:st.logoArea,children:h.jsx("img",{src:"/grackle-logo.png",alt:"Grackle",className:st.logoImage})}),h.jsx("h1",{className:st.heading,children:"Welcome to Grackle"}),h.jsx("p",{className:st.tagline,children:"Multi-agent orchestration for software teams"}),h.jsx("button",{type:"button",className:st.primaryButton,onClick:n,"data-testid":"setup-get-started",children:"Get Started"})]})}function V6({onNext:n,onBack:a}){return h.jsxs("div",{className:st.stepContent,"data-testid":"setup-about",children:[h.jsx("h2",{className:st.heading,children:"What is Grackle?"}),h.jsxs("ul",{className:st.featureList,children:[h.jsx("li",{children:"Run Claude, Copilot, and Codex agents side by side"}),h.jsx("li",{children:"Provision and control dev environments — SSH, Codespaces, or local"}),h.jsx("li",{children:"Organize work into workspaces with agent-executable tasks"}),h.jsx("li",{children:"Customize agent behavior with personas, tools, and MCP servers"}),h.jsx("li",{children:"Live-stream agent sessions with full terminal replay"})]}),h.jsxs("div",{className:st.buttonRow,children:[h.jsx("button",{type:"button",className:st.ghostButton,onClick:a,children:"Back"}),h.jsx("button",{type:"button",className:st.primaryButton,onClick:n,"data-testid":"setup-about-next",children:"Next"})]})]})}const H6=[{id:"claude-code",name:"Claude Code",description:"Anthropic's agentic coding tool"},{id:"copilot",name:"Copilot Coding Agent",description:"GitHub's AI pair programmer"},{id:"codex",name:"Codex CLI",description:"OpenAI's coding agent"}];function G6({currentRuntime:n,onFinish:a,onBack:i,finishDisabled:o}){const[r,d]=S.useState(n||"claude-code");return S.useEffect(()=>{n&&d(n)},[n]),h.jsxs("div",{className:st.stepContent,"data-testid":"setup-runtime",children:[h.jsx("h2",{className:st.heading,children:"Choose Your Runtime"}),h.jsx("p",{className:st.subtitle,children:"Select the primary agent runtime for your workspace. You can change this later."}),h.jsx("div",{className:st.runtimeGrid,children:H6.map(u=>h.jsxs("button",{type:"button",className:st.runtimeCard,"data-selected":r===u.id,"aria-pressed":r===u.id,"data-testid":`runtime-card-${u.id}`,onClick:()=>d(u.id),children:[h.jsx("span",{className:st.runtimeName,children:u.name}),h.jsx("span",{className:st.runtimeDescription,children:u.description})]},u.id))}),h.jsxs("div",{className:st.buttonRow,children:[h.jsx("button",{type:"button",className:st.ghostButton,onClick:i,children:"Back"}),h.jsx("button",{type:"button",className:st.primaryButton,onClick:()=>a(r),disabled:o,"data-testid":"setup-finish",children:"Finish"})]})]})}const P6=3,F6={"claude-code":"sonnet",copilot:"gpt-4o",codex:"o3"};function $6(){const{personas:n,updatePersona:a,completeOnboarding:i,onboardingCompleted:o}=Lt(),r=On(),[d,u]=S.useState(0),p=n.find(g=>g.id==="claude-code"),m=S.useCallback(g=>{if(p&&g!==p.runtime){const y=F6[g]??"sonnet";a(p.id,void 0,void 0,void 0,g,y)}i(),r("/",{replace:!0})},[p,a,i,r]);return o===!0?h.jsx(ji,{to:"/",replace:!0}):h.jsx("div",{className:st.wizard,"data-testid":"setup-wizard",children:h.jsxs("div",{className:st.container,children:[h.jsx(Mn,{mode:"wait",children:h.jsxs(qt.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:-40},transition:{duration:.2,ease:"easeInOut"},children:[d===0&&h.jsx(z6,{onNext:()=>u(1)}),d===1&&h.jsx(V6,{onNext:()=>u(2),onBack:()=>u(0)}),d===2&&h.jsx(G6,{currentRuntime:(p==null?void 0:p.runtime)??"claude-code",onFinish:m,onBack:()=>u(1),finishDisabled:!p})]},d)}),h.jsx("div",{className:st.dots,children:Array.from({length:P6},(g,y)=>h.jsx("span",{className:st.dot,"data-active":y===d},y))})]})})}const q6="_root_h353j_1",Y6="_body_h353j_7",K6="_main_h353j_19",Z6="_sidebarWrapper_h353j_26",X6="_overlay_h353j_56",Il={root:q6,body:Y6,main:K6,sidebarWrapper:Z6,overlay:X6},Q6=typeof window<"u"&&new URLSearchParams(window.location.search).has("mock");function W6(){const{lastSpawnedId:n,environments:a,connected:i,onboardingCompleted:o}=Lt(),{showToast:r}=so();WD(a,r);const d=On(),u=Wt(),p=u.pathname.startsWith(Di),[m,g]=S.useState(!1),y=S.useCallback(()=>g(v=>!v),[]);return S.useEffect(()=>{g(!1)},[u.pathname]),S.useEffect(()=>{if(!m)return;const v=x=>{x.key==="Escape"&&g(!1)};return document.addEventListener("keydown",v),()=>{document.removeEventListener("keydown",v)}},[m]),S.useEffect(()=>{n&&!u.pathname.startsWith("/tasks/")&&d(F0(n),{replace:!0})},[n,d,u.pathname]),i&&o===!1?h.jsx(ji,{to:"/setup",replace:!0}):h.jsxs("div",{className:Il.root,children:[h.jsx(aC,{onToggleSidebar:p?void 0:y,sidebarOpen:m}),h.jsxs("div",{className:Il.body,children:[h.jsx("div",{className:Il.sidebarWrapper,"data-sidebar-open":m,"data-settings":p,children:p?h.jsx(SB,{}):h.jsx(bD,{})}),m&&!p&&h.jsx("div",{className:Il.overlay,"data-testid":"drawer-overlay",onClick:()=>g(!1)}),h.jsxs("div",{className:Il.main,children:[h.jsx(z0,{}),h.jsx(UD,{})]})]}),h.jsx(QD,{})]})}function J6(){return h.jsxs(TT,{children:[h.jsx(bt,{path:"setup",element:h.jsx($6,{})}),h.jsxs(bt,{element:h.jsx(W6,{}),children:[h.jsx(bt,{index:!0,element:h.jsx(IR,{})}),h.jsx(bt,{path:"sessions/new",element:h.jsx(FR,{})}),h.jsx(bt,{path:"sessions/:sessionId",element:h.jsx(i3,{})}),h.jsx(bt,{path:"workspaces/:workspaceId",element:h.jsx(EO,{})}),h.jsx(bt,{path:"tasks/new",element:h.jsx(qO,{})}),h.jsx(bt,{path:"tasks/:taskId",element:h.jsx(Xd,{})}),h.jsx(bt,{path:"tasks/:taskId/stream",element:h.jsx(Xd,{})}),h.jsx(bt,{path:"tasks/:taskId/findings",element:h.jsx(Xd,{})}),h.jsx(bt,{path:"tasks/:taskId/edit",element:h.jsx(YO,{})}),h.jsx(bt,{path:"environments/new",element:h.jsx(uB,{})}),h.jsxs(bt,{path:"settings",element:h.jsx(mB,{}),children:[h.jsx(bt,{index:!0,element:h.jsx(ji,{to:"environments",replace:!0})}),h.jsx(bt,{path:"environments",element:h.jsx(a4,{})}),h.jsx(bt,{path:"credentials",element:h.jsx(F4,{})}),h.jsx(bt,{path:"tokens",element:h.jsx(ji,{to:"../credentials",replace:!0})}),h.jsx(bt,{path:"personas",element:h.jsx(g6,{})}),h.jsx(bt,{path:"appearance",element:h.jsx(y6,{})}),h.jsx(bt,{path:"about",element:h.jsx(S6,{})})]}),h.jsx(bt,{path:"*",element:h.jsx(ji,{to:"/",replace:!0})})]})]})}const e5=1e4;function t5(){const{onboardingCompleted:n}=Lt(),[a,i]=S.useState(!1);S.useEffect(()=>{if(n!==void 0)return;const r=setTimeout(()=>i(!0),e5);return()=>clearTimeout(r)},[n]);const o=n===void 0&&!a;return h.jsx(Mn,{mode:"wait",children:o?h.jsx(qt.div,{initial:{opacity:1},exit:{opacity:0},transition:{duration:.25},children:h.jsx(vj,{})},"splash"):h.jsx(qt.div,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.25},style:{minHeight:"100vh"},children:h.jsx(KT,{children:h.jsx(J6,{})})},"app")})}function n5(){const n=Q6?HE:ME;return h.jsx(YE,{children:h.jsx(PE,{children:h.jsx(n,{children:h.jsx(t5,{})})})})}C_.createRoot(document.getElementById("root")).render(h.jsx(S.StrictMode,{children:h.jsx(n5,{})}));
98
+ $\`Summarize the current tasks.\`;`,rows:20,className:$e.scriptEditor,required:!0,"data-testid":"persona-script-editor"})]})]}),h.jsxs("div",{className:$e.formActions,children:[h.jsx("button",{type:"submit",className:$e.btnPrimary,children:u?"Save":"Create"}),h.jsx("button",{type:"button",onClick:q,className:$e.btnSecondary,children:"Cancel"})]})]});return h.jsxs("div",{className:$e.container,children:[h.jsxs("div",{className:$e.header,children:[h.jsx("h2",{children:"Personas"}),h.jsx("button",{onClick:te,className:$e.btnPrimary,children:"+ New Persona"})]}),(m||u)&&ue(),n.length===0&&!m?h.jsx("p",{className:$e.empty,children:"No personas yet. Create one to get started."}):h.jsx("div",{className:$e.list,children:n.map(K=>{const Ge=r===K.id,we=K.type==="script";return h.jsxs("div",{className:`${$e.card} ${(u==null?void 0:u.id)===K.id?$e.active:""}`,"data-testid":`persona-card-${K.id}`,children:[h.jsxs("div",{className:$e.cardHeader,children:[h.jsxs("span",{className:$e.cardTitle,children:[h.jsx("strong",{children:K.name}),h.jsx("span",{className:$e.typeBadge,"data-testid":`persona-type-badge-${K.id}`,children:we?"Script":"Agent"}),Ge&&h.jsx("span",{className:$e.defaultBadge,"data-testid":`persona-default-badge-${K.id}`,children:"App Default"})]}),h.jsxs("div",{className:$e.cardActions,children:[!Ge&&h.jsx("button",{onClick:()=>d(K.id),className:$e.btnSmall,"data-testid":`persona-set-default-${K.id}`,title:"Set as app default persona",children:"Set Default"}),h.jsx("button",{onClick:()=>pe(K),className:$e.btnSmall,children:"Edit"}),y===K.id?h.jsxs(h.Fragment,{children:[h.jsx("button",{onClick:()=>Q(K.id),className:$e.btnDanger,children:"Confirm"}),h.jsx("button",{onClick:()=>v(null),className:$e.btnSmall,children:"Cancel"})]}):h.jsx("button",{onClick:()=>v(K.id),className:$e.btnSmall,children:"Delete"})]})]}),K.description&&h.jsx("p",{className:$e.description,children:K.description}),h.jsxs("div",{className:$e.meta,children:[K.runtime&&h.jsxs("span",{children:["Runtime: ",K.runtime]}),K.model&&h.jsxs("span",{children:["Model: ",K.model]}),K.maxTurns>0&&h.jsxs("span",{children:["Max turns: ",K.maxTurns]})]}),we?h.jsxs("details",{className:$e.promptDetails,children:[h.jsx("summary",{children:"Script"}),h.jsx("pre",{className:$e.promptText,children:K.script})]}):h.jsxs("details",{className:$e.promptDetails,children:[h.jsx("summary",{children:"System Prompt"}),h.jsx("pre",{className:$e.promptText,children:K.systemPrompt})]})]},K.id)})})]})}function g6(){return h.jsx(m6,{})}function v6(){const{themeId:n,resolvedThemeId:a,setTheme:i,preferSystem:o,setPreferSystem:r}=W0();return h.jsxs("section",{className:re.section,children:[h.jsx("h3",{className:re.sectionTitle,children:"Appearance"}),h.jsx("p",{className:re.sectionDescription,children:"Choose how Grackle looks across the app."}),h.jsx("div",{className:re.themeOptions,children:ac.filter(d=>!d.hidden).map(d=>{const u=!!(d.variantLightId&&d.variantDarkId),p=u?n===d.id||n===d.variantLightId||n===d.variantDarkId:n===d.id,m=u&&a===d.variantLightId;return h.jsxs("button",{type:"button",className:`${re.themeOption} ${p?re.themeOptionSelected:""}`,"aria-pressed":p,onClick:()=>i(d.id),children:[h.jsxs("span",{className:re.themeOptionHeader,children:[h.jsxs("span",{children:[h.jsx("span",{className:re.themeOptionLabel,children:d.label}),h.jsx("span",{className:re.themeOptionDesc,children:d.description})]}),u&&h.jsxs("span",{className:re.variantToggle,children:[h.jsx("span",{role:"button",tabIndex:0,className:`${re.variantButton} ${p&&m?re.variantActive:""}`,onClick:g=>{g.stopPropagation(),r(!1),i(d.variantLightId)},onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),g.stopPropagation(),r(!1),i(d.variantLightId))},"aria-label":"Light variant","aria-pressed":p&&m,children:"☼"}),h.jsx("span",{role:"button",tabIndex:0,className:`${re.variantButton} ${p&&!m?re.variantActive:""}`,onClick:g=>{g.stopPropagation(),r(!1),i(d.variantDarkId)},onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),g.stopPropagation(),r(!1),i(d.variantDarkId))},"aria-label":"Dark variant","aria-pressed":p&&!m,children:"☾"})]})]}),d.swatches&&h.jsx("span",{className:re.themeSwatches,children:d.swatches.map((g,y)=>h.jsx("span",{className:re.themeSwatch,style:{background:g}},y))})]},d.id)})}),h.jsxs("label",{className:re.systemToggle,children:[h.jsx("input",{type:"checkbox",checked:o,onChange:d=>r(d.target.checked)}),h.jsx("span",{children:"Match system light/dark preference"})]}),h.jsx("p",{className:re.systemToggleHint,children:"Automatically switches between light and dark variants when available."}),h.jsxs("p",{className:re.themeActive,children:["Active theme: ",h.jsx("strong",{children:a})]})]})}function y6(){return h.jsx(v6,{})}function b6(){const{connected:n,environments:a,sessions:i}=Lt(),o=a.filter(u=>u.status==="connected").length,r=a.length,d=i.filter(u=>["running","idle"].includes(u.status)).length;return h.jsxs("section",{className:re.section,"data-testid":"about-panel",children:[h.jsx("h3",{className:re.sectionTitle,children:"About"}),h.jsx("p",{className:re.sectionDescription,children:"Connection status and application information."}),h.jsxs("div",{className:re.aboutGrid,children:[h.jsxs("div",{className:re.aboutItem,children:[h.jsx("span",{className:re.aboutLabel,children:"Connection"}),h.jsxs("span",{className:re.aboutValue,children:[h.jsx("span",{className:`${re.aboutDot} ${n?re.aboutDotConnected:re.aboutDotDisconnected}`}),n?"Connected":"Disconnected"]})]}),h.jsxs("div",{className:re.aboutItem,children:[h.jsx("span",{className:re.aboutLabel,children:"Environments"}),h.jsxs("span",{className:re.aboutValue,children:[o,"/",r," connected"]})]}),h.jsxs("div",{className:re.aboutItem,children:[h.jsx("span",{className:re.aboutLabel,children:"Active Sessions"}),h.jsx("span",{className:re.aboutValue,children:d})]}),h.jsxs("div",{className:re.aboutItem,children:[h.jsx("span",{className:re.aboutLabel,children:"Version"}),h.jsx("span",{className:re.aboutValue,children:"0.48.0"})]})]})]})}function S6(){return h.jsx(b6,{})}const x6="_wizard_1260s_1",_6="_container_1260s_10",T6="_stepContent_1260s_19",E6="_logoArea_1260s_28",C6="_logoImage_1260s_32",A6="_heading_1260s_41",k6="_tagline_1260s_49",w6="_subtitle_1260s_56",N6="_featureList_1260s_64",j6="_runtimeGrid_1260s_89",D6="_runtimeCard_1260s_101",M6="_runtimeName_1260s_133",R6="_runtimeDescription_1260s_139",O6="_buttonRow_1260s_144",B6="_primaryButton_1260s_151",L6="_ghostButton_1260s_185",I6="_dots_1260s_213",U6="_dot_1260s_213",st={wizard:x6,container:_6,stepContent:T6,logoArea:E6,logoImage:C6,heading:A6,tagline:k6,subtitle:w6,featureList:N6,runtimeGrid:j6,runtimeCard:D6,runtimeName:M6,runtimeDescription:R6,buttonRow:O6,primaryButton:B6,ghostButton:L6,dots:I6,dot:U6};function z6({onNext:n}){return h.jsxs("div",{className:st.stepContent,"data-testid":"setup-welcome",children:[h.jsx("div",{className:st.logoArea,children:h.jsx("img",{src:"/grackle-logo.png",alt:"Grackle",className:st.logoImage})}),h.jsx("h1",{className:st.heading,children:"Welcome to Grackle"}),h.jsx("p",{className:st.tagline,children:"Multi-agent orchestration for software teams"}),h.jsx("button",{type:"button",className:st.primaryButton,onClick:n,"data-testid":"setup-get-started",children:"Get Started"})]})}function V6({onNext:n,onBack:a}){return h.jsxs("div",{className:st.stepContent,"data-testid":"setup-about",children:[h.jsx("h2",{className:st.heading,children:"What is Grackle?"}),h.jsxs("ul",{className:st.featureList,children:[h.jsx("li",{children:"Run Claude, Copilot, and Codex agents side by side"}),h.jsx("li",{children:"Provision and control dev environments — SSH, Codespaces, or local"}),h.jsx("li",{children:"Organize work into workspaces with agent-executable tasks"}),h.jsx("li",{children:"Customize agent behavior with personas, tools, and MCP servers"}),h.jsx("li",{children:"Live-stream agent sessions with full terminal replay"})]}),h.jsxs("div",{className:st.buttonRow,children:[h.jsx("button",{type:"button",className:st.ghostButton,onClick:a,children:"Back"}),h.jsx("button",{type:"button",className:st.primaryButton,onClick:n,"data-testid":"setup-about-next",children:"Next"})]})]})}const H6=[{id:"claude-code",name:"Claude Code",description:"Anthropic's agentic coding tool"},{id:"copilot",name:"Copilot Coding Agent",description:"GitHub's AI pair programmer"},{id:"codex",name:"Codex CLI",description:"OpenAI's coding agent"}];function G6({currentRuntime:n,onFinish:a,onBack:i,finishDisabled:o}){const[r,d]=S.useState(n||"claude-code");return S.useEffect(()=>{n&&d(n)},[n]),h.jsxs("div",{className:st.stepContent,"data-testid":"setup-runtime",children:[h.jsx("h2",{className:st.heading,children:"Choose Your Runtime"}),h.jsx("p",{className:st.subtitle,children:"Select the primary agent runtime for your workspace. You can change this later."}),h.jsx("div",{className:st.runtimeGrid,children:H6.map(u=>h.jsxs("button",{type:"button",className:st.runtimeCard,"data-selected":r===u.id,"aria-pressed":r===u.id,"data-testid":`runtime-card-${u.id}`,onClick:()=>d(u.id),children:[h.jsx("span",{className:st.runtimeName,children:u.name}),h.jsx("span",{className:st.runtimeDescription,children:u.description})]},u.id))}),h.jsxs("div",{className:st.buttonRow,children:[h.jsx("button",{type:"button",className:st.ghostButton,onClick:i,children:"Back"}),h.jsx("button",{type:"button",className:st.primaryButton,onClick:()=>a(r),disabled:o,"data-testid":"setup-finish",children:"Finish"})]})]})}const P6=3,F6={"claude-code":"sonnet",copilot:"gpt-4o",codex:"o3"};function $6(){const{personas:n,updatePersona:a,completeOnboarding:i,onboardingCompleted:o}=Lt(),r=On(),[d,u]=S.useState(0),p=n.find(g=>g.id==="claude-code"),m=S.useCallback(g=>{if(p&&g!==p.runtime){const y=F6[g]??"sonnet";a(p.id,void 0,void 0,void 0,g,y)}i(),r("/",{replace:!0})},[p,a,i,r]);return o===!0?h.jsx(ji,{to:"/",replace:!0}):h.jsx("div",{className:st.wizard,"data-testid":"setup-wizard",children:h.jsxs("div",{className:st.container,children:[h.jsx(Mn,{mode:"wait",children:h.jsxs(qt.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:-40},transition:{duration:.2,ease:"easeInOut"},children:[d===0&&h.jsx(z6,{onNext:()=>u(1)}),d===1&&h.jsx(V6,{onNext:()=>u(2),onBack:()=>u(0)}),d===2&&h.jsx(G6,{currentRuntime:(p==null?void 0:p.runtime)??"claude-code",onFinish:m,onBack:()=>u(1),finishDisabled:!p})]},d)}),h.jsx("div",{className:st.dots,children:Array.from({length:P6},(g,y)=>h.jsx("span",{className:st.dot,"data-active":y===d},y))})]})})}const q6="_root_h353j_1",Y6="_body_h353j_7",K6="_main_h353j_19",Z6="_sidebarWrapper_h353j_26",X6="_overlay_h353j_56",Il={root:q6,body:Y6,main:K6,sidebarWrapper:Z6,overlay:X6},Q6=typeof window<"u"&&new URLSearchParams(window.location.search).has("mock");function W6(){const{lastSpawnedId:n,environments:a,connected:i,onboardingCompleted:o}=Lt(),{showToast:r}=so();WD(a,r);const d=On(),u=Wt(),p=u.pathname.startsWith(Di),[m,g]=S.useState(!1),y=S.useCallback(()=>g(v=>!v),[]);return S.useEffect(()=>{g(!1)},[u.pathname]),S.useEffect(()=>{if(!m)return;const v=x=>{x.key==="Escape"&&g(!1)};return document.addEventListener("keydown",v),()=>{document.removeEventListener("keydown",v)}},[m]),S.useEffect(()=>{n&&!u.pathname.startsWith("/tasks/")&&d(F0(n),{replace:!0})},[n,d,u.pathname]),i&&o===!1?h.jsx(ji,{to:"/setup",replace:!0}):h.jsxs("div",{className:Il.root,children:[h.jsx(aC,{onToggleSidebar:p?void 0:y,sidebarOpen:m}),h.jsxs("div",{className:Il.body,children:[h.jsx("div",{className:Il.sidebarWrapper,"data-sidebar-open":m,"data-settings":p,children:p?h.jsx(SB,{}):h.jsx(bD,{})}),m&&!p&&h.jsx("div",{className:Il.overlay,"data-testid":"drawer-overlay",onClick:()=>g(!1)}),h.jsxs("div",{className:Il.main,children:[h.jsx(z0,{}),h.jsx(UD,{})]})]}),h.jsx(QD,{})]})}function J6(){return h.jsxs(TT,{children:[h.jsx(bt,{path:"setup",element:h.jsx($6,{})}),h.jsxs(bt,{element:h.jsx(W6,{}),children:[h.jsx(bt,{index:!0,element:h.jsx(IR,{})}),h.jsx(bt,{path:"sessions/new",element:h.jsx(FR,{})}),h.jsx(bt,{path:"sessions/:sessionId",element:h.jsx(i3,{})}),h.jsx(bt,{path:"workspaces/:workspaceId",element:h.jsx(EO,{})}),h.jsx(bt,{path:"tasks/new",element:h.jsx(qO,{})}),h.jsx(bt,{path:"tasks/:taskId",element:h.jsx(Xd,{})}),h.jsx(bt,{path:"tasks/:taskId/stream",element:h.jsx(Xd,{})}),h.jsx(bt,{path:"tasks/:taskId/findings",element:h.jsx(Xd,{})}),h.jsx(bt,{path:"tasks/:taskId/edit",element:h.jsx(YO,{})}),h.jsx(bt,{path:"environments/new",element:h.jsx(uB,{})}),h.jsxs(bt,{path:"settings",element:h.jsx(mB,{}),children:[h.jsx(bt,{index:!0,element:h.jsx(ji,{to:"environments",replace:!0})}),h.jsx(bt,{path:"environments",element:h.jsx(a4,{})}),h.jsx(bt,{path:"credentials",element:h.jsx(F4,{})}),h.jsx(bt,{path:"tokens",element:h.jsx(ji,{to:"../credentials",replace:!0})}),h.jsx(bt,{path:"personas",element:h.jsx(g6,{})}),h.jsx(bt,{path:"appearance",element:h.jsx(y6,{})}),h.jsx(bt,{path:"about",element:h.jsx(S6,{})})]}),h.jsx(bt,{path:"*",element:h.jsx(ji,{to:"/",replace:!0})})]})]})}const e5=1e4;function t5(){const{onboardingCompleted:n}=Lt(),[a,i]=S.useState(!1);S.useEffect(()=>{if(n!==void 0)return;const r=setTimeout(()=>i(!0),e5);return()=>clearTimeout(r)},[n]);const o=n===void 0&&!a;return h.jsx(Mn,{mode:"wait",children:o?h.jsx(qt.div,{initial:{opacity:1},exit:{opacity:0},transition:{duration:.25},children:h.jsx(vj,{})},"splash"):h.jsx(qt.div,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.25},style:{minHeight:"100vh"},children:h.jsx(KT,{children:h.jsx(J6,{})})},"app")})}function n5(){const n=Q6?HE:ME;return h.jsx(YE,{children:h.jsx(PE,{children:h.jsx(n,{children:h.jsx(t5,{})})})})}C_.createRoot(document.getElementById("root")).render(h.jsx(S.StrictMode,{children:h.jsx(n5,{})}));
package/dist/index.html CHANGED
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Grackle</title>
7
- <script type="module" crossorigin src="/assets/index-Cj704U8-.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-B8WEOTpH.js"></script>
8
8
  <link rel="modulepreload" crossorigin href="/assets/markdown-gcy1Jmzi.js">
9
9
  <link rel="modulepreload" crossorigin href="/assets/dagview-EHk2VaeR.js">
10
10
  <link rel="stylesheet" crossorigin href="/assets/index-CjG_a24F.css">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grackle-ai/web",
3
- "version": "0.48.0",
3
+ "version": "0.49.0",
4
4
  "description": "React web UI for the Grackle multi-agent coordination platform",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -31,7 +31,7 @@
31
31
  "rehype-prism-plus": "^2.0.0",
32
32
  "remark-gfm": "^4.0.0",
33
33
  "react-router": "^7.0.0",
34
- "@grackle-ai/common": "0.48.0"
34
+ "@grackle-ai/common": "0.49.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@rushstack/heft": "1.2.4",