@sazabiai/cli 0.0.1 → 0.0.3
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 +22 -25
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,52 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var I9=Object.create;var{getPrototypeOf:f9,defineProperty:l1,getOwnPropertyNames:v9}=Object;var h9=Object.prototype.hasOwnProperty;function g9(Z){return this[Z]}var m9,c9,B1=(Z,$,Q)=>{var X=Z!=null&&typeof Z==="object";if(X){var Y=$?m9??=new WeakMap:c9??=new WeakMap,G=Y.get(Z);if(G)return G}Q=Z!=null?I9(f9(Z)):{};let V=$||!Z||!Z.__esModule?l1(Q,"default",{value:Z,enumerable:!0}):Q;for(let B of v9(Z))if(!h9.call(V,B))l1(V,B,{get:g9.bind(Z,B),enumerable:!0});if(X)Y.set(Z,V);return V};var u9=(Z,$)=>()=>($||Z(($={exports:{}}).exports,$),$.exports);var X1=u9((f3,A1)=>{var P1=process||{},r1=P1.argv||[],F1=P1.env||{},d9=!(!!F1.NO_COLOR||r1.includes("--no-color"))&&(!!F1.FORCE_COLOR||r1.includes("--color")||P1.platform==="win32"||(P1.stdout||{}).isTTY&&F1.TERM!=="dumb"||!!F1.CI),p9=(Z,$,Q=Z)=>(X)=>{let Y=""+X,G=Y.indexOf($,Z.length);return~G?Z+l9(Y,$,Q,G)+$:Z+Y+$},l9=(Z,$,Q,X)=>{let Y="",G=0;do Y+=Z.substring(G,X)+Q,G=X+$.length,X=Z.indexOf($,G);while(~X);return Y+Z.substring(G)},i1=(Z=d9)=>{let $=Z?p9:()=>String;return{isColorSupported:Z,reset:$("\x1B[0m","\x1B[0m"),bold:$("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:$("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:$("\x1B[3m","\x1B[23m"),underline:$("\x1B[4m","\x1B[24m"),inverse:$("\x1B[7m","\x1B[27m"),hidden:$("\x1B[8m","\x1B[28m"),strikethrough:$("\x1B[9m","\x1B[29m"),black:$("\x1B[30m","\x1B[39m"),red:$("\x1B[31m","\x1B[39m"),green:$("\x1B[32m","\x1B[39m"),yellow:$("\x1B[33m","\x1B[39m"),blue:$("\x1B[34m","\x1B[39m"),magenta:$("\x1B[35m","\x1B[39m"),cyan:$("\x1B[36m","\x1B[39m"),white:$("\x1B[37m","\x1B[39m"),gray:$("\x1B[90m","\x1B[39m"),bgBlack:$("\x1B[40m","\x1B[49m"),bgRed:$("\x1B[41m","\x1B[49m"),bgGreen:$("\x1B[42m","\x1B[49m"),bgYellow:$("\x1B[43m","\x1B[49m"),bgBlue:$("\x1B[44m","\x1B[49m"),bgMagenta:$("\x1B[45m","\x1B[49m"),bgCyan:$("\x1B[46m","\x1B[49m"),bgWhite:$("\x1B[47m","\x1B[49m"),blackBright:$("\x1B[90m","\x1B[39m"),redBright:$("\x1B[91m","\x1B[39m"),greenBright:$("\x1B[92m","\x1B[39m"),yellowBright:$("\x1B[93m","\x1B[39m"),blueBright:$("\x1B[94m","\x1B[39m"),magentaBright:$("\x1B[95m","\x1B[39m"),cyanBright:$("\x1B[96m","\x1B[39m"),whiteBright:$("\x1B[97m","\x1B[39m"),bgBlackBright:$("\x1B[100m","\x1B[49m"),bgRedBright:$("\x1B[101m","\x1B[49m"),bgGreenBright:$("\x1B[102m","\x1B[49m"),bgYellowBright:$("\x1B[103m","\x1B[49m"),bgBlueBright:$("\x1B[104m","\x1B[49m"),bgMagentaBright:$("\x1B[105m","\x1B[49m"),bgCyanBright:$("\x1B[106m","\x1B[49m"),bgWhiteBright:$("\x1B[107m","\x1B[49m")}};A1.exports=i1();A1.exports.createColors=i1});var C=B1(X1(),1),i={success:(Z)=>C.default.green(Z),error:(Z)=>C.default.red(Z),warning:(Z)=>C.default.yellow(Z),info:(Z)=>C.default.blue(Z),muted:(Z)=>C.default.dim(Z),bold:(Z)=>C.default.bold(Z),cyan:(Z)=>C.default.cyan(Z),gray:(Z)=>C.default.gray(Z)},M1=(Z,$)=>{let Q=$??Z,X=Z.trim().toUpperCase(),G={ERROR:C.default.red,FATAL:C.default.red,WARN:C.default.yellow,WARNING:C.default.yellow,INFO:C.default.blue,DEBUG:C.default.gray,TRACE:C.default.gray}[X];return G?G(Q):Q},Y1=(Z,$)=>{let Q=$??Z;if(Z==="user")return C.default.blue(Q);if(Z==="assistant")return C.default.green(Q);return C.default.gray(Q)};var U1=(Z,$=60)=>{if(Z.length<=$)return Z;return`${Z.substring(0,$-3)}...`},u=(Z)=>{return new Date(Z).toLocaleString()},n=(Z)=>{return`${Z.substring(0,8)}...`};var n1=B1(X1(),1);var j=(Z)=>{return n1.default.bold(Z)};var V1=B1(X1(),1),C1="✓",T1="✗",o1="⚠",a1="ℹ",r9=V1.default.green(C1),i9=V1.default.red(T1),n9=V1.default.yellow(o1),o9=V1.default.cyan(a1);var o=B1(X1(),1),x=(Z)=>{console.log(o.default.yellow(Z))},F=(Z)=>{console.log(JSON.stringify(Z,null,2))},z=(Z,$=1)=>{console.error(JSON.stringify({success:!1,error:Z},null,2)),process.exit($)},v=(Z)=>{console.log(o.default.bold(Z))},P=(Z)=>{console.log(o.default.dim(Z))},T=(Z)=>{console.log(o.default.green(Z))},a=(Z)=>{console.log(o.default.red(Z))},S=(Z)=>{console.log(o.default.yellow(Z))},w=(Z)=>o.default.dim(Z);var G1=B1(X1(),1),t=(Z)=>{if(Z.type==="cursor")if(Z.nextCursor)console.log(G1.default.dim(`Next: --cursor ${Z.nextCursor}`));else console.log(G1.default.dim("End of results"));else console.log(G1.default.dim(`Page ${Z.page} of ${Z.totalPages}`))},R1=(Z,$)=>{console.log(G1.default.bold(`${Z} (${$} total)`))},E1=(Z,$)=>{console.log(G1.default.bold(`${Z} (${$} results)`))};var Q3=(Z)=>{console.error(Z)};var H=(Z,$=1)=>{Q3(Z),process.exit($)};var j1=(Z="─",$=80)=>{console.log(Z.repeat($))};var $1=()=>{console.log("")};var X3=(Z,$=2)=>{console.log(`${" ".repeat($)}${Z}`)},s=(Z,$=0)=>{for(let[Q,X]of Object.entries(Z))console.log(`${" ".repeat($)}${Q}: ${X}`)},d=(Z,$,Q)=>{if(Z.length===0)return;if(Q?.header){let J=typeof Q.header==="string"?{title:Q.header}:Q.header,q=J.variant??"section",_=J.count??Z.length;if(q==="results")R1(J.title,_);else if(q==="search")E1(J.title,_);else v(J.title)}let X=/\u001B\[[0-?]*[ -/]*[@-~]/g,Y=(J)=>(J??"").replace(X,"").length,G=(J,q,_)=>{let U=Y(J),W=Math.max(0,q-U);return _==="right"?`${" ".repeat(W)}${J}`:`${J}${" ".repeat(W)}`},V=$.map((J)=>{if(J.width)return J.width;let q=Y(J.header),_=Math.max(...Z.map((U)=>Y(U[J.key]||"")));return Math.max(q,_)}),B=[$.map((J,q)=>{let _=V[q]||0;return G(J.header,_,"left")}),...Z.map((J)=>$.map((q,_)=>{let U=J[q.key]||"",W=V[_]||0,M=q.align||"left";return G(U,W,M)}))];for(let J of B)X3(J.join(" "));$1()};var y=(Z)=>({success:!0,value:Z}),b=(Z,$)=>({success:!1,error:Z,...$!==void 0&&{statusCode:$}});var D=(Z,$,Q)=>{if(!Z.success){let X=`${$}: ${Z.error}`;if(Q)return z(X);return H(X)}return Z.value};var Y3="https://api.sazabi.com",G3="/v1",J3=1e4,I=async(Z,$,Q,X)=>{let G=`${Z.baseUrl??Y3}${G3}${Q}`,V=new AbortController,B=setTimeout(()=>V.abort(),J3);try{let J=await fetch(G,{method:$,headers:{Authorization:`Bearer ${Z.secretKey}`,"Content-Type":"application/json"},body:X?JSON.stringify(X):void 0,signal:V.signal});if(!J.ok){if(J.status===401)return b(`Authentication failed for ${Q}. Check your secret key.`,401);if(J.status===404)return b(`Resource not found: ${Q}`,404);let _=await J.text();return b(`API error (${J.status}) for ${Q}: ${_}`,J.status)}if(J.status===204)return y({});let q=await J.json();return y(q)}catch(J){if(J instanceof Error&&J.name==="AbortError")return b("Request timed out. Please try again.");let q=J instanceof Error?J.message:String(J);return b(`Request failed: ${q}`)}finally{clearTimeout(B)}},q1=(Z)=>{let $=Object.entries(Z).filter((Q)=>Q[1]!==void 0&&(typeof Q[1]==="string"||typeof Q[1]==="number"||typeof Q[1]==="boolean")).map(([Q,X])=>`${Q}=${encodeURIComponent(String(X))}`);return $.length>0?`?${$.join("&")}`:""},Z1=(Z)=>({project:{get:()=>I(Z,"GET","/project")},threads:{list:($={})=>I(Z,"GET",`/threads${q1($)}`),get:($)=>I(Z,"GET",`/threads/${$}`),create:($)=>I(Z,"POST","/threads",{message:$}),getStatus:($)=>I(Z,"GET",`/threads/${$}/status`)},messages:{list:($,Q={})=>I(Z,"GET",`/threads/${$}/messages${q1(Q)}`),append:($,Q)=>I(Z,"POST",`/threads/${$}/messages`,{message:Q})},responses:{get:($)=>I(Z,"GET",`/responses/${$}`)},search:{threads:($)=>I(Z,"GET",`/search/threads${q1($)}`),messages:($)=>I(Z,"GET",`/search/messages${q1($)}`)},publicKeys:{list:($)=>I(Z,"GET",`/public-keys${q1($??{})}`),get:($)=>I(Z,"GET",`/public-keys/${$}`),create:($)=>I(Z,"POST","/public-keys",$)}});import{parseArgs as B3}from"node:util";var L=(Z,$,Q={})=>{let X=B3({args:Z,options:$,allowPositionals:Boolean(Q.allowPositionals),strict:!1,tokens:!0}),Y=Object.hasOwn($,"json")&&X.values.json===!0,G=new Set(Object.keys($)),V=new Set(Object.entries($).map(([,J])=>J.short).filter((J)=>Boolean(J))),B=[];if(Array.isArray(X.tokens))for(let J of X.tokens){if(J.kind!=="option")continue;let q=J.name,_=q.length>1;if(!(G.has(q)||!_&&V.has(q))){let W=_?`--${q}`:`-${q}`;if(!B.includes(W))B.push(W)}}for(let J of Object.keys(X.values))if(!G.has(J)){let q=J.length>1?`--${J}`:`-${J}`;if(!B.includes(q))B.push(q)}if(B.length>0){let J=`Unknown option${B.length>1?"s":""}: ${B.join(", ")}`;if(Y)z(J);H(J)}for(let[J,q]of Object.entries($))if(q.type==="string"&&X.values[J]===!0){let U=`Option ${J.length===1?`-${J}`:`--${J}`} requires a value`;if(Y)z(U);H(U)}for(let[J,q]of Object.entries($)){let _=X.values[J];if(q.type==="string"&&typeof _==="string"){if(_.startsWith("--")||_.length===2&&_[0]==="-"&&/[a-zA-Z]/.test(_.charAt(1))){let M=`Option ${J.length===1?`-${J}`:`--${J}`} received "${_}" as its value. Did you forget to provide a value?`;if(Y)z(M);H(M)}}}return{values:X.values,positionals:X.positionals}};import*as p from"node:fs";import*as s1 from"node:os";import*as w1 from"node:path";var t1={};var A=(Z)=>{if(Z===void 0||Z===null)return;if(typeof Z==="string")return Z.length>0?Z:void 0;return},x1=w1.join(s1.homedir(),".sazabi"),J1=w1.join(x1,"settings.json"),V3=()=>{if(!p.existsSync(x1))p.mkdirSync(x1,{recursive:!0,mode:448})},R=()=>{try{if(!p.existsSync(J1))return y(t1);let Z=p.readFileSync(J1,"utf-8"),$=JSON.parse(Z);if(typeof $==="object"&&$!==null&&"projects"in $){let Y=$.projects??{},G=$.currentProject??null,V;if(G&&Y[G]?.secretKey)V=Y[G].secretKey;else{let q=Object.values(Y).find((_)=>typeof _?.secretKey==="string"&&_.secretKey.length>0);if(q?.secretKey)V=q.secretKey}let B={secretKey:A($.secretKey)??V,apiBaseUrl:A($.apiBaseUrl),webBaseUrl:A($.webBaseUrl),intakeBaseUrl:A($.intakeBaseUrl),tailBaseUrl:A($.tailBaseUrl),apiDomain:A($.apiDomain),webDomain:A($.webDomain),intakeDomain:A($.intakeDomain),tailDomain:A($.tailDomain),forwardPublicKey:A($.forwardPublicKey)},J=l(B);if(!J.success)return J;return y(B)}let X={secretKey:A($.secretKey),apiBaseUrl:A($.apiBaseUrl),webBaseUrl:A($.webBaseUrl),intakeBaseUrl:A($.intakeBaseUrl),tailBaseUrl:A($.tailBaseUrl),apiDomain:A($.apiDomain),webDomain:A($.webDomain),intakeDomain:A($.intakeDomain),tailDomain:A($.tailDomain),forwardPublicKey:A($.forwardPublicKey)};return y(X)}catch(Z){let $=Z instanceof Error?Z.message:String(Z);return b(`Failed to read settings: ${$}`)}},l=(Z)=>{try{return V3(),p.writeFileSync(J1,JSON.stringify(Z,null,2),{encoding:"utf-8",mode:384}),y(void 0)}catch($){let Q=$ instanceof Error?$.message:String($);return b(`Failed to write settings: ${Q}`)}};var e=(Z)=>{let{cliFlag:$,globalUrl:Q,globalDomain:X,buildUrlFromDomain:Y,defaultUrl:G}=Z;if($)return $;if(Q)return Q;if(X)return Y(X);return G},O=(Z,$)=>{if(Z&&Z.trim().length>0)return Z.trim();let Q=process.env.SAZABI_SECRET_KEY;if(Q&&Q.trim().length>0)return Q.trim();let X=D(R(),"Failed to read settings",$);if(X.secretKey&&X.secretKey.trim().length>0)return X.secretKey.trim();let Y="No secret key found. Use 'sazabi auth login <secret-key>' or pass --secret-key or set SAZABI_SECRET_KEY.";if($)return z(Y);return H(Y)},E=(Z)=>{let $=D(R(),"Failed to read settings",Z.jsonMode),Q=e({cliFlag:Z.apiBaseUrlFlag,globalUrl:$.apiBaseUrl,globalDomain:$.apiDomain,buildUrlFromDomain:(X)=>`https://api.${X}`,defaultUrl:"https://api.sazabi.com"});return Z1({secretKey:Z.secretKey,baseUrl:Q})},e1=new Map,S1=new Map,h=async(Z)=>{let $=D(R(),"Failed to read settings",Z.jsonMode),Q=e({cliFlag:Z.apiBaseUrlFlag,globalUrl:$.apiBaseUrl,globalDomain:$.apiDomain,buildUrlFromDomain:(B)=>`https://api.${B}`,defaultUrl:"https://api.sazabi.com"}),X=`${Z.secretKey}@${Q}`,Y=e1.get(X);if(Y)return Y;let G=S1.get(X);if(G)return G;let V=(async()=>{let J=await Z1({secretKey:Z.secretKey,baseUrl:Q}).project.get(),q=D(J,"Failed to fetch project info",Z.jsonMode);return e1.set(X,q),q})();S1.set(X,V);try{return await V}finally{S1.delete(X)}},$9=()=>{let Z=D(R(),"Failed to read settings");if(Z.webBaseUrl)return Z.webBaseUrl;if(Z.webDomain)return`https://app.${Z.webDomain}`;if(Z.apiDomain)return`https://app.${Z.apiDomain}`;if(Z.apiBaseUrl?.includes("sazabi.dev"))return"https://app.sazabi.dev";return"https://app.sazabi.com"},Z9=(Z)=>{return`${$9()}/projects/${Z}`},Q1=(Z,$)=>{return`${$9()}/projects/${Z}/threads/${$}`},Q9=(Z,$)=>{return`https://otlp.${$}.intake.${Z}`};var y1=(Z,$)=>{let Q=Z?.json;if(!Q||Q.type!=="boolean")throw Error(`${$} must include a boolean --json option (enforced by CommandBuilder)`)};class X9{name;description;handler;options;examples;positionalArgs;allowNoJson=!1;constructor(Z,$,Q){this.name=Z,this.description=$,this.handler=Q}withOptions(Z){return this.options=Z,this}withExamples(Z){return this.examples=Z,this}withPositionalArgs(Z){return this.positionalArgs=Z,this}build(){if(!this.allowNoJson)y1(this.options,`Subcommand "${this.name}"`);return{name:this.name,description:this.description,handler:this.handler,options:this.options,examples:this.examples,positionalArgs:this.positionalArgs}}allowWithoutJson(){return this.allowNoJson=!0,this}}class Y9{name;description;handler;subcommands;options;examples;positionalArgs;allowNoJson=!1;constructor(Z,$){this.name=Z,this.description=$}withHandler(Z){return this.handler=Z,this}withSubcommands(Z){return this.subcommands=Z,this}withOptions(Z){return this.options=Z,this}withExamples(Z){return this.examples=Z,this}withPositionalArgs(Z){return this.positionalArgs=Z,this}build(){if(!this.handler&&!this.subcommands)throw Error(`Command "${this.name}" must have either a handler or subcommands`);if(!this.allowNoJson){if(this.handler)y1(this.options,`Command "${this.name}"`);if(this.subcommands)for(let[Z,$]of Object.entries(this.subcommands))y1($.options,`Subcommand "${this.name} ${Z}"`)}return{name:this.name,description:this.description,handler:this.handler,subcommands:this.subcommands,options:this.options,examples:this.examples,positionalArgs:this.positionalArgs}}allowWithoutJson(){return this.allowNoJson=!0,this}}var g=(Z,$)=>{return new Y9(Z,$)},k=(Z,$,Q)=>{return new X9(Z,$,Q)};var b1=async(Z={})=>{let $=O(Z.secretKey,Z.json),Q=await h({secretKey:$,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:Z.json});if(Z.json){F({project:Q});return}s({Project:Q.name,ID:Q.id,"Org ID":Q.organizationId??w("(unknown)"),URL:Z9(Q.id),Region:Q.region})},G9=g("status","Show current project info").withHandler(async(Z)=>{let{values:$,positionals:Q}=L(Z,{json:{type:"boolean"},"secret-key":{type:"string"},"api-base-url":{type:"string"}},{allowPositionals:!0});if(Q.length>0){let X=Q.join(", ");if($.json)return z(`Unexpected arguments: ${X}`);return H(`Unexpected arguments: ${X}`)}await b1({json:$.json,secretKey:$["secret-key"],apiBaseUrl:$["api-base-url"]})}).withOptions({json:{type:"boolean",description:"Output as JSON"},"secret-key":{type:"string",description:"Override secret key"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi status # Show current context","sazabi status --json # Output as JSON"]).build();var q3=async(Z,$={})=>{let Q=D(R(),"Failed to read settings",$.json),X=e({cliFlag:$.apiBaseUrl,globalUrl:Q.apiBaseUrl,globalDomain:Q.apiDomain,buildUrlFromDomain:(B)=>`https://api.${B}`,defaultUrl:"https://api.sazabi.com"}),Y=Z1({secretKey:Z,baseUrl:X}),G=D(await Y.project.get(),"Authentication failed",$.json),V={...Q,secretKey:Z};if(D(l(V),"Failed to save credentials",$.json),$.json){F({project:{id:G.id,organizationId:G.organizationId,name:G.name,region:G.region}});return}T("Successfully authenticated!"),s({Project:G.name,ID:G.id,"Org ID":G.organizationId,Region:G.region})},_3=(Z)=>{let $=D(R(),"Failed to read settings",Z.json),Q=Boolean($.secretKey),X={...$};if(delete X.secretKey,D(l(X),"Failed to remove credentials",Z.json),Z.json){F({removed:Q});return}T(Q?"Removed saved secret key.":"No secret key was saved.")},J9=g("auth","Authentication management").withSubcommands({login:k("login","Save and validate a secret key",async(Z)=>{let{values:$,positionals:Q}=L(Z,{json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Secret key is required. Usage: sazabi auth login <secret-key>");throw H("Secret key is required. Usage: sazabi auth login <secret-key>"),Error("Unreachable")}if(Q.length>1){let Y=Q.slice(1).join(", ");if($.json)return z(`Unexpected arguments: ${Y}`);return H(`Unexpected arguments: ${Y}`)}await q3(X,{json:$.json,apiBaseUrl:$["api-base-url"]})}).withPositionalArgs("<secret-key>").withOptions({json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi auth login sazabi_secret_xxx # Authenticate with secret key","sazabi auth login sazabi_secret_xxx --json # Output as JSON for scripting"]).build(),logout:k("logout","Remove current project credentials",async(Z)=>{let{values:$,positionals:Q}=L(Z,{json:{type:"boolean"}},{allowPositionals:!0});if(Q.length>0){let X=Q.join(", ");if($.json)return z(`Unexpected arguments: ${X}`);return H(`Unexpected arguments: ${X}`)}_3({json:$.json})}).withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi auth logout # Remove saved secret key"]).build(),whoami:k("whoami","Display current context (alias for status)",async(Z)=>{let{values:$,positionals:Q}=L(Z,{json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0});if(Q.length>0){let X=Q.join(", ");if($.json)return z(`Unexpected arguments: ${X}`);return H(`Unexpected arguments: ${X}`)}await b1({json:$.json,secretKey:$["secret-key"],apiBaseUrl:$["api-base-url"]})}).withOptions({json:{type:"boolean",description:"Output as JSON"},"secret-key":{type:"string",description:"Override secret key"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi auth whoami # Show current context","sazabi auth whoami --json # Output as JSON"]).build()}).withExamples(["sazabi auth login sazabi_secret_xxx # Authenticate with secret key","sazabi auth logout # Remove saved secret key","sazabi auth whoami # Show current context"]).build();var f=(Z,$,Q,X,Y)=>{let G=Number.parseInt(Z,10);if(Number.isNaN(G)||G<$||G>Q){let V=`${X} must be between ${$} and ${Q}`;if(Y)return z(V);return H(V)}return G},_1=(Z,$,Q,X)=>{if(!$.includes(Z)){let Y=$.map((V)=>`"${V}"`).join(" or "),G=`${Q} must be ${Y}`;if(X)return z(G);return H(G)}return Z};import*as m from"node:fs";import*as K1 from"node:readline";var W1=(Z)=>new Promise(($)=>setTimeout($,Z));var H3=(Z,$)=>{let Q=$??`https://${Z}.intake.sazabi.com`,X=Q.endsWith("/")?Q.slice(0,-1):Q,Y=X.match(/^https:\/\/([a-z0-9-]+)\.intake\.([a-z0-9.]+)$/);return`${Y?`https://otlp.${Y[1]}.intake.${Y[2]}`:X}/v1/logs`},z3=async(Z,$,Q=3,X=1000,Y=1e4)=>{let G;for(let V=0;V<=Q;V++){let B=new AbortController,J=setTimeout(()=>B.abort(),Y);try{let q=await fetch(Z,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($),signal:B.signal});if(q.ok)return y(void 0);if(q.status===401||q.status===403)return b("Authentication failed. Check your public key.");if(q.status===429){let _=await q.text();G=Error(`Rate limited (429): ${_}`)}else if(q.status>=400&&q.status<500){let _=await q.text();return b(`Client error (${q.status}): ${_}`)}else{let _=await q.text();G=Error(`Server error (${q.status}): ${_}`)}}catch(q){if(q instanceof Error&&q.name==="AbortError")G=Error("Request timed out");else G=q instanceof Error?q:Error(String(q))}finally{clearTimeout(J)}if(V<Q){let q=X*2**V;await new Promise((_)=>setTimeout(_,q))}}return b(`Failed after ${Q+1} attempts: ${G?.message??"Unknown error"}`)},B9=async(Z,$)=>{let Q=H3(Z.region,Z.intakeBaseUrl),X=$.resourceLogs?.reduce((G,V)=>G+(V.scopeLogs?.reduce((B,J)=>B+(J.logRecords?.length??0),0)??0),0)??0;if(Z.verbose)P(`Forwarding ${X} logs...`);let Y=await z3(Q,$);if(Y.success)return{forwardedCount:X,failedCount:0};if(Z.verbose)S(`Failed to forward logs: ${Y.error}`);return{forwardedCount:0,failedCount:X,error:Y.error}};var D3=(Z)=>{return`${Z.getTime()*1e6}`},V9=(Z,$)=>{let X=D3(new Date),Y=Z.filter((G)=>G.trim().length>0).map((G)=>({timeUnixNano:X,observedTimeUnixNano:X,severityNumber:9,severityText:"INFO",body:{stringValue:G},attributes:[]}));return{resourceLogs:[{resource:{attributes:[{key:"service.name",value:{stringValue:"sazabi-cli"}},{key:"sazabi.public_key",value:{stringValue:$}}]},scopeLogs:[{scope:{name:"sazabi-cli-forward",version:"1.0.0"},logRecords:Y}]}]}};var F3=async(Z,$)=>{P("Ensuring public key exists...");let Q=await Z.publicKeys.create({name:"sazabi-cli-forward"});if(!Q.success)return a(`Failed to create public key: ${Q.error}`),null;return T(`Created new public key: ${Q.value.publicKey.name}`),Q.value.publicKey.value},I1=(Z,$,Q,X,Y,G)=>{return async()=>{if(Z.length===0)return;let V=V9(Z,Q),B=await B9({region:X,publicKey:Q,verbose:!0,intakeBaseUrl:Y},V);if($.totalForwarded+=B.forwardedCount,$.totalFailed+=B.failedCount,G)G({forwarded:B.forwardedCount,failed:B.failedCount});Z.length=0}},P3=async(Z,$,Q,X,Y,G,V)=>{let B=m.createReadStream(Z),J=K1.createInterface({input:B,crlfDelay:Number.POSITIVE_INFINITY}),q=[],_={totalForwarded:0,totalFailed:0},U=I1(q,_,$,Q,Y,(W)=>V?.push(W));try{for await(let W of J)if(q.push(W),q.length>=X)await U()}catch(W){a(`Failed to read ${Z}: ${W instanceof Error?W.message:String(W)}`);return}if(await U(),G);else if(console.log(""),console.log(i.muted("─".repeat(80))),T(`Forwarded ${_.totalForwarded} logs`),_.totalFailed>0)S(`Failed to forward ${_.totalFailed} logs`)},U3=async(Z,$,Q,X,Y,G)=>{let V=K1.createInterface({input:process.stdin,output:process.stdout,terminal:!1}),B=[],J={totalForwarded:0,totalFailed:0},q=I1(B,J,Z,$,X,(_)=>G?.push(_));try{for await(let _ of V)if(B.push(_),B.length>=Q)await q()}catch(_){a(`Failed to read from stdin: ${_ instanceof Error?_.message:String(_)}`);return}if(await q(),Y);else if(console.log(""),console.log(i.muted("─".repeat(80))),T(`Forwarded ${J.totalForwarded} logs`),J.totalFailed>0)S(`Failed to forward ${J.totalFailed} logs`)},W3=async(Z,$,Q,X,Y,G,V)=>{let B=[],J={totalForwarded:0,totalFailed:0},q=I1(B,J,$,Q,Y,(r)=>V?.push(r)),_=null,U=null,W=async()=>{if(U)clearTimeout(U);if(_)_.close();if(await q(),G);else if(console.log(""),console.log(i.muted("─".repeat(80))),T(`Forwarded ${J.totalForwarded} logs`),J.totalFailed>0)S(`Failed to forward ${J.totalFailed} logs`)};process.on("SIGINT",async()=>{console.log(""),P("Interrupted, flushing remaining logs..."),await W(),process.exit(0)});let M=null,N=null,K=!1,c=0,D1=async()=>{if(K)return;K=!0;try{if((await m.promises.stat(Z)).size<c)c=0;M=m.createReadStream(Z,{encoding:"utf8",start:c}),N=K1.createInterface({input:M,crlfDelay:Number.POSITIVE_INFINITY});for await(let b9 of N)if(B.push(b9),B.length>=X)await q();c=(await m.promises.stat(Z)).size}catch(r){a(`Failed to read ${Z}: ${r instanceof Error?r.message:String(r)}`)}finally{K=!1}};await D1(),_=m.watch(Z,async(r)=>{if(r==="change"){if(U)clearTimeout(U);U=setTimeout(async()=>{if(K)return;if(M)M.close();if(N)N.close();await W1(50),await D1()},100)}})},q9=async(Z)=>{let $=Z.batchSize??100;if($<=0){if(Z.json)return z("Batch size must be a positive number");throw H("Batch size must be a positive number"),Error("Unreachable")}if(Z.follow&&!Z.file){if(Z.json)return z("--follow flag requires --file to be specified");throw H("--follow flag requires --file to be specified"),Error("Unreachable")}let Q=R();if(!Q.success)throw H(`Failed to read settings: ${Q.error}`),Error("Unreachable");let X=Q.value,Y=O(Z.secretKey,Z.json),G=Z1({secretKey:Y,baseUrl:e({cliFlag:Z.apiBaseUrl,globalUrl:X.apiBaseUrl,globalDomain:X.apiDomain,buildUrlFromDomain:(N)=>`https://api.${N}`,defaultUrl:"https://api.sazabi.com"})}),V=Z.json===!0;if(!V)v("Forwarding logs...");let B=await h({secretKey:Y,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:V});if(!V)P(`Project: ${B.name}`);let J;if(Z.region){if(Z.region!=="us-west-2"&&Z.region!=="us-east-1"){let N=`Invalid region: ${Z.region}. Valid regions: us-west-2, us-east-1`;if(V)return z(N);throw H(N),Error("Unreachable")}J=Z.region}else J=B.region;if(!V)P(`Region: ${J}`);if(!V)P(`Batch size: ${$}`);let q=Z.publicKey?.trim()||X.forwardPublicKey?.trim()||void 0;if(!q){let N=await F3(G,{id:B.id});if(!N)throw H("Failed to get or create public key"),Error("Unreachable");q=N;let K=l({...X,forwardPublicKey:q});if(!K.success)S(`Failed to store public key: ${K.error}`)}if(!V)console.log(""),console.log(i.muted("─".repeat(80))),console.log("");let _=Z.intakeBaseUrl??X.intakeBaseUrl??(X.intakeDomain?Q9(X.intakeDomain,J):void 0)??`https://otlp.${J}.intake.sazabi.com`;try{let N=new URL(_);if(/\.intake\.sazabi\.(dev|com)$/.test(N.host)&&!N.host.startsWith("otlp."))S("Intake base URL may not be the OTLP endpoint. For Sazabi, prefer https://otlp.{region}.intake.sazabi.dev or .com as appropriate.")}catch{}let U=!Z.follow,W=[],M={forwarded:0,failed:0};if(Z.follow&&Z.file)await W3(Z.file,q,J,$,_,V,U?W:void 0);else if(Z.file)await P3(Z.file,q,J,$,_,V,W);else await U3(q,J,$,_,V,W);for(let N of W)M.forwarded+=N.forwarded,M.failed+=N.failed;if(V){let N={forwardedCount:M.forwarded,failedCount:M.failed,batches:W,project:{id:B.id,name:B.name,region:J},intakeBaseUrl:_,batchSize:$,follow:Boolean(Z.follow),file:Z.file??void 0};console.log(JSON.stringify(N))}};var K3=(Z)=>{let $=Z.baseUrl??`wss://${Z.region}.tail.sazabi.com`,Q=new URL($);if(Z.filters&&Object.keys(Z.filters).length>0){let X={};if(Z.filters.severities?.length)X.severities=Z.filters.severities;if(Z.filters.services?.length)X.services=Z.filters.services;if(Z.filters.environments?.length)X.environments=Z.filters.environments;if(Z.filters.searchTerm)X.searchTerm=Z.filters.searchTerm;if(Z.filters.traceId)X.traceId=Z.filters.traceId;if(Object.keys(X).length>0)Q.searchParams.set("filters",JSON.stringify(X))}return Q.toString()},_9=(Z)=>{let $=K3(Z),Q;try{Q=new WebSocket($,[Z.apiKey])}catch(X){let Y=X instanceof Error?X:Error("Failed to open WebSocket connection.");return Z.onError(Y),{close:()=>{}}}return Q.onopen=()=>{Z.onOpen?.()},Q.onmessage=(X)=>{try{let Y;if(typeof X.data==="string")Y=X.data;else if(X.data instanceof ArrayBuffer)Y=new TextDecoder().decode(X.data);else if(X.data instanceof Blob)return;else return;let G=JSON.parse(Y);if(G.type==="logs"&&Array.isArray(G.data))for(let V of G.data)Z.onLog(V)}catch{}},Q.onerror=()=>{let X=Error("WebSocket connection failed. Check the close event for details.");Z.onError(X)},Q.onclose=(X)=>{Z.onClose(X.code,X.reason)},{close:()=>{Q.close()}}};var H9=["ERROR","WARN","INFO","DEBUG","TRACE"],L3=(Z,$)=>{if($)return $;switch(Z){case 1000:return"Normal closure";case 1001:return"Endpoint going away";case 1002:return"Protocol error";case 1003:return"Unsupported data";case 1006:return"Connection closed abnormally (no close frame received)";case 1007:return"Invalid payload data";case 1008:return"Policy violation";case 1009:return"Message too big";case 1010:return"Missing extension";case 1011:return"Internal server error";case 1015:return"TLS handshake failure";case 4001:return"Authentication failed - check your secret key";case 4003:return"Forbidden - key may not have access to this resource";case 4004:return"Project not found";default:return Z?`Unknown (code: ${Z})`:"Unknown"}},N3=(Z)=>{let $=new Date(Z.timestamp).toISOString().split("T")[1],Q=M1(Z.severity,Z.severity.padEnd(7)),X=i.cyan(Z.service.padEnd(20)),Y=Z.body.length>120?`${Z.body.substring(0,117)}...`:Z.body;return`[${$}] ${Q} ${X} ${Y}`},z9=async(Z)=>{let $=R();if(!$.success)throw H(`Failed to read settings: ${$.error}`),Error("Unreachable");let Q=$.value,X=Z.json??!1,Y=Z.severities?.split(",").map((K)=>K.trim().toUpperCase()),G=Z.services?.split(",").map((K)=>K.trim()),V=Z.environments?.split(",").map((K)=>K.trim());if(Y){for(let K of Y)if(!H9.includes(K)){let c=`Invalid severity: ${K}. Valid values: ${H9.join(", ")}`;if(X)return z(c);return H(c)}}if(!X){if(v("Tailing logs..."),Y?.length)P(`Severities: ${Y.join(", ")}`);if(G?.length)P(`Services: ${G.join(", ")}`);if(V?.length)P(`Environments: ${V.join(", ")}`);if(Z.search)P(`Search: ${Z.search}`);if(Z.traceId)P(`Trace ID: ${Z.traceId}`);j1(),$1()}let B=0,J=!1,q,_=()=>{if(q)clearTimeout(q);$1(),P("Interrupted, closing connection..."),N.close(),process.exit(0)},U=O(Z.secretKey,X),M=await(async()=>{if(Z.region==="us-west-2"||Z.region==="us-east-1")return Z.region;return(await h({secretKey:U,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:X})).region})(),N=_9({apiKey:U,region:M,baseUrl:e({cliFlag:Z.tailBaseUrl,globalUrl:Q.tailBaseUrl,globalDomain:Q.tailDomain,buildUrlFromDomain:(K)=>`wss://${M}.tail.${K}`,defaultUrl:`wss://${M}.tail.sazabi.com`}),filters:{severities:Y,services:G,environments:V,searchTerm:Z.search,traceId:Z.traceId},onOpen:()=>{if(J=!0,!X)T("Connected! Waiting for logs..."),$1()},onLog:(K)=>{if(B++,X)F(K);else console.log(N3(K))},onError:()=>{if(!J)S("Connection failed. See close reason below.")},onClose:(K,c)=>{if(process.removeListener("SIGINT",_),q)clearTimeout(q);if(!X){$1(),j1();let D1=L3(K,c);if(K&&K!==1000)a(`Connection closed: ${D1}`);else P(`Connection closed. Received ${B} logs.`)}}});if(!X)P(`Region: ${M}`);if(Z.duration&&Z.duration>0)q=setTimeout(()=>{if(!X)$1(),P("Duration reached, closing connection...");N.close()},Z.duration*1000);process.on("SIGINT",_)};var D9=g("logs","Real-time log operations").withSubcommands({tail:k("tail","Stream logs from current project in real-time",async(Z)=>{let{values:$}=L(Z,{severities:{type:"string"},services:{type:"string"},environments:{type:"string"},search:{type:"string"},"trace-id":{type:"string"},duration:{type:"string"},json:{type:"boolean"},"tail-base-url":{type:"string"},"secret-key":{type:"string"},region:{type:"string"},"api-base-url":{type:"string"}}),Q={};if($.severities)Q.severities=$.severities;if($.services)Q.services=$.services;if($.environments)Q.environments=$.environments;if($.search)Q.search=$.search;if($["trace-id"])Q.traceId=$["trace-id"];if($.duration)Q.duration=f($.duration,1,Number.MAX_SAFE_INTEGER,"Duration",$.json);if($.json)Q.json=!0;if($["tail-base-url"])Q.tailBaseUrl=$["tail-base-url"];if($["secret-key"])Q.secretKey=$["secret-key"];if($.region)Q.region=$.region;if($["api-base-url"])Q.apiBaseUrl=$["api-base-url"];await z9(Q)}).withOptions({severities:{type:"string",description:"Filter by comma-separated severities (e.g., ERROR,WARN,INFO)"},services:{type:"string",description:"Filter by comma-separated service names"},environments:{type:"string",description:"Filter by comma-separated environments"},search:{type:"string",description:"Filter by search term (case-insensitive)"},"trace-id":{type:"string",description:"Filter by trace ID"},duration:{type:"string",description:"Duration to tail in seconds (default: unlimited)"},json:{type:"boolean",description:"Output as JSON (default: pretty-print)"},"tail-base-url":{type:"string",description:"Override tail WebSocket base URL"},"secret-key":{type:"string",description:"Override secret key"},region:{type:"string",description:"Override project region"},"api-base-url":{type:"string",description:"Override API base URL (for project lookup)"}}).withExamples(["sazabi logs tail # Tail all logs in real-time","sazabi logs tail --severities ERROR,WARN # Tail only errors and warnings","sazabi logs tail --services api,worker # Tail specific services","sazabi logs tail --environments production,staging # Tail specific environments",'sazabi logs tail --search "database" # Tail logs matching search term',"sazabi logs tail --json # Output as JSON"]).build(),forward:k("forward","Forward plaintext logs to current project",async(Z)=>{let{values:$}=L(Z,{file:{type:"string",short:"f"},follow:{type:"boolean"},"batch-size":{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"intake-base-url":{type:"string"},"secret-key":{type:"string"},"public-key":{type:"string"},region:{type:"string"}}),Q={};if($.file)Q.file=$.file;if($.follow)Q.follow=$.follow;if($["batch-size"])Q.batchSize=f($["batch-size"],1,Number.MAX_SAFE_INTEGER,"Batch size",$.json);if($["api-base-url"])Q.apiBaseUrl=$["api-base-url"];if($["intake-base-url"])Q.intakeBaseUrl=$["intake-base-url"];if($["secret-key"])Q.secretKey=$["secret-key"];if($.region)Q.region=$.region;if($["public-key"])Q.publicKey=$["public-key"];await q9({...Q,json:$.json})}).withOptions({file:{type:"string",short:"f",description:"Read from file instead of stdin"},follow:{type:"boolean",description:"Follow file for new lines (like tail -f)"},"batch-size":{type:"string",description:"Number of logs to batch before sending (default: 100)"},json:{type:"boolean",description:"Output a final JSON summary"},"api-base-url":{type:"string",description:"Override API base URL"},"intake-base-url":{type:"string",description:"Override intake base URL"},"secret-key":{type:"string",description:"Override secret key"},"public-key":{type:"string",description:"Use this public key value (skip creating/storing)"},region:{type:"string",description:"Override project region"}}).withExamples(['echo "Log message" | sazabi logs forward # Forward from stdin',"sazabi logs forward --file app.log # Forward from file","sazabi logs forward --file app.log --follow # Forward file with tail -f behavior","sazabi logs forward --file app.log --batch-size 50 # Forward with custom batch size"]).build()}).withExamples(["sazabi logs tail # Tail all logs in real-time","sazabi logs tail --severities ERROR,WARN # Tail only errors and warnings","sazabi logs forward --file app.log # Forward from file"]).build();var O3=2000,v1=async(Z)=>{let $=Z.pollIntervalMs??O3,Q=Date.now(),X=!1;while(!0){let Y=await Z.client.responses.get(Z.responseId);if(!Y.success){if(!A3(Y))return f1(Z.printProgress,X),Y}else if(Y.value.status!=="processing")return f1(Z.printProgress,X),Y;let G=Date.now()-Q;if(Z.timeoutMs!==void 0&&G>=Z.timeoutMs){if(f1(Z.printProgress,X),Y.success)return y(Y.value);return y({responseId:Z.responseId,status:"processing",elapsedSeconds:Math.floor(G/1000)})}X=k3(Z.printProgress,X),await W1($)}},k3=(Z,$)=>{if(!Z)return $;if(!$)process.stdout.write(`
|
|
3
|
-
`);return process.stdout.write("."),!0},
|
|
4
|
-
`)},A3=(Z)=>{return Z.statusCode===404};var P9=async(Z,$={})=>{let Q=O($.secretKey,$.json),X=E({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),Y=await M3({message:Z,threadId:$.threadId,secretKey:Q,apiBaseUrl:$.apiBaseUrl,json:$.json,client:X});if(!$.wait){if($.json){F(L1(Y));return}if(h1(Y),Y.status!=="processing")P(`Status: ${Y.status}`);return}if(Y.status!=="processing"){if($.json){F(L1(Y));return}h1(Y),P(`Status: ${Y.status}`);return}if(!$.json)h1(Y);let G=D(await v1({client:X,responseId:Y.responseId,timeoutMs:$.timeout,printProgress:!$.json}),"Failed to get response",$.json);if(G.status==="processing"){if($.json){F(L1(Y));return}P(`Not ready. Poll with: ${m1(Y.responseId)}`);return}if($.json){F(L1(Y,{status:G.status,response:G.response}));return}W9(G.status,G.response)},U9=async(Z,$={})=>{let Q=O($.secretKey,$.json),X=E({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl});if(!$.wait){let G=D(await X.responses.get(Z),"Failed to get response",$.json);if($.json){F(F9(G));return}C3(G);return}let Y=D(await v1({client:X,responseId:Z,timeoutMs:$.timeout,printProgress:!$.json}),"Failed to get response",$.json);if($.json){F(F9(Y));return}if(Y.status==="processing"){P(`Not ready. Poll with: ${m1(Z)}`);return}W9(Y.status,Y.response)},M3=async(Z)=>{if(Z.threadId){let X=D(await Z.client.messages.append(Z.threadId,Z.message),"Failed to send message",Z.json);return{threadId:Z.threadId,responseId:X.responseId,status:X.status}}let $=D(await Z.client.threads.create(Z.message),"Failed to create thread",Z.json),Q=await h({secretKey:Z.secretKey,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:Z.json});return{threadId:$.threadId,responseId:$.responseId,status:$.status,threadUrl:Q1(Q.id,$.threadId)}},m1=(Z)=>{return`sazabi messages get-response ${Z}`},h1=(Z)=>{if(Z.threadUrl)P(`Thread ID: ${Z.threadId}`),P(`View URL: ${Z.threadUrl}`);P(`Response ID: ${Z.responseId}`),P(`Poll with: ${m1(Z.responseId)}`)},L1=(Z,$)=>{let Q=$?.status??Z.status;if(Z.threadUrl)return{threadId:Z.threadId,responseId:Z.responseId,status:Q,...$?{response:$.response}:{},url:Z.threadUrl};return{responseId:Z.responseId,status:Q,...$?{response:$.response}:{}}},F9=(Z)=>{if(Z.status==="processing")return{responseId:Z.responseId,status:Z.status,elapsedSeconds:Z.elapsedSeconds};return{responseId:Z.responseId,status:Z.status,response:Z.response}},C3=(Z)=>{if(P(`Status: ${Z.status}`),Z.status==="processing")return;if(!g1(Z.response))return;console.log(""),console.log(Z.response)},W9=(Z,$)=>{if(Z==="completed"){if(!g1($)){P("Status: completed");return}console.log($);return}if(P(`Status: ${Z}`),!g1($))return;console.log($)},g1=(Z)=>{return Boolean(Z&&Z.trim().length>0)};var T3=async(Z,$)=>{let Q=O($.secretKey,$.json),X=E({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),{messages:Y,nextCursor:G}=D(await X.messages.list(Z,{limit:$.limit,cursor:$.cursor}),"Failed to list messages",$.json);if($.json){F({messages:Y,nextCursor:G});return}if(Y.length===0){x("No messages found.");return}let V=Y.map((B)=>{let J=B.content.find((_)=>_.type==="message"&&Boolean(_.message)),q=J?U1(J.message):w("(no text)");return{id:n(B.id),role:Y1(B.role),content:q,created:u(B.createdAt)}});d(V,[{header:"ID",key:"id"},{header:"Role",key:"role"},{header:"Content",key:"content"},{header:"Created",key:"created"}],{header:"Messages"}),t({type:"cursor",nextCursor:G})},R3=async(Z,$)=>{let Q=O($.secretKey,$.json),X=E({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),{messages:Y,pagination:G}=D(await X.search.messages({query:Z,limit:$.limit,page:$.page,threadId:$.threadId,role:$.role}),"Failed to search messages",$.json);if($.json){F({messages:Y,pagination:G});return}if(Y.length===0){x("No matching messages found.");return}let V=Y.map((B)=>({id:n(B.id),thread:B.threadTitle||w("(no title)"),role:Y1(B.role),content:U1(B.content),score:B.score?.toFixed(2)??"-"}));d(V,[{header:"ID",key:"id"},{header:"Thread",key:"thread"},{header:"Role",key:"role"},{header:"Content",key:"content"},{header:"Score",key:"score",align:"right"}],{header:{title:"Search Results",variant:"search",count:G.totalResults}}),t({type:"page",page:G.page,totalPages:G.totalPages})},K9=g("messages","Message operations").withSubcommands({send:k("send","Send a message (creates new thread if --thread-id omitted)",async(Z)=>{let{values:$,positionals:Q}=L(Z,{"thread-id":{type:"string",short:"t"},wait:{type:"boolean"},timeout:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q.join(" ");if(!X){if($.json)return z("Message is required. Usage: sazabi messages send <message> [--thread-id <id>]");return H("Message is required. Usage: sazabi messages send <message> [--thread-id <id>]")}let Y=$.timeout?f($.timeout,1,3600,"Timeout",$.json)*1000:void 0,G={threadId:$["thread-id"],wait:$.wait,timeout:Y,json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};await P9(X,G)}).withPositionalArgs("<message>").withOptions({"thread-id":{type:"string",short:"t",description:"Thread ID to append to (creates new thread if omitted)"},wait:{type:"boolean",description:"Wait for assistant response and print it"},timeout:{type:"string",description:"Timeout in seconds to wait for response before returning processing state"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi messages send 'Hello' # Start a new thread","sazabi messages send 'Hello' --thread-id abc123 # Append to existing thread","sazabi messages send 'Hello' -t abc123 --wait # Append and wait for reply","sazabi messages send 'Hello' --wait # New thread, wait for reply","sazabi messages send 'Hello' --wait --timeout 120 # Wait up to 2 minutes"]).build(),"get-response":k("get-response","Poll a response by response ID",async(Z)=>{let{values:$,positionals:Q}=L(Z,{wait:{type:"boolean"},timeout:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Response ID is required. Usage: sazabi messages get-response <response-id>");return H("Response ID is required. Usage: sazabi messages get-response <response-id>")}if(Q.length>1){let V=Q.slice(1).join(", ");if($.json)return z(`Unexpected arguments: ${V}`);return H(`Unexpected arguments: ${V}`)}let Y=$.timeout?f($.timeout,1,3600,"Timeout",$.json)*1000:void 0,G={wait:$.wait,timeout:Y,json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};await U9(X,G)}).withPositionalArgs("<response-id>").withOptions({wait:{type:"boolean",description:"Wait for terminal status and print the final result"},timeout:{type:"string",description:"Timeout in seconds to wait before returning processing state"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi messages get-response <response-id> # Check current response status","sazabi messages get-response <response-id> --wait # Wait until response is terminal","sazabi messages get-response <response-id> --wait --timeout 60 # Wait up to 60 seconds","sazabi messages get-response <response-id> --json # Output response state as JSON"]).build(),list:k("list","List messages in a thread",async(Z)=>{let{values:$,positionals:Q}=L(Z,{limit:{type:"string"},cursor:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Thread ID is required. Usage: sazabi messages list <thread-id>");return H("Thread ID is required. Usage: sazabi messages list <thread-id>")}if(Q.length>1){let G=Q.slice(1).join(", ");if($.json)return z(`Unexpected arguments: ${G}`);return H(`Unexpected arguments: ${G}`)}let Y={json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};if($.limit)Y.limit=f($.limit,1,100,"Limit",$.json);if($.cursor)Y.cursor=$.cursor;await T3(X,Y)}).withPositionalArgs("<thread-id>").withOptions({limit:{type:"string",description:"Maximum number of messages to return (default: 50, max: 100)"},cursor:{type:"string",description:"Pagination cursor from previous response"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi messages list <thread-id> # List all messages in thread","sazabi messages list <thread-id> --limit 20 # List with custom limit","sazabi messages list <thread-id> --cursor xyz # List next page"]).build(),search:k("search","Search messages in current project",async(Z)=>{let{values:$,positionals:Q}=L(Z,{limit:{type:"string"},page:{type:"string"},"thread-id":{type:"string"},role:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q.join(" ");if(!X){if($.json)return z("Search query is required. Usage: sazabi messages search <query>");return H("Search query is required. Usage: sazabi messages search <query>")}let Y={json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};if($.limit)Y.limit=f($.limit,1,100,"Limit",$.json);if($.page)Y.page=f($.page,1,Number.MAX_SAFE_INTEGER,"Page",$.json);if($["thread-id"])Y.threadId=$["thread-id"];if($.role)Y.role=_1($.role,["user","assistant"],"Role",$.json);await R3(X,Y)}).withPositionalArgs("<query>").withOptions({limit:{type:"string",description:"Maximum number of results (default: 20, max: 100)"},page:{type:"string",description:"Page number for pagination (default: 1)"},"thread-id":{type:"string",description:"Filter messages by thread ID"},role:{type:"string",description:"Filter by role: user or assistant"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(['sazabi messages search "error handling" # Search messages','sazabi messages search "bug" --limit 50 # Search with limit','sazabi messages search "user input" --role user # Search user messages only','sazabi messages search "response" --thread-id thread-123 # Search in specific thread']).build()}).withExamples(["sazabi messages send 'Hello' # Start a new thread","sazabi messages send 'Follow up' -t <thread-id> # Append to thread","sazabi messages get-response <response-id> # Poll a pending response","sazabi messages list <thread-id> # List messages in thread",'sazabi messages search "error" # Search messages']).build();var c1=["secretKey","apiBaseUrl","webBaseUrl","intakeBaseUrl","tailBaseUrl","apiDomain","webDomain","intakeDomain","tailDomain","forwardPublicKey"],L9=(Z)=>{return c1.includes(Z)},E3=(Z={})=>{let $=D(R(),"Failed to read settings",Z.json);if(Z.json){F({success:!0,settingsFile:J1,settings:$});return}s({"Settings file":J1}),console.log("");let Q=Object.entries($).filter(([,Y])=>Y!=null);if(Q.length===0){x("No settings configured.");return}let X=Q.map(([Y,G])=>({key:Y,value:String(G)})).sort((Y,G)=>Y.key.localeCompare(G.key));d(X,[{header:"Key",key:"key",width:20},{header:"Value",key:"value"}],{header:"Settings"})},j3=(Z,$,Q={})=>{if(!L9(Z)){let Y=c1.join(", "),G=`Invalid setting key: '${Z}'. Valid keys: ${Y}`;if(Q.json){z(G);return}H(G);return}let X=D(R(),"Failed to read settings",Q.json);if(X[Z]=$,D(l(X),"Failed to write settings",Q.json),Q.json){F({success:!0,key:Z,value:$});return}T(`Set ${Z} to ${$}`)},x3=(Z,$={})=>{if(!L9(Z)){let X=c1.join(", "),Y=`Invalid setting key: '${Z}'. Valid keys: ${X}`;if($.json){z(Y);return}H(Y);return}let Q=D(R(),"Failed to read settings",$.json);if(delete Q[Z],D(l(Q),"Failed to write settings",$.json),$.json){F({success:!0,key:Z});return}T(`Cleared ${Z}`)},N9=g("settings","CLI settings management").withSubcommands({view:k("view","Show current CLI settings and file location",async(Z)=>{let{values:$}=L(Z,{json:{type:"boolean"}});E3({json:$.json})}).withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi settings view # Show current settings","sazabi settings view --json # Output as JSON"]).build(),set:k("set","Set a global configuration value",async(Z)=>{let{values:$,positionals:Q}=L(Z,{json:{type:"boolean"}},{allowPositionals:!0}),X=Q[0],Y=Q[1];if(!X){if($.json)return z("Setting key is required. Usage: sazabi settings set <key> <value>");return H("Setting key is required. Usage: sazabi settings set <key> <value>")}if(!Y){if($.json)return z("Value is required. Usage: sazabi settings set <key> <value>");return H("Value is required. Usage: sazabi settings set <key> <value>")}j3(X,Y,{json:$.json})}).withPositionalArgs("<key> <value>").withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi settings set apiBaseUrl https://api.example.com # Set API base URL","sazabi settings set webBaseUrl https://app.example.com # Set web app base URL","sazabi settings set --json apiBaseUrl https://api.example.com # Output as JSON"]).build(),unset:k("unset","Clear a global configuration value",async(Z)=>{let{values:$,positionals:Q}=L(Z,{json:{type:"boolean"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Setting key is required. Usage: sazabi settings unset <key>");return H("Setting key is required. Usage: sazabi settings unset <key>")}x3(X,{json:$.json})}).withPositionalArgs("<key>").withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi settings unset apiBaseUrl # Clear API base URL override","sazabi settings unset --json apiBaseUrl # Output as JSON"]).build()}).withExamples(["sazabi settings view # Show current settings","sazabi settings set apiBaseUrl https://api.example.com # Set API base URL","sazabi settings unset apiBaseUrl # Clear API base URL override"]).build();var H1=async(Z,$,Q=60,X=2000,Y=!1)=>{let G=!1;for(let B=0;B<Q;B++){let J=await Z.threads.get($);if(!J.success)throw Error(`Failed to fetch thread: ${J.error}`);let q=J.value.messages,_=q[q.length-1];if(q.length>0&&_?.role==="assistant"){if(!Y&&G)process.stdout.write(`
|
|
5
|
-
`);return q}if(B<Q-1){if(!Y){if(!G)process.stdout.write(`
|
|
6
|
-
`),G=!0;process.stdout.write(".")}await new Promise((U)=>setTimeout(U,X))}}S(`
|
|
7
|
-
Response not found after waiting - this may indicate an issue`);let V=await Z.threads.get($);if(!V.success)throw Error(`Failed to fetch thread: ${V.error}`);return V.value.messages};var O9=async(Z,$,Q={})=>{let X=O(Q.secretKey,Q.json),Y=E({secretKey:X,apiBaseUrlFlag:Q.apiBaseUrl}),G=await Y.messages.append(Z,$),{status:V}=D(G,"Failed to send message",Q.json);if(Q.wait){let B=await H1(Y,Z,60,2000,!0);if(Q.json)return F({threadId:Z,status:V,messages:B});for(let J of B)if(J.role==="assistant"){for(let q of J.content)if(q.type==="message"&&q.message)console.log(q.message)}return}if(Q.json)return F({threadId:Z,status:V});T("Message sent.")};var k9=async(Z,$)=>{let Q=O($.secretKey,$.json),X=E({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),{thread:Y,messages:G}=D(await X.threads.get(Z),"Failed to get thread",$.json),{id:V}=await h({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl,jsonMode:$.json});if($.json){F({thread:Y,messages:G});return}if(v("Thread"),s({ID:Y.id,URL:Q1(V,Y.id),Title:Y.title||"(no title)",Status:Y.status,Created:u(Y.createdAt),Updated:u(Y.updatedAt)}),console.log(""),v("Messages"),G.length===0){x("No messages.");return}for(let B of G){console.log(Y1(B.role,`[${B.role}] ${u(B.createdAt)}`));for(let J of B.content)if(J.type==="message"&&J.message)console.log(` ${J.message}`);else if(J.type==="tool_call")console.log(w(" [tool call]"));else if(J.type==="artifact")console.log(w(" [artifact]"));else console.log(w(` [${J.type}]`));console.log("")}};var A9=async(Z)=>{let $=O(Z.secretKey,Z.json),X=await E({secretKey:$,apiBaseUrlFlag:Z.apiBaseUrl}).threads.list({limit:Z.limit,cursor:Z.cursor,status:Z.status}),{threads:Y,nextCursor:G}=D(X,"Failed to list threads",Z.json);if(Z.json){F({threads:Y,nextCursor:G});return}if(Y.length===0){x("No threads found.");return}let V=Y.map((B)=>({id:n(B.id),title:B.title||w("(no title)"),status:B.status,updated:u(B.updatedAt)}));d(V,[{header:"ID",key:"id"},{header:"Title",key:"title"},{header:"Status",key:"status"},{header:"Updated",key:"updated"}],{header:"Threads"}),t({type:"cursor",nextCursor:G})};var M9=async(Z,$)=>{let Q=O($.secretKey,$.json),X=E({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),{threads:Y,pagination:G}=D(await X.search.threads({query:Z,limit:$.limit,page:$.page,status:$.status}),"Failed to search threads",$.json);if($.json){F({threads:Y,pagination:G});return}if(Y.length===0){x("No matching threads found.");return}let V=Y.map((B)=>({id:n(B.id),title:B.title||w("(no title)"),status:B.status,score:B.score?.toFixed(2)??"-"}));d(V,[{header:"ID",key:"id"},{header:"Title",key:"title"},{header:"Status",key:"status"},{header:"Score",key:"score",align:"right"}],{header:{title:"Search Results",variant:"search",count:G.totalResults}}),t({type:"page",page:G.page,totalPages:G.totalPages})};var C9=async(Z,$={})=>{let Q=O($.secretKey,$.json),X=E({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),Y=await X.threads.create(Z),{threadId:G,status:V}=D(Y,"Failed to create thread",$.json),{id:B}=await h({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl,jsonMode:$.json});if($.json){if($.wait){let J=await H1(X,G,60,2000,!0);return F({threadId:G,status:V,messages:J})}return F({threadId:G,status:V,url:Q1(B,G)})}if(v("Thread created"),P(`ID: ${G}`),P(`View: ${Q1(B,G)}`),$.wait){let J=await H1(X,G,60,2000,!0);if(J.length===0)return x("No assistant response found.");console.log("");for(let q of J)if(q.role==="assistant"){for(let _ of q.content)if(_.type==="message"&&_.message)console.log(_.message)}}};var T9=g("threads","Thread operations").withSubcommands({start:k("start","Start a thread with initial message",async(Z)=>{let{values:$,positionals:Q}=L(Z,{json:{type:"boolean"},wait:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q.join(" ");if(!X){if($.json)return z("Message is required. Usage: sazabi threads start <message>");return H("Message is required. Usage: sazabi threads start <message>")}await C9(X,{json:$.json,wait:$.wait,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]})}).withPositionalArgs("<message>").withOptions({json:{type:"boolean",description:"Output as JSON"},wait:{type:"boolean",description:"Wait for assistant response and print it"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(['sazabi threads start "Hello" # Start a new thread','sazabi threads start "Explain logs" --wait # Wait and print response']).build(),continue:k("continue","Add message to existing thread",async(Z)=>{let{values:$,positionals:Q}=L(Z,{wait:{type:"boolean"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q[0],Y=Q.slice(1).join(" ");if(!X||!Y){if($.json)return z("Thread ID and message are required. Usage: sazabi threads continue <thread-id> <message>");return H("Thread ID and message are required. Usage: sazabi threads continue <thread-id> <message>")}await O9(X,Y,{wait:$.wait,json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]})}).withPositionalArgs("<thread-id> <message>").withOptions({wait:{type:"boolean",description:"Wait for assistant response and print it"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(['sazabi threads continue <thread-id> "Follow up" # Continue conversation','sazabi threads continue <thread-id> "Explain" --wait # Wait and print response']).build(),list:k("list","List threads from current project",async(Z)=>{let{values:$}=L(Z,{limit:{type:"string"},cursor:{type:"string"},status:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}}),Q={json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};if($.limit)Q.limit=f($.limit,1,100,"Limit",$.json);if($.cursor)Q.cursor=$.cursor;if($.status)Q.status=_1($.status,["regular","archived"],"Status",$.json);await A9(Q)}).withOptions({limit:{type:"string",description:"Maximum number of threads to return (default: 20, max: 100)"},cursor:{type:"string",description:"Pagination cursor from previous response"},status:{type:"string",description:"Filter by status: regular or archived"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi threads list # List all threads","sazabi threads list --limit 50 # List with custom limit","sazabi threads list --status archived # List archived threads","sazabi threads list --cursor xyz # List next page"]).build(),get:k("get","Get thread with messages",async(Z)=>{let{values:$,positionals:Q}=L(Z,{json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Thread ID is required. Usage: sazabi threads get <thread-id>");return H("Thread ID is required. Usage: sazabi threads get <thread-id>")}if(Q.length>1){let Y=Q.slice(1).join(", ");if($.json)return z(`Unexpected arguments: ${Y}`);return H(`Unexpected arguments: ${Y}`)}await k9(X,{json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]})}).withPositionalArgs("<thread-id>").withOptions({json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi threads get <thread-id> # Get thread with messages","sazabi threads get <thread-id> --json # Output as JSON"]).build(),search:k("search","Search threads in current project",async(Z)=>{let{values:$,positionals:Q}=L(Z,{limit:{type:"string"},page:{type:"string"},status:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q.join(" ");if(!X){if($.json)return z("Search query is required. Usage: sazabi threads search <query>");return H("Search query is required. Usage: sazabi threads search <query>")}let Y={json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};if($.limit)Y.limit=f($.limit,1,100,"Limit",$.json);if($.page)Y.page=f($.page,1,Number.MAX_SAFE_INTEGER,"Page",$.json);if($.status)Y.status=_1($.status,["regular","archived"],"Status",$.json);await M9(X,Y)}).withPositionalArgs("<query>").withOptions({limit:{type:"string",description:"Maximum number of results (default: 20, max: 100)"},page:{type:"string",description:"Page number for pagination (default: 1)"},status:{type:"string",description:"Filter by status: regular or archived"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(['sazabi threads search "error handling" # Search threads','sazabi threads search "bug" --limit 50 # Search with limit','sazabi threads search "authentication" --status regular # Search only regular threads']).build()}).withExamples(['sazabi threads start "Hello" # Start new conversation','sazabi threads continue <thread-id> "message" # Continue a thread',"sazabi threads list # List all threads","sazabi threads get <thread-id> # Get thread with messages",'sazabi threads search "error" # Search threads']).build();var R9=[J9,N9,G9,D9,T9,K9];var N1=new Map,E9=(Z)=>{N1.set(Z.name,Z)},j9=(Z)=>{return N1.get(Z)},u1=()=>{return Array.from(N1.values())},x9=(Z)=>{return N1.has(Z)};var O1=(Z,$=!1)=>{let Q=Object.entries(Z);if(Q.length===0&&!$)return"";let X=$?[["help",{type:"boolean",short:"h",description:"Show help for this command"}],...Q]:Q,Y=Math.max(...X.map(([V,B])=>{return`${B.short?`-${B.short}, `:""}--${V}`.length})),G=X.map(([V,B])=>{let q=`${B.short?`-${B.short}, `:""}--${V}`,_=B.description.includes("(required)"),U=B.required&&!_?" (required)":"";return` ${q.padEnd(Y)} ${B.description}${U}`});return`
|
|
2
|
+
var y9=Object.create;var{getPrototypeOf:I9,defineProperty:p1,getOwnPropertyNames:b9}=Object;var f9=Object.prototype.hasOwnProperty;function v9(Z){return this[Z]}var h9,g9,J1=(Z,$,Q)=>{var X=Z!=null&&typeof Z==="object";if(X){var Y=$?h9??=new WeakMap:g9??=new WeakMap,G=Y.get(Z);if(G)return G}Q=Z!=null?y9(I9(Z)):{};let V=$||!Z||!Z.__esModule?p1(Q,"default",{value:Z,enumerable:!0}):Q;for(let B of b9(Z))if(!f9.call(V,B))p1(V,B,{get:v9.bind(Z,B),enumerable:!0});if(X)Y.set(Z,V);return V};var m9=(Z,$)=>()=>($||Z(($={exports:{}}).exports,$),$.exports);var Q1=m9((I3,k1)=>{var D1=process||{},l1=D1.argv||[],z1=D1.env||{},c9=!(!!z1.NO_COLOR||l1.includes("--no-color"))&&(!!z1.FORCE_COLOR||l1.includes("--color")||D1.platform==="win32"||(D1.stdout||{}).isTTY&&z1.TERM!=="dumb"||!!z1.CI),u9=(Z,$,Q=Z)=>(X)=>{let Y=""+X,G=Y.indexOf($,Z.length);return~G?Z+d9(Y,$,Q,G)+$:Z+Y+$},d9=(Z,$,Q,X)=>{let Y="",G=0;do Y+=Z.substring(G,X)+Q,G=X+$.length,X=Z.indexOf($,G);while(~X);return Y+Z.substring(G)},r1=(Z=c9)=>{let $=Z?u9:()=>String;return{isColorSupported:Z,reset:$("\x1B[0m","\x1B[0m"),bold:$("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:$("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:$("\x1B[3m","\x1B[23m"),underline:$("\x1B[4m","\x1B[24m"),inverse:$("\x1B[7m","\x1B[27m"),hidden:$("\x1B[8m","\x1B[28m"),strikethrough:$("\x1B[9m","\x1B[29m"),black:$("\x1B[30m","\x1B[39m"),red:$("\x1B[31m","\x1B[39m"),green:$("\x1B[32m","\x1B[39m"),yellow:$("\x1B[33m","\x1B[39m"),blue:$("\x1B[34m","\x1B[39m"),magenta:$("\x1B[35m","\x1B[39m"),cyan:$("\x1B[36m","\x1B[39m"),white:$("\x1B[37m","\x1B[39m"),gray:$("\x1B[90m","\x1B[39m"),bgBlack:$("\x1B[40m","\x1B[49m"),bgRed:$("\x1B[41m","\x1B[49m"),bgGreen:$("\x1B[42m","\x1B[49m"),bgYellow:$("\x1B[43m","\x1B[49m"),bgBlue:$("\x1B[44m","\x1B[49m"),bgMagenta:$("\x1B[45m","\x1B[49m"),bgCyan:$("\x1B[46m","\x1B[49m"),bgWhite:$("\x1B[47m","\x1B[49m"),blackBright:$("\x1B[90m","\x1B[39m"),redBright:$("\x1B[91m","\x1B[39m"),greenBright:$("\x1B[92m","\x1B[39m"),yellowBright:$("\x1B[93m","\x1B[39m"),blueBright:$("\x1B[94m","\x1B[39m"),magentaBright:$("\x1B[95m","\x1B[39m"),cyanBright:$("\x1B[96m","\x1B[39m"),whiteBright:$("\x1B[97m","\x1B[39m"),bgBlackBright:$("\x1B[100m","\x1B[49m"),bgRedBright:$("\x1B[101m","\x1B[49m"),bgGreenBright:$("\x1B[102m","\x1B[49m"),bgYellowBright:$("\x1B[103m","\x1B[49m"),bgBlueBright:$("\x1B[104m","\x1B[49m"),bgMagentaBright:$("\x1B[105m","\x1B[49m"),bgCyanBright:$("\x1B[106m","\x1B[49m"),bgWhiteBright:$("\x1B[107m","\x1B[49m")}};k1.exports=r1();k1.exports.createColors=r1});var M=J1(Q1(),1),i={success:(Z)=>M.default.green(Z),error:(Z)=>M.default.red(Z),warning:(Z)=>M.default.yellow(Z),info:(Z)=>M.default.blue(Z),muted:(Z)=>M.default.dim(Z),bold:(Z)=>M.default.bold(Z),cyan:(Z)=>M.default.cyan(Z),gray:(Z)=>M.default.gray(Z)},A1=(Z,$)=>{let Q=$??Z,X=Z.trim().toUpperCase(),G={ERROR:M.default.red,FATAL:M.default.red,WARN:M.default.yellow,WARNING:M.default.yellow,INFO:M.default.blue,DEBUG:M.default.gray,TRACE:M.default.gray}[X];return G?G(Q):Q},X1=(Z,$)=>{let Q=$??Z;if(Z==="user")return M.default.blue(Q);if(Z==="assistant")return M.default.green(Q);return M.default.gray(Q)};var F1=(Z,$=60)=>{if(Z.length<=$)return Z;return`${Z.substring(0,$-3)}...`},u=(Z)=>{return new Date(Z).toLocaleString()},n=(Z)=>{return`${Z.substring(0,8)}...`};var i1=J1(Q1(),1);var R=(Z)=>{return i1.default.bold(Z)};var B1=J1(Q1(),1),M1="✓",T1="✗",n1="⚠",a1="ℹ",p9=B1.default.green(M1),l9=B1.default.red(T1),r9=B1.default.yellow(n1),i9=B1.default.cyan(a1);var a=J1(Q1(),1),b=(Z)=>{console.log(a.default.yellow(Z))},U=(Z)=>{console.log(JSON.stringify(Z,null,2))},z=(Z,$=1)=>{console.error(JSON.stringify({success:!1,error:Z},null,2)),process.exit($)},h=(Z)=>{console.log(a.default.bold(Z))},F=(Z)=>{console.log(a.default.dim(Z))},j=(Z)=>{console.log(a.default.green(Z))},o=(Z)=>{console.log(a.default.red(Z))},v=(Z)=>{console.log(a.default.yellow(Z))},E=(Z)=>a.default.dim(Z);var Y1=J1(Q1(),1),t=(Z)=>{if(Z.type==="cursor")if(Z.nextCursor)console.log(Y1.default.dim(`Next: --cursor ${Z.nextCursor}`));else console.log(Y1.default.dim("End of results"));else console.log(Y1.default.dim(`Page ${Z.page} of ${Z.totalPages}`))},C1=(Z,$)=>{console.log(Y1.default.bold(`${Z} (${$} total)`))},R1=(Z,$)=>{console.log(Y1.default.bold(`${Z} (${$} results)`))};var $3=(Z)=>{console.error(Z)};var H=(Z,$=1)=>{$3(Z),process.exit($)};var j1=(Z="─",$=80)=>{console.log(Z.repeat($))};var $1=()=>{console.log("")};var Z3=(Z,$=2)=>{console.log(`${" ".repeat($)}${Z}`)},s=(Z,$=0)=>{for(let[Q,X]of Object.entries(Z))console.log(`${" ".repeat($)}${Q}: ${X}`)},d=(Z,$,Q)=>{if(Z.length===0)return;if(Q?.header){let J=typeof Q.header==="string"?{title:Q.header}:Q.header,q=J.variant??"section",_=J.count??Z.length;if(q==="results")C1(J.title,_);else if(q==="search")R1(J.title,_);else h(J.title)}let X=/\u001B\[[0-?]*[ -/]*[@-~]/g,Y=(J)=>(J??"").replace(X,"").length,G=(J,q,_)=>{let W=Y(J),P=Math.max(0,q-W);return _==="right"?`${" ".repeat(P)}${J}`:`${J}${" ".repeat(P)}`},V=$.map((J)=>{if(J.width)return J.width;let q=Y(J.header),_=Math.max(...Z.map((W)=>Y(W[J.key]||"")));return Math.max(q,_)}),B=[$.map((J,q)=>{let _=V[q]||0;return G(J.header,_,"left")}),...Z.map((J)=>$.map((q,_)=>{let W=J[q.key]||"",P=V[_]||0,A=q.align||"left";return G(W,P,A)}))];for(let J of B)Z3(J.join(" "));$1()};var S=(Z)=>({success:!0,value:Z}),y=(Z,$)=>({success:!1,error:Z,...$!==void 0&&{statusCode:$}});var D=(Z,$,Q)=>{if(!Z.success){let X=`${$}: ${Z.error}`;if(Q)return z(X);return H(X)}return Z.value};var Q3="https://api.sazabi.com",X3="/v1",Y3=1e4,I=async(Z,$,Q,X)=>{let G=`${Z.baseUrl??Q3}${X3}${Q}`,V=new AbortController,B=setTimeout(()=>V.abort(),Y3);try{let J=await fetch(G,{method:$,headers:{Authorization:`Bearer ${Z.secretKey}`,"Content-Type":"application/json"},body:X?JSON.stringify(X):void 0,signal:V.signal});if(!J.ok){if(J.status===401)return y(`Authentication failed for ${Q}. Check your secret key.`,401);if(J.status===404)return y(`Resource not found: ${Q}`,404);let _=await J.text();return y(`API error (${J.status}) for ${Q}: ${_}`,J.status)}if(J.status===204)return S({});let q=await J.json();return S(q)}catch(J){if(J instanceof Error&&J.name==="AbortError")return y("Request timed out. Please try again.");let q=J instanceof Error?J.message:String(J);return y(`Request failed: ${q}`)}finally{clearTimeout(B)}},V1=(Z)=>{let $=Object.entries(Z).filter((Q)=>Q[1]!==void 0&&(typeof Q[1]==="string"||typeof Q[1]==="number"||typeof Q[1]==="boolean")).map(([Q,X])=>`${Q}=${encodeURIComponent(String(X))}`);return $.length>0?`?${$.join("&")}`:""},Z1=(Z)=>({project:{get:()=>I(Z,"GET","/project")},threads:{list:($={})=>I(Z,"GET",`/threads${V1($)}`),get:($)=>I(Z,"GET",`/threads/${$}`),create:($)=>I(Z,"POST","/threads",{message:$}),getStatus:($)=>I(Z,"GET",`/threads/${$}/status`)},messages:{list:($,Q={})=>I(Z,"GET",`/threads/${$}/messages${V1(Q)}`),append:($,Q)=>I(Z,"POST",`/threads/${$}/messages`,{message:Q})},responses:{get:($)=>I(Z,"GET",`/responses/${$}`)},search:{threads:($)=>I(Z,"GET",`/search/threads${V1($)}`),messages:($)=>I(Z,"GET",`/search/messages${V1($)}`)},publicKeys:{list:($)=>I(Z,"GET",`/public-keys${V1($??{})}`),get:($)=>I(Z,"GET",`/public-keys/${$}`),create:($)=>I(Z,"POST","/public-keys",$)}});import{parseArgs as G3}from"node:util";var O=(Z,$,Q={})=>{let X=G3({args:Z,options:$,allowPositionals:Boolean(Q.allowPositionals),strict:!1,tokens:!0}),Y=Object.hasOwn($,"json")&&X.values.json===!0,G=new Set(Object.keys($)),V=new Set(Object.entries($).map(([,J])=>J.short).filter((J)=>Boolean(J))),B=[];if(Array.isArray(X.tokens))for(let J of X.tokens){if(J.kind!=="option")continue;let q=J.name,_=q.length>1;if(!(G.has(q)||!_&&V.has(q))){let P=_?`--${q}`:`-${q}`;if(!B.includes(P))B.push(P)}}for(let J of Object.keys(X.values))if(!G.has(J)){let q=J.length>1?`--${J}`:`-${J}`;if(!B.includes(q))B.push(q)}if(B.length>0){let J=`Unknown option${B.length>1?"s":""}: ${B.join(", ")}`;if(Y)z(J);H(J)}for(let[J,q]of Object.entries($))if(q.type==="string"&&X.values[J]===!0){let W=`Option ${J.length===1?`-${J}`:`--${J}`} requires a value`;if(Y)z(W);H(W)}for(let[J,q]of Object.entries($)){let _=X.values[J];if(q.type==="string"&&typeof _==="string"){if(_.startsWith("--")||_.length===2&&_[0]==="-"&&/[a-zA-Z]/.test(_.charAt(1))){let A=`Option ${J.length===1?`-${J}`:`--${J}`} received "${_}" as its value. Did you forget to provide a value?`;if(Y)z(A);H(A)}}}return{values:X.values,positionals:X.positionals}};import*as p from"node:fs";import*as t1 from"node:os";import*as x1 from"node:path";var o1={};var k=(Z)=>{if(Z===void 0||Z===null)return;if(typeof Z==="string")return Z.length>0?Z:void 0;return},E1=x1.join(t1.homedir(),".sazabi"),G1=x1.join(E1,"settings.json"),J3=()=>{if(!p.existsSync(E1))p.mkdirSync(E1,{recursive:!0,mode:448})},C=()=>{try{if(!p.existsSync(G1))return S(o1);let Z=p.readFileSync(G1,"utf-8"),$=JSON.parse(Z);if(typeof $==="object"&&$!==null&&"projects"in $){let Y=$.projects??{},G=$.currentProject??null,V;if(G&&Y[G]?.secretKey)V=Y[G].secretKey;else{let q=Object.values(Y).find((_)=>typeof _?.secretKey==="string"&&_.secretKey.length>0);if(q?.secretKey)V=q.secretKey}let B={secretKey:k($.secretKey)??V,apiBaseUrl:k($.apiBaseUrl),webBaseUrl:k($.webBaseUrl),intakeBaseUrl:k($.intakeBaseUrl),tailBaseUrl:k($.tailBaseUrl),apiDomain:k($.apiDomain),webDomain:k($.webDomain),intakeDomain:k($.intakeDomain),tailDomain:k($.tailDomain),forwardPublicKey:k($.forwardPublicKey)},J=l(B);if(!J.success)return J;return S(B)}let X={secretKey:k($.secretKey),apiBaseUrl:k($.apiBaseUrl),webBaseUrl:k($.webBaseUrl),intakeBaseUrl:k($.intakeBaseUrl),tailBaseUrl:k($.tailBaseUrl),apiDomain:k($.apiDomain),webDomain:k($.webDomain),intakeDomain:k($.intakeDomain),tailDomain:k($.tailDomain),forwardPublicKey:k($.forwardPublicKey)};return S(X)}catch(Z){let $=Z instanceof Error?Z.message:String(Z);return y(`Failed to read settings: ${$}`)}},l=(Z)=>{try{return J3(),p.writeFileSync(G1,JSON.stringify(Z,null,2),{encoding:"utf-8",mode:384}),S(void 0)}catch($){let Q=$ instanceof Error?$.message:String($);return y(`Failed to write settings: ${Q}`)}};var e=(Z)=>{let{cliFlag:$,globalUrl:Q,globalDomain:X,buildUrlFromDomain:Y,defaultUrl:G}=Z;if($)return $;if(Q)return Q;if(X)return Y(X);return G},T=(Z,$)=>{if(Z&&Z.trim().length>0)return Z.trim();let Q=process.env.SAZABI_SECRET_KEY;if(Q&&Q.trim().length>0)return Q.trim();let X=D(C(),"Failed to read settings",$);if(X.secretKey&&X.secretKey.trim().length>0)return X.secretKey.trim();let Y="No secret key found. Use 'sazabi auth login <secret-key>' or pass --secret-key or set SAZABI_SECRET_KEY.";if($)return z(Y);return H(Y)},f=(Z)=>{let $=D(C(),"Failed to read settings",Z.jsonMode),Q=e({cliFlag:Z.apiBaseUrlFlag,globalUrl:$.apiBaseUrl,globalDomain:$.apiDomain,buildUrlFromDomain:(X)=>`https://api.${X}`,defaultUrl:"https://api.sazabi.com"});return Z1({secretKey:Z.secretKey,baseUrl:Q})},s1=new Map,w1=new Map,g=async(Z)=>{let $=D(C(),"Failed to read settings",Z.jsonMode),Q=e({cliFlag:Z.apiBaseUrlFlag,globalUrl:$.apiBaseUrl,globalDomain:$.apiDomain,buildUrlFromDomain:(B)=>`https://api.${B}`,defaultUrl:"https://api.sazabi.com"}),X=`${Z.secretKey}@${Q}`,Y=s1.get(X);if(Y)return Y;let G=w1.get(X);if(G)return G;let V=(async()=>{let J=await Z1({secretKey:Z.secretKey,baseUrl:Q}).project.get(),q=D(J,"Failed to fetch project info",Z.jsonMode);return s1.set(X,q),q})();w1.set(X,V);try{return await V}finally{w1.delete(X)}},e1=()=>{let Z=D(C(),"Failed to read settings");if(Z.webBaseUrl)return Z.webBaseUrl;if(Z.webDomain)return`https://app.${Z.webDomain}`;if(Z.apiDomain)return`https://app.${Z.apiDomain}`;if(Z.apiBaseUrl?.includes("sazabi.dev"))return"https://app.sazabi.dev";return"https://app.sazabi.com"},$9=(Z)=>{return`${e1()}/projects/${Z}`},U1=(Z,$)=>{return`${e1()}/projects/${Z}/threads/${$}`},Z9=(Z,$)=>{return`https://otlp.${$}.intake.${Z}`};var S1=(Z,$)=>{let Q=Z?.json;if(!Q||Q.type!=="boolean")throw Error(`${$} must include a boolean --json option (enforced by CommandBuilder)`)};class Q9{name;description;handler;options;examples;positionalArgs;allowNoJson=!1;constructor(Z,$,Q){this.name=Z,this.description=$,this.handler=Q}withOptions(Z){return this.options=Z,this}withExamples(Z){return this.examples=Z,this}withPositionalArgs(Z){return this.positionalArgs=Z,this}build(){if(!this.allowNoJson)S1(this.options,`Subcommand "${this.name}"`);return{name:this.name,description:this.description,handler:this.handler,options:this.options,examples:this.examples,positionalArgs:this.positionalArgs}}allowWithoutJson(){return this.allowNoJson=!0,this}}class X9{name;description;handler;subcommands;options;examples;positionalArgs;allowNoJson=!1;constructor(Z,$){this.name=Z,this.description=$}withHandler(Z){return this.handler=Z,this}withSubcommands(Z){return this.subcommands=Z,this}withOptions(Z){return this.options=Z,this}withExamples(Z){return this.examples=Z,this}withPositionalArgs(Z){return this.positionalArgs=Z,this}build(){if(!this.handler&&!this.subcommands)throw Error(`Command "${this.name}" must have either a handler or subcommands`);if(!this.allowNoJson){if(this.handler)S1(this.options,`Command "${this.name}"`);if(this.subcommands)for(let[Z,$]of Object.entries(this.subcommands))S1($.options,`Subcommand "${this.name} ${Z}"`)}return{name:this.name,description:this.description,handler:this.handler,subcommands:this.subcommands,options:this.options,examples:this.examples,positionalArgs:this.positionalArgs}}allowWithoutJson(){return this.allowNoJson=!0,this}}var x=(Z,$)=>{return new X9(Z,$)},N=(Z,$,Q)=>{return new Q9(Z,$,Q)};var y1=async(Z={})=>{let $=T(Z.secretKey,Z.json),Q=await g({secretKey:$,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:Z.json});if(Z.json){U({project:Q});return}s({Project:Q.name,ID:Q.id,"Org ID":Q.organizationId??E("(unknown)"),URL:$9(Q.id),Region:Q.region})},Y9=x("status","Show current project info").withHandler(async(Z)=>{let{values:$,positionals:Q}=O(Z,{json:{type:"boolean"},"secret-key":{type:"string"},"api-base-url":{type:"string"}},{allowPositionals:!0});if(Q.length>0){let X=Q.join(", ");if($.json)return z(`Unexpected arguments: ${X}`);return H(`Unexpected arguments: ${X}`)}await y1({json:$.json,secretKey:$["secret-key"],apiBaseUrl:$["api-base-url"]})}).withOptions({json:{type:"boolean",description:"Output as JSON"},"secret-key":{type:"string",description:"Override secret key"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi status # Show current context","sazabi status --json # Output as JSON"]).build();var B3=async(Z,$={})=>{let Q=D(C(),"Failed to read settings",$.json),X=e({cliFlag:$.apiBaseUrl,globalUrl:Q.apiBaseUrl,globalDomain:Q.apiDomain,buildUrlFromDomain:(B)=>`https://api.${B}`,defaultUrl:"https://api.sazabi.com"}),Y=Z1({secretKey:Z,baseUrl:X}),G=D(await Y.project.get(),"Authentication failed",$.json),V={...Q,secretKey:Z};if(D(l(V),"Failed to save credentials",$.json),$.json){U({project:{id:G.id,organizationId:G.organizationId,name:G.name,region:G.region}});return}j("Successfully authenticated!"),s({Project:G.name,ID:G.id,"Org ID":G.organizationId,Region:G.region})},V3=(Z)=>{let $=D(C(),"Failed to read settings",Z.json),Q=Boolean($.secretKey),X={...$};if(delete X.secretKey,D(l(X),"Failed to remove credentials",Z.json),Z.json){U({removed:Q});return}j(Q?"Removed saved secret key.":"No secret key was saved.")},G9=x("auth","Authentication management").withSubcommands({login:N("login","Save and validate a secret key",async(Z)=>{let{values:$,positionals:Q}=O(Z,{json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Secret key is required. Usage: sazabi auth login <secret-key>");throw H("Secret key is required. Usage: sazabi auth login <secret-key>"),Error("Unreachable")}if(Q.length>1){let Y=Q.slice(1).join(", ");if($.json)return z(`Unexpected arguments: ${Y}`);return H(`Unexpected arguments: ${Y}`)}await B3(X,{json:$.json,apiBaseUrl:$["api-base-url"]})}).withPositionalArgs("<secret-key>").withOptions({json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi auth login sazabi_secret_xxx # Authenticate with secret key","sazabi auth login sazabi_secret_xxx --json # Output as JSON for scripting"]).build(),logout:N("logout","Remove current project credentials",async(Z)=>{let{values:$,positionals:Q}=O(Z,{json:{type:"boolean"}},{allowPositionals:!0});if(Q.length>0){let X=Q.join(", ");if($.json)return z(`Unexpected arguments: ${X}`);return H(`Unexpected arguments: ${X}`)}V3({json:$.json})}).withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi auth logout # Remove saved secret key"]).build(),whoami:N("whoami","Display current context (alias for status)",async(Z)=>{let{values:$,positionals:Q}=O(Z,{json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0});if(Q.length>0){let X=Q.join(", ");if($.json)return z(`Unexpected arguments: ${X}`);return H(`Unexpected arguments: ${X}`)}await y1({json:$.json,secretKey:$["secret-key"],apiBaseUrl:$["api-base-url"]})}).withOptions({json:{type:"boolean",description:"Output as JSON"},"secret-key":{type:"string",description:"Override secret key"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi auth whoami # Show current context","sazabi auth whoami --json # Output as JSON"]).build()}).withExamples(["sazabi auth login sazabi_secret_xxx # Authenticate with secret key","sazabi auth logout # Remove saved secret key","sazabi auth whoami # Show current context"]).build();var w=(Z,$,Q,X,Y)=>{let G=Number.parseInt(Z,10);if(Number.isNaN(G)||G<$||G>Q){let V=`${X} must be between ${$} and ${Q}`;if(Y)return z(V);return H(V)}return G},q1=(Z,$,Q,X)=>{if(!$.includes(Z)){let Y=$.map((V)=>`"${V}"`).join(" or "),G=`${Q} must be ${Y}`;if(X)return z(G);return H(G)}return Z};import*as m from"node:fs";import*as P1 from"node:readline";var W1=(Z)=>new Promise(($)=>setTimeout($,Z));var q3=(Z,$)=>{let Q=$??`https://${Z}.intake.sazabi.com`,X=Q.endsWith("/")?Q.slice(0,-1):Q,Y=X.match(/^https:\/\/([a-z0-9-]+)\.intake\.([a-z0-9.]+)$/);return`${Y?`https://otlp.${Y[1]}.intake.${Y[2]}`:X}/v1/logs`},_3=async(Z,$,Q=3,X=1000,Y=1e4)=>{let G;for(let V=0;V<=Q;V++){let B=new AbortController,J=setTimeout(()=>B.abort(),Y);try{let q=await fetch(Z,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($),signal:B.signal});if(q.ok)return S(void 0);if(q.status===401||q.status===403)return y("Authentication failed. Check your public key.");if(q.status===429){let _=await q.text();G=Error(`Rate limited (429): ${_}`)}else if(q.status>=400&&q.status<500){let _=await q.text();return y(`Client error (${q.status}): ${_}`)}else{let _=await q.text();G=Error(`Server error (${q.status}): ${_}`)}}catch(q){if(q instanceof Error&&q.name==="AbortError")G=Error("Request timed out");else G=q instanceof Error?q:Error(String(q))}finally{clearTimeout(J)}if(V<Q){let q=X*2**V;await new Promise((_)=>setTimeout(_,q))}}return y(`Failed after ${Q+1} attempts: ${G?.message??"Unknown error"}`)},J9=async(Z,$)=>{let Q=q3(Z.region,Z.intakeBaseUrl),X=$.resourceLogs?.reduce((G,V)=>G+(V.scopeLogs?.reduce((B,J)=>B+(J.logRecords?.length??0),0)??0),0)??0;if(Z.verbose)F(`Forwarding ${X} logs...`);let Y=await _3(Q,$);if(Y.success)return{forwardedCount:X,failedCount:0};if(Z.verbose)v(`Failed to forward logs: ${Y.error}`);return{forwardedCount:0,failedCount:X,error:Y.error}};var H3=(Z)=>{return`${Z.getTime()*1e6}`},B9=(Z,$)=>{let X=H3(new Date),Y=Z.filter((G)=>G.trim().length>0).map((G)=>({timeUnixNano:X,observedTimeUnixNano:X,severityNumber:9,severityText:"INFO",body:{stringValue:G},attributes:[]}));return{resourceLogs:[{resource:{attributes:[{key:"service.name",value:{stringValue:"sazabi-cli"}},{key:"sazabi.public_key",value:{stringValue:$}}]},scopeLogs:[{scope:{name:"sazabi-cli-forward",version:"1.0.0"},logRecords:Y}]}]}};var z3=async(Z,$)=>{F("Ensuring public key exists...");let Q=await Z.publicKeys.create({name:"sazabi-cli-forward"});if(!Q.success)return o(`Failed to create public key: ${Q.error}`),null;return j(`Created new public key: ${Q.value.publicKey.name}`),Q.value.publicKey.value},I1=(Z,$,Q,X,Y,G)=>{return async()=>{if(Z.length===0)return;let V=B9(Z,Q),B=await J9({region:X,publicKey:Q,verbose:!0,intakeBaseUrl:Y},V);if($.totalForwarded+=B.forwardedCount,$.totalFailed+=B.failedCount,G)G({forwarded:B.forwardedCount,failed:B.failedCount});Z.length=0}},D3=async(Z,$,Q,X,Y,G,V)=>{let B=m.createReadStream(Z),J=P1.createInterface({input:B,crlfDelay:Number.POSITIVE_INFINITY}),q=[],_={totalForwarded:0,totalFailed:0},W=I1(q,_,$,Q,Y,(P)=>V?.push(P));try{for await(let P of J)if(q.push(P),q.length>=X)await W()}catch(P){o(`Failed to read ${Z}: ${P instanceof Error?P.message:String(P)}`);return}if(await W(),G);else if(console.log(""),console.log(i.muted("─".repeat(80))),j(`Forwarded ${_.totalForwarded} logs`),_.totalFailed>0)v(`Failed to forward ${_.totalFailed} logs`)},F3=async(Z,$,Q,X,Y,G)=>{let V=P1.createInterface({input:process.stdin,output:process.stdout,terminal:!1}),B=[],J={totalForwarded:0,totalFailed:0},q=I1(B,J,Z,$,X,(_)=>G?.push(_));try{for await(let _ of V)if(B.push(_),B.length>=Q)await q()}catch(_){o(`Failed to read from stdin: ${_ instanceof Error?_.message:String(_)}`);return}if(await q(),Y);else if(console.log(""),console.log(i.muted("─".repeat(80))),j(`Forwarded ${J.totalForwarded} logs`),J.totalFailed>0)v(`Failed to forward ${J.totalFailed} logs`)},U3=async(Z,$,Q,X,Y,G,V)=>{let B=[],J={totalForwarded:0,totalFailed:0},q=I1(B,J,$,Q,Y,(r)=>V?.push(r)),_=null,W=null,P=async()=>{if(W)clearTimeout(W);if(_)_.close();if(await q(),G);else if(console.log(""),console.log(i.muted("─".repeat(80))),j(`Forwarded ${J.totalForwarded} logs`),J.totalFailed>0)v(`Failed to forward ${J.totalFailed} logs`)};process.on("SIGINT",async()=>{console.log(""),F("Interrupted, flushing remaining logs..."),await P(),process.exit(0)});let A=null,L=null,K=!1,c=0,H1=async()=>{if(K)return;K=!0;try{if((await m.promises.stat(Z)).size<c)c=0;A=m.createReadStream(Z,{encoding:"utf8",start:c}),L=P1.createInterface({input:A,crlfDelay:Number.POSITIVE_INFINITY});for await(let S9 of L)if(B.push(S9),B.length>=X)await q();c=(await m.promises.stat(Z)).size}catch(r){o(`Failed to read ${Z}: ${r instanceof Error?r.message:String(r)}`)}finally{K=!1}};await H1(),_=m.watch(Z,async(r)=>{if(r==="change"){if(W)clearTimeout(W);W=setTimeout(async()=>{if(K)return;if(A)A.close();if(L)L.close();await W1(50),await H1()},100)}})},V9=async(Z)=>{let $=Z.batchSize??100;if($<=0){if(Z.json)return z("Batch size must be a positive number");throw H("Batch size must be a positive number"),Error("Unreachable")}if(Z.follow&&!Z.file){if(Z.json)return z("--follow flag requires --file to be specified");throw H("--follow flag requires --file to be specified"),Error("Unreachable")}let Q=C();if(!Q.success)throw H(`Failed to read settings: ${Q.error}`),Error("Unreachable");let X=Q.value,Y=T(Z.secretKey,Z.json),G=Z1({secretKey:Y,baseUrl:e({cliFlag:Z.apiBaseUrl,globalUrl:X.apiBaseUrl,globalDomain:X.apiDomain,buildUrlFromDomain:(L)=>`https://api.${L}`,defaultUrl:"https://api.sazabi.com"})}),V=Z.json===!0;if(!V)h("Forwarding logs...");let B=await g({secretKey:Y,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:V});if(!V)F(`Project: ${B.name}`);let J;if(Z.region){if(Z.region!=="us-west-2"&&Z.region!=="us-east-1"){let L=`Invalid region: ${Z.region}. Valid regions: us-west-2, us-east-1`;if(V)return z(L);throw H(L),Error("Unreachable")}J=Z.region}else J=B.region;if(!V)F(`Region: ${J}`);if(!V)F(`Batch size: ${$}`);let q=Z.publicKey?.trim()||X.forwardPublicKey?.trim()||void 0;if(!q){let L=await z3(G,{id:B.id});if(!L)throw H("Failed to get or create public key"),Error("Unreachable");q=L;let K=l({...X,forwardPublicKey:q});if(!K.success)v(`Failed to store public key: ${K.error}`)}if(!V)console.log(""),console.log(i.muted("─".repeat(80))),console.log("");let _=Z.intakeBaseUrl??X.intakeBaseUrl??(X.intakeDomain?Z9(X.intakeDomain,J):void 0)??`https://otlp.${J}.intake.sazabi.com`;try{let L=new URL(_);if(/\.intake\.sazabi\.(dev|com)$/.test(L.host)&&!L.host.startsWith("otlp."))v("Intake base URL may not be the OTLP endpoint. For Sazabi, prefer https://otlp.{region}.intake.sazabi.dev or .com as appropriate.")}catch{}let W=!Z.follow,P=[],A={forwarded:0,failed:0};if(Z.follow&&Z.file)await U3(Z.file,q,J,$,_,V,W?P:void 0);else if(Z.file)await D3(Z.file,q,J,$,_,V,P);else await F3(q,J,$,_,V,P);for(let L of P)A.forwarded+=L.forwarded,A.failed+=L.failed;if(V){let L={forwardedCount:A.forwarded,failedCount:A.failed,batches:P,project:{id:B.id,name:B.name,region:J},intakeBaseUrl:_,batchSize:$,follow:Boolean(Z.follow),file:Z.file??void 0};console.log(JSON.stringify(L))}};var W3=(Z)=>{let $=Z.baseUrl??`wss://${Z.region}.tail.sazabi.com`,Q=new URL($);if(Z.filters&&Object.keys(Z.filters).length>0){let X={};if(Z.filters.severities?.length)X.severities=Z.filters.severities;if(Z.filters.services?.length)X.services=Z.filters.services;if(Z.filters.environments?.length)X.environments=Z.filters.environments;if(Z.filters.searchTerm)X.searchTerm=Z.filters.searchTerm;if(Z.filters.traceId)X.traceId=Z.filters.traceId;if(Object.keys(X).length>0)Q.searchParams.set("filters",JSON.stringify(X))}return Q.toString()},q9=(Z)=>{let $=W3(Z),Q;try{Q=new WebSocket($,[Z.apiKey])}catch(X){let Y=X instanceof Error?X:Error("Failed to open WebSocket connection.");return Z.onError(Y),{close:()=>{}}}return Q.onopen=()=>{Z.onOpen?.()},Q.onmessage=(X)=>{try{let Y;if(typeof X.data==="string")Y=X.data;else if(X.data instanceof ArrayBuffer)Y=new TextDecoder().decode(X.data);else if(X.data instanceof Blob)return;else return;let G=JSON.parse(Y);if(G.type==="logs"&&Array.isArray(G.data))for(let V of G.data)Z.onLog(V)}catch{}},Q.onerror=()=>{let X=Error("WebSocket connection failed. Check the close event for details.");Z.onError(X)},Q.onclose=(X)=>{Z.onClose(X.code,X.reason)},{close:()=>{Q.close()}}};var _9=["ERROR","WARN","INFO","DEBUG","TRACE"],P3=(Z,$)=>{if($)return $;switch(Z){case 1000:return"Normal closure";case 1001:return"Endpoint going away";case 1002:return"Protocol error";case 1003:return"Unsupported data";case 1006:return"Connection closed abnormally (no close frame received)";case 1007:return"Invalid payload data";case 1008:return"Policy violation";case 1009:return"Message too big";case 1010:return"Missing extension";case 1011:return"Internal server error";case 1015:return"TLS handshake failure";case 4001:return"Authentication failed - check your secret key";case 4003:return"Forbidden - key may not have access to this resource";case 4004:return"Project not found";default:return Z?`Unknown (code: ${Z})`:"Unknown"}},K3=(Z)=>{let $=new Date(Z.timestamp).toISOString().split("T")[1],Q=A1(Z.severity,Z.severity.padEnd(7)),X=i.cyan(Z.service.padEnd(20)),Y=Z.body.length>120?`${Z.body.substring(0,117)}...`:Z.body;return`[${$}] ${Q} ${X} ${Y}`},H9=async(Z)=>{let $=C();if(!$.success)throw H(`Failed to read settings: ${$.error}`),Error("Unreachable");let Q=$.value,X=Z.json??!1,Y=Z.severities?.split(",").map((K)=>K.trim().toUpperCase()),G=Z.services?.split(",").map((K)=>K.trim()),V=Z.environments?.split(",").map((K)=>K.trim());if(Y){for(let K of Y)if(!_9.includes(K)){let c=`Invalid severity: ${K}. Valid values: ${_9.join(", ")}`;if(X)return z(c);return H(c)}}if(!X){if(h("Tailing logs..."),Y?.length)F(`Severities: ${Y.join(", ")}`);if(G?.length)F(`Services: ${G.join(", ")}`);if(V?.length)F(`Environments: ${V.join(", ")}`);if(Z.search)F(`Search: ${Z.search}`);if(Z.traceId)F(`Trace ID: ${Z.traceId}`);j1(),$1()}let B=0,J=!1,q,_=()=>{if(q)clearTimeout(q);$1(),F("Interrupted, closing connection..."),L.close(),process.exit(0)},W=T(Z.secretKey,X),A=await(async()=>{if(Z.region==="us-west-2"||Z.region==="us-east-1")return Z.region;return(await g({secretKey:W,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:X})).region})(),L=q9({apiKey:W,region:A,baseUrl:e({cliFlag:Z.tailBaseUrl,globalUrl:Q.tailBaseUrl,globalDomain:Q.tailDomain,buildUrlFromDomain:(K)=>`wss://${A}.tail.${K}`,defaultUrl:`wss://${A}.tail.sazabi.com`}),filters:{severities:Y,services:G,environments:V,searchTerm:Z.search,traceId:Z.traceId},onOpen:()=>{if(J=!0,!X)j("Connected! Waiting for logs..."),$1()},onLog:(K)=>{if(B++,X)U(K);else console.log(K3(K))},onError:()=>{if(!J)v("Connection failed. See close reason below.")},onClose:(K,c)=>{if(process.removeListener("SIGINT",_),q)clearTimeout(q);if(!X){$1(),j1();let H1=P3(K,c);if(K&&K!==1000)o(`Connection closed: ${H1}`);else F(`Connection closed. Received ${B} logs.`)}}});if(!X)F(`Region: ${A}`);if(Z.duration&&Z.duration>0)q=setTimeout(()=>{if(!X)$1(),F("Duration reached, closing connection...");L.close()},Z.duration*1000);process.on("SIGINT",_)};var z9=x("logs","Real-time log operations").withSubcommands({tail:N("tail","Stream logs from current project in real-time",async(Z)=>{let{values:$}=O(Z,{severities:{type:"string"},services:{type:"string"},environments:{type:"string"},search:{type:"string"},"trace-id":{type:"string"},duration:{type:"string"},json:{type:"boolean"},"tail-base-url":{type:"string"},"secret-key":{type:"string"},region:{type:"string"},"api-base-url":{type:"string"}}),Q={};if($.severities)Q.severities=$.severities;if($.services)Q.services=$.services;if($.environments)Q.environments=$.environments;if($.search)Q.search=$.search;if($["trace-id"])Q.traceId=$["trace-id"];if($.duration)Q.duration=w($.duration,1,Number.MAX_SAFE_INTEGER,"Duration",$.json);if($.json)Q.json=!0;if($["tail-base-url"])Q.tailBaseUrl=$["tail-base-url"];if($["secret-key"])Q.secretKey=$["secret-key"];if($.region)Q.region=$.region;if($["api-base-url"])Q.apiBaseUrl=$["api-base-url"];await H9(Q)}).withOptions({severities:{type:"string",description:"Filter by comma-separated severities (e.g., ERROR,WARN,INFO)"},services:{type:"string",description:"Filter by comma-separated service names"},environments:{type:"string",description:"Filter by comma-separated environments"},search:{type:"string",description:"Filter by search term (case-insensitive)"},"trace-id":{type:"string",description:"Filter by trace ID"},duration:{type:"string",description:"Duration to tail in seconds (default: unlimited)"},json:{type:"boolean",description:"Output as JSON (default: pretty-print)"},"tail-base-url":{type:"string",description:"Override tail WebSocket base URL"},"secret-key":{type:"string",description:"Override secret key"},region:{type:"string",description:"Override project region"},"api-base-url":{type:"string",description:"Override API base URL (for project lookup)"}}).withExamples(["sazabi logs tail # Tail all logs in real-time","sazabi logs tail --severities ERROR,WARN # Tail only errors and warnings","sazabi logs tail --services api,worker # Tail specific services","sazabi logs tail --environments production,staging # Tail specific environments",'sazabi logs tail --search "database" # Tail logs matching search term',"sazabi logs tail --json # Output as JSON"]).build(),forward:N("forward","Forward plaintext logs to current project",async(Z)=>{let{values:$}=O(Z,{file:{type:"string",short:"f"},follow:{type:"boolean"},"batch-size":{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"intake-base-url":{type:"string"},"secret-key":{type:"string"},"public-key":{type:"string"},region:{type:"string"}}),Q={};if($.file)Q.file=$.file;if($.follow)Q.follow=$.follow;if($["batch-size"])Q.batchSize=w($["batch-size"],1,Number.MAX_SAFE_INTEGER,"Batch size",$.json);if($["api-base-url"])Q.apiBaseUrl=$["api-base-url"];if($["intake-base-url"])Q.intakeBaseUrl=$["intake-base-url"];if($["secret-key"])Q.secretKey=$["secret-key"];if($.region)Q.region=$.region;if($["public-key"])Q.publicKey=$["public-key"];await V9({...Q,json:$.json})}).withOptions({file:{type:"string",short:"f",description:"Read from file instead of stdin"},follow:{type:"boolean",description:"Follow file for new lines (like tail -f)"},"batch-size":{type:"string",description:"Number of logs to batch before sending (default: 100)"},json:{type:"boolean",description:"Output a final JSON summary"},"api-base-url":{type:"string",description:"Override API base URL"},"intake-base-url":{type:"string",description:"Override intake base URL"},"secret-key":{type:"string",description:"Override secret key"},"public-key":{type:"string",description:"Use this public key value (skip creating/storing)"},region:{type:"string",description:"Override project region"}}).withExamples(['echo "Log message" | sazabi logs forward # Forward from stdin',"sazabi logs forward --file app.log # Forward from file","sazabi logs forward --file app.log --follow # Forward file with tail -f behavior","sazabi logs forward --file app.log --batch-size 50 # Forward with custom batch size"]).build()}).withExamples(["sazabi logs tail # Tail all logs in real-time","sazabi logs tail --severities ERROR,WARN # Tail only errors and warnings","sazabi logs forward --file app.log # Forward from file"]).build();var L3=2000,f1=async(Z)=>{let $=Z.pollIntervalMs??L3,Q=Date.now(),X=!1;while(!0){let Y=await Z.client.responses.get(Z.responseId);if(!Y.success){if(!N3(Y))return b1(Z.printProgress,X),Y}else if(Y.value.status!=="processing")return b1(Z.printProgress,X),Y;let G=Date.now()-Q;if(Z.timeoutMs!==void 0&&G>=Z.timeoutMs){if(b1(Z.printProgress,X),Y.success)return S(Y.value);return S({responseId:Z.responseId,status:"processing",elapsedSeconds:Math.floor(G/1000)})}X=O3(Z.printProgress,X),await W1($)}},O3=(Z,$)=>{if(!Z)return $;if(!$)process.stdout.write(`
|
|
3
|
+
`);return process.stdout.write("."),!0},b1=(Z,$)=>{if(!Z||!$)return;process.stdout.write(`
|
|
4
|
+
`)},N3=(Z)=>{return Z.statusCode===404};var F9=async(Z,$={})=>{let Q=T($.secretKey,$.json),X=f({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),Y=await k3({message:Z,threadId:$.threadId,secretKey:Q,apiBaseUrl:$.apiBaseUrl,json:$.json,client:X});if(!$.wait){if($.json){U(K1(Y));return}if(v1(Y),Y.status!=="processing")F(`Status: ${Y.status}`);return}if(Y.status!=="processing"){if($.json){U(K1(Y));return}v1(Y),F(`Status: ${Y.status}`);return}if(!$.json)v1(Y);let G=D(await f1({client:X,responseId:Y.responseId,timeoutMs:$.timeout,printProgress:!$.json}),"Failed to get response",$.json);if(G.status==="processing"){if($.json){U(K1(Y));return}F(`Not ready. Poll with: ${g1(Y.responseId)}`);return}if($.json){U(K1(Y,{status:G.status,response:G.response}));return}W9(G.status,G.response)},U9=async(Z,$={})=>{let Q=T($.secretKey,$.json),X=f({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl});if(!$.wait){let G=D(await X.responses.get(Z),"Failed to get response",$.json);if($.json){U(D9(G));return}A3(G);return}let Y=D(await f1({client:X,responseId:Z,timeoutMs:$.timeout,printProgress:!$.json}),"Failed to get response",$.json);if($.json){U(D9(Y));return}if(Y.status==="processing"){F(`Not ready. Poll with: ${g1(Z)}`);return}W9(Y.status,Y.response)},k3=async(Z)=>{if(Z.threadId){let X=D(await Z.client.messages.append(Z.threadId,Z.message),"Failed to send message",Z.json);return{threadId:Z.threadId,responseId:X.responseId,status:X.status}}let $=D(await Z.client.threads.create(Z.message),"Failed to create thread",Z.json),Q=await g({secretKey:Z.secretKey,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:Z.json});return{threadId:$.threadId,responseId:$.responseId,status:$.status,threadUrl:U1(Q.id,$.threadId)}},g1=(Z)=>{return`sazabi responses get ${Z}`},v1=(Z)=>{if(Z.threadUrl)F(`Thread ID: ${Z.threadId}`),F(`View URL: ${Z.threadUrl}`);F(`Response ID: ${Z.responseId}`),F(`Poll with: ${g1(Z.responseId)}`)},K1=(Z,$)=>{let Q=$?.status??Z.status;if(Z.threadUrl)return{threadId:Z.threadId,responseId:Z.responseId,status:Q,...$?{response:$.response}:{},url:Z.threadUrl};return{responseId:Z.responseId,status:Q,...$?{response:$.response}:{}}},D9=(Z)=>{if(Z.status==="processing")return{responseId:Z.responseId,status:Z.status,elapsedSeconds:Z.elapsedSeconds};return{responseId:Z.responseId,status:Z.status,response:Z.response}},A3=(Z)=>{if(F(`Status: ${Z.status}`),Z.status==="processing")return;if(!h1(Z.response))return;console.log(""),console.log(Z.response)},W9=(Z,$)=>{if(Z==="completed"){if(!h1($)){F("Status: completed");return}console.log($);return}if(F(`Status: ${Z}`),!h1($))return;console.log($)},h1=(Z)=>{return Boolean(Z&&Z.trim().length>0)};var M3=async(Z,$)=>{let Q=T($.secretKey,$.json),X=f({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),{messages:Y,nextCursor:G}=D(await X.messages.list(Z,{limit:$.limit,cursor:$.cursor}),"Failed to list messages",$.json);if($.json){U({messages:Y,nextCursor:G});return}if(Y.length===0){b("No messages found.");return}let V=Y.map((B)=>{let J=B.content.find((_)=>_.type==="message"&&Boolean(_.message)),q=J?F1(J.message):E("(no text)");return{id:n(B.id),role:X1(B.role),content:q,created:u(B.createdAt)}});d(V,[{header:"ID",key:"id"},{header:"Role",key:"role"},{header:"Content",key:"content"},{header:"Created",key:"created"}],{header:"Messages"}),t({type:"cursor",nextCursor:G})},T3=async(Z,$)=>{let Q=T($.secretKey,$.json),X=f({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),{messages:Y,pagination:G}=D(await X.search.messages({query:Z,limit:$.limit,page:$.page,threadId:$.threadId,role:$.role}),"Failed to search messages",$.json);if($.json){U({messages:Y,pagination:G});return}if(Y.length===0){b("No matching messages found.");return}let V=Y.map((B)=>({id:n(B.id),thread:B.threadTitle||E("(no title)"),role:X1(B.role),content:F1(B.content),score:B.score?.toFixed(2)??"-"}));d(V,[{header:"ID",key:"id"},{header:"Thread",key:"thread"},{header:"Role",key:"role"},{header:"Content",key:"content"},{header:"Score",key:"score",align:"right"}],{header:{title:"Search Results",variant:"search",count:G.totalResults}}),t({type:"page",page:G.page,totalPages:G.totalPages})},P9=x("messages","Message operations").withSubcommands({send:N("send","Send a message (creates new thread if --thread-id omitted)",async(Z)=>{let{values:$,positionals:Q}=O(Z,{"thread-id":{type:"string",short:"t"},wait:{type:"boolean"},timeout:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q.join(" ");if(!X){if($.json)return z("Message is required. Usage: sazabi messages send <message> [--thread-id <id>]");return H("Message is required. Usage: sazabi messages send <message> [--thread-id <id>]")}let Y=$.timeout?w($.timeout,1,3600,"Timeout",$.json)*1000:void 0,G={threadId:$["thread-id"],wait:$.wait,timeout:Y,json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};await F9(X,G)}).withPositionalArgs("<message>").withOptions({"thread-id":{type:"string",short:"t",description:"Thread ID to append to (creates new thread if omitted)"},wait:{type:"boolean",description:"Wait for assistant response and print it"},timeout:{type:"string",description:"Timeout in seconds to wait for response before returning processing state"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi messages send 'Hello' # Start a new thread","sazabi messages send 'Hello' --thread-id abc123 # Append to existing thread","sazabi messages send 'Hello' -t abc123 --wait # Append and wait for reply","sazabi messages send 'Hello' --wait # New thread, wait for reply","sazabi messages send 'Hello' --wait --timeout 120 # Wait up to 2 minutes"]).build(),list:N("list","List messages in a thread",async(Z)=>{let{values:$,positionals:Q}=O(Z,{limit:{type:"string"},cursor:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Thread ID is required. Usage: sazabi messages list <thread-id>");return H("Thread ID is required. Usage: sazabi messages list <thread-id>")}if(Q.length>1){let G=Q.slice(1).join(", ");if($.json)return z(`Unexpected arguments: ${G}`);return H(`Unexpected arguments: ${G}`)}let Y={json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};if($.limit)Y.limit=w($.limit,1,100,"Limit",$.json);if($.cursor)Y.cursor=$.cursor;await M3(X,Y)}).withPositionalArgs("<thread-id>").withOptions({limit:{type:"string",description:"Maximum number of messages to return (default: 50, max: 100)"},cursor:{type:"string",description:"Pagination cursor from previous response"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi messages list <thread-id> # List all messages in thread","sazabi messages list <thread-id> --limit 20 # List with custom limit","sazabi messages list <thread-id> --cursor xyz # List next page"]).build(),search:N("search","Search messages in current project",async(Z)=>{let{values:$,positionals:Q}=O(Z,{limit:{type:"string"},page:{type:"string"},"thread-id":{type:"string"},role:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q.join(" ");if(!X){if($.json)return z("Search query is required. Usage: sazabi messages search <query>");return H("Search query is required. Usage: sazabi messages search <query>")}let Y={json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};if($.limit)Y.limit=w($.limit,1,100,"Limit",$.json);if($.page)Y.page=w($.page,1,Number.MAX_SAFE_INTEGER,"Page",$.json);if($["thread-id"])Y.threadId=$["thread-id"];if($.role)Y.role=q1($.role,["user","assistant"],"Role",$.json);await T3(X,Y)}).withPositionalArgs("<query>").withOptions({limit:{type:"string",description:"Maximum number of results (default: 20, max: 100)"},page:{type:"string",description:"Page number for pagination (default: 1)"},"thread-id":{type:"string",description:"Filter messages by thread ID"},role:{type:"string",description:"Filter by role: user or assistant"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(['sazabi messages search "error handling" # Search messages','sazabi messages search "bug" --limit 50 # Search with limit','sazabi messages search "user input" --role user # Search user messages only','sazabi messages search "response" --thread-id thread-123 # Search in specific thread']).build()}).withExamples(["sazabi messages send 'Hello' # Start a new thread","sazabi messages send 'Follow up' -t <thread-id> # Append to thread","sazabi messages list <thread-id> # List messages in thread",'sazabi messages search "error" # Search messages']).build();var K9=x("responses","Response operations").withSubcommands({get:N("get","Get a response by response ID",async(Z)=>{let{values:$,positionals:Q}=O(Z,{wait:{type:"boolean"},timeout:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Response ID is required. Usage: sazabi responses get <response-id>");return H("Response ID is required. Usage: sazabi responses get <response-id>")}if(Q.length>1){let V=Q.slice(1).join(", ");if($.json)return z(`Unexpected arguments: ${V}`);return H(`Unexpected arguments: ${V}`)}let Y=$.timeout?w($.timeout,1,3600,"Timeout",$.json)*1000:void 0,G={wait:$.wait,timeout:Y,json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};await U9(X,G)}).withPositionalArgs("<response-id>").withOptions({wait:{type:"boolean",description:"Wait for terminal status and print the final result"},timeout:{type:"string",description:"Timeout in seconds to wait before returning processing state"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi responses get <response-id> # Check current response status","sazabi responses get <response-id> --wait # Wait until response is terminal","sazabi responses get <response-id> --wait --timeout 60 # Wait up to 60 seconds","sazabi responses get <response-id> --json # Output response state as JSON"]).build()}).withExamples(["sazabi responses get <response-id> # Check current response status","sazabi responses get <response-id> --wait # Wait until response is terminal"]).build();var m1=["secretKey","apiBaseUrl","webBaseUrl","intakeBaseUrl","tailBaseUrl","apiDomain","webDomain","intakeDomain","tailDomain","forwardPublicKey"],L9=(Z)=>{return m1.includes(Z)},C3=(Z={})=>{let $=D(C(),"Failed to read settings",Z.json);if(Z.json){U({success:!0,settingsFile:G1,settings:$});return}s({"Settings file":G1}),console.log("");let Q=Object.entries($).filter(([,Y])=>Y!=null);if(Q.length===0){b("No settings configured.");return}let X=Q.map(([Y,G])=>({key:Y,value:String(G)})).sort((Y,G)=>Y.key.localeCompare(G.key));d(X,[{header:"Key",key:"key",width:20},{header:"Value",key:"value"}],{header:"Settings"})},R3=(Z,$,Q={})=>{if(!L9(Z)){let Y=m1.join(", "),G=`Invalid setting key: '${Z}'. Valid keys: ${Y}`;if(Q.json){z(G);return}H(G);return}let X=D(C(),"Failed to read settings",Q.json);if(X[Z]=$,D(l(X),"Failed to write settings",Q.json),Q.json){U({success:!0,key:Z,value:$});return}j(`Set ${Z} to ${$}`)},j3=(Z,$={})=>{if(!L9(Z)){let X=m1.join(", "),Y=`Invalid setting key: '${Z}'. Valid keys: ${X}`;if($.json){z(Y);return}H(Y);return}let Q=D(C(),"Failed to read settings",$.json);if(delete Q[Z],D(l(Q),"Failed to write settings",$.json),$.json){U({success:!0,key:Z});return}j(`Cleared ${Z}`)},O9=x("settings","CLI settings management").withSubcommands({view:N("view","Show current CLI settings and file location",async(Z)=>{let{values:$}=O(Z,{json:{type:"boolean"}});C3({json:$.json})}).withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi settings view # Show current settings","sazabi settings view --json # Output as JSON"]).build(),set:N("set","Set a global configuration value",async(Z)=>{let{values:$,positionals:Q}=O(Z,{json:{type:"boolean"}},{allowPositionals:!0}),X=Q[0],Y=Q[1];if(!X){if($.json)return z("Setting key is required. Usage: sazabi settings set <key> <value>");return H("Setting key is required. Usage: sazabi settings set <key> <value>")}if(!Y){if($.json)return z("Value is required. Usage: sazabi settings set <key> <value>");return H("Value is required. Usage: sazabi settings set <key> <value>")}R3(X,Y,{json:$.json})}).withPositionalArgs("<key> <value>").withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi settings set apiBaseUrl https://api.example.com # Set API base URL","sazabi settings set webBaseUrl https://app.example.com # Set web app base URL","sazabi settings set --json apiBaseUrl https://api.example.com # Output as JSON"]).build(),unset:N("unset","Clear a global configuration value",async(Z)=>{let{values:$,positionals:Q}=O(Z,{json:{type:"boolean"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Setting key is required. Usage: sazabi settings unset <key>");return H("Setting key is required. Usage: sazabi settings unset <key>")}j3(X,{json:$.json})}).withPositionalArgs("<key>").withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi settings unset apiBaseUrl # Clear API base URL override","sazabi settings unset --json apiBaseUrl # Output as JSON"]).build()}).withExamples(["sazabi settings view # Show current settings","sazabi settings set apiBaseUrl https://api.example.com # Set API base URL","sazabi settings unset apiBaseUrl # Clear API base URL override"]).build();var N9=async(Z,$)=>{let Q=T($.secretKey,$.json),X=f({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),{thread:Y,messages:G}=D(await X.threads.get(Z),"Failed to get thread",$.json),{id:V}=await g({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl,jsonMode:$.json});if($.json){U({thread:Y,messages:G});return}if(h("Thread"),s({ID:Y.id,URL:U1(V,Y.id),Title:Y.title||"(no title)",Status:Y.status,Created:u(Y.createdAt),Updated:u(Y.updatedAt)}),console.log(""),h("Messages"),G.length===0){b("No messages.");return}for(let B of G){console.log(X1(B.role,`[${B.role}] ${u(B.createdAt)}`));for(let J of B.content)if(J.type==="message"&&J.message)console.log(` ${J.message}`);else if(J.type==="tool_call")console.log(E(" [tool call]"));else if(J.type==="artifact")console.log(E(" [artifact]"));else console.log(E(` [${J.type}]`));console.log("")}};var k9=async(Z)=>{let $=T(Z.secretKey,Z.json),X=await f({secretKey:$,apiBaseUrlFlag:Z.apiBaseUrl}).threads.list({limit:Z.limit,cursor:Z.cursor,status:Z.status}),{threads:Y,nextCursor:G}=D(X,"Failed to list threads",Z.json);if(Z.json){U({threads:Y,nextCursor:G});return}if(Y.length===0){b("No threads found.");return}let V=Y.map((B)=>({id:n(B.id),title:B.title||E("(no title)"),status:B.status,updated:u(B.updatedAt)}));d(V,[{header:"ID",key:"id"},{header:"Title",key:"title"},{header:"Status",key:"status"},{header:"Updated",key:"updated"}],{header:"Threads"}),t({type:"cursor",nextCursor:G})};var A9=async(Z,$)=>{let Q=T($.secretKey,$.json),X=f({secretKey:Q,apiBaseUrlFlag:$.apiBaseUrl}),{threads:Y,pagination:G}=D(await X.search.threads({query:Z,limit:$.limit,page:$.page,status:$.status}),"Failed to search threads",$.json);if($.json){U({threads:Y,pagination:G});return}if(Y.length===0){b("No matching threads found.");return}let V=Y.map((B)=>({id:n(B.id),title:B.title||E("(no title)"),status:B.status,score:B.score?.toFixed(2)??"-"}));d(V,[{header:"ID",key:"id"},{header:"Title",key:"title"},{header:"Status",key:"status"},{header:"Score",key:"score",align:"right"}],{header:{title:"Search Results",variant:"search",count:G.totalResults}}),t({type:"page",page:G.page,totalPages:G.totalPages})};var M9=x("threads","Thread operations").withSubcommands({list:N("list","List threads from current project",async(Z)=>{let{values:$}=O(Z,{limit:{type:"string"},cursor:{type:"string"},status:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}}),Q={json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};if($.limit)Q.limit=w($.limit,1,100,"Limit",$.json);if($.cursor)Q.cursor=$.cursor;if($.status)Q.status=q1($.status,["regular","archived"],"Status",$.json);await k9(Q)}).withOptions({limit:{type:"string",description:"Maximum number of threads to return (default: 20, max: 100)"},cursor:{type:"string",description:"Pagination cursor from previous response"},status:{type:"string",description:"Filter by status: regular or archived"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi threads list # List all threads","sazabi threads list --limit 50 # List with custom limit","sazabi threads list --status archived # List archived threads","sazabi threads list --cursor xyz # List next page"]).build(),get:N("get","Get thread with messages",async(Z)=>{let{values:$,positionals:Q}=O(Z,{json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q[0];if(!X){if($.json)return z("Thread ID is required. Usage: sazabi threads get <thread-id>");return H("Thread ID is required. Usage: sazabi threads get <thread-id>")}if(Q.length>1){let Y=Q.slice(1).join(", ");if($.json)return z(`Unexpected arguments: ${Y}`);return H(`Unexpected arguments: ${Y}`)}await N9(X,{json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]})}).withPositionalArgs("<thread-id>").withOptions({json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(["sazabi threads get <thread-id> # Get thread with messages","sazabi threads get <thread-id> --json # Output as JSON"]).build(),search:N("search","Search threads in current project",async(Z)=>{let{values:$,positionals:Q}=O(Z,{limit:{type:"string"},page:{type:"string"},status:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"},"secret-key":{type:"string"}},{allowPositionals:!0}),X=Q.join(" ");if(!X){if($.json)return z("Search query is required. Usage: sazabi threads search <query>");return H("Search query is required. Usage: sazabi threads search <query>")}let Y={json:$.json,apiBaseUrl:$["api-base-url"],secretKey:$["secret-key"]};if($.limit)Y.limit=w($.limit,1,100,"Limit",$.json);if($.page)Y.page=w($.page,1,Number.MAX_SAFE_INTEGER,"Page",$.json);if($.status)Y.status=q1($.status,["regular","archived"],"Status",$.json);await A9(X,Y)}).withPositionalArgs("<query>").withOptions({limit:{type:"string",description:"Maximum number of results (default: 20, max: 100)"},page:{type:"string",description:"Page number for pagination (default: 1)"},status:{type:"string",description:"Filter by status: regular or archived"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"secret-key":{type:"string",description:"Override secret key"}}).withExamples(['sazabi threads search "error handling" # Search threads','sazabi threads search "bug" --limit 50 # Search with limit','sazabi threads search "authentication" --status regular # Search only regular threads']).build()}).withExamples(["sazabi threads list # List all threads","sazabi threads get <thread-id> # Get thread with messages",'sazabi threads search "error" # Search threads']).build();var T9=[G9,O9,Y9,z9,M9,P9,K9];var L1=new Map,C9=(Z)=>{L1.set(Z.name,Z)},R9=(Z)=>{return L1.get(Z)},c1=()=>{return Array.from(L1.values())},j9=(Z)=>{return L1.has(Z)};var O1=(Z,$=!1)=>{let Q=Object.entries(Z);if(Q.length===0&&!$)return"";let X=$?[["help",{type:"boolean",short:"h",description:"Show help for this command"}],...Q]:Q,Y=Math.max(...X.map(([V,B])=>{return`${B.short?`-${B.short}, `:""}--${V}`.length})),G=X.map(([V,B])=>{let q=`${B.short?`-${B.short}, `:""}--${V}`,_=B.description.includes("(required)"),W=B.required&&!_?" (required)":"";return` ${q.padEnd(Y)} ${B.description}${W}`});return`
|
|
8
5
|
|
|
9
|
-
${
|
|
6
|
+
${R("OPTIONS")}
|
|
10
7
|
${G.join(`
|
|
11
|
-
`)}`},
|
|
8
|
+
`)}`},E9=(Z)=>{if(Z.length===0)return"";let $=Z.map((Y)=>{let G=Y.indexOf("#");if(G===-1)return{command:Y,comment:null};return{command:Y.substring(0,G).trimEnd(),comment:Y.substring(G).trim()}}),Q=Math.max(...$.map((Y)=>Y.command.length)),X=$.map(({command:Y,comment:G})=>{if(!G)return` ${Y}`;let V=" ".repeat(Q-Y.length+2);return` ${Y}${V}${G}`});return`
|
|
12
9
|
|
|
13
|
-
${
|
|
10
|
+
${R("EXAMPLES")}
|
|
14
11
|
${X.join(`
|
|
15
|
-
`)}`},
|
|
16
|
-
${
|
|
12
|
+
`)}`},x9=(Z,$)=>{let Q=$.positionalArgs?` ${$.positionalArgs}`:"",X=`sazabi ${Z} ${$.name}${Q}`,Y=`
|
|
13
|
+
${R(`sazabi ${Z} ${$.name}`)} - ${$.description}
|
|
17
14
|
`;if(Y+=`
|
|
18
|
-
${
|
|
19
|
-
${X}`,$.options)Y+=O1($.options,!0);else Y+=O1({},!0);if($.examples)Y+=
|
|
20
|
-
`,Y},
|
|
21
|
-
${
|
|
15
|
+
${R("USAGE")}
|
|
16
|
+
${X}`,$.options)Y+=O1($.options,!0);else Y+=O1({},!0);if($.examples)Y+=E9($.examples);return Y+=`
|
|
17
|
+
`,Y},u1=(Z)=>{let $=`
|
|
18
|
+
${R(`sazabi ${Z.name}`)} - ${Z.description}
|
|
22
19
|
`;if($+=`
|
|
23
|
-
${
|
|
20
|
+
${R("USAGE")}`,Z.subcommands&&!Z.handler)$+=`
|
|
24
21
|
sazabi ${Z.name} <subcommand> [options]`;else if(Z.subcommands&&Z.handler){let Q=Z.positionalArgs?` ${Z.positionalArgs}`:"";$+=`
|
|
25
22
|
sazabi ${Z.name}${Q}`,$+=`
|
|
26
23
|
sazabi ${Z.name} <subcommand> [options]`}else{let Q=Z.positionalArgs?` ${Z.positionalArgs}`:"";$+=`
|
|
27
24
|
sazabi ${Z.name}${Q}`}if(Z.subcommands){let Q=Object.entries(Z.subcommands);if(Q.length>0){$+=`
|
|
28
25
|
|
|
29
|
-
${
|
|
30
|
-
${X.padEnd(12)} ${Y.description}`}}if(Z.options)$+=O1(Z.options,!0);else $+=O1({},!0);if(Z.examples)$+=
|
|
31
|
-
`,$},
|
|
32
|
-
${
|
|
26
|
+
${R("SUBCOMMANDS")}`;for(let[X,Y]of Q)$+=`
|
|
27
|
+
${X.padEnd(12)} ${Y.description}`}}if(Z.options)$+=O1(Z.options,!0);else $+=O1({},!0);if(Z.examples)$+=E9(Z.examples);return $+=`
|
|
28
|
+
`,$},d1=(Z)=>{let $=`
|
|
29
|
+
${R("Sazabi CLI")} - Command-line interface for the Sazabi public API
|
|
33
30
|
`;$+=`
|
|
34
|
-
${
|
|
31
|
+
${R("USAGE")}`,$+=`
|
|
35
32
|
sazabi <command> [subcommand] [options]`,$+=`
|
|
36
33
|
|
|
37
|
-
${
|
|
34
|
+
${R("COMMANDS")}`;for(let Q of Z)if($+=`
|
|
38
35
|
${Q.name.padEnd(11)} ${Q.description}`,Q.subcommands)for(let[X,Y]of Object.entries(Q.subcommands))$+=`
|
|
39
36
|
${X.padEnd(9)} ${Y.description}`;return $+=`
|
|
40
37
|
|
|
41
|
-
${
|
|
38
|
+
${R("OPTIONS")}`,$+=`
|
|
42
39
|
-h, --help Show help for a command`,$+=`
|
|
43
40
|
-v, --version Show version number`,$+=`
|
|
44
41
|
--json Output errors as JSON`,$+=`
|
|
45
42
|
|
|
46
|
-
${
|
|
43
|
+
${R("EXAMPLES")}`,$+=`
|
|
47
44
|
sazabi auth login sazabi_secret_xxx # Authenticate with secret key`,$+=`
|
|
48
45
|
sazabi messages send "Hello" # Start a new thread`,$+=`
|
|
49
46
|
sazabi messages send "Hi" -t <id> # Send a message to a thread`,$+=`
|
|
50
47
|
sazabi logs tail --severities ERROR,WARN # Tail logs filtered by severity`,$+=`
|
|
51
48
|
sazabi threads list # List all threads
|
|
52
|
-
`,$};import*as
|
|
49
|
+
`,$};import*as N1 from"node:fs";import*as _1 from"node:path";import{fileURLToPath as E3}from"node:url";var w9=()=>{try{let Z=_1.dirname(E3(import.meta.url));for(let $=0;$<5;$++){let Q=_1.join(Z,"package.json");if(N1.existsSync(Q)){let X=N1.readFileSync(Q,"utf-8");return JSON.parse(X).version??"0.0.0"}Z=_1.dirname(Z)}return"0.0.0"}catch{return"0.0.0"}};var x3=w9();for(let Z of T9)C9(Z);var w3=async()=>{let Z=process.argv.slice(2),$=Z[0]==="--json",Q=$?Z.slice(1):Z,X=$||Q.includes("--json");if(Q.includes("--version")||Q.includes("-v")){console.log(`sazabi ${x3}`);return}if(Q.length===0){console.log(d1(c1()));return}if(Q[0]?.startsWith("--")||Q[0]==="-h"){if(Q[0]==="--help"||Q[0]==="-h"){console.log(d1(c1()));return}}let Y=Q[0];if(Y&&!j9(Y)){let _=Y.startsWith("-")?`Unknown option: ${Y}. Run 'sazabi -h' for usage.`:`Unknown command: ${Y}. Run 'sazabi -h' for usage.`;if(X)z(_);throw H(_),Error("Unreachable")}if(!Y)throw Error("Unexpected: commandName is undefined");let G=R9(Y);if(!G)throw H(`Unknown command: ${Y}. Run 'sazabi -h' for usage.`),Error("Unreachable");let V=Q[1]??"",B=Q.slice(2);if(V==="--help"||V==="-h"){console.log(u1(G));return}if(!V&&G.subcommands&&!G.handler){console.log(u1(G));return}let J=G.subcommands?.[V];if(!J){if(G.handler){let q=V?[V,...B]:B;await G.handler(q)}else{let _=V.startsWith("-")?`Subcommand required. Run 'sazabi ${Y} -h' for usage.`:`Unknown subcommand: ${V}. Run 'sazabi ${Y} -h' for usage.`;if(X)z(_);throw H(_),Error("Unreachable")}return}if(B.includes("--help")||B.includes("-h")){console.log(x9(Y,J));return}await J.handler(B)};w3().catch((Z)=>{let $=process.argv.includes("--json"),Q=`Unexpected error: ${String(Z)}`;if($)z(Q);H(Q)});
|