@ciandt-flow/cli 2.3.1-beta.252 → 2.3.1-beta.253
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 +96 -96
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {execa}from'execa';import Gc,{HTTPError}from'ky';import {Box,Text,render,useWindowSize,useInput,useApp}from'ink';import $g,{useRef,useCallback,useMemo,useEffect,useState}from'react';import {create}from'zustand';import*as Qr from'crypto';import {randomUUID,createHash}from'crypto';import*as Se from'fs';import Se__default,{readFileSync,mkdirSync,existsSync,realpathSync}from'fs';import*as ye from'path';import ye__default,{join,dirname,basename,normalize,resolve,sep,relative,isAbsolute}from'path';import*as Ce from'os';import Ce__default,{tmpdir,homedir}from'os';import {execFile,exec,spawnSync,spawn}from'child_process';import {promisify}from'util';import*as fa from'readline';import {createInterface}from'readline';import k from'chalk';import Ai from'conf';import {StatusCodes}from'http-status-codes';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import jf from'jsonwebtoken';import tg from'proper-lockfile';import Ig from'ink-big-text';import Ku from'ink-spinner';import*as Tt from'fs/promises';import {readFile,mkdir,writeFile,rename,stat,rm as rm$1,mkdtemp,readdir,cp}from'fs/promises';import Ch from'extract-zip';import {simpleGit}from'simple-git';import Ta from'semver';import tl from'yocto-spinner';import {Command,Option}from'commander';import {parse}from'yaml';var Dm=Object.defineProperty;var pi=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Om=(e,t)=>{for(var r in t)Dm(e,r,{get:t[r],enumerable:true});};function yf(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 Di(e){if(Ll.some(r=>r.test(e)))return true;let t=yf(e);return !!(t&&Ll.some(r=>r.test(t)))}function wf(e,t){let r=process.env[e]??t;if(!r)throw new Error(`Missing required environment variable: ${e}`);return r}function sn(e,t){let r=wf(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(!o&&Di(n.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${n.hostname}"`);return r}var Ll,Bn=pi(()=>{"use strict";Ll=[/^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\.0\.0\.0$/,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i];});function vh(){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 Hc(){return Vc??=vh(),Vc}var Vc,Jc=pi(()=>{"use strict";});var Wc={};Om(Wc,{GitRepoAdapter:()=>gn});function zc(e,t){if(!Ph.test(e))throw new Error(`Invalid ${t} in catalog source URL: "${e}"`)}var Ph,gn,ra=pi(()=>{"use strict";Jc();Bn();Ph=/^[a-zA-Z0-9_.-]+$/;gn=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(Di(o))throw new Error(`Catalog source URL points to a private/loopback address: "${o}"`);let i=s.replace(/^\//,"").split("/"),[a,l]=i;return zc(a,"owner"),zc(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 Gc.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 Gc.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 Hc();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}}};});var Ln="FLOW",Y="flow-skills",mi="flow-cli",Rn="internal",Xr="external",qr={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"}},dl={internal:{label:"Flow",color:"blue"},external:{label:"External",color:"white"}},fi=new Set(["internal","external"]),_n={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"}},se="flow-claude-md-setup",Ge=5,Er=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,Yr=/^https:\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.ciandt\.com(\/.*)?$/,Zr="Must be a valid CI&T domain (e.g. https://tenant.ciandt.com)";var pl=new Set(["skill","mcp","bundle"]),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(pl),origins:new Set(fi)},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(pl)},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(fi)},selectedIndex:0})),setDebugPanelOpen:t=>e({debugPanelOpen:t}),incrementCatalogVersion:()=>e(t=>({catalogVersion:t.catalogVersion+1})),setBundleInstallFlow:t=>e({bundleInstallFlow:t})}));var Eo="aes-256-gcm",Um=16,ml=16,Dn=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=Qr.randomBytes(Um),n=Qr.createCipheriv(Eo,this.key,r,{authTagLength:ml}),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:Eo}}decrypt(t){if(t.algorithm!==Eo)throw new Error(`Unsupported encryption algorithm: ${t.algorithm}`);let r=Qr.createDecipheriv(Eo,this.key,Buffer.from(t.iv,"hex"),{authTagLength:ml});return r.setAuthTag(Buffer.from(t.authTag,"hex")),Buffer.concat([r.update(Buffer.from(t.ciphertext,"hex")),r.final()]).toString("utf8")}};var Bm=/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,Fm=/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g,jm=/[A-Za-z0-9+/]{40,}={0,2}/g;function gi(e){return e.replace(Bm,"Bearer ***").replace(Fm,"***").replace(jm,"***").replace(/\r\n|\r|\n/g,"\\n")}var Cr=".claude",Co=".flow";function fl(e,t){return yi(Y,e,t)}function hi(e){return ye.join(Ce.homedir(),Cr,"plugins","marketplaces",Y,"plugins","native",e)}function To(){return ye.join(Ce.homedir(),Cr,"plugins","marketplaces",Y,".claude-plugin","marketplace.json")}function ko(){return ye.join(Ce.homedir(),Cr,"plugins","known_marketplaces.json")}function gl(){return ye.join(Ce.homedir(),Cr,"plugins","marketplaces",Y)}function hl(){return ye.join(Ce.homedir(),Co,"cache","install.lock")}function yl(){return ye.join(Ce.homedir(),Co,"logs","flowsetup.log")}function yi(e,t,r){return ye.join(Ce.homedir(),Cr,"plugins","cache",e,t,r)}function Tr(e){let t=e==="global"?Ce.homedir():process.cwd();return ye.join(t,".claude","skills")}function On(e){let t=e==="global"?Ce.homedir():process.cwd();return ye.join(t,".claude","skills-lock.json")}function Ao(e="user"){return e==="project"?ye.join(process.cwd(),".opencode","plugins"):ye.join(Ce.homedir(),".config","opencode","plugins")}function wl(){return ye.join(Ce.homedir(),Co,"flow-catalogs.json")}function Sl(){let e=process.env.FLOW_HOME??ye.join(Ce.homedir(),Co);return ye.join(e,"config.json")}function $o(e="user"){return e==="project"||e==="local"?ye.join(process.cwd(),Cr,"agents"):ye.join(Ce.homedir(),Cr,"agents")}var Km=5*1024*1024,Vm=3,Mo=class{filePath;constructor(){this.filePath=yl(),this.ensureDir(),this.rotateIfNeeded();}write(t){let r=`[${t.timestamp.toISOString()}] [${t.level.toUpperCase()}] [${t.module}] ${t.message}
|
|
3
|
-
`;try{Se.appendFileSync(this.filePath,r,"utf-8");}catch{}}ensureDir(){try{let t=ye.dirname(this.filePath);Se.mkdirSync(t,{recursive:!0});}catch{}}rotateIfNeeded(){try{if(Se.statSync(this.filePath).size>
|
|
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
|
-
`);}};var
|
|
2
|
+
import {execa}from'execa';import Wc,{HTTPError}from'ky';import {Box,Text,render,useWindowSize,useInput,useApp}from'ink';import Mg,{useRef,useCallback,useMemo,useEffect,useState}from'react';import {create}from'zustand';import*as en from'crypto';import {randomUUID,createHash}from'crypto';import*as Se from'fs';import Se__default,{readFileSync,mkdirSync,existsSync,realpathSync}from'fs';import*as ye from'path';import ye__default,{join,dirname,basename,normalize,resolve,sep,relative,isAbsolute}from'path';import*as Ce from'os';import Ce__default,{tmpdir,homedir}from'os';import {execFile,exec,spawnSync,spawn}from'child_process';import {promisify}from'util';import*as ga from'readline';import {createInterface}from'readline';import k from'chalk';import $i from'conf';import {StatusCodes}from'http-status-codes';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import Kf from'jsonwebtoken';import rg from'proper-lockfile';import bg from'ink-big-text';import Hu from'ink-spinner';import*as Tt from'fs/promises';import {readFile,mkdir,writeFile,rename,stat,rm as rm$1,mkdtemp,readdir,cp}from'fs/promises';import Th from'extract-zip';import {simpleGit}from'simple-git';import ka from'semver';import rl from'yocto-spinner';import {Command,Option}from'commander';import {parse}from'yaml';var Um=Object.defineProperty;var mi=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Nm=(e,t)=>{for(var r in t)Um(e,r,{get:t[r],enumerable:true});};function wf(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 Oi(e){if(_l.some(r=>r.test(e)))return true;let t=wf(e);return !!(t&&_l.some(r=>r.test(t)))}function Sf(e,t){let r=process.env[e]??t;if(!r)throw new Error(`Missing required environment variable: ${e}`);return r}function an(e,t){let r=Sf(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(!o&&Oi(n.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${n.hostname}"`);return r}var _l,Fn=mi(()=>{"use strict";_l=[/^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\.0\.0\.0$/,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i];});function Ph(){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 Gc(){return Jc??=Ph(),Jc}var Jc,zc=mi(()=>{"use strict";});var qc={};Nm(qc,{GitRepoAdapter:()=>hn});function Xc(e,t){if(!Eh.test(e))throw new Error(`Invalid ${t} in catalog source URL: "${e}"`)}var Eh,hn,na=mi(()=>{"use strict";zc();Fn();Eh=/^[a-zA-Z0-9_.-]+$/;hn=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(Oi(o))throw new Error(`Catalog source URL points to a private/loopback address: "${o}"`);let i=s.replace(/^\//,"").split("/"),[a,l]=i;return Xc(a,"owner"),Xc(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 Wc.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 Wc.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 Gc();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}}};});var Rn="FLOW",Y="flow-skills",fi="flow-cli",_n="internal",qr="external",Yr={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"}},pl={internal:{label:"Flow",color:"blue"},external:{label:"External",color:"white"}},gi=new Set(["internal","external"]),Dn={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"}},se="flow-claude-md-setup",Ge=5,Cr=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,Zr=/^https:\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.ciandt\.com\/?$/,Qr="Must be a valid CI&T domain (e.g. https://tenant.ciandt.com)";var ml=new Set(["skill","mcp","bundle"]),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(ml),origins:new Set(gi)},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(ml)},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(gi)},selectedIndex:0})),setDebugPanelOpen:t=>e({debugPanelOpen:t}),incrementCatalogVersion:()=>e(t=>({catalogVersion:t.catalogVersion+1})),setBundleInstallFlow:t=>e({bundleInstallFlow:t})}));var Co="aes-256-gcm",Fm=16,fl=16,On=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=en.randomBytes(Fm),n=en.createCipheriv(Co,this.key,r,{authTagLength:fl}),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:Co}}decrypt(t){if(t.algorithm!==Co)throw new Error(`Unsupported encryption algorithm: ${t.algorithm}`);let r=en.createDecipheriv(Co,this.key,Buffer.from(t.iv,"hex"),{authTagLength:fl});return r.setAuthTag(Buffer.from(t.authTag,"hex")),Buffer.concat([r.update(Buffer.from(t.ciphertext,"hex")),r.final()]).toString("utf8")}};var jm=/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,Km=/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g,Vm=/[A-Za-z0-9+/]{40,}={0,2}/g;function hi(e){return e.replace(jm,"Bearer ***").replace(Km,"***").replace(Vm,"***").replace(/\r\n|\r|\n/g,"\\n")}var Tr=".claude",To=".flow";function gl(e,t){return wi(Y,e,t)}function yi(e){return ye.join(Ce.homedir(),Tr,"plugins","marketplaces",Y,"plugins","native",e)}function ko(){return ye.join(Ce.homedir(),Tr,"plugins","marketplaces",Y,".claude-plugin","marketplace.json")}function Ao(){return ye.join(Ce.homedir(),Tr,"plugins","known_marketplaces.json")}function hl(){return ye.join(Ce.homedir(),Tr,"plugins","marketplaces",Y)}function yl(){return ye.join(Ce.homedir(),To,"cache","install.lock")}function wl(){return ye.join(Ce.homedir(),To,"logs","flowsetup.log")}function wi(e,t,r){return ye.join(Ce.homedir(),Tr,"plugins","cache",e,t,r)}function kr(e){let t=e==="global"?Ce.homedir():process.cwd();return ye.join(t,".claude","skills")}function Un(e){let t=e==="global"?Ce.homedir():process.cwd();return ye.join(t,".claude","skills-lock.json")}function $o(e="user"){return e==="project"?ye.join(process.cwd(),".opencode","plugins"):ye.join(Ce.homedir(),".config","opencode","plugins")}function Sl(){return ye.join(Ce.homedir(),To,"flow-catalogs.json")}function xl(){let e=process.env.FLOW_HOME??ye.join(Ce.homedir(),To);return ye.join(e,"config.json")}function Mo(e="user"){return e==="project"||e==="local"?ye.join(process.cwd(),Tr,"agents"):ye.join(Ce.homedir(),Tr,"agents")}var Hm=5*1024*1024,Jm=3,Lo=class{filePath;constructor(){this.filePath=wl(),this.ensureDir(),this.rotateIfNeeded();}write(t){let r=`[${t.timestamp.toISOString()}] [${t.level.toUpperCase()}] [${t.module}] ${t.message}
|
|
3
|
+
`;try{Se.appendFileSync(this.filePath,r,"utf-8");}catch{}}ensureDir(){try{let t=ye.dirname(this.filePath);Se.mkdirSync(t,{recursive:!0});}catch{}}rotateIfNeeded(){try{if(Se.statSync(this.filePath).size>Hm){let r=new Date().toISOString().replace(/[:.]/g,"-"),n=this.filePath.replace(".log",`-${r}.log`);Se.renameSync(this.filePath,n),this.cleanOldBackups();}}catch{}}cleanOldBackups(){try{let t=ye.dirname(this.filePath),r=ye.basename(this.filePath,".log"),n=Se.readdirSync(t).filter(o=>o.startsWith(r+"-")&&o.endsWith(".log")).sort().reverse();for(let o of n.slice(Jm))Se.unlinkSync(ye.join(t,o));}catch{}}};var Ro=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 _o=class{write(t){process.stdout.write(t.message+`
|
|
5
|
+
`);}};var Do=[],Si=new Set;function xi(){return Do}function Il(e){return Si.add(e),()=>{Si.delete(e);}}var Oo=class{write(t){Do.push(t),Do.length>100&&Do.shift();for(let r of Si)r();}};var tn={debug:0,info:1,warn:2,error:3},$r={context:"cli",transports:[],minLevel:"warn",debugModules:null};function Gm(){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 Ue(e,t){if(e==="tui"){let r=Gm();$r={context:e,transports:[new Oo,new Lo],minLevel:r?"debug":"warn",debugModules:r};}else t?.silent?$r={context:e,transports:[],minLevel:"error",debugModules:null}:t?.verbose?$r={context:e,transports:[new Ro("cli")],minLevel:"debug",debugModules:null}:$r={context:e,transports:[new _o],minLevel:"info",debugModules:null};}function bl(){return $r.transports}function vl(e,t){let{debugModules:r,minLevel:n}=$r;return $r.context==="tui"&&r&&r!=="all"?r.has(t)?tn[e]>=tn.debug:tn[e]>=tn.warn:tn[e]>=tn[n]}var Pl=new Map;function Uo(e,t,r){if(!vl(e,t))return;let n={level:e,module:t,message:hi(r),timestamp:new Date};for(let o of bl())o.write(n);}function x(e){let t=Pl.get(e);if(t)return t;let r={debug:n=>Uo("debug",e,n),info:n=>Uo("info",e,n),warn:n=>Uo("warn",e,n),error:n=>Uo("error",e,n)};return Pl.set(e,r),r}var Ii=x("encryption"),bi="__encrypted__";function zm(e){return typeof e=="object"&&e!==null&&bi in e&&e[bi]===true}function vi(e){return {serialize(t){let r=JSON.stringify(t),n=e.encrypt(r),o={[bi]:true,envelope:n};return JSON.stringify(o,null," ")},deserialize(t){let r;try{r=JSON.parse(t);}catch{return Ii.warn("[encryption] Config file contains unparseable data, treating as empty"),{}}if(zm(r))try{let n=e.decrypt(r.envelope);return JSON.parse(n)}catch(n){return Ii.error(`[encryption] Decryption failed: ${n instanceof Error?n.message:"unknown error"}. Config will be treated as empty. Re-authentication may be required.`),{}}return Ii.info("[encryption] Detected plaintext config \u2014 will encrypt on next write"),r}}}var Pi=promisify(execFile),qm=promisify(exec),lt=x("encryption:macos-keyvault"),rn=class{static async isAvailable(){try{let{stdout:t}=await qm("command -v security");return lt.debug(`security binary found at: ${t.trim()}`),!0}catch{return lt.debug("security binary not found in PATH"),false}}async getSecret(t,r){try{lt.debug(`Looking up secret: service=${t}, account=${r}`);let{stdout:n}=await Pi("security",["find-generic-password","-w","-a",r,"-s",t]),o=n.trim();return lt.debug(`security find-generic-password result: ${o?"found":"empty"}`),o||null}catch(n){let o=n;return lt.debug(`security find-generic-password failed: code=${o.code}, stderr=${o.stderr?.trim()}, message=${o.message}`),null}}async setSecret(t,r,n){try{lt.debug(`Storing secret: service=${t}, account=${r}`),await Pi("security",["add-generic-password","-U","-a",r,"-s",t,"-w",n]),lt.debug("security add-generic-password succeeded");}catch(o){let s=o;throw lt.error(`security add-generic-password failed: code=${s.code}, stderr=${s.stderr?.trim()}, message=${s.message}`),o}}async deleteSecret(t,r){try{return lt.debug(`Deleting secret: service=${t}, account=${r}`),await Pi("security",["delete-generic-password","-a",r,"-s",t]),lt.debug("security delete-generic-password succeeded"),!0}catch(n){let o=n;return lt.debug(`security delete-generic-password failed: code=${o.code}, stderr=${o.stderr?.trim()}, message=${o.message}`),false}}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\x0e-\x1f\x7f]/g,"")}function ie(e){process.stdout.write(k.green(` \u2713 ${y(e)}
|
|
6
6
|
`));}function P(e){process.stderr.write(k.red(` \u2717 ${y(e)}
|
|
7
7
|
`));}function C(e){process.stdout.write(k.cyan(` \u2139 ${y(e)}
|
|
8
|
-
`));}function
|
|
8
|
+
`));}function nn(e,t){let r=t.map(a=>a.map(y)),n=[e,...r],o=e.map((a,l)=>Math.max(...n.map(c=>(c[l]??"").length))),s=o.map(a=>"\u2500".repeat(a)).join(" "),i=a=>a.map((l,c)=>l.padEnd(o[c])).join(" ");process.stdout.write(`
|
|
9
9
|
`),process.stdout.write(` ${k.bold(i(e))}
|
|
10
10
|
`),process.stdout.write(` ${k.dim(s)}
|
|
11
11
|
`);for(let a of r)process.stdout.write(` ${i(a)}
|
|
12
12
|
`);process.stdout.write(`
|
|
13
|
-
`);}function
|
|
14
|
-
`);}function
|
|
13
|
+
`);}function on(e){process.stdout.write(JSON.stringify(e,null,2)+`
|
|
14
|
+
`);}function Ne(e){process.stdout.write(JSON.stringify(e)+`
|
|
15
15
|
`);}function We(e){process.stderr.write(JSON.stringify(e)+`
|
|
16
|
-
`);}function te(e){return e instanceof Error?e.message:String(e)}function nr(e){let t=new Date(e);return isNaN(t.getTime())?"\u2014":new Intl.DateTimeFormat("en-US",{dateStyle:"short"}).format(t)}var
|
|
16
|
+
`);}function te(e){return e instanceof Error?e.message:String(e)}function nr(e){let t=new Date(e);return isNaN(t.getTime())?"\u2014":new Intl.DateTimeFormat("en-US",{dateStyle:"short"}).format(t)}var Ei=promisify(execFile),Ci=promisify(exec),ef=[{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"}],Z=x("encryption:linux-keyvault");async function tf(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 rf(e){let t=ga.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(y(e),n=>{t.close(),r(n.trim().toLowerCase());});})}var or=class e{static async isAvailable(){try{let{stdout:t}=await Ci("command -v secret-tool");Z.debug(`secret-tool found at: ${t.trim()}`);}catch{return Z.debug("secret-tool binary not found in PATH"),false}try{return await Ei("secret-tool",["lookup","service","__flow_connectivity_check__"]),Z.debug("Secret Service D-Bus connectivity check passed"),!0}catch(t){let n=t.stderr?.trim()??"";return n.includes("org.freedesktop.secrets")?(Z.debug(`Secret Service D-Bus not available: ${n}`),false):(Z.debug("secret-tool is available and D-Bus service is reachable"),true)}}static async detectPackageManager(){for(let t of ef)try{return await Ci(`command -v ${t.name}`),t}catch{}return null}static async ensureInstalled(){if(await e.isAvailable())return true;Z.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 Z.warn("Could not detect a supported package manager. Please install libsecret manually."),false;let r=await rf(" ? Install secret-tool? This requires sudo. (y/N) ");if(r!=="y"&&r!=="yes")return false;try{return Z.info(`Running: ${t.command}`),await tf("Installing secret-tool...",()=>Ci(t.command)),e.isAvailable()}catch{return Z.warn("Installation failed. Falling back to derived key."),false}}async getSecret(t,r){try{Z.debug(`Looking up secret: service=${t}, account=${r}`);let{stdout:n}=await Ei("secret-tool",["lookup","service",t,"account",r]),o=n.trim();return Z.debug(`secret-tool lookup result: ${o?"found":"empty"}`),o||null}catch(n){let o=n;return Z.debug(`secret-tool lookup failed: code=${o.code}, stderr=${o.stderr?.trim()}, message=${o.message}`),null}}async setSecret(t,r,n){Z.debug(`Storing secret: service=${t}, account=${r}`),Z.debug(`Environment: DBUS_SESSION_BUS_ADDRESS=${process.env.DBUS_SESSION_BUS_ADDRESS??"NOT SET"}`),Z.debug(`Environment: DISPLAY=${process.env.DISPLAY??"NOT SET"}, WAYLAND_DISPLAY=${process.env.WAYLAND_DISPLAY??"NOT SET"}`),Z.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?(Z.debug("secret-tool store succeeded"),o()):(Z.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=>{Z.error(`secret-tool store spawn error: ${l.message}`),s(l);});});}async deleteSecret(t,r){try{return Z.debug(`Deleting secret: service=${t}, account=${r}`),await Ei("secret-tool",["clear","service",t,"account",r]),Z.debug("secret-tool clear succeeded"),!0}catch(n){let o=n;return Z.debug(`secret-tool clear failed: code=${o.code}, stderr=${o.stderr?.trim()}, message=${o.message}`),false}}getStoragePath(){return "Linux Secret Service (secret-tool)"}};var sf=promisify(execFile),ct=x("encryption:windows-keyvault"),Ti=1,af=1,lf=2,cf=3;function ki(e,t){return `${e}:${t}`}var Ai=`
|
|
17
17
|
using System;
|
|
18
18
|
using System.Runtime.InteropServices;
|
|
19
19
|
using System.Text;
|
|
@@ -49,7 +49,7 @@ public class FlowCredManager {
|
|
|
49
49
|
|
|
50
50
|
public static string Read(string target) {
|
|
51
51
|
IntPtr credPtr;
|
|
52
|
-
if (!CredRead(target, ${
|
|
52
|
+
if (!CredRead(target, ${Ti}, 0, out credPtr)) return "";
|
|
53
53
|
try {
|
|
54
54
|
var cred = (CREDENTIAL)Marshal.PtrToStructure(credPtr, typeof(CREDENTIAL));
|
|
55
55
|
if (cred.CredentialBlobSize <= 0) return "";
|
|
@@ -63,7 +63,7 @@ public class FlowCredManager {
|
|
|
63
63
|
byte[] bytes = Encoding.UTF8.GetBytes(secret);
|
|
64
64
|
IntPtr targetPtr = Marshal.StringToHGlobalUni(target);
|
|
65
65
|
IntPtr userPtr = Marshal.StringToHGlobalUni(userName);
|
|
66
|
-
int[] persistLevels = new int[] { ${
|
|
66
|
+
int[] persistLevels = new int[] { ${lf}, ${cf}, ${af} };
|
|
67
67
|
int lastErr = 0;
|
|
68
68
|
try {
|
|
69
69
|
foreach (int persist in persistLevels) {
|
|
@@ -71,7 +71,7 @@ public class FlowCredManager {
|
|
|
71
71
|
try {
|
|
72
72
|
Marshal.Copy(bytes, 0, blobPtr, bytes.Length);
|
|
73
73
|
var cred = new CREDENTIAL();
|
|
74
|
-
cred.Type = ${
|
|
74
|
+
cred.Type = ${Ti};
|
|
75
75
|
cred.TargetName = targetPtr;
|
|
76
76
|
cred.CredentialBlobSize = bytes.Length;
|
|
77
77
|
cred.CredentialBlob = blobPtr;
|
|
@@ -89,56 +89,56 @@ public class FlowCredManager {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
public static bool Delete(string target) {
|
|
92
|
-
return CredDelete(target, ${
|
|
92
|
+
return CredDelete(target, ${Ti}, 0);
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
-
`;function
|
|
96
|
-
${
|
|
95
|
+
`;function Bn(e){return e.replace(/'/g,"''")}function No(e){return ["-NoProfile","-NonInteractive","-Command",e]}function uf(e){return `Add-Type -TypeDefinition @'
|
|
96
|
+
${Ai}
|
|
97
97
|
'@
|
|
98
|
-
[FlowCredManager]::Read('${
|
|
99
|
-
${
|
|
98
|
+
[FlowCredManager]::Read('${Bn(e)}')`}function df(e,t,r){return `Add-Type -TypeDefinition @'
|
|
99
|
+
${Ai}
|
|
100
100
|
'@
|
|
101
|
-
[FlowCredManager]::Write('${
|
|
102
|
-
${
|
|
101
|
+
[FlowCredManager]::Write('${Bn(e)}', '${Bn(t)}', '${Bn(r)}')`}function pf(e){return `Add-Type -TypeDefinition @'
|
|
102
|
+
${Ai}
|
|
103
103
|
'@
|
|
104
|
-
[FlowCredManager]::Delete('${
|
|
105
|
-
`)[0]:"unknown error";return ct.debug(`PowerShell not available: ${r}`),false}}async getSecret(t,r){try{let n=
|
|
106
|
-
`)[0]:"unknown error";return ct.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 ct.error(i),new Error(i)}}async deleteSecret(t,r){try{let n=
|
|
108
|
-
`)[0]:"unknown error";return ct.debug(`Failed to delete secret from Windows Credential Manager [service="${t}", account="${r}"]: ${o}`),false}}getStoragePath(){return "Windows Credential Manager (PowerShell)"}};var
|
|
104
|
+
[FlowCredManager]::Delete('${Bn(e)}')`}async function Bo(e){return sf("powershell.exe",e)}var sn=class{static async isAvailable(){try{let{stdout:t}=await Bo(No('Write-Output "ok"')),r=t.trim()==="ok";return ct.debug(`PowerShell availability check: ${r?"available":"unexpected output"}`),r}catch(t){let r=t instanceof Error?t.message.split(`
|
|
105
|
+
`)[0]:"unknown error";return ct.debug(`PowerShell not available: ${r}`),false}}async getSecret(t,r){try{let n=ki(t,r);ct.debug(`Looking up secret: target=${n}`);let o=uf(n),{stdout:s}=await Bo(No(o)),i=s.trim();return ct.debug(`CredRead result: ${i?"found":"empty"}`),i||null}catch(n){let o=n instanceof Error?n.message.split(`
|
|
106
|
+
`)[0]:"unknown error";return ct.error(`Failed to read secret from Windows Credential Manager [service="${t}", account="${r}"]: ${o}`),null}}async setSecret(t,r,n){try{let o=ki(t,r);ct.debug(`Storing secret: target=${o}`);let s=df(o,n,r),{stdout:i}=await Bo(No(s)),a=i.trim();if(a.startsWith("OK:")){let c=a.split(":")[1];ct.debug(`CredWrite succeeded (persist=${c})`);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 ct.error(i),new Error(i)}}async deleteSecret(t,r){try{let n=ki(t,r);ct.debug(`Deleting secret: target=${n}`);let o=pf(n),{stdout:s}=await Bo(No(o)),i=s.trim()==="True";return ct.debug(`CredDelete result: ${i}`),i}catch(n){let o=n instanceof Error?n.message.split(`
|
|
108
|
+
`)[0]:"unknown error";return ct.debug(`Failed to delete secret from Windows Credential Manager [service="${t}", account="${r}"]: ${o}`),false}}getStoragePath(){return "Windows Credential Manager (PowerShell)"}};var mf=32,ff="flow-plugins-cli-fallback",Mi="flow-plugins-cli-fallback",gf={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)"};function hf(){let e=`${Ce.hostname()}${Ce.userInfo().username}`;return en.scryptSync(e,ff,mf)}function yf(){let e=hf(),t=new On(e),r=vi(t);return new $i({projectName:Mi,serialize:r.serialize,deserialize:r.deserialize,configFileMode:384})}var jo=null;function Fo(){return jo||(jo=yf()),jo}var Be=class{warned=false;async getSecret(t,r){return Fo().get(`${t}:${r}`)??null}async setSecret(t,r,n){if(!this.warned){let o=gf[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=true;}Bo().set(`${t}:${r}`,n);}async deleteSecret(t,r){let n=Bo(),o=`${t}:${r}`;return n.has(o)?(n.delete(o),true):false}getStoragePath(){return Bo().path}static hasExistingData(){try{let t=new Ai({projectName:$i});return Se.existsSync(t.path)}catch{return false}}static clearFallbackFile(){try{let t=new Ai({projectName:$i});Se.rmSync(t.path,{force:!0});}catch{}Fo=null;}};async function Mi(){if(Be.hasExistingData())return new Be;switch(process.platform){case "darwin":return await tn.isAvailable()?new tn:new Be;case "linux":return await or.isAvailable()?new or:await or.ensureInstalled()?new or:new Be;case "win32":return await on.isAvailable()?new on:new Be;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var hf=x("config:credentials"),Ut="flow-plugins-cli",Li="credentials",Ri="token-cache",_i="user-info",Vo=null;async function sr(){return Vo||(Vo=Mi()),Vo}function Ho(){Vo=null;}async function ae(){let t=await(await sr()).getSecret(Ut,Li);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Bt(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 hf.error(`missing or empty fields: ${o.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await sr()).setSecret(Ut,Li,JSON.stringify(e));}async function kl(){let e=await sr();await e.deleteSecret(Ut,Li),await e.deleteSecret(Ut,Ri),await e.deleteSecret(Ut,_i);}async function Al(){return (await sr()).getStoragePath()}async function $l(e){await(await sr()).setSecret(Ut,Ri,JSON.stringify(e));}async function Jo(){let t=await(await sr()).getSecret(Ut,Ri);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Go(e){await(await sr()).setSecret(Ut,_i,JSON.stringify(e));}async function Ml(){let t=await(await sr()).getSecret(Ut,_i);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function ir(){let e=await Jo();return e?new Date(e.expiresAt)>new Date:false}function zo(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")}}Bn();var Oi=x("api:auth");function If(e){if(!Er.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var Rl={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};async function bf(e){if(e instanceof HTTPError){let t=e.response.status;Oi.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&&Rl[r]?new Error(Rl[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?(Oi.debug(`Non-HTTP error during authentication: ${e.message}`),e):(Oi.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function $r(e){let t=sn("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");If(e.tenant);let r;try{r=await Gc.post(t,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(s){throw await bf(s)}let n=r.expires_at??new Date(Date.now()+(r.expires_in??3600)*1e3).toISOString();await Bt(e),await $l({accessToken:r.access_token,expiresAt:n});let o=zo(r.access_token);await Go({sub:o.sub,name:o.name,email:o.email});}var _l=x("lib:tokenProvider");async function ar(){if(await ir()){let n=await Jo();if(n)return n.accessToken}_l.debug("Token expired or missing, re-authenticating...");let t=await ae();if(!t)throw new Error("Not authenticated. Run: flow auth login");Be.clearFallbackFile(),Ho(),await $r(t);let r=await Jo();if(!r)throw new Error("Authentication succeeded but token was not persisted");return _l.debug("Token refreshed successfully"),r.accessToken}Bn();var Wo=x("api:metrics");function Dl(){return sn("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function Ol(e,t,r){return Gc.post(e,{json:t,headers:r})}async function Pf(e){let t=await Ml();if(t)return t;let r=zo(e),n={sub:r.sub,name:r.name,email:r.email};return await Go(n),n}async function b(e,t){let r=await ar(),n=await Pf(r),o=await ae();if(!Er.test(o.tenant))throw new Error(`Invalid tenant value: "${o.tenant}"`);let s={action:e,booster:mi,metadata:{...t},success:true,tenant:o.tenant,timestamp:new Date().toISOString(),user:{id:n.sub,name:n.name,email:n.email}};try{await Ol(Dl(),s,{Authorization:`Bearer ${r}`,FlowTenant:o.tenant}),Wo.debug(`Metrics event sent: ${e}`);}catch(i){throw Wo.warn(`Failed to send metrics event "${e}": ${String(i)}`),i}}async function Nl(e,t,r){try{let n=r&&Er.test(r)?r:"unknown",o={action:e,booster:mi,metadata:t,success:!0,tenant:n,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await Ol(Dl(),o,{FlowTenant:n}),Wo.debug(`Anonymous metrics event sent: ${e}`);}catch(n){Wo.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"};var Ef={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},ut={...Ef};function Ul(e){let t=Date.now();ut={sessionStart:t,stepStart:t,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function Mr(e){ut.currentStep=e,ut.stepStart=Date.now();}function X(){return {...ut}}function Ft(){return ut.sessionStart===0?0:Date.now()-ut.sessionStart}function Lr(){return ut.stepStart===0?0:Date.now()-ut.stepStart}function Bl(){ut.tuiSessionStart=Date.now();}function Fl(){return ut.tuiSessionStart===0?0:Date.now()-ut.tuiSessionStart}var Cf=3e3,Tf=x("abandonment");async function Xo(e){let{currentStep:t,sessionStart:r}=X();if(r===0)return;let n={last_step:t,trigger:e,duration_ms:Ft()};try{await Promise.race([b(I.CLI_ONBOARDING_ABANDONED,n),new Promise((o,s)=>setTimeout(()=>s(new Error("abandonment timeout")),Cf))]);}catch(o){Tf.warn(`Abandonment event failed: ${String(o)}`);}}function jl(e,t){return Promise.race([e,new Promise(r=>setTimeout(r,t))])}var kf=3e3,Af=x("session-end");async function jn(e,t,r){let n=Fl(),s=[b(I.CLI_TUI_SESSION_ENDED,{duration_ms:n,active_tab:t,interface:"tui"})];r!=="main"&&s.push(Xo(e));try{await jl(Promise.all(s).then(()=>{}),kf);}catch(i){Af.warn(`Session end event failed: ${String(i)}`);}}var Rf=2e3;function Vl(){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),jn("double-ctrl-c",s,i).finally(()=>e());return}t.current=true,o(true),r.current=setTimeout(()=>{t.current=false,o(false);},Rf);},[e,o,s,i]);return useInput((l,c)=>{c.ctrl&&l==="c"&&a();}),{pendingExit:n}}var Nf=16;function Hl({label:e,value:t,onChange:r,masked:n=false,isActive:o,error:s}){let i=useRef(t);useEffect(()=>{i.current=t;},[t]),useInput((l,c)=>{if(c.backspace){let u=i.current.slice(0,-1);i.current=u,r(u);}else if(l&&!c.ctrl&&!c.meta&&!c.escape&&!c.return&&!c.tab&&!c.upArrow&&!c.downArrow&&!c.leftArrow&&!c.rightArrow){let u=i.current+l;i.current=u,r(u);}},{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(Nf)}),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]})})]})}var Xe=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})}));function Rr(){return ye__default.join(Ce__default.homedir(),".claude","settings.json")}function Jn(){let e=Rr();if(!Se__default.existsSync(e))return {status:"missing"};let t=Se__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 qo(e){let t=Rr();Se__default.mkdirSync(ye__default.dirname(t),{recursive:true});let r=`${t}.${randomUUID()}.tmp`;Se__default.writeFileSync(r,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,t);}function Gl(e,t){let r=e.env&&typeof e.env=="object"&&!Array.isArray(e.env)?e.env:{};return {...e,env:{...r,ANTHROPIC_AUTH_TOKEN:t}}}function Bi(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}var Kf=3600,_r=class extends Error{constructor(){super("~/.claude/settings.json contains invalid JSON"),this.name="MalformedSettingsError";}};function Vf(e){return jf.sign({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:Kf})}function Yo(e,t={}){let r=Jn();if(r.status==="malformed"&&!t.allowOverwriteMalformed)throw new _r;let n=r.status==="ok"?r.settings:{},o=r.status==="ok"?Bi(r.settings):null,s=Vf(e),i=Gl(n,s);return {jwt:s,merged:i,previousToken:o,hadExistingFile:r.status!=="missing"}}function Zo(e){qo(e.merged);}function zl(){let e=Jn();return e.status!=="ok"?false:Bi(e.settings)!==null}var Wl="0.0.0";try{let e=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8"));typeof e.version=="string"&&(Wl=e.version);}catch{}var le=Wl;function Gf(){let e=Sl();if(!Se__default.existsSync(e))return {};try{return JSON.parse(Se__default.readFileSync(e,"utf-8"))}catch{return {}}}var Fi=null;function zf(){return Fi===null&&(Fi=Gf()),Fi}function lr(){return !!zf().ENABLE_EXPERIMENTAL_BETAS}function Yf(){return re.filter(e=>e.platforms[process.platform]?.status==="supported")}function ql(e){let t=Yf();return t.length>0&&t.every(r=>e.find(n=>n.module.alias===r.alias)?.alreadyInstalled===true)}var Qo={alias:"metrics",required:true,name:"flow-ai-obs",configCheck:()=>{try{let e=ye__default.join(Ce__default.homedir(),".claude","settings.json"),r=Se__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=[];if(t.push(e.customUrl?["flow-ai-obs","init","--no-interactive","--custom-url",e.customUrl]:["flow-ai-obs","init","--no-interactive"]),e.credentials){let{clientId:r,clientSecret:n,tenant:o}=e.credentials;t.push(["flow-ai-obs","auth","login","--client-id",r,"--client-secret",n,"--tenant",o]);}return t},onDemand:null,mode:"non-interactive"}},Zf={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},re=lr()?[Qo,Zf]:[Qo];var rg=x("moduleState");function ts(){let e=process.env.FLOW_HOME??ye__default.join(Ce__default.homedir(),".flow");return ye__default.join(e,"modules.json")}var ng={retries:5,minTimeout:50};async function Yl(e,t){Se__default.mkdirSync(ye__default.dirname(e),{recursive:true});let r=await tg.lock(e+".lock",{realpath:false,retries:ng});try{return await t()}finally{await r();}}function Zl(){let e=ts();if(!Se__default.existsSync(e))return [];try{let t=JSON.parse(Se__default.readFileSync(e,"utf-8"));return t.schemaVersion!==1?(rg.warn(`modules.json has unknown schemaVersion ${t.schemaVersion}, resetting`),Se__default.rmSync(e,{force:!0}),[]):Array.isArray(t.modules)?t.modules.map(r=>({...r,name:r.name??null})):[]}catch{return Se__default.rmSync(e,{force:true}),[]}}function Dr(){return Zl()}function Ql(e){let t=ts();Se__default.mkdirSync(ye__default.dirname(t),{recursive:true});let r=`${t}.${randomUUID()}.tmp`,n={schemaVersion:1,modules:e};Se__default.writeFileSync(r,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,t);}function qe(e){return Dr().find(t=>t.alias===e)??null}async function dt(e){let t=ts();await Yl(t,async()=>{let r=Zl(),n=r.findIndex(o=>o.alias===e.alias);n===-1?r.push(e):r[n]=e,Ql(r);});}async function Or(){let e=ts();Se__default.existsSync(e)||await Yl(e,async()=>{Se__default.existsSync(e)||Ql([]);});}var ig=promisify(execFile);function cr(e,t){let r=e.platforms[process.platform];return !r||r.status!=="supported"?null:r.strategies.find(n=>n.type===t)??null}async function vt(e){let t=process.platform==="win32"?"where":"which";try{return await ig(t,[e]),!0}catch{return false}}function jt(){return process.platform==="win32"?"npm.cmd":"npm"}var ec=promisify(execFile),an=class{type="npm";async isAvailable(){return vt("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=cr(t,"npm");if(!r)return null;try{let{stdout:n}=await ec(jt(),["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=cr(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 ec(jt(),["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 rs=promisify(execFile),dg=/^(\S+)\s+([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/,ns=class{type="homebrew";async isAvailable(){return vt("brew")}async install(t){return this.runBrewCommand(t,"install")}async update(t,r){return this.runBrewCommand(t,"upgrade")}async getInstalledVersion(t){let r=cr(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=cr(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 rs("brew",["tap",o.tap]),await rs("brew",["trust",o.tap])),await rs("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 rs("brew",["list","--versions",t]),n=r.trim().match(dg);return n?n[2]:null}catch{return null}}};var ln=promisify(execFile),rc=/([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/;function nc(){let e=process.env.FLOW_HOME??ye__default.join(Ce__default.homedir(),".flow");return ye__default.join(e,"bin")}var os=class{type="curl";async isAvailable(){return vt("curl")}async install(t){let r=Date.now(),n=cr(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=ye__default.join(nc(),ye__default.basename(t.binaryName));for(let n of [r,t.binaryName])try{let{stdout:o}=await ln(n,["--version"]),s=o.match(rc);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=ye__default.join(Ce__default.tmpdir(),`flow-install-${randomUUID()}.sh`);try{if(await ln("curl",["-sSL","--fail","-o",s,t]),r){let a=await this.validateChecksum(s,r);if(!a.valid){try{Se__default.unlinkSync(s);}catch{}return {success:!1,error:{code:"CHECKSUM_MISMATCH",message:a.message},durationMs:Date.now()-o}}}return Se__default.chmodSync(s,448),await ln("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{Se__default.unlinkSync(s);}catch{}}}async installBinary(t,r,n,o){let s=nc(),i=ye__default.join(s,ye__default.basename(n.binaryName)),a=false;try{if(Se__default.mkdirSync(s,{recursive:!0}),a=!0,await ln("curl",["-L","--fail","-o",i,t]),r){let c=await this.validateChecksum(i,r);if(!c.valid)return Se__default.unlinkSync(i),{success:!1,error:{code:"CHECKSUM_MISMATCH",message:c.message},durationMs:Date.now()-o}}Se__default.chmodSync(i,493);let l=null;try{let{stdout:c}=await ln(i,["--version"]),u=c.match(rc);l=u?u[1]:null;}catch{}return {success:!0,version:l??void 0,method:"curl",durationMs:Date.now()-o}}catch(l){if(a)try{Se__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=ye__default.join(Ce__default.tmpdir(),`curl-checksum-${randomUUID()}`);try{await ln("curl",["-L","--fail","-o",n,r]);let o=Se__default.readFileSync(n,"utf-8").trim().split(/\s+/)[0],s=Se__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{Se__default.unlinkSync(n);}catch{}}}};var ve=x("moduleInstaller");function Et(e){switch(e){case "npm":return new an;case "homebrew":return new ns;case "curl":return new os}}async function Gn(e,t,r){try{await b(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){ve.warn(`Failed to emit install failed event: ${String(n)}`);}}async function dr(e,t,r,n){let o=Date.now(),s=e.platforms[process.platform];if(!s)return {success:false,error:{code:"PLATFORM_NOT_SUPPORTED",message:`Platform ${process.platform} is not listed for module ${e.alias}`},durationMs:Date.now()-o};if(s.status==="experimental"){ve.warn(`Module "${e.alias}" has experimental support on ${process.platform}`);let c={code:"PLATFORM_EXPERIMENTAL",message:`Experimental support on ${process.platform} \u2014 install manually`};return await Gn(e,t,c),{success:false,error:c,durationMs:Date.now()-o}}if(s.status!=="supported"){let c={code:"PLATFORM_NOT_SUPPORTED",message:`Module ${e.alias} is not supported on ${process.platform}`};return await Gn(e,t,c),{success:false,error:c,durationMs:Date.now()-o}}if(!s.strategies.some(c=>c.type===r)){let c={code:"STRATEGY_NOT_FOUND",message:`Strategy "${r}" is not configured for module "${e.alias}" on ${process.platform}`};return await Gn(e,t,c),{success:false,error:c,durationMs:Date.now()-o}}let i=Et(r),a=false;try{a=await i.isAvailable();}catch(c){ve.warn(`${r} availability check failed: ${String(c)}`);}if(!a){let c={code:"STRATEGY_NOT_AVAILABLE",message:`"${r}" is not installed on this system`};return await Gn(e,t,c),{success:false,error:c,durationMs:Date.now()-o}}try{await b(I.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:le,trigger:t});}catch(c){ve.warn(`Failed to emit install started event: ${String(c)}`);}let l;try{l=await i.install(e);}catch(c){let u=c instanceof Error?c.message:String(c);ve.warn(`${r} install threw: ${u}`),l={success:false,error:{code:"INSTALL_THREW",message:u},durationMs:Date.now()-o};}if(l.success){await dt({alias:e.alias,name:e.name,installedVersion:l.version??null,installMethod:l.method??null,installedAt:new Date().toISOString(),lastChecked:new Date().toISOString()});try{await b(I.CLI_MODULE_INSTALL_COMPLETED,{module_alias:e.alias,module_name:e.name,installed_version:l.version??"unknown",duration_ms:l.durationMs,os:process.platform,trigger:t});}catch(d){ve.warn(`Failed to emit install completed event: ${String(d)}`);}let{pendingCmd:c,failed:u}=await hg(e,t,n);return c?{...l,pendingInteractiveSetup:c}:u?{...l,postInstallFailed:true}:e.configCheck&&!e.configCheck()?{...l,configCheckFailed:true}:l}return await Gn(e,t,l.error??{code:"UNKNOWN",message:"unknown error"}),l}async function hg(e,t,r){if(!e.postInstall)return {pendingCmd:null,failed:false};let n=t==="onboarding"?e.postInstall.onboarding:e.postInstall.onDemand;if(n==null)return {pendingCmd:null,failed:false};let o;if(typeof n=="function"){let i=await ae(),a={credentials:i?{clientId:i.clientId,clientSecret:i.clientSecret,tenant:i.tenant}:null,customUrl:r??null};try{o=n(a);}catch(l){return ve.warn(`postInstall function threw: ${String(l)}`),{pendingCmd:null,failed:false}}}else o=n;if(o.length===0)return {pendingCmd:null,failed:false};if((e.postInstall.mode??"non-interactive")==="interactive")return {pendingCmd:o[0]??null,failed:false};let s=false;for(let i=0;i<o.length;i++){let a=o[i];if(a.length===0)continue;let l=spawnSync(a[0],a.slice(1),{stdio:"pipe",env:process.env,encoding:"utf-8",shell:process.platform==="win32"});if(l.status!==0){s=true,ve.debug(`postInstall "${a.join(" ")}" exited with status ${l.status??"null"}`),l.stderr&&ve.debug(l.stderr);let c=o.slice(i+1).filter(u=>u.length>0);c.length>0&&ve.debug(`continuing with remaining postInstall steps: ${c.map(u=>u.join(" ")).join(", ")}`);}}return {pendingCmd:null,failed:s}}async function ss(e,t){let r=Date.now(),n=qe(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=Et(n.installMethod),s=n.installedVersion??"unknown";if(t==="command")try{await b(I.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:le,trigger:"command"});}catch(a){ve.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);ve.warn(`${n.installMethod} update threw: ${l}`),i={success:false,error:{code:"UPDATE_THREW",message:l},durationMs:Date.now()-r};}if(i.success)if(await dt({...n,installedVersion:i.version??n.installedVersion,lastChecked:new Date().toISOString()}),t==="command")try{await b(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){ve.warn(`Failed to emit update completed event: ${String(a)}`);}else try{await b(I.CLI_MODULE_UPDATED,{module_alias:e.alias,from_version:s,to_version:i.version??"unknown",duration_ms:i.durationMs});}catch(a){ve.warn(`Failed to emit module updated event: ${String(a)}`);}else if(t==="command")try{await b(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){ve.warn(`Failed to emit update failed event: ${String(a)}`);}return i}var is=x("flowAiObsSetup");async function zn(e){try{if(!await new an().isAvailable().catch(()=>!1))return is.warn("npm not available \u2014 skipping flow-ai-obs install"),{npmFailed:!0,initFailed:!1};let n=await dr(Qo,"onboarding","npm",e);return n.success?n.postInstallFailed||n.configCheckFailed?(is.debug("flow-ai-obs init failed (postInstall exit non-zero or configCheck failed)"),{npmFailed:!1,initFailed:!0}):{npmFailed:!1,initFailed:!1}:(is.warn(`flow-ai-obs install failed: ${n.error?.message??"unknown"}`),{npmFailed:!0,initFailed:!1})}catch(t){return is.warn(`installFlowAiObs threw: ${String(t)}`),{npmFailed:false,initFailed:false,unexpectedError:true}}}var oc=x("AuthSetup");function wg(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 Ct=["clientId","clientSecret","tenant"],Sg={clientId:"Client ID",clientSecret:"Client Secret",tenant:"Tenant"};function sc(){let[e,t]=useState({clientId:"",clientSecret:"",tenant:""}),[r,n]=useState("clientId"),[o,s]=useState({}),[i,a]=useState(null),[l,c]=useState(false),[u,d]=useState("fields"),[m,p]=useState(null),[f,h]=useState(null),[g,w]=useState("confirm"),[v,O]=useState(""),_=useRef(""),[E,M]=useState(false),K=useRef(0),H=useRef(false),{setCredentials:ue,setJustAuthenticated:T}=Xe(),U=()=>({clientId:e.clientId.trim(),clientSecret:e.clientSecret.trim(),tenant:e.tenant.trim()}),G=()=>{d("fields"),p(null),t(A=>({...A,clientSecret:""})),n("clientSecret");},B=async()=>{H.current=true;let A=U();try{await Bt(A);}catch(at){a(at instanceof Error?at.message:"Failed to persist credentials"),G(),H.current=false;return}let{clientSecret:R,...V}=A;ue(V),T(true),b(I.CLI_SESSION_STARTED,{cli_version:le,os:process.platform,node_version:process.version,duration_ms:Ft(),interface:"tui"}).catch(()=>{}),await zn(f).catch(at=>oc.warn(`installFlowAiObs threw unexpectedly: ${String(at)}`)),Wn({starterKit:V.starterKit});},be=async A=>{H.current=true;let R=U();try{Zo(A),await Bt(R);}catch(Wr){a(Wr instanceof Error?Wr.message:"Failed to persist credentials"),G(),H.current=false;return}let{clientSecret:V,...at}=R;ue(at),T(true),b(I.CLI_SESSION_STARTED,{cli_version:le,os:process.platform,node_version:process.version,duration_ms:Ft(),interface:"tui"}).catch(()=>{}),await zn(f).catch(Wr=>oc.warn(`installFlowAiObs threw unexpectedly: ${String(Wr)}`)),Wn({starterKit:at.starterKit});},Nt=A=>{try{return Yo(U(),{allowOverwriteMalformed:A})}catch(R){return R instanceof _r?(d("malformedConfirm"),null):(a(R instanceof Error?R.message:"Failed to read settings.json"),d("fields"),null)}};useInput((A,R)=>{if(!(l||H.current)){if(u==="preview"){R.return&&m?be(m):R.escape?B():A==="q"&&G();return}if(u==="malformedConfirm"){if(R.return){let V=Nt(true);V&&(p(V),be(V));}else R.escape&&G();return}if(u==="customUrl"){if(g==="confirm")A==="y"||A==="Y"?w("input"):(A==="n"||A==="N"||R.return)&&N(null);else if(R.escape)_.current="",O(""),w("confirm");else if(R.return){let V=_.current.trim();V.length>0&&Yr.test(V)?(M(false),N(V)):V.length>0&&M(true);}else R.backspace||R.delete?(_.current=_.current.slice(0,-1),O(_.current)):A&&!R.ctrl&&!R.meta&&(_.current=_.current+A,O(_.current),M(false));return}if(R.shift&&R.tab){let V=Ct.indexOf(r);V>0&&n(Ct[V-1]);}else if(R.tab){let V=Ct.indexOf(r);V<Ct.length-1&&n(Ct[V+1]);}else if(R.return)if(r==="tenant")$();else {let V=Ct.indexOf(r);n(Ct[V+1]);}}},{isActive:true});let $=()=>{let A={};for(let R of Ct)e[R].trim()||(A[R]="This field is required");if(Object.keys(A).length>0){s(A);let R=Ct.find(V=>A[V]);R&&n(R);return}w("confirm"),_.current="",O(""),M(false),d("customUrl");},N=async(A=f)=>{h(A),c(true),a(null),K.current+=1;try{await $r(U());let R=Nt(!1);R&&(p(R),d("preview"));}catch(R){let V=R instanceof Error?R.message:"Authentication failed";a(V),Nl(I.CLI_AUTH_FAILED,{error_code:wg(R),attempt:K.current},e.tenant.trim()).catch(()=>{}),t(at=>({...at,clientSecret:""})),d("fields");}finally{c(false);}},z=A=>R=>{t(V=>({...V,[A]:R})),o[A]&&s(V=>({...V,[A]:void 0}));};return u==="customUrl"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[Ln," \u2014 Initial Setup"]})}),jsxs(Box,{flexDirection:"column",gap:1,children:[l&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),!l&&g==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),!l&&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:v}),jsx(Text,{color:"cyan",children:"\u2588"})]}),E&&jsx(Text,{color:"red",children:Zr}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})]}):u==="preview"&&m?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[Ln," \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:m.previousToken?" ~ env.ANTHROPIC_AUTH_TOKEN (replaced)":" + env.ANTHROPIC_AUTH_TOKEN (new)"}),m.hadExistingFile&&jsx(Text,{dimColor:true,children:" Existing settings preserved."})]})]}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsx(Text,{dimColor:true,children:"Enter \u2014 update settings.json and continue"}),jsx(Text,{dimColor:true,children:"Esc \u2014 skip JWT update, continue"}),jsx(Text,{dimColor:true,children:"q \u2014 back to form"})]})]}):u==="malformedConfirm"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"yellow",children:[Ln," \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"})})]}):jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[Ln," \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:Ct.map(A=>jsx(Box,{marginBottom:1,children:jsx(Hl,{label:Sg[A],value:e[A],onChange:z(A),masked:A==="clientSecret",isActive:r===A&&!l,error:o[A]})},A))}),l&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),i&&jsx(Box,{marginTop:1,children:jsxs(Text,{color:"red",children:["\u26A0 ",y(i)]})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Tab next field \xB7 Enter confirm"})})]})}function cn(){return jsxs(Box,{flexDirection:"column",alignItems:"center",children:[jsx(Ig,{text:"FLOW",font:"block",colors:["white","white"]}),jsx(Box,{marginTop:-1,marginBottom:1,children:jsxs(Text,{dimColor:true,children:["Marketplace \xB7 v",le]})})]})}var cc=[{id:"discover",focus:"list"},{id:"installed",focus:"list"},{id:"updates",focus:"list"},{id:"marketplaces",focus:"marketplaces"}],Q=lr()?cc:cc.slice(0,3);function bg(e){return Q.findIndex(t=>t.id===e)}function Vi(e,t,r){let n=bg(r.activeTab);if(t.rightArrow||t.tab){let o=Q[(n+1)%Q.length];return [{type:"setTab",tab:o.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:o.focus}]}if(t.leftArrow){let o=Q[(n-1+Q.length)%Q.length];return [{type:"setTab",tab:o.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:o.focus}]}return t.downArrow?[{type:"setFocus",focus:Q[n]?.focus??"list"}]:[]}var pc={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function mc({outdatedCount:e=0}){let t=S(r=>r.activeTab);return jsx(Box,{paddingX:1,paddingBottom:1,children:Q.map(({id:r})=>{let n=r===t,o=r==="updates"&&e>0?`${pc[r]} (${e})`:pc[r];return jsx(Box,{marginRight:1,children:n?jsx(Text,{bold:true,inverse:true,children:` ${o} `}):jsx(Text,{dimColor:true,children:` ${o} `})},r)})})}var Fe=create(e=>({query:"",cursorPosition:0,setQuery:t=>e({query:t}),setCursorPosition:t=>e({cursorPosition:t}),resetQuery:()=>e({query:"",cursorPosition:0})}));function gc(){let e=S(i=>i.focus),t=Fe(i=>i.query),r=Fe(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..."})]})}var Cg=["skill","mcp","bundle"].map((e,t)=>({key:String(t+2),type:e,...qr[e]})),Tg=["internal","external"].map((e,t)=>({key:String(t+6),origin:e,...dl[e]}));function hc(){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"]})]}),Cg.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"]})]}),Tg.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)})]})}function yc({type:e}){let{label:t,color:r}=qr[e];return jsx(Text,{color:r,children:t})}function xc({origin:e}){return e===Rn?jsx(Text,{color:"blue",children:"[Flow]"}):jsx(Text,{color:"white",children:"[External]"})}var ls=$g.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(yc,{type:t.type})]}),t.origin&&jsxs(Text,{children:[" ",jsx(xc,{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 ",nr(t.installedAt)]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:t.description})})]})});function un({message:e}){return jsx(Box,{paddingX:2,paddingY:1,children:jsx(Text,{dimColor:true,children:e??"No items found."})})}function vc({items:e,emptyMessage:t}){let r=S(l=>l.selectedIndex);if(e.length===0)return jsx(un,{message:t});let n=Math.max(0,r-Math.floor(Ge/2)),o=Math.min(e.length,n+Ge);o===e.length&&(n=Math.max(0,o-Ge));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,c)=>jsx(ls,{item:l,isSelected:n+c===r},l.name)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:a>0?`\u2193 ${a} more below`:" "})})]})}function Cc({label:e,pathHint:t}){return jsxs(Box,{paddingBottom:1,children:[jsx(Text,{bold:true,color:"blueBright",children:e}),jsxs(Text,{dimColor:true,children:[" ",t]})]})}function kc({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(un,{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(Ge/2)),c=Math.min(n.length,l+Ge);c===n.length&&(l=Math.max(0,c-Ge));let u=n.slice(l,c),d=l,m=n.length-c;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:d>0?`\u2191 ${d} more above`:" "})}),u.map(p=>p.kind==="header"?jsx(Cc,{label:p.label,pathHint:p.pathHint},p.key):jsx(ls,{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 Ug={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function Bg({items:e,tabId:t,emptyMessage:r,groups:n,actionHint:o}){return jsxs(Box,{flexDirection:"column",children:[jsx(gc,{}),jsx(hc,{}),jsxs(Box,{paddingX:1,marginTop:1,children:[jsx(Text,{bold:true,children:Ug[t]}),jsxs(Text,{dimColor:true,children:[" (",e.length,")"]}),o&&e.length>0&&jsx(Text,{dimColor:true,children:` \xB7 ${o}`})]}),n&&n.length>0?jsx(kc,{groups:n,emptyMessage:r}):jsx(vc,{items:e,emptyMessage:r})]})}function Ac({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(Bg,{items:e,tabId:o,emptyMessage:t,groups:o!=="discover"?r:void 0,actionHint:o==="updates"?"press 'a' to update all":void 0},o)})}var Kg={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 cs(){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:[Kg[e],t?" | Ctrl+D: debug log":""]})})}function $c({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 us({message:e}){return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Ku,{type:"dots"})}),jsxs(Text,{children:[" ",e]})]})}function qi(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}var _c=20;function ds(e,t){let r=t>0?Math.min(e/t,1):0,n=Math.round(r*100),o=Math.round(r*_c),s="\u2588".repeat(o)+"\u2591".repeat(_c-o),i=`${qi(e)} / ${qi(t)}`;return {bar:s,percent:n,label:i}}function ps({received:e,total:t}){let{bar:r,percent:n,label:o}=ds(e,t);return jsxs(Text,{dimColor:true,children:[r," ",n,"%"," ","(",o,")"]})}function ms({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 Ye({itemName:e,actions:t,descriptions:r,onAction:n,onClose:o}){let s=S(l=>l.focus),[i,a]=useState(0);return useInput((l,c)=>{c.upArrow?a(u=>u>0?u-1:u):c.downArrow?a(u=>u<t.length-1?u+1:u):c.return?n(t[i]):c.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,c)=>jsxs(Box,{children:[jsxs(Text,{bold:c===i,color:c===i?"cyan":void 0,children:[c===i?"\u203A ":" ",l]}),r?.[l]&&jsxs(Text,{dimColor:true,children:[" \u2014 ",r[l]]})]},c))})]})}var ea=Object.entries(_n),Uc=[...ea.map(([,e])=>e.actionLabel),"Cancel"],Bc=Object.fromEntries(ea.map(([,e])=>[e.actionLabel,e.description]));function Fc(e){let t=ea.find(([,r])=>r.actionLabel===e);return t?t[0]:null}var nh=x("provider.registry"),oh=3e4,gs=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()+oh}),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"&&nh.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 sh={user:"global",project:"project",local:"local"};function hs(e){return e?sh[e]:"global"}var je=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},mr=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};Bn();function gt(){return Gc.create({prefix:sn("PROMPT_MANAGER_URL","https://flow.ciandt.com/prompt-manager-api/"),hooks:{beforeRequest:[async({request:e})=>{let t=await ar();e.headers.set("Authorization",`Bearer ${t}`);let r=await ae();r?.tenant&&Er.test(r.tenant)&&e.headers.set("FlowTenant",r.tenant);}]}})}var ah=x("catalog.registry"),ys=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);ah.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()]}};var gh={retries:5,minTimeout:50};async function ta(e,t){mkdirSync(dirname(e),{recursive:true});let r=await tg.lock(e+".lock",{realpath:false,retries:gh});try{return await t()}finally{await r();}}var ws=class{filePath;constructor(t){this.filePath=t??wl();}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 ta(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 ta(this.filePath,async()=>{let r=await this.read();await this.write(r.filter(n=>n.id!==t));});}async updateField(t,r){await ta(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));});}};var hh=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function Yn(e){if(!e||!hh.test(e))throw new Error(`Invalid plugin name: "${e}". Must be 1-64 chars, lowercase alphanumeric and hyphens only.`)}var yh=/^[^@]+@[^@]+$/;function pn(e){return yh.test(e)}function mn(e){let t=e.indexOf("@");return t>0?e.slice(0,t):e}var wh=/^[a-zA-Z0-9][a-zA-Z0-9._/-]*$/;function Sh(e){if(!wh.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 fn(e,t){let r=mn(e);Sh(r);let n=["claude","plugin","install",r];return t&&n.push("--scope",t),n.join(" ")}var xh=/^[\w./:@?&=+#%-]+$/;function Ss(e){let t=e.trim();if(!t)throw new Error("No marketplace source provided.");if(!xh.test(t))throw new Error(`Invalid marketplace source: "${t}". Must be owner/repo or a URL (no spaces or special characters).`);return t}var Ih=x("catalog.flow-api"),xs=class{id="flow-api";name="Flow Marketplace";source;removable=false;constructor(){this.source=process.env.PROMPT_MANAGER_URL??"";}async fetchItems(){try{let{plugins:t}=await gt().get("v1/plugins/catalog").json();return t.map(r=>({...r,catalogId:this.id,origin:r.origin??"internal",type:r.type??"bundle"}))}catch(t){if(t instanceof HTTPError){let{status:r}=t.response;throw r===401||r===403?new Error("Authentication failed. Run: flow auth login"):new Error(`Failed to fetch plugin catalog: HTTP ${r}`)}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){Yn(t);try{return await gt().get(`v1/plugins/${t}/manifest`).json()}catch(r){if(r instanceof HTTPError){let{status:n}=r.response;throw n===404?new Error(`Plugin '${t}' not found in catalog`):new Error(`Failed to fetch manifest: HTTP ${n}`)}throw r instanceof Error?new Error(`Failed to fetch manifest: ${r.message}`):r}}async ping(){try{return await gt().head("v1/plugins/catalog"),Ih.debug("ping ok"),!0}catch{return false}}};var de=new ys,Vt=new ws;de.register(new xs);var Xc=false;async function qc(){if(Xc)return;Xc=true;let e=await Vt.read(),{GitRepoAdapter:t}=await Promise.resolve().then(()=>(ra(),Wc));for(let r of e)de.register(new t(r.id,r.name,r.source));}var Yc=2;async function fr(){return de.fetchAll()}async function Zc(){return de.fetchAllWithErrors()}async function hn(e){Yn(e);try{return await gt().get(`v1/plugins/${e}/manifest`).json()}catch(t){throw t instanceof Error?t.message.includes("404")?new Error(`Plugin '${e}' not found in catalog`):t.message.includes("timeout")?new Error("Download timed out after 30s"):new Error(`Failed to fetch plugin manifest: ${t.message}`):t}}async function Qc(e,t){Yn(e);try{let r=await gt().get(`v1/plugins/${e}/archive`),n=r.headers.get("x-archive-size"),o=n?Number(n):NaN,s=Number.isFinite(o)&&o>0?o:0,i=s>0,a=r.body;if(!a)throw new Error("Failed to download plugin: response has no body");let l=a.getReader(),c=[],u=0;for(;;){let{done:d,value:m}=await l.read();if(d)break;if(u+=m.byteLength,i&&u>s*Yc)throw await l.cancel(),new Error(`Download exceeded expected size: received ${u} bytes, expected at most ${s*Yc}`);c.push(m),i&&t?.(u,s);}return Buffer.concat(c)}catch(r){throw r instanceof Error?r.message.includes("Download exceeded expected size")?r:new Error(`Failed to download plugin: ${r.message}`):r}}async function Is(){try{let{profiles:e}=await gt().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}}async function eu(e,t){let r=ye.resolve(t);await Tt.mkdir(r,{recursive:true});let n=ye.join(ye.dirname(r),`${randomUUID()}.zip`);try{await Tt.writeFile(n,e),await Ch(n,{dir:r,onEntry(o){if((o.externalFileAttributes>>16&61440)===40960)throw new Error(`Zip Slip (symlink): entry "${o.fileName}" is a symbolic link and was rejected`);let i=ye.resolve(r,o.fileName);if(process.platform==="win32"&&i.length>=260)throw new Error(`Path too long: "${i}" (${i.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.`);let a=ye.normalize(r+ye.sep);if(!i.startsWith(a)&&i!==r)throw new Error(`Zip Slip detected: entry "${o.fileName}" would escape target directory`)}});try{let o=realpathSync(r);if(!o.startsWith(ye.resolve(ye.dirname(r))))throw new Error(`Zip Slip (post-extract): resolved path "${o}" is outside expected parent`)}catch(o){if(o.code!=="ENOENT")throw o}}finally{try{await Tt.unlink(n);}catch{}}}async function na(e){await Tt.rm(e,{recursive:true,force:true});}async function gr(){let e=hl();await Tt.mkdir(ye.dirname(e),{recursive:true});try{await Tt.writeFile(e,"",{flag:"wx"});}catch(r){if(r.code!=="EEXIST")throw r}return await tg.lock(e,{stale:1e4,retries:{retries:2,minTimeout:500,maxTimeout:500}})}function Ah(){return {$schema:"https://anthropic.com/claude-code/marketplace.schema.json",name:Y,description:"Flow Skills marketplace",owner:{name:"Flow Team",email:"flow@ciandt.com"},plugins:[]}}function nu(){let e=To();if(!Se__default.existsSync(e))return null;try{return JSON.parse(Se__default.readFileSync(e,"utf-8"))}catch{return null}}function $h(){let e=nu();if(e)return e;let t=Ah(),r=To();return Se__default.mkdirSync(ye__default.dirname(r),{recursive:true}),oa(t),t}function oa(e){let t=To(),r=`${t}.${randomUUID()}.tmp`;Se__default.writeFileSync(r,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,t);}function Mh(){let e=ko(),t={};try{Se__default.existsSync(e)&&(t=JSON.parse(Se__default.readFileSync(e,"utf-8")));}catch{t={};}if(t[Y])return;t[Y]={source:{source:"github",repo:"CI-T-HyperX/flow-skills"},installLocation:gl(),lastUpdated:new Date().toISOString()};let r=`${e}.${randomUUID()}.tmp`;Se__default.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,e);}function ou(e,t){ht(e.name),Mh();let r=hi(e.name);Se__default.mkdirSync(ye__default.dirname(r),{recursive:true});try{Se__default.lstatSync(r),Se__default.rmSync(r,{recursive:!0,force:!0});}catch{}Se__default.symlinkSync(t,r,process.platform==="win32"?"junction":"dir");let n=$h();n.plugins.some(s=>s.name===e.name)||(n.plugins.push({name:e.name,description:e.description,version:e.version,author:e.author,source:`./plugins/native/${e.name}`,category:e.category}),oa(n));}function sa(e){ht(e);let t=hi(e);try{Se__default.rmSync(t,{recursive:!0,force:!0});}catch{}let r=nu();if(!r)return;let n=r.plugins.length;r.plugins=r.plugins.filter(o=>o.name!==e),r.plugins.length!==n&&oa(r);}var Rh=x("mcpConfigReader"),_h=500,Dh=512;function Oh(){return ye__default.join(Ce__default.homedir(),".claude.json")}function Nh(){return ye__default.join(process.cwd(),".mcp.json")}function iu(e){if(!Se__default.existsSync(e))return null;try{return JSON.parse(Se__default.readFileSync(e,"utf-8"))}catch{return Rh.debug(`[mcpConfigReader] Failed to parse ${e}`),null}}function Zn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ia(e){if(!Zn(e))return {};let t=e.mcpServers;return Zn(t)?t:{}}function aa(e,t){return Object.keys(e).slice(0,_h).map(n=>({name:y(n.slice(0,Dh)),marketplace:"",version:void 0,installedAt:"",installPath:"",scope:t,description:void 0,author:void 0,status:"enabled",type:"mcp"}))}function lu(){let e=[],t=Oh(),r=iu(t);if(Zn(r)){let a=r,l=ia(a);e.push(...aa(l,"user"));let c=process.cwd();if(Zn(a.projects)){let u=a.projects[c];if(Zn(u)){let d=ia(u);e.push(...aa(d,"local"));}}}let n=Nh(),o=iu(n),s=ia(o);e.push(...aa(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 Ze=x("storage");async function Bh(e,t,r){try{await b(I.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:r,source:t,interface:X().interfaceType});}catch(n){Ze.warn(`Failed to send uninstall metrics: ${String(n)}`);}}function Fh(e,t,r){let n=t==="enabled"?I.CLI_TOOL_ENABLED:I.CLI_TOOL_DISABLED;b(n,{tool_id:e,source:r,interface:X().interfaceType}).catch(o=>Ze.warn(`Failed to send ${t} metrics: ${String(o)}`));}function da(){return ye__default.join(Ce__default.homedir(),".claude","plugins","installed_plugins.json")}function jh(){return ye__default.join(Ce__default.homedir(),".claude","plugins")}function cu(e){let t=ye__default.resolve(e),r=ye__default.resolve(jh()),n=ye__default.resolve(ye__default.join(process.cwd(),".claude","plugins")),o=t.startsWith(r+ye__default.sep)||t===r,s=t.startsWith(n+ye__default.sep)||t===n;if(!o&&!s)throw new Error(`Security error: installPath '${e}' is outside the plugins directory`)}function uu(e="user"){return e==="local"?ye__default.join(process.cwd(),".claude","settings.local.json"):e==="project"?ye__default.join(process.cwd(),".claude","settings.json"):ye__default.join(Ce__default.homedir(),".claude","settings.json")}function et(){let e=da();if(!Se__default.existsSync(e))return {version:2,plugins:{}};try{return JSON.parse(Se__default.readFileSync(e,"utf-8"))}catch{return {version:2,plugins:{}}}}async function pa(){let e=da();try{let t=await Se__default.promises.readFile(e,"utf-8");return JSON.parse(t)}catch{return {version:2,plugins:{}}}}function Kh(e){let t=e?.code;return t==="EACCES"||t==="EPERM"}function du(e,t){try{Se__default.mkdirSync(ye__default.dirname(e),{recursive:!0});let r=`${e}.${randomUUID()}.tmp`;Se__default.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,e);}catch(r){throw Kh(r)?new Error(`Permission denied: cannot write to '${e}'. Check your file system permissions.`):r}}function Qe(e){du(da(),e);}function Qn(e){let t=e.lastIndexOf("@");return t===-1?{name:e,marketplace:""}:{name:e.slice(0,t),marketplace:e.slice(t+1)}}function Vh(e,t){let r=ye__default.join(e,".claude-plugin"),n=ye__default.join(r,"plugin.json");if(Se__default.existsSync(n))try{return JSON.parse(Se__default.readFileSync(n,"utf-8"))}catch{return null}let o=ye__default.join(r,"marketplace.json");if(Se__default.existsSync(o))try{let s=JSON.parse(Se__default.readFileSync(o,"utf-8"));return {description:s.plugins?.find(a=>a.name===t)?.description,author:s.owner}}catch{return null}return null}function ma(e="user"){let t=uu(e);if(!Se__default.existsSync(t))return {};try{return JSON.parse(Se__default.readFileSync(t,"utf-8"))}catch{return {}}}function pu(e,t="user"){du(uu(t),e);}function Hh(e,t){let{name:r,marketplace:n}=Qn(e),o;if(n?(o=`${r}@${n}`,t[o]||(o=void 0)):o=Object.keys(t).filter(i=>Qn(i).name===r)[0],!o)throw Ze.error(`[${r}] Plugin is not installed`),new Error(`Plugin '${r}' is not installed`);return {key:o,name:r}}function Jh(e,t){let{name:r,marketplace:n}=Qn(e),o;return n?(o=`${r}@${n}`,t[o]||(o=void 0)):o=Object.keys(t).filter(i=>Qn(i).name===r)[0],o?{key:o,name:r}:null}function la(e="user"){return ma(e).enabledPlugins??{}}function ca(e,t="user"){let r=ma(t),n=r.enabledPlugins;if(!n||!(e in n))return;let{[e]:o,...s}=n;r.enabledPlugins=s,pu(r,t);}function eo(e,t,r="user"){let n=ma(r),o=n.enabledPlugins??{};n.enabledPlugins={...o,[e]:t},pu(n,r);}function Gh(e){let t=new Map;for(let r of e){let n=t.get(r.scope);(!n||r.installedAt>n.installedAt)&&t.set(r.scope,r);}return [...t.values()]}function ne(){let e=et(),t=la(),r=la("project"),n=la("local"),o={project:r,local:n},s=Object.entries(e.plugins).flatMap(([c,u])=>{let{name:d,marketplace:m}=Qn(c),p=u.map(h=>h.scope==="managed"?{...h,scope:"user"}:h);return Gh(p).map(h=>{let g=Vh(h.installPath,d),v=(o[h.scope]??t)[c];return {name:d,marketplace:m,version:h.version&&h.version!=="unknown"?h.version:void 0,installedAt:h.installedAt,installPath:h.installPath,scope:h.scope,providerId:h.providerId,type:h.type,description:g?.description,author:g?.author,status:v===false?"disabled":"enabled"}})}),i=lu(),a=new Set(s.map(c=>`${c.name}@${c.scope}`)),l=i.filter(c=>!a.has(`${c.name}@${c.scope}`));return [...s,...l]}async function to(e,t){Ze.debug(`[${e}] Acquiring lock to uninstall`);let r=await gr();try{let n=et(),o=Jh(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`);Ze.debug(`[${i}] Resolved key: ${s}, scope: ${t}`),cu(l.installPath);let c=ye__default.dirname(l.installPath);Ze.debug(`[${i}] Removing directory: ${c}`),Se__default.rmSync(c,{recursive:!0,force:!0});let u=a.filter(d=>d.scope!==t);if(u.length===0){let{[s]:d,...m}=n.plugins;Qe({...n,plugins:m}),ca(s,t),sa(i);}else n.plugins[s]=u,Qe(n),ca(s,t);}else {Ze.debug(`[${i}] Resolved key: ${s}`);for(let u of a){cu(u.installPath);let d=ye__default.dirname(u.installPath);Ze.debug(`[${i}] Removing directory: ${d}`),Se__default.rmSync(d,{recursive:!0,force:!0}),ca(s,u.scope);}sa(i);let{[s]:l,...c}=n.plugins;Qe({...n,plugins:c});}await Bh(i,a[0].origin??"internal",a[0].type??"skill"),Ze.debug(`[${i}] Uninstalled successfully`);}finally{await r();}}async function ro(e,t,r){Ze.debug(`[${e}] Acquiring lock to set status \u2192 ${t}`);let n=await gr();try{let o=et(),{key:s,name:i}=Hh(e,o.plugins),a=o.plugins[s],l=r??a[0].scope,c=a[0].origin??"internal";Ze.debug(`[${i}] Resolved key: ${s}, scope: ${l}`),eo(s,t==="enabled",l),Fh(i,t,c),Ze.debug(`[${i}] Status updated to ${t}`);}finally{await n();}}var zh=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,Wh=/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)?$/;function ht(e){if(!zh.test(e))throw new Error(`Invalid plugin name from manifest: "${e}". Plugin names must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Xh(e){if(!Wh.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 hr=x("installer");function qh(e,t){let r=`${e}@${Y}`,o=et().plugins[r];if(o&&!t)throw new je(e,o[0].version??"unknown");return {pluginKey:r,alreadyInstalled:o}}async function Yh(e,t,r){r&&await na(t);try{hr.debug(`[${t}] Extracting archive...`),await eu(e,t);}catch(n){throw await na(t),n}}function Zh(e,t,r,n,o,s="claude-code",i){let a=et(),l={scope:n,installPath:t,version:r,installedAt:new Date().toISOString(),origin:o,providerId:s,type:i},c=a.plugins[e]??[];a.plugins[e]=[...c.filter(u=>u.scope!==n),l],Qe(a),eo(e,true,n);}async function Qh(e,t,r,n,o,s){try{await b(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:s,source:o,scope:n,version:t,duration_ms:r,interface:X().interfaceType});}catch(i){hr.warn(`Failed to send install metrics: ${String(i)}`);}}async function ey(e,t,r,n){try{await b(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:X().interfaceType});}catch(o){hr.warn(`Failed to send install-failed metrics: ${String(o)}`);}}async function $e(e,t={}){let r=Date.now(),n=null;try{hr.debug(`[${e}] Acquiring lock...`),n=await gr();let{pluginKey:o,alreadyInstalled:s}=qh(e,t.force);hr.debug(`[${e}] Fetching manifest...`);let i=await hn(e);ht(i.name),Xh(i.version),hr.debug(`[${e}] Downloading archive...`);let a=await Qc(e,t.onDownloadProgress),l=t.scope??"user",c=t.type??"skill",u=fl(i.name,i.version);await Yh(a,u,!!s&&!!t.force),Zh(o,u,i.version,l,"internal",t.providerId,c),ou(i,u);let d=Date.now()-r;hr.debug(`[${e}] Installed successfully in ${d}ms`);let m={name:i.name,version:i.version,path:u,duration_ms:d};return t.skipMetrics||await Qh(i.name,i.version,d,hs(l),"internal",c),m}catch(o){throw await ey(e,o,"internal",t.type??"skill"),hr.error(`[${e}] Installation failed: ${o instanceof Error?o.message:String(o)}`),o}finally{n&&await n();}}var ty=x("commands:helpers");async function we(){if(!await ae())return P("Not authenticated. Run: flow auth login"),false;try{await ar();}catch(t){return ty.debug(`Token validation failed: ${String(t)}`),P("Session expired. Run: flow auth login"),false}return true}async function kt(e){let t=fa.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 mu(e){let t=fa.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(y(e),n=>{t.close(),r(n.trim());});})}var yn=x("claudeProxy"),Sa="claude ",fu="flow ",ga=class extends Error{constructor(t){super(`Invalid install command: "${t}". Command must start with "claude " for security.`),this.name="InvalidInstallCommandError";}},ha=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";}},ry=/^plugins?\s+(install|i)\s+|^plugins?\s+marketplace\s+add\s+|^mcp\s+(add|remove)\s+/,ny=/^npm\s+(i|install)\s+-g\s+@ciandt-flow\/cli$/,oy=/^(flow|claude)\s+auth\s+login(\s|$)/,gu=/^flow\s+plugins?\s+(install|i)\s+([^@\s]+)$/;function hu(e){return gu.test(e.trim())}function sy(e){return gu.exec(e.trim())?.[2]??""}async function yu(e){let t=sy(e),r=Date.now();yn.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 xa(n)?new ya:n}}function iy(e){wu(e);let t=e.slice(Sa.length);if(!ry.test(t))throw new ha(e)}var bs=class extends Error{constructor(){super('Claude Code CLI not found. Ensure "claude" is installed and available on your PATH.'),this.name="ClaudeCliNotFoundError";}},ya=class extends Error{constructor(){super('Flow CLI not found. Ensure "flow" is installed and available on your PATH.'),this.name="FlowCliNotFoundError";}};function wu(e){if(!e||!/^claude /.test(e))throw new ga(e)}async function Pe(e){wu(e);let t=e.slice(Sa.length).split(/\s+/).filter(Boolean),r=ay(t);yn.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 yn.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 xa(o)?new bs:o}}function ay(e){return e.length>=3?e[2]:e.join(" ")}function xa(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}function ly(e){return e.startsWith(fu)?Sa+e.slice(fu.length):e}function cy(e){return ny.test(e)||oy.test(e)}function uy(e){let t=0;for(;t<e.length&&cy(e[t]);)t++;return e.slice(t)}var dy=/^claude\s+(?:plugins?\s+(?:install|i)\s+|mcp\s+(?:add|remove)\s+)/;function py(e,t){return !t||e.includes("--scope")||!dy.test(e)?e:`${e} --scope ${t}`}async function no(e,t){let r=e.split("&&").map(i=>i.trim()).filter(Boolean),o=uy(r).map(i=>ly(i)).map(i=>py(i,t));if(o.length===0)throw new Error("Empty install command");for(let i of o)iy(i);yn.debug(`[installCommand] Executing ${o.length} command(s)`);let s=await Pe(o[0]);if(s.exitCode!==0)return s;for(let i=1;i<o.length;i++)if(s=await Pe(o[i]),s.exitCode!==0)return s;return s}async function vs(e,t,r){let n=mn(e),o=t?.trim();if(!o&&(o=(await mu(`Plugin "${n}" could not be installed.
|
|
111
|
-
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=Ss(o),r?.(),yn.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"}`);yn.debug(`[${n}] Marketplace added successfully`);}catch(s){throw xa(s)?new bs:s}}var yy=6e4,yr=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 At(e,t){let r=await mkdtemp(join(tmpdir(),"flow-skills-")),n=simpleGit({timeout:{block:yy}}).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 yr("Clone timed out after 60s. Check your SSH keys or credentials.",e,true,false):l?new yr(`Authentication failed for ${e}. Ensure you have access and credentials are configured.`,e,false,true):new yr(`Failed to clone ${e}: ${i}`,e,false,false)}}async function $t(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 Kr(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 Sy(e){return typeof e=="object"&&e!==null&&e.source==="git-subdir"}function xy(e){return typeof e=="object"&&e!==null&&e.source==="url"}function Iy(e){return typeof e=="object"&&e!==null&&e.source==="github"}function wn(e,t){let r=e.source;if(Sy(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(xy(r))return {cloneUrl:r.url,subPath:"."};if(Iy(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 tt(e){return e.toLowerCase().replace(/[^a-z0-9._]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").substring(0,255)||"unnamed"}var Mt=x("claude-code.adapter");function Py(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=ko();if(!Se__default.existsSync(s))return r;try{let i=JSON.parse(Se__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 Eu(e,t){let r=e.catalogId?de.getAdapter(e.catalogId):void 0,n=wn(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=Py(e.catalogId,r?.source),i=t.scope??"user",a;o?a=yi(s,e.name,"external"):a=join(Tr(i==="user"?"global":"project"),e.name);let l=null;try{ht(e.name),l=await At(n.cloneUrl,n.ref);let c=n.subPath==="."?l:join(l,n.subPath);if(Se__default.existsSync(a)&&Se__default.rmSync(a,{recursive:!0,force:!0}),Se__default.mkdirSync(dirname(a),{recursive:!0}),Se__default.cpSync(c,a,{recursive:!0}),o){let u=`${e.name}@${s}`,d=await pa(),m={scope:i,installPath:a,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:e.type},p=d.plugins[u]??[];d.plugins[u]=[...p.filter(f=>f.scope!==i),m],Qe(d),eo(u,!0,i);}return {success:!0,message:`Installed ${e.name} from ${n.cloneUrl}`}}catch(c){return Mt.debug(`[${e.name}] External catalog install failed: ${String(c)}`),{success:false,message:c instanceof Error?c.message:String(c)}}finally{l&&await $t(l).catch(()=>{});}}async function Ia(e,t,r,n){try{await b(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:r,source:"external",scope:hs(n),version:"unknown",duration_ms:t,interface:X().interfaceType});}catch(o){Mt.warn(`Failed to send external install metrics: ${String(o)}`);}}async function vu(e,t,r){try{await b(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:X().interfaceType});}catch(n){Mt.warn(`Failed to send external install-failed metrics: ${String(n)}`);}}var Ey={async install(e,t){if(e.origin===Xr&&!e.installCommand&&!pn(e.name))return Eu(e,t);if(e.origin===Xr&&e.installCommand){let r=e.type??"skill",n=await no(e.installCommand,t.scope);return n.exitCode===0?(await Ia(e.name,n.duration_ms,r,t.scope),{success:true,message:`Installed ${e.name}`}):(await vu(e.name,new Error(n.stderr||"Install failed"),r),{success:false,message:n.stderr||`Install failed with exit code ${n.exitCode}`})}if(pn(e.name)){let r=e.type??"skill",n=fn(e.name,t.scope);Mt.debug(`[${e.name}] Attempting install: ${n}`);let o=await Pe(n);if(o.exitCode===0)return await Ia(e.name,o.duration_ms,r,t.scope),{success:true};Mt.debug(`[${e.name}] First attempt failed, adding marketplace`),await vs(e.name,t.marketplaceSource,()=>{});let s=await Pe(n);return s.exitCode===0?(await Ia(e.name,s.duration_ms,r,t.scope),{success:true}):(await vu(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 $e(e.name,{...t,type:e.type});return {success:!0,message:`Installed ${e.name}@${r.version}`}}catch(r){return Mt.debug(`[${e.name}] Plugin install failed: ${String(r)}`),{success:false,message:r instanceof Error?r.message:String(r)}}},async uninstall(e,t){await to(e,t);},getInstallPath(e,t){return ""}};function Pu(e){return {async install(t,r){if(t.origin===Xr&&!t.installCommand&&!pn(t.name))return Eu(t,r);if(!t.installCommand)try{let o=await $e(t.name,{...r,type:e});return {success:!0,message:`Installed ${t.name}@${o.version}`}}catch(o){return Mt.debug(`[${t.name}] ${e} install failed: ${String(o)}`),{success:false,message:o instanceof Error?o.message:String(o)}}Mt.debug(`[${t.name}] Executing install command: ${t.installCommand}`);let n=await no(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=et(),o=`${t}@${Y}`;if(n.plugins[o]){await to(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 Cy(e){for(let t of [join(e,".claude","agents"),join(e,"agents")]){if(!Se__default.existsSync(t))continue;let r=Se__default.readdirSync(t).filter(n=>n.endsWith(".md")&&Se__default.lstatSync(join(t,n)).isFile());if(r.length>0)return r.map(n=>join(t,n))}return []}function ba(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,ba(r)]))}function Cu(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(ba(a))));r[n]=[...s,...o.filter(a=>!i.has(JSON.stringify(ba(a))))];}else o!==null&&typeof o=="object"&&!Array.isArray(o)&&s!==null&&typeof s=="object"&&!Array.isArray(s)?r[n]=Cu(s,o):r[n]=o;}return r}async function Tu(e,t,r,n){let o=await pa(),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],Qe(o);}var Ty={async install(e,t){let r=t.scope??"user",n=e.catalogId?de.getAdapter(e.catalogId):void 0,o=wn(e,n?.source);if(!o)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let s=null;try{ht(e.name),s=await At(o.cloneUrl,o.ref);let i=o.subPath==="."?s:join(s,o.subPath),a=Cy(i);if(a.length===0)return {success:!1,message:`No agent files found in "${e.name}"`};let l=$o(r);Se__default.mkdirSync(l,{recursive:!0});let c=tt(e.name);if(a.length===1)Se__default.copyFileSync(a[0],join(l,`${c}.md`));else for(let d of a){let m=tt(basename(d,".md"));Se__default.copyFileSync(d,join(l,`${c}--${m}.md`));}let u=a.length===1?join(l,`${c}.md`):l;return await Tu(e.name,r,u,"agent"),{success:!0,message:`Installed agent(s) from ${e.name}`}}catch(i){return Mt.debug(`[${e.name}] Agent install failed: ${String(i)}`),{success:false,message:i instanceof Error?i.message:String(i)}}finally{s&&await $t(s).catch(()=>{});}},async uninstall(e,t){let r=$o(t),n=tt(e);if(Se__default.existsSync(r))for(let a of Se__default.readdirSync(r).filter(l=>l===`${n}.md`||l.startsWith(`${n}--`)&&l.endsWith(".md")))Se__default.rmSync(join(r,a),{force:true});let o=`${e}@claude-code`,s=et(),i=(s.plugins[o]??[]).filter(a=>a.scope!==t);if(i.length===0){let{[o]:a,...l}=s.plugins;Qe({...s,plugins:l});}else Qe({...s,plugins:{...s.plugins,[o]:i}});},getInstallPath(e,t){return join($o(t),`${tt(e)}.md`)}},ky={async install(e,t){let r=t.scope??"user",n=e.catalogId?de.getAdapter(e.catalogId):void 0,o=wn(e,n?.source);if(!o)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let s=null;try{ht(e.name),s=await At(o.cloneUrl,o.ref);let i=o.subPath==="."?s:join(s,o.subPath),a=join(i,"settings.json");if(!Se__default.existsSync(a))return {success:!1,message:`No settings.json found in "${e.name}"`};let l;try{l=JSON.parse(Se__default.readFileSync(a,"utf-8"));}catch{return {success:!1,message:`settings.json in "${e.name}" contains invalid JSON`}}let c=l.hooks;if(!c||typeof c!="object"||Array.isArray(c))return {success:!1,message:`No hooks found in "${e.name}" settings.json`};let u=Jn();if(u.status==="malformed")return {success:!1,message:"settings.json at destination contains invalid JSON \u2014 refusing to overwrite"};let d=u.status==="ok"?u.settings:{},m=d.hooks!==null&&typeof d.hooks=="object"&&!Array.isArray(d.hooks)?d.hooks:{},p=Cu(m,c);return qo({...d,hooks:p}),await Tu(e.name,r,"hooks","hook"),{success:!0,message:`Installed hooks from ${e.name}`}}catch(i){return Mt.debug(`[${e.name}] Hook install failed: ${String(i)}`),{success:false,message:i instanceof Error?i.message:String(i)}}finally{s&&await $t(s).catch(()=>{});}},async uninstall(e,t){throw new Error("Hook uninstall not supported \u2014 remove entries manually from settings.json")},getInstallPath(e,t){return ""}},Ps=class{id="claude-code";name="Claude Code";async isAvailable(){return Kr("claude",["--version"])}getSupportedScopes(){return ["user","project","local"]}installers={bundle:Ey,skill:Pu("skill"),mcp:Pu("mcp"),agent:Ty,hook:ky}};function Es(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 $y=new Set(["gh"]),My=Es($y,"use: gh copilot mcp remove <name>"),Cs=class{id="copilot";name="GitHub Copilot";async isAvailable(){return await Kr("gh",["--version"])?Kr("gh",["copilot","--version"]):false}getSupportedScopes(){return ["user"]}installers={mcp:My}};var Ly=new Set(["opencode"]),Ry=Es(Ly,"use: opencode config remove mcp <name>");function _y(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(`
|
|
112
|
-
`)}function ku(){return {async install(e,t){try{ht(e.name);}catch{return {success:false,message:`Invalid plugin name: "${e.name}".`}}let r=e.catalogId?de.getAdapter(e.catalogId):void 0,n=wn(e,r?.source);if(!n)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let o=null;try{o=await At(n.cloneUrl,n.ref);let s=n.subPath==="."?o:join(o,n.subPath),i=Ao(t.scope??"user"),a=join(s,".opencode","plugins");if(Se__default.existsSync(a)){let l=Se__default.readdirSync(a).filter(c=>c.endsWith(".js")||c.endsWith(".mjs"));if(l.length===0)return {success:!1,message:"No JS plugin file found in .opencode/plugins/"};Se__default.mkdirSync(i,{recursive:!0}),Se__default.copyFileSync(join(a,l[0]),join(i,`${e.name}.js`));}else {let l=join(i,`${e.name}-content`);Se__default.existsSync(l)&&Se__default.rmSync(l,{recursive:!0,force:!0}),Se__default.mkdirSync(l,{recursive:!0}),Se__default.cpSync(s,l,{recursive:!0}),Se__default.mkdirSync(i,{recursive:!0}),Se__default.writeFileSync(join(i,`${e.name}.js`),_y(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 $t(o).catch(()=>{});}},async uninstall(e,t){ht(e);let r=Ao(t),n=join(r,`${e}.js`),o=join(r,`${e}-content`);Se__default.existsSync(n)&&Se__default.rmSync(n,{force:true}),Se__default.existsSync(o)&&Se__default.rmSync(o,{recursive:true,force:true});},getInstallPath(e,t){return join(Ao(t),`${e}.js`)}}}var Ts=class{id="opencode";name="OpenCode";async isAvailable(){return Kr("opencode",["--version"])}getSupportedScopes(){return ["user","project"]}installers={mcp:Ry,skill:ku(),bundle:ku()}};var Lt=new gs;Lt.register(new Ps);lr()&&(Lt.register(new Cs),Lt.register(new Ts));function Au({itemName:e,itemType:t,onInstall:r,onClose:n}){let[o,s]=useState(false),[i,a]=useState(false),[l,c]=useState([]),[u,d]=useState(void 0);useEffect(()=>{Lt.getAvailableProviders(t??"bundle").then(c).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(v=>v.name===g);w?(d(w.id),a(false),s(true)):a(false);},[l]),f=useCallback(g=>{let w=Fc(g);w?r(w,u):s(false);},[r,u]),h=useCallback(()=>{s(false);},[]);if(i){let g=[...l.map(w=>w.name),"Cancel"];return jsx(Ye,{itemName:`${e} \u2014 Choose provider`,actions:g,onAction:p,onClose:()=>a(false)},"provider")}return o?jsx(Ye,{itemName:`${e} \u2014 Choose scope`,actions:Uc,descriptions:Bc,onAction:f,onClose:h},"scope"):jsx(Ye,{itemName:e,actions:["Install","Cancel"],onAction:m,onClose:n},"main")}function Mu({itemName:e,bundle:t,onInstall:r,onConfirm:n,onClose:o}){let s=S(f=>f.focus),[i,a]=useState(0),c=(t?.artifact.artifacts??[]).filter(f=>f.available),u=t!==void 0&&c.length===0,d=useMemo(()=>u?["Cancel"]:["Confirm Install","Cancel"],[u]);useEffect(()=>{a(0);},[t]);let m=useCallback((f,h)=>{h.upArrow?a(g=>Math.max(0,g-1)):h.downArrow?a(g=>Math.min(d.length-1,g+1)):h.return?d[i]==="Confirm Install"?n():o():h.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:[c.length," artifact",c.length!==1?"s":""," available"]})}),jsx(Box,{flexDirection:"column",marginTop:1,marginBottom:1,children:c.map(f=>{let h=y(f.name??f.flowId),g=f.type??"unknown";return jsxs(Box,{gap:1,children:[jsx(Text,{color:"green",children:"\u2713"}),jsx(Text,{children:h}),jsxs(Text,{dimColor:true,children:["(",g,")"]})]},f.flowId)})}),jsx(Box,{flexDirection:"column",children:d.map((f,h)=>jsx(Box,{children:jsxs(Text,{bold:h===i,color:h===i?"cyan":void 0,children:[h===i?"\u203A ":" ",f]})},f))})]}):jsx(Ye,{itemName:e,actions:["Install Bundle","Cancel"],onAction:p,onClose:o})}function $s({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")}}function _u({itemName:e,itemScope:t,itemStatus:r,updateAvailable:n,catalogVersion:o,onUninstall:s,onToggleStatus:i,onUpdate:a,onClose:l}){let{isConfirming:c,requestConfirm:u}=$s({activeFocus:"actionMenu",onConfirm:()=>s(t)});if(c)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(Ye,{itemName:e,actions:n?["Uninstall",d,p,"Cancel"]:["Uninstall",d,"Cancel"],onAction:g=>{g==="Uninstall"?u():g===d?i(t):g.startsWith("Update")?a?.():l();},onClose:l})}function Nu({itemName:e,itemScope:t,onUninstall:r,onClose:n}){let{isConfirming:o,requestConfirm:s}=$s({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(Ye,{itemName:e,actions:["Uninstall","Cancel"],onAction:l=>{l==="Uninstall"?s():n();},onClose:n})}var In=x("bundle:installer"),Uu=/already exists/i;async function Ky(e){if(!e.installCommand)throw new Error("Missing install command");let t=e.installCommand;if(hu(t)){let r=await yu(t);if(r.exitCode!==0){let n=r.stderr?.trim()||r.stdout?.trim()||`exit code ${r.exitCode}`;if(Uu.test(n))return;throw new Error(n)}}else {let r=await no(t);if(r.exitCode!==0){let n=r.stderr?.trim()||r.stdout?.trim()||`exit code ${r.exitCode}`;if(Uu.test(n))return;throw new Error(n)}}}async function Vy(e,t){try{await b(I.CLI_BUNDLE_INSTALL_STARTED,{bundle_slug:e,artifact_count:t});}catch(r){In.warn(`Failed to emit bundle install started event: ${String(r)}`);}}async function Hy(e,t,r){try{await b(I.CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS,{bundle_slug:e,artifact_name:t,artifact_type:r});}catch(n){In.warn(`Failed to emit bundle install plugin success event: ${String(n)}`);}}async function Bu(e,t,r,n){try{await b(I.CLI_BUNDLE_INSTALL_PLUGIN_FAILED,{bundle_slug:e,artifact_name:t,artifact_type:r,error_message:n});}catch(o){In.warn(`Failed to emit bundle install plugin failed event: ${String(o)}`);}}async function Jy(e,t,r,n,o){try{await b(I.CLI_BUNDLE_INSTALL_COMPLETED,{bundle_slug:e,installed_count:t,failed_count:r,unavailable_count:n,duration_ms:o});}catch(s){In.warn(`Failed to emit bundle install completed event: ${String(s)}`);}}async function Rs(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 Vy(i,o.length);let l=[],c=0,u=o.length;for(let[p,f]of o.entries()){let h=f.name??f.flowId,g=f.type??"unknown";if(!f.type){In.warn(`Artifact "${h}" has no type \u2014 treated as failed`),l.push({name:h,type:g,reason:"unknown artifact type"}),await Bu(i,h,g,"unknown artifact type"),r?.({index:p+1,total:u,artifact:f,success:false,error:"unknown artifact type"});continue}try{await Ky(f),c++,await Hy(i,h,g),r?.({index:p+1,total:u,artifact:f,success:!0});}catch(w){let v=w instanceof Error?w.message:String(w);In.error(`Failed to install artifact "${h}": ${v}`),l.push({name:h,type:g,reason:v}),await Bu(i,h,g,v),r?.({index:p+1,total:u,artifact:f,success:false,error:v});}}let d=Date.now()-a,m=l.length;return await Jy(i,c,m,s,d),{bundleTitle:e.title,total:n.length,installed:c,skipped:s,failed:m,failures:l}}function Vu({bundle:e,onComplete:t}){let[r,n]=useState(null),[o,s]=useState(null),i=useRef(false);return useEffect(()=>{i.current||(i.current=true,Rs(e,{onProgress:n}).then(s).catch(a=>{let l=a instanceof Error?a.message:"Installation failed",c=e.artifact.artifacts,u=c.filter(d=>d.available);s({bundleTitle:e.title,total:c.length,installed:0,skipped:c.length-u.length,failed:u.length,failures:u.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(Ku,{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(Ku,{type:"dots"})}),jsx(Text,{color:"cyan",children:"Preparing..."})]})]})}var pe=create(e=>({installedItems:[],setInstalledItems:t=>e({installedItems:t}),loadFromDisk:()=>e({installedItems:ne()})}));function Hu({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,c=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}),c&&s.stored&&jsx(Text,{color:"yellow",children:" \u2605"})]}),s.stored?.lastUpdated&&jsx(Box,{marginLeft:2,children:jsxs(Text,{dimColor:true,children:["Updated ",nr(s.stored.lastUpdated)]})})]},s.adapter.id)})]})}function Ju({entry:e,detailData:t,installedCount:r,focusPanel:n,actionIndex:o,onBrowse:s,onUpdate:i,onToggleAutoUpdate:a,onRemove:l}){let{adapter:c,stored:u}=e,d=c.removable!==false,m=u?.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:c.name}),jsx(Text,{dimColor:true,children:c.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`:"",u?.lastUpdated?` \xB7 Updated ${nr(u.lastUpdated)}`:""]})}),u&&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((h,g)=>{let w=g===o;return jsxs(Box,{children:[jsx(Text,{color:w?"cyan":void 0,children:w?"\u203A ":" "}),jsx(Text,{bold:w,color:h.danger?"yellow":void 0,dimColor:!w,children:h.label})]},h.label)})})]}):jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:c.name}),jsx(Text,{dimColor:true,children:c.source}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter or Tab to see details"})})]})}function Gu(e){return e.adapter.removable!==false?4:2}function zu({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((c,u)=>{if(u.escape){n();return}if(u.upArrow){l(d=>Math.max(0,d-1));return}if(u.downArrow){l(d=>Math.min(i.length-1,d+1));return}u.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((c,u)=>jsxs(Box,{children:[jsx(Text,{color:u===a?"cyan":void 0,children:u===a?"\u203A ":" "}),jsx(Text,{bold:u===a,color:c.danger?"yellow":void 0,dimColor:u!==a,children:c.label})]},c.label))}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: confirm \xB7 Esc: back"})})]})}function Xu({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 qu({entry:e,items:t,installedKeys:r,onBack:n}){let o=e.adapter.id??"default",s=t.filter(E=>r.has(`${E.name}@${o}`)),i=t.filter(E=>!r.has(`${E.name}@${o}`)),a=[...s,...i],[l,c]=useState(0),[u,d]=useState(null);if(useInput((E,M)=>{if(M.escape){n();return}if(M.return){d(a[l]??null);return}if(M.upArrow){c(K=>Math.max(0,K-1));return}M.downArrow&&c(K=>Math.min(a.length-1,K+1));},{isActive:u===null}),u!==null)return jsx(zu,{item:u,adapterName:e.adapter.name,isInstalled:r.has(`${u.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(Ge/2)),p=Math.min(a.length,m+Ge);p===a.length&&(m=Math.max(0,p-Ge));let f=a.slice(m,p),h=m,g=a.length-p,w=s.length>0&&m<s.length,v=p>s.length,O=f.filter(E=>r.has(`${E.name}@${o}`)),_=f.filter(E=>!r.has(`${E.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:h>0?`\u2191 ${h} 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"]}),O.map(E=>jsx(Xu,{item:E,isSelected:a.indexOf(E)===l,isInstalled:true},E.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"]}),_.map(E=>jsx(Xu,{item:E,isSelected:a.indexOf(E)===l,isInstalled:false},E.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"})})]})}ra();var Zy=/^https?:\/\/.+/;function Qy(e){return e!==null&&typeof e=="object"&&"response"in e&&e.response?.status===404}function ew(e){return e instanceof Error&&e.code==="GITHUB_AUTH_REQUIRED"}function ed(e){let t=S(g=>g.showNotification),r=S(g=>g.incrementCatalogVersion),[n,o]=useState("idle"),[s,i]=useState(""),[a,l]=useState(""),[c,u]=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(""),u(null),o("add-name");},[]),f=useCallback(()=>{o("idle");},[]),h=useCallback(async()=>{let g=m.current,w=d.current;if(!Zy.test(g)){u("URL must start with http:// or https://");return}u(null),o("adding");let v=randomUUID(),O=new gn(v,w,g);try{await O.fetchItems(),await Vt.add({id:v,name:w,source:g}),de.register(new gn(v,w,g)),r(),e(),t(`Catalog "${w}" added`,"success"),i(""),l(""),d.current="",m.current="",o("idle");}catch(_){let E=Qy(_)?"No marketplace.json found in this repository (checked main and master branches). Ensure the repo has a marketplace.json at its root.":ew(_)?_.message:_ instanceof Error?`Could not reach catalog URL: ${_.message}`:"Failed to validate catalog URL";t(E,"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){h();return}if(w.backspace||w.delete){m.current=m.current.slice(0,-1),l(m.current),u(null);return}g&&!w.ctrl&&!w.meta&&(m.current=m.current+g,l(m.current),u(null));},{isActive:n==="add-url"}),{phase:n,inputName:s,inputUrl:a,urlError:c,setInputName:i,setInputUrl:l,startAdd:p,cancelAdd:f}}function td(e){let t=S(o=>o.showNotification),r=S(o=>o.incrementCatalogVersion);return {handleRemove:useCallback(async o=>{try{await Vt.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 nd(){let e=S($=>$.focus),t=S($=>$.setFocus),r=S($=>$.showNotification),n=pe($=>$.installedItems),[o,s]=useState(()=>de.listAdapters().map($=>({adapter:$,stored:null}))),[i,a]=useState(0),[l,c]=useState("list"),[u,d]=useState(0),[m,p]=useState(null),[f,h]=useState("main"),g=useRef(o);useEffect(()=>{g.current=o;},[o]),useEffect(()=>{f==="browse"&&!o[i-1]&&h("main");},[f,o,i]);let w=useCallback(()=>{(async()=>{let $=de.listAdapters(),N=await Vt.read(),z=new Map(N.map(A=>[A.id,A]));s($.map(A=>({adapter:A,stored:z.get(A.id)??null})));})();},[]);useEffect(()=>{t("marketplaces"),w();},[t,w]),useEffect(()=>{if(i===0){p(null);return}let $=g.current[i-1];if(!$)return;let N=false;return p({items:[],loading:true,error:null}),$.adapter.fetchItems().then(z=>{N||p({items:z,loading:false,error:null});}).catch(z=>{N||p({items:[],loading:false,error:z instanceof Error?z.message:"Failed to load catalog"});}),()=>{N=true;}},[i]);let v=ed(w),O=useCallback(()=>{w(),a(0),c("list"),p(null),h("main");},[w]),{handleRemove:_}=td(O),E=useCallback(async $=>{h("removing"),await _($);},[_]),M=useCallback(async $=>{try{let N=await $.adapter.fetchItems();if(p({items:N,loading:!1,error:null}),$.stored){let z=new Date().toISOString();await Vt.updateField($.stored.id,{lastUpdated:z}),w();}r("Marketplace updated","success");}catch(N){r(N instanceof Error?N.message:"Update failed","error");}},[w,r]),K=useCallback(async $=>{if(!$.stored)return;let N=$.stored.autoUpdate!==false;await Vt.updateField($.stored.id,{autoUpdate:!N}),w();},[w]),H=useCallback(()=>h("browse"),[]),ue=useCallback($=>{let N=o[i-1];if(!N)return;let z=N.adapter.removable!==false;[H,()=>{M(N);},...z?[()=>{K(N);},()=>{E(N.adapter.id);}]:[]][$]?.();},[o,i,H,M,K,E]),T=useCallback(()=>h("main"),[]),U=useCallback(()=>{let $=o[i-1];$&&M($);},[o,i,M]),G=useCallback(()=>{let $=o[i-1];$&&K($);},[o,i,K]),B=useCallback(()=>{let $=o[i-1];$&&E($.adapter.id);},[o,i,E]);if(useInput(($,N)=>{if(N.upArrow){a(z=>Math.max(0,z-1));return}if(N.downArrow){a(z=>Math.min(o.length,z+1));return}(N.return||N.tab)&&(i===0?v.startAdd():(c("detail"),d(0)));},{isActive:f==="main"&&v.phase==="idle"&&l==="list"&&e==="marketplaces"}),useInput(($,N)=>{if(N.escape||N.tab){c("list");return}if(N.upArrow){d(z=>Math.max(0,z-1));return}if(N.downArrow){let z=o[i-1],A=z?Gu(z)-1:0;d(R=>Math.min(R+1,A));return}N.return&&ue(u);},{isActive:f==="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(f==="removing")return jsx(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:jsx(Text,{children:"Removing catalog..."})});if(f==="browse"){let $=o[i-1];if(!$)return jsx(Box,{});let N=$.adapter.id??"default",z=new Set(n.filter(A=>A.marketplace===$.adapter.name).map(A=>`${A.name}@${N}`));return jsx(qu,{entry:$,items:m?.items??[],installedKeys:z,onBack:T})}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 be=o[i-1]??null,Nt=be?n.filter($=>$.marketplace===be.adapter.name).length:0;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Box,{flexDirection:"column",width:30,marginRight:1,children:jsx(Hu,{entries:o,selectedIndex:i,focusPanel:l})}),jsx(Box,{flexDirection:"column",flexGrow:1,children:l==="detail"&&be?jsx(Ju,{entry:be,detailData:m,installedCount:Nt,focusPanel:l,actionIndex:u,onBrowse:H,onUpdate:U,onToggleAutoUpdate:G,onRemove:B}):jsx(Box,{paddingLeft:1,children:jsx(Text,{dimColor:true,children:be?"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 od(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=Q.findIndex(i=>i.id===r.activeTab),s=Q[(o-1+Q.length)%Q.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}if(t.rightArrow){let o=Q.findIndex(i=>i.id===r.activeTab),s=Q[(o+1)%Q.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}if(t.tab){let o=Q.findIndex(i=>i.id===r.activeTab),s=Q[(o+1)%Q.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 sd(e,t){return t.escape?[{type:"setActionMenuOpen",open:false},{type:"setFocus",focus:"list"}]:[]}function id(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 sw=new Set(Q.filter(e=>e.focus!=="list").map(e=>e.focus));function fo(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:c}=Fe.getState();i(a.slice(0,c)+s.char+a.slice(c)),l(c+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 ad({listLength:e}){let t=S(h=>h.focus),r=S(h=>h.selectedIndex),n=S(h=>h.actionMenuOpen),o=S(h=>h.setFocus),s=S(h=>h.setActionMenuOpen),i=Fe(h=>h.query),a=Fe(h=>h.setQuery),l=Fe(h=>h.resetQuery),c=useRef(e);useEffect(()=>{c.current=e;},[e]),useEffect(()=>{if(t==="search"){let{query:h,setCursorPosition:g}=Fe.getState();g(h.length);}},[t]);let[u,d]=useState("");useEffect(()=>{let h=setTimeout(()=>d(i),300);return ()=>clearTimeout(h)},[i]),useInput((h,g)=>{let{activeTab:w,selectedIndex:v,actionMenuOpen:O}=S.getState();fo(Vi(h,g,{activeTab:w}));},{isActive:t==="tabs"}),useInput((h,g)=>{if(!g.leftArrow&&!g.rightArrow)return;let{activeTab:w,selectedIndex:v,actionMenuOpen:O}=S.getState();fo(Vi("",g,{activeTab:w}));},{isActive:sw.has(t)}),useInput((h,g)=>{let{activeTab:w,selectedIndex:v,actionMenuOpen:O}=S.getState();fo(od(h,g,{activeTab:w,selectedIndex:v},c.current));},{isActive:t==="list"}),useInput((h,g)=>{fo(sd(h,g));},{isActive:t==="actionMenu"}),useInput((h,g)=>{let w=id(h,g,Fe.getState().query),v=w.queryUpdate;if(fo(w.actions),v==="reset")l(),d("");else if(v!==null){let{query:O,cursorPosition:_,setCursorPosition:E}=Fe.getState();if("backspace"in v)_>0&&(a(O.slice(0,_-1)+O.slice(_)),E(_-1));else if("append"in v)a(O.slice(0,_)+v.append+O.slice(_)),E(_+v.append.length);else if("cursorMove"in v){let M=_+v.cursorMove;M>=0&&M<=O.length&&E(M);}}},{isActive:t==="search"});let m=useCallback(()=>{s(false),o("list");},[s,o]),p=useCallback(h=>{let{setSelectedIndex:g,selectedIndex:w}=S.getState();h===0?g(0):w>=h&&g(h-1);},[]),f=useCallback(h=>{if(!u)return c.current=h.length,h;let g=u.toLowerCase(),w=h.filter(v=>v.name.toLowerCase().includes(g)||v.description?.toLowerCase().includes(g));return c.current=w.length,w},[u]);return {actionMenuOpen:n,closeMenu:m,selectedIndex:r,clampIndex:p,filteredItems:f}}function cd(){let e=S(a=>a.notification),t=S(a=>a.showNotification),r=S(a=>a.clearNotification),n=Xe(a=>a.justAuthenticated),o=Xe(a=>a.credentials),s=Xe(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 Re(e,t,r=false){return r?true:!Ta.valid(e)||!Ta.valid(t)?false:Ta.gt(t,e)}var Gt=x("updater");async function iw(e,t,r,n,o,s){try{await b(I.CLI_TOOL_UPDATED,{tool_id:e,tool_type:s,source:o,from_version:t,to_version:r,duration_ms:n,interface:X().interfaceType});}catch(i){Gt.warn(`Failed to send update metrics: ${String(i)}`);}}function aw(e){let t=et(),r=`${e}@${Y}`,n=t.plugins[r];return !n||n.length===0?null:{pluginKey:r,entry:n[0]}}async function Ns(e,t={}){let r=Date.now(),n=null;try{Gt.debug(`[${e}] Acquiring lock...`),n=await gr();let o=aw(e);if(!o)throw Gt.error(`[${e}] Plugin is not installed`),new Error(`Plugin "${e}" is not installed`);let{entry:s}=o,i=s.version,a=s.installPath;Gt.debug(`[${e}] Fetching manifest...`);let c=(await hn(e)).version;if(!i||!Re(i,c,t.force))throw Gt.debug(`[${e}] Already up to date (v${i??"n/a"})`),new mr(e,i??"unknown");Gt.info(`[${e}] Updating v${i} \u2192 v${c}...`),await n(),n=null;try{let u=await $e(e,{force:!0,skipMetrics:!0}),d=Date.now()-r;return await iw(u.name,i,u.version,d,s.origin??"internal",s.type??"skill"),Gt.debug(`[${e}] Updated successfully in ${d}ms`),{name:u.name,previousVersion:i,newVersion:u.version,path:u.path,duration_ms:d}}catch(u){Gt.warn(`[${e}] Install failed, rolling back to v${i}...`),n=await gr();let d=et(),m=`${e}@${Y}`;throw d.plugins[m]&&(d.plugins[m][0].version=i,d.plugins[m][0].installPath=a,Qe(d),Gt.info(`[${e}] Rollback completed, restored to v${i}`)),u}}finally{n&&await n();}}var Us=x("dispatcher");async function lw(e,t,r,n,o){let s=mn(e);return Us.debug(`[${e}] Install failed (exit code), attempting marketplace add`),o?.onError?.(r),n?o?.onStatus?.(`Adding marketplace for ${s}...`):o?.onPause?.(),await vs(e,n,()=>{}),o?.onResume?.(`Retrying install for ${s}...`),Us.debug(`[${e}] Retrying install after marketplace add`),Pe(t)}async function ud(e,t,r,n){let o=fn(e,n),s=mn(e);r?.onStatus?.(`Installing ${s}...`),Us.debug(`[${e}] Attempting install: ${o}`);let i=await Pe(o);if(i.exitCode===0)return i;Us.debug(`[${e}] Install failed (exit ${i.exitCode}), attempting marketplace add`);let a=i.stderr||`Install failed with exit code ${i.exitCode}`;return lw(e,o,a,t,r)}async function dd(e,t,r){let n=e.type??"bundle",o=await Lt.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 pd(){let e=pe(i=>i.installedItems),t=pe(i=>i.loadFromDisk),r=useCallback(async(i,a)=>{let l=await dd(i,a);if(!l.success)throw new Error(l.message||"Installation failed");t();},[t]),n=useCallback(async(i,a)=>{let l=ne().find(p=>p.name===i),c=l?.providerId??"claude-code",u=Lt.getAdapter(c);if(!u)throw new Error(`Provider "${c}" not found`);let d=l?.type??"bundle",m=u.installers[d];if(!m)throw new Error(`Provider "${c}" does not support type "${d}"`);await m.uninstall(i,a??"user"),t();},[t]),o=useCallback(async(i,a)=>{let c=e.find(u=>u.name===i)?.status==="enabled"?"disabled":"enabled";await ro(i,c,a),t();},[e,t]),s=useCallback(async i=>{await Ns(i),t();},[t]);return {install:r,uninstall:n,toggle:o,update:s}}var Fs=x("mcp");function go(e,t){e.silent?We({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 fd(e,t){e.silent?Ue({status:"success",mcp:t.name,command:t.command,duration_ms:t.durationMs}):(ie(`MCP "${t.name}" ${t.actionPastTense} successfully`),e.verbose&&t.stdout&&C(t.stdout));}function cw(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 ka(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 gd(e,t,r){if(!await we())return 1;if(t.length===0){let s=r.transport==="http"?"a URL":"a command";return go(r,{name:e,action:"add",message:`${r.transport} transport requires ${s}`}),1}Fs.debug(`[${e}] Starting MCP add with args: ${t.join(" ")}`);let n=cw(e,t,r.transport,r.scope);if(!r.force){let s=y(e),i=y(n);if(!await kt(`Install external MCP "${s}"?
|
|
110
|
+
`),this.warned=true;}Fo().set(`${t}:${r}`,n);}async deleteSecret(t,r){let n=Fo(),o=`${t}:${r}`;return n.has(o)?(n.delete(o),true):false}getStoragePath(){return Fo().path}static hasExistingData(){try{let t=new $i({projectName:Mi});return Se.existsSync(t.path)}catch{return false}}static clearFallbackFile(){try{let t=new $i({projectName:Mi});Se.rmSync(t.path,{force:!0});}catch{}jo=null;}};async function Li(){if(Be.hasExistingData())return new Be;switch(process.platform){case "darwin":return await rn.isAvailable()?new rn:new Be;case "linux":return await or.isAvailable()?new or:await or.ensureInstalled()?new or:new Be;case "win32":return await sn.isAvailable()?new sn:new Be;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var Al=x("config:credentials"),Nt="flow-plugins-cli",Ri="credentials",_i="token-cache",Di="user-info",Ho=null;async function sr(){return Ho||(Ho=Li()),Ho}function Jo(){Ho=null;}async function ae(){let t=await(await sr()).getSecret(Nt,Ri);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Bt(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 Al.error(`missing or empty fields: ${o.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await sr()).setSecret(Nt,Ri,JSON.stringify(e));}async function $l(){let e=await sr();await e.deleteSecret(Nt,Ri),await e.deleteSecret(Nt,_i),await e.deleteSecret(Nt,Di);}async function Ml(){return (await sr()).getStoragePath()}async function Ll(e){await(await sr()).setSecret(Nt,_i,JSON.stringify(e));}async function Go(){let t=await(await sr()).getSecret(Nt,_i);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function zo(e){await(await sr()).setSecret(Nt,Di,JSON.stringify(e));}async function Rl(){let t=await(await sr()).getSecret(Nt,Di);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function ir(){let e=await Go();return e?new Date(e.expiresAt)>new Date:false}function ar(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/`,Al.debug(`[customUrl] Service URLs overridden to base: ${t}`);}function Wo(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")}}Fn();var Ui=x("api:auth");function bf(e){if(!Cr.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var Dl={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 vf(e){if(e instanceof HTTPError){let t=e.response.status;Ui.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&&Dl[r]?new Error(Dl[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?(Ui.debug(`Non-HTTP error during authentication: ${e.message}`),e):(Ui.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function Mr(e){let t=an("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");bf(e.tenant);let r;try{r=await Wc.post(t,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(s){throw await vf(s)}let n=r.expires_at??new Date(Date.now()+(r.expires_in??3600)*1e3).toISOString();await Bt(e),await Ll({accessToken:r.access_token,expiresAt:n});let o=Wo(r.access_token);await zo({sub:o.sub,name:o.name,email:o.email});}var Ol=x("lib:tokenProvider");async function lr(){if(await ir()){let n=await Go();if(n)return n.accessToken}Ol.debug("Token expired or missing, re-authenticating...");let t=await ae();if(!t)throw new Error("Not authenticated. Run: flow auth login");Be.clearFallbackFile(),Jo(),await Mr(t);let r=await Go();if(!r)throw new Error("Authentication succeeded but token was not persisted");return Ol.debug("Token refreshed successfully"),r.accessToken}Fn();var Xo=x("api:metrics");function Ul(){return an("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function Nl(e,t,r){return Wc.post(e,{json:t,headers:r})}async function Ef(e){let t=await Rl();if(t)return t;let r=Wo(e),n={sub:r.sub,name:r.name,email:r.email};return await zo(n),n}async function b(e,t){let r=await lr(),n=await Ef(r),o=await ae();if(!Cr.test(o.tenant))throw new Error(`Invalid tenant value: "${o.tenant}"`);let s={action:e,booster:fi,metadata:{...t},success:true,tenant:o.tenant,timestamp:new Date().toISOString(),user:{id:n.sub,name:n.name,email:n.email}};try{await Nl(Ul(),s,{Authorization:`Bearer ${r}`,FlowTenant:o.tenant}),Xo.debug(`Metrics event sent: ${e}`);}catch(i){throw Xo.warn(`Failed to send metrics event "${e}": ${String(i)}`),i}}async function Bl(e,t,r){try{let n=r&&Cr.test(r)?r:"unknown",o={action:e,booster:fi,metadata:t,success:!0,tenant:n,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await Nl(Ul(),o,{FlowTenant:n}),Xo.debug(`Anonymous metrics event sent: ${e}`);}catch(n){Xo.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"};var Cf={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},ut={...Cf};function Fl(e){let t=Date.now();ut={sessionStart:t,stepStart:t,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function Lr(e){ut.currentStep=e,ut.stepStart=Date.now();}function X(){return {...ut}}function Ft(){return ut.sessionStart===0?0:Date.now()-ut.sessionStart}function Rr(){return ut.stepStart===0?0:Date.now()-ut.stepStart}function jl(){ut.tuiSessionStart=Date.now();}function Kl(){return ut.tuiSessionStart===0?0:Date.now()-ut.tuiSessionStart}var Tf=3e3,kf=x("abandonment");async function qo(e){let{currentStep:t,sessionStart:r}=X();if(r===0)return;let n={last_step:t,trigger:e,duration_ms:Ft()};try{await Promise.race([b(I.CLI_ONBOARDING_ABANDONED,n),new Promise((o,s)=>setTimeout(()=>s(new Error("abandonment timeout")),Tf))]);}catch(o){kf.warn(`Abandonment event failed: ${String(o)}`);}}function Vl(e,t){return Promise.race([e,new Promise(r=>setTimeout(r,t))])}var Af=3e3,$f=x("session-end");async function Kn(e,t,r){let n=Kl(),s=[b(I.CLI_TUI_SESSION_ENDED,{duration_ms:n,active_tab:t,interface:"tui"})];r!=="main"&&s.push(qo(e));try{await Vl(Promise.all(s).then(()=>{}),Af);}catch(i){$f.warn(`Session end event failed: ${String(i)}`);}}var _f=2e3;function Jl(){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),Kn("double-ctrl-c",s,i).finally(()=>e());return}t.current=true,o(true),r.current=setTimeout(()=>{t.current=false,o(false);},_f);},[e,o,s,i]);return useInput((l,c)=>{c.ctrl&&l==="c"&&a();}),{pendingExit:n}}var Nf=16;function Gl({label:e,value:t,onChange:r,masked:n=false,isActive:o,error:s}){let i=useRef(t);useEffect(()=>{i.current=t;},[t]),useInput((l,c)=>{if(c.backspace){let u=i.current.slice(0,-1);i.current=u,r(u);}else if(l&&!c.ctrl&&!c.meta&&!c.escape&&!c.return&&!c.tab&&!c.upArrow&&!c.downArrow&&!c.leftArrow&&!c.rightArrow){let u=i.current+l;i.current=u,r(u);}},{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(Nf)}),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]})})]})}var Xe=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})}));function _r(){return ye__default.join(Ce__default.homedir(),".claude","settings.json")}function Gn(){let e=_r();if(!Se__default.existsSync(e))return {status:"missing"};let t=Se__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 Yo(e){let t=_r();Se__default.mkdirSync(ye__default.dirname(t),{recursive:true});let r=`${t}.${randomUUID()}.tmp`;Se__default.writeFileSync(r,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,t);}function Wl(e,t){let r=e.env&&typeof e.env=="object"&&!Array.isArray(e.env)?e.env:{};return {...e,env:{...r,ANTHROPIC_AUTH_TOKEN:t}}}function Fi(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}var Vf=3600,Dr=class extends Error{constructor(){super("~/.claude/settings.json contains invalid JSON"),this.name="MalformedSettingsError";}};function Hf(e){return Kf.sign({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:Vf})}function Zo(e,t={}){let r=Gn();if(r.status==="malformed"&&!t.allowOverwriteMalformed)throw new Dr;let n=r.status==="ok"?r.settings:{},o=r.status==="ok"?Fi(r.settings):null,s=Hf(e),i=Wl(n,s);return {jwt:s,merged:i,previousToken:o,hadExistingFile:r.status!=="missing"}}function Qo(e){Yo(e.merged);}function Xl(){let e=Gn();return e.status!=="ok"?false:Fi(e.settings)!==null}var ql="0.0.0";try{let e=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8"));typeof e.version=="string"&&(ql=e.version);}catch{}var le=ql;function zf(){let e=xl();if(!Se__default.existsSync(e))return {};try{return JSON.parse(Se__default.readFileSync(e,"utf-8"))}catch{return {}}}var ji=null;function Wf(){return ji===null&&(ji=zf()),ji}function cr(){return !!Wf().ENABLE_EXPERIMENTAL_BETAS}function Zf(){return re.filter(e=>e.platforms[process.platform]?.status==="supported")}function Zl(e){let t=Zf();return t.length>0&&t.every(r=>e.find(n=>n.module.alias===r.alias)?.alreadyInstalled===true)}var es={alias:"metrics",required:true,name:"flow-ai-obs",configCheck:()=>{try{let e=ye__default.join(Ce__default.homedir(),".claude","settings.json"),r=Se__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(e.customUrl&&t.push("--custom-url",e.customUrl),e.credentials){let{clientId:r,clientSecret:n,tenant:o}=e.credentials;t.push("--client-id",r,"--client-secret",n,"--tenant",o);}return [t]},onDemand:null,mode:"non-interactive"}},Qf={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},re=cr()?[es,Qf]:[es];var ng=x("moduleState");function rs(){let e=process.env.FLOW_HOME??ye__default.join(Ce__default.homedir(),".flow");return ye__default.join(e,"modules.json")}var og={retries:5,minTimeout:50};async function Ql(e,t){Se__default.mkdirSync(ye__default.dirname(e),{recursive:true});let r=await rg.lock(e+".lock",{realpath:false,retries:og});try{return await t()}finally{await r();}}function ec(){let e=rs();if(!Se__default.existsSync(e))return [];try{let t=JSON.parse(Se__default.readFileSync(e,"utf-8"));return t.schemaVersion!==1?(ng.warn(`modules.json has unknown schemaVersion ${t.schemaVersion}, resetting`),Se__default.rmSync(e,{force:!0}),[]):Array.isArray(t.modules)?t.modules.map(r=>({...r,name:r.name??null})):[]}catch{return Se__default.rmSync(e,{force:true}),[]}}function Or(){return ec()}function tc(e){let t=rs();Se__default.mkdirSync(ye__default.dirname(t),{recursive:true});let r=`${t}.${randomUUID()}.tmp`,n={schemaVersion:1,modules:e};Se__default.writeFileSync(r,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,t);}function qe(e){return Or().find(t=>t.alias===e)??null}async function dt(e){let t=rs();await Ql(t,async()=>{let r=ec(),n=r.findIndex(o=>o.alias===e.alias);n===-1?r.push(e):r[n]=e,tc(r);});}async function Ur(){let e=rs();Se__default.existsSync(e)||await Ql(e,async()=>{Se__default.existsSync(e)||tc([]);});}var ag=promisify(execFile);function ur(e,t){let r=e.platforms[process.platform];return !r||r.status!=="supported"?null:r.strategies.find(n=>n.type===t)??null}async function vt(e){let t=process.platform==="win32"?"where":"which";try{return await ag(t,[e]),!0}catch{return false}}function jt(){return process.platform==="win32"?"npm.cmd":"npm"}var rc=promisify(execFile),ln=class{type="npm";async isAvailable(){return vt("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=ur(t,"npm");if(!r)return null;try{let{stdout:n}=await rc(jt(),["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=ur(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 rc(jt(),["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 ns=promisify(execFile),pg=/^(\S+)\s+([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/,os=class{type="homebrew";async isAvailable(){return vt("brew")}async install(t){return this.runBrewCommand(t,"install")}async update(t,r){return this.runBrewCommand(t,"upgrade")}async getInstalledVersion(t){let r=ur(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=ur(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 ns("brew",["tap",o.tap]),await ns("brew",["trust",o.tap])),await ns("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 ns("brew",["list","--versions",t]),n=r.trim().match(pg);return n?n[2]:null}catch{return null}}};var cn=promisify(execFile),oc=/([\d]+\.[\d]+(?:\.[\d]+)*(?:[-_][^\s]+)?)/;function sc(){let e=process.env.FLOW_HOME??ye__default.join(Ce__default.homedir(),".flow");return ye__default.join(e,"bin")}var ss=class{type="curl";async isAvailable(){return vt("curl")}async install(t){let r=Date.now(),n=ur(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=ye__default.join(sc(),ye__default.basename(t.binaryName));for(let n of [r,t.binaryName])try{let{stdout:o}=await cn(n,["--version"]),s=o.match(oc);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=ye__default.join(Ce__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{Se__default.unlinkSync(s);}catch{}return {success:!1,error:{code:"CHECKSUM_MISMATCH",message:a.message},durationMs:Date.now()-o}}}return Se__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{Se__default.unlinkSync(s);}catch{}}}async installBinary(t,r,n,o){let s=sc(),i=ye__default.join(s,ye__default.basename(n.binaryName)),a=false;try{if(Se__default.mkdirSync(s,{recursive:!0}),a=!0,await cn("curl",["-L","--fail","-o",i,t]),r){let c=await this.validateChecksum(i,r);if(!c.valid)return Se__default.unlinkSync(i),{success:!1,error:{code:"CHECKSUM_MISMATCH",message:c.message},durationMs:Date.now()-o}}Se__default.chmodSync(i,493);let l=null;try{let{stdout:c}=await cn(i,["--version"]),u=c.match(oc);l=u?u[1]:null;}catch{}return {success:!0,version:l??void 0,method:"curl",durationMs:Date.now()-o}}catch(l){if(a)try{Se__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=ye__default.join(Ce__default.tmpdir(),`curl-checksum-${randomUUID()}`);try{await cn("curl",["-L","--fail","-o",n,r]);let o=Se__default.readFileSync(n,"utf-8").trim().split(/\s+/)[0],s=Se__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{Se__default.unlinkSync(n);}catch{}}}};var ve=x("moduleInstaller");function Et(e){switch(e){case "npm":return new ln;case "homebrew":return new os;case "curl":return new ss}}async function zn(e,t,r){try{await b(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){ve.warn(`Failed to emit install failed event: ${String(n)}`);}}async function pr(e,t,r,n){let o=Date.now(),s=e.platforms[process.platform];if(!s)return {success:false,error:{code:"PLATFORM_NOT_SUPPORTED",message:`Platform ${process.platform} is not listed for module ${e.alias}`},durationMs:Date.now()-o};if(s.status==="experimental"){ve.warn(`Module "${e.alias}" has experimental support on ${process.platform}`);let c={code:"PLATFORM_EXPERIMENTAL",message:`Experimental support on ${process.platform} \u2014 install manually`};return await zn(e,t,c),{success:false,error:c,durationMs:Date.now()-o}}if(s.status!=="supported"){let c={code:"PLATFORM_NOT_SUPPORTED",message:`Module ${e.alias} is not supported on ${process.platform}`};return await zn(e,t,c),{success:false,error:c,durationMs:Date.now()-o}}if(!s.strategies.some(c=>c.type===r)){let c={code:"STRATEGY_NOT_FOUND",message:`Strategy "${r}" is not configured for module "${e.alias}" on ${process.platform}`};return await zn(e,t,c),{success:false,error:c,durationMs:Date.now()-o}}let i=Et(r),a=false;try{a=await i.isAvailable();}catch(c){ve.warn(`${r} availability check failed: ${String(c)}`);}if(!a){let c={code:"STRATEGY_NOT_AVAILABLE",message:`"${r}" is not installed on this system`};return await zn(e,t,c),{success:false,error:c,durationMs:Date.now()-o}}try{await b(I.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:le,trigger:t});}catch(c){ve.warn(`Failed to emit install started event: ${String(c)}`);}let l;try{l=await i.install(e);}catch(c){let u=c instanceof Error?c.message:String(c);ve.warn(`${r} install threw: ${u}`),l={success:false,error:{code:"INSTALL_THREW",message:u},durationMs:Date.now()-o};}if(l.success){await dt({alias:e.alias,name:e.name,installedVersion:l.version??null,installMethod:l.method??null,installedAt:new Date().toISOString(),lastChecked:new Date().toISOString()});try{await b(I.CLI_MODULE_INSTALL_COMPLETED,{module_alias:e.alias,module_name:e.name,installed_version:l.version??"unknown",duration_ms:l.durationMs,os:process.platform,trigger:t});}catch(d){ve.warn(`Failed to emit install completed event: ${String(d)}`);}let{pendingCmd:c,failed:u}=await yg(e,t,n);return c?{...l,pendingInteractiveSetup:c}:u?{...l,postInstallFailed:true}:e.configCheck&&!e.configCheck()?{...l,configCheckFailed:true}:l}return await zn(e,t,l.error??{code:"UNKNOWN",message:"unknown error"}),l}async function yg(e,t,r){if(!e.postInstall)return {pendingCmd:null,failed:false};let n=t==="onboarding"?e.postInstall.onboarding:e.postInstall.onDemand;if(n==null)return {pendingCmd:null,failed:false};let o;if(typeof n=="function"){let i=await ae(),a={credentials:i?{clientId:i.clientId,clientSecret:i.clientSecret,tenant:i.tenant}:null,customUrl:r??null};try{o=n(a);}catch(l){return ve.warn(`postInstall function threw: ${String(l)}`),{pendingCmd:null,failed:false}}}else o=n;if(o.length===0)return {pendingCmd:null,failed:false};if((e.postInstall.mode??"non-interactive")==="interactive")return {pendingCmd:o[0]??null,failed:false};let s=false;for(let i=0;i<o.length;i++){let a=o[i];if(a.length===0)continue;let l=spawnSync(a[0],a.slice(1),{stdio:"pipe",env:process.env,encoding:"utf-8",shell:process.platform==="win32"});if(l.status!==0){s=true,ve.warn(`postInstall "${a.join(" ")}" exited with status ${l.status??"null"}`),l.stderr&&ve.warn(l.stderr);let c=o.slice(i+1).filter(u=>u.length>0);c.length>0&&ve.debug(`continuing with remaining postInstall steps: ${c.map(u=>u.join(" ")).join(", ")}`);}}return {pendingCmd:null,failed:s}}async function is(e,t){let r=Date.now(),n=qe(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=Et(n.installMethod),s=n.installedVersion??"unknown";if(t==="command")try{await b(I.CLI_MODULE_INSTALL_STARTED,{module_alias:e.alias,module_name:e.name,os:process.platform,cli_version:le,trigger:"command"});}catch(a){ve.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);ve.warn(`${n.installMethod} update threw: ${l}`),i={success:false,error:{code:"UPDATE_THREW",message:l},durationMs:Date.now()-r};}if(i.success)if(await dt({...n,installedVersion:i.version??n.installedVersion,lastChecked:new Date().toISOString()}),t==="command")try{await b(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){ve.warn(`Failed to emit update completed event: ${String(a)}`);}else try{await b(I.CLI_MODULE_UPDATED,{module_alias:e.alias,from_version:s,to_version:i.version??"unknown",duration_ms:i.durationMs});}catch(a){ve.warn(`Failed to emit module updated event: ${String(a)}`);}else if(t==="command")try{await b(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){ve.warn(`Failed to emit update failed event: ${String(a)}`);}return i}var as=x("flowAiObsSetup");async function Wn(e){try{if(!await new ln().isAvailable().catch(()=>!1))return as.warn("npm not available \u2014 skipping flow-ai-obs install"),{npmFailed:!0,initFailed:!1};let n=await pr(es,"onboarding","npm",e);return n.success?n.postInstallFailed||n.configCheckFailed?(as.debug("flow-ai-obs init failed (postInstall exit non-zero or configCheck failed)"),{npmFailed:!1,initFailed:!0}):{npmFailed:!1,initFailed:!1}:(as.warn(`flow-ai-obs install failed: ${n.error?.message??"unknown"}`),{npmFailed:!0,initFailed:!1})}catch(t){return as.warn(`installFlowAiObs threw: ${String(t)}`),{npmFailed:false,initFailed:false,unexpectedError:true}}}var ic=x("AuthSetup");function Sg(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 Ct=["clientId","clientSecret","tenant"],xg={clientId:"Client ID",clientSecret:"Client Secret",tenant:"Tenant"};function ac(){let[e,t]=useState({clientId:"",clientSecret:"",tenant:""}),[r,n]=useState("clientId"),[o,s]=useState({}),[i,a]=useState(null),[l,c]=useState(false),[u,d]=useState("fields"),[m,p]=useState(null),[f,h]=useState(null),[g,w]=useState("confirm"),[v,O]=useState(""),_=useRef(""),[E,M]=useState(false),K=useRef(0),H=useRef(false),{setCredentials:ue,setJustAuthenticated:T}=Xe(),N=()=>({clientId:e.clientId.trim(),clientSecret:e.clientSecret.trim(),tenant:e.tenant.trim()}),G=()=>{d("fields"),p(null),t(A=>({...A,clientSecret:""})),n("clientSecret");},B=async()=>{H.current=true;let A={...N(),customUrl:f??void 0};try{await Bt(A);}catch(at){a(at instanceof Error?at.message:"Failed to persist credentials"),G(),H.current=false;return}let{clientSecret:R,...V}=A;ue(V),T(true),b(I.CLI_SESSION_STARTED,{cli_version:le,os:process.platform,node_version:process.version,duration_ms:Ft(),interface:"tui"}).catch(()=>{}),await Wn(f).catch(at=>ic.warn(`installFlowAiObs threw unexpectedly: ${String(at)}`)),Xn({starterKit:V.starterKit});},be=async A=>{H.current=true;let R={...N(),customUrl:f??void 0};try{Qo(A),await Bt(R);}catch(Xr){a(Xr instanceof Error?Xr.message:"Failed to persist credentials"),G(),H.current=false;return}let{clientSecret:V,...at}=R;ue(at),T(true),b(I.CLI_SESSION_STARTED,{cli_version:le,os:process.platform,node_version:process.version,duration_ms:Ft(),interface:"tui"}).catch(()=>{}),await Wn(f).catch(Xr=>ic.warn(`installFlowAiObs threw unexpectedly: ${String(Xr)}`)),Xn({starterKit:at.starterKit});},Ut=A=>{try{return Zo(N(),{allowOverwriteMalformed:A})}catch(R){return R instanceof Dr?(d("malformedConfirm"),null):(a(R instanceof Error?R.message:"Failed to read settings.json"),d("fields"),null)}};useInput((A,R)=>{if(!(l||H.current)){if(u==="preview"){R.return&&m?be(m):R.escape?B():A==="q"&&G();return}if(u==="malformedConfirm"){if(R.return){let V=Ut(true);V&&(p(V),be(V));}else R.escape&&G();return}if(u==="customUrl"){if(g==="confirm")A==="y"||A==="Y"?w("input"):(A==="n"||A==="N"||R.return)&&U(null);else if(R.escape)_.current="",O(""),w("confirm");else if(R.return){let V=_.current.trim();V.length>0&&Zr.test(V)?(M(false),U(V)):V.length>0&&M(true);}else R.backspace||R.delete?(_.current=_.current.slice(0,-1),O(_.current)):A&&!R.ctrl&&!R.meta&&(_.current=_.current+A,O(_.current),M(false));return}if(R.shift&&R.tab){let V=Ct.indexOf(r);V>0&&n(Ct[V-1]);}else if(R.tab){let V=Ct.indexOf(r);V<Ct.length-1&&n(Ct[V+1]);}else if(R.return)if(r==="tenant")$();else {let V=Ct.indexOf(r);n(Ct[V+1]);}}},{isActive:true});let $=()=>{let A={};for(let R of Ct)e[R].trim()||(A[R]="This field is required");if(Object.keys(A).length>0){s(A);let R=Ct.find(V=>A[V]);R&&n(R);return}w("confirm"),_.current="",O(""),M(false),d("customUrl");},U=async(A=f)=>{h(A),c(true),a(null),K.current+=1;try{await Mr(N());let R=Ut(!1);R&&(p(R),d("preview"));}catch(R){let V=R instanceof Error?R.message:"Authentication failed";a(V),Bl(I.CLI_AUTH_FAILED,{error_code:Sg(R),attempt:K.current},e.tenant.trim()).catch(()=>{}),t(at=>({...at,clientSecret:""})),d("fields");}finally{c(false);}},z=A=>R=>{t(V=>({...V,[A]:R})),o[A]&&s(V=>({...V,[A]:void 0}));};return u==="customUrl"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[Rn," \u2014 Initial Setup"]})}),jsxs(Box,{flexDirection:"column",gap:1,children:[l&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),!l&&g==="confirm"&&jsx(Text,{children:"Does your organization use a custom Flow URL? (y/N)"}),!l&&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:v}),jsx(Text,{color:"cyan",children:"\u2588"})]}),E&&jsx(Text,{color:"red",children:Qr}),jsx(Text,{dimColor:true,children:"Enter to confirm \xB7 Esc to go back"})]})]})]}):u==="preview"&&m?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[Rn," \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:m.previousToken?" ~ env.ANTHROPIC_AUTH_TOKEN (replaced)":" + env.ANTHROPIC_AUTH_TOKEN (new)"}),m.hadExistingFile&&jsx(Text,{dimColor:true,children:" Existing settings preserved."})]})]}),jsxs(Box,{marginTop:1,flexDirection:"column",children:[jsx(Text,{dimColor:true,children:"Enter \u2014 update settings.json and continue"}),jsx(Text,{dimColor:true,children:"Esc \u2014 skip JWT update, continue"}),jsx(Text,{dimColor:true,children:"q \u2014 back to form"})]})]}):u==="malformedConfirm"?jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"yellow",children:[Rn," \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"})})]}):jsxs(Box,{flexDirection:"column",padding:2,children:[jsx(Box,{marginBottom:1,children:jsxs(Text,{bold:true,color:"cyan",children:[Rn," \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:Ct.map(A=>jsx(Box,{marginBottom:1,children:jsx(Gl,{label:xg[A],value:e[A],onChange:z(A),masked:A==="clientSecret",isActive:r===A&&!l,error:o[A]})},A))}),l&&jsx(Box,{marginTop:1,children:jsx(Text,{color:"cyan",children:"Authenticating..."})}),i&&jsx(Box,{marginTop:1,children:jsxs(Text,{color:"red",children:["\u26A0 ",y(i)]})}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Tab next field \xB7 Enter confirm"})})]})}function un(){return jsxs(Box,{flexDirection:"column",alignItems:"center",children:[jsx(bg,{text:"FLOW",font:"block",colors:["white","white"]}),jsx(Box,{marginTop:-1,marginBottom:1,children:jsxs(Text,{dimColor:true,children:["Marketplace \xB7 v",le]})})]})}var dc=[{id:"discover",focus:"list"},{id:"installed",focus:"list"},{id:"updates",focus:"list"},{id:"marketplaces",focus:"marketplaces"}],Q=cr()?dc:dc.slice(0,3);function vg(e){return Q.findIndex(t=>t.id===e)}function Hi(e,t,r){let n=vg(r.activeTab);if(t.rightArrow||t.tab){let o=Q[(n+1)%Q.length];return [{type:"setTab",tab:o.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:o.focus}]}if(t.leftArrow){let o=Q[(n-1+Q.length)%Q.length];return [{type:"setTab",tab:o.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:o.focus}]}return t.downArrow?[{type:"setFocus",focus:Q[n]?.focus??"list"}]:[]}var fc={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function gc({outdatedCount:e=0}){let t=S(r=>r.activeTab);return jsx(Box,{paddingX:1,paddingBottom:1,children:Q.map(({id:r})=>{let n=r===t,o=r==="updates"&&e>0?`${fc[r]} (${e})`:fc[r];return jsx(Box,{marginRight:1,children:n?jsx(Text,{bold:true,inverse:true,children:` ${o} `}):jsx(Text,{dimColor:true,children:` ${o} `})},r)})})}var Fe=create(e=>({query:"",cursorPosition:0,setQuery:t=>e({query:t}),setCursorPosition:t=>e({cursorPosition:t}),resetQuery:()=>e({query:"",cursorPosition:0})}));function yc(){let e=S(i=>i.focus),t=Fe(i=>i.query),r=Fe(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..."})]})}var Tg=["skill","mcp","bundle"].map((e,t)=>({key:String(t+2),type:e,...Yr[e]})),kg=["internal","external"].map((e,t)=>({key:String(t+6),origin:e,...pl[e]}));function wc(){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"]})]}),Tg.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"]})]}),kg.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)})]})}function Sc({type:e}){let{label:t,color:r}=Yr[e];return jsx(Text,{color:r,children:t})}function bc({origin:e}){return e===_n?jsx(Text,{color:"blue",children:"[Flow]"}):jsx(Text,{color:"white",children:"[External]"})}var cs=Mg.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(Sc,{type:t.type})]}),t.origin&&jsxs(Text,{children:[" ",jsx(bc,{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 ",nr(t.installedAt)]})]}),jsx(Box,{paddingLeft:2,children:jsx(Text,{dimColor:true,children:t.description})})]})});function dn({message:e}){return jsx(Box,{paddingX:2,paddingY:1,children:jsx(Text,{dimColor:true,children:e??"No items found."})})}function Ec({items:e,emptyMessage:t}){let r=S(l=>l.selectedIndex);if(e.length===0)return jsx(dn,{message:t});let n=Math.max(0,r-Math.floor(Ge/2)),o=Math.min(e.length,n+Ge);o===e.length&&(n=Math.max(0,o-Ge));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,c)=>jsx(cs,{item:l,isSelected:n+c===r},l.name)),jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:a>0?`\u2193 ${a} more below`:" "})})]})}function kc({label:e,pathHint:t}){return jsxs(Box,{paddingBottom:1,children:[jsx(Text,{bold:true,color:"blueBright",children:e}),jsxs(Text,{dimColor:true,children:[" ",t]})]})}function $c({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(dn,{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(Ge/2)),c=Math.min(n.length,l+Ge);c===n.length&&(l=Math.max(0,c-Ge));let u=n.slice(l,c),d=l,m=n.length-c;return jsxs(Box,{flexDirection:"column",children:[jsx(Box,{paddingX:2,children:jsx(Text,{dimColor:true,children:d>0?`\u2191 ${d} more above`:" "})}),u.map(p=>p.kind==="header"?jsx(kc,{label:p.label,pathHint:p.pathHint},p.key):jsx(cs,{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 Bg={discover:"Discover",installed:"Installed",updates:"Updates",marketplaces:"Marketplaces"};function Fg({items:e,tabId:t,emptyMessage:r,groups:n,actionHint:o}){return jsxs(Box,{flexDirection:"column",children:[jsx(yc,{}),jsx(wc,{}),jsxs(Box,{paddingX:1,marginTop:1,children:[jsx(Text,{bold:true,children:Bg[t]}),jsxs(Text,{dimColor:true,children:[" (",e.length,")"]}),o&&e.length>0&&jsx(Text,{dimColor:true,children:` \xB7 ${o}`})]}),n&&n.length>0?jsx($c,{groups:n,emptyMessage:r}):jsx(Ec,{items:e,emptyMessage:r})]})}function Mc({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(Fg,{items:e,tabId:o,emptyMessage:t,groups:o!=="discover"?r:void 0,actionHint:o==="updates"?"press 'a' to update all":void 0},o)})}var Vg={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 us(){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:[Vg[e],t?" | Ctrl+D: debug log":""]})})}function Lc({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 ds({message:e}){return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Hu,{type:"dots"})}),jsxs(Text,{children:[" ",e]})]})}function Yi(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}var Oc=20;function ps(e,t){let r=t>0?Math.min(e/t,1):0,n=Math.round(r*100),o=Math.round(r*Oc),s="\u2588".repeat(o)+"\u2591".repeat(Oc-o),i=`${Yi(e)} / ${Yi(t)}`;return {bar:s,percent:n,label:i}}function ms({received:e,total:t}){let{bar:r,percent:n,label:o}=ps(e,t);return jsxs(Text,{dimColor:true,children:[r," ",n,"%"," ","(",o,")"]})}function fs({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 Ye({itemName:e,actions:t,descriptions:r,onAction:n,onClose:o}){let s=S(l=>l.focus),[i,a]=useState(0);return useInput((l,c)=>{c.upArrow?a(u=>u>0?u-1:u):c.downArrow?a(u=>u<t.length-1?u+1:u):c.return?n(t[i]):c.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,c)=>jsxs(Box,{children:[jsxs(Text,{bold:c===i,color:c===i?"cyan":void 0,children:[c===i?"\u203A ":" ",l]}),r?.[l]&&jsxs(Text,{dimColor:true,children:[" \u2014 ",r[l]]})]},c))})]})}var ta=Object.entries(Dn),Fc=[...ta.map(([,e])=>e.actionLabel),"Cancel"],jc=Object.fromEntries(ta.map(([,e])=>[e.actionLabel,e.description]));function Kc(e){let t=ta.find(([,r])=>r.actionLabel===e);return t?t[0]:null}var oh=x("provider.registry"),sh=3e4,hs=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()+sh}),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"&&oh.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 ih={user:"global",project:"project",local:"local"};function ys(e){return e?ih[e]:"global"}var je=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},fr=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};Fn();function gt(){return Wc.create({prefix:an("PROMPT_MANAGER_URL","https://flow.ciandt.com/prompt-manager-api/"),hooks:{beforeRequest:[async({request:e})=>{let t=await lr();e.headers.set("Authorization",`Bearer ${t}`);let r=await ae();r?.tenant&&Cr.test(r.tenant)&&e.headers.set("FlowTenant",r.tenant);}]}})}var lh=x("catalog.registry"),ws=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);lh.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()]}};var hh={retries:5,minTimeout:50};async function ra(e,t){mkdirSync(dirname(e),{recursive:true});let r=await rg.lock(e+".lock",{realpath:false,retries:hh});try{return await t()}finally{await r();}}var Ss=class{filePath;constructor(t){this.filePath=t??Sl();}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 ra(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 ra(this.filePath,async()=>{let r=await this.read();await this.write(r.filter(n=>n.id!==t));});}async updateField(t,r){await ra(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));});}};var yh=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function Zn(e){if(!e||!yh.test(e))throw new Error(`Invalid plugin name: "${e}". Must be 1-64 chars, lowercase alphanumeric and hyphens only.`)}var wh=/^[^@]+@[^@]+$/;function mn(e){return wh.test(e)}function fn(e){let t=e.indexOf("@");return t>0?e.slice(0,t):e}var Sh=/^[a-zA-Z0-9][a-zA-Z0-9._/-]*$/;function xh(e){if(!Sh.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 gn(e,t){let r=fn(e);xh(r);let n=["claude","plugin","install",r];return t&&n.push("--scope",t),n.join(" ")}var Ih=/^[\w./:@?&=+#%-]+$/;function xs(e){let t=e.trim();if(!t)throw new Error("No marketplace source provided.");if(!Ih.test(t))throw new Error(`Invalid marketplace source: "${t}". Must be owner/repo or a URL (no spaces or special characters).`);return t}var bh=x("catalog.flow-api"),Is=class{id="flow-api";name="Flow Marketplace";source;removable=false;constructor(){this.source=process.env.PROMPT_MANAGER_URL??"";}async fetchItems(){try{let{plugins:t}=await gt().get("v1/plugins/catalog").json();return t.map(r=>({...r,catalogId:this.id,origin:r.origin??"internal",type:r.type??"bundle"}))}catch(t){if(t instanceof HTTPError){let{status:r}=t.response;throw r===401||r===403?new Error("Authentication failed. Run: flow auth login"):new Error(`Failed to fetch plugin catalog: HTTP ${r}`)}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){Zn(t);try{return await gt().get(`v1/plugins/${t}/manifest`).json()}catch(r){if(r instanceof HTTPError){let{status:n}=r.response;throw n===404?new Error(`Plugin '${t}' not found in catalog`):new Error(`Failed to fetch manifest: HTTP ${n}`)}throw r instanceof Error?new Error(`Failed to fetch manifest: ${r.message}`):r}}async ping(){try{return await gt().head("v1/plugins/catalog"),bh.debug("ping ok"),!0}catch{return false}}};var de=new ws,Vt=new Ss;de.register(new Is);var Yc=false;async function Zc(){if(Yc)return;Yc=true;let e=await Vt.read(),{GitRepoAdapter:t}=await Promise.resolve().then(()=>(na(),qc));for(let r of e)de.register(new t(r.id,r.name,r.source));}var Qc=2;async function gr(){return de.fetchAll()}async function eu(){return de.fetchAllWithErrors()}async function yn(e){Zn(e);try{return await gt().get(`v1/plugins/${e}/manifest`).json()}catch(t){throw t instanceof Error?t.message.includes("404")?new Error(`Plugin '${e}' not found in catalog`):t.message.includes("timeout")?new Error("Download timed out after 30s"):new Error(`Failed to fetch plugin manifest: ${t.message}`):t}}async function tu(e,t){Zn(e);try{let r=await gt().get(`v1/plugins/${e}/archive`),n=r.headers.get("x-archive-size"),o=n?Number(n):NaN,s=Number.isFinite(o)&&o>0?o:0,i=s>0,a=r.body;if(!a)throw new Error("Failed to download plugin: response has no body");let l=a.getReader(),c=[],u=0;for(;;){let{done:d,value:m}=await l.read();if(d)break;if(u+=m.byteLength,i&&u>s*Qc)throw await l.cancel(),new Error(`Download exceeded expected size: received ${u} bytes, expected at most ${s*Qc}`);c.push(m),i&&t?.(u,s);}return Buffer.concat(c)}catch(r){throw r instanceof Error?r.message.includes("Download exceeded expected size")?r:new Error(`Failed to download plugin: ${r.message}`):r}}async function bs(){try{let{profiles:e}=await gt().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}}async function ru(e,t){let r=ye.resolve(t);await Tt.mkdir(r,{recursive:true});let n=ye.join(ye.dirname(r),`${randomUUID()}.zip`);try{await Tt.writeFile(n,e),await Th(n,{dir:r,onEntry(o){if((o.externalFileAttributes>>16&61440)===40960)throw new Error(`Zip Slip (symlink): entry "${o.fileName}" is a symbolic link and was rejected`);let i=ye.resolve(r,o.fileName);if(process.platform==="win32"&&i.length>=260)throw new Error(`Path too long: "${i}" (${i.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.`);let a=ye.normalize(r+ye.sep);if(!i.startsWith(a)&&i!==r)throw new Error(`Zip Slip detected: entry "${o.fileName}" would escape target directory`)}});try{let o=realpathSync(r);if(!o.startsWith(ye.resolve(ye.dirname(r))))throw new Error(`Zip Slip (post-extract): resolved path "${o}" is outside expected parent`)}catch(o){if(o.code!=="ENOENT")throw o}}finally{try{await Tt.unlink(n);}catch{}}}async function oa(e){await Tt.rm(e,{recursive:true,force:true});}async function hr(){let e=yl();await Tt.mkdir(ye.dirname(e),{recursive:true});try{await Tt.writeFile(e,"",{flag:"wx"});}catch(r){if(r.code!=="EEXIST")throw r}return await rg.lock(e,{stale:1e4,retries:{retries:2,minTimeout:500,maxTimeout:500}})}function $h(){return {$schema:"https://anthropic.com/claude-code/marketplace.schema.json",name:Y,description:"Flow Skills marketplace",owner:{name:"Flow Team",email:"flow@ciandt.com"},plugins:[]}}function su(){let e=ko();if(!Se__default.existsSync(e))return null;try{return JSON.parse(Se__default.readFileSync(e,"utf-8"))}catch{return null}}function Mh(){let e=su();if(e)return e;let t=$h(),r=ko();return Se__default.mkdirSync(ye__default.dirname(r),{recursive:true}),sa(t),t}function sa(e){let t=ko(),r=`${t}.${randomUUID()}.tmp`;Se__default.writeFileSync(r,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,t);}function Lh(){let e=Ao(),t={};try{Se__default.existsSync(e)&&(t=JSON.parse(Se__default.readFileSync(e,"utf-8")));}catch{t={};}if(t[Y])return;t[Y]={source:{source:"github",repo:"CI-T-HyperX/flow-skills"},installLocation:hl(),lastUpdated:new Date().toISOString()};let r=`${e}.${randomUUID()}.tmp`;Se__default.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,e);}function iu(e,t){ht(e.name),Lh();let r=yi(e.name);Se__default.mkdirSync(ye__default.dirname(r),{recursive:true});try{Se__default.lstatSync(r),Se__default.rmSync(r,{recursive:!0,force:!0});}catch{}Se__default.symlinkSync(t,r,process.platform==="win32"?"junction":"dir");let n=Mh();n.plugins.some(s=>s.name===e.name)||(n.plugins.push({name:e.name,description:e.description,version:e.version,author:e.author,source:`./plugins/native/${e.name}`,category:e.category}),sa(n));}function ia(e){ht(e);let t=yi(e);try{Se__default.rmSync(t,{recursive:!0,force:!0});}catch{}let r=su();if(!r)return;let n=r.plugins.length;r.plugins=r.plugins.filter(o=>o.name!==e),r.plugins.length!==n&&sa(r);}var _h=x("mcpConfigReader"),Dh=500,Oh=512;function Uh(){return ye__default.join(Ce__default.homedir(),".claude.json")}function Nh(){return ye__default.join(process.cwd(),".mcp.json")}function lu(e){if(!Se__default.existsSync(e))return null;try{return JSON.parse(Se__default.readFileSync(e,"utf-8"))}catch{return _h.debug(`[mcpConfigReader] Failed to parse ${e}`),null}}function Qn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function aa(e){if(!Qn(e))return {};let t=e.mcpServers;return Qn(t)?t:{}}function la(e,t){return Object.keys(e).slice(0,Dh).map(n=>({name:y(n.slice(0,Oh)),marketplace:"",version:void 0,installedAt:"",installPath:"",scope:t,description:void 0,author:void 0,status:"enabled",type:"mcp"}))}function uu(){let e=[],t=Uh(),r=lu(t);if(Qn(r)){let a=r,l=aa(a);e.push(...la(l,"user"));let c=process.cwd();if(Qn(a.projects)){let u=a.projects[c];if(Qn(u)){let d=aa(u);e.push(...la(d,"local"));}}}let n=Nh(),o=lu(n),s=aa(o);e.push(...la(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 Ze=x("storage");async function Fh(e,t,r){try{await b(I.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:r,source:t,interface:X().interfaceType});}catch(n){Ze.warn(`Failed to send uninstall metrics: ${String(n)}`);}}function jh(e,t,r){let n=t==="enabled"?I.CLI_TOOL_ENABLED:I.CLI_TOOL_DISABLED;b(n,{tool_id:e,source:r,interface:X().interfaceType}).catch(o=>Ze.warn(`Failed to send ${t} metrics: ${String(o)}`));}function pa(){return ye__default.join(Ce__default.homedir(),".claude","plugins","installed_plugins.json")}function Kh(){return ye__default.join(Ce__default.homedir(),".claude","plugins")}function du(e){let t=ye__default.resolve(e),r=ye__default.resolve(Kh()),n=ye__default.resolve(ye__default.join(process.cwd(),".claude","plugins")),o=t.startsWith(r+ye__default.sep)||t===r,s=t.startsWith(n+ye__default.sep)||t===n;if(!o&&!s)throw new Error(`Security error: installPath '${e}' is outside the plugins directory`)}function pu(e="user"){return e==="local"?ye__default.join(process.cwd(),".claude","settings.local.json"):e==="project"?ye__default.join(process.cwd(),".claude","settings.json"):ye__default.join(Ce__default.homedir(),".claude","settings.json")}function et(){let e=pa();if(!Se__default.existsSync(e))return {version:2,plugins:{}};try{return JSON.parse(Se__default.readFileSync(e,"utf-8"))}catch{return {version:2,plugins:{}}}}async function ma(){let e=pa();try{let t=await Se__default.promises.readFile(e,"utf-8");return JSON.parse(t)}catch{return {version:2,plugins:{}}}}function Vh(e){let t=e?.code;return t==="EACCES"||t==="EPERM"}function mu(e,t){try{Se__default.mkdirSync(ye__default.dirname(e),{recursive:!0});let r=`${e}.${randomUUID()}.tmp`;Se__default.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),Se__default.renameSync(r,e);}catch(r){throw Vh(r)?new Error(`Permission denied: cannot write to '${e}'. Check your file system permissions.`):r}}function Qe(e){mu(pa(),e);}function eo(e){let t=e.lastIndexOf("@");return t===-1?{name:e,marketplace:""}:{name:e.slice(0,t),marketplace:e.slice(t+1)}}function Hh(e,t){let r=ye__default.join(e,".claude-plugin"),n=ye__default.join(r,"plugin.json");if(Se__default.existsSync(n))try{return JSON.parse(Se__default.readFileSync(n,"utf-8"))}catch{return null}let o=ye__default.join(r,"marketplace.json");if(Se__default.existsSync(o))try{let s=JSON.parse(Se__default.readFileSync(o,"utf-8"));return {description:s.plugins?.find(a=>a.name===t)?.description,author:s.owner}}catch{return null}return null}function fa(e="user"){let t=pu(e);if(!Se__default.existsSync(t))return {};try{return JSON.parse(Se__default.readFileSync(t,"utf-8"))}catch{return {}}}function fu(e,t="user"){mu(pu(t),e);}function Jh(e,t){let{name:r,marketplace:n}=eo(e),o;if(n?(o=`${r}@${n}`,t[o]||(o=void 0)):o=Object.keys(t).filter(i=>eo(i).name===r)[0],!o)throw Ze.error(`[${r}] Plugin is not installed`),new Error(`Plugin '${r}' is not installed`);return {key:o,name:r}}function Gh(e,t){let{name:r,marketplace:n}=eo(e),o;return n?(o=`${r}@${n}`,t[o]||(o=void 0)):o=Object.keys(t).filter(i=>eo(i).name===r)[0],o?{key:o,name:r}:null}function ca(e="user"){return fa(e).enabledPlugins??{}}function ua(e,t="user"){let r=fa(t),n=r.enabledPlugins;if(!n||!(e in n))return;let{[e]:o,...s}=n;r.enabledPlugins=s,fu(r,t);}function to(e,t,r="user"){let n=fa(r),o=n.enabledPlugins??{};n.enabledPlugins={...o,[e]:t},fu(n,r);}function zh(e){let t=new Map;for(let r of e){let n=t.get(r.scope);(!n||r.installedAt>n.installedAt)&&t.set(r.scope,r);}return [...t.values()]}function ne(){let e=et(),t=ca(),r=ca("project"),n=ca("local"),o={project:r,local:n},s=Object.entries(e.plugins).flatMap(([c,u])=>{let{name:d,marketplace:m}=eo(c),p=u.map(h=>h.scope==="managed"?{...h,scope:"user"}:h);return zh(p).map(h=>{let g=Hh(h.installPath,d),v=(o[h.scope]??t)[c];return {name:d,marketplace:m,version:h.version&&h.version!=="unknown"?h.version:void 0,installedAt:h.installedAt,installPath:h.installPath,scope:h.scope,providerId:h.providerId,type:h.type,description:g?.description,author:g?.author,status:v===false?"disabled":"enabled"}})}),i=uu(),a=new Set(s.map(c=>`${c.name}@${c.scope}`)),l=i.filter(c=>!a.has(`${c.name}@${c.scope}`));return [...s,...l]}async function ro(e,t){Ze.debug(`[${e}] Acquiring lock to uninstall`);let r=await hr();try{let n=et(),o=Gh(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`);Ze.debug(`[${i}] Resolved key: ${s}, scope: ${t}`),du(l.installPath);let c=ye__default.dirname(l.installPath);Ze.debug(`[${i}] Removing directory: ${c}`),Se__default.rmSync(c,{recursive:!0,force:!0});let u=a.filter(d=>d.scope!==t);if(u.length===0){let{[s]:d,...m}=n.plugins;Qe({...n,plugins:m}),ua(s,t),ia(i);}else n.plugins[s]=u,Qe(n),ua(s,t);}else {Ze.debug(`[${i}] Resolved key: ${s}`);for(let u of a){du(u.installPath);let d=ye__default.dirname(u.installPath);Ze.debug(`[${i}] Removing directory: ${d}`),Se__default.rmSync(d,{recursive:!0,force:!0}),ua(s,u.scope);}ia(i);let{[s]:l,...c}=n.plugins;Qe({...n,plugins:c});}await Fh(i,a[0].origin??"internal",a[0].type??"skill"),Ze.debug(`[${i}] Uninstalled successfully`);}finally{await r();}}async function no(e,t,r){Ze.debug(`[${e}] Acquiring lock to set status \u2192 ${t}`);let n=await hr();try{let o=et(),{key:s,name:i}=Jh(e,o.plugins),a=o.plugins[s],l=r??a[0].scope,c=a[0].origin??"internal";Ze.debug(`[${i}] Resolved key: ${s}, scope: ${l}`),to(s,t==="enabled",l),jh(i,t,c),Ze.debug(`[${i}] Status updated to ${t}`);}finally{await n();}}var Wh=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/,Xh=/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)?$/;function ht(e){if(!Wh.test(e))throw new Error(`Invalid plugin name from manifest: "${e}". Plugin names must be lowercase alphanumeric and hyphens (1-64 chars).`)}function qh(e){if(!Xh.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 yr=x("installer");function Yh(e,t){let r=`${e}@${Y}`,o=et().plugins[r];if(o&&!t)throw new je(e,o[0].version??"unknown");return {pluginKey:r,alreadyInstalled:o}}async function Zh(e,t,r){r&&await oa(t);try{yr.debug(`[${t}] Extracting archive...`),await ru(e,t);}catch(n){throw await oa(t),n}}function Qh(e,t,r,n,o,s="claude-code",i){let a=et(),l={scope:n,installPath:t,version:r,installedAt:new Date().toISOString(),origin:o,providerId:s,type:i},c=a.plugins[e]??[];a.plugins[e]=[...c.filter(u=>u.scope!==n),l],Qe(a),to(e,true,n);}async function ey(e,t,r,n,o,s){try{await b(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:s,source:o,scope:n,version:t,duration_ms:r,interface:X().interfaceType});}catch(i){yr.warn(`Failed to send install metrics: ${String(i)}`);}}async function ty(e,t,r,n){try{await b(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:X().interfaceType});}catch(o){yr.warn(`Failed to send install-failed metrics: ${String(o)}`);}}async function $e(e,t={}){let r=Date.now(),n=null;try{yr.debug(`[${e}] Acquiring lock...`),n=await hr();let{pluginKey:o,alreadyInstalled:s}=Yh(e,t.force);yr.debug(`[${e}] Fetching manifest...`);let i=await yn(e);ht(i.name),qh(i.version),yr.debug(`[${e}] Downloading archive...`);let a=await tu(e,t.onDownloadProgress),l=t.scope??"user",c=t.type??"skill",u=gl(i.name,i.version);await Zh(a,u,!!s&&!!t.force),Qh(o,u,i.version,l,"internal",t.providerId,c),iu(i,u);let d=Date.now()-r;yr.debug(`[${e}] Installed successfully in ${d}ms`);let m={name:i.name,version:i.version,path:u,duration_ms:d};return t.skipMetrics||await ey(i.name,i.version,d,ys(l),"internal",c),m}catch(o){throw await ty(e,o,"internal",t.type??"skill"),yr.error(`[${e}] Installation failed: ${o instanceof Error?o.message:String(o)}`),o}finally{n&&await n();}}var ry=x("commands:helpers");async function we(){let e=await ae();if(!e)return P("Not authenticated. Run: flow auth login"),false;e.customUrl&&ar(e.customUrl);try{await lr();}catch(t){return ry.debug(`Token validation failed: ${String(t)}`),P("Session expired. Run: flow auth login"),false}return true}async function kt(e){let t=ga.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 gu(e){let t=ga.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{t.question(y(e),n=>{t.close(),r(n.trim());});})}var wn=x("claudeProxy"),xa="claude ",hu="flow ",ha=class extends Error{constructor(t){super(`Invalid install command: "${t}". Command must start with "claude " for security.`),this.name="InvalidInstallCommandError";}},ya=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";}},ny=/^plugins?\s+(install|i)\s+|^plugins?\s+marketplace\s+add\s+|^mcp\s+(add|remove)\s+/,oy=/^npm\s+(i|install)\s+-g\s+@ciandt-flow\/cli$/,sy=/^(flow|claude)\s+auth\s+login(\s|$)/,yu=/^flow\s+plugins?\s+(install|i)\s+([^@\s]+)$/;function wu(e){return yu.test(e.trim())}function iy(e){return yu.exec(e.trim())?.[2]??""}async function Su(e){let t=iy(e),r=Date.now();wn.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 Ia(n)?new wa:n}}function ay(e){xu(e);let t=e.slice(xa.length);if(!ny.test(t))throw new ya(e)}var vs=class extends Error{constructor(){super('Claude Code CLI not found. Ensure "claude" is installed and available on your PATH.'),this.name="ClaudeCliNotFoundError";}},wa=class extends Error{constructor(){super('Flow CLI not found. Ensure "flow" is installed and available on your PATH.'),this.name="FlowCliNotFoundError";}};function xu(e){if(!e||!/^claude /.test(e))throw new ha(e)}async function Pe(e){xu(e);let t=e.slice(xa.length).split(/\s+/).filter(Boolean),r=ly(t);wn.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 wn.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 Ia(o)?new vs:o}}function ly(e){return e.length>=3?e[2]:e.join(" ")}function Ia(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}function cy(e){return e.startsWith(hu)?xa+e.slice(hu.length):e}function uy(e){return oy.test(e)||sy.test(e)}function dy(e){let t=0;for(;t<e.length&&uy(e[t]);)t++;return e.slice(t)}var py=/^claude\s+(?:plugins?\s+(?:install|i)\s+|mcp\s+(?:add|remove)\s+)/;function my(e,t){return !t||e.includes("--scope")||!py.test(e)?e:`${e} --scope ${t}`}async function oo(e,t){let r=e.split("&&").map(i=>i.trim()).filter(Boolean),o=dy(r).map(i=>cy(i)).map(i=>my(i,t));if(o.length===0)throw new Error("Empty install command");for(let i of o)ay(i);wn.debug(`[installCommand] Executing ${o.length} command(s)`);let s=await Pe(o[0]);if(s.exitCode!==0)return s;for(let i=1;i<o.length;i++)if(s=await Pe(o[i]),s.exitCode!==0)return s;return s}async function Ps(e,t,r){let n=fn(e),o=t?.trim();if(!o&&(o=(await gu(`Plugin "${n}" could not be installed.
|
|
111
|
+
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=xs(o),r?.(),wn.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"}`);wn.debug(`[${n}] Marketplace added successfully`);}catch(s){throw Ia(s)?new vs:s}}var wy=6e4,wr=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 At(e,t){let r=await mkdtemp(join(tmpdir(),"flow-skills-")),n=simpleGit({timeout:{block:wy}}).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 wr("Clone timed out after 60s. Check your SSH keys or credentials.",e,true,false):l?new wr(`Authentication failed for ${e}. Ensure you have access and credentials are configured.`,e,false,true):new wr(`Failed to clone ${e}: ${i}`,e,false,false)}}async function $t(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 Vr(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 xy(e){return typeof e=="object"&&e!==null&&e.source==="git-subdir"}function Iy(e){return typeof e=="object"&&e!==null&&e.source==="url"}function by(e){return typeof e=="object"&&e!==null&&e.source==="github"}function Sn(e,t){let r=e.source;if(xy(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(Iy(r))return {cloneUrl:r.url,subPath:"."};if(by(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 tt(e){return e.toLowerCase().replace(/[^a-z0-9._]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").substring(0,255)||"unnamed"}var Mt=x("claude-code.adapter");function Ey(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=Ao();if(!Se__default.existsSync(s))return r;try{let i=JSON.parse(Se__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 Tu(e,t){let r=e.catalogId?de.getAdapter(e.catalogId):void 0,n=Sn(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=Ey(e.catalogId,r?.source),i=t.scope??"user",a;o?a=wi(s,e.name,"external"):a=join(kr(i==="user"?"global":"project"),e.name);let l=null;try{ht(e.name),l=await At(n.cloneUrl,n.ref);let c=n.subPath==="."?l:join(l,n.subPath);if(Se__default.existsSync(a)&&Se__default.rmSync(a,{recursive:!0,force:!0}),Se__default.mkdirSync(dirname(a),{recursive:!0}),Se__default.cpSync(c,a,{recursive:!0}),o){let u=`${e.name}@${s}`,d=await ma(),m={scope:i,installPath:a,version:"external",installedAt:new Date().toISOString(),origin:"external",providerId:"claude-code",type:e.type},p=d.plugins[u]??[];d.plugins[u]=[...p.filter(f=>f.scope!==i),m],Qe(d),to(u,!0,i);}return {success:!0,message:`Installed ${e.name} from ${n.cloneUrl}`}}catch(c){return Mt.debug(`[${e.name}] External catalog install failed: ${String(c)}`),{success:false,message:c instanceof Error?c.message:String(c)}}finally{l&&await $t(l).catch(()=>{});}}async function ba(e,t,r,n){try{await b(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:r,source:"external",scope:ys(n),version:"unknown",duration_ms:t,interface:X().interfaceType});}catch(o){Mt.warn(`Failed to send external install metrics: ${String(o)}`);}}async function Eu(e,t,r){try{await b(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:X().interfaceType});}catch(n){Mt.warn(`Failed to send external install-failed metrics: ${String(n)}`);}}var Cy={async install(e,t){if(e.origin===qr&&!e.installCommand&&!mn(e.name))return Tu(e,t);if(e.origin===qr&&e.installCommand){let r=e.type??"skill",n=await oo(e.installCommand,t.scope);return n.exitCode===0?(await ba(e.name,n.duration_ms,r,t.scope),{success:true,message:`Installed ${e.name}`}):(await Eu(e.name,new Error(n.stderr||"Install failed"),r),{success:false,message:n.stderr||`Install failed with exit code ${n.exitCode}`})}if(mn(e.name)){let r=e.type??"skill",n=gn(e.name,t.scope);Mt.debug(`[${e.name}] Attempting install: ${n}`);let o=await Pe(n);if(o.exitCode===0)return await ba(e.name,o.duration_ms,r,t.scope),{success:true};Mt.debug(`[${e.name}] First attempt failed, adding marketplace`),await Ps(e.name,t.marketplaceSource,()=>{});let s=await Pe(n);return s.exitCode===0?(await ba(e.name,s.duration_ms,r,t.scope),{success:true}):(await Eu(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 $e(e.name,{...t,type:e.type});return {success:!0,message:`Installed ${e.name}@${r.version}`}}catch(r){return Mt.debug(`[${e.name}] Plugin install failed: ${String(r)}`),{success:false,message:r instanceof Error?r.message:String(r)}}},async uninstall(e,t){await ro(e,t);},getInstallPath(e,t){return ""}};function Cu(e){return {async install(t,r){if(t.origin===qr&&!t.installCommand&&!mn(t.name))return Tu(t,r);if(!t.installCommand)try{let o=await $e(t.name,{...r,type:e});return {success:!0,message:`Installed ${t.name}@${o.version}`}}catch(o){return Mt.debug(`[${t.name}] ${e} install failed: ${String(o)}`),{success:false,message:o instanceof Error?o.message:String(o)}}Mt.debug(`[${t.name}] Executing install command: ${t.installCommand}`);let n=await oo(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=et(),o=`${t}@${Y}`;if(n.plugins[o]){await ro(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 Ty(e){for(let t of [join(e,".claude","agents"),join(e,"agents")]){if(!Se__default.existsSync(t))continue;let r=Se__default.readdirSync(t).filter(n=>n.endsWith(".md")&&Se__default.lstatSync(join(t,n)).isFile());if(r.length>0)return r.map(n=>join(t,n))}return []}function va(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,va(r)]))}function ku(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(va(a))));r[n]=[...s,...o.filter(a=>!i.has(JSON.stringify(va(a))))];}else o!==null&&typeof o=="object"&&!Array.isArray(o)&&s!==null&&typeof s=="object"&&!Array.isArray(s)?r[n]=ku(s,o):r[n]=o;}return r}async function Au(e,t,r,n){let o=await ma(),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],Qe(o);}var ky={async install(e,t){let r=t.scope??"user",n=e.catalogId?de.getAdapter(e.catalogId):void 0,o=Sn(e,n?.source);if(!o)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let s=null;try{ht(e.name),s=await At(o.cloneUrl,o.ref);let i=o.subPath==="."?s:join(s,o.subPath),a=Ty(i);if(a.length===0)return {success:!1,message:`No agent files found in "${e.name}"`};let l=Mo(r);Se__default.mkdirSync(l,{recursive:!0});let c=tt(e.name);if(a.length===1)Se__default.copyFileSync(a[0],join(l,`${c}.md`));else for(let d of a){let m=tt(basename(d,".md"));Se__default.copyFileSync(d,join(l,`${c}--${m}.md`));}let u=a.length===1?join(l,`${c}.md`):l;return await Au(e.name,r,u,"agent"),{success:!0,message:`Installed agent(s) from ${e.name}`}}catch(i){return Mt.debug(`[${e.name}] Agent install failed: ${String(i)}`),{success:false,message:i instanceof Error?i.message:String(i)}}finally{s&&await $t(s).catch(()=>{});}},async uninstall(e,t){let r=Mo(t),n=tt(e);if(Se__default.existsSync(r))for(let a of Se__default.readdirSync(r).filter(l=>l===`${n}.md`||l.startsWith(`${n}--`)&&l.endsWith(".md")))Se__default.rmSync(join(r,a),{force:true});let o=`${e}@claude-code`,s=et(),i=(s.plugins[o]??[]).filter(a=>a.scope!==t);if(i.length===0){let{[o]:a,...l}=s.plugins;Qe({...s,plugins:l});}else Qe({...s,plugins:{...s.plugins,[o]:i}});},getInstallPath(e,t){return join(Mo(t),`${tt(e)}.md`)}},Ay={async install(e,t){let r=t.scope??"user",n=e.catalogId?de.getAdapter(e.catalogId):void 0,o=Sn(e,n?.source);if(!o)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let s=null;try{ht(e.name),s=await At(o.cloneUrl,o.ref);let i=o.subPath==="."?s:join(s,o.subPath),a=join(i,"settings.json");if(!Se__default.existsSync(a))return {success:!1,message:`No settings.json found in "${e.name}"`};let l;try{l=JSON.parse(Se__default.readFileSync(a,"utf-8"));}catch{return {success:!1,message:`settings.json in "${e.name}" contains invalid JSON`}}let c=l.hooks;if(!c||typeof c!="object"||Array.isArray(c))return {success:!1,message:`No hooks found in "${e.name}" settings.json`};let u=Gn();if(u.status==="malformed")return {success:!1,message:"settings.json at destination contains invalid JSON \u2014 refusing to overwrite"};let d=u.status==="ok"?u.settings:{},m=d.hooks!==null&&typeof d.hooks=="object"&&!Array.isArray(d.hooks)?d.hooks:{},p=ku(m,c);return Yo({...d,hooks:p}),await Au(e.name,r,"hooks","hook"),{success:!0,message:`Installed hooks from ${e.name}`}}catch(i){return Mt.debug(`[${e.name}] Hook install failed: ${String(i)}`),{success:false,message:i instanceof Error?i.message:String(i)}}finally{s&&await $t(s).catch(()=>{});}},async uninstall(e,t){throw new Error("Hook uninstall not supported \u2014 remove entries manually from settings.json")},getInstallPath(e,t){return ""}},Es=class{id="claude-code";name="Claude Code";async isAvailable(){return Vr("claude",["--version"])}getSupportedScopes(){return ["user","project","local"]}installers={bundle:Cy,skill:Cu("skill"),mcp:Cu("mcp"),agent:ky,hook:Ay}};function Cs(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 My=new Set(["gh"]),Ly=Cs(My,"use: gh copilot mcp remove <name>"),Ts=class{id="copilot";name="GitHub Copilot";async isAvailable(){return await Vr("gh",["--version"])?Vr("gh",["copilot","--version"]):false}getSupportedScopes(){return ["user"]}installers={mcp:Ly}};var Ry=new Set(["opencode"]),_y=Cs(Ry,"use: opencode config remove mcp <name>");function Dy(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(`
|
|
112
|
+
`)}function $u(){return {async install(e,t){try{ht(e.name);}catch{return {success:false,message:"Invalid plugin name."}}let r=e.catalogId?de.getAdapter(e.catalogId):void 0,n=Sn(e,r?.source);if(!n)return {success:false,message:`Cannot install "${e.name}": unsupported source format.`};let o=null;try{o=await At(n.cloneUrl,n.ref);let s=n.subPath==="."?o:join(o,n.subPath),i=$o(t.scope??"user"),a=join(s,".opencode","plugins");if(Se__default.existsSync(a)){let l=Se__default.readdirSync(a).filter(c=>c.endsWith(".js")||c.endsWith(".mjs"));if(l.length===0)return {success:!1,message:"No JS plugin file found in .opencode/plugins/"};Se__default.mkdirSync(i,{recursive:!0}),Se__default.copyFileSync(join(a,l[0]),join(i,`${e.name}.js`));}else {let l=join(i,`${e.name}-content`);Se__default.existsSync(l)&&Se__default.rmSync(l,{recursive:!0,force:!0}),Se__default.mkdirSync(l,{recursive:!0}),Se__default.cpSync(s,l,{recursive:!0}),Se__default.mkdirSync(i,{recursive:!0}),Se__default.writeFileSync(join(i,`${e.name}.js`),Dy(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 $t(o).catch(()=>{});}},async uninstall(e,t){ht(e);let r=$o(t),n=join(r,`${e}.js`),o=join(r,`${e}-content`);Se__default.existsSync(n)&&Se__default.rmSync(n,{force:true}),Se__default.existsSync(o)&&Se__default.rmSync(o,{recursive:true,force:true});},getInstallPath(e,t){return join($o(t),`${e}.js`)}}}var ks=class{id="opencode";name="OpenCode";async isAvailable(){return Vr("opencode",["--version"])}getSupportedScopes(){return ["user","project"]}installers={mcp:_y,skill:$u(),bundle:$u()}};var Lt=new hs;Lt.register(new Es);cr()&&(Lt.register(new Ts),Lt.register(new ks));function Mu({itemName:e,itemType:t,onInstall:r,onClose:n}){let[o,s]=useState(false),[i,a]=useState(false),[l,c]=useState([]),[u,d]=useState(void 0);useEffect(()=>{Lt.getAvailableProviders(t??"bundle").then(c).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(v=>v.name===g);w?(d(w.id),a(false),s(true)):a(false);},[l]),f=useCallback(g=>{let w=Kc(g);w?r(w,u):s(false);},[r,u]),h=useCallback(()=>{s(false);},[]);if(i){let g=[...l.map(w=>w.name),"Cancel"];return jsx(Ye,{itemName:`${e} \u2014 Choose provider`,actions:g,onAction:p,onClose:()=>a(false)},"provider")}return o?jsx(Ye,{itemName:`${e} \u2014 Choose scope`,actions:Fc,descriptions:jc,onAction:f,onClose:h},"scope"):jsx(Ye,{itemName:e,actions:["Install","Cancel"],onAction:m,onClose:n},"main")}function Ru({itemName:e,bundle:t,onInstall:r,onConfirm:n,onClose:o}){let s=S(f=>f.focus),[i,a]=useState(0),c=(t?.artifact.artifacts??[]).filter(f=>f.available),u=t!==void 0&&c.length===0,d=useMemo(()=>u?["Cancel"]:["Confirm Install","Cancel"],[u]);useEffect(()=>{a(0);},[t]);let m=useCallback((f,h)=>{h.upArrow?a(g=>Math.max(0,g-1)):h.downArrow?a(g=>Math.min(d.length-1,g+1)):h.return?d[i]==="Confirm Install"?n():o():h.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:[c.length," artifact",c.length!==1?"s":""," available"]})}),jsx(Box,{flexDirection:"column",marginTop:1,marginBottom:1,children:c.map(f=>{let h=y(f.name??f.flowId),g=f.type??"unknown";return jsxs(Box,{gap:1,children:[jsx(Text,{color:"green",children:"\u2713"}),jsx(Text,{children:h}),jsxs(Text,{dimColor:true,children:["(",g,")"]})]},f.flowId)})}),jsx(Box,{flexDirection:"column",children:d.map((f,h)=>jsx(Box,{children:jsxs(Text,{bold:h===i,color:h===i?"cyan":void 0,children:[h===i?"\u203A ":" ",f]})},f))})]}):jsx(Ye,{itemName:e,actions:["Install Bundle","Cancel"],onAction:p,onClose:o})}function Ms({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")}}function Ou({itemName:e,itemScope:t,itemStatus:r,updateAvailable:n,catalogVersion:o,onUninstall:s,onToggleStatus:i,onUpdate:a,onClose:l}){let{isConfirming:c,requestConfirm:u}=Ms({activeFocus:"actionMenu",onConfirm:()=>s(t)});if(c)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(Ye,{itemName:e,actions:n?["Uninstall",d,p,"Cancel"]:["Uninstall",d,"Cancel"],onAction:g=>{g==="Uninstall"?u():g===d?i(t):g.startsWith("Update")?a?.():l();},onClose:l})}function Bu({itemName:e,itemScope:t,onUninstall:r,onClose:n}){let{isConfirming:o,requestConfirm:s}=Ms({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(Ye,{itemName:e,actions:["Uninstall","Cancel"],onAction:l=>{l==="Uninstall"?s():n();},onClose:n})}var bn=x("bundle:installer"),Fu=/already exists/i;async function Vy(e){if(!e.installCommand)throw new Error("Missing install command");let t=e.installCommand;if(wu(t)){let r=await Su(t);if(r.exitCode!==0){let n=r.stderr?.trim()||r.stdout?.trim()||`exit code ${r.exitCode}`;if(Fu.test(n))return;throw new Error(n)}}else {let r=await oo(t);if(r.exitCode!==0){let n=r.stderr?.trim()||r.stdout?.trim()||`exit code ${r.exitCode}`;if(Fu.test(n))return;throw new Error(n)}}}async function Hy(e,t){try{await b(I.CLI_BUNDLE_INSTALL_STARTED,{bundle_slug:e,artifact_count:t});}catch(r){bn.warn(`Failed to emit bundle install started event: ${String(r)}`);}}async function Jy(e,t,r){try{await b(I.CLI_BUNDLE_INSTALL_PLUGIN_SUCCESS,{bundle_slug:e,artifact_name:t,artifact_type:r});}catch(n){bn.warn(`Failed to emit bundle install plugin success event: ${String(n)}`);}}async function ju(e,t,r,n){try{await b(I.CLI_BUNDLE_INSTALL_PLUGIN_FAILED,{bundle_slug:e,artifact_name:t,artifact_type:r,error_message:n});}catch(o){bn.warn(`Failed to emit bundle install plugin failed event: ${String(o)}`);}}async function Gy(e,t,r,n,o){try{await b(I.CLI_BUNDLE_INSTALL_COMPLETED,{bundle_slug:e,installed_count:t,failed_count:r,unavailable_count:n,duration_ms:o});}catch(s){bn.warn(`Failed to emit bundle install completed event: ${String(s)}`);}}async function _s(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 Hy(i,o.length);let l=[],c=0,u=o.length;for(let[p,f]of o.entries()){let h=f.name??f.flowId,g=f.type??"unknown";if(!f.type){bn.warn(`Artifact "${h}" has no type \u2014 treated as failed`),l.push({name:h,type:g,reason:"unknown artifact type"}),await ju(i,h,g,"unknown artifact type"),r?.({index:p+1,total:u,artifact:f,success:false,error:"unknown artifact type"});continue}try{await Vy(f),c++,await Jy(i,h,g),r?.({index:p+1,total:u,artifact:f,success:!0});}catch(w){let v=w instanceof Error?w.message:String(w);bn.error(`Failed to install artifact "${h}": ${v}`),l.push({name:h,type:g,reason:v}),await ju(i,h,g,v),r?.({index:p+1,total:u,artifact:f,success:false,error:v});}}let d=Date.now()-a,m=l.length;return await Gy(i,c,m,s,d),{bundleTitle:e.title,total:n.length,installed:c,skipped:s,failed:m,failures:l}}function Ju({bundle:e,onComplete:t}){let[r,n]=useState(null),[o,s]=useState(null),i=useRef(false);return useEffect(()=>{i.current||(i.current=true,_s(e,{onProgress:n}).then(s).catch(a=>{let l=a instanceof Error?a.message:"Installation failed",c=e.artifact.artifacts,u=c.filter(d=>d.available);s({bundleTitle:e.title,total:c.length,installed:0,skipped:c.length-u.length,failed:u.length,failures:u.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(Hu,{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(Hu,{type:"dots"})}),jsx(Text,{color:"cyan",children:"Preparing..."})]})]})}var pe=create(e=>({installedItems:[],setInstalledItems:t=>e({installedItems:t}),loadFromDisk:()=>e({installedItems:ne()})}));function Gu({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,c=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}),c&&s.stored&&jsx(Text,{color:"yellow",children:" \u2605"})]}),s.stored?.lastUpdated&&jsx(Box,{marginLeft:2,children:jsxs(Text,{dimColor:true,children:["Updated ",nr(s.stored.lastUpdated)]})})]},s.adapter.id)})]})}function zu({entry:e,detailData:t,installedCount:r,focusPanel:n,actionIndex:o,onBrowse:s,onUpdate:i,onToggleAutoUpdate:a,onRemove:l}){let{adapter:c,stored:u}=e,d=c.removable!==false,m=u?.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:c.name}),jsx(Text,{dimColor:true,children:c.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`:"",u?.lastUpdated?` \xB7 Updated ${nr(u.lastUpdated)}`:""]})}),u&&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((h,g)=>{let w=g===o;return jsxs(Box,{children:[jsx(Text,{color:w?"cyan":void 0,children:w?"\u203A ":" "}),jsx(Text,{bold:w,color:h.danger?"yellow":void 0,dimColor:!w,children:h.label})]},h.label)})})]}):jsxs(Box,{flexDirection:"column",paddingLeft:1,children:[jsx(Text,{bold:true,children:c.name}),jsx(Text,{dimColor:true,children:c.source}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"Enter or Tab to see details"})})]})}function Wu(e){return e.adapter.removable!==false?4:2}function Xu({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((c,u)=>{if(u.escape){n();return}if(u.upArrow){l(d=>Math.max(0,d-1));return}if(u.downArrow){l(d=>Math.min(i.length-1,d+1));return}u.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((c,u)=>jsxs(Box,{children:[jsx(Text,{color:u===a?"cyan":void 0,children:u===a?"\u203A ":" "}),jsx(Text,{bold:u===a,color:c.danger?"yellow":void 0,dimColor:u!==a,children:c.label})]},c.label))}),jsx(Box,{marginTop:1,children:jsx(Text,{dimColor:true,children:"\u2191\u2193 navigate \xB7 Enter: confirm \xB7 Esc: back"})})]})}function Yu({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 Zu({entry:e,items:t,installedKeys:r,onBack:n}){let o=e.adapter.id??"default",s=t.filter(E=>r.has(`${E.name}@${o}`)),i=t.filter(E=>!r.has(`${E.name}@${o}`)),a=[...s,...i],[l,c]=useState(0),[u,d]=useState(null);if(useInput((E,M)=>{if(M.escape){n();return}if(M.return){d(a[l]??null);return}if(M.upArrow){c(K=>Math.max(0,K-1));return}M.downArrow&&c(K=>Math.min(a.length-1,K+1));},{isActive:u===null}),u!==null)return jsx(Xu,{item:u,adapterName:e.adapter.name,isInstalled:r.has(`${u.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(Ge/2)),p=Math.min(a.length,m+Ge);p===a.length&&(m=Math.max(0,p-Ge));let f=a.slice(m,p),h=m,g=a.length-p,w=s.length>0&&m<s.length,v=p>s.length,O=f.filter(E=>r.has(`${E.name}@${o}`)),_=f.filter(E=>!r.has(`${E.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:h>0?`\u2191 ${h} 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"]}),O.map(E=>jsx(Yu,{item:E,isSelected:a.indexOf(E)===l,isInstalled:true},E.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"]}),_.map(E=>jsx(Yu,{item:E,isSelected:a.indexOf(E)===l,isInstalled:false},E.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"})})]})}na();var Qy=/^https?:\/\/.+/;function ew(e){return e!==null&&typeof e=="object"&&"response"in e&&e.response?.status===404}function tw(e){return e instanceof Error&&e.code==="GITHUB_AUTH_REQUIRED"}function rd(e){let t=S(g=>g.showNotification),r=S(g=>g.incrementCatalogVersion),[n,o]=useState("idle"),[s,i]=useState(""),[a,l]=useState(""),[c,u]=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(""),u(null),o("add-name");},[]),f=useCallback(()=>{o("idle");},[]),h=useCallback(async()=>{let g=m.current,w=d.current;if(!Qy.test(g)){u("URL must start with http:// or https://");return}u(null),o("adding");let v=randomUUID(),O=new hn(v,w,g);try{await O.fetchItems(),await Vt.add({id:v,name:w,source:g}),de.register(new hn(v,w,g)),r(),e(),t(`Catalog "${w}" added`,"success"),i(""),l(""),d.current="",m.current="",o("idle");}catch(_){let E=ew(_)?"No marketplace.json found in this repository (checked main and master branches). Ensure the repo has a marketplace.json at its root.":tw(_)?_.message:_ instanceof Error?`Could not reach catalog URL: ${_.message}`:"Failed to validate catalog URL";t(E,"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){h();return}if(w.backspace||w.delete){m.current=m.current.slice(0,-1),l(m.current),u(null);return}g&&!w.ctrl&&!w.meta&&(m.current=m.current+g,l(m.current),u(null));},{isActive:n==="add-url"}),{phase:n,inputName:s,inputUrl:a,urlError:c,setInputName:i,setInputUrl:l,startAdd:p,cancelAdd:f}}function nd(e){let t=S(o=>o.showNotification),r=S(o=>o.incrementCatalogVersion);return {handleRemove:useCallback(async o=>{try{await Vt.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 sd(){let e=S($=>$.focus),t=S($=>$.setFocus),r=S($=>$.showNotification),n=pe($=>$.installedItems),[o,s]=useState(()=>de.listAdapters().map($=>({adapter:$,stored:null}))),[i,a]=useState(0),[l,c]=useState("list"),[u,d]=useState(0),[m,p]=useState(null),[f,h]=useState("main"),g=useRef(o);useEffect(()=>{g.current=o;},[o]),useEffect(()=>{f==="browse"&&!o[i-1]&&h("main");},[f,o,i]);let w=useCallback(()=>{(async()=>{let $=de.listAdapters(),U=await Vt.read(),z=new Map(U.map(A=>[A.id,A]));s($.map(A=>({adapter:A,stored:z.get(A.id)??null})));})();},[]);useEffect(()=>{t("marketplaces"),w();},[t,w]),useEffect(()=>{if(i===0){p(null);return}let $=g.current[i-1];if(!$)return;let U=false;return p({items:[],loading:true,error:null}),$.adapter.fetchItems().then(z=>{U||p({items:z,loading:false,error:null});}).catch(z=>{U||p({items:[],loading:false,error:z instanceof Error?z.message:"Failed to load catalog"});}),()=>{U=true;}},[i]);let v=rd(w),O=useCallback(()=>{w(),a(0),c("list"),p(null),h("main");},[w]),{handleRemove:_}=nd(O),E=useCallback(async $=>{h("removing"),await _($);},[_]),M=useCallback(async $=>{try{let U=await $.adapter.fetchItems();if(p({items:U,loading:!1,error:null}),$.stored){let z=new Date().toISOString();await Vt.updateField($.stored.id,{lastUpdated:z}),w();}r("Marketplace updated","success");}catch(U){r(U instanceof Error?U.message:"Update failed","error");}},[w,r]),K=useCallback(async $=>{if(!$.stored)return;let U=$.stored.autoUpdate!==false;await Vt.updateField($.stored.id,{autoUpdate:!U}),w();},[w]),H=useCallback(()=>h("browse"),[]),ue=useCallback($=>{let U=o[i-1];if(!U)return;let z=U.adapter.removable!==false;[H,()=>{M(U);},...z?[()=>{K(U);},()=>{E(U.adapter.id);}]:[]][$]?.();},[o,i,H,M,K,E]),T=useCallback(()=>h("main"),[]),N=useCallback(()=>{let $=o[i-1];$&&M($);},[o,i,M]),G=useCallback(()=>{let $=o[i-1];$&&K($);},[o,i,K]),B=useCallback(()=>{let $=o[i-1];$&&E($.adapter.id);},[o,i,E]);if(useInput(($,U)=>{if(U.upArrow){a(z=>Math.max(0,z-1));return}if(U.downArrow){a(z=>Math.min(o.length,z+1));return}(U.return||U.tab)&&(i===0?v.startAdd():(c("detail"),d(0)));},{isActive:f==="main"&&v.phase==="idle"&&l==="list"&&e==="marketplaces"}),useInput(($,U)=>{if(U.escape||U.tab){c("list");return}if(U.upArrow){d(z=>Math.max(0,z-1));return}if(U.downArrow){let z=o[i-1],A=z?Wu(z)-1:0;d(R=>Math.min(R+1,A));return}U.return&&ue(u);},{isActive:f==="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(f==="removing")return jsx(Box,{flexDirection:"column",paddingX:2,paddingY:1,children:jsx(Text,{children:"Removing catalog..."})});if(f==="browse"){let $=o[i-1];if(!$)return jsx(Box,{});let U=$.adapter.id??"default",z=new Set(n.filter(A=>A.marketplace===$.adapter.name).map(A=>`${A.name}@${U}`));return jsx(Zu,{entry:$,items:m?.items??[],installedKeys:z,onBack:T})}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 be=o[i-1]??null,Ut=be?n.filter($=>$.marketplace===be.adapter.name).length:0;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Box,{flexDirection:"column",width:30,marginRight:1,children:jsx(Gu,{entries:o,selectedIndex:i,focusPanel:l})}),jsx(Box,{flexDirection:"column",flexGrow:1,children:l==="detail"&&be?jsx(zu,{entry:be,detailData:m,installedCount:Ut,focusPanel:l,actionIndex:u,onBrowse:H,onUpdate:N,onToggleAutoUpdate:G,onRemove:B}):jsx(Box,{paddingLeft:1,children:jsx(Text,{dimColor:true,children:be?"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 id(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=Q.findIndex(i=>i.id===r.activeTab),s=Q[(o-1+Q.length)%Q.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}if(t.rightArrow){let o=Q.findIndex(i=>i.id===r.activeTab),s=Q[(o+1)%Q.length];return [{type:"setTab",tab:s.id},{type:"setSelectedIndex",index:0},{type:"setFocus",focus:s.focus}]}if(t.tab){let o=Q.findIndex(i=>i.id===r.activeTab),s=Q[(o+1)%Q.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 ad(e,t){return t.escape?[{type:"setActionMenuOpen",open:false},{type:"setFocus",focus:"list"}]:[]}function ld(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 iw=new Set(Q.filter(e=>e.focus!=="list").map(e=>e.focus));function go(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:c}=Fe.getState();i(a.slice(0,c)+s.char+a.slice(c)),l(c+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 cd({listLength:e}){let t=S(h=>h.focus),r=S(h=>h.selectedIndex),n=S(h=>h.actionMenuOpen),o=S(h=>h.setFocus),s=S(h=>h.setActionMenuOpen),i=Fe(h=>h.query),a=Fe(h=>h.setQuery),l=Fe(h=>h.resetQuery),c=useRef(e);useEffect(()=>{c.current=e;},[e]),useEffect(()=>{if(t==="search"){let{query:h,setCursorPosition:g}=Fe.getState();g(h.length);}},[t]);let[u,d]=useState("");useEffect(()=>{let h=setTimeout(()=>d(i),300);return ()=>clearTimeout(h)},[i]),useInput((h,g)=>{let{activeTab:w,selectedIndex:v,actionMenuOpen:O}=S.getState();go(Hi(h,g,{activeTab:w}));},{isActive:t==="tabs"}),useInput((h,g)=>{if(!g.leftArrow&&!g.rightArrow)return;let{activeTab:w,selectedIndex:v,actionMenuOpen:O}=S.getState();go(Hi("",g,{activeTab:w}));},{isActive:iw.has(t)}),useInput((h,g)=>{let{activeTab:w,selectedIndex:v,actionMenuOpen:O}=S.getState();go(id(h,g,{activeTab:w,selectedIndex:v},c.current));},{isActive:t==="list"}),useInput((h,g)=>{go(ad(h,g));},{isActive:t==="actionMenu"}),useInput((h,g)=>{let w=ld(h,g,Fe.getState().query),v=w.queryUpdate;if(go(w.actions),v==="reset")l(),d("");else if(v!==null){let{query:O,cursorPosition:_,setCursorPosition:E}=Fe.getState();if("backspace"in v)_>0&&(a(O.slice(0,_-1)+O.slice(_)),E(_-1));else if("append"in v)a(O.slice(0,_)+v.append+O.slice(_)),E(_+v.append.length);else if("cursorMove"in v){let M=_+v.cursorMove;M>=0&&M<=O.length&&E(M);}}},{isActive:t==="search"});let m=useCallback(()=>{s(false),o("list");},[s,o]),p=useCallback(h=>{let{setSelectedIndex:g,selectedIndex:w}=S.getState();h===0?g(0):w>=h&&g(h-1);},[]),f=useCallback(h=>{if(!u)return c.current=h.length,h;let g=u.toLowerCase(),w=h.filter(v=>v.name.toLowerCase().includes(g)||v.description?.toLowerCase().includes(g));return c.current=w.length,w},[u]);return {actionMenuOpen:n,closeMenu:m,selectedIndex:r,clampIndex:p,filteredItems:f}}function dd(){let e=S(a=>a.notification),t=S(a=>a.showNotification),r=S(a=>a.clearNotification),n=Xe(a=>a.justAuthenticated),o=Xe(a=>a.credentials),s=Xe(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 Re(e,t,r=false){return r?true:!ka.valid(e)||!ka.valid(t)?false:ka.gt(t,e)}var Gt=x("updater");async function aw(e,t,r,n,o,s){try{await b(I.CLI_TOOL_UPDATED,{tool_id:e,tool_type:s,source:o,from_version:t,to_version:r,duration_ms:n,interface:X().interfaceType});}catch(i){Gt.warn(`Failed to send update metrics: ${String(i)}`);}}function lw(e){let t=et(),r=`${e}@${Y}`,n=t.plugins[r];return !n||n.length===0?null:{pluginKey:r,entry:n[0]}}async function Ns(e,t={}){let r=Date.now(),n=null;try{Gt.debug(`[${e}] Acquiring lock...`),n=await hr();let o=lw(e);if(!o)throw Gt.error(`[${e}] Plugin is not installed`),new Error(`Plugin "${e}" is not installed`);let{entry:s}=o,i=s.version,a=s.installPath;Gt.debug(`[${e}] Fetching manifest...`);let c=(await yn(e)).version;if(!i||!Re(i,c,t.force))throw Gt.debug(`[${e}] Already up to date (v${i??"n/a"})`),new fr(e,i??"unknown");Gt.info(`[${e}] Updating v${i} \u2192 v${c}...`),await n(),n=null;try{let u=await $e(e,{force:!0,skipMetrics:!0}),d=Date.now()-r;return await aw(u.name,i,u.version,d,s.origin??"internal",s.type??"skill"),Gt.debug(`[${e}] Updated successfully in ${d}ms`),{name:u.name,previousVersion:i,newVersion:u.version,path:u.path,duration_ms:d}}catch(u){Gt.warn(`[${e}] Install failed, rolling back to v${i}...`),n=await hr();let d=et(),m=`${e}@${Y}`;throw d.plugins[m]&&(d.plugins[m][0].version=i,d.plugins[m][0].installPath=a,Qe(d),Gt.info(`[${e}] Rollback completed, restored to v${i}`)),u}}finally{n&&await n();}}var Bs=x("dispatcher");async function cw(e,t,r,n,o){let s=fn(e);return Bs.debug(`[${e}] Install failed (exit code), attempting marketplace add`),o?.onError?.(r),n?o?.onStatus?.(`Adding marketplace for ${s}...`):o?.onPause?.(),await Ps(e,n,()=>{}),o?.onResume?.(`Retrying install for ${s}...`),Bs.debug(`[${e}] Retrying install after marketplace add`),Pe(t)}async function pd(e,t,r,n){let o=gn(e,n),s=fn(e);r?.onStatus?.(`Installing ${s}...`),Bs.debug(`[${e}] Attempting install: ${o}`);let i=await Pe(o);if(i.exitCode===0)return i;Bs.debug(`[${e}] Install failed (exit ${i.exitCode}), attempting marketplace add`);let a=i.stderr||`Install failed with exit code ${i.exitCode}`;return cw(e,o,a,t,r)}async function md(e,t,r){let n=e.type??"bundle",o=await Lt.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 fd(){let e=pe(i=>i.installedItems),t=pe(i=>i.loadFromDisk),r=useCallback(async(i,a)=>{let l=await md(i,a);if(!l.success)throw new Error(l.message||"Installation failed");t();},[t]),n=useCallback(async(i,a)=>{let l=ne().find(p=>p.name===i),c=l?.providerId??"claude-code",u=Lt.getAdapter(c);if(!u)throw new Error(`Provider "${c}" not found`);let d=l?.type??"bundle",m=u.installers[d];if(!m)throw new Error(`Provider "${c}" does not support type "${d}"`);await m.uninstall(i,a??"user"),t();},[t]),o=useCallback(async(i,a)=>{let c=e.find(u=>u.name===i)?.status==="enabled"?"disabled":"enabled";await no(i,c,a),t();},[e,t]),s=useCallback(async i=>{await Ns(i),t();},[t]);return {install:r,uninstall:n,toggle:o,update:s}}var js=x("mcp");function ho(e,t){e.silent?We({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 hd(e,t){e.silent?Ne({status:"success",mcp:t.name,command:t.command,duration_ms:t.durationMs}):(ie(`MCP "${t.name}" ${t.actionPastTense} successfully`),e.verbose&&t.stdout&&C(t.stdout));}function uw(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 Aa(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 yd(e,t,r){if(!await we())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}js.debug(`[${e}] Starting MCP add with args: ${t.join(" ")}`);let n=uw(e,t,r.transport,r.scope);if(!r.force){let s=y(e),i=y(n);if(!await kt(`Install external MCP "${s}"?
|
|
113
113
|
This will run: ${i}
|
|
114
|
-
[y/N] `))return
|
|
114
|
+
[y/N] `))return js.debug(`[${e}] Installation cancelled by user`),C("Operation cancelled."),0}let o=r.silent?void 0:rl({text:`Adding MCP "${y(e)}"...`}).start();try{let s=await Pe(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&&C(`stdout: ${s.stdout}`),1):(hd(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:te(s)}),1}}async function wd(e,t){if(!await we())return 1;js.debug(`[${e}] Starting MCP remove`);let r=Aa(e,t.scope);if(!t.force){let o=y(e),s=y(r);if(!await kt(`Remove MCP "${o}"?
|
|
115
115
|
This will run: ${s}
|
|
116
|
-
[y/N] `))return Fs.debug(`[${e}] Removal cancelled by user`),C("Operation cancelled."),0}let n=t.silent?void 0:tl({text:`Removing MCP "${y(e)}"...`}).start();try{let o=await Pe(r);return n?.stop(),o.exitCode!==0?(go(t,{name:e,action:"remove",message:o.stderr||"Command failed",exitCode:o.exitCode}),!t.silent&&t.verbose&&o.stdout&&C(`stdout: ${o.stdout}`),1):(fd(t,{name:e,actionPastTense:"removed",command:r,durationMs:o.duration_ms,stdout:o.stdout}),0)}catch(o){return n?.stop(),go(t,{name:e,action:"remove",message:te(o)}),1}}function yd({selectedItem:e,selectedCatalogItem:t,items:r,closeMenu:n,clampIndex:o,notify:s}){let i=x("pluginHandlers"),a=useRef(0),l=S(E=>E.setLoading),c=S(E=>E.setDownloadProgress),{install:u,uninstall:d,toggle:m,update:p}=pd(),f=async(E,M,K)=>{l(true,E),n();try{await M(),o(r.length),s(K,"success");}catch(H){let ue=H instanceof Error?H.message:"Something went wrong";i.error(`[withLoading] ${E} failed: ${ue}`),s(ue,"error");}finally{l(false);}};return {handleInstall:(E,M)=>{e&&t&&(a.current=0,f(`Installing ${e.name}...`,()=>u(t,{scope:E,...M!==void 0?{providerId:M}:{},onDownloadProgress:(K,H)=>{let ue=Date.now();(ue-a.current>100||K>=H)&&(a.current=ue,c(K,H));}}),"\u2713 Installed successfully"));},handleUninstall:E=>{e&&f(`Uninstalling ${e.name}...`,()=>d(e.name,E),"\u2713 Uninstalled");},handleToggleStatus:E=>{if(!e)return;let M=e.status==="enabled";f(M?`Disabling ${e.name}...`:`Enabling ${e.name}...`,()=>m(e.name,E),M?"\u2713 Disabled":"\u2713 Enabled");},handleUpdate:()=>{if(!e)return;let E=t?` to v${t.version}`:"";(async()=>{l(true,`Updating ${e.name}${E}...`),n();try{await p(e.name),o(r.length),s(`\u2713 Updated ${e.name}${E}`,"success");}catch(K){if(K instanceof mr)s(K.message,"info");else {let H=K instanceof Error?K.message:"Something went wrong";i.error(`[handleUpdate] ${e.name} failed: ${H}`),s(H,"error");}}finally{l(false);}})();},handleBatchUpdate:E=>{if(E.length===0)return;let M=E.length;(async()=>{l(true,`Updating ${M} plugin${M>1?"s":""}...`),n();try{let H=[];for(let U of E)H.push(await p(U.name).then(()=>({status:"fulfilled",value:void 0}),G=>({status:"rejected",reason:G})));let ue=H.filter(U=>U.status==="fulfilled").length,T=H.map((U,G)=>U.status==="rejected"?E[G].name:null).filter(U=>U!==null);o(r.length),T.length===0?s(`\u2713 Updated ${ue}/${M} plugin${M>1?"s":""}`,"success"):(i.error(`[handleBatchUpdate] failed: ${T.join(", ")}`),s(`Updated ${ue}/${M}; failed: ${T.join(", ")}`,ue>0?"info":"error"));}finally{l(false);}})();},handleMcpConfigUninstall:E=>{e&&f(`Removing MCP ${e.name}...`,async()=>{let M=ka(e.name,E),K=await Pe(M);if(K.exitCode!==0)throw new Error(K.stderr||"MCP removal failed");pe.getState().loadFromDisk();},"\u2713 MCP removed");}}}var ho=x("api:bundle"),Cn=class extends Error{constructor(t){super(`Bundle '${t}' not found in your tenant. Verify the name with whoever shared the command.`),this.name="BundleNotFoundError";}},yo=class extends Error{constructor(){super("The server encountered an error while fetching the bundle. Please try again later."),this.name="BundleServerError";}},pw=/^[a-zA-Z0-9_-]{1,128}$/;async function Sd(e,t){if(e instanceof HTTPError){let r=e.response.status;throw ho.error(`HTTP error fetching bundle '${t}' [status=${r}]`),r===StatusCodes.NOT_FOUND?new Cn(t):r===StatusCodes.INTERNAL_SERVER_ERROR?new yo:new Error(`Server error (${r}) \u2014 please try again later.`)}throw ho.error(`Unexpected error fetching bundle '${t}': ${e instanceof Error?e.message:String(e)}`),e}async function xd(e){if(!pw.test(e))throw new Error("Invalid bundle identifier format.");let t=encodeURIComponent(e);ho.debug(`Fetching bundle by flowId "${e}"`);try{return await gt().get(`v1/use-cases/${t}`).json()}catch(r){return Sd(r,e)}}async function js(e){let t=encodeURIComponent(e);ho.debug(`Fetching bundle by name "${e}"`);let r;try{r=await gt().get(`v1/use-cases/by-name/${t}`).json(),ho.debug(`API returned ${r.length} result(s) for "${e}"`);}catch(n){return Sd(n,e)}if(r.length===0)throw new Cn(e);return r[0]}var mw=x("tui:bundle-flow");function Id({closeMenu:e,notify:t}){let r=S(a=>a.bundleInstallFlow);return {handleBundleInstallStart:(a,l)=>{let{setLoading:c,setBundleInstallFlow:u}=S.getState(),d=l?.trim();mw.debug(`Starting bundle install: itemName="${a}" flowId="${d??"none"}"`),c(true,"Loading bundle..."),(d?xd(d):js(a)).then(p=>{c(false),S.getState().actionMenuOpen&&u({phase:"detail",bundle:p});}).catch(p=>{c(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(),pe.getState().loadFromDisk(),t(`\u2713 Installed ${a.installed} of ${a.total} artifacts`,"success");}}}var wo=["local","project","user"],fw=new Set(["--transport","--scope","-s"]);function bd(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(fw.has(o))n+=2;else if(o.startsWith("-"))n+=1;else return o.replace(/^["']|["']$/g,"")}return null}function Hr(e,t){return t?`${e}::${t}`:e}function Aa(e){return e===Y?Rn:Xr}function vd(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??Rn,flowId:e.flowId}}function $a(e,t){let r=Aa(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 Pd(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:_n[r].label,pathHint:_n[r].pathHint,items:t.get(r)??[]}))}function Ed(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 Cd({catalog:e,installedItems:t,activeTab:r,catalogFilters:n,searchQuery:o}){let s=useMemo(()=>new Set(t.map(f=>Hr(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=>[Hr(g.name,g.author?.name),g])),h=new Map(e.map(g=>[g.name,g]));return t.map(g=>{let w=f.get(Hr(g.name,g.author?.name))??h.get(g.name),v=w?.version,O=!!v&&!!g.version&&Re(g.version,v);return {...g,updateAvailable:O,catalogItem:w}})},[t,e]),l=useMemo(()=>r==="discover"?e.filter(f=>{if(s.has(Hr(f.name,f.author?.name)))return false;if(f.type==="mcp"){let h=f.installCommand?bd(f.installCommand)?.toLowerCase():null;if(i.has(f.name.toLowerCase())||h&&i.has(h))return false}return true}).map(f=>vd(f)):r==="updates"?a.filter(f=>f.updateAvailable).map(f=>$a(f,f.catalogItem)):a.map(f=>$a(f,f.catalogItem)),[r,e,s,i,a]),c=useMemo(()=>l.filter(f=>{let h=f.type??"bundle";if(!n.types.has(h))return false;let g=f.origin??"internal";return n.origins.has(g)}),[l,n]),u=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 ${u} found for '${o}' \u2014 explore the Discover tab!`:`No ${u} installed \u2014 explore the Discover tab!`:r==="updates"?o?`No ${u} found for '${o}' \u2014 all up to date!`:"All up to date \u2014 nothing to update":o?`No ${u} found for '${o}'`:`No ${u} available in the catalog`,[r,o,u]),m=useMemo(()=>{let f=new Map(e.map(g=>[Hr(g.name,g.author?.name),g])),h=new Map(e.map(g=>[g.name,g]));return g=>g?f.get(Hr(g.name,g.authorName))??h.get(g.name)??null:null},[e]),p=useMemo(()=>a.filter(f=>f.updateAvailable).length,[a]);return {items:c,emptyMessage:d,getSelectedCatalogItem:m,outdatedCount:p}}function Ma(){let[e,t]=useState([]),[r,n]=useState(true),[o,s]=useState(null),[i,a]=useState(null),l=useRef(false),c=S(d=>d.catalogVersion),u=useCallback(async()=>{n(true),s(null),a(null);try{let{items:d,failures:m}=await Zc();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,b(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(()=>{u();},[u,c]),{catalog:e,isLoading:r,error:o,partialError:i,refetch:u}}function Td(){return {items:pe(t=>t.installedItems)}}var Sw=x("catalog");function Ad(){let e=S(W=>W.bundleInstallFlow),t=S(W=>W.activeTab),r=S(W=>W.notification),n=S(W=>W.loading),o=S(W=>W.loadingMessage),s=S(W=>W.downloadProgress),i=S(W=>W.downloadTotal),a=S(W=>W.catalogError),l=S(W=>W.setCatalogError),c=S(W=>W.catalogFilters),u=Fe(W=>W.query),{catalog:d,isLoading:m,error:p,refetch:f}=Ma(),{items:h}=Td(),g=pe(W=>W.loadFromDisk),{items:w,emptyMessage:v,getSelectedCatalogItem:O,outdatedCount:_}=Cd({catalog:d,installedItems:h,activeTab:t,catalogFilters:c,searchQuery:u}),{actionMenuOpen:E,closeMenu:M,selectedIndex:K,clampIndex:H,filteredItems:ue}=ad({listLength:w.length}),T=ue(w),U=useMemo(()=>t!=="installed"&&t!=="updates"?T:Ed(T),[t,T]),G=useMemo(()=>t==="installed"||t==="updates"?Pd(U):[],[t,U]),B=U[K]??null,be=useMemo(()=>O(B),[O,B]),{notify:Nt}=cd(),{handleInstall:$,handleUninstall:N,handleToggleStatus:z,handleUpdate:A,handleBatchUpdate:R,handleMcpConfigUninstall:V}=yd({selectedItem:B,selectedCatalogItem:be,items:w,closeMenu:M,clampIndex:H,notify:Nt}),{handleBundleInstallStart:at,handleBundleDetailConfirm:Wr,handleBundleDetailBack:Lm,handleBundleInstallComplete:Rm}=Id({closeMenu:M,notify:Nt}),_m=useCallback(()=>R(U),[R,U]);return useEffect(()=>{g();},[]),useEffect(()=>{H(U.length);},[U.length,H]),useEffect(()=>{p&&(Sw.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(mc,{outdatedCount:_}),t==="marketplaces"&&lr()?jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(nd,{})}):jsx(Ac,{filteredItems:U,groups:G,emptyMessage:v,onBatchUpdate:_m}),(n||m)&&jsxs(Fragment,{children:[jsx(us,{message:n?o:"Loading catalog..."}),n&&i>0&&s>0&&jsx(Box,{paddingLeft:2,children:jsx(ps,{received:s,total:i})})]}),a&&!m&&t==="discover"&&jsx(ms,{message:a,onRetry:()=>{l(null),f();},onBack:()=>l(null)}),r&&jsx($c,{message:r.message,type:r.type}),E&&B&&(t==="discover"?be?.type==="bundle"?e?.phase==="installing"?jsx(Vu,{bundle:e.bundle,onComplete:Rm}):jsx(Mu,{itemName:B.name,bundle:e?.phase==="detail"?e.bundle:void 0,onInstall:()=>at(B.name,B.flowId),onConfirm:Wr,onClose:e?.phase==="detail"?Lm:M}):jsx(Au,{itemName:B.name,itemType:be?.type,onInstall:$,onClose:M}):B.type==="mcp"?jsx(Nu,{itemName:B.name,itemScope:B.scope??"user",onUninstall:V,onClose:M}):jsx(_u,{itemName:B.name,itemScope:B.scope??"user",itemStatus:B.status??"enabled",updateAvailable:B.updateAvailable??false,catalogVersion:be?.version,onUninstall:N,onToggleStatus:W=>z(W),onUpdate:A,onClose:M})),jsx(cs,{})]})}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(pe.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"})}));var Pw=3;function Md(){let e=L(u=>u.setStarterKits),t=L(u=>u.setIsLoadingStarterKits),r=L(u=>u.setStarterKitsError),n=L(u=>u.setPluginStatus),o=L(u=>u.setPluginDownloadProgress),s=L(u=>u.setStep),i=L(u=>u.computeSummary),a=useCallback(async()=>{t(true),r(null);try{let u=await Is();e(u);}catch(u){r(u instanceof Error?u.message:String(u));}finally{t(false);}},[t,r,e]);useEffect(()=>{pe.getState().loadFromDisk(),a();},[a]);let l=useRef(0),c=useCallback(async()=>{let u=L.getState().plugins.filter(m=>m.selected&&m.status==="pending");for(let m of u){n(m.name,"installing"),l.current=0;let p="",f=false;for(let h=1;h<=Pw;h++)try{await $e(m.name,{onDownloadProgress:(g,w)=>{let v=Date.now();(v-l.current>100||g>=w)&&(l.current=v,o(m.name,g,w));}}),n(m.name,"success"),f=!0;break}catch(g){if(g instanceof je){n(m.name,"success"),f=true;break}p=g instanceof Error?g.message:"Unknown error";}f||(n(m.name,"failed",p),b(I.CLI_TOOL_INSTALL_FAILED,{tool_id:m.name,tool_type:"skill",source:"internal",error_code:"install_failed",error_message:p,interface:X().interfaceType}).catch(()=>{}));}let d=Lr();Mr("summary_review"),b(I.CLI_STEP_COMPLETED,{step:"tool_installation",duration_ms:d}).catch(()=>{}),pe.getState().loadFromDisk(),i(),s("summary");},[n,o,i,s]);return {loadStarterKits:a,installSelected:c}}var So={cursorDelta:0,confirm:false,back:false};function Ld(e,t){return t.upArrow?{...So,cursorDelta:-1}:t.downArrow?{...So,cursorDelta:1}:t.escape?{...So,back:true}:t.return?{...So,confirm:true}:So}var Ew={cursorDelta:0,select:false};function Rd(e,t){return t.upArrow?{cursorDelta:-1,select:false}:t.downArrow?{cursorDelta:1,select:false}:t.return?{cursorDelta:0,select:true}:Ew}var _d=$g.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 Ua=5;function Dd({onRetry:e}){let t=L(u=>u.starterKits),r=L(u=>u.selectedStarterKitIndex),n=L(u=>u.isLoadingStarterKits),o=L(u=>u.starterKitsError);if(n)return jsx(us,{message:"Loading Starter Kits..."});if(o)return jsx(ms,{message:o,onRetry:e,onBack:e});if(t.length===0)return jsx(un,{message:"No Starter Kits available."});let s=Math.max(0,r-Math.floor(Ua/2)),i=Math.min(t.length,s+Ua);i===t.length&&(s=Math.max(0,i-Ua));let a=t.slice(s,i),l=s,c=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((u,d)=>jsx(_d,{starterKit:u,isSelected:s+d===r},u.slug)),c>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",c," more below"]})})]})}var Nd=$g.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)"})]})});var ja=8;function Ud(){let e=L(u=>u.selectedStarterKit),t=L(u=>u.plugins),r=L(u=>u.pluginCursorIndex),n=useRef(false);if(useEffect(()=>{e&&!n.current&&(n.current=true,b(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(u=>u.installed).length,s=Math.max(0,r-Math.floor(ja/2)),i=Math.min(t.length,s+ja);i===t.length&&(s=Math.max(0,i-ja));let a=t.slice(s,i),l=s,c=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((u,d)=>jsx(Nd,{plugin:u,isCursor:s+d===r},u.name)),c>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",c," more below"]})})]})}var _w=["Retry failed","Continue anyway"];function Bd({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(Ku,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",s]})]}),o!==void 0&&o>0&&n!==void 0&&n>0&&jsx(Box,{paddingLeft:2,children:jsx(ps,{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 Fd({onComplete:e,onRetry:t}){let r=L(c=>c.plugins),n=L(c=>c.step),o=L(c=>c.successCount),s=L(c=>c.failedCount),i=L(c=>c.summaryActionIndex),a=r.filter(c=>c.selected),l=useRef(false);return useEffect(()=>{if(n==="summary"&&s===0&&!l.current){l.current=true;let c=setTimeout(e,1500);return ()=>clearTimeout(c)}},[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(c=>jsx(Bd,{name:c.name,status:c.status,error:c.error,downloadProgress:c.downloadProgress,downloadTotal:c.downloadTotal},c.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(c=>c.status==="failed").map(c=>jsx(Bd,{name:c.name,status:c.status,error:c.error},c.name))}),s>0&&jsx(Box,{flexDirection:"column",paddingX:1,children:_w.map((c,u)=>jsx(Box,{children:jsxs(Text,{bold:u===i,color:u===i?"cyan":void 0,children:[u===i?"\u203A ":" ",c]})},c))}),s===0&&jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:"Proceeding to main screen..."})})]})}function jd(){let e=L(T=>T.step),t=L(T=>T.starterKits),r=L(T=>T.selectedStarterKitIndex),n=L(T=>T.setSelectedStarterKitIndex),o=L(T=>T.selectStarterKit),s=L(T=>T.plugins),i=L(T=>T.pluginCursorIndex),a=L(T=>T.setPluginCursorIndex),l=L(T=>T.setStep),c=L(T=>T.summaryActionIndex),u=L(T=>T.setSummaryActionIndex),d=L(T=>T.failedCount),m=L(T=>T.resetForRetry),p=L(T=>T.goBackToList),f=S(T=>T.setScreen),h=S(T=>T.setFocus),g=S(T=>T.focus),w=Xe(T=>T.setJustAuthenticated),v=Xe(T=>T.justAuthenticated),{loadStarterKits:O,installSelected:_}=Md(),E=useRef(false);useEffect(()=>{e==="starterKitList"?(h("starterKitList"),E.current||(E.current=true,Mr("bundle_selection"))):h(e==="starterKitDetail"?"starterKitDetail":"installProgress");},[e,h]);let M=useCallback(async()=>{let T=L.getState().selectedStarterKit;if(T){let G=await ae();G&&await Bt({...G,starterKit:T.slug});}b(I.CLI_STEP_COMPLETED,{step:"summary_review",duration_ms:Lr()}).catch(()=>{});let{successCount:U}=L.getState();b(I.CLI_ONBOARDING_COMPLETED,{duration_ms:Ft(),tools_installed_count:U}).catch(()=>{}),w(false),h("verify"),f("verify");},[w,h,f]),K=useCallback(()=>{m(),_();},[m,_]),H=useCallback(()=>{O();},[O]),ue=useCallback(()=>{h("verify"),f("verify");},[h,f]);return useInput((T,U)=>{if(U.escape)Xo("esc"),ue();else if(U.upArrow&&r>0)n(r-1);else if(U.downArrow&&r<t.length-1)n(r+1);else if(U.return&&t.length>0){let G=Lr();o(t[r]),Mr("kit_display"),b(I.CLI_STEP_COMPLETED,{step:"bundle_selection",duration_ms:G}).catch(()=>{});}},{isActive:g==="starterKitList"}),useInput((T,U)=>{let G=Ld(T,U);if(G.cursorDelta!==0){let B=i+G.cursorDelta;B>=0&&B<s.length&&a(B);}if(G.confirm){let B=L.getState().selectedStarterKit;B&&(async()=>(await ae())?.starterKit!==B.slug&&b(I.CLI_KIT_ACCEPTED,{bundle_slug:B.slug}).catch(()=>{}))();let be=Lr();Mr("kit_confirmation"),b(I.CLI_STEP_COMPLETED,{step:"kit_display",duration_ms:be}).catch(()=>{});let Nt=Lr();Mr("tool_installation"),b(I.CLI_STEP_COMPLETED,{step:"kit_confirmation",duration_ms:Nt}).catch(()=>{}),l("installing"),_();}if(G.back){let B=L.getState().selectedStarterKit;B&&b(I.CLI_KIT_REJECTED,{bundle_slug:B.slug}).catch(()=>{}),p();}},{isActive:g==="starterKitDetail"}),useInput((T,U)=>{if(d===0)return;let G=Rd(T,U);if(G.cursorDelta!==0){let B=c+G.cursorDelta;B>=0&&B<=1&&u(B);}G.select&&(c===0?K():M());},{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."}),!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(Dd,{onRetry:H}),e==="starterKitDetail"&&jsx(Ud,{}),(e==="installing"||e==="summary")&&jsx(Fd,{onComplete:M,onRetry:K})]}),jsx(cs,{})]})}var Hd=null;function Jd(){return Hd}async function Xs(){let t=Dr().filter(r=>r.installedVersion===null&&r.installMethod===null);for(let r of t){let n=re.find(i=>i.alias===r.alias);if(!n)continue;let{installedVersion:o,installMethod:s}=await Gd(n);(o||s)&&await dt({...r,installedVersion:o,installMethod:s});}}async function Gd(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 Et(r.type).getInstalledVersion(e);if(o)return {installedVersion:o,installMethod:r.type}}catch{}return {installedVersion:null,installMethod:null}}async function kn(e){let t=await Promise.all(e.map(r=>Nw(r)));return Hd=t,t}async function Nw(e){let t=Kd(e.versionCommand);t==="permission-denied"&&(Uw(e.versionCommand[0]),t=Kd(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 Et(l.type).isAvailable()?l.type:null}catch{return null}}))).filter(l=>l!==null);if(n&&!qe(e.alias)){let{installedVersion:l,installMethod:c}=await Gd(e);await dt({alias:e.alias,name:e.name,installedVersion:l,installMethod:c,installedAt:null,lastChecked:new Date().toISOString()});}return {module:e,alreadyInstalled:n,availableStrategies:a}}function Kd(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 Uw(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=Se__default.realpathSync(r),{mode:o}=Se__default.statSync(n);Se__default.chmodSync(n,o|73);}catch{}}function jw(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 Yd(e,t){let[r,n]=useState(()=>jw(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}));},[]),c=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,h=m.upArrow||d==="[A",g=m.downArrow||d==="[B";if(h||g)h&&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 v=w.availableStrategies.indexOf(w.selectedStrategy??w.availableStrategies[0]),O=w.availableStrategies[(v+1)%w.availableStrategies.length];n(_=>_.map(E=>E.module.alias===w.module.alias?{...E,selectedStrategy:O}:E));}}},{isActive:t});let u=useMemo(()=>r.filter(d=>d.checked),[r]);return {items:r,focusedIndex:o,toggle:l,setStrategy:c,confirmedItems:u}}function Qd({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}=Yd(e,r==="moduleSetup"),c=useCallback(()=>{o(false),s("moduleSetup");},[o,s]),u=useCallback(p=>{(p==="Install"||p==="Skip")&&t(l),c();},[l,t,c]);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 h=f===a,g=y(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:h?"cyan":void 0,children:[h?"\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: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(Ye,{itemName:m,actions:d,onAction:u,onClose:c})]})}var Gw=/^https?:\/\/.+/;function ep({onConfirm:e}){let[t,r]=useState("confirm"),[n,o]=useState(""),[s,i]=useState(false),a=useRef("");return useInput((l,c)=>{if(t==="confirm"){if(l==="y"||l==="Y"){r("input");return}if(l==="n"||l==="N"||c.return){e(null);return}}if(t==="input"){if(c.escape){a.current="",o(""),r("confirm");return}if(c.return){let u=a.current.trim();u.length>0&&Gw.test(u)?(i(false),e(u)):u.length>0&&i(true);return}if(c.backspace||c.delete){a.current=a.current.slice(0,-1),o(a.current);return}l&&!c.ctrl&&!c.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 Ww(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 np(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=Ww(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 dr(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]),c=useMemo(()=>r.filter(d=>d.status==="failed").length,[r]),u=useMemo(()=>r.filter(d=>d.status==="skipped").length,[r]);return {modules:r,install:a,isComplete:o,installedCount:l,failedCount:c,skippedCount:u}}function op({module:e}){let t=y(e.name);if(e.status==="installing")return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Ku,{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 lp({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:c}=np(e,t),u=o.some(w=>w.pendingSetupCommand),d=useRef(false),m=useRef(false);useEffect(()=>{d.current||(d.current=true,s());},[s]);let p=useCallback(()=>{Or().catch(()=>{}),n("list");let w=ne().some(v=>v.name===se);r(w?"main":"claudeMdSuggestion");},[n,r]);useEffect(()=>{if(i&&l===0&&!u&&!m.current){m.current=true;let w=setTimeout(p,1500);return ()=>clearTimeout(w)}},[i,l,u,p]),useInput((w,v)=>{v.return&&p();},{isActive:i});let f=o.filter(w=>w.pendingSetupCommand).length,h=a-f,g=[];return h>0&&g.push(jsxs(Text,{color:"green",children:[h," 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")),c>0&&g.push(jsxs(Text,{dimColor:true,children:[c," 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(op,{module:w},w.alias))}),i&&jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:g.reduce((w,v,O)=>(O>0&&w.push(jsx(Text,{children:" | "},`sep-${O}`)),w.push(v),w),[])}),jsx(Box,{paddingX:1,children:l>0||u?jsx(Text,{dimColor:true,children:"Press Enter to continue"}):jsx(Text,{dimColor:true,children:"Proceeding..."})})]})]})}function up(){let[e,t]=useState("loading"),[r,n]=useState([]),[o,s]=useState([]),[i,a]=useState(null),l=S(p=>p.setFocus),c=S(p=>p.setScreen),u=useCallback(p=>{if(ql(p)){Or().catch(()=>{}),l("list");let h=ne().some(g=>g.name===se);c(h?"main":"claudeMdSuggestion");}else n(p),t("selection");},[l,c]);useEffect(()=>{let p=Jd();if(p){u(p);return}kn(re).then(u).catch(()=>{n([]),t("selection");});},[u]);let d=useCallback(p=>{s(p);let f=p.some(h=>h.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(Qd,{probeResults:r,onConfirm:d}),e==="customUrl"&&jsx(ep,{onConfirm:m}),e==="installation"&&jsx(lp,{confirmedItems:o,customUrl:i})]})}var oS=x("ClaudeMdSuggestion"),sS=[`Install ${se}`,"Skip for now"],iS=["Retry","Skip for now"];function mp(){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]),c=useCallback(()=>{b(I.CLI_CLAUDE_MD_SKIPPED,{interface:"tui"}).catch(()=>{}),l();},[l]),u=useCallback(async()=>{a.current+=1,b(I.CLI_CLAUDE_MD_ACCEPTED,{interface:"tui",attempt:a.current}).catch(()=>{}),o("installing");try{await $e(se),o("installed");}catch(m){if(m instanceof je){o("installed");return}oS.warn(`Failed to install ${se}: ${m instanceof Error?m.message:m}`),o("error");}},[]),d=n==="error"?iS:sS;return useInput((m,p)=>{if(p.escape){n==="prompt"||n==="error"?c():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),u()):c());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(pp,{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(Ku,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" Installing ",se,"..."]})]}),n==="installed"&&jsxs(Fragment,{children:[jsxs(Text,{color:"green",bold:true,children:["\u2713 ",se," 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:["/",se]})]}),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 ",se]}),jsx(pp,{options:d,cursorIndex:s}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]})]})]})}function pp({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 uS=promisify(execFile),ei="@ciandt-flow/cli";async function fp(){let e=le;if(Ta.prerelease(e)||process.env.NODE_ENV==="development")return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:ei};try{let t=await fetch(`https://registry.npmjs.org/${ei}/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:ei}}catch{return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:ei}}}async function ti(e){try{return await uS(jt(),["install","-g",e.packageName],{timeout:6e4,shell:process.platform==="win32"}),{success:!0}}catch(t){return {success:false,error:String(t)}}}async function dS(e){let t=qe(e.alias);if(!t?.installMethod)return t?.installedVersion??null;try{let n=await Et(t.installMethod).getInstalledVersion(e);return n&&n!==t.installedVersion&&await dt({...t,installedVersion:n,lastChecked:new Date().toISOString()}),n??t.installedVersion}catch{return t.installedVersion}}async function gp(e){let t=await dS(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 hp(e,t){let r=qe(e.alias);if(!r?.installMethod)return {success:false,error:"Unknown install method"};let o=await Et(r.installMethod).update(e,t.currentVersion??"");return o.success?(await dt({...r,installedVersion:o.version??r.installedVersion,lastChecked:new Date().toISOString()}),{success:true,newVersion:o.version}):{success:false,error:o.error?.message}}function yp(e){let r=qe(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 wp(){let[e,t]=useState({outcome:"running",items:[{id:"cli",label:"@ciandt-flow/cli",status:"pending"},...re.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([fp(),kn(re),Promise.all(re.map(l=>gp(l)))]);if(Xs(),o.isOutdated){r("cli",{status:"updating",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`}),(await ti(o)).success?(r("cli",{status:"updated",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`}),t(c=>({...c,outcome:"cli-updated"}))):(r("cli",{status:"error",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`,manualCommand:`npm install -g ${o.packageName}`}),t(c=>({...c,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 c=re.find(d=>d.alias===l.moduleAlias);if(!c)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 u=await hp(c,l);u.success?r(l.moduleAlias,{status:"updated",detail:`v${u.newVersion}`}):r(l.moduleAlias,{status:"error",detail:`v${l.currentVersion} \u2192 v${l.latestVersion}`,manualCommand:yp(c)});}t(l=>({...l,items:l.items.map(c=>c.status==="pending"?{...c,status:"ok"}:c)})),await Or(),t(l=>({...l,outcome:"done"}));}catch{await Or(),t(o=>({...o,outcome:"done"}));}}n();},[r]),e}function yS({item:e}){return e.status==="pending"||e.status==="updating"?jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Ku,{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 wS({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 Sp(){let{outcome:e,items:t}=wp(),r=S(o=>o.setScreen),n=S(o=>o.setFocus);return useEffect(()=>{if(e==="done"){let o=setTimeout(()=>{let s=ne().some(i=>i.name===se);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(yS,{item:o},o.id))}),e!=="running"&&jsx(Box,{marginTop:1,children:jsx(wS,{outcome:e})})]})}var bS={debug:"gray",info:"cyan",warn:"yellow",error:"red"},xp=10;function Ip(){let[e,t]=useState(Si());useEffect(()=>xl(()=>{t([...Si()]);}),[]);let r=e.slice(-xp);return jsxs(Box,{flexDirection:"column",borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsxs(Text,{color:"cyan",bold:true,children:["Debug Log (last ",xp,") \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:bS[n.level],children:["[",n.level.toUpperCase(),"] [",n.module,"] ",n.message]},o))]})}var CS=x("app"),TS={auth:sc,starterKitSetup:jd,moduleSetup:up,claudeMdSuggestion:mp,verify:Sp,main:Ad};function Pp(){let{setScreen:e,setFocus:t}=S.getState();e("auth"),t("auth");}function Wn(e){let{setScreen:t,setFocus:r}=S.getState();!e.starterKit||e.starterKit.trim()===""?(t("starterKitSetup"),r("starterKitList")):(t("verify"),r("verify"));}function Ep(){b(I.CLI_SESSION_STARTED,{cli_version:le,os:process.platform,node_version:process.version,duration_ms:Ft(),interface:"tui"}).catch(()=>{});}async function Tp(){let e=await ae();if(e&&zl()&&await ir()){let{clientSecret:n,...o}=e;Xe.getState().setCredentials(o),Ep(),Wn(e);return}if(!e){Pp();return}try{await ar();}catch(n){CS.debug(`Token validation failed: ${String(n)}`),Pp();return}Ep();let{clientSecret:t,...r}=e;Xe.getState().setCredentials(r),Wn(e);}function kp(){let{columns:e,rows:t}=useWindowSize(),r=S(a=>a.screen),n=TS[r],{pendingExit:o}=Vl(),s=S(a=>a.debugPanelOpen),i=!!process.env.DEBUG;return useInput((a,l)=>{if(i&&l.ctrl&&a==="d"){let c=S.getState().debugPanelOpen;S.getState().setDebugPanelOpen(!c);}}),n?jsxs(Box,{flexDirection:"column",width:e,height:t,children:[jsx(n,{}),i&&s&&jsx(Ip,{}),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]})}async function Qa(e,t={}){let r=Yo({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant},t);return Zo(r),await Bt(e),{jwt:r.jwt,previousToken:r.previousToken,hadExistingFile:r.hadExistingFile}}var xt=x("auth");function $p(){Be.clearFallbackFile(),Ho();}var kS=3,Ap=3,Mp=` \u2139 The data collected during setup is used solely to improve
|
|
116
|
+
[y/N] `))return js.debug(`[${e}] Removal cancelled by user`),C("Operation cancelled."),0}let n=t.silent?void 0:rl({text:`Removing MCP "${y(e)}"...`}).start();try{let o=await Pe(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&&C(`stdout: ${o.stdout}`),1):(hd(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:te(o)}),1}}function Sd({selectedItem:e,selectedCatalogItem:t,items:r,closeMenu:n,clampIndex:o,notify:s}){let i=x("pluginHandlers"),a=useRef(0),l=S(E=>E.setLoading),c=S(E=>E.setDownloadProgress),{install:u,uninstall:d,toggle:m,update:p}=fd(),f=async(E,M,K)=>{l(true,E),n();try{await M(),o(r.length),s(K,"success");}catch(H){let ue=H instanceof Error?H.message:"Something went wrong";i.error(`[withLoading] ${E} failed: ${ue}`),s(ue,"error");}finally{l(false);}};return {handleInstall:(E,M)=>{e&&t&&(a.current=0,f(`Installing ${e.name}...`,()=>u(t,{scope:E,...M!==void 0?{providerId:M}:{},onDownloadProgress:(K,H)=>{let ue=Date.now();(ue-a.current>100||K>=H)&&(a.current=ue,c(K,H));}}),"\u2713 Installed successfully"));},handleUninstall:E=>{e&&f(`Uninstalling ${e.name}...`,()=>d(e.name,E),"\u2713 Uninstalled");},handleToggleStatus:E=>{if(!e)return;let M=e.status==="enabled";f(M?`Disabling ${e.name}...`:`Enabling ${e.name}...`,()=>m(e.name,E),M?"\u2713 Disabled":"\u2713 Enabled");},handleUpdate:()=>{if(!e)return;let E=t?` to v${t.version}`:"";(async()=>{l(true,`Updating ${e.name}${E}...`),n();try{await p(e.name),o(r.length),s(`\u2713 Updated ${e.name}${E}`,"success");}catch(K){if(K instanceof fr)s(K.message,"info");else {let H=K instanceof Error?K.message:"Something went wrong";i.error(`[handleUpdate] ${e.name} failed: ${H}`),s(H,"error");}}finally{l(false);}})();},handleBatchUpdate:E=>{if(E.length===0)return;let M=E.length;(async()=>{l(true,`Updating ${M} plugin${M>1?"s":""}...`),n();try{let H=[];for(let N of E)H.push(await p(N.name).then(()=>({status:"fulfilled",value:void 0}),G=>({status:"rejected",reason:G})));let ue=H.filter(N=>N.status==="fulfilled").length,T=H.map((N,G)=>N.status==="rejected"?E[G].name:null).filter(N=>N!==null);o(r.length),T.length===0?s(`\u2713 Updated ${ue}/${M} plugin${M>1?"s":""}`,"success"):(i.error(`[handleBatchUpdate] failed: ${T.join(", ")}`),s(`Updated ${ue}/${M}; failed: ${T.join(", ")}`,ue>0?"info":"error"));}finally{l(false);}})();},handleMcpConfigUninstall:E=>{e&&f(`Removing MCP ${e.name}...`,async()=>{let M=Aa(e.name,E),K=await Pe(M);if(K.exitCode!==0)throw new Error(K.stderr||"MCP removal failed");pe.getState().loadFromDisk();},"\u2713 MCP removed");}}}var yo=x("api:bundle"),Tn=class extends Error{constructor(t){super(`Bundle '${t}' not found in your tenant. Verify the name with whoever shared the command.`),this.name="BundleNotFoundError";}},wo=class extends Error{constructor(){super("The server encountered an error while fetching the bundle. Please try again later."),this.name="BundleServerError";}},mw=/^[a-zA-Z0-9_-]{1,128}$/;async function Id(e,t){if(e instanceof HTTPError){let r=e.response.status;throw yo.error(`HTTP error fetching bundle '${t}' [status=${r}]`),r===StatusCodes.NOT_FOUND?new Tn(t):r===StatusCodes.INTERNAL_SERVER_ERROR?new wo:new Error(`Server error (${r}) \u2014 please try again later.`)}throw yo.error(`Unexpected error fetching bundle '${t}': ${e instanceof Error?e.message:String(e)}`),e}async function bd(e){if(!mw.test(e))throw new Error("Invalid bundle identifier format.");let t=encodeURIComponent(e);yo.debug(`Fetching bundle by flowId "${e}"`);try{return await gt().get(`v1/use-cases/${t}`).json()}catch(r){return Id(r,e)}}async function Ks(e){let t=encodeURIComponent(e);yo.debug(`Fetching bundle by name "${e}"`);let r;try{r=await gt().get(`v1/use-cases/by-name/${t}`).json(),yo.debug(`API returned ${r.length} result(s) for "${e}"`);}catch(n){return Id(n,e)}if(r.length===0)throw new Tn(e);return r[0]}var fw=x("tui:bundle-flow");function vd({closeMenu:e,notify:t}){let r=S(a=>a.bundleInstallFlow);return {handleBundleInstallStart:(a,l)=>{let{setLoading:c,setBundleInstallFlow:u}=S.getState(),d=l?.trim();fw.debug(`Starting bundle install: itemName="${a}" flowId="${d??"none"}"`),c(true,"Loading bundle..."),(d?bd(d):Ks(a)).then(p=>{c(false),S.getState().actionMenuOpen&&u({phase:"detail",bundle:p});}).catch(p=>{c(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(),pe.getState().loadFromDisk(),t(`\u2713 Installed ${a.installed} of ${a.total} artifacts`,"success");}}}var So=["local","project","user"],gw=new Set(["--transport","--scope","-s"]);function Pd(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(gw.has(o))n+=2;else if(o.startsWith("-"))n+=1;else return o.replace(/^["']|["']$/g,"")}return null}function Jr(e,t){return t?`${e}::${t}`:e}function $a(e){return e===Y?_n:qr}function Ed(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??_n,flowId:e.flowId}}function Ma(e,t){let r=$a(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 Cd(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 So.filter(r=>t.has(r)).map(r=>({scope:r,label:Dn[r].label,pathHint:Dn[r].pathHint,items:t.get(r)??[]}))}function Td(e){let t=r=>{if(!r)return 1/0;let n=So.indexOf(r);return n===-1?1/0:n};return [...e].sort((r,n)=>t(r.scope)-t(n.scope))}function kd({catalog:e,installedItems:t,activeTab:r,catalogFilters:n,searchQuery:o}){let s=useMemo(()=>new Set(t.map(f=>Jr(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=>[Jr(g.name,g.author?.name),g])),h=new Map(e.map(g=>[g.name,g]));return t.map(g=>{let w=f.get(Jr(g.name,g.author?.name))??h.get(g.name),v=w?.version,O=!!v&&!!g.version&&Re(g.version,v);return {...g,updateAvailable:O,catalogItem:w}})},[t,e]),l=useMemo(()=>r==="discover"?e.filter(f=>{if(s.has(Jr(f.name,f.author?.name)))return false;if(f.type==="mcp"){let h=f.installCommand?Pd(f.installCommand)?.toLowerCase():null;if(i.has(f.name.toLowerCase())||h&&i.has(h))return false}return true}).map(f=>Ed(f)):r==="updates"?a.filter(f=>f.updateAvailable).map(f=>Ma(f,f.catalogItem)):a.map(f=>Ma(f,f.catalogItem)),[r,e,s,i,a]),c=useMemo(()=>l.filter(f=>{let h=f.type??"bundle";if(!n.types.has(h))return false;let g=f.origin??"internal";return n.origins.has(g)}),[l,n]),u=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 ${u} found for '${o}' \u2014 explore the Discover tab!`:`No ${u} installed \u2014 explore the Discover tab!`:r==="updates"?o?`No ${u} found for '${o}' \u2014 all up to date!`:"All up to date \u2014 nothing to update":o?`No ${u} found for '${o}'`:`No ${u} available in the catalog`,[r,o,u]),m=useMemo(()=>{let f=new Map(e.map(g=>[Jr(g.name,g.author?.name),g])),h=new Map(e.map(g=>[g.name,g]));return g=>g?f.get(Jr(g.name,g.authorName))??h.get(g.name)??null:null},[e]),p=useMemo(()=>a.filter(f=>f.updateAvailable).length,[a]);return {items:c,emptyMessage:d,getSelectedCatalogItem:m,outdatedCount:p}}function La(){let[e,t]=useState([]),[r,n]=useState(true),[o,s]=useState(null),[i,a]=useState(null),l=useRef(false),c=S(d=>d.catalogVersion),u=useCallback(async()=>{n(true),s(null),a(null);try{let{items:d,failures:m}=await eu();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,b(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(()=>{u();},[u,c]),{catalog:e,isLoading:r,error:o,partialError:i,refetch:u}}function Ad(){return {items:pe(t=>t.installedItems)}}var xw=x("catalog");function Md(){let e=S(W=>W.bundleInstallFlow),t=S(W=>W.activeTab),r=S(W=>W.notification),n=S(W=>W.loading),o=S(W=>W.loadingMessage),s=S(W=>W.downloadProgress),i=S(W=>W.downloadTotal),a=S(W=>W.catalogError),l=S(W=>W.setCatalogError),c=S(W=>W.catalogFilters),u=Fe(W=>W.query),{catalog:d,isLoading:m,error:p,refetch:f}=La(),{items:h}=Ad(),g=pe(W=>W.loadFromDisk),{items:w,emptyMessage:v,getSelectedCatalogItem:O,outdatedCount:_}=kd({catalog:d,installedItems:h,activeTab:t,catalogFilters:c,searchQuery:u}),{actionMenuOpen:E,closeMenu:M,selectedIndex:K,clampIndex:H,filteredItems:ue}=cd({listLength:w.length}),T=ue(w),N=useMemo(()=>t!=="installed"&&t!=="updates"?T:Td(T),[t,T]),G=useMemo(()=>t==="installed"||t==="updates"?Cd(N):[],[t,N]),B=N[K]??null,be=useMemo(()=>O(B),[O,B]),{notify:Ut}=dd(),{handleInstall:$,handleUninstall:U,handleToggleStatus:z,handleUpdate:A,handleBatchUpdate:R,handleMcpConfigUninstall:V}=Sd({selectedItem:B,selectedCatalogItem:be,items:w,closeMenu:M,clampIndex:H,notify:Ut}),{handleBundleInstallStart:at,handleBundleDetailConfirm:Xr,handleBundleDetailBack:_m,handleBundleInstallComplete:Dm}=vd({closeMenu:M,notify:Ut}),Om=useCallback(()=>R(N),[R,N]);return useEffect(()=>{g();},[]),useEffect(()=>{H(N.length);},[N.length,H]),useEffect(()=>{p&&(xw.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(un,{}),jsx(gc,{outdatedCount:_}),t==="marketplaces"&&cr()?jsx(Box,{flexDirection:"column",flexGrow:1,children:jsx(sd,{})}):jsx(Mc,{filteredItems:N,groups:G,emptyMessage:v,onBatchUpdate:Om}),(n||m)&&jsxs(Fragment,{children:[jsx(ds,{message:n?o:"Loading catalog..."}),n&&i>0&&s>0&&jsx(Box,{paddingLeft:2,children:jsx(ms,{received:s,total:i})})]}),a&&!m&&t==="discover"&&jsx(fs,{message:a,onRetry:()=>{l(null),f();},onBack:()=>l(null)}),r&&jsx(Lc,{message:r.message,type:r.type}),E&&B&&(t==="discover"?be?.type==="bundle"?e?.phase==="installing"?jsx(Ju,{bundle:e.bundle,onComplete:Dm}):jsx(Ru,{itemName:B.name,bundle:e?.phase==="detail"?e.bundle:void 0,onInstall:()=>at(B.name,B.flowId),onConfirm:Xr,onClose:e?.phase==="detail"?_m:M}):jsx(Mu,{itemName:B.name,itemType:be?.type,onInstall:$,onClose:M}):B.type==="mcp"?jsx(Bu,{itemName:B.name,itemScope:B.scope??"user",onUninstall:V,onClose:M}):jsx(Ou,{itemName:B.name,itemScope:B.scope??"user",itemStatus:B.status??"enabled",updateAvailable:B.updateAvailable??false,catalogVersion:be?.version,onUninstall:U,onToggleStatus:W=>z(W),onUpdate:A,onClose:M})),jsx(us,{})]})}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(pe.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"})}));var Ew=3;function Rd(){let e=L(u=>u.setStarterKits),t=L(u=>u.setIsLoadingStarterKits),r=L(u=>u.setStarterKitsError),n=L(u=>u.setPluginStatus),o=L(u=>u.setPluginDownloadProgress),s=L(u=>u.setStep),i=L(u=>u.computeSummary),a=useCallback(async()=>{t(true),r(null);try{let u=await bs();e(u);}catch(u){r(u instanceof Error?u.message:String(u));}finally{t(false);}},[t,r,e]);useEffect(()=>{pe.getState().loadFromDisk(),a();},[a]);let l=useRef(0),c=useCallback(async()=>{let u=L.getState().plugins.filter(m=>m.selected&&m.status==="pending");for(let m of u){n(m.name,"installing"),l.current=0;let p="",f=false;for(let h=1;h<=Ew;h++)try{await $e(m.name,{onDownloadProgress:(g,w)=>{let v=Date.now();(v-l.current>100||g>=w)&&(l.current=v,o(m.name,g,w));}}),n(m.name,"success"),f=!0;break}catch(g){if(g instanceof je){n(m.name,"success"),f=true;break}p=g instanceof Error?g.message:"Unknown error";}f||(n(m.name,"failed",p),b(I.CLI_TOOL_INSTALL_FAILED,{tool_id:m.name,tool_type:"skill",source:"internal",error_code:"install_failed",error_message:p,interface:X().interfaceType}).catch(()=>{}));}let d=Rr();Lr("summary_review"),b(I.CLI_STEP_COMPLETED,{step:"tool_installation",duration_ms:d}).catch(()=>{}),pe.getState().loadFromDisk(),i(),s("summary");},[n,o,i,s]);return {loadStarterKits:a,installSelected:c}}var xo={cursorDelta:0,confirm:false,back:false};function _d(e,t){return t.upArrow?{...xo,cursorDelta:-1}:t.downArrow?{...xo,cursorDelta:1}:t.escape?{...xo,back:true}:t.return?{...xo,confirm:true}:xo}var Cw={cursorDelta:0,select:false};function Dd(e,t){return t.upArrow?{cursorDelta:-1,select:false}:t.downArrow?{cursorDelta:1,select:false}:t.return?{cursorDelta:0,select:true}:Cw}var Od=Mg.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 Ba=5;function Ud({onRetry:e}){let t=L(u=>u.starterKits),r=L(u=>u.selectedStarterKitIndex),n=L(u=>u.isLoadingStarterKits),o=L(u=>u.starterKitsError);if(n)return jsx(ds,{message:"Loading Starter Kits..."});if(o)return jsx(fs,{message:o,onRetry:e,onBack:e});if(t.length===0)return jsx(dn,{message:"No Starter Kits available."});let s=Math.max(0,r-Math.floor(Ba/2)),i=Math.min(t.length,s+Ba);i===t.length&&(s=Math.max(0,i-Ba));let a=t.slice(s,i),l=s,c=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((u,d)=>jsx(Od,{starterKit:u,isSelected:s+d===r},u.slug)),c>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",c," more below"]})})]})}var Bd=Mg.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)"})]})});var Ka=8;function Fd(){let e=L(u=>u.selectedStarterKit),t=L(u=>u.plugins),r=L(u=>u.pluginCursorIndex),n=useRef(false);if(useEffect(()=>{e&&!n.current&&(n.current=true,b(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(u=>u.installed).length,s=Math.max(0,r-Math.floor(Ka/2)),i=Math.min(t.length,s+Ka);i===t.length&&(s=Math.max(0,i-Ka));let a=t.slice(s,i),l=s,c=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((u,d)=>jsx(Bd,{plugin:u,isCursor:s+d===r},u.name)),c>0&&jsx(Box,{paddingX:2,children:jsxs(Text,{dimColor:true,children:["\u2193 ",c," more below"]})})]})}var Dw=["Retry failed","Continue anyway"];function jd({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(Hu,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" ",s]})]}),o!==void 0&&o>0&&n!==void 0&&n>0&&jsx(Box,{paddingLeft:2,children:jsx(ms,{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 Kd({onComplete:e,onRetry:t}){let r=L(c=>c.plugins),n=L(c=>c.step),o=L(c=>c.successCount),s=L(c=>c.failedCount),i=L(c=>c.summaryActionIndex),a=r.filter(c=>c.selected),l=useRef(false);return useEffect(()=>{if(n==="summary"&&s===0&&!l.current){l.current=true;let c=setTimeout(e,1500);return ()=>clearTimeout(c)}},[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(c=>jsx(jd,{name:c.name,status:c.status,error:c.error,downloadProgress:c.downloadProgress,downloadTotal:c.downloadTotal},c.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(c=>c.status==="failed").map(c=>jsx(jd,{name:c.name,status:c.status,error:c.error},c.name))}),s>0&&jsx(Box,{flexDirection:"column",paddingX:1,children:Dw.map((c,u)=>jsx(Box,{children:jsxs(Text,{bold:u===i,color:u===i?"cyan":void 0,children:[u===i?"\u203A ":" ",c]})},c))}),s===0&&jsx(Box,{paddingX:1,children:jsx(Text,{dimColor:true,children:"Proceeding to main screen..."})})]})}function Vd(){let e=L(T=>T.step),t=L(T=>T.starterKits),r=L(T=>T.selectedStarterKitIndex),n=L(T=>T.setSelectedStarterKitIndex),o=L(T=>T.selectStarterKit),s=L(T=>T.plugins),i=L(T=>T.pluginCursorIndex),a=L(T=>T.setPluginCursorIndex),l=L(T=>T.setStep),c=L(T=>T.summaryActionIndex),u=L(T=>T.setSummaryActionIndex),d=L(T=>T.failedCount),m=L(T=>T.resetForRetry),p=L(T=>T.goBackToList),f=S(T=>T.setScreen),h=S(T=>T.setFocus),g=S(T=>T.focus),w=Xe(T=>T.setJustAuthenticated),v=Xe(T=>T.justAuthenticated),{loadStarterKits:O,installSelected:_}=Rd(),E=useRef(false);useEffect(()=>{e==="starterKitList"?(h("starterKitList"),E.current||(E.current=true,Lr("bundle_selection"))):h(e==="starterKitDetail"?"starterKitDetail":"installProgress");},[e,h]);let M=useCallback(async()=>{let T=L.getState().selectedStarterKit;if(T){let G=await ae();G&&await Bt({...G,starterKit:T.slug});}b(I.CLI_STEP_COMPLETED,{step:"summary_review",duration_ms:Rr()}).catch(()=>{});let{successCount:N}=L.getState();b(I.CLI_ONBOARDING_COMPLETED,{duration_ms:Ft(),tools_installed_count:N}).catch(()=>{}),w(false),h("verify"),f("verify");},[w,h,f]),K=useCallback(()=>{m(),_();},[m,_]),H=useCallback(()=>{O();},[O]),ue=useCallback(()=>{h("verify"),f("verify");},[h,f]);return useInput((T,N)=>{if(N.escape)qo("esc"),ue();else if(N.upArrow&&r>0)n(r-1);else if(N.downArrow&&r<t.length-1)n(r+1);else if(N.return&&t.length>0){let G=Rr();o(t[r]),Lr("kit_display"),b(I.CLI_STEP_COMPLETED,{step:"bundle_selection",duration_ms:G}).catch(()=>{});}},{isActive:g==="starterKitList"}),useInput((T,N)=>{let G=_d(T,N);if(G.cursorDelta!==0){let B=i+G.cursorDelta;B>=0&&B<s.length&&a(B);}if(G.confirm){let B=L.getState().selectedStarterKit;B&&(async()=>(await ae())?.starterKit!==B.slug&&b(I.CLI_KIT_ACCEPTED,{bundle_slug:B.slug}).catch(()=>{}))();let be=Rr();Lr("kit_confirmation"),b(I.CLI_STEP_COMPLETED,{step:"kit_display",duration_ms:be}).catch(()=>{});let Ut=Rr();Lr("tool_installation"),b(I.CLI_STEP_COMPLETED,{step:"kit_confirmation",duration_ms:Ut}).catch(()=>{}),l("installing"),_();}if(G.back){let B=L.getState().selectedStarterKit;B&&b(I.CLI_KIT_REJECTED,{bundle_slug:B.slug}).catch(()=>{}),p();}},{isActive:g==="starterKitDetail"}),useInput((T,N)=>{if(d===0)return;let G=Dd(T,N);if(G.cursorDelta!==0){let B=c+G.cursorDelta;B>=0&&B<=1&&u(B);}G.select&&(c===0?K():M());},{isActive:g==="installProgress"&&e==="summary"}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(un,{}),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(Ud,{onRetry:H}),e==="starterKitDetail"&&jsx(Fd,{}),(e==="installing"||e==="summary")&&jsx(Kd,{onComplete:M,onRetry:K})]}),jsx(us,{})]})}var Gd=null;function zd(){return Gd}async function qs(){let t=Or().filter(r=>r.installedVersion===null&&r.installMethod===null);for(let r of t){let n=re.find(i=>i.alias===r.alias);if(!n)continue;let{installedVersion:o,installMethod:s}=await Wd(n);(o||s)&&await dt({...r,installedVersion:o,installMethod:s});}}async function Wd(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 Et(r.type).getInstalledVersion(e);if(o)return {installedVersion:o,installMethod:r.type}}catch{}return {installedVersion:null,installMethod:null}}async function An(e){let t=await Promise.all(e.map(r=>Nw(r)));return Gd=t,t}async function Nw(e){let t=Hd(e.versionCommand);t==="permission-denied"&&(Bw(e.versionCommand[0]),t=Hd(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 Et(l.type).isAvailable()?l.type:null}catch{return null}}))).filter(l=>l!==null);if(n&&!qe(e.alias)){let{installedVersion:l,installMethod:c}=await Wd(e);await dt({alias:e.alias,name:e.name,installedVersion:l,installMethod:c,installedAt:null,lastChecked:new Date().toISOString()});}return {module:e,alreadyInstalled:n,availableStrategies:a}}function Hd(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 Bw(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=Se__default.realpathSync(r),{mode:o}=Se__default.statSync(n);Se__default.chmodSync(n,o|73);}catch{}}function Kw(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 Qd(e,t){let[r,n]=useState(()=>Kw(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}));},[]),c=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,h=m.upArrow||d==="[A",g=m.downArrow||d==="[B";if(h||g)h&&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 v=w.availableStrategies.indexOf(w.selectedStrategy??w.availableStrategies[0]),O=w.availableStrategies[(v+1)%w.availableStrategies.length];n(_=>_.map(E=>E.module.alias===w.module.alias?{...E,selectedStrategy:O}:E));}}},{isActive:t});let u=useMemo(()=>r.filter(d=>d.checked),[r]);return {items:r,focusedIndex:o,toggle:l,setStrategy:c,confirmedItems:u}}function tp({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}=Qd(e,r==="moduleSetup"),c=useCallback(()=>{o(false),s("moduleSetup");},[o,s]),u=useCallback(p=>{(p==="Install"||p==="Skip")&&t(l),c();},[l,t,c]);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 h=f===a,g=y(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:h?"cyan":void 0,children:[h?"\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: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(Ye,{itemName:m,actions:d,onAction:u,onClose:c})]})}var zw=/^https?:\/\/.+/;function rp({onConfirm:e}){let[t,r]=useState("confirm"),[n,o]=useState(""),[s,i]=useState(false),a=useRef("");return useInput((l,c)=>{if(t==="confirm"){if(l==="y"||l==="Y"){r("input");return}if(l==="n"||l==="N"||c.return){e(null);return}}if(t==="input"){if(c.escape){a.current="",o(""),r("confirm");return}if(c.return){let u=a.current.trim();u.length>0&&zw.test(u)?(i(false),e(u)):u.length>0&&i(true);return}if(c.backspace||c.delete){a.current=a.current.slice(0,-1),o(a.current);return}l&&!c.ctrl&&!c.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 Xw(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 sp(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=Xw(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 pr(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]),c=useMemo(()=>r.filter(d=>d.status==="failed").length,[r]),u=useMemo(()=>r.filter(d=>d.status==="skipped").length,[r]);return {modules:r,install:a,isComplete:o,installedCount:l,failedCount:c,skippedCount:u}}function ip({module:e}){let t=y(e.name);if(e.status==="installing")return jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Hu,{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 up({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:c}=sp(e,t),u=o.some(w=>w.pendingSetupCommand),d=useRef(false),m=useRef(false);useEffect(()=>{d.current||(d.current=true,s());},[s]);let p=useCallback(()=>{Ur().catch(()=>{}),n("list");let w=ne().some(v=>v.name===se);r(w?"main":"claudeMdSuggestion");},[n,r]);useEffect(()=>{if(i&&l===0&&!u&&!m.current){m.current=true;let w=setTimeout(p,1500);return ()=>clearTimeout(w)}},[i,l,u,p]),useInput((w,v)=>{v.return&&p();},{isActive:i});let f=o.filter(w=>w.pendingSetupCommand).length,h=a-f,g=[];return h>0&&g.push(jsxs(Text,{color:"green",children:[h," 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")),c>0&&g.push(jsxs(Text,{dimColor:true,children:[c," 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(ip,{module:w},w.alias))}),i&&jsxs(Fragment,{children:[jsx(Box,{paddingX:1,paddingBottom:1,children:g.reduce((w,v,O)=>(O>0&&w.push(jsx(Text,{children:" | "},`sep-${O}`)),w.push(v),w),[])}),jsx(Box,{paddingX:1,children:l>0||u?jsx(Text,{dimColor:true,children:"Press Enter to continue"}):jsx(Text,{dimColor:true,children:"Proceeding..."})})]})]})}function pp(){let[e,t]=useState("loading"),[r,n]=useState([]),[o,s]=useState([]),[i,a]=useState(null),l=S(p=>p.setFocus),c=S(p=>p.setScreen),u=useCallback(p=>{if(Zl(p)){Ur().catch(()=>{}),l("list");let h=ne().some(g=>g.name===se);c(h?"main":"claudeMdSuggestion");}else n(p),t("selection");},[l,c]);useEffect(()=>{let p=zd();if(p){u(p);return}An(re).then(u).catch(()=>{n([]),t("selection");});},[u]);let d=useCallback(p=>{s(p);let f=p.some(h=>h.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(tp,{probeResults:r,onConfirm:d}),e==="customUrl"&&jsx(rp,{onConfirm:m}),e==="installation"&&jsx(up,{confirmedItems:o,customUrl:i})]})}var sS=x("ClaudeMdSuggestion"),iS=[`Install ${se}`,"Skip for now"],aS=["Retry","Skip for now"];function gp(){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]),c=useCallback(()=>{b(I.CLI_CLAUDE_MD_SKIPPED,{interface:"tui"}).catch(()=>{}),l();},[l]),u=useCallback(async()=>{a.current+=1,b(I.CLI_CLAUDE_MD_ACCEPTED,{interface:"tui",attempt:a.current}).catch(()=>{}),o("installing");try{await $e(se),o("installed");}catch(m){if(m instanceof je){o("installed");return}sS.warn(`Failed to install ${se}: ${m instanceof Error?m.message:m}`),o("error");}},[]),d=n==="error"?aS:iS;return useInput((m,p)=>{if(p.escape){n==="prompt"||n==="error"?c():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),u()):c());return}n==="installed"&&p.return&&l();}),jsxs(Box,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[jsx(un,{}),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(fp,{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(Hu,{type:"dots"})}),jsxs(Text,{color:"cyan",children:[" Installing ",se,"..."]})]}),n==="installed"&&jsxs(Fragment,{children:[jsxs(Text,{color:"green",bold:true,children:["\u2713 ",se," 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:["/",se]})]}),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 ",se]}),jsx(fp,{options:d,cursorIndex:s}),jsx(Text,{dimColor:true,children:"You can always install it later from the catalog."})]})]})]})}function fp({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 dS=promisify(execFile),ti="@ciandt-flow/cli";async function hp(){let e=le;if(ka.prerelease(e)||process.env.NODE_ENV==="development")return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:ti};try{let t=await fetch(`https://registry.npmjs.org/${ti}/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:ti}}catch{return {currentVersion:e,latestVersion:e,isOutdated:false,packageName:ti}}}async function ri(e){try{return await dS(jt(),["install","-g",e.packageName],{timeout:6e4,shell:process.platform==="win32"}),{success:!0}}catch(t){return {success:false,error:String(t)}}}async function pS(e){let t=qe(e.alias);if(!t?.installMethod)return t?.installedVersion??null;try{let n=await Et(t.installMethod).getInstalledVersion(e);return n&&n!==t.installedVersion&&await dt({...t,installedVersion:n,lastChecked:new Date().toISOString()}),n??t.installedVersion}catch{return t.installedVersion}}async function yp(e){let t=await pS(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 wp(e,t){let r=qe(e.alias);if(!r?.installMethod)return {success:false,error:"Unknown install method"};let o=await Et(r.installMethod).update(e,t.currentVersion??"");return o.success?(await dt({...r,installedVersion:o.version??r.installedVersion,lastChecked:new Date().toISOString()}),{success:true,newVersion:o.version}):{success:false,error:o.error?.message}}function Sp(e){let r=qe(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 xp(){let[e,t]=useState({outcome:"running",items:[{id:"cli",label:"@ciandt-flow/cli",status:"pending"},...re.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([hp(),An(re),Promise.all(re.map(l=>yp(l)))]);if(qs(),o.isOutdated){r("cli",{status:"updating",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`}),(await ri(o)).success?(r("cli",{status:"updated",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`}),t(c=>({...c,outcome:"cli-updated"}))):(r("cli",{status:"error",detail:`v${o.currentVersion} \u2192 v${o.latestVersion}`,manualCommand:`npm install -g ${o.packageName}`}),t(c=>({...c,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 c=re.find(d=>d.alias===l.moduleAlias);if(!c)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 u=await wp(c,l);u.success?r(l.moduleAlias,{status:"updated",detail:`v${u.newVersion}`}):r(l.moduleAlias,{status:"error",detail:`v${l.currentVersion} \u2192 v${l.latestVersion}`,manualCommand:Sp(c)});}t(l=>({...l,items:l.items.map(c=>c.status==="pending"?{...c,status:"ok"}:c)})),await Ur(),t(l=>({...l,outcome:"done"}));}catch{await Ur(),t(o=>({...o,outcome:"done"}));}}n();},[r]),e}function wS({item:e}){return e.status==="pending"||e.status==="updating"?jsxs(Box,{children:[jsx(Text,{color:"cyan",children:jsx(Hu,{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 SS({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 Ip(){let{outcome:e,items:t}=xp(),r=S(o=>o.setScreen),n=S(o=>o.setFocus);return useEffect(()=>{if(e==="done"){let o=setTimeout(()=>{let s=ne().some(i=>i.name===se);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(wS,{item:o},o.id))}),e!=="running"&&jsx(Box,{marginTop:1,children:jsx(SS,{outcome:e})})]})}var vS={debug:"gray",info:"cyan",warn:"yellow",error:"red"},bp=10;function vp(){let[e,t]=useState(xi());useEffect(()=>Il(()=>{t([...xi()]);}),[]);let r=e.slice(-bp);return jsxs(Box,{flexDirection:"column",borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsxs(Text,{color:"cyan",bold:true,children:["Debug Log (last ",bp,") \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:vS[n.level],children:["[",n.level.toUpperCase(),"] [",n.module,"] ",n.message]},o))]})}var TS=x("app"),kS={auth:ac,starterKitSetup:Vd,moduleSetup:pp,claudeMdSuggestion:gp,verify:Ip,main:Md};function Cp(){let{setScreen:e,setFocus:t}=S.getState();e("auth"),t("auth");}function Xn(e){let{setScreen:t,setFocus:r}=S.getState();!e.starterKit||e.starterKit.trim()===""?(t("starterKitSetup"),r("starterKitList")):(t("verify"),r("verify"));}function Tp(){b(I.CLI_SESSION_STARTED,{cli_version:le,os:process.platform,node_version:process.version,duration_ms:Ft(),interface:"tui"}).catch(()=>{});}async function Ap(){let e=await ae();if(e&&Xl()&&await ir()){e.customUrl&&ar(e.customUrl);let{clientSecret:n,...o}=e;Xe.getState().setCredentials(o),Tp(),Xn(e);return}if(!e){Cp();return}try{e.customUrl&&ar(e.customUrl),await lr();}catch(n){TS.debug(`Token validation failed: ${String(n)}`),Cp();return}Tp();let{clientSecret:t,...r}=e;Xe.getState().setCredentials(r),Xn(e);}function $p(){let{columns:e,rows:t}=useWindowSize(),r=S(a=>a.screen),n=kS[r],{pendingExit:o}=Jl(),s=S(a=>a.debugPanelOpen),i=!!process.env.DEBUG;return useInput((a,l)=>{if(i&&l.ctrl&&a==="d"){let c=S.getState().debugPanelOpen;S.getState().setDebugPanelOpen(!c);}}),n?jsxs(Box,{flexDirection:"column",width:e,height:t,children:[jsx(n,{}),i&&s&&jsx(vp,{}),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]})}async function el(e,t={}){let r=Zo({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant},t);return Qo(r),await Bt(e),{jwt:r.jwt,previousToken:r.previousToken,hadExistingFile:r.hadExistingFile}}var xt=x("auth");function Lp(){Be.clearFallbackFile(),Jo();}var AS=3,Mp=3,Rp=` \u2139 The data collected during setup is used solely to improve
|
|
117
117
|
Flow's internal tools and will not be shared externally.
|
|
118
118
|
`;function er(e,t={}){return new Promise((r,n)=>{let{masked:o=false,defaultValue:s=""}=t;process.stdout.write(e+s);let i=s,a=u=>{if(u===""){l(),n(new Error("SIGINT"));return}if(u==="\r"||u===`
|
|
119
119
|
`){l(),process.stdout.write(`
|
|
120
|
-
`),r(i);return}if(u==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}u.startsWith("\x1B")||(i+=u,process.stdout.write(o?"*".repeat(u.length):u));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",a),process.removeListener("uncaughtException",c),process.removeListener("unhandledRejection",c),process.removeListener("SIGINT",c),process.removeListener("SIGTERM",c);}function c(){try{process.stdin.setRawMode(!1);}catch{}}process.on("uncaughtException",c),process.on("unhandledRejection",c),process.on("SIGINT",c),process.on("SIGTERM",c),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",a);})}async function
|
|
120
|
+
`),r(i);return}if(u==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}u.startsWith("\x1B")||(i+=u,process.stdout.write(o?"*".repeat(u.length):u));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",a),process.removeListener("uncaughtException",c),process.removeListener("unhandledRejection",c),process.removeListener("SIGINT",c),process.removeListener("SIGTERM",c);}function c(){try{process.stdin.setRawMode(!1);}catch{}}process.on("uncaughtException",c),process.on("unhandledRejection",c),process.on("SIGINT",c),process.on("SIGTERM",c),process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",a);})}async function $S(){let e=_r();return process.stdout.write(`
|
|
121
121
|
`+k.yellow(" \u26A0 ")+`${y(e)} contains invalid JSON.
|
|
122
|
-
`),(await er(k.cyan(" ? ")+"Overwrite it with a fresh file containing only the auth token? (y/N): ")).trim().toLowerCase()==="y"}async function
|
|
123
|
-
`));}}async function
|
|
122
|
+
`),(await er(k.cyan(" ? ")+"Overwrite it with a fresh file containing only the auth token? (y/N): ")).trim().toLowerCase()==="y"}async function _p(e,t){try{await el(e);return}catch(r){if(!(r instanceof Dr))throw r;if(!t)throw new Error(`${r.message}. Fix or remove ${_r()} and retry.`);if(!await $S())throw new Error("Setup cancelled: settings.json must be valid JSON to continue");await el(e,{allowOverwriteMalformed:true});}}async function MS(){if((await er(k.cyan(" ? ")+"Does your organization use a custom Flow URL? (y/N): ")).trim().toLowerCase()!=="y")return null;for(;;){let t=(await er(k.cyan(" ? ")+"Enter custom Flow URL: ")).trim();if(Zr.test(t))return t;process.stderr.write(k.yellow(` \u26A0 ${Qr}. Try again.
|
|
123
|
+
`));}}async function Dp(e){process.stdout.write(k.dim(" Installing flow-ai-obs..."));let{npmFailed:t,initFailed:r,unexpectedError:n}=await Wn(e);return t?process.stdout.write(k.yellow(` \u26A0 npm install failed. Please contact Flow support.
|
|
124
124
|
`)):n?process.stdout.write(k.yellow(` \u26A0 Unexpected error. Please contact Flow support.
|
|
125
125
|
`)):r?process.stdout.write(k.yellow(`
|
|
126
126
|
\u26A0 flow-ai-obs could not be initialized \u2014 domain authentication failure. Please contact support.
|
|
127
127
|
`)):process.stdout.write(k.green(` done
|
|
128
|
-
`)),{initFailed:r}}async function
|
|
128
|
+
`)),{initFailed:r}}async function Op(){for(let e=1;e<=Mp;e++)try{return await bs()}catch{if(e===Mp)throw new Error("Failed to fetch starter kits after 3 attempts")}return []}async function Up(){let e=await Op();if(e.length===0)throw new Error("No starter kits available. Please contact your administrator.");for(process.stdout.write(`
|
|
129
129
|
`+k.cyan(" ? ")+`Starter Kit:
|
|
130
130
|
`),e.forEach((t,r)=>{process.stdout.write(` ${k.cyan(`${r+1})`)} ${y(t.name)}
|
|
131
131
|
`);}),process.stdout.write(`
|
|
132
132
|
`);;){let t=(await er(k.cyan(" ? ")+`Select starter kit (1-${e.length}): `)).trim(),r=parseInt(t,10)-1;if(!isNaN(r)&&r>=0&&r<e.length)return e[r];process.stderr.write(k.yellow(` \u26A0 Invalid selection. Please try again.
|
|
133
|
-
`));}}async function
|
|
133
|
+
`));}}async function Np(e){if(e.plugins.length===0)return process.stdout.write(k.dim(`
|
|
134
134
|
Starter kit '${y(e.name)}' has no plugins to install.
|
|
135
135
|
`)),true;process.stdout.write(`
|
|
136
136
|
Installing ${e.plugins.length} plugins from '${y(e.name)}'...
|
|
137
|
-
`);let t=0,r=0,n=e.plugins.length;for(let o of e.plugins){let s=t+r+1;process.stdout.write(k.dim(` [${s}/${n}] Installing ${y(o)}...`));let i=false;for(let a=1;a<=
|
|
137
|
+
`);let t=0,r=0,n=e.plugins.length;for(let o of e.plugins){let s=t+r+1;process.stdout.write(k.dim(` [${s}/${n}] Installing ${y(o)}...`));let i=false;for(let a=1;a<=AS;a++)try{await $e(o),t++,i=!0;break}catch(l){if(l instanceof je){t++,i=true;break}}i?process.stdout.write(k.green(` done
|
|
138
138
|
`)):(r++,process.stdout.write(k.red(` failed
|
|
139
139
|
`)));}return r===0?process.stdout.write(k.green(` \u2713 Starter kit '${y(e.name)}' selected. ${t}/${n} plugins installed successfully.
|
|
140
140
|
`)):process.stdout.write(k.yellow(` \u26A0 Starter kit '${y(e.name)}' selected. ${t}/${n} plugins installed. ${r} failed.
|
|
141
|
-
`)),r===0}async function
|
|
141
|
+
`)),r===0}async function Bp(){process.stdout.write(`
|
|
142
142
|
`),process.stdout.write(k.bold(` Personalize your Claude Code
|
|
143
143
|
`)),process.stdout.write(k.dim(` This plugin helps Claude understand your preferences and work style.
|
|
144
144
|
|
|
@@ -152,93 +152,93 @@ This will run: ${s}
|
|
|
152
152
|
`),process.stdout.write(` Open Claude in a new terminal or in VS Code and type:
|
|
153
153
|
`),process.stdout.write(k.cyan.bold(` /${se}
|
|
154
154
|
`)),process.stdout.write(` Claude will guide you through the rest.
|
|
155
|
-
`);}async function
|
|
155
|
+
`);}async function LS(e){if(Lp(),e.customUrl!==void 0&&!Zr.test(e.customUrl))return process.stderr.write(k.red(` \u2717 ${Qr}.
|
|
156
156
|
`)),1;process.stdout.write(`
|
|
157
|
-
`+
|
|
158
|
-
`),xt.debug(`[${e.tenant}] Authenticating tenant`);try{await
|
|
159
|
-
`)),1}let{initFailed:t}=await
|
|
157
|
+
`+Rp+`
|
|
158
|
+
`),e.customUrl&&ar(e.customUrl),xt.debug(`[${e.tenant}] Authenticating tenant`);try{await Mr(e);}catch(r){let n=y(r instanceof Error?r.message:"unknown error");return xt.debug(`[${e.tenant}] Authentication failed: ${n}`),process.stderr.write(k.red(` \u2717 Authentication failed: ${n}
|
|
159
|
+
`)),1}let{initFailed:t}=await Dp(e.customUrl??null);try{let r;if(e.starterKit){let n=await Op(),o=n.find(s=>s.slug===e.starterKit);if(!o){process.stderr.write(k.red(` \u2717 Starter kit '${y(e.starterKit)}' not found.
|
|
160
160
|
`)),process.stderr.write(` Available starter kits:
|
|
161
161
|
`);for(let s of n)process.stderr.write(` - ${y(s.slug)} (${y(s.name)})
|
|
162
|
-
`);return 1}r=o;}else r=await
|
|
163
|
-
\u2713 Setup complete. Tenant: ${e.tenant}. JWT written to ${
|
|
162
|
+
`);return 1}r=o;}else r=await Up();return await _p({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant,starterKit:r.slug,customUrl:e.customUrl},!1),await Np(r),await Bp(),xt.info(`[${e.tenant}] Authentication successful`),process.stdout.write(k.green(`
|
|
163
|
+
\u2713 Setup complete. Tenant: ${e.tenant}. JWT written to ${_r()}.
|
|
164
164
|
`)),t&&e.customUrl&&process.stdout.write(k.yellow(` \u26A0 Custom URL was not written to settings.json \u2014 flow-ai-obs authentication failed for ${y(e.customUrl)}.
|
|
165
165
|
`)),process.stdout.write(`
|
|
166
166
|
`),0}catch(r){if(r instanceof Error&&r.message==="SIGINT")throw r;let n=y(r instanceof Error?r.message:"unknown error");return xt.error(`[${e.tenant}] Starter kit setup failed: ${n}`),process.stderr.write(k.red(` \u2717 Starter kit setup failed: ${n}
|
|
167
|
-
`)),1}}async function
|
|
168
|
-
`),process.stdout.write(
|
|
167
|
+
`)),1}}async function RS(e){Lp(),xt.debug("[auth] Starting interactive authentication");try{process.stdout.write(`
|
|
168
|
+
`),process.stdout.write(Rp+`
|
|
169
169
|
`);let t=(await er(k.cyan(" ? ")+"Client ID: ")).trim(),r=(await er(k.cyan(" ? ")+"Client Secret: ",{masked:!0})).trim(),n=(await er(k.cyan(" ? ")+"Tenant: ")).trim();if(!t||!r||!n)return xt.error("[auth] Validation failed: all fields are required"),process.stderr.write(k.red(` \u2717 All fields are required
|
|
170
|
-
`)),1;let o=e??await
|
|
171
|
-
`)),1}let{initFailed:s}=await
|
|
172
|
-
\u2713 Setup complete. Tenant: ${n}. JWT written to ${
|
|
170
|
+
`)),1;let o=e??await MS();o&&ar(o),xt.debug(`[${n}] Authenticating tenant`);try{await Mr({clientId:t,clientSecret:r,tenant:n});}catch(a){let l=y(a instanceof Error?a.message:"unknown error");return xt.error(`[${n}] Authentication failed: ${l}`),process.stderr.write(k.red(` \u2717 Authentication failed: ${l}
|
|
171
|
+
`)),1}let{initFailed:s}=await Dp(o),i=await Up();return await _p({clientId:t,clientSecret:r,tenant:n,starterKit:i.slug,customUrl:o??void 0},!0),await Np(i),await Bp(),xt.info(`[${n}] Authentication successful`),process.stdout.write(k.green(`
|
|
172
|
+
\u2713 Setup complete. Tenant: ${n}. JWT written to ${_r()}.
|
|
173
173
|
`)),s&&o&&process.stdout.write(k.yellow(` \u26A0 Custom URL was not written to settings.json \u2014 flow-ai-obs authentication failed for ${y(o)}.
|
|
174
174
|
`)),process.stdout.write(`
|
|
175
175
|
`),0}catch(t){if(t instanceof Error&&t.message==="SIGINT")throw t;let r=y(t instanceof Error?t.message:"unknown error");return xt.error(`[auth] Unexpected error: ${r}`),process.stderr.write(k.red(` \u2717 Unexpected error: ${r}
|
|
176
|
-
`)),1}}async function
|
|
177
|
-
`)),1;try{return await
|
|
178
|
-
`),130;throw t}}async function
|
|
176
|
+
`)),1}}async function tl(e={}){if(e.clientId&&e.clientSecret&&e.tenant)return LS({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant,starterKit:e.starterKit,customUrl:e.customUrl});if(e.customUrl!==void 0&&!Zr.test(e.customUrl))return process.stderr.write(k.red(` \u2717 ${Qr}.
|
|
177
|
+
`)),1;try{return await RS(e.customUrl)}catch(t){if(t instanceof Error&&t.message==="SIGINT")return process.stdout.write(`
|
|
178
|
+
`),130;throw t}}async function _S(){try{return process.stdout.write(`
|
|
179
179
|
`),(await er(k.cyan(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(k.yellow(` \u26A0 Logout cancelled
|
|
180
180
|
`)),0):null}catch(e){if(e instanceof Error&&e.message==="SIGINT")return process.stdout.write(`
|
|
181
|
-
`),130;throw e}}async function
|
|
182
|
-
`)),0;if(!e){let t=await
|
|
181
|
+
`),130;throw e}}async function Fp(e){if(!await ae())return process.stdout.write(k.yellow(` \u26A0 You are not authenticated
|
|
182
|
+
`)),0;if(!e){let t=await _S();if(t!==null)return t}try{return await $l(),process.stdout.write(k.green(` \u2713 Credentials removed successfully
|
|
183
183
|
`)),0}catch{return process.stderr.write(k.red(` \u2717 Error removing credentials
|
|
184
|
-
`)),1}}async function
|
|
184
|
+
`)),1}}async function jp(){let e=await ae();return e?await ir()?(process.stdout.write(`
|
|
185
185
|
`+k.bold(` Authenticated
|
|
186
186
|
`)),process.stdout.write(k.dim(" Tenant: ")+y(e.tenant)+`
|
|
187
187
|
`),process.stdout.write(k.dim(" Client ID: ")+y(e.clientId)+`
|
|
188
188
|
`),process.stdout.write(k.dim(" Starter Kit: ")+y(e.starterKit??"not set")+`
|
|
189
|
-
`),process.stdout.write(k.dim(" Config: ")+y(await
|
|
189
|
+
`),process.stdout.write(k.dim(" Config: ")+y(await Ml())+`
|
|
190
190
|
`),process.stdout.write(`
|
|
191
|
-
`),0):(process.stdout.write(k.yellow(" \u26A0 Session expired. Run `flow auth login` to re-authenticate.\n")),0):(process.stdout.write(k.yellow(" \u26A0 Not authenticated. Run `flow auth login` to set up.\n")),0)}async function
|
|
191
|
+
`),0):(process.stdout.write(k.yellow(" \u26A0 Session expired. Run `flow auth login` to re-authenticate.\n")),0):(process.stdout.write(k.yellow(" \u26A0 Not authenticated. Run `flow auth login` to set up.\n")),0)}async function DS(e){let t=ne(),r;try{r=await gr();}catch{r=[];}let n=new Set(t.map(o=>o.name));return b(I.CLI_CATALOG_VIEWED,{interface:X().interfaceType,filter_type:"available",result_count:r.length}).catch(()=>{}),e.json?(on(r.map(o=>({...o,installed:n.has(o.name)}))),0):(nn(["","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 OS(e){let t=ne(),r=await gr(),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&&Re(s.version,i.version)?{...s,availableVersion:i.version}:null}).filter(s=>s!==null);return b(I.CLI_CATALOG_VIEWED,{interface:X().interfaceType,filter_type:"outdated",result_count:o.length}).catch(()=>{}),o.length===0?(C("All plugins are up to date."),0):e.json?(on(o),0):(nn(["Name","Installed","Available"],o.map(s=>[s.name??"",s.version??"n/a",s.availableVersion??"n/a"])),process.stdout.write(`
|
|
192
192
|
${o.length} plugin(s) outdated.
|
|
193
|
-
`),0)}async function
|
|
193
|
+
`),0)}async function US(e){let t=ne();if(b(I.CLI_CATALOG_VIEWED,{interface:X().interfaceType,filter_type:"all",result_count:t.length}).catch(()=>{}),t.length===0)return C("No plugins installed. Use `flow plugin install <name>` to install one."),0;if(e.json)return on(t),0;let r=[];try{r=await gr();}catch{r=[];}let n=new Map(r.map(s=>[s.name,s])),o=[...t].sort((s,i)=>{let a=So.indexOf(s.scope??"user"),l=So.indexOf(i.scope??"user");return (a===-1?1/0:a)-(l===-1?1/0:l)});return nn(["Name","Version","Type","Origin","Scope","Status","Installed at"],o.map(s=>{let i=n.get(s.name),a=i?.type??"bundle",l=i?.origin??$a(s.marketplace);return [s.name??"",s.version??"n/a",Yr[a]?.label??"Plugin",l,s.scope??"user",s.status??"enabled",nr(s.installedAt??"")]})),process.stdout.write(`
|
|
194
194
|
${t.length} plugin(s) installed.
|
|
195
|
-
`),0}async function
|
|
195
|
+
`),0}async function Kp(e){if(!await we())return 1;try{return e.available?await DS(e):e.outdated?await OS(e):await US(e)}catch(t){return P(t instanceof Error?t.message:"Failed to list plugins."),1}}var ce=x("manage");function oi(e,t){return t?ne().find(r=>r.name===e&&r.scope===t):ne().find(r=>r.name===e)}function NS(e,t){let r=t;return {callbacks:{onStatus:o=>{r&&(r.text=`${e}${o}`);},onError:o=>{r?.stop(),r=void 0,C(`${e}${o}`);},onPause:()=>{r?.stop(),r=void 0;},onResume:o=>{r?.stop(),r=rl({text:`${e}${o}`}).start();}},stopSpinner:()=>{r?.stop(),r=void 0;}}}async function BS(e,t,r,n){let o=n;if(!r.force){o?.stop();let i=y(e),a=y(gn(e,r.scope));if(!await kt(`${t}Install external plugin "${i}"?
|
|
196
196
|
This will run: ${a}
|
|
197
|
-
[y/N] `))return ce.debug(`[${e}] Installation cancelled by user`),r.silent||C(`${t}Skipped ${e} (cancelled).`),{name:e,success:true};r.silent||(o=
|
|
198
|
-
Installation summary: ${t} succeeded, ${r} failed`);}async function
|
|
199
|
-
Update summary: ${t} updated, ${r} already up to date, ${n} failed`);}async function
|
|
197
|
+
[y/N] `))return ce.debug(`[${e}] Installation cancelled by user`),r.silent||C(`${t}Skipped ${e} (cancelled).`),{name:e,success:true};r.silent||(o=rl({text:`${t}Installing ${e}...`}).start());}let s=o?NS(t,o):void 0;try{let i=await pd(e,r.marketplaceSource,s?.callbacks,r.scope);if(s?.stopSpinner(),i.exitCode!==0){let a=i.stderr||"Command failed";return r.silent?We({status:"error",plugin:e,message:a}):P(`${t}Failed to install "${e}": ${a}`),{name:e,success:!1,error:a}}return r.silent?Ne({status:"success",plugin:e,command:i.command,duration_ms:i.duration_ms}):ie(`${t}${e} installed successfully (via proxy)`),{name:e,success:!0,duration_ms:i.duration_ms}}catch(i){s?.stopSpinner();let a=te(i);return r.silent?We({status:"error",plugin:e,message:a}):P(`${t}Failed to install "${e}": ${a}`),{name:e,success:false,error:a}}}async function FS(e,t,r){let n=r.silent?void 0:rl({text:`${t}Installing ${e}...`}).start();if(mn(e))return BS(e,t,r,n);try{let o=await $e(e,{...r,onDownloadProgress:r.silent?void 0:(s,i)=>{if(!n||i===0)return;let{bar:a,percent:l,label:c}=ps(s,i);n.text=`${t}Downloading ${e}... ${a} ${l}% (${c})`;}});return n?.stop(),r.silent?Ne({status:"success",plugin:e,version:o.version,duration_ms:o.duration_ms}):ie(`${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 je)return r.silent?Ne({status:"already_installed",plugin:e,message:o.message}):C(`${t}${o.message}`),{name:e,success:true};let s=te(o);return r.silent?We({status:"error",plugin:e,message:s}):P(`${t}Failed to install "${e}": ${s}`),{name:e,success:false,error:s}}}function jS(e){let t=e.filter(n=>n.success).length,r=e.filter(n=>!n.success).length;C(`
|
|
198
|
+
Installation summary: ${t} succeeded, ${r} failed`);}async function si(e,t={}){if(!await we())return 1;let r=[];for(let n=0;n<e.length;n++){let o=e.length>1?`[${n+1}/${e.length}] `:"",s=await FS(e[n],o,t);r.push(s);}return e.length>1&&(t.silent?Ne({status:"summary",succeeded:r.filter(n=>n.success).length,failed:r.filter(n=>!n.success).length,results:r.map(n=>({plugin:n.name,success:n.success,...n.error?{error:n.error}:{}}))}):jS(r)),r.some(n=>!n.success)?1:0}async function Vp(e,t){if(!await we())return 1;if(ce.debug(`[${e}] Looking up installed plugin`),!t.force){let r=oi(e,t.scope);if(!r)return ce.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 kt(`Remove ${n} ${o?`v${o}`:"(n/a)"}${s}? [y/N] `))return ce.debug(`[${e}] Uninstall cancelled by user`),C("Operation cancelled."),0}try{return ce.debug(`[${e}] Uninstalling plugin${t.scope?` (scope: ${t.scope})`:""}`),await ro(e,t.scope),ce.info(`[${e}] Uninstalled successfully`),ie("Plugin removed successfully"),0}catch(r){return ce.error(`[${e}] Failed to uninstall: ${te(r)}`),P(te(r)),1}}async function Hp(e,t={}){if(!await we())return 1;ce.debug(`[${e}] Looking up installed plugin`);let r=oi(e,t.scope);if(!r)return ce.error(`[${e}] Plugin is not installed`),P(`Plugin "${e}" is not installed`),1;if(r.status==="enabled")return ce.debug(`[${e}] Already enabled, skipping`),C(`${r.name} is already enabled`),0;try{return ce.debug(`[${e}] Enabling plugin (current status: ${r.status})`),await no(e,"enabled",t.scope),ce.info(`[${e}] Enabled successfully`),ie(`${r.name} enabled successfully`),0}catch(n){return ce.error(`[${e}] Failed to enable: ${te(n)}`),P(te(n)),1}}async function Jp(e,t={}){if(!await we())return 1;ce.debug(`[${e}] Looking up installed plugin`);let r=oi(e,t.scope);if(!r)return ce.error(`[${e}] Plugin is not installed`),P(`Plugin "${e}" is not installed`),1;if(r.status==="disabled")return ce.debug(`[${e}] Already disabled, skipping`),C(`${r.name} is already disabled`),0;try{return ce.debug(`[${e}] Disabling plugin (current status: ${r.status})`),await no(e,"disabled",t.scope),ce.info(`[${e}] Disabled successfully`),ie(`${r.name} disabled successfully`),0}catch(n){return ce.error(`[${e}] Failed to disable: ${te(n)}`),P(te(n)),1}}async function Gp(e,t,r){r.silent||C(`${t}Updating ${e}...`);try{let n=await Ns(e,r);return r.silent?Ne({status:"updated",plugin:n.name,previousVersion:n.previousVersion,newVersion:n.newVersion,duration_ms:n.duration_ms}):ie(`${t}${n.name} v${n.previousVersion} \u2192 v${n.newVersion}`),{name:e,success:!0}}catch(n){if(n instanceof fr)return r.silent?Ne({status:"up_to_date",plugin:e,message:n.message}):C(`${t}${n.message}`),{name:e,success:true,skipped:true};let o=te(n);return r.silent?We({status:"error",plugin:e,message:o}):P(`${t}Failed to update ${e}: ${o}`),{name:e,success:false,error:o}}}function KS(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;C(`
|
|
199
|
+
Update summary: ${t} updated, ${r} already up to date, ${n} failed`);}async function VS(e,t,r){try{let n=await yn(e);Re(t,n.version,r.force)?C(`Would update ${e}: v${t} \u2192 v${n.version}`):C(`${e} is already up to date (v${t})`);}catch(n){return P(te(n)),1}return 0}function HS(e){return new Map(e.filter(t=>!!t.version).map(t=>[t.name,t.version]))}function JS(e,t,r){let n=t.get(e.name);return n?e.version&&Re(e.version,n,r)?(C(`Would update ${e.name}: v${e.version} \u2192 v${n}`),true):(C(`${e.name} is already up to date (${e.version?`v${e.version}`:"n/a"})`),false):(C(`Skipping ${e.name}: not found in catalog`),false)}async function GS(e,t){try{let r=await gr(),n=HS(r),o=0;for(let s of e)JS(s,n,t.force)&&o++;o===0&&C("All plugins are up to date");}catch(r){return P(te(r)),1}return 0}async function zS(e,t){let r=[];for(let n=0;n<e.length;n++){let o=`[${n+1}/${e.length}] `,s=await Gp(e[n].name,o,t);r.push(s);}return t.silent?Ne({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}:{}}))}):KS(r),r.some(n=>!n.success)?1:0}async function zp(e,t={}){if(!await we())return 1;if(e){let o=oi(e,t.scope);return o?t.dryRun?VS(e,o.version??"",t):(await Gp(e,"",t)).success?0:1:(t.silent?We({status:"error",plugin:e,message:`Plugin "${e}" is not installed`}):P(`Plugin "${e}" is not installed`),1)}let n=ne().filter(o=>o.marketplace===Y);return n.length===0?(t.silent?Ne({status:"empty",message:"No plugins installed"}):C("No plugins installed"),0):t.dryRun?GS(n,t):zS(n,t)}var Po=x("cli:bundle");function WS(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 XS(e,t){let r=t.filter(o=>o.available).length,n=t.length-r;process.stdout.write(`
|
|
200
200
|
Bundle: ${y(e)} (${t.length} artifacts)
|
|
201
|
-
`);for(let o of t)process.stdout.write(`${
|
|
201
|
+
`);for(let o of t)process.stdout.write(`${WS(o)}
|
|
202
202
|
`);process.stdout.write(`
|
|
203
203
|
${r} available for installation`),n>0&&process.stdout.write(` | ${n} unavailable`),process.stdout.write(`
|
|
204
204
|
|
|
205
|
-
`);}async function
|
|
205
|
+
`);}async function Wp(e){if(!e.trim())return P("Bundle name cannot be empty."),1;if(!await we())return 1;Po.debug(`Fetching bundle "${e}"`);let r;try{r=await Ks(e);}catch(a){return a instanceof Tn||a instanceof wo?(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(Po.debug(`Bundle "${r.title}" \u2014 ${n.length} artifact(s), ${o.length} available`),XS(r.title,n),o.length===0)return P("No artifacts available for installation in this bundle."),1;if(!await kt(`Install ${o.length} artifact(s)? [Y/n] `))return Po.debug("Installation cancelled by user"),0;Po.debug(`Starting installation of ${o.length} artifact(s)`);let i=await _s(r,{onProgress:({index:a,total:l,artifact:c,success:u,error:d})=>{let m=y(c.name??c.flowId),p=y(c.type??"unknown"),f=u?"\u2713":`\u2717 (${y(d??"failed")})`;a===1&&process.stdout.write(`
|
|
206
206
|
`),process.stdout.write(`[${a}/${l}] Installing ${m} (${p})... ${f}
|
|
207
207
|
`),a===l&&process.stdout.write(`
|
|
208
|
-
`);}});if(
|
|
208
|
+
`);}});if(Po.debug(`Installation complete \u2014 ${i.installed} installed, ${i.failed} failed, ${i.skipped} skipped`),i.installed>0&&ie(`${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(", ");C(`${i.skipped} unavailable: ${a}`);}return 0}var Xp=x("marketplace");function YS(e){return `claude plugin marketplace add ${e}`}async function qp(e,t){if(!await we())return 1;let r;try{r=xs(e);}catch(s){let i=te(s);return t.silent?We({status:"error",source:e,message:i}):P(i),1}Xp.debug(`[marketplace] Adding marketplace source: ${r}`);let n=YS(r);if(!t.force){let s=y(r),i=y(n);if(!await kt(`Add marketplace "${s}"?
|
|
209
209
|
This will run: ${i}
|
|
210
|
-
[y/N] `))return
|
|
210
|
+
[y/N] `))return Xp.debug("[marketplace] Operation cancelled by user"),C("Operation cancelled."),0}let o=t.silent?void 0:rl({text:`Adding marketplace "${y(r)}"...`}).start();try{let s=await Pe(n);return o?.stop(),s.exitCode!==0?(t.silent?We({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&&C(`stdout: ${s.stdout}`)),1):(t.silent?Ne({status:"success",source:r,command:n,duration_ms:s.duration_ms}):(ie(`Marketplace "${r}" added successfully`),t.verbose&&s.stdout&&C(s.stdout)),0)}catch(s){o?.stop();let i=te(s);return t.silent?We({status:"error",source:r,message:i}):P(`Failed to add marketplace "${r}": ${i}`),1}}async function tx(){return await ae()?{passed:true,message:"Credentials configured"}:{passed:false,message:"Credentials not configured \u2014 Run `flow auth login`"}}async function rx(){let e=Date.now();try{await gr();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 nx(){return await ir()?{passed:true,message:"Token is valid"}:{passed:false,message:"Token expired \u2014 run `flow auth login` to re-authenticate"}}function ox(){let e=join(homedir(),".claude","settings.json");return existsSync(e)?{passed:true,message:"Claude Code detected"}:{passed:false,message:"Claude Code not detected"}}async function Yp(){process.stdout.write(`
|
|
211
211
|
`+k.bold(` FlowSetup CLI Diagnostics
|
|
212
212
|
|
|
213
|
-
`));let e=[{name:"Credentials",fn:
|
|
213
|
+
`));let e=[{name:"Credentials",fn:tx},{name:"Prompt Manager",fn:rx},{name:"Valid Token",fn:nx},{name:"Claude Code",fn:ox}],t=true;for(let r of e){let n=await r.fn(),o="",s=k.green;n.passed?o=k.green("[OK] "):(o=k.red("[FAIL]"),s=k.red,t=false);let i=` ${o} ${s(r.name.padEnd(18))} ${y(n.message)}`;process.stdout.write(i+`
|
|
214
214
|
`);}return process.stdout.write(`
|
|
215
215
|
`),t?(process.stdout.write(k.green(` \u2713 All checks passed!
|
|
216
216
|
|
|
217
217
|
`)),0):(process.stdout.write(k.red(` \u2717 Some checks failed \u2014 verify your configuration
|
|
218
218
|
|
|
219
|
-
`)),1)}var
|
|
220
|
-
`,"utf-8");}async function
|
|
219
|
+
`)),1)}var ax=["github.com","www.github.com"],lx=/^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.@-]+)(\/.*)?$/,cx=/^([^@]+)@(.+)$/;function ux(e){return !!(isAbsolute(e)||e==="."||e===".."||e.startsWith("./")||e.startsWith("../")||e.startsWith(".\\")||e.startsWith("..\\")||/^[a-zA-Z]:[/\\]/.test(e))}function nl(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 dx(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=nl(s);}}else if(t.length>2){let s=t.slice(2).join("/");o.subpath=nl(s);}return e.hash&&e.hash.length>1&&(o.ref=decodeURIComponent(e.hash.slice(1))),o}function ii(e){let t=e.trim();if(!t)throw new Error("Skill source cannot be empty.");if(ux(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:")&&ax.includes(r.hostname))return dx(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(lx);if(s){let i=s[1],a=s[2],l=s[3],c,u=a.match(cx);u&&(a=u[1],c=u[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),c&&(d.skillFilter=c),l){let m=l.replace(/^\//,"");m&&(d.subpath=nl(m));}return d}}return {type:"git",url:t}}function ai(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 Zp(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 sl=new Set(["node_modules",".git","dist","build","__pycache__"]);function tm(e,t){let r=normalize(resolve(e)),n=normalize(resolve(t));return n.startsWith(r+sep)||n===r}function hx(e,t){let r=normalize(resolve(e)),n=normalize(resolve(join(e,t)));return n.startsWith(r+sep)||n===r}async function ol(e){try{let t=join(e,"SKILL.md");return (await stat(t)).isFile()}catch{return false}}async function Eo(e){try{let t=await readFile(e,"utf-8"),{data:r}=Zp(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 rm(e,t=0,r=5){if(t>r)return [];try{let[n,o]=await Promise.all([ol(e),readdir(e,{withFileTypes:!0}).catch(()=>[])]),s=n?[e]:[],i=await Promise.all(o.filter(a=>a.isDirectory()&&!sl.has(a.name)).map(a=>rm(join(e,a.name),t+1,r)));return [...s,...i.flat()]}catch{return []}}async function ui(e,t){let r=[],n=new Set;if(t&&!hx(e,t))throw new Error(`Invalid subpath: "${t}" resolves outside the repository directory.`);let o=t?join(e,t):e;if(await ol(o)){let i=await Eo(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 c=join(i,l.name);if(await ol(c)){let u=await Eo(join(c,"SKILL.md"));u&&!n.has(u.name)&&(r.push(u),n.add(u.name));}}}catch{}if(r.length===0){let i=await rm(o);for(let a of i){let l=await Eo(join(a,"SKILL.md"));l&&!n.has(l.name)&&(r.push(l),n.add(l.name));}}return r}function nm(e,t){let r=t.map(n=>n.toLowerCase());return e.filter(n=>{let o=n.name.toLowerCase();return r.some(s=>s===o)})}var im=1,bx={retries:5,minTimeout:50};async function am(e,t){mkdirSync(dirname(e),{recursive:true});let r=await rg.lock(e+".lock",{realpath:false,retries:bx});try{return await t()}finally{await r();}}function om(){return {version:im,skills:{}}}async function di(e){let t=Un(e);try{let r=await readFile(t,"utf-8"),n=JSON.parse(r);return !n.version||n.version<im?om():n}catch{return om()}}function vx(e){let t={};for(let r of Object.keys(e).sort())t[r]=e[r];return t}async function lm(e,t){let r=Un(t);await mkdir(dirname(r),{recursive:true});let n={version:e.version,skills:vx(e.skills)};await writeFile(r,JSON.stringify(n,null,2)+`
|
|
220
|
+
`,"utf-8");}async function cm(e,t,r){let n=Un(r);await am(n,async()=>{let o=await di(r),s=new Date().toISOString(),i=o.skills[e];o.skills[e]={...t,installedAt:i?.installedAt??s,updatedAt:s},await lm(o,r);});}async function um(e,t){let r=Un(t);await am(r,async()=>{let n=await di(t);e in n.skills&&(delete n.skills[e],await lm(n,t));});}var dm=x("skillInstaller");async function $x(e,t,r,n){try{await b(I.CLI_TOOL_INSTALLED,{tool_id:e,tool_type:"skill",source:"external",scope:t,version:r,duration_ms:n,interface:X().interfaceType});}catch(o){dm.warn(`Failed to send skill install metrics: ${String(o)}`);}}async function Mx(e,t){try{await b(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:X().interfaceType});}catch(r){dm.warn(`Failed to send skill install-failed metrics: ${String(r)}`);}}async function Lx(e,t){await cp(e,t,{recursive:true,dereference:true,filter:r=>!sl.has(basename(r))});}async function Rx(e,t,r){let n=tt(e.name),o=kr(t),s=join(o,n);if(!tm(o,s))return {skill:e.name,success:false,path:s,error:`Unsafe install path: "${s}" escapes skills directory`};try{await rm$1(s,{recursive:!0,force:!0}),await mkdir(s,{recursive:!0}),await Lx(e.path,s);let a=ai(r)??r.url;return await cm(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 pm(e,t){let r=ii(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 At(r.url,r.ref),o=n;let s=await ui(o,r.subpath),i=[...t.skillFilter??[]];r.skillFilter&&i.push(r.skillFilter);let a=i.length>0?nm(s,i):s,l=[],c=r.ref??"latest";for(let u of a){let d=Date.now(),m=await Rx(u,t.scope,r);l.push(m);let p=Date.now()-d;m.success?await $x(u.name,t.scope,c,p):await Mx(u.name,new Error(m.error??"Unknown error"));}return {source:e,results:l,discovered:s.length,installed:l.filter(u=>u.success).length,failed:l.filter(u=>!u.success).length}}finally{n&&await $t(n).catch(()=>{});}}var Nx=x("skills");async function Bx(e){try{await b(I.CLI_TOOL_UNINSTALLED,{tool_id:e,tool_type:"skill",source:"external",interface:X().interfaceType});}catch(t){Nx.warn(`Failed to send skill uninstall metrics: ${String(t)}`);}}async function Fx(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 jx(e){let t=ii(e),r;try{let n;if(t.type==="local"){if(!t.localPath)return P("Invalid local path."),1;n=t.localPath;}else C(`Fetching skills from ${y(e)}...`),r=await At(t.url,t.ref),n=r;let o=await ui(n,t.subpath);if(o.length===0)return C("No skills found in this source."),0;let i=ai(t)??y(e);C(`Found ${o.length} skill(s) in ${i}:
|
|
221
221
|
`);for(let a of o){let l=y(a.name),c=y(a.description);process.stdout.write(` ${k.bold(l)} ${k.dim(c)}
|
|
222
222
|
`);}return process.stdout.write(`
|
|
223
|
-
`),0}catch(n){return n instanceof
|
|
224
|
-
`);let t=e.source;e.installed>0&&C(`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?C("No skills found in this source."):e.results.length===0&&e.discovered>0&&C(`Found ${e.discovered} skill(s) but none matched the filter. Use --list to see available skills.`);}async function
|
|
223
|
+
`),0}catch(n){return n instanceof wr?P(n.message):P(n instanceof Error?n.message:String(n)),1}finally{r&&await $t(r).catch(()=>{});}}function Kx(e){for(let r of e.results){let n=y(r.skill);if(r.success){let o=relative(process.cwd(),r.path);ie(`${n} installed ${k.dim(`\u2192 ${o}/`)}`);}else P(`${n}: ${y(r.error??"unknown error")}`);}process.stdout.write(`
|
|
224
|
+
`);let t=e.source;e.installed>0&&C(`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?C("No skills found in this source."):e.results.length===0&&e.discovered>0&&C(`Found ${e.discovered} skill(s) but none matched the filter. Use --list to see available skills.`);}async function fm(e,t){if(t.list)return jx(e);let r=t.global?"global":"project";try{let n=await pm(e,{scope:r,skillFilter:t.skill,yes:t.yes});return Kx(n),n.failed>0?1:0}catch(n){return n instanceof wr?P(n.message):P(n instanceof Error?n.message:String(n)),1}}async function gm(e){let t=kr(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 Eo(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 hm(e){let t=e.global?"global":"project",r=await gm(t),n=await di(t);if(e.json){let s=r.map(i=>({name:i.name,description:i.description,path:i.path,source:n.skills[tt(i.name)]?.source}));return on(s),0}if(r.length===0)return C(`No skills installed (${t==="global"?"global":"project"} scope).`),0;C(`${t==="global"?"Global":"Project"} skills (${r.length}):
|
|
225
225
|
`);for(let s of r){let i=n.skills[tt(s.name)]?.source,a=y(s.name),l=y(s.description),c=l.length>80?l.slice(0,77)+"...":l,u=i?k.dim(` (${i})`):"";process.stdout.write(` ${k.bold(a)}${u}
|
|
226
226
|
`),process.stdout.write(` ${k.dim(c)}
|
|
227
227
|
|
|
228
|
-
`);}return 0}async function
|
|
228
|
+
`);}return 0}async function ym(e,t){let r=t.global?"global":"project";if(!e){let i=await gm(r);if(i.length===0)return C("No skills installed."),0;C("Installed skills:");for(let a of i)process.stdout.write(` - ${y(a.name)}
|
|
229
229
|
`);return process.stdout.write(`
|
|
230
|
-
`),C("Specify a skill name to remove: flow skills remove <name>"),1}let n=tt(e),o=
|
|
231
|
-
Import summary: 0 installed, ${o.length} failed`);for(let a of o)P(` ${a.name}: ${a.error}`);return o.length>0?1:0}C(`Importing ${n.length} plugin(s)...`);let i=0;for(let a of n){let l=t.scope??a.scope??"user",c=
|
|
232
|
-
Import summary: ${i} installed, ${o.length} failed`);for(let a of o)P(` ${a.name}: ${a.error}`);return o.length>0?1:0}function j(e){process.exitCode=e,setTimeout(()=>process.exit(e),100).unref();}var
|
|
230
|
+
`),C("Specify a skill name to remove: flow skills remove <name>"),1}let n=tt(e),o=kr(r),s=join(o,n);try{await stat(s);}catch{return P(`Skill "${y(e)}" is not installed.`),1}if(!t.force&&!await Fx(`Remove skill "${y(n)}"?`))return C("Cancelled."),0;try{return await rm$1(s,{recursive:!0,force:!0}),await um(n,r),await Bx(n),ie(`Skill "${y(n)}" removed.`),0}catch(i){return P(`Failed to remove skill: ${i instanceof Error?i.message:String(i)}`),1}}var pi=x("transfer"),al=1;function Vx(e){return e.marketplace&&e.marketplace!==Y?`${e.name}@${e.marketplace}`:e.name}function Hx(e,t){let r=e.filter(o=>t.has(o.name)),n=e.filter(o=>!t.has(o.name));r.length>0&&C(`Already installed (${r.length}): ${r.map(o=>o.name).join(", ")}`),C(`To install (${n.length}): ${n.length>0?n.map(o=>o.name).join(", "):"none"}`);}function xm(e){let t=ye__default.resolve(e.output);try{let r=ne(),n={version:al,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 Se__default.writeFileSync(t,JSON.stringify(n,null,2),"utf-8"),ie(`Exported ${r.length} plugin(s) to ${t}`),0}catch(r){let n=te(r);return pi.error(`Export failed: ${n}`),P(`Failed to export plugins: ${n}`),1}}async function Im(e,t={}){if(!await we())return 1;let r;try{let a=Se__default.readFileSync(ye__default.resolve(e),"utf-8");r=JSON.parse(a);}catch(a){return P(`Failed to read import file "${e}": ${te(a)}`),1}if(r.version!==al)return P(`Unsupported export format version ${r.version??"(none)"} \u2014 expected ${al}`),1;if(!Array.isArray(r.plugins))return P('Invalid export file format: missing or invalid "plugins" array'),1;if(r.plugins.length===0)return C("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 c=`entry[${a}]`;pi.warn(`Skipping ${c}: missing or invalid name`),o.push({name:c,error:"missing or invalid name"});}else l.type==="mcp"?(pi.debug(`[${l.name}] Skipping MCP entry`),s++):n.push(l);if(s>0&&C(`Skipping ${s} MCP(s) \u2014 use 'flow mcp add' to install them manually`),t.diff||t.dryRun){let a=new Set(ne().map(l=>l.name));Hx(n,a);}if(t.dryRun)return C("Dry-run mode: no plugins were installed"),0;if(n.length===0){C(`
|
|
231
|
+
Import summary: 0 installed, ${o.length} failed`);for(let a of o)P(` ${a.name}: ${a.error}`);return o.length>0?1:0}C(`Importing ${n.length} plugin(s)...`);let i=0;for(let a of n){let l=t.scope??a.scope??"user",c=Vx(a);pi.debug(`[${a.name}] Installing as "${c}" in scope "${l}"`),await si([c],{scope:l,force:t.force})===0?i++:o.push({name:a.name,error:"installation failed"});}C(`
|
|
232
|
+
Import summary: ${i} installed, ${o.length} failed`);for(let a of o)P(` ${a.name}: ${a.error}`);return o.length>0?1:0}function j(e){process.exitCode=e,setTimeout(()=>process.exit(e),100).unref();}var Gx=x("moduleProxy");function zx(e){if(!process.stdin.isTTY)return Promise.resolve(false);let t=ga.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 bm(e,t){let r=Date.now(),o=spawnSync(e.binaryName,t,{stdio:"inherit",env:process.env}).status??1;await b(I.CLI_MODULE_PROXY_EXECUTED,{module_alias:e.alias,exit_code:o,duration_ms:Date.now()-r,subcommand:t[0]??null}).catch(s=>{Gx.warn(`Failed to emit proxy executed event: ${String(s)}`);}),j(o);}async function Pm(e,t){let r=re.find(o=>o.alias===e);if(!r){P(`Unknown module alias: '${e}'`),j(1);return}if(!await vt(r.binaryName)){P(`Module '${e}' (${r.binaryName}) is not installed.`);let o=r.platforms[process.platform];if(!o||o.status!=="supported"){await b(I.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_not_supported"}).catch(()=>{}),j(1);return}let s=(await Promise.all(o.strategies.map(async a=>{try{return await Et(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.`),j(1);return}if(await zx("Would you like to install it now? [Y/n] ")){await b(I.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_accepted"}).catch(()=>{});let a=await pr(r,"inline",s);if(!a.success){P(`Failed to install '${e}': ${a.error?.message??"unknown error"}`),j(1);return}await bm(r,t);}else C(`To install manually, run: flow modules install ${e}`),await b(I.CLI_MODULE_NOT_FOUND,{module_alias:e,action_taken:"install_declined"}).catch(()=>{}),j(1);return}await bm(r,t);}var Yx=promisify(execFile);async function Zx(e){try{if(e.versionCheck.type==="npm-registry"){let{stdout:n}=await Yx(jt(),["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/${le}`,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 Qx(e,t,r,n){return n?.status==="experimental"?"experimental":!n||n.status!=="supported"||!e?"not_installed":t&&r&&Re(t,r)?"outdated":"installed"}async function ll(){let e=await Promise.all(re.map(async t=>{let[r,n]=await Promise.all([vt(t.binaryName),Zx(t)]),s=qe(t.alias)?.installedVersion??null,i=t.platforms[process.platform],a=Qx(r,s,n,i),l=s??"\u2014";return [t.name,t.alias,l,a,process.platform]}));return nn(["Name","Alias","Version","Status","Platform"],e),0}async function Tm(e){let t=re.find(i=>i.alias===e);if(!t)return P(`Unknown module alias: '${e}'`),1;let[r]=await An([t]);if(r.alreadyInstalled){let i=qe(t.alias),a=i?.installedVersion?` (v${i.installedVersion})`:"";return C(`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=rl({text:`Installing ${t.name}...`}).start(),s;try{s=await pr(t,"on_demand",n);}finally{o.stop();}return s.success?(ie(`${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 Em(e,t){let r=rl({text:`Updating ${e.name}...`}).start(),n;try{n=await is(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 km(e){if(e!==null){let n=re.find(i=>i.alias===e);if(!n)return P(`Unknown module alias: '${e}'`),1;let o=qe(n.alias);return o?.installMethod?await Em(n,o.installedVersion??"unknown")==="error"?1:0:(P(`Module '${e}' not installed. Run: flow modules install ${e}`),1)}let t=Or().filter(n=>n.installMethod!==null);if(t.length===0)return C("No installed modules to update."),0;let r=0;for(let n of t){let o=re.find(i=>i.alias===n.alias);if(!o)continue;await Em(o,n.installedVersion??"unknown")==="error"&&(r=1);}return r}function Am(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${le}`,"-V, --version","Display the CLI version").addHelpText("after",`
|
|
233
233
|
Without arguments, opens the interactive interface (TUI).
|
|
234
234
|
Use 'flow <command> --help' for details on each command.`).action(async()=>{await e();});let r=new Command("setup").description("Configure the CLI by detecting Claude Code credentials");r.command("init").description("Initialize the Flow CLI configuration").addHelpText("after",`
|
|
235
235
|
Examples:
|
|
236
|
-
$ flow setup init`).action(async()=>{let u=await
|
|
236
|
+
$ flow setup init`).action(async()=>{let u=await tl();j(u);}),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).addHelpText("after",`
|
|
237
237
|
Examples:
|
|
238
238
|
$ flow plugin list
|
|
239
239
|
$ flow plugin list --available
|
|
240
240
|
$ flow plugin list --outdated
|
|
241
|
-
$ flow plugin list --json`).action(async u=>{let d=await
|
|
241
|
+
$ flow plugin list --json`).action(async u=>{let d=await Kp(u);j(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").addOption(new Option("--scope <scope>","Scope to install into: user, project, or local").choices(["user","project","local"])).addHelpText("after",`
|
|
242
242
|
Examples:
|
|
243
243
|
$ flow plugin install flow-adr-writer
|
|
244
244
|
$ flow plugin install flow-adr-writer --scope project
|
|
@@ -246,11 +246,11 @@ Examples:
|
|
|
246
246
|
$ flow plugin install flow-adr-writer --force
|
|
247
247
|
$ flow plugin install flow-adr-writer --silent
|
|
248
248
|
$ flow plugin install superpowers@claude-plugins-official
|
|
249
|
-
$ flow plugin install agent-sdk-dev@claude-code-plugins --marketplace-source anthropics/claude-code`).action(async(u,d)=>{let m=u.filter(f=>f.trim());if(m.length===0){P("No valid plugin names provided"),j(1);return}
|
|
249
|
+
$ flow plugin install agent-sdk-dev@claude-code-plugins --marketplace-source anthropics/claude-code`).action(async(u,d)=>{let m=u.filter(f=>f.trim());if(m.length===0){P("No valid plugin names provided"),j(1);return}Ue("cli",{verbose:d.verbose,silent:d.silent});let p=await si(m,d);j(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",`
|
|
250
250
|
Examples:
|
|
251
251
|
$ flow plugin uninstall flow-adr-writer
|
|
252
252
|
$ flow plugin uninstall flow-adr-writer --scope project
|
|
253
|
-
$ flow plugin uninstall startup-pack-ai --force`).action(async(u,d)=>{let m=await
|
|
253
|
+
$ flow plugin uninstall startup-pack-ai --force`).action(async(u,d)=>{let m=await Vp(u,d);j(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",`
|
|
254
254
|
Examples:
|
|
255
255
|
$ flow plugin update flow-adr-writer
|
|
256
256
|
$ flow plugin update flow-adr-writer --scope project
|
|
@@ -259,75 +259,75 @@ Examples:
|
|
|
259
259
|
$ flow plugin update flow-adr-writer --verbose
|
|
260
260
|
$ flow plugin update flow-adr-writer --silent
|
|
261
261
|
$ flow plugin update
|
|
262
|
-
$ flow plugin update --dry-run`).action(async(u,d)=>{
|
|
262
|
+
$ flow plugin update --dry-run`).action(async(u,d)=>{Ue("cli",{verbose:d.verbose,silent:d.silent});let m=await zp(u??null,d);j(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",`
|
|
263
263
|
Examples:
|
|
264
264
|
$ flow plugin enable flow-adr-writer
|
|
265
|
-
$ flow plugin enable flow-adr-writer --scope project`).action(async(u,d)=>{
|
|
265
|
+
$ flow plugin enable flow-adr-writer --scope project`).action(async(u,d)=>{Ue("cli");let m=await Hp(u,d);j(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",`
|
|
266
266
|
Examples:
|
|
267
267
|
$ flow plugin disable flow-adr-writer
|
|
268
|
-
$ flow plugin disable flow-adr-writer --scope project`).action(async(u,d)=>{
|
|
268
|
+
$ flow plugin disable flow-adr-writer --scope project`).action(async(u,d)=>{Ue("cli");let m=await Jp(u,d);j(m);}),n.command("export").description("Export installed plugins to a JSON file").option("--output <file>","Output file path","flow-plugins.json").addHelpText("after",`
|
|
269
269
|
Examples:
|
|
270
270
|
$ flow plugin export
|
|
271
|
-
$ flow plugin export --output my-plugins.json`).action(async u=>{let d=await
|
|
271
|
+
$ flow plugin export --output my-plugins.json`).action(async u=>{let d=await xm(u);j(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",`
|
|
272
272
|
Examples:
|
|
273
273
|
$ flow plugin import flow-plugins.json
|
|
274
274
|
$ flow plugin import flow-plugins.json --scope user
|
|
275
275
|
$ flow plugin import flow-plugins.json --force
|
|
276
276
|
$ flow plugin import flow-plugins.json --dry-run
|
|
277
|
-
$ flow plugin import flow-plugins.json --diff`).action(async(u,d)=>{let m=await
|
|
277
|
+
$ flow plugin import flow-plugins.json --diff`).action(async(u,d)=>{let m=await Im(u,d);j(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",`
|
|
278
278
|
Examples:
|
|
279
279
|
$ flow plugin marketplace add anthropics/claude-code
|
|
280
280
|
$ flow plugin marketplace add https://github.com/owner/repo
|
|
281
281
|
$ flow plugin marketplace add anthropics/claude-code --force
|
|
282
|
-
$ flow plugin marketplace add anthropics/claude-code --silent`).action(async(u,d)=>{
|
|
282
|
+
$ flow plugin marketplace add anthropics/claude-code --silent`).action(async(u,d)=>{Ue("cli",{verbose:d.verbose,silent:d.silent});let m=await qp(u,d);j(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",`
|
|
283
283
|
Examples:
|
|
284
284
|
$ flow mcp add notion --transport http https://mcp.notion.com/mcp
|
|
285
285
|
$ flow mcp add mcp-chrome --transport stdio uvx mcp-chrome
|
|
286
286
|
$ flow mcp add playwright-mcp --transport stdio uvx playwright-mcp --force
|
|
287
|
-
$ flow mcp add notion --transport http https://mcp.notion.com/mcp --scope project`).action(async(u,d,m)=>{
|
|
287
|
+
$ flow mcp add notion --transport http https://mcp.notion.com/mcp --scope project`).action(async(u,d,m)=>{Ue("cli",{verbose:m.verbose,silent:m.silent});let p=await yd(u,d,m);j(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",`
|
|
288
288
|
Examples:
|
|
289
289
|
$ flow mcp remove notion
|
|
290
290
|
$ flow mcp remove notion --scope project
|
|
291
|
-
$ flow mcp remove playwright-mcp --force`).action(async(u,d)=>{
|
|
291
|
+
$ flow mcp remove playwright-mcp --force`).action(async(u,d)=>{Ue("cli",{verbose:d.verbose,silent:d.silent});let m=await wd(u,d);j(m);}),t.addCommand(s);let i=new Command("auth").description("Manage authentication credentials");i.command("login").description("Authenticate and save credentials locally").option("--client-id <id>","Client ID for non-interactive authentication").option("--client-secret <secret>","Client Secret for non-interactive authentication").option("--tenant <tenant>","Tenant 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("--verbose","Display each step of the authentication process").addHelpText("after",`
|
|
292
292
|
Examples:
|
|
293
293
|
$ flow auth login
|
|
294
294
|
$ flow auth login --client-id ID --client-secret SECRET --tenant TENANT
|
|
295
295
|
$ flow auth login --client-id ID --client-secret SECRET --tenant TENANT --starter-kit dev
|
|
296
296
|
$ flow auth login --client-id ID --client-secret SECRET --tenant TENANT --custom-url https://tenant.ciandt.com
|
|
297
|
-
$ flow auth login --verbose`).action(async u=>{
|
|
297
|
+
$ flow auth login --verbose`).action(async u=>{Ue("cli",{verbose:u.verbose});let d=await tl(u);j(d);}),i.command("logout").description("Remove locally saved credentials").option("--force","Skip interactive confirmation").addHelpText("after",`
|
|
298
298
|
Examples:
|
|
299
299
|
$ flow auth logout
|
|
300
|
-
$ flow auth logout --force`).action(async u=>{let d=await
|
|
300
|
+
$ flow auth logout --force`).action(async u=>{let d=await Fp(u.force);j(d);}),i.command("status").description("Display the current authentication status").addHelpText("after",`
|
|
301
301
|
Examples:
|
|
302
|
-
$ flow auth status`).action(async()=>{let u=await
|
|
302
|
+
$ flow auth status`).action(async()=>{let u=await jp();j(u);}),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",`
|
|
303
303
|
Examples:
|
|
304
304
|
$ flow skills add vercel-labs/agent-skills
|
|
305
305
|
$ flow skills add owner/repo -g
|
|
306
306
|
$ flow skills add owner/repo --skill pr-review commit
|
|
307
307
|
$ flow skills add ./local/skills -y
|
|
308
|
-
$ flow skills add owner/repo --list`).action(async(u,d)=>{let m=await
|
|
308
|
+
$ flow skills add owner/repo --list`).action(async(u,d)=>{let m=await fm(u,d);j(m);}),a.command("list").description("List installed skills").option("-g, --global","List global skills (default: project)").option("--json","Output as JSON").addHelpText("after",`
|
|
309
309
|
Examples:
|
|
310
310
|
$ flow skills list
|
|
311
311
|
$ flow skills list -g
|
|
312
|
-
$ flow skills list --json`).action(async u=>{let d=await
|
|
312
|
+
$ flow skills list --json`).action(async u=>{let d=await hm(u);j(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",`
|
|
313
313
|
Examples:
|
|
314
314
|
$ flow skills remove pr-review
|
|
315
|
-
$ flow skills remove pr-review -g --force`).action(async(u,d)=>{let m=await
|
|
315
|
+
$ flow skills remove pr-review -g --force`).action(async(u,d)=>{let m=await ym(u,d);j(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",`
|
|
316
316
|
Examples:
|
|
317
317
|
$ flow bundle install "My React Kit"
|
|
318
318
|
$ flow bundle install "Squad Setup Bundle"
|
|
319
|
-
$ flow bundle install "My React Kit" --verbose`).action(async(u,d)=>{
|
|
319
|
+
$ flow bundle install "My React Kit" --verbose`).action(async(u,d)=>{Ue("cli",{verbose:d.verbose});let m=await Wp(u);j(m);}),t.addCommand(l),t.command("health").description("Check the CLI configuration and connectivity").addHelpText("after",`
|
|
320
320
|
Examples:
|
|
321
|
-
$ flow health`).action(async()=>{let u=await
|
|
321
|
+
$ flow health`).action(async()=>{let u=await Yp();j(u);});let c=new Command("modules").description("Manage Flow modules (binary companions for Claude Code)");c.action(async()=>{let u=await ll();j(u);}),c.command("list").description("List available and installed modules").addHelpText("after",`
|
|
322
322
|
Examples:
|
|
323
|
-
$ flow modules list`).action(async()=>{let u=await
|
|
323
|
+
$ flow modules list`).action(async()=>{let u=await ll();j(u);}),c.command("install").description("Install a module by alias").argument("<alias>","Module alias to install (e.g. metrics, dashboard)").addHelpText("after",`
|
|
324
324
|
Examples:
|
|
325
325
|
$ flow modules install metrics
|
|
326
|
-
$ flow modules install dashboard`).action(async u=>{let d=await
|
|
326
|
+
$ flow modules install dashboard`).action(async u=>{let d=await Tm(u);j(d);}),c.command("update").description("Update an installed module, or all installed modules").argument("[alias]","Module alias to update (omit to update all installed)").addHelpText("after",`
|
|
327
327
|
Examples:
|
|
328
328
|
$ flow modules update
|
|
329
|
-
$ flow modules update metrics`).action(async u=>{let d=await
|
|
329
|
+
$ flow modules update metrics`).action(async u=>{let d=await km(u??null);j(d);}),t.addCommand(c);for(let u of re)t.command(u.alias).description(u.description).helpOption(false).allowUnknownOption().passThroughOptions().argument("[passthrough...]","Arguments forwarded to the module binary").action(async d=>{await Pm(u.alias,d);});return t.hook("preAction",()=>{qs();}),t}function rI(){return ye__default.join(Ce__default.homedir(),".claude","settings.json")}function Mm(){let e=rI();try{if(!Se__default.existsSync(e))return !0;let r=JSON.parse(Se__default.readFileSync(e,"utf-8")).flowCli?.autoUpdate;return r===!1?!1:r==="modules-only"?"modules-only":!0}catch{return true}}var lI=x("updateChecker"),cI=promisify(execFile),uI=1440*60*1e3,Lm=3e4;function dI(){let e=process.env.FLOW_HOME??ye__default.join(Ce__default.homedir(),".flow");return ye__default.join(e,"update.lock")}async function Rm(e){try{let{stdout:t}=await cI(jt(),["view",e,"version"],{timeout:Lm,shell:process.platform==="win32"});return String(t).trim()||null}catch{return null}}async function pI(e){let t=new AbortController,r=setTimeout(()=>t.abort(),Lm);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 mI(e){return e.versionCheck.type==="npm-registry"?Rm(e.versionCheck.package):pI(e.versionCheck.repo)}async function fI(){let e=await Rm("@ciandt-flow/cli");return e&&Re(le,e)?(ri({currentVersion:le,latestVersion:e,isOutdated:true,packageName:"@ciandt-flow/cli"}).catch(()=>{}),e):null}async function gI(){let e=Or().filter(t=>t.installMethod!==null);await Promise.all(e.map(async t=>{let r=re.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<uI)return;let s=await mI(r);try{await dt({...t,lastChecked:new Date().toISOString()});}catch(i){lI.warn(`Failed to update lastChecked for ${t.alias}: ${String(i)}`);}s&&t.installedVersion&&Re(t.installedVersion,s)&&is(r,"background").catch(()=>{});}));}async function ul(){let e=Mm();if(e===false)return;let t=dI();Se__default.mkdirSync(ye__default.dirname(t),{recursive:true});let r=null;try{r=await rg.lock(t,{realpath:!1,retries:0});}catch{return}try{if(e!=="modules-only"){let n=await fI().catch(()=>null);n&&process.stdout.write(`
|
|
330
330
|
\u26A0 @ciandt-flow/cli v${n} installing in background.
|
|
331
331
|
Restart flow to apply the update.
|
|
332
332
|
|
|
333
|
-
`);}await
|
|
333
|
+
`);}await gI().catch(()=>{});}finally{await r().catch(()=>{});}}var yI=x("cli"),dl=Am(async()=>{Ue("tui"),Fl("tui"),jl(),process.on("SIGINT",()=>{let{activeTab:t,screen:r}=S.getState();Kn("sigint",t,r).finally(()=>process.exit(130));}),process.on("SIGTERM",()=>{let{activeTab:t,screen:r}=S.getState();Kn("sigterm",t,r).finally(()=>process.exit(143));}),await ul().catch(()=>{}),await Zc().catch(t=>{yI.error(`Failed to init catalog registry: ${String(t)}`);}),await Ap();let{waitUntilExit:e}=render(jsx($p,{}),{alternateScreen:true,exitOnCtrlC:false});await e(),process.exit(0);});dl.hook("preAction",async(e,t)=>{t!==dl&&await ul().catch(()=>{});});dl.parse();
|