@ciandt-flow/cli 2.10.0-beta.33 → 2.10.0-beta.35

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 +140 -123
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
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 Md from'readline';import {createInterface}from'readline';import Nn from'conf';import ju,{HTTPError}from'ky';import {StatusCodes}from'http-status-codes';import {execa}from'execa';import {Box,Text,render,useWindowSize,useInput,useApp}from'ink';import fv,{useRef,useCallback,useMemo,useEffect,useState}from'react';import {create}from'zustand';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import Cb from'jsonwebtoken';import Nb from'proper-lockfile';import sv from'ink-big-text';import Fp from'ink-spinner';import*as Ua from'fs/promises';import {readFile,mkdir,writeFile,rename,stat,rm as rm$1,mkdtemp,readdir,cp as cp$1}from'fs/promises';import gy from'unzipper';import {simpleGit,CheckRepoActions}from'simple-git';import Jd from'semver';import vc from'yocto-spinner';import {Command,Option}from'commander';import {parse,stringify}from'yaml';var bh=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 Hc=(e,a)=>{for(var o in a)bh(e,o,{get:a[o],enumerable:true});};var fo,pe,pn,dr,gt,ft,Qc,mn,Xa,me,ea,Ka,si,ht,bt,vt,yt,U=H(()=>{"use strict";fo="FLOW",pe="flow-skills",pn="flow-cli",dr="internal",gt="external",ft={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"}},Qc={internal:{label:"Flow",color:"blue"},external:{label:"External",color:"white"}},mn=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]$/,si="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 ni,yh,_c,cr,gn=H(()=>{"use strict";ni="aes-256-gcm",yh=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(yh),t=kt.createCipheriv(ni,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:ni}}decrypt(a){if(a.algorithm!==ni)throw new Error(`Unsupported encryption algorithm: ${a.algorithm}`);let o=kt.createDecipheriv(ni,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 fn(e){return e.replace(wh,"").replace(Sh,"").replace(Ch,"").replace(kh,"Bearer ***").replace(Ph,"***").replace(Dh,"***").replace(/\r\n|\r|\n/g,"\\n")}var kh,Ph,Dh,wh,Sh,Ch,hn=H(()=>{"use strict";kh=/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,Ph=/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_-]*)?/g,Dh=/[A-Za-z0-9+/]{40,}={0,2}/g,wh=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|\x1b\x1b)/g,Sh=/\x1b(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,Ch=/\x1b/g;});function ci(e){return e||pe}function Xc(e,a,o){return vn(ci(o),e,a)}function bn(e,a){return de.join(Ce.homedir(),ba,"plugins","marketplaces",ci(a),"plugins","native",e)}function li(e){return de.join(Ce.homedir(),ba,"plugins","marketplaces",ci(e),".claude-plugin","marketplace.json")}function Wo(){return de.join(Ce.homedir(),ba,"plugins","known_marketplaces.json")}function Kc(e){return de.join(Ce.homedir(),ba,"plugins","marketplaces",ci(e))}function $c(){return de.join(Ce.homedir(),di,"cache","install.lock")}function Yc(){return de.join(Ce.homedir(),di,"logs","flowsetup.log")}function vn(e,a,o){return de.join(Ce.homedir(),ba,"plugins","cache",e,a,o)}function Jo(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 ui(e="user"){return e==="project"?de.join(process.cwd(),".opencode","plugins"):de.join(Ce.homedir(),".config","opencode","plugins")}function Zc(){return de.join(Ce.homedir(),di,"flow-catalogs.json")}function el(){let e=process.env.FLOW_HOME??de.join(Ce.homedir(),di);return de.join(e,"config.json")}function pi(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 yn(e="user"){return e==="project"||e==="local"?de.join(process.cwd(),ba,"hooks"):de.join(Ce.homedir(),ba,"hooks")}var ba,di,Oe=H(()=>{"use strict";U();ba=".claude",di=".flow";});var Rh,Ah,mi,al=H(()=>{"use strict";Oe();Rh=5*1024*1024,Ah=3,mi=class{filePath;constructor(){this.filePath=Yc(),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>Rh){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(Ah))se.unlinkSync(de.join(a,r));}catch{}}};});var gi,ol=H(()=>{"use strict";gi=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 fi,tl=H(()=>{"use strict";fi=class{write(a){process.stdout.write(a.message+`
5
- `);}};});function Pn(){return hi}function rl(e){return kn.add(e),()=>{kn.delete(e);}}var hi,kn,bi,Dn=H(()=>{"use strict";hi=[],kn=new Set;bi=class{write(a){hi.push(a),hi.length>100&&hi.shift();for(let o of kn)o();}};});function xh(){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=xh();Qo={context:e,transports:[new bi,new mi],minLevel:o?"debug":"warn",debugModules:o};}else a?.silent?Qo={context:e,transports:[],minLevel:"error",debugModules:null}:a?.verbose?Qo={context:e,transports:[new gi("cli")],minLevel:"debug",debugModules:null}:Qo={context:e,transports:[new fi],minLevel:"info",debugModules:null};}function il(){return Qo.transports}function sl(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,wn=H(()=>{"use strict";al();ol();tl();Dn();Dt={debug:0,info:1,warn:2,error:3},Qo={context:"cli",transports:[],minLevel:"warn",debugModules:null};});function vi(e,a,o){if(!sl(e,a))return;let t={level:e,module:a,message:fn(o),timestamp:new Date};for(let r of il())r.write(t);}function P(e){let a=nl.get(e);if(a)return a;let o={debug:t=>vi("debug",e,t),info:t=>vi("info",e,t),warn:t=>vi("warn",e,t),error:t=>vi("error",e,t)};return nl.set(e,o),o}var nl,dl=H(()=>{"use strict";hn();wn();nl=new Map;});var I=H(()=>{"use strict";dl();wn();hn();});function Eh(e){return typeof e=="object"&&e!==null&&Cn in e&&e[Cn]===true}function Rn(e){return {serialize(a){let o=JSON.stringify(a),t=e.encrypt(o),r={[Cn]:true,envelope:t};return JSON.stringify(r,null," ")},deserialize(a){let o;try{o=JSON.parse(a);}catch{return Sn.warn("[encryption] Config file contains unparseable data, treating as empty"),{}}if(Eh(o))try{let t=e.decrypt(o.envelope);return JSON.parse(t)}catch(t){return Sn.error(`[encryption] Decryption failed: ${t instanceof Error?t.message:"unknown error"}. Config will be treated as empty. Re-authentication may be required.`),{}}return Sn.info("[encryption] Detected plaintext config \u2014 will encrypt on next write"),o}}}var Sn,Cn,An=H(()=>{"use strict";I();Sn=P("encryption"),Cn="__encrypted__";});var xn,Mh,va,wt,En=H(()=>{"use strict";I();xn=promisify(execFile),Mh=promisify(exec),va=P("encryption:macos-keyvault"),wt=class{static async isAvailable(){try{let{stdout:a}=await Mh("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 xn("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 xn("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 xn("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)}
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 Fd from'readline';import {createInterface}from'readline';import jn from'conf';import Ju,{HTTPError}from'ky';import {StatusCodes}from'http-status-codes';import {execa}from'execa';import {Box,Text,render,useWindowSize,useInput,useApp}from'ink';import yv,{useRef,useCallback,useMemo,useEffect,useState}from'react';import {create}from'zustand';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import Eb from'jsonwebtoken';import Ub from'proper-lockfile';import lv from'ink-big-text';import Bp from'ink-spinner';import*as Ua from'fs/promises';import {readFile,mkdir,writeFile,rename,stat,rm as rm$1,mkdtemp,readdir,cp as cp$1}from'fs/promises';import vy from'unzipper';import {simpleGit,CheckRepoActions}from'simple-git';import Vd from'semver';import Pc from'yocto-spinner';import {Command,Option}from'commander';import {parse,stringify}from'yaml';var Ph=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)Ph(e,o,{get:a[o],enumerable:true});};var fo,pe,fn,dr,gt,ft,Kc,hn,Xa,me,ea,Ka,ni,ht,bt,vt,yt,U=H(()=>{"use strict";fo="FLOW",pe="flow-skills",fn="flow-cli",dr="internal",gt="external",ft={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"}},Kc={internal:{label:"Flow",color:"blue"},external:{label:"External",color:"white"}},hn=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,wh,Yc,cr,bn=H(()=>{"use strict";di="aes-256-gcm",wh=16,Yc=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(wh),t=kt.createCipheriv(di,this.key,o,{authTagLength:Yc}),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:Yc});return o.setAuthTag(Buffer.from(a.authTag,"hex")),Buffer.concat([o.update(Buffer.from(a.ciphertext,"hex")),o.final()]).toString("utf8")}};});function vn(e){return e.replace(Ah,"").replace(xh,"").replace(Eh,"").replace(Sh,"Bearer ***").replace(Ch,"***").replace(Rh,"***").replace(/\r\n|\r|\n/g,"\\n")}var Sh,Ch,Rh,Ah,xh,Eh,yn=H(()=>{"use strict";Sh=/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,Ch=/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_-]*)?/g,Rh=/[A-Za-z0-9+/]{40,}={0,2}/g,Ah=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|\x1b\x1b)/g,xh=/\x1b(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,Eh=/\x1b/g;});function li(e){return e||pe}function Zc(e,a,o){return Pn(li(o),e,a)}function kn(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 Wo(){return de.join(Ce.homedir(),ba,"plugins","known_marketplaces.json")}function el(e){return de.join(Ce.homedir(),ba,"plugins","marketplaces",li(e))}function al(){return de.join(Ce.homedir(),ci,"cache","install.lock")}function ol(){return de.join(Ce.homedir(),ci,"logs","flowsetup.log")}function Pn(e,a,o){return de.join(Ce.homedir(),ba,"plugins","cache",e,a,o)}function Jo(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 tl(){return de.join(Ce.homedir(),ci,"flow-catalogs.json")}function rl(){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 Dn(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 Ih,Th,gi,il=H(()=>{"use strict";Oe();Ih=5*1024*1024,Th=3,gi=class{filePath;constructor(){this.filePath=ol(),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>Ih){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(Th))se.unlinkSync(de.join(a,r));}catch{}}};});var fi,sl=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,nl=H(()=>{"use strict";hi=class{write(a){process.stdout.write(a.message+`
5
+ `);}};});function Sn(){return bi}function dl(e){return wn.add(e),()=>{wn.delete(e);}}var bi,wn,vi,Cn=H(()=>{"use strict";bi=[],wn=new Set;vi=class{write(a){bi.push(a),bi.length>100&&bi.shift();for(let o of wn)o();}};});function Mh(){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=Mh();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 cl(){return Qo.transports}function ll(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,Rn=H(()=>{"use strict";il();sl();nl();Cn();Dt={debug:0,info:1,warn:2,error:3},Qo={context:"cli",transports:[],minLevel:"warn",debugModules:null};});function yi(e,a,o){if(!ll(e,a))return;let t={level:e,module:a,message:vn(o),timestamp:new Date};for(let r of cl())r.write(t);}function P(e){let a=ul.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 ul.set(e,o),o}var ul,pl=H(()=>{"use strict";yn();Rn();ul=new Map;});var I=H(()=>{"use strict";pl();Rn();yn();});function qh(e){return typeof e=="object"&&e!==null&&xn in e&&e[xn]===true}function En(e){return {serialize(a){let o=JSON.stringify(a),t=e.encrypt(o),r={[xn]:true,envelope:t};return JSON.stringify(r,null," ")},deserialize(a){let o;try{o=JSON.parse(a);}catch{return An.warn("[encryption] Config file contains unparseable data, treating as empty"),{}}if(qh(o))try{let t=e.decrypt(o.envelope);return JSON.parse(t)}catch(t){return An.error(`[encryption] Decryption failed: ${t instanceof Error?t.message:"unknown error"}. Config will be treated as empty. Re-authentication may be required.`),{}}return An.info("[encryption] Detected plaintext config \u2014 will encrypt on next write"),o}}}var An,xn,In=H(()=>{"use strict";I();An=P("encryption"),xn="__encrypted__";});var Tn,Oh,va,wt,Mn=H(()=>{"use strict";I();Tn=promisify(execFile),Oh=promisify(exec),va=P("encryption:macos-keyvault"),wt=class{static async isAvailable(){try{let{stdout:a}=await Oh("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 Tn("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 Tn("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 Tn("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
6
  `));}function C(e){process.stderr.write(R.red(` \u2717 ${b(e)}
7
7
  `));}function D(e){process.stdout.write(R.cyan(` \u2139 ${b(e)}
8
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(`
@@ -13,16 +13,16 @@ import*as kt from'crypto';import {randomUUID,createHash}from'crypto';import*as C
13
13
  `);}function ho(e){process.stdout.write(JSON.stringify(e,null,2)+`
14
14
  `);}function Pe(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 Nh(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 Gh(e){let a=Md.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(b(e),t=>{a.close(),o(t.trim().toLowerCase());});})}var In,Tn,Oh,oe,bo,Mn=H(()=>{"use strict";I();j();In=promisify(execFile),Tn=promisify(exec),Oh=[{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"}],oe=P("encryption:linux-keyvault");bo=class e{static async isAvailable(){try{let{stdout:a}=await Tn("command -v secret-tool");oe.debug(`secret-tool found at: ${a.trim()}`);}catch{return oe.debug("secret-tool binary not found in PATH"),!1}try{return await In("secret-tool",["lookup","service","__flow_connectivity_check__"]),oe.debug("Secret Service D-Bus connectivity check passed"),!0}catch(a){let t=a.stderr?.trim()??"";return t.includes("org.freedesktop.secrets")?(oe.debug(`Secret Service D-Bus not available: ${t}`),!1):(oe.debug("secret-tool is available and D-Bus service is reachable"),!0)}}static async detectPackageManager(){for(let a of Oh)try{return await Tn(`command -v ${a.name}`),a}catch{}return null}static async ensureInstalled(){if(await e.isAvailable())return !0;oe.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 oe.warn("Could not detect a supported package manager. Please install libsecret manually."),!1;let o=await Gh(" ? Install secret-tool? This requires sudo. (y/N) ");if(o!=="y"&&o!=="yes")return !1;try{return oe.info(`Running: ${a.command}`),await Nh("Installing secret-tool...",()=>Tn(a.command)),e.isAvailable()}catch{return oe.warn("Installation failed. Falling back to derived key."),!1}}async getSecret(a,o){try{oe.debug(`Looking up secret: service=${a}, account=${o}`);let{stdout:t}=await In("secret-tool",["lookup","service",a,"account",o]),r=t.trim();return oe.debug(`secret-tool lookup result: ${r?"found":"empty"}`),r||null}catch(t){let r=t;return oe.debug(`secret-tool lookup failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),null}}async setSecret(a,o,t){oe.debug(`Storing secret: service=${a}, account=${o}`),oe.debug(`Environment: DBUS_SESSION_BUS_ADDRESS=${process.env.DBUS_SESSION_BUS_ADDRESS??"NOT SET"}`),oe.debug(`Environment: DISPLAY=${process.env.DISPLAY??"NOT SET"}, WAYLAND_DISPLAY=${process.env.WAYLAND_DISPLAY??"NOT SET"}`),oe.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?(oe.debug("secret-tool store succeeded"),r()):(oe.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=>{oe.error(`secret-tool store spawn error: ${d.message}`),i(d);});});}async deleteSecret(a,o){try{return oe.debug(`Deleting secret: service=${a}, account=${o}`),await In("secret-tool",["clear","service",a,"account",o]),oe.debug("secret-tool clear succeeded"),!0}catch(t){let r=t;return oe.debug(`secret-tool clear failed: code=${r.code}, stderr=${r.stderr?.trim()}, message=${r.message}`),!1}}getStoragePath(){return "Linux Secret Service (secret-tool)"}};});function Ln(e,a){return `${e}:${a}`}function pr(e){return e.replace(/'/g,"''")}function yi(e){return ["-NoProfile","-NonInteractive","-Command",e]}function Hh(e){return `Add-Type -TypeDefinition @'
17
- ${Fn}
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 Uh(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 zh(e){let a=Fd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(b(e),t=>{a.close(),o(t.trim().toLowerCase());});})}var qn,Ln,jh,te,bo,Fn=H(()=>{"use strict";I();j();qn=promisify(execFile),Ln=promisify(exec),jh=[{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");bo=class e{static async isAvailable(){try{let{stdout:a}=await Ln("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 qn("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 jh)try{return await Ln(`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 zh(" ? Install secret-tool? This requires sudo. (y/N) ");if(o!=="y"&&o!=="yes")return !1;try{return te.info(`Running: ${a.command}`),await Uh("Installing secret-tool...",()=>Ln(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 qn("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 qn("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 Nn(e,a){return `${e}:${a}`}function pr(e){return e.replace(/'/g,"''")}function ki(e){return ["-NoProfile","-NonInteractive","-Command",e]}function Xh(e){return `Add-Type -TypeDefinition @'
17
+ ${Gn}
18
18
  '@
19
- [FlowCredManager]::Read('${pr(e)}')`}function Qh(e,a,o){return `Add-Type -TypeDefinition @'
20
- ${Fn}
19
+ [FlowCredManager]::Read('${pr(e)}')`}function Kh(e,a,o){return `Add-Type -TypeDefinition @'
20
+ ${Gn}
21
21
  '@
22
- [FlowCredManager]::Write('${pr(e)}', '${pr(a)}', '${pr(o)}')`}function Vh(e){return `Add-Type -TypeDefinition @'
23
- ${Fn}
22
+ [FlowCredManager]::Write('${pr(e)}', '${pr(a)}', '${pr(o)}')`}function $h(e){return `Add-Type -TypeDefinition @'
23
+ ${Gn}
24
24
  '@
25
- [FlowCredManager]::Delete('${pr(e)}')`}async function ki(e){return Uh("powershell.exe",e)}var Uh,ya,qn,zh,Wh,Jh,Fn,Ct,On=H(()=>{"use strict";I();Uh=promisify(execFile),ya=P("encryption:windows-keyvault"),qn=1,zh=1,Wh=2,Jh=3;Fn=`
25
+ [FlowCredManager]::Delete('${pr(e)}')`}async function Pi(e){return Hh("powershell.exe",e)}var Hh,ya,On,Qh,Vh,_h,Gn,Ct,Bn=H(()=>{"use strict";I();Hh=promisify(execFile),ya=P("encryption:windows-keyvault"),On=1,Qh=1,Vh=2,_h=3;Gn=`
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, ${qn}, 0, out credPtr)) return "";
61
+ if (!CredRead(target, ${On}, 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[] { ${Wh}, ${Jh}, ${zh} };
75
+ int[] persistLevels = new int[] { ${Vh}, ${_h}, ${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 = ${qn};
83
+ cred.Type = ${On};
84
84
  cred.TargetName = targetPtr;
85
85
  cred.CredentialBlobSize = bytes.Length;
86
86
  cred.CredentialBlob = blobPtr;
@@ -98,53 +98,53 @@ public class FlowCredManager {
98
98
  }
99
99
 
100
100
  public static bool Delete(string target) {
101
- return CredDelete(target, ${qn}, 0);
101
+ return CredDelete(target, ${On}, 0);
102
102
  }
103
103
  }
104
- `;Ct=class{static async isAvailable(){try{let{stdout:a}=await ki(yi('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=Ln(a,o);ya.debug(`Looking up secret: target=${t}`);let r=Hh(t),{stdout:i}=await ki(yi(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=Ln(a,o);ya.debug(`Storing secret: target=${r}`);let i=Qh(r,t,o),{stdout:s}=await ki(yi(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=Ln(a,o);ya.debug(`Deleting secret: target=${t}`);let r=Vh(t),{stdout:i}=await ki(yi(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 $h(){let e=`${Ce.hostname()}${Ce.userInfo().username}`;return kt.scryptSync(e,Xh,_h)}function Yh(){let e=$h(),a=new cr(e),o=Rn(a);return new Nn({projectName:Gn,serialize:o.serialize,deserialize:o.deserialize,configFileMode:384})}function Pi(){return Di||(Di=Yh()),Di}var _h,Xh,Gn,Kh,Di,Ve,mr=H(()=>{"use strict";gn();An();_h=32,Xh="flow-plugins-cli-fallback",Gn="flow-plugins-cli-fallback",Kh={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)"};Di=null;Ve=class{warned=!1;async getSecret(a,o){return Pi().get(`${a}:${o}`)??null}async setSecret(a,o,t){if(!this.warned){let r=Kh[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 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=Nn(a,o);ya.debug(`Looking up secret: target=${t}`);let r=Xh(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=Nn(a,o);ya.debug(`Storing secret: target=${r}`);let i=Kh(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=Nn(a,o);ya.debug(`Deleting secret: target=${t}`);let r=$h(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 ab(){let e=`${Ce.hostname()}${Ce.userInfo().username}`;return kt.scryptSync(e,Zh,Yh)}function ob(){let e=ab(),a=new cr(e),o=En(a);return new jn({projectName:Un,serialize:o.serialize,deserialize:o.deserialize,configFileMode:384})}function Di(){return wi||(wi=ob()),wi}var Yh,Zh,Un,eb,wi,Ve,mr=H(()=>{"use strict";bn();In();Yh=32,Zh="flow-plugins-cli-fallback",Un="flow-plugins-cli-fallback",eb={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=eb[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;}Pi().set(`${a}:${o}`,t);}async deleteSecret(a,o){let t=Pi(),r=`${a}:${o}`;return t.has(r)?(t.delete(r),!0):!1}getStoragePath(){return Pi().path}static hasExistingData(){try{let a=new Nn({projectName:Gn});return se.existsSync(a.path)}catch{return !1}}static clearFallbackFile(){try{let a=new Nn({projectName:Gn});se.rmSync(a.path,{force:!0});}catch{}Di=null;}};});async function Bn(){if(Ve.hasExistingData())return new Ve;switch(process.platform){case "darwin":return await wt.isAvailable()?new wt:new Ve;case "linux":return await bo.isAvailable()?new bo:await bo.ensureInstalled()?new bo:new Ve;case "win32":return await Ct.isAvailable()?new Ct:new Ve;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var ml=H(()=>{"use strict";En();Mn();On();mr();});var gl=H(()=>{"use strict";gn();An();ml();En();Mn();On();mr();});async function vo(){return Ci||(Ci=Bn()),Ci}function Ri(){Ci=null;}async function Y(){let a=await(await vo()).getSecret($a,jn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function yo(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 fl.error(`missing or empty fields: ${r.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await vo()).setSecret($a,jn,JSON.stringify(e));}async function hl(){let e=await vo();await e.deleteSecret($a,jn),await e.deleteSecret($a,Un),await e.deleteSecret($a,zn);}async function bl(){return (await vo()).getStoragePath()}async function vl(e){await(await vo()).setSecret($a,Un,JSON.stringify(e));}async function Ai(){let a=await(await vo()).getSecret($a,Un);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function xi(e){await(await vo()).setSecret($a,zn,JSON.stringify(e));}async function Rt(){let a=await(await vo()).getSecret($a,zn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function ko(){let e=await Ai();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/`,fl.debug(`[customUrl] Service URLs overridden to base: ${a}`);}var fl,$a,jn,Un,zn,Ci,Re=H(()=>{"use strict";gl();I();fl=P("config:credentials"),$a="flow-plugins-cli",jn="credentials",Un="token-cache",zn="user-info",Ci=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 Ei=H(()=>{"use strict";});function Zh(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 Wn(e){if(yl.some(o=>o.test(e)))return true;let a=Zh(e);return !!(a&&yl.some(o=>o.test(a)))}function eb(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=eb(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&&Wn(t.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${t.hostname}"`);return o}var yl,Vo=H(()=>{"use strict";yl=[/^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 tb(e){if(!Ka.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}async function rb(e){if(e instanceof HTTPError){let a=e.response.status;Jn.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&&kl[o]?new Error(kl[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?(Jn.debug(`Non-HTTP error during authentication: ${e.message}`),e):(Jn.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function _o(e){let a=Fa("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");tb(e.tenant);let o;try{o=await ju.post(a,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(i){throw await rb(i)}let t=o.expires_at??new Date(Date.now()+(o.expires_in??3600)*1e3).toISOString();await yo(e),await vl({accessToken:o.access_token,expiresAt:t});let r=At(o.access_token);await xi({sub:r.sub,name:r.name,email:r.email});}var Jn,kl,Ii=H(()=>{"use strict";Re();Ei();Vo();I();U();Jn=P("api:auth");kl={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 ko()){let t=await Ai();if(t)return t.accessToken}Pl.debug("Token expired or missing, re-authenticating...");let a=await Y();if(!a)throw new Error("Not authenticated. Run: flow auth login");Ve.clearFallbackFile(),Ri(),await _o(a);let o=await Ai();if(!o)throw new Error("Authentication succeeded but token was not persisted");return Pl.debug("Token refreshed successfully"),o.accessToken}var Pl,xt=H(()=>{"use strict";Re();Ii();mr();I();Pl=P("lib:tokenProvider");});function eo(){return ju.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";Vo();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 md=H(()=>{"use strict";xr();});function Er(e){if(!e||!oy.test(e))throw new Error(`Invalid plugin name: "${e}". Must be 1-64 chars, lowercase alphanumeric and hyphens only.`)}function Gt(e){return ty.test(e)}function Bt(e){let a=e.indexOf("@");return a>0?e.slice(0,a):e}function fd(e){if(!ry.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);fd(o);let t=["claude","plugin","install",o];return a&&t.push("--scope",a),t.join(" ")}function is(e){let a=e.trim();if(!a)throw new Error("No marketplace source provided.");if(!iy.test(a)&&!sy.test(a))throw new Error(`Invalid marketplace source: "${a}". Must be owner/repo or an https:// URL.`);return a}var oy,ty,ry,iy,sy,Io=H(()=>{"use strict";oy=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;ty=/^[^@]+@[^@]+$/;ry=/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\/[a-zA-Z0-9][a-zA-Z0-9._-]*)?$/;iy=/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/,sy=/^https:\/\/[\w./:@?&=+#%-]+$/;});var Ou={};Hc(Ou,{FlowApiAdapter:()=>Ut});var ny,Ut,hd=H(()=>{"use strict";xr();md();I();Io();ny=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"),ny.debug("ping ok"),!0}catch{return !1}}};});function cy(){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 Gu(){return Nu??=cy(),Nu}var Nu,Bu=H(()=>{"use strict";});var zu={};Hc(zu,{GitRepoAdapter:()=>zt});function Uu(e,a){if(!ly.test(e))throw new Error(`Invalid ${a} in catalog source URL: "${e}"`)}var ly,zt,bd=H(()=>{"use strict";Bu();Vo();ly=/^[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(Wn(r))throw new Error(`Catalog source URL points to a private/loopback address: "${r}"`);let s=i.replace(/^\//,"").split("/"),[n,d]=s;return Uu(n,"owner"),Uu(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 ju.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 ju.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 Gu();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 Vc=new Set(["skill","mcp","bundle","plugin"]),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(Vc),origins:new Set(mn)},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(Vc)},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(mn)},selectedIndex:0})),setDebugPanelOpen:a=>e({debugPanelOpen:a}),incrementCatalogVersion:()=>e(a=>({catalogVersion:a.catalogVersion+1})),setBundleInstallFlow:a=>e({bundleInstallFlow:a})}));Re();xt();Ei();U();Vo();I();var Ti=P("api:metrics");function Dl(){return Fa("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function wl(e,a,o){return ju.post(e,{json:a,headers:o})}async function sb(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 xi(t),t}async function S(e,a){let o=await Oa(),t=await sb(o),r=await Y();if(!Ka.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 wl(Dl(),i,{Authorization:`Bearer ${o}`,FlowTenant:r.tenant}),Ti.debug(`Metrics event sent: ${e}`);}catch(s){throw Ti.warn(`Failed to send metrics event "${e}": ${String(s)}`),s}}async function Sl(e,a,o){try{let t=o&&Ka.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 wl(Dl(),r,{FlowTenant:t}),Ti.debug(`Anonymous metrics event sent: ${e}`);}catch(t){Ti.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 nb={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},ka={...nb};function Cl(e){let a=Date.now();ka={sessionStart:a,stepStart:a,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function Xo(e){ka.currentStep=e,ka.stepStart=Date.now();}function Z(){return {...ka}}function Po(){return ka.sessionStart===0?0:Date.now()-ka.sessionStart}function Ko(){return ka.stepStart===0?0:Date.now()-ka.stepStart}function Rl(){ka.tuiSessionStart=Date.now();}function Al(){return ka.tuiSessionStart===0?0:Date.now()-ka.tuiSessionStart}I();var db=3e3,cb=P("abandonment");async function Mi(e){let{currentStep:a,sessionStart:o}=Z();if(o===0)return;let t={last_step:a,trigger:e,duration_ms:Po()};try{await Promise.race([S(w.CLI_ONBOARDING_ABANDONED,t),new Promise((r,i)=>setTimeout(()=>i(new Error("abandonment timeout")),db))]);}catch(r){cb.warn(`Abandonment event failed: ${String(r)}`);}}function xl(e,a){return Promise.race([e,new Promise(o=>setTimeout(o,a))])}I();var lb=3e3,ub=P("session-end");async function fr(e,a,o){let t=Al(),i=[S(w.CLI_TUI_SESSION_ENDED,{duration_ms:t,active_tab:a,interface:"tui"})];o!=="main"&&i.push(Mi(e));try{await xl(Promise.all(i).then(()=>{}),lb);}catch(s){ub.warn(`Session end event failed: ${String(s)}`);}}var fb=2e3;function Il(){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);},fb);},[e,r,i,s]);return useInput((d,l)=>{l.ctrl&&d==="c"&&n();}),{pendingExit:t}}var yb=16;function Tl({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(yb)}),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 Ml({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 ql({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 Ll(){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})}));Ii();U();function Zo(){return de__default.join(Ce__default.homedir(),".claude","settings.json")}function Ol(e){return `${(e&&e.trim().length>0?e.trim():si).replace(/\/+$/,"")}/flow-litellm/`}function Dr(){let e=Zo();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 Li(e){let a=Zo();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 Nl(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 $n(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 Gl(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 Rb=3600,et=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 Ab(e){return Cb.sign({clientId:e.clientId,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:Rb})}function Fi(e,a={}){let o=Dr();if(o.status==="malformed"&&!a.allowOverwriteMalformed)throw new et;let t=o.status==="ok"?o.settings:{},r=o.status==="ok"?$n(o.settings):null,i=o.status==="ok"?Gl(o.settings):null,s=a.jwtOverride??Ab(e),n=Ol(e.customUrl),d=Nl(t,s,n);return {jwt:s,anthropicBaseUrl:n,merged:d,previousToken:r,previousBaseUrl:i,hadExistingFile:o.status!=="missing"}}function Oi(e){Li(e.merged);}function Bl(){let e=Dr();return e.status!=="ok"?false:$n(e.settings)!==null}Re();Oe();function xb(){let e=el();if(!se__default.existsSync(e))return {};try{return JSON.parse(se__default.readFileSync(e,"utf-8"))}catch{return {}}}var Yn=null;function Eb(){return Yn===null&&(Yn=xb()),Yn}function So(){return !!Eb().ENABLE_EXPERIMENTAL_BETAS}U();function qb(){return ce.filter(e=>e.platforms[process.platform]?.status==="supported")}function Ul(e){let a=qb();return a.length>0&&a.every(o=>e.find(t=>t.module.alias===o.alias)?.alreadyInstalled===true)}var Ni={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??si),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"}},Lb={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=So()?[Ni,Lb]:[Ni];Re();I();var Gb=P("moduleState");function Bi(){let e=process.env.FLOW_HOME??de__default.join(Ce__default.homedir(),".flow");return de__default.join(e,"modules.json")}var Bb={retries:5,minTimeout:50};async function zl(e,a){se__default.mkdirSync(de__default.dirname(e),{recursive:true});let o=await Nb.lock(e+".lock",{realpath:false,retries:Bb});try{return await a()}finally{await o();}}function Wl(){let e=Bi();if(!se__default.existsSync(e))return [];try{let a=JSON.parse(se__default.readFileSync(e,"utf-8"));return a.schemaVersion!==1?(Gb.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 at(){return Wl()}function Jl(e){let a=Bi();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 at().find(a=>a.alias===e)??null}async function Pa(e){let a=Bi();await zl(a,async()=>{let o=Wl(),t=o.findIndex(r=>r.alias===e.alias);t===-1?o.push(e):o[t]=e,Jl(o);});}async function ot(){let e=Bi();se__default.existsSync(e)||await zl(e,async()=>{se__default.existsSync(e)||Jl([]);});}var zb=promisify(execFile);function Co(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 zb(a,[e]),!0}catch{return false}}function Ya(){return process.platform==="win32"?"npm.cmd":"npm"}var Hl=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=Co(a,"npm");if(!o)return null;try{let{stdout:t}=await Hl(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=Co(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 Hl(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 ji=promisify(execFile),Vb=/^(\S+)\s+([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/,Ui=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=Co(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=Co(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 ji("brew",["tap",r.tap]),await ji("brew",["trust",r.tap])),await ji("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 ji("brew",["list","--versions",a]),t=o.trim().match(Vb);return t?t[2]:null}catch{return null}}};var Tt=promisify(execFile),Vl=/([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/;function _l(){let e=process.env.FLOW_HOME??de__default.join(Ce__default.homedir(),".flow");return de__default.join(e,"bin")}var zi=class{type="curl";async isAvailable(){return Ga("curl")}async install(a){let o=Date.now(),t=Co(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(_l(),de__default.basename(a.binaryName));for(let t of [o,a.binaryName])try{let{stdout:r}=await Tt(t,["--version"]),i=r.match(Vl);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=_l(),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(Vl);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 Xl="0.0.0";try{let e=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8"));typeof e.version=="string"&&(Xl=e.version);}catch{}var te=Xl;var Te=P("moduleInstaller");function ja(e){switch(e){case "npm":return new It;case "homebrew":return new Ui;case "curl":return new zi}}async function Sr(e,a,o){try{await S(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 Ao(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 S(w.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:te,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 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 S(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 ev(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 ev(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 Wi(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 S(w.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:te,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 S(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 S(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 S(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 Ji=P("flowAiObsSetup");async function Hi(e,a){try{if(!await new It().isAvailable().catch(()=>!1))return Ji.warn("npm not available \u2014 skipping flow-ai-obs install"),{npmFailed:!0,initFailed:!1};let r=await Ao(Ni,"onboarding","npm",e,a,{forceLatest:!0});return r.success?r.postInstallFailed||r.configCheckFailed?(Ji.debug("flow-ai-obs init failed (postInstall exit non-zero or configCheck failed)"),{npmFailed:!1,initFailed:!0}):{npmFailed:!1,initFailed:!1}:(Ji.warn(`flow-ai-obs install failed: ${r.error?.message??"unknown"}`),{npmFailed:!0,initFailed:!1})}catch(o){return Ji.warn(`installFlowAiObs threw: ${String(o)}`),{npmFailed:false,initFailed:false,unexpectedError:true}}}I();function Kl(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 av=P("useAuthSetup");function $l(){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:v,setJustAuthenticated:k}=oa(),T=()=>{m("fields"),g(null),a(""),o.current=null,t.current=null,r.current=null;},L=()=>{S(w.CLI_SESSION_STARTED,{cli_version:te,os:process.platform,node_version:process.version,duration_ms:Po(),interface:"tui"}).catch(()=>{});},A=async W=>{h.current=true;let _={...o.current,customUrl:t.current??void 0};try{W&&Oi(W),await yo(_);}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 Hi(t.current,r.current).catch(Q=>av.warn(`installFlowAiObs threw unexpectedly: ${String(Q)}`)),Qi({starterKit:B.starterKit});},M=async()=>A(),F=async W=>A(W),O=W=>{try{let _={...o.current,customUrl:t.current??void 0};return Fi(_,{allowOverwriteMalformed:W,jwtOverride:e.trim()})}catch(_){return _ instanceof et?(m("malformedConfirm"),null):(d(_ instanceof Error?_.message:"Failed to read settings.json"),m("fields"),null)}},ae=()=>{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");},ee=W=>{r.current=W,z();},z=async()=>{let W=t.current;W&&La(W),c(true),d(null),f.current+=1;try{await _o(o.current);let _=O(!1);_&&(g(_),m("preview"));}catch(_){let E=_ instanceof Error?_.message:"Authentication failed";d(E),Sl(w.CLI_AUTH_FAILED,{error_code:Kl(_),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:T,handleSubmit:x,goToEmailStep:J,handleEmailConfirm:ee,commitAndProceed:F,skipJwtAndProceed:M,planPersistOverwrite:ae}}U();j();function Yl(){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}=$l(),[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?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"?v("input"):(F==="n"||F==="N"||O.return)&&u(null);else if(O.escape)L.current="",T(""),v("confirm");else if(O.return){let ae=L.current.trim();ae.length>0&&ht.test(ae)?(M(false),u(ae)):ae.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(Ml,{onConfirm:m})]}):r==="preview"&&i?jsx(ql,{plan:i}):r==="malformedConfirm"?jsx(Ll,{}):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(Tl,{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(sv,{text:"FLOW",font:"block",colors:["white","white"]}),jsx(Box,{marginTop:-1,marginBottom:1,children:jsxs(Text,{dimColor:true,children:["Marketplace \xB7 v",te]})})]})}var ou=[{id:"discover",focus:"list"},{id:"installed",focus:"list"},{id:"updates",focus:"list"},{id:"marketplaces",focus:"marketplaces"}],re=So()?ou:ou.slice(0,3);function nv(e){return re.findIndex(a=>a.id===e)}function ad(e,a,o){let t=nv(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 iu={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function su({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?`${iu[o]} (${e})`:iu[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 du(){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 uv=["skill","mcp","bundle"].map((e,a)=>({key:String(a+2),type:e,...ft[e]})),pv=["internal","external"].map((e,a)=>({key:String(a+6),origin:e,...Qc[e]}));function cu(){let e=y(t=>t.catalogFilters),a=e.types.has("skill")&&e.types.has("mcp")&&e.types.has("bundle"),o=e.origins.has("internal")&&e.origins.has("external");return jsxs(Box,{paddingX:1,paddingBottom:1,gap:1,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"]})]}),uv.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"]})]}),pv.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 lu({type:e}){let{label:a,color:o}=ft[e];return jsx(Text,{color:o,children:a})}U();function mu({origin:e}){return e===dr?jsx(Text,{color:"blue",children:"[Flow]"}):jsx(Text,{color:"white",children:"[External]"})}j();var _i=fv.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(lu,{type:a.type})]}),a.origin&&jsxs(Text,{children:[" ",jsx(mu,{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 hu({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(_i,{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 yu({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 Pu({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(yu,{label:p.label,pathHint:p.pathHint},p.key):jsx(_i,{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 wv={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function Sv({items:e,tabId:a,emptyMessage:o,groups:t,actionHint:r}){return jsxs(Box,{flexDirection:"column",children:[jsx(du,{}),jsx(cu,{}),jsxs(Box,{paddingX:1,marginTop:1,children:[jsx(Text,{bold:true,children:wv[a]}),jsxs(Text,{dimColor:true,children:[" (",e.length,")"]}),r&&e.length>0&&jsx(Text,{dimColor:true,children:` \xB7 ${r}`})]}),t&&t.length>0?jsx(Pu,{groups:t,emptyMessage:o}):jsx(hu,{items:e,emptyMessage:o})]})}function Du({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(Sv,{items:e,tabId:r,emptyMessage:a,groups:r!=="discover"?o:void 0,actionHint:r==="updates"?"press 'a' to update all":void 0},r)})}var Av={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 Xi(){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:[Av[e],a?" | Ctrl+D: debug log":""]})})}j();function wu({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 Ki({message:e}){return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Fp,{type:"dots"})}),jsxs(Text,{children:[" ",e]})]})}function dd(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}var Au=20;function $i(e,a){let o=a>0?Math.min(e/a,1):0,t=Math.round(o*100),r=Math.round(o*Au),i="\u2588".repeat(r)+"\u2591".repeat(Au-r),s=`${dd(e)} / ${dd(a)}`;return {bar:i,percent:t,label:s}}function Yi({received:e,total:a}){let{bar:o,percent:t,label:r}=$i(e,a);return jsxs(Text,{dimColor:true,children:[o," ",t,"%"," ","(",r,")"]})}function Zi({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 pd=Object.entries(Xa),Tu=[...pd.map(([,e])=>e.actionLabel),"Cancel"],Mu=Object.fromEntries(pd.map(([,e])=>[e.actionLabel,e.description]));function qu(e){let a=pd.find(([,o])=>o.actionLabel===e);return a?a[0]:null}I();var zv=P("provider.registry"),Wv=3e4,as=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()+Wv}),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"&&zv.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 Jv={user:"global",project:"project",local:"local"};function os(e){return e?Jv[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},Eo=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();md();I();var Vv=P("catalog.registry"),ts=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);Vv.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 ay={retries:5,minTimeout:50};async function gd(e,a){mkdirSync(dirname(e),{recursive:true});let o=await Nb.lock(e+".lock",{realpath:false,retries:ay});try{return await a()}finally{await o();}}var rs=class{filePath;constructor(a){this.filePath=a??Zc();}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 gd(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 gd(this.filePath,async()=>{let o=await this.read();await this.write(o.filter(t=>t.id!==a));});}async updateField(a,o){await gd(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));});}};hd();var ge=new ts,ao=new rs,uy=["flow-harness"];function py(){let e=process.env.FLOW_CONTENT_SOURCES;return e===void 0?uy:e.split(",").map(a=>a.trim()).filter(Boolean)}ge.register(new Ut);for(let e of py())ge.register(new Ut(e));var Wu=false;async function Ju(){if(Wu)return;Wu=true;let e=await ao.read(),{GitRepoAdapter:a}=await Promise.resolve().then(()=>(bd(),zu));for(let o of e)ge.register(new a(o.id,o.name,o.source));}Io();var Hu=2;async function oo(e){if(e){let{FlowApiAdapter:a}=await Promise.resolve().then(()=>(hd(),Ou));return new a(e).fetchItems()}return ge.fetchAll()}async function Qu(){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 Vu(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:m,value:p}=await l.read();if(m)break;if(u+=p.byteLength,n&&u>s*Hu)throw await l.cancel(),new Error(`Download exceeded expected size: received ${u} bytes, expected at most ${s*Hu}`);c.push(p),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 ss(){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 _u(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 gy.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 vd(e){await Ua.rm(e,{recursive:true,force:true});}async function To(){let e=$c();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 Nb.lock(e,{stale:1e4,retries:{retries:2,minTimeout:500,maxTimeout:500}})}Oe();U();function by(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 $u(e){let a=li(e);if(!se__default.existsSync(a))return null;try{return JSON.parse(se__default.readFileSync(a,"utf-8"))}catch{return null}}function vy(e){let a=$u(e);if(a)return a;let o=by(e),t=li(e);return se__default.mkdirSync(de__default.dirname(t),{recursive:true}),yd(o,e),o}function yd(e,a){let o=li(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 yy(e){let a=e||pe,o=Wo(),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:Kc(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 Yu(e,a,o){ia(e.name),yy(o);let t=bn(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=vy(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}),yd(r,o));}function kd(e,a){ia(e);let o=bn(e,a);try{se__default.rmSync(o,{recursive:!0,force:!0});}catch{}let t=$u(a);if(!t)return;let r=t.plugins.length;t.plugins=t.plugins.filter(i=>i.name!==e),t.plugins.length!==r&&yd(t,a);}j();I();var Py=P("mcpConfigReader"),Dy=500,wy=512;function Sy(){return de__default.join(Ce__default.homedir(),".claude.json")}function Cy(){return de__default.join(process.cwd(),".mcp.json")}function ep(e){if(!se__default.existsSync(e))return null;try{return JSON.parse(se__default.readFileSync(e,"utf-8"))}catch{return Py.debug(`[mcpConfigReader] Failed to parse ${e}`),null}}function Ir(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Pd(e){if(!Ir(e))return {};let a=e.mcpServers;return Ir(a)?a:{}}function Dd(e,a){return Object.keys(e).slice(0,Dy).map(t=>({name:b(t.slice(0,wy)),marketplace:"",version:void 0,installedAt:"",installPath:"",scope:a,description:void 0,author:void 0,status:"enabled",type:"mcp"}))}function op(){let e=[],a=Sy(),o=ep(a);if(Ir(o)){let n=o,d=Pd(n);e.push(...Dd(d,"user"));let l=process.cwd();if(Ir(n.projects)){let c=n.projects[l];if(Ir(c)){let u=Pd(c);e.push(...Dd(u,"local"));}}}let t=Cy(),r=ep(t),i=Pd(r);e.push(...Dd(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 Ay(e,a,o){try{await S(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 xy(e,a,o){let t=a==="enabled"?w.CLI_TOOL_ENABLED:w.CLI_TOOL_DISABLED;S(t,{tool_id:e,source:o,interface:Z().interfaceType}).catch(r=>sa.warn(`Failed to send ${a} metrics: ${String(r)}`));}function Rd(){return de__default.join(Ce__default.homedir(),".claude","plugins","installed_plugins.json")}function Ey(){return de__default.join(Ce__default.homedir(),".claude","plugins")}function ns(e){let a;try{a=se__default.realpathSync(e);}catch{a=de__default.resolve(e);}let o=de__default.resolve(Ey()),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 rp(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=Rd();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 Ad(){let e=Rd();try{let a=await se__default.promises.readFile(e,"utf-8");return JSON.parse(a)}catch{return {version:2,plugins:{}}}}function Iy(e){let a=e?.code;return a==="EACCES"||a==="EPERM"}function ip(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 Iy(o)?new Error(`Permission denied: cannot write to '${e}'. Check your file system permissions.`):o}}function na(e){ip(Rd(),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 Ty(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=rp(e);if(!se__default.existsSync(a))return {};try{return JSON.parse(se__default.readFileSync(a,"utf-8"))}catch{return {}}}function ds(e,a="user"){ip(rp(a),e);}function My(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 qy(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 wd(e="user"){return Mr(e).enabledPlugins??{}}function Sd(e,a="user"){let o=Mr(a),t=o.enabledPlugins;if(!t||!(e in t))return;let{[e]:r,...i}=t;o.enabledPlugins=i,ds(o,a);}function qr(e,a,o="user"){let t=Mr(o),r=t.enabledPlugins??{};t.enabledPlugins={...r,[e]:a},ds(t,o);}function Ly(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=wd(),o=wd("project"),t=wd("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 Ly(p).map(f=>{let h=Ty(f.installPath,u),k=(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:k===false?"disabled":"enabled"}})}),s=op(),n=new Set(i.map(l=>`${l.name}@${l.scope}`)),d=s.filter(l=>!n.has(`${l.name}@${l.scope}`));return [...i,...d]}function tp(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 To();try{let t=Ae(),r=qy(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}`),ns(d.installPath);let l=de__default.dirname(d.installPath);ns(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,...m}=t.plugins;na({...t,plugins:m}),Sd(i,a),kd(s,tp(i));}else t.plugins[i]=c,na(t),Sd(i,a);}else {sa.debug(`[${s}] Resolved key: ${i}`);for(let c of n){ns(c.installPath);let u=de__default.dirname(c.installPath);ns(u),sa.debug(`[${s}] Removing directory: ${u}`),se__default.rmSync(u,{recursive:!0,force:!0}),Sd(i,c.scope);}kd(s,tp(i));let{[i]:d,...l}=t.plugins;na({...t,plugins:l});}await Ay(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 To();try{let r=Ae(),{key:i,name:s}=My(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),xy(s,a,l),sa.debug(`[${s}] Status updated to ${a}`);}finally{await t();}}Oe();function xd(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,xd(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(xd(n))));o[t]=[...i,...r.filter(n=>!s.has(JSON.stringify(xd(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 Ed=P("bundleContent"),cs="${CLAUDE_PLUGIN_ROOT}/hooks/";function Fy(e){return e.split(cs).join("$CLAUDE_PROJECT_DIR/.claude/hooks/")}function Id(e){return typeof e=="string"?Fy(e):Array.isArray(e)?e.map(Id):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([a,o])=>[a,Id(o)])):e}function Oy(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 Ny(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 Ed.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=yn(a),n=new Set,d=g=>{if(typeof g=="string"&&g.includes(cs)){let f=g.slice(g.indexOf(cs)+cs.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=Id(r),u=Mr(a),m=u.hooks!==null&&typeof u.hooks=="object"&&!Array.isArray(u.hooks)?u.hooks:{},p=Or(m,c);return ds({...u,hooks:p},a),l}function sp(e,a){let o=Oy(e,a),t=Ny(e,a);o>0&&Ed.debug(`Copied ${o} rule file(s) to ${Pt(a)}`),t>0&&Ed.debug(`Copied ${t} hook script(s) to ${yn(a)}`);}U();I();var Gy=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,By=/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)?$/;function ia(e){if(!Gy.test(e))throw new Error(`Invalid plugin name from manifest: "${e}". Plugin names must be lowercase alphanumeric and hyphens (1-64 chars).`)}function jy(e){if(!By.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 qo=P("installer");function Uy(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 zy(e,a,o){o&&await vd(a);try{qo.debug(`[${a}] Extracting archive...`),await _u(e,a);}catch(t){throw await vd(a),t}}function Wy(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 Jy(e,a,o,t,r,i){try{await S(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:i,source:r,scope:t,version:a,duration_ms:o,interface:Z().interfaceType});}catch(s){qo.warn(`Failed to send install metrics: ${String(s)}`);}}async function Hy(e,a,o,t){try{await S(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){qo.warn(`Failed to send install-failed metrics: ${String(r)}`);}}async function je(e,a={}){let o=Date.now(),t=null;try{qo.debug(`[${e}] Acquiring lock...`),t=await To();let{pluginKey:r,alreadyInstalled:i}=Uy(e,a.force,a.source),{source:s}=a;qo.debug(`[${e}] Fetching manifest...`);let n=await Wt(e,s);ia(n.name),jy(n.version),qo.debug(`[${e}] Downloading archive...`);let d=await Vu(e,a.onDownloadProgress,s),l=a.scope??"user",c=a.type??"skill",u=Xc(n.name,n.version,a.source);await zy(d,u,!!i&&!!a.force),sp(u,l),Wy(r,u,n.version,l,"internal",a.providerId,c),Yu(n,u,a.source);let m=Date.now()-o;qo.debug(`[${e}] Installed successfully in ${m}ms`);let p={name:n.name,version:n.version,path:u,duration_ms:m};return a.skipMetrics||await Jy(n.name,n.version,m,os(l),"internal",c),p}catch(r){throw await Hy(e,r,"internal",a.type??"skill"),qo.error(`[${e}] Installation failed: ${r instanceof Error?r.message:String(r)}`),r}finally{t&&await t();}}I();j();Re();xt();I();var Qy=P("commands:helpers");async function he(){let e=await Y();if(!e)return C("Not authenticated. Run: flow auth login"),false;e.customUrl&&La(e.customUrl);try{await Oa();}catch(a){return Qy.debug(`Token validation failed: ${String(a)}`),C("Session expired. Run: flow auth login"),false}return true}async function ie(e){let a=Md.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 Lo(e){let a=Md.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(b(e),t=>{a.close(),o(t.trim());});})}var Vy="\x1B[A",_y="\x1B[B";function np(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 Xy(e,a){return e.map((o,t)=>np(o,t===a)).join(`
111
- `)}async function ls(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(Xy(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 jn({projectName:Un});return se.existsSync(a.path)}catch{return !1}}static clearFallbackFile(){try{let a=new jn({projectName:Un});se.rmSync(a.path,{force:!0});}catch{}wi=null;}};});async function zn(){if(Ve.hasExistingData())return new Ve;switch(process.platform){case "darwin":return await wt.isAvailable()?new wt:new Ve;case "linux":return await bo.isAvailable()?new bo:await bo.ensureInstalled()?new bo:new Ve;case "win32":return await Ct.isAvailable()?new Ct:new Ve;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var bl=H(()=>{"use strict";Mn();Fn();Bn();mr();});var vl=H(()=>{"use strict";bn();In();bl();Mn();Fn();Bn();mr();});async function vo(){return Ri||(Ri=zn()),Ri}function Ai(){Ri=null;}async function Y(){let a=await(await vo()).getSecret($a,Wn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function yo(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 yl.error(`missing or empty fields: ${r.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await vo()).setSecret($a,Wn,JSON.stringify(e));}async function kl(){let e=await vo();await e.deleteSecret($a,Wn),await e.deleteSecret($a,Jn),await e.deleteSecret($a,Hn);}async function Pl(){return (await vo()).getStoragePath()}async function Dl(e){await(await vo()).setSecret($a,Jn,JSON.stringify(e));}async function xi(){let a=await(await vo()).getSecret($a,Jn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function Ei(e){await(await vo()).setSecret($a,Hn,JSON.stringify(e));}async function Rt(){let a=await(await vo()).getSecret($a,Hn);if(!a)return null;try{return JSON.parse(a)}catch{return null}}async function ko(){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/`,yl.debug(`[customUrl] Service URLs overridden to base: ${a}`);}var yl,$a,Wn,Jn,Hn,Ri,Re=H(()=>{"use strict";vl();I();yl=P("config:credentials"),$a="flow-plugins-cli",Wn="credentials",Jn="token-cache",Hn="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 tb(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 Qn(e){if(wl.some(o=>o.test(e)))return true;let a=tb(e);return !!(a&&wl.some(o=>o.test(a)))}function rb(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=rb(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&&Qn(t.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${t.hostname}"`);return o}var wl,Vo=H(()=>{"use strict";wl=[/^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 nb(e){if(!Ka.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}async function db(e){if(e instanceof HTTPError){let a=e.response.status;Vn.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&&Sl[o]?new Error(Sl[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?(Vn.debug(`Non-HTTP error during authentication: ${e.message}`),e):(Vn.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function _o(e){let a=Fa("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");nb(e.tenant);let o;try{o=await Ju.post(a,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(i){throw await db(i)}let t=o.expires_at??new Date(Date.now()+(o.expires_in??3600)*1e3).toISOString();await yo(e),await Dl({accessToken:o.access_token,expiresAt:t});let r=At(o.access_token);await Ei({sub:r.sub,name:r.name,email:r.email});}var Vn,Sl,Ti=H(()=>{"use strict";Re();Ii();Vo();I();U();Vn=P("api:auth");Sl={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 ko()){let t=await xi();if(t)return t.accessToken}Cl.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 _o(a);let o=await xi();if(!o)throw new Error("Authentication succeeded but token was not persisted");return Cl.debug("Token refreshed successfully"),o.accessToken}var Cl,xt=H(()=>{"use strict";Re();Ti();mr();I();Cl=P("lib:tokenProvider");});function eo(){return Ju.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";Vo();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 hd=H(()=>{"use strict";xr();});function Er(e){if(!e||!sy.test(e))throw new Error(`Invalid plugin name: "${e}". Must be 1-64 chars, lowercase alphanumeric and hyphens only.`)}function Gt(e){return ny.test(e)}function Bt(e){let a=e.indexOf("@");return a>0?e.slice(0,a):e}function vd(e){if(!dy.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);vd(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(!cy.test(a)&&!ly.test(a))throw new Error(`Invalid marketplace source: "${a}". Must be owner/repo or an https:// URL.`);return a}var sy,ny,dy,cy,ly,Io=H(()=>{"use strict";sy=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;ny=/^[^@]+@[^@]+$/;dy=/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\/[a-zA-Z0-9][a-zA-Z0-9._-]*)?$/;cy=/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/,ly=/^https:\/\/[\w./:@?&=+#%-]+$/;});var ju={};Xc(ju,{FlowApiAdapter:()=>Ut});var uy,Ut,yd=H(()=>{"use strict";xr();hd();I();Io();uy=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"),uy.debug("ping ok"),!0}catch{return !1}}};});function my(){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 zu(){return Uu??=my(),Uu}var Uu,Wu=H(()=>{"use strict";});var Qu={};Xc(Qu,{GitRepoAdapter:()=>zt});function Hu(e,a){if(!gy.test(e))throw new Error(`Invalid ${a} in catalog source URL: "${e}"`)}var gy,zt,kd=H(()=>{"use strict";Wu();Vo();gy=/^[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(Qn(r))throw new Error(`Catalog source URL points to a private/loopback address: "${r}"`);let s=i.replace(/^\//,"").split("/"),[n,d]=s;return Hu(n,"owner"),Hu(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 Ju.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 Ju.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 zu();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 $c=new Set(["skill","mcp","bundle","plugin"]),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($c),origins:new Set(hn)},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($c)},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(hn)},selectedIndex:0})),setDebugPanelOpen:a=>e({debugPanelOpen:a}),incrementCatalogVersion:()=>e(a=>({catalogVersion:a.catalogVersion+1})),setBundleInstallFlow:a=>e({bundleInstallFlow:a})}));Re();xt();Ii();U();Vo();I();var Mi=P("api:metrics");function Rl(){return Fa("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function Al(e,a,o){return Ju.post(e,{json:a,headers:o})}async function lb(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 S(e,a){let o=await Oa(),t=await lb(o),r=await Y();if(!Ka.test(r.tenant))throw new Error(`Invalid tenant value: "${r.tenant}"`);let i={action:e,booster:fn,metadata:{...a},success:true,tenant:r.tenant,timestamp:new Date().toISOString(),user:{id:t.sub,name:t.name,email:t.email}};try{await Al(Rl(),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 xl(e,a,o){try{let t=o&&Ka.test(o)?o:"unknown",r={action:e,booster:fn,metadata:a,success:!0,tenant:t,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await Al(Rl(),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 ub={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},ka={...ub};function El(e){let a=Date.now();ka={sessionStart:a,stepStart:a,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function Xo(e){ka.currentStep=e,ka.stepStart=Date.now();}function Z(){return {...ka}}function Po(){return ka.sessionStart===0?0:Date.now()-ka.sessionStart}function Ko(){return ka.stepStart===0?0:Date.now()-ka.stepStart}function Il(){ka.tuiSessionStart=Date.now();}function Tl(){return ka.tuiSessionStart===0?0:Date.now()-ka.tuiSessionStart}I();var pb=3e3,mb=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:Po()};try{await Promise.race([S(w.CLI_ONBOARDING_ABANDONED,t),new Promise((r,i)=>setTimeout(()=>i(new Error("abandonment timeout")),pb))]);}catch(r){mb.warn(`Abandonment event failed: ${String(r)}`);}}function Ml(e,a){return Promise.race([e,new Promise(o=>setTimeout(o,a))])}I();var gb=3e3,fb=P("session-end");async function fr(e,a,o){let t=Tl(),i=[S(w.CLI_TUI_SESSION_ENDED,{duration_ms:t,active_tab:a,interface:"tui"})];o!=="main"&&i.push(qi(e));try{await Ml(Promise.all(i).then(()=>{}),gb);}catch(s){fb.warn(`Session end event failed: ${String(s)}`);}}var yb=2e3;function Ll(){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);},yb);},[e,r,i,s]);return useInput((d,l)=>{l.ctrl&&d==="c"&&n();}),{pendingExit:t}}var wb=16;function Fl({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(wb)}),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 Ol({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 Nl({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 Gl(){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 Zo(){return de__default.join(Ce__default.homedir(),".claude","settings.json")}function jl(e){return `${(e&&e.trim().length>0?e.trim():ni).replace(/\/+$/,"")}/flow-litellm/`}function Dr(){let e=Zo();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=Zo();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 Ul(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 ed(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 zl(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 Ib=3600,et=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 Tb(e){return Eb.sign({clientId:e.clientId,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:Ib})}function Oi(e,a={}){let o=Dr();if(o.status==="malformed"&&!a.allowOverwriteMalformed)throw new et;let t=o.status==="ok"?o.settings:{},r=o.status==="ok"?ed(o.settings):null,i=o.status==="ok"?zl(o.settings):null,s=a.jwtOverride??Tb(e),n=jl(e.customUrl),d=Ul(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 Wl(){let e=Dr();return e.status!=="ok"?false:ed(e.settings)!==null}Re();Oe();function Mb(){let e=rl();if(!se__default.existsSync(e))return {};try{return JSON.parse(se__default.readFileSync(e,"utf-8"))}catch{return {}}}var ad=null;function qb(){return ad===null&&(ad=Mb()),ad}function So(){return !!qb().ENABLE_EXPERIMENTAL_BETAS}U();function Nb(){return ce.filter(e=>e.platforms[process.platform]?.status==="supported")}function Hl(e){let a=Nb();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"}},Gb={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=So()?[Gi,Gb]:[Gi];Re();I();var zb=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 Wb={retries:5,minTimeout:50};async function Ql(e,a){se__default.mkdirSync(de__default.dirname(e),{recursive:true});let o=await Ub.lock(e+".lock",{realpath:false,retries:Wb});try{return await a()}finally{await o();}}function Vl(){let e=ji();if(!se__default.existsSync(e))return [];try{let a=JSON.parse(se__default.readFileSync(e,"utf-8"));return a.schemaVersion!==1?(zb.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 at(){return Vl()}function _l(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 at().find(a=>a.alias===e)??null}async function Pa(e){let a=ji();await Ql(a,async()=>{let o=Vl(),t=o.findIndex(r=>r.alias===e.alias);t===-1?o.push(e):o[t]=e,_l(o);});}async function ot(){let e=ji();se__default.existsSync(e)||await Ql(e,async()=>{se__default.existsSync(e)||_l([]);});}var Qb=promisify(execFile);function Co(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 Ya(){return process.platform==="win32"?"npm.cmd":"npm"}var Xl=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=Co(a,"npm");if(!o)return null;try{let{stdout:t}=await Xl(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=Co(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 Xl(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),$b=/^(\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=Co(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=Co(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($b);return t?t[2]:null}catch{return null}}};var Tt=promisify(execFile),$l=/([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/;function Yl(){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=Co(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(Yl(),de__default.basename(a.binaryName));for(let t of [o,a.binaryName])try{let{stdout:r}=await Tt(t,["--version"]),i=r.match($l);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=Yl(),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($l);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 Zl="0.0.0";try{let e=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8"));typeof e.version=="string"&&(Zl=e.version);}catch{}var re=Zl;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 S(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 Ao(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 S(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 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 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 S(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 rv(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 rv(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 S(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 S(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 S(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 S(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 Ao(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 eu(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 iv=P("useAuthSetup");function au(){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:v,setJustAuthenticated:k}=oa(),T=()=>{m("fields"),g(null),a(""),o.current=null,t.current=null,r.current=null;},L=()=>{S(w.CLI_SESSION_STARTED,{cli_version:re,os:process.platform,node_version:process.version,duration_ms:Po(),interface:"tui"}).catch(()=>{});},A=async W=>{h.current=true;let _={...o.current,customUrl:t.current??void 0};try{W&&Ni(W),await yo(_);}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=>iv.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 et?(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");},ee=W=>{r.current=W,z();},z=async()=>{let W=t.current;W&&La(W),c(true),d(null),f.current+=1;try{await _o(o.current);let _=O(!1);_&&(g(_),m("preview"));}catch(_){let E=_ instanceof Error?_.message:"Authentication failed";d(E),xl(w.CLI_AUTH_FAILED,{error_code:eu(_),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:T,handleSubmit:x,goToEmailStep:J,handleEmailConfirm:ee,commitAndProceed:F,skipJwtAndProceed:M,planPersistOverwrite:oe}}U();j();function ou(){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}=au(),[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?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"?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(Ol,{onConfirm:m})]}):r==="preview"&&i?jsx(Nl,{plan:i}):r==="malformedConfirm"?jsx(Gl,{}):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(Fl,{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(lv,{text:"FLOW",font:"block",colors:["white","white"]}),jsx(Box,{marginTop:-1,marginBottom:1,children:jsxs(Text,{dimColor:true,children:["Marketplace \xB7 v",re]})})]})}var su=[{id:"discover",focus:"list"},{id:"installed",focus:"list"},{id:"updates",focus:"list"},{id:"marketplaces",focus:"marketplaces"}],ie=So()?su:su.slice(0,3);function uv(e){return ie.findIndex(a=>a.id===e)}function rd(e,a,o){let t=uv(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 cu={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function lu({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?`${cu[o]} (${e})`:cu[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 pu(){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 fv=["skill","mcp","bundle"].map((e,a)=>({key:String(a+2),type:e,...ft[e]})),hv=["internal","external"].map((e,a)=>({key:String(a+6),origin:e,...Kc[e]}));function mu(){let e=y(t=>t.catalogFilters),a=e.types.has("skill")&&e.types.has("mcp")&&e.types.has("bundle"),o=e.origins.has("internal")&&e.origins.has("external");return jsxs(Box,{paddingX:1,paddingBottom:1,gap:1,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"]})]}),fv.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"]})]}),hv.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 gu({type:e}){let{label:a,color:o}=ft[e];return jsx(Text,{color:o,children:a})}U();function bu({origin:e}){return e===dr?jsx(Text,{color:"blue",children:"[Flow]"}):jsx(Text,{color:"white",children:"[External]"})}j();var Xi=yv.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(gu,{type:a.type})]}),a.origin&&jsxs(Text,{children:[" ",jsx(bu,{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 ku({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 wu({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 Cu({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(wu,{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 Av={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function xv({items:e,tabId:a,emptyMessage:o,groups:t,actionHint:r}){return jsxs(Box,{flexDirection:"column",children:[jsx(pu,{}),jsx(mu,{}),jsxs(Box,{paddingX:1,marginTop:1,children:[jsx(Text,{bold:true,children:Av[a]}),jsxs(Text,{dimColor:true,children:[" (",e.length,")"]}),r&&e.length>0&&jsx(Text,{dimColor:true,children:` \xB7 ${r}`})]}),t&&t.length>0?jsx(Cu,{groups:t,emptyMessage:o}):jsx(ku,{items:e,emptyMessage:o})]})}function Ru({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(xv,{items:e,tabId:r,emptyMessage:a,groups:r!=="discover"?o:void 0,actionHint:r==="updates"?"press 'a' to update all":void 0},r)})}var Tv={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:[Tv[e],a?" | Ctrl+D: debug log":""]})})}j();function Au({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(Bp,{type:"dots"})}),jsxs(Text,{children:[" ",e]})]})}function ud(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}var Tu=20;function Yi(e,a){let o=a>0?Math.min(e/a,1):0,t=Math.round(o*100),r=Math.round(o*Tu),i="\u2588".repeat(r)+"\u2591".repeat(Tu-r),s=`${ud(e)} / ${ud(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 fd=Object.entries(Xa),Fu=[...fd.map(([,e])=>e.actionLabel),"Cancel"],Ou=Object.fromEntries(fd.map(([,e])=>[e.actionLabel,e.description]));function Nu(e){let a=fd.find(([,o])=>o.actionLabel===e);return a?a[0]:null}I();var Qv=P("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"&&Qv.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 _v={user:"global",project:"project",local:"local"};function ts(e){return e?_v[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},Eo=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();hd();I();var $v=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);$v.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 iy={retries:5,minTimeout:50};async function bd(e,a){mkdirSync(dirname(e),{recursive:true});let o=await Ub.lock(e+".lock",{realpath:false,retries:iy});try{return await a()}finally{await o();}}var is=class{filePath;constructor(a){this.filePath=a??tl();}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 bd(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 bd(this.filePath,async()=>{let o=await this.read();await this.write(o.filter(t=>t.id!==a));});}async updateField(a,o){await bd(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));});}};yd();var ge=new rs,ao=new is,fy=["flow-harness"];function hy(){let e=process.env.FLOW_CONTENT_SOURCES;return e===void 0?fy:e.split(",").map(a=>a.trim()).filter(Boolean)}ge.register(new Ut);for(let e of hy())ge.register(new Ut(e));var Vu=false;async function _u(){if(Vu)return;Vu=true;let e=await ao.read(),{GitRepoAdapter:a}=await Promise.resolve().then(()=>(kd(),Qu));for(let o of e)ge.register(new a(o.id,o.name,o.source));}Io();var Xu=2;async function oo(e){if(e){let{FlowApiAdapter:a}=await Promise.resolve().then(()=>(yd(),ju));return new a(e).fetchItems()}return ge.fetchAll()}async function Ku(){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 $u(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:m,value:p}=await l.read();if(m)break;if(u+=p.byteLength,n&&u>s*Xu)throw await l.cancel(),new Error(`Download exceeded expected size: received ${u} bytes, expected at most ${s*Xu}`);c.push(p),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 Yu(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 vy.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 Pd(e){await Ua.rm(e,{recursive:true,force:true});}async function To(){let e=al();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 Ub.lock(e,{stale:1e4,retries:{retries:2,minTimeout:500,maxTimeout:500}})}Oe();U();function Py(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 ap(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 Dy(e){let a=ap(e);if(a)return a;let o=Py(e),t=ui(e);return se__default.mkdirSync(de__default.dirname(t),{recursive:true}),Dd(o,e),o}function Dd(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 wy(e){let a=e||pe,o=Wo(),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:el(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 op(e,a,o){ia(e.name),wy(o);let t=kn(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=Dy(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}),Dd(r,o));}function wd(e,a){ia(e);let o=kn(e,a);try{se__default.rmSync(o,{recursive:!0,force:!0});}catch{}let t=ap(a);if(!t)return;let r=t.plugins.length;t.plugins=t.plugins.filter(i=>i.name!==e),t.plugins.length!==r&&Dd(t,a);}j();I();var Cy=P("mcpConfigReader"),Ry=500,Ay=512;function xy(){return de__default.join(Ce__default.homedir(),".claude.json")}function Ey(){return de__default.join(process.cwd(),".mcp.json")}function rp(e){if(!se__default.existsSync(e))return null;try{return JSON.parse(se__default.readFileSync(e,"utf-8"))}catch{return Cy.debug(`[mcpConfigReader] Failed to parse ${e}`),null}}function Ir(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Sd(e){if(!Ir(e))return {};let a=e.mcpServers;return Ir(a)?a:{}}function Cd(e,a){return Object.keys(e).slice(0,Ry).map(t=>({name:b(t.slice(0,Ay)),marketplace:"",version:void 0,installedAt:"",installPath:"",scope:a,description:void 0,author:void 0,status:"enabled",type:"mcp"}))}function sp(){let e=[],a=xy(),o=rp(a);if(Ir(o)){let n=o,d=Sd(n);e.push(...Cd(d,"user"));let l=process.cwd();if(Ir(n.projects)){let c=n.projects[l];if(Ir(c)){let u=Sd(c);e.push(...Cd(u,"local"));}}}let t=Ey(),r=rp(t),i=Sd(r);e.push(...Cd(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 Ty(e,a,o){try{await S(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 My(e,a,o){let t=a==="enabled"?w.CLI_TOOL_ENABLED:w.CLI_TOOL_DISABLED;S(t,{tool_id:e,source:o,interface:Z().interfaceType}).catch(r=>sa.warn(`Failed to send ${a} metrics: ${String(r)}`));}function Ed(){return de__default.join(Ce__default.homedir(),".claude","plugins","installed_plugins.json")}function qy(){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(qy()),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 dp(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=Ed();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 Id(){let e=Ed();try{let a=await se__default.promises.readFile(e,"utf-8");return JSON.parse(a)}catch{return {version:2,plugins:{}}}}function Ly(e){let a=e?.code;return a==="EACCES"||a==="EPERM"}function cp(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 Ly(o)?new Error(`Permission denied: cannot write to '${e}'. Check your file system permissions.`):o}}function na(e){cp(Ed(),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 Fy(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=dp(e);if(!se__default.existsSync(a))return {};try{return JSON.parse(se__default.readFileSync(a,"utf-8"))}catch{return {}}}function cs(e,a="user"){cp(dp(a),e);}function Oy(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 Ny(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 Rd(e="user"){return Mr(e).enabledPlugins??{}}function Ad(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 Gy(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=Rd(),o=Rd("project"),t=Rd("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 Gy(p).map(f=>{let h=Fy(f.installPath,u),k=(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:k===false?"disabled":"enabled"}})}),s=sp(),n=new Set(i.map(l=>`${l.name}@${l.scope}`)),d=s.filter(l=>!n.has(`${l.name}@${l.scope}`));return [...i,...d]}function np(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 To();try{let t=Ae(),r=Ny(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,...m}=t.plugins;na({...t,plugins:m}),Ad(i,a),wd(s,np(i));}else t.plugins[i]=c,na(t),Ad(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}),Ad(i,c.scope);}wd(s,np(i));let{[i]:d,...l}=t.plugins;na({...t,plugins:l});}await Ty(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 To();try{let r=Ae(),{key:i,name:s}=Oy(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),My(s,a,l),sa.debug(`[${s}] Status updated to ${a}`);}finally{await t();}}Oe();function Td(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,Td(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(Td(n))));o[t]=[...i,...r.filter(n=>!s.has(JSON.stringify(Td(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 Md=P("bundleContent"),ls="${CLAUDE_PLUGIN_ROOT}/hooks/";function By(e){return e.split(ls).join("$CLAUDE_PROJECT_DIR/.claude/hooks/")}function qd(e){return typeof e=="string"?By(e):Array.isArray(e)?e.map(qd):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([a,o])=>[a,qd(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 Uy(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 Md.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=Dn(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=qd(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 lp(e,a){let o=jy(e,a),t=Uy(e,a);o>0&&Md.debug(`Copied ${o} rule file(s) to ${Pt(a)}`),t>0&&Md.debug(`Copied ${t} hook script(s) to ${Dn(a)}`);}U();I();var zy=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,Wy=/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)?$/;function ia(e){if(!zy.test(e))throw new Error(`Invalid plugin name from manifest: "${e}". Plugin names must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Jy(e){if(!Wy.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 qo=P("installer");function Hy(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 Qy(e,a,o){o&&await Pd(a);try{qo.debug(`[${a}] Extracting archive...`),await Yu(e,a);}catch(t){throw await Pd(a),t}}function Vy(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 _y(e,a,o,t,r,i){try{await S(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:i,source:r,scope:t,version:a,duration_ms:o,interface:Z().interfaceType});}catch(s){qo.warn(`Failed to send install metrics: ${String(s)}`);}}async function Xy(e,a,o,t){try{await S(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){qo.warn(`Failed to send install-failed metrics: ${String(r)}`);}}async function je(e,a={}){let o=Date.now(),t=null;try{qo.debug(`[${e}] Acquiring lock...`),t=await To();let{pluginKey:r,alreadyInstalled:i}=Hy(e,a.force,a.source),{source:s}=a;qo.debug(`[${e}] Fetching manifest...`);let n=await Wt(e,s);ia(n.name),Jy(n.version),qo.debug(`[${e}] Downloading archive...`);let d=await $u(e,a.onDownloadProgress,s),l=a.scope??"user",c=a.type??"skill",u=Zc(n.name,n.version,a.source);await Qy(d,u,!!i&&!!a.force),lp(u,l),Vy(r,u,n.version,l,"internal",a.providerId,c),op(n,u,a.source);let m=Date.now()-o;qo.debug(`[${e}] Installed successfully in ${m}ms`);let p={name:n.name,version:n.version,path:u,duration_ms:m};return a.skipMetrics||await _y(n.name,n.version,m,ts(l),"internal",c),p}catch(r){throw await Xy(e,r,"internal",a.type??"skill"),qo.error(`[${e}] Installation failed: ${r instanceof Error?r.message:String(r)}`),r}finally{t&&await t();}}I();j();Re();xt();I();var Ky=P("commands:helpers");async function he(){let e=await Y();if(!e)return C("Not authenticated. Run: flow auth login"),false;e.customUrl&&La(e.customUrl);try{await Oa();}catch(a){return Ky.debug(`Token validation failed: ${String(a)}`),C("Session expired. Run: flow auth login"),false}return true}async function ae(e){let a=Fd.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 Lo(e){let a=Fd.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{a.question(b(e),t=>{a.close(),o(t.trim());});})}var $y="\x1B[A",Yy="\x1B[B";function up(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 Zy(e,a){return e.map((o,t)=>up(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(Zy(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===Vy){r=(r-1+a.length)%a.length,n(),i="";return}if(i===_y){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${np(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);})}Io();var Ht=P("claudeProxy"),Od="claude ",dp="flow ",qd=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";}},Ky=/^plugins?\s+(install|i)\s+|^plugins?\s+marketplace\s+add\s+|^mcp\s+(add|remove)\s+/,$y=/^--(scope|transport|env|header|timeout|prefix-args|timeout-ms|local|global|user)$/,Yy={"--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}$/},Zy=/^npm\s+(i|install)\s+-g\s+@ciandt-flow\/cli$/,ek=/^(flow|claude)\s+auth\s+login(\s|$)/,cp=/^flow\s+plugins?\s+(install|i)\s+([^@\s]+)$/;function lp(e){return cp.test(e.trim())}function ak(e){return cp.exec(e.trim())?.[2]??""}async function up(e){let a=ak(e);fd(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 Nd(t)?new Ld:t}}function ok(e){pp(e);let a=e.slice(Od.length);if(!Ky.test(a))throw new Jt(e)}var us=class extends Error{constructor(){super('Claude Code CLI not found. Ensure "claude" is installed and available on your PATH.'),this.name="ClaudeCliNotFoundError";}},Ld=class extends Error{constructor(){super('Flow CLI not found. Ensure "flow" is installed and available on your PATH.'),this.name="FlowCliNotFoundError";}};function pp(e){if(!e||!/^claude /.test(e))throw new qd(e)}function tk(e){for(let a=0;a<e.length;a++){let o=e[a];if(o==="--")return;if(!o.startsWith("-"))continue;if(!$y.test(o))throw new Jt(`Unexpected flag: ${o}`);let t=Yy[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){pp(e);let a=e.slice(Od.length).split(/\s+/).filter(Boolean);tk(a);let o=rk(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 Nd(r)?new us:r}}function rk(e){return e.length>=3?e[2]:e.join(" ")}function Nd(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}function ik(e){return e.startsWith(dp)?Od+e.slice(dp.length):e}function sk(e){return Zy.test(e)||ek.test(e)}function nk(e){let a=0;for(;a<e.length&&sk(e[a]);)a++;return e.slice(a)}var dk=/^claude\s+(?:plugins?\s+(?:install|i)\s+|mcp\s+(?:add|remove)\s+)/;function ck(e,a){return !a||e.includes("--scope")||!dk.test(e)?e:`${e} --scope ${a}`}async function Nr(e,a){let o=e.split("&&").map(s=>s.trim()).filter(Boolean),r=nk(o).map(s=>ik(s)).map(s=>ck(s,a));if(r.length===0)throw new Error("Empty install command");for(let s of r)ok(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 ps(e,a,o){let t=Bt(e),r=a?.trim();if(!r&&(r=(await Lo(`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=is(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 Nd(i)?new us:i}}Io();U();Oe();I();var gk=6e4,Fo=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:gk}}).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 Fo("Clone timed out after 60s. Check your SSH keys or credentials.",e,true,false):d?new Fo(`Authentication failed for ${e}. Ensure you have access and credentials are configured.`,e,false,true):new Fo(`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 dt(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 hk(e){return typeof e=="object"&&e!==null&&e.source==="git-subdir"}function bk(e){return typeof e=="object"&&e!==null&&e.source==="url"}function vk(e){return typeof e=="object"&&e!==null&&e.source==="github"}function ct(e,a){let o=e.source;if(hk(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(bk(o))return {cloneUrl:o.url,subPath:"."};if(vk(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 kk(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=Wo();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 kp(e,a){let o=e.catalogId?ge.getAdapter(e.catalogId):void 0,t=ct(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=kk(e.catalogId,o?.source),s=a.scope??"user",n;r?n=vn(i,e.name,"external"):n=join(Jo(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 Ad(),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 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 Gd(e,a,o,t){try{await S(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:o,source:"external",scope:os(t),version:"unknown",duration_ms:a,interface:Z().interfaceType});}catch(r){Aa.warn(`Failed to send external install metrics: ${String(r)}`);}}async function bp(e,a,o){try{await S(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 Pk={async install(e,a){if(e.origin===gt&&!e.installCommand&&!Gt(e.name))return kp(e,a);if(e.origin===gt&&e.installCommand){let o=e.type??"skill",t=await Nr(e.installCommand,a.scope);return t.exitCode===0?(await Gd(e.name,t.duration_ms,o,a.scope),{success:true,message:`Installed ${e.name}`}):(await bp(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 Gd(e.name,r.duration_ms,o,a.scope),{success:true};Aa.debug(`[${e.name}] First attempt failed, adding marketplace`),await ps(e.name,a.marketplaceSource,()=>{});let i=await qe(t);return i.exitCode===0?(await Gd(e.name,i.duration_ms,o,a.scope),{success:true}):(await bp(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 vp(e){return {async install(a,o){if(a.origin===gt&&!a.installCommand&&!Gt(a.name))return kp(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 Dk(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 wk(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 Bd(e,a,o,t){let r=await Ad(),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 Sk={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=ct(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=Dk(s);if(n.length===0)return {success:!1,message:`No agent files found in "${e.name}"`};let d=pi(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 m=da(basename(u,".md"));se__default.copyFileSync(u,join(d,`${l}--${m}.md`));}let c=n.length===1?join(d,`${l}.md`):d;return await Bd(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=pi(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(pi(a),`${da(e)}.md`)}},Ck={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=ct(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=wk(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 Bd(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)}},Rk={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=ct(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:{},m=u.hooks!==null&&typeof u.hooks=="object"&&!Array.isArray(u.hooks)?u.hooks:{},p=Or(m,l);return Li({...u,hooks:p}),await Bd(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 ""}},ms=class{id="claude-code";name="Claude Code";async isAvailable(){return dt("claude",["--version"])}getSupportedScopes(){return ["user","project","local"]}installers={bundle:Pk,skill:vp("skill"),mcp:vp("mcp"),agent:Sk,hook:Rk,rule:Ck}};function gs(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 xk=new Set(["gh"]),Ek=gs(xk,"use: gh copilot mcp remove <name>"),fs=class{id="copilot";name="GitHub Copilot";async isAvailable(){return await dt("gh",["--version"])?dt("gh",["copilot","--version"]):false}getSupportedScopes(){return ["user"]}installers={mcp:Ek}};Oe();var Ik=new Set(["opencode"]),Tk=gs(Ik,"use: opencode config remove mcp <name>");function Mk(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 Pp(){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=ct(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=ui(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`),Mk(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=ui(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(ui(a),`${e}.js`)}}}var hs=class{id="opencode";name="OpenCode";async isAvailable(){return dt("opencode",["--version"])}getSupportedScopes(){return ["user","project"]}installers={mcp:Tk,skill:Pp(),bundle:Pp()}};var Wa=new as;Wa.register(new ms);So()&&(Wa.register(new fs),Wa.register(new hs));function Dp({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 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 v=d.find(k=>k.name===h);v?(u(v.id),n(false),i(true)):n(false);},[d]),g=useCallback(h=>{let v=qu(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:p,onClose:()=>n(false)},"provider")}return r?jsx(ra,{itemName:`${e} \u2014 Choose scope`,actions:Tu,descriptions:Mu,onAction:g,onClose:f},"scope"):jsx(ra,{itemName:e,actions:["Install","Cancel"],onAction:m,onClose:t},"main")}j();function Sp({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=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:p,onClose:r})}function ys({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 Ap({itemName:e,itemScope:a,itemStatus:o,updateAvailable:t,catalogVersion:r,onUninstall:i,onToggleStatus:s,onUpdate:n,onClose:d}){let{isConfirming:l,requestConfirm:c}=ys({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&&b(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 Ip({itemName:e,itemScope:a,onUninstall:o,onClose:t}){let{isConfirming:r,requestConfirm:i}=ys({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"),Tp=/already exists/i;async function jk(e){if(!e.installCommand)throw new Error("Missing install command");let a=e.installCommand;if(lp(a)){let o=await up(a);if(o.exitCode!==0){let t=o.stderr?.trim()||o.stdout?.trim()||`exit code ${o.exitCode}`;if(Tp.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(Tp.test(t))return;throw new Error(t)}}}async function Uk(e,a){try{await S(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 zk(e,a,o){try{await S(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 Mp(e,a,o,t){try{await S(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 Wk(e,a,o,t,r){try{await S(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 Ds(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 Uk(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 Mp(s,f,h,"unknown artifact type"),o?.({index:p+1,total:c,artifact:g,success:false,error:"unknown artifact type"});continue}try{await jk(g),l++,await zk(s,f,h),o?.({index:p+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 Mp(s,f,h,k),o?.({index:p+1,total:c,artifact:g,success:false,error:k});}}let u=Date.now()-n,m=d.length;return await Wk(s,l,m,i,u),{bundleTitle:e.title,total:t.length,installed:l,skipped:i,failed:m,failures:d}}j();function Op({bundle:e,onComplete:a}){let[o,t]=useState(null),[r,i]=useState(null),s=useRef(false);return useEffect(()=>{s.current||(s.current=true,Ds(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(Fp,{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(Fp,{type:"dots"})}),jsx(Text,{color:"cyan",children:"Preparing..."})]})]})}var ve=create(e=>({installedItems:[],setInstalledItems:a=>e({installedItems:a}),loadFromDisk:()=>e({installedItems:le()})}));j();function Np({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 Gp({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 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 Bp(e){return e.adapter.removable!==false?4:2}U();j();function jp({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 zp({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 Wp({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(jp,{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,v=i.length>0&&m<i.length,k=p>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(zp,{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(zp,{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"})})]})}bd();var Kk=/^https?:\/\/.+/;function $k(e){return e!==null&&typeof e=="object"&&"response"in e&&e.response?.status===404}function Yk(e){return e instanceof Error&&e.code==="GITHUB_AUTH_REQUIRED"}function Vp(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,v=u.current;if(!Kk.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="",m.current="",r("idle");}catch(L){let A=$k(L)?"No marketplace.json found in this repository (checked main and master branches). Ensure the repo has a marketplace.json at its root.":Yk(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){m.current=m.current.slice(0,-1),d(m.current),c(null);return}h&&!v.ctrl&&!v.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 _p(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 Kp(){let e=y(E=>E.focus),a=y(E=>E.setFocus),o=y(E=>E.showNotification),t=ve(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),[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 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){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(Q=>{B||p({items:Q,loading:false,error:null});}).catch(Q=>{B||p({items:[],loading:false,error:Q instanceof Error?Q.message:"Failed to load catalog"});}),()=>{B=true;}},[s]);let k=Vp(v),T=useCallback(()=>{v(),n(0),l("list"),p(null),f("main");},[v]),{handleRemove:L}=_p(T),A=useCallback(async E=>{f("removing"),await L(E);},[L]),M=useCallback(async E=>{try{let B=await E.adapter.fetchItems();if(p({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"),[]),ae=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]),ee=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?Bp(Q)-1:0;u(ii=>Math.min(ii+1,Fe));return}B.return&&ae(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(Wp,{entry:E,items:m?.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(Np,{entries:r,selectedIndex:s,focusPanel:d})}),jsx(Box,{flexDirection:"column",flexGrow:1,children:d==="detail"&&W?jsx(Gp,{entry:W,detailData:m,installedCount:_,focusPanel:d,actionIndex:c,onBrowse:O,onUpdate:J,onToggleAutoUpdate:ee,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 $p(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==="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 Yp(e,a){return a.escape?[{type:"setActionMenuOpen",open:false},{type:"setFocus",focus:"list"}]:[]}function Zp(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 tP=new Set(re.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 em({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(ad(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(ad("",h,{activeTab:v}));},{isActive:tP.has(a)}),useInput((f,h)=>{let{activeTab:v,selectedIndex:k,actionMenuOpen:T}=y.getState();Vr($p(f,h,{activeTab:v,selectedIndex:k},l.current));},{isActive:a==="list"}),useInput((f,h)=>{Vr(Yp(f,h));},{isActive:a==="actionMenu"}),useInput((f,h)=>{let v=Zp(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 m=useCallback(()=>{i(false),r("list");},[i,r]),p=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:m,selectedIndex:o,clampIndex:p,filteredItems:g}}function om(){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:!Jd.valid(e)||!Jd.valid(a)?false:Jd.gt(a,e)}U();I();var io=P("updater");async function rP(e,a,o,t,r,i){try{await S(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 iP(e){let a=Ae(),o=`${e}@${pe}`,t=a.plugins[o];return !t||t.length===0?null:{pluginKey:o,entry:t[0]}}async function Rs(e,a={}){let o=Date.now(),t=null;try{io.debug(`[${e}] Acquiring lock...`),t=await To();let r=iP(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 Eo(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 rP(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 To();let u=Ae(),m=`${e}@${pe}`;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();}}Io();I();var As=P("dispatcher");async function sP(e,a,o,t,r){let i=Bt(e);return As.debug(`[${e}] Install failed (exit code), attempting marketplace add`),r?.onError?.(o),t?r?.onStatus?.(`Adding marketplace for ${i}...`):r?.onPause?.(),await ps(e,t,()=>{}),r?.onResume?.(`Retrying install for ${i}...`),As.debug(`[${e}] Retrying install after marketplace add`),qe(a)}async function tm(e,a,o,t){let r=jt(e,t),i=Bt(e);o?.onStatus?.(`Installing ${i}...`),As.debug(`[${e}] Attempting install: ${r}`);let s=await qe(r);if(s.exitCode===0)return s;As.debug(`[${e}] Install failed (exit ${s.exitCode}), attempting marketplace add`);let n=s.stderr||`Install failed with exit code ${s.exitCode}`;return sP(e,r,n,a,o)}async function rm(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 im(){let e=ve(s=>s.installedItems),a=ve(s=>s.loadFromDisk),o=useCallback(async(s,n)=>{let d=await rm(s,n);if(!d.success)throw new Error(d.message||"Installation failed");a();},[a]),t=useCallback(async(s,n)=>{let d=le().find(p=>p.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",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 Rs(s),a();},[a]);return {install:o,uninstall:t,toggle:r,update:i}}j();I();var Es=P("mcp");function _r(e,a){e.silent?Ne({status:"error",mcp:a.name,...a.exitCode!==void 0&&{exitCode:a.exitCode},message:a.message}):C(`Failed to ${a.action} MCP "${a.name}": ${a.message}`);}function nm(e,a){e.silent?Pe({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 nP(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 Hd(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 dm(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}Es.debug(`[${e}] Starting MCP add with args: ${a.join(" ")}`);let t=nP(e,a,o.transport,o.scope);if(!o.force){let i=b(e),s=b(t);if(!await ie(`Install external MCP "${i}"?
114
+ `),o(a[r].value);return}if(i===$y){r=(r-1+a.length)%a.length,n(),i="";return}if(i===Yy){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${up(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);})}Io();var Ht=P("claudeProxy"),Bd="claude ",pp="flow ",Od=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";}},ek=/^plugins?\s+(install|i)\s+|^plugins?\s+marketplace\s+add\s+|^mcp\s+(add|remove)\s+/,ak=/^--(scope|transport|env|header|timeout|prefix-args|timeout-ms|local|global|user)$/,ok={"--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}$/},tk=/^npm\s+(i|install)\s+-g\s+@ciandt-flow\/cli$/,rk=/^(flow|claude)\s+auth\s+login(\s|$)/,mp=/^flow\s+plugins?\s+(install|i)\s+([^@\s]+)$/;function gp(e){return mp.test(e.trim())}function ik(e){return mp.exec(e.trim())?.[2]??""}async function fp(e){let a=ik(e);vd(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 jd(t)?new Nd:t}}function sk(e){hp(e);let a=e.slice(Bd.length);if(!ek.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";}},Nd=class extends Error{constructor(){super('Flow CLI not found. Ensure "flow" is installed and available on your PATH.'),this.name="FlowCliNotFoundError";}};function hp(e){if(!e||!/^claude /.test(e))throw new Od(e)}function nk(e){for(let a=0;a<e.length;a++){let o=e[a];if(o==="--")return;if(!o.startsWith("-"))continue;if(!ak.test(o))throw new Jt(`Unexpected flag: ${o}`);let t=ok[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){hp(e);let a=e.slice(Bd.length).split(/\s+/).filter(Boolean);nk(a);let o=dk(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 jd(r)?new ps:r}}function dk(e){return e.length>=3?e[2]:e.join(" ")}function jd(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}function ck(e){return e.startsWith(pp)?Bd+e.slice(pp.length):e}function lk(e){return tk.test(e)||rk.test(e)}function uk(e){let a=0;for(;a<e.length&&lk(e[a]);)a++;return e.slice(a)}var pk=/^claude\s+(?:plugins?\s+(?:install|i)\s+|mcp\s+(?:add|remove)\s+)/;function mk(e,a){return !a||e.includes("--scope")||!pk.test(e)?e:`${e} --scope ${a}`}async function Nr(e,a){let o=e.split("&&").map(s=>s.trim()).filter(Boolean),r=uk(o).map(s=>ck(s)).map(s=>mk(s,a));if(r.length===0)throw new Error("Empty install command");for(let s of r)sk(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 Lo(`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 jd(i)?new ps:i}}Io();U();Oe();I();var vk=6e4,Fo=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:vk}}).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 Fo("Clone timed out after 60s. Check your SSH keys or credentials.",e,true,false):d?new Fo(`Authentication failed for ${e}. Ensure you have access and credentials are configured.`,e,false,true):new Fo(`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 dt(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 kk(e){return typeof e=="object"&&e!==null&&e.source==="git-subdir"}function Pk(e){return typeof e=="object"&&e!==null&&e.source==="url"}function Dk(e){return typeof e=="object"&&e!==null&&e.source==="github"}function ct(e,a){let o=e.source;if(kk(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(Pk(o))return {cloneUrl:o.url,subPath:"."};if(Dk(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 Sk(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=Wo();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 Sp(e,a){let o=e.catalogId?ge.getAdapter(e.catalogId):void 0,t=ct(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=Sk(e.catalogId,o?.source),s=a.scope??"user",n;r?n=Pn(i,e.name,"external"):n=join(Jo(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 Id(),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 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 Ud(e,a,o,t){try{await S(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 Pp(e,a,o){try{await S(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 Ck={async install(e,a){if(e.origin===gt&&!e.installCommand&&!Gt(e.name))return Sp(e,a);if(e.origin===gt&&e.installCommand){let o=e.type??"skill",t=await Nr(e.installCommand,a.scope);return t.exitCode===0?(await Ud(e.name,t.duration_ms,o,a.scope),{success:true,message:`Installed ${e.name}`}):(await Pp(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 Ud(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 Ud(e.name,i.duration_ms,o,a.scope),{success:true}):(await Pp(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 Dp(e){return {async install(a,o){if(a.origin===gt&&!a.installCommand&&!Gt(a.name))return Sp(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 Rk(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 Ak(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 zd(e,a,o,t){let r=await Id(),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 xk={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=ct(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=Rk(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 m=da(basename(u,".md"));se__default.copyFileSync(u,join(d,`${l}--${m}.md`));}let c=n.length===1?join(d,`${l}.md`):d;return await zd(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`)}},Ek={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=ct(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=Ak(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 zd(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)}},Ik={async install(e,a){let o=a.scope??"user",t=e.catalogId?ge.getAdapter(e.catalogId):void 0,r=ct(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:{},m=u.hooks!==null&&typeof u.hooks=="object"&&!Array.isArray(u.hooks)?u.hooks:{},p=Or(m,l);return Fi({...u,hooks:p}),await zd(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 dt("claude",["--version"])}getSupportedScopes(){return ["user","project","local"]}installers={bundle:Ck,skill:Dp("skill"),mcp:Dp("mcp"),agent:xk,hook:Ik,rule:Ek}};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 Mk=new Set(["gh"]),qk=fs(Mk,"use: gh copilot mcp remove <name>"),hs=class{id="copilot";name="GitHub Copilot";async isAvailable(){return await dt("gh",["--version"])?dt("gh",["copilot","--version"]):false}getSupportedScopes(){return ["user"]}installers={mcp:qk}};Oe();var Lk=new Set(["opencode"]),Fk=fs(Lk,"use: opencode config remove mcp <name>");function Ok(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 Cp(){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=ct(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`),Ok(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 dt("opencode",["--version"])}getSupportedScopes(){return ["user","project"]}installers={mcp:Fk,skill:Cp(),bundle:Cp()}};var Wa=new os;Wa.register(new gs);So()&&(Wa.register(new hs),Wa.register(new bs));function Rp({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 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 v=d.find(k=>k.name===h);v?(u(v.id),n(false),i(true)):n(false);},[d]),g=useCallback(h=>{let v=Nu(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:p,onClose:()=>n(false)},"provider")}return r?jsx(ra,{itemName:`${e} \u2014 Choose scope`,actions:Fu,descriptions:Ou,onAction:g,onClose:f},"scope"):jsx(ra,{itemName:e,actions:["Install","Cancel"],onAction:m,onClose:t},"main")}j();function xp({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=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: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 Tp({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&&b(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 Lp({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"),Fp=/already exists/i;async function Jk(e){if(!e.installCommand)throw new Error("Missing install command");let a=e.installCommand;if(gp(a)){let o=await fp(a);if(o.exitCode!==0){let t=o.stderr?.trim()||o.stdout?.trim()||`exit code ${o.exitCode}`;if(Fp.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(Fp.test(t))return;throw new Error(t)}}}async function Hk(e,a){try{await S(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 Qk(e,a,o){try{await S(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 Op(e,a,o,t){try{await S(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 Vk(e,a,o,t,r){try{await S(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 Hk(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 Op(s,f,h,"unknown artifact type"),o?.({index:p+1,total:c,artifact:g,success:false,error:"unknown artifact type"});continue}try{await Jk(g),l++,await Qk(s,f,h),o?.({index:p+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 Op(s,f,h,k),o?.({index:p+1,total:c,artifact:g,success:false,error:k});}}let u=Date.now()-n,m=d.length;return await Vk(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(Bp,{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(Bp,{type:"dots"})}),jsx(Text,{color:"cyan",children:"Preparing..."})]})]})}var ve=create(e=>({installedItems:[],setInstalledItems:a=>e({installedItems:a}),loadFromDisk:()=>e({installedItems:le()})}));j();function Up({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 zp({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 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 Wp(e){return e.adapter.removable!==false?4:2}U();j();function Jp({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 Qp({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 Vp({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(Jp,{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,v=i.length>0&&m<i.length,k=p>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(Qp,{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(Qp,{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"})})]})}kd();var eP=/^https?:\/\/.+/;function aP(e){return e!==null&&typeof e=="object"&&"response"in e&&e.response?.status===404}function oP(e){return e instanceof Error&&e.code==="GITHUB_AUTH_REQUIRED"}function $p(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,v=u.current;if(!eP.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="",m.current="",r("idle");}catch(L){let A=aP(L)?"No marketplace.json found in this repository (checked main and master branches). Ensure the repo has a marketplace.json at its root.":oP(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){m.current=m.current.slice(0,-1),d(m.current),c(null);return}h&&!v.ctrl&&!v.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 Yp(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 em(){let e=y(E=>E.focus),a=y(E=>E.setFocus),o=y(E=>E.showNotification),t=ve(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),[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 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){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(Q=>{B||p({items:Q,loading:false,error:null});}).catch(Q=>{B||p({items:[],loading:false,error:Q instanceof Error?Q.message:"Failed to load catalog"});}),()=>{B=true;}},[s]);let k=$p(v),T=useCallback(()=>{v(),n(0),l("list"),p(null),f("main");},[v]),{handleRemove:L}=Yp(T),A=useCallback(async E=>{f("removing"),await L(E);},[L]),M=useCallback(async E=>{try{let B=await E.adapter.fetchItems();if(p({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]),ee=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?Wp(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(Vp,{entry:E,items:m?.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(Up,{entries:r,selectedIndex:s,focusPanel:d})}),jsx(Box,{flexDirection:"column",flexGrow:1,children:d==="detail"&&W?jsx(zp,{entry:W,detailData:m,installedCount:_,focusPanel:d,actionIndex:c,onBrowse:O,onUpdate:J,onToggleAutoUpdate:ee,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 am(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==="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 om(e,a){return a.escape?[{type:"setActionMenuOpen",open:false},{type:"setFocus",focus:"list"}]:[]}function tm(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 nP=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 rm({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(rd(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(rd("",h,{activeTab:v}));},{isActive:nP.has(a)}),useInput((f,h)=>{let{activeTab:v,selectedIndex:k,actionMenuOpen:T}=y.getState();Vr(am(f,h,{activeTab:v,selectedIndex:k},l.current));},{isActive:a==="list"}),useInput((f,h)=>{Vr(om(f,h));},{isActive:a==="actionMenu"}),useInput((f,h)=>{let v=tm(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 m=useCallback(()=>{i(false),r("list");},[i,r]),p=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:m,selectedIndex:o,clampIndex:p,filteredItems:g}}function sm(){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:!Vd.valid(e)||!Vd.valid(a)?false:Vd.gt(a,e)}U();I();var io=P("updater");async function dP(e,a,o,t,r,i){try{await S(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 cP(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 To();let r=cP(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 Eo(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 dP(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 To();let u=Ae(),m=`${e}@${pe}`;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();}}Io();I();var xs=P("dispatcher");async function lP(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 nm(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 lP(e,r,n,a,o)}async function dm(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 cm(){let e=ve(s=>s.installedItems),a=ve(s=>s.loadFromDisk),o=useCallback(async(s,n)=>{let d=await dm(s,n);if(!d.success)throw new Error(d.message||"Installation failed");a();},[a]),t=useCallback(async(s,n)=>{let d=le().find(p=>p.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",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=P("mcp");function _r(e,a){e.silent?Ne({status:"error",mcp:a.name,...a.exitCode!==void 0&&{exitCode:a.exitCode},message:a.message}):C(`Failed to ${a.action} MCP "${a.name}": ${a.message}`);}function um(e,a){e.silent?Pe({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 uP(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 _d(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 pm(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=uP(e,a,o.transport,o.scope);if(!o.force){let i=b(e),s=b(t);if(!await ae(`Install external MCP "${i}"?
118
118
  This will run: ${s}
119
- [y/N] `))return Es.debug(`[${e}] Installation cancelled by user`),D("Operation cancelled."),0}let r=o.silent?void 0:vc({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):(nm(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 cm(e,a){if(!await he())return 1;Es.debug(`[${e}] Starting MCP remove`);let o=Hd(e,a.scope);if(!a.force){let r=b(e),i=b(o);if(!await ie(`Remove MCP "${r}"?
119
+ [y/N] `))return Is.debug(`[${e}] Installation cancelled by user`),D("Operation cancelled."),0}let r=o.silent?void 0:Pc({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):(um(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 mm(e,a){if(!await he())return 1;Is.debug(`[${e}] Starting MCP remove`);let o=_d(e,a.scope);if(!a.force){let r=b(e),i=b(o);if(!await ae(`Remove MCP "${r}"?
120
120
  This will run: ${i}
121
- [y/N] `))return Es.debug(`[${e}] Removal cancelled by user`),D("Operation cancelled."),0}let t=a.silent?void 0:vc({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):(nm(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 lm({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:m,update:p}=im(),g=async(A,M,F)=>{d(true,A),t();try{await M(),r(o.length),i(F,"success");}catch(O){let ae=O instanceof Error?O.message:"Something went wrong";s.error(`[withLoading] ${A} failed: ${ae}`),i(ae,"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 ae=Date.now();(ae-n.current>100||F>=O)&&(n.current=ae,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}...`,()=>m(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 p(e.name),r(o.length),i(`\u2713 Updated ${e.name}${A}`,"success");}catch(F){if(F instanceof Eo)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 p(J.name).then(()=>({status:"fulfilled",value:void 0}),ee=>({status:"rejected",reason:ee})));let ae=O.filter(J=>J.status==="fulfilled").length,x=O.map((J,ee)=>J.status==="rejected"?A[ee].name:null).filter(J=>J!==null);r(o.length),x.length===0?i(`\u2713 Updated ${ae}/${M} plugin${M>1?"s":""}`,"success"):(s.error(`[handleBatchUpdate] failed: ${x.join(", ")}`),i(`Updated ${ae}/${M}; failed: ${x.join(", ")}`,ae>0?"info":"error"));}finally{d(false);}})();},handleMcpConfigUninstall:A=>{e&&g(`Removing MCP ${e.name}...`,async()=>{let M=Hd(e.name,A),F=await qe(M);if(F.exitCode!==0)throw new Error(F.stderr||"MCP removal failed");ve.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";}},lP=/^[a-zA-Z0-9_-]{1,128}$/;async function pm(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 mm(e){if(!lP.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 pm(o,e)}}async function Is(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 pm(t,e)}if(o.length===0)throw new Zt(e);return o[0]}I();var uP=P("tui:bundle-flow");function gm({closeMenu:e,notify:a}){let o=y(n=>n.bundleInstallFlow);return {handleBundleInstallStart:(n,d)=>{let{setLoading:l,setBundleInstallFlow:c}=y.getState(),u=d?.trim();uP.debug(`Starting bundle install: itemName="${n}" flowId="${u??"none"}"`),l(true,"Loading bundle..."),(u?mm(u):Is(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(),ve.getState().loadFromDisk(),a(`\u2713 Installed ${n.installed} of ${n.total} artifacts`,"success");}}}j();U();var $r=["local","project","user"],pP=new Set(["--transport","--scope","-s"]);function fm(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(pP.has(r))t+=2;else if(r.startsWith("-"))t+=1;else return r.replace(/^["']|["']$/g,"")}return null}function ut(e,a){return a?`${e}::${a}`:e}function Qd(e){return e===pe?dr:gt}function hm(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 Vd(e,a){let o=Qd(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 bm(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 vm(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 ym({catalog:e,installedItems:a,activeTab:o,catalogFilters:t,searchQuery:r}){let i=useMemo(()=>new Set(a.map(g=>ut(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=>[ut(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return a.map(h=>{let v=g.get(ut(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(ut(g.name,g.author?.name)))return false;if(g.type==="mcp"){let f=g.installCommand?fm(g.installCommand)?.toLowerCase():null;if(s.has(g.name.toLowerCase())||f&&s.has(f))return false}return true}).map(g=>hm(g)):o==="updates"?n.filter(g=>g.updateAvailable).map(g=>Vd(g,g.catalogItem)):n.map(g=>Vd(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=>[ut(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return h=>h?g.get(ut(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 _d(){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 Qu();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,S(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 km(){return {items:ve(a=>a.installedItems)}}I();var bP=P("catalog");function Dm(){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}=_d(),{items:f}=km(),h=ve(X=>X.loadFromDisk),{items:v,emptyMessage:k,getSelectedCatalogItem:T,outdatedCount:L}=ym({catalog:u,installedItems:f,activeTab:a,catalogFilters:l,searchQuery:c}),{actionMenuOpen:A,closeMenu:M,selectedIndex:F,clampIndex:O,filteredItems:ae}=em({listLength:v.length}),x=ae(v),J=useMemo(()=>a!=="installed"&&a!=="updates"?x:vm(x),[a,x]),ee=useMemo(()=>a==="installed"||a==="updates"?bm(J):[],[a,J]),z=J[F]??null,W=useMemo(()=>T(z),[T,z]),{notify:_}=om(),{handleInstall:E,handleUninstall:B,handleToggleStatus:Q,handleUpdate:Fe,handleBatchUpdate:ii,handleMcpConfigUninstall:uh}=lm({selectedItem:z,selectedCatalogItem:W,items:v,closeMenu:M,clampIndex:O,notify:_}),{handleBundleInstallStart:ph,handleBundleDetailConfirm:mh,handleBundleDetailBack:gh,handleBundleInstallComplete:fh}=gm({closeMenu:M,notify:_}),hh=useCallback(()=>ii(J),[ii,J]);return useEffect(()=>{h();},[]),useEffect(()=>{O(J.length);},[J.length,O]),useEffect(()=>{p&&(bP.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(su,{outdatedCount:L}),a==="marketplaces"&&So()?jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(Kp,{})}):jsx(Du,{filteredItems:J,groups:ee,emptyMessage:k,onBatchUpdate:hh}),(t||m)&&jsxs(Fragment,{children:[jsx(Ki,{message:t?r:"Loading catalog..."}),t&&s>0&&i>0&&jsx(Box,{paddingLeft:2,children:jsx(Yi,{received:i,total:s})})]}),n&&!m&&a==="discover"&&jsx(Zi,{message:n,onRetry:()=>{d(null),g();},onBack:()=>d(null)}),o&&jsx(wu,{message:o.message,type:o.type}),A&&z&&(a==="discover"?W?.type==="bundle"?e?.phase==="installing"?jsx(Op,{bundle:e.bundle,onComplete:fh}):jsx(Sp,{itemName:z.name,bundle:e?.phase==="detail"?e.bundle:void 0,onInstall:()=>ph(z.name,z.flowId),onConfirm:mh,onClose:e?.phase==="detail"?gh:M}):jsx(Dp,{itemName:z.name,itemType:W?.type,onInstall:E,onClose:M}):z.type==="mcp"?jsx(Ip,{itemName:z.name,itemScope:z.scope??"user",onUninstall:uh,onClose:M}):jsx(Ap,{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(Xi,{})]})}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(ve.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 DP=3;function Sm(){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 ss();e(c);}catch(c){o(c instanceof Error?c.message:String(c));}finally{a(false);}},[a,o,e]);useEffect(()=>{ve.getState().loadFromDisk(),n();},[n]);let d=useRef(0),l=useCallback(async()=>{let c=q.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<=DP;f++)try{await je(m.name,{onDownloadProgress:(h,v)=>{let k=Date.now();(k-d.current>100||h>=v)&&(d.current=k,r(m.name,h,v));}}),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),S(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=Ko();Xo("summary_review"),S(w.CLI_STEP_COMPLETED,{step:"tool_installation",duration_ms:u}).catch(()=>{}),ve.getState().loadFromDisk(),s(),i("summary");},[t,r,s,i]);return {loadStarterKits:n,installSelected:l}}var Yr={cursorDelta:0,confirm:false,back:false};function Cm(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 wP={cursorDelta:0,select:false};function Rm(e,a){return a.upArrow?{cursorDelta:-1,select:false}:a.downArrow?{cursorDelta:1,select:false}:a.return?{cursorDelta:0,select:true}:wP}j();var Am=fv.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 ac=5;function xm({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(Ki,{message:"Loading Starter Kits..."});if(r)return jsx(Zi,{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(ac/2)),s=Math.min(a.length,i+ac);s===a.length&&(i=Math.max(0,s-ac));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(Am,{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 Im=fv.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 rc=8;function Tm(){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,S(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(rc/2)),s=Math.min(a.length,i+rc);s===a.length&&(i=Math.max(0,s-rc));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(Im,{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 MP=["Retry failed","Continue anyway"];function Mm({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(Fp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",i]})]}),r!==void 0&&r>0&&t!==void 0&&t>0&&jsx(Box,{paddingLeft:2,children:jsx(Yi,{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 qm({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(Mm,{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(Mm,{name:l.name,status:l.status,error:l.error},l.name))}),i>0&&jsx(Box,{flexDirection:"column",paddingX:1,children:MP.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 Lm(){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),m=q(x=>x.resetForRetry),p=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}=Sm(),A=useRef(false);useEffect(()=>{e==="starterKitList"?(f("starterKitList"),A.current||(A.current=true,Xo("bundle_selection"))):f(e==="starterKitDetail"?"starterKitDetail":"installProgress");},[e,f]);let M=useCallback(async()=>{let x=q.getState().selectedStarterKit;if(x){let ee=await Y();ee&&await yo({...ee,starterKit:x.slug});}S(w.CLI_STEP_COMPLETED,{step:"summary_review",duration_ms:Ko()}).catch(()=>{});let{successCount:J}=q.getState();S(w.CLI_ONBOARDING_COMPLETED,{duration_ms:Po(),tools_installed_count:J}).catch(()=>{}),v(false),f("verify"),g("verify");},[v,f,g]),F=useCallback(()=>{m(),L();},[m,L]),O=useCallback(()=>{T();},[T]),ae=useCallback(()=>{f("verify"),g("verify");},[f,g]);return useInput((x,J)=>{if(J.escape)Mi("esc"),ae();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 ee=Ko();r(a[o]),Xo("kit_display"),S(w.CLI_STEP_COMPLETED,{step:"bundle_selection",duration_ms:ee}).catch(()=>{});}},{isActive:h==="starterKitList"}),useInput((x,J)=>{let ee=Cm(x,J);if(ee.cursorDelta!==0){let z=s+ee.cursorDelta;z>=0&&z<i.length&&n(z);}if(ee.confirm){let z=q.getState().selectedStarterKit;z&&(async()=>(await Y())?.starterKit!==z.slug&&S(w.CLI_KIT_ACCEPTED,{bundle_slug:z.slug}).catch(()=>{}))();let W=Ko();Xo("kit_confirmation"),S(w.CLI_STEP_COMPLETED,{step:"kit_display",duration_ms:W}).catch(()=>{});let _=Ko();Xo("tool_installation"),S(w.CLI_STEP_COMPLETED,{step:"kit_confirmation",duration_ms:_}).catch(()=>{}),d("installing"),L();}if(ee.back){let z=q.getState().selectedStarterKit;z&&S(w.CLI_KIT_REJECTED,{bundle_slug:z.slug}).catch(()=>{}),p();}},{isActive:h==="starterKitDetail"}),useInput((x,J)=>{if(u===0)return;let ee=Rm(x,J);if(ee.cursorDelta!==0){let z=l+ee.cursorDelta;z>=0&&z<=1&&c(z);}ee.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(xm,{onRetry:O}),e==="starterKitDetail"&&jsx(Tm,{}),(e==="installing"||e==="summary")&&jsx(qm,{onComplete:M,onRetry:F})]}),jsx(Xi,{})]})}U();var Nm=null;function Gm(){return Nm}async function Gs(){let a=at().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 Bm(t);(r||i)&&await Pa({...o,installedVersion:r,installMethod:i});}}async function Bm(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=>FP(o)));return Nm=a,a}async function FP(e){let a=Fm(e.versionCommand);a==="permission-denied"&&(OP(e.versionCommand[0]),a=Fm(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 Bm(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 Fm(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 OP(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 BP(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 Jm(e,a){let[o,t]=useState(()=>BP(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 v=g[p];v&&!v.module.required&&d(v.module.alias);}else if(m.tab){let v=g[p];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 Qm({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}=Jm(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=b(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:b(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 JP=/^https?:\/\/.+/;function Vm({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&&JP.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 QP(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 Km(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=QP(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 Ao(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 $m({module:e}){let a=b(e.name);if(e.status==="installing")return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Fp,{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 ag({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}=Km(e,a),c=r.some(v=>v.pendingSetupCommand),u=useRef(false),m=useRef(false);useEffect(()=>{u.current||(u.current=true,i());},[i]);let p=useCallback(()=>{ot().catch(()=>{}),t("list");let v=le().some(k=>k.name===me);o(v?"main":"claudeMdSuggestion");},[t,o]);useEffect(()=>{if(s&&d===0&&!c&&!m.current){m.current=true;let v=setTimeout(p,1500);return ()=>clearTimeout(v)}},[s,d,c,p]),useInput((v,k)=>{k.return&&p();},{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($m,{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 tg(){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(Ul(p)){ot().catch(()=>{}),d("list");let f=le().some(h=>h.name===me);l(f?"main":"claudeMdSuggestion");}else t(p),a("selection");},[d,l]);useEffect(()=>{let p=Gm();if(p){c(p);return}ar(ce).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(Qm,{probeResults:o,onConfirm:u}),e==="customUrl"&&jsx(Vm,{onConfirm:m}),e==="installation"&&jsx(ag,{confirmedItems:r,customUrl:s})]})}U();I();var oD=P("ClaudeMdSuggestion"),tD=[`Install ${me}`,"Skip for now"],rD=["Retry","Skip for now"];function sg(){let e=y(m=>m.setScreen),a=y(m=>m.setFocus),o=q(m=>m.successCount),[t,r]=useState("prompt"),[i,s]=useState(0),n=useRef(0),d=useCallback(()=>{a("list"),e("main");},[a,e]),l=useCallback(()=>{S(w.CLI_CLAUDE_MD_SKIPPED,{interface:"tui"}).catch(()=>{}),d();},[d]),c=useCallback(async()=>{n.current+=1,S(w.CLI_CLAUDE_MD_ACCEPTED,{interface:"tui",attempt:n.current}).catch(()=>{}),r("installing");try{await je(me),r("installed");}catch(m){if(m instanceof Xe){r("installed");return}oD.warn(`Failed to install ${me}: ${m instanceof Error?m.message:m}`),r("error");}},[]),u=t==="error"?rD:tD;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(ig,{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(Fp,{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(ig,{options:u,cursorIndex:i}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]})]})]})}function ig({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 dD=promisify(execFile),Ws="@ciandt-flow/cli";async function ng(){let e=te;if(Jd.prerelease(e)||process.env.NODE_ENV==="development")return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Ws};try{let a=await fetch(`https://registry.npmjs.org/${Ws}/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:Ws}}catch{return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Ws}}}async function Js(e){try{return await dD(Ya(),["install","-g",e.packageName],{timeout:6e4,shell:process.platform==="win32"}),{success:!0}}catch(a){return {success:false,error:String(a)}}}async function cD(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 dg(e){let a=await cD(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 cg(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 lg(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 ug(){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([ng(),ar(ce),Promise.all(ce.map(d=>dg(d)))]);if(Gs(),r.isOutdated){o("cli",{status:"updating",detail:`v${r.currentVersion} \u2192 v${r.latestVersion}`}),(await Js(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 cg(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:lg(l)});}a(d=>({...d,items:d.items.map(l=>l.status==="pending"?{...l,status:"ok"}:l)})),await ot(),a(d=>({...d,outcome:"done"}));}catch{await ot(),a(r=>({...r,outcome:"done"}));}}t();},[o]),e}U();function fD({item:e}){return e.status==="pending"||e.status==="updating"?jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Fp,{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 hD({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 pg(){let{outcome:e,items:a}=ug(),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(fD,{item:r},r.id))}),e!=="running"&&jsx(Box,{marginTop:1,children:jsx(hD,{outcome:e})})]})}Re();xt();I();Dn();var kD={debug:"gray",info:"cyan",warn:"yellow",error:"red"},mg=10;function gg(){let[e,a]=useState(Pn());useEffect(()=>rl(()=>{a([...Pn()]);}),[]);let o=e.slice(-mg);return jsxs(Box,{flexDirection:"column",borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsxs(Text,{color:"cyan",bold:true,children:["Debug Log (last ",mg,") \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:kD[t.level],children:["[",t.level.toUpperCase(),"] [",t.module,"] ",t.message]},r))]})}var SD=P("app"),CD={auth:Yl,starterKitSetup:Lm,moduleSetup:tg,claudeMdSuggestion:sg,verify:pg,main:Dm};function bg(){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 vg(){S(w.CLI_SESSION_STARTED,{cli_version:te,os:process.platform,node_version:process.version,duration_ms:Po(),interface:"tui"}).catch(()=>{});}async function kg(){let e=await Y();if(e&&Bl()&&await ko()){e.customUrl&&La(e.customUrl);let{clientSecret:t,...r}=e;oa.getState().setCredentials(r),vg(),Qi(e);return}if(!e){bg();return}try{e.customUrl&&La(e.customUrl),await Oa();}catch(t){SD.debug(`Token validation failed: ${String(t)}`),bg();return}vg();let{clientSecret:a,...o}=e;oa.getState().setCredentials(o),Qi(e);}function Pg(){let{columns:e,rows:a}=useWindowSize(),o=y(n=>n.screen),t=CD[o],{pendingExit:r}=Il(),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(gg,{}),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();Ii();j();U();I();mr();Re();async function hc(e,a={}){let o=Fi({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant,customUrl:e.customUrl,starterKit:e.starterKit},a);return Oi(o),await yo(e),{jwt:o.jwt,anthropicBaseUrl:o.anthropicBaseUrl,previousToken:o.previousToken,previousBaseUrl:o.previousBaseUrl,hadExistingFile:o.hadExistingFile}}var Ta=P("auth");function wg(){Ve.clearFallbackFile(),Ri();}var RD=3,Dg=3,Sg=` \u2139 The data collected during setup is used solely to improve
121
+ [y/N] `))return Is.debug(`[${e}] Removal cancelled by user`),D("Operation cancelled."),0}let t=a.silent?void 0:Pc({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):(um(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 gm({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:m,update:p}=cm(),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}...`,()=>m(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 p(e.name),r(o.length),i(`\u2713 Updated ${e.name}${A}`,"success");}catch(F){if(F instanceof Eo)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 p(J.name).then(()=>({status:"fulfilled",value:void 0}),ee=>({status:"rejected",reason:ee})));let oe=O.filter(J=>J.status==="fulfilled").length,x=O.map((J,ee)=>J.status==="rejected"?A[ee].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=_d(e.name,A),F=await qe(M);if(F.exitCode!==0)throw new Error(F.stderr||"MCP removal failed");ve.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";}},gP=/^[a-zA-Z0-9_-]{1,128}$/;async function hm(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 bm(e){if(!gP.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 hm(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 hm(t,e)}if(o.length===0)throw new Zt(e);return o[0]}I();var fP=P("tui:bundle-flow");function vm({closeMenu:e,notify:a}){let o=y(n=>n.bundleInstallFlow);return {handleBundleInstallStart:(n,d)=>{let{setLoading:l,setBundleInstallFlow:c}=y.getState(),u=d?.trim();fP.debug(`Starting bundle install: itemName="${n}" flowId="${u??"none"}"`),l(true,"Loading bundle..."),(u?bm(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(),ve.getState().loadFromDisk(),a(`\u2713 Installed ${n.installed} of ${n.total} artifacts`,"success");}}}j();U();var $r=["local","project","user"],hP=new Set(["--transport","--scope","-s"]);function ym(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(hP.has(r))t+=2;else if(r.startsWith("-"))t+=1;else return r.replace(/^["']|["']$/g,"")}return null}function ut(e,a){return a?`${e}::${a}`:e}function Xd(e){return e===pe?dr:gt}function km(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 Kd(e,a){let o=Xd(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 Pm(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 Dm(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 wm({catalog:e,installedItems:a,activeTab:o,catalogFilters:t,searchQuery:r}){let i=useMemo(()=>new Set(a.map(g=>ut(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=>[ut(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return a.map(h=>{let v=g.get(ut(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(ut(g.name,g.author?.name)))return false;if(g.type==="mcp"){let f=g.installCommand?ym(g.installCommand)?.toLowerCase():null;if(s.has(g.name.toLowerCase())||f&&s.has(f))return false}return true}).map(g=>km(g)):o==="updates"?n.filter(g=>g.updateAvailable).map(g=>Kd(g,g.catalogItem)):n.map(g=>Kd(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=>[ut(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return h=>h?g.get(ut(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 $d(){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 Ku();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,S(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 Sm(){return {items:ve(a=>a.installedItems)}}I();var PP=P("catalog");function Rm(){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}=$d(),{items:f}=Sm(),h=ve(X=>X.loadFromDisk),{items:v,emptyMessage:k,getSelectedCatalogItem:T,outdatedCount:L}=wm({catalog:u,installedItems:f,activeTab:a,catalogFilters:l,searchQuery:c}),{actionMenuOpen:A,closeMenu:M,selectedIndex:F,clampIndex:O,filteredItems:oe}=rm({listLength:v.length}),x=oe(v),J=useMemo(()=>a!=="installed"&&a!=="updates"?x:Dm(x),[a,x]),ee=useMemo(()=>a==="installed"||a==="updates"?Pm(J):[],[a,J]),z=J[F]??null,W=useMemo(()=>T(z),[T,z]),{notify:_}=sm(),{handleInstall:E,handleUninstall:B,handleToggleStatus:Q,handleUpdate:Fe,handleBatchUpdate:si,handleMcpConfigUninstall:fh}=gm({selectedItem:z,selectedCatalogItem:W,items:v,closeMenu:M,clampIndex:O,notify:_}),{handleBundleInstallStart:hh,handleBundleDetailConfirm:bh,handleBundleDetailBack:vh,handleBundleInstallComplete:yh}=vm({closeMenu:M,notify:_}),kh=useCallback(()=>si(J),[si,J]);return useEffect(()=>{h();},[]),useEffect(()=>{O(J.length);},[J.length,O]),useEffect(()=>{p&&(PP.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(lu,{outdatedCount:L}),a==="marketplaces"&&So()?jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(em,{})}):jsx(Ru,{filteredItems:J,groups:ee,emptyMessage:k,onBatchUpdate:kh}),(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(Au,{message:o.message,type:o.type}),A&&z&&(a==="discover"?W?.type==="bundle"?e?.phase==="installing"?jsx(jp,{bundle:e.bundle,onComplete:yh}):jsx(xp,{itemName:z.name,bundle:e?.phase==="detail"?e.bundle:void 0,onInstall:()=>hh(z.name,z.flowId),onConfirm:bh,onClose:e?.phase==="detail"?vh:M}):jsx(Rp,{itemName:z.name,itemType:W?.type,onInstall:E,onClose:M}):z.type==="mcp"?jsx(Lp,{itemName:z.name,itemScope:z.scope??"user",onUninstall:fh,onClose:M}):jsx(Tp,{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(ve.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 RP=3;function xm(){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(()=>{ve.getState().loadFromDisk(),n();},[n]);let d=useRef(0),l=useCallback(async()=>{let c=q.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<=RP;f++)try{await je(m.name,{onDownloadProgress:(h,v)=>{let k=Date.now();(k-d.current>100||h>=v)&&(d.current=k,r(m.name,h,v));}}),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),S(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=Ko();Xo("summary_review"),S(w.CLI_STEP_COMPLETED,{step:"tool_installation",duration_ms:u}).catch(()=>{}),ve.getState().loadFromDisk(),s(),i("summary");},[t,r,s,i]);return {loadStarterKits:n,installSelected:l}}var Yr={cursorDelta:0,confirm:false,back:false};function Em(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 AP={cursorDelta:0,select:false};function Im(e,a){return a.upArrow?{cursorDelta:-1,select:false}:a.downArrow?{cursorDelta:1,select:false}:a.return?{cursorDelta:0,select:true}:AP}j();var Tm=yv.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 rc=5;function Mm({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(rc/2)),s=Math.min(a.length,i+rc);s===a.length&&(i=Math.max(0,s-rc));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(Tm,{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 Lm=yv.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 nc=8;function Fm(){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,S(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(nc/2)),s=Math.min(a.length,i+nc);s===a.length&&(i=Math.max(0,s-nc));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(Lm,{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 OP=["Retry failed","Continue anyway"];function Om({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(Bp,{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 Nm({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(Om,{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(Om,{name:l.name,status:l.status,error:l.error},l.name))}),i>0&&jsx(Box,{flexDirection:"column",paddingX:1,children:OP.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 Gm(){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),m=q(x=>x.resetForRetry),p=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}=xm(),A=useRef(false);useEffect(()=>{e==="starterKitList"?(f("starterKitList"),A.current||(A.current=true,Xo("bundle_selection"))):f(e==="starterKitDetail"?"starterKitDetail":"installProgress");},[e,f]);let M=useCallback(async()=>{let x=q.getState().selectedStarterKit;if(x){let ee=await Y();ee&&await yo({...ee,starterKit:x.slug});}S(w.CLI_STEP_COMPLETED,{step:"summary_review",duration_ms:Ko()}).catch(()=>{});let{successCount:J}=q.getState();S(w.CLI_ONBOARDING_COMPLETED,{duration_ms:Po(),tools_installed_count:J}).catch(()=>{}),v(false),f("verify"),g("verify");},[v,f,g]),F=useCallback(()=>{m(),L();},[m,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 ee=Ko();r(a[o]),Xo("kit_display"),S(w.CLI_STEP_COMPLETED,{step:"bundle_selection",duration_ms:ee}).catch(()=>{});}},{isActive:h==="starterKitList"}),useInput((x,J)=>{let ee=Em(x,J);if(ee.cursorDelta!==0){let z=s+ee.cursorDelta;z>=0&&z<i.length&&n(z);}if(ee.confirm){let z=q.getState().selectedStarterKit;z&&(async()=>(await Y())?.starterKit!==z.slug&&S(w.CLI_KIT_ACCEPTED,{bundle_slug:z.slug}).catch(()=>{}))();let W=Ko();Xo("kit_confirmation"),S(w.CLI_STEP_COMPLETED,{step:"kit_display",duration_ms:W}).catch(()=>{});let _=Ko();Xo("tool_installation"),S(w.CLI_STEP_COMPLETED,{step:"kit_confirmation",duration_ms:_}).catch(()=>{}),d("installing"),L();}if(ee.back){let z=q.getState().selectedStarterKit;z&&S(w.CLI_KIT_REJECTED,{bundle_slug:z.slug}).catch(()=>{}),p();}},{isActive:h==="starterKitDetail"}),useInput((x,J)=>{if(u===0)return;let ee=Im(x,J);if(ee.cursorDelta!==0){let z=l+ee.cursorDelta;z>=0&&z<=1&&c(z);}ee.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(Mm,{onRetry:O}),e==="starterKitDetail"&&jsx(Fm,{}),(e==="installing"||e==="summary")&&jsx(Nm,{onComplete:M,onRetry:F})]}),jsx(Ki,{})]})}U();var Um=null;function zm(){return Um}async function Bs(){let a=at().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 Wm(t);(r||i)&&await Pa({...o,installedVersion:r,installMethod:i});}}async function Wm(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=>BP(o)));return Um=a,a}async function BP(e){let a=Bm(e.versionCommand);a==="permission-denied"&&(jP(e.versionCommand[0]),a=Bm(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 Wm(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 Bm(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 WP(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 _m(e,a){let[o,t]=useState(()=>WP(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 v=g[p];v&&!v.module.required&&d(v.module.alias);}else if(m.tab){let v=g[p];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 Km({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}=_m(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=b(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:b(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 _P=/^https?:\/\/.+/;function $m({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&&_P.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 KP(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 eg(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=KP(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 Ao(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 ag({module:e}){let a=b(e.name);if(e.status==="installing")return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Bp,{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 ig({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}=eg(e,a),c=r.some(v=>v.pendingSetupCommand),u=useRef(false),m=useRef(false);useEffect(()=>{u.current||(u.current=true,i());},[i]);let p=useCallback(()=>{ot().catch(()=>{}),t("list");let v=le().some(k=>k.name===me);o(v?"main":"claudeMdSuggestion");},[t,o]);useEffect(()=>{if(s&&d===0&&!c&&!m.current){m.current=true;let v=setTimeout(p,1500);return ()=>clearTimeout(v)}},[s,d,c,p]),useInput((v,k)=>{k.return&&p();},{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(ag,{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 ng(){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(Hl(p)){ot().catch(()=>{}),d("list");let f=le().some(h=>h.name===me);l(f?"main":"claudeMdSuggestion");}else t(p),a("selection");},[d,l]);useEffect(()=>{let p=zm();if(p){c(p);return}ar(ce).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(Km,{probeResults:o,onConfirm:u}),e==="customUrl"&&jsx($m,{onConfirm:m}),e==="installation"&&jsx(ig,{confirmedItems:r,customUrl:s})]})}U();I();var sD=P("ClaudeMdSuggestion"),nD=[`Install ${me}`,"Skip for now"],dD=["Retry","Skip for now"];function lg(){let e=y(m=>m.setScreen),a=y(m=>m.setFocus),o=q(m=>m.successCount),[t,r]=useState("prompt"),[i,s]=useState(0),n=useRef(0),d=useCallback(()=>{a("list"),e("main");},[a,e]),l=useCallback(()=>{S(w.CLI_CLAUDE_MD_SKIPPED,{interface:"tui"}).catch(()=>{}),d();},[d]),c=useCallback(async()=>{n.current+=1,S(w.CLI_CLAUDE_MD_ACCEPTED,{interface:"tui",attempt:n.current}).catch(()=>{}),r("installing");try{await je(me),r("installed");}catch(m){if(m instanceof Xe){r("installed");return}sD.warn(`Failed to install ${me}: ${m instanceof Error?m.message:m}`),r("error");}},[]),u=t==="error"?dD:nD;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(cg,{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(Bp,{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(cg,{options:u,cursorIndex:i}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]})]})]})}function cg({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 pD=promisify(execFile),Js="@ciandt-flow/cli";async function ug(){let e=re;if(Vd.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 pD(Ya(),["install","-g",e.packageName],{timeout:6e4,shell:process.platform==="win32"}),{success:!0}}catch(a){return {success:false,error:String(a)}}}async function mD(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 pg(e){let a=await mD(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 mg(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 gg(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 fg(){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([ug(),ar(ce),Promise.all(ce.map(d=>pg(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 mg(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:gg(l)});}a(d=>({...d,items:d.items.map(l=>l.status==="pending"?{...l,status:"ok"}:l)})),await ot(),a(d=>({...d,outcome:"done"}));}catch{await ot(),a(r=>({...r,outcome:"done"}));}}t();},[o]),e}U();function yD({item:e}){return e.status==="pending"||e.status==="updating"?jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Bp,{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 kD({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 hg(){let{outcome:e,items:a}=fg(),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(yD,{item:r},r.id))}),e!=="running"&&jsx(Box,{marginTop:1,children:jsx(kD,{outcome:e})})]})}Re();xt();I();Cn();var SD={debug:"gray",info:"cyan",warn:"yellow",error:"red"},bg=10;function vg(){let[e,a]=useState(Sn());useEffect(()=>dl(()=>{a([...Sn()]);}),[]);let o=e.slice(-bg);return jsxs(Box,{flexDirection:"column",borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsxs(Text,{color:"cyan",bold:true,children:["Debug Log (last ",bg,") \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:SD[t.level],children:["[",t.level.toUpperCase(),"] [",t.module,"] ",t.message]},r))]})}var xD=P("app"),ED={auth:ou,starterKitSetup:Gm,moduleSetup:ng,claudeMdSuggestion:lg,verify:hg,main:Rm};function Pg(){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 Dg(){S(w.CLI_SESSION_STARTED,{cli_version:re,os:process.platform,node_version:process.version,duration_ms:Po(),interface:"tui"}).catch(()=>{});}async function Sg(){let e=await Y();if(e&&Wl()&&await ko()){e.customUrl&&La(e.customUrl);let{clientSecret:t,...r}=e;oa.getState().setCredentials(r),Dg(),Vi(e);return}if(!e){Pg();return}try{e.customUrl&&La(e.customUrl),await Oa();}catch(t){xD.debug(`Token validation failed: ${String(t)}`),Pg();return}Dg();let{clientSecret:a,...o}=e;oa.getState().setCredentials(o),Vi(e);}function Cg(){let{columns:e,rows:a}=useWindowSize(),o=y(n=>n.screen),t=ED[o],{pendingExit:r}=Ll(),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(vg,{}),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 yc(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 yo(e),{jwt:o.jwt,anthropicBaseUrl:o.anthropicBaseUrl,previousToken:o.previousToken,previousBaseUrl:o.previousBaseUrl,hadExistingFile:o.hadExistingFile}}var Ta=P("auth");function Ag(){Ve.clearFallbackFile(),Ai();}var ID=3,Rg=3,xg=` \u2139 The data collected during setup is used solely to improve
122
122
  Flow's internal tools and will not be shared externally.
123
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===`
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 AD(){let e=Zo();return 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 TD(){let e=Zo();return process.stdout.write(`
126
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 Cg(e,a,o){try{await hc(e,{jwtOverride:o});return}catch(t){if(!(t instanceof et))throw t;if(!a)throw new Error(`${t.message}. Fix or remove ${Zo()} and retry.`);if(!await AD())throw new Error("Setup cancelled: settings.json must be valid JSON to continue");await hc(e,{allowOverwriteMalformed:true,jwtOverride:o});}}async function xD(){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 ED(){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 Rg(e,a){process.stdout.write(R.dim(" Installing flow-ai-obs..."));let{npmFailed:o,initFailed:t,unexpectedError:r}=await Hi(e,a);return o?process.stdout.write(R.yellow(` \u26A0 npm install failed. Please contact Flow support.
127
+ `),(await _a(R.cyan(" ? ")+"Overwrite it with a fresh file containing only the auth token? (y/N): ")).trim().toLowerCase()==="y"}async function Eg(e,a,o){try{await yc(e,{jwtOverride:o});return}catch(t){if(!(t instanceof et))throw t;if(!a)throw new Error(`${t.message}. Fix or remove ${Zo()} and retry.`);if(!await TD())throw new Error("Setup cancelled: settings.json must be valid JSON to continue");await yc(e,{allowOverwriteMalformed:true,jwtOverride:o});}}async function MD(){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 qD(){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 Ig(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.
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 Ag(){for(let e=1;e<=Dg;e++)try{return await ss()}catch{if(e===Dg)throw new Error("Failed to fetch starter kits after 3 attempts")}return []}async function xg(){let e=await Ag();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 Tg(){for(let e=1;e<=Rg;e++)try{return await ns()}catch{if(e===Rg)throw new Error("Failed to fetch starter kits after 3 attempts")}return []}async function Mg(){let e=await Tg();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(`
135
135
  `+R.cyan(" ? ")+`Starter Kit:
136
136
  `),e.forEach((o,t)=>{process.stdout.write(` ${R.cyan(`${t+1})`)} ${b(o.name)}
137
137
  `);}),process.stdout.write(`
138
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.
139
- `));}}async function Eg(e){if(e.plugins.length===0)return process.stdout.write(R.dim(`
139
+ `));}}async function qg(e){if(e.plugins.length===0)return process.stdout.write(R.dim(`
140
140
  Starter kit '${b(e.name)}' has no plugins to install.
141
141
  `)),true;process.stdout.write(`
142
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<=RD;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
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<=ID;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
145
  `)));}return o===0?process.stdout.write(R.green(` \u2713 Starter kit '${b(e.name)}' selected. ${a}/${t} plugins installed successfully.
146
146
  `)):process.stdout.write(R.yellow(` \u26A0 Starter kit '${b(e.name)}' selected. ${a}/${t} plugins installed. ${o} failed.
147
- `)),o===0}async function Ig(){process.stdout.write(`
147
+ `)),o===0}async function Lg(){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
 
@@ -158,112 +158,112 @@ This will run: ${i}
158
158
  `),process.stdout.write(` Open Claude in a new terminal or in VS Code and type:
159
159
  `),process.stdout.write(R.cyan.bold(` /${me}
160
160
  `)),process.stdout.write(` Claude will guide you through the rest.
161
- `);}async function ID(e){if(wg(),process.stdout.write(`
162
- `+Sg+`
161
+ `);}async function LD(e){if(Ag(),process.stdout.write(`
162
+ `+xg+`
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
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
166
  `)),1}e.customUrl&&La(e.customUrl),Ta.debug(`[${o.tenant}] Authenticating tenant via JWT`);try{await _o(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 Rg(e.customUrl??null,e.customEmail??null);try{let r;if(e.starterKit){let i=await Ag(),s=i.find(n=>n.slug===e.starterKit);if(!s){process.stderr.write(R.red(` \u2717 Starter kit '${b(e.starterKit)}' not found.
167
+ `)),1}let{initFailed:t}=await Ig(e.customUrl??null,e.customEmail??null);try{let r;if(e.starterKit){let i=await Tg(),s=i.find(n=>n.slug===e.starterKit);if(!s){process.stderr.write(R.red(` \u2717 Starter kit '${b(e.starterKit)}' not found.
168
168
  `)),process.stderr.write(` Available starter kits:
169
169
  `);for(let n of i)process.stderr.write(` - ${b(n.slug)} (${b(n.name)})
170
- `);return 1}r=s;}else r=await xg();return await Cg({...o,starterKit:r?.slug,customUrl:e.customUrl},!1,a),r?await Eg(r):process.stdout.write(R.dim(`
170
+ `);return 1}r=s;}else r=await Mg();return await Eg({...o,starterKit:r?.slug,customUrl:e.customUrl},!1,a),r?await qg(r):process.stdout.write(R.dim(`
171
171
  Skipped starter kit installation.
172
- `)),await Ig(),Ta.info(`[${o.tenant}] Authentication successful`),process.stdout.write(R.green(`
172
+ `)),await Lg(),Ta.info(`[${o.tenant}] Authentication successful`),process.stdout.write(R.green(`
173
173
  \u2713 Setup complete. Tenant: ${b(o.tenant)}. JWT written to ${Zo()}.
174
174
 
175
175
  `)),t&&process.stdout.write(R.yellow(` \u26A0 flow-ai-obs initialization failed \u2014 domain authentication failure. Please contact support.
176
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 TD(e,a){wg(),Ta.debug("[auth] Starting interactive authentication");try{process.stdout.write(`
178
- `),process.stdout.write(Sg+`
177
+ `)),1}}async function FD(e,a){Ag(),Ta.debug("[auth] Starting interactive authentication");try{process.stdout.write(`
178
+ `),process.stdout.write(xg+`
179
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
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 xD(),i=a??await ED();r&&La(r),Ta.debug(`[${t.tenant}] Authenticating tenant`);try{await _o(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}
182
- `)),1}let{initFailed:s}=await Rg(r,i),n=await xg();return await Cg({...t,starterKit:n?.slug,customUrl:r??void 0},!0,o),n?await Eg(n):process.stdout.write(R.dim(`
181
+ `)),1}let r=e??await MD(),i=a??await qD();r&&La(r),Ta.debug(`[${t.tenant}] Authenticating tenant`);try{await _o(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}
182
+ `)),1}let{initFailed:s}=await Ig(r,i),n=await Mg();return await Eg({...t,starterKit:n?.slug,customUrl:r??void 0},!0,o),n?await qg(n):process.stdout.write(R.dim(`
183
183
  Skipped starter kit installation.
184
- `)),await Ig(),Ta.info(`[${t.tenant}] Authentication successful`),process.stdout.write(R.green(`
184
+ `)),await Lg(),Ta.info(`[${t.tenant}] Authentication successful`),process.stdout.write(R.green(`
185
185
  \u2713 Setup complete. Tenant: ${b(t.tenant)}. JWT written to ${Zo()}.
186
186
 
187
187
  `)),s&&process.stdout.write(R.yellow(` \u26A0 flow-ai-obs initialization failed \u2014 domain authentication failure. Please contact support.
188
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 bc(e={}){if(e.jwt)return ID({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}.
189
+ `)),1}}async function kc(e={}){if(e.jwt)return LD({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 TD(e.customUrl,e.customEmail)}catch(a){if(a instanceof Error&&a.message==="SIGINT")return process.stdout.write(`
192
- `),130;throw a}}async function MD(){try{return process.stdout.write(`
191
+ `)),1;try{return await FD(e.customUrl,e.customEmail)}catch(a){if(a instanceof Error&&a.message==="SIGINT")return process.stdout.write(`
192
+ `),130;throw a}}async function OD(){try{return process.stdout.write(`
193
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
194
194
  `)),0):null}catch(e){if(e instanceof Error&&e.message==="SIGINT")return process.stdout.write(`
195
- `),130;throw e}}async function Tg(e){if(!await Y())return process.stdout.write(R.yellow(` \u26A0 You are not authenticated
196
- `)),0;if(!e){let a=await MD();if(a!==null)return a}try{return await hl(),process.stdout.write(R.green(` \u2713 Credentials removed successfully
195
+ `),130;throw e}}async function Fg(e){if(!await Y())return process.stdout.write(R.yellow(` \u26A0 You are not authenticated
196
+ `)),0;if(!e){let a=await OD();if(a!==null)return a}try{return await kl(),process.stdout.write(R.green(` \u2713 Credentials removed successfully
197
197
  `)),0}catch{return process.stderr.write(R.red(` \u2717 Error removing credentials
198
- `)),1}}async function Mg(){let e=await Y();return e?await ko()?(process.stdout.write(`
198
+ `)),1}}async function Og(){let e=await Y();return e?await ko()?(process.stdout.write(`
199
199
  `+R.bold(` Authenticated
200
200
  `)),process.stdout.write(R.dim(" Tenant: ")+b(e.tenant)+`
201
201
  `),process.stdout.write(R.dim(" Client ID: ")+b(e.clientId)+`
202
202
  `),process.stdout.write(R.dim(" Starter Kit: ")+b(e.starterKit??"not set")+`
203
- `),process.stdout.write(R.dim(" Config: ")+b(await bl())+`
203
+ `),process.stdout.write(R.dim(" Config: ")+b(await Pl())+`
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 LD=[pe,"flow-harness"];function qg(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function FD(e,a,o=process.env){return qg(o.DISABLE_AUTOUPDATER)?{name:e,enabled:false,reason:"env-disabled"}:qg(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 Lg(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=Wo();if(!se__default.existsSync(a))return [];try{let o=JSON.parse(se__default.readFileSync(a,"utf-8"));return Object.entries(o).map(([t,r])=>FD(t,r,e))}catch{return []}}function Fg(){let e=Wo(),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 LD){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 OD(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 S(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"available",result_count:o.length}).catch(()=>{}),e.json?(ho(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 ND(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 S(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"outdated",result_count:r.length}).catch(()=>{}),e.json?(ho(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 GD=[pe,"flow-harness"];function Ng(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function BD(e,a,o=process.env){return Ng(o.DISABLE_AUTOUPDATER)?{name:e,enabled:false,reason:"env-disabled"}:Ng(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 Gg(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=Wo();if(!se__default.existsSync(a))return [];try{let o=JSON.parse(se__default.readFileSync(a,"utf-8"));return Object.entries(o).map(([t,r])=>BD(t,r,e))}catch{return []}}function Bg(){let e=Wo(),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 GD){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 S(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"available",result_count:o.length}).catch(()=>{}),e.json?(ho(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 UD(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 S(w.CLI_CATALOG_VIEWED,{interface:Z().interfaceType,filter_type:"outdated",result_count:r.length}).catch(()=>{}),e.json?(ho(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(`
206
206
  ${r.length} plugin(s) outdated.
207
- `),0)}async function GD(e){let a=le();if(S(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 ho(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",ft[d]?.label??"Plugin",l,s.scope??"user",s.status??"enabled",u,qa(s.installedAt??"")]})),process.stdout.write(`
207
+ `),0)}async function zD(e){let a=le();if(S(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 ho(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??Xd(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",ft[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 Og(e){if(!await he())return 1;try{return e.available?await OD(e):e.outdated?await ND(e):await GD(e)}catch(a){return C(a instanceof Error?a.message:"Failed to list plugins."),1}}Io();j();U();I();var be=P("manage");function Vs(e,a){return a?le().find(o=>o.name===e&&o.scope===a):le().find(o=>o.name===e)}function BD(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=vc({text:`${e}${r}`}).start();}},stopSpinner:()=>{o?.stop(),o=void 0;}}}async function jD(e,a,o,t){let r=t;if(!o.force){r?.stop();let s=b(e),n=b(jt(e,o.scope));if(!await ie(`${a}Install external plugin "${s}"?
209
+ `),0}async function jg(e){if(!await he())return 1;try{return e.available?await jD(e):e.outdated?await UD(e):await zD(e)}catch(a){return C(a instanceof Error?a.message:"Failed to list plugins."),1}}Io();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 WD(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=Pc({text:`${e}${r}`}).start();}},stopSpinner:()=>{o?.stop(),o=void 0;}}}async function JD(e,a,o,t){let r=t;if(!o.force){r?.stop();let s=b(e),n=b(jt(e,o.scope));if(!await ae(`${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=vc({text:`${a}Installing ${e}...`}).start());}let i=r?BD(a,r):void 0;try{let s=await tm(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}):C(`${a}Failed to install "${e}": ${n}`),{name:e,success:!1,error:n}}return o.silent?Pe({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}):C(`${a}Failed to install "${e}": ${n}`),{name:e,success:false,error:n}}}async function UD(e,a,o){let t=o.silent?void 0:vc({text:`${a}Installing ${e}...`}).start();if(Gt(e))return jD(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}=$i(i,s);t.text=`${a}Downloading ${e}... ${n} ${d}% (${l})`;}});return t?.stop(),o.silent?Pe({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?Pe({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}):C(`${a}Failed to install "${e}": ${i}`),{name:e,success:false,error:i}}}function zD(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 WD(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 WD(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 UD(s,i,{...a,source:n});o.push(d);}return e.length>1&&(a.silent?Pe({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}:{}}))}):zD(o)),o.some(r=>!r.success)?1:0}async function _s(e,a){if(!await he())return 1;if(be.debug(`[${e}] Looking up installed plugin`),!a.force){let o=Vs(e,a.scope);if(!o)return be.error(`[${e}] Plugin is not installed`),C(`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 ie(`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)}`),C($(o)),1}}async function Ng(e,a={}){if(!await he())return 1;be.debug(`[${e}] Looking up installed plugin`);let o=Vs(e,a.scope);if(!o)return be.error(`[${e}] Plugin is not installed`),C(`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)}`),C($(t)),1}}async function Gg(e,a={}){if(!await he())return 1;be.debug(`[${e}] Looking up installed plugin`);let o=Vs(e,a.scope);if(!o)return be.error(`[${e}] Plugin is not installed`),C(`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)}`),C($(t)),1}}async function Bg(e,a,o){o.silent||D(`${a}Updating ${e}...`);try{let t=await Rs(e,o);return o.silent?Pe({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 Eo)return o.silent?Pe({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}):C(`${a}Failed to update ${e}: ${r}`),{name:e,success:false,error:r}}}function JD(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 HD(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 C($(t)),1}return 0}function QD(e){return new Map(e.filter(a=>!!a.version).map(a=>[a.name,a.version]))}function VD(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 _D(e,a){try{let o=await oo(a.source),t=QD(o),r=0;for(let i of e)VD(i,t,a.force)&&r++;r===0&&D("All plugins are up to date");}catch(o){return C($(o)),1}return 0}async function XD(e,a){let o=[];for(let t=0;t<e.length;t++){let r=`[${t+1}/${e.length}] `,i=await Bg(e[t].name,r,a);o.push(i);}return a.silent?Pe({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}:{}}))}):JD(o),o.some(t=>!t.success)?1:0}async function jg(e,a={}){if(!await he())return 1;if(e){let r=Vs(e,a.scope);return r?a.dryRun?HD(e,r.version??"",a):(await Bg(e,"",a)).success?0:1:(a.silent?Ne({status:"error",plugin:e,message:`Plugin "${e}" is not installed`}):C(`Plugin "${e}" is not installed`),1)}let t=le().filter(r=>r.marketplace===pe);return t.length===0?(a.silent?Pe({status:"empty",message:"No plugins installed"}):D("No plugins installed"),0):a.dryRun?_D(t,a):XD(t,a)}j();I();var oi=P("cli:bundle");function KD(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 $D(e,a){let o=a.filter(r=>r.available).length,t=a.length-o;process.stdout.write(`
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=Pc({text:`${a}Installing ${e}...`}).start());}let i=r?WD(a,r):void 0;try{let s=await nm(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}):C(`${a}Failed to install "${e}": ${n}`),{name:e,success:!1,error:n}}return o.silent?Pe({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}):C(`${a}Failed to install "${e}": ${n}`),{name:e,success:false,error:n}}}async function HD(e,a,o){let t=o.silent?void 0:Pc({text:`${a}Installing ${e}...`}).start();if(Gt(e))return JD(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?Pe({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?Pe({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}):C(`${a}Failed to install "${e}": ${i}`),{name:e,success:false,error:i}}}function QD(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 VD(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 VD(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 HD(s,i,{...a,source:n});o.push(d);}return e.length>1&&(a.silent?Pe({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}:{}}))}):QD(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`),C(`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 ae(`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)}`),C($(o)),1}}async function Ug(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`),C(`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)}`),C($(t)),1}}async function zg(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`),C(`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)}`),C($(t)),1}}async function Wg(e,a,o){o.silent||D(`${a}Updating ${e}...`);try{let t=await As(e,o);return o.silent?Pe({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 Eo)return o.silent?Pe({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}):C(`${a}Failed to update ${e}: ${r}`),{name:e,success:false,error:r}}}function _D(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 XD(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 C($(t)),1}return 0}function KD(e){return new Map(e.filter(a=>!!a.version).map(a=>[a.name,a.version]))}function $D(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 YD(e,a){try{let o=await oo(a.source),t=KD(o),r=0;for(let i of e)$D(i,t,a.force)&&r++;r===0&&D("All plugins are up to date");}catch(o){return C($(o)),1}return 0}async function ZD(e,a){let o=[];for(let t=0;t<e.length;t++){let r=`[${t+1}/${e.length}] `,i=await Wg(e[t].name,r,a);o.push(i);}return a.silent?Pe({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}:{}}))}):_D(o),o.some(t=>!t.success)?1:0}async function Jg(e,a={}){if(!await he())return 1;if(e){let r=_s(e,a.scope);return r?a.dryRun?XD(e,r.version??"",a):(await Wg(e,"",a)).success?0:1:(a.silent?Ne({status:"error",plugin:e,message:`Plugin "${e}" is not installed`}):C(`Plugin "${e}" is not installed`),1)}let t=le().filter(r=>r.marketplace===pe);return t.length===0?(a.silent?Pe({status:"empty",message:"No plugins installed"}):D("No plugins installed"),0):a.dryRun?YD(t,a):ZD(t,a)}j();I();var oi=P("cli:bundle");function ew(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 aw(e,a){let o=a.filter(r=>r.available).length,t=a.length-o;process.stdout.write(`
214
214
  Bundle: ${b(e)} (${a.length} artifacts)
215
- `);for(let r of a)process.stdout.write(`${KD(r)}
215
+ `);for(let r of a)process.stdout.write(`${ew(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 Ug(e){if(!e.trim())return C("Bundle name cannot be empty."),1;if(!await he())return 1;oi.debug(`Fetching bundle "${e}"`);let o;try{o=await Is(e);}catch(n){return n instanceof Zt||n instanceof Kr?(C(n.message),1):(C(`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`),$D(o.title,t),r.length===0)return C("No artifacts available for installation in this bundle."),1;if(!await ie(`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 Ds(o,{onProgress:({index:n,total:d,artifact:l,success:c,error:u})=>{let m=b(l.name??l.flowId),p=b(l.type??"unknown"),g=c?"\u2713":`\u2717 (${b(u??"failed")})`;n===1&&process.stdout.write(`
219
+ `);}async function Hg(e){if(!e.trim())return C("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?(C(n.message),1):(C(`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`),aw(o.title,t),r.length===0)return C("No artifacts available for installation in this bundle."),1;if(!await ae(`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=b(l.name??l.flowId),p=b(l.type??"unknown"),g=c?"\u2713":`\u2717 (${b(u??"failed")})`;n===1&&process.stdout.write(`
220
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(", ");C(`${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}Io();j();I();var zg=P("marketplace");function ZD(e){return `claude plugin marketplace add ${e}`}async function Wg(e,a){if(!await he())return 1;let o;try{o=is(e);}catch(i){let s=$(i);return a.silent?Ne({status:"error",source:e,message:s}):C(s),1}zg.debug(`[marketplace] Adding marketplace source: ${o}`);let t=ZD(o);if(!a.force){let i=b(o),s=b(t);if(!await ie(`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(", ");C(`${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}Io();j();I();var Qg=P("marketplace");function tw(e){return `claude plugin marketplace add ${e}`}async function Vg(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}):C(s),1}Qg.debug(`[marketplace] Adding marketplace source: ${o}`);let t=tw(o);if(!a.force){let i=b(o),s=b(t);if(!await ae(`Add marketplace "${i}"?
223
223
  This will run: ${s}
224
- [y/N] `))return zg.debug("[marketplace] Operation cancelled by user"),D("Operation cancelled."),0}let r=a.silent?void 0:vc({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"}):(C(`Failed to add marketplace "${o}": ${i.stderr||"Command failed"}`),a.verbose&&i.stdout&&D(`stdout: ${i.stdout}`)),1):(a.silent?Pe({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}):C(`Failed to add marketplace "${o}": ${s}`),1}}Re();j();async function tw(){return await Y()?{passed:true,message:"Credentials configured"}:{passed:false,message:"Credentials not configured \u2014 Run `flow auth login`"}}async function rw(){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 iw(){return await ko()?{passed:true,message:"Token is valid"}:{passed:false,message:"Token expired \u2014 run `flow auth login` to re-authenticate"}}function sw(){let e=join(homedir(),".claude","settings.json");return existsSync(e)?{passed:true,message:"Claude Code detected"}:{passed:false,message:"Claude Code not detected"}}function nw(){let e=Qs();if(e.length!==0){process.stdout.write(`
224
+ [y/N] `))return Qg.debug("[marketplace] Operation cancelled by user"),D("Operation cancelled."),0}let r=a.silent?void 0:Pc({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"}):(C(`Failed to add marketplace "${o}": ${i.stderr||"Command failed"}`),a.verbose&&i.stdout&&D(`stdout: ${i.stdout}`)),1):(a.silent?Pe({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}):C(`Failed to add marketplace "${o}": ${s}`),1}}Re();j();async function nw(){return await Y()?{passed:true,message:"Credentials configured"}:{passed:false,message:"Credentials not configured \u2014 Run `flow auth login`"}}async function dw(){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 cw(){return await ko()?{passed:true,message:"Token is valid"}:{passed:false,message:"Token expired \u2014 run `flow auth login` to re-authenticate"}}function lw(){let e=join(homedir(),".claude","settings.json");return existsSync(e)?{passed:true,message:"Claude Code detected"}:{passed:false,message:"Claude Code not detected"}}function uw(){let e=Vs();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(Lg(a));process.stdout.write(` ${o} ${t} ${R.dim(r)}
228
- `);}}}function dw(){process.stdout.write(`
227
+ `));for(let a of e){let o=a.enabled?R.green("[ON] "):R.dim("[OFF]"),t=b(a.name).padEnd(20),r=b(Gg(a));process.stdout.write(` ${o} ${t} ${R.dim(r)}
228
+ `);}}}function pw(){process.stdout.write(`
229
229
  `+R.bold(` FlowSetup CLI \u2014 Auto-Update Fix
230
230
 
231
- `));let e=Fg();for(let a of e.fixed)process.stdout.write(` ${R.green("[FIXED]")} ${b(a)} \u2014 autoUpdate: true set
231
+ `));let e=Bg();for(let a of e.fixed)process.stdout.write(` ${R.green("[FIXED]")} ${b(a)} \u2014 autoUpdate: true set
232
232
  `);for(let{name:a,reason:o}of e.skipped)process.stdout.write(` ${R.dim("[SKIP] ")} ${b(a)} \u2014 ${b(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 Jg(e={}){if(e.fix)return dw();process.stdout.write(`
238
+ `)),0}async function _g(e={}){if(e.fix)return pw();process.stdout.write(`
239
239
  `+R.bold(` FlowSetup CLI Diagnostics
240
240
 
241
- `));let a=[{name:"Credentials",fn:tw},{name:"Prompt Manager",fn:rw},{name:"Valid Token",fn:iw},{name:"Claude Code",fn:sw}],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 nw(),process.stdout.write(`
241
+ `));let a=[{name:"Credentials",fn:nw},{name:"Prompt Manager",fn:dw},{name:"Valid Token",fn:cw},{name:"Claude Code",fn:lw}],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 uw(),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();Vo();U();async function Hg(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 ju.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();Ei();Re();j();I();var lw=P("commands:usage"),Xs=20,Qg="EMAIL",Vg="MONTHLY CONSUMPTION (USD)",_g="STATUS";function uw(e){let a=Math.min(100,Math.max(0,e)),o=Math.round(a/100*Xs),t=Xs-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 Xg(e){return `$ ${e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function pw(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 mw(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 gw(e){try{let a=await Rt();if(a?.email)return b(a.email);let o=At(e);return b(o.email??"")}catch(a){return lw.debug(`JWT email decode failed: ${String(a)}`),""}}async function Kg(e){if(!await he())return 1;let o;try{o=await Oa();}catch(h){return C(`Authentication error: ${$(h)}`),1}let t;try{t=await Hg(o);}catch(h){return C(`Failed to fetch usage data: ${$(h)}`),1}if(e.json)return ho(t),0;let r=await gw(o)||b(t.user_id),i=Xg(t.consumed_usd),s=Xg(t.budget_limit),n=`${t.percentage.toFixed(1)}%`,d=`${i} / ${s} (${n})`,l=Math.max(Qg.length,r.length+2),c=Math.max(Vg.length,Xs+2+d.length),u=` ${Qg.padEnd(l)} ${Vg.padEnd(c)} ${_g}`,m=` ${"\u2500".repeat(l)} ${"\u2500".repeat(c)} ${"\u2500".repeat(_g.length)}`,p=`${R.cyan("\u2022")} ${r.padEnd(l-2)}`,g=`${uw(t.percentage)} ${d.padEnd(c-Xs-2)}`,f=` ${R.dim("Resets")} ${mw(t.renewal_date)}`;return process.stdout.write(`
247
+ `)),1)}Re();Vo();U();async function Xg(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 Ju.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 gw=P("commands:usage"),Ks=20,Kg="EMAIL",$g="MONTHLY CONSUMPTION (USD)",Yg="STATUS";function fw(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 Zg(e){return `$ ${e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function hw(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 bw(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 vw(e){try{let a=await Rt();if(a?.email)return b(a.email);let o=At(e);return b(o.email??"")}catch(a){return gw.debug(`JWT email decode failed: ${String(a)}`),""}}async function ef(e){if(!await he())return 1;let o;try{o=await Oa();}catch(h){return C(`Authentication error: ${$(h)}`),1}let t;try{t=await Xg(o);}catch(h){return C(`Failed to fetch usage data: ${$(h)}`),1}if(e.json)return ho(t),0;let r=await vw(o)||b(t.user_id),i=Zg(t.consumed_usd),s=Zg(t.budget_limit),n=`${t.percentage.toFixed(1)}%`,d=`${i} / ${s} (${n})`,l=Math.max(Kg.length,r.length+2),c=Math.max($g.length,Ks+2+d.length),u=` ${Kg.padEnd(l)} ${$g.padEnd(c)} ${Yg}`,m=` ${"\u2500".repeat(l)} ${"\u2500".repeat(c)} ${"\u2500".repeat(Yg.length)}`,p=`${R.cyan("\u2022")} ${r.padEnd(l-2)}`,g=`${fw(t.percentage)} ${d.padEnd(c-Ks-2)}`,f=` ${R.dim("Resets")} ${bw(t.renewal_date)}`;return process.stdout.write(`
248
248
  `),process.stdout.write(R.dim(u)+`
249
249
  `),process.stdout.write(R.dim(m)+`
250
- `),process.stdout.write(` ${p} ${g} ${pw(t.status)}
250
+ `),process.stdout.write(` ${p} ${g} ${hw(t.status)}
251
251
  `),process.stdout.write(f+`
252
252
  `),process.stdout.write(`
253
- `),0}var bw=["github.com","www.github.com"],vw=/^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.@-]+)(\/.*)?$/,yw=/^([^@]+)@(.+)$/;function kw(e){return !!(isAbsolute(e)||e==="."||e===".."||e.startsWith("./")||e.startsWith("../")||e.startsWith(".\\")||e.startsWith("..\\")||/^[a-zA-Z]:[/\\]/.test(e))}function yc(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 Pw(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=yc(i);}}else if(a.length>2){let i=a.slice(2).join("/");r.subpath=yc(i);}return e.hash&&e.hash.length>1&&(r.ref=decodeURIComponent(e.hash.slice(1))),r}function Ks(e){let a=e.trim();if(!a)throw new Error("Skill source cannot be empty.");if(kw(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:")&&bw.includes(o.hostname))return Pw(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(vw);if(i){let s=i[1],n=i[2],d=i[3],l,c=n.match(yw);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=yc(m));}return u}}return {type:"git",url:a}}function $s(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 $g(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 Pc=new Set(["node_modules",".git","dist","build","__pycache__"]);function ef(e,a){let o=normalize(resolve(e)),t=normalize(resolve(a));return t.startsWith(o+sep)||t===o}function Rw(e,a){let o=normalize(resolve(e)),t=normalize(resolve(join(e,a)));return t.startsWith(o+sep)||t===o}async function kc(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}=$g(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 af(e,a=0,o=5){if(a>o)return [];try{let[t,r]=await Promise.all([kc(e),readdir(e,{withFileTypes:!0}).catch(()=>[])]),i=t?[e]:[],s=await Promise.all(r.filter(n=>n.isDirectory()&&!Pc.has(n.name)).map(n=>af(join(e,n.name),a+1,o)));return [...i,...s.flat()]}catch{return []}}async function en(e,a){let o=[],t=new Set;if(a&&!Rw(e,a))throw new Error(`Invalid subpath: "${a}" resolves outside the repository directory.`);let r=a?join(e,a):e;if(await kc(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 kc(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 af(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 of(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 nf=1,Mw={retries:5,minTimeout:50};async function df(e,a){mkdirSync(dirname(e),{recursive:true});let o=await Nb.lock(e+".lock",{realpath:false,retries:Mw});try{return await a()}finally{await o();}}function tf(){return {version:nf,skills:{}}}async function an(e){let a=lr(e);try{let o=await readFile(a,"utf-8"),t=JSON.parse(o);return !t.version||t.version<nf?tf():t}catch{return tf()}}function qw(e){let a={};for(let o of Object.keys(e).sort())a[o]=e[o];return a}async function cf(e,a){let o=lr(a);mkdirSync(dirname(o),{recursive:true});let t={version:e.version,skills:qw(e.skills)},r=`${o}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(t,null,2)+`
254
- `,{encoding:"utf-8",mode:384}),renameSync(r,o);}async function lf(e,a,o){let t=lr(o);await df(t,async()=>{let r=await an(o),i=new Date().toISOString(),s=r.skills[e];r.skills[e]={...a,installedAt:s?.installedAt??i,updatedAt:i},await cf(r,o);});}async function uf(e,a){let o=lr(a);await df(o,async()=>{let t=await an(a);e in t.skills&&(delete t.skills[e],await cf(t,a));});}Oe();I();var pf=P("skillInstaller");async function Uw(e,a,o,t){try{await S(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:"skill",source:"external",scope:a,version:o,duration_ms:t,interface:Z().interfaceType});}catch(r){pf.warn(`Failed to send skill install metrics: ${String(r)}`);}}async function zw(e,a){try{await S(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){pf.warn(`Failed to send skill install-failed metrics: ${String(o)}`);}}async function Ww(e,a){await cp$1(e,a,{recursive:true,dereference:false,filter:o=>{if(Pc.has(basename(o)))return false;try{return !lstatSync(o).isSymbolicLink()}catch{return false}}});}async function Jw(e,a,o){let t=da(e.name),r=Jo(a),i=join(r,t);if(!ef(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 Ww(e.path,i);let n=$s(o)??o.url;return await lf(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 mf(e,a){let o=Ks(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 en(r,o.subpath),s=[...a.skillFilter??[]];o.skillFilter&&s.push(o.skillFilter);let n=s.length>0?of(i,s):i,d=[],l=o.ref??"latest";for(let c of n){let u=Date.now(),m=await Jw(c,a.scope,o);d.push(m);let p=Date.now()-u;m.success?await Uw(c.name,a.scope,l,p):await zw(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 Ra(t).catch(()=>{});}}Oe();j();I();var Xw=P("skills");async function Kw(e){try{await S(w.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:"skill",source:"external",interface:Z().interfaceType});}catch(a){Xw.warn(`Failed to send skill uninstall metrics: ${String(a)}`);}}async function $w(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 Yw(e){let a=Ks(e),o;try{let t;if(a.type==="local"){if(!a.localPath)return C("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 en(t,a.subpath);if(r.length===0)return D("No skills found in this source."),0;let s=$s(a)??b(e);D(`Found ${r.length} skill(s) in ${s}:
253
+ `),0}var Pw=["github.com","www.github.com"],Dw=/^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.@-]+)(\/.*)?$/,ww=/^([^@]+)@(.+)$/;function Sw(e){return !!(isAbsolute(e)||e==="."||e===".."||e.startsWith("./")||e.startsWith("../")||e.startsWith(".\\")||e.startsWith("..\\")||/^[a-zA-Z]:[/\\]/.test(e))}function Dc(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 Cw(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=Dc(i);}}else if(a.length>2){let i=a.slice(2).join("/");r.subpath=Dc(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(Sw(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:")&&Pw.includes(o.hostname))return Cw(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(Dw);if(i){let s=i[1],n=i[2],d=i[3],l,c=n.match(ww);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=Dc(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 af(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 Sc=new Set(["node_modules",".git","dist","build","__pycache__"]);function rf(e,a){let o=normalize(resolve(e)),t=normalize(resolve(a));return t.startsWith(o+sep)||t===o}function Iw(e,a){let o=normalize(resolve(e)),t=normalize(resolve(join(e,a)));return t.startsWith(o+sep)||t===o}async function wc(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}=af(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 sf(e,a=0,o=5){if(a>o)return [];try{let[t,r]=await Promise.all([wc(e),readdir(e,{withFileTypes:!0}).catch(()=>[])]),i=t?[e]:[],s=await Promise.all(r.filter(n=>n.isDirectory()&&!Sc.has(n.name)).map(n=>sf(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&&!Iw(e,a))throw new Error(`Invalid subpath: "${a}" resolves outside the repository directory.`);let r=a?join(e,a):e;if(await wc(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 wc(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 sf(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 nf(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 uf=1,Ow={retries:5,minTimeout:50};async function pf(e,a){mkdirSync(dirname(e),{recursive:true});let o=await Ub.lock(e+".lock",{realpath:false,retries:Ow});try{return await a()}finally{await o();}}function df(){return {version:uf,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<uf?df():t}catch{return df()}}function Nw(e){let a={};for(let o of Object.keys(e).sort())a[o]=e[o];return a}async function mf(e,a){let o=lr(a);mkdirSync(dirname(o),{recursive:true});let t={version:e.version,skills:Nw(e.skills)},r=`${o}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(t,null,2)+`
254
+ `,{encoding:"utf-8",mode:384}),renameSync(r,o);}async function gf(e,a,o){let t=lr(o);await pf(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 mf(r,o);});}async function ff(e,a){let o=lr(a);await pf(o,async()=>{let t=await on(a);e in t.skills&&(delete t.skills[e],await mf(t,a));});}Oe();I();var hf=P("skillInstaller");async function Hw(e,a,o,t){try{await S(w.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:"skill",source:"external",scope:a,version:o,duration_ms:t,interface:Z().interfaceType});}catch(r){hf.warn(`Failed to send skill install metrics: ${String(r)}`);}}async function Qw(e,a){try{await S(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){hf.warn(`Failed to send skill install-failed metrics: ${String(o)}`);}}async function Vw(e,a){await cp$1(e,a,{recursive:true,dereference:false,filter:o=>{if(Sc.has(basename(o)))return false;try{return !lstatSync(o).isSymbolicLink()}catch{return false}}});}async function _w(e,a,o){let t=da(e.name),r=Jo(a),i=join(r,t);if(!rf(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 Vw(e.path,i);let n=Ys(o)??o.url;return await gf(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 bf(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?nf(i,s):i,d=[],l=o.ref??"latest";for(let c of n){let u=Date.now(),m=await _w(c,a.scope,o);d.push(m);let p=Date.now()-u;m.success?await Hw(c.name,a.scope,l,p):await Qw(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 Ra(t).catch(()=>{});}}Oe();j();I();var Zw=P("skills");async function eS(e){try{await S(w.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:"skill",source:"external",interface:Z().interfaceType});}catch(a){Zw.warn(`Failed to send skill uninstall metrics: ${String(a)}`);}}async function aS(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 oS(e){let a=$s(e),o;try{let t;if(a.type==="local"){if(!a.localPath)return C("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
255
  `);for(let n of r){let d=b(n.name),l=b(n.description);process.stdout.write(` ${R.bold(d)} ${R.dim(l)}
256
256
  `);}return process.stdout.write(`
257
- `),0}catch(t){return t instanceof Fo?C(t.message):C(t instanceof Error?t.message:String(t)),1}finally{o&&await Ra(o).catch(()=>{});}}function Zw(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 C(`${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&&C(`${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 ff(e,a){if(a.list)return Yw(e);let o=a.global?"global":"project";try{let t=await mf(e,{scope:o,skillFilter:a.skill,yes:a.yes});return Zw(t),t.failed>0?1:0}catch(t){return t instanceof Fo?C(t.message):C(t instanceof Error?t.message:String(t)),1}}async function hf(e){let a=Jo(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 bf(e){let a=e.global?"global":"project",o=await hf(a),t=await an(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 ho(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}):
257
+ `),0}catch(t){return t instanceof Fo?C(t.message):C(t instanceof Error?t.message:String(t)),1}finally{o&&await Ra(o).catch(()=>{});}}function tS(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 C(`${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&&C(`${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 yf(e,a){if(a.list)return oS(e);let o=a.global?"global":"project";try{let t=await bf(e,{scope:o,skillFilter:a.skill,yes:a.yes});return tS(t),t.failed>0?1:0}catch(t){return t instanceof Fo?C(t.message):C(t instanceof Error?t.message:String(t)),1}}async function kf(e){let a=Jo(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 Pf(e){let a=e.global?"global":"project",o=await kf(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 ho(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
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}
260
260
  `),process.stdout.write(` ${R.dim(l)}
261
261
 
262
- `);}return 0}async function vf(e,a){let o=a.global?"global":"project";if(!e){let s=await hf(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 Df(e,a){let o=a.global?"global":"project";if(!e){let s=await kf(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)}
263
263
  `);return process.stdout.write(`
264
- `),D("Specify a skill name to remove: flow skills remove <name>"),1}let t=da(e),r=Jo(o),i=join(r,t);try{await stat(i);}catch{return C(`Skill "${b(e)}" is not installed.`),1}if(!a.force&&!await $w(`Remove skill "${b(t)}"?`))return D("Cancelled."),0;try{return await rm$1(i,{recursive:!0,force:!0}),await uf(t,o),await Kw(t),K(`Skill "${b(t)}" removed.`),0}catch(s){return C(`Failed to remove skill: ${s instanceof Error?s.message:String(s)}`),1}}j();I();U();var on=P("transfer"),wc=1;function eS(e){return e.marketplace&&e.marketplace!==pe?`${e.name}@${e.marketplace}`:e.name}function aS(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 Pf(e){let a=de__default.resolve(e.output);try{let o=le(),t={version:wc,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 on.error(`Export failed: ${t}`),C(`Failed to export plugins: ${t}`),1}}async function Df(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 C(`Failed to read import file "${e}": ${$(n)}`),1}if(o.version!==wc)return C(`Unsupported export format version ${o.version??"(none)"} \u2014 expected ${wc}`),1;if(!Array.isArray(o.plugins))return C('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}]`;on.warn(`Skipping ${l}: missing or invalid name`),r.push({name:l,error:"missing or invalid name"});}else d.type==="mcp"?(on.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));aS(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)C(` ${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=eS(n);on.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)C(` ${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 tS=P("moduleProxy");function rS(e){if(!process.stdin.isTTY)return Promise.resolve(false);let a=Md.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 wf(e,a){let o=Date.now(),r=spawnSync(e.binaryName,a,{stdio:"inherit",env:process.env}).status??1;await S(w.CLI_MODULE_PROXY_EXECUTED,{module_alias:e.alias,exit_code:r,duration_ms:Date.now()-o,subcommand:a[0]??null}).catch(i=>{tS.warn(`Failed to emit proxy executed event: ${String(i)}`);}),G(r);}async function Cf(e,a){let o=ce.find(r=>r.alias===e);if(!o){C(`Unknown module alias: '${e}'`),G(1);return}if(!await Ga(o.binaryName)){C(`Module '${e}' (${o.binaryName}) is not installed.`);let r=o.platforms[process.platform];if(!r||r.status!=="supported"){await S(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){C(`No supported installation method available for '${e}' on this platform.`),G(1);return}if(await rS("Would you like to install it now? [Y/n] ")){await S(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_accepted"}).catch(()=>{});let n=await Ao(o,"inline",i);if(!n.success){C(`Failed to install '${e}': ${n.error?.message??"unknown error"}`),G(1);return}await wf(o,a);}else D(`To install manually, run: flow modules install ${e}`),await S(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_declined"}).catch(()=>{}),G(1);return}await wf(o,a);}j();var dS=promisify(execFile);async function cS(e){try{if(e.versionCheck.type==="npm-registry"){let{stdout:t}=await dS(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/${te}`,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 lS(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 Sc(){let e=await Promise.all(ce.map(async a=>{let[o,t]=await Promise.all([Ga(a.binaryName),cS(a)]),i=ta(a.alias)?.installedVersion??null,s=a.platforms[process.platform],n=lS(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 xf(e){let a=ce.find(s=>s.alias===e);if(!a)return C(`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"?C(`Module ${a.name} is not supported on ${process.platform}.${n}`):C(`No installation method available for ${a.name} on ${process.platform}.${n}`),1}let t=o.availableStrategies[0],r=vc({text:`Installing ${a.name}...`}).start(),i;try{i=await Ao(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):(C(i.error?.message??"Installation failed"),1)}async function Rf(e,a){let o=vc({text:`Updating ${e.name}...`}).start(),t;try{t=await Wi(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 Ef(e){if(e!==null){let t=ce.find(s=>s.alias===e);if(!t)return C(`Unknown module alias: '${e}'`),1;let r=ta(t.alias);return r?.installMethod?await Rf(t,r.installedVersion??"unknown")==="error"?1:0:(C(`Module '${e}' not installed. Run: flow modules install ${e}`),1)}let a=at().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 Rf(r,t.installedVersion??"unknown")==="error"&&(o=1);}return o}var If="ea77652b607cf8d3dd0a1359c08565561e4f758f",ri=[{path:"0-current-state/INDEX.md",sha256:"987ca6b98f338b82e05e2cab71453ccb7a3e987a56dfd68631735e38356bddff",content:`---
264
+ `),D("Specify a skill name to remove: flow skills remove <name>"),1}let t=da(e),r=Jo(o),i=join(r,t);try{await stat(i);}catch{return C(`Skill "${b(e)}" is not installed.`),1}if(!a.force&&!await aS(`Remove skill "${b(t)}"?`))return D("Cancelled."),0;try{return await rm$1(i,{recursive:!0,force:!0}),await ff(t,o),await eS(t),K(`Skill "${b(t)}" removed.`),0}catch(s){return C(`Failed to remove skill: ${s instanceof Error?s.message:String(s)}`),1}}j();I();U();var tn=P("transfer"),Rc=1;function rS(e){return e.marketplace&&e.marketplace!==pe?`${e.name}@${e.marketplace}`:e.name}function iS(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 Cf(e){let a=de__default.resolve(e.output);try{let o=le(),t={version:Rc,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}`),C(`Failed to export plugins: ${t}`),1}}async function Rf(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 C(`Failed to read import file "${e}": ${$(n)}`),1}if(o.version!==Rc)return C(`Unsupported export format version ${o.version??"(none)"} \u2014 expected ${Rc}`),1;if(!Array.isArray(o.plugins))return C('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));iS(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)C(` ${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=rS(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)C(` ${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 nS=P("moduleProxy");function dS(e){if(!process.stdin.isTTY)return Promise.resolve(false);let a=Fd.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 Af(e,a){let o=Date.now(),r=spawnSync(e.binaryName,a,{stdio:"inherit",env:process.env}).status??1;await S(w.CLI_MODULE_PROXY_EXECUTED,{module_alias:e.alias,exit_code:r,duration_ms:Date.now()-o,subcommand:a[0]??null}).catch(i=>{nS.warn(`Failed to emit proxy executed event: ${String(i)}`);}),G(r);}async function Ef(e,a){let o=ce.find(r=>r.alias===e);if(!o){C(`Unknown module alias: '${e}'`),G(1);return}if(!await Ga(o.binaryName)){C(`Module '${e}' (${o.binaryName}) is not installed.`);let r=o.platforms[process.platform];if(!r||r.status!=="supported"){await S(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){C(`No supported installation method available for '${e}' on this platform.`),G(1);return}if(await dS("Would you like to install it now? [Y/n] ")){await S(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_accepted"}).catch(()=>{});let n=await Ao(o,"inline",i);if(!n.success){C(`Failed to install '${e}': ${n.error?.message??"unknown error"}`),G(1);return}await Af(o,a);}else D(`To install manually, run: flow modules install ${e}`),await S(w.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_declined"}).catch(()=>{}),G(1);return}await Af(o,a);}j();var pS=promisify(execFile);async function mS(e){try{if(e.versionCheck.type==="npm-registry"){let{stdout:t}=await pS(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 gS(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 Ac(){let e=await Promise.all(ce.map(async a=>{let[o,t]=await Promise.all([Ga(a.binaryName),mS(a)]),i=ta(a.alias)?.installedVersion??null,s=a.platforms[process.platform],n=gS(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 Mf(e){let a=ce.find(s=>s.alias===e);if(!a)return C(`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"?C(`Module ${a.name} is not supported on ${process.platform}.${n}`):C(`No installation method available for ${a.name} on ${process.platform}.${n}`),1}let t=o.availableStrategies[0],r=Pc({text:`Installing ${a.name}...`}).start(),i;try{i=await Ao(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):(C(i.error?.message??"Installation failed"),1)}async function If(e,a){let o=Pc({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 qf(e){if(e!==null){let t=ce.find(s=>s.alias===e);if(!t)return C(`Unknown module alias: '${e}'`),1;let r=ta(t.alias);return r?.installMethod?await If(t,r.installedVersion??"unknown")==="error"?1:0:(C(`Module '${e}' not installed. Run: flow modules install ${e}`),1)}let a=at().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 If(r,t.installedVersion??"unknown")==="error"&&(o=1);}return o}var Lf="ea77652b607cf8d3dd0a1359c08565561e4f758f",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,8 @@ 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 tn=".flow-harness-lock";function rn(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 sn(e,a){return e.files?.[a]?.sha256}function Tf(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@${te}`,strategy_context_harness_commit:t};"core_commit"in a||(i.core_commit=""),writeFileSync(e,JSON.stringify(i,null,2)+`
558
- `,"utf8");}j();var xc="CLAUDE.md";function hS(e){return createHash("sha256").update(e,"utf8").digest("hex")}function Ec(){return {new:0,unchanged:0,clean:0,divergent:0,declined:0}}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??Tc,s=e.confirmCreate??bS,n=join(a,tn),d=rn(n),l=[],c=Ec(),u={},m=ri.find(f=>f.path===xc),p=m?existsSync(join(a,m.path)):true;if(m&&!p){let f=join(a,m.path);r?await s(m.path)?(l.push({path:m.path,status:"new"}),c.new++,o||(mkdirSync(dirname(f),{recursive:true}),writeFileSync(f,m.content,"utf8"),u[m.path]=m.sha256)):D(`declined: ${xc} not created`):e.assistant==="claude-code"&&(l.push({path:m.path,status:"new"}),c.new++,o||(mkdirSync(dirname(f),{recursive:true}),writeFileSync(f,m.content,"utf8"),u[m.path]=m.sha256));}for(let f of ri){if(f.path===xc&&!p)continue;let h=join(a,f.path),v=await Ic({dstPath:h,template:f,existingLockHash:sn(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&&Tf(n,d,u,If);let g=c.divergent>0||c.declined>0;return {files:l,counts:c,hasUnresolved:g}}async function Ic(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=hS(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 Tc(e){return ie(` Overwrite ${e} with the updated template? [y/N] `)}async function bS(e){return ie(` Create a generic ${e} with Flow strategy conventions? [y/N] `)}var Lf="64feeb4e5f6f282d4e0fae6568c0520c5ecd4d5a",Ff=[{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"}];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 Ff(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 Tc="CLAUDE.md";function kS(e){return createHash("sha256").update(e,"utf8").digest("hex")}function Mc(){return {new:0,unchanged:0,clean:0,divergent:0,declined:0}}async function Nf(e={}){let a=e.targetDir??process.cwd(),o=e.dryRun??false,t=e.force??false,r=e.isInteractive??!!process.stdin.isTTY,i=e.confirmOverwrite??Lc,s=e.confirmCreate??PS,n=join(a,rn),d=sn(n),l=[],c=Mc(),u={},m=ri.find(f=>f.path===Tc),p=m?existsSync(join(a,m.path)):true;if(m&&!p){let f=join(a,m.path);r?await s(m.path)?(l.push({path:m.path,status:"new"}),c.new++,o||(mkdirSync(dirname(f),{recursive:true}),writeFileSync(f,m.content,"utf8"),u[m.path]=m.sha256)):D(`declined: ${Tc} not created`):e.assistant==="claude-code"&&(l.push({path:m.path,status:"new"}),c.new++,o||(mkdirSync(dirname(f),{recursive:true}),writeFileSync(f,m.content,"utf8"),u[m.path]=m.sha256));}for(let f of ri){if(f.path===Tc&&!p)continue;let h=join(a,f.path),v=await qc({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&&Ff(n,d,u,Lf);let g=c.divergent>0||c.declined>0;return {files:l,counts:c,hasUnresolved:g}}async function qc(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=kS(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 Lc(e){return ae(` Overwrite ${e} with the updated template? [y/N] `)}async function PS(e){return ae(` Create a generic ${e} with Flow strategy conventions? [y/N] `)}var Gf="64feeb4e5f6f282d4e0fae6568c0520c5ecd4d5a",Bf=[{path:"docs/catalog/TEMPLATES/agents/_TEMPLATE-LEVEL-0.md",sha256:"5f6d1ef6336d69c9fa53ec3167e4f0eb8ec212e21e771356e357e397946f3638",content:`---
559
559
  id: <slug-do-card>
560
560
  kind: agent | skill
561
561
  level: 0
@@ -30831,7 +30831,7 @@ flowchart TD
30831
30831
  style A fill:#0369a1,color:#fff,stroke:none
30832
30832
  style H fill:#059669,color:#fff,stroke:none
30833
30833
  \`\`\`
30834
- `}],dn={"cit-tools":[{path:"docs/playbooks/cit-tools.en.md",sha256:"e05497be5766955d50b040efb0eeb031a3b1bddfe0c9ed16f78c91fa1a17dcda",content:`---
30834
+ `}],cn={"cit-tools":[{path:"docs/playbooks/cit-tools.en.md",sha256:"e05497be5766955d50b040efb0eeb031a3b1bddfe0c9ed16f78c91fa1a17dcda",content:`---
30835
30835
  title: "cit-tools \u2014 CI&T-Branded Design Tooling"
30836
30836
  type: runbook
30837
30837
  domain: toolchain
@@ -84776,29 +84776,46 @@ updated: "2026-09-23"
84776
84776
  flow plugin marketplace add cit-flow/flow-harness
84777
84777
  flow plugin install runbook-tech-common
84778
84778
  \`\`\`
84779
- `}]};function Of(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@${te}`,docs_content_harness_commit:t};"core_commit"in a||(i.core_commit=""),writeFileSync(e,JSON.stringify(i,null,2)+`
84780
- `,"utf8");}function DS(e){let a=new Set,o=[];for(let t of e){let r=dn[t];if(r)for(let i of r)a.has(i.path)||(a.add(i.path),o.push(i));}return o}function wS(e){return e.endsWith(".en.md")||e.endsWith(".es.md")?e.slice(0,-6)+".md":e}function SS(e){return e.endsWith(".en.md")?"en":e.endsWith(".es.md")?"es":"pt"}function CS(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=wS(i.path),n=SS(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 Gf(e){let a=e.targetDir??process.cwd(),o=e.dryRun??false,t=e.force??false,r=e.isInteractive??!!process.stdin.isTTY,i=e.confirmOverwrite??Tc,s=join(a,tn),n=rn(s),d=e.docsLang??"all",l=e.installedBundles.length===0,c=l?[]:DS(e.installedBundles),u=CS([...Ff,...c],d),m=[],p=Ec(),g={};for(let h of u){let v=join(a,h.path),k=await Ic({dstPath:v,template:h,existingLockHash:sn(n,h.path),force:t,isInteractive:r,confirmOverwrite:T=>i(T)});m.push({path:h.path,status:k.status}),p[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&&Of(s,n,g,Lf);let f=p.divergent>0||p.declined>0;return {files:m,counts:p,hasUnresolved:f,skippedPlaybooks:l}}function Bf(){let e=Ae().plugins,a=process.cwd(),o=new Set(Object.keys(dn)),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();Vo();I();var Mc=P("lib:otelMetrics"),AS="flow-plugins-cli",xS="1.0.0",ES=5e3;function IS(){return Fa("FLOW_OTEL_ENDPOINT_URL","https://flow.ciandt.com/otel")}function TS(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 MS(e,a){let o=String(Date.now()*1e6);return {resourceMetrics:[{resource:{attributes:[]},scopeMetrics:[{scope:{name:AS,version:xS},metrics:[{name:e,sum:{dataPoints:[{asInt:"1",startTimeUnixNano:o,timeUnixNano:o,attributes:Object.entries(a).map(([t,r])=>TS(t,r))}],aggregationTemporality:1,isMonotonic:true}}]}]}]}}async function qc(e,a={}){try{let[o,t]=await Promise.all([Rt(),Y()]),r=o?.email,i=t?.tenant;if(!r||!i){Mc.debug(`Skipping OTel metric "${e}": no cached identity available`);return}let s=MS(e,a);await ju.post(IS(),{json:s,timeout:ES,headers:{"Content-Type":"application/json","x-flow-user":r,flowtenant:i}}),Mc.debug(`OTel metric sent: ${e}`);}catch(o){Mc.warn(`Failed to send OTel metric "${e}": ${String(o)}`);}}var Lc=P("cli:init"),FS={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 OS(e){process.stdout.write(`
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 RS(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 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 zf(e){let a=e.targetDir??process.cwd(),o=e.dryRun??false,t=e.force??false,r=e.isInteractive??!!process.stdin.isTTY,i=e.confirmOverwrite??Lc,s=join(a,rn),n=sn(s),d=e.docsLang??"all",l=e.installedBundles.length===0,c=l?[]:RS(e.installedBundles),u=ES([...Bf,...c],d),m=[],p=Mc(),g={};for(let h of u){let v=join(a,h.path),k=await qc({dstPath:v,template:h,existingLockHash:nn(n,h.path),force:t,isInteractive:r,confirmOverwrite:T=>i(T)});m.push({path:h.path,status:k.status}),p[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,Gf);let f=p.divergent>0||p.declined>0;return {files:m,counts:p,hasUnresolved:f,skippedPlaybooks:l}}function Wf(){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();Vo();I();var Fc=P("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 Oc(e,a={}){try{let[o,t]=await Promise.all([Rt(),Y()]),r=o?.email,i=t?.tenant;if(!r||!i){Fc.debug(`Skipping OTel metric "${e}": no cached identity available`);return}let s=OS(e,a);await Ju.post(LS(),{json:s,timeout:qS,headers:{"Content-Type":"application/json","x-flow-user":r,flowtenant:i}}),Fc.debug(`OTel metric sent: ${e}`);}catch(o){Fc.warn(`Failed to send OTel metric "${e}": ${String(o)}`);}}var Nc=P("cli:init"),BS={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(`
84781
84781
  `+R.bold(` flow setup strategy
84782
84782
  `)),process.stdout.write(R.dim(` Target: ${e}
84783
84783
 
84784
84784
  `)),process.stdout.write(R.dim(` Files evaluated:
84785
84785
  `));for(let a of ri)process.stdout.write(R.dim(` \xB7 ${a.path}
84786
84786
  `));process.stdout.write(`
84787
- `);}function NS(e,a,o,t){S(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=>{Lc.warn(`Failed to emit strategy init completed event: ${String(r)}`);}),qc("flow_cli.strategy_init",{dry_run:a,files_new:e.new,files_updated:e.clean,exit_code:o}).catch(()=>{});}function jf(e,a){S(w.CLI_STRATEGY_INIT_FAILED,{error_message:e.slice(0,500),duration_ms:a}).catch(o=>{Lc.warn(`Failed to emit strategy init failed event: ${String(o)}`);}),qc("flow_cli.strategy_init_failed",{duration_ms:a}).catch(()=>{});}async function GS(e){try{return await simpleGit(e).checkIsRepo(CheckRepoActions.IN_TREE)}catch{return false}}async function BS(){return ie(" Continue anyway? [y/N] ")}async function jS(){return D(`docs/catalog/ is the skill/agent/command catalog (~2.6MB); docs/playbooks/ is the
84787
+ `);}function US(e,a,o,t){S(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=>{Nc.warn(`Failed to emit strategy init completed event: ${String(r)}`);}),Oc("flow_cli.strategy_init",{dry_run:a,files_new:e.new,files_updated:e.clean,exit_code:o}).catch(()=>{});}function Jf(e,a){S(w.CLI_STRATEGY_INIT_FAILED,{error_message:e.slice(0,500),duration_ms:a}).catch(o=>{Nc.warn(`Failed to emit strategy init failed event: ${String(o)}`);}),Oc("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 ae(" Continue anyway? [y/N] ")}async function JS(){return D(`docs/catalog/ is the skill/agent/command catalog (~2.6MB); docs/playbooks/ is the
84788
84788
  runbook + sub-runbook docs for your installed bundles, in every language they ship
84789
84789
  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.`),ie(" Also scaffold docs/catalog and docs/playbooks content? [y/N] ")}async function US(){return ls(" 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 cn(e){Lc.debug(`Running flow setup strategy: ${JSON.stringify(e)}`);let a=e.path??process.cwd(),o=e.isInteractive??!!process.stdin.isTTY,t=e.confirmContinueWithoutGit??BS;if(!await GS(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}):C(`${k} Re-run interactively to confirm, or run "git init" first.`),1;if(D(k),!await t())return 1}e.json||OS(a);let r=Date.now(),i;try{i=await qf({targetDir:a,dryRun:e.dryRun,force:e.force,assistant:e.assistant});}catch(k){throw jf(k instanceof Error?k.message:String(k),Date.now()-r),k}let s,n=e.confirmDocsContent??jS,d=e.selectDocsLang??US,l=!!e.docsContent,c=e.docsLang??"all";if(!l&&o&&(l=await n(),l&&(c=await d())),l){let k=Bf();try{s=await Gf({targetDir:a,dryRun:e.dryRun,force:e.force,installedBundles:k,docsLang:c});}catch(T){throw jf(T instanceof Error?T.message:String(T),Date.now()-r),T}}let u=i.hasUnresolved||s?.hasUnresolved?2:0;if(NS(i.counts,!!e.dryRun,u,Date.now()-r),e.json)return Pe({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:
84791
- `));for(let k of i.files){let{label:T,color:L}=FS[k.status];process.stdout.write(` ${m}${L(T.padEnd(18))} ${k.path}
84790
+ it if you don't run that app.`),ae(" 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 ln(e){Nc.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 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}):C(`${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 Nf({targetDir:a,dryRun:e.dryRun,force:e.force,assistant:e.assistant});}catch(k){throw Jf(k instanceof Error?k.message:String(k),Date.now()-r),k}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 k=Wf();try{s=await zf({targetDir:a,dryRun:e.dryRun,force:e.force,installedBundles:k,docsLang:c});}catch(T){throw Jf(T instanceof Error?T.message:String(T),Date.now()-r),T}}let u=i.hasUnresolved||s?.hasUnresolved?2:0;if(US(i.counts,!!e.dryRun,u,Date.now()-r),e.json)return Pe({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:
84791
+ `));for(let k of i.files){let{label:T,color:L}=BS[k.status];process.stdout.write(` ${m}${L(T.padEnd(18))} ${k.path}
84792
84792
  `);}process.stdout.write(`
84793
84793
  `);let{new:p,unchanged:g,clean:f,divergent:h,declined:v}=i.counts;if(K(`${p} 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(`
84794
84794
  `+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&&C("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 Oc="repos.yaml",HS="projects",QS="projects-ref";function Uf(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 Hf(e){let a=join(e,Oc);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??HS),refs_dir:String(i.refs_dir??QS)},repos:Uf(o.repos,"repos",t),references:Uf(o.references,"references",t),warnings:t}}function Qf(e,a){let o=join(e,Oc),{warnings:t,...r}=a;writeFileSync(o,stringify(r),"utf8");}function Vf(e){let a=join(e,".gitignore"),o=Oc;if(!existsSync(a)){writeFileSync(a,`${o}
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&&C("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 jc="repos.yaml",_S="projects",XS="projects-ref";function Hf(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,jc);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:Hf(o.repos,"repos",t),references:Hf(o.references,"references",t),warnings:t}}function _f(e,a){let o=join(e,jc),{warnings:t,...r}=a;writeFileSync(o,stringify(r),"utf8");}function Xf(e){let a=join(e,".gitignore"),o=jc;if(!existsSync(a)){writeFileSync(a,`${o}
84796
84796
  `,"utf8");return}readFileSync(a,"utf8").split(`
84797
84797
  `).some(i=>i.trim()===o)||appendFileSync(a,`${o}
84798
- `,"utf8");}var _f="projects",Xf="projects-ref";function VS(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 Lo(" Repo name (ENTER to finish): ");if(!e)return null;let a=await Lo(` Group/category for '${e}' (optional, default: general): `),o=await Lo(` Remote (URL) for '${e}' \u2014 SSH or HTTPS: `);if(!o)return null;let t=VS(o),r=await ie(` Is '${e}' a reference/read-only repo? [y/N] `);return {entry:{name:e,remote:t,group:a||"general"},isReference:r}}async function Kf(){if(!await ie("repos.yaml not found. Set up this repo as a multi-repo workspace? [y/N] "))return null;let a=await Lo(` Folder for work repos (default: ${_f}): `),o=await Lo(` Folder for reference repos (default: ${Xf}): `),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||Xf},repos:t,references:r,warnings:[]}}I();var Yf=P("workspace:repos"),eh=6e4;async function $S(e){try{return (await simpleGit(e).status()).current}catch{return null}}function ah(){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 YS(e){await simpleGit(e,{timeout:{block:eh}}).env(ah()).pull(["--ff-only"]);}async function ZS(e,a){await simpleGit({timeout:{block:eh}}).env(ah()).clone(e,a);}async function Gc(e,a,o){let t=join(a,e.name),r=join(t,".git");if(existsSync(r)){let i=await $S(t);if(i==="main"||i==="master")try{return await YS(t),{name:e.name,kind:o,outcome:"updated"}}catch(s){return Yf.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 ZS(e.remote,t),{name:e.name,kind:o,outcome:"cloned"}}catch(i){let s=i instanceof Error?i.message:String(i);return Yf.error(`[${e.name}] clone failed: ${s}`),{name:e.name,kind:o,outcome:"failed",error:s}}}function ln(e,a){return existsSync(e)?readdirSync(e,{withFileTypes:true}).filter(o=>o.isDirectory()&&!a.has(o.name)).map(o=>o.name):[]}async function oh(e={}){let a=e.targetDir??process.cwd(),o=e.isInteractive??!!process.stdin.isTTY,t=Hf(a);if(!t){if(!o)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true,manifestWarnings:[]};let u=await Kf();if(!u)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true,manifestWarnings:[]};Qf(a,u),Vf(a),t=u;}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 Gc(u,r,"repo"));for(let u of t.references)s.push(await Gc(u,i,"reference"));let n=new Set(t.repos.map(u=>u.name)),d=new Set(t.references.map(u=>u.name)),l=[...ln(r,n),...ln(i,d)],c=0;if(e.prune&&l.length>0)for(let u of [r,i]){let m=ln(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}}var tC=promisify(execFile),th=5e3;async function rh(){try{let{stdout:e,stderr:a}=await tC("ssh",["-T","git@github.com","-o","BatchMode=yes","-o",`ConnectTimeout=${th/1e3}`],{timeout:th+2e3});return `${e}${a}`.includes("successfully authenticated")}catch(e){return `${e.stdout??""}${e.stderr??""}`.includes("successfully authenticated")}}I();var rC=["local","project","user"];function iC(){D(`The following ${nr.length} runbook bundles will be installed:`);for(let e of nr)process.stdout.write(` - ${e}
84799
- `);}function sC(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 un(e){return e.scope==="user"?"globally (~/.claude/)":`at ${e.scope} scope in ${e.projectPath??"(unknown project)"}`}async function nC(e,a,o){return D(`${e} is already installed ${un(o)}.`),ie(` Move it to ${Xa[a].actionLabel} instead? This uninstalls it from ${un(o)} first. [y/N] `)}async function dC(){return ls(" Install scope:",rC.map(e=>({value:e,label:Xa[e].actionLabel,description:Xa[e].description})))}async function jc(e={}){let a=e.isInteractive??!!process.stdin.isTTY;e.silent||iC();let o=e.scope;if(!o&&!e.silent&&a)try{o=await dC();}catch(r){if(r instanceof Error&&r.message==="SIGINT")return process.stdout.write(`
84800
- `),130;throw r}let t=[];for(let r=0;r<nr.length;r++){let i=nr[r],s=`[${r+1}/${nr.length}] `,n=e.force??false;if(!n){let d=sC(i);if(d){if(e.silent||!a){e.silent||D(`${s}Skipping ${i} \u2014 already installed ${un(d)}. Re-run with --force to install here too.`);continue}try{if(!await nC(i,o,d)){D(`${s}Skipped ${i}.`);continue}let c=await _s(i,{force:!0,scope:d.scope});if(c!==0){D(`${s}Could not remove ${i} from ${un(d)} \u2014 skipping rather than leaving it in an inconsistent state.`),t.push(c);continue}}catch(l){if(l instanceof Error&&l.message==="SIGINT")return process.stdout.write(`
84801
- `),130;throw l}}}e.silent||D(`${s}Installing ${i}...`),t.push(await ir([i],{scope:o,silent:e.silent,force:n}));}return t.some(r=>r!==0)?1:0}var cC=P("cli:setup-workspace");function lC(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 uC(e){e||await rh()||(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:
84798
+ `,"utf8");}function Kf(e,a){let o=join(e,".claudeignore"),t=existsSync(o)?readFileSync(o,"utf8"):"",r=new Set(t.split(`
84799
+ `).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
+ `,n=i.map(d=>`# ${d}/ \u2014 repos cloned via flow setup workspace, not part of this repo's own docs.
84801
+ ${d}/`).join(`
84802
+
84803
+ `);t?appendFileSync(o,`
84804
+ ${n}
84805
+ `,"utf8"):writeFileSync(o,`${s}
84806
+ ${n}
84807
+ `,"utf8");}var Qf="## Off-Limits \u2014 Workspace Repos";function $f(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(Qf))return "already-present";let i=`
84808
+ ${Qf}
84809
+
84810
+ \`${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
+
84812
+ > Off-limits: do not read, index, link, or reference files inside these folders in any context.
84813
+ `;return appendFileSync(t,`${r.endsWith(`
84814
+ `)?"":`
84815
+ `}${i}`,"utf8"),"appended"}var Yf="projects",Zf="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 Lo(" Repo name (ENTER to finish): ");if(!e)return null;let a=await Lo(` Group/category for '${e}' (optional, default: general): `),o=await Lo(` Remote (URL) for '${e}' \u2014 SSH or HTTPS: `);if(!o)return null;let t=KS(o),r=await ae(` Is '${e}' a reference/read-only repo? [y/N] `);return {entry:{name:e,remote:t,group:a||"general"},isReference:r}}async function eh(){if(!await ae("repos.yaml not found. Set up this repo as a multi-repo workspace? [y/N] "))return null;let a=await Lo(` Folder for work repos (default: ${Yf}): `),o=await Lo(` Folder for reference repos (default: ${Zf}): `),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||Yf,refs_dir:o||Zf},repos:t,references:r,warnings:[]}}I();var oh=P("workspace:repos"),rh=6e4;async function eC(e){try{return (await simpleGit(e).status()).current}catch{return null}}function ih(){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:rh}}).env(ih()).pull(["--ff-only"]);}async function oC(e,a){await simpleGit({timeout:{block:rh}}).env(ih()).clone(e,a);}async function zc(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 oh.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 oh.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 sh(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 eh();if(!u)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true,manifestWarnings:[]};_f(a,u),Xf(a),t=u;}Kf(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 zc(u,r,"repo"));for(let u of t.references)s.push(await zc(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 m=mn(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),nh=5e3;async function dh(){try{let{stdout:e,stderr:a}=await sC("ssh",["-T","git@github.com","-o","BatchMode=yes","-o",`ConnectTimeout=${nh/1e3}`],{timeout:nh+2e3});return `${e}${a}`.includes("successfully authenticated")}catch(e){return `${e.stdout??""}${e.stderr??""}`.includes("successfully authenticated")}}I();var nC=["local","project","user"];function dC(){D(`The following ${nr.length} runbook bundles will be installed:`);for(let e of nr)process.stdout.write(` - ${e}
84816
+ `);}function cC(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 lC(e,a,o){return D(`${e} is already installed ${gn(o)}.`),ae(` Move it to ${Xa[a].actionLabel} instead? This uninstalls it from ${gn(o)} first. [y/N] `)}async function uC(){return us(" Install scope:",nC.map(e=>({value:e,label:Xa[e].actionLabel,description:Xa[e].description})))}async function Jc(e={}){let a=e.isInteractive??!!process.stdin.isTTY;e.silent||dC();let o=e.scope;if(!o&&!e.silent&&a)try{o=await uC();}catch(r){if(r instanceof Error&&r.message==="SIGINT")return process.stdout.write(`
84817
+ `),130;throw r}let t=[];for(let r=0;r<nr.length;r++){let i=nr[r],s=`[${r+1}/${nr.length}] `,n=e.force??false;if(!n){let d=cC(i);if(d){if(e.silent||!a){e.silent||D(`${s}Skipping ${i} \u2014 already installed ${gn(d)}. Re-run with --force to install here too.`);continue}try{if(!await lC(i,o,d)){D(`${s}Skipped ${i}.`);continue}let c=await Xs(i,{force:!0,scope:d.scope});if(c!==0){D(`${s}Could not remove ${i} from ${gn(d)} \u2014 skipping rather than leaving it in an inconsistent state.`),t.push(c);continue}}catch(l){if(l instanceof Error&&l.message==="SIGINT")return process.stdout.write(`
84818
+ `),130;throw l}}}e.silent||D(`${s}Installing ${i}...`),t.push(await ir([i],{scope:o,silent:e.silent,force:n}));}return t.some(r=>r!==0)?1:0}var pC=P("cli:setup-workspace");function mC(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 gC(e){e||await dh()||(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:
84802
84819
  `),process.stdout.write(` 1. Check for an existing key: ls -la ~/.ssh/id_ed25519.pub
84803
84820
  `),process.stdout.write(` 2. If none, generate one: ssh-keygen -t ed25519 -C "your_email@example.com"
84804
84821
  `),process.stdout.write(` 3. Start the agent: eval "$(ssh-agent -s)"
@@ -84806,12 +84823,12 @@ flow plugin install runbook-tech-common
84806
84823
  `),process.stdout.write(` 5. Copy the public key: pbcopy < ~/.ssh/id_ed25519.pub (macOS)
84807
84824
  `),process.stdout.write(` 6. Add it on GitHub: https://github.com/settings/ssh/new
84808
84825
  `),process.stdout.write(` 7. Test the connection: ssh -T git@github.com
84809
- `));}async function Uc(e={}){cC.debug(`Running flow setup workspace: ${JSON.stringify(e)}`),await uC(e.json);let a=await oh({targetDir:e.path,prune:e.prune});if(e.json)return Pe({repos:a.repos,orphans:a.orphans,prunedCount:a.prunedCount,skippedNoManifest:a.skippedNoManifest,manifestWarnings:a.manifestWarnings}),a.repos.some(s=>s.outcome==="failed")?1:0;for(let s of a.manifestWarnings)D(`repos.yaml: ${s}`);if(a.skippedNoManifest)return D("No repos.yaml and no interactive terminal \u2014 nothing to do."),0;for(let s of a.repos)process.stdout.write(` ${s.name}: ${lC(s.outcome)}
84810
- `);let o=a.repos.filter(s=>s.outcome==="cloned").length,t=a.repos.filter(s=>s.outcome==="updated").length,r=a.repos.filter(s=>s.outcome==="skipped").length,i=a.repos.filter(s=>s.outcome==="failed").length;return K(`${o} cloned, ${t} updated, ${r} skipped`+(i>0?`, ${i} failed`:"")+(a.prunedCount>0?`, ${a.prunedCount} pruned`:"")),a.orphans.length>0&&D(`Orphan director${a.orphans.length===1?"y":"ies"} not in repos.yaml: ${a.orphans.join(", ")}. Re-run with --prune to remove.`),i>0?1:0}var pC=[{key:"strategy",label:"strategy (scaffold the numbered documentation structure)",run:e=>cn({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=>Uc({path:e})}];async function mC(e){return ie(` Run ${e}? [y/N] `)}async function ih(e={}){let a=e.isInteractive??!!process.stdin.isTTY,o=e.confirmStep??mC,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 pC){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 sh(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${te}`,"-V, --version","Display the CLI version").addHelpText("after",`
84826
+ `));}async function fC(e,a,o,t){if(o||!t||a.skippedNoManifest||!a.workspaceDirs)return;let{repos_dir:r,refs_dir:i}=a.workspaceDirs,s=await ae(` Add an off-limits note to CLAUDE.md for '${r}/' and '${i}/'? [y/N] `),n=$f(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 Hc(e={}){pC.debug(`Running flow setup workspace: ${JSON.stringify(e)}`);let a=e.isInteractive??!!process.stdin.isTTY;await gC(e.json);let o=await sh({targetDir:e.path,prune:e.prune});if(e.json)return Pe({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}: ${mC(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 fC(e.path??process.cwd(),o,e.json,a),s>0?1:0}var hC=[{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:()=>Jc({})},{key:"workspace",label:"workspace (clone/update repos declared in repos.yaml)",run:e=>Hc({path:e})}];async function bC(e){return ae(` Run ${e}? [y/N] `)}async function ch(e={}){let a=e.isInteractive??!!process.stdin.isTTY,o=e.confirmStep??bC,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 hC){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 lh(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",`
84811
84828
  Without arguments, opens the interactive interface (TUI).
84812
84829
  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",`
84813
84830
  Examples:
84814
- $ flow setup init`).action(async()=>{let c=await bc();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",`
84831
+ $ flow setup init`).action(async()=>{let c=await kc();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",`
84815
84832
  Examples:
84816
84833
  $ flow setup strategy
84817
84834
  $ flow setup strategy --dry-run
@@ -84819,7 +84836,7 @@ Examples:
84819
84836
  $ flow setup strategy --assistant claude-code
84820
84837
  $ flow setup strategy --docs-content
84821
84838
  $ flow setup strategy --docs-content --docs-lang en
84822
- $ flow setup strategy --json --path ./my-repo`).action(async c=>{let u=await cn({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).addHelpText("after",`
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).addHelpText("after",`
84823
84840
  Examples:
84824
84841
  $ flow setup harness
84825
84842
  $ flow setup harness --scope project
@@ -84829,11 +84846,11 @@ Without --scope and with an interactive terminal, prompts once for the scope
84829
84846
  (local/project/user) before installing all 7 bundles. A bundle already
84830
84847
  installed elsewhere (any scope, any project) prompts to move it here instead
84831
84848
  (uninstall there, install here) unless --force is passed, which installs
84832
- here too without asking, leaving the bundle enabled in both places.`).action(async c=>{let u=await jc({scope:c.scope,silent:c.silent,force:c.force});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",`
84849
+ here too without asking, leaving the bundle enabled in both places.`).action(async c=>{let u=await Jc({scope:c.scope,silent:c.silent,force:c.force});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",`
84833
84850
  Examples:
84834
84851
  $ flow setup workspace
84835
84852
  $ flow setup workspace --prune
84836
- $ flow setup workspace --json --path ./my-workspace`).action(async c=>{let u=await Uc({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",`
84853
+ $ 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",`
84837
84854
  Examples:
84838
84855
  $ flow setup framework-strategy
84839
84856
  $ flow setup framework-strategy --yes
@@ -84842,13 +84859,13 @@ Examples:
84842
84859
  Without --yes and with an interactive terminal, asks [y/N] before each of the
84843
84860
  3 steps (strategy, harness, workspace) \u2014 declining one skips just that step
84844
84861
  and moves to the next. Without an interactive terminal, runs all 3 steps
84845
- without prompting even if --yes wasn't passed (there is no terminal to ask in).`).action(async c=>{let u=await ih({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",`
84862
+ without prompting even if --yes wasn't passed (there is no terminal to ask in).`).action(async c=>{let u=await ch({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",`
84846
84863
  Examples:
84847
84864
  $ flow plugin list
84848
84865
  $ flow plugin list --available
84849
84866
  $ flow plugin list --outdated
84850
84867
  $ flow plugin list --json
84851
- $ flow plugin list --available --source flow-harness`).action(async c=>{let u=await Og(c);G(u);}),t.command("install").description("Install one or more plugins from the Findr catalog into Claude Code").argument("<name...>","Name(s) of the plugin(s) to install (space-separated)").option("--force","Reinstall even if the version is already installed").option("--verbose","Display each step of the installation process").option("--silent","Output in JSON only").option("--marketplace-source <source>","GitHub source (owner/repo) for marketplace auto-add when installing external plugins").option("--source <name>","Named content source to install from (e.g. flow-harness); defaults to the standard catalog").addOption(new Option("--scope <scope>","Scope to install into: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84868
+ $ flow plugin list --available --source flow-harness`).action(async c=>{let u=await jg(c);G(u);}),t.command("install").description("Install one or more plugins from the Findr catalog into Claude Code").argument("<name...>","Name(s) of the plugin(s) to install (space-separated)").option("--force","Reinstall even if the version is already installed").option("--verbose","Display each step of the installation process").option("--silent","Output in JSON only").option("--marketplace-source <source>","GitHub source (owner/repo) for marketplace auto-add when installing external plugins").option("--source <name>","Named content source to install from (e.g. flow-harness); defaults to the standard catalog").addOption(new Option("--scope <scope>","Scope to install into: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
84852
84869
  Examples:
84853
84870
  $ flow plugin install flow-adr-writer
84854
84871
  $ flow plugin install flow-adr-writer --scope project
@@ -84861,7 +84878,7 @@ Examples:
84861
84878
  Examples:
84862
84879
  $ flow plugin uninstall flow-adr-writer
84863
84880
  $ flow plugin uninstall flow-adr-writer --scope project
84864
- $ flow plugin uninstall startup-pack-ai --force`).action(async(c,u)=>{let m=await _s(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",`
84881
+ $ 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",`
84865
84882
  Examples:
84866
84883
  $ flow plugin update flow-adr-writer
84867
84884
  $ flow plugin update flow-adr-writer --scope project
@@ -84870,79 +84887,79 @@ Examples:
84870
84887
  $ flow plugin update flow-adr-writer --verbose
84871
84888
  $ flow plugin update flow-adr-writer --silent
84872
84889
  $ flow plugin update
84873
- $ flow plugin update --dry-run`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let m=await jg(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",`
84890
+ $ flow plugin update --dry-run`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let m=await Jg(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",`
84874
84891
  Examples:
84875
84892
  $ flow plugin enable flow-adr-writer
84876
- $ flow plugin enable flow-adr-writer --scope project`).action(async(c,u)=>{Qe("cli");let m=await Ng(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",`
84893
+ $ flow plugin enable flow-adr-writer --scope project`).action(async(c,u)=>{Qe("cli");let m=await Ug(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",`
84877
84894
  Examples:
84878
84895
  $ flow plugin disable flow-adr-writer
84879
- $ flow plugin disable flow-adr-writer --scope project`).action(async(c,u)=>{Qe("cli");let m=await Gg(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",`
84896
+ $ flow plugin disable flow-adr-writer --scope project`).action(async(c,u)=>{Qe("cli");let m=await zg(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",`
84880
84897
  Examples:
84881
84898
  $ flow plugin export
84882
- $ flow plugin export --output my-plugins.json`).action(async c=>{let u=await Pf(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",`
84899
+ $ flow plugin export --output my-plugins.json`).action(async c=>{let u=await Cf(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",`
84883
84900
  Examples:
84884
84901
  $ flow plugin import flow-plugins.json
84885
84902
  $ flow plugin import flow-plugins.json --scope user
84886
84903
  $ flow plugin import flow-plugins.json --force
84887
84904
  $ flow plugin import flow-plugins.json --dry-run
84888
- $ flow plugin import flow-plugins.json --diff`).action(async(c,u)=>{let m=await Df(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",`
84905
+ $ flow plugin import flow-plugins.json --diff`).action(async(c,u)=>{let m=await Rf(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",`
84889
84906
  Examples:
84890
84907
  $ flow plugin marketplace add anthropics/claude-code
84891
84908
  $ flow plugin marketplace add https://github.com/owner/repo
84892
84909
  $ flow plugin marketplace add anthropics/claude-code --force
84893
- $ flow plugin marketplace add anthropics/claude-code --silent`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let m=await Wg(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",`
84910
+ $ flow plugin marketplace add anthropics/claude-code --silent`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let m=await Vg(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",`
84894
84911
  Examples:
84895
84912
  $ flow mcp add notion --transport http https://mcp.notion.com/mcp
84896
84913
  $ flow mcp add mcp-chrome --transport stdio uvx mcp-chrome
84897
84914
  $ flow mcp add playwright-mcp --transport stdio uvx playwright-mcp --force
84898
- $ flow mcp add notion --transport http https://mcp.notion.com/mcp --scope project`).action(async(c,u,m)=>{Qe("cli",{verbose:m.verbose,silent:m.silent});let p=await dm(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",`
84915
+ $ flow mcp add notion --transport http https://mcp.notion.com/mcp --scope project`).action(async(c,u,m)=>{Qe("cli",{verbose:m.verbose,silent:m.silent});let p=await pm(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",`
84899
84916
  Examples:
84900
84917
  $ flow mcp remove notion
84901
84918
  $ flow mcp remove notion --scope project
84902
- $ flow mcp remove playwright-mcp --force`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let m=await cm(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",`
84919
+ $ flow mcp remove playwright-mcp --force`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose,silent:u.silent});let m=await mm(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",`
84903
84920
  Examples:
84904
84921
  $ flow auth login
84905
84922
  $ flow auth login --jwt <token>
84906
84923
  $ flow auth login --jwt <token> --starter-kit dev
84907
84924
  $ flow auth login --jwt <token> --custom-email name@example.com
84908
- $ flow auth login --verbose`).action(async c=>{Qe("cli",{verbose:c.verbose});let u=await bc(c);G(u);}),s.command("logout").description("Remove locally saved credentials").option("--force","Skip interactive confirmation").addHelpText("after",`
84925
+ $ flow auth login --verbose`).action(async c=>{Qe("cli",{verbose:c.verbose});let u=await kc(c);G(u);}),s.command("logout").description("Remove locally saved credentials").option("--force","Skip interactive confirmation").addHelpText("after",`
84909
84926
  Examples:
84910
84927
  $ flow auth logout
84911
- $ flow auth logout --force`).action(async c=>{let u=await Tg(c.force);G(u);}),s.command("status").description("Display the current authentication status").addHelpText("after",`
84928
+ $ flow auth logout --force`).action(async c=>{let u=await Fg(c.force);G(u);}),s.command("status").description("Display the current authentication status").addHelpText("after",`
84912
84929
  Examples:
84913
- $ flow auth status`).action(async()=>{let c=await Mg();G(c);}),a.addCommand(s);let n=new Command("skills").description("Manage skills for Claude Code from GitHub repositories or local paths");n.command("add").description("Install skills from a GitHub repo or local path into Claude Code").argument("<source>","GitHub repo (owner/repo), URL, or local path").option("-g, --global","Install globally (~/.claude/skills/)").option("-s, --skill <names...>","Install only specific skills by name").option("-y, --yes","Skip confirmation prompts").option("--list","List available skills without installing").addHelpText("after",`
84930
+ $ flow auth status`).action(async()=>{let c=await Og();G(c);}),a.addCommand(s);let n=new Command("skills").description("Manage skills for Claude Code from GitHub repositories or local paths");n.command("add").description("Install skills from a GitHub repo or local path into Claude Code").argument("<source>","GitHub repo (owner/repo), URL, or local path").option("-g, --global","Install globally (~/.claude/skills/)").option("-s, --skill <names...>","Install only specific skills by name").option("-y, --yes","Skip confirmation prompts").option("--list","List available skills without installing").addHelpText("after",`
84914
84931
  Examples:
84915
84932
  $ flow skills add vercel-labs/agent-skills
84916
84933
  $ flow skills add owner/repo -g
84917
84934
  $ flow skills add owner/repo --skill pr-review commit
84918
84935
  $ flow skills add ./local/skills -y
84919
- $ flow skills add owner/repo --list`).action(async(c,u)=>{let m=await ff(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",`
84936
+ $ flow skills add owner/repo --list`).action(async(c,u)=>{let m=await yf(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",`
84920
84937
  Examples:
84921
84938
  $ flow skills list
84922
84939
  $ flow skills list -g
84923
- $ flow skills list --json`).action(async c=>{let u=await bf(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",`
84940
+ $ flow skills list --json`).action(async c=>{let u=await Pf(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",`
84924
84941
  Examples:
84925
84942
  $ flow skills remove pr-review
84926
- $ flow skills remove pr-review -g --force`).action(async(c,u)=>{let m=await vf(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",`
84943
+ $ flow skills remove pr-review -g --force`).action(async(c,u)=>{let m=await Df(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",`
84927
84944
  Examples:
84928
84945
  $ flow bundle install "My React Kit"
84929
84946
  $ flow bundle install "Squad Setup Bundle"
84930
- $ flow bundle install "My React Kit" --verbose`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose});let m=await Ug(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",`
84947
+ $ flow bundle install "My React Kit" --verbose`).action(async(c,u)=>{Qe("cli",{verbose:u.verbose});let m=await Hg(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",`
84931
84948
  Examples:
84932
84949
  $ flow health
84933
- $ flow health --fix`).action(async c=>{let u=await Jg(c);G(u);}),a.command("usage").description("Show your current Flow budget usage").option("--json","output as JSON",false).addHelpText("after",`
84950
+ $ flow health --fix`).action(async c=>{let u=await _g(c);G(u);}),a.command("usage").description("Show your current Flow budget usage").option("--json","output as JSON",false).addHelpText("after",`
84934
84951
  Examples:
84935
84952
  $ flow usage
84936
- $ flow usage --json`).action(async c=>{let u=await Kg(c);G(u);});let l=new Command("modules").description("Manage Flow modules (binary companions for Claude Code)");l.action(async()=>{let c=await Sc();G(c);}),l.command("list").description("List available and installed modules").addHelpText("after",`
84953
+ $ flow usage --json`).action(async c=>{let u=await ef(c);G(u);});let l=new Command("modules").description("Manage Flow modules (binary companions for Claude Code)");l.action(async()=>{let c=await Ac();G(c);}),l.command("list").description("List available and installed modules").addHelpText("after",`
84937
84954
  Examples:
84938
- $ flow modules list`).action(async()=>{let c=await Sc();G(c);}),l.command("install").description("Install a module by alias").argument("<alias>","Module alias to install (e.g. metrics, dashboard)").addHelpText("after",`
84955
+ $ flow modules list`).action(async()=>{let c=await Ac();G(c);}),l.command("install").description("Install a module by alias").argument("<alias>","Module alias to install (e.g. metrics, dashboard)").addHelpText("after",`
84939
84956
  Examples:
84940
84957
  $ flow modules install metrics
84941
- $ flow modules install dashboard`).action(async c=>{let u=await xf(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",`
84958
+ $ flow modules install dashboard`).action(async c=>{let u=await Mf(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",`
84942
84959
  Examples:
84943
84960
  $ flow modules update
84944
- $ flow modules update metrics`).action(async c=>{let u=await Ef(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 Cf(c.alias,u);});return a.hook("preAction",()=>{Gs();}),a}I();function hC(){return de__default.join(Ce__default.homedir(),".claude","settings.json")}function dh(){let e=hC();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 DC=P("updateChecker"),wC=promisify(execFile),SC=1440*60*1e3,ch=3e4;function CC(){let e=process.env.FLOW_HOME??de__default.join(Ce__default.homedir(),".flow");return de__default.join(e,"update.lock")}async function lh(e){try{let{stdout:a}=await wC(Ya(),["view",e,"version"],{timeout:ch,shell:process.platform==="win32"});return String(a).trim()||null}catch{return null}}async function RC(e){let a=new AbortController,o=setTimeout(()=>a.abort(),ch);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 AC(e){return e.versionCheck.type==="npm-registry"?lh(e.versionCheck.package):RC(e.versionCheck.repo)}async function xC(){let e=await lh("@ciandt-flow/cli");return e&&ze(te,e)?(Js({currentVersion:te,latestVersion:e,isOutdated:true,packageName:"@ciandt-flow/cli"}).catch(()=>{}),e):null}async function EC(){let e=at().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<SC)return;let i=await AC(o);try{await Pa({...a,lastChecked:new Date().toISOString()});}catch(s){DC.warn(`Failed to update lastChecked for ${a.alias}: ${String(s)}`);}i&&a.installedVersion&&ze(a.installedVersion,i)&&Wi(o,"background").catch(()=>{});}));}async function Wc(){let e=dh();if(e===false)return;let a=CC();se__default.mkdirSync(de__default.dirname(a),{recursive:true});let o=null;try{o=await Nb.lock(a,{realpath:!1,retries:0});}catch{return}try{if(e!=="modules-only"){let t=await xC().catch(()=>null);t&&process.stdout.write(`
84961
+ $ flow modules update metrics`).action(async c=>{let u=await qf(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 Ef(c.alias,u);});return a.hook("preAction",()=>{Bs();}),a}I();function kC(){return de__default.join(Ce__default.homedir(),".claude","settings.json")}function ph(){let e=kC();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 RC=P("updateChecker"),AC=promisify(execFile),xC=1440*60*1e3,mh=3e4;function EC(){let e=process.env.FLOW_HOME??de__default.join(Ce__default.homedir(),".flow");return de__default.join(e,"update.lock")}async function gh(e){try{let{stdout:a}=await AC(Ya(),["view",e,"version"],{timeout:mh,shell:process.platform==="win32"});return String(a).trim()||null}catch{return null}}async function IC(e){let a=new AbortController,o=setTimeout(()=>a.abort(),mh);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 TC(e){return e.versionCheck.type==="npm-registry"?gh(e.versionCheck.package):IC(e.versionCheck.repo)}async function MC(){let e=await gh("@ciandt-flow/cli");return e&&ze(re,e)?(Hs({currentVersion:re,latestVersion:e,isOutdated:true,packageName:"@ciandt-flow/cli"}).catch(()=>{}),e):null}async function qC(){let e=at().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<xC)return;let i=await TC(o);try{await Pa({...a,lastChecked:new Date().toISOString()});}catch(s){RC.warn(`Failed to update lastChecked for ${a.alias}: ${String(s)}`);}i&&a.installedVersion&&ze(a.installedVersion,i)&&Ji(o,"background").catch(()=>{});}));}async function Vc(){let e=ph();if(e===false)return;let a=EC();se__default.mkdirSync(de__default.dirname(a),{recursive:true});let o=null;try{o=await Ub.lock(a,{realpath:!1,retries:0});}catch{return}try{if(e!=="modules-only"){let t=await MC().catch(()=>null);t&&process.stdout.write(`
84945
84962
  \u26A0 @ciandt-flow/cli v${t} installing in background.
84946
84963
  Restart flow to apply the update.
84947
84964
 
84948
- `);}await EC().catch(()=>{});}finally{await o().catch(()=>{});}}var TC=P("cli"),Jc=sh(async()=>{Qe("tui"),Cl("tui"),Rl(),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 Wc().catch(()=>{}),await Ju().catch(a=>{TC.error(`Failed to init catalog registry: ${String(a)}`);}),await kg();let{waitUntilExit:e}=render(jsx(Pg,{}),{alternateScreen:true,exitOnCtrlC:false});await e(),process.exit(0);});Jc.hook("preAction",async(e,a)=>{a!==Jc&&await Wc().catch(()=>{});});Jc.parse();
84965
+ `);}await qC().catch(()=>{});}finally{await o().catch(()=>{});}}var FC=P("cli"),_c=lh(async()=>{Qe("tui"),El("tui"),Il(),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 Vc().catch(()=>{}),await _u().catch(a=>{FC.error(`Failed to init catalog registry: ${String(a)}`);}),await Sg();let{waitUntilExit:e}=render(jsx(Cg,{}),{alternateScreen:true,exitOnCtrlC:false});await e(),process.exit(0);});_c.hook("preAction",async(e,a)=>{a!==_c&&await Vc().catch(()=>{});});_c.parse();