@ciandt-flow/cli 2.9.0-beta.25 → 2.9.0-beta.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +201 -156
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as
|
|
3
|
-
`;try{
|
|
4
|
-
`);}formatTui(t){return `[flow:${t.module}] ${t.message}`}formatCli(t){let r=String(t.timestamp.getHours()).padStart(2,"0"),n=String(t.timestamp.getMinutes()).padStart(2,"0"),o=String(t.timestamp.getSeconds()).padStart(2,"0");return `[${r}:${n}:${o}] [${t.level.toUpperCase()}] ${t.message}`}};});var
|
|
5
|
-
`);}};});function
|
|
6
|
-
`));}function P(e){process.stderr.write(T.red(` \u2717 ${
|
|
7
|
-
`));}function b(e){process.stdout.write(T.cyan(` \u2139 ${
|
|
8
|
-
`));}function
|
|
2
|
+
import*as yn from'crypto';import {randomUUID,createHash}from'crypto';import*as Me from'os';import Me__default,{tmpdir,homedir}from'os';import*as Ie from'path';import Ie__default,{join,dirname,basename,normalize,resolve,sep,relative,isAbsolute}from'path';import*as ve from'fs';import ve__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 T from'chalk';import*as hl from'readline';import {createInterface}from'readline';import va from'conf';import Sd,{HTTPError}from'ky';import {StatusCodes}from'http-status-codes';import {execa}from'execa';import {Box,Text,render,useWindowSize,useInput,useApp}from'ink';import Gy,{useRef,useCallback,useMemo,useEffect,useState}from'react';import {create}from'zustand';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import ry from'jsonwebtoken';import fy from'proper-lockfile';import Uy from'ink-big-text';import hp from'ink-spinner';import*as Ut from'fs/promises';import {readFile,mkdir,writeFile,rename,stat,rm,mkdtemp,readdir,cp}from'fs/promises';import Jw from'unzipper';import {simpleGit,CheckRepoActions}from'simple-git';import kl from'semver';import rc from'yocto-spinner';import {Command,Option}from'commander';import {parse,stringify}from'yaml';var zg=Object.defineProperty;var J=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Ec=(e,t)=>{for(var r in t)zg(e,r,{get:t[r],enumerable:true});};var pr,le,Qi,so,dn,pn,Pc,ea,Wt,ce,et,zt,rs,mn,fn,gn,hn,j=J(()=>{"use strict";pr="FLOW",le="flow-skills",Qi="flow-cli",so="internal",dn="external",pn={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"},plugin:{label:"Plugin",color:"magenta"}},Pc={internal:{label:"Flow",color:"blue"},external:{label:"External",color:"white"}},ea=new Set(["internal","external"]),Wt={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"}},ce="flow-claude-md-setup",et=5,zt=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,rs="https://flow.ciandt.com",mn=/^https:\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.ciandt\.com\/?$/,fn="Must be a valid CI&T domain (e.g. https://tenant.ciandt.com)",gn=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,hn="Must be a valid email address (e.g. name@example.com)";});var ns,qg,Cc,io,ta=J(()=>{"use strict";ns="aes-256-gcm",qg=16,Cc=16,io=class{key;constructor(t){if(t.length!==32)throw new Error(`Invalid key length: expected 32 bytes, got ${t.length}`);this.key=t;}encrypt(t){let r=yn.randomBytes(qg),n=yn.createCipheriv(ns,this.key,r,{authTagLength:Cc}),o=Buffer.concat([n.update(t,"utf8"),n.final()]),s=n.getAuthTag();return {iv:r.toString("hex"),authTag:s.toString("hex"),ciphertext:o.toString("hex"),algorithm:ns}}decrypt(t){if(t.algorithm!==ns)throw new Error(`Unsupported encryption algorithm: ${t.algorithm}`);let r=yn.createDecipheriv(ns,this.key,Buffer.from(t.iv,"hex"),{authTagLength:Cc});return r.setAuthTag(Buffer.from(t.authTag,"hex")),Buffer.concat([r.update(Buffer.from(t.ciphertext,"hex")),r.final()]).toString("utf8")}};});function ra(e){return e.replace(eh,"").replace(th,"").replace(rh,"").replace(Yg,"Bearer ***").replace(Zg,"***").replace(Qg,"***").replace(/\r\n|\r|\n/g,"\\n")}var Yg,Zg,Qg,eh,th,rh,na=J(()=>{"use strict";Yg=/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,Zg=/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_-]*)?/g,Qg=/[A-Za-z0-9+/]{40,}={0,2}/g,eh=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|\x1b\x1b)/g,th=/\x1b(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,rh=/\x1b/g;});function ss(e){return e||le}function kc(e,t,r){return sa(ss(r),e,t)}function oa(e,t){return Ie.join(Me.homedir(),Br,"plugins","marketplaces",ss(t),"plugins","native",e)}function is(e){return Ie.join(Me.homedir(),Br,"plugins","marketplaces",ss(e),".claude-plugin","marketplace.json")}function Fr(){return Ie.join(Me.homedir(),Br,"plugins","known_marketplaces.json")}function Ac(e){return Ie.join(Me.homedir(),Br,"plugins","marketplaces",ss(e))}function Rc(){return Ie.join(Me.homedir(),os,"cache","install.lock")}function $c(){return Ie.join(Me.homedir(),os,"logs","flowsetup.log")}function sa(e,t,r){return Ie.join(Me.homedir(),Br,"plugins","cache",e,t,r)}function jr(e){let t=e==="global"?Me.homedir():process.cwd();return Ie.join(t,".claude","skills")}function ao(e){let t=e==="global"?Me.homedir():process.cwd();return Ie.join(t,".claude","skills-lock.json")}function as(e="user"){return e==="project"?Ie.join(process.cwd(),".opencode","plugins"):Ie.join(Me.homedir(),".config","opencode","plugins")}function Lc(){return Ie.join(Me.homedir(),os,"flow-catalogs.json")}function Mc(){let e=process.env.FLOW_HOME??Ie.join(Me.homedir(),os);return Ie.join(e,"config.json")}function ls(e="user"){return e==="project"||e==="local"?Ie.join(process.cwd(),Br,"agents"):Ie.join(Me.homedir(),Br,"agents")}var Br,os,Je=J(()=>{"use strict";j();Br=".claude",os=".flow";});var nh,oh,cs,_c=J(()=>{"use strict";Je();nh=5*1024*1024,oh=3,cs=class{filePath;constructor(){this.filePath=$c(),this.ensureDir(),this.rotateIfNeeded();}write(t){let r=`[${t.timestamp.toISOString()}] [${t.level.toUpperCase()}] [${t.module}] ${t.message}
|
|
3
|
+
`;try{ve.appendFileSync(this.filePath,r,"utf-8");}catch{}}ensureDir(){try{let t=Ie.dirname(this.filePath);ve.mkdirSync(t,{recursive:!0});}catch{}}rotateIfNeeded(){try{if(ve.statSync(this.filePath).size>nh){let r=new Date().toISOString().replace(/[:.]/g,"-"),n=this.filePath.replace(".log",`-${r}.log`);ve.renameSync(this.filePath,n),this.cleanOldBackups();}}catch{}}cleanOldBackups(){try{let t=Ie.dirname(this.filePath),r=Ie.basename(this.filePath,".log"),n=ve.readdirSync(t).filter(o=>o.startsWith(r+"-")&&o.endsWith(".log")).sort().reverse();for(let o of n.slice(oh))ve.unlinkSync(Ie.join(t,o));}catch{}}};});var us,Dc=J(()=>{"use strict";us=class{context;constructor(t){this.context=t;}write(t){let r=this.context==="tui"?this.formatTui(t):this.formatCli(t);process.stderr.write(r+`
|
|
4
|
+
`);}formatTui(t){return `[flow:${t.module}] ${t.message}`}formatCli(t){let r=String(t.timestamp.getHours()).padStart(2,"0"),n=String(t.timestamp.getMinutes()).padStart(2,"0"),o=String(t.timestamp.getSeconds()).padStart(2,"0");return `[${r}:${n}:${o}] [${t.level.toUpperCase()}] ${t.message}`}};});var ds,Oc=J(()=>{"use strict";ds=class{write(t){process.stdout.write(t.message+`
|
|
5
|
+
`);}};});function aa(){return ps}function Uc(e){return ia.add(e),()=>{ia.delete(e);}}var ps,ia,ms,la=J(()=>{"use strict";ps=[],ia=new Set;ms=class{write(t){ps.push(t),ps.length>100&&ps.shift();for(let r of ia)r();}};});function sh(){let e=process.env.DEBUG;if(!e)return null;let t=e.split(",").map(n=>n.trim()).filter(Boolean);for(let n of t)if(n==="flow:*")return "all";let r=new Set;for(let n of t)n.startsWith("flow:")&&r.add(n.slice(5));return r.size>0?r:null}function Ge(e,t){if(e==="tui"){let r=sh();Vr={context:e,transports:[new ms,new cs],minLevel:r?"debug":"warn",debugModules:r};}else t?.silent?Vr={context:e,transports:[],minLevel:"error",debugModules:null}:t?.verbose?Vr={context:e,transports:[new us("cli")],minLevel:"debug",debugModules:null}:Vr={context:e,transports:[new ds],minLevel:"info",debugModules:null};}function Nc(){return Vr.transports}function Bc(e,t){let{debugModules:r,minLevel:n}=Vr;return Vr.context==="tui"&&r&&r!=="all"?r.has(t)?wn[e]>=wn.debug:wn[e]>=wn.warn:wn[e]>=wn[n]}var wn,Vr,ca=J(()=>{"use strict";_c();Dc();Oc();la();wn={debug:0,info:1,warn:2,error:3},Vr={context:"cli",transports:[],minLevel:"warn",debugModules:null};});function fs(e,t,r){if(!Bc(e,t))return;let n={level:e,module:t,message:ra(r),timestamp:new Date};for(let o of Nc())o.write(n);}function x(e){let t=Fc.get(e);if(t)return t;let r={debug:n=>fs("debug",e,n),info:n=>fs("info",e,n),warn:n=>fs("warn",e,n),error:n=>fs("error",e,n)};return Fc.set(e,r),r}var Fc,jc=J(()=>{"use strict";na();ca();Fc=new Map;});var R=J(()=>{"use strict";jc();ca();na();});function ih(e){return typeof e=="object"&&e!==null&&da in e&&e[da]===true}function pa(e){return {serialize(t){let r=JSON.stringify(t),n=e.encrypt(r),o={[da]:true,envelope:n};return JSON.stringify(o,null," ")},deserialize(t){let r;try{r=JSON.parse(t);}catch{return ua.warn("[encryption] Config file contains unparseable data, treating as empty"),{}}if(ih(r))try{let n=e.decrypt(r.envelope);return JSON.parse(n)}catch(n){return ua.error(`[encryption] Decryption failed: ${n instanceof Error?n.message:"unknown error"}. Config will be treated as empty. Re-authentication may be required.`),{}}return ua.info("[encryption] Detected plaintext config \u2014 will encrypt on next write"),r}}}var ua,da,ma=J(()=>{"use strict";R();ua=x("encryption"),da="__encrypted__";});var fa,ch,ft,Sn,ga=J(()=>{"use strict";R();fa=promisify(execFile),ch=promisify(exec),ft=x("encryption:macos-keyvault"),Sn=class{static async isAvailable(){try{let{stdout:t}=await ch("command -v security");return ft.debug(`security binary found at: ${t.trim()}`),!0}catch{return ft.debug("security binary not found in PATH"),!1}}async getSecret(t,r){try{ft.debug(`Looking up secret: service=${t}, account=${r}`);let{stdout:n}=await fa("security",["find-generic-password","-w","-a",r,"-s",t]),o=n.trim();return ft.debug(`security find-generic-password result: ${o?"found":"empty"}`),o||null}catch(n){let o=n;return ft.debug(`security find-generic-password failed: code=${o.code}, stderr=${o.stderr?.trim()}, message=${o.message}`),null}}async setSecret(t,r,n){try{ft.debug(`Storing secret: service=${t}, account=${r}`),await fa("security",["add-generic-password","-U","-a",r,"-s",t,"-w",n]),ft.debug("security add-generic-password succeeded");}catch(o){let s=o;throw ft.error(`security add-generic-password failed: code=${s.code}, stderr=${s.stderr?.trim()}, message=${s.message}`),o}}async deleteSecret(t,r){try{return ft.debug(`Deleting secret: service=${t}, account=${r}`),await fa("security",["delete-generic-password","-a",r,"-s",t]),ft.debug("security delete-generic-password succeeded"),!0}catch(n){let o=n;return ft.debug(`security delete-generic-password failed: code=${o.code}, stderr=${o.stderr?.trim()}, message=${o.message}`),!1}}getStoragePath(){return "macOS Keychain (security)"}};});function y(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 q(e){process.stdout.write(T.green(` \u2713 ${y(e)}
|
|
6
|
+
`));}function P(e){process.stderr.write(T.red(` \u2717 ${y(e)}
|
|
7
|
+
`));}function b(e){process.stdout.write(T.cyan(` \u2139 ${y(e)}
|
|
8
|
+
`));}function xn(e,t){let r=t.map(a=>a.map(y)),n=[e,...r],o=e.map((a,l)=>Math.max(...n.map(u=>(u[l]??"").length))),s=o.map(a=>"\u2500".repeat(a)).join(" "),i=a=>a.map((l,u)=>l.padEnd(o[u])).join(" ");process.stdout.write(`
|
|
9
9
|
`),process.stdout.write(` ${T.bold(i(e))}
|
|
10
10
|
`),process.stdout.write(` ${T.dim(s)}
|
|
11
11
|
`);for(let a of r)process.stdout.write(` ${i(a)}
|
|
12
12
|
`);process.stdout.write(`
|
|
13
|
-
`);}function
|
|
14
|
-
`);}function
|
|
15
|
-
`);}function
|
|
16
|
-
`);}function
|
|
17
|
-
${
|
|
13
|
+
`);}function mr(e){process.stdout.write(JSON.stringify(e,null,2)+`
|
|
14
|
+
`);}function Se(e){process.stdout.write(JSON.stringify(e)+`
|
|
15
|
+
`);}function _e(e){process.stderr.write(JSON.stringify(e)+`
|
|
16
|
+
`);}function Y(e){return e instanceof Error?e.message:String(e)}function At(e){let t=new Date(e);return isNaN(t.getTime())?"\u2014":new Intl.DateTimeFormat("en-US",{dateStyle:"short"}).format(t)}var F=J(()=>{"use strict";});async function fh(e,t){let r=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],n=0,o=setInterval(()=>{process.stderr.write(`\r${r[n++%r.length]} ${e}`);},80);try{return await t()}finally{clearInterval(o),process.stderr.write("\r\x1B[2K");}}function gh(e){let t=hl.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(y(e),n=>{t.close(),r(n.trim().toLowerCase());});})}var ha,ya,mh,re,fr,wa=J(()=>{"use strict";R();F();ha=promisify(execFile),ya=promisify(exec),mh=[{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"}],re=x("encryption:linux-keyvault");fr=class e{static async isAvailable(){try{let{stdout:t}=await ya("command -v secret-tool");re.debug(`secret-tool found at: ${t.trim()}`);}catch{return re.debug("secret-tool binary not found in PATH"),!1}try{return await ha("secret-tool",["lookup","service","__flow_connectivity_check__"]),re.debug("Secret Service D-Bus connectivity check passed"),!0}catch(t){let n=t.stderr?.trim()??"";return n.includes("org.freedesktop.secrets")?(re.debug(`Secret Service D-Bus not available: ${n}`),!1):(re.debug("secret-tool is available and D-Bus service is reachable"),!0)}}static async detectPackageManager(){for(let t of mh)try{return await ya(`command -v ${t.name}`),t}catch{}return null}static async ensureInstalled(){if(await e.isAvailable())return !0;re.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 t=await e.detectPackageManager();if(!t)return re.warn("Could not detect a supported package manager. Please install libsecret manually."),!1;let r=await gh(" ? Install secret-tool? This requires sudo. (y/N) ");if(r!=="y"&&r!=="yes")return !1;try{return re.info(`Running: ${t.command}`),await fh("Installing secret-tool...",()=>ya(t.command)),e.isAvailable()}catch{return re.warn("Installation failed. Falling back to derived key."),!1}}async getSecret(t,r){try{re.debug(`Looking up secret: service=${t}, account=${r}`);let{stdout:n}=await ha("secret-tool",["lookup","service",t,"account",r]),o=n.trim();return re.debug(`secret-tool lookup result: ${o?"found":"empty"}`),o||null}catch(n){let o=n;return re.debug(`secret-tool lookup failed: code=${o.code}, stderr=${o.stderr?.trim()}, message=${o.message}`),null}}async setSecret(t,r,n){re.debug(`Storing secret: service=${t}, account=${r}`),re.debug(`Environment: DBUS_SESSION_BUS_ADDRESS=${process.env.DBUS_SESSION_BUS_ADDRESS??"NOT SET"}`),re.debug(`Environment: DISPLAY=${process.env.DISPLAY??"NOT SET"}, WAYLAND_DISPLAY=${process.env.WAYLAND_DISPLAY??"NOT SET"}`),re.debug(`Environment: WSL_DISTRO_NAME=${process.env.WSL_DISTRO_NAME??"NOT SET"}`),await new Promise((o,s)=>{let i=spawn("secret-tool",["store","--label",t,"service",t,"account",r]),a="";i.stderr.on("data",l=>{a+=l.toString();}),i.stdin.end(n,"utf8"),i.on("close",l=>{l===0?(re.debug("secret-tool store succeeded"),o()):(re.error(`secret-tool store failed: code=${l}, stderr=${a.trim()}`),s(new Error(`secret-tool exited with code ${l}${a?`: ${a.trim()}`:""}`)));}),i.on("error",l=>{re.error(`secret-tool store spawn error: ${l.message}`),s(l);});});}async deleteSecret(t,r){try{return re.debug(`Deleting secret: service=${t}, account=${r}`),await ha("secret-tool",["clear","service",t,"account",r]),re.debug("secret-tool clear succeeded"),!0}catch(n){let o=n;return re.debug(`secret-tool clear failed: code=${o.code}, stderr=${o.stderr?.trim()}, message=${o.message}`),!1}}getStoragePath(){return "Linux Secret Service (secret-tool)"}};});function xa(e,t){return `${e}:${t}`}function co(e){return e.replace(/'/g,"''")}function gs(e){return ["-NoProfile","-NonInteractive","-Command",e]}function Ih(e){return `Add-Type -TypeDefinition @'
|
|
17
|
+
${ba}
|
|
18
18
|
'@
|
|
19
|
-
[FlowCredManager]::Read('${
|
|
20
|
-
${
|
|
19
|
+
[FlowCredManager]::Read('${co(e)}')`}function vh(e,t,r){return `Add-Type -TypeDefinition @'
|
|
20
|
+
${ba}
|
|
21
21
|
'@
|
|
22
|
-
[FlowCredManager]::Write('${
|
|
23
|
-
${
|
|
22
|
+
[FlowCredManager]::Write('${co(e)}', '${co(t)}', '${co(r)}')`}function Eh(e){return `Add-Type -TypeDefinition @'
|
|
23
|
+
${ba}
|
|
24
24
|
'@
|
|
25
|
-
[FlowCredManager]::Delete('${
|
|
25
|
+
[FlowCredManager]::Delete('${co(e)}')`}async function hs(e){return wh("powershell.exe",e)}var wh,gt,Sa,Sh,xh,bh,ba,bn,Ia=J(()=>{"use strict";R();wh=promisify(execFile),gt=x("encryption:windows-keyvault"),Sa=1,Sh=1,xh=2,bh=3;ba=`
|
|
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, ${
|
|
61
|
+
if (!CredRead(target, ${Sa}, 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[] { ${
|
|
75
|
+
int[] persistLevels = new int[] { ${xh}, ${bh}, ${Sh} };
|
|
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 = ${
|
|
83
|
+
cred.Type = ${Sa};
|
|
84
84
|
cred.TargetName = targetPtr;
|
|
85
85
|
cred.CredentialBlobSize = bytes.Length;
|
|
86
86
|
cred.CredentialBlob = blobPtr;
|
|
@@ -98,172 +98,172 @@ public class FlowCredManager {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
public static bool Delete(string target) {
|
|
101
|
-
return CredDelete(target, ${
|
|
101
|
+
return CredDelete(target, ${Sa}, 0);
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
`;
|
|
105
|
-
`)[0]:"unknown error";return gt.debug(`PowerShell not available: ${r}`),!1}}async getSecret(t,r){try{let n=
|
|
106
|
-
`)[0]:"unknown error";return gt.error(`Failed to read secret from Windows Credential Manager [service="${t}", account="${r}"]: ${o}`),null}}async setSecret(t,r,n){try{let o=
|
|
107
|
-
`)[0]:"unknown error",i=`Failed to store secret in Windows Credential Manager [service="${t}", account="${r}"]: ${s}`;throw gt.error(i),new Error(i)}}async deleteSecret(t,r){try{let n=
|
|
108
|
-
`)[0]:"unknown error";return gt.debug(`Failed to delete secret from Windows Credential Manager [service="${t}", account="${r}"]: ${o}`),!1}}getStoragePath(){return "Windows Credential Manager (PowerShell)"}};});function
|
|
104
|
+
`;bn=class{static async isAvailable(){try{let{stdout:t}=await hs(gs('Write-Output "ok"')),r=t.trim()==="ok";return gt.debug(`PowerShell availability check: ${r?"available":"unexpected output"}`),r}catch(t){let r=t instanceof Error?t.message.split(`
|
|
105
|
+
`)[0]:"unknown error";return gt.debug(`PowerShell not available: ${r}`),!1}}async getSecret(t,r){try{let n=xa(t,r);gt.debug(`Looking up secret: target=${n}`);let o=Ih(n),{stdout:s}=await hs(gs(o)),i=s.trim();return gt.debug(`CredRead result: ${i?"found":"empty"}`),i||null}catch(n){let o=n instanceof Error?n.message.split(`
|
|
106
|
+
`)[0]:"unknown error";return gt.error(`Failed to read secret from Windows Credential Manager [service="${t}", account="${r}"]: ${o}`),null}}async setSecret(t,r,n){try{let o=xa(t,r);gt.debug(`Storing secret: target=${o}`);let s=vh(o,n,r),{stdout:i}=await hs(gs(s)),a=i.trim();if(a.startsWith("OK:")){let u=a.split(":")[1];gt.debug(`CredWrite succeeded (persist=${u})`);return}let l=a.startsWith("ERR:")?a.split(":")[1]:"unknown";throw new Error(`CredWrite failed with Win32 error ${l}`)}catch(o){let s=o instanceof Error?o.message.split(`
|
|
107
|
+
`)[0]:"unknown error",i=`Failed to store secret in Windows Credential Manager [service="${t}", account="${r}"]: ${s}`;throw gt.error(i),new Error(i)}}async deleteSecret(t,r){try{let n=xa(t,r);gt.debug(`Deleting secret: target=${n}`);let o=Eh(n),{stdout:s}=await hs(gs(o)),i=s.trim()==="True";return gt.debug(`CredDelete result: ${i}`),i}catch(n){let o=n instanceof Error?n.message.split(`
|
|
108
|
+
`)[0]:"unknown error";return gt.debug(`Failed to delete secret from Windows Credential Manager [service="${t}", account="${r}"]: ${o}`),!1}}getStoragePath(){return "Windows Credential Manager (PowerShell)"}};});function kh(){let e=`${Me.hostname()}${Me.userInfo().username}`;return yn.scryptSync(e,Th,Ph)}function Ah(){let e=kh(),t=new io(e),r=pa(t);return new va({projectName:Ea,serialize:r.serialize,deserialize:r.deserialize,configFileMode:384})}function ys(){return ws||(ws=Ah()),ws}var Ph,Th,Ea,Ch,ws,We,uo=J(()=>{"use strict";ta();ma();Ph=32,Th="flow-plugins-cli-fallback",Ea="flow-plugins-cli-fallback",Ch={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)"};ws=null;We=class{warned=!1;async getSecret(t,r){return ys().get(`${t}:${r}`)??null}async setSecret(t,r,n){if(!this.warned){let o=Ch[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, ${o}.
|
|
110
|
-
`),this.warned=!0;}fs().set(`${t}:${r}`,n);}async deleteSecret(t,r){let n=fs(),o=`${t}:${r}`;return n.has(o)?(n.delete(o),!0):!1}getStoragePath(){return fs().path}static hasExistingData(){try{let t=new wa({projectName:Sa});return be.existsSync(t.path)}catch{return !1}}static clearFallbackFile(){try{let t=new wa({projectName:Sa});be.rmSync(t.path,{force:!0});}catch{}gs=null;}};});async function xa(){if(Ge.hasExistingData())return new Ge;switch(process.platform){case "darwin":return await yn.isAvailable()?new yn:new Ge;case "linux":return await mr.isAvailable()?new mr:await mr.ensureInstalled()?new mr:new Ge;case "win32":return await Sn.isAvailable()?new Sn:new Ge;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var Lc=J(()=>{"use strict";ua();ma();ya();lo();});var Mc=J(()=>{"use strict";qi();la();Lc();ua();ma();ya();lo();});async function fr(){return ws||(ws=xa()),ws}function Ss(){ws=null;}async function Y(){let t=await(await fr()).getSecret(zt,ba);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function gr(e){let{clientId:t,clientSecret:r,tenant:n}=e,o=[!t?.trim()&&"clientId",!r?.trim()&&"clientSecret",!n?.trim()&&"tenant"].filter(Boolean);if(o.length>0)throw _c.error(`missing or empty fields: ${o.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await fr()).setSecret(zt,ba,JSON.stringify(e));}async function Dc(){let e=await fr();await e.deleteSecret(zt,ba),await e.deleteSecret(zt,Ia),await e.deleteSecret(zt,va);}async function Oc(){return (await fr()).getStoragePath()}async function Uc(e){await(await fr()).setSecret(zt,Ia,JSON.stringify(e));}async function xs(){let t=await(await fr()).getSecret(zt,Ia);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function bs(e){await(await fr()).setSecret(zt,va,JSON.stringify(e));}async function xn(){let t=await(await fr()).getSecret(zt,va);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function hr(){let e=await xs();return e?new Date(e.expiresAt)>new Date:false}function kt(e){let t=e.replace(/\/$/,"");process.env.AUTH_ENGINE_URL=`${t}/auth-engine-api/v2/api-key/token`,process.env.PROMPT_MANAGER_URL=`${t}/prompt-manager-api/`,process.env.METRICS_COLLECTOR_URL=`${t}/metrics-collector-api/`,_c.debug(`[customUrl] Service URLs overridden to base: ${t}`);}var _c,zt,ba,Ia,va,ws,Ie=J(()=>{"use strict";Mc();$();_c=x("config:credentials"),zt="flow-plugins-cli",ba="credentials",Ia="token-cache",va="user-info",ws=null;});function bn(e){let t=e.split(".");if(t.length!==3)throw new Error(`Invalid JWT: expected 3 segments, got ${t.length}`);let r=t[1].replace(/-/g,"+").replace(/_/g,"/"),n=Buffer.from(r,"base64").toString("utf8");try{return JSON.parse(n)}catch{throw new Error("Invalid JWT: payload segment is not valid JSON")}}var Is=J(()=>{"use strict";});function th(e){if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).match(/^::(?:ffff:)?([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);if(!r)return null;let n=parseInt(r[1],16),o=parseInt(r[2],16);return `${n>>8&255}.${n&255}.${o>>8&255}.${o&255}`}function Ea(e){if(Nc.some(r=>r.test(e)))return true;let t=th(e);return !!(t&&Nc.some(r=>r.test(t)))}function rh(e,t){let r=process.env[e]??t;if(!r)throw new Error(`Missing required environment variable: ${e}`);return r}function At(e,t){let r=rh(e,t),n;try{n=new URL(r);}catch{throw new Error(`${e} must be a valid URL. Got: "${r}"`)}let o=process.env.NODE_ENV==="development";if(!o&&n.protocol!=="https:")throw new Error(`${e} must be an HTTPS URL. Got protocol: "${n.protocol}"`);if(n.username||n.password)throw new Error(`${e} must not contain embedded credentials (user:pass@host is not allowed)`);if(/^169\.254\./i.test(n.hostname)||/^metadata\.(google|azure)\.internal\.?$/i.test(n.hostname)||/^100\.(6[4-9]|[7-9]\d|1[0-2][0-7])\./i.test(n.hostname))throw new Error(`${e} must not point to a cloud metadata endpoint. Got: "${n.hostname}"`);if(!o&&Ea(n.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${n.hostname}"`);return r}var Nc,Kr=J(()=>{"use strict";Nc=[/^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 sh(e){if(!Wt.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}async function ih(e){if(e instanceof HTTPError){let t=e.response.status;Pa.debug(`HTTP error during authentication [status=${t}]`);let r="";try{let n=await e.response.text(),o=JSON.parse(n);typeof o.error=="string"&&(r=o.error);}catch{}return r&&Bc[r]?new Error(Bc[r]):t===StatusCodes.UNAUTHORIZED||t===StatusCodes.FORBIDDEN||t===StatusCodes.INTERNAL_SERVER_ERROR?new Error("Invalid credentials"):t>=StatusCodes.BAD_REQUEST&&t<StatusCodes.INTERNAL_SERVER_ERROR?new Error("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}return e instanceof Error?(Pa.debug(`Non-HTTP error during authentication: ${e.message}`),e):(Pa.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function Vr(e){let t=At("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");sh(e.tenant);let r;try{r=await sd.post(t,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(s){throw await ih(s)}let n=r.expires_at??new Date(Date.now()+(r.expires_in??3600)*1e3).toISOString();await gr(e),await Uc({accessToken:r.access_token,expiresAt:n});let o=bn(r.access_token);await bs({sub:o.sub,name:o.name,email:o.email});}var Pa,Bc,vs=J(()=>{"use strict";Ie();Is();Kr();$();j();Pa=x("api:auth");Bc={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 $t(){if(await hr()){let n=await xs();if(n)return n.accessToken}Fc.debug("Token expired or missing, re-authenticating...");let t=await Y();if(!t)throw new Error("Not authenticated. Run: flow auth login");Ge.clearFallbackFile(),Ss(),await Vr(t);let r=await xs();if(!r)throw new Error("Authentication succeeded but token was not persisted");return Fc.debug("Token refreshed successfully"),r.accessToken}var Fc,In=J(()=>{"use strict";Ie();vs();lo();$();Fc=x("lib:tokenProvider");});function Yt(){return sd.create({prefix:At("PROMPT_MANAGER_URL","https://flow.ciandt.com/prompt-manager-api/"),redirect:"error",hooks:{beforeRequest:[async({request:e})=>{let t=await $t();e.headers.set("Authorization",`Bearer ${t}`);let r=await Y();r?.tenant&&Wt.test(r.tenant)&&e.headers.set("FlowTenant",r.tenant);}]}})}var Eo=J(()=>{"use strict";Kr();Ie();In();j();});function $n(e,t){let r=Yt();return t?r.get(e,{searchParams:{source:t}}):r.get(e)}async function Rn(e){if(!(e instanceof HTTPError))return null;try{let t=await e.response.clone().json(),{message:r}=t;return Array.isArray(r)?r.filter(Boolean).join("; ")||null:typeof r=="string"&&r?r:null}catch{return null}}var za=J(()=>{"use strict";Eo();});function Po(e){if(!e||!ow.test(e))throw new Error(`Invalid plugin name: "${e}". Must be 1-64 chars, lowercase alphanumeric and hyphens only.`)}function Ln(e){return sw.test(e)}function Mn(e){let t=e.indexOf("@");return t>0?e.slice(0,t):e}function qa(e){if(!iw.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 _n(e,t){let r=Mn(e);qa(r);let n=["claude","plugin","install",r];return t&&n.push("--scope",t),n.join(" ")}function Zs(e){let t=e.trim();if(!t)throw new Error("No marketplace source provided.");if(!aw.test(t)&&!lw.test(t))throw new Error(`Invalid marketplace source: "${t}". Must be owner/repo or an https:// URL.`);return t}var ow,sw,iw,aw,lw,Tr=J(()=>{"use strict";ow=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;sw=/^[^@]+@[^@]+$/;iw=/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\/[a-zA-Z0-9][a-zA-Z0-9._-]*)?$/;aw=/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/,lw=/^https:\/\/[\w./:@?&=+#%-]+$/;});var td={};uc(td,{FlowApiAdapter:()=>Dn});var cw,Dn,Ya=J(()=>{"use strict";Eo();za();$();Tr();cw=x("catalog.flow-api"),Dn=class{id;name;source;removable=!1;contentSource;constructor(t){this.contentSource=t,this.id=t?`flow-api:${t}`:"flow-api",this.name=t?`Flow Marketplace (${t})`:"Flow Marketplace",this.source=process.env.PROMPT_MANAGER_URL??"";}async fetchItems(){try{let{plugins:t}=await $n("v1/plugins/catalog",this.contentSource).json();return t.map(r=>({...r,catalogId:this.id,origin:r.origin??"internal",type:r.type??"bundle",...this.contentSource?{contentSource:this.contentSource}:{}}))}catch(t){let r=await Rn(t);if(r)throw new Error(r);if(t instanceof HTTPError){let{status:n}=t.response;throw n===401||n===403?new Error("Authentication failed. Run: flow auth login"):new Error(`Failed to fetch plugin catalog: HTTP ${n}`)}throw t instanceof Error?t.name==="TimeoutError"||t.message.includes("timeout")?new Error("Request timed out while fetching plugin catalog"):new Error(`Failed to fetch plugin catalog: ${t.message}`):t}}async fetchManifest(t){Po(t);try{return await $n(`v1/plugins/${t}/manifest`,this.contentSource).json()}catch(r){let n=await Rn(r);if(n)throw new Error(n);if(r instanceof HTTPError){let{status:o}=r.response;throw o===404?new Error(`Plugin '${t}' not found in catalog`):new Error(`Failed to fetch manifest: HTTP ${o}`)}throw r instanceof Error?new Error(`Failed to fetch manifest: ${r.message}`):r}}async ping(){try{return await Yt().head("v1/plugins/catalog"),cw.debug("ping ok"),!0}catch{return !1}}};});function dw(){let e=process.env.GH_TOKEN??process.env.GITHUB_TOKEN;return e?Promise.resolve(e):execa("gh",["auth","token"],{reject:false}).then(({stdout:t})=>t.trim()||void 0).catch(()=>{})}function nd(){return rd??=dw(),rd}var rd,od=J(()=>{"use strict";});var ad={};uc(ad,{GitRepoAdapter:()=>On});function id(e,t){if(!pw.test(e))throw new Error(`Invalid ${t} in catalog source URL: "${e}"`)}var pw,On,Za=J(()=>{"use strict";od();Kr();pw=/^[a-zA-Z0-9_.-]+$/;On=class{id;name;source;constructor(t,r,n){this.id=t,this.name=r,this.source=n;}buildRawUrl(t,r="marketplace.json"){let n=new URL(this.source),{hostname:o,pathname:s}=n;if(Ea(o))throw new Error(`Catalog source URL points to a private/loopback address: "${o}"`);let i=s.replace(/^\//,"").split("/"),[a,l]=i;return id(a,"owner"),id(l,"repo"),o==="github.com"?`https://raw.githubusercontent.com/${a}/${l}/${t}/${r}`:o==="bitbucket.org"?`https://bitbucket.org/${a}/${l}/raw/${t}/${r}`:o==="gitlab.com"||o.startsWith("git.")?`https://${o}/${a}/${l}/-/raw/${t}/${r}`:`https://${o}/${a}/${l}/raw/${t}/${r}`}async fetchItems(){return this._fetchFromBranch("main").catch(t=>{if(this._is404(t))return this._fetchFromBranch("master");throw t})}async _fetchFromBranch(t){let r=await this._buildHeaders();try{let s=this.buildRawUrl(t,".claude-plugin/marketplace.json"),{plugins:i}=await sd.get(s,{headers:r}).json();return i.map(a=>({...a,catalogId:this.id,origin:a.origin??"external"}))}catch(s){if(this._is401or403(s))throw this._authError();if(!this._is404(s))throw s}let n=this.buildRawUrl(t),{plugins:o}=await sd.get(n,{headers:r}).json();return o.map(s=>({...s,catalogId:this.id,origin:s.origin??"external"}))}async _buildHeaders(){if(new URL(this.source).hostname!=="github.com")return {};let r=await nd();return r?{Authorization:`token ${r}`}:{}}_is404(t){return t!==null&&typeof t=="object"&&"response"in t&&t.response?.status===404}_is401or403(t){return t!==null&&typeof t=="object"&&"response"in t&&[401,403].includes(t.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(t){throw new Error("GitRepoAdapter does not support individual manifest fetch")}async ping(){try{return await this.fetchItems(),!0}catch{return !1}}};});j();var pc=new Set(["skill","mcp","bundle","plugin"]),S=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(pc),origins:new Set(Xi)},setScreen:t=>e({screen:t}),setActiveTab:t=>e({activeTab:t}),setFocus:t=>e({focus:t}),setSelectedIndex:t=>e({selectedIndex:t}),setActionMenuOpen:t=>e({actionMenuOpen:t}),showNotification:(t,r)=>e({notification:{message:t,type:r}}),clearNotification:()=>e({notification:null}),setLoading:(t,r="")=>e({loading:t,loadingMessage:t?r:"",downloadProgress:0,downloadTotal:0}),setDownloadProgress:(t,r)=>e({downloadProgress:t,downloadTotal:r}),setCatalogError:t=>e({catalogError:t}),setPendingExit:t=>e({pendingExit:t}),toggleTypeFilter:t=>e(r=>{let{types:n}=r.catalogFilters;return n.size===1&&n.has(t)?{}:{catalogFilters:{...r.catalogFilters,types:new Set([t])},selectedIndex:0}}),selectAllTypes:()=>e(t=>({catalogFilters:{...t.catalogFilters,types:new Set(pc)},selectedIndex:0})),toggleOriginFilter:t=>e(r=>{let{origins:n}=r.catalogFilters;return n.size===1&&n.has(t)?{}:{catalogFilters:{...r.catalogFilters,origins:new Set([t])},selectedIndex:0}}),selectAllOrigins:()=>e(t=>({catalogFilters:{...t.catalogFilters,origins:new Set(Xi)},selectedIndex:0})),setDebugPanelOpen:t=>e({debugPanelOpen:t}),incrementCatalogVersion:()=>e(t=>({catalogVersion:t.catalogVersion+1})),setBundleInstallFlow:t=>e({bundleInstallFlow:t})}));Ie();In();Is();j();Kr();$();var Es=x("api:metrics");function jc(){return At("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function Kc(e,t,r){return sd.post(e,{json:t,headers:r})}async function lh(e){let t=await xn();if(t)return t;let r=bn(e),n={sub:r.sub,name:r.name,email:r.email};return await bs(n),n}async function v(e,t){let r=await $t(),n=await lh(r),o=await Y();if(!Wt.test(o.tenant))throw new Error(`Invalid tenant value: "${o.tenant}"`);let s={action:e,booster:zi,metadata:{...t},success:true,tenant:o.tenant,timestamp:new Date().toISOString(),user:{id:n.sub,name:n.name,email:n.email}};try{await Kc(jc(),s,{Authorization:`Bearer ${r}`,FlowTenant:o.tenant}),Es.debug(`Metrics event sent: ${e}`);}catch(i){throw Es.warn(`Failed to send metrics event "${e}": ${String(i)}`),i}}async function Vc(e,t,r){try{let n=r&&Wt.test(r)?r:"unknown",o={action:e,booster:zi,metadata:t,success:!0,tenant:n,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await Kc(jc(),o,{FlowTenant:n}),Es.debug(`Anonymous metrics event sent: ${e}`);}catch(n){Es.warn(`Failed to send anonymous metrics event "${e}": ${String(n)}`);}}var I={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 ch={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},ht={...ch};function Hc(e){let t=Date.now();ht={sessionStart:t,stepStart:t,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function Hr(e){ht.currentStep=e,ht.stepStart=Date.now();}function Z(){return {...ht}}function yr(){return ht.sessionStart===0?0:Date.now()-ht.sessionStart}function Jr(){return ht.stepStart===0?0:Date.now()-ht.stepStart}function Jc(){ht.tuiSessionStart=Date.now();}function Gc(){return ht.tuiSessionStart===0?0:Date.now()-ht.tuiSessionStart}$();var uh=3e3,dh=x("abandonment");async function Ps(e){let{currentStep:t,sessionStart:r}=Z();if(r===0)return;let n={last_step:t,trigger:e,duration_ms:yr()};try{await Promise.race([v(I.CLI_ONBOARDING_ABANDONED,n),new Promise((o,s)=>setTimeout(()=>s(new Error("abandonment timeout")),uh))]);}catch(o){dh.warn(`Abandonment event failed: ${String(o)}`);}}function Wc(e,t){return Promise.race([e,new Promise(r=>setTimeout(r,t))])}$();var ph=3e3,mh=x("session-end");async function uo(e,t,r){let n=Gc(),s=[v(I.CLI_TUI_SESSION_ENDED,{duration_ms:n,active_tab:t,interface:"tui"})];r!=="main"&&s.push(Ps(e));try{await Wc(Promise.all(s).then(()=>{}),ph);}catch(i){mh.warn(`Session end event failed: ${String(i)}`);}}var yh=2e3;function Xc(){let{exit:e}=useApp(),t=useRef(false),r=useRef(null),n=S(l=>l.pendingExit),o=S(l=>l.setPendingExit),s=S(l=>l.activeTab),i=S(l=>l.screen),a=useCallback(()=>{if(t.current){r.current&&clearTimeout(r.current),uo("double-ctrl-c",s,i).finally(()=>e());return}t.current=true,o(true),r.current=setTimeout(()=>{t.current=false,o(false);},yh);},[e,o,s,i]);return useInput((l,u)=>{u.ctrl&&l==="c"&&a();}),{pendingExit:n}}var bh=16;function qc({label:e,value:t,onChange:r,masked:n=false,isActive:o,error:s}){let i=useRef(t);useEffect(()=>{i.current=t;},[t]),useInput((l,u)=>{if(u.backspace){let c=i.current.slice(0,-1);i.current=c,r(c);}else if(l&&!u.ctrl&&!u.meta&&!u.escape&&!u.return&&!u.tab&&!u.upArrow&&!u.downArrow&&!u.leftArrow&&!u.rightArrow){let c=i.current+l;i.current=c,r(c);}},{isActive:o});let a=n?"\u2022".repeat(t.length):t;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u25B8 ":" "}),jsx(Text,{color:o?"white":"gray",bold:o,children:e.padEnd(bh)}),jsx(Text,{color:o?"cyan":"gray",children:a}),o&&jsx(Text,{color:"cyan",children:"\u2588"})]}),s&&jsx(Box,{paddingLeft:3,children:jsxs(Text,{color:"red",children:["\u26A0 ",s]})})]})}j();function Yc({onConfirm:e}){let[t,r]=useState("confirm"),[n,o]=useState(""),[s,i]=useState(false),a=useRef("");return useInput((l,u)=>{if(t==="confirm"){if(l==="n"||l==="N"){r("input");return}(l==="y"||l==="Y"||u.return)&&e(null);return}if(u.escape){a.current="",o(""),i(false),r("confirm");return}if(u.return){let c=a.current.trim();mn.test(c)?(i(false),e(c)):i(true);return}if(u.backspace||u.delete){a.current=a.current.slice(0,-1),o(a.current);return}l&&!u.ctrl&&!u.meta&&(a.current=a.current+l,o(a.current),i(false));}),jsxs(Box,{flexDirection:"column",gap:1,children:[t==="confirm"&&jsx(Text,{children:"Does your email use the @ciandt.com domain? (Y/n)"}),t==="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:n}),jsx(Text,{color:"cyan",children:"\u2588"})]}),s&&jsx(Text,{color:"red",children:fn}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})}j();function Zc({plan:e}){return jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[dr," \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"})]})]})}j();function Qc(){return jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"yellow",children:[dr," \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 rt=create(e=>({credentials:null,isAuthenticated:false,justAuthenticated:false,setCredentials:t=>e({credentials:t,isAuthenticated:true}),clearCredentials:()=>e({credentials:null,isAuthenticated:false,justAuthenticated:false}),setJustAuthenticated:t=>e({justAuthenticated:t})}));vs();j();function zr(){return xe__default.join(Le__default.homedir(),".claude","settings.json")}function tu(e){return `${(e&&e.trim().length>0?e.trim():Qo).replace(/\/+$/,"")}/flow-litellm/`}function wo(){let e=zr();if(!be__default.existsSync(e))return {status:"missing"};let t=be__default.readFileSync(e,"utf-8"),r=t.charCodeAt(0)===65279?t.slice(1):t;try{let n=JSON.parse(r);return n===null||typeof n!="object"||Array.isArray(n)?{status:"malformed",raw:t}:{status:"ok",settings:n}}catch{return {status:"malformed",raw:t}}}function Cs(e){let t=zr();be__default.mkdirSync(xe__default.dirname(t),{recursive:true});let r=`${t}.${randomUUID()}.tmp`;be__default.writeFileSync(r,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),be__default.renameSync(r,t);}function ru(e,t,r){let n=e.env&&typeof e.env=="object"&&!Array.isArray(e.env)?e.env:{};return {...e,env:{...n,ANTHROPIC_AUTH_TOKEN:t,ANTHROPIC_BASE_URL:r}}}function La(e){let t=e.env;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.ANTHROPIC_AUTH_TOKEN;return typeof r=="string"&&r.length>0?r:null}function nu(e){let t=e.env;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.ANTHROPIC_BASE_URL;return typeof r=="string"&&r.length>0?r:null}var kh=3600,Xr=class extends Error{constructor(){super("~/.claude/settings.json contains invalid JSON"),this.name="MalformedSettingsError";}};function So(e){let t=e.split(".");if(t.length!==3)throw new Error("Malformed JWT: invalid format");let r;try{r=JSON.parse(Buffer.from(t[1],"base64url").toString("utf8"));}catch{throw new Error("Malformed JWT: payload is not valid JSON")}if(!r||typeof r!="object"||Array.isArray(r))throw new Error("Malformed JWT: payload must be a JSON object");let n=r;if(typeof n.clientId!="string"||!n.clientId)throw new Error("Invalid JWT: claim clientId must be a non-empty string");if(n.clientId.length>512)throw new Error("Invalid JWT: claim clientId exceeds maximum length");if(typeof n.clientSecret!="string"||!n.clientSecret)throw new Error("Invalid JWT: claim clientSecret must be a non-empty string");if(n.clientSecret.length>4096)throw new Error("Invalid JWT: claim clientSecret exceeds maximum length");if(typeof n.tenant!="string"||!n.tenant)throw new Error("Invalid JWT: claim tenant must be a non-empty string");if(n.tenant.length>512)throw new Error("Invalid JWT: claim tenant exceeds maximum length");return {clientId:n.clientId,clientSecret:n.clientSecret,tenant:n.tenant}}function Ah(e){return Ch.sign({clientId:e.clientId,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:kh})}function ks(e,t={}){let r=wo();if(r.status==="malformed"&&!t.allowOverwriteMalformed)throw new Xr;let n=r.status==="ok"?r.settings:{},o=r.status==="ok"?La(r.settings):null,s=r.status==="ok"?nu(r.settings):null,i=t.jwtOverride??Ah(e),a=tu(e.customUrl),l=ru(n,i,a);return {jwt:i,anthropicBaseUrl:a,merged:l,previousToken:o,previousBaseUrl:s,hadExistingFile:r.status!=="missing"}}function As(e){Cs(e.merged);}function ou(){let e=wo();return e.status!=="ok"?false:La(e.settings)!==null}Ie();He();function $h(){let e=Sc();if(!be__default.existsSync(e))return {};try{return JSON.parse(be__default.readFileSync(e,"utf-8"))}catch{return {}}}var Ma=null;function Rh(){return Ma===null&&(Ma=$h()),Ma}function xr(){return !!Rh().ENABLE_EXPERIMENTAL_BETAS}j();function Dh(){return se.filter(e=>e.platforms[process.platform]?.status==="supported")}function iu(e){let t=Dh();return t.length>0&&t.every(r=>e.find(n=>n.module.alias===r.alias)?.alreadyInstalled===true)}var $s={alias:"metrics",required:true,name:"flow-ai-obs",configCheck:()=>{try{let e=xe__default.join(Le__default.homedir(),".claude","settings.json"),r=be__default.readFileSync(e,"utf-8").replace(/^\uFEFF/,""),o=JSON.parse(r).env;return typeof o=="object"&&o!==null&&"OTEL_EXPORTER_OTLP_ENDPOINT"in o}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 t=["flow-ai-obs","init","--no-interactive"];if(t.push("--custom-url",e.customUrl??Qo),e.credentials){let{clientId:r,clientSecret:n,tenant:o}=e.credentials;t.push("--client-id",r,"--client-secret",n,"--tenant",o);}return e.customEmail&&t.push("--custom-email",e.customEmail),[t]},onDemand:null,mode:"non-interactive"}},Oh={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},se=xr()?[$s,Oh]:[$s];Ie();$();var Fh=x("moduleState");function Ls(){let e=process.env.FLOW_HOME??xe__default.join(Le__default.homedir(),".flow");return xe__default.join(e,"modules.json")}var jh={retries:5,minTimeout:50};async function au(e,t){be__default.mkdirSync(xe__default.dirname(e),{recursive:true});let r=await Bh.lock(e+".lock",{realpath:false,retries:jh});try{return await t()}finally{await r();}}function lu(){let e=Ls();if(!be__default.existsSync(e))return [];try{let t=JSON.parse(be__default.readFileSync(e,"utf-8"));return t.schemaVersion!==1?(Fh.warn(`modules.json has unknown schemaVersion ${t.schemaVersion}, resetting`),be__default.rmSync(e,{force:!0}),[]):Array.isArray(t.modules)?t.modules.map(r=>({...r,name:r.name??null})):[]}catch{return be__default.rmSync(e,{force:true}),[]}}function qr(){return lu()}function cu(e){let t=Ls();be__default.mkdirSync(xe__default.dirname(t),{recursive:true});let r=`${t}.${randomUUID()}.tmp`,n={schemaVersion:1,modules:e};be__default.writeFileSync(r,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}),be__default.renameSync(r,t);}function nt(e){return qr().find(t=>t.alias===e)??null}async function yt(e){let t=Ls();await au(t,async()=>{let r=lu(),n=r.findIndex(o=>o.alias===e.alias);n===-1?r.push(e):r[n]=e,cu(r);});}async function Yr(){let e=Ls();be__default.existsSync(e)||await au(e,async()=>{be__default.existsSync(e)||cu([]);});}var Hh=promisify(execFile);function br(e,t){let r=e.platforms[process.platform];return !r||r.status!=="supported"?null:r.strategies.find(n=>n.type===t)??null}async function Lt(e){let t=process.platform==="win32"?"where":"which";try{return await Hh(t,[e]),!0}catch{return false}}function Xt(){return process.platform==="win32"?"npm.cmd":"npm"}var uu=promisify(execFile),En=class{type="npm";async isAvailable(){return Lt("npm")}async install(t){let r=await this.getInstalledVersion(t);return r?{success:true,version:r,method:"npm",durationMs:0}:this.runNpmInstall(t,false)}async update(t,r){return this.runNpmInstall(t,true)}async getInstalledVersion(t){let r=br(t,"npm");if(!r)return null;try{let{stdout:n}=await uu(Xt(),["list","-g",r.package,"--depth=0","--json"],{shell:process.platform==="win32"});return JSON.parse(n).dependencies?.[r.package]?.version??null}catch{return null}}async uninstall(t){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async runNpmInstall(t,r){let n=Date.now(),o=br(t,"npm");if(!o)return {success:false,error:{code:"NPM_NOT_AVAILABLE",message:"No npm config for this module on this platform"},durationMs:Date.now()-n};let s=r?`${o.package}@latest`:o.package;try{return await uu(Xt(),["install","-g",s],{shell:process.platform==="win32"}),{success:!0,version:await this.getInstalledVersion(t)??void 0,method:"npm",durationMs:Date.now()-n}}catch(i){return {success:false,error:{code:"NPM_INSTALL_FAILED",message:i instanceof Error?i.message:String(i)},durationMs:Date.now()-n}}}};var Ms=promisify(execFile),Xh=/^(\S+)\s+([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/,_s=class{type="homebrew";async isAvailable(){return Lt("brew")}async install(t){return this.runBrewCommand(t,"install")}async update(t,r){return this.runBrewCommand(t,"upgrade")}async getInstalledVersion(t){let r=br(t,"homebrew");return r?this.getVersionByFormula(r.formula):null}async uninstall(t){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async runBrewCommand(t,r){let n=Date.now(),o=br(t,"homebrew");if(!o)return {success:false,error:{code:"HOMEBREW_NOT_AVAILABLE",message:"No homebrew config for this module on this platform"},durationMs:Date.now()-n};let s=r==="install"?"HOMEBREW_INSTALL_FAILED":"HOMEBREW_UPGRADE_FAILED";try{return o.tap&&(await Ms("brew",["tap",o.tap]),await Ms("brew",["trust",o.tap])),await Ms("brew",[r,o.formula]),{success:!0,version:await this.getVersionByFormula(o.formula)??void 0,method:"homebrew",durationMs:Date.now()-n}}catch(i){return {success:false,error:{code:s,message:i instanceof Error?i.message:String(i)},durationMs:Date.now()-n}}}async getVersionByFormula(t){try{let{stdout:r}=await Ms("brew",["list","--versions",t]),n=r.trim().match(Xh);return n?n[2]:null}catch{return null}}};var Pn=promisify(execFile),pu=/([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/;function mu(){let e=process.env.FLOW_HOME??xe__default.join(Le__default.homedir(),".flow");return xe__default.join(e,"bin")}var Ds=class{type="curl";async isAvailable(){return Lt("curl")}async install(t){let r=Date.now(),n=br(t,"curl");if(!n)return {success:false,error:{code:"CURL_NOT_AVAILABLE",message:"No curl config for this module on this platform"},durationMs:Date.now()-r};let o=typeof n.url=="function"?n.url(process.arch):n.url;return (n.mode??"binary")==="script"?this.installScript(o,n.checksumUrl,t,r):this.installBinary(o,n.checksumUrl,t,r)}async update(t,r){return this.install(t)}async getInstalledVersion(t){let r=xe__default.join(mu(),xe__default.basename(t.binaryName));for(let n of [r,t.binaryName])try{let{stdout:o}=await Pn(n,["--version"]),s=o.match(pu);if(s)return s[1]}catch{}return null}async uninstall(t){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async installScript(t,r,n,o){if(!r)return {success:false,error:{code:"CHECKSUM_REQUIRED",message:`checksumUrl is required for script installs (${n.alias})`},durationMs:Date.now()-o};let s=xe__default.join(Le__default.tmpdir(),`flow-install-${randomUUID()}.sh`);try{if(await Pn("curl",["-sSL","--fail","-o",s,t]),r){let a=await this.validateChecksum(s,r);if(!a.valid){try{be__default.unlinkSync(s);}catch{}return {success:!1,error:{code:"CHECKSUM_MISMATCH",message:a.message},durationMs:Date.now()-o}}}return be__default.chmodSync(s,448),await Pn("bash",[s]),{success:!0,version:await this.getInstalledVersion(n)??void 0,method:"curl",durationMs:Date.now()-o}}catch(i){return {success:false,error:{code:"CURL_SCRIPT_FAILED",message:i instanceof Error?i.message:String(i)},durationMs:Date.now()-o}}finally{try{be__default.unlinkSync(s);}catch{}}}async installBinary(t,r,n,o){let s=mu(),i=xe__default.join(s,xe__default.basename(n.binaryName)),a=false;try{if(be__default.mkdirSync(s,{recursive:!0}),a=!0,await Pn("curl",["-L","--fail","-o",i,t]),r){let u=await this.validateChecksum(i,r);if(!u.valid)return be__default.unlinkSync(i),{success:!1,error:{code:"CHECKSUM_MISMATCH",message:u.message},durationMs:Date.now()-o}}be__default.chmodSync(i,493);let l=null;try{let{stdout:u}=await Pn(i,["--version"]),c=u.match(pu);l=c?c[1]:null;}catch{}return {success:!0,version:l??void 0,method:"curl",durationMs:Date.now()-o}}catch(l){if(a)try{be__default.unlinkSync(i);}catch{}return {success:false,error:{code:"CURL_DOWNLOAD_FAILED",message:l instanceof Error?l.message:String(l)},durationMs:Date.now()-o}}}async validateChecksum(t,r){let n=xe__default.join(Le__default.tmpdir(),`curl-checksum-${randomUUID()}`);try{await Pn("curl",["-L","--fail","-o",n,r]);let o=be__default.readFileSync(n,"utf-8").trim().split(/\s+/)[0],s=be__default.readFileSync(t),i=createHash("sha256").update(s).digest("hex");return i!==o?{valid:!1,message:`SHA256 mismatch: expected ${o}, got ${i}`}:{valid:!0,message:""}}catch(o){return {valid:false,message:`Checksum validation failed: ${String(o)}`}}finally{try{be__default.unlinkSync(n);}catch{}}}};$();var fu="0.0.0";try{let e=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8"));typeof e.version=="string"&&(fu=e.version);}catch{}var ue=fu;var Ce=x("moduleInstaller");function _t(e){switch(e){case "npm":return new En;case "homebrew":return new _s;case "curl":return new Ds}}async function xo(e,t,r){try{await v(I.CLI_MODULE_INSTALL_FAILED,{module_alias:e.alias,module_name:e.name,os:process.platform,error_code:r.code,error_message:r.message,trigger:t});}catch(n){Ce.warn(`Failed to emit install failed event: ${String(n)}`);}}async function vr(e,t,r,n,o,s){let i=Date.now(),a=e.platforms[process.platform];if(!a)return {success:false,error:{code:"PLATFORM_NOT_SUPPORTED",message:`Platform ${process.platform} is not listed for module ${e.alias}`},durationMs:Date.now()-i};if(a.status==="experimental"){Ce.warn(`Module "${e.alias}" has experimental support on ${process.platform}`);let d={code:"PLATFORM_EXPERIMENTAL",message:`Experimental support on ${process.platform} \u2014 install manually`};return await xo(e,t,d),{success:false,error:d,durationMs:Date.now()-i}}if(a.status!=="supported"){let d={code:"PLATFORM_NOT_SUPPORTED",message:`Module ${e.alias} is not supported on ${process.platform}`};return await xo(e,t,d),{success:false,error:d,durationMs:Date.now()-i}}if(!a.strategies.some(d=>d.type===r)){let d={code:"STRATEGY_NOT_FOUND",message:`Strategy "${r}" is not configured for module "${e.alias}" on ${process.platform}`};return await xo(e,t,d),{success:false,error:d,durationMs:Date.now()-i}}let l=_t(r),u=false;try{u=await l.isAvailable();}catch(d){Ce.warn(`${r} availability check failed: ${String(d)}`);}if(!u){let d={code:"STRATEGY_NOT_AVAILABLE",message:`"${r}" is not installed on this system`};return await xo(e,t,d),{success:false,error:d,durationMs:Date.now()-i}}try{await v(I.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:ue,trigger:t});}catch(d){Ce.warn(`Failed to emit install started event: ${String(d)}`);}let c;try{c=s?.forceLatest?await l.update(e,"unknown"):await l.install(e);}catch(d){let m=d instanceof Error?d.message:String(d);Ce.warn(`${r} install threw: ${m}`),c={success:false,error:{code:"INSTALL_THREW",message:m},durationMs:Date.now()-i};}if(c.success){await yt({alias:e.alias,name:e.name,installedVersion:c.version??null,installMethod:c.method??null,installedAt:new Date().toISOString(),lastChecked:new Date().toISOString()});try{await v(I.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:t});}catch(p){Ce.warn(`Failed to emit install completed event: ${String(p)}`);}let{pendingCmd:d,failed:m}=await ry(e,t,n,o);return d?{...c,pendingInteractiveSetup:d}:m?{...c,postInstallFailed:true}:e.configCheck&&!e.configCheck()?{...c,configCheckFailed:true}:c}return await xo(e,t,c.error??{code:"UNKNOWN",message:"unknown error"}),c}async function ry(e,t,r,n){if(!e.postInstall)return {pendingCmd:null,failed:false};let o=t==="onboarding"?e.postInstall.onboarding:e.postInstall.onDemand;if(o==null)return {pendingCmd:null,failed:false};let s;if(typeof o=="function"){let a=await Y(),l={credentials:a?{clientId:a.clientId,clientSecret:a.clientSecret,tenant:a.tenant}:null,customUrl:r??null,customEmail:n??null};try{s=o(l);}catch(u){return Ce.warn(`postInstall function threw: ${String(u)}`),{pendingCmd:null,failed:false}}}else s=o;if(s.length===0)return {pendingCmd:null,failed:false};if((e.postInstall.mode??"non-interactive")==="interactive")return {pendingCmd:s[0]??null,failed:false};let i=false;for(let a=0;a<s.length;a++){let l=s[a];if(l.length===0)continue;let u=spawnSync(l[0],l.slice(1),{stdio:"pipe",env:process.env,encoding:"utf-8",shell:process.platform==="win32"});if(u.status!==0){i=true,Ce.warn(`postInstall "${l.join(" ")}" exited with status ${u.status??"null"}`),u.stderr&&Ce.warn(u.stderr);let c=s.slice(a+1).filter(d=>d.length>0);c.length>0&&Ce.debug(`continuing with remaining postInstall steps: ${c.map(d=>d.join(" ")).join(", ")}`);}}return {pendingCmd:null,failed:i}}async function Os(e,t){let r=Date.now(),n=nt(e.alias);if(!n?.installMethod)return {success:false,error:{code:"NOT_INSTALLED",message:`Module '${e.alias}' is not installed`},durationMs:Date.now()-r};let o=_t(n.installMethod),s=n.installedVersion??"unknown";if(t==="command")try{await v(I.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:ue,trigger:"command"});}catch(a){Ce.warn(`Failed to emit update started event: ${String(a)}`);}let i;try{i=await o.update(e,s);}catch(a){let l=a instanceof Error?a.message:String(a);Ce.warn(`${n.installMethod} update threw: ${l}`),i={success:false,error:{code:"UPDATE_THREW",message:l},durationMs:Date.now()-r};}if(i.success)if(await yt({...n,installedVersion:i.version??n.installedVersion,lastChecked:new Date().toISOString()}),t==="command")try{await v(I.CLI_MODULE_INSTALL_COMPLETED,{module_alias:e.alias,module_name:e.name,installed_version:i.version??"unknown",duration_ms:i.durationMs,os:process.platform,trigger:"command"});}catch(a){Ce.warn(`Failed to emit update completed event: ${String(a)}`);}else try{await v(I.CLI_MODULE_UPDATED,{module_alias:e.alias,from_version:s,to_version:i.version??"unknown",duration_ms:i.durationMs});}catch(a){Ce.warn(`Failed to emit module updated event: ${String(a)}`);}else if(t==="command")try{await v(I.CLI_MODULE_INSTALL_FAILED,{module_alias:e.alias,module_name:e.name,os:process.platform,error_code:i.error?.code??"UNKNOWN",error_message:i.error?.message??"unknown error",trigger:"command"});}catch(a){Ce.warn(`Failed to emit update failed event: ${String(a)}`);}return i}$();var Us=x("flowAiObsSetup");async function Ns(e,t){try{if(!await new En().isAvailable().catch(()=>!1))return Us.warn("npm not available \u2014 skipping flow-ai-obs install"),{npmFailed:!0,initFailed:!1};let o=await vr($s,"onboarding","npm",e,t,{forceLatest:!0});return o.success?o.postInstallFailed||o.configCheckFailed?(Us.debug("flow-ai-obs init failed (postInstall exit non-zero or configCheck failed)"),{npmFailed:!1,initFailed:!0}):{npmFailed:!1,initFailed:!1}:(Us.warn(`flow-ai-obs install failed: ${o.error?.message??"unknown"}`),{npmFailed:!0,initFailed:!1})}catch(r){return Us.warn(`installFlowAiObs threw: ${String(r)}`),{npmFailed:false,initFailed:false,unexpectedError:true}}}$();function gu(e){if(!(e instanceof Error))return "unknown";let t=e.message.toLowerCase();return t.includes("401")||t.includes("unauthorized")?"invalid_credentials":t.includes("403")||t.includes("forbidden")?"forbidden":t.includes("timeout")||t.includes("timed out")?"timeout":t.includes("network")||t.includes("econnrefused")||t.includes("fetch")?"network_error":"unknown"}var ny=x("useAuthSetup");function hu(){let[e,t]=useState(""),r=useRef(null),n=useRef(null),o=useRef(null),[s,i]=useState(),[a,l]=useState(null),[u,c]=useState(false),[d,m]=useState("fields"),[p,f]=useState(null),y=useRef(0),g=useRef(false),{setCredentials:w,setJustAuthenticated:E}=rt(),D=()=>{m("fields"),f(null),t(""),r.current=null,n.current=null,o.current=null;},M=()=>{v(I.CLI_SESSION_STARTED,{cli_version:ue,os:process.platform,node_version:process.version,duration_ms:yr(),interface:"tui"}).catch(()=>{});},C=async V=>{g.current=true;let z={...r.current,customUrl:n.current??void 0};try{V&&As(V),await gr(z);}catch(G){l(G instanceof Error?G.message:"Failed to persist credentials"),D(),g.current=false;return}let{clientSecret:A,...N}=z;w(N),E(true),M(),await Ns(n.current,o.current).catch(G=>ny.warn(`installFlowAiObs threw unexpectedly: ${String(G)}`)),Bs({starterKit:N.starterKit});},R=async()=>C(),_=async V=>C(V),O=V=>{try{let z={...r.current,customUrl:n.current??void 0};return ks(z,{allowOverwriteMalformed:V,jwtOverride:e.trim()})}catch(z){return z instanceof Xr?(m("malformedConfirm"),null):(l(z instanceof Error?z.message:"Failed to read settings.json"),m("fields"),null)}},ee=()=>{let V=O(true);V&&(f(V),_(V));},k=async()=>{let V=e.trim();if(!V){i("This field is required");return}let z;try{z=So(V);}catch(A){i(A instanceof Error?A.message:"Invalid JWT");return}i(void 0),r.current=z,m("customUrl");},H=V=>{n.current=V,m("email");},Q=V=>{o.current=V,K();},K=async()=>{let V=n.current;V&&kt(V),c(true),l(null),y.current+=1;try{await Vr(r.current);let z=O(!1);z&&(f(z),m("preview"));}catch(z){let A=z instanceof Error?z.message:"Authentication failed";l(A),Vc(I.CLI_AUTH_FAILED,{error_code:gu(z),attempt:y.current},r.current.tenant).catch(()=>{}),t(""),r.current=null,m("fields");}finally{c(false);}};return {jwtValue:e,jwtError:s,authError:a,isSubmitting:u,step:d,plan:p,isCommittingRef:g,setJwtValue:t,setJwtError:i,cancelToFields:D,handleSubmit:k,goToEmailStep:H,handleEmailConfirm:Q,commitAndProceed:_,skipJwtAndProceed:R,planPersistOverwrite:ee}}j();B();function yu(){let{jwtValue:e,jwtError:t,authError:r,isSubmitting:n,step:o,plan:s,isCommittingRef:i,setJwtValue:a,setJwtError:l,cancelToFields:u,handleSubmit:c,goToEmailStep:d,handleEmailConfirm:m,commitAndProceed:p,skipJwtAndProceed:f,planPersistOverwrite:y}=hu(),[g,w]=useState("confirm"),[E,D]=useState(""),M=useRef(""),[C,R]=useState(false);return useEffect(()=>{o==="customUrl"&&(w("confirm"),M.current="",D(""),R(false));},[o]),useInput((_,O)=>{if(!(n||i.current)){if(o==="preview"){O.return&&s?p(s):O.escape?f():_==="q"&&u();return}if(o==="malformedConfirm"){O.return?y():O.escape&&u();return}if(o==="customUrl"){if(g==="confirm")_==="y"||_==="Y"?w("input"):(_==="n"||_==="N"||O.return)&&d(null);else if(O.escape)M.current="",D(""),w("confirm");else if(O.return){let ee=M.current.trim();ee.length>0&&dn.test(ee)?(R(false),d(ee)):ee.length>0&&R(true);}else O.backspace||O.delete?(M.current=M.current.slice(0,-1),D(M.current)):_&&!O.ctrl&&!O.meta&&(M.current=M.current+_,D(M.current),R(false));return}o!=="email"&&O.return&&c();}},{isActive:true}),o==="customUrl"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[dr," \u2014 Initial Setup"]})}),jsxs(Box,{flexDirection:"column",gap:1,children:[n&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),!n&&g==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),!n&&g==="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:E}),jsx(Text,{color:"cyan",children:"\u2588"})]}),C&&jsx(Text,{color:"red",children:pn}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})]}):o==="email"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[dr," \u2014 Initial Setup"]})}),n?jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}):jsx(Yc,{onConfirm:m})]}):o==="preview"&&s?jsx(Zc,{plan:s}):o==="malformedConfirm"?jsx(Qc,{}):jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[dr," \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(qc,{label:"JWT",value:e,onChange:_=>{a(_),t&&l(void 0);},masked:true,isActive:!n,error:t})})}),n&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),r&&jsx(Box,{marginTop:1,children:jsxs(Text,{color:"red",children:["\u26A0 ",h(r)]})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter confirm"})})]})}function Cn(){return jsxs(Box,{flexDirection:"column",alignItems:"center",children:[jsx(ly,{text:"FLOW",font:"block",colors:["white","white"]}),jsx(Box,{marginTop:-1,marginBottom:1,children:jsxs(Text,{dimColor:true,children:["Marketplace \xB7 v",ue]})})]})}var bu=[{id:"discover",focus:"list"},{id:"installed",focus:"list"},{id:"updates",focus:"list"},{id:"marketplaces",focus:"marketplaces"}],ne=xr()?bu:bu.slice(0,3);function cy(e){return ne.findIndex(t=>t.id===e)}function Oa(e,t,r){let n=cy(r.activeTab);if(t.rightArrow||t.tab){let o=ne[(n+1)%ne.length];return [{type:"setTab",tab:o.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:o.focus}]}if(t.leftArrow){let o=ne[(n-1+ne.length)%ne.length];return [{type:"setTab",tab:o.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:o.focus}]}return t.downArrow?[{type:"setFocus",focus:ne[n]?.focus??"list"}]:[]}var Eu={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function Pu({outdatedCount:e=0}){let t=S(r=>r.activeTab);return jsx(Box,{paddingX:1,paddingBottom:1,children:ne.map(({id:r})=>{let n=r===t,o=r==="updates"&&e>0?`${Eu[r]} (${e})`:Eu[r];return jsx(Box,{marginRight:1,children:n?jsx(Text,{bold:true,inverse:true,children:` ${o} `}):jsx(Text,{dimColor:true,children:` ${o} `})},r)})})}var We=create(e=>({query:"",cursorPosition:0,setQuery:t=>e({query:t}),setCursorPosition:t=>e({cursorPosition:t}),resetQuery:()=>e({query:"",cursorPosition:0})}));function Cu(){let e=S(i=>i.focus),t=We(i=>i.query),r=We(i=>i.cursorPosition),n=e==="search",o=t.slice(0,r),s=t.slice(r);return jsxs(Box,{borderStyle:"single",borderTop:false,borderBottom:true,borderLeft:false,borderRight:false,paddingX:1,marginX:1,marginBottom:1,children:[jsx(Text,{color:n?"cyan":"gray",children:"\u{1F50D} "}),n?jsxs(Fragment,{children:[jsx(Text,{color:"white",children:o}),jsx(Text,{inverse:true,children:s[0]??" "}),jsx(Text,{color:"white",children:s.slice(1)})]}):jsx(Text,{dimColor:true,children:t||"Search..."})]})}j();var my=["skill","mcp","bundle"].map((e,t)=>({key:String(t+2),type:e,...un[e]})),fy=["internal","external"].map((e,t)=>({key:String(t+6),origin:e,...dc[e]}));function ku(){let e=S(n=>n.catalogFilters),t=e.types.has("skill")&&e.types.has("mcp")&&e.types.has("bundle"),r=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:t?"green":void 0,dimColor:!t,children:[t?"\u25C9":"\u25CB"," All"]})]}),my.map(n=>{let o=!t&&e.types.has(n.type);return jsxs(Box,{gap:0,children:[jsxs(Text,{dimColor:true,children:["[",n.key,"] "]}),jsxs(Text,{color:o?n.color:void 0,dimColor:!o,children:[o?"\u25C9":"\u25CB"," ",n.label]})]},n.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:r?"green":void 0,dimColor:!r,children:[r?"\u25C9":"\u25CB"," All"]})]}),fy.map(n=>{let o=!r&&e.origins.has(n.origin);return jsxs(Box,{gap:0,children:[jsxs(Text,{dimColor:true,children:["[",n.key,"] "]}),jsxs(Text,{color:o?n.color:void 0,dimColor:!o,children:[o?"\u25C9":"\u25CB"," ",n.label]})]},n.key)})]})}j();function Au({type:e}){let{label:t,color:r}=un[e];return jsx(Text,{color:r,children:t})}j();function Lu({origin:e}){return e===no?jsx(Text,{color:"blue",children:"[Flow]"}):jsx(Text,{color:"white",children:"[External]"})}B();var js=yy.memo(function({item:t,isSelected:r}){let n=t.status==="disabled"?"yellow":"green";return jsxs(Box,{flexDirection:"column",paddingBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:r?"cyan":"gray",children:r?"\u203A ":"\u25CB "}),jsx(Text,{bold:r,color:r?"cyan":"white",children:t.name}),t.type&&jsxs(Text,{children:[" ",jsx(Au,{type:t.type})]}),t.origin&&jsxs(Text,{children:[" ",jsx(Lu,{origin:t.origin})]}),jsxs(Text,{dimColor:true,children:[t.authorName?` \xB7 ${t.authorName}`:"",t.version?` \xB7 v${t.version}`:" \xB7 n/a"]}),t.status&&jsxs(Text,{color:n,children:[" [",t.status,"]"]}),t.updateAvailable&&jsx(Text,{color:"yellow",children:" [\u2191 update available]"}),t.installedAt&&jsxs(Text,{dimColor:true,children:[" \xB7 ",Ct(t.installedAt)]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:t.description})})]})});function kn({message:e}){return jsx(Box,{paddingX:2,paddingY:1,children:jsx(Text,{dimColor:true,children:e??"No items found."})})}j();function Du({items:e,emptyMessage:t}){let r=S(l=>l.selectedIndex);if(e.length===0)return jsx(kn,{message:t});let n=Math.max(0,r-Math.floor(Qe/2)),o=Math.min(e.length,n+Qe);o===e.length&&(n=Math.max(0,o-Qe));let s=e.slice(n,o),i=n,a=e.length-o;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:i>0?`\u2191 ${i} more above`:" "})}),s.map((l,u)=>jsx(js,{item:l,isSelected:n+u===r},l.name)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:a>0?`\u2193 ${a} more below`:" "})})]})}function Nu({label:e,pathHint:t}){return jsxs(Box,{paddingBottom:1,children:[jsx(Text,{bold:true,color:"blueBright",children:e}),jsxs(Text,{dimColor:true,children:[" ",t]})]})}j();function Fu({groups:e,emptyMessage:t}){let r=S(p=>p.selectedIndex),n=[],o=0;for(let p of e){n.push({kind:"header",label:p.label,pathHint:p.pathHint,key:`h-${p.scope}`});for(let f of p.items)n.push({kind:"item",item:f,itemIndex:o,key:`i-${p.scope}-${f.name}-${f.marketplace??""}`}),o++;}if(o===0)return jsx(kn,{message:t});let i=n.findIndex(p=>p.kind==="item"&&p.itemIndex===r),a=i>=0?i:0,l=Math.max(0,a-Math.floor(Qe/2)),u=Math.min(n.length,l+Qe);u===n.length&&(l=Math.max(0,u-Qe));let c=n.slice(l,u),d=l,m=n.length-u;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:d>0?`\u2191 ${d} more above`:" "})}),c.map(p=>p.kind==="header"?jsx(Nu,{label:p.label,pathHint:p.pathHint},p.key):jsx(js,{item:p.item,isSelected:p.itemIndex===r},p.key)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:m>0?`\u2193 ${m} more below`:" "})})]})}var Py={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function Ty({items:e,tabId:t,emptyMessage:r,groups:n,actionHint:o}){return jsxs(Box,{flexDirection:"column",children:[jsx(Cu,{}),jsx(ku,{}),jsxs(Box,{paddingX:1,marginTop:1,children:[jsx(Text,{bold:true,children:Py[t]}),jsxs(Text,{dimColor:true,children:[" (",e.length,")"]}),o&&e.length>0&&jsx(Text,{dimColor:true,children:` \xB7 ${o}`})]}),n&&n.length>0?jsx(Fu,{groups:n,emptyMessage:r}):jsx(Du,{items:e,emptyMessage:r})]})}function ju({filteredItems:e,emptyMessage:t,groups:r,onBatchUpdate:n}){let o=S(l=>l.activeTab),s=S(l=>l.focus);return useInput(l=>{l==="a"&&e.length>0&&n?.();},{isActive:o==="updates"&&s==="list"}),jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(Ty,{items:e,tabId:o,emptyMessage:t,groups:o!=="discover"?r:void 0,actionHint:o==="updates"?"press 'a' to update all":void 0},o)})}var Ay={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 Ks(){let e=S(r=>r.focus),t=!!process.env.DEBUG;return jsx(Box,{borderStyle:"single",borderTop:true,borderBottom:false,borderLeft:false,borderRight:false,children:jsxs(Text,{dimColor:true,children:[Ay[e],t?" | Ctrl+D: debug log":""]})})}B();function Ku({message:e,type:t}){return e?jsx(Box,{paddingX:1,children:jsxs(Text,{color:t==="success"?"green":t==="info"?"cyan":"red",children:[t==="success"?"\u2713":t==="info"?"(i)":"\u2717"," ",h(e)]})}):null}function Vs({message:e}){return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(np,{type:"dots"})}),jsxs(Text,{children:[" ",e]})]})}function Va(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}var Gu=20;function Hs(e,t){let r=t>0?Math.min(e/t,1):0,n=Math.round(r*100),o=Math.round(r*Gu),s="\u2588".repeat(o)+"\u2591".repeat(Gu-o),i=`${Va(e)} / ${Va(t)}`;return {bar:s,percent:n,label:i}}function Js({received:e,total:t}){let{bar:r,percent:n,label:o}=Hs(e,t);return jsxs(Text,{dimColor:true,children:[r," ",n,"%"," ","(",o,")"]})}function Gs({message:e,onRetry:t,onBack:r}){return useInput((n,o)=>{n==="r"&&o.ctrl&&t?t():o.escape&&r&&r();}),jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsxs(Text,{color:"red",children:["\u2717 ",e]}),t&&jsx(Text,{dimColor:true,children:"Press Ctrl+R to retry"}),r&&jsx(Text,{dimColor:true,children:"Press Escape to go back"})]})}function ot({itemName:e,actions:t,descriptions:r,onAction:n,onClose:o}){let s=S(l=>l.focus),[i,a]=useState(0);return useInput((l,u)=>{u.upArrow?a(c=>c>0?c-1:c):u.downArrow?a(c=>c<t.length-1?c+1:c):u.return?n(t[i]):u.escape&&o();},{isActive:s==="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:t.map((l,u)=>jsxs(Box,{children:[jsxs(Text,{bold:u===i,color:u===i?"cyan":void 0,children:[u===i?"\u203A ":" ",l]}),r?.[l]&&jsxs(Text,{dimColor:true,children:[" \u2014 ",r[l]]})]},u))})]})}j();var Wa=Object.entries(Gt),qu=[...Wa.map(([,e])=>e.actionLabel),"Cancel"],Yu=Object.fromEntries(Wa.map(([,e])=>[e.actionLabel,e.description]));function Zu(e){let t=Wa.find(([,r])=>r.actionLabel===e);return t?t[0]:null}$();var Hy=x("provider.registry"),Jy=3e4,zs=class{adapters=new Map;availabilityCache=new Map;register(t){this.adapters.set(t.id,t);}async checkAvailability(t){let r=this.availabilityCache.get(t.id);if(r&&Date.now()<r.expiresAt)return r.result;let n=await t.isAvailable();return this.availabilityCache.set(t.id,{result:n,expiresAt:Date.now()+Jy}),n}async getAvailableProviders(t){let r=[...this.adapters.values()].filter(o=>t in o.installers),n=await Promise.allSettled(r.map(o=>this.checkAvailability(o)));return n.forEach((o,s)=>{o.status==="rejected"&&Hy.warn(`Provider "${r[s].id}" isAvailable() threw: ${String(o.reason)}`);}),r.filter((o,s)=>{let i=n[s];return i.status==="fulfilled"&&i.value===true})}getAdapter(t){return this.adapters.get(t)}listAdapters(){return [...this.adapters.values()]}};var Gy={user:"global",project:"project",local:"local"};function Xs(e){return e?Gy[e]:"global"}var ze=class extends Error{constructor(r,n){super(`${r} v${n} is already installed. Use --force to reinstall.`);this.pluginName=r;this.version=n;this.name="AlreadyInstalledError";}pluginName;version},Pr=class extends Error{constructor(r,n){super(`${r} is already up to date (v${n})`);this.pluginName=r;this.version=n;this.name="AlreadyUpToDateError";}pluginName;version};Eo();za();$();var Xy=x("catalog.registry"),qs=class{adapters=new Map;register(t){this.adapters.set(t.id,t);}unregister(t){this.adapters.delete(t);}async fetchAllWithErrors(){let t=this.listAdapters(),r=await Promise.allSettled(t.map(s=>s.fetchItems())),n=[],o=[];for(let s=0;s<r.length;s++){let i=r[s],a=t[s];if(i.status==="fulfilled")n.push(...i.value);else {let l=String(i.reason);Xy.warn(`Catalog adapter failed: ${l}`),o.push({adapterId:a.id,adapterName:a.name,reason:l});}}return {items:n,failures:o}}async fetchAll(){let{items:t}=await this.fetchAllWithErrors();return t}getAdapter(t){return this.adapters.get(t)}listAdapters(){return [...this.adapters.values()]}};He();var nw={retries:5,minTimeout:50};async function Xa(e,t){mkdirSync(dirname(e),{recursive:true});let r=await Bh.lock(e+".lock",{realpath:false,retries:nw});try{return await t()}finally{await r();}}var Ys=class{filePath;constructor(t){this.filePath=t??wc();}async read(){try{let t=await readFile(this.filePath,"utf-8");return JSON.parse(t).catalogs??[]}catch(t){if(t.code==="ENOENT")return [];throw t}}async write(t){let r=dirname(this.filePath);await mkdir(r,{recursive:true});let n=`${this.filePath}.${randomUUID()}.tmp`;await writeFile(n,JSON.stringify({catalogs:t},null,2),"utf-8"),await rename(n,this.filePath);}async add(t){await Xa(this.filePath,async()=>{let r=await this.read();if(r.some(o=>o.id===t.id))return;let n={...t,lastUpdated:t.lastUpdated??new Date().toISOString()};await this.write([...r,n]);});}async remove(t){if(t==="flow-api")throw new Error("The Flow Marketplace catalog cannot be removed");await Xa(this.filePath,async()=>{let r=await this.read();await this.write(r.filter(n=>n.id!==t));});}async updateField(t,r){await Xa(this.filePath,async()=>{let n=await this.read();n.some(o=>o.id===t)&&await this.write(n.map(o=>o.id===t?{...o,...r}:o));});}};Ya();var de=new qs,Zt=new Ys,mw=["flow-harness"];function fw(){let e=process.env.FLOW_CONTENT_SOURCES;return e===void 0?mw:e.split(",").map(t=>t.trim()).filter(Boolean)}de.register(new Dn);for(let e of fw())de.register(new Dn(e));var ld=false;async function cd(){if(ld)return;ld=true;let e=await Zt.read(),{GitRepoAdapter:t}=await Promise.resolve().then(()=>(Za(),ad));for(let r of e)de.register(new t(r.id,r.name,r.source));}Tr();var ud=2;async function Qt(e){if(e){let{FlowApiAdapter:t}=await Promise.resolve().then(()=>(Ya(),td));return new t(e).fetchItems()}return de.fetchAll()}async function dd(){return de.fetchAllWithErrors()}async function Un(e,t){Po(e);try{return await $n(`v1/plugins/${e}/manifest`,t).json()}catch(r){let n=await Rn(r);throw n?new Error(n):r instanceof Error?r.message.includes("404")?new Error(`Plugin '${e}' not found in catalog`):r.message.includes("timeout")?new Error("Download timed out after 30s"):new Error(`Failed to fetch plugin manifest: ${r.message}`):r}}async function pd(e,t,r){Po(e);try{let n=await $n(`v1/plugins/${e}/archive`,r),o=n.headers.get("x-archive-size"),s=o?Number(o):NaN,i=Number.isFinite(s)&&s>0?s:0,a=i>0,l=n.body;if(!l)throw new Error("Failed to download plugin: response has no body");let u=l.getReader(),c=[],d=0;for(;;){let{done:m,value:p}=await u.read();if(m)break;if(d+=p.byteLength,a&&d>i*ud)throw await u.cancel(),new Error(`Download exceeded expected size: received ${d} bytes, expected at most ${i*ud}`);c.push(p),a&&t?.(d,i);}return Buffer.concat(c)}catch(n){if(n instanceof Error&&n.message.includes("Download exceeded expected size"))throw n;let o=await Rn(n);throw o?new Error(o):n instanceof Error?new Error(`Failed to download plugin: ${n.message}`):n}}async function Qs(){try{let{profiles:e}=await Yt().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}}He();He();async function md(e,t){let r=xe.resolve(t);await Dt.mkdir(r,{recursive:true});let n=xe.join(xe.dirname(r),`${randomUUID()}.zip`);try{await Dt.writeFile(n,e);let o=await hw.Open.file(n),s=xe.normalize(r+xe.sep);for(let i of o.files){if((i.externalFileAttributes>>16&61440)===40960)throw new Error(`Zip Slip (symlink): entry "${i.path}" is a symbolic link and was rejected`);let l=xe.resolve(r,i.path);if(process.platform==="win32"&&l.length>=260)throw new Error(`Path too long: "${l}" (${l.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(!l.startsWith(s)&&l!==r)throw new Error(`Zip Slip detected: entry "${i.path}" would escape target directory`)}await o.extract({path:r});try{let i=realpathSync(r);if(!i.startsWith(xe.resolve(xe.dirname(r))))throw new Error(`Zip Slip (post-extract): resolved path "${i}" is outside expected parent`)}catch(i){if(i.code!=="ENOENT")throw i}}finally{try{await Dt.unlink(n);}catch{}}}async function Qa(e){await Dt.rm(e,{recursive:true,force:true});}async function Cr(){let e=hc();await Dt.mkdir(xe.dirname(e),{recursive:true});try{await Dt.writeFile(e,"",{flag:"wx"});}catch(r){if(r.code!=="EEXIST")throw r}return await Bh.lock(e,{stale:1e4,retries:{retries:2,minTimeout:500,maxTimeout:500}})}He();j();function Sw(e){return {$schema:"https://anthropic.com/claude-code/marketplace.schema.json",name:e||le,description:"Flow Skills marketplace",owner:{name:"Flow Team",email:"flow@ciandt.com"},plugins:[]}}function hd(e){let t=ns(e);if(!be__default.existsSync(t))return null;try{return JSON.parse(be__default.readFileSync(t,"utf-8"))}catch{return null}}function xw(e){let t=hd(e);if(t)return t;let r=Sw(e),n=ns(e);return be__default.mkdirSync(xe__default.dirname(n),{recursive:true}),el(r,e),r}function el(e,t){let r=ns(t),n=`${r}.${randomUUID()}.tmp`;be__default.writeFileSync(n,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),be__default.renameSync(n,r);}function bw(e){let t=e||le,r=Nr(),n={};try{be__default.existsSync(r)&&(n=JSON.parse(be__default.readFileSync(r,"utf-8")));}catch{n={};}if(n[t])return;n[t]={source:{source:"github",repo:`cit-flow/${t}`},installLocation:gc(e),lastUpdated:new Date().toISOString(),autoUpdate:true};let o=`${r}.${randomUUID()}.tmp`;be__default.writeFileSync(o,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}),be__default.renameSync(o,r);}function yd(e,t,r){bt(e.name),bw(r);let n=Qi(e.name,r);be__default.mkdirSync(xe__default.dirname(n),{recursive:true});try{be__default.lstatSync(n),be__default.rmSync(n,{recursive:!0,force:!0});}catch{}be__default.cpSync(t,n,{recursive:true,dereference:true});let o=xw(r);o.plugins.some(i=>i.name===e.name)||(o.plugins.push({name:e.name,description:e.description,version:e.version,author:e.author,source:`./plugins/native/${e.name}`,category:e.category}),el(o,r));}function tl(e,t){bt(e);let r=Qi(e,t);try{be__default.rmSync(r,{recursive:!0,force:!0});}catch{}let n=hd(t);if(!n)return;let o=n.plugins.length;n.plugins=n.plugins.filter(s=>s.name!==e),n.plugins.length!==o&&el(n,t);}B();$();var vw=x("mcpConfigReader"),Ew=500,Pw=512;function Tw(){return xe__default.join(Le__default.homedir(),".claude.json")}function Cw(){return xe__default.join(process.cwd(),".mcp.json")}function Sd(e){if(!be__default.existsSync(e))return null;try{return JSON.parse(be__default.readFileSync(e,"utf-8"))}catch{return vw.debug(`[mcpConfigReader] Failed to parse ${e}`),null}}function To(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function rl(e){if(!To(e))return {};let t=e.mcpServers;return To(t)?t:{}}function nl(e,t){return Object.keys(e).slice(0,Ew).map(n=>({name:h(n.slice(0,Pw)),marketplace:"",version:void 0,installedAt:"",installPath:"",scope:t,description:void 0,author:void 0,status:"enabled",type:"mcp"}))}function bd(){let e=[],t=Tw(),r=Sd(t);if(To(r)){let a=r,l=rl(a);e.push(...nl(l,"user"));let u=process.cwd();if(To(a.projects)){let c=a.projects[u];if(To(c)){let d=rl(c);e.push(...nl(d,"local"));}}}let n=Cw(),o=Sd(n),s=rl(o);e.push(...nl(s,"project"));let i=new Map;for(let a of e){let l=`${a.name}@${a.scope}`;i.has(l)||i.set(l,a);}return [...i.values()]}$();var st=x("storage");async function Aw(e,t,r){try{await v(I.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:r,source:t,interface:Z().interfaceType});}catch(n){st.warn(`Failed to send uninstall metrics: ${String(n)}`);}}function $w(e,t,r){let n=t==="enabled"?I.CLI_TOOL_ENABLED:I.CLI_TOOL_DISABLED;v(n,{tool_id:e,source:r,interface:Z().interfaceType}).catch(o=>st.warn(`Failed to send ${t} metrics: ${String(o)}`));}function al(){return xe__default.join(Le__default.homedir(),".claude","plugins","installed_plugins.json")}function Rw(){return xe__default.join(Le__default.homedir(),".claude","plugins")}function ei(e){let t;try{t=be__default.realpathSync(e);}catch{t=xe__default.resolve(e);}let r=xe__default.resolve(Rw()),n=xe__default.resolve(xe__default.join(process.cwd(),".claude","plugins")),o=t.startsWith(r+xe__default.sep),s=t.startsWith(n+xe__default.sep);if(!o&&!s)throw new Error(`Security error: installPath '${e}' is outside the plugins directory`)}function vd(e="user"){return e==="local"?xe__default.join(process.cwd(),".claude","settings.local.json"):e==="project"?xe__default.join(process.cwd(),".claude","settings.json"):xe__default.join(Le__default.homedir(),".claude","settings.json")}function De(){let e=al();if(!be__default.existsSync(e))return {version:2,plugins:{}};try{return JSON.parse(be__default.readFileSync(e,"utf-8"))}catch{return {version:2,plugins:{}}}}async function ll(){let e=al();try{let t=await be__default.promises.readFile(e,"utf-8");return JSON.parse(t)}catch{return {version:2,plugins:{}}}}function Lw(e){let t=e?.code;return t==="EACCES"||t==="EPERM"}function Ed(e,t){try{be__default.mkdirSync(xe__default.dirname(e),{recursive:!0});let r=`${e}.${randomUUID()}.tmp`;be__default.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),be__default.renameSync(r,e);}catch(r){throw Lw(r)?new Error(`Permission denied: cannot write to '${e}'. Check your file system permissions.`):r}}function it(e){Ed(al(),e);}function Co(e){let t=e.lastIndexOf("@");return t===-1?{name:e,marketplace:""}:{name:e.slice(0,t),marketplace:e.slice(t+1)}}function Mw(e,t){let r=xe__default.join(e,".claude-plugin"),n=xe__default.join(r,"plugin.json");if(be__default.existsSync(n))try{return JSON.parse(be__default.readFileSync(n,"utf-8"))}catch{return null}let o=xe__default.join(r,"marketplace.json");if(be__default.existsSync(o))try{let s=JSON.parse(be__default.readFileSync(o,"utf-8"));return {description:s.plugins?.find(a=>a.name===t)?.description,author:s.owner}}catch{return null}return null}function cl(e="user"){let t=vd(e);if(!be__default.existsSync(t))return {};try{return JSON.parse(be__default.readFileSync(t,"utf-8"))}catch{return {}}}function Pd(e,t="user"){Ed(vd(t),e);}function _w(e,t){let{name:r,marketplace:n}=Co(e),o;if(n?(o=`${r}@${n}`,t[o]||(o=void 0)):o=Object.keys(t).filter(i=>Co(i).name===r)[0],!o)throw st.error(`[${r}] Plugin is not installed`),new Error(`Plugin '${r}' is not installed`);return {key:o,name:r}}function Dw(e,t){let{name:r,marketplace:n}=Co(e),o;return n?(o=`${r}@${n}`,t[o]||(o=void 0)):o=Object.keys(t).filter(i=>Co(i).name===r)[0],o?{key:o,name:r}:null}function ol(e="user"){return cl(e).enabledPlugins??{}}function sl(e,t="user"){let r=cl(t),n=r.enabledPlugins;if(!n||!(e in n))return;let{[e]:o,...s}=n;r.enabledPlugins=s,Pd(r,t);}function ko(e,t,r="user"){let n=cl(r),o=n.enabledPlugins??{};n.enabledPlugins={...o,[e]:t},Pd(n,r);}function Ow(e){let t=new Map;for(let r of e){let n=r.projectPath?`${r.scope}:${r.projectPath}`:r.scope,o=t.get(n);(!o||r.installedAt>o.installedAt)&&t.set(n,r);}return [...t.values()]}function ie(){let e=De(),t=ol(),r=ol("project"),n=ol("local"),o={project:r,local:n},s=Object.entries(e.plugins).flatMap(([u,c])=>{let{name:d,marketplace:m}=Co(u),p=c.map(y=>y.scope==="managed"?{...y,scope:"user"}:y);return Ow(p).map(y=>{let g=Mw(y.installPath,d),E=(o[y.scope]??t)[u];return {name:d,marketplace:m,version:y.version&&y.version!=="unknown"?y.version:void 0,installedAt:y.installedAt,installPath:y.installPath,scope:y.scope,providerId:y.providerId,type:y.type,description:g?.description,author:g?.author,status:E===false?"disabled":"enabled"}})}),i=bd(),a=new Set(s.map(u=>`${u.name}@${u.scope}`)),l=i.filter(u=>!a.has(`${u.name}@${u.scope}`));return [...s,...l]}function Id(e){let t=e.lastIndexOf("@");return t>0?e.slice(t+1):void 0}async function Ao(e,t){st.debug(`[${e}] Acquiring lock to uninstall`);let r=await Cr();try{let n=De(),o=Dw(e,n.plugins);if(!o)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:s,name:i}=o,a=n.plugins[s];if(t){let l=a.find(d=>d.scope===t);if(!l)throw new Error(`Plugin '${i}' is not installed in ${t} scope`);st.debug(`[${i}] Resolved key: ${s}, scope: ${t}`),ei(l.installPath);let u=xe__default.dirname(l.installPath);ei(u),st.debug(`[${i}] Removing directory: ${u}`),be__default.rmSync(u,{recursive:!0,force:!0});let c=a.filter(d=>d.scope!==t);if(c.length===0){let{[s]:d,...m}=n.plugins;it({...n,plugins:m}),sl(s,t),tl(i,Id(s));}else n.plugins[s]=c,it(n),sl(s,t);}else {st.debug(`[${i}] Resolved key: ${s}`);for(let c of a){ei(c.installPath);let d=xe__default.dirname(c.installPath);ei(d),st.debug(`[${i}] Removing directory: ${d}`),be__default.rmSync(d,{recursive:!0,force:!0}),sl(s,c.scope);}tl(i,Id(s));let{[s]:l,...u}=n.plugins;it({...n,plugins:u});}await Aw(i,a[0].origin??"internal",a[0].type??"skill"),st.debug(`[${i}] Uninstalled successfully`);}finally{await r();}}async function $o(e,t,r){st.debug(`[${e}] Acquiring lock to set status \u2192 ${t}`);let n=await Cr();try{let o=De(),{key:s,name:i}=_w(e,o.plugins),a=o.plugins[s],l=r??a[0].scope,u=a[0].origin??"internal";st.debug(`[${i}] Resolved key: ${s}, scope: ${l}`),ko(s,t==="enabled",l),$w(i,t,u),st.debug(`[${i}] Status updated to ${t}`);}finally{await n();}}j();$();var Uw=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,Nw=/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)?$/;function bt(e){if(!Uw.test(e))throw new Error(`Invalid plugin name from manifest: "${e}". Plugin names must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Bw(e){if(!Nw.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 kr=x("installer");function Fw(e,t,r){let n=`${e}@${r||le}`,s=De().plugins[n];if(s&&!t)throw new ze(e,s[0].version??"unknown");return {pluginKey:n,alreadyInstalled:s}}async function jw(e,t,r){r&&await Qa(t);try{kr.debug(`[${t}] Extracting archive...`),await md(e,t);}catch(n){throw await Qa(t),n}}function Kw(e,t,r,n,o,s="claude-code",i){let a=De(),l={scope:n,...n==="user"?{}:{projectPath:process.cwd()},installPath:t,version:r,installedAt:new Date().toISOString(),origin:o,providerId:s,type:i},u=a.plugins[e]??[];a.plugins[e]=[...u.filter(c=>c.scope!==n),l],it(a),ko(e,true,n);}async function Vw(e,t,r,n,o,s){try{await v(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:s,source:o,scope:n,version:t,duration_ms:r,interface:Z().interfaceType});}catch(i){kr.warn(`Failed to send install metrics: ${String(i)}`);}}async function Hw(e,t,r,n){try{await v(I.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:n,source:r,error_code:t instanceof Error?t.name:"UNKNOWN",error_message:(t instanceof Error?t.message:String(t)).slice(0,500),interface:Z().interfaceType});}catch(o){kr.warn(`Failed to send install-failed metrics: ${String(o)}`);}}async function Oe(e,t={}){let r=Date.now(),n=null;try{kr.debug(`[${e}] Acquiring lock...`),n=await Cr();let{pluginKey:o,alreadyInstalled:s}=Fw(e,t.force,t.source),{source:i}=t;kr.debug(`[${e}] Fetching manifest...`);let a=await Un(e,i);bt(a.name),Bw(a.version),kr.debug(`[${e}] Downloading archive...`);let l=await pd(e,t.onDownloadProgress,i),u=t.scope??"user",c=t.type??"skill",d=fc(a.name,a.version,t.source);await jw(l,d,!!s&&!!t.force),Kw(o,d,a.version,u,"internal",t.providerId,c),yd(a,d,t.source);let m=Date.now()-r;kr.debug(`[${e}] Installed successfully in ${m}ms`);let p={name:a.name,version:a.version,path:d,duration_ms:m};return t.skipMetrics||await Vw(a.name,a.version,m,Xs(u),"internal",c),p}catch(o){throw await Hw(e,o,"internal",t.type??"skill"),kr.error(`[${e}] Installation failed: ${o instanceof Error?o.message:String(o)}`),o}finally{n&&await n();}}$();B();Ie();In();$();var Jw=x("commands:helpers");async function pe(){let e=await Y();if(!e)return P("Not authenticated. Run: flow auth login"),false;e.customUrl&&kt(e.customUrl);try{await $t();}catch(t){return Jw.debug(`Token validation failed: ${String(t)}`),P("Session expired. Run: flow auth login"),false}return true}async function Ue(e){let t=dl.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(h(e),n=>{t.close(),r(["y","yes"].includes(n.toLowerCase().trim()));});})}async function Td(e){let t=dl.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(h(e),n=>{t.close(),r(n.trim());});})}var Gw="\x1B[A",Ww="\x1B[B";function Cd(e,t){let r=t?T.cyan("\u276F"):" ",n=t?T.cyan(e.label):e.label,o=e.description?T.dim(` \u2014 ${e.description}`):"";return ` ${r} ${n}${o}`}function zw(e,t){return e.map((r,n)=>Cd(r,n===t)).join(`
|
|
111
|
-
`)}async function
|
|
112
|
-
`),process.stdout.write(
|
|
110
|
+
`),this.warned=!0;}ys().set(`${t}:${r}`,n);}async deleteSecret(t,r){let n=ys(),o=`${t}:${r}`;return n.has(o)?(n.delete(o),!0):!1}getStoragePath(){return ys().path}static hasExistingData(){try{let t=new va({projectName:Ea});return ve.existsSync(t.path)}catch{return !1}}static clearFallbackFile(){try{let t=new va({projectName:Ea});ve.rmSync(t.path,{force:!0});}catch{}ws=null;}};});async function Pa(){if(We.hasExistingData())return new We;switch(process.platform){case "darwin":return await Sn.isAvailable()?new Sn:new We;case "linux":return await fr.isAvailable()?new fr:await fr.ensureInstalled()?new fr:new We;case "win32":return await bn.isAvailable()?new bn:new We;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var Gc=J(()=>{"use strict";ga();wa();Ia();uo();});var Wc=J(()=>{"use strict";ta();ma();Gc();ga();wa();Ia();uo();});async function gr(){return bs||(bs=Pa()),bs}function Is(){bs=null;}async function Z(){let t=await(await gr()).getSecret(Xt,Ta);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function hr(e){let{clientId:t,clientSecret:r,tenant:n}=e,o=[!t?.trim()&&"clientId",!r?.trim()&&"clientSecret",!n?.trim()&&"tenant"].filter(Boolean);if(o.length>0)throw zc.error(`missing or empty fields: ${o.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await gr()).setSecret(Xt,Ta,JSON.stringify(e));}async function Xc(){let e=await gr();await e.deleteSecret(Xt,Ta),await e.deleteSecret(Xt,Ca),await e.deleteSecret(Xt,ka);}async function qc(){return (await gr()).getStoragePath()}async function Yc(e){await(await gr()).setSecret(Xt,Ca,JSON.stringify(e));}async function vs(){let t=await(await gr()).getSecret(Xt,Ca);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Es(e){await(await gr()).setSecret(Xt,ka,JSON.stringify(e));}async function In(){let t=await(await gr()).getSecret(Xt,ka);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function yr(){let e=await vs();return e?new Date(e.expiresAt)>new Date:false}function Rt(e){let t=e.replace(/\/$/,"");process.env.AUTH_ENGINE_URL=`${t}/auth-engine-api/v2/api-key/token`,process.env.PROMPT_MANAGER_URL=`${t}/prompt-manager-api/`,process.env.METRICS_COLLECTOR_URL=`${t}/metrics-collector-api/`,zc.debug(`[customUrl] Service URLs overridden to base: ${t}`);}var zc,Xt,Ta,Ca,ka,bs,Ee=J(()=>{"use strict";Wc();R();zc=x("config:credentials"),Xt="flow-plugins-cli",Ta="credentials",Ca="token-cache",ka="user-info",bs=null;});function vn(e){let t=e.split(".");if(t.length!==3)throw new Error(`Invalid JWT: expected 3 segments, got ${t.length}`);let r=t[1].replace(/-/g,"+").replace(/_/g,"/"),n=Buffer.from(r,"base64").toString("utf8");try{return JSON.parse(n)}catch{throw new Error("Invalid JWT: payload segment is not valid JSON")}}var Ps=J(()=>{"use strict";});function Rh(e){if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).match(/^::(?:ffff:)?([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);if(!r)return null;let n=parseInt(r[1],16),o=parseInt(r[2],16);return `${n>>8&255}.${n&255}.${o>>8&255}.${o&255}`}function Aa(e){if(Zc.some(r=>r.test(e)))return true;let t=Rh(e);return !!(t&&Zc.some(r=>r.test(t)))}function $h(e,t){let r=process.env[e]??t;if(!r)throw new Error(`Missing required environment variable: ${e}`);return r}function $t(e,t){let r=$h(e,t),n;try{n=new URL(r);}catch{throw new Error(`${e} must be a valid URL. Got: "${r}"`)}let o=process.env.NODE_ENV==="development";if(!o&&n.protocol!=="https:")throw new Error(`${e} must be an HTTPS URL. Got protocol: "${n.protocol}"`);if(n.username||n.password)throw new Error(`${e} must not contain embedded credentials (user:pass@host is not allowed)`);if(/^169\.254\./i.test(n.hostname)||/^metadata\.(google|azure)\.internal\.?$/i.test(n.hostname)||/^100\.(6[4-9]|[7-9]\d|1[0-2][0-7])\./i.test(n.hostname))throw new Error(`${e} must not point to a cloud metadata endpoint. Got: "${n.hostname}"`);if(!o&&Aa(n.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${n.hostname}"`);return r}var Zc,Hr=J(()=>{"use strict";Zc=[/^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 _h(e){if(!zt.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}async function Dh(e){if(e instanceof HTTPError){let t=e.response.status;Ra.debug(`HTTP error during authentication [status=${t}]`);let r="";try{let n=await e.response.text(),o=JSON.parse(n);typeof o.error=="string"&&(r=o.error);}catch{}return r&&Qc[r]?new Error(Qc[r]):t===StatusCodes.UNAUTHORIZED||t===StatusCodes.FORBIDDEN||t===StatusCodes.INTERNAL_SERVER_ERROR?new Error("Invalid credentials"):t>=StatusCodes.BAD_REQUEST&&t<StatusCodes.INTERNAL_SERVER_ERROR?new Error("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}return e instanceof Error?(Ra.debug(`Non-HTTP error during authentication: ${e.message}`),e):(Ra.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function Jr(e){let t=$t("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");_h(e.tenant);let r;try{r=await Sd.post(t,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(s){throw await Dh(s)}let n=r.expires_at??new Date(Date.now()+(r.expires_in??3600)*1e3).toISOString();await hr(e),await Yc({accessToken:r.access_token,expiresAt:n});let o=vn(r.access_token);await Es({sub:o.sub,name:o.name,email:o.email});}var Ra,Qc,Ts=J(()=>{"use strict";Ee();Ps();Hr();R();j();Ra=x("api:auth");Qc={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 Lt(){if(await yr()){let n=await vs();if(n)return n.accessToken}eu.debug("Token expired or missing, re-authenticating...");let t=await Z();if(!t)throw new Error("Not authenticated. Run: flow auth login");We.clearFallbackFile(),Is(),await Jr(t);let r=await vs();if(!r)throw new Error("Authentication succeeded but token was not persisted");return eu.debug("Token refreshed successfully"),r.accessToken}var eu,En=J(()=>{"use strict";Ee();Ts();uo();R();eu=x("lib:tokenProvider");});function Zt(){return Sd.create({prefix:$t("PROMPT_MANAGER_URL","https://flow.ciandt.com/prompt-manager-api/"),redirect:"error",hooks:{beforeRequest:[async({request:e})=>{let t=await Lt();e.headers.set("Authorization",`Bearer ${t}`);let r=await Z();r?.tenant&&zt.test(r.tenant)&&e.headers.set("FlowTenant",r.tenant);}]}})}var To=J(()=>{"use strict";Hr();Ee();En();j();});function Ln(e,t){let r=Zt();return t?r.get(e,{searchParams:{source:t}}):r.get(e)}async function Mn(e){if(!(e instanceof HTTPError))return null;try{let t=await e.response.clone().json(),{message:r}=t;return Array.isArray(r)?r.filter(Boolean).join("; ")||null:typeof r=="string"&&r?r:null}catch{return null}}var Qa=J(()=>{"use strict";To();});function Co(e){if(!e||!Mw.test(e))throw new Error(`Invalid plugin name: "${e}". Must be 1-64 chars, lowercase alphanumeric and hyphens only.`)}function _n(e){return _w.test(e)}function Dn(e){let t=e.indexOf("@");return t>0?e.slice(0,t):e}function tl(e){if(!Dw.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 On(e,t){let r=Dn(e);tl(r);let n=["claude","plugin","install",r];return t&&n.push("--scope",t),n.join(" ")}function ti(e){let t=e.trim();if(!t)throw new Error("No marketplace source provided.");if(!Ow.test(t)&&!Uw.test(t))throw new Error(`Invalid marketplace source: "${t}". Must be owner/repo or an https:// URL.`);return t}var Mw,_w,Dw,Ow,Uw,Cr=J(()=>{"use strict";Mw=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;_w=/^[^@]+@[^@]+$/;Dw=/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\/[a-zA-Z0-9][a-zA-Z0-9._-]*)?$/;Ow=/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/,Uw=/^https:\/\/[\w./:@?&=+#%-]+$/;});var gd={};Ec(gd,{FlowApiAdapter:()=>Un});var Nw,Un,rl=J(()=>{"use strict";To();Qa();R();Cr();Nw=x("catalog.flow-api"),Un=class{id;name;source;removable=!1;contentSource;constructor(t){this.contentSource=t,this.id=t?`flow-api:${t}`:"flow-api",this.name=t?`Flow Marketplace (${t})`:"Flow Marketplace",this.source=process.env.PROMPT_MANAGER_URL??"";}async fetchItems(){try{let{plugins:t}=await Ln("v1/plugins/catalog",this.contentSource).json();return t.map(r=>({...r,catalogId:this.id,origin:r.origin??"internal",type:r.type??"bundle",...this.contentSource?{contentSource:this.contentSource}:{}}))}catch(t){let r=await Mn(t);if(r)throw new Error(r);if(t instanceof HTTPError){let{status:n}=t.response;throw n===401||n===403?new Error("Authentication failed. Run: flow auth login"):new Error(`Failed to fetch plugin catalog: HTTP ${n}`)}throw t instanceof Error?t.name==="TimeoutError"||t.message.includes("timeout")?new Error("Request timed out while fetching plugin catalog"):new Error(`Failed to fetch plugin catalog: ${t.message}`):t}}async fetchManifest(t){Co(t);try{return await Ln(`v1/plugins/${t}/manifest`,this.contentSource).json()}catch(r){let n=await Mn(r);if(n)throw new Error(n);if(r instanceof HTTPError){let{status:o}=r.response;throw o===404?new Error(`Plugin '${t}' not found in catalog`):new Error(`Failed to fetch manifest: HTTP ${o}`)}throw r instanceof Error?new Error(`Failed to fetch manifest: ${r.message}`):r}}async ping(){try{return await Zt().head("v1/plugins/catalog"),Nw.debug("ping ok"),!0}catch{return !1}}};});function Fw(){let e=process.env.GH_TOKEN??process.env.GITHUB_TOKEN;return e?Promise.resolve(e):execa("gh",["auth","token"],{reject:false}).then(({stdout:t})=>t.trim()||void 0).catch(()=>{})}function yd(){return hd??=Fw(),hd}var hd,wd=J(()=>{"use strict";});var bd={};Ec(bd,{GitRepoAdapter:()=>Nn});function xd(e,t){if(!jw.test(e))throw new Error(`Invalid ${t} in catalog source URL: "${e}"`)}var jw,Nn,nl=J(()=>{"use strict";wd();Hr();jw=/^[a-zA-Z0-9_.-]+$/;Nn=class{id;name;source;constructor(t,r,n){this.id=t,this.name=r,this.source=n;}buildRawUrl(t,r="marketplace.json"){let n=new URL(this.source),{hostname:o,pathname:s}=n;if(Aa(o))throw new Error(`Catalog source URL points to a private/loopback address: "${o}"`);let i=s.replace(/^\//,"").split("/"),[a,l]=i;return xd(a,"owner"),xd(l,"repo"),o==="github.com"?`https://raw.githubusercontent.com/${a}/${l}/${t}/${r}`:o==="bitbucket.org"?`https://bitbucket.org/${a}/${l}/raw/${t}/${r}`:o==="gitlab.com"||o.startsWith("git.")?`https://${o}/${a}/${l}/-/raw/${t}/${r}`:`https://${o}/${a}/${l}/raw/${t}/${r}`}async fetchItems(){return this._fetchFromBranch("main").catch(t=>{if(this._is404(t))return this._fetchFromBranch("master");throw t})}async _fetchFromBranch(t){let r=await this._buildHeaders();try{let s=this.buildRawUrl(t,".claude-plugin/marketplace.json"),{plugins:i}=await Sd.get(s,{headers:r}).json();return i.map(a=>({...a,catalogId:this.id,origin:a.origin??"external"}))}catch(s){if(this._is401or403(s))throw this._authError();if(!this._is404(s))throw s}let n=this.buildRawUrl(t),{plugins:o}=await Sd.get(n,{headers:r}).json();return o.map(s=>({...s,catalogId:this.id,origin:s.origin??"external"}))}async _buildHeaders(){if(new URL(this.source).hostname!=="github.com")return {};let r=await yd();return r?{Authorization:`token ${r}`}:{}}_is404(t){return t!==null&&typeof t=="object"&&"response"in t&&t.response?.status===404}_is401or403(t){return t!==null&&typeof t=="object"&&"response"in t&&[401,403].includes(t.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(t){throw new Error("GitRepoAdapter does not support individual manifest fetch")}async ping(){try{return await this.fetchItems(),!0}catch{return !1}}};});j();var Tc=new Set(["skill","mcp","bundle","plugin"]),S=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(Tc),origins:new Set(ea)},setScreen:t=>e({screen:t}),setActiveTab:t=>e({activeTab:t}),setFocus:t=>e({focus:t}),setSelectedIndex:t=>e({selectedIndex:t}),setActionMenuOpen:t=>e({actionMenuOpen:t}),showNotification:(t,r)=>e({notification:{message:t,type:r}}),clearNotification:()=>e({notification:null}),setLoading:(t,r="")=>e({loading:t,loadingMessage:t?r:"",downloadProgress:0,downloadTotal:0}),setDownloadProgress:(t,r)=>e({downloadProgress:t,downloadTotal:r}),setCatalogError:t=>e({catalogError:t}),setPendingExit:t=>e({pendingExit:t}),toggleTypeFilter:t=>e(r=>{let{types:n}=r.catalogFilters;return n.size===1&&n.has(t)?{}:{catalogFilters:{...r.catalogFilters,types:new Set([t])},selectedIndex:0}}),selectAllTypes:()=>e(t=>({catalogFilters:{...t.catalogFilters,types:new Set(Tc)},selectedIndex:0})),toggleOriginFilter:t=>e(r=>{let{origins:n}=r.catalogFilters;return n.size===1&&n.has(t)?{}:{catalogFilters:{...r.catalogFilters,origins:new Set([t])},selectedIndex:0}}),selectAllOrigins:()=>e(t=>({catalogFilters:{...t.catalogFilters,origins:new Set(ea)},selectedIndex:0})),setDebugPanelOpen:t=>e({debugPanelOpen:t}),incrementCatalogVersion:()=>e(t=>({catalogVersion:t.catalogVersion+1})),setBundleInstallFlow:t=>e({bundleInstallFlow:t})}));Ee();En();Ps();j();Hr();R();var Cs=x("api:metrics");function tu(){return $t("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function ru(e,t,r){return Sd.post(e,{json:t,headers:r})}async function Uh(e){let t=await In();if(t)return t;let r=vn(e),n={sub:r.sub,name:r.name,email:r.email};return await Es(n),n}async function E(e,t){let r=await Lt(),n=await Uh(r),o=await Z();if(!zt.test(o.tenant))throw new Error(`Invalid tenant value: "${o.tenant}"`);let s={action:e,booster:Qi,metadata:{...t},success:true,tenant:o.tenant,timestamp:new Date().toISOString(),user:{id:n.sub,name:n.name,email:n.email}};try{await ru(tu(),s,{Authorization:`Bearer ${r}`,FlowTenant:o.tenant}),Cs.debug(`Metrics event sent: ${e}`);}catch(i){throw Cs.warn(`Failed to send metrics event "${e}": ${String(i)}`),i}}async function nu(e,t,r){try{let n=r&&zt.test(r)?r:"unknown",o={action:e,booster:Qi,metadata:t,success:!0,tenant:n,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await ru(tu(),o,{FlowTenant:n}),Cs.debug(`Anonymous metrics event sent: ${e}`);}catch(n){Cs.warn(`Failed to send anonymous metrics event "${e}": ${String(n)}`);}}var I={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 Nh={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},ht={...Nh};function ou(e){let t=Date.now();ht={sessionStart:t,stepStart:t,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function Gr(e){ht.currentStep=e,ht.stepStart=Date.now();}function Q(){return {...ht}}function wr(){return ht.sessionStart===0?0:Date.now()-ht.sessionStart}function Wr(){return ht.stepStart===0?0:Date.now()-ht.stepStart}function su(){ht.tuiSessionStart=Date.now();}function iu(){return ht.tuiSessionStart===0?0:Date.now()-ht.tuiSessionStart}R();var Bh=3e3,Fh=x("abandonment");async function ks(e){let{currentStep:t,sessionStart:r}=Q();if(r===0)return;let n={last_step:t,trigger:e,duration_ms:wr()};try{await Promise.race([E(I.CLI_ONBOARDING_ABANDONED,n),new Promise((o,s)=>setTimeout(()=>s(new Error("abandonment timeout")),Bh))]);}catch(o){Fh.warn(`Abandonment event failed: ${String(o)}`);}}function au(e,t){return Promise.race([e,new Promise(r=>setTimeout(r,t))])}R();var jh=3e3,Kh=x("session-end");async function mo(e,t,r){let n=iu(),s=[E(I.CLI_TUI_SESSION_ENDED,{duration_ms:n,active_tab:t,interface:"tui"})];r!=="main"&&s.push(ks(e));try{await au(Promise.all(s).then(()=>{}),jh);}catch(i){Kh.warn(`Session end event failed: ${String(i)}`);}}var Gh=2e3;function cu(){let{exit:e}=useApp(),t=useRef(false),r=useRef(null),n=S(l=>l.pendingExit),o=S(l=>l.setPendingExit),s=S(l=>l.activeTab),i=S(l=>l.screen),a=useCallback(()=>{if(t.current){r.current&&clearTimeout(r.current),mo("double-ctrl-c",s,i).finally(()=>e());return}t.current=true,o(true),r.current=setTimeout(()=>{t.current=false,o(false);},Gh);},[e,o,s,i]);return useInput((l,u)=>{u.ctrl&&l==="c"&&a();}),{pendingExit:n}}var qh=16;function uu({label:e,value:t,onChange:r,masked:n=false,isActive:o,error:s}){let i=useRef(t);useEffect(()=>{i.current=t;},[t]),useInput((l,u)=>{if(u.backspace){let c=i.current.slice(0,-1);i.current=c,r(c);}else if(l&&!u.ctrl&&!u.meta&&!u.escape&&!u.return&&!u.tab&&!u.upArrow&&!u.downArrow&&!u.leftArrow&&!u.rightArrow){let c=i.current+l;i.current=c,r(c);}},{isActive:o});let a=n?"\u2022".repeat(t.length):t;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u25B8 ":" "}),jsx(Text,{color:o?"white":"gray",bold:o,children:e.padEnd(qh)}),jsx(Text,{color:o?"cyan":"gray",children:a}),o&&jsx(Text,{color:"cyan",children:"\u2588"})]}),s&&jsx(Box,{paddingLeft:3,children:jsxs(Text,{color:"red",children:["\u26A0 ",s]})})]})}j();function du({onConfirm:e}){let[t,r]=useState("confirm"),[n,o]=useState(""),[s,i]=useState(false),a=useRef("");return useInput((l,u)=>{if(t==="confirm"){if(l==="n"||l==="N"){r("input");return}(l==="y"||l==="Y"||u.return)&&e(null);return}if(u.escape){a.current="",o(""),i(false),r("confirm");return}if(u.return){let c=a.current.trim();gn.test(c)?(i(false),e(c)):i(true);return}if(u.backspace||u.delete){a.current=a.current.slice(0,-1),o(a.current);return}l&&!u.ctrl&&!u.meta&&(a.current=a.current+l,o(a.current),i(false));}),jsxs(Box,{flexDirection:"column",gap:1,children:[t==="confirm"&&jsx(Text,{children:"Does your email use the @ciandt.com domain? (Y/n)"}),t==="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:n}),jsx(Text,{color:"cyan",children:"\u2588"})]}),s&&jsx(Text,{color:"red",children:hn}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})}j();function pu({plan:e}){return jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[pr," \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"})]})]})}j();function mu(){return jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"yellow",children:[pr," \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 rt=create(e=>({credentials:null,isAuthenticated:false,justAuthenticated:false,setCredentials:t=>e({credentials:t,isAuthenticated:true}),clearCredentials:()=>e({credentials:null,isAuthenticated:false,justAuthenticated:false}),setJustAuthenticated:t=>e({justAuthenticated:t})}));Ts();j();function qr(){return Ie__default.join(Me__default.homedir(),".claude","settings.json")}function gu(e){return `${(e&&e.trim().length>0?e.trim():rs).replace(/\/+$/,"")}/flow-litellm/`}function xo(){let e=qr();if(!ve__default.existsSync(e))return {status:"missing"};let t=ve__default.readFileSync(e,"utf-8"),r=t.charCodeAt(0)===65279?t.slice(1):t;try{let n=JSON.parse(r);return n===null||typeof n!="object"||Array.isArray(n)?{status:"malformed",raw:t}:{status:"ok",settings:n}}catch{return {status:"malformed",raw:t}}}function Rs(e){let t=qr();ve__default.mkdirSync(Ie__default.dirname(t),{recursive:true});let r=`${t}.${randomUUID()}.tmp`;ve__default.writeFileSync(r,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),ve__default.renameSync(r,t);}function hu(e,t,r){let n=e.env&&typeof e.env=="object"&&!Array.isArray(e.env)?e.env:{};return {...e,env:{...n,ANTHROPIC_AUTH_TOKEN:t,ANTHROPIC_BASE_URL:r}}}function Ua(e){let t=e.env;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.ANTHROPIC_AUTH_TOKEN;return typeof r=="string"&&r.length>0?r:null}function yu(e){let t=e.env;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.ANTHROPIC_BASE_URL;return typeof r=="string"&&r.length>0?r:null}var ny=3600,Yr=class extends Error{constructor(){super("~/.claude/settings.json contains invalid JSON"),this.name="MalformedSettingsError";}};function bo(e){let t=e.split(".");if(t.length!==3)throw new Error("Malformed JWT: invalid format");let r;try{r=JSON.parse(Buffer.from(t[1],"base64url").toString("utf8"));}catch{throw new Error("Malformed JWT: payload is not valid JSON")}if(!r||typeof r!="object"||Array.isArray(r))throw new Error("Malformed JWT: payload must be a JSON object");let n=r;if(typeof n.clientId!="string"||!n.clientId)throw new Error("Invalid JWT: claim clientId must be a non-empty string");if(n.clientId.length>512)throw new Error("Invalid JWT: claim clientId exceeds maximum length");if(typeof n.clientSecret!="string"||!n.clientSecret)throw new Error("Invalid JWT: claim clientSecret must be a non-empty string");if(n.clientSecret.length>4096)throw new Error("Invalid JWT: claim clientSecret exceeds maximum length");if(typeof n.tenant!="string"||!n.tenant)throw new Error("Invalid JWT: claim tenant must be a non-empty string");if(n.tenant.length>512)throw new Error("Invalid JWT: claim tenant exceeds maximum length");return {clientId:n.clientId,clientSecret:n.clientSecret,tenant:n.tenant}}function oy(e){return ry.sign({clientId:e.clientId,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:ny})}function $s(e,t={}){let r=xo();if(r.status==="malformed"&&!t.allowOverwriteMalformed)throw new Yr;let n=r.status==="ok"?r.settings:{},o=r.status==="ok"?Ua(r.settings):null,s=r.status==="ok"?yu(r.settings):null,i=t.jwtOverride??oy(e),a=gu(e.customUrl),l=hu(n,i,a);return {jwt:i,anthropicBaseUrl:a,merged:l,previousToken:o,previousBaseUrl:s,hadExistingFile:r.status!=="missing"}}function Ls(e){Rs(e.merged);}function wu(){let e=xo();return e.status!=="ok"?false:Ua(e.settings)!==null}Ee();Je();function sy(){let e=Mc();if(!ve__default.existsSync(e))return {};try{return JSON.parse(ve__default.readFileSync(e,"utf-8"))}catch{return {}}}var Na=null;function iy(){return Na===null&&(Na=sy()),Na}function br(){return !!iy().ENABLE_EXPERIMENTAL_BETAS}j();function uy(){return se.filter(e=>e.platforms[process.platform]?.status==="supported")}function xu(e){let t=uy();return t.length>0&&t.every(r=>e.find(n=>n.module.alias===r.alias)?.alreadyInstalled===true)}var Ms={alias:"metrics",required:true,name:"flow-ai-obs",configCheck:()=>{try{let e=Ie__default.join(Me__default.homedir(),".claude","settings.json"),r=ve__default.readFileSync(e,"utf-8").replace(/^\uFEFF/,""),o=JSON.parse(r).env;return typeof o=="object"&&o!==null&&"OTEL_EXPORTER_OTLP_ENDPOINT"in o}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 t=["flow-ai-obs","init","--no-interactive"];if(t.push("--custom-url",e.customUrl??rs),e.credentials){let{clientId:r,clientSecret:n,tenant:o}=e.credentials;t.push("--client-id",r,"--client-secret",n,"--tenant",o);}return e.customEmail&&t.push("--custom-email",e.customEmail),[t]},onDemand:null,mode:"non-interactive"}},dy={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},se=br()?[Ms,dy]:[Ms];Ee();R();var gy=x("moduleState");function Ds(){let e=process.env.FLOW_HOME??Ie__default.join(Me__default.homedir(),".flow");return Ie__default.join(e,"modules.json")}var hy={retries:5,minTimeout:50};async function bu(e,t){ve__default.mkdirSync(Ie__default.dirname(e),{recursive:true});let r=await fy.lock(e+".lock",{realpath:false,retries:hy});try{return await t()}finally{await r();}}function Iu(){let e=Ds();if(!ve__default.existsSync(e))return [];try{let t=JSON.parse(ve__default.readFileSync(e,"utf-8"));return t.schemaVersion!==1?(gy.warn(`modules.json has unknown schemaVersion ${t.schemaVersion}, resetting`),ve__default.rmSync(e,{force:!0}),[]):Array.isArray(t.modules)?t.modules.map(r=>({...r,name:r.name??null})):[]}catch{return ve__default.rmSync(e,{force:true}),[]}}function Zr(){return Iu()}function vu(e){let t=Ds();ve__default.mkdirSync(Ie__default.dirname(t),{recursive:true});let r=`${t}.${randomUUID()}.tmp`,n={schemaVersion:1,modules:e};ve__default.writeFileSync(r,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}),ve__default.renameSync(r,t);}function nt(e){return Zr().find(t=>t.alias===e)??null}async function yt(e){let t=Ds();await bu(t,async()=>{let r=Iu(),n=r.findIndex(o=>o.alias===e.alias);n===-1?r.push(e):r[n]=e,vu(r);});}async function Qr(){let e=Ds();ve__default.existsSync(e)||await bu(e,async()=>{ve__default.existsSync(e)||vu([]);});}var Sy=promisify(execFile);function Ir(e,t){let r=e.platforms[process.platform];return !r||r.status!=="supported"?null:r.strategies.find(n=>n.type===t)??null}async function _t(e){let t=process.platform==="win32"?"where":"which";try{return await Sy(t,[e]),!0}catch{return false}}function qt(){return process.platform==="win32"?"npm.cmd":"npm"}var Eu=promisify(execFile),Tn=class{type="npm";async isAvailable(){return _t("npm")}async install(t){let r=await this.getInstalledVersion(t);return r?{success:true,version:r,method:"npm",durationMs:0}:this.runNpmInstall(t,false)}async update(t,r){return this.runNpmInstall(t,true)}async getInstalledVersion(t){let r=Ir(t,"npm");if(!r)return null;try{let{stdout:n}=await Eu(qt(),["list","-g",r.package,"--depth=0","--json"],{shell:process.platform==="win32"});return JSON.parse(n).dependencies?.[r.package]?.version??null}catch{return null}}async uninstall(t){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async runNpmInstall(t,r){let n=Date.now(),o=Ir(t,"npm");if(!o)return {success:false,error:{code:"NPM_NOT_AVAILABLE",message:"No npm config for this module on this platform"},durationMs:Date.now()-n};let s=r?`${o.package}@latest`:o.package;try{return await Eu(qt(),["install","-g",s],{shell:process.platform==="win32"}),{success:!0,version:await this.getInstalledVersion(t)??void 0,method:"npm",durationMs:Date.now()-n}}catch(i){return {success:false,error:{code:"NPM_INSTALL_FAILED",message:i instanceof Error?i.message:String(i)},durationMs:Date.now()-n}}}};var Os=promisify(execFile),Ey=/^(\S+)\s+([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/,Us=class{type="homebrew";async isAvailable(){return _t("brew")}async install(t){return this.runBrewCommand(t,"install")}async update(t,r){return this.runBrewCommand(t,"upgrade")}async getInstalledVersion(t){let r=Ir(t,"homebrew");return r?this.getVersionByFormula(r.formula):null}async uninstall(t){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async runBrewCommand(t,r){let n=Date.now(),o=Ir(t,"homebrew");if(!o)return {success:false,error:{code:"HOMEBREW_NOT_AVAILABLE",message:"No homebrew config for this module on this platform"},durationMs:Date.now()-n};let s=r==="install"?"HOMEBREW_INSTALL_FAILED":"HOMEBREW_UPGRADE_FAILED";try{return o.tap&&(await Os("brew",["tap",o.tap]),await Os("brew",["trust",o.tap])),await Os("brew",[r,o.formula]),{success:!0,version:await this.getVersionByFormula(o.formula)??void 0,method:"homebrew",durationMs:Date.now()-n}}catch(i){return {success:false,error:{code:s,message:i instanceof Error?i.message:String(i)},durationMs:Date.now()-n}}}async getVersionByFormula(t){try{let{stdout:r}=await Os("brew",["list","--versions",t]),n=r.trim().match(Ey);return n?n[2]:null}catch{return null}}};var Cn=promisify(execFile),Tu=/([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/;function Cu(){let e=process.env.FLOW_HOME??Ie__default.join(Me__default.homedir(),".flow");return Ie__default.join(e,"bin")}var Ns=class{type="curl";async isAvailable(){return _t("curl")}async install(t){let r=Date.now(),n=Ir(t,"curl");if(!n)return {success:false,error:{code:"CURL_NOT_AVAILABLE",message:"No curl config for this module on this platform"},durationMs:Date.now()-r};let o=typeof n.url=="function"?n.url(process.arch):n.url;return (n.mode??"binary")==="script"?this.installScript(o,n.checksumUrl,t,r):this.installBinary(o,n.checksumUrl,t,r)}async update(t,r){return this.install(t)}async getInstalledVersion(t){let r=Ie__default.join(Cu(),Ie__default.basename(t.binaryName));for(let n of [r,t.binaryName])try{let{stdout:o}=await Cn(n,["--version"]),s=o.match(Tu);if(s)return s[1]}catch{}return null}async uninstall(t){return {success:false,error:{code:"NOT_IMPLEMENTED",message:"uninstall not implemented"},durationMs:0}}async installScript(t,r,n,o){if(!r)return {success:false,error:{code:"CHECKSUM_REQUIRED",message:`checksumUrl is required for script installs (${n.alias})`},durationMs:Date.now()-o};let s=Ie__default.join(Me__default.tmpdir(),`flow-install-${randomUUID()}.sh`);try{if(await Cn("curl",["-sSL","--fail","-o",s,t]),r){let a=await this.validateChecksum(s,r);if(!a.valid){try{ve__default.unlinkSync(s);}catch{}return {success:!1,error:{code:"CHECKSUM_MISMATCH",message:a.message},durationMs:Date.now()-o}}}return ve__default.chmodSync(s,448),await Cn("bash",[s]),{success:!0,version:await this.getInstalledVersion(n)??void 0,method:"curl",durationMs:Date.now()-o}}catch(i){return {success:false,error:{code:"CURL_SCRIPT_FAILED",message:i instanceof Error?i.message:String(i)},durationMs:Date.now()-o}}finally{try{ve__default.unlinkSync(s);}catch{}}}async installBinary(t,r,n,o){let s=Cu(),i=Ie__default.join(s,Ie__default.basename(n.binaryName)),a=false;try{if(ve__default.mkdirSync(s,{recursive:!0}),a=!0,await Cn("curl",["-L","--fail","-o",i,t]),r){let u=await this.validateChecksum(i,r);if(!u.valid)return ve__default.unlinkSync(i),{success:!1,error:{code:"CHECKSUM_MISMATCH",message:u.message},durationMs:Date.now()-o}}ve__default.chmodSync(i,493);let l=null;try{let{stdout:u}=await Cn(i,["--version"]),c=u.match(Tu);l=c?c[1]:null;}catch{}return {success:!0,version:l??void 0,method:"curl",durationMs:Date.now()-o}}catch(l){if(a)try{ve__default.unlinkSync(i);}catch{}return {success:false,error:{code:"CURL_DOWNLOAD_FAILED",message:l instanceof Error?l.message:String(l)},durationMs:Date.now()-o}}}async validateChecksum(t,r){let n=Ie__default.join(Me__default.tmpdir(),`curl-checksum-${randomUUID()}`);try{await Cn("curl",["-L","--fail","-o",n,r]);let o=ve__default.readFileSync(n,"utf-8").trim().split(/\s+/)[0],s=ve__default.readFileSync(t),i=createHash("sha256").update(s).digest("hex");return i!==o?{valid:!1,message:`SHA256 mismatch: expected ${o}, got ${i}`}:{valid:!0,message:""}}catch(o){return {valid:false,message:`Checksum validation failed: ${String(o)}`}}finally{try{ve__default.unlinkSync(n);}catch{}}}};R();var ku="0.0.0";try{let e=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8"));typeof e.version=="string"&&(ku=e.version);}catch{}var ue=ku;var ke=x("moduleInstaller");function Ot(e){switch(e){case "npm":return new Tn;case "homebrew":return new Us;case "curl":return new Ns}}async function Io(e,t,r){try{await E(I.CLI_MODULE_INSTALL_FAILED,{module_alias:e.alias,module_name:e.name,os:process.platform,error_code:r.code,error_message:r.message,trigger:t});}catch(n){ke.warn(`Failed to emit install failed event: ${String(n)}`);}}async function Er(e,t,r,n,o,s){let i=Date.now(),a=e.platforms[process.platform];if(!a)return {success:false,error:{code:"PLATFORM_NOT_SUPPORTED",message:`Platform ${process.platform} is not listed for module ${e.alias}`},durationMs:Date.now()-i};if(a.status==="experimental"){ke.warn(`Module "${e.alias}" has experimental support on ${process.platform}`);let d={code:"PLATFORM_EXPERIMENTAL",message:`Experimental support on ${process.platform} \u2014 install manually`};return await Io(e,t,d),{success:false,error:d,durationMs:Date.now()-i}}if(a.status!=="supported"){let d={code:"PLATFORM_NOT_SUPPORTED",message:`Module ${e.alias} is not supported on ${process.platform}`};return await Io(e,t,d),{success:false,error:d,durationMs:Date.now()-i}}if(!a.strategies.some(d=>d.type===r)){let d={code:"STRATEGY_NOT_FOUND",message:`Strategy "${r}" is not configured for module "${e.alias}" on ${process.platform}`};return await Io(e,t,d),{success:false,error:d,durationMs:Date.now()-i}}let l=Ot(r),u=false;try{u=await l.isAvailable();}catch(d){ke.warn(`${r} availability check failed: ${String(d)}`);}if(!u){let d={code:"STRATEGY_NOT_AVAILABLE",message:`"${r}" is not installed on this system`};return await Io(e,t,d),{success:false,error:d,durationMs:Date.now()-i}}try{await E(I.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:ue,trigger:t});}catch(d){ke.warn(`Failed to emit install started event: ${String(d)}`);}let c;try{c=s?.forceLatest?await l.update(e,"unknown"):await l.install(e);}catch(d){let m=d instanceof Error?d.message:String(d);ke.warn(`${r} install threw: ${m}`),c={success:false,error:{code:"INSTALL_THREW",message:m},durationMs:Date.now()-i};}if(c.success){await yt({alias:e.alias,name:e.name,installedVersion:c.version??null,installMethod:c.method??null,installedAt:new Date().toISOString(),lastChecked:new Date().toISOString()});try{await E(I.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:t});}catch(p){ke.warn(`Failed to emit install completed event: ${String(p)}`);}let{pendingCmd:d,failed:m}=await $y(e,t,n,o);return d?{...c,pendingInteractiveSetup:d}:m?{...c,postInstallFailed:true}:e.configCheck&&!e.configCheck()?{...c,configCheckFailed:true}:c}return await Io(e,t,c.error??{code:"UNKNOWN",message:"unknown error"}),c}async function $y(e,t,r,n){if(!e.postInstall)return {pendingCmd:null,failed:false};let o=t==="onboarding"?e.postInstall.onboarding:e.postInstall.onDemand;if(o==null)return {pendingCmd:null,failed:false};let s;if(typeof o=="function"){let a=await Z(),l={credentials:a?{clientId:a.clientId,clientSecret:a.clientSecret,tenant:a.tenant}:null,customUrl:r??null,customEmail:n??null};try{s=o(l);}catch(u){return ke.warn(`postInstall function threw: ${String(u)}`),{pendingCmd:null,failed:false}}}else s=o;if(s.length===0)return {pendingCmd:null,failed:false};if((e.postInstall.mode??"non-interactive")==="interactive")return {pendingCmd:s[0]??null,failed:false};let i=false;for(let a=0;a<s.length;a++){let l=s[a];if(l.length===0)continue;let u=spawnSync(l[0],l.slice(1),{stdio:"pipe",env:process.env,encoding:"utf-8",shell:process.platform==="win32"});if(u.status!==0){i=true,ke.warn(`postInstall "${l.join(" ")}" exited with status ${u.status??"null"}`),u.stderr&&ke.warn(u.stderr);let c=s.slice(a+1).filter(d=>d.length>0);c.length>0&&ke.debug(`continuing with remaining postInstall steps: ${c.map(d=>d.join(" ")).join(", ")}`);}}return {pendingCmd:null,failed:i}}async function Bs(e,t){let r=Date.now(),n=nt(e.alias);if(!n?.installMethod)return {success:false,error:{code:"NOT_INSTALLED",message:`Module '${e.alias}' is not installed`},durationMs:Date.now()-r};let o=Ot(n.installMethod),s=n.installedVersion??"unknown";if(t==="command")try{await E(I.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:ue,trigger:"command"});}catch(a){ke.warn(`Failed to emit update started event: ${String(a)}`);}let i;try{i=await o.update(e,s);}catch(a){let l=a instanceof Error?a.message:String(a);ke.warn(`${n.installMethod} update threw: ${l}`),i={success:false,error:{code:"UPDATE_THREW",message:l},durationMs:Date.now()-r};}if(i.success)if(await yt({...n,installedVersion:i.version??n.installedVersion,lastChecked:new Date().toISOString()}),t==="command")try{await E(I.CLI_MODULE_INSTALL_COMPLETED,{module_alias:e.alias,module_name:e.name,installed_version:i.version??"unknown",duration_ms:i.durationMs,os:process.platform,trigger:"command"});}catch(a){ke.warn(`Failed to emit update completed event: ${String(a)}`);}else try{await E(I.CLI_MODULE_UPDATED,{module_alias:e.alias,from_version:s,to_version:i.version??"unknown",duration_ms:i.durationMs});}catch(a){ke.warn(`Failed to emit module updated event: ${String(a)}`);}else if(t==="command")try{await E(I.CLI_MODULE_INSTALL_FAILED,{module_alias:e.alias,module_name:e.name,os:process.platform,error_code:i.error?.code??"UNKNOWN",error_message:i.error?.message??"unknown error",trigger:"command"});}catch(a){ke.warn(`Failed to emit update failed event: ${String(a)}`);}return i}R();var Fs=x("flowAiObsSetup");async function js(e,t){try{if(!await new Tn().isAvailable().catch(()=>!1))return Fs.warn("npm not available \u2014 skipping flow-ai-obs install"),{npmFailed:!0,initFailed:!1};let o=await Er(Ms,"onboarding","npm",e,t,{forceLatest:!0});return o.success?o.postInstallFailed||o.configCheckFailed?(Fs.debug("flow-ai-obs init failed (postInstall exit non-zero or configCheck failed)"),{npmFailed:!1,initFailed:!0}):{npmFailed:!1,initFailed:!1}:(Fs.warn(`flow-ai-obs install failed: ${o.error?.message??"unknown"}`),{npmFailed:!0,initFailed:!1})}catch(r){return Fs.warn(`installFlowAiObs threw: ${String(r)}`),{npmFailed:false,initFailed:false,unexpectedError:true}}}R();function Au(e){if(!(e instanceof Error))return "unknown";let t=e.message.toLowerCase();return t.includes("401")||t.includes("unauthorized")?"invalid_credentials":t.includes("403")||t.includes("forbidden")?"forbidden":t.includes("timeout")||t.includes("timed out")?"timeout":t.includes("network")||t.includes("econnrefused")||t.includes("fetch")?"network_error":"unknown"}var Ly=x("useAuthSetup");function Ru(){let[e,t]=useState(""),r=useRef(null),n=useRef(null),o=useRef(null),[s,i]=useState(),[a,l]=useState(null),[u,c]=useState(false),[d,m]=useState("fields"),[p,g]=useState(null),f=useRef(0),h=useRef(false),{setCredentials:w,setJustAuthenticated:v}=rt(),D=()=>{m("fields"),g(null),t(""),r.current=null,n.current=null,o.current=null;},M=()=>{E(I.CLI_SESSION_STARTED,{cli_version:ue,os:process.platform,node_version:process.version,duration_ms:wr(),interface:"tui"}).catch(()=>{});},C=async V=>{h.current=true;let z={...r.current,customUrl:n.current??void 0};try{V&&Ls(V),await hr(z);}catch(G){l(G instanceof Error?G.message:"Failed to persist credentials"),D(),h.current=false;return}let{clientSecret:A,...B}=z;w(B),v(true),M(),await js(n.current,o.current).catch(G=>Ly.warn(`installFlowAiObs threw unexpectedly: ${String(G)}`)),Ks({starterKit:B.starterKit});},$=async()=>C(),_=async V=>C(V),O=V=>{try{let z={...r.current,customUrl:n.current??void 0};return $s(z,{allowOverwriteMalformed:V,jwtOverride:e.trim()})}catch(z){return z instanceof Yr?(m("malformedConfirm"),null):(l(z instanceof Error?z.message:"Failed to read settings.json"),m("fields"),null)}},te=()=>{let V=O(true);V&&(g(V),_(V));},k=async()=>{let V=e.trim();if(!V){i("This field is required");return}let z;try{z=bo(V);}catch(A){i(A instanceof Error?A.message:"Invalid JWT");return}i(void 0),r.current=z,m("customUrl");},H=V=>{n.current=V,m("email");},ee=V=>{o.current=V,K();},K=async()=>{let V=n.current;V&&Rt(V),c(true),l(null),f.current+=1;try{await Jr(r.current);let z=O(!1);z&&(g(z),m("preview"));}catch(z){let A=z instanceof Error?z.message:"Authentication failed";l(A),nu(I.CLI_AUTH_FAILED,{error_code:Au(z),attempt:f.current},r.current.tenant).catch(()=>{}),t(""),r.current=null,m("fields");}finally{c(false);}};return {jwtValue:e,jwtError:s,authError:a,isSubmitting:u,step:d,plan:p,isCommittingRef:h,setJwtValue:t,setJwtError:i,cancelToFields:D,handleSubmit:k,goToEmailStep:H,handleEmailConfirm:ee,commitAndProceed:_,skipJwtAndProceed:$,planPersistOverwrite:te}}j();F();function $u(){let{jwtValue:e,jwtError:t,authError:r,isSubmitting:n,step:o,plan:s,isCommittingRef:i,setJwtValue:a,setJwtError:l,cancelToFields:u,handleSubmit:c,goToEmailStep:d,handleEmailConfirm:m,commitAndProceed:p,skipJwtAndProceed:g,planPersistOverwrite:f}=Ru(),[h,w]=useState("confirm"),[v,D]=useState(""),M=useRef(""),[C,$]=useState(false);return useEffect(()=>{o==="customUrl"&&(w("confirm"),M.current="",D(""),$(false));},[o]),useInput((_,O)=>{if(!(n||i.current)){if(o==="preview"){O.return&&s?p(s):O.escape?g():_==="q"&&u();return}if(o==="malformedConfirm"){O.return?f():O.escape&&u();return}if(o==="customUrl"){if(h==="confirm")_==="y"||_==="Y"?w("input"):(_==="n"||_==="N"||O.return)&&d(null);else if(O.escape)M.current="",D(""),w("confirm");else if(O.return){let te=M.current.trim();te.length>0&&mn.test(te)?($(false),d(te)):te.length>0&&$(true);}else O.backspace||O.delete?(M.current=M.current.slice(0,-1),D(M.current)):_&&!O.ctrl&&!O.meta&&(M.current=M.current+_,D(M.current),$(false));return}o!=="email"&&O.return&&c();}},{isActive:true}),o==="customUrl"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[pr," \u2014 Initial Setup"]})}),jsxs(Box,{flexDirection:"column",gap:1,children:[n&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),!n&&h==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),!n&&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:v}),jsx(Text,{color:"cyan",children:"\u2588"})]}),C&&jsx(Text,{color:"red",children:fn}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})]}):o==="email"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[pr," \u2014 Initial Setup"]})}),n?jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}):jsx(du,{onConfirm:m})]}):o==="preview"&&s?jsx(pu,{plan:s}):o==="malformedConfirm"?jsx(mu,{}):jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[pr," \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(uu,{label:"JWT",value:e,onChange:_=>{a(_),t&&l(void 0);},masked:true,isActive:!n,error:t})})}),n&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),r&&jsx(Box,{marginTop:1,children:jsxs(Text,{color:"red",children:["\u26A0 ",y(r)]})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter confirm"})})]})}function An(){return jsxs(Box,{flexDirection:"column",alignItems:"center",children:[jsx(Uy,{text:"FLOW",font:"block",colors:["white","white"]}),jsx(Box,{marginTop:-1,marginBottom:1,children:jsxs(Text,{dimColor:true,children:["Marketplace \xB7 v",ue]})})]})}var Du=[{id:"discover",focus:"list"},{id:"installed",focus:"list"},{id:"updates",focus:"list"},{id:"marketplaces",focus:"marketplaces"}],ne=br()?Du:Du.slice(0,3);function Ny(e){return ne.findIndex(t=>t.id===e)}function ja(e,t,r){let n=Ny(r.activeTab);if(t.rightArrow||t.tab){let o=ne[(n+1)%ne.length];return [{type:"setTab",tab:o.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:o.focus}]}if(t.leftArrow){let o=ne[(n-1+ne.length)%ne.length];return [{type:"setTab",tab:o.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:o.focus}]}return t.downArrow?[{type:"setFocus",focus:ne[n]?.focus??"list"}]:[]}var Nu={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function Bu({outdatedCount:e=0}){let t=S(r=>r.activeTab);return jsx(Box,{paddingX:1,paddingBottom:1,children:ne.map(({id:r})=>{let n=r===t,o=r==="updates"&&e>0?`${Nu[r]} (${e})`:Nu[r];return jsx(Box,{marginRight:1,children:n?jsx(Text,{bold:true,inverse:true,children:` ${o} `}):jsx(Text,{dimColor:true,children:` ${o} `})},r)})})}var ze=create(e=>({query:"",cursorPosition:0,setQuery:t=>e({query:t}),setCursorPosition:t=>e({cursorPosition:t}),resetQuery:()=>e({query:"",cursorPosition:0})}));function ju(){let e=S(i=>i.focus),t=ze(i=>i.query),r=ze(i=>i.cursorPosition),n=e==="search",o=t.slice(0,r),s=t.slice(r);return jsxs(Box,{borderStyle:"single",borderTop:false,borderBottom:true,borderLeft:false,borderRight:false,paddingX:1,marginX:1,marginBottom:1,children:[jsx(Text,{color:n?"cyan":"gray",children:"\u{1F50D} "}),n?jsxs(Fragment,{children:[jsx(Text,{color:"white",children:o}),jsx(Text,{inverse:true,children:s[0]??" "}),jsx(Text,{color:"white",children:s.slice(1)})]}):jsx(Text,{dimColor:true,children:t||"Search..."})]})}j();var Ky=["skill","mcp","bundle"].map((e,t)=>({key:String(t+2),type:e,...pn[e]})),Vy=["internal","external"].map((e,t)=>({key:String(t+6),origin:e,...Pc[e]}));function Ku(){let e=S(n=>n.catalogFilters),t=e.types.has("skill")&&e.types.has("mcp")&&e.types.has("bundle"),r=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:t?"green":void 0,dimColor:!t,children:[t?"\u25C9":"\u25CB"," All"]})]}),Ky.map(n=>{let o=!t&&e.types.has(n.type);return jsxs(Box,{gap:0,children:[jsxs(Text,{dimColor:true,children:["[",n.key,"] "]}),jsxs(Text,{color:o?n.color:void 0,dimColor:!o,children:[o?"\u25C9":"\u25CB"," ",n.label]})]},n.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:r?"green":void 0,dimColor:!r,children:[r?"\u25C9":"\u25CB"," All"]})]}),Vy.map(n=>{let o=!r&&e.origins.has(n.origin);return jsxs(Box,{gap:0,children:[jsxs(Text,{dimColor:true,children:["[",n.key,"] "]}),jsxs(Text,{color:o?n.color:void 0,dimColor:!o,children:[o?"\u25C9":"\u25CB"," ",n.label]})]},n.key)})]})}j();function Vu({type:e}){let{label:t,color:r}=pn[e];return jsx(Text,{color:r,children:t})}j();function Gu({origin:e}){return e===so?jsx(Text,{color:"blue",children:"[Flow]"}):jsx(Text,{color:"white",children:"[External]"})}F();var Hs=Gy.memo(function({item:t,isSelected:r}){let n=t.status==="disabled"?"yellow":"green";return jsxs(Box,{flexDirection:"column",paddingBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:r?"cyan":"gray",children:r?"\u203A ":"\u25CB "}),jsx(Text,{bold:r,color:r?"cyan":"white",children:t.name}),t.type&&jsxs(Text,{children:[" ",jsx(Vu,{type:t.type})]}),t.origin&&jsxs(Text,{children:[" ",jsx(Gu,{origin:t.origin})]}),jsxs(Text,{dimColor:true,children:[t.authorName?` \xB7 ${t.authorName}`:"",t.version?` \xB7 v${t.version}`:" \xB7 n/a"]}),t.status&&jsxs(Text,{color:n,children:[" [",t.status,"]"]}),t.updateAvailable&&jsx(Text,{color:"yellow",children:" [\u2191 update available]"}),t.installedAt&&jsxs(Text,{dimColor:true,children:[" \xB7 ",At(t.installedAt)]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:t.description})})]})});function Rn({message:e}){return jsx(Box,{paddingX:2,paddingY:1,children:jsx(Text,{dimColor:true,children:e??"No items found."})})}j();function Xu({items:e,emptyMessage:t}){let r=S(l=>l.selectedIndex);if(e.length===0)return jsx(Rn,{message:t});let n=Math.max(0,r-Math.floor(et/2)),o=Math.min(e.length,n+et);o===e.length&&(n=Math.max(0,o-et));let s=e.slice(n,o),i=n,a=e.length-o;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:i>0?`\u2191 ${i} more above`:" "})}),s.map((l,u)=>jsx(Hs,{item:l,isSelected:n+u===r},l.name)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:a>0?`\u2193 ${a} more below`:" "})})]})}function Zu({label:e,pathHint:t}){return jsxs(Box,{paddingBottom:1,children:[jsx(Text,{bold:true,color:"blueBright",children:e}),jsxs(Text,{dimColor:true,children:[" ",t]})]})}j();function ed({groups:e,emptyMessage:t}){let r=S(p=>p.selectedIndex),n=[],o=0;for(let p of e){n.push({kind:"header",label:p.label,pathHint:p.pathHint,key:`h-${p.scope}`});for(let g of p.items)n.push({kind:"item",item:g,itemIndex:o,key:`i-${p.scope}-${g.name}-${g.marketplace??""}`}),o++;}if(o===0)return jsx(Rn,{message:t});let i=n.findIndex(p=>p.kind==="item"&&p.itemIndex===r),a=i>=0?i:0,l=Math.max(0,a-Math.floor(et/2)),u=Math.min(n.length,l+et);u===n.length&&(l=Math.max(0,u-et));let c=n.slice(l,u),d=l,m=n.length-u;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:d>0?`\u2191 ${d} more above`:" "})}),c.map(p=>p.kind==="header"?jsx(Zu,{label:p.label,pathHint:p.pathHint},p.key):jsx(Hs,{item:p.item,isSelected:p.itemIndex===r},p.key)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:m>0?`\u2193 ${m} more below`:" "})})]})}var ew={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function tw({items:e,tabId:t,emptyMessage:r,groups:n,actionHint:o}){return jsxs(Box,{flexDirection:"column",children:[jsx(ju,{}),jsx(Ku,{}),jsxs(Box,{paddingX:1,marginTop:1,children:[jsx(Text,{bold:true,children:ew[t]}),jsxs(Text,{dimColor:true,children:[" (",e.length,")"]}),o&&e.length>0&&jsx(Text,{dimColor:true,children:` \xB7 ${o}`})]}),n&&n.length>0?jsx(ed,{groups:n,emptyMessage:r}):jsx(Xu,{items:e,emptyMessage:r})]})}function td({filteredItems:e,emptyMessage:t,groups:r,onBatchUpdate:n}){let o=S(l=>l.activeTab),s=S(l=>l.focus);return useInput(l=>{l==="a"&&e.length>0&&n?.();},{isActive:o==="updates"&&s==="list"}),jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(tw,{items:e,tabId:o,emptyMessage:t,groups:o!=="discover"?r:void 0,actionHint:o==="updates"?"press 'a' to update all":void 0},o)})}var ow={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 Js(){let e=S(r=>r.focus),t=!!process.env.DEBUG;return jsx(Box,{borderStyle:"single",borderTop:true,borderBottom:false,borderLeft:false,borderRight:false,children:jsxs(Text,{dimColor:true,children:[ow[e],t?" | Ctrl+D: debug log":""]})})}F();function rd({message:e,type:t}){return e?jsx(Box,{paddingX:1,children:jsxs(Text,{color:t==="success"?"green":t==="info"?"cyan":"red",children:[t==="success"?"\u2713":t==="info"?"(i)":"\u2717"," ",y(e)]})}):null}function Gs({message:e}){return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(hp,{type:"dots"})}),jsxs(Text,{children:[" ",e]})]})}function za(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}var id=20;function Ws(e,t){let r=t>0?Math.min(e/t,1):0,n=Math.round(r*100),o=Math.round(r*id),s="\u2588".repeat(o)+"\u2591".repeat(id-o),i=`${za(e)} / ${za(t)}`;return {bar:s,percent:n,label:i}}function zs({received:e,total:t}){let{bar:r,percent:n,label:o}=Ws(e,t);return jsxs(Text,{dimColor:true,children:[r," ",n,"%"," ","(",o,")"]})}function Xs({message:e,onRetry:t,onBack:r}){return useInput((n,o)=>{n==="r"&&o.ctrl&&t?t():o.escape&&r&&r();}),jsxs(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:[jsxs(Text,{color:"red",children:["\u2717 ",e]}),t&&jsx(Text,{dimColor:true,children:"Press Ctrl+R to retry"}),r&&jsx(Text,{dimColor:true,children:"Press Escape to go back"})]})}function ot({itemName:e,actions:t,descriptions:r,onAction:n,onClose:o}){let s=S(l=>l.focus),[i,a]=useState(0);return useInput((l,u)=>{u.upArrow?a(c=>c>0?c-1:c):u.downArrow?a(c=>c<t.length-1?c+1:c):u.return?n(t[i]):u.escape&&o();},{isActive:s==="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:t.map((l,u)=>jsxs(Box,{children:[jsxs(Text,{bold:u===i,color:u===i?"cyan":void 0,children:[u===i?"\u203A ":" ",l]}),r?.[l]&&jsxs(Text,{dimColor:true,children:[" \u2014 ",r[l]]})]},u))})]})}j();var Za=Object.entries(Wt),ud=[...Za.map(([,e])=>e.actionLabel),"Cancel"],dd=Object.fromEntries(Za.map(([,e])=>[e.actionLabel,e.description]));function pd(e){let t=Za.find(([,r])=>r.actionLabel===e);return t?t[0]:null}R();var Sw=x("provider.registry"),xw=3e4,Ys=class{adapters=new Map;availabilityCache=new Map;register(t){this.adapters.set(t.id,t);}async checkAvailability(t){let r=this.availabilityCache.get(t.id);if(r&&Date.now()<r.expiresAt)return r.result;let n=await t.isAvailable();return this.availabilityCache.set(t.id,{result:n,expiresAt:Date.now()+xw}),n}async getAvailableProviders(t){let r=[...this.adapters.values()].filter(o=>t in o.installers),n=await Promise.allSettled(r.map(o=>this.checkAvailability(o)));return n.forEach((o,s)=>{o.status==="rejected"&&Sw.warn(`Provider "${r[s].id}" isAvailable() threw: ${String(o.reason)}`);}),r.filter((o,s)=>{let i=n[s];return i.status==="fulfilled"&&i.value===true})}getAdapter(t){return this.adapters.get(t)}listAdapters(){return [...this.adapters.values()]}};var bw={user:"global",project:"project",local:"local"};function Zs(e){return e?bw[e]:"global"}var Xe=class extends Error{constructor(r,n){super(`${r} v${n} is already installed. Use --force to reinstall.`);this.pluginName=r;this.version=n;this.name="AlreadyInstalledError";}pluginName;version},Tr=class extends Error{constructor(r,n){super(`${r} is already up to date (v${n})`);this.pluginName=r;this.version=n;this.name="AlreadyUpToDateError";}pluginName;version};To();Qa();R();var Ew=x("catalog.registry"),Qs=class{adapters=new Map;register(t){this.adapters.set(t.id,t);}unregister(t){this.adapters.delete(t);}async fetchAllWithErrors(){let t=this.listAdapters(),r=await Promise.allSettled(t.map(s=>s.fetchItems())),n=[],o=[];for(let s=0;s<r.length;s++){let i=r[s],a=t[s];if(i.status==="fulfilled")n.push(...i.value);else {let l=String(i.reason);Ew.warn(`Catalog adapter failed: ${l}`),o.push({adapterId:a.id,adapterName:a.name,reason:l});}}return {items:n,failures:o}}async fetchAll(){let{items:t}=await this.fetchAllWithErrors();return t}getAdapter(t){return this.adapters.get(t)}listAdapters(){return [...this.adapters.values()]}};Je();var Lw={retries:5,minTimeout:50};async function el(e,t){mkdirSync(dirname(e),{recursive:true});let r=await fy.lock(e+".lock",{realpath:false,retries:Lw});try{return await t()}finally{await r();}}var ei=class{filePath;constructor(t){this.filePath=t??Lc();}async read(){try{let t=await readFile(this.filePath,"utf-8");return JSON.parse(t).catalogs??[]}catch(t){if(t.code==="ENOENT")return [];throw t}}async write(t){let r=dirname(this.filePath);await mkdir(r,{recursive:true});let n=`${this.filePath}.${randomUUID()}.tmp`;await writeFile(n,JSON.stringify({catalogs:t},null,2),"utf-8"),await rename(n,this.filePath);}async add(t){await el(this.filePath,async()=>{let r=await this.read();if(r.some(o=>o.id===t.id))return;let n={...t,lastUpdated:t.lastUpdated??new Date().toISOString()};await this.write([...r,n]);});}async remove(t){if(t==="flow-api")throw new Error("The Flow Marketplace catalog cannot be removed");await el(this.filePath,async()=>{let r=await this.read();await this.write(r.filter(n=>n.id!==t));});}async updateField(t,r){await el(this.filePath,async()=>{let n=await this.read();n.some(o=>o.id===t)&&await this.write(n.map(o=>o.id===t?{...o,...r}:o));});}};rl();var pe=new Qs,Qt=new ei,Kw=["flow-harness"];function Vw(){let e=process.env.FLOW_CONTENT_SOURCES;return e===void 0?Kw:e.split(",").map(t=>t.trim()).filter(Boolean)}pe.register(new Un);for(let e of Vw())pe.register(new Un(e));var Id=false;async function vd(){if(Id)return;Id=true;let e=await Qt.read(),{GitRepoAdapter:t}=await Promise.resolve().then(()=>(nl(),bd));for(let r of e)pe.register(new t(r.id,r.name,r.source));}Cr();var Ed=2;async function er(e){if(e){let{FlowApiAdapter:t}=await Promise.resolve().then(()=>(rl(),gd));return new t(e).fetchItems()}return pe.fetchAll()}async function Pd(){return pe.fetchAllWithErrors()}async function Bn(e,t){Co(e);try{return await Ln(`v1/plugins/${e}/manifest`,t).json()}catch(r){let n=await Mn(r);throw n?new Error(n):r instanceof Error?r.message.includes("404")?new Error(`Plugin '${e}' not found in catalog`):r.message.includes("timeout")?new Error("Download timed out after 30s"):new Error(`Failed to fetch plugin manifest: ${r.message}`):r}}async function Td(e,t,r){Co(e);try{let n=await Ln(`v1/plugins/${e}/archive`,r),o=n.headers.get("x-archive-size"),s=o?Number(o):NaN,i=Number.isFinite(s)&&s>0?s:0,a=i>0,l=n.body;if(!l)throw new Error("Failed to download plugin: response has no body");let u=l.getReader(),c=[],d=0;for(;;){let{done:m,value:p}=await u.read();if(m)break;if(d+=p.byteLength,a&&d>i*Ed)throw await u.cancel(),new Error(`Download exceeded expected size: received ${d} bytes, expected at most ${i*Ed}`);c.push(p),a&&t?.(d,i);}return Buffer.concat(c)}catch(n){if(n instanceof Error&&n.message.includes("Download exceeded expected size"))throw n;let o=await Mn(n);throw o?new Error(o):n instanceof Error?new Error(`Failed to download plugin: ${n.message}`):n}}async function ri(){try{let{profiles:e}=await Zt().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}}Je();Je();async function Cd(e,t){let r=Ie.resolve(t);await Ut.mkdir(r,{recursive:true});let n=Ie.join(Ie.dirname(r),`${randomUUID()}.zip`);try{await Ut.writeFile(n,e);let o=await Jw.Open.file(n),s=Ie.normalize(r+Ie.sep);for(let i of o.files){if((i.externalFileAttributes>>16&61440)===40960)throw new Error(`Zip Slip (symlink): entry "${i.path}" is a symbolic link and was rejected`);let l=Ie.resolve(r,i.path);if(process.platform==="win32"&&l.length>=260)throw new Error(`Path too long: "${l}" (${l.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(!l.startsWith(s)&&l!==r)throw new Error(`Zip Slip detected: entry "${i.path}" would escape target directory`)}await o.extract({path:r});try{let i=realpathSync(r);if(!i.startsWith(Ie.resolve(Ie.dirname(r))))throw new Error(`Zip Slip (post-extract): resolved path "${i}" is outside expected parent`)}catch(i){if(i.code!=="ENOENT")throw i}}finally{try{await Ut.unlink(n);}catch{}}}async function ol(e){await Ut.rm(e,{recursive:true,force:true});}async function kr(){let e=Rc();await Ut.mkdir(Ie.dirname(e),{recursive:true});try{await Ut.writeFile(e,"",{flag:"wx"});}catch(r){if(r.code!=="EEXIST")throw r}return await fy.lock(e,{stale:1e4,retries:{retries:2,minTimeout:500,maxTimeout:500}})}Je();j();function zw(e){return {$schema:"https://anthropic.com/claude-code/marketplace.schema.json",name:e||le,description:"Flow Skills marketplace",owner:{name:"Flow Team",email:"flow@ciandt.com"},plugins:[]}}function Rd(e){let t=is(e);if(!ve__default.existsSync(t))return null;try{return JSON.parse(ve__default.readFileSync(t,"utf-8"))}catch{return null}}function Xw(e){let t=Rd(e);if(t)return t;let r=zw(e),n=is(e);return ve__default.mkdirSync(Ie__default.dirname(n),{recursive:true}),sl(r,e),r}function sl(e,t){let r=is(t),n=`${r}.${randomUUID()}.tmp`;ve__default.writeFileSync(n,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),ve__default.renameSync(n,r);}function qw(e){let t=e||le,r=Fr(),n={};try{ve__default.existsSync(r)&&(n=JSON.parse(ve__default.readFileSync(r,"utf-8")));}catch{n={};}if(n[t])return;n[t]={source:{source:"github",repo:`cit-flow/${t}`},installLocation:Ac(e),lastUpdated:new Date().toISOString(),autoUpdate:true};let o=`${r}.${randomUUID()}.tmp`;ve__default.writeFileSync(o,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}),ve__default.renameSync(o,r);}function $d(e,t,r){bt(e.name),qw(r);let n=oa(e.name,r);ve__default.mkdirSync(Ie__default.dirname(n),{recursive:true});try{ve__default.lstatSync(n),ve__default.rmSync(n,{recursive:!0,force:!0});}catch{}ve__default.cpSync(t,n,{recursive:true,dereference:true});let o=Xw(r);o.plugins.some(i=>i.name===e.name)||(o.plugins.push({name:e.name,description:e.description,version:e.version,author:e.author,source:`./plugins/native/${e.name}`,category:e.category}),sl(o,r));}function il(e,t){bt(e);let r=oa(e,t);try{ve__default.rmSync(r,{recursive:!0,force:!0});}catch{}let n=Rd(t);if(!n)return;let o=n.plugins.length;n.plugins=n.plugins.filter(s=>s.name!==e),n.plugins.length!==o&&sl(n,t);}F();R();var Zw=x("mcpConfigReader"),Qw=500,eS=512;function tS(){return Ie__default.join(Me__default.homedir(),".claude.json")}function rS(){return Ie__default.join(process.cwd(),".mcp.json")}function Md(e){if(!ve__default.existsSync(e))return null;try{return JSON.parse(ve__default.readFileSync(e,"utf-8"))}catch{return Zw.debug(`[mcpConfigReader] Failed to parse ${e}`),null}}function ko(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function al(e){if(!ko(e))return {};let t=e.mcpServers;return ko(t)?t:{}}function ll(e,t){return Object.keys(e).slice(0,Qw).map(n=>({name:y(n.slice(0,eS)),marketplace:"",version:void 0,installedAt:"",installPath:"",scope:t,description:void 0,author:void 0,status:"enabled",type:"mcp"}))}function Dd(){let e=[],t=tS(),r=Md(t);if(ko(r)){let a=r,l=al(a);e.push(...ll(l,"user"));let u=process.cwd();if(ko(a.projects)){let c=a.projects[u];if(ko(c)){let d=al(c);e.push(...ll(d,"local"));}}}let n=rS(),o=Md(n),s=al(o);e.push(...ll(s,"project"));let i=new Map;for(let a of e){let l=`${a.name}@${a.scope}`;i.has(l)||i.set(l,a);}return [...i.values()]}R();var st=x("storage");async function oS(e,t,r){try{await E(I.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:r,source:t,interface:Q().interfaceType});}catch(n){st.warn(`Failed to send uninstall metrics: ${String(n)}`);}}function sS(e,t,r){let n=t==="enabled"?I.CLI_TOOL_ENABLED:I.CLI_TOOL_DISABLED;E(n,{tool_id:e,source:r,interface:Q().interfaceType}).catch(o=>st.warn(`Failed to send ${t} metrics: ${String(o)}`));}function pl(){return Ie__default.join(Me__default.homedir(),".claude","plugins","installed_plugins.json")}function iS(){return Ie__default.join(Me__default.homedir(),".claude","plugins")}function ni(e){let t;try{t=ve__default.realpathSync(e);}catch{t=Ie__default.resolve(e);}let r=Ie__default.resolve(iS()),n=Ie__default.resolve(Ie__default.join(process.cwd(),".claude","plugins")),o=t.startsWith(r+Ie__default.sep),s=t.startsWith(n+Ie__default.sep);if(!o&&!s)throw new Error(`Security error: installPath '${e}' is outside the plugins directory`)}function Ud(e="user"){return e==="local"?Ie__default.join(process.cwd(),".claude","settings.local.json"):e==="project"?Ie__default.join(process.cwd(),".claude","settings.json"):Ie__default.join(Me__default.homedir(),".claude","settings.json")}function Ue(){let e=pl();if(!ve__default.existsSync(e))return {version:2,plugins:{}};try{return JSON.parse(ve__default.readFileSync(e,"utf-8"))}catch{return {version:2,plugins:{}}}}async function ml(){let e=pl();try{let t=await ve__default.promises.readFile(e,"utf-8");return JSON.parse(t)}catch{return {version:2,plugins:{}}}}function aS(e){let t=e?.code;return t==="EACCES"||t==="EPERM"}function Nd(e,t){try{ve__default.mkdirSync(Ie__default.dirname(e),{recursive:!0});let r=`${e}.${randomUUID()}.tmp`;ve__default.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),ve__default.renameSync(r,e);}catch(r){throw aS(r)?new Error(`Permission denied: cannot write to '${e}'. Check your file system permissions.`):r}}function it(e){Nd(pl(),e);}function Ao(e){let t=e.lastIndexOf("@");return t===-1?{name:e,marketplace:""}:{name:e.slice(0,t),marketplace:e.slice(t+1)}}function lS(e,t){let r=Ie__default.join(e,".claude-plugin"),n=Ie__default.join(r,"plugin.json");if(ve__default.existsSync(n))try{return JSON.parse(ve__default.readFileSync(n,"utf-8"))}catch{return null}let o=Ie__default.join(r,"marketplace.json");if(ve__default.existsSync(o))try{let s=JSON.parse(ve__default.readFileSync(o,"utf-8"));return {description:s.plugins?.find(a=>a.name===t)?.description,author:s.owner}}catch{return null}return null}function fl(e="user"){let t=Ud(e);if(!ve__default.existsSync(t))return {};try{return JSON.parse(ve__default.readFileSync(t,"utf-8"))}catch{return {}}}function Bd(e,t="user"){Nd(Ud(t),e);}function cS(e,t){let{name:r,marketplace:n}=Ao(e),o;if(n?(o=`${r}@${n}`,t[o]||(o=void 0)):o=Object.keys(t).filter(i=>Ao(i).name===r)[0],!o)throw st.error(`[${r}] Plugin is not installed`),new Error(`Plugin '${r}' is not installed`);return {key:o,name:r}}function uS(e,t){let{name:r,marketplace:n}=Ao(e),o;return n?(o=`${r}@${n}`,t[o]||(o=void 0)):o=Object.keys(t).filter(i=>Ao(i).name===r)[0],o?{key:o,name:r}:null}function cl(e="user"){return fl(e).enabledPlugins??{}}function ul(e,t="user"){let r=fl(t),n=r.enabledPlugins;if(!n||!(e in n))return;let{[e]:o,...s}=n;r.enabledPlugins=s,Bd(r,t);}function Ro(e,t,r="user"){let n=fl(r),o=n.enabledPlugins??{};n.enabledPlugins={...o,[e]:t},Bd(n,r);}function dS(e){let t=new Map;for(let r of e){let n=r.projectPath?`${r.scope}:${r.projectPath}`:r.scope,o=t.get(n);(!o||r.installedAt>o.installedAt)&&t.set(n,r);}return [...t.values()]}function ie(){let e=Ue(),t=cl(),r=cl("project"),n=cl("local"),o={project:r,local:n},s=Object.entries(e.plugins).flatMap(([u,c])=>{let{name:d,marketplace:m}=Ao(u),p=c.map(f=>f.scope==="managed"?{...f,scope:"user"}:f);return dS(p).map(f=>{let h=lS(f.installPath,d),v=(o[f.scope]??t)[u];return {name:d,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:v===false?"disabled":"enabled"}})}),i=Dd(),a=new Set(s.map(u=>`${u.name}@${u.scope}`)),l=i.filter(u=>!a.has(`${u.name}@${u.scope}`));return [...s,...l]}function Od(e){let t=e.lastIndexOf("@");return t>0?e.slice(t+1):void 0}async function $o(e,t){st.debug(`[${e}] Acquiring lock to uninstall`);let r=await kr();try{let n=Ue(),o=uS(e,n.plugins);if(!o)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:s,name:i}=o,a=n.plugins[s];if(t){let l=a.find(d=>d.scope===t);if(!l)throw new Error(`Plugin '${i}' is not installed in ${t} scope`);st.debug(`[${i}] Resolved key: ${s}, scope: ${t}`),ni(l.installPath);let u=Ie__default.dirname(l.installPath);ni(u),st.debug(`[${i}] Removing directory: ${u}`),ve__default.rmSync(u,{recursive:!0,force:!0});let c=a.filter(d=>d.scope!==t);if(c.length===0){let{[s]:d,...m}=n.plugins;it({...n,plugins:m}),ul(s,t),il(i,Od(s));}else n.plugins[s]=c,it(n),ul(s,t);}else {st.debug(`[${i}] Resolved key: ${s}`);for(let c of a){ni(c.installPath);let d=Ie__default.dirname(c.installPath);ni(d),st.debug(`[${i}] Removing directory: ${d}`),ve__default.rmSync(d,{recursive:!0,force:!0}),ul(s,c.scope);}il(i,Od(s));let{[s]:l,...u}=n.plugins;it({...n,plugins:u});}await oS(i,a[0].origin??"internal",a[0].type??"skill"),st.debug(`[${i}] Uninstalled successfully`);}finally{await r();}}async function Lo(e,t,r){st.debug(`[${e}] Acquiring lock to set status \u2192 ${t}`);let n=await kr();try{let o=Ue(),{key:s,name:i}=cS(e,o.plugins),a=o.plugins[s],l=r??a[0].scope,u=a[0].origin??"internal";st.debug(`[${i}] Resolved key: ${s}, scope: ${l}`),Ro(s,t==="enabled",l),sS(i,t,u),st.debug(`[${i}] Status updated to ${t}`);}finally{await n();}}j();R();var pS=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,mS=/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)?$/;function bt(e){if(!pS.test(e))throw new Error(`Invalid plugin name from manifest: "${e}". Plugin names must be lowercase alphanumeric and hyphens (1-64 chars).`)}function fS(e){if(!mS.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 Ar=x("installer");function gS(e,t,r){let n=`${e}@${r||le}`,s=Ue().plugins[n];if(s&&!t)throw new Xe(e,s[0].version??"unknown");return {pluginKey:n,alreadyInstalled:s}}async function hS(e,t,r){r&&await ol(t);try{Ar.debug(`[${t}] Extracting archive...`),await Cd(e,t);}catch(n){throw await ol(t),n}}function yS(e,t,r,n,o,s="claude-code",i){let a=Ue(),l={scope:n,...n==="user"?{}:{projectPath:process.cwd()},installPath:t,version:r,installedAt:new Date().toISOString(),origin:o,providerId:s,type:i},u=a.plugins[e]??[];a.plugins[e]=[...u.filter(c=>c.scope!==n),l],it(a),Ro(e,true,n);}async function wS(e,t,r,n,o,s){try{await E(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:s,source:o,scope:n,version:t,duration_ms:r,interface:Q().interfaceType});}catch(i){Ar.warn(`Failed to send install metrics: ${String(i)}`);}}async function SS(e,t,r,n){try{await E(I.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:n,source:r,error_code:t instanceof Error?t.name:"UNKNOWN",error_message:(t instanceof Error?t.message:String(t)).slice(0,500),interface:Q().interfaceType});}catch(o){Ar.warn(`Failed to send install-failed metrics: ${String(o)}`);}}async function Ne(e,t={}){let r=Date.now(),n=null;try{Ar.debug(`[${e}] Acquiring lock...`),n=await kr();let{pluginKey:o,alreadyInstalled:s}=gS(e,t.force,t.source),{source:i}=t;Ar.debug(`[${e}] Fetching manifest...`);let a=await Bn(e,i);bt(a.name),fS(a.version),Ar.debug(`[${e}] Downloading archive...`);let l=await Td(e,t.onDownloadProgress,i),u=t.scope??"user",c=t.type??"skill",d=kc(a.name,a.version,t.source);await hS(l,d,!!s&&!!t.force),yS(o,d,a.version,u,"internal",t.providerId,c),$d(a,d,t.source);let m=Date.now()-r;Ar.debug(`[${e}] Installed successfully in ${m}ms`);let p={name:a.name,version:a.version,path:d,duration_ms:m};return t.skipMetrics||await wS(a.name,a.version,m,Zs(u),"internal",c),p}catch(o){throw await SS(e,o,"internal",t.type??"skill"),Ar.error(`[${e}] Installation failed: ${o instanceof Error?o.message:String(o)}`),o}finally{n&&await n();}}R();F();Ee();En();R();var xS=x("commands:helpers");async function me(){let e=await Z();if(!e)return P("Not authenticated. Run: flow auth login"),false;e.customUrl&&Rt(e.customUrl);try{await Lt();}catch(t){return xS.debug(`Token validation failed: ${String(t)}`),P("Session expired. Run: flow auth login"),false}return true}async function de(e){let t=hl.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(y(e),n=>{t.close(),r(["y","yes"].includes(n.toLowerCase().trim()));});})}async function Rr(e){let t=hl.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(y(e),n=>{t.close(),r(n.trim());});})}var bS="\x1B[A",IS="\x1B[B";function Fd(e,t){let r=t?T.cyan("\u276F"):" ",n=t?T.cyan(e.label):e.label,o=e.description?T.dim(` \u2014 ${e.description}`):"";return ` ${r} ${n}${o}`}function vS(e,t){return e.map((r,n)=>Fd(r,n===t)).join(`
|
|
111
|
+
`)}async function jd(e,t){if(t.length===0)throw new Error("selectPrompt requires at least one option");return new Promise((r,n)=>{let o=0;process.stdout.write(`${y(e)}
|
|
112
|
+
`),process.stdout.write(vS(t,o));let s="",i=c=>{if(s+=c,s===""){l(),n(new Error("SIGINT"));return}if(s==="\r"||s===`
|
|
113
113
|
`){l(),process.stdout.write(`
|
|
114
|
-
`),r(t[o].value);return}if(s===
|
|
115
|
-
`);}function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",i),process.removeListener("uncaughtException",u),process.removeListener("unhandledRejection",u),process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u);}function u(){try{process.stdin.setRawMode(!1);}catch{}process.exit(1);}process.on("uncaughtException",u),process.on("unhandledRejection",u),process.on("SIGINT",u),process.on("SIGTERM",u),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",i);})}
|
|
116
|
-
If a marketplace is needed, enter the source (owner/repo or URL), or press Enter to skip: `))?.trim(),!o))throw new Error("No marketplace source provided. Cannot retry install.");o=Zs(o),r?.(),Bn.debug(`[${n}] Adding marketplace via: claude plugin marketplace add ${o}`);try{let s=await execa("claude",["plugin","marketplace","add",o],{reject:!1});if(s.exitCode!==0)throw new Error(`Failed to add marketplace: ${s.stderr||"unknown error"}`);Bn.debug(`[${n}] Marketplace added successfully`);}catch(s){throw hl(s)?new ti:s}}Tr();j();He();$();var mS=6e4,Ar=class extends Error{url;isTimeout;isAuthError;constructor(t,r,n=false,o=false){super(t),this.name="GitCloneError",this.url=r,this.isTimeout=n,this.isAuthError=o;}};async function Ot(e,t){let r=await mkdtemp(join(tmpdir(),"flow-skills-")),n=simpleGit({timeout:{block:mS}}).env("GIT_TERMINAL_PROMPT","0").env("GIT_LFS_SKIP_SMUDGE","1"),o=t?["--depth","1","--branch",t]:["--depth","1"];try{return await n.clone(e,r,o),r}catch(s){await rm$1(r,{recursive:true,force:true}).catch(()=>{});let i=s instanceof Error?s.message:String(s),a=i.includes("block timeout")||i.includes("timed out"),l=i.includes("Authentication failed")||i.includes("could not read Username")||i.includes("Permission denied")||i.includes("Repository not found");throw a?new Ar("Clone timed out after 60s. Check your SSH keys or credentials.",e,true,false):l?new Ar(`Authentication failed for ${e}. Ensure you have access and credentials are configured.`,e,false,true):new Ar(`Failed to clone ${e}: ${i}`,e,false,false)}}async function Ut(e){let t=normalize(resolve(e)),r=normalize(resolve(tmpdir()));if(!t.startsWith(r+sep))throw new Error("Attempted to clean up directory outside of temp directory");await rm$1(e,{recursive:true,force:true});}async function nn(e,t=["--version"]){try{return (await execa(e,t,{reject:!1})).exitCode===0}catch(r){if(r instanceof Error&&"code"in r&&r.code==="ENOENT")return false;throw r}}function gS(e){return typeof e=="object"&&e!==null&&e.source==="git-subdir"}function hS(e){return typeof e=="object"&&e!==null&&e.source==="url"}function yS(e){return typeof e=="object"&&e!==null&&e.source==="github"}function Fn(e,t){let r=e.source;if(gS(r)){let n=r.path?r.path.replace(/^\.\//,""):".",o=r.ref&&!/^[0-9a-f]{40}$/i.test(r.ref)?r.ref:void 0;return {cloneUrl:r.url,subPath:n||".",ref:o}}if(hS(r))return {cloneUrl:r.url,subPath:"."};if(yS(r))return {cloneUrl:`https://github.com/${r.repo}`,subPath:"."};if(typeof r=="string"){if(r.startsWith("https://")||r.startsWith("git@"))return {cloneUrl:r,subPath:"."};if((r.startsWith("./")||r===".")&&t){let n=r==="."?".":r.replace(/^\.\//,"")||".";return {cloneUrl:t,subPath:n}}}return null}function at(e){return e.toLowerCase().replace(/[^a-z0-9._]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").substring(0,255)||"unnamed"}var Nt=x("claude-code.adapter");function xS(e,t){let r=e??"external";if(!t)return r;let n=t.match(/github\.com\/([^/]+\/[^/]+?)(?:\.git)?(?:[/?#]|$)/);if(!n)return r;let o=n[1],s=Nr();if(!be__default.existsSync(s))return r;try{let i=JSON.parse(be__default.readFileSync(s,"utf-8"));for(let[a,l]of Object.entries(i))if(l.source?.repo===o)return a}catch{}return r}async function Fd(e,t){let r=e.catalogId?de.getAdapter(e.catalogId):void 0,n=Fn(e,r?.source);if(!n)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let o=e.type==="bundle"||e.type==null,s=xS(e.catalogId,r?.source),i=t.scope??"user",a;o?a=ea(s,e.name,"external"):a=join(Br(i==="user"?"global":"project"),e.name);let l=null;try{bt(e.name),l=await Ot(n.cloneUrl,n.ref);let u=n.subPath==="."?l:join(l,n.subPath);if(be__default.existsSync(a)&&be__default.rmSync(a,{recursive:!0,force:!0}),be__default.mkdirSync(dirname(a),{recursive:!0}),be__default.cpSync(u,a,{recursive:!0}),o){let c=`${e.name}@${s}`,d=await ll(),m={scope:i,installPath:a,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:e.type},p=d.plugins[c]??[];d.plugins[c]=[...p.filter(f=>f.scope!==i),m],it(d),ko(c,!0,i);}return {success:!0,message:`Installed ${e.name} from ${n.cloneUrl}`}}catch(u){return Nt.debug(`[${e.name}] External catalog install failed: ${String(u)}`),{success:false,message:u instanceof Error?u.message:String(u)}}finally{l&&await Ut(l).catch(()=>{});}}async function yl(e,t,r,n){try{await v(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:r,source:"external",scope:Xs(n),version:"unknown",duration_ms:t,interface:Z().interfaceType});}catch(o){Nt.warn(`Failed to send external install metrics: ${String(o)}`);}}async function Nd(e,t,r){try{await v(I.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:r,source:"external",error_code:t instanceof Error?t.name:"UNKNOWN",error_message:(t instanceof Error?t.message:String(t)).slice(0,500),interface:Z().interfaceType});}catch(n){Nt.warn(`Failed to send external install-failed metrics: ${String(n)}`);}}var bS={async install(e,t){if(e.origin===cn&&!e.installCommand&&!Ln(e.name))return Fd(e,t);if(e.origin===cn&&e.installCommand){let r=e.type??"skill",n=await Ro(e.installCommand,t.scope);return n.exitCode===0?(await yl(e.name,n.duration_ms,r,t.scope),{success:true,message:`Installed ${e.name}`}):(await Nd(e.name,new Error(n.stderr||"Install failed"),r),{success:false,message:n.stderr||`Install failed with exit code ${n.exitCode}`})}if(Ln(e.name)){let r=e.type??"skill",n=_n(e.name,t.scope);Nt.debug(`[${e.name}] Attempting install: ${n}`);let o=await Ae(n);if(o.exitCode===0)return await yl(e.name,o.duration_ms,r,t.scope),{success:true};Nt.debug(`[${e.name}] First attempt failed, adding marketplace`),await ri(e.name,t.marketplaceSource,()=>{});let s=await Ae(n);return s.exitCode===0?(await yl(e.name,s.duration_ms,r,t.scope),{success:true}):(await Nd(e.name,new Error(s.stderr||"Install failed"),r),{success:false,message:s.stderr||`Install failed with exit code ${s.exitCode}`})}try{let r=await Oe(e.name,{...t,type:e.type});return {success:!0,message:`Installed ${e.name}@${r.version}`}}catch(r){return Nt.debug(`[${e.name}] Plugin install failed: ${String(r)}`),{success:false,message:r instanceof Error?r.message:String(r)}}},async uninstall(e,t){await Ao(e,t);},getInstallPath(e,t){return ""}};function Bd(e){return {async install(t,r){if(t.origin===cn&&!t.installCommand&&!Ln(t.name))return Fd(t,r);if(!t.installCommand)try{let o=await Oe(t.name,{...r,type:e});return {success:!0,message:`Installed ${t.name}@${o.version}`}}catch(o){return Nt.debug(`[${t.name}] ${e} install failed: ${String(o)}`),{success:false,message:o instanceof Error?o.message:String(o)}}Nt.debug(`[${t.name}] Executing install command: ${t.installCommand}`);let n=await Ro(t.installCommand,r.scope);return n.exitCode===0?{success:true}:{success:false,message:n.stderr||`Install failed with exit code ${n.exitCode}`}},async uninstall(t,r){let n=De(),o=`${t}@${le}`;if(n.plugins[o]){await Ao(t,r);return}throw new Error(`${e.toUpperCase()} uninstall via claude CLI not supported \u2014 use: claude ${e} remove ${t}`)},getInstallPath(t,r){return ""}}}function IS(e){for(let t of [join(e,".claude","agents"),join(e,"agents")]){if(!be__default.existsSync(t))continue;let r=be__default.readdirSync(t).filter(n=>n.endsWith(".md")&&be__default.lstatSync(join(t,n)).isFile());if(r.length>0)return r.map(n=>join(t,n))}return []}function wl(e){return e===null||typeof e!="object"||Array.isArray(e)?e:Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,wl(r)]))}function jd(e,t){let r={...e};for(let[n,o]of Object.entries(t)){let s=r[n];if(Array.isArray(o)&&Array.isArray(s)){let i=new Set(s.map(a=>JSON.stringify(wl(a))));r[n]=[...s,...o.filter(a=>!i.has(JSON.stringify(wl(a))))];}else o!==null&&typeof o=="object"&&!Array.isArray(o)&&s!==null&&typeof s=="object"&&!Array.isArray(s)?r[n]=jd(s,o):r[n]=o;}return r}async function Kd(e,t,r,n){let o=await ll(),s=`${e}@claude-code`,i={scope:t,installPath:r,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:n},a=o.plugins[s]??[];o.plugins[s]=[...a.filter(l=>l.scope!==t),i],it(o);}var vS={async install(e,t){let r=t.scope??"user",n=e.catalogId?de.getAdapter(e.catalogId):void 0,o=Fn(e,n?.source);if(!o)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let s=null;try{bt(e.name),s=await Ot(o.cloneUrl,o.ref);let i=o.subPath==="."?s:join(s,o.subPath),a=IS(i);if(a.length===0)return {success:!1,message:`No agent files found in "${e.name}"`};let l=ss(r);be__default.mkdirSync(l,{recursive:!0});let u=at(e.name);if(a.length===1)be__default.copyFileSync(a[0],join(l,`${u}.md`));else for(let d of a){let m=at(basename(d,".md"));be__default.copyFileSync(d,join(l,`${u}--${m}.md`));}let c=a.length===1?join(l,`${u}.md`):l;return await Kd(e.name,r,c,"agent"),{success:!0,message:`Installed agent(s) from ${e.name}`}}catch(i){return Nt.debug(`[${e.name}] Agent install failed: ${String(i)}`),{success:false,message:i instanceof Error?i.message:String(i)}}finally{s&&await Ut(s).catch(()=>{});}},async uninstall(e,t){let r=ss(t),n=at(e);if(be__default.existsSync(r))for(let a of be__default.readdirSync(r).filter(l=>l===`${n}.md`||l.startsWith(`${n}--`)&&l.endsWith(".md")))be__default.rmSync(join(r,a),{force:true});let o=`${e}@claude-code`,s=De(),i=(s.plugins[o]??[]).filter(a=>a.scope!==t);if(i.length===0){let{[o]:a,...l}=s.plugins;it({...s,plugins:l});}else it({...s,plugins:{...s.plugins,[o]:i}});},getInstallPath(e,t){return join(ss(t),`${at(e)}.md`)}},ES={async install(e,t){let r=t.scope??"user",n=e.catalogId?de.getAdapter(e.catalogId):void 0,o=Fn(e,n?.source);if(!o)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let s=null;try{bt(e.name),s=await Ot(o.cloneUrl,o.ref);let i=o.subPath==="."?s:join(s,o.subPath),a=join(i,"settings.json");if(!be__default.existsSync(a))return {success:!1,message:`No settings.json found in "${e.name}"`};let l;try{l=JSON.parse(be__default.readFileSync(a,"utf-8"));}catch{return {success:!1,message:`settings.json in "${e.name}" contains invalid JSON`}}let u=l.hooks;if(!u||typeof u!="object"||Array.isArray(u))return {success:!1,message:`No hooks found in "${e.name}" settings.json`};let c=wo();if(c.status==="malformed")return {success:!1,message:"settings.json at destination contains invalid JSON \u2014 refusing to overwrite"};let d=c.status==="ok"?c.settings:{},m=d.hooks!==null&&typeof d.hooks=="object"&&!Array.isArray(d.hooks)?d.hooks:{},p=jd(m,u);return Cs({...d,hooks:p}),await Kd(e.name,r,"hooks","hook"),{success:!0,message:`Installed hooks from ${e.name}`}}catch(i){return Nt.debug(`[${e.name}] Hook install failed: ${String(i)}`),{success:false,message:i instanceof Error?i.message:String(i)}}finally{s&&await Ut(s).catch(()=>{});}},async uninstall(e,t){throw new Error("Hook uninstall not supported \u2014 remove entries manually from settings.json")},getInstallPath(e,t){return ""}},ni=class{id="claude-code";name="Claude Code";async isAvailable(){return nn("claude",["--version"])}getSupportedScopes(){return ["user","project","local"]}installers={bundle:bS,skill:Bd("skill"),mcp:Bd("mcp"),agent:vS,hook:ES}};function oi(e,t){return {async install(r,n){if(!r.installCommand)return {success:false,message:"No install command provided"};let[o,...s]=r.installCommand.split(/\s+/).filter(Boolean);if(!o||!e.has(o))return {success:false,message:`Disallowed command: "${o??""}"`};let i=await execa(o,s,{reject:false});return i.exitCode===0?{success:true}:{success:false,message:i.stderr||`Install failed with exit code ${i.exitCode}`}},async uninstall(r,n){throw new Error(`MCP uninstall not supported \u2014 ${t.replace("<name>",r)}`)},getInstallPath(r,n){return ""}}}var TS=new Set(["gh"]),CS=oi(TS,"use: gh copilot mcp remove <name>"),si=class{id="copilot";name="GitHub Copilot";async isAvailable(){return await nn("gh",["--version"])?nn("gh",["copilot","--version"]):false}getSupportedScopes(){return ["user"]}installers={mcp:CS}};He();var kS=new Set(["opencode"]),AS=oi(kS,"use: opencode config remove mcp <name>");function $S(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 Vd(){return {async install(e,t){try{bt(e.name);}catch{return {success:false,message:"Invalid plugin name."}}let r=e.catalogId?de.getAdapter(e.catalogId):void 0,n=Fn(e,r?.source);if(!n)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let o=null;try{o=await Ot(n.cloneUrl,n.ref);let s=n.subPath==="."?o:join(o,n.subPath),i=os(t.scope??"user"),a=join(s,".opencode","plugins");if(be__default.existsSync(a)){let l=be__default.readdirSync(a).filter(u=>u.endsWith(".js")||u.endsWith(".mjs"));if(l.length===0)return {success:!1,message:"No JS plugin file found in .opencode/plugins/"};be__default.mkdirSync(i,{recursive:!0}),be__default.copyFileSync(join(a,l[0]),join(i,`${e.name}.js`));}else {let l=join(i,`${e.name}-content`);be__default.existsSync(l)&&be__default.rmSync(l,{recursive:!0,force:!0}),be__default.mkdirSync(l,{recursive:!0}),be__default.cpSync(s,l,{recursive:!0}),be__default.mkdirSync(i,{recursive:!0}),be__default.writeFileSync(join(i,`${e.name}.js`),$S(e.name),"utf-8");}return {success:!0,message:`Installed ${e.name} for OpenCode`}}catch(s){return {success:false,message:s instanceof Error?s.message:String(s)}}finally{o&&await Ut(o).catch(()=>{});}},async uninstall(e,t){bt(e);let r=os(t),n=join(r,`${e}.js`),o=join(r,`${e}-content`);be__default.existsSync(n)&&be__default.rmSync(n,{force:true}),be__default.existsSync(o)&&be__default.rmSync(o,{recursive:true,force:true});},getInstallPath(e,t){return join(os(t),`${e}.js`)}}}var ii=class{id="opencode";name="OpenCode";async isAvailable(){return nn("opencode",["--version"])}getSupportedScopes(){return ["user","project"]}installers={mcp:AS,skill:Vd(),bundle:Vd()}};var Bt=new zs;Bt.register(new ni);xr()&&(Bt.register(new si),Bt.register(new ii));function Hd({itemName:e,itemType:t,onInstall:r,onClose:n}){let[o,s]=useState(false),[i,a]=useState(false),[l,u]=useState([]),[c,d]=useState(void 0);useEffect(()=>{Bt.getAvailableProviders(t??"bundle").then(u).catch(()=>{});},[t]);let m=useCallback(g=>{g==="Install"?l.length>1?a(true):s(true):n();},[n,l.length]),p=useCallback(g=>{if(g==="Cancel"){a(false);return}let w=l.find(E=>E.name===g);w?(d(w.id),a(false),s(true)):a(false);},[l]),f=useCallback(g=>{let w=Zu(g);w?r(w,c):s(false);},[r,c]),y=useCallback(()=>{s(false);},[]);if(i){let g=[...l.map(w=>w.name),"Cancel"];return jsx(ot,{itemName:`${e} \u2014 Choose provider`,actions:g,onAction:p,onClose:()=>a(false)},"provider")}return o?jsx(ot,{itemName:`${e} \u2014 Choose scope`,actions:qu,descriptions:Yu,onAction:f,onClose:y},"scope"):jsx(ot,{itemName:e,actions:["Install","Cancel"],onAction:m,onClose:n},"main")}B();function Gd({itemName:e,bundle:t,onInstall:r,onConfirm:n,onClose:o}){let s=S(f=>f.focus),[i,a]=useState(0),u=(t?.artifact.artifacts??[]).filter(f=>f.available),c=t!==void 0&&u.length===0,d=useMemo(()=>c?["Cancel"]:["Confirm Install","Cancel"],[c]);useEffect(()=>{a(0);},[t]);let m=useCallback((f,y)=>{y.upArrow?a(g=>Math.max(0,g-1)):y.downArrow?a(g=>Math.min(d.length-1,g+1)):y.return?d[i]==="Confirm Install"?n():o():y.escape&&o();},[d,i,n,o]);useInput(m,{isActive:s==="actionMenu"&&t!==void 0});let p=useCallback(f=>{f==="Install Bundle"?r():o();},[r,o]);return t?jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:t.title}),jsx(Box,{marginTop:1,children:jsxs(Text,{children:[u.length," artifact",u.length!==1?"s":""," available"]})}),jsx(Box,{flexDirection:"column",marginTop:1,marginBottom:1,children:u.map(f=>{let y=h(f.name??f.flowId),g=f.type??"unknown";return jsxs(Box,{gap:1,children:[jsx(Text,{color:"green",children:"\u2713"}),jsx(Text,{children:y}),jsxs(Text,{dimColor:true,children:["(",g,")"]})]},f.flowId)})}),jsx(Box,{flexDirection:"column",children:d.map((f,y)=>jsx(Box,{children:jsxs(Text,{bold:y===i,color:y===i?"cyan":void 0,children:[y===i?"\u203A ":" ",f]})},f))})]}):jsx(ot,{itemName:e,actions:["Install Bundle","Cancel"],onAction:p,onClose:o})}function ci({activeFocus:e,onConfirm:t}){let[r,n]=useState("idle"),o=S(s=>s.focus);return useInput((s,i)=>{i.escape||s==="n"?n("idle"):s==="y"&&t();},{isActive:r==="confirming"&&o===e}),{isConfirming:r==="confirming",requestConfirm:()=>n("confirming"),cancelConfirm:()=>n("idle")}}B();function Xd({itemName:e,itemScope:t,itemStatus:r,updateAvailable:n,catalogVersion:o,onUninstall:s,onToggleStatus:i,onUpdate:a,onClose:l}){let{isConfirming:u,requestConfirm:c}=ci({activeFocus:"actionMenu",onConfirm:()=>s(t)});if(u)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 d=r==="enabled"?"Disable":"Enable",m=o&&h(o),p=m?`Update to v${m}`:"Update";return jsx(ot,{itemName:e,actions:n?["Uninstall",d,p,"Cancel"]:["Uninstall",d,"Cancel"],onAction:g=>{g==="Uninstall"?c():g===d?i(t):g.startsWith("Update")?a?.():l();},onClose:l})}function Zd({itemName:e,itemScope:t,onUninstall:r,onClose:n}){let{isConfirming:o,requestConfirm:s}=ci({activeFocus:"actionMenu",onConfirm:()=>r(t)});return o?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(ot,{itemName:e,actions:["Uninstall","Cancel"],onAction:l=>{l==="Uninstall"?s():n();},onClose:n})}$();var Vn=x("bundle:installer"),Qd=/already exists/i;async function NS(e){if(!e.installCommand)throw new Error("Missing install command");let t=e.installCommand;if(Rd(t)){let r=await Ld(t);if(r.exitCode!==0){let n=r.stderr?.trim()||r.stdout?.trim()||`exit code ${r.exitCode}`;if(Qd.test(n))return;throw new Error(n)}}else {let r=await Ro(t);if(r.exitCode!==0){let n=r.stderr?.trim()||r.stdout?.trim()||`exit code ${r.exitCode}`;if(Qd.test(n))return;throw new Error(n)}}}async function BS(e,t){try{await v(I.CLI_BUNDLE_INSTALL_STARTED,{bundle_slug:e,artifact_count:t});}catch(r){Vn.warn(`Failed to emit bundle install started event: ${String(r)}`);}}async function FS(e,t,r){try{await v(I.CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS,{bundle_slug:e,artifact_name:t,artifact_type:r});}catch(n){Vn.warn(`Failed to emit bundle install plugin success event: ${String(n)}`);}}async function ep(e,t,r,n){try{await v(I.CLI_BUNDLE_INSTALL_PLUGIN_FAILED,{bundle_slug:e,artifact_name:t,artifact_type:r,error_message:n});}catch(o){Vn.warn(`Failed to emit bundle install plugin failed event: ${String(o)}`);}}async function jS(e,t,r,n,o){try{await v(I.CLI_BUNDLE_INSTALL_COMPLETED,{bundle_slug:e,installed_count:t,failed_count:r,unavailable_count:n,duration_ms:o});}catch(s){Vn.warn(`Failed to emit bundle install completed event: ${String(s)}`);}}async function pi(e,t={}){let{onProgress:r}=t,n=e.artifact.artifacts,o=n.filter(p=>p.available),s=n.length-o.length,i=e.artifact.name,a=Date.now();await BS(i,o.length);let l=[],u=0,c=o.length;for(let[p,f]of o.entries()){let y=f.name??f.flowId,g=f.type??"unknown";if(!f.type){Vn.warn(`Artifact "${y}" has no type \u2014 treated as failed`),l.push({name:y,type:g,reason:"unknown artifact type"}),await ep(i,y,g,"unknown artifact type"),r?.({index:p+1,total:c,artifact:f,success:false,error:"unknown artifact type"});continue}try{await NS(f),u++,await FS(i,y,g),r?.({index:p+1,total:c,artifact:f,success:!0});}catch(w){let E=w instanceof Error?w.message:String(w);Vn.error(`Failed to install artifact "${y}": ${E}`),l.push({name:y,type:g,reason:E}),await ep(i,y,g,E),r?.({index:p+1,total:c,artifact:f,success:false,error:E});}}let d=Date.now()-a,m=l.length;return await jS(i,u,m,s,d),{bundleTitle:e.title,total:n.length,installed:u,skipped:s,failed:m,failures:l}}B();function op({bundle:e,onComplete:t}){let[r,n]=useState(null),[o,s]=useState(null),i=useRef(false);return useEffect(()=>{i.current||(i.current=true,pi(e,{onProgress:n}).then(s).catch(a=>{let l=a instanceof Error?a.message:"Installation failed",u=e.artifact.artifacts,c=u.filter(d=>d.available);s({bundleTitle:e.title,total:u.length,installed:0,skipped:u.length-c.length,failed:c.length,failures:c.map(d=>({name:d.name??d.flowId,type:d.type??"unknown",reason:l}))});}));},[e]),useEffect(()=>{o&&t(o);},[o,t]),jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsx(Box,{paddingBottom:1,children:jsxs(Text,{bold:true,children:["Installing ",e.title,"..."]})}),r&&jsxs(Box,{gap:1,children:[jsx(Text,{color:"cyan",children:jsx(np,{type:"dots"})}),jsxs(Text,{color:"cyan",children:["[",r.index,"/",r.total,"] Installing"," ",h(r.artifact.name??r.artifact.flowId)," (",r.artifact.type??"unknown",")"]})]}),!r&&jsxs(Box,{gap:1,children:[jsx(Text,{color:"cyan",children:jsx(np,{type:"dots"})}),jsx(Text,{color:"cyan",children:"Preparing..."})]})]})}var fe=create(e=>({installedItems:[],setInstalledItems:t=>e({installedItems:t}),loadFromDisk:()=>e({installedItems:ie()})}));B();function sp({entries:e,selectedIndex:t,focusPanel:r}){let n=r==="list",o=t===0&&n;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{marginBottom:1,children:[jsx(Text,{color:"cyan",bold:true,children:o?"\u203A ":" "}),jsx(Text,{color:"cyan",bold:o,dimColor:!n,children:"+ Add Marketplace"})]}),e.map((s,i)=>{let a=i+1,l=t===a&&n,u=s.stored?.autoUpdate!==false;return jsxs(Box,{flexDirection:"column",marginBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:l?"\u203A ":" "}),jsx(Text,{bold:l,dimColor:!n,children:s.adapter.name}),u&&s.stored&&jsx(Text,{color:"yellow",children:" \u2605"})]}),s.stored?.lastUpdated&&jsx(Box,{marginLeft:2,children:jsxs(Text,{dimColor:true,children:["Updated ",Ct(s.stored.lastUpdated)]})})]},s.adapter.id)})]})}B();function ip({entry:e,detailData:t,installedCount:r,focusPanel:n,actionIndex:o,onBrowse:s,onUpdate:i,onToggleAutoUpdate:a,onRemove:l}){let{adapter:u,stored:c}=e,d=u.removable!==false,m=c?.autoUpdate!==false,p=n==="detail",f=[{label:`Browse plugins${t&&!t.loading?` (${t.items.length})`:""}`,handler:s},{label:"Update marketplace",handler:i},...d?[{label:"Toggle auto-update",handler:a},{label:"Remove marketplace",handler:l,danger:true}]:[]];return p?jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:u.name}),jsx(Text,{dimColor:true,children:u.source}),jsx(Box,{marginTop:1,children:t?.loading?jsx(Text,{dimColor:true,children:"Loading..."}):t?.error?jsx(Text,{color:"red",children:t.error}):jsxs(Text,{dimColor:true,children:[t?`${t.items.length} available`:"\u2014 available",r>0?` \xB7 ${r} installed`:"",c?.lastUpdated?` \xB7 Updated ${Ct(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:f.map((y,g)=>{let w=g===o;return jsxs(Box,{children:[jsx(Text,{color:w?"cyan":void 0,children:w?"\u203A ":" "}),jsx(Text,{bold:w,color:y.danger?"yellow":void 0,dimColor:!w,children:y.label})]},y.label)})})]}):jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:u.name}),jsx(Text,{dimColor:true,children:u.source}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter or Tab to see details"})})]})}function ap(e){return e.adapter.removable!==false?4:2}j();B();function lp({item:e,adapterName:t,isInstalled:r,onBack:n,onInstall:o,onUninstall:s}){let i=[...r&&s?[{label:"Uninstall",handler:()=>s(e),danger:true}]:!r&&o?[{label:"Install",handler:()=>o(e)}]:[],{label:"Back",handler:n}],[a,l]=useState(0);return useInput((u,c)=>{if(c.escape){n();return}if(c.upArrow){l(d=>Math.max(0,d-1));return}if(c.downArrow){l(d=>Math.min(i.length-1,d+1));return}c.return&&i[a].handler();}),jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsxs(Text,{dimColor:true,children:["Marketplaces \u203A ",t," \u203A Browse plugins \u203A ",h(e.name)]}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{bold:true,children:h(e.name)}),e.type&&jsxs(Text,{dimColor:true,children:[" [",h(e.type),"]"]}),e.origin&&jsxs(Text,{dimColor:true,children:[" [",h(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:h(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 ",h(e.author.name)]}),e.version&&jsxs(Text,{dimColor:true,children:["Version ",h(e.version)]}),e.category&&jsxs(Text,{dimColor:true,children:["Category ",h(e.category)]})]})]}),jsx(Box,{flexDirection:"column",marginTop:1,children:i.map((u,c)=>jsxs(Box,{children:[jsx(Text,{color:c===a?"cyan":void 0,children:c===a?"\u203A ":" "}),jsx(Text,{bold:c===a,color:u.danger?"yellow":void 0,dimColor:c!==a,children:u.label})]},u.label))}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: confirm \xB7 Esc: back"})})]})}function up({item:e,isSelected:t,isInstalled:r}){return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:t?"\u203A ":" "}),jsx(Text,{color:r?"green":void 0,bold:t,children:e.name}),r&&jsx(Text,{color:"green",children:" \u2713"})]}),e.description?jsx(Box,{paddingLeft:4,children:jsx(Text,{dimColor:true,wrap:"truncate",children:e.description})}):null]})}function dp({entry:e,items:t,installedKeys:r,onBack:n}){let o=e.adapter.id??"default",s=t.filter(C=>r.has(`${C.name}@${o}`)),i=t.filter(C=>!r.has(`${C.name}@${o}`)),a=[...s,...i],[l,u]=useState(0),[c,d]=useState(null);if(useInput((C,R)=>{if(R.escape){n();return}if(R.return){d(a[l]??null);return}if(R.upArrow){u(_=>Math.max(0,_-1));return}R.downArrow&&u(_=>Math.min(a.length-1,_+1));},{isActive:c===null}),c!==null)return jsx(lp,{item:c,adapterName:e.adapter.name,isInstalled:r.has(`${c.name}@${o}`),onBack:()=>d(null)});if(t.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,l-Math.floor(Qe/2)),p=Math.min(a.length,m+Qe);p===a.length&&(m=Math.max(0,p-Qe));let f=a.slice(m,p),y=m,g=a.length-p,w=s.length>0&&m<s.length,E=p>s.length,D=f.filter(C=>r.has(`${C.name}@${o}`)),M=f.filter(C=>!r.has(`${C.name}@${o}`));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:y>0?`\u2191 ${y} more above`:" "})}),w&&jsxs(Box,{flexDirection:"column",children:[jsxs(Text,{dimColor:true,children:["\u2500\u2500 Installed (",s.length,") \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]}),D.map(C=>jsx(up,{item:C,isSelected:a.indexOf(C)===l,isInstalled:true},C.name))]}),E&&jsxs(Box,{flexDirection:"column",marginTop:w?1:0,children:[jsxs(Text,{dimColor:true,children:["\u2500\u2500 Available (",i.length,") \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]}),M.map(C=>jsx(up,{item:C,isSelected:a.indexOf(C)===l,isInstalled:false},C.name))]}),jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:g>0?`\u2193 ${g} more below`:" "})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: details \xB7 Esc: back"})})]})}Za();var zS=/^https?:\/\/.+/;function XS(e){return e!==null&&typeof e=="object"&&"response"in e&&e.response?.status===404}function qS(e){return e instanceof Error&&e.code==="GITHUB_AUTH_REQUIRED"}function gp(e){let t=S(g=>g.showNotification),r=S(g=>g.incrementCatalogVersion),[n,o]=useState("idle"),[s,i]=useState(""),[a,l]=useState(""),[u,c]=useState(null),d=useRef(""),m=useRef("");useEffect(()=>{d.current=s;},[s]),useEffect(()=>{m.current=a;},[a]);let p=useCallback(()=>{d.current="",m.current="",i(""),l(""),c(null),o("add-name");},[]),f=useCallback(()=>{o("idle");},[]),y=useCallback(async()=>{let g=m.current,w=d.current;if(!zS.test(g)){c("URL must start with http:// or https://");return}c(null),o("adding");let E=randomUUID(),D=new On(E,w,g);try{await D.fetchItems(),await Zt.add({id:E,name:w,source:g}),de.register(new On(E,w,g)),r(),e(),t(`Catalog "${w}" added`,"success"),i(""),l(""),d.current="",m.current="",o("idle");}catch(M){let C=XS(M)?"No marketplace.json found in this repository (checked main and master branches). Ensure the repo has a marketplace.json at its root.":qS(M)?M.message:M instanceof Error?`Could not reach catalog URL: ${M.message}`:"Failed to validate catalog URL";t(C,"error"),o("add-url");}},[e,t,r]);return useInput((g,w)=>{if(w.escape){o("idle");return}if(w.return){d.current.trim().length>0&&o("add-url");return}if(w.backspace||w.delete){d.current=d.current.slice(0,-1),i(d.current);return}g&&!w.ctrl&&!w.meta&&(d.current=d.current+g,i(d.current));},{isActive:n==="add-name"}),useInput((g,w)=>{if(w.escape){o("add-name");return}if(w.return){y();return}if(w.backspace||w.delete){m.current=m.current.slice(0,-1),l(m.current),c(null);return}g&&!w.ctrl&&!w.meta&&(m.current=m.current+g,l(m.current),c(null));},{isActive:n==="add-url"}),{phase:n,inputName:s,inputUrl:a,urlError:u,setInputName:i,setInputUrl:l,startAdd:p,cancelAdd:f}}function hp(e){let t=S(o=>o.showNotification),r=S(o=>o.incrementCatalogVersion);return {handleRemove:useCallback(async o=>{try{await Zt.remove(o),de.unregister(o),r(),e(),t("Catalog removed","success");}catch(s){t(s instanceof Error?s.message:"Failed to remove catalog","error");}},[e,t,r])}}function wp(){let e=S(A=>A.focus),t=S(A=>A.setFocus),r=S(A=>A.showNotification),n=fe(A=>A.installedItems),[o,s]=useState(()=>de.listAdapters().map(A=>({adapter:A,stored:null}))),[i,a]=useState(0),[l,u]=useState("list"),[c,d]=useState(0),[m,p]=useState(null),[f,y]=useState("main"),g=useRef(o);useEffect(()=>{g.current=o;},[o]),useEffect(()=>{f==="browse"&&!o[i-1]&&y("main");},[f,o,i]);let w=useCallback(()=>{(async()=>{let A=de.listAdapters(),N=await Zt.read(),G=new Map(N.map(Re=>[Re.id,Re]));s(A.map(Re=>({adapter:Re,stored:G.get(Re.id)??null})));})();},[]);useEffect(()=>{t("marketplaces"),w();},[t,w]),useEffect(()=>{if(i===0){p(null);return}let A=g.current[i-1];if(!A)return;let N=false;return p({items:[],loading:true,error:null}),A.adapter.fetchItems().then(G=>{N||p({items:G,loading:false,error:null});}).catch(G=>{N||p({items:[],loading:false,error:G instanceof Error?G.message:"Failed to load catalog"});}),()=>{N=true;}},[i]);let E=gp(w),D=useCallback(()=>{w(),a(0),u("list"),p(null),y("main");},[w]),{handleRemove:M}=hp(D),C=useCallback(async A=>{y("removing"),await M(A);},[M]),R=useCallback(async A=>{try{let N=await A.adapter.fetchItems();if(p({items:N,loading:!1,error:null}),A.stored){let G=new Date().toISOString();await Zt.updateField(A.stored.id,{lastUpdated:G}),w();}r("Marketplace updated","success");}catch(N){r(N instanceof Error?N.message:"Update failed","error");}},[w,r]),_=useCallback(async A=>{if(!A.stored)return;let N=A.stored.autoUpdate!==false;await Zt.updateField(A.stored.id,{autoUpdate:!N}),w();},[w]),O=useCallback(()=>y("browse"),[]),ee=useCallback(A=>{let N=o[i-1];if(!N)return;let G=N.adapter.removable!==false;[O,()=>{R(N);},...G?[()=>{_(N);},()=>{C(N.adapter.id);}]:[]][A]?.();},[o,i,O,R,_,C]),k=useCallback(()=>y("main"),[]),H=useCallback(()=>{let A=o[i-1];A&&R(A);},[o,i,R]),Q=useCallback(()=>{let A=o[i-1];A&&_(A);},[o,i,_]),K=useCallback(()=>{let A=o[i-1];A&&C(A.adapter.id);},[o,i,C]);if(useInput((A,N)=>{if(N.upArrow){a(G=>Math.max(0,G-1));return}if(N.downArrow){a(G=>Math.min(o.length,G+1));return}(N.return||N.tab)&&(i===0?E.startAdd():(u("detail"),d(0)));},{isActive:f==="main"&&E.phase==="idle"&&l==="list"&&e==="marketplaces"}),useInput((A,N)=>{if(N.escape||N.tab){u("list");return}if(N.upArrow){d(G=>Math.max(0,G-1));return}if(N.downArrow){let G=o[i-1],Re=G?ap(G)-1:0;d(Zo=>Math.min(Zo+1,Re));return}N.return&&ee(c);},{isActive:f==="main"&&E.phase==="idle"&&l==="detail"&&e==="marketplaces"}),E.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:E.inputName}),jsx(Text,{color:"gray",children:"\u2588"})]}),E.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(E.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:E.inputName})]}),jsxs(Box,{children:[jsx(Text,{children:"URL: "}),jsx(Text,{color:"cyan",children:E.inputUrl}),jsx(Text,{color:"gray",children:"\u2588"})]}),E.urlError&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"red",children:E.urlError})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter: confirm | Esc: back | Must start with http:// or https://"})})]});if(E.phase==="adding")return jsx(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:jsx(Text,{children:"Validating catalog URL..."})});if(f==="removing")return jsx(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:jsx(Text,{children:"Removing catalog..."})});if(f==="browse"){let A=o[i-1];if(!A)return jsx(Box,{});let N=A.adapter.id??"default",G=new Set(n.filter(Re=>Re.marketplace===A.adapter.name).map(Re=>`${Re.name}@${N}`));return jsx(dp,{entry:A,items:m?.items??[],installedKeys:G,onBack:k})}if(o.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 V=o[i-1]??null,z=V?n.filter(A=>A.marketplace===V.adapter.name).length:0;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Box,{flexDirection:"column",width:30,marginRight:1,children:jsx(sp,{entries:o,selectedIndex:i,focusPanel:l})}),jsx(Box,{flexDirection:"column",flexGrow:1,children:l==="detail"&&V?jsx(ip,{entry:V,detailData:m,installedCount:z,focusPanel:l,actionIndex:c,onBrowse:O,onUpdate:H,onToggleAutoUpdate:Q,onRemove:K}):jsx(Box,{paddingLeft:1,children:jsx(Text,{dimColor:true,children:V?"Enter or Tab to see details":"\u2191\u2193 to navigate, Enter or Tab to see details"})})})]}),jsx(Box,{marginTop:1,paddingX:1,children:l==="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 Sp(e,t,r,n){if(t.upArrow)return r.selectedIndex===0?[{type:"setSelectedIndex",index:-1},{type:"setFocus",focus:"search"}]:[{type:"setSelectedIndex",index:r.selectedIndex-1}];if(t.downArrow&&r.selectedIndex<n-1)return [{type:"setSelectedIndex",index:r.selectedIndex+1}];if(t.leftArrow){let o=ne.findIndex(i=>i.id===r.activeTab),s=ne[(o-1+ne.length)%ne.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}if(t.rightArrow){let o=ne.findIndex(i=>i.id===r.activeTab),s=ne[(o+1)%ne.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}if(t.tab){let o=ne.findIndex(i=>i.id===r.activeTab),s=ne[(o+1)%ne.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}return t.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"&&r.activeTab==="updates"?[]:e&&e!==" "&&!t.ctrl&&!t.meta&&!t.escape?[{type:"setSelectedIndex",index:-1},{type:"setFocus",focus:"search"},{type:"searchAppend",char:e}]:[]}function xp(e,t){return t.escape?[{type:"setActionMenuOpen",open:false},{type:"setFocus",focus:"list"}]:[]}function bp(e,t,r){return t.escape?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:"reset"}:t.downArrow?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:null}:t.leftArrow?{actions:[],queryUpdate:{cursorMove:-1}}:t.rightArrow?{actions:[],queryUpdate:{cursorMove:1}}:t.return?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:null}:t.backspace?r.length===0?{actions:[{type:"setFocus",focus:"list"},{type:"setSelectedIndex",index:0}],queryUpdate:null}:{actions:[],queryUpdate:{backspace:true}}:e&&!t.ctrl&&!t.meta?{actions:[],queryUpdate:{append:e}}:{actions:[],queryUpdate:null}}var tx=new Set(ne.filter(e=>e.focus!=="list").map(e=>e.focus));function jo(e){let{setActiveTab:t,setFocus:r,setSelectedIndex:n,setActionMenuOpen:o}=S.getState();for(let s of e)if(s.type==="setTab")t(s.tab);else if(s.type==="setFocus")r(s.focus);else if(s.type==="setSelectedIndex")n(s.index);else if(s.type==="setActionMenuOpen")o(s.open);else if(s.type==="searchAppend"){let{setQuery:i,query:a,setCursorPosition:l,cursorPosition:u}=We.getState();i(a.slice(0,u)+s.char+a.slice(u)),l(u+s.char.length);}else s.type==="toggleTypeFilter"?S.getState().toggleTypeFilter(s.catalogType):s.type==="selectAllTypes"?S.getState().selectAllTypes():s.type==="toggleOriginFilter"?S.getState().toggleOriginFilter(s.origin):s.type==="selectAllOrigins"&&S.getState().selectAllOrigins();}function Ip({listLength:e}){let t=S(y=>y.focus),r=S(y=>y.selectedIndex),n=S(y=>y.actionMenuOpen),o=S(y=>y.setFocus),s=S(y=>y.setActionMenuOpen),i=We(y=>y.query),a=We(y=>y.setQuery),l=We(y=>y.resetQuery),u=useRef(e);useEffect(()=>{u.current=e;},[e]),useEffect(()=>{if(t==="search"){let{query:y,setCursorPosition:g}=We.getState();g(y.length);}},[t]);let[c,d]=useState("");useEffect(()=>{let y=setTimeout(()=>d(i),300);return ()=>clearTimeout(y)},[i]),useInput((y,g)=>{let{activeTab:w,selectedIndex:E,actionMenuOpen:D}=S.getState();jo(Oa(y,g,{activeTab:w}));},{isActive:t==="tabs"}),useInput((y,g)=>{if(!g.leftArrow&&!g.rightArrow)return;let{activeTab:w,selectedIndex:E,actionMenuOpen:D}=S.getState();jo(Oa("",g,{activeTab:w}));},{isActive:tx.has(t)}),useInput((y,g)=>{let{activeTab:w,selectedIndex:E,actionMenuOpen:D}=S.getState();jo(Sp(y,g,{activeTab:w,selectedIndex:E},u.current));},{isActive:t==="list"}),useInput((y,g)=>{jo(xp(y,g));},{isActive:t==="actionMenu"}),useInput((y,g)=>{let w=bp(y,g,We.getState().query),E=w.queryUpdate;if(jo(w.actions),E==="reset")l(),d("");else if(E!==null){let{query:D,cursorPosition:M,setCursorPosition:C}=We.getState();if("backspace"in E)M>0&&(a(D.slice(0,M-1)+D.slice(M)),C(M-1));else if("append"in E)a(D.slice(0,M)+E.append+D.slice(M)),C(M+E.append.length);else if("cursorMove"in E){let R=M+E.cursorMove;R>=0&&R<=D.length&&C(R);}}},{isActive:t==="search"});let m=useCallback(()=>{s(false),o("list");},[s,o]),p=useCallback(y=>{let{setSelectedIndex:g,selectedIndex:w}=S.getState();y===0?g(0):w>=y&&g(y-1);},[]),f=useCallback(y=>{if(!c)return u.current=y.length,y;let g=c.toLowerCase(),w=y.filter(E=>E.name.toLowerCase().includes(g)||E.description?.toLowerCase().includes(g));return u.current=w.length,w},[c]);return {actionMenuOpen:n,closeMenu:m,selectedIndex:r,clampIndex:p,filteredItems:f}}function Ep(){let e=S(a=>a.notification),t=S(a=>a.showNotification),r=S(a=>a.clearNotification),n=rt(a=>a.justAuthenticated),o=rt(a=>a.credentials),s=rt(a=>a.setJustAuthenticated);return useEffect(()=>{n&&o&&(t(`Authenticated. Tenant: ${o.tenant}`,"success"),s(false));},[n,o]),useEffect(()=>{if(!e)return;let a=setTimeout(r,3e3);return ()=>clearTimeout(a)},[e]),{notify:(a,l)=>{t(a,l);}}}function Fe(e,t,r=false){return r?true:!vl.valid(e)||!vl.valid(t)?false:vl.gt(t,e)}j();$();var rr=x("updater");async function rx(e,t,r,n,o,s){try{await v(I.CLI_TOOL_UPDATED,{tool_id:e,tool_type:s,source:o,from_version:t,to_version:r,duration_ms:n,interface:Z().interfaceType});}catch(i){rr.warn(`Failed to send update metrics: ${String(i)}`);}}function nx(e){let t=De(),r=`${e}@${le}`,n=t.plugins[r];return !n||n.length===0?null:{pluginKey:r,entry:n[0]}}async function hi(e,t={}){let r=Date.now(),n=null;try{rr.debug(`[${e}] Acquiring lock...`),n=await Cr();let o=nx(e);if(!o)throw rr.error(`[${e}] Plugin is not installed`),new Error(`Plugin "${e}" is not installed`);let{entry:s}=o,i=s.version,a=s.installPath;rr.debug(`[${e}] Fetching manifest...`);let u=(await Un(e,t.source)).version;if(!i||!Fe(i,u,t.force))throw rr.debug(`[${e}] Already up to date (v${i??"n/a"})`),new Pr(e,i??"unknown");rr.info(`[${e}] Updating v${i} \u2192 v${u}...`),await n(),n=null;try{let c=await Oe(e,{force:!0,skipMetrics:!0,source:t.source}),d=Date.now()-r;return await rx(c.name,i,c.version,d,s.origin??"internal",s.type??"skill"),rr.debug(`[${e}] Updated successfully in ${d}ms`),{name:c.name,previousVersion:i,newVersion:c.version,path:c.path,duration_ms:d}}catch(c){rr.warn(`[${e}] Install failed, rolling back to v${i}...`),n=await Cr();let d=De(),m=`${e}@${le}`;throw d.plugins[m]&&(d.plugins[m][0].version=i,d.plugins[m][0].installPath=a,it(d),rr.info(`[${e}] Rollback completed, restored to v${i}`)),c}}finally{n&&await n();}}Tr();$();var yi=x("dispatcher");async function ox(e,t,r,n,o){let s=Mn(e);return yi.debug(`[${e}] Install failed (exit code), attempting marketplace add`),o?.onError?.(r),n?o?.onStatus?.(`Adding marketplace for ${s}...`):o?.onPause?.(),await ri(e,n,()=>{}),o?.onResume?.(`Retrying install for ${s}...`),yi.debug(`[${e}] Retrying install after marketplace add`),Ae(t)}async function Pp(e,t,r,n){let o=_n(e,n),s=Mn(e);r?.onStatus?.(`Installing ${s}...`),yi.debug(`[${e}] Attempting install: ${o}`);let i=await Ae(o);if(i.exitCode===0)return i;yi.debug(`[${e}] Install failed (exit ${i.exitCode}), attempting marketplace add`);let a=i.stderr||`Install failed with exit code ${i.exitCode}`;return ox(e,o,a,t,r)}async function Tp(e,t,r){let n=e.type??"bundle",o=await Bt.getAvailableProviders(n),s=o[0];if(!s)throw new Error(`No available provider for artifact type "${n}"`);let i=s.installers[n];if(!i)throw new Error(`Provider "${s.id}" does not support type "${n}"`);let a=t??{},l=a;return i.install(e,l)}function Cp(){let e=fe(i=>i.installedItems),t=fe(i=>i.loadFromDisk),r=useCallback(async(i,a)=>{let l=await Tp(i,a);if(!l.success)throw new Error(l.message||"Installation failed");t();},[t]),n=useCallback(async(i,a)=>{let l=ie().find(p=>p.name===i),u=l?.providerId??"claude-code",c=Bt.getAdapter(u);if(!c)throw new Error(`Provider "${u}" not found`);let d=l?.type??"bundle",m=c.installers[d];if(!m)throw new Error(`Provider "${u}" does not support type "${d}"`);await m.uninstall(i,a??"user"),t();},[t]),o=useCallback(async(i,a)=>{let u=e.find(c=>c.name===i)?.status==="enabled"?"disabled":"enabled";await $o(i,u,a),t();},[e,t]),s=useCallback(async i=>{await hi(i),t();},[t]);return {install:r,uninstall:n,toggle:o,update:s}}B();$();var Si=x("mcp");function Ko(e,t){e.silent?tt({status:"error",mcp:t.name,...t.exitCode!==void 0&&{exitCode:t.exitCode},message:t.message}):P(`Failed to ${t.action} MCP "${t.name}": ${t.message}`);}function Ap(e,t){e.silent?Te({status:"success",mcp:t.name,command:t.command,duration_ms:t.durationMs}):(te(`MCP "${t.name}" ${t.actionPastTense} successfully`),e.verbose&&t.stdout&&b(t.stdout));}function sx(e,t,r,n){let o=["claude","mcp","add","--transport",r,e];return t.length>0&&o.push(...t),n&&o.push("--scope",n),o.join(" ")}function El(e,t){if(e.startsWith("-"))throw new Error(`Invalid MCP server name: "${e}". Names must not start with '-'.`);let r=["claude","mcp","remove",e];return t&&r.push("--scope",t),r.join(" ")}async function $p(e,t,r){if(!await pe())return 1;if(t.length===0){let s=r.transport==="http"?"a URL":"a command";return Ko(r,{name:e,action:"add",message:`${r.transport} transport requires ${s}`}),1}Si.debug(`[${e}] Starting MCP add with args: ${t.join(" ")}`);let n=sx(e,t,r.transport,r.scope);if(!r.force){let s=h(e),i=h(n);if(!await Ue(`Install external MCP "${s}"?
|
|
114
|
+
`),r(t[o].value);return}if(s===bS){o=(o-1+t.length)%t.length,a(),s="";return}if(s===IS){o=(o+1)%t.length,a(),s="";return}s.startsWith("\x1B")&&s.length<3||(s="");};function a(){process.stdout.write(`\x1B[${t.length-1}A`);for(let c=0;c<t.length;c++)process.stdout.write(`\r\x1B[2K${Fd(t[c],c===o)}`),c<t.length-1&&process.stdout.write(`
|
|
115
|
+
`);}function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",i),process.removeListener("uncaughtException",u),process.removeListener("unhandledRejection",u),process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u);}function u(){try{process.stdin.setRawMode(!1);}catch{}process.exit(1);}process.on("uncaughtException",u),process.on("unhandledRejection",u),process.on("SIGINT",u),process.on("SIGTERM",u),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",i);})}Cr();var jn=x("claudeProxy"),xl="claude ",Kd="flow ",yl=class extends Error{constructor(t){super(`Invalid install command: "${t}". Command must start with "claude " for security.`),this.name="InvalidInstallCommandError";}},Fn=class extends Error{constructor(t){super(`Disallowed subcommand: "${t}". Only "plugin install", "plugin marketplace add", "mcp add", and "mcp remove" are permitted.`),this.name="DisallowedSubcommandError";}},ES=/^plugins?\s+(install|i)\s+|^plugins?\s+marketplace\s+add\s+|^mcp\s+(add|remove)\s+/,PS=/^--(scope|transport|env|header|timeout|prefix-args|timeout-ms|local|global|user)$/,TS={"--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}$/},CS=/^npm\s+(i|install)\s+-g\s+@ciandt-flow\/cli$/,kS=/^(flow|claude)\s+auth\s+login(\s|$)/,Vd=/^flow\s+plugins?\s+(install|i)\s+([^@\s]+)$/;function Hd(e){return Vd.test(e.trim())}function AS(e){return Vd.exec(e.trim())?.[2]??""}async function Jd(e){let t=AS(e);tl(t);let r=Date.now();jn.debug(`[${t}] Executing: flow plugin install ${t}`);try{let n=await execa("flow",["plugin","install",t],{reject:!1});return {name:t,command:`flow plugin install ${t}`,exitCode:n.exitCode??1,stdout:n.stdout,stderr:n.stderr,duration_ms:Date.now()-r}}catch(n){throw bl(n)?new wl:n}}function RS(e){Gd(e);let t=e.slice(xl.length);if(!ES.test(t))throw new Fn(e)}var oi=class extends Error{constructor(){super('Claude Code CLI not found. Ensure "claude" is installed and available on your PATH.'),this.name="ClaudeCliNotFoundError";}},wl=class extends Error{constructor(){super('Flow CLI not found. Ensure "flow" is installed and available on your PATH.'),this.name="FlowCliNotFoundError";}};function Gd(e){if(!e||!/^claude /.test(e))throw new yl(e)}function $S(e){for(let t=0;t<e.length;t++){let r=e[t];if(r==="--")return;if(!r.startsWith("-"))continue;if(!PS.test(r))throw new Fn(`Unexpected flag: ${r}`);let n=TS[r];if(n!==void 0){let o=e[t+1];if(o===void 0||o.startsWith("-"))throw new Fn(`Flag ${r} requires a value`);if(!n.test(o))throw new Fn(`Unsafe value for flag ${r}`);t++;}}}async function Re(e){Gd(e);let t=e.slice(xl.length).split(/\s+/).filter(Boolean);$S(t);let r=LS(t);jn.debug(`[${r}] Executing proxy command: claude ${t.join(" ")}`);let n=Date.now();try{let o=await execa("claude",t,{reject:!1}),s=Date.now()-n;return jn.debug(`[${r}] Proxy command finished with exit code ${o.exitCode} in ${s}ms`),{name:r,command:e,exitCode:o.exitCode??1,stdout:o.stdout,stderr:o.stderr,duration_ms:s}}catch(o){throw bl(o)?new oi:o}}function LS(e){return e.length>=3?e[2]:e.join(" ")}function bl(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}function MS(e){return e.startsWith(Kd)?xl+e.slice(Kd.length):e}function _S(e){return CS.test(e)||kS.test(e)}function DS(e){let t=0;for(;t<e.length&&_S(e[t]);)t++;return e.slice(t)}var OS=/^claude\s+(?:plugins?\s+(?:install|i)\s+|mcp\s+(?:add|remove)\s+)/;function US(e,t){return !t||e.includes("--scope")||!OS.test(e)?e:`${e} --scope ${t}`}async function Mo(e,t){let r=e.split("&&").map(i=>i.trim()).filter(Boolean),o=DS(r).map(i=>MS(i)).map(i=>US(i,t));if(o.length===0)throw new Error("Empty install command");for(let i of o)RS(i);jn.debug(`[installCommand] Executing ${o.length} command(s)`);let s=await Re(o[0]);if(s.exitCode!==0)return s;for(let i=1;i<o.length;i++)if(s=await Re(o[i]),s.exitCode!==0)return s;return s}async function si(e,t,r){let n=Dn(e),o=t?.trim();if(!o&&(o=(await Rr(`Plugin "${n}" could not be installed.
|
|
116
|
+
If a marketplace is needed, enter the source (owner/repo or URL), or press Enter to skip: `))?.trim(),!o))throw new Error("No marketplace source provided. Cannot retry install.");o=ti(o),r?.(),jn.debug(`[${n}] Adding marketplace via: claude plugin marketplace add ${o}`);try{let s=await execa("claude",["plugin","marketplace","add",o],{reject:!1});if(s.exitCode!==0)throw new Error(`Failed to add marketplace: ${s.stderr||"unknown error"}`);jn.debug(`[${n}] Marketplace added successfully`);}catch(s){throw bl(s)?new oi:s}}Cr();j();Je();R();var KS=6e4,$r=class extends Error{url;isTimeout;isAuthError;constructor(t,r,n=false,o=false){super(t),this.name="GitCloneError",this.url=r,this.isTimeout=n,this.isAuthError=o;}};async function Nt(e,t){let r=await mkdtemp(join(tmpdir(),"flow-skills-")),n=simpleGit({timeout:{block:KS}}).env("GIT_TERMINAL_PROMPT","0").env("GIT_LFS_SKIP_SMUDGE","1"),o=t?["--depth","1","--branch",t]:["--depth","1"];try{return await n.clone(e,r,o),r}catch(s){await rm(r,{recursive:true,force:true}).catch(()=>{});let i=s instanceof Error?s.message:String(s),a=i.includes("block timeout")||i.includes("timed out"),l=i.includes("Authentication failed")||i.includes("could not read Username")||i.includes("Permission denied")||i.includes("Repository not found");throw a?new $r("Clone timed out after 60s. Check your SSH keys or credentials.",e,true,false):l?new $r(`Authentication failed for ${e}. Ensure you have access and credentials are configured.`,e,false,true):new $r(`Failed to clone ${e}: ${i}`,e,false,false)}}async function Bt(e){let t=normalize(resolve(e)),r=normalize(resolve(tmpdir()));if(!t.startsWith(r+sep))throw new Error("Attempted to clean up directory outside of temp directory");await rm(e,{recursive:true,force:true});}async function sn(e,t=["--version"]){try{return (await execa(e,t,{reject:!1})).exitCode===0}catch(r){if(r instanceof Error&&"code"in r&&r.code==="ENOENT")return false;throw r}}function HS(e){return typeof e=="object"&&e!==null&&e.source==="git-subdir"}function JS(e){return typeof e=="object"&&e!==null&&e.source==="url"}function GS(e){return typeof e=="object"&&e!==null&&e.source==="github"}function Kn(e,t){let r=e.source;if(HS(r)){let n=r.path?r.path.replace(/^\.\//,""):".",o=r.ref&&!/^[0-9a-f]{40}$/i.test(r.ref)?r.ref:void 0;return {cloneUrl:r.url,subPath:n||".",ref:o}}if(JS(r))return {cloneUrl:r.url,subPath:"."};if(GS(r))return {cloneUrl:`https://github.com/${r.repo}`,subPath:"."};if(typeof r=="string"){if(r.startsWith("https://")||r.startsWith("git@"))return {cloneUrl:r,subPath:"."};if((r.startsWith("./")||r===".")&&t){let n=r==="."?".":r.replace(/^\.\//,"")||".";return {cloneUrl:t,subPath:n}}}return null}function at(e){return e.toLowerCase().replace(/[^a-z0-9._]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").substring(0,255)||"unnamed"}var Ft=x("claude-code.adapter");function XS(e,t){let r=e??"external";if(!t)return r;let n=t.match(/github\.com\/([^/]+\/[^/]+?)(?:\.git)?(?:[/?#]|$)/);if(!n)return r;let o=n[1],s=Fr();if(!ve__default.existsSync(s))return r;try{let i=JSON.parse(ve__default.readFileSync(s,"utf-8"));for(let[a,l]of Object.entries(i))if(l.source?.repo===o)return a}catch{}return r}async function Qd(e,t){let r=e.catalogId?pe.getAdapter(e.catalogId):void 0,n=Kn(e,r?.source);if(!n)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let o=e.type==="bundle"||e.type==null,s=XS(e.catalogId,r?.source),i=t.scope??"user",a;o?a=sa(s,e.name,"external"):a=join(jr(i==="user"?"global":"project"),e.name);let l=null;try{bt(e.name),l=await Nt(n.cloneUrl,n.ref);let u=n.subPath==="."?l:join(l,n.subPath);if(ve__default.existsSync(a)&&ve__default.rmSync(a,{recursive:!0,force:!0}),ve__default.mkdirSync(dirname(a),{recursive:!0}),ve__default.cpSync(u,a,{recursive:!0}),o){let c=`${e.name}@${s}`,d=await ml(),m={scope:i,installPath:a,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:e.type},p=d.plugins[c]??[];d.plugins[c]=[...p.filter(g=>g.scope!==i),m],it(d),Ro(c,!0,i);}return {success:!0,message:`Installed ${e.name} from ${n.cloneUrl}`}}catch(u){return Ft.debug(`[${e.name}] External catalog install failed: ${String(u)}`),{success:false,message:u instanceof Error?u.message:String(u)}}finally{l&&await Bt(l).catch(()=>{});}}async function Il(e,t,r,n){try{await E(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:r,source:"external",scope:Zs(n),version:"unknown",duration_ms:t,interface:Q().interfaceType});}catch(o){Ft.warn(`Failed to send external install metrics: ${String(o)}`);}}async function Yd(e,t,r){try{await E(I.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:r,source:"external",error_code:t instanceof Error?t.name:"UNKNOWN",error_message:(t instanceof Error?t.message:String(t)).slice(0,500),interface:Q().interfaceType});}catch(n){Ft.warn(`Failed to send external install-failed metrics: ${String(n)}`);}}var qS={async install(e,t){if(e.origin===dn&&!e.installCommand&&!_n(e.name))return Qd(e,t);if(e.origin===dn&&e.installCommand){let r=e.type??"skill",n=await Mo(e.installCommand,t.scope);return n.exitCode===0?(await Il(e.name,n.duration_ms,r,t.scope),{success:true,message:`Installed ${e.name}`}):(await Yd(e.name,new Error(n.stderr||"Install failed"),r),{success:false,message:n.stderr||`Install failed with exit code ${n.exitCode}`})}if(_n(e.name)){let r=e.type??"skill",n=On(e.name,t.scope);Ft.debug(`[${e.name}] Attempting install: ${n}`);let o=await Re(n);if(o.exitCode===0)return await Il(e.name,o.duration_ms,r,t.scope),{success:true};Ft.debug(`[${e.name}] First attempt failed, adding marketplace`),await si(e.name,t.marketplaceSource,()=>{});let s=await Re(n);return s.exitCode===0?(await Il(e.name,s.duration_ms,r,t.scope),{success:true}):(await Yd(e.name,new Error(s.stderr||"Install failed"),r),{success:false,message:s.stderr||`Install failed with exit code ${s.exitCode}`})}try{let r=await Ne(e.name,{...t,type:e.type});return {success:!0,message:`Installed ${e.name}@${r.version}`}}catch(r){return Ft.debug(`[${e.name}] Plugin install failed: ${String(r)}`),{success:false,message:r instanceof Error?r.message:String(r)}}},async uninstall(e,t){await $o(e,t);},getInstallPath(e,t){return ""}};function Zd(e){return {async install(t,r){if(t.origin===dn&&!t.installCommand&&!_n(t.name))return Qd(t,r);if(!t.installCommand)try{let o=await Ne(t.name,{...r,type:e});return {success:!0,message:`Installed ${t.name}@${o.version}`}}catch(o){return Ft.debug(`[${t.name}] ${e} install failed: ${String(o)}`),{success:false,message:o instanceof Error?o.message:String(o)}}Ft.debug(`[${t.name}] Executing install command: ${t.installCommand}`);let n=await Mo(t.installCommand,r.scope);return n.exitCode===0?{success:true}:{success:false,message:n.stderr||`Install failed with exit code ${n.exitCode}`}},async uninstall(t,r){let n=Ue(),o=`${t}@${le}`;if(n.plugins[o]){await $o(t,r);return}throw new Error(`${e.toUpperCase()} uninstall via claude CLI not supported \u2014 use: claude ${e} remove ${t}`)},getInstallPath(t,r){return ""}}}function YS(e){for(let t of [join(e,".claude","agents"),join(e,"agents")]){if(!ve__default.existsSync(t))continue;let r=ve__default.readdirSync(t).filter(n=>n.endsWith(".md")&&ve__default.lstatSync(join(t,n)).isFile());if(r.length>0)return r.map(n=>join(t,n))}return []}function vl(e){return e===null||typeof e!="object"||Array.isArray(e)?e:Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,vl(r)]))}function ep(e,t){let r={...e};for(let[n,o]of Object.entries(t)){let s=r[n];if(Array.isArray(o)&&Array.isArray(s)){let i=new Set(s.map(a=>JSON.stringify(vl(a))));r[n]=[...s,...o.filter(a=>!i.has(JSON.stringify(vl(a))))];}else o!==null&&typeof o=="object"&&!Array.isArray(o)&&s!==null&&typeof s=="object"&&!Array.isArray(s)?r[n]=ep(s,o):r[n]=o;}return r}async function tp(e,t,r,n){let o=await ml(),s=`${e}@claude-code`,i={scope:t,installPath:r,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:n},a=o.plugins[s]??[];o.plugins[s]=[...a.filter(l=>l.scope!==t),i],it(o);}var ZS={async install(e,t){let r=t.scope??"user",n=e.catalogId?pe.getAdapter(e.catalogId):void 0,o=Kn(e,n?.source);if(!o)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let s=null;try{bt(e.name),s=await Nt(o.cloneUrl,o.ref);let i=o.subPath==="."?s:join(s,o.subPath),a=YS(i);if(a.length===0)return {success:!1,message:`No agent files found in "${e.name}"`};let l=ls(r);ve__default.mkdirSync(l,{recursive:!0});let u=at(e.name);if(a.length===1)ve__default.copyFileSync(a[0],join(l,`${u}.md`));else for(let d of a){let m=at(basename(d,".md"));ve__default.copyFileSync(d,join(l,`${u}--${m}.md`));}let c=a.length===1?join(l,`${u}.md`):l;return await tp(e.name,r,c,"agent"),{success:!0,message:`Installed agent(s) from ${e.name}`}}catch(i){return Ft.debug(`[${e.name}] Agent install failed: ${String(i)}`),{success:false,message:i instanceof Error?i.message:String(i)}}finally{s&&await Bt(s).catch(()=>{});}},async uninstall(e,t){let r=ls(t),n=at(e);if(ve__default.existsSync(r))for(let a of ve__default.readdirSync(r).filter(l=>l===`${n}.md`||l.startsWith(`${n}--`)&&l.endsWith(".md")))ve__default.rmSync(join(r,a),{force:true});let o=`${e}@claude-code`,s=Ue(),i=(s.plugins[o]??[]).filter(a=>a.scope!==t);if(i.length===0){let{[o]:a,...l}=s.plugins;it({...s,plugins:l});}else it({...s,plugins:{...s.plugins,[o]:i}});},getInstallPath(e,t){return join(ls(t),`${at(e)}.md`)}},QS={async install(e,t){let r=t.scope??"user",n=e.catalogId?pe.getAdapter(e.catalogId):void 0,o=Kn(e,n?.source);if(!o)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let s=null;try{bt(e.name),s=await Nt(o.cloneUrl,o.ref);let i=o.subPath==="."?s:join(s,o.subPath),a=join(i,"settings.json");if(!ve__default.existsSync(a))return {success:!1,message:`No settings.json found in "${e.name}"`};let l;try{l=JSON.parse(ve__default.readFileSync(a,"utf-8"));}catch{return {success:!1,message:`settings.json in "${e.name}" contains invalid JSON`}}let u=l.hooks;if(!u||typeof u!="object"||Array.isArray(u))return {success:!1,message:`No hooks found in "${e.name}" settings.json`};let c=xo();if(c.status==="malformed")return {success:!1,message:"settings.json at destination contains invalid JSON \u2014 refusing to overwrite"};let d=c.status==="ok"?c.settings:{},m=d.hooks!==null&&typeof d.hooks=="object"&&!Array.isArray(d.hooks)?d.hooks:{},p=ep(m,u);return Rs({...d,hooks:p}),await tp(e.name,r,"hooks","hook"),{success:!0,message:`Installed hooks from ${e.name}`}}catch(i){return Ft.debug(`[${e.name}] Hook install failed: ${String(i)}`),{success:false,message:i instanceof Error?i.message:String(i)}}finally{s&&await Bt(s).catch(()=>{});}},async uninstall(e,t){throw new Error("Hook uninstall not supported \u2014 remove entries manually from settings.json")},getInstallPath(e,t){return ""}},ii=class{id="claude-code";name="Claude Code";async isAvailable(){return sn("claude",["--version"])}getSupportedScopes(){return ["user","project","local"]}installers={bundle:qS,skill:Zd("skill"),mcp:Zd("mcp"),agent:ZS,hook:QS}};function ai(e,t){return {async install(r,n){if(!r.installCommand)return {success:false,message:"No install command provided"};let[o,...s]=r.installCommand.split(/\s+/).filter(Boolean);if(!o||!e.has(o))return {success:false,message:`Disallowed command: "${o??""}"`};let i=await execa(o,s,{reject:false});return i.exitCode===0?{success:true}:{success:false,message:i.stderr||`Install failed with exit code ${i.exitCode}`}},async uninstall(r,n){throw new Error(`MCP uninstall not supported \u2014 ${t.replace("<name>",r)}`)},getInstallPath(r,n){return ""}}}var tx=new Set(["gh"]),rx=ai(tx,"use: gh copilot mcp remove <name>"),li=class{id="copilot";name="GitHub Copilot";async isAvailable(){return await sn("gh",["--version"])?sn("gh",["copilot","--version"]):false}getSupportedScopes(){return ["user"]}installers={mcp:rx}};Je();var nx=new Set(["opencode"]),ox=ai(nx,"use: opencode config remove mcp <name>");function sx(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 rp(){return {async install(e,t){try{bt(e.name);}catch{return {success:false,message:"Invalid plugin name."}}let r=e.catalogId?pe.getAdapter(e.catalogId):void 0,n=Kn(e,r?.source);if(!n)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let o=null;try{o=await Nt(n.cloneUrl,n.ref);let s=n.subPath==="."?o:join(o,n.subPath),i=as(t.scope??"user"),a=join(s,".opencode","plugins");if(ve__default.existsSync(a)){let l=ve__default.readdirSync(a).filter(u=>u.endsWith(".js")||u.endsWith(".mjs"));if(l.length===0)return {success:!1,message:"No JS plugin file found in .opencode/plugins/"};ve__default.mkdirSync(i,{recursive:!0}),ve__default.copyFileSync(join(a,l[0]),join(i,`${e.name}.js`));}else {let l=join(i,`${e.name}-content`);ve__default.existsSync(l)&&ve__default.rmSync(l,{recursive:!0,force:!0}),ve__default.mkdirSync(l,{recursive:!0}),ve__default.cpSync(s,l,{recursive:!0}),ve__default.mkdirSync(i,{recursive:!0}),ve__default.writeFileSync(join(i,`${e.name}.js`),sx(e.name),"utf-8");}return {success:!0,message:`Installed ${e.name} for OpenCode`}}catch(s){return {success:false,message:s instanceof Error?s.message:String(s)}}finally{o&&await Bt(o).catch(()=>{});}},async uninstall(e,t){bt(e);let r=as(t),n=join(r,`${e}.js`),o=join(r,`${e}-content`);ve__default.existsSync(n)&&ve__default.rmSync(n,{force:true}),ve__default.existsSync(o)&&ve__default.rmSync(o,{recursive:true,force:true});},getInstallPath(e,t){return join(as(t),`${e}.js`)}}}var ci=class{id="opencode";name="OpenCode";async isAvailable(){return sn("opencode",["--version"])}getSupportedScopes(){return ["user","project"]}installers={mcp:ox,skill:rp(),bundle:rp()}};var jt=new Ys;jt.register(new ii);br()&&(jt.register(new li),jt.register(new ci));function np({itemName:e,itemType:t,onInstall:r,onClose:n}){let[o,s]=useState(false),[i,a]=useState(false),[l,u]=useState([]),[c,d]=useState(void 0);useEffect(()=>{jt.getAvailableProviders(t??"bundle").then(u).catch(()=>{});},[t]);let m=useCallback(h=>{h==="Install"?l.length>1?a(true):s(true):n();},[n,l.length]),p=useCallback(h=>{if(h==="Cancel"){a(false);return}let w=l.find(v=>v.name===h);w?(d(w.id),a(false),s(true)):a(false);},[l]),g=useCallback(h=>{let w=pd(h);w?r(w,c):s(false);},[r,c]),f=useCallback(()=>{s(false);},[]);if(i){let h=[...l.map(w=>w.name),"Cancel"];return jsx(ot,{itemName:`${e} \u2014 Choose provider`,actions:h,onAction:p,onClose:()=>a(false)},"provider")}return o?jsx(ot,{itemName:`${e} \u2014 Choose scope`,actions:ud,descriptions:dd,onAction:g,onClose:f},"scope"):jsx(ot,{itemName:e,actions:["Install","Cancel"],onAction:m,onClose:n},"main")}F();function sp({itemName:e,bundle:t,onInstall:r,onConfirm:n,onClose:o}){let s=S(g=>g.focus),[i,a]=useState(0),u=(t?.artifact.artifacts??[]).filter(g=>g.available),c=t!==void 0&&u.length===0,d=useMemo(()=>c?["Cancel"]:["Confirm Install","Cancel"],[c]);useEffect(()=>{a(0);},[t]);let m=useCallback((g,f)=>{f.upArrow?a(h=>Math.max(0,h-1)):f.downArrow?a(h=>Math.min(d.length-1,h+1)):f.return?d[i]==="Confirm Install"?n():o():f.escape&&o();},[d,i,n,o]);useInput(m,{isActive:s==="actionMenu"&&t!==void 0});let p=useCallback(g=>{g==="Install Bundle"?r():o();},[r,o]);return t?jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,flexShrink:0,children:[jsx(Text,{bold:true,children:t.title}),jsx(Box,{marginTop:1,children:jsxs(Text,{children:[u.length," artifact",u.length!==1?"s":""," available"]})}),jsx(Box,{flexDirection:"column",marginTop:1,marginBottom:1,children:u.map(g=>{let f=y(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:d.map((g,f)=>jsx(Box,{children:jsxs(Text,{bold:f===i,color:f===i?"cyan":void 0,children:[f===i?"\u203A ":" ",g]})},g))})]}):jsx(ot,{itemName:e,actions:["Install Bundle","Cancel"],onAction:p,onClose:o})}function pi({activeFocus:e,onConfirm:t}){let[r,n]=useState("idle"),o=S(s=>s.focus);return useInput((s,i)=>{i.escape||s==="n"?n("idle"):s==="y"&&t();},{isActive:r==="confirming"&&o===e}),{isConfirming:r==="confirming",requestConfirm:()=>n("confirming"),cancelConfirm:()=>n("idle")}}F();function lp({itemName:e,itemScope:t,itemStatus:r,updateAvailable:n,catalogVersion:o,onUninstall:s,onToggleStatus:i,onUpdate:a,onClose:l}){let{isConfirming:u,requestConfirm:c}=pi({activeFocus:"actionMenu",onConfirm:()=>s(t)});if(u)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 d=r==="enabled"?"Disable":"Enable",m=o&&y(o),p=m?`Update to v${m}`:"Update";return jsx(ot,{itemName:e,actions:n?["Uninstall",d,p,"Cancel"]:["Uninstall",d,"Cancel"],onAction:h=>{h==="Uninstall"?c():h===d?i(t):h.startsWith("Update")?a?.():l();},onClose:l})}function dp({itemName:e,itemScope:t,onUninstall:r,onClose:n}){let{isConfirming:o,requestConfirm:s}=pi({activeFocus:"actionMenu",onConfirm:()=>r(t)});return o?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(ot,{itemName:e,actions:["Uninstall","Cancel"],onAction:l=>{l==="Uninstall"?s():n();},onClose:n})}R();var Jn=x("bundle:installer"),pp=/already exists/i;async function mx(e){if(!e.installCommand)throw new Error("Missing install command");let t=e.installCommand;if(Hd(t)){let r=await Jd(t);if(r.exitCode!==0){let n=r.stderr?.trim()||r.stdout?.trim()||`exit code ${r.exitCode}`;if(pp.test(n))return;throw new Error(n)}}else {let r=await Mo(t);if(r.exitCode!==0){let n=r.stderr?.trim()||r.stdout?.trim()||`exit code ${r.exitCode}`;if(pp.test(n))return;throw new Error(n)}}}async function fx(e,t){try{await E(I.CLI_BUNDLE_INSTALL_STARTED,{bundle_slug:e,artifact_count:t});}catch(r){Jn.warn(`Failed to emit bundle install started event: ${String(r)}`);}}async function gx(e,t,r){try{await E(I.CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS,{bundle_slug:e,artifact_name:t,artifact_type:r});}catch(n){Jn.warn(`Failed to emit bundle install plugin success event: ${String(n)}`);}}async function mp(e,t,r,n){try{await E(I.CLI_BUNDLE_INSTALL_PLUGIN_FAILED,{bundle_slug:e,artifact_name:t,artifact_type:r,error_message:n});}catch(o){Jn.warn(`Failed to emit bundle install plugin failed event: ${String(o)}`);}}async function hx(e,t,r,n,o){try{await E(I.CLI_BUNDLE_INSTALL_COMPLETED,{bundle_slug:e,installed_count:t,failed_count:r,unavailable_count:n,duration_ms:o});}catch(s){Jn.warn(`Failed to emit bundle install completed event: ${String(s)}`);}}async function gi(e,t={}){let{onProgress:r}=t,n=e.artifact.artifacts,o=n.filter(p=>p.available),s=n.length-o.length,i=e.artifact.name,a=Date.now();await fx(i,o.length);let l=[],u=0,c=o.length;for(let[p,g]of o.entries()){let f=g.name??g.flowId,h=g.type??"unknown";if(!g.type){Jn.warn(`Artifact "${f}" has no type \u2014 treated as failed`),l.push({name:f,type:h,reason:"unknown artifact type"}),await mp(i,f,h,"unknown artifact type"),r?.({index:p+1,total:c,artifact:g,success:false,error:"unknown artifact type"});continue}try{await mx(g),u++,await gx(i,f,h),r?.({index:p+1,total:c,artifact:g,success:!0});}catch(w){let v=w instanceof Error?w.message:String(w);Jn.error(`Failed to install artifact "${f}": ${v}`),l.push({name:f,type:h,reason:v}),await mp(i,f,h,v),r?.({index:p+1,total:c,artifact:g,success:false,error:v});}}let d=Date.now()-a,m=l.length;return await hx(i,u,m,s,d),{bundleTitle:e.title,total:n.length,installed:u,skipped:s,failed:m,failures:l}}F();function yp({bundle:e,onComplete:t}){let[r,n]=useState(null),[o,s]=useState(null),i=useRef(false);return useEffect(()=>{i.current||(i.current=true,gi(e,{onProgress:n}).then(s).catch(a=>{let l=a instanceof Error?a.message:"Installation failed",u=e.artifact.artifacts,c=u.filter(d=>d.available);s({bundleTitle:e.title,total:u.length,installed:0,skipped:u.length-c.length,failed:c.length,failures:c.map(d=>({name:d.name??d.flowId,type:d.type??"unknown",reason:l}))});}));},[e]),useEffect(()=>{o&&t(o);},[o,t]),jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsx(Box,{paddingBottom:1,children:jsxs(Text,{bold:true,children:["Installing ",e.title,"..."]})}),r&&jsxs(Box,{gap:1,children:[jsx(Text,{color:"cyan",children:jsx(hp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:["[",r.index,"/",r.total,"] Installing"," ",y(r.artifact.name??r.artifact.flowId)," (",r.artifact.type??"unknown",")"]})]}),!r&&jsxs(Box,{gap:1,children:[jsx(Text,{color:"cyan",children:jsx(hp,{type:"dots"})}),jsx(Text,{color:"cyan",children:"Preparing..."})]})]})}var ge=create(e=>({installedItems:[],setInstalledItems:t=>e({installedItems:t}),loadFromDisk:()=>e({installedItems:ie()})}));F();function wp({entries:e,selectedIndex:t,focusPanel:r}){let n=r==="list",o=t===0&&n;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{marginBottom:1,children:[jsx(Text,{color:"cyan",bold:true,children:o?"\u203A ":" "}),jsx(Text,{color:"cyan",bold:o,dimColor:!n,children:"+ Add Marketplace"})]}),e.map((s,i)=>{let a=i+1,l=t===a&&n,u=s.stored?.autoUpdate!==false;return jsxs(Box,{flexDirection:"column",marginBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:l?"\u203A ":" "}),jsx(Text,{bold:l,dimColor:!n,children:s.adapter.name}),u&&s.stored&&jsx(Text,{color:"yellow",children:" \u2605"})]}),s.stored?.lastUpdated&&jsx(Box,{marginLeft:2,children:jsxs(Text,{dimColor:true,children:["Updated ",At(s.stored.lastUpdated)]})})]},s.adapter.id)})]})}F();function Sp({entry:e,detailData:t,installedCount:r,focusPanel:n,actionIndex:o,onBrowse:s,onUpdate:i,onToggleAutoUpdate:a,onRemove:l}){let{adapter:u,stored:c}=e,d=u.removable!==false,m=c?.autoUpdate!==false,p=n==="detail",g=[{label:`Browse plugins${t&&!t.loading?` (${t.items.length})`:""}`,handler:s},{label:"Update marketplace",handler:i},...d?[{label:"Toggle auto-update",handler:a},{label:"Remove marketplace",handler:l,danger:true}]:[]];return p?jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:u.name}),jsx(Text,{dimColor:true,children:u.source}),jsx(Box,{marginTop:1,children:t?.loading?jsx(Text,{dimColor:true,children:"Loading..."}):t?.error?jsx(Text,{color:"red",children:t.error}):jsxs(Text,{dimColor:true,children:[t?`${t.items.length} available`:"\u2014 available",r>0?` \xB7 ${r} installed`:"",c?.lastUpdated?` \xB7 Updated ${At(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 w=h===o;return jsxs(Box,{children:[jsx(Text,{color:w?"cyan":void 0,children:w?"\u203A ":" "}),jsx(Text,{bold:w,color:f.danger?"yellow":void 0,dimColor:!w,children:f.label})]},f.label)})})]}):jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:u.name}),jsx(Text,{dimColor:true,children:u.source}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter or Tab to see details"})})]})}function xp(e){return e.adapter.removable!==false?4:2}j();F();function bp({item:e,adapterName:t,isInstalled:r,onBack:n,onInstall:o,onUninstall:s}){let i=[...r&&s?[{label:"Uninstall",handler:()=>s(e),danger:true}]:!r&&o?[{label:"Install",handler:()=>o(e)}]:[],{label:"Back",handler:n}],[a,l]=useState(0);return useInput((u,c)=>{if(c.escape){n();return}if(c.upArrow){l(d=>Math.max(0,d-1));return}if(c.downArrow){l(d=>Math.min(i.length-1,d+1));return}c.return&&i[a].handler();}),jsxs(Box,{flexDirection:"column",paddingX:1,children:[jsxs(Text,{dimColor:true,children:["Marketplaces \u203A ",t," \u203A Browse plugins \u203A ",y(e.name)]}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{bold:true,children:y(e.name)}),e.type&&jsxs(Text,{dimColor:true,children:[" [",y(e.type),"]"]}),e.origin&&jsxs(Text,{dimColor:true,children:[" [",y(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:y(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 ",y(e.author.name)]}),e.version&&jsxs(Text,{dimColor:true,children:["Version ",y(e.version)]}),e.category&&jsxs(Text,{dimColor:true,children:["Category ",y(e.category)]})]})]}),jsx(Box,{flexDirection:"column",marginTop:1,children:i.map((u,c)=>jsxs(Box,{children:[jsx(Text,{color:c===a?"cyan":void 0,children:c===a?"\u203A ":" "}),jsx(Text,{bold:c===a,color:u.danger?"yellow":void 0,dimColor:c!==a,children:u.label})]},u.label))}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: confirm \xB7 Esc: back"})})]})}function vp({item:e,isSelected:t,isInstalled:r}){return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:t?"\u203A ":" "}),jsx(Text,{color:r?"green":void 0,bold:t,children:e.name}),r&&jsx(Text,{color:"green",children:" \u2713"})]}),e.description?jsx(Box,{paddingLeft:4,children:jsx(Text,{dimColor:true,wrap:"truncate",children:e.description})}):null]})}function Ep({entry:e,items:t,installedKeys:r,onBack:n}){let o=e.adapter.id??"default",s=t.filter(C=>r.has(`${C.name}@${o}`)),i=t.filter(C=>!r.has(`${C.name}@${o}`)),a=[...s,...i],[l,u]=useState(0),[c,d]=useState(null);if(useInput((C,$)=>{if($.escape){n();return}if($.return){d(a[l]??null);return}if($.upArrow){u(_=>Math.max(0,_-1));return}$.downArrow&&u(_=>Math.min(a.length-1,_+1));},{isActive:c===null}),c!==null)return jsx(bp,{item:c,adapterName:e.adapter.name,isInstalled:r.has(`${c.name}@${o}`),onBack:()=>d(null)});if(t.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,l-Math.floor(et/2)),p=Math.min(a.length,m+et);p===a.length&&(m=Math.max(0,p-et));let g=a.slice(m,p),f=m,h=a.length-p,w=s.length>0&&m<s.length,v=p>s.length,D=g.filter(C=>r.has(`${C.name}@${o}`)),M=g.filter(C=>!r.has(`${C.name}@${o}`));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`:" "})}),w&&jsxs(Box,{flexDirection:"column",children:[jsxs(Text,{dimColor:true,children:["\u2500\u2500 Installed (",s.length,") \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]}),D.map(C=>jsx(vp,{item:C,isSelected:a.indexOf(C)===l,isInstalled:true},C.name))]}),v&&jsxs(Box,{flexDirection:"column",marginTop:w?1:0,children:[jsxs(Text,{dimColor:true,children:["\u2500\u2500 Available (",i.length,") \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]}),M.map(C=>jsx(vp,{item:C,isSelected:a.indexOf(C)===l,isInstalled:false},C.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"})})]})}nl();var vx=/^https?:\/\/.+/;function Ex(e){return e!==null&&typeof e=="object"&&"response"in e&&e.response?.status===404}function Px(e){return e instanceof Error&&e.code==="GITHUB_AUTH_REQUIRED"}function kp(e){let t=S(h=>h.showNotification),r=S(h=>h.incrementCatalogVersion),[n,o]=useState("idle"),[s,i]=useState(""),[a,l]=useState(""),[u,c]=useState(null),d=useRef(""),m=useRef("");useEffect(()=>{d.current=s;},[s]),useEffect(()=>{m.current=a;},[a]);let p=useCallback(()=>{d.current="",m.current="",i(""),l(""),c(null),o("add-name");},[]),g=useCallback(()=>{o("idle");},[]),f=useCallback(async()=>{let h=m.current,w=d.current;if(!vx.test(h)){c("URL must start with http:// or https://");return}c(null),o("adding");let v=randomUUID(),D=new Nn(v,w,h);try{await D.fetchItems(),await Qt.add({id:v,name:w,source:h}),pe.register(new Nn(v,w,h)),r(),e(),t(`Catalog "${w}" added`,"success"),i(""),l(""),d.current="",m.current="",o("idle");}catch(M){let C=Ex(M)?"No marketplace.json found in this repository (checked main and master branches). Ensure the repo has a marketplace.json at its root.":Px(M)?M.message:M instanceof Error?`Could not reach catalog URL: ${M.message}`:"Failed to validate catalog URL";t(C,"error"),o("add-url");}},[e,t,r]);return useInput((h,w)=>{if(w.escape){o("idle");return}if(w.return){d.current.trim().length>0&&o("add-url");return}if(w.backspace||w.delete){d.current=d.current.slice(0,-1),i(d.current);return}h&&!w.ctrl&&!w.meta&&(d.current=d.current+h,i(d.current));},{isActive:n==="add-name"}),useInput((h,w)=>{if(w.escape){o("add-name");return}if(w.return){f();return}if(w.backspace||w.delete){m.current=m.current.slice(0,-1),l(m.current),c(null);return}h&&!w.ctrl&&!w.meta&&(m.current=m.current+h,l(m.current),c(null));},{isActive:n==="add-url"}),{phase:n,inputName:s,inputUrl:a,urlError:u,setInputName:i,setInputUrl:l,startAdd:p,cancelAdd:g}}function Ap(e){let t=S(o=>o.showNotification),r=S(o=>o.incrementCatalogVersion);return {handleRemove:useCallback(async o=>{try{await Qt.remove(o),pe.unregister(o),r(),e(),t("Catalog removed","success");}catch(s){t(s instanceof Error?s.message:"Failed to remove catalog","error");}},[e,t,r])}}function $p(){let e=S(A=>A.focus),t=S(A=>A.setFocus),r=S(A=>A.showNotification),n=ge(A=>A.installedItems),[o,s]=useState(()=>pe.listAdapters().map(A=>({adapter:A,stored:null}))),[i,a]=useState(0),[l,u]=useState("list"),[c,d]=useState(0),[m,p]=useState(null),[g,f]=useState("main"),h=useRef(o);useEffect(()=>{h.current=o;},[o]),useEffect(()=>{g==="browse"&&!o[i-1]&&f("main");},[g,o,i]);let w=useCallback(()=>{(async()=>{let A=pe.listAdapters(),B=await Qt.read(),G=new Map(B.map(Le=>[Le.id,Le]));s(A.map(Le=>({adapter:Le,stored:G.get(Le.id)??null})));})();},[]);useEffect(()=>{t("marketplaces"),w();},[t,w]),useEffect(()=>{if(i===0){p(null);return}let A=h.current[i-1];if(!A)return;let B=false;return p({items:[],loading:true,error:null}),A.adapter.fetchItems().then(G=>{B||p({items:G,loading:false,error:null});}).catch(G=>{B||p({items:[],loading:false,error:G instanceof Error?G.message:"Failed to load catalog"});}),()=>{B=true;}},[i]);let v=kp(w),D=useCallback(()=>{w(),a(0),u("list"),p(null),f("main");},[w]),{handleRemove:M}=Ap(D),C=useCallback(async A=>{f("removing"),await M(A);},[M]),$=useCallback(async A=>{try{let B=await A.adapter.fetchItems();if(p({items:B,loading:!1,error:null}),A.stored){let G=new Date().toISOString();await Qt.updateField(A.stored.id,{lastUpdated:G}),w();}r("Marketplace updated","success");}catch(B){r(B instanceof Error?B.message:"Update failed","error");}},[w,r]),_=useCallback(async A=>{if(!A.stored)return;let B=A.stored.autoUpdate!==false;await Qt.updateField(A.stored.id,{autoUpdate:!B}),w();},[w]),O=useCallback(()=>f("browse"),[]),te=useCallback(A=>{let B=o[i-1];if(!B)return;let G=B.adapter.removable!==false;[O,()=>{$(B);},...G?[()=>{_(B);},()=>{C(B.adapter.id);}]:[]][A]?.();},[o,i,O,$,_,C]),k=useCallback(()=>f("main"),[]),H=useCallback(()=>{let A=o[i-1];A&&$(A);},[o,i,$]),ee=useCallback(()=>{let A=o[i-1];A&&_(A);},[o,i,_]),K=useCallback(()=>{let A=o[i-1];A&&C(A.adapter.id);},[o,i,C]);if(useInput((A,B)=>{if(B.upArrow){a(G=>Math.max(0,G-1));return}if(B.downArrow){a(G=>Math.min(o.length,G+1));return}(B.return||B.tab)&&(i===0?v.startAdd():(u("detail"),d(0)));},{isActive:g==="main"&&v.phase==="idle"&&l==="list"&&e==="marketplaces"}),useInput((A,B)=>{if(B.escape||B.tab){u("list");return}if(B.upArrow){d(G=>Math.max(0,G-1));return}if(B.downArrow){let G=o[i-1],Le=G?xp(G)-1:0;d(ts=>Math.min(ts+1,Le));return}B.return&&te(c);},{isActive:g==="main"&&v.phase==="idle"&&l==="detail"&&e==="marketplaces"}),v.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:v.inputName}),jsx(Text,{color:"gray",children:"\u2588"})]}),v.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(v.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:v.inputName})]}),jsxs(Box,{children:[jsx(Text,{children:"URL: "}),jsx(Text,{color:"cyan",children:v.inputUrl}),jsx(Text,{color:"gray",children:"\u2588"})]}),v.urlError&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"red",children:v.urlError})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter: confirm | Esc: back | Must start with http:// or https://"})})]});if(v.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 A=o[i-1];if(!A)return jsx(Box,{});let B=A.adapter.id??"default",G=new Set(n.filter(Le=>Le.marketplace===A.adapter.name).map(Le=>`${Le.name}@${B}`));return jsx(Ep,{entry:A,items:m?.items??[],installedKeys:G,onBack:k})}if(o.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 V=o[i-1]??null,z=V?n.filter(A=>A.marketplace===V.adapter.name).length:0;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Box,{flexDirection:"column",width:30,marginRight:1,children:jsx(wp,{entries:o,selectedIndex:i,focusPanel:l})}),jsx(Box,{flexDirection:"column",flexGrow:1,children:l==="detail"&&V?jsx(Sp,{entry:V,detailData:m,installedCount:z,focusPanel:l,actionIndex:c,onBrowse:O,onUpdate:H,onToggleAutoUpdate:ee,onRemove:K}):jsx(Box,{paddingLeft:1,children:jsx(Text,{dimColor:true,children:V?"Enter or Tab to see details":"\u2191\u2193 to navigate, Enter or Tab to see details"})})})]}),jsx(Box,{marginTop:1,paddingX:1,children:l==="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 Lp(e,t,r,n){if(t.upArrow)return r.selectedIndex===0?[{type:"setSelectedIndex",index:-1},{type:"setFocus",focus:"search"}]:[{type:"setSelectedIndex",index:r.selectedIndex-1}];if(t.downArrow&&r.selectedIndex<n-1)return [{type:"setSelectedIndex",index:r.selectedIndex+1}];if(t.leftArrow){let o=ne.findIndex(i=>i.id===r.activeTab),s=ne[(o-1+ne.length)%ne.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}if(t.rightArrow){let o=ne.findIndex(i=>i.id===r.activeTab),s=ne[(o+1)%ne.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}if(t.tab){let o=ne.findIndex(i=>i.id===r.activeTab),s=ne[(o+1)%ne.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}return t.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"&&r.activeTab==="updates"?[]:e&&e!==" "&&!t.ctrl&&!t.meta&&!t.escape?[{type:"setSelectedIndex",index:-1},{type:"setFocus",focus:"search"},{type:"searchAppend",char:e}]:[]}function Mp(e,t){return t.escape?[{type:"setActionMenuOpen",open:false},{type:"setFocus",focus:"list"}]:[]}function _p(e,t,r){return t.escape?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:"reset"}:t.downArrow?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:null}:t.leftArrow?{actions:[],queryUpdate:{cursorMove:-1}}:t.rightArrow?{actions:[],queryUpdate:{cursorMove:1}}:t.return?{actions:[{type:"setSelectedIndex",index:0},{type:"setFocus",focus:"list"}],queryUpdate:null}:t.backspace?r.length===0?{actions:[{type:"setFocus",focus:"list"},{type:"setSelectedIndex",index:0}],queryUpdate:null}:{actions:[],queryUpdate:{backspace:true}}:e&&!t.ctrl&&!t.meta?{actions:[],queryUpdate:{append:e}}:{actions:[],queryUpdate:null}}var Rx=new Set(ne.filter(e=>e.focus!=="list").map(e=>e.focus));function Vo(e){let{setActiveTab:t,setFocus:r,setSelectedIndex:n,setActionMenuOpen:o}=S.getState();for(let s of e)if(s.type==="setTab")t(s.tab);else if(s.type==="setFocus")r(s.focus);else if(s.type==="setSelectedIndex")n(s.index);else if(s.type==="setActionMenuOpen")o(s.open);else if(s.type==="searchAppend"){let{setQuery:i,query:a,setCursorPosition:l,cursorPosition:u}=ze.getState();i(a.slice(0,u)+s.char+a.slice(u)),l(u+s.char.length);}else s.type==="toggleTypeFilter"?S.getState().toggleTypeFilter(s.catalogType):s.type==="selectAllTypes"?S.getState().selectAllTypes():s.type==="toggleOriginFilter"?S.getState().toggleOriginFilter(s.origin):s.type==="selectAllOrigins"&&S.getState().selectAllOrigins();}function Dp({listLength:e}){let t=S(f=>f.focus),r=S(f=>f.selectedIndex),n=S(f=>f.actionMenuOpen),o=S(f=>f.setFocus),s=S(f=>f.setActionMenuOpen),i=ze(f=>f.query),a=ze(f=>f.setQuery),l=ze(f=>f.resetQuery),u=useRef(e);useEffect(()=>{u.current=e;},[e]),useEffect(()=>{if(t==="search"){let{query:f,setCursorPosition:h}=ze.getState();h(f.length);}},[t]);let[c,d]=useState("");useEffect(()=>{let f=setTimeout(()=>d(i),300);return ()=>clearTimeout(f)},[i]),useInput((f,h)=>{let{activeTab:w,selectedIndex:v,actionMenuOpen:D}=S.getState();Vo(ja(f,h,{activeTab:w}));},{isActive:t==="tabs"}),useInput((f,h)=>{if(!h.leftArrow&&!h.rightArrow)return;let{activeTab:w,selectedIndex:v,actionMenuOpen:D}=S.getState();Vo(ja("",h,{activeTab:w}));},{isActive:Rx.has(t)}),useInput((f,h)=>{let{activeTab:w,selectedIndex:v,actionMenuOpen:D}=S.getState();Vo(Lp(f,h,{activeTab:w,selectedIndex:v},u.current));},{isActive:t==="list"}),useInput((f,h)=>{Vo(Mp(f,h));},{isActive:t==="actionMenu"}),useInput((f,h)=>{let w=_p(f,h,ze.getState().query),v=w.queryUpdate;if(Vo(w.actions),v==="reset")l(),d("");else if(v!==null){let{query:D,cursorPosition:M,setCursorPosition:C}=ze.getState();if("backspace"in v)M>0&&(a(D.slice(0,M-1)+D.slice(M)),C(M-1));else if("append"in v)a(D.slice(0,M)+v.append+D.slice(M)),C(M+v.append.length);else if("cursorMove"in v){let $=M+v.cursorMove;$>=0&&$<=D.length&&C($);}}},{isActive:t==="search"});let m=useCallback(()=>{s(false),o("list");},[s,o]),p=useCallback(f=>{let{setSelectedIndex:h,selectedIndex:w}=S.getState();f===0?h(0):w>=f&&h(f-1);},[]),g=useCallback(f=>{if(!c)return u.current=f.length,f;let h=c.toLowerCase(),w=f.filter(v=>v.name.toLowerCase().includes(h)||v.description?.toLowerCase().includes(h));return u.current=w.length,w},[c]);return {actionMenuOpen:n,closeMenu:m,selectedIndex:r,clampIndex:p,filteredItems:g}}function Up(){let e=S(a=>a.notification),t=S(a=>a.showNotification),r=S(a=>a.clearNotification),n=rt(a=>a.justAuthenticated),o=rt(a=>a.credentials),s=rt(a=>a.setJustAuthenticated);return useEffect(()=>{n&&o&&(t(`Authenticated. Tenant: ${o.tenant}`,"success"),s(false));},[n,o]),useEffect(()=>{if(!e)return;let a=setTimeout(r,3e3);return ()=>clearTimeout(a)},[e]),{notify:(a,l)=>{t(a,l);}}}function je(e,t,r=false){return r?true:!kl.valid(e)||!kl.valid(t)?false:kl.gt(t,e)}j();R();var nr=x("updater");async function $x(e,t,r,n,o,s){try{await E(I.CLI_TOOL_UPDATED,{tool_id:e,tool_type:s,source:o,from_version:t,to_version:r,duration_ms:n,interface:Q().interfaceType});}catch(i){nr.warn(`Failed to send update metrics: ${String(i)}`);}}function Lx(e){let t=Ue(),r=`${e}@${le}`,n=t.plugins[r];return !n||n.length===0?null:{pluginKey:r,entry:n[0]}}async function Si(e,t={}){let r=Date.now(),n=null;try{nr.debug(`[${e}] Acquiring lock...`),n=await kr();let o=Lx(e);if(!o)throw nr.error(`[${e}] Plugin is not installed`),new Error(`Plugin "${e}" is not installed`);let{entry:s}=o,i=s.version,a=s.installPath;nr.debug(`[${e}] Fetching manifest...`);let u=(await Bn(e,t.source)).version;if(!i||!je(i,u,t.force))throw nr.debug(`[${e}] Already up to date (v${i??"n/a"})`),new Tr(e,i??"unknown");nr.info(`[${e}] Updating v${i} \u2192 v${u}...`),await n(),n=null;try{let c=await Ne(e,{force:!0,skipMetrics:!0,source:t.source}),d=Date.now()-r;return await $x(c.name,i,c.version,d,s.origin??"internal",s.type??"skill"),nr.debug(`[${e}] Updated successfully in ${d}ms`),{name:c.name,previousVersion:i,newVersion:c.version,path:c.path,duration_ms:d}}catch(c){nr.warn(`[${e}] Install failed, rolling back to v${i}...`),n=await kr();let d=Ue(),m=`${e}@${le}`;throw d.plugins[m]&&(d.plugins[m][0].version=i,d.plugins[m][0].installPath=a,it(d),nr.info(`[${e}] Rollback completed, restored to v${i}`)),c}}finally{n&&await n();}}Cr();R();var xi=x("dispatcher");async function Mx(e,t,r,n,o){let s=Dn(e);return xi.debug(`[${e}] Install failed (exit code), attempting marketplace add`),o?.onError?.(r),n?o?.onStatus?.(`Adding marketplace for ${s}...`):o?.onPause?.(),await si(e,n,()=>{}),o?.onResume?.(`Retrying install for ${s}...`),xi.debug(`[${e}] Retrying install after marketplace add`),Re(t)}async function Np(e,t,r,n){let o=On(e,n),s=Dn(e);r?.onStatus?.(`Installing ${s}...`),xi.debug(`[${e}] Attempting install: ${o}`);let i=await Re(o);if(i.exitCode===0)return i;xi.debug(`[${e}] Install failed (exit ${i.exitCode}), attempting marketplace add`);let a=i.stderr||`Install failed with exit code ${i.exitCode}`;return Mx(e,o,a,t,r)}async function Bp(e,t,r){let n=e.type??"bundle",o=await jt.getAvailableProviders(n),s=o[0];if(!s)throw new Error(`No available provider for artifact type "${n}"`);let i=s.installers[n];if(!i)throw new Error(`Provider "${s.id}" does not support type "${n}"`);let a=t??{},l=a;return i.install(e,l)}function Fp(){let e=ge(i=>i.installedItems),t=ge(i=>i.loadFromDisk),r=useCallback(async(i,a)=>{let l=await Bp(i,a);if(!l.success)throw new Error(l.message||"Installation failed");t();},[t]),n=useCallback(async(i,a)=>{let l=ie().find(p=>p.name===i),u=l?.providerId??"claude-code",c=jt.getAdapter(u);if(!c)throw new Error(`Provider "${u}" not found`);let d=l?.type??"bundle",m=c.installers[d];if(!m)throw new Error(`Provider "${u}" does not support type "${d}"`);await m.uninstall(i,a??"user"),t();},[t]),o=useCallback(async(i,a)=>{let u=e.find(c=>c.name===i)?.status==="enabled"?"disabled":"enabled";await Lo(i,u,a),t();},[e,t]),s=useCallback(async i=>{await Si(i),t();},[t]);return {install:r,uninstall:n,toggle:o,update:s}}F();R();var Ii=x("mcp");function Ho(e,t){e.silent?_e({status:"error",mcp:t.name,...t.exitCode!==void 0&&{exitCode:t.exitCode},message:t.message}):P(`Failed to ${t.action} MCP "${t.name}": ${t.message}`);}function Kp(e,t){e.silent?Se({status:"success",mcp:t.name,command:t.command,duration_ms:t.durationMs}):(q(`MCP "${t.name}" ${t.actionPastTense} successfully`),e.verbose&&t.stdout&&b(t.stdout));}function _x(e,t,r,n){let o=["claude","mcp","add","--transport",r,e];return t.length>0&&o.push(...t),n&&o.push("--scope",n),o.join(" ")}function Al(e,t){if(e.startsWith("-"))throw new Error(`Invalid MCP server name: "${e}". Names must not start with '-'.`);let r=["claude","mcp","remove",e];return t&&r.push("--scope",t),r.join(" ")}async function Vp(e,t,r){if(!await me())return 1;if(t.length===0){let s=r.transport==="http"?"a URL":"a command";return Ho(r,{name:e,action:"add",message:`${r.transport} transport requires ${s}`}),1}Ii.debug(`[${e}] Starting MCP add with args: ${t.join(" ")}`);let n=_x(e,t,r.transport,r.scope);if(!r.force){let s=y(e),i=y(n);if(!await de(`Install external MCP "${s}"?
|
|
118
118
|
This will run: ${i}
|
|
119
|
-
[y/N] `))return
|
|
119
|
+
[y/N] `))return Ii.debug(`[${e}] Installation cancelled by user`),b("Operation cancelled."),0}let o=r.silent?void 0:rc({text:`Adding MCP "${y(e)}"...`}).start();try{let s=await Re(n);return o?.stop(),s.exitCode!==0?(Ho(r,{name:e,action:"add",message:s.stderr||"Command failed",exitCode:s.exitCode}),!r.silent&&r.verbose&&s.stdout&&b(`stdout: ${s.stdout}`),1):(Kp(r,{name:e,actionPastTense:"added",command:n,durationMs:s.duration_ms,stdout:s.stdout}),0)}catch(s){return o?.stop(),Ho(r,{name:e,action:"add",message:Y(s)}),1}}async function Hp(e,t){if(!await me())return 1;Ii.debug(`[${e}] Starting MCP remove`);let r=Al(e,t.scope);if(!t.force){let o=y(e),s=y(r);if(!await de(`Remove MCP "${o}"?
|
|
120
120
|
This will run: ${s}
|
|
121
|
-
[y/N] `))return Si.debug(`[${e}] Removal cancelled by user`),b("Operation cancelled."),0}let n=t.silent?void 0:Yl({text:`Removing MCP "${h(e)}"...`}).start();try{let o=await Ae(r);return n?.stop(),o.exitCode!==0?(Ko(t,{name:e,action:"remove",message:o.stderr||"Command failed",exitCode:o.exitCode}),!t.silent&&t.verbose&&o.stdout&&b(`stdout: ${o.stdout}`),1):(Ap(t,{name:e,actionPastTense:"removed",command:r,durationMs:o.duration_ms,stdout:o.stdout}),0)}catch(o){return n?.stop(),Ko(t,{name:e,action:"remove",message:q(o)}),1}}$();function Lp({selectedItem:e,selectedCatalogItem:t,items:r,closeMenu:n,clampIndex:o,notify:s}){let i=x("pluginHandlers"),a=useRef(0),l=S(C=>C.setLoading),u=S(C=>C.setDownloadProgress),{install:c,uninstall:d,toggle:m,update:p}=Cp(),f=async(C,R,_)=>{l(true,C),n();try{await R(),o(r.length),s(_,"success");}catch(O){let ee=O instanceof Error?O.message:"Something went wrong";i.error(`[withLoading] ${C} failed: ${ee}`),s(ee,"error");}finally{l(false);}};return {handleInstall:(C,R)=>{e&&t&&(a.current=0,f(`Installing ${e.name}...`,()=>c(t,{scope:C,...R!==void 0?{providerId:R}:{},onDownloadProgress:(_,O)=>{let ee=Date.now();(ee-a.current>100||_>=O)&&(a.current=ee,u(_,O));}}),"\u2713 Installed successfully"));},handleUninstall:C=>{e&&f(`Uninstalling ${e.name}...`,()=>d(e.name,C),"\u2713 Uninstalled");},handleToggleStatus:C=>{if(!e)return;let R=e.status==="enabled";f(R?`Disabling ${e.name}...`:`Enabling ${e.name}...`,()=>m(e.name,C),R?"\u2713 Disabled":"\u2713 Enabled");},handleUpdate:()=>{if(!e)return;let C=t?` to v${t.version}`:"";(async()=>{l(true,`Updating ${e.name}${C}...`),n();try{await p(e.name),o(r.length),s(`\u2713 Updated ${e.name}${C}`,"success");}catch(_){if(_ instanceof Pr)s(_.message,"info");else {let O=_ instanceof Error?_.message:"Something went wrong";i.error(`[handleUpdate] ${e.name} failed: ${O}`),s(O,"error");}}finally{l(false);}})();},handleBatchUpdate:C=>{if(C.length===0)return;let R=C.length;(async()=>{l(true,`Updating ${R} plugin${R>1?"s":""}...`),n();try{let O=[];for(let H of C)O.push(await p(H.name).then(()=>({status:"fulfilled",value:void 0}),Q=>({status:"rejected",reason:Q})));let ee=O.filter(H=>H.status==="fulfilled").length,k=O.map((H,Q)=>H.status==="rejected"?C[Q].name:null).filter(H=>H!==null);o(r.length),k.length===0?s(`\u2713 Updated ${ee}/${R} plugin${R>1?"s":""}`,"success"):(i.error(`[handleBatchUpdate] failed: ${k.join(", ")}`),s(`Updated ${ee}/${R}; failed: ${k.join(", ")}`,ee>0?"info":"error"));}finally{l(false);}})();},handleMcpConfigUninstall:C=>{e&&f(`Removing MCP ${e.name}...`,async()=>{let R=El(e.name,C),_=await Ae(R);if(_.exitCode!==0)throw new Error(_.stderr||"MCP removal failed");fe.getState().loadFromDisk();},"\u2713 MCP removed");}}}Eo();$();var Vo=x("api:bundle"),zn=class extends Error{constructor(t){super(`Bundle '${t}' not found in your tenant. Verify the name with whoever shared the command.`),this.name="BundleNotFoundError";}},Ho=class extends Error{constructor(){super("The server encountered an error while fetching the bundle. Please try again later."),this.name="BundleServerError";}},lx=/^[a-zA-Z0-9_-]{1,128}$/;async function _p(e,t){if(e instanceof HTTPError){let r=e.response.status;throw Vo.error(`HTTP error fetching bundle '${t}' [status=${r}]`),r===StatusCodes.NOT_FOUND?new zn(t):r===StatusCodes.INTERNAL_SERVER_ERROR?new Ho:new Error(`Server error (${r}) \u2014 please try again later.`)}throw Vo.error(`Unexpected error fetching bundle '${t}': ${e instanceof Error?e.message:String(e)}`),e}async function Dp(e){if(!lx.test(e))throw new Error("Invalid bundle identifier format.");let t=encodeURIComponent(e);Vo.debug(`Fetching bundle by flowId "${e}"`);try{return await Yt().get(`v1/use-cases/${t}`).json()}catch(r){return _p(r,e)}}async function xi(e){let t=encodeURIComponent(e);Vo.debug(`Fetching bundle by name "${e}"`);let r;try{r=await Yt().get(`v1/use-cases/by-name/${t}`).json(),Vo.debug(`API returned ${r.length} result(s) for "${e}"`);}catch(n){return _p(n,e)}if(r.length===0)throw new zn(e);return r[0]}$();var cx=x("tui:bundle-flow");function Op({closeMenu:e,notify:t}){let r=S(a=>a.bundleInstallFlow);return {handleBundleInstallStart:(a,l)=>{let{setLoading:u,setBundleInstallFlow:c}=S.getState(),d=l?.trim();cx.debug(`Starting bundle install: itemName="${a}" flowId="${d??"none"}"`),u(true,"Loading bundle..."),(d?Dp(d):xi(a)).then(p=>{u(false),S.getState().actionMenuOpen&&c({phase:"detail",bundle:p});}).catch(p=>{u(false),t(p instanceof Error?p.message:"Failed to load bundle","error");});},handleBundleDetailConfirm:()=>{if(!r||r.phase!=="detail")return;let{setBundleInstallFlow:a,setFocus:l}=S.getState();a({phase:"installing",bundle:r.bundle}),l("bundleInstallProgress");},handleBundleDetailBack:()=>{let{setBundleInstallFlow:a}=S.getState();a(null),e();},handleBundleInstallComplete:a=>{S.getState().setBundleInstallFlow(null),e(),fe.getState().loadFromDisk(),t(`\u2713 Installed ${a.installed} of ${a.total} artifacts`,"success");}}}B();j();var Jo=["local","project","user"],ux=new Set(["--transport","--scope","-s"]);function Up(e){let t=e.split(/\s+/).filter(Boolean),r=t.indexOf("add");if(r===-1)return null;let n=r+1;for(;n<t.length;){let o=t[n];if(ux.has(o))n+=2;else if(o.startsWith("-"))n+=1;else return o.replace(/^["']|["']$/g,"")}return null}function sn(e,t){return t?`${e}::${t}`:e}function Pl(e){return e===le?no:cn}function Np(e){return {name:h(e.name),version:e.version?h(e.version):e.version,description:e.description?h(e.description):e.description,authorName:e.author?.name?h(e.author.name):e.author?.name,updateAvailable:e.updateAvailable,type:e.type??"bundle",origin:e.origin??no,flowId:e.flowId}}function Tl(e,t){let r=Pl(e.marketplace);return {name:h(e.name),version:e.version?h(e.version):e.version,description:e.description?h(e.description):e.description,authorName:e.author?.name?h(e.author.name):e.author?.name,status:e.status,scope:e.scope,marketplace:e.marketplace,updateAvailable:e.updateAvailable,installedAt:e.installedAt,type:t?.type??e.type??"bundle",origin:t?.origin??r}}function Bp(e){let t=new Map;for(let r of e){if(!r.scope)continue;let n=t.get(r.scope)??[];n.push(r),t.set(r.scope,n);}return Jo.filter(r=>t.has(r)).map(r=>({scope:r,label:Gt[r].label,pathHint:Gt[r].pathHint,items:t.get(r)??[]}))}function Fp(e){let t=r=>{if(!r)return 1/0;let n=Jo.indexOf(r);return n===-1?1/0:n};return [...e].sort((r,n)=>t(r.scope)-t(n.scope))}function jp({catalog:e,installedItems:t,activeTab:r,catalogFilters:n,searchQuery:o}){let s=useMemo(()=>new Set(t.map(f=>sn(f.name,f.author?.name))),[t]),i=useMemo(()=>new Set(t.filter(f=>f.type==="mcp").map(f=>f.name.toLowerCase())),[t]),a=useMemo(()=>{let f=new Map(e.map(g=>[sn(g.name,g.author?.name),g])),y=new Map(e.map(g=>[g.name,g]));return t.map(g=>{let w=f.get(sn(g.name,g.author?.name))??y.get(g.name),E=w?.version,D=!!E&&!!g.version&&Fe(g.version,E);return {...g,updateAvailable:D,catalogItem:w}})},[t,e]),l=useMemo(()=>r==="discover"?e.filter(f=>{if(s.has(sn(f.name,f.author?.name)))return false;if(f.type==="mcp"){let y=f.installCommand?Up(f.installCommand)?.toLowerCase():null;if(i.has(f.name.toLowerCase())||y&&i.has(y))return false}return true}).map(f=>Np(f)):r==="updates"?a.filter(f=>f.updateAvailable).map(f=>Tl(f,f.catalogItem)):a.map(f=>Tl(f,f.catalogItem)),[r,e,s,i,a]),u=useMemo(()=>l.filter(f=>{let y=f.type??"bundle";if(!n.types.has(y))return false;let g=f.origin??"internal";return n.origins.has(g)}),[l,n]),c=useMemo(()=>{let{types:f}=n;if(f.size===1){if(f.has("skill"))return "skills";if(f.has("mcp"))return "MCPs";if(f.has("bundle"))return "bundles"}return "items"},[n]),d=useMemo(()=>r==="installed"?o?`No ${c} found for '${o}' \u2014 explore the Discover tab!`:`No ${c} installed \u2014 explore the Discover tab!`:r==="updates"?o?`No ${c} found for '${o}' \u2014 all up to date!`:"All up to date \u2014 nothing to update":o?`No ${c} found for '${o}'`:`No ${c} available in the catalog`,[r,o,c]),m=useMemo(()=>{let f=new Map(e.map(g=>[sn(g.name,g.author?.name),g])),y=new Map(e.map(g=>[g.name,g]));return g=>g?f.get(sn(g.name,g.authorName))??y.get(g.name)??null:null},[e]),p=useMemo(()=>a.filter(f=>f.updateAvailable).length,[a]);return {items:u,emptyMessage:d,getSelectedCatalogItem:m,outdatedCount:p}}function Cl(){let[e,t]=useState([]),[r,n]=useState(true),[o,s]=useState(null),[i,a]=useState(null),l=useRef(false),u=S(d=>d.catalogVersion),c=useCallback(async()=>{n(true),s(null),a(null);try{let{items:d,failures:m}=await dd();if(t(d),m.length>0){let p=m.map(f=>f.adapterName).join(", ");a(`Some catalogs failed to load: ${p}`);}l.current||(l.current=!0,v(I.CLI_CATALOG_VIEWED,{interface:"tui",filter_type:"all",result_count:d.length}).catch(()=>{}));}catch(d){s(d instanceof Error?d:new Error(String(d))),t([]);}finally{n(false);}},[]);return useEffect(()=>{c();},[c,u]),{catalog:e,isLoading:r,error:o,partialError:i,refetch:c}}function Kp(){return {items:fe(t=>t.installedItems)}}$();var gx=x("catalog");function Hp(){let e=S(X=>X.bundleInstallFlow),t=S(X=>X.activeTab),r=S(X=>X.notification),n=S(X=>X.loading),o=S(X=>X.loadingMessage),s=S(X=>X.downloadProgress),i=S(X=>X.downloadTotal),a=S(X=>X.catalogError),l=S(X=>X.setCatalogError),u=S(X=>X.catalogFilters),c=We(X=>X.query),{catalog:d,isLoading:m,error:p,refetch:f}=Cl(),{items:y}=Kp(),g=fe(X=>X.loadFromDisk),{items:w,emptyMessage:E,getSelectedCatalogItem:D,outdatedCount:M}=jp({catalog:d,installedItems:y,activeTab:t,catalogFilters:u,searchQuery:c}),{actionMenuOpen:C,closeMenu:R,selectedIndex:_,clampIndex:O,filteredItems:ee}=Ip({listLength:w.length}),k=ee(w),H=useMemo(()=>t!=="installed"&&t!=="updates"?k:Fp(k),[t,k]),Q=useMemo(()=>t==="installed"||t==="updates"?Bp(H):[],[t,H]),K=H[_]??null,V=useMemo(()=>D(K),[D,K]),{notify:z}=Ep(),{handleInstall:A,handleUninstall:N,handleToggleStatus:G,handleUpdate:Re,handleBatchUpdate:Zo,handleMcpConfigUninstall:mg}=Lp({selectedItem:K,selectedCatalogItem:V,items:w,closeMenu:R,clampIndex:O,notify:z}),{handleBundleInstallStart:fg,handleBundleDetailConfirm:gg,handleBundleDetailBack:hg,handleBundleInstallComplete:yg}=Op({closeMenu:R,notify:z}),wg=useCallback(()=>Zo(H),[Zo,H]);return useEffect(()=>{g();},[]),useEffect(()=>{O(H.length);},[H.length,O]),useEffect(()=>{p&&(gx.error(`[catalog] ${p instanceof Error?p.message:String(p)}`),l("Failed to load catalog"));},[p]),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(Cn,{}),jsx(Pu,{outdatedCount:M}),t==="marketplaces"&&xr()?jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(wp,{})}):jsx(ju,{filteredItems:H,groups:Q,emptyMessage:E,onBatchUpdate:wg}),(n||m)&&jsxs(Fragment,{children:[jsx(Vs,{message:n?o:"Loading catalog..."}),n&&i>0&&s>0&&jsx(Box,{paddingLeft:2,children:jsx(Js,{received:s,total:i})})]}),a&&!m&&t==="discover"&&jsx(Gs,{message:a,onRetry:()=>{l(null),f();},onBack:()=>l(null)}),r&&jsx(Ku,{message:r.message,type:r.type}),C&&K&&(t==="discover"?V?.type==="bundle"?e?.phase==="installing"?jsx(op,{bundle:e.bundle,onComplete:yg}):jsx(Gd,{itemName:K.name,bundle:e?.phase==="detail"?e.bundle:void 0,onInstall:()=>fg(K.name,K.flowId),onConfirm:gg,onClose:e?.phase==="detail"?hg:R}):jsx(Hd,{itemName:K.name,itemType:V?.type,onInstall:A,onClose:R}):K.type==="mcp"?jsx(Zd,{itemName:K.name,itemScope:K.scope??"user",onUninstall:mg,onClose:R}):jsx(Xd,{itemName:K.name,itemScope:K.scope??"user",itemStatus:K.status??"enabled",updateAvailable:K.updateAvailable??false,catalogVersion:V?.version,onUninstall:N,onToggleStatus:X=>G(X),onUpdate:Re,onClose:R})),jsx(Ks,{})]})}var L=create((e,t)=>({starterKits:[],selectedStarterKitIndex:0,selectedStarterKit:null,plugins:[],pluginCursorIndex:0,step:"starterKitList",isLoadingStarterKits:false,starterKitsError:null,successCount:0,failedCount:0,summaryActionIndex:0,setStarterKits:r=>e({starterKits:r}),setSelectedStarterKitIndex:r=>e({selectedStarterKitIndex:r}),selectStarterKit:r=>{let n=new Set(fe.getState().installedItems.map(o=>o.name));e({selectedStarterKit:r,plugins:r.plugins.map(o=>({name:o,selected:true,status:n.has(o)?"success":"pending",installed:n.has(o)})),pluginCursorIndex:0,step:"starterKitDetail"});},setPluginCursorIndex:r=>e({pluginCursorIndex:r}),setStep:r=>e({step:r}),setPluginStatus:(r,n,o)=>{let s=t().plugins.map(i=>i.name===r?{...i,status:n,error:o}:i);e({plugins:s});},setPluginDownloadProgress:(r,n,o)=>{let s=t().plugins.map(i=>i.name===r?{...i,downloadProgress:n,downloadTotal:o}:i);e({plugins:s});},setIsLoadingStarterKits:r=>e({isLoadingStarterKits:r}),setStarterKitsError:r=>e({starterKitsError:r}),setSummaryActionIndex:r=>e({summaryActionIndex:r}),computeSummary:()=>{let n=t().plugins.filter(o=>o.selected);e({successCount:n.filter(o=>o.status==="success").length,failedCount:n.filter(o=>o.status==="failed").length});},resetForRetry:()=>{let r=t().plugins.map(n=>n.status==="failed"?{...n,status:"pending",error:void 0}:n);e({plugins:r,step:"installing"});},goBackToList:()=>e({selectedStarterKit:null,plugins:[],pluginCursorIndex:0,step:"starterKitList"})}));Ie();var xx=3;function Gp(){let e=L(c=>c.setStarterKits),t=L(c=>c.setIsLoadingStarterKits),r=L(c=>c.setStarterKitsError),n=L(c=>c.setPluginStatus),o=L(c=>c.setPluginDownloadProgress),s=L(c=>c.setStep),i=L(c=>c.computeSummary),a=useCallback(async()=>{t(true),r(null);try{let c=await Qs();e(c);}catch(c){r(c instanceof Error?c.message:String(c));}finally{t(false);}},[t,r,e]);useEffect(()=>{fe.getState().loadFromDisk(),a();},[a]);let l=useRef(0),u=useCallback(async()=>{let c=L.getState().plugins.filter(m=>m.selected&&m.status==="pending");for(let m of c){n(m.name,"installing"),l.current=0;let p="",f=false;for(let y=1;y<=xx;y++)try{await Oe(m.name,{onDownloadProgress:(g,w)=>{let E=Date.now();(E-l.current>100||g>=w)&&(l.current=E,o(m.name,g,w));}}),n(m.name,"success"),f=!0;break}catch(g){if(g instanceof ze){n(m.name,"success"),f=true;break}p=g instanceof Error?g.message:"Unknown error";}f||(n(m.name,"failed",p),v(I.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 d=Jr();Hr("summary_review"),v(I.CLI_STEP_COMPLETED,{step:"tool_installation",duration_ms:d}).catch(()=>{}),fe.getState().loadFromDisk(),i(),s("summary");},[n,o,i,s]);return {loadStarterKits:a,installSelected:u}}var Go={cursorDelta:0,confirm:false,back:false};function Wp(e,t){return t.upArrow?{...Go,cursorDelta:-1}:t.downArrow?{...Go,cursorDelta:1}:t.escape?{...Go,back:true}:t.return?{...Go,confirm:true}:Go}var bx={cursorDelta:0,select:false};function zp(e,t){return t.upArrow?{cursorDelta:-1,select:false}:t.downArrow?{cursorDelta:1,select:false}:t.return?{cursorDelta:0,select:true}:bx}B();var Xp=yy.memo(function({starterKit:t,isSelected:r}){return jsxs(Box,{flexDirection:"column",paddingBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:r?"cyan":"gray",children:r?"\u203A ":"\u25CB "}),jsx(Text,{bold:r,color:r?"cyan":"white",children:h(t.name)}),jsxs(Text,{dimColor:true,children:[" \xB7 ",t.plugins.length," ",t.plugins.length===1?"plugin":"plugins"]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:h(t.description)})})]})});var _l=5;function qp({onRetry:e}){let t=L(c=>c.starterKits),r=L(c=>c.selectedStarterKitIndex),n=L(c=>c.isLoadingStarterKits),o=L(c=>c.starterKitsError);if(n)return jsx(Vs,{message:"Loading Starter Kits..."});if(o)return jsx(Gs,{message:o,onRetry:e,onBack:e});if(t.length===0)return jsx(kn,{message:"No Starter Kits available."});let s=Math.max(0,r-Math.floor(_l/2)),i=Math.min(t.length,s+_l);i===t.length&&(s=Math.max(0,i-_l));let a=t.slice(s,i),l=s,u=t.length-i;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"})}),l>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2191 ",l," more above"]})}),a.map((c,d)=>jsx(Xp,{starterKit:c,isSelected:s+d===r},c.slug)),u>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",u," more below"]})})]})}B();var Zp=yy.memo(function({plugin:t,isCursor:r}){return jsxs(Box,{children:[jsx(Text,{color:r?"cyan":"gray",children:r?"\u203A ":" "}),jsx(Text,{color:"cyan",children:"\u2022"}),jsxs(Text,{bold:r,color:r?"cyan":"white",children:[" ",h(t.name)]}),t.installed&&jsx(Text,{color:"green",children:" (installed)"})]})});B();var Ul=8;function Qp(){let e=L(c=>c.selectedStarterKit),t=L(c=>c.plugins),r=L(c=>c.pluginCursorIndex),n=useRef(false);if(useEffect(()=>{e&&!n.current&&(n.current=true,v(I.CLI_KIT_DISPLAYED,{bundle_slug:e.slug,tool_count:t.length}).catch(()=>{}));},[e,t.length]),!e)return jsx(Text,{dimColor:true,children:"No Starter Kit selected."});let o=t.filter(c=>c.installed).length,s=Math.max(0,r-Math.floor(Ul/2)),i=Math.min(t.length,s+Ul);i===t.length&&(s=Math.max(0,i-Ul));let a=t.slice(s,i),l=s,u=t.length-i;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:[jsx(Text,{bold:true,color:"cyan",children:h(e.name)}),jsx(Text,{dimColor:true,children:h(e.description)})]}),jsx(Box,{paddingX:1,paddingBottom:1,children:jsxs(Text,{children:[t.length," plugins to install",o>0&&` \xB7 ${o} already installed`]})}),l>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2191 ",l," more above"]})}),a.map((c,d)=>jsx(Zp,{plugin:c,isCursor:s+d===r},c.name)),u>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",u," more below"]})})]})}B();var $x=["Retry failed","Continue anyway"];function em({name:e,status:t,error:r,downloadProgress:n,downloadTotal:o}){let s=h(e);return t==="installing"?jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(np,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",s]})]}),o!==void 0&&o>0&&n!==void 0&&n>0&&jsx(Box,{paddingLeft:2,children:jsx(Js,{received:n,total:o})})]}):t==="success"?jsx(Box,{children:jsxs(Text,{color:"green",children:["\u2713 ",s]})}):t==="failed"?jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",s]}),r&&jsxs(Text,{dimColor:true,children:[" \u2014 ",h(r)]})]}):jsx(Box,{children:jsxs(Text,{dimColor:true,children:["\u25CB ",s]})})}function tm({onComplete:e,onRetry:t}){let r=L(u=>u.plugins),n=L(u=>u.step),o=L(u=>u.successCount),s=L(u=>u.failedCount),i=L(u=>u.summaryActionIndex),a=r.filter(u=>u.selected),l=useRef(false);return useEffect(()=>{if(n==="summary"&&s===0&&!l.current){l.current=true;let u=setTimeout(e,1500);return ()=>clearTimeout(u)}},[n,s,e]),n==="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:a.map(u=>jsx(em,{name:u.name,status:u.status,error:u.error,downloadProgress:u.downloadProgress,downloadTotal:u.downloadTotal},u.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:[o>0&&jsxs(Text,{color:"green",children:["\u2713 ",o," ",o===1?"plugin":"plugins"," installed successfully"]}),s>0&&jsxs(Text,{color:"red",children:["\u2717 ",s," ",s===1?"plugin":"plugins"," failed"]})]}),s>0&&jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:a.filter(u=>u.status==="failed").map(u=>jsx(em,{name:u.name,status:u.status,error:u.error},u.name))}),s>0&&jsx(Box,{flexDirection:"column",paddingX:1,children:$x.map((u,c)=>jsx(Box,{children:jsxs(Text,{bold:c===i,color:c===i?"cyan":void 0,children:[c===i?"\u203A ":" ",u]})},u))}),s===0&&jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:"Proceeding to main screen..."})})]})}function rm(){let e=L(k=>k.step),t=L(k=>k.starterKits),r=L(k=>k.selectedStarterKitIndex),n=L(k=>k.setSelectedStarterKitIndex),o=L(k=>k.selectStarterKit),s=L(k=>k.plugins),i=L(k=>k.pluginCursorIndex),a=L(k=>k.setPluginCursorIndex),l=L(k=>k.setStep),u=L(k=>k.summaryActionIndex),c=L(k=>k.setSummaryActionIndex),d=L(k=>k.failedCount),m=L(k=>k.resetForRetry),p=L(k=>k.goBackToList),f=S(k=>k.setScreen),y=S(k=>k.setFocus),g=S(k=>k.focus),w=rt(k=>k.setJustAuthenticated),E=rt(k=>k.justAuthenticated),{loadStarterKits:D,installSelected:M}=Gp(),C=useRef(false);useEffect(()=>{e==="starterKitList"?(y("starterKitList"),C.current||(C.current=true,Hr("bundle_selection"))):y(e==="starterKitDetail"?"starterKitDetail":"installProgress");},[e,y]);let R=useCallback(async()=>{let k=L.getState().selectedStarterKit;if(k){let Q=await Y();Q&&await gr({...Q,starterKit:k.slug});}v(I.CLI_STEP_COMPLETED,{step:"summary_review",duration_ms:Jr()}).catch(()=>{});let{successCount:H}=L.getState();v(I.CLI_ONBOARDING_COMPLETED,{duration_ms:yr(),tools_installed_count:H}).catch(()=>{}),w(false),y("verify"),f("verify");},[w,y,f]),_=useCallback(()=>{m(),M();},[m,M]),O=useCallback(()=>{D();},[D]),ee=useCallback(()=>{y("verify"),f("verify");},[y,f]);return useInput((k,H)=>{if(H.escape)Ps("esc"),ee();else if(H.upArrow&&r>0)n(r-1);else if(H.downArrow&&r<t.length-1)n(r+1);else if(H.return&&t.length>0){let Q=Jr();o(t[r]),Hr("kit_display"),v(I.CLI_STEP_COMPLETED,{step:"bundle_selection",duration_ms:Q}).catch(()=>{});}},{isActive:g==="starterKitList"}),useInput((k,H)=>{let Q=Wp(k,H);if(Q.cursorDelta!==0){let K=i+Q.cursorDelta;K>=0&&K<s.length&&a(K);}if(Q.confirm){let K=L.getState().selectedStarterKit;K&&(async()=>(await Y())?.starterKit!==K.slug&&v(I.CLI_KIT_ACCEPTED,{bundle_slug:K.slug}).catch(()=>{}))();let V=Jr();Hr("kit_confirmation"),v(I.CLI_STEP_COMPLETED,{step:"kit_display",duration_ms:V}).catch(()=>{});let z=Jr();Hr("tool_installation"),v(I.CLI_STEP_COMPLETED,{step:"kit_confirmation",duration_ms:z}).catch(()=>{}),l("installing"),M();}if(Q.back){let K=L.getState().selectedStarterKit;K&&v(I.CLI_KIT_REJECTED,{bundle_slug:K.slug}).catch(()=>{}),p();}},{isActive:g==="starterKitDetail"}),useInput((k,H)=>{if(d===0)return;let Q=zp(k,H);if(Q.cursorDelta!==0){let K=u+Q.cursorDelta;K>=0&&K<=1&&c(K);}Q.select&&(u===0?_():R());},{isActive:g==="installProgress"&&e==="summary"}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(Cn,{}),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."}),!E&&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(qp,{onRetry:O}),e==="starterKitDetail"&&jsx(Qp,{}),(e==="installing"||e==="summary")&&jsx(tm,{onComplete:R,onRetry:_})]}),jsx(Ks,{})]})}j();var sm=null;function im(){return sm}async function ki(){let t=qr().filter(r=>r.installedVersion===null&&r.installMethod===null);for(let r of t){let n=se.find(i=>i.alias===r.alias);if(!n)continue;let{installedVersion:o,installMethod:s}=await am(n);(o||s)&&await yt({...r,installedVersion:o,installMethod:s});}}async function am(e){let t=e.platforms[process.platform];if(t?.status!=="supported")return {installedVersion:null,installMethod:null};for(let r of t.strategies)if(r.type!=="curl")try{let o=await _t(r.type).getInstalledVersion(e);if(o)return {installedVersion:o,installMethod:r.type}}catch{}return {installedVersion:null,installMethod:null}}async function qn(e){let t=await Promise.all(e.map(r=>Mx(r)));return sm=t,t}async function Mx(e){let t=nm(e.versionCommand);t==="permission-denied"&&(_x(e.versionCommand[0]),t=nm(e.versionCommand));let n=t==="installed"&&(!e.configCheck||e.configCheck()),o=e.platforms[process.platform],s=o?.status==="supported"?o.strategies:[],a=(await Promise.all(s.map(async l=>{try{return await _t(l.type).isAvailable()?l.type:null}catch{return null}}))).filter(l=>l!==null);if(n&&!nt(e.alias)){let{installedVersion:l,installMethod:u}=await am(e);await yt({alias:e.alias,name:e.name,installedVersion:l,installMethod:u,installedAt:null,lastChecked:new Date().toISOString()});}return {module:e,alreadyInstalled:n,availableStrategies:a}}function nm(e){if(e.length===0)return "not-found";try{let t=spawnSync(e[0],e.slice(1),{timeout:3e3,stdio:"pipe",shell:process.platform==="win32"});return t.status===0?"installed":t.status===126?"permission-denied":"not-found"}catch{return "not-found"}}function _x(e){if(process.platform!=="win32")try{let t=spawnSync("which",[e],{stdio:"pipe"});if(t.status!==0)return;let r=t.stdout.toString().trim(),n=be__default.realpathSync(r),{mode:o}=be__default.statSync(n);be__default.chmodSync(n,o|73);}catch{}}function Ux(e){return e.filter(t=>t.module.platforms[process.platform]?.status==="supported").filter(t=>!t.alreadyInstalled).map(t=>({module:t.module,alreadyInstalled:t.alreadyInstalled,checked:!t.alreadyInstalled&&(t.availableStrategies.length>0||t.module.required===true),selectedStrategy:t.availableStrategies[0]??null,availableStrategies:t.availableStrategies}))}function pm(e,t){let[r,n]=useState(()=>Ux(e)),[o,s]=useState(0),i=useRef(o);useEffect(()=>{i.current=o;},[o]);let a=useRef(r);useEffect(()=>{a.current=r;},[r]);let l=useCallback(d=>{n(m=>m.map(p=>p.module.alias!==d||p.module.required?p:{...p,checked:!p.checked}));},[]),u=useCallback((d,m)=>{n(p=>p.map(f=>f.module.alias===d?{...f,selectedStrategy:m}:f));},[]);useInput((d,m)=>{let p=i.current,f=a.current,y=m.upArrow||d==="[A",g=m.downArrow||d==="[B";if(y||g)y&&p>0?s(p-1):g&&p<f.length-1&&s(p+1);else if(d===" "){let w=f[p];w&&!w.module.required&&l(w.module.alias);}else if(m.tab){let w=f[p];if(w&&w.availableStrategies.length>1){let E=w.availableStrategies.indexOf(w.selectedStrategy??w.availableStrategies[0]),D=w.availableStrategies[(E+1)%w.availableStrategies.length];n(M=>M.map(C=>C.module.alias===w.module.alias?{...C,selectedStrategy:D}:C));}}},{isActive:t});let c=useMemo(()=>r.filter(d=>d.checked),[r]);return {items:r,focusedIndex:o,toggle:l,setStrategy:u,confirmedItems:c}}B();function fm({probeResults:e,onConfirm:t}){let r=S(p=>p.focus),n=S(p=>p.actionMenuOpen),o=S(p=>p.setActionMenuOpen),s=S(p=>p.setFocus),{items:i,focusedIndex:a,confirmedItems:l}=pm(e,r==="moduleSetup"),u=useCallback(()=>{o(false),s("moduleSetup");},[o,s]),c=useCallback(p=>{(p==="Install"||p==="Skip")&&t(l),u();},[l,t,u]);useInput((p,f)=>{f.return&&(o(true),s("actionMenu"));},{isActive:r==="moduleSetup"});let d=l.length>0?["Install","Cancel"]:["Skip","Cancel"],m=l.length>0?`Install ${l.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:i.map((p,f)=>{let y=f===a,g=h(p.module.name);return p.availableStrategies.length===0?jsxs(Box,{children:[jsxs(Text,{dimColor:true,children:[" [ ] ",g," "]}),jsx(Text,{dimColor:true,children:"\u2014 no installer available"})]},p.module.alias):jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:y?"cyan":void 0,children:[y?"\u25B6":" ",p.checked?" [\u2713] ":" [ ] ",g]}),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:h(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"})}),n&&jsx(ot,{itemName:m,actions:d,onAction:c,onClose:u})]})}var Kx=/^https?:\/\/.+/;function gm({onConfirm:e}){let[t,r]=useState("confirm"),[n,o]=useState(""),[s,i]=useState(false),a=useRef("");return useInput((l,u)=>{if(t==="confirm"){if(l==="y"||l==="Y"){r("input");return}if(l==="n"||l==="N"||u.return){e(null);return}}if(t==="input"){if(u.escape){a.current="",o(""),r("confirm");return}if(u.return){let c=a.current.trim();c.length>0&&Kx.test(c)?(i(false),e(c)):c.length>0&&i(true);return}if(u.backspace||u.delete){a.current=a.current.slice(0,-1),o(a.current);return}l&&!u.ctrl&&!u.meta&&(a.current=a.current+l,o(a.current),i(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:[t==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),t==="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:n}),jsx(Text,{color:"cyan",children:"\u2588"})]}),s&&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 Hx(e){let t=e.module.platforms[process.platform];return (t?.status==="supported"?t.strategies:[]).map(n=>n.type==="npm"?`npm install -g ${n.package}`:n.type==="homebrew"?`brew install ${n.formula}`:"curl (see docs)").join(" or ")}function wm(e,t){let[r,n]=useState(()=>e.map(d=>({alias:d.module.alias,name:d.module.name,status:"pending"}))),[o,s]=useState(false),i=useCallback((d,m)=>{n(p=>p.map(f=>f.alias===d?{...f,...m}:f));},[]),a=useCallback(async()=>{for(let d of e){let m=Hx(d);if(!d.selectedStrategy){let p=m?`No package manager available. Install manually: ${m}`:"No package manager available for this platform";i(d.module.alias,{status:"failed",error:p,manualInstallHint:m||void 0});continue}i(d.module.alias,{status:"installing"});try{let p=await vr(d.module,"onboarding",d.selectedStrategy,t);p.success?i(d.module.alias,{status:"installed",pendingSetupCommand:p.configCheckFailed?"flow-ai-obs init \u2014 run manually to complete setup (required for metrics collection)":p.pendingInteractiveSetup?.join(" ")}):i(d.module.alias,{status:"failed",error:p.error?.message??"Installation failed",manualInstallHint:m});}catch(p){i(d.module.alias,{status:"failed",error:p instanceof Error?p.message:"Unknown error",manualInstallHint:m});}}s(true);},[e,i,t]),l=useMemo(()=>r.filter(d=>d.status==="installed").length,[r]),u=useMemo(()=>r.filter(d=>d.status==="failed").length,[r]),c=useMemo(()=>r.filter(d=>d.status==="skipped").length,[r]);return {modules:r,install:a,isComplete:o,installedCount:l,failedCount:u,skippedCount:c}}j();B();function Sm({module:e}){let t=h(e.name);if(e.status==="installing")return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(np,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",t," \u2014 Installing..."]})]});if(e.status==="installed"){let r=!!e.pendingSetupCommand;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{children:jsxs(Text,{color:r?"red":"green",children:[r?"\u2717":"\u2713"," ",t]})}),e.pendingSetupCommand&&jsx(Box,{paddingLeft:2,children:jsx(Text,{color:"red",children:h(e.pendingSetupCommand)})})]})}return e.status==="failed"?jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",t]}),e.error&&jsxs(Text,{dimColor:true,children:[" \u2014 ",h(e.error)]})]}),e.manualInstallHint&&jsx(Box,{paddingLeft:2,children:jsxs(Text,{dimColor:true,children:["Install manually: ",h(e.manualInstallHint)]})})]}):e.status==="skipped"?jsx(Box,{children:jsxs(Text,{dimColor:true,children:["- ",t," (not supported on this platform)"]})}):jsx(Box,{children:jsxs(Text,{dimColor:true,children:["\u25CB ",t]})})}function vm({confirmedItems:e,customUrl:t}){let r=S(w=>w.setScreen),n=S(w=>w.setFocus),{modules:o,install:s,isComplete:i,installedCount:a,failedCount:l,skippedCount:u}=wm(e,t),c=o.some(w=>w.pendingSetupCommand),d=useRef(false),m=useRef(false);useEffect(()=>{d.current||(d.current=true,s());},[s]);let p=useCallback(()=>{Yr().catch(()=>{}),n("list");let w=ie().some(E=>E.name===ce);r(w?"main":"claudeMdSuggestion");},[n,r]);useEffect(()=>{if(i&&l===0&&!c&&!m.current){m.current=true;let w=setTimeout(p,1500);return ()=>clearTimeout(w)}},[i,l,c,p]),useInput((w,E)=>{E.return&&p();},{isActive:i});let f=o.filter(w=>w.pendingSetupCommand).length,y=a-f,g=[];return y>0&&g.push(jsxs(Text,{color:"green",children:[y," installed"]},"i")),f>0&&g.push(jsxs(Text,{color:"red",children:[f," needs setup"]},"p")),l>0&&g.push(jsxs(Text,{color:"red",children:[l," failed"]},"f")),u>0&&g.push(jsxs(Text,{dimColor:true,children:[u," skipped"]},"s")),jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:i?"Modules ready":"Setting up modules..."})}),jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:o.map(w=>jsx(Sm,{module:w},w.alias))}),i&&jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:g.reduce((w,E,D)=>(D>0&&w.push(jsx(Text,{children:" | "},`sep-${D}`)),w.push(E),w),[])}),jsx(Box,{paddingX:1,children:l>0||c?jsx(Text,{dimColor:true,children:"Press Enter to continue"}):jsx(Text,{dimColor:true,children:"Proceeding..."})})]})]})}function Pm(){let[e,t]=useState("loading"),[r,n]=useState([]),[o,s]=useState([]),[i,a]=useState(null),l=S(p=>p.setFocus),u=S(p=>p.setScreen),c=useCallback(p=>{if(iu(p)){Yr().catch(()=>{}),l("list");let y=ie().some(g=>g.name===ce);u(y?"main":"claudeMdSuggestion");}else n(p),t("selection");},[l,u]);useEffect(()=>{let p=im();if(p){c(p);return}qn(se).then(c).catch(()=>{n([]),t("selection");});},[c]);let d=useCallback(p=>{s(p);let f=p.some(y=>y.module.alias==="metrics");t(f?"customUrl":"installation");},[]),m=useCallback(p=>{a(p),t("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(fm,{probeResults:r,onConfirm:d}),e==="customUrl"&&jsx(gm,{onConfirm:m}),e==="installation"&&jsx(vm,{confirmedItems:o,customUrl:i})]})}j();$();var eb=x("ClaudeMdSuggestion"),tb=[`Install ${ce}`,"Skip for now"],rb=["Retry","Skip for now"];function km(){let e=S(m=>m.setScreen),t=S(m=>m.setFocus),r=L(m=>m.successCount),[n,o]=useState("prompt"),[s,i]=useState(0),a=useRef(0),l=useCallback(()=>{t("list"),e("main");},[t,e]),u=useCallback(()=>{v(I.CLI_CLAUDE_MD_SKIPPED,{interface:"tui"}).catch(()=>{}),l();},[l]),c=useCallback(async()=>{a.current+=1,v(I.CLI_CLAUDE_MD_ACCEPTED,{interface:"tui",attempt:a.current}).catch(()=>{}),o("installing");try{await Oe(ce),o("installed");}catch(m){if(m instanceof ze){o("installed");return}eb.warn(`Failed to install ${ce}: ${m instanceof Error?m.message:m}`),o("error");}},[]),d=n==="error"?rb:tb;return useInput((m,p)=>{if(p.escape){n==="prompt"||n==="error"?u():n==="installed"&&l();return}if(n==="prompt"||n==="error"){p.upArrow&&s>0?i(s-1):p.downArrow&&s<d.length-1?i(s+1):p.return&&(s===0?(i(0),c()):u());return}n==="installed"&&p.return&&l();}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(Cn,{}),jsxs(Box,{flexDirection:"column",paddingX:1,gap:1,children:[jsx(Text,{color:"green",bold:true,children:r>0?"\u2713 Starter kit installed!":"\u2713 Setup complete!"}),n==="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(Cm,{options:d,cursorIndex:s}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]}),n==="installing"&&jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(np,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" Installing ",ce,"..."]})]}),n==="installed"&&jsxs(Fragment,{children:[jsxs(Text,{color:"green",bold:true,children:["\u2713 ",ce," 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:["/",ce]})]}),jsx(Text,{children:"Claude will guide you through the rest."}),jsx(Text,{dimColor:true,children:"Press Enter to continue to the catalog..."})]}),n==="error"&&jsxs(Fragment,{children:[jsxs(Text,{color:"red",bold:true,children:["\u2717 Failed to install ",ce]}),jsx(Cm,{options:d,cursorIndex:s}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]})]})]})}function Cm({options:e,cursorIndex:t}){return jsx(Box,{flexDirection:"column",children:e.map((r,n)=>jsxs(Text,{bold:n===t,color:n===t?"cyan":void 0,children:[n===t?"\u203A ":" ",r]},r))})}var ib=promisify(execFile),Mi="@ciandt-flow/cli";async function Am(){let e=ue;if(vl.prerelease(e)||process.env.NODE_ENV==="development")return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Mi};try{let t=await fetch(`https://registry.npmjs.org/${Mi}/latest`);if(!t.ok)throw new Error(`Registry returned ${t.status}`);let n=(await t.json()).version;return {currentVersion:e,latestVersion:n,isOutdated:n!==e,packageName:Mi}}catch{return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Mi}}}async function _i(e){try{return await ib(Xt(),["install","-g",e.packageName],{timeout:6e4,shell:process.platform==="win32"}),{success:!0}}catch(t){return {success:false,error:String(t)}}}async function ab(e){let t=nt(e.alias);if(!t?.installMethod)return t?.installedVersion??null;try{let n=await _t(t.installMethod).getInstalledVersion(e);return n&&n!==t.installedVersion&&await yt({...t,installedVersion:n,lastChecked:new Date().toISOString()}),n??t.installedVersion}catch{return t.installedVersion}}async function $m(e){let t=await ab(e),r=null,n=AbortSignal.timeout(3e4);try{if(e.versionCheck.type==="npm-registry"){let s=await fetch(`https://registry.npmjs.org/${e.versionCheck.package}/latest`,{signal:n});if(!s.ok)throw new Error(`Registry returned ${s.status}`);r=(await s.json()).version;}else if(e.versionCheck.type==="github-releases"){let s=await fetch(`https://api.github.com/repos/${e.versionCheck.repo}/releases/latest`,{signal:n});if(!s.ok)throw new Error(`GitHub returned ${s.status}`);r=(await s.json()).tag_name.replace(/^v/,"");}}catch{}let o=t!==null&&r!==null&&t!==r;return {moduleAlias:e.alias,currentVersion:t,latestVersion:r,isOutdated:o}}async function Rm(e,t){let r=nt(e.alias);if(!r?.installMethod)return {success:false,error:"Unknown install method"};let o=await _t(r.installMethod).update(e,t.currentVersion??"");return o.success?(await yt({...r,installedVersion:o.version??r.installedVersion,lastChecked:new Date().toISOString()}),{success:true,newVersion:o.version}):{success:false,error:o.error?.message}}function Lm(e){let r=nt(e.alias)?.installMethod,n=e.platforms[process.platform];if(n?.status==="supported"){if(r==="npm"){let o=n.strategies.find(s=>s.type==="npm");if(o?.type==="npm")return `npm install -g ${o.package}`}if(r==="homebrew"){let o=n.strategies.find(s=>s.type==="homebrew");if(o?.type==="homebrew")return `brew upgrade ${o.formula}`}}}function Mm(){let[e,t]=useState({outcome:"running",items:[{id:"cli",label:"@ciandt-flow/cli",status:"pending"},...se.map(n=>({id:n.alias,label:n.name,status:"pending"}))]}),r=useCallback((n,o)=>{t(s=>({...s,items:s.items.map(i=>i.id===n?{...i,...o}:i)}));},[]);return useEffect(()=>{async function n(){try{let[o,s,i]=await Promise.all([Am(),qn(se),Promise.all(se.map(l=>$m(l)))]);if(ki(),o.isOutdated){r("cli",{status:"updating",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`}),(await _i(o)).success?(r("cli",{status:"updated",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`}),t(u=>({...u,outcome:"cli-updated"}))):(r("cli",{status:"error",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`,manualCommand:`npm install -g ${o.packageName}`}),t(u=>({...u,outcome:"cli-update-failed"})));return}r("cli",{status:"ok",detail:`v${o.currentVersion}`});let a=s.some(l=>!l.alreadyInstalled);for(let l of s)l.alreadyInstalled||r(l.module.alias,{status:"missing"});if(a){t(l=>({...l,outcome:"module-missing"}));return}for(let l of i){let u=se.find(d=>d.alias===l.moduleAlias);if(!u)continue;if(!l.isOutdated){r(l.moduleAlias,{status:"ok",detail:l.currentVersion?`v${l.currentVersion}`:void 0});continue}r(l.moduleAlias,{status:"updating",detail:`v${l.currentVersion} \u2192 v${l.latestVersion}`});let c=await Rm(u,l);c.success?r(l.moduleAlias,{status:"updated",detail:`v${c.newVersion}`}):r(l.moduleAlias,{status:"error",detail:`v${l.currentVersion} \u2192 v${l.latestVersion}`,manualCommand:Lm(u)});}t(l=>({...l,items:l.items.map(u=>u.status==="pending"?{...u,status:"ok"}:u)})),await Yr(),t(l=>({...l,outcome:"done"}));}catch{await Yr(),t(o=>({...o,outcome:"done"}));}}n();},[r]),e}j();function mb({item:e}){return e.status==="pending"||e.status==="updating"?jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(np,{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 fb({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 _m(){let{outcome:e,items:t}=Mm(),r=S(o=>o.setScreen),n=S(o=>o.setFocus);return useEffect(()=>{if(e==="done"){let o=setTimeout(()=>{let s=ie().some(i=>i.name===ce);r(s?"main":"claudeMdSuggestion"),n("list");},1500);return ()=>clearTimeout(o)}if(e==="module-missing"){let o=setTimeout(()=>{r("moduleSetup"),n("moduleSetup");},500);return ()=>clearTimeout(o)}},[e,r,n]),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:t.map(o=>jsx(mb,{item:o},o.id))}),e!=="running"&&jsx(Box,{marginTop:1,children:jsx(fb,{outcome:e})})]})}Ie();In();$();na();var wb={debug:"gray",info:"cyan",warn:"yellow",error:"red"},Dm=10;function Om(){let[e,t]=useState(ra());useEffect(()=>vc(()=>{t([...ra()]);}),[]);let r=e.slice(-Dm);return jsxs(Box,{flexDirection:"column",borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsxs(Text,{color:"cyan",bold:true,children:["Debug Log (last ",Dm,") \u2014 press Ctrl+D to close"]}),r.length===0?jsx(Text,{dimColor:true,children:"No log entries yet"}):r.map((n,o)=>jsxs(Text,{color:wb[n.level],children:["[",n.level.toUpperCase(),"] [",n.module,"] ",n.message]},o))]})}var Ib=x("app"),vb={auth:yu,starterKitSetup:rm,moduleSetup:Pm,claudeMdSuggestion:km,verify:_m,main:Hp};function Bm(){let{setScreen:e,setFocus:t}=S.getState();e("auth"),t("auth");}function Bs(e){let{setScreen:t,setFocus:r}=S.getState();!e.starterKit||e.starterKit.trim()===""?(t("starterKitSetup"),r("starterKitList")):(t("verify"),r("verify"));}function Fm(){v(I.CLI_SESSION_STARTED,{cli_version:ue,os:process.platform,node_version:process.version,duration_ms:yr(),interface:"tui"}).catch(()=>{});}async function Km(){let e=await Y();if(e&&ou()&&await hr()){e.customUrl&&kt(e.customUrl);let{clientSecret:n,...o}=e;rt.getState().setCredentials(o),Fm(),Bs(e);return}if(!e){Bm();return}try{e.customUrl&&kt(e.customUrl),await $t();}catch(n){Ib.debug(`Token validation failed: ${String(n)}`),Bm();return}Fm();let{clientSecret:t,...r}=e;rt.getState().setCredentials(r),Bs(e);}function Vm(){let{columns:e,rows:t}=useWindowSize(),r=S(a=>a.screen),n=vb[r],{pendingExit:o}=Xc(),s=S(a=>a.debugPanelOpen),i=!!process.env.DEBUG;return useInput((a,l)=>{if(i&&l.ctrl&&a==="d"){let u=S.getState().debugPanelOpen;S.getState().setDebugPanelOpen(!u);}}),n?jsxs(Box,{flexDirection:"column",width:e,height:t,children:[jsx(n,{}),i&&s&&jsx(Om,{}),o&&jsx(Box,{paddingX:1,children:jsx(Text,{color:"yellow",children:"Press Ctrl+C again to quit"})})]}):jsxs(Text,{color:"red",children:["Unknown screen: ",r]})}Ie();vs();B();j();$();lo();Ie();async function Xl(e,t={}){let r=ks({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant,customUrl:e.customUrl,starterKit:e.starterKit},t);return As(r),await gr(e),{jwt:r.jwt,anthropicBaseUrl:r.anthropicBaseUrl,previousToken:r.previousToken,previousBaseUrl:r.previousBaseUrl,hadExistingFile:r.hadExistingFile}}var Pt=x("auth");function Jm(){Ge.clearFallbackFile(),Ss();}var Eb=3,Hm=3,Gm=` \u2139 The data collected during setup is used solely to improve
|
|
121
|
+
[y/N] `))return Ii.debug(`[${e}] Removal cancelled by user`),b("Operation cancelled."),0}let n=t.silent?void 0:rc({text:`Removing MCP "${y(e)}"...`}).start();try{let o=await Re(r);return n?.stop(),o.exitCode!==0?(Ho(t,{name:e,action:"remove",message:o.stderr||"Command failed",exitCode:o.exitCode}),!t.silent&&t.verbose&&o.stdout&&b(`stdout: ${o.stdout}`),1):(Kp(t,{name:e,actionPastTense:"removed",command:r,durationMs:o.duration_ms,stdout:o.stdout}),0)}catch(o){return n?.stop(),Ho(t,{name:e,action:"remove",message:Y(o)}),1}}R();function Jp({selectedItem:e,selectedCatalogItem:t,items:r,closeMenu:n,clampIndex:o,notify:s}){let i=x("pluginHandlers"),a=useRef(0),l=S(C=>C.setLoading),u=S(C=>C.setDownloadProgress),{install:c,uninstall:d,toggle:m,update:p}=Fp(),g=async(C,$,_)=>{l(true,C),n();try{await $(),o(r.length),s(_,"success");}catch(O){let te=O instanceof Error?O.message:"Something went wrong";i.error(`[withLoading] ${C} failed: ${te}`),s(te,"error");}finally{l(false);}};return {handleInstall:(C,$)=>{e&&t&&(a.current=0,g(`Installing ${e.name}...`,()=>c(t,{scope:C,...$!==void 0?{providerId:$}:{},onDownloadProgress:(_,O)=>{let te=Date.now();(te-a.current>100||_>=O)&&(a.current=te,u(_,O));}}),"\u2713 Installed successfully"));},handleUninstall:C=>{e&&g(`Uninstalling ${e.name}...`,()=>d(e.name,C),"\u2713 Uninstalled");},handleToggleStatus:C=>{if(!e)return;let $=e.status==="enabled";g($?`Disabling ${e.name}...`:`Enabling ${e.name}...`,()=>m(e.name,C),$?"\u2713 Disabled":"\u2713 Enabled");},handleUpdate:()=>{if(!e)return;let C=t?` to v${t.version}`:"";(async()=>{l(true,`Updating ${e.name}${C}...`),n();try{await p(e.name),o(r.length),s(`\u2713 Updated ${e.name}${C}`,"success");}catch(_){if(_ instanceof Tr)s(_.message,"info");else {let O=_ instanceof Error?_.message:"Something went wrong";i.error(`[handleUpdate] ${e.name} failed: ${O}`),s(O,"error");}}finally{l(false);}})();},handleBatchUpdate:C=>{if(C.length===0)return;let $=C.length;(async()=>{l(true,`Updating ${$} plugin${$>1?"s":""}...`),n();try{let O=[];for(let H of C)O.push(await p(H.name).then(()=>({status:"fulfilled",value:void 0}),ee=>({status:"rejected",reason:ee})));let te=O.filter(H=>H.status==="fulfilled").length,k=O.map((H,ee)=>H.status==="rejected"?C[ee].name:null).filter(H=>H!==null);o(r.length),k.length===0?s(`\u2713 Updated ${te}/${$} plugin${$>1?"s":""}`,"success"):(i.error(`[handleBatchUpdate] failed: ${k.join(", ")}`),s(`Updated ${te}/${$}; failed: ${k.join(", ")}`,te>0?"info":"error"));}finally{l(false);}})();},handleMcpConfigUninstall:C=>{e&&g(`Removing MCP ${e.name}...`,async()=>{let $=Al(e.name,C),_=await Re($);if(_.exitCode!==0)throw new Error(_.stderr||"MCP removal failed");ge.getState().loadFromDisk();},"\u2713 MCP removed");}}}To();R();var Jo=x("api:bundle"),qn=class extends Error{constructor(t){super(`Bundle '${t}' not found in your tenant. Verify the name with whoever shared the command.`),this.name="BundleNotFoundError";}},Go=class extends Error{constructor(){super("The server encountered an error while fetching the bundle. Please try again later."),this.name="BundleServerError";}},Ux=/^[a-zA-Z0-9_-]{1,128}$/;async function Wp(e,t){if(e instanceof HTTPError){let r=e.response.status;throw Jo.error(`HTTP error fetching bundle '${t}' [status=${r}]`),r===StatusCodes.NOT_FOUND?new qn(t):r===StatusCodes.INTERNAL_SERVER_ERROR?new Go:new Error(`Server error (${r}) \u2014 please try again later.`)}throw Jo.error(`Unexpected error fetching bundle '${t}': ${e instanceof Error?e.message:String(e)}`),e}async function zp(e){if(!Ux.test(e))throw new Error("Invalid bundle identifier format.");let t=encodeURIComponent(e);Jo.debug(`Fetching bundle by flowId "${e}"`);try{return await Zt().get(`v1/use-cases/${t}`).json()}catch(r){return Wp(r,e)}}async function vi(e){let t=encodeURIComponent(e);Jo.debug(`Fetching bundle by name "${e}"`);let r;try{r=await Zt().get(`v1/use-cases/by-name/${t}`).json(),Jo.debug(`API returned ${r.length} result(s) for "${e}"`);}catch(n){return Wp(n,e)}if(r.length===0)throw new qn(e);return r[0]}R();var Nx=x("tui:bundle-flow");function Xp({closeMenu:e,notify:t}){let r=S(a=>a.bundleInstallFlow);return {handleBundleInstallStart:(a,l)=>{let{setLoading:u,setBundleInstallFlow:c}=S.getState(),d=l?.trim();Nx.debug(`Starting bundle install: itemName="${a}" flowId="${d??"none"}"`),u(true,"Loading bundle..."),(d?zp(d):vi(a)).then(p=>{u(false),S.getState().actionMenuOpen&&c({phase:"detail",bundle:p});}).catch(p=>{u(false),t(p instanceof Error?p.message:"Failed to load bundle","error");});},handleBundleDetailConfirm:()=>{if(!r||r.phase!=="detail")return;let{setBundleInstallFlow:a,setFocus:l}=S.getState();a({phase:"installing",bundle:r.bundle}),l("bundleInstallProgress");},handleBundleDetailBack:()=>{let{setBundleInstallFlow:a}=S.getState();a(null),e();},handleBundleInstallComplete:a=>{S.getState().setBundleInstallFlow(null),e(),ge.getState().loadFromDisk(),t(`\u2713 Installed ${a.installed} of ${a.total} artifacts`,"success");}}}F();j();var Wo=["local","project","user"],Bx=new Set(["--transport","--scope","-s"]);function qp(e){let t=e.split(/\s+/).filter(Boolean),r=t.indexOf("add");if(r===-1)return null;let n=r+1;for(;n<t.length;){let o=t[n];if(Bx.has(o))n+=2;else if(o.startsWith("-"))n+=1;else return o.replace(/^["']|["']$/g,"")}return null}function ln(e,t){return t?`${e}::${t}`:e}function Rl(e){return e===le?so:dn}function Yp(e){return {name:y(e.name),version:e.version?y(e.version):e.version,description:e.description?y(e.description):e.description,authorName:e.author?.name?y(e.author.name):e.author?.name,updateAvailable:e.updateAvailable,type:e.type??"bundle",origin:e.origin??so,flowId:e.flowId}}function $l(e,t){let r=Rl(e.marketplace);return {name:y(e.name),version:e.version?y(e.version):e.version,description:e.description?y(e.description):e.description,authorName:e.author?.name?y(e.author.name):e.author?.name,status:e.status,scope:e.scope,marketplace:e.marketplace,updateAvailable:e.updateAvailable,installedAt:e.installedAt,type:t?.type??e.type??"bundle",origin:t?.origin??r}}function Zp(e){let t=new Map;for(let r of e){if(!r.scope)continue;let n=t.get(r.scope)??[];n.push(r),t.set(r.scope,n);}return Wo.filter(r=>t.has(r)).map(r=>({scope:r,label:Wt[r].label,pathHint:Wt[r].pathHint,items:t.get(r)??[]}))}function Qp(e){let t=r=>{if(!r)return 1/0;let n=Wo.indexOf(r);return n===-1?1/0:n};return [...e].sort((r,n)=>t(r.scope)-t(n.scope))}function em({catalog:e,installedItems:t,activeTab:r,catalogFilters:n,searchQuery:o}){let s=useMemo(()=>new Set(t.map(g=>ln(g.name,g.author?.name))),[t]),i=useMemo(()=>new Set(t.filter(g=>g.type==="mcp").map(g=>g.name.toLowerCase())),[t]),a=useMemo(()=>{let g=new Map(e.map(h=>[ln(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return t.map(h=>{let w=g.get(ln(h.name,h.author?.name))??f.get(h.name),v=w?.version,D=!!v&&!!h.version&&je(h.version,v);return {...h,updateAvailable:D,catalogItem:w}})},[t,e]),l=useMemo(()=>r==="discover"?e.filter(g=>{if(s.has(ln(g.name,g.author?.name)))return false;if(g.type==="mcp"){let f=g.installCommand?qp(g.installCommand)?.toLowerCase():null;if(i.has(g.name.toLowerCase())||f&&i.has(f))return false}return true}).map(g=>Yp(g)):r==="updates"?a.filter(g=>g.updateAvailable).map(g=>$l(g,g.catalogItem)):a.map(g=>$l(g,g.catalogItem)),[r,e,s,i,a]),u=useMemo(()=>l.filter(g=>{let f=g.type??"bundle";if(!n.types.has(f))return false;let h=g.origin??"internal";return n.origins.has(h)}),[l,n]),c=useMemo(()=>{let{types:g}=n;if(g.size===1){if(g.has("skill"))return "skills";if(g.has("mcp"))return "MCPs";if(g.has("bundle"))return "bundles"}return "items"},[n]),d=useMemo(()=>r==="installed"?o?`No ${c} found for '${o}' \u2014 explore the Discover tab!`:`No ${c} installed \u2014 explore the Discover tab!`:r==="updates"?o?`No ${c} found for '${o}' \u2014 all up to date!`:"All up to date \u2014 nothing to update":o?`No ${c} found for '${o}'`:`No ${c} available in the catalog`,[r,o,c]),m=useMemo(()=>{let g=new Map(e.map(h=>[ln(h.name,h.author?.name),h])),f=new Map(e.map(h=>[h.name,h]));return h=>h?g.get(ln(h.name,h.authorName))??f.get(h.name)??null:null},[e]),p=useMemo(()=>a.filter(g=>g.updateAvailable).length,[a]);return {items:u,emptyMessage:d,getSelectedCatalogItem:m,outdatedCount:p}}function Ll(){let[e,t]=useState([]),[r,n]=useState(true),[o,s]=useState(null),[i,a]=useState(null),l=useRef(false),u=S(d=>d.catalogVersion),c=useCallback(async()=>{n(true),s(null),a(null);try{let{items:d,failures:m}=await Pd();if(t(d),m.length>0){let p=m.map(g=>g.adapterName).join(", ");a(`Some catalogs failed to load: ${p}`);}l.current||(l.current=!0,E(I.CLI_CATALOG_VIEWED,{interface:"tui",filter_type:"all",result_count:d.length}).catch(()=>{}));}catch(d){s(d instanceof Error?d:new Error(String(d))),t([]);}finally{n(false);}},[]);return useEffect(()=>{c();},[c,u]),{catalog:e,isLoading:r,error:o,partialError:i,refetch:c}}function tm(){return {items:ge(t=>t.installedItems)}}R();var Hx=x("catalog");function nm(){let e=S(X=>X.bundleInstallFlow),t=S(X=>X.activeTab),r=S(X=>X.notification),n=S(X=>X.loading),o=S(X=>X.loadingMessage),s=S(X=>X.downloadProgress),i=S(X=>X.downloadTotal),a=S(X=>X.catalogError),l=S(X=>X.setCatalogError),u=S(X=>X.catalogFilters),c=ze(X=>X.query),{catalog:d,isLoading:m,error:p,refetch:g}=Ll(),{items:f}=tm(),h=ge(X=>X.loadFromDisk),{items:w,emptyMessage:v,getSelectedCatalogItem:D,outdatedCount:M}=em({catalog:d,installedItems:f,activeTab:t,catalogFilters:u,searchQuery:c}),{actionMenuOpen:C,closeMenu:$,selectedIndex:_,clampIndex:O,filteredItems:te}=Dp({listLength:w.length}),k=te(w),H=useMemo(()=>t!=="installed"&&t!=="updates"?k:Qp(k),[t,k]),ee=useMemo(()=>t==="installed"||t==="updates"?Zp(H):[],[t,H]),K=H[_]??null,V=useMemo(()=>D(K),[D,K]),{notify:z}=Up(),{handleInstall:A,handleUninstall:B,handleToggleStatus:G,handleUpdate:Le,handleBatchUpdate:ts,handleMcpConfigUninstall:Kg}=Jp({selectedItem:K,selectedCatalogItem:V,items:w,closeMenu:$,clampIndex:O,notify:z}),{handleBundleInstallStart:Vg,handleBundleDetailConfirm:Hg,handleBundleDetailBack:Jg,handleBundleInstallComplete:Gg}=Xp({closeMenu:$,notify:z}),Wg=useCallback(()=>ts(H),[ts,H]);return useEffect(()=>{h();},[]),useEffect(()=>{O(H.length);},[H.length,O]),useEffect(()=>{p&&(Hx.error(`[catalog] ${p instanceof Error?p.message:String(p)}`),l("Failed to load catalog"));},[p]),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(An,{}),jsx(Bu,{outdatedCount:M}),t==="marketplaces"&&br()?jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx($p,{})}):jsx(td,{filteredItems:H,groups:ee,emptyMessage:v,onBatchUpdate:Wg}),(n||m)&&jsxs(Fragment,{children:[jsx(Gs,{message:n?o:"Loading catalog..."}),n&&i>0&&s>0&&jsx(Box,{paddingLeft:2,children:jsx(zs,{received:s,total:i})})]}),a&&!m&&t==="discover"&&jsx(Xs,{message:a,onRetry:()=>{l(null),g();},onBack:()=>l(null)}),r&&jsx(rd,{message:r.message,type:r.type}),C&&K&&(t==="discover"?V?.type==="bundle"?e?.phase==="installing"?jsx(yp,{bundle:e.bundle,onComplete:Gg}):jsx(sp,{itemName:K.name,bundle:e?.phase==="detail"?e.bundle:void 0,onInstall:()=>Vg(K.name,K.flowId),onConfirm:Hg,onClose:e?.phase==="detail"?Jg:$}):jsx(np,{itemName:K.name,itemType:V?.type,onInstall:A,onClose:$}):K.type==="mcp"?jsx(dp,{itemName:K.name,itemScope:K.scope??"user",onUninstall:Kg,onClose:$}):jsx(lp,{itemName:K.name,itemScope:K.scope??"user",itemStatus:K.status??"enabled",updateAvailable:K.updateAvailable??false,catalogVersion:V?.version,onUninstall:B,onToggleStatus:X=>G(X),onUpdate:Le,onClose:$})),jsx(Js,{})]})}var L=create((e,t)=>({starterKits:[],selectedStarterKitIndex:0,selectedStarterKit:null,plugins:[],pluginCursorIndex:0,step:"starterKitList",isLoadingStarterKits:false,starterKitsError:null,successCount:0,failedCount:0,summaryActionIndex:0,setStarterKits:r=>e({starterKits:r}),setSelectedStarterKitIndex:r=>e({selectedStarterKitIndex:r}),selectStarterKit:r=>{let n=new Set(ge.getState().installedItems.map(o=>o.name));e({selectedStarterKit:r,plugins:r.plugins.map(o=>({name:o,selected:true,status:n.has(o)?"success":"pending",installed:n.has(o)})),pluginCursorIndex:0,step:"starterKitDetail"});},setPluginCursorIndex:r=>e({pluginCursorIndex:r}),setStep:r=>e({step:r}),setPluginStatus:(r,n,o)=>{let s=t().plugins.map(i=>i.name===r?{...i,status:n,error:o}:i);e({plugins:s});},setPluginDownloadProgress:(r,n,o)=>{let s=t().plugins.map(i=>i.name===r?{...i,downloadProgress:n,downloadTotal:o}:i);e({plugins:s});},setIsLoadingStarterKits:r=>e({isLoadingStarterKits:r}),setStarterKitsError:r=>e({starterKitsError:r}),setSummaryActionIndex:r=>e({summaryActionIndex:r}),computeSummary:()=>{let n=t().plugins.filter(o=>o.selected);e({successCount:n.filter(o=>o.status==="success").length,failedCount:n.filter(o=>o.status==="failed").length});},resetForRetry:()=>{let r=t().plugins.map(n=>n.status==="failed"?{...n,status:"pending",error:void 0}:n);e({plugins:r,step:"installing"});},goBackToList:()=>e({selectedStarterKit:null,plugins:[],pluginCursorIndex:0,step:"starterKitList"})}));Ee();var Xx=3;function sm(){let e=L(c=>c.setStarterKits),t=L(c=>c.setIsLoadingStarterKits),r=L(c=>c.setStarterKitsError),n=L(c=>c.setPluginStatus),o=L(c=>c.setPluginDownloadProgress),s=L(c=>c.setStep),i=L(c=>c.computeSummary),a=useCallback(async()=>{t(true),r(null);try{let c=await ri();e(c);}catch(c){r(c instanceof Error?c.message:String(c));}finally{t(false);}},[t,r,e]);useEffect(()=>{ge.getState().loadFromDisk(),a();},[a]);let l=useRef(0),u=useCallback(async()=>{let c=L.getState().plugins.filter(m=>m.selected&&m.status==="pending");for(let m of c){n(m.name,"installing"),l.current=0;let p="",g=false;for(let f=1;f<=Xx;f++)try{await Ne(m.name,{onDownloadProgress:(h,w)=>{let v=Date.now();(v-l.current>100||h>=w)&&(l.current=v,o(m.name,h,w));}}),n(m.name,"success"),g=!0;break}catch(h){if(h instanceof Xe){n(m.name,"success"),g=true;break}p=h instanceof Error?h.message:"Unknown error";}g||(n(m.name,"failed",p),E(I.CLI_TOOL_INSTALL_FAILED,{tool_id:m.name,tool_type:"skill",source:"internal",error_code:"install_failed",error_message:p,interface:Q().interfaceType}).catch(()=>{}));}let d=Wr();Gr("summary_review"),E(I.CLI_STEP_COMPLETED,{step:"tool_installation",duration_ms:d}).catch(()=>{}),ge.getState().loadFromDisk(),i(),s("summary");},[n,o,i,s]);return {loadStarterKits:a,installSelected:u}}var zo={cursorDelta:0,confirm:false,back:false};function im(e,t){return t.upArrow?{...zo,cursorDelta:-1}:t.downArrow?{...zo,cursorDelta:1}:t.escape?{...zo,back:true}:t.return?{...zo,confirm:true}:zo}var qx={cursorDelta:0,select:false};function am(e,t){return t.upArrow?{cursorDelta:-1,select:false}:t.downArrow?{cursorDelta:1,select:false}:t.return?{cursorDelta:0,select:true}:qx}F();var lm=Gy.memo(function({starterKit:t,isSelected:r}){return jsxs(Box,{flexDirection:"column",paddingBottom:1,children:[jsxs(Box,{children:[jsx(Text,{color:r?"cyan":"gray",children:r?"\u203A ":"\u25CB "}),jsx(Text,{bold:r,color:r?"cyan":"white",children:y(t.name)}),jsxs(Text,{dimColor:true,children:[" \xB7 ",t.plugins.length," ",t.plugins.length===1?"plugin":"plugins"]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:y(t.description)})})]})});var Bl=5;function cm({onRetry:e}){let t=L(c=>c.starterKits),r=L(c=>c.selectedStarterKitIndex),n=L(c=>c.isLoadingStarterKits),o=L(c=>c.starterKitsError);if(n)return jsx(Gs,{message:"Loading Starter Kits..."});if(o)return jsx(Xs,{message:o,onRetry:e,onBack:e});if(t.length===0)return jsx(Rn,{message:"No Starter Kits available."});let s=Math.max(0,r-Math.floor(Bl/2)),i=Math.min(t.length,s+Bl);i===t.length&&(s=Math.max(0,i-Bl));let a=t.slice(s,i),l=s,u=t.length-i;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"})}),l>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2191 ",l," more above"]})}),a.map((c,d)=>jsx(lm,{starterKit:c,isSelected:s+d===r},c.slug)),u>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",u," more below"]})})]})}F();var dm=Gy.memo(function({plugin:t,isCursor:r}){return jsxs(Box,{children:[jsx(Text,{color:r?"cyan":"gray",children:r?"\u203A ":" "}),jsx(Text,{color:"cyan",children:"\u2022"}),jsxs(Text,{bold:r,color:r?"cyan":"white",children:[" ",y(t.name)]}),t.installed&&jsx(Text,{color:"green",children:" (installed)"})]})});F();var Kl=8;function pm(){let e=L(c=>c.selectedStarterKit),t=L(c=>c.plugins),r=L(c=>c.pluginCursorIndex),n=useRef(false);if(useEffect(()=>{e&&!n.current&&(n.current=true,E(I.CLI_KIT_DISPLAYED,{bundle_slug:e.slug,tool_count:t.length}).catch(()=>{}));},[e,t.length]),!e)return jsx(Text,{dimColor:true,children:"No Starter Kit selected."});let o=t.filter(c=>c.installed).length,s=Math.max(0,r-Math.floor(Kl/2)),i=Math.min(t.length,s+Kl);i===t.length&&(s=Math.max(0,i-Kl));let a=t.slice(s,i),l=s,u=t.length-i;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:[jsx(Text,{bold:true,color:"cyan",children:y(e.name)}),jsx(Text,{dimColor:true,children:y(e.description)})]}),jsx(Box,{paddingX:1,paddingBottom:1,children:jsxs(Text,{children:[t.length," plugins to install",o>0&&` \xB7 ${o} already installed`]})}),l>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2191 ",l," more above"]})}),a.map((c,d)=>jsx(dm,{plugin:c,isCursor:s+d===r},c.name)),u>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",u," more below"]})})]})}F();var sb=["Retry failed","Continue anyway"];function mm({name:e,status:t,error:r,downloadProgress:n,downloadTotal:o}){let s=y(e);return t==="installing"?jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(hp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",s]})]}),o!==void 0&&o>0&&n!==void 0&&n>0&&jsx(Box,{paddingLeft:2,children:jsx(zs,{received:n,total:o})})]}):t==="success"?jsx(Box,{children:jsxs(Text,{color:"green",children:["\u2713 ",s]})}):t==="failed"?jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",s]}),r&&jsxs(Text,{dimColor:true,children:[" \u2014 ",y(r)]})]}):jsx(Box,{children:jsxs(Text,{dimColor:true,children:["\u25CB ",s]})})}function fm({onComplete:e,onRetry:t}){let r=L(u=>u.plugins),n=L(u=>u.step),o=L(u=>u.successCount),s=L(u=>u.failedCount),i=L(u=>u.summaryActionIndex),a=r.filter(u=>u.selected),l=useRef(false);return useEffect(()=>{if(n==="summary"&&s===0&&!l.current){l.current=true;let u=setTimeout(e,1500);return ()=>clearTimeout(u)}},[n,s,e]),n==="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:a.map(u=>jsx(mm,{name:u.name,status:u.status,error:u.error,downloadProgress:u.downloadProgress,downloadTotal:u.downloadTotal},u.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:[o>0&&jsxs(Text,{color:"green",children:["\u2713 ",o," ",o===1?"plugin":"plugins"," installed successfully"]}),s>0&&jsxs(Text,{color:"red",children:["\u2717 ",s," ",s===1?"plugin":"plugins"," failed"]})]}),s>0&&jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:a.filter(u=>u.status==="failed").map(u=>jsx(mm,{name:u.name,status:u.status,error:u.error},u.name))}),s>0&&jsx(Box,{flexDirection:"column",paddingX:1,children:sb.map((u,c)=>jsx(Box,{children:jsxs(Text,{bold:c===i,color:c===i?"cyan":void 0,children:[c===i?"\u203A ":" ",u]})},u))}),s===0&&jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:"Proceeding to main screen..."})})]})}function gm(){let e=L(k=>k.step),t=L(k=>k.starterKits),r=L(k=>k.selectedStarterKitIndex),n=L(k=>k.setSelectedStarterKitIndex),o=L(k=>k.selectStarterKit),s=L(k=>k.plugins),i=L(k=>k.pluginCursorIndex),a=L(k=>k.setPluginCursorIndex),l=L(k=>k.setStep),u=L(k=>k.summaryActionIndex),c=L(k=>k.setSummaryActionIndex),d=L(k=>k.failedCount),m=L(k=>k.resetForRetry),p=L(k=>k.goBackToList),g=S(k=>k.setScreen),f=S(k=>k.setFocus),h=S(k=>k.focus),w=rt(k=>k.setJustAuthenticated),v=rt(k=>k.justAuthenticated),{loadStarterKits:D,installSelected:M}=sm(),C=useRef(false);useEffect(()=>{e==="starterKitList"?(f("starterKitList"),C.current||(C.current=true,Gr("bundle_selection"))):f(e==="starterKitDetail"?"starterKitDetail":"installProgress");},[e,f]);let $=useCallback(async()=>{let k=L.getState().selectedStarterKit;if(k){let ee=await Z();ee&&await hr({...ee,starterKit:k.slug});}E(I.CLI_STEP_COMPLETED,{step:"summary_review",duration_ms:Wr()}).catch(()=>{});let{successCount:H}=L.getState();E(I.CLI_ONBOARDING_COMPLETED,{duration_ms:wr(),tools_installed_count:H}).catch(()=>{}),w(false),f("verify"),g("verify");},[w,f,g]),_=useCallback(()=>{m(),M();},[m,M]),O=useCallback(()=>{D();},[D]),te=useCallback(()=>{f("verify"),g("verify");},[f,g]);return useInput((k,H)=>{if(H.escape)ks("esc"),te();else if(H.upArrow&&r>0)n(r-1);else if(H.downArrow&&r<t.length-1)n(r+1);else if(H.return&&t.length>0){let ee=Wr();o(t[r]),Gr("kit_display"),E(I.CLI_STEP_COMPLETED,{step:"bundle_selection",duration_ms:ee}).catch(()=>{});}},{isActive:h==="starterKitList"}),useInput((k,H)=>{let ee=im(k,H);if(ee.cursorDelta!==0){let K=i+ee.cursorDelta;K>=0&&K<s.length&&a(K);}if(ee.confirm){let K=L.getState().selectedStarterKit;K&&(async()=>(await Z())?.starterKit!==K.slug&&E(I.CLI_KIT_ACCEPTED,{bundle_slug:K.slug}).catch(()=>{}))();let V=Wr();Gr("kit_confirmation"),E(I.CLI_STEP_COMPLETED,{step:"kit_display",duration_ms:V}).catch(()=>{});let z=Wr();Gr("tool_installation"),E(I.CLI_STEP_COMPLETED,{step:"kit_confirmation",duration_ms:z}).catch(()=>{}),l("installing"),M();}if(ee.back){let K=L.getState().selectedStarterKit;K&&E(I.CLI_KIT_REJECTED,{bundle_slug:K.slug}).catch(()=>{}),p();}},{isActive:h==="starterKitDetail"}),useInput((k,H)=>{if(d===0)return;let ee=am(k,H);if(ee.cursorDelta!==0){let K=u+ee.cursorDelta;K>=0&&K<=1&&c(K);}ee.select&&(u===0?_():$());},{isActive:h==="installProgress"&&e==="summary"}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(An,{}),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."}),!v&&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(cm,{onRetry:O}),e==="starterKitDetail"&&jsx(pm,{}),(e==="installing"||e==="summary")&&jsx(fm,{onComplete:$,onRetry:_})]}),jsx(Js,{})]})}j();var wm=null;function Sm(){return wm}async function $i(){let t=Zr().filter(r=>r.installedVersion===null&&r.installMethod===null);for(let r of t){let n=se.find(i=>i.alias===r.alias);if(!n)continue;let{installedVersion:o,installMethod:s}=await xm(n);(o||s)&&await yt({...r,installedVersion:o,installMethod:s});}}async function xm(e){let t=e.platforms[process.platform];if(t?.status!=="supported")return {installedVersion:null,installMethod:null};for(let r of t.strategies)if(r.type!=="curl")try{let o=await Ot(r.type).getInstalledVersion(e);if(o)return {installedVersion:o,installMethod:r.type}}catch{}return {installedVersion:null,installMethod:null}}async function Zn(e){let t=await Promise.all(e.map(r=>lb(r)));return wm=t,t}async function lb(e){let t=hm(e.versionCommand);t==="permission-denied"&&(cb(e.versionCommand[0]),t=hm(e.versionCommand));let n=t==="installed"&&(!e.configCheck||e.configCheck()),o=e.platforms[process.platform],s=o?.status==="supported"?o.strategies:[],a=(await Promise.all(s.map(async l=>{try{return await Ot(l.type).isAvailable()?l.type:null}catch{return null}}))).filter(l=>l!==null);if(n&&!nt(e.alias)){let{installedVersion:l,installMethod:u}=await xm(e);await yt({alias:e.alias,name:e.name,installedVersion:l,installMethod:u,installedAt:null,lastChecked:new Date().toISOString()});}return {module:e,alreadyInstalled:n,availableStrategies:a}}function hm(e){if(e.length===0)return "not-found";try{let t=spawnSync(e[0],e.slice(1),{timeout:3e3,stdio:"pipe",shell:process.platform==="win32"});return t.status===0?"installed":t.status===126?"permission-denied":"not-found"}catch{return "not-found"}}function cb(e){if(process.platform!=="win32")try{let t=spawnSync("which",[e],{stdio:"pipe"});if(t.status!==0)return;let r=t.stdout.toString().trim(),n=ve__default.realpathSync(r),{mode:o}=ve__default.statSync(n);ve__default.chmodSync(n,o|73);}catch{}}function pb(e){return e.filter(t=>t.module.platforms[process.platform]?.status==="supported").filter(t=>!t.alreadyInstalled).map(t=>({module:t.module,alreadyInstalled:t.alreadyInstalled,checked:!t.alreadyInstalled&&(t.availableStrategies.length>0||t.module.required===true),selectedStrategy:t.availableStrategies[0]??null,availableStrategies:t.availableStrategies}))}function Pm(e,t){let[r,n]=useState(()=>pb(e)),[o,s]=useState(0),i=useRef(o);useEffect(()=>{i.current=o;},[o]);let a=useRef(r);useEffect(()=>{a.current=r;},[r]);let l=useCallback(d=>{n(m=>m.map(p=>p.module.alias!==d||p.module.required?p:{...p,checked:!p.checked}));},[]),u=useCallback((d,m)=>{n(p=>p.map(g=>g.module.alias===d?{...g,selectedStrategy:m}:g));},[]);useInput((d,m)=>{let p=i.current,g=a.current,f=m.upArrow||d==="[A",h=m.downArrow||d==="[B";if(f||h)f&&p>0?s(p-1):h&&p<g.length-1&&s(p+1);else if(d===" "){let w=g[p];w&&!w.module.required&&l(w.module.alias);}else if(m.tab){let w=g[p];if(w&&w.availableStrategies.length>1){let v=w.availableStrategies.indexOf(w.selectedStrategy??w.availableStrategies[0]),D=w.availableStrategies[(v+1)%w.availableStrategies.length];n(M=>M.map(C=>C.module.alias===w.module.alias?{...C,selectedStrategy:D}:C));}}},{isActive:t});let c=useMemo(()=>r.filter(d=>d.checked),[r]);return {items:r,focusedIndex:o,toggle:l,setStrategy:u,confirmedItems:c}}F();function Cm({probeResults:e,onConfirm:t}){let r=S(p=>p.focus),n=S(p=>p.actionMenuOpen),o=S(p=>p.setActionMenuOpen),s=S(p=>p.setFocus),{items:i,focusedIndex:a,confirmedItems:l}=Pm(e,r==="moduleSetup"),u=useCallback(()=>{o(false),s("moduleSetup");},[o,s]),c=useCallback(p=>{(p==="Install"||p==="Skip")&&t(l),u();},[l,t,u]);useInput((p,g)=>{g.return&&(o(true),s("actionMenu"));},{isActive:r==="moduleSetup"});let d=l.length>0?["Install","Cancel"]:["Skip","Cancel"],m=l.length>0?`Install ${l.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:i.map((p,g)=>{let f=g===a,h=y(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:y(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"})}),n&&jsx(ot,{itemName:m,actions:d,onAction:c,onClose:u})]})}var yb=/^https?:\/\/.+/;function km({onConfirm:e}){let[t,r]=useState("confirm"),[n,o]=useState(""),[s,i]=useState(false),a=useRef("");return useInput((l,u)=>{if(t==="confirm"){if(l==="y"||l==="Y"){r("input");return}if(l==="n"||l==="N"||u.return){e(null);return}}if(t==="input"){if(u.escape){a.current="",o(""),r("confirm");return}if(u.return){let c=a.current.trim();c.length>0&&yb.test(c)?(i(false),e(c)):c.length>0&&i(true);return}if(u.backspace||u.delete){a.current=a.current.slice(0,-1),o(a.current);return}l&&!u.ctrl&&!u.meta&&(a.current=a.current+l,o(a.current),i(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:[t==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),t==="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:n}),jsx(Text,{color:"cyan",children:"\u2588"})]}),s&&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 Sb(e){let t=e.module.platforms[process.platform];return (t?.status==="supported"?t.strategies:[]).map(n=>n.type==="npm"?`npm install -g ${n.package}`:n.type==="homebrew"?`brew install ${n.formula}`:"curl (see docs)").join(" or ")}function $m(e,t){let[r,n]=useState(()=>e.map(d=>({alias:d.module.alias,name:d.module.name,status:"pending"}))),[o,s]=useState(false),i=useCallback((d,m)=>{n(p=>p.map(g=>g.alias===d?{...g,...m}:g));},[]),a=useCallback(async()=>{for(let d of e){let m=Sb(d);if(!d.selectedStrategy){let p=m?`No package manager available. Install manually: ${m}`:"No package manager available for this platform";i(d.module.alias,{status:"failed",error:p,manualInstallHint:m||void 0});continue}i(d.module.alias,{status:"installing"});try{let p=await Er(d.module,"onboarding",d.selectedStrategy,t);p.success?i(d.module.alias,{status:"installed",pendingSetupCommand:p.configCheckFailed?"flow-ai-obs init \u2014 run manually to complete setup (required for metrics collection)":p.pendingInteractiveSetup?.join(" ")}):i(d.module.alias,{status:"failed",error:p.error?.message??"Installation failed",manualInstallHint:m});}catch(p){i(d.module.alias,{status:"failed",error:p instanceof Error?p.message:"Unknown error",manualInstallHint:m});}}s(true);},[e,i,t]),l=useMemo(()=>r.filter(d=>d.status==="installed").length,[r]),u=useMemo(()=>r.filter(d=>d.status==="failed").length,[r]),c=useMemo(()=>r.filter(d=>d.status==="skipped").length,[r]);return {modules:r,install:a,isComplete:o,installedCount:l,failedCount:u,skippedCount:c}}j();F();function Lm({module:e}){let t=y(e.name);if(e.status==="installing")return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(hp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",t," \u2014 Installing..."]})]});if(e.status==="installed"){let r=!!e.pendingSetupCommand;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{children:jsxs(Text,{color:r?"red":"green",children:[r?"\u2717":"\u2713"," ",t]})}),e.pendingSetupCommand&&jsx(Box,{paddingLeft:2,children:jsx(Text,{color:"red",children:y(e.pendingSetupCommand)})})]})}return e.status==="failed"?jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsxs(Text,{color:"red",children:["\u2717 ",t]}),e.error&&jsxs(Text,{dimColor:true,children:[" \u2014 ",y(e.error)]})]}),e.manualInstallHint&&jsx(Box,{paddingLeft:2,children:jsxs(Text,{dimColor:true,children:["Install manually: ",y(e.manualInstallHint)]})})]}):e.status==="skipped"?jsx(Box,{children:jsxs(Text,{dimColor:true,children:["- ",t," (not supported on this platform)"]})}):jsx(Box,{children:jsxs(Text,{dimColor:true,children:["\u25CB ",t]})})}function Om({confirmedItems:e,customUrl:t}){let r=S(w=>w.setScreen),n=S(w=>w.setFocus),{modules:o,install:s,isComplete:i,installedCount:a,failedCount:l,skippedCount:u}=$m(e,t),c=o.some(w=>w.pendingSetupCommand),d=useRef(false),m=useRef(false);useEffect(()=>{d.current||(d.current=true,s());},[s]);let p=useCallback(()=>{Qr().catch(()=>{}),n("list");let w=ie().some(v=>v.name===ce);r(w?"main":"claudeMdSuggestion");},[n,r]);useEffect(()=>{if(i&&l===0&&!c&&!m.current){m.current=true;let w=setTimeout(p,1500);return ()=>clearTimeout(w)}},[i,l,c,p]),useInput((w,v)=>{v.return&&p();},{isActive:i});let g=o.filter(w=>w.pendingSetupCommand).length,f=a-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")),l>0&&h.push(jsxs(Text,{color:"red",children:[l," failed"]},"f")),u>0&&h.push(jsxs(Text,{dimColor:true,children:[u," skipped"]},"s")),jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:jsx(Text,{bold:true,children:i?"Modules ready":"Setting up modules..."})}),jsx(Box,{flexDirection:"column",paddingX:1,paddingBottom:1,children:o.map(w=>jsx(Lm,{module:w},w.alias))}),i&&jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:h.reduce((w,v,D)=>(D>0&&w.push(jsx(Text,{children:" | "},`sep-${D}`)),w.push(v),w),[])}),jsx(Box,{paddingX:1,children:l>0||c?jsx(Text,{dimColor:true,children:"Press Enter to continue"}):jsx(Text,{dimColor:true,children:"Proceeding..."})})]})]})}function Nm(){let[e,t]=useState("loading"),[r,n]=useState([]),[o,s]=useState([]),[i,a]=useState(null),l=S(p=>p.setFocus),u=S(p=>p.setScreen),c=useCallback(p=>{if(xu(p)){Qr().catch(()=>{}),l("list");let f=ie().some(h=>h.name===ce);u(f?"main":"claudeMdSuggestion");}else n(p),t("selection");},[l,u]);useEffect(()=>{let p=Sm();if(p){c(p);return}Zn(se).then(c).catch(()=>{n([]),t("selection");});},[c]);let d=useCallback(p=>{s(p);let g=p.some(f=>f.module.alias==="metrics");t(g?"customUrl":"installation");},[]),m=useCallback(p=>{a(p),t("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(Cm,{probeResults:r,onConfirm:d}),e==="customUrl"&&jsx(km,{onConfirm:m}),e==="installation"&&jsx(Om,{confirmedItems:o,customUrl:i})]})}j();R();var Ab=x("ClaudeMdSuggestion"),Rb=[`Install ${ce}`,"Skip for now"],$b=["Retry","Skip for now"];function jm(){let e=S(m=>m.setScreen),t=S(m=>m.setFocus),r=L(m=>m.successCount),[n,o]=useState("prompt"),[s,i]=useState(0),a=useRef(0),l=useCallback(()=>{t("list"),e("main");},[t,e]),u=useCallback(()=>{E(I.CLI_CLAUDE_MD_SKIPPED,{interface:"tui"}).catch(()=>{}),l();},[l]),c=useCallback(async()=>{a.current+=1,E(I.CLI_CLAUDE_MD_ACCEPTED,{interface:"tui",attempt:a.current}).catch(()=>{}),o("installing");try{await Ne(ce),o("installed");}catch(m){if(m instanceof Xe){o("installed");return}Ab.warn(`Failed to install ${ce}: ${m instanceof Error?m.message:m}`),o("error");}},[]),d=n==="error"?$b:Rb;return useInput((m,p)=>{if(p.escape){n==="prompt"||n==="error"?u():n==="installed"&&l();return}if(n==="prompt"||n==="error"){p.upArrow&&s>0?i(s-1):p.downArrow&&s<d.length-1?i(s+1):p.return&&(s===0?(i(0),c()):u());return}n==="installed"&&p.return&&l();}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(An,{}),jsxs(Box,{flexDirection:"column",paddingX:1,gap:1,children:[jsx(Text,{color:"green",bold:true,children:r>0?"\u2713 Starter kit installed!":"\u2713 Setup complete!"}),n==="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(Fm,{options:d,cursorIndex:s}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]}),n==="installing"&&jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(hp,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" Installing ",ce,"..."]})]}),n==="installed"&&jsxs(Fragment,{children:[jsxs(Text,{color:"green",bold:true,children:["\u2713 ",ce," 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:["/",ce]})]}),jsx(Text,{children:"Claude will guide you through the rest."}),jsx(Text,{dimColor:true,children:"Press Enter to continue to the catalog..."})]}),n==="error"&&jsxs(Fragment,{children:[jsxs(Text,{color:"red",bold:true,children:["\u2717 Failed to install ",ce]}),jsx(Fm,{options:d,cursorIndex:s}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]})]})]})}function Fm({options:e,cursorIndex:t}){return jsx(Box,{flexDirection:"column",children:e.map((r,n)=>jsxs(Text,{bold:n===t,color:n===t?"cyan":void 0,children:[n===t?"\u203A ":" ",r]},r))})}var Db=promisify(execFile),Oi="@ciandt-flow/cli";async function Km(){let e=ue;if(kl.prerelease(e)||process.env.NODE_ENV==="development")return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Oi};try{let t=await fetch(`https://registry.npmjs.org/${Oi}/latest`);if(!t.ok)throw new Error(`Registry returned ${t.status}`);let n=(await t.json()).version;return {currentVersion:e,latestVersion:n,isOutdated:n!==e,packageName:Oi}}catch{return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:Oi}}}async function Ui(e){try{return await Db(qt(),["install","-g",e.packageName],{timeout:6e4,shell:process.platform==="win32"}),{success:!0}}catch(t){return {success:false,error:String(t)}}}async function Ob(e){let t=nt(e.alias);if(!t?.installMethod)return t?.installedVersion??null;try{let n=await Ot(t.installMethod).getInstalledVersion(e);return n&&n!==t.installedVersion&&await yt({...t,installedVersion:n,lastChecked:new Date().toISOString()}),n??t.installedVersion}catch{return t.installedVersion}}async function Vm(e){let t=await Ob(e),r=null,n=AbortSignal.timeout(3e4);try{if(e.versionCheck.type==="npm-registry"){let s=await fetch(`https://registry.npmjs.org/${e.versionCheck.package}/latest`,{signal:n});if(!s.ok)throw new Error(`Registry returned ${s.status}`);r=(await s.json()).version;}else if(e.versionCheck.type==="github-releases"){let s=await fetch(`https://api.github.com/repos/${e.versionCheck.repo}/releases/latest`,{signal:n});if(!s.ok)throw new Error(`GitHub returned ${s.status}`);r=(await s.json()).tag_name.replace(/^v/,"");}}catch{}let o=t!==null&&r!==null&&t!==r;return {moduleAlias:e.alias,currentVersion:t,latestVersion:r,isOutdated:o}}async function Hm(e,t){let r=nt(e.alias);if(!r?.installMethod)return {success:false,error:"Unknown install method"};let o=await Ot(r.installMethod).update(e,t.currentVersion??"");return o.success?(await yt({...r,installedVersion:o.version??r.installedVersion,lastChecked:new Date().toISOString()}),{success:true,newVersion:o.version}):{success:false,error:o.error?.message}}function Jm(e){let r=nt(e.alias)?.installMethod,n=e.platforms[process.platform];if(n?.status==="supported"){if(r==="npm"){let o=n.strategies.find(s=>s.type==="npm");if(o?.type==="npm")return `npm install -g ${o.package}`}if(r==="homebrew"){let o=n.strategies.find(s=>s.type==="homebrew");if(o?.type==="homebrew")return `brew upgrade ${o.formula}`}}}function Gm(){let[e,t]=useState({outcome:"running",items:[{id:"cli",label:"@ciandt-flow/cli",status:"pending"},...se.map(n=>({id:n.alias,label:n.name,status:"pending"}))]}),r=useCallback((n,o)=>{t(s=>({...s,items:s.items.map(i=>i.id===n?{...i,...o}:i)}));},[]);return useEffect(()=>{async function n(){try{let[o,s,i]=await Promise.all([Km(),Zn(se),Promise.all(se.map(l=>Vm(l)))]);if($i(),o.isOutdated){r("cli",{status:"updating",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`}),(await Ui(o)).success?(r("cli",{status:"updated",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`}),t(u=>({...u,outcome:"cli-updated"}))):(r("cli",{status:"error",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`,manualCommand:`npm install -g ${o.packageName}`}),t(u=>({...u,outcome:"cli-update-failed"})));return}r("cli",{status:"ok",detail:`v${o.currentVersion}`});let a=s.some(l=>!l.alreadyInstalled);for(let l of s)l.alreadyInstalled||r(l.module.alias,{status:"missing"});if(a){t(l=>({...l,outcome:"module-missing"}));return}for(let l of i){let u=se.find(d=>d.alias===l.moduleAlias);if(!u)continue;if(!l.isOutdated){r(l.moduleAlias,{status:"ok",detail:l.currentVersion?`v${l.currentVersion}`:void 0});continue}r(l.moduleAlias,{status:"updating",detail:`v${l.currentVersion} \u2192 v${l.latestVersion}`});let c=await Hm(u,l);c.success?r(l.moduleAlias,{status:"updated",detail:`v${c.newVersion}`}):r(l.moduleAlias,{status:"error",detail:`v${l.currentVersion} \u2192 v${l.latestVersion}`,manualCommand:Jm(u)});}t(l=>({...l,items:l.items.map(u=>u.status==="pending"?{...u,status:"ok"}:u)})),await Qr(),t(l=>({...l,outcome:"done"}));}catch{await Qr(),t(o=>({...o,outcome:"done"}));}}n();},[r]),e}j();function Kb({item:e}){return e.status==="pending"||e.status==="updating"?jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(hp,{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 Vb({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 Wm(){let{outcome:e,items:t}=Gm(),r=S(o=>o.setScreen),n=S(o=>o.setFocus);return useEffect(()=>{if(e==="done"){let o=setTimeout(()=>{let s=ie().some(i=>i.name===ce);r(s?"main":"claudeMdSuggestion"),n("list");},1500);return ()=>clearTimeout(o)}if(e==="module-missing"){let o=setTimeout(()=>{r("moduleSetup"),n("moduleSetup");},500);return ()=>clearTimeout(o)}},[e,r,n]),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:t.map(o=>jsx(Kb,{item:o},o.id))}),e!=="running"&&jsx(Box,{marginTop:1,children:jsx(Vb,{outcome:e})})]})}Ee();En();R();la();var Wb={debug:"gray",info:"cyan",warn:"yellow",error:"red"},zm=10;function Xm(){let[e,t]=useState(aa());useEffect(()=>Uc(()=>{t([...aa()]);}),[]);let r=e.slice(-zm);return jsxs(Box,{flexDirection:"column",borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsxs(Text,{color:"cyan",bold:true,children:["Debug Log (last ",zm,") \u2014 press Ctrl+D to close"]}),r.length===0?jsx(Text,{dimColor:true,children:"No log entries yet"}):r.map((n,o)=>jsxs(Text,{color:Wb[n.level],children:["[",n.level.toUpperCase(),"] [",n.module,"] ",n.message]},o))]})}var Yb=x("app"),Zb={auth:$u,starterKitSetup:gm,moduleSetup:Nm,claudeMdSuggestion:jm,verify:Wm,main:nm};function Zm(){let{setScreen:e,setFocus:t}=S.getState();e("auth"),t("auth");}function Ks(e){let{setScreen:t,setFocus:r}=S.getState();!e.starterKit||e.starterKit.trim()===""?(t("starterKitSetup"),r("starterKitList")):(t("verify"),r("verify"));}function Qm(){E(I.CLI_SESSION_STARTED,{cli_version:ue,os:process.platform,node_version:process.version,duration_ms:wr(),interface:"tui"}).catch(()=>{});}async function tf(){let e=await Z();if(e&&wu()&&await yr()){e.customUrl&&Rt(e.customUrl);let{clientSecret:n,...o}=e;rt.getState().setCredentials(o),Qm(),Ks(e);return}if(!e){Zm();return}try{e.customUrl&&Rt(e.customUrl),await Lt();}catch(n){Yb.debug(`Token validation failed: ${String(n)}`),Zm();return}Qm();let{clientSecret:t,...r}=e;rt.getState().setCredentials(r),Ks(e);}function rf(){let{columns:e,rows:t}=useWindowSize(),r=S(a=>a.screen),n=Zb[r],{pendingExit:o}=cu(),s=S(a=>a.debugPanelOpen),i=!!process.env.DEBUG;return useInput((a,l)=>{if(i&&l.ctrl&&a==="d"){let u=S.getState().debugPanelOpen;S.getState().setDebugPanelOpen(!u);}}),n?jsxs(Box,{flexDirection:"column",width:e,height:t,children:[jsx(n,{}),i&&s&&jsx(Xm,{}),o&&jsx(Box,{paddingX:1,children:jsx(Text,{color:"yellow",children:"Press Ctrl+C again to quit"})})]}):jsxs(Text,{color:"red",children:["Unknown screen: ",r]})}Ee();Ts();F();j();R();uo();Ee();async function ec(e,t={}){let r=$s({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant,customUrl:e.customUrl,starterKit:e.starterKit},t);return Ls(r),await hr(e),{jwt:r.jwt,anthropicBaseUrl:r.anthropicBaseUrl,previousToken:r.previousToken,previousBaseUrl:r.previousBaseUrl,hadExistingFile:r.hadExistingFile}}var Pt=x("auth");function of(){We.clearFallbackFile(),Is();}var Qb=3,nf=3,sf=` \u2139 The data collected during setup is used solely to improve
|
|
122
122
|
Flow's internal tools and will not be shared externally.
|
|
123
|
-
`;function
|
|
123
|
+
`;function Gt(e,t={}){return new Promise((r,n)=>{let{masked:o=false,defaultValue:s=""}=t;process.stdout.write(e+s);let i=s,a=c=>{if(c===""){l(),n(new Error("SIGINT"));return}if(c==="\r"||c===`
|
|
124
124
|
`){l(),process.stdout.write(`
|
|
125
|
-
`),r(i);return}if(c==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}c.startsWith("\x1B")||(i+=c,process.stdout.write(o?"*".repeat(c.length):c));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",a),process.removeListener("uncaughtException",u),process.removeListener("unhandledRejection",u),process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u);}function u(){try{process.stdin.setRawMode(!1);}catch{}process.exit(1);}process.on("uncaughtException",u),process.on("unhandledRejection",u),process.on("SIGINT",u),process.on("SIGTERM",u),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",a);})}async function
|
|
126
|
-
`+T.yellow(" \u26A0 ")+`${
|
|
127
|
-
`),(await
|
|
128
|
-
`));}}async function
|
|
129
|
-
`));}}async function
|
|
125
|
+
`),r(i);return}if(c==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}c.startsWith("\x1B")||(i+=c,process.stdout.write(o?"*".repeat(c.length):c));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",a),process.removeListener("uncaughtException",u),process.removeListener("unhandledRejection",u),process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u);}function u(){try{process.stdin.setRawMode(!1);}catch{}process.exit(1);}process.on("uncaughtException",u),process.on("unhandledRejection",u),process.on("SIGINT",u),process.on("SIGTERM",u),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",a);})}async function eI(){let e=qr();return process.stdout.write(`
|
|
126
|
+
`+T.yellow(" \u26A0 ")+`${y(e)} contains invalid JSON.
|
|
127
|
+
`),(await Gt(T.cyan(" ? ")+"Overwrite it with a fresh file containing only the auth token? (y/N): ")).trim().toLowerCase()==="y"}async function af(e,t,r){try{await ec(e,{jwtOverride:r});return}catch(n){if(!(n instanceof Yr))throw n;if(!t)throw new Error(`${n.message}. Fix or remove ${qr()} and retry.`);if(!await eI())throw new Error("Setup cancelled: settings.json must be valid JSON to continue");await ec(e,{allowOverwriteMalformed:true,jwtOverride:r});}}async function tI(){if((await Gt(T.cyan(" ? ")+"Does your organization use a custom Flow URL? (y/N): ")).trim().toLowerCase()!=="y")return null;for(;;){let t=(await Gt(T.cyan(" ? ")+"Enter custom Flow URL: ")).trim();if(mn.test(t))return t;process.stderr.write(T.yellow(` \u26A0 ${fn}. Try again.
|
|
128
|
+
`));}}async function rI(){let e=(await Gt(T.cyan(" ? ")+"Does your email use the @ciandt.com domain? (Y/n): ")).trim();if(e===""||e.toLowerCase()==="y")return null;for(;;){let t=(await Gt(T.cyan(" ? ")+"Enter your email address: ")).trim();if(gn.test(t))return t;process.stderr.write(T.yellow(` \u26A0 ${hn}. Try again.
|
|
129
|
+
`));}}async function lf(e,t){process.stdout.write(T.dim(" Installing flow-ai-obs..."));let{npmFailed:r,initFailed:n,unexpectedError:o}=await js(e,t);return r?process.stdout.write(T.yellow(` \u26A0 npm install failed. Please contact Flow support.
|
|
130
130
|
`)):o?process.stdout.write(T.yellow(` \u26A0 Unexpected error. Please contact Flow support.
|
|
131
131
|
`)):n?process.stdout.write(T.yellow(`
|
|
132
132
|
\u26A0 flow-ai-obs could not be initialized \u2014 domain authentication failure. Please contact support.
|
|
133
133
|
`)):process.stdout.write(T.green(` done
|
|
134
|
-
`)),{initFailed:n}}async function
|
|
134
|
+
`)),{initFailed:n}}async function cf(){for(let e=1;e<=nf;e++)try{return await ri()}catch{if(e===nf)throw new Error("Failed to fetch starter kits after 3 attempts")}return []}async function uf(){let e=await cf();if(e.length===0)throw new Error("No starter kits available. Please contact your administrator.");let t=(await Gt(T.cyan(" ? ")+"Install a starter kit? (y/N): ")).trim().toLowerCase();if(t!=="y"&&t!=="yes")return null;for(process.stdout.write(`
|
|
135
135
|
`+T.cyan(" ? ")+`Starter Kit:
|
|
136
|
-
`),e.forEach((r,n)=>{process.stdout.write(` ${T.cyan(`${n+1})`)} ${
|
|
136
|
+
`),e.forEach((r,n)=>{process.stdout.write(` ${T.cyan(`${n+1})`)} ${y(r.name)}
|
|
137
137
|
`);}),process.stdout.write(`
|
|
138
|
-
`);;){let r=(await
|
|
139
|
-
`));}}async function
|
|
140
|
-
Starter kit '${
|
|
138
|
+
`);;){let r=(await Gt(T.cyan(" ? ")+`Select starter kit (1-${e.length}): `)).trim(),n=parseInt(r,10)-1;if(!isNaN(n)&&n>=0&&n<e.length)return e[n];process.stderr.write(T.yellow(` \u26A0 Invalid selection. Please try again.
|
|
139
|
+
`));}}async function df(e){if(e.plugins.length===0)return process.stdout.write(T.dim(`
|
|
140
|
+
Starter kit '${y(e.name)}' has no plugins to install.
|
|
141
141
|
`)),true;process.stdout.write(`
|
|
142
|
-
Installing ${e.plugins.length} plugins from '${
|
|
143
|
-
`);let t=0,r=0,n=e.plugins.length;for(let o of e.plugins){let s=t+r+1;process.stdout.write(T.dim(` [${s}/${n}] Installing ${
|
|
142
|
+
Installing ${e.plugins.length} plugins from '${y(e.name)}'...
|
|
143
|
+
`);let t=0,r=0,n=e.plugins.length;for(let o of e.plugins){let s=t+r+1;process.stdout.write(T.dim(` [${s}/${n}] Installing ${y(o)}...`));let i=false;for(let a=1;a<=Qb;a++)try{await Ne(o),t++,i=!0;break}catch(l){if(l instanceof Xe){t++,i=true;break}}i?process.stdout.write(T.green(` done
|
|
144
144
|
`)):(r++,process.stdout.write(T.red(` failed
|
|
145
|
-
`)));}return r===0?process.stdout.write(T.green(` \u2713 Starter kit '${
|
|
146
|
-
`)):process.stdout.write(T.yellow(` \u26A0 Starter kit '${
|
|
147
|
-
`)),r===0}async function
|
|
145
|
+
`)));}return r===0?process.stdout.write(T.green(` \u2713 Starter kit '${y(e.name)}' selected. ${t}/${n} plugins installed successfully.
|
|
146
|
+
`)):process.stdout.write(T.yellow(` \u26A0 Starter kit '${y(e.name)}' selected. ${t}/${n} plugins installed. ${r} failed.
|
|
147
|
+
`)),r===0}async function pf(){process.stdout.write(`
|
|
148
148
|
`),process.stdout.write(T.bold(` Personalize your Claude Code
|
|
149
149
|
`)),process.stdout.write(T.dim(` This plugin helps Claude understand your preferences and work style.
|
|
150
150
|
|
|
151
|
-
`));let e=(await
|
|
151
|
+
`));let e=(await Gt(T.cyan(" ? ")+`Install ${ce}? (Y/n): `)).trim();if(e!==""&&e.toLowerCase()!=="y"){E(I.CLI_CLAUDE_MD_SKIPPED,{interface:"cli"}).catch(()=>{}),process.stdout.write(T.dim(`
|
|
152
152
|
You can always install it later from the catalog.
|
|
153
|
-
`));return}
|
|
154
|
-
`));}catch(t){if(t instanceof
|
|
153
|
+
`));return}E(I.CLI_CLAUDE_MD_ACCEPTED,{interface:"cli"}).catch(()=>{}),process.stdout.write(T.dim(` Installing ${ce}...`));try{await Ne(ce),process.stdout.write(T.green(` done
|
|
154
|
+
`));}catch(t){if(t instanceof Xe)process.stdout.write(T.green(` already installed
|
|
155
155
|
`));else {Pt.warn(`Failed to install ${ce}: ${t instanceof Error?t.message:t}`),process.stdout.write(T.red(` failed
|
|
156
156
|
`)),process.stdout.write(T.dim(` You can install it later from the catalog.
|
|
157
157
|
`));return}}process.stdout.write(`
|
|
158
158
|
`),process.stdout.write(` Open Claude in a new terminal or in VS Code and type:
|
|
159
159
|
`),process.stdout.write(T.cyan.bold(` /${ce}
|
|
160
160
|
`)),process.stdout.write(` Claude will guide you through the rest.
|
|
161
|
-
`);}async function
|
|
162
|
-
`+
|
|
163
|
-
`),e.customUrl!==void 0&&!
|
|
164
|
-
`)),1;if(e.customEmail!==void 0&&!
|
|
165
|
-
`)),1;let t=e.jwt.trim(),r;try{r=
|
|
166
|
-
`)),1}e.customUrl&&
|
|
167
|
-
`)),1}let{initFailed:n}=await
|
|
161
|
+
`);}async function nI(e){if(of(),process.stdout.write(`
|
|
162
|
+
`+sf+`
|
|
163
|
+
`),e.customUrl!==void 0&&!mn.test(e.customUrl))return process.stderr.write(T.red(` \u2717 ${fn}.
|
|
164
|
+
`)),1;if(e.customEmail!==void 0&&!gn.test(e.customEmail))return process.stderr.write(T.red(` \u2717 ${hn}.
|
|
165
|
+
`)),1;let t=e.jwt.trim(),r;try{r=bo(t);}catch(o){let s=y(o instanceof Error?o.message:"Invalid JWT");return process.stderr.write(T.red(` \u2717 ${s}
|
|
166
|
+
`)),1}e.customUrl&&Rt(e.customUrl),Pt.debug(`[${r.tenant}] Authenticating tenant via JWT`);try{await Jr(r);}catch(o){let s=y(o instanceof Error?o.message:"unknown error");return Pt.error(`[${r.tenant}] Authentication failed: ${s}`),process.stderr.write(T.red(` \u2717 Authentication failed: ${s}
|
|
167
|
+
`)),1}let{initFailed:n}=await lf(e.customUrl??null,e.customEmail??null);try{let o;if(e.starterKit){let s=await cf(),i=s.find(a=>a.slug===e.starterKit);if(!i){process.stderr.write(T.red(` \u2717 Starter kit '${y(e.starterKit)}' not found.
|
|
168
168
|
`)),process.stderr.write(` Available starter kits:
|
|
169
|
-
`);for(let a of s)process.stderr.write(` - ${
|
|
170
|
-
`);return 1}o=i;}else o=await
|
|
169
|
+
`);for(let a of s)process.stderr.write(` - ${y(a.slug)} (${y(a.name)})
|
|
170
|
+
`);return 1}o=i;}else o=await uf();return await af({...r,starterKit:o?.slug,customUrl:e.customUrl},!1,t),o?await df(o):process.stdout.write(T.dim(`
|
|
171
171
|
Skipped starter kit installation.
|
|
172
|
-
`)),await
|
|
173
|
-
\u2713 Setup complete. Tenant: ${
|
|
172
|
+
`)),await pf(),Pt.info(`[${r.tenant}] Authentication successful`),process.stdout.write(T.green(`
|
|
173
|
+
\u2713 Setup complete. Tenant: ${y(r.tenant)}. JWT written to ${qr()}.
|
|
174
174
|
|
|
175
175
|
`)),n&&process.stdout.write(T.yellow(` \u26A0 flow-ai-obs initialization failed \u2014 domain authentication failure. Please contact support.
|
|
176
|
-
`)),0}catch(o){if(o instanceof Error&&o.message==="SIGINT")throw o;let s=
|
|
177
|
-
`)),1}}async function
|
|
178
|
-
`),process.stdout.write(
|
|
179
|
-
`);let r=(await
|
|
180
|
-
`)),1;let n;try{n=
|
|
181
|
-
`)),1}let o=e??await
|
|
182
|
-
`)),1}let{initFailed:i}=await
|
|
176
|
+
`)),0}catch(o){if(o instanceof Error&&o.message==="SIGINT")throw o;let s=y(o instanceof Error?o.message:"unknown error");return Pt.error(`[${r.tenant}] Starter kit setup failed: ${s}`),process.stderr.write(T.red(` \u2717 Starter kit setup failed: ${s}
|
|
177
|
+
`)),1}}async function oI(e,t){of(),Pt.debug("[auth] Starting interactive authentication");try{process.stdout.write(`
|
|
178
|
+
`),process.stdout.write(sf+`
|
|
179
|
+
`);let r=(await Gt(T.cyan(" ? ")+"JWT: ",{masked:!0})).trim();if(!r)return Pt.error("[auth] Validation failed: JWT is required"),process.stderr.write(T.red(` \u2717 JWT is required
|
|
180
|
+
`)),1;let n;try{n=bo(r);}catch(l){let u=y(l instanceof Error?l.message:"Invalid JWT");return process.stderr.write(T.red(` \u2717 ${u}
|
|
181
|
+
`)),1}let o=e??await tI(),s=t??await rI();o&&Rt(o),Pt.debug(`[${n.tenant}] Authenticating tenant`);try{await Jr(n);}catch(l){let u=y(l instanceof Error?l.message:"unknown error");return Pt.error(`[${n.tenant}] Authentication failed: ${u}`),process.stderr.write(T.red(` \u2717 Authentication failed: ${u}
|
|
182
|
+
`)),1}let{initFailed:i}=await lf(o,s),a=await uf();return await af({...n,starterKit:a?.slug,customUrl:o??void 0},!0,r),a?await df(a):process.stdout.write(T.dim(`
|
|
183
183
|
Skipped starter kit installation.
|
|
184
|
-
`)),await
|
|
185
|
-
\u2713 Setup complete. Tenant: ${
|
|
184
|
+
`)),await pf(),Pt.info(`[${n.tenant}] Authentication successful`),process.stdout.write(T.green(`
|
|
185
|
+
\u2713 Setup complete. Tenant: ${y(n.tenant)}. JWT written to ${qr()}.
|
|
186
186
|
|
|
187
187
|
`)),i&&process.stdout.write(T.yellow(` \u26A0 flow-ai-obs initialization failed \u2014 domain authentication failure. Please contact support.
|
|
188
|
-
`)),0}catch(r){if(r instanceof Error&&r.message==="SIGINT")throw r;let n=
|
|
189
|
-
`)),1}}async function
|
|
190
|
-
`)),1;if(e.customEmail!==void 0&&!
|
|
191
|
-
`)),1;try{return await
|
|
192
|
-
`),130;throw t}}async function
|
|
193
|
-
`),(await
|
|
188
|
+
`)),0}catch(r){if(r instanceof Error&&r.message==="SIGINT")throw r;let n=y(r instanceof Error?r.message:"unknown error");return Pt.error(`[auth] Unexpected error: ${n}`),process.stderr.write(T.red(` \u2717 Unexpected error: ${n}
|
|
189
|
+
`)),1}}async function tc(e={}){if(e.jwt)return nI({jwt:e.jwt,starterKit:e.starterKit,customUrl:e.customUrl,customEmail:e.customEmail});if(e.customUrl!==void 0&&!mn.test(e.customUrl))return process.stderr.write(T.red(` \u2717 ${fn}.
|
|
190
|
+
`)),1;if(e.customEmail!==void 0&&!gn.test(e.customEmail))return process.stderr.write(T.red(` \u2717 ${hn}.
|
|
191
|
+
`)),1;try{return await oI(e.customUrl,e.customEmail)}catch(t){if(t instanceof Error&&t.message==="SIGINT")return process.stdout.write(`
|
|
192
|
+
`),130;throw t}}async function sI(){try{return process.stdout.write(`
|
|
193
|
+
`),(await Gt(T.cyan(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(T.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
|
|
196
|
-
`)),0;if(!e){let t=await
|
|
195
|
+
`),130;throw e}}async function mf(e){if(!await Z())return process.stdout.write(T.yellow(` \u26A0 You are not authenticated
|
|
196
|
+
`)),0;if(!e){let t=await sI();if(t!==null)return t}try{return await Xc(),process.stdout.write(T.green(` \u2713 Credentials removed successfully
|
|
197
197
|
`)),0}catch{return process.stderr.write(T.red(` \u2717 Error removing credentials
|
|
198
|
-
`)),1}}async function
|
|
198
|
+
`)),1}}async function ff(){let e=await Z();return e?await yr()?(process.stdout.write(`
|
|
199
199
|
`+T.bold(` Authenticated
|
|
200
|
-
`)),process.stdout.write(T.dim(" Tenant: ")+
|
|
201
|
-
`),process.stdout.write(T.dim(" Client ID: ")+
|
|
202
|
-
`),process.stdout.write(T.dim(" Starter Kit: ")+
|
|
203
|
-
`),process.stdout.write(T.dim(" Config: ")+
|
|
200
|
+
`)),process.stdout.write(T.dim(" Tenant: ")+y(e.tenant)+`
|
|
201
|
+
`),process.stdout.write(T.dim(" Client ID: ")+y(e.clientId)+`
|
|
202
|
+
`),process.stdout.write(T.dim(" Starter Kit: ")+y(e.starterKit??"not set")+`
|
|
203
|
+
`),process.stdout.write(T.dim(" Config: ")+y(await qc())+`
|
|
204
204
|
`),process.stdout.write(`
|
|
205
|
-
`),0):(process.stdout.write(T.yellow(" \u26A0 Session expired. Run `flow auth login` to re-authenticate.\n")),0):(process.stdout.write(T.yellow(" \u26A0 Not authenticated. Run `flow auth login` to set up.\n")),0)}
|
|
205
|
+
`),0):(process.stdout.write(T.yellow(" \u26A0 Session expired. Run `flow auth login` to re-authenticate.\n")),0):(process.stdout.write(T.yellow(" \u26A0 Not authenticated. Run `flow auth login` to set up.\n")),0)}F();j();Je();j();var aI=[le,"flow-harness"];function gf(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function lI(e,t,r=process.env){return gf(r.DISABLE_AUTOUPDATER)?{name:e,enabled:false,reason:"env-disabled"}:gf(r.FORCE_AUTOUPDATE_PLUGINS)?{name:e,enabled:true,reason:"env-forced"}:t?.autoUpdate===false?{name:e,enabled:false,reason:"flag"}:t?.autoUpdate===true?{name:e,enabled:true,reason:"flag"}:{name:e,enabled:true,reason:"default"}}function hf(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 Bi(e=process.env){let t=Fr();if(!ve__default.existsSync(t))return [];try{let r=JSON.parse(ve__default.readFileSync(t,"utf-8"));return Object.entries(r).map(([n,o])=>lI(n,o,e))}catch{return []}}function yf(){let e=Fr(),t={fixed:[],skipped:[]};if(!ve__default.existsSync(e))return t;let r;try{r=JSON.parse(ve__default.readFileSync(e,"utf-8"));}catch{return t.skipped.push({name:"(all)",reason:"known_marketplaces.json is malformed JSON"}),t}let n=false;for(let o of aI){let s=r[o];if(!s){t.skipped.push({name:o,reason:"not registered on this machine"});continue}if("autoUpdate"in s){t.skipped.push({name:o,reason:s.autoUpdate?"already autoUpdate: true":"explicitly set to autoUpdate: false \u2014 not overridden"});continue}s.autoUpdate=true,t.fixed.push(o),n=true;}if(n){let o=`${e}.${randomUUID()}.tmp`;ve__default.writeFileSync(o,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384}),ve__default.renameSync(o,e);}return t}async function cI(e){let t=ie(),r;try{r=await er(e.source);}catch(o){if(e.source)throw o;r=[];}let n=new Set(t.map(o=>o.name));return E(I.CLI_CATALOG_VIEWED,{interface:Q().interfaceType,filter_type:"available",result_count:r.length}).catch(()=>{}),e.json?(mr(r.map(o=>({...o,installed:n.has(o.name)}))),0):(xn(["","Name","Version","Category","Status"],r.map(o=>[n.has(o.name)?"*":" ",o.name??"",o.version??"n/a",o.category??"",n.has(o.name)?"installed":"available"])),0)}async function uI(e){let t=ie(),r=await er(e.source),n=new Map(r.map(s=>[s.name,s])),o=t.map(s=>{let i=n.get(s.name);return i&&s.version&&i.version&&je(s.version,i.version)?{...s,availableVersion:i.version}:null}).filter(s=>s!==null);return E(I.CLI_CATALOG_VIEWED,{interface:Q().interfaceType,filter_type:"outdated",result_count:o.length}).catch(()=>{}),o.length===0?(b("All plugins are up to date."),0):e.json?(mr(o),0):(xn(["Name","Installed","Available"],o.map(s=>[s.name??"",s.version??"n/a",s.availableVersion??"n/a"])),process.stdout.write(`
|
|
206
206
|
${o.length} plugin(s) outdated.
|
|
207
|
-
`),0)}async function
|
|
207
|
+
`),0)}async function dI(e){let t=ie();if(E(I.CLI_CATALOG_VIEWED,{interface:Q().interfaceType,filter_type:"all",result_count:t.length}).catch(()=>{}),t.length===0)return b("No plugins installed. Use `flow plugin install <name>` to install one."),0;if(e.json)return mr(t),0;let r=[];try{r=await er(e.source);}catch{r=[];}let n=new Map(r.map(i=>[i.name,i])),o=new Map(Bi().map(i=>[i.name,i.enabled])),s=[...t].sort((i,a)=>{let l=Wo.indexOf(i.scope??"user"),u=Wo.indexOf(a.scope??"user");return (l===-1?1/0:l)-(u===-1?1/0:u)});return xn(["Name","Version","Type","Origin","Scope","Status","Auto-Update","Installed at"],s.map(i=>{let a=n.get(i.name),l=a?.type??"bundle",u=a?.origin??Rl(i.marketplace),c=i.marketplace?o.get(i.marketplace):void 0,d=c===void 0?"n/a":c?"on":"off";return [i.name??"",i.version??"n/a",pn[l]?.label??"Plugin",u,i.scope??"user",i.status??"enabled",d,At(i.installedAt??"")]})),process.stdout.write(`
|
|
208
208
|
${t.length} plugin(s) installed.
|
|
209
|
-
`),0}async function
|
|
209
|
+
`),0}async function wf(e){if(!await me())return 1;try{return e.available?await cI(e):e.outdated?await uI(e):await dI(e)}catch(t){return P(t instanceof Error?t.message:"Failed to list plugins."),1}}Cr();F();j();R();var fe=x("manage");function Fi(e,t){return t?ie().find(r=>r.name===e&&r.scope===t):ie().find(r=>r.name===e)}function pI(e,t){let r=t;return {callbacks:{onStatus:o=>{r&&(r.text=`${e}${o}`);},onError:o=>{r?.stop(),r=void 0,b(`${e}${o}`);},onPause:()=>{r?.stop(),r=void 0;},onResume:o=>{r?.stop(),r=rc({text:`${e}${o}`}).start();}},stopSpinner:()=>{r?.stop(),r=void 0;}}}async function mI(e,t,r,n){let o=n;if(!r.force){o?.stop();let i=y(e),a=y(On(e,r.scope));if(!await de(`${t}Install external plugin "${i}"?
|
|
210
210
|
This will run: ${a}
|
|
211
|
-
[y/N] `))return
|
|
212
|
-
Installation summary: ${t} succeeded, ${r} failed`);}async function
|
|
213
|
-
Update summary: ${t} updated, ${r} already up to date, ${n} failed`);}async function
|
|
214
|
-
Bundle: ${
|
|
215
|
-
`);for(let o of t)process.stdout.write(`${
|
|
211
|
+
[y/N] `))return fe.debug(`[${e}] Installation cancelled by user`),r.silent||b(`${t}Skipped ${e} (cancelled).`),{name:e,success:true};r.silent||(o=rc({text:`${t}Installing ${e}...`}).start());}let s=o?pI(t,o):void 0;try{let i=await Np(e,r.marketplaceSource,s?.callbacks,r.scope);if(s?.stopSpinner(),i.exitCode!==0){let a=i.stderr||"Command failed";return r.silent?_e({status:"error",plugin:e,message:a}):P(`${t}Failed to install "${e}": ${a}`),{name:e,success:!1,error:a}}return r.silent?Se({status:"success",plugin:e,command:i.command,duration_ms:i.duration_ms}):q(`${t}${e} installed successfully (via proxy)`),{name:e,success:!0,duration_ms:i.duration_ms}}catch(i){s?.stopSpinner();let a=Y(i);return r.silent?_e({status:"error",plugin:e,message:a}):P(`${t}Failed to install "${e}": ${a}`),{name:e,success:false,error:a}}}async function fI(e,t,r){let n=r.silent?void 0:rc({text:`${t}Installing ${e}...`}).start();if(_n(e))return mI(e,t,r,n);try{let o=await Ne(e,{...r,onDownloadProgress:r.silent?void 0:(s,i)=>{if(!n||i===0)return;let{bar:a,percent:l,label:u}=Ws(s,i);n.text=`${t}Downloading ${e}... ${a} ${l}% (${u})`;}});return n?.stop(),r.silent?Se({status:"success",plugin:e,version:o.version,duration_ms:o.duration_ms}):q(`${t}${e} v${o.version} installed successfully`),{name:e,success:!0,version:o.version,duration_ms:o.duration_ms}}catch(o){if(n?.stop(),o instanceof Xe)return r.silent?Se({status:"already_installed",plugin:e,message:o.message}):b(`${t}${o.message}`),{name:e,success:true};let s=Y(o);return r.silent?_e({status:"error",plugin:e,message:s}):P(`${t}Failed to install "${e}": ${s}`),{name:e,success:false,error:s}}}function gI(e){let t=e.filter(n=>n.success).length,r=e.filter(n=>!n.success).length;b(`
|
|
212
|
+
Installation summary: ${t} succeeded, ${r} failed`);}async function hI(e,t){let r=new Map;if(t.source){for(let n of e)r.set(n,t.source);return r}try{let n=await er();for(let o of e){let i=n.filter(a=>a.name===o).find(a=>a.contentSource);i?.contentSource&&r.set(o,i.contentSource);}}catch{}return r}async function ro(e,t={}){if(!await me())return 1;let r=[],n=await hI(e,t);for(let o=0;o<e.length;o++){let s=e.length>1?`[${o+1}/${e.length}] `:"",i=e[o],a=n.get(i)??t.source,l=await fI(i,s,{...t,source:a});r.push(l);}return e.length>1&&(t.silent?Se({status:"summary",succeeded:r.filter(o=>o.success).length,failed:r.filter(o=>!o.success).length,results:r.map(o=>({plugin:o.name,success:o.success,...o.error?{error:o.error}:{}}))}):gI(r)),r.some(o=>!o.success)?1:0}async function ji(e,t){if(!await me())return 1;if(fe.debug(`[${e}] Looking up installed plugin`),!t.force){let r=Fi(e,t.scope);if(!r)return fe.error(`[${e}] Plugin is not installed`),P(`Plugin "${e}" is not installed`),1;let n=y(r.name),o=r.version?y(r.version):void 0,s=t.scope?` (${t.scope})`:"";if(!await de(`Remove ${n} ${o?`v${o}`:"(n/a)"}${s}? [y/N] `))return fe.debug(`[${e}] Uninstall cancelled by user`),b("Operation cancelled."),0}try{return fe.debug(`[${e}] Uninstalling plugin${t.scope?` (scope: ${t.scope})`:""}`),await $o(e,t.scope),fe.info(`[${e}] Uninstalled successfully`),q("Plugin removed successfully"),0}catch(r){return fe.error(`[${e}] Failed to uninstall: ${Y(r)}`),P(Y(r)),1}}async function Sf(e,t={}){if(!await me())return 1;fe.debug(`[${e}] Looking up installed plugin`);let r=Fi(e,t.scope);if(!r)return fe.error(`[${e}] Plugin is not installed`),P(`Plugin "${e}" is not installed`),1;if(r.status==="enabled")return fe.debug(`[${e}] Already enabled, skipping`),b(`${r.name} is already enabled`),0;try{return fe.debug(`[${e}] Enabling plugin (current status: ${r.status})`),await Lo(e,"enabled",t.scope),fe.info(`[${e}] Enabled successfully`),q(`${r.name} enabled successfully`),0}catch(n){return fe.error(`[${e}] Failed to enable: ${Y(n)}`),P(Y(n)),1}}async function xf(e,t={}){if(!await me())return 1;fe.debug(`[${e}] Looking up installed plugin`);let r=Fi(e,t.scope);if(!r)return fe.error(`[${e}] Plugin is not installed`),P(`Plugin "${e}" is not installed`),1;if(r.status==="disabled")return fe.debug(`[${e}] Already disabled, skipping`),b(`${r.name} is already disabled`),0;try{return fe.debug(`[${e}] Disabling plugin (current status: ${r.status})`),await Lo(e,"disabled",t.scope),fe.info(`[${e}] Disabled successfully`),q(`${r.name} disabled successfully`),0}catch(n){return fe.error(`[${e}] Failed to disable: ${Y(n)}`),P(Y(n)),1}}async function bf(e,t,r){r.silent||b(`${t}Updating ${e}...`);try{let n=await Si(e,r);return r.silent?Se({status:"updated",plugin:n.name,previousVersion:n.previousVersion,newVersion:n.newVersion,duration_ms:n.duration_ms}):q(`${t}${n.name} v${n.previousVersion} \u2192 v${n.newVersion}`),{name:e,success:!0}}catch(n){if(n instanceof Tr)return r.silent?Se({status:"up_to_date",plugin:e,message:n.message}):b(`${t}${n.message}`),{name:e,success:true,skipped:true};let o=Y(n);return r.silent?_e({status:"error",plugin:e,message:o}):P(`${t}Failed to update ${e}: ${o}`),{name:e,success:false,error:o}}}function yI(e){let t=e.filter(o=>o.success&&!o.skipped).length,r=e.filter(o=>o.skipped).length,n=e.filter(o=>!o.success).length;b(`
|
|
213
|
+
Update summary: ${t} updated, ${r} already up to date, ${n} failed`);}async function wI(e,t,r){try{let n=await Bn(e,r.source);je(t,n.version,r.force)?b(`Would update ${e}: v${t} \u2192 v${n.version}`):b(`${e} is already up to date (v${t})`);}catch(n){return P(Y(n)),1}return 0}function SI(e){return new Map(e.filter(t=>!!t.version).map(t=>[t.name,t.version]))}function xI(e,t,r){let n=t.get(e.name);return n?e.version&&je(e.version,n,r)?(b(`Would update ${e.name}: v${e.version} \u2192 v${n}`),true):(b(`${e.name} is already up to date (${e.version?`v${e.version}`:"n/a"})`),false):(b(`Skipping ${e.name}: not found in catalog`),false)}async function bI(e,t){try{let r=await er(t.source),n=SI(r),o=0;for(let s of e)xI(s,n,t.force)&&o++;o===0&&b("All plugins are up to date");}catch(r){return P(Y(r)),1}return 0}async function II(e,t){let r=[];for(let n=0;n<e.length;n++){let o=`[${n+1}/${e.length}] `,s=await bf(e[n].name,o,t);r.push(s);}return t.silent?Se({status:"summary",updated:r.filter(n=>n.success&&!n.skipped).length,upToDate:r.filter(n=>n.skipped).length,failed:r.filter(n=>!n.success).length,results:r.map(n=>({plugin:n.name,success:n.success,...n.skipped?{skipped:true}:{},...n.error?{error:n.error}:{}}))}):yI(r),r.some(n=>!n.success)?1:0}async function If(e,t={}){if(!await me())return 1;if(e){let o=Fi(e,t.scope);return o?t.dryRun?wI(e,o.version??"",t):(await bf(e,"",t)).success?0:1:(t.silent?_e({status:"error",plugin:e,message:`Plugin "${e}" is not installed`}):P(`Plugin "${e}" is not installed`),1)}let n=ie().filter(o=>o.marketplace===le);return n.length===0?(t.silent?Se({status:"empty",message:"No plugins installed"}):b("No plugins installed"),0):t.dryRun?bI(n,t):II(n,t)}F();R();var Zo=x("cli:bundle");function vI(e){let t=y(e.name??e.flowId),r=y(e.type??"unknown");return e.available?` \u2713 ${t} (${r})`:` \u2717 ${t} (${r}) \u2014 unavailable`}function EI(e,t){let r=t.filter(o=>o.available).length,n=t.length-r;process.stdout.write(`
|
|
214
|
+
Bundle: ${y(e)} (${t.length} artifacts)
|
|
215
|
+
`);for(let o of t)process.stdout.write(`${vI(o)}
|
|
216
216
|
`);process.stdout.write(`
|
|
217
217
|
${r} available for installation`),n>0&&process.stdout.write(` | ${n} unavailable`),process.stdout.write(`
|
|
218
218
|
|
|
219
|
-
`);}async function
|
|
220
|
-
`),process.stdout.write(`[${a}/${l}] Installing ${m} (${p})... ${
|
|
219
|
+
`);}async function vf(e){if(!e.trim())return P("Bundle name cannot be empty."),1;if(!await me())return 1;Zo.debug(`Fetching bundle "${e}"`);let r;try{r=await vi(e);}catch(a){return a instanceof qn||a instanceof Go?(P(a.message),1):(P(`Failed to fetch bundle: ${a instanceof Error?a.message:String(a)}`),1)}let n=r.artifact.artifacts,o=n.filter(a=>a.available);if(Zo.debug(`Bundle "${r.title}" \u2014 ${n.length} artifact(s), ${o.length} available`),EI(r.title,n),o.length===0)return P("No artifacts available for installation in this bundle."),1;if(!await de(`Install ${o.length} artifact(s)? [Y/n] `))return Zo.debug("Installation cancelled by user"),0;Zo.debug(`Starting installation of ${o.length} artifact(s)`);let i=await gi(r,{onProgress:({index:a,total:l,artifact:u,success:c,error:d})=>{let m=y(u.name??u.flowId),p=y(u.type??"unknown"),g=c?"\u2713":`\u2717 (${y(d??"failed")})`;a===1&&process.stdout.write(`
|
|
220
|
+
`),process.stdout.write(`[${a}/${l}] Installing ${m} (${p})... ${g}
|
|
221
221
|
`),a===l&&process.stdout.write(`
|
|
222
|
-
`);}});if(
|
|
222
|
+
`);}});if(Zo.debug(`Installation complete \u2014 ${i.installed} installed, ${i.failed} failed, ${i.skipped} skipped`),i.installed>0&&q(`${i.installed} installed successfully`),i.failed>0){let a=i.failures.map(l=>l.name).join(", ");P(`${i.failed} failed: ${y(a)}`);}if(i.skipped>0){let a=n.filter(l=>!l.available).map(l=>y(l.name??l.flowId)).join(", ");b(`${i.skipped} unavailable: ${a}`);}return 0}Cr();F();R();var Ef=x("marketplace");function TI(e){return `claude plugin marketplace add ${e}`}async function Pf(e,t){if(!await me())return 1;let r;try{r=ti(e);}catch(s){let i=Y(s);return t.silent?_e({status:"error",source:e,message:i}):P(i),1}Ef.debug(`[marketplace] Adding marketplace source: ${r}`);let n=TI(r);if(!t.force){let s=y(r),i=y(n);if(!await de(`Add marketplace "${s}"?
|
|
223
223
|
This will run: ${i}
|
|
224
|
-
[y/N] `))return
|
|
224
|
+
[y/N] `))return Ef.debug("[marketplace] Operation cancelled by user"),b("Operation cancelled."),0}let o=t.silent?void 0:rc({text:`Adding marketplace "${y(r)}"...`}).start();try{let s=await Re(n);return o?.stop(),s.exitCode!==0?(t.silent?_e({status:"error",source:r,exitCode:s.exitCode,message:s.stderr||"Command failed"}):(P(`Failed to add marketplace "${r}": ${s.stderr||"Command failed"}`),t.verbose&&s.stdout&&b(`stdout: ${s.stdout}`)),1):(t.silent?Se({status:"success",source:r,command:n,duration_ms:s.duration_ms}):(q(`Marketplace "${r}" added successfully`),t.verbose&&s.stdout&&b(s.stdout)),0)}catch(s){o?.stop();let i=Y(s);return t.silent?_e({status:"error",source:r,message:i}):P(`Failed to add marketplace "${r}": ${i}`),1}}Ee();F();async function RI(){return await Z()?{passed:true,message:"Credentials configured"}:{passed:false,message:"Credentials not configured \u2014 Run `flow auth login`"}}async function $I(){let e=Date.now();try{await er();let t=Date.now()-e;return {passed:!0,message:`Prompt Manager accessible (${t}ms)`,latency:t}}catch(t){return t instanceof Error&&t.name==="TimeoutError"?{passed:false,message:"Timeout after 5s \u2014 check your connection"}:{passed:false,message:`Connection error: ${t instanceof Error?t.message:"Unknown"}`}}}async function LI(){return await yr()?{passed:true,message:"Token is valid"}:{passed:false,message:"Token expired \u2014 run `flow auth login` to re-authenticate"}}function MI(){let e=join(homedir(),".claude","settings.json");return existsSync(e)?{passed:true,message:"Claude Code detected"}:{passed:false,message:"Claude Code not detected"}}function _I(){let e=Bi();if(e.length!==0){process.stdout.write(`
|
|
225
225
|
`+T.bold(` Marketplace Auto-Update
|
|
226
226
|
|
|
227
|
-
`));for(let t of e){let r=t.enabled?T.green("[ON] "):T.dim("[OFF]"),n=
|
|
228
|
-
`);}}}function
|
|
227
|
+
`));for(let t of e){let r=t.enabled?T.green("[ON] "):T.dim("[OFF]"),n=y(t.name).padEnd(20),o=y(hf(t));process.stdout.write(` ${r} ${n} ${T.dim(o)}
|
|
228
|
+
`);}}}function DI(){process.stdout.write(`
|
|
229
229
|
`+T.bold(` FlowSetup CLI \u2014 Auto-Update Fix
|
|
230
230
|
|
|
231
|
-
`));let e=
|
|
232
|
-
`);for(let{name:t,reason:r}of e.skipped)process.stdout.write(` ${T.dim("[SKIP] ")} ${
|
|
231
|
+
`));let e=yf();for(let t of e.fixed)process.stdout.write(` ${T.green("[FIXED]")} ${y(t)} \u2014 autoUpdate: true set
|
|
232
|
+
`);for(let{name:t,reason:r}of e.skipped)process.stdout.write(` ${T.dim("[SKIP] ")} ${y(t)} \u2014 ${y(r)}
|
|
233
233
|
`);return process.stdout.write(`
|
|
234
234
|
`),e.fixed.length===0?process.stdout.write(T.dim(` Nothing to fix \u2014 all set.
|
|
235
235
|
|
|
236
236
|
`)):process.stdout.write(T.green(` \u2713 ${e.fixed.length} marketplace(s) updated.
|
|
237
237
|
|
|
238
|
-
`)),0}async function
|
|
238
|
+
`)),0}async function Tf(e={}){if(e.fix)return DI();process.stdout.write(`
|
|
239
239
|
`+T.bold(` FlowSetup CLI Diagnostics
|
|
240
240
|
|
|
241
|
-
`));let t=[{name:"Credentials",fn:
|
|
242
|
-
`);}return
|
|
241
|
+
`));let t=[{name:"Credentials",fn:RI},{name:"Prompt Manager",fn:$I},{name:"Valid Token",fn:LI},{name:"Claude Code",fn:MI}],r=true;for(let n of t){let o=await n.fn(),s="",i=T.green;o.passed?s=T.green("[OK] "):(s=T.red("[FAIL]"),i=T.red,r=false);let a=` ${s} ${i(n.name.padEnd(18))} ${y(o.message)}`;process.stdout.write(a+`
|
|
242
|
+
`);}return _I(),process.stdout.write(`
|
|
243
243
|
`),r?(process.stdout.write(T.green(` \u2713 All checks passed!
|
|
244
244
|
|
|
245
245
|
`)),0):(process.stdout.write(T.red(` \u2717 Some checks failed \u2014 verify your configuration
|
|
246
246
|
|
|
247
|
-
`)),1)}
|
|
247
|
+
`)),1)}Ee();Hr();j();async function Cf(e){let t=await Z(),r=$t("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/"),n={Authorization:`Bearer ${e}`,accept:"application/json"};if(t?.tenant){if(!zt.test(t.tenant))throw new Error(`Invalid tenant value: "${t.tenant}"`);n.FlowTenant=t.tenant;}let o=await Sd.get(`${r}rate-limit/me`,{searchParams:{mode:"budget"},headers:n}).json();if(typeof o.consumed_usd!="number"||typeof o.budget_limit!="number"||typeof o.percentage!="number")throw new Error("Unexpected budget response shape: missing consumed_usd, budget_limit, or percentage");return o}En();Ps();Ee();F();R();var UI=x("commands:usage"),Ki=20,kf="EMAIL",Af="MONTHLY CONSUMPTION (USD)",Rf="STATUS";function NI(e){let t=Math.min(100,Math.max(0,e)),r=Math.round(t/100*Ki),n=Ki-r,o=T.green;return t>=90?o=T.red:t>=70&&(o=T.yellow),o("\u2588".repeat(r))+T.dim("\u2591".repeat(n))}function $f(e){return `$ ${e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function BI(e){let t=e.toLowerCase(),r=y(e),n=r.charAt(0).toUpperCase()+r.slice(1).toLowerCase();return t==="ok"||t==="unblocked"?T.green(`\u2299 ${n}`):t==="warning"?T.yellow(`\u26A0 ${n}`):t==="blocked"?T.red("\u2717 Budget limit reached"):T.red(`\u2717 ${n}`)}function FI(e){let t=At(e),r=Math.ceil((new Date(e).getTime()-Date.now())/864e5),n=r>0?` (in ${r} day${r===1?"":"s"})`:"";return `${t}${n}`}async function jI(e){try{let t=await In();if(t?.email)return y(t.email);let r=vn(e);return y(r.email??"")}catch(t){return UI.debug(`JWT email decode failed: ${String(t)}`),""}}async function Lf(e){if(!await me())return 1;let r;try{r=await Lt();}catch(h){return P(`Authentication error: ${Y(h)}`),1}let n;try{n=await Cf(r);}catch(h){return P(`Failed to fetch usage data: ${Y(h)}`),1}if(e.json)return mr(n),0;let o=await jI(r)||y(n.user_id),s=$f(n.consumed_usd),i=$f(n.budget_limit),a=`${n.percentage.toFixed(1)}%`,l=`${s} / ${i} (${a})`,u=Math.max(kf.length,o.length+2),c=Math.max(Af.length,Ki+2+l.length),d=` ${kf.padEnd(u)} ${Af.padEnd(c)} ${Rf}`,m=` ${"\u2500".repeat(u)} ${"\u2500".repeat(c)} ${"\u2500".repeat(Rf.length)}`,p=`${T.cyan("\u2022")} ${o.padEnd(u-2)}`,g=`${NI(n.percentage)} ${l.padEnd(c-Ki-2)}`,f=` ${T.dim("Resets")} ${FI(n.renewal_date)}`;return process.stdout.write(`
|
|
248
248
|
`),process.stdout.write(T.dim(d)+`
|
|
249
249
|
`),process.stdout.write(T.dim(m)+`
|
|
250
|
-
`),process.stdout.write(` ${p} ${
|
|
251
|
-
`),process.stdout.write(
|
|
250
|
+
`),process.stdout.write(` ${p} ${g} ${BI(n.status)}
|
|
251
|
+
`),process.stdout.write(f+`
|
|
252
252
|
`),process.stdout.write(`
|
|
253
|
-
`),0}var
|
|
254
|
-
`,{encoding:"utf-8",mode:384}),renameSync(o,r);}async function
|
|
255
|
-
`);for(let a of o){let l=
|
|
253
|
+
`),0}var HI=["github.com","www.github.com"],JI=/^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.@-]+)(\/.*)?$/,GI=/^([^@]+)@(.+)$/;function WI(e){return !!(isAbsolute(e)||e==="."||e===".."||e.startsWith("./")||e.startsWith("../")||e.startsWith(".\\")||e.startsWith("..\\")||/^[a-zA-Z]:[/\\]/.test(e))}function nc(e){let t=e.replace(/\\/g,"/");t=t.replace(/^\/+/,"").replace(/\/+$/,"");let r=t.split("/").filter(Boolean);for(let n of r)if(n==="..")throw new Error(`Invalid subpath: "${e}" contains path traversal ("..").`);return r.join("/")}function zI(e){let t=e.pathname.split("/").filter(Boolean);if(t.length<2)throw new Error(`Invalid GitHub URL: expected at least owner/repo in "${e.href}"`);let r=t[0],n=t[1];n.endsWith(".git")&&(n=n.slice(0,-4));let o={type:"github",url:`https://github.com/${r}/${n}.git`};if(t.length>=3&&(t[2]==="tree"||t[2]==="blob")){if(t.length>=4&&(o.ref=t[3]),t.length>=5){let s=t.slice(4).join("/");o.subpath=nc(s);}}else if(t.length>2){let s=t.slice(2).join("/");o.subpath=nc(s);}return e.hash&&e.hash.length>1&&(o.ref=decodeURIComponent(e.hash.slice(1))),o}function Vi(e){let t=e.trim();if(!t)throw new Error("Skill source cannot be empty.");if(WI(t)){let r=resolve(t);return {type:"local",url:r,localPath:r}}try{let r=new URL(t);if((r.protocol==="https:"||r.protocol==="http:")&&HI.includes(r.hostname))return zI(r);if(r.protocol==="https:"||r.protocol==="http:"){let n={type:"git",url:t};return r.hash&&r.hash.length>1&&(n.ref=decodeURIComponent(r.hash.slice(1)),n.url=t.replace(r.hash,"")),n}if(r.protocol==="git:"){let n={type:"git",url:t};return r.hash&&r.hash.length>1&&(n.ref=decodeURIComponent(r.hash.slice(1)),n.url=t.replace(r.hash,"")),n}}catch{}if(t.startsWith("git@")||t.includes(":")&&t.includes(".git")){let r=t,n,o=t.indexOf("#");o!==-1&&(n=t.slice(o+1),r=t.slice(0,o));let s={type:"git",url:r};return n&&(s.ref=n),s}{let r=t,n,o=r.indexOf("#");o!==-1&&(n=r.slice(o+1),r=r.slice(0,o));let s=r.match(JI);if(s){let i=s[1],a=s[2],l=s[3],u,c=a.match(GI);c&&(a=c[1],u=c[2]),a.endsWith(".git")&&(a=a.slice(0,-4));let d={type:"github",url:`https://github.com/${i}/${a}.git`};if(n&&(d.ref=n),u&&(d.skillFilter=u),l){let m=l.replace(/^\//,"");m&&(d.subpath=nc(m));}return d}}return {type:"git",url:t}}function Hi(e){if(e.type!=="github")return null;try{let r=new URL(e.url).pathname.split("/").filter(Boolean);if(r.length<2)return null;let n=r[1];return n.endsWith(".git")&&(n=n.slice(0,-4)),`${r[0]}/${n}`}catch{return null}}function Mf(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);return t?{data:parse(t[1])??{},content:t[2]??""}:{data:{},content:e}}var sc=new Set(["node_modules",".git","dist","build","__pycache__"]);function Of(e,t){let r=normalize(resolve(e)),n=normalize(resolve(t));return n.startsWith(r+sep)||n===r}function QI(e,t){let r=normalize(resolve(e)),n=normalize(resolve(join(e,t)));return n.startsWith(r+sep)||n===r}async function oc(e){try{let t=join(e,"SKILL.md");return (await stat(t)).isFile()}catch{return false}}async function Qo(e){try{let t=await readFile(e,"utf-8"),{data:r}=Mf(t);return typeof r.name!="string"||typeof r.description!="string"?null:{name:r.name,description:r.description,path:dirname(e),rawContent:t,metadata:r.metadata}}catch{return null}}async function Uf(e,t=0,r=5){if(t>r)return [];try{let[n,o]=await Promise.all([oc(e),readdir(e,{withFileTypes:!0}).catch(()=>[])]),s=n?[e]:[],i=await Promise.all(o.filter(a=>a.isDirectory()&&!sc.has(a.name)).map(a=>Uf(join(e,a.name),t+1,r)));return [...s,...i.flat()]}catch{return []}}async function Wi(e,t){let r=[],n=new Set;if(t&&!QI(e,t))throw new Error(`Invalid subpath: "${t}" resolves outside the repository directory.`);let o=t?join(e,t):e;if(await oc(o)){let i=await Qo(join(o,"SKILL.md"));if(i)return r.push(i),n.add(i.name),r}let s=[o,join(o,"skills"),join(o,".claude/skills"),join(o,".agents/skills")];for(let i of s)try{let a=await readdir(i,{withFileTypes:!0});for(let l of a){if(!l.isDirectory())continue;let u=join(i,l.name);if(await oc(u)){let c=await Qo(join(u,"SKILL.md"));c&&!n.has(c.name)&&(r.push(c),n.add(c.name));}}}catch{}if(r.length===0){let i=await Uf(o);for(let a of i){let l=await Qo(join(a,"SKILL.md"));l&&!n.has(l.name)&&(r.push(l),n.add(l.name));}}return r}function Nf(e,t){let r=t.map(n=>n.toLowerCase());return e.filter(n=>{let o=n.name.toLowerCase();return r.some(s=>s===o)})}Je();var Kf=1,sv={retries:5,minTimeout:50};async function Vf(e,t){mkdirSync(dirname(e),{recursive:true});let r=await fy.lock(e+".lock",{realpath:false,retries:sv});try{return await t()}finally{await r();}}function Bf(){return {version:Kf,skills:{}}}async function zi(e){let t=ao(e);try{let r=await readFile(t,"utf-8"),n=JSON.parse(r);return !n.version||n.version<Kf?Bf():n}catch{return Bf()}}function iv(e){let t={};for(let r of Object.keys(e).sort())t[r]=e[r];return t}async function Hf(e,t){let r=ao(t);mkdirSync(dirname(r),{recursive:true});let n={version:e.version,skills:iv(e.skills)},o=`${r}.${randomUUID()}.tmp`;writeFileSync(o,JSON.stringify(n,null,2)+`
|
|
254
|
+
`,{encoding:"utf-8",mode:384}),renameSync(o,r);}async function Jf(e,t,r){let n=ao(r);await Vf(n,async()=>{let o=await zi(r),s=new Date().toISOString(),i=o.skills[e];o.skills[e]={...t,installedAt:i?.installedAt??s,updatedAt:s},await Hf(o,r);});}async function Gf(e,t){let r=ao(t);await Vf(r,async()=>{let n=await zi(t);e in n.skills&&(delete n.skills[e],await Hf(n,t));});}Je();R();var Wf=x("skillInstaller");async function fv(e,t,r,n){try{await E(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:"skill",source:"external",scope:t,version:r,duration_ms:n,interface:Q().interfaceType});}catch(o){Wf.warn(`Failed to send skill install metrics: ${String(o)}`);}}async function gv(e,t){try{await E(I.CLI_TOOL_INSTALL_FAILED,{tool_id:e,tool_type:"skill",source:"external",error_code:t instanceof Error?t.name:"UNKNOWN",error_message:(t instanceof Error?t.message:String(t)).slice(0,500),interface:Q().interfaceType});}catch(r){Wf.warn(`Failed to send skill install-failed metrics: ${String(r)}`);}}async function hv(e,t){await cp(e,t,{recursive:true,dereference:false,filter:r=>{if(sc.has(basename(r)))return false;try{return !lstatSync(r).isSymbolicLink()}catch{return false}}});}async function yv(e,t,r){let n=at(e.name),o=jr(t),s=join(o,n);if(!Of(o,s))return {skill:e.name,success:false,path:s,error:`Unsafe install path: "${s}" escapes skills directory`};try{await rm(s,{recursive:!0,force:!0}),await mkdir(s,{recursive:!0}),await hv(e.path,s);let a=Hi(r)??r.url;return await Jf(n,{source:a,sourceType:r.type,sourceUrl:r.url,ref:r.ref,skillPath:r.subpath},t),{skill:e.name,success:!0,path:s}}catch(i){return {skill:e.name,success:false,path:s,error:i instanceof Error?i.message:String(i)}}}async function zf(e,t){let r=Vi(e),n;try{let o;if(r.type==="local"){if(!r.localPath||!existsSync(r.localPath))return {source:e,results:[],discovered:0,installed:0,failed:0};o=r.localPath;}else n=await Nt(r.url,r.ref),o=n;let s=await Wi(o,r.subpath),i=[...t.skillFilter??[]];r.skillFilter&&i.push(r.skillFilter);let a=i.length>0?Nf(s,i):s,l=[],u=r.ref??"latest";for(let c of a){let d=Date.now(),m=await yv(c,t.scope,r);l.push(m);let p=Date.now()-d;m.success?await fv(c.name,t.scope,u,p):await gv(c.name,new Error(m.error??"Unknown error"));}return {source:e,results:l,discovered:s.length,installed:l.filter(c=>c.success).length,failed:l.filter(c=>!c.success).length}}finally{n&&await Bt(n).catch(()=>{});}}Je();F();R();var Iv=x("skills");async function vv(e){try{await E(I.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:"skill",source:"external",interface:Q().interfaceType});}catch(t){Iv.warn(`Failed to send skill uninstall metrics: ${String(t)}`);}}async function Ev(e){let t=createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(`${y(e)} (y/N) `,n=>{t.close(),r(n.trim().toLowerCase()==="y");});})}async function Pv(e){let t=Vi(e),r;try{let n;if(t.type==="local"){if(!t.localPath)return P("Invalid local path."),1;n=t.localPath;}else b(`Fetching skills from ${y(e)}...`),r=await Nt(t.url,t.ref),n=r;let o=await Wi(n,t.subpath);if(o.length===0)return b("No skills found in this source."),0;let i=Hi(t)??y(e);b(`Found ${o.length} skill(s) in ${i}:
|
|
255
|
+
`);for(let a of o){let l=y(a.name),u=y(a.description);process.stdout.write(` ${T.bold(l)} ${T.dim(u)}
|
|
256
256
|
`);}return process.stdout.write(`
|
|
257
|
-
`),0}catch(n){return n instanceof
|
|
258
|
-
`);let t=e.source;e.installed>0&&b(`Installed ${e.installed} of ${e.discovered} skill(s) from ${
|
|
259
|
-
`);for(let s of r){let i=n.skills[at(s.name)]?.source,a=
|
|
257
|
+
`),0}catch(n){return n instanceof $r?P(n.message):P(n instanceof Error?n.message:String(n)),1}finally{r&&await Bt(r).catch(()=>{});}}function Tv(e){for(let r of e.results){let n=y(r.skill);if(r.success){let o=relative(process.cwd(),r.path);q(`${n} installed ${T.dim(`\u2192 ${o}/`)}`);}else P(`${n}: ${y(r.error??"unknown error")}`);}process.stdout.write(`
|
|
258
|
+
`);let t=e.source;e.installed>0&&b(`Installed ${e.installed} of ${e.discovered} skill(s) from ${y(t)}`),e.failed>0&&P(`${e.failed} skill(s) failed to install`),e.results.length===0&&e.discovered===0?b("No skills found in this source."):e.results.length===0&&e.discovered>0&&b(`Found ${e.discovered} skill(s) but none matched the filter. Use --list to see available skills.`);}async function qf(e,t){if(t.list)return Pv(e);let r=t.global?"global":"project";try{let n=await zf(e,{scope:r,skillFilter:t.skill,yes:t.yes});return Tv(n),n.failed>0?1:0}catch(n){return n instanceof $r?P(n.message):P(n instanceof Error?n.message:String(n)),1}}async function Yf(e){let t=jr(e),r=[];try{let n=await readdir(t,{withFileTypes:!0});for(let o of n){if(!o.isDirectory())continue;let s=join(t,o.name),i=join(s,"SKILL.md");try{if(!(await stat(i)).isFile())continue}catch{continue}let a=await Qo(i);a?r.push({name:a.name,description:a.description,path:s}):r.push({name:o.name,description:"(no metadata)",path:s});}}catch{}return r}async function Zf(e){let t=e.global?"global":"project",r=await Yf(t),n=await zi(t);if(e.json){let s=r.map(i=>({name:i.name,description:i.description,path:i.path,source:n.skills[at(i.name)]?.source}));return mr(s),0}if(r.length===0)return b(`No skills installed (${t==="global"?"global":"project"} scope).`),0;b(`${t==="global"?"Global":"Project"} skills (${r.length}):
|
|
259
|
+
`);for(let s of r){let i=n.skills[at(s.name)]?.source,a=y(s.name),l=y(s.description),u=l.length>80?l.slice(0,77)+"...":l,c=i?T.dim(` (${i})`):"";process.stdout.write(` ${T.bold(a)}${c}
|
|
260
260
|
`),process.stdout.write(` ${T.dim(u)}
|
|
261
261
|
|
|
262
|
-
`);}return 0}async function
|
|
262
|
+
`);}return 0}async function Qf(e,t){let r=t.global?"global":"project";if(!e){let i=await Yf(r);if(i.length===0)return b("No skills installed."),0;b("Installed skills:");for(let a of i)process.stdout.write(` - ${y(a.name)}
|
|
263
263
|
`);return process.stdout.write(`
|
|
264
|
-
`),b("Specify a skill name to remove: flow skills remove <name>"),1}let n=at(e),o=
|
|
265
|
-
Import summary: 0 installed, ${o.length} failed`);for(let a of o)P(` ${a.name}: ${a.error}`);return o.length>0?1:0}b(`Importing ${n.length} plugin(s)...`);let i=0;for(let a of n){let l=t.scope??a.scope??"user",u=
|
|
266
|
-
Import summary: ${i} installed, ${o.length} failed`);for(let a of o)P(` ${a.name}: ${a.error}`);return o.length>0?1:0}
|
|
264
|
+
`),b("Specify a skill name to remove: flow skills remove <name>"),1}let n=at(e),o=jr(r),s=join(o,n);try{await stat(s);}catch{return P(`Skill "${y(e)}" is not installed.`),1}if(!t.force&&!await Ev(`Remove skill "${y(n)}"?`))return b("Cancelled."),0;try{return await rm(s,{recursive:!0,force:!0}),await Gf(n,r),await vv(n),q(`Skill "${y(n)}" removed.`),0}catch(i){return P(`Failed to remove skill: ${i instanceof Error?i.message:String(i)}`),1}}F();R();j();var Xi=x("transfer"),ac=1;function Cv(e){return e.marketplace&&e.marketplace!==le?`${e.name}@${e.marketplace}`:e.name}function kv(e,t){let r=e.filter(o=>t.has(o.name)),n=e.filter(o=>!t.has(o.name));r.length>0&&b(`Already installed (${r.length}): ${r.map(o=>o.name).join(", ")}`),b(`To install (${n.length}): ${n.length>0?n.map(o=>o.name).join(", "):"none"}`);}function rg(e){let t=Ie__default.resolve(e.output);try{let r=ie(),n={version:ac,exportedAt:new Date().toISOString(),plugins:r.map(o=>({name:o.name,marketplace:o.marketplace,scope:o.scope,...o.type!==void 0?{type:o.type}:{}}))};return ve__default.writeFileSync(t,JSON.stringify(n,null,2),"utf-8"),q(`Exported ${r.length} plugin(s) to ${t}`),0}catch(r){let n=Y(r);return Xi.error(`Export failed: ${n}`),P(`Failed to export plugins: ${n}`),1}}async function ng(e,t={}){if(!await me())return 1;let r;try{let a=ve__default.readFileSync(Ie__default.resolve(e),"utf-8");r=JSON.parse(a);}catch(a){return P(`Failed to read import file "${e}": ${Y(a)}`),1}if(r.version!==ac)return P(`Unsupported export format version ${r.version??"(none)"} \u2014 expected ${ac}`),1;if(!Array.isArray(r.plugins))return P('Invalid export file format: missing or invalid "plugins" array'),1;if(r.plugins.length===0)return b("No plugins to import"),0;let n=[],o=[],s=0;for(let[a,l]of r.plugins.entries())if(!l?.name||typeof l.name!="string"){let u=`entry[${a}]`;Xi.warn(`Skipping ${u}: missing or invalid name`),o.push({name:u,error:"missing or invalid name"});}else l.type==="mcp"?(Xi.debug(`[${l.name}] Skipping MCP entry`),s++):n.push(l);if(s>0&&b(`Skipping ${s} MCP(s) \u2014 use 'flow mcp add' to install them manually`),t.diff||t.dryRun){let a=new Set(ie().map(l=>l.name));kv(n,a);}if(t.dryRun)return b("Dry-run mode: no plugins were installed"),0;if(n.length===0){b(`
|
|
265
|
+
Import summary: 0 installed, ${o.length} failed`);for(let a of o)P(` ${a.name}: ${a.error}`);return o.length>0?1:0}b(`Importing ${n.length} plugin(s)...`);let i=0;for(let a of n){let l=t.scope??a.scope??"user",u=Cv(a);Xi.debug(`[${a.name}] Installing as "${u}" in scope "${l}"`),await ro([u],{scope:l,force:t.force})===0?i++:o.push({name:a.name,error:"installation failed"});}b(`
|
|
266
|
+
Import summary: ${i} installed, ${o.length} failed`);for(let a of o)P(` ${a.name}: ${a.error}`);return o.length>0?1:0}R();F();function N(e){process.exitCode=e,setTimeout(()=>process.exit(e),100).unref();}F();R();var Rv=x("moduleProxy");function $v(e){if(!process.stdin.isTTY)return Promise.resolve(false);let t=hl.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(y(e),n=>{t.close(),r(!["n","no"].includes(n.toLowerCase().trim()));});})}async function og(e,t){let r=Date.now(),o=spawnSync(e.binaryName,t,{stdio:"inherit",env:process.env}).status??1;await E(I.CLI_MODULE_PROXY_EXECUTED,{module_alias:e.alias,exit_code:o,duration_ms:Date.now()-r,subcommand:t[0]??null}).catch(s=>{Rv.warn(`Failed to emit proxy executed event: ${String(s)}`);}),N(o);}async function ig(e,t){let r=se.find(o=>o.alias===e);if(!r){P(`Unknown module alias: '${e}'`),N(1);return}if(!await _t(r.binaryName)){P(`Module '${e}' (${r.binaryName}) is not installed.`);let o=r.platforms[process.platform];if(!o||o.status!=="supported"){await E(I.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_not_supported"}).catch(()=>{}),N(1);return}let s=(await Promise.all(o.strategies.map(async a=>{try{return await Ot(a.type).isAvailable()?a.type:null}catch{return null}}))).find(a=>a!==null)??null;if(!s){P(`No supported installation method available for '${e}' on this platform.`),N(1);return}if(await $v("Would you like to install it now? [Y/n] ")){await E(I.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_accepted"}).catch(()=>{});let a=await Er(r,"inline",s);if(!a.success){P(`Failed to install '${e}': ${a.error?.message??"unknown error"}`),N(1);return}await og(r,t);}else b(`To install manually, run: flow modules install ${e}`),await E(I.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_declined"}).catch(()=>{}),N(1);return}await og(r,t);}F();var Dv=promisify(execFile);async function Ov(e){try{if(e.versionCheck.type==="npm-registry"){let{stdout:n}=await Dv(qt(),["view",e.versionCheck.package,"version"],{timeout:5e3,shell:process.platform==="win32"});return String(n).trim()||null}let t=new AbortController,r=setTimeout(()=>t.abort(),5e3);try{let n={"User-Agent":`flow-plugins-cli/${ue}`,Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(n.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let o=await fetch(`https://api.github.com/repos/${e.versionCheck.repo}/releases/latest`,{signal:t.signal,headers:n});return o.ok?(await o.json()).tag_name?.replace(/^v/,"")??null:null}finally{clearTimeout(r);}}catch{return null}}function Uv(e,t,r,n){return n?.status==="experimental"?"experimental":!n||n.status!=="supported"||!e?"not_installed":t&&r&&je(t,r)?"outdated":"installed"}async function lc(){let e=await Promise.all(se.map(async t=>{let[r,n]=await Promise.all([_t(t.binaryName),Ov(t)]),s=nt(t.alias)?.installedVersion??null,i=t.platforms[process.platform],a=Uv(r,s,n,i),l=s??"\u2014";return [t.name,t.alias,l,a,process.platform]}));return xn(["Name","Alias","Version","Status","Platform"],e),0}async function cg(e){let t=se.find(i=>i.alias===e);if(!t)return P(`Unknown module alias: '${e}'`),1;let[r]=await Zn([t]);if(r.alreadyInstalled){let i=nt(t.alias),a=i?.installedVersion?` (v${i.installedVersion})`:"";return b(`Module ${t.name} already installed${a}. Use: flow modules update ${e}`),0}if(r.availableStrategies.length===0){let i=t.platforms[process.platform],a=t.docs?` See: ${t.docs}`:"";return !i||i.status!=="supported"?P(`Module ${t.name} is not supported on ${process.platform}.${a}`):P(`No installation method available for ${t.name} on ${process.platform}.${a}`),1}let n=r.availableStrategies[0],o=rc({text:`Installing ${t.name}...`}).start(),s;try{s=await Er(t,"on_demand",n);}finally{o.stop();}return s.success?(q(`${t.name} v${s.version??"unknown"} installed`),s.pendingInteractiveSetup&&spawnSync(s.pendingInteractiveSetup[0],s.pendingInteractiveSetup.slice(1),{stdio:"inherit"}),0):(P(s.error?.message??"Installation failed"),1)}async function ag(e,t){let r=rc({text:`Updating ${e.name}...`}).start(),n;try{n=await Bs(e,"command");}catch(o){return r.error(`${e.name}: ${o instanceof Error?o.message:String(o)}`),"error"}if(n.success){let o=n.version??"unknown";return o===t?(r.success(`${e.name}: already up to date (v${t})`),"up_to_date"):(r.success(`${e.name}: v${t} \u2192 v${o}`),"success")}return r.error(`${e.name}: ${n.error?.message??"Update failed"}`),"error"}async function ug(e){if(e!==null){let n=se.find(i=>i.alias===e);if(!n)return P(`Unknown module alias: '${e}'`),1;let o=nt(n.alias);return o?.installMethod?await ag(n,o.installedVersion??"unknown")==="error"?1:0:(P(`Module '${e}' not installed. Run: flow modules install ${e}`),1)}let t=Zr().filter(n=>n.installMethod!==null);if(t.length===0)return b("No installed modules to update."),0;let r=0;for(let n of t){let o=se.find(i=>i.alias===n.alias);if(!o)continue;await ag(o,n.installedVersion??"unknown")==="error"&&(r=1);}return r}var dg="ea77652b607cf8d3dd0a1359c08565561e4f758f",es=[{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
|
|
@@ -343,7 +343,7 @@ depends_on: []
|
|
|
343
343
|
| Document | Type | Domain | Status | Updated |
|
|
344
344
|
|----------|------|--------|--------|---------|
|
|
345
345
|
| _empty \u2014 add retrospectives, post-mortems and lessons learned here_ | \u2014 | \u2014 | \u2014 | \u2014 |
|
|
346
|
-
`},{path:"GLOSSARY.md",sha256:"b1e0889558c76e6d9f8241a5c6f3cc882f5364e05bee86c15726eb52ecc7101d",content:`# Glossary
|
|
346
|
+
`},{path:"CLAUDE.md",sha256:"4f02b1a3d5b4bdbb4d8ed15a14164be42920b245b3b439e3460e69227a2379f5",content:"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working in this repository.\n\n## What This Repository Is\n\nA **strategy and documentation repository**. Not a software codebase \u2014 no build step or test\nsuite. Artifacts are Markdown documents organized by lifecycle phase.\n\n## Navigation\n\nUse `glob` and `grep` to explore. Every `.md` in a monitored folder has YAML frontmatter with\n`type`, `domain`, `status`, `updated`, and `depends_on`. Read `INDEX.md` in each folder before\nscanning. Consult `GLOSSARY.md` at the root for canonical terms before redefining concepts.\n\n| Area | Path | Purpose |\n|---|---|---|\n| Current state | `0-current-state/` | Snapshot of what exists today |\n| Strategy | `1-strategy/` | Directional decisions (ADRs, vision docs) |\n| Plan | `2-plan/` | Execution specs (PRDs, tech specs) |\n| Delivery | `3-delivery/` | Delivery tracking |\n| Learning | `4-learn/` | Retrospectives |\n\n## Document Conventions\n\n- `.md` files in `0-current-state/`, `1-strategy/`, `2-plan/`, `4-learn/` require YAML\n frontmatter \u2014 see `STRUCTURE.md` for the exact fields per document type.\n- Never edit another lifecycle area's document directly \u2014 analyze the impact first, then let\n that area's owner apply the change.\n- `depends_on` should never be empty \u2014 a document with no edges is isolated context.\n\n## Context Engineering\n\nThis repository is a navigable document graph:\n- `depends_on` are the edges \u2014 follow them to navigate related context.\n- `INDEX.md` in each folder is the hub \u2014 read before scanning directories.\n- Raw scanning (`find . -name \"*.md\"`) is an anti-pattern \u2014 use `INDEX.md` + `depends_on`.\n"},{path:"GLOSSARY.md",sha256:"b1e0889558c76e6d9f8241a5c6f3cc882f5364e05bee86c15726eb52ecc7101d",content:`# Glossary
|
|
347
347
|
|
|
348
348
|
> Fill this file before creating any document that introduces a new domain term.
|
|
349
349
|
> Reference existing terms with \`[[GLOSSARY#Term]]\` instead of redefining them locally.
|
|
@@ -354,6 +354,35 @@ depends_on: []
|
|
|
354
354
|
|
|
355
355
|
**Golden rule:** a term used with different meanings by different team members is a source of
|
|
356
356
|
silent misalignment. Define it here once, and link to it \u2014 never redefine it inline in a doc.
|
|
357
|
+
`},{path:"INDEX.md",sha256:"efcbfab86b1ef48a95c2b41615d29997d5ab8d0c7e301dfe9210370c690998f6",content:`# INDEX \u2014 Start Here
|
|
358
|
+
|
|
359
|
+
This repository is a navigable document graph, organized by lifecycle phase. Read
|
|
360
|
+
\`STRUCTURE.md\` first for the full folder-by-folder guide; this file is the entry point.
|
|
361
|
+
|
|
362
|
+
## Reading order
|
|
363
|
+
|
|
364
|
+
| Folder | Question it answers |
|
|
365
|
+
|---|---|
|
|
366
|
+
| [\`0-current-state/\`](./0-current-state/INDEX.md) | Where are we? |
|
|
367
|
+
| [\`1-strategy/\`](./1-strategy/INDEX.md) | Where are we going? |
|
|
368
|
+
| [\`2-plan/\`](./2-plan/INDEX.md) | How do we get there? |
|
|
369
|
+
| [\`3-delivery/\`](./3-delivery/INDEX.md) | What is actually shipping? |
|
|
370
|
+
| [\`4-learn/\`](./4-learn/INDEX.md) | What did we learn? |
|
|
371
|
+
|
|
372
|
+
## Before creating any document
|
|
373
|
+
|
|
374
|
+
1. Read the target folder's own \`INDEX.md\` \u2014 it lists what already exists.
|
|
375
|
+
2. Check [\`GLOSSARY.md\`](./GLOSSARY.md) for terms already defined \u2014 reference them with
|
|
376
|
+
\`[[GLOSSARY#Term]]\` instead of redefining locally.
|
|
377
|
+
3. Give the document a \`depends_on\` edge to at least one related document \u2014 an isolated
|
|
378
|
+
node with no edges can't be reached organically from the rest of the graph.
|
|
379
|
+
|
|
380
|
+
## Reference
|
|
381
|
+
|
|
382
|
+
- [\`STRUCTURE.md\`](./STRUCTURE.md) \u2014 full guide to what goes in each numbered folder, ADR/PRD
|
|
383
|
+
frontmatter conventions, and the 6 golden rules
|
|
384
|
+
- [\`GLOSSARY.md\`](./GLOSSARY.md) \u2014 canonical domain terms
|
|
385
|
+
- [\`docs/\`](./docs/README.md) \u2014 raw input drop (PDFs, exports, legacy docs) \u2014 not curated content
|
|
357
386
|
`},{path:"STRUCTURE.md",sha256:"2ba8f40bad0afa3d040d7259b53ff55dc93c50c59983ad9e28cdbd6dabcaad01",content:`# Folder Structure \u2014 Usage Guide
|
|
358
387
|
|
|
359
388
|
The 5 numbered folders are the reading order of this repository: current state \u2192 direction \u2192
|
|
@@ -525,39 +554,55 @@ analyzes these files and creates the correct \`.md\` files in the numbered folde
|
|
|
525
554
|
**6. Source code never in monitored folders.**
|
|
526
555
|
If you create a folder with app or script source code, keep it out of the 5 numbered folders
|
|
527
556
|
entirely (e.g. \`prototypes/\`).
|
|
528
|
-
`},{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
|
|
529
|
-
`,"utf8");}
|
|
530
|
-
|
|
531
|
-
`)
|
|
532
|
-
|
|
533
|
-
`)
|
|
534
|
-
`)
|
|
535
|
-
`)
|
|
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 pg=".flow-harness-lock";function mg(e){if(!existsSync(e))return {};try{let t=readFileSync(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:{}}catch{return {}}}function fg(e,t){return e.files?.[t]?.sha256}function gg(e,t,r,n){let o={...t.files??{}};for(let[i,a]of Object.entries(r))o[i]={sha256:a};let s={...t,files:o,strategy_context:true,strategy_context_source:`@ciandt-flow/cli@${ue}`,strategy_context_harness_commit:n};"core_commit"in t||(s.core_commit=""),writeFileSync(e,JSON.stringify(s,null,2)+`
|
|
558
|
+
`,"utf8");}F();var pc="CLAUDE.md";function Vv(e){return createHash("sha256").update(e,"utf8").digest("hex")}function Hv(){return {new:0,unchanged:0,clean:0,divergent:0,declined:0}}async function yg(e={}){let t=e.targetDir??process.cwd(),r=e.dryRun??false,n=e.force??false,o=e.isInteractive??!!process.stdin.isTTY,s=e.confirmOverwrite??Gv,i=e.confirmCreate??Wv,a=join(t,pg),l=mg(a),u=[],c=Hv(),d={},m=es.find(f=>f.path===pc),p=m?existsSync(join(t,m.path)):true;if(m&&!p){let f=join(t,m.path);o?await i(m.path)?(u.push({path:m.path,status:"new"}),c.new++,r||(mkdirSync(dirname(f),{recursive:true}),writeFileSync(f,m.content,"utf8"),d[m.path]=m.sha256)):b(`declined: ${pc} not created`):e.assistant==="claude-code"&&(u.push({path:m.path,status:"new"}),c.new++,r||(mkdirSync(dirname(f),{recursive:true}),writeFileSync(f,m.content,"utf8"),d[m.path]=m.sha256));}for(let f of es){if(f.path===pc&&!p)continue;let h=join(t,f.path),w=await Jv({dstPath:h,template:f,existingLockHash:fg(l,f.path),force:n,isInteractive:o,confirmOverwrite:v=>s(v)});u.push({path:f.path,status:w.status}),c[w.status]++,w.write&&!r&&(mkdirSync(dirname(h),{recursive:true}),writeFileSync(h,f.content,"utf8")),w.recordHash&&!r&&(d[f.path]=w.recordHash);}!r&&Object.keys(d).length>0&&gg(a,l,d,dg);let g=c.divergent>0||c.declined>0;return {files:u,counts:c,hasUnresolved:g}}async function Jv(e){let{dstPath:t,template:r,existingLockHash:n,force:o,isInteractive:s,confirmOverwrite:i}=e;if(!existsSync(t))return {status:"new",write:true,recordHash:r.sha256};let a=Vv(readFileSync(t,"utf8"));return a===r.sha256?{status:"unchanged",write:false,recordHash:r.sha256}:n!==void 0&&a===n?o?{status:"clean",write:true,recordHash:r.sha256}:s?await i(r.path)?{status:"clean",write:true,recordHash:r.sha256}:{status:"declined",write:false,recordHash:void 0}:{status:"declined",write:false,recordHash:void 0}:o?{status:"divergent",write:true,recordHash:r.sha256}:(b(`divergent, kept local (customized): ${r.path}`),{status:"divergent",write:false,recordHash:a})}async function Gv(e){return de(` Overwrite ${e} with the updated template? [y/N] `)}async function Wv(e){return de(` Create a generic ${e} with Flow strategy conventions? [y/N] `)}F();R();Ee();Hr();R();var mc=x("lib:otelMetrics"),Xv="flow-plugins-cli",qv="1.0.0",Yv=5e3;function Zv(){return $t("FLOW_OTEL_ENDPOINT_URL","https://flow.ciandt.com/otel")}function Qv(e,t){return typeof t=="number"?{key:e,value:{intValue:String(t)}}:typeof t=="boolean"?{key:e,value:{boolValue:t}}:{key:e,value:{stringValue:t}}}function eE(e,t){let r=String(Date.now()*1e6);return {resourceMetrics:[{resource:{attributes:[]},scopeMetrics:[{scope:{name:Xv,version:qv},metrics:[{name:e,sum:{dataPoints:[{asInt:"1",startTimeUnixNano:r,timeUnixNano:r,attributes:Object.entries(t).map(([n,o])=>Qv(n,o))}],aggregationTemporality:1,isMonotonic:true}}]}]}]}}async function fc(e,t={}){try{let[r,n]=await Promise.all([In(),Z()]),o=r?.email,s=n?.tenant;if(!o||!s){mc.debug(`Skipping OTel metric "${e}": no cached identity available`);return}let i=eE(e,t);await Sd.post(Zv(),{json:i,timeout:Yv,headers:{"Content-Type":"application/json","x-flow-user":o,flowtenant:s}}),mc.debug(`OTel metric sent: ${e}`);}catch(r){mc.warn(`Failed to send OTel metric "${e}": ${String(r)}`);}}var gc=x("cli:init"),nE={new:{label:"new",color:T.green},unchanged:{label:"unchanged",color:T.dim},clean:{label:"updated",color:T.cyan},divergent:{label:"kept (customized)",color:T.yellow},declined:{label:"pending (declined)",color:T.yellow}};function oE(e){process.stdout.write(`
|
|
559
|
+
`+T.bold(` flow setup strategy
|
|
560
|
+
`)),process.stdout.write(T.dim(` Target: ${e}
|
|
561
|
+
|
|
562
|
+
`)),process.stdout.write(T.dim(` Files evaluated:
|
|
563
|
+
`));for(let t of es)process.stdout.write(T.dim(` \xB7 ${t.path}
|
|
564
|
+
`));process.stdout.write(`
|
|
565
|
+
`);}function sE(e,t,r,n){E(I.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:t,duration_ms:n,exit_code:r}).catch(o=>{gc.warn(`Failed to emit strategy init completed event: ${String(o)}`);}),fc("flow_cli.strategy_init",{dry_run:t,files_new:e.new,files_updated:e.clean,exit_code:r}).catch(()=>{});}function iE(e,t){E(I.CLI_STRATEGY_INIT_FAILED,{error_message:e.slice(0,500),duration_ms:t}).catch(r=>{gc.warn(`Failed to emit strategy init failed event: ${String(r)}`);}),fc("flow_cli.strategy_init_failed",{duration_ms:t}).catch(()=>{});}async function aE(e){try{return await simpleGit(e).checkIsRepo(CheckRepoActions.IN_TREE)}catch{return false}}async function lE(){return de(" Continue anyway? [y/N] ")}async function wg(e){gc.debug(`Running flow setup strategy: ${JSON.stringify(e)}`);let t=e.path??process.cwd(),r=e.isInteractive??!!process.stdin.isTTY,n=e.confirmContinueWithoutGit??lE;if(!await aE(t)){let p=`${t} is not a git repository. Strategy docs are meant to be version-controlled \u2014 consider running "git init" first.`;if(!r)return e.json?_e({error:p,exitCode:1}):P(`${p} Re-run interactively to confirm, or run "git init" first.`),1;if(b(p),!await n())return 1}e.json||oE(t);let o=Date.now(),s;try{s=await yg({targetDir:t,dryRun:e.dryRun,force:e.force,assistant:e.assistant});}catch(p){throw iE(p instanceof Error?p.message:String(p),Date.now()-o),p}let i=s.hasUnresolved?2:0;if(sE(s.counts,!!e.dryRun,i,Date.now()-o),e.json)return Se({dryRun:!!e.dryRun,counts:s.counts,files:s.files,exitCode:i}),i;let a=e.dryRun?T.dim("[dry-run] "):"";process.stdout.write(T.bold(` Result:
|
|
566
|
+
`));for(let p of s.files){let{label:g,color:f}=nE[p.status];process.stdout.write(` ${a}${f(g.padEnd(18))} ${p.path}
|
|
567
|
+
`);}process.stdout.write(`
|
|
568
|
+
`);let{new:l,unchanged:u,clean:c,divergent:d,declined:m}=s.counts;return q(`${l} new, ${u} unchanged, ${c} updated, ${d} kept (customized)`+(m>0?`, ${m} pending confirmation`:"")),d>0&&b("Some files were kept as-is because they differ from what this command last wrote. Re-run with --force to overwrite them."),m>0&&b("Some updates were declined or skipped (no TTY). Re-run with --force to apply them."),i!==0&&P("flow setup strategy finished with unresolved files \u2014 see above."),i}F();j();var oo=["runbook-common","runbook-design","runbook-ops","runbook-product","runbook-quality","runbook-security","runbook-tech"];var yc="repos.yaml",pE="projects",mE="projects-ref";function Sg(e){return Array.isArray(e)?e.filter(t=>typeof t=="object"&&t!==null).map(t=>({name:String(t.name??""),remote:String(t.remote??""),group:t.group!==void 0?String(t.group):void 0})).filter(t=>t.name&&t.remote):[]}function vg(e){let t=join(e,yc);if(!existsSync(t))return null;let r=parse(readFileSync(t,"utf8"));if(!r||typeof r!="object"||Array.isArray(r))return null;let n=r.workspace??{};return {workspace:{repos_dir:String(n.repos_dir??pE),refs_dir:String(n.refs_dir??mE)},repos:Sg(r.repos),references:Sg(r.references)}}function Eg(e,t){let r=join(e,yc);writeFileSync(r,stringify(t),"utf8");}function Pg(e){let t=join(e,".gitignore"),r=yc;if(!existsSync(t)){writeFileSync(t,`${r}
|
|
569
|
+
`,"utf8");return}readFileSync(t,"utf8").split(`
|
|
570
|
+
`).some(s=>s.trim()===r)||appendFileSync(t,`${r}
|
|
571
|
+
`,"utf8");}var Tg="projects",Cg="projects-ref";function fE(e){let t=e.match(/^https?:\/\/github\.com\/([^/]+)\/([^/.]+)(\.git)?\/?$/);return t?`git@github.com:${t[1]}/${t[2]}.git`:e}async function gE(){let e=await Rr(" Repo name (ENTER to finish): ");if(!e)return null;let t=await Rr(` Group/category for '${e}' (optional, default: general): `),r=await Rr(` Remote (URL) for '${e}' \u2014 SSH or HTTPS: `);if(!r)return null;let n=fE(r),o=await de(` Is '${e}' a reference/read-only repo? [y/N] `);return {entry:{name:e,remote:n,group:t||"general"},isReference:o}}async function kg(){if(!await de("repos.yaml not found. Set up this repo as a multi-repo workspace? [y/N] "))return null;let t=await Rr(` Folder for work repos (default: ${Tg}): `),r=await Rr(` Folder for reference repos (default: ${Cg}): `),n=[],o=[];for(;;){let s=await gE();if(!s)break;s.isReference?o.push(s.entry):n.push(s.entry);}return n.length===0&&o.length===0?null:{workspace:{repos_dir:t||Tg,refs_dir:r||Cg},repos:n,references:o}}R();var Rg=x("workspace:repos"),Lg=6e4;async function wE(e){try{return (await simpleGit(e).status()).current}catch{return null}}function Mg(){let{HOME:e,PATH:t,USER:r,SSH_AUTH_SOCK:n}=process.env;return {HOME:e,PATH:t,USER:r,SSH_AUTH_SOCK:n,GIT_TERMINAL_PROMPT:"0"}}async function SE(e){await simpleGit(e,{timeout:{block:Lg}}).env(Mg()).pull(["--ff-only"]);}async function xE(e,t){await simpleGit({timeout:{block:Lg}}).env(Mg()).clone(e,t);}async function Sc(e,t,r){let n=join(t,e.name),o=join(n,".git");if(existsSync(o)){let s=await wE(n);if(s==="main"||s==="master")try{return await SE(n),{name:e.name,kind:r,outcome:"updated"}}catch(i){return Rg.warn(`[${e.name}] pull failed (branch diverged?): ${String(i)}`),{name:e.name,kind:r,outcome:"skipped"}}return {name:e.name,kind:r,outcome:"skipped"}}try{return mkdirSync(t,{recursive:!0}),await xE(e.remote,n),{name:e.name,kind:r,outcome:"cloned"}}catch(s){let i=s instanceof Error?s.message:String(s);return Rg.error(`[${e.name}] clone failed: ${i}`),{name:e.name,kind:r,outcome:"failed",error:i}}}function Yi(e,t){return existsSync(e)?readdirSync(e,{withFileTypes:true}).filter(r=>r.isDirectory()&&!t.has(r.name)).map(r=>r.name):[]}async function _g(e={}){let t=e.targetDir??process.cwd(),r=e.isInteractive??!!process.stdin.isTTY,n=vg(t);if(!n){if(!r)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true};let d=await kg();if(!d)return {repos:[],orphans:[],prunedCount:0,skippedNoManifest:true};Eg(t,d),Pg(t),n=d;}let o=join(t,n.workspace.repos_dir),s=join(t,n.workspace.refs_dir),i=[];for(let d of n.repos)i.push(await Sc(d,o,"repo"));for(let d of n.references)i.push(await Sc(d,s,"reference"));let a=new Set(n.repos.map(d=>d.name)),l=new Set(n.references.map(d=>d.name)),u=[...Yi(o,a),...Yi(s,l)],c=0;if(e.prune&&u.length>0)for(let d of [o,s]){let m=Yi(d,d===o?a:l);for(let p of m)rmSync(join(d,p),{recursive:true,force:true}),c++;}return {repos:i,orphans:e.prune?[]:u,prunedCount:c,skippedNoManifest:false}}R();var IE=["local","project","user"];function vE(){b(`The following ${oo.length} runbook bundles will be installed:`);for(let e of oo)process.stdout.write(` - ${e}
|
|
572
|
+
`);}function EE(e){let t=Ue().plugins,r=process.cwd();for(let[n,o]of Object.entries(t))if(n===e||n.startsWith(`${e}@`)){let s=o.find(i=>i.scope==="user"||i.projectPath===r);if(s)return s}}function Zi(e){return e.scope==="user"?"globally (~/.claude/)":`at ${e.scope} scope in ${e.projectPath??"(unknown project)"}`}async function PE(e,t,r){return b(`${e} is already installed ${Zi(r)}.`),de(` Move it to ${Wt[t].actionLabel} instead? This uninstalls it from ${Zi(r)} first. [y/N] `)}async function TE(){return jd(" Install scope:",IE.map(e=>({value:e,label:Wt[e].actionLabel,description:Wt[e].description})))}async function Dg(e={}){let t=e.isInteractive??!!process.stdin.isTTY;e.silent||vE();let r=e.scope;if(!r&&!e.silent&&t)try{r=await TE();}catch(o){if(o instanceof Error&&o.message==="SIGINT")return process.stdout.write(`
|
|
573
|
+
`),130;throw o}let n=[];for(let o=0;o<oo.length;o++){let s=oo[o],i=`[${o+1}/${oo.length}] `,a=e.force??false;if(!a){let l=EE(s);if(l){if(e.silent||!t){e.silent||b(`${i}Skipping ${s} \u2014 already installed ${Zi(l)}. Re-run with --force to install here too.`);continue}try{if(!await PE(s,r,l)){b(`${i}Skipped ${s}.`);continue}let c=await ji(s,{force:!0,scope:l.scope});if(c!==0){b(`${i}Could not remove ${s} from ${Zi(l)} \u2014 skipping rather than leaving it in an inconsistent state.`),n.push(c);continue}}catch(u){if(u instanceof Error&&u.message==="SIGINT")return process.stdout.write(`
|
|
574
|
+
`),130;throw u}}}e.silent||b(`${i}Installing ${s}...`),n.push(await ro([s],{scope:r,silent:e.silent,force:a}));}return n.some(o=>o!==0)?1:0}var CE=x("cli:setup-workspace");function kE(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 Og(e={}){CE.debug(`Running flow setup workspace: ${JSON.stringify(e)}`);let t=await _g({targetDir:e.path,prune:e.prune});if(e.json)return Se({repos:t.repos,orphans:t.orphans,prunedCount:t.prunedCount,skippedNoManifest:t.skippedNoManifest}),t.repos.some(i=>i.outcome==="failed")?1:0;if(t.skippedNoManifest)return b("No repos.yaml and no interactive terminal \u2014 nothing to do."),0;for(let i of t.repos)process.stdout.write(` ${i.name}: ${kE(i.outcome)}
|
|
575
|
+
`);let r=t.repos.filter(i=>i.outcome==="cloned").length,n=t.repos.filter(i=>i.outcome==="updated").length,o=t.repos.filter(i=>i.outcome==="skipped").length,s=t.repos.filter(i=>i.outcome==="failed").length;return q(`${r} cloned, ${n} updated, ${o} skipped`+(s>0?`, ${s} failed`:"")+(t.prunedCount>0?`, ${t.prunedCount} pruned`:"")),t.orphans.length>0&&b(`Orphan director${t.orphans.length===1?"y":"ies"} not in repos.yaml: ${t.orphans.join(", ")}. Re-run with --prune to remove.`),s>0?1:0}function Ug(e){let t=new Command;t.enablePositionalOptions(),t.name("flow").description("FlowSetup CLI \u2014 Manage Flow plugins in your Claude Code").version(`@ciandt-flow/cli v${ue}`,"-V, --version","Display the CLI version").addHelpText("after",`
|
|
536
576
|
Without arguments, opens the interactive interface (TUI).
|
|
537
577
|
Use 'flow <command> --help' for details on each command.`).action(async()=>{await e();});let r=new Command("setup").description("Configure the CLI and provision Flow structure in the current repository");r.command("init").description("Initialize the Flow CLI configuration").addHelpText("after",`
|
|
538
578
|
Examples:
|
|
539
|
-
$ flow setup init`).action(async()=>{let c=await
|
|
579
|
+
$ flow setup init`).action(async()=>{let c=await tc();N(c);}),r.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"])).addHelpText("after",`
|
|
540
580
|
Examples:
|
|
541
581
|
$ flow setup strategy
|
|
542
582
|
$ flow setup strategy --dry-run
|
|
543
583
|
$ flow setup strategy --force
|
|
544
|
-
$ flow setup strategy --
|
|
584
|
+
$ flow setup strategy --assistant claude-code
|
|
585
|
+
$ flow setup strategy --json --path ./my-repo`).action(async c=>{let d=await wg({dryRun:c.dryRun,json:c.json,force:c.force,path:c.path,assistant:c.assistant});N(d);}),r.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",`
|
|
545
586
|
Examples:
|
|
546
587
|
$ flow setup harness
|
|
547
588
|
$ flow setup harness --scope project
|
|
548
589
|
$ flow setup harness --scope local --force
|
|
549
590
|
|
|
550
591
|
Without --scope and with an interactive terminal, prompts once for the scope
|
|
551
|
-
(local/project/user) before installing all
|
|
592
|
+
(local/project/user) before installing all 7 bundles. A bundle already
|
|
552
593
|
installed elsewhere (any scope, any project) prompts to move it here instead
|
|
553
594
|
(uninstall there, install here) unless --force is passed, which installs
|
|
554
|
-
here too without asking, leaving the bundle enabled in both places.`).action(async c=>{let d=await
|
|
595
|
+
here too without asking, leaving the bundle enabled in both places.`).action(async c=>{let d=await Dg({scope:c.scope,silent:c.silent,force:c.force});N(d);}),r.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",`
|
|
596
|
+
Examples:
|
|
597
|
+
$ flow setup workspace
|
|
598
|
+
$ flow setup workspace --prune
|
|
599
|
+
$ flow setup workspace --json --path ./my-workspace`).action(async c=>{let d=await Og({path:c.path,prune:c.prune,json:c.json});N(d);}),t.addCommand(r);let n=new Command("plugin").description("Manage plugins from the Findr catalog installed in your Claude Code");n.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",`
|
|
555
600
|
Examples:
|
|
556
601
|
$ flow plugin list
|
|
557
602
|
$ flow plugin list --available
|
|
558
603
|
$ flow plugin list --outdated
|
|
559
604
|
$ flow plugin list --json
|
|
560
|
-
$ flow plugin list --available --source flow-harness`).action(async c=>{let d=await
|
|
605
|
+
$ flow plugin list --available --source flow-harness`).action(async c=>{let d=await wf(c);N(d);}),n.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",`
|
|
561
606
|
Examples:
|
|
562
607
|
$ flow plugin install flow-adr-writer
|
|
563
608
|
$ flow plugin install flow-adr-writer --scope project
|
|
@@ -566,11 +611,11 @@ Examples:
|
|
|
566
611
|
$ flow plugin install flow-adr-writer --silent
|
|
567
612
|
$ flow plugin install superpowers@claude-plugins-official
|
|
568
613
|
$ flow plugin install agent-sdk-dev@claude-code-plugins --marketplace-source anthropics/claude-code
|
|
569
|
-
$ flow plugin install runbook-design --source flow-harness`).action(async(c,d)=>{let m=c.filter(
|
|
614
|
+
$ flow plugin install runbook-design --source flow-harness`).action(async(c,d)=>{let m=c.filter(g=>g.trim());if(m.length===0){P("No valid plugin names provided"),N(1);return}Ge("cli",{verbose:d.verbose,silent:d.silent});let p=await ro(m,d);N(p);}),n.command("uninstall").description("Remove an installed plugin from Claude Code").argument("<name>","Name of the plugin to remove").option("--force","Skip interactive confirmation").addOption(new Option("--scope <scope>","Scope to uninstall from: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
|
|
570
615
|
Examples:
|
|
571
616
|
$ flow plugin uninstall flow-adr-writer
|
|
572
617
|
$ flow plugin uninstall flow-adr-writer --scope project
|
|
573
|
-
$ flow plugin uninstall startup-pack-ai --force`).action(async(c,d)=>{let m=await
|
|
618
|
+
$ flow plugin uninstall startup-pack-ai --force`).action(async(c,d)=>{let m=await ji(c,d);N(m);}),n.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",`
|
|
574
619
|
Examples:
|
|
575
620
|
$ flow plugin update flow-adr-writer
|
|
576
621
|
$ flow plugin update flow-adr-writer --scope project
|
|
@@ -579,79 +624,79 @@ Examples:
|
|
|
579
624
|
$ flow plugin update flow-adr-writer --verbose
|
|
580
625
|
$ flow plugin update flow-adr-writer --silent
|
|
581
626
|
$ flow plugin update
|
|
582
|
-
$ flow plugin update --dry-run`).action(async(c,d)=>{
|
|
627
|
+
$ flow plugin update --dry-run`).action(async(c,d)=>{Ge("cli",{verbose:d.verbose,silent:d.silent});let m=await If(c??null,d);N(m);}),n.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",`
|
|
583
628
|
Examples:
|
|
584
629
|
$ flow plugin enable flow-adr-writer
|
|
585
|
-
$ flow plugin enable flow-adr-writer --scope project`).action(async(c,d)=>{
|
|
630
|
+
$ flow plugin enable flow-adr-writer --scope project`).action(async(c,d)=>{Ge("cli");let m=await Sf(c,d);N(m);}),n.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",`
|
|
586
631
|
Examples:
|
|
587
632
|
$ flow plugin disable flow-adr-writer
|
|
588
|
-
$ flow plugin disable flow-adr-writer --scope project`).action(async(c,d)=>{
|
|
633
|
+
$ flow plugin disable flow-adr-writer --scope project`).action(async(c,d)=>{Ge("cli");let m=await xf(c,d);N(m);}),n.command("export").description("Export installed plugins to a JSON file").option("--output <file>","Output file path","flow-plugins.json").addHelpText("after",`
|
|
589
634
|
Examples:
|
|
590
635
|
$ flow plugin export
|
|
591
|
-
$ flow plugin export --output my-plugins.json`).action(async c=>{let d=await
|
|
636
|
+
$ flow plugin export --output my-plugins.json`).action(async c=>{let d=await rg(c);N(d);}),n.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",`
|
|
592
637
|
Examples:
|
|
593
638
|
$ flow plugin import flow-plugins.json
|
|
594
639
|
$ flow plugin import flow-plugins.json --scope user
|
|
595
640
|
$ flow plugin import flow-plugins.json --force
|
|
596
641
|
$ flow plugin import flow-plugins.json --dry-run
|
|
597
|
-
$ flow plugin import flow-plugins.json --diff`).action(async(c,d)=>{let m=await
|
|
642
|
+
$ flow plugin import flow-plugins.json --diff`).action(async(c,d)=>{let m=await ng(c,d);N(m);});let o=new Command("marketplace").description("Manage plugin marketplaces");o.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",`
|
|
598
643
|
Examples:
|
|
599
644
|
$ flow plugin marketplace add anthropics/claude-code
|
|
600
645
|
$ flow plugin marketplace add https://github.com/owner/repo
|
|
601
646
|
$ flow plugin marketplace add anthropics/claude-code --force
|
|
602
|
-
$ flow plugin marketplace add anthropics/claude-code --silent`).action(async(c,d)=>{
|
|
647
|
+
$ flow plugin marketplace add anthropics/claude-code --silent`).action(async(c,d)=>{Ge("cli",{verbose:d.verbose,silent:d.silent});let m=await Pf(c,d);N(m);}),n.addCommand(o),t.addCommand(n);let s=new Command("mcp").description("Manage MCP servers from the Findr catalog");s.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",`
|
|
603
648
|
Examples:
|
|
604
649
|
$ flow mcp add notion --transport http https://mcp.notion.com/mcp
|
|
605
650
|
$ flow mcp add mcp-chrome --transport stdio uvx mcp-chrome
|
|
606
651
|
$ flow mcp add playwright-mcp --transport stdio uvx playwright-mcp --force
|
|
607
|
-
$ flow mcp add notion --transport http https://mcp.notion.com/mcp --scope project`).action(async(c,d,m)=>{
|
|
652
|
+
$ flow mcp add notion --transport http https://mcp.notion.com/mcp --scope project`).action(async(c,d,m)=>{Ge("cli",{verbose:m.verbose,silent:m.silent});let p=await Vp(c,d,m);N(p);}),s.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",`
|
|
608
653
|
Examples:
|
|
609
654
|
$ flow mcp remove notion
|
|
610
655
|
$ flow mcp remove notion --scope project
|
|
611
|
-
$ flow mcp remove playwright-mcp --force`).action(async(c,d)=>{
|
|
656
|
+
$ flow mcp remove playwright-mcp --force`).action(async(c,d)=>{Ge("cli",{verbose:d.verbose,silent:d.silent});let m=await Hp(c,d);N(m);}),t.addCommand(s);let i=new Command("auth").description("Manage authentication credentials");i.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",`
|
|
612
657
|
Examples:
|
|
613
658
|
$ flow auth login
|
|
614
659
|
$ flow auth login --jwt <token>
|
|
615
660
|
$ flow auth login --jwt <token> --starter-kit dev
|
|
616
661
|
$ flow auth login --jwt <token> --custom-email name@example.com
|
|
617
|
-
$ flow auth login --verbose`).action(async c=>{
|
|
662
|
+
$ flow auth login --verbose`).action(async c=>{Ge("cli",{verbose:c.verbose});let d=await tc(c);N(d);}),i.command("logout").description("Remove locally saved credentials").option("--force","Skip interactive confirmation").addHelpText("after",`
|
|
618
663
|
Examples:
|
|
619
664
|
$ flow auth logout
|
|
620
|
-
$ flow auth logout --force`).action(async c=>{let d=await
|
|
665
|
+
$ flow auth logout --force`).action(async c=>{let d=await mf(c.force);N(d);}),i.command("status").description("Display the current authentication status").addHelpText("after",`
|
|
621
666
|
Examples:
|
|
622
|
-
$ flow auth status`).action(async()=>{let c=await
|
|
667
|
+
$ flow auth status`).action(async()=>{let c=await ff();N(c);}),t.addCommand(i);let a=new Command("skills").description("Manage skills for Claude Code from GitHub repositories or local paths");a.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",`
|
|
623
668
|
Examples:
|
|
624
669
|
$ flow skills add vercel-labs/agent-skills
|
|
625
670
|
$ flow skills add owner/repo -g
|
|
626
671
|
$ flow skills add owner/repo --skill pr-review commit
|
|
627
672
|
$ flow skills add ./local/skills -y
|
|
628
|
-
$ flow skills add owner/repo --list`).action(async(c,d)=>{let m=await
|
|
673
|
+
$ flow skills add owner/repo --list`).action(async(c,d)=>{let m=await qf(c,d);N(m);}),a.command("list").description("List installed skills").option("-g, --global","List global skills (default: project)").option("--json","Output as JSON").addHelpText("after",`
|
|
629
674
|
Examples:
|
|
630
675
|
$ flow skills list
|
|
631
676
|
$ flow skills list -g
|
|
632
|
-
$ flow skills list --json`).action(async c=>{let d=await
|
|
677
|
+
$ flow skills list --json`).action(async c=>{let d=await Zf(c);N(d);}),a.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",`
|
|
633
678
|
Examples:
|
|
634
679
|
$ flow skills remove pr-review
|
|
635
|
-
$ flow skills remove pr-review -g --force`).action(async(c,d)=>{let m=await
|
|
680
|
+
$ flow skills remove pr-review -g --force`).action(async(c,d)=>{let m=await Qf(c,d);N(m);}),t.addCommand(a);let l=new Command("bundle").description("Manage Flow bundles");l.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",`
|
|
636
681
|
Examples:
|
|
637
682
|
$ flow bundle install "My React Kit"
|
|
638
683
|
$ flow bundle install "Squad Setup Bundle"
|
|
639
|
-
$ flow bundle install "My React Kit" --verbose`).action(async(c,d)=>{
|
|
684
|
+
$ flow bundle install "My React Kit" --verbose`).action(async(c,d)=>{Ge("cli",{verbose:d.verbose});let m=await vf(c);N(m);}),t.addCommand(l),t.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",`
|
|
640
685
|
Examples:
|
|
641
686
|
$ flow health
|
|
642
|
-
$ flow health --fix`).action(async c=>{let d=await
|
|
687
|
+
$ flow health --fix`).action(async c=>{let d=await Tf(c);N(d);}),t.command("usage").description("Show your current Flow budget usage").option("--json","output as JSON",false).addHelpText("after",`
|
|
643
688
|
Examples:
|
|
644
689
|
$ flow usage
|
|
645
|
-
$ flow usage --json`).action(async c=>{let d=await
|
|
690
|
+
$ flow usage --json`).action(async c=>{let d=await Lf(c);N(d);});let u=new Command("modules").description("Manage Flow modules (binary companions for Claude Code)");u.action(async()=>{let c=await lc();N(c);}),u.command("list").description("List available and installed modules").addHelpText("after",`
|
|
646
691
|
Examples:
|
|
647
|
-
$ flow modules list`).action(async()=>{let c=await
|
|
692
|
+
$ flow modules list`).action(async()=>{let c=await lc();N(c);}),u.command("install").description("Install a module by alias").argument("<alias>","Module alias to install (e.g. metrics, dashboard)").addHelpText("after",`
|
|
648
693
|
Examples:
|
|
649
694
|
$ flow modules install metrics
|
|
650
|
-
$ flow modules install dashboard`).action(async c=>{let d=await
|
|
695
|
+
$ flow modules install dashboard`).action(async c=>{let d=await cg(c);N(d);}),u.command("update").description("Update an installed module, or all installed modules").argument("[alias]","Module alias to update (omit to update all installed)").addHelpText("after",`
|
|
651
696
|
Examples:
|
|
652
697
|
$ flow modules update
|
|
653
|
-
$ flow modules update metrics`).action(async c=>{let d=await
|
|
698
|
+
$ flow modules update metrics`).action(async c=>{let d=await ug(c??null);N(d);}),t.addCommand(u);for(let c of se)t.command(c.alias).description(c.description).helpOption(false).allowUnknownOption().passThroughOptions().argument("[passthrough...]","Arguments forwarded to the module binary").action(async d=>{await ig(c.alias,d);});return t.hook("preAction",()=>{$i();}),t}R();function $E(){return Ie__default.join(Me__default.homedir(),".claude","settings.json")}function Bg(){let e=$E();try{if(!ve__default.existsSync(e))return !0;let r=JSON.parse(ve__default.readFileSync(e,"utf-8")).flowCli?.autoUpdate;return r===!1?!1:r==="modules-only"?"modules-only":!0}catch{return true}}R();var UE=x("updateChecker"),NE=promisify(execFile),BE=1440*60*1e3,Fg=3e4;function FE(){let e=process.env.FLOW_HOME??Ie__default.join(Me__default.homedir(),".flow");return Ie__default.join(e,"update.lock")}async function jg(e){try{let{stdout:t}=await NE(qt(),["view",e,"version"],{timeout:Fg,shell:process.platform==="win32"});return String(t).trim()||null}catch{return null}}async function jE(e){let t=new AbortController,r=setTimeout(()=>t.abort(),Fg);try{let n=await fetch(`https://api.github.com/repos/${e}/releases/latest`,{signal:t.signal});return n.ok?(await n.json()).tag_name?.replace(/^v/,"")??null:null}catch{return null}finally{clearTimeout(r);}}async function KE(e){return e.versionCheck.type==="npm-registry"?jg(e.versionCheck.package):jE(e.versionCheck.repo)}async function VE(){let e=await jg("@ciandt-flow/cli");return e&&je(ue,e)?(Ui({currentVersion:ue,latestVersion:e,isOutdated:true,packageName:"@ciandt-flow/cli"}).catch(()=>{}),e):null}async function HE(){let e=Zr().filter(t=>t.installMethod!==null);await Promise.all(e.map(async t=>{let r=se.find(i=>i.alias===t.alias);if(!r||r.hasOwnUpdateCheck)return;let n=Date.now(),o=t.lastChecked?new Date(t.lastChecked).getTime():0;if(n-o<BE)return;let s=await KE(r);try{await yt({...t,lastChecked:new Date().toISOString()});}catch(i){UE.warn(`Failed to update lastChecked for ${t.alias}: ${String(i)}`);}s&&t.installedVersion&&je(t.installedVersion,s)&&Bs(r,"background").catch(()=>{});}));}async function Ic(){let e=Bg();if(e===false)return;let t=FE();ve__default.mkdirSync(Ie__default.dirname(t),{recursive:true});let r=null;try{r=await fy.lock(t,{realpath:!1,retries:0});}catch{return}try{if(e!=="modules-only"){let n=await VE().catch(()=>null);n&&process.stdout.write(`
|
|
654
699
|
\u26A0 @ciandt-flow/cli v${n} installing in background.
|
|
655
700
|
Restart flow to apply the update.
|
|
656
701
|
|
|
657
|
-
`);}await
|
|
702
|
+
`);}await HE().catch(()=>{});}finally{await r().catch(()=>{});}}var GE=x("cli"),vc=Ug(async()=>{Ge("tui"),ou("tui"),su(),process.on("SIGINT",()=>{let{activeTab:t,screen:r}=S.getState();mo("sigint",t,r).finally(()=>process.exit(130));}),process.on("SIGTERM",()=>{let{activeTab:t,screen:r}=S.getState();mo("sigterm",t,r).finally(()=>process.exit(143));}),await Ic().catch(()=>{}),await vd().catch(t=>{GE.error(`Failed to init catalog registry: ${String(t)}`);}),await tf();let{waitUntilExit:e}=render(jsx(rf,{}),{alternateScreen:true,exitOnCtrlC:false});await e(),process.exit(0);});vc.hook("preAction",async(e,t)=>{t!==vc&&await Ic().catch(()=>{});});vc.parse();
|