claude-code-session-manager 0.125.0 → 0.125.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +4 -3
- package/dist/assets/{AgentLibrary-CcnnJg8P.js → AgentLibrary-DjEH5SoY.js} +1 -1
- package/dist/assets/{Button-sA4lqAao.js → Button-B8NLivk-.js} +1 -1
- package/dist/assets/{DataModel-BSTejIBU.js → DataModel-CHiBk8m_.js} +1 -1
- package/dist/assets/{History-DuwlZsQ5.js → History-DttgrJO0.js} +1 -1
- package/dist/assets/{Hooks-DHDSoDJ_.js → Hooks-Bvy0BH1u.js} +1 -1
- package/dist/assets/{Library-XA9osRfi.js → Library-UbBOgkkP.js} +1 -1
- package/dist/assets/{ListDetail-B3goE3Wc.js → ListDetail-xOyOpVZX.js} +1 -1
- package/dist/assets/{McpServers-cMZTsPS6.js → McpServers-CoGL0ddv.js} +1 -1
- package/dist/assets/{Memory-D6qntpZ0.js → Memory-Cise856d.js} +1 -1
- package/dist/assets/{Panel-DIyJXHfp.js → Panel-Cj72VO5s.js} +1 -1
- package/dist/assets/{Permissions-DJda4Aii.js → Permissions-BoJ9AB-G.js} +1 -1
- package/dist/assets/{Plugins-DcdRVBnU.js → Plugins-DfT24sAZ.js} +2 -2
- package/dist/assets/{ProvenanceBadge-BSI_2wAv.js → ProvenanceBadge-ChkIslT4.js} +1 -1
- package/dist/assets/{SaveBar-CeL4vXRp.js → SaveBar-RCXr0jey.js} +1 -1
- package/dist/assets/{Scheduler-CTd19y5U.js → Scheduler-B70tknnx.js} +1 -1
- package/dist/assets/{ScopeSwitcher-BMiHySnz.js → ScopeSwitcher-p_tgO5Sa.js} +1 -1
- package/dist/assets/{Settings-D-oIEKZy.js → Settings-wHiAxTfI.js} +1 -1
- package/dist/assets/{SkillReferenceGraph-B_7WfFjn.js → SkillReferenceGraph-D_Pt35vb.js} +1 -1
- package/dist/assets/{Skills-CKpgxhSS.js → Skills-DUvOrgw9.js} +1 -1
- package/dist/assets/{SystemPrompt-BjJPTx_a.js → SystemPrompt-BrNIdy68.js} +1 -1
- package/dist/assets/{TagLibrary-DJBB4gL0.js → TagLibrary-CDRatxXG.js} +1 -1
- package/dist/assets/{TiptapBody-C9Cu2GBL.js → TiptapBody-BF8PxUDj.js} +1 -1
- package/dist/assets/{Toggle-DbIRTOix.js → Toggle-CQH8NGXW.js} +1 -1
- package/dist/assets/{ViewTabs-BDpHur6l.js → ViewTabs-DwnxqCVs.js} +1 -1
- package/dist/assets/{historyTotals-WCJHsBMq.js → historyTotals-KINLTHQ4.js} +1 -1
- package/dist/assets/{index-BD0ufZqe.js → index-CfR3NU2t.js} +3 -3
- package/dist/assets/{settingsSchema-DmjBj3q7.js → settingsSchema-BUcHqLnt.js} +1 -1
- package/dist/assets/{skillFrontmatter-Tn_XHajE.js → skillFrontmatter-BwwkyuMD.js} +1 -1
- package/dist/assets/{useAgentsDirWatch-Vz2iXtsQ.js → useAgentsDirWatch-Coem9Wg-.js} +1 -1
- package/dist/index.html +1 -1
- package/dist-web/assets/app.js +1 -1
- package/package.json +3 -1
- package/plugins/session-manager-dev/.claude-plugin/plugin.json +4 -3
- package/plugins/session-manager-dev/skills/develop/SKILL.md +2 -1
- package/scripts/README.md +3 -1
- package/src/main/build-info.json +4 -4
- package/src/main/lib/epic/epicSweepValidator.cjs +1 -1
- package/src/main/lib/epic/epicValidationHook.cjs +1 -1
- package/src/main/lib/mcpToolCatalog.cjs +4 -1
- package/src/main/webRemote.cjs +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aB as b,al as n,S as N,aW as O}from"./index-BD0ufZqe.js";import{r as K}from"./claude-settings-schema-COigsajx.js";function G({node:e,targetScope:r,onOverride:s,schema:a,rootLabel:m}){const[f,x]=b.useState(""),[u,o]=b.useState(!0),g=[],d=e.kind==="object"&&Object.keys(e.children).length===0,y=((a==null?void 0:a.rootKeys())??[]).length>0;return n.jsxs("div",{className:"h-full flex flex-col",children:[n.jsxs("div",{className:"shrink-0 border-b border-line bg-bg-elev px-3 py-1.5 flex items-center gap-2 text-xs",children:[n.jsxs("span",{className:"text-fg-faint",children:["merged · overrides → ",n.jsx("span",{className:"text-fg-dim",children:N[r].label})]}),y&&n.jsxs("label",{className:"flex items-center gap-1 text-fg-faint cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:u,onChange:t=>o(t.target.checked),className:"accent-accent"}),"show unset keys"]}),n.jsx("div",{className:"flex-1"}),n.jsx("input",{value:f,onChange:t=>x(t.target.value),placeholder:"filter keys or descriptions…",className:"bg-bg border border-line rounded px-2 py-0.5 text-xs text-fg w-56"})]}),n.jsx("div",{className:"flex-1 overflow-auto px-3 py-2 font-mono text-xs",children:d&&!u?n.jsx("div",{className:"text-fg-faint italic px-2 py-4",children:"no settings resolved — all scope files empty or missing"}):n.jsx(E,{node:e,path:g,label:m??"(root)",targetScope:r,onOverride:s,filter:f,depth:0,schema:a,showGhosts:u,defaultOpen:!0})})]})}function E(e){return e.node.kind==="object"?n.jsx(P,{...e,node:e.node}):e.node.kind==="array"?n.jsx(J,{...e,node:e.node}):n.jsx(R,{...e,node:e.node})}function A(e,r){return r.trim()?e.toLowerCase().includes(r.toLowerCase()):!0}function w(e,r,s){return!!(!s.trim()||e.some(a=>A(a,s))||r!=null&&r.description&&A(r.description,s))}function P({node:e,path:r,label:s,targetScope:a,onOverride:m,filter:f,depth:x,schema:u,showGhosts:o,defaultOpen:g}){const[d,h]=b.useState(g??x<2),y=(u==null?void 0:u.at(r))??null,t=new Set(Object.keys(e.children)),i=o?(y==null?void 0:y.knownChildren)??[]:[],c=Array.from(new Set([...t,...i])).sort(),l=b.useMemo(()=>f.trim()?c.filter(p=>{const v=(u==null?void 0:u.at([...r,p]))??null;return w([...r,p],v,f)?!0:t.has(p)?L(e.children[p],[...r,p],f,u):!1}):c,[c.join(","),f,e,r.join("."),u]);if(f.trim()&&l.length===0&&!w(r,y,f))return null;if(r.length===0)return n.jsx("div",{children:l.map(p=>j(p))});return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-1 py-0.5 hover:bg-bg-elev/50 rounded cursor-pointer",style:{paddingLeft:x*14},onClick:()=>h(!d),children:[n.jsx("span",{className:"text-fg-faint w-3 shrink-0",children:d?"▾":"▸"}),n.jsx("span",{className:"text-fg",children:s}),n.jsxs("span",{className:"text-fg-faint",children:[" {",t.size,i.length>t.size?`/${new Set([...t,...i]).size}`:"","}"]}),(y==null?void 0:y.description)&&n.jsxs("span",{className:"text-fg-faint truncate max-w-md",title:y.description,children:["— ",y.description]})]}),d&&l.map(p=>j(p))]});function j(p){if(t.has(p))return n.jsx(E,{node:e.children[p],path:[...r,p],label:p,targetScope:a,onOverride:m,filter:f,depth:x+1,schema:u,showGhosts:o},p);const v=(u==null?void 0:u.at([...r,p]))??null;return v?n.jsx(I,{path:[...r,p],label:p,info:v,targetScope:a,onSet:m,depth:x+1,filter:f},p):null}}function L(e,r,s,a){const m=(a==null?void 0:a.at(r))??null;if(w(r,m,s))return!0;if(e.kind!=="object")return!1;for(const f of Object.keys(e.children))if(L(e.children[f],[...r,f],s,a))return!0;return!1}function J({node:e,path:r,label:s,filter:a,depth:m,schema:f}){const[x,u]=b.useState(!0),o=(f==null?void 0:f.at(r))??null;return w(r,o,a)?n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-1 py-0.5 hover:bg-bg-elev/50 rounded cursor-pointer",style:{paddingLeft:m*14},onClick:()=>u(!x),children:[n.jsx("span",{className:"text-fg-faint w-3 shrink-0",children:x?"▾":"▸"}),n.jsx("span",{className:"text-fg",children:s}),n.jsxs("span",{className:"text-fg-faint",children:[" [",e.items.length,"]"]}),n.jsx(S,{tone:"warn",children:"accumulated"}),(o==null?void 0:o.description)&&n.jsxs("span",{className:"text-fg-faint truncate max-w-md",title:o.description,children:["— ",o.description]})]}),x&&e.items.map((g,d)=>n.jsxs("div",{className:"flex items-start gap-2 py-0.5",style:{paddingLeft:(m+1)*14},children:[n.jsx("span",{className:"text-fg-faint w-3 shrink-0"}),n.jsxs("span",{className:"text-fg-faint",children:[d,":"]}),n.jsx("span",{className:"text-fg-dim truncate max-w-xl",children:k(g.value)}),n.jsx(C,{scope:g.fromScope})]},d))]}):null}function R({node:e,path:r,label:s,targetScope:a,onOverride:m,filter:f,depth:x,schema:u}){const[o,g]=b.useState(!1),d=(u==null?void 0:u.at(r))??null;if(!w(r,d,f))return null;const h=e.winner!==a,y=e.shadowed.length>0;return n.jsxs("div",{children:[n.jsxs("div",{className:"group flex items-center gap-2 py-0.5 hover:bg-bg-elev/50 rounded",style:{paddingLeft:x*14},children:[n.jsx("span",{className:`w-3 shrink-0 ${y?"text-fg-faint cursor-pointer":""}`,onClick:()=>y&&g(!o),children:y?o?"▾":"▸":""}),n.jsxs("span",{className:"text-fg",children:[s,":"]}),n.jsx("span",{className:"text-fg-dim truncate max-w-md",children:k(e.value)}),n.jsx(C,{scope:e.winner}),(d==null?void 0:d.deprecated)&&n.jsx(S,{tone:"warn",children:"deprecated"}),(d==null?void 0:d.default)!==void 0&&_(e.value,d.default)&&n.jsx(S,{tone:"dim",children:"= default"}),e.typeMismatch&&n.jsx("span",{className:"text-yellow-500/80",title:"shadowed scopes have a different value type",children:"⚠"}),(d==null?void 0:d.description)&&n.jsxs("span",{className:"text-fg-faint truncate max-w-md",title:d.description,children:["— ",d.description]}),n.jsx("div",{className:"flex-1"}),(d==null?void 0:d.enum)&&n.jsx(F,{values:d.enum}),n.jsx("button",{disabled:!h,onClick:()=>m(r,e.value),className:`opacity-0 group-hover:opacity-100 px-1.5 py-0 text-[10px] border rounded transition-opacity ${h?"border-accent/50 text-accent hover:bg-accent hover:text-bg":"border-line text-fg-faint cursor-not-allowed"}`,title:h?`copy into ${N[a].label} draft`:`already winning in ${N[a].label}`,children:"override"})]}),o&&e.shadowed.map((t,i)=>n.jsxs("div",{className:"flex items-center gap-2 py-0.5 text-fg-faint line-through",style:{paddingLeft:(x+1)*14+12},children:[n.jsx("span",{children:"shadowed:"}),n.jsx("span",{className:"truncate max-w-xl",children:k(t.value)}),n.jsx(C,{scope:t.scope,dim:!0})]},i))]})}function I({path:e,label:r,info:s,targetScope:a,onSet:m,depth:f,filter:x}){if(!w(e,s,x))return null;const u=s.default!==void 0?s.default:B(s.type),o=Array.isArray(s.type)?s.type.join("|"):s.type??"?";return n.jsxs("div",{className:"group flex items-center gap-2 py-0.5 hover:bg-bg-elev/50 rounded opacity-60",style:{paddingLeft:f*14},children:[n.jsx("span",{className:"w-3 shrink-0"}),n.jsx("span",{className:"text-fg-dim",children:r}),n.jsx(S,{tone:"dim",children:o}),s.required&&n.jsx(S,{tone:"warn",children:"required"}),s.default!==void 0&&n.jsxs("span",{className:"text-fg-faint",children:["default: ",k(s.default)]}),s.description&&n.jsxs("span",{className:"text-fg-faint truncate max-w-md",title:s.description,children:["— ",s.description]}),n.jsx("div",{className:"flex-1"}),s.enum&&n.jsx(F,{values:s.enum}),n.jsx("button",{onClick:()=>m(e,u),className:"opacity-0 group-hover:opacity-100 px-1.5 py-0 text-[10px] border border-accent/50 rounded text-accent hover:bg-accent hover:text-bg transition-opacity",title:`write to ${N[a].label} draft`,children:"set"})]})}function _(e,r){return e===r?!0:typeof e!=typeof r?!1:e&&r&&typeof e=="object"?JSON.stringify(e)===JSON.stringify(r):!1}function B(e){switch(Array.isArray(e)?e[0]:e){case"boolean":return!1;case"integer":case"number":return 0;case"string":return"";case"array":return[];case"object":return{};case"null":return null;default:return null}}function k(e){if(typeof e=="string")return JSON.stringify(e);if(e===null)return"null";if(typeof e=="object"){const r=JSON.stringify(e);return r.length>100?r.slice(0,100)+"…":r}return String(e)}function C({scope:e,dim:r}){const s=e==="user"?"bg-bg-hi text-fg-dim border-line":e==="project"?"bg-blue-950/30 text-blue-400/80 border-blue-900/40":"bg-purple-950/30 text-purple-400/80 border-purple-900/40";return n.jsx("span",{className:`text-[10px] px-1 py-0 rounded border uppercase tracking-wide shrink-0 ${s} ${r?"opacity-60":""}`,children:N[e].label})}function S({children:e,tone:r="default"}){const s={default:"bg-bg-hi text-fg-dim border-line",warn:"bg-yellow-950/30 text-yellow-500/80 border-yellow-900/40",dim:"bg-bg-elev text-fg-faint border-line"}[r];return n.jsx("span",{className:`text-[10px] px-1 py-0 rounded border uppercase tracking-wide shrink-0 ${s}`,children:e})}function F({values:e}){const r=e.map(s=>String(s)).join(" | ");return n.jsxs("span",{className:"text-[10px] text-fg-faint truncate max-w-xs",title:`allowed: ${r}`,children:["∈ ",r.length>30?r.slice(0,30)+"…":r]})}function V(e,r,s){const a=O(o=>o.files),m=O(o=>o.loadJson),f=O(o=>o.watchFile),x=O(o=>o.unwatchFile),u=b.useMemo(()=>{const o={};for(const g of e.scopes){const d=e.resolve(g,r??"",s);d&&(o[g]=d)}return o},[e,r,s]);return b.useEffect(()=>{const o=Object.values(u).filter(Boolean);return o.forEach(g=>{a[g]||m(g),f(g)}),()=>{o.forEach(g=>x(g))}},[JSON.stringify(u)]),u}function M(e){const r=e??{},s={...r.$defs??{},...r.definitions??{}},a=t=>{if(!t)return{};if(!t.$ref)return x(t);const i=/^#\/(\$defs|definitions)\/(.+)$/.exec(t.$ref);if(!i)return x(t);const c=s[i[2]];return c?a({...c,...u(t)}):x(t)},m=new Set(["__proto__","constructor","prototype"]),f=t=>{if(!t)return{};const i={};for(const[c,l]of Object.entries(t))m.has(c)||(i[c]=l);return i},x=t=>{if(!t.allOf||t.allOf.length===0)return t;const i={...t};delete i.allOf;for(const c of t.allOf){const l=a(c);Object.assign(i,{properties:{...f(i.properties),...f(l.properties)},required:q([...i.required??[],...l.required??[]])}),!i.description&&l.description&&(i.description=l.description),i.default===void 0&&l.default!==void 0&&(i.default=l.default),!i.type&&l.type&&(i.type=l.type)}return i},u=t=>{const{$ref:i,...c}=t;return c},o=(t,i)=>{let c=a(t);for(const l of i){if(!c)return null;if(/^\d+$/.test(l)){const v=Array.isArray(c.items)?c.items[Number(l)]:c.items;c=v?a(v):null;continue}const j=c.properties;if(j&&!m.has(l)&&l in j){c=a(j[l]);continue}const p=c.additionalProperties;if(p&&typeof p=="object"){c=a(p);continue}return null}return c},g=(t,i,c)=>{if(!t)return null;const l={};if(t.description&&(l.description=t.description),t.type&&(l.type=t.type),t.default!==void 0&&(l.default=t.default),t.enum&&(l.enum=t.enum),t.const!==void 0&&(l.const=t.const),t.deprecated&&(l.deprecated=!0),t.examples&&(l.examples=t.examples),t.properties&&(l.knownChildren=Object.keys(t.properties)),c&&(i!=null&&i.includes(c))&&(l.required=!0),t.items&&!Array.isArray(t.items)){const j=a(t.items),p=g(j,void 0,null);p&&(l.itemsInfo=p)}return(t.additionalProperties===!0||typeof t.additionalProperties=="object")&&(l.open=!0),l},d=t=>i=>{if(i.length===0)return g(a(t),void 0,null);const c=o(t,i.slice(0,-1));if(!c)return null;const l=i[i.length-1],j=o(c,[l]);return g(j,c.required,l)},h=t=>{const i=a(t);return Object.keys(i.properties??{})},y=t=>({at:d(t),rootKeys:()=>h(t),rootedAt:i=>{const c=o(t,i);return y(c??{})}});return y(r)}function q(e){return Array.from(new Set(e))}let $=null;function D(){return $||($=M(K)),$}export{G as E,D as s,V as u};
|
|
1
|
+
import{aB as b,al as n,S as N,aW as O}from"./index-CfR3NU2t.js";import{r as K}from"./claude-settings-schema-COigsajx.js";function G({node:e,targetScope:r,onOverride:s,schema:a,rootLabel:m}){const[f,x]=b.useState(""),[u,o]=b.useState(!0),g=[],d=e.kind==="object"&&Object.keys(e.children).length===0,y=((a==null?void 0:a.rootKeys())??[]).length>0;return n.jsxs("div",{className:"h-full flex flex-col",children:[n.jsxs("div",{className:"shrink-0 border-b border-line bg-bg-elev px-3 py-1.5 flex items-center gap-2 text-xs",children:[n.jsxs("span",{className:"text-fg-faint",children:["merged · overrides → ",n.jsx("span",{className:"text-fg-dim",children:N[r].label})]}),y&&n.jsxs("label",{className:"flex items-center gap-1 text-fg-faint cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:u,onChange:t=>o(t.target.checked),className:"accent-accent"}),"show unset keys"]}),n.jsx("div",{className:"flex-1"}),n.jsx("input",{value:f,onChange:t=>x(t.target.value),placeholder:"filter keys or descriptions…",className:"bg-bg border border-line rounded px-2 py-0.5 text-xs text-fg w-56"})]}),n.jsx("div",{className:"flex-1 overflow-auto px-3 py-2 font-mono text-xs",children:d&&!u?n.jsx("div",{className:"text-fg-faint italic px-2 py-4",children:"no settings resolved — all scope files empty or missing"}):n.jsx(E,{node:e,path:g,label:m??"(root)",targetScope:r,onOverride:s,filter:f,depth:0,schema:a,showGhosts:u,defaultOpen:!0})})]})}function E(e){return e.node.kind==="object"?n.jsx(P,{...e,node:e.node}):e.node.kind==="array"?n.jsx(J,{...e,node:e.node}):n.jsx(R,{...e,node:e.node})}function A(e,r){return r.trim()?e.toLowerCase().includes(r.toLowerCase()):!0}function w(e,r,s){return!!(!s.trim()||e.some(a=>A(a,s))||r!=null&&r.description&&A(r.description,s))}function P({node:e,path:r,label:s,targetScope:a,onOverride:m,filter:f,depth:x,schema:u,showGhosts:o,defaultOpen:g}){const[d,h]=b.useState(g??x<2),y=(u==null?void 0:u.at(r))??null,t=new Set(Object.keys(e.children)),i=o?(y==null?void 0:y.knownChildren)??[]:[],c=Array.from(new Set([...t,...i])).sort(),l=b.useMemo(()=>f.trim()?c.filter(p=>{const v=(u==null?void 0:u.at([...r,p]))??null;return w([...r,p],v,f)?!0:t.has(p)?L(e.children[p],[...r,p],f,u):!1}):c,[c.join(","),f,e,r.join("."),u]);if(f.trim()&&l.length===0&&!w(r,y,f))return null;if(r.length===0)return n.jsx("div",{children:l.map(p=>j(p))});return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-1 py-0.5 hover:bg-bg-elev/50 rounded cursor-pointer",style:{paddingLeft:x*14},onClick:()=>h(!d),children:[n.jsx("span",{className:"text-fg-faint w-3 shrink-0",children:d?"▾":"▸"}),n.jsx("span",{className:"text-fg",children:s}),n.jsxs("span",{className:"text-fg-faint",children:[" {",t.size,i.length>t.size?`/${new Set([...t,...i]).size}`:"","}"]}),(y==null?void 0:y.description)&&n.jsxs("span",{className:"text-fg-faint truncate max-w-md",title:y.description,children:["— ",y.description]})]}),d&&l.map(p=>j(p))]});function j(p){if(t.has(p))return n.jsx(E,{node:e.children[p],path:[...r,p],label:p,targetScope:a,onOverride:m,filter:f,depth:x+1,schema:u,showGhosts:o},p);const v=(u==null?void 0:u.at([...r,p]))??null;return v?n.jsx(I,{path:[...r,p],label:p,info:v,targetScope:a,onSet:m,depth:x+1,filter:f},p):null}}function L(e,r,s,a){const m=(a==null?void 0:a.at(r))??null;if(w(r,m,s))return!0;if(e.kind!=="object")return!1;for(const f of Object.keys(e.children))if(L(e.children[f],[...r,f],s,a))return!0;return!1}function J({node:e,path:r,label:s,filter:a,depth:m,schema:f}){const[x,u]=b.useState(!0),o=(f==null?void 0:f.at(r))??null;return w(r,o,a)?n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-1 py-0.5 hover:bg-bg-elev/50 rounded cursor-pointer",style:{paddingLeft:m*14},onClick:()=>u(!x),children:[n.jsx("span",{className:"text-fg-faint w-3 shrink-0",children:x?"▾":"▸"}),n.jsx("span",{className:"text-fg",children:s}),n.jsxs("span",{className:"text-fg-faint",children:[" [",e.items.length,"]"]}),n.jsx(S,{tone:"warn",children:"accumulated"}),(o==null?void 0:o.description)&&n.jsxs("span",{className:"text-fg-faint truncate max-w-md",title:o.description,children:["— ",o.description]})]}),x&&e.items.map((g,d)=>n.jsxs("div",{className:"flex items-start gap-2 py-0.5",style:{paddingLeft:(m+1)*14},children:[n.jsx("span",{className:"text-fg-faint w-3 shrink-0"}),n.jsxs("span",{className:"text-fg-faint",children:[d,":"]}),n.jsx("span",{className:"text-fg-dim truncate max-w-xl",children:k(g.value)}),n.jsx(C,{scope:g.fromScope})]},d))]}):null}function R({node:e,path:r,label:s,targetScope:a,onOverride:m,filter:f,depth:x,schema:u}){const[o,g]=b.useState(!1),d=(u==null?void 0:u.at(r))??null;if(!w(r,d,f))return null;const h=e.winner!==a,y=e.shadowed.length>0;return n.jsxs("div",{children:[n.jsxs("div",{className:"group flex items-center gap-2 py-0.5 hover:bg-bg-elev/50 rounded",style:{paddingLeft:x*14},children:[n.jsx("span",{className:`w-3 shrink-0 ${y?"text-fg-faint cursor-pointer":""}`,onClick:()=>y&&g(!o),children:y?o?"▾":"▸":""}),n.jsxs("span",{className:"text-fg",children:[s,":"]}),n.jsx("span",{className:"text-fg-dim truncate max-w-md",children:k(e.value)}),n.jsx(C,{scope:e.winner}),(d==null?void 0:d.deprecated)&&n.jsx(S,{tone:"warn",children:"deprecated"}),(d==null?void 0:d.default)!==void 0&&_(e.value,d.default)&&n.jsx(S,{tone:"dim",children:"= default"}),e.typeMismatch&&n.jsx("span",{className:"text-yellow-500/80",title:"shadowed scopes have a different value type",children:"⚠"}),(d==null?void 0:d.description)&&n.jsxs("span",{className:"text-fg-faint truncate max-w-md",title:d.description,children:["— ",d.description]}),n.jsx("div",{className:"flex-1"}),(d==null?void 0:d.enum)&&n.jsx(F,{values:d.enum}),n.jsx("button",{disabled:!h,onClick:()=>m(r,e.value),className:`opacity-0 group-hover:opacity-100 px-1.5 py-0 text-[10px] border rounded transition-opacity ${h?"border-accent/50 text-accent hover:bg-accent hover:text-bg":"border-line text-fg-faint cursor-not-allowed"}`,title:h?`copy into ${N[a].label} draft`:`already winning in ${N[a].label}`,children:"override"})]}),o&&e.shadowed.map((t,i)=>n.jsxs("div",{className:"flex items-center gap-2 py-0.5 text-fg-faint line-through",style:{paddingLeft:(x+1)*14+12},children:[n.jsx("span",{children:"shadowed:"}),n.jsx("span",{className:"truncate max-w-xl",children:k(t.value)}),n.jsx(C,{scope:t.scope,dim:!0})]},i))]})}function I({path:e,label:r,info:s,targetScope:a,onSet:m,depth:f,filter:x}){if(!w(e,s,x))return null;const u=s.default!==void 0?s.default:B(s.type),o=Array.isArray(s.type)?s.type.join("|"):s.type??"?";return n.jsxs("div",{className:"group flex items-center gap-2 py-0.5 hover:bg-bg-elev/50 rounded opacity-60",style:{paddingLeft:f*14},children:[n.jsx("span",{className:"w-3 shrink-0"}),n.jsx("span",{className:"text-fg-dim",children:r}),n.jsx(S,{tone:"dim",children:o}),s.required&&n.jsx(S,{tone:"warn",children:"required"}),s.default!==void 0&&n.jsxs("span",{className:"text-fg-faint",children:["default: ",k(s.default)]}),s.description&&n.jsxs("span",{className:"text-fg-faint truncate max-w-md",title:s.description,children:["— ",s.description]}),n.jsx("div",{className:"flex-1"}),s.enum&&n.jsx(F,{values:s.enum}),n.jsx("button",{onClick:()=>m(e,u),className:"opacity-0 group-hover:opacity-100 px-1.5 py-0 text-[10px] border border-accent/50 rounded text-accent hover:bg-accent hover:text-bg transition-opacity",title:`write to ${N[a].label} draft`,children:"set"})]})}function _(e,r){return e===r?!0:typeof e!=typeof r?!1:e&&r&&typeof e=="object"?JSON.stringify(e)===JSON.stringify(r):!1}function B(e){switch(Array.isArray(e)?e[0]:e){case"boolean":return!1;case"integer":case"number":return 0;case"string":return"";case"array":return[];case"object":return{};case"null":return null;default:return null}}function k(e){if(typeof e=="string")return JSON.stringify(e);if(e===null)return"null";if(typeof e=="object"){const r=JSON.stringify(e);return r.length>100?r.slice(0,100)+"…":r}return String(e)}function C({scope:e,dim:r}){const s=e==="user"?"bg-bg-hi text-fg-dim border-line":e==="project"?"bg-blue-950/30 text-blue-400/80 border-blue-900/40":"bg-purple-950/30 text-purple-400/80 border-purple-900/40";return n.jsx("span",{className:`text-[10px] px-1 py-0 rounded border uppercase tracking-wide shrink-0 ${s} ${r?"opacity-60":""}`,children:N[e].label})}function S({children:e,tone:r="default"}){const s={default:"bg-bg-hi text-fg-dim border-line",warn:"bg-yellow-950/30 text-yellow-500/80 border-yellow-900/40",dim:"bg-bg-elev text-fg-faint border-line"}[r];return n.jsx("span",{className:`text-[10px] px-1 py-0 rounded border uppercase tracking-wide shrink-0 ${s}`,children:e})}function F({values:e}){const r=e.map(s=>String(s)).join(" | ");return n.jsxs("span",{className:"text-[10px] text-fg-faint truncate max-w-xs",title:`allowed: ${r}`,children:["∈ ",r.length>30?r.slice(0,30)+"…":r]})}function V(e,r,s){const a=O(o=>o.files),m=O(o=>o.loadJson),f=O(o=>o.watchFile),x=O(o=>o.unwatchFile),u=b.useMemo(()=>{const o={};for(const g of e.scopes){const d=e.resolve(g,r??"",s);d&&(o[g]=d)}return o},[e,r,s]);return b.useEffect(()=>{const o=Object.values(u).filter(Boolean);return o.forEach(g=>{a[g]||m(g),f(g)}),()=>{o.forEach(g=>x(g))}},[JSON.stringify(u)]),u}function M(e){const r=e??{},s={...r.$defs??{},...r.definitions??{}},a=t=>{if(!t)return{};if(!t.$ref)return x(t);const i=/^#\/(\$defs|definitions)\/(.+)$/.exec(t.$ref);if(!i)return x(t);const c=s[i[2]];return c?a({...c,...u(t)}):x(t)},m=new Set(["__proto__","constructor","prototype"]),f=t=>{if(!t)return{};const i={};for(const[c,l]of Object.entries(t))m.has(c)||(i[c]=l);return i},x=t=>{if(!t.allOf||t.allOf.length===0)return t;const i={...t};delete i.allOf;for(const c of t.allOf){const l=a(c);Object.assign(i,{properties:{...f(i.properties),...f(l.properties)},required:q([...i.required??[],...l.required??[]])}),!i.description&&l.description&&(i.description=l.description),i.default===void 0&&l.default!==void 0&&(i.default=l.default),!i.type&&l.type&&(i.type=l.type)}return i},u=t=>{const{$ref:i,...c}=t;return c},o=(t,i)=>{let c=a(t);for(const l of i){if(!c)return null;if(/^\d+$/.test(l)){const v=Array.isArray(c.items)?c.items[Number(l)]:c.items;c=v?a(v):null;continue}const j=c.properties;if(j&&!m.has(l)&&l in j){c=a(j[l]);continue}const p=c.additionalProperties;if(p&&typeof p=="object"){c=a(p);continue}return null}return c},g=(t,i,c)=>{if(!t)return null;const l={};if(t.description&&(l.description=t.description),t.type&&(l.type=t.type),t.default!==void 0&&(l.default=t.default),t.enum&&(l.enum=t.enum),t.const!==void 0&&(l.const=t.const),t.deprecated&&(l.deprecated=!0),t.examples&&(l.examples=t.examples),t.properties&&(l.knownChildren=Object.keys(t.properties)),c&&(i!=null&&i.includes(c))&&(l.required=!0),t.items&&!Array.isArray(t.items)){const j=a(t.items),p=g(j,void 0,null);p&&(l.itemsInfo=p)}return(t.additionalProperties===!0||typeof t.additionalProperties=="object")&&(l.open=!0),l},d=t=>i=>{if(i.length===0)return g(a(t),void 0,null);const c=o(t,i.slice(0,-1));if(!c)return null;const l=i[i.length-1],j=o(c,[l]);return g(j,c.required,l)},h=t=>{const i=a(t);return Object.keys(i.properties??{})},y=t=>({at:d(t),rootKeys:()=>h(t),rootedAt:i=>{const c=o(t,i);return y(c??{})}});return y(r)}function q(e){return Array.from(new Set(e))}let $=null;function D(){return $||($=M(K)),$}export{G as E,D as s,V as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{al as k,F as E}from"./index-
|
|
1
|
+
import{al as k,F as E}from"./index-CfR3NU2t.js";function M({value:t,onChange:n,path:e,readOnly:i}){return k.jsx(E,{path:`file://${e}`,defaultLanguage:"markdown",value:t,onChange:s=>n(s??""),theme:"vs-dark",options:{minimap:{enabled:!1},fontSize:13,fontFamily:"JetBrains Mono, ui-monospace, Menlo, monospace",lineNumbers:"on",renderLineHighlight:"line",scrollBeyondLastLine:!1,tabSize:2,wordWrap:"on",readOnly:i,automaticLayout:!0}})}const f=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,u="disable-model-invocation",g=/^\s*disable-model-invocation\s*:/;function j(t){const n=t.match(f);if(!n)return!1;for(const e of n[1].split(/\r?\n/)){if(!g.test(e))continue;const i=e.slice(e.indexOf(":")+1).trim().toLowerCase();return i==="true"||i==="yes"}return!1}function S(t){const n=t.trim();return n.length>=2&&(n[0]==='"'&&n[n.length-1]==='"'||n[0]==="'"&&n[n.length-1]==="'")?n.slice(1,-1):n}function h(t){return t.length-t.trimStart().length}function v(t){const n=t.match(f);if(!n)return{name:null,description:null,body:t};const e=n[1].split(/\r?\n/),i=n[2]??"";let s=null,r=null;for(let o=0;o<e.length;o++){const m=e[o],d=m.match(/^(\s*)(name|description)\s*:(.*)$/);if(!d)continue;const[,,y,$]=d,l=$.trim(),b=h(m);let c;if(l===""||l===">-"||l===">"||l==="|-"||l==="|"){const p=[];let a=o+1;for(;a<e.length&&e[a].trim()!==""&&h(e[a])>b;)p.push(e[a].trim()),a++;c=p.join(" ")}else c=S(l);y==="name"?s=c:r=c}return{name:s,description:r,body:i}}function w(t,n){const e=t.match(f);if(!e){if(!n)return t;const o=t.startsWith(`
|
|
2
2
|
`)?"":`
|
|
3
3
|
`;return`---
|
|
4
4
|
${u}: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as e,b0 as a,aX as n}from"./index-
|
|
1
|
+
import{V as e,b0 as a,aX as n}from"./index-CfR3NU2t.js";const c=new Set(e.map(t=>t.tag));function l(t){return t.filter(o=>c.has(o))}function s(t,o={}){return{name:t.name,originalName:t.name,description:t.description??"",tools:t.tools,model:t.model??"inherit",effort:t.effort??void 0,color:t.color??"",tags:l(t.tags),projects:t.projects,action:t.action??void 0,actionLabel:t.actionLabel??void 0,title:t.title??void 0,body:t.body,...o}}function d(t,o){const i=a();n([i?`${i}/.claude/agents`:null,t?`${t}/.claude/agents`:null],o)}export{s as a,l as t,d as u};
|
package/dist/index.html
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
9
|
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;0,6..72,600;0,6..72,700;1,6..72,400&family=Geist:wght@300;400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
10
|
-
<script type="module" crossorigin src="./assets/index-
|
|
10
|
+
<script type="module" crossorigin src="./assets/index-CfR3NU2t.js"></script>
|
|
11
11
|
<link rel="modulepreload" crossorigin href="./assets/monaco-editor-BsIlgG7c.js">
|
|
12
12
|
<link rel="stylesheet" crossorigin href="./assets/monaco-editor-Cu5D__1H.css">
|
|
13
13
|
<link rel="stylesheet" crossorigin href="./assets/index-BnKaYERU.css">
|
package/dist-web/assets/app.js
CHANGED
|
@@ -72,7 +72,7 @@ ${i}`].join(`
|
|
|
72
72
|
|
|
73
73
|
`);return hle({title:`[Customer ${s.tag}] ${s.title}`,goal:r,tag:f2e[s.tag],agentName:"architect",agentDescription:rGe,...n?{agentBody:n.text,agentPath:n.path}:{}})}function aGe({it:s,projectCwd:e}){const n=Pr(v=>v.setInboxStatus),i=Pr(v=>v.linkEpic),r=wn(v=>v.createPromptSession),[o,a]=R.useState(!1),[l,c]=R.useState(""),[d,u]=R.useState(!1),h=s.body.length>z_e,f=h&&!o?`${s.body.slice(0,z_e)}…`:s.body,p=s.epicId!=null,m=d||p||!e,_=p?"An Epic is already linked to this feedback":e?"Create a proposed Epic from this feedback":"No owner project is configured for this inbox",b=async()=>{if(!(m||!e)){u(!0);try{const{goalText:v,openingPrompt:w,sections:y}=await oGe(s,e),x=await r(e,v,f2e[s.tag],void 0,"architect",w,y);await i(s.id,x.id),await n(s.id,"in_progress")}catch(v){ve.error(v instanceof Error?v.message:String(v))}finally{u(!1)}}};return g.jsxs("div",{className:"rounded-lg border border-line bg-bg px-3 py-2 grid gap-1.5","data-testid":"customer-feedback-inbox-item",children:[g.jsxs("div",{className:"flex items-start justify-between gap-2",children:[g.jsx("div",{className:"min-w-0 text-[13px] font-semibold text-fg break-words",children:s.title}),g.jsx("span",{className:"shrink-0 rounded border border-line px-1.5 py-0.5 text-[11px] font-semibold text-fg-dim",children:nGe[s.status]})]}),g.jsxs("div",{className:"font-mono text-[11px] text-fg-dim",children:[iGe[s.tag]," · ",new Date(gZ(s.receivedAt)).toLocaleDateString()," · v",s.clientVersion??"?"," ·"," ",s.clientPlatform??"?"]}),g.jsx("div",{className:"text-[12.5px] text-fg whitespace-pre-wrap break-words",children:f}),h&&g.jsx("button",{type:"button",onClick:()=>a(v=>!v),className:"justify-self-start text-[11.5px] font-semibold text-accent",children:o?"Show less":"Show more"}),g.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[g.jsx("select",{value:s.status,onChange:v=>void n(s.id,v.target.value,l.trim()||void 0),className:"rounded-md border border-line bg-bg px-2 py-1 text-[12px] text-fg","aria-label":"Status","data-testid":"customer-feedback-inbox-status",children:h2e.map(v=>g.jsx("option",{value:v.value,children:v.label},v.value))}),g.jsx("input",{type:"text",value:l,onChange:v=>c(v.target.value),placeholder:"Note (optional)",maxLength:500,className:"min-w-0 flex-1 rounded-md border border-line bg-bg px-2 py-1 text-[12px] text-fg","aria-label":"Status note"}),g.jsx("button",{type:"button",onClick:()=>void b(),disabled:m,title:_,className:"rounded-md bg-accent px-2.5 py-1 text-[12px] font-semibold text-white disabled:opacity-50","data-testid":"customer-feedback-inbox-open-epic",children:p?"Epic linked":"Open as Epic"})]})]})}function lGe(){const s=Pr(a=>{var l;return((l=a.ownerInfo)==null?void 0:l.ownerMode)??!1}),e=Pr(a=>{var l;return((l=a.ownerInfo)==null?void 0:l.projectCwd)??null}),n=Pr(a=>a.inbox),i=Pr(a=>a.inboxLoading),r=Pr(a=>a.pullInbox),o=R.useMemo(()=>[...n].sort((a,l)=>gZ(l.receivedAt)-gZ(a.receivedAt)),[n]);return R.useEffect(()=>{s&&r()},[s,r]),s?g.jsxs("section",{className:"shrink-0 max-h-[50%] overflow-auto border-t border-line px-5 py-4 grid gap-2 content-start","data-testid":"customer-feedback-inbox",children:[g.jsxs("div",{className:"flex items-center justify-between gap-2",children:[g.jsx("h3",{className:"m-0 font-mono text-[11px] uppercase tracking-[0.08em] text-fg-dim",children:"Customer inbox"}),g.jsx("button",{type:"button",onClick:()=>void r(),disabled:i,className:"rounded-md border border-line bg-bg px-2.5 py-1 text-[12px] font-semibold text-fg-dim hover:bg-bg-elev disabled:opacity-50","data-testid":"customer-feedback-inbox-refresh",children:i?"Refreshing…":"Refresh"})]}),o.length===0?g.jsx("p",{className:"m-0 text-[12.5px] text-fg-dim",children:"No customer feedback yet."}):o.map(a=>g.jsx(aGe,{it:a,projectCwd:e},a.id))]}):null}const cGe={open:"Open",in_progress:"In progress",resolved:"Resolved",wontfix:"Won't fix"},dGe=[{tag:"bug",label:"Bug"},{tag:"feature",label:"Feature"},{tag:"discussion",label:"Discussion"}],uGe={bug:"Bug",feature:"Feature",discussion:"Discussion"},U_e=120,hGe=4e3;function fGe(){const s=Pr(v=>v.panelOpen),e=Pr(v=>v.draft),n=Pr(v=>v.items),i=Pr(v=>v.submitting),r=Pr(v=>v.closePanel),o=Pr(v=>v.setDraft),a=Pr(v=>v.submit),l=Pr(v=>v.load),c=Pr(v=>v.loadOwnerInfo),d=Pr(v=>v.refreshStatus),u=Pr(v=>v.markSeen),h=Pr(v=>{var w;return((w=v.ownerInfo)==null?void 0:w.ownerMode)===!0}),[f,p]=R.useState(!1),m=R.useMemo(()=>[...n].sort((v,w)=>w.submittedAt-v.submittedAt),[n]);if(R.useEffect(()=>{if(!s){p(!1);return}const v=requestAnimationFrame(()=>p(!0));return()=>cancelAnimationFrame(v)},[s]),R.useEffect(()=>{if(!s)return;let v=!1;return(async()=>(await Promise.all([l(),c(),d()]),v||await u()))(),()=>{v=!0}},[s,l,c,d,u]),R.useEffect(()=>{if(!s)return;const v=w=>{w.key==="Escape"&&(w.stopPropagation(),r())};return document.addEventListener("keydown",v),()=>document.removeEventListener("keydown",v)},[s,r]),!s)return null;const _=e.title.trim()===""||e.body.trim()==="",b=g.jsxs("div",{className:`fixed inset-0 ${Vi.dialog}`,"data-testid":"customer-feedback-root",children:[g.jsx("div",{className:`absolute inset-0 bg-black/50 transition-opacity duration-[220ms] ${f?"opacity-100":"opacity-0"}`,onClick:v=>{v.target===v.currentTarget&&r()},"data-testid":"customer-feedback-backdrop"}),g.jsxs("aside",{role:"dialog","aria-modal":"true","aria-label":"Send feedback",className:`absolute left-0 top-0 h-full w-full max-w-[480px] border-r border-line bg-bg-elev text-fg shadow-xl flex flex-col transition-transform duration-[220ms] ${f?"translate-x-0":"-translate-x-full"}`,style:{transitionTimingFunction:"cubic-bezier(.32,.72,.28,1)"},"data-testid":"customer-feedback-panel",children:[g.jsxs("header",{className:"px-5 py-4 border-b border-line flex items-center justify-between gap-3 shrink-0",children:[g.jsx("h2",{className:"m-0 font-serif text-[18px] font-semibold text-fg",children:"Feedback"}),g.jsx("button",{onClick:r,className:"shrink-0 rounded-md border border-line bg-bg px-2.5 py-1 text-[12px] font-semibold text-fg-dim hover:bg-bg-elev","aria-label":"Close","data-testid":"customer-feedback-close",children:"Close"})]}),g.jsxs("div",{className:"flex-1 min-h-0 overflow-auto px-5 py-4 grid gap-5 content-start",children:[g.jsxs("form",{className:"grid gap-3",onSubmit:v=>{v.preventDefault(),!_&&!i&&a()},children:[g.jsxs("label",{className:"grid gap-1",children:[g.jsxs("span",{className:"flex justify-between font-mono text-[11px] uppercase tracking-[0.05em] text-fg-dim",children:[g.jsx("span",{children:"Header"}),g.jsxs("span",{children:[e.title.length,"/",U_e]})]}),g.jsx("input",{value:e.title,maxLength:U_e,onChange:v=>o({title:v.target.value}),className:"rounded-md border border-line bg-bg px-2.5 py-1.5 text-[13px] text-fg","data-testid":"customer-feedback-title"})]}),g.jsxs("label",{className:"grid gap-1",children:[g.jsx("span",{className:"font-mono text-[11px] uppercase tracking-[0.05em] text-fg-dim",children:"Body"}),g.jsx("textarea",{value:e.body,maxLength:hGe,rows:6,onChange:v=>o({body:v.target.value}),className:"rounded-md border border-line bg-bg px-2.5 py-1.5 text-[13px] text-fg resize-y","data-testid":"customer-feedback-body"})]}),g.jsx("div",{className:"flex gap-2",role:"group","aria-label":"Feedback type",children:dGe.map(({tag:v,label:w})=>g.jsx("button",{type:"button","aria-pressed":e.tag===v,onClick:()=>o({tag:v}),className:`rounded-md border border-line px-3 py-1 text-[12px] font-semibold ${e.tag===v?"bg-accent text-white":"bg-bg text-fg-dim hover:bg-bg-elev"}`,"data-testid":`customer-feedback-tag-${v}`,children:w},v))}),g.jsx("p",{className:"m-0 text-[11.5px] text-fg-dim",children:"Your feedback is sent to bilko.run. Please don't paste secrets, keys or passwords."}),g.jsx("button",{type:"submit",disabled:_||i,className:"rounded-md bg-accent px-3 py-1.5 text-[13px] font-semibold text-white disabled:opacity-50","data-testid":"customer-feedback-submit",children:i?"Sending…":"Submit"})]}),g.jsxs("section",{className:"grid gap-2","data-testid":"customer-feedback-list",children:[g.jsx("h3",{className:"m-0 font-mono text-[11px] uppercase tracking-[0.08em] text-fg-dim",children:"Your feedback"}),m.length===0?g.jsx("p",{className:"m-0 text-[12.5px] text-fg-dim",children:"No feedback yet — what you send will show up here."}):m.map(v=>g.jsxs("div",{className:"rounded-lg border border-line bg-bg px-3 py-2 grid gap-1","data-testid":"customer-feedback-item",children:[g.jsxs("div",{className:"flex items-start justify-between gap-2",children:[g.jsx("div",{className:"min-w-0 text-[13px] font-semibold text-fg break-words",children:v.title}),g.jsx("span",{className:"shrink-0 rounded border border-line px-1.5 py-0.5 text-[11px] font-semibold text-fg-dim","data-testid":"customer-feedback-status",children:cGe[v.status]})]}),g.jsxs("div",{className:"font-mono text-[11px] text-fg-dim",children:[uGe[v.tag]," · ",new Date(v.submittedAt).toLocaleDateString()]}),v.statusNote&&g.jsx("div",{className:"text-[12px] text-fg-dim break-words",children:v.statusNote})]},v.id))]})]}),h&&g.jsx(lGe,{})]})]});return typeof document<"u"&&document.body?uS.createPortal(b,document.body):b}const pGe=3e4;function gGe(){const s=Tt(L=>L.tabs),e=Tt(L=>L.activeTabId),n=Tt(L=>L.closeTab),i=Tt(L=>L.setActive),r=Tt(L=>L.reorderTab),o=C2(L=>L.watchers),a=yi(L=>L.openPanel),l=yi(L=>L.openProjectPanel),c=yi(L=>L.setEpicsWorkspaceOpen),d=yi(L=>L.navFace==="home"),u=Pr(L=>L.items),h=Pr(L=>L.panelOpen),f=Pr(L=>L.togglePanel),p=Pr(L=>L.load),m=KUe(u)>0;R.useEffect(()=>{p()},[p]);const[_,b]=R.useState(()=>Date.now()),v=cle();R.useEffect(()=>{if(!v)return;b(Date.now());const L=window.setInterval(()=>b(Date.now()),1e3);return()=>window.clearInterval(L)},[v]);const w=L=>{for(const T of Object.values(o))if(T.tabId===L&&T.lastLineAt&&_-T.lastLineAt<pGe)return!0;return!1},{getTabDragProps:y,isDragging:x,containerRef:S}=qUe({tabCount:s.length,onReorder:r,onActivate:L=>{const T=s[L];T&&(i(T.id),c(!1),l("terminal"))}}),E=["#6f7d52","#b85c34","#a39079","#7a8466","#5b4a36"];return g.jsxs("div",{className:"h-12 bg-bg-elev border-b border-line flex items-end px-3 gap-0 shrink-0 relative","data-testid":"tour-tabbar",children:[g.jsxs("button",{onClick:()=>a("overview"),title:"This machine — home","aria-current":d?"true":void 0,"data-testid":"tabbar-machine-home",className:`flex items-center gap-2 px-3.5 py-1.5 mb-1 rounded-full text-[13px] shrink-0 transition-colors ${d?"bg-accent text-bg font-semibold shadow-sm":"text-fg-dim hover:text-fg hover:bg-bg-hi/40"}`,children:[g.jsx(jr,{name:"home",className:"w-[15px] h-[15px]"}),g.jsx("span",{children:"Home"})]}),g.jsx("span",{className:"w-px self-stretch my-1.5 bg-line"}),g.jsx("div",{ref:S,className:`flex items-end gap-0.5 overflow-x-auto no-scrollbar min-w-0 flex-1 select-none ${x?"cursor-grabbing":""}`,children:s.map((L,T)=>{const I=L.id===e,A=y(T),P=E[T%E.length];return g.jsxs("div",{...A,style:A.style,className:`group flex items-center gap-2 px-3.5 pt-1.5 pb-2 rounded-t-[10px] text-[13px] shrink-0 transition-colors ${x?"":"cursor-grab"} ${I?"bg-bg text-fg font-medium relative z-10 -mb-px border border-accent shadow-[inset_0_2px_0_theme(colors.accent.DEFAULT)]":"text-fg-dim hover:text-fg hover:bg-bg-hi/40"}`,title:L.cwd,"aria-current":I?"true":void 0,children:[g.jsx("span",{className:"w-2 h-2 rounded-full",style:{background:P,boxShadow:"inset 0 0 0 0.5px rgba(0,0,0,0.15)",opacity:L.status==="spawning"?.55:1}}),g.jsx("span",{className:"truncate max-w-[200px]",children:L.label}),L.status==="spawning"&&g.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-butter animate-pulse",title:"spawning"}),w(L.id)&&g.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-accent animate-pulse",title:"watcher emitted a line in the last 30s","data-testid":"tab-watcher-dot"}),g.jsx("button",{onClick:B=>{B.stopPropagation(),n(L.id)},className:"text-fg-faint opacity-0 group-hover:opacity-100 hover:text-fg ml-1 leading-none",title:"Close session","aria-label":`Close ${L.label}`,children:"×"})]},L.id)})}),g.jsx("span",{className:"w-px self-stretch my-1.5 bg-line"}),g.jsxs("button",{onClick:f,title:"Send feedback","aria-label":"Send feedback","aria-expanded":h,"data-testid":"tabbar-customer-feedback",className:"relative flex items-center px-3.5 py-1.5 mb-1 rounded-full text-[13px] font-mono shrink-0 transition-colors text-fg-dim hover:text-fg hover:bg-bg-hi/40",children:["{F}",m&&g.jsx("span",{className:"absolute top-1 right-1.5 w-1.5 h-1.5 rounded-full bg-accent","data-testid":"customer-feedback-unseen-dot"})]}),g.jsx(fGe,{})]})}function mGe(...s){}function _Ge(s){return Promise.reject(new Error("Not available in the web version"))}const bGe=new Set,vGe=new Set;function wGe(){for(const s of bGe)try{s()}catch{}}function mZ(){for(const s of vGe)try{s()}catch{}}function yGe(s){return s.replace(/```[\s\S]*?```/g,"").replace(/`([^`]+)`/g,"$1").replace(/^#{1,6}\s+/gm,"").replace(/\*{1,3}([^*]+)\*{1,3}/g,"$1").replace(/_{1,3}([^_]+)_{1,3}/g,"$1").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/!\[([^\]]*)\]\([^)]+\)/g,"$1").replace(/^[-*_]{3,}\s*$/gm,"").replace(/^>\s?/gm,"").replace(/^[\s]*[-*+]\s/gm,"").replace(/^[\s]*\d+\.\s/gm,"").trim()}function xGe(s){if(!window.speechSynthesis)return;const e=yGe(s);if(!e)return;const n=new SpeechSynthesisUtterance(e);n.rate=1,n.pitch=1,n.onstart=()=>{performance.now(),wGe()},n.onend=()=>{!window.speechSynthesis.speaking&&!window.speechSynthesis.pending&&mZ()},n.onerror=i=>{i.error!=="canceled"&&!window.speechSynthesis.speaking&&!window.speechSynthesis.pending&&mZ()},window.speechSynthesis.speak(n)}function CGe(){window.speechSynthesis&&(window.speechSynthesis.cancel(),mZ())}function a3(s,e,n,i,r){var a,l;try{(l=(a=window.api)==null?void 0:a.logs)==null||l.write(s,e,n,i,r)}catch{}const o=e==="error"?console.error:e==="warn"?console.warn:console.log;i!==void 0?o(`[${s}]`,n,i):o(`[${s}]`,n)}const $n={debug:(s,e,n)=>a3(s,"debug",e,n),info:(s,e,n)=>a3(s,"info",e,n),warn:(s,e,n)=>a3(s,"warn",e,n),error:(s,e,n,i)=>a3(s,"error",e,n,i)};function G_e(){$t.getState().submitCountdownStartAt!==null&&$t.setState({submitCountdownStartAt:null})}let q_e=null;const l3=1e4;let S2=null;function bG(){S2&&(clearTimeout(S2),S2=null)}let HF=null,WF=null;function c3(){HF=null,WF&&(WF(),WF=null)}const SGe=1500,kGe=9e4;let SN=0,VF=null,_Z=-1;function kN(){VF&&(clearTimeout(VF),VF=null,_Z=-1)}const EGe=1800*1e3;let k2=null;function LGe(){k2&&(clearTimeout(k2),k2=null)}const $t=lo((s,e)=>{function n(){LGe(),k2=setTimeout(()=>{if(k2=null,e().isRecording||q_e){n();return}$n.info("voice","model idle timeout: releasing worker"),kN(),SN++,s({modelStatus:"idle",loadingProgress:0,error:null,errorKind:null})},EGe)}return{isRecording:!1,externalRecording:!1,ttsEnabled:!1,autoSubmit:!0,submitDelayMs:8e3,submitCountdownStartAt:null,lastTranscript:"",lastPartial:"",statusPill:"idle",partialsEnabled:!0,error:null,errorKind:null,modelStatus:"idle",loadingProgress:0,permissionState:"unknown",lastBargeInAt:null,hotkeyState:"idle",levelMeterEnabled:!0,turnDetectorState:"disabled",turnDetectorMode:"off",wizardArmed:!1,wizardOpen:!1,initModel:()=>{if(e().modelStatus!=="idle")return;$n.info("voice","initModel: kicking off preload"),s({modelStatus:"loading",error:null,errorKind:null,loadingProgress:0});const i=++SN,r=()=>{i===SN&&(kN(),_Z=i,VF=setTimeout(()=>{_Z===i&&e().modelStatus==="loading"&&($n.warn("voice","mic.gate.timeout: no progress within 90s"),s({modelStatus:"error",error:"Model load timed out",errorKind:"timeout"}))},kGe))};r(),mGe((o,a)=>{i===SN&&(o==="ready"?(kN(),$n.info("voice","modelStatus -> ready"),s({modelStatus:"ready",loadingProgress:100,errorKind:null}),!e().isRecording&&!q_e&&n()):o==="error"?(kN(),$n.error("voice","modelStatus -> error",{msg:a}),s({modelStatus:"error",error:a,errorKind:"load"})):(r(),s({modelStatus:"loading"})))},o=>{i===SN&&(r(),s({loadingProgress:Math.round(o)}))})},resetAndRetryModel:()=>{$n.info("voice","mic.gate.retry"),kN(),s({modelStatus:"idle",error:null,errorKind:null,loadingProgress:0}),e().initModel()},startRecording:(i,r)=>{if(!e().isRecording){s({error:"Microphone or Web Worker not available",errorKind:"recording"});return}},stopRecording:()=>{},restartWithDevice:async()=>{e().isRecording},setExternalRecording:i=>s({externalRecording:i}),toggleTTS:()=>s(i=>({ttsEnabled:!i.ttsEnabled})),setAutoSubmit:i=>s({autoSubmit:i}),setSubmitDelayMs:i=>s({submitDelayMs:Math.max(500,Math.min(13e3,Math.floor(i)))}),cancelSubmit:()=>G_e(),setPartialsEnabled:i=>{e().partialsEnabled!==i&&(s({partialsEnabled:i}),i||s({lastPartial:""}))},clearError:()=>s({error:null,errorKind:null}),setPermissionState:i=>{e().permissionState!==i&&($n.info("voice","mic.gate.permission_changed",{from:e().permissionState,to:i}),s({permissionState:i}))},setLevelMeterEnabled:i=>{e().levelMeterEnabled!==i&&s({levelMeterEnabled:i})},setTurnDetectorRuntimeState:i=>{e().turnDetectorState!==i&&(s({turnDetectorState:i}),i==="load_failed"?$n.warn("voice-turn","voice-turn.load_failed"):i==="runtime_error"?$n.warn("voice-turn","voice-turn.runtime_error"):i==="disabled"&&$n.info("voice-turn","voice-turn.fallback_to_vad"))},setWizardArmed:i=>{e().wizardArmed!==i&&s({wizardArmed:i})},openWizard:()=>{e().wizardOpen||s({wizardOpen:!0})},closeWizard:()=>{e().wizardOpen&&s({wizardOpen:!1})},armHotkey:({phase:i,source:r,mode:o,tabId:a})=>{const l=e(),{canRecord:c,reason:d}=c6();if(i==="down"){if(d==="error"||d==="load-timeout"){l.resetAndRetryModel(),$n.info("voice-hotkey","down.retry",{source:r,reason:d});return}if(!c&&d!=="loading"){$n.warn("voice-hotkey","miss-model-loading",{modelStatus:l.modelStatus,reason:d});return}if(l.hotkeyState==="recording"||l.isRecording){(o==="toggle"||r==="global")&&(s({hotkeyState:"stopping"}),bG(),S2=setTimeout(()=>{e().hotkeyState==="stopping"&&($n.warn("voice-hotkey","drain-timeout",{durationMs:l3}),s({hotkeyState:"aborted"}),setTimeout(()=>{e().hotkeyState==="aborted"&&s({hotkeyState:"idle"})},0))},l3),l.stopRecording());return}if(d==="loading"){l.hotkeyState!=="armed"&&(s({hotkeyState:"armed"}),$n.info("voice-hotkey","armed",{source:r,modelStatus:l.modelStatus})),c3(),HF={tabId:a,source:r,mode:o},WF=$t.subscribe((u,h)=>{if(HF&&u.modelStatus==="ready"&&h.modelStatus!=="ready"&&u.hotkeyState==="armed"){const f=HF;if(c3(),!f.tabId){$n.warn("voice-hotkey","armed-promote-no-tab",{source:f.source}),s({hotkeyState:"idle"});return}$n.info("voice-hotkey","armed-promote",f),s({hotkeyState:"recording"}),$t.getState().startRecording(f.tabId)}});return}if(!a){$n.warn("voice-hotkey","no-active-tab",{source:r});return}$n.info("voice-hotkey","start",{source:r,mode:o,tabId:a}),l.startRecording(a),e().isRecording?s({hotkeyState:"recording"}):($n.warn("voice-hotkey","start: recording did not engage",{errorKind:e().errorKind}),s({hotkeyState:"idle"}));return}if(!(o!=="hold"||r==="global")){if(l.hotkeyState==="armed"){c3(),$n.info("voice-hotkey","miss-model-loading-armed-up"),s({hotkeyState:"idle"});return}l.hotkeyState==="recording"&&(s({hotkeyState:"stopping"}),bG(),S2=setTimeout(()=>{e().hotkeyState==="stopping"&&($n.warn("voice-hotkey","drain-timeout",{durationMs:l3}),s({hotkeyState:"aborted"}),setTimeout(()=>{e().hotkeyState==="aborted"&&s({hotkeyState:"idle"})},0))},l3),l.stopRecording())}},destroyHotkey:()=>{const i=e();if(c3(),G_e(),i.hotkeyState==="recording"){$n.warn("voice-hotkey","destroyed-mid-recording"),s({hotkeyState:"destroyed"});try{i.stopRecording()}catch{}}else(i.hotkeyState==="armed"||i.hotkeyState==="stopping")&&(bG(),s({hotkeyState:"destroyed"}))}}}),DGe=s=>({isRecording:s.isRecording,statusPill:s.statusPill,lastPartial:s.lastPartial,lastTranscript:s.lastTranscript,submitCountdownStartAt:s.submitCountdownStartAt}),c6=s=>({canRecord:!1,reason:"unsupported"});if(typeof window<"u"){const s=window;s.__voice=$t,s.__transcripts=[]}const dA=6e4,TGe=3e5,NGe=.25,IGe=5e3,uA=lo(()=>({data:null,refreshing:!1}));let K_e=!1,$F=null,vG=dA,d3=!1,Vm=null;function RGe(s,e){if(s.kind==="ok")return{delayMs:dA,nextBackoffMs:dA};const n=Math.min(e*2,TGe),i=n*NGe;let r=n+(Math.random()*2-1)*i;const o=s.kind==="meter_rate_limited"?s.retryAfterMs:void 0;return typeof o=="number"&&Number.isFinite(o)&&o>r&&(r=o),{delayMs:r,nextBackoffMs:n}}function Y_e(){return ile(window.api.billing.fetch(),IGe,"billing.fetch")}function X_e(s){uA.setState({data:s,refreshing:!1})}async function fle(){uA.setState({refreshing:!0});let s=dA;try{const e=await Y_e();Vm&&(Vm.cancel(),Vm=null),X_e(e);const{delayMs:n,nextBackoffMs:i}=RGe(e,vG);vG=i,s=n}catch(e){vG=dA,uA.setState({refreshing:!1});const n=KIe({error:e,retry:Y_e,onRetrySuccess:i=>{Vm=null,X_e(i)},onStillFailing:i=>{Vm=null,d3||(d3=!0,ve.warn(`Billing usage fetch: ${i}`))}});if(n)Vm=n;else if(!d3){d3=!0;const i=e instanceof Error?e.message:String(e);ve.warn(`Billing usage fetch failed: ${i}`)}}$F=setTimeout(fle,s)}function AGe(){K_e||(K_e=!0,fle())}function p2e(s){return s?s.kind==="ok"||s.kind==="ok-stale"?s.data:(s.kind==="auth"||s.kind==="meter_rate_limited")&&s.cached?s.cached:null:null}function MGe(){$F!==null&&(clearTimeout($F),$F=null),Vm&&(Vm.cancel(),Vm=null),fle()}function sw(s){if(!s||s==="—"||s==="unknown")return s;const e=/\[(\dm)\]/.exec(s),n=/(opus|sonnet|haiku|fable)[-_](\d+)[-_.]?(\d+)?/i.exec(s);if(!n)return s;const i=n[1].charAt(0).toUpperCase()+n[1].slice(1).toLowerCase(),r=n[3]?`${n[2]}.${n[3]}`:n[2];return e?`${i} ${r} ${e[1]}`:`${i} ${r}`}function yf(s){const e=/(opus|sonnet|haiku|fable)/i.exec(s);return e?e[1].toLowerCase():null}const u3=new Map,PGe=3e4;function ple(s){const[e,n]=R.useState(()=>{var i;return s?((i=u3.get(s))==null?void 0:i.value)??null:null});return R.useEffect(()=>{if(!s){n(null);return}let i=!1;return(async()=>{const o=u3.get(s);if(o&&Date.now()-o.ts<PGe){i||n(o.value);return}try{const a=await window.api.app.gitBranch(s);if(i)return;u3.set(s,{value:a,ts:Date.now()}),n(a)}catch{if(i)return;u3.set(s,{value:null,ts:Date.now()}),n(null)}})(),()=>{i=!0}},[s]),e}const g2e="~/.claude/session-manager/ui-chrome-prefs.json",OGe=180,FGe=480,bZ=252,ry={sidebarWidth:bZ,sidebarCollapsed:!1,collapsedGroups:[],learningPanelCollapsed:!1,tourCompletedAt:null,density:"roomy"};function vZ(s){return Math.min(FGe,Math.max(OGe,s))}let Pv=null,zF={};function jGe(s){const e=()=>{const n=s(),i={sidebarWidth:n.sidebarWidth,sidebarCollapsed:n.sidebarCollapsed,collapsedGroups:n.collapsedGroups,learningPanelCollapsed:n.learningPanelCollapsed,tourCompletedAt:n.tourCompletedAt,density:n.density};window.api.config.writeJson(g2e,i).catch(()=>{})};s().hydrated||!Pv?e():Pv.then(e)}function bk(s,e,n){s(n),!e().hydrated&&Pv&&Object.assign(zF,n),jGe(e)}const _o=lo((s,e)=>({...ry,hydrated:!1,hydrate:()=>e().hydrated?Promise.resolve():Pv||(Pv=(async()=>{try{const n=await window.api.config.readJson(g2e);if(n.exists&&n.data&&typeof n.data=="object"){const i=n.data;s({sidebarWidth:typeof i.sidebarWidth=="number"?vZ(i.sidebarWidth):ry.sidebarWidth,sidebarCollapsed:i.sidebarCollapsed??ry.sidebarCollapsed,collapsedGroups:Array.isArray(i.collapsedGroups)?i.collapsedGroups:ry.collapsedGroups,learningPanelCollapsed:i.learningPanelCollapsed??ry.learningPanelCollapsed,tourCompletedAt:typeof i.tourCompletedAt=="number"?i.tourCompletedAt:ry.tourCompletedAt,density:i.density==="compact"?"compact":ry.density,...zF,hydrated:!0});return}}catch{}s({...zF,hydrated:!0})})().finally(()=>{Pv=null,zF={}}),Pv),setSidebarWidth:n=>bk(s,e,{sidebarWidth:vZ(n)}),setSidebarCollapsed:n=>bk(s,e,{sidebarCollapsed:n}),setCollapsedGroups:n=>bk(s,e,{collapsedGroups:n}),setLearningPanelCollapsed:n=>bk(s,e,{learningPanelCollapsed:n}),setTourCompletedAt:n=>bk(s,e,{tourCompletedAt:n}),setDensity:n=>bk(s,e,{density:n})}));function BGe(s){return s.filter(e=>e.group==="Tools").map(({key:e,label:n,icon:i,hint:r})=>({key:e,label:n,icon:i,hint:r}))}const HGe=52;function WGe(s){return new Set(s.filter(e=>e==="Workspace"||e==="Configure"||e==="Tools"))}function VGe(){const s=Tt(n=>{var i;return((i=n.tabs.find(r=>r.id===n.activeTabId))==null?void 0:i.cwd)??null});return{scheduler:ml(n=>{var i;return(((i=n.snapshot)==null?void 0:i.jobs)??[]).some(r=>r.status==="running"&&(!s||r.cwd===s))})}}function $Ge({active:s,onNavigate:e,onNewSession:n}){const i=_o(F=>F.hydrated),r=_o(F=>F.hydrate);R.useEffect(()=>{i||r()},[i,r]);const o=_o(F=>F.collapsedGroups),a=_o(F=>F.setCollapsedGroups),l=R.useMemo(()=>WGe(o),[o]),c=R.useCallback(F=>{const H=new Set(l);H.has(F)?H.delete(F):H.add(F),a(Array.from(H))},[l,a]),d=_o(F=>F.sidebarCollapsed),u=_o(F=>F.setSidebarCollapsed),h=R.useCallback(()=>{u(!d)},[d,u]),f=Tt(F=>F.tabs),p=Tt(F=>F.activeTabId),m=f.find(F=>F.id===p)??null,_=VGe(),b=yi(F=>F.navFace),v=OUe(b),w=v.filter(F=>F.group==="Workspace"),y=v.filter(F=>F.group==="Configure"),x=BGe(v),S=b==="home"&&!d,E=_o(F=>F.sidebarWidth),L=_o(F=>F.setSidebarWidth),[T,I]=R.useState(E),A=R.useRef(T);A.current=T,R.useEffect(()=>{I(E)},[E]);const P=R.useCallback(F=>{F.preventDefault();const H=F.clientX,W=A.current;let G=W;const J=O=>{G=vZ(W+(O.clientX-H)),I(G)},Y=()=>{window.removeEventListener("pointermove",J),window.removeEventListener("pointerup",Y),document.body.style.cursor="",document.body.style.userSelect="",L(G)};window.addEventListener("pointermove",J),window.addEventListener("pointerup",Y),document.body.style.cursor="col-resize",document.body.style.userSelect="none"},[L]),B=R.useCallback(()=>{I(bZ),L(bZ)},[L]);return g.jsxs("aside",{className:"shrink-0 bg-bg-elev border-r border-line flex flex-col relative transition-[width] duration-150",style:{width:d?HGe:T},"data-testid":"tour-leftnav","aria-label":"Primary navigation",children:[g.jsx(zGe,{tab:m,navFace:b,onNewSession:n,rail:d,onToggleRail:h}),g.jsx("div",{className:"flex-1 min-h-0 overflow-auto pb-3",style:{paddingInline:d?"4px":"8px"},children:S?g.jsxs(g.Fragment,{children:[g.jsx(wG,{label:"Workspace",desc:mG.Workspace,collapsed:l.has("Workspace"),count:w.length,onToggle:()=>c("Workspace")}),!l.has("Workspace")&&w.map(F=>g.jsx(yG,{item:F,active:s===F.key,live:F.liveKind?_[F.liveKind]:!1,onClick:()=>e(F.key),rail:!1},F.key)),g.jsx(wG,{label:"Configure",desc:mG.Configure,collapsed:l.has("Configure"),count:y.length,onToggle:()=>c("Configure")}),!l.has("Configure")&&y.map(F=>g.jsx(yG,{item:F,active:s===F.key,live:!1,onClick:()=>e(F.key),rail:!1},F.key)),x.length>0&&g.jsx(wG,{label:"Tools",desc:mG.Tools,collapsed:l.has("Tools"),count:x.length,onToggle:()=>c("Tools")}),x.length>0&&!l.has("Tools")&&x.map(F=>g.jsx(Z_e,{tool:F,active:s===F.key,onClick:()=>e(F.key),rail:!1},F.key))]}):g.jsx("div",{className:"pt-2",children:v.map(F=>F.group==="Tools"?g.jsx(Z_e,{tool:{key:F.key,label:F.label,icon:F.icon,hint:F.hint},active:s===F.key,onClick:()=>e(F.key),rail:d},F.key):g.jsx(yG,{item:F,active:s===F.key,live:F.liveKind?_[F.liveKind]:!1,onClick:()=>e(F.key),rail:d},F.key))})}),g.jsx(UGe,{rail:d,navFace:b}),!d&&g.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":"Resize sidebar",title:"Drag to resize · double-click to reset",onPointerDown:P,onDoubleClick:B,className:"absolute top-0 right-0 h-full w-1.5 translate-x-1/2 z-10 cursor-col-resize hover:bg-accent/40 active:bg-accent/60 transition-colors"})]})}function zGe({tab:s,navFace:e,onNewSession:n,rail:i,onToggleRail:r}){const o=(s==null?void 0:s.label)??"no session",a=ple((s==null?void 0:s.cwd)??null);return i?g.jsxs("div",{className:"flex flex-col items-center gap-1.5 pt-2 pb-2 border-b border-rule",children:[g.jsx("button",{onClick:n,"data-testid":"tour-new-session",title:"Open / Start Project",className:"w-9 h-9 rounded-md bg-bg-hi border border-line text-fg hover:bg-bg-hi/80 hover:border-accent/40 transition-colors flex items-center justify-center",children:g.jsx(jr,{name:"plus",size:15,stroke:1.8})}),g.jsx("button",{onClick:r,title:"Expand sidebar","data-testid":"sidebar-rail-toggle",className:"w-9 h-9 rounded-md text-fg-faint hover:text-fg hover:bg-bg-hi/50 transition-colors flex items-center justify-center",children:g.jsx("span",{style:{display:"inline-flex",transform:"rotate(0deg)"},children:g.jsx(jr,{name:"chevron",size:15,stroke:1.8})})})]}):e==="home"?g.jsxs("div",{className:"px-[18px] pt-[14px] pb-[10px] border-b border-rule",children:[g.jsxs("div",{className:"flex items-center justify-between",children:[g.jsx("div",{className:"text-[11px] font-semibold tracking-[0.06em] text-fg-faint uppercase",children:"Session Manager"}),g.jsx("button",{onClick:r,title:"Collapse sidebar","data-testid":"sidebar-rail-toggle",className:"w-6 h-6 rounded-md text-fg-faint hover:text-fg hover:bg-bg-hi/50 transition-colors flex items-center justify-center",children:g.jsx("span",{style:{display:"inline-flex",transform:"rotate(180deg)"},children:g.jsx(jr,{name:"chevron",size:13,stroke:1.8})})})]}),g.jsx("div",{className:"mt-3 flex items-stretch gap-1.5",children:g.jsxs("button",{onClick:n,"data-testid":"tour-new-session",className:"flex-1 px-3 py-1.5 rounded-md bg-bg-hi border border-line text-fg text-[12.5px] font-medium hover:bg-bg-hi/80 hover:border-accent/40 transition-colors flex items-center justify-center gap-1.5",children:[g.jsx(jr,{name:"plus",size:13,stroke:1.8}),"Open / Start Project"]})})]}):g.jsxs("div",{className:"px-[18px] pt-[14px] pb-[10px] border-b border-rule",children:[g.jsxs("div",{className:"flex items-center justify-between",children:[g.jsx("div",{className:"text-[11px] font-semibold tracking-[0.06em] text-fg-faint uppercase",children:"Project"}),g.jsx("button",{onClick:r,title:"Collapse sidebar","data-testid":"sidebar-rail-toggle",className:"w-6 h-6 rounded-md text-fg-faint hover:text-fg hover:bg-bg-hi/50 transition-colors flex items-center justify-center",children:g.jsx("span",{style:{display:"inline-flex",transform:"rotate(180deg)"},children:g.jsx(jr,{name:"chevron",size:13,stroke:1.8})})})]}),g.jsxs("div",{className:"flex items-baseline gap-2 mt-1",children:[g.jsx("span",{className:"self-center w-2 h-2 rounded-full bg-sage"}),g.jsx("span",{className:"font-serif text-[18px] font-medium text-fg truncate",title:(s==null?void 0:s.cwd)??"",children:o})]}),g.jsx("div",{className:"text-[12px] text-fg-faint font-mono mt-0.5 truncate",children:a?`⌥${a}`:s?s.cwd:"—"}),g.jsx("div",{className:"mt-3 flex items-stretch gap-1.5",children:g.jsxs("button",{onClick:n,"data-testid":"tour-new-session",className:"flex-1 px-3 py-1.5 rounded-md bg-bg-hi border border-line text-fg text-[12.5px] font-medium hover:bg-bg-hi/80 hover:border-accent/40 transition-colors flex items-center justify-center gap-1.5",children:[g.jsx(jr,{name:"plus",size:13,stroke:1.8}),"Open / Start Project"]})})]})}function wG({label:s,desc:e,collapsed:n,count:i,onToggle:r}){return g.jsxs("div",{className:"px-3 pt-3.5 pb-1.5",children:[g.jsxs("button",{onClick:r,"aria-expanded":!n,title:n?`Expand ${s}`:`Collapse ${s}`,className:"group w-full flex items-center gap-1.5 font-serif italic text-[11px] font-bold tracking-[0.07em] uppercase text-fg-faint hover:text-fg-dim transition-colors text-left",children:[g.jsx("span",{"aria-hidden":!0,className:"inline-block w-2 text-[9px] not-italic transition-transform",style:{transform:n?"rotate(-90deg)":"rotate(0deg)"},children:"▾"}),g.jsx("span",{className:"flex-1",children:s}),n&&g.jsx("span",{className:"not-italic text-[10px] font-mono text-fg-faint/70 normal-case tracking-normal",children:i})]}),!n&&g.jsx("p",{className:"mt-0.5 pl-3.5 text-[11px] leading-[1.35] text-fg-faint/80 normal-case tracking-normal font-sans not-italic line-clamp-2",children:e})]})}function yG({item:s,active:e,live:n,onClick:i,rail:r}){return g.jsxs("button",{onClick:i,title:s.hint,"data-testid":s.key==="scheduler"?"tour-scheduler":s.key==="terminal"?"tour-sessions":void 0,className:`relative w-full flex items-center rounded-[10px] text-left mb-0.5 transition-colors ${r?"justify-center px-0 py-[9px]":"gap-3 px-3.5 py-[9px] text-[14px]"} ${e?"bg-bg-hi text-fg font-semibold border border-line":"text-fg-dim hover:bg-bg-hi/50 hover:text-fg border border-transparent"}`,children:[e&&g.jsx("span",{"aria-hidden":!0,className:`absolute top-2 bottom-2 w-[3px] rounded-sm bg-accent ${r?"-left-[4px]":"-left-[10px]"}`}),g.jsx("span",{className:`inline-flex ${e?"text-accent":"text-fg-faint"}`,children:g.jsx(jr,{name:s.icon,size:17,stroke:1.6})}),!r&&g.jsxs("span",{className:"flex-1 min-w-0",children:[g.jsx("span",{className:"block truncate",children:s.label}),s.hint&&g.jsx("span",{className:"block text-[11px] leading-[1.3] text-fg-faint/80 font-normal truncate",children:s.hint})]}),!r&&n&&g.jsx("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-accent animate-pulse",title:"live activity"}),r&&n&&g.jsx("span",{className:"absolute top-1.5 right-1.5 w-1.5 h-1.5 rounded-full bg-accent animate-pulse",title:"live activity"})]})}function Z_e({tool:s,active:e,onClick:n,rail:i}){return g.jsxs("button",{onClick:n,title:s.hint,className:`relative w-full flex items-center rounded-[10px] text-left mb-0.5 transition-colors ${i?"justify-center px-0 py-[7px]":"gap-3 px-3.5 py-[7px] text-[13px]"} ${e?"bg-bg-hi text-fg font-semibold border border-line":"text-fg-dim hover:bg-bg-hi/50 hover:text-fg border border-transparent"}`,children:[e&&g.jsx("span",{"aria-hidden":!0,className:`absolute top-1.5 bottom-1.5 w-[3px] rounded-sm bg-accent ${i?"-left-[4px]":"-left-[10px]"}`}),g.jsx("span",{className:`inline-flex ${e?"text-accent":"text-fg-faint"}`,children:g.jsx(jr,{name:s.icon,size:15,stroke:1.6})}),!i&&g.jsxs("span",{className:"flex-1 min-w-0",children:[g.jsx("span",{className:"block truncate",children:s.label}),s.hint&&g.jsx("span",{className:"block text-[11px] leading-[1.3] text-fg-faint/80 font-normal truncate",children:s.hint})]})]})}function UGe({rail:s,navFace:e}){const n=$t(c=>c.isRecording),i=Tt(c=>c.tabs),r=Tt(c=>c.activeTabId),o=i.find(c=>c.id===r)??null,[a,l]=R.useState(null);return R.useEffect(()=>{let c=!1;if(!(o!=null&&o.presetId)){l(null);return}return WIe(o.presetId).then(d=>{c||l((d==null?void 0:d.model)??null)}).catch(()=>{c||l(null)}),()=>{c=!0}},[o==null?void 0:o.presetId]),s?g.jsx("div",{className:"py-2.5 border-t border-rule flex justify-center",children:g.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${n?"bg-red-500 animate-pulse":"bg-sage"}`,title:n?"recording":"idle"})}):g.jsxs("div",{className:"px-3.5 py-2.5 border-t border-rule flex items-center gap-2 text-[11.5px] text-fg-dim font-mono",children:[g.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${n?"bg-red-500 animate-pulse":"bg-sage"}`,title:n?"recording":"idle"}),(n||e==="project")&&g.jsx("span",{className:"truncate",title:a??"",children:n?"recording…":a?`Claude · ${sw(a)}`:"Claude Code"})]})}function GGe(s,e,n){return e?s.map(i=>i.id===e?{...i,lastActivityAt:n}:i):s}function qGe(s,e,n){return{tabId:s,sessionUuid:n,cwd:e,path:null,todos:[],lastToolUses:[],plans:[],agents:[],usage:{inputTokens:0,outputTokens:0},lastEventAt:0,activityRing:[],activitySeq:0}}function KGe(s,e,n){const i=Date.now(),r={...s,lastEventAt:n!=null&&n.replay?s.lastEventAt:i},o=[],a=(l,c)=>l.length>c?l.slice(0,c-1)+"…":l;switch(e.kind){case"todo_write":{const l=Array.isArray(e.data)?e.data:[];r.todos=l,n!=null&&n.replay||o.push({id:0,kind:"todo-update",at:i,label:`Todos · ${l.length} item${l.length!==1?"s":""}`});break}case"tool_use":{const l=e.data,c=l.input,d={};for(const u of["command","file_path","pattern","url","query","subagent_type","description"])c&&u in c&&(d[u]=c[u]);if(r.lastToolUses=[{id:l.id,name:l.name,input:d,at:i},...s.lastToolUses].slice(0,50),!(n!=null&&n.replay)){const u=l.input,h=["Edit","Write","NotebookEdit"].includes(l.name),f=typeof(u==null?void 0:u.file_path)=="string"?u.file_path:void 0,p=typeof(u==null?void 0:u.command)=="string"?u.command:void 0,m=f?f.split("/").pop()??f:p?a(p,28):"";o.push({id:0,kind:"tool-use",at:i,label:m?`${l.name} · ${m}`:l.name,target:f??p,toolName:l.name}),h&&f&&o.push({id:0,kind:"file-edit",at:i,label:`${l.name} · ${a(f.split("/").pop()??f,34)}`,target:f,toolName:l.name})}break}case"plan":{const l=e.data,c=typeof l=="string"?l:(l==null?void 0:l.plan)??JSON.stringify(l);r.plans=[{at:i,content:c??""},...s.plans].slice(0,50),n!=null&&n.replay||o.push({id:0,kind:"plan-revision",at:i,label:"Plan revised"});break}case"agent_spawn":{const l=e.data;r.agents=[{id:l==null?void 0:l.toolUseId,at:i,subagentType:l==null?void 0:l.subagent_type,description:l==null?void 0:l.description,lastActivityAt:i},...s.agents].slice(0,50),n!=null&&n.replay||o.push({id:0,kind:"agent-spawn",at:i,label:l!=null&&l.subagent_type?`Agent: ${a(l.subagent_type,32)}`:"Agent spawned"});break}case"usage":{const l=e.data,c=(s.usage.inputTokens||0)+(s.usage.outputTokens||0),d=l.input_tokens??l.inputTokens??0,u=l.output_tokens??l.outputTokens??0,h=c+d+u;r.usage={inputTokens:(s.usage.inputTokens||0)+d,outputTokens:(s.usage.outputTokens||0)+u,cacheCreationInputTokens:(s.usage.cacheCreationInputTokens||0)+(l.cache_creation_input_tokens??l.cacheCreationInputTokens??0),cacheReadInputTokens:(s.usage.cacheReadInputTokens||0)+(l.cache_read_input_tokens??l.cacheReadInputTokens??0)},!(n!=null&&n.replay)&&Math.floor(h/1e3)>Math.floor(c/1e3)&&o.push({id:0,kind:"usage-tick",at:i,label:`${Math.floor(h/1e3)}k tokens`});break}case"tool_result":{const l=e.data;r.agents=GGe(s.agents,l==null?void 0:l.toolUseId,i);break}}return{next:r,newActivity:o}}const UF=lo((s,e)=>({tabs:{},refs:{},unsubs:{},subscribe:(n,i,r)=>{const o={...e().refs};if(o[n]=(o[n]??0)+1,s({refs:o}),o[n]>1)return;s({tabs:{...e().tabs,[n]:qGe(n,i,r)}});const a=window.api.transcripts.onEvent(n,l=>e().ingestBatch(n,l));s({unsubs:{...e().unsubs,[n]:a}}),window.api.transcripts.subscribe({tabId:n,cwd:i,sessionUuid:r}).then(async l=>{const c=e().tabs[n];if(!c)return;if(!l.ok){const{toast:u}=await on(async()=>{const{toast:h}=await Promise.resolve().then(()=>zIe);return{toast:h}},void 0,import.meta.url);u.error(`Live view unavailable: ${l.error??"subscribe failed"}`),s({tabs:{...e().tabs,[n]:{...c,path:null}}});return}s({tabs:{...e().tabs,[n]:{...c,path:l.path}}});const d=await window.api.transcripts.buffer(n);e().ingestBatch(n,d,{replay:!0})}).catch(l=>console.error("[live] transcripts.subscribe failed:",n,l))},unsubscribe:n=>{const i={...e().refs};if(!i[n])return;if(i[n]--,i[n]>0){s({refs:i});return}delete i[n];const r=e().unsubs[n];r==null||r();const o={...e().unsubs};delete o[n];const a={...e().tabs};delete a[n],window.api.transcripts.unsubscribe(n),s({refs:i,unsubs:o,tabs:a})},ingest:(n,i,r)=>{e().ingestBatch(n,[i],r)},ingestBatch:(n,i,r)=>{const o=e().tabs[n];if(!o||i.length===0)return;let a=o,l=[];for(const c of i){const{next:d,newActivity:u}=KGe(a,c,r);a=d,l=l.concat(u)}if(l.length>0){let c=o.activitySeq;const d=l.map(u=>({...u,id:++c}));a={...a,activitySeq:c,activityRing:[...o.activityRing,...d].slice(-32)}}s({tabs:{...e().tabs,[n]:a}})}}));function YGe(s){const e=UF(r=>r.subscribe),n=UF(r=>r.unsubscribe),i=UF(r=>s?r.tabs[s.id]:void 0);return R.useEffect(()=>{if(s)return e(s.id,s.cwd,s.sessionId),()=>n(s.id)},[s==null?void 0:s.id,s==null?void 0:s.cwd,s==null?void 0:s.sessionId,e,n]),i}function m2e(s){if(!s)return null;const e=new Date(s);if(Number.isNaN(e.getTime()))return null;const n=e.getTime()-Date.now();if(n<=0)return{rel:"now",abs:""};const i=Math.floor(n/864e5),r=Math.floor(n%864e5/36e5),o=Math.floor(n%36e5/6e4),a=i>0?`${i}d ${r}h`:r>0?`${r}h ${o}m`:`${o}m`,l=i>=1?e.toLocaleString("en-US",{timeZone:"America/Los_Angeles",weekday:"short",hour:"numeric",minute:"2-digit"}):e.toLocaleTimeString("en-US",{timeZone:"America/Los_Angeles",hour:"numeric",minute:"2-digit"});return{rel:a,abs:`${l} PT`}}function wZ(s){return!s||typeof s.utilization!="number"||Number.isNaN(s.utilization)?null:Math.round(s.utilization)}function J_e(s,e){const n=wZ(e);if(n==null)return`${s} — usage unavailable`;const i=m2e((e==null?void 0:e.resets_at)??null),r=i?` · resets in ${i.rel}${i.abs?` (${i.abs})`:""}`:"";return`${s} · ${n}% used${r} — click to open Home`}function XGe(s,e){return s?s==="session"||s==="five_hour"?"Session · 5h":s==="weekly_all"?"Weekly · all models":s==="weekly_scoped"?"Weekly · scoped":s:null}const _2e=R.createContext(null);function ZGe({panelId:s,children:e}){return g.jsx(_2e.Provider,{value:s,children:e})}function hS(s){const e=R.useContext(_2e),n=s??e;return yi(i=>n==null||i.focusedPanelId===n)}function gle(s){const e=hS(s),n=R.useRef(e);return n.current=e,n}const JGe=5e3;let Uy=null;const yZ=new Set;let xG=0,E2=null;function QGe(){yZ.forEach(s=>s())}async function d6(){try{Uy=await window.api.schedule.sessionSlots(),QGe()}catch{}}const eqe=0,tqe=10;async function b2e(s){Uy||await d6();const e=Uy?Uy.min:eqe,n=Uy?Uy.max:tqe,i=Math.min(n,Math.max(e,Math.round(s)));await window.api.schedule.setSessionSlots(i),await d6()}function nqe(){E2==null&&(d6(),E2=setInterval(()=>{d6()},JGe))}function iqe(){E2!=null&&(clearInterval(E2),E2=null)}function zP(s){const e=hS(s),[,n]=R.useState(0);return R.useEffect(()=>{const i=()=>n(r=>r+1);return yZ.add(i),()=>{yZ.delete(i)}},[]),R.useEffect(()=>{if(e)return xG+=1,nqe(),()=>{xG-=1,xG<=0&&iqe()}},[e]),Uy}const sqe=360*60*1e3;let v2e=null;const xZ=new Set;let CG=0,L2=null;async function Q_e(){try{v2e=await window.api.app.updateStatus(),xZ.forEach(s=>s())}catch{}}function rqe(){L2==null&&(Q_e(),L2=setInterval(()=>{Q_e()},sqe))}function oqe(){L2!=null&&(clearInterval(L2),L2=null)}function aqe(){const[,s]=R.useState(0);return R.useEffect(()=>{const e=()=>s(n=>n+1);return xZ.add(e),CG+=1,rqe(),()=>{xZ.delete(e),CG-=1,CG<=0&&oqe()}},[]),v2e}let w2e=null;const CZ=new Set;let SG=0,GF=null,SZ=!1;function ebe(s){w2e=s,CZ.forEach(e=>e())}function lqe(){SZ||(SZ=!0,GF=window.api.updater.onStatus(ebe),window.api.updater.status().then(ebe).catch(()=>{}))}function cqe(){SZ=!1,GF&&(GF(),GF=null)}function y2e(){const[,s]=R.useState(0);return R.useEffect(()=>{const e=()=>s(n=>n+1);return CZ.add(e),SG+=1,lqe(),()=>{CZ.delete(e),SG-=1,SG<=0&&cqe()}},[]),w2e}function x2e({total:s,inUse:e,size:n}){const i=Math.min(Math.max(e,0),s),r=n==="md"?"w-3.5 h-3.5 rounded-full border":"w-2 h-2 rounded-full border";return g.jsx(g.Fragment,{children:Array.from({length:s},(o,a)=>g.jsx("span",{"data-testid":"slot-dot","data-filled":a<i?"true":"false",className:`${r} ${a<i?"bg-accent border-accent":"bg-bg border-line"}`},a))})}function dqe({onNavigate:s}){const e=Tt(W=>W.tabs),n=Tt(W=>W.activeTabId),i=e.find(W=>W.id===n)??null,r=YGe(i),o=(r==null?void 0:r.lastEventAt)??0,a=uA(W=>W.data),l=ml(W=>{var G;return((G=W.snapshot)==null?void 0:G.paused)??null}),c=ple((i==null?void 0:i.cwd)??null),d=zP(),u=aqe(),h=y2e(),f=so(W=>W.show),[,p]=R.useState(0);R.useEffect(()=>{const W=setInterval(()=>p(G=>G+1),6e4);return()=>clearInterval(W)},[]);const m=async()=>{const W=(h==null?void 0:h.latest)??"";try{const G=await window.api.updater.install(!1),J=(G==null?void 0:G.status)??await window.api.updater.status();(J==null?void 0:J.state)==="deferred"&&f("info",`Update v${W} will install when ${J.busyReason??"running jobs"} finish`)}catch(G){f("error",G instanceof Error?G.message:String(G))}},_=(r==null?void 0:r.todos)??[],[b,v]=R.useState(!1),w=R.useRef(null);R.useEffect(()=>{if(!b)return;const W=G=>{w.current&&!w.current.contains(G.target)&&v(!1)};return document.addEventListener("mousedown",W),()=>document.removeEventListener("mousedown",W)},[b]),R.useEffect(()=>{_.length===0&&v(!1)},[_.length]);const y=p2e(a),x=(y==null?void 0:y.usage.five_hour)??null,S=(y==null?void 0:y.usage.seven_day)??null,E=wZ(x),L=wZ(S),T=(a==null?void 0:a.kind)==="ok"||(a==null?void 0:a.kind)==="ok-stale",I=o>0?fqe(Date.now()-o):"—",A=(d==null?void 0:d.total)??5,P=d?Math.min(Math.max(d.inUse,0),d.total):0,B=d?`${P} / ${A}`:`— / ${A}`,F=d&&d.holders.length>0?`
|
|
74
74
|
`+d.holders.slice(0,5).map(W=>W.owner).join(`
|
|
75
|
-
`):"",H=`${B} Claude sessions running${F}`;return g.jsxs("div",{className:"h-[30px] shrink-0 bg-bg-elev border-t border-line flex items-center gap-4 px-[18px] font-mono text-[11.5px] text-fg-dim","data-testid":"tour-statusbar",children:[g.jsxs("button",{onClick:()=>s==null?void 0:s("settings"),className:"flex items-center gap-1.5 hover:text-fg transition-colors",title:T?"Connected to Anthropic":"Disconnected",children:[g.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${T?"bg-sage":"bg-fg-faint"}`}),g.jsx("span",{children:T?"connected":"offline"})]}),g.jsxs("button",{onClick:()=>s==null?void 0:s("overview"),className:"hover:text-fg transition-colors",title:J_e("Session (5h window)",x),"data-testid":"footer-usage-session",children:["session ",g.jsx("span",{className:"text-fg",children:E!=null?`${E}%`:"—"})]}),g.jsxs("button",{onClick:()=>s==null?void 0:s("overview"),className:"hover:text-fg transition-colors",title:J_e("Weekly window (all models)",S),"data-testid":"footer-usage-weekly",children:["weekly ",g.jsx("span",{className:"text-fg",children:L!=null?`${L}%`:"—"})]}),l&&g.jsxs("button",{onClick:()=>s==null?void 0:s("scheduler"),title:"Scheduler is paused — click to open Scheduler",className:`flex items-center gap-1 px-1.5 py-0.5 rounded border font-mono text-[10.5px] transition-colors ${l.reason==="auth"||l.reason==="network"?"border-red-700/60 text-red-300 hover:bg-red-900/20":"border-amber-700/60 text-amber-300 hover:bg-amber-900/20"}`,children:[g.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-current opacity-80"}),"Scheduler paused · ",l.reason]}),i&&g.jsxs("span",{className:"text-fg-faint",title:i.cwd,children:[i.label,c&&g.jsxs("span",{className:"text-fg-dim",children:[" · ⌥",c]})]}),g.jsxs("span",{className:"text-fg-faint",children:["last activity: ",g.jsx("span",{className:"text-fg-dim",children:I})]}),_.length>0&&g.jsx(uqe,{ref:w,todos:_,open:b,onToggle:()=>v(W=>!W)}),g.jsx("span",{className:"flex-1"}),g.jsx("button",{onClick:()=>s==null?void 0:s("overview"),className:"flex items-center gap-1 hover:text-fg transition-colors",title:H,"data-testid":"footer-active-sessions",children:d&&d.total===0?g.jsx("span",{className:"text-fg-faint",children:"pool paused"}):g.jsx(x2e,{total:A,inUse:(d==null?void 0:d.inUse)??0,size:"sm"})}),(h==null?void 0:h.state)==="ready"?g.jsxs("button",{type:"button",className:"text-amber-300 hover:underline",title:"A new version is downloaded. Click to restart and install — running jobs are waited for first.","data-testid":"footer-version",onClick:()=>{m()},children:["Update ready — restart to install v",h.latest]}):(h==null?void 0:h.state)==="deferred"?g.jsxs("span",{className:"text-amber-300",title:`Waiting for ${h.busyReason??"running jobs"} to finish before restarting`,"data-testid":"footer-version",children:["v",h.latest," installs when idle"]}):(h==null?void 0:h.state)==="downloading"?g.jsxs("span",{className:"text-fg-dim","data-testid":"footer-version",children:["Downloading v",h.latest,"…"]}):u!=null&&u.behind&&u.latest&&u.channel==="installer"?g.jsxs("button",{type:"button",className:"text-amber-300 hover:underline",title:`v${u.current} → v${u.latest}`,"data-testid":"footer-version",onClick:()=>{const W=u.downloadUrl;W&&window.api.shell.open({as:"external",url:W}).catch(()=>{f("error",`Couldn't open URL: ${W}`)})},children:["Download v",u.latest]}):u!=null&&u.behind&&u.latest?g.jsxs("span",{className:"text-amber-300",title:"A newer version is published — update the app. A stale npx cache can pin an old version.","data-testid":"footer-version",children:["v",u.current," → v",u.latest]}):g.jsxs("span",{className:"text-fg-dim","data-testid":"footer-version",children:["v",(u==null?void 0:u.current)??"0.125.0"]})]})}const uqe=R.forwardRef(function({todos:e,open:n,onToggle:i},r){const o={completed:e.filter(a=>a.status==="completed").length,in_progress:e.filter(a=>a.status==="in_progress").length,pending:e.filter(a=>a.status==="pending").length};return g.jsxs("div",{ref:r,className:"relative",children:[g.jsxs("button",{onClick:i,className:"flex items-center gap-1.5 hover:text-fg transition-colors",title:"Live to-dos for this session","data-testid":"footer-todos",children:[g.jsxs("span",{className:"text-green-400",children:["✓",o.completed]}),g.jsxs("span",{className:"text-accent",children:["●",o.in_progress]}),g.jsxs("span",{className:"text-fg-dim",children:["○",o.pending]}),g.jsxs("span",{className:"text-fg-faint",children:["todos ",n?"▾":"▴"]})]}),n&&g.jsx("div",{className:`absolute bottom-full left-0 mb-1.5 w-80 max-h-72 overflow-auto bg-bg-elev border border-line rounded shadow-xl p-2 ${Vi.dialog}`,"data-testid":"footer-todos-popover",children:g.jsx("ul",{className:"space-y-0.5",children:e.map((a,l)=>g.jsxs("li",{className:`flex items-start gap-2 py-1 px-1.5 rounded ${a.status==="in_progress"?"bg-bg-hi":""}`,children:[g.jsx(hqe,{status:a.status}),g.jsx("span",{className:a.status==="completed"?"text-fg-faint line-through":a.status==="in_progress"?"text-fg":"text-fg-dim",children:a.status==="in_progress"&&a.activeForm?a.activeForm:a.content})]},l))})})]})});function hqe({status:s}){return s==="completed"?g.jsx("span",{className:"text-green-400 w-3 shrink-0",children:"✓"}):s==="in_progress"?g.jsx("span",{className:"w-3 shrink-0",children:g.jsx("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-accent animate-pulse"})}):g.jsx("span",{className:"text-fg-faint w-3 shrink-0",children:"○"})}function fqe(s){const e=Math.max(0,Math.floor(s/1e3));if(e<60)return`${e}s ago`;const n=Math.floor(e/60);return n<60?`${n}m ago`:`${Math.floor(n/60)}h ago`}function pqe({onClose:s,onSent:e}){const n=Tt(L=>L.tabs),[i,r]=R.useState(""),[o,a]=R.useState(()=>Object.fromEntries(n.map(L=>[L.id,!0]))),[l,c]=R.useState(!1),[d,u]=R.useState({}),h=R.useRef(null),f=R.useRef(e);R.useEffect(()=>{f.current=e},[e]),R.useEffect(()=>{a(L=>{const T={};for(const I of n)T[I.id]=L[I.id]??!0;return T})},[n]),R.useEffect(()=>{var L;(L=h.current)==null||L.focus()},[]),R.useEffect(()=>window.api.pty.onWriteError(T=>{u(I=>T.tabId in I?{...I,[T.tabId]:"skipped"}:I)}),[]),R.useEffect(()=>{if(Object.keys(d).length===0)return;const L=Object.values(d).filter(I=>I==="sent").length,T=window.setTimeout(()=>f.current(L),1500);return()=>window.clearTimeout(T)},[d]);const p=n.filter(L=>o[L.id]).map(L=>L.id),m=p.length,_=Object.keys(d).length>0,b=i.length>0&&m>0&&!l&&!_,v=()=>{if(!b)return;c(!0);const L=Tt.getState().tabs,T=new Set(L.map(A=>A.id)),I={};for(const A of p)T.has(A)?(window.api.pty.write({tabId:A,data:i+"\r"}),I[A]="sent"):I[A]="skipped";u(I),c(!1)},w=L=>{if(L.key==="Escape"){L.preventDefault(),L.stopPropagation(),s();return}L.key==="Enter"&&(L.metaKey||L.ctrlKey)&&(L.preventDefault(),v())},y=n.length>0&&n.every(L=>o[L.id]),x=()=>{const L=!y;a(Object.fromEntries(n.map(T=>[T.id,L])))},S=Object.values(d).some(L=>L==="skipped"),E=_?S?"Sent (some skipped)":"Sent":`Send to ${m} tab${m===1?"":"s"}`;return g.jsxs("div",{className:"border-b border-line bg-bg-elev px-4 py-3 flex flex-col gap-2 shrink-0",onKeyDown:w,"data-testid":"broadcast-bar",children:[g.jsxs("div",{className:"flex items-center justify-between",children:[g.jsx("div",{className:"text-xs text-fg-dim uppercase tracking-wider",children:"Broadcast"}),g.jsx("div",{className:"text-[10px] text-fg-faint",children:"Esc to close · Cmd/Ctrl+Enter to send"})]}),g.jsx("textarea",{ref:h,value:i,onChange:L=>r(L.target.value),rows:3,placeholder:"Prompt to broadcast…",className:"w-full bg-bg border border-line rounded px-2 py-1.5 text-xs text-fg font-mono resize-y focus:outline-none focus:border-fg-faint"}),g.jsxs("div",{className:"flex flex-col gap-1",children:[g.jsxs("label",{className:"flex items-center gap-2 text-[11px] text-fg-dim cursor-pointer select-none",children:[g.jsx("input",{type:"checkbox",checked:y,onChange:x,className:"accent-accent"}),g.jsxs("span",{children:["All tabs (",m,"/",n.length,")"]})]}),g.jsx("div",{className:"flex flex-wrap gap-x-3 gap-y-1 max-h-24 overflow-y-auto pl-4",children:n.map(L=>g.jsxs("label",{className:"flex items-center gap-1.5 text-[11px] text-fg-dim cursor-pointer select-none",children:[g.jsx("input",{type:"checkbox",checked:!!o[L.id],onChange:T=>a(I=>({...I,[L.id]:T.target.checked})),className:"accent-accent"}),g.jsx("span",{className:"truncate max-w-[12rem]",children:L.label}),d[L.id]==="sent"&&g.jsx("span",{"data-testid":"broadcast-row-sent",className:"text-[10px] text-green-500",children:"✓"}),d[L.id]==="skipped"&&g.jsx("span",{"data-testid":"broadcast-row-skipped",className:"text-[10px] text-red-400",children:"×"})]},L.id))})]}),g.jsxs("div",{className:"flex items-center gap-2 justify-end",children:[g.jsx("button",{onClick:s,className:"px-2 py-0.5 text-[10px] text-fg-faint hover:text-fg border border-line hover:border-fg-faint rounded transition-colors",children:"Cancel"}),g.jsx("button",{onClick:v,disabled:!b,className:"px-2 py-0.5 text-[10px] text-fg border border-accent-muted hover:border-accent rounded transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:E})]})]})}function gqe({tabId:s,cwd:e,onClose:n}){const i=C2(m=>m.watchersForTab(s)),r=C2(m=>m.add),o=C2(m=>m.remove),a=R.useRef(null),[l,c]=R.useState(""),[d,u]=R.useState(""),[h,f]=R.useState(!1);R.useEffect(()=>{const m=_=>{_.key==="Escape"&&n()};return document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)},[n]),R.useEffect(()=>{const m=_=>{a.current&&!a.current.contains(_.target)&&n()};return document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[n]);const p=async()=>{const m=d.trim();if(!m||h)return;f(!0);const _=await r({tabId:s,label:l.trim(),command:m,cwd:e});f(!1),_&&(c(""),u(""))};return g.jsxs("div",{ref:a,className:"absolute right-2 top-full mt-1 z-30 w-[420px] max-w-[calc(100vw-1rem)] bg-bg-elev border border-line rounded shadow-lg p-3 text-xs",role:"dialog","aria-label":"Watchers","data-testid":"watchers-popover",children:[g.jsxs("div",{className:"flex items-center mb-2",children:[g.jsx("span",{className:"text-fg-dim uppercase tracking-wider",children:"Watchers"}),g.jsxs("span",{className:"text-fg-faint ml-2",children:[i.length," active"]}),g.jsx("div",{className:"flex-1"}),g.jsx("button",{onClick:n,className:"text-fg-faint hover:text-fg",title:"Close",children:"×"})]}),g.jsxs("div",{className:"flex flex-col gap-1.5 mb-3",children:[g.jsx("input",{value:l,onChange:m=>c(m.target.value),placeholder:"label (optional)",className:"bg-bg border border-line rounded px-2 py-1 text-fg placeholder:text-fg-faint focus:outline-none focus:border-fg-faint"}),g.jsxs("div",{className:"flex gap-1.5",children:[g.jsx("input",{value:d,onChange:m=>u(m.target.value),onKeyDown:m=>{m.key==="Enter"&&p()},placeholder:"shell command — e.g. npm test --watch",className:"flex-1 bg-bg border border-line rounded px-2 py-1 text-fg placeholder:text-fg-faint focus:outline-none focus:border-fg-faint font-mono","data-testid":"watcher-command-input"}),g.jsx("button",{onClick:p,disabled:!d.trim()||h,className:"px-2 py-1 border border-line rounded text-fg-dim hover:text-fg hover:border-fg-faint disabled:opacity-40 disabled:cursor-not-allowed","data-testid":"watcher-add",children:"Add"})]}),g.jsxs("span",{className:"text-fg-faint",children:["cwd: ",g.jsx("span",{className:"font-mono",children:e})]})]}),i.length===0?g.jsx("div",{className:"text-fg-faint italic py-2",children:"no watchers — add one above"}):g.jsx("ul",{className:"flex flex-col gap-2 max-h-64 overflow-y-auto",children:i.map(m=>{const _=m.lines[m.lines.length-1];return g.jsxs("li",{className:"border border-line rounded p-2 bg-bg",children:[g.jsxs("div",{className:"flex items-center gap-2",children:[g.jsx("span",{className:"font-medium text-fg truncate",children:m.label}),g.jsxs("span",{className:"text-fg-faint",children:[m.lineCount," line",m.lineCount===1?"":"s"]}),g.jsx("div",{className:"flex-1"}),g.jsx("button",{onClick:()=>o(m.watcherId),className:"text-fg-faint hover:text-red-400",title:"Stop watcher","data-testid":`watcher-remove-${m.watcherId}`,children:"stop"})]}),g.jsx("div",{className:"text-fg-faint font-mono text-[10px] truncate mt-0.5",title:m.command,children:m.command}),g.jsx("div",{className:"text-fg-dim font-mono text-[10px] truncate mt-1",title:(_==null?void 0:_.line)??"",children:_?_.line:g.jsx("span",{className:"italic text-fg-faint",children:"waiting for output…"})})]},m.watcherId)})})]})}/**
|
|
75
|
+
`):"",H=`${B} Claude sessions running${F}`;return g.jsxs("div",{className:"h-[30px] shrink-0 bg-bg-elev border-t border-line flex items-center gap-4 px-[18px] font-mono text-[11.5px] text-fg-dim","data-testid":"tour-statusbar",children:[g.jsxs("button",{onClick:()=>s==null?void 0:s("settings"),className:"flex items-center gap-1.5 hover:text-fg transition-colors",title:T?"Connected to Anthropic":"Disconnected",children:[g.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${T?"bg-sage":"bg-fg-faint"}`}),g.jsx("span",{children:T?"connected":"offline"})]}),g.jsxs("button",{onClick:()=>s==null?void 0:s("overview"),className:"hover:text-fg transition-colors",title:J_e("Session (5h window)",x),"data-testid":"footer-usage-session",children:["session ",g.jsx("span",{className:"text-fg",children:E!=null?`${E}%`:"—"})]}),g.jsxs("button",{onClick:()=>s==null?void 0:s("overview"),className:"hover:text-fg transition-colors",title:J_e("Weekly window (all models)",S),"data-testid":"footer-usage-weekly",children:["weekly ",g.jsx("span",{className:"text-fg",children:L!=null?`${L}%`:"—"})]}),l&&g.jsxs("button",{onClick:()=>s==null?void 0:s("scheduler"),title:"Scheduler is paused — click to open Scheduler",className:`flex items-center gap-1 px-1.5 py-0.5 rounded border font-mono text-[10.5px] transition-colors ${l.reason==="auth"||l.reason==="network"?"border-red-700/60 text-red-300 hover:bg-red-900/20":"border-amber-700/60 text-amber-300 hover:bg-amber-900/20"}`,children:[g.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-current opacity-80"}),"Scheduler paused · ",l.reason]}),i&&g.jsxs("span",{className:"text-fg-faint",title:i.cwd,children:[i.label,c&&g.jsxs("span",{className:"text-fg-dim",children:[" · ⌥",c]})]}),g.jsxs("span",{className:"text-fg-faint",children:["last activity: ",g.jsx("span",{className:"text-fg-dim",children:I})]}),_.length>0&&g.jsx(uqe,{ref:w,todos:_,open:b,onToggle:()=>v(W=>!W)}),g.jsx("span",{className:"flex-1"}),g.jsx("button",{onClick:()=>s==null?void 0:s("overview"),className:"flex items-center gap-1 hover:text-fg transition-colors",title:H,"data-testid":"footer-active-sessions",children:d&&d.total===0?g.jsx("span",{className:"text-fg-faint",children:"pool paused"}):g.jsx(x2e,{total:A,inUse:(d==null?void 0:d.inUse)??0,size:"sm"})}),(h==null?void 0:h.state)==="ready"?g.jsxs("button",{type:"button",className:"text-amber-300 hover:underline",title:"A new version is downloaded. Click to restart and install — running jobs are waited for first.","data-testid":"footer-version",onClick:()=>{m()},children:["Update ready — restart to install v",h.latest]}):(h==null?void 0:h.state)==="deferred"?g.jsxs("span",{className:"text-amber-300",title:`Waiting for ${h.busyReason??"running jobs"} to finish before restarting`,"data-testid":"footer-version",children:["v",h.latest," installs when idle"]}):(h==null?void 0:h.state)==="downloading"?g.jsxs("span",{className:"text-fg-dim","data-testid":"footer-version",children:["Downloading v",h.latest,"…"]}):u!=null&&u.behind&&u.latest&&u.channel==="installer"?g.jsxs("button",{type:"button",className:"text-amber-300 hover:underline",title:`v${u.current} → v${u.latest}`,"data-testid":"footer-version",onClick:()=>{const W=u.downloadUrl;W&&window.api.shell.open({as:"external",url:W}).catch(()=>{f("error",`Couldn't open URL: ${W}`)})},children:["Download v",u.latest]}):u!=null&&u.behind&&u.latest?g.jsxs("span",{className:"text-amber-300",title:"A newer version is published — update the app. A stale npx cache can pin an old version.","data-testid":"footer-version",children:["v",u.current," → v",u.latest]}):g.jsxs("span",{className:"text-fg-dim","data-testid":"footer-version",children:["v",(u==null?void 0:u.current)??"0.125.1"]})]})}const uqe=R.forwardRef(function({todos:e,open:n,onToggle:i},r){const o={completed:e.filter(a=>a.status==="completed").length,in_progress:e.filter(a=>a.status==="in_progress").length,pending:e.filter(a=>a.status==="pending").length};return g.jsxs("div",{ref:r,className:"relative",children:[g.jsxs("button",{onClick:i,className:"flex items-center gap-1.5 hover:text-fg transition-colors",title:"Live to-dos for this session","data-testid":"footer-todos",children:[g.jsxs("span",{className:"text-green-400",children:["✓",o.completed]}),g.jsxs("span",{className:"text-accent",children:["●",o.in_progress]}),g.jsxs("span",{className:"text-fg-dim",children:["○",o.pending]}),g.jsxs("span",{className:"text-fg-faint",children:["todos ",n?"▾":"▴"]})]}),n&&g.jsx("div",{className:`absolute bottom-full left-0 mb-1.5 w-80 max-h-72 overflow-auto bg-bg-elev border border-line rounded shadow-xl p-2 ${Vi.dialog}`,"data-testid":"footer-todos-popover",children:g.jsx("ul",{className:"space-y-0.5",children:e.map((a,l)=>g.jsxs("li",{className:`flex items-start gap-2 py-1 px-1.5 rounded ${a.status==="in_progress"?"bg-bg-hi":""}`,children:[g.jsx(hqe,{status:a.status}),g.jsx("span",{className:a.status==="completed"?"text-fg-faint line-through":a.status==="in_progress"?"text-fg":"text-fg-dim",children:a.status==="in_progress"&&a.activeForm?a.activeForm:a.content})]},l))})})]})});function hqe({status:s}){return s==="completed"?g.jsx("span",{className:"text-green-400 w-3 shrink-0",children:"✓"}):s==="in_progress"?g.jsx("span",{className:"w-3 shrink-0",children:g.jsx("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-accent animate-pulse"})}):g.jsx("span",{className:"text-fg-faint w-3 shrink-0",children:"○"})}function fqe(s){const e=Math.max(0,Math.floor(s/1e3));if(e<60)return`${e}s ago`;const n=Math.floor(e/60);return n<60?`${n}m ago`:`${Math.floor(n/60)}h ago`}function pqe({onClose:s,onSent:e}){const n=Tt(L=>L.tabs),[i,r]=R.useState(""),[o,a]=R.useState(()=>Object.fromEntries(n.map(L=>[L.id,!0]))),[l,c]=R.useState(!1),[d,u]=R.useState({}),h=R.useRef(null),f=R.useRef(e);R.useEffect(()=>{f.current=e},[e]),R.useEffect(()=>{a(L=>{const T={};for(const I of n)T[I.id]=L[I.id]??!0;return T})},[n]),R.useEffect(()=>{var L;(L=h.current)==null||L.focus()},[]),R.useEffect(()=>window.api.pty.onWriteError(T=>{u(I=>T.tabId in I?{...I,[T.tabId]:"skipped"}:I)}),[]),R.useEffect(()=>{if(Object.keys(d).length===0)return;const L=Object.values(d).filter(I=>I==="sent").length,T=window.setTimeout(()=>f.current(L),1500);return()=>window.clearTimeout(T)},[d]);const p=n.filter(L=>o[L.id]).map(L=>L.id),m=p.length,_=Object.keys(d).length>0,b=i.length>0&&m>0&&!l&&!_,v=()=>{if(!b)return;c(!0);const L=Tt.getState().tabs,T=new Set(L.map(A=>A.id)),I={};for(const A of p)T.has(A)?(window.api.pty.write({tabId:A,data:i+"\r"}),I[A]="sent"):I[A]="skipped";u(I),c(!1)},w=L=>{if(L.key==="Escape"){L.preventDefault(),L.stopPropagation(),s();return}L.key==="Enter"&&(L.metaKey||L.ctrlKey)&&(L.preventDefault(),v())},y=n.length>0&&n.every(L=>o[L.id]),x=()=>{const L=!y;a(Object.fromEntries(n.map(T=>[T.id,L])))},S=Object.values(d).some(L=>L==="skipped"),E=_?S?"Sent (some skipped)":"Sent":`Send to ${m} tab${m===1?"":"s"}`;return g.jsxs("div",{className:"border-b border-line bg-bg-elev px-4 py-3 flex flex-col gap-2 shrink-0",onKeyDown:w,"data-testid":"broadcast-bar",children:[g.jsxs("div",{className:"flex items-center justify-between",children:[g.jsx("div",{className:"text-xs text-fg-dim uppercase tracking-wider",children:"Broadcast"}),g.jsx("div",{className:"text-[10px] text-fg-faint",children:"Esc to close · Cmd/Ctrl+Enter to send"})]}),g.jsx("textarea",{ref:h,value:i,onChange:L=>r(L.target.value),rows:3,placeholder:"Prompt to broadcast…",className:"w-full bg-bg border border-line rounded px-2 py-1.5 text-xs text-fg font-mono resize-y focus:outline-none focus:border-fg-faint"}),g.jsxs("div",{className:"flex flex-col gap-1",children:[g.jsxs("label",{className:"flex items-center gap-2 text-[11px] text-fg-dim cursor-pointer select-none",children:[g.jsx("input",{type:"checkbox",checked:y,onChange:x,className:"accent-accent"}),g.jsxs("span",{children:["All tabs (",m,"/",n.length,")"]})]}),g.jsx("div",{className:"flex flex-wrap gap-x-3 gap-y-1 max-h-24 overflow-y-auto pl-4",children:n.map(L=>g.jsxs("label",{className:"flex items-center gap-1.5 text-[11px] text-fg-dim cursor-pointer select-none",children:[g.jsx("input",{type:"checkbox",checked:!!o[L.id],onChange:T=>a(I=>({...I,[L.id]:T.target.checked})),className:"accent-accent"}),g.jsx("span",{className:"truncate max-w-[12rem]",children:L.label}),d[L.id]==="sent"&&g.jsx("span",{"data-testid":"broadcast-row-sent",className:"text-[10px] text-green-500",children:"✓"}),d[L.id]==="skipped"&&g.jsx("span",{"data-testid":"broadcast-row-skipped",className:"text-[10px] text-red-400",children:"×"})]},L.id))})]}),g.jsxs("div",{className:"flex items-center gap-2 justify-end",children:[g.jsx("button",{onClick:s,className:"px-2 py-0.5 text-[10px] text-fg-faint hover:text-fg border border-line hover:border-fg-faint rounded transition-colors",children:"Cancel"}),g.jsx("button",{onClick:v,disabled:!b,className:"px-2 py-0.5 text-[10px] text-fg border border-accent-muted hover:border-accent rounded transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:E})]})]})}function gqe({tabId:s,cwd:e,onClose:n}){const i=C2(m=>m.watchersForTab(s)),r=C2(m=>m.add),o=C2(m=>m.remove),a=R.useRef(null),[l,c]=R.useState(""),[d,u]=R.useState(""),[h,f]=R.useState(!1);R.useEffect(()=>{const m=_=>{_.key==="Escape"&&n()};return document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)},[n]),R.useEffect(()=>{const m=_=>{a.current&&!a.current.contains(_.target)&&n()};return document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[n]);const p=async()=>{const m=d.trim();if(!m||h)return;f(!0);const _=await r({tabId:s,label:l.trim(),command:m,cwd:e});f(!1),_&&(c(""),u(""))};return g.jsxs("div",{ref:a,className:"absolute right-2 top-full mt-1 z-30 w-[420px] max-w-[calc(100vw-1rem)] bg-bg-elev border border-line rounded shadow-lg p-3 text-xs",role:"dialog","aria-label":"Watchers","data-testid":"watchers-popover",children:[g.jsxs("div",{className:"flex items-center mb-2",children:[g.jsx("span",{className:"text-fg-dim uppercase tracking-wider",children:"Watchers"}),g.jsxs("span",{className:"text-fg-faint ml-2",children:[i.length," active"]}),g.jsx("div",{className:"flex-1"}),g.jsx("button",{onClick:n,className:"text-fg-faint hover:text-fg",title:"Close",children:"×"})]}),g.jsxs("div",{className:"flex flex-col gap-1.5 mb-3",children:[g.jsx("input",{value:l,onChange:m=>c(m.target.value),placeholder:"label (optional)",className:"bg-bg border border-line rounded px-2 py-1 text-fg placeholder:text-fg-faint focus:outline-none focus:border-fg-faint"}),g.jsxs("div",{className:"flex gap-1.5",children:[g.jsx("input",{value:d,onChange:m=>u(m.target.value),onKeyDown:m=>{m.key==="Enter"&&p()},placeholder:"shell command — e.g. npm test --watch",className:"flex-1 bg-bg border border-line rounded px-2 py-1 text-fg placeholder:text-fg-faint focus:outline-none focus:border-fg-faint font-mono","data-testid":"watcher-command-input"}),g.jsx("button",{onClick:p,disabled:!d.trim()||h,className:"px-2 py-1 border border-line rounded text-fg-dim hover:text-fg hover:border-fg-faint disabled:opacity-40 disabled:cursor-not-allowed","data-testid":"watcher-add",children:"Add"})]}),g.jsxs("span",{className:"text-fg-faint",children:["cwd: ",g.jsx("span",{className:"font-mono",children:e})]})]}),i.length===0?g.jsx("div",{className:"text-fg-faint italic py-2",children:"no watchers — add one above"}):g.jsx("ul",{className:"flex flex-col gap-2 max-h-64 overflow-y-auto",children:i.map(m=>{const _=m.lines[m.lines.length-1];return g.jsxs("li",{className:"border border-line rounded p-2 bg-bg",children:[g.jsxs("div",{className:"flex items-center gap-2",children:[g.jsx("span",{className:"font-medium text-fg truncate",children:m.label}),g.jsxs("span",{className:"text-fg-faint",children:[m.lineCount," line",m.lineCount===1?"":"s"]}),g.jsx("div",{className:"flex-1"}),g.jsx("button",{onClick:()=>o(m.watcherId),className:"text-fg-faint hover:text-red-400",title:"Stop watcher","data-testid":`watcher-remove-${m.watcherId}`,children:"stop"})]}),g.jsx("div",{className:"text-fg-faint font-mono text-[10px] truncate mt-0.5",title:m.command,children:m.command}),g.jsx("div",{className:"text-fg-dim font-mono text-[10px] truncate mt-1",title:(_==null?void 0:_.line)??"",children:_?_.line:g.jsx("span",{className:"italic text-fg-faint",children:"waiting for output…"})})]},m.watcherId)})})]})}/**
|
|
76
76
|
* dockview-core
|
|
77
77
|
* @version 6.6.1
|
|
78
78
|
* @link https://github.com/mathuo/dockview
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-code-session-manager",
|
|
3
|
-
"version": "0.125.
|
|
3
|
+
"version": "0.125.1",
|
|
4
4
|
"description": "Local cockpit for the Claude Code CLI — multi-tab terminal, full config surface, scheduler, voice dictation, and live observability.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/main/index.cjs",
|
|
@@ -63,6 +63,8 @@
|
|
|
63
63
|
"manual:build": "node web/manual/build.mjs",
|
|
64
64
|
"manual:figures": "xvfb-run -a node web/manual/capture-figures.mjs",
|
|
65
65
|
"lint:selectors": "node scripts/check-unstable-selectors.cjs",
|
|
66
|
+
"hooks:install": "bash scripts/install-git-hooks.sh",
|
|
67
|
+
"identity:scan": "bash scripts/identity-guard.sh tree",
|
|
66
68
|
"lint:hooks": "node scripts/check-conditional-hooks.cjs",
|
|
67
69
|
"lint:docs": "node scripts/check-doc-hierarchy.cjs",
|
|
68
70
|
"lint:paths": "node scripts/check-ops-path-literals.cjs",
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "session-manager-dev",
|
|
3
3
|
"description": "The default end-to-end development skillset for the Claude Code Session Manager: decompose work into scheduler PRDs and track them to a validated finish (/develop), publish releases to npm (/builder), and hand a finding to another project on this machine (/send-feedback). Together with the session-manager scheduler these form a develop → queue → validate → release loop.",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.2",
|
|
5
5
|
"author": {
|
|
6
|
-
"name": "
|
|
7
|
-
"
|
|
6
|
+
"name": "Bilko Bibitkov",
|
|
7
|
+
"email": "BilkoBibitkov2000@gmail.com",
|
|
8
|
+
"url": "https://bilko.run"
|
|
8
9
|
},
|
|
9
10
|
"homepage": "https://github.com/StanislavBG/claude-code-session-manager",
|
|
10
11
|
"keywords": [
|
|
@@ -222,7 +222,8 @@ End every plan with exactly one validate PRD:
|
|
|
222
222
|
(under `$SM_PROJECT_ROOT/session-manager-operations/scheduler/epics/<epic-id>/`; find it by
|
|
223
223
|
slug under prds/ or prds-archived/, possibly a timestamped subfolder. Why: `session-manager-operations/scheduler/` is gitignored, so it is never in
|
|
224
224
|
the validator's job worktree. The last: write and commit
|
|
225
|
-
`session-manager-operations/reviews/validation/<epic-id>/<validate-slug>.md
|
|
225
|
+
`session-manager-operations/reviews/validation/<epic-id>/<validate-slug>.md`, relative to the repository root
|
|
226
|
+
(`git rev-parse --show-toplevel`), not to any subdirectory you `cd`'d into to run a gate.
|
|
226
227
|
5. Notes: "Work as the validator persona — the procedure is your system prompt." and a line
|
|
227
228
|
`Base: <sha>`, the SHA from step 11.
|
|
228
229
|
6. `gate: ["none"]`; `files`: the record path. Why: the validator re-runs each PRD's gate
|
package/scripts/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# scripts/
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Six invocation mechanisms live here: npm scripts, a systemd timer, `.claude/settings.json` hooks, git hooks, plugin skills, and manual one-shots. This is the index.
|
|
4
4
|
|
|
5
5
|
scripts/lib was moved into src/main/lib (2026-09); nothing under src/ may require from scripts/.
|
|
6
6
|
|
|
@@ -9,6 +9,8 @@ scripts/lib was moved into src/main/lib (2026-09); nothing under src/ may requir
|
|
|
9
9
|
| script | invoked by | shipped on npm |
|
|
10
10
|
| --- | --- | --- |
|
|
11
11
|
| audit-ops-hygiene.cjs | manual | yes |
|
|
12
|
+
| identity-guard.sh | `npm run identity:scan` (CI `ci` job) and the git hooks from install-git-hooks.sh; rule in `session-manager-operations/architecture/identity-boundary.md` | no |
|
|
13
|
+
| install-git-hooks.sh | `npm run hooks:install`, manual, once per clone and after any guard change | no |
|
|
12
14
|
| bench/main-bench.cjs | `npm run bench` (main-process micro-benches, plain Node); renderer half is `npm run bench:renderer` (`tests/bench/`, `vitest.bench.config.ts`, not in `test:unit`) | no |
|
|
13
15
|
| page-surface.cjs | manual and by the page steward personas `.claude/agents/page-*.md`; derives a page's owned/shared files, window.api methods, main handlers and tests | no |
|
|
14
16
|
| check-page-stewards.cjs | `npm run lint:page-stewards` (in `lint`) — every nav page has a valid `.claude/agents/page-<key>.md` steward persona; ratchets PENDING | no |
|
package/src/main/build-info.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.125.
|
|
3
|
-
"gitSha": "
|
|
4
|
-
"gitShortSha": "
|
|
2
|
+
"version": "0.125.1",
|
|
3
|
+
"gitSha": "043d76f7e5838adb777089e411f4b729c2645357",
|
|
4
|
+
"gitShortSha": "043d76f7",
|
|
5
5
|
"gitBranch": "HEAD",
|
|
6
|
-
"builtAt": "2026-10-
|
|
6
|
+
"builtAt": "2026-10-31T03:51:27.358Z",
|
|
7
7
|
"dirty": false
|
|
8
8
|
}
|
|
@@ -41,7 +41,7 @@ function buildSweepValidatorInput({ epicId, cwd, uncovered, baseSha, now }) {
|
|
|
41
41
|
const acceptanceCriteria = names.map(
|
|
42
42
|
(name) => `${name} verified against its PRD file (find it by slug under $SM_PROJECT_ROOT/session-manager-operations/scheduler/epics/${epicId}/prds/ or prds-archived/, possibly in a timestamped subfolder)`,
|
|
43
43
|
);
|
|
44
|
-
acceptanceCriteria.push(`Record written and committed at ${recordPath}`);
|
|
44
|
+
acceptanceCriteria.push(`Record written and committed at ${recordPath}, relative to the repository root (git rev-parse --show-toplevel), never relative to a subdirectory you cd'd into`);
|
|
45
45
|
|
|
46
46
|
const base = baseSha
|
|
47
47
|
? `Base: ${baseSha}`
|
|
@@ -56,7 +56,7 @@ function buildSettledDigest(settle, { epicId, notValidatedReason } = {}) {
|
|
|
56
56
|
const notValidated = (s.uncovered || []).map((u) => (typeof u === 'string' ? u : u.slug));
|
|
57
57
|
const lines = [
|
|
58
58
|
`PLAN SETTLED — no PRD of this session is pending or running. This is ONE digest, not a per-PRD request.`,
|
|
59
|
-
`Validation record folder: session-manager-operations/reviews/validation/${epicId}/`,
|
|
59
|
+
`Validation record folder (relative to the repository root): session-manager-operations/reviews/validation/${epicId}/`,
|
|
60
60
|
'Do NOT re-verify VERIFIED PRDs — a validator already checked them.',
|
|
61
61
|
];
|
|
62
62
|
if (verified.length) {
|
|
@@ -349,7 +349,10 @@ const MCP_TOOL_CATALOG = [
|
|
|
349
349
|
+ 'Turning an item into an Epic is done by the human via Open as Epic in the {F} feedback panel — there is no tool '
|
|
350
350
|
+ 'for it. A finding that belongs to another local project uses feedback_open_session instead.',
|
|
351
351
|
exampleArgs: { pull: true, includeHidden: false },
|
|
352
|
-
notes: 'Returns { ok, items, pulled? }. Not-configured machines get { ok:false, error } as an error result.'
|
|
352
|
+
notes: 'Returns { ok, items, pulled? }. Not-configured machines get { ok:false, error } as an error result. '
|
|
353
|
+
+ 'A customer machine stays not-configured by design. Owner setup is one-time per machine: the host token goes in '
|
|
354
|
+
+ '~/.claude/session-manager/customer-feedback-owner.json; it cannot be minted locally. Steps: '
|
|
355
|
+
+ 'session-manager-operations/architecture/customer-feedback.md, Owner setup.',
|
|
353
356
|
},
|
|
354
357
|
{
|
|
355
358
|
name: 'customer_feedback_set_status',
|
package/src/main/webRemote.cjs
CHANGED
|
@@ -844,6 +844,12 @@ async function handleMessage(raw, device) {
|
|
|
844
844
|
const live = ((await loadConfig()).devices || []).find((d) => d.deviceId === device.deviceId) || device;
|
|
845
845
|
if (isPinnedPeerKey(live, browserPubKey)) {
|
|
846
846
|
client.e2e = makeState('authenticated', sessionKey, null);
|
|
847
|
+
// ORDER IS A CONTRACT: the boxed event:remote:ready (sent inside
|
|
848
|
+
// finalizeE2eAuthenticated) deliberately goes out BEFORE the plaintext e2e:ready
|
|
849
|
+
// below. web/remote-app/src/ws.ts holds boxes that arrive before e2e:ready and
|
|
850
|
+
// decides on sas:pending only after draining them, so the early remote:ready
|
|
851
|
+
// skips the SAS prompt. Reordering brings back a flash of "confirm the 6-digit
|
|
852
|
+
// code". Pinned by src/main/__tests__/web-remote-pinned-ready-order.test.cjs.
|
|
847
853
|
finalizeE2eAuthenticated('E2E session auto-authenticated — pinned browser key matched', client);
|
|
848
854
|
respond(id, undefined, 'e2e:ready', client);
|
|
849
855
|
return;
|