@ciandt-flow/cli 2.10.0-beta.37 → 2.10.0-beta.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +146 -148
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
- import*as kt from'crypto';import {randomUUID,createHash}from'crypto';import*as Ce from'os';import Ce__default,{tmpdir,homedir}from'os';import*as de from'path';import de__default,{join,dirname,basename,normalize,resolve,sep,relative,isAbsolute}from'path';import*as se from'fs';import se__default,{readFileSync,mkdirSync,existsSync,writeFileSync,rmSync,appendFileSync,readdirSync,realpathSync,lstatSync,renameSync}from'fs';import {execFile,spawnSync,exec,spawn}from'child_process';import {promisify}from'util';import R from'chalk';import*as Nd from'readline';import {createInterface}from'readline';import zn from'conf';import _u,{HTTPError}from'ky';import {StatusCodes}from'http-status-codes';import {execa}from'execa';import {Box,Text,render,useWindowSize,useInput,useApp}from'ink';import wv,{useRef,useCallback,useMemo,useEffect,useState}from'react';import {create}from'zustand';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import Fb from'jsonwebtoken';import Vb from'proper-lockfile';import hv from'ink-big-text';import Wp from'ink-spinner';import*as Ua from'fs/promises';import {readFile,mkdir,writeFile,rename,stat,rm as rm$1,mkdtemp,readdir,cp}from'fs/promises';import Dy from'unzipper';import {simpleGit,CheckRepoActions}from'simple-git';import Xd from'semver';import wc from'yocto-spinner';import {Command,Option}from'commander';import {parse,stringify}from'yaml';var Ah=Object.defineProperty;var H=(e,a,o)=>()=>{if(o)throw o[0];try{return e&&(a=e(e=0)),a}catch(t){throw o=[t],t}};var Yc=(e,a)=>{for(var o in a)Ah(e,o,{get:a[o],enumerable:true});};var fo,pe,hn,dr,ft,ho,bn,Zc,vn,Xa,me,ea,Ka,ni,ht,bt,vt,yt,U=H(()=>{"use strict";fo="FLOW",pe="flow-skills",hn="flow-cli",dr="internal",ft="external",ho={skill:{label:"Skill",color:"cyan"},mcp:{label:"MCP",color:"yellow"},bundle:{label:"Bundle",color:"green"},agent:{label:"Agent",color:"green"},hook:{label:"Hook",color:"blue"},rule:{label:"Rule",color:"blue"},plugin:{label:"Plugin",color:"magenta"}},bn=new Set(Object.keys(ho)),Zc={internal:{label:"Flow",color:"blue"},external:{label:"External",color:"white"}},vn=new Set(["internal","external"]),Xa={user:{label:"Global",pathHint:"~/.claude/",actionLabel:"Global (~/.claude)",description:"available in all projects on this machine"},project:{label:"Project",pathHint:".claude/ (shared)",actionLabel:"Project (.claude/)",description:"shared with the team via version control"},local:{label:"Local",pathHint:".claude/ (local only)",actionLabel:"Local (.claude/)",description:"only on your machine, not committed"}},me="flow-claude-md-setup",ea=5,Ka=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,ni="https://flow.ciandt.com",ht=/^https:\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.ciandt\.com\/?$/,bt="Must be a valid CI&T domain (e.g. https://tenant.ciandt.com)",vt=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,yt="Must be a valid email address (e.g. name@example.com)";});var di,Eh,el,cr,yn=H(()=>{"use strict";di="aes-256-gcm",Eh=16,el=16,cr=class{key;constructor(a){if(a.length!==32)throw new Error(`Invalid key length: expected 32 bytes, got ${a.length}`);this.key=a;}encrypt(a){let o=kt.randomBytes(Eh),t=kt.createCipheriv(di,this.key,o,{authTagLength:el}),r=Buffer.concat([t.update(a,"utf8"),t.final()]),i=t.getAuthTag();return {iv:o.toString("hex"),authTag:i.toString("hex"),ciphertext:r.toString("hex"),algorithm:di}}decrypt(a){if(a.algorithm!==di)throw new Error(`Unsupported encryption algorithm: ${a.algorithm}`);let o=kt.createDecipheriv(di,this.key,Buffer.from(a.iv,"hex"),{authTagLength:el});return o.setAuthTag(Buffer.from(a.authTag,"hex")),Buffer.concat([o.update(Buffer.from(a.ciphertext,"hex")),o.final()]).toString("utf8")}};});function kn(e){return e.replace(qh,"").replace(Lh,"").replace(Fh,"").replace(Ih,"Bearer ***").replace(Th,"***").replace(Mh,"***").replace(/\r\n|\r|\n/g,"\\n")}var Ih,Th,Mh,qh,Lh,Fh,Pn=H(()=>{"use strict";Ih=/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,Th=/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_-]*)?/g,Mh=/[A-Za-z0-9+/]{40,}={0,2}/g,qh=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|\x1b\x1b)/g,Lh=/\x1b(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,Fh=/\x1b/g;});function li(e){return e||pe}function al(e,a,o){return wn(li(o),e,a)}function Dn(e,a){return de.join(Ce.homedir(),ba,"plugins","marketplaces",li(a),"plugins","native",e)}function ui(e){return de.join(Ce.homedir(),ba,"plugins","marketplaces",li(e),".claude-plugin","marketplace.json")}function Jo(){return de.join(Ce.homedir(),ba,"plugins","known_marketplaces.json")}function ol(e){return de.join(Ce.homedir(),ba,"plugins","marketplaces",li(e))}function tl(){return de.join(Ce.homedir(),ci,"cache","install.lock")}function rl(){return de.join(Ce.homedir(),ci,"logs","flowsetup.log")}function wn(e,a,o){return de.join(Ce.homedir(),ba,"plugins","cache",e,a,o)}function Ho(e){let a=e==="global"?Ce.homedir():process.cwd();return de.join(a,".claude","skills")}function lr(e){let a=e==="global"?Ce.homedir():process.cwd();return de.join(a,".claude","skills-lock.json")}function pi(e="user"){return e==="project"?de.join(process.cwd(),".opencode","plugins"):de.join(Ce.homedir(),".config","opencode","plugins")}function il(){return de.join(Ce.homedir(),ci,"flow-catalogs.json")}function sl(){let e=process.env.FLOW_HOME??de.join(Ce.homedir(),ci);return de.join(e,"config.json")}function mi(e="user"){return e==="project"||e==="local"?de.join(process.cwd(),ba,"agents"):de.join(Ce.homedir(),ba,"agents")}function Pt(e="user"){return e==="project"||e==="local"?de.join(process.cwd(),ba,"rules"):de.join(Ce.homedir(),ba,"rules")}function Sn(e="user"){return e==="project"||e==="local"?de.join(process.cwd(),ba,"hooks"):de.join(Ce.homedir(),ba,"hooks")}var ba,ci,Oe=H(()=>{"use strict";U();ba=".claude",ci=".flow";});var Oh,Nh,gi,nl=H(()=>{"use strict";Oe();Oh=5*1024*1024,Nh=3,gi=class{filePath;constructor(){this.filePath=rl(),this.ensureDir(),this.rotateIfNeeded();}write(a){let o=`[${a.timestamp.toISOString()}] [${a.level.toUpperCase()}] [${a.module}] ${a.message}
3
- `;try{se.appendFileSync(this.filePath,o,"utf-8");}catch{}}ensureDir(){try{let a=de.dirname(this.filePath);se.mkdirSync(a,{recursive:!0});}catch{}}rotateIfNeeded(){try{if(se.statSync(this.filePath).size>Oh){let o=new Date().toISOString().replace(/[:.]/g,"-"),t=this.filePath.replace(".log",`-${o}.log`);se.renameSync(this.filePath,t),this.cleanOldBackups();}}catch{}}cleanOldBackups(){try{let a=de.dirname(this.filePath),o=de.basename(this.filePath,".log"),t=se.readdirSync(a).filter(r=>r.startsWith(o+"-")&&r.endsWith(".log")).sort().reverse();for(let r of t.slice(Nh))se.unlinkSync(de.join(a,r));}catch{}}};});var fi,dl=H(()=>{"use strict";fi=class{context;constructor(a){this.context=a;}write(a){let o=this.context==="tui"?this.formatTui(a):this.formatCli(a);process.stderr.write(o+`
4
- `);}formatTui(a){return `[flow:${a.module}] ${a.message}`}formatCli(a){let o=String(a.timestamp.getHours()).padStart(2,"0"),t=String(a.timestamp.getMinutes()).padStart(2,"0"),r=String(a.timestamp.getSeconds()).padStart(2,"0");return `[${o}:${t}:${r}] [${a.level.toUpperCase()}] ${a.message}`}};});var hi,cl=H(()=>{"use strict";hi=class{write(a){process.stdout.write(a.message+`
5
- `);}};});function Rn(){return bi}function ll(e){return Cn.add(e),()=>{Cn.delete(e);}}var bi,Cn,vi,An=H(()=>{"use strict";bi=[],Cn=new Set;vi=class{write(a){bi.push(a),bi.length>100&&bi.shift();for(let o of Cn)o();}};});function Gh(){let e=process.env.DEBUG;if(!e)return null;let a=e.split(",").map(t=>t.trim()).filter(Boolean);for(let t of a)if(t==="flow:*")return "all";let o=new Set;for(let t of a)t.startsWith("flow:")&&o.add(t.slice(5));return o.size>0?o:null}function Qe(e,a){if(e==="tui"){let o=Gh();Vo={context:e,transports:[new vi,new gi],minLevel:o?"debug":"warn",debugModules:o};}else a?.silent?Vo={context:e,transports:[],minLevel:"error",debugModules:null}:a?.verbose?Vo={context:e,transports:[new fi("cli")],minLevel:"debug",debugModules:null}:Vo={context:e,transports:[new hi],minLevel:"info",debugModules:null};}function ul(){return Vo.transports}function pl(e,a){let{debugModules:o,minLevel:t}=Vo;return Vo.context==="tui"&&o&&o!=="all"?o.has(a)?Dt[e]>=Dt.debug:Dt[e]>=Dt.warn:Dt[e]>=Dt[t]}var Dt,Vo,xn=H(()=>{"use strict";nl();dl();cl();An();Dt={debug:0,info:1,warn:2,error:3},Vo={context:"cli",transports:[],minLevel:"warn",debugModules:null};});function yi(e,a,o){if(!pl(e,a))return;let t={level:e,module:a,message:kn(o),timestamp:new Date};for(let r of ul())r.write(t);}function P(e){let a=ml.get(e);if(a)return a;let o={debug:t=>yi("debug",e,t),info:t=>yi("info",e,t),warn:t=>yi("warn",e,t),error:t=>yi("error",e,t)};return ml.set(e,o),o}var ml,gl=H(()=>{"use strict";Pn();xn();ml=new Map;});var I=H(()=>{"use strict";gl();xn();Pn();});function Bh(e){return typeof e=="object"&&e!==null&&In in e&&e[In]===true}function Tn(e){return {serialize(a){let o=JSON.stringify(a),t=e.encrypt(o),r={[In]:true,envelope:t};return JSON.stringify(r,null," ")},deserialize(a){let o;try{o=JSON.parse(a);}catch{return En.warn("[encryption] Config file contains unparseable data, treating as empty"),{}}if(Bh(o))try{let t=e.decrypt(o.envelope);return JSON.parse(t)}catch(t){return En.error(`[encryption] Decryption failed: ${t instanceof Error?t.message:"unknown error"}. Config will be treated as empty. Re-authentication may be required.`),{}}return En.info("[encryption] Detected plaintext config \u2014 will encrypt on next write"),o}}}var En,In,Mn=H(()=>{"use strict";I();En=P("encryption"),In="__encrypted__";});var qn,zh,va,wt,Ln=H(()=>{"use strict";I();qn=promisify(execFile),zh=promisify(exec),va=P("encryption:macos-keyvault"),wt=class{static async isAvailable(){try{let{stdout:a}=await zh("command -v security");return va.debug(`security binary found at: ${a.trim()}`),!0}catch{return va.debug("security binary not found in PATH"),!1}}async getSecret(a,o){try{va.debug(`Looking up secret: service=${a}, account=${o}`);let{stdout:t}=await qn("security",["find-generic-password","-w","-a",o,"-s",a]),r=t.trim();return va.debug(`security find-generic-password result: ${r?"found":"empty"}`),r||null}catch(t){let r=t;return va.debug(`security find-generic-password failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),null}}async setSecret(a,o,t){try{va.debug(`Storing secret: service=${a}, account=${o}`),await qn("security",["add-generic-password","-U","-a",o,"-s",a,"-w",t]),va.debug("security add-generic-password succeeded");}catch(r){let i=r;throw va.error(`security add-generic-password failed: code=${i.code}, stderr=${i.stderr?.trim()}, message=${i.message}`),r}}async deleteSecret(a,o){try{return va.debug(`Deleting secret: service=${a}, account=${o}`),await qn("security",["delete-generic-password","-a",o,"-s",a]),va.debug("security delete-generic-password succeeded"),!0}catch(t){let r=t;return va.debug(`security delete-generic-password failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),!1}}getStoragePath(){return "macOS Keychain (security)"}};});function b(e){return e==null?"":e.replace(/\x1b\[[0-9;:<=>?]*[ -/]*[@-~]/g,"").replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,"").replace(/\x1b./g,"").replace(/[\x00-\x08\x0b\x0c\x0d\x0e-\x1f\x7f]/g,"")}function K(e){process.stdout.write(R.green(` \u2713 ${b(e)}
6
- `));}function S(e){process.stderr.write(R.red(` \u2717 ${b(e)}
7
- `));}function D(e){process.stdout.write(R.cyan(` \u2139 ${b(e)}
8
- `));}function St(e,a){let o=a.map(n=>n.map(b)),t=[e,...o],r=e.map((n,d)=>Math.max(...t.map(l=>(l[d]??"").length))),i=r.map(n=>"\u2500".repeat(n)).join(" "),s=n=>n.map((d,l)=>d.padEnd(r[l])).join(" ");process.stdout.write(`
2
+ import*as kt from'crypto';import {randomUUID,createHash}from'crypto';import*as Ce from'os';import Ce__default,{tmpdir,homedir}from'os';import*as ne from'path';import ne__default,{join,dirname,basename,normalize,resolve,sep,relative,isAbsolute}from'path';import*as ie from'fs';import ie__default,{readFileSync,mkdirSync,existsSync,writeFileSync,rmSync,appendFileSync,readdirSync,realpathSync,lstatSync,renameSync}from'fs';import {execFile,spawnSync,exec,spawn}from'child_process';import {promisify}from'util';import R from'chalk';import*as qd from'readline';import {createInterface}from'readline';import Gn from'conf';import Qu,{HTTPError}from'ky';import {StatusCodes}from'http-status-codes';import {execa}from'execa';import {Box,Text,render,useWindowSize,useInput,useApp}from'ink';import vv,{useRef,useCallback,useMemo,useEffect,useState}from'react';import {create}from'zustand';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import Ib from'jsonwebtoken';import zb from'proper-lockfile';import uv from'ink-big-text';import Wp from'ink-spinner';import*as za from'fs/promises';import {readFile,mkdir,writeFile,rename,stat,rm as rm$1,mkdtemp,readdir,cp}from'fs/promises';import ky from'unzipper';import {simpleGit,CheckRepoActions}from'simple-git';import Hd from'semver';import yc from'yocto-spinner';import {Command,Option}from'commander';import {parse,stringify}from'yaml';var Dh=Object.defineProperty;var H=(e,a,o)=>()=>{if(o)throw o[0];try{return e&&(a=e(e=0)),a}catch(t){throw o=[t],t}};var Xc=(e,a)=>{for(var o in a)Dh(e,o,{get:a[o],enumerable:true});};var fo,ue,pn,dr,ft,ho,mn,Kc,gn,Ka,pe,ea,$a,ni,ht,bt,vt,yt,U=H(()=>{"use strict";fo="FLOW",ue="flow-skills",pn="flow-cli",dr="internal",ft="external",ho={skill:{label:"Skill",color:"cyan"},mcp:{label:"MCP",color:"yellow"},bundle:{label:"Bundle",color:"green"},agent:{label:"Agent",color:"green"},hook:{label:"Hook",color:"blue"},rule:{label:"Rule",color:"blue"},plugin:{label:"Plugin",color:"magenta"}},mn=new Set(Object.keys(ho)),Kc={internal:{label:"Flow",color:"blue"},external:{label:"External",color:"white"}},gn=new Set(["internal","external"]),Ka={user:{label:"Global",pathHint:"~/.claude/",actionLabel:"Global (~/.claude)",description:"available in all projects on this machine"},project:{label:"Project",pathHint:".claude/ (shared)",actionLabel:"Project (.claude/)",description:"shared with the team via version control"},local:{label:"Local",pathHint:".claude/ (local only)",actionLabel:"Local (.claude/)",description:"only on your machine, not committed"}},pe="flow-claude-md-setup",ea=5,$a=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,ni="https://flow.ciandt.com",ht=/^https:\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.ciandt\.com\/?$/,bt="Must be a valid CI&T domain (e.g. https://tenant.ciandt.com)",vt=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,yt="Must be a valid email address (e.g. name@example.com)";});var di,Sh,$c,cr,fn=H(()=>{"use strict";di="aes-256-gcm",Sh=16,$c=16,cr=class{key;constructor(a){if(a.length!==32)throw new Error(`Invalid key length: expected 32 bytes, got ${a.length}`);this.key=a;}encrypt(a){let o=kt.randomBytes(Sh),t=kt.createCipheriv(di,this.key,o,{authTagLength:$c}),r=Buffer.concat([t.update(a,"utf8"),t.final()]),i=t.getAuthTag();return {iv:o.toString("hex"),authTag:i.toString("hex"),ciphertext:r.toString("hex"),algorithm:di}}decrypt(a){if(a.algorithm!==di)throw new Error(`Unsupported encryption algorithm: ${a.algorithm}`);let o=kt.createDecipheriv(di,this.key,Buffer.from(a.iv,"hex"),{authTagLength:$c});return o.setAuthTag(Buffer.from(a.authTag,"hex")),Buffer.concat([o.update(Buffer.from(a.ciphertext,"hex")),o.final()]).toString("utf8")}};});function hn(e){return e.replace(xh,"").replace(Eh,"").replace(Ih,"").replace(Ch,"Bearer ***").replace(Rh,"***").replace(Ah,"***").replace(/\r\n|\r|\n/g,"\\n")}var Ch,Rh,Ah,xh,Eh,Ih,bn=H(()=>{"use strict";Ch=/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,Rh=/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_-]*)?/g,Ah=/[A-Za-z0-9+/]{40,}={0,2}/g,xh=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|\x1b\x1b)/g,Eh=/\x1b(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,Ih=/\x1b/g;});function li(e){return e||ue}function Yc(e,a,o){return yn(li(o),e,a)}function vn(e,a){return ne.join(Ce.homedir(),ha,"plugins","marketplaces",li(a),"plugins","native",e)}function ui(e){return ne.join(Ce.homedir(),ha,"plugins","marketplaces",li(e),".claude-plugin","marketplace.json")}function Jo(){return ne.join(Ce.homedir(),ha,"plugins","known_marketplaces.json")}function Zc(e){return ne.join(Ce.homedir(),ha,"plugins","marketplaces",li(e))}function el(){return ne.join(Ce.homedir(),ci,"cache","install.lock")}function al(){return ne.join(Ce.homedir(),ci,"logs","flowsetup.log")}function yn(e,a,o){return ne.join(Ce.homedir(),ha,"plugins","cache",e,a,o)}function Ho(e){let a=e==="global"?Ce.homedir():process.cwd();return ne.join(a,".claude","skills")}function lr(e){let a=e==="global"?Ce.homedir():process.cwd();return ne.join(a,".claude","skills-lock.json")}function pi(e="user"){return e==="project"?ne.join(process.cwd(),".opencode","plugins"):ne.join(Ce.homedir(),".config","opencode","plugins")}function ol(){return ne.join(Ce.homedir(),ci,"flow-catalogs.json")}function tl(){let e=process.env.FLOW_HOME??ne.join(Ce.homedir(),ci);return ne.join(e,"config.json")}function mi(e="user"){return e==="project"||e==="local"?ne.join(process.cwd(),ha,"agents"):ne.join(Ce.homedir(),ha,"agents")}function Pt(e="user"){return e==="project"||e==="local"?ne.join(process.cwd(),ha,"rules"):ne.join(Ce.homedir(),ha,"rules")}function kn(e="user"){return e==="project"||e==="local"?ne.join(process.cwd(),ha,"hooks"):ne.join(Ce.homedir(),ha,"hooks")}var ha,ci,Oe=H(()=>{"use strict";U();ha=".claude",ci=".flow";});var Th,Mh,gi,rl=H(()=>{"use strict";Oe();Th=5*1024*1024,Mh=3,gi=class{filePath;constructor(){this.filePath=al(),this.ensureDir(),this.rotateIfNeeded();}write(a){let o=`[${a.timestamp.toISOString()}] [${a.level.toUpperCase()}] [${a.module}] ${a.message}
3
+ `;try{ie.appendFileSync(this.filePath,o,"utf-8");}catch{}}ensureDir(){try{let a=ne.dirname(this.filePath);ie.mkdirSync(a,{recursive:!0});}catch{}}rotateIfNeeded(){try{if(ie.statSync(this.filePath).size>Th){let o=new Date().toISOString().replace(/[:.]/g,"-"),t=this.filePath.replace(".log",`-${o}.log`);ie.renameSync(this.filePath,t),this.cleanOldBackups();}}catch{}}cleanOldBackups(){try{let a=ne.dirname(this.filePath),o=ne.basename(this.filePath,".log"),t=ie.readdirSync(a).filter(r=>r.startsWith(o+"-")&&r.endsWith(".log")).sort().reverse();for(let r of t.slice(Mh))ie.unlinkSync(ne.join(a,r));}catch{}}};});var fi,il=H(()=>{"use strict";fi=class{context;constructor(a){this.context=a;}write(a){let o=this.context==="tui"?this.formatTui(a):this.formatCli(a);process.stderr.write(o+`
4
+ `);}formatTui(a){return `[flow:${a.module}] ${a.message}`}formatCli(a){let o=String(a.timestamp.getHours()).padStart(2,"0"),t=String(a.timestamp.getMinutes()).padStart(2,"0"),r=String(a.timestamp.getSeconds()).padStart(2,"0");return `[${o}:${t}:${r}] [${a.level.toUpperCase()}] ${a.message}`}};});var hi,sl=H(()=>{"use strict";hi=class{write(a){process.stdout.write(a.message+`
5
+ `);}};});function Dn(){return bi}function nl(e){return Pn.add(e),()=>{Pn.delete(e);}}var bi,Pn,vi,wn=H(()=>{"use strict";bi=[],Pn=new Set;vi=class{write(a){bi.push(a),bi.length>100&&bi.shift();for(let o of Pn)o();}};});function qh(){let e=process.env.DEBUG;if(!e)return null;let a=e.split(",").map(t=>t.trim()).filter(Boolean);for(let t of a)if(t==="flow:*")return "all";let o=new Set;for(let t of a)t.startsWith("flow:")&&o.add(t.slice(5));return o.size>0?o:null}function Ve(e,a){if(e==="tui"){let o=qh();Qo={context:e,transports:[new vi,new gi],minLevel:o?"debug":"warn",debugModules:o};}else a?.silent?Qo={context:e,transports:[],minLevel:"error",debugModules:null}:a?.verbose?Qo={context:e,transports:[new fi("cli")],minLevel:"debug",debugModules:null}:Qo={context:e,transports:[new hi],minLevel:"info",debugModules:null};}function dl(){return Qo.transports}function cl(e,a){let{debugModules:o,minLevel:t}=Qo;return Qo.context==="tui"&&o&&o!=="all"?o.has(a)?Dt[e]>=Dt.debug:Dt[e]>=Dt.warn:Dt[e]>=Dt[t]}var Dt,Qo,Sn=H(()=>{"use strict";rl();il();sl();wn();Dt={debug:0,info:1,warn:2,error:3},Qo={context:"cli",transports:[],minLevel:"warn",debugModules:null};});function yi(e,a,o){if(!cl(e,a))return;let t={level:e,module:a,message:hn(o),timestamp:new Date};for(let r of dl())r.write(t);}function k(e){let a=ll.get(e);if(a)return a;let o={debug:t=>yi("debug",e,t),info:t=>yi("info",e,t),warn:t=>yi("warn",e,t),error:t=>yi("error",e,t)};return ll.set(e,o),o}var ll,ul=H(()=>{"use strict";bn();Sn();ll=new Map;});var I=H(()=>{"use strict";ul();Sn();bn();});function Lh(e){return typeof e=="object"&&e!==null&&Rn in e&&e[Rn]===true}function An(e){return {serialize(a){let o=JSON.stringify(a),t=e.encrypt(o),r={[Rn]:true,envelope:t};return JSON.stringify(r,null," ")},deserialize(a){let o;try{o=JSON.parse(a);}catch{return Cn.warn("[encryption] Config file contains unparseable data, treating as empty"),{}}if(Lh(o))try{let t=e.decrypt(o.envelope);return JSON.parse(t)}catch(t){return Cn.error(`[encryption] Decryption failed: ${t instanceof Error?t.message:"unknown error"}. Config will be treated as empty. Re-authentication may be required.`),{}}return Cn.info("[encryption] Detected plaintext config \u2014 will encrypt on next write"),o}}}var Cn,Rn,xn=H(()=>{"use strict";I();Cn=k("encryption"),Rn="__encrypted__";});var En,Nh,ba,wt,In=H(()=>{"use strict";I();En=promisify(execFile),Nh=promisify(exec),ba=k("encryption:macos-keyvault"),wt=class{static async isAvailable(){try{let{stdout:a}=await Nh("command -v security");return ba.debug(`security binary found at: ${a.trim()}`),!0}catch{return ba.debug("security binary not found in PATH"),!1}}async getSecret(a,o){try{ba.debug(`Looking up secret: service=${a}, account=${o}`);let{stdout:t}=await En("security",["find-generic-password","-w","-a",o,"-s",a]),r=t.trim();return ba.debug(`security find-generic-password result: ${r?"found":"empty"}`),r||null}catch(t){let r=t;return ba.debug(`security find-generic-password failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),null}}async setSecret(a,o,t){try{ba.debug(`Storing secret: service=${a}, account=${o}`),await En("security",["add-generic-password","-U","-a",o,"-s",a,"-w",t]),ba.debug("security add-generic-password succeeded");}catch(r){let i=r;throw ba.error(`security add-generic-password failed: code=${i.code}, stderr=${i.stderr?.trim()}, message=${i.message}`),r}}async deleteSecret(a,o){try{return ba.debug(`Deleting secret: service=${a}, account=${o}`),await En("security",["delete-generic-password","-a",o,"-s",a]),ba.debug("security delete-generic-password succeeded"),!0}catch(t){let r=t;return ba.debug(`security delete-generic-password failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),!1}}getStoragePath(){return "macOS Keychain (security)"}};});function v(e){return e==null?"":e.replace(/\x1b\[[0-9;:<=>?]*[ -/]*[@-~]/g,"").replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,"").replace(/\x1b./g,"").replace(/[\x00-\x08\x0b\x0c\x0d\x0e-\x1f\x7f]/g,"")}function K(e){process.stdout.write(R.green(` \u2713 ${v(e)}
6
+ `));}function S(e){process.stderr.write(R.red(` \u2717 ${v(e)}
7
+ `));}function P(e){process.stdout.write(R.cyan(` \u2139 ${v(e)}
8
+ `));}function St(e,a){let o=a.map(n=>n.map(v)),t=[e,...o],r=e.map((n,d)=>Math.max(...t.map(l=>(l[d]??"").length))),i=r.map(n=>"\u2500".repeat(n)).join(" "),s=n=>n.map((d,l)=>d.padEnd(r[l])).join(" ");process.stdout.write(`
9
9
  `),process.stdout.write(` ${R.bold(s(e))}
10
10
  `),process.stdout.write(` ${R.dim(i)}
11
11
  `);for(let n of o)process.stdout.write(` ${s(n)}
12
12
  `);process.stdout.write(`
13
13
  `);}function bo(e){process.stdout.write(JSON.stringify(e,null,2)+`
14
- `);}function ve(e){process.stdout.write(JSON.stringify(e)+`
14
+ `);}function be(e){process.stdout.write(JSON.stringify(e)+`
15
15
  `);}function Ne(e){process.stderr.write(JSON.stringify(e)+`
16
- `);}function $(e){return e instanceof Error?e.message:String(e)}function qa(e){let a=new Date(e);return isNaN(a.getTime())?"\u2014":new Intl.DateTimeFormat("en-US",{dateStyle:"short"}).format(a)}var j=H(()=>{"use strict";});async function Vh(e,a){let o=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],t=0,r=setInterval(()=>{process.stderr.write(`\r${o[t++%o.length]} ${e}`);},80);try{return await a()}finally{clearInterval(r),process.stderr.write("\r\x1B[2K");}}function _h(e){let a=Nd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(b(e),t=>{a.close(),o(t.trim().toLowerCase());});})}var Fn,On,Qh,te,vo,Nn=H(()=>{"use strict";I();j();Fn=promisify(execFile),On=promisify(exec),Qh=[{name:"apt",command:"sudo apt install -y libsecret-tools"},{name:"dnf",command:"sudo dnf install -y libsecret"},{name:"pacman",command:"sudo pacman -S --noconfirm libsecret"},{name:"apk",command:"sudo apk add libsecret-tools"},{name:"zypper",command:"sudo zypper install -y libsecret-tools"}],te=P("encryption:linux-keyvault");vo=class e{static async isAvailable(){try{let{stdout:a}=await On("command -v secret-tool");te.debug(`secret-tool found at: ${a.trim()}`);}catch{return te.debug("secret-tool binary not found in PATH"),!1}try{return await Fn("secret-tool",["lookup","service","__flow_connectivity_check__"]),te.debug("Secret Service D-Bus connectivity check passed"),!0}catch(a){let t=a.stderr?.trim()??"";return t.includes("org.freedesktop.secrets")?(te.debug(`Secret Service D-Bus not available: ${t}`),!1):(te.debug("secret-tool is available and D-Bus service is reachable"),!0)}}static async detectPackageManager(){for(let a of Qh)try{return await On(`command -v ${a.name}`),a}catch{}return null}static async ensureInstalled(){if(await e.isAvailable())return !0;te.info("Secure credential storage requires 'secret-tool' (libsecret). This tool allows us to store your encryption key in the OS keyring, so your credentials are protected even if someone copies the config file.");let a=await e.detectPackageManager();if(!a)return te.warn("Could not detect a supported package manager. Please install libsecret manually."),!1;let o=await _h(" ? Install secret-tool? This requires sudo. (y/N) ");if(o!=="y"&&o!=="yes")return !1;try{return te.info(`Running: ${a.command}`),await Vh("Installing secret-tool...",()=>On(a.command)),e.isAvailable()}catch{return te.warn("Installation failed. Falling back to derived key."),!1}}async getSecret(a,o){try{te.debug(`Looking up secret: service=${a}, account=${o}`);let{stdout:t}=await Fn("secret-tool",["lookup","service",a,"account",o]),r=t.trim();return te.debug(`secret-tool lookup result: ${r?"found":"empty"}`),r||null}catch(t){let r=t;return te.debug(`secret-tool lookup failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),null}}async setSecret(a,o,t){te.debug(`Storing secret: service=${a}, account=${o}`),te.debug(`Environment: DBUS_SESSION_BUS_ADDRESS=${process.env.DBUS_SESSION_BUS_ADDRESS??"NOT SET"}`),te.debug(`Environment: DISPLAY=${process.env.DISPLAY??"NOT SET"}, WAYLAND_DISPLAY=${process.env.WAYLAND_DISPLAY??"NOT SET"}`),te.debug(`Environment: WSL_DISTRO_NAME=${process.env.WSL_DISTRO_NAME??"NOT SET"}`),await new Promise((r,i)=>{let s=spawn("secret-tool",["store","--label",a,"service",a,"account",o]),n="";s.stderr.on("data",d=>{n+=d.toString();}),s.stdin.end(t,"utf8"),s.on("close",d=>{d===0?(te.debug("secret-tool store succeeded"),r()):(te.error(`secret-tool store failed: code=${d}, stderr=${n.trim()}`),i(new Error(`secret-tool exited with code ${d}${n?`: ${n.trim()}`:""}`)));}),s.on("error",d=>{te.error(`secret-tool store spawn error: ${d.message}`),i(d);});});}async deleteSecret(a,o){try{return te.debug(`Deleting secret: service=${a}, account=${o}`),await Fn("secret-tool",["clear","service",a,"account",o]),te.debug("secret-tool clear succeeded"),!0}catch(t){let r=t;return te.debug(`secret-tool clear failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),!1}}getStoragePath(){return "Linux Secret Service (secret-tool)"}};});function Bn(e,a){return `${e}:${a}`}function pr(e){return e.replace(/'/g,"''")}function ki(e){return ["-NoProfile","-NonInteractive","-Command",e]}function ab(e){return `Add-Type -TypeDefinition @'
17
- ${jn}
16
+ `);}function $(e){return e instanceof Error?e.message:String(e)}function qa(e){let a=new Date(e);return isNaN(a.getTime())?"\u2014":new Intl.DateTimeFormat("en-US",{dateStyle:"short"}).format(a)}var j=H(()=>{"use strict";});async function zh(e,a){let o=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],t=0,r=setInterval(()=>{process.stderr.write(`\r${o[t++%o.length]} ${e}`);},80);try{return await a()}finally{clearInterval(r),process.stderr.write("\r\x1B[2K");}}function Wh(e){let a=qd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(v(e),t=>{a.close(),o(t.trim().toLowerCase());});})}var Tn,Mn,Uh,te,vo,qn=H(()=>{"use strict";I();j();Tn=promisify(execFile),Mn=promisify(exec),Uh=[{name:"apt",command:"sudo apt install -y libsecret-tools"},{name:"dnf",command:"sudo dnf install -y libsecret"},{name:"pacman",command:"sudo pacman -S --noconfirm libsecret"},{name:"apk",command:"sudo apk add libsecret-tools"},{name:"zypper",command:"sudo zypper install -y libsecret-tools"}],te=k("encryption:linux-keyvault");vo=class e{static async isAvailable(){try{let{stdout:a}=await Mn("command -v secret-tool");te.debug(`secret-tool found at: ${a.trim()}`);}catch{return te.debug("secret-tool binary not found in PATH"),!1}try{return await Tn("secret-tool",["lookup","service","__flow_connectivity_check__"]),te.debug("Secret Service D-Bus connectivity check passed"),!0}catch(a){let t=a.stderr?.trim()??"";return t.includes("org.freedesktop.secrets")?(te.debug(`Secret Service D-Bus not available: ${t}`),!1):(te.debug("secret-tool is available and D-Bus service is reachable"),!0)}}static async detectPackageManager(){for(let a of Uh)try{return await Mn(`command -v ${a.name}`),a}catch{}return null}static async ensureInstalled(){if(await e.isAvailable())return !0;te.info("Secure credential storage requires 'secret-tool' (libsecret). This tool allows us to store your encryption key in the OS keyring, so your credentials are protected even if someone copies the config file.");let a=await e.detectPackageManager();if(!a)return te.warn("Could not detect a supported package manager. Please install libsecret manually."),!1;let o=await Wh(" ? Install secret-tool? This requires sudo. (y/N) ");if(o!=="y"&&o!=="yes")return !1;try{return te.info(`Running: ${a.command}`),await zh("Installing secret-tool...",()=>Mn(a.command)),e.isAvailable()}catch{return te.warn("Installation failed. Falling back to derived key."),!1}}async getSecret(a,o){try{te.debug(`Looking up secret: service=${a}, account=${o}`);let{stdout:t}=await Tn("secret-tool",["lookup","service",a,"account",o]),r=t.trim();return te.debug(`secret-tool lookup result: ${r?"found":"empty"}`),r||null}catch(t){let r=t;return te.debug(`secret-tool lookup failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),null}}async setSecret(a,o,t){te.debug(`Storing secret: service=${a}, account=${o}`),te.debug(`Environment: DBUS_SESSION_BUS_ADDRESS=${process.env.DBUS_SESSION_BUS_ADDRESS??"NOT SET"}`),te.debug(`Environment: DISPLAY=${process.env.DISPLAY??"NOT SET"}, WAYLAND_DISPLAY=${process.env.WAYLAND_DISPLAY??"NOT SET"}`),te.debug(`Environment: WSL_DISTRO_NAME=${process.env.WSL_DISTRO_NAME??"NOT SET"}`),await new Promise((r,i)=>{let s=spawn("secret-tool",["store","--label",a,"service",a,"account",o]),n="";s.stderr.on("data",d=>{n+=d.toString();}),s.stdin.end(t,"utf8"),s.on("close",d=>{d===0?(te.debug("secret-tool store succeeded"),r()):(te.error(`secret-tool store failed: code=${d}, stderr=${n.trim()}`),i(new Error(`secret-tool exited with code ${d}${n?`: ${n.trim()}`:""}`)));}),s.on("error",d=>{te.error(`secret-tool store spawn error: ${d.message}`),i(d);});});}async deleteSecret(a,o){try{return te.debug(`Deleting secret: service=${a}, account=${o}`),await Tn("secret-tool",["clear","service",a,"account",o]),te.debug("secret-tool clear succeeded"),!0}catch(t){let r=t;return te.debug(`secret-tool clear failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),!1}}getStoragePath(){return "Linux Secret Service (secret-tool)"}};});function Fn(e,a){return `${e}:${a}`}function pr(e){return e.replace(/'/g,"''")}function ki(e){return ["-NoProfile","-NonInteractive","-Command",e]}function Kh(e){return `Add-Type -TypeDefinition @'
17
+ ${On}
18
18
  '@
19
- [FlowCredManager]::Read('${pr(e)}')`}function ob(e,a,o){return `Add-Type -TypeDefinition @'
20
- ${jn}
19
+ [FlowCredManager]::Read('${pr(e)}')`}function $h(e,a,o){return `Add-Type -TypeDefinition @'
20
+ ${On}
21
21
  '@
22
- [FlowCredManager]::Write('${pr(e)}', '${pr(a)}', '${pr(o)}')`}function tb(e){return `Add-Type -TypeDefinition @'
23
- ${jn}
22
+ [FlowCredManager]::Write('${pr(e)}', '${pr(a)}', '${pr(o)}')`}function Yh(e){return `Add-Type -TypeDefinition @'
23
+ ${On}
24
24
  '@
25
- [FlowCredManager]::Delete('${pr(e)}')`}async function Pi(e){return $h("powershell.exe",e)}var $h,ya,Gn,Yh,Zh,eb,jn,Ct,Un=H(()=>{"use strict";I();$h=promisify(execFile),ya=P("encryption:windows-keyvault"),Gn=1,Yh=1,Zh=2,eb=3;jn=`
25
+ [FlowCredManager]::Delete('${pr(e)}')`}async function Pi(e){return Vh("powershell.exe",e)}var Vh,va,Ln,Qh,_h,Xh,On,Ct,Nn=H(()=>{"use strict";I();Vh=promisify(execFile),va=k("encryption:windows-keyvault"),Ln=1,Qh=1,_h=2,Xh=3;On=`
26
26
  using System;
27
27
  using System.Runtime.InteropServices;
28
28
  using System.Text;
@@ -58,7 +58,7 @@ public class FlowCredManager {
58
58
 
59
59
  public static string Read(string target) {
60
60
  IntPtr credPtr;
61
- if (!CredRead(target, ${Gn}, 0, out credPtr)) return "";
61
+ if (!CredRead(target, ${Ln}, 0, out credPtr)) return "";
62
62
  try {
63
63
  var cred = (CREDENTIAL)Marshal.PtrToStructure(credPtr, typeof(CREDENTIAL));
64
64
  if (cred.CredentialBlobSize <= 0) return "";
@@ -72,7 +72,7 @@ public class FlowCredManager {
72
72
  byte[] bytes = Encoding.UTF8.GetBytes(secret);
73
73
  IntPtr targetPtr = Marshal.StringToHGlobalUni(target);
74
74
  IntPtr userPtr = Marshal.StringToHGlobalUni(userName);
75
- int[] persistLevels = new int[] { ${Zh}, ${eb}, ${Yh} };
75
+ int[] persistLevels = new int[] { ${_h}, ${Xh}, ${Qh} };
76
76
  int lastErr = 0;
77
77
  try {
78
78
  foreach (int persist in persistLevels) {
@@ -80,7 +80,7 @@ public class FlowCredManager {
80
80
  try {
81
81
  Marshal.Copy(bytes, 0, blobPtr, bytes.Length);
82
82
  var cred = new CREDENTIAL();
83
- cred.Type = ${Gn};
83
+ cred.Type = ${Ln};
84
84
  cred.TargetName = targetPtr;
85
85
  cred.CredentialBlobSize = bytes.Length;
86
86
  cred.CredentialBlob = blobPtr;
@@ -98,172 +98,172 @@ public class FlowCredManager {
98
98
  }
99
99
 
100
100
  public static bool Delete(string target) {
101
- return CredDelete(target, ${Gn}, 0);
101
+ return CredDelete(target, ${Ln}, 0);
102
102
  }
103
103
  }
104
- `;Ct=class{static async isAvailable(){try{let{stdout:a}=await Pi(ki('Write-Output "ok"')),o=a.trim()==="ok";return ya.debug(`PowerShell availability check: ${o?"available":"unexpected output"}`),o}catch(a){let o=a instanceof Error?a.message.split(`
105
- `)[0]:"unknown error";return ya.debug(`PowerShell not available: ${o}`),!1}}async getSecret(a,o){try{let t=Bn(a,o);ya.debug(`Looking up secret: target=${t}`);let r=ab(t),{stdout:i}=await Pi(ki(r)),s=i.trim();return ya.debug(`CredRead result: ${s?"found":"empty"}`),s||null}catch(t){let r=t instanceof Error?t.message.split(`
106
- `)[0]:"unknown error";return ya.error(`Failed to read secret from Windows Credential Manager [service="${a}", account="${o}"]: ${r}`),null}}async setSecret(a,o,t){try{let r=Bn(a,o);ya.debug(`Storing secret: target=${r}`);let i=ob(r,t,o),{stdout:s}=await Pi(ki(i)),n=s.trim();if(n.startsWith("OK:")){let l=n.split(":")[1];ya.debug(`CredWrite succeeded (persist=${l})`);return}let d=n.startsWith("ERR:")?n.split(":")[1]:"unknown";throw new Error(`CredWrite failed with Win32 error ${d}`)}catch(r){let i=r instanceof Error?r.message.split(`
107
- `)[0]:"unknown error",s=`Failed to store secret in Windows Credential Manager [service="${a}", account="${o}"]: ${i}`;throw ya.error(s),new Error(s)}}async deleteSecret(a,o){try{let t=Bn(a,o);ya.debug(`Deleting secret: target=${t}`);let r=tb(t),{stdout:i}=await Pi(ki(r)),s=i.trim()==="True";return ya.debug(`CredDelete result: ${s}`),s}catch(t){let r=t instanceof Error?t.message.split(`
108
- `)[0]:"unknown error";return ya.debug(`Failed to delete secret from Windows Credential Manager [service="${a}", account="${o}"]: ${r}`),!1}}getStoragePath(){return "Windows Credential Manager (PowerShell)"}};});function nb(){let e=`${Ce.hostname()}${Ce.userInfo().username}`;return kt.scryptSync(e,ib,rb)}function db(){let e=nb(),a=new cr(e),o=Tn(a);return new zn({projectName:Wn,serialize:o.serialize,deserialize:o.deserialize,configFileMode:384})}function Di(){return wi||(wi=db()),wi}var rb,ib,Wn,sb,wi,Ve,mr=H(()=>{"use strict";yn();Mn();rb=32,ib="flow-plugins-cli-fallback",Wn="flow-plugins-cli-fallback",sb={linux:"install secret-tool (e.g. sudo apt install libsecret-tools)",darwin:"ensure the Keychain is accessible (security binary must be available)",win32:"ensure Credential Manager is available (cmdkey must be in PATH)"};wi=null;Ve=class{warned=!1;async getSecret(a,o){return Di().get(`${a}:${o}`)??null}async setSecret(a,o,t){if(!this.warned){let r=sb[process.platform]??"ensure the OS keyring is available";process.stderr.write(`\u26A0 Secure keyring unavailable. Credentials are stored in an encrypted file
104
+ `;Ct=class{static async isAvailable(){try{let{stdout:a}=await Pi(ki('Write-Output "ok"')),o=a.trim()==="ok";return va.debug(`PowerShell availability check: ${o?"available":"unexpected output"}`),o}catch(a){let o=a instanceof Error?a.message.split(`
105
+ `)[0]:"unknown error";return va.debug(`PowerShell not available: ${o}`),!1}}async getSecret(a,o){try{let t=Fn(a,o);va.debug(`Looking up secret: target=${t}`);let r=Kh(t),{stdout:i}=await Pi(ki(r)),s=i.trim();return va.debug(`CredRead result: ${s?"found":"empty"}`),s||null}catch(t){let r=t instanceof Error?t.message.split(`
106
+ `)[0]:"unknown error";return va.error(`Failed to read secret from Windows Credential Manager [service="${a}", account="${o}"]: ${r}`),null}}async setSecret(a,o,t){try{let r=Fn(a,o);va.debug(`Storing secret: target=${r}`);let i=$h(r,t,o),{stdout:s}=await Pi(ki(i)),n=s.trim();if(n.startsWith("OK:")){let l=n.split(":")[1];va.debug(`CredWrite succeeded (persist=${l})`);return}let d=n.startsWith("ERR:")?n.split(":")[1]:"unknown";throw new Error(`CredWrite failed with Win32 error ${d}`)}catch(r){let i=r instanceof Error?r.message.split(`
107
+ `)[0]:"unknown error",s=`Failed to store secret in Windows Credential Manager [service="${a}", account="${o}"]: ${i}`;throw va.error(s),new Error(s)}}async deleteSecret(a,o){try{let t=Fn(a,o);va.debug(`Deleting secret: target=${t}`);let r=Yh(t),{stdout:i}=await Pi(ki(r)),s=i.trim()==="True";return va.debug(`CredDelete result: ${s}`),s}catch(t){let r=t instanceof Error?t.message.split(`
108
+ `)[0]:"unknown error";return va.debug(`Failed to delete secret from Windows Credential Manager [service="${a}", account="${o}"]: ${r}`),!1}}getStoragePath(){return "Windows Credential Manager (PowerShell)"}};});function ob(){let e=`${Ce.hostname()}${Ce.userInfo().username}`;return kt.scryptSync(e,eb,Zh)}function tb(){let e=ob(),a=new cr(e),o=An(a);return new Gn({projectName:Bn,serialize:o.serialize,deserialize:o.deserialize,configFileMode:384})}function Di(){return wi||(wi=tb()),wi}var Zh,eb,Bn,ab,wi,Qe,mr=H(()=>{"use strict";fn();xn();Zh=32,eb="flow-plugins-cli-fallback",Bn="flow-plugins-cli-fallback",ab={linux:"install secret-tool (e.g. sudo apt install libsecret-tools)",darwin:"ensure the Keychain is accessible (security binary must be available)",win32:"ensure Credential Manager is available (cmdkey must be in PATH)"};wi=null;Qe=class{warned=!1;async getSecret(a,o){return Di().get(`${a}:${o}`)??null}async setSecret(a,o,t){if(!this.warned){let r=ab[process.platform]??"ensure the OS keyring is available";process.stderr.write(`\u26A0 Secure keyring unavailable. Credentials are stored in an encrypted file
109
109
  using a machine-derived key. For stronger security, ${r}.
110
- `),this.warned=!0;}Di().set(`${a}:${o}`,t);}async deleteSecret(a,o){let t=Di(),r=`${a}:${o}`;return t.has(r)?(t.delete(r),!0):!1}getStoragePath(){return Di().path}static hasExistingData(){try{let a=new zn({projectName:Wn});return se.existsSync(a.path)}catch{return !1}}static clearFallbackFile(){try{let a=new zn({projectName:Wn});se.rmSync(a.path,{force:!0});}catch{}wi=null;}};});async function Jn(){if(Ve.hasExistingData())return new Ve;switch(process.platform){case "darwin":return await wt.isAvailable()?new wt:new Ve;case "linux":return await vo.isAvailable()?new vo:await vo.ensureInstalled()?new vo:new Ve;case "win32":return await Ct.isAvailable()?new Ct:new Ve;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var yl=H(()=>{"use strict";Ln();Nn();Un();mr();});var kl=H(()=>{"use strict";yn();Mn();yl();Ln();Nn();Un();mr();});async function yo(){return Ri||(Ri=Jn()),Ri}function Ai(){Ri=null;}async function Y(){let a=await(await yo()).getSecret($a,Hn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function ko(e){let{clientId:a,clientSecret:o,tenant:t}=e,r=[!a?.trim()&&"clientId",!o?.trim()&&"clientSecret",!t?.trim()&&"tenant"].filter(Boolean);if(r.length>0)throw Pl.error(`missing or empty fields: ${r.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await yo()).setSecret($a,Hn,JSON.stringify(e));}async function Dl(){let e=await yo();await e.deleteSecret($a,Hn),await e.deleteSecret($a,Qn),await e.deleteSecret($a,Vn);}async function wl(){return (await yo()).getStoragePath()}async function Sl(e){await(await yo()).setSecret($a,Qn,JSON.stringify(e));}async function xi(){let a=await(await yo()).getSecret($a,Qn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function Ei(e){await(await yo()).setSecret($a,Vn,JSON.stringify(e));}async function Rt(){let a=await(await yo()).getSecret($a,Vn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function Po(){let e=await xi();return e?new Date(e.expiresAt)>new Date:false}function La(e){let a=e.replace(/\/$/,"");process.env.AUTH_ENGINE_URL=`${a}/auth-engine-api/v2/api-key/token`,process.env.PROMPT_MANAGER_URL=`${a}/prompt-manager-api/`,process.env.METRICS_COLLECTOR_URL=`${a}/metrics-collector-api/`,Pl.debug(`[customUrl] Service URLs overridden to base: ${a}`);}var Pl,$a,Hn,Qn,Vn,Ri,Re=H(()=>{"use strict";kl();I();Pl=P("config:credentials"),$a="flow-plugins-cli",Hn="credentials",Qn="token-cache",Vn="user-info",Ri=null;});function At(e){let a=e.split(".");if(a.length!==3)throw new Error(`Invalid JWT: expected 3 segments, got ${a.length}`);let o=a[1].replace(/-/g,"+").replace(/_/g,"/"),t=Buffer.from(o,"base64").toString("utf8");try{return JSON.parse(t)}catch{throw new Error("Invalid JWT: payload segment is not valid JSON")}}var Ii=H(()=>{"use strict";});function cb(e){if(!e.startsWith("[")||!e.endsWith("]"))return null;let o=e.slice(1,-1).match(/^::(?:ffff:)?([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);if(!o)return null;let t=parseInt(o[1],16),r=parseInt(o[2],16);return `${t>>8&255}.${t&255}.${r>>8&255}.${r&255}`}function _n(e){if(Cl.some(o=>o.test(e)))return true;let a=cb(e);return !!(a&&Cl.some(o=>o.test(a)))}function lb(e,a){let o=process.env[e]??a;if(!o)throw new Error(`Missing required environment variable: ${e}`);return o}function Fa(e,a){let o=lb(e,a),t;try{t=new URL(o);}catch{throw new Error(`${e} must be a valid URL. Got: "${o}"`)}let r=process.env.NODE_ENV==="development";if(!r&&t.protocol!=="https:")throw new Error(`${e} must be an HTTPS URL. Got protocol: "${t.protocol}"`);if(t.username||t.password)throw new Error(`${e} must not contain embedded credentials (user:pass@host is not allowed)`);if(/^169\.254\./i.test(t.hostname)||/^metadata\.(google|azure)\.internal\.?$/i.test(t.hostname)||/^100\.(6[4-9]|[7-9]\d|1[0-2][0-7])\./i.test(t.hostname))throw new Error(`${e} must not point to a cloud metadata endpoint. Got: "${t.hostname}"`);if(!r&&_n(t.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${t.hostname}"`);return o}var Cl,_o=H(()=>{"use strict";Cl=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^100\.(6[4-9]|[7-9]\d|1[0-2][0-7])\./,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^0\./,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i];});function mb(e){if(!Ka.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}async function gb(e){if(e instanceof HTTPError){let a=e.response.status;Xn.debug(`HTTP error during authentication [status=${a}]`);let o="";try{let t=await e.response.text(),r=JSON.parse(t);typeof r.error=="string"&&(o=r.error);}catch{}return o&&Rl[o]?new Error(Rl[o]):a===StatusCodes.UNAUTHORIZED||a===StatusCodes.FORBIDDEN||a===StatusCodes.INTERNAL_SERVER_ERROR?new Error("Invalid credentials"):a>=StatusCodes.BAD_REQUEST&&a<StatusCodes.INTERNAL_SERVER_ERROR?new Error("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}return e instanceof Error?(Xn.debug(`Non-HTTP error during authentication: ${e.message}`),e):(Xn.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function Xo(e){let a=Fa("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");mb(e.tenant);let o;try{o=await _u.post(a,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(i){throw await gb(i)}let t=o.expires_at??new Date(Date.now()+(o.expires_in??3600)*1e3).toISOString();await ko(e),await Sl({accessToken:o.access_token,expiresAt:t});let r=At(o.access_token);await Ei({sub:r.sub,name:r.name,email:r.email});}var Xn,Rl,Ti=H(()=>{"use strict";Re();Ii();_o();I();U();Xn=P("api:auth");Rl={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});async function Oa(){if(await Po()){let t=await xi();if(t)return t.accessToken}Al.debug("Token expired or missing, re-authenticating...");let a=await Y();if(!a)throw new Error("Not authenticated. Run: flow auth login");Ve.clearFallbackFile(),Ai(),await Xo(a);let o=await xi();if(!o)throw new Error("Authentication succeeded but token was not persisted");return Al.debug("Token refreshed successfully"),o.accessToken}var Al,xt=H(()=>{"use strict";Re();Ti();mr();I();Al=P("lib:tokenProvider");});function eo(){return _u.create({prefix:Fa("PROMPT_MANAGER_URL","https://flow.ciandt.com/prompt-manager-api/"),redirect:"error",hooks:{beforeRequest:[async({request:e})=>{let a=await Oa();e.headers.set("Authorization",`Bearer ${a}`);let o=await Y();o?.tenant&&Ka.test(o.tenant)&&e.headers.set("FlowTenant",o.tenant);}]}})}var xr=H(()=>{"use strict";_o();Re();xt();U();});function Ot(e,a){let o=eo();return a?o.get(e,{searchParams:{source:a}}):o.get(e)}async function Nt(e){if(!(e instanceof HTTPError))return null;try{let a=await e.response.clone().json(),{message:o}=a;return Array.isArray(o)?o.filter(Boolean).join("; ")||null:typeof o=="string"&&o?o:null}catch{return null}}var vd=H(()=>{"use strict";xr();});function Er(e){if(!e||!ly.test(e))throw new Error(`Invalid plugin name: "${e}". Must be 1-64 chars, lowercase alphanumeric and hyphens only.`)}function Gt(e){return uy.test(e)}function Bt(e){let a=e.indexOf("@");return a>0?e.slice(0,a):e}function kd(e){if(!py.test(e))throw new Error(`Invalid plugin name: "${e}". Plugin names must start with an alphanumeric character and contain only letters, digits, dots, hyphens, underscores, and slashes.`)}function jt(e,a){let o=Bt(e);kd(o);let t=["claude","plugin","install",o];return a&&t.push("--scope",a),t.join(" ")}function ss(e){let a=e.trim();if(!a)throw new Error("No marketplace source provided.");if(!my.test(a)&&!gy.test(a))throw new Error(`Invalid marketplace source: "${a}". Must be owner/repo or an https:// URL.`);return a}var ly,uy,py,my,gy,To=H(()=>{"use strict";ly=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;uy=/^[^@]+@[^@]+$/;py=/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\/[a-zA-Z0-9][a-zA-Z0-9._-]*)?$/;my=/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/,gy=/^https:\/\/[\w./:@?&=+#%-]+$/;});var Ju={};Yc(Ju,{FlowApiAdapter:()=>Ut});var fy,Ut,Pd=H(()=>{"use strict";xr();vd();I();To();fy=P("catalog.flow-api"),Ut=class{id;name;source;removable=!1;contentSource;constructor(a){this.contentSource=a,this.id=a?`flow-api:${a}`:"flow-api",this.name=a?`Flow Marketplace (${a})`:"Flow Marketplace",this.source=process.env.PROMPT_MANAGER_URL??"";}async fetchItems(){try{let{plugins:a}=await Ot("v1/plugins/catalog",this.contentSource).json();return a.map(o=>({...o,catalogId:this.id,origin:o.origin??"internal",type:o.type??"bundle",...this.contentSource?{contentSource:this.contentSource}:{}}))}catch(a){let o=await Nt(a);if(o)throw new Error(o);if(a instanceof HTTPError){let{status:t}=a.response;throw t===401||t===403?new Error("Authentication failed. Run: flow auth login"):new Error(`Failed to fetch plugin catalog: HTTP ${t}`)}throw a instanceof Error?a.name==="TimeoutError"||a.message.includes("timeout")?new Error("Request timed out while fetching plugin catalog"):new Error(`Failed to fetch plugin catalog: ${a.message}`):a}}async fetchManifest(a){Er(a);try{return await Ot(`v1/plugins/${a}/manifest`,this.contentSource).json()}catch(o){let t=await Nt(o);if(t)throw new Error(t);if(o instanceof HTTPError){let{status:r}=o.response;throw r===404?new Error(`Plugin '${a}' not found in catalog`):new Error(`Failed to fetch manifest: HTTP ${r}`)}throw o instanceof Error?new Error(`Failed to fetch manifest: ${o.message}`):o}}async ping(){try{return await eo().head("v1/plugins/catalog"),fy.debug("ping ok"),!0}catch{return !1}}};});function by(){let e=process.env.GH_TOKEN??process.env.GITHUB_TOKEN;return e?Promise.resolve(e):execa("gh",["auth","token"],{reject:false}).then(({stdout:a})=>a.trim()||void 0).catch(()=>{})}function Qu(){return Hu??=by(),Hu}var Hu,Vu=H(()=>{"use strict";});var Ku={};Yc(Ku,{GitRepoAdapter:()=>zt});function Xu(e,a){if(!vy.test(e))throw new Error(`Invalid ${a} in catalog source URL: "${e}"`)}var vy,zt,Dd=H(()=>{"use strict";Vu();_o();vy=/^[a-zA-Z0-9_.-]+$/;zt=class{id;name;source;constructor(a,o,t){this.id=a,this.name=o,this.source=t;}buildRawUrl(a,o="marketplace.json"){let t=new URL(this.source),{hostname:r,pathname:i}=t;if(_n(r))throw new Error(`Catalog source URL points to a private/loopback address: "${r}"`);let s=i.replace(/^\//,"").split("/"),[n,d]=s;return Xu(n,"owner"),Xu(d,"repo"),r==="github.com"?`https://raw.githubusercontent.com/${n}/${d}/${a}/${o}`:r==="bitbucket.org"?`https://bitbucket.org/${n}/${d}/raw/${a}/${o}`:r==="gitlab.com"||r.startsWith("git.")?`https://${r}/${n}/${d}/-/raw/${a}/${o}`:`https://${r}/${n}/${d}/raw/${a}/${o}`}async fetchItems(){return this._fetchFromBranch("main").catch(a=>{if(this._is404(a))return this._fetchFromBranch("master");throw a})}async _fetchFromBranch(a){let o=await this._buildHeaders();try{let i=this.buildRawUrl(a,".claude-plugin/marketplace.json"),{plugins:s}=await _u.get(i,{headers:o}).json();return s.map(n=>({...n,catalogId:this.id,origin:n.origin??"external"}))}catch(i){if(this._is401or403(i))throw this._authError();if(!this._is404(i))throw i}let t=this.buildRawUrl(a),{plugins:r}=await _u.get(t,{headers:o}).json();return r.map(i=>({...i,catalogId:this.id,origin:i.origin??"external"}))}async _buildHeaders(){if(new URL(this.source).hostname!=="github.com")return {};let o=await Qu();return o?{Authorization:`token ${o}`}:{}}_is404(a){return a!==null&&typeof a=="object"&&"response"in a&&a.response?.status===404}_is401or403(a){return a!==null&&typeof a=="object"&&"response"in a&&[401,403].includes(a.response?.status??0)}_authError(){return Object.assign(new Error("Private repository or insufficient permissions. Set GH_TOKEN or GITHUB_TOKEN env var, or run `gh auth login`."),{code:"GITHUB_AUTH_REQUIRED"})}async fetchManifest(a){throw new Error("GitRepoAdapter does not support individual manifest fetch")}async ping(){try{return await this.fetchItems(),!0}catch{return !1}}};});U();var y=create(e=>({screen:"auth",activeTab:"discover",focus:"list",selectedIndex:0,actionMenuOpen:false,notification:null,loading:false,loadingMessage:"",downloadProgress:0,downloadTotal:0,catalogError:null,pendingExit:false,debugPanelOpen:false,catalogVersion:0,bundleInstallFlow:null,catalogFilters:{types:new Set(bn),origins:new Set(vn)},setScreen:a=>e({screen:a}),setActiveTab:a=>e({activeTab:a}),setFocus:a=>e({focus:a}),setSelectedIndex:a=>e({selectedIndex:a}),setActionMenuOpen:a=>e({actionMenuOpen:a}),showNotification:(a,o)=>e({notification:{message:a,type:o}}),clearNotification:()=>e({notification:null}),setLoading:(a,o="")=>e({loading:a,loadingMessage:a?o:"",downloadProgress:0,downloadTotal:0}),setDownloadProgress:(a,o)=>e({downloadProgress:a,downloadTotal:o}),setCatalogError:a=>e({catalogError:a}),setPendingExit:a=>e({pendingExit:a}),toggleTypeFilter:a=>e(o=>{let{types:t}=o.catalogFilters;return t.size===1&&t.has(a)?{}:{catalogFilters:{...o.catalogFilters,types:new Set([a])},selectedIndex:0}}),selectAllTypes:()=>e(a=>({catalogFilters:{...a.catalogFilters,types:new Set(bn)},selectedIndex:0})),toggleOriginFilter:a=>e(o=>{let{origins:t}=o.catalogFilters;return t.size===1&&t.has(a)?{}:{catalogFilters:{...o.catalogFilters,origins:new Set([a])},selectedIndex:0}}),selectAllOrigins:()=>e(a=>({catalogFilters:{...a.catalogFilters,origins:new Set(vn)},selectedIndex:0})),setDebugPanelOpen:a=>e({debugPanelOpen:a}),incrementCatalogVersion:()=>e(a=>({catalogVersion:a.catalogVersion+1})),setBundleInstallFlow:a=>e({bundleInstallFlow:a})}));Re();xt();Ii();U();_o();I();var Mi=P("api:metrics");function xl(){return Fa("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function El(e,a,o){return _u.post(e,{json:a,headers:o})}async function hb(e){let a=await Rt();if(a)return a;let o=At(e),t={sub:o.sub,name:o.name,email:o.email};return await Ei(t),t}async function C(e,a){let o=await Oa(),t=await hb(o),r=await Y();if(!Ka.test(r.tenant))throw new Error(`Invalid tenant value: "${r.tenant}"`);let i={action:e,booster:hn,metadata:{...a},success:true,tenant:r.tenant,timestamp:new Date().toISOString(),user:{id:t.sub,name:t.name,email:t.email}};try{await El(xl(),i,{Authorization:`Bearer ${o}`,FlowTenant:r.tenant}),Mi.debug(`Metrics event sent: ${e}`);}catch(s){throw Mi.warn(`Failed to send metrics event "${e}": ${String(s)}`),s}}async function Il(e,a,o){try{let t=o&&Ka.test(o)?o:"unknown",r={action:e,booster:hn,metadata:a,success:!0,tenant:t,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await El(xl(),r,{FlowTenant:t}),Mi.debug(`Anonymous metrics event sent: ${e}`);}catch(t){Mi.warn(`Failed to send anonymous metrics event "${e}": ${String(t)}`);}}var w={CLI_SESSION_STARTED:"CLI_SESSION_STARTED",CLI_AUTH_FAILED:"CLI_AUTH_FAILED",CLI_STEP_COMPLETED:"CLI_STEP_COMPLETED",CLI_KIT_DISPLAYED:"CLI_KIT_DISPLAYED",CLI_KIT_ACCEPTED:"CLI_KIT_ACCEPTED",CLI_KIT_REJECTED:"CLI_KIT_REJECTED",CLI_ONBOARDING_COMPLETED:"CLI_ONBOARDING_COMPLETED",CLI_ONBOARDING_ABANDONED:"CLI_ONBOARDING_ABANDONED",CLI_CLAUDE_MD_ACCEPTED:"CLI_CLAUDE_MD_ACCEPTED",CLI_CLAUDE_MD_SKIPPED:"CLI_CLAUDE_MD_SKIPPED",CLI_TOOL_INSTALLED:"CLI_TOOL_INSTALLED",CLI_TOOL_UNINSTALLED:"CLI_TOOL_UNINSTALLED",CLI_TOOL_UPDATED:"CLI_TOOL_UPDATED",CLI_TOOL_ENABLED:"CLI_TOOL_ENABLED",CLI_TOOL_INSTALL_FAILED:"CLI_TOOL_INSTALL_FAILED",CLI_TOOL_DISABLED:"CLI_TOOL_DISABLED",CLI_CATALOG_VIEWED:"CLI_CATALOG_VIEWED",CLI_TUI_SESSION_ENDED:"CLI_TUI_SESSION_ENDED",CLI_MODULE_INSTALL_STARTED:"CLI_MODULE_INSTALL_STARTED",CLI_MODULE_INSTALL_COMPLETED:"CLI_MODULE_INSTALL_COMPLETED",CLI_MODULE_INSTALL_FAILED:"CLI_MODULE_INSTALL_FAILED",CLI_MODULE_PROXY_EXECUTED:"CLI_MODULE_PROXY_EXECUTED",CLI_MODULE_NOT_FOUND:"CLI_MODULE_NOT_FOUND",CLI_MODULE_UPDATED:"CLI_MODULE_UPDATED",CLI_BUNDLE_INSTALL_STARTED:"CLI_BUNDLE_INSTALL_STARTED",CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS:"CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS",CLI_BUNDLE_INSTALL_PLUGIN_FAILED:"CLI_BUNDLE_INSTALL_PLUGIN_FAILED",CLI_BUNDLE_INSTALL_COMPLETED:"CLI_BUNDLE_INSTALL_COMPLETED",CLI_STRATEGY_INIT_COMPLETED:"CLI_STRATEGY_INIT_COMPLETED",CLI_STRATEGY_INIT_FAILED:"CLI_STRATEGY_INIT_FAILED"};var bb={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},ka={...bb};function Tl(e){let a=Date.now();ka={sessionStart:a,stepStart:a,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function Ko(e){ka.currentStep=e,ka.stepStart=Date.now();}function Z(){return {...ka}}function Do(){return ka.sessionStart===0?0:Date.now()-ka.sessionStart}function $o(){return ka.stepStart===0?0:Date.now()-ka.stepStart}function Ml(){ka.tuiSessionStart=Date.now();}function ql(){return ka.tuiSessionStart===0?0:Date.now()-ka.tuiSessionStart}I();var vb=3e3,yb=P("abandonment");async function qi(e){let{currentStep:a,sessionStart:o}=Z();if(o===0)return;let t={last_step:a,trigger:e,duration_ms:Do()};try{await Promise.race([C(w.CLI_ONBOARDING_ABANDONED,t),new Promise((r,i)=>setTimeout(()=>i(new Error("abandonment timeout")),vb))]);}catch(r){yb.warn(`Abandonment event failed: ${String(r)}`);}}function Ll(e,a){return Promise.race([e,new Promise(o=>setTimeout(o,a))])}I();var kb=3e3,Pb=P("session-end");async function fr(e,a,o){let t=ql(),i=[C(w.CLI_TUI_SESSION_ENDED,{duration_ms:t,active_tab:a,interface:"tui"})];o!=="main"&&i.push(qi(e));try{await Ll(Promise.all(i).then(()=>{}),kb);}catch(s){Pb.warn(`Session end event failed: ${String(s)}`);}}var Cb=2e3;function Ol(){let{exit:e}=useApp(),a=useRef(false),o=useRef(null),t=y(d=>d.pendingExit),r=y(d=>d.setPendingExit),i=y(d=>d.activeTab),s=y(d=>d.screen),n=useCallback(()=>{if(a.current){o.current&&clearTimeout(o.current),fr("double-ctrl-c",i,s).finally(()=>e());return}a.current=true,r(true),o.current=setTimeout(()=>{a.current=false,r(false);},Cb);},[e,r,i,s]);return useInput((d,l)=>{l.ctrl&&d==="c"&&n();}),{pendingExit:t}}var Eb=16;function Nl({label:e,value:a,onChange:o,masked:t=false,isActive:r,error:i}){let s=useRef(a);useEffect(()=>{s.current=a;},[a]),useInput((d,l)=>{if(l.backspace){let c=s.current.slice(0,-1);s.current=c,o(c);}else if(d&&!l.ctrl&&!l.meta&&!l.escape&&!l.return&&!l.tab&&!l.upArrow&&!l.downArrow&&!l.leftArrow&&!l.rightArrow){let c=s.current+d;s.current=c,o(c);}},{isActive:r});let n=t?"\u2022".repeat(a.length):a;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:r?"cyan":"gray",children:r?"\u25B8 ":" "}),jsx(Text,{color:r?"white":"gray",bold:r,children:e.padEnd(Eb)}),jsx(Text,{color:r?"cyan":"gray",children:n}),r&&jsx(Text,{color:"cyan",children:"\u2588"})]}),i&&jsx(Box,{paddingLeft:3,children:jsxs(Text,{color:"red",children:["\u26A0 ",i]})})]})}U();function Gl({onConfirm:e}){let[a,o]=useState("confirm"),[t,r]=useState(""),[i,s]=useState(false),n=useRef("");return useInput((d,l)=>{if(a==="confirm"){if(d==="n"||d==="N"){o("input");return}(d==="y"||d==="Y"||l.return)&&e(null);return}if(l.escape){n.current="",r(""),s(false),o("confirm");return}if(l.return){let c=n.current.trim();vt.test(c)?(s(false),e(c)):s(true);return}if(l.backspace||l.delete){n.current=n.current.slice(0,-1),r(n.current);return}d&&!l.ctrl&&!l.meta&&(n.current=n.current+d,r(n.current),s(false));}),jsxs(Box,{flexDirection:"column",gap:1,children:[a==="confirm"&&jsx(Text,{children:"Does your email use the @ciandt.com domain? (Y/n)"}),a==="input"&&jsxs(Box,{flexDirection:"column",gap:1,children:[jsx(Text,{children:"Enter your email address:"}),jsxs(Box,{children:[jsx(Text,{color:"cyan",children:"> "}),jsx(Text,{children:t}),jsx(Text,{color:"cyan",children:"\u2588"})]}),i&&jsx(Text,{color:"red",children:yt}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})}U();function Bl({plan:e}){return jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[fo," \u2014 Confirm Settings Update"]})}),jsxs(Box,{flexDirection:"column",marginBottom:1,children:[jsx(Text,{children:"Ready to update ~/.claude/settings.json:"}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsx(Text,{color:"green",children:e.previousToken?" ~ env.ANTHROPIC_AUTH_TOKEN (replaced)":" + env.ANTHROPIC_AUTH_TOKEN (new)"}),jsx(Text,{color:"green",children:e.previousBaseUrl?" ~ env.ANTHROPIC_BASE_URL (replaced)":" + env.ANTHROPIC_BASE_URL (new)"}),e.hadExistingFile&&jsx(Text,{dimColor:true,children:" Existing settings preserved."})]})]}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsx(Text,{dimColor:true,children:"Enter \u2014 update settings.json and continue"}),jsx(Text,{dimColor:true,children:"Esc \u2014 skip JWT update, continue"}),jsx(Text,{dimColor:true,children:"q \u2014 back to form"})]})]})}U();function jl(){return jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"yellow",children:[fo," \u2014 settings.json is invalid"]})}),jsxs(Box,{flexDirection:"column",marginBottom:1,children:[jsx(Text,{children:"Your ~/.claude/settings.json contains invalid JSON."}),jsx(Text,{children:"Press Enter to overwrite it with a fresh file containing only the auth token,"}),jsx(Text,{children:"or Esc to cancel and fix the file manually."})]}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter overwrite \xB7 Esc cancel"})})]})}var oa=create(e=>({credentials:null,isAuthenticated:false,justAuthenticated:false,setCredentials:a=>e({credentials:a,isAuthenticated:true}),clearCredentials:()=>e({credentials:null,isAuthenticated:false,justAuthenticated:false}),setJustAuthenticated:a=>e({justAuthenticated:a})}));Ti();U();function et(){return de__default.join(Ce__default.homedir(),".claude","settings.json")}function zl(e){return `${(e&&e.trim().length>0?e.trim():ni).replace(/\/+$/,"")}/flow-litellm/`}function Dr(){let e=et();if(!se__default.existsSync(e))return {status:"missing"};let a=se__default.readFileSync(e,"utf-8"),o=a.charCodeAt(0)===65279?a.slice(1):a;try{let t=JSON.parse(o);return t===null||typeof t!="object"||Array.isArray(t)?{status:"malformed",raw:a}:{status:"ok",settings:t}}catch{return {status:"malformed",raw:a}}}function Fi(e){let a=et();se__default.mkdirSync(de__default.dirname(a),{recursive:true});let o=`${a}.${randomUUID()}.tmp`;se__default.writeFileSync(o,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),se__default.renameSync(o,a);}function Wl(e,a,o){let t=e.env&&typeof e.env=="object"&&!Array.isArray(e.env)?e.env:{};return {...e,env:{...t,ANTHROPIC_AUTH_TOKEN:a,ANTHROPIC_BASE_URL:o}}}function od(e){let a=e.env;if(!a||typeof a!="object"||Array.isArray(a))return null;let o=a.ANTHROPIC_AUTH_TOKEN;return typeof o=="string"&&o.length>0?o:null}function Jl(e){let a=e.env;if(!a||typeof a!="object"||Array.isArray(a))return null;let o=a.ANTHROPIC_BASE_URL;return typeof o=="string"&&o.length>0?o:null}var Ob=3600,at=class extends Error{constructor(){super("~/.claude/settings.json contains invalid JSON"),this.name="MalformedSettingsError";}};function wr(e){let a=e.split(".");if(a.length!==3)throw new Error("Malformed JWT: invalid format");let o;try{o=JSON.parse(Buffer.from(a[1],"base64url").toString("utf8"));}catch{throw new Error("Malformed JWT: payload is not valid JSON")}if(!o||typeof o!="object"||Array.isArray(o))throw new Error("Malformed JWT: payload must be a JSON object");let t=o;if(typeof t.clientId!="string"||!t.clientId)throw new Error("Invalid JWT: claim clientId must be a non-empty string");if(t.clientId.length>512)throw new Error("Invalid JWT: claim clientId exceeds maximum length");if(typeof t.clientSecret!="string"||!t.clientSecret)throw new Error("Invalid JWT: claim clientSecret must be a non-empty string");if(t.clientSecret.length>4096)throw new Error("Invalid JWT: claim clientSecret exceeds maximum length");if(typeof t.tenant!="string"||!t.tenant)throw new Error("Invalid JWT: claim tenant must be a non-empty string");if(t.tenant.length>512)throw new Error("Invalid JWT: claim tenant exceeds maximum length");return {clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant}}function Nb(e){return Fb.sign({clientId:e.clientId,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:Ob})}function Oi(e,a={}){let o=Dr();if(o.status==="malformed"&&!a.allowOverwriteMalformed)throw new at;let t=o.status==="ok"?o.settings:{},r=o.status==="ok"?od(o.settings):null,i=o.status==="ok"?Jl(o.settings):null,s=a.jwtOverride??Nb(e),n=zl(e.customUrl),d=Wl(t,s,n);return {jwt:s,anthropicBaseUrl:n,merged:d,previousToken:r,previousBaseUrl:i,hadExistingFile:o.status!=="missing"}}function Ni(e){Fi(e.merged);}function Hl(){let e=Dr();return e.status!=="ok"?false:od(e.settings)!==null}Re();Oe();function Gb(){let e=sl();if(!se__default.existsSync(e))return {};try{return JSON.parse(se__default.readFileSync(e,"utf-8"))}catch{return {}}}var td=null;function Bb(){return td===null&&(td=Gb()),td}function Co(){return !!Bb().ENABLE_EXPERIMENTAL_BETAS}U();function Wb(){return ce.filter(e=>e.platforms[process.platform]?.status==="supported")}function Vl(e){let a=Wb();return a.length>0&&a.every(o=>e.find(t=>t.module.alias===o.alias)?.alreadyInstalled===true)}var Gi={alias:"metrics",required:true,name:"flow-ai-obs",configCheck:()=>{try{let e=de__default.join(Ce__default.homedir(),".claude","settings.json"),o=se__default.readFileSync(e,"utf-8").replace(/^\uFEFF/,""),r=JSON.parse(o).env;return typeof r=="object"&&r!==null&&"OTEL_EXPORTER_OTLP_ENDPOINT"in r}catch{return false}},binaryName:"flow-ai-obs",description:"AI usage telemetry and observability (hooks, OTEL, LLM proxy)",platforms:{darwin:{status:"supported",strategies:[{type:"npm",package:"@ciandt-flow/flow-ai-obs"}]},linux:{status:"supported",strategies:[{type:"npm",package:"@ciandt-flow/flow-ai-obs"}]},win32:{status:"supported",strategies:[{type:"npm",package:"@ciandt-flow/flow-ai-obs"}]}},versionCheck:{type:"npm-registry",package:"@ciandt-flow/flow-ai-obs"},versionCommand:["flow-ai-obs","--version"],hasOwnUpdateCheck:true,postInstall:{onboarding:e=>{let a=["flow-ai-obs","init","--no-interactive"];if(a.push("--custom-url",e.customUrl??ni),e.credentials){let{clientId:o,clientSecret:t,tenant:r}=e.credentials;a.push("--client-id",o,"--client-secret",t,"--tenant",r);}return e.customEmail&&a.push("--custom-email",e.customEmail),[a]},onDemand:null,mode:"non-interactive"}},Jb={alias:"dashboard",name:"ccboard",binaryName:"ccboard",description:"Claude Code session monitoring dashboard",docs:"https://github.com/FlorianBruniaux/ccboard",platforms:{darwin:{status:"supported",strategies:[{type:"homebrew",formula:"ccboard",tap:"FlorianBruniaux/tap"},{type:"curl",url:"https://raw.githubusercontent.com/FlorianBruniaux/ccboard/main/install.sh",mode:"script"}]},linux:{status:"supported",strategies:[{type:"curl",url:"https://raw.githubusercontent.com/FlorianBruniaux/ccboard/main/install.sh",mode:"script"}]},win32:{status:"experimental"}},versionCheck:{type:"github-releases",repo:"florianbruniaux/ccboard"},versionCommand:["ccboard","--version"],hasOwnUpdateCheck:false},ce=Co()?[Gi,Jb]:[Gi];Re();I();var _b=P("moduleState");function ji(){let e=process.env.FLOW_HOME??de__default.join(Ce__default.homedir(),".flow");return de__default.join(e,"modules.json")}var Xb={retries:5,minTimeout:50};async function _l(e,a){se__default.mkdirSync(de__default.dirname(e),{recursive:true});let o=await Vb.lock(e+".lock",{realpath:false,retries:Xb});try{return await a()}finally{await o();}}function Xl(){let e=ji();if(!se__default.existsSync(e))return [];try{let a=JSON.parse(se__default.readFileSync(e,"utf-8"));return a.schemaVersion!==1?(_b.warn(`modules.json has unknown schemaVersion ${a.schemaVersion}, resetting`),se__default.rmSync(e,{force:!0}),[]):Array.isArray(a.modules)?a.modules.map(o=>({...o,name:o.name??null})):[]}catch{return se__default.rmSync(e,{force:true}),[]}}function ot(){return Xl()}function Kl(e){let a=ji();se__default.mkdirSync(de__default.dirname(a),{recursive:true});let o=`${a}.${randomUUID()}.tmp`,t={schemaVersion:1,modules:e};se__default.writeFileSync(o,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),se__default.renameSync(o,a);}function ta(e){return ot().find(a=>a.alias===e)??null}async function Pa(e){let a=ji();await _l(a,async()=>{let o=Xl(),t=o.findIndex(r=>r.alias===e.alias);t===-1?o.push(e):o[t]=e,Kl(o);});}async function tt(){let e=ji();se__default.existsSync(e)||await _l(e,async()=>{se__default.existsSync(e)||Kl([]);});}var Yb=promisify(execFile);function Ro(e,a){let o=e.platforms[process.platform];return !o||o.status!=="supported"?null:o.strategies.find(t=>t.type===a)??null}async function Ga(e){let a=process.platform==="win32"?"where":"which";try{return await Yb(a,[e]),!0}catch{return false}}function Ya(){return process.platform==="win32"?"npm.cmd":"npm"}var $l=promisify(execFile),It=class{type="npm";async isAvailable(){return Ga("npm")}async install(a){let o=await this.getInstalledVersion(a);return o?{success:true,version:o,method:"npm",durationMs:0}:this.runNpmInstall(a,false)}async update(a,o){return this.runNpmInstall(a,true)}async getInstalledVersion(a){let o=Ro(a,"npm");if(!o)return null;try{let{stdout:t}=await $l(Ya(),["list","-g",o.package,"--depth=0","--json"],{shell:process.platform==="win32"});return JSON.parse(t).dependencies?.[o.package]?.version??null}catch{return null}}async uninstall(a){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async runNpmInstall(a,o){let t=Date.now(),r=Ro(a,"npm");if(!r)return {success:false,error:{code:"NPM_NOT_AVAILABLE",message:"No npm config for this module on this platform"},durationMs:Date.now()-t};let i=o?`${r.package}@latest`:r.package;try{return await $l(Ya(),["install","-g",i],{shell:process.platform==="win32"}),{success:!0,version:await this.getInstalledVersion(a)??void 0,method:"npm",durationMs:Date.now()-t}}catch(s){return {success:false,error:{code:"NPM_INSTALL_FAILED",message:s instanceof Error?s.message:String(s)},durationMs:Date.now()-t}}}};var Ui=promisify(execFile),tv=/^(\S+)\s+([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/,zi=class{type="homebrew";async isAvailable(){return Ga("brew")}async install(a){return this.runBrewCommand(a,"install")}async update(a,o){return this.runBrewCommand(a,"upgrade")}async getInstalledVersion(a){let o=Ro(a,"homebrew");return o?this.getVersionByFormula(o.formula):null}async uninstall(a){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async runBrewCommand(a,o){let t=Date.now(),r=Ro(a,"homebrew");if(!r)return {success:false,error:{code:"HOMEBREW_NOT_AVAILABLE",message:"No homebrew config for this module on this platform"},durationMs:Date.now()-t};let i=o==="install"?"HOMEBREW_INSTALL_FAILED":"HOMEBREW_UPGRADE_FAILED";try{return r.tap&&(await Ui("brew",["tap",r.tap]),await Ui("brew",["trust",r.tap])),await Ui("brew",[o,r.formula]),{success:!0,version:await this.getVersionByFormula(r.formula)??void 0,method:"homebrew",durationMs:Date.now()-t}}catch(s){return {success:false,error:{code:i,message:s instanceof Error?s.message:String(s)},durationMs:Date.now()-t}}}async getVersionByFormula(a){try{let{stdout:o}=await Ui("brew",["list","--versions",a]),t=o.trim().match(tv);return t?t[2]:null}catch{return null}}};var Tt=promisify(execFile),Zl=/([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/;function eu(){let e=process.env.FLOW_HOME??de__default.join(Ce__default.homedir(),".flow");return de__default.join(e,"bin")}var Wi=class{type="curl";async isAvailable(){return Ga("curl")}async install(a){let o=Date.now(),t=Ro(a,"curl");if(!t)return {success:false,error:{code:"CURL_NOT_AVAILABLE",message:"No curl config for this module on this platform"},durationMs:Date.now()-o};let r=typeof t.url=="function"?t.url(process.arch):t.url;return (t.mode??"binary")==="script"?this.installScript(r,t.checksumUrl,a,o):this.installBinary(r,t.checksumUrl,a,o)}async update(a,o){return this.install(a)}async getInstalledVersion(a){let o=de__default.join(eu(),de__default.basename(a.binaryName));for(let t of [o,a.binaryName])try{let{stdout:r}=await Tt(t,["--version"]),i=r.match(Zl);if(i)return i[1]}catch{}return null}async uninstall(a){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async installScript(a,o,t,r){if(!o)return {success:false,error:{code:"CHECKSUM_REQUIRED",message:`checksumUrl is required for script installs (${t.alias})`},durationMs:Date.now()-r};let i=de__default.join(Ce__default.tmpdir(),`flow-install-${randomUUID()}.sh`);try{if(await Tt("curl",["-sSL","--fail","-o",i,a]),o){let n=await this.validateChecksum(i,o);if(!n.valid){try{se__default.unlinkSync(i);}catch{}return {success:!1,error:{code:"CHECKSUM_MISMATCH",message:n.message},durationMs:Date.now()-r}}}return se__default.chmodSync(i,448),await Tt("bash",[i]),{success:!0,version:await this.getInstalledVersion(t)??void 0,method:"curl",durationMs:Date.now()-r}}catch(s){return {success:false,error:{code:"CURL_SCRIPT_FAILED",message:s instanceof Error?s.message:String(s)},durationMs:Date.now()-r}}finally{try{se__default.unlinkSync(i);}catch{}}}async installBinary(a,o,t,r){let i=eu(),s=de__default.join(i,de__default.basename(t.binaryName)),n=false;try{if(se__default.mkdirSync(i,{recursive:!0}),n=!0,await Tt("curl",["-L","--fail","-o",s,a]),o){let l=await this.validateChecksum(s,o);if(!l.valid)return se__default.unlinkSync(s),{success:!1,error:{code:"CHECKSUM_MISMATCH",message:l.message},durationMs:Date.now()-r}}se__default.chmodSync(s,493);let d=null;try{let{stdout:l}=await Tt(s,["--version"]),c=l.match(Zl);d=c?c[1]:null;}catch{}return {success:!0,version:d??void 0,method:"curl",durationMs:Date.now()-r}}catch(d){if(n)try{se__default.unlinkSync(s);}catch{}return {success:false,error:{code:"CURL_DOWNLOAD_FAILED",message:d instanceof Error?d.message:String(d)},durationMs:Date.now()-r}}}async validateChecksum(a,o){let t=de__default.join(Ce__default.tmpdir(),`curl-checksum-${randomUUID()}`);try{await Tt("curl",["-L","--fail","-o",t,o]);let r=se__default.readFileSync(t,"utf-8").trim().split(/\s+/)[0],i=se__default.readFileSync(a),s=createHash("sha256").update(i).digest("hex");return s!==r?{valid:!1,message:`SHA256 mismatch: expected ${r}, got ${s}`}:{valid:!0,message:""}}catch(r){return {valid:false,message:`Checksum validation failed: ${String(r)}`}}finally{try{se__default.unlinkSync(t);}catch{}}}};I();var au="0.0.0";try{let e=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8"));typeof e.version=="string"&&(au=e.version);}catch{}var re=au;var Te=P("moduleInstaller");function ja(e){switch(e){case "npm":return new It;case "homebrew":return new zi;case "curl":return new Wi}}async function Sr(e,a,o){try{await C(w.CLI_MODULE_INSTALL_FAILED,{module_alias:e.alias,module_name:e.name,os:process.platform,error_code:o.code,error_message:o.message,trigger:a});}catch(t){Te.warn(`Failed to emit install failed event: ${String(t)}`);}}async function xo(e,a,o,t,r,i){let s=Date.now(),n=e.platforms[process.platform];if(!n)return {success:false,error:{code:"PLATFORM_NOT_SUPPORTED",message:`Platform ${process.platform} is not listed for module ${e.alias}`},durationMs:Date.now()-s};if(n.status==="experimental"){Te.warn(`Module "${e.alias}" has experimental support on ${process.platform}`);let u={code:"PLATFORM_EXPERIMENTAL",message:`Experimental support on ${process.platform} \u2014 install manually`};return await Sr(e,a,u),{success:false,error:u,durationMs:Date.now()-s}}if(n.status!=="supported"){let u={code:"PLATFORM_NOT_SUPPORTED",message:`Module ${e.alias} is not supported on ${process.platform}`};return await Sr(e,a,u),{success:false,error:u,durationMs:Date.now()-s}}if(!n.strategies.some(u=>u.type===o)){let u={code:"STRATEGY_NOT_FOUND",message:`Strategy "${o}" is not configured for module "${e.alias}" on ${process.platform}`};return await Sr(e,a,u),{success:false,error:u,durationMs:Date.now()-s}}let d=ja(o),l=false;try{l=await d.isAvailable();}catch(u){Te.warn(`${o} availability check failed: ${String(u)}`);}if(!l){let u={code:"STRATEGY_NOT_AVAILABLE",message:`"${o}" is not installed on this system`};return await Sr(e,a,u),{success:false,error:u,durationMs:Date.now()-s}}try{await C(w.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:re,trigger:a});}catch(u){Te.warn(`Failed to emit install started event: ${String(u)}`);}let c;try{c=i?.forceLatest?await d.update(e,"unknown"):await d.install(e);}catch(u){let p=u instanceof Error?u.message:String(u);Te.warn(`${o} install threw: ${p}`),c={success:false,error:{code:"INSTALL_THREW",message:p},durationMs:Date.now()-s};}if(c.success){await Pa({alias:e.alias,name:e.name,installedVersion:c.version??null,installMethod:c.method??null,installedAt:new Date().toISOString(),lastChecked:new Date().toISOString()});try{await C(w.CLI_MODULE_INSTALL_COMPLETED,{module_alias:e.alias,module_name:e.name,installed_version:c.version??"unknown",duration_ms:c.durationMs,os:process.platform,trigger:a});}catch(m){Te.warn(`Failed to emit install completed event: ${String(m)}`);}let{pendingCmd:u,failed:p}=await lv(e,a,t,r);return u?{...c,pendingInteractiveSetup:u}:p?{...c,postInstallFailed:true}:e.configCheck&&!e.configCheck()?{...c,configCheckFailed:true}:c}return await Sr(e,a,c.error??{code:"UNKNOWN",message:"unknown error"}),c}async function lv(e,a,o,t){if(!e.postInstall)return {pendingCmd:null,failed:false};let r=a==="onboarding"?e.postInstall.onboarding:e.postInstall.onDemand;if(r==null)return {pendingCmd:null,failed:false};let i;if(typeof r=="function"){let n=await Y(),d={credentials:n?{clientId:n.clientId,clientSecret:n.clientSecret,tenant:n.tenant}:null,customUrl:o??null,customEmail:t??null};try{i=r(d);}catch(l){return Te.warn(`postInstall function threw: ${String(l)}`),{pendingCmd:null,failed:false}}}else i=r;if(i.length===0)return {pendingCmd:null,failed:false};if((e.postInstall.mode??"non-interactive")==="interactive")return {pendingCmd:i[0]??null,failed:false};let s=false;for(let n=0;n<i.length;n++){let d=i[n];if(d.length===0)continue;let l=spawnSync(d[0],d.slice(1),{stdio:"pipe",env:process.env,encoding:"utf-8",shell:process.platform==="win32"});if(l.status!==0){s=true,Te.warn(`postInstall "${d.join(" ")}" exited with status ${l.status??"null"}`),l.stderr&&Te.warn(l.stderr);let c=i.slice(n+1).filter(u=>u.length>0);c.length>0&&Te.debug(`continuing with remaining postInstall steps: ${c.map(u=>u.join(" ")).join(", ")}`);}}return {pendingCmd:null,failed:s}}async function Ji(e,a){let o=Date.now(),t=ta(e.alias);if(!t?.installMethod)return {success:false,error:{code:"NOT_INSTALLED",message:`Module '${e.alias}' is not installed`},durationMs:Date.now()-o};let r=ja(t.installMethod),i=t.installedVersion??"unknown";if(a==="command")try{await C(w.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:re,trigger:"command"});}catch(n){Te.warn(`Failed to emit update started event: ${String(n)}`);}let s;try{s=await r.update(e,i);}catch(n){let d=n instanceof Error?n.message:String(n);Te.warn(`${t.installMethod} update threw: ${d}`),s={success:false,error:{code:"UPDATE_THREW",message:d},durationMs:Date.now()-o};}if(s.success)if(await Pa({...t,installedVersion:s.version??t.installedVersion,lastChecked:new Date().toISOString()}),a==="command")try{await C(w.CLI_MODULE_INSTALL_COMPLETED,{module_alias:e.alias,module_name:e.name,installed_version:s.version??"unknown",duration_ms:s.durationMs,os:process.platform,trigger:"command"});}catch(n){Te.warn(`Failed to emit update completed event: ${String(n)}`);}else try{await C(w.CLI_MODULE_UPDATED,{module_alias:e.alias,from_version:i,to_version:s.version??"unknown",duration_ms:s.durationMs});}catch(n){Te.warn(`Failed to emit module updated event: ${String(n)}`);}else if(a==="command")try{await C(w.CLI_MODULE_INSTALL_FAILED,{module_alias:e.alias,module_name:e.name,os:process.platform,error_code:s.error?.code??"UNKNOWN",error_message:s.error?.message??"unknown error",trigger:"command"});}catch(n){Te.warn(`Failed to emit update failed event: ${String(n)}`);}return s}I();var Hi=P("flowAiObsSetup");async function Qi(e,a){try{if(!await new It().isAvailable().catch(()=>!1))return Hi.warn("npm not available \u2014 skipping flow-ai-obs install"),{npmFailed:!0,initFailed:!1};let r=await xo(Gi,"onboarding","npm",e,a,{forceLatest:!0});return r.success?r.postInstallFailed||r.configCheckFailed?(Hi.debug("flow-ai-obs init failed (postInstall exit non-zero or configCheck failed)"),{npmFailed:!1,initFailed:!0}):{npmFailed:!1,initFailed:!1}:(Hi.warn(`flow-ai-obs install failed: ${r.error?.message??"unknown"}`),{npmFailed:!0,initFailed:!1})}catch(o){return Hi.warn(`installFlowAiObs threw: ${String(o)}`),{npmFailed:false,initFailed:false,unexpectedError:true}}}I();function ou(e){if(!(e instanceof Error))return "unknown";let a=e.message.toLowerCase();return a.includes("401")||a.includes("unauthorized")?"invalid_credentials":a.includes("403")||a.includes("forbidden")?"forbidden":a.includes("timeout")||a.includes("timed out")?"timeout":a.includes("network")||a.includes("econnrefused")||a.includes("fetch")?"network_error":"unknown"}var uv=P("useAuthSetup");function tu(){let[e,a]=useState(""),o=useRef(null),t=useRef(null),r=useRef(null),[i,s]=useState(),[n,d]=useState(null),[l,c]=useState(false),[u,p]=useState("fields"),[m,g]=useState(null),f=useRef(0),h=useRef(false),{setCredentials:v,setJustAuthenticated:k}=oa(),T=()=>{p("fields"),g(null),a(""),o.current=null,t.current=null,r.current=null;},L=()=>{C(w.CLI_SESSION_STARTED,{cli_version:re,os:process.platform,node_version:process.version,duration_ms:Do(),interface:"tui"}).catch(()=>{});},A=async W=>{h.current=true;let _={...o.current,customUrl:t.current??void 0};try{W&&Ni(W),await ko(_);}catch(Q){d(Q instanceof Error?Q.message:"Failed to persist credentials"),T(),h.current=false;return}let{clientSecret:E,...B}=_;v(B),k(true),L(),await Qi(t.current,r.current).catch(Q=>uv.warn(`installFlowAiObs threw unexpectedly: ${String(Q)}`)),Vi({starterKit:B.starterKit});},M=async()=>A(),F=async W=>A(W),O=W=>{try{let _={...o.current,customUrl:t.current??void 0};return Oi(_,{allowOverwriteMalformed:W,jwtOverride:e.trim()})}catch(_){return _ instanceof at?(p("malformedConfirm"),null):(d(_ instanceof Error?_.message:"Failed to read settings.json"),p("fields"),null)}},oe=()=>{let W=O(true);W&&(g(W),F(W));},x=async()=>{let W=e.trim();if(!W){s("This field is required");return}let _;try{_=wr(W);}catch(E){s(E instanceof Error?E.message:"Invalid JWT");return}s(void 0),o.current=_,p("customUrl");},J=W=>{t.current=W,p("email");},ae=W=>{r.current=W,z();},z=async()=>{let W=t.current;W&&La(W),c(true),d(null),f.current+=1;try{await Xo(o.current);let _=O(!1);_&&(g(_),p("preview"));}catch(_){let E=_ instanceof Error?_.message:"Authentication failed";d(E),Il(w.CLI_AUTH_FAILED,{error_code:ou(_),attempt:f.current},o.current.tenant).catch(()=>{}),a(""),o.current=null,p("fields");}finally{c(false);}};return {jwtValue:e,jwtError:i,authError:n,isSubmitting:l,step:u,plan:m,isCommittingRef:h,setJwtValue:a,setJwtError:s,cancelToFields:T,handleSubmit:x,goToEmailStep:J,handleEmailConfirm:ae,commitAndProceed:F,skipJwtAndProceed:M,planPersistOverwrite:oe}}U();j();function ru(){let{jwtValue:e,jwtError:a,authError:o,isSubmitting:t,step:r,plan:i,isCommittingRef:s,setJwtValue:n,setJwtError:d,cancelToFields:l,handleSubmit:c,goToEmailStep:u,handleEmailConfirm:p,commitAndProceed:m,skipJwtAndProceed:g,planPersistOverwrite:f}=tu(),[h,v]=useState("confirm"),[k,T]=useState(""),L=useRef(""),[A,M]=useState(false);return useEffect(()=>{r==="customUrl"&&(v("confirm"),L.current="",T(""),M(false));},[r]),useInput((F,O)=>{if(!(t||s.current)){if(r==="preview"){O.return&&i?m(i):O.escape?g():F==="q"&&l();return}if(r==="malformedConfirm"){O.return?f():O.escape&&l();return}if(r==="customUrl"){if(h==="confirm")F==="y"||F==="Y"?v("input"):(F==="n"||F==="N"||O.return)&&u(null);else if(O.escape)L.current="",T(""),v("confirm");else if(O.return){let oe=L.current.trim();oe.length>0&&ht.test(oe)?(M(false),u(oe)):oe.length>0&&M(true);}else O.backspace||O.delete?(L.current=L.current.slice(0,-1),T(L.current)):F&&!O.ctrl&&!O.meta&&(L.current=L.current+F,T(L.current),M(false));return}r!=="email"&&O.return&&c();}},{isActive:true}),r==="customUrl"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[fo," \u2014 Initial Setup"]})}),jsxs(Box,{flexDirection:"column",gap:1,children:[t&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),!t&&h==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),!t&&h==="input"&&jsxs(Box,{flexDirection:"column",gap:1,children:[jsx(Text,{children:"Enter your custom Flow base URL:"}),jsxs(Box,{children:[jsx(Text,{color:"cyan",children:"> "}),jsx(Text,{children:k}),jsx(Text,{color:"cyan",children:"\u2588"})]}),A&&jsx(Text,{color:"red",children:bt}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})]}):r==="email"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[fo," \u2014 Initial Setup"]})}),t?jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}):jsx(Gl,{onConfirm:p})]}):r==="preview"&&i?jsx(Bl,{plan:i}):r==="malformedConfirm"?jsx(jl,{}):jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[fo," \u2014 Initial Setup"]})}),jsxs(Box,{marginBottom:1,flexDirection:"column",children:[jsx(Text,{dimColor:true,children:"The data collected during setup is used solely to improve"}),jsx(Text,{dimColor:true,children:"Flow's internal tools and will not be shared externally."})]}),jsx(Box,{flexDirection:"column",children:jsx(Box,{marginBottom:1,children:jsx(Nl,{label:"JWT",value:e,onChange:F=>{n(F),a&&d(void 0);},masked:true,isActive:!t,error:a})})}),t&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),o&&jsx(Box,{marginTop:1,children:jsxs(Text,{color:"red",children:["\u26A0 ",b(o)]})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter confirm"})})]})}function qt(){return jsxs(Box,{flexDirection:"column",alignItems:"center",children:[jsx(hv,{text:"FLOW",font:"block",colors:["white","white"]}),jsx(Box,{marginTop:-1,marginBottom:1,children:jsxs(Text,{dimColor:true,children:["Marketplace \xB7 v",re]})})]})}var du=[{id:"discover",focus:"list"},{id:"installed",focus:"list"},{id:"updates",focus:"list"},{id:"marketplaces",focus:"marketplaces"}],ie=Co()?du:du.slice(0,3);function bv(e){return ie.findIndex(a=>a.id===e)}function sd(e,a,o){let t=bv(o.activeTab);if(a.rightArrow||a.tab){let r=ie[(t+1)%ie.length];return [{type:"setTab",tab:r.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:r.focus}]}if(a.leftArrow){let r=ie[(t-1+ie.length)%ie.length];return [{type:"setTab",tab:r.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:r.focus}]}return a.downArrow?[{type:"setFocus",focus:ie[t]?.focus??"list"}]:[]}var uu={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function pu({outdatedCount:e=0}){let a=y(o=>o.activeTab);return jsx(Box,{paddingX:1,paddingBottom:1,children:ie.map(({id:o})=>{let t=o===a,r=o==="updates"&&e>0?`${uu[o]} (${e})`:uu[o];return jsx(Box,{marginRight:1,children:t?jsx(Text,{bold:true,inverse:true,children:` ${r} `}):jsx(Text,{dimColor:true,children:` ${r} `})},o)})})}var _e=create(e=>({query:"",cursorPosition:0,setQuery:a=>e({query:a}),setCursorPosition:a=>e({cursorPosition:a}),resetQuery:()=>e({query:"",cursorPosition:0})}));function gu(){let e=y(s=>s.focus),a=_e(s=>s.query),o=_e(s=>s.cursorPosition),t=e==="search",r=a.slice(0,o),i=a.slice(o);return jsxs(Box,{borderStyle:"single",borderTop:false,borderBottom:true,borderLeft:false,borderRight:false,paddingX:1,marginX:1,marginBottom:1,children:[jsx(Text,{color:t?"cyan":"gray",children:"\u{1F50D} "}),t?jsxs(Fragment,{children:[jsx(Text,{color:"white",children:r}),jsx(Text,{inverse:true,children:i[0]??" "}),jsx(Text,{color:"white",children:i.slice(1)})]}):jsx(Text,{dimColor:true,children:a||"Search..."})]})}U();var fu=Object.keys(ho).map((e,a)=>({key:a<3?String(a+2):String((a+5)%10),type:e,...ho[e]})),hu=["internal","external"].map((e,a)=>({key:String(a+6),origin:e,...Zc[e]}));function bu(){let e=y(t=>t.catalogFilters),a=fu.every(t=>e.types.has(t.type)),o=hu.every(t=>e.origins.has(t.origin));return jsxs(Box,{paddingX:1,paddingBottom:1,gap:1,flexWrap:"wrap",children:[jsx(Text,{bold:true,children:"Type:"}),jsxs(Box,{gap:0,children:[jsx(Text,{dimColor:true,children:"[1] "}),jsxs(Text,{color:a?"green":void 0,dimColor:!a,children:[a?"\u25C9":"\u25CB"," All"]})]}),fu.map(t=>{let r=!a&&e.types.has(t.type);return jsxs(Box,{gap:0,children:[jsxs(Text,{dimColor:true,children:["[",t.key,"] "]}),jsxs(Text,{color:r?t.color:void 0,dimColor:!r,children:[r?"\u25C9":"\u25CB"," ",t.label]})]},t.key)}),jsx(Box,{marginLeft:2,children:jsx(Text,{bold:true,children:"|"})}),jsx(Box,{marginLeft:2,children:jsx(Text,{bold:true,children:"Origin:"})}),jsxs(Box,{gap:0,children:[jsx(Text,{dimColor:true,children:"[5] "}),jsxs(Text,{color:o?"green":void 0,dimColor:!o,children:[o?"\u25C9":"\u25CB"," All"]})]}),hu.map(t=>{let r=!o&&e.origins.has(t.origin);return jsxs(Box,{gap:0,children:[jsxs(Text,{dimColor:true,children:["[",t.key,"] "]}),jsxs(Text,{color:r?t.color:void 0,dimColor:!r,children:[r?"\u25C9":"\u25CB"," ",t.label]})]},t.key)})]})}U();function vu({type:e}){let{label:a,color:o}=ho[e];return jsx(Text,{color:o,children:a})}U();function Pu({origin:e}){return e===dr?jsx(Text,{color:"blue",children:"[Flow]"}):jsx(Text,{color:"white",children:"[External]"})}j();var Xi=wv.memo(function({item:a,isSelected:o}){let t=a.status==="disabled"?"yellow":"green";return jsxs(Box,{flexDirection:"column",paddingBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u203A ":"\u25CB "}),jsx(Text,{bold:o,color:o?"cyan":"white",children:a.name}),a.type&&jsxs(Text,{children:[" ",jsx(vu,{type:a.type})]}),a.origin&&jsxs(Text,{children:[" ",jsx(Pu,{origin:a.origin})]}),jsxs(Text,{dimColor:true,children:[a.authorName?` \xB7 ${a.authorName}`:"",a.version?` \xB7 v${a.version}`:" \xB7 n/a"]}),a.status&&jsxs(Text,{color:t,children:[" [",a.status,"]"]}),a.updateAvailable&&jsx(Text,{color:"yellow",children:" [\u2191 update available]"}),a.installedAt&&jsxs(Text,{dimColor:true,children:[" \xB7 ",qa(a.installedAt)]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:a.description})})]})});function Lt({message:e}){return jsx(Box,{paddingX:2,paddingY:1,children:jsx(Text,{dimColor:true,children:e??"No items found."})})}U();function Su({items:e,emptyMessage:a}){let o=y(d=>d.selectedIndex);if(e.length===0)return jsx(Lt,{message:a});let t=Math.max(0,o-Math.floor(ea/2)),r=Math.min(e.length,t+ea);r===e.length&&(t=Math.max(0,r-ea));let i=e.slice(t,r),s=t,n=e.length-r;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:s>0?`\u2191 ${s} more above`:" "})}),i.map((d,l)=>jsx(Xi,{item:d,isSelected:t+l===o},d.name)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:n>0?`\u2193 ${n} more below`:" "})})]})}function Au({label:e,pathHint:a}){return jsxs(Box,{paddingBottom:1,children:[jsx(Text,{bold:true,color:"blueBright",children:e}),jsxs(Text,{dimColor:true,children:[" ",a]})]})}U();function Eu({groups:e,emptyMessage:a}){let o=y(m=>m.selectedIndex),t=[],r=0;for(let m of e){t.push({kind:"header",label:m.label,pathHint:m.pathHint,key:`h-${m.scope}`});for(let g of m.items)t.push({kind:"item",item:g,itemIndex:r,key:`i-${m.scope}-${g.name}-${g.marketplace??""}`}),r++;}if(r===0)return jsx(Lt,{message:a});let s=t.findIndex(m=>m.kind==="item"&&m.itemIndex===o),n=s>=0?s:0,d=Math.max(0,n-Math.floor(ea/2)),l=Math.min(t.length,d+ea);l===t.length&&(d=Math.max(0,l-ea));let c=t.slice(d,l),u=d,p=t.length-l;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:u>0?`\u2191 ${u} more above`:" "})}),c.map(m=>m.kind==="header"?jsx(Au,{label:m.label,pathHint:m.pathHint},m.key):jsx(Xi,{item:m.item,isSelected:m.itemIndex===o},m.key)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:p>0?`\u2193 ${p} more below`:" "})})]})}var Tv={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function Mv({items:e,tabId:a,emptyMessage:o,groups:t,actionHint:r}){return jsxs(Box,{flexDirection:"column",children:[jsx(gu,{}),jsx(bu,{}),jsxs(Box,{paddingX:1,marginTop:1,children:[jsx(Text,{bold:true,children:Tv[a]}),jsxs(Text,{dimColor:true,children:[" (",e.length,")"]}),r&&e.length>0&&jsx(Text,{dimColor:true,children:` \xB7 ${r}`})]}),t&&t.length>0?jsx(Eu,{groups:t,emptyMessage:o}):jsx(Su,{items:e,emptyMessage:o})]})}function Iu({filteredItems:e,emptyMessage:a,groups:o,onBatchUpdate:t}){let r=y(d=>d.activeTab),i=y(d=>d.focus);return useInput(d=>{d==="a"&&e.length>0&&t?.();},{isActive:r==="updates"&&i==="list"}),jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(Mv,{items:e,tabId:r,emptyMessage:a,groups:r!=="discover"?o:void 0,actionHint:r==="updates"?"press 'a' to update all":void 0},r)})}var Fv={tabs:"\u2190\u2192: switch tab | \u2193: navigate | Enter: select | Ctrl+C Ctrl+C: quit",list:"\u2191\u2193: navigate | Enter: select | Type: 1=All 2=Skill 3=MCP 4=Bundle | Origin: 5=All 6=Flow 7=External | \u2190\u2192/Tab: tabs | Ctrl+C\xD72: quit",search:"Type to filter | \u2193/Esc: exit search | Enter: confirm",actionMenu:"\u2191\u2193: navigate options | Enter: confirm | Esc: close menu",auth:"Tab: next field | Enter: confirm | Ctrl+C Ctrl+C: quit",starterKitList:"\u2191\u2193: navigate | Enter: select Starter Kit | Esc: skip",starterKitDetail:"\u2191\u2193: navigate | Enter: confirm & install | Esc: back",installProgress:"\u2191\u2193: navigate | Enter: select",moduleSetup:"\u2191\u2193: navigate | Space: toggle | Tab: change method | Enter: confirm",marketplaces:"\u2191\u2193: navigate | a: add catalog | d: remove catalog | r: refresh | \u2190\u2192/Tab: tabs | Ctrl+C\xD72: quit",verify:"\u2191\u2193: navigate | Enter: confirm | Ctrl+C Ctrl+C: quit",bundleInstallProgress:"Enter/Esc: back to catalog"};function Ki(){let e=y(o=>o.focus),a=!!process.env.DEBUG;return jsx(Box,{borderStyle:"single",borderTop:true,borderBottom:false,borderLeft:false,borderRight:false,children:jsxs(Text,{dimColor:true,children:[Fv[e],a?" | Ctrl+D: debug log":""]})})}j();function Tu({message:e,type:a}){return e?jsx(Box,{paddingX:1,children:jsxs(Text,{color:a==="success"?"green":a==="info"?"cyan":"red",children:[a==="success"?"\u2713":a==="info"?"(i)":"\u2717"," ",b(e)]})}):null}function $i({message:e}){return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{children:[" ",e]})]})}function md(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}var Fu=20;function Yi(e,a){let o=a>0?Math.min(e/a,1):0,t=Math.round(o*100),r=Math.round(o*Fu),i="\u2588".repeat(r)+"\u2591".repeat(Fu-r),s=`${md(e)} / ${md(a)}`;return {bar:i,percent:t,label:s}}function Zi({received:e,total:a}){let{bar:o,percent:t,label:r}=Yi(e,a);return jsxs(Text,{dimColor:true,children:[o," ",t,"%"," ","(",r,")"]})}function es({message:e,onRetry:a,onBack:o}){return useInput((t,r)=>{t==="r"&&r.ctrl&&a?a():r.escape&&o&&o();}),jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsxs(Text,{color:"red",children:["\u2717 ",e]}),a&&jsx(Text,{dimColor:true,children:"Press Ctrl+R to retry"}),o&&jsx(Text,{dimColor:true,children:"Press Escape to go back"})]})}function ra({itemName:e,actions:a,descriptions:o,onAction:t,onClose:r}){let i=y(d=>d.focus),[s,n]=useState(0);return useInput((d,l)=>{l.upArrow?n(c=>c>0?c-1:c):l.downArrow?n(c=>c<a.length-1?c+1:c):l.return?t(a[s]):l.escape&&r();},{isActive:i==="actionMenu"}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:e}),jsx(Box,{flexDirection:"column",marginTop:1,children:a.map((d,l)=>jsxs(Box,{children:[jsxs(Text,{bold:l===s,color:l===s?"cyan":void 0,children:[l===s?"\u203A ":" ",d]}),o?.[d]&&jsxs(Text,{dimColor:true,children:[" \u2014 ",o[d]]})]},l))})]})}U();var bd=Object.entries(Xa),Bu=[...bd.map(([,e])=>e.actionLabel),"Cancel"],ju=Object.fromEntries(bd.map(([,e])=>[e.actionLabel,e.description]));function Uu(e){let a=bd.find(([,o])=>o.actionLabel===e);return a?a[0]:null}I();var Kv=P("provider.registry"),$v=3e4,os=class{adapters=new Map;availabilityCache=new Map;register(a){this.adapters.set(a.id,a);}async checkAvailability(a){let o=this.availabilityCache.get(a.id);if(o&&Date.now()<o.expiresAt)return o.result;let t=await a.isAvailable();return this.availabilityCache.set(a.id,{result:t,expiresAt:Date.now()+$v}),t}async getAvailableProviders(a){let o=[...this.adapters.values()].filter(r=>a in r.installers),t=await Promise.allSettled(o.map(r=>this.checkAvailability(r)));return t.forEach((r,i)=>{r.status==="rejected"&&Kv.warn(`Provider "${o[i].id}" isAvailable() threw: ${String(r.reason)}`);}),o.filter((r,i)=>{let s=t[i];return s.status==="fulfilled"&&s.value===true})}getAdapter(a){return this.adapters.get(a)}listAdapters(){return [...this.adapters.values()]}};var Yv={user:"global",project:"project",local:"local"};function ts(e){return e?Yv[e]:"global"}var Xe=class extends Error{constructor(o,t){super(`${o} v${t} is already installed. Use --force to reinstall.`);this.pluginName=o;this.version=t;this.name="AlreadyInstalledError";}pluginName;version},Io=class extends Error{constructor(o,t){super(`${o} is already up to date (v${t})`);this.pluginName=o;this.version=t;this.name="AlreadyUpToDateError";}pluginName;version};xr();vd();I();var ay=P("catalog.registry"),rs=class{adapters=new Map;register(a){this.adapters.set(a.id,a);}unregister(a){this.adapters.delete(a);}async fetchAllWithErrors(){let a=this.listAdapters(),o=await Promise.allSettled(a.map(i=>i.fetchItems())),t=[],r=[];for(let i=0;i<o.length;i++){let s=o[i],n=a[i];if(s.status==="fulfilled")t.push(...s.value);else {let d=String(s.reason);ay.warn(`Catalog adapter failed: ${d}`),r.push({adapterId:n.id,adapterName:n.name,reason:d});}}return {items:t,failures:r}}async fetchAll(){let{items:a}=await this.fetchAllWithErrors();return a}getAdapter(a){return this.adapters.get(a)}listAdapters(){return [...this.adapters.values()]}};Oe();var cy={retries:5,minTimeout:50};async function yd(e,a){mkdirSync(dirname(e),{recursive:true});let o=await Vb.lock(e+".lock",{realpath:false,retries:cy});try{return await a()}finally{await o();}}var is=class{filePath;constructor(a){this.filePath=a??il();}async read(){try{let a=await readFile(this.filePath,"utf-8");return JSON.parse(a).catalogs??[]}catch(a){if(a.code==="ENOENT")return [];throw a}}async write(a){let o=dirname(this.filePath);await mkdir(o,{recursive:true});let t=`${this.filePath}.${randomUUID()}.tmp`;await writeFile(t,JSON.stringify({catalogs:a},null,2),"utf-8"),await rename(t,this.filePath);}async add(a){await yd(this.filePath,async()=>{let o=await this.read();if(o.some(r=>r.id===a.id))return;let t={...a,lastUpdated:a.lastUpdated??new Date().toISOString()};await this.write([...o,t]);});}async remove(a){if(a==="flow-api")throw new Error("The Flow Marketplace catalog cannot be removed");await yd(this.filePath,async()=>{let o=await this.read();await this.write(o.filter(t=>t.id!==a));});}async updateField(a,o){await yd(this.filePath,async()=>{let t=await this.read();t.some(r=>r.id===a)&&await this.write(t.map(r=>r.id===a?{...r,...o}:r));});}};Pd();var ge=new rs,ao=new is,yy=["flow-harness"];function ky(){let e=process.env.FLOW_CONTENT_SOURCES;return e===void 0?yy:e.split(",").map(a=>a.trim()).filter(Boolean)}ge.register(new Ut);for(let e of ky())ge.register(new Ut(e));var $u=false;async function Yu(){if($u)return;$u=true;let e=await ao.read(),{GitRepoAdapter:a}=await Promise.resolve().then(()=>(Dd(),Ku));for(let o of e)ge.register(new a(o.id,o.name,o.source));}To();var Zu=2;async function oo(e){if(e){let{FlowApiAdapter:a}=await Promise.resolve().then(()=>(Pd(),Ju));return new a(e).fetchItems()}return ge.fetchAll()}async function ep(){return ge.fetchAllWithErrors()}async function Wt(e,a){Er(e);try{return await Ot(`v1/plugins/${e}/manifest`,a).json()}catch(o){let t=await Nt(o);throw t?new Error(t):o instanceof Error?o.message.includes("404")?new Error(`Plugin '${e}' not found in catalog`):o.message.includes("timeout")?new Error("Download timed out after 30s"):new Error(`Failed to fetch plugin manifest: ${o.message}`):o}}async function ap(e,a,o){Er(e);try{let t=await Ot(`v1/plugins/${e}/archive`,o),r=t.headers.get("x-archive-size"),i=r?Number(r):NaN,s=Number.isFinite(i)&&i>0?i:0,n=s>0,d=t.body;if(!d)throw new Error("Failed to download plugin: response has no body");let l=d.getReader(),c=[],u=0;for(;;){let{done:p,value:m}=await l.read();if(p)break;if(u+=m.byteLength,n&&u>s*Zu)throw await l.cancel(),new Error(`Download exceeded expected size: received ${u} bytes, expected at most ${s*Zu}`);c.push(m),n&&a?.(u,s);}return Buffer.concat(c)}catch(t){if(t instanceof Error&&t.message.includes("Download exceeded expected size"))throw t;let r=await Nt(t);throw r?new Error(r):t instanceof Error?new Error(`Failed to download plugin: ${t.message}`):t}}async function ns(){try{let{profiles:e}=await eo().get("v1/plugins/profiles").json();return e}catch(e){throw e instanceof Error?e.message.includes("401")||e.message.includes("403")?new Error("Authentication failed. Run: flow auth login"):e.message.includes("timeout")?new Error("Request timed out while fetching starter kits"):new Error(`Failed to fetch starter kits: ${e.message}`):e}}Oe();Oe();async function op(e,a){let o=de.resolve(a);await Ua.mkdir(o,{recursive:true});let t=de.join(de.dirname(o),`${randomUUID()}.zip`);try{await Ua.writeFile(t,e);let r=await Dy.Open.file(t),i=de.normalize(o+de.sep);for(let s of r.files){if((s.externalFileAttributes>>16&61440)===40960)throw new Error(`Zip Slip (symlink): entry "${s.path}" is a symbolic link and was rejected`);let d=de.resolve(o,s.path);if(process.platform==="win32"&&d.length>=260)throw new Error(`Path too long: "${d}" (${d.length} chars) meets or exceeds the 260-character Windows MAX_PATH limit. Enable Long Paths in Windows or move the Claude plugin cache to a shorter base path.`);if(!d.startsWith(i)&&d!==o)throw new Error(`Zip Slip detected: entry "${s.path}" would escape target directory`)}await r.extract({path:o});try{let s=realpathSync(o);if(!s.startsWith(de.resolve(de.dirname(o))))throw new Error(`Zip Slip (post-extract): resolved path "${s}" is outside expected parent`)}catch(s){if(s.code!=="ENOENT")throw s}}finally{try{await Ua.unlink(t);}catch{}}}async function wd(e){await Ua.rm(e,{recursive:true,force:true});}async function Mo(){let e=tl();await Ua.mkdir(de.dirname(e),{recursive:true});try{await Ua.writeFile(e,"",{flag:"wx"});}catch(o){if(o.code!=="EEXIST")throw o}return await Vb.lock(e,{stale:1e4,retries:{retries:2,minTimeout:500,maxTimeout:500}})}Oe();U();function Cy(e){return {$schema:"https://anthropic.com/claude-code/marketplace.schema.json",name:e||pe,description:"Flow Skills marketplace",owner:{name:"Flow Team",email:"flow@ciandt.com"},plugins:[]}}function ip(e){let a=ui(e);if(!se__default.existsSync(a))return null;try{return JSON.parse(se__default.readFileSync(a,"utf-8"))}catch{return null}}function Ry(e){let a=ip(e);if(a)return a;let o=Cy(e),t=ui(e);return se__default.mkdirSync(de__default.dirname(t),{recursive:true}),Sd(o,e),o}function Sd(e,a){let o=ui(a),t=`${o}.${randomUUID()}.tmp`;se__default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),se__default.renameSync(t,o);}function Ay(e){let a=e||pe,o=Jo(),t={};try{se__default.existsSync(o)&&(t=JSON.parse(se__default.readFileSync(o,"utf-8")));}catch{t={};}if(t[a])return;t[a]={source:{source:"github",repo:`cit-flow/${a}`},installLocation:ol(e),lastUpdated:new Date().toISOString(),autoUpdate:true};let r=`${o}.${randomUUID()}.tmp`;se__default.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),se__default.renameSync(r,o);}function sp(e,a,o){ia(e.name),Ay(o);let t=Dn(e.name,o);se__default.mkdirSync(de__default.dirname(t),{recursive:true});try{se__default.lstatSync(t),se__default.rmSync(t,{recursive:!0,force:!0});}catch{}se__default.cpSync(a,t,{recursive:true,dereference:true});let r=Ry(o);r.plugins.some(s=>s.name===e.name)||(r.plugins.push({name:e.name,description:e.description,version:e.version,author:e.author,source:`./plugins/native/${e.name}`,category:e.category}),Sd(r,o));}function Cd(e,a){ia(e);let o=Dn(e,a);try{se__default.rmSync(o,{recursive:!0,force:!0});}catch{}let t=ip(a);if(!t)return;let r=t.plugins.length;t.plugins=t.plugins.filter(i=>i.name!==e),t.plugins.length!==r&&Sd(t,a);}j();I();var Ey=P("mcpConfigReader"),Iy=500,Ty=512;function My(){return de__default.join(Ce__default.homedir(),".claude.json")}function qy(){return de__default.join(process.cwd(),".mcp.json")}function dp(e){if(!se__default.existsSync(e))return null;try{return JSON.parse(se__default.readFileSync(e,"utf-8"))}catch{return Ey.debug(`[mcpConfigReader] Failed to parse ${e}`),null}}function Ir(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Rd(e){if(!Ir(e))return {};let a=e.mcpServers;return Ir(a)?a:{}}function Ad(e,a){return Object.keys(e).slice(0,Iy).map(t=>({name:b(t.slice(0,Ty)),marketplace:"",version:void 0,installedAt:"",installPath:"",scope:a,description:void 0,author:void 0,status:"enabled",type:"mcp"}))}function lp(){let e=[],a=My(),o=dp(a);if(Ir(o)){let n=o,d=Rd(n);e.push(...Ad(d,"user"));let l=process.cwd();if(Ir(n.projects)){let c=n.projects[l];if(Ir(c)){let u=Rd(c);e.push(...Ad(u,"local"));}}}let t=qy(),r=dp(t),i=Rd(r);e.push(...Ad(i,"project"));let s=new Map;for(let n of e){let d=`${n.name}@${n.scope}`;s.has(d)||s.set(d,n);}return [...s.values()]}I();var sa=P("storage");async function Fy(e,a,o){try{await C(w.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:o,source:a,interface:Z().interfaceType});}catch(t){sa.warn(`Failed to send uninstall metrics: ${String(t)}`);}}function Oy(e,a,o){let t=a==="enabled"?w.CLI_TOOL_ENABLED:w.CLI_TOOL_DISABLED;C(t,{tool_id:e,source:o,interface:Z().interfaceType}).catch(r=>sa.warn(`Failed to send ${a} metrics: ${String(r)}`));}function Td(){return de__default.join(Ce__default.homedir(),".claude","plugins","installed_plugins.json")}function Ny(){return de__default.join(Ce__default.homedir(),".claude","plugins")}function ds(e){let a;try{a=se__default.realpathSync(e);}catch{a=de__default.resolve(e);}let o=de__default.resolve(Ny()),t=de__default.resolve(de__default.join(process.cwd(),".claude","plugins")),r=a.startsWith(o+de__default.sep),i=a.startsWith(t+de__default.sep);if(!r&&!i)throw new Error(`Security error: installPath '${e}' is outside the plugins directory`)}function pp(e="user"){return e==="local"?de__default.join(process.cwd(),".claude","settings.local.json"):e==="project"?de__default.join(process.cwd(),".claude","settings.json"):de__default.join(Ce__default.homedir(),".claude","settings.json")}function Ae(){let e=Td();if(!se__default.existsSync(e))return {version:2,plugins:{}};try{return JSON.parse(se__default.readFileSync(e,"utf-8"))}catch{return {version:2,plugins:{}}}}async function Md(){let e=Td();try{let a=await se__default.promises.readFile(e,"utf-8");return JSON.parse(a)}catch{return {version:2,plugins:{}}}}function Gy(e){let a=e?.code;return a==="EACCES"||a==="EPERM"}function mp(e,a){try{se__default.mkdirSync(de__default.dirname(e),{recursive:!0});let o=`${e}.${randomUUID()}.tmp`;se__default.writeFileSync(o,JSON.stringify(a,null,2),{encoding:"utf-8",mode:384}),se__default.renameSync(o,e);}catch(o){throw Gy(o)?new Error(`Permission denied: cannot write to '${e}'. Check your file system permissions.`):o}}function na(e){mp(Td(),e);}function Tr(e){let a=e.lastIndexOf("@");return a===-1?{name:e,marketplace:""}:{name:e.slice(0,a),marketplace:e.slice(a+1)}}function By(e,a){let o=de__default.join(e,".claude-plugin"),t=de__default.join(o,"plugin.json");if(se__default.existsSync(t))try{return JSON.parse(se__default.readFileSync(t,"utf-8"))}catch{return null}let r=de__default.join(o,"marketplace.json");if(se__default.existsSync(r))try{let i=JSON.parse(se__default.readFileSync(r,"utf-8"));return {description:i.plugins?.find(n=>n.name===a)?.description,author:i.owner}}catch{return null}return null}function Mr(e="user"){let a=pp(e);if(!se__default.existsSync(a))return {};try{return JSON.parse(se__default.readFileSync(a,"utf-8"))}catch{return {}}}function cs(e,a="user"){mp(pp(a),e);}function jy(e,a){let{name:o,marketplace:t}=Tr(e),r;if(t?(r=`${o}@${t}`,a[r]||(r=void 0)):r=Object.keys(a).filter(s=>Tr(s).name===o)[0],!r)throw sa.error(`[${o}] Plugin is not installed`),new Error(`Plugin '${o}' is not installed`);return {key:r,name:o}}function Uy(e,a){let{name:o,marketplace:t}=Tr(e),r;return t?(r=`${o}@${t}`,a[r]||(r=void 0)):r=Object.keys(a).filter(s=>Tr(s).name===o)[0],r?{key:r,name:o}:null}function xd(e="user"){return Mr(e).enabledPlugins??{}}function Ed(e,a="user"){let o=Mr(a),t=o.enabledPlugins;if(!t||!(e in t))return;let{[e]:r,...i}=t;o.enabledPlugins=i,cs(o,a);}function qr(e,a,o="user"){let t=Mr(o),r=t.enabledPlugins??{};t.enabledPlugins={...r,[e]:a},cs(t,o);}function zy(e){let a=new Map;for(let o of e){let t=o.projectPath?`${o.scope}:${o.projectPath}`:o.scope,r=a.get(t);(!r||o.installedAt>r.installedAt)&&a.set(t,o);}return [...a.values()]}function le(){let e=Ae(),a=xd(),o=xd("project"),t=xd("local"),r={project:o,local:t},i=Object.entries(e.plugins).flatMap(([l,c])=>{let{name:u,marketplace:p}=Tr(l),m=c.map(f=>f.scope==="managed"?{...f,scope:"user"}:f);return zy(m).map(f=>{let h=By(f.installPath,u),k=(r[f.scope]??a)[l];return {name:u,marketplace:p,version:f.version&&f.version!=="unknown"?f.version:void 0,installedAt:f.installedAt,installPath:f.installPath,scope:f.scope,providerId:f.providerId,type:f.type,description:h?.description,author:h?.author,status:k===false?"disabled":"enabled"}})}),s=lp(),n=new Set(i.map(l=>`${l.name}@${l.scope}`)),d=s.filter(l=>!n.has(`${l.name}@${l.scope}`));return [...i,...d]}function up(e){let a=e.lastIndexOf("@");return a>0?e.slice(a+1):void 0}async function Lr(e,a){sa.debug(`[${e}] Acquiring lock to uninstall`);let o=await Mo();try{let t=Ae(),r=Uy(e,t.plugins);if(!r)throw new Error(`Plugin '${e}' is not in installed_plugins.json. If this is an MCP server from config, use the MCP remove command instead.`);let{key:i,name:s}=r,n=t.plugins[i];if(a){let d=n.find(u=>u.scope===a);if(!d)throw new Error(`Plugin '${s}' is not installed in ${a} scope`);sa.debug(`[${s}] Resolved key: ${i}, scope: ${a}`),ds(d.installPath);let l=de__default.dirname(d.installPath);ds(l),sa.debug(`[${s}] Removing directory: ${l}`),se__default.rmSync(l,{recursive:!0,force:!0});let c=n.filter(u=>u.scope!==a);if(c.length===0){let{[i]:u,...p}=t.plugins;na({...t,plugins:p}),Ed(i,a),Cd(s,up(i));}else t.plugins[i]=c,na(t),Ed(i,a);}else {sa.debug(`[${s}] Resolved key: ${i}`);for(let c of n){ds(c.installPath);let u=de__default.dirname(c.installPath);ds(u),sa.debug(`[${s}] Removing directory: ${u}`),se__default.rmSync(u,{recursive:!0,force:!0}),Ed(i,c.scope);}Cd(s,up(i));let{[i]:d,...l}=t.plugins;na({...t,plugins:l});}await Fy(s,n[0].origin??"internal",n[0].type??"skill"),sa.debug(`[${s}] Uninstalled successfully`);}finally{await o();}}async function Fr(e,a,o){sa.debug(`[${e}] Acquiring lock to set status \u2192 ${a}`);let t=await Mo();try{let r=Ae(),{key:i,name:s}=jy(e,r.plugins),n=r.plugins[i],d=o??n[0].scope,l=n[0].origin??"internal";sa.debug(`[${s}] Resolved key: ${i}, scope: ${d}`),qr(i,a==="enabled",d),Oy(s,a,l),sa.debug(`[${s}] Status updated to ${a}`);}finally{await t();}}Oe();function qd(e){return e===null||typeof e!="object"||Array.isArray(e)?e:Object.fromEntries(Object.entries(e).sort(([a],[o])=>a.localeCompare(o)).map(([a,o])=>[a,qd(o)]))}function Or(e,a){let o={...e};for(let[t,r]of Object.entries(a)){let i=o[t];if(Array.isArray(r)&&Array.isArray(i)){let s=new Set(i.map(n=>JSON.stringify(qd(n))));o[t]=[...i,...r.filter(n=>!s.has(JSON.stringify(qd(n))))];}else r!==null&&typeof r=="object"&&!Array.isArray(r)&&i!==null&&typeof i=="object"&&!Array.isArray(i)?o[t]=Or(i,r):o[t]=r;}return o}I();var Ld=P("bundleContent"),ls="${CLAUDE_PLUGIN_ROOT}/hooks/";function Wy(e){return e.split(ls).join("$CLAUDE_PROJECT_DIR/.claude/hooks/")}function Fd(e){return typeof e=="string"?Wy(e):Array.isArray(e)?e.map(Fd):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([a,o])=>[a,Fd(o)])):e}function Jy(e,a){let o=de__default.join(e,"rules");if(!se__default.existsSync(o))return 0;let t=se__default.readdirSync(o).filter(i=>i.endsWith(".md")&&se__default.lstatSync(de__default.join(o,i)).isFile());if(t.length===0)return 0;let r=Pt(a);se__default.mkdirSync(r,{recursive:true});for(let i of t)se__default.copyFileSync(de__default.join(o,i),de__default.join(r,i));return t.length}function Hy(e,a){let o=de__default.join(e,"hooks","hooks.json");if(!se__default.existsSync(o))return 0;let t;try{t=JSON.parse(se__default.readFileSync(o,"utf-8"));}catch(g){return Ld.warn(`hooks/hooks.json is not valid JSON \u2014 skipping: ${String(g)}`),0}let r=t.hooks;if(!r||typeof r!="object"||Array.isArray(r))return 0;let i=de__default.join(e,"hooks"),s=Sn(a),n=new Set,d=g=>{if(typeof g=="string"&&g.includes(ls)){let f=g.slice(g.indexOf(ls)+ls.length),h=/^([^"'\s]+)/.exec(f);h&&n.add(h[1]);}else Array.isArray(g)?g.forEach(d):g!==null&&typeof g=="object"&&Object.values(g).forEach(d);};d(r);let l=0;if(n.size>0){se__default.mkdirSync(s,{recursive:true});for(let g of n){let f=de__default.join(i,g);se__default.existsSync(f)&&(se__default.copyFileSync(f,de__default.join(s,g)),l++);}}let c=Fd(r),u=Mr(a),p=u.hooks!==null&&typeof u.hooks=="object"&&!Array.isArray(u.hooks)?u.hooks:{},m=Or(p,c);return cs({...u,hooks:m},a),l}function gp(e,a){let o=Jy(e,a),t=Hy(e,a);o>0&&Ld.debug(`Copied ${o} rule file(s) to ${Pt(a)}`),t>0&&Ld.debug(`Copied ${t} hook script(s) to ${Sn(a)}`);}U();I();var Qy=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,Vy=/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)?$/;function ia(e){if(!Qy.test(e))throw new Error(`Invalid plugin name from manifest: "${e}". Plugin names must be lowercase alphanumeric and hyphens (1-64 chars).`)}function _y(e){if(!Vy.test(e))throw new Error(`Invalid plugin version from manifest: "${e}". Versions must follow semver format (e.g. 1.0.0 or 1.0.0-beta.1).`)}var Lo=P("installer");function Xy(e,a,o){let t=`${e}@${o||pe}`,i=Ae().plugins[t];if(i&&!a)throw new Xe(e,i[0].version??"unknown");return {pluginKey:t,alreadyInstalled:i}}async function Ky(e,a,o){o&&await wd(a);try{Lo.debug(`[${a}] Extracting archive...`),await op(e,a);}catch(t){throw await wd(a),t}}function $y(e,a,o,t,r,i="claude-code",s){let n=Ae(),d={scope:t,...t==="user"?{}:{projectPath:process.cwd()},installPath:a,version:o,installedAt:new Date().toISOString(),origin:r,providerId:i,type:s},l=n.plugins[e]??[];n.plugins[e]=[...l.filter(c=>c.scope!==t),d],na(n),qr(e,true,t);}async function Yy(e,a,o,t,r,i){try{await C(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:i,source:r,scope:t,version:a,duration_ms:o,interface:Z().interfaceType});}catch(s){Lo.warn(`Failed to send install metrics: ${String(s)}`);}}async function Zy(e,a,o,t){try{await C(w.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:t,source:o,error_code:a instanceof Error?a.name:"UNKNOWN",error_message:(a instanceof Error?a.message:String(a)).slice(0,500),interface:Z().interfaceType});}catch(r){Lo.warn(`Failed to send install-failed metrics: ${String(r)}`);}}async function je(e,a={}){let o=Date.now(),t=null;try{Lo.debug(`[${e}] Acquiring lock...`),t=await Mo();let{pluginKey:r,alreadyInstalled:i}=Xy(e,a.force,a.source),{source:s}=a;Lo.debug(`[${e}] Fetching manifest...`);let n=await Wt(e,s);ia(n.name),_y(n.version),Lo.debug(`[${e}] Downloading archive...`);let d=await ap(e,a.onDownloadProgress,s),l=a.scope??"user",c=a.type??"skill",u=al(n.name,n.version,a.source);await Ky(d,u,!!i&&!!a.force),gp(u,l),$y(r,u,n.version,l,"internal",a.providerId,c),sp(n,u,a.source);let p=Date.now()-o;Lo.debug(`[${e}] Installed successfully in ${p}ms`);let m={name:n.name,version:n.version,path:u,duration_ms:p};return a.skipMetrics||await Yy(n.name,n.version,p,ts(l),"internal",c),m}catch(r){throw await Zy(e,r,"internal",a.type??"skill"),Lo.error(`[${e}] Installation failed: ${r instanceof Error?r.message:String(r)}`),r}finally{t&&await t();}}I();j();Re();xt();I();var ek=P("commands:helpers");async function he(){let e=await Y();if(!e)return S("Not authenticated. Run: flow auth login"),false;e.customUrl&&La(e.customUrl);try{await Oa();}catch(a){return ek.debug(`Token validation failed: ${String(a)}`),S("Session expired. Run: flow auth login"),false}return true}async function ee(e){let a=Nd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(b(e),t=>{a.close(),o(["y","yes"].includes(t.toLowerCase().trim()));});})}async function Fo(e){let a=Nd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(b(e),t=>{a.close(),o(t.trim());});})}var ak="\x1B[A",ok="\x1B[B";function fp(e,a){let o=a?R.cyan("\u276F"):" ",t=a?R.cyan(e.label):e.label,r=e.description?R.dim(` \u2014 ${e.description}`):"";return ` ${o} ${t}${r}`}function tk(e,a){return e.map((o,t)=>fp(o,t===a)).join(`
111
- `)}async function us(e,a){if(a.length===0)throw new Error("selectPrompt requires at least one option");return new Promise((o,t)=>{let r=0;process.stdout.write(`${b(e)}
112
- `),process.stdout.write(tk(a,r));let i="",s=c=>{if(i+=c,i===""){d(),t(new Error("SIGINT"));return}if(i==="\r"||i===`
110
+ `),this.warned=!0;}Di().set(`${a}:${o}`,t);}async deleteSecret(a,o){let t=Di(),r=`${a}:${o}`;return t.has(r)?(t.delete(r),!0):!1}getStoragePath(){return Di().path}static hasExistingData(){try{let a=new Gn({projectName:Bn});return ie.existsSync(a.path)}catch{return !1}}static clearFallbackFile(){try{let a=new Gn({projectName:Bn});ie.rmSync(a.path,{force:!0});}catch{}wi=null;}};});async function jn(){if(Qe.hasExistingData())return new Qe;switch(process.platform){case "darwin":return await wt.isAvailable()?new wt:new Qe;case "linux":return await vo.isAvailable()?new vo:await vo.ensureInstalled()?new vo:new Qe;case "win32":return await Ct.isAvailable()?new Ct:new Qe;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var hl=H(()=>{"use strict";In();qn();Nn();mr();});var bl=H(()=>{"use strict";fn();xn();hl();In();qn();Nn();mr();});async function yo(){return Ri||(Ri=jn()),Ri}function Ai(){Ri=null;}async function Y(){let a=await(await yo()).getSecret(Ya,Un);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function ko(e){let{clientId:a,clientSecret:o,tenant:t}=e,r=[!a?.trim()&&"clientId",!o?.trim()&&"clientSecret",!t?.trim()&&"tenant"].filter(Boolean);if(r.length>0)throw vl.error(`missing or empty fields: ${r.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await yo()).setSecret(Ya,Un,JSON.stringify(e));}async function yl(){let e=await yo();await e.deleteSecret(Ya,Un),await e.deleteSecret(Ya,zn),await e.deleteSecret(Ya,Wn);}async function kl(){return (await yo()).getStoragePath()}async function Pl(e){await(await yo()).setSecret(Ya,zn,JSON.stringify(e));}async function xi(){let a=await(await yo()).getSecret(Ya,zn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function Ei(e){await(await yo()).setSecret(Ya,Wn,JSON.stringify(e));}async function Rt(){let a=await(await yo()).getSecret(Ya,Wn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function Po(){let e=await xi();return e?new Date(e.expiresAt)>new Date:false}function La(e){let a=e.replace(/\/$/,"");process.env.AUTH_ENGINE_URL=`${a}/auth-engine-api/v2/api-key/token`,process.env.PROMPT_MANAGER_URL=`${a}/prompt-manager-api/`,process.env.METRICS_COLLECTOR_URL=`${a}/metrics-collector-api/`,vl.debug(`[customUrl] Service URLs overridden to base: ${a}`);}var vl,Ya,Un,zn,Wn,Ri,Re=H(()=>{"use strict";bl();I();vl=k("config:credentials"),Ya="flow-plugins-cli",Un="credentials",zn="token-cache",Wn="user-info",Ri=null;});function At(e){let a=e.split(".");if(a.length!==3)throw new Error(`Invalid JWT: expected 3 segments, got ${a.length}`);let o=a[1].replace(/-/g,"+").replace(/_/g,"/"),t=Buffer.from(o,"base64").toString("utf8");try{return JSON.parse(t)}catch{throw new Error("Invalid JWT: payload segment is not valid JSON")}}var Ii=H(()=>{"use strict";});function rb(e){if(!e.startsWith("[")||!e.endsWith("]"))return null;let o=e.slice(1,-1).match(/^::(?:ffff:)?([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);if(!o)return null;let t=parseInt(o[1],16),r=parseInt(o[2],16);return `${t>>8&255}.${t&255}.${r>>8&255}.${r&255}`}function Jn(e){if(Dl.some(o=>o.test(e)))return true;let a=rb(e);return !!(a&&Dl.some(o=>o.test(a)))}function ib(e,a){let o=process.env[e]??a;if(!o)throw new Error(`Missing required environment variable: ${e}`);return o}function Fa(e,a){let o=ib(e,a),t;try{t=new URL(o);}catch{throw new Error(`${e} must be a valid URL. Got: "${o}"`)}let r=process.env.NODE_ENV==="development";if(!r&&t.protocol!=="https:")throw new Error(`${e} must be an HTTPS URL. Got protocol: "${t.protocol}"`);if(t.username||t.password)throw new Error(`${e} must not contain embedded credentials (user:pass@host is not allowed)`);if(/^169\.254\./i.test(t.hostname)||/^metadata\.(google|azure)\.internal\.?$/i.test(t.hostname)||/^100\.(6[4-9]|[7-9]\d|1[0-2][0-7])\./i.test(t.hostname))throw new Error(`${e} must not point to a cloud metadata endpoint. Got: "${t.hostname}"`);if(!r&&Jn(t.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${t.hostname}"`);return o}var Dl,_o=H(()=>{"use strict";Dl=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^100\.(6[4-9]|[7-9]\d|1[0-2][0-7])\./,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^0\./,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i];});function db(e){if(!$a.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}async function cb(e){if(e instanceof HTTPError){let a=e.response.status;Hn.debug(`HTTP error during authentication [status=${a}]`);let o="";try{let t=await e.response.text(),r=JSON.parse(t);typeof r.error=="string"&&(o=r.error);}catch{}return o&&wl[o]?new Error(wl[o]):a===StatusCodes.UNAUTHORIZED||a===StatusCodes.FORBIDDEN||a===StatusCodes.INTERNAL_SERVER_ERROR?new Error("Invalid credentials"):a>=StatusCodes.BAD_REQUEST&&a<StatusCodes.INTERNAL_SERVER_ERROR?new Error("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}return e instanceof Error?(Hn.debug(`Non-HTTP error during authentication: ${e.message}`),e):(Hn.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function Xo(e){let a=Fa("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");db(e.tenant);let o;try{o=await Qu.post(a,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(i){throw await cb(i)}let t=o.expires_at??new Date(Date.now()+(o.expires_in??3600)*1e3).toISOString();await ko(e),await Pl({accessToken:o.access_token,expiresAt:t});let r=At(o.access_token);await Ei({sub:r.sub,name:r.name,email:r.email});}var Hn,wl,Ti=H(()=>{"use strict";Re();Ii();_o();I();U();Hn=k("api:auth");wl={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});async function Oa(){if(await Po()){let t=await xi();if(t)return t.accessToken}Sl.debug("Token expired or missing, re-authenticating...");let a=await Y();if(!a)throw new Error("Not authenticated. Run: flow auth login");Qe.clearFallbackFile(),Ai(),await Xo(a);let o=await xi();if(!o)throw new Error("Authentication succeeded but token was not persisted");return Sl.debug("Token refreshed successfully"),o.accessToken}var Sl,xt=H(()=>{"use strict";Re();Ti();mr();I();Sl=k("lib:tokenProvider");});function Ua(){return Qu.create({prefix:Fa("PROMPT_MANAGER_URL","https://flow.ciandt.com/prompt-manager-api/"),redirect:"error",hooks:{beforeRequest:[async({request:e})=>{let a=await Oa();e.headers.set("Authorization",`Bearer ${a}`);let o=await Y();o?.tenant&&$a.test(o.tenant)&&e.headers.set("FlowTenant",o.tenant);}]}})}var xr=H(()=>{"use strict";_o();Re();xt();U();});function Bu(e){if(!(e.source===void 0&&e.timeoutMs===void 0))return {...e.source!==void 0&&{searchParams:{source:e.source}},...e.timeoutMs!==void 0&&{timeout:e.timeoutMs}}}function Ot(e,a,o){let t=Ua(),r=Bu({source:a,timeoutMs:o});return r?t.get(e,r):t.get(e)}function ju(e,a={}){let o=Ua(),t=Bu(a);return t?o.head(e,t):o.head(e)}async function Nt(e){if(!(e instanceof HTTPError))return null;try{let a=await e.response.clone().json(),{message:o}=a;return Array.isArray(o)?o.filter(Boolean).join("; ")||null:typeof o=="string"&&o?o:null}catch{return null}}var gd=H(()=>{"use strict";xr();});function Er(e){if(!e||!iy.test(e))throw new Error(`Invalid plugin name: "${e}". Must be 1-64 chars, lowercase alphanumeric and hyphens only.`)}function Gt(e){return sy.test(e)}function Bt(e){let a=e.indexOf("@");return a>0?e.slice(0,a):e}function hd(e){if(!ny.test(e))throw new Error(`Invalid plugin name: "${e}". Plugin names must start with an alphanumeric character and contain only letters, digits, dots, hyphens, underscores, and slashes.`)}function jt(e,a){let o=Bt(e);hd(o);let t=["claude","plugin","install",o];return a&&t.push("--scope",a),t.join(" ")}function ss(e){let a=e.trim();if(!a)throw new Error("No marketplace source provided.");if(!dy.test(a)&&!cy.test(a))throw new Error(`Invalid marketplace source: "${a}". Must be owner/repo or an https:// URL.`);return a}var iy,sy,ny,dy,cy,To=H(()=>{"use strict";iy=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;sy=/^[^@]+@[^@]+$/;ny=/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\/[a-zA-Z0-9][a-zA-Z0-9._-]*)?$/;dy=/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/,cy=/^https:\/\/[\w./:@?&=+#%-]+$/;});var Wu={};Xc(Wu,{FlowApiAdapter:()=>Ut});var ly,Ut,bd=H(()=>{"use strict";xr();gd();I();To();ly=k("catalog.flow-api"),Ut=class{id;name;source;removable=!1;contentSource;constructor(a){this.contentSource=a,this.id=a?`flow-api:${a}`:"flow-api",this.name=a?`Flow Marketplace (${a})`:"Flow Marketplace",this.source=process.env.PROMPT_MANAGER_URL??"";}async fetchItems(){try{let{plugins:a}=await Ot("v1/plugins/catalog",this.contentSource).json();return a.map(o=>({...o,catalogId:this.id,origin:o.origin??"internal",type:o.type??"bundle",...this.contentSource?{contentSource:this.contentSource}:{}}))}catch(a){let o=await Nt(a);if(o)throw new Error(o);if(a instanceof HTTPError){let{status:t}=a.response;throw t===401||t===403?new Error("Authentication failed. Run: flow auth login"):new Error(`Failed to fetch plugin catalog: HTTP ${t}`)}throw a instanceof Error?a.name==="TimeoutError"||a.message.includes("timeout")?new Error("Request timed out while fetching plugin catalog"):new Error(`Failed to fetch plugin catalog: ${a.message}`):a}}async fetchManifest(a){Er(a);try{return await Ot(`v1/plugins/${a}/manifest`,this.contentSource).json()}catch(o){let t=await Nt(o);if(t)throw new Error(t);if(o instanceof HTTPError){let{status:r}=o.response;throw r===404?new Error(`Plugin '${a}' not found in catalog`):new Error(`Failed to fetch manifest: HTTP ${r}`)}throw o instanceof Error?new Error(`Failed to fetch manifest: ${o.message}`):o}}async ping(){try{return await Ua().head("v1/plugins/catalog"),ly.debug("ping ok"),!0}catch{return !1}}};});function py(){let e=process.env.GH_TOKEN??process.env.GITHUB_TOKEN;return e?Promise.resolve(e):execa("gh",["auth","token"],{reject:false}).then(({stdout:a})=>a.trim()||void 0).catch(()=>{})}function Hu(){return Ju??=py(),Ju}var Ju,Vu=H(()=>{"use strict";});var Xu={};Xc(Xu,{GitRepoAdapter:()=>zt});function _u(e,a){if(!my.test(e))throw new Error(`Invalid ${a} in catalog source URL: "${e}"`)}var my,zt,vd=H(()=>{"use strict";Vu();_o();my=/^[a-zA-Z0-9_.-]+$/;zt=class{id;name;source;constructor(a,o,t){this.id=a,this.name=o,this.source=t;}buildRawUrl(a,o="marketplace.json"){let t=new URL(this.source),{hostname:r,pathname:i}=t;if(Jn(r))throw new Error(`Catalog source URL points to a private/loopback address: "${r}"`);let s=i.replace(/^\//,"").split("/"),[n,d]=s;return _u(n,"owner"),_u(d,"repo"),r==="github.com"?`https://raw.githubusercontent.com/${n}/${d}/${a}/${o}`:r==="bitbucket.org"?`https://bitbucket.org/${n}/${d}/raw/${a}/${o}`:r==="gitlab.com"||r.startsWith("git.")?`https://${r}/${n}/${d}/-/raw/${a}/${o}`:`https://${r}/${n}/${d}/raw/${a}/${o}`}async fetchItems(){return this._fetchFromBranch("main").catch(a=>{if(this._is404(a))return this._fetchFromBranch("master");throw a})}async _fetchFromBranch(a){let o=await this._buildHeaders();try{let i=this.buildRawUrl(a,".claude-plugin/marketplace.json"),{plugins:s}=await Qu.get(i,{headers:o}).json();return s.map(n=>({...n,catalogId:this.id,origin:n.origin??"external"}))}catch(i){if(this._is401or403(i))throw this._authError();if(!this._is404(i))throw i}let t=this.buildRawUrl(a),{plugins:r}=await Qu.get(t,{headers:o}).json();return r.map(i=>({...i,catalogId:this.id,origin:i.origin??"external"}))}async _buildHeaders(){if(new URL(this.source).hostname!=="github.com")return {};let o=await Hu();return o?{Authorization:`token ${o}`}:{}}_is404(a){return a!==null&&typeof a=="object"&&"response"in a&&a.response?.status===404}_is401or403(a){return a!==null&&typeof a=="object"&&"response"in a&&[401,403].includes(a.response?.status??0)}_authError(){return Object.assign(new Error("Private repository or insufficient permissions. Set GH_TOKEN or GITHUB_TOKEN env var, or run `gh auth login`."),{code:"GITHUB_AUTH_REQUIRED"})}async fetchManifest(a){throw new Error("GitRepoAdapter does not support individual manifest fetch")}async ping(){try{return await this.fetchItems(),!0}catch{return !1}}};});U();var y=create(e=>({screen:"auth",activeTab:"discover",focus:"list",selectedIndex:0,actionMenuOpen:false,notification:null,loading:false,loadingMessage:"",downloadProgress:0,downloadTotal:0,catalogError:null,pendingExit:false,debugPanelOpen:false,catalogVersion:0,bundleInstallFlow:null,catalogFilters:{types:new Set(mn),origins:new Set(gn)},setScreen:a=>e({screen:a}),setActiveTab:a=>e({activeTab:a}),setFocus:a=>e({focus:a}),setSelectedIndex:a=>e({selectedIndex:a}),setActionMenuOpen:a=>e({actionMenuOpen:a}),showNotification:(a,o)=>e({notification:{message:a,type:o}}),clearNotification:()=>e({notification:null}),setLoading:(a,o="")=>e({loading:a,loadingMessage:a?o:"",downloadProgress:0,downloadTotal:0}),setDownloadProgress:(a,o)=>e({downloadProgress:a,downloadTotal:o}),setCatalogError:a=>e({catalogError:a}),setPendingExit:a=>e({pendingExit:a}),toggleTypeFilter:a=>e(o=>{let{types:t}=o.catalogFilters;return t.size===1&&t.has(a)?{}:{catalogFilters:{...o.catalogFilters,types:new Set([a])},selectedIndex:0}}),selectAllTypes:()=>e(a=>({catalogFilters:{...a.catalogFilters,types:new Set(mn)},selectedIndex:0})),toggleOriginFilter:a=>e(o=>{let{origins:t}=o.catalogFilters;return t.size===1&&t.has(a)?{}:{catalogFilters:{...o.catalogFilters,origins:new Set([a])},selectedIndex:0}}),selectAllOrigins:()=>e(a=>({catalogFilters:{...a.catalogFilters,origins:new Set(gn)},selectedIndex:0})),setDebugPanelOpen:a=>e({debugPanelOpen:a}),incrementCatalogVersion:()=>e(a=>({catalogVersion:a.catalogVersion+1})),setBundleInstallFlow:a=>e({bundleInstallFlow:a})}));Re();xt();Ii();U();_o();I();var Mi=k("api:metrics");function Cl(){return Fa("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function Rl(e,a,o){return Qu.post(e,{json:a,headers:o})}async function ub(e){let a=await Rt();if(a)return a;let o=At(e),t={sub:o.sub,name:o.name,email:o.email};return await Ei(t),t}async function C(e,a){let o=await Oa(),t=await ub(o),r=await Y();if(!$a.test(r.tenant))throw new Error(`Invalid tenant value: "${r.tenant}"`);let i={action:e,booster:pn,metadata:{...a},success:true,tenant:r.tenant,timestamp:new Date().toISOString(),user:{id:t.sub,name:t.name,email:t.email}};try{await Rl(Cl(),i,{Authorization:`Bearer ${o}`,FlowTenant:r.tenant}),Mi.debug(`Metrics event sent: ${e}`);}catch(s){throw Mi.warn(`Failed to send metrics event "${e}": ${String(s)}`),s}}async function Al(e,a,o){try{let t=o&&$a.test(o)?o:"unknown",r={action:e,booster:pn,metadata:a,success:!0,tenant:t,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await Rl(Cl(),r,{FlowTenant:t}),Mi.debug(`Anonymous metrics event sent: ${e}`);}catch(t){Mi.warn(`Failed to send anonymous metrics event "${e}": ${String(t)}`);}}var w={CLI_SESSION_STARTED:"CLI_SESSION_STARTED",CLI_AUTH_FAILED:"CLI_AUTH_FAILED",CLI_STEP_COMPLETED:"CLI_STEP_COMPLETED",CLI_KIT_DISPLAYED:"CLI_KIT_DISPLAYED",CLI_KIT_ACCEPTED:"CLI_KIT_ACCEPTED",CLI_KIT_REJECTED:"CLI_KIT_REJECTED",CLI_ONBOARDING_COMPLETED:"CLI_ONBOARDING_COMPLETED",CLI_ONBOARDING_ABANDONED:"CLI_ONBOARDING_ABANDONED",CLI_CLAUDE_MD_ACCEPTED:"CLI_CLAUDE_MD_ACCEPTED",CLI_CLAUDE_MD_SKIPPED:"CLI_CLAUDE_MD_SKIPPED",CLI_TOOL_INSTALLED:"CLI_TOOL_INSTALLED",CLI_TOOL_UNINSTALLED:"CLI_TOOL_UNINSTALLED",CLI_TOOL_UPDATED:"CLI_TOOL_UPDATED",CLI_TOOL_ENABLED:"CLI_TOOL_ENABLED",CLI_TOOL_INSTALL_FAILED:"CLI_TOOL_INSTALL_FAILED",CLI_TOOL_DISABLED:"CLI_TOOL_DISABLED",CLI_CATALOG_VIEWED:"CLI_CATALOG_VIEWED",CLI_TUI_SESSION_ENDED:"CLI_TUI_SESSION_ENDED",CLI_MODULE_INSTALL_STARTED:"CLI_MODULE_INSTALL_STARTED",CLI_MODULE_INSTALL_COMPLETED:"CLI_MODULE_INSTALL_COMPLETED",CLI_MODULE_INSTALL_FAILED:"CLI_MODULE_INSTALL_FAILED",CLI_MODULE_PROXY_EXECUTED:"CLI_MODULE_PROXY_EXECUTED",CLI_MODULE_NOT_FOUND:"CLI_MODULE_NOT_FOUND",CLI_MODULE_UPDATED:"CLI_MODULE_UPDATED",CLI_BUNDLE_INSTALL_STARTED:"CLI_BUNDLE_INSTALL_STARTED",CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS:"CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS",CLI_BUNDLE_INSTALL_PLUGIN_FAILED:"CLI_BUNDLE_INSTALL_PLUGIN_FAILED",CLI_BUNDLE_INSTALL_COMPLETED:"CLI_BUNDLE_INSTALL_COMPLETED",CLI_STRATEGY_INIT_COMPLETED:"CLI_STRATEGY_INIT_COMPLETED",CLI_STRATEGY_INIT_FAILED:"CLI_STRATEGY_INIT_FAILED"};var pb={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},ya={...pb};function xl(e){let a=Date.now();ya={sessionStart:a,stepStart:a,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function Ko(e){ya.currentStep=e,ya.stepStart=Date.now();}function Z(){return {...ya}}function Do(){return ya.sessionStart===0?0:Date.now()-ya.sessionStart}function $o(){return ya.stepStart===0?0:Date.now()-ya.stepStart}function El(){ya.tuiSessionStart=Date.now();}function Il(){return ya.tuiSessionStart===0?0:Date.now()-ya.tuiSessionStart}I();var mb=3e3,gb=k("abandonment");async function qi(e){let{currentStep:a,sessionStart:o}=Z();if(o===0)return;let t={last_step:a,trigger:e,duration_ms:Do()};try{await Promise.race([C(w.CLI_ONBOARDING_ABANDONED,t),new Promise((r,i)=>setTimeout(()=>i(new Error("abandonment timeout")),mb))]);}catch(r){gb.warn(`Abandonment event failed: ${String(r)}`);}}function Tl(e,a){return Promise.race([e,new Promise(o=>setTimeout(o,a))])}I();var fb=3e3,hb=k("session-end");async function fr(e,a,o){let t=Il(),i=[C(w.CLI_TUI_SESSION_ENDED,{duration_ms:t,active_tab:a,interface:"tui"})];o!=="main"&&i.push(qi(e));try{await Tl(Promise.all(i).then(()=>{}),fb);}catch(s){hb.warn(`Session end event failed: ${String(s)}`);}}var kb=2e3;function ql(){let{exit:e}=useApp(),a=useRef(false),o=useRef(null),t=y(d=>d.pendingExit),r=y(d=>d.setPendingExit),i=y(d=>d.activeTab),s=y(d=>d.screen),n=useCallback(()=>{if(a.current){o.current&&clearTimeout(o.current),fr("double-ctrl-c",i,s).finally(()=>e());return}a.current=true,r(true),o.current=setTimeout(()=>{a.current=false,r(false);},kb);},[e,r,i,s]);return useInput((d,l)=>{l.ctrl&&d==="c"&&n();}),{pendingExit:t}}var Sb=16;function Ll({label:e,value:a,onChange:o,masked:t=false,isActive:r,error:i}){let s=useRef(a);useEffect(()=>{s.current=a;},[a]),useInput((d,l)=>{if(l.backspace){let c=s.current.slice(0,-1);s.current=c,o(c);}else if(d&&!l.ctrl&&!l.meta&&!l.escape&&!l.return&&!l.tab&&!l.upArrow&&!l.downArrow&&!l.leftArrow&&!l.rightArrow){let c=s.current+d;s.current=c,o(c);}},{isActive:r});let n=t?"\u2022".repeat(a.length):a;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:r?"cyan":"gray",children:r?"\u25B8 ":" "}),jsx(Text,{color:r?"white":"gray",bold:r,children:e.padEnd(Sb)}),jsx(Text,{color:r?"cyan":"gray",children:n}),r&&jsx(Text,{color:"cyan",children:"\u2588"})]}),i&&jsx(Box,{paddingLeft:3,children:jsxs(Text,{color:"red",children:["\u26A0 ",i]})})]})}U();function Fl({onConfirm:e}){let[a,o]=useState("confirm"),[t,r]=useState(""),[i,s]=useState(false),n=useRef("");return useInput((d,l)=>{if(a==="confirm"){if(d==="n"||d==="N"){o("input");return}(d==="y"||d==="Y"||l.return)&&e(null);return}if(l.escape){n.current="",r(""),s(false),o("confirm");return}if(l.return){let c=n.current.trim();vt.test(c)?(s(false),e(c)):s(true);return}if(l.backspace||l.delete){n.current=n.current.slice(0,-1),r(n.current);return}d&&!l.ctrl&&!l.meta&&(n.current=n.current+d,r(n.current),s(false));}),jsxs(Box,{flexDirection:"column",gap:1,children:[a==="confirm"&&jsx(Text,{children:"Does your email use the @ciandt.com domain? (Y/n)"}),a==="input"&&jsxs(Box,{flexDirection:"column",gap:1,children:[jsx(Text,{children:"Enter your email address:"}),jsxs(Box,{children:[jsx(Text,{color:"cyan",children:"> "}),jsx(Text,{children:t}),jsx(Text,{color:"cyan",children:"\u2588"})]}),i&&jsx(Text,{color:"red",children:yt}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})}U();function Ol({plan:e}){return jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[fo," \u2014 Confirm Settings Update"]})}),jsxs(Box,{flexDirection:"column",marginBottom:1,children:[jsx(Text,{children:"Ready to update ~/.claude/settings.json:"}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsx(Text,{color:"green",children:e.previousToken?" ~ env.ANTHROPIC_AUTH_TOKEN (replaced)":" + env.ANTHROPIC_AUTH_TOKEN (new)"}),jsx(Text,{color:"green",children:e.previousBaseUrl?" ~ env.ANTHROPIC_BASE_URL (replaced)":" + env.ANTHROPIC_BASE_URL (new)"}),e.hadExistingFile&&jsx(Text,{dimColor:true,children:" Existing settings preserved."})]})]}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsx(Text,{dimColor:true,children:"Enter \u2014 update settings.json and continue"}),jsx(Text,{dimColor:true,children:"Esc \u2014 skip JWT update, continue"}),jsx(Text,{dimColor:true,children:"q \u2014 back to form"})]})]})}U();function Nl(){return jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"yellow",children:[fo," \u2014 settings.json is invalid"]})}),jsxs(Box,{flexDirection:"column",marginBottom:1,children:[jsx(Text,{children:"Your ~/.claude/settings.json contains invalid JSON."}),jsx(Text,{children:"Press Enter to overwrite it with a fresh file containing only the auth token,"}),jsx(Text,{children:"or Esc to cancel and fix the file manually."})]}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter overwrite \xB7 Esc cancel"})})]})}var oa=create(e=>({credentials:null,isAuthenticated:false,justAuthenticated:false,setCredentials:a=>e({credentials:a,isAuthenticated:true}),clearCredentials:()=>e({credentials:null,isAuthenticated:false,justAuthenticated:false}),setJustAuthenticated:a=>e({justAuthenticated:a})}));Ti();U();function et(){return ne__default.join(Ce__default.homedir(),".claude","settings.json")}function Bl(e){return `${(e&&e.trim().length>0?e.trim():ni).replace(/\/+$/,"")}/flow-litellm/`}function Dr(){let e=et();if(!ie__default.existsSync(e))return {status:"missing"};let a=ie__default.readFileSync(e,"utf-8"),o=a.charCodeAt(0)===65279?a.slice(1):a;try{let t=JSON.parse(o);return t===null||typeof t!="object"||Array.isArray(t)?{status:"malformed",raw:a}:{status:"ok",settings:t}}catch{return {status:"malformed",raw:a}}}function Fi(e){let a=et();ie__default.mkdirSync(ne__default.dirname(a),{recursive:true});let o=`${a}.${randomUUID()}.tmp`;ie__default.writeFileSync(o,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),ie__default.renameSync(o,a);}function jl(e,a,o){let t=e.env&&typeof e.env=="object"&&!Array.isArray(e.env)?e.env:{};return {...e,env:{...t,ANTHROPIC_AUTH_TOKEN:a,ANTHROPIC_BASE_URL:o}}}function Yn(e){let a=e.env;if(!a||typeof a!="object"||Array.isArray(a))return null;let o=a.ANTHROPIC_AUTH_TOKEN;return typeof o=="string"&&o.length>0?o:null}function Ul(e){let a=e.env;if(!a||typeof a!="object"||Array.isArray(a))return null;let o=a.ANTHROPIC_BASE_URL;return typeof o=="string"&&o.length>0?o:null}var Tb=3600,at=class extends Error{constructor(){super("~/.claude/settings.json contains invalid JSON"),this.name="MalformedSettingsError";}};function wr(e){let a=e.split(".");if(a.length!==3)throw new Error("Malformed JWT: invalid format");let o;try{o=JSON.parse(Buffer.from(a[1],"base64url").toString("utf8"));}catch{throw new Error("Malformed JWT: payload is not valid JSON")}if(!o||typeof o!="object"||Array.isArray(o))throw new Error("Malformed JWT: payload must be a JSON object");let t=o;if(typeof t.clientId!="string"||!t.clientId)throw new Error("Invalid JWT: claim clientId must be a non-empty string");if(t.clientId.length>512)throw new Error("Invalid JWT: claim clientId exceeds maximum length");if(typeof t.clientSecret!="string"||!t.clientSecret)throw new Error("Invalid JWT: claim clientSecret must be a non-empty string");if(t.clientSecret.length>4096)throw new Error("Invalid JWT: claim clientSecret exceeds maximum length");if(typeof t.tenant!="string"||!t.tenant)throw new Error("Invalid JWT: claim tenant must be a non-empty string");if(t.tenant.length>512)throw new Error("Invalid JWT: claim tenant exceeds maximum length");return {clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant}}function Mb(e){return Ib.sign({clientId:e.clientId,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:Tb})}function Oi(e,a={}){let o=Dr();if(o.status==="malformed"&&!a.allowOverwriteMalformed)throw new at;let t=o.status==="ok"?o.settings:{},r=o.status==="ok"?Yn(o.settings):null,i=o.status==="ok"?Ul(o.settings):null,s=a.jwtOverride??Mb(e),n=Bl(e.customUrl),d=jl(t,s,n);return {jwt:s,anthropicBaseUrl:n,merged:d,previousToken:r,previousBaseUrl:i,hadExistingFile:o.status!=="missing"}}function Ni(e){Fi(e.merged);}function zl(){let e=Dr();return e.status!=="ok"?false:Yn(e.settings)!==null}Re();Oe();function qb(){let e=tl();if(!ie__default.existsSync(e))return {};try{return JSON.parse(ie__default.readFileSync(e,"utf-8"))}catch{return {}}}var Zn=null;function Lb(){return Zn===null&&(Zn=qb()),Zn}function Co(){return !!Lb().ENABLE_EXPERIMENTAL_BETAS}U();function Gb(){return de.filter(e=>e.platforms[process.platform]?.status==="supported")}function Jl(e){let a=Gb();return a.length>0&&a.every(o=>e.find(t=>t.module.alias===o.alias)?.alreadyInstalled===true)}var Gi={alias:"metrics",required:true,name:"flow-ai-obs",configCheck:()=>{try{let e=ne__default.join(Ce__default.homedir(),".claude","settings.json"),o=ie__default.readFileSync(e,"utf-8").replace(/^\uFEFF/,""),r=JSON.parse(o).env;return typeof r=="object"&&r!==null&&"OTEL_EXPORTER_OTLP_ENDPOINT"in r}catch{return false}},binaryName:"flow-ai-obs",description:"AI usage telemetry and observability (hooks, OTEL, LLM proxy)",platforms:{darwin:{status:"supported",strategies:[{type:"npm",package:"@ciandt-flow/flow-ai-obs"}]},linux:{status:"supported",strategies:[{type:"npm",package:"@ciandt-flow/flow-ai-obs"}]},win32:{status:"supported",strategies:[{type:"npm",package:"@ciandt-flow/flow-ai-obs"}]}},versionCheck:{type:"npm-registry",package:"@ciandt-flow/flow-ai-obs"},versionCommand:["flow-ai-obs","--version"],hasOwnUpdateCheck:true,postInstall:{onboarding:e=>{let a=["flow-ai-obs","init","--no-interactive"];if(a.push("--custom-url",e.customUrl??ni),e.credentials){let{clientId:o,clientSecret:t,tenant:r}=e.credentials;a.push("--client-id",o,"--client-secret",t,"--tenant",r);}return e.customEmail&&a.push("--custom-email",e.customEmail),[a]},onDemand:null,mode:"non-interactive"}},Bb={alias:"dashboard",name:"ccboard",binaryName:"ccboard",description:"Claude Code session monitoring dashboard",docs:"https://github.com/FlorianBruniaux/ccboard",platforms:{darwin:{status:"supported",strategies:[{type:"homebrew",formula:"ccboard",tap:"FlorianBruniaux/tap"},{type:"curl",url:"https://raw.githubusercontent.com/FlorianBruniaux/ccboard/main/install.sh",mode:"script"}]},linux:{status:"supported",strategies:[{type:"curl",url:"https://raw.githubusercontent.com/FlorianBruniaux/ccboard/main/install.sh",mode:"script"}]},win32:{status:"experimental"}},versionCheck:{type:"github-releases",repo:"florianbruniaux/ccboard"},versionCommand:["ccboard","--version"],hasOwnUpdateCheck:false},de=Co()?[Gi,Bb]:[Gi];Re();I();var Wb=k("moduleState");function ji(){let e=process.env.FLOW_HOME??ne__default.join(Ce__default.homedir(),".flow");return ne__default.join(e,"modules.json")}var Jb={retries:5,minTimeout:50};async function Hl(e,a){ie__default.mkdirSync(ne__default.dirname(e),{recursive:true});let o=await zb.lock(e+".lock",{realpath:false,retries:Jb});try{return await a()}finally{await o();}}function Vl(){let e=ji();if(!ie__default.existsSync(e))return [];try{let a=JSON.parse(ie__default.readFileSync(e,"utf-8"));return a.schemaVersion!==1?(Wb.warn(`modules.json has unknown schemaVersion ${a.schemaVersion}, resetting`),ie__default.rmSync(e,{force:!0}),[]):Array.isArray(a.modules)?a.modules.map(o=>({...o,name:o.name??null})):[]}catch{return ie__default.rmSync(e,{force:true}),[]}}function ot(){return Vl()}function Ql(e){let a=ji();ie__default.mkdirSync(ne__default.dirname(a),{recursive:true});let o=`${a}.${randomUUID()}.tmp`,t={schemaVersion:1,modules:e};ie__default.writeFileSync(o,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),ie__default.renameSync(o,a);}function ta(e){return ot().find(a=>a.alias===e)??null}async function ka(e){let a=ji();await Hl(a,async()=>{let o=Vl(),t=o.findIndex(r=>r.alias===e.alias);t===-1?o.push(e):o[t]=e,Ql(o);});}async function tt(){let e=ji();ie__default.existsSync(e)||await Hl(e,async()=>{ie__default.existsSync(e)||Ql([]);});}var Qb=promisify(execFile);function Ro(e,a){let o=e.platforms[process.platform];return !o||o.status!=="supported"?null:o.strategies.find(t=>t.type===a)??null}async function Ga(e){let a=process.platform==="win32"?"where":"which";try{return await Qb(a,[e]),!0}catch{return false}}function Za(){return process.platform==="win32"?"npm.cmd":"npm"}var _l=promisify(execFile),It=class{type="npm";async isAvailable(){return Ga("npm")}async install(a){let o=await this.getInstalledVersion(a);return o?{success:true,version:o,method:"npm",durationMs:0}:this.runNpmInstall(a,false)}async update(a,o){return this.runNpmInstall(a,true)}async getInstalledVersion(a){let o=Ro(a,"npm");if(!o)return null;try{let{stdout:t}=await _l(Za(),["list","-g",o.package,"--depth=0","--json"],{shell:process.platform==="win32"});return JSON.parse(t).dependencies?.[o.package]?.version??null}catch{return null}}async uninstall(a){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async runNpmInstall(a,o){let t=Date.now(),r=Ro(a,"npm");if(!r)return {success:false,error:{code:"NPM_NOT_AVAILABLE",message:"No npm config for this module on this platform"},durationMs:Date.now()-t};let i=o?`${r.package}@latest`:r.package;try{return await _l(Za(),["install","-g",i],{shell:process.platform==="win32"}),{success:!0,version:await this.getInstalledVersion(a)??void 0,method:"npm",durationMs:Date.now()-t}}catch(s){return {success:false,error:{code:"NPM_INSTALL_FAILED",message:s instanceof Error?s.message:String(s)},durationMs:Date.now()-t}}}};var Ui=promisify(execFile),Yb=/^(\S+)\s+([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/,zi=class{type="homebrew";async isAvailable(){return Ga("brew")}async install(a){return this.runBrewCommand(a,"install")}async update(a,o){return this.runBrewCommand(a,"upgrade")}async getInstalledVersion(a){let o=Ro(a,"homebrew");return o?this.getVersionByFormula(o.formula):null}async uninstall(a){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async runBrewCommand(a,o){let t=Date.now(),r=Ro(a,"homebrew");if(!r)return {success:false,error:{code:"HOMEBREW_NOT_AVAILABLE",message:"No homebrew config for this module on this platform"},durationMs:Date.now()-t};let i=o==="install"?"HOMEBREW_INSTALL_FAILED":"HOMEBREW_UPGRADE_FAILED";try{return r.tap&&(await Ui("brew",["tap",r.tap]),await Ui("brew",["trust",r.tap])),await Ui("brew",[o,r.formula]),{success:!0,version:await this.getVersionByFormula(r.formula)??void 0,method:"homebrew",durationMs:Date.now()-t}}catch(s){return {success:false,error:{code:i,message:s instanceof Error?s.message:String(s)},durationMs:Date.now()-t}}}async getVersionByFormula(a){try{let{stdout:o}=await Ui("brew",["list","--versions",a]),t=o.trim().match(Yb);return t?t[2]:null}catch{return null}}};var Tt=promisify(execFile),Kl=/([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/;function $l(){let e=process.env.FLOW_HOME??ne__default.join(Ce__default.homedir(),".flow");return ne__default.join(e,"bin")}var Wi=class{type="curl";async isAvailable(){return Ga("curl")}async install(a){let o=Date.now(),t=Ro(a,"curl");if(!t)return {success:false,error:{code:"CURL_NOT_AVAILABLE",message:"No curl config for this module on this platform"},durationMs:Date.now()-o};let r=typeof t.url=="function"?t.url(process.arch):t.url;return (t.mode??"binary")==="script"?this.installScript(r,t.checksumUrl,a,o):this.installBinary(r,t.checksumUrl,a,o)}async update(a,o){return this.install(a)}async getInstalledVersion(a){let o=ne__default.join($l(),ne__default.basename(a.binaryName));for(let t of [o,a.binaryName])try{let{stdout:r}=await Tt(t,["--version"]),i=r.match(Kl);if(i)return i[1]}catch{}return null}async uninstall(a){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async installScript(a,o,t,r){if(!o)return {success:false,error:{code:"CHECKSUM_REQUIRED",message:`checksumUrl is required for script installs (${t.alias})`},durationMs:Date.now()-r};let i=ne__default.join(Ce__default.tmpdir(),`flow-install-${randomUUID()}.sh`);try{if(await Tt("curl",["-sSL","--fail","-o",i,a]),o){let n=await this.validateChecksum(i,o);if(!n.valid){try{ie__default.unlinkSync(i);}catch{}return {success:!1,error:{code:"CHECKSUM_MISMATCH",message:n.message},durationMs:Date.now()-r}}}return ie__default.chmodSync(i,448),await Tt("bash",[i]),{success:!0,version:await this.getInstalledVersion(t)??void 0,method:"curl",durationMs:Date.now()-r}}catch(s){return {success:false,error:{code:"CURL_SCRIPT_FAILED",message:s instanceof Error?s.message:String(s)},durationMs:Date.now()-r}}finally{try{ie__default.unlinkSync(i);}catch{}}}async installBinary(a,o,t,r){let i=$l(),s=ne__default.join(i,ne__default.basename(t.binaryName)),n=false;try{if(ie__default.mkdirSync(i,{recursive:!0}),n=!0,await Tt("curl",["-L","--fail","-o",s,a]),o){let l=await this.validateChecksum(s,o);if(!l.valid)return ie__default.unlinkSync(s),{success:!1,error:{code:"CHECKSUM_MISMATCH",message:l.message},durationMs:Date.now()-r}}ie__default.chmodSync(s,493);let d=null;try{let{stdout:l}=await Tt(s,["--version"]),c=l.match(Kl);d=c?c[1]:null;}catch{}return {success:!0,version:d??void 0,method:"curl",durationMs:Date.now()-r}}catch(d){if(n)try{ie__default.unlinkSync(s);}catch{}return {success:false,error:{code:"CURL_DOWNLOAD_FAILED",message:d instanceof Error?d.message:String(d)},durationMs:Date.now()-r}}}async validateChecksum(a,o){let t=ne__default.join(Ce__default.tmpdir(),`curl-checksum-${randomUUID()}`);try{await Tt("curl",["-L","--fail","-o",t,o]);let r=ie__default.readFileSync(t,"utf-8").trim().split(/\s+/)[0],i=ie__default.readFileSync(a),s=createHash("sha256").update(i).digest("hex");return s!==r?{valid:!1,message:`SHA256 mismatch: expected ${r}, got ${s}`}:{valid:!0,message:""}}catch(r){return {valid:false,message:`Checksum validation failed: ${String(r)}`}}finally{try{ie__default.unlinkSync(t);}catch{}}}};I();var Yl="0.0.0";try{let e=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8"));typeof e.version=="string"&&(Yl=e.version);}catch{}var ve=Yl;var Te=k("moduleInstaller");function ja(e){switch(e){case "npm":return new It;case "homebrew":return new zi;case "curl":return new Wi}}async function Sr(e,a,o){try{await C(w.CLI_MODULE_INSTALL_FAILED,{module_alias:e.alias,module_name:e.name,os:process.platform,error_code:o.code,error_message:o.message,trigger:a});}catch(t){Te.warn(`Failed to emit install failed event: ${String(t)}`);}}async function xo(e,a,o,t,r,i){let s=Date.now(),n=e.platforms[process.platform];if(!n)return {success:false,error:{code:"PLATFORM_NOT_SUPPORTED",message:`Platform ${process.platform} is not listed for module ${e.alias}`},durationMs:Date.now()-s};if(n.status==="experimental"){Te.warn(`Module "${e.alias}" has experimental support on ${process.platform}`);let u={code:"PLATFORM_EXPERIMENTAL",message:`Experimental support on ${process.platform} \u2014 install manually`};return await Sr(e,a,u),{success:false,error:u,durationMs:Date.now()-s}}if(n.status!=="supported"){let u={code:"PLATFORM_NOT_SUPPORTED",message:`Module ${e.alias} is not supported on ${process.platform}`};return await Sr(e,a,u),{success:false,error:u,durationMs:Date.now()-s}}if(!n.strategies.some(u=>u.type===o)){let u={code:"STRATEGY_NOT_FOUND",message:`Strategy "${o}" is not configured for module "${e.alias}" on ${process.platform}`};return await Sr(e,a,u),{success:false,error:u,durationMs:Date.now()-s}}let d=ja(o),l=false;try{l=await d.isAvailable();}catch(u){Te.warn(`${o} availability check failed: ${String(u)}`);}if(!l){let u={code:"STRATEGY_NOT_AVAILABLE",message:`"${o}" is not installed on this system`};return await Sr(e,a,u),{success:false,error:u,durationMs:Date.now()-s}}try{await C(w.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:ve,trigger:a});}catch(u){Te.warn(`Failed to emit install started event: ${String(u)}`);}let c;try{c=i?.forceLatest?await d.update(e,"unknown"):await d.install(e);}catch(u){let m=u instanceof Error?u.message:String(u);Te.warn(`${o} install threw: ${m}`),c={success:false,error:{code:"INSTALL_THREW",message:m},durationMs:Date.now()-s};}if(c.success){await ka({alias:e.alias,name:e.name,installedVersion:c.version??null,installMethod:c.method??null,installedAt:new Date().toISOString(),lastChecked:new Date().toISOString()});try{await C(w.CLI_MODULE_INSTALL_COMPLETED,{module_alias:e.alias,module_name:e.name,installed_version:c.version??"unknown",duration_ms:c.durationMs,os:process.platform,trigger:a});}catch(p){Te.warn(`Failed to emit install completed event: ${String(p)}`);}let{pendingCmd:u,failed:m}=await iv(e,a,t,r);return u?{...c,pendingInteractiveSetup:u}:m?{...c,postInstallFailed:true}:e.configCheck&&!e.configCheck()?{...c,configCheckFailed:true}:c}return await Sr(e,a,c.error??{code:"UNKNOWN",message:"unknown error"}),c}async function iv(e,a,o,t){if(!e.postInstall)return {pendingCmd:null,failed:false};let r=a==="onboarding"?e.postInstall.onboarding:e.postInstall.onDemand;if(r==null)return {pendingCmd:null,failed:false};let i;if(typeof r=="function"){let n=await Y(),d={credentials:n?{clientId:n.clientId,clientSecret:n.clientSecret,tenant:n.tenant}:null,customUrl:o??null,customEmail:t??null};try{i=r(d);}catch(l){return Te.warn(`postInstall function threw: ${String(l)}`),{pendingCmd:null,failed:false}}}else i=r;if(i.length===0)return {pendingCmd:null,failed:false};if((e.postInstall.mode??"non-interactive")==="interactive")return {pendingCmd:i[0]??null,failed:false};let s=false;for(let n=0;n<i.length;n++){let d=i[n];if(d.length===0)continue;let l=spawnSync(d[0],d.slice(1),{stdio:"pipe",env:process.env,encoding:"utf-8",shell:process.platform==="win32"});if(l.status!==0){s=true,Te.warn(`postInstall "${d.join(" ")}" exited with status ${l.status??"null"}`),l.stderr&&Te.warn(l.stderr);let c=i.slice(n+1).filter(u=>u.length>0);c.length>0&&Te.debug(`continuing with remaining postInstall steps: ${c.map(u=>u.join(" ")).join(", ")}`);}}return {pendingCmd:null,failed:s}}async function Ji(e,a){let o=Date.now(),t=ta(e.alias);if(!t?.installMethod)return {success:false,error:{code:"NOT_INSTALLED",message:`Module '${e.alias}' is not installed`},durationMs:Date.now()-o};let r=ja(t.installMethod),i=t.installedVersion??"unknown";if(a==="command")try{await C(w.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:ve,trigger:"command"});}catch(n){Te.warn(`Failed to emit update started event: ${String(n)}`);}let s;try{s=await r.update(e,i);}catch(n){let d=n instanceof Error?n.message:String(n);Te.warn(`${t.installMethod} update threw: ${d}`),s={success:false,error:{code:"UPDATE_THREW",message:d},durationMs:Date.now()-o};}if(s.success)if(await ka({...t,installedVersion:s.version??t.installedVersion,lastChecked:new Date().toISOString()}),a==="command")try{await C(w.CLI_MODULE_INSTALL_COMPLETED,{module_alias:e.alias,module_name:e.name,installed_version:s.version??"unknown",duration_ms:s.durationMs,os:process.platform,trigger:"command"});}catch(n){Te.warn(`Failed to emit update completed event: ${String(n)}`);}else try{await C(w.CLI_MODULE_UPDATED,{module_alias:e.alias,from_version:i,to_version:s.version??"unknown",duration_ms:s.durationMs});}catch(n){Te.warn(`Failed to emit module updated event: ${String(n)}`);}else if(a==="command")try{await C(w.CLI_MODULE_INSTALL_FAILED,{module_alias:e.alias,module_name:e.name,os:process.platform,error_code:s.error?.code??"UNKNOWN",error_message:s.error?.message??"unknown error",trigger:"command"});}catch(n){Te.warn(`Failed to emit update failed event: ${String(n)}`);}return s}I();var Hi=k("flowAiObsSetup");async function Vi(e,a){try{if(!await new It().isAvailable().catch(()=>!1))return Hi.warn("npm not available \u2014 skipping flow-ai-obs install"),{npmFailed:!0,initFailed:!1};let r=await xo(Gi,"onboarding","npm",e,a,{forceLatest:!0});return r.success?r.postInstallFailed||r.configCheckFailed?(Hi.debug("flow-ai-obs init failed (postInstall exit non-zero or configCheck failed)"),{npmFailed:!1,initFailed:!0}):{npmFailed:!1,initFailed:!1}:(Hi.warn(`flow-ai-obs install failed: ${r.error?.message??"unknown"}`),{npmFailed:!0,initFailed:!1})}catch(o){return Hi.warn(`installFlowAiObs threw: ${String(o)}`),{npmFailed:false,initFailed:false,unexpectedError:true}}}I();function Zl(e){if(!(e instanceof Error))return "unknown";let a=e.message.toLowerCase();return a.includes("401")||a.includes("unauthorized")?"invalid_credentials":a.includes("403")||a.includes("forbidden")?"forbidden":a.includes("timeout")||a.includes("timed out")?"timeout":a.includes("network")||a.includes("econnrefused")||a.includes("fetch")?"network_error":"unknown"}var sv=k("useAuthSetup");function eu(){let[e,a]=useState(""),o=useRef(null),t=useRef(null),r=useRef(null),[i,s]=useState(),[n,d]=useState(null),[l,c]=useState(false),[u,m]=useState("fields"),[p,g]=useState(null),f=useRef(0),h=useRef(false),{setCredentials:b,setJustAuthenticated:D}=oa(),q=()=>{m("fields"),g(null),a(""),o.current=null,t.current=null,r.current=null;},L=()=>{C(w.CLI_SESSION_STARTED,{cli_version:ve,os:process.platform,node_version:process.version,duration_ms:Do(),interface:"tui"}).catch(()=>{});},A=async W=>{h.current=true;let _={...o.current,customUrl:t.current??void 0};try{W&&Ni(W),await ko(_);}catch(V){d(V instanceof Error?V.message:"Failed to persist credentials"),q(),h.current=false;return}let{clientSecret:E,...B}=_;b(B),D(true),L(),await Vi(t.current,r.current).catch(V=>sv.warn(`installFlowAiObs threw unexpectedly: ${String(V)}`)),Qi({starterKit:B.starterKit});},T=async()=>A(),F=async W=>A(W),O=W=>{try{let _={...o.current,customUrl:t.current??void 0};return Oi(_,{allowOverwriteMalformed:W,jwtOverride:e.trim()})}catch(_){return _ instanceof at?(m("malformedConfirm"),null):(d(_ instanceof Error?_.message:"Failed to read settings.json"),m("fields"),null)}},oe=()=>{let W=O(true);W&&(g(W),F(W));},x=async()=>{let W=e.trim();if(!W){s("This field is required");return}let _;try{_=wr(W);}catch(E){s(E instanceof Error?E.message:"Invalid JWT");return}s(void 0),o.current=_,m("customUrl");},J=W=>{t.current=W,m("email");},ae=W=>{r.current=W,z();},z=async()=>{let W=t.current;W&&La(W),c(true),d(null),f.current+=1;try{await Xo(o.current);let _=O(!1);_&&(g(_),m("preview"));}catch(_){let E=_ instanceof Error?_.message:"Authentication failed";d(E),Al(w.CLI_AUTH_FAILED,{error_code:Zl(_),attempt:f.current},o.current.tenant).catch(()=>{}),a(""),o.current=null,m("fields");}finally{c(false);}};return {jwtValue:e,jwtError:i,authError:n,isSubmitting:l,step:u,plan:p,isCommittingRef:h,setJwtValue:a,setJwtError:s,cancelToFields:q,handleSubmit:x,goToEmailStep:J,handleEmailConfirm:ae,commitAndProceed:F,skipJwtAndProceed:T,planPersistOverwrite:oe}}U();j();function au(){let{jwtValue:e,jwtError:a,authError:o,isSubmitting:t,step:r,plan:i,isCommittingRef:s,setJwtValue:n,setJwtError:d,cancelToFields:l,handleSubmit:c,goToEmailStep:u,handleEmailConfirm:m,commitAndProceed:p,skipJwtAndProceed:g,planPersistOverwrite:f}=eu(),[h,b]=useState("confirm"),[D,q]=useState(""),L=useRef(""),[A,T]=useState(false);return useEffect(()=>{r==="customUrl"&&(b("confirm"),L.current="",q(""),T(false));},[r]),useInput((F,O)=>{if(!(t||s.current)){if(r==="preview"){O.return&&i?p(i):O.escape?g():F==="q"&&l();return}if(r==="malformedConfirm"){O.return?f():O.escape&&l();return}if(r==="customUrl"){if(h==="confirm")F==="y"||F==="Y"?b("input"):(F==="n"||F==="N"||O.return)&&u(null);else if(O.escape)L.current="",q(""),b("confirm");else if(O.return){let oe=L.current.trim();oe.length>0&&ht.test(oe)?(T(false),u(oe)):oe.length>0&&T(true);}else O.backspace||O.delete?(L.current=L.current.slice(0,-1),q(L.current)):F&&!O.ctrl&&!O.meta&&(L.current=L.current+F,q(L.current),T(false));return}r!=="email"&&O.return&&c();}},{isActive:true}),r==="customUrl"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[fo," \u2014 Initial Setup"]})}),jsxs(Box,{flexDirection:"column",gap:1,children:[t&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),!t&&h==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),!t&&h==="input"&&jsxs(Box,{flexDirection:"column",gap:1,children:[jsx(Text,{children:"Enter your custom Flow base URL:"}),jsxs(Box,{children:[jsx(Text,{color:"cyan",children:"> "}),jsx(Text,{children:D}),jsx(Text,{color:"cyan",children:"\u2588"})]}),A&&jsx(Text,{color:"red",children:bt}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})]}):r==="email"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[fo," \u2014 Initial Setup"]})}),t?jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}):jsx(Fl,{onConfirm:m})]}):r==="preview"&&i?jsx(Ol,{plan:i}):r==="malformedConfirm"?jsx(Nl,{}):jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[fo," \u2014 Initial Setup"]})}),jsxs(Box,{marginBottom:1,flexDirection:"column",children:[jsx(Text,{dimColor:true,children:"The data collected during setup is used solely to improve"}),jsx(Text,{dimColor:true,children:"Flow's internal tools and will not be shared externally."})]}),jsx(Box,{flexDirection:"column",children:jsx(Box,{marginBottom:1,children:jsx(Ll,{label:"JWT",value:e,onChange:F=>{n(F),a&&d(void 0);},masked:true,isActive:!t,error:a})})}),t&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),o&&jsx(Box,{marginTop:1,children:jsxs(Text,{color:"red",children:["\u26A0 ",v(o)]})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter confirm"})})]})}function qt(){return jsxs(Box,{flexDirection:"column",alignItems:"center",children:[jsx(uv,{text:"FLOW",font:"block",colors:["white","white"]}),jsx(Box,{marginTop:-1,marginBottom:1,children:jsxs(Text,{dimColor:true,children:["Marketplace \xB7 v",ve]})})]})}var iu=[{id:"discover",focus:"list"},{id:"installed",focus:"list"},{id:"updates",focus:"list"},{id:"marketplaces",focus:"marketplaces"}],re=Co()?iu:iu.slice(0,3);function pv(e){return re.findIndex(a=>a.id===e)}function od(e,a,o){let t=pv(o.activeTab);if(a.rightArrow||a.tab){let r=re[(t+1)%re.length];return [{type:"setTab",tab:r.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:r.focus}]}if(a.leftArrow){let r=re[(t-1+re.length)%re.length];return [{type:"setTab",tab:r.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:r.focus}]}return a.downArrow?[{type:"setFocus",focus:re[t]?.focus??"list"}]:[]}var du={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function cu({outdatedCount:e=0}){let a=y(o=>o.activeTab);return jsx(Box,{paddingX:1,paddingBottom:1,children:re.map(({id:o})=>{let t=o===a,r=o==="updates"&&e>0?`${du[o]} (${e})`:du[o];return jsx(Box,{marginRight:1,children:t?jsx(Text,{bold:true,inverse:true,children:` ${r} `}):jsx(Text,{dimColor:true,children:` ${r} `})},o)})})}var _e=create(e=>({query:"",cursorPosition:0,setQuery:a=>e({query:a}),setCursorPosition:a=>e({cursorPosition:a}),resetQuery:()=>e({query:"",cursorPosition:0})}));function uu(){let e=y(s=>s.focus),a=_e(s=>s.query),o=_e(s=>s.cursorPosition),t=e==="search",r=a.slice(0,o),i=a.slice(o);return jsxs(Box,{borderStyle:"single",borderTop:false,borderBottom:true,borderLeft:false,borderRight:false,paddingX:1,marginX:1,marginBottom:1,children:[jsx(Text,{color:t?"cyan":"gray",children:"\u{1F50D} "}),t?jsxs(Fragment,{children:[jsx(Text,{color:"white",children:r}),jsx(Text,{inverse:true,children:i[0]??" "}),jsx(Text,{color:"white",children:i.slice(1)})]}):jsx(Text,{dimColor:true,children:a||"Search..."})]})}U();var pu=Object.keys(ho).map((e,a)=>({key:a<3?String(a+2):String((a+5)%10),type:e,...ho[e]})),mu=["internal","external"].map((e,a)=>({key:String(a+6),origin:e,...Kc[e]}));function gu(){let e=y(t=>t.catalogFilters),a=pu.every(t=>e.types.has(t.type)),o=mu.every(t=>e.origins.has(t.origin));return jsxs(Box,{paddingX:1,paddingBottom:1,gap:1,flexWrap:"wrap",children:[jsx(Text,{bold:true,children:"Type:"}),jsxs(Box,{gap:0,children:[jsx(Text,{dimColor:true,children:"[1] "}),jsxs(Text,{color:a?"green":void 0,dimColor:!a,children:[a?"\u25C9":"\u25CB"," All"]})]}),pu.map(t=>{let r=!a&&e.types.has(t.type);return jsxs(Box,{gap:0,children:[jsxs(Text,{dimColor:true,children:["[",t.key,"] "]}),jsxs(Text,{color:r?t.color:void 0,dimColor:!r,children:[r?"\u25C9":"\u25CB"," ",t.label]})]},t.key)}),jsx(Box,{marginLeft:2,children:jsx(Text,{bold:true,children:"|"})}),jsx(Box,{marginLeft:2,children:jsx(Text,{bold:true,children:"Origin:"})}),jsxs(Box,{gap:0,children:[jsx(Text,{dimColor:true,children:"[5] "}),jsxs(Text,{color:o?"green":void 0,dimColor:!o,children:[o?"\u25C9":"\u25CB"," All"]})]}),mu.map(t=>{let r=!o&&e.origins.has(t.origin);return jsxs(Box,{gap:0,children:[jsxs(Text,{dimColor:true,children:["[",t.key,"] "]}),jsxs(Text,{color:r?t.color:void 0,dimColor:!r,children:[r?"\u25C9":"\u25CB"," ",t.label]})]},t.key)})]})}U();function fu({type:e}){let{label:a,color:o}=ho[e];return jsx(Text,{color:o,children:a})}U();function vu({origin:e}){return e===dr?jsx(Text,{color:"blue",children:"[Flow]"}):jsx(Text,{color:"white",children:"[External]"})}j();var Xi=vv.memo(function({item:a,isSelected:o}){let t=a.status==="disabled"?"yellow":"green";return jsxs(Box,{flexDirection:"column",paddingBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u203A ":"\u25CB "}),jsx(Text,{bold:o,color:o?"cyan":"white",children:a.name}),a.type&&jsxs(Text,{children:[" ",jsx(fu,{type:a.type})]}),a.origin&&jsxs(Text,{children:[" ",jsx(vu,{origin:a.origin})]}),jsxs(Text,{dimColor:true,children:[a.authorName?` \xB7 ${a.authorName}`:"",a.version?` \xB7 v${a.version}`:" \xB7 n/a"]}),a.status&&jsxs(Text,{color:t,children:[" [",a.status,"]"]}),a.updateAvailable&&jsx(Text,{color:"yellow",children:" [\u2191 update available]"}),a.installedAt&&jsxs(Text,{dimColor:true,children:[" \xB7 ",qa(a.installedAt)]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:a.description})})]})});function Lt({message:e}){return jsx(Box,{paddingX:2,paddingY:1,children:jsx(Text,{dimColor:true,children:e??"No items found."})})}U();function Pu({items:e,emptyMessage:a}){let o=y(d=>d.selectedIndex);if(e.length===0)return jsx(Lt,{message:a});let t=Math.max(0,o-Math.floor(ea/2)),r=Math.min(e.length,t+ea);r===e.length&&(t=Math.max(0,r-ea));let i=e.slice(t,r),s=t,n=e.length-r;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:s>0?`\u2191 ${s} more above`:" "})}),i.map((d,l)=>jsx(Xi,{item:d,isSelected:t+l===o},d.name)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:n>0?`\u2193 ${n} more below`:" "})})]})}function Su({label:e,pathHint:a}){return jsxs(Box,{paddingBottom:1,children:[jsx(Text,{bold:true,color:"blueBright",children:e}),jsxs(Text,{dimColor:true,children:[" ",a]})]})}U();function Ru({groups:e,emptyMessage:a}){let o=y(p=>p.selectedIndex),t=[],r=0;for(let p of e){t.push({kind:"header",label:p.label,pathHint:p.pathHint,key:`h-${p.scope}`});for(let g of p.items)t.push({kind:"item",item:g,itemIndex:r,key:`i-${p.scope}-${g.name}-${g.marketplace??""}`}),r++;}if(r===0)return jsx(Lt,{message:a});let s=t.findIndex(p=>p.kind==="item"&&p.itemIndex===o),n=s>=0?s:0,d=Math.max(0,n-Math.floor(ea/2)),l=Math.min(t.length,d+ea);l===t.length&&(d=Math.max(0,l-ea));let c=t.slice(d,l),u=d,m=t.length-l;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:u>0?`\u2191 ${u} more above`:" "})}),c.map(p=>p.kind==="header"?jsx(Su,{label:p.label,pathHint:p.pathHint},p.key):jsx(Xi,{item:p.item,isSelected:p.itemIndex===o},p.key)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:m>0?`\u2193 ${m} more below`:" "})})]})}var Rv={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function Av({items:e,tabId:a,emptyMessage:o,groups:t,actionHint:r}){return jsxs(Box,{flexDirection:"column",children:[jsx(uu,{}),jsx(gu,{}),jsxs(Box,{paddingX:1,marginTop:1,children:[jsx(Text,{bold:true,children:Rv[a]}),jsxs(Text,{dimColor:true,children:[" (",e.length,")"]}),r&&e.length>0&&jsx(Text,{dimColor:true,children:` \xB7 ${r}`})]}),t&&t.length>0?jsx(Ru,{groups:t,emptyMessage:o}):jsx(Pu,{items:e,emptyMessage:o})]})}function Au({filteredItems:e,emptyMessage:a,groups:o,onBatchUpdate:t}){let r=y(d=>d.activeTab),i=y(d=>d.focus);return useInput(d=>{d==="a"&&e.length>0&&t?.();},{isActive:r==="updates"&&i==="list"}),jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(Av,{items:e,tabId:r,emptyMessage:a,groups:r!=="discover"?o:void 0,actionHint:r==="updates"?"press 'a' to update all":void 0},r)})}var Iv={tabs:"\u2190\u2192: switch tab | \u2193: navigate | Enter: select | Ctrl+C Ctrl+C: quit",list:"\u2191\u2193: navigate | Enter: select | Type: 1=All 2=Skill 3=MCP 4=Bundle | Origin: 5=All 6=Flow 7=External | \u2190\u2192/Tab: tabs | Ctrl+C\xD72: quit",search:"Type to filter | \u2193/Esc: exit search | Enter: confirm",actionMenu:"\u2191\u2193: navigate options | Enter: confirm | Esc: close menu",auth:"Tab: next field | Enter: confirm | Ctrl+C Ctrl+C: quit",starterKitList:"\u2191\u2193: navigate | Enter: select Starter Kit | Esc: skip",starterKitDetail:"\u2191\u2193: navigate | Enter: confirm & install | Esc: back",installProgress:"\u2191\u2193: navigate | Enter: select",moduleSetup:"\u2191\u2193: navigate | Space: toggle | Tab: change method | Enter: confirm",marketplaces:"\u2191\u2193: navigate | a: add catalog | d: remove catalog | r: refresh | \u2190\u2192/Tab: tabs | Ctrl+C\xD72: quit",verify:"\u2191\u2193: navigate | Enter: confirm | Ctrl+C Ctrl+C: quit",bundleInstallProgress:"Enter/Esc: back to catalog"};function Ki(){let e=y(o=>o.focus),a=!!process.env.DEBUG;return jsx(Box,{borderStyle:"single",borderTop:true,borderBottom:false,borderLeft:false,borderRight:false,children:jsxs(Text,{dimColor:true,children:[Iv[e],a?" | Ctrl+D: debug log":""]})})}j();function xu({message:e,type:a}){return e?jsx(Box,{paddingX:1,children:jsxs(Text,{color:a==="success"?"green":a==="info"?"cyan":"red",children:[a==="success"?"\u2713":a==="info"?"(i)":"\u2717"," ",v(e)]})}):null}function $i({message:e}){return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{children:[" ",e]})]})}function cd(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}var Mu=20;function Yi(e,a){let o=a>0?Math.min(e/a,1):0,t=Math.round(o*100),r=Math.round(o*Mu),i="\u2588".repeat(r)+"\u2591".repeat(Mu-r),s=`${cd(e)} / ${cd(a)}`;return {bar:i,percent:t,label:s}}function Zi({received:e,total:a}){let{bar:o,percent:t,label:r}=Yi(e,a);return jsxs(Text,{dimColor:true,children:[o," ",t,"%"," ","(",r,")"]})}function es({message:e,onRetry:a,onBack:o}){return useInput((t,r)=>{t==="r"&&r.ctrl&&a?a():r.escape&&o&&o();}),jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsxs(Text,{color:"red",children:["\u2717 ",e]}),a&&jsx(Text,{dimColor:true,children:"Press Ctrl+R to retry"}),o&&jsx(Text,{dimColor:true,children:"Press Escape to go back"})]})}function ra({itemName:e,actions:a,descriptions:o,onAction:t,onClose:r}){let i=y(d=>d.focus),[s,n]=useState(0);return useInput((d,l)=>{l.upArrow?n(c=>c>0?c-1:c):l.downArrow?n(c=>c<a.length-1?c+1:c):l.return?t(a[s]):l.escape&&r();},{isActive:i==="actionMenu"}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:e}),jsx(Box,{flexDirection:"column",marginTop:1,children:a.map((d,l)=>jsxs(Box,{children:[jsxs(Text,{bold:l===s,color:l===s?"cyan":void 0,children:[l===s?"\u203A ":" ",d]}),o?.[d]&&jsxs(Text,{dimColor:true,children:[" \u2014 ",o[d]]})]},l))})]})}U();var md=Object.entries(Ka),Ou=[...md.map(([,e])=>e.actionLabel),"Cancel"],Nu=Object.fromEntries(md.map(([,e])=>[e.actionLabel,e.description]));function Gu(e){let a=md.find(([,o])=>o.actionLabel===e);return a?a[0]:null}I();var Hv=k("provider.registry"),Vv=3e4,os=class{adapters=new Map;availabilityCache=new Map;register(a){this.adapters.set(a.id,a);}async checkAvailability(a){let o=this.availabilityCache.get(a.id);if(o&&Date.now()<o.expiresAt)return o.result;let t=await a.isAvailable();return this.availabilityCache.set(a.id,{result:t,expiresAt:Date.now()+Vv}),t}async getAvailableProviders(a){let o=[...this.adapters.values()].filter(r=>a in r.installers),t=await Promise.allSettled(o.map(r=>this.checkAvailability(r)));return t.forEach((r,i)=>{r.status==="rejected"&&Hv.warn(`Provider "${o[i].id}" isAvailable() threw: ${String(r.reason)}`);}),o.filter((r,i)=>{let s=t[i];return s.status==="fulfilled"&&s.value===true})}getAdapter(a){return this.adapters.get(a)}listAdapters(){return [...this.adapters.values()]}};var Qv={user:"global",project:"project",local:"local"};function ts(e){return e?Qv[e]:"global"}var Xe=class extends Error{constructor(o,t){super(`${o} v${t} is already installed. Use --force to reinstall.`);this.pluginName=o;this.version=t;this.name="AlreadyInstalledError";}pluginName;version},Io=class extends Error{constructor(o,t){super(`${o} is already up to date (v${t})`);this.pluginName=o;this.version=t;this.name="AlreadyUpToDateError";}pluginName;version};xr();gd();I();var Kv=k("catalog.registry"),rs=class{adapters=new Map;register(a){this.adapters.set(a.id,a);}unregister(a){this.adapters.delete(a);}async fetchAllWithErrors(){let a=this.listAdapters(),o=await Promise.allSettled(a.map(i=>i.fetchItems())),t=[],r=[];for(let i=0;i<o.length;i++){let s=o[i],n=a[i];if(s.status==="fulfilled")t.push(...s.value);else {let d=String(s.reason);Kv.warn(`Catalog adapter failed: ${d}`),r.push({adapterId:n.id,adapterName:n.name,reason:d});}}return {items:t,failures:r}}async fetchAll(){let{items:a}=await this.fetchAllWithErrors();return a}getAdapter(a){return this.adapters.get(a)}listAdapters(){return [...this.adapters.values()]}};Oe();var ry={retries:5,minTimeout:50};async function fd(e,a){mkdirSync(dirname(e),{recursive:true});let o=await zb.lock(e+".lock",{realpath:false,retries:ry});try{return await a()}finally{await o();}}var is=class{filePath;constructor(a){this.filePath=a??ol();}async read(){try{let a=await readFile(this.filePath,"utf-8");return JSON.parse(a).catalogs??[]}catch(a){if(a.code==="ENOENT")return [];throw a}}async write(a){let o=dirname(this.filePath);await mkdir(o,{recursive:true});let t=`${this.filePath}.${randomUUID()}.tmp`;await writeFile(t,JSON.stringify({catalogs:a},null,2),"utf-8"),await rename(t,this.filePath);}async add(a){await fd(this.filePath,async()=>{let o=await this.read();if(o.some(r=>r.id===a.id))return;let t={...a,lastUpdated:a.lastUpdated??new Date().toISOString()};await this.write([...o,t]);});}async remove(a){if(a==="flow-api")throw new Error("The Flow Marketplace catalog cannot be removed");await fd(this.filePath,async()=>{let o=await this.read();await this.write(o.filter(t=>t.id!==a));});}async updateField(a,o){await fd(this.filePath,async()=>{let t=await this.read();t.some(r=>r.id===a)&&await this.write(t.map(r=>r.id===a?{...r,...o}:r));});}};bd();var me=new rs,ao=new is,gy=["flow-harness"];function fy(){let e=process.env.FLOW_CONTENT_SOURCES;return e===void 0?gy:e.split(",").map(a=>a.trim()).filter(Boolean)}me.register(new Ut);for(let e of fy())me.register(new Ut(e));var Ku=false;async function $u(){if(Ku)return;Ku=true;let e=await ao.read(),{GitRepoAdapter:a}=await Promise.resolve().then(()=>(vd(),Xu));for(let o of e)me.register(new a(o.id,o.name,o.source));}To();function Yu(e){if(e===void 0||!Number.isFinite(e)||e<=0)return 3e4;let a=e/131072*1e3;return Math.min(6e5,Math.max(3e4,Math.ceil(a)))}I();var by=k("api:actions"),Zu=2;async function oo(e){if(e){let{FlowApiAdapter:a}=await Promise.resolve().then(()=>(bd(),Wu));return new a(e).fetchItems()}return me.fetchAll()}async function ep(){return me.fetchAllWithErrors()}async function Wt(e,a){Er(e);try{return await Ot(`v1/plugins/${e}/manifest`,a).json()}catch(o){let t=await Nt(o);throw t?new Error(t):o instanceof Error?o.message.includes("404")?new Error(`Plugin '${e}' not found in catalog`):o.message.includes("timeout")?new Error("Download timed out after 30s"):new Error(`Failed to fetch plugin manifest: ${o.message}`):o}}async function vy(e,a){try{let t=(await ju(`v1/plugins/${e}/archive`,{source:a,timeoutMs:3e4})).headers.get("x-archive-size"),r=t?Number(t):NaN;return Number.isFinite(r)&&r>0?r:void 0}catch(o){by.debug(`[${e}] Archive size probe failed, using default timeout: ${String(o)}`);return}}async function ap(e,a,o){Er(e);try{let t=await vy(e,o),r=Yu(t),i=await Ot(`v1/plugins/${e}/archive`,o,r),s=i.headers.get("x-archive-size"),n=s?Number(s):NaN,d=Number.isFinite(n)&&n>0?n:0,l=d>0,c=i.body;if(!c)throw new Error("Failed to download plugin: response has no body");let u=c.getReader(),m=[],p=0;for(;;){let{done:g,value:f}=await u.read();if(g)break;if(p+=f.byteLength,l&&p>d*Zu)throw await u.cancel(),new Error(`Download exceeded expected size: received ${p} bytes, expected at most ${d*Zu}`);m.push(f),l&&a?.(p,d);}return Buffer.concat(m)}catch(t){if(t instanceof Error&&t.message.includes("Download exceeded expected size"))throw t;let r=await Nt(t);throw r?new Error(r):t instanceof Error?new Error(`Failed to download plugin: ${t.message}`):t}}async function ns(){try{let{profiles:e}=await Ua().get("v1/plugins/profiles").json();return e}catch(e){throw e instanceof Error?e.message.includes("401")||e.message.includes("403")?new Error("Authentication failed. Run: flow auth login"):e.message.includes("timeout")?new Error("Request timed out while fetching starter kits"):new Error(`Failed to fetch starter kits: ${e.message}`):e}}Oe();Oe();async function op(e,a){let o=ne.resolve(a);await za.mkdir(o,{recursive:true});let t=ne.join(ne.dirname(o),`${randomUUID()}.zip`);try{await za.writeFile(t,e);let r=await ky.Open.file(t),i=ne.normalize(o+ne.sep);for(let s of r.files){if((s.externalFileAttributes>>16&61440)===40960)throw new Error(`Zip Slip (symlink): entry "${s.path}" is a symbolic link and was rejected`);let d=ne.resolve(o,s.path);if(process.platform==="win32"&&d.length>=260)throw new Error(`Path too long: "${d}" (${d.length} chars) meets or exceeds the 260-character Windows MAX_PATH limit. Enable Long Paths in Windows or move the Claude plugin cache to a shorter base path.`);if(!d.startsWith(i)&&d!==o)throw new Error(`Zip Slip detected: entry "${s.path}" would escape target directory`)}await r.extract({path:o});try{let s=realpathSync(o);if(!s.startsWith(ne.resolve(ne.dirname(o))))throw new Error(`Zip Slip (post-extract): resolved path "${s}" is outside expected parent`)}catch(s){if(s.code!=="ENOENT")throw s}}finally{try{await za.unlink(t);}catch{}}}async function yd(e){await za.rm(e,{recursive:true,force:true});}async function Mo(){let e=el();await za.mkdir(ne.dirname(e),{recursive:true});try{await za.writeFile(e,"",{flag:"wx"});}catch(o){if(o.code!=="EEXIST")throw o}return await zb.lock(e,{stale:1e4,retries:{retries:2,minTimeout:500,maxTimeout:500}})}Oe();U();function wy(e){return {$schema:"https://anthropic.com/claude-code/marketplace.schema.json",name:e||ue,description:"Flow Skills marketplace",owner:{name:"Flow Team",email:"flow@ciandt.com"},plugins:[]}}function ip(e){let a=ui(e);if(!ie__default.existsSync(a))return null;try{return JSON.parse(ie__default.readFileSync(a,"utf-8"))}catch{return null}}function Sy(e){let a=ip(e);if(a)return a;let o=wy(e),t=ui(e);return ie__default.mkdirSync(ne__default.dirname(t),{recursive:true}),kd(o,e),o}function kd(e,a){let o=ui(a),t=`${o}.${randomUUID()}.tmp`;ie__default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),ie__default.renameSync(t,o);}function Cy(e){let a=e||ue,o=Jo(),t={};try{ie__default.existsSync(o)&&(t=JSON.parse(ie__default.readFileSync(o,"utf-8")));}catch{t={};}if(t[a])return;t[a]={source:{source:"github",repo:`cit-flow/${a}`},installLocation:Zc(e),lastUpdated:new Date().toISOString(),autoUpdate:true};let r=`${o}.${randomUUID()}.tmp`;ie__default.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),ie__default.renameSync(r,o);}function sp(e,a,o){ia(e.name),Cy(o);let t=vn(e.name,o);ie__default.mkdirSync(ne__default.dirname(t),{recursive:true});try{ie__default.lstatSync(t),ie__default.rmSync(t,{recursive:!0,force:!0});}catch{}ie__default.cpSync(a,t,{recursive:true,dereference:true});let r=Sy(o);r.plugins.some(s=>s.name===e.name)||(r.plugins.push({name:e.name,description:e.description,version:e.version,author:e.author,source:`./plugins/native/${e.name}`,category:e.category}),kd(r,o));}function Pd(e,a){ia(e);let o=vn(e,a);try{ie__default.rmSync(o,{recursive:!0,force:!0});}catch{}let t=ip(a);if(!t)return;let r=t.plugins.length;t.plugins=t.plugins.filter(i=>i.name!==e),t.plugins.length!==r&&kd(t,a);}j();I();var Ay=k("mcpConfigReader"),xy=500,Ey=512;function Iy(){return ne__default.join(Ce__default.homedir(),".claude.json")}function Ty(){return ne__default.join(process.cwd(),".mcp.json")}function dp(e){if(!ie__default.existsSync(e))return null;try{return JSON.parse(ie__default.readFileSync(e,"utf-8"))}catch{return Ay.debug(`[mcpConfigReader] Failed to parse ${e}`),null}}function Ir(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Dd(e){if(!Ir(e))return {};let a=e.mcpServers;return Ir(a)?a:{}}function wd(e,a){return Object.keys(e).slice(0,xy).map(t=>({name:v(t.slice(0,Ey)),marketplace:"",version:void 0,installedAt:"",installPath:"",scope:a,description:void 0,author:void 0,status:"enabled",type:"mcp"}))}function lp(){let e=[],a=Iy(),o=dp(a);if(Ir(o)){let n=o,d=Dd(n);e.push(...wd(d,"user"));let l=process.cwd();if(Ir(n.projects)){let c=n.projects[l];if(Ir(c)){let u=Dd(c);e.push(...wd(u,"local"));}}}let t=Ty(),r=dp(t),i=Dd(r);e.push(...wd(i,"project"));let s=new Map;for(let n of e){let d=`${n.name}@${n.scope}`;s.has(d)||s.set(d,n);}return [...s.values()]}I();var sa=k("storage");async function qy(e,a,o){try{await C(w.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:o,source:a,interface:Z().interfaceType});}catch(t){sa.warn(`Failed to send uninstall metrics: ${String(t)}`);}}function Ly(e,a,o){let t=a==="enabled"?w.CLI_TOOL_ENABLED:w.CLI_TOOL_DISABLED;C(t,{tool_id:e,source:o,interface:Z().interfaceType}).catch(r=>sa.warn(`Failed to send ${a} metrics: ${String(r)}`));}function Ad(){return ne__default.join(Ce__default.homedir(),".claude","plugins","installed_plugins.json")}function Fy(){return ne__default.join(Ce__default.homedir(),".claude","plugins")}function ds(e){let a;try{a=ie__default.realpathSync(e);}catch{a=ne__default.resolve(e);}let o=ne__default.resolve(Fy()),t=ne__default.resolve(ne__default.join(process.cwd(),".claude","plugins")),r=a.startsWith(o+ne__default.sep),i=a.startsWith(t+ne__default.sep);if(!r&&!i)throw new Error(`Security error: installPath '${e}' is outside the plugins directory`)}function pp(e="user"){return e==="local"?ne__default.join(process.cwd(),".claude","settings.local.json"):e==="project"?ne__default.join(process.cwd(),".claude","settings.json"):ne__default.join(Ce__default.homedir(),".claude","settings.json")}function Ae(){let e=Ad();if(!ie__default.existsSync(e))return {version:2,plugins:{}};try{return JSON.parse(ie__default.readFileSync(e,"utf-8"))}catch{return {version:2,plugins:{}}}}async function xd(){let e=Ad();try{let a=await ie__default.promises.readFile(e,"utf-8");return JSON.parse(a)}catch{return {version:2,plugins:{}}}}function Oy(e){let a=e?.code;return a==="EACCES"||a==="EPERM"}function mp(e,a){try{ie__default.mkdirSync(ne__default.dirname(e),{recursive:!0});let o=`${e}.${randomUUID()}.tmp`;ie__default.writeFileSync(o,JSON.stringify(a,null,2),{encoding:"utf-8",mode:384}),ie__default.renameSync(o,e);}catch(o){throw Oy(o)?new Error(`Permission denied: cannot write to '${e}'. Check your file system permissions.`):o}}function na(e){mp(Ad(),e);}function Tr(e){let a=e.lastIndexOf("@");return a===-1?{name:e,marketplace:""}:{name:e.slice(0,a),marketplace:e.slice(a+1)}}function Ny(e,a){let o=ne__default.join(e,".claude-plugin"),t=ne__default.join(o,"plugin.json");if(ie__default.existsSync(t))try{return JSON.parse(ie__default.readFileSync(t,"utf-8"))}catch{return null}let r=ne__default.join(o,"marketplace.json");if(ie__default.existsSync(r))try{let i=JSON.parse(ie__default.readFileSync(r,"utf-8"));return {description:i.plugins?.find(n=>n.name===a)?.description,author:i.owner}}catch{return null}return null}function Mr(e="user"){let a=pp(e);if(!ie__default.existsSync(a))return {};try{return JSON.parse(ie__default.readFileSync(a,"utf-8"))}catch{return {}}}function cs(e,a="user"){mp(pp(a),e);}function Gy(e,a){let{name:o,marketplace:t}=Tr(e),r;if(t?(r=`${o}@${t}`,a[r]||(r=void 0)):r=Object.keys(a).filter(s=>Tr(s).name===o)[0],!r)throw sa.error(`[${o}] Plugin is not installed`),new Error(`Plugin '${o}' is not installed`);return {key:r,name:o}}function By(e,a){let{name:o,marketplace:t}=Tr(e),r;return t?(r=`${o}@${t}`,a[r]||(r=void 0)):r=Object.keys(a).filter(s=>Tr(s).name===o)[0],r?{key:r,name:o}:null}function Sd(e="user"){return Mr(e).enabledPlugins??{}}function Cd(e,a="user"){let o=Mr(a),t=o.enabledPlugins;if(!t||!(e in t))return;let{[e]:r,...i}=t;o.enabledPlugins=i,cs(o,a);}function qr(e,a,o="user"){let t=Mr(o),r=t.enabledPlugins??{};t.enabledPlugins={...r,[e]:a},cs(t,o);}function jy(e){let a=new Map;for(let o of e){let t=o.projectPath?`${o.scope}:${o.projectPath}`:o.scope,r=a.get(t);(!r||o.installedAt>r.installedAt)&&a.set(t,o);}return [...a.values()]}function ce(){let e=Ae(),a=Sd(),o=Sd("project"),t=Sd("local"),r={project:o,local:t},i=Object.entries(e.plugins).flatMap(([l,c])=>{let{name:u,marketplace:m}=Tr(l),p=c.map(f=>f.scope==="managed"?{...f,scope:"user"}:f);return jy(p).map(f=>{let h=Ny(f.installPath,u),D=(r[f.scope]??a)[l];return {name:u,marketplace:m,version:f.version&&f.version!=="unknown"?f.version:void 0,installedAt:f.installedAt,installPath:f.installPath,scope:f.scope,providerId:f.providerId,type:f.type,description:h?.description,author:h?.author,status:D===false?"disabled":"enabled"}})}),s=lp(),n=new Set(i.map(l=>`${l.name}@${l.scope}`)),d=s.filter(l=>!n.has(`${l.name}@${l.scope}`));return [...i,...d]}function up(e){let a=e.lastIndexOf("@");return a>0?e.slice(a+1):void 0}async function Lr(e,a){sa.debug(`[${e}] Acquiring lock to uninstall`);let o=await Mo();try{let t=Ae(),r=By(e,t.plugins);if(!r)throw new Error(`Plugin '${e}' is not in installed_plugins.json. If this is an MCP server from config, use the MCP remove command instead.`);let{key:i,name:s}=r,n=t.plugins[i];if(a){let d=n.find(u=>u.scope===a);if(!d)throw new Error(`Plugin '${s}' is not installed in ${a} scope`);sa.debug(`[${s}] Resolved key: ${i}, scope: ${a}`),ds(d.installPath);let l=ne__default.dirname(d.installPath);ds(l),sa.debug(`[${s}] Removing directory: ${l}`),ie__default.rmSync(l,{recursive:!0,force:!0});let c=n.filter(u=>u.scope!==a);if(c.length===0){let{[i]:u,...m}=t.plugins;na({...t,plugins:m}),Cd(i,a),Pd(s,up(i));}else t.plugins[i]=c,na(t),Cd(i,a);}else {sa.debug(`[${s}] Resolved key: ${i}`);for(let c of n){ds(c.installPath);let u=ne__default.dirname(c.installPath);ds(u),sa.debug(`[${s}] Removing directory: ${u}`),ie__default.rmSync(u,{recursive:!0,force:!0}),Cd(i,c.scope);}Pd(s,up(i));let{[i]:d,...l}=t.plugins;na({...t,plugins:l});}await qy(s,n[0].origin??"internal",n[0].type??"skill"),sa.debug(`[${s}] Uninstalled successfully`);}finally{await o();}}async function Fr(e,a,o){sa.debug(`[${e}] Acquiring lock to set status \u2192 ${a}`);let t=await Mo();try{let r=Ae(),{key:i,name:s}=Gy(e,r.plugins),n=r.plugins[i],d=o??n[0].scope,l=n[0].origin??"internal";sa.debug(`[${s}] Resolved key: ${i}, scope: ${d}`),qr(i,a==="enabled",d),Ly(s,a,l),sa.debug(`[${s}] Status updated to ${a}`);}finally{await t();}}Oe();function Ed(e){return e===null||typeof e!="object"||Array.isArray(e)?e:Object.fromEntries(Object.entries(e).sort(([a],[o])=>a.localeCompare(o)).map(([a,o])=>[a,Ed(o)]))}function Or(e,a){let o={...e};for(let[t,r]of Object.entries(a)){let i=o[t];if(Array.isArray(r)&&Array.isArray(i)){let s=new Set(i.map(n=>JSON.stringify(Ed(n))));o[t]=[...i,...r.filter(n=>!s.has(JSON.stringify(Ed(n))))];}else r!==null&&typeof r=="object"&&!Array.isArray(r)&&i!==null&&typeof i=="object"&&!Array.isArray(i)?o[t]=Or(i,r):o[t]=r;}return o}I();var Id=k("bundleContent"),ls="${CLAUDE_PLUGIN_ROOT}/hooks/";function Uy(e){return e.split(ls).join("$CLAUDE_PROJECT_DIR/.claude/hooks/")}function Td(e){return typeof e=="string"?Uy(e):Array.isArray(e)?e.map(Td):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([a,o])=>[a,Td(o)])):e}function zy(e,a){let o=ne__default.join(e,"rules");if(!ie__default.existsSync(o))return 0;let t=ie__default.readdirSync(o).filter(i=>i.endsWith(".md")&&ie__default.lstatSync(ne__default.join(o,i)).isFile());if(t.length===0)return 0;let r=Pt(a);ie__default.mkdirSync(r,{recursive:true});for(let i of t)ie__default.copyFileSync(ne__default.join(o,i),ne__default.join(r,i));return t.length}function Wy(e,a){let o=ne__default.join(e,"hooks","hooks.json");if(!ie__default.existsSync(o))return 0;let t;try{t=JSON.parse(ie__default.readFileSync(o,"utf-8"));}catch(g){return Id.warn(`hooks/hooks.json is not valid JSON \u2014 skipping: ${String(g)}`),0}let r=t.hooks;if(!r||typeof r!="object"||Array.isArray(r))return 0;let i=ne__default.join(e,"hooks"),s=kn(a),n=new Set,d=g=>{if(typeof g=="string"&&g.includes(ls)){let f=g.slice(g.indexOf(ls)+ls.length),h=/^([^"'\s]+)/.exec(f);h&&n.add(h[1]);}else Array.isArray(g)?g.forEach(d):g!==null&&typeof g=="object"&&Object.values(g).forEach(d);};d(r);let l=0;if(n.size>0){ie__default.mkdirSync(s,{recursive:true});for(let g of n){let f=ne__default.join(i,g);ie__default.existsSync(f)&&(ie__default.copyFileSync(f,ne__default.join(s,g)),l++);}}let c=Td(r),u=Mr(a),m=u.hooks!==null&&typeof u.hooks=="object"&&!Array.isArray(u.hooks)?u.hooks:{},p=Or(m,c);return cs({...u,hooks:p},a),l}function gp(e,a){let o=zy(e,a),t=Wy(e,a);o>0&&Id.debug(`Copied ${o} rule file(s) to ${Pt(a)}`),t>0&&Id.debug(`Copied ${t} hook script(s) to ${kn(a)}`);}U();I();var Jy=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,Hy=/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)?$/;function ia(e){if(!Jy.test(e))throw new Error(`Invalid plugin name from manifest: "${e}". Plugin names must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Vy(e){if(!Hy.test(e))throw new Error(`Invalid plugin version from manifest: "${e}". Versions must follow semver format (e.g. 1.0.0 or 1.0.0-beta.1).`)}var Lo=k("installer");function Qy(e,a,o){let t=`${e}@${o||ue}`,i=Ae().plugins[t];if(i&&!a)throw new Xe(e,i[0].version??"unknown");return {pluginKey:t,alreadyInstalled:i}}async function _y(e,a,o){o&&await yd(a);try{Lo.debug(`[${a}] Extracting archive...`),await op(e,a);}catch(t){throw await yd(a),t}}function Xy(e,a,o,t,r,i="claude-code",s){let n=Ae(),d={scope:t,...t==="user"?{}:{projectPath:process.cwd()},installPath:a,version:o,installedAt:new Date().toISOString(),origin:r,providerId:i,type:s},l=n.plugins[e]??[];n.plugins[e]=[...l.filter(c=>c.scope!==t),d],na(n),qr(e,true,t);}async function Ky(e,a,o,t,r,i){try{await C(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:i,source:r,scope:t,version:a,duration_ms:o,interface:Z().interfaceType});}catch(s){Lo.warn(`Failed to send install metrics: ${String(s)}`);}}async function $y(e,a,o,t){try{await C(w.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:t,source:o,error_code:a instanceof Error?a.name:"UNKNOWN",error_message:(a instanceof Error?a.message:String(a)).slice(0,500),interface:Z().interfaceType});}catch(r){Lo.warn(`Failed to send install-failed metrics: ${String(r)}`);}}async function je(e,a={}){let o=Date.now(),t=null;try{Lo.debug(`[${e}] Acquiring lock...`),t=await Mo();let{pluginKey:r,alreadyInstalled:i}=Qy(e,a.force,a.source),{source:s}=a;Lo.debug(`[${e}] Fetching manifest...`);let n=await Wt(e,s);ia(n.name),Vy(n.version),Lo.debug(`[${e}] Downloading archive...`);let d=await ap(e,a.onDownloadProgress,s),l=a.scope??"user",c=a.type??"skill",u=Yc(n.name,n.version,a.source);await _y(d,u,!!i&&!!a.force),gp(u,l),Xy(r,u,n.version,l,"internal",a.providerId,c),sp(n,u,a.source);let m=Date.now()-o;Lo.debug(`[${e}] Installed successfully in ${m}ms`);let p={name:n.name,version:n.version,path:u,duration_ms:m};return a.skipMetrics||await Ky(n.name,n.version,m,ts(l),"internal",c),p}catch(r){throw await $y(e,r,"internal",a.type??"skill"),Lo.error(`[${e}] Installation failed: ${r instanceof Error?r.message:String(r)}`),r}finally{t&&await t();}}I();j();Re();xt();I();var Yy=k("commands:helpers");async function fe(){let e=await Y();if(!e)return S("Not authenticated. Run: flow auth login"),false;e.customUrl&&La(e.customUrl);try{await Oa();}catch(a){return Yy.debug(`Token validation failed: ${String(a)}`),S("Session expired. Run: flow auth login"),false}return true}async function ee(e){let a=qd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(v(e),t=>{a.close(),o(["y","yes"].includes(t.toLowerCase().trim()));});})}async function Fo(e){let a=qd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(v(e),t=>{a.close(),o(t.trim());});})}var Zy="\x1B[A",ek="\x1B[B";function fp(e,a){let o=a?R.cyan("\u276F"):" ",t=a?R.cyan(e.label):e.label,r=e.description?R.dim(` \u2014 ${e.description}`):"";return ` ${o} ${t}${r}`}function ak(e,a){return e.map((o,t)=>fp(o,t===a)).join(`
111
+ `)}async function us(e,a){if(a.length===0)throw new Error("selectPrompt requires at least one option");return new Promise((o,t)=>{let r=0;process.stdout.write(`${v(e)}
112
+ `),process.stdout.write(ak(a,r));let i="",s=c=>{if(i+=c,i===""){d(),t(new Error("SIGINT"));return}if(i==="\r"||i===`
113
113
  `){d(),process.stdout.write(`
114
- `),o(a[r].value);return}if(i===ak){r=(r-1+a.length)%a.length,n(),i="";return}if(i===ok){r=(r+1)%a.length,n(),i="";return}i.startsWith("\x1B")&&i.length<3||(i="");};function n(){process.stdout.write(`\x1B[${a.length-1}A`);for(let c=0;c<a.length;c++)process.stdout.write(`\r\x1B[2K${fp(a[c],c===r)}`),c<a.length-1&&process.stdout.write(`
115
- `);}function d(){process.stdin.setRawMode(false),process.stdin.removeListener("data",s),process.removeListener("uncaughtException",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",l),process.removeListener("SIGTERM",l);}function l(){try{process.stdin.setRawMode(!1);}catch{}process.exit(1);}process.on("uncaughtException",l),process.on("unhandledRejection",l),process.on("SIGINT",l),process.on("SIGTERM",l),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",s);})}To();var Ht=P("claudeProxy"),Ud="claude ",hp="flow ",Gd=class extends Error{constructor(a){super(`Invalid install command: "${a}". Command must start with "claude " for security.`),this.name="InvalidInstallCommandError";}},Jt=class extends Error{constructor(a){super(`Disallowed subcommand: "${a}". Only "plugin install", "plugin marketplace add", "mcp add", and "mcp remove" are permitted.`),this.name="DisallowedSubcommandError";}},rk=/^plugins?\s+(install|i)\s+|^plugins?\s+marketplace\s+add\s+|^mcp\s+(add|remove)\s+/,ik=/^--(scope|transport|env|header|timeout|prefix-args|timeout-ms|local|global|user)$/,sk={"--scope":/^(local|user|global|project)$/,"--transport":/^(sse|stdio|http)$/,"--env":/^[A-Za-z_][A-Za-z0-9_]*=/,"--header":/^[A-Za-z0-9][A-Za-z0-9-]*:/,"--timeout":/^\d{1,10}$/,"--timeout-ms":/^\d{1,10}$/,"--prefix-args":/^[\x20-\x7e]{1,500}$/},nk=/^npm\s+(i|install)\s+-g\s+@ciandt-flow\/cli$/,dk=/^(flow|claude)\s+auth\s+login(\s|$)/,bp=/^flow\s+plugins?\s+(install|i)\s+([^@\s]+)$/;function vp(e){return bp.test(e.trim())}function ck(e){return bp.exec(e.trim())?.[2]??""}async function yp(e){let a=ck(e);kd(a);let o=Date.now();Ht.debug(`[${a}] Executing: flow plugin install ${a}`);try{let t=await execa("flow",["plugin","install",a],{reject:!1});return {name:a,command:`flow plugin install ${a}`,exitCode:t.exitCode??1,stdout:t.stdout,stderr:t.stderr,duration_ms:Date.now()-o}}catch(t){throw zd(t)?new Bd:t}}function lk(e){kp(e);let a=e.slice(Ud.length);if(!rk.test(a))throw new Jt(e)}var ps=class extends Error{constructor(){super('Claude Code CLI not found. Ensure "claude" is installed and available on your PATH.'),this.name="ClaudeCliNotFoundError";}},Bd=class extends Error{constructor(){super('Flow CLI not found. Ensure "flow" is installed and available on your PATH.'),this.name="FlowCliNotFoundError";}};function kp(e){if(!e||!/^claude /.test(e))throw new Gd(e)}function uk(e){for(let a=0;a<e.length;a++){let o=e[a];if(o==="--")return;if(!o.startsWith("-"))continue;if(!ik.test(o))throw new Jt(`Unexpected flag: ${o}`);let t=sk[o];if(t!==void 0){let r=e[a+1];if(r===void 0||r.startsWith("-"))throw new Jt(`Flag ${o} requires a value`);if(!t.test(r))throw new Jt(`Unsafe value for flag ${o}`);a++;}}}async function qe(e){kp(e);let a=e.slice(Ud.length).split(/\s+/).filter(Boolean);uk(a);let o=pk(a);Ht.debug(`[${o}] Executing proxy command: claude ${a.join(" ")}`);let t=Date.now();try{let r=await execa("claude",a,{reject:!1}),i=Date.now()-t;return Ht.debug(`[${o}] Proxy command finished with exit code ${r.exitCode} in ${i}ms`),{name:o,command:e,exitCode:r.exitCode??1,stdout:r.stdout,stderr:r.stderr,duration_ms:i}}catch(r){throw zd(r)?new ps:r}}function pk(e){return e.length>=3?e[2]:e.join(" ")}function zd(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}function mk(e){return e.startsWith(hp)?Ud+e.slice(hp.length):e}function gk(e){return nk.test(e)||dk.test(e)}function fk(e){let a=0;for(;a<e.length&&gk(e[a]);)a++;return e.slice(a)}var hk=/^claude\s+(?:plugins?\s+(?:install|i)\s+|mcp\s+(?:add|remove)\s+)/;function bk(e,a){return !a||e.includes("--scope")||!hk.test(e)?e:`${e} --scope ${a}`}async function Nr(e,a){let o=e.split("&&").map(s=>s.trim()).filter(Boolean),r=fk(o).map(s=>mk(s)).map(s=>bk(s,a));if(r.length===0)throw new Error("Empty install command");for(let s of r)lk(s);Ht.debug(`[installCommand] Executing ${r.length} command(s)`);let i=await qe(r[0]);if(i.exitCode!==0)return i;for(let s=1;s<r.length;s++)if(i=await qe(r[s]),i.exitCode!==0)return i;return i}async function ms(e,a,o){let t=Bt(e),r=a?.trim();if(!r&&(r=(await Fo(`Plugin "${t}" could not be installed.
116
- If a marketplace is needed, enter the source (owner/repo or URL), or press Enter to skip: `))?.trim(),!r))throw new Error("No marketplace source provided. Cannot retry install.");r=ss(r),o?.(),Ht.debug(`[${t}] Adding marketplace via: claude plugin marketplace add ${r}`);try{let i=await execa("claude",["plugin","marketplace","add",r],{reject:!1});if(i.exitCode!==0)throw new Error(`Failed to add marketplace: ${i.stderr||"unknown error"}`);Ht.debug(`[${t}] Marketplace added successfully`);}catch(i){throw zd(i)?new ps:i}}To();U();Oe();I();var Dk=6e4,Oo=class extends Error{url;isTimeout;isAuthError;constructor(a,o,t=false,r=false){super(a),this.name="GitCloneError",this.url=o,this.isTimeout=t,this.isAuthError=r;}};async function Ca(e,a){let o=await mkdtemp(join(tmpdir(),"flow-skills-")),t=simpleGit({timeout:{block:Dk}}).env("GIT_TERMINAL_PROMPT","0").env("GIT_LFS_SKIP_SMUDGE","1"),r=a?["--depth","1","--branch",a]:["--depth","1"];try{return await t.clone(e,o,r),o}catch(i){await rm$1(o,{recursive:true,force:true}).catch(()=>{});let s=i instanceof Error?i.message:String(i),n=s.includes("block timeout")||s.includes("timed out"),d=s.includes("Authentication failed")||s.includes("could not read Username")||s.includes("Permission denied")||s.includes("Repository not found");throw n?new Oo("Clone timed out after 60s. Check your SSH keys or credentials.",e,true,false):d?new Oo(`Authentication failed for ${e}. Ensure you have access and credentials are configured.`,e,false,true):new Oo(`Failed to clone ${e}: ${s}`,e,false,false)}}async function Ra(e){let a=normalize(resolve(e)),o=normalize(resolve(tmpdir()));if(!a.startsWith(o+sep))throw new Error("Attempted to clean up directory outside of temp directory");await rm$1(e,{recursive:true,force:true});}async function ct(e,a=["--version"]){try{return (await execa(e,a,{reject:!1})).exitCode===0}catch(o){if(o instanceof Error&&"code"in o&&o.code==="ENOENT")return false;throw o}}function Sk(e){return typeof e=="object"&&e!==null&&e.source==="git-subdir"}function Ck(e){return typeof e=="object"&&e!==null&&e.source==="url"}function Rk(e){return typeof e=="object"&&e!==null&&e.source==="github"}function lt(e,a){let o=e.source;if(Sk(o)){let t=o.path?o.path.replace(/^\.\//,""):".",r=o.ref&&!/^[0-9a-f]{40}$/i.test(o.ref)?o.ref:void 0;return {cloneUrl:o.url,subPath:t||".",ref:r}}if(Ck(o))return {cloneUrl:o.url,subPath:"."};if(Rk(o))return {cloneUrl:`https://github.com/${o.repo}`,subPath:"."};if(typeof o=="string"){if(o.startsWith("https://")||o.startsWith("git@"))return {cloneUrl:o,subPath:"."};if((o.startsWith("./")||o===".")&&a){let t=o==="."?".":o.replace(/^\.\//,"")||".";return {cloneUrl:a,subPath:t}}}return null}function da(e){return e.toLowerCase().replace(/[^a-z0-9._]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").substring(0,255)||"unnamed"}var Aa=P("claude-code.adapter");function xk(e,a){let o=e??"external";if(!a)return o;let t=a.match(/github\.com\/([^/]+\/[^/]+?)(?:\.git)?(?:[/?#]|$)/);if(!t)return o;let r=t[1],i=Jo();if(!se__default.existsSync(i))return o;try{let s=JSON.parse(se__default.readFileSync(i,"utf-8"));for(let[n,d]of Object.entries(s))if(d.source?.repo===r)return n}catch{}return o}async function xp(e,a){let o=e.catalogId?ge.getAdapter(e.catalogId):void 0,t=lt(e,o?.source);if(!t)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let r=e.type==="bundle"||e.type==null,i=xk(e.catalogId,o?.source),s=a.scope??"user",n;r?n=wn(i,e.name,"external"):n=join(Ho(s==="user"?"global":"project"),e.name);let d=null;try{ia(e.name),d=await Ca(t.cloneUrl,t.ref);let l=t.subPath==="."?d:join(d,t.subPath);if(se__default.existsSync(n)&&se__default.rmSync(n,{recursive:!0,force:!0}),se__default.mkdirSync(dirname(n),{recursive:!0}),se__default.cpSync(l,n,{recursive:!0}),r){let c=`${e.name}@${i}`,u=await Md(),p={scope:s,installPath:n,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:e.type},m=u.plugins[c]??[];u.plugins[c]=[...m.filter(g=>g.scope!==s),p],na(u),qr(c,!0,s);}return {success:!0,message:`Installed ${e.name} from ${t.cloneUrl}`}}catch(l){return Aa.debug(`[${e.name}] External catalog install failed: ${String(l)}`),{success:false,message:l instanceof Error?l.message:String(l)}}finally{d&&await Ra(d).catch(()=>{});}}async function Wd(e,a,o,t){try{await C(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:o,source:"external",scope:ts(t),version:"unknown",duration_ms:a,interface:Z().interfaceType});}catch(r){Aa.warn(`Failed to send external install metrics: ${String(r)}`);}}async function Cp(e,a,o){try{await C(w.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:o,source:"external",error_code:a instanceof Error?a.name:"UNKNOWN",error_message:(a instanceof Error?a.message:String(a)).slice(0,500),interface:Z().interfaceType});}catch(t){Aa.warn(`Failed to send external install-failed metrics: ${String(t)}`);}}var Ek={async install(e,a){if(e.origin===ft&&!e.installCommand&&!Gt(e.name))return xp(e,a);if(e.origin===ft&&e.installCommand){let o=e.type??"skill",t=await Nr(e.installCommand,a.scope);return t.exitCode===0?(await Wd(e.name,t.duration_ms,o,a.scope),{success:true,message:`Installed ${e.name}`}):(await Cp(e.name,new Error(t.stderr||"Install failed"),o),{success:false,message:t.stderr||`Install failed with exit code ${t.exitCode}`})}if(Gt(e.name)){let o=e.type??"skill",t=jt(e.name,a.scope);Aa.debug(`[${e.name}] Attempting install: ${t}`);let r=await qe(t);if(r.exitCode===0)return await Wd(e.name,r.duration_ms,o,a.scope),{success:true};Aa.debug(`[${e.name}] First attempt failed, adding marketplace`),await ms(e.name,a.marketplaceSource,()=>{});let i=await qe(t);return i.exitCode===0?(await Wd(e.name,i.duration_ms,o,a.scope),{success:true}):(await Cp(e.name,new Error(i.stderr||"Install failed"),o),{success:false,message:i.stderr||`Install failed with exit code ${i.exitCode}`})}try{let o=await je(e.name,{...a,type:e.type});return {success:!0,message:`Installed ${e.name}@${o.version}`}}catch(o){return Aa.debug(`[${e.name}] Plugin install failed: ${String(o)}`),{success:false,message:o instanceof Error?o.message:String(o)}}},async uninstall(e,a){await Lr(e,a);},getInstallPath(e,a){return ""}};function Rp(e){return {async install(a,o){if(a.origin===ft&&!a.installCommand&&!Gt(a.name))return xp(a,o);if(!a.installCommand)try{let r=await je(a.name,{...o,type:e});return {success:!0,message:`Installed ${a.name}@${r.version}`}}catch(r){return Aa.debug(`[${a.name}] ${e} install failed: ${String(r)}`),{success:false,message:r instanceof Error?r.message:String(r)}}Aa.debug(`[${a.name}] Executing install command: ${a.installCommand}`);let t=await Nr(a.installCommand,o.scope);return t.exitCode===0?{success:true}:{success:false,message:t.stderr||`Install failed with exit code ${t.exitCode}`}},async uninstall(a,o){let t=Ae(),r=`${a}@${pe}`;if(t.plugins[r]){await Lr(a,o);return}throw new Error(`${e.toUpperCase()} uninstall via claude CLI not supported \u2014 use: claude ${e} remove ${a}`)},getInstallPath(a,o){return ""}}}function Ik(e){for(let a of [join(e,".claude","agents"),join(e,"agents")]){if(!se__default.existsSync(a))continue;let o=se__default.readdirSync(a).filter(t=>t.endsWith(".md")&&se__default.lstatSync(join(a,t)).isFile());if(o.length>0)return o.map(t=>join(a,t))}return []}function Tk(e){for(let a of [join(e,".claude","rules"),join(e,"rules")]){if(!se__default.existsSync(a))continue;let o=se__default.readdirSync(a).filter(t=>t.endsWith(".md")&&se__default.lstatSync(join(a,t)).isFile());if(o.length>0)return o.map(t=>join(a,t))}return []}async function Jd(e,a,o,t){let r=await Md(),i=`${e}@claude-code`,s={scope:a,installPath:o,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:t},n=r.plugins[i]??[];r.plugins[i]=[...n.filter(d=>d.scope!==a),s],na(r);}var Mk={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=lt(e,t?.source);if(!r)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let i=null;try{ia(e.name),i=await Ca(r.cloneUrl,r.ref);let s=r.subPath==="."?i:join(i,r.subPath),n=Ik(s);if(n.length===0)return {success:!1,message:`No agent files found in "${e.name}"`};let d=mi(o);se__default.mkdirSync(d,{recursive:!0});let l=da(e.name);if(n.length===1)se__default.copyFileSync(n[0],join(d,`${l}.md`));else for(let u of n){let p=da(basename(u,".md"));se__default.copyFileSync(u,join(d,`${l}--${p}.md`));}let c=n.length===1?join(d,`${l}.md`):d;return await Jd(e.name,o,c,"agent"),{success:!0,message:`Installed agent(s) from ${e.name}`}}catch(s){return Aa.debug(`[${e.name}] Agent install failed: ${String(s)}`),{success:false,message:s instanceof Error?s.message:String(s)}}finally{i&&await Ra(i).catch(()=>{});}},async uninstall(e,a){let o=mi(a),t=da(e);if(se__default.existsSync(o))for(let n of se__default.readdirSync(o).filter(d=>d===`${t}.md`||d.startsWith(`${t}--`)&&d.endsWith(".md")))se__default.rmSync(join(o,n),{force:true});let r=`${e}@claude-code`,i=Ae(),s=(i.plugins[r]??[]).filter(n=>n.scope!==a);if(s.length===0){let{[r]:n,...d}=i.plugins;na({...i,plugins:d});}else na({...i,plugins:{...i.plugins,[r]:s}});},getInstallPath(e,a){return join(mi(a),`${da(e)}.md`)}},qk={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=lt(e,t?.source);if(!r)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let i=null;try{ia(e.name),i=await Ca(r.cloneUrl,r.ref);let s=r.subPath==="."?i:join(i,r.subPath),n=Tk(s);if(n.length===0)return {success:!1,message:`No rule files found in "${e.name}"`};let d=Pt(o);se__default.mkdirSync(d,{recursive:!0});for(let l of n)se__default.copyFileSync(l,join(d,basename(l)));return await Jd(e.name,o,d,"rule"),{success:!0,message:`Installed rule(s) from ${e.name}`}}catch(s){return Aa.debug(`[${e.name}] Rule install failed: ${String(s)}`),{success:false,message:s instanceof Error?s.message:String(s)}}finally{i&&await Ra(i).catch(()=>{});}},async uninstall(e,a){throw new Error("Rule uninstall not supported \u2014 remove files manually from .claude/rules/")},getInstallPath(e,a){return Pt(a)}},Lk={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=lt(e,t?.source);if(!r)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let i=null;try{ia(e.name),i=await Ca(r.cloneUrl,r.ref);let s=r.subPath==="."?i:join(i,r.subPath),n=join(s,"settings.json");if(!se__default.existsSync(n))return {success:!1,message:`No settings.json found in "${e.name}"`};let d;try{d=JSON.parse(se__default.readFileSync(n,"utf-8"));}catch{return {success:!1,message:`settings.json in "${e.name}" contains invalid JSON`}}let l=d.hooks;if(!l||typeof l!="object"||Array.isArray(l))return {success:!1,message:`No hooks found in "${e.name}" settings.json`};let c=Dr();if(c.status==="malformed")return {success:!1,message:"settings.json at destination contains invalid JSON \u2014 refusing to overwrite"};let u=c.status==="ok"?c.settings:{},p=u.hooks!==null&&typeof u.hooks=="object"&&!Array.isArray(u.hooks)?u.hooks:{},m=Or(p,l);return Fi({...u,hooks:m}),await Jd(e.name,o,"hooks","hook"),{success:!0,message:`Installed hooks from ${e.name}`}}catch(s){return Aa.debug(`[${e.name}] Hook install failed: ${String(s)}`),{success:false,message:s instanceof Error?s.message:String(s)}}finally{i&&await Ra(i).catch(()=>{});}},async uninstall(e,a){throw new Error("Hook uninstall not supported \u2014 remove entries manually from settings.json")},getInstallPath(e,a){return ""}},gs=class{id="claude-code";name="Claude Code";async isAvailable(){return ct("claude",["--version"])}getSupportedScopes(){return ["user","project","local"]}installers={bundle:Ek,skill:Rp("skill"),mcp:Rp("mcp"),agent:Mk,hook:Lk,rule:qk}};function fs(e,a){return {async install(o,t){if(!o.installCommand)return {success:false,message:"No install command provided"};let[r,...i]=o.installCommand.split(/\s+/).filter(Boolean);if(!r||!e.has(r))return {success:false,message:`Disallowed command: "${r??""}"`};let s=await execa(r,i,{reject:false});return s.exitCode===0?{success:true}:{success:false,message:s.stderr||`Install failed with exit code ${s.exitCode}`}},async uninstall(o,t){throw new Error(`MCP uninstall not supported \u2014 ${a.replace("<name>",o)}`)},getInstallPath(o,t){return ""}}}var Ok=new Set(["gh"]),Nk=fs(Ok,"use: gh copilot mcp remove <name>"),hs=class{id="copilot";name="GitHub Copilot";async isAvailable(){return await ct("gh",["--version"])?ct("gh",["copilot","--version"]):false}getSupportedScopes(){return ["user"]}installers={mcp:Nk}};Oe();var Gk=new Set(["opencode"]),Bk=fs(Gk,"use: opencode config remove mcp <name>");function jk(e){return [`// Auto-generated by Flow CLI for OpenCode compatibility \u2014 plugin: ${e}`,"import { readFileSync, readdirSync, existsSync } from 'node:fs';","import { join, dirname } from 'node:path';","import { fileURLToPath } from 'node:url';","",`const CONTENT_DIR = join(dirname(fileURLToPath(import.meta.url)), '${e}-content');`,"","function loadContent() {"," for (const dir of ['skills', '.']) {"," const d = join(CONTENT_DIR, dir);"," if (!existsSync(d)) continue;"," const files = readdirSync(d)"," .filter(f => f.endsWith('.md') && f !== 'README.md' && f !== 'LICENSE.md')"," .sort();"," if (files.length) return files.map(f => readFileSync(join(d, f), 'utf-8')).join('\\n\\n---\\n\\n');"," }"," return '';","}","","export const Plugin = async () => ({ getBootstrapContent: () => loadContent() });"].join(`
117
- `)}function Ep(){return {async install(e,a){try{ia(e.name);}catch{return {success:false,message:"Invalid plugin name."}}let o=e.catalogId?ge.getAdapter(e.catalogId):void 0,t=lt(e,o?.source);if(!t)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let r=null;try{r=await Ca(t.cloneUrl,t.ref);let i=t.subPath==="."?r:join(r,t.subPath),s=pi(a.scope??"user"),n=join(i,".opencode","plugins");if(se__default.existsSync(n)){let d=se__default.readdirSync(n).filter(l=>l.endsWith(".js")||l.endsWith(".mjs"));if(d.length===0)return {success:!1,message:"No JS plugin file found in .opencode/plugins/"};se__default.mkdirSync(s,{recursive:!0}),se__default.copyFileSync(join(n,d[0]),join(s,`${e.name}.js`));}else {let d=join(s,`${e.name}-content`);se__default.existsSync(d)&&se__default.rmSync(d,{recursive:!0,force:!0}),se__default.mkdirSync(d,{recursive:!0}),se__default.cpSync(i,d,{recursive:!0}),se__default.mkdirSync(s,{recursive:!0}),se__default.writeFileSync(join(s,`${e.name}.js`),jk(e.name),"utf-8");}return {success:!0,message:`Installed ${e.name} for OpenCode`}}catch(i){return {success:false,message:i instanceof Error?i.message:String(i)}}finally{r&&await Ra(r).catch(()=>{});}},async uninstall(e,a){ia(e);let o=pi(a),t=join(o,`${e}.js`),r=join(o,`${e}-content`);se__default.existsSync(t)&&se__default.rmSync(t,{force:true}),se__default.existsSync(r)&&se__default.rmSync(r,{recursive:true,force:true});},getInstallPath(e,a){return join(pi(a),`${e}.js`)}}}var bs=class{id="opencode";name="OpenCode";async isAvailable(){return ct("opencode",["--version"])}getSupportedScopes(){return ["user","project"]}installers={mcp:Bk,skill:Ep(),bundle:Ep()}};var Wa=new os;Wa.register(new gs);Co()&&(Wa.register(new hs),Wa.register(new bs));function Ip({itemName:e,itemType:a,onInstall:o,onClose:t}){let[r,i]=useState(false),[s,n]=useState(false),[d,l]=useState([]),[c,u]=useState(void 0);useEffect(()=>{Wa.getAvailableProviders(a??"bundle").then(l).catch(()=>{});},[a]);let p=useCallback(h=>{h==="Install"?d.length>1?n(true):i(true):t();},[t,d.length]),m=useCallback(h=>{if(h==="Cancel"){n(false);return}let v=d.find(k=>k.name===h);v?(u(v.id),n(false),i(true)):n(false);},[d]),g=useCallback(h=>{let v=Uu(h);v?o(v,c):i(false);},[o,c]),f=useCallback(()=>{i(false);},[]);if(s){let h=[...d.map(v=>v.name),"Cancel"];return jsx(ra,{itemName:`${e} \u2014 Choose provider`,actions:h,onAction:m,onClose:()=>n(false)},"provider")}return r?jsx(ra,{itemName:`${e} \u2014 Choose scope`,actions:Bu,descriptions:ju,onAction:g,onClose:f},"scope"):jsx(ra,{itemName:e,actions:["Install","Cancel"],onAction:p,onClose:t},"main")}j();function Mp({itemName:e,bundle:a,onInstall:o,onConfirm:t,onClose:r}){let i=y(g=>g.focus),[s,n]=useState(0),l=(a?.artifact.artifacts??[]).filter(g=>g.available),c=a!==void 0&&l.length===0,u=useMemo(()=>c?["Cancel"]:["Confirm Install","Cancel"],[c]);useEffect(()=>{n(0);},[a]);let p=useCallback((g,f)=>{f.upArrow?n(h=>Math.max(0,h-1)):f.downArrow?n(h=>Math.min(u.length-1,h+1)):f.return?u[s]==="Confirm Install"?t():r():f.escape&&r();},[u,s,t,r]);useInput(p,{isActive:i==="actionMenu"&&a!==void 0});let m=useCallback(g=>{g==="Install Bundle"?o():r();},[o,r]);return a?jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:a.title}),jsx(Box,{marginTop:1,children:jsxs(Text,{children:[l.length," artifact",l.length!==1?"s":""," available"]})}),jsx(Box,{flexDirection:"column",marginTop:1,marginBottom:1,children:l.map(g=>{let f=b(g.name??g.flowId),h=g.type??"unknown";return jsxs(Box,{gap:1,children:[jsx(Text,{color:"green",children:"\u2713"}),jsx(Text,{children:f}),jsxs(Text,{dimColor:true,children:["(",h,")"]})]},g.flowId)})}),jsx(Box,{flexDirection:"column",children:u.map((g,f)=>jsx(Box,{children:jsxs(Text,{bold:f===s,color:f===s?"cyan":void 0,children:[f===s?"\u203A ":" ",g]})},g))})]}):jsx(ra,{itemName:e,actions:["Install Bundle","Cancel"],onAction:m,onClose:r})}function ks({activeFocus:e,onConfirm:a}){let[o,t]=useState("idle"),r=y(i=>i.focus);return useInput((i,s)=>{s.escape||i==="n"?t("idle"):i==="y"&&a();},{isActive:o==="confirming"&&r===e}),{isConfirming:o==="confirming",requestConfirm:()=>t("confirming"),cancelConfirm:()=>t("idle")}}j();function Fp({itemName:e,itemScope:a,itemStatus:o,updateAvailable:t,catalogVersion:r,onUninstall:i,onToggleStatus:s,onUpdate:n,onClose:d}){let{isConfirming:l,requestConfirm:c}=ks({activeFocus:"actionMenu",onConfirm:()=>i(a)});if(l)return jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:e}),jsxs(Box,{marginTop:1,children:[jsx(Text,{children:"Uninstall "}),jsx(Text,{bold:true,color:"red",children:e}),jsx(Text,{children:"? (y/N)"})]})]});let u=o==="enabled"?"Disable":"Enable",p=r&&b(r),m=p?`Update to v${p}`:"Update";return jsx(ra,{itemName:e,actions:t?["Uninstall",u,m,"Cancel"]:["Uninstall",u,"Cancel"],onAction:h=>{h==="Uninstall"?c():h===u?s(a):h.startsWith("Update")?n?.():d();},onClose:d})}function Gp({itemName:e,itemScope:a,onUninstall:o,onClose:t}){let{isConfirming:r,requestConfirm:i}=ks({activeFocus:"actionMenu",onConfirm:()=>o(a)});return r?jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:e}),jsxs(Box,{marginTop:1,children:[jsx(Text,{children:"Remove MCP "}),jsx(Text,{bold:true,color:"red",children:e}),jsx(Text,{children:"? (y/N)"})]})]}):jsx(ra,{itemName:e,actions:["Uninstall","Cancel"],onAction:d=>{d==="Uninstall"?i():t();},onClose:t})}I();var _t=P("bundle:installer"),Bp=/already exists/i;async function _k(e){if(!e.installCommand)throw new Error("Missing install command");let a=e.installCommand;if(vp(a)){let o=await yp(a);if(o.exitCode!==0){let t=o.stderr?.trim()||o.stdout?.trim()||`exit code ${o.exitCode}`;if(Bp.test(t))return;throw new Error(t)}}else {let o=await Nr(a);if(o.exitCode!==0){let t=o.stderr?.trim()||o.stdout?.trim()||`exit code ${o.exitCode}`;if(Bp.test(t))return;throw new Error(t)}}}async function Xk(e,a){try{await C(w.CLI_BUNDLE_INSTALL_STARTED,{bundle_slug:e,artifact_count:a});}catch(o){_t.warn(`Failed to emit bundle install started event: ${String(o)}`);}}async function Kk(e,a,o){try{await C(w.CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS,{bundle_slug:e,artifact_name:a,artifact_type:o});}catch(t){_t.warn(`Failed to emit bundle install plugin success event: ${String(t)}`);}}async function jp(e,a,o,t){try{await C(w.CLI_BUNDLE_INSTALL_PLUGIN_FAILED,{bundle_slug:e,artifact_name:a,artifact_type:o,error_message:t});}catch(r){_t.warn(`Failed to emit bundle install plugin failed event: ${String(r)}`);}}async function $k(e,a,o,t,r){try{await C(w.CLI_BUNDLE_INSTALL_COMPLETED,{bundle_slug:e,installed_count:a,failed_count:o,unavailable_count:t,duration_ms:r});}catch(i){_t.warn(`Failed to emit bundle install completed event: ${String(i)}`);}}async function ws(e,a={}){let{onProgress:o}=a,t=e.artifact.artifacts,r=t.filter(m=>m.available),i=t.length-r.length,s=e.artifact.name,n=Date.now();await Xk(s,r.length);let d=[],l=0,c=r.length;for(let[m,g]of r.entries()){let f=g.name??g.flowId,h=g.type??"unknown";if(!g.type){_t.warn(`Artifact "${f}" has no type \u2014 treated as failed`),d.push({name:f,type:h,reason:"unknown artifact type"}),await jp(s,f,h,"unknown artifact type"),o?.({index:m+1,total:c,artifact:g,success:false,error:"unknown artifact type"});continue}try{await _k(g),l++,await Kk(s,f,h),o?.({index:m+1,total:c,artifact:g,success:!0});}catch(v){let k=v instanceof Error?v.message:String(v);_t.error(`Failed to install artifact "${f}": ${k}`),d.push({name:f,type:h,reason:k}),await jp(s,f,h,k),o?.({index:m+1,total:c,artifact:g,success:false,error:k});}}let u=Date.now()-n,p=d.length;return await $k(s,l,p,i,u),{bundleTitle:e.title,total:t.length,installed:l,skipped:i,failed:p,failures:d}}j();function Jp({bundle:e,onComplete:a}){let[o,t]=useState(null),[r,i]=useState(null),s=useRef(false);return useEffect(()=>{s.current||(s.current=true,ws(e,{onProgress:t}).then(i).catch(n=>{let d=n instanceof Error?n.message:"Installation failed",l=e.artifact.artifacts,c=l.filter(u=>u.available);i({bundleTitle:e.title,total:l.length,installed:0,skipped:l.length-c.length,failed:c.length,failures:c.map(u=>({name:u.name??u.flowId,type:u.type??"unknown",reason:d}))});}));},[e]),useEffect(()=>{r&&a(r);},[r,a]),jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsx(Box,{paddingBottom:1,children:jsxs(Text,{bold:true,children:["Installing ",e.title,"..."]})}),o&&jsxs(Box,{gap:1,children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:["[",o.index,"/",o.total,"] Installing"," ",b(o.artifact.name??o.artifact.flowId)," (",o.artifact.type??"unknown",")"]})]}),!o&&jsxs(Box,{gap:1,children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsx(Text,{color:"cyan",children:"Preparing..."})]})]})}var ye=create(e=>({installedItems:[],setInstalledItems:a=>e({installedItems:a}),loadFromDisk:()=>e({installedItems:le()})}));j();function Hp({entries:e,selectedIndex:a,focusPanel:o}){let t=o==="list",r=a===0&&t;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{marginBottom:1,children:[jsx(Text,{color:"cyan",bold:true,children:r?"\u203A ":" "}),jsx(Text,{color:"cyan",bold:r,dimColor:!t,children:"+ Add Marketplace"})]}),e.map((i,s)=>{let n=s+1,d=a===n&&t,l=i.stored?.autoUpdate!==false;return jsxs(Box,{flexDirection:"column",marginBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:d?"\u203A ":" "}),jsx(Text,{bold:d,dimColor:!t,children:i.adapter.name}),l&&i.stored&&jsx(Text,{color:"yellow",children:" \u2605"})]}),i.stored?.lastUpdated&&jsx(Box,{marginLeft:2,children:jsxs(Text,{dimColor:true,children:["Updated ",qa(i.stored.lastUpdated)]})})]},i.adapter.id)})]})}j();function Qp({entry:e,detailData:a,installedCount:o,focusPanel:t,actionIndex:r,onBrowse:i,onUpdate:s,onToggleAutoUpdate:n,onRemove:d}){let{adapter:l,stored:c}=e,u=l.removable!==false,p=c?.autoUpdate!==false,m=t==="detail",g=[{label:`Browse plugins${a&&!a.loading?` (${a.items.length})`:""}`,handler:i},{label:"Update marketplace",handler:s},...u?[{label:"Toggle auto-update",handler:n},{label:"Remove marketplace",handler:d,danger:true}]:[]];return m?jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:l.name}),jsx(Text,{dimColor:true,children:l.source}),jsx(Box,{marginTop:1,children:a?.loading?jsx(Text,{dimColor:true,children:"Loading..."}):a?.error?jsx(Text,{color:"red",children:a.error}):jsxs(Text,{dimColor:true,children:[a?`${a.items.length} available`:"\u2014 available",o>0?` \xB7 ${o} installed`:"",c?.lastUpdated?` \xB7 Updated ${qa(c.lastUpdated)}`:""]})}),c&&jsxs(Box,{marginTop:1,children:[jsx(Text,{dimColor:true,children:"Auto-update: "}),p?jsx(Text,{color:"green",children:"enabled \u2605"}):jsx(Text,{dimColor:true,children:"disabled"})]}),jsx(Box,{flexDirection:"column",marginTop:1,children:g.map((f,h)=>{let v=h===r;return jsxs(Box,{children:[jsx(Text,{color:v?"cyan":void 0,children:v?"\u203A ":" "}),jsx(Text,{bold:v,color:f.danger?"yellow":void 0,dimColor:!v,children:f.label})]},f.label)})})]}):jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:l.name}),jsx(Text,{dimColor:true,children:l.source}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter or Tab to see details"})})]})}function Vp(e){return e.adapter.removable!==false?4:2}U();j();function _p({item:e,adapterName:a,isInstalled:o,onBack:t,onInstall:r,onUninstall:i}){let s=[...o&&i?[{label:"Uninstall",handler:()=>i(e),danger:true}]:!o&&r?[{label:"Install",handler:()=>r(e)}]:[],{label:"Back",handler:t}],[n,d]=useState(0);return useInput((l,c)=>{if(c.escape){t();return}if(c.upArrow){d(u=>Math.max(0,u-1));return}if(c.downArrow){d(u=>Math.min(s.length-1,u+1));return}c.return&&s[n].handler();}),jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsxs(Text,{dimColor:true,children:["Marketplaces \u203A ",a," \u203A Browse plugins \u203A ",b(e.name)]}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{bold:true,children:b(e.name)}),e.type&&jsxs(Text,{dimColor:true,children:[" [",b(e.type),"]"]}),e.origin&&jsxs(Text,{dimColor:true,children:[" [",b(e.origin),"]"]})]}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2500".repeat(50)})}),e.description?jsx(Box,{marginTop:1,children:jsx(Text,{children:b(e.description)})}):null,(e.author?.name||e.version||e.category)&&jsxs(Box,{flexDirection:"column",marginTop:1,children:[e.author?.name&&jsxs(Text,{dimColor:true,children:["Author ",b(e.author.name)]}),e.version&&jsxs(Text,{dimColor:true,children:["Version ",b(e.version)]}),e.category&&jsxs(Text,{dimColor:true,children:["Category ",b(e.category)]})]})]}),jsx(Box,{flexDirection:"column",marginTop:1,children:s.map((l,c)=>jsxs(Box,{children:[jsx(Text,{color:c===n?"cyan":void 0,children:c===n?"\u203A ":" "}),jsx(Text,{bold:c===n,color:l.danger?"yellow":void 0,dimColor:c!==n,children:l.label})]},l.label))}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: confirm \xB7 Esc: back"})})]})}function Kp({item:e,isSelected:a,isInstalled:o}){return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:a?"\u203A ":" "}),jsx(Text,{color:o?"green":void 0,bold:a,children:e.name}),o&&jsx(Text,{color:"green",children:" \u2713"})]}),e.description?jsx(Box,{paddingLeft:4,children:jsx(Text,{dimColor:true,wrap:"truncate",children:e.description})}):null]})}function $p({entry:e,items:a,installedKeys:o,onBack:t}){let r=e.adapter.id??"default",i=a.filter(A=>o.has(`${A.name}@${r}`)),s=a.filter(A=>!o.has(`${A.name}@${r}`)),n=[...i,...s],[d,l]=useState(0),[c,u]=useState(null);if(useInput((A,M)=>{if(M.escape){t();return}if(M.return){u(n[d]??null);return}if(M.upArrow){l(F=>Math.max(0,F-1));return}M.downArrow&&l(F=>Math.min(n.length-1,F+1));},{isActive:c===null}),c!==null)return jsx(_p,{item:c,adapterName:e.adapter.name,isInstalled:o.has(`${c.name}@${r}`),onBack:()=>u(null)});if(a.length===0)return jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsxs(Text,{dimColor:true,children:["Marketplaces \u203A ",e.adapter.name," \u203A Browse plugins"]}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Empty catalog"})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Esc: back"})})]});let p=Math.max(0,d-Math.floor(ea/2)),m=Math.min(n.length,p+ea);m===n.length&&(p=Math.max(0,m-ea));let g=n.slice(p,m),f=p,h=n.length-m,v=i.length>0&&p<i.length,k=m>i.length,T=g.filter(A=>o.has(`${A.name}@${r}`)),L=g.filter(A=>!o.has(`${A.name}@${r}`));return jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsxs(Text,{dimColor:true,children:["Marketplaces \u203A ",e.adapter.name," \u203A Browse plugins"]}),jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:f>0?`\u2191 ${f} more above`:" "})}),v&&jsxs(Box,{flexDirection:"column",children:[jsxs(Text,{dimColor:true,children:["\u2500\u2500 Installed (",i.length,") \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]}),T.map(A=>jsx(Kp,{item:A,isSelected:n.indexOf(A)===d,isInstalled:true},A.name))]}),k&&jsxs(Box,{flexDirection:"column",marginTop:v?1:0,children:[jsxs(Text,{dimColor:true,children:["\u2500\u2500 Available (",s.length,") \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]}),L.map(A=>jsx(Kp,{item:A,isSelected:n.indexOf(A)===d,isInstalled:false},A.name))]}),jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:h>0?`\u2193 ${h} more below`:" "})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: details \xB7 Esc: back"})})]})}Dd();var rP=/^https?:\/\/.+/;function iP(e){return e!==null&&typeof e=="object"&&"response"in e&&e.response?.status===404}function sP(e){return e instanceof Error&&e.code==="GITHUB_AUTH_REQUIRED"}function am(e){let a=y(h=>h.showNotification),o=y(h=>h.incrementCatalogVersion),[t,r]=useState("idle"),[i,s]=useState(""),[n,d]=useState(""),[l,c]=useState(null),u=useRef(""),p=useRef("");useEffect(()=>{u.current=i;},[i]),useEffect(()=>{p.current=n;},[n]);let m=useCallback(()=>{u.current="",p.current="",s(""),d(""),c(null),r("add-name");},[]),g=useCallback(()=>{r("idle");},[]),f=useCallback(async()=>{let h=p.current,v=u.current;if(!rP.test(h)){c("URL must start with http:// or https://");return}c(null),r("adding");let k=randomUUID(),T=new zt(k,v,h);try{await T.fetchItems(),await ao.add({id:k,name:v,source:h}),ge.register(new zt(k,v,h)),o(),e(),a(`Catalog "${v}" added`,"success"),s(""),d(""),u.current="",p.current="",r("idle");}catch(L){let A=iP(L)?"No marketplace.json found in this repository (checked main and master branches). Ensure the repo has a marketplace.json at its root.":sP(L)?L.message:L instanceof Error?`Could not reach catalog URL: ${L.message}`:"Failed to validate catalog URL";a(A,"error"),r("add-url");}},[e,a,o]);return useInput((h,v)=>{if(v.escape){r("idle");return}if(v.return){u.current.trim().length>0&&r("add-url");return}if(v.backspace||v.delete){u.current=u.current.slice(0,-1),s(u.current);return}h&&!v.ctrl&&!v.meta&&(u.current=u.current+h,s(u.current));},{isActive:t==="add-name"}),useInput((h,v)=>{if(v.escape){r("add-name");return}if(v.return){f();return}if(v.backspace||v.delete){p.current=p.current.slice(0,-1),d(p.current),c(null);return}h&&!v.ctrl&&!v.meta&&(p.current=p.current+h,d(p.current),c(null));},{isActive:t==="add-url"}),{phase:t,inputName:i,inputUrl:n,urlError:l,setInputName:s,setInputUrl:d,startAdd:m,cancelAdd:g}}function om(e){let a=y(r=>r.showNotification),o=y(r=>r.incrementCatalogVersion);return {handleRemove:useCallback(async r=>{try{await ao.remove(r),ge.unregister(r),o(),e(),a("Catalog removed","success");}catch(i){a(i instanceof Error?i.message:"Failed to remove catalog","error");}},[e,a,o])}}function rm(){let e=y(E=>E.focus),a=y(E=>E.setFocus),o=y(E=>E.showNotification),t=ye(E=>E.installedItems),[r,i]=useState(()=>ge.listAdapters().map(E=>({adapter:E,stored:null}))),[s,n]=useState(0),[d,l]=useState("list"),[c,u]=useState(0),[p,m]=useState(null),[g,f]=useState("main"),h=useRef(r);useEffect(()=>{h.current=r;},[r]),useEffect(()=>{g==="browse"&&!r[s-1]&&f("main");},[g,r,s]);let v=useCallback(()=>{(async()=>{let E=ge.listAdapters(),B=await ao.read(),Q=new Map(B.map(Fe=>[Fe.id,Fe]));i(E.map(Fe=>({adapter:Fe,stored:Q.get(Fe.id)??null})));})();},[]);useEffect(()=>{a("marketplaces"),v();},[a,v]),useEffect(()=>{if(s===0){m(null);return}let E=h.current[s-1];if(!E)return;let B=false;return m({items:[],loading:true,error:null}),E.adapter.fetchItems().then(Q=>{B||m({items:Q,loading:false,error:null});}).catch(Q=>{B||m({items:[],loading:false,error:Q instanceof Error?Q.message:"Failed to load catalog"});}),()=>{B=true;}},[s]);let k=am(v),T=useCallback(()=>{v(),n(0),l("list"),m(null),f("main");},[v]),{handleRemove:L}=om(T),A=useCallback(async E=>{f("removing"),await L(E);},[L]),M=useCallback(async E=>{try{let B=await E.adapter.fetchItems();if(m({items:B,loading:!1,error:null}),E.stored){let Q=new Date().toISOString();await ao.updateField(E.stored.id,{lastUpdated:Q}),v();}o("Marketplace updated","success");}catch(B){o(B instanceof Error?B.message:"Update failed","error");}},[v,o]),F=useCallback(async E=>{if(!E.stored)return;let B=E.stored.autoUpdate!==false;await ao.updateField(E.stored.id,{autoUpdate:!B}),v();},[v]),O=useCallback(()=>f("browse"),[]),oe=useCallback(E=>{let B=r[s-1];if(!B)return;let Q=B.adapter.removable!==false;[O,()=>{M(B);},...Q?[()=>{F(B);},()=>{A(B.adapter.id);}]:[]][E]?.();},[r,s,O,M,F,A]),x=useCallback(()=>f("main"),[]),J=useCallback(()=>{let E=r[s-1];E&&M(E);},[r,s,M]),ae=useCallback(()=>{let E=r[s-1];E&&F(E);},[r,s,F]),z=useCallback(()=>{let E=r[s-1];E&&A(E.adapter.id);},[r,s,A]);if(useInput((E,B)=>{if(B.upArrow){n(Q=>Math.max(0,Q-1));return}if(B.downArrow){n(Q=>Math.min(r.length,Q+1));return}(B.return||B.tab)&&(s===0?k.startAdd():(l("detail"),u(0)));},{isActive:g==="main"&&k.phase==="idle"&&d==="list"&&e==="marketplaces"}),useInput((E,B)=>{if(B.escape||B.tab){l("list");return}if(B.upArrow){u(Q=>Math.max(0,Q-1));return}if(B.downArrow){let Q=r[s-1],Fe=Q?Vp(Q)-1:0;u(si=>Math.min(si+1,Fe));return}B.return&&oe(c);},{isActive:g==="main"&&k.phase==="idle"&&d==="detail"&&e==="marketplaces"}),k.phase==="add-name")return jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsx(Text,{bold:true,children:"Add Catalog \u2014 Step 1/2"}),jsxs(Box,{marginTop:1,children:[jsx(Text,{children:"Name: "}),jsx(Text,{color:"cyan",children:k.inputName}),jsx(Text,{color:"gray",children:"\u2588"})]}),k.inputName.trim().length===0&&jsx(Text,{dimColor:true,children:"Enter a display name for this catalog"}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter: next | Esc: cancel"})})]});if(k.phase==="add-url")return jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsx(Text,{bold:true,children:"Add Catalog \u2014 Step 2/2"}),jsxs(Box,{marginTop:1,children:[jsx(Text,{dimColor:true,children:"Name: "}),jsx(Text,{children:k.inputName})]}),jsxs(Box,{children:[jsx(Text,{children:"URL: "}),jsx(Text,{color:"cyan",children:k.inputUrl}),jsx(Text,{color:"gray",children:"\u2588"})]}),k.urlError&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"red",children:k.urlError})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter: confirm | Esc: back | Must start with http:// or https://"})})]});if(k.phase==="adding")return jsx(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:jsx(Text,{children:"Validating catalog URL..."})});if(g==="removing")return jsx(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:jsx(Text,{children:"Removing catalog..."})});if(g==="browse"){let E=r[s-1];if(!E)return jsx(Box,{});let B=E.adapter.id??"default",Q=new Set(t.filter(Fe=>Fe.marketplace===E.adapter.name).map(Fe=>`${Fe.name}@${B}`));return jsx($p,{entry:E,items:p?.items??[],installedKeys:Q,onBack:x})}if(r.length===0)return jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsx(Box,{paddingX:1,marginBottom:1,children:jsx(Text,{bold:true,children:"Marketplaces"})}),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:"No catalogs registered"})}),jsx(Box,{marginTop:1,paddingX:1,children:jsx(Text,{dimColor:true,children:"Enter or Tab: add marketplace \xB7 \u2190\u2192: switch tab"})})]});let W=r[s-1]??null,_=W?t.filter(E=>E.marketplace===W.adapter.name).length:0;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Box,{flexDirection:"column",width:30,marginRight:1,children:jsx(Hp,{entries:r,selectedIndex:s,focusPanel:d})}),jsx(Box,{flexDirection:"column",flexGrow:1,children:d==="detail"&&W?jsx(Qp,{entry:W,detailData:p,installedCount:_,focusPanel:d,actionIndex:c,onBrowse:O,onUpdate:J,onToggleAutoUpdate:ae,onRemove:z}):jsx(Box,{paddingLeft:1,children:jsx(Text,{dimColor:true,children:W?"Enter or Tab to see details":"\u2191\u2193 to navigate, Enter or Tab to see details"})})})]}),jsx(Box,{marginTop:1,paddingX:1,children:d==="list"?jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter / Tab: see details \xB7 \u2190\u2192: switch tab"}):jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate actions \xB7 Enter: execute \xB7 Esc / Tab: back to list"})})]})}function im(e,a,o,t){if(a.upArrow)return o.selectedIndex===0?[{type:"setSelectedIndex",index:-1},{type:"setFocus",focus:"search"}]:[{type:"setSelectedIndex",index:o.selectedIndex-1}];if(a.downArrow&&o.selectedIndex<t-1)return [{type:"setSelectedIndex",index:o.selectedIndex+1}];if(a.leftArrow){let r=ie.findIndex(s=>s.id===o.activeTab),i=ie[(r-1+ie.length)%ie.length];return [{type:"setTab",tab:i.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:i.focus}]}if(a.rightArrow){let r=ie.findIndex(s=>s.id===o.activeTab),i=ie[(r+1)%ie.length];return [{type:"setTab",tab:i.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:i.focus}]}if(a.tab){let r=ie.findIndex(s=>s.id===o.activeTab),i=ie[(r+1)%ie.length];return [{type:"setTab",tab:i.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:i.focus}]}return a.return?[{type:"setActionMenuOpen",open:true},{type:"setFocus",focus:"actionMenu"}]:e==="/"?[{type:"setFocus",focus:"search"}]:e==="1"?[{type:"selectAllTypes"}]:e==="2"?[{type:"toggleTypeFilter",catalogType:"skill"}]:e==="3"?[{type:"toggleTypeFilter",catalogType:"mcp"}]:e==="4"?[{type:"toggleTypeFilter",catalogType:"bundle"}]:e==="5"?[{type:"selectAllOrigins"}]:e==="6"?[{type:"toggleOriginFilter",origin:"internal"}]:e==="7"?[{type:"toggleOriginFilter",origin:"external"}]:e==="8"?[{type:"toggleTypeFilter",catalogType:"agent"}]:e==="9"?[{type:"toggleTypeFilter",catalogType:"hook"}]:e==="0"?[{type:"toggleTypeFilter",catalogType:"plugin"}]:e==="a"&&o.activeTab==="updates"?[]:e&&e!==" "&&!a.ctrl&&!a.meta&&!a.escape?[{type:"setSelectedIndex",index:-1},{type:"setFocus",focus:"search"},{type:"searchAppend",char:e}]:[]}function sm(e,a){return a.escape?[{type:"setActionMenuOpen",open:false},{type:"setFocus",focus:"list"}]:[]}function nm(e,a,o){return a.escape?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:"reset"}:a.downArrow?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:null}:a.leftArrow?{actions:[],queryUpdate:{cursorMove:-1}}:a.rightArrow?{actions:[],queryUpdate:{cursorMove:1}}:a.return?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:null}:a.backspace?o.length===0?{actions:[{type:"setFocus",focus:"list"},{type:"setSelectedIndex",index:0}],queryUpdate:null}:{actions:[],queryUpdate:{backspace:true}}:e&&!a.ctrl&&!a.meta?{actions:[],queryUpdate:{append:e}}:{actions:[],queryUpdate:null}}var uP=new Set(ie.filter(e=>e.focus!=="list").map(e=>e.focus));function Vr(e){let{setActiveTab:a,setFocus:o,setSelectedIndex:t,setActionMenuOpen:r}=y.getState();for(let i of e)if(i.type==="setTab")a(i.tab);else if(i.type==="setFocus")o(i.focus);else if(i.type==="setSelectedIndex")t(i.index);else if(i.type==="setActionMenuOpen")r(i.open);else if(i.type==="searchAppend"){let{setQuery:s,query:n,setCursorPosition:d,cursorPosition:l}=_e.getState();s(n.slice(0,l)+i.char+n.slice(l)),d(l+i.char.length);}else i.type==="toggleTypeFilter"?y.getState().toggleTypeFilter(i.catalogType):i.type==="selectAllTypes"?y.getState().selectAllTypes():i.type==="toggleOriginFilter"?y.getState().toggleOriginFilter(i.origin):i.type==="selectAllOrigins"&&y.getState().selectAllOrigins();}function dm({listLength:e}){let a=y(f=>f.focus),o=y(f=>f.selectedIndex),t=y(f=>f.actionMenuOpen),r=y(f=>f.setFocus),i=y(f=>f.setActionMenuOpen),s=_e(f=>f.query),n=_e(f=>f.setQuery),d=_e(f=>f.resetQuery),l=useRef(e);useEffect(()=>{l.current=e;},[e]),useEffect(()=>{if(a==="search"){let{query:f,setCursorPosition:h}=_e.getState();h(f.length);}},[a]);let[c,u]=useState("");useEffect(()=>{let f=setTimeout(()=>u(s),300);return ()=>clearTimeout(f)},[s]),useInput((f,h)=>{let{activeTab:v,selectedIndex:k,actionMenuOpen:T}=y.getState();Vr(sd(f,h,{activeTab:v}));},{isActive:a==="tabs"}),useInput((f,h)=>{if(!h.leftArrow&&!h.rightArrow)return;let{activeTab:v,selectedIndex:k,actionMenuOpen:T}=y.getState();Vr(sd("",h,{activeTab:v}));},{isActive:uP.has(a)}),useInput((f,h)=>{let{activeTab:v,selectedIndex:k,actionMenuOpen:T}=y.getState();Vr(im(f,h,{activeTab:v,selectedIndex:k},l.current));},{isActive:a==="list"}),useInput((f,h)=>{Vr(sm(f,h));},{isActive:a==="actionMenu"}),useInput((f,h)=>{let v=nm(f,h,_e.getState().query),k=v.queryUpdate;if(Vr(v.actions),k==="reset")d(),u("");else if(k!==null){let{query:T,cursorPosition:L,setCursorPosition:A}=_e.getState();if("backspace"in k)L>0&&(n(T.slice(0,L-1)+T.slice(L)),A(L-1));else if("append"in k)n(T.slice(0,L)+k.append+T.slice(L)),A(L+k.append.length);else if("cursorMove"in k){let M=L+k.cursorMove;M>=0&&M<=T.length&&A(M);}}},{isActive:a==="search"});let p=useCallback(()=>{i(false),r("list");},[i,r]),m=useCallback(f=>{let{setSelectedIndex:h,selectedIndex:v}=y.getState();f===0?h(0):v>=f&&h(f-1);},[]),g=useCallback(f=>{if(!c)return l.current=f.length,f;let h=c.toLowerCase(),v=f.filter(k=>k.name.toLowerCase().includes(h)||k.description?.toLowerCase().includes(h));return l.current=v.length,v},[c]);return {actionMenuOpen:t,closeMenu:p,selectedIndex:o,clampIndex:m,filteredItems:g}}function lm(){let e=y(n=>n.notification),a=y(n=>n.showNotification),o=y(n=>n.clearNotification),t=oa(n=>n.justAuthenticated),r=oa(n=>n.credentials),i=oa(n=>n.setJustAuthenticated);return useEffect(()=>{t&&r&&(a(`Authenticated. Tenant: ${r.tenant}`,"success"),i(false));},[t,r]),useEffect(()=>{if(!e)return;let n=setTimeout(o,3e3);return ()=>clearTimeout(n)},[e]),{notify:(n,d)=>{a(n,d);}}}function ze(e,a,o=false){return o?true:!Xd.valid(e)||!Xd.valid(a)?false:Xd.gt(a,e)}U();I();var io=P("updater");async function pP(e,a,o,t,r,i){try{await C(w.CLI_TOOL_UPDATED,{tool_id:e,tool_type:i,source:r,from_version:a,to_version:o,duration_ms:t,interface:Z().interfaceType});}catch(s){io.warn(`Failed to send update metrics: ${String(s)}`);}}function mP(e){let a=Ae(),o=`${e}@${pe}`,t=a.plugins[o];return !t||t.length===0?null:{pluginKey:o,entry:t[0]}}async function As(e,a={}){let o=Date.now(),t=null;try{io.debug(`[${e}] Acquiring lock...`),t=await Mo();let r=mP(e);if(!r)throw io.error(`[${e}] Plugin is not installed`),new Error(`Plugin "${e}" is not installed`);let{entry:i}=r,s=i.version,n=i.installPath;io.debug(`[${e}] Fetching manifest...`);let l=(await Wt(e,a.source)).version;if(!s||!ze(s,l,a.force))throw io.debug(`[${e}] Already up to date (v${s??"n/a"})`),new Io(e,s??"unknown");io.info(`[${e}] Updating v${s} \u2192 v${l}...`),await t(),t=null;try{let c=await je(e,{force:!0,skipMetrics:!0,source:a.source}),u=Date.now()-o;return await pP(c.name,s,c.version,u,i.origin??"internal",i.type??"skill"),io.debug(`[${e}] Updated successfully in ${u}ms`),{name:c.name,previousVersion:s,newVersion:c.version,path:c.path,duration_ms:u}}catch(c){io.warn(`[${e}] Install failed, rolling back to v${s}...`),t=await Mo();let u=Ae(),p=`${e}@${pe}`;throw u.plugins[p]&&(u.plugins[p][0].version=s,u.plugins[p][0].installPath=n,na(u),io.info(`[${e}] Rollback completed, restored to v${s}`)),c}}finally{t&&await t();}}To();I();var xs=P("dispatcher");async function gP(e,a,o,t,r){let i=Bt(e);return xs.debug(`[${e}] Install failed (exit code), attempting marketplace add`),r?.onError?.(o),t?r?.onStatus?.(`Adding marketplace for ${i}...`):r?.onPause?.(),await ms(e,t,()=>{}),r?.onResume?.(`Retrying install for ${i}...`),xs.debug(`[${e}] Retrying install after marketplace add`),qe(a)}async function um(e,a,o,t){let r=jt(e,t),i=Bt(e);o?.onStatus?.(`Installing ${i}...`),xs.debug(`[${e}] Attempting install: ${r}`);let s=await qe(r);if(s.exitCode===0)return s;xs.debug(`[${e}] Install failed (exit ${s.exitCode}), attempting marketplace add`);let n=s.stderr||`Install failed with exit code ${s.exitCode}`;return gP(e,r,n,a,o)}async function pm(e,a,o){let t=e.type??"bundle",r=await Wa.getAvailableProviders(t),i=r[0];if(!i)throw new Error(`No available provider for artifact type "${t}"`);let s=i.installers[t];if(!s)throw new Error(`Provider "${i.id}" does not support type "${t}"`);let n=a??{},d=n;return s.install(e,d)}function mm(){let e=ye(s=>s.installedItems),a=ye(s=>s.loadFromDisk),o=useCallback(async(s,n)=>{let d=await pm(s,n);if(!d.success)throw new Error(d.message||"Installation failed");a();},[a]),t=useCallback(async(s,n)=>{let d=le().find(m=>m.name===s),l=d?.providerId??"claude-code",c=Wa.getAdapter(l);if(!c)throw new Error(`Provider "${l}" not found`);let u=d?.type??"bundle",p=c.installers[u];if(!p)throw new Error(`Provider "${l}" does not support type "${u}"`);await p.uninstall(s,n??"user"),a();},[a]),r=useCallback(async(s,n)=>{let l=e.find(c=>c.name===s)?.status==="enabled"?"disabled":"enabled";await Fr(s,l,n),a();},[e,a]),i=useCallback(async s=>{await As(s),a();},[a]);return {install:o,uninstall:t,toggle:r,update:i}}j();I();var Is=P("mcp");function _r(e,a){e.silent?Ne({status:"error",mcp:a.name,...a.exitCode!==void 0&&{exitCode:a.exitCode},message:a.message}):S(`Failed to ${a.action} MCP "${a.name}": ${a.message}`);}function fm(e,a){e.silent?ve({status:"success",mcp:a.name,command:a.command,duration_ms:a.durationMs}):(K(`MCP "${a.name}" ${a.actionPastTense} successfully`),e.verbose&&a.stdout&&D(a.stdout));}function fP(e,a,o,t){let r=["claude","mcp","add","--transport",o,e];return a.length>0&&r.push(...a),t&&r.push("--scope",t),r.join(" ")}function Kd(e,a){if(e.startsWith("-"))throw new Error(`Invalid MCP server name: "${e}". Names must not start with '-'.`);let o=["claude","mcp","remove",e];return a&&o.push("--scope",a),o.join(" ")}async function hm(e,a,o){if(!await he())return 1;if(a.length===0){let i=o.transport==="http"?"a URL":"a command";return _r(o,{name:e,action:"add",message:`${o.transport} transport requires ${i}`}),1}Is.debug(`[${e}] Starting MCP add with args: ${a.join(" ")}`);let t=fP(e,a,o.transport,o.scope);if(!o.force){let i=b(e),s=b(t);if(!await ee(`Install external MCP "${i}"?
114
+ `),o(a[r].value);return}if(i===Zy){r=(r-1+a.length)%a.length,n(),i="";return}if(i===ek){r=(r+1)%a.length,n(),i="";return}i.startsWith("\x1B")&&i.length<3||(i="");};function n(){process.stdout.write(`\x1B[${a.length-1}A`);for(let c=0;c<a.length;c++)process.stdout.write(`\r\x1B[2K${fp(a[c],c===r)}`),c<a.length-1&&process.stdout.write(`
115
+ `);}function d(){process.stdin.setRawMode(false),process.stdin.removeListener("data",s),process.removeListener("uncaughtException",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",l),process.removeListener("SIGTERM",l);}function l(){try{process.stdin.setRawMode(!1);}catch{}process.exit(1);}process.on("uncaughtException",l),process.on("unhandledRejection",l),process.on("SIGINT",l),process.on("SIGTERM",l),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",s);})}To();var Ht=k("claudeProxy"),Nd="claude ",hp="flow ",Ld=class extends Error{constructor(a){super(`Invalid install command: "${a}". Command must start with "claude " for security.`),this.name="InvalidInstallCommandError";}},Jt=class extends Error{constructor(a){super(`Disallowed subcommand: "${a}". Only "plugin install", "plugin marketplace add", "mcp add", and "mcp remove" are permitted.`),this.name="DisallowedSubcommandError";}},ok=/^plugins?\s+(install|i)\s+|^plugins?\s+marketplace\s+add\s+|^mcp\s+(add|remove)\s+/,tk=/^--(scope|transport|env|header|timeout|prefix-args|timeout-ms|local|global|user)$/,rk={"--scope":/^(local|user|global|project)$/,"--transport":/^(sse|stdio|http)$/,"--env":/^[A-Za-z_][A-Za-z0-9_]*=/,"--header":/^[A-Za-z0-9][A-Za-z0-9-]*:/,"--timeout":/^\d{1,10}$/,"--timeout-ms":/^\d{1,10}$/,"--prefix-args":/^[\x20-\x7e]{1,500}$/},ik=/^npm\s+(i|install)\s+-g\s+@ciandt-flow\/cli$/,sk=/^(flow|claude)\s+auth\s+login(\s|$)/,bp=/^flow\s+plugins?\s+(install|i)\s+([^@\s]+)$/;function vp(e){return bp.test(e.trim())}function nk(e){return bp.exec(e.trim())?.[2]??""}async function yp(e){let a=nk(e);hd(a);let o=Date.now();Ht.debug(`[${a}] Executing: flow plugin install ${a}`);try{let t=await execa("flow",["plugin","install",a],{reject:!1});return {name:a,command:`flow plugin install ${a}`,exitCode:t.exitCode??1,stdout:t.stdout,stderr:t.stderr,duration_ms:Date.now()-o}}catch(t){throw Gd(t)?new Fd:t}}function dk(e){kp(e);let a=e.slice(Nd.length);if(!ok.test(a))throw new Jt(e)}var ps=class extends Error{constructor(){super('Claude Code CLI not found. Ensure "claude" is installed and available on your PATH.'),this.name="ClaudeCliNotFoundError";}},Fd=class extends Error{constructor(){super('Flow CLI not found. Ensure "flow" is installed and available on your PATH.'),this.name="FlowCliNotFoundError";}};function kp(e){if(!e||!/^claude /.test(e))throw new Ld(e)}function ck(e){for(let a=0;a<e.length;a++){let o=e[a];if(o==="--")return;if(!o.startsWith("-"))continue;if(!tk.test(o))throw new Jt(`Unexpected flag: ${o}`);let t=rk[o];if(t!==void 0){let r=e[a+1];if(r===void 0||r.startsWith("-"))throw new Jt(`Flag ${o} requires a value`);if(!t.test(r))throw new Jt(`Unsafe value for flag ${o}`);a++;}}}async function qe(e){kp(e);let a=e.slice(Nd.length).split(/\s+/).filter(Boolean);ck(a);let o=lk(a);Ht.debug(`[${o}] Executing proxy command: claude ${a.join(" ")}`);let t=Date.now();try{let r=await execa("claude",a,{reject:!1}),i=Date.now()-t;return Ht.debug(`[${o}] Proxy command finished with exit code ${r.exitCode} in ${i}ms`),{name:o,command:e,exitCode:r.exitCode??1,stdout:r.stdout,stderr:r.stderr,duration_ms:i}}catch(r){throw Gd(r)?new ps:r}}function lk(e){return e.length>=3?e[2]:e.join(" ")}function Gd(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}function uk(e){return e.startsWith(hp)?Nd+e.slice(hp.length):e}function pk(e){return ik.test(e)||sk.test(e)}function mk(e){let a=0;for(;a<e.length&&pk(e[a]);)a++;return e.slice(a)}var gk=/^claude\s+(?:plugins?\s+(?:install|i)\s+|mcp\s+(?:add|remove)\s+)/;function fk(e,a){return !a||e.includes("--scope")||!gk.test(e)?e:`${e} --scope ${a}`}async function Nr(e,a){let o=e.split("&&").map(s=>s.trim()).filter(Boolean),r=mk(o).map(s=>uk(s)).map(s=>fk(s,a));if(r.length===0)throw new Error("Empty install command");for(let s of r)dk(s);Ht.debug(`[installCommand] Executing ${r.length} command(s)`);let i=await qe(r[0]);if(i.exitCode!==0)return i;for(let s=1;s<r.length;s++)if(i=await qe(r[s]),i.exitCode!==0)return i;return i}async function ms(e,a,o){let t=Bt(e),r=a?.trim();if(!r&&(r=(await Fo(`Plugin "${t}" could not be installed.
116
+ If a marketplace is needed, enter the source (owner/repo or URL), or press Enter to skip: `))?.trim(),!r))throw new Error("No marketplace source provided. Cannot retry install.");r=ss(r),o?.(),Ht.debug(`[${t}] Adding marketplace via: claude plugin marketplace add ${r}`);try{let i=await execa("claude",["plugin","marketplace","add",r],{reject:!1});if(i.exitCode!==0)throw new Error(`Failed to add marketplace: ${i.stderr||"unknown error"}`);Ht.debug(`[${t}] Marketplace added successfully`);}catch(i){throw Gd(i)?new ps:i}}To();U();Oe();I();var kk=6e4,Oo=class extends Error{url;isTimeout;isAuthError;constructor(a,o,t=false,r=false){super(a),this.name="GitCloneError",this.url=o,this.isTimeout=t,this.isAuthError=r;}};async function Sa(e,a){let o=await mkdtemp(join(tmpdir(),"flow-skills-")),t=simpleGit({timeout:{block:kk}}).env("GIT_TERMINAL_PROMPT","0").env("GIT_LFS_SKIP_SMUDGE","1"),r=a?["--depth","1","--branch",a]:["--depth","1"];try{return await t.clone(e,o,r),o}catch(i){await rm$1(o,{recursive:true,force:true}).catch(()=>{});let s=i instanceof Error?i.message:String(i),n=s.includes("block timeout")||s.includes("timed out"),d=s.includes("Authentication failed")||s.includes("could not read Username")||s.includes("Permission denied")||s.includes("Repository not found");throw n?new Oo("Clone timed out after 60s. Check your SSH keys or credentials.",e,true,false):d?new Oo(`Authentication failed for ${e}. Ensure you have access and credentials are configured.`,e,false,true):new Oo(`Failed to clone ${e}: ${s}`,e,false,false)}}async function Ca(e){let a=normalize(resolve(e)),o=normalize(resolve(tmpdir()));if(!a.startsWith(o+sep))throw new Error("Attempted to clean up directory outside of temp directory");await rm$1(e,{recursive:true,force:true});}async function ct(e,a=["--version"]){try{return (await execa(e,a,{reject:!1})).exitCode===0}catch(o){if(o instanceof Error&&"code"in o&&o.code==="ENOENT")return false;throw o}}function Dk(e){return typeof e=="object"&&e!==null&&e.source==="git-subdir"}function wk(e){return typeof e=="object"&&e!==null&&e.source==="url"}function Sk(e){return typeof e=="object"&&e!==null&&e.source==="github"}function lt(e,a){let o=e.source;if(Dk(o)){let t=o.path?o.path.replace(/^\.\//,""):".",r=o.ref&&!/^[0-9a-f]{40}$/i.test(o.ref)?o.ref:void 0;return {cloneUrl:o.url,subPath:t||".",ref:r}}if(wk(o))return {cloneUrl:o.url,subPath:"."};if(Sk(o))return {cloneUrl:`https://github.com/${o.repo}`,subPath:"."};if(typeof o=="string"){if(o.startsWith("https://")||o.startsWith("git@"))return {cloneUrl:o,subPath:"."};if((o.startsWith("./")||o===".")&&a){let t=o==="."?".":o.replace(/^\.\//,"")||".";return {cloneUrl:a,subPath:t}}}return null}function da(e){return e.toLowerCase().replace(/[^a-z0-9._]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").substring(0,255)||"unnamed"}var Ra=k("claude-code.adapter");function Rk(e,a){let o=e??"external";if(!a)return o;let t=a.match(/github\.com\/([^/]+\/[^/]+?)(?:\.git)?(?:[/?#]|$)/);if(!t)return o;let r=t[1],i=Jo();if(!ie__default.existsSync(i))return o;try{let s=JSON.parse(ie__default.readFileSync(i,"utf-8"));for(let[n,d]of Object.entries(s))if(d.source?.repo===r)return n}catch{}return o}async function xp(e,a){let o=e.catalogId?me.getAdapter(e.catalogId):void 0,t=lt(e,o?.source);if(!t)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let r=e.type==="bundle"||e.type==null,i=Rk(e.catalogId,o?.source),s=a.scope??"user",n;r?n=yn(i,e.name,"external"):n=join(Ho(s==="user"?"global":"project"),e.name);let d=null;try{ia(e.name),d=await Sa(t.cloneUrl,t.ref);let l=t.subPath==="."?d:join(d,t.subPath);if(ie__default.existsSync(n)&&ie__default.rmSync(n,{recursive:!0,force:!0}),ie__default.mkdirSync(dirname(n),{recursive:!0}),ie__default.cpSync(l,n,{recursive:!0}),r){let c=`${e.name}@${i}`,u=await xd(),m={scope:s,installPath:n,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:e.type},p=u.plugins[c]??[];u.plugins[c]=[...p.filter(g=>g.scope!==s),m],na(u),qr(c,!0,s);}return {success:!0,message:`Installed ${e.name} from ${t.cloneUrl}`}}catch(l){return Ra.debug(`[${e.name}] External catalog install failed: ${String(l)}`),{success:false,message:l instanceof Error?l.message:String(l)}}finally{d&&await Ca(d).catch(()=>{});}}async function Bd(e,a,o,t){try{await C(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:o,source:"external",scope:ts(t),version:"unknown",duration_ms:a,interface:Z().interfaceType});}catch(r){Ra.warn(`Failed to send external install metrics: ${String(r)}`);}}async function Cp(e,a,o){try{await C(w.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:o,source:"external",error_code:a instanceof Error?a.name:"UNKNOWN",error_message:(a instanceof Error?a.message:String(a)).slice(0,500),interface:Z().interfaceType});}catch(t){Ra.warn(`Failed to send external install-failed metrics: ${String(t)}`);}}var Ak={async install(e,a){if(e.origin===ft&&!e.installCommand&&!Gt(e.name))return xp(e,a);if(e.origin===ft&&e.installCommand){let o=e.type??"skill",t=await Nr(e.installCommand,a.scope);return t.exitCode===0?(await Bd(e.name,t.duration_ms,o,a.scope),{success:true,message:`Installed ${e.name}`}):(await Cp(e.name,new Error(t.stderr||"Install failed"),o),{success:false,message:t.stderr||`Install failed with exit code ${t.exitCode}`})}if(Gt(e.name)){let o=e.type??"skill",t=jt(e.name,a.scope);Ra.debug(`[${e.name}] Attempting install: ${t}`);let r=await qe(t);if(r.exitCode===0)return await Bd(e.name,r.duration_ms,o,a.scope),{success:true};Ra.debug(`[${e.name}] First attempt failed, adding marketplace`),await ms(e.name,a.marketplaceSource,()=>{});let i=await qe(t);return i.exitCode===0?(await Bd(e.name,i.duration_ms,o,a.scope),{success:true}):(await Cp(e.name,new Error(i.stderr||"Install failed"),o),{success:false,message:i.stderr||`Install failed with exit code ${i.exitCode}`})}try{let o=await je(e.name,{...a,type:e.type});return {success:!0,message:`Installed ${e.name}@${o.version}`}}catch(o){return Ra.debug(`[${e.name}] Plugin install failed: ${String(o)}`),{success:false,message:o instanceof Error?o.message:String(o)}}},async uninstall(e,a){await Lr(e,a);},getInstallPath(e,a){return ""}};function Rp(e){return {async install(a,o){if(a.origin===ft&&!a.installCommand&&!Gt(a.name))return xp(a,o);if(!a.installCommand)try{let r=await je(a.name,{...o,type:e});return {success:!0,message:`Installed ${a.name}@${r.version}`}}catch(r){return Ra.debug(`[${a.name}] ${e} install failed: ${String(r)}`),{success:false,message:r instanceof Error?r.message:String(r)}}Ra.debug(`[${a.name}] Executing install command: ${a.installCommand}`);let t=await Nr(a.installCommand,o.scope);return t.exitCode===0?{success:true}:{success:false,message:t.stderr||`Install failed with exit code ${t.exitCode}`}},async uninstall(a,o){let t=Ae(),r=`${a}@${ue}`;if(t.plugins[r]){await Lr(a,o);return}throw new Error(`${e.toUpperCase()} uninstall via claude CLI not supported \u2014 use: claude ${e} remove ${a}`)},getInstallPath(a,o){return ""}}}function xk(e){for(let a of [join(e,".claude","agents"),join(e,"agents")]){if(!ie__default.existsSync(a))continue;let o=ie__default.readdirSync(a).filter(t=>t.endsWith(".md")&&ie__default.lstatSync(join(a,t)).isFile());if(o.length>0)return o.map(t=>join(a,t))}return []}function Ek(e){for(let a of [join(e,".claude","rules"),join(e,"rules")]){if(!ie__default.existsSync(a))continue;let o=ie__default.readdirSync(a).filter(t=>t.endsWith(".md")&&ie__default.lstatSync(join(a,t)).isFile());if(o.length>0)return o.map(t=>join(a,t))}return []}async function jd(e,a,o,t){let r=await xd(),i=`${e}@claude-code`,s={scope:a,installPath:o,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:t},n=r.plugins[i]??[];r.plugins[i]=[...n.filter(d=>d.scope!==a),s],na(r);}var Ik={async install(e,a){let o=a.scope??"user",t=e.catalogId?me.getAdapter(e.catalogId):void 0,r=lt(e,t?.source);if(!r)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let i=null;try{ia(e.name),i=await Sa(r.cloneUrl,r.ref);let s=r.subPath==="."?i:join(i,r.subPath),n=xk(s);if(n.length===0)return {success:!1,message:`No agent files found in "${e.name}"`};let d=mi(o);ie__default.mkdirSync(d,{recursive:!0});let l=da(e.name);if(n.length===1)ie__default.copyFileSync(n[0],join(d,`${l}.md`));else for(let u of n){let m=da(basename(u,".md"));ie__default.copyFileSync(u,join(d,`${l}--${m}.md`));}let c=n.length===1?join(d,`${l}.md`):d;return await jd(e.name,o,c,"agent"),{success:!0,message:`Installed agent(s) from ${e.name}`}}catch(s){return Ra.debug(`[${e.name}] Agent install failed: ${String(s)}`),{success:false,message:s instanceof Error?s.message:String(s)}}finally{i&&await Ca(i).catch(()=>{});}},async uninstall(e,a){let o=mi(a),t=da(e);if(ie__default.existsSync(o))for(let n of ie__default.readdirSync(o).filter(d=>d===`${t}.md`||d.startsWith(`${t}--`)&&d.endsWith(".md")))ie__default.rmSync(join(o,n),{force:true});let r=`${e}@claude-code`,i=Ae(),s=(i.plugins[r]??[]).filter(n=>n.scope!==a);if(s.length===0){let{[r]:n,...d}=i.plugins;na({...i,plugins:d});}else na({...i,plugins:{...i.plugins,[r]:s}});},getInstallPath(e,a){return join(mi(a),`${da(e)}.md`)}},Tk={async install(e,a){let o=a.scope??"user",t=e.catalogId?me.getAdapter(e.catalogId):void 0,r=lt(e,t?.source);if(!r)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let i=null;try{ia(e.name),i=await Sa(r.cloneUrl,r.ref);let s=r.subPath==="."?i:join(i,r.subPath),n=Ek(s);if(n.length===0)return {success:!1,message:`No rule files found in "${e.name}"`};let d=Pt(o);ie__default.mkdirSync(d,{recursive:!0});for(let l of n)ie__default.copyFileSync(l,join(d,basename(l)));return await jd(e.name,o,d,"rule"),{success:!0,message:`Installed rule(s) from ${e.name}`}}catch(s){return Ra.debug(`[${e.name}] Rule install failed: ${String(s)}`),{success:false,message:s instanceof Error?s.message:String(s)}}finally{i&&await Ca(i).catch(()=>{});}},async uninstall(e,a){throw new Error("Rule uninstall not supported \u2014 remove files manually from .claude/rules/")},getInstallPath(e,a){return Pt(a)}},Mk={async install(e,a){let o=a.scope??"user",t=e.catalogId?me.getAdapter(e.catalogId):void 0,r=lt(e,t?.source);if(!r)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let i=null;try{ia(e.name),i=await Sa(r.cloneUrl,r.ref);let s=r.subPath==="."?i:join(i,r.subPath),n=join(s,"settings.json");if(!ie__default.existsSync(n))return {success:!1,message:`No settings.json found in "${e.name}"`};let d;try{d=JSON.parse(ie__default.readFileSync(n,"utf-8"));}catch{return {success:!1,message:`settings.json in "${e.name}" contains invalid JSON`}}let l=d.hooks;if(!l||typeof l!="object"||Array.isArray(l))return {success:!1,message:`No hooks found in "${e.name}" settings.json`};let c=Dr();if(c.status==="malformed")return {success:!1,message:"settings.json at destination contains invalid JSON \u2014 refusing to overwrite"};let u=c.status==="ok"?c.settings:{},m=u.hooks!==null&&typeof u.hooks=="object"&&!Array.isArray(u.hooks)?u.hooks:{},p=Or(m,l);return Fi({...u,hooks:p}),await jd(e.name,o,"hooks","hook"),{success:!0,message:`Installed hooks from ${e.name}`}}catch(s){return Ra.debug(`[${e.name}] Hook install failed: ${String(s)}`),{success:false,message:s instanceof Error?s.message:String(s)}}finally{i&&await Ca(i).catch(()=>{});}},async uninstall(e,a){throw new Error("Hook uninstall not supported \u2014 remove entries manually from settings.json")},getInstallPath(e,a){return ""}},gs=class{id="claude-code";name="Claude Code";async isAvailable(){return ct("claude",["--version"])}getSupportedScopes(){return ["user","project","local"]}installers={bundle:Ak,skill:Rp("skill"),mcp:Rp("mcp"),agent:Ik,hook:Mk,rule:Tk}};function fs(e,a){return {async install(o,t){if(!o.installCommand)return {success:false,message:"No install command provided"};let[r,...i]=o.installCommand.split(/\s+/).filter(Boolean);if(!r||!e.has(r))return {success:false,message:`Disallowed command: "${r??""}"`};let s=await execa(r,i,{reject:false});return s.exitCode===0?{success:true}:{success:false,message:s.stderr||`Install failed with exit code ${s.exitCode}`}},async uninstall(o,t){throw new Error(`MCP uninstall not supported \u2014 ${a.replace("<name>",o)}`)},getInstallPath(o,t){return ""}}}var Lk=new Set(["gh"]),Fk=fs(Lk,"use: gh copilot mcp remove <name>"),hs=class{id="copilot";name="GitHub Copilot";async isAvailable(){return await ct("gh",["--version"])?ct("gh",["copilot","--version"]):false}getSupportedScopes(){return ["user"]}installers={mcp:Fk}};Oe();var Ok=new Set(["opencode"]),Nk=fs(Ok,"use: opencode config remove mcp <name>");function Gk(e){return [`// Auto-generated by Flow CLI for OpenCode compatibility \u2014 plugin: ${e}`,"import { readFileSync, readdirSync, existsSync } from 'node:fs';","import { join, dirname } from 'node:path';","import { fileURLToPath } from 'node:url';","",`const CONTENT_DIR = join(dirname(fileURLToPath(import.meta.url)), '${e}-content');`,"","function loadContent() {"," for (const dir of ['skills', '.']) {"," const d = join(CONTENT_DIR, dir);"," if (!existsSync(d)) continue;"," const files = readdirSync(d)"," .filter(f => f.endsWith('.md') && f !== 'README.md' && f !== 'LICENSE.md')"," .sort();"," if (files.length) return files.map(f => readFileSync(join(d, f), 'utf-8')).join('\\n\\n---\\n\\n');"," }"," return '';","}","","export const Plugin = async () => ({ getBootstrapContent: () => loadContent() });"].join(`
117
+ `)}function Ep(){return {async install(e,a){try{ia(e.name);}catch{return {success:false,message:"Invalid plugin name."}}let o=e.catalogId?me.getAdapter(e.catalogId):void 0,t=lt(e,o?.source);if(!t)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let r=null;try{r=await Sa(t.cloneUrl,t.ref);let i=t.subPath==="."?r:join(r,t.subPath),s=pi(a.scope??"user"),n=join(i,".opencode","plugins");if(ie__default.existsSync(n)){let d=ie__default.readdirSync(n).filter(l=>l.endsWith(".js")||l.endsWith(".mjs"));if(d.length===0)return {success:!1,message:"No JS plugin file found in .opencode/plugins/"};ie__default.mkdirSync(s,{recursive:!0}),ie__default.copyFileSync(join(n,d[0]),join(s,`${e.name}.js`));}else {let d=join(s,`${e.name}-content`);ie__default.existsSync(d)&&ie__default.rmSync(d,{recursive:!0,force:!0}),ie__default.mkdirSync(d,{recursive:!0}),ie__default.cpSync(i,d,{recursive:!0}),ie__default.mkdirSync(s,{recursive:!0}),ie__default.writeFileSync(join(s,`${e.name}.js`),Gk(e.name),"utf-8");}return {success:!0,message:`Installed ${e.name} for OpenCode`}}catch(i){return {success:false,message:i instanceof Error?i.message:String(i)}}finally{r&&await Ca(r).catch(()=>{});}},async uninstall(e,a){ia(e);let o=pi(a),t=join(o,`${e}.js`),r=join(o,`${e}-content`);ie__default.existsSync(t)&&ie__default.rmSync(t,{force:true}),ie__default.existsSync(r)&&ie__default.rmSync(r,{recursive:true,force:true});},getInstallPath(e,a){return join(pi(a),`${e}.js`)}}}var bs=class{id="opencode";name="OpenCode";async isAvailable(){return ct("opencode",["--version"])}getSupportedScopes(){return ["user","project"]}installers={mcp:Nk,skill:Ep(),bundle:Ep()}};var Ja=new os;Ja.register(new gs);Co()&&(Ja.register(new hs),Ja.register(new bs));function Ip({itemName:e,itemType:a,onInstall:o,onClose:t}){let[r,i]=useState(false),[s,n]=useState(false),[d,l]=useState([]),[c,u]=useState(void 0);useEffect(()=>{Ja.getAvailableProviders(a??"bundle").then(l).catch(()=>{});},[a]);let m=useCallback(h=>{h==="Install"?d.length>1?n(true):i(true):t();},[t,d.length]),p=useCallback(h=>{if(h==="Cancel"){n(false);return}let b=d.find(D=>D.name===h);b?(u(b.id),n(false),i(true)):n(false);},[d]),g=useCallback(h=>{let b=Gu(h);b?o(b,c):i(false);},[o,c]),f=useCallback(()=>{i(false);},[]);if(s){let h=[...d.map(b=>b.name),"Cancel"];return jsx(ra,{itemName:`${e} \u2014 Choose provider`,actions:h,onAction:p,onClose:()=>n(false)},"provider")}return r?jsx(ra,{itemName:`${e} \u2014 Choose scope`,actions:Ou,descriptions:Nu,onAction:g,onClose:f},"scope"):jsx(ra,{itemName:e,actions:["Install","Cancel"],onAction:m,onClose:t},"main")}j();function Mp({itemName:e,bundle:a,onInstall:o,onConfirm:t,onClose:r}){let i=y(g=>g.focus),[s,n]=useState(0),l=(a?.artifact.artifacts??[]).filter(g=>g.available),c=a!==void 0&&l.length===0,u=useMemo(()=>c?["Cancel"]:["Confirm Install","Cancel"],[c]);useEffect(()=>{n(0);},[a]);let m=useCallback((g,f)=>{f.upArrow?n(h=>Math.max(0,h-1)):f.downArrow?n(h=>Math.min(u.length-1,h+1)):f.return?u[s]==="Confirm Install"?t():r():f.escape&&r();},[u,s,t,r]);useInput(m,{isActive:i==="actionMenu"&&a!==void 0});let p=useCallback(g=>{g==="Install Bundle"?o():r();},[o,r]);return a?jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:a.title}),jsx(Box,{marginTop:1,children:jsxs(Text,{children:[l.length," artifact",l.length!==1?"s":""," available"]})}),jsx(Box,{flexDirection:"column",marginTop:1,marginBottom:1,children:l.map(g=>{let f=v(g.name??g.flowId),h=g.type??"unknown";return jsxs(Box,{gap:1,children:[jsx(Text,{color:"green",children:"\u2713"}),jsx(Text,{children:f}),jsxs(Text,{dimColor:true,children:["(",h,")"]})]},g.flowId)})}),jsx(Box,{flexDirection:"column",children:u.map((g,f)=>jsx(Box,{children:jsxs(Text,{bold:f===s,color:f===s?"cyan":void 0,children:[f===s?"\u203A ":" ",g]})},g))})]}):jsx(ra,{itemName:e,actions:["Install Bundle","Cancel"],onAction:p,onClose:r})}function ks({activeFocus:e,onConfirm:a}){let[o,t]=useState("idle"),r=y(i=>i.focus);return useInput((i,s)=>{s.escape||i==="n"?t("idle"):i==="y"&&a();},{isActive:o==="confirming"&&r===e}),{isConfirming:o==="confirming",requestConfirm:()=>t("confirming"),cancelConfirm:()=>t("idle")}}j();function Fp({itemName:e,itemScope:a,itemStatus:o,updateAvailable:t,catalogVersion:r,onUninstall:i,onToggleStatus:s,onUpdate:n,onClose:d}){let{isConfirming:l,requestConfirm:c}=ks({activeFocus:"actionMenu",onConfirm:()=>i(a)});if(l)return jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:e}),jsxs(Box,{marginTop:1,children:[jsx(Text,{children:"Uninstall "}),jsx(Text,{bold:true,color:"red",children:e}),jsx(Text,{children:"? (y/N)"})]})]});let u=o==="enabled"?"Disable":"Enable",m=r&&v(r),p=m?`Update to v${m}`:"Update";return jsx(ra,{itemName:e,actions:t?["Uninstall",u,p,"Cancel"]:["Uninstall",u,"Cancel"],onAction:h=>{h==="Uninstall"?c():h===u?s(a):h.startsWith("Update")?n?.():d();},onClose:d})}function Gp({itemName:e,itemScope:a,onUninstall:o,onClose:t}){let{isConfirming:r,requestConfirm:i}=ks({activeFocus:"actionMenu",onConfirm:()=>o(a)});return r?jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:e}),jsxs(Box,{marginTop:1,children:[jsx(Text,{children:"Remove MCP "}),jsx(Text,{bold:true,color:"red",children:e}),jsx(Text,{children:"? (y/N)"})]})]}):jsx(ra,{itemName:e,actions:["Uninstall","Cancel"],onAction:d=>{d==="Uninstall"?i():t();},onClose:t})}I();var _t=k("bundle:installer"),Bp=/already exists/i;async function Vk(e){if(!e.installCommand)throw new Error("Missing install command");let a=e.installCommand;if(vp(a)){let o=await yp(a);if(o.exitCode!==0){let t=o.stderr?.trim()||o.stdout?.trim()||`exit code ${o.exitCode}`;if(Bp.test(t))return;throw new Error(t)}}else {let o=await Nr(a);if(o.exitCode!==0){let t=o.stderr?.trim()||o.stdout?.trim()||`exit code ${o.exitCode}`;if(Bp.test(t))return;throw new Error(t)}}}async function Qk(e,a){try{await C(w.CLI_BUNDLE_INSTALL_STARTED,{bundle_slug:e,artifact_count:a});}catch(o){_t.warn(`Failed to emit bundle install started event: ${String(o)}`);}}async function _k(e,a,o){try{await C(w.CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS,{bundle_slug:e,artifact_name:a,artifact_type:o});}catch(t){_t.warn(`Failed to emit bundle install plugin success event: ${String(t)}`);}}async function jp(e,a,o,t){try{await C(w.CLI_BUNDLE_INSTALL_PLUGIN_FAILED,{bundle_slug:e,artifact_name:a,artifact_type:o,error_message:t});}catch(r){_t.warn(`Failed to emit bundle install plugin failed event: ${String(r)}`);}}async function Xk(e,a,o,t,r){try{await C(w.CLI_BUNDLE_INSTALL_COMPLETED,{bundle_slug:e,installed_count:a,failed_count:o,unavailable_count:t,duration_ms:r});}catch(i){_t.warn(`Failed to emit bundle install completed event: ${String(i)}`);}}async function ws(e,a={}){let{onProgress:o}=a,t=e.artifact.artifacts,r=t.filter(p=>p.available),i=t.length-r.length,s=e.artifact.name,n=Date.now();await Qk(s,r.length);let d=[],l=0,c=r.length;for(let[p,g]of r.entries()){let f=g.name??g.flowId,h=g.type??"unknown";if(!g.type){_t.warn(`Artifact "${f}" has no type \u2014 treated as failed`),d.push({name:f,type:h,reason:"unknown artifact type"}),await jp(s,f,h,"unknown artifact type"),o?.({index:p+1,total:c,artifact:g,success:false,error:"unknown artifact type"});continue}try{await Vk(g),l++,await _k(s,f,h),o?.({index:p+1,total:c,artifact:g,success:!0});}catch(b){let D=b instanceof Error?b.message:String(b);_t.error(`Failed to install artifact "${f}": ${D}`),d.push({name:f,type:h,reason:D}),await jp(s,f,h,D),o?.({index:p+1,total:c,artifact:g,success:false,error:D});}}let u=Date.now()-n,m=d.length;return await Xk(s,l,m,i,u),{bundleTitle:e.title,total:t.length,installed:l,skipped:i,failed:m,failures:d}}j();function Jp({bundle:e,onComplete:a}){let[o,t]=useState(null),[r,i]=useState(null),s=useRef(false);return useEffect(()=>{s.current||(s.current=true,ws(e,{onProgress:t}).then(i).catch(n=>{let d=n instanceof Error?n.message:"Installation failed",l=e.artifact.artifacts,c=l.filter(u=>u.available);i({bundleTitle:e.title,total:l.length,installed:0,skipped:l.length-c.length,failed:c.length,failures:c.map(u=>({name:u.name??u.flowId,type:u.type??"unknown",reason:d}))});}));},[e]),useEffect(()=>{r&&a(r);},[r,a]),jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsx(Box,{paddingBottom:1,children:jsxs(Text,{bold:true,children:["Installing ",e.title,"..."]})}),o&&jsxs(Box,{gap:1,children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:["[",o.index,"/",o.total,"] Installing"," ",v(o.artifact.name??o.artifact.flowId)," (",o.artifact.type??"unknown",")"]})]}),!o&&jsxs(Box,{gap:1,children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsx(Text,{color:"cyan",children:"Preparing..."})]})]})}var ye=create(e=>({installedItems:[],setInstalledItems:a=>e({installedItems:a}),loadFromDisk:()=>e({installedItems:ce()})}));j();function Hp({entries:e,selectedIndex:a,focusPanel:o}){let t=o==="list",r=a===0&&t;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{marginBottom:1,children:[jsx(Text,{color:"cyan",bold:true,children:r?"\u203A ":" "}),jsx(Text,{color:"cyan",bold:r,dimColor:!t,children:"+ Add Marketplace"})]}),e.map((i,s)=>{let n=s+1,d=a===n&&t,l=i.stored?.autoUpdate!==false;return jsxs(Box,{flexDirection:"column",marginBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:d?"\u203A ":" "}),jsx(Text,{bold:d,dimColor:!t,children:i.adapter.name}),l&&i.stored&&jsx(Text,{color:"yellow",children:" \u2605"})]}),i.stored?.lastUpdated&&jsx(Box,{marginLeft:2,children:jsxs(Text,{dimColor:true,children:["Updated ",qa(i.stored.lastUpdated)]})})]},i.adapter.id)})]})}j();function Vp({entry:e,detailData:a,installedCount:o,focusPanel:t,actionIndex:r,onBrowse:i,onUpdate:s,onToggleAutoUpdate:n,onRemove:d}){let{adapter:l,stored:c}=e,u=l.removable!==false,m=c?.autoUpdate!==false,p=t==="detail",g=[{label:`Browse plugins${a&&!a.loading?` (${a.items.length})`:""}`,handler:i},{label:"Update marketplace",handler:s},...u?[{label:"Toggle auto-update",handler:n},{label:"Remove marketplace",handler:d,danger:true}]:[]];return p?jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:l.name}),jsx(Text,{dimColor:true,children:l.source}),jsx(Box,{marginTop:1,children:a?.loading?jsx(Text,{dimColor:true,children:"Loading..."}):a?.error?jsx(Text,{color:"red",children:a.error}):jsxs(Text,{dimColor:true,children:[a?`${a.items.length} available`:"\u2014 available",o>0?` \xB7 ${o} installed`:"",c?.lastUpdated?` \xB7 Updated ${qa(c.lastUpdated)}`:""]})}),c&&jsxs(Box,{marginTop:1,children:[jsx(Text,{dimColor:true,children:"Auto-update: "}),m?jsx(Text,{color:"green",children:"enabled \u2605"}):jsx(Text,{dimColor:true,children:"disabled"})]}),jsx(Box,{flexDirection:"column",marginTop:1,children:g.map((f,h)=>{let b=h===r;return jsxs(Box,{children:[jsx(Text,{color:b?"cyan":void 0,children:b?"\u203A ":" "}),jsx(Text,{bold:b,color:f.danger?"yellow":void 0,dimColor:!b,children:f.label})]},f.label)})})]}):jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:l.name}),jsx(Text,{dimColor:true,children:l.source}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter or Tab to see details"})})]})}function Qp(e){return e.adapter.removable!==false?4:2}U();j();function _p({item:e,adapterName:a,isInstalled:o,onBack:t,onInstall:r,onUninstall:i}){let s=[...o&&i?[{label:"Uninstall",handler:()=>i(e),danger:true}]:!o&&r?[{label:"Install",handler:()=>r(e)}]:[],{label:"Back",handler:t}],[n,d]=useState(0);return useInput((l,c)=>{if(c.escape){t();return}if(c.upArrow){d(u=>Math.max(0,u-1));return}if(c.downArrow){d(u=>Math.min(s.length-1,u+1));return}c.return&&s[n].handler();}),jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsxs(Text,{dimColor:true,children:["Marketplaces \u203A ",a," \u203A Browse plugins \u203A ",v(e.name)]}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{bold:true,children:v(e.name)}),e.type&&jsxs(Text,{dimColor:true,children:[" [",v(e.type),"]"]}),e.origin&&jsxs(Text,{dimColor:true,children:[" [",v(e.origin),"]"]})]}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2500".repeat(50)})}),e.description?jsx(Box,{marginTop:1,children:jsx(Text,{children:v(e.description)})}):null,(e.author?.name||e.version||e.category)&&jsxs(Box,{flexDirection:"column",marginTop:1,children:[e.author?.name&&jsxs(Text,{dimColor:true,children:["Author ",v(e.author.name)]}),e.version&&jsxs(Text,{dimColor:true,children:["Version ",v(e.version)]}),e.category&&jsxs(Text,{dimColor:true,children:["Category ",v(e.category)]})]})]}),jsx(Box,{flexDirection:"column",marginTop:1,children:s.map((l,c)=>jsxs(Box,{children:[jsx(Text,{color:c===n?"cyan":void 0,children:c===n?"\u203A ":" "}),jsx(Text,{bold:c===n,color:l.danger?"yellow":void 0,dimColor:c!==n,children:l.label})]},l.label))}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: confirm \xB7 Esc: back"})})]})}function Kp({item:e,isSelected:a,isInstalled:o}){return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:a?"\u203A ":" "}),jsx(Text,{color:o?"green":void 0,bold:a,children:e.name}),o&&jsx(Text,{color:"green",children:" \u2713"})]}),e.description?jsx(Box,{paddingLeft:4,children:jsx(Text,{dimColor:true,wrap:"truncate",children:e.description})}):null]})}function $p({entry:e,items:a,installedKeys:o,onBack:t}){let r=e.adapter.id??"default",i=a.filter(A=>o.has(`${A.name}@${r}`)),s=a.filter(A=>!o.has(`${A.name}@${r}`)),n=[...i,...s],[d,l]=useState(0),[c,u]=useState(null);if(useInput((A,T)=>{if(T.escape){t();return}if(T.return){u(n[d]??null);return}if(T.upArrow){l(F=>Math.max(0,F-1));return}T.downArrow&&l(F=>Math.min(n.length-1,F+1));},{isActive:c===null}),c!==null)return jsx(_p,{item:c,adapterName:e.adapter.name,isInstalled:o.has(`${c.name}@${r}`),onBack:()=>u(null)});if(a.length===0)return jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsxs(Text,{dimColor:true,children:["Marketplaces \u203A ",e.adapter.name," \u203A Browse plugins"]}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Empty catalog"})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Esc: back"})})]});let m=Math.max(0,d-Math.floor(ea/2)),p=Math.min(n.length,m+ea);p===n.length&&(m=Math.max(0,p-ea));let g=n.slice(m,p),f=m,h=n.length-p,b=i.length>0&&m<i.length,D=p>i.length,q=g.filter(A=>o.has(`${A.name}@${r}`)),L=g.filter(A=>!o.has(`${A.name}@${r}`));return jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsxs(Text,{dimColor:true,children:["Marketplaces \u203A ",e.adapter.name," \u203A Browse plugins"]}),jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:f>0?`\u2191 ${f} more above`:" "})}),b&&jsxs(Box,{flexDirection:"column",children:[jsxs(Text,{dimColor:true,children:["\u2500\u2500 Installed (",i.length,") \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]}),q.map(A=>jsx(Kp,{item:A,isSelected:n.indexOf(A)===d,isInstalled:true},A.name))]}),D&&jsxs(Box,{flexDirection:"column",marginTop:b?1:0,children:[jsxs(Text,{dimColor:true,children:["\u2500\u2500 Available (",s.length,") \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]}),L.map(A=>jsx(Kp,{item:A,isSelected:n.indexOf(A)===d,isInstalled:false},A.name))]}),jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:h>0?`\u2193 ${h} more below`:" "})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: details \xB7 Esc: back"})})]})}vd();var oP=/^https?:\/\/.+/;function tP(e){return e!==null&&typeof e=="object"&&"response"in e&&e.response?.status===404}function rP(e){return e instanceof Error&&e.code==="GITHUB_AUTH_REQUIRED"}function am(e){let a=y(h=>h.showNotification),o=y(h=>h.incrementCatalogVersion),[t,r]=useState("idle"),[i,s]=useState(""),[n,d]=useState(""),[l,c]=useState(null),u=useRef(""),m=useRef("");useEffect(()=>{u.current=i;},[i]),useEffect(()=>{m.current=n;},[n]);let p=useCallback(()=>{u.current="",m.current="",s(""),d(""),c(null),r("add-name");},[]),g=useCallback(()=>{r("idle");},[]),f=useCallback(async()=>{let h=m.current,b=u.current;if(!oP.test(h)){c("URL must start with http:// or https://");return}c(null),r("adding");let D=randomUUID(),q=new zt(D,b,h);try{await q.fetchItems(),await ao.add({id:D,name:b,source:h}),me.register(new zt(D,b,h)),o(),e(),a(`Catalog "${b}" added`,"success"),s(""),d(""),u.current="",m.current="",r("idle");}catch(L){let A=tP(L)?"No marketplace.json found in this repository (checked main and master branches). Ensure the repo has a marketplace.json at its root.":rP(L)?L.message:L instanceof Error?`Could not reach catalog URL: ${L.message}`:"Failed to validate catalog URL";a(A,"error"),r("add-url");}},[e,a,o]);return useInput((h,b)=>{if(b.escape){r("idle");return}if(b.return){u.current.trim().length>0&&r("add-url");return}if(b.backspace||b.delete){u.current=u.current.slice(0,-1),s(u.current);return}h&&!b.ctrl&&!b.meta&&(u.current=u.current+h,s(u.current));},{isActive:t==="add-name"}),useInput((h,b)=>{if(b.escape){r("add-name");return}if(b.return){f();return}if(b.backspace||b.delete){m.current=m.current.slice(0,-1),d(m.current),c(null);return}h&&!b.ctrl&&!b.meta&&(m.current=m.current+h,d(m.current),c(null));},{isActive:t==="add-url"}),{phase:t,inputName:i,inputUrl:n,urlError:l,setInputName:s,setInputUrl:d,startAdd:p,cancelAdd:g}}function om(e){let a=y(r=>r.showNotification),o=y(r=>r.incrementCatalogVersion);return {handleRemove:useCallback(async r=>{try{await ao.remove(r),me.unregister(r),o(),e(),a("Catalog removed","success");}catch(i){a(i instanceof Error?i.message:"Failed to remove catalog","error");}},[e,a,o])}}function rm(){let e=y(E=>E.focus),a=y(E=>E.setFocus),o=y(E=>E.showNotification),t=ye(E=>E.installedItems),[r,i]=useState(()=>me.listAdapters().map(E=>({adapter:E,stored:null}))),[s,n]=useState(0),[d,l]=useState("list"),[c,u]=useState(0),[m,p]=useState(null),[g,f]=useState("main"),h=useRef(r);useEffect(()=>{h.current=r;},[r]),useEffect(()=>{g==="browse"&&!r[s-1]&&f("main");},[g,r,s]);let b=useCallback(()=>{(async()=>{let E=me.listAdapters(),B=await ao.read(),V=new Map(B.map(Fe=>[Fe.id,Fe]));i(E.map(Fe=>({adapter:Fe,stored:V.get(Fe.id)??null})));})();},[]);useEffect(()=>{a("marketplaces"),b();},[a,b]),useEffect(()=>{if(s===0){p(null);return}let E=h.current[s-1];if(!E)return;let B=false;return p({items:[],loading:true,error:null}),E.adapter.fetchItems().then(V=>{B||p({items:V,loading:false,error:null});}).catch(V=>{B||p({items:[],loading:false,error:V instanceof Error?V.message:"Failed to load catalog"});}),()=>{B=true;}},[s]);let D=am(b),q=useCallback(()=>{b(),n(0),l("list"),p(null),f("main");},[b]),{handleRemove:L}=om(q),A=useCallback(async E=>{f("removing"),await L(E);},[L]),T=useCallback(async E=>{try{let B=await E.adapter.fetchItems();if(p({items:B,loading:!1,error:null}),E.stored){let V=new Date().toISOString();await ao.updateField(E.stored.id,{lastUpdated:V}),b();}o("Marketplace updated","success");}catch(B){o(B instanceof Error?B.message:"Update failed","error");}},[b,o]),F=useCallback(async E=>{if(!E.stored)return;let B=E.stored.autoUpdate!==false;await ao.updateField(E.stored.id,{autoUpdate:!B}),b();},[b]),O=useCallback(()=>f("browse"),[]),oe=useCallback(E=>{let B=r[s-1];if(!B)return;let V=B.adapter.removable!==false;[O,()=>{T(B);},...V?[()=>{F(B);},()=>{A(B.adapter.id);}]:[]][E]?.();},[r,s,O,T,F,A]),x=useCallback(()=>f("main"),[]),J=useCallback(()=>{let E=r[s-1];E&&T(E);},[r,s,T]),ae=useCallback(()=>{let E=r[s-1];E&&F(E);},[r,s,F]),z=useCallback(()=>{let E=r[s-1];E&&A(E.adapter.id);},[r,s,A]);if(useInput((E,B)=>{if(B.upArrow){n(V=>Math.max(0,V-1));return}if(B.downArrow){n(V=>Math.min(r.length,V+1));return}(B.return||B.tab)&&(s===0?D.startAdd():(l("detail"),u(0)));},{isActive:g==="main"&&D.phase==="idle"&&d==="list"&&e==="marketplaces"}),useInput((E,B)=>{if(B.escape||B.tab){l("list");return}if(B.upArrow){u(V=>Math.max(0,V-1));return}if(B.downArrow){let V=r[s-1],Fe=V?Qp(V)-1:0;u(si=>Math.min(si+1,Fe));return}B.return&&oe(c);},{isActive:g==="main"&&D.phase==="idle"&&d==="detail"&&e==="marketplaces"}),D.phase==="add-name")return jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsx(Text,{bold:true,children:"Add Catalog \u2014 Step 1/2"}),jsxs(Box,{marginTop:1,children:[jsx(Text,{children:"Name: "}),jsx(Text,{color:"cyan",children:D.inputName}),jsx(Text,{color:"gray",children:"\u2588"})]}),D.inputName.trim().length===0&&jsx(Text,{dimColor:true,children:"Enter a display name for this catalog"}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter: next | Esc: cancel"})})]});if(D.phase==="add-url")return jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsx(Text,{bold:true,children:"Add Catalog \u2014 Step 2/2"}),jsxs(Box,{marginTop:1,children:[jsx(Text,{dimColor:true,children:"Name: "}),jsx(Text,{children:D.inputName})]}),jsxs(Box,{children:[jsx(Text,{children:"URL: "}),jsx(Text,{color:"cyan",children:D.inputUrl}),jsx(Text,{color:"gray",children:"\u2588"})]}),D.urlError&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"red",children:D.urlError})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter: confirm | Esc: back | Must start with http:// or https://"})})]});if(D.phase==="adding")return jsx(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:jsx(Text,{children:"Validating catalog URL..."})});if(g==="removing")return jsx(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:jsx(Text,{children:"Removing catalog..."})});if(g==="browse"){let E=r[s-1];if(!E)return jsx(Box,{});let B=E.adapter.id??"default",V=new Set(t.filter(Fe=>Fe.marketplace===E.adapter.name).map(Fe=>`${Fe.name}@${B}`));return jsx($p,{entry:E,items:m?.items??[],installedKeys:V,onBack:x})}if(r.length===0)return jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsx(Box,{paddingX:1,marginBottom:1,children:jsx(Text,{bold:true,children:"Marketplaces"})}),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:"No catalogs registered"})}),jsx(Box,{marginTop:1,paddingX:1,children:jsx(Text,{dimColor:true,children:"Enter or Tab: add marketplace \xB7 \u2190\u2192: switch tab"})})]});let W=r[s-1]??null,_=W?t.filter(E=>E.marketplace===W.adapter.name).length:0;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Box,{flexDirection:"column",width:30,marginRight:1,children:jsx(Hp,{entries:r,selectedIndex:s,focusPanel:d})}),jsx(Box,{flexDirection:"column",flexGrow:1,children:d==="detail"&&W?jsx(Vp,{entry:W,detailData:m,installedCount:_,focusPanel:d,actionIndex:c,onBrowse:O,onUpdate:J,onToggleAutoUpdate:ae,onRemove:z}):jsx(Box,{paddingLeft:1,children:jsx(Text,{dimColor:true,children:W?"Enter or Tab to see details":"\u2191\u2193 to navigate, Enter or Tab to see details"})})})]}),jsx(Box,{marginTop:1,paddingX:1,children:d==="list"?jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter / Tab: see details \xB7 \u2190\u2192: switch tab"}):jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate actions \xB7 Enter: execute \xB7 Esc / Tab: back to list"})})]})}function im(e,a,o,t){if(a.upArrow)return o.selectedIndex===0?[{type:"setSelectedIndex",index:-1},{type:"setFocus",focus:"search"}]:[{type:"setSelectedIndex",index:o.selectedIndex-1}];if(a.downArrow&&o.selectedIndex<t-1)return [{type:"setSelectedIndex",index:o.selectedIndex+1}];if(a.leftArrow){let r=re.findIndex(s=>s.id===o.activeTab),i=re[(r-1+re.length)%re.length];return [{type:"setTab",tab:i.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:i.focus}]}if(a.rightArrow){let r=re.findIndex(s=>s.id===o.activeTab),i=re[(r+1)%re.length];return [{type:"setTab",tab:i.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:i.focus}]}if(a.tab){let r=re.findIndex(s=>s.id===o.activeTab),i=re[(r+1)%re.length];return [{type:"setTab",tab:i.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:i.focus}]}return a.return?[{type:"setActionMenuOpen",open:true},{type:"setFocus",focus:"actionMenu"}]:e==="/"?[{type:"setFocus",focus:"search"}]:e==="1"?[{type:"selectAllTypes"}]:e==="2"?[{type:"toggleTypeFilter",catalogType:"skill"}]:e==="3"?[{type:"toggleTypeFilter",catalogType:"mcp"}]:e==="4"?[{type:"toggleTypeFilter",catalogType:"bundle"}]:e==="5"?[{type:"selectAllOrigins"}]:e==="6"?[{type:"toggleOriginFilter",origin:"internal"}]:e==="7"?[{type:"toggleOriginFilter",origin:"external"}]:e==="8"?[{type:"toggleTypeFilter",catalogType:"agent"}]:e==="9"?[{type:"toggleTypeFilter",catalogType:"hook"}]:e==="0"?[{type:"toggleTypeFilter",catalogType:"plugin"}]:e==="a"&&o.activeTab==="updates"?[]:e&&e!==" "&&!a.ctrl&&!a.meta&&!a.escape?[{type:"setSelectedIndex",index:-1},{type:"setFocus",focus:"search"},{type:"searchAppend",char:e}]:[]}function sm(e,a){return a.escape?[{type:"setActionMenuOpen",open:false},{type:"setFocus",focus:"list"}]:[]}function nm(e,a,o){return a.escape?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:"reset"}:a.downArrow?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:null}:a.leftArrow?{actions:[],queryUpdate:{cursorMove:-1}}:a.rightArrow?{actions:[],queryUpdate:{cursorMove:1}}:a.return?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:null}:a.backspace?o.length===0?{actions:[{type:"setFocus",focus:"list"},{type:"setSelectedIndex",index:0}],queryUpdate:null}:{actions:[],queryUpdate:{backspace:true}}:e&&!a.ctrl&&!a.meta?{actions:[],queryUpdate:{append:e}}:{actions:[],queryUpdate:null}}var cP=new Set(re.filter(e=>e.focus!=="list").map(e=>e.focus));function Qr(e){let{setActiveTab:a,setFocus:o,setSelectedIndex:t,setActionMenuOpen:r}=y.getState();for(let i of e)if(i.type==="setTab")a(i.tab);else if(i.type==="setFocus")o(i.focus);else if(i.type==="setSelectedIndex")t(i.index);else if(i.type==="setActionMenuOpen")r(i.open);else if(i.type==="searchAppend"){let{setQuery:s,query:n,setCursorPosition:d,cursorPosition:l}=_e.getState();s(n.slice(0,l)+i.char+n.slice(l)),d(l+i.char.length);}else i.type==="toggleTypeFilter"?y.getState().toggleTypeFilter(i.catalogType):i.type==="selectAllTypes"?y.getState().selectAllTypes():i.type==="toggleOriginFilter"?y.getState().toggleOriginFilter(i.origin):i.type==="selectAllOrigins"&&y.getState().selectAllOrigins();}function dm({listLength:e}){let a=y(f=>f.focus),o=y(f=>f.selectedIndex),t=y(f=>f.actionMenuOpen),r=y(f=>f.setFocus),i=y(f=>f.setActionMenuOpen),s=_e(f=>f.query),n=_e(f=>f.setQuery),d=_e(f=>f.resetQuery),l=useRef(e);useEffect(()=>{l.current=e;},[e]),useEffect(()=>{if(a==="search"){let{query:f,setCursorPosition:h}=_e.getState();h(f.length);}},[a]);let[c,u]=useState("");useEffect(()=>{let f=setTimeout(()=>u(s),300);return ()=>clearTimeout(f)},[s]),useInput((f,h)=>{let{activeTab:b,selectedIndex:D,actionMenuOpen:q}=y.getState();Qr(od(f,h,{activeTab:b}));},{isActive:a==="tabs"}),useInput((f,h)=>{if(!h.leftArrow&&!h.rightArrow)return;let{activeTab:b,selectedIndex:D,actionMenuOpen:q}=y.getState();Qr(od("",h,{activeTab:b}));},{isActive:cP.has(a)}),useInput((f,h)=>{let{activeTab:b,selectedIndex:D,actionMenuOpen:q}=y.getState();Qr(im(f,h,{activeTab:b,selectedIndex:D},l.current));},{isActive:a==="list"}),useInput((f,h)=>{Qr(sm(f,h));},{isActive:a==="actionMenu"}),useInput((f,h)=>{let b=nm(f,h,_e.getState().query),D=b.queryUpdate;if(Qr(b.actions),D==="reset")d(),u("");else if(D!==null){let{query:q,cursorPosition:L,setCursorPosition:A}=_e.getState();if("backspace"in D)L>0&&(n(q.slice(0,L-1)+q.slice(L)),A(L-1));else if("append"in D)n(q.slice(0,L)+D.append+q.slice(L)),A(L+D.append.length);else if("cursorMove"in D){let T=L+D.cursorMove;T>=0&&T<=q.length&&A(T);}}},{isActive:a==="search"});let m=useCallback(()=>{i(false),r("list");},[i,r]),p=useCallback(f=>{let{setSelectedIndex:h,selectedIndex:b}=y.getState();f===0?h(0):b>=f&&h(f-1);},[]),g=useCallback(f=>{if(!c)return l.current=f.length,f;let h=c.toLowerCase(),b=f.filter(D=>D.name.toLowerCase().includes(h)||D.description?.toLowerCase().includes(h));return l.current=b.length,b},[c]);return {actionMenuOpen:t,closeMenu:m,selectedIndex:o,clampIndex:p,filteredItems:g}}function lm(){let e=y(n=>n.notification),a=y(n=>n.showNotification),o=y(n=>n.clearNotification),t=oa(n=>n.justAuthenticated),r=oa(n=>n.credentials),i=oa(n=>n.setJustAuthenticated);return useEffect(()=>{t&&r&&(a(`Authenticated. Tenant: ${r.tenant}`,"success"),i(false));},[t,r]),useEffect(()=>{if(!e)return;let n=setTimeout(o,3e3);return ()=>clearTimeout(n)},[e]),{notify:(n,d)=>{a(n,d);}}}function ze(e,a,o=false){return o?true:!Hd.valid(e)||!Hd.valid(a)?false:Hd.gt(a,e)}U();I();var io=k("updater");async function lP(e,a,o,t,r,i){try{await C(w.CLI_TOOL_UPDATED,{tool_id:e,tool_type:i,source:r,from_version:a,to_version:o,duration_ms:t,interface:Z().interfaceType});}catch(s){io.warn(`Failed to send update metrics: ${String(s)}`);}}function uP(e){let a=Ae(),o=`${e}@${ue}`,t=a.plugins[o];return !t||t.length===0?null:{pluginKey:o,entry:t[0]}}async function As(e,a={}){let o=Date.now(),t=null;try{io.debug(`[${e}] Acquiring lock...`),t=await Mo();let r=uP(e);if(!r)throw io.error(`[${e}] Plugin is not installed`),new Error(`Plugin "${e}" is not installed`);let{entry:i}=r,s=i.version,n=i.installPath;io.debug(`[${e}] Fetching manifest...`);let l=(await Wt(e,a.source)).version;if(!s||!ze(s,l,a.force))throw io.debug(`[${e}] Already up to date (v${s??"n/a"})`),new Io(e,s??"unknown");io.info(`[${e}] Updating v${s} \u2192 v${l}...`),await t(),t=null;try{let c=await je(e,{force:!0,skipMetrics:!0,source:a.source}),u=Date.now()-o;return await lP(c.name,s,c.version,u,i.origin??"internal",i.type??"skill"),io.debug(`[${e}] Updated successfully in ${u}ms`),{name:c.name,previousVersion:s,newVersion:c.version,path:c.path,duration_ms:u}}catch(c){io.warn(`[${e}] Install failed, rolling back to v${s}...`),t=await Mo();let u=Ae(),m=`${e}@${ue}`;throw u.plugins[m]&&(u.plugins[m][0].version=s,u.plugins[m][0].installPath=n,na(u),io.info(`[${e}] Rollback completed, restored to v${s}`)),c}}finally{t&&await t();}}To();I();var xs=k("dispatcher");async function pP(e,a,o,t,r){let i=Bt(e);return xs.debug(`[${e}] Install failed (exit code), attempting marketplace add`),r?.onError?.(o),t?r?.onStatus?.(`Adding marketplace for ${i}...`):r?.onPause?.(),await ms(e,t,()=>{}),r?.onResume?.(`Retrying install for ${i}...`),xs.debug(`[${e}] Retrying install after marketplace add`),qe(a)}async function um(e,a,o,t){let r=jt(e,t),i=Bt(e);o?.onStatus?.(`Installing ${i}...`),xs.debug(`[${e}] Attempting install: ${r}`);let s=await qe(r);if(s.exitCode===0)return s;xs.debug(`[${e}] Install failed (exit ${s.exitCode}), attempting marketplace add`);let n=s.stderr||`Install failed with exit code ${s.exitCode}`;return pP(e,r,n,a,o)}async function pm(e,a,o){let t=e.type??"bundle",r=await Ja.getAvailableProviders(t),i=r[0];if(!i)throw new Error(`No available provider for artifact type "${t}"`);let s=i.installers[t];if(!s)throw new Error(`Provider "${i.id}" does not support type "${t}"`);let n=a??{},d=n;return s.install(e,d)}function mm(){let e=ye(s=>s.installedItems),a=ye(s=>s.loadFromDisk),o=useCallback(async(s,n)=>{let d=await pm(s,n);if(!d.success)throw new Error(d.message||"Installation failed");a();},[a]),t=useCallback(async(s,n)=>{let d=ce().find(p=>p.name===s),l=d?.providerId??"claude-code",c=Ja.getAdapter(l);if(!c)throw new Error(`Provider "${l}" not found`);let u=d?.type??"bundle",m=c.installers[u];if(!m)throw new Error(`Provider "${l}" does not support type "${u}"`);await m.uninstall(s,n??"user"),a();},[a]),r=useCallback(async(s,n)=>{let l=e.find(c=>c.name===s)?.status==="enabled"?"disabled":"enabled";await Fr(s,l,n),a();},[e,a]),i=useCallback(async s=>{await As(s),a();},[a]);return {install:o,uninstall:t,toggle:r,update:i}}j();I();var Is=k("mcp");function _r(e,a){e.silent?Ne({status:"error",mcp:a.name,...a.exitCode!==void 0&&{exitCode:a.exitCode},message:a.message}):S(`Failed to ${a.action} MCP "${a.name}": ${a.message}`);}function fm(e,a){e.silent?be({status:"success",mcp:a.name,command:a.command,duration_ms:a.durationMs}):(K(`MCP "${a.name}" ${a.actionPastTense} successfully`),e.verbose&&a.stdout&&P(a.stdout));}function mP(e,a,o,t){let r=["claude","mcp","add","--transport",o,e];return a.length>0&&r.push(...a),t&&r.push("--scope",t),r.join(" ")}function Vd(e,a){if(e.startsWith("-"))throw new Error(`Invalid MCP server name: "${e}". Names must not start with '-'.`);let o=["claude","mcp","remove",e];return a&&o.push("--scope",a),o.join(" ")}async function hm(e,a,o){if(!await fe())return 1;if(a.length===0){let i=o.transport==="http"?"a URL":"a command";return _r(o,{name:e,action:"add",message:`${o.transport} transport requires ${i}`}),1}Is.debug(`[${e}] Starting MCP add with args: ${a.join(" ")}`);let t=mP(e,a,o.transport,o.scope);if(!o.force){let i=v(e),s=v(t);if(!await ee(`Install external MCP "${i}"?
118
118
  This will run: ${s}
119
- [y/N] `))return Is.debug(`[${e}] Installation cancelled by user`),D("Operation cancelled."),0}let r=o.silent?void 0:wc({text:`Adding MCP "${b(e)}"...`}).start();try{let i=await qe(t);return r?.stop(),i.exitCode!==0?(_r(o,{name:e,action:"add",message:i.stderr||"Command failed",exitCode:i.exitCode}),!o.silent&&o.verbose&&i.stdout&&D(`stdout: ${i.stdout}`),1):(fm(o,{name:e,actionPastTense:"added",command:t,durationMs:i.duration_ms,stdout:i.stdout}),0)}catch(i){return r?.stop(),_r(o,{name:e,action:"add",message:$(i)}),1}}async function bm(e,a){if(!await he())return 1;Is.debug(`[${e}] Starting MCP remove`);let o=Kd(e,a.scope);if(!a.force){let r=b(e),i=b(o);if(!await ee(`Remove MCP "${r}"?
119
+ [y/N] `))return Is.debug(`[${e}] Installation cancelled by user`),P("Operation cancelled."),0}let r=o.silent?void 0:yc({text:`Adding MCP "${v(e)}"...`}).start();try{let i=await qe(t);return r?.stop(),i.exitCode!==0?(_r(o,{name:e,action:"add",message:i.stderr||"Command failed",exitCode:i.exitCode}),!o.silent&&o.verbose&&i.stdout&&P(`stdout: ${i.stdout}`),1):(fm(o,{name:e,actionPastTense:"added",command:t,durationMs:i.duration_ms,stdout:i.stdout}),0)}catch(i){return r?.stop(),_r(o,{name:e,action:"add",message:$(i)}),1}}async function bm(e,a){if(!await fe())return 1;Is.debug(`[${e}] Starting MCP remove`);let o=Vd(e,a.scope);if(!a.force){let r=v(e),i=v(o);if(!await ee(`Remove MCP "${r}"?
120
120
  This will run: ${i}
121
- [y/N] `))return Is.debug(`[${e}] Removal cancelled by user`),D("Operation cancelled."),0}let t=a.silent?void 0:wc({text:`Removing MCP "${b(e)}"...`}).start();try{let r=await qe(o);return t?.stop(),r.exitCode!==0?(_r(a,{name:e,action:"remove",message:r.stderr||"Command failed",exitCode:r.exitCode}),!a.silent&&a.verbose&&r.stdout&&D(`stdout: ${r.stdout}`),1):(fm(a,{name:e,actionPastTense:"removed",command:o,durationMs:r.duration_ms,stdout:r.stdout}),0)}catch(r){return t?.stop(),_r(a,{name:e,action:"remove",message:$(r)}),1}}I();function vm({selectedItem:e,selectedCatalogItem:a,items:o,closeMenu:t,clampIndex:r,notify:i}){let s=P("pluginHandlers"),n=useRef(0),d=y(A=>A.setLoading),l=y(A=>A.setDownloadProgress),{install:c,uninstall:u,toggle:p,update:m}=mm(),g=async(A,M,F)=>{d(true,A),t();try{await M(),r(o.length),i(F,"success");}catch(O){let oe=O instanceof Error?O.message:"Something went wrong";s.error(`[withLoading] ${A} failed: ${oe}`),i(oe,"error");}finally{d(false);}};return {handleInstall:(A,M)=>{e&&a&&(n.current=0,g(`Installing ${e.name}...`,()=>c(a,{scope:A,...M!==void 0?{providerId:M}:{},onDownloadProgress:(F,O)=>{let oe=Date.now();(oe-n.current>100||F>=O)&&(n.current=oe,l(F,O));}}),"\u2713 Installed successfully"));},handleUninstall:A=>{e&&g(`Uninstalling ${e.name}...`,()=>u(e.name,A),"\u2713 Uninstalled");},handleToggleStatus:A=>{if(!e)return;let M=e.status==="enabled";g(M?`Disabling ${e.name}...`:`Enabling ${e.name}...`,()=>p(e.name,A),M?"\u2713 Disabled":"\u2713 Enabled");},handleUpdate:()=>{if(!e)return;let A=a?` to v${a.version}`:"";(async()=>{d(true,`Updating ${e.name}${A}...`),t();try{await m(e.name),r(o.length),i(`\u2713 Updated ${e.name}${A}`,"success");}catch(F){if(F instanceof Io)i(F.message,"info");else {let O=F instanceof Error?F.message:"Something went wrong";s.error(`[handleUpdate] ${e.name} failed: ${O}`),i(O,"error");}}finally{d(false);}})();},handleBatchUpdate:A=>{if(A.length===0)return;let M=A.length;(async()=>{d(true,`Updating ${M} plugin${M>1?"s":""}...`),t();try{let O=[];for(let J of A)O.push(await m(J.name).then(()=>({status:"fulfilled",value:void 0}),ae=>({status:"rejected",reason:ae})));let oe=O.filter(J=>J.status==="fulfilled").length,x=O.map((J,ae)=>J.status==="rejected"?A[ae].name:null).filter(J=>J!==null);r(o.length),x.length===0?i(`\u2713 Updated ${oe}/${M} plugin${M>1?"s":""}`,"success"):(s.error(`[handleBatchUpdate] failed: ${x.join(", ")}`),i(`Updated ${oe}/${M}; failed: ${x.join(", ")}`,oe>0?"info":"error"));}finally{d(false);}})();},handleMcpConfigUninstall:A=>{e&&g(`Removing MCP ${e.name}...`,async()=>{let M=Kd(e.name,A),F=await qe(M);if(F.exitCode!==0)throw new Error(F.stderr||"MCP removal failed");ye.getState().loadFromDisk();},"\u2713 MCP removed");}}}xr();I();var Xr=P("api:bundle"),Zt=class extends Error{constructor(a){super(`Bundle '${a}' not found in your tenant. Verify the name with whoever shared the command.`),this.name="BundleNotFoundError";}},Kr=class extends Error{constructor(){super("The server encountered an error while fetching the bundle. Please try again later."),this.name="BundleServerError";}},vP=/^[a-zA-Z0-9_-]{1,128}$/;async function km(e,a){if(e instanceof HTTPError){let o=e.response.status;throw Xr.error(`HTTP error fetching bundle '${a}' [status=${o}]`),o===StatusCodes.NOT_FOUND?new Zt(a):o===StatusCodes.INTERNAL_SERVER_ERROR?new Kr:new Error(`Server error (${o}) \u2014 please try again later.`)}throw Xr.error(`Unexpected error fetching bundle '${a}': ${e instanceof Error?e.message:String(e)}`),e}async function Pm(e){if(!vP.test(e))throw new Error("Invalid bundle identifier format.");let a=encodeURIComponent(e);Xr.debug(`Fetching bundle by flowId "${e}"`);try{return await eo().get(`v1/use-cases/${a}`).json()}catch(o){return km(o,e)}}async function Ts(e){let a=encodeURIComponent(e);Xr.debug(`Fetching bundle by name "${e}"`);let o;try{o=await eo().get(`v1/use-cases/by-name/${a}`).json(),Xr.debug(`API returned ${o.length} result(s) for "${e}"`);}catch(t){return km(t,e)}if(o.length===0)throw new Zt(e);return o[0]}I();var yP=P("tui:bundle-flow");function Dm({closeMenu:e,notify:a}){let o=y(n=>n.bundleInstallFlow);return {handleBundleInstallStart:(n,d)=>{let{setLoading:l,setBundleInstallFlow:c}=y.getState(),u=d?.trim();yP.debug(`Starting bundle install: itemName="${n}" flowId="${u??"none"}"`),l(true,"Loading bundle..."),(u?Pm(u):Ts(n)).then(m=>{l(false),y.getState().actionMenuOpen&&c({phase:"detail",bundle:m});}).catch(m=>{l(false),a(m instanceof Error?m.message:"Failed to load bundle","error");});},handleBundleDetailConfirm:()=>{if(!o||o.phase!=="detail")return;let{setBundleInstallFlow:n,setFocus:d}=y.getState();n({phase:"installing",bundle:o.bundle}),d("bundleInstallProgress");},handleBundleDetailBack:()=>{let{setBundleInstallFlow:n}=y.getState();n(null),e();},handleBundleInstallComplete:n=>{y.getState().setBundleInstallFlow(null),e(),ye.getState().loadFromDisk(),a(`\u2713 Installed ${n.installed} of ${n.total} artifacts`,"success");}}}j();U();var $r=["local","project","user"],kP=new Set(["--transport","--scope","-s"]);function wm(e){let a=e.split(/\s+/).filter(Boolean),o=a.indexOf("add");if(o===-1)return null;let t=o+1;for(;t<a.length;){let r=a[t];if(kP.has(r))t+=2;else if(r.startsWith("-"))t+=1;else return r.replace(/^["']|["']$/g,"")}return null}function pt(e,a){return a?`${e}::${a}`:e}function $d(e){return e===pe?dr:ft}function Sm(e){return {name:b(e.name),version:e.version?b(e.version):e.version,description:e.description?b(e.description):e.description,authorName:e.author?.name?b(e.author.name):e.author?.name,updateAvailable:e.updateAvailable,type:e.type??"bundle",origin:e.origin??dr,flowId:e.flowId}}function Yd(e,a){let o=$d(e.marketplace);return {name:b(e.name),version:e.version?b(e.version):e.version,description:e.description?b(e.description):e.description,authorName:e.author?.name?b(e.author.name):e.author?.name,status:e.status,scope:e.scope,marketplace:e.marketplace,updateAvailable:e.updateAvailable,installedAt:e.installedAt,type:a?.type??e.type??"bundle",origin:a?.origin??o}}function Cm(e){let a=new Map;for(let o of e){if(!o.scope)continue;let t=a.get(o.scope)??[];t.push(o),a.set(o.scope,t);}return $r.filter(o=>a.has(o)).map(o=>({scope:o,label:Xa[o].label,pathHint:Xa[o].pathHint,items:a.get(o)??[]}))}function Rm(e){let a=o=>{if(!o)return 1/0;let t=$r.indexOf(o);return t===-1?1/0:t};return [...e].sort((o,t)=>a(o.scope)-a(t.scope))}function Am({catalog:e,installedItems:a,activeTab:o,catalogFilters:t,searchQuery:r}){let i=useMemo(()=>new Set(a.map(g=>pt(g.name,g.author?.name))),[a]),s=useMemo(()=>new Set(a.filter(g=>g.type==="mcp").map(g=>g.name.toLowerCase())),[a]),n=useMemo(()=>{let g=new Map(e.map(h=>[pt(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return a.map(h=>{let v=g.get(pt(h.name,h.author?.name))??f.get(h.name),k=v?.version,T=!!k&&!!h.version&&ze(h.version,k);return {...h,updateAvailable:T,catalogItem:v}})},[a,e]),d=useMemo(()=>o==="discover"?e.filter(g=>{if(i.has(pt(g.name,g.author?.name)))return false;if(g.type==="mcp"){let f=g.installCommand?wm(g.installCommand)?.toLowerCase():null;if(s.has(g.name.toLowerCase())||f&&s.has(f))return false}return true}).map(g=>Sm(g)):o==="updates"?n.filter(g=>g.updateAvailable).map(g=>Yd(g,g.catalogItem)):n.map(g=>Yd(g,g.catalogItem)),[o,e,i,s,n]),l=useMemo(()=>d.filter(g=>{let f=g.type??"bundle";if(!t.types.has(f))return false;let h=g.origin??"internal";return t.origins.has(h)}),[d,t]),c=useMemo(()=>{let{types:g}=t;if(g.size===1){if(g.has("skill"))return "skills";if(g.has("mcp"))return "MCPs";if(g.has("bundle"))return "bundles"}return "items"},[t]),u=useMemo(()=>o==="installed"?r?`No ${c} found for '${r}' \u2014 explore the Discover tab!`:`No ${c} installed \u2014 explore the Discover tab!`:o==="updates"?r?`No ${c} found for '${r}' \u2014 all up to date!`:"All up to date \u2014 nothing to update":r?`No ${c} found for '${r}'`:`No ${c} available in the catalog`,[o,r,c]),p=useMemo(()=>{let g=new Map(e.map(h=>[pt(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return h=>h?g.get(pt(h.name,h.authorName))??f.get(h.name)??null:null},[e]),m=useMemo(()=>n.filter(g=>g.updateAvailable).length,[n]);return {items:l,emptyMessage:u,getSelectedCatalogItem:p,outdatedCount:m}}function Zd(){let[e,a]=useState([]),[o,t]=useState(true),[r,i]=useState(null),[s,n]=useState(null),d=useRef(false),l=y(u=>u.catalogVersion),c=useCallback(async()=>{t(true),i(null),n(null);try{let{items:u,failures:p}=await ep();if(a(u),p.length>0){let m=p.map(g=>g.adapterName).join(", ");n(`Some catalogs failed to load: ${m}`);}d.current||(d.current=!0,C(w.CLI_CATALOG_VIEWED,{interface:"tui",filter_type:"all",result_count:u.length}).catch(()=>{}));}catch(u){i(u instanceof Error?u:new Error(String(u))),a([]);}finally{t(false);}},[]);return useEffect(()=>{c();},[c,l]),{catalog:e,isLoading:o,error:r,partialError:s,refetch:c}}function xm(){return {items:ye(a=>a.installedItems)}}I();var CP=P("catalog");function Im(){let e=y(X=>X.bundleInstallFlow),a=y(X=>X.activeTab),o=y(X=>X.notification),t=y(X=>X.loading),r=y(X=>X.loadingMessage),i=y(X=>X.downloadProgress),s=y(X=>X.downloadTotal),n=y(X=>X.catalogError),d=y(X=>X.setCatalogError),l=y(X=>X.catalogFilters),c=_e(X=>X.query),{catalog:u,isLoading:p,error:m,refetch:g}=Zd(),{items:f}=xm(),h=ye(X=>X.loadFromDisk),{items:v,emptyMessage:k,getSelectedCatalogItem:T,outdatedCount:L}=Am({catalog:u,installedItems:f,activeTab:a,catalogFilters:l,searchQuery:c}),{actionMenuOpen:A,closeMenu:M,selectedIndex:F,clampIndex:O,filteredItems:oe}=dm({listLength:v.length}),x=oe(v),J=useMemo(()=>a!=="installed"&&a!=="updates"?x:Rm(x),[a,x]),ae=useMemo(()=>a==="installed"||a==="updates"?Cm(J):[],[a,J]),z=J[F]??null,W=useMemo(()=>T(z),[T,z]),{notify:_}=lm(),{handleInstall:E,handleUninstall:B,handleToggleStatus:Q,handleUpdate:Fe,handleBatchUpdate:si,handleMcpConfigUninstall:Ph}=vm({selectedItem:z,selectedCatalogItem:W,items:v,closeMenu:M,clampIndex:O,notify:_}),{handleBundleInstallStart:Dh,handleBundleDetailConfirm:wh,handleBundleDetailBack:Sh,handleBundleInstallComplete:Ch}=Dm({closeMenu:M,notify:_}),Rh=useCallback(()=>si(J),[si,J]);return useEffect(()=>{h();},[]),useEffect(()=>{O(J.length);},[J.length,O]),useEffect(()=>{m&&(CP.error(`[catalog] ${m instanceof Error?m.message:String(m)}`),d("Failed to load catalog"));},[m]),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(qt,{}),jsx(pu,{outdatedCount:L}),a==="marketplaces"&&Co()?jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(rm,{})}):jsx(Iu,{filteredItems:J,groups:ae,emptyMessage:k,onBatchUpdate:Rh}),(t||p)&&jsxs(Fragment,{children:[jsx($i,{message:t?r:"Loading catalog..."}),t&&s>0&&i>0&&jsx(Box,{paddingLeft:2,children:jsx(Zi,{received:i,total:s})})]}),n&&!p&&a==="discover"&&jsx(es,{message:n,onRetry:()=>{d(null),g();},onBack:()=>d(null)}),o&&jsx(Tu,{message:o.message,type:o.type}),A&&z&&(a==="discover"?W?.type==="bundle"?e?.phase==="installing"?jsx(Jp,{bundle:e.bundle,onComplete:Ch}):jsx(Mp,{itemName:z.name,bundle:e?.phase==="detail"?e.bundle:void 0,onInstall:()=>Dh(z.name,z.flowId),onConfirm:wh,onClose:e?.phase==="detail"?Sh:M}):jsx(Ip,{itemName:z.name,itemType:W?.type,onInstall:E,onClose:M}):z.type==="mcp"?jsx(Gp,{itemName:z.name,itemScope:z.scope??"user",onUninstall:Ph,onClose:M}):jsx(Fp,{itemName:z.name,itemScope:z.scope??"user",itemStatus:z.status??"enabled",updateAvailable:z.updateAvailable??false,catalogVersion:W?.version,onUninstall:B,onToggleStatus:X=>Q(X),onUpdate:Fe,onClose:M})),jsx(Ki,{})]})}var q=create((e,a)=>({starterKits:[],selectedStarterKitIndex:0,selectedStarterKit:null,plugins:[],pluginCursorIndex:0,step:"starterKitList",isLoadingStarterKits:false,starterKitsError:null,successCount:0,failedCount:0,summaryActionIndex:0,setStarterKits:o=>e({starterKits:o}),setSelectedStarterKitIndex:o=>e({selectedStarterKitIndex:o}),selectStarterKit:o=>{let t=new Set(ye.getState().installedItems.map(r=>r.name));e({selectedStarterKit:o,plugins:o.plugins.map(r=>({name:r,selected:true,status:t.has(r)?"success":"pending",installed:t.has(r)})),pluginCursorIndex:0,step:"starterKitDetail"});},setPluginCursorIndex:o=>e({pluginCursorIndex:o}),setStep:o=>e({step:o}),setPluginStatus:(o,t,r)=>{let i=a().plugins.map(s=>s.name===o?{...s,status:t,error:r}:s);e({plugins:i});},setPluginDownloadProgress:(o,t,r)=>{let i=a().plugins.map(s=>s.name===o?{...s,downloadProgress:t,downloadTotal:r}:s);e({plugins:i});},setIsLoadingStarterKits:o=>e({isLoadingStarterKits:o}),setStarterKitsError:o=>e({starterKitsError:o}),setSummaryActionIndex:o=>e({summaryActionIndex:o}),computeSummary:()=>{let t=a().plugins.filter(r=>r.selected);e({successCount:t.filter(r=>r.status==="success").length,failedCount:t.filter(r=>r.status==="failed").length});},resetForRetry:()=>{let o=a().plugins.map(t=>t.status==="failed"?{...t,status:"pending",error:void 0}:t);e({plugins:o,step:"installing"});},goBackToList:()=>e({selectedStarterKit:null,plugins:[],pluginCursorIndex:0,step:"starterKitList"})}));Re();var IP=3;function Mm(){let e=q(c=>c.setStarterKits),a=q(c=>c.setIsLoadingStarterKits),o=q(c=>c.setStarterKitsError),t=q(c=>c.setPluginStatus),r=q(c=>c.setPluginDownloadProgress),i=q(c=>c.setStep),s=q(c=>c.computeSummary),n=useCallback(async()=>{a(true),o(null);try{let c=await ns();e(c);}catch(c){o(c instanceof Error?c.message:String(c));}finally{a(false);}},[a,o,e]);useEffect(()=>{ye.getState().loadFromDisk(),n();},[n]);let d=useRef(0),l=useCallback(async()=>{let c=q.getState().plugins.filter(p=>p.selected&&p.status==="pending");for(let p of c){t(p.name,"installing"),d.current=0;let m="",g=false;for(let f=1;f<=IP;f++)try{await je(p.name,{onDownloadProgress:(h,v)=>{let k=Date.now();(k-d.current>100||h>=v)&&(d.current=k,r(p.name,h,v));}}),t(p.name,"success"),g=!0;break}catch(h){if(h instanceof Xe){t(p.name,"success"),g=true;break}m=h instanceof Error?h.message:"Unknown error";}g||(t(p.name,"failed",m),C(w.CLI_TOOL_INSTALL_FAILED,{tool_id:p.name,tool_type:"skill",source:"internal",error_code:"install_failed",error_message:m,interface:Z().interfaceType}).catch(()=>{}));}let u=$o();Ko("summary_review"),C(w.CLI_STEP_COMPLETED,{step:"tool_installation",duration_ms:u}).catch(()=>{}),ye.getState().loadFromDisk(),s(),i("summary");},[t,r,s,i]);return {loadStarterKits:n,installSelected:l}}var Yr={cursorDelta:0,confirm:false,back:false};function qm(e,a){return a.upArrow?{...Yr,cursorDelta:-1}:a.downArrow?{...Yr,cursorDelta:1}:a.escape?{...Yr,back:true}:a.return?{...Yr,confirm:true}:Yr}var TP={cursorDelta:0,select:false};function Lm(e,a){return a.upArrow?{cursorDelta:-1,select:false}:a.downArrow?{cursorDelta:1,select:false}:a.return?{cursorDelta:0,select:true}:TP}j();var Fm=wv.memo(function({starterKit:a,isSelected:o}){return jsxs(Box,{flexDirection:"column",paddingBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u203A ":"\u25CB "}),jsx(Text,{bold:o,color:o?"cyan":"white",children:b(a.name)}),jsxs(Text,{dimColor:true,children:[" \xB7 ",a.plugins.length," ",a.plugins.length===1?"plugin":"plugins"]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:b(a.description)})})]})});var sc=5;function Om({onRetry:e}){let a=q(c=>c.starterKits),o=q(c=>c.selectedStarterKitIndex),t=q(c=>c.isLoadingStarterKits),r=q(c=>c.starterKitsError);if(t)return jsx($i,{message:"Loading Starter Kits..."});if(r)return jsx(es,{message:r,onRetry:e,onBack:e});if(a.length===0)return jsx(Lt,{message:"No Starter Kits available."});let i=Math.max(0,o-Math.floor(sc/2)),s=Math.min(a.length,i+sc);s===a.length&&(i=Math.max(0,s-sc));let n=a.slice(i,s),d=i,l=a.length-s;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Select a Starter Kit to get started"})}),d>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2191 ",d," more above"]})}),n.map((c,u)=>jsx(Fm,{starterKit:c,isSelected:i+u===o},c.slug)),l>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",l," more below"]})})]})}j();var Gm=wv.memo(function({plugin:a,isCursor:o}){return jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u203A ":" "}),jsx(Text,{color:"cyan",children:"\u2022"}),jsxs(Text,{bold:o,color:o?"cyan":"white",children:[" ",b(a.name)]}),a.installed&&jsx(Text,{color:"green",children:" (installed)"})]})});j();var cc=8;function Bm(){let e=q(c=>c.selectedStarterKit),a=q(c=>c.plugins),o=q(c=>c.pluginCursorIndex),t=useRef(false);if(useEffect(()=>{e&&!t.current&&(t.current=true,C(w.CLI_KIT_DISPLAYED,{bundle_slug:e.slug,tool_count:a.length}).catch(()=>{}));},[e,a.length]),!e)return jsx(Text,{dimColor:true,children:"No Starter Kit selected."});let r=a.filter(c=>c.installed).length,i=Math.max(0,o-Math.floor(cc/2)),s=Math.min(a.length,i+cc);s===a.length&&(i=Math.max(0,s-cc));let n=a.slice(i,s),d=i,l=a.length-s;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:[jsx(Text,{bold:true,color:"cyan",children:b(e.name)}),jsx(Text,{dimColor:true,children:b(e.description)})]}),jsx(Box,{paddingX:1,paddingBottom:1,children:jsxs(Text,{children:[a.length," plugins to install",r>0&&` \xB7 ${r} already installed`]})}),d>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2191 ",d," more above"]})}),n.map((c,u)=>jsx(Gm,{plugin:c,isCursor:i+u===o},c.name)),l>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",l," more below"]})})]})}j();var jP=["Retry failed","Continue anyway"];function jm({name:e,status:a,error:o,downloadProgress:t,downloadTotal:r}){let i=b(e);return a==="installing"?jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",i]})]}),r!==void 0&&r>0&&t!==void 0&&t>0&&jsx(Box,{paddingLeft:2,children:jsx(Zi,{received:t,total:r})})]}):a==="success"?jsx(Box,{children:jsxs(Text,{color:"green",children:["\u2713 ",i]})}):a==="failed"?jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",i]}),o&&jsxs(Text,{dimColor:true,children:[" \u2014 ",b(o)]})]}):jsx(Box,{children:jsxs(Text,{dimColor:true,children:["\u25CB ",i]})})}function Um({onComplete:e,onRetry:a}){let o=q(l=>l.plugins),t=q(l=>l.step),r=q(l=>l.successCount),i=q(l=>l.failedCount),s=q(l=>l.summaryActionIndex),n=o.filter(l=>l.selected),d=useRef(false);return useEffect(()=>{if(t==="summary"&&i===0&&!d.current){d.current=true;let l=setTimeout(e,1500);return ()=>clearTimeout(l)}},[t,i,e]),t==="installing"?jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Installing plugins..."})}),jsx(Box,{flexDirection:"column",paddingX:1,children:n.map(l=>jsx(jm,{name:l.name,status:l.status,error:l.error,downloadProgress:l.downloadProgress,downloadTotal:l.downloadTotal},l.name))})]}):jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Installation Complete"})}),jsxs(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:[r>0&&jsxs(Text,{color:"green",children:["\u2713 ",r," ",r===1?"plugin":"plugins"," installed successfully"]}),i>0&&jsxs(Text,{color:"red",children:["\u2717 ",i," ",i===1?"plugin":"plugins"," failed"]})]}),i>0&&jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:n.filter(l=>l.status==="failed").map(l=>jsx(jm,{name:l.name,status:l.status,error:l.error},l.name))}),i>0&&jsx(Box,{flexDirection:"column",paddingX:1,children:jP.map((l,c)=>jsx(Box,{children:jsxs(Text,{bold:c===s,color:c===s?"cyan":void 0,children:[c===s?"\u203A ":" ",l]})},l))}),i===0&&jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:"Proceeding to main screen..."})})]})}function zm(){let e=q(x=>x.step),a=q(x=>x.starterKits),o=q(x=>x.selectedStarterKitIndex),t=q(x=>x.setSelectedStarterKitIndex),r=q(x=>x.selectStarterKit),i=q(x=>x.plugins),s=q(x=>x.pluginCursorIndex),n=q(x=>x.setPluginCursorIndex),d=q(x=>x.setStep),l=q(x=>x.summaryActionIndex),c=q(x=>x.setSummaryActionIndex),u=q(x=>x.failedCount),p=q(x=>x.resetForRetry),m=q(x=>x.goBackToList),g=y(x=>x.setScreen),f=y(x=>x.setFocus),h=y(x=>x.focus),v=oa(x=>x.setJustAuthenticated),k=oa(x=>x.justAuthenticated),{loadStarterKits:T,installSelected:L}=Mm(),A=useRef(false);useEffect(()=>{e==="starterKitList"?(f("starterKitList"),A.current||(A.current=true,Ko("bundle_selection"))):f(e==="starterKitDetail"?"starterKitDetail":"installProgress");},[e,f]);let M=useCallback(async()=>{let x=q.getState().selectedStarterKit;if(x){let ae=await Y();ae&&await ko({...ae,starterKit:x.slug});}C(w.CLI_STEP_COMPLETED,{step:"summary_review",duration_ms:$o()}).catch(()=>{});let{successCount:J}=q.getState();C(w.CLI_ONBOARDING_COMPLETED,{duration_ms:Do(),tools_installed_count:J}).catch(()=>{}),v(false),f("verify"),g("verify");},[v,f,g]),F=useCallback(()=>{p(),L();},[p,L]),O=useCallback(()=>{T();},[T]),oe=useCallback(()=>{f("verify"),g("verify");},[f,g]);return useInput((x,J)=>{if(J.escape)qi("esc"),oe();else if(J.upArrow&&o>0)t(o-1);else if(J.downArrow&&o<a.length-1)t(o+1);else if(J.return&&a.length>0){let ae=$o();r(a[o]),Ko("kit_display"),C(w.CLI_STEP_COMPLETED,{step:"bundle_selection",duration_ms:ae}).catch(()=>{});}},{isActive:h==="starterKitList"}),useInput((x,J)=>{let ae=qm(x,J);if(ae.cursorDelta!==0){let z=s+ae.cursorDelta;z>=0&&z<i.length&&n(z);}if(ae.confirm){let z=q.getState().selectedStarterKit;z&&(async()=>(await Y())?.starterKit!==z.slug&&C(w.CLI_KIT_ACCEPTED,{bundle_slug:z.slug}).catch(()=>{}))();let W=$o();Ko("kit_confirmation"),C(w.CLI_STEP_COMPLETED,{step:"kit_display",duration_ms:W}).catch(()=>{});let _=$o();Ko("tool_installation"),C(w.CLI_STEP_COMPLETED,{step:"kit_confirmation",duration_ms:_}).catch(()=>{}),d("installing"),L();}if(ae.back){let z=q.getState().selectedStarterKit;z&&C(w.CLI_KIT_REJECTED,{bundle_slug:z.slug}).catch(()=>{}),m();}},{isActive:h==="starterKitDetail"}),useInput((x,J)=>{if(u===0)return;let ae=Lm(x,J);if(ae.cursorDelta!==0){let z=l+ae.cursorDelta;z>=0&&z<=1&&c(z);}ae.select&&(l===0?F():M());},{isActive:h==="installProgress"&&e==="summary"}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(qt,{}),jsxs(Box,{flexDirection:"column",paddingX:1,marginBottom:1,children:[jsx(Text,{dimColor:true,children:"The data collected during setup is used solely to improve"}),jsx(Text,{dimColor:true,children:"Flow's internal tools and will not be shared externally."}),!k&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"yellow",children:"Welcome back! We noticed your Starter Kit is not set up yet. Choose a Starter Kit below to get your recommended tools."})})]}),jsxs(Box,{flexDirection:"column",flexGrow:1,children:[e==="starterKitList"&&jsx(Om,{onRetry:O}),e==="starterKitDetail"&&jsx(Bm,{}),(e==="installing"||e==="summary")&&jsx(Um,{onComplete:M,onRetry:F})]}),jsx(Ki,{})]})}U();var Hm=null;function Qm(){return Hm}async function Bs(){let a=ot().filter(o=>o.installedVersion===null&&o.installMethod===null);for(let o of a){let t=ce.find(s=>s.alias===o.alias);if(!t)continue;let{installedVersion:r,installMethod:i}=await Vm(t);(r||i)&&await Pa({...o,installedVersion:r,installMethod:i});}}async function Vm(e){let a=e.platforms[process.platform];if(a?.status!=="supported")return {installedVersion:null,installMethod:null};for(let o of a.strategies)if(o.type!=="curl")try{let r=await ja(o.type).getInstalledVersion(e);if(r)return {installedVersion:r,installMethod:o.type}}catch{}return {installedVersion:null,installMethod:null}}async function ar(e){let a=await Promise.all(e.map(o=>WP(o)));return Hm=a,a}async function WP(e){let a=Wm(e.versionCommand);a==="permission-denied"&&(JP(e.versionCommand[0]),a=Wm(e.versionCommand));let t=a==="installed"&&(!e.configCheck||e.configCheck()),r=e.platforms[process.platform],i=r?.status==="supported"?r.strategies:[],n=(await Promise.all(i.map(async d=>{try{return await ja(d.type).isAvailable()?d.type:null}catch{return null}}))).filter(d=>d!==null);if(t&&!ta(e.alias)){let{installedVersion:d,installMethod:l}=await Vm(e);await Pa({alias:e.alias,name:e.name,installedVersion:d,installMethod:l,installedAt:null,lastChecked:new Date().toISOString()});}return {module:e,alreadyInstalled:t,availableStrategies:n}}function Wm(e){if(e.length===0)return "not-found";try{let a=spawnSync(e[0],e.slice(1),{timeout:3e3,stdio:"pipe",shell:process.platform==="win32"});return a.status===0?"installed":a.status===126?"permission-denied":"not-found"}catch{return "not-found"}}function JP(e){if(process.platform!=="win32")try{let a=spawnSync("which",[e],{stdio:"pipe"});if(a.status!==0)return;let o=a.stdout.toString().trim(),t=se__default.realpathSync(o),{mode:r}=se__default.statSync(t);se__default.chmodSync(t,r|73);}catch{}}function VP(e){return e.filter(a=>a.module.platforms[process.platform]?.status==="supported").filter(a=>!a.alreadyInstalled).map(a=>({module:a.module,alreadyInstalled:a.alreadyInstalled,checked:!a.alreadyInstalled&&(a.availableStrategies.length>0||a.module.required===true),selectedStrategy:a.availableStrategies[0]??null,availableStrategies:a.availableStrategies}))}function Ym(e,a){let[o,t]=useState(()=>VP(e)),[r,i]=useState(0),s=useRef(r);useEffect(()=>{s.current=r;},[r]);let n=useRef(o);useEffect(()=>{n.current=o;},[o]);let d=useCallback(u=>{t(p=>p.map(m=>m.module.alias!==u||m.module.required?m:{...m,checked:!m.checked}));},[]),l=useCallback((u,p)=>{t(m=>m.map(g=>g.module.alias===u?{...g,selectedStrategy:p}:g));},[]);useInput((u,p)=>{let m=s.current,g=n.current,f=p.upArrow||u==="[A",h=p.downArrow||u==="[B";if(f||h)f&&m>0?i(m-1):h&&m<g.length-1&&i(m+1);else if(u===" "){let v=g[m];v&&!v.module.required&&d(v.module.alias);}else if(p.tab){let v=g[m];if(v&&v.availableStrategies.length>1){let k=v.availableStrategies.indexOf(v.selectedStrategy??v.availableStrategies[0]),T=v.availableStrategies[(k+1)%v.availableStrategies.length];t(L=>L.map(A=>A.module.alias===v.module.alias?{...A,selectedStrategy:T}:A));}}},{isActive:a});let c=useMemo(()=>o.filter(u=>u.checked),[o]);return {items:o,focusedIndex:r,toggle:d,setStrategy:l,confirmedItems:c}}j();function eg({probeResults:e,onConfirm:a}){let o=y(m=>m.focus),t=y(m=>m.actionMenuOpen),r=y(m=>m.setActionMenuOpen),i=y(m=>m.setFocus),{items:s,focusedIndex:n,confirmedItems:d}=Ym(e,o==="moduleSetup"),l=useCallback(()=>{r(false),i("moduleSetup");},[r,i]),c=useCallback(m=>{(m==="Install"||m==="Skip")&&a(d),l();},[d,a,l]);useInput((m,g)=>{g.return&&(r(true),i("actionMenu"));},{isActive:o==="moduleSetup"});let u=d.length>0?["Install","Cancel"]:["Skip","Cancel"],p=d.length>0?`Install ${d.length} module(s)?`:"No modules selected";return jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Configure modules"})}),jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:s.map((m,g)=>{let f=g===n,h=b(m.module.name);return m.availableStrategies.length===0?jsxs(Box,{children:[jsxs(Text,{dimColor:true,children:[" [ ] ",h," "]}),jsx(Text,{dimColor:true,children:"\u2014 no installer available"})]},m.module.alias):jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:f?"cyan":void 0,children:[f?"\u25B6":" ",m.checked?" [\u2713] ":" [ ] ",h]}),m.module.required&&jsx(Text,{dimColor:true,children:" (required)"}),jsxs(Text,{dimColor:true,children:[" ",m.selectedStrategy??""]}),m.availableStrategies.length>1&&jsxs(Text,{dimColor:true,children:[" ","(",m.availableStrategies.indexOf(m.selectedStrategy??m.availableStrategies[0])+1,"/",m.availableStrategies.length," \u2194)"]})]}),m.module.description&&jsx(Box,{paddingLeft:6,children:jsx(Text,{dimColor:true,children:b(m.module.description)})})]},m.module.alias)})}),jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Space toggle \xB7 Tab change method \xB7 Enter confirm"})}),t&&jsx(ra,{itemName:p,actions:u,onAction:c,onClose:l})]})}var YP=/^https?:\/\/.+/;function ag({onConfirm:e}){let[a,o]=useState("confirm"),[t,r]=useState(""),[i,s]=useState(false),n=useRef("");return useInput((d,l)=>{if(a==="confirm"){if(d==="y"||d==="Y"){o("input");return}if(d==="n"||d==="N"||l.return){e(null);return}}if(a==="input"){if(l.escape){n.current="",r(""),o("confirm");return}if(l.return){let c=n.current.trim();c.length>0&&YP.test(c)?(s(false),e(c)):c.length>0&&s(true);return}if(l.backspace||l.delete){n.current=n.current.slice(0,-1),r(n.current);return}d&&!l.ctrl&&!l.meta&&(n.current=n.current+d,r(n.current),s(false));}}),jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Configure modules"})}),jsxs(Box,{paddingX:1,paddingBottom:1,flexDirection:"column",children:[a==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),a==="input"&&jsxs(Box,{flexDirection:"column",gap:1,children:[jsx(Text,{children:"Enter your custom Flow base URL:"}),jsxs(Box,{children:[jsx(Text,{color:"cyan",children:"> "}),jsx(Text,{children:t}),jsx(Text,{color:"cyan",children:"\u2588"})]}),i&&jsx(Text,{color:"red",children:"URL must start with http:// or https://"}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})]})}function eD(e){let a=e.module.platforms[process.platform];return (a?.status==="supported"?a.strategies:[]).map(t=>t.type==="npm"?`npm install -g ${t.package}`:t.type==="homebrew"?`brew install ${t.formula}`:"curl (see docs)").join(" or ")}function rg(e,a){let[o,t]=useState(()=>e.map(u=>({alias:u.module.alias,name:u.module.name,status:"pending"}))),[r,i]=useState(false),s=useCallback((u,p)=>{t(m=>m.map(g=>g.alias===u?{...g,...p}:g));},[]),n=useCallback(async()=>{for(let u of e){let p=eD(u);if(!u.selectedStrategy){let m=p?`No package manager available. Install manually: ${p}`:"No package manager available for this platform";s(u.module.alias,{status:"failed",error:m,manualInstallHint:p||void 0});continue}s(u.module.alias,{status:"installing"});try{let m=await xo(u.module,"onboarding",u.selectedStrategy,a);m.success?s(u.module.alias,{status:"installed",pendingSetupCommand:m.configCheckFailed?"flow-ai-obs init \u2014 run manually to complete setup (required for metrics collection)":m.pendingInteractiveSetup?.join(" ")}):s(u.module.alias,{status:"failed",error:m.error?.message??"Installation failed",manualInstallHint:p});}catch(m){s(u.module.alias,{status:"failed",error:m instanceof Error?m.message:"Unknown error",manualInstallHint:p});}}i(true);},[e,s,a]),d=useMemo(()=>o.filter(u=>u.status==="installed").length,[o]),l=useMemo(()=>o.filter(u=>u.status==="failed").length,[o]),c=useMemo(()=>o.filter(u=>u.status==="skipped").length,[o]);return {modules:o,install:n,isComplete:r,installedCount:d,failedCount:l,skippedCount:c}}U();j();function ig({module:e}){let a=b(e.name);if(e.status==="installing")return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",a," \u2014 Installing..."]})]});if(e.status==="installed"){let o=!!e.pendingSetupCommand;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{children:jsxs(Text,{color:o?"red":"green",children:[o?"\u2717":"\u2713"," ",a]})}),e.pendingSetupCommand&&jsx(Box,{paddingLeft:2,children:jsx(Text,{color:"red",children:b(e.pendingSetupCommand)})})]})}return e.status==="failed"?jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",a]}),e.error&&jsxs(Text,{dimColor:true,children:[" \u2014 ",b(e.error)]})]}),e.manualInstallHint&&jsx(Box,{paddingLeft:2,children:jsxs(Text,{dimColor:true,children:["Install manually: ",b(e.manualInstallHint)]})})]}):e.status==="skipped"?jsx(Box,{children:jsxs(Text,{dimColor:true,children:["- ",a," (not supported on this platform)"]})}):jsx(Box,{children:jsxs(Text,{dimColor:true,children:["\u25CB ",a]})})}function cg({confirmedItems:e,customUrl:a}){let o=y(v=>v.setScreen),t=y(v=>v.setFocus),{modules:r,install:i,isComplete:s,installedCount:n,failedCount:d,skippedCount:l}=rg(e,a),c=r.some(v=>v.pendingSetupCommand),u=useRef(false),p=useRef(false);useEffect(()=>{u.current||(u.current=true,i());},[i]);let m=useCallback(()=>{tt().catch(()=>{}),t("list");let v=le().some(k=>k.name===me);o(v?"main":"claudeMdSuggestion");},[t,o]);useEffect(()=>{if(s&&d===0&&!c&&!p.current){p.current=true;let v=setTimeout(m,1500);return ()=>clearTimeout(v)}},[s,d,c,m]),useInput((v,k)=>{k.return&&m();},{isActive:s});let g=r.filter(v=>v.pendingSetupCommand).length,f=n-g,h=[];return f>0&&h.push(jsxs(Text,{color:"green",children:[f," installed"]},"i")),g>0&&h.push(jsxs(Text,{color:"red",children:[g," needs setup"]},"p")),d>0&&h.push(jsxs(Text,{color:"red",children:[d," failed"]},"f")),l>0&&h.push(jsxs(Text,{dimColor:true,children:[l," skipped"]},"s")),jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:s?"Modules ready":"Setting up modules..."})}),jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:r.map(v=>jsx(ig,{module:v},v.alias))}),s&&jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:h.reduce((v,k,T)=>(T>0&&v.push(jsx(Text,{children:" | "},`sep-${T}`)),v.push(k),v),[])}),jsx(Box,{paddingX:1,children:d>0||c?jsx(Text,{dimColor:true,children:"Press Enter to continue"}):jsx(Text,{dimColor:true,children:"Proceeding..."})})]})]})}function ug(){let[e,a]=useState("loading"),[o,t]=useState([]),[r,i]=useState([]),[s,n]=useState(null),d=y(m=>m.setFocus),l=y(m=>m.setScreen),c=useCallback(m=>{if(Vl(m)){tt().catch(()=>{}),d("list");let f=le().some(h=>h.name===me);l(f?"main":"claudeMdSuggestion");}else t(m),a("selection");},[d,l]);useEffect(()=>{let m=Qm();if(m){c(m);return}ar(ce).then(c).catch(()=>{t([]),a("selection");});},[c]);let u=useCallback(m=>{i(m);let g=m.some(f=>f.module.alias==="metrics");a(g?"customUrl":"installation");},[]),p=useCallback(m=>{n(m),a("installation");},[]);return jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[e==="loading"&&jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Setting up modules..."})}),e==="selection"&&jsx(eg,{probeResults:o,onConfirm:u}),e==="customUrl"&&jsx(ag,{onConfirm:p}),e==="installation"&&jsx(cg,{confirmedItems:r,customUrl:s})]})}U();I();var lD=P("ClaudeMdSuggestion"),uD=[`Install ${me}`,"Skip for now"],pD=["Retry","Skip for now"];function gg(){let e=y(p=>p.setScreen),a=y(p=>p.setFocus),o=q(p=>p.successCount),[t,r]=useState("prompt"),[i,s]=useState(0),n=useRef(0),d=useCallback(()=>{a("list"),e("main");},[a,e]),l=useCallback(()=>{C(w.CLI_CLAUDE_MD_SKIPPED,{interface:"tui"}).catch(()=>{}),d();},[d]),c=useCallback(async()=>{n.current+=1,C(w.CLI_CLAUDE_MD_ACCEPTED,{interface:"tui",attempt:n.current}).catch(()=>{}),r("installing");try{await je(me),r("installed");}catch(p){if(p instanceof Xe){r("installed");return}lD.warn(`Failed to install ${me}: ${p instanceof Error?p.message:p}`),r("error");}},[]),u=t==="error"?pD:uD;return useInput((p,m)=>{if(m.escape){t==="prompt"||t==="error"?l():t==="installed"&&d();return}if(t==="prompt"||t==="error"){m.upArrow&&i>0?s(i-1):m.downArrow&&i<u.length-1?s(i+1):m.return&&(i===0?(s(0),c()):l());return}t==="installed"&&m.return&&d();}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(qt,{}),jsxs(Box,{flexDirection:"column",paddingX:1,gap:1,children:[jsx(Text,{color:"green",bold:true,children:o>0?"\u2713 Starter kit installed!":"\u2713 Setup complete!"}),t==="prompt"&&jsxs(Fragment,{children:[jsxs(Box,{flexDirection:"column",children:[jsx(Text,{bold:true,children:"Personalize your Claude Code"}),jsx(Text,{children:"This plugin helps Claude understand your preferences and work style."})]}),jsx(mg,{options:u,cursorIndex:i}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]}),t==="installing"&&jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" Installing ",me,"..."]})]}),t==="installed"&&jsxs(Fragment,{children:[jsxs(Text,{color:"green",bold:true,children:["\u2713 ",me," installed!"]}),jsxs(Box,{flexDirection:"column",children:[jsx(Text,{children:"Open Claude in a new terminal or in VS Code and type:"}),jsxs(Text,{bold:true,color:"cyan",children:["/",me]})]}),jsx(Text,{children:"Claude will guide you through the rest."}),jsx(Text,{dimColor:true,children:"Press Enter to continue to the catalog..."})]}),t==="error"&&jsxs(Fragment,{children:[jsxs(Text,{color:"red",bold:true,children:["\u2717 Failed to install ",me]}),jsx(mg,{options:u,cursorIndex:i}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]})]})]})}function mg({options:e,cursorIndex:a}){return jsx(Box,{flexDirection:"column",children:e.map((o,t)=>jsxs(Text,{bold:t===a,color:t===a?"cyan":void 0,children:[t===a?"\u203A ":" ",o]},o))})}var hD=promisify(execFile),Js="@ciandt-flow/cli";async function fg(){let e=re;if(Xd.prerelease(e)||process.env.NODE_ENV==="development")return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Js};try{let a=await fetch(`https://registry.npmjs.org/${Js}/latest`);if(!a.ok)throw new Error(`Registry returned ${a.status}`);let t=(await a.json()).version;return {currentVersion:e,latestVersion:t,isOutdated:t!==e,packageName:Js}}catch{return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Js}}}async function Hs(e){try{return await hD(Ya(),["install","-g",e.packageName],{timeout:6e4,shell:process.platform==="win32"}),{success:!0}}catch(a){return {success:false,error:String(a)}}}async function bD(e){let a=ta(e.alias);if(!a?.installMethod)return a?.installedVersion??null;try{let t=await ja(a.installMethod).getInstalledVersion(e);return t&&t!==a.installedVersion&&await Pa({...a,installedVersion:t,lastChecked:new Date().toISOString()}),t??a.installedVersion}catch{return a.installedVersion}}async function hg(e){let a=await bD(e),o=null,t=AbortSignal.timeout(3e4);try{if(e.versionCheck.type==="npm-registry"){let i=await fetch(`https://registry.npmjs.org/${e.versionCheck.package}/latest`,{signal:t});if(!i.ok)throw new Error(`Registry returned ${i.status}`);o=(await i.json()).version;}else if(e.versionCheck.type==="github-releases"){let i=await fetch(`https://api.github.com/repos/${e.versionCheck.repo}/releases/latest`,{signal:t});if(!i.ok)throw new Error(`GitHub returned ${i.status}`);o=(await i.json()).tag_name.replace(/^v/,"");}}catch{}let r=a!==null&&o!==null&&a!==o;return {moduleAlias:e.alias,currentVersion:a,latestVersion:o,isOutdated:r}}async function bg(e,a){let o=ta(e.alias);if(!o?.installMethod)return {success:false,error:"Unknown install method"};let r=await ja(o.installMethod).update(e,a.currentVersion??"");return r.success?(await Pa({...o,installedVersion:r.version??o.installedVersion,lastChecked:new Date().toISOString()}),{success:true,newVersion:r.version}):{success:false,error:r.error?.message}}function vg(e){let o=ta(e.alias)?.installMethod,t=e.platforms[process.platform];if(t?.status==="supported"){if(o==="npm"){let r=t.strategies.find(i=>i.type==="npm");if(r?.type==="npm")return `npm install -g ${r.package}`}if(o==="homebrew"){let r=t.strategies.find(i=>i.type==="homebrew");if(r?.type==="homebrew")return `brew upgrade ${r.formula}`}}}function yg(){let[e,a]=useState({outcome:"running",items:[{id:"cli",label:"@ciandt-flow/cli",status:"pending"},...ce.map(t=>({id:t.alias,label:t.name,status:"pending"}))]}),o=useCallback((t,r)=>{a(i=>({...i,items:i.items.map(s=>s.id===t?{...s,...r}:s)}));},[]);return useEffect(()=>{async function t(){try{let[r,i,s]=await Promise.all([fg(),ar(ce),Promise.all(ce.map(d=>hg(d)))]);if(Bs(),r.isOutdated){o("cli",{status:"updating",detail:`v${r.currentVersion} \u2192 v${r.latestVersion}`}),(await Hs(r)).success?(o("cli",{status:"updated",detail:`v${r.currentVersion} \u2192 v${r.latestVersion}`}),a(l=>({...l,outcome:"cli-updated"}))):(o("cli",{status:"error",detail:`v${r.currentVersion} \u2192 v${r.latestVersion}`,manualCommand:`npm install -g ${r.packageName}`}),a(l=>({...l,outcome:"cli-update-failed"})));return}o("cli",{status:"ok",detail:`v${r.currentVersion}`});let n=i.some(d=>!d.alreadyInstalled);for(let d of i)d.alreadyInstalled||o(d.module.alias,{status:"missing"});if(n){a(d=>({...d,outcome:"module-missing"}));return}for(let d of s){let l=ce.find(u=>u.alias===d.moduleAlias);if(!l)continue;if(!d.isOutdated){o(d.moduleAlias,{status:"ok",detail:d.currentVersion?`v${d.currentVersion}`:void 0});continue}o(d.moduleAlias,{status:"updating",detail:`v${d.currentVersion} \u2192 v${d.latestVersion}`});let c=await bg(l,d);c.success?o(d.moduleAlias,{status:"updated",detail:`v${c.newVersion}`}):o(d.moduleAlias,{status:"error",detail:`v${d.currentVersion} \u2192 v${d.latestVersion}`,manualCommand:vg(l)});}a(d=>({...d,items:d.items.map(l=>l.status==="pending"?{...l,status:"ok"}:l)})),await tt(),a(d=>({...d,outcome:"done"}));}catch{await tt(),a(r=>({...r,outcome:"done"}));}}t();},[o]),e}U();function wD({item:e}){return e.status==="pending"||e.status==="updating"?jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",e.label,e.detail?` ${e.detail}...`:""]})]}):e.status==="ok"||e.status==="updated"?jsxs(Box,{children:[jsxs(Text,{color:"green",children:["\u2713 ",e.label]}),e.detail&&jsxs(Text,{dimColor:true,children:[" ",e.detail]})]}):e.status==="missing"?jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",e.label]}),jsx(Text,{dimColor:true,children:" \u2014 not installed"})]}):jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",e.label]}),e.detail&&jsxs(Text,{dimColor:true,children:[" ",e.detail]})]}),e.manualCommand&&jsx(Box,{paddingLeft:2,children:jsxs(Text,{dimColor:true,children:["To update manually: ",e.manualCommand]})})]})}function SD({outcome:e}){return e==="done"?jsx(Text,{color:"green",children:"All good!"}):e==="cli-updated"||e==="cli-update-failed"?jsx(Text,{color:"yellow",children:"Restart the CLI to use the new version."}):null}function kg(){let{outcome:e,items:a}=yg(),o=y(r=>r.setScreen),t=y(r=>r.setFocus);return useEffect(()=>{if(e==="done"){let r=setTimeout(()=>{let i=le().some(s=>s.name===me);o(i?"main":"claudeMdSuggestion"),t("list");},1500);return ()=>clearTimeout(r)}if(e==="module-missing"){let r=setTimeout(()=>{o("moduleSetup"),t("moduleSetup");},500);return ()=>clearTimeout(r)}},[e,o,t]),jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsx(Box,{marginBottom:1,children:jsx(Text,{bold:true,children:"Checking environment..."})}),jsx(Box,{flexDirection:"column",gap:0,children:a.map(r=>jsx(wD,{item:r},r.id))}),e!=="running"&&jsx(Box,{marginTop:1,children:jsx(SD,{outcome:e})})]})}Re();xt();I();An();var xD={debug:"gray",info:"cyan",warn:"yellow",error:"red"},Pg=10;function Dg(){let[e,a]=useState(Rn());useEffect(()=>ll(()=>{a([...Rn()]);}),[]);let o=e.slice(-Pg);return jsxs(Box,{flexDirection:"column",borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsxs(Text,{color:"cyan",bold:true,children:["Debug Log (last ",Pg,") \u2014 press Ctrl+D to close"]}),o.length===0?jsx(Text,{dimColor:true,children:"No log entries yet"}):o.map((t,r)=>jsxs(Text,{color:xD[t.level],children:["[",t.level.toUpperCase(),"] [",t.module,"] ",t.message]},r))]})}var MD=P("app"),qD={auth:ru,starterKitSetup:zm,moduleSetup:ug,claudeMdSuggestion:gg,verify:kg,main:Im};function Cg(){let{setScreen:e,setFocus:a}=y.getState();e("auth"),a("auth");}function Vi(e){let{setScreen:a,setFocus:o}=y.getState();!e.starterKit||e.starterKit.trim()===""?(a("starterKitSetup"),o("starterKitList")):(a("verify"),o("verify"));}function Rg(){C(w.CLI_SESSION_STARTED,{cli_version:re,os:process.platform,node_version:process.version,duration_ms:Do(),interface:"tui"}).catch(()=>{});}async function xg(){let e=await Y();if(e&&Hl()&&await Po()){e.customUrl&&La(e.customUrl);let{clientSecret:t,...r}=e;oa.getState().setCredentials(r),Rg(),Vi(e);return}if(!e){Cg();return}try{e.customUrl&&La(e.customUrl),await Oa();}catch(t){MD.debug(`Token validation failed: ${String(t)}`),Cg();return}Rg();let{clientSecret:a,...o}=e;oa.getState().setCredentials(o),Vi(e);}function Eg(){let{columns:e,rows:a}=useWindowSize(),o=y(n=>n.screen),t=qD[o],{pendingExit:r}=Ol(),i=y(n=>n.debugPanelOpen),s=!!process.env.DEBUG;return useInput((n,d)=>{if(s&&d.ctrl&&n==="d"){let l=y.getState().debugPanelOpen;y.getState().setDebugPanelOpen(!l);}}),t?jsxs(Box,{flexDirection:"column",width:e,height:a,children:[jsx(t,{}),s&&i&&jsx(Dg,{}),r&&jsx(Box,{paddingX:1,children:jsx(Text,{color:"yellow",children:"Press Ctrl+C again to quit"})})]}):jsxs(Text,{color:"red",children:["Unknown screen: ",o]})}Re();Ti();j();U();I();mr();Re();async function Pc(e,a={}){let o=Oi({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant,customUrl:e.customUrl,starterKit:e.starterKit},a);return Ni(o),await ko(e),{jwt:o.jwt,anthropicBaseUrl:o.anthropicBaseUrl,previousToken:o.previousToken,previousBaseUrl:o.previousBaseUrl,hadExistingFile:o.hadExistingFile}}var Ta=P("auth");function Tg(){Ve.clearFallbackFile(),Ai();}var LD=3,Ig=3,Mg=` \u2139 The data collected during setup is used solely to improve
121
+ [y/N] `))return Is.debug(`[${e}] Removal cancelled by user`),P("Operation cancelled."),0}let t=a.silent?void 0:yc({text:`Removing MCP "${v(e)}"...`}).start();try{let r=await qe(o);return t?.stop(),r.exitCode!==0?(_r(a,{name:e,action:"remove",message:r.stderr||"Command failed",exitCode:r.exitCode}),!a.silent&&a.verbose&&r.stdout&&P(`stdout: ${r.stdout}`),1):(fm(a,{name:e,actionPastTense:"removed",command:o,durationMs:r.duration_ms,stdout:r.stdout}),0)}catch(r){return t?.stop(),_r(a,{name:e,action:"remove",message:$(r)}),1}}I();function vm({selectedItem:e,selectedCatalogItem:a,items:o,closeMenu:t,clampIndex:r,notify:i}){let s=k("pluginHandlers"),n=useRef(0),d=y(A=>A.setLoading),l=y(A=>A.setDownloadProgress),{install:c,uninstall:u,toggle:m,update:p}=mm(),g=async(A,T,F)=>{d(true,A),t();try{await T(),r(o.length),i(F,"success");}catch(O){let oe=O instanceof Error?O.message:"Something went wrong";s.error(`[withLoading] ${A} failed: ${oe}`),i(oe,"error");}finally{d(false);}};return {handleInstall:(A,T)=>{e&&a&&(n.current=0,g(`Installing ${e.name}...`,()=>c(a,{scope:A,...T!==void 0?{providerId:T}:{},onDownloadProgress:(F,O)=>{let oe=Date.now();(oe-n.current>100||F>=O)&&(n.current=oe,l(F,O));}}),"\u2713 Installed successfully"));},handleUninstall:A=>{e&&g(`Uninstalling ${e.name}...`,()=>u(e.name,A),"\u2713 Uninstalled");},handleToggleStatus:A=>{if(!e)return;let T=e.status==="enabled";g(T?`Disabling ${e.name}...`:`Enabling ${e.name}...`,()=>m(e.name,A),T?"\u2713 Disabled":"\u2713 Enabled");},handleUpdate:()=>{if(!e)return;let A=a?` to v${a.version}`:"";(async()=>{d(true,`Updating ${e.name}${A}...`),t();try{await p(e.name),r(o.length),i(`\u2713 Updated ${e.name}${A}`,"success");}catch(F){if(F instanceof Io)i(F.message,"info");else {let O=F instanceof Error?F.message:"Something went wrong";s.error(`[handleUpdate] ${e.name} failed: ${O}`),i(O,"error");}}finally{d(false);}})();},handleBatchUpdate:A=>{if(A.length===0)return;let T=A.length;(async()=>{d(true,`Updating ${T} plugin${T>1?"s":""}...`),t();try{let O=[];for(let J of A)O.push(await p(J.name).then(()=>({status:"fulfilled",value:void 0}),ae=>({status:"rejected",reason:ae})));let oe=O.filter(J=>J.status==="fulfilled").length,x=O.map((J,ae)=>J.status==="rejected"?A[ae].name:null).filter(J=>J!==null);r(o.length),x.length===0?i(`\u2713 Updated ${oe}/${T} plugin${T>1?"s":""}`,"success"):(s.error(`[handleBatchUpdate] failed: ${x.join(", ")}`),i(`Updated ${oe}/${T}; failed: ${x.join(", ")}`,oe>0?"info":"error"));}finally{d(false);}})();},handleMcpConfigUninstall:A=>{e&&g(`Removing MCP ${e.name}...`,async()=>{let T=Vd(e.name,A),F=await qe(T);if(F.exitCode!==0)throw new Error(F.stderr||"MCP removal failed");ye.getState().loadFromDisk();},"\u2713 MCP removed");}}}xr();I();var Xr=k("api:bundle"),Zt=class extends Error{constructor(a){super(`Bundle '${a}' not found in your tenant. Verify the name with whoever shared the command.`),this.name="BundleNotFoundError";}},Kr=class extends Error{constructor(){super("The server encountered an error while fetching the bundle. Please try again later."),this.name="BundleServerError";}},hP=/^[a-zA-Z0-9_-]{1,128}$/;async function km(e,a){if(e instanceof HTTPError){let o=e.response.status;throw Xr.error(`HTTP error fetching bundle '${a}' [status=${o}]`),o===StatusCodes.NOT_FOUND?new Zt(a):o===StatusCodes.INTERNAL_SERVER_ERROR?new Kr:new Error(`Server error (${o}) \u2014 please try again later.`)}throw Xr.error(`Unexpected error fetching bundle '${a}': ${e instanceof Error?e.message:String(e)}`),e}async function Pm(e){if(!hP.test(e))throw new Error("Invalid bundle identifier format.");let a=encodeURIComponent(e);Xr.debug(`Fetching bundle by flowId "${e}"`);try{return await Ua().get(`v1/use-cases/${a}`).json()}catch(o){return km(o,e)}}async function Ts(e){let a=encodeURIComponent(e);Xr.debug(`Fetching bundle by name "${e}"`);let o;try{o=await Ua().get(`v1/use-cases/by-name/${a}`).json(),Xr.debug(`API returned ${o.length} result(s) for "${e}"`);}catch(t){return km(t,e)}if(o.length===0)throw new Zt(e);return o[0]}I();var bP=k("tui:bundle-flow");function Dm({closeMenu:e,notify:a}){let o=y(n=>n.bundleInstallFlow);return {handleBundleInstallStart:(n,d)=>{let{setLoading:l,setBundleInstallFlow:c}=y.getState(),u=d?.trim();bP.debug(`Starting bundle install: itemName="${n}" flowId="${u??"none"}"`),l(true,"Loading bundle..."),(u?Pm(u):Ts(n)).then(p=>{l(false),y.getState().actionMenuOpen&&c({phase:"detail",bundle:p});}).catch(p=>{l(false),a(p instanceof Error?p.message:"Failed to load bundle","error");});},handleBundleDetailConfirm:()=>{if(!o||o.phase!=="detail")return;let{setBundleInstallFlow:n,setFocus:d}=y.getState();n({phase:"installing",bundle:o.bundle}),d("bundleInstallProgress");},handleBundleDetailBack:()=>{let{setBundleInstallFlow:n}=y.getState();n(null),e();},handleBundleInstallComplete:n=>{y.getState().setBundleInstallFlow(null),e(),ye.getState().loadFromDisk(),a(`\u2713 Installed ${n.installed} of ${n.total} artifacts`,"success");}}}j();U();var $r=["local","project","user"],vP=new Set(["--transport","--scope","-s"]);function wm(e){let a=e.split(/\s+/).filter(Boolean),o=a.indexOf("add");if(o===-1)return null;let t=o+1;for(;t<a.length;){let r=a[t];if(vP.has(r))t+=2;else if(r.startsWith("-"))t+=1;else return r.replace(/^["']|["']$/g,"")}return null}function pt(e,a){return a?`${e}::${a}`:e}function Qd(e){return e===ue?dr:ft}function Sm(e){return {name:v(e.name),version:e.version?v(e.version):e.version,description:e.description?v(e.description):e.description,authorName:e.author?.name?v(e.author.name):e.author?.name,updateAvailable:e.updateAvailable,type:e.type??"bundle",origin:e.origin??dr,flowId:e.flowId}}function _d(e,a){let o=Qd(e.marketplace);return {name:v(e.name),version:e.version?v(e.version):e.version,description:e.description?v(e.description):e.description,authorName:e.author?.name?v(e.author.name):e.author?.name,status:e.status,scope:e.scope,marketplace:e.marketplace,updateAvailable:e.updateAvailable,installedAt:e.installedAt,type:a?.type??e.type??"bundle",origin:a?.origin??o}}function Cm(e){let a=new Map;for(let o of e){if(!o.scope)continue;let t=a.get(o.scope)??[];t.push(o),a.set(o.scope,t);}return $r.filter(o=>a.has(o)).map(o=>({scope:o,label:Ka[o].label,pathHint:Ka[o].pathHint,items:a.get(o)??[]}))}function Rm(e){let a=o=>{if(!o)return 1/0;let t=$r.indexOf(o);return t===-1?1/0:t};return [...e].sort((o,t)=>a(o.scope)-a(t.scope))}function Am({catalog:e,installedItems:a,activeTab:o,catalogFilters:t,searchQuery:r}){let i=useMemo(()=>new Set(a.map(g=>pt(g.name,g.author?.name))),[a]),s=useMemo(()=>new Set(a.filter(g=>g.type==="mcp").map(g=>g.name.toLowerCase())),[a]),n=useMemo(()=>{let g=new Map(e.map(h=>[pt(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return a.map(h=>{let b=g.get(pt(h.name,h.author?.name))??f.get(h.name),D=b?.version,q=!!D&&!!h.version&&ze(h.version,D);return {...h,updateAvailable:q,catalogItem:b}})},[a,e]),d=useMemo(()=>o==="discover"?e.filter(g=>{if(i.has(pt(g.name,g.author?.name)))return false;if(g.type==="mcp"){let f=g.installCommand?wm(g.installCommand)?.toLowerCase():null;if(s.has(g.name.toLowerCase())||f&&s.has(f))return false}return true}).map(g=>Sm(g)):o==="updates"?n.filter(g=>g.updateAvailable).map(g=>_d(g,g.catalogItem)):n.map(g=>_d(g,g.catalogItem)),[o,e,i,s,n]),l=useMemo(()=>d.filter(g=>{let f=g.type??"bundle";if(!t.types.has(f))return false;let h=g.origin??"internal";return t.origins.has(h)}),[d,t]),c=useMemo(()=>{let{types:g}=t;if(g.size===1){if(g.has("skill"))return "skills";if(g.has("mcp"))return "MCPs";if(g.has("bundle"))return "bundles"}return "items"},[t]),u=useMemo(()=>o==="installed"?r?`No ${c} found for '${r}' \u2014 explore the Discover tab!`:`No ${c} installed \u2014 explore the Discover tab!`:o==="updates"?r?`No ${c} found for '${r}' \u2014 all up to date!`:"All up to date \u2014 nothing to update":r?`No ${c} found for '${r}'`:`No ${c} available in the catalog`,[o,r,c]),m=useMemo(()=>{let g=new Map(e.map(h=>[pt(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return h=>h?g.get(pt(h.name,h.authorName))??f.get(h.name)??null:null},[e]),p=useMemo(()=>n.filter(g=>g.updateAvailable).length,[n]);return {items:l,emptyMessage:u,getSelectedCatalogItem:m,outdatedCount:p}}function Xd(){let[e,a]=useState([]),[o,t]=useState(true),[r,i]=useState(null),[s,n]=useState(null),d=useRef(false),l=y(u=>u.catalogVersion),c=useCallback(async()=>{t(true),i(null),n(null);try{let{items:u,failures:m}=await ep();if(a(u),m.length>0){let p=m.map(g=>g.adapterName).join(", ");n(`Some catalogs failed to load: ${p}`);}d.current||(d.current=!0,C(w.CLI_CATALOG_VIEWED,{interface:"tui",filter_type:"all",result_count:u.length}).catch(()=>{}));}catch(u){i(u instanceof Error?u:new Error(String(u))),a([]);}finally{t(false);}},[]);return useEffect(()=>{c();},[c,l]),{catalog:e,isLoading:o,error:r,partialError:s,refetch:c}}function xm(){return {items:ye(a=>a.installedItems)}}I();var wP=k("catalog");function Im(){let e=y(X=>X.bundleInstallFlow),a=y(X=>X.activeTab),o=y(X=>X.notification),t=y(X=>X.loading),r=y(X=>X.loadingMessage),i=y(X=>X.downloadProgress),s=y(X=>X.downloadTotal),n=y(X=>X.catalogError),d=y(X=>X.setCatalogError),l=y(X=>X.catalogFilters),c=_e(X=>X.query),{catalog:u,isLoading:m,error:p,refetch:g}=Xd(),{items:f}=xm(),h=ye(X=>X.loadFromDisk),{items:b,emptyMessage:D,getSelectedCatalogItem:q,outdatedCount:L}=Am({catalog:u,installedItems:f,activeTab:a,catalogFilters:l,searchQuery:c}),{actionMenuOpen:A,closeMenu:T,selectedIndex:F,clampIndex:O,filteredItems:oe}=dm({listLength:b.length}),x=oe(b),J=useMemo(()=>a!=="installed"&&a!=="updates"?x:Rm(x),[a,x]),ae=useMemo(()=>a==="installed"||a==="updates"?Cm(J):[],[a,J]),z=J[F]??null,W=useMemo(()=>q(z),[q,z]),{notify:_}=lm(),{handleInstall:E,handleUninstall:B,handleToggleStatus:V,handleUpdate:Fe,handleBatchUpdate:si,handleMcpConfigUninstall:hh}=vm({selectedItem:z,selectedCatalogItem:W,items:b,closeMenu:T,clampIndex:O,notify:_}),{handleBundleInstallStart:bh,handleBundleDetailConfirm:vh,handleBundleDetailBack:yh,handleBundleInstallComplete:kh}=Dm({closeMenu:T,notify:_}),Ph=useCallback(()=>si(J),[si,J]);return useEffect(()=>{h();},[]),useEffect(()=>{O(J.length);},[J.length,O]),useEffect(()=>{p&&(wP.error(`[catalog] ${p instanceof Error?p.message:String(p)}`),d("Failed to load catalog"));},[p]),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(qt,{}),jsx(cu,{outdatedCount:L}),a==="marketplaces"&&Co()?jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(rm,{})}):jsx(Au,{filteredItems:J,groups:ae,emptyMessage:D,onBatchUpdate:Ph}),(t||m)&&jsxs(Fragment,{children:[jsx($i,{message:t?r:"Loading catalog..."}),t&&s>0&&i>0&&jsx(Box,{paddingLeft:2,children:jsx(Zi,{received:i,total:s})})]}),n&&!m&&a==="discover"&&jsx(es,{message:n,onRetry:()=>{d(null),g();},onBack:()=>d(null)}),o&&jsx(xu,{message:o.message,type:o.type}),A&&z&&(a==="discover"?W?.type==="bundle"?e?.phase==="installing"?jsx(Jp,{bundle:e.bundle,onComplete:kh}):jsx(Mp,{itemName:z.name,bundle:e?.phase==="detail"?e.bundle:void 0,onInstall:()=>bh(z.name,z.flowId),onConfirm:vh,onClose:e?.phase==="detail"?yh:T}):jsx(Ip,{itemName:z.name,itemType:W?.type,onInstall:E,onClose:T}):z.type==="mcp"?jsx(Gp,{itemName:z.name,itemScope:z.scope??"user",onUninstall:hh,onClose:T}):jsx(Fp,{itemName:z.name,itemScope:z.scope??"user",itemStatus:z.status??"enabled",updateAvailable:z.updateAvailable??false,catalogVersion:W?.version,onUninstall:B,onToggleStatus:X=>V(X),onUpdate:Fe,onClose:T})),jsx(Ki,{})]})}var M=create((e,a)=>({starterKits:[],selectedStarterKitIndex:0,selectedStarterKit:null,plugins:[],pluginCursorIndex:0,step:"starterKitList",isLoadingStarterKits:false,starterKitsError:null,successCount:0,failedCount:0,summaryActionIndex:0,setStarterKits:o=>e({starterKits:o}),setSelectedStarterKitIndex:o=>e({selectedStarterKitIndex:o}),selectStarterKit:o=>{let t=new Set(ye.getState().installedItems.map(r=>r.name));e({selectedStarterKit:o,plugins:o.plugins.map(r=>({name:r,selected:true,status:t.has(r)?"success":"pending",installed:t.has(r)})),pluginCursorIndex:0,step:"starterKitDetail"});},setPluginCursorIndex:o=>e({pluginCursorIndex:o}),setStep:o=>e({step:o}),setPluginStatus:(o,t,r)=>{let i=a().plugins.map(s=>s.name===o?{...s,status:t,error:r}:s);e({plugins:i});},setPluginDownloadProgress:(o,t,r)=>{let i=a().plugins.map(s=>s.name===o?{...s,downloadProgress:t,downloadTotal:r}:s);e({plugins:i});},setIsLoadingStarterKits:o=>e({isLoadingStarterKits:o}),setStarterKitsError:o=>e({starterKitsError:o}),setSummaryActionIndex:o=>e({summaryActionIndex:o}),computeSummary:()=>{let t=a().plugins.filter(r=>r.selected);e({successCount:t.filter(r=>r.status==="success").length,failedCount:t.filter(r=>r.status==="failed").length});},resetForRetry:()=>{let o=a().plugins.map(t=>t.status==="failed"?{...t,status:"pending",error:void 0}:t);e({plugins:o,step:"installing"});},goBackToList:()=>e({selectedStarterKit:null,plugins:[],pluginCursorIndex:0,step:"starterKitList"})}));Re();var xP=3;function Mm(){let e=M(c=>c.setStarterKits),a=M(c=>c.setIsLoadingStarterKits),o=M(c=>c.setStarterKitsError),t=M(c=>c.setPluginStatus),r=M(c=>c.setPluginDownloadProgress),i=M(c=>c.setStep),s=M(c=>c.computeSummary),n=useCallback(async()=>{a(true),o(null);try{let c=await ns();e(c);}catch(c){o(c instanceof Error?c.message:String(c));}finally{a(false);}},[a,o,e]);useEffect(()=>{ye.getState().loadFromDisk(),n();},[n]);let d=useRef(0),l=useCallback(async()=>{let c=M.getState().plugins.filter(m=>m.selected&&m.status==="pending");for(let m of c){t(m.name,"installing"),d.current=0;let p="",g=false;for(let f=1;f<=xP;f++)try{await je(m.name,{onDownloadProgress:(h,b)=>{let D=Date.now();(D-d.current>100||h>=b)&&(d.current=D,r(m.name,h,b));}}),t(m.name,"success"),g=!0;break}catch(h){if(h instanceof Xe){t(m.name,"success"),g=true;break}p=h instanceof Error?h.message:"Unknown error";}g||(t(m.name,"failed",p),C(w.CLI_TOOL_INSTALL_FAILED,{tool_id:m.name,tool_type:"skill",source:"internal",error_code:"install_failed",error_message:p,interface:Z().interfaceType}).catch(()=>{}));}let u=$o();Ko("summary_review"),C(w.CLI_STEP_COMPLETED,{step:"tool_installation",duration_ms:u}).catch(()=>{}),ye.getState().loadFromDisk(),s(),i("summary");},[t,r,s,i]);return {loadStarterKits:n,installSelected:l}}var Yr={cursorDelta:0,confirm:false,back:false};function qm(e,a){return a.upArrow?{...Yr,cursorDelta:-1}:a.downArrow?{...Yr,cursorDelta:1}:a.escape?{...Yr,back:true}:a.return?{...Yr,confirm:true}:Yr}var EP={cursorDelta:0,select:false};function Lm(e,a){return a.upArrow?{cursorDelta:-1,select:false}:a.downArrow?{cursorDelta:1,select:false}:a.return?{cursorDelta:0,select:true}:EP}j();var Fm=vv.memo(function({starterKit:a,isSelected:o}){return jsxs(Box,{flexDirection:"column",paddingBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u203A ":"\u25CB "}),jsx(Text,{bold:o,color:o?"cyan":"white",children:v(a.name)}),jsxs(Text,{dimColor:true,children:[" \xB7 ",a.plugins.length," ",a.plugins.length===1?"plugin":"plugins"]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:v(a.description)})})]})});var oc=5;function Om({onRetry:e}){let a=M(c=>c.starterKits),o=M(c=>c.selectedStarterKitIndex),t=M(c=>c.isLoadingStarterKits),r=M(c=>c.starterKitsError);if(t)return jsx($i,{message:"Loading Starter Kits..."});if(r)return jsx(es,{message:r,onRetry:e,onBack:e});if(a.length===0)return jsx(Lt,{message:"No Starter Kits available."});let i=Math.max(0,o-Math.floor(oc/2)),s=Math.min(a.length,i+oc);s===a.length&&(i=Math.max(0,s-oc));let n=a.slice(i,s),d=i,l=a.length-s;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Select a Starter Kit to get started"})}),d>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2191 ",d," more above"]})}),n.map((c,u)=>jsx(Fm,{starterKit:c,isSelected:i+u===o},c.slug)),l>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",l," more below"]})})]})}j();var Gm=vv.memo(function({plugin:a,isCursor:o}){return jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u203A ":" "}),jsx(Text,{color:"cyan",children:"\u2022"}),jsxs(Text,{bold:o,color:o?"cyan":"white",children:[" ",v(a.name)]}),a.installed&&jsx(Text,{color:"green",children:" (installed)"})]})});j();var ic=8;function Bm(){let e=M(c=>c.selectedStarterKit),a=M(c=>c.plugins),o=M(c=>c.pluginCursorIndex),t=useRef(false);if(useEffect(()=>{e&&!t.current&&(t.current=true,C(w.CLI_KIT_DISPLAYED,{bundle_slug:e.slug,tool_count:a.length}).catch(()=>{}));},[e,a.length]),!e)return jsx(Text,{dimColor:true,children:"No Starter Kit selected."});let r=a.filter(c=>c.installed).length,i=Math.max(0,o-Math.floor(ic/2)),s=Math.min(a.length,i+ic);s===a.length&&(i=Math.max(0,s-ic));let n=a.slice(i,s),d=i,l=a.length-s;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:[jsx(Text,{bold:true,color:"cyan",children:v(e.name)}),jsx(Text,{dimColor:true,children:v(e.description)})]}),jsx(Box,{paddingX:1,paddingBottom:1,children:jsxs(Text,{children:[a.length," plugins to install",r>0&&` \xB7 ${r} already installed`]})}),d>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2191 ",d," more above"]})}),n.map((c,u)=>jsx(Gm,{plugin:c,isCursor:i+u===o},c.name)),l>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",l," more below"]})})]})}j();var GP=["Retry failed","Continue anyway"];function jm({name:e,status:a,error:o,downloadProgress:t,downloadTotal:r}){let i=v(e);return a==="installing"?jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",i]})]}),r!==void 0&&r>0&&t!==void 0&&t>0&&jsx(Box,{paddingLeft:2,children:jsx(Zi,{received:t,total:r})})]}):a==="success"?jsx(Box,{children:jsxs(Text,{color:"green",children:["\u2713 ",i]})}):a==="failed"?jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",i]}),o&&jsxs(Text,{dimColor:true,children:[" \u2014 ",v(o)]})]}):jsx(Box,{children:jsxs(Text,{dimColor:true,children:["\u25CB ",i]})})}function Um({onComplete:e,onRetry:a}){let o=M(l=>l.plugins),t=M(l=>l.step),r=M(l=>l.successCount),i=M(l=>l.failedCount),s=M(l=>l.summaryActionIndex),n=o.filter(l=>l.selected),d=useRef(false);return useEffect(()=>{if(t==="summary"&&i===0&&!d.current){d.current=true;let l=setTimeout(e,1500);return ()=>clearTimeout(l)}},[t,i,e]),t==="installing"?jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Installing plugins..."})}),jsx(Box,{flexDirection:"column",paddingX:1,children:n.map(l=>jsx(jm,{name:l.name,status:l.status,error:l.error,downloadProgress:l.downloadProgress,downloadTotal:l.downloadTotal},l.name))})]}):jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Installation Complete"})}),jsxs(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:[r>0&&jsxs(Text,{color:"green",children:["\u2713 ",r," ",r===1?"plugin":"plugins"," installed successfully"]}),i>0&&jsxs(Text,{color:"red",children:["\u2717 ",i," ",i===1?"plugin":"plugins"," failed"]})]}),i>0&&jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:n.filter(l=>l.status==="failed").map(l=>jsx(jm,{name:l.name,status:l.status,error:l.error},l.name))}),i>0&&jsx(Box,{flexDirection:"column",paddingX:1,children:GP.map((l,c)=>jsx(Box,{children:jsxs(Text,{bold:c===s,color:c===s?"cyan":void 0,children:[c===s?"\u203A ":" ",l]})},l))}),i===0&&jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:"Proceeding to main screen..."})})]})}function zm(){let e=M(x=>x.step),a=M(x=>x.starterKits),o=M(x=>x.selectedStarterKitIndex),t=M(x=>x.setSelectedStarterKitIndex),r=M(x=>x.selectStarterKit),i=M(x=>x.plugins),s=M(x=>x.pluginCursorIndex),n=M(x=>x.setPluginCursorIndex),d=M(x=>x.setStep),l=M(x=>x.summaryActionIndex),c=M(x=>x.setSummaryActionIndex),u=M(x=>x.failedCount),m=M(x=>x.resetForRetry),p=M(x=>x.goBackToList),g=y(x=>x.setScreen),f=y(x=>x.setFocus),h=y(x=>x.focus),b=oa(x=>x.setJustAuthenticated),D=oa(x=>x.justAuthenticated),{loadStarterKits:q,installSelected:L}=Mm(),A=useRef(false);useEffect(()=>{e==="starterKitList"?(f("starterKitList"),A.current||(A.current=true,Ko("bundle_selection"))):f(e==="starterKitDetail"?"starterKitDetail":"installProgress");},[e,f]);let T=useCallback(async()=>{let x=M.getState().selectedStarterKit;if(x){let ae=await Y();ae&&await ko({...ae,starterKit:x.slug});}C(w.CLI_STEP_COMPLETED,{step:"summary_review",duration_ms:$o()}).catch(()=>{});let{successCount:J}=M.getState();C(w.CLI_ONBOARDING_COMPLETED,{duration_ms:Do(),tools_installed_count:J}).catch(()=>{}),b(false),f("verify"),g("verify");},[b,f,g]),F=useCallback(()=>{m(),L();},[m,L]),O=useCallback(()=>{q();},[q]),oe=useCallback(()=>{f("verify"),g("verify");},[f,g]);return useInput((x,J)=>{if(J.escape)qi("esc"),oe();else if(J.upArrow&&o>0)t(o-1);else if(J.downArrow&&o<a.length-1)t(o+1);else if(J.return&&a.length>0){let ae=$o();r(a[o]),Ko("kit_display"),C(w.CLI_STEP_COMPLETED,{step:"bundle_selection",duration_ms:ae}).catch(()=>{});}},{isActive:h==="starterKitList"}),useInput((x,J)=>{let ae=qm(x,J);if(ae.cursorDelta!==0){let z=s+ae.cursorDelta;z>=0&&z<i.length&&n(z);}if(ae.confirm){let z=M.getState().selectedStarterKit;z&&(async()=>(await Y())?.starterKit!==z.slug&&C(w.CLI_KIT_ACCEPTED,{bundle_slug:z.slug}).catch(()=>{}))();let W=$o();Ko("kit_confirmation"),C(w.CLI_STEP_COMPLETED,{step:"kit_display",duration_ms:W}).catch(()=>{});let _=$o();Ko("tool_installation"),C(w.CLI_STEP_COMPLETED,{step:"kit_confirmation",duration_ms:_}).catch(()=>{}),d("installing"),L();}if(ae.back){let z=M.getState().selectedStarterKit;z&&C(w.CLI_KIT_REJECTED,{bundle_slug:z.slug}).catch(()=>{}),p();}},{isActive:h==="starterKitDetail"}),useInput((x,J)=>{if(u===0)return;let ae=Lm(x,J);if(ae.cursorDelta!==0){let z=l+ae.cursorDelta;z>=0&&z<=1&&c(z);}ae.select&&(l===0?F():T());},{isActive:h==="installProgress"&&e==="summary"}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(qt,{}),jsxs(Box,{flexDirection:"column",paddingX:1,marginBottom:1,children:[jsx(Text,{dimColor:true,children:"The data collected during setup is used solely to improve"}),jsx(Text,{dimColor:true,children:"Flow's internal tools and will not be shared externally."}),!D&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"yellow",children:"Welcome back! We noticed your Starter Kit is not set up yet. Choose a Starter Kit below to get your recommended tools."})})]}),jsxs(Box,{flexDirection:"column",flexGrow:1,children:[e==="starterKitList"&&jsx(Om,{onRetry:O}),e==="starterKitDetail"&&jsx(Bm,{}),(e==="installing"||e==="summary")&&jsx(Um,{onComplete:T,onRetry:F})]}),jsx(Ki,{})]})}U();var Hm=null;function Vm(){return Hm}async function Bs(){let a=ot().filter(o=>o.installedVersion===null&&o.installMethod===null);for(let o of a){let t=de.find(s=>s.alias===o.alias);if(!t)continue;let{installedVersion:r,installMethod:i}=await Qm(t);(r||i)&&await ka({...o,installedVersion:r,installMethod:i});}}async function Qm(e){let a=e.platforms[process.platform];if(a?.status!=="supported")return {installedVersion:null,installMethod:null};for(let o of a.strategies)if(o.type!=="curl")try{let r=await ja(o.type).getInstalledVersion(e);if(r)return {installedVersion:r,installMethod:o.type}}catch{}return {installedVersion:null,installMethod:null}}async function ar(e){let a=await Promise.all(e.map(o=>UP(o)));return Hm=a,a}async function UP(e){let a=Wm(e.versionCommand);a==="permission-denied"&&(zP(e.versionCommand[0]),a=Wm(e.versionCommand));let t=a==="installed"&&(!e.configCheck||e.configCheck()),r=e.platforms[process.platform],i=r?.status==="supported"?r.strategies:[],n=(await Promise.all(i.map(async d=>{try{return await ja(d.type).isAvailable()?d.type:null}catch{return null}}))).filter(d=>d!==null);if(t&&!ta(e.alias)){let{installedVersion:d,installMethod:l}=await Qm(e);await ka({alias:e.alias,name:e.name,installedVersion:d,installMethod:l,installedAt:null,lastChecked:new Date().toISOString()});}return {module:e,alreadyInstalled:t,availableStrategies:n}}function Wm(e){if(e.length===0)return "not-found";try{let a=spawnSync(e[0],e.slice(1),{timeout:3e3,stdio:"pipe",shell:process.platform==="win32"});return a.status===0?"installed":a.status===126?"permission-denied":"not-found"}catch{return "not-found"}}function zP(e){if(process.platform!=="win32")try{let a=spawnSync("which",[e],{stdio:"pipe"});if(a.status!==0)return;let o=a.stdout.toString().trim(),t=ie__default.realpathSync(o),{mode:r}=ie__default.statSync(t);ie__default.chmodSync(t,r|73);}catch{}}function HP(e){return e.filter(a=>a.module.platforms[process.platform]?.status==="supported").filter(a=>!a.alreadyInstalled).map(a=>({module:a.module,alreadyInstalled:a.alreadyInstalled,checked:!a.alreadyInstalled&&(a.availableStrategies.length>0||a.module.required===true),selectedStrategy:a.availableStrategies[0]??null,availableStrategies:a.availableStrategies}))}function Ym(e,a){let[o,t]=useState(()=>HP(e)),[r,i]=useState(0),s=useRef(r);useEffect(()=>{s.current=r;},[r]);let n=useRef(o);useEffect(()=>{n.current=o;},[o]);let d=useCallback(u=>{t(m=>m.map(p=>p.module.alias!==u||p.module.required?p:{...p,checked:!p.checked}));},[]),l=useCallback((u,m)=>{t(p=>p.map(g=>g.module.alias===u?{...g,selectedStrategy:m}:g));},[]);useInput((u,m)=>{let p=s.current,g=n.current,f=m.upArrow||u==="[A",h=m.downArrow||u==="[B";if(f||h)f&&p>0?i(p-1):h&&p<g.length-1&&i(p+1);else if(u===" "){let b=g[p];b&&!b.module.required&&d(b.module.alias);}else if(m.tab){let b=g[p];if(b&&b.availableStrategies.length>1){let D=b.availableStrategies.indexOf(b.selectedStrategy??b.availableStrategies[0]),q=b.availableStrategies[(D+1)%b.availableStrategies.length];t(L=>L.map(A=>A.module.alias===b.module.alias?{...A,selectedStrategy:q}:A));}}},{isActive:a});let c=useMemo(()=>o.filter(u=>u.checked),[o]);return {items:o,focusedIndex:r,toggle:d,setStrategy:l,confirmedItems:c}}j();function eg({probeResults:e,onConfirm:a}){let o=y(p=>p.focus),t=y(p=>p.actionMenuOpen),r=y(p=>p.setActionMenuOpen),i=y(p=>p.setFocus),{items:s,focusedIndex:n,confirmedItems:d}=Ym(e,o==="moduleSetup"),l=useCallback(()=>{r(false),i("moduleSetup");},[r,i]),c=useCallback(p=>{(p==="Install"||p==="Skip")&&a(d),l();},[d,a,l]);useInput((p,g)=>{g.return&&(r(true),i("actionMenu"));},{isActive:o==="moduleSetup"});let u=d.length>0?["Install","Cancel"]:["Skip","Cancel"],m=d.length>0?`Install ${d.length} module(s)?`:"No modules selected";return jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Configure modules"})}),jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:s.map((p,g)=>{let f=g===n,h=v(p.module.name);return p.availableStrategies.length===0?jsxs(Box,{children:[jsxs(Text,{dimColor:true,children:[" [ ] ",h," "]}),jsx(Text,{dimColor:true,children:"\u2014 no installer available"})]},p.module.alias):jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:f?"cyan":void 0,children:[f?"\u25B6":" ",p.checked?" [\u2713] ":" [ ] ",h]}),p.module.required&&jsx(Text,{dimColor:true,children:" (required)"}),jsxs(Text,{dimColor:true,children:[" ",p.selectedStrategy??""]}),p.availableStrategies.length>1&&jsxs(Text,{dimColor:true,children:[" ","(",p.availableStrategies.indexOf(p.selectedStrategy??p.availableStrategies[0])+1,"/",p.availableStrategies.length," \u2194)"]})]}),p.module.description&&jsx(Box,{paddingLeft:6,children:jsx(Text,{dimColor:true,children:v(p.module.description)})})]},p.module.alias)})}),jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Space toggle \xB7 Tab change method \xB7 Enter confirm"})}),t&&jsx(ra,{itemName:m,actions:u,onAction:c,onClose:l})]})}var KP=/^https?:\/\/.+/;function ag({onConfirm:e}){let[a,o]=useState("confirm"),[t,r]=useState(""),[i,s]=useState(false),n=useRef("");return useInput((d,l)=>{if(a==="confirm"){if(d==="y"||d==="Y"){o("input");return}if(d==="n"||d==="N"||l.return){e(null);return}}if(a==="input"){if(l.escape){n.current="",r(""),o("confirm");return}if(l.return){let c=n.current.trim();c.length>0&&KP.test(c)?(s(false),e(c)):c.length>0&&s(true);return}if(l.backspace||l.delete){n.current=n.current.slice(0,-1),r(n.current);return}d&&!l.ctrl&&!l.meta&&(n.current=n.current+d,r(n.current),s(false));}}),jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Configure modules"})}),jsxs(Box,{paddingX:1,paddingBottom:1,flexDirection:"column",children:[a==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),a==="input"&&jsxs(Box,{flexDirection:"column",gap:1,children:[jsx(Text,{children:"Enter your custom Flow base URL:"}),jsxs(Box,{children:[jsx(Text,{color:"cyan",children:"> "}),jsx(Text,{children:t}),jsx(Text,{color:"cyan",children:"\u2588"})]}),i&&jsx(Text,{color:"red",children:"URL must start with http:// or https://"}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})]})}function YP(e){let a=e.module.platforms[process.platform];return (a?.status==="supported"?a.strategies:[]).map(t=>t.type==="npm"?`npm install -g ${t.package}`:t.type==="homebrew"?`brew install ${t.formula}`:"curl (see docs)").join(" or ")}function rg(e,a){let[o,t]=useState(()=>e.map(u=>({alias:u.module.alias,name:u.module.name,status:"pending"}))),[r,i]=useState(false),s=useCallback((u,m)=>{t(p=>p.map(g=>g.alias===u?{...g,...m}:g));},[]),n=useCallback(async()=>{for(let u of e){let m=YP(u);if(!u.selectedStrategy){let p=m?`No package manager available. Install manually: ${m}`:"No package manager available for this platform";s(u.module.alias,{status:"failed",error:p,manualInstallHint:m||void 0});continue}s(u.module.alias,{status:"installing"});try{let p=await xo(u.module,"onboarding",u.selectedStrategy,a);p.success?s(u.module.alias,{status:"installed",pendingSetupCommand:p.configCheckFailed?"flow-ai-obs init \u2014 run manually to complete setup (required for metrics collection)":p.pendingInteractiveSetup?.join(" ")}):s(u.module.alias,{status:"failed",error:p.error?.message??"Installation failed",manualInstallHint:m});}catch(p){s(u.module.alias,{status:"failed",error:p instanceof Error?p.message:"Unknown error",manualInstallHint:m});}}i(true);},[e,s,a]),d=useMemo(()=>o.filter(u=>u.status==="installed").length,[o]),l=useMemo(()=>o.filter(u=>u.status==="failed").length,[o]),c=useMemo(()=>o.filter(u=>u.status==="skipped").length,[o]);return {modules:o,install:n,isComplete:r,installedCount:d,failedCount:l,skippedCount:c}}U();j();function ig({module:e}){let a=v(e.name);if(e.status==="installing")return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",a," \u2014 Installing..."]})]});if(e.status==="installed"){let o=!!e.pendingSetupCommand;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{children:jsxs(Text,{color:o?"red":"green",children:[o?"\u2717":"\u2713"," ",a]})}),e.pendingSetupCommand&&jsx(Box,{paddingLeft:2,children:jsx(Text,{color:"red",children:v(e.pendingSetupCommand)})})]})}return e.status==="failed"?jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",a]}),e.error&&jsxs(Text,{dimColor:true,children:[" \u2014 ",v(e.error)]})]}),e.manualInstallHint&&jsx(Box,{paddingLeft:2,children:jsxs(Text,{dimColor:true,children:["Install manually: ",v(e.manualInstallHint)]})})]}):e.status==="skipped"?jsx(Box,{children:jsxs(Text,{dimColor:true,children:["- ",a," (not supported on this platform)"]})}):jsx(Box,{children:jsxs(Text,{dimColor:true,children:["\u25CB ",a]})})}function cg({confirmedItems:e,customUrl:a}){let o=y(b=>b.setScreen),t=y(b=>b.setFocus),{modules:r,install:i,isComplete:s,installedCount:n,failedCount:d,skippedCount:l}=rg(e,a),c=r.some(b=>b.pendingSetupCommand),u=useRef(false),m=useRef(false);useEffect(()=>{u.current||(u.current=true,i());},[i]);let p=useCallback(()=>{tt().catch(()=>{}),t("list");let b=ce().some(D=>D.name===pe);o(b?"main":"claudeMdSuggestion");},[t,o]);useEffect(()=>{if(s&&d===0&&!c&&!m.current){m.current=true;let b=setTimeout(p,1500);return ()=>clearTimeout(b)}},[s,d,c,p]),useInput((b,D)=>{D.return&&p();},{isActive:s});let g=r.filter(b=>b.pendingSetupCommand).length,f=n-g,h=[];return f>0&&h.push(jsxs(Text,{color:"green",children:[f," installed"]},"i")),g>0&&h.push(jsxs(Text,{color:"red",children:[g," needs setup"]},"p")),d>0&&h.push(jsxs(Text,{color:"red",children:[d," failed"]},"f")),l>0&&h.push(jsxs(Text,{dimColor:true,children:[l," skipped"]},"s")),jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:s?"Modules ready":"Setting up modules..."})}),jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:r.map(b=>jsx(ig,{module:b},b.alias))}),s&&jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:h.reduce((b,D,q)=>(q>0&&b.push(jsx(Text,{children:" | "},`sep-${q}`)),b.push(D),b),[])}),jsx(Box,{paddingX:1,children:d>0||c?jsx(Text,{dimColor:true,children:"Press Enter to continue"}):jsx(Text,{dimColor:true,children:"Proceeding..."})})]})]})}function ug(){let[e,a]=useState("loading"),[o,t]=useState([]),[r,i]=useState([]),[s,n]=useState(null),d=y(p=>p.setFocus),l=y(p=>p.setScreen),c=useCallback(p=>{if(Jl(p)){tt().catch(()=>{}),d("list");let f=ce().some(h=>h.name===pe);l(f?"main":"claudeMdSuggestion");}else t(p),a("selection");},[d,l]);useEffect(()=>{let p=Vm();if(p){c(p);return}ar(de).then(c).catch(()=>{t([]),a("selection");});},[c]);let u=useCallback(p=>{i(p);let g=p.some(f=>f.module.alias==="metrics");a(g?"customUrl":"installation");},[]),m=useCallback(p=>{n(p),a("installation");},[]);return jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[e==="loading"&&jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:"Setting up modules..."})}),e==="selection"&&jsx(eg,{probeResults:o,onConfirm:u}),e==="customUrl"&&jsx(ag,{onConfirm:m}),e==="installation"&&jsx(cg,{confirmedItems:r,customUrl:s})]})}U();I();var dD=k("ClaudeMdSuggestion"),cD=[`Install ${pe}`,"Skip for now"],lD=["Retry","Skip for now"];function gg(){let e=y(m=>m.setScreen),a=y(m=>m.setFocus),o=M(m=>m.successCount),[t,r]=useState("prompt"),[i,s]=useState(0),n=useRef(0),d=useCallback(()=>{a("list"),e("main");},[a,e]),l=useCallback(()=>{C(w.CLI_CLAUDE_MD_SKIPPED,{interface:"tui"}).catch(()=>{}),d();},[d]),c=useCallback(async()=>{n.current+=1,C(w.CLI_CLAUDE_MD_ACCEPTED,{interface:"tui",attempt:n.current}).catch(()=>{}),r("installing");try{await je(pe),r("installed");}catch(m){if(m instanceof Xe){r("installed");return}dD.warn(`Failed to install ${pe}: ${m instanceof Error?m.message:m}`),r("error");}},[]),u=t==="error"?lD:cD;return useInput((m,p)=>{if(p.escape){t==="prompt"||t==="error"?l():t==="installed"&&d();return}if(t==="prompt"||t==="error"){p.upArrow&&i>0?s(i-1):p.downArrow&&i<u.length-1?s(i+1):p.return&&(i===0?(s(0),c()):l());return}t==="installed"&&p.return&&d();}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(qt,{}),jsxs(Box,{flexDirection:"column",paddingX:1,gap:1,children:[jsx(Text,{color:"green",bold:true,children:o>0?"\u2713 Starter kit installed!":"\u2713 Setup complete!"}),t==="prompt"&&jsxs(Fragment,{children:[jsxs(Box,{flexDirection:"column",children:[jsx(Text,{bold:true,children:"Personalize your Claude Code"}),jsx(Text,{children:"This plugin helps Claude understand your preferences and work style."})]}),jsx(mg,{options:u,cursorIndex:i}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]}),t==="installing"&&jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" Installing ",pe,"..."]})]}),t==="installed"&&jsxs(Fragment,{children:[jsxs(Text,{color:"green",bold:true,children:["\u2713 ",pe," installed!"]}),jsxs(Box,{flexDirection:"column",children:[jsx(Text,{children:"Open Claude in a new terminal or in VS Code and type:"}),jsxs(Text,{bold:true,color:"cyan",children:["/",pe]})]}),jsx(Text,{children:"Claude will guide you through the rest."}),jsx(Text,{dimColor:true,children:"Press Enter to continue to the catalog..."})]}),t==="error"&&jsxs(Fragment,{children:[jsxs(Text,{color:"red",bold:true,children:["\u2717 Failed to install ",pe]}),jsx(mg,{options:u,cursorIndex:i}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]})]})]})}function mg({options:e,cursorIndex:a}){return jsx(Box,{flexDirection:"column",children:e.map((o,t)=>jsxs(Text,{bold:t===a,color:t===a?"cyan":void 0,children:[t===a?"\u203A ":" ",o]},o))})}var gD=promisify(execFile),Js="@ciandt-flow/cli";async function fg(){let e=ve;if(Hd.prerelease(e)||process.env.NODE_ENV==="development")return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Js};try{let a=await fetch(`https://registry.npmjs.org/${Js}/latest`);if(!a.ok)throw new Error(`Registry returned ${a.status}`);let t=(await a.json()).version;return {currentVersion:e,latestVersion:t,isOutdated:t!==e,packageName:Js}}catch{return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Js}}}async function Hs(e){try{return await gD(Za(),["install","-g",e.packageName],{timeout:6e4,shell:process.platform==="win32"}),{success:!0}}catch(a){return {success:false,error:String(a)}}}async function fD(e){let a=ta(e.alias);if(!a?.installMethod)return a?.installedVersion??null;try{let t=await ja(a.installMethod).getInstalledVersion(e);return t&&t!==a.installedVersion&&await ka({...a,installedVersion:t,lastChecked:new Date().toISOString()}),t??a.installedVersion}catch{return a.installedVersion}}async function hg(e){let a=await fD(e),o=null,t=AbortSignal.timeout(3e4);try{if(e.versionCheck.type==="npm-registry"){let i=await fetch(`https://registry.npmjs.org/${e.versionCheck.package}/latest`,{signal:t});if(!i.ok)throw new Error(`Registry returned ${i.status}`);o=(await i.json()).version;}else if(e.versionCheck.type==="github-releases"){let i=await fetch(`https://api.github.com/repos/${e.versionCheck.repo}/releases/latest`,{signal:t});if(!i.ok)throw new Error(`GitHub returned ${i.status}`);o=(await i.json()).tag_name.replace(/^v/,"");}}catch{}let r=a!==null&&o!==null&&a!==o;return {moduleAlias:e.alias,currentVersion:a,latestVersion:o,isOutdated:r}}async function bg(e,a){let o=ta(e.alias);if(!o?.installMethod)return {success:false,error:"Unknown install method"};let r=await ja(o.installMethod).update(e,a.currentVersion??"");return r.success?(await ka({...o,installedVersion:r.version??o.installedVersion,lastChecked:new Date().toISOString()}),{success:true,newVersion:r.version}):{success:false,error:r.error?.message}}function vg(e){let o=ta(e.alias)?.installMethod,t=e.platforms[process.platform];if(t?.status==="supported"){if(o==="npm"){let r=t.strategies.find(i=>i.type==="npm");if(r?.type==="npm")return `npm install -g ${r.package}`}if(o==="homebrew"){let r=t.strategies.find(i=>i.type==="homebrew");if(r?.type==="homebrew")return `brew upgrade ${r.formula}`}}}function yg(){let[e,a]=useState({outcome:"running",items:[{id:"cli",label:"@ciandt-flow/cli",status:"pending"},...de.map(t=>({id:t.alias,label:t.name,status:"pending"}))]}),o=useCallback((t,r)=>{a(i=>({...i,items:i.items.map(s=>s.id===t?{...s,...r}:s)}));},[]);return useEffect(()=>{async function t(){try{let[r,i,s]=await Promise.all([fg(),ar(de),Promise.all(de.map(d=>hg(d)))]);if(Bs(),r.isOutdated){o("cli",{status:"updating",detail:`v${r.currentVersion} \u2192 v${r.latestVersion}`}),(await Hs(r)).success?(o("cli",{status:"updated",detail:`v${r.currentVersion} \u2192 v${r.latestVersion}`}),a(l=>({...l,outcome:"cli-updated"}))):(o("cli",{status:"error",detail:`v${r.currentVersion} \u2192 v${r.latestVersion}`,manualCommand:`npm install -g ${r.packageName}`}),a(l=>({...l,outcome:"cli-update-failed"})));return}o("cli",{status:"ok",detail:`v${r.currentVersion}`});let n=i.some(d=>!d.alreadyInstalled);for(let d of i)d.alreadyInstalled||o(d.module.alias,{status:"missing"});if(n){a(d=>({...d,outcome:"module-missing"}));return}for(let d of s){let l=de.find(u=>u.alias===d.moduleAlias);if(!l)continue;if(!d.isOutdated){o(d.moduleAlias,{status:"ok",detail:d.currentVersion?`v${d.currentVersion}`:void 0});continue}o(d.moduleAlias,{status:"updating",detail:`v${d.currentVersion} \u2192 v${d.latestVersion}`});let c=await bg(l,d);c.success?o(d.moduleAlias,{status:"updated",detail:`v${c.newVersion}`}):o(d.moduleAlias,{status:"error",detail:`v${d.currentVersion} \u2192 v${d.latestVersion}`,manualCommand:vg(l)});}a(d=>({...d,items:d.items.map(l=>l.status==="pending"?{...l,status:"ok"}:l)})),await tt(),a(d=>({...d,outcome:"done"}));}catch{await tt(),a(r=>({...r,outcome:"done"}));}}t();},[o]),e}U();function PD({item:e}){return e.status==="pending"||e.status==="updating"?jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Wp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",e.label,e.detail?` ${e.detail}...`:""]})]}):e.status==="ok"||e.status==="updated"?jsxs(Box,{children:[jsxs(Text,{color:"green",children:["\u2713 ",e.label]}),e.detail&&jsxs(Text,{dimColor:true,children:[" ",e.detail]})]}):e.status==="missing"?jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",e.label]}),jsx(Text,{dimColor:true,children:" \u2014 not installed"})]}):jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",e.label]}),e.detail&&jsxs(Text,{dimColor:true,children:[" ",e.detail]})]}),e.manualCommand&&jsx(Box,{paddingLeft:2,children:jsxs(Text,{dimColor:true,children:["To update manually: ",e.manualCommand]})})]})}function DD({outcome:e}){return e==="done"?jsx(Text,{color:"green",children:"All good!"}):e==="cli-updated"||e==="cli-update-failed"?jsx(Text,{color:"yellow",children:"Restart the CLI to use the new version."}):null}function kg(){let{outcome:e,items:a}=yg(),o=y(r=>r.setScreen),t=y(r=>r.setFocus);return useEffect(()=>{if(e==="done"){let r=setTimeout(()=>{let i=ce().some(s=>s.name===pe);o(i?"main":"claudeMdSuggestion"),t("list");},1500);return ()=>clearTimeout(r)}if(e==="module-missing"){let r=setTimeout(()=>{o("moduleSetup"),t("moduleSetup");},500);return ()=>clearTimeout(r)}},[e,o,t]),jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsx(Box,{marginBottom:1,children:jsx(Text,{bold:true,children:"Checking environment..."})}),jsx(Box,{flexDirection:"column",gap:0,children:a.map(r=>jsx(PD,{item:r},r.id))}),e!=="running"&&jsx(Box,{marginTop:1,children:jsx(DD,{outcome:e})})]})}Re();xt();I();wn();var RD={debug:"gray",info:"cyan",warn:"yellow",error:"red"},Pg=10;function Dg(){let[e,a]=useState(Dn());useEffect(()=>nl(()=>{a([...Dn()]);}),[]);let o=e.slice(-Pg);return jsxs(Box,{flexDirection:"column",borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsxs(Text,{color:"cyan",bold:true,children:["Debug Log (last ",Pg,") \u2014 press Ctrl+D to close"]}),o.length===0?jsx(Text,{dimColor:true,children:"No log entries yet"}):o.map((t,r)=>jsxs(Text,{color:RD[t.level],children:["[",t.level.toUpperCase(),"] [",t.module,"] ",t.message]},r))]})}var ID=k("app"),TD={auth:au,starterKitSetup:zm,moduleSetup:ug,claudeMdSuggestion:gg,verify:kg,main:Im};function Cg(){let{setScreen:e,setFocus:a}=y.getState();e("auth"),a("auth");}function Qi(e){let{setScreen:a,setFocus:o}=y.getState();!e.starterKit||e.starterKit.trim()===""?(a("starterKitSetup"),o("starterKitList")):(a("verify"),o("verify"));}function Rg(){C(w.CLI_SESSION_STARTED,{cli_version:ve,os:process.platform,node_version:process.version,duration_ms:Do(),interface:"tui"}).catch(()=>{});}async function xg(){let e=await Y();if(e&&zl()&&await Po()){e.customUrl&&La(e.customUrl);let{clientSecret:t,...r}=e;oa.getState().setCredentials(r),Rg(),Qi(e);return}if(!e){Cg();return}try{e.customUrl&&La(e.customUrl),await Oa();}catch(t){ID.debug(`Token validation failed: ${String(t)}`),Cg();return}Rg();let{clientSecret:a,...o}=e;oa.getState().setCredentials(o),Qi(e);}function Eg(){let{columns:e,rows:a}=useWindowSize(),o=y(n=>n.screen),t=TD[o],{pendingExit:r}=ql(),i=y(n=>n.debugPanelOpen),s=!!process.env.DEBUG;return useInput((n,d)=>{if(s&&d.ctrl&&n==="d"){let l=y.getState().debugPanelOpen;y.getState().setDebugPanelOpen(!l);}}),t?jsxs(Box,{flexDirection:"column",width:e,height:a,children:[jsx(t,{}),s&&i&&jsx(Dg,{}),r&&jsx(Box,{paddingX:1,children:jsx(Text,{color:"yellow",children:"Press Ctrl+C again to quit"})})]}):jsxs(Text,{color:"red",children:["Unknown screen: ",o]})}Re();Ti();j();U();I();mr();Re();async function bc(e,a={}){let o=Oi({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant,customUrl:e.customUrl,starterKit:e.starterKit},a);return Ni(o),await ko(e),{jwt:o.jwt,anthropicBaseUrl:o.anthropicBaseUrl,previousToken:o.previousToken,previousBaseUrl:o.previousBaseUrl,hadExistingFile:o.hadExistingFile}}var Ia=k("auth");function Tg(){Qe.clearFallbackFile(),Ai();}var MD=3,Ig=3,Mg=` \u2139 The data collected during setup is used solely to improve
122
122
  Flow's internal tools and will not be shared externally.
123
- `;function _a(e,a={}){return new Promise((o,t)=>{let{masked:r=false,defaultValue:i=""}=a;process.stdout.write(e+i);let s=i,n=c=>{if(c===""){d(),t(new Error("SIGINT"));return}if(c==="\r"||c===`
123
+ `;function Xa(e,a={}){return new Promise((o,t)=>{let{masked:r=false,defaultValue:i=""}=a;process.stdout.write(e+i);let s=i,n=c=>{if(c===""){d(),t(new Error("SIGINT"));return}if(c==="\r"||c===`
124
124
  `){d(),process.stdout.write(`
125
- `),o(s);return}if(c==="\x7F"){s.length>0&&(s=s.slice(0,-1),process.stdout.write("\b \b"));return}c.startsWith("\x1B")||(s+=c,process.stdout.write(r?"*".repeat(c.length):c));};function d(){process.stdin.setRawMode(false),process.stdin.removeListener("data",n),process.removeListener("uncaughtException",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",l),process.removeListener("SIGTERM",l);}function l(){try{process.stdin.setRawMode(!1);}catch{}process.exit(1);}process.on("uncaughtException",l),process.on("unhandledRejection",l),process.on("SIGINT",l),process.on("SIGTERM",l),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",n);})}async function FD(){let e=et();return process.stdout.write(`
126
- `+R.yellow(" \u26A0 ")+`${b(e)} contains invalid JSON.
127
- `),(await _a(R.cyan(" ? ")+"Overwrite it with a fresh file containing only the auth token? (y/N): ")).trim().toLowerCase()==="y"}async function qg(e,a,o){try{await Pc(e,{jwtOverride:o});return}catch(t){if(!(t instanceof at))throw t;if(!a)throw new Error(`${t.message}. Fix or remove ${et()} and retry.`);if(!await FD())throw new Error("Setup cancelled: settings.json must be valid JSON to continue");await Pc(e,{allowOverwriteMalformed:true,jwtOverride:o});}}async function OD(){if((await _a(R.cyan(" ? ")+"Does your organization use a custom Flow URL? (y/N): ")).trim().toLowerCase()!=="y")return null;for(;;){let a=(await _a(R.cyan(" ? ")+"Enter custom Flow URL: ")).trim();if(ht.test(a))return a;process.stderr.write(R.yellow(` \u26A0 ${bt}. Try again.
128
- `));}}async function ND(){let e=(await _a(R.cyan(" ? ")+"Does your email use the @ciandt.com domain? (Y/n): ")).trim();if(e===""||e.toLowerCase()==="y")return null;for(;;){let a=(await _a(R.cyan(" ? ")+"Enter your email address: ")).trim();if(vt.test(a))return a;process.stderr.write(R.yellow(` \u26A0 ${yt}. Try again.
129
- `));}}async function Lg(e,a){process.stdout.write(R.dim(" Installing flow-ai-obs..."));let{npmFailed:o,initFailed:t,unexpectedError:r}=await Qi(e,a);return o?process.stdout.write(R.yellow(` \u26A0 npm install failed. Please contact Flow support.
125
+ `),o(s);return}if(c==="\x7F"){s.length>0&&(s=s.slice(0,-1),process.stdout.write("\b \b"));return}c.startsWith("\x1B")||(s+=c,process.stdout.write(r?"*".repeat(c.length):c));};function d(){process.stdin.setRawMode(false),process.stdin.removeListener("data",n),process.removeListener("uncaughtException",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",l),process.removeListener("SIGTERM",l);}function l(){try{process.stdin.setRawMode(!1);}catch{}process.exit(1);}process.on("uncaughtException",l),process.on("unhandledRejection",l),process.on("SIGINT",l),process.on("SIGTERM",l),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",n);})}async function qD(){let e=et();return process.stdout.write(`
126
+ `+R.yellow(" \u26A0 ")+`${v(e)} contains invalid JSON.
127
+ `),(await Xa(R.cyan(" ? ")+"Overwrite it with a fresh file containing only the auth token? (y/N): ")).trim().toLowerCase()==="y"}async function qg(e,a,o){try{await bc(e,{jwtOverride:o});return}catch(t){if(!(t instanceof at))throw t;if(!a)throw new Error(`${t.message}. Fix or remove ${et()} and retry.`);if(!await qD())throw new Error("Setup cancelled: settings.json must be valid JSON to continue");await bc(e,{allowOverwriteMalformed:true,jwtOverride:o});}}async function LD(){if((await Xa(R.cyan(" ? ")+"Does your organization use a custom Flow URL? (y/N): ")).trim().toLowerCase()!=="y")return null;for(;;){let a=(await Xa(R.cyan(" ? ")+"Enter custom Flow URL: ")).trim();if(ht.test(a))return a;process.stderr.write(R.yellow(` \u26A0 ${bt}. Try again.
128
+ `));}}async function FD(){let e=(await Xa(R.cyan(" ? ")+"Does your email use the @ciandt.com domain? (Y/n): ")).trim();if(e===""||e.toLowerCase()==="y")return null;for(;;){let a=(await Xa(R.cyan(" ? ")+"Enter your email address: ")).trim();if(vt.test(a))return a;process.stderr.write(R.yellow(` \u26A0 ${yt}. Try again.
129
+ `));}}async function Lg(e,a){process.stdout.write(R.dim(" Installing flow-ai-obs..."));let{npmFailed:o,initFailed:t,unexpectedError:r}=await Vi(e,a);return o?process.stdout.write(R.yellow(` \u26A0 npm install failed. Please contact Flow support.
130
130
  `)):r?process.stdout.write(R.yellow(` \u26A0 Unexpected error. Please contact Flow support.
131
131
  `)):t?process.stdout.write(R.yellow(`
132
132
  \u26A0 flow-ai-obs could not be initialized \u2014 domain authentication failure. Please contact support.
133
133
  `)):process.stdout.write(R.green(` done
134
- `)),{initFailed:t}}async function Fg(){for(let e=1;e<=Ig;e++)try{return await ns()}catch{if(e===Ig)throw new Error("Failed to fetch starter kits after 3 attempts")}return []}async function Og(){let e=await Fg();if(e.length===0)throw new Error("No starter kits available. Please contact your administrator.");let a=(await _a(R.cyan(" ? ")+"Install a starter kit? (y/N): ")).trim().toLowerCase();if(a!=="y"&&a!=="yes")return null;for(process.stdout.write(`
134
+ `)),{initFailed:t}}async function Fg(){for(let e=1;e<=Ig;e++)try{return await ns()}catch{if(e===Ig)throw new Error("Failed to fetch starter kits after 3 attempts")}return []}async function Og(){let e=await Fg();if(e.length===0)throw new Error("No starter kits available. Please contact your administrator.");let a=(await Xa(R.cyan(" ? ")+"Install a starter kit? (y/N): ")).trim().toLowerCase();if(a!=="y"&&a!=="yes")return null;for(process.stdout.write(`
135
135
  `+R.cyan(" ? ")+`Starter Kit:
136
- `),e.forEach((o,t)=>{process.stdout.write(` ${R.cyan(`${t+1})`)} ${b(o.name)}
136
+ `),e.forEach((o,t)=>{process.stdout.write(` ${R.cyan(`${t+1})`)} ${v(o.name)}
137
137
  `);}),process.stdout.write(`
138
- `);;){let o=(await _a(R.cyan(" ? ")+`Select starter kit (1-${e.length}): `)).trim(),t=parseInt(o,10)-1;if(!isNaN(t)&&t>=0&&t<e.length)return e[t];process.stderr.write(R.yellow(` \u26A0 Invalid selection. Please try again.
138
+ `);;){let o=(await Xa(R.cyan(" ? ")+`Select starter kit (1-${e.length}): `)).trim(),t=parseInt(o,10)-1;if(!isNaN(t)&&t>=0&&t<e.length)return e[t];process.stderr.write(R.yellow(` \u26A0 Invalid selection. Please try again.
139
139
  `));}}async function Ng(e){if(e.plugins.length===0)return process.stdout.write(R.dim(`
140
- Starter kit '${b(e.name)}' has no plugins to install.
140
+ Starter kit '${v(e.name)}' has no plugins to install.
141
141
  `)),true;process.stdout.write(`
142
- Installing ${e.plugins.length} plugins from '${b(e.name)}'...
143
- `);let a=0,o=0,t=e.plugins.length;for(let r of e.plugins){let i=a+o+1;process.stdout.write(R.dim(` [${i}/${t}] Installing ${b(r)}...`));let s=false;for(let n=1;n<=LD;n++)try{await je(r),a++,s=!0;break}catch(d){if(d instanceof Xe){a++,s=true;break}}s?process.stdout.write(R.green(` done
142
+ Installing ${e.plugins.length} plugins from '${v(e.name)}'...
143
+ `);let a=0,o=0,t=e.plugins.length;for(let r of e.plugins){let i=a+o+1;process.stdout.write(R.dim(` [${i}/${t}] Installing ${v(r)}...`));let s=false;for(let n=1;n<=MD;n++)try{await je(r),a++,s=!0;break}catch(d){if(d instanceof Xe){a++,s=true;break}}s?process.stdout.write(R.green(` done
144
144
  `)):(o++,process.stdout.write(R.red(` failed
145
- `)));}return o===0?process.stdout.write(R.green(` \u2713 Starter kit '${b(e.name)}' selected. ${a}/${t} plugins installed successfully.
146
- `)):process.stdout.write(R.yellow(` \u26A0 Starter kit '${b(e.name)}' selected. ${a}/${t} plugins installed. ${o} failed.
145
+ `)));}return o===0?process.stdout.write(R.green(` \u2713 Starter kit '${v(e.name)}' selected. ${a}/${t} plugins installed successfully.
146
+ `)):process.stdout.write(R.yellow(` \u26A0 Starter kit '${v(e.name)}' selected. ${a}/${t} plugins installed. ${o} failed.
147
147
  `)),o===0}async function Gg(){process.stdout.write(`
148
148
  `),process.stdout.write(R.bold(` Personalize your Claude Code
149
149
  `)),process.stdout.write(R.dim(` This plugin helps Claude understand your preferences and work style.
150
150
 
151
- `));let e=(await _a(R.cyan(" ? ")+`Install ${me}? (Y/n): `)).trim();if(e!==""&&e.toLowerCase()!=="y"){C(w.CLI_CLAUDE_MD_SKIPPED,{interface:"cli"}).catch(()=>{}),process.stdout.write(R.dim(`
151
+ `));let e=(await Xa(R.cyan(" ? ")+`Install ${pe}? (Y/n): `)).trim();if(e!==""&&e.toLowerCase()!=="y"){C(w.CLI_CLAUDE_MD_SKIPPED,{interface:"cli"}).catch(()=>{}),process.stdout.write(R.dim(`
152
152
  You can always install it later from the catalog.
153
- `));return}C(w.CLI_CLAUDE_MD_ACCEPTED,{interface:"cli"}).catch(()=>{}),process.stdout.write(R.dim(` Installing ${me}...`));try{await je(me),process.stdout.write(R.green(` done
153
+ `));return}C(w.CLI_CLAUDE_MD_ACCEPTED,{interface:"cli"}).catch(()=>{}),process.stdout.write(R.dim(` Installing ${pe}...`));try{await je(pe),process.stdout.write(R.green(` done
154
154
  `));}catch(a){if(a instanceof Xe)process.stdout.write(R.green(` already installed
155
- `));else {Ta.warn(`Failed to install ${me}: ${a instanceof Error?a.message:a}`),process.stdout.write(R.red(` failed
155
+ `));else {Ia.warn(`Failed to install ${pe}: ${a instanceof Error?a.message:a}`),process.stdout.write(R.red(` failed
156
156
  `)),process.stdout.write(R.dim(` You can install it later from the catalog.
157
157
  `));return}}process.stdout.write(`
158
158
  `),process.stdout.write(` Open Claude in a new terminal or in VS Code and type:
159
- `),process.stdout.write(R.cyan.bold(` /${me}
159
+ `),process.stdout.write(R.cyan.bold(` /${pe}
160
160
  `)),process.stdout.write(` Claude will guide you through the rest.
161
- `);}async function GD(e){if(Tg(),process.stdout.write(`
161
+ `);}async function OD(e){if(Tg(),process.stdout.write(`
162
162
  `+Mg+`
163
163
  `),e.customUrl!==void 0&&!ht.test(e.customUrl))return process.stderr.write(R.red(` \u2717 ${bt}.
164
164
  `)),1;if(e.customEmail!==void 0&&!vt.test(e.customEmail))return process.stderr.write(R.red(` \u2717 ${yt}.
165
- `)),1;let a=e.jwt.trim(),o;try{o=wr(a);}catch(r){let i=b(r instanceof Error?r.message:"Invalid JWT");return process.stderr.write(R.red(` \u2717 ${i}
166
- `)),1}e.customUrl&&La(e.customUrl),Ta.debug(`[${o.tenant}] Authenticating tenant via JWT`);try{await Xo(o);}catch(r){let i=b(r instanceof Error?r.message:"unknown error");return Ta.error(`[${o.tenant}] Authentication failed: ${i}`),process.stderr.write(R.red(` \u2717 Authentication failed: ${i}
167
- `)),1}let{initFailed:t}=await Lg(e.customUrl??null,e.customEmail??null);try{let r;if(e.starterKit){let i=await Fg(),s=i.find(n=>n.slug===e.starterKit);if(!s){process.stderr.write(R.red(` \u2717 Starter kit '${b(e.starterKit)}' not found.
165
+ `)),1;let a=e.jwt.trim(),o;try{o=wr(a);}catch(r){let i=v(r instanceof Error?r.message:"Invalid JWT");return process.stderr.write(R.red(` \u2717 ${i}
166
+ `)),1}e.customUrl&&La(e.customUrl),Ia.debug(`[${o.tenant}] Authenticating tenant via JWT`);try{await Xo(o);}catch(r){let i=v(r instanceof Error?r.message:"unknown error");return Ia.error(`[${o.tenant}] Authentication failed: ${i}`),process.stderr.write(R.red(` \u2717 Authentication failed: ${i}
167
+ `)),1}let{initFailed:t}=await Lg(e.customUrl??null,e.customEmail??null);try{let r;if(e.starterKit){let i=await Fg(),s=i.find(n=>n.slug===e.starterKit);if(!s){process.stderr.write(R.red(` \u2717 Starter kit '${v(e.starterKit)}' not found.
168
168
  `)),process.stderr.write(` Available starter kits:
169
- `);for(let n of i)process.stderr.write(` - ${b(n.slug)} (${b(n.name)})
169
+ `);for(let n of i)process.stderr.write(` - ${v(n.slug)} (${v(n.name)})
170
170
  `);return 1}r=s;}else r=await Og();return await qg({...o,starterKit:r?.slug,customUrl:e.customUrl},!1,a),r?await Ng(r):process.stdout.write(R.dim(`
171
171
  Skipped starter kit installation.
172
- `)),await Gg(),Ta.info(`[${o.tenant}] Authentication successful`),process.stdout.write(R.green(`
173
- \u2713 Setup complete. Tenant: ${b(o.tenant)}. JWT written to ${et()}.
172
+ `)),await Gg(),Ia.info(`[${o.tenant}] Authentication successful`),process.stdout.write(R.green(`
173
+ \u2713 Setup complete. Tenant: ${v(o.tenant)}. JWT written to ${et()}.
174
174
 
175
175
  `)),t&&process.stdout.write(R.yellow(` \u26A0 flow-ai-obs initialization failed \u2014 domain authentication failure. Please contact support.
176
- `)),0}catch(r){if(r instanceof Error&&r.message==="SIGINT")throw r;let i=b(r instanceof Error?r.message:"unknown error");return Ta.error(`[${o.tenant}] Starter kit setup failed: ${i}`),process.stderr.write(R.red(` \u2717 Starter kit setup failed: ${i}
177
- `)),1}}async function BD(e,a){Tg(),Ta.debug("[auth] Starting interactive authentication");try{process.stdout.write(`
176
+ `)),0}catch(r){if(r instanceof Error&&r.message==="SIGINT")throw r;let i=v(r instanceof Error?r.message:"unknown error");return Ia.error(`[${o.tenant}] Starter kit setup failed: ${i}`),process.stderr.write(R.red(` \u2717 Starter kit setup failed: ${i}
177
+ `)),1}}async function ND(e,a){Tg(),Ia.debug("[auth] Starting interactive authentication");try{process.stdout.write(`
178
178
  `),process.stdout.write(Mg+`
179
- `);let o=(await _a(R.cyan(" ? ")+"JWT: ",{masked:!0})).trim();if(!o)return Ta.error("[auth] Validation failed: JWT is required"),process.stderr.write(R.red(` \u2717 JWT is required
180
- `)),1;let t;try{t=wr(o);}catch(d){let l=b(d instanceof Error?d.message:"Invalid JWT");return process.stderr.write(R.red(` \u2717 ${l}
181
- `)),1}let r=e??await OD(),i=a??await ND();r&&La(r),Ta.debug(`[${t.tenant}] Authenticating tenant`);try{await Xo(t);}catch(d){let l=b(d instanceof Error?d.message:"unknown error");return Ta.error(`[${t.tenant}] Authentication failed: ${l}`),process.stderr.write(R.red(` \u2717 Authentication failed: ${l}
179
+ `);let o=(await Xa(R.cyan(" ? ")+"JWT: ",{masked:!0})).trim();if(!o)return Ia.error("[auth] Validation failed: JWT is required"),process.stderr.write(R.red(` \u2717 JWT is required
180
+ `)),1;let t;try{t=wr(o);}catch(d){let l=v(d instanceof Error?d.message:"Invalid JWT");return process.stderr.write(R.red(` \u2717 ${l}
181
+ `)),1}let r=e??await LD(),i=a??await FD();r&&La(r),Ia.debug(`[${t.tenant}] Authenticating tenant`);try{await Xo(t);}catch(d){let l=v(d instanceof Error?d.message:"unknown error");return Ia.error(`[${t.tenant}] Authentication failed: ${l}`),process.stderr.write(R.red(` \u2717 Authentication failed: ${l}
182
182
  `)),1}let{initFailed:s}=await Lg(r,i),n=await Og();return await qg({...t,starterKit:n?.slug,customUrl:r??void 0},!0,o),n?await Ng(n):process.stdout.write(R.dim(`
183
183
  Skipped starter kit installation.
184
- `)),await Gg(),Ta.info(`[${t.tenant}] Authentication successful`),process.stdout.write(R.green(`
185
- \u2713 Setup complete. Tenant: ${b(t.tenant)}. JWT written to ${et()}.
184
+ `)),await Gg(),Ia.info(`[${t.tenant}] Authentication successful`),process.stdout.write(R.green(`
185
+ \u2713 Setup complete. Tenant: ${v(t.tenant)}. JWT written to ${et()}.
186
186
 
187
187
  `)),s&&process.stdout.write(R.yellow(` \u26A0 flow-ai-obs initialization failed \u2014 domain authentication failure. Please contact support.
188
- `)),0}catch(o){if(o instanceof Error&&o.message==="SIGINT")throw o;let t=b(o instanceof Error?o.message:"unknown error");return Ta.error(`[auth] Unexpected error: ${t}`),process.stderr.write(R.red(` \u2717 Unexpected error: ${t}
189
- `)),1}}async function Dc(e={}){if(e.jwt)return GD({jwt:e.jwt,starterKit:e.starterKit,customUrl:e.customUrl,customEmail:e.customEmail});if(e.customUrl!==void 0&&!ht.test(e.customUrl))return process.stderr.write(R.red(` \u2717 ${bt}.
188
+ `)),0}catch(o){if(o instanceof Error&&o.message==="SIGINT")throw o;let t=v(o instanceof Error?o.message:"unknown error");return Ia.error(`[auth] Unexpected error: ${t}`),process.stderr.write(R.red(` \u2717 Unexpected error: ${t}
189
+ `)),1}}async function vc(e={}){if(e.jwt)return OD({jwt:e.jwt,starterKit:e.starterKit,customUrl:e.customUrl,customEmail:e.customEmail});if(e.customUrl!==void 0&&!ht.test(e.customUrl))return process.stderr.write(R.red(` \u2717 ${bt}.
190
190
  `)),1;if(e.customEmail!==void 0&&!vt.test(e.customEmail))return process.stderr.write(R.red(` \u2717 ${yt}.
191
- `)),1;try{return await BD(e.customUrl,e.customEmail)}catch(a){if(a instanceof Error&&a.message==="SIGINT")return process.stdout.write(`
192
- `),130;throw a}}async function jD(){try{return process.stdout.write(`
193
- `),(await _a(R.cyan(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(R.yellow(` \u26A0 Logout cancelled
191
+ `)),1;try{return await ND(e.customUrl,e.customEmail)}catch(a){if(a instanceof Error&&a.message==="SIGINT")return process.stdout.write(`
192
+ `),130;throw a}}async function GD(){try{return process.stdout.write(`
193
+ `),(await Xa(R.cyan(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(R.yellow(` \u26A0 Logout cancelled
194
194
  `)),0):null}catch(e){if(e instanceof Error&&e.message==="SIGINT")return process.stdout.write(`
195
195
  `),130;throw e}}async function Bg(e){if(!await Y())return process.stdout.write(R.yellow(` \u26A0 You are not authenticated
196
- `)),0;if(!e){let a=await jD();if(a!==null)return a}try{return await Dl(),process.stdout.write(R.green(` \u2713 Credentials removed successfully
196
+ `)),0;if(!e){let a=await GD();if(a!==null)return a}try{return await yl(),process.stdout.write(R.green(` \u2713 Credentials removed successfully
197
197
  `)),0}catch{return process.stderr.write(R.red(` \u2717 Error removing credentials
198
198
  `)),1}}async function jg(){let e=await Y();return e?await Po()?(process.stdout.write(`
199
199
  `+R.bold(` Authenticated
200
- `)),process.stdout.write(R.dim(" Tenant: ")+b(e.tenant)+`
201
- `),process.stdout.write(R.dim(" Client ID: ")+b(e.clientId)+`
202
- `),process.stdout.write(R.dim(" Starter Kit: ")+b(e.starterKit??"not set")+`
203
- `),process.stdout.write(R.dim(" Config: ")+b(await wl())+`
200
+ `)),process.stdout.write(R.dim(" Tenant: ")+v(e.tenant)+`
201
+ `),process.stdout.write(R.dim(" Client ID: ")+v(e.clientId)+`
202
+ `),process.stdout.write(R.dim(" Starter Kit: ")+v(e.starterKit??"not set")+`
203
+ `),process.stdout.write(R.dim(" Config: ")+v(await kl())+`
204
204
  `),process.stdout.write(`
205
- `),0):(process.stdout.write(R.yellow(" \u26A0 Session expired. Run `flow auth login` to re-authenticate.\n")),0):(process.stdout.write(R.yellow(" \u26A0 Not authenticated. Run `flow auth login` to set up.\n")),0)}j();U();Oe();U();var zD=[pe,"flow-harness"];function Ug(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function WD(e,a,o=process.env){return Ug(o.DISABLE_AUTOUPDATER)?{name:e,enabled:false,reason:"env-disabled"}:Ug(o.FORCE_AUTOUPDATE_PLUGINS)?{name:e,enabled:true,reason:"env-forced"}:a?.autoUpdate===false?{name:e,enabled:false,reason:"flag"}:a?.autoUpdate===true?{name:e,enabled:true,reason:"flag"}:{name:e,enabled:true,reason:"default"}}function zg(e){switch(e.reason){case "env-disabled":return "DISABLE_AUTOUPDATER is set";case "env-forced":return "FORCE_AUTOUPDATE_PLUGINS is set";case "flag":return e.enabled?"autoUpdate: true":"autoUpdate: false";case "default":return "default (no explicit flag)"}}function Vs(e=process.env){let a=Jo();if(!se__default.existsSync(a))return [];try{let o=JSON.parse(se__default.readFileSync(a,"utf-8"));return Object.entries(o).map(([t,r])=>WD(t,r,e))}catch{return []}}function Wg(){let e=Jo(),a={fixed:[],skipped:[]};if(!se__default.existsSync(e))return a;let o;try{o=JSON.parse(se__default.readFileSync(e,"utf-8"));}catch{return a.skipped.push({name:"(all)",reason:"known_marketplaces.json is malformed JSON"}),a}let t=false;for(let r of zD){let i=o[r];if(!i){a.skipped.push({name:r,reason:"not registered on this machine"});continue}if("autoUpdate"in i){a.skipped.push({name:r,reason:i.autoUpdate?"already autoUpdate: true":"explicitly set to autoUpdate: false \u2014 not overridden"});continue}i.autoUpdate=true,a.fixed.push(r),t=true;}if(t){let r=`${e}.${randomUUID()}.tmp`;se__default.writeFileSync(r,JSON.stringify(o,null,2),{encoding:"utf-8",mode:384}),se__default.renameSync(r,e);}return a}async function JD(e){let a=le(),o;try{o=await oo(e.source);}catch(r){if(e.source)throw r;o=[];}let t=new Set(a.map(r=>r.name));return C(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"available",result_count:o.length}).catch(()=>{}),e.json?(bo(o.map(r=>({...r,installed:t.has(r.name)}))),0):(St(["","Name","Version","Category","Status"],o.map(r=>[t.has(r.name)?"*":" ",r.name??"",r.version??"n/a",r.category??"",t.has(r.name)?"installed":"available"])),0)}async function HD(e){let a=le(),o=await oo(e.source),t=new Map(o.map(i=>[i.name,i])),r=a.map(i=>{let s=t.get(i.name);return s&&i.version&&s.version&&ze(i.version,s.version)?{...i,availableVersion:s.version}:null}).filter(i=>i!==null);return C(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"outdated",result_count:r.length}).catch(()=>{}),e.json?(bo(r),0):r.length===0?(D("All plugins are up to date."),0):(St(["Name","Installed","Available"],r.map(i=>[i.name??"",i.version??"n/a",i.availableVersion??"n/a"])),process.stdout.write(`
205
+ `),0):(process.stdout.write(R.yellow(" \u26A0 Session expired. Run `flow auth login` to re-authenticate.\n")),0):(process.stdout.write(R.yellow(" \u26A0 Not authenticated. Run `flow auth login` to set up.\n")),0)}j();U();Oe();U();var jD=[ue,"flow-harness"];function Ug(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function UD(e,a,o=process.env){return Ug(o.DISABLE_AUTOUPDATER)?{name:e,enabled:false,reason:"env-disabled"}:Ug(o.FORCE_AUTOUPDATE_PLUGINS)?{name:e,enabled:true,reason:"env-forced"}:a?.autoUpdate===false?{name:e,enabled:false,reason:"flag"}:a?.autoUpdate===true?{name:e,enabled:true,reason:"flag"}:{name:e,enabled:true,reason:"default"}}function zg(e){switch(e.reason){case "env-disabled":return "DISABLE_AUTOUPDATER is set";case "env-forced":return "FORCE_AUTOUPDATE_PLUGINS is set";case "flag":return e.enabled?"autoUpdate: true":"autoUpdate: false";case "default":return "default (no explicit flag)"}}function Qs(e=process.env){let a=Jo();if(!ie__default.existsSync(a))return [];try{let o=JSON.parse(ie__default.readFileSync(a,"utf-8"));return Object.entries(o).map(([t,r])=>UD(t,r,e))}catch{return []}}function Wg(){let e=Jo(),a={fixed:[],skipped:[]};if(!ie__default.existsSync(e))return a;let o;try{o=JSON.parse(ie__default.readFileSync(e,"utf-8"));}catch{return a.skipped.push({name:"(all)",reason:"known_marketplaces.json is malformed JSON"}),a}let t=false;for(let r of jD){let i=o[r];if(!i){a.skipped.push({name:r,reason:"not registered on this machine"});continue}if("autoUpdate"in i){a.skipped.push({name:r,reason:i.autoUpdate?"already autoUpdate: true":"explicitly set to autoUpdate: false \u2014 not overridden"});continue}i.autoUpdate=true,a.fixed.push(r),t=true;}if(t){let r=`${e}.${randomUUID()}.tmp`;ie__default.writeFileSync(r,JSON.stringify(o,null,2),{encoding:"utf-8",mode:384}),ie__default.renameSync(r,e);}return a}async function zD(e){let a=ce(),o;try{o=await oo(e.source);}catch(r){if(e.source)throw r;o=[];}let t=new Set(a.map(r=>r.name));return C(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"available",result_count:o.length}).catch(()=>{}),e.json?(bo(o.map(r=>({...r,installed:t.has(r.name)}))),0):(St(["","Name","Version","Category","Status"],o.map(r=>[t.has(r.name)?"*":" ",r.name??"",r.version??"n/a",r.category??"",t.has(r.name)?"installed":"available"])),0)}async function WD(e){let a=ce(),o=await oo(e.source),t=new Map(o.map(i=>[i.name,i])),r=a.map(i=>{let s=t.get(i.name);return s&&i.version&&s.version&&ze(i.version,s.version)?{...i,availableVersion:s.version}:null}).filter(i=>i!==null);return C(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"outdated",result_count:r.length}).catch(()=>{}),e.json?(bo(r),0):r.length===0?(P("All plugins are up to date."),0):(St(["Name","Installed","Available"],r.map(i=>[i.name??"",i.version??"n/a",i.availableVersion??"n/a"])),process.stdout.write(`
206
206
  ${r.length} plugin(s) outdated.
207
- `),0)}async function QD(e){let a=le();if(C(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"all",result_count:a.length}).catch(()=>{}),a.length===0)return D("No plugins installed. Use `flow plugin install <name>` to install one."),0;if(e.json)return bo(a),0;let o=[];try{o=await oo(e.source);}catch{o=[];}let t=new Map(o.map(s=>[s.name,s])),r=new Map(Vs().map(s=>[s.name,s.enabled])),i=[...a].sort((s,n)=>{let d=$r.indexOf(s.scope??"user"),l=$r.indexOf(n.scope??"user");return (d===-1?1/0:d)-(l===-1?1/0:l)});return St(["Name","Version","Type","Origin","Scope","Status","Auto-Update","Installed at"],i.map(s=>{let n=t.get(s.name),d=n?.type??"bundle",l=n?.origin??$d(s.marketplace),c=s.marketplace?r.get(s.marketplace):void 0,u=c===void 0?"n/a":c?"on":"off";return [s.name??"",s.version??"n/a",ho[d]?.label??"Plugin",l,s.scope??"user",s.status??"enabled",u,qa(s.installedAt??"")]})),process.stdout.write(`
207
+ `),0)}async function JD(e){let a=ce();if(C(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"all",result_count:a.length}).catch(()=>{}),a.length===0)return P("No plugins installed. Use `flow plugin install <name>` to install one."),0;if(e.json)return bo(a),0;let o=[];try{o=await oo(e.source);}catch{o=[];}let t=new Map(o.map(s=>[s.name,s])),r=new Map(Qs().map(s=>[s.name,s.enabled])),i=[...a].sort((s,n)=>{let d=$r.indexOf(s.scope??"user"),l=$r.indexOf(n.scope??"user");return (d===-1?1/0:d)-(l===-1?1/0:l)});return St(["Name","Version","Type","Origin","Scope","Status","Auto-Update","Installed at"],i.map(s=>{let n=t.get(s.name),d=n?.type??"bundle",l=n?.origin??Qd(s.marketplace),c=s.marketplace?r.get(s.marketplace):void 0,u=c===void 0?"n/a":c?"on":"off";return [s.name??"",s.version??"n/a",ho[d]?.label??"Plugin",l,s.scope??"user",s.status??"enabled",u,qa(s.installedAt??"")]})),process.stdout.write(`
208
208
  ${a.length} plugin(s) installed.
209
- `),0}async function Jg(e){if(!await he())return 1;try{return e.available?await JD(e):e.outdated?await HD(e):await QD(e)}catch(a){return S(a instanceof Error?a.message:"Failed to list plugins."),1}}To();j();U();I();var be=P("manage");function _s(e,a){return a?le().find(o=>o.name===e&&o.scope===a):le().find(o=>o.name===e)}function VD(e,a){let o=a;return {callbacks:{onStatus:r=>{o&&(o.text=`${e}${r}`);},onError:r=>{o?.stop(),o=void 0,D(`${e}${r}`);},onPause:()=>{o?.stop(),o=void 0;},onResume:r=>{o?.stop(),o=wc({text:`${e}${r}`}).start();}},stopSpinner:()=>{o?.stop(),o=void 0;}}}async function _D(e,a,o,t){let r=t;if(!o.force){r?.stop();let s=b(e),n=b(jt(e,o.scope));if(!await ee(`${a}Install external plugin "${s}"?
209
+ `),0}async function Jg(e){if(!await fe())return 1;try{return e.available?await zD(e):e.outdated?await WD(e):await JD(e)}catch(a){return S(a instanceof Error?a.message:"Failed to list plugins."),1}}To();j();U();I();var he=k("manage");function _s(e,a){return a?ce().find(o=>o.name===e&&o.scope===a):ce().find(o=>o.name===e)}function HD(e,a){let o=a;return {callbacks:{onStatus:r=>{o&&(o.text=`${e}${r}`);},onError:r=>{o?.stop(),o=void 0,P(`${e}${r}`);},onPause:()=>{o?.stop(),o=void 0;},onResume:r=>{o?.stop(),o=yc({text:`${e}${r}`}).start();}},stopSpinner:()=>{o?.stop(),o=void 0;}}}async function VD(e,a,o,t){let r=t;if(!o.force){r?.stop();let s=v(e),n=v(jt(e,o.scope));if(!await ee(`${a}Install external plugin "${s}"?
210
210
  This will run: ${n}
211
- [y/N] `))return be.debug(`[${e}] Installation cancelled by user`),o.silent||D(`${a}Skipped ${e} (cancelled).`),{name:e,success:true};o.silent||(r=wc({text:`${a}Installing ${e}...`}).start());}let i=r?VD(a,r):void 0;try{let s=await um(e,o.marketplaceSource,i?.callbacks,o.scope);if(i?.stopSpinner(),s.exitCode!==0){let n=s.stderr||"Command failed";return o.silent?Ne({status:"error",plugin:e,message:n}):S(`${a}Failed to install "${e}": ${n}`),{name:e,success:!1,error:n}}return o.silent?ve({status:"success",plugin:e,command:s.command,duration_ms:s.duration_ms}):K(`${a}${e} installed successfully (via proxy)`),{name:e,success:!0,duration_ms:s.duration_ms}}catch(s){i?.stopSpinner();let n=$(s);return o.silent?Ne({status:"error",plugin:e,message:n}):S(`${a}Failed to install "${e}": ${n}`),{name:e,success:false,error:n}}}async function XD(e,a,o){let t=o.silent?void 0:wc({text:`${a}Installing ${e}...`}).start();if(Gt(e))return _D(e,a,o,t);try{let r=await je(e,{...o,onDownloadProgress:o.silent?void 0:(i,s)=>{if(!t||s===0)return;let{bar:n,percent:d,label:l}=Yi(i,s);t.text=`${a}Downloading ${e}... ${n} ${d}% (${l})`;}});return t?.stop(),o.silent?ve({status:"success",plugin:e,version:r.version,duration_ms:r.duration_ms}):K(`${a}${e} v${r.version} installed successfully`),{name:e,success:!0,version:r.version,duration_ms:r.duration_ms}}catch(r){if(t?.stop(),r instanceof Xe)return o.silent?ve({status:"already_installed",plugin:e,message:r.message}):D(`${a}${r.message}`),{name:e,success:true};let i=$(r);return o.silent?Ne({status:"error",plugin:e,message:i}):S(`${a}Failed to install "${e}": ${i}`),{name:e,success:false,error:i}}}function KD(e){let a=e.filter(t=>t.success).length,o=e.filter(t=>!t.success).length;D(`
212
- Installation summary: ${a} succeeded, ${o} failed`);}async function $D(e,a){let o=new Map;if(a.source){for(let t of e)o.set(t,a.source);return o}try{let t=await oo();for(let r of e){let s=t.filter(n=>n.name===r).find(n=>n.contentSource);s?.contentSource&&o.set(r,s.contentSource);}}catch{}return o}async function ir(e,a={}){if(!await he())return 1;let o=[],t=await $D(e,a);for(let r=0;r<e.length;r++){let i=e.length>1?`[${r+1}/${e.length}] `:"",s=e[r],n=t.get(s)??a.source,d=await XD(s,i,{...a,source:n});o.push(d);}return e.length>1&&(a.silent?ve({status:"summary",succeeded:o.filter(r=>r.success).length,failed:o.filter(r=>!r.success).length,results:o.map(r=>({plugin:r.name,success:r.success,...r.error?{error:r.error}:{}}))}):KD(o)),o.some(r=>!r.success)?1:0}async function Xs(e,a){if(!await he())return 1;if(be.debug(`[${e}] Looking up installed plugin`),!a.force){let o=_s(e,a.scope);if(!o)return be.error(`[${e}] Plugin is not installed`),S(`Plugin "${e}" is not installed`),1;let t=b(o.name),r=o.version?b(o.version):void 0,i=a.scope?` (${a.scope})`:"";if(!await ee(`Remove ${t} ${r?`v${r}`:"(n/a)"}${i}? [y/N] `))return be.debug(`[${e}] Uninstall cancelled by user`),D("Operation cancelled."),0}try{return be.debug(`[${e}] Uninstalling plugin${a.scope?` (scope: ${a.scope})`:""}`),await Lr(e,a.scope),be.info(`[${e}] Uninstalled successfully`),K("Plugin removed successfully"),0}catch(o){return be.error(`[${e}] Failed to uninstall: ${$(o)}`),S($(o)),1}}async function Hg(e,a={}){if(!await he())return 1;be.debug(`[${e}] Looking up installed plugin`);let o=_s(e,a.scope);if(!o)return be.error(`[${e}] Plugin is not installed`),S(`Plugin "${e}" is not installed`),1;if(o.status==="enabled")return be.debug(`[${e}] Already enabled, skipping`),D(`${o.name} is already enabled`),0;try{return be.debug(`[${e}] Enabling plugin (current status: ${o.status})`),await Fr(e,"enabled",a.scope),be.info(`[${e}] Enabled successfully`),K(`${o.name} enabled successfully`),0}catch(t){return be.error(`[${e}] Failed to enable: ${$(t)}`),S($(t)),1}}async function Qg(e,a={}){if(!await he())return 1;be.debug(`[${e}] Looking up installed plugin`);let o=_s(e,a.scope);if(!o)return be.error(`[${e}] Plugin is not installed`),S(`Plugin "${e}" is not installed`),1;if(o.status==="disabled")return be.debug(`[${e}] Already disabled, skipping`),D(`${o.name} is already disabled`),0;try{return be.debug(`[${e}] Disabling plugin (current status: ${o.status})`),await Fr(e,"disabled",a.scope),be.info(`[${e}] Disabled successfully`),K(`${o.name} disabled successfully`),0}catch(t){return be.error(`[${e}] Failed to disable: ${$(t)}`),S($(t)),1}}async function Vg(e,a,o){o.silent||D(`${a}Updating ${e}...`);try{let t=await As(e,o);return o.silent?ve({status:"updated",plugin:t.name,previousVersion:t.previousVersion,newVersion:t.newVersion,duration_ms:t.duration_ms}):K(`${a}${t.name} v${t.previousVersion} \u2192 v${t.newVersion}`),{name:e,success:!0}}catch(t){if(t instanceof Io)return o.silent?ve({status:"up_to_date",plugin:e,message:t.message}):D(`${a}${t.message}`),{name:e,success:true,skipped:true};let r=$(t);return o.silent?Ne({status:"error",plugin:e,message:r}):S(`${a}Failed to update ${e}: ${r}`),{name:e,success:false,error:r}}}function YD(e){let a=e.filter(r=>r.success&&!r.skipped).length,o=e.filter(r=>r.skipped).length,t=e.filter(r=>!r.success).length;D(`
213
- Update summary: ${a} updated, ${o} already up to date, ${t} failed`);}async function ZD(e,a,o){try{let t=await Wt(e,o.source);ze(a,t.version,o.force)?D(`Would update ${e}: v${a} \u2192 v${t.version}`):D(`${e} is already up to date (v${a})`);}catch(t){return S($(t)),1}return 0}function ew(e){return new Map(e.filter(a=>!!a.version).map(a=>[a.name,a.version]))}function aw(e,a,o){let t=a.get(e.name);return t?e.version&&ze(e.version,t,o)?(D(`Would update ${e.name}: v${e.version} \u2192 v${t}`),true):(D(`${e.name} is already up to date (${e.version?`v${e.version}`:"n/a"})`),false):(D(`Skipping ${e.name}: not found in catalog`),false)}async function ow(e,a){try{let o=await oo(a.source),t=ew(o),r=0;for(let i of e)aw(i,t,a.force)&&r++;r===0&&D("All plugins are up to date");}catch(o){return S($(o)),1}return 0}async function tw(e,a){let o=[];for(let t=0;t<e.length;t++){let r=`[${t+1}/${e.length}] `,i=await Vg(e[t].name,r,a);o.push(i);}return a.silent?ve({status:"summary",updated:o.filter(t=>t.success&&!t.skipped).length,upToDate:o.filter(t=>t.skipped).length,failed:o.filter(t=>!t.success).length,results:o.map(t=>({plugin:t.name,success:t.success,...t.skipped?{skipped:true}:{},...t.error?{error:t.error}:{}}))}):YD(o),o.some(t=>!t.success)?1:0}async function _g(e,a={}){if(!await he())return 1;if(e){let r=_s(e,a.scope);return r?a.dryRun?ZD(e,r.version??"",a):(await Vg(e,"",a)).success?0:1:(a.silent?Ne({status:"error",plugin:e,message:`Plugin "${e}" is not installed`}):S(`Plugin "${e}" is not installed`),1)}let t=le().filter(r=>r.marketplace===pe);return t.length===0?(a.silent?ve({status:"empty",message:"No plugins installed"}):D("No plugins installed"),0):a.dryRun?ow(t,a):tw(t,a)}j();I();var oi=P("cli:bundle");function rw(e){let a=b(e.name??e.flowId),o=b(e.type??"unknown");return e.available?` \u2713 ${a} (${o})`:` \u2717 ${a} (${o}) \u2014 unavailable`}function iw(e,a){let o=a.filter(r=>r.available).length,t=a.length-o;process.stdout.write(`
214
- Bundle: ${b(e)} (${a.length} artifacts)
215
- `);for(let r of a)process.stdout.write(`${rw(r)}
211
+ [y/N] `))return he.debug(`[${e}] Installation cancelled by user`),o.silent||P(`${a}Skipped ${e} (cancelled).`),{name:e,success:true};o.silent||(r=yc({text:`${a}Installing ${e}...`}).start());}let i=r?HD(a,r):void 0;try{let s=await um(e,o.marketplaceSource,i?.callbacks,o.scope);if(i?.stopSpinner(),s.exitCode!==0){let n=s.stderr||"Command failed";return o.silent?Ne({status:"error",plugin:e,message:n}):S(`${a}Failed to install "${e}": ${n}`),{name:e,success:!1,error:n}}return o.silent?be({status:"success",plugin:e,command:s.command,duration_ms:s.duration_ms}):K(`${a}${e} installed successfully (via proxy)`),{name:e,success:!0,duration_ms:s.duration_ms}}catch(s){i?.stopSpinner();let n=$(s);return o.silent?Ne({status:"error",plugin:e,message:n}):S(`${a}Failed to install "${e}": ${n}`),{name:e,success:false,error:n}}}async function QD(e,a,o){let t=o.silent?void 0:yc({text:`${a}Installing ${e}...`}).start();if(Gt(e))return VD(e,a,o,t);try{let r=await je(e,{...o,onDownloadProgress:o.silent?void 0:(i,s)=>{if(!t||s===0)return;let{bar:n,percent:d,label:l}=Yi(i,s);t.text=`${a}Downloading ${e}... ${n} ${d}% (${l})`;}});return t?.stop(),o.silent?be({status:"success",plugin:e,version:r.version,duration_ms:r.duration_ms}):K(`${a}${e} v${r.version} installed successfully`),{name:e,success:!0,version:r.version,duration_ms:r.duration_ms}}catch(r){if(t?.stop(),r instanceof Xe)return o.silent?be({status:"already_installed",plugin:e,message:r.message}):P(`${a}${r.message}`),{name:e,success:true};let i=$(r);return o.silent?Ne({status:"error",plugin:e,message:i}):S(`${a}Failed to install "${e}": ${i}`),{name:e,success:false,error:i}}}function _D(e){let a=e.filter(t=>t.success).length,o=e.filter(t=>!t.success).length;P(`
212
+ Installation summary: ${a} succeeded, ${o} failed`);}async function XD(e,a){let o=new Map;if(a.source){for(let t of e)o.set(t,a.source);return o}try{let t=await oo();for(let r of e){let s=t.filter(n=>n.name===r).find(n=>n.contentSource);s?.contentSource&&o.set(r,s.contentSource);}}catch{}return o}async function ir(e,a={}){if(!await fe())return 1;let o=[],t=await XD(e,a);for(let r=0;r<e.length;r++){let i=e.length>1?`[${r+1}/${e.length}] `:"",s=e[r],n=t.get(s)??a.source,d=await QD(s,i,{...a,source:n});o.push(d);}return e.length>1&&(a.silent?be({status:"summary",succeeded:o.filter(r=>r.success).length,failed:o.filter(r=>!r.success).length,results:o.map(r=>({plugin:r.name,success:r.success,...r.error?{error:r.error}:{}}))}):_D(o)),o.some(r=>!r.success)?1:0}async function Xs(e,a){if(!await fe())return 1;if(he.debug(`[${e}] Looking up installed plugin`),!a.force){let o=_s(e,a.scope);if(!o)return he.error(`[${e}] Plugin is not installed`),S(`Plugin "${e}" is not installed`),1;let t=v(o.name),r=o.version?v(o.version):void 0,i=a.scope?` (${a.scope})`:"";if(!await ee(`Remove ${t} ${r?`v${r}`:"(n/a)"}${i}? [y/N] `))return he.debug(`[${e}] Uninstall cancelled by user`),P("Operation cancelled."),0}try{return he.debug(`[${e}] Uninstalling plugin${a.scope?` (scope: ${a.scope})`:""}`),await Lr(e,a.scope),he.info(`[${e}] Uninstalled successfully`),K("Plugin removed successfully"),0}catch(o){return he.error(`[${e}] Failed to uninstall: ${$(o)}`),S($(o)),1}}async function Hg(e,a={}){if(!await fe())return 1;he.debug(`[${e}] Looking up installed plugin`);let o=_s(e,a.scope);if(!o)return he.error(`[${e}] Plugin is not installed`),S(`Plugin "${e}" is not installed`),1;if(o.status==="enabled")return he.debug(`[${e}] Already enabled, skipping`),P(`${o.name} is already enabled`),0;try{return he.debug(`[${e}] Enabling plugin (current status: ${o.status})`),await Fr(e,"enabled",a.scope),he.info(`[${e}] Enabled successfully`),K(`${o.name} enabled successfully`),0}catch(t){return he.error(`[${e}] Failed to enable: ${$(t)}`),S($(t)),1}}async function Vg(e,a={}){if(!await fe())return 1;he.debug(`[${e}] Looking up installed plugin`);let o=_s(e,a.scope);if(!o)return he.error(`[${e}] Plugin is not installed`),S(`Plugin "${e}" is not installed`),1;if(o.status==="disabled")return he.debug(`[${e}] Already disabled, skipping`),P(`${o.name} is already disabled`),0;try{return he.debug(`[${e}] Disabling plugin (current status: ${o.status})`),await Fr(e,"disabled",a.scope),he.info(`[${e}] Disabled successfully`),K(`${o.name} disabled successfully`),0}catch(t){return he.error(`[${e}] Failed to disable: ${$(t)}`),S($(t)),1}}async function Qg(e,a,o){o.silent||P(`${a}Updating ${e}...`);try{let t=await As(e,o);return o.silent?be({status:"updated",plugin:t.name,previousVersion:t.previousVersion,newVersion:t.newVersion,duration_ms:t.duration_ms}):K(`${a}${t.name} v${t.previousVersion} \u2192 v${t.newVersion}`),{name:e,success:!0}}catch(t){if(t instanceof Io)return o.silent?be({status:"up_to_date",plugin:e,message:t.message}):P(`${a}${t.message}`),{name:e,success:true,skipped:true};let r=$(t);return o.silent?Ne({status:"error",plugin:e,message:r}):S(`${a}Failed to update ${e}: ${r}`),{name:e,success:false,error:r}}}function KD(e){let a=e.filter(r=>r.success&&!r.skipped).length,o=e.filter(r=>r.skipped).length,t=e.filter(r=>!r.success).length;P(`
213
+ Update summary: ${a} updated, ${o} already up to date, ${t} failed`);}async function $D(e,a,o){try{let t=await Wt(e,o.source);ze(a,t.version,o.force)?P(`Would update ${e}: v${a} \u2192 v${t.version}`):P(`${e} is already up to date (v${a})`);}catch(t){return S($(t)),1}return 0}function YD(e){return new Map(e.filter(a=>!!a.version).map(a=>[a.name,a.version]))}function ZD(e,a,o){let t=a.get(e.name);return t?e.version&&ze(e.version,t,o)?(P(`Would update ${e.name}: v${e.version} \u2192 v${t}`),true):(P(`${e.name} is already up to date (${e.version?`v${e.version}`:"n/a"})`),false):(P(`Skipping ${e.name}: not found in catalog`),false)}async function ew(e,a){try{let o=await oo(a.source),t=YD(o),r=0;for(let i of e)ZD(i,t,a.force)&&r++;r===0&&P("All plugins are up to date");}catch(o){return S($(o)),1}return 0}async function aw(e,a){let o=[];for(let t=0;t<e.length;t++){let r=`[${t+1}/${e.length}] `,i=await Qg(e[t].name,r,a);o.push(i);}return a.silent?be({status:"summary",updated:o.filter(t=>t.success&&!t.skipped).length,upToDate:o.filter(t=>t.skipped).length,failed:o.filter(t=>!t.success).length,results:o.map(t=>({plugin:t.name,success:t.success,...t.skipped?{skipped:true}:{},...t.error?{error:t.error}:{}}))}):KD(o),o.some(t=>!t.success)?1:0}async function _g(e,a={}){if(!await fe())return 1;if(e){let r=_s(e,a.scope);return r?a.dryRun?$D(e,r.version??"",a):(await Qg(e,"",a)).success?0:1:(a.silent?Ne({status:"error",plugin:e,message:`Plugin "${e}" is not installed`}):S(`Plugin "${e}" is not installed`),1)}let t=ce().filter(r=>r.marketplace===ue);return t.length===0?(a.silent?be({status:"empty",message:"No plugins installed"}):P("No plugins installed"),0):a.dryRun?ew(t,a):aw(t,a)}j();I();var oi=k("cli:bundle");function ow(e){let a=v(e.name??e.flowId),o=v(e.type??"unknown");return e.available?` \u2713 ${a} (${o})`:` \u2717 ${a} (${o}) \u2014 unavailable`}function tw(e,a){let o=a.filter(r=>r.available).length,t=a.length-o;process.stdout.write(`
214
+ Bundle: ${v(e)} (${a.length} artifacts)
215
+ `);for(let r of a)process.stdout.write(`${ow(r)}
216
216
  `);process.stdout.write(`
217
217
  ${o} available for installation`),t>0&&process.stdout.write(` | ${t} unavailable`),process.stdout.write(`
218
218
 
219
- `);}async function Xg(e){if(!e.trim())return S("Bundle name cannot be empty."),1;if(!await he())return 1;oi.debug(`Fetching bundle "${e}"`);let o;try{o=await Ts(e);}catch(n){return n instanceof Zt||n instanceof Kr?(S(n.message),1):(S(`Failed to fetch bundle: ${n instanceof Error?n.message:String(n)}`),1)}let t=o.artifact.artifacts,r=t.filter(n=>n.available);if(oi.debug(`Bundle "${o.title}" \u2014 ${t.length} artifact(s), ${r.length} available`),iw(o.title,t),r.length===0)return S("No artifacts available for installation in this bundle."),1;if(!await ee(`Install ${r.length} artifact(s)? [Y/n] `))return oi.debug("Installation cancelled by user"),0;oi.debug(`Starting installation of ${r.length} artifact(s)`);let s=await ws(o,{onProgress:({index:n,total:d,artifact:l,success:c,error:u})=>{let p=b(l.name??l.flowId),m=b(l.type??"unknown"),g=c?"\u2713":`\u2717 (${b(u??"failed")})`;n===1&&process.stdout.write(`
220
- `),process.stdout.write(`[${n}/${d}] Installing ${p} (${m})... ${g}
219
+ `);}async function Xg(e){if(!e.trim())return S("Bundle name cannot be empty."),1;if(!await fe())return 1;oi.debug(`Fetching bundle "${e}"`);let o;try{o=await Ts(e);}catch(n){return n instanceof Zt||n instanceof Kr?(S(n.message),1):(S(`Failed to fetch bundle: ${n instanceof Error?n.message:String(n)}`),1)}let t=o.artifact.artifacts,r=t.filter(n=>n.available);if(oi.debug(`Bundle "${o.title}" \u2014 ${t.length} artifact(s), ${r.length} available`),tw(o.title,t),r.length===0)return S("No artifacts available for installation in this bundle."),1;if(!await ee(`Install ${r.length} artifact(s)? [Y/n] `))return oi.debug("Installation cancelled by user"),0;oi.debug(`Starting installation of ${r.length} artifact(s)`);let s=await ws(o,{onProgress:({index:n,total:d,artifact:l,success:c,error:u})=>{let m=v(l.name??l.flowId),p=v(l.type??"unknown"),g=c?"\u2713":`\u2717 (${v(u??"failed")})`;n===1&&process.stdout.write(`
220
+ `),process.stdout.write(`[${n}/${d}] Installing ${m} (${p})... ${g}
221
221
  `),n===d&&process.stdout.write(`
222
- `);}});if(oi.debug(`Installation complete \u2014 ${s.installed} installed, ${s.failed} failed, ${s.skipped} skipped`),s.installed>0&&K(`${s.installed} installed successfully`),s.failed>0){let n=s.failures.map(d=>d.name).join(", ");S(`${s.failed} failed: ${b(n)}`);}if(s.skipped>0){let n=t.filter(d=>!d.available).map(d=>b(d.name??d.flowId)).join(", ");D(`${s.skipped} unavailable: ${n}`);}return 0}To();j();I();var Kg=P("marketplace");function nw(e){return `claude plugin marketplace add ${e}`}async function $g(e,a){if(!await he())return 1;let o;try{o=ss(e);}catch(i){let s=$(i);return a.silent?Ne({status:"error",source:e,message:s}):S(s),1}Kg.debug(`[marketplace] Adding marketplace source: ${o}`);let t=nw(o);if(!a.force){let i=b(o),s=b(t);if(!await ee(`Add marketplace "${i}"?
222
+ `);}});if(oi.debug(`Installation complete \u2014 ${s.installed} installed, ${s.failed} failed, ${s.skipped} skipped`),s.installed>0&&K(`${s.installed} installed successfully`),s.failed>0){let n=s.failures.map(d=>d.name).join(", ");S(`${s.failed} failed: ${v(n)}`);}if(s.skipped>0){let n=t.filter(d=>!d.available).map(d=>v(d.name??d.flowId)).join(", ");P(`${s.skipped} unavailable: ${n}`);}return 0}To();j();I();var Kg=k("marketplace");function iw(e){return `claude plugin marketplace add ${e}`}async function $g(e,a){if(!await fe())return 1;let o;try{o=ss(e);}catch(i){let s=$(i);return a.silent?Ne({status:"error",source:e,message:s}):S(s),1}Kg.debug(`[marketplace] Adding marketplace source: ${o}`);let t=iw(o);if(!a.force){let i=v(o),s=v(t);if(!await ee(`Add marketplace "${i}"?
223
223
  This will run: ${s}
224
- [y/N] `))return Kg.debug("[marketplace] Operation cancelled by user"),D("Operation cancelled."),0}let r=a.silent?void 0:wc({text:`Adding marketplace "${b(o)}"...`}).start();try{let i=await qe(t);return r?.stop(),i.exitCode!==0?(a.silent?Ne({status:"error",source:o,exitCode:i.exitCode,message:i.stderr||"Command failed"}):(S(`Failed to add marketplace "${o}": ${i.stderr||"Command failed"}`),a.verbose&&i.stdout&&D(`stdout: ${i.stdout}`)),1):(a.silent?ve({status:"success",source:o,command:t,duration_ms:i.duration_ms}):(K(`Marketplace "${o}" added successfully`),a.verbose&&i.stdout&&D(i.stdout)),0)}catch(i){r?.stop();let s=$(i);return a.silent?Ne({status:"error",source:o,message:s}):S(`Failed to add marketplace "${o}": ${s}`),1}}Re();j();async function uw(){return await Y()?{passed:true,message:"Credentials configured"}:{passed:false,message:"Credentials not configured \u2014 Run `flow auth login`"}}async function pw(){let e=Date.now();try{await oo();let a=Date.now()-e;return {passed:!0,message:`Prompt Manager accessible (${a}ms)`,latency:a}}catch(a){return a instanceof Error&&a.name==="TimeoutError"?{passed:false,message:"Timeout after 5s \u2014 check your connection"}:{passed:false,message:`Connection error: ${a instanceof Error?a.message:"Unknown"}`}}}async function mw(){return await Po()?{passed:true,message:"Token is valid"}:{passed:false,message:"Token expired \u2014 run `flow auth login` to re-authenticate"}}function gw(){let e=join(homedir(),".claude","settings.json");return existsSync(e)?{passed:true,message:"Claude Code detected"}:{passed:false,message:"Claude Code not detected"}}function fw(){let e=Vs();if(e.length!==0){process.stdout.write(`
224
+ [y/N] `))return Kg.debug("[marketplace] Operation cancelled by user"),P("Operation cancelled."),0}let r=a.silent?void 0:yc({text:`Adding marketplace "${v(o)}"...`}).start();try{let i=await qe(t);return r?.stop(),i.exitCode!==0?(a.silent?Ne({status:"error",source:o,exitCode:i.exitCode,message:i.stderr||"Command failed"}):(S(`Failed to add marketplace "${o}": ${i.stderr||"Command failed"}`),a.verbose&&i.stdout&&P(`stdout: ${i.stdout}`)),1):(a.silent?be({status:"success",source:o,command:t,duration_ms:i.duration_ms}):(K(`Marketplace "${o}" added successfully`),a.verbose&&i.stdout&&P(i.stdout)),0)}catch(i){r?.stop();let s=$(i);return a.silent?Ne({status:"error",source:o,message:s}):S(`Failed to add marketplace "${o}": ${s}`),1}}Re();j();async function cw(){return await Y()?{passed:true,message:"Credentials configured"}:{passed:false,message:"Credentials not configured \u2014 Run `flow auth login`"}}async function lw(){let e=Date.now();try{await oo();let a=Date.now()-e;return {passed:!0,message:`Prompt Manager accessible (${a}ms)`,latency:a}}catch(a){return a instanceof Error&&a.name==="TimeoutError"?{passed:false,message:"Timeout after 5s \u2014 check your connection"}:{passed:false,message:`Connection error: ${a instanceof Error?a.message:"Unknown"}`}}}async function uw(){return await Po()?{passed:true,message:"Token is valid"}:{passed:false,message:"Token expired \u2014 run `flow auth login` to re-authenticate"}}function pw(){let e=join(homedir(),".claude","settings.json");return existsSync(e)?{passed:true,message:"Claude Code detected"}:{passed:false,message:"Claude Code not detected"}}function mw(){let e=Qs();if(e.length!==0){process.stdout.write(`
225
225
  `+R.bold(` Marketplace Auto-Update
226
226
 
227
- `));for(let a of e){let o=a.enabled?R.green("[ON] "):R.dim("[OFF]"),t=b(a.name).padEnd(20),r=b(zg(a));process.stdout.write(` ${o} ${t} ${R.dim(r)}
228
- `);}}}function hw(){process.stdout.write(`
227
+ `));for(let a of e){let o=a.enabled?R.green("[ON] "):R.dim("[OFF]"),t=v(a.name).padEnd(20),r=v(zg(a));process.stdout.write(` ${o} ${t} ${R.dim(r)}
228
+ `);}}}function gw(){process.stdout.write(`
229
229
  `+R.bold(` FlowSetup CLI \u2014 Auto-Update Fix
230
230
 
231
- `));let e=Wg();for(let a of e.fixed)process.stdout.write(` ${R.green("[FIXED]")} ${b(a)} \u2014 autoUpdate: true set
232
- `);for(let{name:a,reason:o}of e.skipped)process.stdout.write(` ${R.dim("[SKIP] ")} ${b(a)} \u2014 ${b(o)}
231
+ `));let e=Wg();for(let a of e.fixed)process.stdout.write(` ${R.green("[FIXED]")} ${v(a)} \u2014 autoUpdate: true set
232
+ `);for(let{name:a,reason:o}of e.skipped)process.stdout.write(` ${R.dim("[SKIP] ")} ${v(a)} \u2014 ${v(o)}
233
233
  `);return process.stdout.write(`
234
234
  `),e.fixed.length===0?process.stdout.write(R.dim(` Nothing to fix \u2014 all set.
235
235
 
236
236
  `)):process.stdout.write(R.green(` \u2713 ${e.fixed.length} marketplace(s) updated.
237
237
 
238
- `)),0}async function Yg(e={}){if(e.fix)return hw();process.stdout.write(`
238
+ `)),0}async function Yg(e={}){if(e.fix)return gw();process.stdout.write(`
239
239
  `+R.bold(` FlowSetup CLI Diagnostics
240
240
 
241
- `));let a=[{name:"Credentials",fn:uw},{name:"Prompt Manager",fn:pw},{name:"Valid Token",fn:mw},{name:"Claude Code",fn:gw}],o=true;for(let t of a){let r=await t.fn(),i="",s=R.green;r.passed?i=R.green("[OK] "):(i=R.red("[FAIL]"),s=R.red,o=false);let n=` ${i} ${s(t.name.padEnd(18))} ${b(r.message)}`;process.stdout.write(n+`
242
- `);}return fw(),process.stdout.write(`
241
+ `));let a=[{name:"Credentials",fn:cw},{name:"Prompt Manager",fn:lw},{name:"Valid Token",fn:uw},{name:"Claude Code",fn:pw}],o=true;for(let t of a){let r=await t.fn(),i="",s=R.green;r.passed?i=R.green("[OK] "):(i=R.red("[FAIL]"),s=R.red,o=false);let n=` ${i} ${s(t.name.padEnd(18))} ${v(r.message)}`;process.stdout.write(n+`
242
+ `);}return mw(),process.stdout.write(`
243
243
  `),o?(process.stdout.write(R.green(` \u2713 All checks passed!
244
244
 
245
245
  `)),0):(process.stdout.write(R.red(` \u2717 Some checks failed \u2014 verify your configuration
246
246
 
247
- `)),1)}Re();_o();U();async function Zg(e){let a=await Y(),o=Fa("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/"),t={Authorization:`Bearer ${e}`,accept:"application/json"};if(a?.tenant){if(!Ka.test(a.tenant))throw new Error(`Invalid tenant value: "${a.tenant}"`);t.FlowTenant=a.tenant;}let r=await _u.get(`${o}rate-limit/me`,{searchParams:{mode:"budget"},headers:t}).json();if(typeof r.consumed_usd!="number"||typeof r.budget_limit!="number"||typeof r.percentage!="number")throw new Error("Unexpected budget response shape: missing consumed_usd, budget_limit, or percentage");return r}xt();Ii();Re();j();I();var vw=P("commands:usage"),Ks=20,ef="EMAIL",af="MONTHLY CONSUMPTION (USD)",of="STATUS";function yw(e){let a=Math.min(100,Math.max(0,e)),o=Math.round(a/100*Ks),t=Ks-o,r=R.green;return a>=90?r=R.red:a>=70&&(r=R.yellow),r("\u2588".repeat(o))+R.dim("\u2591".repeat(t))}function tf(e){return `$ ${e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function kw(e){let a=e.toLowerCase(),o=b(e),t=o.charAt(0).toUpperCase()+o.slice(1).toLowerCase();return a==="ok"||a==="unblocked"?R.green(`\u2299 ${t}`):a==="warning"?R.yellow(`\u26A0 ${t}`):a==="blocked"?R.red("\u2717 Budget limit reached"):R.red(`\u2717 ${t}`)}function Pw(e){let a=qa(e),o=Math.ceil((new Date(e).getTime()-Date.now())/864e5),t=o>0?` (in ${o} day${o===1?"":"s"})`:"";return `${a}${t}`}async function Dw(e){try{let a=await Rt();if(a?.email)return b(a.email);let o=At(e);return b(o.email??"")}catch(a){return vw.debug(`JWT email decode failed: ${String(a)}`),""}}async function rf(e){if(!await he())return 1;let o;try{o=await Oa();}catch(h){return S(`Authentication error: ${$(h)}`),1}let t;try{t=await Zg(o);}catch(h){return S(`Failed to fetch usage data: ${$(h)}`),1}if(e.json)return bo(t),0;let r=await Dw(o)||b(t.user_id),i=tf(t.consumed_usd),s=tf(t.budget_limit),n=`${t.percentage.toFixed(1)}%`,d=`${i} / ${s} (${n})`,l=Math.max(ef.length,r.length+2),c=Math.max(af.length,Ks+2+d.length),u=` ${ef.padEnd(l)} ${af.padEnd(c)} ${of}`,p=` ${"\u2500".repeat(l)} ${"\u2500".repeat(c)} ${"\u2500".repeat(of.length)}`,m=`${R.cyan("\u2022")} ${r.padEnd(l-2)}`,g=`${yw(t.percentage)} ${d.padEnd(c-Ks-2)}`,f=` ${R.dim("Resets")} ${Pw(t.renewal_date)}`;return process.stdout.write(`
247
+ `)),1)}Re();_o();U();async function Zg(e){let a=await Y(),o=Fa("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/"),t={Authorization:`Bearer ${e}`,accept:"application/json"};if(a?.tenant){if(!$a.test(a.tenant))throw new Error(`Invalid tenant value: "${a.tenant}"`);t.FlowTenant=a.tenant;}let r=await Qu.get(`${o}rate-limit/me`,{searchParams:{mode:"budget"},headers:t}).json();if(typeof r.consumed_usd!="number"||typeof r.budget_limit!="number"||typeof r.percentage!="number")throw new Error("Unexpected budget response shape: missing consumed_usd, budget_limit, or percentage");return r}xt();Ii();Re();j();I();var hw=k("commands:usage"),Ks=20,ef="EMAIL",af="MONTHLY CONSUMPTION (USD)",of="STATUS";function bw(e){let a=Math.min(100,Math.max(0,e)),o=Math.round(a/100*Ks),t=Ks-o,r=R.green;return a>=90?r=R.red:a>=70&&(r=R.yellow),r("\u2588".repeat(o))+R.dim("\u2591".repeat(t))}function tf(e){return `$ ${e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function vw(e){let a=e.toLowerCase(),o=v(e),t=o.charAt(0).toUpperCase()+o.slice(1).toLowerCase();return a==="ok"||a==="unblocked"?R.green(`\u2299 ${t}`):a==="warning"?R.yellow(`\u26A0 ${t}`):a==="blocked"?R.red("\u2717 Budget limit reached"):R.red(`\u2717 ${t}`)}function yw(e){let a=qa(e),o=Math.ceil((new Date(e).getTime()-Date.now())/864e5),t=o>0?` (in ${o} day${o===1?"":"s"})`:"";return `${a}${t}`}async function kw(e){try{let a=await Rt();if(a?.email)return v(a.email);let o=At(e);return v(o.email??"")}catch(a){return hw.debug(`JWT email decode failed: ${String(a)}`),""}}async function rf(e){if(!await fe())return 1;let o;try{o=await Oa();}catch(h){return S(`Authentication error: ${$(h)}`),1}let t;try{t=await Zg(o);}catch(h){return S(`Failed to fetch usage data: ${$(h)}`),1}if(e.json)return bo(t),0;let r=await kw(o)||v(t.user_id),i=tf(t.consumed_usd),s=tf(t.budget_limit),n=`${t.percentage.toFixed(1)}%`,d=`${i} / ${s} (${n})`,l=Math.max(ef.length,r.length+2),c=Math.max(af.length,Ks+2+d.length),u=` ${ef.padEnd(l)} ${af.padEnd(c)} ${of}`,m=` ${"\u2500".repeat(l)} ${"\u2500".repeat(c)} ${"\u2500".repeat(of.length)}`,p=`${R.cyan("\u2022")} ${r.padEnd(l-2)}`,g=`${bw(t.percentage)} ${d.padEnd(c-Ks-2)}`,f=` ${R.dim("Resets")} ${yw(t.renewal_date)}`;return process.stdout.write(`
248
248
  `),process.stdout.write(R.dim(u)+`
249
- `),process.stdout.write(R.dim(p)+`
250
- `),process.stdout.write(` ${m} ${g} ${kw(t.status)}
249
+ `),process.stdout.write(R.dim(m)+`
250
+ `),process.stdout.write(` ${p} ${g} ${vw(t.status)}
251
251
  `),process.stdout.write(f+`
252
252
  `),process.stdout.write(`
253
- `),0}var Cw=["github.com","www.github.com"],Rw=/^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.@-]+)(\/.*)?$/,Aw=/^([^@]+)@(.+)$/;function xw(e){return !!(isAbsolute(e)||e==="."||e===".."||e.startsWith("./")||e.startsWith("../")||e.startsWith(".\\")||e.startsWith("..\\")||/^[a-zA-Z]:[/\\]/.test(e))}function Sc(e){let a=e.replace(/\\/g,"/");a=a.replace(/^\/+/,"").replace(/\/+$/,"");let o=a.split("/").filter(Boolean);for(let t of o)if(t==="..")throw new Error(`Invalid subpath: "${e}" contains path traversal ("..").`);return o.join("/")}function Ew(e){let a=e.pathname.split("/").filter(Boolean);if(a.length<2)throw new Error(`Invalid GitHub URL: expected at least owner/repo in "${e.href}"`);let o=a[0],t=a[1];t.endsWith(".git")&&(t=t.slice(0,-4));let r={type:"github",url:`https://github.com/${o}/${t}.git`};if(a.length>=3&&(a[2]==="tree"||a[2]==="blob")){if(a.length>=4&&(r.ref=a[3]),a.length>=5){let i=a.slice(4).join("/");r.subpath=Sc(i);}}else if(a.length>2){let i=a.slice(2).join("/");r.subpath=Sc(i);}return e.hash&&e.hash.length>1&&(r.ref=decodeURIComponent(e.hash.slice(1))),r}function $s(e){let a=e.trim();if(!a)throw new Error("Skill source cannot be empty.");if(xw(a)){let o=resolve(a);return {type:"local",url:o,localPath:o}}try{let o=new URL(a);if((o.protocol==="https:"||o.protocol==="http:")&&Cw.includes(o.hostname))return Ew(o);if(o.protocol==="https:"||o.protocol==="http:"){let t={type:"git",url:a};return o.hash&&o.hash.length>1&&(t.ref=decodeURIComponent(o.hash.slice(1)),t.url=a.replace(o.hash,"")),t}if(o.protocol==="git:"){let t={type:"git",url:a};return o.hash&&o.hash.length>1&&(t.ref=decodeURIComponent(o.hash.slice(1)),t.url=a.replace(o.hash,"")),t}}catch{}if(a.startsWith("git@")||a.includes(":")&&a.includes(".git")){let o=a,t,r=a.indexOf("#");r!==-1&&(t=a.slice(r+1),o=a.slice(0,r));let i={type:"git",url:o};return t&&(i.ref=t),i}{let o=a,t,r=o.indexOf("#");r!==-1&&(t=o.slice(r+1),o=o.slice(0,r));let i=o.match(Rw);if(i){let s=i[1],n=i[2],d=i[3],l,c=n.match(Aw);c&&(n=c[1],l=c[2]),n.endsWith(".git")&&(n=n.slice(0,-4));let u={type:"github",url:`https://github.com/${s}/${n}.git`};if(t&&(u.ref=t),l&&(u.skillFilter=l),d){let p=d.replace(/^\//,"");p&&(u.subpath=Sc(p));}return u}}return {type:"git",url:a}}function Ys(e){if(e.type!=="github")return null;try{let o=new URL(e.url).pathname.split("/").filter(Boolean);if(o.length<2)return null;let t=o[1];return t.endsWith(".git")&&(t=t.slice(0,-4)),`${o[0]}/${t}`}catch{return null}}function sf(e){let a=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);return a?{data:parse(a[1])??{},content:a[2]??""}:{data:{},content:e}}var Rc=new Set(["node_modules",".git","dist","build","__pycache__"]);function cf(e,a){let o=normalize(resolve(e)),t=normalize(resolve(a));return t.startsWith(o+sep)||t===o}function Lw(e,a){let o=normalize(resolve(e)),t=normalize(resolve(join(e,a)));return t.startsWith(o+sep)||t===o}async function Cc(e){try{let a=join(e,"SKILL.md");return (await stat(a)).isFile()}catch{return false}}async function ti(e){try{let a=await readFile(e,"utf-8"),{data:o}=sf(a);return typeof o.name!="string"||typeof o.description!="string"?null:{name:o.name,description:o.description,path:dirname(e),rawContent:a,metadata:o.metadata}}catch{return null}}async function lf(e,a=0,o=5){if(a>o)return [];try{let[t,r]=await Promise.all([Cc(e),readdir(e,{withFileTypes:!0}).catch(()=>[])]),i=t?[e]:[],s=await Promise.all(r.filter(n=>n.isDirectory()&&!Rc.has(n.name)).map(n=>lf(join(e,n.name),a+1,o)));return [...i,...s.flat()]}catch{return []}}async function an(e,a){let o=[],t=new Set;if(a&&!Lw(e,a))throw new Error(`Invalid subpath: "${a}" resolves outside the repository directory.`);let r=a?join(e,a):e;if(await Cc(r)){let s=await ti(join(r,"SKILL.md"));if(s)return o.push(s),t.add(s.name),o}let i=[r,join(r,"skills"),join(r,".claude/skills"),join(r,".agents/skills")];for(let s of i)try{let n=await readdir(s,{withFileTypes:!0});for(let d of n){if(!d.isDirectory())continue;let l=join(s,d.name);if(await Cc(l)){let c=await ti(join(l,"SKILL.md"));c&&!t.has(c.name)&&(o.push(c),t.add(c.name));}}}catch{}if(o.length===0){let s=await lf(r);for(let n of s){let d=await ti(join(n,"SKILL.md"));d&&!t.has(d.name)&&(o.push(d),t.add(d.name));}}return o}function uf(e,a){let o=a.map(t=>t.toLowerCase());return e.filter(t=>{let r=t.name.toLowerCase();return o.some(i=>i===r)})}Oe();var ff=1,jw={retries:5,minTimeout:50};async function hf(e,a){mkdirSync(dirname(e),{recursive:true});let o=await Vb.lock(e+".lock",{realpath:false,retries:jw});try{return await a()}finally{await o();}}function pf(){return {version:ff,skills:{}}}async function on(e){let a=lr(e);try{let o=await readFile(a,"utf-8"),t=JSON.parse(o);return !t.version||t.version<ff?pf():t}catch{return pf()}}function Uw(e){let a={};for(let o of Object.keys(e).sort())a[o]=e[o];return a}async function bf(e,a){let o=lr(a);mkdirSync(dirname(o),{recursive:true});let t={version:e.version,skills:Uw(e.skills)},r=`${o}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(t,null,2)+`
254
- `,{encoding:"utf-8",mode:384}),renameSync(r,o);}async function vf(e,a,o){let t=lr(o);await hf(t,async()=>{let r=await on(o),i=new Date().toISOString(),s=r.skills[e];r.skills[e]={...a,installedAt:s?.installedAt??i,updatedAt:i},await bf(r,o);});}async function yf(e,a){let o=lr(a);await hf(o,async()=>{let t=await on(a);e in t.skills&&(delete t.skills[e],await bf(t,a));});}Oe();I();var kf=P("skillInstaller");async function Xw(e,a,o,t){try{await C(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:"skill",source:"external",scope:a,version:o,duration_ms:t,interface:Z().interfaceType});}catch(r){kf.warn(`Failed to send skill install metrics: ${String(r)}`);}}async function Kw(e,a){try{await C(w.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:"skill",source:"external",error_code:a instanceof Error?a.name:"UNKNOWN",error_message:(a instanceof Error?a.message:String(a)).slice(0,500),interface:Z().interfaceType});}catch(o){kf.warn(`Failed to send skill install-failed metrics: ${String(o)}`);}}async function $w(e,a){await cp(e,a,{recursive:true,dereference:false,filter:o=>{if(Rc.has(basename(o)))return false;try{return !lstatSync(o).isSymbolicLink()}catch{return false}}});}async function Yw(e,a,o){let t=da(e.name),r=Ho(a),i=join(r,t);if(!cf(r,i))return {skill:e.name,success:false,path:i,error:`Unsafe install path: "${i}" escapes skills directory`};try{await rm$1(i,{recursive:!0,force:!0}),await mkdir(i,{recursive:!0}),await $w(e.path,i);let n=Ys(o)??o.url;return await vf(t,{source:n,sourceType:o.type,sourceUrl:o.url,ref:o.ref,skillPath:o.subpath},a),{skill:e.name,success:!0,path:i}}catch(s){return {skill:e.name,success:false,path:i,error:s instanceof Error?s.message:String(s)}}}async function Pf(e,a){let o=$s(e),t;try{let r;if(o.type==="local"){if(!o.localPath||!existsSync(o.localPath))return {source:e,results:[],discovered:0,installed:0,failed:0};r=o.localPath;}else t=await Ca(o.url,o.ref),r=t;let i=await an(r,o.subpath),s=[...a.skillFilter??[]];o.skillFilter&&s.push(o.skillFilter);let n=s.length>0?uf(i,s):i,d=[],l=o.ref??"latest";for(let c of n){let u=Date.now(),p=await Yw(c,a.scope,o);d.push(p);let m=Date.now()-u;p.success?await Xw(c.name,a.scope,l,m):await Kw(c.name,new Error(p.error??"Unknown error"));}return {source:e,results:d,discovered:i.length,installed:d.filter(c=>c.success).length,failed:d.filter(c=>!c.success).length}}finally{t&&await Ra(t).catch(()=>{});}}Oe();j();I();var tS=P("skills");async function rS(e){try{await C(w.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:"skill",source:"external",interface:Z().interfaceType});}catch(a){tS.warn(`Failed to send skill uninstall metrics: ${String(a)}`);}}async function iS(e){let a=createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(`${b(e)} (y/N) `,t=>{a.close(),o(t.trim().toLowerCase()==="y");});})}async function sS(e){let a=$s(e),o;try{let t;if(a.type==="local"){if(!a.localPath)return S("Invalid local path."),1;t=a.localPath;}else D(`Fetching skills from ${b(e)}...`),o=await Ca(a.url,a.ref),t=o;let r=await an(t,a.subpath);if(r.length===0)return D("No skills found in this source."),0;let s=Ys(a)??b(e);D(`Found ${r.length} skill(s) in ${s}:
255
- `);for(let n of r){let d=b(n.name),l=b(n.description);process.stdout.write(` ${R.bold(d)} ${R.dim(l)}
253
+ `),0}var ww=["github.com","www.github.com"],Sw=/^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.@-]+)(\/.*)?$/,Cw=/^([^@]+)@(.+)$/;function Rw(e){return !!(isAbsolute(e)||e==="."||e===".."||e.startsWith("./")||e.startsWith("../")||e.startsWith(".\\")||e.startsWith("..\\")||/^[a-zA-Z]:[/\\]/.test(e))}function kc(e){let a=e.replace(/\\/g,"/");a=a.replace(/^\/+/,"").replace(/\/+$/,"");let o=a.split("/").filter(Boolean);for(let t of o)if(t==="..")throw new Error(`Invalid subpath: "${e}" contains path traversal ("..").`);return o.join("/")}function Aw(e){let a=e.pathname.split("/").filter(Boolean);if(a.length<2)throw new Error(`Invalid GitHub URL: expected at least owner/repo in "${e.href}"`);let o=a[0],t=a[1];t.endsWith(".git")&&(t=t.slice(0,-4));let r={type:"github",url:`https://github.com/${o}/${t}.git`};if(a.length>=3&&(a[2]==="tree"||a[2]==="blob")){if(a.length>=4&&(r.ref=a[3]),a.length>=5){let i=a.slice(4).join("/");r.subpath=kc(i);}}else if(a.length>2){let i=a.slice(2).join("/");r.subpath=kc(i);}return e.hash&&e.hash.length>1&&(r.ref=decodeURIComponent(e.hash.slice(1))),r}function $s(e){let a=e.trim();if(!a)throw new Error("Skill source cannot be empty.");if(Rw(a)){let o=resolve(a);return {type:"local",url:o,localPath:o}}try{let o=new URL(a);if((o.protocol==="https:"||o.protocol==="http:")&&ww.includes(o.hostname))return Aw(o);if(o.protocol==="https:"||o.protocol==="http:"){let t={type:"git",url:a};return o.hash&&o.hash.length>1&&(t.ref=decodeURIComponent(o.hash.slice(1)),t.url=a.replace(o.hash,"")),t}if(o.protocol==="git:"){let t={type:"git",url:a};return o.hash&&o.hash.length>1&&(t.ref=decodeURIComponent(o.hash.slice(1)),t.url=a.replace(o.hash,"")),t}}catch{}if(a.startsWith("git@")||a.includes(":")&&a.includes(".git")){let o=a,t,r=a.indexOf("#");r!==-1&&(t=a.slice(r+1),o=a.slice(0,r));let i={type:"git",url:o};return t&&(i.ref=t),i}{let o=a,t,r=o.indexOf("#");r!==-1&&(t=o.slice(r+1),o=o.slice(0,r));let i=o.match(Sw);if(i){let s=i[1],n=i[2],d=i[3],l,c=n.match(Cw);c&&(n=c[1],l=c[2]),n.endsWith(".git")&&(n=n.slice(0,-4));let u={type:"github",url:`https://github.com/${s}/${n}.git`};if(t&&(u.ref=t),l&&(u.skillFilter=l),d){let m=d.replace(/^\//,"");m&&(u.subpath=kc(m));}return u}}return {type:"git",url:a}}function Ys(e){if(e.type!=="github")return null;try{let o=new URL(e.url).pathname.split("/").filter(Boolean);if(o.length<2)return null;let t=o[1];return t.endsWith(".git")&&(t=t.slice(0,-4)),`${o[0]}/${t}`}catch{return null}}function sf(e){let a=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);return a?{data:parse(a[1])??{},content:a[2]??""}:{data:{},content:e}}var Dc=new Set(["node_modules",".git","dist","build","__pycache__"]);function cf(e,a){let o=normalize(resolve(e)),t=normalize(resolve(a));return t.startsWith(o+sep)||t===o}function Mw(e,a){let o=normalize(resolve(e)),t=normalize(resolve(join(e,a)));return t.startsWith(o+sep)||t===o}async function Pc(e){try{let a=join(e,"SKILL.md");return (await stat(a)).isFile()}catch{return false}}async function ti(e){try{let a=await readFile(e,"utf-8"),{data:o}=sf(a);return typeof o.name!="string"||typeof o.description!="string"?null:{name:o.name,description:o.description,path:dirname(e),rawContent:a,metadata:o.metadata}}catch{return null}}async function lf(e,a=0,o=5){if(a>o)return [];try{let[t,r]=await Promise.all([Pc(e),readdir(e,{withFileTypes:!0}).catch(()=>[])]),i=t?[e]:[],s=await Promise.all(r.filter(n=>n.isDirectory()&&!Dc.has(n.name)).map(n=>lf(join(e,n.name),a+1,o)));return [...i,...s.flat()]}catch{return []}}async function an(e,a){let o=[],t=new Set;if(a&&!Mw(e,a))throw new Error(`Invalid subpath: "${a}" resolves outside the repository directory.`);let r=a?join(e,a):e;if(await Pc(r)){let s=await ti(join(r,"SKILL.md"));if(s)return o.push(s),t.add(s.name),o}let i=[r,join(r,"skills"),join(r,".claude/skills"),join(r,".agents/skills")];for(let s of i)try{let n=await readdir(s,{withFileTypes:!0});for(let d of n){if(!d.isDirectory())continue;let l=join(s,d.name);if(await Pc(l)){let c=await ti(join(l,"SKILL.md"));c&&!t.has(c.name)&&(o.push(c),t.add(c.name));}}}catch{}if(o.length===0){let s=await lf(r);for(let n of s){let d=await ti(join(n,"SKILL.md"));d&&!t.has(d.name)&&(o.push(d),t.add(d.name));}}return o}function uf(e,a){let o=a.map(t=>t.toLowerCase());return e.filter(t=>{let r=t.name.toLowerCase();return o.some(i=>i===r)})}Oe();var ff=1,Gw={retries:5,minTimeout:50};async function hf(e,a){mkdirSync(dirname(e),{recursive:true});let o=await zb.lock(e+".lock",{realpath:false,retries:Gw});try{return await a()}finally{await o();}}function pf(){return {version:ff,skills:{}}}async function on(e){let a=lr(e);try{let o=await readFile(a,"utf-8"),t=JSON.parse(o);return !t.version||t.version<ff?pf():t}catch{return pf()}}function Bw(e){let a={};for(let o of Object.keys(e).sort())a[o]=e[o];return a}async function bf(e,a){let o=lr(a);mkdirSync(dirname(o),{recursive:true});let t={version:e.version,skills:Bw(e.skills)},r=`${o}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(t,null,2)+`
254
+ `,{encoding:"utf-8",mode:384}),renameSync(r,o);}async function vf(e,a,o){let t=lr(o);await hf(t,async()=>{let r=await on(o),i=new Date().toISOString(),s=r.skills[e];r.skills[e]={...a,installedAt:s?.installedAt??i,updatedAt:i},await bf(r,o);});}async function yf(e,a){let o=lr(a);await hf(o,async()=>{let t=await on(a);e in t.skills&&(delete t.skills[e],await bf(t,a));});}Oe();I();var kf=k("skillInstaller");async function Qw(e,a,o,t){try{await C(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:"skill",source:"external",scope:a,version:o,duration_ms:t,interface:Z().interfaceType});}catch(r){kf.warn(`Failed to send skill install metrics: ${String(r)}`);}}async function _w(e,a){try{await C(w.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:"skill",source:"external",error_code:a instanceof Error?a.name:"UNKNOWN",error_message:(a instanceof Error?a.message:String(a)).slice(0,500),interface:Z().interfaceType});}catch(o){kf.warn(`Failed to send skill install-failed metrics: ${String(o)}`);}}async function Xw(e,a){await cp(e,a,{recursive:true,dereference:false,filter:o=>{if(Dc.has(basename(o)))return false;try{return !lstatSync(o).isSymbolicLink()}catch{return false}}});}async function Kw(e,a,o){let t=da(e.name),r=Ho(a),i=join(r,t);if(!cf(r,i))return {skill:e.name,success:false,path:i,error:`Unsafe install path: "${i}" escapes skills directory`};try{await rm$1(i,{recursive:!0,force:!0}),await mkdir(i,{recursive:!0}),await Xw(e.path,i);let n=Ys(o)??o.url;return await vf(t,{source:n,sourceType:o.type,sourceUrl:o.url,ref:o.ref,skillPath:o.subpath},a),{skill:e.name,success:!0,path:i}}catch(s){return {skill:e.name,success:false,path:i,error:s instanceof Error?s.message:String(s)}}}async function Pf(e,a){let o=$s(e),t;try{let r;if(o.type==="local"){if(!o.localPath||!existsSync(o.localPath))return {source:e,results:[],discovered:0,installed:0,failed:0};r=o.localPath;}else t=await Sa(o.url,o.ref),r=t;let i=await an(r,o.subpath),s=[...a.skillFilter??[]];o.skillFilter&&s.push(o.skillFilter);let n=s.length>0?uf(i,s):i,d=[],l=o.ref??"latest";for(let c of n){let u=Date.now(),m=await Kw(c,a.scope,o);d.push(m);let p=Date.now()-u;m.success?await Qw(c.name,a.scope,l,p):await _w(c.name,new Error(m.error??"Unknown error"));}return {source:e,results:d,discovered:i.length,installed:d.filter(c=>c.success).length,failed:d.filter(c=>!c.success).length}}finally{t&&await Ca(t).catch(()=>{});}}Oe();j();I();var aS=k("skills");async function oS(e){try{await C(w.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:"skill",source:"external",interface:Z().interfaceType});}catch(a){aS.warn(`Failed to send skill uninstall metrics: ${String(a)}`);}}async function tS(e){let a=createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(`${v(e)} (y/N) `,t=>{a.close(),o(t.trim().toLowerCase()==="y");});})}async function rS(e){let a=$s(e),o;try{let t;if(a.type==="local"){if(!a.localPath)return S("Invalid local path."),1;t=a.localPath;}else P(`Fetching skills from ${v(e)}...`),o=await Sa(a.url,a.ref),t=o;let r=await an(t,a.subpath);if(r.length===0)return P("No skills found in this source."),0;let s=Ys(a)??v(e);P(`Found ${r.length} skill(s) in ${s}:
255
+ `);for(let n of r){let d=v(n.name),l=v(n.description);process.stdout.write(` ${R.bold(d)} ${R.dim(l)}
256
256
  `);}return process.stdout.write(`
257
- `),0}catch(t){return t instanceof Oo?S(t.message):S(t instanceof Error?t.message:String(t)),1}finally{o&&await Ra(o).catch(()=>{});}}function nS(e){for(let o of e.results){let t=b(o.skill);if(o.success){let r=relative(process.cwd(),o.path);K(`${t} installed ${R.dim(`\u2192 ${r}/`)}`);}else S(`${t}: ${b(o.error??"unknown error")}`);}process.stdout.write(`
258
- `);let a=e.source;e.installed>0&&D(`Installed ${e.installed} of ${e.discovered} skill(s) from ${b(a)}`),e.failed>0&&S(`${e.failed} skill(s) failed to install`),e.results.length===0&&e.discovered===0?D("No skills found in this source."):e.results.length===0&&e.discovered>0&&D(`Found ${e.discovered} skill(s) but none matched the filter. Use --list to see available skills.`);}async function wf(e,a){if(a.list)return sS(e);let o=a.global?"global":"project";try{let t=await Pf(e,{scope:o,skillFilter:a.skill,yes:a.yes});return nS(t),t.failed>0?1:0}catch(t){return t instanceof Oo?S(t.message):S(t instanceof Error?t.message:String(t)),1}}async function Sf(e){let a=Ho(e),o=[];try{let t=await readdir(a,{withFileTypes:!0});for(let r of t){if(!r.isDirectory())continue;let i=join(a,r.name),s=join(i,"SKILL.md");try{if(!(await stat(s)).isFile())continue}catch{continue}let n=await ti(s);n?o.push({name:n.name,description:n.description,path:i}):o.push({name:r.name,description:"(no metadata)",path:i});}}catch{}return o}async function Cf(e){let a=e.global?"global":"project",o=await Sf(a),t=await on(a);if(e.json){let i=o.map(s=>({name:s.name,description:s.description,path:s.path,source:t.skills[da(s.name)]?.source}));return bo(i),0}if(o.length===0)return D(`No skills installed (${a==="global"?"global":"project"} scope).`),0;D(`${a==="global"?"Global":"Project"} skills (${o.length}):
259
- `);for(let i of o){let s=t.skills[da(i.name)]?.source,n=b(i.name),d=b(i.description),l=d.length>80?d.slice(0,77)+"...":d,c=s?R.dim(` (${s})`):"";process.stdout.write(` ${R.bold(n)}${c}
257
+ `),0}catch(t){return t instanceof Oo?S(t.message):S(t instanceof Error?t.message:String(t)),1}finally{o&&await Ca(o).catch(()=>{});}}function iS(e){for(let o of e.results){let t=v(o.skill);if(o.success){let r=relative(process.cwd(),o.path);K(`${t} installed ${R.dim(`\u2192 ${r}/`)}`);}else S(`${t}: ${v(o.error??"unknown error")}`);}process.stdout.write(`
258
+ `);let a=e.source;e.installed>0&&P(`Installed ${e.installed} of ${e.discovered} skill(s) from ${v(a)}`),e.failed>0&&S(`${e.failed} skill(s) failed to install`),e.results.length===0&&e.discovered===0?P("No skills found in this source."):e.results.length===0&&e.discovered>0&&P(`Found ${e.discovered} skill(s) but none matched the filter. Use --list to see available skills.`);}async function wf(e,a){if(a.list)return rS(e);let o=a.global?"global":"project";try{let t=await Pf(e,{scope:o,skillFilter:a.skill,yes:a.yes});return iS(t),t.failed>0?1:0}catch(t){return t instanceof Oo?S(t.message):S(t instanceof Error?t.message:String(t)),1}}async function Sf(e){let a=Ho(e),o=[];try{let t=await readdir(a,{withFileTypes:!0});for(let r of t){if(!r.isDirectory())continue;let i=join(a,r.name),s=join(i,"SKILL.md");try{if(!(await stat(s)).isFile())continue}catch{continue}let n=await ti(s);n?o.push({name:n.name,description:n.description,path:i}):o.push({name:r.name,description:"(no metadata)",path:i});}}catch{}return o}async function Cf(e){let a=e.global?"global":"project",o=await Sf(a),t=await on(a);if(e.json){let i=o.map(s=>({name:s.name,description:s.description,path:s.path,source:t.skills[da(s.name)]?.source}));return bo(i),0}if(o.length===0)return P(`No skills installed (${a==="global"?"global":"project"} scope).`),0;P(`${a==="global"?"Global":"Project"} skills (${o.length}):
259
+ `);for(let i of o){let s=t.skills[da(i.name)]?.source,n=v(i.name),d=v(i.description),l=d.length>80?d.slice(0,77)+"...":d,c=s?R.dim(` (${s})`):"";process.stdout.write(` ${R.bold(n)}${c}
260
260
  `),process.stdout.write(` ${R.dim(l)}
261
261
 
262
- `);}return 0}async function Rf(e,a){let o=a.global?"global":"project";if(!e){let s=await Sf(o);if(s.length===0)return D("No skills installed."),0;D("Installed skills:");for(let n of s)process.stdout.write(` - ${b(n.name)}
262
+ `);}return 0}async function Rf(e,a){let o=a.global?"global":"project";if(!e){let s=await Sf(o);if(s.length===0)return P("No skills installed."),0;P("Installed skills:");for(let n of s)process.stdout.write(` - ${v(n.name)}
263
263
  `);return process.stdout.write(`
264
- `),D("Specify a skill name to remove: flow skills remove <name>"),1}let t=da(e),r=Ho(o),i=join(r,t);try{await stat(i);}catch{return S(`Skill "${b(e)}" is not installed.`),1}if(!a.force&&!await iS(`Remove skill "${b(t)}"?`))return D("Cancelled."),0;try{return await rm$1(i,{recursive:!0,force:!0}),await yf(t,o),await rS(t),K(`Skill "${b(t)}" removed.`),0}catch(s){return S(`Failed to remove skill: ${s instanceof Error?s.message:String(s)}`),1}}j();I();U();var tn=P("transfer"),xc=1;function dS(e){return e.marketplace&&e.marketplace!==pe?`${e.name}@${e.marketplace}`:e.name}function cS(e,a){let o=e.filter(r=>a.has(r.name)),t=e.filter(r=>!a.has(r.name));o.length>0&&D(`Already installed (${o.length}): ${o.map(r=>r.name).join(", ")}`),D(`To install (${t.length}): ${t.length>0?t.map(r=>r.name).join(", "):"none"}`);}function Ef(e){let a=de__default.resolve(e.output);try{let o=le(),t={version:xc,exportedAt:new Date().toISOString(),plugins:o.map(r=>({name:r.name,marketplace:r.marketplace,scope:r.scope,...r.type!==void 0?{type:r.type}:{}}))};return se__default.writeFileSync(a,JSON.stringify(t,null,2),"utf-8"),K(`Exported ${o.length} plugin(s) to ${a}`),0}catch(o){let t=$(o);return tn.error(`Export failed: ${t}`),S(`Failed to export plugins: ${t}`),1}}async function If(e,a={}){if(!await he())return 1;let o;try{let n=se__default.readFileSync(de__default.resolve(e),"utf-8");o=JSON.parse(n);}catch(n){return S(`Failed to read import file "${e}": ${$(n)}`),1}if(o.version!==xc)return S(`Unsupported export format version ${o.version??"(none)"} \u2014 expected ${xc}`),1;if(!Array.isArray(o.plugins))return S('Invalid export file format: missing or invalid "plugins" array'),1;if(o.plugins.length===0)return D("No plugins to import"),0;let t=[],r=[],i=0;for(let[n,d]of o.plugins.entries())if(!d?.name||typeof d.name!="string"){let l=`entry[${n}]`;tn.warn(`Skipping ${l}: missing or invalid name`),r.push({name:l,error:"missing or invalid name"});}else d.type==="mcp"?(tn.debug(`[${d.name}] Skipping MCP entry`),i++):t.push(d);if(i>0&&D(`Skipping ${i} MCP(s) \u2014 use 'flow mcp add' to install them manually`),a.diff||a.dryRun){let n=new Set(le().map(d=>d.name));cS(t,n);}if(a.dryRun)return D("Dry-run mode: no plugins were installed"),0;if(t.length===0){D(`
265
- Import summary: 0 installed, ${r.length} failed`);for(let n of r)S(` ${n.name}: ${n.error}`);return r.length>0?1:0}D(`Importing ${t.length} plugin(s)...`);let s=0;for(let n of t){let d=a.scope??n.scope??"user",l=dS(n);tn.debug(`[${n.name}] Installing as "${l}" in scope "${d}"`),await ir([l],{scope:d,force:a.force})===0?s++:r.push({name:n.name,error:"installation failed"});}D(`
266
- Import summary: ${s} installed, ${r.length} failed`);for(let n of r)S(` ${n.name}: ${n.error}`);return r.length>0?1:0}I();j();function G(e){process.exitCode=e,setTimeout(()=>process.exit(e),100).unref();}j();I();var uS=P("moduleProxy");function pS(e){if(!process.stdin.isTTY)return Promise.resolve(false);let a=Nd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(b(e),t=>{a.close(),o(!["n","no"].includes(t.toLowerCase().trim()));});})}async function Tf(e,a){let o=Date.now(),r=spawnSync(e.binaryName,a,{stdio:"inherit",env:process.env}).status??1;await C(w.CLI_MODULE_PROXY_EXECUTED,{module_alias:e.alias,exit_code:r,duration_ms:Date.now()-o,subcommand:a[0]??null}).catch(i=>{uS.warn(`Failed to emit proxy executed event: ${String(i)}`);}),G(r);}async function qf(e,a){let o=ce.find(r=>r.alias===e);if(!o){S(`Unknown module alias: '${e}'`),G(1);return}if(!await Ga(o.binaryName)){S(`Module '${e}' (${o.binaryName}) is not installed.`);let r=o.platforms[process.platform];if(!r||r.status!=="supported"){await C(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_not_supported"}).catch(()=>{}),G(1);return}let i=(await Promise.all(r.strategies.map(async n=>{try{return await ja(n.type).isAvailable()?n.type:null}catch{return null}}))).find(n=>n!==null)??null;if(!i){S(`No supported installation method available for '${e}' on this platform.`),G(1);return}if(await pS("Would you like to install it now? [Y/n] ")){await C(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_accepted"}).catch(()=>{});let n=await xo(o,"inline",i);if(!n.success){S(`Failed to install '${e}': ${n.error?.message??"unknown error"}`),G(1);return}await Tf(o,a);}else D(`To install manually, run: flow modules install ${e}`),await C(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_declined"}).catch(()=>{}),G(1);return}await Tf(o,a);}j();var hS=promisify(execFile);async function bS(e){try{if(e.versionCheck.type==="npm-registry"){let{stdout:t}=await hS(Ya(),["view",e.versionCheck.package,"version"],{timeout:5e3,shell:process.platform==="win32"});return String(t).trim()||null}let a=new AbortController,o=setTimeout(()=>a.abort(),5e3);try{let t={"User-Agent":`flow-plugins-cli/${re}`,Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(t.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let r=await fetch(`https://api.github.com/repos/${e.versionCheck.repo}/releases/latest`,{signal:a.signal,headers:t});return r.ok?(await r.json()).tag_name?.replace(/^v/,"")??null:null}finally{clearTimeout(o);}}catch{return null}}function vS(e,a,o,t){return t?.status==="experimental"?"experimental":!t||t.status!=="supported"||!e?"not_installed":a&&o&&ze(a,o)?"outdated":"installed"}async function Ec(){let e=await Promise.all(ce.map(async a=>{let[o,t]=await Promise.all([Ga(a.binaryName),bS(a)]),i=ta(a.alias)?.installedVersion??null,s=a.platforms[process.platform],n=vS(o,i,t,s),d=i??"\u2014";return [a.name,a.alias,d,n,process.platform]}));return St(["Name","Alias","Version","Status","Platform"],e),0}async function Of(e){let a=ce.find(s=>s.alias===e);if(!a)return S(`Unknown module alias: '${e}'`),1;let[o]=await ar([a]);if(o.alreadyInstalled){let s=ta(a.alias),n=s?.installedVersion?` (v${s.installedVersion})`:"";return D(`Module ${a.name} already installed${n}. Use: flow modules update ${e}`),0}if(o.availableStrategies.length===0){let s=a.platforms[process.platform],n=a.docs?` See: ${a.docs}`:"";return !s||s.status!=="supported"?S(`Module ${a.name} is not supported on ${process.platform}.${n}`):S(`No installation method available for ${a.name} on ${process.platform}.${n}`),1}let t=o.availableStrategies[0],r=wc({text:`Installing ${a.name}...`}).start(),i;try{i=await xo(a,"on_demand",t);}finally{r.stop();}return i.success?(K(`${a.name} v${i.version??"unknown"} installed`),i.pendingInteractiveSetup&&spawnSync(i.pendingInteractiveSetup[0],i.pendingInteractiveSetup.slice(1),{stdio:"inherit"}),0):(S(i.error?.message??"Installation failed"),1)}async function Lf(e,a){let o=wc({text:`Updating ${e.name}...`}).start(),t;try{t=await Ji(e,"command");}catch(r){return o.error(`${e.name}: ${r instanceof Error?r.message:String(r)}`),"error"}if(t.success){let r=t.version??"unknown";return r===a?(o.success(`${e.name}: already up to date (v${a})`),"up_to_date"):(o.success(`${e.name}: v${a} \u2192 v${r}`),"success")}return o.error(`${e.name}: ${t.error?.message??"Update failed"}`),"error"}async function Nf(e){if(e!==null){let t=ce.find(s=>s.alias===e);if(!t)return S(`Unknown module alias: '${e}'`),1;let r=ta(t.alias);return r?.installMethod?await Lf(t,r.installedVersion??"unknown")==="error"?1:0:(S(`Module '${e}' not installed. Run: flow modules install ${e}`),1)}let a=ot().filter(t=>t.installMethod!==null);if(a.length===0)return D("No installed modules to update."),0;let o=0;for(let t of a){let r=ce.find(s=>s.alias===t.alias);if(!r)continue;await Lf(r,t.installedVersion??"unknown")==="error"&&(o=1);}return o}var Gf="ea77652b607cf8d3dd0a1359c08565561e4f758f",ri=[{path:"0-current-state/INDEX.md",sha256:"987ca6b98f338b82e05e2cab71453ccb7a3e987a56dfd68631735e38356bddff",content:`---
264
+ `),P("Specify a skill name to remove: flow skills remove <name>"),1}let t=da(e),r=Ho(o),i=join(r,t);try{await stat(i);}catch{return S(`Skill "${v(e)}" is not installed.`),1}if(!a.force&&!await tS(`Remove skill "${v(t)}"?`))return P("Cancelled."),0;try{return await rm$1(i,{recursive:!0,force:!0}),await yf(t,o),await oS(t),K(`Skill "${v(t)}" removed.`),0}catch(s){return S(`Failed to remove skill: ${s instanceof Error?s.message:String(s)}`),1}}j();I();U();var tn=k("transfer"),Sc=1;function sS(e){return e.marketplace&&e.marketplace!==ue?`${e.name}@${e.marketplace}`:e.name}function nS(e,a){let o=e.filter(r=>a.has(r.name)),t=e.filter(r=>!a.has(r.name));o.length>0&&P(`Already installed (${o.length}): ${o.map(r=>r.name).join(", ")}`),P(`To install (${t.length}): ${t.length>0?t.map(r=>r.name).join(", "):"none"}`);}function Ef(e){let a=ne__default.resolve(e.output);try{let o=ce(),t={version:Sc,exportedAt:new Date().toISOString(),plugins:o.map(r=>({name:r.name,marketplace:r.marketplace,scope:r.scope,...r.type!==void 0?{type:r.type}:{}}))};return ie__default.writeFileSync(a,JSON.stringify(t,null,2),"utf-8"),K(`Exported ${o.length} plugin(s) to ${a}`),0}catch(o){let t=$(o);return tn.error(`Export failed: ${t}`),S(`Failed to export plugins: ${t}`),1}}async function If(e,a={}){if(!await fe())return 1;let o;try{let n=ie__default.readFileSync(ne__default.resolve(e),"utf-8");o=JSON.parse(n);}catch(n){return S(`Failed to read import file "${e}": ${$(n)}`),1}if(o.version!==Sc)return S(`Unsupported export format version ${o.version??"(none)"} \u2014 expected ${Sc}`),1;if(!Array.isArray(o.plugins))return S('Invalid export file format: missing or invalid "plugins" array'),1;if(o.plugins.length===0)return P("No plugins to import"),0;let t=[],r=[],i=0;for(let[n,d]of o.plugins.entries())if(!d?.name||typeof d.name!="string"){let l=`entry[${n}]`;tn.warn(`Skipping ${l}: missing or invalid name`),r.push({name:l,error:"missing or invalid name"});}else d.type==="mcp"?(tn.debug(`[${d.name}] Skipping MCP entry`),i++):t.push(d);if(i>0&&P(`Skipping ${i} MCP(s) \u2014 use 'flow mcp add' to install them manually`),a.diff||a.dryRun){let n=new Set(ce().map(d=>d.name));nS(t,n);}if(a.dryRun)return P("Dry-run mode: no plugins were installed"),0;if(t.length===0){P(`
265
+ Import summary: 0 installed, ${r.length} failed`);for(let n of r)S(` ${n.name}: ${n.error}`);return r.length>0?1:0}P(`Importing ${t.length} plugin(s)...`);let s=0;for(let n of t){let d=a.scope??n.scope??"user",l=sS(n);tn.debug(`[${n.name}] Installing as "${l}" in scope "${d}"`),await ir([l],{scope:d,force:a.force})===0?s++:r.push({name:n.name,error:"installation failed"});}P(`
266
+ Import summary: ${s} installed, ${r.length} failed`);for(let n of r)S(` ${n.name}: ${n.error}`);return r.length>0?1:0}I();j();function G(e){process.exitCode=e,setTimeout(()=>process.exit(e),100).unref();}j();I();var cS=k("moduleProxy");function lS(e){if(!process.stdin.isTTY)return Promise.resolve(false);let a=qd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(v(e),t=>{a.close(),o(!["n","no"].includes(t.toLowerCase().trim()));});})}async function Tf(e,a){let o=Date.now(),r=spawnSync(e.binaryName,a,{stdio:"inherit",env:process.env}).status??1;await C(w.CLI_MODULE_PROXY_EXECUTED,{module_alias:e.alias,exit_code:r,duration_ms:Date.now()-o,subcommand:a[0]??null}).catch(i=>{cS.warn(`Failed to emit proxy executed event: ${String(i)}`);}),G(r);}async function qf(e,a){let o=de.find(r=>r.alias===e);if(!o){S(`Unknown module alias: '${e}'`),G(1);return}if(!await Ga(o.binaryName)){S(`Module '${e}' (${o.binaryName}) is not installed.`);let r=o.platforms[process.platform];if(!r||r.status!=="supported"){await C(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_not_supported"}).catch(()=>{}),G(1);return}let i=(await Promise.all(r.strategies.map(async n=>{try{return await ja(n.type).isAvailable()?n.type:null}catch{return null}}))).find(n=>n!==null)??null;if(!i){S(`No supported installation method available for '${e}' on this platform.`),G(1);return}if(await lS("Would you like to install it now? [Y/n] ")){await C(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_accepted"}).catch(()=>{});let n=await xo(o,"inline",i);if(!n.success){S(`Failed to install '${e}': ${n.error?.message??"unknown error"}`),G(1);return}await Tf(o,a);}else P(`To install manually, run: flow modules install ${e}`),await C(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_declined"}).catch(()=>{}),G(1);return}await Tf(o,a);}j();var gS=promisify(execFile);async function fS(e){try{if(e.versionCheck.type==="npm-registry"){let{stdout:t}=await gS(Za(),["view",e.versionCheck.package,"version"],{timeout:5e3,shell:process.platform==="win32"});return String(t).trim()||null}let a=new AbortController,o=setTimeout(()=>a.abort(),5e3);try{let t={"User-Agent":`flow-plugins-cli/${ve}`,Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(t.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let r=await fetch(`https://api.github.com/repos/${e.versionCheck.repo}/releases/latest`,{signal:a.signal,headers:t});return r.ok?(await r.json()).tag_name?.replace(/^v/,"")??null:null}finally{clearTimeout(o);}}catch{return null}}function hS(e,a,o,t){return t?.status==="experimental"?"experimental":!t||t.status!=="supported"||!e?"not_installed":a&&o&&ze(a,o)?"outdated":"installed"}async function Cc(){let e=await Promise.all(de.map(async a=>{let[o,t]=await Promise.all([Ga(a.binaryName),fS(a)]),i=ta(a.alias)?.installedVersion??null,s=a.platforms[process.platform],n=hS(o,i,t,s),d=i??"\u2014";return [a.name,a.alias,d,n,process.platform]}));return St(["Name","Alias","Version","Status","Platform"],e),0}async function Of(e){let a=de.find(s=>s.alias===e);if(!a)return S(`Unknown module alias: '${e}'`),1;let[o]=await ar([a]);if(o.alreadyInstalled){let s=ta(a.alias),n=s?.installedVersion?` (v${s.installedVersion})`:"";return P(`Module ${a.name} already installed${n}. Use: flow modules update ${e}`),0}if(o.availableStrategies.length===0){let s=a.platforms[process.platform],n=a.docs?` See: ${a.docs}`:"";return !s||s.status!=="supported"?S(`Module ${a.name} is not supported on ${process.platform}.${n}`):S(`No installation method available for ${a.name} on ${process.platform}.${n}`),1}let t=o.availableStrategies[0],r=yc({text:`Installing ${a.name}...`}).start(),i;try{i=await xo(a,"on_demand",t);}finally{r.stop();}return i.success?(K(`${a.name} v${i.version??"unknown"} installed`),i.pendingInteractiveSetup&&spawnSync(i.pendingInteractiveSetup[0],i.pendingInteractiveSetup.slice(1),{stdio:"inherit"}),0):(S(i.error?.message??"Installation failed"),1)}async function Lf(e,a){let o=yc({text:`Updating ${e.name}...`}).start(),t;try{t=await Ji(e,"command");}catch(r){return o.error(`${e.name}: ${r instanceof Error?r.message:String(r)}`),"error"}if(t.success){let r=t.version??"unknown";return r===a?(o.success(`${e.name}: already up to date (v${a})`),"up_to_date"):(o.success(`${e.name}: v${a} \u2192 v${r}`),"success")}return o.error(`${e.name}: ${t.error?.message??"Update failed"}`),"error"}async function Nf(e){if(e!==null){let t=de.find(s=>s.alias===e);if(!t)return S(`Unknown module alias: '${e}'`),1;let r=ta(t.alias);return r?.installMethod?await Lf(t,r.installedVersion??"unknown")==="error"?1:0:(S(`Module '${e}' not installed. Run: flow modules install ${e}`),1)}let a=ot().filter(t=>t.installMethod!==null);if(a.length===0)return P("No installed modules to update."),0;let o=0;for(let t of a){let r=de.find(s=>s.alias===t.alias);if(!r)continue;await Lf(r,t.installedVersion??"unknown")==="error"&&(o=1);}return o}var ri=[{path:"0-current-state/INDEX.md",sha256:"987ca6b98f338b82e05e2cab71453ccb7a3e987a56dfd68631735e38356bddff",content:`---
267
267
  title: "0-current-state \u2014 Index"
268
268
  type: index
269
269
  domain: platform
@@ -554,8 +554,7 @@ analyzes these files and creates the correct \`.md\` files in the numbered folde
554
554
  **6. Source code never in monitored folders.**
555
555
  If you create a folder with app or script source code, keep it out of the 5 numbered folders
556
556
  entirely (e.g. \`prototypes/\`).
557
- `},{path:"docs/README.md",sha256:"da3c8e019b808bd66cc794d8350bd204d75ba0387eb1545f7223eb9049a911c8",content:"# docs/ \u2014 Raw Input\n\nDrop raw files here \u2014 PDFs, images, standalone Markdowns, tool exports (Jira, Miro, Confluence),\nlegacy documentation. Nothing in this folder is curated content: it exists to be analyzed and\nsynthesized into `0-current-state/`, `1-strategy/`, `2-plan/`, `3-delivery/` or `4-learn/`.\n\nSee `STRUCTURE.md` at the repo root for the full folder guide.\n"}];var rn=".flow-harness-lock";function sn(e){if(!existsSync(e))return {};try{let a=readFileSync(e,"utf8"),o=JSON.parse(a);return o&&typeof o=="object"&&!Array.isArray(o)?o:{}}catch{return {}}}function nn(e,a){return e.files?.[a]?.sha256}function Bf(e,a,o,t){let r={...a.files??{}};for(let[s,n]of Object.entries(o))r[s]={sha256:n};let i={...a,files:r,strategy_context:true,strategy_context_source:`@ciandt-flow/cli@${re}`,strategy_context_harness_commit:t};"core_commit"in a||(i.core_commit=""),writeFileSync(e,JSON.stringify(i,null,2)+`
558
- `,"utf8");}j();var qc="CLAUDE.md";function SS(e){return createHash("sha256").update(e,"utf8").digest("hex")}function Lc(){return {new:0,unchanged:0,clean:0,divergent:0,declined:0}}async function Uf(e={}){let a=e.targetDir??process.cwd(),o=e.dryRun??false,t=e.force??false,r=e.isInteractive??!!process.stdin.isTTY,i=e.confirmOverwrite??Oc,s=e.confirmCreate??CS,n=join(a,rn),d=sn(n),l=[],c=Lc(),u={},p=ri.find(f=>f.path===qc),m=p?existsSync(join(a,p.path)):true;if(p&&!m){let f=join(a,p.path);r?await s(p.path)?(l.push({path:p.path,status:"new"}),c.new++,o||(mkdirSync(dirname(f),{recursive:true}),writeFileSync(f,p.content,"utf8"),u[p.path]=p.sha256)):D(`declined: ${qc} not created`):e.assistant==="claude-code"&&(l.push({path:p.path,status:"new"}),c.new++,o||(mkdirSync(dirname(f),{recursive:true}),writeFileSync(f,p.content,"utf8"),u[p.path]=p.sha256));}for(let f of ri){if(f.path===qc&&!m)continue;let h=join(a,f.path),v=await Fc({dstPath:h,template:f,existingLockHash:nn(d,f.path),force:t,isInteractive:r,confirmOverwrite:k=>i(k)});l.push({path:f.path,status:v.status}),c[v.status]++,v.write&&!o&&(mkdirSync(dirname(h),{recursive:true}),writeFileSync(h,f.content,"utf8")),v.recordHash&&!o&&(u[f.path]=v.recordHash);}!o&&Object.keys(u).length>0&&Bf(n,d,u,Gf);let g=c.divergent>0||c.declined>0;return {files:l,counts:c,hasUnresolved:g}}async function Fc(e){let{dstPath:a,template:o,existingLockHash:t,force:r,isInteractive:i,confirmOverwrite:s}=e;if(!existsSync(a))return {status:"new",write:true,recordHash:o.sha256};let n=SS(readFileSync(a,"utf8"));return n===o.sha256?{status:"unchanged",write:false,recordHash:o.sha256}:t!==void 0&&n===t?r?{status:"clean",write:true,recordHash:o.sha256}:i?await s(o.path)?{status:"clean",write:true,recordHash:o.sha256}:{status:"declined",write:false,recordHash:void 0}:{status:"declined",write:false,recordHash:void 0}:r?{status:"divergent",write:true,recordHash:o.sha256}:(D(`divergent, kept local (customized): ${o.path}`),{status:"divergent",write:false,recordHash:n})}async function Oc(e){return ee(` Overwrite ${e} with the updated template? [y/N] `)}async function CS(e){return ee(` Create a generic ${e} with Flow strategy conventions? [y/N] `)}var zf="64feeb4e5f6f282d4e0fae6568c0520c5ecd4d5a",Wf=[{path:"docs/catalog/TEMPLATES/agents/_TEMPLATE-LEVEL-0.md",sha256:"5f6d1ef6336d69c9fa53ec3167e4f0eb8ec212e21e771356e357e397946f3638",content:`---
557
+ `},{path:"docs/README.md",sha256:"da3c8e019b808bd66cc794d8350bd204d75ba0387eb1545f7223eb9049a911c8",content:"# docs/ \u2014 Raw Input\n\nDrop raw files here \u2014 PDFs, images, standalone Markdowns, tool exports (Jira, Miro, Confluence),\nlegacy documentation. Nothing in this folder is curated content: it exists to be analyzed and\nsynthesized into `0-current-state/`, `1-strategy/`, `2-plan/`, `3-delivery/` or `4-learn/`.\n\nSee `STRUCTURE.md` at the repo root for the full folder guide.\n"}];j();var Ic="CLAUDE.md";function yS(e){return createHash("sha256").update(e,"utf8").digest("hex")}function Tc(){return {new:0,unchanged:0,divergent:0,declined:0}}async function Bf(e={}){let a=e.targetDir??process.cwd(),o=e.dryRun??false,t=e.force??false,r=e.isInteractive??!!process.stdin.isTTY,i=e.confirmOverwrite??qc,s=e.confirmCreate??PS,n=[],d=Tc(),l=ri.find(m=>m.path===Ic),c=l?existsSync(join(a,l.path)):true;if(l&&!c){let m=join(a,l.path);r?await s(l.path)?(n.push({path:l.path,status:"new"}),d.new++,o||(mkdirSync(dirname(m),{recursive:true}),writeFileSync(m,l.content,"utf8"))):P(`declined: ${Ic} not created`):e.assistant==="claude-code"&&(n.push({path:l.path,status:"new"}),d.new++,o||(mkdirSync(dirname(m),{recursive:true}),writeFileSync(m,l.content,"utf8")));}for(let m of ri){if(m.path===Ic&&!c)continue;let p=join(a,m.path),g=await Mc({dstPath:p,template:m,force:t,isInteractive:r,confirmOverwrite:f=>i(f)});n.push({path:m.path,status:g.status}),d[g.status]++,g.write&&!o&&(mkdirSync(dirname(p),{recursive:true}),writeFileSync(p,m.content,"utf8"));}let u=d.divergent>0||d.declined>0;return {files:n,counts:d,hasUnresolved:u}}async function Mc(e){let{dstPath:a,template:o,force:t,isInteractive:r,confirmOverwrite:i}=e;return existsSync(a)?yS(readFileSync(a,"utf8"))===o.sha256?{status:"unchanged",write:false}:t?{status:"divergent",write:true}:(kS(o.path),r?await i(o.path)?{status:"divergent",write:true}:{status:"declined",write:false}:{status:"declined",write:false}):{status:"new",write:true}}function kS(e){P(`${e} differs from the Flow strategy template. Review your local changes before overwriting \u2014 run "git status" and "git diff ${e}", or open your IDE's diff/history view for this file. Once overwritten, uncommitted local changes are gone for good.`);}async function qc(e){return ee(` Overwrite ${e} with the updated template? [y/N] `)}async function PS(e){return ee(` Create a generic ${e} with Flow strategy conventions? [y/N] `)}var jf=[{path:"docs/catalog/TEMPLATES/agents/_TEMPLATE-LEVEL-0.md",sha256:"5f6d1ef6336d69c9fa53ec3167e4f0eb8ec212e21e771356e357e397946f3638",content:`---
559
558
  id: <slug-do-card>
560
559
  kind: agent | skill
561
560
  level: 0
@@ -30831,7 +30830,7 @@ flowchart TD
30831
30830
  style A fill:#0369a1,color:#fff,stroke:none
30832
30831
  style H fill:#059669,color:#fff,stroke:none
30833
30832
  \`\`\`
30834
- `}],cn={"cit-tools":[{path:"docs/playbooks/cit-tools.en.md",sha256:"e05497be5766955d50b040efb0eeb031a3b1bddfe0c9ed16f78c91fa1a17dcda",content:`---
30833
+ `}],rn={"cit-tools":[{path:"docs/playbooks/cit-tools.en.md",sha256:"e05497be5766955d50b040efb0eeb031a3b1bddfe0c9ed16f78c91fa1a17dcda",content:`---
30835
30834
  title: "cit-tools \u2014 CI&T-Branded Design Tooling"
30836
30835
  type: runbook
30837
30836
  domain: toolchain
@@ -84776,26 +84775,25 @@ updated: "2026-09-23"
84776
84775
  flow plugin marketplace add cit-flow/flow-harness
84777
84776
  flow plugin install runbook-tech-common
84778
84777
  \`\`\`
84779
- `}]};function Jf(e,a,o,t){let r={...a.files??{}};for(let[s,n]of Object.entries(o))r[s]={sha256:n};let i={...a,files:r,docs_content:true,docs_content_source:`@ciandt-flow/cli@${re}`,docs_content_harness_commit:t};"core_commit"in a||(i.core_commit=""),writeFileSync(e,JSON.stringify(i,null,2)+`
84780
- `,"utf8");}function IS(e){let a=new Set,o=[];for(let t of e){let r=cn[t];if(r)for(let i of r)a.has(i.path)||(a.add(i.path),o.push(i));}return o}function TS(e){return e.endsWith(".en.md")||e.endsWith(".es.md")?e.slice(0,-6)+".md":e}function MS(e){return e.endsWith(".en.md")?"en":e.endsWith(".es.md")?"es":"pt"}function qS(e,a){if(a==="all")return e;let o=new Map,t=[];for(let i of e){if(!i.path.endsWith(".md")){t.push(i);continue}let s=TS(i.path),n=MS(i.path),d=o.get(s);d||(d=new Map,o.set(s,d)),d.set(n,i);}let r=[];for(let[i,s]of o){let n=s.get(a)??s.get("pt")??s.get("en")??s.get("es");r.push({...n,path:i});}return [...t,...r]}async function Qf(e){let a=e.targetDir??process.cwd(),o=e.dryRun??false,t=e.force??false,r=e.isInteractive??!!process.stdin.isTTY,i=e.confirmOverwrite??Oc,s=join(a,rn),n=sn(s),d=e.docsLang??"all",l=e.installedBundles.length===0,c=l?[]:IS(e.installedBundles),u=qS([...Wf,...c],d),p=[],m=Lc(),g={};for(let h of u){let v=join(a,h.path),k=await Fc({dstPath:v,template:h,existingLockHash:nn(n,h.path),force:t,isInteractive:r,confirmOverwrite:T=>i(T)});p.push({path:h.path,status:k.status}),m[k.status]++,k.write&&!o&&(mkdirSync(dirname(v),{recursive:true}),writeFileSync(v,h.content,"utf8")),k.recordHash&&!o&&(g[h.path]=k.recordHash);}!o&&Object.keys(g).length>0&&Jf(s,n,g,zf);let f=m.divergent>0||m.declined>0;return {files:p,counts:m,hasUnresolved:f,skippedPlaybooks:l}}function Vf(){let e=Ae().plugins,a=process.cwd(),o=new Set(Object.keys(cn)),t=new Set;for(let[r,i]of Object.entries(e)){let s=r.split("@")[0];if(!s||!o.has(s))continue;i.some(d=>d.scope==="user"||d.projectPath===a)&&t.add(s);}return [...t].sort()}j();I();Re();_o();I();var Nc=P("lib:otelMetrics"),FS="flow-plugins-cli",OS="1.0.0",NS=5e3;function GS(){return Fa("FLOW_OTEL_ENDPOINT_URL","https://flow.ciandt.com/otel")}function BS(e,a){return typeof a=="number"?{key:e,value:{intValue:String(a)}}:typeof a=="boolean"?{key:e,value:{boolValue:a}}:{key:e,value:{stringValue:a}}}function jS(e,a){let o=String(Date.now()*1e6);return {resourceMetrics:[{resource:{attributes:[]},scopeMetrics:[{scope:{name:FS,version:OS},metrics:[{name:e,sum:{dataPoints:[{asInt:"1",startTimeUnixNano:o,timeUnixNano:o,attributes:Object.entries(a).map(([t,r])=>BS(t,r))}],aggregationTemporality:1,isMonotonic:true}}]}]}]}}async function Gc(e,a={}){try{let[o,t]=await Promise.all([Rt(),Y()]),r=o?.email,i=t?.tenant;if(!r||!i){Nc.debug(`Skipping OTel metric "${e}": no cached identity available`);return}let s=jS(e,a);await _u.post(GS(),{json:s,timeout:NS,headers:{"Content-Type":"application/json","x-flow-user":r,flowtenant:i}}),Nc.debug(`OTel metric sent: ${e}`);}catch(o){Nc.warn(`Failed to send OTel metric "${e}": ${String(o)}`);}}var Bc=P("cli:init"),WS={new:{label:"new",color:R.green},unchanged:{label:"unchanged",color:R.dim},clean:{label:"updated",color:R.cyan},divergent:{label:"kept (customized)",color:R.yellow},declined:{label:"pending (declined)",color:R.yellow}};function JS(e){process.stdout.write(`
84778
+ `}]};function RS(e){let a=new Set,o=[];for(let t of e){let r=rn[t];if(r)for(let i of r)a.has(i.path)||(a.add(i.path),o.push(i));}return o}function AS(e){return e.endsWith(".en.md")||e.endsWith(".es.md")?e.slice(0,-6)+".md":e}function xS(e){return e.endsWith(".en.md")?"en":e.endsWith(".es.md")?"es":"pt"}function ES(e,a){if(a==="all")return e;let o=new Map,t=[];for(let i of e){if(!i.path.endsWith(".md")){t.push(i);continue}let s=AS(i.path),n=xS(i.path),d=o.get(s);d||(d=new Map,o.set(s,d)),d.set(n,i);}let r=[];for(let[i,s]of o){let n=s.get(a)??s.get("pt")??s.get("en")??s.get("es");r.push({...n,path:i});}return [...t,...r]}async function Uf(e){let a=e.targetDir??process.cwd(),o=e.dryRun??false,t=e.force??false,r=e.isInteractive??!!process.stdin.isTTY,i=e.confirmOverwrite??qc,s=e.docsLang??"all",n=e.installedBundles.length===0,d=n?[]:RS(e.installedBundles),l=ES([...jf,...d],s),c=[],u=Tc();for(let p of l){let g=join(a,p.path),f=await Mc({dstPath:g,template:p,force:t,isInteractive:r,confirmOverwrite:h=>i(h)});c.push({path:p.path,status:f.status}),u[f.status]++,f.write&&!o&&(mkdirSync(dirname(g),{recursive:true}),writeFileSync(g,p.content,"utf8"));}let m=u.divergent>0||u.declined>0;return {files:c,counts:u,hasUnresolved:m,skippedPlaybooks:n}}function zf(){let e=Ae().plugins,a=process.cwd(),o=new Set(Object.keys(rn)),t=new Set;for(let[r,i]of Object.entries(e)){let s=r.split("@")[0];if(!s||!o.has(s))continue;i.some(d=>d.scope==="user"||d.projectPath===a)&&t.add(s);}return [...t].sort()}j();I();Re();_o();I();var Lc=k("lib:otelMetrics"),TS="flow-plugins-cli",MS="1.0.0",qS=5e3;function LS(){return Fa("FLOW_OTEL_ENDPOINT_URL","https://flow.ciandt.com/otel")}function FS(e,a){return typeof a=="number"?{key:e,value:{intValue:String(a)}}:typeof a=="boolean"?{key:e,value:{boolValue:a}}:{key:e,value:{stringValue:a}}}function OS(e,a){let o=String(Date.now()*1e6);return {resourceMetrics:[{resource:{attributes:[]},scopeMetrics:[{scope:{name:TS,version:MS},metrics:[{name:e,sum:{dataPoints:[{asInt:"1",startTimeUnixNano:o,timeUnixNano:o,attributes:Object.entries(a).map(([t,r])=>FS(t,r))}],aggregationTemporality:1,isMonotonic:true}}]}]}]}}async function Fc(e,a={}){try{let[o,t]=await Promise.all([Rt(),Y()]),r=o?.email,i=t?.tenant;if(!r||!i){Lc.debug(`Skipping OTel metric "${e}": no cached identity available`);return}let s=OS(e,a);await Qu.post(LS(),{json:s,timeout:qS,headers:{"Content-Type":"application/json","x-flow-user":r,flowtenant:i}}),Lc.debug(`OTel metric sent: ${e}`);}catch(o){Lc.warn(`Failed to send OTel metric "${e}": ${String(o)}`);}}var Oc=k("cli:init"),BS={new:{label:"new",color:R.green},unchanged:{label:"unchanged",color:R.dim},divergent:{label:"kept (differs from template)",color:R.yellow},declined:{label:"pending (declined)",color:R.yellow}};function jS(e){process.stdout.write(`
84781
84779
  `+R.bold(` flow setup strategy
84782
84780
  `)),process.stdout.write(R.dim(` Target: ${e}
84783
84781
 
84784
84782
  `)),process.stdout.write(R.dim(` Files evaluated:
84785
84783
  `));for(let a of ri)process.stdout.write(R.dim(` \xB7 ${a.path}
84786
84784
  `));process.stdout.write(`
84787
- `);}function HS(e,a,o,t){C(w.CLI_STRATEGY_INIT_COMPLETED,{files_new:e.new,files_unchanged:e.unchanged,files_updated:e.clean,files_divergent:e.divergent,files_declined:e.declined,dry_run:a,duration_ms:t,exit_code:o}).catch(r=>{Bc.warn(`Failed to emit strategy init completed event: ${String(r)}`);}),Gc("flow_cli.strategy_init",{dry_run:a,files_new:e.new,files_updated:e.clean,exit_code:o}).catch(()=>{});}function _f(e,a){C(w.CLI_STRATEGY_INIT_FAILED,{error_message:e.slice(0,500),duration_ms:a}).catch(o=>{Bc.warn(`Failed to emit strategy init failed event: ${String(o)}`);}),Gc("flow_cli.strategy_init_failed",{duration_ms:a}).catch(()=>{});}async function QS(e){try{return await simpleGit(e).checkIsRepo(CheckRepoActions.IN_TREE)}catch{return false}}async function VS(){return ee(" Continue anyway? [y/N] ")}async function _S(){return D(`docs/catalog/ is the skill/agent/command catalog (~2.6MB); docs/playbooks/ is the
84785
+ `);}function US(e,a,o,t){C(w.CLI_STRATEGY_INIT_COMPLETED,{files_new:e.new,files_unchanged:e.unchanged,files_divergent:e.divergent,files_declined:e.declined,dry_run:a,duration_ms:t,exit_code:o}).catch(r=>{Oc.warn(`Failed to emit strategy init completed event: ${String(r)}`);}),Fc("flow_cli.strategy_init",{dry_run:a,files_new:e.new,exit_code:o}).catch(()=>{});}function Wf(e,a){C(w.CLI_STRATEGY_INIT_FAILED,{error_message:e.slice(0,500),duration_ms:a}).catch(o=>{Oc.warn(`Failed to emit strategy init failed event: ${String(o)}`);}),Fc("flow_cli.strategy_init_failed",{duration_ms:a}).catch(()=>{});}async function zS(e){try{return await simpleGit(e).checkIsRepo(CheckRepoActions.IN_TREE)}catch{return false}}async function WS(){return ee(" Continue anyway? [y/N] ")}async function JS(){return P(`docs/catalog/ is the skill/agent/command catalog (~2.6MB); docs/playbooks/ is the
84788
84786
  runbook + sub-runbook docs for your installed bundles, in every language they ship
84789
84787
  in (.md/.en.md/.es.md). This is the same content flow-playbooks-app renders \u2014 skip
84790
- it if you don't run that app.`),ee(" Also scaffold docs/catalog and docs/playbooks content? [y/N] ")}async function XS(){return us(" Which language?",[{value:"all",label:"All variants",description:"every .md/.en.md/.es.md kept as-is"},{value:"pt",label:"pt (default)",description:"the base, unsuffixed .md files only"},{value:"en",label:"en",description:".en.md only"},{value:"es",label:"es",description:".es.md only"}])}async function ln(e){Bc.debug(`Running flow setup strategy: ${JSON.stringify(e)}`);let a=e.path??process.cwd(),o=e.isInteractive??!!process.stdin.isTTY,t=e.confirmContinueWithoutGit??VS;if(!await QS(a)){let k=`${a} is not a git repository. Strategy docs are meant to be version-controlled \u2014 consider running "git init" first.`;if(!o)return e.json?Ne({error:k,exitCode:1}):S(`${k} Re-run interactively to confirm, or run "git init" first.`),1;if(D(k),!await t())return 1}e.json||JS(a);let r=Date.now(),i;try{i=await Uf({targetDir:a,dryRun:e.dryRun,force:e.force,assistant:e.assistant});}catch(k){throw _f(k instanceof Error?k.message:String(k),Date.now()-r),k}let s,n=e.confirmDocsContent??_S,d=e.selectDocsLang??XS,l=!!e.docsContent,c=e.docsLang??"all";if(!l&&o&&(l=await n(),l&&(c=await d())),l){let k=Vf();try{s=await Qf({targetDir:a,dryRun:e.dryRun,force:e.force,installedBundles:k,docsLang:c});}catch(T){throw _f(T instanceof Error?T.message:String(T),Date.now()-r),T}}let u=i.hasUnresolved||s?.hasUnresolved?2:0;if(HS(i.counts,!!e.dryRun,u,Date.now()-r),e.json)return ve({dryRun:!!e.dryRun,counts:i.counts,files:i.files,docsContent:s?{counts:s.counts,files:s.files,skippedPlaybooks:s.skippedPlaybooks}:void 0,exitCode:u}),u;let p=e.dryRun?R.dim("[dry-run] "):"";process.stdout.write(R.bold(` Result:
84791
- `));for(let k of i.files){let{label:T,color:L}=WS[k.status];process.stdout.write(` ${p}${L(T.padEnd(18))} ${k.path}
84788
+ it if you don't run that app.`),ee(" Also scaffold docs/catalog and docs/playbooks content? [y/N] ")}async function HS(){return us(" Which language?",[{value:"all",label:"All variants",description:"every .md/.en.md/.es.md kept as-is"},{value:"pt",label:"pt (default)",description:"the base, unsuffixed .md files only"},{value:"en",label:"en",description:".en.md only"},{value:"es",label:"es",description:".es.md only"}])}async function sn(e){Oc.debug(`Running flow setup strategy: ${JSON.stringify(e)}`);let a=e.path??process.cwd(),o=e.isInteractive??!!process.stdin.isTTY,t=e.confirmContinueWithoutGit??WS;if(!await zS(a)){let b=`${a} is not a git repository. Strategy docs are meant to be version-controlled \u2014 consider running "git init" first.`;if(!o)return e.json?Ne({error:b,exitCode:1}):S(`${b} Re-run interactively to confirm, or run "git init" first.`),1;if(P(b),!await t())return 1}e.json||jS(a);let r=Date.now(),i;try{i=await Bf({targetDir:a,dryRun:e.dryRun,force:e.force,assistant:e.assistant});}catch(b){throw Wf(b instanceof Error?b.message:String(b),Date.now()-r),b}let s,n=e.confirmDocsContent??JS,d=e.selectDocsLang??HS,l=!!e.docsContent,c=e.docsLang??"all";if(!l&&o&&(l=await n(),l&&(c=await d())),l){let b=zf();try{s=await Uf({targetDir:a,dryRun:e.dryRun,force:e.force,installedBundles:b,docsLang:c});}catch(D){throw Wf(D instanceof Error?D.message:String(D),Date.now()-r),D}}let u=i.hasUnresolved||s?.hasUnresolved?2:0;if(US(i.counts,!!e.dryRun,u,Date.now()-r),e.json)return be({dryRun:!!e.dryRun,counts:i.counts,files:i.files,docsContent:s?{counts:s.counts,files:s.files,skippedPlaybooks:s.skippedPlaybooks}:void 0,exitCode:u}),u;let m=e.dryRun?R.dim("[dry-run] "):"";process.stdout.write(R.bold(` Result:
84789
+ `));for(let b of i.files){let{label:D,color:q}=BS[b.status];process.stdout.write(` ${m}${q(D.padEnd(18))} ${b.path}
84792
84790
  `);}process.stdout.write(`
84793
- `);let{new:m,unchanged:g,clean:f,divergent:h,declined:v}=i.counts;if(K(`${m} new, ${g} unchanged, ${f} updated, ${h} kept (customized)`+(v>0?`, ${v} pending confirmation`:"")),h>0&&D("Some files were kept as-is because they differ from what this command last wrote. Re-run with --force to overwrite them."),v>0&&D("Some updates were declined or skipped (no TTY). Re-run with --force to apply them."),s){process.stdout.write(`
84791
+ `);let{new:p,unchanged:g,divergent:f,declined:h}=i.counts;if(K(`${p} new, ${g} unchanged, ${f} kept (differs from template)`+(h>0?`, ${h} pending confirmation`:"")),(f>0||h>0)&&P(`Some files differ from the Flow strategy template. Review your local changes before overwriting \u2014 run "git status"/"git diff" or your IDE's diff view. Re-run with --force to overwrite them.`),s){process.stdout.write(`
84794
84792
  `+R.bold(` docs/catalog + docs/playbooks:
84795
- `)),s.skippedPlaybooks&&D('No bundles installed (run "flow setup harness" first) \u2014 docs/playbooks/ was skipped; docs/catalog/ was still scaffolded.');let k=s.counts;K(`${k.new} new, ${k.unchanged} unchanged, ${k.clean} updated, ${k.divergent} kept (customized)`+(k.declined>0?`, ${k.declined} pending confirmation`:"")),(k.divergent>0||k.declined>0)&&D("Some docs-content files were kept as-is or pending confirmation. Re-run with --force to resolve.");}return u!==0&&S("flow setup strategy finished with unresolved files \u2014 see above."),u}j();U();var nr=["runbook-common","runbook-design","runbook-ops","runbook-product","runbook-quality","runbook-security","runbook-tech"];var zc="repos.yaml",YS="projects",ZS="projects-ref";function Xf(e,a,o){if(e===void 0)return [];if(!Array.isArray(e))return o.push(`"${a}:" must be a list \u2014 ignoring the whole section.`),[];let t=[];return e.forEach((r,i)=>{if(typeof r!="object"||r===null){o.push(`${a}[${i}] is not a mapping \u2014 skipped.`);return}let s=r,n=s.name!==void 0?String(s.name):"",d=s.remote!==void 0?String(s.remote):"";if(!n||!d){let l=n||`${a}[${i}]`,c=[!n&&"name",!d&&"remote"].filter(Boolean).join(" and ");o.push(`${l}: missing required field "${c}" \u2014 skipped (did you mean "remote:" instead of "url:"?)`);return}t.push({name:n,remote:d,group:s.group!==void 0?String(s.group):void 0});}),t}function $f(e){let a=join(e,zc);if(!existsSync(a))return null;let o=parse(readFileSync(a,"utf8"));if(!o||typeof o!="object"||Array.isArray(o))return null;let t=[],r=o.workspace;r!==void 0&&(typeof r!="object"||r===null)&&t.push('"workspace:" must be a mapping \u2014 using defaults (repos_dir, refs_dir).');let i=r&&typeof r=="object"?r:{};return (o.repos_dir!==void 0||o.refs_dir!==void 0)&&t.push('"repos_dir"/"refs_dir" must be nested under "workspace:", not at the top level \u2014 using defaults.'),{workspace:{repos_dir:String(i.repos_dir??YS),refs_dir:String(i.refs_dir??ZS)},repos:Xf(o.repos,"repos",t),references:Xf(o.references,"references",t),warnings:t}}function Yf(e,a){let o=join(e,zc),{warnings:t,...r}=a;writeFileSync(o,stringify(r),"utf8");}function Zf(e){let a=join(e,".gitignore"),o=zc;if(!existsSync(a)){writeFileSync(a,`${o}
84793
+ `)),s.skippedPlaybooks&&P('No bundles installed (run "flow setup harness" first) \u2014 docs/playbooks/ was skipped; docs/catalog/ was still scaffolded.');let b=s.counts;K(`${b.new} new, ${b.unchanged} unchanged, ${b.divergent} kept (differs from template)`+(b.declined>0?`, ${b.declined} pending confirmation`:"")),(b.divergent>0||b.declined>0)&&P("Some docs-content files were kept as-is or pending confirmation. Re-run with --force to resolve.");}return u!==0&&S("flow setup strategy finished with unresolved files \u2014 see above."),u}j();U();var nr=["runbook-common","runbook-design","runbook-ops","runbook-product","runbook-quality","runbook-security","runbook-tech"];var Bc="repos.yaml",_S="projects",XS="projects-ref";function Jf(e,a,o){if(e===void 0)return [];if(!Array.isArray(e))return o.push(`"${a}:" must be a list \u2014 ignoring the whole section.`),[];let t=[];return e.forEach((r,i)=>{if(typeof r!="object"||r===null){o.push(`${a}[${i}] is not a mapping \u2014 skipped.`);return}let s=r,n=s.name!==void 0?String(s.name):"",d=s.remote!==void 0?String(s.remote):"";if(!n||!d){let l=n||`${a}[${i}]`,c=[!n&&"name",!d&&"remote"].filter(Boolean).join(" and ");o.push(`${l}: missing required field "${c}" \u2014 skipped (did you mean "remote:" instead of "url:"?)`);return}t.push({name:n,remote:d,group:s.group!==void 0?String(s.group):void 0});}),t}function Vf(e){let a=join(e,Bc);if(!existsSync(a))return null;let o=parse(readFileSync(a,"utf8"));if(!o||typeof o!="object"||Array.isArray(o))return null;let t=[],r=o.workspace;r!==void 0&&(typeof r!="object"||r===null)&&t.push('"workspace:" must be a mapping \u2014 using defaults (repos_dir, refs_dir).');let i=r&&typeof r=="object"?r:{};return (o.repos_dir!==void 0||o.refs_dir!==void 0)&&t.push('"repos_dir"/"refs_dir" must be nested under "workspace:", not at the top level \u2014 using defaults.'),{workspace:{repos_dir:String(i.repos_dir??_S),refs_dir:String(i.refs_dir??XS)},repos:Jf(o.repos,"repos",t),references:Jf(o.references,"references",t),warnings:t}}function Qf(e,a){let o=join(e,Bc),{warnings:t,...r}=a;writeFileSync(o,stringify(r),"utf8");}function _f(e){let a=join(e,".gitignore"),o=Bc;if(!existsSync(a)){writeFileSync(a,`${o}
84796
84794
  `,"utf8");return}readFileSync(a,"utf8").split(`
84797
84795
  `).some(i=>i.trim()===o)||appendFileSync(a,`${o}
84798
- `,"utf8");}function eh(e,a){let o=join(e,".claudeignore"),t=existsSync(o)?readFileSync(o,"utf8"):"",r=new Set(t.split(`
84796
+ `,"utf8");}function Xf(e,a){let o=join(e,".claudeignore"),t=existsSync(o)?readFileSync(o,"utf8"):"",r=new Set(t.split(`
84799
84797
  `).map(d=>d.trim())),i=[a.repos_dir,a.refs_dir].filter((d,l,c)=>c.indexOf(d)===l).filter(d=>!r.has(`${d}/`));if(i.length===0)return;let s=t?"":`# Paths excluded from Claude Code context.
84800
84798
  `,n=i.map(d=>`# ${d}/ \u2014 repos cloned via flow setup workspace, not part of this repo's own docs.
84801
84799
  ${d}/`).join(`
@@ -84804,18 +84802,18 @@ ${d}/`).join(`
84804
84802
  ${n}
84805
84803
  `,"utf8"):writeFileSync(o,`${s}
84806
84804
  ${n}
84807
- `,"utf8");}var Kf="## Off-Limits \u2014 Workspace Repos";function ah(e,a,o){if(!o)return "declined";let t=join(e,"CLAUDE.md");if(!existsSync(t))return "no-claude-md";let r=readFileSync(t,"utf8");if(r.includes(Kf))return "already-present";let i=`
84808
- ${Kf}
84805
+ `,"utf8");}var Hf="## Off-Limits \u2014 Workspace Repos";function Kf(e,a,o){if(!o)return "declined";let t=join(e,"CLAUDE.md");if(!existsSync(t))return "no-claude-md";let r=readFileSync(t,"utf8");if(r.includes(Hf))return "already-present";let i=`
84806
+ ${Hf}
84809
84807
 
84810
84808
  \`${a.repos_dir}/\` and \`${a.refs_dir}/\` contain repos cloned via \`flow setup workspace\` \u2014 not part of this repo's own documentation or code. They are excluded from Claude Code's context via \`.claudeignore\`.
84811
84809
 
84812
84810
  > Off-limits: do not read, index, link, or reference files inside these folders in any context.
84813
84811
  `;return appendFileSync(t,`${r.endsWith(`
84814
84812
  `)?"":`
84815
- `}${i}`,"utf8"),"appended"}var oh="projects",th="projects-ref";function eC(e){let a=e.match(/^https?:\/\/github\.com\/([^/]+)\/([^/.]+)(\.git)?\/?$/);return a?`git@github.com:${a[1]}/${a[2]}.git`:e}async function aC(){let e=await Fo(" Repo name (ENTER to finish): ");if(!e)return null;let a=await Fo(` Group/category for '${e}' (optional, default: general): `),o=await Fo(` Remote (URL) for '${e}' \u2014 SSH or HTTPS: `);if(!o)return null;let t=eC(o),r=await ee(` Is '${e}' a reference/read-only repo? [y/N] `);return {entry:{name:e,remote:t,group:a||"general"},isReference:r}}async function rh(){if(!await ee("repos.yaml not found. Set up this repo as a multi-repo workspace? [y/N] "))return null;let a=await Fo(` Folder for work repos (default: ${oh}): `),o=await Fo(` Folder for reference repos (default: ${th}): `),t=[],r=[];for(;;){let i=await aC();if(!i)break;i.isReference?r.push(i.entry):t.push(i.entry);}return t.length===0&&r.length===0?null:{workspace:{repos_dir:a||oh,refs_dir:o||th},repos:t,references:r,warnings:[]}}I();var sh=P("workspace:repos"),dh=6e4;async function rC(e){try{return (await simpleGit(e).status()).current}catch{return null}}function ch(){let{HOME:e,PATH:a,USER:o,SSH_AUTH_SOCK:t}=process.env;return {HOME:e,PATH:a,USER:o,SSH_AUTH_SOCK:t,GIT_TERMINAL_PROMPT:"0"}}async function iC(e){await simpleGit(e,{timeout:{block:dh}}).env(ch()).pull(["--ff-only"]);}async function sC(e,a){await simpleGit({timeout:{block:dh}}).env(ch()).clone(e,a);}async function Jc(e,a,o){let t=join(a,e.name),r=join(t,".git");if(existsSync(r)){let i=await rC(t);if(i==="main"||i==="master")try{return await iC(t),{name:e.name,kind:o,outcome:"updated"}}catch(s){return sh.warn(`[${e.name}] pull failed (branch diverged?): ${String(s)}`),{name:e.name,kind:o,outcome:"skipped"}}return {name:e.name,kind:o,outcome:"skipped"}}try{return mkdirSync(a,{recursive:!0}),await sC(e.remote,t),{name:e.name,kind:o,outcome:"cloned"}}catch(i){let s=i instanceof Error?i.message:String(i);return sh.error(`[${e.name}] clone failed: ${s}`),{name:e.name,kind:o,outcome:"failed",error:s}}}function mn(e,a){return existsSync(e)?readdirSync(e,{withFileTypes:true}).filter(o=>o.isDirectory()&&!a.has(o.name)).map(o=>o.name):[]}async function lh(e={}){let a=e.targetDir??process.cwd(),o=e.isInteractive??!!process.stdin.isTTY,t=$f(a);if(!t){if(!o)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true,manifestWarnings:[]};let u=await rh();if(!u)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true,manifestWarnings:[]};Yf(a,u),Zf(a),t=u;}eh(a,t.workspace);let r=join(a,t.workspace.repos_dir),i=join(a,t.workspace.refs_dir),s=[];for(let u of t.repos)s.push(await Jc(u,r,"repo"));for(let u of t.references)s.push(await Jc(u,i,"reference"));let n=new Set(t.repos.map(u=>u.name)),d=new Set(t.references.map(u=>u.name)),l=[...mn(r,n),...mn(i,d)],c=0;if(e.prune&&l.length>0)for(let u of [r,i]){let p=mn(u,u===r?n:d);for(let m of p)rmSync(join(u,m),{recursive:true,force:true}),c++;}return {repos:s,orphans:e.prune?[]:l,prunedCount:c,skippedNoManifest:false,manifestWarnings:t.warnings,workspaceDirs:t.workspace}}var lC=promisify(execFile),uh=5e3;async function ph(){try{let{stdout:e,stderr:a}=await lC("ssh",["-T","git@github.com","-o","BatchMode=yes","-o",`ConnectTimeout=${uh/1e3}`],{timeout:uh+2e3});return `${e}${a}`.includes("successfully authenticated")}catch(e){return `${e.stdout??""}${e.stderr??""}`.includes("successfully authenticated")}}I();var uC=["local","project","user"],gh=[{name:"cit-tools",description:"CI&T-branded content tools (deck-architect agent, ciandt-pptx, ciandt-clay-render, pptx-builder, refiner skills)"},{name:"commons-claude",description:"Claude Code machine-setup skills (setup-claude-defaults, setup-session-recap, setup-statusline) \u2014 not product tooling, personal environment config"}],Qc=gh.map(e=>e.name);function pC(e){return e.filter(a=>!Qc.includes(a))}function mC(){D(`The following ${nr.length} runbook bundles will be installed:`);for(let e of nr)process.stdout.write(` - ${e}
84816
- `);}async function gC(e,a){if(a||!e)return [];let o=[];for(let{name:t,description:r}of gh)await ee(` Also install ${t}? (${r}) [y/N] `)&&o.push(t);return o}function fC(e){let a=Ae().plugins,o=process.cwd();for(let[t,r]of Object.entries(a))if(t===e||t.startsWith(`${e}@`)){let i=r.find(s=>s.scope==="user"||s.projectPath===o);if(i)return i}}function gn(e){return e.scope==="user"?"globally (~/.claude/)":`at ${e.scope} scope in ${e.projectPath??"(unknown project)"}`}async function hC(e,a,o){return D(`${e} is already installed ${gn(o)}.`),ee(` Move it to ${Xa[a].actionLabel} instead? This uninstalls it from ${gn(o)} first. [y/N] `)}async function bC(){return us(" Install scope:",uC.map(e=>({value:e,label:Xa[e].actionLabel,description:Xa[e].description})))}var fn=Symbol("skip");async function mh(e,a,o){let{scope:t,silent:r,isInteractive:i,force:s}=o;if(!s){let n=fC(e);if(n){if(r||!i)return r||D(`${a}Skipping ${e} \u2014 already installed ${gn(n)}. Re-run with --force to install here too.`),fn;if(!await hC(e,t,n))return D(`${a}Skipped ${e}.`),fn;let l=await Xs(e,{force:true,scope:n.scope});if(l!==0)return D(`${a}Could not remove ${e} from ${gn(n)} \u2014 skipping rather than leaving it in an inconsistent state.`),l}}return r||D(`${a}Installing ${e}...`),ir([e],{scope:t,silent:r,force:s})}async function Vc(e={}){let a=e.isInteractive??!!process.stdin.isTTY;if(e.extraPlugins){let s=pC(e.extraPlugins);if(s.length>0){let n=`--extra-plugins: unknown bundle(s) ${s.join(", ")} \u2014 valid values are ${Qc.join(", ")}`;return e.silent?ve({error:n}):S(n),1}}e.silent||mC();let o=e.scope;if(!o&&!e.silent&&a)try{o=await bC();}catch(s){if(s instanceof Error&&s.message==="SIGINT")return process.stdout.write(`
84817
- `),130;throw s}let t=e.force??false,r={scope:o,silent:e.silent,isInteractive:a,force:t},i=[];try{for(let n=0;n<nr.length;n++){let d=nr[n],l=`[${n+1}/${nr.length}] `,c=await mh(d,l,r);c!==fn&&i.push(c);}let s=e.extraPlugins?Qc.filter(n=>e.extraPlugins.includes(n)):await gC(a,e.silent);for(let n=0;n<s.length;n++){let d=s[n],l=`[extra ${n+1}/${s.length}] `,c=await mh(d,l,r);c!==fn&&i.push(c);}}catch(s){if(s instanceof Error&&s.message==="SIGINT")return process.stdout.write(`
84818
- `),130;throw s}return i.some(s=>s!==0)?1:0}var vC=P("cli:setup-workspace");function yC(e){switch(e){case "cloned":return "cloned";case "updated":return "updated";case "skipped":return "skipped (diverged or another branch)";case "failed":return "failed"}}async function kC(e){e||await ph()||(D("SSH key not configured for GitHub (or not added to your account)."),process.stdout.write(` This may cause repo clones below to fail. To set one up:
84813
+ `}${i}`,"utf8"),"appended"}var $f="projects",Yf="projects-ref";function KS(e){let a=e.match(/^https?:\/\/github\.com\/([^/]+)\/([^/.]+)(\.git)?\/?$/);return a?`git@github.com:${a[1]}/${a[2]}.git`:e}async function $S(){let e=await Fo(" Repo name (ENTER to finish): ");if(!e)return null;let a=await Fo(` Group/category for '${e}' (optional, default: general): `),o=await Fo(` Remote (URL) for '${e}' \u2014 SSH or HTTPS: `);if(!o)return null;let t=KS(o),r=await ee(` Is '${e}' a reference/read-only repo? [y/N] `);return {entry:{name:e,remote:t,group:a||"general"},isReference:r}}async function Zf(){if(!await ee("repos.yaml not found. Set up this repo as a multi-repo workspace? [y/N] "))return null;let a=await Fo(` Folder for work repos (default: ${$f}): `),o=await Fo(` Folder for reference repos (default: ${Yf}): `),t=[],r=[];for(;;){let i=await $S();if(!i)break;i.isReference?r.push(i.entry):t.push(i.entry);}return t.length===0&&r.length===0?null:{workspace:{repos_dir:a||$f,refs_dir:o||Yf},repos:t,references:r,warnings:[]}}I();var ah=k("workspace:repos"),th=6e4;async function eC(e){try{return (await simpleGit(e).status()).current}catch{return null}}function rh(){let{HOME:e,PATH:a,USER:o,SSH_AUTH_SOCK:t}=process.env;return {HOME:e,PATH:a,USER:o,SSH_AUTH_SOCK:t,GIT_TERMINAL_PROMPT:"0"}}async function aC(e){await simpleGit(e,{timeout:{block:th}}).env(rh()).pull(["--ff-only"]);}async function oC(e,a){await simpleGit({timeout:{block:th}}).env(rh()).clone(e,a);}async function Uc(e,a,o){let t=join(a,e.name),r=join(t,".git");if(existsSync(r)){let i=await eC(t);if(i==="main"||i==="master")try{return await aC(t),{name:e.name,kind:o,outcome:"updated"}}catch(s){return ah.warn(`[${e.name}] pull failed (branch diverged?): ${String(s)}`),{name:e.name,kind:o,outcome:"skipped"}}return {name:e.name,kind:o,outcome:"skipped"}}try{return mkdirSync(a,{recursive:!0}),await oC(e.remote,t),{name:e.name,kind:o,outcome:"cloned"}}catch(i){let s=i instanceof Error?i.message:String(i);return ah.error(`[${e.name}] clone failed: ${s}`),{name:e.name,kind:o,outcome:"failed",error:s}}}function cn(e,a){return existsSync(e)?readdirSync(e,{withFileTypes:true}).filter(o=>o.isDirectory()&&!a.has(o.name)).map(o=>o.name):[]}async function ih(e={}){let a=e.targetDir??process.cwd(),o=e.isInteractive??!!process.stdin.isTTY,t=Vf(a);if(!t){if(!o)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true,manifestWarnings:[]};let u=await Zf();if(!u)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true,manifestWarnings:[]};Qf(a,u),_f(a),t=u;}Xf(a,t.workspace);let r=join(a,t.workspace.repos_dir),i=join(a,t.workspace.refs_dir),s=[];for(let u of t.repos)s.push(await Uc(u,r,"repo"));for(let u of t.references)s.push(await Uc(u,i,"reference"));let n=new Set(t.repos.map(u=>u.name)),d=new Set(t.references.map(u=>u.name)),l=[...cn(r,n),...cn(i,d)],c=0;if(e.prune&&l.length>0)for(let u of [r,i]){let m=cn(u,u===r?n:d);for(let p of m)rmSync(join(u,p),{recursive:true,force:true}),c++;}return {repos:s,orphans:e.prune?[]:l,prunedCount:c,skippedNoManifest:false,manifestWarnings:t.warnings,workspaceDirs:t.workspace}}var sC=promisify(execFile),sh=5e3;async function nh(){try{let{stdout:e,stderr:a}=await sC("ssh",["-T","git@github.com","-o","BatchMode=yes","-o",`ConnectTimeout=${sh/1e3}`],{timeout:sh+2e3});return `${e}${a}`.includes("successfully authenticated")}catch(e){return `${e.stdout??""}${e.stderr??""}`.includes("successfully authenticated")}}I();var nC=["local","project","user"],ch=[{name:"cit-tools",description:"CI&T-branded content tools (deck-architect agent, ciandt-pptx, ciandt-clay-render, pptx-builder, refiner skills)"},{name:"commons-claude",description:"Claude Code machine-setup skills (setup-claude-defaults, setup-session-recap, setup-statusline) \u2014 not product tooling, personal environment config"}],Wc=ch.map(e=>e.name);function dC(e){return e.filter(a=>!Wc.includes(a))}function cC(){P(`The following ${nr.length} runbook bundles will be installed:`);for(let e of nr)process.stdout.write(` - ${e}
84814
+ `);}async function lC(e,a){if(a||!e)return [];let o=[];for(let{name:t,description:r}of ch)await ee(` Also install ${t}? (${r}) [y/N] `)&&o.push(t);return o}function uC(e){let a=Ae().plugins,o=process.cwd();for(let[t,r]of Object.entries(a))if(t===e||t.startsWith(`${e}@`)){let i=r.find(s=>s.scope==="user"||s.projectPath===o);if(i)return i}}function ln(e){return e.scope==="user"?"globally (~/.claude/)":`at ${e.scope} scope in ${e.projectPath??"(unknown project)"}`}async function pC(e,a,o){return P(`${e} is already installed ${ln(o)}.`),ee(` Move it to ${Ka[a].actionLabel} instead? This uninstalls it from ${ln(o)} first. [y/N] `)}async function mC(){return us(" Install scope:",nC.map(e=>({value:e,label:Ka[e].actionLabel,description:Ka[e].description})))}var un=Symbol("skip");async function dh(e,a,o){let{scope:t,silent:r,isInteractive:i,force:s}=o;if(!s){let n=uC(e);if(n){if(r||!i)return r||P(`${a}Skipping ${e} \u2014 already installed ${ln(n)}. Re-run with --force to install here too.`),un;if(!await pC(e,t,n))return P(`${a}Skipped ${e}.`),un;let l=await Xs(e,{force:true,scope:n.scope});if(l!==0)return P(`${a}Could not remove ${e} from ${ln(n)} \u2014 skipping rather than leaving it in an inconsistent state.`),l}}return r||P(`${a}Installing ${e}...`),ir([e],{scope:t,silent:r,force:s})}async function Jc(e={}){let a=e.isInteractive??!!process.stdin.isTTY;if(e.extraPlugins){let s=dC(e.extraPlugins);if(s.length>0){let n=`--extra-plugins: unknown bundle(s) ${s.join(", ")} \u2014 valid values are ${Wc.join(", ")}`;return e.silent?be({error:n}):S(n),1}}e.silent||cC();let o=e.scope;if(!o&&!e.silent&&a)try{o=await mC();}catch(s){if(s instanceof Error&&s.message==="SIGINT")return process.stdout.write(`
84815
+ `),130;throw s}let t=e.force??false,r={scope:o,silent:e.silent,isInteractive:a,force:t},i=[];try{for(let n=0;n<nr.length;n++){let d=nr[n],l=`[${n+1}/${nr.length}] `,c=await dh(d,l,r);c!==un&&i.push(c);}let s=e.extraPlugins?Wc.filter(n=>e.extraPlugins.includes(n)):await lC(a,e.silent);for(let n=0;n<s.length;n++){let d=s[n],l=`[extra ${n+1}/${s.length}] `,c=await dh(d,l,r);c!==un&&i.push(c);}}catch(s){if(s instanceof Error&&s.message==="SIGINT")return process.stdout.write(`
84816
+ `),130;throw s}return i.some(s=>s!==0)?1:0}var gC=k("cli:setup-workspace");function fC(e){switch(e){case "cloned":return "cloned";case "updated":return "updated";case "skipped":return "skipped (diverged or another branch)";case "failed":return "failed"}}async function hC(e){e||await nh()||(P("SSH key not configured for GitHub (or not added to your account)."),process.stdout.write(` This may cause repo clones below to fail. To set one up:
84819
84817
  `),process.stdout.write(` 1. Check for an existing key: ls -la ~/.ssh/id_ed25519.pub
84820
84818
  `),process.stdout.write(` 2. If none, generate one: ssh-keygen -t ed25519 -C "your_email@example.com"
84821
84819
  `),process.stdout.write(` 3. Start the agent: eval "$(ssh-agent -s)"
@@ -84823,12 +84821,12 @@ ${Kf}
84823
84821
  `),process.stdout.write(` 5. Copy the public key: pbcopy < ~/.ssh/id_ed25519.pub (macOS)
84824
84822
  `),process.stdout.write(` 6. Add it on GitHub: https://github.com/settings/ssh/new
84825
84823
  `),process.stdout.write(` 7. Test the connection: ssh -T git@github.com
84826
- `));}async function PC(e,a,o,t){if(o||!t||a.skippedNoManifest||!a.workspaceDirs)return;let{repos_dir:r,refs_dir:i}=a.workspaceDirs,s=await ee(` Add an off-limits note to CLAUDE.md for '${r}/' and '${i}/'? [y/N] `),n=ah(e,a.workspaceDirs,s);n==="appended"?D(`CLAUDE.md updated with an off-limits note for '${r}/' and '${i}/'.`):n==="already-present"?D("CLAUDE.md already has the off-limits note \u2014 skipped."):n==="no-claude-md"&&D("No CLAUDE.md found in this repo \u2014 skipped the off-limits note.");}async function _c(e={}){vC.debug(`Running flow setup workspace: ${JSON.stringify(e)}`);let a=e.isInteractive??!!process.stdin.isTTY;await kC(e.json);let o=await lh({targetDir:e.path,prune:e.prune});if(e.json)return ve({repos:o.repos,orphans:o.orphans,prunedCount:o.prunedCount,skippedNoManifest:o.skippedNoManifest,manifestWarnings:o.manifestWarnings}),o.repos.some(n=>n.outcome==="failed")?1:0;for(let n of o.manifestWarnings)D(`repos.yaml: ${n}`);if(o.skippedNoManifest)return D("No repos.yaml and no interactive terminal \u2014 nothing to do."),0;for(let n of o.repos)process.stdout.write(` ${n.name}: ${yC(n.outcome)}
84827
- `);let t=o.repos.filter(n=>n.outcome==="cloned").length,r=o.repos.filter(n=>n.outcome==="updated").length,i=o.repos.filter(n=>n.outcome==="skipped").length,s=o.repos.filter(n=>n.outcome==="failed").length;return K(`${t} cloned, ${r} updated, ${i} skipped`+(s>0?`, ${s} failed`:"")+(o.prunedCount>0?`, ${o.prunedCount} pruned`:"")),o.orphans.length>0&&D(`Orphan director${o.orphans.length===1?"y":"ies"} not in repos.yaml: ${o.orphans.join(", ")}. Re-run with --prune to remove.`),await PC(e.path??process.cwd(),o,e.json,a),s>0?1:0}var DC=[{key:"strategy",label:"strategy (scaffold the numbered documentation structure)",run:e=>ln({path:e})},{key:"harness",label:"harness (install the fixed set of Flow runbook bundles)",run:()=>Vc({})},{key:"workspace",label:"workspace (clone/update repos declared in repos.yaml)",run:e=>_c({path:e})}];async function wC(e){return ee(` Run ${e}? [y/N] `)}async function fh(e={}){let a=e.isInteractive??!!process.stdin.isTTY,o=e.confirmStep??wC,t=!!e.yes||!a;!e.yes&&!a&&D("No interactive terminal and --yes not set \u2014 running all steps without prompting.");let r=[];for(let i of DC){if(!(t||await o(i.label))){D(` \u2192 ${i.key} skipped.`);continue}r.push(await i.run(e.path));}return r.some(i=>i!==0)?1:0}function hh(e){let a=new Command;a.enablePositionalOptions(),a.name("flow").description("FlowSetup CLI \u2014 Manage Flow plugins in your Claude Code").version(`@ciandt-flow/cli v${re}`,"-V, --version","Display the CLI version").addHelpText("after",`
84824
+ `));}async function bC(e,a,o,t){if(o||!t||a.skippedNoManifest||!a.workspaceDirs)return;let{repos_dir:r,refs_dir:i}=a.workspaceDirs,s=await ee(` Add an off-limits note to CLAUDE.md for '${r}/' and '${i}/'? [y/N] `),n=Kf(e,a.workspaceDirs,s);n==="appended"?P(`CLAUDE.md updated with an off-limits note for '${r}/' and '${i}/'.`):n==="already-present"?P("CLAUDE.md already has the off-limits note \u2014 skipped."):n==="no-claude-md"&&P("No CLAUDE.md found in this repo \u2014 skipped the off-limits note.");}async function Hc(e={}){gC.debug(`Running flow setup workspace: ${JSON.stringify(e)}`);let a=e.isInteractive??!!process.stdin.isTTY;await hC(e.json);let o=await ih({targetDir:e.path,prune:e.prune});if(e.json)return be({repos:o.repos,orphans:o.orphans,prunedCount:o.prunedCount,skippedNoManifest:o.skippedNoManifest,manifestWarnings:o.manifestWarnings}),o.repos.some(n=>n.outcome==="failed")?1:0;for(let n of o.manifestWarnings)P(`repos.yaml: ${n}`);if(o.skippedNoManifest)return P("No repos.yaml and no interactive terminal \u2014 nothing to do."),0;for(let n of o.repos)process.stdout.write(` ${n.name}: ${fC(n.outcome)}
84825
+ `);let t=o.repos.filter(n=>n.outcome==="cloned").length,r=o.repos.filter(n=>n.outcome==="updated").length,i=o.repos.filter(n=>n.outcome==="skipped").length,s=o.repos.filter(n=>n.outcome==="failed").length;return K(`${t} cloned, ${r} updated, ${i} skipped`+(s>0?`, ${s} failed`:"")+(o.prunedCount>0?`, ${o.prunedCount} pruned`:"")),o.orphans.length>0&&P(`Orphan director${o.orphans.length===1?"y":"ies"} not in repos.yaml: ${o.orphans.join(", ")}. Re-run with --prune to remove.`),await bC(e.path??process.cwd(),o,e.json,a),s>0?1:0}var vC=[{key:"strategy",label:"strategy (scaffold the numbered documentation structure)",run:e=>sn({path:e})},{key:"harness",label:"harness (install the fixed set of Flow runbook bundles)",run:()=>Jc({})},{key:"workspace",label:"workspace (clone/update repos declared in repos.yaml)",run:e=>Hc({path:e})}];async function yC(e){return ee(` Run ${e}? [y/N] `)}async function lh(e={}){let a=e.isInteractive??!!process.stdin.isTTY,o=e.confirmStep??yC,t=!!e.yes||!a;!e.yes&&!a&&P("No interactive terminal and --yes not set \u2014 running all steps without prompting.");let r=[];for(let i of vC){if(!(t||await o(i.label))){P(` \u2192 ${i.key} skipped.`);continue}r.push(await i.run(e.path));}return r.some(i=>i!==0)?1:0}function uh(e){let a=new Command;a.enablePositionalOptions(),a.name("flow").description("FlowSetup CLI \u2014 Manage Flow plugins in your Claude Code").version(`@ciandt-flow/cli v${ve}`,"-V, --version","Display the CLI version").addHelpText("after",`
84828
84826
  Without arguments, opens the interactive interface (TUI).
84829
84827
  Use 'flow <command> --help' for details on each command.`).action(async()=>{await e();});let o=new Command("setup").description("Configure the CLI and provision Flow structure in the current repository");o.command("init").description("Initialize the Flow CLI configuration").addHelpText("after",`
84830
84828
  Examples:
84831
- $ flow setup init`).action(async()=>{let c=await Dc();G(c);}),o.command("strategy").description("Scaffold the numbered strategy documentation structure (0-current-state, 1-strategy, 2-plan, 3-delivery, 4-learn)").option("--dry-run","Preview changes without writing files or prompting",false).option("--json","Output machine-readable JSON",false).option("--force","Skip confirmation before overwriting an up-to-date file, and overwrite customized files too",false).option("--path <dir>","Target repository root (defaults to the current directory)").addOption(new Option("--assistant <name>","Also scaffold a config file for this coding assistant (e.g. CLAUDE.md). Interactive: asks for confirmation before creating it. Non-interactive: never creates it, even with this flag set.").choices(["claude-code"])).option("--docs-content","Also scaffold docs/catalog (skill/agent/command catalog) and docs/playbooks (runbook docs for your installed bundles). Interactive: asks for confirmation. Non-interactive: never scaffolds it, even with this flag set.",false).addOption(new Option("--docs-lang <lang>","With --docs-content: which language variant to write (default: all \u2014 every .md/.en.md/.es.md kept). Interactive: asked right after you confirm docs-content, no flag needed. A doc missing the chosen language falls back to whatever variant it does have.").choices(["all","pt","en","es"])).addHelpText("after",`
84829
+ $ flow setup init`).action(async()=>{let c=await vc();G(c);}),o.command("strategy").description("Scaffold the numbered strategy documentation structure (0-current-state, 1-strategy, 2-plan, 3-delivery, 4-learn)").option("--dry-run","Preview changes without writing files or prompting",false).option("--json","Output machine-readable JSON",false).option("--force","Skip confirmation before overwriting an up-to-date file, and overwrite customized files too",false).option("--path <dir>","Target repository root (defaults to the current directory)").addOption(new Option("--assistant <name>","Also scaffold a config file for this coding assistant (e.g. CLAUDE.md). Interactive: asks for confirmation before creating it. Non-interactive: never creates it, even with this flag set.").choices(["claude-code"])).option("--docs-content","Also scaffold docs/catalog (skill/agent/command catalog) and docs/playbooks (runbook docs for your installed bundles). Interactive: asks for confirmation. Non-interactive: never scaffolds it, even with this flag set.",false).addOption(new Option("--docs-lang <lang>","With --docs-content: which language variant to write (default: all \u2014 every .md/.en.md/.es.md kept). Interactive: asked right after you confirm docs-content, no flag needed. A doc missing the chosen language falls back to whatever variant it does have.").choices(["all","pt","en","es"])).addHelpText("after",`
84832
84830
  Examples:
84833
84831
  $ flow setup strategy
84834
84832
  $ flow setup strategy --dry-run
@@ -84836,7 +84834,7 @@ Examples:
84836
84834
  $ flow setup strategy --assistant claude-code
84837
84835
  $ flow setup strategy --docs-content
84838
84836
  $ flow setup strategy --docs-content --docs-lang en
84839
- $ flow setup strategy --json --path ./my-repo`).action(async c=>{let u=await ln({dryRun:c.dryRun,json:c.json,force:c.force,path:c.path,assistant:c.assistant,docsContent:c.docsContent,docsLang:c.docsLang});G(u);}),o.command("harness").description("Install the fixed set of Flow runbook bundles (tech, security, product, design, ops, common, quality)").addOption(new Option("--scope <scope>","Scope to install into: user, project, or local").choices(["user","project","local"])).option("--silent","Output in JSON only",false).option("--force","Reinstall bundles already installed elsewhere without asking for confirmation",false).option("--extra-plugins <names>","Also install these opt-in auxiliary bundles (comma-separated: cit-tools, commons-claude). The only way to install them non-interactively or with --silent \u2014 an interactive run without this flag still asks per bundle, and passing it skips that prompt entirely.").addHelpText("after",`
84837
+ $ flow setup strategy --json --path ./my-repo`).action(async c=>{let u=await sn({dryRun:c.dryRun,json:c.json,force:c.force,path:c.path,assistant:c.assistant,docsContent:c.docsContent,docsLang:c.docsLang});G(u);}),o.command("harness").description("Install the fixed set of Flow runbook bundles (tech, security, product, design, ops, common, quality)").addOption(new Option("--scope <scope>","Scope to install into: user, project, or local").choices(["user","project","local"])).option("--silent","Output in JSON only",false).option("--force","Reinstall bundles already installed elsewhere without asking for confirmation",false).option("--extra-plugins <names>","Also install these opt-in auxiliary bundles (comma-separated: cit-tools, commons-claude). The only way to install them non-interactively or with --silent \u2014 an interactive run without this flag still asks per bundle, and passing it skips that prompt entirely.").addHelpText("after",`
84840
84838
  Examples:
84841
84839
  $ flow setup harness
84842
84840
  $ flow setup harness --scope project
@@ -84852,11 +84850,11 @@ here too without asking, leaving the bundle enabled in both places.
84852
84850
  After the 7 bundles, an interactive run also asks once per opt-in extra
84853
84851
  (cit-tools, commons-claude) unless --extra-plugins was passed, which installs
84854
84852
  exactly the named bundles with no prompt \u2014 required in --silent or
84855
- non-interactive runs, since no prompt happens there either way.`).action(async c=>{let u=await Vc({scope:c.scope,silent:c.silent,force:c.force,extraPlugins:c.extraPlugins?.split(",").map(p=>p.trim()).filter(Boolean)});G(u);}),o.command("workspace").description("Clone / update repos declared in repos.yaml (wizard on first run)").option("--path <dir>","Target repository root (defaults to the current directory)").option("--prune","Remove local directories no longer declared in repos.yaml",false).option("--json","Output machine-readable JSON",false).addHelpText("after",`
84853
+ non-interactive runs, since no prompt happens there either way.`).action(async c=>{let u=await Jc({scope:c.scope,silent:c.silent,force:c.force,extraPlugins:c.extraPlugins?.split(",").map(m=>m.trim()).filter(Boolean)});G(u);}),o.command("workspace").description("Clone / update repos declared in repos.yaml (wizard on first run)").option("--path <dir>","Target repository root (defaults to the current directory)").option("--prune","Remove local directories no longer declared in repos.yaml",false).option("--json","Output machine-readable JSON",false).addHelpText("after",`
84856
84854
  Examples:
84857
84855
  $ flow setup workspace
84858
84856
  $ flow setup workspace --prune
84859
- $ flow setup workspace --json --path ./my-workspace`).action(async c=>{let u=await _c({path:c.path,prune:c.prune,json:c.json});G(u);}),o.command("framework-strategy").description("Orchestrate strategy \u2192 harness \u2192 workspace, asking [y/N] before each step").option("--path <dir>","Target repository root (defaults to the current directory)").option("--yes","Skip every confirmation and run all 3 steps back to back",false).addHelpText("after",`
84857
+ $ flow setup workspace --json --path ./my-workspace`).action(async c=>{let u=await Hc({path:c.path,prune:c.prune,json:c.json});G(u);}),o.command("framework-strategy").description("Orchestrate strategy \u2192 harness \u2192 workspace, asking [y/N] before each step").option("--path <dir>","Target repository root (defaults to the current directory)").option("--yes","Skip every confirmation and run all 3 steps back to back",false).addHelpText("after",`
84860
84858
  Examples:
84861
84859
  $ flow setup framework-strategy
84862
84860
  $ flow setup framework-strategy --yes
@@ -84865,7 +84863,7 @@ Examples:
84865
84863
  Without --yes and with an interactive terminal, asks [y/N] before each of the
84866
84864
  3 steps (strategy, harness, workspace) \u2014 declining one skips just that step
84867
84865
  and moves to the next. Without an interactive terminal, runs all 3 steps
84868
- without prompting even if --yes wasn't passed (there is no terminal to ask in).`).action(async c=>{let u=await fh({path:c.path,yes:c.yes});G(u);}),a.addCommand(o);let t=new Command("plugin").description("Manage plugins from the Findr catalog installed in your Claude Code");t.command("list").description("List available or installed plugins").option("--available","show full catalog with installation status",false).option("--outdated","show only plugins with updates available",false).option("--json","output as JSON",false).option("--source <name>","Named content source to list from (e.g. flow-harness); defaults to the standard catalog").addHelpText("after",`
84866
+ without prompting even if --yes wasn't passed (there is no terminal to ask in).`).action(async c=>{let u=await lh({path:c.path,yes:c.yes});G(u);}),a.addCommand(o);let t=new Command("plugin").description("Manage plugins from the Findr catalog installed in your Claude Code");t.command("list").description("List available or installed plugins").option("--available","show full catalog with installation status",false).option("--outdated","show only plugins with updates available",false).option("--json","output as JSON",false).option("--source <name>","Named content source to list from (e.g. flow-harness); defaults to the standard catalog").addHelpText("after",`
84869
84867
  Examples:
84870
84868
  $ flow plugin list
84871
84869
  $ flow plugin list --available
@@ -84880,11 +84878,11 @@ Examples:
84880
84878
  $ flow plugin install flow-adr-writer --silent
84881
84879
  $ flow plugin install superpowers@claude-plugins-official
84882
84880
  $ flow plugin install agent-sdk-dev@claude-code-plugins --marketplace-source anthropics/claude-code
84883
- $ flow plugin install runbook-design --source flow-harness`).action(async(c,u)=>{let p=c.filter(g=>g.trim());if(p.length===0){S("No valid plugin names provided"),G(1);return}Qe("cli",{verbose:u.verbose,silent:u.silent});let m=await ir(p,u);G(m);}),t.command("uninstall").description("Remove an installed plugin from Claude Code").argument("<name>","Name of the plugin to remove").option("--force","Skip interactive confirmation").addOption(new Option("--scope <scope>","Scope to uninstall from: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84881
+ $ flow plugin install runbook-design --source flow-harness`).action(async(c,u)=>{let m=c.filter(g=>g.trim());if(m.length===0){S("No valid plugin names provided"),G(1);return}Ve("cli",{verbose:u.verbose,silent:u.silent});let p=await ir(m,u);G(p);}),t.command("uninstall").description("Remove an installed plugin from Claude Code").argument("<name>","Name of the plugin to remove").option("--force","Skip interactive confirmation").addOption(new Option("--scope <scope>","Scope to uninstall from: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84884
84882
  Examples:
84885
84883
  $ flow plugin uninstall flow-adr-writer
84886
84884
  $ flow plugin uninstall flow-adr-writer --scope project
84887
- $ flow plugin uninstall startup-pack-ai --force`).action(async(c,u)=>{let p=await Xs(c,u);G(p);}),t.command("update").description("Update plugins to the latest version").argument("[name]","Name of the plugin to update (omit to update all)").option("--force","Force update even if already on latest version").option("--dry-run","Show what would be updated without making changes").option("--verbose","Display each step of the update process").option("--silent","Output in JSON only").addOption(new Option("--scope <scope>","Scope to update in: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84885
+ $ flow plugin uninstall startup-pack-ai --force`).action(async(c,u)=>{let m=await Xs(c,u);G(m);}),t.command("update").description("Update plugins to the latest version").argument("[name]","Name of the plugin to update (omit to update all)").option("--force","Force update even if already on latest version").option("--dry-run","Show what would be updated without making changes").option("--verbose","Display each step of the update process").option("--silent","Output in JSON only").addOption(new Option("--scope <scope>","Scope to update in: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84888
84886
  Examples:
84889
84887
  $ flow plugin update flow-adr-writer
84890
84888
  $ flow plugin update flow-adr-writer --scope project
@@ -84893,13 +84891,13 @@ Examples:
84893
84891
  $ flow plugin update flow-adr-writer --verbose
84894
84892
  $ flow plugin update flow-adr-writer --silent
84895
84893
  $ flow plugin update
84896
- $ flow plugin update --dry-run`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let p=await _g(c??null,u);G(p);}),t.command("enable").description("Enable an installed plugin").argument("<name>","Name of the plugin to enable").addOption(new Option("--scope <scope>","Scope to enable in: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84894
+ $ flow plugin update --dry-run`).action(async(c,u)=>{Ve("cli",{verbose:u.verbose,silent:u.silent});let m=await _g(c??null,u);G(m);}),t.command("enable").description("Enable an installed plugin").argument("<name>","Name of the plugin to enable").addOption(new Option("--scope <scope>","Scope to enable in: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84897
84895
  Examples:
84898
84896
  $ flow plugin enable flow-adr-writer
84899
- $ flow plugin enable flow-adr-writer --scope project`).action(async(c,u)=>{Qe("cli");let p=await Hg(c,u);G(p);}),t.command("disable").description("Disable an installed plugin").argument("<name>","Name of the plugin to disable").addOption(new Option("--scope <scope>","Scope to disable in: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84897
+ $ flow plugin enable flow-adr-writer --scope project`).action(async(c,u)=>{Ve("cli");let m=await Hg(c,u);G(m);}),t.command("disable").description("Disable an installed plugin").argument("<name>","Name of the plugin to disable").addOption(new Option("--scope <scope>","Scope to disable in: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84900
84898
  Examples:
84901
84899
  $ flow plugin disable flow-adr-writer
84902
- $ flow plugin disable flow-adr-writer --scope project`).action(async(c,u)=>{Qe("cli");let p=await Qg(c,u);G(p);}),t.command("export").description("Export installed plugins to a JSON file").option("--output <file>","Output file path","flow-plugins.json").addHelpText("after",`
84900
+ $ flow plugin disable flow-adr-writer --scope project`).action(async(c,u)=>{Ve("cli");let m=await Vg(c,u);G(m);}),t.command("export").description("Export installed plugins to a JSON file").option("--output <file>","Output file path","flow-plugins.json").addHelpText("after",`
84903
84901
  Examples:
84904
84902
  $ flow plugin export
84905
84903
  $ flow plugin export --output my-plugins.json`).action(async c=>{let u=await Ef(c);G(u);}),t.command("import").description("Install plugins from an exported JSON file").argument("<file>","Path to the export JSON file").option("--force","Force reinstall even if already installed",false).option("--dry-run","Preview what would be installed without installing",false).option("--diff","Show which plugins are already installed vs new",false).addOption(new Option("--scope <scope>","Override scope for all plugins: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
@@ -84908,27 +84906,27 @@ Examples:
84908
84906
  $ flow plugin import flow-plugins.json --scope user
84909
84907
  $ flow plugin import flow-plugins.json --force
84910
84908
  $ flow plugin import flow-plugins.json --dry-run
84911
- $ flow plugin import flow-plugins.json --diff`).action(async(c,u)=>{let p=await If(c,u);G(p);});let r=new Command("marketplace").description("Manage plugin marketplaces");r.command("add").description("Register a plugin marketplace in Claude Code").argument("<source>","Marketplace source (owner/repo or URL)").option("--force","Skip confirmation prompt").option("--verbose","Display command output").option("--silent","Output as JSON only").addHelpText("after",`
84909
+ $ flow plugin import flow-plugins.json --diff`).action(async(c,u)=>{let m=await If(c,u);G(m);});let r=new Command("marketplace").description("Manage plugin marketplaces");r.command("add").description("Register a plugin marketplace in Claude Code").argument("<source>","Marketplace source (owner/repo or URL)").option("--force","Skip confirmation prompt").option("--verbose","Display command output").option("--silent","Output as JSON only").addHelpText("after",`
84912
84910
  Examples:
84913
84911
  $ flow plugin marketplace add anthropics/claude-code
84914
84912
  $ flow plugin marketplace add https://github.com/owner/repo
84915
84913
  $ flow plugin marketplace add anthropics/claude-code --force
84916
- $ flow plugin marketplace add anthropics/claude-code --silent`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let p=await $g(c,u);G(p);}),t.addCommand(r),a.addCommand(t);let i=new Command("mcp").description("Manage MCP servers from the Findr catalog");i.command("add").description("Install an MCP server into Claude Code").argument("<name>","Name of the MCP server to install").argument("[args...]","Arguments to pass to the MCP server (URL for http, command for stdio)").addOption(new Option("--transport <type>","Transport type: http or stdio").choices(["http","stdio"]).makeOptionMandatory()).addOption(new Option("--scope <scope>","Scope to install into: user, project, or local").choices(["user","project","local"])).option("--force","Skip confirmation prompt").option("--verbose","Display command output").option("--silent","Output as JSON only").addHelpText("after",`
84914
+ $ flow plugin marketplace add anthropics/claude-code --silent`).action(async(c,u)=>{Ve("cli",{verbose:u.verbose,silent:u.silent});let m=await $g(c,u);G(m);}),t.addCommand(r),a.addCommand(t);let i=new Command("mcp").description("Manage MCP servers from the Findr catalog");i.command("add").description("Install an MCP server into Claude Code").argument("<name>","Name of the MCP server to install").argument("[args...]","Arguments to pass to the MCP server (URL for http, command for stdio)").addOption(new Option("--transport <type>","Transport type: http or stdio").choices(["http","stdio"]).makeOptionMandatory()).addOption(new Option("--scope <scope>","Scope to install into: user, project, or local").choices(["user","project","local"])).option("--force","Skip confirmation prompt").option("--verbose","Display command output").option("--silent","Output as JSON only").addHelpText("after",`
84917
84915
  Examples:
84918
84916
  $ flow mcp add notion --transport http https://mcp.notion.com/mcp
84919
84917
  $ flow mcp add mcp-chrome --transport stdio uvx mcp-chrome
84920
84918
  $ flow mcp add playwright-mcp --transport stdio uvx playwright-mcp --force
84921
- $ flow mcp add notion --transport http https://mcp.notion.com/mcp --scope project`).action(async(c,u,p)=>{Qe("cli",{verbose:p.verbose,silent:p.silent});let m=await hm(c,u,p);G(m);}),i.command("remove").description("Remove an MCP server from Claude Code").argument("<name>","Name of the MCP server to remove").addOption(new Option("--scope <scope>","Scope to remove from: user, project, or local").choices(["user","project","local"])).option("--force","Skip confirmation prompt").option("--verbose","Display command output").option("--silent","Output as JSON only").addHelpText("after",`
84919
+ $ flow mcp add notion --transport http https://mcp.notion.com/mcp --scope project`).action(async(c,u,m)=>{Ve("cli",{verbose:m.verbose,silent:m.silent});let p=await hm(c,u,m);G(p);}),i.command("remove").description("Remove an MCP server from Claude Code").argument("<name>","Name of the MCP server to remove").addOption(new Option("--scope <scope>","Scope to remove from: user, project, or local").choices(["user","project","local"])).option("--force","Skip confirmation prompt").option("--verbose","Display command output").option("--silent","Output as JSON only").addHelpText("after",`
84922
84920
  Examples:
84923
84921
  $ flow mcp remove notion
84924
84922
  $ flow mcp remove notion --scope project
84925
- $ flow mcp remove playwright-mcp --force`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let p=await bm(c,u);G(p);}),a.addCommand(i);let s=new Command("auth").description("Manage authentication credentials");s.command("login").description("Authenticate and save credentials locally").option("--jwt <token>","JWT token for non-interactive authentication").option("--starter-kit <slug>","Starter kit slug for non-interactive setup").option("--custom-url <url>","Custom Flow base URL for flow-ai-obs configuration").option("--custom-email <email>","Custom email for flow-ai-obs configuration").option("--verbose","Display each step of the authentication process").addHelpText("after",`
84923
+ $ flow mcp remove playwright-mcp --force`).action(async(c,u)=>{Ve("cli",{verbose:u.verbose,silent:u.silent});let m=await bm(c,u);G(m);}),a.addCommand(i);let s=new Command("auth").description("Manage authentication credentials");s.command("login").description("Authenticate and save credentials locally").option("--jwt <token>","JWT token for non-interactive authentication").option("--starter-kit <slug>","Starter kit slug for non-interactive setup").option("--custom-url <url>","Custom Flow base URL for flow-ai-obs configuration").option("--custom-email <email>","Custom email for flow-ai-obs configuration").option("--verbose","Display each step of the authentication process").addHelpText("after",`
84926
84924
  Examples:
84927
84925
  $ flow auth login
84928
84926
  $ flow auth login --jwt <token>
84929
84927
  $ flow auth login --jwt <token> --starter-kit dev
84930
84928
  $ flow auth login --jwt <token> --custom-email name@example.com
84931
- $ flow auth login --verbose`).action(async c=>{Qe("cli",{verbose:c.verbose});let u=await Dc(c);G(u);}),s.command("logout").description("Remove locally saved credentials").option("--force","Skip interactive confirmation").addHelpText("after",`
84929
+ $ flow auth login --verbose`).action(async c=>{Ve("cli",{verbose:c.verbose});let u=await vc(c);G(u);}),s.command("logout").description("Remove locally saved credentials").option("--force","Skip interactive confirmation").addHelpText("after",`
84932
84930
  Examples:
84933
84931
  $ flow auth logout
84934
84932
  $ flow auth logout --force`).action(async c=>{let u=await Bg(c.force);G(u);}),s.command("status").description("Display the current authentication status").addHelpText("after",`
@@ -84939,33 +84937,33 @@ Examples:
84939
84937
  $ flow skills add owner/repo -g
84940
84938
  $ flow skills add owner/repo --skill pr-review commit
84941
84939
  $ flow skills add ./local/skills -y
84942
- $ flow skills add owner/repo --list`).action(async(c,u)=>{let p=await wf(c,u);G(p);}),n.command("list").description("List installed skills").option("-g, --global","List global skills (default: project)").option("--json","Output as JSON").addHelpText("after",`
84940
+ $ flow skills add owner/repo --list`).action(async(c,u)=>{let m=await wf(c,u);G(m);}),n.command("list").description("List installed skills").option("-g, --global","List global skills (default: project)").option("--json","Output as JSON").addHelpText("after",`
84943
84941
  Examples:
84944
84942
  $ flow skills list
84945
84943
  $ flow skills list -g
84946
84944
  $ flow skills list --json`).action(async c=>{let u=await Cf(c);G(u);}),n.command("remove").description("Remove an installed skill").argument("[name]","Name of the skill to remove").option("-g, --global","Remove from global scope").option("--force","Skip confirmation").addHelpText("after",`
84947
84945
  Examples:
84948
84946
  $ flow skills remove pr-review
84949
- $ flow skills remove pr-review -g --force`).action(async(c,u)=>{let p=await Rf(c,u);G(p);}),a.addCommand(n);let d=new Command("bundle").description("Manage Flow bundles");d.command("install").description("Install all artifacts from a Findr bundle").argument("<name>","Bundle name to install").option("--verbose","Display each step of the installation process").addHelpText("after",`
84947
+ $ flow skills remove pr-review -g --force`).action(async(c,u)=>{let m=await Rf(c,u);G(m);}),a.addCommand(n);let d=new Command("bundle").description("Manage Flow bundles");d.command("install").description("Install all artifacts from a Findr bundle").argument("<name>","Bundle name to install").option("--verbose","Display each step of the installation process").addHelpText("after",`
84950
84948
  Examples:
84951
84949
  $ flow bundle install "My React Kit"
84952
84950
  $ flow bundle install "Squad Setup Bundle"
84953
- $ flow bundle install "My React Kit" --verbose`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose});let p=await Xg(c);G(p);}),a.addCommand(d),a.command("health").description("Check the CLI configuration and connectivity").option("--fix","Retroactively set autoUpdate: true on already-registered Flow-curated marketplaces (FLWP-71702)").addHelpText("after",`
84951
+ $ flow bundle install "My React Kit" --verbose`).action(async(c,u)=>{Ve("cli",{verbose:u.verbose});let m=await Xg(c);G(m);}),a.addCommand(d),a.command("health").description("Check the CLI configuration and connectivity").option("--fix","Retroactively set autoUpdate: true on already-registered Flow-curated marketplaces (FLWP-71702)").addHelpText("after",`
84954
84952
  Examples:
84955
84953
  $ flow health
84956
84954
  $ flow health --fix`).action(async c=>{let u=await Yg(c);G(u);}),a.command("usage").description("Show your current Flow budget usage").option("--json","output as JSON",false).addHelpText("after",`
84957
84955
  Examples:
84958
84956
  $ flow usage
84959
- $ flow usage --json`).action(async c=>{let u=await rf(c);G(u);});let l=new Command("modules").description("Manage Flow modules (binary companions for Claude Code)");l.action(async()=>{let c=await Ec();G(c);}),l.command("list").description("List available and installed modules").addHelpText("after",`
84957
+ $ flow usage --json`).action(async c=>{let u=await rf(c);G(u);});let l=new Command("modules").description("Manage Flow modules (binary companions for Claude Code)");l.action(async()=>{let c=await Cc();G(c);}),l.command("list").description("List available and installed modules").addHelpText("after",`
84960
84958
  Examples:
84961
- $ flow modules list`).action(async()=>{let c=await Ec();G(c);}),l.command("install").description("Install a module by alias").argument("<alias>","Module alias to install (e.g. metrics, dashboard)").addHelpText("after",`
84959
+ $ flow modules list`).action(async()=>{let c=await Cc();G(c);}),l.command("install").description("Install a module by alias").argument("<alias>","Module alias to install (e.g. metrics, dashboard)").addHelpText("after",`
84962
84960
  Examples:
84963
84961
  $ flow modules install metrics
84964
84962
  $ flow modules install dashboard`).action(async c=>{let u=await Of(c);G(u);}),l.command("update").description("Update an installed module, or all installed modules").argument("[alias]","Module alias to update (omit to update all installed)").addHelpText("after",`
84965
84963
  Examples:
84966
84964
  $ flow modules update
84967
- $ flow modules update metrics`).action(async c=>{let u=await Nf(c??null);G(u);}),a.addCommand(l);for(let c of ce)a.command(c.alias).description(c.description).helpOption(false).allowUnknownOption().passThroughOptions().argument("[passthrough...]","Arguments forwarded to the module binary").action(async u=>{await qf(c.alias,u);});return a.hook("preAction",()=>{Bs();}),a}I();function RC(){return de__default.join(Ce__default.homedir(),".claude","settings.json")}function vh(){let e=RC();try{if(!se__default.existsSync(e))return !0;let o=JSON.parse(se__default.readFileSync(e,"utf-8")).flowCli?.autoUpdate;return o===!1?!1:o==="modules-only"?"modules-only":!0}catch{return true}}I();var MC=P("updateChecker"),qC=promisify(execFile),LC=1440*60*1e3,yh=3e4;function FC(){let e=process.env.FLOW_HOME??de__default.join(Ce__default.homedir(),".flow");return de__default.join(e,"update.lock")}async function kh(e){try{let{stdout:a}=await qC(Ya(),["view",e,"version"],{timeout:yh,shell:process.platform==="win32"});return String(a).trim()||null}catch{return null}}async function OC(e){let a=new AbortController,o=setTimeout(()=>a.abort(),yh);try{let t=await fetch(`https://api.github.com/repos/${e}/releases/latest`,{signal:a.signal});return t.ok?(await t.json()).tag_name?.replace(/^v/,"")??null:null}catch{return null}finally{clearTimeout(o);}}async function NC(e){return e.versionCheck.type==="npm-registry"?kh(e.versionCheck.package):OC(e.versionCheck.repo)}async function GC(){let e=await kh("@ciandt-flow/cli");return e&&ze(re,e)?(Hs({currentVersion:re,latestVersion:e,isOutdated:true,packageName:"@ciandt-flow/cli"}).catch(()=>{}),e):null}async function BC(){let e=ot().filter(a=>a.installMethod!==null);await Promise.all(e.map(async a=>{let o=ce.find(s=>s.alias===a.alias);if(!o||o.hasOwnUpdateCheck)return;let t=Date.now(),r=a.lastChecked?new Date(a.lastChecked).getTime():0;if(t-r<LC)return;let i=await NC(o);try{await Pa({...a,lastChecked:new Date().toISOString()});}catch(s){MC.warn(`Failed to update lastChecked for ${a.alias}: ${String(s)}`);}i&&a.installedVersion&&ze(a.installedVersion,i)&&Ji(o,"background").catch(()=>{});}));}async function Kc(){let e=vh();if(e===false)return;let a=FC();se__default.mkdirSync(de__default.dirname(a),{recursive:true});let o=null;try{o=await Vb.lock(a,{realpath:!1,retries:0});}catch{return}try{if(e!=="modules-only"){let t=await GC().catch(()=>null);t&&process.stdout.write(`
84965
+ $ flow modules update metrics`).action(async c=>{let u=await Nf(c??null);G(u);}),a.addCommand(l);for(let c of de)a.command(c.alias).description(c.description).helpOption(false).allowUnknownOption().passThroughOptions().argument("[passthrough...]","Arguments forwarded to the module binary").action(async u=>{await qf(c.alias,u);});return a.hook("preAction",()=>{Bs();}),a}I();function DC(){return ne__default.join(Ce__default.homedir(),".claude","settings.json")}function mh(){let e=DC();try{if(!ie__default.existsSync(e))return !0;let o=JSON.parse(ie__default.readFileSync(e,"utf-8")).flowCli?.autoUpdate;return o===!1?!1:o==="modules-only"?"modules-only":!0}catch{return true}}I();var xC=k("updateChecker"),EC=promisify(execFile),IC=1440*60*1e3,gh=3e4;function TC(){let e=process.env.FLOW_HOME??ne__default.join(Ce__default.homedir(),".flow");return ne__default.join(e,"update.lock")}async function fh(e){try{let{stdout:a}=await EC(Za(),["view",e,"version"],{timeout:gh,shell:process.platform==="win32"});return String(a).trim()||null}catch{return null}}async function MC(e){let a=new AbortController,o=setTimeout(()=>a.abort(),gh);try{let t=await fetch(`https://api.github.com/repos/${e}/releases/latest`,{signal:a.signal});return t.ok?(await t.json()).tag_name?.replace(/^v/,"")??null:null}catch{return null}finally{clearTimeout(o);}}async function qC(e){return e.versionCheck.type==="npm-registry"?fh(e.versionCheck.package):MC(e.versionCheck.repo)}async function LC(){let e=await fh("@ciandt-flow/cli");return e&&ze(ve,e)?(Hs({currentVersion:ve,latestVersion:e,isOutdated:true,packageName:"@ciandt-flow/cli"}).catch(()=>{}),e):null}async function FC(){let e=ot().filter(a=>a.installMethod!==null);await Promise.all(e.map(async a=>{let o=de.find(s=>s.alias===a.alias);if(!o||o.hasOwnUpdateCheck)return;let t=Date.now(),r=a.lastChecked?new Date(a.lastChecked).getTime():0;if(t-r<IC)return;let i=await qC(o);try{await ka({...a,lastChecked:new Date().toISOString()});}catch(s){xC.warn(`Failed to update lastChecked for ${a.alias}: ${String(s)}`);}i&&a.installedVersion&&ze(a.installedVersion,i)&&Ji(o,"background").catch(()=>{});}));}async function Qc(){let e=mh();if(e===false)return;let a=TC();ie__default.mkdirSync(ne__default.dirname(a),{recursive:true});let o=null;try{o=await zb.lock(a,{realpath:!1,retries:0});}catch{return}try{if(e!=="modules-only"){let t=await LC().catch(()=>null);t&&process.stdout.write(`
84968
84966
  \u26A0 @ciandt-flow/cli v${t} installing in background.
84969
84967
  Restart flow to apply the update.
84970
84968
 
84971
- `);}await BC().catch(()=>{});}finally{await o().catch(()=>{});}}var UC=P("cli"),$c=hh(async()=>{Qe("tui"),Tl("tui"),Ml(),process.on("SIGINT",()=>{let{activeTab:a,screen:o}=y.getState();fr("sigint",a,o).finally(()=>process.exit(130));}),process.on("SIGTERM",()=>{let{activeTab:a,screen:o}=y.getState();fr("sigterm",a,o).finally(()=>process.exit(143));}),await Kc().catch(()=>{}),await Yu().catch(a=>{UC.error(`Failed to init catalog registry: ${String(a)}`);}),await xg();let{waitUntilExit:e}=render(jsx(Eg,{}),{alternateScreen:true,exitOnCtrlC:false});await e(),process.exit(0);});$c.hook("preAction",async(e,a)=>{a!==$c&&await Kc().catch(()=>{});});$c.parse();
84969
+ `);}await FC().catch(()=>{});}finally{await o().catch(()=>{});}}var NC=k("cli"),_c=uh(async()=>{Ve("tui"),xl("tui"),El(),process.on("SIGINT",()=>{let{activeTab:a,screen:o}=y.getState();fr("sigint",a,o).finally(()=>process.exit(130));}),process.on("SIGTERM",()=>{let{activeTab:a,screen:o}=y.getState();fr("sigterm",a,o).finally(()=>process.exit(143));}),await Qc().catch(()=>{}),await $u().catch(a=>{NC.error(`Failed to init catalog registry: ${String(a)}`);}),await xg();let{waitUntilExit:e}=render(jsx(Eg,{}),{alternateScreen:true,exitOnCtrlC:false});await e(),process.exit(0);});_c.hook("preAction",async(e,a)=>{a!==_c&&await Qc().catch(()=>{});});_c.parse();