@sazabiai/cli 0.0.3 → 0.0.5
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 +30 -30
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
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},
|
|
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`
|
|
2
|
+
var f9=Object.create;var{getPrototypeOf:v9,defineProperty:i1,getOwnPropertyNames:h9}=Object;var g9=Object.prototype.hasOwnProperty;function m9(Z){return this[Z]}var c9,u9,q1=(Z,$,X)=>{var Y=Z!=null&&typeof Z==="object";if(Y){var Q=$?c9??=new WeakMap:u9??=new WeakMap,G=Q.get(Z);if(G)return G}X=Z!=null?f9(v9(Z)):{};let B=$||!Z||!Z.__esModule?i1(X,"default",{value:Z,enumerable:!0}):X;for(let V of h9(Z))if(!g9.call(B,V))i1(B,V,{get:m9.bind(Z,V),enumerable:!0});if(Y)Q.set(Z,B);return B};var d9=(Z,$)=>()=>($||Z(($={exports:{}}).exports,$),$.exports);var Q1=d9((g3,k1)=>{var P1=process||{},r1=P1.argv||[],D1=P1.env||{},p9=!(!!D1.NO_COLOR||r1.includes("--no-color"))&&(!!D1.FORCE_COLOR||r1.includes("--color")||P1.platform==="win32"||(P1.stdout||{}).isTTY&&D1.TERM!=="dumb"||!!D1.CI),l9=(Z,$,X=Z)=>(Y)=>{let Q=""+Y,G=Q.indexOf($,Z.length);return~G?Z+i9(Q,$,X,G)+$:Z+Q+$},i9=(Z,$,X,Y)=>{let Q="",G=0;do Q+=Z.substring(G,Y)+X,G=Y+$.length,Y=Z.indexOf($,G);while(~Y);return Q+Z.substring(G)},n1=(Z=p9)=>{let $=Z?l9:()=>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=n1();k1.exports.createColors=n1});var k=q1(Q1(),1),f={success:(Z)=>k.default.green(Z),error:(Z)=>k.default.red(Z),warning:(Z)=>k.default.yellow(Z),info:(Z)=>k.default.blue(Z),muted:(Z)=>k.default.dim(Z),bold:(Z)=>k.default.bold(Z),cyan:(Z)=>k.default.cyan(Z),gray:(Z)=>k.default.gray(Z)},E1=(Z,$)=>{let X=$??Z,Y=Z.trim().toUpperCase(),G={ERROR:k.default.red,FATAL:k.default.red,WARN:k.default.yellow,WARNING:k.default.yellow,INFO:k.default.blue,DEBUG:k.default.gray,TRACE:k.default.gray}[Y];return G?G(X):X},Y1=(Z,$)=>{let X=$??Z;if(Z==="user")return k.default.blue(X);if(Z==="assistant")return k.default.green(X);return k.default.gray(X)};var W1=(Z,$=60)=>{if(Z.length<=$)return Z;return`${Z.substring(0,$-3)}...`},i=(Z)=>{return new Date(Z).toLocaleString()},o=(Z)=>{return`${Z.substring(0,8)}...`};var a1=q1(Q1(),1);var y=(Z)=>{return a1.default.bold(Z)};var B1=q1(Q1(),1),j1="✓",C1="✗",o1="⚠",t1="ℹ",r9=B1.default.green(j1),n9=B1.default.red(C1),a9=B1.default.yellow(o1),o9=B1.default.cyan(t1);var t=q1(Q1(),1),g=(Z)=>{console.log(t.default.yellow(Z))},O=(Z)=>{console.log(JSON.stringify(Z,null,2))},H=(Z,$=1)=>{console.error(JSON.stringify({success:!1,error:Z},null,2)),process.exit($)},w=(Z)=>{console.log(t.default.bold(Z))},U=(Z)=>{console.log(t.default.dim(Z))},S=(Z)=>{console.log(t.default.green(Z))},s=(Z)=>{console.log(t.default.red(Z))},u=(Z)=>{console.log(t.default.yellow(Z))},x=(Z)=>t.default.dim(Z);var G1=q1(Q1(),1),e=(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)`))},x1=(Z,$)=>{console.log(G1.default.bold(`${Z} (${$} results)`))};var Q3=(Z)=>{console.error(Z)};var _=(Z,$=1)=>{Q3(Z),process.exit($)},v=(Z)=>{console.log(Z)};var y1=(Z="─",$=80)=>{console.log(Z.repeat($))};var P=()=>{console.log("")};var d=(Z,$=2)=>{console.log(`${" ".repeat($)}${Z}`)},X1=(Z,$=0)=>{for(let[X,Y]of Object.entries(Z))console.log(`${" ".repeat($)}${X}: ${Y}`)},r=(Z,$,X)=>{if(Z.length===0)return;if(X?.header){let J=typeof X.header==="string"?{title:X.header}:X.header,q=J.variant??"section",K=J.count??Z.length;if(q==="results")R1(J.title,K);else if(q==="search")x1(J.title,K);else w(J.title)}let Y=/\u001B\[[0-?]*[ -/]*[@-~]/g,Q=(J)=>(J??"").replace(Y,"").length,G=(J,q,K)=>{let D=Q(J),W=Math.max(0,q-D);return K==="right"?`${" ".repeat(W)}${J}`:`${J}${" ".repeat(W)}`},B=$.map((J)=>{if(J.width)return J.width;let q=Q(J.header),K=Math.max(...Z.map((D)=>Q(D[J.key]||"")));return Math.max(q,K)}),V=[$.map((J,q)=>{let K=B[q]||0;return G(J.header,K,"left")}),...Z.map((J)=>$.map((q,K)=>{let D=J[q.key]||"",W=B[K]||0,L=q.align||"left";return G(D,W,L)}))];for(let J of V)d(J.join(" "));P()};import{spawn as q3}from"node:child_process";var I=(Z)=>({success:!0,value:Z}),j=(Z,$)=>({success:!1,error:Z,...$!==void 0&&{statusCode:$}});var F=(Z,$,X)=>{if(!Z.success){let Y=`${$}: ${Z.error}`;if(X)return H(Y);return _(Y)}return Z.value};var Y3="https://api.sazabi.com",G3="/v1",e1=1e4,h=async(Z,$,X,Y)=>{let G=`${Z.baseUrl??Y3}${G3}${X}`,B=new AbortController,V=setTimeout(()=>B.abort(),e1);try{let J=await fetch(G,{method:$,headers:{Authorization:`Bearer ${Z.token}`,"Content-Type":"application/json",...Z.projectId&&{"x-sazabi-project-id":Z.projectId}},body:Y?JSON.stringify(Y):void 0,signal:B.signal});if(!J.ok){if(J.status===401)return j(`Authentication failed for ${X}. Run 'sazabi auth login' to re-authenticate.`,401);if(J.status===404)return j(`Resource not found: ${X}`,404);let K=await J.text();return j(`API error (${J.status}) for ${X}: ${K}`,J.status)}if(J.status===204)return I({});let q=await J.json();return I(q)}catch(J){if(J instanceof Error&&J.name==="AbortError")return j("Request timed out. Please try again.");let q=J instanceof Error?J.message:String(J);return j(`Request failed: ${q}`)}finally{clearTimeout(V)}},K1=(Z)=>{let $=Object.entries(Z).filter((X)=>X[1]!==void 0&&(typeof X[1]==="string"||typeof X[1]==="number"||typeof X[1]==="boolean")).map(([X,Y])=>`${X}=${encodeURIComponent(String(Y))}`);return $.length>0?`?${$.join("&")}`:""},_1=(Z)=>({project:{get:()=>h(Z,"GET","/project")},threads:{list:($={})=>h(Z,"GET",`/threads${K1($)}`),get:($)=>h(Z,"GET",`/threads/${$}`),create:($)=>h(Z,"POST","/threads",{message:$}),getStatus:($)=>h(Z,"GET",`/threads/${$}/status`)},messages:{list:($,X={})=>h(Z,"GET",`/threads/${$}/messages${K1(X)}`),append:($,X)=>h(Z,"POST",`/threads/${$}/messages`,{message:X})},responses:{get:($)=>h(Z,"GET",`/responses/${$}`)},search:{threads:($)=>h(Z,"GET",`/search/threads${K1($)}`),messages:($)=>h(Z,"GET",`/search/messages${K1($)}`)},publicKeys:{list:($)=>h(Z,"GET",`/public-keys${K1($??{})}`),get:($)=>h(Z,"GET",`/public-keys/${$}`),create:($)=>h(Z,"POST","/public-keys",$)}}),s1=async(Z,$,X,Y)=>{let G=`${Z.baseUrl??"https://api.sazabi.com"}/cliAuth.${$}`,B=new AbortController,V=setTimeout(()=>B.abort(),e1);try{let J=Y==="query",q=J?`${G}?input=${encodeURIComponent(JSON.stringify(X))}`:G,K=await fetch(q,{method:J?"GET":"POST",headers:{"Content-Type":"application/json"},body:J?void 0:JSON.stringify(X),signal:B.signal});if(!K.ok){let W=await K.text();return j(`API error (${K.status}): ${W}`,K.status)}let D=await K.json();return I(D.result.data)}catch(J){if(J instanceof Error&&J.name==="AbortError")return j("Request timed out. Please try again.");let q=J instanceof Error?J.message:String(J);return j(`Request failed: ${q}`)}finally{clearTimeout(V)}},$9=(Z={})=>({initiate:()=>s1(Z,"initiate",{},"mutation"),poll:($)=>s1(Z,"poll",{deviceCode:$},"mutation")});import{parseArgs as J3}from"node:util";var A=(Z,$,X={})=>{let Y=J3({args:Z,options:$,allowPositionals:Boolean(X.allowPositionals),strict:!1,tokens:!0}),Q=Object.hasOwn($,"json")&&Y.values.json===!0,G=new Set(Object.keys($)),B=new Set(Object.entries($).map(([,J])=>J.short).filter((J)=>Boolean(J))),V=[];if(Array.isArray(Y.tokens))for(let J of Y.tokens){if(J.kind!=="option")continue;let q=J.name,K=q.length>1;if(!(G.has(q)||!K&&B.has(q))){let W=K?`--${q}`:`-${q}`;if(!V.includes(W))V.push(W)}}for(let J of Object.keys(Y.values))if(!G.has(J)){let q=J.length>1?`--${J}`:`-${J}`;if(!V.includes(q))V.push(q)}if(V.length>0){let J=`Unknown option${V.length>1?"s":""}: ${V.join(", ")}`;if(Q)H(J);_(J)}for(let[J,q]of Object.entries($))if(q.type==="string"&&Y.values[J]===!0){let D=`Option ${J.length===1?`-${J}`:`--${J}`} requires a value`;if(Q)H(D);_(D)}for(let[J,q]of Object.entries($)){let K=Y.values[J];if(q.type==="string"&&typeof K==="string"){if(K.startsWith("--")||K.length===2&&K[0]==="-"&&/[a-zA-Z]/.test(K.charAt(1))){let L=`Option ${J.length===1?`-${J}`:`--${J}`} received "${K}" as its value. Did you forget to provide a value?`;if(Q)H(L);_(L)}}}return{values:Y.values,positionals:Y.positionals}};import*as n from"node:fs";import*as X9 from"node:os";import*as S1 from"node:path";var Z9={};var M=(Z)=>{if(Z===void 0||Z===null)return;if(typeof Z==="string")return Z.length>0?Z:void 0;return},w1=S1.join(X9.homedir(),".sazabi"),J1=S1.join(w1,"settings.json"),V3=()=>{if(!n.existsSync(w1))n.mkdirSync(w1,{recursive:!0,mode:448})},C=()=>{try{if(!n.existsSync(J1))return I(Z9);let Z=n.readFileSync(J1,"utf-8"),$=JSON.parse(Z);if(typeof $==="object"&&$!==null&&"projects"in $){let Q={token:M($.token),organizationId:M($.organizationId),organizationName:M($.organizationName),defaultProjectId:M($.defaultProjectId),apiBaseUrl:M($.apiBaseUrl),webBaseUrl:M($.webBaseUrl),intakeBaseUrl:M($.intakeBaseUrl),tailBaseUrl:M($.tailBaseUrl),apiDomain:M($.apiDomain),webDomain:M($.webDomain),intakeDomain:M($.intakeDomain),tailDomain:M($.tailDomain),forwardPublicKey:M($.forwardPublicKey)},G=a(Q);if(!G.success)return G;return I(Q)}let Y={token:M($.token),organizationId:M($.organizationId),organizationName:M($.organizationName),defaultProjectId:M($.defaultProjectId),apiBaseUrl:M($.apiBaseUrl),webBaseUrl:M($.webBaseUrl),intakeBaseUrl:M($.intakeBaseUrl),tailBaseUrl:M($.tailBaseUrl),apiDomain:M($.apiDomain),webDomain:M($.webDomain),intakeDomain:M($.intakeDomain),tailDomain:M($.tailDomain),forwardPublicKey:M($.forwardPublicKey)};return I(Y)}catch(Z){let $=Z instanceof Error?Z.message:String(Z);return j(`Failed to read settings: ${$}`)}},a=(Z)=>{try{return V3(),n.writeFileSync(J1,JSON.stringify(Z,null,2),{encoding:"utf-8",mode:384}),I(void 0)}catch($){let X=$ instanceof Error?$.message:String($);return j(`Failed to write settings: ${X}`)}};var $1=(Z)=>{let{cliFlag:$,globalUrl:X,globalDomain:Y,buildUrlFromDomain:Q,defaultUrl:G}=Z;if($)return $;if(X)return X;if(Y)return Q(Y);return G},E=(Z)=>{let{tokenFlag:$,projectIdFlag:X,jsonMode:Y}=Z,Q=$?.trim(),G=process.env.SAZABI_TOKEN?.trim(),B=process.env.SAZABI_PROJECT_ID?.trim(),V=F(C(),"Failed to read settings",Y),J=V.token?.trim(),q=(Q&&Q.length>0?Q:void 0)||(G&&G.length>0?G:void 0)||J,K=Q&&Q.length>0?"flag":G&&G.length>0?"environment":"settings";if(!q||q.length===0){if(Y)return H("Not authenticated. Set SAZABI_TOKEN or run 'sazabi auth login'.");return _("Not authenticated. Set SAZABI_TOKEN or run 'sazabi auth login'.")}let D,W;if(X)D=X,W="settings";else if(B&&B.length>0)D=B,W="environment";else if(V.defaultProjectId)D=V.defaultProjectId,W="settings";return{token:q,type:"token",projectId:D,organizationId:V.organizationId,tokenSource:K,projectSource:W}};var m=(Z)=>{let $=F(C(),"Failed to read settings",Z.jsonMode),X=$1({cliFlag:Z.apiBaseUrlFlag,globalUrl:$.apiBaseUrl,globalDomain:$.apiDomain,buildUrlFromDomain:(Y)=>`https://api.${Y}`,defaultUrl:"https://api.sazabi.com"});return _1({token:Z.token,baseUrl:X,projectId:Z.projectId})},Q9=new Map,I1=new Map,Z1=async(Z)=>{let $=F(C(),"Failed to read settings",Z.jsonMode),X=$1({cliFlag:Z.apiBaseUrlFlag,globalUrl:$.apiBaseUrl,globalDomain:$.apiDomain,buildUrlFromDomain:(V)=>`https://api.${V}`,defaultUrl:"https://api.sazabi.com"}),Y=`${Z.token}@${X}@${Z.projectId??""}`,Q=Q9.get(Y);if(Q)return Q;let G=I1.get(Y);if(G)return G;let B=(async()=>{let J=await _1({token:Z.token,baseUrl:X,projectId:Z.projectId}).project.get(),q=F(J,"Failed to fetch project info",Z.jsonMode);return Q9.set(Y,q),q})();I1.set(Y,B);try{return await B}finally{I1.delete(Y)}},U1=(Z)=>{if(Z)return Z;let $=F(C(),"Failed to read settings");if($.webBaseUrl)return $.webBaseUrl;if($.webDomain)return`https://app.${$.webDomain}`;if($.apiDomain)return`https://app.${$.apiDomain}`;if($.apiBaseUrl?.includes("sazabi.dev"))return"https://app.sazabi.dev";return"https://app.sazabi.com"};var F1=(Z,$,X)=>{return`${U1(X)}/projects/${Z}/threads/${$}`},Y9=(Z,$)=>{return`https://otlp.${$}.intake.${Z}`};var b1=(Z,$)=>{let X=Z?.json;if(!X||X.type!=="boolean")throw Error(`${$} must include a boolean --json option (enforced by CommandBuilder)`)};class G9{name;description;handler;options;examples;positionalArgs;allowNoJson=!1;constructor(Z,$,X){this.name=Z,this.description=$,this.handler=X}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)b1(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 J9{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)b1(this.options,`Command "${this.name}"`);if(this.subcommands)for(let[Z,$]of Object.entries(this.subcommands))b1($.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 c=(Z,$)=>{return new J9(Z,$)},T=(Z,$,X)=>{return new G9(Z,$,X)};var V9=(Z)=>{if(Z==="flag")return"from --token flag";if(Z==="environment")return"from environment";return"from settings"},B3=async(Z={})=>{let $=E({jsonMode:Z.json});if(Z.json){O({authType:"token",organizationId:$.organizationId,defaultProjectId:$.projectId,tokenSource:$.tokenSource,projectSource:$.projectSource});return}w("Authentication"),X1({Type:`Token (${V9($.tokenSource)})`,Organization:$.organizationId??x("(unknown)"),Project:$.projectId&&$.projectSource?`${$.projectId} (${V9($.projectSource)})`:x("(none)"),"Dashboard URL":U1()})},K3=(Z)=>{let $=process.platform,X,Y;if($==="darwin")X="open",Y=[Z];else if($==="win32")X="cmd",Y=["/c","start","",Z];else X="xdg-open",Y=[Z];let Q=q3(X,Y,{detached:!0,stdio:"ignore"});Q.on("error",()=>{}),Q.unref()},_3=(Z)=>new Promise(($)=>setTimeout($,Z)),H3=async(Z={})=>{let $=F(C(),"Failed to read settings",Z.json),X=$1({cliFlag:Z.apiBaseUrl,globalUrl:$.apiBaseUrl,globalDomain:$.apiDomain,buildUrlFromDomain:(L)=>`https://api.${L}`,defaultUrl:"https://api.sazabi.com"}),Y=$9({baseUrl:X}),Q=await Y.initiate();if(!Q.success){if(Z.json)return H(`Failed to initiate login: ${Q.error}`);return _(`Failed to initiate login: ${Q.error}`)}let{deviceCode:G,userCode:B,expiresAt:V,pollingIntervalSeconds:J}=Q.value,K=`${U1(Z.webBaseUrl)}/login/cli`;if(!Z.json)P(),w("Login to Sazabi"),P(),d("Enter this code in your browser:"),P(),d(f.bold(B),4),P(),d(`Opening ${f.info(K)}`),P(),K3(K),U("Waiting for authorization...");let D=new Date(V),W=J*1000;while(new Date<D){await _3(W);let L=await Y.poll(G);if(!L.success){if(L.statusCode===404){if(Z.json)return H("Authorization request not found. Please try logging in again.");return P(),_("Authorization request not found. Please try logging in again.")}if(L.statusCode===500){if(Z.json)return H("Server error during authorization. Please try again.");return P(),_("Server error during authorization. Please try again.")}continue}let z=L.value;if(z.status==="pending")continue;if(z.status==="expired"){if(Z.json)return H("Authorization request expired. Please try again.");return P(),_("Authorization request expired. Please try again.")}if(z.status==="rejected"){if(Z.json)return H("Authorization was denied.");return P(),_("Authorization was denied.")}if(z.status==="authorized"){let N={...$,token:z.cliToken,organizationId:z.organization.id,organizationName:void 0,defaultProjectId:z.defaultProjectId??void 0};if(F(a(N),"Failed to save credentials",Z.json),Z.json){O({status:"authorized",organization:z.organization,projects:z.projects,defaultProjectId:z.defaultProjectId});return}if(P(),S("Successfully authenticated!"),P(),X1({Organization:z.organization.id,Projects:z.projects.length.toString(),"Default Project":z.projects.find((R)=>R.id===z.defaultProjectId)?.name??"(none)"}),z.projects.length>0){P(),w("Available Projects");for(let R of z.projects){let p=R.id===z.defaultProjectId?f.success(" (default)"):"";d(`${R.name} (${R.region})${p}`)}}return}}if(Z.json)return H("Authorization request expired. Please try again.");return P(),_("Authorization request expired. Please try again.")},z3=(Z)=>{let $=F(C(),"Failed to read settings",Z.json),X=Boolean($.token),Y={...$};if(delete Y.token,delete Y.organizationId,delete Y.organizationName,delete Y.defaultProjectId,delete Y.secretKey,delete Y.cliToken,F(a(Y),"Failed to remove credentials",Z.json),Z.json){O({removed:X});return}if(X)S("Logged out successfully.");else U("No credentials were saved.")},q9=c("auth","Authentication management").withSubcommands({login:T("login","Authenticate via browser",async(Z)=>{let{values:$,positionals:X}=A(Z,{json:{type:"boolean"},"api-base-url":{type:"string"},"web-base-url":{type:"string"}},{allowPositionals:!0});if(X.length>0){let Y=X.join(", ");if($.json)return H(`Unexpected arguments: ${Y}`);return _(`Unexpected arguments: ${Y}`)}await H3({json:$.json,apiBaseUrl:$["api-base-url"],webBaseUrl:$["web-base-url"]})}).withOptions({json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"},"web-base-url":{type:"string",description:"Override web app base URL"}}).withExamples(["sazabi auth login # Open browser for web login","sazabi auth login --json # Output device code as JSON"]).build(),logout:T("logout","Remove saved credentials",async(Z)=>{let{values:$,positionals:X}=A(Z,{json:{type:"boolean"}},{allowPositionals:!0});if(X.length>0){let Y=X.join(", ");if($.json)return H(`Unexpected arguments: ${Y}`);return _(`Unexpected arguments: ${Y}`)}z3({json:$.json})}).withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi auth logout # Remove saved credentials"]).build(),whoami:T("whoami","Display current authentication context",async(Z)=>{let{values:$,positionals:X}=A(Z,{json:{type:"boolean"}},{allowPositionals:!0});if(X.length>0){let Y=X.join(", ");if($.json)return H(`Unexpected arguments: ${Y}`);return _(`Unexpected arguments: ${Y}`)}await B3({json:$.json})}).withOptions({json:{type:"boolean",description:"Output as JSON"}}).withExamples(["sazabi auth whoami # Show current context","sazabi auth whoami --json # Output as JSON"]).build()}).withExamples(["sazabi auth login # Authenticate via browser","sazabi auth logout # Remove saved credentials","sazabi auth whoami # Show current context"]).build();var b=(Z,$,X,Y,Q)=>{let G=Number.parseInt(Z,10);if(Number.isNaN(G)||G<$||G>X){let B=`${Y} must be between ${$} and ${X}`;if(Q)return H(B);return _(B)}return G},H1=(Z,$,X,Y)=>{if(!$.includes(Z)){let Q=$.map((B)=>`"${B}"`).join(" or "),G=`${X} must be ${Q}`;if(Y)return H(G);return _(G)}return Z};import*as l from"node:fs";import*as N1 from"node:readline";var L1=(Z)=>new Promise(($)=>setTimeout($,Z));var D3=(Z,$)=>{let X=$??`https://${Z}.intake.sazabi.com`,Y=X.endsWith("/")?X.slice(0,-1):X,Q=Y.match(/^https:\/\/([a-z0-9-]+)\.intake\.([a-z0-9.]+)$/);return`${Q?`https://otlp.${Q[1]}.intake.${Q[2]}`:Y}/v1/logs`},P3=async(Z,$,X=3,Y=1000,Q=1e4)=>{let G;for(let B=0;B<=X;B++){let V=new AbortController,J=setTimeout(()=>V.abort(),Q);try{let q=await fetch(Z,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($),signal:V.signal});if(q.ok)return I(void 0);if(q.status===401||q.status===403)return j("Authentication failed. Check your public key.");if(q.status===429){let K=await q.text();G=Error(`Rate limited (429): ${K}`)}else if(q.status>=400&&q.status<500){let K=await q.text();return j(`Client error (${q.status}): ${K}`)}else{let K=await q.text();G=Error(`Server error (${q.status}): ${K}`)}}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(B<X){let q=Y*2**B;await new Promise((K)=>setTimeout(K,q))}}return j(`Failed after ${X+1} attempts: ${G?.message??"Unknown error"}`)},B9=async(Z,$)=>{let X=D3(Z.region,Z.intakeBaseUrl),Y=$.resourceLogs?.reduce((G,B)=>G+(B.scopeLogs?.reduce((V,J)=>V+(J.logRecords?.length??0),0)??0),0)??0;if(Z.verbose)U(`Forwarding ${Y} logs...`);let Q=await P3(X,$);if(Q.success)return{forwardedCount:Y,failedCount:0};if(Z.verbose)u(`Failed to forward logs: ${Q.error}`);return{forwardedCount:0,failedCount:Y,error:Q.error}};var W3=(Z)=>{return`${Z.getTime()*1e6}`},K9=(Z,$)=>{let Y=W3(new Date),Q=Z.filter((G)=>G.trim().length>0).map((G)=>({timeUnixNano:Y,observedTimeUnixNano:Y,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:Q}]}]}};var U3=async(Z,$)=>{U("Ensuring public key exists...");let X=await Z.publicKeys.create({name:"sazabi-cli-forward"});if(!X.success)return s(`Failed to create public key: ${X.error}`),null;return S(`Created new public key: ${X.value.publicKey.name}`),X.value.publicKey.value},f1=(Z,$,X,Y,Q,G)=>{return async()=>{if(Z.length===0)return;let B=K9(Z,X),V=await B9({region:Y,publicKey:X,verbose:!0,intakeBaseUrl:Q},B);if($.totalForwarded+=V.forwardedCount,$.totalFailed+=V.failedCount,G)G({forwarded:V.forwardedCount,failed:V.failedCount});Z.length=0}},F3=async(Z,$,X,Y,Q,G,B)=>{let V=l.createReadStream(Z),J=N1.createInterface({input:V,crlfDelay:Number.POSITIVE_INFINITY}),q=[],K={totalForwarded:0,totalFailed:0},D=f1(q,K,$,X,Q,(W)=>B?.push(W));try{for await(let W of J)if(q.push(W),q.length>=Y)await D()}catch(W){s(`Failed to read ${Z}: ${W instanceof Error?W.message:String(W)}`);return}if(await D(),G);else if(P(),v(f.muted("─".repeat(80))),S(`Forwarded ${K.totalForwarded} logs`),K.totalFailed>0)u(`Failed to forward ${K.totalFailed} logs`)},L3=async(Z,$,X,Y,Q,G)=>{let B=N1.createInterface({input:process.stdin,output:process.stdout,terminal:!1}),V=[],J={totalForwarded:0,totalFailed:0},q=f1(V,J,Z,$,Y,(K)=>G?.push(K));try{for await(let K of B)if(V.push(K),V.length>=X)await q()}catch(K){s(`Failed to read from stdin: ${K instanceof Error?K.message:String(K)}`);return}if(await q(),Q);else if(P(),v(f.muted("─".repeat(80))),S(`Forwarded ${J.totalForwarded} logs`),J.totalFailed>0)u(`Failed to forward ${J.totalFailed} logs`)},N3=async(Z,$,X,Y,Q,G,B)=>{let V=[],J={totalForwarded:0,totalFailed:0},q=f1(V,J,$,X,Q,(p)=>B?.push(p)),K=null,D=null,W=async()=>{if(D)clearTimeout(D);if(K)K.close();if(await q(),G);else if(P(),v(f.muted("─".repeat(80))),S(`Forwarded ${J.totalForwarded} logs`),J.totalFailed>0)u(`Failed to forward ${J.totalFailed} logs`)};process.on("SIGINT",async()=>{P(),U("Interrupted, flushing remaining logs..."),await W(),process.exit(0)});let L=null,z=null,N=!1,R=0,V1=async()=>{if(N)return;N=!0;try{if((await l.promises.stat(Z)).size<R)R=0;L=l.createReadStream(Z,{encoding:"utf8",start:R}),z=N1.createInterface({input:L,crlfDelay:Number.POSITIVE_INFINITY});for await(let b9 of z)if(V.push(b9),V.length>=Y)await q();R=(await l.promises.stat(Z)).size}catch(p){s(`Failed to read ${Z}: ${p instanceof Error?p.message:String(p)}`)}finally{N=!1}};await V1(),K=l.watch(Z,async(p)=>{if(p==="change"){if(D)clearTimeout(D);D=setTimeout(async()=>{if(N)return;if(L)L.close();if(z)z.close();await L1(50),await V1()},100)}})},_9=async(Z)=>{let $=Z.batchSize??100;if($<=0){if(Z.json)return H("Batch size must be a positive number");throw _("Batch size must be a positive number"),Error("Unreachable")}if(Z.follow&&!Z.file){if(Z.json)return H("--follow flag requires --file to be specified");throw _("--follow flag requires --file to be specified"),Error("Unreachable")}let X=C();if(!X.success)throw _(`Failed to read settings: ${X.error}`),Error("Unreachable");let Y=X.value,Q=Z.json===!0,G=E({tokenFlag:Z.token,jsonMode:Q}),B=_1({token:G.token,projectId:G.projectId,baseUrl:$1({cliFlag:Z.apiBaseUrl,globalUrl:Y.apiBaseUrl,globalDomain:Y.apiDomain,buildUrlFromDomain:(z)=>`https://api.${z}`,defaultUrl:"https://api.sazabi.com"})});if(!Q)w("Forwarding logs...");let V=await Z1({token:G.token,projectId:G.projectId,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:Q});if(!Q)U(`Project: ${V.name}`);let J;if(Z.region){if(Z.region!=="us-west-2"&&Z.region!=="us-east-1"){let z=`Invalid region: ${Z.region}. Valid regions: us-west-2, us-east-1`;if(Q)return H(z);throw _(z),Error("Unreachable")}J=Z.region}else J=V.region;if(!Q)U(`Region: ${J}`);if(!Q)U(`Batch size: ${$}`);let q=Z.publicKey?.trim()||Y.forwardPublicKey?.trim()||void 0;if(!q){let z=await U3(B,{id:V.id});if(!z)throw _("Failed to get or create public key"),Error("Unreachable");q=z;let N=a({...Y,forwardPublicKey:q});if(!N.success)u(`Failed to store public key: ${N.error}`)}if(!Q)P(),v(f.muted("─".repeat(80))),P();let K=Z.intakeBaseUrl??Y.intakeBaseUrl??(Y.intakeDomain?Y9(Y.intakeDomain,J):void 0)??`https://otlp.${J}.intake.sazabi.com`;try{let z=new URL(K);if(/\.intake\.sazabi\.(dev|com)$/.test(z.host)&&!z.host.startsWith("otlp."))u("Intake base URL may not be the OTLP endpoint. For Sazabi, prefer https://otlp.{region}.intake.sazabi.dev or .com as appropriate.")}catch{}let D=!Z.follow,W=[],L={forwarded:0,failed:0};if(Z.follow&&Z.file)await N3(Z.file,q,J,$,K,Q,D?W:void 0);else if(Z.file)await F3(Z.file,q,J,$,K,Q,W);else await L3(q,J,$,K,Q,W);for(let z of W)L.forwarded+=z.forwarded,L.failed+=z.failed;if(Q){let z={forwardedCount:L.forwarded,failedCount:L.failed,batches:W,project:{id:V.id,name:V.name,region:J},intakeBaseUrl:K,batchSize:$,follow:Boolean(Z.follow),file:Z.file??void 0};console.log(JSON.stringify(z))}};var O3=(Z)=>{let $=Z.baseUrl??`wss://${Z.region}.tail.sazabi.com`,X=new URL($);if(Z.projectId)X.searchParams.set("projectId",Z.projectId);if(Z.filters&&Object.keys(Z.filters).length>0){let Y={};if(Z.filters.severities?.length)Y.severities=Z.filters.severities;if(Z.filters.services?.length)Y.services=Z.filters.services;if(Z.filters.environments?.length)Y.environments=Z.filters.environments;if(Z.filters.searchTerm)Y.searchTerm=Z.filters.searchTerm;if(Z.filters.traceId)Y.traceId=Z.filters.traceId;if(Object.keys(Y).length>0)X.searchParams.set("filters",JSON.stringify(Y))}return X.toString()},H9=(Z)=>{let $=O3(Z),X;try{X=new WebSocket($,[Z.apiKey])}catch(Y){let Q=Y instanceof Error?Y:Error("Failed to open WebSocket connection.");return Z.onError(Q),{close:()=>{}}}return X.onopen=()=>{Z.onOpen?.()},X.onmessage=(Y)=>{try{let Q;if(typeof Y.data==="string")Q=Y.data;else if(Y.data instanceof ArrayBuffer)Q=new TextDecoder().decode(Y.data);else if(Y.data instanceof Blob)return;else return;let G=JSON.parse(Q);if(G.type==="logs"&&Array.isArray(G.data))for(let B of G.data)Z.onLog(B)}catch{}},X.onerror=()=>{let Y=Error("WebSocket connection failed. Check the close event for details.");Z.onError(Y)},X.onclose=(Y)=>{Z.onClose(Y.code,Y.reason)},{close:()=>{X.close()}}};var z9=["ERROR","WARN","INFO","DEBUG","TRACE"],M3=(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"}},A3=(Z)=>{let $=new Date(Z.timestamp).toISOString().split("T")[1],X=E1(Z.severity,Z.severity.padEnd(7)),Y=f.cyan(Z.service.padEnd(20)),Q=Z.body.length>120?`${Z.body.substring(0,117)}...`:Z.body;return`[${$}] ${X} ${Y} ${Q}`},D9=async(Z)=>{let $=C();if(!$.success)throw _(`Failed to read settings: ${$.error}`),Error("Unreachable");let X=$.value,Y=Z.json??!1,Q=Z.severities?.split(",").map((N)=>N.trim().toUpperCase()),G=Z.services?.split(",").map((N)=>N.trim()),B=Z.environments?.split(",").map((N)=>N.trim());if(Q){for(let N of Q)if(!z9.includes(N)){let R=`Invalid severity: ${N}. Valid values: ${z9.join(", ")}`;if(Y)return H(R);return _(R)}}if(!Y){if(w("Tailing logs..."),Q?.length)U(`Severities: ${Q.join(", ")}`);if(G?.length)U(`Services: ${G.join(", ")}`);if(B?.length)U(`Environments: ${B.join(", ")}`);if(Z.search)U(`Search: ${Z.search}`);if(Z.traceId)U(`Trace ID: ${Z.traceId}`);y1(),P()}let V=0,J=!1,q,K=()=>{if(q)clearTimeout(q);P(),U("Interrupted, closing connection..."),z.close(),process.exit(0)},D=E({tokenFlag:Z.token,jsonMode:Y}),L=await(async()=>{if(Z.region==="us-west-2"||Z.region==="us-east-1")return Z.region;return(await Z1({token:D.token,projectId:D.projectId,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:Y})).region})(),z=H9({apiKey:D.token,region:L,projectId:D.projectId,baseUrl:$1({cliFlag:Z.tailBaseUrl,globalUrl:X.tailBaseUrl,globalDomain:X.tailDomain,buildUrlFromDomain:(N)=>`wss://${L}.tail.${N}`,defaultUrl:`wss://${L}.tail.sazabi.com`}),filters:{severities:Q,services:G,environments:B,searchTerm:Z.search,traceId:Z.traceId},onOpen:()=>{if(J=!0,!Y)S("Connected! Waiting for logs..."),P()},onLog:(N)=>{if(V++,Y)O(N);else v(A3(N))},onError:()=>{if(!J)u("Connection failed. See close reason below.")},onClose:(N,R)=>{if(process.removeListener("SIGINT",K),q)clearTimeout(q);if(!Y){P(),y1();let V1=M3(N,R);if(N&&N!==1000)s(`Connection closed: ${V1}`);else U(`Connection closed. Received ${V} logs.`)}}});if(!Y)U(`Region: ${L}`);if(Z.duration&&Z.duration>0)q=setTimeout(()=>{if(!Y)P(),U("Duration reached, closing connection...");z.close()},Z.duration*1000);process.on("SIGINT",K)};var P9=c("logs","Real-time log operations").withSubcommands({tail:T("tail","Stream logs from current project in real-time",async(Z)=>{let{values:$}=A(Z,{token:{type:"string"},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"},region:{type:"string"},"api-base-url":{type:"string"}}),X={};if($.token)X.token=$.token;if($.severities)X.severities=$.severities;if($.services)X.services=$.services;if($.environments)X.environments=$.environments;if($.search)X.search=$.search;if($["trace-id"])X.traceId=$["trace-id"];if($.duration)X.duration=b($.duration,1,Number.MAX_SAFE_INTEGER,"Duration",$.json);if($.json)X.json=!0;if($["tail-base-url"])X.tailBaseUrl=$["tail-base-url"];if($.region)X.region=$.region;if($["api-base-url"])X.apiBaseUrl=$["api-base-url"];await D9(X)}).withOptions({token:{type:"string",description:"Override authentication token"},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"},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:T("forward","Forward plaintext logs to current project",async(Z)=>{let{values:$}=A(Z,{token:{type:"string"},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"},"public-key":{type:"string"},region:{type:"string"}}),X={};if($.token)X.token=$.token;if($.file)X.file=$.file;if($.follow)X.follow=$.follow;if($["batch-size"])X.batchSize=b($["batch-size"],1,Number.MAX_SAFE_INTEGER,"Batch size",$.json);if($["api-base-url"])X.apiBaseUrl=$["api-base-url"];if($["intake-base-url"])X.intakeBaseUrl=$["intake-base-url"];if($.region)X.region=$.region;if($["public-key"])X.publicKey=$["public-key"];await _9({...X,json:$.json})}).withOptions({token:{type:"string",description:"Override authentication token"},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"},"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 T3=2000,h1=async(Z)=>{let $=Z.pollIntervalMs??T3,X=Date.now(),Y=!1;while(!0){let Q=await Z.client.responses.get(Z.responseId);if(!Q.success){if(!E3(Q))return v1(Z.printProgress,Y),Q}else if(Q.value.status!=="processing")return v1(Z.printProgress,Y),Q;let G=Date.now()-X;if(Z.timeoutMs!==void 0&&G>=Z.timeoutMs){if(v1(Z.printProgress,Y),Q.success)return I(Q.value);return I({responseId:Z.responseId,status:"processing",elapsedSeconds:Math.floor(G/1000)})}Y=k3(Z.printProgress,Y),await L1($)}},k3=(Z,$)=>{if(!Z)return $;if(!$)process.stdout.write(`
|
|
3
|
+
`);return process.stdout.write("."),!0},v1=(Z,$)=>{if(!Z||!$)return;process.stdout.write(`
|
|
4
|
+
`)},E3=(Z)=>{return Z.statusCode===404};var U9=async(Z,$={})=>{let X=E({tokenFlag:$.token,jsonMode:$.json}),Y=m({token:X.token,projectId:X.projectId,apiBaseUrlFlag:$.apiBaseUrl}),Q=await j3({message:Z,threadId:$.threadId,token:X.token,projectId:X.projectId,apiBaseUrl:$.apiBaseUrl,json:$.json,client:Y});if(!$.wait){if($.json){O(O1(Q));return}if(g1(Q),Q.status!=="processing")U(`Status: ${Q.status}`);return}if(Q.status!=="processing"){if($.json){O(O1(Q));return}g1(Q),U(`Status: ${Q.status}`);return}if(!$.json)g1(Q);let G=F(await h1({client:Y,responseId:Q.responseId,timeoutMs:$.timeout,printProgress:!$.json}),"Failed to get response",$.json);if(G.status==="processing"){if($.json){O(O1(Q));return}U(`Not ready. Poll with: ${c1(Q.responseId)}`);return}if($.json){O(O1(Q,{status:G.status,response:G.response}));return}L9(G.status,G.response)},F9=async(Z,$={})=>{let X=E({tokenFlag:$.token,jsonMode:$.json}),Y=m({token:X.token,projectId:X.projectId,apiBaseUrlFlag:$.apiBaseUrl});if(!$.wait){let G=F(await Y.responses.get(Z),"Failed to get response",$.json);if($.json){O(W9(G));return}C3(G);return}let Q=F(await h1({client:Y,responseId:Z,timeoutMs:$.timeout,printProgress:!$.json}),"Failed to get response",$.json);if($.json){O(W9(Q));return}if(Q.status==="processing"){U(`Not ready. Poll with: ${c1(Z)}`);return}L9(Q.status,Q.response)},j3=async(Z)=>{if(Z.threadId){let Y=F(await Z.client.messages.append(Z.threadId,Z.message),"Failed to send message",Z.json);return{threadId:Z.threadId,responseId:Y.responseId,status:Y.status}}let $=F(await Z.client.threads.create(Z.message),"Failed to create thread",Z.json),X=await Z1({token:Z.token,projectId:Z.projectId,apiBaseUrlFlag:Z.apiBaseUrl,jsonMode:Z.json});return{threadId:$.threadId,responseId:$.responseId,status:$.status,threadUrl:F1(X.id,$.threadId)}},c1=(Z)=>{return`sazabi responses get ${Z}`},g1=(Z)=>{if(Z.threadUrl)U(`Thread ID: ${Z.threadId}`),U(`View URL: ${Z.threadUrl}`);U(`Response ID: ${Z.responseId}`),U(`Poll with: ${c1(Z.responseId)}`)},O1=(Z,$)=>{let X=$?.status??Z.status;if(Z.threadUrl)return{threadId:Z.threadId,responseId:Z.responseId,status:X,...$?{response:$.response}:{},url:Z.threadUrl};return{responseId:Z.responseId,status:X,...$?{response:$.response}:{}}},W9=(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(U(`Status: ${Z.status}`),Z.status==="processing")return;if(!m1(Z.response))return;P(),v(Z.response)},L9=(Z,$)=>{if(Z==="completed"){if(!m1($)){U("Status: completed");return}v($);return}if(U(`Status: ${Z}`),!m1($))return;v($)},m1=(Z)=>{return Boolean(Z&&Z.trim().length>0)};var R3=async(Z,$)=>{let X=E({tokenFlag:$.token,jsonMode:$.json}),Y=m({token:X.token,projectId:X.projectId,apiBaseUrlFlag:$.apiBaseUrl}),{messages:Q,nextCursor:G}=F(await Y.messages.list(Z,{limit:$.limit,cursor:$.cursor}),"Failed to list messages",$.json);if($.json){O({messages:Q,nextCursor:G});return}if(Q.length===0){g("No messages found.");return}let B=Q.map((V)=>{let J=V.content.find((K)=>K.type==="message"&&Boolean(K.message)),q=J?W1(J.message):x("(no text)");return{id:o(V.id),role:Y1(V.role),content:q,created:i(V.createdAt)}});r(B,[{header:"ID",key:"id"},{header:"Role",key:"role"},{header:"Content",key:"content"},{header:"Created",key:"created"}],{header:"Messages"}),e({type:"cursor",nextCursor:G})},x3=async(Z,$)=>{let X=E({tokenFlag:$.token,jsonMode:$.json}),Y=m({token:X.token,projectId:X.projectId,apiBaseUrlFlag:$.apiBaseUrl}),{messages:Q,pagination:G}=F(await Y.search.messages({query:Z,limit:$.limit,page:$.page,threadId:$.threadId,role:$.role}),"Failed to search messages",$.json);if($.json){O({messages:Q,pagination:G});return}if(Q.length===0){g("No matching messages found.");return}let B=Q.map((V)=>({id:o(V.id),thread:V.threadTitle||x("(no title)"),role:Y1(V.role),content:W1(V.content),score:V.score?.toFixed(2)??"-"}));r(B,[{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}}),e({type:"page",page:G.page,totalPages:G.totalPages})},N9=c("messages","Message operations").withSubcommands({send:T("send","Send a message (creates new thread if --thread-id omitted)",async(Z)=>{let{values:$,positionals:X}=A(Z,{token:{type:"string"},"thread-id":{type:"string",short:"t"},wait:{type:"boolean"},timeout:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),Y=X.join(" ");if(!Y){if($.json)return H("Message is required. Usage: sazabi messages send <message> [--thread-id <id>]");return _("Message is required. Usage: sazabi messages send <message> [--thread-id <id>]")}let Q=$.timeout?b($.timeout,1,3600,"Timeout",$.json)*1000:void 0,G={token:$.token,threadId:$["thread-id"],wait:$.wait,timeout:Q,json:$.json,apiBaseUrl:$["api-base-url"]};await U9(Y,G)}).withPositionalArgs("<message>").withOptions({token:{type:"string",description:"Override authentication token"},"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"}}).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:T("list","List messages in a thread",async(Z)=>{let{values:$,positionals:X}=A(Z,{token:{type:"string"},limit:{type:"string"},cursor:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),Y=X[0];if(!Y){if($.json)return H("Thread ID is required. Usage: sazabi messages list <thread-id>");return _("Thread ID is required. Usage: sazabi messages list <thread-id>")}if(X.length>1){let G=X.slice(1).join(", ");if($.json)return H(`Unexpected arguments: ${G}`);return _(`Unexpected arguments: ${G}`)}let Q={token:$.token,json:$.json,apiBaseUrl:$["api-base-url"]};if($.limit)Q.limit=b($.limit,1,100,"Limit",$.json);if($.cursor)Q.cursor=$.cursor;await R3(Y,Q)}).withPositionalArgs("<thread-id>").withOptions({token:{type:"string",description:"Override authentication token"},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"}}).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:T("search","Search messages in current project",async(Z)=>{let{values:$,positionals:X}=A(Z,{token:{type:"string"},limit:{type:"string"},page:{type:"string"},"thread-id":{type:"string"},role:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),Y=X.join(" ");if(!Y){if($.json)return H("Search query is required. Usage: sazabi messages search <query>");return _("Search query is required. Usage: sazabi messages search <query>")}let Q={token:$.token,json:$.json,apiBaseUrl:$["api-base-url"]};if($.limit)Q.limit=b($.limit,1,100,"Limit",$.json);if($.page)Q.page=b($.page,1,Number.MAX_SAFE_INTEGER,"Page",$.json);if($["thread-id"])Q.threadId=$["thread-id"];if($.role)Q.role=H1($.role,["user","assistant"],"Role",$.json);await x3(Y,Q)}).withPositionalArgs("<query>").withOptions({token:{type:"string",description:"Override authentication token"},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"}}).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 O9=c("responses","Response operations").withSubcommands({get:T("get","Get a response by response ID",async(Z)=>{let{values:$,positionals:X}=A(Z,{token:{type:"string"},wait:{type:"boolean"},timeout:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),Y=X[0];if(!Y){if($.json)return H("Response ID is required. Usage: sazabi responses get <response-id>");return _("Response ID is required. Usage: sazabi responses get <response-id>")}if(X.length>1){let B=X.slice(1).join(", ");if($.json)return H(`Unexpected arguments: ${B}`);return _(`Unexpected arguments: ${B}`)}let Q=$.timeout?b($.timeout,1,3600,"Timeout",$.json)*1000:void 0,G={token:$.token,wait:$.wait,timeout:Q,json:$.json,apiBaseUrl:$["api-base-url"]};await F9(Y,G)}).withPositionalArgs("<response-id>").withOptions({token:{type:"string",description:"Override authentication token"},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"}}).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 u1=["apiBaseUrl","webBaseUrl","intakeBaseUrl","tailBaseUrl","apiDomain","webDomain","intakeDomain","tailDomain","forwardPublicKey"],M9=(Z)=>{return u1.includes(Z)},y3=(Z={})=>{let $=F(C(),"Failed to read settings",Z.json);if(Z.json){O({success:!0,settingsFile:J1,settings:$});return}X1({"Settings file":J1}),P();let X=Object.entries($).filter(([,Q])=>Q!=null);if(X.length===0){g("No settings configured.");return}let Y=X.map(([Q,G])=>({key:Q,value:String(G)})).sort((Q,G)=>Q.key.localeCompare(G.key));r(Y,[{header:"Key",key:"key",width:20},{header:"Value",key:"value"}],{header:"Settings"})},w3=(Z,$,X={})=>{if(!M9(Z)){let Q=u1.join(", "),G=`Invalid setting key: '${Z}'. Valid keys: ${Q}`;if(X.json){H(G);return}_(G);return}let Y=F(C(),"Failed to read settings",X.json);if(Y[Z]=$,F(a(Y),"Failed to write settings",X.json),X.json){O({success:!0,key:Z,value:$});return}S(`Set ${Z} to ${$}`)},S3=(Z,$={})=>{if(!M9(Z)){let Y=u1.join(", "),Q=`Invalid setting key: '${Z}'. Valid keys: ${Y}`;if($.json){H(Q);return}_(Q);return}let X=F(C(),"Failed to read settings",$.json);if(delete X[Z],F(a(X),"Failed to write settings",$.json),$.json){O({success:!0,key:Z});return}S(`Cleared ${Z}`)},A9=c("settings","CLI settings management").withSubcommands({view:T("view","Show current CLI settings and file location",async(Z)=>{let{values:$}=A(Z,{json:{type:"boolean"}});y3({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:T("set","Set a global configuration value",async(Z)=>{let{values:$,positionals:X}=A(Z,{json:{type:"boolean"}},{allowPositionals:!0}),Y=X[0],Q=X[1];if(!Y){if($.json)return H("Setting key is required. Usage: sazabi settings set <key> <value>");return _("Setting key is required. Usage: sazabi settings set <key> <value>")}if(!Q){if($.json)return H("Value is required. Usage: sazabi settings set <key> <value>");return _("Value is required. Usage: sazabi settings set <key> <value>")}w3(Y,Q,{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:T("unset","Clear a global configuration value",async(Z)=>{let{values:$,positionals:X}=A(Z,{json:{type:"boolean"}},{allowPositionals:!0}),Y=X[0];if(!Y){if($.json)return H("Setting key is required. Usage: sazabi settings unset <key>");return _("Setting key is required. Usage: sazabi settings unset <key>")}S3(Y,{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 T9=async(Z,$)=>{let X=E({tokenFlag:$.token,jsonMode:$.json}),Y=m({token:X.token,projectId:X.projectId,apiBaseUrlFlag:$.apiBaseUrl}),{thread:Q,messages:G}=F(await Y.threads.get(Z),"Failed to get thread",$.json),{id:B}=await Z1({token:X.token,projectId:X.projectId,apiBaseUrlFlag:$.apiBaseUrl,jsonMode:$.json});if($.json){O({thread:Q,messages:G});return}if(w("Thread"),X1({ID:Q.id,URL:F1(B,Q.id),Title:Q.title||"(no title)",Status:Q.status,Created:i(Q.createdAt),Updated:i(Q.updatedAt)}),P(),w("Messages"),G.length===0){g("No messages.");return}for(let V of G){v(Y1(V.role,`[${V.role}] ${i(V.createdAt)}`));for(let J of V.content)if(J.type==="message"&&J.message)d(J.message);else if(J.type==="tool_call")d(x("[tool call]"));else if(J.type==="artifact")d(x("[artifact]"));else d(x(`[${J.type}]`));P()}};var k9=async(Z)=>{let $=E({tokenFlag:Z.token,jsonMode:Z.json}),Y=await m({token:$.token,projectId:$.projectId,apiBaseUrlFlag:Z.apiBaseUrl}).threads.list({limit:Z.limit,cursor:Z.cursor,status:Z.status}),{threads:Q,nextCursor:G}=F(Y,"Failed to list threads",Z.json);if(Z.json){O({threads:Q,nextCursor:G});return}if(Q.length===0){g("No threads found.");return}let B=Q.map((V)=>({id:o(V.id),title:V.title||x("(no title)"),status:V.status,updated:i(V.updatedAt)}));r(B,[{header:"ID",key:"id"},{header:"Title",key:"title"},{header:"Status",key:"status"},{header:"Updated",key:"updated"}],{header:"Threads"}),e({type:"cursor",nextCursor:G})};var E9=async(Z,$)=>{let X=E({tokenFlag:$.token,jsonMode:$.json}),Y=m({token:X.token,projectId:X.projectId,apiBaseUrlFlag:$.apiBaseUrl}),{threads:Q,pagination:G}=F(await Y.search.threads({query:Z,limit:$.limit,page:$.page,status:$.status}),"Failed to search threads",$.json);if($.json){O({threads:Q,pagination:G});return}if(Q.length===0){g("No matching threads found.");return}let B=Q.map((V)=>({id:o(V.id),title:V.title||x("(no title)"),status:V.status,score:V.score?.toFixed(2)??"-"}));r(B,[{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}}),e({type:"page",page:G.page,totalPages:G.totalPages})};var j9=c("threads","Thread operations").withSubcommands({list:T("list","List threads from current project",async(Z)=>{let{values:$}=A(Z,{token:{type:"string"},limit:{type:"string"},cursor:{type:"string"},status:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}}),X={token:$.token,json:$.json,apiBaseUrl:$["api-base-url"]};if($.limit)X.limit=b($.limit,1,100,"Limit",$.json);if($.cursor)X.cursor=$.cursor;if($.status)X.status=H1($.status,["regular","archived"],"Status",$.json);await k9(X)}).withOptions({token:{type:"string",description:"Override authentication token"},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"}}).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:T("get","Get thread with messages",async(Z)=>{let{values:$,positionals:X}=A(Z,{token:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),Y=X[0];if(!Y){if($.json)return H("Thread ID is required. Usage: sazabi threads get <thread-id>");return _("Thread ID is required. Usage: sazabi threads get <thread-id>")}if(X.length>1){let Q=X.slice(1).join(", ");if($.json)return H(`Unexpected arguments: ${Q}`);return _(`Unexpected arguments: ${Q}`)}await T9(Y,{token:$.token,json:$.json,apiBaseUrl:$["api-base-url"]})}).withPositionalArgs("<thread-id>").withOptions({token:{type:"string",description:"Override authentication token"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi threads get <thread-id> # Get thread with messages","sazabi threads get <thread-id> --json # Output as JSON"]).build(),search:T("search","Search threads in current project",async(Z)=>{let{values:$,positionals:X}=A(Z,{token:{type:"string"},limit:{type:"string"},page:{type:"string"},status:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),Y=X.join(" ");if(!Y){if($.json)return H("Search query is required. Usage: sazabi threads search <query>");return _("Search query is required. Usage: sazabi threads search <query>")}let Q={token:$.token,json:$.json,apiBaseUrl:$["api-base-url"]};if($.limit)Q.limit=b($.limit,1,100,"Limit",$.json);if($.page)Q.page=b($.page,1,Number.MAX_SAFE_INTEGER,"Page",$.json);if($.status)Q.status=H1($.status,["regular","archived"],"Status",$.json);await E9(Y,Q)}).withPositionalArgs("<query>").withOptions({token:{type:"string",description:"Override authentication token"},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"}}).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 C9=[q9,A9,P9,j9,N9,O9];var M1=new Map,R9=(Z)=>{M1.set(Z.name,Z)},x9=(Z)=>{return M1.get(Z)},d1=()=>{return Array.from(M1.values())},y9=(Z)=>{return M1.has(Z)};var A1=(Z,$=!1)=>{let X=Object.entries(Z);if(X.length===0&&!$)return"";let Y=$?[["help",{type:"boolean",short:"h",description:"Show help for this command"}],...X]:X,Q=Math.max(...Y.map(([B,V])=>{return`${V.short?`-${V.short}, `:""}--${B}`.length})),G=Y.map(([B,V])=>{let q=`${V.short?`-${V.short}, `:""}--${B}`,K=V.description.includes("(required)"),D=V.required&&!K?" (required)":"";return` ${q.padEnd(Q)} ${V.description}${D}`});return`
|
|
5
5
|
|
|
6
|
-
${
|
|
6
|
+
${y("OPTIONS")}
|
|
7
7
|
${G.join(`
|
|
8
|
-
`)}`},
|
|
8
|
+
`)}`},w9=(Z)=>{if(Z.length===0)return"";let $=Z.map((Q)=>{let G=Q.indexOf("#");if(G===-1)return{command:Q,comment:null};return{command:Q.substring(0,G).trimEnd(),comment:Q.substring(G).trim()}}),X=Math.max(...$.map((Q)=>Q.command.length)),Y=$.map(({command:Q,comment:G})=>{if(!G)return` ${Q}`;let B=" ".repeat(X-Q.length+2);return` ${Q}${B}${G}`});return`
|
|
9
9
|
|
|
10
|
-
${
|
|
11
|
-
${
|
|
12
|
-
`)}`},
|
|
13
|
-
${
|
|
14
|
-
`;if(
|
|
15
|
-
${
|
|
16
|
-
${
|
|
17
|
-
`,
|
|
18
|
-
${
|
|
10
|
+
${y("EXAMPLES")}
|
|
11
|
+
${Y.join(`
|
|
12
|
+
`)}`},S9=(Z,$)=>{let X=$.positionalArgs?` ${$.positionalArgs}`:"",Y=`sazabi ${Z} ${$.name}${X}`,Q=`
|
|
13
|
+
${y(`sazabi ${Z} ${$.name}`)} - ${$.description}
|
|
14
|
+
`;if(Q+=`
|
|
15
|
+
${y("USAGE")}
|
|
16
|
+
${Y}`,$.options)Q+=A1($.options,!0);else Q+=A1({},!0);if($.examples)Q+=w9($.examples);return Q+=`
|
|
17
|
+
`,Q},p1=(Z)=>{let $=`
|
|
18
|
+
${y(`sazabi ${Z.name}`)} - ${Z.description}
|
|
19
19
|
`;if($+=`
|
|
20
|
-
${
|
|
21
|
-
sazabi ${Z.name} <subcommand> [options]`;else if(Z.subcommands&&Z.handler){let
|
|
22
|
-
sazabi ${Z.name}${
|
|
23
|
-
sazabi ${Z.name} <subcommand> [options]`}else{let
|
|
24
|
-
sazabi ${Z.name}${
|
|
20
|
+
${y("USAGE")}`,Z.subcommands&&!Z.handler)$+=`
|
|
21
|
+
sazabi ${Z.name} <subcommand> [options]`;else if(Z.subcommands&&Z.handler){let X=Z.positionalArgs?` ${Z.positionalArgs}`:"";$+=`
|
|
22
|
+
sazabi ${Z.name}${X}`,$+=`
|
|
23
|
+
sazabi ${Z.name} <subcommand> [options]`}else{let X=Z.positionalArgs?` ${Z.positionalArgs}`:"";$+=`
|
|
24
|
+
sazabi ${Z.name}${X}`}if(Z.subcommands){let X=Object.entries(Z.subcommands);if(X.length>0){$+=`
|
|
25
25
|
|
|
26
|
-
${
|
|
27
|
-
${
|
|
28
|
-
`,$},
|
|
29
|
-
${
|
|
26
|
+
${y("SUBCOMMANDS")}`;for(let[Y,Q]of X)$+=`
|
|
27
|
+
${Y.padEnd(12)} ${Q.description}`}}if(Z.options)$+=A1(Z.options,!0);else $+=A1({},!0);if(Z.examples)$+=w9(Z.examples);return $+=`
|
|
28
|
+
`,$},l1=(Z)=>{let $=`
|
|
29
|
+
${y("Sazabi CLI")} - Command-line interface for the Sazabi public API
|
|
30
30
|
`;$+=`
|
|
31
|
-
${
|
|
31
|
+
${y("USAGE")}`,$+=`
|
|
32
32
|
sazabi <command> [subcommand] [options]`,$+=`
|
|
33
33
|
|
|
34
|
-
${
|
|
35
|
-
${
|
|
36
|
-
${
|
|
34
|
+
${y("COMMANDS")}`;for(let X of Z)if($+=`
|
|
35
|
+
${X.name.padEnd(11)} ${X.description}`,X.subcommands)for(let[Y,Q]of Object.entries(X.subcommands))$+=`
|
|
36
|
+
${Y.padEnd(9)} ${Q.description}`;return $+=`
|
|
37
37
|
|
|
38
|
-
${
|
|
38
|
+
${y("OPTIONS")}`,$+=`
|
|
39
39
|
-h, --help Show help for a command`,$+=`
|
|
40
40
|
-v, --version Show version number`,$+=`
|
|
41
41
|
--json Output errors as JSON`,$+=`
|
|
42
42
|
|
|
43
|
-
${
|
|
43
|
+
${y("EXAMPLES")}`,$+=`
|
|
44
44
|
sazabi auth login sazabi_secret_xxx # Authenticate with secret key`,$+=`
|
|
45
45
|
sazabi messages send "Hello" # Start a new thread`,$+=`
|
|
46
46
|
sazabi messages send "Hi" -t <id> # Send a message to a thread`,$+=`
|
|
47
47
|
sazabi logs tail --severities ERROR,WARN # Tail logs filtered by severity`,$+=`
|
|
48
48
|
sazabi threads list # List all threads
|
|
49
|
-
`,$};import*as
|
|
49
|
+
`,$};import*as T1 from"node:fs";import*as z1 from"node:path";import{fileURLToPath as I3}from"node:url";var I9=()=>{try{let Z=z1.dirname(I3(import.meta.url));for(let $=0;$<5;$++){let X=z1.join(Z,"package.json");if(T1.existsSync(X)){let Y=T1.readFileSync(X,"utf-8");return JSON.parse(Y).version??"0.0.0"}Z=z1.dirname(Z)}return"0.0.0"}catch{return"0.0.0"}};var b3=I9();for(let Z of C9)R9(Z);var f3=async()=>{let Z=process.argv.slice(2),$=Z[0]==="--json",X=$?Z.slice(1):Z,Y=$||X.includes("--json");if(X.includes("--version")||X.includes("-v")){console.log(`sazabi ${b3}`);return}if(X.length===0){console.log(l1(d1()));return}if(X[0]?.startsWith("--")||X[0]==="-h"){if(X[0]==="--help"||X[0]==="-h"){console.log(l1(d1()));return}}let Q=X[0];if(Q&&!y9(Q)){let K=Q.startsWith("-")?`Unknown option: ${Q}. Run 'sazabi -h' for usage.`:`Unknown command: ${Q}. Run 'sazabi -h' for usage.`;if(Y)H(K);throw _(K),Error("Unreachable")}if(!Q)throw Error("Unexpected: commandName is undefined");let G=x9(Q);if(!G)throw _(`Unknown command: ${Q}. Run 'sazabi -h' for usage.`),Error("Unreachable");let B=X[1]??"",V=X.slice(2);if(B==="--help"||B==="-h"){console.log(p1(G));return}if(!B&&G.subcommands&&!G.handler){console.log(p1(G));return}let J=G.subcommands?.[B];if(!J){if(G.handler){let q=B?[B,...V]:V;await G.handler(q)}else{let K=B.startsWith("-")?`Subcommand required. Run 'sazabi ${Q} -h' for usage.`:`Unknown subcommand: ${B}. Run 'sazabi ${Q} -h' for usage.`;if(Y)H(K);throw _(K),Error("Unreachable")}return}if(V.includes("--help")||V.includes("-h")){console.log(S9(Q,J));return}await J.handler(V)};f3().catch((Z)=>{let $=process.argv.includes("--json"),X=`Unexpected error: ${String(Z)}`;if($)H(X);_(X)});
|