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